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