Skip to content

Commit eddbd7c

Browse files
committed
Pass host flags to rustc shim using prefixed env. vars
1 parent c373a05 commit eddbd7c

File tree

2 files changed

+42
-18
lines changed

2 files changed

+42
-18
lines changed

src/bootstrap/bin/rustc.rs

+5-14
Original file line numberDiff line numberDiff line change
@@ -111,20 +111,11 @@ fn main() {
111111
// FIXME(rust-lang/cargo#5754) we shouldn't be using special env vars
112112
// here, but rather Cargo should know what flags to pass rustc itself.
113113

114-
// Override linker if necessary.
115-
if let Ok(host_linker) = env::var("RUSTC_HOST_LINKER") {
116-
cmd.arg(format!("-Clinker={host_linker}"));
117-
}
118-
if env::var_os("RUSTC_HOST_FUSE_LD_LLD").is_some() {
119-
cmd.arg("-Clink-args=-fuse-ld=lld");
120-
}
121-
122-
if let Ok(s) = env::var("RUSTC_HOST_CRT_STATIC") {
123-
if s == "true" {
124-
cmd.arg("-C").arg("target-feature=+crt-static");
125-
}
126-
if s == "false" {
127-
cmd.arg("-C").arg("target-feature=-crt-static");
114+
// Find any host flags that were passed by bootstrap.
115+
// The flags are stored in a RUSTC_HOST_FLAGS variable, separated by spaces.
116+
if let Ok(flags) = std::env::var("RUSTC_HOST_FLAGS") {
117+
for flag in flags.split(' ') {
118+
cmd.arg(flag);
128119
}
129120
}
130121

src/bootstrap/builder.rs

+37-4
Original file line numberDiff line numberDiff line change
@@ -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)]
22332260
pub 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

Comments
 (0)