diff --git a/src/cargo/core/compiler/fingerprint/dirty_reason.rs b/src/cargo/core/compiler/fingerprint/dirty_reason.rs index cb6548a41a57..d5e9e19d0355 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 4fdbed220c1c..782cc82bb5bc 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 modified. +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 +} \ No newline at end of file diff --git a/src/cargo/core/compiler/mod.rs b/src/cargo/core/compiler/mod.rs index 3f8e54491d1b..65b3756855f9 100644 --- a/src/cargo/core/compiler/mod.rs +++ b/src/cargo/core/compiler/mod.rs @@ -191,7 +191,7 @@ fn compile<'gctx>( let force = exec.force_rebuild(unit) || force_rebuild; let mut job = fingerprint::prepare_target(build_runner, unit, force)?; job.before( - if job.freshness().is_dirty() || env_config_modified(bcx.gctx)? { + if job.freshness().is_dirty() { let work = if unit.mode.is_doc() || unit.mode.is_doc_scrape() { rustdoc(build_runner, unit)? } else { @@ -1928,21 +1928,6 @@ fn should_include_scrape_units(bcx: &BuildContext<'_, '_>, unit: &Unit) -> bool unit.mode.is_doc() && bcx.scrape_units.len() > 0 && bcx.ws.unit_needs_doc_scrape(unit) } -/// Detects if environment variables from config `[env]` is newly modified. -fn env_config_modified(gctx: &crate::GlobalContext) -> CargoResult { - for (key, value) in gctx.env_config()?.iter() { - if !gctx.env().any(|(k, _)| k == key) { - continue; - } - - if !value.is_force() && gctx.env().find(|(k, _)| k == key).is_some() { - return Ok(true); - } - } - - Ok(false) -} - /// Gets the file path of function call information output from `rustdoc`. fn scrape_output_path(build_runner: &BuildRunner<'_, '_>, unit: &Unit) -> CargoResult { assert!(unit.mode.is_doc() || unit.mode.is_doc_scrape());