[devel] [RFP]: %altrelease macro
Alexander Bokovoy
=?iso-8859-1?q?ab_=CE=C1_altlinux=2Eorg?=
Вс Дек 16 16:50:55 MSK 2007
Задумал я облегчить сборку пакетов в среде установленного дистрибутива и
для репозитариев updates/backports. У нас есть некоторые требования по
отношению к наименованию релизов (тэг Release) в таких пакетах, вкратце
формулируемые так:
Тэг Release для пакета, собираемого в updates/backports, должен
содержать запись специального вида, облегчающую последующее обновление
пакета из более нового дистрибутива (или Sisyphus).
Это означает, что спек-файл пакета на самом деле претерпевает
определенные изменения (по меньшей мере, тэг Release) и фактически
вынуждает поддерживать две версии пакета даже в том случае, когда
никаких других изменений в пакет не вносится.
Однако можно изменить ситуацию так, чтобы не требовалось модифицировать
тэг Release (а просто пересобирать пакет). Для этого необходимо
предоставлять дополнительную информацию о сборочной среде в ней самой,
чтобы не передавать ее через специальные опции сборочной системы.
Последнее -- важное требование, оно связано с тем, что при использовании
hasher мы в общем случае не влияем на сборку, особенно при сборке
"роботами".
Мое предложение состоит в том, чтобы в практически единственный пакет,
который у нас гарантированно изменяется при выпуске новой версии
дистрибутива -- altlinux-release добавить несколько дополнительных
файлов, которые и обеспечат решение поставленной задачи. При одном
дополнительном "но", о котором чуть позже.
Представим, что в altlinux-release у нас присутствуют следующие файлы:
$ LANG=C rpm -ql altlinux-release
/etc/altlinux-release
/etc/buildreqs/packages/ignore.d/altlinux-release
/etc/mandrake-release
/etc/redhat-release
/etc/rpm/macros.d/00altlinux-release-macros
/etc/rpm/rpm-grt.conf
/etc/sisyphus-release
/usr/lib/rpm/rpm-generate-release-tag
Три из них -- новые, это /etc/rpm/macros.d/00altlinux-release-macros,
/etc/rpm/rpm-grt.conf и /usr/lib/rpm/rpm-generate-release-tag. Первый --
однострочный макрос для RPM, второй -- файл конфигурации для третьего,
который собственно и генерирует необходимый нам вид тэга Release.
Файл конфигурации rpm-grt.conf содержит всего две значимые строчки:
# Define distribution shortcut name and prefix for release tags
# An empty value of DISTRO_SHORTCUT corresponds to Sysiphus
DISTRO_SHORTCUT=M40
DISTRO_PREFIX=alt
rpm-generate-release-tag использует их для того, чтобы сконструировать
значение тэга Release. Если DISTRO_SHORTCUT пуст (мы имеем дело с
Sisyphus), то результат работы rpm-generate-release-tag --
${DISTRO_PREFIX}${release}, где ${release} -- первый параметр, поданный
на вход программы.
Если DISTRO_SHORTCUT содержит некоторое значение, (M40 в нашем случае),
то мы имеем дело с уже выпущенным дистрибутивом и это означает. что для
этого дистрибутива нам требуется модифицировать Release:
1. Уменьшить желаемое значение ${release} на единицу
2. после ${DISTRO_PREFIX}${release} дописать ${DISTRO_SHORTCUT} через точку
3. Далее (опционально) вписать локальный номер релиза для этой сборки
(второй аргумент команды rpm-generate-release-tag), а если он не указан,
то вписать 0.
В таком случае у нас получится тэг Release со значением, например,
alt2.M40.0 для пакета, который в Sisyphus имеет релиз alt3.
Все это возможно использовать в любом выпущенном дистрибутиве, записав в
качестве аргумента тэга Release макрос %altrelease с нужным значением
(или двумя, если еще нужен локальный номер релиза, отличный от нуля),
достаточно только обновить во всех таких дистрибутивах пакет
altlinux-release.
Вот пример:
$ head -n6 librfid.spec
name: librfid
version: 0.1.0
summary: The librfid is a Free Software RFID library
Release: %altrelease 2
Group: System Environment/Libraries
License: GPLv2
В системе на основе Server 4.0 результат будет следующим:
$ LANG=C rpmbuild -bE librfid.spec | head -n6
name: librfid
version: 0.1.0
summary: The librfid is a Free Software RFID library
Release: alt1.M40.0
Group: System Environment/Libraries
License: GPLv2
В Сизифе будет обычный Release: alt2
Нужно ли такое?
Обновленный altlinux-release можно найти у меня в git.alt. Пример сборки
для Server 4.0:
rpmbuild -ba --define 'distro_scut M40' --define 'distro Server' \
--define 'text_file ALT Linux 4.0 Server (Walnut)' \
altlinux-release.spec
--
/ Alexander Bokovoy
Samba Team http://www.samba.org/
ALT Linux Team http://www.altlinux.org/
Midgard Project Ry http://www.midgard-project.org/
Подробная информация о списке рассылки Devel