はじめに
簡単な設定ファイル(CMakeLists.txt)を書くだけでMakefileを生成してくれるcmakeはとても便利なものだけど、いまいち初心者には敷居が高い。
チュートリアルはあるけど、肝心なことが書いてなかったりもする。
この文章ではライブラリを使ったお試しコード用のMakefileをcmakeで簡単に作ることを目指す。
例題用コード
画面に800x600の白いウインドウを表示するだけのX11ライブラリを使った簡単なプログラムを用意した。
閉じるボタンを押しても死なないのはご愛嬌。
CMakeLists.txt を書く
cmake
を使うためにはCMakeLists.txtを記述する必要がある。
上記のソースコードと同じディレクトリに以下のCMakeLists.txtを作成する。
(ディレクトリ名はtest_projectである必要はない)
cmake_minimum_required(VERSION 2.8)
project (test_project)
add_executable(create_window create_window.c)
find_package(X11 REQUIRED)
target_link_libraries(create_window ${X11_LIBRARIES})
3行目のadd_executable
はcreate_window
という実行形式の作成とそれにcreate_window.cというファイルが必要であることが記載されている。
4行目のfind_package
はビルドに必要なX11パッケージを使用する旨が記載されている。
5行目のtarget_link_libraries
にはcreate_window
のリンクに必要なライブラリが記載されている。2番目の引数X11_LIBRARIES
は4行目のfind_package
の際に取り込まれた変数で、X11ライブラリ一覧が記載されている。
CMakeLists.txtが書けたら同じディレクトリでcmake
を実行してMakefileを生成する。
$ cmake .
後ろのピリオド(カレントディレクトリを指定)を忘れずに。
あとはmake
を実行すれば、カレントディレクトリにcreate_window
というバイナリができる。
使用可能なパッケージを知るには
上記では使用するパッケージとしてX11を指定した。
使用できるパッケージの一覧はcmake
のモジュール一覧で確認できる。
$ cmake --help-module-list | grep -e '^Find'
さらにモジュールの詳細を以下のコマンドで確認できる。
$ cmake --help-module FindX11
cmake version 2.8.12.2
FindX11
Find X11 installation
Try to find X11 on UNIX systems. The following values are defined
X11_FOUND - True if X11 is available
X11_INCLUDE_DIR - include directories to use X11
X11_LIBRARIES - link against these to use X11
(snip)
パッケージにないライブラリを使用するには
パッケージにないライブラリ(例えばlibEGL.so)を使用するにはCMakeLists.txtに以下のように記載する。
find_library(EGL_LIBRARY NAMES EGL)
target_link_libraries(create_window ${X11_LIBRARIES} ${EGL_LIBRARY})
正式な方法としては自前パッケージ(FindEGL.cmake)を作成する方法がある。それについては以下を参照。
http://www.cmake.org/Wiki/CMake:How_To_Find_Libraries
デバッグフラグを設定する
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O0 -g")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O0 -g")
または
set_target_properties(create_window PROPERTIES COMPILE_FLAGS "-O0 -g")
さらに学ぶには
cmakeのチュートリアルがおすすめ。
本家: http://www.cmake.org/cmake/help/cmake_tutorial.html
日本語版: http://opencv.jp/cmake/cmake_tutorial.html
FAQ
複数の実行形式を作りたい。また実行形式毎に#define
の設定をおこないたい
add_executable(myAppV1 main.cpp)
add_executable(myAppV2 main.cpp)
set_target_properties(myAppV1 PROPERTIES COMPILE_DEFINITIONS "BUILDTYPE=1")
set_target_properties(myAppV2 PROPERTIES COMPILE_DEFINITIONS "BUILDTYPE=2")
pkg-configを使いたい
CMakeLists.txt
内でfind_package(PkgConfig)
を呼ぶことによってpkg_check_modules
コマンドを利用することができる。
このコマンドはpkg-config
を呼び出し、その結果を利用する。
利用例
find_package(PkgConfig)
pkg_check_modules(SQLITE3 REQUIRED sqlite3)
target_link_libraries(sqlite3_test ${SQLITE3_LIBRARIES})
参照
$ cmake --help-module FindPkgConfig
PKG_CONFIG_PATHを設定する
cmake 3.1未満
set(ENV{PKG_CONFIG_PATH} "$ENV{PKG_CONFIG_PATH}:/path/to/pkgconfig")
cmake 3.1以降
set(PKG_CONFIG_PATH ${PKG_CONFIG_PATH} /path/to/pkgconfig)
オプションをコマンドラインで設定したい
例えばGLFW_USE_EGL
というオブションをON
にしたい場合
$ cmake -DGLFW_USE_EGL=ON .
参照
http://stackoverflow.com/questions/5998186/cmake-adding-command-line-options