mirror of
https://github.com/rust-lang/rust.git
synced 2025-02-23 04:14:28 +00:00
cargo-miri: avoid set_env
This commit is contained in:
parent
7fc0cbb02a
commit
6e9479f4e0
@ -94,7 +94,7 @@ pub fn phase_cargo_miri(mut args: impl Iterator<Item = String>) {
|
||||
let target = target.as_ref().unwrap_or(host);
|
||||
|
||||
// We always setup.
|
||||
setup(&subcommand, target, &rustc_version, verbose);
|
||||
let miri_sysroot = setup(&subcommand, target, &rustc_version, verbose);
|
||||
|
||||
// Invoke actual cargo for the job, but with different flags.
|
||||
// We re-use `cargo test` and `cargo run`, which makes target and binary handling very easy but
|
||||
@ -159,6 +159,8 @@ pub fn phase_cargo_miri(mut args: impl Iterator<Item = String>) {
|
||||
// Forward all further arguments (not consumed by `ArgSplitFlagValue`) to cargo.
|
||||
cmd.args(args);
|
||||
|
||||
// Let it know where the Miri sysroot lives.
|
||||
cmd.env("MIRI_SYSROOT", miri_sysroot);
|
||||
// Set `RUSTC_WRAPPER` to ourselves. Cargo will prepend that binary to its usual invocation,
|
||||
// i.e., the first argument is `rustc` -- which is what we use in `main` to distinguish
|
||||
// the two codepaths. (That extra argument is why we prefer this over setting `RUSTC`.)
|
||||
|
@ -13,13 +13,20 @@ use crate::util::*;
|
||||
/// Performs the setup required to make `cargo miri` work: Getting a custom-built libstd. Then sets
|
||||
/// `MIRI_SYSROOT`. Skipped if `MIRI_SYSROOT` is already set, in which case we expect the user has
|
||||
/// done all this already.
|
||||
pub fn setup(subcommand: &MiriCommand, target: &str, rustc_version: &VersionMeta, verbose: usize) {
|
||||
pub fn setup(
|
||||
subcommand: &MiriCommand,
|
||||
target: &str,
|
||||
rustc_version: &VersionMeta,
|
||||
verbose: usize,
|
||||
) -> PathBuf {
|
||||
let only_setup = matches!(subcommand, MiriCommand::Setup);
|
||||
let ask_user = !only_setup;
|
||||
let print_sysroot = only_setup && has_arg_flag("--print-sysroot"); // whether we just print the sysroot path
|
||||
if !only_setup && std::env::var_os("MIRI_SYSROOT").is_some() {
|
||||
// Skip setup step if MIRI_SYSROOT is explicitly set, *unless* we are `cargo miri setup`.
|
||||
return;
|
||||
if !only_setup {
|
||||
if let Some(sysroot) = std::env::var_os("MIRI_SYSROOT") {
|
||||
// Skip setup step if MIRI_SYSROOT is explicitly set, *unless* we are `cargo miri setup`.
|
||||
return sysroot.into();
|
||||
}
|
||||
}
|
||||
|
||||
// Determine where the rust sources are located. The env var trumps auto-detection.
|
||||
@ -92,6 +99,8 @@ pub fn setup(subcommand: &MiriCommand, target: &str, rustc_version: &VersionMeta
|
||||
command.env("RUSTC", &cargo_miri_path);
|
||||
}
|
||||
command.env("MIRI_CALLED_FROM_SETUP", "1");
|
||||
// Miri expects `MIRI_SYSROOT` to be set when invoked in target mode. Even if that directory is empty.
|
||||
command.env("MIRI_SYSROOT", &sysroot_dir);
|
||||
// Make sure there are no other wrappers getting in our way (Cc
|
||||
// https://github.com/rust-lang/miri/issues/1421,
|
||||
// https://github.com/rust-lang/miri/issues/2429). Looks like setting
|
||||
@ -117,8 +126,6 @@ pub fn setup(subcommand: &MiriCommand, target: &str, rustc_version: &VersionMeta
|
||||
// the user might have set, which is consistent with normal `cargo build` that does
|
||||
// not apply `RUSTFLAGS` to the sysroot either.
|
||||
let rustflags = &["-Cdebug-assertions=off", "-Coverflow-checks=on"];
|
||||
// Make sure all target-level Miri invocations know their sysroot.
|
||||
std::env::set_var("MIRI_SYSROOT", &sysroot_dir);
|
||||
|
||||
// Do the build.
|
||||
if print_sysroot {
|
||||
@ -159,4 +166,6 @@ pub fn setup(subcommand: &MiriCommand, target: &str, rustc_version: &VersionMeta
|
||||
// Print just the sysroot and nothing else to stdout; this way we do not need any escaping.
|
||||
println!("{}", sysroot_dir.display());
|
||||
}
|
||||
|
||||
sysroot_dir
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user