CMake:如何创建一个用于复制文件的目标?

16

每次编译后,我使用以下命令将配置文件复制到构建目录中。

# 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中创建一个目标,以便在不需要编译任何内容的情况下复制文件?就像“make copy”一样。

1个回答

30

您应该能够添加一个名为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)

谢谢。我需要两个单独的 add_custom_command 命令吗?一个用于主可执行目标,另一个用于复制目标?因为现在自定义命令大致如下:add_custom_command(TARGET ${PRODUCT} PRE_BUILD。我希望文件在构建主目标或执行“make copy”时被复制。 - B Faley
在这种情况下,使用add_dependencies(${PRODUCT} copy)${PRODUCT}依赖于copy - Angew is no longer proud of SO
3
能否使用CMake的FILE(COPY ...)命令来实现这个功能? - wilx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接