2013-03-29 18 views
11

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

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

Пример:

mkdir build 
cd build 
cmake .. 
make 

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

ответ

12

Вы можете скопировать этот файл в дереве сборки с помощью 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> 
        ) 

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

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

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

install(TARGETS MyExe RUNTIME DESTINATION bin) 

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

install(FILES src/some_opencl_kernel.cl DESTINATION bin) 

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

+0

Фрейзер Я действительно ценю это, мне было интересно, если у вас возникли мысли по поводу использования 'configure_file' с' COPYONLY'? – Constantin

+0

Это тоже работает, и это самый простой вариант, если вы не копируете в каталог сборки, где размещаются exes/libs, или если этот каталог установлен. Например, MSVC добавляет директорию «Debug» в ['RUNTIME_OUTPUT_DIRECTORY'] (http://www.cmake.org/cmake/help/v2.8.10/cmake.html#prop_tgt:RUNTIME_OUTPUT_DIRECTORY) для отладочных сборников. Если вы никогда не будете использовать генератор с несколькими конфигурациями, это, возможно, не проблема для вас, и 'configure_file' будет более простым вариантом. – Fraser

8

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

# 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 шаблоны

Смежные вопросы