Skip to content
Merged
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
60 changes: 35 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 @@ -394,6 +403,28 @@ impl From<Cargo> for BootstrapCommand {
cargo.args.insert(0, "--release".into());
}

// Propagate the envs here at the very end to make sure they override any previously set flags.
cargo.rustflags.propagate_rustflag_envs(cargo.build_compiler_stage);
cargo.rustdocflags.propagate_rustflag_envs(cargo.build_compiler_stage);

cargo.rustdocflags.propagate_cargo_env("RUSTDOCFLAGS");

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

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

cargo.command.args(cargo.args);

let rustflags = &cargo.rustflags.0;
Expand Down Expand Up @@ -601,18 +632,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 +730,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 +1383,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*` (such as `RUSTFLAGS`) env. vars. now have precedence over rustflags set by bootstrap. Before, it was the other way around.",
},
];
Loading