cmake3 внешний проект добавить пошаговый цикл - PullRequest
0 голосов
/ 02 ноября 2018

В настоящее время у меня есть External_Project_Add_Step, чтобы скопировать каталог из «source dir» в «dest dir». В последнее время я понял, что для этого процесса я копирую около 4 ГБ данных, тогда как на самом деле мне нужно будет копировать отдельные файлы (много файлов, но общий размер ~ 1 ГБ).

 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 голосов
/ 02 ноября 2018

В 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})
...