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

Ошибка CMake add_custom_command

Я пытаюсь использовать add_custom_command для создания файла во время сборки. Команда никогда не запускалась, поэтому я сделал этот тестовый файл.

cmake_minimum_required( VERSION 2.6 )

add_custom_command(
  OUTPUT hello.txt
  COMMAND touch hello.txt
  DEPENDS hello.txt
)

Я попытался запустить:

cmake .  
make

И hello.txt не был сгенерирован. Что я сделал неправильно?

4b9b3361

Ответ 1

Добавьте следующее:

add_custom_target(run ALL
    DEPENDS hello.txt)

Если вы знакомы с make файлами, это означает:

all: run
run: hello.txt

Ответ 2

Решение add_custom_target(run ALL ... будет работать для простых случаев, когда у вас есть только одна цель, которую вы строите, но ломается, когда у вас есть несколько целей верхнего уровня, например. приложения и тесты.

Я столкнулся с этой же проблемой, когда я пытался упаковать файлы тестовых данных в объектный файл, чтобы мои модульные тесты не зависели от чего-либо внешнего. Я решил использовать его с помощью add_custom_command и некоторой дополнительной магии зависимостей с set_property.

add_custom_command(
  OUTPUT testData.cpp
  COMMAND reswrap 
  ARGS    testData.src > testData.cpp
  DEPENDS testData.src 
)
set_property(SOURCE unit-tests.cpp APPEND PROPERTY OBJECT_DEPENDS testData.cpp)

add_executable(app main.cpp)
add_executable(tests unit-tests.cpp)

Итак, теперь testData.cpp будет сгенерирован до скомпилирования unit-tests.cpp и в любое время изменится testData.src. Если команда, которую вы вызываете, очень медленная, вы получаете дополнительный бонус, который, когда вы создаете только цель приложения, вам не придется ждать этой команды (которой нужны только исполняемые файлы).

Это не показано выше, но тщательное приложение ${PROJECT_BINARY_DIR}, ${PROJECT_SOURCE_DIR} and include_directories() будет поддерживать чистое исходное дерево от сгенерированных файлов.