Mettre a jour un paquet sur Ubuntu: Exemple avec Inkscape
Un des derniers billets publiés sur le Planet Libre explique comment compiler Inkscape sur Ubuntu. Ici nous allons voir une autre méthode qui va consister a créer un paquet avec la nouvelle version d'Inkscape. Cette méthode présente plusieurs avantages, d'une part vous pourrez partager ce paquet avec vos proches de façon à ce qu'ils n'aient pas recours a la compilation, d'autre part il sera très simple de désinstaller ce paquet pour revenir si vous le souhaitez a la version supportée par Ubuntu. Enfin, cette méthode est idéale pour apprendre les méthodes utilisées par les vrais packageurs.
La première étape consiste à récupérer la dernière version des sources. Dans notre cas, Inkscape utilise le système de gestions de versions bzr. Pour récupérer uniquement la dernière version taper :
bzr checkout –lightweight lp:inkscape
Une fois que les sources sont téléchargés compressez le répertoire inkscape et renommez l'archive en inkscape_0.48~bzr9116.orig.tar.gz
Le nom de l'archive est très important pour que les outils de packaging puissent fonctionner correctement. Cette archive est nommée <nom-du-paquet-source>_<version>.orig.tar.gz.
Vous pouvez maintenant supprimer le dossier inkscape. La partie ~bzr9116 corresponds au numéro de révision du snapshot bzr, il est utile de le préciser pour ne pas entrer en conflit avec un paquet de la version 0.48 finale.
Quelques outils seront nécessaire a la construction du paquet, installez les :
sudo apt-get install devscripts dh-make dpatch pbuilder
Nous allons aussi avoir besoin du paquet source d'origine fourni par Ubuntu, tapez dans le même dossier:
apt-get source inkscape
Placez vous dans le dossier inkscape-0.47 (ou le dossier correspondant à la version d'Ubuntu que vous utilisez) et tapez uupdate ../inkscape_0.48~bzr9116.orig.tar.gz -v 0.48~bzr9116
Comme le format du numéro de version n'est pas standard, nous devons préciser le numéro de version avec l'option -v.
Nous allons maintenant nous placer dans ../inkscape-0.48~bzr9116. Tout d'abord éditez le fichier debian/changelog et vérifiez la dernière entrée :
inkscape (0.48-0ubuntu1) karmic; urgency=low * New upstream release -- Mathieu Comandon <strycore@gmail.com> Sat, 27 Feb 2010 16:16:48 +010
L'adresse mail doit être valide, ce sera le cas si vous avez renseigné dans le fichier .bashrc les variables suivantes :
export DEBFULLNAME="Mathieu Comandon" export DEBEMAIL="strycore@gmail.com"
En théorie, l'opération de mise a jour du paquet est quasiment terminée. Mais si nous construisons notre paquet source dès maintenant pour compiler, pbuilder va rencontrer de nombreux problèmes. Les opérations qui suivent sont spécifique à la mise a jour d'Inkscape 0.47 vers 0.48~bzr.
Les problèmes que pbuilder rencontre concernent tous la 'recette' de compilation donnée dans le fichier debian/rules. Voici un diff de l'ancien fichier avec une version fonctionnelle :
rules.orig rules --- ../../rules.orig 2010-02-28 13:12:31.294522000 +0100 +++ rules 2010-02-28 13:12:27.798523967 +0100 @@ -57,10 +57,14 @@ --with-gnome-vfs --enable-lcms +configure: + autoreconf -vfi + glib-gettextize --copy --force + intltoolize --copy --force --automake build: config.status dh_testdir - cd po; intltool-update -p + ifneq "$(wildcard /usr/share/misc/config.sub)" "" cp -f /usr/share/misc/config.sub config.sub endif @@ -72,6 +76,7 @@ # $(MAKE) -C src extension/plugin/libgimpgrad.la $(MAKE) CXXFLAGS="$(CXXFLAGS) $(MIPS_CXXFLAGS) $(ALPHA_CXXFLAGS)" CFLAGS="$(CFLAGS) $(MIPS_CFLAGS) $(ALPHA_CFLAGS)" + cd po; intltool-update -p clean: clean-patched unpatch chmod 644 $(CURDIR)/debian/patches/* @@ -96,6 +101,9 @@ # Add here commands to install the package into debian/inkscape. $(MAKE) install DESTDIR=$(CURDIR)/debian/inkscape + install -d $(CURDIR)/debian/inkscape/usr/share/pixmaps + install -d $(CURDIR)/debian/inkscape/usr/share/application-registry + install -d $(CURDIR)/debian/inkscape/etc/bash_completion.d install -o root -g root -m 644 $(CURDIR)/debian/inkscape.xpm $(CURDIR)/debian/inkscape/usr/share/pixmaps/inkscape.xpm install -o root -g root -m 644 $(CURDIR)/debian/inkscape.applications $(CURDIR)/debian/inkscape/usr/share/application-registry/inkscape.applications install -D -o root -g root -m 644 $(CURDIR)/debian/inkscape.bash $(CURDIR)/debian/inkscape/etc/bash_completion.d/inkscape @@ -162,7 +170,7 @@ dh_testroot dh_installchangelogs ChangeLog dh_installdocs - dh_desktop +# dh_desktop # dh_installexamples dh_install dh_installmenu
Regardons en détail les changements apportés. Si nous regardons les sources de la version bzr, nous constatons qu'il n'y a pas de fichier "configure" mais qu'il y en à un dans la version 0.47. Une possible raison de cette différence peut être trouvée dans le fichier /usr/share/doc/autotools-dev/README.Debian.gz :
2. Tolerate the big diff size, and run the autotools stuff before you create the Debian source package. Nowadays, there is no reason to do this, please use method 1 above instead. In fact, method 2 can cause problems for the quilt-style patching system of dpkg source v3.0 format.
Comme il est précisé dans ce document, nous allons avoir recours a une méthode alternative et générer le script configure durant la construction du paquet en ajoutant une règle "configure". Cette règle pourrait appeler le script ./autogen.sh mais hyperair m'a conseillé sur #ubuntu-motu d'utiliser le script autoreconf. J'ai rajouté les lignes "glib-gettextize --copy --force" et "intltoolize --copy --force --automake" présentes dans le script autogen.sh pour que la traduction des fichiers puissent être effectuée correctement.
Une autre différence existante entre la 0.47 et la 0.48 est qu'il manque certains fichiers utilisés par la commande intltool-update -p , ces fichiers sont générés pas la compilation, j'ai donc déplacé cette commande pour qu'elle soit exécutée après make.
Autre changement, pbuilder n'arrive pas a copier certains fichier, il a fallu rajouter la création de certains dossier avec "install -d" et enfin, changement minime, j'ai commenté la ligne dh_desktop :
dh_desktop was a debhelper program that registers .desktop files. However, it no longer does anything, and is now deprecated.
La suppression de dh_desktop ne change rien sur le résultat mais supprime un avertissement donné par lintian (l'outil qui valide les paquets source). Il y a deux autres avertissements a supprimer :
- Mettez a jour le numéro de la Debian Policy dans debian/control
- Créez un fichier debian/README.sources qui est une copie du fichier /usr/share/doc/dpatch/README.source.gz
Voila, nous sommes maintenant prêt a construire notre paquet source, tapez :
debuild -S -us -uc
ou si vous avez une clé GPG opérationnelle :
debuild -S
Nous avons créer un environnement de compilation, on peut voir cela comme une installation d'Ubuntu minimale et indépendante de notre système ou un chroot pour ceux qui connaissent.
sudo pbuilder create
Cette opération peut prendre quelques minutes. Si vous aviez déjà créé un environnement pbuilder, n'oubliez pas de le mettre a jour avant de créer un nouveau paquet :
sudo pbuilder update
Et enfin nous allons lancer la compilation du paquet, attention inkscape n'est pas un petit programme, il ne se compile pas en 5 minutes ;)
sudo pbuilder build ../inkscape_0.48.0~bzr9116-0ubuntu1.dsc
Si tous se passe bien, la construction du paquet binaire devrais s'effectuer avec succès, vous pouvez le récupérer dans /var/cache/pbuilder/result. Vous pouvez maintenant installer proprement la pré release d'Inkscape 0.48 :)
P.S. : La procédure expliquée dans ce billet n'a aucune raison de ne pas fonctionner sur Debian, les outils sont strictement les mêmes.