Skip to content

Commit

Permalink
Add target.*.runner configuration for targets
Browse files Browse the repository at this point in the history
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 rust-lang#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`.
  • Loading branch information
alexcrichton committed Mar 6, 2024
1 parent bfe762e commit 49e3d0a
Show file tree
Hide file tree
Showing 7 changed files with 39 additions and 8 deletions.
11 changes: 11 additions & 0 deletions config.example.toml
Original file line number Diff line number Diff line change
Expand Up @@ -838,6 +838,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 = <none> (string)

# =============================================================================
# Distribution options
#
Expand Down
4 changes: 4 additions & 0 deletions src/bootstrap/src/core/build_steps/test.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1970,6 +1970,8 @@ NOTE: if you're sure you want to do this, please open an issue as to why. In the

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" {
Expand Down Expand Up @@ -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
Expand Down
3 changes: 3 additions & 0 deletions src/bootstrap/src/core/config/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -578,6 +578,7 @@ pub struct Target {
pub musl_libdir: Option<PathBuf>,
pub wasi_root: Option<PathBuf>,
pub qemu_rootfs: Option<PathBuf>,
pub runner: Option<String>,
pub no_std: bool,
pub codegen_backends: Option<Vec<Interned<String>>>,
}
Expand Down Expand Up @@ -1140,6 +1141,7 @@ define_config! {
qemu_rootfs: Option<String> = "qemu-rootfs",
no_std: Option<bool> = "no-std",
codegen_backends: Option<Vec<String>> = "codegen-backends",
runner: Option<String> = "runner",
}
}

Expand Down Expand Up @@ -1858,6 +1860,7 @@ impl Config {
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;
Expand Down
11 changes: 11 additions & 0 deletions src/bootstrap/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1353,6 +1353,17 @@ impl Build {
|| 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<String> {
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.
///
Expand Down
8 changes: 5 additions & 3 deletions src/tools/compiletest/src/common.rs
Original file line number Diff line number Diff line change
Expand Up @@ -266,8 +266,10 @@ pub struct Config {
pub logfile: Option<PathBuf>,

/// A command line to prefix program execution with,
/// for running under valgrind
pub runtool: Option<String>,
/// for running under valgrind for example.
///
/// Similar to `CARGO_*_RUNNER` configuration.
pub runner: Option<String>,

/// Flags to pass to the compiler when building for the host
pub host_rustcflags: Vec<String>,
Expand Down Expand Up @@ -453,7 +455,7 @@ impl Config {

pub fn has_asm_support(&self) -> bool {
static ASM_SUPPORTED_ARCHS: &[&str] = &[
"x86", "x86_64", "arm", "aarch64", "riscv32",
"x86", "x86_64", "arm", "aarch64", "uiscv32",
"riscv64",
// These targets require an additional asm_experimental_arch feature.
// "nvptx64", "hexagon", "mips", "mips64", "spirv", "wasm32",
Expand Down
6 changes: 3 additions & 3 deletions src/tools/compiletest/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ pub fn parse_config(args: Vec<String>) -> Config {
.optflag("", "exact", "filters match exactly")
.optopt(
"",
"runtool",
"runner",
"supervisor program to run tests under \
(eg. emulator, valgrind)",
"PROGRAM",
Expand Down Expand Up @@ -256,7 +256,7 @@ pub fn parse_config(args: Vec<String>) -> Config {
_ => 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"),
Expand Down Expand Up @@ -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));
Expand Down
4 changes: 2 additions & 2 deletions src/tools/compiletest/src/runtest.rs
Original file line number Diff line number Diff line change
Expand Up @@ -461,7 +461,7 @@ impl<'test> TestCx<'test> {
}

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();

Expand Down Expand Up @@ -2647,7 +2647,7 @@ impl<'test> TestCx<'test> {
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") {
Expand Down

0 comments on commit 49e3d0a

Please sign in to comment.