Product SiteDocumentation Site

Chapitre 15. Conception d'un paquet Debian

15.1. Recompiler un paquet depuis ses sources
15.1.1. Récupérer les sources
15.1.2. Effectuer les modifications
15.1.3. Démarrer la recompilation
15.2. Construire son premier paquet
15.2.1. Méta-paquet ou faux paquet
15.2.2. Simple archive de fichiers
15.3. Créer une archive de paquets pour APT
15.4. Devenir mainteneur de paquet
15.4.1. Apprendre à faire des paquets
15.4.2. Processus d'acceptation
Manipuler régulièrement des paquets Debian provoque tôt ou tard le besoin de créer le sien propre ou d'en modifier un. Ce chapitre essaie de répondre à vos interrogations en la matière et fournit des éléments pour tirer le meilleur parti de l'infrastructure offerte par Debian. Qui sait, en ayant ainsi mis la main à la pâte, peut-être irez-vous plus loin et deviendrez-vous développeur Debian !

15.1. Recompiler un paquet depuis ses sources

Plusieurs éléments justifient la recompilation d'un paquet depuis ses sources. L'administrateur peut avoir besoin d'une fonctionnalité du logiciel qui implique de recompiler le programme en activant une option particulière ou souhaiter en installer une version plus récente que celle fournie dans sa version de Debian (dans ce cas, il recompilera un paquet plus récent récupéré dans la version Testing ou Unstable pour qu'il fonctionne parfaitement dans sa distribution Stable, opération appelée le rétroportage). On prendra soin de vérifier, avant de se lancer dans une recompilation, que personne d'autre ne s'en est déjà chargé ; on pourra vérifier en particulier sur la page dédiée du système de suivi de paquets.

15.1.1. Récupérer les sources

Pour recompiler un paquet Debian, il faut commencer par rapatrier son code source. Le moyen le plus simple est d'employer la commande apt-get source nom-paquet-source, qui nécessite la présence d'une ligne de type deb-src dans le fichier /etc/apt/sources.list et l'exécution préalable de la commande apt-get update. C'est déjà le cas si vous avez suivi les instructions du chapitre portant sur la configuration d'APT (voir Section 6.1, « Renseigner le fichier sources.list »). Notez cependant que vous téléchargerez les paquetages sources du paquet disponible dans la version de Debian désignée par la ligne deb-src de ce fichier de configuration. Si vous souhaitez en rapatrier une version particulière, il vous faudra peut-être la télécharger manuellement depuis un miroir Debian ou depuis le site web : récupérer deux ou trois fichiers (d'extensions *.dsc — pour Debian Source Control*.tar.comp et parfois *.diff.gz ou *.debian.tar.compcomp pouvant prendre les valeurs gz, bz2, lzma ou xz selon l'outil de compression employé) puis exécuter la commande dpkg-source -x fichier.dsc. Si le fichier *.dsc est disponible à une URL donnée, on pourra même se simplifier la vie en utilisant dget URL : cette commande (qui fait partie du paquet devscripts) récupère le *.dsc à l'adresse indiquée, en analyse le contenu et récupère automatiquement le ou les fichiers qu'il référence. Avec l'option -x, le paquet source est même extrait localement.

15.1.2. Effectuer les modifications

Les sources maintenant disponibles dans un répertoire portant le nom du paquet source et sa version (par exemple samba-3.6.16), nous pouvons nous y rendre pour y effectuer nos modifications.
La première modification à apporter est de changer le numéro de version du paquet pour distinguer les paquets recompilés des originaux fournis par Debian. Supposons que la version actuelle soit 3.6.16-2 ; nous pouvons créer une version 3.6.16-2falcot1, ce qui désigne clairement l'origine du paquet. De cette manière, la version est supérieure à celle fournie par Debian et le paquet s'installera facilement en tant que mise à jour de l'original. Pour effectuer ce changement, il est préférable d'utiliser le programme dch (Debian CHangelog) du paquet devscripts en saisissant dch --local falcot. Cette commande démarre un éditeur de texte (sensible-editor — votre éditeur favori si vous l'avez précisé dans la variable d'environnement VISUAL ou EDITOR, un éditeur par défaut dans les autres cas) où l'on pourra documenter les différences apportées par cette recompilation. On peut constater que dch a bien modifié le fichier debian/changelog.
Si une modification des options de compilation s'avère nécessaire, il faudra modifier le fichier debian/rules, qui pilote les différentes étapes de la compilation du paquet. Dans les cas les plus simples, vous repérerez facilement les lignes concernant la configuration initiale (./configure …) ou déclenchant la compilation ($(MAKE) … ou make …). En les adaptant convenablement, il est possible d'obtenir l'effet souhaité. Si ces commandes n'apparaissent pas directement, elles sont vraisemblablement appelées par une des commandes présentes. Il faudra se référer à leur documentation pour en apprendre plus sur la manière de changer le comportement par défaut.
Il convient parfois de s'occuper du fichier debian/control, qui renferme la description des paquets générés. Il peut être intéressant de la modifier pour qu'elle reflète les changements apportés. Par ailleurs, ce fichier contient aussi des champs Build-Depends qui donnent la liste des dépendances de génération du paquet. Celles-ci se rapportent souvent à des versions de paquets contenus dans la distribution d'origine du paquet source, qui ne sont peut-être pas disponibles dans la version utilisée pour la recompilation. Il n'existe pas de moyen automatique pour savoir si une dépendance est réelle ou si elle a été créée pour garantir que la compilation s'effectue bien avec les dernières versions d'une bibliothèque (c'est le seul moyen disponible pour forcer un autobuilder à recompiler le paquet avec une version prédéfinie d'un paquet — c'est pourquoi les mainteneurs Debian utilisent fréquemment ce procédé).
N'hésitez donc pas à modifier ces dépendances pour les assouplir si vous savez qu'elles sont trop strictes. La lecture d'éventuels fichiers documentant le mode de compilation du logiciel (souvent nommés INSTALL) vous sera sans doute utile pour retrouver les bonnes dépendances. Idéalement, il faudrait satisfaire toutes les dépendances avec les paquets disponibles dans la version utilisée pour la recompilation. Sans cela, on entre dans un processus récursif où il faut préalablement rétroporter les paquets donnés dans les champs Build-Depends avant de pouvoir compléter le rétroportage souhaité. Certains paquets, qui n'ont pas besoin d'être rétroportés, seront installés tels quels pour les besoins de la recompilation (c'est souvent le cas de debhelper). Cependant, le processus peut se compliquer rapidement si l'on n'y prend garde, aussi faut-il éviter autant que possible tout rétroportage non strictement nécessaire.

15.1.3. Démarrer la recompilation

Toutes les modifications souhaitables étant apportées sur les sources, il faut maintenant régénérer le paquet binaire correspondant (fichier .deb). Tout ce processus de création est contrôlé par le programme dpkg-buildpackage.

Exemple 15.1. Recompilation d'un paquet

$ dpkg-buildpackage -us -uc
[...]
La commande précédente échoue si les champs Build-Depends n'ont pas été corrigés ou si les dépendances correspondantes n'ont pas été installées. Dans ce cas, on outrepasse cette vérification en ajoutant le paramètre -d à l'invocation de dpkg-buildpackage. En ignorant volontairement ces dépendances, on s'expose cependant à ce que la compilation échoue plus tard. Pis, il se peut que le paquet compile correctement mais que son fonctionnement soit altéré car certains programmes désactivent automatiquement des fonctionnalités s'ils détectent l'absence d'une bibliothèque lors de la compilation.
Les développeurs Debian utilisent plus volontiers un programme comme debuild, qui fera suivre l'appel de dpkg-buildpackage par l'exécution d'un programme chargé de vérifier que le paquet généré est conforme à la charte Debian. Par ailleurs, ce script nettoie l'environnement pour que les variables d'environnement locales n'affectent pas la compilation du paquet. debuild fait partie de la série d'outils du paquet devscripts, qui partagent une certaine cohérence et une configuration commune simplifiant le travail des mainteneurs.