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 http://doc.ubuntu-fr.org/projets/ecole/paquets sauf sur le 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. 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.

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/ (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 "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).

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

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

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)).

  • projets/ecole/paquets/packaging_cas_particuliers.1179434402.txt.gz
  • Dernière modification: Le 17/05/2007, 22:49
  • (modification externe)