Comment générer des dépendances différentes pour Debian et Ubuntu avec un paquet source commun

Il arrive que les dépendances requises par certains paquets diffèrent entre Debian et Ubuntu. Il reste néanmoins possible de garder un seul paquet source, capable de générer plusieurs variantes distinctes. Cet article décrit comment faire, pas-à-pas.

1. Quand est-ce nécessaire ?

Bien qu’il soit possible d’avoir des dépendances différentes en fonction de la distribution pour laquelle le paquet est construit, cela doit autant que possible être évité, et ne constituer que la dernière option possible, comme par exemple lorsque :

  • Ubuntu dispose de paquets que Debian ne propose pas (et réciproquement), alors que le paquet qui nous occupe profiterait de leurs installations.
  • Le nom du paquet diffère entre les deux distributions (et ce de manière volontaire, non en raison d’un défaut de synchronisation entre Ubuntu et Debian)
  • Les paquets sont construits différemment dans les deux distributions, ce qui entraîne une différence de dépendances d’exécution. Certains patches ne peuvent être appliqués qu’à Ubuntu.

2. Variables de substitution dans debian/control

Les dépendances variant entre les distributions ne peuvent pas être écrites “en dur” dans debian/control. Il est par contre possible d’utiliser une variable de substitution (substvar) qui sera remplacée par dpkg-gencontrol au moment de la compilation. Elle peut par exemple être notée ${dist:Depends} :

[...]
Depends: bzip2, ${shlibs:Depends}, ${misc:Depends}, ${dist:Depends}
[...]

A noter qu’il est fort probable que vous ayez déjà d’autres variables de substitution telles que ${shlibs:Depends} pour dpkg-shlibdeps, ou ${misc:Depends} pour debhelper et ses scripts dh_*.

3. dpkg-gencontrol et option -V

Les valeurs de dépendance remplacées par cette nouvelle variable doivent être communiquées à dpkg-gencontrol, via l’option -V. Exemple :

dpkg-gencontrol [...] -Vdist:Depends="paquet-A (>= 2), paquet-B"

Si vous utilisez debhelper, l’option doit être passée à dh_gencontrol après deux tirets (--) :

dh_gencontrol -- -Vdist:Depends="paquet-A (>= 2), paquet-B"

Si vous utilisez CDBS, vous pouvez passer à la variable DEB_DH_GENCONTROL_ARGS_ALL la valeur souhaitée :

include /usr/share/cdbs/1/rules/debhelper.mk
DEB_DH_GENCONTROL_ARGS_ALL = -- -Vdist:Depends="paquet-A (>= 2), paquet-B"

Les valeurs passées à dpkg-gencontrol sont, dans tous les exemples précédents, statiques. Voyons maintenant comment les rendre dépendantes de la distribution visée.

4. Utiliser dpkg-vendor dans debian/rules

dpkg-vendor est un petit outil (fourni avec le paquet dpkg-dev) permettant d’interpréter le fichier /etc/dpkg/origins/default (fourni quant à lui par le paquet base-files) pour connaître la distribution actuelle ainsi que ses prédécesseurs. Il peut être utilisé dans debian/rules pour adapter le comportement en fonction de la distribution utilisée. La page de man explicite les nombreuses options supportées, nous allons quant à nous n’en utiliser qu’une ici : --derives-from <vendor>. Cette option entraîne le renvoi d’un code retour à la fin du script, égal à 0 si la distribution utilisée est — ou dérive de — celle indiquée, et vaut 1 sinon.

Si l’on assemble maintenant toutes les pièces du puzzle entre elles, on peut donc utiliser dpkg-vendor pour définir dynamiquement la valeur de la variable de substitution dans debian/rules. Supposons par exemple que votre paquet doit dépendre de “paquet-A (>= 2)” sur Ubuntu (et ses dérivés), de “paquet-B” sinon. En utilisant le fichier de règles de debhelper 7, cela donne :

ifeq ($(shell dpkg-vendor --derives-from Ubuntu && echo yes),yes)
	SUBSTVARS = -Vdist:Depends="paquet-A (>= 2)"
else
	SUBSTVARS = -Vdist:Depends="paquet-B"
endif

%:
	dh $@

override_dh_gencontrol:
	dh_gencontrol -- $(SUBSTVARS)

Si vous utilisez CDBS, cela donnerait :

include /usr/share/cdbs/1/rules/debhelper.mk
ifeq ($(shell dpkg-vendor --derives-from Ubuntu && echo yes),yes)
	DEB_DH_GENCONTROL_ARGS_ALL = -- -Vdist:Depends="paquet-A (>= 2)"
else
	DEB_DH_GENCONTROL_ARGS_ALL = -- -Vdist:Depends="paquet-B"
endif

Cet article est une traduction de How to generate different dependencies on Debian and Ubuntu with a common source package contribuée par Weierstrass01. Suivez moi sur Identi.ca, Twitter et Facebook. Ou abonnez-vous à ce blog par RSS ou par email.

Aucun commentaire pour le moment | Vous avez aimé ? Cliquez ici. | Ce blog utilise Flattr.

Vus : 1625
Publié par Raphaël Hertzog : 113