Ccache によるビルド高速化#
Ccache
は、C/C++ のコンパイル時に生成されるオブジェクトファイルをキャッシュして、同じ条件によるコンパイルの処理をなくすことにより、リビルドの時間を短くすることができるツールである。ソースコードと #include
で読み込まれるヘッダの内容をもとにキャッシュを作るため、環境を作り直したりしてソースコードやヘッダのタイムスタンプが変化しても、ファイルの内容自体が変わっていなければキャッシュが使われるようになっている。そのため、CI における C/C++ のビルドを高速化するのに活用できる。
なお、今回試したコンパイル時間が長い numerical-collection-cpp リポジトリでは、リビルドを 40 倍高速化できた [1] 。
インストール方法#
Ubuntu 上では、apt install ccache
コマンドでインストールできる。また、公式ホームページでは Windows 用のバイナリも用意されている。
設定#
ここで、今回 ccache を使用した際に調整した設定項目を列挙しておく。なお、いずれも環境変数で設定する。
CCACHE_DIR
キャッシュを保存するディレクトリ。
CCACHE_COMPILERCHECK
コンパイラが同一かどうかをチェックする方法を指定する。デフォルトではタイムスタンプが使用されるが、 Docker コンテナや CI 環境で使用する場合はタイムスタンプよりもコンパイラのバイナリによる比較を行う
content
の方が都合が良い。(Docker コンテナを作り直しても、コンパイラが完全に一致すれば同じコンパイラとして扱う。)
CMake への適用#
CMake でビルドを行う場合、
CMAKE_C_COMPILER_LAUNCHER
, CMAKE_CXX_COMPILER_LAUNCHER
という 2 つの変数に ccache
コマンドを指定することで、
Ccache を適用できる。
Visual Studio の場合#
GCC, Clang を使用する場合は上記だけで良いが、
Visual Studio を使用する場合は少し工夫が必要となる。
CMake に指定する generator として Visual Studio を指定すると
CMAKE_C_COMPILER_LAUNCHER
, CMAKE_CXX_COMPILER_LAUNCHER
の設定が無視される。しかし、以下の例のように Visual Studio のコンパイラの情報を読み込むスクリプトを実行してから
generator として Ninja を指定して cmake コマンドを実行すると設定が反映される
[2] 。
call "C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\BuildTools\\VC\\Auxiliary\\Build\\vcvarsall.bat" x86_x64
cmake .. ^
-G Ninja ^
-DCMAKE_CXX_COMPILER_LAUNCHER=ccache ^
-DCMAKE_TOOLCHAIN_FILE=..\vcpkg\scripts\buildsystems\vcpkg.cmake ^
-DCMAKE_BUILD_TYPE=Release
cmake --build . --config Release --parallel
Caution
1 行目の処理は power shell でなくコマンドプロンプトを使用するバッチファイルにおいてしか実行できない。
See also
Footnotes