2012-12-21 6 views
8

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

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}") 

に実行可能ファイルをコピーしたカスタムコマンドを持っていた場合、実行はCMAKE_RUNTIME_OUTPUT_DIRECTORYには本当にないので、例えば、Windows上でチョークになるだろう。構成タイプによっては、${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/Releaseまたは${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/Debugのいずれかになります。 Linuxでは、CMAKE_BUILD_TYPEを使用して修正してパスに追加することはできますが、Windowsでは動作しません。これは、Windowsではcmakeが複数の設定を生成するためです。だから、私は何をできるようにしたいことは

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上でカスタムコマンドを設定固有にするにはどうすればよいですか?

答えて

5

これは、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>) 
9

それは、次の "ジェネレータ式"(CMakeの2.8.10)の助けを借りて解決することができます。

  • $<0:...> =空の文字列(無視"... ")
  • $<1:...> =" ..."
  • $<CONFIG:cfg> =の内容 '1' の設定は、他に "CFG"、であれば '0'

あなたはあなたが必要とする動作(擬似コード)に達するためにそれらを組み合わせることができます。

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

だからあなたの文字列は次のようになります。:に変換

if debug then ${DEBUG_EXE_PATH} elseif release then ${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

関連する問題