CMake: копировать файл из исходного каталога в двоичный каталог
Я пытаюсь создать простой проект на CLION. Он использует CMake (я здесь новый) для создания Makefile для создания проекта (или его вида)
Все, что мне нужно, это передать какой-то файл без проекта (какой-то файл ресурсов) в двоичный каталог каждый раз, когда я запускаю свой код.
Этот файл содержит тестовые данные и приложение, чтобы открыть их для чтения. Я попробовал несколько способов сделать это:
-
Через file(COPY ...
file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/input.txt
DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/input.txt
Хорошо выглядит, но он работает только один раз, а не восстанавливает файл после следующего запуска.
-
Через add_custom_command
-
OUTPUT
версия
add_custom_command(
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/input.txt
COMMAND ${CMAKE_COMMAND} -E copy
${CMAKE_CURRENT_SOURCE_DIR}/input.txt
${CMAKE_CURRENT_BINARY_DIR}/input.txt)
-
TARGET
версия
add_custom_target(foo)
add_custom_command(
TARGET foo
COMMAND ${CMAKE_COMMAND} copy
${CMAKE_CURRENT_BINARY_DIR}/test/input.txt
${CMAKE_SOURCE_DIR})
Но никто из них не работает.
Что я делаю неправильно?
Ответы
Ответ 1
Вы можете использовать configure_file с опцией COPYONLY
:
configure_file(<input> <output> COPYONLY)
В отличие от file(COPY ...)
он создает зависимость уровня файла между входом и выходом, то есть:
Если входной файл изменен, система сборки повторно запустит CMake для повторной настройки файла и создания системы сборки снова.
Ответ 2
оба параметра действительны и нацелены на два разных этапа сборки:
-
file(COPY ...
копирует файл на этапе настройки и только на этом шаге. Когда вы перестраиваете свой проект, не изменив конфигурацию cmake, эта команда не будет выполнена.
-
add_custom_command
является предпочтительным выбором, когда вы хотите скопировать файл на каждом шаге сборки.
Правильная версия для вашей задачи:
add_custom_command(
TARGET foo POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy
${CMAKE_SOURCE_DIR}/test/input.txt
${CMAKE_CURRENT_BINARY_DIR}/input.txt)
вы можете выбрать между PRE_BUILD
, PRE_LINK
, POST_BUILD
лучше всего вы читаете документацию add_custom_command
пример использования первой версии можно найти здесь: Использовать CMake add_custom_command для генерации источника для другой цели
Ответ 3
Первый из предложенных вами вариантов не работает по двум причинам.
Сначала вы забыли закрыть круглую скобку.
Во-вторых, DESTINATION
должен быть каталогом, а не именем файла. Предполагая, что вы закрыли скобку, файл попадет в папку с именем input.txt
.
Чтобы заставить его работать, просто измените его на
file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/input.txt
DESTINATION ${CMAKE_CURRENT_BINARY_DIR})