Das FreeBSD Porter-Handbuch
Zurück | Kapitel 4. Einen Port in aller Ruhe erstellen | Weiter

# 4.4. Fehlerbehebung (Patches)

Bei der Vorbereitung eines Ports können die Dateien, die hinzugefügt oder verändert wurden, mittels diff(1) abgefangen werden, um Sie später an patch(1) zu übergeben. Jeder Patch, der dem Quelltext übergeben werden soll, sollte in einer Datei `patch-`*`` abgelegt werden, wobei `*` dem Pfadnamen der zu korrigierenden Datei entspricht, wie er auch in `patch-Imakefile` oder im `patch-src-config.h` erscheint. Diese Dateien sollten in `PATCHDIR` (normalerweise `files`) abgelegt sein, von wo sie automatisch übernommen werden. Alle Patches müssen sich relativ zur `WRKSRC`-Variable (normalerweise dem Verzeichnis, in dem sich der Quelltext des Ports entpackt und wo auch der Bau stattfindet) befinden.

Um Korrekturen und Updates zu vereinfachen, sollte es vermieden werden, mehr als einen Patch für eine Datei zu nutzen (z.B. `patch-file` und `patch-file2`, welche beide ``WRKSRC`/foobar.c` verändern). Beachten Sie, dass, falls der Pfad einer zu korrigierenden Datei einen Unterstrich (`_`) enthält, der Patch stattdessen zwei Unterstriche im Namen haben muss. Zum Beispiel muss der Patch, der eine Datei namens `src/freeglut_joystick.c` korrigieren soll, `patch-src-freeglut__joystick.c` genannt werden.

Für die Benennung der Patches sollten nur die Zeichen `[-+._a-zA-Z0-9]` genutzt werden. Bitte verwenden Sie keine weiteren Zeichen als die angegebenen. Die Namensvergabe sollte nicht `patch-aa` oder `patch-ab` etc. entsprechen, erwähnen Sie immer den Pfad und Dateinamen.

RCS-Zeichenketten sollten vermieden werden, da CVS diese verstümmeln würde, sobald wir diese Dateien in die Ports-Sammlung einpflegen. Wenn wir die Dateien wieder abrufen wären diese verändert und der Patch würde fehlschlagen. RCS-Zeichenketten sind in Dollar-Zeichen (`$`) eingefügte Zeichen und beginnen üblicherweise mit `$Id` oder `$RCS`.

Die Option rekursiv (`-r`) zu nutzen diff(1), um Patches zu erstellen, ist zulässig, jedoch sollte der Patch anschließend geprüft werden, um Unnötiges aus dem Patch zu entfernen. Im Einzelnen bedeutet dies, dass Diffs zwischen zwei Backup-Dateien, `Makefile`s oder wenn der Port `Imake` oder GNU `configure` usw. nutzt, überflüssig sind und entfernt werden sollten. Falls es es notwendig war, `configure.in` zu bearbeiten und es soll `autoconf` zum Neuerstellen von `configure` genutzt werden, sollten die Diffs aus `configure` nicht genutzt werden (diese werden oft einige tausend Zeilen groß!); – hier sollte `USE_AUTOTOOLS=autoconf:261` definiert und das Diff aus `configure.in` genutzt werden.

Zusätzlich sollte man unnötige Markup-Änderungen in Patches/Änderungen möglichst vermeiden. In der Open Source-Welt teilen sich Projekte häufig große Teile des Quellcodes. Allerdings verwenden die einzelnen Projekte oft unterschiedliche Programmierstile und Vorgaben für Einrückungen. Wenn man also einen funktionierenden Teil einer Funktion aus einem Projekt verwendet, um ein ähnliches Problem in einem anderen Projekt zu lösen, sollte man besonders vorsichtig sein, weil sich ansonsten die CVS-Änderungseinträge mit überflüssigen Einträgen füllen, die nur das Markup des Quellcodes betreffen, ohne dass sich an der Funktion des eigentlichen Quellcode etwas ändert (``withspace-only changes''). Solche Änderungen vergrößern nicht nur das CVS-Repository, sondern erschweren es auch die Ursache für eventuell auftretende Probleme zu finden.

War es notwendig eine Datei zu entfernen, wird dies besser mittels des `post-extract`-Targets als über den Patch selbst realisiert.

Ein einfacher Austausch kann direkt über das `Makefile` des Ports umgesetzt werden, indem der in-place-Modus von sed(1) genutzt wird. Dies ist sehr hilfreich, wenn variable Werte korrigiert werden sollen. Beispiel:

    post-patch:
          @${REINPLACE_CMD} -e 's|for Linux|for FreeBSD|g' ${WRKSRC}/README
    	  @${REINPLACE_CMD} -e 's|-pthread|${PTHREAD_LIBS}|' ${WRKSRC}/configure

Relativ häufig ergibt sich die Situation, in der die portierte Software die CR/LF-Konventionen für Zeilenenden nutzt (dies ist bei unter Windows® entwickelter Software häufig der Fall). Dies kann bei weiteren Patches Probleme (Compiler-Warnungen, Fehlermeldungen bei der Ausführung von Skripten wie z.B. `/bin/sh^M` not found) und anderes ergeben. Um schnell alle Dateien von CR/LF nach LF zu konvertieren, kann `USE_DOS2UNIX=yes` in das `Makefile` des Ports geschrieben werden. Hierzu kann eine Liste der zu konvertierenden Dateien erstellt werden:

    USE_DOS2UNIX=    util.c util.h

Sollen Gruppen von Dateien über verschiedene Unterverzeichnisse konvertiert werden, kann `DOS2UNIX_REGEX` genutzt werden, dessen Argumente `find`-kompatible, reguläre Ausdrücke sind. Mehr zur Formatierung findet sich in re_format(7). Diese Option ist beim Konvertieren aller Dateien mit definierter Endung, z.B. aller Dateien im Quellcode, wobei binäre Dateien unberührt bleiben, sinnvoll:

    USE_DOS2UNIX=    yes
          DOS2UNIX_REGEX=  .*\.(c|cpp|h)

Wenn Sie einen Patch zu einer bereits existierenden Datei erstellen wollen, können Sie von ihr eine Kopie mit der Endung `.orig` erstellen und anschließend die Originaldatei bearbeiten. Das make-Ziel `makepatch` führt dann zu einer entsprechenden Patch-Datei im Verzeichnis `files` des Ports.

Zurück | Zum Anfang | Weiter
Den Port bearbeiten | Nach oben | Konfigurieren

Fragen zum FreeBSD Ports-System richten Sie bitte an <ports@FreeBSD.org>, Fragen zu diesem Dokument hingegen an <de-bsd-translators@de.FreeBSD.org>.