Wer kennt das nicht, man benötigt ein Stück Software, welches - zum Glück - Open Source ist, aber an dem seit Jahren nichts mehr geändert wurde!?
Okay .. sie funktioniert ja.
Vielleicht ist das Ding mittlerweile auch so ausgehangen, das es brutalst stabil ist und
niemals irgendwelche Sicherheitslücken bekommen könnte. hust
Mein heutiges Paradebeispiel dafür ist scanbd.
Um meinen Scanner betreiben zu können, benötigte ich scanbd
.
Während Debian wenigstens noch die letzte offizielle Version mitbrachte, lag mein Raspberry brach.
Und daher machte ich mich daran, die Sourcen zu nehmen, den gcc
anzuheizen und den Code selber zu compilieren.
Old School Style eben. Der Weg der Profis. :)
Nur dreht sich die Welt weiter und der alte Code aus den 2017igern bekommt man nicht mit dem gcc 8 gebaut.
Und schon habe ich ein neues Thema, über das man mal wieder etwas schreiben kann:
Wie erstellt man einen Patch?
Prinzipiell geht es mir darum, Code den ich einmal gefixed habe, reproduzierbar wieder bauen zu können.
(Ggf. haben die Upstream Distributionen ja bereits eigene Patches am Start und liefern wieder binaries mit.)
Um einen Patch für eine einzelne Datei zu erstellen, könnte man es wie folgt machen:
1
diff -Naru file_original file_updated > file.patch
Ein kleiner Auszug aus der Hilfe von patch
:
-N
: treat absent files as empty-a
: treat all files as text-r
: recursively compare any subdirectories found-u
: output NUM (default 3) lines of unified context
Ich bevorzuge die Langform. Das macht es mir einfacher Parameter auch noch nach Monaten schneller erfassen zu können:
1
diff --new-file --text --recursive --unified file_original file_updated > file.patch
Wenn man mehrere Dateien ändert, lohnt es sich, einen einzigen Patch eines ganzes Verzeichnisses zu erstellen:
1
diff -crB dir_original dir_updated > directory.patch
Und die Erklärungen aus der patch
Hilfe:
-c
: output NUM (default 3) lines of copied context-r
: recursively compare any subdirectories-B
: ignore changes whose lines are all blank
Auch hier wieder die Langform:
1
diff --context --recursive --ignore-blank-lines dir_original dir_updated > directory.patch
Und wie wendet man den Patch an?
Gute Frage!
Bringt mich jedesmal auch wieder dazu, die Suchmaschine der Wahl zu bemühen. ;)
Aber so schwer ist das ja gar nicht:
1
patch -p1 --dry-run < ${PATCHFILE}
Die lange Fassung:
1
patch --dry-run --strip 1 --input directory.patch
Beim Parameter -p
bzw. --strip
kommt es darauf an, wo euer patch liegt. Hier kann man auch mal eine 0
einsetzen.
--dry-run
führt logischerweise den Patch nicht aus, sondern gibt euch nur aus, ob er funktionieren würde!
Wenn man auf eine Interaktion verzichten mag und sich sicher ist, dass der eigene Patch funktioniert, dann
gibt man dem ganzen noch ein --batch
mit.
Und da Leerzeichen auch einen Patch durcheinanderbringen können, kann man mittels --ignore-whitespace
hier
den großen Ignoranten mimen.
Fazit
Patchen ist nicht schwer.
Man muß nur wissen, wo man suchen muß, wenn man es mal braucht. ;)