本文を読み飛ばす

cmakeコマンドでのビルド・クリーン・テスト

CMake は、Makefile や Visual Studio プロジェクトといったビルドツール用ファイル群を生成するだけでなくコンパイルや単体テストの実行もできる。もちろん makemsbuild コマンドでビルドも単体テスト実行もできるのだけれど、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.txtadd_executable()add_library() 等で宣言した名前を指定すると、そのプログラムを(依存する他プログラムもビルドしつつ)ビルドする。また cmake は自動的に allclean という名前のターゲットを生成してくれ、前者を指定すると 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 かの指定が必須になるので注意が要る。