Comment construire un .deb pour Ubuntu

Publié le 28 mai 2009 par Nicolargo

Voici une procédure (assez longue) permettant de générer un .deb (format de package compatible avec l'OS Ubuntu) pouvant être mis sur un depot officiel. Ce billet s'inspire très fortement de ce forum.

Avant de commencer...

Il faut installer les pré-requis suivants:

sudo apt-get install build-essential dh-make debhelper devscripts strace fakeroot dput

Ensuite on créé l'arborescence suivante dans votre répertoire racine:

cd ~
mkdir packages
cd packages

Création de notre premier package .deb

On doit dans un premier temps récupérer les sources du logiciel à packager (sjitter dans mon exemple):

wget http://fastbull.dl.sourceforge.net/sourceforge/sjitter/sjitter-0.18.1b.tgz
tar zxvf sjitter-0.18.1b.tgz

Le nom du répertoire contenant les sources doit être de la forme nom-version:

mv sjitter sjitter-0.18.1b

On créé un sous répertoire sjitter dans lequel on met l'archive et les sources:

mkdir sjitter
mv sjitter-0.18.1b sjitter-0.18.1b.tgz sjitter

Pour vérifier, le contenu du répertoire de travail doit être le suivant:

# ls -l ~/packages/sjitter
sjitter-0.18.1b
sjitter-0.18.1b.tgz

On va dans le répertoire source:

cd sjitter/sjitter-0.18.1b

Puis on lance la commande:

dh_make -e nicolas@nospam.com -c GPL -f ../sjitter-0.18.1b.tgz
> s
Maintainer name : unknown
Email-Address   : nicolas@nospam.com
Date   : Wed, 27 May 2009 11:52:00 +0000
Package Name   : sjitter
Version   : 0.18.1b
License   : blank
Type of Package : Single
> ENTER

A la première question, il faut répondre:

s = [single binary] - si c'est package normal
l = [library] - si c'est une librairie de dev
m
= [multiple] - si c'est un package comprenant plusieurs binaires
k
= [kernel module] - si c'est module noyau

Il faut ensuite créer le script suivant:

# vi script.sh
   strace -f -o /tmp/log ./configure
   # or make instead of ./configure, if the package doesn't use autoconf
   for x in `dpkg -S $(grep open /tmp/log|\
   perl -pe 's!.* open\(\"([^\"]*).*!$1!' |\
   grep "^/"| sort | uniq|\
   grep -v "^\(/tmp\|/dev\|/proc\)" ) 2>/dev/null|\
   cut -f1 -d":"| sort | uniq`; \
   do \
   echo -n "$x (>=" `dpkg -s $x|grep ^Version|cut -f2 -d":"` "), "; \
   done

Puis l'exécuter:

# chmod 755 script.sh
# ./script.sh
binutils (>= 2.18.1~cvs20080103-0ubuntu1 ), coreutils (>= 6.10-3ubuntu2 ), libacl1 (>= 2.2.45-1 ), libattr1 (>= 1 ), libc6 (>= 2.7-10ubuntu4 ), libc6-dev (>= 2.7-10ubuntu4 ), libc6-i686 (>= 2.7-10ubuntu4 ), libncurses5 (>= 5.6+20071124-1ubuntu2 ), libselinux1 (>= 2.0.55-0ubuntu4 )

Le résultat du script donne une liste des dépendances (à noter pour plus tard).

On va alors dans le sous répertoire debian créé par le programme dh_make:

cd debian

Puis on édite le fichier control:

# vi control
Source: sjitter
Section: net
Priority: extra
Maintainer: Nicolas Hennion <nicolas@nospam.com>
Build-Depends: debhelper (>= 5), autotools-dev, libc6-dev (>= 2.7-10ubuntu4 )
Standards-Version: 3.7.2

Package: sjitter
Architecture: any
Depends: ${shlibs:Depends}, ${misc:Depends} binutils (>= 2.18.1~cvs20080103-0ubuntu1 ), coreutils (>= 6.10-3ubuntu2 ), libacl1 (>= 2.2.45-1 ), libattr1 (>= 1 ), libc6 (>= 2.7-10ubuntu4 ), libc6-i686 (>= 2.7-10ubuntu4 ), libncurses5 (>= 5.6+20071124-1ubuntu2 ), libselinux1 (>= 2.0.55-0ubuntu4)
Description: Sjitter is a client/server performing tool.
 Sjitter is a command line client/server to measure jitter (based on RFC 1889), one way UDP delay and bandwidth. The client and the server's date should be synchronise to compute the jitter. You can use the NTP protocol to do this.

Avec:
Ligne 1: Nom du projet
Ligne 2: Section à laquelle appartient le projet (voir la des sections disponible ici)
Ligne 3: Laisse la valeur par défaut
Ligne 4: Nom et adresse mail du mainteneur du package
Ligne 5: Il faut y mettre les dépendances finissants par -dev (résultat du ./script)
Ligne 6: Laisse la valeur par défaut
Ligne 7: Vide
Ligne 8: Mettre la même chose qu'en ligne 1
Ligne 9: Architecture cible (any pour toutes)
Ligne 10: Il faut y mettre les dépendances ne finissants pas par -dev (résultat du ./script)
Ligne 11: Description courte du projet (< à 60 caractères)
Ligne 12->n: Description longue (attention à laisser un espace avant votre description)

Puis le fichier changelog:

# vi changelog
sjitter (0.18.1b-0ubuntu1) unstable; urgency=low

 * Version 0.18 (23/03/2009), thanks to Thierry Legras

-- Nicolas Hennion <nicolas@nospam.com>  Wed, 27 May 2009 11:52:00 +0000

Avec:
Ligne 1: Nom du package. Il faut ajouter 0ubuntu1 à la version.
Ligne 2: Vide
Ligne 3->n: Liste des changements de cette version
Ligne n+1: Vide
Ligne n+2: Nom, adresse mail et date

Le fichier copyright:

# vi copyright
This package was debianized by Nicolas Hennion <nicolas@nicolargo.com> on
Wed, 27 May 2009 11:52:00 +0000.

It was downloaded from http://fastbull.dl.sourceforge.net/sourceforge/sjitter/sjitter-0.18.1b.tgz

Upstream Author(s): Nicolas Hennion <nicolas@nicolargo.com>

License: This script is written under the GNU General Public License.

Avec:
Ligne 1: Nom et adresse de l'auteur du package
Ligne 2: Date
Ligne 3: Vide
Ligne 4: A partir de quel source le package a été généré
Ligne 5: Vide
Ligne 6->n: Les auteurs du logiciel (copie du fichier ../AUTHORS)
Ligne n+1: Vide
Ligne n+2->m: Licence sous laquelle le logiciel est distribué (conformément à la volonté de l'auteur)
Ligne m+1: Vide (optionnel)
Ligne m+2: Licence complète (optionnel)

Il y a ensuite certains fichiers optionnels à configurer. Si ils ne sont pas utiles pour votre logiciel, il faut les supprimer.

README.debian: Informations complémentaires sur le logiciel (non présentes dans les autres fichiers)
emacsen-*.ex: Fichier Emacs pouvant être compilé à l'installation
init.d.ex: Si votre logiciel doit se lancer en mode daemon, c'est dans ce fichier qu'il faut écrire le script init.d
manpage.1.ex, manpage.sgml.ex: Fichiers de man (aide)
preinst.ex: Script à lancer avant l'installation
postinst.ex: Script à lancer après l'installation
prerm.ex: Script à lancer avant la désinstallation
postrm.ex: Script à lancer après la désinstallation

On peut ensuite lancer la génération du fichier .deb

dpkg-buildpackage -rfakeroot

Si tout se passe sans problème, vous devriez vous retrouver avec les fichiers suivant dans le répertoire ~/packages/sjitter/:

sjitter_0.18.1b-1.diff.gz: Changement entre .deb et les sources originales
sjitter_0.18.1b-1.dsc: Fichier permettant aux mainteneurs des repos de suivre ce package
sjitter_0.18.1b-1_i386.changes: Le changelog (liste des changements)
sjitter_0.18.1b-1_i386.deb: Le package au format .deb
sjitter_0.18.1b.orig.tar.gz: Les sources originales

Et voilà, vous venez de faire votre premier package Ubuntu, il ne reste plus qu'a le soumettre à la communauté.