cmake3外部项目添加步骤循环

时间:2018-11-02 06:28:31

标签: cmake external-project

当前,我具有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。不确定哪种方法更清洁/更好

1 个答案:

答案 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})