Skip to content

Commit 12a26b3

Browse files
committed
Auto merge of #11675 - ehuss:z-features-behavior, r=epage
Add more guidance on how to implement unstable features This adds some clarification around how unstable features should be introduced, particularly when interacting with global config settings that may be read by older releases. Note that the current set of unstable features violates some of these guidelines, and may deserve some attention in fixing up: * `-Z profile-rustflags`: it is an error if `rustflags` is found in `config.toml`. This could potentially make it awkward to stabilize if the user wants to place rustflags in their global config. I think that may be rare, though I can imagine some users wanting `-Ctarget-cpu=native` or similar. * `-Z codegen-backend`: it is an error if `codegen-backend` is found in `config.toml`. I'm not sure about the likelihood of users setting this globally, but I could imagine people might want to opt-in to cranelift. * `codegen-backend` does *not* require `cargo-features` in `Cargo.toml`, but it probably should since it is new syntax. * `-Z bindeps` does *not* require `cargo-features` in `Cargo.toml`, but it probably should since it is new syntax. I understand requiring both `cargo-features` and `-Z` is awkward, but each has independent reasons for being needed.
2 parents bb8c034 + 6dab1c3 commit 12a26b3

File tree

1 file changed

+40
-0
lines changed

1 file changed

+40
-0
lines changed

src/cargo/core/features.rs

+40
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,9 @@
5858
//!
5959
//! ## `-Z` options
6060
//!
61+
//! New `-Z` options cover all other functionality that isn't covered with
62+
//! `cargo-features` or `-Z unstable-options`.
63+
//!
6164
//! The steps to add a new `-Z` option are:
6265
//!
6366
//! 1. Add the option to the [`CliUnstable`] struct below. Flags can take an
@@ -68,6 +71,43 @@
6871
//! and check if the option has been enabled on the [`CliUnstable`] instance.
6972
//! Nightly gating is already handled, so no need to worry about that.
7073
//!
74+
//! ### `-Z` vs `cargo-features`
75+
//!
76+
//! In some cases there might be some changes that `cargo-features` is unable
77+
//! to sufficiently encompass. An example would be a syntax change in
78+
//! `Cargo.toml` that also impacts the index or resolver. The resolver doesn't
79+
//! know about `cargo-features`, so it needs a `-Z` flag to enable the
80+
//! experimental functionality.
81+
//!
82+
//! In those cases, you usually should introduce both a `-Z` flag (to enable
83+
//! the changes outside of the manifest) and a `cargo-features` entry (to
84+
//! enable the new syntax in `Cargo.toml`). The `cargo-features` entry ensures
85+
//! that any experimental syntax that gets uploaded to crates.io is clearly
86+
//! intended for nightly-only builds. Otherwise, users accessing those crates
87+
//! may get confusing errors, particularly if the syntax changes during the
88+
//! development cycle, and the user tries to access it with a stable release.
89+
//!
90+
//! ### `-Z` with external files
91+
//!
92+
//! Some files, such as `config.toml` config files, or the `config.json` index
93+
//! file, are used in a global location which can make interaction with stable
94+
//! releases problematic. In general, before the feature is stabilized, stable
95+
//! Cargo should behave roughly similar to how it behaved *before* the
96+
//! unstable feature was introduced. If Cargo would normally have ignored or
97+
//! warned about the introduction of something, then it probably should
98+
//! continue to do so.
99+
//!
100+
//! For example, Cargo generally ignores (or warns) about `config.toml`
101+
//! entries it doesn't know about. This allows a limited degree of
102+
//! forwards-compatibility with future versions of Cargo that add new entries.
103+
//!
104+
//! Whether or not to warn on stable may need to be decided on a case-by-case
105+
//! basis. For example, you may want to avoid generating a warning for options
106+
//! that are not critical to Cargo's operation in order to reduce the
107+
//! annoyance of constant warnings. However, ignoring some options may prevent
108+
//! proper operation, so a warning may be valuable for a user trying to
109+
//! diagnose why it isn't working correctly.
110+
//!
71111
//! ## Stabilization
72112
//!
73113
//! For the stabilization process, see

0 commit comments

Comments
 (0)