web-dev-qa-db-ja.com

コマンドラインからCMake変数を取得するにはどうすればよいですか?

このようなもの:

cmake --get-variable=MY_CMAKE_VARIABLE

変数は、インクルードされたCMakeファイルに存在する可能性があります。

28
Allan

既存のキャッシュファイルがある場合は、次のことができます。

grep MY_CMAKE_VARIABLE CMakeCache.txt

まだキャッシュファイルがなく、CMakeLists.txtファイルにあるオプションを確認したい場合は、(これによりキャッシュファイルが書き込まれるため、別のディレクトリで)実行できます。

cmake -L /path/to/CMakeLists.txt | grep MY_CMAKE_VARIABLE

それはあなたのようなものに戻ります

<VARIABLE>:<TYPE>=<VALUE>

高度な変数の場合は、同じコマンドに-Aフラグを追加すると、高度な変数が含まれます。もちろん、値だけが必要な場合は、次のことができます。

cmake -L /path/to/CMakeLists.txt | grep MY_CMAKE_VARIABLE | cut -d "=" -f2

[〜#〜]編集[〜#〜]

たとえば、次のようなCMakeLists.txtがあるとします。

cmake_minimum_required(VERSION 2.8)

project(test)

include(otherFile.txt)

set(MY_VAR "Testing" CACHE STRING "")

そして、otherFile.txtは次のとおりです。

set(MY_OTHER_VAR "Hi" CACHE STRING "")

コマンド(別のディレクトリから実行):

cmake -L ../cmaketest

与える:

-- The C compiler identification is GNU
-- The CXX compiler identification is GNU
-- Check for working C compiler: /usr/bin/gcc
-- Check for working C compiler: /usr/bin/gcc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/tgallagher/cmaketest-build
-- Cache values
CMAKE_BUILD_TYPE:STRING=
CMAKE_INSTALL_PREFIX:PATH=/usr/local
MY_OTHER_VAR:STRING=Hi
MY_VAR:STRING=Testing

したがって、他のファイルの変数が表示されます。ビルド全体を解析する必要があります。ただし、問題はCACHEでマークされていない変数を表示しないことです。また、内部にキャッシュされているものは表示されず、-Lの代わりに-LAが使用されている場合にのみADVANCEDが表示されます。

変数がINTERNALとしてマークされているか、キャッシュされていない場合、CMake内で変数を取り出す方法はありません。ただし、キャッシュされていない変数は一時的なものであるため、ビルド環境の外でなぜ必要になるのかはわかりません。

16
tpg2114

使用する:

cmake -LA -N /path/to/project

すべてのキャッシュ値のリストを取得します。 -Nは重要です。 cmakeがビルドファイルを生成しようとするのを防ぎ、キャッシュの内容を表示するだけです。

6
Paul Brannan

必要な変数が設定しているものではなく、デフォルトのものである場合は、使用できます

cmake --system-information

そして、それをグレップ。少し遅いようですが、1、2秒かかるようです。たとえば、最初にcmake変数を構成するためにこれを行おうとすると、カートが馬の前に出ることを回避できます。 :)

これにファイル名を渡すこともできます。したがって、ファイルが存在しない場合にのみ生成を試み、存在する場合はファイルを解析することができます(その1〜2秒を節約するため)。

4
johnb003

必要な場合 キャッシュされない ユーザー変数ですが、元のcmakeスクリプトを編集できません。トリックを使用する場合があります。次の内容で、別のディレクトリに新しいCMakeLists.txtファイルを作成します。

include(<Path to original CMakeLists.txt>)

message(STATUS "MY_VAR={${MY_VAR}}")

新しいディレクトリで実行している間、cmakeは多くのエラーを発生させる可能性があります。相対パスは、元のスクリプトで使用されている場合、間違いなくそのようなエラーの原因です。しかし、cmakeは変数に割り当てられた最後の値を出力します。さらに、よく知られているテキストプロセッサ(UNIXに精通していると想定)を使用して、すべてのエラーと警告をフィルタリングします。次に例を示します。

cmake . | sed -n 's/-- MY_VAR={\(.*\)}/\1/p' 2>&1

私はプロジェクトメンテナンススクリプトでこのアプローチを使用していますが、元のCMakeLists.txtに構文エラーがない限り確実に機能します。

3
dyomas