URL: https://linuxfr.org/users/tchetch/journaux/modification-d-un-paquet-debian Title: Modification d'un paquet Debian Authors: Etienne Bagnoud Date: 2013年06月19日T16:17:03+02:00 License: CC By-SA Tags: debian, lutins, quilt, patch, magie et gestion_de_paquets Score: 36 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 notais rien de ma démarche. À 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 sur le Web, mais je le fais pour moi et si je le publie ici c'est pour m'assurer de ne pas perdre cette documentation (et parce que Facebook ne supporte pas les statuts avec la syntaxe Markdown). Et, finalement, si je le publie rien que pour moi ici, ça pourrait être utile à quelqu'un. ## Les outils de base Pour commencer nous allons installer les outils de base. On retrouve la liste sur le [wiki Debian](http://wiki.debian.org/AdvancedBuildingTips) sauf que depuis la sortie de Wheezy, `diff` doit être remplacé par `diffutils`. Je rajoute aussi un outil : [quilt](http://wiki.debian.org/UsingQuilt), un outil de gestion de patch utilisé dans les paquets Debian. Cet outil, [dixit Wikipedia](http://en.wikipedia.org/wiki/Quilt_%28software%29), a été créé pour gérer les patchs du noyau Linux et est maintenant intégré à la gestion de paquet Debian. ```sh # 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 le [wiki](http://wiki.debian.org/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 mon répertoire de travail, par exemple `~/src/redhat-cluster`. Tout étant prêt, je lance deux sortilèges : ```sh $ 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. ```sh $ 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](http://wiki.debian.org/Projects/DebSrc3.0)). Donc nous allons pousser tous les patches en stock sur les sources. ```sh $ quilt push -a ``` Et nous allons créer notre nouveau patch. ```sh $ 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 fonctionner et je n'ai pas chercher à en savoir plus). ```sh $ 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). ```sh $ quilt refresh $ quilt pop ``` Pour que mon changement ait de la gueule, je vais ajouter une entrée à la liste des changements Debian. ```sh $ dch -i ``` Mon éditeur texte favori, [Microsoft Word](http://office.microsoft.com/en-us/word/), s'ouvre et je décris mon changement. ## Compilation ```sh $ 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](http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=691749), comme rien ne bougeait, j'ai adapté le patch de [redhat](https://bugzilla.redhat.com/show_bug.cgi?id=731775), 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`. ## PS Si vous voulez nettoyer votre système à la fin (supprimer les build-dep), j'ai trouvé [cette jolie ligne sur le web](http://www.webupd8.org/2010/10/undo-apt-get-build-dep-remove-build.html) : ```sh $ 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-cluser` par le nom de votre paquet, bien entendu).