[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