OpenCVをソースからビルドしようとしたらCMakeが使われていたのですが、全然使い方がわからなかったので、少しだけ調べました。CMakeはビルド環境を作る為のツールで、CMakeFiles.txtにビルド条件を記述しておけば、環境に応じてビルド環境を自動生成してくれるというものです。具体的にはLinux上ではMakefileを、Mac上ではXcodeのプロジェクトファイルを、Windows上ではVisualStudioのプロジェクトファイルを自動生成してくれます。
クロスプラットフォームなプログラムを書く際に、ソースコード互換さえ取れていれば、わざわざ環境ごとにビルド環境を作らなくても良くなりますので便利だということですね。
実際に以下のコードをCMakeを使ってビルドしてみる事にします。
#include
using namespace std;
int main(int argc, char** argv) {
cout < < "hello cmake world" << endl;
}
まずCMakeを使う為にCMakeFiles.txtを作成します。以前調べたAutotoolsで言うところのconfigure.acファイルに相当します。まだ書き方を理解してないのですが、以下の三行が必須項目のようです。依存モジュールの確認やヘッダの検索パスの追加、リンクするライブラリの設定などもこのファイルに対して行います。これでCMakeを使う準備はOKなので簡単ですね。Emacsを使っている方はcmake-modeがあるので入れておくと編集が楽です。
CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
PROJECT(cmake_test)
ADD_EXECUTABLE(test main.cpp)
早速ビルドしてみます。
$ ls
CMakeLists.txt main.cpp
# ビルド用のディレクトリを作成
$ mkdir build
$ ls
CMakeLists.txt build main.cpp
$ cd build
# cmake 実行 -Gでターゲット環境を指定。ここではUnix Makefilesを指定。最後にCMakeLists.txtを置いたディレクトリを指定
$ cmake -G "Unix Makefiles" ..
-- The C compiler identification is GNU
-- The CXX compiler identification is GNU
-- Checking whether C compiler has -isysroot
-- Checking whether C compiler has -isysroot - yes
-- Checking whether C compiler supports OSX deployment target flag
-- Checking whether C compiler supports OSX deployment target flag - yes
-- Check for working C compiler: /usr/bin/gcc
-- Check for working C compiler: /usr/bin/gcc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Checking whether CXX compiler has -isysroot
-- Checking whether CXX compiler has -isysroot - yes
-- Checking whether CXX compiler supports OSX deployment target flag
-- Checking whether CXX compiler supports OSX deployment target flag - yes
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Configuring done
-- Generating done
-- Build files have been written to: /Users/taichino/Documents/test/cmake_test/proj1/build
# 無事Makefileができてる。(Makefile以外にも中間ファイルが色々できてる)
$ ls
CMakeCache.txt CMakeFiles Makefile cmake_install.cmake
# Makefileを使ってビルド
$ make
Scanning dependencies of target test
[100%] Building CXX object CMakeFiles/test.dir/main.cpp.o
Linking CXX executable test
[100%] Built target test
# 生成されたプログラムを実行
$ ./test
hello cmake world
無事にビルド・実行されましたね。cmake --helpを見れば-Gで使用可能なオプションを一覧できますので色々試してみると良いと思います。
なおcmakeを実行すると中間ファイルがたくさん生成されますが、それを削除する方法がcmakeにはありません。なのでビルド用のディレクトリを作成しておくと、削除が楽にできて良いと思います。(僕が見つけられてないだけかもです。間違っていたら教えてください。)
ところでUnix Makefilesを指定して生成されるMakefileにはedit_cacheという便利なアクションが存在します。実行するとビルド時に渡されるオプション一覧が設定値とともに表示され、編集できるようになっています。対象のプロジェクトにはどんなオプションがあって、どう設定すれば良いのかわからないという状態によく陥りますが、この機能を使えば何となく試行錯誤はできるので精神的にはかなり楽ですね。
以上、本当に触りだけですがCMakeを使ってみました。クロスプラットフォームなプログラムには非常に興味があるので少しずつ覚えていきたいです。あとネット上に英語も含めてあまり情報がなかったのですが、ここのチュートリアルがわかりやすかったです。