我对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()