Решение 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()
сохранит ваше исходное дерево чистым от сгенерированных файлов.