Guide de portage vers X modulaire Donnie Berkholz Bertrand Coppa Ce guide vous explique comment porter les paquets pour qu'ils utilisent la nouvelle version modulaire de X.Org. 1.4 2006-01-03 Environnement
Introduction

Vous vous demandez surement pourquoi changer un simple et unique paquet xorg-x11 en environ 300 paquets séparés. Cela est justifié. Ce n'est pas Gentoo qui a fait ce choix indépendament du projet X.Org ; ce sont leurs développeurs qui ont décidé de séparer tous ces paquets, et nous ne faisons que suivre.

Vous pouvez lire les détails à ce sujet dans le Guide de migration vers X.Org modulaire.

Contrôle des dépendances

Nous voulons énumerer les dépendances aussi finement que possible afin que les les gens n'aient pas plein de paquets inutiles (p.ex. XPrint) qui traînent sur leur système. On veut donc dépendre directement des paquets qui contiennent les bibliothèques et les fichiers d'en-tête dont on a besoin plutôt que de n'importe quel paquet virtuel.

Aussi, nous ne pouvons guarantir que les gens auront toujours des sous-paquets installés parce qu'ils ont un méta-paquet installé et éliminer cette possibilité de problème nous fera gagner beaucoup de temps qui serait perdu à marquer les bogues « INVALID ».

Si je trouve un seul paquet dépendant sur n'importe quel méta-paquet possible, je n'hésiterai pas à harasser son mainteneur jusqu'à la fin des temps.

La première étape est d'installer X modulaire ou de trouver quelqu'un qui l'a installé. Cela peut être effectué dans un chroot -- il n'est pas nécessaire que X soit lancé, il faut seulement avoir ses fichiers disponibles pour le contrôle des dépendances.

$ wget http://dev.gentoo.org/~spyderous/scripts/linking_libs.sh \
	http://dev.gentoo.org/~spyderous/scripts/included_headers.sh \
	http://dev.gentoo.org/~betelgeuse/scripts/deputils/checkdeps.rb \
  	http://dev.gentoo.org/~betelgeuse/scripts/deputils/pkgutil.rb
Ne pas utiliser gentoolkit-0.2.1_pre9, cela donne des sorties invalides. Consultez https://bugs.gentoo.org/show_bug.cgi?id=111501.

Le premier script, linking_libs.sh, contrôle un journal de compilation de votre paquet pour vérifier toutes les bibliothèques dont il est fait référence et affiche les noms des paquets auxquels appartiennent ces bibliothèques.

Le second script, included_headers.sh, scanne le code source de votre paquet à la recherche de lignes commençant par #include et extrait les noms des fichiers inclus entre <>. Depuis le 9 septembre 2005, cela marche aussi pour les inclusions de type "".

Le troisième script, checkdeps.rb, scanne les fichiers installés par un paquet en utilisant scanelf, obtenu avec pax-utils. C'est particulièrement utile pour les paquets binaires ou les paquets qui cachent la sortie du compilateur. C'est un script Ruby, donc il nécessite dev-lang/ruby en plus de app-misc/pax-utils. Le quatrième script, pkgutil.rb, est une dépendance de checkdeps.rb.

Lancer les deux premiers scripts devrait vous donner une bonne liste de paquets pour RDEPEND (pour les bibliothèques) et DEPEND (fichiers d'en-tête et bibliothèques). Si une bibliothèque appartenant à RDEPEND n'appartient pas à DEPEND, vous devriez vous méfier : cela pourrait être une « fausse dépendance », i.e. une bibliothèque liée sans raison. Un exemple connu de dépendance de ce type est libXt ; de nombreux paquets cherchent les fichiers d'en-tête de libXt lorsqu'ils cherchent X.

Parfois, la recherche de fichiers d'en-tête relatifs de included_headers.sh trouvera de mauvais fichiers, car il certains ont des nom identiques et, du coup, il renverra un mauvais paquet. En général, l'erreur est assez visible, comme par exemple quand les fichiers d'en-tête Windows font donner app-emulation/wine comme dépendance.

Si vous spécifiez l'option -d, il arrivera parfois qu'une bibliothèque ou qu'un fichier d'en-tête soit noté « Not found! ». Cela peut vouloir dire que vous avez désinstallé un fichier d'en-tête dont un paquet a besoin depuis que vous l'avez compilé, ou bien que c'est un fichier optionnel que vous n'utilisez pas. Dans le cas d'une bibliothèque, cela peut vouloir dire que vous l'avez désinstallée ou bien que c'était seulement une bibliothèque statique compilée en interne qui n'a jamais été installée.

Cela vaut le coup de passer le temps nécessaire pour savoir si les bibliothèques ou les fichiers d'en-tête non-trouvés doivent être ajouter à la liste des dépendances, particulièrement dans le cas des fichiers d'en-tête car on n'a pas besoin d'avoir ces fichiers installés pour lancer le scanner.

Dans certains cas, les paquets ont besoin d'un serveur X réel quelconque. Mais s'il ne le demande pas lors de l'installation, je vous encourage à ne pas le mettre dans RDEPEND. Cela pose problème avec les installations de X sur des machines sans écran, pour lesquelles les programmes tournent sur une autre machine et n'ont donc besoin que de bibliothèques et de fichiers d'en-tête locaux.

Il y a déjà un bon nombre de serveurs X dans l'arbre, donc si vous avez besoin d'un serveur X, veuillez tous les inclure. Les serveurs pour X modulaire sont dans xorg-server ;il y a un serveur DirectFB (xdirectfb) ; kdrive fournit des serveurs X légers ; et bien sûr, les vieux <xorg-x11-7. Spécifiez les restrictions de versions pour xorg-x11 pour être sûr d'avoir un serveur X et pas un méta-paquet. Dans un futur proche, je prévois que kdrive va devenir xserver. Si vous avez réellement besoin d'un xserver, veuillez contacter un membre de l'équipe chargée de X. S'il y aun nombre suffisant de paquets demandant un xserver, il se peut qu'un « virtual » soit créé.

Structure de dépendance

Sur le fait d'ajouter les dépendances -- on veut une structure comme celle-ci :

RDEPEND="|| ( ( x11-libs/libXfoo
      x11-libs/libXbar
      blah? ( x11-libs/libXblah )
      tout ce qui s'affiche d'autre lors du test de bibliothèque
    )
    virtual/x11
  )

DEPEND="${RDEPEND}
  || ( ( x11-proto/fooproto
      blah? ( x11-proto/blahproto )
      tout ce qui est affiché par les deux scripts
    )
    virtual/x11
  )
Certains résultats fournis par les scripts seront redondants. Si le RDEPEND d'une bibliothèque en inclut une autre, il n'est pas nécessaire de les mettre les deux en dépendances. Si le DEPEND d'une bibliothèque contient un prototype, il faut le mettre dans la liste des dépendances du paquet. Les candidates prévisibles pour les bibliothèques présentes dans beaucoup d'autres sont libXaw, libXmu, libXpm, libXcursor, libXt. Faites simplement un emerge -ep $library | grep lib[SIX]. N'oubliez pas non plus que d'autres paquets comme gtk+ ont été portés pour les dépendances modulaires, donc ils peuvent fournir les bibliothèques nécessaires. Deux options distinctes de la variable USE installeront X, mais l'une n'est pas dépendante de l'autre. Dans ce cas là, il faut soit dupliquer la section de dépendance vers X, soit la définir ailleurs et l'inclure en tant que ${X_DEPEND}. Si elle est définie ailleurs, n'oubliez pas d'inclure aussi les portions spécifiques à chaque option USE.

Le but ici est de faire du nouveau X modulaire l'option par défaut, mais de permettre aux gens de satisfaire les dépendances avec l'ancien paquet monolithique xorg-x11. Nous abandonnons complètement virtual/x11 afin d'encourager l'énumération des dépendances réelles.

Pour la première action sur l'arbre, l'effort de portage se focalise uniquement sur les ebuilds les plus récents disponibles en ~arch, et tout ce qui est encore plus récent (KEYWORDS=-* ou package.mask). Les mainteneurs de paquets pourront choisir ce qu'il en est pour leurs paquets : soit ils remplacent les paquets pas encore portés au fur et à mesure, soit ils porteront tous leurs paquets à la fois, ce qui est plus probable. Bientôt, Repoman n'acceptera plus aucun paquet ayant une dépendance pour virtual/x11.

Cela devrait permettre aux utilisateurs dits ~arch d'utiliser le X modulaire par défaut tout en envoyant les utilisateurs dits stables vers virtual/x11.
Gérer les options de la variable USE

La plupart des gens n'a pas activé l'option xinerama de la variable USE. Donc, si x11-proto/xineramaproto est affiché comme une dépendance lorsque vous lancez included_headers.sh, il vous faut l'ajouter à DEPEND en correspondance avec l'option USE xinerama et ajouter x11-libs/libXinerama à RDEPEND, là aussi en correspondance avec l'option USE xinerama.

Caleb a soulevé un point intéressant : comment gérer toutes les options USE sur les paquets qui ont des tonnes de dépendances optionnelles vers des bibliothèques X ? Dans de nombreux cas, ce sera une bonne méthode que de toujours forcer les options dans un état donné. Aussi, vous pouvez rendre cela plus facile en groupant les options. Assurez-vous de nommer les options par leurs fonctions et non pas par les bibliothèques ou les paquets qu'elles utilisent.

Faire entrer vos corrections dans l'arbre

Si vous êtes développeur, soumettez-les. Sinon, remplissez un nouveau rapport de bug, assignez-le aux mainteneurs du paquet (disponible dans le fichier metadata.xml). Faites-le bloquer le bogue #112675. Attachez-y un correctif pour corriger les dépendances.