diff options
author | Oli Scherer <git-spam-no-reply9815368754983@oli-obk.de> | 2023-05-12 10:04:55 +0000 |
---|---|---|
committer | Oli Scherer <git-spam-no-reply9815368754983@oli-obk.de> | 2023-05-12 10:04:55 +0000 |
commit | 756c243e50dafea95d78d11890a8e7d33e7ce06f (patch) | |
tree | a05e71e622df98ccfdd761a36b391f89fb64727b /src/tools | |
parent | 9642e40076b0bf9480d8a090de64ed8dd4e4a8b5 (diff) | |
download | rust-756c243e50dafea95d78d11890a8e7d33e7ce06f.tar.gz |
Pass arguments to the interpreted program via `run-dep`
Diffstat (limited to 'src/tools')
-rw-r--r-- | src/tools/miri/Cargo.lock | 4 | ||||
-rw-r--r-- | src/tools/miri/Cargo.toml | 2 | ||||
-rw-r--r-- | src/tools/miri/tests/compiletest.rs | 83 |
3 files changed, 42 insertions, 47 deletions
diff --git a/src/tools/miri/Cargo.lock b/src/tools/miri/Cargo.lock index e2a7d484c23..737423a2cd1 100644 --- a/src/tools/miri/Cargo.lock +++ b/src/tools/miri/Cargo.lock @@ -820,9 +820,9 @@ dependencies = [ [[package]] name = "ui_test" -version = "0.9.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95033b0e41b8018013d99a6f1486c1ae5bd080378ced60c5f797e93842423b33" +checksum = "191a442639ea102fa62671026047e51d574bfda44b7fdf32151d7314624c1cd2" dependencies = [ "bstr", "cargo-platform", diff --git a/src/tools/miri/Cargo.toml b/src/tools/miri/Cargo.toml index f6f81836804..5987b0df8d6 100644 --- a/src/tools/miri/Cargo.toml +++ b/src/tools/miri/Cargo.toml @@ -39,7 +39,7 @@ libloading = "0.7" [dev-dependencies] colored = "2" -ui_test = "0.9" +ui_test = "0.10" rustc_version = "0.4" # Features chosen to match those required by env_logger, to avoid rebuilds regex = { version = "1.5.5", default-features = false, features = ["perf", "std"] } diff --git a/src/tools/miri/tests/compiletest.rs b/src/tools/miri/tests/compiletest.rs index d57d3d22d5e..435771c2f39 100644 --- a/src/tools/miri/tests/compiletest.rs +++ b/src/tools/miri/tests/compiletest.rs @@ -1,6 +1,6 @@ use colored::*; use regex::bytes::Regex; -use std::io::Write; +use std::ffi::OsString; use std::path::{Path, PathBuf}; use std::{env, process::Command}; use ui_test::status_emitter::StatusEmitter; @@ -46,13 +46,7 @@ fn build_so_for_c_ffi_tests() -> PathBuf { so_file_path } -fn test_config( - args: impl Iterator<Item = String>, - target: &str, - path: &str, - mode: Mode, - with_dependencies: bool, -) -> Config { +fn test_config(target: &str, path: &str, mode: Mode, with_dependencies: bool) -> Config { // Miri is rustc-like, so we create a default builder for rustc and modify it let mut program = CommandBuilder::rustc(); program.program = miri_path(); @@ -110,9 +104,29 @@ fn test_config( ..Config::default() }; + let use_std = env::var_os("MIRI_NO_STD").is_none(); + + if with_dependencies && use_std { + config.dependencies_crate_manifest_path = + Some(Path::new("test_dependencies").join("Cargo.toml")); + config.dependency_builder.args = vec![ + "run".into(), + "--manifest-path".into(), + "cargo-miri/Cargo.toml".into(), + "--".into(), + "miri".into(), + "run".into(), // There is no `cargo miri build` so we just use `cargo miri run`. + ]; + } + config +} + +fn run_tests(mode: Mode, path: &str, target: &str, with_dependencies: bool) -> Result<()> { + let mut config = test_config(target, path, mode, with_dependencies); + // Handle command-line arguments. let mut after_dashdash = false; - config.path_filter.extend(args.filter(|arg| { + config.path_filter.extend(std::env::args().skip(1).filter(|arg| { if after_dashdash { // Just propagate everything. return true; @@ -133,26 +147,6 @@ fn test_config( } })); - let use_std = env::var_os("MIRI_NO_STD").is_none(); - - if with_dependencies && use_std { - config.dependencies_crate_manifest_path = - Some(Path::new("test_dependencies").join("Cargo.toml")); - config.dependency_builder.args = vec![ - "run".into(), - "--manifest-path".into(), - "cargo-miri/Cargo.toml".into(), - "--".into(), - "miri".into(), - "run".into(), // There is no `cargo miri build` so we just use `cargo miri run`. - ]; - } - config -} - -fn run_tests(mode: Mode, path: &str, target: &str, with_dependencies: bool) -> Result<()> { - let config = test_config(std::env::args().skip(1), target, path, mode, with_dependencies); - eprintln!(" Compiler: {}", config.program.display()); ui_test::run_tests_generic( config, @@ -241,9 +235,12 @@ fn main() -> Result<()> { let target = get_target(); - if let Some(first) = std::env::args().nth(1) { + let mut args = std::env::args_os(); + + // Skip the program name and check whether this is a `./miri run-dep` invocation + if let Some(first) = args.nth(1) { if first == "--miri-run-dep-mode" { - return run_dep_mode(target); + return run_dep_mode(target, args); } } @@ -269,19 +266,17 @@ fn main() -> Result<()> { Ok(()) } -fn run_dep_mode(target: String) -> Result<()> { - let files = std::env::args().skip(2); - for path in files { - let mut config = test_config(std::iter::empty(), &target, &path, Mode::Yolo, true); - config.program.args.remove(0); // remove the `--error-format=json` argument - config.program.args.push("--color".into()); - config.program.args.push("always".into()); - let output = ui_test::run_file(config, Path::new(&path))?; - std::io::stderr().write_all(&output.stderr)?; - std::io::stdout().write_all(&output.stdout)?; - std::process::exit(output.status.code().unwrap()); - } - Ok(()) +fn run_dep_mode(target: String, mut args: impl Iterator<Item = OsString>) -> Result<()> { + let path = args.next().expect("./miri run-dep must be followed by a file name"); + let mut config = test_config(&target, "", Mode::Yolo, true); + config.program.args.remove(0); // remove the `--error-format=json` argument + config.program.args.push("--color".into()); + config.program.args.push("always".into()); + let mut cmd = ui_test::test_command(config, Path::new(&path))?; + cmd.arg("--"); + cmd.args(args); + println!("{cmd:?}"); + if cmd.spawn()?.wait()?.success() { Ok(()) } else { std::process::exit(1) } } /// This is a custom renderer for `ui_test` output that does not emit github actions |