CMake
X11

cmake チュートリアルを読む前に

More than 3 years have passed since last update.


はじめに

簡単な設定ファイル(CMakeLists.txt)を書くだけでMakefileを生成してくれるcmakeはとても便利なものだけど、いまいち初心者には敷居が高い。

チュートリアルはあるけど、肝心なことが書いてなかったりもする。

この文章ではライブラリを使ったお試しコード用のMakefileをcmakeで簡単に作ることを目指す。


例題用コード

画面に800x600の白いウインドウを表示するだけのX11ライブラリを使った簡単なプログラムを用意した。

閉じるボタンを押しても死なないのはご愛嬌。

https://gist.github.com/maueki/40c6641a3815388246e7


CMakeLists.txt を書く

cmakeを使うためにはCMakeLists.txtを記述する必要がある。

上記のソースコードと同じディレクトリに以下のCMakeLists.txtを作成する。

(ディレクトリ名はtest_projectである必要はない)


CMakeLists.txt

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_executablecreate_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に以下のように記載する。


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


デバッグフラグを設定する


CMakeLists.txt

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O0 -g")

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O0 -g")

または


CmakeLists.txt

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の設定をおこないたい

http://stackoverflow.com/questions/9989574/how-to-build-a-program-with-2-different-values-of-a-variable-in-cmake


CMakeLists.txt

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を呼び出し、その結果を利用する。

利用例


CMakeLists.txt

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