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


# はじめに

簡単な設定ファイル(CMakeLists.txt)を書くだけでMakefileを生成してくれるcmakeはとても便利なものだけど、いまいち初心者には敷居が高い。
 [チュートリアル](http://opencv.jp/cmake/cmake_tutorial.html)はあるけど、肝心なことが書いてなかったりもする。

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

# 例題用コード

画面に800x600の白いウインドウを表示するだけのX11ライブラリを使った簡単なプログラムを用意した。
閉じるボタンを押しても死なないのはご愛嬌。

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

# CMakeLists.txt を書く

`cmake`を使うためにはCMakeLists.txtを記述する必要がある。
上記のソースコードと同じディレクトリに以下のCMakeLists.txtを作成する。
（ディレクトリ名はtest_projectである必要はない）

```cmake: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_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を生成する。

```sh:
$ cmake .
```

後ろのピリオド（カレントディレクトリを指定）を忘れずに。
あとは`make`を実行すれば、カレントディレクトリに`create_window`というバイナリができる。

# 使用可能なパッケージを知るには
上記では使用するパッケージとしてX11を指定した。
使用できるパッケージの一覧は`cmake`のモジュール一覧で確認できる。

```sh:
$ cmake --help-module-list | grep -e '^Find'
```

さらにモジュールの詳細を以下のコマンドで確認できる。

```sh:
$ 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に以下のように記載する。

```cmake: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

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

```cmake:CMakeLists.txt
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O0 -g")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O0 -g")
```

または

```cmake: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

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

利用例

```cmake:CMakeLists.txt
find_package(PkgConfig)
pkg_check_modules(SQLITE3 REQUIRED sqlite3)
target_link_libraries(sqlite3_test ${SQLITE3_LIBRARIES})
```

参照

```sh
$ cmake --help-module FindPkgConfig
```

### PKG_CONFIG_PATHを設定する

#### cmake 3.1未満

```cmake
set(ENV{PKG_CONFIG_PATH} "$ENV{PKG_CONFIG_PATH}:/path/to/pkgconfig")
```

#### cmake 3.1以降

```cmake
set(PKG_CONFIG_PATH ${PKG_CONFIG_PATH}　/path/to/pkgconfig)
```

## オプションをコマンドラインで設定したい

例えば`GLFW_USE_EGL`というオブションを`ON`にしたい場合

```sh
$ cmake -DGLFW_USE_EGL=ON .
```

参照
http://stackoverflow.com/questions/5998186/cmake-adding-command-line-options