Zum Inhalt springen

sccache - Shared Compilation Cache Cheatsheet

sccache - Shared Compilation Cache Cheatsheet

sccache ist ein Compiler-Cache (im Geist von ccache) von Mozilla, der Rust, C/C++ und NVCC unterstützt. Es wrappet deinen Compiler, hash die Inputs und gibt ein gecachtes Object zurück, wenn es dieselbe Kompilation vorher gesehen hat. Sein unterscheidendes Feature sind Shared Storage Backends — S3, GCS, Redis, Azure — sodass ein ganzes Team und deine CI Fleet einen Cache teilen. Das verwandelt “CI neukompiliert alles von Grund auf bei jedem Lauf” in “CI lädt herunter, was es bereits gebaut hat.”

Installation

MethodeBefehl
Cargocargo install sccache --locked
macOS (Homebrew)brew install sccache
Binarydownload from GitHub Releases
Verifikationsccache --version

Benutzung mit Rust

# One-Off
RUSTC_WRAPPER=sccache cargo build

# Persistent (in ~/.cargo/config.toml)
[build]
rustc-wrapper = "sccache"
VariableZweck
RUSTC_WRAPPER=sccacheRoute rustc durch sccache
SCCACHE_DIRLokales Cache-Verzeichnis
SCCACHE_CACHE_SIZEMax lokale Cache-Größe (z.B. 20G)

Benutzung mit C/C++

# CMake
cmake -DCMAKE_C_COMPILER_LAUNCHER=sccache \
      -DCMAKE_CXX_COMPILER_LAUNCHER=sccache ..

# Make
make CC="sccache gcc" CXX="sccache g++"

Wirksamkeit prüfen

BefehlZeigt
sccache --show-statsHits, Misses, Cache-Größe, Errors
sccache --zero-statsReset Counters vor Test-Build
sccache --stop-serverStop the Background Server
sccache --start-serverStart es explizit
# Measure a Cold vs Warm Build
sccache --zero-stats
cargo build --release
sccache --show-stats     # expect misses
cargo clean && cargo build --release
sccache --show-stats     # expect hits

Die Schlüsselzahl ist Cache Hit Rate. Eine niedrige Rate bedeutet normalerweise etwas in den Inputs ändert sich (Flags, Env-Vars, Absolute Paths).

Shared Cloud Backends

# S3
export SCCACHE_BUCKET=my-build-cache
export SCCACHE_REGION=us-east-1
export AWS_ACCESS_KEY_ID=... AWS_SECRET_ACCESS_KEY=...

# Redis
export SCCACHE_REDIS=redis://cache.internal:6379

# GCS
export SCCACHE_GCS_BUCKET=my-build-cache
export SCCACHE_GCS_KEY_PATH=/path/to/key.json
BackendEnv Prefix
Local DiskSCCACHE_DIR
S3 / S3-compatibleSCCACHE_BUCKET, SCCACHE_ENDPOINT
RedisSCCACHE_REDIS
GCSSCCACHE_GCS_*
AzureSCCACHE_AZURE_*
GitHub ActionsSCCACHE_GHA_ENABLED=true

CI Pattern

# GitHub Actions
env:
  SCCACHE_GHA_ENABLED: "true"
  RUSTC_WRAPPER: "sccache"
steps:
  - uses: mozilla-actions/sccache-action@v0.0.5
  - run: cargo build --release
  - run: sccache --show-stats

Dinge, die Caching brechen

UrsacheFix
Absolute Paths in OutputNutze --remap-path-prefix
Ändernde RUSTFLAGSKeep Flags stabil über Läufe
Incremental CompilationDisable es (CARGO_INCREMENTAL=0) für Cache-Nutzung
Proc Macros / Build ScriptsNicht immer cacheable
Unterschiedliche Compiler-VersionenCache Keys inkludieren den Compiler

sccache vs Alternativen

AspektsccacheccacheBazel/Buck
LanguagesRust, C/C++, CUDAC/C++Viele (vollständiges Build System)
Shared CacheCloud Backends Built-inMeistens LokalRemote Cache/Execution
SetupWrapper Env VarWrapperAdopt ein neues Build System
Am besten fürSpeedup existierender BuildsC/C++ lokales CachingLarge Monorepos

Paart gut mit mold — sccache kürzt Compile-Zeit, mold kürzt Link-Zeit.

Ressourcen