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

  • 62
    いいね
  • 1
    コメント
この記事は最終更新日から1年以上が経過しています。

はじめに

簡単な設定ファイル(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