Modification rapide d'un paquet Debian

Ce document a été publié précédemment sur linuxfr. Je republie ici une version peut-être légèrement différente.

Il y a fort longtemps, j'ai modifié mon premier paquet Debian. Puis j'ai eu à le refaire. Puis encore une fois. Mais à chaque fois je ne notais rien de ma démarche et à chaque fois je recommençais presque de zéro. J'ai donc décidé de m'arrêter un instant pour documenter. Certes ça a été documenté et re-documenté des centaines de fois, mais je le fais d'abord pour moi.

Les outils de base

Pour commencer nous allons installer les outils de base. On retrouve la liste sur le AdvancedBuildingTips sauf que depuis la sortie de Wheezy, diff est appelé diffutils. Je rajoute aussi un outil : quilt, un outil de gestion de patch utilisé dans les paquets Debian. Cet outil, dixit Wikipedia, a été créé pour gérer les patchs du noyau Linux et est maintenant intégré à la gestion de paquet Debian.

# aptitude install build-essential devscripts lintian diffutils patch patchutils quilt

Une fois ces paquets installé je configure brièvement quilt pour un usage debianesque en ajoutant dans ~/.quiltrc les lignes suivantes (d'autres méthodes sont proposées sur UsingQuilt) :

  QUILT_PATCHES=debian/patches
  QUILT_NO_DIFF_INDEX=1
  QUILT_NO_DIFF_TIMESTAMPS=1
  QUILT_REFRESH_ARGS="-p ab"

Les sources

Le logiciel que je souhaite modifier porte le doux nom de dlm-pcmk et trouve sa source dans redhat-cluster. Afin d'obtenir tout ça, je me place dans le répertoire de travail, par exemple ~/src/redhat-cluster. Tout étant prêt, je lance deux sortilèges :

$ apt-get source redhat-cluster
# aptitude build-dep redhat-cluster

Le premier me retourne les sources prêtes pour être modifiées (décompressées et tout, si si), le deuxième m'obtient tout ce qui sera nécessaire pour les compiler. Les sources sont dans un répertoire nommé redhat-cluster-3.0.12 ; c'est là que tout va se dérouler ensuite (sous-entendre cd redhat-cluster-3.0.12).

Nettoyage

Afin de m'assurer d'avoir un environnement propre pour travailler, je demande aux petits lutins de le faire pour moi en utilisant leur langue et en me faisant passer pour la racine magique.

$ fakeroot debian/rules clean

Patcher

À ce stade, il est temps de patcher les sources. Comme par hasard (si si), ce paquet source utilise quilt pour la gestion des patches (ce n'est pas forcément le cas mais ça tend à le devenir). Donc nous allons pousser tous les patches en stock sur les sources.

$ quilt push -a

Et nous allons créer notre nouveau patch.

$ quilt new fix-dev-write-no-op

Pour faire ce patch, je vais devoir modifier deux fichiers. Il faut donc les indiquer à priori (j'ai essayé de le faire à posteriori mais ça n'a pas fonctionné et je n'ai pas cherché à en savoir plus).

$ quilt add dlm/include/linux/dlm_plock.h
$ quilt add group/dlm_controld/plock.c

Je fais mes corrections dans ces deux fichiers et je ferme le tout très simplement (à noter que les commandes quilt doivent être faites à la racine du paquet source).

$ quilt refresh
$ quilt pop

Pour que mon changement ait de la gueule, je vais donc ajouter une entrée à la liste des changements Debian.

$ dch -i

Mon éditeur texte favori, Microsoft Word, s'ouvre et je décris mon changement.

Compilation

$ fakeroot debian/rules binary

Et voilà, dans mon répertoire ~/src/redhat-cluster j'ai un ou plusieurs (dans mon cas plusieurs) .deb prêt a être installé sur mon système ou pousser dans mon dépôt Debian.

Conclusion

Le bug corrigé ici a été signalé à Debian, comme rien ne bougeait, j'ai adapté le patch de redhat, j'ai soumis à Debian (avant la sortie de Wheezy), mais le bug est toujours présent ... donc je suis condamné à patcher ce paquet encore et encore. Par ailleurs, si vous devez juste importer un patch avec quilt, après le quilt push il suffit de faire quilt import $FILE.

Nettoyage des dépendances de compilation

Si vous voulez nettoyer votre système à la fin (supprimer les build-dep), j'ai trouvé cette jolie ligne sur le web :

$ sudo aptitude markauto $(apt-cache showsrc redhat-cluster | grep Build-Depends | perl -p -e 's/(?:[\[(].+?[\])]|Build-Depends:|,|\|)//g')

Ça marche du tonnerre (il faut remplacer redhat-cluster par le nom de votre paquet, bien entendu).


CategoryFrQuickPackageManagement