У мене є кілька конфігураційних файлів (xml, ini, ...) у config
каталозі поруч із вихідними файлами. Як я можу скопіювати всі файли з каталогу config в каталог збірки (поруч із виконуваним файлом) кожного разу, коли я створюю проект?
Відповіді:
Можна використовувати 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
документації.make
це досить розумно, щоб навіть не виконати, make MyTarget
якщо виявить, що воно не змінилося. Якщо щось зміниться у вашій цілі, то make буде виконано на цій цілі, і файли будуть скопійовані.
make clean
повідомити, що скопійовані файли повинні бути видалені під час очищення проекту?
На додаток до верхньої відповіді,
Щоб скопіювати саму директорію замість вмісту, ви можете додати /${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)
CMake підтримує копію файлу типу оболонки. Це посилання має бути для вас корисним - Як скопіювати каталог із вихідного дерева у двійкове дерево?
У своєму проекті я використовую INSTALL, щоб вказати в CMake, що і куди я переміщую свій двійковий файл з файлом conf. Після виконання cmake використовуйте "make install".
install()
команду, але це для особливого випадку: код будує, проходить модульні тести і готовий до певного рівня використання іншими. Я не встановлюю його для налагодження.
add_executable
абоadd_library
.