CMake add_custom_command иногда удаляет свой первый вывод?

В моем файле CMake у меня есть пользовательская команда, которая вызывает генерацию внешнего кода. Сгенерированные файлы являются заглушками, в которые пользователь может поместить свой собственный код. Таким образом, генерация кода позволяет не перезаписывать уже существующие файлы. Моя пользовательская команда выглядит так:

set(generatedOnceSrc foo.h foo.cpp bar.h bar.cpp)
add_custom_command(
    OUTPUT ${generatedOnceSrc}
    COMMAND ${generateCmd}
    VERBATIM
)
add_executable(myProg  ${generatedOnceSrc}  ${frameworkSrc})

Теперь я заметил, что, по крайней мере, иногда первый элемент ${generatedOnceSrc} (foo.h в этом случае) удаляется и восстанавливается. Конечно, это вызовет проблемы, как только пользователь начнет редактировать сгенерированный foo.h,

Документация add_custom_command не упоминает такого поведения, но и не отрицает его. Итак, мой вопрос:

Я прав с моим наблюдением?

Обратите внимание, что я уже нашел решение, подобное этому:

set(generatedOnceSrc foo.h foo.cpp bar.h bar.cpp)
set_source_files_properties(generatorOutput PROPERTIES SYMBOLIC true)
add_custom_command(
    OUTPUT generatorOutput
    BYPRODUCTS ${generatedOnceSrc}
    COMMAND ${generateCmd}
    VERBATIM
)
add_custom_target(generatorTarget DEPENDS generatorOutput)
add_executable(myProg  ${generatedOnceSrc}  ${frameworkSrc})
add_dependencies(myProg generatorTarget)

К сожалению, это вызывает ${generateCmd} на каждой сборке, потому что символический файл generatorOutputвсегда считается устаревшим и CMake не проверяет существование ${generatedOnceSrc} больше

Версии

  • Генератор: Unix Makefiles
  • CMake 3.5.1
  • Ubuntu 16.04

редактировать

Забыл упомянуть, что я наблюдал такое поведение с генератором Makefiles Unix, который по умолчанию используется в моей системе Ubuntu 16.04.

1 ответ

Редактирование автоматически сгенерированных файлов - плохая идея.

Если вы хотите сгенерировать ваши файлы только один раз, тогда подумайте об использовании execute_process генерировать их на этапе настройки, а не на этапе сборки.

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

Другие вопросы по тегам