Scripted Reality
Ihr volles Potential geben SRC-RPMs (Abbildung 3) erst dann preis, wenn Sie sie auf dem System installieren. Wie bei gewöhnlichen RPMs erledigt dies der Aufruf rpm -i Paket.src.rpm
– allerdings als normaler Anwender, nicht als Root. OpenSuse-Anwender installieren SRC-RPMs mit zypper source-install Paket
direkt aus dem Online-Repository. Zypper spielt dabei auch gleich alle für das Kompilieren nötigen Devel-Pakete (BuildRequires) ein.
Das SRC-RPM-Paket enthält neben dem Quellcode und andere systemweit zu installierende Dateien. Dazu gehören neben Startmenü-Einträgen auch Patches, die vor dem Kompilieren Fehler im Quellcode bereinigen, sowie Spec-Dateien, die Name, Version, Beschreibung und Abhängigkeiten sowie die Befehle zum Kompilieren des Quellcodes enthalten. Wie Sie Patches selbst bauen, klärt der Kasten "Patches erstellen".
Patches erstellen
Wie Sie Änderungen am Quellcode eines Programms in einen Patch verpacken, zeigt Listing 1. Zunächst benennen Sie zunächst das Basisverzeichnis um (Zeile 1) und entpacken dann das unveränderte Quellcode-Archiv erneut. Im nächsten Schritt erzeugen Sie einen Patch für alle Änderungen (Zeile 2). Möchten Sie die Änderungen einzelner Dateien separat erfassen, dann rufen Sie Diff wie in Zeile 3 gezeigt auf.
Listing 1
$ mv galculator-2.0.1 galculator-2.0.1_changed $ diff -ur galculator-2.0.1 galculator-2.0.1_changed > my.patch $ diff -u galculator-2.0.1/fDatei galculator-2.0.1_changed/Datei
Beim ersten Installieren eines SRC-RPMs legt RPM in Ihrem Heimatverzeichnis das Verzeichnis rpmbuild
inklusive der Unterverzeichnisse BUILD
, BUILDROOT
, RPMS
, SOURCES
, SPECS
und SRPMS
an. Unter SOURCES
finden Sie die Tarballs und Patches mit dem Quellcode für alle installierten SRC-RPMs.
Die Spec-Dateien im Verzeichnis SPECS
bündeln beschreibende Daten und Handlungsanweisungen für Rpmbuild, das daraus den Quellcode kompiliert und in ein Binär-RPM verpackt. Wenn Sie SRC-RPMs installieren, anstatt direkt binäre RPMs daraus zu bauen, können Sie die Spec-Dateien vor dem Rpmbuild-Aufruf mit einem Texteditor verändern. Der folgende Aufruf erzeugt schließlich ein Binär-RPM:
$ rpmbuild -bb Name.spec
Alle im Spec referenzierten Quellcode-Archive und Patches müssen dabei unter SOURCES
bereitliegen.
Dreh- und Angelpunkt
Als einfaches Beispiel für das Update einer Spec-Datei auf eine neue Version des enthaltenen Programms eignet sich die Taschenrechner-Software Galculator [2] unter OpenSuse 12.2. Auf anderen RPM-basierten Linux-Distributionen fällt die Spec-Datei im Detail anders aus, doch das geschilderte Vorgehen lässt sich übertragen. OpenSuse 12.2 bringt Galculator 1.3.4 mit, doch inzwischen steht schon Version 2.0.1 bereit, die nun GTK3 benutzt und sich so besser in den aktuellen Gnome-Desktop einfügt.
Installieren Sie zuerst das bei OpenSuse mitgelieferte Quellpaket zu Galculator mit dem Aufruf zypper source-install galculator
als normaler User. Dies überträgt die Datei gcalculator.spec
nach rpmbuild/SPECS/
sowie die beiden Files galculator-1.3.4.tar.bz2
und galculator-ld_fix.diff
nach rpmbuild/SOURCES/
. Danach öffnen Sie galculator.spec
in einem Texteditor (Listing 2).
Listing 2
Name: galculator Summary: A GTK 2 based calculator Version: 1.3.4 Release: 18.1.2 License: GPL-2.0 Group: System/GUI/GNOME Url: http://galculator.sourceforge.net/index.html Source0: %name-%version.tar.bz2 Patch0: %name-ld_fix.diff BuildRoot: %{_tmppath}/%{name}-%{version}-build BuildRequires: autoconf automake fdupes gcc gcc-c++ make BuildRequires: doxygen gtk2-devel intltool pkg-config BuildRequires: libglade2-devel update-desktop-files BuildRequires: libtool %description Galculator is a GTK 2 based calculator with ordinary notation/reverse polish notation, [...] %prep %setup -q %patch0 %build autoreconf -fi %configure %__make %{?jobs:-j%{jobs}} %install %makeinstall %suse_update_desktop_file -r %name GTK Utility Calculator %find_lang %name %fdupes -s %{buildroot} %clean %__rm -fr %buildroot %if 0%{?suse_version} >= 1140 %post %desktop_database_post %icon_theme_cache_post %postun %desktop_database_postun %icon_theme_cache_postun %endif %files -f %name.lang %defattr(-,root,root) %_bindir/%name %_datadir/applications/* %dir %_datadir/%name %dir %_datadir/%name/glade %_datadir/%name/glade/*.glade %_mandir/man1/%name.1.gz %_datadir/pixmaps/%name.* %changelog * Sat Oct 1 2011 xxxx@suse.com - add libtool as buildrequire to make the spec file more reliable * Sat Sep 17 2011 xxxxx@gmx.de - added Patch0 (gcalculator-ld_fix.diff) to fix the build for factory (this patch requires a autoreconf call) [...]
Die ersten 15 Zeilen von galculator.spec
bilden einzeilige Felder in der Form Feldname: Feldinhalt. Die Zeilen 1 bis 7 liefern dem Paketmanagement elementare Daten wie Name, Version und Upstream-URL, Lizenz sowie eine kurze Beschreibung. In den Zeilen darunter folgen Informationen für Rpmbuild bestimmte Informationen.
Source0
nennt den Dateinamen des ersten (und hier einzigen) Quellcode-Archivs. Während des Rpmbuild-Ablaufs stehen eine Reihe von Makros zur Verfügung (%macroname
, siehe Tabelle "Gängige RPM-Makros"). Die Anweisung %name-%version.tar.bz2
expandiert Rpmbuild mit Rückgriff auf die Datenfelder Name:
und Version:
. Bei den vorliegenden Daten ergibt das galculator-1.3.4.tar.bz2
, also den Namen des Quellcode-Archivs im Verzeichnis SOURCES
.
Gängige RPM-Makros
Makro | Funktion |
---|---|
%{_bindir}
|
Installationsverzeichnis für Binaries |
%{_datadir}
|
Verzeichnis /share
|
%{_libdir}
|
Verzeichnis für Shared-Libraries |
%{_mandir}
|
Verzeichnis für Manpages |
Beim Update auf Version 2.0.1 gilt es daher lediglich später das Feld Version:
zu ändern. Dann sucht Rpmbuild nach galculator-2.0.1.tar.bz2
, das sich im Verzeichnis SOURCES
befinden muss.
In der Zeile darunter folgt noch ein Patch (Patch0:
), der ein Problem mit dem Makefile beim Kompilieren unter OpenSuse behebt. Die %prep
-Sektion wendet ihn nach dem Auspacken des Quellcodes mit %patch0
an. Beim Lesen von Patch-Dateien hilft die Unified Diff Notation [3].
BuildRoot:
zeigt auf ein temporäres mit Anwenderrechten beschreibbares Verzeichnis, das die beim Kompilieren und Installieren mit make
und make install
erzeugten Dateien aufnimmt. Der Standardwert %{_tmppath}/%{name}-%{version}-build
passt praktisch immer. Die folgenden BuildRequires:
-Felder listen alle zum erfolgreichen Kompilieren von Galculator erforderlichen Pakete auf.
Etwas verwirrend: Mehrzeilige Datenfelder beginnen genau wie Makros mit dem Prozent-Zeichen. Die Tabelle "Datenfelder in Spec-Dateien" führt alle Fälle auf, in denen das Prozent-Zeichen für ein Datenfeld steht und nicht für ein Makro.
Datenfelder in Spec-Dateien
Datenfeld | Beschreibung |
---|---|
%description
|
mehrzeilige Beschreibung, Zeilenlänge <= 80 Zeichen. |
%prep
|
Shell-Befehle, die den Quellcode für den Aufruf von configure; make; make install vorbereiten. Dazu gehört zum Beispiel das Auspacken des Quellcode-Archivs. In vielen Fällen genügt das Makro setup -q .
|
%build
|
Befehl(e) zum Kompilieren, typischerweise configure und make .
|
%check
|
Tests nach dem Kompilieren ausführen, fehlt häufig. |
%install
|
Befehl zum Installieren des kompilierten Programms, allerdings relativ zum Buildroot-Verzeichnis. (~/rpmbuild/BUILDROOT/Paket.Version ). Typischerweise make DESTDIR=%{buildroot} install , abkürzbar mit %makeinstall .
|
%clean
|
Befehl zum Entfernen des Verzeichnisses Paket.Version im BUILDROOT . Geschieht automatisch, wenn das %clean -Feld fehlt.
|
%files
|
Dateiliste für das Binärpaket. |
%changelog
|
Changelog für das Paket beziehungsweise die Spec-Datei. |
Außer %description
, das eine mehrzeilige Beschreibung für den Paketmanager enthält, sind für unsere Zwecke die Felder %prep
, %build
und %install
interessant, denn sie steuern das Kompilieren des Quellcodes. Hier stehen prinzipiell die gleichen Befehle, die Sie auch beim manuellen Kompilieren auf der Konsole ausführen würden.