CMake の情報と 3.1.0 での変更点

## はじめに

みなさん、こんにちは。CMake Advent Caldendar 2014 もついに最終日となりました。最後は、CMake に関する情報を集める上で、どこを見たらいいのか、などについて書いていきます。また、CMake 3.1.0 での変更点についても触れます。

## 情報源

CMake は、英語圏を含めてもWeb・書籍ともにまとまった情報が少ないです。ここでは、CMake のまとまった情報が載っているものを記します。

### Web

基本的に、公式リファレンスをみることになると思いますが、下記のWebサイトがあります。

#### [CMake Reference Documentation — CMake 3.0.2 Documentation](http://www.cmake.org/cmake/help/v3.0/)

言わずと知れた公式リファレンス。当然の事ながらここが一番詳しいです。しかし、リファレンスであるので具体的にその機能をどう使えばいいのかがよく分かりませんし、英語ですので読むのが大変です。

#### [CMake - KitwarePublic](http://www.cmake.org/Wiki/CMake)

こちらも、CMake の公式Wikiページとなります。チュートリアルから、CMake で eval を実装する方法など幅広く記載されています。英語です。

#### [CMake チュートリアル — Cmake-Tutorial](http://opencv.jp/cmake/cmake_tutorial.html)

CMake の導入からプロジェクトの作成方法が載っているチュートリアルです。数少ない日本語のまとまった情報です。しかし、あまり高度なことは載っていません。

#### [CMake Manual | Qt 5.4](http://doc.qt.io/qt-5/cmake-manual.html)

CMake での Qt 5 アプリケーションのビルドについて解説されています。英語です。

### 書籍

書籍は、Web以上に情報が少なく、残念ながら日本語の書籍は一冊もありません。かといって英語圏でも確認できたのは3冊だけで、評判等を見ると、結局下記に示す1冊しかありませんでした。

#### [Mastering CMake](http://www.kitware.com/products/books/CMakeBook.html)

CMake 開発元の Kitware が出している CMake の書籍です。内容は見ていませんが、600 ページほどある大型本です。Amazon から購入することができます。

[Mastering CMake: Ken Martin, Bill Hoffman: 9781930934269: Amazon.com: Books](http://www.amazon.com/dp/1930934262/ref=as_sl_pd_tf_lc?tag=kitinc-20&camp=14573&creative=327641&linkCode=as1&creativeASIN=1930934262&adid=0WEMGCZ93P4TERGZDXQJ&&ref-refURL=http://www.kitware.com/products/books/CMakeBook.html)

## コマンドなどの使用方法の調査

このコマンドは具体的にどうやって使うんだろう――そう思って Google で調べたのにまともにヒットしない、そんなことありませんか？こんなときは、GitHub で検索するとよいでしょう。

まずは、GitHub にアクセスしましょう。そして、検索フォームに`extension:cmake <調べたいコマンドなど>`と入力します。そうすると、そのコマンド等を利用したコードがヒットします。以下は、`file(DOWNLOAD)`コマンドについて調査したものです。Google で検索した時と違い、具体的な例が出てきました。リファレンスを読んでもよくわからない場合に活用するとよいでしょう。

<b style="font-size: 110%;">[extension:cmake file download](https://github.com/search?utf8=✓&q=extension:cmake+file+download&type=Code&ref=searchresults)</b>

![cmake_information_github-search.png](https://qiita-image-store.s3.amazonaws.com/0/20400/eb49ebed-2ab3-0beb-60ae-7bb79feea651.png)


## CMake 3.1.0 での変更点

さて、この Advent Calendar では、基本的に CMake 3.0.2 を対象としていましたが、途中で CMake 3.1.0 が正式リリースされました。ここでは、その変更点についてすこし触れていきます。

### ビルドシステム

Visual Studio 14 2015 に対応しました。また、Windows Phone のプロジェクト、NVIDIA Nsight Tegra のプロジェクトにも対応したようです。

### 言語仕様

変数参照に使用できる文字が英数字・`/`・`_`・`.`・`+`・`-`に加えて、エスケープしたものも使用できるようになりました。例えば、以下は、CMake 3.0.2 ではエラーになりますが、CMake 3.1.0 では問題なく使用できます。

```cmake
cmake_minimum_required(VERSION 3.0.2)
set(a_b.c/d-e+f 1)
message("${a_b.c/d-e+f}") # 1
set(a_b.c/d-e+f\[ 1)        # エラー
message("${a_b.c/d-e+f\[}") # エラー

cmake_minimum_required(VERSION 3.1.0)
set(a_b.c/d-e+f 1)
message("${a_b.c/d-e+f}") # 1
set(a_b.c/d-e+f\[ 1)
message("${a_b.c/d-e+f\[}") # 1
```

また、それに合わせてエスケープシーケンスが拡張され、任意の記号に対して行えるようになりました。

> ```
> escape_sequence  ::=  escape_identity | escape_encoded | escape_semicolon
> escape_identity  ::=  '\' <match '[^A-Za-z0-9;]'>
> escape_encoded   ::=  '\t' | '\r' | '\n'
> escape_semicolon ::=  '\;'
> ```
> <cite>[cmake-language(7) — CMake 3.1.0 Documentation, Escape Sequences](http://www.cmake.org/cmake/help/v3.1/manual/cmake-language.7.html#escape-sequences)</cite>

これらは、ポリシー[CMP0053](http://www.cmake.org/cmake/help/v3.1/policy/CMP0053.html)で管理されており、`OLD`に設定することによって、CMake 3.0.2 の動作にすることができます。

### コマンド

#### string

`GENEX_STRIP`と`UUID`サブコマンドが追加されました。`GENEX_STRIP`は文字列から Generator Expressions を削除します。`UUID`は UUID を生成しますが、よくあるランダムな値を生成するためのもの(UUID Version 1)ではなく、あるタイプの値に紐付けるためのIDを生成するためのもの(UUID Version 3、UUID Version 5)です。

```cmake
string(GENEX_STRIP "a$<1:hoge>b" result)
message("result: ${result}") # ab

string(UUID result
  NAMESPACE 6ba7b810-9dad-11d1-80b4-00c04fd430c8 # DNS用
  NAME www.example.com
  TYPE MD5
)
message("result: ${result}") # result: 5df41881-3aed-3515-88a7-2f4a814cf09e
```

#### target\_compile\_features

CMake 3.1.0 から新たに追加されました。C++ の機能(constexpr など)を指定すると、その機能が実装されているバージョン(C++11 など)を自動で選択するようになります。たとえば、機能の部分に`cxx_constexpr`と指定すれば、`-std=gnu++11`がコンパイルオプションに追加されるようです。

```cmake
add_executable(main main.cpp)
target_compile_features(main PUBLIC cxx_constexpr)
```

この機能についての詳しい説明は公式ドキュメント [cmake-compile-features(7) — CMake 3.1.0 Documentation](http://www.cmake.org/cmake/help/v3.1/manual/cmake-compile-features.7.html) を参照してください。

※この機能、著者の環境ではなぜかエラーになってしまうので確認できていません。

```bash
$ cmake .
...
  target_compile_features no known features for CXX compiler

  "Clang"

  version 3.5.0.
...
```

#### target\_sources

CMake 3.1.0 から新たに追加されました。`add_executable()`や`add_library()`などのバイナリターゲットの依存ソースコードに新たに追加するコマンドのようです。

```cmake
add_executable(main main.cpp)
target_sources(main PUBLIC hoge.cpp)
```

#### set\_property・get\_property

プロパティの種類が増えたので指定できる項目が増えました。

### プロパティ

#### INSTALLプロパティ

プロパティの種類に新たに`INSTALL`が追加されました。`set_property()`・`get_property()`でプロパティの種類に`INSTALL`を指定することにより取得・設定ができます。

#### COMPILE\_FEATURES・CXX\_STANDARD・CXX\_EXTENSIONS

compile-features の導入に合わせて追加されました。

### Generator Expressions

#### COMPILE\_FEATURES

compile-features の導入に合わせて追加されました。

---

以上、CMake 3.1.0 での変更点の概要を紹介しました。どうやら、CMake 3.1.0 での目玉機能は、compile-features のようですね。また、ここで紹介した以外の変更点は、[CMake 3.1.0 Release Notes](http://www.cmake.org/cmake/help/v3.1/release/3.1.0.html) を参照してください。

## おわりに

以上、CMake の情報と 3.1.0 での変更点でした。

さて、これで CMake Advent Calendar 2014 はすべて終了となります。後半遅れたりしましたが、みなさんありがとうございました。