Es gibt nun ein neues Unterverzeichniss `debian´ im Hauptverzeichniss des Quellcode-Pakets (`gentoo-0.9.12'), in dem bereits einige Dateien liegen. Wir werden diese ändern, um die Eigenschaften des Pakets anzupassen. Die wichtigsten Dateien sind `control', `changelog', `copyright' und 'rules', die für die Erstellung jedes Pakets benötigt werden.
Diese Datei enthält verschiedene Werte, die dpkg und dselect für die Paketverwaltung benötigen. Das ist die control-Datei, die dh_make für uns erstellt hat:
1 Source: gentoo 2 Section: unknown 3 Priority: optional 4 Maintainer: Josip Rodin <joy-mg@debian.org> 5 Standards-Version: 3.0.1 6 7 Package: gentoo 8 Architecture: any 9 Depends: ${shlibs:Depends} 10 Description: <insert up to 60 chars description> 11 <insert long description, indented with spaces>
(Zeilennummerierung habe ich für dieses Beispiel hinzugefügt.)
Zeilen 1-5 sind Kontrol-Informationen für das Quellcode-Paket. Zeile 1 ist die Bezeichnung des Quellcode-Pakets.
Zeile 2 bestimmt die Sektion der Distribution, in die das Paket gehört. Sie haben bestimmt schon gemerkt, dass Debian in Sektionen aufgeteilt ist: main (die Freie Software), non-free (nicht wirklich freie Software) und contrib (Freie Software, die von non-free-Sachen abhängt). Unterhalb dieser Sektionen existieren logische Untersektionen, die eine minimale Beschreibung des Pakets geben. D.h. die `admin'-Sektion enthält Programme für Administration, `base' die grundlegenden Pakete, `devel' die Pakete für die Programmierer, `doc' die Dokumentation, `libs' die Programmbibliotheken, `mail' die E-Mail-Reader und -Daemonen, `net' die Netzwerk-Anwendungen und Daemonen, `x11'-Sektion die X11-spezifischen Programme, usw.
Verändern wir Sektion also zu x11.
Die dritte Zeile beschreibt, wie wichtig es für den durschnittlichen Benutzer es wäre, das Paket zu installieren. Sektion und Priorität werden zur Zeit nur von dselect benutzt, um die Pakete zu sortieren, und können (und werden es wahrscheinlich auch) von den FTP-Maintainern überschrieben. Die Policy enthält weitere Vorschriften für die Wahl der Sektion und Priorität.
Da es sich um ein normalles Paket handelt, lassen wir es bei optional.
Zeile 4 ist der Name und die E-Mail-Adresse des Maintainers.
Zeile 5 enthält die Version des Debian-Policy-Standards, dem dieses Paket folgt. (Zwei Hauptversionen des installierten debian-policy-Pakets).
Wenn ein nicht-standardisierter Compiler oder ein anderes Tool für die Paketerstellung benötigt wird, sollten Sie hier noch eine Zeile mit `Build-Depends', in der benötigten Pakete auflistet werden. Mehr Informationen darüber finden Sie in dem Packaging Manual (Sektion 8.7) und in der Documentation des `build-essential'-Pakets.
Zeile 7 enthält die Bezeichnung des Binärpakets.
Zeile 8 beschreibt die CPU-Architektur für die das Binärpaket kompiliert wird.
Wir können das bei "any" belassen, weil es dann von
dpkg-gencontrol(1)
mit dem richtigen Inhalt ersetzt wird, der für
den Rechner gilt, auf dem das Paket gebaut wird (siehe die Erklärungen über die
Portierung in Developer's Reference). Wenn ihr Paket unabhängig von der
Architektur funktioniert (z.B. ein Shell- oder Perl-Skript, oder
Dokumentation), ändern Sie dies zu "all", und lesen Sie später unter
Die `rules'-Datei, Abschnitt 5.4 über die Benutzung der
`binary-indep'-"rule" statt `binary-arch'.
Zeile 9 zeigt eine der mächtigsten Eigenschaften des Paketsystems von Debian. Über spezielle Attribute kann das Verhalten des Paketmanagers in Bezug auf andere Pakete verändert werden. Neben Depends: (d.h. Abhänqiqkeit) gibt es noch weitere Attribute: Recommends: (Empfehlung), Suggests: (Vorschlag), Pre-Depends: (Voraussetzung), Conflicts: (Konflikt), Provides: (Enthält) und Replaces: (Ersetzt) .
Paketverwaltungsprogramme wie dpkg, dselect oder APT (und seine Frontends)
verhalten sich dabei ähnlich (Abweichungen weden weiter unten erklärt). (siehe
dpkg(8)
, dselect(8)
, apt(8)
,
console-apt(8)
, gnome-apt(8)
)
Und das bedeuten die einzelnen Felder:
Das Paket wird erst installiert, wenn die hier aufgelisteten Pakete ebenfalls installiert sind. Benutzen Sie dies, wenn ihr Programm ohne diese Pakete überhaupt nicht (oder nicht vernünftig) laufen kann. .
Dselect lässt das Paket nicht ohne weiteres installieren, wenn die hier aufgelisteten Pakete nicht ebenfalls installiert werden. Dpkg und APT erlauben es trotzdem. Benutzen Sie dieses Feld, wenn die Pakete nicht zwingend erforderlich sind, aber normalerweise mitinstalliert werden.
Wenn der Benutzer ihr Programm installiert, wird Dselect ihn auffordern, die hier aufgelisteten Pakete zu installeren. Dpkg und APT kümmern sich nicht weiter darum. Benutzen Sie dies für Pakete, die mit ihrem Programm gut zusammenarbeiten, aber eigentlich nicht benötigt werden.
Dies "wirkt" stärker als Depends:. Das Paket wird nicht installiert, bevor die hier aufgelisteten Pakete fertig installiert und richtig konfiguriert sind. Benutzen Sie dies sehr sparsam damit und erst, wenn auf debian-devel-Mailingliste darüber diskutiert wurde. Lies: verwende es überhaupt nicht. :-)
Das Paket wird nicht installiert, bevor alle aufgelisteten Pakete deinstalliert sind. Benutzen Sie dies, wenn ihr Programm überhaupt nicht (oder nicht vernünftig) laufen kann, solange eines dieser Pakete installiert ist.
Für einige Paketarten mit mehreren Alternativen wurden sog. "virtual names" eingeführt. Die vollständige Liste dieser virtuellen Pakete (A.d.Ü.:leider nicht immer aktuell) finden Sie in der Datei /usr/share/doc/debian-policy/virtual-package-names-list.text.gz . Benutzen Sie dies, wenn ihr Paket die Funktionalität eines existierenden virtuellen Pakets bietet.
Benutzen Sie dies, wenn ihr Paket die Dateien eines anderen Pakets überschreibt oder dieses Paket vollständig ersetzt (benutzt zusmmen mit Conflicts:). Die Dateien des gennanten Pakets werden gelöscht, bevor ihre Versionen installiert werden.
All diese Felder haben eine einheitliche Syntax. Dies ist eine Liste der Paketnamen, getrennt durch Kommas. Ein Paketname kann auch aus einer Liste der alternativen Paketnamen bestehen, die durch senkrechte Striche | ("pipe"-Zeichen) getrennt werden. Die Angabe des Pakets kann auch auf ganz bestimmte Paketversionen beschränkt werden. Diese Versionen werden in Klammern nach jedem einzelnen Paketnamen aufgeführt und werden durch spezielle Symbole festgelegt, gefolgt von einer Versionsnummer. Folgende Symbole sind erlaubt: <<, <=, =, >= und >> für niedriger, niedriger oder gleich, gleich, höher oder gleich und höher.
Das letzte Feature, das erwähnt werden sollte, ist die Variable
$(shlibs:Depends). Der Inhalt wird automatisch mit
dh_shlibdeps(1)
erzeugt und von dh_gencontrol(1)
eingesetzt. Die Variable enthält die Namen der Programmbibliothken, die ihr
Programm benutzt, z. B. libc6 oder xlib6g; somit brauchen Sie nicht jedesmal
die passenden Paketnamem angeben. Nachdem es nun gesagt wurde können wir die
Zeile 9 so stehen lassen.
Zeile 10 enthält die Liste der Paketvorschl.äge.Hier steht nur `file', weil gentoo für einige Funktionen dieses Programm/Paket braucht.
Zeile 11 enthält eine Kurzbeschreibung. Bei den meisten Leuten sind die Terminalzeilen 80 Zeichen breit, also sollte die Kurubeschreibung nicht länger als 60 Zeichen sein. Ich ändere es ins "A fully GUI configurable GTK+ file manager".
In die Zeile 12 kommt eine ausführliche Beschreibung des Pakets. Sie sollte aus einem kleinen Text bestehen, der mehr über das Paket verrät. Der erste Spalt der Zeilen sollte immer leer sein. Es dürfen keine leeren Zeilen vorkommen, Sie können aber welche simulieren, in dem Sie ein . (Punkt) in die Zeile einsetzen. Es darf nach der ausführlichen Beschreibung auch nicht mehr als eine Leerzeile vorkommen.
Und so sieht die angepasste control-Datei aus:
1 Source: gentoo 2 Section: x11 3 Priority: optional 4 Maintainer: Josip Rodin <joy-mg@debian.org> 5 Standards-Version: 3.0.1 6 7 Package: gentoo 8 Architecture: any 9 Depends: ${shlibs:Depends} 10 Suggests: file 11 Description: A fully GUI configurable GTK+ file manager 12 gentoo is a file manager for Linux written from scratch in pure C. It 13 uses the GTK+ toolkit for all of its interface needs. gentoo provides 14 100% GUI configurability; no need to edit config files by hand and re- 15 start the program. gentoo supports identifying the type of various 16 files (using extension, regular expressions, or the 'file' command), 17 and can display files of different types with different colors and icons. 18 . 19 gentoo borrows some of its look and feel from the classic Amiga file 20 manager "Directory OPUS" (written by Jonathan Potter).
(Zeilennummerierung habe ich für dieses Beispiel hinzugefügt.)
In dieser Datei stehen Informationen über die Herkunft des Pakets (bzw. der Quellen), über die Lizenz und das Urheberrecht (Copyright). Die Policy schreibt keine bestimmte Form vor, aber den benötigten Inhalt (siehe Abschnitt 6.5). Dh_make erstellt uns eine Standardvorlage, die etwa so aussieht:
1 This package was debianized by Josip Rodin <joy-mg@debian.org> on 2 Wed, 11 Nov 1998 21:02:14 +0100. 3 4 It was downloaded from <fill in ftp site> 5 6 Upstream Author(s): <put author(s) name and email here> 7 8 Copyright: 9 10 <Must follow here>
(Zeilennummerierung habe ich für dieses Beispiel hinzugefügt.)
Die wichtigsten Dinge, die Sie hier einzutragen haben, sind die Quelle, von der Sie das Paket bezogen haben, die geltenden Copyright-Vermerke und die Lizenz. Sie müssen die komplete Lizenz einfügen, sofern es sich nicht um eine der gängigen freien Softwarelizenzen handelt, z.B. die GNU GPL oder LGPL, die BSD- oder die Artistic-Lizenz; in diesem Fall reicht ein Verweiss auf die entsprechende Datei im Verzeichniss /usr/share/common-licenses/, das auf jedem Debian-System existieren sollte. Gentoo unterliegt der "GNU General Public License", also bearbeiten wir die Datei und machen Folgendes daraus:
1 This package was debianized by Josip Rodin <joy-mg@debian.org> on 2 Wed, 11 Nov 1998 21:02:14 +0100. 3 4 It was downloaded from: ftp://ftp.obsession.se/gentoo/ 5 6 Upstream author: Emil Brink <emil@obsession.se> 7 8 This software is copyright (c) 1998-99 by Emil Brink, Obsession 9 Development. 10 11 You are free to distribute this software under the terms of 12 the GNU General Public License. 13 On Debian systems, the complete text of the GNU General Public 14 License can be found in /usr/share/common-licenses/GPL file.
(Zeilennummerierung habe ich für dieses Beispiel hinzugefügt.)
Dies ist eine zwingend vorgeschriebene Datei, deren Format in Packaging Manual (Sektion 3.2.3) beschrieben wird. Dieses Format benötigen dpkg und andere Programme um Dinge wie Versionsnummer, Revision, Distribution und die Wichtigkeit ihres Pakets zu bestimmen.
Für sie ist es ebenfalls wichtig, weil man hier die gemachten Änderungen dokumentieren kann. Damit können Leute, die ihr Paket herunterladen, einfacher herausfinden, ob es noch ungelöste Probleme mit dem Paket gibt, über die Sie wissen sollten. Diese Datei wird im Biärpaket als `/usr/share/doc/gentoo/changelog.Debian.gz' gespeichert.
Dh_make erstellt uns eine Standardvorlage, die etwa so aussieht:
1 gentoo (0.9.12-1) unstable; urgency=low 2 3 * Initial Release. 4 5 -- Josip Rodin <joy-mg@debian.org> Wed, 11 Nov 1998 21:02:14 +0100 6 7 Local variables: 8 mode: debian-changelog 9 End:
(Zeilennummerierung habe ich für dieses Beispiel hinzugefügt.)
In der Zeile 1 stehen der Paketname, die Version, die Distribution und die Wichtigkeit. Der Name muss mit dem Namen des Quellpaketsübereinstimmen, Distribution sollte vorerst `unstable' oder `experimental' sein und die Wichtigkeit nicht höher als `low'. :-)
Zeilen 3-5 sind Logeinträge, in den Sie die in dieser Revision gemachten
Änderungen dokumentieren können. Hierher kommt nichts über die Änderungen des
Upstream-Maintainers, für diese Zwecke gibt es eine separate Datei, die als
/usr/share/doc/gentoo/changelog.gz) gespeichert wird. Neue Zeilen werden
direkt über die oberste Zeile, die mit einem Stern (`*') beginnt, eingefügt.
Sie können das mit dch(1)
, emacs(1)
oder einem
anderen Texteditor erledigen (die letzten Zeilen enthalten Informationen für
den Editor Emacs). Schliesslich kommen Sie zu einer Datei wie diese hier:
1 gentoo (0.9.12-1) unstable; urgency=low 2 3 * Initial Release. 4 * This is my first Debian package. 5 * Adjusted the Makefile to fix $DESTDIR problems. 6 7 -- Josip Rodin <joy-mg@debian.org> Wed, 11 Nov 1998 21:02:14 +0100 8 9 Local variables: 10 mode: debian-changelog 11 End:
(Zeilennummerierung habe ich für dieses Beispiel hinzugefügt.)
Wenn Sie eine neue Revision herausbringen, müssen Sie die Versionsnummer erhöhen. Das kann man `dch -i` machen (oder explizit with `dch -v <version>-<revision>`) und dann die Kommentare mit ihrem Lieblingsedior einfügen. Tip: wie bekommt man das Datum im passenden Format? Verwenden Sie `822-date`, oder `date -R` (A.d.Ü.: für eingedeutschte Umgebung: "LC_ALL=C date -R").
Neuere Versionsinformation wird immer oben eingefügt.. Und so siht die changelog-Datei später aus:
1 gentoo (0.9.12-2) unstable; urgency=low 2 3 * Fixed a glitch in the menu file. 4 5 -- Josip Rodin <joy-mg@debian.org> Wed, 11 Nov 1998 22:15:39 +0100 6 7 gentoo (0.9.12-1) unstable; urgency=low 8 9 * Initial Release. 10 * This is my first Debian package. 11 * Adjusted the Makefile to fix $DESTDIR problems. 12 13 -- Josip Rodin <joy-mg@debian.org> Wed, 11 Nov 1998 21:02:14 +0100 14 15 Local variables: 16 mode: debian-changelog 17 End:
(Zeilennummerierung habe ich für dieses Beispiel hinzugefügt.)
Mehr über die neuen Versionen/Revisionen können Sie später in Weiterentwicklung des Pakets, Abschnitt 7.4 lesen.
Nun müssen wir einen Blick auf die eigentlichen Befehlssequenzen, sog. Rules,
werfen, mit den dpkg-buildpackage(1)
das Paket schliesslich
erstellt. Die "rules"-Datei ist im Prinzip ein weiteres Makefile,
das mit `make -f` ausgeführt wird, und nur etwas anders als Upstreams Makefile
aufgebaut ist.
Wie jedes andere Makefile besteht eine `rules'-Datei aus mehreren Rules, die bestimmen, wie mit dem Quellcode verfahren wird. Jede Rule besteht wiederrum aus weiteren Targets, Dateinamen oder Namen der Aktionen, die durchgeführt werden (z.B.. `build:' oder `install:'). Rules, die Sie ausführen möchten, werden beim Aufruf als Programmparameter angegeben (z.B., `./debian/rules build` oder `make -f rules install`). Nach dem Targetnamen (A.d.Ü.: d.h. nach der Bezeichnung unserer Rule) können Sie Programme oder Dateinamen angeben, von der die Ausführung der Rule abhängt. Danach folgt eine beliebige Anzahl von Kommandos (WICHTIG: eingerückt mit <tab>!), bis eine leere Zeile vorkommt. Danach beginnt eine neue Rule bzw. ein neues Target. Mehrere Leerzeilen und mit einem `#' (hash) beginnende Zeilen werden als Kommentare betrachtet und ignoriert.
Sie sind vielleicht etwas verwirrt, aber es wird alles verständlich nach der genaueren Betrachtung der `rules'-Datei, die uns dh_make erstellt hat. Sie sollten evtl. die Info-Seiten von `make' lesen, um mehr über die Funktionsweise zu erfahren.
Wichtig zu wissen ist noch, dass dh_make nur einen Muster der "rules"-Date erzeugt, also einen Vorschlag, wie sie ungefähr auszusehen hat. Diese Datei wird für simple Packete wahrscheinlich funktionieren, aber bei komplizierteren dürfen Sie die Datei nach Bedarf anpassen und erweitern. Sie dürfen nur die Namen der Rules nicht ändern, weil diese im "Packaging Manual" vorgeschrieben sind und von allen Programmen (für die Paketerstellung) so erwartet werden.
1 #!/usr/bin/make -f 2 # Made with the aid of dh_make, by Craig Small 3 # Sample debian/rules that uses debhelper. GNU copyright 1997 by Joey Hess. 4 # Some lines taken from debmake, by Christoph Lameter. 5 6 # Uncomment this to turn on verbose mode. 7 #export DH_VERBOSE=1 8 9 # This is the debhelper compatability version to use. 10 export DH_COMPAT=1 11 12 build: build-stamp 13 build-stamp: 14 dh_testdir 15 16 # Add here commands to compile the package. 17 $(MAKE) 18 19 touch build-stamp 20 21 clean: 22 dh_testdir 23 dh_testroot 24 rm -f build-stamp 25 26 # Add here commands to clean up after the build process. 27 -$(MAKE) clean 28 29 dh_clean 30 31 install: build-stamp 32 dh_testdir 33 dh_testroot 34 dh_clean -k 35 dh_installdirs 36 37 # Add here commands to install the package into debian/tmp. 38 $(MAKE) install DESTDIR=`pwd`/debian/tmp 39 40 # Build architecture-independent files here. 41 binary-indep: build install 42 # We have nothing to do by default. 43 44 # Build architecture-dependent files here. 45 binary-arch: build install 46 # dh_testversion 47 dh_testdir 48 dh_testroot 49 # dh_installdebconf 50 dh_installdocs 51 dh_installexamples 52 dh_installmenu 53 # dh_installemacsen 54 # dh_installpam 55 # dh_installinit 56 dh_installcron 57 dh_installmanpages 58 dh_installinfo 59 # dh_undocumented 60 dh_installchangelogs 61 dh_link 62 dh_strip 63 dh_compress 64 dh_fixperms 65 # You may want to make some executables suid here. 66 dh_suidregister 67 # dh_makeshlibs 68 dh_installdeb 69 # dh_perl 70 dh_shlibdeps 71 dh_gencontrol 72 dh_md5sums 73 dh_builddeb 74 75 binary: binary-indep binary-arch 76 .PHONY: build clean binary-indep binary-arch binary install
(Zeilennummerierung habe ich für dieses Beispiel hinzugefügt.)
Die Funktion der ersten Zeile kennen Sie vielleicht von den Perl- oder Shell-Skripts. Sie teilt dem Betriebssystem mit, dass das Skript mit /usr/bin/make interpretiert wird.
Zeilen 12 bis 19 enthalten die `build'-Rule (und die untergeordnete `build-stamp'-Rule), die mit dem Makefile der Anwendung das Programm kompiliert.
Die `clean'-Rule in 21-29, entsorgt alle unnötigen binäre und automatisch generierte Dateien, die nach der Paketerstellung zurückbleiben. Diese Rule muss jederzeit funktionsfähig sein, aucj wenn im Quellcode-Verzeichniss bereits aufgeräumt wurde, also sollren Sie evtl. die "zwang"-Optionen benutzen (z.B. "-f" bei rm), oder die Rückgabewerte ignorieren (mit einem `-' am Anfang des Befehls).
Der Installationsprozess, die `install'-Rule, beginnt in der Zeile 31. Es wird einfach die `install'-Rule des programmeigenen Makefiles ausgeführt, aber in das Verzeichniss `pwd`/debian/tmp installiert - aus diesem Grund haben wir in Gentoos Makefile auch die "$(DESTDIR)"-Variable (als Root-Verzeichniss der Installation) eingebaut.
Die Rule `binary-indep' in der Zeile 41, ist, wie das Komentar bereits sagt, für die Erstellung von architekturunabhängigen Paketen vorgesehen. Das ist beim unseren Paket nicht der Fall, also wird hier auch nichts gemacht. Wäre ihr Paket vom Typ `Architecture: all', müssten Sie alle Befehle für den "build" in diese Rule packen und stattdessen die nächste Rule (`binary-arch') leer lassen.
Auf zur nächsten Rule - `binary-arch' in den Zeilen 45 bis 73, in der wir verschiedene kleine Utilities aus dem Debhelper-Paket starten, die an unseren Dateien verschiedene Operation durchführen, um das Paket Policy-konform zu machen.
Die Namen beginnen mit dh_ und der Rest erklärt bereits die Aufgabe des Tools. Alles ist praktisch selbsterklärend, hier noch einige zusätzlichen Erkärungen:
dh_testdir(1)
überprüft, ob Sie im richtigen Verzeichniss sind
(d.h. im obersten Verzeichniss des Quellcode-Verzeichnissbaums).
dh_testroot(1)
überprüft, ob Sie root-Rechte besitzen, die für die
binary*-Targets benötigt werden.
dh_installmanpages(1)
kopiert alle Manpages, die es in
Quellcode-Verzeichnissen finden kann (aufgepasst, das ist DWIM).
dh_strip(1)
"stript" (A.d.Ü.: siehe 'man strip') die
Debugging-Header aus Libs und ausführbaren Dateien, um die Dateigrösse zu
reduzieren.
dh_compress(1)
komprimiert (mit gzip) Manpages und Doku-Dateien,
die grösser als 4 kB sind.
dh_installdeb(1)
kopiert sonstige, fürs Paket benötigte Dateien
(z.B. die Maintainer-Skripte) ins Verzeichniss debian/tmp/DEBIAN.
dh_shlibdeps(1)
berechnet Abhängigkeiten von Libs und anderen
Binäries.
dh_gencontrol(1)
erweitert und installiert die control-Datei.
dh_md5sums(1)
generiert MD5-Prüfsummen für alle Dateien im Paket.
Die vollständigeren Infos über die Aufgaben und Bedienung all dieser dh_*-Skripte finden Sie in den jeweiligen Manpages. Es gibt noch weitere, möglicherweise sehr nützliche dh_*-Skripte, die hier nicht weiter erwähnt werden. Wenn Sie sie mal brauchen, lesen Sie die Debhelper-Dokumentation.
Die Sektion "binary-arch" ist so eine, in der Sie wirklich alle Zeilen, in den nicht benötigte Features installert werden, auskomentieren sollten. Bei Gentoo komentiere ich Zeilen mit folgenden Befehlen aus, und zwar weil Gentoo diese einfach nicht braucht: testversion, emacsen, pam, init, cron, manpages, info, undocumented, suidregister, makeshlibs und perl. In der Zeile 60 werde ich ebenfalls `FIXES' hinzufügen, weil das der Name der Changelog-Datei des Upstreams ist.
Die letzten zwei Zeilen sind (genau wie andere, nicht weiter erklärte Zeien) einfach nur irgendwelche, mehr oder weniger benötigen Dinge, über die Sie mehr im Make- oder Packaging-Manual nachlesen können. Im Moment brauchen wir darüber nichts zu wissen.
Anleitung für zukünftige Debian-Maintainer
Version 1.0.2, 10. Juni 2001.joy-mg@debian.org
edi@ka.linux.de