当前,我具有External_Project_Add_Step,用于将目录从“源目录”复制到“目标目录”。最近,我意识到在此过程中我将复制大约4 GB的数据,而实际上我需要复制选择性文件(许多文件,但总大小约为1 GB)。
ExternalProject_Add_Step(${EXTERNAL_TARGET} lib_step
COMMAND ${CMAKE_COMMAND} -E make_directory ${TGT_DIR}
COMMAND ${CMAKE_COMMAND} -E copy_directory ${SRC_DIR} ${TGT_DIR}
COMMENT "Copying lib from ${SRC_DIR} to ${TGT_DIR}"
DEPENDEES install)
但是,我确实有要复制的文件列表。我想知道是否可以将循环放在External_Project_AddStep内以使单个步骤复制所需的所有文件。 如下所示(虽然不起作用)
ExternalProject_Add_Step(${EXTERNAL_TARGET} lib_step
COMMAND ${CMAKE_COMMAND} -E make_directory ${TGT_DIR}
foreach(copy_file ${ALL_FILES})
file(copy ${SRC_DIR}/${copy_file} ${TGT_DIR})
endforeach(copy_file)
COMMENT "Copying lib from ${SRC_DIR} to ${TGT_DIR}"
DEPENDEES install)
我认为可能的解决方案可能是通过ExternalProject_Add_Step调用脚本,该脚本在内部进行复制,或者使用不同的步骤名称遍历ExternalProject_Add_Step。不确定哪种方法更清洁/更好
答案 0 :(得分:2)
在CMake函数中,调用和其他构造不能嵌套在一起。因此,在foreach()
参数中使用ExternalProject_Add_Step
命令是错误的。
但是您可以使用foreach()
来为ExternalProject_Add_Step
生成参数:
# This variable will contain list of 'COMMAND' clauses:
# COMMAND cmake -P copy <file-src> <file-dst>
set(COMMAND_COPY_FILES)
foreach(copy_file ${ALL_FILES})
list(APPEND COMMAND_COPY_FILES
COMMAND ${CMAKE_COMMAND} -E copy ${SRC_DIR}/${copy_file} ${TGT_DIR}/${copy_file}
)
endforeach(copy_file)
ExternalProject_Add_Step(${EXTERNAL_TARGET} lib_step
COMMAND ${CMAKE_COMMAND} -E make_directory ${TGT_DIR}
${COMMAND_COPY_FILES}
COMMENT "Copying lib from ${SRC_DIR} to ${TGT_DIR}"
DEPENDEES install)
如果文件是源目录的直接子目录(即ALL_FILES
不包含子目录),则可以使用copy
的单次调用:
# This variable will contain single 'COMMAND' clause but with many files:
# COMMAND cmake -P copy <src-files> <dest-dir>
set(COMMAND_COPY_FILES COMMAND ${CMAKE_COMMAND} -E copy)
foreach(copy_file ${ALL_FILES})
list(APPEND COMMAND_COPY_FILES ${SRC_DIR}/${copy_file})
endforeach(copy_file)
list(APPEND COMMAND_COPY_FILES ${TGT_DIR})