Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Stabilize -Zcheck-cfg as always enabled #13571

Merged
merged 3 commits into from
May 3, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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.
weihanglo marked this conversation as resolved.
Show resolved Hide resolved
///
/// 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());
epage marked this conversation as resolved.
Show resolved Hide resolved
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 @@ -753,7 +753,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 @@ -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<Option<Vec<String>>, D::Error>
where
D: serde::Deserializer<'de>,
Expand Down Expand Up @@ -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),
Urgau marked this conversation as resolved.
Show resolved Hide resolved

// Unstable features
// Sorted alphabetically:
Expand All @@ -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)?,
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
epage marked this conversation as resolved.
Show resolved Hide resolved

* 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
Loading