Open Manishearth opened 3 years ago
This was an intentional change as part of making it less magical as to changing behavior based on the "current" directory (part of package-features
in #5364, RFC #2957).
it's common to use
cargo build -p serde
to just build serde
I'm a bit surprised to hear this is "common", as I haven't really seen that done before. Is there some reason you can't just run cargo check
to see how the dependencies would build? Why would you need to build a specific one?
I'm a bit surprised to hear this is "common", as I haven't really seen that done before. Is there some reason you can't just run
cargo check
to see how the dependencies would build? Why would you need to build a specific one?
It's super common in large codebases when doing a major refactor -- sometimes you wish to focus on a specific dependency, and it's not necessarily clear if a compile failure comes from:
You can get this clarity by using -v
and checking which crates get built, and also by knowing the dep graph, but for large codebases this is still annoying.
For example, right now I'm moving a codebase over to no_std
and it's important to be able to do this crate by crate, especially for external dependencies like serde
(need to be able to make sure it's being built with the correct features, etc)
I think this is a pretty important use case tbh, it makes such work much much harder. Perhaps there could be a different flag, but I don't think this is that uncommon for large codebases.
Problem
Let's say you have a workspace that contains a library (
library
) and some tooling (tool
). Something like this. You want the library to supportno_std
, but the tooling does not. (In general, this isn't specific to tooling, perhaps a subset of your workspace supportsno_std
)One would expect that building
library
for a baremetal target would work (and buildserde
withno_std
), and building the entire workspace ortool
for a baremetal target would not. Furthermore, it's common to usecargo build -p serde
to just build serde; and it's useful if it builds the serde that-would-be-built-by-running-cargo build
-in-the-same-folder, because it helps for things like incrementally getting dependencies to work withno_std
.This is indeed how it works on
resolver = "1"
, note thatcargo check
andcargo check -p serde
both succeed from thelibrary
folder, but not the root folder:However, with
resolver = "2"
,cargo check
succeeds in thelibrary
folder, but notcargo check -p serde
:This seems a bit counterintuitive to me: the new resolver is intended to reduce this kind of problem. It would be nice if the old behavior still worked here, and this seems like a regression to me.
Steps
resolver = "2"
line inCargo.toml
thumbv7m-none-eabi
). You can alternatively use-v
in the build commands to check ifserde
is built withstd
enabledcd library && cargo check --target thumbv7m-none-eabi -p serde
Notes
Output of
cargo version
: