Build Service/Pakete für mehrere Distributionen
aus openSUSE, der freien Wissensdatenbank
Überblick
Diese Anleitung enthält spezielle Hinweise, wie Sie mit einer einzigen spec-Datei für verschiedene Distributionen arbeiten. Dies ist keine Einführung in den Paketbau für Anfänger, suchen Sie Informationen darüber, dann schauen Sie sich das SUSE Build Tutorial an. Auch der Bau von Debian-Paketen wird hier nicht behandelt.
Der Build Service kann nicht nur zuverlässige Paket-rpms für openSUSE bauen, sondern auch für aktuelle Fedora- und Mandriva-Distributionen.
Wo liegen die Grenzen? Die einzige praktische Begrenzung liegt darin, dass bestimmte Abhängigkeiten für Fedora oder Mandriva nicht so einfach aufgelöst werden können, während sie für openSUSE-Distributionen einfach durch eine Verknüpfung mit anderen Build Service-Projekten erfüllt werden können. Ein Beispiel: Für openSUSE ist es einfach, Pakete zu bauen, die die aktuellste Version von Qt4 oder GTK2 benötigen, da diese Abhängigkeiten von anderen Depots im Build Service bereitgestellt werden können, welche Rückportierungen neuer Qt4-Pakete auf ältere Versionen von openSUSE oder SLES/D anbieten. Diese Einschränkung kann für andere Distributionen nur umgangen werden, indem die notwendigen Abhängigkeiten im eigenen Projekt bereitgestellt werden. Gerade dann, wenn Sie so viele Distributionsversionen wie möglich unterstützen wollen.
Einige Stolpersteine auf die Sie acht geben sollten:
- Installieren von desktop-Dateien - Jede der drei Distributionen nutzt einen etwas anderen Mechanismus zur Installation von desktop-Dateien und zur Erstellung von Menüeinträgen. Mandriva nutzt dafür sogar ein spezielles RPM-Makro %update_menus um dies zu machen, welches eine Debian-ähnliche Einrichtung verwendet, anders als openSUSE oder Fedora. Beispiel:
%post %update_menus
%postun %clean_menus
- Paketnamensgebung für Abhängigkeiten. Schauen Sie weiter unten auf dieser Seite, dort finden Sie mehr spezifische Hinweise und Tricks, um die in ihren spec-Dateien zum Laufen zu kriegen.
- Die RPM-Makros weisen bei jeder Distribution feine Unterschiede auf. Am Ende dieses Artikels finden Sie eine Verknüpfung zu einer Tabelle, in welcher die verschiedenen Varianten verglichen werden.
Gibt es irgendwo ein gutes Beispiel für ein Paket für mehrere Distributionen?
Amilcars KDevelop-Paket (benötigt eine Build Service-Anmeldung)
Erkennen einer Distributionsvariante
Sie können
%if %{defined suse_version}
%if %{undefined suse_version}
oder portabler
%if 0%{?suse_version}
<Hier das SUSE-Zeug>
%else
<hier andere Distributionen>
%endif
hinzufügen, um zu prüfen, ob der aktuelle Bauvorgang für eine SUSE-Distribution stattfindet oder nicht. Sie können außerdem feststellen, für welche Distribution gebaut wird, indem Sie bspw.
%if 0%{?suse_version} > 930
verwenden, um etwas für alles nach SUSE Linux 9.3 auszuführen. Ähnliche Prüfungen existieren auch für andere Distributionen.
%if %{defined fedora_version}
%if %{defined mandriva_version}
%if 0%{?fedora_version} < 5
%if 0%{?mandriva_version} > 2006
Beachten Sie, dass rpm folgenden bevorzugt:
>=
gegenüber
=>
Genauso können Sie eine bestimmte Version gezielt ausschließen:
%if 0%{?rhel_version} != 406
Sie können mehrer Distributionen ein einem einzelnen if-Block zusammenfassen, wie hier:
%if 0%{?fedora_version} || 0%{?rhel_version} || 0%{?centos_version}
<ihr Zeug>
%endif
Sie können auch eine spezielle Architektur bestimmen, indem Sie bspw. folgendes verwenden:
%if 0%{?suse_version} == 1030
%ifarch x86_64
<ihr Zeug>
%endif
%endif
Die folgende Übersicht hilft dabei, die korrekten Einstellungen zu wählen:
| Distribution | Variable | Kommentar |
|---|---|---|
| openSUSE Factory | %if 0%{?suse_version} > 1030 | aktuell entstehende Ausgabe (wechselt) |
| openSUSE 10.3 | %if 0%{?suse_version} == 1030 | |
| openSUSE 10.2 | %if 0%{?suse_version} == 1020 | |
| SUSE Linux 10.1 | %if 0%{?suse_version} == 1010 | |
| SLE 10 | %if 0%{?sles_version} == 10 | setzt auch: %if 0%{?suse_version} == 1010 |
| SUSE Linux 10.0 | %if 0%{?suse_version} == 1000 | |
| SUSE Linux 9.3 | %if 0%{?suse_version} == 930 | |
| SLES 9 | %if 0%{?sles_version} == 9 | setzt auch: %if 0%{?suse_version} == 910 |
| CentOS 5 | %if 0%{?centos_version} == 501 | |
| RHEL 4 | %if 0%{?rhel_version} == 406 | |
| RHEL 5 | %if 0%{?rhel_version} == 501 | |
| Fedora 6 with Extras | %if 0%{?fedora_version} == 6 | |
| Fedora 7 with Extras | %if 0%{?fedora_version} == 7 | |
| Fedora 8 with Extras | %if 0%{?fedora_version} == 8 | |
| Mandriva 2006 | %if 0%{?mandriva_version} == 2006 | |
| Mandriva 2007 | %if 0%{?mandriva_version} == 2007 | |
| Mandriva 2008 | %if 0%{?mandriva_version} == 2008 |
Installieren von Info-Dateien
Info-Dateien sollten mit den Makros %info_add und %info_del gehandhabt werden. Beispiel:
%post
%info_add %{name}.info
%pre
%info_del %{name}.info
Beachten Sie bitte, dass Info-Dateien auf manchen Distributionen als .gz und auf anderen als .bz2 komprimiert werden. Sie können das Makro %ext_info für die Dateiendung in der Dateiliste verwenden.
Abhängigkeiten handhaben
Verschiedene Distributionen verwenden oft verschiedene Namen für Pakete, so dass die Markierungen Requires: und BuildRequires: von Depot zu Depot angepasst werden müssen. Der zweite Vortrag auf dem FOSDEM erwähnt, dass "[Ein] Projekt für jedes Depot die Abhängigkeitsregeln umschreiben kann" (... Details benötigt ...)
Qt 3.x auf Fedora finden
Redhat/Fedora verwendet ein anderes Namensschema und eine andere Baueinrichtung um Qt zum Bau von anderen Anwendungen zu verwenden. Hier nun ein Weg, mit dem man Qt-basierte Anwendungen auf SUSE und Fedora mit einer spec-Datei bauen kann:
BuildRequires: cups cups-devel python-devel shared-mime-info libart_lgpl-devel libtiff-devel libxml2-devel
BuildRequires: fontconfig-devel openssl-devel pkgconfig desktop-file-utils qt-devel
%if 0%{?fedora_version} >= 5
BuildRequires: libstdc++-devel gcc-c++ lcms-devel >= 1.12 qt
%endif
%if 0%{?suse_version} > 910
BuildRequires: update-desktop-files
%endif
Dann:
%if 0%{?fedora_version} >= 5
source "%{_sysconfdir}/profile.d/qt.sh"
%endif
%configure \
%if 0%{?fedora_version} >= 5
--with-xinerama \
--with-extra-libs=%{_libdir} \
%endif
%if 0%{?suse_version} > 910
--with-qt-libraries=/usr/%_lib/qt3/%_lib \
--with-docdir=%{prefix}/share/doc/packages/scribus \
%ifarch x86_64 ppc64 s390x
--enable-libsuffix=64 \
%endif
%endif
Qt4 auf Mandriva finden
Standardmäßig wird Qt3 vor Qt4 gefunden, weshalb Sie einfach das folgende dem %build-Abschnitt ihrer spec-Datei hinzufügen:
%build
%if 0%{?mandriva_version} > 2006
export PATH=/usr/lib/qt4/bin:$PATH
export QTDIR=%{_prefix}/lib/qt4/
%endif
- Dies kann sich unter Mandriva 2008 geändert haben
Provides/Obsoletes unter Mandriva handhaben
Besondere Beachtung benötigen diese Fälle unter Mandriva, da hier oftmals - anders als bei Fedora oder openSUSE - separate Bibliotheks-rpms für viele Anwendungen erstellt werden, welche diese Bibliotheken jedoch alleine nutzen. Anwendung soundso kann also eine Abhängigkeit zu libsoundso oder libsoundso-0 aufweisen. Um Konflikte bei der Installation zu vermeiden, sollten Sie deshalb die originalen Mandriva-spec-Dateien daraufhin überprüfen, ob dort explizite Provides und Obsoletes angegeben sind. Auch wenn mit der Angabe Autoreqprov: on in der spec-Datei die Abhängigkeiten automatisch überprüft werden (was trotzdem eine gute Idee ist), kann es immer noch nötig sein, explizit die unten angegeben Zeilen hinzuzufügen:
%if 0%{?mandriva_version}
Provides: soundso liblibsoundso-0
Obsoletes: soundso liblibsolundso-0
%endif
Auf älteren Distributionen bauen
Während die Quellen in einem Paket auch unter älteren Distributionen gebaut werden können, kann sich der Weg, wie die Pakete gebaut werden, in der Zwischenzeit weiterentwickelt haben.
Wenn bspw. autoreconf -fi aufgerufen wird (was üblicherweise in spec-Dateien geschieht), kann es passieren (auf Grund des -i für installieren), dass die Versionen von config.sub, config.guess und ltmain.sh aus dem tar-Archiv mit den Versionen von autoconf auf der Zielplattform überschrieben werden. Das kann bedeuten, dass Dateien aus dem Jahr 2007 durch Versionen von 2005 ersetzt werden, wenn bspw. für SLE10 gebaut wird, was möglicherweise nicht vernünftig funktioniert. Die kann negative Auswirkungen haben und sogar zu einem Misskompilieren führen, wenn bpsw. libapt1 auf SLE10 gebaut wird.
Deshalb könnte es auf Zielplattformen die älter als Factory sind besser oder sogar erforderlich sein, dass Sie autoheader, autoconf oder was auch immer von Hand aufrufen, anstatt autoreconf zu verwenden. Das würde bspw. so aussehen:
%if 0%{?suse_version} > 1010
autoreconf -fi
%else
autoheader
autoconf
%endif
Pakete für Debian und xUbuntu
Informationen zum Bau von Paketen für diese Distributionen finden Sie auf der Seite Build Service/Debs bauen.

