-
Notifications
You must be signed in to change notification settings - Fork 2.7k
Description
Implementation:
- feat(unstable): Added
-Zbuild-dir-new-layout
unstable feature #15848 - feat(build-dir): Reorganize build-dir layout #15947
Documentation: https://doc.rust-lang.org/nightly/cargo/reference/unstable.html#build-dir-new-layout
Known issues
- As a side effect, we pass a lot more parameters to rustc, likely making
cargo -vv
more annoying, similar to Reduce--verbose
output of--check-cfg
args #13941
Unresolved issues
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/
?- rustc loads incremental artifacts only for local crates. cross-crates is from rmeta. Therefore per-crate incremental artifacts should be fine.
- Given incremental directory has its own flock mechanism, we don't need to add flock for that directory.
- See #t-compiler > ✔ Cargo switching to one `-C incremental` directory per c...
- 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
- Blocked on More granular locking in cargo_rustc #4282
- Remove redundant
-Cextra-filename
in files where possible. - Re-evaluate if we want platform to be unconditionally included in the build-dir layout, or if we can completely drop it (blocked on More granular locking in cargo_rustc #4282)
- Is
<pkgname>/<hash>
good enough or do we need to go with prefixes to reduce the number of items within a directory, see feat(build-dir): Reorganize build-dir layout #15947 (comment) - Can we simplify how fingerprints are stored, reducing pressure on path lengths
- Under the new layout, should
cargo clean -p
also cleans old layout paths? See feat(build-dir): Reorganize build-dir layout #15947 (comment) - Is the current handling of build scripts sufficient or should we explicitly split them into separate entries
Future extensions
- More granular locking in cargo_rustc #4282
- Per-user compiled artifact cache #5931
- cargo ./target fills with outdated artifacts as toolchains are updated/changed #5026
About tracking issues
Tracking issues are used to record the overall progress of implementation.
They are also used as hubs connecting to other relevant issues, e.g., bugs or open design questions.
A tracking issue is however not meant for large scale discussion, questions, or bug reports about a feature.
Instead, open a dedicated issue for the specific matter and add the relevant feature gate label.
Original
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) - Reduced overhead on systems that are slow when there are a lot of files within a directory (see also Adding tests has a high friction #15691)
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