Paketbau
Grundsätzliches
Der Entwickler eines RPM-Paketes sollte mit der zu paketierenden Software vertraut sein.
Das bezieht sich auf die Nutzung von Funktionen ebenso wie auf Spezifika bei der Installation.
Eine aufmerksame Beobachtung der Entwicklung der Quellsoftware ist besonders für den Fall von Sicherheitsupdates erforderlich.
Überblick
Analyse der Quellsoftware
Bevor mit der Paketierung begonnen werden kann, ist eine gründliche Analyse der Quellsoftware erforderlich.
Dabei geht es um folgende Fragen:
- Gestattet die Lizensierung eine Verteilung der Software?
- Wie erfolgt das Übersetzen der Quellen? (automake -Projekt)
- Welche Optionen für
./configure
sind sinnvoll?
- Gibt es Abhängigkeiten zu anderen Softwarepaketen?
- Wohin werden Files installiert?
- Sind Konfigurationsfiles für den Betrieb der Software erforderlich/sinnvoll?
- Ist die Integration in Desktop, Systemstart, u.a. erforderlich?
$ tar xfz ../SOURCES/xpenguins-2.2.tar.gz
$ cd xpenguins-2.2/
$ ls
aclocal.m4 config.h.in COPYING lay-out-frames.scm missing README stamp-h.in xpenguins.spec.in
AUTHORS configure INSTALL Makefile.am mkinstalldirs resize-frames.scm themes
ChangeLog configure.in install-sh Makefile.in NEWS src xpenguins.1
$ vi README
$ ./configure --help
Usage: configure [options] [host]
Options: [defaults in brackets after descriptions]
...
Features and packages:
--disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
--enable-FEATURE[=ARG] include FEATURE [ARG=yes]
--with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
--without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
--x-includes=DIR X include files are in DIR
--x-libraries=DIR X library files are in DIR
--enable and --with options recognized:
--with-x use the X Window System
$ ./configure
$ make
$ mkdir -p /tmp/xpenguins; make DESTDIR=/tmp/xpenguins install
$ find /tmp/xpenguins/ -type f
/tmp/xpenguins/usr/local/bin/xpenguins
/tmp/xpenguins/usr/local/man/man1/xpenguins.1
/tmp/xpenguins/usr/local/share/xpenguins/themes ....
Build-Repositories
Für den Bau von RPM-Paketen ist eine Verzeichnisstruktur, das Build-Repository definiert:
-
SOURCES:
Für die Quellen, Patches, Skripte und sonstigen Daten, die zum Bau das RPM notwendig sind.
-
BUILD:
Hier erfolgt die Übersetzung der Software (Compile). (Ein Link in ein lokales Filesystem ist sinnvoll.)
-
SPECS:
Für die Steuerdatei, Spec-File.
-
RPMS:
Hier legt der Buildprozess die fertigen RPMs ab. Die plattformspezifischen Unterverzeichnisse (i386
, noarch
, usw.) werden automatisch angelegt.
-
SRPMS:
Hier legt der Buildprozess das fertige Source-RPM ab.
Auf Redhat- und verwandten Systemen liegt das Build-Repository normalerweise unter /usr/src/redhat/
.
Um den Buildprozess ohne root -Berechtigungen starten zu können, aber auch eine Trennung der Buildrepositories
nach Paketen zu organisieren erzeugen wir das Build-Repository z.B. im Homeverzeichnis.
Damit der Buildprozess das neue Build-Repository findet ist ein Eintrag im $HOME/.rpmmacros
erforderlich.
$ mkdir -p ${HOME}/RPMS/mypackage
$ cd ${HOME}/RPMS/mypackage
$ mkdir SOURCES BUILD SPECS RPMS SRPMS
$ echo "%_topdir ${HOME}/RPMS/mypackage" > $HOME/.rpmmacros
Das Erzeugen des Build-Repository wird auf URZ-administrierten Systemen mit dem Script /usr/local/bin/rpmrepo <packetname>
unterstützt.
Innerhalb eines solchen Build-Repository kann ein neues Paket erstellt werden oder ein vorhandenes Source-RPM installiert und erstellt werden.
Source-RPMs werden immer in ein Build-Repository installiert. Dabei wird das File $HOME/.rpmmacros
ausgewertet.
$ rpm -ihv ~/downloads/xpenguins-2.2-1.src.rpm
Steuerdatei / Spec-File
Die Steuerdatei enthält alle Daten und Anweisungen zum Erstellen eines RPM-Paketes.
1 Summary: Little penguins walking along the tops of your windows.
2 Name: xpenguins
3 Version: 2.2
4 Release: 1%{?dist}
5 License: GPL
6 Group: Amusements/Games
7 Source: %{name}-%{version}.tar.gz
8 URL: http://xpenguins.seul.org/
9 Packager: andreas.heik@hrz.tu-chemnitz.de
10 BuildRoot: %{_tmppath}/%{name}-%{version}-root
11 %description
12 Ever wanted cute little penguins walking along the
13 tops of your windows?
14 Ever wanted to send an army of cute little penguins
15 to invade the screen of someone else on your network?
16 Probably not, but why not try this program out anyway.
17 %prep
18 %setup
19 %build
20 %configure
21 %{__make} %{?_smp_mflags}
22 %install
23 %makeinstall
24 %clean
25 [ -n "%{buildroot}" -a "%{buildroot}" != / } && %{__rm} -rf %{buildroot}
26 %files
27 %defattr(-, root, root, -)
28 %doc AUTHORS ChangeLog COPYING INSTALL NEWS README
29 %{_bindir}/xpenguins
30 %{_datadir}/xpenguins/*
31 %{_mandir}/man1/xpenguins.1.gz
32 %changelog
33 * Wed Jul 19 2005 Andreas Heik <andreas.heik@hrz.tu-chemnitz.de> - 2.2-1
34 - initial spec file
Header-Section
- 1: Kurzbeschreibung
- 2: Name des Paketes
- 3: Version der Software
- 4: Release des Paketes
- 5: Lizenz unter der die Software kommt, meist "GPL" oder "BSD"
- 6: Klassifizierung, Klasse aus
/usr/share/doc/rpm-*/GROUPS
wählen
- 7: Quelle (muss im SOURCES-Verzeichnis vorhanden sein, wird in das SRPM eingepackt), eine fehlende Zahl entspricht der 0 ("Source:" == "Source0:")
- 8: URL der Homepage der Software
- 9: wer das Paket zusammengebaut hat (also i.d.R. das Spec-File entworfen hat)
- 10: wo das Programm während des Installationsprozesses hinein installiert wird, der Eintrag hier ist generisch
- 11-16: Beschreibung des Paketes
Einige der Header-Tags können über die Variablen wie %{name}
, %{version}
, %{release}
, %{SOURCE0}
, usw. benutzt werden.
%prep-Sektion
Die %prep-Sektion bereitet das Paket zur Übersetzung vor, Quellen werden in das %{_builddir}
(%{_topdir}/BUILD
) -Verzeichnis entpacken, ggf. Patches angewendet.
Danach wechselt rpmbuild
in das Verzeichnis %{_builddir}/%{name}-%{version}
.
- 18: Auspacken der Quelldaten
- "-q" hinter %setup unterdrückt die Ausgabe beim Auspacken des Tar-Files
- Unterscheidet sich der Name des Verzeichnisses, welches beim Auspacken der Quellen entsteht von
%{name}-%{version}
, muss der Name mit "-n" übergeben werden (z.B. %setup -n %{name}-20050512cvs
).
%build-Sektion
Die ausgepackten und gepatchten Quellen werden übersetzt. Üblicherweise die Schritte autoconf (./configure) und make.
- 20: Ist die Software für autoconf entworfen, so sollte
./configure
durch das Macro %configure
ersetzt werden. Dadurch werden dem configure korrekte Argumente für --prefix
, --bindir
, --mandir
usw. übergeben.
- 21: %{__make} verweist auf /usr/bin/make
-
%{?_smp_mflags}
ist ein Makro, welches make mitteilt, wieviele CPUs im System vorhanden sind und für den Übersetzungsprozess verwendet werden können. Das Macro hat keinen Einfluss auf das entstehende Binary.
%install-Sektion
Verlief der Übersetzungsprozess erfolgreich, werden die Binaries jetzt installiert. Dabei ist zu beachten, dass die Installation in ein temporäres Verzeichnis, die Buildroot erfolgt. Darunter werden die sonst in der Wurzel zu findenden Verzeichnisse wie etc
, usr/bin
, usw. aufgespannt.
- 23: Das Macro
%makeinstall
arbeit analog dem %configure
, übergibt aber die Installationsverzeichnisse unter der Buildroot.
%clean-Section
- 25: Die Buildroot wird nach erfolgreichem Paketbau entfernt. Treten Fehler während des Paketbaues auf, wird die Cleansection nicht ausgeführt.
%files-Sektion
Beschreibt alle Files, welche in das RPM-Paket integriert werden sollen. Es wird bei Definition einer Buildroot automatisch dort gesucht.
Installierte, aber nicht in der %files-Sektion erwähnte Files erzeugen Warnungen.
Für die Verzeichnisse sollten die vordefinierten Macros verwendet werden! Siehe dazu auch /usr/lib/rpm/macros
- 27: Standardeinstellungen für Eigentümer und Zugriffsrechte werden festgelegt
- 28: Dokumentation, aufgeführte Files und Verzeichnisse aus dem Quellpaket werden unter
/usr/share/doc/%{name}-%{version}
abgelegt
- 29-31: Zum Paket gehörende Files. (Executables, Libraries, Manuals, usw)
Changelog-Section
- 33-34: Das Changelog enthält die Paket-Historie; es sollte erkennbar sein, wann und warum das Paket verändert wurde. Das Datum muss im Format
LANG=C date +"%a %b %d %Y"
sein.
Buildprozess
Für das Erstellen von RPMs aus einem Spec-File bzw. Source-RPM wird das Kommando rpmbuild
verwendet.
$ cd ${HOME}/RPMS/mypackage/SPECS/
$ rpmbuild -ba xpenguins.spec
Wurde das Build-Repository mit rpmrepo
erzeugt, unterstützt das Skript /usr/local/bin/rpmrbuild
den Buildprozess. Dabei wird sichergestellt, daß der Buildprozess im Build-Repository des Spec-Files abläuft.
Die Skripte löschen den Inhalt von ~/.rpmmacros
! Eigene Einstellungen können in ~/.rpmmacros.base
erfolgen, diese Datei wird an die erzeugte ~/.rpmmacros
angehängt.
Tip zur Vereinfachung: Wenn man folgende Zeile in ~/.bashrc
einträgt, kann man wie gewohnt einfach rpmbuild
(ohne 'r') tippen:
alias rpmbuild='rpmrbuild'
Buildkommandos
Die RPM-Kommandos (rpm, rpmbuild, ...) werten vor der Abarbeitung system- und nutzerspezifische Konfigurationsfiles aus.
Bei den Konfigurationsfile wird nach rpmrc
für Konfigurationsdaten und macros
für RPM-Makros unterschieden.
Dadurch werden z.B. plattformspezifische Einstellungen (Buildarchitektur, Compilerflags, ...),
paketspezifische Makros (z.B. %{_jvmdir}
für jpackage-RPMs) und nutzerspezifische Makros gesetzt.
-
/usr/lib/rpm/rpmrc
-
/usr/lib/rpm/redhat/rpmrc
-
/etc/rpmrc
-
${HOME}/.rpmrc
-
/usr/lib/rpm/macros
-
/usr/lib/rpm/redhat/macros
-
/etc/rpm/macros.*
-
${HOME}/.rpmmacros
Syntax |
Bedeutung |
rpmbuild -ba specfile |
Erstelle alles, RPMs und Source-RPM |
rpmbuild -bb specfile |
Erstelle nur binäre RPMs |
rpmbuild -bp specfile |
Führe nur die %prep-Sektion aus. Quellen auspacken und Patches anwenden |
rpmbuild -bc specfile |
Führe die %build-Sektion aus (%prep wird ebenfalls ausgeführt). make |
rpmbuild -bi specfile |
Führe die %install-Sektion aus (%prep und %build werden ebenfalls ausgeführt). make install |
rpmbuild -bl specfile |
Test auf die Existenz der Files aus der %files-Sektion (es erfolgt kein %install) |
rpmbuild -bs specfile |
Erstelle Source-RPM |
rpmbuild --rebuild Source-RPM |
Erstelle RPMS aus Source-RPM |
rpmbuild -ta TAR-Archiv |
Erstelle RPMs und Source-RPM aus TAR-Archiv (das TAR-Archiv muss ein Spec-File enthalten!) |