Cargo Separates Metadata From Libraries to Shrink Rust Build Trees
Rust’s Cargo team is testing a nightly default that stops embedding full crate metadata in finished library artifacts, reducing duplicated data in target directories while preserving the metadata in separate .rmeta files.

Rust’s latest build-system experiment targets a familiar developer complaint: the target directory keeps growing even when the application itself has not changed.
The Cargo team is preparing to enable -Zembed-metadata=no by default when both Cargo and rustc use nightly. The flag prevents full Rust metadata from being embedded in .rlib and .dylib artifacts. Instead, that metadata remains in separate .rmeta files.
The reason is pipeline duplication. During compilation, Cargo already asks rustc to produce .rmeta files early so dependent crates can begin compiling. When the library finishes, its .rlib traditionally contains the same Rust metadata again. The experiment removes that second copy.
The measured effect is meaningful but workload-dependent. In the team’s tests, a release build of serde used 28.68 MiB instead of 40.88 MiB, a 29.8% reduction. A release build of Cargo itself fell from 807.05 MiB to 537.15 MiB, a 33.4% reduction. Development builds saw smaller gains when incremental artifacts and debug information dominated disk usage.
For ICP·Dev builders, the practical implication is mostly operational. Nightly-based CI runners, disposable build containers, and local workspaces may need less storage for repeated compilation. Smaller artifacts can also reduce pressure on ephemeral disks and build caches, although cache behavior still depends on the surrounding toolchain and workflow.
There is a boundary. This is an experimental nightly Cargo default, not a stable-toolchain guarantee. The Cargo Book documents no-embed-metadata as an unstable feature and shows it being enabled with cargo +nightly -Zno-embed-metadata build.
The change also matters to unusual build integrations. Developers who manually link .rlib files may need to pass the corresponding .rmeta file to rustc; otherwise the compiler can report that only a metadata stub is available. Ordinary Cargo users generally should not need to manage those files directly.
The reported disk reductions come from specific x86_64 Linux builds of serde and Cargo, so results will vary by project, profile, target, and debug configuration. The team says the experiment is intended to gather feedback before deciding whether the design should be changed, stabilized, or abandoned.
The broader lesson is architectural: Rust’s build artifacts are being treated as a pipeline with distinct code and metadata products. If the experiment survives real-world testing, a future Cargo may spend less disk space without asking developers to sacrifice incremental compilation or debuggability.
Get the wire in your inbox
Every new signal, straight from the generator. No noise, unsubscribe anytime.


