Структура RPM SPEC-файла

Материал из Mageia Russian Community Wiki
Перейти к: навигация, поиск

Для создания RPM пакета нужен SPEC-файл. SPEC-файл - это обычный текстовый файл, имеет расширение .spec и содержит в себе название пакета, версию, номер релиза, инструкции по сборке и установке пакета и список изменений.

Заголовок SPEC-файла

Заголовок SPEC-файла включает название, версию, релиз, макросы и описание собираемого пакета RPM.

Название, версия и релиз

Наиболее важной частью информации о пакете является Name, Version и Release (Имя, Версия и Релиз), так как эта информация критична для работы RPM и используется в механизмах сравнения версий и отслеживания изменений. Первый раздел должен содержать стандартные директивы: название, версия и релиз. Директивы задаются простым синтаксисом: имя поля, двоеточие, пробел, значение. Например:

Name:    aide  
Version: 0.13.1
Release: %mkrel 1

Имя поля регистронезависимо, поэтому version, Version и VERSION задают одну и ту же переменную.
Значение Name должно соответствовать названию пакета, пишется всегда строчными буквами, не должно содержать пробелов, табуляций и символов новой строки. Однако, допустимо использовать дефис.
Значение Version используется при сравнении версий. В номере версии нельзя использовать дефис, так как дефисом отделяются имя, версия и релиз.
Значение Release обычно начинается с 1 при стартовой сборке пакета и далее увеличивается на единицу при каждой следующей пересборке. Всякий раз, когда изменяется SPEC-файл или файлы пакета, необходимо увеличивать номер релиза.
Если номера версии недостаточно для отделения одних групп версий от других, например, при смене плана разработки меняется система смены номеров версий, можно кроме версии задействовать понятие эпохи. Эпоха задается директивой Epoch: . Например:

Epoch: 3

Номера эпох задаются целым числом.

Определение макросов

Кроме задания различных значений можно определять макросы с использованием RPM-синтаксиса %define. Например:

%define major       2

Этот пример определяет макрос по имени major со значением 2. Однажды определив макрос, можно получать к нему доступ посредством инструкции %{имя_макроса} или, проще, %имя_макроса. Например:


source: %{name}-%{version}.tar.gz 

Примечание: определенный явно макрос для названия, версии и релиза бесполезен, так как те неявно определяются соответствующими директивами.
Остальные возможности макроопределений обсуждаются ниже.

Главные секции SPEC-файла также маркируются разделителем %.

Описание пакета

Summary:        Advanced Intrusion Detection Environment  
License:        GPLv2+
Group:          Monitoring
URL:            http://sourceforge.net/projects/aide
Source0:        http://prdownloads.sourceforge.net/aide/%{name}-%{version}.tar.gz
Source1:        http://prdownloads.sourceforge.net/aide/%{name}-%{version}.tar.gz.asc
Source2:        aide.conf
Source3:        aidecheck
Source4:        aideupdate
Source5:        aideinit
Source6:        aideinit.8
Patch0:         some.patch

Директива Summary: - это однострочное описание пакета. Данное поле заменило прежнюю директиву Description:. Кроме Summary: имеется еще многострочное описание, оно содержится не в директиве, а в специальной секции spec-файла, %description. Секция %description является заключительной частью заголовка SPEC-файла. Например:

%description 
This is a really cool package. It contains the really cool 
program that provides a maximum return on investment, 
or ROI, for achieving your crucial business objectives 
utilizing world-class high-caliber componentized software 
implemented with world-class quality and performance 
metrics.

Для задания национальных описаний используется синтаксис:

Summary(ru): Реально крутой пакет

или

%description -l ru 
Описание реально крутого 
пакета 
в многострочном формате.

В секции %description используется некоторое количество опций форматирования. Пустые линии интерпретируются как разделители абзацев. Строки, начинающиеся с пробелов или табуляций, интерпретируются как предварительно отформатированные абзацы и отображаются как есть, как правило, моноширинным шрифтом.

Директива License: предоставляет правовую информацию о пакете.
Директива Group: задает классификатор пакета. Для классификаторов лучше использовать имеющиеся группы пакетов, определенные в системе.
Директива URL: предоставляет информацию о нахождении сетевого ресурса ПО (или его производителя).
Директива Source определяет источники исходного кода. Большинство пакетов имеют более одного источника исходного кода, к которым необходимо обращаться из SPEC-файла. Как правило, это tar.gz-архивы с файлами кода. Это могут быть архивы от вендора или загруженные с сайтов сторонних разработчиков. Также допустимо использовать ссылки на сетевые источники кода (FTP или HTTP). Однако RPM не загружает файлы по этим ссылкам, они нужны только для дальнейшего обращения к источнику кода. Код по-прежнему будет загружаться из каталога SOURCES по имени файла. Определять источники кода следует с помощью полей Source, начиная счет с 0. Если существует только один файл с исходниками, можно не указывать номер источника.

Source: telnet-client.tar.gz

Довольно часто возникает необходимость исключить какие-то файлы исходного кода из src.rpm-пакета по соображениям проприетарности или чтобы сократить объем пакета. Для выполнения этой операции используется директива NoSource:

NoSource: 3 

Данный пример означает, что из коллекции исходников, помещаемых в src.rpm будет исключен источник №3. Подобным же образом действует директива NoPatch, она позволяет не включать в пакет с исходным кодом патчи разработчика. Директивы NoSource: и NoPatch: принимают только один номер патча (файла исходного кода) за раз. Если необходимо исключить несколько источников, потребуется задать соответствующее количество строк.
Если в SPEC-файле присутствуют директивы NoSource: или NoPatch:, вместо src.rpm будет собран пакет nosrc.rpm.
Патчи (директива Path) именуются подобно исходному коду. Следует обратить внимание, что номера патчей могут образовывать увеличивающуюся последовательность, но не обязаны следовать подряд, один за другим. Кроме того, можно добавлять патчи и вручную. Патчи могут быть отдельными файлами или патчами, сжатыми gzip.

Окончательно заголовок SPEC-файла будет выглядеть так:

Name:           aide
Version:        0.13.1
Release:        %mkrel 1

%define major       0
%define libname     %mklibname aide %{major}
%define somereallylongname foo

Summary:        Advanced Intrusion Detection Environment
License:        GPLv2+
Group:          Monitoring
URL:            http://sourceforge.net/projects/aide
Source0:        http://prdownloads.sourceforge.net/aide/%{name}-%{version}.tar.gz
Source1:        http://prdownloads.sourceforge.net/aide/%{name}-%{version}.tar.gz.asc
Source2:        aide.conf
Source3:        aidecheck
Source4:        aideupdate
Source5:        aideinit
Source6:        aideinit.8
Patch0:         some.patch

%description
AIDE (Advanced Intrusion Detection Environment) is a free alternative to
Tripwire. It does the same things as the semi-free Tripwire and more.  It
is a file system integrity monitoring tool.

Сценарий сборки

Следующий обязательный раздел SPEC-файла – это раздел подготовки к сборке %prep. Он содержит инструкции для распаковки архива исходных кодов и, при необходимости, внесения в них изменений перед сборкой. В простейшем случае данный раздел включает всего две строки

%prep
%setup -q

Макрос %setup выполняет распаковку архивов с исходными кодами и переходит в каталог %{name}-%{version}. Ключ -q (quiet) означает, что при этом не должна выводиться отладочная информация. Нередко приходится указывать и другие опции для этого макроса. В частности, если внутри архива с исходными кодами содержится каталог, имя которого отличается от %{name}-%{version}, то он указывается с помощью ключа -n :

%setup -q -n sources

Если же разработчики разместили все файлы прямо в корне архива, макросу %setup надо указать, чтобы он создал каталог верхнего уровня перед распаковкой, добавив ключ -c. Также в разделе %prep применяются патчи. Для этого используется макрос %patch, к имени которого добавляется номер патча. Если пути к файлам в патче не включают в себя имя каталога верхнего уровня (то есть утилиту patch следует вызывать с ключом -p0), то никаких опций макросу передавать не надо, в случае же, если в путях содержится это имя, то необходимо добавить ключ -p1, он будет передан программе patch. Например, для применения патча под номером 0 с ключом -p0 и патча под номером 1 с ключом -p1 следует использовать макросы :

%patch0 %patch1 -p1

Раздел %build отвечает за сборку пакета и в общем случае выглядит следующим образом :

%build
%configure
%make

Следующий раздел отвечает за установку программы и называется %install. В большинстве случаев установка выполняется при помощи команды make install, которой также передаётся переменная DESTDIR с указанием каталога назначения. Для этого служит макрос %makeinstall_std :

%install
%makeinstall_std

Комментарии

Всё, что начинается с #, является комментарием и игнорируется RPM. Комментарии - полезная вещь. Они помогают разработчику и всем, кто читает spec-файл после создания rpm, понять выбор той или иной синтаксической конструкции, особенно, если конструкция отличается от стандартной в подобном случае. Например, если используются нестандартные опции компилятора, будет полезно обосновать необходимость этого в комментарии. Такой комментарий будет полезен при портировании rpm под другую архитектуру.

Комментарии отменяют действие единичного знака %. Например:

# Added new commands to %prep

продолжение следует