Manydev blog

Comment Recompiler Un Paquet Debian

- ~6 min(s) de lecture

Dans cet article je vais vous expliquer comment j’ai créer un nouveau paquet du logiciel Unbound en partant des sources de la version testing compiler sur une version stable. mon article est très fortement basé sur cet excellent article de Raphaël Hertzog. Je suis passé par ces étapes car je voulais configurer des options que ne sont apparue que dans la version 1.8 et dans la version stable nous ne somme encore que dans la version 1.6. Voici les articles du pourquoi de ma recompilation :

Pour les besoins de la recompilation je me suis monter une machine virtuelle avec la même architecture et la même version de debian pour éviter de polluer ma machine en fonctionnement et avoir des paquets qui ne serait utilie quoi pour la compilation. Savoir recompiler un paquet Debian existant est particulièrement utile. En effet, il s’agit là d’un prérequis indispensable à certaines tâches qu’un administrateur peut vouloir effectuer : activer une fonctionnalité désactivée dans le paquet Debian officiel, recompiler les sources pour un autre environnement (récupérer la version correspondant à Debian testing pour faire fonctionner le paquet sous Debian stable par exemple — ce qui, d’ailleurs, est le principe même des applications disponibles dans les backports), inclure une correction que les développeurs upstream ont mise à disposition, … Cet article vous propose de découvrir les 5 étapes nécessaires à cette recompilation :

1. Installation des paquets de base

Il y a quelques paquets qui peuvent être très utile pour cette phase de création de paquet voici ceux que j’ai installé:

# en root
apt install dpkg-dev devscripts

2. Télécharger les sources

La « meilleure » manière de télécharger les sources reste l’utilisation d’APT. Il permet de les télécharger depuis les dépôts source paramétrés dans le fichier /etc/apt/sources.list, comme par exemple :

deb-src http://ftp.debian.org/debian unstable main contrib non-free
deb-src http://ftp.debian.org/debian testing main contrib non-free
deb-src http://ftp.debian.org/debian stable main contrib non-free

Comme on le voit, le premier mot-clé indique clairement à APT que l’on s’intéresse aux sources, et non pas aux binaires.

Si les dépôts source n’étaient pas présents dans le fichier auparavant, un petit apt-get update permettra de mettre à jour la base et vous pourrez récupérer par exemple la dernière version des sources du paquet unbound, via la commande apt-get source unbound. Il est également possible d’indiquer la distribution au sein de laquelle il faut récupérer les sources, avec la syntaxe package/distribution. Dans notre cas, apt-get source unbound/testing récupérera les sources de unbound à partir du dépôt testing et les extraira dans le répertoire courant (via la commande dpkg-source -x).

$ cd le_repertoire_ou_vous_voulez_mettre_les_sources
$ apt-get source unbound/testing
Lecture des listes de paquets... Fait
Selected version '1.9.0-2' (testing) for unbound
Note : la maintenance du paquet de « unbound » est réalisée dans le système de suivi de versions « Git » à l'adresse :
https://salsa.debian.org/dns-team/unbound.git
Veuillez utiliser la commande :
git clone https://salsa.debian.org/dns-team/unbound.git
pour récupérer les dernières mises à jour (éventuellement non encore publiées) du paquet.
Nécessité de prendre 5 684 ko dans les sources.
Réception de:1 http://ftp.fr.debian.org/debian testing/main unbound 1.9.0-2 (dsc) [3 026 B]
Réception de:2 http://ftp.fr.debian.org/debian testing/main unbound 1.9.0-2 (tar) [5 662 kB]
Réception de:3 http://ftp.fr.debian.org/debian testing/main unbound 1.9.0-2 (diff) [18,5 kB]
5 684 ko réceptionnés en 10s (540 ko/s)
dpkg-source: info: extraction de unbound dans unbound-1.9.0
dpkg-source: info: extraction de unbound_1.9.0.orig.tar.gz
dpkg-source: info: extraction de unbound_1.9.0-2.debian.tar.xz

$ ls -dF unbound*
unbound-1.9.0/
unbound-1.9.0-2.debian.tar.gz
unbound-1.9.0-2.dsc
unbound-1.9.0.orig.tar.gz

3. Installer les dépendances de compilation

Là-aussi, APT peut faire le boulot ingrat à votre place. Tout ce que vous avez à faire est de lancer apt-get build-dep mon-paquet afin que les dépendances nécessaires à la compilation de mon-paquet soient installées. La syntaxe restant la même que pour apt-get source, il est possible de lancer apt-get build-dep unbound/testing, ce qui aura pour effet d’installer les dépendances pour la compilation de la version testing de unbound.

4. Faites les modifications requises

Je ne détaillerai pas cette étape, dans la mesure où elle dépend totalement des objectifs particuliers qui vous poussent à recompiler. Vous serez peut-être amené à modifier le fichier debian/rules, ou à appliquer un patch.

Dans tous les cas, une chose est sûre : si vous avez changé quoi que ce soit, ou recompilé le paquet dans un environnement différent, vous devriez vraiment changer son numéro de version. dch --local perso (toujours du paquet devscripts) vous permet de le faire simplement : remplacer simplement perso par un nom court vous identifiant comme le pourvoyeur de cette version. debian/changelog sera modifié en conséquence et vous serez invité à documenter brièvement les changements opérés.

5. Compiler le paquet

La dernière étape est également la plus simple, maintenant que tout est en place. Vous devez vous placer à la racine du répertoire où sont extraites les sources, et lancer debuild -us -uc (procédure recommandée, nécessite le paquet devscripts), ou directement dpkg-buildpackage -us -uc. Les options « -us -uc » évitent l’étape de la signature qui provoquerait une erreur (bénigne) à la fin si vous ne disposez pas de clé GPG correspondant au nom entré au début du fichier des modifications Debian (debian/changelog).

$ cd unbound-1.9
$ debuild -us -uc
dpkg-buildpackage -rfakeroot -us -uc
dpkg-buildpackage: info: paquet source unbound
dpkg-buildpackage: info: version source 1.9.0-2testing1
dpkg-buildpackage: info: distribution source UNRELEASED
dpkg-buildpackage: info: source changé par Manfraid
dpkg-source --before-build unbound-1.9.0
dpkg-buildpackage: info: architecture hôte amd64
[...]
dpkg-deb: building package 'python-unbound-dbgsym' in '../python-unbound-dbgsym_1.9.0-2testing1_amd64.deb'.
dpkg-deb: building package 'libunbound-dev' in '../libunbound-dev_1.9.0-2testing1_amd64.deb'.
dpkg-deb: building package 'libunbound8-dbgsym' in '../libunbound8-dbgsym_1.9.0-2testing1_amd64.deb'.
dpkg-deb: building package 'python3-unbound-dbgsym' in '../python3-unbound-dbgsym_1.9.0-2testing1_amd64.deb'.
dpkg-deb: building package 'python3-unbound' in '../python3-unbound_1.9.0-2testing1_amd64.deb'.
dpkg-deb: building package 'python-unbound' in '../python-unbound_1.9.0-2testing1_amd64.deb'.
dpkg-deb: building package 'unbound-dbgsym' in '../unbound-dbgsym_1.9.0-2testing1_amd64.deb'.
dpkg-deb: building package 'unbound-anchor-dbgsym' in '../unbound-anchor-dbgsym_1.9.0-2testing1_amd64.deb'.
dpkg-deb: building package 'unbound-anchor' in '../unbound-anchor_1.9.0-2testing1_amd64.deb'.
dpkg-deb: building package 'libunbound8' in '../libunbound8_1.9.0-2testing1_amd64.deb'.
dpkg-deb: building package 'unbound-host-dbgsym' in '../unbound-host-dbgsym_1.9.0-2testing1_amd64.deb'.
dpkg-deb: building package 'unbound-host' in '../unbound-host_1.9.0-2testing1_amd64.deb'.
dpkg-deb: building package 'unbound' in '../unbound_1.9.0-2testing1_amd64.deb'.
dpkg-genbuildinfo
dpkg-genchanges  >../unbound_1.9.0-2testing1_amd64.changes
dpkg-genchanges: info: pas d'inclusion du code source original dans l'envoi (« upload »)
dpkg-source --after-build unbound-1.9.0
dpkg-source: info: utilisation des options depuis unbound-1.9.0/debian/source/options : --single-debian-patch
dpkg-buildpackage: info: envoi d'un binaire et du fichier de différences (aucune inclusion du code source d'origine)
Now running lintian...
Finished running lintian.

La compilation est terminée. Les sources mises à jour ainsi que les paquets binaires ont été générés dans le dossier parent.

$ cd ..
$ ls -dF *unbound*
libunbound8_1.9.0-2testing1_amd64.deb             unbound_1.9.0-2testing1_amd64.buildinfo
libunbound8-dbgsym_1.9.0-2testing1_amd64.deb      unbound_1.9.0-2testing1_amd64.changes
libunbound-dev_1.9.0-2testing1_amd64.deb          unbound_1.9.0-2testing1_amd64.deb
python3-unbound_1.9.0-2testing1_amd64.deb         unbound_1.9.0-2testing1.debian.tar.xz
python3-unbound-dbgsym_1.9.0-2testing1_amd64.deb  unbound_1.9.0-2testing1.dsc
python-unbound_1.9.0-2testing1_amd64.deb          unbound_1.9.0.orig.tar.gz
python-unbound-dbgsym_1.9.0-2testing1_amd64.deb   unbound-anchor_1.9.0-2testing1_amd64.deb
unbound-1.9.0/                                    unbound-anchor-dbgsym_1.9.0-2testing1_amd64.deb
unbound_1.9.0-2_amd64.build                       unbound-dbgsym_1.9.0-2testing1_amd64.deb
unbound_1.9.0-2.debian.tar.xz                     unbound-host_1.9.0-2testing1_amd64.deb
unbound_1.9.0-2.dsc                               unbound-host-dbgsym_1.9.0-2testing1_amd64.deb

6. Installation des paquets

Pour l’utilisation normal de unbound nous n’avont besoin que de 3 paquets :

#en root
dpkg -i libunbound8_1.9.0-2testing1_amd64.deb unbound_1.9.0-2testing1_amd64.deb unbound-anchor_1.9.0-2testing1_amd64.deb

Avec ces paquets vous avez la même chose qu’installer que si vous aviez fait apt install unbound a la différence que vous utilisez la version testing et non stable.