sccache

キャッシュライブラリコンパイラキャッシュ分散ビルドRustMozilla

キャッシュライブラリ

sccache

概要

sccacheは、Mozillaが開発したccacheライクなコンパイラキャッシュツールです。コンパイル結果をキャッシュし、同じコードの再コンパイルを高速化します。

詳細

sccache(Shared Compilation Cache)は、C/C++、Rust、その他の言語のコンパイララッパーとして動作し、コンパイル結果をキャッシュして開発効率を大幅に向上させます。従来のccacheと異なり、リモートストレージ(Redis、S3、GCS、Memcachedなど)への分散キャッシュをサポートし、チーム全体でコンパイルキャッシュを共有できます。特にRustプロジェクトでの使用に最適化されており、Cargoとの統合も簡単です。ローカルキャッシュとリモートキャッシュの両方をサポートし、CI/CD環境での高速ビルドを実現します。

メリット・デメリット

メリット

  • 高速コンパイル: 同じコードの再コンパイルを劇的に高速化
  • 分散キャッシュ: チーム全体でコンパイルキャッシュを共有
  • 多言語対応: C/C++、Rust、その他の言語をサポート
  • 豊富なストレージ: Redis、S3、GCS、Memcachedなど多様なバックエンド
  • CI/CD最適化: 継続的インテグレーション環境での高速ビルド
  • 設定の柔軟性: ローカルとリモートキャッシュの使い分けが可能

デメリット

  • 初期設定: 分散環境の構築には設定が複雑
  • ストレージ依存: リモートキャッシュはストレージサービスが必要
  • 互換性: 一部のコンパイラオプションでは制限あり
  • デバッグ: キャッシュミスの原因分析が困難な場合がある

主要リンク

書き方の例

基本的な使用方法

# sccacheのインストール
brew install sccache  # macOS
scoop install sccache  # Windows
cargo install sccache --locked  # ソースから

# 基本的なコンパイルコマンド
sccache gcc -o program.o -c program.c

# sccacheサーバーの起動と停止
sccache --start-server
sccache --stop-server

# キャッシュ統計の確認
sccache --show-stats

Rustプロジェクトでの設定

# ~/.cargo/config.toml
[build]
rustc-wrapper = "/path/to/sccache"

# または環境変数で設定
export RUSTC_WRAPPER=/path/to/sccache
cargo build

CMakeプロジェクトでの設定

# CMakeLists.txt
find_program(SCCACHE sccache REQUIRED)
set(CMAKE_C_COMPILER_LAUNCHER ${SCCACHE})
set(CMAKE_CXX_COMPILER_LAUNCHER ${SCCACHE})

# MSVC使用時の追加設定
set(CMAKE_MSVC_DEBUG_INFORMATION_FORMAT Embedded)
cmake_policy(SET CMP0141 NEW)

設定ファイルの例

# ~/.config/sccache/config
[cache.disk]
dir = "/tmp/.cache/sccache"
size = 7516192768  # 7 GiB

[cache.redis]
endpoint = "redis://127.0.0.1:6379"
expiration = 3600
key_prefix = "/sccache"

[cache.s3]
bucket = "my-build-cache"
endpoint = "s3-us-east-1.amazonaws.com"
key_prefix = "sccache"

分散キャッシュ設定

# client config
[dist]
scheduler_url = "https://cache-scheduler.example.com"
toolchain_cache_size = 5368709120

[dist.auth]
type = "token"
token = "your-auth-token"

# server config
[builder]
type = "overlay"
build_dir = "/tmp/build"
bwrap_path = "/usr/bin/bwrap"

環境変数での設定

# キャッシュサイズの設定
export SCCACHE_CACHE_SIZE="10G"

# プリプロセッサキャッシュモード
export SCCACHE_DIRECT=true

# ローカルキャッシュを読み取り専用に
export SCCACHE_LOCAL_RW_MODE=READ_ONLY

# デバッグログの有効化
export SCCACHE_LOG=debug
export SCCACHE_ERROR_LOG=/tmp/sccache.log

GitHub Actionsでの使用

# .github/workflows/build.yml
- name: Configure sccache
  uses: actions/github-script@v7
  with:
    script: |
      core.exportVariable('ACTIONS_RESULTS_URL', process.env.ACTIONS_RESULTS_URL || '');
      core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env.ACTIONS_RUNTIME_TOKEN || '');

- name: Build with cache
  run: |
    export RUSTC_WRAPPER=sccache
    cargo build --release
  env:
    SCCACHE_GHA_ENABLED: "on"