Debian-Pakete selbst bauen und per PPA anbieten

Aus LinuxUser 09/2015

Debian-Pakete selbst bauen und per PPA anbieten

© Maridav, 123RF

Gut verpackt

Kein aktuelles Paket des Lieblingsprogramms vorhanden? Kein Problem: Mit ein paar einfachen Handgriffen gelangen Sie zu einem Paket, das Sie danach sogar per PPA anderen weitergeben.

Die Welt der freien Software gibt sich quirlig: Regelmäßig verschwinden ältere Werkzeuge von der Bildfläche, neue Tools entstehen. Der ständige Wandel führt zwangsläufig dazu, dass nicht jeder Distribution zu jeder Zeit Pakete für alle Werkzeuge beiliegen. Ubuntu kommt zwar mit mehreren Zehntausend Paketen daher [1], trotzdem fehlen aber gelegentlich Pakete besonders für aktuelle und noch nicht etablierte Software. Meistens gehen die Maintainer dieser Tools dazu über, selbst entsprechende Pakete anzubieten. Aber für den Autor einer Software ist es schwierig, bei jedem Release diese gleich für die gängigen Distributionen in den aktuellen Versionen parat zu haben.

Möchten Sie ein Programm nutzen, das der von Ihnen verwendeten Distribution noch nicht beiliegt, kennen Sie vermutlich den Effekt: Zwar gibt es eine neue Version des Tools, aber von Paketen für Ihr System ist weit und breit nichts zu sehen. Mit etwas Geschick schaffen Sie selbst Abhilfe, ohne gleich Expertise beim Bauen von Debian-Paketen zu benötigen: Stehen die Quellen der Pakete für die alte Version bereit, gelingt es meist recht einfach, daraus Pakete der neuen Version zu konstruieren. Im Vorbeigehen haben Sie so die Möglichkeit, etwas Gutes für die Open-Source-Gemeinde zu tun: indem Sie nämlich Ihre Pakete auf Launchpad [2] über ein PPA-Verzeichnis bereitstellen, um die Ergebnisse Ihrer Arbeit mit anderen Anwendern zu teilen.

Im Folgenden erfahren Sie am Beispiel der KDE-Backup-Software Kup, wie Sie aus den alten Quellen ein neues Debian-Paket bauen. Los geht es im ersten Schritt damit, sich eine passende Umgebung für den Bau des Pakets anzulegen.

Die meisten Arbeitsschritte setzen im Folgenden die Kommandozeile voraus, weil nur aus dieser heraus der Einsatz einer Chroot-Umgebung sinnvoll ist. Ein Grundwissen um die generelle Funktion der Kommandozeile ist also vonnöten, und die wichtigen Befehle sollten Ihnen geläufig sein.

Vorbereitungen

Ubuntu nutzt derzeit unter der Haube noch den gleichen Paketmanager, der bei Debian zum Einsatz kommt: Dpkg. Ist im Folgenden also von “Debian-Paketen” die Rede, meinen wir damit Archive für diese Art des Softwaremanagements und nicht solche, die für die gleichnamige Distribution kompiliert wurden.

Grundsätzlich besteht die Möglichkeit, Pakete für Dpkg direkt auf dem System zu bauen und zu kompilieren. Das gilt aus mehreren Gründen als verpönt. Der wichtigste davon: Oft fehlt die benötigte Entwicklungsumgebung, Desktop-Installationen von Ubuntu enthalten in der Regel keine Entwicklerpakete. Es fehlen also sowohl der Compiler (GCC oder G++) als auch die Entwicklungsdateien für die auf dem System vorhandenen Bibliotheken.

Sie könnten zwar sämtliche benötigten Pakete nachinstallieren, doch würden diese die Installation aufblähen, und es wäre mühsam, die installierte Software später wieder zu entfernen: Schon das Metapaket build-essential zieht gut ein Dutzend Pakete als Abhängigkeiten nach sich. Die bessere Alternative bietet Debootstrap: Mit diesem Tool schaffen Sie im Handumdrehen eine virtuelle Basisinstallation von Ubuntu, die Sie anschließend mittels des Befehls chroot betreten. Weil eine einfache Umgebung für den Bau von Paketen nicht als bootfähiges System dient, ersparen Sie sich die Tricks und Kniffe, die gegebenenfalls in Sachen Bootloader nötig wären.

Debootstrap legt eine komplette Installation eines Grundsystems innerhalb eines Ordners an. Um damit zu beginnen, installieren Sie auf einem Ubuntu-System erst das Paket debootstrap und legen dann einen Ordner für den Bau der Pakete an. Die Installation der Software erledigen Sie entweder über das übliche Werkzeug in der grafischen Oberfläche oder über die Kommandozeile. Dann hat Debootstrap seinen großen Auftritt: Mit debootstrap PfadSuite erzeugen Sie die Umgebung. Den Teil Suite ersetzen Sie dabei durch den Codenamen, den die gewünschte Ubuntu-Version trägt. Möchten sie das Paket etwa für Version 15.04 erstellen, wäre der passende Wert vivid. Soll Debootstrap einen lokalen Mirror anstelle des Standard-Mirrors nutzen, geben Sie diesen mit angehängtem /ubuntu als letzten Parameter an (Listing 1, Zeile 1).

Listing 1

$ debootstrap vivid-chroot vivid http://de.archive.ubuntu.com/ubuntu
$ chroot vivid-chroot
# locale-gen de_DE.UTF-8
# apt-get install build-essential devscripts fakeroot

Damit installieren Sie in den Ordner vivid-chroot die benötigten Pakete, und zwar vom deutschen Ubuntu-Mirror anstatt vom meist überladenen Standard-Mirror. Je nach Anbindung an das Internet dauert das Herunterladen der benötigten Pakete trotzdem eine Weile. Zu guter Letzt nutzen Sie den Befehl aus der zweiten Zeile von Listing 1, um das virtuelle Ubuntu-System erstmals zu betreten.

Build-Umgebung einrichten

Der nächste Schritt besteht darin, dass Sie das virtuelle Ubuntu-System an Ihre Bedürfnisse anpassen. Tatsächlich haben Sie bisher nur ein Grundsystem, in dem sämtliche Annehmlichkeiten fehlen. Zunächst generieren Sie daher die Locales, die die Unterstützung für die deutsche Sprache bringen und viele Fehlermeldungen ersparen (Listing 1, Zeile 3). Danach richten Sie die Entwicklerpakete ein, die Sie innerhalb der virtuellen Umgebung benötigen (Zeile 4).

Ein Editor für die Kommandozeile fehlt noch: Die Pakete nano oder vim rüsten die Funktion nach. Die Installation von Wget sorgt zudem dafür, dass Sie die Möglichkeit haben, per Kommandozeile Dateien herunterzuladen. Damit bringt Ihre virtuelle Werkstatt bereits die grundlegenden Funktionen für das Bauen von Paketen mit. Im nächsten Schritt laden Sie die Quellen des Ubuntu-Pakets herunter, auf dessen Grundlage Sie die neue Version in ein Paket packen möchten.

Alte Quellen laden

Autoren stellen oft Pakete von Programmen bereit, die es noch nicht offiziell als Paket für eine Distribution gibt. Meist kommen sie aber nicht damit nach, neue Versionen für aktuelle Distributionen zeitnah anzubieten. Das Backup-Programm Kup [1] bietet dafür ein perfektes Beispiel: Von der alten Version 0.5.1 gibt es keine Pakete für Ubuntu 15.04. Die neue Version 0.6.0 steht überhaupt nicht für Ubuntu bereit, lediglich die alte Version 0.5.1 für Ubuntu 14.10 findet sich im Angebot.

Was im ersten Augenblick wie eine Sackgasse aussieht, ist für Sie aber eine Chance: Sie verwenden die alten Pakete für Ubuntu 4.10 einfach als Basis für neue Pakete. Die Herausforderung in diesem Fall: Sie müssen an die Quellen der alten Pakete gelangen.

Der Autor, Simon Persson, stellt seine Software über KDE-look.org [2] bereit. Dort findet sich ein Link zum Build-System des OpenSuse-Projekts. Das produziert auf Wunsch auch Debian-Pakete, und der Autor hat von dieser Möglichkeit ausgiebig Gebrauch gemacht. Am Ende der Suche nach Paketen der Vorgängerversion 0.5.x landen Sie vermutlich auf der entsprechenden Seite [3]. Auf der rechten Seite sticht eine Tabelle ins Auge: Darin finden Sie die Distributionen, für die Sie hier direkt DEB-Pakete erhalten. Am Ende der Tabelle steht bei xUbuntu 15.04 nur unresolvable, aber nicht das wichtigere succeeded. So sagt Ihnen das System, dass für das Programm in der aktuellen Version keine Pakete für Ubuntu 15.04 vorliegen.

Der Vermerk Succeeded findet sich hingegen bei Ubuntu 14.10: Indem Sie auf den Namen der Distribution klicken, gelangen Sie zur nächsten Übersicht. Oben finden Sie den Link Go to download repository – klicken Sie darauf, um zum Verzeichnis mit den Quelltexten zu gelangen. Sie sehen zwei Ordner: amd64 und i386. Viel wichtiger als die Ordner sind aber die drei Dateien am Ende der Seite:

  • kup_0.5.1-1.diff.gz
  • kup_0.5.1-1.dsc
  • kup_0.5.1.orig.tar.gz

Zusammen bilden diese drei Dateien (Abbildung 1) die Grundlage für die Debian-Pakete, die Sie in den beiden eben genannten Ordnern finden. Und genau diese Dateien brauchen Sie, um die Quellen des Pakets samt Debian-Änderungen zu entpacken. Laden Sie aus der virtuellen Chroot-Umgebung heraus die drei Pakete mittels Wget herunter und entpacken Sie die Quellen danach mittels dpkg-source -x kup_0.5.1-1.dsc. Im Ordner ./kup-0.5.1/ liegen danach die Quellen, aus denen Sie im nächsten Schritt Pakete der Version 0.6.0 generieren.

Abbildung 1: Drei Dateien bilden den Quelltext eines Debian-Pakets, sofern es sich um ein Paket nach dem alten Standard 2.0 handelt.

Abbildung 1: Drei Dateien bilden den Quelltext eines Debian-Pakets, sofern es sich um ein Paket nach dem alten Standard 2.0 handelt.

Damit Sie Pakete der neuen Kup-Version erstellen können, benötigen Sie auch die Quellen der neuen Version. Den entsprechenden Tarball erhalten Sie online [4] oder, falls Sie die Media-Edition dieser Ausgabe erworben haben, auf dem beiliegenden Datenträger. Achten Sie darauf, dass Sie das Archiv gleich unter dem richtigen Namen abspeichern – sonst kann Dpkg-buildpackage es später nicht finden. Der korrekte Name lautet kup_0.6.0.orig.tar.gz. Das Kommando tar xvfz kup_0.6.0.orig.tar.gz entpackt den Tarball. Benennen Sie abschließend den neu entstandenen Ordner in kup-0.6.0/ um.

Unterschiede

Ein deutlicher Unterschied zwischen dem entpackten Ordner des Debian-Pakets und dem Ordner der originalen Quellen von Kup 0.6.0 liegt darin, dass Sie in Ersterem einen Ordner debian/ finden. Darin liegen die gesamten Regeln zum Erstellen eines Debian-Pakets in Form von Dateien. Sinnvollerweise fahren Sie also damit fort, diesen Ordner aus dem Verzeichnis kup-0.5.1 in das Verzeichnis kup-0.6.0 zu kopieren.

Dann legen Sie einen neuen Eintrag im Changelog an. Jedes Debian-Paket verfügt über eine solche Datei, in der die wichtigsten Änderungen vermerkt sind. In den entpackten Quellen finden Sie das Changelog in debian/changelog. Es macht aber oft Mühe, den Eintrag von Hand anzulegen, zumal die Syntax des Logs nicht jedem sofort einleuchtet und die vorgegebene Syntax streng ist. Nutzen Sie stattdessen das Werkzeug Dch, das Ihnen den Großteil der Arbeit abnimmt. Das Tool bezieht die wichtigen Werte, wie Ihren Namen und Ihre E-Mail-Adresse, aus Umgebungsvariablen (Listing 2).

Listing 2

export DEBEMAIL="E-Mail-Adresse"
export DEBFULLNAME="Vorname Nachname"

Um sicherzustellen, dass das Programm den richtigen Editor nutzt, setzen Sie zusätzlich die Variable EDITOR noch auf den gewünschten Wert – unter Ubuntu steht hier voreingestellt nano. Haben Sie die Variablen gesetzt, führt der Befehl dch -i dazu, dass das Tool einen neuen Eintrag in debian/changelog anlegt und die Datei danach im Editor öffnet.

Korrigieren Sie die Versionsnummer in der obersten Zeile in Klammern – im Beispiel lautet der neue Eintrag 0.6.0-1 – und ändern Sie das UNRELEASED dahinter in vivid ab. So weißt Launchpad später, dass das Paket für die Ubuntu-Version 15.04 konzipiert ist, und baut es passend für diese Plattform. Als Changelog-Eintrag verwenden Sie eine kurze Beschreibung – im Beispiel böte sich ein Bezug auf die neue Programmversion an.

Die bis hierhin vollzogenen Schritte laufen in allen Fällen gleich ab und genügen in der Regel, um eine neue Version eines Programms zu packen. Dann beschränkt sich die Arbeit tatsächlich nur darauf, den Debian-Ordner in den entpackten Quellcode der neuen Version zu kopieren und schließlich einen Changelog-Eintrag anzufertigen. Das Kommando dpkg-buildpackage -rfakeroot -S -sa baut ein Debian-Source-Paket, das Sie im nächsten Schritt zum Auto-Build von Launchpad hochladen.

Ehrenrunde

Das Beispiel zeigt allerdings, dass Sie es unter Umständen mit größeren Änderungen zu tun bekommen: Simon Persson hat das Backup-Programm nämlich in Version 0.6 auf KDE 5 portiert; Version 0.5.1 nutzte noch das alte KDE 4. Damit Ihre Pakete später in Launchpad ordentlich bauen, definieren Sie diverse KDE-5-Bibliotheken als Abhängigkeiten. Kup teilt Ihnen mit, um welche es sich handelt. Dazu stoßen Sie zuerst den Bauvorgang an:

$ dpkg-buildpackage -rfakeroot -uc -us

Das schlägt zwar garantiert fehl, weil in der Chroot-Umgebung keine entsprechenden Bibliotheken vorliegen. Aus der Fehlermeldung, die das Configure-Skript ausgibt, lesen Sie aber die fehlenden Bibliotheken ab. Mittels des Paketverzeichnisses [5] finden Sie heraus, in welchem Ubuntu-Paket sich die entsprechende Bibliothek versteckt. Am Ende des Vorgangs steht eine Liste neuer Bau-Abhängigkeiten (Listing 3). Diese Einträge gehören nach debian/control in die Zeile, die mit Build-Depends beginnt. Vergessen Sie nicht, hinter dem letzten dort ab Werk vorhandenen Eintrag ein Komma einzusetzen, bevor Sie die zusätzlichen Abhängigkeiten eintragen (Abbildung 2).

Listing 3

kdelibs5-dev, cmake, extra-cmake-modules, qt5-default, qtdeclarative5-dev, libkf5solid-dev, libkf5idletime-dev, libkf5i18n-dev, libkf5notifications-dev, libkf5notifications-dev, libkf5coreaddons-dev, libkf5iconthemes-dev, libkf5dbusaddons-dev, libkf5config-dev, kinit-dev, kio-dev

Abbildung 2: Die Datei <code srcset=

debian/control enthält unter anderem Informationen über zusätzliche Pakete, die ein Paket beim Bauen voraussetzt. Ansonsten schlägt der entsprechende Durchlauf im Auto-Build von Launchpad fehl.” width=”300″ height=”188″ /> Abbildung 2: Die Datei debian/control enthält unter anderem Informationen über zusätzliche Pakete, die ein Paket beim Bauen voraussetzt. Ansonsten schlägt der entsprechende Durchlauf im Auto-Build von Launchpad fehl.

Wollen Sie den Bau des Pakets später erneut anstoßen wollen, löschen Sie das aktuelle Verzeichnis am besten vollständig. Der erste Aufruf von dpkg-buildpackage hat nämlich bereits einen Satz von aktuellen Quellen angelegt: Die Befehle rm -rf kup-0.6.0 und dpkg-source -x kup_0.6.0-1.dsc erstellen ein sauberes, neues Verzeichnis kup-0.6.1.

Eine letzte Besonderheit gilt es, bei Kup zu beachten: Der Pfad, in dem Plugins für das KDE-Kontrollzentrum liegen, hat sich zwischen KDE 4 und KDE 5 verändert. Fügen Sie an das Ende von debian/rules zwei Zeilen ein (Listing 4). Das Verzeichnis debian/ ist jetzt fit für Kup 0.6.0 (Abbildung 3). Mittels dpkg-buildpackage -rfakeroot -S -sa legen Sie ein sauberes Quellpaket an, um es auf Launchpad hochzuladen.

Listing 4

include /usr/share/dpkg/architecture.mk
DEB_CMAKE_EXTRA_FLAGS += -DPLUGIN_INSTALL_DIR="/usr/lib/${DEB_TARGET_MULTIARCH}/qt5/plugins"

Abbildung 3: Die fertige Datei <code srcset=

rules im Ordner debian/ nach den Anpassungen an Kup 0.6.” width=”300″ height=”188″ /> Abbildung 3: Die fertige Datei rules im Ordner debian/ nach den Anpassungen an Kup 0.6.

Arbeit mit Launchpad

Möchten Sie die Früchte Ihrer Arbeit mit anderen teilen, so stellt gerade im Ubuntu-Kontext die Plattform Launchpad das geeignete Werkzeug dafür dar. Falls noch nicht geschehen, melden Sie sich zunächst dort an [6]. Sobald Sie die Mail mit der Bestätigung in Ihrem Posteingang finden, machen Sie sich an die Konfiguration des Accounts: Sie geben in Launchpad die ID Ihres GPG-Schlüssels an, um Pakete in eigene PPAs hochzuladen.

Launchpad nutzt GPG als Kontrollmechanismus: Die .dsc-Datei, die zu jedem Debian-Source-Paket gehört, muss mit dem gleichen GPG-Schlüssel signiert sein, der zu Ihrem Account gehört. Falls Sie sich bisher noch nicht mit GnuPG beschäftigt haben oder noch keinen eigenen Schlüssen besitzen, ist nun ein guter Moment, um das zu ändern – ohne GPG-Schlüssel kommen Sie in Sachen PPA bei Launchpad nämlich nicht weiter. Einen ausführlichen Text zu GnuPG, der auch das Anlegen eines persönlichen Schlüssels bespricht, finden Sie in einer älteren LU-Ausgabe [7].

Abbildung 4: In Launchpad ist es notwendig, einen eigenen GPG-Schlüssel zu hinterlegen, damit der Upload klappt.

Abbildung 4: In Launchpad ist es notwendig, einen eigenen GPG-Schlüssel zu hinterlegen, damit der Upload klappt.

Über die Adresse https://launchpad.net/~LaunchpadID/+editpgpkeys landen Sie direkt in der GnuPG-Konfiguration Ihres Launchpad-Accounts. Hier geben Sie die ID Ihres Schlüssels ein und verknüpfen den Schlüssel in Launchpad dauerhaft mit Ihrem Profil.

Source-Paket signieren

Der vorletzte Schritt hin zum fertigen Paket besteht darin, das Sie das von Dpkg-buildpackage erzeugte Quelltext-Paket signieren. Das geschieht aus Sicherheitsgründen nicht innerhalb der Chroot-Umgebung, sondern direkt auf dem normalen System. Das Werkzeug Debsign greift Ihnen diesbezüglich unter die Arme – installieren Sie also das Paket, in dem sich das Tool befindet:

# apt-get --no-install-recommends install devscripts

Anschließend navigieren Sie auf der Kommandozeile zu dem Ordner, in dem das Source-Paket liegt. Dann folgt der Signatur-Schritt in Form des Kommandos debsign kup_0.6.0-1.dsc. Das Tool fordert Sie gegebenenfalls auf, Ihr GPG-Passwort einzugeben, und legt dann die Signaturen an.

Ins eigene PPA

Am Ende des Vorgangs steht das Hochladen mittels Dput, das auf Ubuntu-Systemen bereits PPAs unterstützt, jedoch unter Umständen noch nicht installiert ist. Bevor Sie das Tool verwenden, brauchen Sie noch ein PPA für Kup: Die URL https://launchpad.net/~Launchpad-ID/+activate-ppa führt direkt zu dem Dialog, in dem Sie ein neues PPA erstellen. Geben Sie einen Namen und eine Beschreibung für das PPA ein und warten Sie, bis der Server die Aktion bestätigt.

Als Name fungiert im Beispiel kup. Danach führen Sie auf dem lokalen System den Befehl dput ppa:Launchpad-ID/Name aus. Im folgenden Beispiel lautet die Launchpad-ID des Autors martin-loschwitz und der Name des PPAs kup, sodass sich der gesamte Befehl wie folgt ergibt:

# dput ppa:martin-loschwitz/kup

Nach ein paar Sekunden erhalten Sie bereits eine Mail des Systems, die Sie über den erfolgreichen Upload informiert. Wenige Minuten später sollten in Ihrem PPA-Verzeichnis fertige .deb-Pakete bereitstehen (Abbildung 5).

Abbildung 5: Das Ende vom Lied: Einsatzbereite Debian-Pakete, die Launchpad per Link zum Herunterladen anbietet.

Abbildung 5: Das Ende vom Lied: Einsatzbereite Debian-Pakete, die Launchpad per Link zum Herunterladen anbietet.

Fazit

Die vorgestellte Herangehensweise macht Sie zwar nicht zum Paket-Profi, löst aber das Problem, dass unter Ubuntu neuere Versionen von Programmen oft nur bereit stehen, wenn Sie diese selbst aus dem Quelltext kompilieren und nach /usr/local installieren. Bei den Updates von einer Minor-Version auf eine neuere fällt der Aufwand meist deutlich geringer aus als im gezeigten Beispiel. Dagegen lässt sich der Umstieg von einer Qt-Version auf eine neue oft im Alleingang nicht schaffen – das gilt auch für vergleichbare Umbauten in dieser Größenordnung. 

Über den Autor

Martin Gerhard Loschwitz arbeitet als Cloud-Architect bei SysEleven in Berlin. Er ist außerdem offizielles Mitglied des Debian-Projekts und seit über zwölf Jahren Debian-Entwickler.

Glossar

PPA

Personal Package Archive. Von Entwicklern gepflegte Repositories, die oft aktuellere Versionen eines Programms enthalten.

Chroot

Change Root. Quasi-virtuelle Umgebung, die für ein Programm einen abgeschotteten Bereich in Dateisystem anlegt.

Infos

[1] Backup-Tool Kup: Ferdinand Thommes, “Eng verzahnt”, LU 07/2015, S. 44, https://www.linux-community.de/35097

[2] Kup auf kde-look.org: http://kde-apps.org/content/show.php/Kup+Backup+System?content=147465

[3] OpenSuse Build-Service zu Kup: https://build.opensuse.org/project/show/home:simper:kup

[4] Kup-Quelltext: https://launchpad.net/~martin-loschwitz/+archive/ubuntu/kup/+files/kup_0.6.0.orig.tar.gz

[5] Ubuntu-Paketverzeichnis: http://packages.ubuntu.com

[6] Launchpad: http://www.launchpad.net

[7] GPG-Schlüssel anlegen: Martin Loschwitz, “Verschlossen”, LU 12/2014, S. 24, https://www.linux-community.de/33765

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDF
LinuxUser 09/2015 KAUFEN
EINZELNE AUSGABE
ABONNEMENTS
TABLET & SMARTPHONE APPS
E-Mail Benachrichtigung
Benachrichtige mich zu:

Hinweis: Dieser Artikel ist älter als ein Jahr, enthaltene Informationen sind möglicherweise veraltet.

0 Kommentare
Älteste
Neuste Beste Bewertung
Nach oben