You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Let's say you have a workspace that contains a library (library) and some tooling (tool). Something like this. You want the library to support no_std, but the tooling does not. (In general, this isn't specific to tooling, perhaps a subset of your workspace supports no_std)
One would expect that building library for a baremetal target would work (and build serde with no_std), and building the entire workspace or tool for a baremetal target would not. Furthermore, it's common to use cargo 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 with no_std.
This is indeed how it works on resolver = "1", note that cargo check and cargo check -p serde both succeed from the library folder, but not the root folder:
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.
Install some no_std target (I'm using thumbv7m-none-eabi). You can alternatively use -v in the build commands to check if serde is built with std enabled
cd library && cargo check --target thumbv7m-none-eabi -p serde
Notes
Output of cargo version:
$ cargo version
cargo 1.55.0-nightly (9233aa06c 2021-06-22)
The text was updated successfully, but these errors were encountered:
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:
A different dependency building first
Your dependency being "fixed" (now you can move on)
Your attempts at fixing one thing breaking something else earlier in the pipeline
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
:The text was updated successfully, but these errors were encountered: