CMakeツールチェインの使い方


以前CMakeのツールチェイン機能を扱う際の注意点を書きましたが、そもそもツールチェイン自体の記事が見当たらなかったので基本的な使用方法を書いておきます。

ツールチェインとは

CMakeには外部からビルド設定を組み込むためのcmake-toolchainsという機能があります。
たとえば、

  • Visual Studioではプロジェクト設定に予め/MTや、/MTdを設定したい
  • CMakeで生成する依存ライブラリは特定の環境でパス環境変数を要求するが、定義したくないので直接プロジェクトファイルに埋め込みたい
  • 環境に応じて対象となるコンパイラの種類及びバージョンを細かく指定したい

のような状況は頻繁に発生するでしょう。これらの設定はcmakeコマンドのオプションじゃ賄い切れない事が多いです。
そこでツールチェインの機能を利用することにより、クロスプラットフォームを対象としたプロジェクトの生成において、各プラットフォーム間で生まれる細かい要求に対応することが出来ます。

使い方

ツールチェインは定義した.cmakeファイルを-DCMAKE_TOOLCHAIN_FILEオプションによって渡すことにより機能します。

cmake . -DCMAKE_TOOLCHAIN_FILE=/path/to/file.cmake

ここで渡す.cmakeファイルに各環境ごとの設定を書き加えるだけでCMake側が設定してくれるので楽ちんです。

設定方法

.cmakeファイルなので、そのままCMakeの文法を扱うことが出来ます。ここで例を見てみましょう

# 対象は環境変数HOGE_PATHを要求しているが、環境変数を汚したくないので直接埋め込む 
include_directories(SYSTEM ${HOGE_PATH})

# 対象はHOGEライブラリをサポートしているため使用したい。そのための変数を定義する
add_definitions(-DUSE_HOGE)

# 対象のCMake設定では/MDdと/MDが指定されるため、/MTdと/MTに直したい
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MTd" CACHE STRING "description")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT" CACHE STRING "description")

上の例では3つの要求に対応する設定を記述してみました。書き方は普段書くCMakeの設定方法とほぼ一緒なので何も考えることはないですね。ここに記述した設定は、基本的には優先して扱われるようになっているようです(ドキュメントを参照してもぱっと見見当たらないので不確定ですが)。
以前の記事でも解説したように、set()で設定する変数にはCACHE指定をつけるのだけは忘れないようにして下さい。

ここで書いた設定はWindows(Visual Studio)を想定したものでしたが、各プラットフォームごとにツールチェイン用ファイルを用意してもいいですし、CMAKE_SYSTEM_NAMECAMEK_CXX_COMPILER_IDのような変数を判定して分岐した設定を書いても良いでしょう。