Debian-Pakete bauen von einfach bis anspruchsvoll

Aus LinuxUser 02/2008

Debian-Pakete bauen von einfach bis anspruchsvoll

Wie am Schnürchen

In nur wenigen Schritten verwandeln Sie ein Quelltextarchiv in ein vollwertiges Debian-Paket.

Linux-Anwender überwinden nach einigem Umgang mit dem System schnell die Angst vor dem Neuen: Die einst bedrohliche Kommandozeile erlangt als unentbehrlicher Helfer neue Wertschätzung, der früher Ehrfurcht gebietende Compiler dient als selbstverständliches Werkzeug zum Bau neuer Software

Mit etwas Routine stellt das Übersetzen und Einrichten mit dem Linux-typischen Dreischritt configure, make und make install keine große Hürde mehr dar. Anschließend gibt es aber ein Problem: Der Paketmanager weiß nichts von den händisch eingespielten Dateien. Wie halten Sie also ein System schlank, in dem es von manuell installierten Softwarepaketen wimmelt? Ganz einfach: Vertrauen Sie auch die selbstkompilierten Programme dem Paketmanager an.

Checkinstall

Es gibt mehrere Methoden, das zu tun: Das Programm Checkinstall [1] (Abbildung 1) bietet die wohl einfachste Möglichkeit, DEB- und RPM-Pakete zu erzeugen [2]. Checkinstall überzeugt zwar durch seine einfache Handhabung. Es versagt aber, wenn ein Paket vor und nach dem Installieren so genannte Pre- und Post-Install-Skripte ausführt. In diese Kategorie fallen beispielsweise alle Pakete mit Kernel-Modul.

Abbildung 1: Checkinstall sammelt Informationen wie Programmbeschreibung und -version, bevor es ein distributionsspezifisches Paket erstellt und installiert. Abhängigkeiten definiert es nicht automatisch.

Abbildung 1: Checkinstall sammelt Informationen wie Programmbeschreibung und -version, bevor es ein distributionsspezifisches Paket erstellt und installiert. Abhängigkeiten definiert es nicht automatisch.

Wer DEB-Pakete bevorzugt, die auch auf anderen Systemen laufen, benötigt also mehr als die von Checkinstall erzeugten Rumpfpakete. Debian-basierte Distributionen bringen daher vor allem im Paket dpkg-dev eine Menge Werkzeuge mit, die das Anfertigen von Paketen vereinfachen.

Original statt Imitat

Debian-Pakete lassen sich ganz einfach bauen, sofern das Quelltextverzeichnis bereits entsprechend präpariert ist. Dann liegen alle notwendigen Informationen im Unterverzeichnis debian des Sourcecode-Verzeichnisses. Bietet die Distribution die gewünschte Software bereits als gewöhnliches DEB-Paket an, dann trifft das meist zu. Um diese Version neu zu kompilieren – etwa mit Unterstützung für zusätzliche Features – laden Sie zunächst den dazugehörigen Quelltext über apt-get source Paketname (ohne Root-Rechte) herunter. Eventuell müssen Sie dazu über Synaptic die Paketquelle Quelltexte aktivieren.

Sie finden nun drei neue Dateien und ein Verzeichnis vor. Die Dateinamen setzen sich aus dem Namen der Software, der Versionsnummer des Pakets und gegebenenfalls einer internen Revisionsbezeichnung wie meinedistribution3 zusammen. Bei einer der drei Dateien handelt es sich um das Originalarchiv mit der Endung .orig.tar.gz. Das File mit dem Suffix .diff.gz enthält die Änderungen, die der Distributor am Originalquelltext vorgenommen hat, um das Paket an sein System anzupassen. Dazu kommt eine .dsc-Datei, die eine Paketbeschreibung mit Angaben zu den unterstützten Prozessorarchitekturen und den Paket-Maintainern liefert. Das von apt-get source angelegte Verzeichnis enthält zudem das bereits erwähnte Verzeichnis debian.

Im einfachsten Fall nehmen Sie nun die gewünschten Änderungen vor. Sie ergänzen beispielsweise die Software um eine bestimmte Programmbibliothek, um so ihre Fähigkeiten zu erweitern. Sie bauen in den Quelltext weitere Features ein oder spielen Patches mit Änderungen ein. Um dann ein neues Debian-Paket zu erzeugen, geben Sie im Quelltextverzeichnis den Befehl dpkg-buildpackage ein, der zum Paket dpkg-dev gehört. Dazu benötigen Sie eigentlich Root-Rechte, doch mit dem Fakeroot gelingt der Debian-Bau auch mit Schreibrechten im Quelltext- und im darüber liegenden Verzeichnis. Haben Sie das Paket fakeroot installiert, hängen Sie an den Befehl zum Paketbau einfach den Parameter -rfakeroot an:

$ dpkg-buildpackage -rfakeroot

Das Programm dpkg-buildpackage untersucht, ob es die zum Kompilieren notwendigen Tools und Bibliotheken überhaupt gibt. Falls nicht, gibt es eine Liste der fehlenden Pakete aus, die Sie nun nachinstallieren. Andernfalls ruft das Programm das Skript configure und dann make auf. Abschließend erzeugt es die DEB-Pakete und legt sie im übergeordneten Verzeichnis ab. Zur Installation gilt es den Paketmanager zu bemühen; auf der Kommandozeile lautet der notwendige Befehl:

$ sudo dpkg -i Paketname.deb

Das eben gezeigte Verfahren eignet sich zwar nicht für größere Änderungen. Dennoch empfiehlt es sich, auch Details zur späteren Nachlese zu dokumentieren. Dafür gibt es die Datei changelog im Verzeichnis debian – halten Sie exakt das dort vorgegebene Format ein, sonst bricht der Paketbau ab.

Updates

In der Praxis passiert es häufig, dass das vom Distributor angebotene Programmpaket nicht die neueste Version einer Software enthält. In diesem Fall brauchen Sie ein neues DEB-Paket, das auf dem Quelltext der aktualisierten Programmversion basiert. Das Kommando uupdate aus dem Paket Devscripts dient diesem Zweck.

Um es einzusetzen, laden Sie den Tarball des neuen Archivs herunter, entpacken ihn aber nicht. Dann laden Sie mit dem Befehl apt-get source Programm (nicht als root) die vom Distributor angebotene Version des gleichen Pakets herunter. Darin finden Sie nicht nur ein vollständiges debian-Verzeichnis mit wiederverwendbaren Informationen, sondern meist auch Änderungen vom Distributor, um das Paket dem eigenen System anzupassen.

Wechseln Sie nun ins von apt-get source erstellte Verzeichnis mit dem Namen Programm-Version und führen Sie den Befehl uupdate -u aus, ergänzt um den Dateinamen des Archivs, das die neue Programmversion enthält (Abbildung 2):

$ uupdate -u Pfad/Programm-NeueVersion.tar.gz
Abbildung 2: Der Befehl     <code srcset=

uupdate entpackt ein Quelltextarchiv und legt auf Basis eines bereits existierenden Pakets das Unterverzeichnis debian an. Es probiert, vorhandene Anpassungen des Quelltexts zu übertragen, funktioniert aber auch bei einem Fehlschlag dieses Versuchs.” width=”300″ height=”216″ /> Abbildung 2: Der Befehl uupdate entpackt ein Quelltextarchiv und legt auf Basis eines bereits existierenden Pakets das Unterverzeichnis debian an. Es probiert, vorhandene Anpassungen des Quelltexts zu übertragen, funktioniert aber auch bei einem Fehlschlag dieses Versuchs.

Das Kommando liest die vom Distributor vorgenommenen Änderungen aus der Datei Programm.diff.gz und versucht, sie auch in die neue Version einzuspielen. Das funktioniert allerdings nur, falls die veränderten Dateien sich in der neuen Programmversion nicht allzu sehr von ihren Vorgängern unterscheiden. Funktionieren nur einzelne der Patches nicht, dann geht der Update-Vorgang ohne sie weiter. Auch Informationen wie die Paketbeschreibung und Abhängigkeiten überträgt uupdate von der alten auf die neue Paketversion.

Der uupdate-Aufruf entpackt den Tarball, der die aktualisierte Programmversion enthält. Es entsteht ein neues Quelltextverzeichnis inklusive debian-Unterverzeichnis mit den vom alten Paket übernommenen Paketinformationen. Führen Sie im neuen Quelltextverzeichnis dpkg-buildpackage aus – wie oben beschrieben mit Root-Rechen oder mit dem Parameter -rfakeroot. Das startet den Kompiliervorgang, der in einem vollständigen DEB-Paket mündet. Die Installation erfolgt wieder über die gewohnten Paketverwaltungswerkzeuge, auf der Kommandozeile also mit dpkg -i Paket.deb.

Neubauten

Liegt keine alte Programmversion vor, auf der Sie aufbauen können, bleibt nur der Weg zu einem gänzlich neuen DEB-Paket. Entpacken Sie zunächst das Quellcodearchiv, das noch keine distributionsspezifischen Informationen enthält. Die “Debianisierung” des Quelltextes erfolgt über das Paket dh-make. Rufen Sie nach dessen Installation aus dem Verzeichnis mit dem Quellcode dh_make mit dem Parameter -f und dem Pfad zum Original-Quelltextarchiv auf. Außerdem geben Sie für das Paket eine E-Mail-Adresse an, unter der andere Benutzer Sie erreichen. Diese definieren Sie mit dem Anhang -e:

$ dh_make -e mail@adresse.de -f ../Programm-Version.tar.gz

Es folgt die Entscheidung, um was für eine Paketart es sich handeln soll (Abbildung 3). Im einfachsten Fall geben Sie s ein für single binary, also ein einzelnes ausführbares Programm. Alternativ stehen multiple binary (m, mehrere ausführbare Programme in einem Paket), library (l, eine Programmbibliothek), und kernel module (k, ein Kernel-Modul) zur Verfügung.

Vor allem für komplexe Pakete, die Sie voraussichtlich längere Zeit ernsthaft verwenden und aktualisieren wollen, eignet sich insbesondere die Option CDBS (b, Common Debian Build System, [3], [4]). Das setzt allerdings eine tiefer gehende Beschäftigung mit dem DEB-Paketsystem voraus.

Abbildung 3: Das Kommando     <code srcset=

dh_make "debianisiert" ein Quelltextverzeichnis: Es legt ein Unterverzeichnis namens debian an, in dem es abhängig vom gewählten Pakettyp die Dateien erstellt und mit allgemeinen Informationen füllt.” width=”300″ height=”199″ /> Abbildung 3: Das Kommando dh_make “debianisiert” ein Quelltextverzeichnis: Es legt ein Unterverzeichnis namens debian an, in dem es abhängig vom gewählten Pakettyp die Dateien erstellt und mit allgemeinen Informationen füllt.

Dateien im debian-Verzeichnis

Nach dem Aufruf von dh_make ist es Zeit für einen Blick auf die Dateien im Verzeichnis debian (Tabelle “Dateien im Verzeichnis debian“). Die angelegten Files bestehen aus Platzhaltern und allgemeinen Informationen, die Sie nun an das Paket anpassen.

Dateien im Verzeichnis <C>debian<C>

Dateiname Dateiname und -pfad nach der Installation Funktion
README.Debian /usr/share/doc/Paketname/README.Debian Dokumentation von Unterschieden zwischen dem Originalquelltext und der “debianisierten” Version
changelog /usr/share/doc/Paketname/changelog.Debian.gz Protokoll der am Paket vorgenommenen Änderungen.
copyright /usr/share/doc/Paketname/changelog.Debian.gz Lizenz, der die im Paket enthaltene Software unterliegt
control Informationen über das Paket: Name, Version, Abhängigkeiten, Beschreibung etc.
rules Regeln zum Erstellen des Pakets
conffiles.ex im Paket enthaltene Konfigurationsdateien
cron.d.ex /etc/cron.d/Paketname Aktionen und Programme, die das System nach der Paketinstallation regelmäßig mit Cron ausführen soll (im Cron-Format)
dirs Liste der vom Programm benötigten Verzeichnisse ohne anführende Schrägstriche; beispielsweise usr/bin
docs Liste der Dateien, die ins Verzeichnis /usr/share/doc/Paketname/ kopiert werden sollen
emacsen-install.ex Emacs-spezifisch (optional)
emacsen-remove.ex Emacs-spezifisch (optional)
emacsen-startup.ex Emacs-spezifisch (optional)
init.d.ex /etc/init.d/Paketname das Init-Script zum Starten und Beenden eines gegebenenfalls im Paket enthaltenen Systemdienstes
manpage.1.ex /usr/share/man/man1/Programmname.1.gz Man-Page des Programms
menu.ex /usr/share/menu/Paketname Informationen für einen Eintrag des Programms ins Startmenü
watch.ex Konfigurationsdatei, um das Paket mit Hilfe von uscan und uupdate zu aktualisieren
preinst.ex enthält Befehle, die die Paketverwaltung vor der Installation des Pakets ausführt
postinst.ex enthält Befehle, die die Paketverwaltung nach der Installation des Pakets ausführt
prerm.ex enthält Befehle, die die Paketverwaltung vor dem Entfernen des Pakets ausführt
postrm.ex enthält Befehle, die die Paketverwaltung nach dem Entfernen des Pakets ausführt

Eine zentrale Rolle spielt die Datei control, weil sie alle relevanten Paketinformationen enthält. Nach dem Durchlauf von dh_make enthält sie bereits bekannte Informationen wie Ihre E-Mail-Adresse und den Programmnamen. In der Zeile Section: geben Sie die Softwarekategorie an; die Tabelle “Softwarekategorien für Section:” zeigt, welche Einträge zur Wahl stehen.

Softwarekategorien für <C>Section:<C>

Bezeichnung Zweck
admin Systemverwaltungsprogramme
base grundlegende Pakete
devel Pakete für Software-Entwickler
doc Dokumentation
libs Programmbibliotheken
mail E-Mail-Software
net Netzwerk-Software
x11 übrige grafische Programme

In einigen Fällen ergibt sich daraus bereits eine sinnvolle Zuschreibung für die Zeile Priority:. Sie beschreibt, wie wichtig die Software für das System ist; bei selbst gebauten Paketen empfiehlt sich optional oder extra. Die Abhängigkeiten legt die Zeile Depends: fest. Darin hat dh_make bereits den Ausdruck

${shlibs:Depends}, ${misc:Depends}

eingefügt. Diese Variablen nehmen Ihnen die Arbeit ab, denn beim Kompilieren ersetzt das Programm dh_shlibdeps sie automatisch durch die zwingend erforderlichen Pakete. Möchten Sie diese durch weitere Pakete mit dem Charakter einer Empfehlung ergänzen, fügen Sie eine Suggests:-Zeile in die Datei control ein;

Suggests: libqt0-ruby1.8

Das paketierte Programm benötigt die in der Suggests:-Zeile aufgeführten Programme und Bibliotheken gewöhnlich nicht unbedingt, um zu funktionieren. Häufig enthalten sie Features, auf die der Benutzer ohne sie verzichten muss.

Es bleibt die Programmbeschreibung im Feld Description: zu füllen. In die erste Zeile gehört ein Kurztext von höchstens 60 Zeichen, darunter findet sich Platz für eine umfangreichere Darstellung. Rücken Sie jede Zeile mit einem Leerzeichen ein, damit sie beim späteren Paketbau als dem Description:-Feld zugehörig erkannt wird.

Endspurt

Ebenfalls eine zentrale Rolle im Verzeichnis debian spielt die Datei rules. Der Befehl dpkg-buildpackage, der schließlich den Paketbau einleitet, liest seine Anweisungen nämlich aus dieser Datei. Dennoch brauchen Sie hier gewöhnlich keine Änderungen vorzunehmen, weil der von dh_make generierte Vorschlag bei einfachen Programmen funktioniert. Falls Sie komplexere Software oder aufwändige Programmbibliotheken schnüren, lassen sich hier zusätzliche Parameter – etwa Compiler-Optionen – angeben.

Die copyright-Datei enthält die Namen und E-Mail-Adressen der Programmierer und Copyright-Inhaber sowie die Lizenz, der das Softwarepaket unterliegt. Tragen Sie Ihren Text mit jeweils vier Leerzeichen Einrückung ein. Sofern Sie eine GPL-Lizenzierung wünschen, brauchen Sie nicht den vollständigen Text einzutragen, denn der liegt ohnehin auf jedem Debian-basierten System im Verzeichnis /usr/share/common-licenses/GPL vor. Dort finden sich auch die Nachfolger GPLv2 und GPLv3. In dem Fall genügt es, in copyright auf den dort nachlesbaren Lizenztext zu verweisen.

Auf die bereits erwähnte Datei changelog-Datei sollten Sie bei einem neuen Paket ebenfalls einen Blick werfen. Beim ersten Versuch gibt es normalerweise noch keine dort zu protokollierenden Änderungen; in dem Fall löschen Sie die Datei einfach, andernfalls bearbeiten Sie sie. Ähnlich wie mit changelog verhält es sich mit der Datei README.Debian. Hier ist Platz für Hinweise, die speziell das DEB-Paket betreffen und nicht die enthaltene Software im Allgemeinen. Verspüren Sie in dieser Hinsicht kein Mitteilungsbedürfnis, löschen Sie auch diese Datei.

Kleine Schritte

Es bleibt festzuhalten: Der Aufwand lohnt sich. Wer selbst Software kompiliert, erreicht durch den Bau dazugehöriger Pakete mit einem kleinen Mehr an Aufwand einen großen Zuwachs an Komfort. Dabei gilt wiederum abzuwägen, ob ein einfaches Checkinstall-Paket genügt, das vermutlich nur auf dem eigenen System läuft.

Der Umgang mit uupdate für die Aktualisierung auf Basis bereits vorliegender Pakete oder mit dh_make für einen Neubau des debian-Verzeichnisses erfordert ebenfalls nicht allzuviel Einarbeitungszeit. Der abschließende Aufruf von dpkg-buildpackage wird nach etwas Übung zur Routine – bei besonders begeisterungsfähigen Nutzern stellt sich beim Einspielen des ersten komplett selbst gebauten Pakets gar ein äußerst erhebendes Gefühl ein.

Glossar

Compiler

Übersetzerprogramm, das den in einer höheren Programmiersprache geschriebenen Quellcode in ablauffähige Maschinenbefehle umwandelt.

Kernel-Modul

Mit Hilfe von Modulen lässt sich der Kernel – das eigentliche Betriebssystem – mit zusätzlichen Funktionen ausstatten. Die meisten Linux-Distributionen verwenden einen möglichst kleinen Basiskernel, der sich mittels Modulen den Anforderungen der Hardware anpasst.

Maintainer

(von engl. “to maintain”, dt. “instand halten”) Person, die sich im Namen eines Projekts oder einer Distribution um ein Softwarepaket kümmert. Der Maintainer fertigt das Paket aus dem Originalquelltext an und pflegt Updates oder distributionsspezifische Anpassungen ein.

Patch

(dt. “Flicken”) Bezeichnung für eine Änderung an einem Programm, um es mit einem neuen Feature auszustatten oder Fehler zu beheben.

Infos

[1] Checkinstall: http://asic-linux.com.mx/~izto/checkinstall

[2] Paketbau mit Checkinstall: Peter Kreußel, “Gratiszugabe”, LinuxUser 07/2006, S. 47, http://www.linux-user.de/ausgabe/2006/07/047-checkinstall/

[3] CDBS: http://build-common.alioth.debian.org

[4] Debian-Pakete mittels CDBS: http://www.ngolde.de/cdbs.html

LinuxUser 02/2008 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
Inline Feedbacks
Alle Kommentare anzeigen
Nach oben