Debian Pakete erzeugen

Wenn Sie ein komplett neues Debian Paket erzeugen wollen, sei es weil zu den Sourcen noch kein Paket vorhanden ist oder weil Sie selber 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 Paketes besorgen und ein Unterverzeichnis für das neue Projekt erzeugen. Am Beispiel des Programmes dtcltiny, einem Client zur Steuerung von digitalen Modellbahnen, sollen die einzelnen Schritte vorgestellt werden. Die Sourcen diese Programmes 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 überigens nicht zwingend notwendig das 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 im PDF Format, zu einem Paket packen.

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


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, muß das Verzeichnis entsprechend umbenannt werden. Im nächsten Schritt ist in das Verzeichnis zu wechseln und das Programm dh_make aufzurufen.


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 Paketes 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. Abschliessend wird noch der Hinweis ausgegeben, dass sich im Unterverzeichnis debian/ einige Dateien befinden, auf die nochmal ein Blick geworfen werden sollte. Weiterhin wird darauf hingewiesen, dass in den Sourcen von dtcltiny ein configure Script 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 Verzeichnisbaumes angelegt. Dieser wurde um die Endung .orig ergänzt.

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

README.Debian

Die Datei README.Debian enthält Informationen zu den Besonderheiten des Debian Paketes. 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 wollen oder auch nur das Paket im Netz verfügbar machen, 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 Dokumentatiion oder den Scripten des Programmes notwendig waren, so kann diese Datei auch einfach gelöscht werden.

files

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


dclttiny_0.3.4-1_i386.deb misc optional


changelog

In dieser Datei werden Veränderungen zwischen den einzelnen Paketversionen (changes) dokumentiert. Sie sollten hier bei einer aktualisierten Version des Paketes die Veränderungen gegenüber der vorhergehenden Version dokumentieren. Sollte sich das Programm auf einem System plötzlich anders verhalten, so lassen sich meisten aus den Angaben in dieser Datei Rückschlüsse ziehen ob diese Veränderung beabsichtigt war.


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:

copyright

In dieser Datei finden sich Hinweise zum Copyright dieses Paketes. 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. Hier ein Beispiel für eine Software die der GPL unterliegt.

Hier 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 kB. 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äuchlisten Lizenzen abzulegen und in jedem Paket nur auf die entsprechende Stelle zu verweisen. Somit ist sichergestellt das 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.

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 Paketes. 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 wider...).


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 (eg. erddcd)
 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 einen
 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 Paketes, 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 Paketes. Mit dem Schlüsselwort Package: wird der Paketname des Binärpaketes beschrieben, die folgende Zeile Architecture: bezeichnet für welche Architekturen das Paket verwendet werden kann. Die kann beispielsweise i386, powerpc, alpha usw. sein, oder wie hier gezeigt das Schlüsselwort any für alle Architekturen.

rules

In dieser Datei werden die Regeln zur Erstellung des Paketes definiert. Sollte der von Ihnen verwendete Source Code kein Makefile enthalten oder auch kein configure verwenden, so müssen Sie in dieser Datei die notwendigen Schritte zum erfolgreichen Übersetzen des Paketes 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 ausschliesslich 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 das 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 Binary durch ein Script ersetzt wird. Weiterhin wird ein Konfigfile 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 -*-mandir=\$${prefix}/share/man -*-infodir=\$${prefix}/share/info
	./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

menu

Mit dem Debian Menüsystem können Anwendungen, unabhängig von der verwendeten Benutzeroberfläche, in die Menüs 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 hier verwendete Beispiel 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 welche Benutzeroberfläche das Programm benötigt und in welchen Menüzweig es erscheinen soll. Das Schlüsselwort title beschreibt den Text der im Menü angezeigt wird, command schliesslich enthält den kompletten Pfad und den Programmnamen.

postinst, preinst, postrm, prerm

Diese vier Dateien enthalten Informationen die vor (pre) oder nach (post) der Installation des Paketes ausgeführt werden sollen. Hier nur ein Beispiel:

Alle in der Datei postinst enthaltenen Kommandos werden nach (post) der Installation (inst) des Paketes 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 Script 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.

dpkg-buildpackage

Nachdem die Vorbereitungen an den Dateien im Verzeichnis debian/ abgeschlossen sind, kann mit dem Programm dpkg-buildpackage das Paket erstellt werden.

dpkg-buildpackage wird ohne weitere Parameter versuchen die Sourcen und die Changes Datei des Paketes digital zu signieren. Hierzu wird ein vorhandener GnuPG Key benutzt. Ist kein solcher Key erzeugt worden, so kann das signieren mit den Optionen -us (unsigned source) und -uc (unsigned changes) verhindert werden. Im einfachsten Fall genügt also das Kommando dpkg-buildpackage -us -uc (als „root“) um das Paket zu erzeugen.

dpkg-buildpackage verfügt natürlich noch über viele weitere Optionen


debian:~# dpkg-buildpackage --help
dpkg-buildpackage: unknown option or argument --help
Debian dpkg-buildpackage .  
Copyright (C) 1996 Ian Jackson.
Copyright (C) 2000 Wichert Akkerman
This is free software; see the GNU General Public Licence version 2
or later for copying conditions.  There is NO warranty.

Usage: dpkg-buildpackage [options]
Options: -r<gain-root-command>
         -p<sign-command>
	 -d            do not check build dependencies and conflicts
	 -D            check build dependencies and conflicts
	 -k<keyid>     the key to use for signing
         -sgpg         the sign-command is called like GPG
         -spgp         the sign-command is called like PGP 
         -us           unsigned source
         -uc           unsigned changes
         -a<arch>      Debian architecture we build for (implies -d)
         -b            binary-only, do not build source } also passed to
         -B            binary-only, no arch-indep files } dpkg-genchanges
         -S            source only, no binary files     } 
         -t<system>    set GNU system type  } passed to dpkg-architecture
         -v<version>   changes since version <version>      }
         -m<maint>     maintainer for package is <maint>    } 
         -e<maint>     maintainer for release is <maint>    } only passed
         -C<descfile>  changes are described in <descfile>  }  to dpkg-
         -si (default) src includes orig for rev. 0 or 1    } genchanges
         -sa           uploaded src always includes orig    }
         -sd           uploaded src is diff and .dsc only   }
         -nc           do not clean source tree (implies -b)
         -tc           clean source tree when finished
         -ap           add pause before starting signature process
         -h            print this message
         -W            Turn certain errors into warnings.      } passed to
         -E            When -W is turned on, -E turned it off. } dpkg-source
         -i[<regex>]   ignore diffs of files matching regex } only passed
                                                             to dpkg-source

dpkg-buildpackage benötigt eine Umgebung die der späteren Installationsumgebung ähnlich ist. Das Paket kann als Superuser (root) erzeugt werden um dies zu gewährleisten. Nun macht es wenig Sinn einen GnuPG-Key für den Superuser zu erzeugen. Um dieses Problem zu umgehen, dient die Option -r, direkt gefolgt von einem Kommando, welches es Benutzer erlaubt, Kommandos als Superuser auszuführen bzw. eine virtuelle root-Umgebung schafft. Dies kann beispielsweise das Kommando fakeroot oder sudo sein, ggf. ist natürlich die Konfiguration des Programmes (sudo) für diesen Benutzer anzupassen.

Viele der weiteren Optionen können und sollten in den Konfigurationsdateien im Verzeichnis debian/ definiert werden, bei Bedarf können diese aber auch auf der Kommandozeile angepasst werden.