kache 0.7.0 — caching real-world C/C++ trees, installable everywhere
kache is a content-addressed build cache that plugs in as a RUSTC_WRAPPER (and a C/C++
compiler wrapper). 0.6.0 made the cache shareable across machines and checkouts; 0.7.0
makes it actually hit on large real-world C/C++ trees — and ships via the package
manager you already use.
Why
A cache that "supports C/C++" but quietly falls back to passthrough on the flags real
projects use isn't caching much. So we built a nightly benchmark harness against Firefox,
LLVM, and Substrate and let it tell us which translation units weren't caching — then
modeled the flags behind each miss.
What's new
- Big C/C++ trees actually cache now. Modeled the codegen flags that were forcing
passthrough on Firefox/LLVM — the fast-math family,-fomit-frame-pointer, x86 ISA
selection,-fansi-escape-codes— and taught the probe to read gcc/g++-###, so
codegen flags cache on gcc, not just clang. - Install it anywhere. Published to Homebrew, apt, and winget, with the release
binaries code-signed on macOS, Windows, and Linux. (See the README for per-channel
install instructions.) - Cross-layout convergence. Out-of-tree
CARGO_TARGET_DIR, symlinked build-forests,
and CMake out-of-tree builds now converge to the same keys, each covered by its own e2e
scenario. - Tri-state restore verification.
off | sampled | always— sample a fraction of
restores in production, or verify every one, instead of a single on/off switch. - Config ergonomics.
ignore_envpins a config against env-var overrides, and the
daemon now self-restarts when its config file changes.
Hardening for shared use: import trust boundary re-validates names/hashes on remote import,
actively-restored entries are pinned against eviction, and a single-lock S3 key-cache swap
closes a populate/insert race.
These notes were drafted with LLM assistance and edited by the maintainers (@jleni, @emmanuelm41).
What's Changed
- fix(daemon): persist build-session marker through the locked handle (#348) by @emmanuelm41 in #350
- ci: run cargo test --workspace + clippy on Windows; fix the Windows-only failures it surfaced by @emmanuelm41 in #351
- chore(release): bump version to 0.7.0-rc.1 by @emmanuelm41 in #352
- fix(rustc): pass through --pretty/--unpretty source dumps by @emmanuelm41 in #354
- ci: raise Test (Windows) timeouts (test step exceeds 30m) by @emmanuelm41 in #361
- ci: nightly + manual clone-bench workflow on self-hosted Linux (firefox + substrate) by @jleni in #353
- ci(bench): target kunobi-runners scale-set by name (fix never-scheduling bench job) by @emmanuelm41 in #363
- kache gap follow-ups from lovesegfault's rio-build#51 review by @emmanuelm41 in #362
- ci(bench): fix upload step — drop fragile hashFiles gate, capture build logs by @emmanuelm41 in #365
- ci: enable GCP-KMS code signing on releases by @emmanuelm41 in #241
- fix(ci): pass signing config via reusable-workflow secrets block by @emmanuelm41 in #369
- ci: finalize code-signing (pin _workflows@v10, restore gates & publishing) by @emmanuelm41 in #372
- bench(substrate): pin Rust 1.93.0 — fix wasm runtime link failure by @emmanuelm41 in #370
- feat(config): add
ignore_envto pin a config against env overrides by @emmanuelm41 in #364 - feat(daemon): self-restart when the config file changes by @emmanuelm41 in #366
- chore(release): bump version to 0.7.0-rc.2 by @emmanuelm41 in #373
- fix(store): reflink-first ingest + CoW store accounting; bench measures real disk by @jleni in #371
- fix: clarify passthrough reason reporting by @jleni in #376
- fix: support x86 cc flags in monitor by @jleni in #377
- test: cover rustc version cache keys by @jleni in #378
- docs: describe kache as multi-language (Rust, C/C++ and more) by @emmanuelm41 in #379
- feat: publish to brew, apt & winget package managers by @emmanuelm41 in #374
- chore(release): bump to 0.7.0-rc.3 by @emmanuelm41 in #380
- fix(package-publish): gate on release upload + drop private builder image by @emmanuelm41 in #381
- feat: add report timeline anchors by @jleni in #382
- docs: refresh README and CI docs by @jleni in #383
- deb: maintainer = Kunobi Ninja (publisher), keep Zondax AG copyright by @emmanuelm41 in #385
- fix(cache): emit-coverage gate + residual-args folding (#324, #325) by @jleni in #384
- docs: complete install instructions for all package managers + channels by @emmanuelm41 in #386
- apt: drop broken/redundant deb version normalization by @emmanuelm41 in #388
- fix(daemon): single-lock S3KeyCache swap to close populate/insert race (#213) by @jleni in #387
- fix(store): pin actively-restored entries against eviction (#182, #326) by @jleni in #390
- fix(remote): enforce import trust boundary — re-hash + validate names/hashes (#211) by @jleni in #391
- fix(cache): optional diagnostics size cap; lock warning-gate replay parity (#336) by @jleni in #393
- feat(cache): tri-state restore verification off|sampled|always (#332) by @jleni in #392
- fix(cc): converge out-of-tree build keys + CMake e2e scenario (#304, #394) by @jleni in #397
- bench: add sccache firefox benchmark by @jleni in #395
- test(e2e): out-of-tree CARGO_TARGET_DIR convergence scenario (#394) by @jleni in #396
- test: increase Rust coverage to ~87.7% (unit + integration + mocking) by @emmanuelm41 in #389
- test(e2e): symlinked build-forest convergence scenario (#394) by @jleni in #398
- docs: document benchmark reporting by @jleni in #400
- feat(cache): surface unmodeled rustc flags (#183) by @jleni in #401
- test: raise coverage to ~89.6%, lift CI gate to 88%, drop stray drafts by @emmanuelm41 in #404
- fix(cache-key): canonicalize path-only env-deps before keying (#399) by @jleni in #403
- bench: add LLVM CMake/C++ benchmark scenario by @jleni in #406
- docs: surface bench verdict, substrate scenario, and run scale by @jleni in #405
- ci: skip the build/test matrix on docs-only PRs by @jleni in #407
- bench(ci): add llvm and firefox-sccache to the nightly by @jleni in #408
- fix(ci): send Linux checksums to Homebrew formula dispatch by @emmanuelm41 in #409
- fix(cc): preserve source dir structure in out-of-tree FILE normalization by @jleni in #410
- fix(cc): #411 flag coverage + deterministic parallel cache keys by @jleni in #413
- test(e2e): gate-speed FILE out-of-tree reproducers + cmake in docker by @jleni in #417
- feat(sync): add --workspace to scope sync --pull to workspace members by @AlJohri in #416
- feat(cc): model bench-observed codegen flags so Firefox/LLVM TUs cache by @jleni in #418
- feat(probe): parse gcc/g++ -### so codegen flags cache on gcc, not just clang by @jleni in #419
- fix(sync): fail --workspace fast when workspace is unresolved (follow-up to #416) by @emmanuelm41 in #420
- feat(cc): model the full fast-math family so LLVM's last passthrough caches by @jleni in #422
- feat(cc): cache Firefox/Windows TUs passing -fansi-escape-codes bare by @emmanuelm41 in #425
- chore: bump version to 0.7.0 by @emmanuelm41 in #427
- feat(cc): model -fomit-frame-pointer + x86 codec ISA flags (Firefox nightly) by @jleni in #426
New Contributors
Full Changelog: v0.6.0...v0.7.0