div.main {margin-left: 20pt; margin-right: 20pt}
Создание RPM-пакетов Автор: Денис Колисниченко, dhsilabs@mail.ru Опубликовано:
29.01.2002 Оригинал: http://www.softerra.ru/freeos/15571/
Программа RPM предназначена для произведения
всех видов операций с программным обеспечением, в том числе и для создания
пакетов для установки (RPM-пакетов).
Прежде, чем описать много сухих фактов, взятых
из документации, рассмотрим простой пример создания небольшого RPM-пакета. Я
создал этот пакет для своей программки, которая контролирует состояние
указанного последовательного порта.
Будем считать, что программа уже откомпилирована
и все файлы, необходимые для ее работы, уже подготовлены. Нам нужны следующие
файлы: port – откомпилированный бинарный файл README – файл 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
%doc /root/port/README
/root/port/port
/root/port/port.1
Для построения пакета нужно ввести команду: # 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 |
Выводит файл
конфигурации |
|