Удовлетворение зависимостей
Часто наиболее сложной задачей становится сборка ПО должным образом. Одна из потенциальных проблем - существование зависимостей ПО от других программ и библиотек. В процессе работы с make следует обращать внимание на сторонние библиотеки, которые требуются для сборки. Эти зависимости должны быть позднее включены в спецификацию пакета на стадии построения rpm. В общем случае, каждая зависимость удовлетворяется собственным rpm-пакетом, таким образом нужно будет озаботиться обеспечением доступности этих rpm-пакетов.Когда достигнуты три цели: обеспечена воспроизводимая сборка, спланированы обновления, удовлетворены все зависимости, можно приступать к собственно сборке rpm-пакета.
Разворачивание структуры директорий
RPM использует для сборки пакетов пять каталогов, они описаны в таблице.Каталог | Использование |
BUILD | Утилита rpmbuild использует этот каталог в качестве каталога сборки ПО. |
RPMS | Утилита rpmbuild помещает в этот каталог собранные бинарные rpm-пакеты. |
SOURCES | В этот каталог необходимо поместить тарболлы с исходным кодом проектов, запланированных на сборку. |
SPECS | В этот каталог помещаются spec-файлы всех rpm-пакетов, которые запланированы на сборку. |
SRPMS | Утилита rpmbuild помещает в этот каталог собранные src.rpm-пакеты с исходным кодом. |
Код: Выделить всё
$ ls RPMS
athlon
i386
i486
i586
i686
noarch
Поскольку изначально RPM был спроектирован для построения дистрибутивов Linux в целом, этот путь может отличаться от указанного в других системах и его можно изменить редактированием rpmrc файлов.
Самый легкий способ - использовать уже имеющийся в системе путь к каталогам сборки. Для сборки под непривилегированным пользователем может потребоваться изменить права доступа к ним. Следует помнить, что ошибки сборки rpm-пакетов могут привести к серьезным проблемам в системе, если сборка производится от пользователя root.
Для того, чтобы приступить к сборке пакета осталось выполнить два действия:
- - поместить исходный код в SOURCE;
- поместить spec-файл в SPECS.
Размещение исходного кода в дереве сборки
Вообще говоря, можно поместить в SOURCES дерево каталогов с исходным кодом проекта. Но гораздо удобнее (и так и делается), особенно, если собирается много пакетов, поместить туда тарболл. Тогда в простом случае на каждый собираемый пакет будет приходится один файл с архивом. Раскрываться архив будет с помощью макросов RPM, тривиально с точки зрения пользователя. Это помогает держать исходный код разных проектов отдельно друг от друга, так как все они находятся в директории SOURCES.Соглашение об именовании тарболлов с исходным кодом предлагает следующую форму имен: имя_пакета-версия.tar.gz. Поместив архив в SOURCES, оператор делает скрипты сборки, исходный код и все необходимое доступным для RPM.
Создание spec-файла
Spec-файл, сокращение от "файл спецификации", определяет все действия утилиты rpmbuild, которые должны быть выполнены при построении приложения, так же как и все действия, необходимые при установке/удалении приложения. Каждый src.rpm-пакет имеет в своем составе spec-файл для последующей пересборки пакета.Spec-файл - это текстовый файл. Соглашение об именовании предлагает называть spec-файл таким образом:
Код: Выделить всё
имя_пакета.spec.
Секция общей информации (introduction)
Секция общей информации содержит сведения о пакете, которые после его установки могут быть запрошены командой rpm -qi имя_пакета. Например:
Код: Выделить всё
Summary: java source to bytecode compiler
Summary(ru): Исходный код компилятора байт-кода java
%define version 1.17
Copyright: IBM Public License, http://ibm.com/developerworks/oss/license10.html
Group: Development/Languages
Name: jikes
Prefix: /usr
Provides: jikes
Release: 1
Source: jikes-%{version}.tar.gz
URL: http://ibm.com/developerworks/opensource/jikes
Version: %{version}
Buildroot: /tmp/jikesrpm
%description
The IBM Jikes compiler translates Java source files to bytecode.
It also supports incremental compilation and automatic
makefile generation, and is maintained by the Jikes Project:
http://ibm.com/developerworks/opensource/jikes/
%description -l ru
Компилятор Java производства IBM Jikes осуществляет
преобразование исходного кода Java в
байт-код. Он поддерживает инкрементную компиляцию и автоматическую генерацию Makefile. Мантейнер - Jikes Project: http://ibm.com/developerworks/opensource/jikes/
Для отслеживания изменений требований от версии к версии rpm можно проанализировать spec-файлы пакетов современных сборок и сравнить их с прежними сборками.
Секция prep
Секция подготовки отвечает за команды, необходимые для начала сборки. Например, если в SOURCES положен тарболл проекта, его необходимо распаковать. В секции указываются для этого соответствующие макросы rpm:
Код: Выделить всё
%prep
%setup -q
Секция build
Секция build содержит команды сборки ПО. Обычно здесь присутствует всего несколько команд, например:
Код: Выделить всё
%build
./configure CXXFLAGS=-O3 --prefix=$RPM_BUILD_ROOT/usr
make
Секция install
Секция содержит команды установки файлов пакета в систему. Например:
Код: Выделить всё
%install
rm -rf $RPM_BUILD_ROOT
make install
Секция clean
Команды в этой секции вычищают файлы, созданные на других стадиях:
Код: Выделить всё
%clean
rm -rf $RPM_BUILD_ROOT
Секция files
И, наконец, команды в секции files задают списки файлов и каталогов, которые с соответствующими атрибутами должны быть скопированы из дерева сборки в rpm-пакет и затем будут копироваться в целевую систему при установке этого пакета. Например:
Код: Выделить всё
%files
%defattr(-,root,root)
/usr/bin/jikes
%doc /usr/doc/jikes-%{version}/license.htm
%doc /usr/man/man1/jikes.1*
После окончания редактирования spec-файла осталось поместить его в каталог SPECS под /usr/src/redhat, а тарболл с исходным кодом в SOURCES. Все готово для сборки rpm.