web-dev-qa-db-ja.com

CMake for Visual Studioで現在の構成(リリース/デバッグ)を取得する方法

Visual Studio 2013、CMake 3.5.1、Windows 10を使用しています。以下のように、CMakeを介していくつかのファイルをコピーしようとしています。

file(COPY ${IMAGES} DESTINATION ${CMAKE_BINARY_DIR}/bin/Release)

「Release」を次のような構成を表す変数に置き換えることは可能ですか?

file(COPY ${IMAGES} DESTINATION ${CMAKE_BINARY_DIR}/bin/${Variable})

私は試みました

file(COPY ${IMAGES} DESTINATION ${CMAKE_BINARY_DIR}/bin/${CMAKE_BUILD_TYPE})

しかし、メッセージを使用して印刷すると、CMAKE_BUILD_TYPEは空の文字列になります。

file(COPY ${IMAGES} DESTINATION ${CMAKE_BINARY_DIR}/bin/$<CONFIGURATION>)

しかし、何らかの理由で、ファイルコマンドは$<CONFIGURATION>を解読できませんが、次のようなコマンドは

add_custom_target(run COMMAND ${CMAKE_BINARY_DIR}/bin/$<CONFIGURATION>/Test.exe)

できる。 Visual Studioが現在CMakeのリリースまたはデバッグに組み込まれているかどうかを抽出する正しい方法は何ですか?

10
user3667089

fileコマンドは、ビルド時(つまり、VSランタイム)ではなく、CMakeランタイム中に実行されます。

これは、ジェネレータ式($<CONFIG>など)はビルド時に評価されるため、使用できないことも意味します。
ヒント:CMakeドキュメント内の特定のコマンドでのジェネレーター式の使用への明示的な参照がない限り、それらはそのコマンドではサポートされていません)。

${CMAKE_BUILD_TYPE}が空である理由は、CMakeの呼び出しでおそらく指定していないためです。

cmake -DCMAKE_BUILD_TYPE=Debug ..

ただし、これを使用すると、ビルドファイルはDebug構成に対してのみ生成されます。それは明らかにあなたが望むものではありません。

問題を解決するには:add_custom_target(またはadd_custom_command)を使用してすでに理解しているように、ジェネレータ式を使用するのが正しい方法です。

他の「real」ターゲットの依存関係としてカスタムコマンドを使用でき、特定のターゲットのビルド後/ビルド前およびリンク前のコマンドを指定できます add_custom_command 経由。

文書がadd_custom_commandCOMMAND引数について述べているように:

COMMANDへの引数は、ジェネレータ式を使用できます。ジェネレータ式でのターゲット名への参照は、ターゲットレベルの依存関係を意味しますが、ファイルレベルの依存関係は意味しません。 DEPENDSオプションを使用してターゲット名を一覧表示し、ファイルレベルの依存関係を追加します。

ターゲットのビルドが成功した後にファイルをコピーするには:

add_custom_command(TARGET myTarget POST_BUILD
                   COMMAND "${CMAKE_COMMAND}" -E copy_if_different "${IMAGE1}" "${CMAKE_BINARY_DIR}/bin/$<CONFIG>/"
                   COMMAND "${CMAKE_COMMAND}" -E copy_if_different "${IMAGE2}" "${CMAKE_BINARY_DIR}/bin/$<CONFIG>/"
)
9
Torbjörn