--- categories: Debian title: Howto packaging Debian ... * Charte Debian : * Référence du développeur Debian : * Guide du nouveau responsable Debian : * Howto sur le wiki Debian : * Howto de Lucas Nussbaum : * Statut de cette page : test / bookworm ## Mise en place de l’environnement de développement ### Préambule Pour construire des paquets sur la machine locale, sans être superutilisateur ni utiliser `sudo(1)`, `sbuild(1)` (qui est utilisé par Debian pour son [infrastructure de construction automatique](https://buildd.debian.org/)) peut être utilisé. Le wiki Debian donne de nombreuses informations sur [l’installation et la configuration de sbuild](https://wiki.debian.org/sbuild), ce qui suit ne présente que le strict nécessaire. Seules les premières étapes (mise en place) nécessitent d’être superutilisateur. ### Installation, configuration minimale ~~~ # apt install sbuild schroot git-buildpackage debootstrap debhelper # sbuild-adduser ~~~ `usermod(8)` ou `addgroup(8)` et `newgrp(1)` peuvent être utilisés à la place de `sbuild-adduser(8)`. ### Création des chroots nécessaires (Sid, Bookworm, Bullseye, etc.) ~~~ # sbuild-createchroot --include=eatmydata,ccache unstable /srv/chroot/unstable-amd64-sbuild http://mirror.evolix.org/debian # sbuild-createchroot --include=eatmydata,ccache bookworm /srv/chroot/bullseye-amd64-sbuild http://mirror.evolix.org/debian # sbuild-createchroot --include=eatmydata,ccache bullseye /srv/chroot/bullseye-amd64-sbuild http://mirror.evolix.org/debian ~~~ ### Maintenance : mise à jour des chroots Cette opération peut être réalisée régulièrement, ou avant de construire des paquets. ~~~ # sbuild-update -udcar unstable bookworm bullseye ~~~ ### Configuration de git-buildpackage Cette configuration assure que `sbuild(1)` soit appelé par `gbp(1)` lors de la [construction](#construction). ~~~ $ cat > ~/.gbp.conf < (pour vim) ## Création d’un paquet ### Génération de l'arborescence _debian/_ Cette étape consiste à créer une arborescence qui constituera le paquet Debian. On peut l'automatiser simplement avec la commande _dh_make_ : ~~~ cd futur-paquet-0.1 dh_make ~~~ _NOTE : le nom du répertoire doit obligatoirement être de la forme _nom_-_version_ (_nom_ peut contenir des minuscules, chiffres et tirets)._ En utilisant dh_make sans options, il essayera de deviner les informations dont il a besoin. On peut forcer celles ci en les spécifiant sur la ligne de commande. Pour les plus utiles : * `-c` : la licence du programme ; * `-e` : l'adresse email du responsable du paquet (vous) ; * `-p` : nom du paquet, si le nom du répertoire courant n'est pas sous la forme standard ; * `-f` : chemin vers l'archive contenant les sources. Si elle n'existe pas, utilisez l'option --createorig. Le type de paquet vous sera demandé lors de l'exécution. ### Édition de certains fichiers importants _dh_make_ a créé de nombreux fichiers dans le répertoire _debian/_. Certains sont indispensables, d'autres moins. Par exemple (si vous ne vous en servez pas) vous pouvez supprimer tous les *.ex, des templates servant d'exemple. [comment]: <> (*pour vim) ~~~ rm *.ex rm *.EX ~~~ Voici une rapide explication à propos des fichiers importants : * le fichier _control_ : il décrit de manière générale le paquet. Plusieurs champs sont à compléter, notamment : * _Section_ : voir la liste [ici](http://www.debian.org/doc/debian-policy/ch-archive.html#s-subsections) ; * _Homepage_ : le site du programme ; * _Architecture_ : _any_ par défaut, ce qui va générer un paquet par architecture. Dans le cas d'un script shell par exemple, on préférera _all_ (un seul paquet est généré car compatible avec toutes les architectures) ; * _Depends_ : indiquez ici le nom et la version des paquets dont dépends éventuellement le programme (en général des bibliothèques) ; * _Description_ : le champ doit contenir une description courte, suivi d'une description longue (sur la ligne suivante, indentée d'un espace). * le fichier _changelog_ : il décrit les changements qui ont été fait sur le programme. À priori, il est déjà complété avec un « Initial release ». Supprimez juste le « (Closes: #nnnn) » puisque c'est la première version. * le fichier _copyright_ : il contient la licence sous laquelle est distribué le programme. `dh_make` l'a partiellement remplit, il vous reste à indiquer le(s) développeur(s) du programme ainsi que le texte de la licence. * le fichier _rules_ : c'est en fait un fichier Makefile, qui décrit les règles de construction et d'installation du paquet. Dans le cas d'un script unique, et qui ne nécessite pas de configuration/compilation : C'est le célèbre _./debian/rules_ qui gère donc la compilation et la copie des fichiers dans la future arborescence. Si l'on simplement copier un script, on peut par exemple rajouter ceci à la fin de la cible _install_ : ~~~ install -d -m 0755 -o root -g root $(CURDIR)/debian/futur-paquet install -m 0755 -o root -g root nom-du-script $(CURDIR)/debian/futur-paquet ~~~ ### Construction du paquet Maintenant nous pouvons construire le paquet à l'aide de la commande : ~~~ $ debuild -us -uc ~~~ Si aucune erreur n'est apparue, votre paquet est prêt à être installé et/ou poussé sur un dépôt non officiel. ## Manipulation d'un paquet (binaire) Pour certaines (mauvaises) raisons, on peut être amené à vouloir modifier un paquet binaire... notamment un maintainer script par exemple. ~~~ $ ar x foo.deb $ ls control.tar.gz data.tar.gz debian-binary $ tar xf control.tar.gz $ vim preinst $ tar cvf control.tar.gz md5sums postrm control prerm preinst postinst $ ar r foo.deb control.tar.gz ~~~ Et voilà, on a modifié le _preinst_ du paquet _foo.deb_. ## Paquets simplistes pour administrateurs système (`equivs`) Certains paquets (généralement non officiels) ont parfois des dépendances impossibles à satisfaire, ou non nécessaire dans certains contextes. [equivs](https://packages.debian.org/sid/equivs) propose une alternative simple aux paquets Debian pour satisfaire des dépendances (voir plus). Par exemple, le paquet `mysql-client` n’est pas présent dans Bullseye, mais si en paquet en dépend, le fichier suivant permet de créer un paquet qui fournit `mysql-client` et dépend à la place de `default-mysql-client`. ~~~ $ cat mysql-client.ctl Package: mysql-client Depends: default-mysql-client Version: 8.0 Description: Workaround MySQL client for Ægir Current aegir3-cluster-slave package has unfulfillable dependencies on (at least) Bullseye. ~~~ La construction du paquet prend quelques secondes. ~~~ $ equivs-build mysql-client.ctl […] dpkg-deb: building package 'mysql-client' in '../mysql-client_8.0_all.deb'. […] The package has been created. Attention, the package has been created in the current directory, not in ".." as indicated by the message above! […] # apt install ./mysql-client_8.0_all.deb ~~~ ## FAQ ### Erreur lintian : mkdir -p failed at /usr/share/perl5/Lintian/Unpacker.pm line 224 ~~~ mkdir -p /tmp/temp-lintian-lab-6xngeaELBD/pool/d/devscripts/devscripts_2.13.8_amd64_binary failed at /usr/share/perl5/Lintian/Unpacker.pm line 224. ~~~ C'est probablement que votre système n'a pas assez de mémoire. Avec un _strace lintian_ vous obtiendrez peut-être : ~~~ clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f09117029d0) = -1 ENOMEM (Cannot allocate memory) ~~~