Skip to content

Commit

Permalink
Pass host flags to rustc shim using prefixed env. vars
Browse files Browse the repository at this point in the history
  • Loading branch information
Kobzol committed Oct 5, 2023
1 parent c373a05 commit eddbd7c
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 18 deletions.
19 changes: 5 additions & 14 deletions src/bootstrap/bin/rustc.rs
Original file line number Diff line number Diff line change
Expand Up @@ -111,20 +111,11 @@ fn main() {
// FIXME(rust-lang/cargo#5754) we shouldn't be using special env vars
// here, but rather Cargo should know what flags to pass rustc itself.

// Override linker if necessary.
if let Ok(host_linker) = env::var("RUSTC_HOST_LINKER") {
cmd.arg(format!("-Clinker={host_linker}"));
}
if env::var_os("RUSTC_HOST_FUSE_LD_LLD").is_some() {
cmd.arg("-Clink-args=-fuse-ld=lld");
}

if let Ok(s) = env::var("RUSTC_HOST_CRT_STATIC") {
if s == "true" {
cmd.arg("-C").arg("target-feature=+crt-static");
}
if s == "false" {
cmd.arg("-C").arg("target-feature=-crt-static");
// Find any host flags that were passed by bootstrap.
// The flags are stored in a RUSTC_HOST_FLAGS variable, separated by spaces.
if let Ok(flags) = std::env::var("RUSTC_HOST_FLAGS") {
for flag in flags.split(' ') {
cmd.arg(flag);
}
}

Expand Down
41 changes: 37 additions & 4 deletions src/bootstrap/builder.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1265,6 +1265,8 @@ impl<'a> Builder<'a> {
let mut cargo = self.bare_cargo(compiler, mode, target, cmd);
let out_dir = self.stage_out(compiler, mode);

let mut hostflags = HostFlags::default();

// Codegen backends are not yet tracked by -Zbinary-dep-depinfo,
// so we need to explicitly clear out if they've been updated.
for backend in self.codegen_backends(compiler) {
Expand Down Expand Up @@ -1652,10 +1654,10 @@ impl<'a> Builder<'a> {
}

if let Some(host_linker) = self.linker(compiler.host) {
cargo.env("RUSTC_HOST_LINKER", host_linker);
hostflags.flag(format!("-Clinker={}", host_linker.display()));
}
if self.is_fuse_ld_lld(compiler.host) {
cargo.env("RUSTC_HOST_FUSE_LD_LLD", "1");
hostflags.flag("-Clink-args=-fuse-ld=lld");
}

if let Some(target_linker) = self.linker(target) {
Expand Down Expand Up @@ -1739,7 +1741,8 @@ impl<'a> Builder<'a> {
}

if let Some(x) = self.crt_static(compiler.host) {
cargo.env("RUSTC_HOST_CRT_STATIC", x.to_string());
let sign = if x { "+" } else { "-" };
hostflags.flag(format!("-Ctarget-feature={sign}crt-static"));
}

if let Some(map_to) = self.build.debuginfo_map_to(GitRepo::Rustc) {
Expand Down Expand Up @@ -2051,7 +2054,7 @@ impl<'a> Builder<'a> {
cargo.env("RUSTFLAGS", &rustc_args.join(" "));
}

Cargo { command: cargo, rustflags, rustdocflags, allow_features }
Cargo { command: cargo, rustflags, rustdocflags, hostflags, allow_features }
}

/// Ensure that a given step is built, returning its output. This will
Expand Down Expand Up @@ -2229,11 +2232,36 @@ impl Rustflags {
}
}

/// Flags that are passed to the `rustc` shim binary.
/// These flags will only be applied when compiling host code, i.e. when
/// `--target` is unset.
#[derive(Debug, Default)]
pub struct HostFlags {
rustc: Vec<String>,
}

impl HostFlags {
const SEPARATOR: &'static str = " ";

/// Adds a host rustc flag.
fn flag<S: Into<String>>(&mut self, flag: S) {
let value = flag.into().trim().to_string();
assert!(!value.contains(Self::SEPARATOR));
self.rustc.push(value);
}

/// Encodes all the flags into a single string.
fn encode(self) -> String {
self.rustc.join(Self::SEPARATOR)
}
}

#[derive(Debug)]
pub struct Cargo {
command: Command,
rustflags: Rustflags,
rustdocflags: Rustflags,
hostflags: HostFlags,
allow_features: String,
}

Expand Down Expand Up @@ -2305,6 +2333,11 @@ impl From<Cargo> for Command {
cargo.command.env("RUSTDOCFLAGS", rustdocflags);
}

let encoded_hostflags = cargo.hostflags.encode();
if !encoded_hostflags.is_empty() {
cargo.command.env("RUSTC_HOST_FLAGS", encoded_hostflags);
}

if !cargo.allow_features.is_empty() {
cargo.command.env("RUSTC_ALLOW_FEATURES", cargo.allow_features);
}
Expand Down

0 comments on commit eddbd7c

Please sign in to comment.