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

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

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

CMake определенно не удаляет файл по адресу этап настройки (при запуске cmake). В этап сборки все управляется системой сборки, а не самим CMake. Какой система сборки вы используете? Делать? Ниндзя?

Tsyvarev 13.06.2018 09:52

Упс, забыл упомянуть систему сборки, хотя имел в виду. См. Редактирование выше.

bjhend 13.06.2018 10:03
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
694
1

Ответы 1

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

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

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

Спасибо, ты прав. Но я пока не могу это изменить, потому что это сложное программное обеспечение, и моя текущая задача - модернизировать систему сборки путем преобразования в CMake. Я уже обнаружил и применил execute_process для начального поколения во время настройки CMake, но в некоторых случаях мне также требуется регенерация в более поздней сборке.

bjhend 13.06.2018 08:17

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