sccache - Cache de compilation partagé
sccache est un cache compilateur (dans l’esprit de ccache) de Mozilla qui supporte Rust, C/C++, et NVCC. Il enveloppe votre compilateur, fait un hash des entrées, et retourne un objet mis en cache quand il a vu la même compilation avant. Sa caractéristique distinctive est les backends de stockage partagés — S3, GCS, Redis, Azure — afin que toute une équipe et votre flotte CI partagent un seul cache. Cela transforme « CI recompile tout à partir de zéro à chaque exécution » en « CI télécharge ce qu’il a déjà construit ».
Installation
| Méthode | Commande |
|---|
| Cargo | cargo install sccache --locked |
| macOS (Homebrew) | brew install sccache |
| Binaire | télécharger depuis les GitHub Releases |
| Vérifier | sccache --version |
L’utiliser avec Rust
# Une fois
RUSTC_WRAPPER=sccache cargo build
# Persistant (dans ~/.cargo/config.toml)
[build]
rustc-wrapper = "sccache"
| Variable | Objectif |
|---|
RUSTC_WRAPPER=sccache | Acheminer rustc à travers sccache |
SCCACHE_DIR | Répertoire de cache local |
SCCACHE_CACHE_SIZE | Taille de cache locale max (p. ex. 20G) |
L’utiliser avec C/C++
# CMake
cmake -DCMAKE_C_COMPILER_LAUNCHER=sccache \
-DCMAKE_CXX_COMPILER_LAUNCHER=sccache ..
# Make
make CC="sccache gcc" CXX="sccache g++"
Vérifier l’efficacité
| Commande | Affiche |
|---|
sccache --show-stats | Hits, misses, taille du cache, erreurs |
sccache --zero-stats | Réinitialiser les compteurs avant un build de test |
sccache --stop-server | Arrêter le serveur de fond |
sccache --start-server | Le démarrer explicitement |
# Mesurer un build froid vs chaud
sccache --zero-stats
cargo build --release
sccache --show-stats # s'attendre à des misses
cargo clean && cargo build --release
sccache --show-stats # s'attendre à des hits
Le nombre clé est le taux de hit du cache. Un taux bas signifie généralement que quelque chose dans les entrées change (flags, variables d’env, chemins absolus).
Backends cloud partagés
# 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
| Backend | Préfixe d’env |
|---|
| Disque local | SCCACHE_DIR |
| S3 / S3-compatible | SCCACHE_BUCKET, SCCACHE_ENDPOINT |
| Redis | SCCACHE_REDIS |
| GCS | SCCACHE_GCS_* |
| Azure | SCCACHE_AZURE_* |
| GitHub Actions | SCCACHE_GHA_ENABLED=true |
Modèle CI
# 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
Choses qui cassent la mise en cache
| Cause | Corriger |
|---|
| Chemins absolus dans la sortie | Utiliser --remap-path-prefix |
Changement de RUSTFLAGS | Maintenir les flags stables entre les exécutions |
| Compilation incrémentale | La désactiver (CARGO_INCREMENTAL=0) pour l’utilisation du cache |
| Proc macros / build scripts | Pas toujours cacheable |
| Versions de compilateur différentes | Les clés de cache incluent le compilateur |
sccache vs alternatives
| Aspect | sccache | ccache | Bazel/Buck |
|---|
| Langages | Rust, C/C++, CUDA | C/C++ | Beaucoup (système de build complet) |
| Cache partagé | Backends cloud intégrés | Surtout local | Cache/exécution distant |
| Configuration | Variable d’env wrapper | Wrapper | Adopter un nouveau système de build |
| Meilleur pour | Accélérer les builds existants | Mise en cache locale C/C++ | Grands monorepos |
S’associe bien avec mold — sccache réduit le temps de compilation, mold réduit le temps de lien.
Ressources