Kapitel 6. Debian-Pakete im Detail
Zurück | 6.4 Debian-Pakete - Aufbau der Sourcen | Weiter

## 6.4 Debian-Pakete - Aufbau der Sourcen

Wenn Sie ein komplett neues Debian-Paket erzeugen wollen, sei es, weil zu den Sourcen noch kein Paket vorhanden ist, oder sei es, weil Sie selbst eine Software entwickelt haben, die Sie als Debian-Paket zur Verfügung stellen wollen, so stehen Ihnen auch dafür unter Debian einige Hilfsmittel zur Verfügung.

Zunächst sollten Sie sich die Sourcen des gewünschten Pakets besorgen und ein Unterverzeichnis für das neue Projekt erzeugen. Am Beispiel des Programms `dtcltiny`, einem Client zur Steuerung von digitalen Modellbahnen, sollen die einzelnen Schritte vorgestellt werden. Die Sourcen dieses Programms finden Sie unter http://www.markus-pfeiffer.de. Natürlich können Sie auch ein beliebiges anderes Programm benutzen, von dem Sie ein Debian-Paket erzeugen möchten. Sie müssen dann aber ggf. an einigen Stellen etwas Kreativität einsetzen, da die hier gezeigten Beispiele sich nicht 1:1 übertragen lassen. Es ist auch nicht zwingend notwendig, dass die Sourcen zu einem Programm verfügbar sind. Natürlich können Sie auch Debian-Pakete von Programmen im Binärformat erstellen oder auch Dokumentation, beispielsweise als PDF, zu einem Paket packen.

Wechseln Sie nun in das Unterverzeichnis, und entpacken Sie die Sourcen des Programms:

    fr@debian:~/Daten/debian-pakete$ mkdir dtcltiny
    fr@debian:~/Daten/debian-pakete$ cd dtcltiny
    fr@debian:~/Daten/debian-pakete/dtcltiny$ tar xvfz ../../../dtcltiny-0.3.4.tgz
    dtcltiny-0.3.4/
    dtcltiny-0.3.4/Makefile.am
    dtcltiny-0.3.4/acinclude.m4
    dtcltiny-0.3.4/Makefile.dist

    ...

    dtcltiny-0.3.4/dtcltiny/InfoPort.moc.o
    dtcltiny-0.3.4/dtcltiny/.libs/
    dtcltiny-0.3.4/configure
    dtcltiny-0.3.4/stamp-h

Wichtig ist hierbei, dass das entstehende Unterverzeichnis schon aus dem Programmnamen und der Versionsnummer besteht. Sollte dies nicht so sein, muss das Verzeichnis entsprechend umbenannt werden. Im nächsten Schritt wechseln Sie in das Verzeichnis und rufen das Programm `dh_make` auf:

    fr@debian:~/Daten/debian-pakete/dtcltiny$ cd dtcltiny-0.3.4/
    fr@debian:~/Daten/debian-pakete/dtcltiny/dtcltiny-0.3.4$ dh_make

    Type of package: single binary, multiple binary, or library? [s/m/l] s

    Maintainer name : Frank Ronneburg
    Email-Address   : fr@unknown
    Date            : Tue, 13 Nov 2001 21:56:17 +0100
    Package Name    : dtcltiny
    Version         : 0.3.4
    Type of Package : Single
    Hit <enter> to confirm:
    Done. Please edit the files in the debian/ subdirectory now. dtcltiny
    uses a configure script, so you probably don't have to edit the Makefiles.

`dh_make` erzeugt ein Unterverzeichnis `debian/`, in dem sich Vorlagen für alle notwendigen Dateien zur Erzeugung eines Debian-Pakets befinden. `dh_make` bietet die Möglichkeit, verschiedene Pakettypen zu erzeugen; für ein einfaches Paket wie in diesem Beispiel ist „single binary“ die richtige Wahl. Abschließend wird noch der Hinweis ausgegeben, dass sich im Unterverzeichnis `debian/` einige Dateien befinden, auf die Sie noch einen Blick werfen sollten. Weiterhin wird darauf hingewiesen, dass in den Sourcen von `dtcltiny` ein `configure`-Skript enthalten ist und somit Änderungen am `Makefile` wahrscheinlich unnötig sind. Neben dem Verzeichnis `debian/` wurde im darüber liegenden Verzeichnis noch eine Kopie des gesamten Verzeichnisbaums angelegt. Dieser wurde um die Endung `.orig` ergänzt.

Bei genauer Betrachtung des Beispiels ist vielleicht aufgefallen, dass die E-Mail-Adresse nicht korrekt erkannt wurde; ein nettes Beispiel also, so kommen wir nicht um einen Blick ins Verzeichnis `debian/` herum `;-)`.

### 6.4.1 `README.Debian`

Die Datei `README.Debian` enthält Informationen zu den Besonderheiten dieses Debian-Pakets. Wenn Veränderungen oder Ergänzungen gegenüber dem Source-Paket vorgenommen werden, so sollten diese hier vermerkt werden. Achten Sie darauf, in der letzten Zeile die E-Mail-Adresse anzupassen. Eine bereits veränderte Version könnte wie folgt aussehen:

    dtcltiny for Debian
    *******************

    Ergänzungen:

    - dtcltiny in dtcltiny.bin umbenannt.
    - dtcltiny ist ein wrapper, wenn vorhanden, wird eine Konfigdatei
      .dtcltiny.data aus dem Homeverzeichnis des Benutzers geladen.
    - In /usr/share/doc/dtcltiny/ findet sich eine
      Beispielkonfigurationsdatei (SAMPLE.dtcltiny.data)

     -- Frank Ronneburg <fr@openoffice.de>, Tue,  6 Nov 2001 22:29:53 +0100

Wenn Sie ein offizielles Debian-Paket erstellen oder auch nur das Paket im Netz verfügbar machen wollen, so sollte die komplette Dokumentation, also auch Kommentare, in englischer Sprache erstellt werden. Bei Paketen für den privaten Gebrauch bleibt Ihnen die Wahl der Sprache natürlich überlassen.

Wenn keine weiteren Veränderungen an den Sourcen, der Dokumentation oder den Skripten des Programms notwendig waren, so kann diese Datei auch einfach gelöscht werden.

### 6.4.2 `files`

Diese Datei enthält lediglich den Paketnamen, den Bereich sowie die Priorität des Pakets.

    dclttiny_0.3.4-1_i386.deb misc optional

### 6.4.3 `changelog`

In dieser Datei werden Veränderungen zwischen den einzelnen Paketversionen (changes) dokumentiert. Sie sollten hier bei einer aktualisierten Version des Pakets die Veränderungen gegenüber der vorhergehenden Version dokumentieren.

    dtcltiny (0.3.4-1) unstable; urgency=low

      * Initial Release.

     -- Frank Ronneburg <fr@openoffice.de>  Tue,  6 Nov 2001 22:29:53 +0100

    Local variables:
    mode: debian-changelog
    End:

### 6.4.4 `copyright`

In dieser Datei finden Sie Hinweise zum Copyright dieses Pakets. Es können die gesamten Copyright-Informationen hier aufgeführt werden. Bei Paketen, die einer weit verbreiteten Lizenz unterliegen, reicht auch ein kurzer Hinweis, wo die Lizenz zu finden ist.

Zu diesem Punkt gibt es immer wieder Diskussionen unter den Debian-Entwicklern. Insbesondere bei Paketen, die der GPL unterliegen, gehen die Meinungen auseinander. Grundsätzlich sollte, um Missverständnisse zu vermeiden, zu jedem Paket die Lizenz mitgeliefert werden. Die GPL hat in der aktuellen Version 2 eine Größe von ca. 18 Kbyte. Das ist nicht sehr viel; wenn man die aber mit einigen tausend Paketen multipliziert, so kommt doch eine beachtliche Menge an Speicherplatz zusammen. Es wurde vereinbart, im Verzeichnis `/usr/share/common-licenses/` jeweils eine Version der gebräuchlichsten Lizenzen abzulegen und in jedem Paket nur auf die entsprechende Stelle zu verweisen. Somit ist sichergestellt, dass die Lizenz auf jedem Debian-System installiert ist.

Das folgende Beispiel zeigt eine solche Datei mit einem Hinweis auf die GPL:

    This package was debianized by Frank Ronneburg <fr@openoffice.de> on
    Tue,  6 Nov 2001 22:29:53 +0100.

    It was downloaded from http://www.markus-pfeiffer.de/

    Upstream Author(s): Markus Pfeiffer <dtcltiny@markus-pfeiffer.de>

    This code is released under the terms of the GPL license.

    See /usr/share/common-licenses/GPL for the full license.

### 6.4.5 `control`

Die Datei `control` enthält verschiedenste Angaben zu dem Paket. Wichtig ist hier die Zeile `Section:`, dies ist der Bereich, in dem das Paket in der Debian-Paketstruktur erscheint. Die Zeile `Description:` enthält in einer Zeile eine kurze Beschreibung des Pakets. Alle weiteren Zeilen müssen mit einem Leerzeichen beginnen und beschreiben das Paket ausführlich. Auch diese Texte sollten in englischer Sprache verfasst werden (das hier gezeigte Beispiel spiegelt lediglich den Zeitmangel des Autors wieder.).

    Source: dtcltiny
    Section: x11
    Priority: optional
    Maintainer: Frank Ronneburg <fr@openoffice.de>
    Build-Depends: debhelper (>> 3.0.0)
    Standards-Version: 3.5.2

    Package: dtcltiny
    Architecture: any
    Depends: ${shlibs:Depends}
    Description: Control Locomotives on a Model Railroad, needs SRCP Server
     dtcltiny ist ein Programm, mit dem man Loks auf einer Modellbahn
     steuern kann, die mit einem Digitaldecoder ausgerüstet sind. Es stellt
     für jede Lok eine Regler zur Verfügung, mit dem man die Geschwindigkeit,
     Fahrtrichtung und Sonderfunktionen einstellen kann. Nebenbei bietet es
     noch die Möglichkeit, Decoder nach dem NMRA-DCC-Standard und
     Uhlenbrock-Decoder zu programmieren.

Die meisten der verwendeten Schlüsselwörter sollten selbsterklärend sein. `Source:` beschreibt den Namen (der Sourcen) des Pakets; mit `Priority:` kann bestimmt werden, ob auf das Paket verzichtet werden kann ( `optional`) oder ob das Paket zwingend notwendig für das System ist. Die Zeile `Maintainer` enthält den Namen und die E-Mail-Adresse des Paketbetreuers; diese Angaben sind in der gezeigten Schreibweise anzugeben. `Build-Depends:` beschreibt die Abhängigkeiten des Pakets. Mit dem Schlüsselwort `Package:` wird der Paketname des Binärpakets beschrieben; die folgende Zeile `Architecture:` gibt an, für welche Architekturen das Paket verwendet werden kann. Dies kann beispielsweise `i386`, `powerpc`, `alpha` usw. sein, oder wie hier gezeigt, das Schlüsselwort `any` für alle Architekturen.

### 6.4.6 `rules`

In dieser Datei werden die Regeln zum Erstellen des Pakets definiert. Sollte der von Ihnen verwendete Sourcecode kein Makefile enthalten oder auch kein configure-Script verwenden, so müssen Sie in dieser Datei die notwendigen Schritte zum erfolgreichen Übersetzen des Pakets beschreiben. Im hier gezeigten Beispiel wurde `make` (`$(MAKE)`) mit der Option `-j 6` ergänzt, um die Übersetzung etwas zu beschleunigen.

Eventuell kann es, beispielsweise bei Paketen, die ausschließlich Dokumentation enthalten, notwendig sein, alle Zeilen, die `make` aufrufen, auszukommentieren. Sie müssen dann durch geeignete Einträge in der Datei selbst dafür sorgen, dass die Dateien an die richtige Stelle im Dateisystem kopiert werden. Die hier gezeigte Version wurde bereits an einigen Stellen angepasst.

Im Abschnitt `install: build` sind einige Regeln definiert worden, mit denen das ausführbare Programm durch ein Skript ersetzt wird. Weiterhin wird eine Konfigurationsdatei als Beispiel im Dokumentationsverzeichnis abgelegt.

    #!/usr/bin/make -f
    # Sample debian/rules that uses debhelper.
    # GNU copyright 1997 to 1999 by Joey Hess.

    # Uncomment this to turn on verbose mode.
    #export DH_VERBOSE=1

    # This is the debhelper compatability version to use.
    export DH_COMPAT=3

    configure: configure-stamp
    configure-stamp:
    	dh_testdir
    	# Add here commands to configure the package.
    	./configure --prefix=/usr --program-suffix=.bin

    	touch configure-stamp

    build: configure-stamp build-stamp
    build-stamp:
    	dh_testdir

    	# Add here commands to compile the package.
    	$(MAKE) -j 6
    	#/usr/bin/docbook-to-man debian/dtcltiny.sgml > dtcltiny.1

    	touch build-stamp

    clean:
    	dh_testdir
    	dh_testroot
    	rm -f build-stamp configure-stamp

    	# Add here commands to clean up after the build process.
    	-$(MAKE) clean

    	dh_clean

    install: build
    	dh_testdir
    	dh_testroot
    	dh_clean -k
    	dh_installdirs

    	# Add here commands to install the package into debian/dtcltiny.
    	mkdir -p $(CURDIR)/debian/dtcltiny/usr
    	$(MAKE) install prefix=$(CURDIR)/debian/dtcltiny/usr

    	cp $(CURDIR)/debian/dtcltiny.sh $(CURDIR)/debian/dtcltiny/usr/bin/dtcltiny
    	chmod a+x $(CURDIR)/debian/dtcltiny/usr/bin/dtcltiny

    	# Demo Konfigfile
    	mkdir -p $(CURDIR)/debian/dtcltiny/usr/share/doc/dtcltiny/
    	cp /home/fr/.dtcltiny.data \
             $(CURDIR)/debian/dtcltiny/usr/share/doc/dtcltiny/SAMPLE.dtcltiny.data

    # Build architecture-independent files here.
    binary-indep: build install
    # We have nothing to do by default.

    # Build architecture-dependent files here.
    binary-arch: build install
    	dh_testdir
    	dh_testroot
    #	dh_installdebconf
    	dh_installdocs
    	dh_installexamples
    	dh_installmenu
    #	dh_installlogrotate
    #	dh_installemacsen
    #	dh_installpam
    #	dh_installmime
    #	dh_installinit
    	dh_installcron
    	dh_installman
    	dh_installinfo
    #	dh_undocumented
    	dh_installchangelogs ChangeLog
    	dh_link
    	dh_strip
    	dh_compress
    	dh_fixperms
    #	dh_makeshlibs
    	dh_installdeb
    #	dh_perl
    	dh_shlibdeps
    	dh_gencontrol
    	dh_md5sums
    	dh_builddeb

    binary: binary-indep binary-arch
    .PHONY: build clean binary-indep binary-arch binary install configure

### 6.4.7 `menu`

Mit dem Debian-Menüsystem können Programme, unabhängig von der verwendeten Benutzeroberfläche, in die Menüs der Benutzeroberfläche eingebunden werden. Bei der Verwendung eines Icons ist darauf zu achten, dass dieses auch tatsächlich vorhanden ist. Gegebenenfalls muss das Icon mit dem Paket zusammen installiert werden. Das Beispiel-Paket `dtcltiny` verwendet ein Icon aus dem Gnome-Paket.

    ?package(dtcltiny):needs=X11 section=Apps/Tools \
      icon="/usr/share/pixmaps/gnome-diskfree.png"\
      title="dtcltiny" command="/usr/bin/dtcltiny"

Neben dem Paketnamen finden sich in dieser Datei weitere Angaben dazu, welche Benutzeroberfläche das Programm benötigt und in welchem Menüzweig es erscheinen soll. Das Schlüsselwort `title` beschreibt den Text, der im Menü angezeigt wird; `command` schließlich enthält den kompletten Pfad und den Programmnamen.

### 6.4.8 `postinst`, `preinst`, `postrm` und `prerm`

Diese vier Dateien enthalten Informationen, die vor (pre) bzw. nach (post) dem Installieren bzw. den Entfernen des Pakets ausgeführt werden sollen. Hier nur ein Beispiel:

Alle in der Datei `postinst` enthaltenen Kommandos werden nach (post) der Installation (inst) des Pakets ausgeführt. Durch `dh_make` wurde im Verzeichnis `debian/` eine Vorlage erzeugt (`postinst.ex`), die umbenannt und mit Inhalten gefüllt werden kann.

    #! /bin/sh
    # postinst script for erddcd
    #
    # see: dh_installdeb(1)

    set -e

    # summary of how this script can be called:
    #        * <postinst> `configure' <most-recently-configured-version>
    #        * <old-postinst> `abort-upgrade' <new version>
    #        * <conflictor's-postinst> `abort-remove' `in-favour' <package>
    #          <new-version>
    #        * <deconfigured's-postinst> `abort-deconfigure' `in-favour'
    #          <failed-install-package> <version> `removing'
    #          <conflicting-package> <version>
    # for details, see /usr/share/doc/packaging-manual/
    #
    # quoting from the policy:
    #     Any necessary prompting should almost always be confined to the
    #     post-installation script, and should be protected with a conditional
    #     so that unnecessary prompting doesn't happen if a package's
    #     installation fails and the `postinst' is called with `abort-upgrade',
    #     `abort-remove' or `abort-deconfigure'.

    case "$1" in
        configure)

        ;;

        abort-upgrade|abort-remove|abort-deconfigure)

        ;;

        *)
            echo "postinst called with unknown argument \`$1'" >&2
            exit 0
        ;;
    esac

    # dh_installdeb will replace this with shell code automatically
    # generated by other debhelper scripts.

    #DEBHELPER#

    exit 0

Das Skript kann während der Installation mit verschiedenen Parametern aufgerufen werden. Entsprechende Abschnitte in der Vorlage können mit den gewünschten Kommandos gefüllt werden.

Wenn alle Anpassungen an den Dateien im Verzeichnis `debian/` vorgenommen wurden, so kann versucht werden, mit dem Kommando `dpkg-buildpackage` ein Debian-Paket zu erzeugen. Hierbei ist zu beachten, dass das Kommando im Verzeichnis mit den entpackten Quelldateien ausgeführt wird.

Zurück | Nach oben | Weiter
6.3 Debian-Pakete anpassen | Zum Anfang | 6.5 Erstellen, prüfen und verwalten von Debian-Paketen

© 1999-2006 Frank Ronneburg - Dieser Inhalt ist unter einem Creative Commons Namensnennung - Nicht-kommerziell - Keine Bearbeitung Lizenzvertrag lizenziert (creativecommons.org/licenses/by-nc-nd/2.0/de/legalcode).