我对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)
有什么方法可以更新此代码段以完成工作?或让我知道是否还有其他更好的解决方案。 预先感谢
答案 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()