Skip to content

Commit

Permalink
Auto merge of #13571 - Urgau:stabilize-check-cfg, r=weihanglo
Browse files Browse the repository at this point in the history
Stabilize `-Zcheck-cfg` as always enabled

This PR stabilize the `-Zcheck-cfg` option as always enabled.

~~Waiting on rust-lang/rust#82450 (comment) to complete, but is otherwise ready to be reviewed (in particular the documentation changes).~~ (rust-lang/rust#123501)

Fixes #10554
  • Loading branch information
bors committed May 3, 2024
2 parents cf7b3c4 + 388a17f commit 7ebc065
Show file tree
Hide file tree
Showing 19 changed files with 184 additions and 332 deletions.
13 changes: 13 additions & 0 deletions src/cargo/core/compiler/build_context/target_info.rs
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,11 @@ pub struct TargetInfo {
pub rustflags: Vec<String>,
/// Extra flags to pass to `rustdoc`, see [`extra_args`].
pub rustdocflags: Vec<String>,
/// 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`.
Expand Down Expand Up @@ -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.
Expand Down Expand Up @@ -310,6 +322,7 @@ impl TargetInfo {
)?,
cfg,
support_split_debuginfo,
support_check_cfg,
});
}
}
Expand Down
9 changes: 3 additions & 6 deletions src/cargo/core/compiler/build_runner/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
20 changes: 13 additions & 7 deletions src/cargo/core/compiler/custom_build.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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<Target> = unit.pkg.targets().to_vec();
let msrv = unit.pkg.rust_version().cloned();
// Need a separate copy for the fresh closure.
Expand Down Expand Up @@ -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.
Expand Down Expand Up @@ -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" => {
Expand Down Expand Up @@ -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(),
Expand Down
9 changes: 1 addition & 8 deletions src/cargo/core/compiler/fingerprint/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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),
Expand Down
18 changes: 8 additions & 10 deletions src/cargo/core/compiler/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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<OsString> {
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.
//
Expand Down Expand Up @@ -1352,7 +1354,6 @@ fn check_cfg_args(build_runner: &BuildRunner<'_, '_>, unit: &Unit) -> Vec<OsStri
// Cargo, but not all users of rustc (like Rust-for-Linux) use docs.rs.

vec![
OsString::from("-Zunstable-options"),
OsString::from("--check-cfg"),
OsString::from("cfg(docsrs)"),
OsString::from("--check-cfg"),
Expand Down Expand Up @@ -1476,11 +1477,8 @@ fn add_custom_flags(
for cfg in output.cfgs.iter() {
cmd.arg("--cfg").arg(cfg);
}
if !output.check_cfgs.is_empty() {
cmd.arg("-Zunstable-options");
for check_cfg in &output.check_cfgs {
cmd.arg("--check-cfg").arg(check_cfg);
}
for check_cfg in &output.check_cfgs {
cmd.arg("--check-cfg").arg(check_cfg);
}
for (name, value) in output.env.iter() {
cmd.env(name, value);
Expand Down
8 changes: 4 additions & 4 deletions src/cargo/core/features.rs
Original file line number Diff line number Diff line change
Expand Up @@ -758,7 +758,6 @@ unstable_cli_options!(
build_std: Option<Vec<String>> = ("Enable Cargo to compile the standard library itself as part of a crate graph compilation"),
build_std_features: Option<Vec<String>> = ("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)"),
Expand Down Expand Up @@ -860,6 +859,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<Option<Vec<String>>, D::Error>
where
D: serde::Deserializer<'de>,
Expand Down Expand Up @@ -1114,6 +1116,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:
Expand All @@ -1127,9 +1130,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)?,
Expand Down
12 changes: 3 additions & 9 deletions src/cargo/util/context/target.rs
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,7 @@ fn load_config_table(gctx: &GlobalContext, prefix: &str) -> CargoResult<TargetCo
// Links do not support environment variables.
let target_key = ConfigKey::from_str(prefix);
let links_overrides = match gctx.get_table(&target_key)? {
Some(links) => parse_links_overrides(&target_key, links.val, gctx)?,
Some(links) => parse_links_overrides(&target_key, links.val)?,
None => BTreeMap::new(),
};
Ok(TargetConfig {
Expand All @@ -135,7 +135,6 @@ fn load_config_table(gctx: &GlobalContext, prefix: &str) -> CargoResult<TargetCo
fn parse_links_overrides(
target_key: &ConfigKey,
links: HashMap<String, CV>,
gctx: &GlobalContext,
) -> CargoResult<BTreeMap<String, BuildOutput>> {
let mut links_overrides = BTreeMap::new();

Expand Down Expand Up @@ -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 {
Expand Down
3 changes: 3 additions & 0 deletions src/doc/src/reference/build-script-examples.md
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down
42 changes: 41 additions & 1 deletion src/doc/src/reference/build-scripts.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down Expand Up @@ -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.
Expand All @@ -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}

Expand Down
47 changes: 8 additions & 39 deletions src/doc/src/reference/unstable.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down Expand Up @@ -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.
Expand Down Expand Up @@ -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.
11 changes: 9 additions & 2 deletions tests/testsuite/build_script.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down Expand Up @@ -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", "")
Expand Down Expand Up @@ -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");
}
}
}
Expand Down

0 comments on commit 7ebc065

Please sign in to comment.