blob: 0fe94c3f3b5362e9640ede9bc4c86dfdcbc1ea85 [file] [view] [edit]
# Writing an RFC
Generally, an RFC goes through:
1. Pre-RFC discussions on the [internals forum][irlo]
2. [RFC]
3. [Development and stabilization][unstable]
Please keep in mind our [design principles](../design.md).
For more concrete areas of consideration:
## `.cargo/config.toml` and `Cargo.toml`
`.cargo/config.toml` is for environment or transient configuration,
being dependent on what directory you are running from and settable on the command-line,
independent of other flags like `--manifest-path` or `--package`.
On the other hand `Cargo.toml` is for static, high-level project configuration.
For example,
- [RFC 3537] chose
configuration for the MSRV-aware resolver because users would likely need
to change this setting, like in CI to verify the opposite case of
what they run by default.
- The Cargo team rejected a [`[cfg]` table][cfg table] to represent `rustc`
`--cfg` flags as it was a direct port of low-level rustc behavior that didn't
mesh with the other high level abstractions of manifests.
- For stabilization, this was worked around through a build script directive and a `[lints]` field configuration.
- [#12738][cargo#12738] for exploring how existing config might be representable in `Cargo.toml`.
[irlo]: https://internals.rust-lang.org/
[RFC]: https://github.com/rust-lang/rfcs/
[unstable]: unstable.md
[RFC 3537]: https://rust-lang.github.io/rfcs/3537-msrv-resolver.html
[cfg table]: https://github.com/rust-lang/cargo/pull/11631#issuecomment-1487424886
[cargo#12738]: https://github.com/rust-lang/cargo/issues/12738
## `Cargo.toml`
When adding a table to a manifest,
- Should it be inheritable?
- Ensure the package table and the inheritable table under `workspace` align
- Care is needed to ensure a `workspace = true` field doesn't conflict with other entries
- e.g. [RFC 3389] had to explicitly exclude ever supporting a `workspace` linter
When adding a field,
- Is it inheritable?
- Consider whether sharing of the field would be driven by requirements or is a manifestation of the current implementation.
For example, in most cases, dependency sources (e.g. `version` field) should be aligned across a workspace
However, frequently dependency `features` will vary across a workspace.
- When inheriting, can specify it in your package?
- How does specifying a field in both `workspace` and a package interact?
- e.g. dependency sources cannot be overridden
- e.g. dependency `features` get merged
- e.g. dependency `default-features` has been hard to get right ([#12162][cargo#12162])
When working extending `dependencies` tables:
- How does this affect `cargo add` or `cargo remove`?
- How does this affect `[patches]` which are just modified dependencies?
[RFC 3389]: https://rust-lang.github.io/rfcs/3389-manifest-lint.html
[cargo#12162]: https://github.com/rust-lang/cargo/issues/12162