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





Редактировать автоматически сгенерированные файлы - вообще плохая идея.
Если вы хотите сгенерировать файлы только один раз, подумайте об использовании execute_process для их создания на этапе настройки, а не на этапе сборки.
В противном случае, если вам действительно нужно, чтобы они были сгенерированы во время сборки, вам лучше организовать это так, чтобы пользовательский код можно было подключить без редактирования этих файлов.
Спасибо, ты прав. Но я пока не могу это изменить, потому что это сложное программное обеспечение, и моя текущая задача - модернизировать систему сборки путем преобразования в CMake. Я уже обнаружил и применил execute_process для начального поколения во время настройки CMake, но в некоторых случаях мне также требуется регенерация в более поздней сборке.
CMake определенно не удаляет файл по адресу этап настройки (при запуске
cmake). В этап сборки все управляется системой сборки, а не самим CMake. Какой система сборки вы используете? Делать? Ниндзя?