cmakeコマンドでのビルド・クリーン・テスト
CMake は、Makefile や Visual Studio プロジェクトといったビルドツール用ファイル群を生成するだけでなくコンパイルや単体テストの実行もできる。もちろん make
や msbuild
コマンドでビルドも単体テスト実行もできるのだけれど、cmake コマンドから行うと各ビルドツールのコマンドラインオプションを忘れても良いため、Linux と Windows を行ったり来たりしながら開発する場合などは少し脳ミソの負担が軽減される。また、地味ながらリリースビルド時に msbuild
の長ったらしいコマンドラインオプションを打たずに済むのもメリットかもしれない。あと、単純に実行するだけなら単体テストランナーの実行ファイルを直接指定して実行する必要が無いため、単体テストランナーの出力パス等を忘れられる点もメリットかもしれない。
以下、もう少し詳細に書いておく:
目次
動作確認環境 {#preconditions}
- Windows 10 Pro
- CMake 3.8.0
- Visual Studio 2015 Update 3
- Linux (CentOS 6.9)
- CMake 2.8.12
- GCC 4.4.7 / GNU Make 3.81
- Linux (Ubuntu 16.04)
- CMake 3.5.1
- Clang 3.8.0 / Ninja 1.5.1
ビルド {#build}
Visual Studio 風に、Debug ビルドと Release ビルドを区別して開発していくスタイルを前提にすると、ビルド用の cmake
コマンドの Usage は次のような感じになる:
cmake --build DIRECTORY [--target {all|clean|test|...}] [--config {debug|release}] [--clean-first]
--build
オプションには、ビルドスクリプトを生成するために cmake コマンドを実行したディレクトリを指定する。たいてい「.
」になると思う。自分の場合はソースツリーのルートに build
というディレクトリを作り、その中で cmake することを好むので、次のようにビルドする感じになる:
cd /path/to/your/project/src/ mkdir build cd build cmake .. cmake --build .
--target
オプションに指定する値は、Unix Makefile でいうターゲットと同じで、 CMakeLists.txt
の add_executable()
や add_library()
等で宣言した名前を指定すると、そのプログラムを(依存する他プログラムもビルドしつつ)ビルドする。また cmake は自動的に all
と clean
という名前のターゲットを生成してくれ、前者を指定すると CMakeLists.txt に書かれた全ターゲットをビルド、後者を指定するとビルドで生成された中間ファイル等を削除してくれる。さらに、enable_testing()
や add_test()
で CMake での単体テスト機能を有効化してある場合、test
というターゲットも自動的に生成される。こちらを指定してビルドすると、単体テストを実行できる。なお、--target
省略時は all
が指定されたものと解釈されて全ターゲットがビルドされる。
--config
オプションに指定する値は、debug
を指定すればデバッグビルド、release
を指定すればリリースビルドを行う。指定を省略するとデバッグビルドが行われる。
--clean-first
オプションを指定すると、まずターゲット clean
でビルドした後に、指定されたターゲットのビルドを開始する。つまり、いわゆる「リビルド」を行う。
クリーンとリビルド {#clean-and-rebuild}
「ビルド」の章ですでに書いた通り、ターゲットとして clean
を指定すればビルドで生成された中間ファイル等を削除できる。たとえば:
cmake --build . --target clean
リビルドは普通のビルド用のコマンドラインに --clean-first
オプションを追加すれば良い。たとえば:
cmake --build . --clean-first
なお、クリーンを行う目的がリビルドではなくゴミファイルの削除であれば、個人的には .gitignore
を適切に設定した上で git clean -fdx
を実行する方が好みだったりする。余談だけれど、これは少々怖いコマンドなので、慣れるまでは git clean -ndx
(-f
の代わりに -n
)で削除されるファイルを確認してから実行するようにした方が良いと思う。
テスト {#test}
単体テストの実行にはターゲット test
を指定してビルドすれば良い。たとえば:
cmake --build . --target test
また、単体テストの実行用には ctest
という別のコマンドも使える。こちらの Usage は、開発時に使う機能で最低限必要な部分に絞ると次のような感じになる:
ctest [-C {debug|release}]
Visual Studio 用プロジェクトを生成した場合、Debug か Release かの指定が必須になるので注意が要る。