может ли файл спецификации RPM "включать" другие файлы? - PullRequest
10 голосов
/ 26 мая 2011

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

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

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

Ответы [ 7 ]

17 голосов
/ 19 января 2012

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

%include common.inc

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

%include %{_topdir}/Common/common.inc
8 голосов
/ 03 июня 2011

RPM не поддерживает include.

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

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

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

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

5 голосов
/ 14 мая 2013

Я недавно столкнулся с такой же проблемой.Я хотел определить несколько подпакетов, которые были похожи, но каждый отличался незначительно (они были 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, в свою очередь, что позволяет мнерассматривать это как шаблон.Вы можете легко расширить это до более чем одного параметра, если у вас есть необходимость (я не сделал).

4 голосов
/ 17 апреля 2013

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

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

* 1013 дочерние пакеты * Другая альтернатива (и, возможно, « RPM way ») - это использование подпакетов . Максимальная скорость вращения также содержит информацию и примеры подпакетов . Я думаю, что вопрос пытается структурировать что-то вроде два файла спецификаций; скажем rpm_debug.spec и rpm_production.spec оба используют %include common.spec debug и production также могут быть client и server и т. Д. В примерах переопределения переменной каждый subpackage может иметь собственный список переменных. Ограничения

Основным преимуществом подпакетов является то, что происходит только одна сборка ; Это также может быть недостатком. Пример debug и production может выделить это. Это можно обойти, используя strip для создания вариантов или , компилирующих дважды с различным выводом; возможно, используя VPATH с Gnu Make). Необходимость компилировать большие пакеты, а затем иметь только простые варианты, например, с / без информации для разработчика, например 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 является знакомой концепцией и, вероятно, был добавлен, чтобы сделать об / мин более полнофункциональным и удобным для разработчиков.

3 голосов
/ 07 июня 2012

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

Source1: common.inc

%include %{SOURCE1}

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

2 голосов
/ 19 августа 2011

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

> rpmbuild --version
RPM version 4.8.1
1 голос
/ 18 апреля 2013

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

...