Open
Description
note: I specify build-dir
to clarify which half of #14125 I'm referring to. The files and layout of build-dir
does not have compatibility guarantees (source).
Currently, build-dir
is laid out like
target/
<target-platform>/
?<profile>/
incremental/
build/
<package>-<hash>/
build*script-*
deps/
<package>-<hash>*
Currently,
cargo clean -p <package>
will operate on everything for<package>
In the future, we could have
- GC will track and operate on everything for
<package>-<hash>
(cargo ./target fills with outdated artifacts as toolchains are updated/changed #5026) - Change the locking so only overlapping
<package>-<hash>
that are being built block (More granular locking in cargo_rustc #4282) - Centrally cache
<package>-<hash>
artifacts across all projects (Per-user compiled artifact cache #5931)
These could be aided by re-arranging the build-dir
to be organized around <package>-<hash>
, like
target/
<target-platform>/
?<profile>/
incremental/
build/
<package>-<hash>/
build*script-*
*.d
Side effects
- We'll have to change how we invoke rustc which will increase the length of the command-line
- Currently, we blindly point rustc at
deps/
and rustc finds the files it needs. We'll instead need to point to each individual artifact rustc may need.
- Currently, we blindly point rustc at
Open questions
- Transition plan: while
build-dir
isn't stable, enough tools rely on the layout that we'd want to setup a transition plan so they can have time to test against the new layout and work to support both - What do we call the directory? I said
build/
as its all encompassing - Can the old
build/
anddeps/
content live in the same place? - How should we handle
incremental/
? - Can we share across
<profile>
at least?<hash>
is the-C extra-filename
hash and doesn't encompass all of fingerprinting, so we'd need to audit if there are cases that don't change the hash that we'd stil need per-profile- Changing of local source is one example, so at least local packages still need to be scoped by profile