mirror of
https://github.com/rust-lang/cargo.git
synced 2025-09-28 11:20:36 +00:00
fix(cargo-rustc): give trailing flags higher precedence
Previously `cargo rustc -- <flags>` got a lower precedence than some of the flags set by cargo internal. This is a bit unintuitive as Cargo generally treats user-provided CLI flags with the highest priority. This commit changes `cargo rustc -- <flags>` to a higher precedence: higher than most of flags set by Cargo, and only lower than `build.rustflags` family. Unsure if this affects people's workflow, so this behavior is only enabled on nightly for collectin feedback. A environment variable `__CARGO_RUSTC_ORIG_ARGS_PRIO=1` is provided for users to opt-out. If everything goes well, the nightly gate will be removed after a few of releases. See discussion on https://rust-lang.zulipchat.com/#narrow/stream/246057-t-cargo/topic/rustflags.20precendence.20of.20.60cargo.20rustc.60
This commit is contained in:
parent
7ded268948
commit
35bb3dee7e
@ -694,6 +694,11 @@ fn prepare_rustc(build_runner: &BuildRunner<'_, '_>, unit: &Unit) -> CargoResult
|
||||
base.inherit_jobserver(&build_runner.jobserver);
|
||||
build_deps_args(&mut base, build_runner, unit)?;
|
||||
add_cap_lints(build_runner.bcx, unit, &mut base);
|
||||
if cargo_rustc_higher_args_precedence(build_runner) {
|
||||
if let Some(args) = build_runner.bcx.extra_args_for(unit) {
|
||||
base.args(args);
|
||||
}
|
||||
}
|
||||
base.args(&unit.rustflags);
|
||||
if build_runner.bcx.gctx.cli_unstable().binary_dep_depinfo {
|
||||
base.arg("-Z").arg("binary-dep-depinfo");
|
||||
@ -753,8 +758,11 @@ fn prepare_rustdoc(build_runner: &BuildRunner<'_, '_>, unit: &Unit) -> CargoResu
|
||||
}
|
||||
|
||||
rustdoc.args(unit.pkg.manifest().lint_rustflags());
|
||||
if let Some(args) = build_runner.bcx.extra_args_for(unit) {
|
||||
rustdoc.args(args);
|
||||
|
||||
if !cargo_rustc_higher_args_precedence(build_runner) {
|
||||
if let Some(args) = build_runner.bcx.extra_args_for(unit) {
|
||||
rustdoc.args(args);
|
||||
}
|
||||
}
|
||||
|
||||
let metadata = build_runner.metadata_for_doc_units[unit];
|
||||
@ -795,6 +803,11 @@ fn prepare_rustdoc(build_runner: &BuildRunner<'_, '_>, unit: &Unit) -> CargoResu
|
||||
|
||||
rustdoc::add_output_format(build_runner, unit, &mut rustdoc)?;
|
||||
|
||||
if cargo_rustc_higher_args_precedence(build_runner) {
|
||||
if let Some(args) = build_runner.bcx.extra_args_for(unit) {
|
||||
rustdoc.args(args);
|
||||
}
|
||||
}
|
||||
rustdoc.args(&unit.rustdocflags);
|
||||
|
||||
if !crate_version_flag_already_present(&rustdoc) {
|
||||
@ -1097,8 +1110,10 @@ fn build_base_args(
|
||||
|
||||
cmd.args(unit.pkg.manifest().lint_rustflags());
|
||||
cmd.args(&profile_rustflags);
|
||||
if let Some(args) = build_runner.bcx.extra_args_for(unit) {
|
||||
cmd.args(args);
|
||||
if !cargo_rustc_higher_args_precedence(build_runner) {
|
||||
if let Some(args) = build_runner.bcx.extra_args_for(unit) {
|
||||
cmd.args(args);
|
||||
}
|
||||
}
|
||||
|
||||
// `-C overflow-checks` is implied by the setting of `-C debug-assertions`,
|
||||
@ -1969,3 +1984,19 @@ fn scrape_output_path(build_runner: &BuildRunner<'_, '_>, unit: &Unit) -> CargoR
|
||||
.outputs(unit)
|
||||
.map(|outputs| outputs[0].path.clone())
|
||||
}
|
||||
|
||||
/// Provides a way to change the precedence of `cargo rustc -- <flags>`.
|
||||
///
|
||||
/// This is intended to be a short-live function.
|
||||
///
|
||||
/// See <https://github.com/rust-lang/cargo/issues/14346>
|
||||
fn cargo_rustc_higher_args_precedence(build_runner: &BuildRunner<'_, '_>) -> bool {
|
||||
build_runner.bcx.gctx.nightly_features_allowed
|
||||
&& build_runner
|
||||
.bcx
|
||||
.gctx
|
||||
.get_env("__CARGO_RUSTC_ORIG_ARGS_PRIO")
|
||||
.ok()
|
||||
.as_deref()
|
||||
!= Some("1")
|
||||
}
|
||||
|
@ -819,14 +819,13 @@ fn precedence() {
|
||||
|
||||
p.cargo("rustc --release -v -- --cfg cargo_rustc -C strip=symbols")
|
||||
.env("RUSTFLAGS", "--cfg from_rustflags")
|
||||
.with_stderr_data(
|
||||
str![[r#"
|
||||
.masquerade_as_nightly_cargo(&["cargo-rustc-precedence"])
|
||||
.with_stderr_data(str![[r#"
|
||||
[COMPILING] foo v0.0.0 ([ROOT]/foo)
|
||||
[RUNNING] `rustc [..]--cfg cargo_rustc -C strip=symbols [..]-C strip=debuginfo [..]--cfg from_rustflags`
|
||||
[RUNNING] `rustc [..]-C strip=debuginfo [..]--cfg cargo_rustc -C strip=symbols --cfg from_rustflags`
|
||||
[FINISHED] `release` profile [optimized] target(s) in [ELAPSED]s
|
||||
|
||||
"#]]
|
||||
)
|
||||
"#]])
|
||||
.run();
|
||||
|
||||
// Ensure the short-live env var to work
|
||||
|
Loading…
x
Reference in New Issue
Block a user