sccache - Cache de Compilação Compartilhado
sccache é um cache de compilador (no espírito de ccache) do Mozilla que suporta Rust, C/C++, e NVCC. Ele encapsula seu compilador, faz hash das entradas, e retorna um objeto cached quando viu a mesma compilação antes. Sua característica distintiva são backends de storage compartilhado — S3, GCS, Redis, Azure — então um time inteiro e sua frota CI compartilham um cache. Isso transforma “CI recompila tudo do zero em cada execução” em “CI baixa o que já compilou.”
Instalação
| Método | Comando |
|---|
| Cargo | cargo install sccache --locked |
| macOS (Homebrew) | brew install sccache |
| Binary | baixe do GitHub Releases |
| Verificar | sccache --version |
# Uma vez
RUSTC_WRAPPER=sccache cargo build
# Persistente (em ~/.cargo/config.toml)
[build]
rustc-wrapper = "sccache"
| Variável | Propósito |
|---|
RUSTC_WRAPPER=sccache | Rotear rustc através de sccache |
SCCACHE_DIR | Diretório de cache local |
SCCACHE_CACHE_SIZE | Tamanho máximo de cache local (ex. 20G) |
# CMake
cmake -DCMAKE_C_COMPILER_LAUNCHER=sccache \
-DCMAKE_CXX_COMPILER_LAUNCHER=sccache ..
# Make
make CC="sccache gcc" CXX="sccache g++"
Verificando Efetividade
| Comando | Mostra |
|---|
sccache --show-stats | Hits, misses, tamanho de cache, erros |
sccache --zero-stats | Resetar contadores antes de um teste de compilação |
sccache --stop-server | Parar o servidor de background |
sccache --start-server | Iniciá-lo explicitamente |
# Medir compilação fria vs quente
sccache --zero-stats
cargo build --release
sccache --show-stats # espere por misses
cargo clean && cargo build --release
sccache --show-stats # espere por hits
O número chave é taxa de hit de cache. Uma taxa baixa geralmente significa que algo nas entradas está mudando (flags, env vars, caminhos absolutos).
Backends em Nuvem Compartilhados
# 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 | Prefixo de env |
|---|
| Disco local | SCCACHE_DIR |
| S3 / S3-compatível | SCCACHE_BUCKET, SCCACHE_ENDPOINT |
| Redis | SCCACHE_REDIS |
| GCS | SCCACHE_GCS_* |
| Azure | SCCACHE_AZURE_* |
| GitHub Actions | SCCACHE_GHA_ENABLED=true |
Padrão 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
Coisas Que Quebram Caching
| Causa | Corrigir |
|---|
| Caminhos absolutos na saída | Use --remap-path-prefix |
Mudança de RUSTFLAGS | Mantenha flags estáveis entre execuções |
| Compilação incremental | Desabilite-a (CARGO_INCREMENTAL=0) para uso de cache |
| Proc macros / build scripts | Nem sempre cacheable |
| Versões diferentes de compilador | Cache keys incluem o compilador |
sccache vs Alternativas
| Aspecto | sccache | ccache | Bazel/Buck |
|---|
| Linguagens | Rust, C/C++, CUDA | C/C++ | Muitas (sistema de compilação completo) |
| Cache compartilhado | Backends em nuvem integrados | Geralmente local | Cache remoto/execução |
| Setup | Var de env de wrapper | Wrapper | Adotar novo sistema de compilação |
| Melhor para | Acelerar compilações existentes | Caching local de C/C++ | Grandes monorepos |
Pareia bem com mold — sccache corta tempo de compilação, mold corta tempo de ligação.
Recursos