Wissen, was gut ist. Studieren in Chemnitz.






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

RPM Buildflow


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!)