Ir al contenido

sccache - Caché de Compilación Compartida Hoja de Trucos

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étodoComando
Cargocargo install sccache --locked
macOS (Homebrew)brew install sccache
Binarydescarga desde GitHub Releases
Verificarsccache --version

Usarlo con Rust

# Una sola vez
RUSTC_WRAPPER=sccache cargo build

# Persistente (en ~/.cargo/config.toml)
[build]
rustc-wrapper = "sccache"
VariablePropósito
RUSTC_WRAPPER=sccacheEnrutar rustc a través de sccache
SCCACHE_DIRDirectorio de caché local
SCCACHE_CACHE_SIZETamañ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

ComandoMuestra
sccache --show-statsHits, misses, tamaño de caché, errores
sccache --zero-statsResetear contadores antes de prueba de compilación
sccache --stop-serverDetener el servidor de fondo
sccache --start-serverIniciarlo 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
BackendPrefijo env
Disco localSCCACHE_DIR
S3 / S3-compatibleSCCACHE_BUCKET, SCCACHE_ENDPOINT
RedisSCCACHE_REDIS
GCSSCCACHE_GCS_*
AzureSCCACHE_AZURE_*
GitHub ActionsSCCACHE_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é

CausaSolución
Rutas absolutas en salidaUsar --remap-path-prefix
Cambiar RUSTFLAGSMantener flags estables en ejecuciones
Compilación incrementalDeshabilitarla (CARGO_INCREMENTAL=0) para caché
Proc macros / build scriptsNo siempre cacheable
Diferentes versiones de compiladorLas claves de caché incluyen el compilador

sccache vs Alternativas

AspectosccacheccacheBazel/Buck
LenguajesRust, C/C++, CUDAC/C++Muchos (sistema de compilación completo)
Caché compartidoBackends de nube integradosMayormente localCaché remoto/ejecución
ConfiguraciónVariable env wrapperWrapperAdoptar nuevo sistema de compilación
Mejor paraAcelerar compilaciones existentesCaché local C/C++Monorepos grandes

Se empareja bien con mold — sccache reduce tiempo de compilación, mold reduce tiempo de enlace.

Recursos