2015-01-14 2 views
2

Я использую внешнюю библиотеку, которая предоставляет функцию CMake для автоматической генерации кода, которая будет использоваться в моих CMakeLists. Проблема в том, что всякий раз, когда я изменяю CMakeLists, функция снова запускается, вызывая перекомпиляцию вновь созданных, но неизменных источников. Мне нужно что-то вроде add_custom_command с возможностью указать функцию CMake как COMMAND вместо исполняемого файла, так что функция запускается только в том случае, если автоматически созданные файлы еще не присутствуют. Возможно ли это? Если нет, существует ли другой способ получить тот же результат? Спасибо.CMake: выполнить макро/функцию как команду add_custom_command

ответ

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) 
+0

Спасибо, это в значительной степени решает мою проблему. Но поскольку функция считывает файл конфигурации, чтобы сгенерировать код, мне нужно будет повторно запустить его, когда изменяется файл конфигурации. Вот почему я попросил что-то вроде add_custom_command, которые поддерживают зависимости. –

+0

Вау, я не знал IS_NEWER_THAN. Обновленный ответ - это полное решение для моей проблемы, спасибо! –

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)