CMake - 変数
概要
変数の宣言と代入
変数は、set
コマンドを使用して、変数を宣言および代入することができる。
CMakeでは、全ての変数を文字列として扱っており、変数名には、英数字、_
、.
、/
、-
、+
を含めることができる。
また、大文字と小文字が区別される。
変数の値を代入する時、値にスペースが含まれていない限り、引用符で囲む必要はない。
set(value 1) # 値が1の変数valueを宣言
既存の変数への代入もset
コマンドを使用する。
変数の値の参照は、入れ子にすることもできる。
set(value 1) # 値が1の変数valueを生成
set(value 2) # 既存の変数valueに値1を代入
set(value_name value) # 変数value_nameに変数valueの値を代入
message(${${value_name}}) # ${value_name}が展開されて、${${value_name}}が${value}になり、これが展開されて2になる
1つの変数に複数の値を指定する場合、各値はセミコロンで区切って結合される。(文字列リストとして代入される)
また、未定義の変数を参照する場合は、空の文字列となる。
set(myVar a b c) # myVarの値: a;b;c
set(myVar a;b;c) # myVarの値: a;b;c
set(myVar "a b c") # myVarの値: a b c
set(myVar a b;c) # myVarの値: a;b;c
set(myVar a "b c") # myVarの値: a;b c
set(USE_CCACHE OFF CACHE BOOL "")
変数の削除
変数の削除する場合は、unset
コマンドを使用する。
set(value 1) # 変数valueを宣言
unset(value) # 変数valueを削除
キャッシュ変数
キャッシュ変数とは、ビルドディレクトリのCMakeCache.txtに記録される変数のことである。
グローバルスコープで参照可能であり、生存期間がcmake
コマンドの終了後も継続する。
次のcmake
コマンドの実行でも値を保つため、生成したビルドの構成情報を保存するような用途にも使用される。
例えば、キャッシュ変数VAR1の値は$CHACHE{VAR1}で参照できる。
同名の通常変数が存在しない場合は、${VAR1}でも参照することができる。
set(CACHE)
コマンドで初回の変数が定義ができる。
既に定義されているキャッシュ変数を変更する場合は、FORCE
オプションが必要である。
指定されていない場合、set(CACHE)
コマンドは無視される。
また、cmake
コマンドの実行時に-D<オプション名>
でも定義や変更が可能である。
他の変数と異なり、キャッシュ変数は型を持つ。
cmake
コマンドの-D<オプション名>
オプションで型を指定せずに定義することにより、型のない状態で使用することもできる。
この場合、set(CACHE)
コマンドを実行した時点で型が確定する。
リスト(配列)
変数は全て文字列として扱われるが、複数の変数をまとめて扱う場合はリストを使用する。
これは、複数の文字列をセミコロン;
で連結したものである。
リストという型は無く文字列であるが、関数の引数が暗黙的に連結されてリストとして扱うことができ、操作関数により言語レベルでのサポートがあるため、
不定個数の変数をまとめて扱う場合に便利である。
set(LIST1 "AA" "BB" "CC") # 3つの文字列からなるリストを作成
message("${LIST1}") # -> AA;BB;CC
list(APPEND LIST1 "DD") # リスト末尾に要素を追加
message("${LIST1}") # -> AA;BB;CC;DD
list(LENGTH LIST1 LEN) # リスト要素の個数を取得
message("${LEN}") # -> 4
list(GET LIST1 2 ITEM) # 2番目の要素を取得
message("${ITEM}") # -> CC
定義された全ての変数を出力
get_cmake_property(variableNames VARIABLES)
foreach(variableName ${variableNames})
message(STATUS "${variableName}=${${variableName}}")
endforeach()
CMAKE_PREFIX_PATH
# ライブラリのインストールディレクトリを指定
## ライブラリのインストールディレクトリを1つ指定する場合
set(CMAKE_PREFIX_PATH "<ライブラリのパス>")
## ライブラリのインストールディレクトリを複数指定する場合
set(CMAKE_PREFIX_PATH "<ライブラリのパス 1>;<ライブラリのパス 2>;<ライブラリのパス 3>")
# find_packageコマンドを使用してライブラリを検索
find_package(<ライブラリ名> REQUIRED)
if(<ライブラリ名>_FOUND)
# ライブラリが見つかった場合
else()
# ライブラリが見つからなかった場合
endif()