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