Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
67 changes: 42 additions & 25 deletions src/bootstrap/src/core/builder/cargo.rs
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,7 @@ struct Rustflags(String, TargetSelection);

impl Rustflags {
fn new(target: TargetSelection) -> Rustflags {
let mut ret = Rustflags(String::new(), target);
ret.propagate_cargo_env("RUSTFLAGS");
ret
Rustflags(String::new(), target)
}

/// By default, cargo will pick up on various variables in the environment. However, bootstrap
Expand Down Expand Up @@ -60,6 +58,16 @@ impl Rustflags {
self.0.push_str(arg);
self
}

fn propagate_rustflag_envs(&mut self, build_compiler_stage: u32) {
self.propagate_cargo_env("RUSTFLAGS");
if build_compiler_stage != 0 {
self.env("RUSTFLAGS_NOT_BOOTSTRAP");
} else {
self.env("RUSTFLAGS_BOOTSTRAP");
self.arg("--cfg=bootstrap");
}
}
}

/// Flags that are passed to the `rustc` shim binary. These flags will only be applied when
Expand Down Expand Up @@ -96,6 +104,7 @@ pub struct Cargo {
hostflags: HostFlags,
allow_features: String,
release_build: bool,
build_compiler_stage: u32,
}

impl Cargo {
Expand Down Expand Up @@ -386,6 +395,32 @@ impl Cargo {

self
}

/// Propagate all the `*FLAGS*` env vars to cargo.
/// This method should only be called once and after all other flags have been added.
/// We want to propagate the envs at the end to make sure they override any previously set flags.
fn propagate_flag_envs(&mut self) {
self.rustflags.propagate_rustflag_envs(self.build_compiler_stage);
self.rustdocflags.propagate_rustflag_envs(self.build_compiler_stage);

self.rustdocflags.propagate_cargo_env("RUSTDOCFLAGS");

if self.build_compiler_stage == 0 {
self.rustdocflags.env("RUSTDOCFLAGS_BOOTSTRAP");
if let Ok(s) = env::var("CARGOFLAGS_BOOTSTRAP") {
self.args(s.split_whitespace());
}
} else {
self.rustdocflags.env("RUSTDOCFLAGS_NOT_BOOTSTRAP");
if let Ok(s) = env::var("CARGOFLAGS_NOT_BOOTSTRAP") {
self.args(s.split_whitespace());
}
}

if let Ok(s) = env::var("CARGOFLAGS") {
self.args(s.split_whitespace());
}
}
}

impl From<Cargo> for BootstrapCommand {
Expand All @@ -394,6 +429,9 @@ impl From<Cargo> for BootstrapCommand {
cargo.args.insert(0, "--release".into());
}

// don't forget to actually propagate flags from env vars
cargo.propagate_flag_envs();

cargo.command.args(cargo.args);

let rustflags = &cargo.rustflags.0;
Expand Down Expand Up @@ -601,18 +639,6 @@ impl Builder<'_> {
}

let mut rustflags = Rustflags::new(target);
if build_compiler_stage != 0 {
if let Ok(s) = env::var("CARGOFLAGS_NOT_BOOTSTRAP") {
cargo.args(s.split_whitespace());
}
rustflags.env("RUSTFLAGS_NOT_BOOTSTRAP");
} else {
if let Ok(s) = env::var("CARGOFLAGS_BOOTSTRAP") {
cargo.args(s.split_whitespace());
}
rustflags.env("RUSTFLAGS_BOOTSTRAP");
rustflags.arg("--cfg=bootstrap");
}

if cmd_kind == Kind::Clippy {
// clippy overwrites sysroot if we pass it to cargo.
Expand Down Expand Up @@ -711,16 +737,6 @@ impl Builder<'_> {
// but this breaks CI. At the very least, stage0 `rustdoc` needs `--cfg bootstrap`. See
// #71458.
let mut rustdocflags = rustflags.clone();
rustdocflags.propagate_cargo_env("RUSTDOCFLAGS");
if build_compiler_stage == 0 {
rustdocflags.env("RUSTDOCFLAGS_BOOTSTRAP");
} else {
rustdocflags.env("RUSTDOCFLAGS_NOT_BOOTSTRAP");
}

if let Ok(s) = env::var("CARGOFLAGS") {
cargo.args(s.split_whitespace());
}

match mode {
Mode::Std | Mode::ToolBootstrap | Mode::ToolStd | Mode::ToolTarget => {}
Expand Down Expand Up @@ -1374,6 +1390,7 @@ impl Builder<'_> {
hostflags,
allow_features,
release_build,
build_compiler_stage,
}
}
}
Expand Down
5 changes: 5 additions & 0 deletions src/bootstrap/src/utils/change_tracker.rs
Original file line number Diff line number Diff line change
Expand Up @@ -581,4 +581,9 @@ pub const CONFIG_CHANGE_HISTORY: &[ChangeInfo] = &[
severity: ChangeSeverity::Info,
summary: "The `build.python` option is now respected on macOS (previously ignored and forced to be /usr/bin/python3).",
},
ChangeInfo {
change_id: 148911,
severity: ChangeSeverity::Warning,
summary: "Flags from `*FLAGS*` env vars now have precedence over bootstrap own flags and not the other way around.",
},
];
Loading