如何使用cmake命令将几种特定类型的文件从源目录复制到目标目录?

时间:2018-11-27 12:12:43

标签: cmake

我对Cmake完全陌生。我的查询对您来说可能很简单

我想将几个文件从源目录复制到目标目录。下面是我的Source目录结构

SourceDir\tem1.txt
SourceDir\tem1.log
SourceDir\tem1.xml
SourceDir\tem1.js
SourceDir\tem3.xml

SourceDir还有另一个目录Say ChildDir;下面是结构

SourceDir\ChildDir\tem1.ts
SourceDir\ChildDir\tem4.log
SourceDir\ChildDir\tem5.xml
SourceDir\ChildDir\tem6.js
SourceDir\ChildDir\tem7.xml

我只想在目标目录中复制.xml和.js文件。输出应如下所示

DestinationDir/tem1.xml
DestinationDir/tem1.js
DestinationDir/tem3.xml
DestinationDir/tem5.xml
DestinationDir/tem6.js
DestinationDir/tem7.xml

下面是我不完整的代码片段

cmake_minimum_required(VERSION 3.2.0)

project(copyFiles)
add_custom_target(temp)

add_custom_command( TARGET temp
                      PRE_BUILD
                      ${CMAKE_COMMAND} -E
                      COPY ${CMAKE_CURRENT_SOURCE_DIR}/SourceDir
 ${CMAKE_CURRENT_BINARY_DIR}/DestinationDir)

有什么方法可以更新此代码段以完成工作?或让我知道是否还有其他更好的解决方案。 预先感谢

1 个答案:

答案 0 :(得分:1)

第一步:匹配所有.js和.xml文件

您可以将file()与GLOB_RECURSE一起使用:

file (GLOB_RECURSE 
      MY_FILES
      "SourceDir/*.js"
      "SourceDir/*.xml"
)

GLOB_RECURSE将匹配文件夹中的所有文件及其所有子文件夹。

现在MY_FILES变量具有所有的.xml和.js文件。

第二步:复制文件

现在,MY_FILES变量是一个列表。 CMAKE中列表的定义:

  

注意:cmake中的列表是一个;分开的字符串组。要创建列表,可以使用set命令。例如,set(var a b c d e)创建一个带有a; b; c; d; e的列表,而set(var“ a b c d e”)创建一个字符串或一个其中包含一项的列表。 (请注意,宏参数不是变量,因此不能在LIST命令中使用。)

现在您有两个选择要复制。

在CMake时间:

您可以使用file(COPY),这将在您执行cmake时复制文件:

file(COPY ${MY_FILES} DESINATION "DestinationDir/")

在制作时间:

这就是您当前使用的方法。但是您需要迭代MY_FILES的列表。为此,您需要使用foreach() loop。该代码将类似于:

foreach(MY_FILE ${MY_FILES})
    add_custom_command( TARGET temp
                        PRE_BUILD
                        ${CMAKE_COMMAND} -E
                        COPY ${MY_FILE}
                        ${CMAKE_CURRENT_BINARY_DIR}/DestinationDir
    )
endforeach()