Спецификация rpm: Как подавить ошибку «Макрос расширен в комментарии», не удаляя ссылку?

При устранении проблем с файлами RPM .spec часто бывает удобно комментировать строки из раздела %files:

%files
#%{_datadir}/vala/vapi/libgdaui-%{apiver}.vapi

Однако это может привести к следующим ошибкам сборки:

Macro expanded in comment on line 213: %{_datadir}/vala/vapi/libgdaui-%{apiver}.vapi

Вопрос

Есть ли способ сообщить rpmbuild о завершении сборки и рассматривать «Макрос, развернутый в комментарии», как предупреждение, а не как ошибку?

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

Charles Duffy 11.04.2024 05:01

исх. github.com/rpm-software-management/rpm/blob/…

Charles Duffy 11.04.2024 05:02

rpm >= 4.15 имеет настоящий примитив комментирования в виде %dnl, вдохновленного M4 (отбросить на следующую строку). Как следует из названия, он просто отбрасывает все до следующей новой строки, а макросы в отброшенной части, естественно, не расширяются (благодарность Пану Матилайнену).

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

Ответы 1

Ответ принят как подходящий

Это уже предупреждение, а не ошибка. В разделе %files, где макросы относятся к тому типу, который вы показываете (расширяющемуся до подмножества одного пути, а не списка путей), это безвредно. Проигнорируйте это или удвойте свои % (как советуют в документах), чтобы этого не произошло (а затем отмените это при раскомментировании того же контента).

Только сообщения журнала с уровнем CRIT вызывают автоматический сбой сборки. Сообщения журнала с уровнем WARN даже близко не стоят.

Вы также можете рассмотреть возможность использования макросов вместо комментариев для временного отключения функций (%if 0).


Цитата из исходного кода RPM:

    if (*bufA != '\0' || *bufB != '\0')
        rpmlog(RPMLOG_WARNING,
        _("Macro expanded in comment on line %d: %s\n"),
        spec->lineNum, bufA);

Как видите, единственное, что мы делаем при обнаружении случая, — это регистрируем предупреждение и ничего больше.

Хорошее замечание о возможной проблеме многострочного расширения. При выходе я получал сообщение об ошибке «Не удалось построить RPM», и в нем были перечислены все предупреждения Macro expanded in comment, поэтому, возможно, я неправильно прочитал сообщение. Мне удалось собрать пакет с успешными комментариями, содержащими макросы, поэтому спасибо за ваш подробный ответ.

KJ7LNW 11.04.2024 22:29

Это не всегда безвредно. Если бы макрос, который он расширял, был многострочным, то была бы отключена только первая строка макроса. Остальная часть макроса попытается его выполнить. Правильное решение — увеличить %% вдвое.

Aaron D. Marasco 14.04.2024 23:30

@AaronD.Marasco, цитирую ответ, на который вы ответили: где макросы имеют тот тип, который вы показываете (расширяющийся до подмножества одного пути, а не списка путей) - было ли это предостережение каким-то недостаточным? Да, конечно, экранирование % — правильный подход, но я не ожидаю, что кто-нибудь откажется от ярлыков редактора для (не)комментирования во время быстрой отладки, когда в этом нет строгой необходимости (конечно, перед отправкой готовой работы в исходный код, да , вполне уместный вопрос).

Charles Duffy 14.04.2024 23:37

@AaronD.Marasco, действительно, если вы посмотрите на комментарий непосредственно перед вашим, который ОП добавил к этому ответу, вы увидите, что они признали понимание того, что макросы, расширяющиеся до нескольких строк, могут вызвать проблемы, поэтому нет никаких сомнений в том, что это было явно общался!

Charles Duffy 14.04.2024 23:42

Другая проблема — код в комментарии. Строка #%global foo something%(touch /tmp/foo) игнорируется как комментарий, но макрос выполняется. Итак, файл /tmp/foo создан. А если вместо touch у вас будет какой-то странный rm, то у вас будут большие проблемы...

msuchy 17.04.2024 06:57

@msuchy, ... я не испытываю особой симпатии к людям, которые не могут помещать свои сборки в песочницу. (В основном я живу в мире NixOS — в прошлой жизни, когда я использовал Nix для создания образов дистрибутивов, отличных от Nix, первый раз запускал виртуальную машину qemu только с объявленными зависимостями для каждого пакета, а затем запускал каждый сборка отдельного пакета в переходном режиме, когда изменения на диске никогда не покидают память, а окончательные двоичные файлы копируются через файловую систему virtio, предназначенную для этой цели)

Charles Duffy 17.04.2024 20:19

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