diff options
author | Martin Robinson <mrobinson@igalia.com> | 2023-08-01 16:44:57 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-08-01 14:44:57 +0000 |
commit | fef332f38552ae8af83cf69993dd6aabdebffd6a (patch) | |
tree | 577bca564e78c7b8a2e02e7e9b3431518533edae /python | |
parent | 4061d13ba6d06f775e1a4a0fe50662ea3b16d2fa (diff) | |
download | servo-fef332f38552ae8af83cf69993dd6aabdebffd6a.tar.gz servo-fef332f38552ae8af83cf69993dd6aabdebffd6a.zip |
Make rustup a requirement and switch to `rust-toolchain.toml` (#30056)
This change makes rustup a requirement for building Servo with `./mach`
and switches to the newer `rust-toolchain.toml` format. The goal here is
to make mach builds more similar to non-mach builds.
- The new format allows listing the required components, removing some of
the complexity from our mach scripts.
- This means we must raise the required version of rustup to 1.23. The
current version is 1.26.
- We no longer wrap every call to cargo and rustc in "rustup run" calls
as both cargo and rustc will take care of installing and using all
necessary components specified in `rust-toolchain.toml` when run
inside the project directory.
Diffstat (limited to 'python')
-rw-r--r-- | python/servo/bootstrap_commands.py | 17 | ||||
-rw-r--r-- | python/servo/command_base.py | 62 | ||||
-rw-r--r-- | python/servo/devenv_commands.py | 22 | ||||
-rw-r--r-- | python/servo/post_build_commands.py | 6 | ||||
-rw-r--r-- | python/servo/testing_commands.py | 14 |
5 files changed, 40 insertions, 81 deletions
diff --git a/python/servo/bootstrap_commands.py b/python/servo/bootstrap_commands.py index f8e64754b23..b5b833d1e2d 100644 --- a/python/servo/bootstrap_commands.py +++ b/python/servo/bootstrap_commands.py @@ -21,6 +21,8 @@ import sys import traceback import urllib +import toml + from mach.decorators import ( CommandArgument, CommandProvider, @@ -283,15 +285,16 @@ class MachCommands(CommandBase): default='1', help='Keep up to this many most recent nightlies') def clean_nightlies(self, force=False, keep=None): - print("Current Rust version for Servo: {}".format(self.rust_toolchain())) + print(f"Current Rust version for Servo: {self.rust_toolchain()}") old_toolchains = [] keep = int(keep) - stdout = subprocess.check_output(['git', 'log', '--format=%H', 'rust-toolchain']) + stdout = subprocess.check_output(['git', 'log', '--format=%H', 'rust-toolchain.toml']) for i, commit_hash in enumerate(stdout.split(), 1): if i > keep: - toolchain = subprocess.check_output( - ['git', 'show', '%s:rust-toolchain' % commit_hash]) - old_toolchains.append(toolchain.strip()) + toolchain_config_text = subprocess.check_output( + ['git', 'show', f'{commit_hash}:rust-toolchain.toml']) + toolchain = toml.loads(toolchain_config_text)['toolchain']['channel'] + old_toolchains.append(toolchain) removing_anything = False stdout = subprocess.check_output(['rustup', 'toolchain', 'list']) @@ -300,10 +303,10 @@ class MachCommands(CommandBase): if toolchain_with_host.startswith(old): removing_anything = True if force: - print("Removing {}".format(toolchain_with_host)) + print(f"Removing {toolchain_with_host}") check_call(["rustup", "uninstall", toolchain_with_host]) else: - print("Would remove {}".format(toolchain_with_host)) + print(f"Would remove {toolchain_with_host}") if not removing_anything: print("Nothing to remove.") elif not force: diff --git a/python/servo/command_base.py b/python/servo/command_base.py index 63911e01c4a..ce8c1ddb237 100644 --- a/python/servo/command_base.py +++ b/python/servo/command_base.py @@ -244,7 +244,6 @@ class CommandBase(object): context.sharedir = self.config["tools"]["cache-dir"] - self.config["tools"].setdefault("use-rustup", True) self.config["tools"].setdefault("rustc-with-gold", get_env_bool("SERVO_RUSTC_WITH_GOLD", True)) self.config.setdefault("build", {}) @@ -272,24 +271,13 @@ class CommandBase(object): _rust_toolchain = None def rust_toolchain(self): - if self._rust_toolchain is None: - filename = path.join(self.context.topdir, "rust-toolchain") - with open(filename) as f: - self._rust_toolchain = f.read().strip() - - if platform.system() == "Windows": - self._rust_toolchain += "-x86_64-pc-windows-msvc" + if self._rust_toolchain: + return self._rust_toolchain + toolchain_file = path.join(self.context.topdir, "rust-toolchain.toml") + self._rust_toolchain = toml.load(toolchain_file)['toolchain']['channel'] return self._rust_toolchain - def call_rustup_run(self, args, **kwargs): - if self.config["tools"]["use-rustup"]: - assert self.context.bootstrapped - args = ["rustup" + BIN_SUFFIX, "run", "--install", self.rust_toolchain()] + args - else: - args[0] += BIN_SUFFIX - return call(args, **kwargs) - def get_top_dir(self): return self.context.topdir @@ -933,7 +921,7 @@ class CommandBase(object): if with_debug_assertions or self.config["build"]["debug-assertions"]: env['RUSTFLAGS'] = env.get('RUSTFLAGS', "") + " -C debug_assertions" - return self.call_rustup_run(["cargo", command] + args + cargo_args, env=env, verbose=verbose) + return call(["cargo", command] + args + cargo_args, env=env, verbose=verbose) def android_support_dir(self): return path.join(self.context.topdir, "support", "android") @@ -986,43 +974,19 @@ class CommandBase(object): return True return False - def ensure_bootstrapped(self, rustup_components=None): + def ensure_bootstrapped(self): if self.context.bootstrapped: return servo.platform.get().passive_bootstrap() - if self.config["tools"]["use-rustup"]: - self.ensure_rustup_version() - toolchain = self.rust_toolchain() - - status = subprocess.call( - ["rustup", "run", toolchain, "rustc", "--version"], - stdout=open(os.devnull, "wb"), - stderr=subprocess.STDOUT, + needs_toolchain_install = self.cross_compile_target \ + and self.cross_compile_target not in check_output( + ["rustup", "target", "list", "--installed"], cwd=self.context.topdir ) - if status: - check_call(["rustup", "toolchain", "install", "--profile", "minimal", toolchain]) - - installed = check_output( - ["rustup", "component", "list", "--installed", "--toolchain", toolchain] - ) - required_components = { - # For components/script_plugins, https://github.com/rust-lang/rust/pull/67469 - "rustc-dev", - # https://github.com/rust-lang/rust/issues/72594#issuecomment-633779564 - "llvm-tools-preview", - } - for component in set(rustup_components or []) | required_components: - if component.encode("utf-8") not in installed: - check_call(["rustup", "component", "add", "--toolchain", toolchain, component]) - - needs_toolchain_install = self.cross_compile_target \ - and self.cross_compile_target.encode("utf-8") not in check_output( - ["rustup", "target", "list", "--installed", "--toolchain", toolchain] - ) - if needs_toolchain_install: - check_call(["rustup", "target", "add", "--toolchain", toolchain, self.cross_compile_target]) + if needs_toolchain_install: + check_call(["rustup", "target", "add", self.cross_compile_target], + cwd=self.context.topdir) self.context.bootstrapped = True @@ -1042,7 +1006,7 @@ class CommandBase(object): sys.exit(1) raise version = tuple(map(int, re.match(br"rustup (\d+)\.(\d+)\.(\d+)", version_line).groups())) - version_needed = (1, 21, 0) + version_needed = (1, 23, 0) if version < version_needed: print("rustup is at version %s.%s.%s, Servo requires %s.%s.%s or more recent." % (version + version_needed)) print("Try running 'rustup self update'.") diff --git a/python/servo/devenv_commands.py b/python/servo/devenv_commands.py index b09086a8ed4..9e7527d6fd8 100644 --- a/python/servo/devenv_commands.py +++ b/python/servo/devenv_commands.py @@ -97,7 +97,7 @@ class MachCommands(CommandBase): self.ensure_bootstrapped() with cd(self.context.topdir): - self.call_rustup_run(["cargo", "update"] + params, env=self.build_env()) + call(["cargo", "update"] + params, env=self.build_env()) @Command('rustc', description='Run the Rust compiler', @@ -110,7 +110,7 @@ class MachCommands(CommandBase): params = [] self.ensure_bootstrapped() - return self.call_rustup_run(["rustc"] + params, env=self.build_env()) + return call(["rustc"] + params, env=self.build_env()) @Command('cargo-fix', description='Run "cargo fix"', @@ -173,10 +173,16 @@ class MachCommands(CommandBase): def rustup(self): nightly_date = urllib.request.urlopen( "https://static.rust-lang.org/dist/channel-rust-nightly-date.txt").read() - toolchain = b"nightly-" + nightly_date - filename = path.join(self.context.topdir, "rust-toolchain") - with open(filename, "wb") as f: - f.write(toolchain + b"\n") + new_toolchain = f"nightly-{nightly_date.decode('utf-8')}" + old_toolchain = self.rust_toolchain() + + filename = path.join(self.context.topdir, "rust-toolchain.toml") + with open(filename, "r", encoding="utf-8") as file: + contents = file.read() + contents = contents.replace(old_toolchain, new_toolchain) + with open(filename, "w", encoding="utf-8") as file: + file.write(contents) + self.ensure_bootstrapped() @Command('fetch', @@ -184,9 +190,7 @@ class MachCommands(CommandBase): category='devenv') def fetch(self): self.ensure_bootstrapped() - - with cd(self.context.topdir): - return self.call_rustup_run(["cargo", "fetch"], env=self.build_env()) + return call(["cargo", "fetch"], env=self.build_env()) @Command('ndk-stack', description='Invoke the ndk-stack tool with the expected symbol paths', diff --git a/python/servo/post_build_commands.py b/python/servo/post_build_commands.py index a5d76134c4f..a9944775dda 100644 --- a/python/servo/post_build_commands.py +++ b/python/servo/post_build_commands.py @@ -244,10 +244,8 @@ class PostBuildCommands(CommandBase): help="Command-line arguments to be passed through to cargo doc") @CommandBase.build_like_command_arguments def doc(self, params: List[str], **kwargs): - self.ensure_bootstrapped(rustup_components=["rust-docs"]) - rustc_path = check_output( - ["rustup" + BIN_SUFFIX, "which", "--toolchain", self.rust_toolchain(), "rustc"] - ).decode('utf-8') + self.ensure_bootstrapped() + rustc_path = check_output(["rustup" + BIN_SUFFIX, "which", "rustc"], cwd=self.context.topdir) assert path.basename(path.dirname(rustc_path)) == "bin" toolchain_path = path.dirname(path.dirname(rustc_path)) rust_docs = path.join(toolchain_path, "share", "doc", "rust", "html") diff --git a/python/servo/testing_commands.py b/python/servo/testing_commands.py index 799e5ff6ac5..549b5aed842 100644 --- a/python/servo/testing_commands.py +++ b/python/servo/testing_commands.py @@ -263,14 +263,6 @@ class MachCommands(CommandBase): "tests/wpt/mozilla/.") return 0 - def install_rustfmt(self): - self.ensure_bootstrapped() - with open(os.devnull, "w") as devnull: - if self.call_rustup_run(["cargo", "fmt", "--version", "-q"], - stderr=devnull) != 0: - # Rustfmt is not installed. Install: - self.call_rustup_run(["rustup", "component", "add", "rustfmt-preview"]) - @Command('test-tidy', description='Run the source code tidiness check', category='testing') @@ -289,8 +281,7 @@ class MachCommands(CommandBase): else: manifest_dirty = wpt.manifestupdate.update(check_clean=True) tidy_failed = tidy.scan(not all_files, not no_progress, stylo=stylo, no_wpt=no_wpt) - self.install_rustfmt() - rustfmt_failed = self.call_rustup_run(["cargo", "fmt", "--", "--check"]) + rustfmt_failed = call(["cargo", "fmt", "--", "--check"]) if rustfmt_failed: print("Run `./mach fmt` to fix the formatting") @@ -404,8 +395,7 @@ class MachCommands(CommandBase): description='Format the Rust and CPP source files with rustfmt', category='testing') def format_code(self): - self.install_rustfmt() - return self.call_rustup_run(["cargo", "fmt"]) + return call(["cargo", "fmt"]) @Command('update-wpt', description='Update the web platform tests', |