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.