Я использую внешнюю библиотеку, которая предоставляет функцию CMake для автоматической генерации кода, которая будет использоваться в моих CMakeLists. Проблема в том, что всякий раз, когда я изменяю CMakeLists, функция снова запускается, вызывая перекомпиляцию вновь созданных, но неизменных источников. Мне нужно что-то вроде add_custom_command с возможностью указать функцию CMake как COMMAND вместо исполняемого файла, так что функция запускается только в том случае, если автоматически созданные файлы еще не присутствуют. Возможно ли это? Если нет, существует ли другой способ получить тот же результат? Спасибо.CMake: выполнить макро/функцию как команду add_custom_command
2
A
ответ
3
Чтобы предотвратить эту функцию для запуска, просто обернуть его в if
:
if(NOT EXISTS ${CMAKE_BINARY_DIR}/blah-blah/generated.cpp)
run_your_provided_command(BLAH_BLAH)
endif()
Легко!
Update: Для того, чтобы запустить его, когда конфигурационный файл изменился просто использовать немного более сложное условие:
if(
NOT EXISTS ${CMAKE_BINARY_DIR}/blah-blah/generated.cpp OR
${CMAKE_SOURCE_DIR}/blah-blah.config IS_NEWER_THAN ${CMAKE_BINARY_DIR}/blah-blah/generated.cpp
)
...
и использовать add_dependencies
команду, чтобы убедиться, что ваш бинарный будет восстановить в случае изменений конфигурационного файла:
add_executable(
YourBinary
...
${CMAKE_BINARY_DIR}/blah-blah/generated.cpp
)
add_dependencies(YourBinary ${CMAKE_SOURCE_DIR}/blah-blah.config)
1
Посмотрите на this SO post.
Вы можете вызвать вашу функцию в отдельном сценарии CMake, вызовите этот скрипт с add_custom_target
и cmake -P
затем добавить зависимость к бинарным:
add_custom_target(run_script COMMAND ${CMAKE_COMMAND} -P separate_script.cmake)
add_executable(your_binary ...)
# or add_library(your_binary ...)
add_dependencies(your_binary run_script)
Спасибо, это в значительной степени решает мою проблему. Но поскольку функция считывает файл конфигурации, чтобы сгенерировать код, мне нужно будет повторно запустить его, когда изменяется файл конфигурации. Вот почему я попросил что-то вроде add_custom_command, которые поддерживают зависимости. –
Вау, я не знал IS_NEWER_THAN. Обновленный ответ - это полное решение для моей проблемы, спасибо! –