Программа RPM предназначена для произведения всех видов операций с программным обеспечением,
в том числе и для создания пакетов для установки (RPM-пакетов).
Прежде, чем описать много сухих фактов, взятых из документации, рассмотрим простой пример
создания небольшого RPM-пакета. Я создал этот пакет для своей программки, которая
контролирует состояние указанного последовательного порта.
Будем считать, что программа уже откомпилирована и все файлы, необходимые для ее работы,
уже подготовлены. Нам нужны следующие файлы:
port - откомпилированный бинарный файл
README - файл, который будет помещен в каталог /usr/doc/port-1.0-99
port.1 - файл для справочной системы man
Все эти файлы я поместил в каталог /root/port. Конечно, это не совсем корректно, но
об этом будет сказано немного позже.
Для создания пакета нам нужно создать файл спецификаций. В файле спецификаций указывается
вся информация о создаваемом пакете: название, версия, файлы программ, файлы документации,
действия, выполняемые при установке пакета и при его удалении.
Вот мой файл спецификаций для программы port
Листинг 1.
# /root/port/port.spec
# Файл спецификаций для программы port
# Общее описание программы
Summary: Program to control your serial device
# Название пакета
Name: port
# Его версия
Version: 1.0
# Релиз
Release: 99
# Группа программного обеспечения. Группы (или категории) используются многими
# программами для манипуляции пакетами, например gnorpm, которая строит дерево
# категорий установленного программного обеспечения
Group: Monitoring
# Если хотите, можете указать свое имя, но обычно указывается GPL
License: GPL
# Можно также указать и copyleft
# Copyright: GPL
# Наш пакет ни с чем не кофликтует
# Conflicts:
# Менеджер сам заполнит это поле при необходимости (только для создания двоичных пакетов!)
# Require:
# Информация о создателе пакета
Packager: Denis Kolisnichenko [dhsilabs@mail.ru]
URL: http://dkws.narod.ru
# Тэги Summary, Name, Version, Release, Group, License явлются обязательными
# Из вышеуказанной информации видно, что будет создан пакет:
# port-1.0-99.i686.rpm
# Архитектура у вас может отличаться
# Полное описание пакета
%description
Программа port предназначена для мониторинга состояния последовательного
порта. При получении сигнала (1) на какой-нибудь контакт указанного порта,
port отправляет сообщение запустившему ее пользователю на указанный email
# Файлы, которые будут помещены в пакет
%files
/root/port/port
/root/port/port.1
# Файлы, которые будут помещены в каталог /usr/doc/port-1.0-99
%doc /root/port/README
# Действия, выполняемые при установке пакета
%install
# Файл port копируется в каталог /usr/bin (права доступа 555)
install -s -m 555 -o 0 -g 0 /root/port/port /usr/bin
# Файл port.1 копируется в каталог /usr/man/man1 (права доступа 444)
install -m 444 -o 0 -g 0 /root/port/port.1 /usr/man/man1
Для построения пакета нужно ввести команду:
# rpm -bb /root/port/port.spec
Если вы не допустили никаких ошибок при создании файла спецификаций, на экране вы
увидите примерно такое сообщение:
Executing(%install): /bin/sh -e /var/tmp/rpm-tmp.33439
Processing files: port-1.0-99
Finding Provides: (using /usr/lib/rpm/find-provides)...
Finding Requires: (using /usr/lib/rpm/find-requires)...
Requires: ld-linux.so.2 libc.so.6 libc.so.6(GLIBC_2.0)
Записан: /usr/src/RPM/RPMS/i686/port-1.0-99.i686.rpm
При этом будет создан пакет port-1.0-99.i686.rpm. Этот пакет будет помещен в каталог
/usr/src/RPM/RPMS/i686
Проведем небольшой эксперимент. Запустите Midhight Commander (mc), перейдите в каталог
/usr/src/RPM/RPMS/i686/ и "ввойдите" в пакет port-1.0-99.i686.rpm как в обычный каталог.
В нем будет "подкаталог" INFO, в котором и содержится вся информация о пакете.
Что ж, мы успешно разобрались с построением простого пакета, но для создания реальных
пакетов установки наших знаний все еще не хватает. Теперь настала очередь той сухой теории, о
которой я упомянул в начале статьи.
Традиционно, процедура создания RPM-пакетов состоит из следующих этапов:
- Извлечения исходных текстов программы из архива
- Компилирование программы из исходных текстов
- Создание RPM-пакета
Первые два этапа можно пропустить, что мы и сделали при создании нашего пакета. Это
можно сделать только в случае, если программа уже откомпилирована из исходных текстов.
Программа RPM использует файл конфигурации rpmrc. Поиск этого файла происходит
в каталогах /usr/lib/rpm, /etc, $HOME. Просмотреть этот файл можно с помощью команды:
# rpm --showrc
Запись topdir файла конфигурации rpmrc содержит название каталога, в котором находится дерево
подкаталогов, которое используется менеджером RPM для постороения пакетов. Введите команду:
# rpm --showrc | grep topdir
-14: _builddir %{_topdir}/BUILD
-14: _rpmdir %{_topdir}/RPMS
-14: _sourcedir %{_topdir}/SOURCES
-14: _specdir %{_topdir}/SPECS
-14: _srcrpmdir %{_topdir}/SRPMS
-14: _topdir %{_usrsrc}/RPM
У меня эти подкаталоги находятся в каталоге /usr/src/RPM. Как вы видите, в этом каталоге
находятся подкаталоги BUILD, RPMS, SOURCES, SPECS, SRPMS.
В каталоге BUILD создается RPM-пакет. В каталоге SOURCES находятся сжатые исходные
тексты программы. В каталог RPMS помещаются созданные пакеты. Точнее, они помещаются в один
из его подкаталогов, в какой именно - это зависит от архитектуры. В каталог SRPMS помещаются
пакеты, содержащие исходные тексты программы.
В каталоге SPECS находятся файлы спецификаций. Обычно файл спецификации называется
название_программы-версия-релиз.spec.
Например, если у вас есть исходный текст программы в архиве, из которого вы хотите создать пакет
RPM, скопируйте его в каталог SOURCES
# cp source_code-1.0.tar.gz /usr/src/RPM/SOURCES
По умолчанию менеджер RPM работает с пакетами, расположенным в каталоге с именем, совпадающем
с названием пакета и его версией. Для нашего пакета port это будет каталог port-1.0-99.
Менеджер пакетов будет компилировать наш пакет в каталоге /usr/src/RPM/port-1.0-99
Думаю, уже достаточно информации о каталогах RPM. Теперь перейдем к файлу спецификаций.
Файл спецификаций состоит из четырех сегментов: заголовка, подготовительного, файлового,
установочного.
В заголовке указывается общая информация о пакете. В листинге 1 к сегменту заголовка относятся
тэги Summary, Name, Version, Release, Group и Licese. На них мы останавливаться не будем, так как их
назначение понятно из листинга 1.
Есть еще очень полезный тэг: BuildRoot. Он изменяет расположение дерева BUILD. Значением
по умолчанию является /usr/src/RPM или другой каталог, задаваемый переменной окружения
$RPM_BUILD_ROOT. В целях экономии дискового пространства полезно после установки удалить
дерево %RPM_BUILD_ROOT. Но дерево по умолчанию может содержать другие файлы, относящиеся к другим
пакетам. Поэтому сначала с помощью тэга BuildRoot нужно задать какой-нибудь временный каталог,
а после установки удалить его.
В каждом сегменте находятся макрокоманды. С некоторыми мы уже знакомы - это %description,
%files, %doc, %install. В таблице 1 приведено полное описание макрокоманд.
Таблица 1.
Макрокоманда | Описание |
%description |
Полное описание пакета
%prep | Подготовка архива. Здесь задаются команды для извлечения исходного текста
программы и его распаковки, дополнительная подготовка исходного текста. После макрокоманды
%prep задаются обычные команды shell. |
%setup |
Макрокоманда извлечения файлов из архивов. Опция -n возволяет указать каталог, в котором
будет создаваться новый пакет. Обычно распаковывается архив, расположенный в каталоге
SOURCES в каталог BUILD |
%build |
Макрокоманда компилирования. Обычно здесь запускается программа make с необходимыми
параметрами |
%files | Задает список файлов, входящих в состав пакета. При указании имен файлов должен
быть указан полный, а не относительный путь. Для указания полного пути можно использовать переменную
окружения $RPM_BUILD_ROOT. Необходимые файлы уже должны быть помещены в каталог BUILD. Этого
можно достичь с помощью макрокоманды %setup или с помощью %pre (см. ниже) |
%config список | Задает список файлов, которые будут помещены в каталог /etc |
%doc список | Задает список файлов, которые будут помещены в каталог
/usr/doc/[package]-[ver]-[release]. |
%install | Этап установки программного обеспечения. Здесь нужно записать
команды, которые будут устанавливать файлы, входящие в состав пакета. Удобнее использовать
команду install, которую я использовал в листинге 1 |
%pre | Действия, которые будут выполнены до инсталляции пакета |
%post | Действия, которые будут выполнены после инсталляции пакета |
%preun | Действия, которые будут выполнены перед удалением пакета |
%postun | Действия, которые будут выполнены после удаления пакета |
%clean | Удаление дерева BUILD. Используется вместо опции --clean программы rpm.
Обычно содержит одну команду: rm -rf $RPM_BUILD_ROOT |
Нужно сделать небольшое замечание относительно макрокоманд %config и %doc. В этом случае
список задается не так, как в макрокоманде %files. Если после макрокоманды %files можно было
просто указать по одному файлу в каждой строке, то в макрокоманде %doc каждому файлу
(или каждому списку) должна предшествовать команда %doc. Например,
%doc README TODO Changes
%doc Install
а не
%doc
README
TODO
Changes
Install
Еще раз отмечу, что наличие всех макрокоманд в файле спецификаций не является обязательным.
При создании пакета мы использовали опцию -bb программы rpm. При указании этой опции
создается только двоичный RPM-пакет, если вы хотите создать также пакет, содержащий
исходный текст проргаммы, используйте опцию -ba. Созданный пакет помещается в каталог
SRPMS и будет иметь имя port-1.0-99.src.rpm. То есть вместо названия архитектуры будет
указано, что данный пакет содержит исходный текст программы. Для создания такого пакета в
каталоге SOURCES должны находиться исходные тексты программы.
Для полноты картины осталось рассмотреть опции менеджера rpm, которые используются
для создания пакетов.
Таблица 2.
-ba | Создаются два пакета: двоичный и содержащий исходный текст. При этом
не пропускается ни один этап установки, указанный в файле спецификаций |
-bb | Создается только двоичный пакет. Не пропускается ни один этап установки,
указанный в файле спецификаций |
-bc |
Выполняются этапы %pre и %build. При этом пакет распаковывается и компилируется |
-bi | Выполняются этапы %pre, %build, %install |
-bl | Выполянется проверка списка файлов, указанных в макрокоманде %files |
-bp | Выполянется только этап %pre, то есть распаковывается архив |
--recompile package.src.rpm | Указаный пакет, содержащий исходные тексты, сначала
устанавливается, а потом компилируется |
--rebuild package.src.rpm | Устанавливает и компилируется пакет исходных текстов, а затем
создается новый двоичный пакет |
--test | Проверка файла спецификаций |
--clean | Удаление дерева каталогов BUILD после создания пакета |
--showrc | Выводит файл конфигурации |