Wie man Debian-Pakete aus den Quellen baut

Im folgenden möchte ich ein paar Wege aufzeigen, wie man ein Binärpaket mit Debian erzeugt. Das Ganze ist mehr als Merkzettel zu verstehen und ersetzt nicht die offizielle Dokumentation zur Erstellung von Binärpaketen mit Debian. Am Ende finden sich nützliche Links für alle, die sich mehr mit den technischen Details beschäftigen möchten. Außerdem finden sich dort auch Links zu Videos, die den Prozess ausführlich und nachvollziehbar erklären.

Die folgende Übersicht ist in Teilen eine Übersetzung des englischen Howto “How to build a package from source the smart way“.

Der bessere Weg – Debianisierte Quellen kompilieren

Der allgemeine Weg ein Binärpaket aus den Quellpaketen zu erstellen läuft immer so ab:

  1. Zuerst muss der Paketmanager wissen, woher er die Quelldateien beziehen soll, wozu die Datei /etc/apt/sources.list modifiziert wird.
  2. Dann wird das Quellpaket als normaler Nutzer heruntergeladen.
  3. Dann wird dpkg-buildpackage ausgeführt, um ein .deb Paket zu erstellen.
  4. Und schließlich wird dpkg -i benutzt, um das .deb Paket zu installieren.

1. Folgende Zeile in die /etc/apt/sources.list eintragen, sofern man sid installiert hat.

deb-src http://ftp.de.debian.org/debian/ sid main

2. Die Paketabhängigkeiten zum erfolgreichen Kompilieren als root installieren

aptitude update
aptitude install build-essential fakeroot devscripts
aptitude build-dep Paketname

3. Quellen herunterladen und Binärpakete bauen (alle weiteren Befehle als normaler Nutzer ausführen)

mkdir /home/XXXX/tmp/
cd /home/XXXX/tmp/
apt-get source Paketname
cd Paketname-version/

Nun kann die Datei debian/rules oder weitere debianspezifische Dateien wie debian/control oder debain/changelog angepasst werden. Ein wichtiges Programm hierfür ist debchange welches sich im Paket devscripts befindet.

Nach der Konfiguration wird das .deb Paket erstellt.

dpkg-buildpackage -rfakeroot -us -uc

Mit -us -uc überspringt man den Schritt, bei dem üblicherweise Debian Pakete vom Paketersteller signiert werden.

4. Installieren

cd /home/XXXX/tmp/
dpkg -i Paketname_Version_Architektur.deb

Nicht debianisierte Quellpakete kompilieren

Obwohl Debian ein riesiges Paketarchiv hat, kann es vorkommen, dass es zu einem Paket noch keine angepasste Debianversion gibt. Hierzu muss also das Original-Tarball mit den Quellen von der Projektseite heruntergeladen werden und anschließend mit dem Debianprogramm dh_make in eine debianisierte Version umgewandelt werden. Die Abhängigkeiten des Pakets müssen dann manuell mit apt installiert werden.

aptitude install dh-make

Als normaler Nutzer wieder:

mkdir /home/XXXX/tmp/
cd /home/XXXX/tmp/
tar -xvf Paketname_Version.tar.gz
mv Paketname_Version/ paketname-version/
mv Paketname_Version.tar.gz paketname_version.orig.tar.gz

Die Benennung des Pakets und die Unterstriche sind wichtig, damit sie Debians Konventionen entsprechen. Anderenfalls wird dh_make eine Fehlermeldung ausgeben. Danach in das entpackte Verzeichnis wechseln und dh_make ausführen.

dh_make

dh_make wird eine Reihe von Fragen stellen und schließlich müssen die Felder für den Paketbetreuer ausgefüllt werden. (das was man mit aptitude show zu sehen bekommt)

Nachdem dies erledigt ist

dpkg-buildpackage -rfakeroot -us -uc
dpkg -i paketname_version_architektur.deb

Chroot Umgebung und pbuilder

Am besten führt man alle Schritte zum Kompilieren in einer speziellen chroot Umgebung durch, die vom restlichen System getrennt ist und die sich später sehr leicht auch wieder entfernen lässt. Ein weiterer wichtiger Vorteil ist, dass Pakete, die in dieser Umgebung richtig gebaut werden, auch auf anderen Rechnern erfolgreich übersetzt werden können. Der Prozess wird dadurch reproduzierbar.

Ich benutze entweder die debootstrap Methode oder das Programm pbuilder.

1. Pbuilder installieren

aptitude install pbuilder

2. Chroot Umgebung erstellen

pbuilder create –distribution squeeze

Standardmäßig wird ein auf sid basierendes chroot Image erstellt. Die Option –distribution ändert das.

3. Pbuilder aktualisieren

pbuilder update

Falls man längere Zeit nichts mehr kompiliert hat, sollte die chroot Umgebung aktualisiert werden.

4. Quellpaket herunterladen

apt-get source Paket

5. In das Quellverzeichnis wechseln und debianisiertes Quellpaket in chroot Umgebung bauen

pbuilder build Paket_Version.dsc

Die fertigen Binärpakete befinden sich danach in /var/cache/pbuilder/result.

Der herkömmliche Weg – autoconf und automake

In den meisten Quellpaketen befindet sich ein sogenanntes configure Skript, welches automatisch von dem GNU Programm autoconf generiert wird. In der Regel muss man in das Quellverzeichnis wechseln und folgende Befehle ausführen, um ein Binärpaket zu erstellen. Zuvor müssen Abhängigkeiten manuell oder mit aptitude build-dep installiert werden.

Als Ziel für die Installation wird /usr/local gewählt, /opt ist ebenfalls eine gute Alternative.

./configure –prefix=/usr/local –beliebige Optionen zur Konfiguration

Danach genügt es mit make die Quellen zu übersetzen und mit make install die Binärpakete in das gewählte Zielverzeichnis zu installieren.

make
make install

Für Debian ist es dabei besser make install durch checkinstall zu ersetzen. Checkinstall erstellt ein .deb Paket und merkt sich wohin die Pakete installiert werden. Der Nachteil ist, dass es weder die Quelldateien debianisiert noch Paketabhängigkeiten berücksichtigen kann.

su -c “checkinstall -D make install”

Ein Beispiel für diese Methode war meine Dillo2 Kompilierung auf dem Toshiba Portege.

Links

Basics of the Debian package management system
Debian New Maintainers’ Guide
Ubuntu – Packaging Guide Complete

Videos von der MiniDebConf 2010 in Berlin in Deutsch

Die .ogv Dateien zu Packaging und Advanced Packaging zeigen einen Vortrag zum Thema Paketerstellung mit Debian.

Nach der Lektüre und den Videos sollte man in der Thematik fit sein. 😉

4 Kommentare zu Wie man Debian-Pakete aus den Quellen baut

Hinterlasse eine Antwort

Du kannst diese HTML tags benutzen

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>