@@ -1265,6 +1265,8 @@ impl<'a> Builder<'a> {
12651265 let mut cargo = self . bare_cargo ( compiler, mode, target, cmd) ;
12661266 let out_dir = self . stage_out ( compiler, mode) ;
12671267
1268+ let mut hostflags = HostFlags :: default ( ) ;
1269+
12681270 // Codegen backends are not yet tracked by -Zbinary-dep-depinfo,
12691271 // so we need to explicitly clear out if they've been updated.
12701272 for backend in self . codegen_backends ( compiler) {
@@ -1652,10 +1654,10 @@ impl<'a> Builder<'a> {
16521654 }
16531655
16541656 if let Some ( host_linker) = self . linker ( compiler. host ) {
1655- cargo . env ( "RUSTC_HOST_LINKER ", host_linker) ;
1657+ hostflags . flag ( format ! ( "-Clinker={} ", host_linker. display ( ) ) ) ;
16561658 }
16571659 if self . is_fuse_ld_lld ( compiler. host ) {
1658- cargo . env ( "RUSTC_HOST_FUSE_LD_LLD" , "1 ") ;
1660+ hostflags . flag ( "-Clink-args=-fuse-ld=lld ") ;
16591661 }
16601662
16611663 if let Some ( target_linker) = self . linker ( target) {
@@ -1739,7 +1741,8 @@ impl<'a> Builder<'a> {
17391741 }
17401742
17411743 if let Some ( x) = self . crt_static ( compiler. host ) {
1742- cargo. env ( "RUSTC_HOST_CRT_STATIC" , x. to_string ( ) ) ;
1744+ let sign = if x { "+" } else { "-" } ;
1745+ hostflags. flag ( format ! ( "-Ctarget-feature={sign}crt-static" ) ) ;
17431746 }
17441747
17451748 if let Some ( map_to) = self . build . debuginfo_map_to ( GitRepo :: Rustc ) {
@@ -2051,7 +2054,7 @@ impl<'a> Builder<'a> {
20512054 cargo. env ( "RUSTFLAGS" , & rustc_args. join ( " " ) ) ;
20522055 }
20532056
2054- Cargo { command : cargo, rustflags, rustdocflags, allow_features }
2057+ Cargo { command : cargo, rustflags, rustdocflags, hostflags , allow_features }
20552058 }
20562059
20572060 /// Ensure that a given step is built, returning its output. This will
@@ -2229,11 +2232,36 @@ impl Rustflags {
22292232 }
22302233}
22312234
2235+ /// Flags that are passed to the `rustc` shim binary.
2236+ /// These flags will only be applied when compiling host code, i.e. when
2237+ /// `--target` is unset.
2238+ #[ derive( Debug , Default ) ]
2239+ pub struct HostFlags {
2240+ rustc : Vec < String > ,
2241+ }
2242+
2243+ impl HostFlags {
2244+ const SEPARATOR : & ' static str = " " ;
2245+
2246+ /// Adds a host rustc flag.
2247+ fn flag < S : Into < String > > ( & mut self , flag : S ) {
2248+ let value = flag. into ( ) . trim ( ) . to_string ( ) ;
2249+ assert ! ( !value. contains( Self :: SEPARATOR ) ) ;
2250+ self . rustc . push ( value) ;
2251+ }
2252+
2253+ /// Encodes all the flags into a single string.
2254+ fn encode ( self ) -> String {
2255+ self . rustc . join ( Self :: SEPARATOR )
2256+ }
2257+ }
2258+
22322259#[ derive( Debug ) ]
22332260pub struct Cargo {
22342261 command : Command ,
22352262 rustflags : Rustflags ,
22362263 rustdocflags : Rustflags ,
2264+ hostflags : HostFlags ,
22372265 allow_features : String ,
22382266}
22392267
@@ -2305,6 +2333,11 @@ impl From<Cargo> for Command {
23052333 cargo. command . env ( "RUSTDOCFLAGS" , rustdocflags) ;
23062334 }
23072335
2336+ let encoded_hostflags = cargo. hostflags . encode ( ) ;
2337+ if !encoded_hostflags. is_empty ( ) {
2338+ cargo. command . env ( "RUSTC_HOST_FLAGS" , encoded_hostflags) ;
2339+ }
2340+
23082341 if !cargo. allow_features . is_empty ( ) {
23092342 cargo. command . env ( "RUSTC_ALLOW_FEATURES" , cargo. allow_features ) ;
23102343 }
0 commit comments