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以便您可以仅复制文件或在 buildMyTarget时复制它们,则需要打破循环依赖项。(MyTarget取决于copy,但copy取决于MyTarget获取复制到目录的位置)。

为此,您可以采用获取目标输出目录的老式方法:

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 回答