CMake - 変数

提供:MochiuWiki : SUSE, EC, PCB
ナビゲーションに移動 検索に移動

概要



変数の宣言と代入

変数は、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()