В моем файле 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}
.
Версии
- Генератор: Makefiles Unix
- CMake 3.5.1
- Ubuntu 16.04
Edit
Забыл упомянуть, что я наблюдал такое поведение с генератором Unix Makefiles , который по умолчанию используется в моей системе Ubuntu 16.04.