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. 😉

17 Replies to “Wie man Debian-Pakete aus den Quellen baut”

  1. Gute Zusammenfassung, aber eine Anmerkung hätte ich da noch: Sollte man bei den nicht-debianisierten Quellpaketen nicht auch Fakeroot (also die Option -rfakeroot bei dpkg-buildpackage) verwenden, damit die Rechte richtig gesetzt werden?

    1. Du hast Recht. Ich bin mir nicht sicher, ob dpkg-buildpackage eine Warnung ausgeben oder abbrechen wird, wenn root Rechte gefordert sind, man aber nur als normaler Nutzer das Paket baut. Als Test hatte ich den Quellcode des Midnight Commander mal debianisiert, wobei sich dpkg-buildpackage ohne Parameter nicht beschwert hat.
      Soweit ich die Hilfeseite von dpkg-buildpackage verstehe, wird -rfakeroot auch nur dann angewendet, wenn tatsächlich root Rechte benötigt werden. Man kann also nichts falsch machen, wenn man es immer benutzt. Von daher vielen Dank für deinen Hinweis. Habe es im Text korrigiert.

  2. Hi Martin!
    Beim debianforum war ich in meinen Anfangsjahren bei Linux fleißiger Leser, habe dort aber noch nie etwas gepostet. Ich versuche aber im Wiki auf debian.org etwas mitzuhelfen und an anderen Baustellen wie z.B. Mediathekview im Moment.
    Du kannst diesen Artikel gerne per Copy&Paste in das Wiki des Debianforums übertragen, solange er dort unter der gleichen oder einer ähnlichen Lizenz wie CC-BY-SA steht und du einen Link auf den Originalbeitrag setzt. So war dieses Blog hier auch immer gedacht.

  3. Ich möchte mich vor allem dafür bedanken das dieser Artikel in Deutsch ist.
    Sehr entäuscht bin ich meisst darüber das solche Artikel fast aussschliesslich in Englisch verfügbar sind. Es ist eine Sparche die mir nicht zugänglich wurde.
    Ich möchte mich nicht bei jeder Gelegenheit Outen das ich nie eine Fremdspache erlernt habe.
    Es tut mir immer leid, weil ich auch der Meinung bin das es einige andere auch immer schwer haben. Das merke ich wenn ich dann doch mal das Thema anspreche. Vielen geht es ähnlich wie mir.
    lg Emmerich

    1. Gern geschehen. Ich denke auch, dass es die Materie leichter zugänglich macht, wenn man es in der jeweiligen Muttersprache erklärt. Englisch lässt sich zwar bei einem internationalen Projekt wie Debian nicht vermeiden, aber wie man ein spezifisches Problem lösen kann, das lässt sich auch gut in Deutsch erklären. 🙂

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.