Ceci est une ancienne révision du document !


Article mis en forme par ptitdav69 suite à la séance de formation organisée par gpocentek sur le canal IRC #ubuntu-fr-classroom. Encore merci à lui pour ses excellents cours.

Cas particuliers d'empaquetage

Ce cours nécessite d'avoir quelques notions de packaging, nous ne reviendrons donc pas sur ce qui a été fait dans les sessions précédentes sauf sur le fichier debian/rules. Les sujets traités seront :

  • logiciels ne nécessitant pas de compilation
  • mise à jour de paquets
  • logiciels en python
  • patcher des sources
Petit rappel sur le fichier debian/rules

Le fichier debian/rules est le script (un Makefile) qui permet de construire le paquet. Même si la plupart du temps il passe par une étape de compilation des sources, ce n'est pas une nécessité. Si le logiciel que vous empaquetez n'a pas besoin d'être compilé, pas besoin que le debian/rules compile quelque chose. C'est le cas pour un script bash, ou pour un programme python par exemple.

Le but de ce fichier est en fait d'installer les fichiers du logiciel dans debian/paquet. Par exemple, si vous récupérez sur Internet un script foo.sh, il suffit de copier ce fichier dans "debian/foo/usr/bin/" pour créer le paquet.

Tout d'abord, créer un répertoire propre pour éviter les soucis et récupérer ensuite l'archive suivante :

wget http://gauvain.tuxfamily.org/school/2007-05-17/packages/u-script.tar.gz
tar xvf u-script.tar.gz

Entrer dans le dossier "u-script/" puis executer :

dpkg-source -x *dsc

Entrer dans le dossier source qui contient le dossier "debian/" pour le paquet, et le script (u-script.sh). Il n'y a rien d'autre, en particulier pas de Makefile ou autre donc cela va être au packageur de gérer l'installation (en respectant les standards).

Contenu du dossier "debian/" avec 'ls' :

changelog  compat  control  copyright  dirs  install  rules  u-classroom  watch

Les fichiers qui vont nous intéresser sont dirs, install, rules, u-classroom et watch.

Le but est donc :

  • d'installer le script source dans "/usr/share/u-classroom/"
  • d'installer debian/u-classroom (qui est un wrapper) dans "/usr/bin"

A quoi sert un wrapper : Dans le cadre de ce cours, cela ne sert pas à grand chose mais pour beaucoup de script, le script doit être dans le même dossier que les données ce qui signifie l'installer dans "/usr/share/<paquet>" avec les images ou autre. Dans ce cas, le script n'est pas directement accessible puisqu'il n'est pas placé dans "/usr/bin". Le wrapper sert juste d'intermédiaire entre le script original installé ou il faut et "l'interface utilisateur" (i.e. lancement du script facilement en console)

Comment installer ces 2 fichiers ? Les fichiers debian/dirs et debian/install servent à cela et ils sont respectivement utilisés par dh_installdirs et dh_install.

Le fichier debian/rules : Nous pouvons déjà remarquer qu'il n'y a pas de cible 'configure'. En effet, ce n'est pas la peine puisqu'il n'y a rien à configurer. Il y a une cible "build:", qui ne fait rien (rien à compiler) mais elle doit être là (respect de la debian policy). Par contre la règle "install:" s'occupe d'installer les fichiers : dh_installdirs va lire le fichier debian/dirs et créer les dossiers nécessaires dans "debian/u-classroom/" (dans notre cas "usr/bin/" et "usr/share/u-classroom/").

Lancer le build du paquet avec 'debuild -us -uc' pour construire la paquet.

Dans le dossier source (u-script-1.0/) Lancer :

uscan

Faire ensuite un 'ls ..' et la version 0.2 est donc présente dans le repertoire parent avec un lien vers u-script_0.2.orig.tar.gz. Nous allons nous servir de cela pour mettre à jour le paquet. Rester dans le répertoire source (u-script-1.0/) et lancer :

uupdate ../u-script_0.2.orig.tar.gz

Puis

cd ../u-script-0.2
debuild -us -uc

Le paquet est mis à jour :)

ATTENTION, uupdate c'est pas une formule magique : tout est à revérifier pour une nouvelle version d'un paquet (comme vérifier que la license n'a pas changé, que des fichiers ont pas été ajoutés…)

Précision sur le fichier debian/watch. Il est composé de 2 lignes

"version=3"

http://gauvain.tuxfamily.org/school/2007-05-17/archive/u-script-(.*)\.tar\.gz

Le répertoire où se trouvent les sources est donc http://gauvain.tuxfamily.org/school/2007-05-17/archive. La fin de la ligne est une regexp qui laisse le choix pour la version. Les '.' dans les regexp sont des caractères particuliers donc ils doivent être "échappés" d'où le '\.' au lieu de simplement '.' Pour plus d'information sur uscan et ses recettes magiques :

man uscan

En fait, empaqueter du python c'est comme empaqueter n'importe quoi mais il y a quelques règles à respecter : la fameuse Python Policy. Pour suivre ce cours, récupérer l'archive suivante :

wget http://gauvain.tuxfamily.org/school/2007-05-17/packages/pyhw.tar.gz

Il y a 4 versions du même paquet dans ce paquet source et nous allons commencer avec la version 1, pour cela :

tar zxvf pyhw.tar.gz
cd pyhw/v1
dpkg-source -x *dsc

Donc tout va se passer dans les fichiers control, rules et pycompat. Le fichier debian/pycompat contient juste "2", tout comme debian/compat contient "5". Ceci est juste une indication de compatibilité.

Pour ce qui concerne le fichier debian/control, c'est un peu plus "compliqué". Nous allons construire un module public (module python) et nous allons avoir besoin de python-dev et de python-central pour construire le paquet. Ces deux dépendancess n'ont rien à voir avec les sources, c'est vraiment propre au packaging. C'est pour cela, en simplifiant, qu'elles sont listées dans Build-Depends-Indep.

La ligne "XS-Python-Version: current" permet de dire que l'on construit ce module pour la version courante de python, c'est à dire 2.5 depuis feisty.

XB-Python-Version: ${python:Versions} est un champ qui va être utilisé pour savoir avec quelle(s) version(s) de python va être compatible le paquet binaire.

Depends: ${python:Depends} permet de calculer les dépendances python (en incluant la version) et pycentral.

ATTENTION : python:Depends ne calcule pas tout (pas comme shlibs:Depends). Si votre paquet a besoin de python-gtk2, il faudra l'ajouter.

${python:Provides} : Dans notre exemple, cela ne sert à rien car que notre paquet est arch: all mais pour les modules privés de python (des .so), cela permet de définir des paquets virtuels. Par exemple si le module est compatible python 2.4 et 2.5 nous obtiendrons Provides: python2.4-foo, python2.5-foo. L'utilisateur pourra utiliser ces paquets virtuels comme n'importe quel autre paquet.

Essayons maintenant de compiler le paquet (Installer les python-dev python-central si nécessaire) :

cd pyhw-1.0
debuild -us -uc

Nous obtiendrons une erreur :

install: ne peut créer le répertoire `/usr/lib/python2.4/site-packages/HelloWorld': Permission non accordée

Et cela est tout à fait normal et éditer le Makefile pour comprendre. Nous avons "install -d /usr/lib/python2.4/site-packages/HelloWorld" qui permet de créer un dossier mais "/usr/lib/python2.4/site-packages/HelloWorld" est inaccessible puisque nous ne sommes pas "root" et nous essayons de créer le dossier dans debian/python-helloworld…

Cela ne peut pas marcher et l'astuce sera de modifier le Makefile pour utiliser "$(DESTDIR)/usr/lib/python2.4/site-packages/HelloWorld" (où DESTDIR sera en fait debian/python-helloworld).

Avec ce que nous venons de voir ci-dessus, il faut donc patcher le Makefile (et non modifier directement le fichier) et pour cela nous allons utiliser la v2 du paquet pyhw précedement téléchargé :

cd pyhw/v2 && dpkg-source -x *.dsc

Regarder ensuite dans le dossier debian/, nous avons un dossier patches/ qui contient les patches déjà faits (01-makefile.dpatch) et 00list, qui est en fait la liste des patchs à appliquer. On utilise ici 'dpatch' comme système de patch.

Regarder maintenant le fichier debian/rules qui contient :

# Include dpatch stuff.
include /usr/share/dpatch/dpatch.make

Nous ajoutons cela pour inclure des règles toute faites qui automatisent le "patchage/dépatchage".

Pour la cible "build: " on ajoute "patch" et pour la cible "clean :" unpatch.

Précision : Si dans le debian/rules il y a une cible "configure" c'est là qu'il faudra appliquer "patch".

Il faut maintenant effectuer le plus dur : le patch proprement dit ! Pour ce faire, nous allons repartir de zéro :

rm debian/patches/*

Pour créer un patch, il existe un outil très pratique: dpatch-edit-patch (Vérifier que le paquet dpatch est installé sur votre système).

Exécuter la commande suivant pour créer le patch :

dpatch-edit-patch 01-makefile

Nous nous retrouvons dans un nouveau shell. Les patchs sont appliqués dans l'ordre alphabétique quand il y en a plusieurs. Commencer leur nom par un chiffre permet de savoir dans quel ordre ils seront appliqués (lorsque l'on se retrouve avec 15-20 patchs, c'est assez pratique). C'est le même principe que le rc.d.

Dans le nouveau shell, faire les modifications, c'est à dire ajout du $(DESTDIR) dans le Makefile :

        install -d $(DESTDIR)/usr/lib/python2.4/site-packages/HelloWorld
devient install -m 644 src/*py $(DESTDIR)/usr/lib/python2.4/site-packages/HelloWorld/

Taper 'exit 0' lorsque c'est terminé.

Il ne reste plus qu'à créer un fichier 00list dans debian/patches. Dans le fichier 00list, il faut ajouter la ligne "01-makefile" (sans les guillemets).

Nous pouvons ensuite compiler le paquet avec :

debuild -us -uc

Un Warning apparaitra, nous reviendrons dessus plus bas :

W: python-helloworld: script-not-executable
./usr/share/pycentral/python-helloworld/site-packages/HelloWorld/HelloWorld.py

Pour voir le travail et le résultat de pycentral, lancer :

dpkg -f *deb

Au départ, dans le Makefile, il installait dans "/usr/lib/python2.4" et au final le script HelloWorld.py se trouvera dans "/usr/share/pycentral/python-helloworld/site-packages/HelloWorld/".

C'est donc python-central qui a complètement géré les problèmes de version de python (Depends: python, python-central (>= 0.5.8)).

Nous allons passer directement à la version 4 du paquet pyhw (la v3 étant la même que la 2 mais version cdbs)

cd pyhw/v4 && dpkg-source -x *.dsc

Aller ensuite dans "debian/patches", le fichier 00list a disparu, et les extensions des patchs sont 'patch', et non plus 'dpatch' (cdbs peut gérer n'importe quelle extension mais c'est 'patch' par défaut). Regardons maintenant le fichier rules

include /usr/share/cdbs/1/rules/simple-patchsys.mk

Cette ligne permet d'inclure tout le système de patch et tout fichier avec extension .patch dans "debian/patches" sera appliqué.

Nous allons refaire le 2ème patch, celui-ci corrigera le Warning que nous avons eu lors de la précédente compilation (pyhw version 2). Pour cela, supprimer le fichier 02-shebang.patch uniquement. Executer ensuite :

$ cdbs-edit-patch 02-shebang

Ce warning est assez courant avec tous les scripts et les modules python sont pas destinés à être exécutés et donc le shebang (#!/usr/bin/env python) n'est pas à sa place. Il faut donc supprimer la première ligne du fichier src/HelloWorld.py

Une fois que c'est fait, entrer 'exit 0' pour quitter cdbs-edit-patch.

Lien pour les patchs : https://wiki.ubuntu.com/MOTU/School/PatchingSources (session donnée par Martin Pitt aka pitti qui est l'auteur de {cdbs,dpatch}-edit-patch)

  • projets/ecole/paquets/packaging_cas_particuliers.1179436156.txt.gz
  • Dernière modification: Le 17/05/2007, 23:11
  • (modification externe)