@@ -73,6 +73,7 @@ pub enum ProjectWorkspace {
73
73
cfg_overrides : CfgOverrides ,
74
74
toolchain : Option < Version > ,
75
75
target_layout : Result < String , String > ,
76
+ cargo_config_extra_env : FxHashMap < String , String > ,
76
77
} ,
77
78
/// Project workspace was manually specified using a `rust-project.json` file.
78
79
Json {
@@ -115,7 +116,8 @@ impl fmt::Debug for ProjectWorkspace {
115
116
rustc_cfg,
116
117
cfg_overrides,
117
118
toolchain,
118
- target_layout : data_layout,
119
+ target_layout,
120
+ cargo_config_extra_env,
119
121
} => f
120
122
. debug_struct ( "Cargo" )
121
123
. field ( "root" , & cargo. workspace_root ( ) . file_name ( ) )
@@ -128,7 +130,8 @@ impl fmt::Debug for ProjectWorkspace {
128
130
. field ( "n_rustc_cfg" , & rustc_cfg. len ( ) )
129
131
. field ( "n_cfg_overrides" , & cfg_overrides. len ( ) )
130
132
. field ( "toolchain" , & toolchain)
131
- . field ( "data_layout" , & data_layout)
133
+ . field ( "data_layout" , & target_layout)
134
+ . field ( "cargo_config_extra_env" , & cargo_config_extra_env)
132
135
. finish ( ) ,
133
136
ProjectWorkspace :: Json {
134
137
project,
@@ -320,6 +323,8 @@ impl ProjectWorkspace {
320
323
} ) ?;
321
324
let cargo = CargoWorkspace :: new ( meta) ;
322
325
326
+ let cargo_config_extra_env =
327
+ cargo_config_env ( cargo_toml, & config. extra_env , sysroot_ref) ;
323
328
ProjectWorkspace :: Cargo {
324
329
cargo,
325
330
build_scripts : WorkspaceBuildScripts :: default ( ) ,
@@ -329,6 +334,7 @@ impl ProjectWorkspace {
329
334
cfg_overrides,
330
335
toolchain,
331
336
target_layout : data_layout. map_err ( |it| it. to_string ( ) ) ,
337
+ cargo_config_extra_env,
332
338
}
333
339
}
334
340
} ;
@@ -589,6 +595,7 @@ impl ProjectWorkspace {
589
595
build_scripts,
590
596
toolchain : _,
591
597
target_layout : _,
598
+ cargo_config_extra_env : _,
592
599
} => {
593
600
cargo
594
601
. packages ( )
@@ -700,6 +707,7 @@ impl ProjectWorkspace {
700
707
build_scripts,
701
708
toolchain,
702
709
target_layout,
710
+ cargo_config_extra_env : _,
703
711
} => cargo_to_crate_graph (
704
712
load,
705
713
rustc. as_ref ( ) . map ( |a| a. as_ref ( ) ) . ok ( ) ,
@@ -742,6 +750,7 @@ impl ProjectWorkspace {
742
750
rustc_cfg,
743
751
cfg_overrides,
744
752
toolchain,
753
+ cargo_config_extra_env,
745
754
build_scripts : _,
746
755
target_layout : _,
747
756
} ,
@@ -752,6 +761,7 @@ impl ProjectWorkspace {
752
761
rustc_cfg : o_rustc_cfg,
753
762
cfg_overrides : o_cfg_overrides,
754
763
toolchain : o_toolchain,
764
+ cargo_config_extra_env : o_cargo_config_extra_env,
755
765
build_scripts : _,
756
766
target_layout : _,
757
767
} ,
@@ -762,6 +772,7 @@ impl ProjectWorkspace {
762
772
&& cfg_overrides == o_cfg_overrides
763
773
&& toolchain == o_toolchain
764
774
&& sysroot == o_sysroot
775
+ && cargo_config_extra_env == o_cargo_config_extra_env
765
776
}
766
777
(
767
778
Self :: Json { project, sysroot, rustc_cfg, toolchain, target_layout : _ } ,
@@ -1598,3 +1609,31 @@ fn create_cfg_options(rustc_cfg: Vec<CfgFlag>) -> CfgOptions {
1598
1609
cfg_options. insert_atom ( "debug_assertions" . into ( ) ) ;
1599
1610
cfg_options
1600
1611
}
1612
+
1613
+ fn cargo_config_env (
1614
+ cargo_toml : & ManifestPath ,
1615
+ extra_env : & FxHashMap < String , String > ,
1616
+ sysroot : Option < & Sysroot > ,
1617
+ ) -> FxHashMap < String , String > {
1618
+ let Ok ( program) = Sysroot :: discover_tool ( sysroot, toolchain:: Tool :: Cargo ) else {
1619
+ return Default :: default ( ) ;
1620
+ } ;
1621
+ let mut cargo_config = Command :: new ( program) ;
1622
+ cargo_config. envs ( extra_env) ;
1623
+ cargo_config
1624
+ . current_dir ( cargo_toml. parent ( ) )
1625
+ . args ( [ "-Z" , "unstable-options" , "config" , "get" , "env" ] )
1626
+ . env ( "RUSTC_BOOTSTRAP" , "1" ) ;
1627
+ // if successful we receive `env.key.value = "value" per entry
1628
+ tracing:: debug!( "Discovering cargo config env by {:?}" , cargo_config) ;
1629
+ utf8_stdout ( cargo_config) . map ( parse_output_cargo_config_env) . unwrap_or_default ( )
1630
+ }
1631
+
1632
+ fn parse_output_cargo_config_env ( stdout : String ) -> FxHashMap < String , String > {
1633
+ stdout
1634
+ . lines ( )
1635
+ . filter_map ( |l| l. strip_prefix ( "env." ) )
1636
+ . filter_map ( |l| l. split_once ( ".value = " ) )
1637
+ . map ( |( key, value) | ( key. to_owned ( ) , value. trim_matches ( '"' ) . to_owned ( ) ) )
1638
+ . collect ( )
1639
+ }
0 commit comments