cmake
変数とプロパティ
サーチ…
前書き
基本的なCMake変数の単純さは、完全な可変構文の複雑さに頼っています。このページでは、さまざまな変数の例と例を示し、避けるべき落とし穴を指摘します。
構文
- set(variable_name value [CACHE型の記述[FORCE]])
備考
変数名では大文字と小文字が区別されます。それらの値は文字列型です。変数の値は、次のように参照されます。
${variable_name}
引用符で囲まれた引数の中で評価されます
"${variable_name}/directory"
キャッシュされた(グローバル)変数
set(my_global_string "a string value"
CACHE STRING "a description about the string variable")
set(my_global_bool TRUE
CACHE BOOL "a description on the boolean cache entry")
CMakeがそれぞれの行を処理するときに(例えばCMakeが再実行されたときなど)キャッシュにキャッシュ変数がすでに定義されている場合は、変更されません。デフォルトを上書きするには、 FORCE
を最後の引数として追加します。
set(my_global_overwritten_string "foo"
CACHE STRING "this is overwritten each time CMake is run" FORCE)
ローカル変数
set(my_variable "the value is a string")
デフォルトでは、ローカル変数は現在のディレクトリとadd_subdirectory
コマンドで追加されたすべてのサブディレクトリでのみ定義されます。
変数の範囲を拡張するには、2つの可能性があります。
それをグローバルに利用可能にする
CACHE
親スコープで使用できるようにする
PARENT_SCOPE
使用します。親スコープは、親ディレクトリのCMakeLists.txt
ファイルまたは現在の関数の呼び出し元です。技術的には、親ディレクトリは
add_subdirectory
コマンドで現在のファイルを含むCMakeLists.txt
ファイルになります。
文字列とリスト
CMakeがリストと普通の文字列を区別する方法を知っておくことが重要です。あなたが書くとき:
set(VAR "ab c")
値"ab c"
文字列を作成します 。しかし、あなたが引用符なしでこの行を書くとき:
set(VAR abc)
:あなたは代わりに3つの項目のリスト作成"a"
、 "b"
と"c"
。
非リスト変数は実際には(単一の要素の)リストです。
リストはlist()
コマンドで操作することができ、 list()
連結したり、検索したり、任意の要素にアクセスすることができます( list()のドキュメント )。
多少混乱しますが、 リストも文字列です。この線
set(VAR abc)
は
set(VAR "a;b;c")
したがって、リストを連結するには、 set()
コマンドを使用することもできます。
set(NEW_LIST "${OLD_LIST1};${OLD_LIST2})"
変数とグローバル変数キャッシュ
set(VAR TRUE)
set(VAR "main.cpp")
set(VAR1 ${VAR2})
しかし、CMakeはグローバルな"キャッシュされた変数"も知っています ( CMakeCache.txt
残っていCMakeCache.txt
)。同じ名前の通常の変数とキャッシュされた変数が現在のスコープに存在する場合、通常の変数はキャッシュされている変数を隠します。
cmake_minimum_required(VERSION 2.4)
project(VariablesTest)
set(VAR "CACHED-init" CACHE STRING "A test")
message("VAR = ${VAR}")
set(VAR "NORMAL")
message("VAR = ${VAR}")
set(VAR "CACHED" CACHE STRING "A test" FORCE)
message("VAR = ${VAR}")
ファーストランの出力
VAR = CACHED-init
VAR = NORMAL
VAR = CACHED
セカンドランの出力
VAR = CACHED
VAR = NORMAL
VAR = CACHED
注意: FORCE
オプションは、通常の変数を現在のスコープからアンセット/削除します。
キャッシュされた変数の使用例
通常は2つのユースケースがあります(グローバル変数のために誤用しないでください):
コード内の値は、例えば
cmakegui
、ccmake
またはcmake -D ...
オプションを使用してプロジェクトのユーザから変更可能でなければなりません:CMakeLists.txt / MyToolchain.cmake
set(LIB_A_PATH "/some/default/path" CACHE PATH "Path to lib A")
コマンドライン
$ cmake -D LIB_A_PATH:PATH="/some/other/path" ..
これは、この値をキャッシュにあらかじめ設定してあり、上記の行はそれを変更しません。
CMake GUI
GUIでは、ユーザーは最初に構成プロセスを開始し、キャッシュされた値を変更して、ビルド環境の生成を開始して終了することができます。
さらに、CMakeは検索/テスト/コンパイラの識別結果をキャッシュします(したがって、構成/生成ステップを再実行するたびに再度実行する必要はありません)
find_path(LIB_A_PATH libA.a PATHS "/some/default/path")
ここで、
LIB_A_PATH
はキャッシュされた変数として作成されます。
gakeを使うためのCMakeへのプロファイリングフラグの追加
ここでの一連のイベントは、次のように動作するはずです。
- -pgオプションを使用してコードをコンパイルする
- コードと-pgオプションをリンクする
- プログラムを実行する
- gmon.outファイルを生成するプログラム
- gprofプログラムを実行する
プロファイリングフラグを追加するには、CMakeLists.txtに追加する必要があります:
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pg")
SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -pg")
SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -pg")
コンパイルとリンクのフラグを追加し、プログラムを実行した後に使用する必要があります:
gprof ./my_exe
次のようなエラーが発生した場合:
gmon.out: No such file or directory
つまり、コンパイルではプロファイリング情報が正しく追加されませんでした。