CMake add_custom_command иногда удаляет свой первый вывод? - PullRequest
0 голосов
/ 13 июня 2018

В моем файле 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.

1 Ответ

0 голосов
/ 13 июня 2018

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...