Posted at
CMakeDay 25

CMake の情報と 3.1.0 での変更点

More than 3 years have passed since last update.


はじめに

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


情報源

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


Web

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


CMake Reference Documentation — CMake 3.0.2 Documentation

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


CMake - KitwarePublic

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


CMake チュートリアル — Cmake-Tutorial

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


CMake Manual | Qt 5.4

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


書籍

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


Mastering CMake

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

Mastering CMake: Ken Martin, Bill Hoffman: 9781930934269: Amazon.com: Books


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

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

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

extension:cmake file download


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_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 ::= '\;'

cmake-language(7) — CMake 3.1.0 Documentation, Escape Sequences


これらは、ポリシーCMP0053で管理されており、OLDに設定することによって、CMake 3.0.2 の動作にすることができます。


コマンド


string

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

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がコンパイルオプションに追加されるようです。

add_executable(main main.cpp)

target_compile_features(main PUBLIC cxx_constexpr)

この機能についての詳しい説明は公式ドキュメント cmake-compile-features(7) — CMake 3.1.0 Documentation を参照してください。

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

$ 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()などのバイナリターゲットの依存ソースコードに新たに追加するコマンドのようです。

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 を参照してください。


おわりに

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

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