From c166c14e0b385baae6e64b44cef59c5ac7bc1f67 Mon Sep 17 00:00:00 2001 From: LuuuX Date: Sun, 17 Mar 2024 00:34:38 +0800 Subject: [PATCH] Move detection to be in the fingerprint code --- .../core/compiler/fingerprint/dirty_reason.rs | 4 ++ src/cargo/core/compiler/fingerprint/mod.rs | 24 +++++++- src/cargo/core/compiler/mod.rs | 57 +++++++------------ 3 files changed, 46 insertions(+), 39 deletions(-) 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/src/cargo/core/compiler/mod.rs b/src/cargo/core/compiler/mod.rs index 3f8e54491d1..bed881d50db 100644 --- a/src/cargo/core/compiler/mod.rs +++ b/src/cargo/core/compiler/mod.rs @@ -190,29 +190,27 @@ fn compile<'gctx>( } else { 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)? { - let work = if unit.mode.is_doc() || unit.mode.is_doc_scrape() { - rustdoc(build_runner, unit)? - } else { - rustc(build_runner, unit, exec)? - }; - work.then(link_targets(build_runner, unit, false)?) + job.before(if job.freshness().is_dirty() { + let work = if unit.mode.is_doc() || unit.mode.is_doc_scrape() { + rustdoc(build_runner, unit)? } else { - // We always replay the output cache, - // since it might contain future-incompat-report messages - let work = replay_output_cache( - unit.pkg.package_id(), - PathBuf::from(unit.pkg.manifest_path()), - &unit.target, - build_runner.files().message_cache_path(unit), - build_runner.bcx.build_config.message_format, - unit.show_warnings(bcx.gctx), - ); - // Need to link targets on both the dirty and fresh. - work.then(link_targets(build_runner, unit, true)?) - }, - ); + rustc(build_runner, unit, exec)? + }; + work.then(link_targets(build_runner, unit, false)?) + } else { + // We always replay the output cache, + // since it might contain future-incompat-report messages + let work = replay_output_cache( + unit.pkg.package_id(), + PathBuf::from(unit.pkg.manifest_path()), + &unit.target, + build_runner.files().message_cache_path(unit), + build_runner.bcx.build_config.message_format, + unit.show_warnings(bcx.gctx), + ); + // Need to link targets on both the dirty and fresh. + work.then(link_targets(build_runner, unit, true)?) + }); job }; @@ -1928,21 +1926,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());