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



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

我想把一些文件从源目录复制到目标目录。下面是我的源目录结构

SourceDirtem1.txt
SourceDirtem1.log
SourceDirtem1.xml
SourceDirtem1.js
SourceDirtem3.xml

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

SourceDirChildDirtem1.ts
SourceDirChildDirtem4.log
SourceDirChildDirtem5.xml
SourceDirChildDirtem6.js
SourceDirChildDirtem7.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)

有什么方法可以更新这个代码片段来完成我的工作吗?或者,如果有其他更好的解决方案,请告诉我。提前感谢

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

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

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

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

现在MY_FILES变量已经拥有了所有的.xml和.js文件。

第二步:复制文件

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

注意:cmake中的列表是A;一组分开的字符串。要创建列表,可以使用set命令。例如,set(var a b c d e(创建了一个带有a的列表;bcde、 和set(var"a b c d e"(创建一个字符串或一个包含一个项目的列表。(注意宏参数不是变量,因此不能在list命令中使用。(

现在您有两个选项可供复制。

在CMake时间:

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

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

在制造时间:

这就是你目前使用的方法。但是您需要对MY_FILES的列表进行迭代。为此,您需要使用foreach()循环。代码将类似于:

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

相关内容

最新更新