From 2c5dd6935385b175870ecef5cabe379dd608ebc3 Mon Sep 17 00:00:00 2001 From: Nathaniel Daniel Date: Tue, 19 Jul 2022 12:42:51 +0800 Subject: [PATCH 1/3] Add option to emit `rerun-if-env-changed` metadata --- src/lib.rs | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/lib.rs b/src/lib.rs index 30ebc9212..fcf058328 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -124,6 +124,7 @@ pub struct Build { extra_warnings: Option, env_cache: Arc>>>, apple_sdk_root_cache: Arc>>, + emit_rerun_if_env_changed: bool, } /// Represents the types of errors that may occur while using cc-rs. @@ -320,6 +321,7 @@ impl Build { warnings_into_errors: false, env_cache: Arc::new(Mutex::new(HashMap::new())), apple_sdk_root_cache: Arc::new(Mutex::new(HashMap::new())), + emit_rerun_if_env_changed: false, } } @@ -892,6 +894,7 @@ impl Build { /// - `rustc-link-search=native=`*target folder* /// - When target is MSVC, the ATL-MFC libs are added via `rustc-link-search=native=` /// - When C++ is enabled, the C++ stdlib is added via `rustc-link-lib` + /// - If `emit_rerun_if_env_changed` is `true`, `rerun-if-env-changed=`*env* /// pub fn cargo_metadata(&mut self, cargo_metadata: bool) -> &mut Build { self.cargo_metadata = cargo_metadata; @@ -921,6 +924,17 @@ impl Build { self.use_plt = Some(use_plt); self } + + /// Define whether metadata should be emitted for cargo to detect environment + /// changes that should trigger a rebuild. + /// + /// This has no effect if the `cargo_metadata` option is `false`. + /// + /// This option defaults to `false`. + pub fn emit_rerun_if_env_changed(&mut self, emit_rerun_if_env_changed: bool) -> &mut Build { + self.emit_rerun_if_env_changed = emit_rerun_if_env_changed; + self + } /// Configures whether the /MT flag or the /MD flag will be passed to msvc build tools. /// @@ -2788,6 +2802,9 @@ impl Build { } fn getenv(&self, v: &str) -> Option { + if self.emit_rerun_if_env_changed { + self.print(&format!("cargo:rerun-if-env-changed={}", v)); + } let mut cache = self.env_cache.lock().unwrap(); if let Some(val) = cache.get(v) { return val.clone(); From cbc9dacba252d847edb67a65240a0595ac1c875d Mon Sep 17 00:00:00 2001 From: Nathaniel Daniel Date: Tue, 19 Jul 2022 12:49:49 +0800 Subject: [PATCH 2/3] Run cargo fmt --- src/lib.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index fcf058328..9ad9b2078 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -924,8 +924,8 @@ impl Build { self.use_plt = Some(use_plt); self } - - /// Define whether metadata should be emitted for cargo to detect environment + + /// Define whether metadata should be emitted for cargo to detect environment /// changes that should trigger a rebuild. /// /// This has no effect if the `cargo_metadata` option is `false`. From dece89834c36e4a7329568ca62933d6c99300a25 Mon Sep 17 00:00:00 2001 From: Nathaniel Daniel Date: Fri, 28 Oct 2022 20:26:37 -0700 Subject: [PATCH 3/3] Change getenv to only emit metadata once per var --- src/lib.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 9ad9b2078..d9bb6c053 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -2802,13 +2802,13 @@ impl Build { } fn getenv(&self, v: &str) -> Option { - if self.emit_rerun_if_env_changed { - self.print(&format!("cargo:rerun-if-env-changed={}", v)); - } let mut cache = self.env_cache.lock().unwrap(); if let Some(val) = cache.get(v) { return val.clone(); } + if self.emit_rerun_if_env_changed { + self.print(&format!("cargo:rerun-if-env-changed={}", v)); + } let r = env::var(v).ok(); self.print(&format!("{} = {:?}", v, r)); cache.insert(v.to_string(), r.clone());