Kapitel 6. Bau des Pakets

# Kapitel 6. Bau des Pakets

Die Überarbeitung dieser Anleitung mit aktualisierten Inhalten und weiteren praktischen Beispielen ist unter Guide for Debian Maintainers verfügbar. Bitte verwenden Sie diese neue Anleitung als primäre Anleitung.

Nun sollten wir soweit sein, das Paket zu bauen.

## 6.1. Kompletter (Neu-)Bau

Um ein Paket ordnungsgemäß komplett (neu) zu bauen, müssen Sie Folgendes installiert haben:

- Das Paket `build-essential`,

- die im Feld `Build-Depends` aufgelisteten Pakete (siehe Abschnitt 4.1, „`control`“) und

- die im Feld `Build-Depends-Indep` aufgelisteten Pakete (siehe Abschnitt 4.1, „`control`“).

Dann führen Sie den folgenden Befehl im Quellverzeichnis des Programms aus:

    $ dpkg-buildpackage -us -uc

Hiermit wird alles für Sie erledigt, um vollständige Binärpakete und Quellpakete zu erstellen. Im Einzelnen:

- Aufräumen des Quellverzeichnisbaums (»`debian/rules clean`«),

- Bauen des Quellpakets (»`dpkg-source -b`«),

- Bauen des Programms (»`debian/rules build`«),

- Bauen der Binärpakete (»`fakeroot debian/rules binary`«),

- Erstellen der Datei `.dsc`,

- Erstellen der Datei `.changes`, mittels dpkg-genchanges.

Falls das Ergebnis des Baus den Erwartungen entspricht, signieren Sie die Dateien `.dsc` und `.changes` mit Ihrem privaten GPG-Schlüssel mit dem Befehl debsign. Sie müssen Ihre geheime Passphrase zweimal eingeben. [62]

Für nicht native Debian-Pakete, z.B. `gentoo`, werden Sie die folgenden Dateien im übergeordneten Verzeichnis (`~/gentoo`) nach dem Paketbau sehen:

- `gentoo_0.9.12.orig.tar.gz`

  Dies ist der ursprüngliche Quelltext-Tarball der Originalautoren, lediglich umbenannt, um dem Debian-Standard zu genügen. Beachten Sie, dass diese Umbenennung beim initialen Aufruf von »`dh_make -f ../gentoo-0.9.12.tar.gz`« erfolgt ist.

- `gentoo_0.9.12-1.dsc`

  Dies ist eine Zusammenfassung des Inhalts des Quellcode-Pakets. Diese Datei wird aus Ihrer Datei `control` erzeugt und für das Entpacken des Quellcodes mittels dpkg-source(1) benötigt.

- `gentoo_0.9.12-1.debian.tar.gz`

  Dieser komprimierte Tarball enthält die Dateien aus Ihrem `debian`-Verzeichnis. Jede einzelne Änderung, die Sie am ursprünglichen Code vorgenommen haben, wird als quilt-Patch in `debian/patches` gespeichert.

  Wenn jemand Ihr Paket von Grund auf neu bauen will, kann er dafür einfach die drei oben genannten Dateien verwenden. Das Verfahren des Auspackens ist trivial: Kopieren Sie einfach die drei Dateien in ein Verzeichnis und führen Sie »`dpkg-source -x gentoo_0.9.12-1.dsc`« aus. [63]

- `gentoo_0.9.12-1_i386.deb`

  Das ist Ihr fertiges Binärpaket. Sie können es mit dpkg installieren und wieder entfernen wie jedes andere Paket auch.

- `gentoo_0.9.12-1_i386.changes`

  Diese Datei beschreibt alle Änderungen in dieser Paket-Revision. Die Verwaltungsprogramme für Debians FTP-Archive benötigen diese Datei zur Installation der Binär- und Quellcodepakete im FTP-Archiv. Sie wird zum Teil aus den Dateien `changelog` und `.dsc` erzeugt.

  Wenn Sie weiter an dem Paket arbeiten, wird sich sein Verhalten ändern und neue Funktionen werden hinzugefügt. Leute, die Ihr Paket herunterladen, können sich diese Datei ansehen und feststellen, was sich geändert hat. Die Verwaltungsprogramme für das Debian-Archiv werden den Inhalt dieser Datei auch an die Mailingliste debian-devel-changes@lists.debian.org schicken.

Die Dateien `gentoo_0.9.12-1.dsc` und `gentoo_0.9.12-1_i386.changes` müssen unter Verwendung des Befehls debsign mit Ihrem privaten GPG-Schlüssel, der sich im Verzeichnis `~/.gnupg/` befindet, signiert werden, bevor sie zum Debian-FTP-Archiv hochgeladen werden. Die GPG-Signatur stellt unter Verwendung Ihres öffentlichen GPG-Schlüssels den Nachweis bereit, dass diese Dateien tatsächlich von Ihnen sind.

Mit dem folgenden Eintrag in die Datei `~/.devscripts` kann der Befehl debsign dazu veranlasst werden, mit Ihrer angegebenen geheimen Schlüsselkennung zu signieren (was gut fürs Sponsern ist):

    DEBSIGN_KEYID=Ihre_GPG-Schlüsselkennung

Die langen Zahlenreihen in den Dateien `.dsc` und `.changes` sind SHA1/SHA256-Prüfsummen der aufgelisteten Dateien. Jeder, der Ihr Paket herunterlädt, kann die enthaltenen Dateien mit sha1sum(1) oder sha256sum(1) testen. Wenn die Zahlen nicht übereinstimmen, weiß er, die geprüfte Datei ist beschädigt oder manipuliert.

## 6.2. Autobuilder

Debian unterstützt viele Portierungen mit dem Autobuilder-Netz, das buildd-Daemons auf vielen verschiedenen Rechnerarchitekturen ausführt. Obwohl Sie dies nicht selbst durchführen müssen, sollte Ihnen bewusst sein, was mit Ihren Paketen passiert. Lassen Sie uns einen kurzen Blick darauf werfen, wie Ihre Pakete vom Autobuilder-Netz für verschiedene Architekturen neu gebaut werden. [64]

Für Pakete mit »`Architecture: any`« führt das Autobuilder-System eine Neuübersetzung durch. Es stellt folgende Installationen sicher:

- des Pakets `build-essential` und

- der Pakete, die im Feld `Build-Depends` (siehe Abschnitt 4.1, „`control`“) aufgeführt sind.

Dann führt es den folgenden Befehl im Quellverzeichnis aus:

    $ dpkg-buildpackage -B

Hiermit wird alles erledigt, um ein architekturabhängiges Binärpaket für eine andere Architektur zu erstellen. Im Einzelnen:

- Aufräumen des Quellverzeichnisbaums (»`debian/rules clean`«),

- Bauen des Programms (»`debian/rules build`«),

- Bauen der architekturabhängigen Binärpakete (»`fakeroot debian/rules binary-arch`«),

- Signieren der `.dsc`-Quelldatei mit gpg,

- Erstellen und Signieren der für das Hochladen notwendigen `.changes`-Datei mit dpkg-genchanges und gpg.

Das ist der Grund, weshalb Sie Ihr Paket auch für andere Architekturen sehen.

Obwohl Pakete, die im Feld `Build-Depends-Indep` aufgeführt sind, installiert sein müssen, wenn wir das Paket bauen (siehe Abschnitt 6.1, „Kompletter (Neu-)Bau“), müssen diese auf dem Autobuilder-System nicht installiert sein, weil es nur architekturabhängige Binärpakete baut. [65] Diese Unterscheidung zwischen dem normalen Bau und der Situation bei dem Autobuilder-Ablauf entscheidet darüber, ob Sie solche erforderlichen Pakete im Feld `Build-Depends` oder `Build-Depends-Indep` der Datei `debian/control` auflisten (siehe Abschnitt 4.1, „`control`“).

## 6.3. Der Befehl debuild

Sie können den Prozess des Paketbauens rund um die Ausführung des Befehls dpkg-buildpackage weiter mit dem Befehl debuild automatisieren. Siehe debuild(1).

Der Befehl debuild führt den Befehl lintian aus, um nach dem Bau des Debian-Pakets eine statische Prüfungen durchzuführen. Der Befehl lintian kann mit dem folgenden Eintrag in der Datei `~/.devscripts` angepasst werden:

    DEBUILD_DPKG_BUILDPACKAGE_OPTS="-us -uc -I -i"
    DEBUILD_LINTIAN_OPTS="-i -I --show-overrides"

Jetzt kann das Säubern des Quellverzeichnisses und Neubauen des Pakets unter Ihrem Benutzerkonto einfach so durchgeführt werden:

    $ debuild

Sie können das Quellverzeichnis einfach so säubern:

    $ debuild -- clean

## 6.4. Das Paket `pbuilder`

Um die Abhängigkeiten für den Bau in einer sauberen Umgebung (chroot) zu überprüfen, ist das Paket `pbuilder` sehr gut geeignet. [66] Es stellt sicher, dass das Paket aus den Quellen auf einem `Sid`-Autobuilder für verschiedene Architekturen gebaut werden kann. Weiterhin wird hierdurch ein schwerwiegender FTBFS-Fehler (»Fails To Build From Source«, kann nicht aus den Quellen gebaut werden) verhindert, der immer als release-kritisch (RC) angesehen wird. [67]

Lassen Sie uns das Paket `pbuilder` folgendermaßen anpassen:

- Machen Sie das Verzeichnis `/var/cache/pbuilder/result` für Ihr Benutzerkonto schreibbar.

- Erstellen Sie ein Verzeichnis, z.B. ``/var/cache/pbuilder/hooks``, das ebenfalls für den Benutzer schreibbar ist, so dass Hook-Skripts dort abgelegt werden können.

- Konfigurieren Sie die Datei `~/.pbuilderrc` oder `/etc/pbuilderrc`, so dass sie folgendes enthält:

      AUTO_DEBSIGN=${AUTO_DEBSIGN:-no}
      HOOKDIR=/var/cache/pbuilder/hooks

Lassen Sie uns zuerst das lokale `pbuilder`-chroot-System wie folgt initialisieren:

    $ sudo pbuilder create

Falls Sie ein Quellpaket schon komplett fertiggestellt haben, führen Sie die folgenden Befehle in dem Verzeichnis aus, in dem die Dateien ``foo`.orig.tar.gz`, ``foo`.debian.tar.gz` und ``foo`.dsc` liegen, um das lokale `pbuilder`-chroot-System zu aktualisieren und Binärpakete darin zu bauen:

    $ sudo pbuilder --update
    $ sudo pbuilder --build foo_Version.dsc

Die neu erstellten Pakete ohne GPG-Signaturen werden unter `/var/cache/pbuilder/result/` mit einem nicht-root-Eigentümer abgelegt.

Die GPG-Signaturen für die Dateien `.dsc` und `.changes` können wie folgt erstellt werden:

    $ cd /var/cache/pbuilder/result/
    $ debsign foo_Version_Arch.changes

Falls Sie bereits ein aktualisiertes Quellverzeichnis haben, jedoch das zugehörige Quellpaket nicht erstellt haben, führen Sie stattdessen die folgenden Befehle in dem Quellverzeichnis aus, in dem das Verzeichnis `debian` enthalten ist:

    $ sudo pbuilder --update
    $ pdebuild

Sie können sich in der erstellten chroot-Umgebung anmelden, indem Sie den Befehl »`pbuilder --login --save-after-login`« verwenden und diese dann so einrichten, wie Sie wollen. Diese Umgebung kann gespeichert werden, indem die Shell-Eingabeaufforderung mittels `^D` (Steuerung-D) verlassen wird.

Die aktuelle Version des Programms lintian kann in der `chroot`-Umgebung ausgeführt werden, indem das Hook-Skript ``/var/cache/pbuilder/hooks`/B90lintian` wie folgt eingerichtet wird: [68]

    #!/bin/sh
    set -e
    install_packages() {
            apt-get -y --allow-downgrades install "$@"
            }
    install_packages lintian
    echo "+++ Lintian-Ausgabe +++"
    su -c "lintian -i -I --show-overrides /tmp/buildd/*.changes" - pbuilder
    # Verwenden Sie diese Version, falls Lintian beim Bau nicht fehlschlagen soll
    #su -c "lintian -i -I --show-overrides /tmp/buildd/*.changes; :" - pbuilder
    echo "+++ Ende der Lintian-Ausgabe +++"

Sie müssen Zugriff auf die neueste `Sid`-Umgebung haben, damit Sie Pakete korrekt für `Sid` bauen können. Allerdings kann es in `Sid` immer wieder mal Probleme geben, so dass Sie wahrscheinlich nicht Ihr gesamtes System umstellen wollen. Das Paket `pbuilder` bietet einen Ausweg für diese Situation.

Es kann vorkommen, dass Sie Ihre Pakete für `Stable` aktualisieren müssen, nachdem sie veröffentlicht worden sind, beispielsweise über `stable-proposed-updates`, `stable/updates` usw. [69] In einem solchen Fall sollten Sie Ihre Pakete zügig aktualisieren, die Ausrede, dass Sie ein `Sid`-System verwenden, ist nicht akzeptabel. Das Paket `pbuilder` kann Ihnen dabei helfen, auf nahezu jede Debian-basierte Distribution derselben Architektur zuzugreifen.

Siehe http://www.netfort.gr.jp/~dancer/software/pbuilder.html, pdebuild(1), pbuilderrc(5) und pbuilder(8).

## 6.5. Der Befehl git-buildpackage und ähnliche

Falls der Autor des ursprünglichen Programms ein Quelltext-Verwaltungsprogramm (VCS) [70] zur Betreuung des Codes einsetzt, sollten Sie darüber nachdenken, dies ebenfalls zu tun. Damit wird das Zusammenführen und Herauspicken von Patches des Originalautors wesentlich einfacher. Es gibt verschiedene Pakete, die spezialisierte Wrapper-Skripte enthalten, die das Bauen eines Debian-Pakets mit dem jeweiligen VCS erleichtern.

- `git-buildpackage`: Eine Suite zur Unterstützung von Debian-Paketen in Git-Depots.

- `svn-buildpackage`: Hilfsprogramme zur Betreuung von Debian-Paketen mit Subversion.

- `cvs-buildpackage`: Eine Sammlung von Skripten für Debian-Pakete in CVS-Quelltextbäumen.

Die Verwendung von `git-buildpackage` ist bei Debian-Entwicklern recht beliebt, um Debian-Pakete mit dem Git-Server auf alioth.debian.org zu verwalten. [71] Dieses Paket bietet viele Befehle, um Paketierungsaktivitäten zu automatisieren:

- gbp-import-dsc(1): Import eines bestehenden Debian-Pakets in ein Git-Depot.

- gbp-import-orig(1): Import eines neuen Tars der Originalautoren in ein Git-Depot.

- gbp-dch(1): Erstellung des Debian-Changelogs aus Git-Commit-Nachrichten.

- git-buildpackage(1): Bau von Debian-Paketen aus einem Git-Depot.

- git-pbuilder(1): Bau von Debian-Paketen aus einem Git-Depot mit pbuilder/cowbuilder.

Diese Befehle verwenden drei Zweige, um die Paktierungsaktivitäten nachzuverfolgen:

- `main` für den Debian-Paketierungsquellbaum

- `upstream` für den Quellbaum der Originalautoren

- `pristine-tar` für Tarbälle der Originalautoren, die mit der Option `--pristine-tar` erstellt wurden.[72]

Sie können `git-buildpackage` mit `~/.gbp.conf` konfigurieren. Lesen Sie gbp.conf(5). [73]

## 6.6. Schneller Neubau

Bei einem großen Paket wollen Sie bestimmt nicht alles nach jeder kleiner Änderung in `debian/rules` neu kompilieren. Für Testzwecke können Sie folgendermaßen eine `.deb`-Datei erstellen, ohne alle Schritte durchzumachen[74]:

    $ fakeroot debian/rules binary

Oder noch einfacher, falls Sie nur feststellen wollen, ob das Paket gebaut werden kann oder nicht:

    $ fakeroot debian/rules build

Wenn Sie mit Ihren Anpassungen fertig sind, vergessen Sie nicht, das Paket gemäß der korrekten Prozedur neu zu bauen. Sie werden `.deb`-Dateien, die auf diese Weise gebaut wurden, nicht korrekt hochladen können.

## 6.7. Befehlshierarchie

Dies ist eine kurze Zusammenfassung, wie die vielen Befehle zum Paketbau in der Befehlshierarchie zusammenpassen. Es gibt viele Wege, das gleiche zu erledigen.

- `debian/rules` = Betreuerskript für den Paketbau

- dpkg-buildpackage = Kern des Paketbauwerkzeuges

- debuild = dpkg-buildpackage + lintian (unter bereinigten Umgebungsvariablen bauen)

- pbuilder = Kern des Debian-Chroot-Umgebungswerkzeuges

- pdebuild = pbuilder + dpkg-buildpackage (in der Chroot bauen)

- cowbuilder = Ausführung von pbuilder beschleunigen

- git-pbuilder = die einfach zu benutzende Syntax für pdebuild (von gbp buildpackage verwandt)

- gbp = Debian-Quellen in einem Git-Depot verwalten

- gbp buildpackage = pbuilder + dpkg-buildpackage + gbp

Obwohl die Verwendung von abstrakteren Befehlen wie gbp buildpackage und pbuilder eine perfekte Paketbauumgebung sicherstellen, ist es essenziell, zu verstehen, wie die systemnahen Befehle wie `debian/rules` und dpkg-buildpackage unter ihnen ausgeführt werden.

[62] Dieser GPG-Schlüssel muss von einem Debian-Entwickler signiert worden sein, um mit dem Vertrauensnetz verbunden zu sein, und muss im Debian-Schlüsselring registriert sein. Dies ermöglicht es, dass Ihre hochgeladenen Pakete im Debian-Archiv akzeptiert werden. Lesen Sie Creating a new GPG key und Debian Wiki on Keysigning.

[63] Sie können das Anwenden der quilt-Patches im `3.0 (quilt)`-Quellformat am Ende des Auspackens verhindern, indem Sie die Option `--skip-patches` benutzen. Alternativ können Sie »`dquilt pop -a`« nach dem normalen Auspacken aufrufen.

[64] Das tatsächliche Autobuilder-System besteht aus einem wesentlich komplizierteren Schema als dem hier dargestellten. Diese Details führen aber hier zu weit.

[65] Im Gegensatz zum `pbuilder`-Paket erzwingt die chroot-Umgebung im Paket `sbuild`, die vom Autobuilder-System verwendet wird, keine Verwendung einer Minimalumgebung. Daher können übriggebliebene Pakete installiert sein.

[66] Weil das Paket `pbuilder` ständig weiterentwickelt wird, sollten Sie die tatsächliche Konfiguration herausfinden, indem Sie die aktuelle offizielle Dokumentation durchlesen.

[67] Lesen Sie http://buildd.debian.org/ für weitere Informationen über das automatische Bauen von Debian-Paketen.

[68] Dies setzt `HOOKDIR=/var/cache/pbuilder/hooks` voraus. Sie finden viele Beispiele für Hook-Skripte im Verzeichnis `/usr/share/doc/pbuilder/examples`.

[69] Es gibt für Aktualisierungen Ihrer `Stable`-Pakete einige Einschränkungen.

[70] Lesen Sie Version control systems für mehr Informationen.

[71] Das Dokument Debian wiki Alioth dokumentiert, wie der Dienst alioth.debian.org verwandt wird.

[72] Die Option `--pristine-tar` ruft den Befehl pristine-tar auf, der eine exakte Kopie des ursprünglichen Tarballs erneut erstellt und dabei nur eine kleine binäre Deltadatei und den Inhalt des Tarballs verwendet, der typischerweise im Zweig `upstream` des VCS gehalten wird.

[73] Hier sind einige Quellen im Web für fortgeschrittene Anwender.

- »Building Debian Packages with git-buildpackage« (`/usr/share/doc/git-buildpackage/manual-html/gbp.html`)

- »debian packages in git«

- »Using Git for Debian Packaging«

- »git-dpm: Debian packages in Git manager«

[74] Umgebungsvariablen, die normalerweise auf vernünftige Werte gesetzt sind, werden bei dieser Methode nicht eingerichtet. Erstellen Sie niemals echte Pakete, die hochgeladen werden sollen, mit dieser schnellen Methode.

Kapitel 5. Andere Dateien im Verzeichnis `debian` |  | Kapitel 7. Überprüfen des Pakets auf Fehler