Информация в данном посте могла устареть. Пост сохранен для истории.

Под Линуксом удобно устанавливать новые программы в виде RPM (или DEB) пакетов. Вся информация сохраняется в специальную базу данных. Это позволяет без проблем обновлять или удалять программы. К сожалению, разработчики дистрибутивов не торопятся включать в официальные репозитории последние версии программ, а разработчики программ не всегда выкладывают RPM-пакеты собственного изготовления.

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

Подготовка инфраструктуры

Необходимо установить пакет rpmdevtools из под рута и выполнить команду rpmdev-setuptree из-под обычного юзера. После этого в домашней директории юзера будет созданы директории:

rpmbuild
rpmbuild/BUILD
rpmbuild/BUILDROOT
rpmbuild/RPMS
rpmbuild/SOURCES
rpmbuild/SPECS
rpmbuild/SRPMS

Сборка RPM-пакета

Необходимо сделать tar.gz архив с исходниками программы. Название должно следовать шаблону: <name>-<version>.tar.gz (например, myprogram-1.0.tar.gz). Архив нужно поместить в директорию SOURCES.

Необходимо создать spec-файл с именем <name>.spec. Spec-файл содержит метаинформацию о пакете и скрипты для сборки, установки и удаления пакета. Spec-файл нужно поместить в директорию SPECS.

Из директории SPECS вызвать команду rpmbuild -ba <name>.spec

В случае успешного завершения будут созданы 3 RPM-пакета с приблизительно следующими названиями:

  • RPMS/i686/<name>-<version>-1.fc13.i686.rpm — искомый RPM-пакет
  • RPMS/i686/<name>-<version>-debuginfo-1.fc13.i686.rpm — пакет с отладочной информацией
  • SRPMS/i686/<name>-<version>.fc13.src.rpm — пакет с исходниками и spec-файлом

Описание spec-файла

Spec-файл состоит из 2х частей: метаинформации о пакете (название, описание, версия, лицензия, URL, название архива с исходниками, зависимости) и набора секций, которые называются %description, %prep, %build, %install, %clean, %files, %changelog.

Сборка программы происходит в директории BUILD, после чего устанавливается в директорию BUILDROOT. Для их удобного обозначения применяются макроопределения %{_builddir} и %{buildroot}.

Имеется также много других удобных макроопределений и макрокоманд.

Рассмотрим типичный spec-файл:

Summary: The example program
Name: myprogram
Version: 1.0
Release: 1.%{?dist}
License: GPL
Group: Applications/Multimedia
URL: http://example.com/
Source0: %{_sourcedir}/%{name}-%{version}.tar.gz
BuildRequires: automake
BuildRequires: autoconf
Requires: python

%description
The example program

%prep
%setup

%build
%configure
make

%install
rm -rf %{buildroot}
make DESTDIR=%{buildroot} install

%clean
rm -rf %{buildroot}

%files
%defattr(-, root, root)
%doc
%{_bindir}/*

%changelog
* Tue Jul 13 2010 Alexander Bobkov <alexbobkov@list.ru> 1.0-1

Первая половина файла в особых комментариях не нуждается. Рассмотрим несколько важных секций из второй половины.

  • В секции %prep происходит подготовка исходников. Необходимо их поместить в директорию BUILD. Для удобства используется макрос %setup, который распаковывает архив из директории SOURCES. Если имеются дополнительные файлы, то их можно копировать простой командой cp.
  • Секция %build содержит скрипт для сборки программы. В данном случае скрипт состоит только из двух команд: макрос %configure запускает команду configure, а make делает известно что.
  • Секция %install производит установку программы в директорию BUILDROOT
  • В секции %files указываются файлы из директории BUILDROOT, которые должны быть помещены в RPM-пакет.

Таким образом можно сделать собственный RPM-пакет для своей программы. По сути, spec-файл аккумулирует опыт ручной установки программы. Более подробное описание – в официальном руководстве.