CMAKE によるビルド自動化とテスト実行

photo by kitware

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の記法は独自のものであり、習得に時間がかかるのも事実です.