diff --git a/src/cargo/core/compiler/fingerprint/dirty_reason.rs b/src/cargo/core/compiler/fingerprint/dirty_reason.rs index cb6548a41a5..ba43e358973 100644 --- a/src/cargo/core/compiler/fingerprint/dirty_reason.rs +++ b/src/cargo/core/compiler/fingerprint/dirty_reason.rs @@ -29,6 +29,7 @@ pub enum DirtyReason { MetadataChanged, ConfigSettingsChanged, CompileKindChanged, + EnvConfigChanged, LocalLengthsChanged, PrecalculatedComponentsChanged { old: String, @@ -172,6 +173,9 @@ impl DirtyReason { DirtyReason::CompileKindChanged => { s.dirty_because(unit, "the rustc compile kind changed") } + DirtyReason::EnvConfigChanged => { + s.dirty_because(unit, "the environment variable changed") + } DirtyReason::LocalLengthsChanged => { s.dirty_because(unit, "the local lengths changed")?; s.note( diff --git a/src/cargo/core/compiler/fingerprint/mod.rs b/src/cargo/core/compiler/fingerprint/mod.rs index 4fdbed220c1..c474d5f24b4 100644 --- a/src/cargo/core/compiler/fingerprint/mod.rs +++ b/src/cargo/core/compiler/fingerprint/mod.rs @@ -420,8 +420,14 @@ pub fn prepare_target( let mtime_on_use = build_runner.bcx.gctx.cli_unstable().mtime_on_use; let dirty_reason = compare_old_fingerprint(unit, &loc, &*fingerprint, mtime_on_use, force); - let Some(dirty_reason) = dirty_reason else { - return Ok(Job::new_fresh()); + let dirty_reason = match dirty_reason { + Some(dr) => dr, + None => { + let Some(dr) = env_config_modified(bcx.gctx) else { + return Ok(Job::new_fresh()); + }; + dr + } }; // We're going to rebuild, so ensure the source of the crate passes all @@ -2231,3 +2237,17 @@ pub fn parse_rustc_dep_info(rustc_dep_info: &Path) -> CargoResult Ok(ret) } } + +/// Detects if environment variables from config `[env]` is newly seted. +fn env_config_modified(gctx: &crate::GlobalContext) -> Option { + for (key, value) in gctx.env_config().unwrap().iter() { + if !gctx.env().any(|(k, _)| k == key) { + continue; + } + + if !value.is_force() && gctx.env().find(|(k, _)| k == key).is_some() { + return Some(DirtyReason::EnvConfigChanged); + } + } + None +} diff --git a/tests/testsuite/cargo_env_config.rs b/tests/testsuite/cargo_env_config.rs index d38847fad64..61789163aa5 100644 --- a/tests/testsuite/cargo_env_config.rs +++ b/tests/testsuite/cargo_env_config.rs @@ -239,3 +239,32 @@ fn env_applied_to_target_info_discovery_rustc() { .with_stderr_contains("MAIN ENV_TEST:from-env") .run(); } + +#[cargo_test] +fn env_reset() { + let p = project() + .file("Cargo.toml", &basic_bin_manifest("foo")) + .file( + "src/main.rs", + r#" + use std::env; + fn main() { + println!( "{}", env!("ENV_TEST") ); + } + "#, + ) + .file( + ".cargo/config.toml", + r#" + [env] + ENV_TEST = "from-config" + "#, + ) + .build(); + + p.cargo("run").with_stdout_contains("from-config").run(); + p.cargo("run") + .env("ENV_TEST", "from-env") + .with_stdout_contains("from-env") + .run(); +}