0

目前我有 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 进行循环。不确定哪种方法更清洁/更好

4

1 回答 1

2

在 CMake 中,函数调用和其他构造不能相互嵌套。因此,foreach()在参数中使用命令ExternalProject_Add_Step是错误的。

但是您可以使用foreach()for 生成参数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})
于 2018-11-02T08:12:21.640 回答