Skip to main content

Создание RPM пакетов

Июнь 28, 2010 Автор: Hikaru

Подготовка окружения.
Перед созданием RPM пакетов для Fedora необходимо установить инструменты разработчика и настроить аккаунт для создания пакетов. От root выполните:

yum groupinstall 'Development Tools'
yum install rpmdevtools

Теперь следует создать специального пользователя, от имени которого будут собираться RPM пакеты

useradd makerpm

Затем следует войти под этим пользователем. После успешного входа под этим пользователем следует создать дерево директорий, выполнив команду:

rpmdev-setuptree

Эта команда создаст директорию ~/rpmbuild, в которой будет набор поддиректорий (например SPECS и BUILD), которые будут использоваться для создания RPM пакетов. Так же, команда создаёт файл ~/.rpmmacros, который позволит командам rpm и rpmbuild верно использовать созданную структуру директорий.
Инструкции по созданию RPM пакетов рекомендуют использовать команды которые сохраняют время создания файлов. Если вы используете wget и curl, для получения исходных файлов, можно настроить автоматическое сохранение времени создания файлов, для этого нужно создать файл ~/.wgetrc содержащий команду

timestamping=on

Тем, кто использует curl следует добавить в файл ~/.curlrc опцию

-R

Основы создания rpm пакетов
Для того чтобы создать RPM пакет необходимо написать файл .spec, который предоставляет информацию о ПО, чей пакет создаётся. Затем этот файл предаётся команде rpmbuild, которая пройдёт ряд шагов для создания пакета.
Исходные коды помещаются в папку ~/rpmbuild/SOURCES, spec-файлы помещаются в папку ~/rpmbuild/SPECS и называются NAME.spec, где NAME - название собираемого пакета. Для того чтобы создать как бинарный, так и пакет с исходным кодом следует перейти в директорию ~/rpmbuild/SPECS выполнить команду:
rpmbuild -ba NAME.spec

Создание spec файла
Для создания spec файла следует перейти в директорию ~/rpmbuild/SPECS и воспользоваться vi или emacs, они автоматически создадут шаблон spec файла, который нужно будет заполнить.
Не забудьте следовать инструкции по именованию пакетов

Name:
Version:
Release:        1%{?dist}
Summary:

Group:
License:
URL:
Source0:
BuildRoot:      %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX)

BuildRequires:
Requires:

%description


%prep
%setup -q


%build
%configure
make %{?_smp_mflags}


%install
rm -rf $RPM_BUILD_ROOT
make install DESTDIR=$RPM_BUILD_ROOT


%clean
rm -rf $RPM_BUILD_ROOT


%files
%defattr(-,root,root,-)
%doc
%changelog

Подробно о файле spec
Name: Название пакета, должно удовлетворять требованиям Packagen Naming Guidelines (https://fedoraproject.org/wiki/Packaging/NamingGuidelines), в большинстве случаев должно состоять только из строчных букв. Далее в spec файле, к имени можно обращаться с помощью макроса %{name}, таким образом, если название пакета изменится, во всех остальных частях файла название пакета изменится.
Version: Номер версии, если в качестве номера версии используются даты,то версию следует записывать в виде гг.мм[дд], таким образом, число 2008-05-01 становится 8.05). Для обращения к версии в других частях spec файла следует использовать %{version}
Release: Значение этого поля должно быть равным 1%{?dist}, таким образом, число должно увеличиваться каждый раз, когда создаётся пакет для одной и той же версии ПО.
Summary: Краткое описание пакета в одну строку.
Group: Одна из существующих групп пакетов, например Applications/Engineering. Для того чтобы узнать список доступных групп выполните команду less /usr/share/doc/rpm-*/GROUPS. Если вы создаёте пакет с документацией "...-doc", используйте группу "Documentation".
License: Лицензия на ПО, должна быть одной из лицензий ПО с отрытими исходными кодами, используйте стандартную аббревиатуру т.е. "GPLv2+". Следует указывать лицензию максимально точно, можно указывать несколько лицензий с помощью "and" и "or" т.е. "GPLv2 and BSD".
URL: Ссылка на информацию о программе, например на сайт проекта.
Source0: Ссылка на архив с исходным кодом. Если будет передана полная ссылка, то пакет с именем из этой ссылки должен лежать в папке SOURCES. Если источников исходного кода несколько, то следует указать и их, с помощью деректив Source1, Source2 и т.д.
Patch0: Название первого патча налагаемого на ПО, имя файла должно заканчиваться на .patch и лежать в директории ~/rpmbuild/SOURCES. Патчей может быть несколько.
BuildArch: Если создаётся универсальный пакет, то здесь должна стоять метка "noarch".
BuildRoot: Место, куда приложение будет "установлено" во время выполнения процесса "%install". Обычно, этот параметр не стоит трогать, в случае стандартной Fedora, будет выполнен макрос, который создаст специальную директорию в /var/tmp. Более новые версии RPM пропустят это значение и поместят build root в %{_topdir}/BUILDROOT/
BuildRequires: Список приложений, разделённых запятой, необходимых для сборки приложения. Автоматически не определяются, поэтому сюда следует включить всё, что необходимо для сборки приложения. Приложения, которые являются "стандартными" для сборки в этот список включать не стоит (например gcc). Полный список приложений, которые могут быть пропущены можно посмотреть здесь (https://fedoraproject.org/wiki/Packaging/Guidelines).
Requires: Список приложений, разделённый запятыми, необходимых приложений для работы после установки. Замедте, что списки BuildRequires и Requires независимы друг от друга. Приложение может быть как в одном из списков, так и в обоих. В большинстве случаев, зависимости бинарных пактов определяются автоматически rpmbuild, таким образом, часто нет необходимости указывать приложения в этом разделе. Тем не менее, если вы хотите указать какие-либо специфичные пакеты или пакеты, которые rpm не может определить как зависимости автоматически, то их следует указать здесь.
%description: Полное описание программы, следует использовать английский язык, строки не должны быть длинее 80 символов. Пустые строки следует использовать для обозначения параграфов.
%prep: Скрипты для "подготовки" программы, для распаковки и подготовки её к сборке.
%build: Скрипты для сборки программы, компиляции и подготовки к установке.
%test: Скрипты для тестирования программы, выполняются после %build и до %install.
%install: Скрипты для "установки" программы, команды скопируют файлы из "build directory" %{_builddir} (которая находится ~/rpmbuild/BUILD) в директорию buildroot %{buildroot}, которая обыно находится в /var/tmp.
%clean: Инструкции для очистки buildroot, обычно

rm -rf %{buildroot}

%files: Список устанавливаемых файлов.
%changelog: Изменения в программе.

Пример deadbeef

Name: deadbeef	
Version: 0.4.1	
Release:	1%{?dist}
Summary: A music player with *.cue support	

Group:	Applications/Multimedia
License: GPLv2	
URL: http://deadbeef.sourceforge.net/		
Source0: http://downloads.sourceforge.net/project/deadbeef/deadbeef-0.4.1.tar.bz2
BuildRoot:	%(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX)

BuildRequires: flac-devel, libtool, dbus-devel, libsamplerate-devel, libvorbis-devel, alsa-lib-devel,
libcurl-devel, libmad-devel, ffmpeg-devel, wavpack-devel, 
libsndfile-devel, libcdio-devel, libcddb-devel, pulseaudio-libs-devel, gtk2-devel	
Requires: alsa-plugins-samplerate, gtk2 >= 2.12, alsa-lib, libvorbis, libcurl,
libmad, wavpack, libsndfile, libcdio, libcddb, ffmpeg, libsx, dbus, pulseaudio

%description
DeaDBeeF (as in 0xDEADBEEF) is an audio player for GNU/Linux systems with X11 
(though now it also runs in plain console without X, in FreeBSD, and in OpenSolaris).

It is mainly written by Alexey Yakovenko, with contributions from a lot of different people 
(see about box in the player for more details).

It is distributed under the terms of General Public License version 2.


%prep
%setup -q


%build
%configure
make %{?_smp_mflags}


%install
rm -rf $RPM_BUILD_ROOT
make install DESTDIR=$RPM_BUILD_ROOT


%clean
rm -rf $RPM_BUILD_ROOT


%files
%defattr(-,root,root,-)
%doc

   /usr/bin/deadbeef
   /usr/include/deadbeef/deadbeef.h
   /usr/lib/deadbeef/adplug.a
   /usr/lib/deadbeef/adplug.la
   /usr/lib/deadbeef/adplug.so
   /usr/lib/deadbeef/adplug.so.0
   /usr/lib/deadbeef/adplug.so.0.0.0
   /usr/lib/deadbeef/alsa.a
   /usr/lib/deadbeef/alsa.la
   /usr/lib/deadbeef/alsa.so
   /usr/lib/deadbeef/alsa.so.0
   /usr/lib/deadbeef/alsa.so.0.0.0
   /usr/lib/deadbeef/artwork.a
   /usr/lib/deadbeef/artwork.la
   /usr/lib/deadbeef/artwork.so
   /usr/lib/deadbeef/artwork.so.0
   /usr/lib/deadbeef/artwork.so.0.0.0
   /usr/lib/deadbeef/cdda.a
   /usr/lib/deadbeef/cdda.la
   /usr/lib/deadbeef/cdda.so
   /usr/lib/deadbeef/cdda.so.0
   /usr/lib/deadbeef/cdda.so.0.0.0
   /usr/lib/deadbeef/dumb.a
   /usr/lib/deadbeef/dumb.la
   /usr/lib/deadbeef/dumb.so
   /usr/lib/deadbeef/dumb.so.0
   /usr/lib/deadbeef/dumb.so.0.0.0
   /usr/lib/deadbeef/ffap.a
   /usr/lib/deadbeef/ffap.la
   /usr/lib/deadbeef/ffap.so
   /usr/lib/deadbeef/ffap.so.0
   /usr/lib/deadbeef/ffap.so.0.0.0
   /usr/lib/deadbeef/ffmpeg.a
   /usr/lib/deadbeef/ffmpeg.la
   /usr/lib/deadbeef/ffmpeg.so
   /usr/lib/deadbeef/ffmpeg.so.0
   /usr/lib/deadbeef/ffmpeg.so.0.0.0
   /usr/lib/deadbeef/flac.a
   /usr/lib/deadbeef/flac.la
   /usr/lib/deadbeef/flac.so
   /usr/lib/deadbeef/flac.so.0
   /usr/lib/deadbeef/flac.so.0.0.0
   /usr/lib/deadbeef/gme.a
   /usr/lib/deadbeef/gme.la
   /usr/lib/deadbeef/gme.so
   /usr/lib/deadbeef/gme.so.0
   /usr/lib/deadbeef/gme.so.0.0.0
   /usr/lib/deadbeef/gtkui.a
   /usr/lib/deadbeef/gtkui.la
   /usr/lib/deadbeef/gtkui.so
   /usr/lib/deadbeef/gtkui.so.0
   /usr/lib/deadbeef/gtkui.so.0.0.0
   /usr/lib/deadbeef/hotkeys.a
   /usr/lib/deadbeef/hotkeys.la
   /usr/lib/deadbeef/hotkeys.so
   /usr/lib/deadbeef/hotkeys.so.0
   /usr/lib/deadbeef/hotkeys.so.0.0.0
   /usr/lib/deadbeef/lastfm.a
   /usr/lib/deadbeef/lastfm.la
   /usr/lib/deadbeef/lastfm.so
   /usr/lib/deadbeef/lastfm.so.0
   /usr/lib/deadbeef/lastfm.so.0.0.0
   /usr/lib/deadbeef/mpgmad.a
   /usr/lib/deadbeef/mpgmad.la
   /usr/lib/deadbeef/mpgmad.so
   /usr/lib/deadbeef/mpgmad.so.0
   /usr/lib/deadbeef/mpgmad.so.0.0.0
   /usr/lib/deadbeef/notify.a
   /usr/lib/deadbeef/notify.la
   /usr/lib/deadbeef/notify.so
   /usr/lib/deadbeef/notify.so.0
   /usr/lib/deadbeef/notify.so.0.0.0
   /usr/lib/deadbeef/nullout.a
   /usr/lib/deadbeef/nullout.la
   /usr/lib/deadbeef/nullout.so
   /usr/lib/deadbeef/nullout.so.0
   /usr/lib/deadbeef/nullout.so.0.0.0
   /usr/lib/deadbeef/oss.a
   /usr/lib/deadbeef/oss.la
   /usr/lib/deadbeef/oss.so
   /usr/lib/deadbeef/oss.so.0
   /usr/lib/deadbeef/oss.so.0.0.0
   /usr/lib/deadbeef/pulse.a
   /usr/lib/deadbeef/pulse.la
   /usr/lib/deadbeef/pulse.so
   /usr/lib/deadbeef/pulse.so.0
   /usr/lib/deadbeef/pulse.so.0.0.0
   /usr/lib/deadbeef/sid.a
   /usr/lib/deadbeef/sid.la
   /usr/lib/deadbeef/sid.so
   /usr/lib/deadbeef/sid.so.0
   /usr/lib/deadbeef/sid.so.0.0.0
   /usr/lib/deadbeef/sndfile.a
   /usr/lib/deadbeef/sndfile.la
   /usr/lib/deadbeef/sndfile.so
   /usr/lib/deadbeef/sndfile.so.0
   /usr/lib/deadbeef/sndfile.so.0.0.0
   /usr/lib/deadbeef/supereq.a
   /usr/lib/deadbeef/supereq.la
   /usr/lib/deadbeef/supereq.so
   /usr/lib/deadbeef/supereq.so.0
   /usr/lib/deadbeef/supereq.so.0.0.0
   /usr/lib/deadbeef/vfs_curl.a
   /usr/lib/deadbeef/vfs_curl.la
   /usr/lib/deadbeef/vfs_curl.so
   /usr/lib/deadbeef/vfs_curl.so.0
   /usr/lib/deadbeef/vfs_curl.so.0.0.0
   /usr/lib/deadbeef/vorbis.a
   /usr/lib/deadbeef/vorbis.la
   /usr/lib/deadbeef/vorbis.so
   /usr/lib/deadbeef/vorbis.so.0
   /usr/lib/deadbeef/vorbis.so.0.0.0
   /usr/lib/deadbeef/vtx.a
   /usr/lib/deadbeef/vtx.la
   /usr/lib/deadbeef/vtx.so
   /usr/lib/deadbeef/vtx.so.0
   /usr/lib/deadbeef/vtx.so.0.0.0
   /usr/lib/deadbeef/wavpack.a
   /usr/lib/deadbeef/wavpack.la
   /usr/lib/deadbeef/wavpack.so
   /usr/lib/deadbeef/wavpack.so.0
   /usr/lib/deadbeef/wavpack.so.0.0.0
   /usr/share/applications/deadbeef.desktop
   /usr/share/deadbeef/pixmaps/buffering_16.png
   /usr/share/deadbeef/pixmaps/next_24.png
   /usr/share/deadbeef/pixmaps/noartwork.jpg
   /usr/share/deadbeef/pixmaps/pause_16.png
   /usr/share/deadbeef/pixmaps/pause_24.png
   /usr/share/deadbeef/pixmaps/play_16.png
   /usr/share/deadbeef/pixmaps/play_24.png
   /usr/share/deadbeef/pixmaps/prev_24.png
   /usr/share/deadbeef/pixmaps/random_24.png
   /usr/share/deadbeef/pixmaps/stop_24.png
   /usr/share/doc/deadbeef/COPYING.GPLv2
   /usr/share/doc/deadbeef/COPYING.LGPLv2.1
   /usr/share/doc/deadbeef/ChangeLog
   /usr/share/doc/deadbeef/README
   /usr/share/doc/deadbeef/about.txt
   /usr/share/doc/deadbeef/help.txt
   /usr/share/icons/hicolor/16x16/apps/deadbeef.png
   /usr/share/icons/hicolor/32x32/apps/deadbeef.png
   /usr/share/icons/hicolor/48x48/apps/deadbeef.png



%changelog 
	* Mon May 29 2010 Alexey Yakovenko 
	*better default/minimal search window size
	*improved tag reader in ffmpeg plugin + reload metadata support
	*fixed EQ drawing unwanted current value at initialization
	*allow editing previous custom grouping value
	*increased sort speed
	*fixed alsa and oss plugins writing zero samples at start of tracks (TheMaister)
	*fixed recover from suspend in alsa plugin
	*fixed md5 structure buffer overflow
	*added experimental support for gtk3 (2.90), enabled with --enable-gtk3
	*improved oss plugin responsiveness on pause (TheMaister)
	*fixed vfs_curl crashing randomly when loading album art
	*ignore currently paused song when opening new file(s) from commandline
	*fixed playlist moving bugs
	*fixed memory leaks in id3v2 parser
	*increased maximum limit on id3v2 APIC frame size to 2MiB
	*added cd text support (Viktor Semykin)
	*fixed wavpack crash on corrupted files
	*fixed random crash when using File -> Open
	*added remember/restore current folder in playlist save/load dialogs
	*fixed reversing track order after drag-n-drop
	*fixed "Loop single file" mode after track was moved or deleted
	*removed apply button from Global Hotkeys preferences window
	*fixed FLAC bitrate calculation
	*fixed ID3v2 "extra size" field parser
	*fixed memory leaks in vorbis plugin
	*fixed several crash-bugs in mp3 plugin
	*fixed known bugs in album artwork code
	*added automatic backtrace printing on SIGSEGV
	*added multi-track vorbis files support
	*added %C(composer) expansion to title formatting
	*fixed few theming/colors issues
	*fixed replaygain field parsing when reading cuesheets and r.g. peak scale handling (David Bryant)
	*added support for WavPack correction files (David Bryant)
	*fixed loading of album art embedded in ID3v2
	*added MP4 file type to ffmpeg plugin

Вот собственно и всё. Если всё было верно сделано, теперь у вас должен быть готовый к установке rpm пакет.