| #!/usr/bin/env python3 |
| |
| import subprocess |
| from os.path import abspath |
| import hashlib |
| import urllib3 |
| import tarfile |
| |
| def rustc_url(version): |
| return f"https://static.rust-lang.org/dist/rustc-{version}-src.tar.gz" |
| |
| version_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"] |
| |
| bootstrap_version = "1.20.0" |
| bootstrap_path = abspath("mrustc-bootstrap/mrustc/mrustc-rustc-rustc/rustc-1.20.0-src/") |
| clang_prebuilt_path = abspath("mrustc-bootstrap/clang-prebuilt/clang-r353983c/bin") |
| cc = clang_prebuilt_path + "/clang" |
| cxx = clang_prebuilt_path + "/clang++" |
| ar = clang_prebuilt_path + "/llvm-ar" |
| |
| class RustBuild(object): |
| def __init__(self, version, path, stage0): |
| self.version = version |
| self.stage0 = stage0 |
| self.path = path |
| self.built = False |
| |
| def configure(self): |
| minor = self.version.split('.')[1] |
| remap = "" |
| if int(minor) > 30: |
| remap = "[rust]\nremap-debuginfo = true" |
| config_toml = f"""\ |
| [build] |
| cargo = "{self.stage0.cargo()}" |
| rustc = "{self.stage0.rustc()}" |
| full-bootstrap = true |
| vendor = true |
| extended = true |
| docs = false |
| {remap} |
| [target.x86_64-unknown-linux-gnu] |
| cc = "{cc}" |
| cxx = "{cxx}" |
| """ |
| with open(self.path + "/config.toml", "w+") as f: |
| f.write(config_toml) |
| |
| def build(self): |
| self.configure() |
| subprocess.run(["./x.py", "--stage", "3", "build"], check=True, cwd=self.path) |
| self.built = True |
| |
| def rustc(self): |
| if not self.built: |
| self.build() |
| return self.path + "/build/x86_64-unknown-linux-gnu/stage3/bin/rustc" |
| |
| def cargo(self): |
| if not self.built: |
| self.build() |
| return self.path + "/build/x86_64-unknown-linux-gnu/stage3-tools/x86_64-unknown-linux-gnu/release/cargo" |
| |
| |
| class RustPrebuilt(RustBuild): |
| def __init__(self, version, path): |
| super().__init__(version, path, None) |
| self.built = True |
| def build(self): pass |
| |
| |
| def fetch_rustc(): |
| http = urllib3.PoolManager() |
| for version in version_sequence: |
| rust_src_resp = http.request("GET", rustc_url(version), preload_content=False) |
| rust_src_tar_path = f"rustc-{version}-src.tar.gz" |
| hasher = hashlib.sha256() |
| with open(rust_src_tar_path, "wb+") as tar_file: |
| for chunk in rust_src_resp.stream(): |
| hasher.update(chunk) |
| tar_file.write(chunk) |
| rust_src_resp.release_conn() |
| print(f"rustc-{version}-src.tar.gz {hasher.hexdigest()}") |
| tarfile.open(rust_src_tar_path).extractall() |
| |
| |
| def main(): |
| fetch_rustc() |
| build = RustPrebuilt(bootstrap_version, bootstrap_path) |
| for version in version_sequence: |
| build = RustBuild(version, abspath(f"rustc-{version}-src"), build) |
| print(f"rustc: {build.rustc()}") |
| print(f"cargo: {build.rustc()}") |
| |
| |
| if __name__ == "__main__": |
| main() |