From a5669e8fa3b648872fca3e6ef519acdd306a3e2d Mon Sep 17 00:00:00 2001 From: Urgau Date: Sat, 9 Mar 2024 23:48:48 +0100 Subject: [PATCH 1/3] Stabilize -Zcheck-cfg as always enabled-by-default --- .../compiler/build_context/target_info.rs | 13 + src/cargo/core/compiler/build_runner/mod.rs | 9 +- src/cargo/core/compiler/custom_build.rs | 20 +- src/cargo/core/compiler/fingerprint/mod.rs | 9 +- src/cargo/core/compiler/mod.rs | 18 +- src/cargo/core/features.rs | 8 +- src/cargo/util/context/target.rs | 12 +- tests/testsuite/check_cfg.rs | 245 +++--------------- 8 files changed, 83 insertions(+), 251 deletions(-) diff --git a/src/cargo/core/compiler/build_context/target_info.rs b/src/cargo/core/compiler/build_context/target_info.rs index f80f45c8f58..e9358bdf93d 100644 --- a/src/cargo/core/compiler/build_context/target_info.rs +++ b/src/cargo/core/compiler/build_context/target_info.rs @@ -55,6 +55,11 @@ pub struct TargetInfo { pub rustflags: Vec, /// Extra flags to pass to `rustdoc`, see [`extra_args`]. pub rustdocflags: Vec, + /// Whether or not rustc (stably) supports the `--check-cfg` flag. + /// + /// Can be removed once the minimum supported rustc version of Cargo is + /// at minimum 1.80.0. + pub support_check_cfg: bool, } /// Kind of each file generated by a Unit, part of `FileType`. @@ -199,6 +204,13 @@ impl TargetInfo { process.arg("--crate-type").arg(crate_type.as_str()); } + let support_check_cfg = rustc + .cached_output( + process.clone().arg("--check-cfg").arg("cfg()"), + extra_fingerprint, + ) + .is_ok(); + process.arg("--print=sysroot"); process.arg("--print=split-debuginfo"); process.arg("--print=crate-name"); // `___` as a delimiter. @@ -310,6 +322,7 @@ impl TargetInfo { )?, 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 ac99b734c8d..7dce02c2fb8 100644 --- a/src/cargo/core/compiler/build_runner/mod.rs +++ b/src/cargo/core/compiler/build_runner/mod.rs @@ -256,12 +256,9 @@ impl<'a, 'gctx> BuildRunner<'a, 'gctx> { args.push(cfg.into()); } - if !output.check_cfgs.is_empty() { - args.push("-Zunstable-options".into()); - for check_cfg in &output.check_cfgs { - args.push("--check-cfg".into()); - args.push(check_cfg.into()); - } + for check_cfg in &output.check_cfgs { + args.push("--check-cfg".into()); + args.push(check_cfg.into()); } for (lt, arg) in &output.linker_args { diff --git a/src/cargo/core/compiler/custom_build.rs b/src/cargo/core/compiler/custom_build.rs index 829177f5fbb..0e1ca88ea6d 100644 --- a/src/cargo/core/compiler/custom_build.rs +++ b/src/cargo/core/compiler/custom_build.rs @@ -408,7 +408,11 @@ fn build_work(build_runner: &mut BuildRunner<'_, '_>, unit: &Unit) -> CargoResul paths::create_dir_all(&script_out_dir)?; let nightly_features_allowed = build_runner.bcx.gctx.nightly_features_allowed; - let extra_check_cfg = build_runner.bcx.gctx.cli_unstable().check_cfg; + let extra_check_cfg = build_runner + .bcx + .target_data + .info(unit.kind) + .support_check_cfg; let targets: Vec = unit.pkg.targets().to_vec(); let msrv = unit.pkg.rust_version().cloned(); // Need a separate copy for the fresh closure. @@ -665,9 +669,7 @@ impl BuildOutput { /// /// * `pkg_descr` --- for error messages /// * `library_name` --- for determining if `RUSTC_BOOTSTRAP` should be allowed - /// * `extra_check_cfg` --- for unstable feature [`-Zcheck-cfg`] - /// - /// [`-Zcheck-cfg`]: https://doc.rust-lang.org/cargo/reference/unstable.html#check-cfg + /// * `extra_check_cfg` --- for `--check-cfg` (if supported) pub fn parse( input: &[u8], // Takes String instead of InternedString so passing `unit.pkg.name()` will give a compile error. @@ -910,8 +912,8 @@ impl BuildOutput { if extra_check_cfg { check_cfgs.push(value.to_string()); } else { - // silently ignoring the instruction to try to - // minimise MSRV annoyance when stabilizing -Zcheck-cfg + // silently ignoring the instruction because the rustc version + // we are using does not support --check-cfg stably } } "rustc-env" => { @@ -1254,7 +1256,11 @@ fn prev_build_output( &unit.pkg.to_string(), &prev_script_out_dir, &script_out_dir, - build_runner.bcx.gctx.cli_unstable().check_cfg, + build_runner + .bcx + .target_data + .info(unit.kind) + .support_check_cfg, build_runner.bcx.gctx.nightly_features_allowed, unit.pkg.targets(), &unit.pkg.rust_version().cloned(), diff --git a/src/cargo/core/compiler/fingerprint/mod.rs b/src/cargo/core/compiler/fingerprint/mod.rs index f3389b49f58..f22d4a9ed97 100644 --- a/src/cargo/core/compiler/fingerprint/mod.rs +++ b/src/cargo/core/compiler/fingerprint/mod.rs @@ -1454,14 +1454,7 @@ fn calculate_normal( // actually affect the output artifact so there's no need to hash it. path: util::hash_u64(path_args(build_runner.bcx.ws, unit).0), features: format!("{:?}", unit.features), - // Note we curently only populate `declared_features` when `-Zcheck-cfg` - // is passed since it's the only user-facing toggle that will make this - // fingerprint relevant. - declared_features: if build_runner.bcx.gctx.cli_unstable().check_cfg { - format!("{declared_features:?}") - } else { - "".to_string() - }, + declared_features: format!("{declared_features:?}"), deps, local: Mutex::new(local), memoized_hash: Mutex::new(None), diff --git a/src/cargo/core/compiler/mod.rs b/src/cargo/core/compiler/mod.rs index 3b0510ac94f..f30368e0fbe 100644 --- a/src/cargo/core/compiler/mod.rs +++ b/src/cargo/core/compiler/mod.rs @@ -1310,11 +1310,13 @@ fn trim_paths_args( } /// Generates the `--check-cfg` arguments for the `unit`. -/// See unstable feature [`check-cfg`]. -/// -/// [`check-cfg`]: https://doc.rust-lang.org/nightly/cargo/reference/unstable.html#check-cfg fn check_cfg_args(build_runner: &BuildRunner<'_, '_>, unit: &Unit) -> Vec { - if build_runner.bcx.gctx.cli_unstable().check_cfg { + if build_runner + .bcx + .target_data + .info(unit.kind) + .support_check_cfg + { // The routine below generates the --check-cfg arguments. Our goals here are to // enable the checking of conditionals and pass the list of declared features. // @@ -1352,7 +1354,6 @@ fn check_cfg_args(build_runner: &BuildRunner<'_, '_>, unit: &Unit) -> Vec> = ("Enable Cargo to compile the standard library itself as part of a crate graph compilation"), build_std_features: Option> = ("Configure features enabled for the standard library itself when building the standard library"), cargo_lints: bool = ("Enable the `[lints.cargo]` table"), - check_cfg: bool = ("Enable compile-time checking of `cfg` names/values/features"), codegen_backend: bool = ("Enable the `codegen-backend` option in profiles in .cargo/config.toml file"), config_include: bool = ("Enable the `include` key in config files"), direct_minimal_versions: bool = ("Resolve minimal dependency versions instead of maximum (direct dependencies only)"), @@ -855,6 +854,9 @@ const STABILIZED_REGISTRY_AUTH: &str = const STABILIZED_LINTS: &str = "The `[lints]` table is now always available."; +const STABILIZED_CHECK_CFG: &str = + "Compile-time checking of conditional (a.k.a. `-Zcheck-cfg`) is now always enabled."; + fn deserialize_build_std<'de, D>(deserializer: D) -> Result>, D::Error> where D: serde::Deserializer<'de>, @@ -1109,6 +1111,7 @@ impl CliUnstable { "credential-process" => stabilized_warn(k, "1.74", STABILIZED_CREDENTIAL_PROCESS), "lints" => stabilized_warn(k, "1.74", STABILIZED_LINTS), "registry-auth" => stabilized_warn(k, "1.74", STABILIZED_REGISTRY_AUTH), + "check-cfg" => stabilized_warn(k, "1.80", STABILIZED_CHECK_CFG), // Unstable features // Sorted alphabetically: @@ -1122,9 +1125,6 @@ impl CliUnstable { } "build-std-features" => self.build_std_features = Some(parse_features(v)), "cargo-lints" => self.cargo_lints = parse_empty(k, v)?, - "check-cfg" => { - self.check_cfg = parse_empty(k, v)?; - } "codegen-backend" => self.codegen_backend = parse_empty(k, v)?, "config-include" => self.config_include = parse_empty(k, v)?, "direct-minimal-versions" => self.direct_minimal_versions = parse_empty(k, v)?, diff --git a/src/cargo/util/context/target.rs b/src/cargo/util/context/target.rs index dab4af2c72f..6d7e7fde9b9 100644 --- a/src/cargo/util/context/target.rs +++ b/src/cargo/util/context/target.rs @@ -120,7 +120,7 @@ fn load_config_table(gctx: &GlobalContext, prefix: &str) -> CargoResult parse_links_overrides(&target_key, links.val, gctx)?, + Some(links) => parse_links_overrides(&target_key, links.val)?, None => BTreeMap::new(), }; Ok(TargetConfig { @@ -135,7 +135,6 @@ fn load_config_table(gctx: &GlobalContext, prefix: &str) -> CargoResult, - gctx: &GlobalContext, ) -> CargoResult> { let mut links_overrides = BTreeMap::new(); @@ -204,13 +203,8 @@ fn parse_links_overrides( output.cfgs.extend(list.iter().map(|v| v.0.clone())); } "rustc-check-cfg" => { - if gctx.cli_unstable().check_cfg { - let list = value.list(key)?; - output.check_cfgs.extend(list.iter().map(|v| v.0.clone())); - } else { - // silently ignoring the instruction to try to - // minimise MSRV annoyance when stabilizing -Zcheck-cfg - } + let list = value.list(key)?; + output.check_cfgs.extend(list.iter().map(|v| v.0.clone())); } "rustc-env" => { for (name, val) in value.table(key)?.0 { diff --git a/tests/testsuite/check_cfg.rs b/tests/testsuite/check_cfg.rs index 004fc482ad8..dff0d538a51 100644 --- a/tests/testsuite/check_cfg.rs +++ b/tests/testsuite/check_cfg.rs @@ -1,4 +1,4 @@ -//! Tests for -Zcheck-cfg. +//! Tests for Cargo usage of rustc `--check-cfg`. use cargo_test_support::{basic_manifest, project}; @@ -29,7 +29,7 @@ macro_rules! x { }}; } -#[cargo_test(nightly, reason = "--check-cfg is unstable")] +#[cargo_test(>=1.79, reason = "--check-cfg was stabilized in Rust 1.79")] fn features() { let p = project() .file( @@ -48,14 +48,14 @@ fn features() { .file("src/main.rs", "fn main() {}") .build(); - p.cargo("check -v -Zcheck-cfg") - .masquerade_as_nightly_cargo(&["check-cfg"]) + p.cargo("check -v") .with_stderr_contains(x!("rustc" => "cfg" of "feature" with "f_a" "f_b")) .with_stderr_contains(x!("rustc" => "cfg" of "docsrs")) + .with_stderr_does_not_contain("[..]-Zunstable-options[..]") .run(); } -#[cargo_test(nightly, reason = "--check-cfg is unstable")] +#[cargo_test(>=1.79, reason = "--check-cfg was stabilized in Rust 1.79")] fn features_with_deps() { let p = project() .file( @@ -79,14 +79,13 @@ fn features_with_deps() { .file("bar/src/lib.rs", "#[allow(dead_code)] fn bar() {}") .build(); - p.cargo("check -v -Zcheck-cfg") - .masquerade_as_nightly_cargo(&["check-cfg"]) + p.cargo("check -v") .with_stderr_contains(x!("rustc" => "cfg" of "feature" with "f_a" "f_b")) .with_stderr_contains(x!("rustc" => "cfg" of "docsrs")) .run(); } -#[cargo_test(nightly, reason = "--check-cfg is unstable")] +#[cargo_test(>=1.79, reason = "--check-cfg was stabilized in Rust 1.79")] fn features_with_opt_deps() { let p = project() .file( @@ -111,14 +110,13 @@ fn features_with_opt_deps() { .file("bar/src/lib.rs", "#[allow(dead_code)] fn bar() {}") .build(); - p.cargo("check -v -Zcheck-cfg") - .masquerade_as_nightly_cargo(&["check-cfg"]) + p.cargo("check -v") .with_stderr_contains(x!("rustc" => "cfg" of "feature" with "bar" "default" "f_a" "f_b")) .with_stderr_contains(x!("rustc" => "cfg" of "docsrs")) .run(); } -#[cargo_test(nightly, reason = "--check-cfg is unstable")] +#[cargo_test(>=1.79, reason = "--check-cfg was stabilized in Rust 1.79")] fn features_with_namespaced_features() { let p = project() .file( @@ -142,14 +140,13 @@ fn features_with_namespaced_features() { .file("bar/src/lib.rs", "#[allow(dead_code)] fn bar() {}") .build(); - p.cargo("check -v -Zcheck-cfg") - .masquerade_as_nightly_cargo(&["check-cfg"]) + p.cargo("check -v") .with_stderr_contains(x!("rustc" => "cfg" of "feature" with "f_a" "f_b")) .with_stderr_contains(x!("rustc" => "cfg" of "docsrs")) .run(); } -#[cargo_test(nightly, reason = "--check-cfg is unstable")] +#[cargo_test(>=1.79, reason = "--check-cfg was stabilized in Rust 1.79")] fn features_fingerprint() { let p = project() .file( @@ -168,14 +165,12 @@ fn features_fingerprint() { .file("src/lib.rs", "#[cfg(feature = \"f_b\")] fn entry() {}") .build(); - p.cargo("check -v -Zcheck-cfg") - .masquerade_as_nightly_cargo(&["check-cfg"]) + p.cargo("check -v") .with_stderr_contains(x!("rustc" => "cfg" of "feature" with "f_a" "f_b")) .with_stderr_does_not_contain("[..]unexpected_cfgs[..]") .run(); - p.cargo("check -v -Zcheck-cfg") - .masquerade_as_nightly_cargo(&["check-cfg"]) + p.cargo("check -v") .with_stderr_does_not_contain("[..]rustc[..]") .run(); @@ -194,8 +189,7 @@ fn features_fingerprint() { "#, ); - p.cargo("check -v -Zcheck-cfg") - .masquerade_as_nightly_cargo(&["check-cfg"]) + p.cargo("check -v") .with_stderr_does_not_contain("[..]rustc[..]") .run(); @@ -212,8 +206,7 @@ fn features_fingerprint() { "#, ); - p.cargo("check -v -Zcheck-cfg") - .masquerade_as_nightly_cargo(&["check-cfg"]) + p.cargo("check -v") // we check that the fingerprint is indeed dirty .with_stderr_contains("[..]Dirty[..]the list of declared features changed") // that is cause rustc to be called again with the new check-cfg args @@ -223,21 +216,20 @@ fn features_fingerprint() { .run(); } -#[cargo_test(nightly, reason = "--check-cfg is unstable")] +#[cargo_test(>=1.79, reason = "--check-cfg was stabilized in Rust 1.79")] fn well_known_names_values() { let p = project() .file("Cargo.toml", &basic_manifest("foo", "0.1.0")) .file("src/main.rs", "fn main() {}") .build(); - p.cargo("check -v -Zcheck-cfg") - .masquerade_as_nightly_cargo(&["check-cfg"]) + p.cargo("check -v") .with_stderr_contains(x!("rustc" => "cfg" of "feature" with)) .with_stderr_contains(x!("rustc" => "cfg" of "docsrs")) .run(); } -#[cargo_test(nightly, reason = "--check-cfg is unstable")] +#[cargo_test(>=1.79, reason = "--check-cfg was stabilized in Rust 1.79")] fn features_test() { let p = project() .file( @@ -256,14 +248,13 @@ fn features_test() { .file("src/main.rs", "fn main() {}") .build(); - p.cargo("test -v -Zcheck-cfg") - .masquerade_as_nightly_cargo(&["check-cfg"]) + p.cargo("test -v") .with_stderr_contains(x!("rustc" => "cfg" of "feature" with "f_a" "f_b")) .with_stderr_contains(x!("rustc" => "cfg" of "docsrs")) .run(); } -#[cargo_test(nightly, reason = "--check-cfg is unstable")] +#[cargo_test(>=1.79, reason = "--check-cfg was stabilized in Rust 1.79")] fn features_doctest() { let p = project() .file( @@ -283,38 +274,36 @@ fn features_doctest() { .file("src/lib.rs", "#[allow(dead_code)] fn foo() {}") .build(); - p.cargo("test -v --doc -Zcheck-cfg") - .masquerade_as_nightly_cargo(&["check-cfg"]) + p.cargo("test -v --doc") .with_stderr_contains(x!("rustc" => "cfg" of "feature" with "default" "f_a" "f_b")) .with_stderr_contains(x!("rustdoc" => "cfg" of "feature" with "default" "f_a" "f_b")) .with_stderr_contains(x!("rustc" => "cfg" of "docsrs")) .with_stderr_contains(x!("rustdoc" => "cfg" of "docsrs")) + .with_stderr_does_not_contain("[..]-Zunstable-options[..]") .run(); } -#[cargo_test(nightly, reason = "--check-cfg is unstable")] +#[cargo_test(>=1.79, reason = "--check-cfg was stabilized in Rust 1.79")] fn well_known_names_values_test() { let p = project() .file("Cargo.toml", &basic_manifest("foo", "0.1.0")) .file("src/main.rs", "fn main() {}") .build(); - p.cargo("test -v -Zcheck-cfg") - .masquerade_as_nightly_cargo(&["check-cfg"]) + p.cargo("test -v") .with_stderr_contains(x!("rustc" => "cfg" of "feature" with)) .with_stderr_contains(x!("rustc" => "cfg" of "docsrs")) .run(); } -#[cargo_test(nightly, reason = "--check-cfg is unstable")] +#[cargo_test(>=1.79, reason = "--check-cfg was stabilized in Rust 1.79")] fn well_known_names_values_doctest() { let p = project() .file("Cargo.toml", &basic_manifest("foo", "0.1.0")) .file("src/lib.rs", "#[allow(dead_code)] fn foo() {}") .build(); - p.cargo("test -v --doc -Zcheck-cfg") - .masquerade_as_nightly_cargo(&["check-cfg"]) + p.cargo("test -v --doc") .with_stderr_contains(x!("rustc" => "cfg" of "feature" with)) .with_stderr_contains(x!("rustdoc" => "cfg" of "feature" with)) .with_stderr_contains(x!("rustc" => "cfg" of "docsrs")) @@ -322,7 +311,7 @@ fn well_known_names_values_doctest() { .run(); } -#[cargo_test(nightly, reason = "--check-cfg is unstable")] +#[cargo_test(>=1.79, reason = "--check-cfg was stabilized in Rust 1.79")] fn features_doc() { let p = project() .file( @@ -342,14 +331,14 @@ fn features_doc() { .file("src/lib.rs", "#[allow(dead_code)] fn foo() {}") .build(); - p.cargo("doc -v -Zcheck-cfg") - .masquerade_as_nightly_cargo(&["check-cfg"]) + p.cargo("doc -v") .with_stderr_contains(x!("rustdoc" => "cfg" of "feature" with "default" "f_a" "f_b")) .with_stderr_contains(x!("rustdoc" => "cfg" of "docsrs")) + .with_stderr_does_not_contain("[..]-Zunstable-options[..]") .run(); } -#[cargo_test(nightly, reason = "--check-cfg is unstable")] +#[cargo_test(>=1.79, reason = "--check-cfg was stabilized in Rust 1.79")] fn build_script_feedback() { let p = project() .file( @@ -370,14 +359,14 @@ fn build_script_feedback() { ) .build(); - p.cargo("check -v -Zcheck-cfg") - .masquerade_as_nightly_cargo(&["check-cfg"]) + p.cargo("check -v") .with_stderr_contains(x!("rustc" => "cfg" of "foo")) .with_stderr_contains(x!("rustc" => "cfg" of "docsrs")) + .with_stderr_does_not_contain("[..]-Zunstable-options[..]") .run(); } -#[cargo_test(nightly, reason = "--check-cfg is unstable")] +#[cargo_test(>=1.79, reason = "--check-cfg was stabilized in Rust 1.79")] fn build_script_doc() { let p = project() .file( @@ -398,7 +387,7 @@ fn build_script_doc() { ) .build(); - p.cargo("doc -v -Zcheck-cfg") + p.cargo("doc -v") .with_stderr_does_not_contain("rustc [..] --check-cfg [..]") .with_stderr_contains(x!("rustdoc" => "cfg" of "foo")) .with_stderr( @@ -412,11 +401,10 @@ fn build_script_doc() { [GENERATED] [CWD]/target/doc/foo/index.html ", ) - .masquerade_as_nightly_cargo(&["check-cfg"]) .run(); } -#[cargo_test(nightly, reason = "--check-cfg is unstable")] +#[cargo_test(>=1.79, reason = "--check-cfg was stabilized in Rust 1.79")] fn build_script_override() { let target = cargo_test_support::rustc_host(); @@ -447,49 +435,14 @@ fn build_script_override() { ) .build(); - p.cargo("check -v -Zcheck-cfg") + p.cargo("check -v") .with_stderr_contains(x!("rustc" => "cfg" of "foo")) .with_stderr_contains(x!("rustc" => "cfg" of "feature" with)) .with_stderr_contains(x!("rustc" => "cfg" of "docsrs")) - .masquerade_as_nightly_cargo(&["check-cfg"]) .run(); } -#[cargo_test] -fn build_script_override_feature_gate() { - let target = cargo_test_support::rustc_host(); - - let p = project() - .file( - "Cargo.toml", - r#" - [package] - name = "foo" - version = "0.1.0" - edition = "2015" - links = "a" - "#, - ) - .file("src/main.rs", "fn main() {}") - .file("build.rs", "fn main() {}") - .file( - ".cargo/config.toml", - &format!( - r#" - [target.{}.a] - rustc-check-cfg = ["cfg(foo)"] - "#, - target - ), - ) - .build(); - - p.cargo("check") - .with_stderr_does_not_contain("warning: [..]rustc-check-cfg[..]") - .run(); -} - -#[cargo_test(nightly, reason = "--check-cfg is unstable")] +#[cargo_test(>=1.79, reason = "--check-cfg was stabilized in Rust 1.79")] fn build_script_test() { let p = project() .file( @@ -535,133 +488,11 @@ fn build_script_test() { .file("tests/test.rs", "#[cfg(foo)] #[test] fn test_bar() {}") .build(); - p.cargo("test -v -Zcheck-cfg") + p.cargo("test -v") .with_stderr_contains(x!("rustc" => "cfg" of "foo")) .with_stderr_contains(x!("rustdoc" => "cfg" of "foo")) .with_stdout_contains("test test_foo ... ok") .with_stdout_contains("test test_bar ... ok") .with_stdout_contains_n("test [..] ... ok", 3) - .masquerade_as_nightly_cargo(&["check-cfg"]) - .run(); -} - -#[cargo_test] -fn build_script_feature_gate() { - let p = project() - .file( - "Cargo.toml", - r#" - [package] - name = "foo" - version = "0.0.1" - edition = "2015" - build = "build.rs" - "#, - ) - .file( - "build.rs", - r#"fn main() { - println!("cargo::rustc-check-cfg=cfg(foo)"); - println!("cargo::rustc-cfg=foo"); - }"#, - ) - .file("src/main.rs", "fn main() {}") - .build(); - - p.cargo("check") - .with_stderr_does_not_contain("warning: [..]rustc-check-cfg[..]") - .with_status(0) - .run(); -} - -#[cargo_test(nightly, reason = "--check-cfg is unstable")] -fn config_valid() { - let p = project() - .file( - "Cargo.toml", - r#" - [package] - name = "foo" - version = "0.1.0" - edition = "2015" - - [features] - f_a = [] - f_b = [] - "#, - ) - .file("src/main.rs", "fn main() {}") - .file( - ".cargo/config.toml", - r#" - [unstable] - check-cfg = true - "#, - ) - .build(); - - p.cargo("check -v") - .masquerade_as_nightly_cargo(&["check-cfg"]) - .with_stderr_contains(x!("rustc" => "cfg" of "feature" with "f_a" "f_b")) - .with_stderr_contains(x!("rustc" => "cfg" of "docsrs")) - .run(); -} - -#[cargo_test(nightly, reason = "--check-cfg is unstable")] -fn config_invalid() { - let p = project() - .file( - "Cargo.toml", - r#" - [package] - name = "foo" - version = "0.1.0" - edition = "2015" - "#, - ) - .file("src/main.rs", "fn main() {}") - .file( - ".cargo/config.toml", - r#" - [unstable] - check-cfg = ["va"] - "#, - ) - .build(); - - p.cargo("check") - .masquerade_as_nightly_cargo(&["check-cfg"]) - .with_stderr_contains("error:[..]`unstable.check-cfg` expected true/false[..]") - .with_status(101) - .run(); -} - -#[cargo_test] -fn config_feature_gate() { - let p = project() - .file( - "Cargo.toml", - r#" - [package] - name = "foo" - version = "0.1.0" - edition = "2015" - - [features] - f_a = [] - "#, - ) - .file("src/main.rs", "fn main() {}") - .file( - ".cargo/config.toml", - r#" - [unstable] - check-cfg = true - "#, - ) - .build(); - - p.cargo("check -v") - .with_stderr_does_not_contain("--check-cfg") .run(); } From 60a5026885d8b61a879d6f0414c30c45f3e88ad5 Mon Sep 17 00:00:00 2001 From: Urgau Date: Sun, 10 Mar 2024 00:00:35 +0100 Subject: [PATCH 2/3] Adjust documentation for newly stabilized -Zcheck-cfg --- .../src/reference/build-script-examples.md | 3 ++ src/doc/src/reference/build-scripts.md | 42 ++++++++++++++++- src/doc/src/reference/unstable.md | 47 ++++--------------- 3 files changed, 52 insertions(+), 40 deletions(-) diff --git a/src/doc/src/reference/build-script-examples.md b/src/doc/src/reference/build-script-examples.md index f9c1d1e9e31..e5bdaa3c19b 100644 --- a/src/doc/src/reference/build-script-examples.md +++ b/src/doc/src/reference/build-script-examples.md @@ -456,6 +456,9 @@ values](https://github.com/sfackler/rust-openssl/blob/dc72a8e2c429e46c275e528b61 ```rust,ignore // (portion of build.rs) +println!("cargo::rustc-check-cfg=cfg(ossl101,ossl102)"); +println!("cargo::rustc-check-cfg=cfg(ossl110,ossl110g,ossl111)"); + if let Ok(version) = env::var("DEP_OPENSSL_VERSION_NUMBER") { let version = u64::from_str_radix(&version, 16).unwrap(); diff --git a/src/doc/src/reference/build-scripts.md b/src/doc/src/reference/build-scripts.md index dc74fea95e3..ee2416817b5 100644 --- a/src/doc/src/reference/build-scripts.md +++ b/src/doc/src/reference/build-scripts.md @@ -130,6 +130,8 @@ one detailed below. compiler. * [`cargo::rustc-cfg=KEY[="VALUE"]`](#rustc-cfg) --- Enables compile-time `cfg` settings. +* [`cargo::rustc-check-cfg=CHECK_CFG`](#rustc-check-cfg) -- Register custom `cfg`s as + expected for compile-time checking of configs. * [`cargo::rustc-env=VAR=VALUE`](#rustc-env) --- Sets an environment variable. * [`cargo::rustc-cdylib-link-arg=FLAG`](#rustc-cdylib-link-arg) --- Passes custom flags to a linker for cdylib crates. @@ -233,7 +235,10 @@ equivalent to using [`rustc-link-lib`](#rustc-link-lib) and The `rustc-cfg` instruction tells Cargo to pass the given value to the [`--cfg` flag][option-cfg] to the compiler. This may be used for compile-time -detection of features to enable [conditional compilation]. +detection of features to enable [conditional compilation]. Custom cfgs +must either be expected using the [`cargo::rustc-check-cfg`](#rustc-check-cfg) +instruction or usage will need to allow the [`unexpected_cfgs`][unexpected-cfgs] +lint to avoid unexpected cfgs warnings. Note that this does *not* affect Cargo's dependency resolution. This cannot be used to enable an optional dependency, or enable other Cargo features. @@ -249,6 +254,41 @@ identifier, the value should be a string. [cargo features]: features.md [conditional compilation]: ../../reference/conditional-compilation.md [option-cfg]: ../../rustc/command-line-arguments.md#option-cfg +[unexpected-cfgs]: ../../rustc/lints/listing/warn-by-default.md#unexpected-cfgs + +### `cargo::rustc-check-cfg=CHECK_CFG` {#rustc-check-cfg} + +Add to the list of expected config names and values that is used when checking +the _reachable_ cfg expressions. + +For details on the syntax of `CHECK_CFG`, see `rustc` [`--check-cfg` flag][option-check-cfg]. +See also the [`unexpected_cfgs`][unexpected-cfgs] lint. + +The instruction can be used like this: + +```rust,no_run +// build.rs +println!("cargo::rustc-check-cfg=cfg(foo, values(\"bar\"))"); +``` + +Note that all possible cfgs should be defined, regardless of which cfgs are +currently enabled. This includes all possible values of a given cfg name. + +It is recommended to group the `cargo::rustc-check-cfg` and +[`cargo::rustc-cfg`][option-cfg] instructions as closely as possible in order to +avoid typos, missing check-cfg, stalled cfgs... + +#### Example of using `cargo::rustc-check-cfg` and `cargo::rustc-cfg` together + +```rust,no_run +// build.rs +println!("cargo::rustc-check-cfg=cfg(foo, values(\"bar\"))"); +if foo_bar_condition { + println!("cargo::rustc-cfg=foo=\"bar\""); +} +``` + +[option-check-cfg]: ../../rustc/command-line-arguments.md#option-check-cfg ### `cargo::rustc-env=VAR=VALUE` {#rustc-env} diff --git a/src/doc/src/reference/unstable.md b/src/doc/src/reference/unstable.md index 472ae88b99f..d1ee3f9f09d 100644 --- a/src/doc/src/reference/unstable.md +++ b/src/doc/src/reference/unstable.md @@ -83,7 +83,6 @@ For the latest nightly, see the [nightly version] of this page. * [build-std-features](#build-std-features) --- Sets features to use with the standard library. * [binary-dep-depinfo](#binary-dep-depinfo) --- Causes the dep-info file to track binary dependencies. * [panic-abort-tests](#panic-abort-tests) --- Allows running tests with the "abort" panic strategy. - * [check-cfg](#check-cfg) --- Compile-time validation of `cfg` expressions. * [host-config](#host-config) --- Allows setting `[target]`-like configuration settings for host build targets. * [target-applies-to-host](#target-applies-to-host) --- Alters whether certain flags will be passed to host build targets. * [gc](#gc) --- Global cache garbage collection. @@ -1154,44 +1153,6 @@ You can use the flag like this: cargo rustdoc -Z unstable-options --output-format json ``` -## check-cfg - -* RFC: [#3013](https://github.com/rust-lang/rfcs/pull/3013) -* Tracking Issue: [#10554](https://github.com/rust-lang/cargo/issues/10554) - -`-Z check-cfg` command line enables compile time checking of Cargo features as well as `rustc` -well known names and values in `#[cfg]`, `cfg!`, `#[link]` and `#[cfg_attr]` with the `rustc` -and `rustdoc` unstable `--check-cfg` command line. - -You can use the flag like this: - -``` -cargo check -Z unstable-options -Z check-cfg -``` - -### `cargo::rustc-check-cfg=CHECK_CFG` - -The `rustc-check-cfg` instruction tells Cargo to pass the given value to the -`--check-cfg` flag to the compiler. This may be used for compile-time -detection of unexpected conditional compilation name and/or values. - -This can only be used in combination with `-Zcheck-cfg` otherwise it is ignored -with a warning. - -If you want to integrate with Cargo features, only use `-Zcheck-cfg` instead of -trying to do it manually with this option. - -You can use the instruction like this: - -```rust,no_run -// build.rs -println!("cargo::rustc-check-cfg=cfg(foo, bar)"); -``` - -``` -cargo check -Z unstable-options -Z check-cfg -``` - ## codegen-backend The `codegen-backend` feature makes it possible to select the codegen backend used by rustc using a profile. @@ -1798,3 +1759,11 @@ The `-Z registry-auth` feature has been stabilized in the 1.74 release with the requirement that a credential-provider is configured. See [Registry Authentication](registry-authentication.md) documentation for details. + +## check-cfg + +The `-Z check-cfg` feature has been stabilized in the 1.80 release by making it the +default behavior. + +See the [build script documentation](build-scripts.md#rustc-check-cfg) for informations +about specifying custom cfgs. From 388a17f23f2a69a7f4c719dbbf64657b6304b8bb Mon Sep 17 00:00:00 2001 From: Urgau Date: Wed, 17 Apr 2024 11:18:14 +0200 Subject: [PATCH 3/3] Update regular tests for always-on check-cfg --- tests/testsuite/build_script.rs | 11 +++- tests/testsuite/cargo/z_help/stdout.term.svg | 60 ++++++++++---------- tests/testsuite/features_namespaced.rs | 1 + tests/testsuite/package_features.rs | 8 +-- tests/testsuite/profiles.rs | 4 +- tests/testsuite/rustc.rs | 4 +- tests/testsuite/rustflags.rs | 1 + tests/testsuite/weak_dep_features.rs | 1 + 8 files changed, 49 insertions(+), 41 deletions(-) diff --git a/tests/testsuite/build_script.rs b/tests/testsuite/build_script.rs index d8fed645aec..18ba76c44dd 100644 --- a/tests/testsuite/build_script.rs +++ b/tests/testsuite/build_script.rs @@ -2609,7 +2609,10 @@ fn cfg_test() { ) .file( "build.rs", - r#"fn main() { println!("cargo::rustc-cfg=foo"); }"#, + r#"fn main() { + println!("cargo::rustc-cfg=foo"); + println!("cargo::rustc-check-cfg=cfg(foo)"); + }"#, ) .file( "src/lib.rs", @@ -2714,6 +2717,9 @@ fn cfg_override_test() { authors = [] build = "build.rs" links = "a" + + [lints.rust] + unexpected_cfgs = "allow" # bc of override, stable/nightly, tests "#, ) .file("build.rs", "") @@ -5590,9 +5596,10 @@ fn build_script_rerun_when_target_rustflags_change() { use std::env; fn main() { + println!("cargo::rustc-check-cfg=cfg(enable)"); if let Ok(rustflags) = env::var("CARGO_ENCODED_RUSTFLAGS") { if !rustflags.is_empty() { - println!("cargo::rustc-cfg=enable") + println!("cargo::rustc-cfg=enable"); } } } diff --git a/tests/testsuite/cargo/z_help/stdout.term.svg b/tests/testsuite/cargo/z_help/stdout.term.svg index cde7a959502..c453ebc0b25 100644 --- a/tests/testsuite/cargo/z_help/stdout.term.svg +++ b/tests/testsuite/cargo/z_help/stdout.term.svg @@ -1,4 +1,4 @@ - +