Ubuntu logo

Packaging Guide

6. Patches für Pakete

Manchmal müssen Ubuntu Paketmaintainer den Upstream Sourcecode ändern damit dieser einwandfrei auf Ubuntu funktioniert. Beispiele sind Patches an Upstream, die noch nicht in eine veröffentlichte Version eingebunden wurden oder Änderungen auf das Buildsystem die nur verwendet werden müssen um auf Ubuntu zu kompilieren. Wir könnten den Upstream Sourcecode direkt ändern aber dies macht es schwieriger die Patches später zu entfernen wenn Upstream diese eingebunden hat bzw. die Änderung zu extrahieren um es beim Upstream-Projekt einzureichen. Stattdessen behalten wir diese Änderungen als separate Patches in Form von diff-Dateien.

Man kann Patches in Debian-Paketen auf unterschiedliche Arten handhaben, glücklicherweise stellt sich Quilt als Standard heraus, weil es von den meisten Paketen verwendet wird.

Schauen wir uns ein Beispiel an: kamoso in Trusty:

$ bzr branch ubuntu:trusty/kamoso

Die Patches werden in debian/patches gespeichert. Dieses Paket hat einen Patch kubuntu_01_fix_qmax_on_armel.diff um einen Komplierfehler auf ARM zu beheben. Dem Patch wurde ein Name gegeben um zu beschreiben was er macht, eine Nummer um die Patches in einer Reihe zu halten (zwei Patches können sich überschneiden wenn sie die gleiche Datei ändern) und in diesem Falle fügt das Kubuntu Team ihre eigene Vorsilbe hinzu um zu zeigen, dass der Patch von ihnen kommt und nicht von Debian.

Die Reihenfolge in der Patches angewandt werden ist in debian/patches/series definiert.

6.1. Patches mit Quilt

Bevor Sie mit Quilt arbeiten, müssen Sie spezifizieren, wo die Patches liegen. Fügen Sie dies in Ihre ~/.bashrc hinzu:

export QUILT_PATCHES=debian/patches

Und verwenden Sie source, um die neuen Exports anzuwenden:

$ . ~/.bashrc

Standardmäßig werden alle Patches angewandt, wenn Sie UDD Checkouts oder heruntergeladene Quellpakete benutzen. Sie können dies folgendermaßen überprüfen:

$ quilt applied
kubuntu_01_fix_qmax_on_armel.diff

Wenn Sie den Patch entfernen wollten, würden Sie pop ausführen:

$ quilt pop
Removing patch kubuntu_01_fix_qmax_on_armel.diff
Restoring src/kamoso.cpp

No patches applied

Und um einen Patch anzuwenden, verwenden Sie push:

$ quilt push
Applying patch kubuntu_01_fix_qmax_on_armel.diff
patching file src/kamoso.cpp

Now at patch kubuntu_01_fix_qmax_on_armel.diff

6.2. Einen neuen Patch hinzufügen

Um einen neuen Patch hinzuzufügen, muss Quilt angewiesen werden, einen neuen Patch zu erstellen, sagen Sie ihm, welche Dateien dieser Patch ändern soll, bearbeiten Sie die Dateien und aktualisieren Sie den Patch:

$ quilt new kubuntu_02_program_description.diff
Patch kubuntu_02_program_description.diff is now on top
$ quilt add src/main.cpp
File src/main.cpp added to patch kubuntu_02_program_description.diff
$ sed -i "s,Webcam picture retriever,Webcam snapshot program,"
src/main.cpp
$ quilt refresh
Refreshed patch kubuntu_02_program_description.diff

Der quilt add ist sehr wichtig, wenn Sie ihn vergessen, werden die Dateien nicht im Patch auftauchen.

Die Änderung wird jetzt in debian/patches/kubuntu_02_program_description.diff sein und die series Datei wird den Patch auflisten. Sie sollten die neue Datei zur Paketierung hinzufügen:

$ bzr add debian/patches/kubuntu_02_program_description.diff
$ bzr add .pc/*
$ dch -i "Add patch kubuntu_02_program_description.diff to improve the program description"
$ bzr commit

Quilt behält seine Metadaten im .pc/ Verzeichnis, sodass dieses momentan ebenfalls für das Paketieren hinzugefügt werden muss. In der Zukunft sollte das verbessert werden.

Im Allgemeinen sollten Sie vorsichtig sein, Patches zu Programmen hinzuzufügen sofern diese nicht von Upstream kommen, es gibt häufig einen guten Grund warum die Änderung noch nicht vorgenommen wurde. Das oben genannte Beispiel ändert einen Benutzerschnittstellen-String beispielsweise und würde somit mit den gesamten Übersetzungen brechen. Wenn Zweifel bestehen, fragen Sie den Upstreamautor bevor ein Patch hinzugefügt wird.

6.3. Patch Headers

Wir empfehlen, dass Sie jeden Patch mit den DEP-3 Kopfzeilen versehen. Hier sind einige Einträge, die Sie verwenden können:

Description:

Beschreibung was der Patch macht. Diese wird wie das Description Feld in debian/control formatiert: die erste Zeile ist die Kurzbeschreibung, die mit einem Kleinbuchstaben anfängt, die nächsten Zeilen sind ausführliche Beschreibung, die mit einem Leerzeichen eingerückt sind.

Author:

Autor des Patches (i.e. “Jane Doe <packager@example.com>”).

Origin:

Wo der Patch herkommt (z.B. “upstream”), wenn Author nicht verwendet wird.

Bug-Ubuntu:

Ein Link zu einem Launchpad-Bug, eine Kurzform wird vorgezogen (wie z.B. https://bugs.launchpad.net/bugs/XXXXXXX). Wenn es auch Bugs in Upstream-Bugtracker oder in Debian gibt, fügen Sie auch Bug oder Bug-Debian Einträge hinzu.

Forwarded:

Ob der Patch an Upstream weitergeleitet wurde. Entweder “yes”, “no” oder “not-needed”.

Last-Update:

Datum der letzten Revision (in der Form “YYYY-MM-DD”).

6.4. Auf neue Upstream Versionen aktualisieren

Um zur neuen Version zu upgraden, können Sie das bzr merge-upstream Kommando verwenden:

$ bzr merge-upstream --version 2.0.2 https://launchpad.net/ubuntu/+archive/primary/+files/kamoso_2.0.2.orig.tar.bz2

Wenn Sie diesen Befehl starten, werden alle Patches nicht angewandt, da sie nicht mehr zu alt werden können. Sie müssen eventuell aktualisiert werden um der neuen Upstreamquelle zu entsprechen oder sie müssen eventuell in ihrer Gesamtheit entfernt werden. Um nach Problemen zu forschen, wenden Sie die Patches nacheinander an:

$ quilt push
Applying patch kubuntu_01_fix_qmax_on_armel.diff
patching file src/kamoso.cpp
Hunk #1 FAILED at 398.
1 out of 1 hunk FAILED -- rejects in file src/kamoso.cpp
Patch kubuntu_01_fix_qmax_on_armel.diff can be reverse-applied

Wenn er umgekehrt angewendet werden kann, bedeutet das, dass der Patch bereits von Upstream angewendet wurde, damit kann er gelöscht werden:

$ quilt delete kubuntu_01_fix_qmax_on_armel
Removed patch kubuntu_01_fix_qmax_on_armel.diff

Dann fahren Sie fort:

$ quilt push
Applied kubuntu_02_program_description.diff

Es ist sinnvoll Refresh zu starten, dies wird den Patch entsprechend der veränderten Upstreamquelle aktualisieren:

$ quilt refresh
Refreshed patch kubuntu_02_program_description.diff

Dann committen Sie wie üblich:

$ bzr commit -m "new upstream version"

6.5. Quilt im Paket verwenden

Moderne Pakete nutzen standardmäßig Quilt, welches in das Paketierungsformat eingebaut ist. Prüfen Sie debian/source/format um sich zu vergewissern, dass dort 3.0 (quilt) steht.

Ältere Pakete, die das Quellformat 1.0 verwenden, werden explizit Quilt verwenden müssen, normalerweise in dem ein Makefile in debian/rules eingebunden wird.

6.6. Quilt konfigurieren

Die ~/.quiltrc Datei kann verwendet werden um quilt zu konfigurieren. Hier sind einige Optionen, die nützlich sein können, für die Verwendung von quilt mit debian/packages:

# Set the patches directory
QUILT_PATCHES="debian/patches"
# Remove all useless formatting from the patches
QUILT_REFRESH_ARGS="-p ab --no-timestamps --no-index"
# The same for quilt diff command, and use colored output
QUILT_DIFF_ARGS="-p ab --no-timestamps --no-index --color=auto"

6.7. Andere Patch-Systeme

Andere Patchsysteme, die von Paketen verwendet werden beinhalten dpatch und cdbs simple-patchsys. Diese arbeiten ähnlich wie Quilt indem Patches in debian/patches gehalten werden aber unterschiedliche Befehle haben Patches anzuwenden, rückabzuwickeln oder Patches zu erstellen. Sie können herausfinden welches Patchsystem von einem Paket verwendet wird in dem Sie den what-patch Befehl (aus dem Paket ubuntu-dev-tools) verwenden. Sie können edit-patch, gezeigt in vorherigen Kapiteln, als einen zuverlässigen Weg verwenden, um mit allen Systemen zu arbeiten.

In noch älteren Paketen werden Änderungen direkt in den Quellen beinhaltet und in der diff.gz Quelldatei gespeichert. Dies erschwert es, auf neue Upstream Versionen zu aktualisieren oder zu zwischen Patches zu unterscheiden und sollte am besten nicht gemacht werden.

Änderen Sie nicht das Patch-System eines Pakets ohne das mit dem Debian-Maintainer oder dem zuständigen Ubuntu-Team zu besprechen. Wenn derzeit keines existiert, ist es Ihnen freigestellt Quilt hinzuzufügen.