我在每次编译后使用以下命令将配置文件复制到build目录中。
# 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中创建目标来复制文件而无需编译任何东西?像“复制”这样的东西。
答案 0 :(得分:25)
您应该能够添加一个名为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)