22-11-2004
L'arbre de Portage Introduction

L'arbre de Portage se trouve en général dans /usr/portage et est organisé selon une structure hiérarchique constituée de répertoires de catégories, suivis des répertoires spécifiques aux paquets. Voici un exemple : vous pourrez trouver le fichier util-linux-2.11y.ebuild dans le répertoire /usr/portage/sys-apps/util-linux. Il peut y avoir plusieurs autres versions d'ebuilds pour util-linux à côté de util-linux-2.11y.ebuild. C'est dû au fait que tous les ebuilds pour un paquet particulier (quelque soit la version) partagent le même répertoire ma_categorie/mon_paquet dans /usr/portage.

Récupérer une version de l'arbre de Portage avec CVS

Si vous n'êtes pas familié au fonctionnement de CVS, vous pouvez lire le tutoriel CVS pour plus d'informations.

L'arbre de Portage se trouve dans le module gentoo-x86 de l'arbre de Gentoo Linux. Pour récupérer ce module (environ 350Mo), vous devez tout d'abord préparer CVS, comme spécifié dans le guide cité plus haut, puis récupérer le module gentoo-x86.

Ce qu'on (ne) peut (pas) mettre dans l'arbre de Portage

Avant d'écrire un ebuild, vérifiez sur bugs.gentoo.org s'il existe déjà ebuild pour ce que vous voulez faire, mais qui n'aurait pas encore été mis dans Portage. Allez sur bugs.gentoo.org, choisissez query. Pour le produit, prenez Gentoo Linux, et comme composant, ebuilds. Dans le champ réservé à la recherche écrivez le nom de l'ebuild, puis comme statut, selectionnez NEW, ASSIGNED, REOPENED, et RESOLVED (RESOLVED est important ici), puis envoyez la requête. Pour les fainéants, cliquez directement ici.

En règle générale, l'arbre de Portage ne doit être utilisé que pour stocker des fichiers .ebuild, ainsi que divers fichiers qui leur sont liés, comme par exemple les correctifs et des petits fichiers de configuration. Ce genre de fichiers doit être placé dans le répertoire /usr/portage/macat/monpaquet/files pour garder une organisation des répertoires /macat/monpaquet la plus propre et rangée possible. Les exceptions à cette règle sont réservées aux correctifs de taille importante, qui doivent être placés sur les miroirs Gentoo pour que les utilisateurs ne perdent pas de bande passante et d'espace disque inutiles en les télechargeant. De plus ce n'est en général pas une bonne idée d'ajouter des fichiers binaires (non-ASCII) au CVS. Cependant, si vous devez le faire (par exemple, si vous devez ajouter une petite image de type PNG pour une raison quelconque) assurez-vous de l'ajouter au CVS en utilisant l'option -kb comme suit :

# cvs add -kb monimage.png

L'option -kb indique à CVS que monimage.png est un fichier binaire et qu'il doit être traité de manière particulière. Par exemple, lui adjoindre les différences entre deux versions de ce fichier ne sera évidemment pas permis. De même, tant qu'on est sur le thème des ajouts de modifications, tous les correctifs que vous ajoutez à Portage devront ne pas être compressés. Cela permet à CVS de récupérer les modifications et d'informer correctement les développeurs de la présence de conflits.

Souvenez-vous que les paquets que vous soumettez doivent être prêts à l'utilisation de manière autonome s'ils sont soumis comme étant stables. Assurez-vous que vous disposez d'un bon environnement de configuration, qui satisfasse le plus grand nombre de systèmes et d'utilisateurs qui utiliseront votre paquet. Si votre paquet est cassé, et que vous n'êtes pas sûr de comment faire pour le faire fonctionner, regardez ce qu'ont fait d'autres distributions qui ont effectué leur propres versions de ce paquet. Vous pouvez regarder chez Mandrake ou Debian pour avoir de bons exemples.

Vérifiez de nouveau votre ebuild pour vous assurer de sa bonne correction en consultant la section concernant les Erreurs fréquentes dans les ebuilds Gentoo.

Quand ils effectuent une soumission au CVS, TOUS les développeurs doivent utiliser repoman commit en lieu et place de cvs commit pour soumettre leurs ebuilds. Avant de faire une soumission, vous devez exécuter la commande repoman full pour vous assurer que vous n'avez rien oublié.

Politique de soumission au CVS
  • Toujours exécuter repoman scan avant de soumettre son travail ;
  • Exécutez repoman full avant de faire une soumission ;
  • Toujours vérifier que package.mask est en règle en effectuant un emerge --pretend monpaquet avant de le soumettre et vérifiez qu'il n'y a aucun conflit ;
  • Toujours mettre à jour le ChangeLog avant de faire une soumission ;
  • Toujours mettre à jour en premier package.mask avant de mettre à jour le paquet concerné. Il peut y avoir des conflits lors de la soumission de package.mask ;
  • Toujours faire des soumissions atomiques. Si vous soumettez un paquet avec une nouvelle licence ou un paquet masqué, alors il vous faudra tout d'abord soumettre la mise à jour de package.mask, puis soumettre l'ebuild, le ChangeLog et la licence, d'une traite. Sauf si vous souhaitez corrompre les installations des utilisateurs...
Le répertoire de destination pour les fichiers

Comme remarqué précédemment, dans chaque sous-répertoire de paquet, il y a un répertoire files/. Tous les correctifs, fichiers de configuration, et tous les fichiers annexes à votre paquet doivent être placés dans ce répertoire. Vous aurez probablement à vous poser la question de comment nommer un correctif que vous avez vous-même créé, simplement pour que votre paquet puisse compiler avec un nom de version spécifique. Il vous faudra alors le nommer par exemple monpaquet-1.0-gentoo.diff, ou plus simplement 1.0-gentoo.diff. Remarquez la présence de l'extension gentoo qui indique aux utilisateurs que ce correctif a été créé par les développeurs pour Gentoo Linux, et n'a donc pas été récupéré sur une liste de diffusion ou ailleurs. Encore une fois, ne compressez pas les fichiers diffs, car CVS n'est pas très bon dans la gestion des fichiers binaires.

Préfixez ou suffixez (comme par exemple monpaquet-1.0) tous les fichiers que vous mettez dans le répertoire files/, afin que les fichiers utilisés pour chaque version d'un ebuild soit identifiables entre eux, et que les changements entre les différentes révisions soient visibles. C'est en général une très bonne idée. Vous pouvez également utiliser un autre suffixe si vous voulez donner plus de sens au nom du correctif.

S'il y a plusieurs fichiers qui doivent aller dans le répertoire files/, vous pouvez créer des sous-répertoires comme par exemple files/1.0/ et mettre les fichiers en question dans le bon sous-répertoire. Si vous utilisez cette méthode, vous n'avez pas besoin d'indiquer plus d'informations dans le nom des fichiers, ce qui est d'ailleurs l'usage habituel, car c'est plus commode.

Scripts ebuild Introduction

Les scripts ebuild sont la base de l'ensemble du système de Portage. Ils contiennent toutes les informations nécessaires pour récupérer, désarchiver, compiler et installer un ensemble de sources. Ils contiennent aussi les informations nécessaires pour réaliser n'importe quelle tâche de pré/post installation/suppression ou de configuration. Si la plus grande partie de Portage est écrite en Python, les scripts ebuild sont, eux, écrits en bash, dans la mesure où bash nous permet d'appeler des commandes comme si elles étaient appelées depuis un invite de commande. Un des principes importants dans la conception que l'on retrouve derrière les scripts ebuild est d'avoir des commandes dans le script qui sont analogues à celles que l'on taperait dans une console si l'on installait le paquet manuellement. Pour cela, utiliser une syntaxe bash est une vraiment bonne chose.

Les scripts ebuild sont interprétés par les commandes ebuild et emerge. Il faut imaginer la commande ebuild comme un outil de bas niveau. Il peut construire et installer un simple ebuild, mais pas plus. Il vérifiera si les dépendances sont satisfaites, mais il n'essayera pas de les résoudre automatiquement lui-même. D'un autre côté emerge est un outil de haut niveau par rapport à ebuild. Il a la capacité d'installer automatiquement les dépendances si elles sont nécessaires et d'effectuer des vérifications d'installation (avec pretend) pour que l'utilisateur puisse voir quels sont les ebuilds qui seront installés et s'arrêter là. En général, emerge vole la vedette à ebuild dans tous les domaines, sauf un. Avec ebuild, vous pouvez effectuer les étapes les unes après les autres lors de l'installation d'un paquet (récupération des sources, désarchivage, compilation, installation, et fusion dans Portage). Pour les développeurs, c'est un outil de correction d'erreurs précieux, car il vous permettra d'isoler les problèmes d'un ebuild par parties spécifiques.

Nommer les fichiers ebuild

Les noms de fichiers ebuild sont constitués de quatre parties logiques :

La première partie est le nom du paquet, qui ne doit contenir que des lettres minuscules, des nombres entre 0 et 9, et les caractères trait d'union « - », blanc souligné « _ », ou plus « + ». Par exemple, util-linux, sysklogd, mod_php et gtk+.

La seconde partie est la version du paquet, qui est en général la même que la version de l'archive source principale. La version est en général composée de deux ou trois nombres séparés par un point comme 1.2 ou 4.5.2 (cependant des séquences plus longues sont supportées) et peut avoir une lettre seule, qui suit le dernier chiffre ; par exemple 1.4b ou 2.6h. La version du paquet est liée au nom du paquet par un trait d'union. Par exemple foo-1.0, bar-2.4.6, etc.

Si vous pensez utiliser une lettre à la fin de la version du paquet, n'oubliez pas que ce caractère ne doit pas être utilisé pour signifier le statut alpha ou beta d'un paquet, dans la mesure ou les alpha et beta sont des pré-sorties et les révisions ultérieures sont des nouvelles versions. C'est une distinction importante, car Portage utilise le numéro de version des ebuilds pour déterminer si il est plus récent ou plus vieux que les autres paquets d'une même catégorie et d'un même nom. C'est très important d'avoir des noms de version représentant fidèlement la version du paquet, afin que Portage puisse vérifier correctement les dépendances entre les paquets.

La troisième partie (optionnelle) contient un suffixe spécial : au choix _alpha, _beta, _pre (pré-sortie), _rc (candidat à une sortie) ou _p (correctif). Ils sont toujours suivi directement d'un nombre. Par exemple linux-2.4.0_pre10. Pour une version identique (voir la deuxième partie du nom d'un ebuild) un paquet _alpha est plus vieux qu'un paquet _beta, un _beta est plus vieux qu'un _pre, un _pre est plus vieux qu'un _rc, et un _rc est plus vieux que le même paquet sans suffixe. Un paquet sans suffixe est plus vieux qu'un paquet avec _p. Cette partie est utilisée uniquement pour signaler une mise à jour dans une même version.

Un paquet _rc est plus vieux qu'un paquet sans suffixe avec soulignement (par exemple linux-2.4.0), et linux-2.4.0 est plus vieux qu'un paquet avec un suffixe à une seule lettre, par exemple linux-2.4.0b. Comme vous vous y attendez, le paquet linux-2.4.0b est considéré comme plus vieux que linux-2.4.0c. Encore une fois, les informations sur la version sont importantes, car Portage les utilise de manière interne pour déterminer si un paquet ou un ebuild est plus récent qu'un autre, pour une catégorie et un nom donnés.

La quatrième partie (encore optionnelle) d'un nom de paquet est le numéro de révision spécifique à Gentoo, qui est spécifié par un -r#, où # est un entier, par exemple paquet-4.5.3-r3. Ce numéro de révision est indépendant de la version de l'archive source, et est utilisé pour informer les utilisateurs qu'une nouvelle révision ou amélioration de la part de Gentoo est disponible pour un certain paquet.

Si vous faites des améliorations non triviales dans un fichier ebuild déjà existant, vous devez copier le fichier ebuild dans un nouveau fichier, avec un numéro de révision augmenté de 1. Les sorties initiales n'ont en général pas de numéro de révision, par exemple paquet-4.5.3 et sont considérés par Portage comme ayant un numéro de révision de 0. Cela signifie que le décompte se fait comme suit : 1.0 (version initiale), 1.0-r1, 1.0-r2, etc. N'oubliez jamais de laisser une mention de vos modifications dans le fichier ChangeLog, vous pourriez avoir de sérieux problèmes si vous ne le faites pas (par exemple votre accès CVS pourrait être révoqué).

Et évidemment nous avons une cinquième partie dans le nom de l'ebuild... l'extension .ebuild elle-même.

Le contenu d'un fichier ebuild Cette partie est une introduction aux ebuilds. Pour une liste complète de toutes les possibilités d'un ebuild, il existe une page de manuel qui détaille le format interne les variables et les fonctions qu'on peut trouver dans un script ebuild :man 5 ebuild.

Les variables

La première partie de tous les fichiers ebuild est constituée d'un certain nombre de variables. Elles sont placées dans trois catégories qui sont :

  • READ : les variables que vous pouvez utiliser mais qui ne sont jamais déclarées ;
  • MUST : les variables que vous devez toujours déclarer ;
  • OPT : les variables que vous pouvez déclarer.
PREADLe nom et la version du paquetPNREADLe nom du paquetPVREADLa version du paquetPRREAD Contient le numéro de révision ou r0 si aucun numéro de révision n'existe. PVRREADContient le numéro de version avec la révision.PFREADContient le nom complet du paquet ${PN}-${PVR}.AREAD Liste séparée par des espaces, des fichiers dans SRC_URI. Elle ne contient pas les directions URL, juste le nom de fichier. DISTDIRREAD Contient la direction du répertoire distfiles où sont mis tous les fichiers récupérés pour un paquet. C'est en général /usr/portage/distfiles. FILESDIRREAD Contient la direction vers le sous-répertoire files/ dans l'emplacement spécifique du paquet dans l'arbre de Portage. Ne modifiez pas cette variable. WORKDIRREAD Base de la racine de travail pour un ebuild. Rien ne doit être construit hors de ce répertoire. SOPT Le répertoire source pour votre paquet, en général ${WORKDIR}/${P}. Portage va prendre cette valeur par défaut donc vous n'avez probablement pas besoin de l'initialiser. TREAD Le répertoire temporaire pour votre paquet. Il est utilisé lors de l'exécution de l'ebuild à la manière du répertoire /tmp mais est virtuel. DREAD Le répertoire racine où le paquet devra être installé. Considérez-le comme une racine d'arborescence (/) virtuelle. SLOTMUST Portage manipule souvent plusieurs versions d'un même programme installées. Par exemple vous pouvez avoir GCC 2.95 et GCC 3.2 installés en même temps sur votre machine. Vous devez alors spécifier le SLOT dans chaque ebuild. Ici nous prendrions pour le SLOT de GCC 2.95 la valeur 2 alors que nous aurions utilisé la valeur 3 pour le SLOT de GCC 3.2.
Note : utiliser 0 comme valeur du SLOT signifie que le paquet n'a qu'un seul SLOT possible (en d'autres termes, ce paquet n'est pas « SLOTable »).
LICENSEMUST Cette variable spécifie la licence du programme, par exemple GPL-2, BSD, etc. Ce champ doit être initialisé à une valeur de licence valide (qui peut être n'importe quelle licence présente dans le répertoire /usr/portage/license/). Si la licence n'y est pas encore répertoriée, elle doit être ajoutée avant d'ajouter l'ebuild à l'arbre de Portage. KEYWORDSMUST Cette variable remplie désormais un certain nombre de rôles. Tout d'abord, elle spécifie la cible de l'ebuild en matière d'architecture. Les mots-clefs incluent : x86, ppc, sparc, mips, alpha, arm, hppa, amd64, ia64 (NdT : cette liste n'est pas à jour, de nouveaux mots-clefs ont été ajoutés récemment). Évidemment, vous utiliserez ceci pour indiquer l'architecture de la machine cible. Portage n'autorisera pas une machine x86 à construire autre chose que des ebuilds dont le mot-clef x86 est spécifié dans la variable KEYWORDS. Les paquets qui ne supportent pas une architecture nativement, sont automatiquement masqués par Portage. Si le paramètre KEYWORDS est précédé d'un ~, alors cela indique que l'ebuild fonctionne, mais nécessite encore plusieurs tests dans différents environnements avant d'être placé dans un profil stable avec le mot-clef associé. Si rien ne précède le KEYWORDS alors le paquet est considéré comme stable. Vous pouvez autoriser l'installation de ces différents types de paquets à travers l'utilisation de la variable ACCEPT_KEYWORDS dans make.conf, ou dans le fichier /etc/portage/package.keywords. DESCRIPTIONMUSTUne courte et unique ligne de description de votre paquet.SRC_URIMUST Les liens pour chaque fichier source de votre paquet, en les séparant d'u espace. Normalement, le premier devrait ressembler à "ftp://ftp.compagnie.com/pub/unpaquet/${P}.tar.bz2". HOMEPAGEMUST La page Internet dédiée au paquet. Si vous n'arrivez pas à trouver la page officielle, essayez de trouver un lien depuis le site freshmeat.net ou un site de traçage de paquets similaires. IUSEMUST Cette variable contient les paramètres USE que votre paquet utilise. Souvenez-vous que KEYWORDS ne doit pas y être listé ! DEPENDOPT Les dépendances de construction du paquet sont listées ici. Lire la section sur les dépendances de paquets pour plus de détails sur la syntaxe. RDEPENDOPT Les dépendances d'exécution du paquet sont listées ici. Encore une fois lire la section sur les dépendances de paquets pour plus de détails sur la syntaxe.
Variable Utilisation Description

Les fonctions

Il existe un certain nombre de fonctions que vous pouvez définir dans vos fichiers ebuilds, qui contrôlent la construction et le processus d'installation de votre paquet.

pkg_setup Utilisez cette fonction pour effectuer n'importe quel type de tâche qui soit un pré-requis à la construction. Cela inclue la vérification de l'existence d'un fichier de configuration par exemple. S'il est nécessaire de créer des utilisateurs ici, vous devez également faire une vérification dans la fonction pkg_preinst() avant que le paquet ne s'installe. pkg_nofetch Informe l'utilisateur des actions manuelles nécessaires si pour une raison ou pour une autre (comme par exemple des conditions liées à la licence) les sources ne seraient pas récupérables automatiquement par Portage lors du processus normal d'installation. Utilisez-le en conjonction avec RESTRICT="fetch". Vous ne devez que faire un affichage de messages avec cette fonction, jamais d'appel à la fonction die. src_unpack Utilisez cette fonction pour désarchiver les sources et les correctifs, et pour lancer des programmes auxiliaires, comme par exemple autotools. Par défaut, cette fonction désarchive les paquets listés dans A. Le répertoire de travail initial est définit par WORKDIR. src_compile Utilisez cette fonction pour configurer et construire le paquet. Le répertoire initial de travail est S. src_install Utilisez cette fonction pour installer le paquet dans une image dans D. Si le paquet utilise automake, vous pouvez simplement effectuer un make DESTDIR=${D} install. Assurez-vous que votre paquet installe tous ses fichiers en utilisant D comme racine ! Le répertoire initial de travail est S. src_test Cette fonction n'est exécuté que si vous avez fait initialisé la variable FEATURES="maketest" et si RESTRICT="maketest" n'est pas mis. La fonction par défaut exécutera une fonction de test disponible dans n'importe quel fichier Makefiles dans le répertoire ${C}, en lançant au choix "make test" ou "make check", selon la fonction disponible. Ce comportement par défaut peut être remplacé par une fonction de test faite sur mesure. pkg_preinst Les commandes dans cette fonction sont lancées juste avant la fusion de l'image du paquet dans le système de fichier. pkg_postinst Les commandes dans cette fonction sont lancées juste après la fusion de votre image de paquet dans le système de fichier. pkg_prerm Les commandes dans cette fonction sont lancées juste avant la suppression d'un paquet du système de fichier. pkg_postrm Les commandes dans cette fonction sont lancées juste après la suppression d'un paquet du système de fichier. pkg_config Vous utiliserez cette fonction pour mettre en oeuvre une configuration initiale d'un paquet après qu'il ait été installé. Toutes les directions de répertoire dans cette fonction doivent être préfixées de ROOT. Cette fonction n'est uniquement exécutée que si l'utilisateur lance : ebuild /var/db/pkg/${CATEGORY}/${PF}/${PF}.ebuild config.
Fonction Objectif

Les fonctions d'aide

Vous pouvez également utiliser les fonctions d'aide suivantes dans vos ebuilds.

use Vérifier si un ou plus des paramètres USE sont définis. Si c'est le cas, la fonction retournera les paramètres qui existent dans USE. Cette possibilité va bientôt être modifiée, et use ne retournera rien, mais usev continuera à retourner les paramètres. Pour vérifier l'existence d'un paramètre USE, vous pouvez utiliser use foobar. has_version Retourne 1 si le système a la version requise d'un certain paquet. Utilisez-le ainsi : has_version >=sys-libs/glibc-2.3.0. best_version Retourne le couple categorie/paquet-version d'un couple categorie/paquet demandé. Utilisez-le ainsi : best_version x11-libs/gtk+extra. use_with Cette fonction vérifie si un paramètre USE a été définit, et retourne "--with-foobar" ou "--without-foobar" selon le cas. Si vous ne donnez qu'un seul argument, cet argument sera à la fois paramètre USE et with(out)-string. Sinon le premier argument sera le paramètre USE, et le second sera le with(out)-string. Par exemple, use_with truetype freetype retournera "--with-freetype" si truetype est dans les paramètres USE. use_enable Même fonction que use_with, mais retourne "--enable-foobar" ou "--disable-foobar" selon le cas. check_KV Vérifie si Portage connaît la version du noyau. Si non, cette fonction retourne une erreur et se termine immédiatement. Si vous avez besoin d'un version de noyau dans votre script, utilisez la variableKV qui est automatiquement définie par Portage. Sur un système utilisant gentoo-sources-2.4.20-r6, KV devra avoir la valeur "2.4.20". keepdir Crée (si besoin) un fichier .keep dans un répertoire donné, afin qu'il ne soit pas supprimé automatiquement. Ne jamais créer de fichier .keep soi-même. Si Portage change le fonctionnement de keepdir, créer un tel fichier soi-même pourrait casser le paquet. econf Exécute ./configure avec les changements de répertoires nécessaires (prefix, host, mandir, infodir, datadir, sysconfdir, localstatedir). Vous pouvez lui passer de manière optionnelle des arguments supplémentaires pour ./configure en les donnant lors de l'appel d'econf, et les utilisateurs peuvent utiliser également la variable EXTRA_ECONF si ils en ont besoin. Les options passées à configure sont passées dans l'ordre inverse à celui dans lequel elles ont été données à econf. En d'autres termes, le premier argument passé sera toujours remplacé par le dernier. einstall Exécute make install avec les bons changements de répertoires (prefix, host, mandir, infodir, datadir, sysconfdir, localstatedir). Encore une fois, vous pouvez donner des arguments supplémentaires à la commande make en les donnant directement comme paramètres à einstall. Notez que la méthode utilisée de manière préférentielle pour installer un paquet est d'utiliser la commande make install DESTDIR=${D} et non einstall. Cette commande n'est en fait qu'un moyen pour écrire par dessus un fichier make cassé. die Avorte le processus en cours. Il indiquera à l'utilisateur les données passées en argument, comme une raison d'avortement. Ne pas négliger l'utilisation de message passés en arguments à die si vous faites plusieurs appels à die dans une même fonction par exemple. Si vous n'en utilisez pas, il sera plus dur de rechercher une erreur car vous ne pourrez pas être sûr de savoir le paquet a échoué. einfo Informe l'utilisateur d'un événement important. L'argument passé à einfo est le message qui sera donné à l'utilisateur. N'utilisez pas einfo pour afficher des bannières comme "*************************************". Le fait même d'utiliser einfo est suffisant pour attirer l'attention de l'utilisateur.
Fonction Objectif

Fonctions d'aide proposées par eutils.eclass

Vous pouvez utiliser les fonctions d'aide suivantes, qui sont proposées par l'eclass "eutils" de vos ebuilds. Vous devez vous assurer que inherit eutils est présent dans votre ebuild pour pouvoir utiliser ces fonctions.

draw_line Cette fonction affiche une liste de « = » ayant la longueur de l'entrée de la fonction. epatch Cette fonction ressemble un peu à la commande patchmais a l'avantage de fonctionner avec des correctifs aux formats .bz2, .gz, .zip et fichier texte. Vous n'avez pas besoin de lui spécifier une option "-p", toutes les options qui ont besoin d'être passées de manière explicite à la fonction doivent être mises dans EPATCH_OPTS. La fonction prend pour argument soit un fichier, soit un répertoire -si vous lui donnez un répertoire, tous les correctifs de la forme « ??_${ARCH}_... » seront appliqués. Pour qu'un correctif soit appliqué, il doit correspondre à l'architecture spécifiée, ou avoir « _all_ » dans son nom (pour toutes les supporter) ou initialiser EPATCH_FORCE à "yes". gen_usr_ldscript Cette fonction génère des scripts de liens dans /usr/lib pour les bibliothèques dynamiques dans /lib. Cela résoud les problèmes de liens, lorsqu'un .so est dans /lib alors qu'un .a est dans /usr/lib. have_NPTL Retourne 0 si le système utilise l'implémentation des pthreads NPTL. get_number_of_jobs Cette fonction vérifie le nombre de processeurs présents et ajoute dans MAKEOPTS l'option correcte -jX correspondante. mymktemp Cette fonction effectuera un appel à mktemp si elle existe, ou agira comme un remplacement à mktemp quand elle n'existe pas. edos2unix Cette fonction effectue la même tâche que le binaire dos2unix. egetent egetent est une abstraction de getent sous Linux, ou nidump sous Mac OS X. enewuser Crée un nouvel utilisateur. Cette fonction prend pour argument obligatoire le nom d'utilisateur, et un certain nombre d'arguments optionnels peuvent lui être spécifiés : $2 contient un UID. Mettre -1 pour que l'UID prenne la prochaine ID disponible. $3 contient un shell, avec /bin/false comme shell par défaut. $4 contient le répertoire utilisateur, avec /dev/null comme répertoire par défaut. $5 contient tous les groupes auquel l'utilisateur doit être ajouté, vide par défaut, et $6 contient un commentaire. Par défaut, le commentaire sera « added by portage for ${PN} ». enewgroup Ajoute un nouveau groupe. Cette fonction prend pour paramètre obligatoire le nom du groupe, et comme paramètre optionnel, on peut lui indiquer le GID souhaité pour ce groupe. make_desktop_entry Crée une entrée de bureau : le premier argument contient le répertoire qui mène au binaire. De manière optionnelle le second argument contient le nom pour l'icône -par défaut, ${PN} ; le troisième argument peut contenir la direction d'une icône à partir de /usr/share/pixmaps ou en donnant la direction complète à partir de la racine -par défaut, ${PN}.png ; le quatrième peut contenir une catégorie d'application, et enfin le cinquième argument (optionnel) contient la direction de lancement de l'application. check_license Affiche une licence que l'utilisateur devra accepter. Si aucun argument n'est donné à la fonction, la licence spécifiée sera celle donnée par ${LICENSE}. unpack_pdv Désarchive une archive générée avec pdv. Le premier argument doit contenir le fichier à désarchiver, et le second devrait contenir « off_t » qui doit être généré manuellement : strace -elseek${file} et pour obtenir quelque chose du genre « lseek(3, -4, SEEK_END) » vous devriez lui passer comme valeur « 4 ». unpack_makeself Désarchive une archive créée avec makeself. L'argument nécessaire sera le nom du fichier à désarchiver. cdrom_get_cds Essaye d'obtenir un CD, qui possède les fichiers spécifiés en argument, et qui est monté sur ${CDROM_ROOT}. cdrom_load_next_cd Charge le CD suivant une fois que vous en avez fini avec le premier CD. Si la fonction est lancée, ${CDROM_ROOT} devra pointer vers le CD suivant. strip-linguas Cette fonction s'assure que LINGUAS contient uniquement les langues que le paquet peut supporter, spécifées en arguments à la fonction. Si le premier argument est -i, alors la liste des fichiers .po dans les répertoires spécifiés est construite et la conjonction des deux listes présentes est utilisée. Si en premier argument est donné -u, alors la liste des fichiers .po des répertoires spécifiés est construite et l'union des listes est utilisée.
Fonction Objectif

Fonctions d'aide proposées par flag-o-matic.eclass

Vous pouvez utiliser les fonctions d'aide suivantes, qui sont proposées par l'eclass « flag-o-matic » dans vos ebuilds. Vous devez vous assurer que inherit flag-o-matic est présent pour que ces fonctions puissent fonctionner. Vous ne devez pas modifier les configurations des compilateurs directement, à la place, utilisez flag-o-matic pour effectuer toutes les actions, comme par exemple filtrer les paramètres qui posent problèmes.

filter-flags Cette fonction supprime un paramètre particulier de C[XX]FLAGS. Seuls les paramètres complets sont vérifiés. append-flags Cette fonction ajoute un paramètre supplémentaire à ceux définis dans les variables C[XX]FLAGS. replace-flags Cette fonction remplace un paramètre spécifié en premier argument par un autre donné en second argument, dans les variables actuelles de C[XX]FLAGS. replace-cpu-flags Remplace tous les paramètres -march=... ou -mcpu=... qui contiennent le second argument, par le premier. replace-sparc64-flags Cette fonction établi le paramètre -mcpu=... pour les SPARC v8 et utilise la valeur d'origine pour -mtune, si aucune valeur n'est encore spécifiée ici. strip-flags Enlève tous les paramètres, sauf ceux spécifiés dans ALLOWED_FLAGS. strip-unsupported-flags Enlève de C[XX]FLAGS tous les paramètres non supportés par la version utilisée de GCC. get-flag Trouve un paramètre, et retourne sa valeur. is-flag Retourne vrai si le paramètre est déclaré dans les variables actuelles C[XX]FLAGS. Cette fonction ne fait que des vérifications de paramètres complets. append-ldflags Cette fonction ajoute des paramètres supplémentaires à la variable LDFLAGS. filter-ldflags Enlève les paramètres spécifiés de LDFLAGS, et ne vérifie que les paramètres complets. fstack-flags Utilise -fno-stack-protector, ce qui supprime -fstack-protector et -fstack-protector-all.
Fonction Objectif
Règles à utiliser pour écrire un fichier ebuild

Dans la mesure où les fichiers ebuilds ne sont effectivement que des scripts shell, vous devriez pouvoir utiliser le mode d'écriture de scripts shell de votre éditeur pour les créer et modifier. Vous devez utiliser une indentation correcte, en n'utilisant que des tabulations (pas d'espaces). Assurez-vous que votre éditeur affiche les tabulations à moins de quatre espaces. Toujours s'assurer que vous utilisez des crochets pour encadrer les variables d'environnement. Par exemple, ${P} au lieu de simplement $P.

Les longues lignes sont coupées avec des « \ », comme par exemple :

./configure \
--prefix=/usr || die "configure failed"

Pour plus de détails, référez-vous à skel.ebuild (en général il se trouve dans /usr/portage).

Si vous utilisez Vim pour éditer des ebuild ou eclass, le fichier par défaut de vimrc, /etc/vim/vimrc, s'assure déjà de la correcte indentation, et des configurations concernant le type de fichier des ebuild et eclass existe. Pour de meilleurs résultats, comme par exemple avoir une coloration syntaxique spécifique aux mots-clefs des ebuilds, installez app-vim/gentoo-syntax.

Sur les systèmes non Gentoo, vous pouvez obtenir des résultats similaires en utilisant les lignes suivantes dans votre vimrc, ou mieux en installant les scripts gentoo-syntax.

au BufRead,BufNewFile *.e{build,class} let is_bash=1|setfiletype sh
au BufRead,BufNewFile *.e{build,class} set ts=4 sw=4 noexpandtab

Si vous utilisez emacs, vous pouvez ajouter les lignes suivantes à la fin de votre fichier .emacsrc (pour GNU Emacs) ou init.el (pour XEmacs) pour vous assurer d'utiliser une configuration correcte lors de l'édition de tout ce qui est lité à Gentoo :

(defun ebuild-mode ()
  (shell-script-mode)
  (sh-set-shell "bash")
  (make-local-variable 'tab-width)
  (setq tab-width 4))
(setq auto-mode-alist (cons '("\\.ebuild$" . ebuild-mode) auto-mode-alist))
(setq auto-mode-alist (cons '("\\.eclass$" . ebuild-mode) auto-mode-alist))

Si vous utilisez nano, alors vous avez de la chance ! Éditez simplement /etc/nanorc et décommentez la section liée aux ebuilds.

Les paramètres USE

L'objectif des variables USE est de vous permettre de configurer Portage et de généraliser et automatiser l'utilisation ou la non utilisation de certaines options de compilation. Voici un exemple. Imaginons que vous soyez un fan de GNOME et vous voulez que tous les ebuilds qui ont comme option de compilation (optionnel) GNOME le supporte effectivement. Alors vous ajouteriez gnome à votre variable USE dans /etc/make.conf, et Portage ajoutera automatiquement les possibilités optionnelles de GNOME dans vos ebuilds, si elles sont disponibles. Sinon, si vous ne voulez pas des options GNOME dans vos ebuilds, alors qu'elles sont disponibles, éditez tout simplement /etc/make.conf et assurez-vous que gnome n'est pas présent dans la variable USE. Gentoo a un nombre conséquent de paramètres USE, vous permettant d'obtenir un système configuré exactement comme vous le souhaiteriez. De plus vous pouvez désormais utiliser un paramètre USE que pour certains paquets, en éditant le fichier /etc/portage/package.use.

Si vous enlevez un paramètre USE (par exemple, enlever gnome de USE), cela ne fera que préciser à Portage de ne pas activer le support optionnel de GNOME dans vos paquets. Cela dit, si vous installez un ebuild qui nécessite GNOME, alors le paquet aura évidemment le support de GNOME activé, comme vous pouviez vous en douter. Cela signifie également que GNOME sera installé automatiquement (en tant que dépendance) s'il ne l'était pas encore. C'est pourquoi c'est toujours une bonne idée de faire un emerge --pretend (ou mieux emerge --ask) avant de procéder à l'installation effective. De cette manière, vous saurez exactement ce qui sera installé par emerge.

Dans vos propres ebuilds, vous pouvez vérifier si un paramètre USE est présent ou non en utilisant la commande use <variable>. La commande use affiche <variable> si celle-ci est présente dans les USE de l'utilisateur. Vous pouvez l'utiliser comme suit :

if use X; then
  # Commands specific to X...
fi

Les paramètres USE peuvent également être utilisés pour définir des dépendances. Par exemple, vous voulez qu'un paquet soit nécessaire si un paramètre USE précis est utilisé. Cela se fait en utilisant la syntaxe param? (macategorie/monpaquet) dans la variable DEPEND de votre ebuild. Dans cet exemple, macategorie/monpaquet ne seront requis que si param est présent dans USE. Il est également possible de spécifier une dépendance qui devrait être honorée si un certain paramètre USE est présent, et quelle dépendance devrait être utilisée si il n'est pas présent. Cela se fait ainsi : param? (macat/monpaquet) et !param? (autrecat/autrepaquet ). Dans ce cas, si param n'est pas présent, autrecat/autrepaquet sera utilisé à la place de macat/monpaquet. Assurez-vous que vos ebuilds utilisent cette syntaxe et non pas une boucle conditionnelle BASH. Les conditions BASH interfèrent avec le cache des dépendances de Portage, et l'utilisation de celles-ci casserait votre ebuild.

Voici un petit point important sur comment utiliser USE. La plupart du temps, un paquet aura un script ./configure utilisé pour effectuer les diverses étapes de configuration. En général, si votre ebuild utilise ./configure, toutes les fonctionnalités optionnelles seront activées ou désactivées en passant les bons arguments à la commande ./configure. Voici le meilleur moyen de se débarrasser de ce problème :

DEPEND="X?       ( >=x11-base/xfree-4.3 )
       mysql?    ( >=dev-db/mysql-3.23.49 )
       apache2?  ( >=net-www/apache-2 )
       !apache2? ( =net-www/apache-1* )"

src_compile() {
  econf \
    `use_enable X x11` \
    `use_enable mysql` \
    || die "Error: econf failed!"
  emake || die "Error: emake failed!"
}

Cette méthode produit un très bon résultat. Nous n'avons pas à nous préoccuper de savoir quels sont les configurations par défaut pour mysql ou X (activé/désactivé), nous indiquons explicitement à econf ce que nous voulons qu'il fasse, d'après ce que l'on a dans les paramètres USE. En plus, vous obtenez un code propre et facile à lire :).

Pour avoir une table mise à jour en permanence des paramètres USE, voyez ce lien.

Emplacements des systèmes de fichiers Introduction à FHS

Les standards de couche de systèmes de fichiers utilisés dans Gentoo Linux suivent de près le système FHS (pour File system Hierarchy Standard, standard de hiérarchie dans les systèmes de fichiers). Une description simplifiée de ce standard vous est proposée dans ce chapitre ; pour avoir les spécifications complètes, vous pouvez consulter le site pathname.

La hiérarchie /opt est donnée dans la section 3.12 du FHS. La section 4.4 s'occupe de ce qui concerne le répertoire /usr/X11R6. KDE et GNOME ne sont pas précisés dans le standard, et ne sont en fait même pas mentionnés dans la version actuelle de FHS.
Comment placer vos paquets dans le système de fichiers

Normalement, si le paquet utilise autoconf et automake, les destinations par défaut de l'installation du paquet sont en général correctes, à quelques exceptions près :

  • Si vous installez un programme dans /bin, /sbin, /usr/bin, ou /usr/sbin, alors les pages de manuel correspondant à votre programme devraient être installées dans le répertoire /usr/share/man. Cela peut se faire en général en le spécifiant dans l'ebuild avec la ligne ./configure --mandir=/usr/share/man.
  • Les fichiers info GNU doivent toujours être installés dans /usr/share/info, même si les fichiers info sont à propos de programmes et outils spécifiques à X11, GNOME ou KDE. Faites bien attention. /usr/share/info est l'unique emplacement officiel pour les fichiers info GNU. Dans la mesure où plusieurs scripts ./configure installent pas défaut les fichiers info GNU dans /usr/info, il est souvent nécessaire de faire un appel à ./configure avec pour argument --infodir=/usr/share/info.
  • Les fichiers de documentation sont installés dans /usr/share/doc, dans un sous-répertoire reflétant le nom, la version et la révision d'un programme particulier. Cela s'applique à tous les programmes : GNOME, KDE, X11 etc. Cependant, certains programmes installeront de la documentation supplémentaire et les placeront dans la hiérarchie /usr/share pour leurs propres besoins.
  • Les programmes et bibliothèques spécifiques à X11 doivent toujours être installés dans /usr et non directement dans /usr/X11R6. Nous réservons la hiérarchie /usr/X11R6 pour le système de fenêtre X, version 11, sortie R6 en personne. D'autres distributions feront probablement une interprétation différente du FHS concernant cette hiérarchie.
  • Les programmes GNOME et KDE, de la même manière, doivent être installés dans /usr.
Certaines distributions choisissent d'installer GNOME et KDE dans /opt. Il n'existe aucun standard pour ces environnements de bureau concernant l'endroit où doivent être installés leurs fichiers. Dans une optique de simplicité et de consistance, nous avons choisi d'installer tous les paquets KDE et GNOME dans la hiérarchie /usr.

En général, vos ebuilds doivent installer leurs fichiers dans l'arborescence /usr. Quelques programmes peuvent être compilés et liés avec ou non des bibliothèques de GNOME, KDE, X11, ce qui peut occasionner un peu de confusion. Notre solution consiste à tout installer dans /usr, ce qui empêche les ambiguïtés et évitent une complexité inutile pour les auteurs d'ebuilds. L'emplacement dans lequel doivent être installés les fichiers d'un programme ne doit pas dépendre de la présence ou non de paramètres USE. Du coup, les ebuilds dans l'arbre de Portage s'installent presque toujours dans la hiérarchie /usr exclusivement.

Le répertoire /opt est réservé dans Gentoo aux paquets uniquement binaires. Par exemple, mozilla-bin, acroread, netscape et realplayer. Les paquets installés ici auront en général un fichier d'ébauche /etc/env.d/foo. Cela a pour objectif d'inclure dans l'environnement les répertoires et les variables additionnelles nécessaires. Pour plus d'informations sur /etc/env.d, lisez ce document.
Les scripts et utilitaires de Portage Scripts publiques

Il existe des scripts permettant à un administrateur système d'installer ou supprimer les paquets, et de maintenir à jour la base de données des paquets.

ebuild est l'outil de base du système de Portage : il effectue toutes les tâches principales comme par exemple désarchiver, compiler, installer, fusionner, désinstaller les paquets. Il est appelé en utilisant la commande : ebuild dir/vers/paquet.ebuild commande. Les commandes disponibles sont :

setup* Effectue toutes les commandes nécessaires avant qu'un ebuild ne commence son travail effectif. pkg_setupdepend Affiche les dépendances requises à la construction du paquet. N/Amerge* Désarchive, compile, installe et fusionne le paquet dans le système de fichiers. N/Aqmerge* Fusionne le paquet dans le système de fichiers, en supposant que le désarchivage, la compilation et l'installation ont déjà été exécutés. N/Aunpack* Désarchive une archive source dans le répertoire de travail. src_unpackcompile*Compile le paquet.src_compilerpmCrée un RPM à partir du paquet.N/ApackageCrée un paquet Gentoo tbz2.N/Aprerm*Exécute une étape de pré-suppression de paquet.pkg_prermpostrm*Exécute une étape de post-suppression de paquet.pkg_postrmpreinst*Exécute une étape de pré-installation du paquet.pkg_preinstpostinst*Exécute une étape de post-installation du paquet.pkg_postinstconfig Met en place une configuration par défaut, une fois que le paquet a été fusionné. pkg_configtouch* Met à jour l'attribut mtimes pour chaque archive source dans un paquet. N/Aclean*Nettoie le répertoire de travail pour un paquet.N/Afetch*Récupère les archives sources du paquet.N/Adigest*Crpee un fichier digest pour un paquet.N/Ainstall*Installe le paquet dans le répertoire image.src_installunmergeDésinstalle le paquet du système de fichiers.N/A
Commande Description Fonction ebuild associée
Les commandes avec une astérisque (*) ne sont en généralement utilisées que par le développeur.

emerge installe de manière récursive le paquet et toutes ses dépendances dans le système de fichiers. Cette commande a de nombreuses options, faites un emerge --help pour en avoir la liste.

env-update met à jour les fichiers de configuration (entre autres mais pas seulement : /etc/ld.so.conf et /etc/profile.env) pour inclure les changements effectués par les paquets installés.

Scripts et commandes privés

Il existe des scripts que vous pouvez utiliser dans vos fichiers ebuilds pour réaliser des taches communes.

Si vous voulez un aperçu, jetez un oeil aux scripts en eux-même dans /usr/lib/portage/bin.

diropts-m0755Fixe les options utilisées lors de l'utilisation de dodir.diropts -m0750dobinN/AInstalle les binaires spécifiés dans DESTTREE/bin.dobin wmacpidocinto"" Fixe le sous-répertoire relatif utilisé par dodoc (DOCDESTREE). docinto exemplesdodirN/ACrée un répertoire, en utilisant de manière transparente ${D}.dodir /usr/lib/nouveaupaquetdodocN/A Installe les fichiers spécifiés dans le répertoire de documentation du paquet en question (/usr/share/doc/${PF}/DOCDESTTREE) (voir docinto). dodoc README *.txtdoexeN/A Installe les fichiers spécifiés avec le mode EXEOPTIONS (voir exeopts) dans EXEDESTTREE (voir exeinto). doexe ${FILESDIR}/quake3dohardN/ACrée un lien dur, en utilisant de manière transparente ${D}.dohard ls /bin/dirdohtmlN/A Installe les fichiers spécifiés et les répertoires dans /usr/share/doc/${PF}/html. dohtml -r doc/html/*doinfoN/A Installe les fichiers spécifiés dans /usr/share/info, puis les compresse avec gzip. doinfo doc/*.infodoinsN/A Installe les fichiers spécifiés avec le mode INSOPTIONS (voir insopts) dans INSDESTTREE (voir insinto). doins *.png icone.xpmdolibN/A Installe les bilbiothèques spécifiées dans DESTTREE/lib avec le mode 0644. dolib *.a *.sodolib.aN/A Installe les bibliothèques spécifées dans DESTTREE/lib avec le mode 0644. dolib.a *.adolib.soN/A Installe les bibliothèques spécifées dans DESTTREE/lib avec le mode 0755. dolib.so *.sodomanN/A Installe les fichiers spécifiés dans /usr/share/man/manX, selont le suffixe du fichier (file.1 ira dans man1). doman *.1 *.5dosbinN/A Installe les fichiers dans DESTTREE/sbin, en s'assurant qu'ils sont exécutables. dosbin ksymoopsdosymN/ACrée un lien symbolique, en utilisant ${D} de manière transparente.dosym gzip /bin/zcatemakeN/A Exécute make avec MAKEOPTS. Certains paquets ne peuvent pas être faits en parallèle. Utilisez emake -j1 pour y échapper. Si vous devez passer des arguments supplémentaires à make, donnez-les simplement à la commande emake. Les utilisateurs peuvent utiliser la variable d'environnement EXTRA_EMAKE pour passer des paramètres supplémentaires à emake. emakeexeinto/Fixe la racine (EXEDESTTREE) pour la commande doexe.exeinto /usr/lib/${PN}exeopts-m0755Fixe les options utilisées lors de l'utilisation de doexe.exeopts -m1770fownersN/A Applique l'appartenance spécifique d'un fichier à un utilisateur, en utilisant la commande chown, et en utilisant ${D} de manière transparente. fowners root:root /sbin/fonctions.shfpermsN/A Applique les permissions spécifiques à un fichier spécifique via la commande chmod, en utilisant ${D} de manière transparente. fperms 700 /var/consolesinsinto/usrFixe la racine (INSDESTTREE) pour la commande doins.insinto /usr/includeinsopts-m0644Fixe les options utilisées lors du lancement de doins.insopts -m0444into/usr Fixe le préfixe de la cible (DESTTREE) pour toutes les commandes 'do' (comme dobin, dolib, dolib.a, dolib.so, domo, dosbin). into /libopts-m0644Fixe les options utilisées lors de l'exécution de dolib.libopts -m0555newbinN/A Couche supplémentaire à dobin qui installe le binaire spécifié et le renomme de manière transparente au second argument. newbin ${FILESDIR}/vmware.sh vmwarenewdocN/A Surcouche de dodoc qui installe le fichier spécifié et le renomme de manière transparente au second argument. newdoc README README.openglnewexeN/A Surcouche de doexe qui installe le fichier spécifié et le renomme de manière transparente au second argument. newexe ${FILESDIR}/xinetd.rc xinetdnewinsN/A Surcouche de doins qui installe le fichier spécifié et le renomme de manière transparente au second argument. newins ntp.conf.example ntp.confnewmanN/A Surcouche de doman qui installe le fichier spécifié et le renomme de manière transparente au second argument. newman xboing.man xboing.6newsbinN/A Surcouche de dosbin qui installe le fichier spécifié et le renomme de manière transparente au second argument. newsbin strings strings-staticprepallN/A Exécute prepallman, prepallinfo et prepallstrip. Cette fonction s'assure de plus que toutes les bibliothèques dans /opt/*/lib, /lib, /usr/lib et /usr/X11R6/lib sont exécutables. Enfin, déplace et isole les macros aclocal dans /usr/share/aclocal. prepallprepalldocsN/A Archive de manière récursive avec gzip tous les fichiers de documentation dans /usr/share/doc, en tenant compte de manière transparente des directions de liens symboliques. prepalldocsprepallinfoN/A Archive de manière récursive avec gzip tous les fichiers info dans /usr/share/info. prepallinfoprepallmanN/A Archive de manière récursive avec gzip toutes les pages man (de manuel) dans /opt/*/man/*, /usr/share/man/*, /usr/local/man/*, /usr/X11R6/share/man/* et s'occupe de manière transparente de toutes les directions de liens symboliques. prepallman
Commande Valeur par défaut Description Exemple
Les dépendances de paquet Pourquoi les dépendances sont importantes

Portage est plus qu'un simple script qui vous permet d'unifier la méthode d'installation d'un projet quelconque (programme, bibliothèque) à partir des sources. Il récupère et installe également toutes les dépendances nécessaires si vous les spécifiez correctement dans votre ebuild.

Dans les ebuilds officiels, toutes les dépendances ont été spécifiées, de telle manière que si vous exécutez emerge net-www/mozilla/mozilla-1.0, Portage s'assurera que toutes les bibliothèques nécessaires à Mozilla seront construites et installées correctement avant que Mozilla ne soit lui-même construit.

Portage va même jusqu'à distinguer les dépendances dûes à la compilation et celles dûes au lancement. Cela dit pour le moment Portage installe toutes les dépendances de compilation et de lancement, et laisse l'état tel quel. Dans une prochaine version, il est prévu de permettre que seules les dépendances de lancement soient effectivement installées.

Comment préciser les dépendances à vos fichiers ebuild ?

La variable DEPEND dans votre foo-x.y.z.ebuild indique à Portage les paquets qui sont nécessaires à la construction de foo. La variable RDEPEND indique à Portage les paquets nécessaires à son lancement.

DEPEND="virtual/glibc
        sys-libs/zlib"
RDEPEND="virtual/glibc"

Cela indique à Portage de construire foo-x.y.z, les paquets virtual/glibc (plus de précisions sur les virtuals seront données plus tard) et sys-libs/zlib étant nécessaires à la construction. Il ne précise pas la version de glibc ou zlib dont vous avez besoin, ce qui signifie que n'importe laquelle ira très bien.

La mention de n'importe laquelle fait évidemment un peu peur, et ne fonctionnera en général pas. En revanche pour des bibliothèques centrales comme glibc, qui fait tout pour avoir des binaires toujours compatibles ça fonctionnera. Pour d'autres bibliothèques, on peut évidemment préciser la version des dépendances.

>=sys-apps/bar-1.2
 =sys-apps/baz-1.0

>= et = font bien ce qu'on espère qu'ils feront : Toutes les versions plus récentes que sys-apps/bar version 1.2 conviendront (ce qui signifie aussi que sys-apps/bar-2.0 suffira), alors que sys-apps/baz version 1.0 est l'unique version acceptée. Pour plus d'informations sur le schéma de version des paquets voir la section plus haut sur comment nommer des fichiers ebuild.

Voici d'autres méthodes pour spécifier la version des dépendances :

~sys-apps/qux-1.0
=sys-apps/foo-1.2*
!sys-libs/gdbm

~sys-apps/qux-1.0 va sélectionner la plus récente révision de qux-1.0 dans Portage.

=sys-apps/foo-1.2* va selectionner le membre le plus récent de la série 1.2, mais ignorera la 1.3 et les versions plus récentes/vieilles. Ainsi foo-1.2.3 et foo-1.2.0 sont tous les deux valides, mais foo-1.3.3, foo-1.3.0, et foo-1.1.0 ne le sont pas.

!sys-libs/gdbm vous empêchera d'installer ce paquet tant que gdbm sera déjà installé.

Pour les derniers détails sur les éléments DEPEND, lisez la section 5 de la page de manuel sur les ebuilds : man 5 ebuild.
Tester et déployer ChangeLog

Dès que vous mettez à jour un (ou que vous écrivez un nouveau) ebuild, vous devez également mettre à jour (ou créer) le ChangeLog correspondant. Le fichier skel.ChangeLog contient un exemple de ChangeLog que vous pouvez utiliser comme base.

L'objectif du ChangeLog est de documenter ce qui a été fait, pourquoi cela a été fait, et par qui. Cela permet à la fois aux développeurs et aux utilisateurs de garder une trace des changements effectués de manière simple.

Le ChangeLog est tout d'abord fait pour les utilisateurs, donc assurez-vous qu'il reste court (jusqu'à un certain point), et évitez de devenir verbeux sur les détails techniques internes.

Sauvegarder vos propres ebuilds localement

Afin de pouvoir tester vos ebuilds et de les laisser à la connaissance de Portage, vous devez les placer dans un répertoire connu. Portage utilisera la variable PORTDIR_OVERLAY que vous pouvez définir dans /etc/make.conf. Vous devriez fixer cette variable à votre répertoire local de travail (par exemple, /usr/local/portage).

Dans ce répertoire vous devez avoir la même structure (et les mêmes catégories) que dans /usr/portage.

En utilisant PORTDIR_OVERLAY, vos ebuilds restent sur votre système, même après un emerge sync, et ils restent connus de Portage.

Outils de tests utiles

Vous disposez de quelques outils pratiques pour vous aider à écrire et maintenir vos ebuilds.

lintool est cassé. Utilisez repoman à la place. repomansys-apps/portage Un outil pour les développeurs uniquement, pour les assister dans la procédure de vérification pour déposer un ebuild dans le CVS. Il effectue de nombreuses vérifications communes de qualité (QA) et essaye de s'assurer que les fichiers ajoutés dans le cvs ne vont pas casser l'arborescence de Portage. ccachedev-util/ccache Outil qui garde les fichiers en pré-processus, pour pouvoir rendre la compilation plus rapide. Assurez-vous d'ajouter ccache dans votre variable FEATURES dans le fichier /etc/make.conf ! sandboxshellapp-shells/sandboxshell Ouvre un shell qui crée un environnement « bac à sable ». Très utile pour entrer dans le même environnement que celui dans lequel Portage construit les paquets, et y appliquer manuellement des corrections. echangelogapp-portage/gentoolkit-dev Permet de créer un nouveau ChangeLog ou d'ajouter une entrée dans un ChangeLog déjà existant. qpkgapp-portage/gentoolkit Un outil qui permet d'obtenir plusieurs informations à propos des paquets installés.
Outil Paquet Description