= 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|http://linuxwiki.de/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|http://www.netfort.gr.jp/~dancer/software/pbuilder-doc/pbuilder-doc.html], 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:
* [http://wiki.debian.org/Java/Packaging] Debian Wiki
* [http://www.matthew.ath.cx/articles/javapackage] Artikel von Matthew Johnson

--PeterHormanns

[{Tag Java Debian}]