Может ли файл спецификации 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, о которых я знаю.
- дочерние пакеты
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
,