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.
Variable |
Utilisation |
Description |
P
READ
Le nom et la version du paquet.
PN
READ
Le nom du paquet.
PV
READ
La version du paquet.
PR
READ
Contient le numéro de révision ou r0 si aucun numéro de
révision n'existe.
PVR
READ
Contient le numéro de version avec la révision.
PF
READ
Contient le nom complet du paquet ${PN}-${PVR}.
A
READ
Liste séparée par des espaces, des fichiers dans SRC_URI.
Elle ne contient pas les directions URL, juste le nom de fichier.
DISTDIR
READ
Contient 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.
FILESDIR
READ
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.
WORKDIR
READ
Base de la racine de travail pour un ebuild. Rien ne doit être
construit hors de ce répertoire.
S
OPT
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.
T
READ
Le répertoire temporaire pour votre paquet. Il est utilisé comme
un répertoire /tmp virtuel lors de l'exécution de
l'ebuild.
D
READ
Le répertoire racine où le paquet devra être installé.
Considérez-le comme un / virtuel.
SLOT
MUST
Portage 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").
LICENSE
MUST
Cette 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.
KEYWORDS
MUST
Cette 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.
DESCRIPTION
MUST
Une courte et unique ligne de description de votre paquet.
SRC_URI
MUST
Les 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"
HOMEPAGE
MUST
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 paquet similaire.
IUSE
MUST
Cette variable contient les paramètres USE que votre paquet
utilise. Souvenez-vous que KEYWORDS ne doit pas y être
listé !
DEPEND
OPT
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.
RDEPEND
OPT
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.
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.
Fonction |
Objectif |
pkg_setup
Utilisez 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_nofetch
Informe 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_unpack
Utilisez 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_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 utilisans D comme
racine ! Le répertoire initial de travail est S.
src_test
Exé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_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.
Les fonctions d'aide
Vous pouvez également utiliser les fonctions d'aide suivantes dans vos
ebuilds.
Fonction |
Objectif |
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 foorbar.
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
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é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_enable
La même chose que use_with, mais retourne
"--enable-foobar" ou "--disable-foobar" selon le
cas.
check_KV
Vé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".
keepdir
Crè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.
econf
Effectue ./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.
einstall
Effectue 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é.
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 à 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 où le paquet a échoué.
einfo
Informe 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.
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.
<<<<------------------------------->>>>
<<<<------------------------------->>>>
<<<<------------------------------->>>>
<<<<------------------------------->>>>
<<<<------------------------------->>>>
Function |
Purpose |
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.
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.
Function |
Purpose |
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.
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.
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.