かみのメモ

コンピュータビジョン・プログラムな話題中心の勉強メモ

cmakeプロジェクトの設定項目一覧を表示させる

※ ccmakeの話を追記しました(2019/01/04)

cmakeのconfiguration時のオプション一覧を表示させる方法をよく忘れるのでメモ。

cmakeではビルドオプションや各種のPathの情報を変数を通してやり取りします。 自分でCMakeLists.txtを書いた場合は変数名とそこに何を入れればいいのかは大体把握できますが、OSSのように他人が書いたCMakeLists.txtを使うときは設定項目の一覧を表示させたくなります。

ということでCMakeLists.txt内で定義されている変数の一覧を表示する方法をまとめてみます。

cmakeで扱う変数は、cmakeスクリプト内で定義される変数, キャッシュ変数, INTERNALなキャッシュ変数, ターミナルで定義される環境変数に分類されますが、ビルドの設定項目の受け渡しにはキャッシュ変数を使うのが一般的です。 よって、この記事ではキャッシュ変数の一覧を表示させる方法を紹介します。

追記(2019/06/10)

『勝手に作るCMake入門』という連載記事を投稿しました。 CMakeの基本的な使い方をチュートリアル形式で紹介しています。 キャッシュ変数の役割などについても解説しているのでよければ読んでみてください。

kamino.hatenablog.com

cmake-gui/ccmakeから

Windowsでcmake-guiを使うときは、こんなかんじ↓にオプションの一覧を表示してくれます。 便利です。

f:id:kamino-dev:20181211163722p:plain
cmake-gui

cmakeの公式ページのインストーラーを使えばOSXLinuxでもcmake-guiが使えるそうですが、Homebrewやaptなどのパッケージマネージャでインストールしたcmakeと競合する可能性があるのでオススメできません。

そのかわり*nix系ではccmakeというコマンドが用意されています。 cmakeした後にccmakeを叩くとこんなかんじ↓にオプションの一覧を表示してくれます。 cmake-guiと同じくこの画面上でキャッシュ変数を編集した後でConfigure, Generateを実行できます。

f:id:kamino-dev:20190104154920p:plain
ccmake

cmakeコマンドから

cmakeコマンドを使うときはcmake .. -Lのように-Lオプションを指定するとconfigurationの後にキャッシュ変数の一覧が表示されます。 ADVANCEDに設定されたキャッシュ変数も表示させたいときは-LAオプションを指定すればよいです。

-- Cache values
BUILD_SHARED_LIBS:BOOL=OFF
CMAKE_BUILD_TYPE:STRING=
CMAKE_INSTALL_PREFIX:PATH=/usr/local
CMAKE_LIBTOOL:FILEPATH=/usr/bin/libtool
...

-LHとすれば、変数に紐付けられているコメントも一緒に表示されます。

-- Cache values
// Build shared libraries
BUILD_SHARED_LIBS:BOOL=OFF

// Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel ...
CMAKE_BUILD_TYPE:STRING=

// Install path prefix, prepended onto install directories.
CMAKE_INSTALL_PREFIX:PATH=/usr/local

...

CMakeLists.txtのmessageから

configurationの際に必ず変数の一覧を表示させたい場合はCMakeLists.txtの末尾に以下のスクリプトを追加すればよいです。

get_cmake_property(_variableNames CACHE_VARIABLES)
list (SORT _variableNames)
foreach (_variableName ${_variableNames})
    message(STATUS "${_variableName}=${${_variableName}}")
endforeach()

ただしcmakeの仕様上、add_subdirectoryなどで追加した子ディレクトリのcmakeファイル内で定義された変数は親側には伝播しません。 そのため、このスクリプトを追加したCMakeLists.txtより上位のcmakeファイル内で定義された変数しか表示されません。

そもそもConfigureの度に問答無用で変数一覧を表示するのはあまり親切ではないですね。。


以上、cmakeの設定項目一覧を表示する方法でした。