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 4 étapes nécessaires à cette recompilation :
1. 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 publican, via la commande apt-get source publican
. 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 publican/testing
récupérera les sources de publican à partir du dépôt testing et les extraira dans le répertoire courant (via la commande dpkg-source -x
, avec comme prérequis le paquet dpkg-dev installé).
$ apt-get source publican/testing 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 « publican » est réalisée dans le système de suivi de versions « Git » à l'adresse : git://git.debian.org/collab-maint/publican.git Nécessité de prendre 888 ko dans les sources. Réception de : 1 http://ftp.fr.debian.org/debian/ testing/main publican 2.5-2 (dsc) [2 292 B] Réception de : 2 http://ftp.fr.debian.org/debian/ testing/main publican 2.5-2 (tar) [879 kB] Réception de : 3 http://ftp.fr.debian.org/debian/ testing/main publican 2.5-2 (diff) [6907 B] 888 ko réceptionnés en 8s (104 ko/s) dpkg-source: info: extraction de publican dans publican-2.5 dpkg-source: info: extraction de publican_2.5.orig.tar.gz dpkg-source: info: extraction de publican_2.5-2.debian.tar.gz dpkg-source: info: mise en place de perl-critic-fixes-svn1732 $ ls -dF publican* publican-2.5/ publican_2.5-2.debian.tar.gz publican_2.5-2.dsc publican_2.5.orig.tar.gz
Si vous ne souhaitez pas utiliser APT, ou si le paquet source n’est pas hébergé par un dépôt APT, il est toujours possible de télécharger le paquet source complet via dget -u dsc-url
, où dsc-url représente l’URL du fichier .dsc, image des sources du paquet. L’utilitaire dget est fourni par le paquet devscripts. L’option -u mérite d’être retenue : elle signifie que l’origine des sources ne sera pas vérifiée avant extraction.
2. 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 publican/testing
, ce qui aura pour effet d’installer les dépendances pour la compilation de la version testing de publican.
Si vous ne pouvez pas utiliser APT pour faire cela, placez-vous directement dans le répertoire contenant l’extraction du paquet source et lancez dpkg-checkbuilddeps
. En sortie, vous aurez une liste de dépendances de compilation non satisfaites (dans le cas contraire, la commande restera muette, et vous pourrez continuer tranquillement). Dans ce cas, un enchaînement de copier/coller et d’apt-get install
permettra de remédier au problème en quelques secondes.
3. 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.
4. 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 publican-2.5 $ debuild -us -uc dpkg-buildpackage: export de CFLAGS depuis dpkg-buildflags (origine : vendor): -g -O2 dpkg-buildpackage: export de CPPFLAGS depuis dpkg-buildflags (origine : vendor): dpkg-buildpackage: export de CXXFLAGS depuis dpkg-buildflags (origine : vendor): -g -O2 dpkg-buildpackage: export de FFLAGS depuis dpkg-buildflags (origine : vendor): -g -O2 dpkg-buildpackage: export de LDFLAGS depuis dpkg-buildflags (origine : vendor): dpkg-buildpackage: paquet source publican dpkg-buildpackage: version source 2.5-2 dpkg-buildpackage: source changé par Raphaël Hertzog dpkg-buildpackage: architecture hôte amd64 [...] dpkg-deb: compilation du paquet `publican' en `../publican_2.5-2rh1_all.deb'. dpkg-genchanges >../publican_2.5-2rh1_amd64.changes dpkg-genchanges: sources originales non incluses en version amont dpkg-source --after-build publican-2.5 dpkg-buildpackage: binary and diff upload (sources originales NON incluses) Lancement de lintian... lintian : terminé.
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 publican* publican-2.5/ publican_2.5-2rh1.dsc publican_2.5-2.debian.tar.gz publican_2.5-2rh1_amd64.changes publican_2.5-2.dsc publican_2.5-2rh1_source.changes publican_2.5-2rh1_all.deb publican_2.5.orig.tar.gz publican_2.5-2rh1.debian.tar.gz
Cet article est une traduction de Howto to rebuild Debian packages contribuée par Weierstrass01. Abonnez-vous à ce blog par RSS ou par email pour recevoir tous les prochains articles et améliorer votre maîtrise de Debian/Ubuntu.