CMake:如何仅从一个目录中复制特定文件扩展名到另一个目录

6
我正在使用以下自定义命令将位于config目录中的所有文件复制到build目录中。问题是我不想将.svn目录一起复制。我希望找到一种方法来排除.svn目录,或者只复制特定扩展名的文件。例如,我只想复制具有xmlconf扩展名的文件。应该怎么做?
add_custom_command(TARGET MyTarget PRE_BUILD
                   COMMAND ${CMAKE_COMMAND} -E copy_directory
                       ${CMAKE_SOURCE_DIR}/config $<TARGET_FILE_DIR:MyTarget>)

related question

1个回答

12

要仅复制.xml.conf文件,您可以使用file(GLOB ...)命令:

# 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()

获取不在 .svn 子目录中的所有文件的过程类似:

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

# Gather list of all files in "/config/.svn"
file(GLOB SvnConfigFiles RELATIVE ${CMAKE_SOURCE_DIR}/config 
     ${CMAKE_SOURCE_DIR}/config/.svn/*)

# Remove ".svn" and its contents from the list
list(REMOVE_ITEM ConfigFiles .svn ${SvnConfigFiles})

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

不必合并文件列表,似乎可以在一行中编写所有文件类型。 - B Faley
有没有可能在不编译的情况下设置一个复制文件的目标?类似于“make copy”,它只复制配置文件。 - B Faley
我刚看到这个评论,已经在这里回答了 :-) - Fraser
我有同样的问题,但是我需要在构建之后进行GLOB。怎么做? - Nick
1
@Nick最好提出一个新问题——这太多了,评论无法解决。 - Fraser

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