wiki/HowtoDebian/Packaging.md
2023-10-04 15:31:43 +02:00

143 lines
5.9 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

## Créer un paquet Debian
* Debian Policy : <http://www.debian.org/doc/debian-policy/>
* Debian Dev refs : <http://debian.org/doc/developers-reference/>
* Debian New Maint guide : <http://debian.org/doc/maint-guide/>
* Howto sur le wiki Debian : <http://wiki.debian.org/HowToPackageForDebian>
* Howto de L. Nussbaum : <http://www.debian.org/doc/manuals/packaging-tutorial/packaging-tutorial.en.pdf>
### 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]: *i (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
<hack...hack...hack>
$ 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` nest 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)
~~~