From dd95cb7106e60a79a994899aa4836d6dc8b5b9fa Mon Sep 17 00:00:00 2001 From: Alex Crichton Date: Wed, 6 Mar 2024 12:10:52 -0800 Subject: [PATCH 1/2] Add `target.*.runner` configuration for targets This commit adds a `runner` field configuration to `config.toml` for specifying a wrapper executable when executing binaries for a target. This is pulled out of #122036 where a WebAssembly runtime is used, for example, to execute tests for `wasm32-wasip1`. The name "runner" here is chosen to match Cargo's `CARGO_*_RUNNER` configuration, and to make things a bit more consistent this additionally renames compiletest's `--runtool` argument to `--runner`. --- config.example.toml | 11 +++++++++++ src/bootstrap/src/core/build_steps/test.rs | 4 ++++ src/bootstrap/src/core/config/config.rs | 3 +++ src/bootstrap/src/lib.rs | 11 +++++++++++ src/tools/compiletest/src/common.rs | 6 ++++-- src/tools/compiletest/src/lib.rs | 6 +++--- src/tools/compiletest/src/runtest.rs | 4 ++-- 7 files changed, 38 insertions(+), 7 deletions(-) diff --git a/config.example.toml b/config.example.toml index c1939933850..4fbdccba911 100644 --- a/config.example.toml +++ b/config.example.toml @@ -842,6 +842,17 @@ # See that option for more info. #codegen-backends = rust.codegen-backends (array) +# This is a "runner" to pass to `compiletest` when executing tests. Tests will +# execute this tool where the binary-to-test is passed as an argument. Can +# be useful for situations such as when WebAssembly is being tested and a +# runtime needs to be configured. This value is similar to +# Cargo's `CARGO_$target_RUNNER` configuration. +# +# This configuration is a space-separated list of arguments so `foo bar` would +# execute the program `foo` with the first argument as `bar` and the second +# argument as the test binary. +#runner = (string) + # ============================================================================= # Distribution options # diff --git a/src/bootstrap/src/core/build_steps/test.rs b/src/bootstrap/src/core/build_steps/test.rs index 4a4497e57db..ed9f8db3804 100644 --- a/src/bootstrap/src/core/build_steps/test.rs +++ b/src/bootstrap/src/core/build_steps/test.rs @@ -1970,6 +1970,8 @@ fn run(self, builder: &Builder<'_>) { if builder.remote_tested(target) { cmd.arg("--remote-test-client").arg(builder.tool_exe(Tool::RemoteTestClient)); + } else if let Some(tool) = builder.runner(target) { + cmd.arg("--runner").arg(tool); } if suite != "mir-opt" { @@ -2519,6 +2521,8 @@ fn prepare_cargo_test( format!("CARGO_TARGET_{}_RUNNER", envify(&target.triple)), format!("{} run 0", builder.tool_exe(Tool::RemoteTestClient).display()), ); + } else if let Some(tool) = builder.runner(target) { + cargo.env(format!("CARGO_TARGET_{}_RUNNER", envify(&target.triple)), tool); } cargo diff --git a/src/bootstrap/src/core/config/config.rs b/src/bootstrap/src/core/config/config.rs index 326f8f57173..c1988851738 100644 --- a/src/bootstrap/src/core/config/config.rs +++ b/src/bootstrap/src/core/config/config.rs @@ -579,6 +579,7 @@ pub struct Target { pub musl_libdir: Option, pub wasi_root: Option, pub qemu_rootfs: Option, + pub runner: Option, pub no_std: bool, pub codegen_backends: Option>>, } @@ -1142,6 +1143,7 @@ struct TomlTarget { qemu_rootfs: Option = "qemu-rootfs", no_std: Option = "no-std", codegen_backends: Option> = "codegen-backends", + runner: Option = "runner", } } @@ -1862,6 +1864,7 @@ fn get_table(option: &str) -> Result { target.musl_libdir = cfg.musl_libdir.map(PathBuf::from); target.wasi_root = cfg.wasi_root.map(PathBuf::from); target.qemu_rootfs = cfg.qemu_rootfs.map(PathBuf::from); + target.runner = cfg.runner; target.sanitizers = cfg.sanitizers; target.profiler = cfg.profiler; target.rpath = cfg.rpath; diff --git a/src/bootstrap/src/lib.rs b/src/bootstrap/src/lib.rs index ab8f3c0d9e4..181df93b695 100644 --- a/src/bootstrap/src/lib.rs +++ b/src/bootstrap/src/lib.rs @@ -1353,6 +1353,17 @@ fn remote_tested(&self, target: TargetSelection) -> bool { || env::var_os("TEST_DEVICE_ADDR").is_some() } + /// Returns an optional "runner" to pass to `compiletest` when executing + /// test binaries. + /// + /// An example of this would be a WebAssembly runtime when testing the wasm + /// targets. + fn runner(&self, target: TargetSelection) -> Option { + let target = self.config.target_config.get(&target)?; + let runner = target.runner.as_ref()?; + Some(runner.to_owned()) + } + /// Returns the root of the "rootfs" image that this target will be using, /// if one was configured. /// diff --git a/src/tools/compiletest/src/common.rs b/src/tools/compiletest/src/common.rs index 06d8f099c33..78246136f2a 100644 --- a/src/tools/compiletest/src/common.rs +++ b/src/tools/compiletest/src/common.rs @@ -266,8 +266,10 @@ pub struct Config { pub logfile: Option, /// A command line to prefix program execution with, - /// for running under valgrind - pub runtool: Option, + /// for running under valgrind for example. + /// + /// Similar to `CARGO_*_RUNNER` configuration. + pub runner: Option, /// Flags to pass to the compiler when building for the host pub host_rustcflags: Vec, diff --git a/src/tools/compiletest/src/lib.rs b/src/tools/compiletest/src/lib.rs index b32a5a4bf1a..ef02e7fcb4a 100644 --- a/src/tools/compiletest/src/lib.rs +++ b/src/tools/compiletest/src/lib.rs @@ -86,7 +86,7 @@ pub fn parse_config(args: Vec) -> Config { .optflag("", "exact", "filters match exactly") .optopt( "", - "runtool", + "runner", "supervisor program to run tests under \ (eg. emulator, valgrind)", "PROGRAM", @@ -256,7 +256,7 @@ fn make_absolute(path: PathBuf) -> PathBuf { _ => panic!("unknown `--run` option `{}` given", mode), }), logfile: matches.opt_str("logfile").map(|s| PathBuf::from(&s)), - runtool: matches.opt_str("runtool"), + runner: matches.opt_str("runner"), host_rustcflags: matches.opt_strs("host-rustcflags"), target_rustcflags: matches.opt_strs("target-rustcflags"), optimize_tests: matches.opt_present("optimize-tests"), @@ -341,7 +341,7 @@ pub fn log_config(config: &Config) { c, format!("force_pass_mode: {}", opt_str(&config.force_pass_mode.map(|m| format!("{}", m))),), ); - logv(c, format!("runtool: {}", opt_str(&config.runtool))); + logv(c, format!("runner: {}", opt_str(&config.runner))); logv(c, format!("host-rustcflags: {:?}", config.host_rustcflags)); logv(c, format!("target-rustcflags: {:?}", config.target_rustcflags)); logv(c, format!("target: {}", config.target)); diff --git a/src/tools/compiletest/src/runtest.rs b/src/tools/compiletest/src/runtest.rs index ae0db88d873..9fd83c507ed 100644 --- a/src/tools/compiletest/src/runtest.rs +++ b/src/tools/compiletest/src/runtest.rs @@ -461,7 +461,7 @@ fn run_valgrind_test(&self) { } let mut new_config = self.config.clone(); - new_config.runtool = new_config.valgrind_path.clone(); + new_config.runner = new_config.valgrind_path.clone(); let new_cx = TestCx { config: &new_config, ..*self }; proc_res = new_cx.exec_compiled_test(); @@ -2647,7 +2647,7 @@ fn make_exe_name(&self) -> PathBuf { fn make_run_args(&self) -> ProcArgs { // If we've got another tool to run under (valgrind), // then split apart its command - let mut args = self.split_maybe_args(&self.config.runtool); + let mut args = self.split_maybe_args(&self.config.runner); // If this is emscripten, then run tests under nodejs if self.config.target.contains("emscripten") { From 9bdb8a6888939c61c2907a5d37562833cf8d1ff3 Mon Sep 17 00:00:00 2001 From: Alex Crichton Date: Fri, 8 Mar 2024 07:43:35 -0800 Subject: [PATCH 2/2] Add a change entry --- src/bootstrap/src/utils/change_tracker.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/bootstrap/src/utils/change_tracker.rs b/src/bootstrap/src/utils/change_tracker.rs index d166b84e51f..a348fa35841 100644 --- a/src/bootstrap/src/utils/change_tracker.rs +++ b/src/bootstrap/src/utils/change_tracker.rs @@ -141,4 +141,9 @@ pub fn find_recent_config_change_ids(current_id: usize) -> Vec { severity: ChangeSeverity::Info, summary: "A new `boostrap-cache-path` option has been introduced which can be utilized to modify the cache path for bootstrap.", }, + ChangeInfo { + change_id: 122108, + severity: ChangeSeverity::Info, + summary: "a new `target.*.runner` option is available to specify a wrapper executable required to run tests for a target", + }, ];