CMake的:如何对复制文件的目标(CMake: How to have a target for

2019-07-18 14:10发布

我使用下面的命令来配置文件复制到每个编译后生成目录。

# 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目标来复制文件,而无需编译任何东西? 像“做副本”。

Answer 1:

你应该能够添加新的自定义目标调用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 ,但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)


文章来源: CMake: How to have a target for copying files
标签: cmake