From 5be8044e67e0487176faa6493126398422444460 Mon Sep 17 00:00:00 2001 From: Greg Morenz Date: Fri, 10 May 2024 21:50:29 -0400 Subject: [PATCH] Pass rustdocflags like rustflags --- src/cargo/core/compiler/build_context/mod.rs | 13 ------------- .../core/compiler/build_context/target_info.rs | 5 +++-- src/cargo/core/compiler/build_runner/mod.rs | 2 +- src/cargo/core/compiler/fingerprint/mod.rs | 2 +- src/cargo/core/compiler/mod.rs | 2 +- src/cargo/core/compiler/standard_lib.rs | 1 + src/cargo/core/compiler/unit.rs | 13 +++++++++++++ src/cargo/core/compiler/unit_dependencies.rs | 1 + src/cargo/ops/cargo_compile/mod.rs | 3 +++ src/cargo/ops/cargo_compile/unit_generator.rs | 1 + tests/testsuite/rustflags.rs | 7 ++++++- 11 files changed, 31 insertions(+), 19 deletions(-) diff --git a/src/cargo/core/compiler/build_context/mod.rs b/src/cargo/core/compiler/build_context/mod.rs index 472559ce350..1bc25d12c19 100644 --- a/src/cargo/core/compiler/build_context/mod.rs +++ b/src/cargo/core/compiler/build_context/mod.rs @@ -134,19 +134,6 @@ impl<'a, 'gctx> BuildContext<'a, 'gctx> { self.build_config.jobs } - /// Extra compiler flags to pass to `rustdoc` for a given unit. - /// - /// Although it depends on the caller, in the current Cargo implementation, - /// these flags take precedence over those from [`BuildContext::extra_args_for`]. - /// - /// As of now, these flags come from environment variables and configurations. - /// See [`TargetInfo.rustdocflags`] for more on how Cargo collects them. - /// - /// [`TargetInfo.rustdocflags`]: TargetInfo::rustdocflags - pub fn rustdocflags_args(&self, unit: &Unit) -> &[String] { - &self.target_data.info(unit.kind).rustdocflags - } - /// Extra compiler args for either `rustc` or `rustdoc`. /// /// As of now, these flags come from the trailing args of either diff --git a/src/cargo/core/compiler/build_context/target_info.rs b/src/cargo/core/compiler/build_context/target_info.rs index da32c2f8914..6f4ab722cde 100644 --- a/src/cargo/core/compiler/build_context/target_info.rs +++ b/src/cargo/core/compiler/build_context/target_info.rs @@ -55,7 +55,7 @@ pub struct TargetInfo { /// Extra flags to pass to `rustc`, see [`extra_args`]. pub rustflags: Arc<[String]>, /// Extra flags to pass to `rustdoc`, see [`extra_args`]. - pub rustdocflags: Vec, + pub rustdocflags: Arc<[String]>, /// Whether or not rustc (stably) supports the `--check-cfg` flag. /// /// Can be removed once the minimum supported rustc version of Cargo is @@ -321,7 +321,8 @@ impl TargetInfo { Some(&cfg), kind, Flags::Rustdoc, - )?, + )? + .into(), cfg, support_split_debuginfo, support_check_cfg, diff --git a/src/cargo/core/compiler/build_runner/mod.rs b/src/cargo/core/compiler/build_runner/mod.rs index ed4d6fcdc35..47c8219e450 100644 --- a/src/cargo/core/compiler/build_runner/mod.rs +++ b/src/cargo/core/compiler/build_runner/mod.rs @@ -269,7 +269,7 @@ impl<'a, 'gctx> BuildRunner<'a, 'gctx> { } } } - args.extend(self.bcx.rustdocflags_args(unit).iter().map(Into::into)); + args.extend(unit.rustdocflags.iter().map(Into::into)); use super::MessageFormat; let format = match self.bcx.build_config.message_format { diff --git a/src/cargo/core/compiler/fingerprint/mod.rs b/src/cargo/core/compiler/fingerprint/mod.rs index ceee710d4c6..6ffebd753cd 100644 --- a/src/cargo/core/compiler/fingerprint/mod.rs +++ b/src/cargo/core/compiler/fingerprint/mod.rs @@ -1415,7 +1415,7 @@ fn calculate_normal( // hashed to take up less space on disk as we just need to know when things // change. let extra_flags = if unit.mode.is_doc() || unit.mode.is_doc_scrape() { - build_runner.bcx.rustdocflags_args(unit) + &unit.rustdocflags } else { &unit.rustflags } diff --git a/src/cargo/core/compiler/mod.rs b/src/cargo/core/compiler/mod.rs index 52d70f97181..70dfb3085d3 100644 --- a/src/cargo/core/compiler/mod.rs +++ b/src/cargo/core/compiler/mod.rs @@ -780,7 +780,7 @@ fn prepare_rustdoc(build_runner: &BuildRunner<'_, '_>, unit: &Unit) -> CargoResu rustdoc::add_output_format(build_runner, unit, &mut rustdoc)?; - rustdoc.args(bcx.rustdocflags_args(unit)); + rustdoc.args(&unit.rustdocflags); if !crate_version_flag_already_present(&rustdoc) { append_crate_version_flag(unit, &mut rustdoc); diff --git a/src/cargo/core/compiler/standard_lib.rs b/src/cargo/core/compiler/standard_lib.rs index c3b0d363330..8f095b73ef6 100644 --- a/src/cargo/core/compiler/standard_lib.rs +++ b/src/cargo/core/compiler/standard_lib.rs @@ -218,6 +218,7 @@ pub fn generate_std_roots( mode, features.clone(), target_data.info(*kind).rustflags.clone(), + target_data.info(*kind).rustdocflags.clone(), /*is_std*/ true, /*dep_hash*/ 0, IsArtifact::No, diff --git a/src/cargo/core/compiler/unit.rs b/src/cargo/core/compiler/unit.rs index db779cd9c03..420e059e9d6 100644 --- a/src/cargo/core/compiler/unit.rs +++ b/src/cargo/core/compiler/unit.rs @@ -71,6 +71,17 @@ pub struct UnitInner { /// [`BuildContext::extra_args_for`]: crate::core::compiler::build_context::BuildContext::extra_args_for /// [`TargetInfo.rustflags`]: crate::core::compiler::build_context::TargetInfo::rustflags pub rustflags: Arc<[String]>, + /// Extra compiler flags to pass to `rustdoc` for a given unit. + /// + /// Although it depends on the caller, in the current Cargo implementation, + /// these flags take precedence over those from [`BuildContext::extra_args_for`]. + /// + /// As of now, these flags come from environment variables and configurations. + /// See [`TargetInfo.rustdocflags`] for more on how Cargo collects them. + /// + /// [`BuildContext::extra_args_for`]: crate::core::compiler::build_context::BuildContext::extra_args_for + /// [`TargetInfo.rustdocflags`]: crate::core::compiler::build_context::TargetInfo::rustdocflags + pub rustdocflags: Arc<[String]>, // if `true`, the dependency is an artifact dependency, requiring special handling when // calculating output directories, linkage and environment variables provided to builds. pub artifact: IsArtifact, @@ -212,6 +223,7 @@ impl UnitInterner { mode: CompileMode, features: Vec, rustflags: Arc<[String]>, + rustdocflags: Arc<[String]>, is_std: bool, dep_hash: u64, artifact: IsArtifact, @@ -246,6 +258,7 @@ impl UnitInterner { mode, features, rustflags, + rustdocflags, is_std, dep_hash, artifact, diff --git a/src/cargo/core/compiler/unit_dependencies.rs b/src/cargo/core/compiler/unit_dependencies.rs index 96e3854f2b8..5ecd5890940 100644 --- a/src/cargo/core/compiler/unit_dependencies.rs +++ b/src/cargo/core/compiler/unit_dependencies.rs @@ -860,6 +860,7 @@ fn new_unit_dep_with_profile( mode, features, state.target_data.info(kind).rustflags.clone(), + state.target_data.info(kind).rustdocflags.clone(), state.is_std, /*dep_hash*/ 0, artifact.map_or(IsArtifact::No, |_| IsArtifact::Yes), diff --git a/src/cargo/ops/cargo_compile/mod.rs b/src/cargo/ops/cargo_compile/mod.rs index 860aab9ccc8..ca17eefe021 100644 --- a/src/cargo/ops/cargo_compile/mod.rs +++ b/src/cargo/ops/cargo_compile/mod.rs @@ -697,6 +697,7 @@ fn traverse_and_share( unit.mode, unit.features.clone(), unit.rustflags.clone(), + unit.rustdocflags.clone(), unit.is_std, unit.dep_hash, unit.artifact, @@ -723,6 +724,7 @@ fn traverse_and_share( unit.mode, unit.features.clone(), unit.rustflags.clone(), + unit.rustdocflags.clone(), unit.is_std, new_dep_hash, unit.artifact, @@ -885,6 +887,7 @@ fn override_rustc_crate_types( unit.mode, unit.features.clone(), unit.rustflags.clone(), + unit.rustdocflags.clone(), unit.is_std, unit.dep_hash, unit.artifact, diff --git a/src/cargo/ops/cargo_compile/unit_generator.rs b/src/cargo/ops/cargo_compile/unit_generator.rs index 16a6a524d67..09b70e4fe2d 100644 --- a/src/cargo/ops/cargo_compile/unit_generator.rs +++ b/src/cargo/ops/cargo_compile/unit_generator.rs @@ -172,6 +172,7 @@ impl<'a> UnitGenerator<'a, '_> { target_mode, features.clone(), self.target_data.info(kind).rustflags.clone(), + self.target_data.info(kind).rustdocflags.clone(), /*is_std*/ false, /*dep_hash*/ 0, IsArtifact::No, diff --git a/tests/testsuite/rustflags.rs b/tests/testsuite/rustflags.rs index f2105564f52..9ecc2995729 100644 --- a/tests/testsuite/rustflags.rs +++ b/tests/testsuite/rustflags.rs @@ -1632,6 +1632,11 @@ fn target_applies_to_host_rustdocflags_works() { .arg("-Ztarget-applies-to-host") .env("CARGO_TARGET_APPLIES_TO_HOST", "false") .env("RUSTDOCFLAGS", r#"--cfg feature="flag""#) - .with_status(0) + .with_status(101) + .with_stderr_data( + "[DOCUMENTING] foo v0.0.1 ([ROOT]/foo) +[ERROR] flag passed +...", + ) .run(); }