Ubuntu logo

Packaging Guide

6. Correctifs aux paquets

Parfois, les mainteneurs de paquets d’Ubuntu doivent modifier le code source en amont afin de le faire fonctionner correctement avec Ubuntu. Les exemples incluent les correctifs vers l’amont qui n’ont pas encore été repris dans une version finale, ou les modifications du système de compilation de l’amont uniquement nécessaires pour la compilation avec Ubuntu. Nous pourrions modifier le code source en amont directement (mais en faisant cela il devient plus difficile d’enlever les correctifs plus tard, lorsque l’amont les a intégré) ou extraire les modifications pour les soumettre au projet de l’amont. Au lieu de ça, nous gardons ces modifications comme des correctifs séparés, sous la forme de fichiers diff.

Il existe de nombreuses façons différentes de gérer les correctifs dans les paquets Debian. Heureusement, nous sommes en cours de standardisation sur un système, Quilt, qui est désormais utilisé par la majorité des paquets.

Let’s look at an example package, kamoso in Trusty:

$ bzr branch ubuntu:trusty/kamoso

Les correctifs sont conservés dans debian/patches. Ce paquet a un correctif kubuntu_01_fix_qmax_on_armel.diff pour résoudre un échec de compilation sur ARM. Le correctif a un nom explicite pour décrire ce qu’il fait, un numéro pour garder les correctifs dans l’ordre (deux correctifs peuvent se chevaucher s’ils modifient le même fichier) et dans ce cas l’équipe de Kubuntu ajoute son propre préfixe pour montrer que le correctif provient d’eux plutôt que de Debian.

L’ordre des correctifs à appliquer est conservé dans debian/patches/series.

6.1. Les correctifs avec Quilt

Avant de travailler avec Quilt, vous devrez lui dire où trouver les correctifs. Ajoutez ceci à votre ~/.bashrc :

export QUILT_PATCHES=debian/patches

Et renseignez sur quel fichier appliquer le nouvel export :

$ . ~/.bashrc

Par défaut, tous les correctifs sont déjà appliqués sur les vérifications UDD ou les paquets téléchargés. Vous pouvez le vérifier avec :

$ quilt applied
kubuntu_01_fix_qmax_on_armel.diff

Si vous voulez supprimer le correctif, vous lancerez pop :

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

No patches applied

Et pour appliquer un correctif, vous utiliserez 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. Ajout d’un nouveau correctif

Pour ajouter un nouveau correctif, vous devez dire à Quilt de créer un nouveau correctif, lui dire quels sont les fichiers que le correctif doit modifier, éditer les fichiers et ensuite actualiser le correctif :

$ 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

L’étape quilt add est importante, si vous l’oubliez les fichiers ne se retrouveront pas dans le correctif.

La modification sera désormais dans debian/patches/kubuntu_02_program_description.diff et le dossier series sera complété par le nouveau correctif. Vous devez ajouter le nouveau fichier à l’empaquetage :

$ 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 conserve ses métadonnées dans le répertoire .pc/, vous devez donc actuellement l’ajouter également à l’empaquetage. Cela devrait être amélioré à l’avenir.

Comme règle générale, vous devez rester prudent dans l’ajout de correctifs aux programmes à moins qu’ils ne proviennent de l’amont, car il existe souvent une bonne raison pour que la modification n’ait pas encore été faite. L’exemple ci-dessus modifie une chaîne de l’interface par exemple, elle pourrait donc briser toutes les traductions. En cas de doute, n’hésitez pas à consulter l’auteur de l’amont avant d’ajouter un patch.

6.3. En-têtes de correctifs

Nous vous recommandons de marquer chaque correctif avec des en-têtes DEP-3, en les plaçant au début du fichier de correctif. Voici quelques en-têtes que vous pouvez utiliser :

Description:Description of what the patch does. It is formatted like Description field in debian/control: first line is short description, starting with lowercase letter, the next lines are long description, indented with a space.
Author:

Qui a écrit le correctif (par exemple, « Jane Doe <packager@example.com> »).

Origin:

D’où provient ce correctif (par exemple « de l’amont »), lorsque Auteur n’est pas renseigné.

Bug-Ubuntu:

Un lien vers le traceur de bogues Launchpad, un format court étant préférable (comme https://bugs.launchpad.net/bugs/XXXXXXX). S’il existe également des bogues dans les traceurs de bogues de l’amont ou de Debian, ajoutez les en-têtes Bug ou Bug-Debian.

Forwarded:

Si le correctif a été transmis à l’amont. Soit « yes », « no » ou « not-needed ».

Last-Update:

Date de la dernière révision (au format “AAAA-MM-JJ”).

6.4. Mise à niveau vers les nouvelles versions de l’amont

Pour mettre à niveau vers la nouvelle version, vous pouvez utiliser la commande bzr merge-upstream :

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

Lorsque vous lancez cette commande, tous les correctifs ne seront pas appliqués, car ils peuvent devenir obsolètes. Ils pourraient avoir besoin d’être actualisés, pour correspondre à la nouvelle source de l’amont, ou entièrement supprimés. Pour vérifier les problèmes, appliquez les correctifs un par un :

$ 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

S’il peut être rétro-appliqué, cela signifie que le correctif a déjà été appliqué par l’amont, nous pouvons donc le supprimer :

$ quilt delete kubuntu_01_fix_qmax_on_armel
Removed patch kubuntu_01_fix_qmax_on_armel.diff

Ensuite, continuons :

$ quilt push
Applied kubuntu_02_program_description.diff

C’est une bonne idée de lancer l’actualisation, cela va mettre à jour le correctif relatif à la source modifiée par l’amont :

$ quilt refresh
Refreshed patch kubuntu_02_program_description.diff

Ensuite, soumettez comme d’habitude :

$ bzr commit -m "new upstream version"

6.5. Réaliser un Paquet avec Quilt

Les paquets modernes utilisent Quilt par défaut, il est intégré dans le format d’empaquetage. Vérifiez dans debian/source/format que ce dernier est 3.0 (quilt).

Les paquets plus anciens utilisant le format source 1.0 vous obligent à utiliser Quilt explicitement, généralement en incluant un fichier makefile dans debian/rules.

6.6. Configurer Quilt

Vous pouvez utiliser le fichier ~/.quiltrc pour configurer quilt. Voici quelques options pouvant s’avérer utiles pour l’utilisation de quilt avec 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. Autres systèmes de correctifs

Les autres systèmes de correctifs utilisés par les paquets incluent dpatch et cdbs simple-patchsys, qui travaillent de manière similaire à Quilt en conservant les correctifs dans debian/patches, mais possèdent des commandes différentes pour rendre applicables, non-applicables ou créer des correctifs. Vous pouvez savoir quel système de correctif est utilisé par un paquet en utilisant la commande what-patch (issue du paquet ubuntu-dev-tools). Vous pouvez utiliser edit-patch, illustré dans un chapitre précédent, comme un moyen fiable pour travailler avec tous les systèmes de correctifs.

Dans des paquets encore plus anciens, les modifications sont incluses directement aux sources et conservées dans le fichier source diff.gz. Cela rend difficile leur mise à niveau vers les nouvelles versions de l’amont ou la différenciation des correctifs. Il vaut mieux l’éviter.

Ne modifiez pas un système de correctif d’un paquet sans en discuter avec le responsable Debian ou l’équipe Ubuntu adéquate. S’il n’existe pas de système de correctif existant, alors n’hésitez pas à ajouter Quilt.