[ zurück ] [ Inhalt ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ] [ weiter ]


Anleitung für zukünftige Debian-Betreuer
Kapitel 3 - Den Quellcode verändern


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.


3.1 Einrichten von 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.


3.2 Einen Fehler in den ursprünglichen Quellen korrigieren

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

3.3 Installation von Dateien in das Zielverzeichnis

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.

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.

  1. Die Fehlerkorrektur der originalen Quellen: debian/patches/fix-gentoo-target.patch

  1. 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.


3.4 Unterschiedliche Bibliotheken

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 UTC

Josip Rodin joy-mg@debian.org

Übersetzung von Tobias Quathamer toddy@debian.org
Erik Schanze mail@erikschanze.de
und Eduard Bloch blade@debian.org