Aller au contenu

sccache - Cache de compilation partagé

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éthodeCommande
Cargocargo install sccache --locked
macOS (Homebrew)brew install sccache
Binairetélécharger depuis les GitHub Releases
Vérifiersccache --version

L’utiliser avec Rust

# Une fois
RUSTC_WRAPPER=sccache cargo build

# Persistant (dans ~/.cargo/config.toml)
[build]
rustc-wrapper = "sccache"
VariableObjectif
RUSTC_WRAPPER=sccacheAcheminer rustc à travers sccache
SCCACHE_DIRRépertoire de cache local
SCCACHE_CACHE_SIZETaille 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é

CommandeAffiche
sccache --show-statsHits, misses, taille du cache, erreurs
sccache --zero-statsRéinitialiser les compteurs avant un build de test
sccache --stop-serverArrêter le serveur de fond
sccache --start-serverLe 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
BackendPréfixe d’env
Disque localSCCACHE_DIR
S3 / S3-compatibleSCCACHE_BUCKET, SCCACHE_ENDPOINT
RedisSCCACHE_REDIS
GCSSCCACHE_GCS_*
AzureSCCACHE_AZURE_*
GitHub ActionsSCCACHE_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

CauseCorriger
Chemins absolus dans la sortieUtiliser --remap-path-prefix
Changement de RUSTFLAGSMaintenir les flags stables entre les exécutions
Compilation incrémentaleLa désactiver (CARGO_INCREMENTAL=0) pour l’utilisation du cache
Proc macros / build scriptsPas toujours cacheable
Versions de compilateur différentesLes clés de cache incluent le compilateur

sccache vs alternatives

AspectsccacheccacheBazel/Buck
LangagesRust, C/C++, CUDAC/C++Beaucoup (système de build complet)
Cache partagéBackends cloud intégrésSurtout localCache/exécution distant
ConfigurationVariable d’env wrapperWrapperAdopter un nouveau système de build
Meilleur pourAccélérer les builds existantsMise 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