sccache - Caché de Compilación Compartida Hoja de Trucos
sccache es un caché de compilador (en el espíritu de ccache) de Mozilla que soporta Rust, C/C++ y NVCC. Envuelve tu compilador, hash la entrada, y retorna un objeto cacheado cuando ha visto la misma compilación antes. Su característica distintiva es backends de almacenamiento compartido — S3, GCS, Redis, Azure — para que un equipo entero y tu flota de CI compartan un caché. Eso convierte “CI recompila todo desde cero cada ejecución” en “CI descarga lo que ya construyó.”
Instalación
| Método | Comando |
|---|
| Cargo | cargo install sccache --locked |
| macOS (Homebrew) | brew install sccache |
| Binary | descarga desde GitHub Releases |
| Verificar | sccache --version |
Usarlo con Rust
# Una sola vez
RUSTC_WRAPPER=sccache cargo build
# Persistente (en ~/.cargo/config.toml)
[build]
rustc-wrapper = "sccache"
| Variable | Propósito |
|---|
RUSTC_WRAPPER=sccache | Enrutar rustc a través de sccache |
SCCACHE_DIR | Directorio de caché local |
SCCACHE_CACHE_SIZE | Tamaño máximo de caché local (ej. 20G) |
Usarlo con C/C++
# CMake
cmake -DCMAKE_C_COMPILER_LAUNCHER=sccache \
-DCMAKE_CXX_COMPILER_LAUNCHER=sccache ..
# Make
make CC="sccache gcc" CXX="sccache g++"
Verificar Efectividad
| Comando | Muestra |
|---|
sccache --show-stats | Hits, misses, tamaño de caché, errores |
sccache --zero-stats | Resetear contadores antes de prueba de compilación |
sccache --stop-server | Detener el servidor de fondo |
sccache --start-server | Iniciarlo explícitamente |
# Medir compilación fría vs cálida
sccache --zero-stats
cargo build --release
sccache --show-stats # esperar misses
cargo clean && cargo build --release
sccache --show-stats # esperar hits
El número clave es tasa de hit de caché. Una tasa baja normalmente significa algo en las entradas está cambiando (flags, variables env, rutas absolutas).
Backends de Nube Compartida
# 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 | Prefijo env |
|---|
| Disco 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 |
Patrón de 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
Cosas Que Rompen el Caché
| Causa | Solución |
|---|
| Rutas absolutas en salida | Usar --remap-path-prefix |
Cambiar RUSTFLAGS | Mantener flags estables en ejecuciones |
| Compilación incremental | Deshabilitarla (CARGO_INCREMENTAL=0) para caché |
| Proc macros / build scripts | No siempre cacheable |
| Diferentes versiones de compilador | Las claves de caché incluyen el compilador |
sccache vs Alternativas
| Aspecto | sccache | ccache | Bazel/Buck |
|---|
| Lenguajes | Rust, C/C++, CUDA | C/C++ | Muchos (sistema de compilación completo) |
| Caché compartido | Backends de nube integrados | Mayormente local | Caché remoto/ejecución |
| Configuración | Variable env wrapper | Wrapper | Adoptar nuevo sistema de compilación |
| Mejor para | Acelerar compilaciones existentes | Caché local C/C++ | Monorepos grandes |
Se empareja bien con mold — sccache reduce tiempo de compilación, mold reduce tiempo de enlace.
Recursos