Руководство по использованию тега дистрибутива
Настоящее руководство описывает порядок использования тега %{dist}
в Fedora. В общем случае использование тега %{dist}
не является обязательным, но в то же время, это единственный разрешенный способ связывания версии пакета и дистрибутива. Выбор данного способа обусловлен исключительно необходимостью принятия согласованного стандарта для использования в Fedora, но не по причине отсутствия или неработоспособности других способов.
Настоящий документ является приложением к Packaging/NamingGuidelines .
Автор оригинала: Tom 'spot' Callaway
Версия: 0.16
Исходный вариант: Monday Mar 21, 2005
Последняя модификация: Monday, July 06 2009
Назначение тега дистрибутива
Для применения тега %{dist}
существует несколько целей. Исходным назначением тега было обеспечение возможности использования одного и того же spec-файла для нескольких выпусков дистрибутива одновременно. При этом существуют случаи, когда значения полей BuildRequires: и Requires: должны быть разными при использовании spec-файла для разных выпусков дистрибутива. Т.о. применение тега %{dist}
решает две задачи:
- позволяет различать несколько одноименных пакетов, которые в противном случае имели бы одинаковое значение
%{name}-%{version}-%{release}
, но при этом значимо различались по зависимостям,
- позволяет использовать проверку условий в spec-файле для объявления разных зависимостей.
Использование тега дистрибутива
Тег дистрибутива стандартизуется и документируется как элемент, использование которого не является обязательным и может осуществляться или не осуществляться ответственным за сопровождение пакета по собственному усмотрению.
Порядок использования тега %{dist}
Следующие подразделы содержат информацию, определяющую порядок использования тега дистрибутива %{dist}
в случае принятия решения об его использоваании.
Допустимые значения тега %{dist}
При выполнении команд сборки make tag
или make build
присвоение значений для тега %{dist}
и для ряда связанных с ним вспомогательных переменных осуществляется автоматически в соответствии с именем текущей рабочей ветви СКВ. Ручная установка данных переменных в spec-файле НЕ требуется. Порядок назначения %{dist}
задан в файле-описателе генерации Makefile.
Референсными примерами допустимых значений тега %dist
являются:
Red Hat Linux: 7.0, 7.1, 7.2, 7.3: .rhl7 8: .rhl8 9: .rhl9 Red Hat Enterprise Linux: 2.1 (all variants): .el2 3 (all variants): .el3 4 (all variants): .el4 5 (all variants): .el5 6 (all variants): .el6 Fedora, Fedora Core: 1: .fc1 2: .fc2 3: .fc3 4: .fc4 5: .fc5 6: .fc6 7: .fc7 8: .fc8 9: .fc9 10: .fc10 11: .fc11 12: .fc12 13: .fc13 Development: Для ветки development используется значение, соответствующее тегу для следующего крупного выпуска Fedora, находящегося в стадии подготовки.
При определении тега дистрибутива %{dist}
его значение всегда начинается с префиксного символа точки. Данное требование необходимо по причине того, что значение тега дистрибутива является составной частью поля, содержащего значение номера выпуска для пакета.
Перечисленные в примере значения тега дистрибутива могут быть найдены в common/branches.
Значения тагов дистрибутива для RHEL определяются только для пакетов из EPEL.
Размещение %{dist} в поле номера выпуска Release:
При использовании тега %{dist}
для обозначения принадлежности собираемого пакета определенному дистрибутиву, необходимо включить значение данного тега в поле номера выпуска Release по образцу:
Release: 1%{?dist}
Для этого сначала в соответствии с Packaging/NamingGuidelines определяется основное значение номера выпуска Release, в конец которому затем присоединяется строка %{?dist}
. Интерпретируется данная строка следующим образом:
Если значение %{dist} определено, то выполнить его подстановку в указанную позицию, если же нет - никаких подстановок не выполнять.
Если spec-файл содержит следующие записи:
Name: logjam Version: 1.4 Release: 2%{?dist}
то в результате выполнения по нему сборки пакета под архитектуру i386 для окружения из FC3, будет получен rpm-файл с именем logjam-1.4-2.fc3.i386.rpm
.
Значение %{dist}
никогда не должно включаться в поля Name и Version, а также встречаться в записях списка изменений %changelog.
Дополнительные переменные
Кроме непосредственно значения тега %{dist}
существует также ряд вспомогательных переменных, которые устанавливаются сборочной системой. К таким переменным относятся:
%{rhel}
: Данная переменная определяется только при выполнении сборки для Red Hat Enterprise Linux. Если ее значение задано, то оно содержит номер выпуска Red Hat Enterprise Linux, используемой в процессе сборки.
%{fedora}
: Данная переменная определяется только при выполнении сборки для Fedora. Если ее значение задано, то оно содержит номер выпуска Fedora, используемой в процессе сборки.
%{rhl}
: Данная переменная определяется только при выполнении сборки для Red Hat Linux. Если ее значение задано, то оно содержит номер выпуска Red Hat Linux, используемой в процессе сборки.
%{fc#}
: Данная переменная определяется только при выполнении сборки для Fedora. Например, для сборок под Fedora 7 значение %{fc7}
устанавливается в 1.
%{el#}
: Данная переменная определяется только при выполнении сборки для Red Hat Enterprise Linux. Например, для сборок под RHEL значение %{el5}
устанавливается в 1.
Все перечисленные переменные, если они определены, имеют исключительно числовые значения.
Используя значение тега %{dist}
и приведенных вспомогательных переменных можно осуществлять прверки условий в spec-файле и посредством их управлять порядком сборки пакета для разных дистрибутивов.
Ниже приведены примеры использования описанных переменных в условных макроопределениях:
%if 0%{?rhel} %endif %if 0%{?fedora} >= 4 %endif %{?fedora:%global _with_xfce --with-xfce} %if 0%{?rhel} %if 0%{?rhl} %endif %endif %if 0%{?rhl}%{?fedora} %endif %{?fc8:Requires: foo} %{?fc7:Requires: bar} %{?fc6:Requires: baz} %{?fc5:Requires: quux}
Для выполнения проверки принадлежности к определенному семейству дистрибутивов необходимо использовать конструкцию вида:
%if 0%{?rhel}
но НЕ конструкцию вида:
%if %{?rhel}
Без указания дополнительного 0 в случае, если значение %{rhel}
не определено, после выполнения подстановок условие в макроопределении %if
будет отсутствовать, что приведет к ошибке сборки.
Ограничения использования тега %{dist}
- Запрещается переопределять значение переменной
%{dist}
(а также других связанных переменных). - Запрещается жестко задавать значение
%{dist}
(а также других связанных переменных) в spec-файле. - Запрещается заменять в spec-файле включение тега дистрибутива фиксированным значением: НЕ ПРАВИЛЬНО: Release: 1.fc6 ПРАВИЛЬНО: Release: 1%{?dist}
- Запрещается использовать
%{dist}
(а также других связанных переменных) для каких-либо непредусмотренных маркировок. Тег%{dist}
(и связанные с ним переменные) предназначены ТОЛЬКО для определения дистрибутива, для которого осуществляется сборка пакета. - Значение
%{dist}
не должно использоваться в полях Name или Version, его использование разрешено только в поле Release так, как описано выше. - Значения
%{fedora}
,%{rhel}
,%{rhl}
,%{fc#}
,%{el#}
не должны использоваться в полях Name, Version или Release.
Общие вопросы
В: Почему сборочная система (или выполняющий сборку) не передает значение тега дистрибутива как параметр, например, rpmbuild --with dist el3
?
О: В действительности это происходит именно так. Сборочная система Fedora определяет значение тега дистрибутива когда выдается команда make tag
или make build
.
В: Существуют теги дистрибутива, установленные RPMForge. Почему не используется их стандарт?
О: RPMForge определяет набор стандартных используемых значений для тега дистрибутива как, например:
0.el2, 0.rh7, 0.rh8, 0.rh9, 1.el3, 1.fc1, 1.fc2, 1.fc3, 2.el4, 2.fc4, 2.fc5 ...
Значения тега дистрибутива, используемые RPMForge, предваряются дополнительным числом, которое используется для обеспечения возможности кросс-дистрибутивных обновлений между выпусками Red Hat Linux, Red Hat Enterprise Linux и Fedora. В то же время вопрос физической возможности, равно как и целесообразности, выполнения обновлений, например, между RHEL и Fedora вызывает серьезные сомнения. Использование же подобной схемы назначения тега дистрибутива потребовало бы такой возможности, несмотря на наличие коренных различий между дистрибутивами. Кроме того приведенная схема дополнительно усложняет поле Release, что может дезориентировать пользователей и начинающих специалистов по сопровождению пакетов.