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 peut être trouvé 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 dit 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 un ebuild pour ce que vous voulez faire, mais qui n'a 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 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 inutile et d'espace disque 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 les développeurs de conflits de manière correcte.

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 avez 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.

Re-vérifiez votre ebuild et vérifiez qu'il est bon 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 lancer un repoman full pour vous assurer que vous n'avez rien oublié.

Politique de soumission au CVS
  • Toujours lancer repoman scan avant de soumettre son travail.
  • Lancez 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 ne 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 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 nous, 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 différenciable les uns des autres, 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 ce qui se fait en général, c'est plus commode.

Scripts ebuild Introduction

Les scripts d'ebuild sont la base de l'intégralité du système de Portage. Ils contiennent toutes les informations nécessaires pour télécharger, désarchiver, compiler et installer un ensemble de sources, ainsi que les informations nécessaires pour réaliser n'importe quelle tache de pre/post installation/suppression ou de configuration. Si la majeure 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, c'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 pour ebuild, et il a la capacité d'installer automatiquement les dépendances si elles sont nécessaires, 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'erreur précieux, car il vous permettra d'isoler les problèmes d'un ebuild par parties spécifiques dans l'ebuild.

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 ('-'), soulignement ('_'), 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 ou bar-2.4.6, etc.

Si vous pensez utiliser une lettre en queue 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 alphas et betas 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 _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élioratons 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évirion incrémenté 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'outliez jamais de laisser une mention de vos modifications dans le 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ète 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 variablesque 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 paquet.PNREADLe nom du paquet.PVREADLa version du paquet.PRREADContient 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}.AREADListe séparée par des espaces, des fichiers dans SRC_URI. Elle ne contient pas les directions URL, juste le nom de fichier. DISTDIRREADContient la direction du répertoire distfiles où tous les fichiers récupérés pour un paquet sont mis. C'est en général /usr/portage/distfiles. FILESDIRREADContient 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. WORKDIRREADBase de la racine de travail pour un ebuild. Rien ne doit être construit hors de ce répertoire. SOPTLe 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. TREADLe répertoire temporaire pour votre paquet. Il est utilisé comme un répertoire /tmp virtuel lors de l'exécution de l'ebuild. DREADLe répertoire racine où le paquet devra être installé. Considérez-le comme un / virtuel. SLOTMUSTPortage manipule souvent plusieurs versions d'un même programme installé. Par exemple vous pouvez avoie 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 un 2 alors que nous aurions un 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").
LICENSEMUSTCette variable spécifie sous quelle licence est le programme, c'est à dire GPL-2, BSD, etc. Ce champ doit être initialisé à une valeur de licence valide (qui peut être n'importe quelle licence dans le répertoire /usr/portage/license/). Si la licence n'y est pas encore répertoriée, elle doit être ajoutée avant que l'ebuild ne soit ajoutée à l'arbre de Portage. KEYWORDSMUSTCette variable remplie désormais un certain nombre de fonctions. Tout d'abord, elle spécifie la cibles 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 plus complète actuellement, 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 profile 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_URIMUSTLes URLs pour chaque fichier source de votre paquet, en les séparant d'un espace. Normalement, le premier devrait ressembler à "ftp://ftp.compagnie.com/pub/unpaquet/${P}.tar.bz2" HOMEPAGEMUSTLa 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 paquet similaire. IUSEMUSTCette variable contient les paramètres USE que votre paquet utilise. Souvenez-vous que KEYWORDS ne doit pas y être listé ! DEPENDOPTLes 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. RDEPENDOPTLes 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 différentes fonctions que vous pouvez définir dans vos fichiers ebuilds, qui contrôlent la construction et le processus d'installation de votre paquet.

pkg_setupUtilisez cette fonction pour effectuer n'importe quel type de tache qui sont des 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_nofetchInforme l'utilisateur des actions requises si pour une raison ou pour une autre (comme par exemple des conditions liées à la licence) les sources ne serait pas téléchargeable 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_unpackUtilisez cette fonction pour désarchiver les sources, 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éfini par WORKDIR. src_compileUtilisez cette fonction pour configurer et construire le paquet. Le répertoire initial de travail est S. src_installUtilisez 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 utilisans D comme racine ! Le répertoire initial de travail est S. src_testExécuté uniquement quand vous avez fait un FEATURES="maketest" et que RESTRICT="maketest" n'est pas mis, la fonction par défaut exécutera une fonction de test disponible dans n'importe quel 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_preinstLes commandes dans cette fonction sont lancées juste avant la fusion de l'image du paquet dans le système de fichier. pkg_postinstLes commandes dans cette fonction sont lancées juste après la fusion de votre image de paquet dans le système de fichier. pkg_prermLes commandes dans cette fonction sont lancées juste avant la suppression d'un paquet du système de fichier. pkg_postrmLes commandes dans cette fonction sont lancées juste après la suppression d'un paquet du système de fichier. pkg_configVous 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.

useVé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 foorbar. has_versionRetourne 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_versionRetourne le couple categorie/paquet-version d'un categorie/paquet demandé. Utilisez-le ainsi : best_version x11-libs/gtk+extra. use_withCette fonction vérifie si un paramètre USE a été défini, et retourne "--with-foobar" ou "--without-foobar" selon le cas. Si vous ne donnez qu'un seul argument, cet argument sera à la vois 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 USE. use_enableLa même chose que use_with, mais retourne "--enable-foobar" ou "--disable-foobar" selon le cas. check_KVVérifie si Portage connait la version du noyau. Si non, cette fonction retourne une erreur et meurt. Si vous avez besoin d'une 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". keepdirCrèe (si besoin) un fichier .keep dans le 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, alors créer un tel fichier vous-même pourrait casser le paquet. econfEffectue ./configure avec les changements de répertoires nécessaires (prefix, host, mandir, infodir, datadir, sysconfdir, localstatedir). Vous pouvez optionnellement lui passer 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. En d'autres termes, le premier argument passé sera toujours remplacé par le dernier. einstallEffectue un 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 manière 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 qu'un moyen pour écrire par dessus un fichier make cassé. dieAvorte 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 à die si vous faites plusieurs appels à die dans une même fonction. Il sera plus dur de rechercher une erreur si vous n'êtes pas sûr de savoir le paquet a échoué. einfoInforme l'utilisateur d'un événement important. L'argument passé à einfo est le message qui sera passé à 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 pour que vous puissiez utiliser ces fonctions.

<<<<------------------------------->>>> <<<<------------------------------->>>> <<<<------------------------------->>>> <<<<------------------------------->>>> <<<<------------------------------->>>> draw_line This function draws a line consisting of a string of '=' characters the same length as the input to the function. epatch This function acts as a friendlier replacement to the patch command and epatch works with .bz2, .gz, .zip and plain text patches. You do not need to specify a "-p" option, any options that do need to be explicitly specified should be set in EPATCH_OPTS. The function expects either a file or a directory as an argument - if you specify a directory, all patches in the form of "??_${ARCH}_..." will be applied: for a patch to be applied, it needs to match the running architecture, have "_all_" in the name, or EPATCH_FORCE must be set to "yes". gen_usr_ldscript This function generates linker scripts in /usr/lib for dynamic libraries in /lib. This fixes linking problems when a .so is in /lib while a .a is in /usr/lib. have_NPTL Returns 0 if the system is using the NPTL PThreads implementation. get_number_of_jobs This function checks how many CPUs are present and then sets the correct -jX option in MAKEOPTS. mymktemp This function acts as a wrapper to mktemp when it exists, or acts as a replacement when it does not. edos2unix This function performs the same action as the dos2unix binary. egetent egetent acts as a wrapper for getent for Linux or nidump for Mac OS X (R). enewuser Creates a new user. This function expects a mandatory argument with the username, and several optional arguments can be specified: $2 contains a UID, pass -1 for the next available ID; $3 contains a shell with /bin/false being the default; $4 contains a home directory with /dev/null being the default, $5 contains any groups to which the user should be added, empty by default and $6 contains a comment - the default is "added by portage for ${PN}". enewgroup Adds a new group. This function expects a mandatory argument with the group name - an optional second argument makes the group have a specific GID. make_desktop_entry Makes a desktop entry: the first argument contains the path to the binary. Optionally, the second contains a name for the icon - the default is ${PN}; the third can contain a path to the icon relative to /usr/share/pixmaps or a full path - the default is ${PN}.png; the fourth can contain an application category, and the fifth argument contains an optional application startup path. check_license Displays a license for the user to accept, if the an argument is not specified then the license specified by ${LICENSE} is used. unpack_pdv Unpacks a pdv generated archive, the first argument must contain the file to unpack and the second should contain "off_t" which has to be manually generated: strace -elseek ${file} and for something like "lseek(3, -4, SEEK_END)" you would pass the value "4". unpack_makeself Unpacks a makeself generated archive, requires a file to unpack as the argument. cdrom_get_cds Attempts to get a CD, present with files specified by the arguments present on the system and mounted at ${CDROM_ROOT}. cdrom_load_next_cd Loads the next CD once you are done with the first CD. If the function returns, ${CDROM_ROOT} would point to the next CD. strip-linguas This function makes sure that LINGUAS contains only the languages that a package can support specified by the arguments to the function. If the first argument is -i, then a list of .po files in the specified directories is built and the intersection of the lists is used. If the first argument is -u, then a list of .po files in the specified directories is built and the union of the lists is used.
Function Purpose

Helper Functions provided by flag-o-matic.eclass

You can use the following helper functions that are provided by the "flag-o-matic" eclass in your ebuilds. You must make sure that inherit flag-o-matic is present for these functions to work. You should never modify any compiler settings directly, instead please use flag-o-matic to perform any actions such as filtering flags that cause trouble.

filter-flags This function removes particular flags from C[XX]FLAGS - only complete flags are matched. append-flags This function adds extra flags to the existing C[XX]FLAGS variables. replace-flags This replaces the flag specified by the first argument with the one in the second argument in the current C[XX]FLAGS. replace-cpu-flags This replaces any -march=... or -mcpu=... flags that contain the second argument with the first. replace-sparc64-flags This sets -mcpu=... to a v8 SPARC and uses the original value as -mtune if one is not already specified. strip-flags Strips all flags, except those specified in ALLOWED_FLAGS. strip-unsupported-flags Strips C[XX]FLAGS of any flags not supported by the running version of GCC. get-flag Finds a flag and outputs its value. is-flag This returns true if the flag is set in the current C[XX]FLAGS; only complete matches are performed. append-ldflags This function adds extra flags to the existing LDFLAGS variable. filter-ldflags Removes the specified flags from LDFLAGS, only complete flags are matched. fstack-flags Appends -fno-stack-protector which suppresses -fstack-protector and -fstack-protector-all.
Function Purpose
Rules for writing an ebuild file

Since ebuild files are really just shell scripts, you should use your editor's shell-script mode for editing them. You should use proper indentation, using only tab characters -- no spaces. Make sure you set up your editor to put tab stops at 4 spaces. Always make sure you use braces around your environment variables; e.g. ${P} instead of just $P.

Long lines are wrapped with ' \', thus:

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

For further details, refer to skel.ebuild (usually residing in /usr/portage).

If you use Vim for ebuild/eclass editing, the default Gentoo vimrc file, /etc/vim/vimrc, already ensures that correct indentation and filetype settings are used for ebuild and eclass files. For better results, including special syntax highlighting for ebuild keywords, emerge app-vim/gentoo-syntax.

On non-Gentoo systems, you can obtain similar results by using the following lines in your vimrc, or better yet by installing the gentoo-syntax scripts.

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

If you're using Emacs, you can put the following snippet at the bottom of .emacsrc file (for GNU Emacs) or init.el (for XEmacs) to make sure your using the correct settings when editing anything Gentoo-related.

(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))

If you're using nano, then you're in luck! Just edit /etc/nanorc and uncomment the section referring to ebuild's.

USE Variables

The purpose of USE variables is to allow you to configure Portage to globally and automatically enable or disable certain optional build-time features. Here's an example. Let's say you're a GNOME fan, and you'd like any ebuild that has the option of compiling-in optional GNOME support to do so. In this case, you'd add gnome to the USE variable in /etc/make.conf, and then Portage will automatically add optional GNOME functionality to packages if it is available. Likewise, if you don't want optional GNOME features to be added to your ebuilds if they are available, simply edit /etc/make.conf and make sure that gnome is not set in the USE variable. Gentoo Linux has an almost overwhelming number of USE options, allowing you to have your system configured exactly the way you want it.

If you unset a USE variable (for example, removing gnome from USE), this will only instruct Portage to disable optional build-time support for GNOME. However, if you emerge an ebuild that requires GNOME, the package will obviously have GNOME support enabled, as you would expect. This also means that GNOME will be automatically installed (as a dependency) if it hasn't been already. That's why it's always a good idea to do an emerge --pretend before doing the "real" emerge; that way, you'll always know exactly what you're going to get!

In your own ebuilds, you can check whether a USE variable is set by using the use <variable> command. The use command prints out <variable> if it is present in the user's USE. You would normally use this command as follows:

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

USE variables can also be used to set dependencies. For example, you may only want to require a package if a certain USE variable is set. This is done by using the syntax flag? ( mycat/mypackage ) in the DEPEND variable for your ebuild. In this example, mycat/mypackage will only be required if flag is present in USE. It is also possible to specify what dependency should be used if some USE flag is set, and what dependency to use if it is not set: flag? ( mycat/mypackage) and !flag? ( othercat/otherpackage ). In this case, if flag is not set, othercat/otherpackage is used instead of mycat/mypackage. Make sure that your ebuilds use this syntax and not Bash IFS. Bash conditionals interfere with Portage's dependency caching, and the use of them will break your ebuild.

Here's an important tip about how to use USE. Most of the time, a package will have a ./configure script used to perform configuration steps. Generally, if your ebuild uses ./configure, any optional build-time functionality will be enabled or disabled by passing the appropriate arguments to the ./configure command. Here's the best way to handle this:

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!"
}

This approach has a very nice result. We don't have to worry about what the default setting is for mysql or X (enable/disabled), we explicitly tell econf what we want it to do based upon the USE variable. Not to mention it's quite clean in terms of readability :).

To view a continuously updated table of USE variables, please go here.

File system Locations Introduction to the FHS

The file system layout standards used in Gentoo Linux closely follow the FHS, short for File system Hierarchy Standard. A simplified description of the standard is given here; for a complete specification go to http://www.pathname.com/fhs/.

The /opt hierarchy is addressed in section 3.12 of the FHS. Section 4.4 deals with the /usr/X11R6 directory. KDE and GNOME are not specifically addressed, and are in fact not even mentioned in the current version of the FHS.
How to fit your packages into the file system

Usually, if the package uses autoconf and automake, the default installation destinations are mostly correct, with a few exceptions:

  • If you're installing a program into /bin, /sbin, /usr/bin, or /usr/sbin, then the program's corresponding man page should be installed into the /usr/share/man tree. This can often be accomplished by specifying a ./configure --mandir=/usr/share/man in the ebuild.
  • GNU info files should always be installed to /usr/share/info, even if the info files are about X11, GNOME or KDE-specific programs or tools. Make a note: /usr/share/info is the only official location for GNU info files. Since many ./configure scripts default to installing GNU info files in /usr/info, it's often necessary to call ./configure with the --infodir=/usr/share/info argument.
  • Documentation files are installed in /usr/share/doc, into a subdirectory reflecting the name, version, and revision of the particular program. This applies to all programs: GNOME, KDE, X11 and console alike. However, some programs may install additional documentation and support files into a /usr/share hierarchy for their own purposes.
  • X11-specific programs and libraries should always be installed into /usr, not directly into /usr/X11R6. We reserve the /usr/X11R6 hierarchy for the X Window System, Version 11 Release 6 itself. This is perhaps a more to-the-letter interpretation of the FHS than some other distributions have made.
  • GNOME and KDE programs, similarly, should always be installed into /usr.
Some distributions choose to install GNOME and KDE into /opt. There exists no standard for these desktop environments in terms of where to actually install their files. In the interests of simplicity and consistency, we elect to install all KDE and GNOME packages into the /usr hierarchy.

In general, you should have ebuilds install their files into the /usr tree. Some programs can be compiled and linked with or without GNOME, KDE, and X11 libraries, which can cause confusion. Our solution is to install everything into /usr which avoids ambiguity and needless complexity for ebuild authors. The location in which to install a program's files should not depend on the presence or absence of specific USE variables. Therefore, the ebuilds in the portage tree almost always install into the /usr hierarchy exclusively.

The /opt directory is reserved in Gentoo Linux for binary-only packages. Examples include mozilla-bin, acroread, netscape and realplayer. Packages that get installed here will usually require a /etc/env.d/foo stub file. This is so that paths and additional variables can be included into the environment. For more information on /etc/env.d, please visit this document.
The Portage scripts and utilities Public scripts

These are scripts used by the system-administrator to install and remove packages, and maintain the package database.

ebuild is the main engine of the Portage system; it performs all major tasks such as unpacking, compiling, installing, merging, and unmerging packages. It is called using the command: ebuild path/to/package.ebuild command. The commands available are:

setup* Performs any miscellaneous commands required before the ebuild can proceed pkg_setupdependDisplays the dependencies required to build the packageN/Amerge* Unpacks, compiles, installs, and merges the package into your file system N/Aqmerge* Merges the package into your file system, assuming that the the unpack, compile, and install stages have already been executed N/Aunpack* Unpacks the source tarballs into the work directory src_unpackcompile*Compiles the packagesrc_compilerpmCreates an RPM from the packageN/ApackageCreates a Gentoo tbz2 packageN/Aprerm*Executes the pre-removal stage of the packagepkg_prermpostrm*Executes the post-removal stage of the packagepkg_postrmpreinst*Executes the pre-installation stage of the packagepkg_preinstpostinst*Executes the post-installation stage of the packagepkg_postinstconfigSets up a default configuration once the package is mergedpkg_configtouch*Updates the mtimes for each source archive in the packageN/Aclean*Cleans the work directory for the packageN/Afetch*Fetches the package source tarballsN/Adigest*Creates a digest file for the packageN/Ainstall*Installs the package into the image directorysrc_installunmergeUnmerges the package from your file systemN/A
Command Description Related ebuild Function
Commands with an asterisk (*) are normally only used by the developer.

emerge recursively merges a package and all of its dependencies into your file system. This command has many options, try emerge --help for a list of them.

env-update updates the configuration files (including, but not limited to /etc/ld.so.conf and /etc/profile.env) to include changes made by installed packages.

Private Scripts and Commands

These are scripts you can use in your ebuild files to perform common tasks.

For you down and dirty people, look at the scripts themselves in /usr/lib/portage/bin.

diropts-m0755Sets the options used when running dodirdiropts -m0750dobinN/AInstalls the specified binaries into DESTTREE/bindobin wmacpidocinto"" Sets the relative subdir (DOCDESTTREE) used by dodoc docinto examplesdodirN/ACreates a directory, handling ${D} transparentlydodir /usr/lib/newpackagedodocN/A Installs the specified files into the package's documentation directory (/usr/share/doc/${PF}/DOCDESTTREE) (see docinto) dodoc README *.txtdoexeN/A Installs the specified files with mode EXEOPTIONS (see exeopts) into EXEDESTTREE (see exeinto) doexe ${FILESDIR}/quake3dohardN/ACreates a hard link, handling ${D} transparentlydohard ls /bin/dirdohtmlN/A Installs the specified files and directories into /usr/share/doc/${PF}/html dohtml -r doc/html/*doinfoN/A Installs the specified files into /usr/share/info, then compresses them with gzip doinfo doc/*.infodoinsN/A Installs the specified files with mode INSOPTIONS (see insopts) into INSDESTTREE (see insinto) doins *.png icon.xpmdolibN/A Installs the specified libraries into DESTTREE/lib with mode 0644 dolib *.a *.sodolib.aN/A Installs the specified libraries into DESTTREE/lib with mode 0644 dolib.a *.adolib.soN/A Installs the specified libraries into DESTTREE/lib with mode 0755 dolib.so *.sodomanN/A Installs the specified files into /usr/share/man/manX, according to the suffix of the file (file.1 will go into man1) doman *.1 *.5dosbinN/A Installs the files into DESTTREE/sbin, making sure they are executable dosbin ksymoopsdosymN/ACreates a symlink, handles ${D} transparentlydosym gzip /bin/zcatemakeN/A Runs make with MAKEOPTS. Some packages cannot be made in parallel; use emake -j1 instead. If you need to pass any extra arguments to make, simply append them onto the emake command. Users can set the EXTRA_EMAKE environment variable to pass extra flags to emake. emakeexeinto/Sets the root (EXEDESTTREE) for the doexe commandexeinto /usr/lib/${PN}exeopts-m0755Sets the options used when running doexeexeopts -m1770fownersN/A Applies the specified ownership to the specified file via the chown command, handles ${D} transparently fowners root:root /sbin/functions.shfpermsN/A Applies the specified permissions to the specified file via the chmod command, handles ${D} transparently fperms 700 /var/consolesinsinto/usrSets the root (INSDESTTREE) for the doins commandinsinto /usr/includeinsopts-m0644Sets the options used when running doinsinsopts -m0444into/usr Sets the target prefix (DESTTREE) for all the 'do' commands (like dobin, dolib, dolib.a, dolib.so, domo, dosbin) into /libopts-m0644Sets the options used when running doliblibopts -m0555newbinN/A Wrapper around dobin which installs the specified binary transparently renaming to the second argument newbin ${FILESDIR}/vmware.sh vmwarenewdocN/A Wrapper around dodoc which installs the specified file transparently renaming to the second argument newdoc README README.openglnewexeN/A Wrapper around doexe which installs the specified file transparently renaming to the second argument newexe ${FILESDIR}/xinetd.rc xinetdnewinsN/A Wrapper around doins which installs the specified file transparently renaming to the second argument newins ntp.conf.example ntp.confnewmanN/A Wrapper around doman which installs the specified file transparently renaming to the second argument newman xboing.man xboing.6newsbinN/A Wrapper around dosbin which installs the specified file transparently renaming to the second argument newsbin strings strings-staticprepallN/A Runs prepallman, prepallinfo and prepallstrip. Also ensures all libraries in /opt/*/lib, /lib, /usr/lib and /usr/X11R6/lib are executable. also moves any stray aclocal macros into /usr/share/aclocal prepallprepalldocsN/A Recursively gzips all doc files in /usr/share/doc, transparently fixing up any symlink paths prepalldocsprepallinfoN/ARecursively gzips all info files in /usr/share/infoprepallinfoprepallmanN/A Recursively gzips all man pages in /opt/*/man/*, /usr/share/man/*, /usr/local/man/*, /usr/X11R6/share/man/* and transparently fixes up any symlink paths prepallman
Command Default Value Description Example
Package Dependencies Why dependencies are important

Portage is more than just a convenience script that gives you a unified way to build any one project (program, library) from source. It will also fetch and install any necessary dependencies if you take care to specify these in your ebuild.

In the official ebuilds, all dependencies have already been specified, so when you issue emerge net-www/mozilla/mozilla-1.0, Portage will insure that all libraries necessary for Mozilla to build and run are properly installed before Mozilla itself is built.

Portage even distinguishes between build-time dependencies and run-time dependencies. (Caveat: Currently, Portage installs all build-time and run-time dependencies and leaves it at that. At a later stage, it will be possible to trim your installation so that only the run-time dependencies are left installed).

How to Specify Dependencies in Your ebuild Files (a.k.a. DEPEND Atoms)

The DEPEND variable inside your foo-x.y.z.ebuild tells Portage about which packages are needed to build foo. The RDEPEND variable specifies which packages are needed for foo to run.

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

This tells Portage that to build foo-x.y.z, the packages virtual/glibc (more on virtuals in a bit) and sys-libs/zlib are needed. It does not say anything about which version of glibc or zlib that are needed, which means "anything goes".

The "anything goes" is of course a bit scary, and will not work in the general case. But for central libraries like glibc, which strives very hard to be 100% binary compatible all the time, it actually works. For other libraries, we can of course specify version dependencies.

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

>= and = do what you would expect; sys-apps/bar version 1.2 or newer is okay (this means that sys-apps/bar-2.0 is okay), while sys-apps/baz version 1.0 is the only version that is accepted. For more information on the version schema of packages, see the section above on Naming ebuild Files.

Other methods of specifying version dependencies are as follows:

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

~sys-apps/qux-1.0 will select the newest portage revision of qux-1.0.

=sys-apps/foo-1.2* will select the newest member of the 1.2 series, but will ignore 1.3 and later/earlier series. That is, foo-1.2.3 and foo-1.2.0 are both valid, while foo-1.3.3, foo-1.3.0, and foo-1.1.0 are not.

!sys-libs/gdbm will prevent this package from being emerged while gdbm is already emerged.

For all the latest details about these DEPEND Atoms, please see the section 5 manpage on ebuilds: man 5 ebuild.
Testing and deploying ChangeLog

Whenever you update a (or write a new) ebuild, you must also update its (or create a new) ChangeLog. The skel.ChangeLog contains a sample ChangeLog that you can use as a basis.

The purpose of the ChangeLog is to document what is being done, why it is being done, and by whom. This allows both developers and users to trace the changes made in an easy way.

The ChangeLog is primarily targeted at users, so be sure to keep your writing short, to the point, and avoid getting verbose about the internal technical details.

Storing your own ebuilds locally

In order to be able to test your ebuilds and let Portage know about them, you must place those in a known directory. Portage will use the PORTDIR_OVERLAY variable which you can define in /etc/make.conf. You should set this variable to your directory (e.g. /usr/local/portage).

In that directory, you must use the same structure (and categories) as in /usr/portage.

Using this PORTDIR_OVERLAY, your ebuilds remain on your system, even after an emerge sync, and they are still known to Portage.

Useful testing tools

We have a few useful tools to help you with writing and maintaining your ebuilds.

lintool is broken. Use repoman instead. repomansys-apps/portage Developer-only tool to assist with the CVS checkin procedure. It does a lot of common QA and tries to make sure that files added to cvs will not break the portage tree. ccachedev-util/ccache Tool that keeps pre-processed files so that recompilation gets done much faster. Be sure to add ccache to the FEATURES variable in /etc/make.conf! sandboxshellapp-shells/sandboxshell Launch a shell that creates a sandbox environment. Useful for entering the same environment that portage builds packages inside of and debugging things by hand. echangelogapp-portage/gentoolkit-devCan create a new ChangeLog or add an entry to an existing one.qpkgapp-portage/gentoolkitA tool to gather misc information about installed packages.
Tool Package Description