Vous êtes ici : Accueil » français » Compilation d’un paquet debian à partir des sources

Compilation d’un paquet debian à partir des sources

D 22 février 2014     A Benjamin Sonntag    


Souvent, dans mon métier, je dois prendre un logiciel libre existant (par exemple récemment gnupg, gnome-panel ou php...) et le modifier légèrement pour qu’il corresponde plus à mes besoins. Ce faisant, je me retrouve avec une version particulière d’un logiciel.

Cependant, afin d’assurer une meilleure maintenance de ces logiciels, et parce que je dois parfois l’installer sur plusieurs machines, je me base toujours sur le paquet Debian d’origine, que je modifie et que je recompile pour l’occasion.

Ce billet va vous expliquer la base de comment compiler un package debian, quels outils installer et comment signer votre package. Notez que cette méthode est valable pour toute variante de Debian, y compris Ubuntu !

Outils de compilation et dépôts à installer


Tout d’abord, il faut modifier son fichier /etc/apt/sources.list (ou le dossier /etc/apt/sources.list.d/*.list) pour y ajouter les dépôts contenant les code source des logiciels libres utilisés.

Par exemple, pour ajouter les sources de la version stable de Debian, j’ajoute ceci :

deb-src http://ftp.fr.debian.org/debian/ stable main

Ensuite un petit coup d’apt-get update pour mettre tout cela à jour.

Les packages dont on a besoin pour compiler sont, de base, build-essential (qui dépend de gcc, make etc.), et devscripts (qui dépend de tout ce qu’il faut pour la maintenance de paquets debian, notamment debuild, lintian, dpkg-dev, dput etc.)

donc on commence par

apt-get install devscripts build-essential

Ensuite on peut s’occuper de son package particulier.

Exemple sur gnome-panel

Je devais recompiler gnome-panel pour corriger un bug sur les écrans externes dans ubuntu 13.10, bug signalé et pour lequel un correctif (fichier patch) était proposé : https://bugzilla.gnome.org/show_bug.cgi?id=709549

pour cela, on procède donc ainsi :

téléchargement du paquet SOURCE de gnome-panel (qui générera un ou plusieurs paquets binaires pour mon architecture) :

apt-get source gnome-panel

Lecture des listes de paquets... Fait
Construction de l'arbre des dépendances      
Lecture des informations d'état... Fait
Note : la maintenance du paquet de « gnome-panel » est réalisée dans le système de suivi de versions « Svn » à l'adresse :
svn://anonscm.debian.org/svn/pkg-gnome/desktop/unstable/gnome-panel
Saut du téléchargement du fichier « gnome-panel_3.6.2.orig.tar.xz », déjà téléchargé
Nécessité de prendre 55,5 ko dans les sources.
Réception de : 1 http://fr.archive.ubuntu.com/ubuntu/ saucy/universe gnome-panel 1:3.6.2-0ubuntu15 (dsc) [3 470 B]
Réception de : 2 http://fr.archive.ubuntu.com/ubuntu/ saucy/universe gnome-panel 1:3.6.2-0ubuntu15 (diff) [52,0 kB]
55,5 ko réceptionnés en 0s (196 ko/s)

Téléchargement des dépendances de compilation. En effet, pour être compilé, le paquet a probablement besoin non seulement d’un compilateur, mais aussi de certaines librairies. apt-get build-dep sert à cela :

apt-get build-dep gnome-panel

Les NOUVEAUX paquets suivants vont être installés :
 debhelper, dh-apparmor, libxml-parser-perl, libpolkit-gobject-1-dev, libxdmcp-dev, x11proto-render-dev, libxext-dev ...
0 paquets mis à jour, 43 nouvellement installés, 0 à enlever et 0 non mis à jour.
Il est nécessaire de télécharger 12 117 ko d'archives. Après dépaquetage, 21 641 ko seront utilisés.

Ainsi, on va pouvoir corriger le programme et le recompiler.

On va dans le dossier, et on applique le correctif (ici un fichier resize.patch).

cd gnome-panel-3.6.2
patch -p1 <../resize.patch

Si l’on souhaite déployer ce paquet industriellement, il faut ensuite modifier le changelog de debian, et prévenir que le code source d’origine a été modifié :

on prévient de la modification des sources d’origine

dpkg-source --commit

on ajoute l’information au fichier debian/changelog, avec son mail comme adresse de mainteneur grâce à cette commande :

dch

Enfin, on lance la compilation :

debuild

Celle-ci prendra plus ou moins de temps selon la complexité du package.

Signature du package Debian

à la fin, il essayera de signer le paquet .deb et ses sources à l’aide de votre clé PGP. S’il la trouve tout ira bien. S’il ne la trouve pas, un message d’erreur le signalera :

gpg: « Benjamin Sonntag <mon mail> » a été ignorée : la clef secrète n'est pas disponible
gpg: /tmp/debsign.f3mAYqiW/gnome-panel_3.6.2-0ubuntu15.dsc: clearsign failed: la clef secrète n'est pas disponible
debsign: gpg error occurred!  Aborting....
debuild: fatal error at line 1280:
running debsign failed

Si vous avez accès à la machine possédant cette clé PGP, vous pouvez utiliser debrsign pour cela :

debrsign benjamin@mamachine.octopuce.fr gnome-panel_3.6.2-0ubuntu15_i386.changes
scp gnome-panel_3.6.2-0ubuntu15_i386.changes gnome-panel_3.6.2-0ubuntu15.dsc benjamin@mamachine.octopuce.fr:$HOME
ssh -t benjamin@mamachine.octopuce.fr debsign  gnome-panel_3.6.2-0ubuntu15_i386.changes
...

Envoi du package sur un dépôt

Si vous avez un dépôt personnel (comme celui que nous avons pour Octopuce sur http://debian.octopuce.fr/octopuce/ ) vous pouvez ensuite envoyer ce package sur le dépôt à l’aide de l’uilitaire dput.

Par exemple, pour le projet AlternC, on dispose d’un dépôt pour wheezy, configuré dans /.dput.cf comme suit :

[alternc-wheezy]
fqdn = alternc.org
incoming = /var/www/debian/incoming/stable/
login = upload
method = scp

je peux donc envoyer le package récemment compilé à l’aide de la commande dput :

dput alternc-wheezy gnome-panel_3.6.2-0ubuntu15_i386.changes

quelques minutes plus tard, vous recevrez un email du gestionnaire du dépôt (dans mon cas géré par le package debarchiver) qui acceptera ou refusera votre paquet. Le paquet sera accepté si une version de ce numéro du logiciel n’est pas déjà présente, et si votre clé OpenPGP est autorisée à poster des packages sur le dépôt.

Exemple de refus :

Date: 11 Octobre 2011 10:38
From: debarchive@alternc.org  
Subject: alternc REJECTED

ERROR:
alternc_1.0.2_i386.changes is rejected. alternc_1.0.2.tar.gz already installed and size do not match.

Exemple d’acceptation :

Date: 11 Octobre 2011 11:44
From: debarchive@alternc.org  
Subject: alternc ACCEPTED

-- le message contient le fichier .changes signé --

Backports ?

Si vous avez mis un deb-src d’une version à venir de votre distribution (par exemple deb-src Jessie sur une Debian Wheezy), l’opération de compilation d’un package dans ce contexte est appelé un backport, où l’on met à disposition la version à venir d’un paquet dans une version actuelle du reste du système.

Dans un prochain article à venir très bientôt, je vous mettrais à disposition des packages de GNUPG permettant de générer des clés de plus de 4096 bits ;)

Et si je pars de rien ?

Si vous partez d’un .TAR.GZ d’un logiciel non packagé pour Debian, vous aurez un peu plus de travail : il faudra créer le dossier debian/ contenant au minimum control, changelog, rules.

Pour savoir comment créer un paquet Debian à partir de rien, le Guide du mainteneur Debian fournit toutes les informations utiles. Lisez-le !