CMAKE によるビルド自動化とテスト実行
CMAKE とは
CMAKE はプラットフォームに依存しないビルド方法を記述するためのツールキットです.CMAKE独自の書式で書かれたビルド記述をcmake コマンドに渡すと、MakefileやVisualStudio,Xcodeのプロジェクトファイルを生成してくれます.
つまり、一度CMAKE でビルド方法を書けば、あらゆるプラットフォームでプログラムをビルドできるわけです.
CMAKEを試してみる
以下の様なツリー構成のライブラリプログラムでCMAKE を用いたビルド・テスト環境を作成してみました.
cmake ├── krmalloc │ └── krmalloc.c └── krmalloc_test └── krmalloc_test.c
krmalloc.c はライブラリコードです.このソースコードを元にlibkrmalloc.c を作成したいです.krmalloc_test.c はkrmalloc のテストコードです.
krmalloc はK&R のC言語本 に記載のmalloc関数の実装を真似たものです.ここでは中身には触れません.
ソースツリーのトップ(cmakeディレクトリ)でビルドとテストを実行できるようにすることを目的とします.今回の環境はLinux で、CMAKEコマンドからMakefile を出力するようにします.
CMAKE のインストール
CMAKEのインストールはソースコードからインストールする方法とバイナリを取得する方法があります.
私の環境Ubuntu13.04 では$ sudo apt-get install cmake
で簡単にインストールすることが出来ました.
ソースツリーのトップのCMakeLists.txt
まずはソースツリーのトップにCMakeLists.txt を置きます.中身は以下のようになります.
# このバージョン以上のCMAKEを使うよう宣言 cmake_minimum_required(VERSION 2.8.1) # プロジェクト名 project(cmakesample C) # バージョン番号 set(serial "1.0.0") # テストを有効にする.CTestによるテスト実行が可能になる enable_testing() # サブディレクトリを指定.指定したディレクトリ内のCMakeLists.txt が実行される add_subdirectory(krmalloc) add_subdirectory(krmalloc_test) # テストの登録.krmalloc_testディレクトリの krmalloc_test バイナリを # 'test01'として登録する. add_test(test01 krmalloc_test/krmalloc_test)
krmalloc ディレクトリのCMakeLists.txt
krmalloc ディレクトリのCMakeLists.txtを以下のように書きます.
# このバージョン以上のCMAKEを使うよう宣言 cmake_minimum_required(VERSION 2.8.1) # プロジェクト名.C言語であることを宣言 project(cmakesample C) # リリースビルドのためのコンパイラオプション set(CMAKE_C_FLAGS_RELEASE "-Wall -Wextra -O2") # デバッグビルドのためのコンパイラオプション set(CMAKE_C_FLAGS_DEBUG "-Wall -Wextra -g") # ライブラリの作成を指示.SHARED で共有ライブラリ. # krmalloc.c を元に、libkrmalloc.so という名前で作成される. add_library(krmalloc SHARED krmalloc.c)
add_library を複数書くことにより、ライブラリに複数のソースコードを含めることができます.
デバッグとリリースの切り替えはcmake コマンドの引数によって行います. 詳しくはコマンドの説明の部分で書きます.
krmalloc_test ディレクトリのCMakeLists.txt
krmalloc_test ディレクトリのCMakeLists.txtを以下のように書きます.内容はkrmalloc のCMakeLists.txt と同じです.
cmake_minimum_required(VERSION 2.8.1) project(cmakesample C) # build options for release set(CMAKE_C_FLAGS_RELEASE "-Wall -Wextra -O2") # build options for debug set(CMAKE_C_FLAGS_DEBUGE "-Wall -Wextra -g") link_directories(../krmalloc) add_executable(krmalloc_test krmalloc_test.c) target_link_libraries(krmalloc_test krmalloc)
ビルドを行う
最終的にツリーは以下のような構成になりました.
cmake ├── CMakeLists.txt ├── krmalloc │ ├── CMakeLists.txt │ └── krmalloc.c └── krmalloc_test │ ├── CMakeLists.txt └── krmalloc_test.c
ここまで準備ができればビルドを行うことができます.
$ cd cmake $ cmake . # '.' を忘れないように! $ make $ make test
これでテストまで実行されるはずです.
デバッグモードでビルドするためにはcmake コマンド部分以下のようにします.
$ cmake -DCMAKE_BUILD_TYPE=Debug .
まとめ
クロスプラットフォーム環境向けビルドツールのCMAKEを試しました.
一度書くだけで、ソースツリーをあらゆる環境でビルドできるのは非常に頼もしいです.一方で、CMAKEの記法は独自のものであり、習得に時間がかかるのも事実です.