Wie habe ich ein Debian-Paket selber gemacht? #

Diese Anleitung ist etwas älter, aber wohl im Grundsatz immer noch gültig und hilfreich. Ich habe Sie jetzt erst hier hineingesetzt, weil wir beim LUG-Treffen über das Thema gesprochen hatten. -- ThomasBayen

Ich wollte ein von mir in Perl geschriebenes Projekt auf einen anderen Rechner übertragen. Da ich das bereits zum zweiten Mal machte und mir die Arbeit mit cp, chmod und chown in verschiedensten Verzeichnissen inzwischen ziemlich auf den Wecker ging, kam mir die Erleuchtung, dass schlaue Leute genau für sowas Paketmanager erfunden hatten...

RTFM #

Zu allererst habe ich mich schlau gemacht, d.h. ich habe den "Debian New Maintainers Guide" (auch als deutsche Version, sehr hilfreich) und das "Debian Policy Manual" gelesen; ausserdem die manpage von "debhelper" und einiger seiner "dh_*" Hilfsprogramme.

Leider bin ich aus keiner dieser Anleitungen so richtig schlau geworden, da mein Fall etwas anders liegt als andere. Erstens habe ich in dem Sinne keine Sourcen, weil mein Programm in Perl geschrieben ist und zweitens habe ich kein "Upstream"-Paket, weil ich bisher noch gar kein Paket von meinem Programm habe.

Die Kunst ist, ein paar Dateien in einem Unterverzeichnis meines Projektes debian/ anzulegen, die mein Projekt beschreiben. Wichtig ist dabei vor allem debian/control, das Paketinformationen enthält und debian/rules, das make-Regeln für die Erzeugung und Installation des Paketes enthält.

Nach einer Menge Lesen habe ich festgestellt, dass debhelper ein unverzichtbarer Freund bei der Erstellung von Debian-Paketen ist. Allerdings ist es dafür wohl notwendig, dass mein Programm ein Makefile bekommt. Das Makefile bietet nämlich die definierte Schnittstelle, über die debhelper mein Paket prüft und installiert. Wer gar nicht weiss, was das ist, sollte sich mal mit info make die Anleitung zu make ansehen.

Erstellen des Paketverzeichnisses #

Zuerst habe ich alle Sourcedateien in ein neues Verzeichnis gesteckt. Dieses heisst tbase-2.0.9. Das Format <Paketname>-<Version> ist wichtig.

Dann habe ich ein Makefile angelegt. dieses muss die Regeln build, clean, und install unterstützen. Man kann diese Regeln auch direkt in debian/rules einbauen, ich bevorzuge jedoch ein getrenntes Makefile, um es übersichtlicher zu haben und auch für eigene Regeln (z.B. Tests) benutzen zu können. Für die eigentliche Installation habe ich install benutzt, das obige Probleme mit cp, chmod, chown mit einem Strich erschlägt.

Dann habe ich in diesem Verzeichnis dh_make aufgerufen (ja, dh_make hat auch eine manpage...). Dieses Programm legt eine grundlegende Struktur an Dateien an, die das Paket beschreiben:

  export $DEBFULLNAME="Thomas Bayen"
  dh_make -c gpl -e tbayen@bayen.de -n -s 

Als nächstes kann man sich im debian-Verzeichnis umschauen. Wichtig ist zu Anfang nur, die Datei control zu editieren und dort die kurze Description sowie direkt darunter eine ausführliche Beschreibung des Paketes einzufügen. (Dort muss übrigens jede Zeile mit einer Leerstelle anfangen.) Dann kann man noch die Section angeben (in meinem Fall web) und für ein architekturunabhängiges Paket (wie Perl-Pakete nun mal so sind) bei Architekture angeben all. (Im Gegensatz zu any, das getrennte Pakete für verschiedene Plattformen erzeugen würde.)

Die Datei README.Debian kann gelöscht werden. Sie soll Unterschiede zwischen dem Upstream- und dem Debian-Paket beschreiben. Da ich kein Upstream-Paket habe, ist sie also nicht nötig.

Die Datei conffiles enthält die Konfigurationsdateien. Um das zu testen, trage ich hier mal meine Datendefinitionsdateien ein.

Die Datei dirs legt Verzeichnisse an. Da mein Makefile-install das selber macht, kann diese Datei gelöscht werden.

Die Datei rules ist die komplizierteste Datei. Im Prinzip habe ich hier allerdings nichts geändert, ausser den Inhalt der Regeln binary-arch und binary-indep zu vertauschen, da mein Paket komplett architektur-unabhängig ist. Wenn man ein ordentlich aufgesetztes Makefile hat, wird dieses benutzt. Evtl. kann man noch überlegen, ein paar der debhelper (dh_*) ein- oder auszukommentieren, aber am Anfang gings erstmal so.

Und jetzt los #

Mit diesem Kommmando erzeugt man die Pakete:

  dpkg-buildpackage -rfakeroot

Wahlweise kann man noch die Option -b anfügen, die dafür sorgt, dass nur ein Binärpaket erzeugt wird. Seltsamerweise werden bei mir ein Source-Archiv und ein Diff als Sourcepakete erzeugt, obwohl es ja gar kein Original-Source-Archiv gibt. Woran das liegt, habe ich bisher nicht herausgefunden...?!?

Das erzeugte Paket (im übergeordneten Verzeichnis) ist nun grundsätzlich brauchbar. Allerdings sollte man auf jeden Fall nochmal

  lintian -i <paketname>.deb

starten. Lintian überprüft viele Details des Paketes darauf, ob sie auch der Debian-Policy entsprechen. Da die Ausgae sehr ausführlich ist, brauche ich hier nicht weiter darauf einzugehen. Ich war auf jeden Fall erstaunt, was ich alles noch besser machen konnte. ;-)

Danke für Deinen Crash-Kurs. Ich habe während der Einarbeitung bereits beim Debian-Policy-Manual abgebrochen und greife kurzerhand auf checkinstall zum Paketebauen (.deb, .rpm und .tgz) zurück. Nach Deiner Anleitung habe ich nun eine Anlaufstelle, wenn ich beim Pakete bauen die Details anpassen will. --MarkusMonderkamp
Edit:
dpkg-buildpackage -us -uc
oder gleich pbuilder, baut nach /tmp/build, notieren --MarkusMonderkamp am 14.11.2008

Java Packaging #

Ich habe mir heute angesehen, wie man Java-Anwendungen für Debian packt:

  • Pakete installieren: javahelper und jarwrapper
  • Grober Fahrplan:
    • Verzeichnis meineapp-0.1 anlegen
    • Darin ein src-Verzeichnis mit den Java-Sourcen
    • Darin mit jh_makepkg ein Template für ein Debian-Paket anlegen
    • Dateien debian/* anpassen
    • dpkg-buildpackage aufrufen
Links: --PeterHormanns

Tags:  Java, Debian

Add new attachment

Only authorized users are allowed to upload new attachments.
« This page (revision-8) was last changed on 19-Feb-2012 17:08 by Peter Hormanns