Pular para o conteúdo

sccache - Cache de Compilação Compartilhado

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

Usando com Rust

# Uma vez
RUSTC_WRAPPER=sccache cargo build

# Persistente (em ~/.cargo/config.toml)
[build]
rustc-wrapper = "sccache"
VariávelPropósito
RUSTC_WRAPPER=sccacheRotear rustc através de sccache
SCCACHE_DIRDiretório de cache local
SCCACHE_CACHE_SIZETamanho máximo de cache local (ex. 20G)

Usando com C/C++

# CMake
cmake -DCMAKE_C_COMPILER_LAUNCHER=sccache \
      -DCMAKE_CXX_COMPILER_LAUNCHER=sccache ..

# Make
make CC="sccache gcc" CXX="sccache g++"

Verificando Efetividade

ComandoMostra
sccache --show-statsHits, misses, tamanho de cache, erros
sccache --zero-statsResetar contadores antes de um teste de compilação
sccache --stop-serverParar o servidor de background
sccache --start-serverIniciá-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
BackendPrefixo de env
Disco localSCCACHE_DIR
S3 / S3-compatívelSCCACHE_BUCKET, SCCACHE_ENDPOINT
RedisSCCACHE_REDIS
GCSSCCACHE_GCS_*
AzureSCCACHE_AZURE_*
GitHub ActionsSCCACHE_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

CausaCorrigir
Caminhos absolutos na saídaUse --remap-path-prefix
Mudança de RUSTFLAGSMantenha flags estáveis entre execuções
Compilação incrementalDesabilite-a (CARGO_INCREMENTAL=0) para uso de cache
Proc macros / build scriptsNem sempre cacheable
Versões diferentes de compiladorCache keys incluem o compilador

sccache vs Alternativas

AspectosccacheccacheBazel/Buck
LinguagensRust, C/C++, CUDAC/C++Muitas (sistema de compilação completo)
Cache compartilhadoBackends em nuvem integradosGeralmente localCache remoto/execução
SetupVar de env de wrapperWrapperAdotar novo sistema de compilação
Melhor paraAcelerar compilações existentesCaching local de C/C++Grandes monorepos

Pareia bem com mold — sccache corta tempo de compilação, mold corta tempo de ligação.

Recursos