Debian Pakete bauen und kompilieren
Paketformat
Als Linux-Distribution muss die Software in Debian neben der ausführbaren Binärform i. A. auch als
SourceCode? vorliegen. Dazu gibt es auch zwei verschiedene Paketformate:
- Binärpakete
- Pakete mit der Endung
.deb enthalten die erzeugten Binärdateien. Diese Dateien werden mit der Debian-Paketverwaltung dpkg installiert. Bei dem deb Paket handelt es sich um ein ar Archiv, dass wiederum zwei tar Archive enthält: Eines mit den zu installierenden Dateien (data.tar.gz) und eines mit den Kontroll-Informationen (control.tar.gz). Zusätzlich ist eine Datei mit Versions-Informationen enthalten (debian-binary).
- Sourcepakete
- Ein Source-Paket besteht aus drei Dateien: Der Debian Source Control Datei (
.dsc), einem tar Archiv mit den orignalen ("upstream") Quellen (.orig.tar.gz) und einer gepackten Patch-Datei mit den Debian-spezifischen Anpassungen (.diff.gz).
Backports
Vorkompilierte Pakete aus der unstable-Distribution erwarten zumeist neuere Bibliotheken, als im System installiert sind.
Um die Systemstabilität nicht zu mindern, sollten diese Pakete stattdessen aus den Quellen neukompiliert werden.
Um aus einem in der Debian-Distribution enthaltenen Source-Paket ein Binär-Paket zu bauen, sind im Idealfall die folgenden Schritte nötig:
- Für den Bau benötigte Pakete installieren:
Dies erledigt das Kommando apt-get build-dep Paketname. (Zusätzlich muss noch das Meta-Paket DebPkg:build-essential installiert sein, dass für die Installation allgemein zum Bau von Binaries nötige Tools (Compiler, Linker, usw.) sorgt.
- Ein Repository mit Source-Paketen in die
/etc/apt/sources.list eintragen, bspw.
deb-src http://mirror.gsi.de/distrib/debian testing main
Anschließend mit apt-get update die Informationen über die verfügbaren Pakete aktualisieren.
- Mit
apt-get die Quellen herunterladen, entpacken, kompiliert und packen:
Dazu dient das Kommando apt-get -b source Paketname. Nach dem Herunterladen und Entpacken der Quellen wird automatisch dpkg-buildpackage -b -uc aufgerufen, dass den eigentlichen Paketbau erledigt. (Ohne -b werden lediglich die Quelltexte heruntergeladen und entpackt.).
- Das Binärpaket installieren:
dpkg -i Paketname_Versionsnummer_Plattform.deb.
Beispiel:
apt-get -b source disktype baut das für Woody noch nicht verfügbare
DebPkg:disktype Utility.
Probleme
Unerfüllbare build dependencies
Ansatz 1: Rekursiver
backport
Beispiel:
DebPkg:chkrootkit ->
DebPkg:po-debconf ->
DebPkg:intltool-debian
Ansatz 2: Paketabhängigkeiten ignorieren/ändern
Beispiel: Bau von chkrootkit mit -d
Sollte beim Installieren der
build dependencies oder beim Bau etwas schiefgehen, kann man mit das Paket herunterladen und auspacken.
Zunächst sollte man die Datei
debian/control im Quelltextbaum untersuchen.
Diese enthält die wichtigsten Informationen zu den vermeintlichen Abhängigkeiten.
Der eigentliche Bau (
configure,
make, ...) und das Zusammenpacken der Dateien wird durch die Datei
debian/rules gesteuert.
Schließlich kann man mit
dpkg-buildpackage -b -uc im Wurzelverzeichnis des entpackten Archives den Bau des Binärpaketes anstoßen.
Bau von Debian-Paketen für Perl-Module
Zum Bau von Debian-Paketen aus Perl-Packages vom
CPAN gibt es das Tool
Man:dh-make-perl.
Dieses Tool ermöglicht, Perl-Module mit Hilfe der Debian-Paketverwaltung auf einem Rechnerhaufen zu verteilen, was mit Perl selbst nicht möglich ist, soweit mir bekannt ist.
Um ein Debian-Paket für ein Perl-Modul zu erzeugen, reicht
dh-make-perl --build --cpan Modulname.
Der Paketbau funktioniert analog zur Verwendung des Perl-Moduls
CPAN:Bundle::CPAN; es werden jedoch keine Abhängigkeiten beachtet, man muss also die Abhängigkeiten des Moduls herausfinden und die entsprechenden Pakete ebenfalls bauen.
Bau von Kernelpaketen
Siehe
KernelBuild.
Paketbau aus Sourcen / Umwandlung mit alien
Tools
Vorgehensweise
- Das Quellpaket, z.B. tw_cli-linux-x86_64-9.3.0.7.tgz, an einenm geeigneten Ort kopieren.
-
fakeroot alien -g tw_cli-linux-x86_64-9.3.0.7.tgz erzeugt zwei Verzeichnisse, tw_cli... und tw_cli....orig, die beide das ausgepackte Archiv enthalten. In ersterem erzeugt alien auch das Unterverzeichnis debian.
- Im Unterverzeichnis
debian finden sich die Dateien changelog control copyright rules
- Diese Dateien sind nach eigenem Gutdünken und/oder Maßgabe ähnlicher Paketbauten zu editieren.
- In
changelog notiert man, was man gerade zu tun beabsichtigt.
-
control dient der Debian-Paketverwaltung dazu festzustellen, wie das Paket heißt, in welches Archiv es gehört, was drin steckt usw.
-
rules ist das Makefile für den Paketbau:
debian/rules
-
export DH_COMPAT=4 ist aktuell offenbar eine nötige Angabe, die bei einem anderen Wert als 4 angemeckert wird.
-
dh_installinit Installiert debian/package.init nach /etc/init.d/package und erzeugt den nötigen Code zum Anlegen der /etc/rc?.d/ Links für debian/postinst.
- Das von
alien erzeugte rules enthält die Zeile
# Copy the packages's files.
find . -maxdepth 1 -mindepth 1 -not -name debian -print0 | \ xargs -0 -r -i cp -a {} debian/$(PACKAGE)
- Dieser Eintrag kann ersetzt werden, wenn die Zielverzeichnisse der einzelnen im Paket enthaltenen Dateien bekannt sind, im Beispiel des 3ware 3DM2 Pakets also:
mkdir -p debian/tmp/html
tar xfz 3dm-lnx.tgz -C debian/tmp
cp debian/tmp/3dm2.x86_64 debian/$(PACKAGE)/usr/sbin/3dm2
tar xfz debian/tmp/3dm-help.tgz -C debian/tmp/html
cp -a debian/3dm2.conf debian/$(PACKAGE)/usr/share/3ware-dm2/
cp -a debian/3dm2.conf debian/$(PACKAGE)/etc/3ware-dm2/
- Die per Default auskommentierten Zeilen für
dh_strip und dh_fixperms können offenbar aktiviert werden.
debian/Paketname.dirs
- Damit wie oben im
rule File angegeben die Dateien auch nach debian/$(PACKAGE)/... kopiert werden können, muß offenbar im debian Verzeichnis eine Datei Paketname.dirs erzeugt werden, die die Zielverzeichnisse ohne führenden Slash auflistet.
debian/postinst
- In
debian/postinst sollte ziemlich am Schluß eine Zeile #DEBHELPER# stehen (siehe ~christo/debian/sarge/3ware/3ware-dm2-9.3.0.7/debian/postinst). Und in debian/rules steht dh_installinit (siehe man dh_installinit).
-
*.debhelper (hier z.B. 3ware-dm2.postrm.debhelper) sollte es gar nicht geben, sondern beim Paketbau von ebenjenem erzeugt werden. Dann wird der Platzhalter #DEBHELPER# mit dem Inhalt der Datei ersetzt und diese kann in die Tonne (sollte debclean eigentlich übernehmen).
- Sind hingegen beim Paketbau Dateien
*.debhelper schon vorhanden, wird der Inhalt der Datei stattdessen offenbar angehängt. Im Falle von init - Dateien führt das dazu, daß der Start des Dienstes (hier 3dm2) als Abschluss der Installation des Pakets fehlschlägt.
Bau des Pakets
- Mit
fakeroot dpkg-buildpackage -b -uc kann schließlich das Binärpaket gebaut werden.
Debian-konformes patchen mit dpatch
Um in Debian-Paketen Dateien zu patchen, kann das Tool
dpatch verwendet werden.
Nötige Änderungen an
debian/rules:
-
include /usr/share/dpatch/dpatch.make in die Preambel der Datei einfügen
- Das Ziel
build (oder configure oder configure-stamp) vom Ziel patch (oder patch-stamp) abhängig machen: build: patch
- Das Ziel
clean vom Ziel unpatch abhängig machen: clean: unpatch
Die anzuwendenden Patches müssen in
debian/patches/ stehen werden und in der Datei
debian/patches/00list aufgeführt werden.
Patches können "interaktiv" mit
dpatch-edit-patch geschrieben werden.
Paketbau aus Sourcen mit Hilfe von checkinstall
Mittels
checkinstall lassen sich bei der Übersetzung und Installation von »Tarballs« gleich auch einfache Debian-Pakete erstellen. Dazu ist folgende Vorgehensweise ratsam:
- Falls notwendig Installation von
checkinstall mit:
apt-get install checkinstall
- Download des gewünschten Programmpaketes, etwa
blafasel.tar.gz.
- Auspacken des Paketes nach /tmp mit:
tar -xvzf blafasel.tar.gz -C /tmp
- Wechsel in das Paketverzeichnis mit:
cd /tmp/blafasel
- Falls notwendig Installationshinweise (zumeist in den Dateien
README oder INSTALL untergebracht) lesen.
- Falls notwendig erforderliche Entwicklerbibliotheken (zumeist
libirgendwas-devel bezeichnet) installieren.
- Konfiguration durchführen mit:
./configure
Hiermit werden eine oder mehrere Dateien namens Makefile erzeugt, die den Übersetzungsprozeß steuern. Ferner ist es an dieser Stelle möglich, den Installationsort anzupassen sowie bestimmte Funktionen des Programmpaketes ein- oder auszuschalten. Eine Übersicht der verfügbaren Schalter wird nach Eingabe von ./configure --help angezeigt.
- Der Compilerlauf wird angestoßen mit:
make
Je nach Rechnergeschwindigkeit und Paketumfang kann dieser Schritt einige Sekunden, aber auch einige Stunden dauern.
- Nun nicht wie gewohnt als "root" durch
make install das Paket installieren, sondern gleichzeitig ein Debian-Paket daraus bauen mit:
checkinstall make install
Im folgenden Dialog lassen sich Paketparameter wie Name, Versions- und Releasenummer anpassen:
*** Warning: The package version "blafasel" does not
*** Warning: contain any digits. dpkg might not like that.
This package will be built according to these values:
0 - Maintainer: [ tux@linux.dom ]
1 - Summary: [ Blafasel 1.0.1 for Debian Sarge ]
2 - Name: [ blafasel ]
3 - Version: [ blafasel ]
4 - Release: [ 1 ]
5 - License: [ GPL ]
6 - Group: [ useless ]
7 - Architecture: [ i386 ]
8 - Source location: [ blafasel.tar.gz ]
9 - Alternate source location: [ ]
Enter a number to change any of them or press ENTER to continue: 3
Enter new version:
>> 1.0.1
This package will be built according to these values:
0 - Maintainer: [ tux@linux.dom ]
1 - Summary: [ Blafasel 1.0.1 for Debian Sarge ]
2 - Name: [ blafasel ]
3 - Version: [ 1.0.1 ]
4 - Release: [ 1 ]
...
- Das fertige Debian-Paket findet sich im aktuellen Verzeichnis, der Name setzt sich aus Paketname, Version und Release sowie Architektur zusammmen, hier also
blafasel-1.0.1-1_i386.deb und kann nun verteilt werden.
In der Anwendung einfach, ist
checkinstall allerdings auch in seiner Funktion limitiert. Laut M. F. Krafft in
The Debian System (1. Auflage 2005, S. 241f) lassen sich so nur Dateien installieren, nicht jedoch bereits vorhandene Dateien während der Installation verändern. Ferner werden Konfigurationsdateien nicht als solche in der Paketdatenbank registriert, was zu Problemen bei Updates führen kann.
Siehe auch:
--
ChristopherHuhn,
ThomasRoth,
StefanHaller -- 2004 - 2007
to top