[ zurück ] [ Inhalt ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ] [ weiter ]
Bitte beachten Sie, dass an dieser Stelle nicht auf alle Details eingegangen wird, wie die ursprünglichen Quellen korrigiert werden können, aber hier sind ein paar grundlegende Schritte und Probleme, auf die man häufig stößt.
quilt
Das Programm quilt
bietet die Basismethode, um Änderungen an den
ursprünglichen Quellen für das Debian-Paket aufzuzeichnen. Da leicht
geänderte Voreinstellungen sinnvoller sind, ändern wir die Datei
~/.quiltrc
wie folgt. [10]
d=. ; while [ ! -d "$d/debian" -a `readlink -e $d` != / ]; do d="$d/.."; done if [ -d "$d/debian" ] && [ -z "$QUILT_PATCHES" ]; then # Debian packaging case and unset $QUILT_PATCHES QUILT_PATCHES=debian/patches QUILT_PATCH_OPTS="--unified-reject-files" QUILT_DIFF_ARGS="-p ab --no-timestamps --no-index --color=auto" QUILT_REFRESH_ARGS="-p ab --no-timestamps --no-index" QUILT_COLORS="diff_hdr=1;32:diff_add=1;34:diff_rem=1;31:diff_hunk=1;33:diff_ctx=35:diff_cctx=33" if ! [ -d $d/debian/patches ]; then mkdir $d/debian/patches; fi fi
Siehe quilt(1)
und /usr/share/doc/quilt/quilt.html
für eine Anleitung, wie quilt
benutzt wird.
Nehmen wir an, Sie finden den folgenden Fehler in der originalen
Makefile
-Datei, wo statt »install: gentoo« besser
»install: gentoo-target« stehen sollte.
install: gentoo install ./gentoo $(BIN) install icons/* $(ICONS) install gentoorc-example $(HOME)/.gentoorc
Wir beheben dies und speichern es mit dem Befehl quilt
wie folgt
als fix-gentoo-target.patch
. [11]
$ mkdir debian/patches $ quilt new fix-gentoo-target.patch $ quilt add Makefile
Sie können die Datei Makefile
wie folgt ändern.
install: gentoo-target install ./gentoo $(BIN) install icons/* $(ICONS) install gentoorc-example $(HOME)/.gentoorc
Jetzt muss quilt
noch mitgeteilt werden, dass der Patch erneuert
werden soll, so dass die Datei
debian/patches/fix-gentoo-target.patch
erstellt wird. Außerdem
können Sie eine Beschreibung hinzufügen.
$ quilt refresh $ quilt header -e ... Patch beschreiben
Normalerweise werden Programme im Unterverzeichnis /usr/local
installiert. Da dieses Verzeichnis jedoch für die private Benutzung durch den
Systemadministrator (oder andere Benutzer) reserviert ist, dürfen
Debian-Pakete dieses Verzeichnis nicht verwenden. Stattdessen sollten
Systemverzeichnisse wie das Unterverzeichnis /usr/bin
benutzt
werden, gemäß dem »Filesystem Hierarchy Standard« (FHS
,
/usr/share/doc/debian-policy/fhs/fhs-2.3.html
).
Normalerweise wird make(1)
benutzt, um das Programm automatisch zu
bauen. Der Aufruf von »make install« installiert das Programm
dann gemäß dem install-Target der Datei Makefile
.
Damit Debian Binärpakete bereitstellen kann, installiert das Build-System die
Programme innerhalb des Verzeichnisbaums, der in einem temporären Verzeichnis
angelegt wurde anstatt am tatsächlichen Ziel.
Diese beiden Unterschiede zwischen (1) der normalen Programminstallation und
(2) dem Paketieren für Debian können vom Paket debhelper
transparent adressiert werden. Es benutzt dazu die Befehle
dh_auto_configure
und dh_auto_install
, sofern die
folgenden Bedingungen erfüllt sind.
Die Datei Makefile
folgt den GNU-Konventionen und unterstützt die
Variable $(DESTDIR)
(/usr/share/doc/gnu-standards/standards.html#Makefile-Conventions
).
Die Quelle folgt dem »Filesystem Hierarchy Standard« (FHS).
Programme, die GNU autoconf
einsetzen, folgen automatisch
den GNU-Konventionen, so dass die Paketerstellung fast automatisch
funktioniert. Auf Grund dieser Tatsache und weiterer Heuristik wird
geschätzt, dass das Paket debhelper
für ungefähr 90% aller
Pakete richtig funktioniert, ohne dass irgendwelche Änderungen an deren
Build-System vorgenommen werden müssen. Daher ist das Paketieren nicht so
kompliziert, wie es zunächst aussieht.
Wenn Sie Änderungen an der Datei Makefile
vornehmen müssen,
sollten Sie sicherstellen, dass die Variable $(DESTDIR) beachtet
wird. Die Variable $(DESTDIR) wird darin auf einen leeren Wert
gesetzt und dann vorne mit dem jeweiligen Dateipfad ergänzt, der für die
Programminstallation verwendet wird. Das Skript für das Paketieren setzt
$(DESTDIR) auf das temporäre Verzeichnis.
Das temporäre Verzeichnis, das vom Befehl dh_auto_install
benutzt
wird, ist für einzelne Binärpakete (»single binary packages«)
debian/Paket
. [12] Alles, was im temporären Verzeichnis enthalten ist, wird
auf dem System eines Benutzers installiert, wenn dieser Ihr Paket installiert.
Der einzige Unterschied ist, dass dpkg
die Dateien im
Wurzelverzeichnis installieren wird.
Vergessen Sie nicht, dass Ihr Programm zwar unter
debian/Paket
installiert wird, es sich aber trotzdem
korrekt verhalten muss, wenn es im Wurzelverzeichnis platziert wird, d. h.
wenn es mittels des .deb
-Pakets installiert wird. Daher dürfen
durch das Build-System keine fest eingestellten Zeichenketten wie
/home/ich/deb/Paket-Version/usr/share/Paket
in die Paketdatei geschrieben werden.
Dies ist der relevante Abschnitt aus der Datei Makefile
von
gentoo
: [13]
# Where to put binary on 'make install'? BIN = /usr/local/bin # Where to put icons on 'make install'? ICONS = /usr/local/share/gentoo
Sie sehen, dass die Dateien unter /usr/local
installiert werden
sollen. Ändern Sie diese Pfade in:
# Where to put binary on 'make install'? BIN = $(DESTDIR)/usr/bin # Where to put icons on 'make install'? ICONS = $(DESTDIR)/usr/share/gentoo
Aber warum in dieses Verzeichnis und nicht in irgendein anderes? Weil
Debian-Pakete niemals Dateien unter /usr/local
ablegen -- dieses
Verzeichnis ist für den Systemadministrator reserviert. Solche Dateien werden
auf einem Debian-System stattdessen unter /usr
installiert.
Eine genauere Beschreibung der Installationsverzeichnisse für Binärdateien,
Icons, Dokumentationen usw. finden Sie im »Filesystem Hierarchy Standard«
(siehe /usr/share/doc/debian-policy/fhs/
). Ich empfehle, dass Sie
sich dies anschauen und die Abschnitte lesen, die Ihr Paket betreffen könnten.
Sie sollten also die Binärdateien in /usr/bin/
statt
/usr/local/bin/
installieren, die Handbuchseiten in
/usr/share/man/man1/
statt /usr/local/man/man1/
usw.
Beachten Sie, dass im Makefile
von gentoo
keine
Handbuchseite auftaucht. Da die Debian-Richtlinien aber verlangen, dass jedes
Programm eine hat, schreiben Sie später eine und installieren sie unter
/usr/share/man/man1/
.
Manche Programme nutzen die Makefile
-Variablen nicht, um solche
Pfade zu definieren. Das bedeutet, dass Sie wahrscheinlich die C-Quelltexte
direkt bearbeiten müssen, damit diese dann die richtigen Pfade benutzen. Aber
wo soll man suchen, und wonach eigentlich genau? Sie können dies
herausfinden, indem Sie folgendes eingeben:
$ grep -nr -e 'usr/local/lib' --include='*.[c|h]' .
Grep
durchsucht das Quellverzeichnis rekursiv und gibt Ihnen den
Dateinamen und die Zeilennummer für alle Treffer aus.
Sie müssen diese Dateien nun bearbeiten und in den entsprechenden Zeilen usr/local/lib durch usr/lib ersetzen.
$ vim '+argdo %s/usr\/local\/lib/usr\/lib/gce|update' +q \ $(find . -type f -name '*.[c|h]')
Passen Sie auf, dass Sie den restlichen Code nicht beschädigen! :-)
Danach suchen Sie das »install«-Target im Makefile
(suchen Sie
nach der Zeile, die mit install: beginnt, das funktioniert
üblicherweise) und benennen Sie alle Verweise auf Verzeichnisse um, die nicht
denen entsprechen, die Sie am Anfang definiert haben.
Nach Ihrer Fehlerkorrektur an den originalen Quellen sieht das
»install«-Target von gentoo
folgendermaßen aus:
install: gentoo-target install ./gentoo $(BIN) install icons/* $(ICONS) install gentoorc-example $(HOME)/.gentoorc
Wir beheben dies und speichern es mit dem Befehl quilt
als
debian/patches/install.patch
.
$ quilt new install.patch $ quilt add Makefile
Wir ändern dies für das Debian-Paket im Editor wie folgt:
install: gentoo-target install -d $(BIN) $(ICONS) $(DESTDIR)/etc install ./gentoo $(BIN) install -m644 icons/* $(ICONS) install -m644 gentoorc-example $(DESTDIR)/etc/gentoorc
Sie haben sicherlich bemerkt, dass jetzt der Befehl »install -d«
vor den anderen Befehlen in dieser Regel steht. Das originale
Makefile
hatte das nicht, weil normalerweise die Verzeichnisse
/usr/local/bin/ und andere Verzeichnisse schon auf dem System
vorhanden sind, wenn »make install« aufgerufen wird. Weil wir
aber in unser eigenes, leeres (oder sogar nicht vorhandenes) Verzeichnis
installieren, müssen wir jedes einzelne Verzeichnis anlegen.
Wir können am Ende der Regel noch weitere Dinge einfügen, wie beispielsweise die Installation zusätzlicher Dokumentation, die die ursprünglichen Autoren manchmal weglassen:
install -d $(DESTDIR)/usr/share/doc/gentoo/html cp -a docs/* $(DESTDIR)/usr/share/doc/gentoo/html
Nachdem Sie sorgfältig überprüft haben, ob alles in Ordnung ist, weisen Sie
quilt
an, den Patch zu aktualisieren und die Datei
debian/patches/install.patch
neu zu erstellen. Fügen Sie
außerdem noch eine Beschreibung hinzu.
$ quilt refresh $ quilt header -e ... Patch beschreiben
Jetzt haben Sie eine Reihenfolge von Patches.
Die Fehlerkorrektur der originalen Quellen:
debian/patches/fix-gentoo-target.patch
Die Debian-spezifische Änderung für's Paketieren:
debian/patches/install.patch
Wann immer Sie Änderungen machen, die nicht spezifisch für das Debian-Paket
sind (so wie debian/patches/fix-gentoo-target.patch
), sollten Sie
diese dem ursprünglichen Betreuer zukommen lassen, damit er sie in der
nächsten Programmversion verwenden kann und sie für andere auch nützlich
sind. Denken Sie vor dem Verschicken auch daran, Ihre Patches nicht spezifisch
für Debian oder Linux (oder sogar Unix!) zu gestalten, sondern sie portierbar
zu machen. Dadurch können Ihre Änderungen wesentlich leichter übernommen
werden.
Beachten Sie, dass Sie dem ursprünglichen Betreuer die
debian/*
-Dateien nicht schicken müssen.
Es gibt noch ein weiteres häufiges Problem: Bibliotheken sind oftmals von
Plattform zu Plattform verschieden. Beispielsweise kann ein
Makefile
einen Verweis auf eine Bibliothek enthalten, die es auf
Debian-Systemen nicht gibt. In diesem Fall müssen Sie das
Makefile
so verändern, dass eine Bibliothek verwendet wird, die
es in Debian gibt und die denselben Zweck erfüllt.
Wenn also im Makefile
(oder in Makefile.in
) des
Programms eine Zeile wie die folgende vorkommt und Ihr Programm sich nicht
kompilieren lässt [14]:
LIBS = -lcurses -lirgendwas -lirgendwasanderes
Wir korrigieren dies, indem wir curses in ncurses
umbenennen und als debian/patches/ncurse.patch
speichern.
$ quilt new ncurse.patch $ quilt add Makefile $ sed -i -e "s/-lcurses/-lncurses/g" Makefile $ quilt refresh $ quilt header -e ... Patch beschreiben
[ zurück ] [ Inhalt ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ] [ weiter ]
Anleitung für zukünftige Debian-Betreuer
Diese Übersetzung wird derzeit aktualisiert. Teile beruhen auf Version 1.2.3 vom 18. Januar 2005, die aktuelle Version ist 1.2.25, 2010-12-21 14:06:56 UTCjoy-mg@debian.org
toddy@debian.org
mail@erikschanze.de
blade@debian.org