Может ли файл спецификации RPM "включать" другие файлы?

Есть ли какая-то директива include в спецификации RPM? Я не мог найти ответ, прибегая к помощи.

Мотивация: у меня есть шаблон спецификации RPM, который процесс сборки изменяет вместе с версией, ревизией и другими данными, специфичными для сборки. Это сделано sed В настоящее время. Я думаю, что было бы чище, если бы спецификация #include специфичный для сборки файл определений, который будет сгенерирован процессом сборки, поэтому мне не нужно искать и заменять его в спецификации.

Если нет includeЕсть ли идиоматический способ сделать эту (довольно распространенную, я полагаю) задачу?

7 ответов

Решение

RPM не поддерживает включает.

Я решил подобные проблемы либо с макропроцессором m4, либо просто объединяя части спецификации (когда "include" был в начале).

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

rpmbuild --define 'myvar SOMEVALUE' -bb myspec.spec

и вы можете использовать%myvar в спецификации.

Достаточно недавние версии rpmbuild, безусловно, поддерживают%:

%include common.inc

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

%include %{_topdir}/Common/common.inc

Я столкнулся с этой же проблемой недавно. Я хотел определить несколько подпакетов, которые были похожи, но каждый отличался незначительно (это были RPM для конкретного языка). Я не хотел повторять одни и те же вещи с котельной для каждого субпакета.

Вот общая версия того, что я сделал:

%define foo_spec() %{expand:%(cat '%{myloc}/main-foo.spec')}
%{foo_spec bar}
%{foo_spec baz}
%{foo_spec qux}

Использование %{expand} гарантирует, что %(cat) выполняется только один раз, когда макрос определен. Содержимое файла main-foo.spec затем трижды и каждый раз %1 в файле main-foo.spec расширяется до каждого из bar, baz а также quxчто, в свою очередь, позволяет мне воспринимать это как шаблон. Вы можете легко расширить это до более чем одного параметра, если у вас есть необходимость (я не сделал).

Для основной проблемы, возможно, есть два дополнительных решения, которые присутствуют во всех версиях rpm, о которых я знаю.

  1. дочерние пакеты
  2. macro а также rpmrc файлы.

дочерние пакеты

Другая альтернатива (и, возможно, "способ RPM") - использовать подпакеты. Maximum RPM также содержит информацию и примеры подпакетов.

Я думаю, что вопрос пытается структурировать что-то вроде,

  • два спецификационных файла; скажем rpm_debug.spec и rpm_production.spec
  • оба используют %include common.spec

debug и production также могут быть клиентом и сервером и т. д. В качестве примеров переопределения переменной каждый подпакет может иметь свой собственный список переменных.

Ограничения

Основным преимуществом подпакетов является то, что выполняется только одна сборка; Это также может быть недостатком. Пример отладки и производства может выделить это. Это можно обойти, используя strip создавать варианты или компилировать дважды с разным выводом; возможно используя VPATH с гну делают). Необходимость компилировать большие пакеты, а затем иметь только простые варианты, например, с / без информации для разработчиков, например headersстатические библиотеки и т. д. помогут вам оценить этот подход.

Макросы и Rpmrc

Подпакеты не решают проблему структурных определений, которые вы хотите для всей иерархии rootfs, или большей коллекции RPM. У нас есть rpmbuild --showrc за это. Вы можете иметь большое количество переменных и макросов, определенных путем изменения rpmrc а также macros когда ты бежишь rpm а также rpmbuild, От man страница,

   rpmrc Configuration
       /usr/lib/rpm/rpmrc
       /usr/lib/rpm/redhat/rpmrc
       /etc/rpmrc
       ~/.rpmrc

   Macro Configuration
       /usr/lib/rpm/macros
       /usr/lib/rpm/redhat/macros
       /etc/rpm/macros
       ~/.rpmmacros

Я думаю, что эти две функции могут решить все проблемы, которые %include Можно. Тем не мение, %include это знакомая концепция и, вероятно, была добавлена, чтобы сделать rpm более полнофункциональным и удобным для разработчиков.

Вы можете включить *.inc файлы из каталога SOURCES (%_sourcedir):

Source1: common.inc

%include %{SOURCE1}

Таким образом, они автоматически перейдут в SRPMS.

О какой версии вы говорите? В настоящее время у меня есть%include filename.txt в моем spec-файле, и он, кажется, работает так же, как директива C #include.

> rpmbuild --version
RPM version 4.8.1

Я использовал сценарии (назовите ваш любимый), чтобы взять шаблон и создать из него файл спецификации. Так же %files тег может импортировать файл, созданный другим процессом, например, Python bdist-rpm,

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