2017-09-13 18 views
4

私は、CMakeの$<xxx:yy>のようなgenerator expressionsの利点をいつ、どのように使用するのか、長い間理解しています。 誰かがそれを明確に説明できる例がいくつかあります。 多くの方が先にありがとうCmakeジェネレータの表現

+0

'誰もが、それはclearly'説明することができます - 広すぎます。誰かが[CMakeのドキュメント](https://cmake.org/cmake/help/v3.9/manual/cmake-generator-expressions.7.html)を繰り返すべきですか?または他のマニュアル?そうでない場合は、**あなたが理解していないもの、例えば**を説明してください。どの表現か、またはどの例か。 – Tsyvarev

+0

@Tsyvarev –

+1

'$ 'は、ジェネレータ表現の使用量のほぼ半分であることを理解できなかった部分のドキュメントを追加しました。その意味は簡単です:ジェネレータ式 'xxx'がTRUE(ブール値)と評価された場合、ジェネレータ式yyの値が使用されます。それ以外の場合は、空の文字列が使用されます。この種の式の有用性は、左ジェネレータ式の値が設定オプションに依存し、ビルドシステムがマルチコンフィギュレーション(例えばVisual Studio)をサポートしている場合、具体的な設定が知られていないので、その式を 'if'で書き換えることはできません。この段階。 – Tsyvarev

答えて

3

CMakeはプロジェクト内のCMakeLists.txtファイルを「構成フェーズ」と最初に解析し、「生成フェーズ」という名前のビルド環境を生成します。

だから基本的にはジェネレータ式は発電機のみが知ることができるすべてのためのものである:

  • ターゲット出力の名前とパス(クロスコンパイルおよびマルチコンフィギュレーション環境で主にとき)
  • 以上、一般的に発電機が一緒に、コンパイラ/リンカを付き合うために評価任意のtargetプロパティは、ここで

を呼び出して、私は私のプロジェクトでジェネレータ式を使用する例を示します。

  1. 次の実行にファイルをコピーする(CMAKE_CURRENT_BINARY_DIRのようなマルチコンフィギュレーション環境であなただけ使用することはできません変数)

    add_custom_command(
        TARGET library1 
        POST_BUILD 
        COMMAND ${CMAKE_COMMAND} -E copy 
         "$<TARGET_FILE:library1>" 
         "$<TARGET_FILE_DIR:mainProject>/$<TARGET_FILE_NAME:library1>" 
    ) 
    

    CMake post-build-event: copy compiled libraries

    add_custom_command(
        TARGET myBinary 
        POST_BUILD 
         COMMAND ${CMAKE_COMMAND} -E copy 
            "${CMAKE_CURRENT_SOURCE_DIR}/myTest.txt" 
            "$<TARGET_FILE_DIR:myBinary>/myTest.txt" 
    ) 
    

    how do I add external test files to a cmake project

  2. 差別例えばDEBUGまたはRELEASE構成TARGET_PROPERTYジェネレータ式で

    add_compile_options("$<$<CONFIG:DEBUG>:/MDd>") 
    

    For Cmake, can you modify the release/debug compiler flags with `add_compiler_flags()` command?

    Modern way to set compiler flags in cross-platform cmake project

  3. あなたは、例えば多くのことを行うことができます

    file(GENERATE 
        OUTPUT "includes.txt" 
        CONTENT "$<TARGET_PROPERTY:motor,INCLUDE_DIRECTORIES>\n" 
    ) 
    

    CMake doesn't pick up INTERFACE_INCLUDE_DIRECTORIES of linked library

関連する問題