Як скопіювати вміст каталогу в каталог побудови після створення за допомогою CMake?


81

У мене є кілька конфігураційних файлів (xml, ini, ...) у configкаталозі поруч із вихідними файлами. Як я можу скопіювати всі файли з каталогу config в каталог збірки (поруч із виконуваним файлом) кожного разу, коли я створюю проект?

Відповіді:


146

Можна використовувати add_custom_command.

Скажімо, ваша ціль називається MyTarget, тоді ви можете зробити це:

add_custom_command(TARGET MyTarget PRE_BUILD
                   COMMAND ${CMAKE_COMMAND} -E copy_directory
                       ${CMAKE_SOURCE_DIR}/config/ $<TARGET_FILE_DIR:MyTarget>)

Це виконується кожного разу, коли ви створюєте MyTargetта копіюєте вміст "/ config" в каталог, куди потрапляє цільовий exe / lib.

Як Марк Lakata вказує в коментарі нижче, замінивши PRE_BUILDз POST_BUILDв add_custom_commandгарантує , що копіювання відбуватиметься тільки тоді , коли збірка пройшла успішно.

Пояснення

  • ${CMAKE_COMMAND} - шлях до CMake
  • -E робить CMake запускати команди замість того, щоб будувати
  • copy_directoryє інструментом командного рядка
  • config це каталог (який підпадає під корінь проекту), вміст якого буде скопійовано до цілі збірки
  • $<TARGET_FILE_DIR:MyTarget>- це вираз генератора , описаний у add_custom_commandдокументації.

1
Одна з ваших фактичних цілей, яку ви отримали у своєму CMakeLists.txt - тобто щось додане за допомогою add_executableабо add_library.
Фрейзер

1
Так - я думаю, що makeце досить розумно, щоб навіть не виконати, make MyTargetякщо виявить, що воно не змінилося. Якщо щось зміниться у вашій цілі, то make буде виконано на цій цілі, і файли будуть скопійовані.
Фрейзер

7
POST_BUILD - це, мабуть, кращий варіант, що означає, що файли будуть скопійовані лише в тому випадку, якщо збірка буде успішною.
Марк Лаката,

6
Чи є спосіб make cleanповідомити, що скопійовані файли повинні бути видалені під час очищення проекту?
moonwalker

3
Чи є спосіб скопіювати сам каталог замість вмісту?

12

На додаток до верхньої відповіді,

Щоб скопіювати саму директорію замість вмісту, ви можете додати /${FOLDER_NAME}в кінець другий параметр.

Подобається це:

add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
                   COMMAND ${CMAKE_COMMAND} -E copy_directory
                       ${CMAKE_SOURCE_DIR}/config $<TARGET_FILE_DIR:${PROJECT_NAME}>/config)


-5

У своєму проекті я використовую INSTALL, щоб вказати в CMake, що і куди я переміщую свій двійковий файл з файлом conf. Після виконання cmake використовуйте "make install".


OP запитав, як це зробити після завершення збірки. Імплікація без іншої команди, введеної в оболонку. Виконайте збірку та пуф файлів, які ваші бінарні файли знаходяться там чарівним чином. Я теж використовую install()команду, але це для особливого випадку: код будує, проходить модульні тести і готовий до певного рівня використання іншими. Я не встановлюю його для налагодження.
PfunnyGuy
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.