xref: /aosp_15_r20/prebuilts/rust/bootstrap/chain.py (revision b40554a23088fb75aa6945dfe8e65169c8484da3)
1*b40554a2SAndroid Build Coastguard Worker#!/usr/bin/env python3
2*b40554a2SAndroid Build Coastguard Worker
3*b40554a2SAndroid Build Coastguard Workerimport subprocess
4*b40554a2SAndroid Build Coastguard Workerfrom os.path import abspath
5*b40554a2SAndroid Build Coastguard Workerimport hashlib
6*b40554a2SAndroid Build Coastguard Workerimport urllib3
7*b40554a2SAndroid Build Coastguard Workerimport tarfile
8*b40554a2SAndroid Build Coastguard Worker
9*b40554a2SAndroid Build Coastguard Workerdef rustc_url(version):
10*b40554a2SAndroid Build Coastguard Worker    return f"https://static.rust-lang.org/dist/rustc-{version}-src.tar.gz"
11*b40554a2SAndroid Build Coastguard Worker
12*b40554a2SAndroid Build Coastguard Workerversion_sequence = ["1.21.0", "1.22.1", "1.23.0", "1.24.1", "1.25.0", "1.26.2", "1.27.2", "1.28.0", "1.29.2", "1.30.1", "1.31.1", "1.32.0", "1.33.0", "1.34.2"]
13*b40554a2SAndroid Build Coastguard Worker
14*b40554a2SAndroid Build Coastguard Workerbootstrap_version = "1.20.0"
15*b40554a2SAndroid Build Coastguard Workerbootstrap_path = abspath("mrustc-bootstrap/mrustc/mrustc-rustc-rustc/rustc-1.20.0-src/")
16*b40554a2SAndroid Build Coastguard Workerclang_prebuilt_path = abspath("mrustc-bootstrap/clang-prebuilt/clang-r353983c/bin")
17*b40554a2SAndroid Build Coastguard Workercc = clang_prebuilt_path + "/clang"
18*b40554a2SAndroid Build Coastguard Workercxx = clang_prebuilt_path + "/clang++"
19*b40554a2SAndroid Build Coastguard Workerar = clang_prebuilt_path + "/llvm-ar"
20*b40554a2SAndroid Build Coastguard Worker
21*b40554a2SAndroid Build Coastguard Workerclass RustBuild(object):
22*b40554a2SAndroid Build Coastguard Worker    def __init__(self, version, path, stage0):
23*b40554a2SAndroid Build Coastguard Worker        self.version = version
24*b40554a2SAndroid Build Coastguard Worker        self.stage0 = stage0
25*b40554a2SAndroid Build Coastguard Worker        self.path = path
26*b40554a2SAndroid Build Coastguard Worker        self.built = False
27*b40554a2SAndroid Build Coastguard Worker
28*b40554a2SAndroid Build Coastguard Worker    def configure(self):
29*b40554a2SAndroid Build Coastguard Worker        minor = self.version.split('.')[1]
30*b40554a2SAndroid Build Coastguard Worker        remap = ""
31*b40554a2SAndroid Build Coastguard Worker        if int(minor) > 30:
32*b40554a2SAndroid Build Coastguard Worker            remap = "[rust]\nremap-debuginfo = true"
33*b40554a2SAndroid Build Coastguard Worker        config_toml = f"""\
34*b40554a2SAndroid Build Coastguard Worker[build]
35*b40554a2SAndroid Build Coastguard Workercargo = "{self.stage0.cargo()}"
36*b40554a2SAndroid Build Coastguard Workerrustc = "{self.stage0.rustc()}"
37*b40554a2SAndroid Build Coastguard Workerfull-bootstrap = true
38*b40554a2SAndroid Build Coastguard Workervendor = true
39*b40554a2SAndroid Build Coastguard Workerextended = true
40*b40554a2SAndroid Build Coastguard Workerdocs = false
41*b40554a2SAndroid Build Coastguard Worker{remap}
42*b40554a2SAndroid Build Coastguard Worker[target.x86_64-unknown-linux-gnu]
43*b40554a2SAndroid Build Coastguard Workercc = "{cc}"
44*b40554a2SAndroid Build Coastguard Workercxx = "{cxx}"
45*b40554a2SAndroid Build Coastguard Worker"""
46*b40554a2SAndroid Build Coastguard Worker        with open(self.path + "/config.toml", "w+") as f:
47*b40554a2SAndroid Build Coastguard Worker            f.write(config_toml)
48*b40554a2SAndroid Build Coastguard Worker
49*b40554a2SAndroid Build Coastguard Worker    def build(self):
50*b40554a2SAndroid Build Coastguard Worker        self.configure()
51*b40554a2SAndroid Build Coastguard Worker        subprocess.run(["./x.py", "--stage", "3", "build"], check=True, cwd=self.path)
52*b40554a2SAndroid Build Coastguard Worker        self.built = True
53*b40554a2SAndroid Build Coastguard Worker
54*b40554a2SAndroid Build Coastguard Worker    def rustc(self):
55*b40554a2SAndroid Build Coastguard Worker        if not self.built:
56*b40554a2SAndroid Build Coastguard Worker            self.build()
57*b40554a2SAndroid Build Coastguard Worker        return self.path + "/build/x86_64-unknown-linux-gnu/stage3/bin/rustc"
58*b40554a2SAndroid Build Coastguard Worker
59*b40554a2SAndroid Build Coastguard Worker    def cargo(self):
60*b40554a2SAndroid Build Coastguard Worker        if not self.built:
61*b40554a2SAndroid Build Coastguard Worker            self.build()
62*b40554a2SAndroid Build Coastguard Worker        return self.path + "/build/x86_64-unknown-linux-gnu/stage3-tools/x86_64-unknown-linux-gnu/release/cargo"
63*b40554a2SAndroid Build Coastguard Worker
64*b40554a2SAndroid Build Coastguard Worker
65*b40554a2SAndroid Build Coastguard Workerclass RustPrebuilt(RustBuild):
66*b40554a2SAndroid Build Coastguard Worker    def __init__(self, version, path):
67*b40554a2SAndroid Build Coastguard Worker        super().__init__(version, path, None)
68*b40554a2SAndroid Build Coastguard Worker        self.built = True
69*b40554a2SAndroid Build Coastguard Worker    def build(self): pass
70*b40554a2SAndroid Build Coastguard Worker
71*b40554a2SAndroid Build Coastguard Worker
72*b40554a2SAndroid Build Coastguard Workerdef fetch_rustc():
73*b40554a2SAndroid Build Coastguard Worker    http = urllib3.PoolManager()
74*b40554a2SAndroid Build Coastguard Worker    for version in version_sequence:
75*b40554a2SAndroid Build Coastguard Worker        rust_src_resp = http.request("GET", rustc_url(version), preload_content=False)
76*b40554a2SAndroid Build Coastguard Worker        rust_src_tar_path = f"rustc-{version}-src.tar.gz"
77*b40554a2SAndroid Build Coastguard Worker        hasher = hashlib.sha256()
78*b40554a2SAndroid Build Coastguard Worker        with open(rust_src_tar_path, "wb+") as tar_file:
79*b40554a2SAndroid Build Coastguard Worker            for chunk in rust_src_resp.stream():
80*b40554a2SAndroid Build Coastguard Worker                hasher.update(chunk)
81*b40554a2SAndroid Build Coastguard Worker                tar_file.write(chunk)
82*b40554a2SAndroid Build Coastguard Worker        rust_src_resp.release_conn()
83*b40554a2SAndroid Build Coastguard Worker        print(f"rustc-{version}-src.tar.gz {hasher.hexdigest()}")
84*b40554a2SAndroid Build Coastguard Worker        tarfile.open(rust_src_tar_path).extractall()
85*b40554a2SAndroid Build Coastguard Worker
86*b40554a2SAndroid Build Coastguard Worker
87*b40554a2SAndroid Build Coastguard Workerdef main():
88*b40554a2SAndroid Build Coastguard Worker    fetch_rustc()
89*b40554a2SAndroid Build Coastguard Worker    build = RustPrebuilt(bootstrap_version, bootstrap_path)
90*b40554a2SAndroid Build Coastguard Worker    for version in version_sequence:
91*b40554a2SAndroid Build Coastguard Worker        build = RustBuild(version, abspath(f"rustc-{version}-src"), build)
92*b40554a2SAndroid Build Coastguard Worker    print(f"rustc: {build.rustc()}")
93*b40554a2SAndroid Build Coastguard Worker    print(f"cargo: {build.rustc()}")
94*b40554a2SAndroid Build Coastguard Worker
95*b40554a2SAndroid Build Coastguard Worker
96*b40554a2SAndroid Build Coastguard Workerif __name__ == "__main__":
97*b40554a2SAndroid Build Coastguard Worker    main()
98