11

プロジェクトの1つで単体テストを実行するために、実行可能ファイル、ライブラリ、およびその他の関連ファイルを別の場所にコピーして、特定のセットアップで実行できるようにするカスタムコマンドがあります。構築されました。Linuxでは、これは非常に簡単です。しかし、Windowsでは、cmakeが構成名を出力ディレクトリに追加するという事実のために少し問題が発生しました(私は一般的に好きですが、この場合は私がやっていることを台無しにします)。生成されたライブラリまたは実行可能ファイルへのパスを判別するのが難しくなります。たとえば、実行可能ファイルを別のディレクトリにコピーしたばかりのカスタムコマンドがある場合

set(EXE_PATH "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/exeName${CMAKE_EXECUTABLE_SUFFIX}")
set(NEW_EXE_PATH "${RUN_UNITTESTS_DIR}/exeName${CMAKE_EXECUTABLE_SUFFIX}")

add_custom_command(TARGET unitTests POST_BUILD
                   COMMAND ${CMAKE_COMMAND} ARGS -E copy "${EXE_PATH}" "${NEW_EXE_PATH}")

実行可能ファイルが実際にはにないため、WindowsではチョークしますCMAKE_RUNTIME_OUTPUT_DIRECTORY。構成タイプに応じて、またはのいずれ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/Releaseかになり${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/Debugます。Linuxでは、パスを使用してパスに追加することで簡単に修正できますがCMAKE_BUILD_TYPE、Windowsではcmakeが1つではなく複数の構成を生成するため、Windowsでは機能しません。だから、私がやりたいのは

add_custom_command(TARGET unitTests POST_BUILD
                   debug
                   COMMAND ${CMAKE_COMMAND} ARGS -E copy "${DEBUG_EXE_PATH}" "${DEBUG_NEW_EXE}")

add_custom_command(TARGET unitTests POST_BUILD
                   release
                   COMMAND ${CMAKE_COMMAND} ARGS -E copy "${RELEASE_EXE_PATH}" "${RELEASE_NEW_EXE}")

いくつかのcmakeコマンドはそれを実行できるように見えますが(例えばtarget_link_libraries)、私が知る限り、add_custom_targetその機能を提供していません。だから、問題は私がそれをどのように行うかです?Windowsでカスタムコマンドを構成固有にする方法を教えてください。

4

2 に答える 2

12

次の「ジェネレーター式」(CMake2.8.10)の助けを借りて解決することができます:

  • $<0:...> =空の文字列(「...」を無視します)
  • $<1:...> =「...」の内容
  • $<CONFIG:cfg>=構成が「cfg」の場合は「1」、それ以外の場合は「0」

それらを組み合わせて、必要な動作に到達できます(擬似コード)。

if debug then ${DEBUG_EXE_PATH} elseif release then ${RELEASE_EXE_PATH}

これは次のように解釈されます。

$<$<CONFIG:debug>:${DEBUG_EXE_PATH}>$<$<CONFIG:release>:${RELEASE_EXE_PATH}>

したがって、文字列は次のようになります。

add_custom_command(TARGET unitTests POST_BUILD
                       COMMAND ${CMAKE_COMMAND} ARGS -E copy "$<$<CONFIG:debug>:${DEBUG_EXE_PATH}>$<$<CONFIG:release>:${RELEASE_EXE_PATH}>" "$<$<CONFIG:debug>:${DEBUG_NEW_EXE}>$<$<CONFIG:release>:${RELEASE_NEW_EXE}>")

詳細:CMake:add_custom_command

于 2013-10-06T00:14:51.243 に答える
7

これは、で使用するために提供されているジェネレータ式の場合ですadd_custom_command

あなたの場合、コンパイルされたexeへのフルパスと、そのファイル名を宛先ディレクトリに追加する必要があります。これらはそれぞれ$<TARGET_FILE:unitTests>$<TARGET_FILE_NAME:unitTests>です。

あなたの完全なコマンドは次のようになります:

add_custom_command(TARGET unitTests POST_BUILD
                   COMMAND ${CMAKE_COMMAND} -E
                       copy $<TARGET_FILE:unitTests>
                            ${RUN_UNITTESTS_DIR}/$<TARGET_FILE_NAME:unitTests>)
于 2012-12-21T23:32:53.167 に答える