サーチ…


前書き

基本的な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つの可能性があります。

  1. それをグローバルに利用可能にするCACHE

  2. 親スコープで使用できるようにする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つのユースケースがあります(グローバル変数のために誤用しないでください):

  1. コード内の値は、例えばcmakeguiccmakeまたは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では、ユーザーは最初に構成プロセスを開始し、キャッシュされた値を変更して、ビルド環境の生成を開始して終了することができます。

  1. さらに、CMakeは検索/テスト/コンパイラの識別結果をキャッシュします(したがって、構成/生成ステップを再実行するたびに再度実行する必要はありません)

    find_path(LIB_A_PATH libA.a PATHS "/some/default/path")
    

    ここで、 LIB_A_PATHはキャッシュされた変数として作成されます。

gakeを使うためのCMakeへのプロファイリングフラグの追加

ここでの一連のイベントは、次のように動作するはずです。

  1. -pgオプションを使用してコードをコンパイルする
  2. コードと-pgオプションをリンクする
  3. プログラムを実行する
  4. gmon.outファイルを生成するプログラム
  5. 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

つまり、コンパイルではプロファイリング情報が正しく追加されませんでした。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow