SUSE Paketbauanleitung

aus openSUSE, der freien Wissensdatenbank

Inhaltsverzeichnis

Einführung

Dieses Dokument bietet einen Überblick über die Paketbaustruktur von SUSE und ist eine Anleitung, wie Sie Pakete für SUSE Linux bauen. Diese Informationen werden ihnen dabei helfen, ihre eigene temporäre Paketbauumgebung aufzusetzen. Die ersten vier Abschnitte beschäftigen sich damit, wie alles funktioniert, gefolgt von Beispielen für Sie zum ausprobieren.

Voraussetzungen

Sie sollten sich schon mit der Erstellung von RPM-Paketen auskennen, da diese Dokumentation kein Ersatz für die RPM-Dokumentation ist. Es existieren schon viele Anleitungen, Handbücher und Fachbücher die sich mit diesem Thema intensiv auseinandersetzen. Einige Adressen zu diesem Bereich erfahren Sie im Abschnitt Hilfsquellen

Sie sollten außerdem schon Erfahrung im Umgang mit PGP-Werkzeugen haben, besonders mit dem GNU Privacy Guard (gpg), da dass die am weitesten verbreitete Implementierung von OpenPGP ist. Warum PGP wichtig ist wird im weiteren Verlauf erläutert, wenn es um das Signieren von Paketen geht. Um Pakete signieren zu können benötigen Sie ihren eigenen PGP-Schlüssel, bevor Sie damit beginnen, die SUSE-Paketbauumgebung zu verwenden.

Und sie sollten natürlich mit der Quellcodeumgebung vertraut sein, die ihr Projekt für seine Pakete verwendet. Die SUSE-Paketbaustruktur kann zwar einige Fehler umgehen die von Projektmitarbeitern begangen werden, aber es ist trotzdem immer hilfreich, sich bei der Arbeit an Paketen mit Dingen wie make, autoconf, imake oder anderen Quellcodekonfigurationsmechanismen auszukennen.

Anforderungen

Ganz einfach. Sie benötigen 3GB freien Festplattenspeicher und unser Paketbauwerkzeug build. Das ist alles.

Die 3GB Festplattenplatz benötigen Sie für eine separate Linux-Installation die von der SUSE Paketbaustruktur als Bauumgebung für ihre Pakete verwendet wird. Diese isolierte Umgebung hat einen großen Vorteil: Das Bauen eines Pakets beeinträchtigt nicht ihre eigentliche Linux-Installation. Der einzige Nachteil ist, dass Sie zwischenzeitlich 3GB freien Festplattenplatz für jede separate Paketbauumgebung benötigen. Allerdings sollte das bei den Kapazitäten heutiger Festplatten keine allzu große Hürde sein.

Das Paketbauwerkzeug richtet eine Paketbauumgebung an einer auswählbaren Stelle ein und baut in dieser Umgebung dann das Paket. Die Paketbauumgebung besteht aus einem Basissystem und zusätzlichen Paketen die Sie in der RPM-spec-Datei angegeben haben.


Ablauf

Die folgenden Schritte umreißen einen normalen Arbeitsablauf um ein Paket zu bauen. Im realen Einsatz werden Sie natürlich an einigen Stellen erst mal nicht weiter kommen und es dann wiederholen bis es funktioniert. Dieser Grundriss soll ihnen vor allem ein Gefühl dafür geben, was wir zu erreichen versuchen.

Erster Schritt - Installationsanforderungen

Installieren Sie mit ihrer Paketverwaltung die folgenden Pakete falls sie noch nicht installiert sind:

  • build
  • gpg

Zweiter Schritt - Konfigurieren von build

Konfigurieren die das Paketbauwerkzeug (build). Es gibt einige Einstellungen die Sie verändern müssen um es ihrer lokalen Umgebung anzupassen. Zum Beispiel:

  • Woher sollen die RPM-Pakete genommen werden um die Bauumgebung einzurichten.
  • Wie lautet der Basisname für das Wurzelverzeichnis für den Bau.

Dritter Schritt - Quellverzeichnis erstellen

Erstellen Sie irgendwo ein Verzeichnis auf welches sowohl Sie als auch root zugreifen können. Dies ist der Ort wo Sie die Dateien ablagern mit denen das Paket gebaut wird. Sie könne dafür jeden Ort benutzen, einzige Voraussetzung ist, dass Sie und root Zugriff darauf haben, denn nur root kann die Einrichtung der Bauumgebung starten. Außerdem wollen Sie wahrscheinlich nicht ständig als root arbeiten um ein Paket zu bauen, weshalb Sie einen gemeinsam nutzbaren Ort benötigen.

Vierter Schritt - Besorgen der Quellcodedateien des Projekts

Holen Sie die zum Bauen notwendigen Quellcodedateien des Projekts, welche meistens in komprimierten Archiven bereitgestellt werden.

Fünfter Schritt - Erstellen Sie eine spec-Datei

Nachdem Sie nun über den Quellcode verfügen folgen Sie einfach dem gebräuchlichen Prozess der RPM-Paketerstellung; erstellen Sie also eine spec-Datei für das Paket. Informationen zu spec-Dateien für openSUSE finden Sie im Artikel Paketbau.

Sechster Schritt - Bauen Sie das Paket

Nachdem Sie die RPM-spec-Datei erstellt haben ist es nun an der Zeit, zu schauen ob das Paket damit gebaut werden kann. Wechseln Sie zum root-Benutzerkonto und gehen Sie in das Verzeichnis, wo spec-Datei, Quellen und Patche liegen; dann starten Sie build.

Siebter Schritt - Testen Sie das Paket

Nachdem der Bauvorgang erfolgreich abgeschlossen wurde sollten Sie das gebaute Paket testen.


Spec-Dateien

RPM-spec-Dateien sollten in Einklang mit den SUSE-Paketkonventionen erstellt werden. Da dies ein recht komplexes Thema ist, existiert dazu eine eigene Dokumentation, welcher Sie bei der Entwicklung ihrer spec-Datei möglichst folgen sollen.

Einige Beispiel-sepc-Dateien für verschiedene Pakete können Sie im Build Service SVN finden.


Konfiguration

build-Umgebungsvariablen


  • BUILD_DIST
    Die Distributionen für die Sie bauen wollen.
  • BUILD_RPMS
    Sies ist der Ort an dem sich die openSUSE RPMs befinden: Falls die openSUE DVD nur eingebunden wurde sollte diese Variable auf <DVD_Mount-Punkt>/suse gesetzt werden. Falls der Inhalt der DVD in ein Verzeichnis kopiert wurde, sollte diese Variable auf </tt><das_Verzeichnis>/suse</tt> gesetzt werden.
    Der Standardwert von BUILD_RPMS ist /media/dvd/suse
  • BUILD_ROOT
    Das isolierte chroot-Verzeichnis in dem die RPMs gebaut werden.
    Der Standardwert von BUILD_ROOT ist /var/tmp/build-root
  • BUILD_RPM_BUILD_STAGE
    Dies sind die aktuellen Optionen die an rpmbuild weitergegeben werden (die man Seite von rpmbuild enthält eine komplette Liste der verfügbaren Optionen).
    Der Standardwert von BUILD_RPM_BUILD_STAGE is '-ba' (heißt, dass Binär- und Quellpakete gebaut werden, nachdem die Skripte %prep, %build und %install durchlaufen wurden).

Beispiele

Hier folgen nun einige Beispiele aus der harten Realität für verschiedene, exemplarische Paketgruppen und bestimmte Paketeigenschaften.

KDE-Pakete

BuildRequires: kdelibs3-devel update-desktop-files
Name: kvpnc License: GPL Group: Productivity/Networking/System Summary: GUI frontend for openswan and vpnc Version: 0.7.2 Release: 1 URL: http://home.gna.org/kvpnc/ BuildRoot: %{_tmppath}/%{name}-%{version}-build Source0: %name-%{version}.tar.bz2
%description The application can create configurations for various kinds of VPN connections. You should install also the "vpnc" or "openswan" package.
%prep # extract the source and go into the kvpnc-0.7.2 directory %setup -q # source the standard build enviroment as defined in kdelibs3 package . /etc/opt/kde3/common_options # replace the admin/ folder with the version from kdelibs3 (will work for sure with # current autoconf and automake) and create Makefile.in and configure script. update_admin --no-unsermake
%build # source the standard build enviroment as defined in kdelibs3 package . /etc/opt/kde3/common_options ./configure $configkde --disable-final # do compile with the number of jobs given to the --jobs parameter of the build script. make %{?jobs:-j%jobs}
%install iconv -f iso8859-1 -t utf-8 src/kvpnc.desktop > w && mv w src/kvpnc.desktop # install all files into the BuildRoot make DESTDIR=$RPM_BUILD_ROOT install rm -rf $RPM_BUILD_ROOT/opt/kde3/share/doc/HTML/kvpnc # updates the .desktop file. It applys additional translations and Categories for a # proper position in the KDE menu %suse_update_desktop_file %name System Network # does find all localisation files and adds proper database attributes to them %find_lang %name
%clean # clean up the hard disc after build rm -rf $RPM_BUILD_ROOT
%files -f %name.lang %defattr(-,root,root) %dir /opt/kde3/share/icons/hicolor/16x16/apps %dir /opt/kde3/share/icons/hicolor/32x32/apps /opt/kde3/bin/kvpnc /opt/kde3/share/appl*/*/kvpnc.desktop /opt/kde3/share/apps/kvpnc /opt/kde3/share/icons/*/*/*/kvpnc*.png

GNOME-Pakete

# the following line is not a remark, but contains a macro for all 
# needed packages for a standard Gnome application:
# neededforbuild  gnome2-devel-packages
Name: gwget %define prefix /opt/gnome %define sysconfdir /etc%{prefix} License: GPL Group: Productivity/Networking/Web/Utilities Requires: wget Version: 0.95 Release: 1 Summary: Front-end for wget written in GTK+ URL: http://gnome.org/projects/gwget/ # the packages filesystem and gconf2 needs to be installed, before this # package gets installed. Otherwise the script in %post would fail. PreReq: filesystem gconf2 Source: %{name}-%{version}.tar.bz2 Source: %name.desktop BuildRoot: %{_tmppath}/%{name}-%{version}-build
%description Front-end for wget written in GTK+
# extract source tar ball %prep %setup -n %{_name}-%{version}
%build # use global compile flags and run configure script CFLAGS="$RPM_OPT_FLAGS" \ ./configure \ --prefix=%prefix \ --libexecdir=%prefix/lib/gwget \ --libdir=%prefix/%_lib \ --sysconfdir=%sysconfdir \ --datadir=%prefix/share \ --localstatedir=/var/lib \ --mandir=%{_mandir} \ --disable-schemas-install # do compile make
%install # install all files make DESTDIR=$RPM_BUILD_ROOT install # create file list of localized files into file %name.lang %find_lang %{name} # install the gwget.desktop file from %Source1 and apply Catgories (Network and FileTransfer) %suse_update_desktop_file -i gwget Network FileTransfer
# the calls which does get called after installing this package %post # update the gconf database export GCONF_CONFIG_SOURCE=`opt/gnome/bin/gconftool-2 --get-default-source` opt/gnome/bin/gconftool-2 --makefile-install-rule etc/opt/gnome/gconf/schemas/gwget.schemas >/dev/null
%clean # clean up the hard disc after build rm -rf $RPM_BUILD_ROOT
%files -f %{name}.lang %defattr(-,root,root) # the files to package


Perl-Pakete

Perl-Pakete sind recht einfach und ähnlich zu erstellen, da sie meist schon für das CPAN-Archiv vorbereitet wurden.

Name:         perl-Curses
Version:      1.12
Release:      1
# define the name from CPAN
%define cpan_name Curses
# do this package was known as "perl_cur" in old times. So we do need to Provide and Obsolete
# this package. YaST will install this package during update instead of the old one in this way.
Provides:     %cpan_name
# we better require the exact perl version, which was used to create this package
Requires:     perl = %{perl_version}
Group:        Development/Libraries/Perl
License:      Artistic License, Other License(s), see package
URL:          http://cpan.org/modules/by-module/Curses/
Summary:      A Dynamic Loadable Curses Module for Perl5
Source:       %cpan_name-%{version}.tar.bz2
BuildRoot:    %{_tmppath}/%{name}-%{version}-build
%description This is a dynamic loadable curses module for Perl5. This package can be found at any CPAN archive.
%prep %setup -q -n %cpan_name-%{version}
%build perl Makefile.PL OPTIMIZE="$RPM_OPT_FLAGS -Wall" make make test
%install %perl_make_install %perl_process_packlist
%clean # clean up the hard disc after build rm -rf $RPM_BUILD_ROOT
%files %defattr(-,root,root) %doc Artistic Copying README %doc %{_mandir}/man3/* %{perl_vendorarch}/%cpan_name.pm %{perl_vendorarch}/auto/%cpan_name /var/adm/perl-modules/%{name}

Hilfsquellen