Как скопировать несколько файлов определенного типа из исходного каталога в каталог назначения с помощью команд cmake? - PullRequest
0 голосов
/ 27 ноября 2018

Я совершенно новичок в 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)

Есть ли способ обновить этот фрагмент кода, чтобы выполнить мою работу?или дайте мне знать, если есть другое лучшее решение.заранее спасибо

1 Ответ

0 голосов
/ 27 ноября 2018

Первый шаг: сопоставить все файлы .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 abcde) создает список с a; b; c; d; e, а set (var «abcde») создает строку или список с одним элементом в нем.(Обратите внимание, что аргументы макроса не являются переменными и поэтому не могут использоваться в командах 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...