diff options
Diffstat (limited to 'python/servo/bootstrap_commands.py')
-rw-r--r-- | python/servo/bootstrap_commands.py | 222 |
1 files changed, 23 insertions, 199 deletions
diff --git a/python/servo/bootstrap_commands.py b/python/servo/bootstrap_commands.py index ba583735011..ccc971e5b57 100644 --- a/python/servo/bootstrap_commands.py +++ b/python/servo/bootstrap_commands.py @@ -14,7 +14,6 @@ import json import os import os.path as path import re -import shutil import subprocess import sys import urllib2 @@ -27,9 +26,8 @@ from mach.decorators import ( ) import servo.bootstrap as bootstrap -from servo.command_base import CommandBase, BIN_SUFFIX, cd -from servo.util import delete, download_bytes, download_file, extract, host_triple -from servo.util import STATIC_RUST_LANG_ORG_DIST +from servo.command_base import CommandBase, cd, check_call +from servo.util import delete, download_bytes @CommandProvider @@ -39,6 +37,7 @@ class MachCommands(CommandBase): category='bootstrap') def env(self): env = self.build_env() + print("export RUSTFLAGS=%s" % env["RUSTFLAGS"]) print("export PATH=%s" % env["PATH"]) if sys.platform == "darwin": print("export DYLD_LIBRARY_PATH=%s" % env["DYLD_LIBRARY_PATH"]) @@ -54,161 +53,6 @@ class MachCommands(CommandBase): def bootstrap(self, force=False): return bootstrap.bootstrap(self.context, force=force) - @Command('bootstrap-rust', - description='Download the Rust compiler', - category='bootstrap') - @CommandArgument('--force', '-f', - action='store_true', - help='Force download even if a copy already exists') - @CommandArgument('--target', - action='append', - default=[], - help='Download rust stdlib for specified target') - @CommandArgument('--stable', - action='store_true', - help='Use stable rustc version') - def bootstrap_rustc(self, force=False, target=[], stable=False): - self.set_use_stable_rust(stable) - rust_dir = path.join(self.context.sharedir, "rust", self.rust_path()) - install_dir = path.join(self.context.sharedir, "rust", self.rust_install_dir()) - version = self.rust_stable_version() if stable else "nightly" - - nightly_dist = STATIC_RUST_LANG_ORG_DIST + "/" + self.rust_nightly_date() - - if not force and path.exists(path.join(rust_dir, "rustc", "bin", "rustc" + BIN_SUFFIX)): - print("Rust compiler already downloaded.", end=" ") - print("Use |bootstrap-rust --force| to download again.") - else: - if path.isdir(rust_dir): - shutil.rmtree(rust_dir) - os.makedirs(rust_dir) - - # The nightly Rust compiler is hosted on the nightly server under the date with a name - # rustc-nightly-HOST-TRIPLE.tar.gz, whereas the stable compiler is named - # rustc-VERSION-HOST-TRIPLE.tar.gz. We just need to pull down and extract it, - # giving a directory name that will be the same as the tarball name (rustc is - # in that directory). - if stable: - base_url = STATIC_RUST_LANG_ORG_DIST - else: - base_url = nightly_dist - - rustc_url = base_url + "/rustc-%s-%s.tar.gz" % (version, host_triple()) - tgz_file = rust_dir + '-rustc.tar.gz' - download_file("Rust compiler", rustc_url, tgz_file) - - print("Extracting Rust compiler...") - extract(tgz_file, install_dir) - print("Rust compiler ready.") - - # Each Rust stdlib has a name of the form `rust-std-nightly-TRIPLE.tar.gz` for the nightly - # releases, or rust-std-VERSION-TRIPLE.tar.gz for stable releases, with - # a directory of the name `rust-std-TRIPLE` inside and then a `lib` directory. - # This `lib` directory needs to be extracted and merged with the `rustc/lib` - # directory from the host compiler above. - lib_dir = path.join(install_dir, - "rustc-%s-%s" % (version, host_triple()), - "rustc", "lib", "rustlib") - - # ensure that the libs for the host's target is downloaded - host_target = host_triple() - if host_target not in target: - target.append(host_target) - - for target_triple in target: - target_lib_dir = path.join(lib_dir, target_triple) - if path.exists(target_lib_dir): - # No need to check for force. If --force the directory is already deleted - print("Rust lib for target {} already downloaded.".format(target_triple), end=" ") - print("Use |bootstrap-rust --force| to download again.") - continue - - tarball = "rust-std-%s-%s.tar.gz" % (version, target_triple) - tgz_file = path.join(install_dir, tarball) - if self.use_stable_rust(): - std_url = STATIC_RUST_LANG_ORG_DIST + "/" + tarball - else: - std_url = nightly_dist + "/" + tarball - - download_file("Host rust library for target %s" % target_triple, std_url, tgz_file) - print("Extracting Rust stdlib for target %s..." % target_triple) - extract(tgz_file, install_dir) - shutil.copytree(path.join(install_dir, - "rust-std-%s-%s" % (version, target_triple), - "rust-std-%s" % target_triple, - "lib", "rustlib", target_triple), - path.join(install_dir, - "rustc-%s-%s" % (version, host_triple()), - "rustc", - "lib", "rustlib", target_triple)) - shutil.rmtree(path.join(install_dir, "rust-std-%s-%s" % (version, target_triple))) - - print("Rust {} libs ready.".format(target_triple)) - - @Command('bootstrap-rust-docs', - description='Download the Rust documentation', - category='bootstrap') - @CommandArgument('--force', '-f', - action='store_true', - help='Force download even if docs already exist') - def bootstrap_rustc_docs(self, force=False): - self.ensure_bootstrapped() - rust_root = self.config["tools"]["rust-root"] - docs_dir = path.join(rust_root, "doc") - if not force and path.exists(docs_dir): - print("Rust docs already downloaded.", end=" ") - print("Use |bootstrap-rust-docs --force| to download again.") - return - - if path.isdir(docs_dir): - shutil.rmtree(docs_dir) - docs_name = self.rust_path().replace("rustc-", "rust-docs-") - docs_url = "%s/%s/rust-docs-nightly-%s.tar.gz" % ( - STATIC_RUST_LANG_ORG_DIST, self.rust_nightly_date(), host_triple() - ) - tgz_file = path.join(rust_root, 'doc.tar.gz') - - download_file("Rust docs", docs_url, tgz_file) - - print("Extracting Rust docs...") - temp_dir = path.join(rust_root, "temp_docs") - if path.isdir(temp_dir): - shutil.rmtree(temp_dir) - extract(tgz_file, temp_dir) - shutil.move(path.join(temp_dir, docs_name.split("/")[1], - "rust-docs", "share", "doc", "rust", "html"), - docs_dir) - shutil.rmtree(temp_dir) - print("Rust docs ready.") - - @Command('bootstrap-cargo', - description='Download the Cargo build tool', - category='bootstrap') - @CommandArgument('--force', '-f', - action='store_true', - help='Force download even if cargo already exists') - def bootstrap_cargo(self, force=False): - cargo_dir = path.join(self.context.sharedir, "cargo", self.rust_nightly_date()) - if not force and path.exists(path.join(cargo_dir, "cargo", "bin", "cargo" + BIN_SUFFIX)): - print("Cargo already downloaded.", end=" ") - print("Use |bootstrap-cargo --force| to download again.") - return - - if path.isdir(cargo_dir): - shutil.rmtree(cargo_dir) - os.makedirs(cargo_dir) - - tgz_file = "cargo-nightly-%s.tar.gz" % host_triple() - nightly_url = "%s/%s/%s" % (STATIC_RUST_LANG_ORG_DIST, self.rust_nightly_date(), tgz_file) - - download_file("Cargo nightly", nightly_url, tgz_file) - - print("Extracting Cargo nightly...") - nightly_dir = path.join(cargo_dir, - path.basename(tgz_file).replace(".tar.gz", "")) - extract(tgz_file, cargo_dir, movedir=nightly_dir) - print("Cargo ready.") - @Command('update-hsts-preload', description='Download the HSTS preload list', category='bootstrap') @@ -282,51 +126,31 @@ class MachCommands(CommandBase): default='1', help='Keep up to this many most recent nightlies') def clean_nightlies(self, force=False, keep=None): - rust_current_nightly = self.rust_nightly_date() - rust_current_stable = self.rust_stable_version() - print("Current Rust nightly version: {}".format(rust_current_nightly)) - print("Current Rust stable version: {}".format(rust_current_stable)) - to_keep = set() - if int(keep) == 1: - # Optimize keep=1 case to not invoke git - to_keep.add(rust_current_nightly) - to_keep.add(rust_current_stable) - else: - for version_file in ['rust-toolchain', 'rust-stable-version']: - cmd = subprocess.Popen( - ['git', 'log', '--oneline', '--no-color', '-n', keep, '--patch', version_file], - stdout=subprocess.PIPE, - universal_newlines=True - ) - stdout, _ = cmd.communicate() - for line in stdout.splitlines(): - if line.startswith(b"+") and not line.startswith(b"+++"): - line = line[len(b"+"):] - if line.startswith(b"nightly-"): - line = line[len(b"nightly-"):] - to_keep.add(line) + default_toolchain = self.default_toolchain() + geckolib_toolchain = self.geckolib_toolchain() + print("Current Rust version for Servo: {}".format(default_toolchain)) + print("Current Rust version for geckolib: {}".format(geckolib_toolchain)) + old_toolchains = [] + keep = int(keep) + for toolchain_file in ['rust-toolchain', 'geckolib-rust-toolchain']: + stdout = subprocess.check_output(['git', 'log', '--format=%H', toolchain_file]) + for i, commit_hash in enumerate(stdout.split(), 1): + if i > keep: + toolchain = subprocess.check_output( + ['git', 'show', '%s:%s' % (commit_hash, toolchain_file)]) + old_toolchains.append(toolchain.strip()) removing_anything = False - for tool in ["rust", "cargo"]: - base = path.join(self.context.sharedir, tool) - if not path.isdir(base): - continue - for name in os.listdir(base): - full_path = path.join(base, name) - if name.startswith("rust-"): - name = name[len("rust-"):] - if name.endswith("-alt"): - name = name[:-len("-alt")] - if name not in to_keep: + stdout = subprocess.check_output(['rustup', 'toolchain', 'list']) + for toolchain_with_host in stdout.split(): + for old in old_toolchains: + if toolchain_with_host.startswith(old): removing_anything = True if force: - print("Removing {}".format(full_path)) - try: - delete(full_path) - except OSError as e: - print("Removal failed with error {}".format(e)) + print("Removing {}".format(toolchain_with_host)) + check_call(["rustup", "uninstall", toolchain_with_host]) else: - print("Would remove {}".format(full_path)) + print("Would remove {}".format(toolchain_with_host)) if not removing_anything: print("Nothing to remove.") elif not force: |