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

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})
      

    Но никто из них не работает.

Что я делаю неправильно?

4b9b3361

Ответ 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})