From 0ccf61096a2489a912b585dcc2fd277facdbc667 Mon Sep 17 00:00:00 2001 From: Weihang Lo Date: Mon, 23 Sep 2024 23:16:39 -0400 Subject: [PATCH] fix(cargo-rustc): give trailing flags higher precedence Previously `cargo rustc -- ` 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 -- ` 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. 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 --- src/cargo/core/compiler/mod.rs | 23 +++++++++++++++++++---- tests/testsuite/rustc.rs | 9 ++++----- 2 files changed, 23 insertions(+), 9 deletions(-) diff --git a/src/cargo/core/compiler/mod.rs b/src/cargo/core/compiler/mod.rs index 8e9e2ac214d5..dce452233d51 100644 --- a/src/cargo/core/compiler/mod.rs +++ b/src/cargo/core/compiler/mod.rs @@ -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 build_runner.bcx.gctx.nightly_features_allowed { + 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 !build_runner.bcx.gctx.nightly_features_allowed { + 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 build_runner.bcx.gctx.nightly_features_allowed { + 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 !build_runner.bcx.gctx.nightly_features_allowed { + 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`, diff --git a/tests/testsuite/rustc.rs b/tests/testsuite/rustc.rs index 6718e43e02e0..57382b518bc4 100644 --- a/tests/testsuite/rustc.rs +++ b/tests/testsuite/rustc.rs @@ -819,13 +819,12 @@ 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(); }