build-acceleration について
C/C++ 開発者とコーディングエージェント向けのビルド高速化スキルです。ボトルネックの診断、キャッシュ、分散コンパイル、コンパイル手法、インクルード整理、リンク時間の改善を扱います。
主な機能
- 01ビルドのボトルネック測定
- 02ccache と sccache の設定
- 03プリコンパイル済みヘッダーの利用
- 04Unity ビルドの有効化
- 05split-DWARF によるリンク時間短縮
- 06distcc と IWYU の利用
活用シーン
- 01変更のないファイルの再コンパイル時間削減
- 02大きく安定したヘッダーのコンパイル高速化
- 03複数マシンへのコンパイル分散
- 04デバッグ情報によるリンク負荷の軽減
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ mohitmishra786/ low-level-dev-skills --skill build-accelerationインストール後、Claude Code で/build-accelerationを入力して読み込まれたか確認します。
同梱ファイルreferences/ccache-config.md
詳細
ビルドの高速化
目的
キャッシュ(ccache/sccache)、分散コンパイル(distcc)、ユニティ/ジャンボビルド、プリコンパイル済みヘッダー、リンクを高速化する split-DWARF、IWYU によるインクルードの削減を活用して、C/C++ のビルド時間を短縮する方法をエージェントに案内します。
トリガー
- 「C++ のビルドが遅すぎます。どうすれば高速化できますか?」
- 「ccache/sccache はどう設定すればよいですか?」
- 「CMake ではプリコンパイル済みヘッダーはどのように機能しますか?」
- 「distcc で分散コンパイルを設定するにはどうすればよいですか?」
- 「split-DWARF を使ってリンク時間を短縮するにはどうすればよいですか?」
- 「コンパイルを遅くしているヘッダーを特定するにはどうすればよいですか?」
ワークフロー
1. まずボトルネックを診断する
# Time the full build
time cmake --build build -j$(nproc)
# Find the slowest TUs (CMake ≥3.16 with --profiling-output)
cmake -S . -B build -DCMAKE_CXX_FLAGS="-ftime-report"
cmake --build build 2>&1 | grep "Total" | sort -t: -k2 -rn | head -20
# Ninja build timings (use ninja -j1 for serial timing)
ninja -C build -j1 2>&1 | grep "^\[" | sort -t" " -k2 -rn | head -20
2. ccache — コンパイラキャッシュ
# Install
apt-get install ccache # Ubuntu/Debian
brew install ccache # macOS
# Check hit rate
ccache -s
# Configure cache size (default 5GB)
ccache -M 20G
# Invalidate cache if needed
ccache -C
CMake との連携(プレフィックスを使ったハックより推奨):
# CMakeLists.txt
find_program(CCACHE_PROGRAM ccache)
if(CCACHE_PROGRAM)
set(CMAKE_C_COMPILER_LAUNCHER ${CCACHE_PROGRAM})
set(CMAKE_CXX_COMPILER_LAUNCHER ${CCACHE_PROGRAM})
endif()
~/.config/ccache/ccache.conf の主なオプション:
max_size = 20G
compression = true
compression_level = 6
# For CI: share cache across jobs
cache_dir = /shared/ccache
3. sccache — クラウド対応キャッシュ(Rust、C/C++)
cargo install sccache
# Or: brew install sccache
# Set as compiler launcher
export RUSTC_WRAPPER=sccache # for Rust
export CMAKE_C_COMPILER_LAUNCHER=sccache # for CMake
# With S3 backend
export SCCACHE_BUCKET=my-build-cache
export SCCACHE_REGION=us-east-1
sccache --start-server
sccache --show-stats
4. プリコンパイル済みヘッダー(PCH)
PCH は大きなヘッダーを一度コンパイルし、そのバイナリ形式を再利用します。
# CMake ≥3.16 native PCH support
target_precompile_headers(mylib PRIVATE
<vector>
<string>
<unordered_map>
"myproject/common.h"
)
# Share PCH across targets (avoids recompilation)
target_precompile_headers(myapp REUSE_FROM mylib)
// Traditional: stdafx.h / pch.h approach
// All TUs include pch.h as the very first include
// pch.h includes heavy system headers
#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
PCH は、ヘッダーが大きく安定している場合(STL、Boost、Qt)に最も効果的です。頻繁に変更されるプロジェクトのヘッダーには PCH を使用しないでください。
5. ユニティ/ジャンボビルド
複数の .cpp ファイルを 1 つの TU にまとめることで、ヘッダーの解析にかかるオーバーヘッドを減らし、インライン化を改善します。
# CMake ≥3.16 unity build
set_target_properties(mylib PROPERTIES UNITY_BUILD ON)
# Control batch size (default 8 files per unity TU)
set_target_properties(mylib PROPERTIES UNITY_BUILD_BATCH_SIZE 16)
# Exclude specific files from unity (e.g., if they have ODR issues)
set_source_files_properties(problem.cpp PROPERTIES SKIP_UNITY_BUILD_INCLUSION ON)
手動で作成するユニティファイル:
// unity_build.cpp
#include "module_a.cpp"
#include "module_b.cpp"
#include "module_c.cpp"
注意点:匿名名前空間(各 TU に固有のものがあります)、ヘッダー内の using namespace、重複する静的変数。
6. split-DWARF — リンク時間を短縮する
split-DWARF はデバッグ情報を .dwo サイドカーファイルに分割し、リンカーが処理する量を大幅に減らします。
# GCC / Clang
gcc -g -gsplit-dwarf -o prog main.c
# CMake global
add_compile_options(-gsplit-dwarf)
# Combine .dwo files for distribution (optional)
dwp -o prog.dwp prog # GNU dwp tool
GDB の起動を高速化するには、--gdb-index と組み合わせます。
gcc -g -gsplit-dwarf -Wl,--gdb-index -o prog main.c
リンク時間の比較(一般的な大規模プロジェクト):完全な DWARF を使用する -g は、-gsplit-dwarf と比べてリンク時間が約 4~6 倍長くなります。
7. distcc — 分散コンパイル
# Install on all machines
apt-get install distcc
# Start daemon on worker machines
distccd --daemon --allow 192.168.1.0/24 --jobs 8
# Client: set DISTCC_HOSTS
export DISTCC_HOSTS="localhost/4 worker1/8 worker2/8"
make -j20 CC="distcc gcc"
# CMake integration
set(CMAKE_C_COMPILER_LAUNCHER distcc)
set(CMAKE_CXX_COMPILER_LAUNCHER distcc)
ccache と併用する場合:CC="ccache distcc gcc" — ccache がまずローカルキャッシュを確認し、見つからない場合は distcc にフォールバックします。
8. IWYU によるインクルードの削減
# Install
apt-get install iwyu
# Run via CMake
cmake -S . -B build -DCMAKE_CXX_INCLUDE_WHAT_YOU_USE=iwyu
cmake --build build 2>&1 | tee iwyu.log
# Apply fixes automatically
fix_include < iwyu.log --nosafe_headers
IWYU のワークフロー全体については、skills/build-systems/include-what-you-use を参照してください。
ccache の設定オプションについては、references/ccache-config.md を参照してください。
関連スキル
- CMake プロジェクトの構成には、
skills/build-systems/cmakeを使用します - IWYU によるヘッダーの削減には、
skills/build-systems/include-what-you-useを使用します - Rust 固有のビルド高速化には、
skills/rust/rust-build-timesを使用します - split-DWARF の内部仕様については、
skills/debuggers/dwarf-debug-formatを使用します