3.10 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 une invite de commande. Un des principes importants dans la conception 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 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

Le nom des fichiers ebuilds comporte quatre sous-sections logiques :

pkg-ver{_suf{#}}{-r#}.ebuild

Note : Les crochets ({}) délimitent des champs optionnels et n'apparaissent pas dans le nom final pour le paquet. # représente un entier positif différent de zéro.

La première sous-section, pkg, est le nom du paquet qui doit toujours contenir des caractères choisis parmi les minuscules, les chiffres de 0 à 9, le tiret -, le soulignement _ ou le plus +. Par exemple, on a util-linux, sysklogd et gtk+. Nous avons quelques paquets dans Portage qui ne suivent pas cette règle, mais les vôtres devront la respecter.

La seconde sous-section ver est la version du paquet qui doit normalement être la même que la version de l'archive source principale. La version est en général constituée de deux ou trois (ou plus) nombres séparés par un point, comme 1.2 ou 4.5.2 et peuvent comporter une lettre seule suivant immédiatement le dernier chiffre. Par exemple, 1.4b ou 2.6h. La version du paquet est liée au nom du paquet par un tiret. Par exemple, vous aurez foo-1.0 ou bar-2.4.6.

Important : 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 sous-section, {_suf{#}}, est optionnelle et peut contenir un suffixe pré-défini parmi ceux listés (du plus vieux au plus récent) ci-dessous :

Suffixe Sens
_alpha Sortie de type alpha
_beta Sortie de type beta
_pre Pré-sortie
_rc Candidat à la sortie
(none) Sortie officielle
_p Niveau de correctif (normalement suivi d'un entier)

Tous ces suffixes doivent être suivis immédiatement d'un entier positif non nul, comme par exemple linux-2.4.0_pre10. En supposant des versions identiques, les suffixes sont ordonnés ainsi (le premier étant le plus vieux) : _alpha < _beta < _pre < _rc < (aucun suffixe) < _p.

En comparant deux suffixes identiques avec les entiers qui les suivent, celui qui a le numéro le plus grand sera considéré comme plus récent. Par exemple, foo-1.0_alpha4 est plus récent que foo-1.0_alpha3.

La quatrième sous-section dans le nom du paquet est le numéro de révision spécifique à Gentoo Linux, {-r#}. Cette sous-section comme le suffixe est optionnelle. # est un entier positif non nul, ce qui donne par exemple paquet-4.5.3-r3.

Le numéro de révision est indépendant de la version de l'archive source et est utilisé pour informer les utilisateurs qu'une révision pour un paquet particulier est disponible. Les sorties initiales d'ebuilds ne doivent pas avoir de numéro de révision. Par exemple, paquet-4.5.3 est considéré par Portage comme ayant un numéro de révision de zéro. Cela signifie que le décompte se fait ainsi : 1.0 (version initiale), 1.0-r1, 1.0-r2, etc.

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

Entêtes

Quand vous soumettez vos ebuilds, les entêtes doivent être strictement identiques au contenu du fichier /usr/portage/header.txt. Ne les modifiez en aucune façon et vérifiez bien que la ligne $Header: $ est telle quelle.

Les trois premières lignes doivent être identiques à :

# Copyright 1999-2005 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: $

Variables

La première partie de tous les fichiers ebuild est constituée d'un certain nombre de variables. Pour plus d'information sur ces variables, consultez le guide de développement.

Fonctions

Un certain nombre de fonctions que vous pouvez définir dans vos fichiers ebuilds permettent de contrôler la construction et le processus d'installation de votre paquet.

Fonction Objectif
pkg_setup Utilisez cette fonction pour effectuer n'importe quel type de tâche qui soit un pré-requis à la construction. Cela inclut la vérification de l'existence d'un fichier de configuration par exemple.
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 pouvez uniquement afficher des 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 emake 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ée que si vous avez initialisé la variable FEATURES="test" et si RESTRICT="test" 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 fichiers.
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 fichiers.
pkg_prerm Les commandes dans cette fonction sont lancées juste avant la suppression d'un paquet du système de fichiers.
pkg_postrm Les commandes dans cette fonction sont lancées juste après la suppression d'un paquet du système de fichiers.
pkg_config Vous utiliserez cette fonction pour mettre en œuvre une configuration initiale d'un paquet après qu'il ait été installé. Toutes les chemins des répertoires dans cette fonction doivent être préfixés de ROOT qui indique le répertoire racine (il se peut que ce ne soit pas /.) Cette fonction est uniquement exécutée si l'utilisateur lance : emerge --config =${PF}.

Fonctions utilitaires

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

Fonction Objectif
use Vérifier si une ou plusieurs variables USE sont sélectionnées. Pour les variables sélectionnées, la fonction renverra « vrai ». Dans tous les cas, rien ne sera affiché sur la sortie standard. Pour une sortie plus verbeuse, utilisez usev qui affichera les options USE qui ont été sélectionnées.
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éfini 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'une version de noyau dans votre script, utilisez la variable KV 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 éventuellement lui passer des arguments supplémentaires pour ./configure en les donnant lors de l'appel d'econf et les utilisateurs peuvent également utiliser la variable EXTRA_ECONF s'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 emake install DESTDIR="${D}" et non einstall. Cette commande n'est en fait qu'une alternative aux fichiers make défectueux.
die Avorte le processus en cours. Il indiquera à l'utilisateur les données passées en argument. 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 où le paquet a échoué.
elog
einfo Affiche des informations moins importantes qui ne seront pas sauvegardés dans un log.

Fonctions utilitaires proposées par eutils.eclass

Vous pouvez utiliser les fonctions suivantes 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.

Fonction Objectif
epatch Cette fonction ressemble un peu à la commande patch mais a l'avantage de fonctionner avec des correctifs aux formats .bz2, .gz, .zip et fichiers 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.
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 le prochain ID disponible. $3 contient un shell. Mettre -1 pour que prendre le 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 les éventuels paramètres à passer à la commande useradd lors de la création de l'utilisateur.
enewgroup Ajoute un nouveau groupe. Cette fonction prend pour paramètre obligatoire le nom du groupe et comme paramètre optionnel 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 le chemin vers une icône relatif à /usr/share/pixmaps ou en donnant le chemin complet à 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 le chemin 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 Essaie 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 -u est passé en premier argument, alors la liste des fichiers .po des répertoires spécifiés est construite et l'union des listes est utilisée.

Fonctions utilitaires proposées par flag-o-matic.eclass

Vous pouvez utiliser les fonctions suivantes 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.

Fonction Objectif
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 Cette fonction nécessite deux arguments. Il remplace une valeur de type mtune/march/mcpu par une autre (Par exemple, « replace-cpu-flags 'i686' 'i586' » remplacera -mtune/-march/-mcpu=i686 par -mtune/-march/-mcpu=i586).
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.

Fonctions d'assistance fournies par toolchain-funs.eclass

Vous pouvez aussi utiliser les fonctions suivantes fournies par l'eclass "toolchain-funcs". Vous devez vous assurer que inherit toolchain-funcs est présent pour que ces fonctions puissent fonctionner. Ne spécifiez jamais d'options du compilateur ou de binutils directement, utilisez plutôt les fonctions de toolchain-funcs.

Le but des fonctions ci-dessous est de permettre la compilation croisée et l'utilisation du compilateur ICC. Elles devraient être appelées quand un paquet utilise directement gcc, g++, ld, ranlib ou un des outils ci-dessous. En général, les paquets qui utilisent les outils de configuration automatique détectent la compilation croisée.

Fonction Objectif
tc-getAR Retourne le nom du programme archiveur.
tc-getAS Retourne le nom de l'assembleur.
tc-getCC Retourne le nom du compilateur C.
tc-getCXX Retourne le nom du compilateur C++.
tc-getLD Retourne le nom de l'éditeur de liens.
tc-getNM Retourne le nom de l'inspecteur de symboles.
tc-getRANLIB Retourne le nom de l'indexeur d'archive.
tc-getF77 Retourne le nom du compilateur Fortran.
tc-getGCJ Retourne le nom du compilateur Java.
tc-getBUILD_CC Retourne le nom du compilateur C pour la compilation.
tc-is-cross-compiler Indique si on fait une compilation croisée.
gcc-fullversion Retourne la version telle que reçue par la commande $($CC -dumpversion).
gcc-version Retourne la version, uniquement <major>.<minor>
gcc-major-version Retourne le numéro de version majeur.
gcc-minor-version Retourne le numéro de version mineur.
gcc-micro-version Retourne le numéro de version micro.

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 accolades 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).

Les paramètres USE

Dans vos propres ebuilds, vous pouvez vérifier si une variable USE est présente en utilisant la commande use <variable>. Elle s'utilise 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 condition 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 point important sur l'utilisation de 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 faire cela :

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