Introduce run-make V2 infrastructure, a run_make_support library and port over 2 tests as example#113026
Conversation
|
(rustbot has picked a reviewer for you, use r? to override) |
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
There was a problem hiding this comment.
Maybe do:
| let mut cmd = $crate::xshell::cmd!(sh, "{rustc}") | |
| .arg("--out-dir") | |
| .arg($scx.tmpdir()) | |
| .arg("-L") | |
| .arg($scx.tmpdir()); | |
| for arg in args.split_whitespace() { | |
| cmd = cmd.arg(arg); | |
| } | |
| let mut cmd = $crate::xshell::cmd!(sh, concat_str!("{rustc} ", $args)) | |
| .arg("--out-dir") | |
| .arg($scx.tmpdir()) | |
| .arg("-L") | |
| .arg($scx.tmpdir()); |
This should allow interpolations the same way as xshell itself and should correctly handle quoting arguments. I haven't tested it though.
There was a problem hiding this comment.
A bit unfortunate but cmd!() only accepts a literal, can concat_str! output a literal? I don't think so right? And yeah quoting arguments is a problem with the current incorrect behavior of split_whitespace.
There was a problem hiding this comment.
I could force the input to be a &[], since
let args = ["hello", "world"];
let c = cmd!(sh, "echo {args...}");works I think. This however forces the use site to become something like
let _output = rustc!(scx, ["--emit=metadata", "--crate-type=lib", "stable.rs"]);
let output = rustc!(
scx,
[
"--emit=metadata",
"--extern",
&format!("stable={}/libstable.rmeta", scx.tmpdir()),
"main.rs"
]
);There was a problem hiding this comment.
Of course. cmd!() would see the concat_str!() before expanding. @matklad would you accept adding something like a method on Shell that defines a wrapper program for all commands spawned using this Shell instance? Such that this could be cmd!(sh, $args) where sh is Shell::new().wrapper_command(rustc_path).
There was a problem hiding this comment.
While a proper fix to this requires a change to xshell, I will temporarily use the iterable form for the recipes since they're at least more correct than split_whitespace.
There was a problem hiding this comment.
let _output = rustc!(scx, ["--emit=metadata", "--crate-type=lib", "stable.rs"]);
We are passing argument as an array here, so I don't think we even need xshell? The whole purpose of xshell is to avoid needing an array literal, but, if you are okay with that, I don't think xshell brings much to the table here?
would you accept adding something like a method on Shell that defines a wrapper program for all commands spawned using this Shell instance?
This would technically work, but I don't think that's an obvious API with a clear use-case. My answer would be, if you want to control the first arg, to use something like
cmd!(sh, "{rustc} --emit=metadata --crate-type=lib")
Like shells, xshell supports interpolation of the first argumetn (or at least it should support it).
There was a problem hiding this comment.
We are passing argument as an array here, so I don't think we even need
xshell? The whole purpose of xshell is to avoid needing an array literal, but, if you are okay with that, I don't think xshell brings much to the table here?
(Note that passing-as-an-array here is a temporary band-aid fix, the intention is to avoid needing an array literal.) That is, ideally, the API would look something more like
let _output = rustc!("--emit=metadata --crate-type=lib stable.rs");so the test writer doesn't have to bother with an array literal.
run-make-v2 infrastructure, a rmake_support library and port over 2 tests as examplerun-make V2 infrastructure, a run_make_support library and port over 2 tests as example
There was a problem hiding this comment.
let _output = rustc!(scx, ["--emit=metadata", "--crate-type=lib", "stable.rs"]);
We are passing argument as an array here, so I don't think we even need xshell? The whole purpose of xshell is to avoid needing an array literal, but, if you are okay with that, I don't think xshell brings much to the table here?
would you accept adding something like a method on Shell that defines a wrapper program for all commands spawned using this Shell instance?
This would technically work, but I don't think that's an obvious API with a clear use-case. My answer would be, if you want to control the first arg, to use something like
cmd!(sh, "{rustc} --emit=metadata --crate-type=lib")
Like shells, xshell supports interpolation of the first argumetn (or at least it should support it).
|
I changed the implementation to rely on extern crate run_make_support;
use run_make_support::{rustc, run, run_fail};
fn main() {
let _output = rustc("a.rs --cfg x -C prefer-dynamic -Z unstable-options -C symbol-mangling-version=legacy");
let _output = rustc("b.rs -C prefer-dynamic -Z unstable-options -C symbol-mangling-version=legacy");
let _output = run("b");
let _output = rustc("a.rs --cfg y -C prefer-dynamic -Z unstable-options -C symbol-mangling-version=legacy");
let _output = run_fail("b");
}This unfortunately isn't as nice as having straight up string interpolation like extern crate run_make_support;
use run_make_support::{rustc, aux_build};
fn main() {
let _output = aux_build("stable.rs");
let output = rustc(format!("--emit=metadata --extern stable={}/libstable.rmeta main.rs", env!("TMPDIR")));
let stderr = String::from_utf8_lossy(&output.stderr);
let version = include_str!(concat!(env!("S"), "/src/version"));
let expected_string = format!("stable since {}", version.trim());
assert!(stderr.contains(&expected_string));
} |
|
These commits modify the If this was unintentional then you should revert the changes before this PR is merged. |
|
It might be interesting to combine "split-on-whitespace" idea with builder-style interface. This is the style of testing employed by Cargo: So, let tmpdir = env!("TMPDIR");
let output = rustc("main.rs --emit=metadata")
.arg(format!("--extern=stable={tempdir}/libstable.rmeta"))
.stderr_utf8_lossy()?
;Thinking more about this, I think "specific builders" are probably a better fit here than "generic shell". I expect these tests to be relatively few, so we don't have to optimize suuuper hard for readability. At the same time, I expect most of these tests to be similar, and to benefit from abstracting common functionality. Abstracting through a builder is easier than abstracting through macro-based DSL. |
|
☔ The latest upstream changes (presumably #113162) made this pull request unmergeable. Please resolve the merge conflicts. |
Mark-Simulacrum
left a comment
There was a problem hiding this comment.
r? @bjorn3 - this looks good to me in broad strokes, but looks like you've done a bunch of review here already.
|
@bors r+ |
This comment has been minimized.
This comment has been minimized.
|
💔 Test failed - checks-actions |
|
Gonna edit |
This comment has been minimized.
This comment has been minimized.
|
Oh, if you edit (If you forget, EDIT: Never mind, you figured it out 👍 |
Yeah, great advice on editing |
This comment has been minimized.
This comment has been minimized.
|
I fixed the |
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
|
|
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
|
|
| target_rpath_env_path.push(path_sep(&target)); | ||
| target_rpath_env_path.push_str(&std::env::var("TARGET_RPATH_ENV").unwrap()); | ||
| target_rpath_env_path.push(':'); | ||
| target_rpath_env_path.push(path_sep(&target)); |
There was a problem hiding this comment.
It is the host that matters here, right? You can probably use std::env::join_paths here.
This comment has been minimized.
This comment has been minimized.
|
Seems to finally work for msvc! |
|
@bors r+ |
|
☀️ Test successful - checks-actions |
|
Finished benchmarking commit (17edace): comparison URL. Overall result: no relevant changes - no action needed@rustbot label: -perf-regression Instruction countThis benchmark run did not return any relevant results for this metric. Max RSS (memory usage)This benchmark run did not return any relevant results for this metric. CyclesResultsThis is a less reliable metric that may be of interest but was not used to determine the overall result at the top of this comment.
Binary sizeThis benchmark run did not return any relevant results for this metric. Bootstrap: 651.67s -> 651.533s (-0.02%) |
Preface
See issue #40713: Switch run-make tests from Makefiles to rust for more context.
Basic Description of
run-makeV2run-makeV2 aims to eliminate the dependency onmakeandMakefiles for buildingrun-make-style tests. Makefiles are replaced by recipes (rmake.rs). The current implementation runsrun-makeV2 tests in 3 steps:run_make_supportwhich thermake.rsrecipes depend on as a tool lib.rmake.rsand link in the support library.rmake.rsis basically a replacement forMakefile, and allows running arbitrary Rust code. The support library is built using cargo, and so can depend on external crates if desired.The infrastructure implemented by this PR is very barebones, and is the minimally required infrastructure needed to build, run and pass the two example
run-maketests ported over to the new infrastructure.Example
run-makeV2 testFollow Up Work