Article mis en forme par DvP suite à la séance de formation organisée par Gloubiboulga sur le canal IRC #ubuntu-fr-classroom. Encore merci à lui pour ses excellents cours.
Merci à Gloubiboulga pour la relecture et corrections.
CDBS, pour Common Debian Build System, est un outil qui permet de simplifier votre debian/rules. Il permet de faire la même chose que ce que vous pouvez faire avec debhelper. Pour certains paquets faits avec CDBS, le debian/rules se résume à 2 lignes. CDBS est de plus utilisé par les mainteneurs. Sous Ubuntu, GNOME, KDE et Xfce sont entièrement packagés grâce à CDBS.
Pour pouvoir suivre cette documentation un certain nombre de pré-requis sont nécessaires :
Afin d'installer rapidement ces paquets :
sudo apt-get install devscripts build-essential cdbs debhelper lintian fakeroot
Une fois les paquets nécessaires à la création de paquets avec CDBS installés, regardez ensuite dans /usr/share/cdbs/1. Nous avons donc 2 dossiers (rules et class) qui contiennent des morceaux de debian/rules que l'on va pouvoir inclure dans le notre. Les "rules" sont des actions à exécuter suivant la méthode de compilation/installation du logiciel que vous empaquetez, les "class" permettent d'automatiser différentes taches que l'on retrouve dans tous les paquets concernant un certain type de paquets.
Regardons le fichier /usr/share/cdbs/1/rules/debhelper.mk (Vous pouvez vous servir de Firefox pour regarder ce genre de fichiers texte). Le début de ce script décrit les variables qu'il utilise. Puis un certain nombre de ces variables sont définies "automagiquement", en tenant compte par exemple d'informations contenues dans debian/changelog ou debian/control. Ensuite une série de règles de Makefile sont décrites, avec les actions à exécuter. N'ayez pas peur, la syntaxe des fonctions avancées d'un Makefile est assez repoussante, mais il est vraiment rare d'avoir à s'en servir. Vous verrez enfin à la fin du fichier toute une série de dh_* (scripts debhelper) appelés par ce fichier .mk.
Tous les fichiers .mk livrés avec CDBS ont ce profil (debhelper.mk est un exemple assez complexe, gnome.mk est beaucoup plus simple).
La "difficulté" pour le packageur va être de choisir les bonnes règles ou classes pour son paquet (suivant le système de compilation du logiciel : autotools, setup.py, qmake…).
Quand vous téléchargez un logiciel, 3 commandes suffisent souvent à le compiler/installer (les fameuses commandes ./configure, make et make install) mais vous pouvez aussi faire vous même la compilation en utilisant directement gcc ou g++. C'est ce que font les 3 commandes, mais pour vous c'est beaucoup plus simple. C'est le même principe avec debhelper et cdbs, vous pouvez tout faire manuellement avec debhelper mais vous pouvez aussi utiliser cdbs qui fera le même boulot avec 2 lignes de code (en utilisant debhelper 99 fois sur 100).
Attention : Notez que seul le debian/rules est concerné par CDBS, le reste des fichiers de debian/ reste identique suivant que vous utilisiez debhelper ou CDBS.
On va aujourd'hui empaqueter libtextcat (http://software.wise-guys.nl/libtextcat/). On va procéder en 2 étapes. D'abord en créant un paquet très laid, mais qui nous permettra de nous faire la main, puis en créant un vrai paquet, tout beau, et qui nous donnera plusieurs .debs.
Pour aller vite, Gloubiboulga a préparé un petit script qui va vous permettre de récupérer tous les fichiers nécessaires sur son site. Placez vous dans un dossier (le dossier ~/packaging de la première session fera très bien l'affaire si vous l'avez toujours) et utilisez :
wget http://gauvain.pocentek.net/u-classroom/2006-10-31/get_files.sh chmod a+x get_files.sh ./get_files.sh init
BASE_URL="http://gauvain.pocentek.net/u-classroom/2006-10-31/textcat"
Ceci va vous permettre de récupérer le paquet source orig.tar.gz de libtextcat et un dossier debian/ contenant les fichiers nécessaires à la création d'un paquet tout moche ;)
Note : Pour les besoins du cours, ces fichiers ont été téléchargés pour ne pas perdre trop de temps, mais le dossier debian/ et tous les fichiers auraient pu être créés par la commande :
dh_make -e votre.adresse@mail.ip
Puis choisir « b » pour la création d'un paquet en utilisant cdbs. Ceci générera le dossier debian/ ainsi que les fichiers au « format » cdbs.
Pour le détail sur les fichiers contenus dans le dossier debian/ rapporter vous au précédent tutoriel : Créer un paquet
Allons voir ce qu'il y a dans ce dossier debian. Le fichier qui nous intéresse est bien entendu le debian/rules, mais jetons un oeil au debian/control :
cat textcat/debian/control
Vous voyez que les Build-Depends contiennent cdbs ET debhelper. Il est rare d'utiliser CDBS sans debhelper (Gloubiboulga lui-même n'a jamais vu un tel paquet).
Maintenant, éditons le fichier debian/rules :
cat textcat/debian/rules
6 lignes suffisent…
Les deux premières lignes permettent d'inclure des règles et classes fournies par cdbs, en l'occurrence autotools.mk, qui s'occupera d'utiliser les fameuses commandes ./configure, make et make install ; et debhelper.mk que nous avons vu tout à l'heure, qui intègre un certain nombre de scripts dh_* pour la construction du paquet.
Ces deux lignes pourraient suffire à faire le paquet, mais essayons d'aller plus loin.
Première chose : installer une page man. On a vu tout à l'heure que de nombreuses variables sont définies dans debhelper.mk. L'utilisateur de CDBS peut utiliser ces variables, les modifier ou les compléter pour adapter son paquet. Dans le cas d'une page man, c'est la variable DEB_INSTALL_MANPAGES_<paquet> qui entre en jeu. Le paquet dans notre cas est "textcat", et la page man debian/createfp.8 (déjà écrite, et disponible dans le dossier debian/ que vous avez téléchargé).
Pour assigner une valeur à la variable, on utilise le symbole ":=". Par exemple : DEB_INSTALL_MANPAGES_textcat := debian/createfp.8
CDBS saura qu'une page man existe, et dans quel paquet l'installer lors de la construction du paquet binaire (en utilisant en fait dh_installman).
Il n'y a pas d'intérêt à détailler toutes les variables utilisables avec CDBS (il y en a des tonnes). Regarder ce qui se passe dans les fichiers .mk est certainement une meilleure idée. Vous pouvez pour cela utiliser grep pour rechercher quelque chose :
$ grep -Ri manpage /usr/share/cdbs/1
Ce qui vous donnera en retour :
/usr/share/cdbs/1/rules/debhelper.mk: dh_installman -p$(cdbs_curpkg) $(DEB_INSTALL_MANPAGES_$(cdbs_curpkg))
Note sur grep : -R permet de chercher dans tous les fichiers, -i de ne pas tenir compte de la casse. Cela donne une indication sur les variables à utiliser. Les noms des variables sont généralement suffisamment explicites pour permettre une recherche avec grep.
La documentation sur CDBS n'est pas très riche. La meilleure pour le moment est : http://perso.duckcorp.org/duck/cdbs-doc/cdbs-doc.xhtml traduite en français ici.
Il se peut également que vous ayez des actions particulières à exécuter à certains moments de la construction du paquet. Dans notre exemple, nous allons installer l'exécutable createfp dans usr/sbin au lieu de usr/bin. Pour ce faire nous allons renommer le dossier bin en sbin. Cela ne peut se faire qu'après avoir utilisé le `make install`. Nous allons donc créer une nouvelle règle pour le paquet textcat, qui s'appliquera après l'installation : install/textcat::
Suivront les instructions que nous voulons exécuter. Il faut systématiquement préciser le paquet concerné lors de l'appel de ce type de règle.
Voyez http://perso.duckcorp.org/duck/cdbs-doc/cdbs-doc.xhtml#id2452326 pour toutes les règles possibles à ajouter.
Petit rappel : Quand on lance le make install en construisant un paquet, l'installation se fait dans debian/paquet et pas sur le système local. Donc si on une action est à faire, elle doit être faite dans debian/paquet.
On va maintenant compiler le paquet sur le système
cp -R textcat /tmp cd /tmp/textcat tar zxvf *gz mv debian libtextcat-* cd libtextcat-* debuild -us -uc
Ce script utilise les fichiers téléchargés tout à l'heure pour créer un vrai paquet (simplement en copiant le dossier textcat/debian dans le dossier source décompressé). Contrairement à ce que nous avons fait lors de la première session, on ne passe pas par l'étape paquet source puis pbuilder, puisque vous savez tous faire ça, que c'est long, et que ça n'a aucun intérêt aujourd'hui ;)
Après le 'moulinage' (compilation du paquet) effectuer un :
ls ../*deb
Vous avez bien votre paquet .deb mais vous avez vu que Lintian n'est pas spécialement content après la compilation :
W: textcat: non-dev-pkg-with-shlib-symlink usr/lib/libtextcat.so.0.0.0 usr/lib/libtextcat.so W: textcat: package-name-doesnt-match-sonames libtextcat0
Faites un 'dpkg -c' sur le .deb, ceci va lister le contenu du paquet. Vous verrez que vous avez un dossier sbin, et pas de bin ainsi qu'une manpage.
On va maintenant construire un paquet multiple, pour satisfaire la debian policy en changeant le debian/rules.
Retournez dans votre dossier initial (~/packaging ?) et lancez maintenant :
./get_files.sh stable ls textcat/debian
Quelques fichiers .install sont ajoutés. Jetons un oeil au debian/control :
less textcat/debian/control
Cette fois-ci trois paquets sont décrits, qui vont donner 3 .debs lors de la compilation. Il reste maintenant à installer les fichiers voulus dans les dossiers debian/libtextcat0, debian/libtextcat-dev et debian/createfp.
Le scripts d'installation de la bibliothèque ne peut pas faire ça (choisir où installer les fichiers), on va donc pour commencer devoir installer tous les fichiers dans debian/tmp (ce que CDBS fera tout seul comme un grand). Puis on copiera les fichiers depuis debian/tmp vers les dossiers corrects. Des "mv" ou "cp" dans le debian/rules pourraient faire l'affaire, mais ça risque d'alourdir énormément le debian/rules.
C'est là que debhelper revient sur le devant de la scène avec son merveilleux dh_install. ce script permet de déplacer les fichiers listés dans debian/<paquet>.install dans le dossier debian/<paquet> lors de son utilisation.
Regardez par exemple createfp.install :
cat textcat/debian/createfp.install
Tous les fichiers installés dans debian/tmp/usr/bin/* se retrouveront dans debian/createfp/usr/bin/
Regardez maintenant libtextcat-dev.install :
cat textcat/debian/libtextcat-dev.install
La ligne src/textcat.h usr/include/ utilise une syntaxe un peu différente. Elle permet en fait d'installer le fichier src/textcat.h (fichier contenu dans les sources) dans debian/libtextcat-dev/usr/include.
Le debian/rules est quasiment identique à celui de notre premier paquet, seul le paquet cible pour l'installation de la page man et pour le renommage de bin en sbin est changé. Pas besoin d'appeler dh_install explicitement, debhelper.mk s'en charge.
Nous allons maintenant compiler les paquets :
rm -rf /tmp/textcat cp -R textcat /tmp cd /tmp/textcat tar zxvf *gz mv debian libtextcat-* cd libtextcat-* debuild -us -uc
Et après 'moulinage' :
for i in ../*deb; do echo "Paquet $i:"; dpkg -c $i; done
Vous obtenez bien vos trois paquets binaires tous propres :