You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
98 lines
2.9 KiB
98 lines
2.9 KiB
#!/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()
|