Подтвердить что ты не робот

Установка дополнительных файлов с помощью CMake

Я пытаюсь предоставить некоторые "исходные" файлы с некоторыми исполняемыми файлами. Мне было интересно, есть ли способ скопировать эти исходные файлы в каталог сборки (из исходного каталога), затем в каталог установки с помощью cmake.

Моя более конкретная цель - включить ядра OpenCL, которые я пишу в их собственных файлах .cl.

Пример:

mkdir build
cd build
cmake ..
make

Теперь мой каталог должен иметь исполняемый файл (стандартный cmake) и some_opencl_kernel.cl, который я открываю в своем исполняемом файле. ТИА

4b9b3361

Ответ 1

Вы можете скопировать файл в дерево сборки с помощью add_custom_command, добавив что-то вроде следующего:

add_custom_command(TARGET MyExe POST_BUILD
                   COMMAND ${CMAKE_COMMAND} -E copy_if_different
                       ${CMAKE_CURRENT_SOURCE_DIR}/src/some_opencl_kernel.cl
                       $<TARGET_FILE_DIR:MyExe>
                   )

Это добавляет событие post-build к вашей цели (я назвал его MyExe), который копирует файл src/some_opencl_kernel.cl в тот же каталог в дереве сборки, что и ваш exe.

Существуют разные способы копирования файла в дерево сборки, но мне это нравится, поскольку он использует выражение-генератор $<TARGET_FILE_DIR:MyExe> для определения местоположения каталога exe в дереве сборки. Это может варьироваться в зависимости от, например, build-type или platform, поэтому выражение генератора - это самый надежный кросс-платформенный способ определения этого местоположения, который я чувствую.

Что касается установки, вы можете просто использовать команду install(FILES ...). Предполагая, что для вашего exe у вас есть что-то вроде

install(TARGETS MyExe RUNTIME DESTINATION bin)

вы можете просто добавить:

install(FILES src/some_opencl_kernel.cl DESTINATION bin)

который установит его на ${CMAKE_INSTALL_PREFIX}/bin/some_opencl_kernel.cl рядом с exe.

Ответ 2

Если вы хотите скопировать дерево папок с некоторыми типами файлов:

  # Copy all assets to resources file
  INSTALL(DIRECTORY ${CMAKE_CURRENT_LIST_DIR}/assets/ DESTINATION ${INSTALL_PATH}/assets
          FILES_MATCHING PATTERN "*.dae"  PATTERN "*.jpg")

Если вы хотите скопировать все файлы в папки, просто удалите шаблоны FILES_MATCHING