CMake とは何か? クロスプラットフォームの build システムを解説
CMake は C と C++ 向けのクロスプラットフォームな build システムジェネレーターで、build を一度記述するだけで、多くのプラットフォームとコンパイラ向けのネイティブな build ファイルを生成します。
C と C++ のプロジェクトは、多くのコンパイラやオペレーティングシステムで build する必要があります。CMake は、build を CMakeLists.txt で抽象的に記述し、対象とする任意の toolchain 向けにネイティブな build ファイル(Makefile、Ninja、Visual Studio プロジェクト)を生成できるようにすることで、これを解決します。
CMake とは
CMake はメタ build システムです。直接 build するのではなく、選択した backend(Unix Makefiles、Ninja、MSVC、Xcode)向けの build ファイルを生成します。target、source、依存関係、オプションを CMakeLists.txt に記述すると、CMake がプラットフォームのネイティブなツールで動作する build を生成します。
configure と build
CMake の build には 2 つのフェーズがあります。configure ステップは CMakeLists.txt を読み取り、コンパイラと依存関係を検出し、build ディレクトリに build ファイルを生成します。次に build ステップが、選択した backend を実行してコンパイルします。設定を build から分離することで、ソースツリーがクリーンに保たれ、out-of-source build がサポートされます。
使用例
build ディレクトリに configure し、それを build します。
# configure (generate build files)
cmake -S . -B build
# build using the generated files
cmake --build buildCI/CD での役割
CI では、CMake は runner のプラットフォームとコンパイラをまたいで C/C++ プロジェクトを一貫して configure および build し、その後しばしば CTest 経由でテストを実行します。実行間で build ディレクトリとコンパイル済みオブジェクトを cache し(そして ccache を使い)、変更のないコードの再コンパイルを避けます。C/C++ の build は CPU 負荷が高いため、warm な cache を備えたより高速なマネージド runner 上で実行し、不安定なダウンロードには auto-retry を用いることで CI 時間を削減できます。
代替ツール
Meson は、より新しくシンプルな build システムジェネレーターで、人気を集めています。Bazel は、強力な cache を備え、大規模で多言語な C/C++ monorepo を扱います。素の Make は小規模なプロジェクトに向いています。CMake は、ポータブルな C および C++ の build における事実上の標準です。
重要なポイント
- CMake は多くのコンパイラやプラットフォーム向けにネイティブな build ファイルを生成する。
- configure ステップと実際の build ステップを分離する。
- CI では build ディレクトリを cache し、ccache を使って C/C++ の build を高速化する。