14

次のコマンドを使用して、コンパイルのたびに構成ファイルをビルドディレクトリにコピーしています。

# Gather list of all .xml and .conf files in "/config"
file(GLOB ConfigFiles ${CMAKE_SOURCE_DIR}/config/*.xml
                      ${CMAKE_SOURCE_DIR}/config/*.conf)

foreach(ConfigFile ${ConfigFiles})
  add_custom_command(TARGET MyTarget PRE_BUILD
                     COMMAND ${CMAKE_COMMAND} -E
                         copy ${ConfigFile} $<TARGET_FILE_DIR:MyTarget>)
endforeach()

このアクションは、プロジェクトをコンパイルするたびにトリガーされます。CMakeLists.txtにターゲットを作成して、何もコンパイルせずにファイルをコピーすることは可能ですか?「コピーを作成」のようなもの。

4

1 に答える 1

28

copyと呼ばれる新しいカスタムターゲットを追加し、それをカスタムコマンドのターゲットにすることができるはずです。

file(GLOB ConfigFiles ${CMAKE_SOURCE_DIR}/config/*.xml
                      ${CMAKE_SOURCE_DIR}/config/*.conf)

add_custom_target(copy)
foreach(ConfigFile ${ConfigFiles})
  add_custom_command(TARGET copy PRE_BUILD
                     COMMAND ${CMAKE_COMMAND} -E
                         copy ${ConfigFile} $<TARGET_FILE_DIR:MyTarget>)
endforeach()

これで、カスタムコマンドはビルドした場合にのみ実行されますcopy

このcopyターゲットをの依存関係として保持MyTargetし、ファイルをコピーするか、ビルドMyTarget時にファイルをコピーできるようにする場合は、循環依存関係を解除する必要があります。(MyTargetに依存しますcopyが、コピー先ディレクトリの場所を取得することに依存します)copyMyTarget

これを行うには、ターゲットの出力ディレクトリを取得する昔ながらの方法に頼ることができます。

add_custom_target(copy)
get_target_property(MyTargetLocation MyTarget LOCATION)
get_filename_component(MyTargetDir ${MyTargetLocation} PATH)
foreach(ConfigFile ${ConfigFiles})
  add_custom_command(TARGET copy PRE_BUILD
                     COMMAND ${CMAKE_COMMAND} -E
                         copy ${ConfigFile} ${MyTargetDir})
endforeach()
add_dependencies(MyTarget copy)
于 2013-01-23T08:07:46.813 に答える