Skip to content

v0.7.0

Latest

Choose a tag to compare

@emmanuelm41 emmanuelm41 released this 23 Jun 14:50
· 17 commits to main since this release
2a7cced

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_env pins 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_env to 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