@@ -376,6 +376,7 @@ use std::time::SystemTime;
376
376
use anyhow:: { bail, format_err, Context as _} ;
377
377
use cargo_util:: { paths, ProcessBuilder , Sha256 } ;
378
378
use filetime:: FileTime ;
379
+ use lazycell:: LazyCell ;
379
380
use serde:: de;
380
381
use serde:: ser;
381
382
use serde:: { Deserialize , Serialize } ;
@@ -792,14 +793,36 @@ pub enum StaleItem {
792
793
impl LocalFingerprint {
793
794
/// Read the environment variable of the given env `key`, and creates a new
794
795
/// [`LocalFingerprint::RerunIfEnvChanged`] for it.
795
- ///
796
- // TODO: This is allowed at this moment. Should figure out if it makes
797
- // sense if permitting to read env from the config system.
798
796
#[ allow( clippy:: disallowed_methods) ]
799
- fn from_env < K : AsRef < str > > ( key : K ) -> LocalFingerprint {
797
+ fn from_env < K : AsRef < str > > (
798
+ key : K ,
799
+ env_config : & Arc < HashMap < String , OsString > > ,
800
+ env_config_insensitive : & Arc < LazyCell < HashMap < String , OsString > > > ,
801
+ ) -> LocalFingerprint {
800
802
let key = key. as_ref ( ) ;
801
803
let var = key. to_owned ( ) ;
802
- let val = env:: var ( key) . ok ( ) ;
804
+ let val = if let Some ( val) = env:: var ( key) . ok ( ) {
805
+ Some ( val)
806
+ } else {
807
+ match env_config. get ( key) {
808
+ Some ( value) => value. to_str ( ) . map ( |s| s. to_string ( ) ) ,
809
+ None => {
810
+ if cfg ! ( windows) {
811
+ env_config_insensitive
812
+ . borrow_with ( || {
813
+ env_config
814
+ . iter ( )
815
+ . map ( |( k, v) | ( k. to_uppercase ( ) . clone ( ) , v. clone ( ) ) )
816
+ . collect :: < HashMap < String , OsString > > ( )
817
+ } )
818
+ . get ( & key. to_uppercase ( ) )
819
+ . and_then ( |s| s. to_str ( ) . map ( |s| s. to_string ( ) ) )
820
+ } else {
821
+ None
822
+ }
823
+ }
824
+ }
825
+ } ;
803
826
LocalFingerprint :: RerunIfEnvChanged { var, val }
804
827
}
805
828
@@ -1697,6 +1720,7 @@ fn build_script_local_fingerprints(
1697
1720
// obvious.
1698
1721
let pkg_root = unit. pkg . root ( ) . to_path_buf ( ) ;
1699
1722
let target_dir = target_root ( build_runner) ;
1723
+ let env_config = Arc :: clone ( build_runner. bcx . gctx . env_config ( ) . unwrap ( ) ) ;
1700
1724
let calculate =
1701
1725
move |deps : & BuildDeps , pkg_fingerprint : Option < & dyn Fn ( ) -> CargoResult < String > > | {
1702
1726
if deps. rerun_if_changed . is_empty ( ) && deps. rerun_if_env_changed . is_empty ( ) {
@@ -1726,7 +1750,12 @@ fn build_script_local_fingerprints(
1726
1750
// Ok so now we're in "new mode" where we can have files listed as
1727
1751
// dependencies as well as env vars listed as dependencies. Process
1728
1752
// them all here.
1729
- Ok ( Some ( local_fingerprints_deps ( deps, & target_dir, & pkg_root) ) )
1753
+ Ok ( Some ( local_fingerprints_deps (
1754
+ deps,
1755
+ & target_dir,
1756
+ & pkg_root,
1757
+ & env_config,
1758
+ ) ) )
1730
1759
} ;
1731
1760
1732
1761
// Note that `false` == "not overridden"
@@ -1761,6 +1790,7 @@ fn local_fingerprints_deps(
1761
1790
deps : & BuildDeps ,
1762
1791
target_root : & Path ,
1763
1792
pkg_root : & Path ,
1793
+ env_config : & Arc < HashMap < String , OsString > > ,
1764
1794
) -> Vec < LocalFingerprint > {
1765
1795
debug ! ( "new local fingerprints deps {:?}" , pkg_root) ;
1766
1796
let mut local = Vec :: new ( ) ;
@@ -1781,11 +1811,11 @@ fn local_fingerprints_deps(
1781
1811
. collect ( ) ;
1782
1812
local. push ( LocalFingerprint :: RerunIfChanged { output, paths } ) ;
1783
1813
}
1784
-
1814
+ let env_config_insensitive = Arc :: new ( LazyCell :: new ( ) ) ;
1785
1815
local. extend (
1786
1816
deps. rerun_if_env_changed
1787
1817
. iter ( )
1788
- . map ( LocalFingerprint :: from_env) ,
1818
+ . map ( |s| LocalFingerprint :: from_env ( s , env_config , & env_config_insensitive ) ) ,
1789
1819
) ;
1790
1820
1791
1821
local
0 commit comments