kache 0.14.0 — debuggable restores everywhere, and cross-clone builds that finally converge
kache is a content-addressed build cache that plugs in as a RUSTC_WRAPPER (and a C/C++ compiler wrapper). 0.14.0 is a broad release: restored binaries now keep working debuggers on macOS, cross-clone builds converge on the same cache entries, more compilers are detected, source-churn builds get an adaptive incremental speedup, and a stack of concurrency-correctness fixes land underneath.
Why
Two long-running gaps closed here. A restored macOS -g binary lost source-level debugging — its N_OSO debug-map records point at per-build .o files that don't exist at the restore path — so caching executables on macOS meant giving up lldb. And "the same source in two checkouts should hit the same cache" had one last source of divergence even after rustc's own path remapping. 0.14.0 fixes both, and hardens the store against a series of concurrency races found under load.
What's new
- Debuggable macOS restores. At store time — while the
.ofiles still exist — kache bakes a self-contained.dSYMwithdsymutiland caches it next to the binary, so a restored executable debugs in lldb exactly like a freshly linked one. (Complements caching Linux executables by default in 0.12.) - Cross-clone builds converge. With rustc's
--remap-path-prefixalready making.rmetabyte-identical across checkouts, the last divergence was env-dep values under the build's ownOUT_DIR; an OUT_DIR-relative sentinel plus portable dep-info and validate-on-hit close it (cache key bumped to v25). - Adaptive incremental compilation. Builds dominated by source churn get an adaptive incremental-compilation path that trims rebuild time when most of a crate is unchanged.
- More compilers detected and cached. A
-Epreprocessing probe recognizes arbitrary cc-compatible compilers (not just a fixed list), rustc@response-filesare supported, and Kani's custom rustc driver, wasm link outputs, and GNU assembler debug prefix maps are handled. - Concurrency correctness. The store no longer elects a second writer when the dedup join budget expires, guards entry removal against a concurrent same-key publication, and delivers events exactly once across log rotation and short writes.
- Smarter GC. Value-density eviction candidates are now shadow-evaluated, and size-based eviction is measured in registered blob bytes, on top of a bounded, explicit retention policy.
These notes were drafted with LLM assistance and edited by the maintainers (@jleni, @emmanuelm41).
What's Changed
- fix(heartbeat): prevent stale still-compiling replay by @jleni in #654
- fix(wrapper): support Kani custom rustc drivers by @jleni in #657
- fix(cc): cache GNU assembler debug prefix maps by @jleni in #659
- fix(sharing): never report a partial or unvalidated probe as authoritative by @jleni in #650
- fix(cc): preserve temporary dep-info artifacts by @jleni in #658
- feat(rustc): support response files by @jleni in #660
- Disable daemon idle timeout by default by @jleni in #662
- feat(cc): detect cc-compatible compilers via -E preprocessing probe by @Ysh204 in #538
- fix(cc): preserve output path semantics by @jleni in #664
- fix(probe): drain and scan full probe output so large output can't hide the family marker by @emmanuelm41 in #665
- feat(wrapper): speed source-churn builds with adaptive incremental compilation by @jleni in #663
- Reuse known hashes after storing compiler outputs by @scottopell in #544
- Make the daemon socket path configurable by @scottopell in #542
- Make the large-output probe test deterministic by @jleni in #666
- fix(store): finish the two-remover contract in remove_entry_guarded (#510) by @jleni in #667
- fix(events): exactly-once EventTailer delivery across rotation and short writes (#528) by @jleni in #668
- test(probe): verify cc -### resolves on a live compiler (#626) by @jleni in #672
- fix(gc): measure size-based eviction in registered blob bytes (#608) by @jleni in #671
- fix(daemon): never elect a second writer when the dedup join budget expires (#620) by @jleni in #669
- fix(store): guard entry removal against a concurrent same-key publication (#670) by @jleni in #675
- fix(ci): close the three flake classes taxing every PR (#673) by @jleni in #674
- feat(gc): shadow-evaluate the value-density eviction candidate (#594) by @jleni in #676
- fix(key): cross-clone convergence — OUT_DIR-relative env-dep sentinel, portable dep-info, validate-on-hit (#330) by @jleni in #684
- fix(wrapper): stamp restored artifacts with the file-write clock, not the precise clock by @jleni in #679
- feat(macos): cache a store-time .dSYM alongside executables (#319) by @jleni in #685
- fix(link,e2e): restore-stamp hardening, Windows write clock, cross-tree contract by @jleni in #683
- fix(rustc): cache wasm link outputs; stop truncating key-error causes (#431) by @jleni in #690
- fix(doctor): fail CI on unresolved integrity findings; scrub blobs once, streaming (#176) by @jleni in #692
- test(remote): pin the filesystem remote's cross-client contract; document share GC (#414) by @jleni in #700
- fix(daemon): stop leaking the caller's pipe handles to the daemon on Windows (#704) by @jleni in #705
- ci: route validation to GitHub-hosted runners by @jleni in #713
- test(service): enforce complete mutation coverage by @jleni in #707
- fix(key): support crate-scoped path-only environment entries by @jleni in #714
- feat(policy): add crate-scoped incremental force-list by @jleni in #716
- fix(stats): report daemon-owned effective configuration by @jleni in #715
- fix(gc): make retention policy bounded and explicit by @jleni in #718
- fix(native): harden portable archive identity by @jleni in #717
- feat(remote): make remote resilience durable and bounded by @jleni in #719
- fix: stabilize daemon local lookup under load by @jleni in #721
- fix(extra_inputs): own Cargo warm-target invalidation by @jleni in #726
- feat(extra_inputs): add workspace declarations and propagation by @jleni in #727
- test(daemon): make recovery run-lock tests deterministic by @jleni in #729
- bench(firefox-windows): move the clone under a short work dir by @jleni in #732
- fix(aur): publish a real pkgver for the -git package by @emmanuelm41 in #731
- fix(depinfo): keep env-dep escaping intact in the Windows rewrite by @jleni in #733
- test(daemon): hold the late socket until the waiter observes it by @jleni in #734
- chore: bump kache to v0.14.0 by @emmanuelm41 in #736
- fix(key): bump CACHE_KEY_VERSION to 25 for the Windows dep-info rewrite (#730) by @emmanuelm41 in #737
New Contributors
- @scottopell made their first contribution in #544
Full Changelog: v0.13.0...v0.14.0