Manuel du développeur Gentoo
Table des matières :
-
Introduction
Cette partie couvre l'ensemble des aspects qui s'appliquent à la plupart des
domaines de développement de Gentoo. Cette section est surtout intéressante si
vous êtes développeur Gentoo. Dans les autres cas, vous n'apprendrez pas grand
chose d'intéressant en la lisant.
-
Introduction
Cette section indique l'ensemble des objectifs que se donne le manuel pour
développeurs Gentoo.
-
Devenir développeur
Ce chapitre essaie d'expliquer comment devenir développeur pour le projet
Gentoo.
-
Ce qui est mis à disposition
Cette section présente l'ensemble des services mis à la disposition des
développeurs.
-
Aide pour les nouveaux développeurs
Cette section apporte de l'aide et un certain nombre d'instructions utiles pour
les nouveaux développeurs Gentoo.
-
La hiérarchie des développeurs
Cette section présente la hiérarchie des développeurs Gentoo et du
développement lui-même.
-
Guides
Cette section présente et explique les différents processus de développement et
propose des standards à suivre par les développeurs Gentoo.
-
Guide pour les ebuilds
Cette section décrit le système Portage de Gentoo, comment créer des nouveaux
paquets pour Gentoo. Il doit également être vu par les développeurs comme un
standard. Ce document est en constante évolution et est mis à jour et modifié
régulièrement. Vous devez utiliser ce document comme un complément aux pages
man proposées par Portage (et tout particulièrement ebuild(5)) et aux
politiques de développement de Gentoo.
-
Guide pour les eclass
Cette section propose aux développeurs un guide qui détaille le fonctionnement
des eclass et comment ils peuvent être appliqués aux ebuilds.
-
Erreurs classiques dans les ebuilds
Cette section explique les erreurs fréquentes que l'on rencontre lors de
l'écriture et la soumission d'ebuilds faits par des développeurs ou des
contributeurs.
-
Gentoo Metadata
Cette section explique l'utilité et l'usage du fichier metadata.xml qui est
utilisé dans l'arbre de Portage.
-
Guide de maintenance des ebuilds
Cette section décrit comment les développeurs devraient réaliser les tâches
communes lors de la maintenance des ebuilds dans l'arbre Portage.
-
Guide pour signer des modifications
Cette section explique comment les développeurs peuvent signer des
modifications dans l'arbre Portage en utilisant GPG.
-
Les politiques
Cette partie couvre l'ensemble des différentes politiques que doivent suivre les
développeurs lors de la soumission d'éléments dans le CVS.
-
La politique concernant les ebuilds
Cette section présente la politique qui s'applique aux ebuilds dans Portage.
-
La politique concernant l'étiquette
Cette section présente l'étiquette que doit suivre tout développeur Gentoo.
A. Introduction
1. Introduction
1.a. Introduction
L'objectif de ce manuel est de proposer un cadre aux politiques de
développement Gentoo, et de permettre à vous les développeurs d'être
informés à propos des politiques, standards et procédures que Gentoo considère
comme étant les valeurs qui sont au coeur de notre système de développement.
Ce manuel n'a pas pour but d'être le guide universel qui réponde à tout et nous
préférons laisser une marge de manoeuvre importante aux développeurs. Ce manuel
est plus fait pour vous donner un certain nombre de principes et nous pensons
qu'ils feront de vous un bon développeur Gentoo. La suite ne dépend que de
vous !
Si vous êtes nouveau dans le développement pour Gentoo ou même que vous êtes un
vétéran et que vous avez un doute sur quoi que ce soit, vous pouvez poser votre
question sur la liste de diffusion gentoo-dev ou sur le forum IRC #gentoo-dev.
1.b. Prérequis
Avant que vous ne commenciez à bricoler, il est important d'avoir avec vous une
Gentoo en parfait état de fonctionnement, aussi bien dans une optique de
documentation que pour le développement et nous vous recommandons d'avoir une
bonne connaissance des thèmes abordés dans la section « Utiliser
Gentoo » du manuel d'utilisateur pour
vous aider dans votre travail de développement.
La grande majorité des thèmes abordés dans ce guide ont pour cible les
développeurs, mais si vous êtes simplement intéressés de voir comment
fonctionne le développement de Gentoo, ce guide pourrait vous donner une vue
d'ensemble intéressante.
Le meilleur moyen d'être remarqué (et de devenir éventuellement un développeur
Gentoo !) est de rapporter des bugs de manière efficace dans le
Bugzilla de Gentoo, avec des correctifs
si possible, et de nous aider en apportant votre aide dans ce que vous pensez
être important pour que Gentoo s'améliore, soit en proposant des correctifs
ajoutant des nouvelles fonctionnalités, soit en soumettant de nouveaux ebuilds,
ou encore en résolvant des problèmes déjà détectés.
2. Devenir développeur
2.a. Introduction
Il y a plusieurs façons de devenir développeur pour Gentoo et cette section va
vous les présenter. Il y a également un certain nombre d'étapes que doivent
suivre les nouvelles recrues pour devenir développeurs officiels.
2.b. Aider
Tout d'abord, pour que l'on vous propose de devenir développeur, vous devez
soit vous proposer à un poste, soit simplement aider que ce soit pour le
support aux utilisateurs ou en rapportant des bogues. Nous remarquons les
personnes qui contribuent régulièrement au projet Gentoo et nous essayons de
les récompenser en leur donnant une chance de devenir des développeurs pour le
projet Gentoo. Gentoo a de nombreuses portes d'entrée et l'équipe de
recrutement pour les développeurs de Gentoo (la Gentoo Developer Relations
Recruitment Team) est constamment à la recherche de nouveaux développeurs.
Les auteurs de documents ou les mainteneurs des infrastructures Gentoo sont
également très importants pour que le projet puisse fonctionner correctement.
Vous pouvez chercher des propositions de postes pour devenir développeurs dans
le GWN (Gentoo Week News), ou en faisant un /topic sur le canal
#gentoo-bugs des serveurs irc.freenode.net. Si vous pensez pouvoir correspondre
à une proposition, essayez de vous trouver un mentor ou contactez les recruteurs Gentoo qui pourront vous trouver
un mentor pour vous. Merci de ne pas remplir de bogues de type « nouveau
développeur », dans la mesure où cette tache est attribuée à votre mentor
et tous les bogues de ce type seront clos.
2.c. Parrainage
Tous les nouveaux développeurs ont un parrain (plus souvent appelé mentor).
C'est un développeur Gentoo et il a pour tâche de guider un nouveau
développeur, mais aussi de proposer de l'aide au développeur après que celui-ci
ait passé les étapes de recrutement.
Un mentor doit vous assister en vous apportant des réponses pour toutes les
questions que vous pourriez avoir. Il doit également vous faire prendre
conscience des responsabilités que vous aurez vis-à-vis de Gentoo et notamment
celles en relations avec les tâches que vous effectuerez dans un premier temps.
Une fois qu'un développeur accepte d'être le parrain d'un nouveau développeur,
il devra faire un rapport de bogue et l'assigner aux recruteurs Gentoo. La
page des recruteurs Gentoo
explique en détail la démarche à suivre.
Note :
Les recruteurs Gentoo se réservent le droit d'assigner au développeur un
nouveau mentor si le mentor initial ne répond pas aux attentes du jeune
développeur ou si le mentor remplit le bogue mais n'aide pas le nouveau
développeur dans la suite du processus.
|
2.d. Attendre
Tous les nouveaux développeurs passent alors dans une période d'attente d'au
plus un mois, selon le temps que le mentor juge nécessaire pour que le
développeur soit prêt, ainsi que le temps d'avoir des retours d'expérience de
la part d'autres membres du projet Gentoo. Durant cette période, le nouveau
développeur devra remplir un quizz qui sera révisé par son mentor et les
recruteurs Gentoo pour s'assurer que le développeur est prêt. Dans
certains cas bien précis, la période d'attente sera déterminée par les
recruteurs et/ou les responsables des relations entre développeurs Gentoo.
Deux quizz sont proposés : le quizz ebuild et le quizz personnel. Les
développeurs qui devront travailler uniquement sur les infrastructures, les
GLSAs ou autres domaines ne concernant pas les ebuilds devront réussir le quizz
de personnel. Tout développeur qui aura à utiliser un accès à l'arbre de
Portage devra réussir le quizz ebuild.
Une fois que le nouveau développeur a rempli le quizz, il devra l'envoyer à son
mentor qui sera responsable de sa relecture, avec les membres de l'équipe des
recruteurs Gentoo. Si les réponses
montrent qu'elles correspondent à un standard satisfaisant, le recrutement
pourra continuer. Sinon, le nouveau développeur peut refaire le quizz pour
autant qu'il soit encore dans sa période d'attente.
Enfin, les nouveaux développeurs doivent être ouverts à toutes les questions
que n'importe quel membre de l'équipe de recruteurs peut être amené à lui
poser. Tout développeur qui ne répond pas rapidement verra son bogue
« nouveau développeur » fermé, lequel pourra être ouvert de nouveau,
à la discrétion des recruteurs Gentoo uniquement.
2.e. Faire le grand saut
Une fois que votre mentor et les recruteurs Gentoo ont relu votre quizz et
qu'ils pensent que vous rentrez dans un standard acceptable, vous devrez
l'envoyer accompagné d'une clef publique DSA2 SSH2 (un fichier
id_dsa.pub) aux recruteurs Gentoo. Si les recruteurs considèrent
votre quizz comme satisfaisant, ils vous donneront accès aux services dont vous
aurez besoin.
Une fois passé cette étape, vous entrez dans une période probatoire de trente
jours durant laquelle votre mentor sera responsable de vos actions, en
apportant son cachet. Encore une fois, les recruteurs Gentoo peuvent rejeter un
développeur durant cette période s'ils le jugent nécessaire.
3. Ce qui est mis à disposition
3.a. Introduction
Le projet Gentoo propose aux développeurs l'ensemble des services dont ceux-ci
pourraient avoir besoin pour faciliter leurs efforts de développement. Si vous
avez besoin d'un service non fourni à l'heure actuelle, n'hésitez pas à
contacter l'équipe qui s'occupe de l'infrastructure de Gentoo.
Une fois que vous êtes un développeur autorisé, votre recruteur devrait vous
organiser les services présentés dans ce chapitre de telle manière que vous
puissiez les utiliser. Si vous avez un quelconque problème, voyez avec votre
recruteur ou l'équipe citée plus haut pour avoir un accès au service demandé.
3.b. Bugzilla
Les développeurs peuvent changer tous les aspects des bogues dans le Bugzilla.
Si vous avez un compte existant, votre adresse électronique devra être
remplacée par votre adresse Gentoo par un administrateur de Bugzilla.
3.c. CVS
Tous les développeurs ne reçoivent pas un accès CVS. Si vous avez besoin d'un
accès au CVS de l'arbre Portage de gentoo, gentoo-projects, ou gentoo-x86,
demandez à une personne de l'équipe des recruteurs qui le fera pour vous. Vous
devrez sûrement justifier votre besoin pour qu'ils valident votre demande.
3.d. IRC
Quand vous devenez développeur, vous recevez automatiquement un statut
d'opérateur sur le canal de discussion #gentoo-dev, ce qui signifie que vous
êtes développeur. Contactez l'équipe relationnelle des développeurs si vous ne
l'êtes pas. De plus les responsables d'équipe peuvent décider de vous donner un
statut d'opérateur sur des canaux de discussion spécialisés comme par exemple
#gentoo-hardened. Un abus de pouvoir de la part d'un opérateur sur #gentoo-dev
peut entraîner une perte immédiate de ce statut et éventuellement une
suppression de votre statut de développeur. S'il vous a été donné des pouvoirs
d'opérateur, nous vous demandons de les utiliser de manière constructive pour
améliorer la bonne tenue des divers canaux de discussions et éviter tout
débordements de la part d'utilisateurs ou de développeurs.
Le statut d'opérateur sur #gentoo est donné à la discrétion des relations entre
développeurs : cela ne signifie en aucun cas que l'utilisateur est un
développeur.
Des canaux de discussion spécifiques Gentoo sont proposés comme
#gentoo-hardened ou #gentoo-server, et l'attribution du statut d'opérateur sur
ceux-ci est laissé à la discrétion de l'équipe concernée -dans notre exemple,
les équipes « hardened » et « server ».
Les canaux de discussion IRC appartiennent aux responsables de projet
respectifs, que ce soient des responsables stratégiques ou opérationnels, et le
propriétaire peut à sa guise « voicer » ou « dévoicer » des
membres du public. Si vous pensez que ces pouvoirs sont utilisés de manière
abusive ou sont utilisés à mauvais escient, parlez-en à l'équipe relationnelle
des développeurs Gentoo.
3.e. Forums (facultatif)
Demandez à un administrateur des forums, soit sur #gentoo-forums, soit via
forum-mods@gentoo.org, de mettre à
jour votre statut sur les forums Gentoo si cela est nécessaire. Les comptes sur
les forums ne sont pas une obligation de la part des développeurs.
3.f. Courrier électronique
Tous les développeurs disposent d'une adresse électronique du type
pseudo@gentoo.org qui doit être utilisée pour le projet Gentoo.
Merci de lire la documentation sur le système de courrier
électronique de Gentoo pour plus de détails.
3.g. Listes de diffusion
Tous les développeurs doivent s'inscrire sur les listes de diffusions
gentoo-core et gentoo-dev. Contactez un membre de l'équipe de recrutement pour
vous inscrire à la liste de diffusion réservée aux développeurs gentoo-core, ou
si vous avez un quelconque problème. Si vous êtes inscrit à d'autres listes de
diffutions, vous devez vous désinscrire et réinscrire en utilisant votre
nouvelle adresse électronique. La liste gentoo-core est prévue pour les
discussions internes, mais la plupart des sujets devraient être débattus dans
la liste gentoo-dev.
3.h. Accès à un shell
Actuellement les développeurs ont un compte shell sur dev.gentoo.org
(toucan.gentoo.org) qui leur propose un espace de stockage pour le courrier
électronique, un relai SMTP ainsi qu'un tunnel IRC pour que les développeurs
puissent accéder aux serveurs IRC de freenode.
Pour des raisons de sécurité, l'accès est restreint au protocole SSH à clefs
que votre mentor aura dû mettre en place pour votre compte. Pour vous connectez
avec votre clef SSH, veuillez lire la documentation pour l'accès ssh
au CVS.
3.i. Politique d'utilisation des services
Les services proposés par Gentoo doivent uniquement être utilisés pour votre
travail de développement pour Gentoo. L'équipe s'occupant de l'infrastructure
a le droit de désactiver n'importe quel compte qui présente un risque de
sécurité. Cela inclut les comptes inactifs qui seront suspendus par l'équipe
gérant l'infrastructure, si vous êtes en état d'hibernation, et votre statut
sur le canal de discussion IRC #gentoo-dev passera au statut de ``voice''.
Si un quelconque fichier sur votre compte est trouvé et désigné comme
potentiellement nocif pour les autres développeurs ou utilisateurs de la
machine ou simplement présente un risque pour le projet Gentoo (comme par
exemple des fichiers .torrents illégaux), l'infrastructure Gentoo désactivera
votre compte qui ne sera réactivé (s'il doit l'être) qu'après investigation de
la part des relations des développeurs Gentoo. Dans la plupart des cas, votre
statut de développeur sera suspendu si de tels fichiers sont trouvés. La même
politique est appliquée pour le CVS gentoo et d'autres services qui vous sont
proposés par Gentoo.
4. Aide pour les nouveaux développeurs
4.a. Utiliser CVS
Introduction
Ce guide n'a pas pour prétention de servir de manuel d'utilisation à CVS. Pour
cela, vous pouvez aller lire la page d'information de CVS (info cvs) ou encore
le tutoriel CVS de Gentoo. Ce guide
s'intéresse plus spécifiquement à l'utilisation de CVS et Repoman dans l'arbre
des ebuilds de Gentoo.
Configuration
En général vous aurez les lignes suivantes dans votre fichier
~/.cvsrc :
Exemple de code 1.1 : ~/.cvsrc |
cvs -q -z0
diff -u -B
checkout -P
update -d -P
|
Pour être sûr que les « digests » sont corrects, mettez cvs
dans les paramètres de la variable FEATURES.
Enfin, plusieurs personnes utilisant CVS aiment utiliser la compression (-z#).
Nous demandons aux développeurs qui n'ont pas un accès Internet avec une bande
passante limitée d'utiliser -z0 (pour le contenu du dépôt CVS, et la charge de
serveur CVS, vous aurez probablement une augmentation de la vitesse de
transfert si vous n'utilisez pas de compression).
Récupération des modules par CVS/SVN
Plusieurs modules sont utilisés dans le dépôt CVS de Gentoo. Les ebuilds sont
gardés dans le module gentoo-x86. gentoo contient les
pages XML du site Internet, la documentation, les répertoires des développeurs,
les images de développeurs, etc. gentoo-projects contient
différents projets et remplace généralement le module gentoo-src.
gentoo-src est conservé pour des raisons historiques, aussi
veuillez envisager un autre module si vous l'utilisez encore.
Exemple de code 1.2 : Récupérer le module gentoo-x86 |
# cvs -d nom_utilisateur@cvs.gentoo.org:/var/cvsroot co gentoo-x86
|
Avant de travailler sur l'arbre, c'est toujours une bonne idée de faire une
mise à jour pour vérifier les modifications et pour prévenir les conflits. Vous
pouvez mettre à jour n'importe quel sous-répertoire de l'arbre, si vous ne
souhaitez pas mettre à jour l'arbre complet. Mais il est parfois bon de mettre
la totalité de l'arbre à jour :
Exemple de code 1.3 : Mise à jour de gentoo-x86 |
# cd gentoo-x86
# cvs update
|
Gentoo offre également des services subversion pour ceux qui préferent SVN à
CVS. Beaucoup de projets principaux comme portage et
baselayout sont désormais hébergés sur subversion.
Exemple de code 1.4 : Récupération du module portage |
# svn co svn+ssh://username@cvs.gentoo.org/var/svnroot/portage
|
Mettre Portage à jour
Si vous voulez utiliser CVS en tant qu'arbre de Portage primaire, vous pouvez
ajouter les lignes suivantes dans votre fichier de configuration
/etc/make.conf, en remplaçant moi par votre nom
d'utilisateur :
Exemple de code 1.5 : Modifier /etc/make.conf pour utiliser CVS |
SYNC="cvs://moi@cvs.gentoo.org:/var/cvsroot"
CVSROOT=":ext:moi@cvs.gentoo.org:/var/cvsroot"
|
Que vous vouliez utiliser les sources CVS (CVS checkout) pour votre arbre de
Portage primaire ou non, vous devez vous assurer que cvs est dans votre
variable FEATURES dans le fichier /etc/make.conf. Cela
assure que Portage téléchargera tous les fichiers référencés par un ebuild dans
sa variable SRC_URI lors du digest.
Vous pouvez ajouter digest à votre variable FEATURES, pour que
Portage crée automatiquement les nouveaux digests. Vous pouvez aussi
ajouter autoaddcvs pour que repoman, l'outil que vous utiliserez
pour soumettre des ebuilds, ajoute automatiquement les digests manquants
à votre place dans le CVS.
Sur les architectures le permettant, vous pouvez également utiliser
sandbox dans votre variable FEATURES pour vous assurer que les
ebuilds ne modifient pas le système de fichiers racine directement.
Ajouter/Supprimer des paquets
Admettons que vous avez déjà ajouté un nouveau paquet foo dans app-misc.
Exemple de code 1.6 : Ajout d'un paquet |
# cd $CVSROOT/app-misc
# cvs update
# mkdir foo
# cvs add foo
# cd foo
# cp /repertoire/pour/foo-1.0.ebuild ./
# ebuild foo-1.0.ebuild digest
# cvs add foo-1.0.ebuild ChangeLog files
# cvs add files/digest-foo-1.0
|
Souvenez-vous que vous devez également ajouter un fichier metadata.xml
contenant des informations sur le mainteneur. Lire la section Metadata Gentoo pour plus d'informations.
À ce moment-là de votre travail, vous êtes prêt à soumettre votre travail (lire
la section sur la soumission plus bas). Mais que se passe-t-il si vous voulez
supprimer foo-1.0 quand foo-1.1 est sorti ?
Exemple de code 1.7 : Suppression d'un paquet |
# cd CVSROOT/app-misc/foo
# cvs update
# cvs remove foo-1.0.ebuild files/digest-foo-1.0
|
Nous sommes fin prêt à faire des soumissions. Vous pouvez passer au chapitre
suivant.
Soumettre
Utilisez toujours repoman commit au lieu de cvs commit. Repoman
est un outil d'assurance qualité (QA) qui réalise un certain nombre de
vérifications de base et crée les fichiers Manifests. Si une
partie des messages de sortie de repoman ne vous semble pas claire, lisez la
page de manuel (man repoman). Il est possible que vous ayez besoin de
taper un certain nombre de fois votre mot de passe. keychain vous sera alors d'un grand secours.
Exemple de code 1.8 : Utilisation de repoman |
# repoman scan
# repoman commit
|
4.b. Divers
Mettre des fichiers sur les miroirs
La procédure pour déposer un nouveau fichier dans distfiles sur les
miroirs Gentoo est très simple : il suffit de le copier dans le répertoire
/space/distfiles-local sur le serveur dev.gentoo.org.
Courrier électronique
Notre infrastructure permet aux développeurs de gérer leur propre courrier. La
documentation sur le courrier
électronique Gentoo contient les instructions nécessaires pour configurer
au mieux votre adresse courrier gentoo.org.
Écrire sur Planet Gentoo
Nous avons mis en place Planet
Gentoo qui est un service permettant de regrouper les articles écrits par
les développeurs contribuant au projet. C'est optionnel mais nous vous
encourageons à y participer, il aide la communication entre les développeurs,
et les utilisateurs peuvent le trouver intéressant à lire.
Pour pouvoir poster du contenu sur Planet, vous devez avoir votre propre weblog
(ou « blog »). De nombreux sites proposent ce service gratuitiement.
Vous pouvez également en héberger un vous-même si vous en avez les ressources.
Nous pouvons aussi en héberger un pour vous.
Nous souhaitons que le contenu de Planet Gentoo reste lié à Gentoo et/ou au
développement et aux événements liés à Gentoo.
Si nous hébergeons le blog pour vous demandons que vous gardiez son contenu
dans le cadre du sujet (articles sur ou liés à Gentoo). Vous devez aussi
comprendre que si vous perdez ou laissez tomber votre statut de développeur,
vous ne pourrez plus écrire d'articles sur votre blog.
Si vous disposez d'un blog externe, vous devez alors être en mesure de proposer
un flux XML de contenu (flux RSS par exemple). Si votre blog est divisé en
catégories, vous devez pouvoir fournir un flux qui ne couvre que la catégorie
« gentoo » et pas les autres. Ce ne devrait pas être un problème dans
la mesure où presque tous les blogs proposent des flux standardisés.
Pour une question de bon sens, faites attention à ce que vous écrivez. Vos
points de vue pourraient être interprétés de manière erronée. Faites attention
à ne pas entacher notre image.
SI vous souhaitez contribuer à Planet Gentoo, envoyez un courrier électronique
à user-relations@gentoo.org,
soit en demandant qu'on vous héberge un weblog, soit en donnant des détails
concernant votre blog actuel. Nous nous occuperons ensuite des détails et
laisserons alors votre plume parler.
5. La hiérarchie des développeurs
5.a. Introduction
Ce chapitre a pour but d'expliquer la hiérarchie chez les développeurs Gentoo
et de donner aux développeurs un aperçu de la structure de gestion au sein du
projet Gentoo pour la partie développement.
5.b. La structure de gestion
L'objectif de la nouvelle structure de management était de résoudre un certain
nombre de problèmes chroniques concernant le management, la coordination et la
communication au sein du projet Gentoo. En particulier, nous n'avions pas bien
défini la structure de management directionnel et les rendez-vous non officiels
et réguliers qui permettent de communiquer les mises à jour de statuts entre les
développeurs occupant des postes critiques. En règle générale, la plupart de la
communication avait lieu sur IRC et de manière plus sporadique via courrier
électronique. Pratiquement personne, pas même un haut responsable, n'était tenu
de clôturer les projets en temps et en heure.
À cause de cet état de faits, il était difficile d'établir des objectifs et de
vérifier l'état d'avancement des divers projets. Ce manque de communication et
de coordination rendait également le management difficile pour les développeurs
à haute responsabilité même pour leurs propres projets. De plus, un autre
problème classique était que nous n'avions pas de rôles bien définis, ni ne
savions l'étendue du pouvoir de prise de décision chez les développeurs à haute
responsabilité. Du coup, de nombreuses personnes ayant une haute responsabilité
allaient jusqu'à ne pas savoir si elles avaient l'autorité de gérer leur propres
projets et sous-projets. Même si cela n'a jamais été l'intention des personnes à
responsabilité, c'était le résultat malheureux et direct du processus de
développement qui manquait de structure : personne ne savait ce qui se
passait, et tout le monde renvoyait les décisions exécutives à prendre à
l'architecte en chef.
Évidemment, un plan était nécessaire pour résoudre rapidement et de manière
définitive ces problèmes, en améliorant la communication, la coordination et les
responsabilités. Les rôles et le pouvoir décisionnel nécessaires avaient besoin
d'être définis pour les développeurs à responsabilités pour qu'ils puissent
avoir un poste clair et une pleine responsabilité dans la gestion de leurs
projets, et qu'ils puissent ainsi s'assurer que leurs projets soient réalisés
dans les délais, et correctement.
La liste suivante donne l'ensemble du système :
-
Responsables de haut niveau : décident des efforts de
développement à fournir ;
-
Responsables de sous-projets : font le lien entre les efforts de
développement et leurs équipes respectives ;
-
Responsables d'équipe : supervisent leur équipe et s'assurent de
leur productivité ;
-
Développeurs : développent et améliorent Gentoo.
5.c. Responsables de haut niveau et de sous-projets
Les responsables de haut niveau travaillent sur la mise à exécution des aspects
majeurs du développement, comme par exemple la coordination des sorties de
projets Gentoo. Ils sont également responsables de la répartition des efforts de
développement dans les divers projets, et comment Gentoo peut s'améliorer, en
utilisant les retours d'expérience des développeurs et utilisateurs.
Les responsables de sous-projets ont pour tâche de coordonner les demandes des
responsables haut niveau et celles de la communauté Gentoo avec leurs équipes.
Par exemple, les nouvelles directives pour l'architecture x86 peuvent concerner
les équipes base-system et kernel, qui devront alors être
coordonnées par un responsable de sous-projet.
Les responsables de sous-projet sont optionnels, tout autant que les
responsables de haut niveau. Cependant dans la plupart des cas votre équipe
finira tôt ou tard par travailler sous les recommandations des responsables
d'architecture.
5.d. Responsables d'équipe
Les responsables d'équipe sont responsables de l'organisation des développeurs
de leur équipe et de la coordination des sorties publiques de projets. Ils
doivent également résoudre les problèmes relatifs à leur équipe, et proposer des
améliorations de leurs produits en utilisant les retours d'expérience venant de
la communauté.
Les équipes n'ont pas nécessairement besoin de responsable, et certaines équipes
travaillent avec un système on-corrige-quand-on-reçoit et cette solution donne
parfois de meilleurs résultats que s'il y avait un responsable d'équipe. Mais
la décision d'avoir ou non un responsable d'équipe reste une décision que doit
prendre l'équipe elle-même.
La plupart des équipes font partie d'un regroupement d'équipes qui est
constitué avec pour objectif l'organisation autour d'un effort particulier à
fournir. Vous pouvez vous rapporter à la page sur le projet Metadata pour plus
de détails.
5.e. Développeurs
Les développeurs sont responsables du développement de la distribution
ou du projet sur lequel ils sont assignés. Certains développeurs font partie
d'une équipe, d'autres travaillent sur un projet qui n'a pas d'équipe
attribuée, ni de regroupement d'équipe.
Si un développeur a un quelconque problème, il peut en parler avec son
responsable d'équipe, leur responsable de haut niveau ou peuvent également
envoyer un courrier à une liste de diffusion comme gentoo-dev ou gentoo-core
en demandant des avis ou commentaires sur un point précis.
B. Guides
1. Guide pour les ebuilds
1.a. 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 (quelle que soit la version) partagent le même
répertoire ma_categorie/mon_paquet dans
/usr/portage, à moins que vous ayez des surcouches
« overlays » installées.
Récupérer une version de l'arbre de Portage avec CVS
Si vous n'êtes pas familier avec le fonctionnement de CVS, vous pouvez lire le
tutoriel CVS pour plus
d'informations.
L'arbre de Portage se trouve dans le module gentoo-x86 de l'arbre de
Gentoo Linux. Pour récupérer ce module (environ 350 Mo), vous devez tout
d'abord préparer CVS, comme spécifié dans le guide cité plus haut, puis
récupérer le module gentoo-x86.
Ce qu'on (ne) peut (pas) mettre dans l'arbre de Portage
Avant d'écrire un ebuild, vérifiez sur bugs.gentoo.org qu'il n'en existe pas déjà
un, mais qui n'aurait pas encore été mis dans Portage. Allez sur bugs.gentoo.org, choisissez query
et sélectionnez Advanced Search. Pour le produit, prenez Gentoo
Linux et comme composant, ebuilds. Dans le champ réservé à la
recherche écrivez le nom de l'ebuild, puis comme statut, selectionnez
NEW, ASSIGNED, REOPENED et RESOLVED
(RESOLVED est important ici), puis envoyez la requête. Pour les
fainéants, cliquez directement ici.
En règle générale, l'arbre de Portage ne doit être utilisé que pour stocker des
fichiers .ebuild, ainsi que divers fichiers qui leur sont liés,
comme par exemple les correctifs et des petits fichiers de configuration. Ce
genre de fichiers doit être placé dans le répertoire
/usr/portage/macat/monpaquet/files pour garder une organisation
des répertoires /macat/monpaquet la plus propre et ordonnée
possible. Les exceptions à cette règle sont réservées aux correctifs de taille
importante qui doivent être placés sur les miroirs Gentoo pour que les
utilisateurs ne perdent pas de bande passante et d'espace disque inutiles en
les télechargeant. De plus, vous ne devriez pas ajouter des fichiers binaires
(non-ASCII) au CVS dans l'arbre de Portage. 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 :
Exemple de code 1.1 : Ajouter un binaire au CVS |
# 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
demander 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 ne devront pas être
compressés. Cela permet à CVS de récupérer les modifications et d'informer
correctement les développeurs de la présence de conflits.
Souvenez-vous que les paquets que vous soumettez doivent être prêts à
l'utilisation de manière autonome s'ils sont soumis comme étant stables.
Assurez-vous que vous disposez d'un bon environnement de configuration qui
satisfasse le plus grand nombre de systèmes et d'utilisateurs qui utiliseront
votre paquet. Si votre application a un problème et que vous n'êtes pas sûr de
la solution pour le faire fonctionner, vous pouvez vous inspirer de ce que les
responsables d'autres distributions ont mis en place pour obtenir un paquet
fonctionnel. Vous pouvez regarder chez Mandriva ou Debian ou Fedora pour avoir de bons exemples.
Quand ils effectuent une soumission au CVS, tous les développeurs doivent
utiliser repoman commit en lieu et place de cvs commit pour
soumettre leurs ebuilds. Avant de faire une soumission, vous devez exécuter la
commande repoman full pour vous assurer que vous n'avez rien oublié.
Politique de soumission au CVS
-
Toujours exécuter repoman scan avant de soumettre son travail ;
- Exécutez repoman full avant de faire une soumission ;
-
Toujours vérifier que package.mask est en règle en effectuant
un emerge --pretend monpaquet avant de le soumettre et vérifiez qu'il
n'y a aucun conflit ;
-
Toujours mettre à jour le ChangeLog avant de faire une
soumission ;
-
Toujours mettre à jour en premier package.mask avant de mettre
à jour le paquet concerné. Il peut y avoir des conflits lors de la
soumission de package.mask ;
-
Toujours faire des soumissions atomiques. Si vous soumettez un paquet avec
une nouvelle licence ou un paquet masqué, alors il vous faudra tout d'abord
soumettre la mise à jour de package.mask, puis soumettre
l'ebuild, le ChangeLog et le metadata.xml d'une traite. Sauf si vous
souhaitez corrompre les installations des utilisateurs...
Le répertoire de destination pour les fichiers
Comme remarqué précédemment, dans chaque sous-répertoire de paquet, il y a un
répertoire files/. Tous les correctifs, fichiers de configuration
et tous les fichiers annexes à votre paquet doivent être placés dans ce
répertoire. Vous aurez probablement à vous demander comment nommer un correctif
que vous avez vous-même créé, simplement pour que votre paquet puisse compiler
avec un nom de version spécifique. Il vous faudra alors le nommer par exemple
monpaquet-1.0-gentoo.diff ou plus simplement
1.0-gentoo.diff. Remarquez la présence de l'extension
gentoo qui indique aux utilisateurs que ce correctif a été créé
par les développeurs pour Gentoo Linux et n'a donc pas été récupéré sur une
liste de diffusion ou ailleurs. Encore une fois, ne compressez pas les fichiers
diffs, car CVS n'est pas très bon dans la gestion des fichiers binaires.
Préfixez ou suffixez (comme par exemple monpaquet-1.0) tous les
fichiers que vous mettez dans le répertoire files/ afin que les
fichiers utilisés pour chaque version d'un ebuild soit identifiables entre eux
et que les changements entre les différentes révisions soient visibles. C'est
en général une très bonne idée. Vous pouvez également utiliser un autre suffixe
si vous voulez donner plus de sens au nom du correctif.
Si plusieurs fichiers doivent aller dans le répertoire files/,
vous pouvez créer des sous-répertoires comme par exemple
files/1.0/ et mettre les fichiers en question dans le bon
sous-répertoire. Si vous utilisez cette méthode, vous n'avez pas besoin
d'indiquer plus d'informations dans le nom des fichiers, ce qui est d'ailleurs
l'usage habituel, car c'est plus commode.
1.b. 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 |
| (aucun) |
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 provenant de Gentoo
Linux, 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.
En-têtes
Quand vous soumettez vos ebuilds, les en-tê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 à :
Exemple de code 2.1 : En-tête valide |
# Copyright 1999-2005 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: $
|
Les 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.
Les 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}.
|
Les 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 variableKV qui est
automatiquement définie par Portage. Sur un système utilisant
gentoo-sources-2.4.20-r6, KV devra avoir la valeur "2.4.20".
|
| keepdir |
Crée (si besoin) un fichier .keep dans un répertoire donné
afin qu'il ne soit pas supprimé automatiquement. Ne jamais créer de
fichier .keep soi-même. Si Portage change le fonctionnement de
keepdir, créer un tel fichier soi-même pourrait casser le paquet.
|
| econf |
Exécute ./configure avec les changements de répertoires nécessaires
(prefix, host, mandir, infodir, datadir, sysconfdir, localstatedir). Vous
pouvez é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 |
Informe l'utilisateur d'un événement important. L'argument passé à
elog est le message qui sera donné à l'utilisateur. N'utilisez pas
elog pour afficher des bannières comme
"*************************************". Le fait même d'utiliser
elof est suffisant pour attirer l'attention de l'utilisateur. Le
message est aussi sauvegardé dans un fichier de traçage (« log »)
en utilisant le système « ELOG » de Portage.
|
| einfo |
Affiche des informations moins importantes qui ne seront pas sauvegardés
dans un fichier de traçage (« 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.
|
Les 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 :
Exemple de code 2.2 : Couper une ligne dans un ebuild |
./configure \
--prefix=/usr || die "configure failed"
|
Pour plus de détails, référez-vous à skel.ebuild (en général il se
trouve dans /usr/portage).
Si vous utilisez Vim pour éditer des ebuild ou eclass, le fichier par défaut de
vimrc, /etc/vim/vimrc, s'assure déjà de l'indentation correcte et
des configurations concernant le type de fichier des ebuild et eclass
existent. Pour de meilleurs résultats, comme par exemple avoir une coloration
syntaxique spécifique aux mots-clefs des ebuilds, installez
app-vim/gentoo-syntax.
Sur les systèmes non Gentoo, vous pouvez obtenir des résultats similaires en
utilisant les lignes suivantes dans votre vimrc, ou mieux en installant les
scripts « gentoo-syntax » qui peuvent être téléchargés à partir des
serveurs mirroirs de Gentoo.
Exemple de code 2.3 : Configurer vimrc pour éditer des ebuilds |
au BufRead,BufNewFile *.e{build,class} let is_bash=1|setfiletype sh
au BufRead,BufNewFile *.e{build,class} set ts=4 sw=4 noexpandtab
|
Si vous utilisez Emacs, vous pouvez installer par la commande emerge, le
paquetage « app-emacs/gentoo-syntax » (pour GNU Emacs ou
« app-xemacs/gentoo-syntax » (pour XEmacs). Ces paquetages
fournissent des fonctions majeures pour Emacs pour l'indentation automatique
et pour la mise en surbrillance des fichiers « ebuild » et des autres
types de fichiers spécifiques au système d'exploitation Gentoo.
Si vous utilisez nano, alors vous avez de la chance ! Éditez simplement
/etc/nanorc et décommentez la section liée aux ebuilds.
Les paramètres USE
L'objectif des variables USE est de vous permettre de configurer Portage et de
généraliser et automatiser l'utilisation ou la non utilisation de certaines
options de compilation. Voici un exemple. Imaginons que vous soyez un
fan de GNOME et vous voulez que tous les ebuilds qui ont gnome comme
option de compilation le supporte effectivement. Alors, vous ajouteriez
gnome à votre variable USE dans /etc/make.conf et
Portage ajoutera automatiquement les possibilités optionnelles de GNOME dans
vos ebuilds si elles sont disponibles. Sinon, si vous ne voulez pas des options
GNOME dans vos ebuilds alors qu'elles sont disponibles, éditez tout simplement
/etc/make.conf et assurez-vous que gnome n'est
pas présent dans la variable USE. Gentoo a un nombre important de
paramètres USE vous permettant d'obtenir un système configuré exactement comme
vous le souhaiteriez. De plus, vous pouvez désormais utiliser un paramètre
USE par paquet, en éditant le fichier
/etc/portage/package.use.
Note :
Si vous enlevez un paramètre USE (par exemple, enlever gnome de
USE), cela ne fera que préciser à Portage de ne pas activer le support
optionnel de GNOME dans vos paquets. Cela dit, si vous installez un
ebuild qui nécessite GNOME, alors le paquet aura évidemment le support
de GNOME activé, comme vous pouviez vous en douter. Cela signifie également que
GNOME sera installé automatiquement (en tant que dépendance) s'il ne l'était
pas encore. C'est pourquoi c'est toujours une bonne idée de faire un emerge
--pretend (ou mieux emerge --ask) avant de procéder à l'installation
effective. De cette manière, vous saurez exactement ce qui sera installé par
emerge.
|
Dans vos propres ebuilds, vous pouvez vérifier si une variable USE est présent
en utilisant la commande use <variable>. Elle s'utilise comme suit
:
Exemple de code 2.4 : Vérifier qu'un paramètre USE est défini |
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 :
Exemple de code 2.5 : Conditions utilisant les paramètres USE |
DEPEND="X? ( >=x11-base/xfree-4.3 )
mysql? ( >=dev-db/mysql-3.23.49 )
apache2? ( >=net-www/apache-2 )
!apache2? ( =net-www/apache-1* )"
src_compile() {
econf \
$(use_enable X x11) \
$(use_enable mysql) \
|| die "Error: econf failed!"
emake || die "Error: emake failed!"
}
|
Cette méthode produit un très bon résultat. Nous n'avons pas à nous préoccuper
de savoir quelles sont les configurations par défaut pour mysql ou X
(activé/désactivé), nous indiquons explicitement à econf ce que nous
voulons qu'il fasse, d'après les paramètres USE. En plus, vous obtenez
un code propre et facile à lire.
Parfois, des options peuvent être conflictuelles. Retourner une erreur dans ce
cas n'est pas une solution. Il vaut mieux choisir la meilleure option et
ignorer l'autre. Pour cela, consultez les responsables du paquet en amont pour
voir ce qu'ils recommandent, voyez quelle solution offre le plus de
fonctionnalités ou lancez une pièce et choisissez pile ou face. Par exemple,
l'ebuild msmtp peut utiliser SSL avec GnuTLS ou avec OpenSSL, ou pas de
SSL du tout. GnuTLS est préféré, car il offre plus beaucoup plus de
fonctionnalités que OpenSSL.
Exemple de code 2.6 : Choisir parmi des options conflictuelles |
src_compile() {
local myconf
if use gnutls ; then
myconf="${myconf} --enable-ssl --with-ssl=gnutls"
elif use ssl ; then
myconf="${myconf} --enable-ssl --with-ssl=openssl"
else
myconf="${myconf} --disable-ssl"
fi
econf \
# Other stuff
${myconf} \
|| die "configure failed"
emake || die "make failed"
}
|
Pour avoir une table des paramètres USE mise à jour en permanence, voyez ce lien.
1.c. Emplacements des systèmes de fichiers
Introduction à FHS
Les standards de systèmes de fichiers utilisés dans Gentoo Linux suivent de
près le système FHS (pour File system Hierarchy Standard, standard de
hiérarchie dans les systèmes de fichiers). Une description simplifiée de ce
standard vous est proposée dans ce chapitre ; pour avoir les
spécifications complètes, vous pouvez consulter le site pathname.
Note :
La hiérarchie /opt est donnée dans la section 3.12 du FHS. La
section 4.4 s'occupe de ce qui concerne le répertoire /usr/X11R6.
KDE et GNOME ne sont pas précisés dans le standard et ne sont en fait même pas
mentionnés dans la version actuelle de FHS.
|
Comment placer vos paquets dans le système de fichiers
Normalement, si le paquet utilise autoconf et automake, les destinations par
défaut de l'installation du paquet sont correctes, à quelques exceptions
près :
-
Si vous installez un programme dans /bin, /sbin,
/usr/bin ou /usr/sbin, alors les pages de manuel
correspondant à votre programme devraient être installées dans le répertoire
/usr/share/man. Cela peut se faire en général en le spécifiant
dans l'ebuild avec la ligne ./configure --mandir=/usr/share/man.
-
Les fichiers info GNU doivent toujours être installés dans
/usr/share/info, même si les fichiers info sont à propos de
programmes et outils spécifiques à X11, GNOME ou KDE. Faites bien
attention. /usr/share/info est l'unique emplacement
officiel pour les fichiers info GNU. Dans la mesure où plusieurs scripts
./configure installent pas défaut les fichiers info GNU dans
/usr/info, il est souvent nécessaire de faire un appel à
./configure avec pour argument --infodir=/usr/share/info.
-
Les fichiers de documentation sont installés dans
/usr/share/doc dans un sous-répertoire reflétant le nom, la
version et la révision d'un programme particulier. Cela s'applique à tous
les programmes : GNOME, KDE, X11, etc. Cependant, certains programmes
installeront de la documentation supplémentaire et les placeront dans la
hiérarchie /usr/share pour leurs propres besoins.
-
Les programmes et bibliothèques spécifiques à X11 doivent toujours être
installés dans /usr et non directement dans
/usr/X11R6. Nous réservons la hiérarchie
/usr/X11R6 pour le système X, version 11, sortie R6 en
personne. D'autres distributions feront probablement une interprétation
différente du FHS concernant cette hiérarchie.
-
Les programmes GNOME et KDE, de la même manière, doivent être installés dans
/usr.
Important :
Certaines distributions choisissent d'installer GNOME et KDE dans
/opt. Il n'existe aucun standard pour ces environnements de bureau
concernant l'endroit où doivent être installés leurs fichiers. Dans une optique
de simplicité et de consistance, nous avons choisi d'installer tous les paquets
KDE et GNOME dans la hiérarchie /usr.
|
En général, vos ebuilds doivent installer leurs fichiers dans l'arborescence
/usr. Quelques programmes peuvent être compilés et liés
avec ou non des bibliothèques de GNOME, KDE, X11, ce qui peut occasionner un
peu de confusion. Notre solution consiste à tout installer dans
/usr, ce qui empêche les ambiguïtés et évite une complexité
inutile pour les auteurs d'ebuilds. L'emplacement dans lequel doivent être
installés les fichiers d'un programme ne doit pas dépendre de la
présence ou non de paramètres USE. Du coup, les ebuilds dans l'arbre de
Portage s'installent presque toujours dans la hiérarchie
/usr exclusivement.
Note :
Le répertoire /opt est réservé dans Gentoo aux paquets uniquement
binaires. Par exemple, mozilla-bin, acroread, netscape et realplayer. Les
paquets installés ici auront en général un fichier
/etc/env.d/foo. Cela a pour objectif d'inclure dans
l'environnement les répertoires et les variables additionnelles nécessaires.
Pour plus d'informations sur /etc/env.d, lisez le chapitre ce Manuel
Gentoo.
|
1.d. Les scripts et utilitaires de Portage
Scripts publiques
Des scripts permettent à un administrateur système d'installer ou supprimer les
paquets et de maintenir à jour la base de données des paquets.
ebuild est l'outil de base du système de Portage : il effectue
toutes les tâches principales comme par exemple désarchiver, compiler,
installer, fusionner, désinstaller les paquets. Il est appelé en utilisant la
commande : ebuild chemin/vers/paquet.ebuild commande. Les
commandes disponibles sont :
| Commande |
Description |
Fonction ebuild associée |
|
setup* |
Effectue toutes les commandes nécessaires avant qu'un ebuild ne commence
son travail effectif
|
pkg_setup |
| depend |
Affiche les dépendances requises à la construction du paquet
|
Non disponible |
|
merge* |
Désarchive, compile, installe et fusionne le paquet dans le système de
fichiers
|
Non disponible |
|
qmerge* |
Fusionne le paquet dans le système de fichiers, en supposant que le
désarchivage, la compilation et l'installation ont déjà été exécutés
|
Non disponible |
|
unpack* |
Désarchive une archive source dans le répertoire de travail
|
src_unpack |
|
compile* |
Compile le paquet |
src_compile |
| rpm |
Crée un RPM à partir du paquet |
Non disponible |
| package |
Crée un paquet Gentoo tbz2
|
Non disponible |
|
prerm* |
Exécute une étape de pré-suppression de paquet |
pkg_prerm |
|
postrm* |
Exécute une étape de post-suppression de paquet |
pkg_postrm |
|
preinst* |
Exécute une étape de pré-installation du paquet |
pkg_preinst |
|
postinst* |
Exécute une étape de post-installation du paquet |
pkg_postinst |
| config |
Met en place une configuration par défaut, une fois que le paquet a été
fusionné
|
pkg_config |
|
touch* |
Met à jour l'attribut mtimes pour chaque archive source dans un paquet
|
Non disponible |
|
clean* |
Nettoie le répertoire de travail pour un paquet |
Non disponible |
|
fetch* |
Récupère les archives sources du paquet |
Non disponible |
|
manifest* |
Crée un fichier Manifest pour un paquet |
Non disponible |
|
test* |
Exécute la routine de test automatique du paquet |
src_test |
|
install* |
Installe le paquet dans le répertoire image |
src_install |
| unmerge |
Désinstalle le paquet du système de fichiers |
Non disponible |
Note :
Les commandes avec un astérisque (*) ne sont en généralement utilisées que par
le développeur.
|
emerge installe de manière récursive le paquet et toutes ses dépendances
dans le système de fichiers. Cette commande a de nombreuses options, faites un
emerge --help pour en avoir la liste.
env-update met à jour les fichiers de configuration (entre autres mais
pas seulement : /etc/ld.so.conf et
/etc/profile.env) pour inclure les changements effectués par les
paquets installés.
Scripts et commandes privés
Vous pouvez utiliser certains scripts dans vos fichiers ebuilds pour réaliser
des tâches communes.
Si vous voulez un aperçu, jetez un œil aux scripts eux-mêmes dans
/usr/lib/portage/bin.
| Commande |
Valeur par défaut |
Description |
Exemple |
| diropts |
-m0755 |
Fixe les options utilisées lors de l'utilisation de dodir
|
diropts -m0750 |
| dobin |
N/A |
Installe les binaires spécifiés dans DESTTREE/bin
|
dobin wmacpi |
| docinto |
"" |
Fixe le sous-répertoire relatif utilisé par dodoc
(DOCDESTREE)
|
docinto exemples |
| dodir |
N/A |
Crée un répertoire, en utilisant de manière transparente ${D} |
dodir /usr/lib/nouveaupaquet |
| dodoc |
N/A |
Installe les fichiers spécifiés dans le répertoire de documentation du
paquet en question (/usr/share/doc/${PF}/DOCDESTTREE) (voir
docinto)
|
dodoc README *.txt |
| doexe |
N/A |
Installe les fichiers spécifiés avec le mode EXEOPTIONS (cf.
exeopts) dans PATH défini par EXEINTO (cf.
exeinto).
|
doexe ${FILESDIR}/quake3 |
| dohard |
N/A |
Crée un lien dur, en utilisant de manière transparente ${D} |
dohard ls /bin/dir |
| dohtml |
N/A |
Installe les fichiers spécifiés et les répertoires dans
/usr/share/doc/${PF}/html
|
dohtml -r doc/html/* |
| doinfo |
N/A |
Installe les fichiers spécifiés dans /usr/share/info, puis les
compresse avec gzip
|
doinfo doc/*.info |
| doins |
N/A |
Installe les fichiers spécifiés avec le mode INSOPTIONS (voir
insopts) dans INSDESTTREE (voir insinto)
|
doins *.png icone.xpm |
| dolib |
N/A |
Installe les bilbiothèques spécifiées dans DESTTREE/lib avec le
mode 0644
|
dolib *.a *.so |
| dolib.a |
N/A |
Installe les bibliothèques spécifées dans DESTTREE/lib avec le
mode 0644
|
dolib.a *.a |
| dolib.so |
N/A |
Installe les bibliothèques spécifées dans DESTTREE/lib avec le
mode 0755
|
dolib.so *.so |
| doman |
N/A |
Installe les fichiers spécifiés dans /usr/share/man/manX,
selont le suffixe du fichier (file.1 ira dans man1)
|
doman *.1 *.5 |
| dosbin |
N/A |
Installe les fichiers dans DESTTREE/sbin, en s'assurant qu'ils
sont exécutables
|
dosbin ksymoops |
| dosym |
N/A |
Crée un lien symbolique, en utilisant ${D} de manière transparente |
dosym gzip /bin/zcat |
| emake |
N/A |
Exécute make avec MAKEOPTS. Certains paquets ne peuvent pas être
faits en parallèle. Utilisez emake -j1 pour y échapper. Si vous devez
passer des arguments supplémentaires à make, donnez-les simplement à la
commande emake. Les utilisateurs peuvent utiliser la variable
d'environnement EXTRA_EMAKE pour passer des paramètres
supplémentaires à emake.
|
emake |
| exeinto |
/ |
Fixe la racine (EXEDESTTREE) pour la commande doexe
|
exeinto /usr/lib/${PN} |
| exeopts |
-m0755 |
Fixe les options utilisées lors de l'utilisation de doexe
|
exeopts -m1770 |
| fowners |
N/A |
Applique l'appartenance spécifique d'un fichier à un utilisateur, en
utilisant la commande chown et en utilisant ${D} de manière transparente
|
fowners root:root /sbin/fonctions.sh |
| fperms |
N/A |
Applique les permissions spécifiques à un fichier spécifique via la commande
chmod, en utilisant ${D} de manière transparente
|
fperms 700 /var/consoles |
| insinto |
/usr |
Fixe la racine (INSDESTTREE) pour la commande doins
|
insinto /usr/include |
| insopts |
-m0644 |
Fixe les options utilisées lors du lancement de doins
|
insopts -m0444 |
| into |
/usr |
Fixe le préfixe de la cible (DESTTREE) pour toutes les
commandes 'do' (comme dobin, dolib, dolib.a,
dolib.so, domo, dosbin)
|
into / |
| libopts |
-m0644 |
Fixe les options utilisées lors de l'exécution de dolib
|
libopts -m0555 |
| newbin |
N/A |
Couche supplémentaire à dobin qui installe le binaire spécifié et le
renomme de manière transparente au second argument.
|
newbin ${FILESDIR}/vmware.sh vmware |
| newdoc |
N/A |
Surcouche de dodoc qui installe le fichier spécifié et le renomme de
manière transparente au second argument
|
newdoc README README.opengl |
| newexe |
N/A |
Surcouche de doexe qui installe le fichier spécifié et le renomme de
manière transparente au second argument
|
newexe ${FILESDIR}/xinetd.rc xinetd |
| newins |
N/A |
Surcouche de doins qui installe le fichier spécifié et le renomme de
manière transparente au second argument
|
newins ntp.conf.example ntp.conf |
| newman |
N/A |
Surcouche de doman qui installe le fichier spécifié et le renomme de
manière transparente au second argument
|
newman xboing.man xboing.6 |
| newsbin |
N/A |
Surcouche de dosbin qui installe le fichier spécifié et le renomme de
manière transparente au second argument
|
newsbin strings strings-static |
| prepall |
N/A |
Exécute prepallman, prepallinfo et prepallstrip.
Cette fonction s'assure de plus que toutes les bibliothèques dans
/opt/*/lib, /lib, /usr/lib et
/usr/X11R6/lib sont exécutables. Enfin, déplace et isole les
macros aclocal dans /usr/share/aclocal
|
prepall |
| prepalldocs |
N/A |
Le fonctionnement de Portage a évolué et les nouveaux ebuilds ne doivent
plus utiliser cette fonction.
|
prepalldocs |
| prepallinfo |
N/A |
Archive de manière récursive avec gzip tous les fichiers info dans
/usr/share/info
|
prepallinfo |
| prepallman |
N/A |
Archive de manière récursive avec gzip toutes les pages man dans
/opt/*/man/*, /usr/share/man/*,
/usr/local/man/*, /usr/X11R6/share/man/* et
s'occupe de manière transparente des liens symboliques
|
prepallman |
1.e. Les dépendances des paquets
Pourquoi les dépendances sont importantes
Portage est plus qu'un simple script qui vous permet d'unifier la méthode
d'installation d'un projet quelconque (programme, bibliothèque) à partir des
sources. Il récupère et installe également toutes les dépendances nécessaires si
vous les spécifiez correctement dans votre ebuild.
Dans les ebuilds officiels, toutes les dépendances ont été spécifiées de telle
manière que si vous exécutez emerge net-www/mozilla/mozilla-1.0, Portage
s'assurera que toutes les bibliothèques nécessaires à Mozilla seront construites
et installées correctement avant que Mozilla ne soit lui-même construit.
Portage va même jusqu'à distinguer les dépendances dues à la compilation et
celles dues au lancement. Cela dit, pour le moment, Portage installe toutes les
dépendances de compilation et de lancement, et laisse l'état tel quel. Dans
une prochaine version, il est prévu de permettre que seules les dépendances de
lancement soient effectivement installées.
Comment préciser les dépendances dans vos ebuild
La variable DEPEND dans votre foo-x.y.z.ebuild indique à
Portage les paquets qui sont nécessaires à la construction de foo.
La variable RDEPEND indique à Portage les paquets nécessaires au
lancement du paquet. La variable RDEPEND doit être explicitement
renseignée même si son contenu est le même que la variable DEPEND car
prochainement, cette variable dont elle correspond par défaut
« DEPEND » ne sera plus utilisé par le système de gestion des
paquetages Portage de Gentoo.
Exemple de code 5.1 : Exemple de dépendances |
DEPEND="virtual/opengl
dev-libs/libxml2"
RDEPEND="${DEPEND}"
|
Cela indique à Portage de construire foo-x.y.z, les paquets
virtual/opengl (plus de précisions sur les virtuals seront données
plus tard) et dev-libs/libxml2 étant nécessaires à la construction.
Il ne précise pas la version d'opengl ou de libxml2 dont vous avez besoin, ce
qui signifie que n'importe laquelle ira très bien.
La mention de n'importe laquelle fait évidemment un peu peur et ne
fonctionnera pas en général. En revanche, pour des bibliothèques centrales
qui font tout pour avoir des binaires toujours compatibles, cela
fonctionnera. Pour d'autres bibliothèques, on peut évidemment préciser la
version des dépendances.
Exemple de code 5.2 : Exemple avec les versions |
>=sys-apps/bar-1.2
=sys-apps/baz-1.0
|
>= et = font bien ce qu'on espère qu'ils feront : toutes les versions
plus récentes que sys-apps/bar version 1.2 conviendront (ce qui signifie aussi
que sys-apps/bar-2.0 suffira), alors que sys-apps/baz version 1.0 est l'unique
version acceptée. Pour plus d'informations sur le schéma de version des
paquets voir la section plus haut sur comment nommer des fichiers ebuild.
Voici d'autres méthodes pour spécifier la version des dépendances :
Exemple de code 5.3 : Spécifier la version des dépendances |
~sys-apps/qux-1.0
=sys-apps/foo-1.2*
!sys-libs/gdbm
|
~sys-apps/qux-1.0 va sélectionner la révision la plus récente de qux-1.0 dans
Portage.
=sys-apps/foo-1.2* va selectionner le membre le plus récent de la série 1.2,
mais ignorera la 1.3 et les versions plus récentes/vieilles. Ainsi foo-1.2.3 et
foo-1.2.0 sont tous les deux valides, mais foo-1.3.3, foo-1.3.0 et foo-1.1.0 ne
le sont pas. Veuillez noter que la version foo-1.22.3 correpond aussi et
pourrait très bien provoquer des problèmes dans certains cas.
!sys-libs/gdbm vous empêchera d'installer ce paquet tant que gdbm sera déjà
installé.
À noter
De nombreux problèmes peuvent survenir à cause des variables DEPEND et RDEPEND.
Les conseils suivants devraient vous aider à éviter ces problèmes :
-
Toujours indiquer la catégorie.
Par exemple, utilisez >=x11-libs/gtk+-2 et pas
>=gtk+-2 ;
-
Ne pas utiliser d'astérisque (*) pour les dépendances >=.
Par exemple, utilisez >=x11-libs/gtk+-2 et pas
>=x11-libs/gtk+-2* ;
-
Ne pas créer de dépendance sur un meta-paquet.
Ne faites pas
dépendre vos ebuilds de gnome-base/gnome, mais utilisez la bibliothèque
spécifique ;
-
Une seule dépendance par ligne.
Ne mettez pas plusieurs dépendances sur la même ligne, car elles difficiles
à lire ;
-
GTK: toujours utiliser =x11-libs/gtk+-1.2* pour des applications
GTK+1.
De plus, il est important de vérifier que toutes les dépendances sont
mentionnées :
-
Regardez dans configure.in ou configure.ac.
Cherchez y des tests sur la présence de paquets tels que pkg-config ou des
fonctions AM_* qui testent des versions spécifiques ;
-
Regardez dans les fichiers .spec.
Ces fichiers donnent de bonnes indications quant aux dépendances, mais ne
les considérez pas commme complets ;
-
Consultez le site de l'application ou de la bibliothèque.
Vérifiez les dépendances mentionnées sur les sites concernés ;
-
Lisez le fichiers README et INSTALL du paquet.
Ils contiennent souvent des indications précieuses ;
-
N'oubliez pas les dépendances non-relatives au programme même, par
exemple pkg-config, la génération de la documentation, etc.
Généralement, la compilation nécessite des outils tels que intltool,
libtool, pkg-config, doxygen, scrollkeeper, gtk-doc, etc. Vérifiez que ces
dépendances sont indiquées.
Pour les derniers détails sur les éléments DEPEND, lisez la section 5 de
la page man sur les ebuilds : man 5 ebuild.
1.f. Tester et déployer
ChangeLog
Dès que vous mettez à jour un (ou que vous écrivez un nouveau) ebuild, vous
devez également mettre à jour (ou créer) le ChangeLog correspondant. Le fichier
skel.ChangeLog contient un exemple de ChangeLog que vous pouvez
utiliser comme base.
L'objectif du ChangeLog est de documenter ce qui a été fait,
pourquoi cela a été fait et par qui. Cela permet à la fois aux
développeurs et aux utilisateurs de garder une trace des changements effectués
de manière simple.
Le ChangeLog est tout d'abord fait pour les utilisateurs, donc assurez-vous
qu'il reste court (jusqu'à un certain point) et évitez de devenir verbeux sur
les détails techniques internes.
Sauvegarder vos propres ebuilds localement
Afin de pouvoir tester vos ebuilds et de permettre à Portage de les utiliser,
vous devez les placer dans un répertoire connu. Portage utilisera la variable
PORTDIR_OVERLAY que vous pouvez définir dans
/etc/make.conf. Vous devriez fixer cette variable à votre
répertoire local de travail (par exemple, /usr/local/portage).
Dans ce répertoire, vous devez avoir la même structure (et les mêmes catégories)
que dans /usr/portage.
En utilisant PORTDIR_OVERLAY, vos ebuilds restent sur votre système, même
après un emerge sync et ils restent connus de Portage.
Tester le paquet
Prenez le temps de penser à la façon de tester votre paquet. Parfois, les
développeurs ont intégré une routine make check qui permet de tester les
fonctionnalités de base du paquet. Dans ce cas, la commande FEATURES=test
ebuild foo-x.y.z.ebuild test l'exécutera. Si cela ne
fonctionne pas, essayez de résoudre le problème et proposez votre solution aux
développeurs du paquet.
Dans le cas contraire, pensez à ajouter une routine src_test à votre
ebuild. Elle sera exécutée avant la routine src_install et permet de
vérifier que le programme fonctionne sur toutes les architectures. Chaque
responsable d'une architecture appréciera cette fonction, car elle leur évite
de devoir connaître le paquet en question.
N'oubliez pas les spécifications des ebuilds. La routine src_test ne
doit pas être interactive. Si elle dépend d'autres paquets, utilisez l'option
USE test pour indiquer qu'il y a des dépendances à la compilation.
De plus, remarquez qu'une routine src_test n'est pas recommandée pour
des applications graphiques X, car l'utilisateur qui exécute portage ne peut
généralement pas lancer ce type d'application.
Outils de tests utiles
Vous disposez de quelques outils pratiques pour vous aider à écrire et
maintenir vos ebuilds.
| Outil |
Paquet |
Description |
| repoman |
sys-apps/portage |
Un outil pour les développeurs uniquement, pour les assister dans la
procédure de vérification pour déposer un ebuild dans le CVS. Il effectue
de nombreuses vérifications communes de qualité (QA) et essaie de s'assurer
que les fichiers ajoutés dans le cvs ne vont pas casser l'arborescence de
Portage.
|
| ccache |
dev-util/ccache |
Outil qui garde les fichiers pré-compilés, pour pouvoir rendre la
compilation plus rapide. Assurez-vous d'ajouter ccache dans
votre variable FEATURES dans le fichier /etc/make.conf
|
| sandboxshell |
app-shells/sandboxshell |
Ouvre un shell qui crée un environnement « bac à sable ». Très
utile pour entrer dans le même environnement que celui dans lequel Portage
construit les paquets, et y appliquer manuellement des corrections.
|
| echangelog |
app-portage/gentoolkit-dev |
Permet de créer un nouveau ChangeLog ou d'ajouter une entrée dans un
ChangeLog déjà existant.
|
2. Guide pour les eclass
2.a. Introduction aux fichiers eclass
Le principe des fichiers eclass
Les fichiers eclass sont des modules de code partagé. Ils sont écrits en bash
et ont la même syntaxe que les ebuilds ordinaires. Ils sont hérités par des
ebuilds ou d'autres eclass pour proposer des configurations par défaut et des
fonctionnalités qu'on peut retrouver dans de nombreux ebuilds similaires.
Cela permet d'assurer une réutilisation du code entre des ebuilds similaires.
Le premier chapitre montre rapidement comment écrire un eclass en y incorporant
des astuces et techniques standards utilisées dans des eclass déjà existants.
Le second chapitre offre un tour d'horizon des eclass de KDE. Le troisième
explique comment créer un ebuild pour KDE en utilisant le groupe d'eclass de
KDE.
Un exemple d'eclass simple
Voici un fichier eclass fictif : sourceforge.eclass, créé pour proposer la
page Internet principale et des URI de téléchargement pour des projets hébergés
par sourceforge.net.
Exemple de code 1.1 : Exemple : sourceforge.eclass |
# Copyright 2004 Gentoo Foundation
# Distributed under the terms of the GNU General Public License, v2 or later
# Author Dan Armak <danarmak@gentoo.org>
# $Header:$
# This eclass sets ${HOMEPAGE} and ${SRC_URI} to the standard values for
# sourceforge.net - hosted projects.
HOMEPAGE="http://${PN}.sourceforge.net/"
SRC_URI="http://download.sourceforge.net/${PN}/${P}.tar.gz"
|
Les quatre premières lignes forment l'en-tête qu'on peut trouver dans n'importe
quel ebuild. Les deux lignes suivantes sont une description rapide de l'eclass.
Le reste du code est ce qui fait effectivement le travail : initialiser
SRC_URI et HOMEPAGE.
La plupart des eclass proposent des fonctions d'aide ou des déclarations de
variables : ils contiennent les versions par défaut des fonctions
spéciales d'ebuild (src_unpack, src_compile, etc.) Avant d'écrire une fonction
par défaut dans un eclass, vous devriez prendre connaissance des fonctions par
défaut déjà contenues dans ebuild.sh. Elles contiennent les fonctions qui
seront exécutées si vous n'incluez pas de fonctions dans votre ebuild (même pas
en passant par un eclass) : src_unpack(), par exemple, est une fonction
par défaut qui est souvent utilisée. Si vous ne l'avez pas encore fait, jetez
un œil dans les implémentations par défaut dans ebuild.sh.
C'est tout ce que vous avez besoin de savoir pour écrire des fichiers eclass.
Mettez votre nouvel eclass dans ${PORTDIR}/eclass/ et ajoutez
cette ligne au début de votre ebuild :
Exemple de code 1.2 : Comment hériter d'un eclass |
inherit sourceforge
|
Les contenus de l'eclass seront insérés à cet endroit. Souvenez-vous que toutes
les fonctions et variables définies dans l'eclass peuvent être récrites dans
l'ebuild dans la mesure où le code de l'ebuild sera exécuté après celui de
tous les eclass dont il hérite. De ce fait, vous devez essayer de mettre le
plus possible de configuration par défaut et de code mis en commun dans votre
eclass. Toutes les modifications et configurations non-standards peuvent être
mises dans l'ebuild.
Et vous pouvez bien sûr faire hériter un ebuild de plusieurs eclass en
procédant ainsi :
Exemple de code 1.3 : Héritage multiple |
inherit eclass1 eclass2 [...]
|
Mais faites attention à l'ordre dans lequel ils sont mis ! Souvenez-vous,
les eclass peuvent hériter d'autres eclass et remplacer les configurations
créées par d'autres, donc vous devez faire attention quand vous utilisez
plusieurs eclass à la fois.
Nous allons maintenant donner une liste de petits trucs utiles pour l'écriture
d'eclass avant d'aller voir les eclass déjà présents dans Portage.
inherit()
Cette fonction est présente dans ebuild.sh et permet l'héritage des eclass.
Elle est appelée avec la liste des noms d'eclass à faire hériter : inherit
<eclass1> [eclass2 eclass3...].
En plus de récupérer effectivement les sources des fichiers eclass, elle va
mettre à jour les variables ECLASS et INHERITED qui sont utilisées par Portage
pour mettre en tampon les dates de dernière modification des eclass. La
variable INHERITED peut également être utilisée lors de l'écriture d'un fichier
eclass : elle contient la liste des eclass hérités (dont la source a été
récupérée) jusqu'au moment de la vérification, dans l'ordre. De ce fait, un
eclass peut l'utiliser pour déterminer si oui ou non il a été appelé par
d'autres eclass.
EXPORT_FUNCTIONS
Un bon set de fonctions prédéfinies dans un eclass peut souvent être utilisé
comme tel. L'ebuild contiendra alors très peu de code (ce qui est une bonne
chose). Cependant, les fonctions d'un eclass ne font parfois pas ce que l'on
attend d'elles. Vous pouvez écrire une nouvelle fonction dans votre ebuild, en
écrasant ainsi la définition proposée par l'eclass. Mais cela diminue
l'avantage d'avoir un code réutilisable. Nous essayons donc, à la place,
d'étendre les fonctionnalités des eclass.
Supposons que vous vouliez étendre src_compile(). Vous pouvez écrire une
définition de src_compile() qui ne contiendra que les parties manquantes de
l'eclass src_compile(). Vous pouvez alors appeler l'eclass contenant
src_compile() et exploiter le code de votre fonction personnalisée.
Toutefois, si vous créez une nouvelle fonction src_compile(), bash oubliera
l'ancienne et ne sera pas capable de l'appeler ! C'est ici que la macro
EXPORT_FUNCTIONS entre en jeu.
Observons un autre problème en attendant la solution. Supposons que foo.eclass
et bar.eclass définissent tous les deux src_compile(). Si vous héritez à la
fois de foo et de bar, vous aurez à votre disposition plusieurs implémentations
de src_compile(), selon l'ordre d'héritage que vous avez déclaré. Vous devez
donc garder un œil sur l'ordre de l'héritage des eclass. Mais vous pouvez
vouloir appeler de manière explicite n'importe lequel des deux src_compile().
Donc, tous les eclass ajoutent aux fonctions qu'ils définissent un préfixe. Du
coup, foo.eclass va définir une fonction foo_src_compile() et bar.eclass
définira de son côté bar_src_compile(). De cette manière, l'ebuild peut appeler
les deux fonctions sans problème.
Cependant, vous voulez également avoir une fonction générique src_compile() ou
peut-être même que l'ebuild en a une déjà définie. La macro EXPORT_FUNCTIONS
résoud les deux problèmes présentés précédemment.
Exemple de code 1.4 : EXPORT_FUNCTIONS() (depuis ebuild.sh) |
EXPORT_FUNCTIONS() {
while [ "$1" ]; do
eval "$1() { ${ECLASS}_$1 ; }" > /dev/null
shift
done
}
|
La fonction inherit() initialise ${ECLASS} au nom de l'eclass avant de récupérer
les sources. L'eclass, à la fin, appelle EXPORT_FUNCTIONS() en lui passant
comme paramètres la liste des fonctions par défaut qu'il propose. Par exemple,
si vous appelez :
Exemple de code 1.5 : Exemple d'utilisation de EXPORT_FUNCTIONS |
EXPORT_FUNCTIONS src_compile src_install
|
Alors, EXPORT_FUNCTIONS appellera eval() sur les chaînes de caractères
suivantes :
Exemple de code 1.6 : Résultat d'utilisation de EXPORT_FUNCTIONS |
src_unpack() { foo_src_compile() ; }
src_compile() { foo_src_compile() ; }
|
De plus, n'importe quel eclass hérité définira la fonction par défaut
src_compile() à la fin, mais les deux fonctions peuvent également être appelées
par l'ebuild si nécessaire.
Vous pouvez également étendre la fonction src_compile() en appelant la fonction
de l'eclass à l'intérieur de votre propre fonction. Vous devez alors utiliser
le nom complet de la fonction par défaut foo_src_compile. Par exemple :
Exemple de code 1.7 : Étendre une fonction définie par défaut dans un eclass dans votre ebuild |
foo_src_compile() {
[code par défaut ici]
}
EXPORT_FUNCTIONS src_compile
inherit foo
src_compile() {
[code personnalisé ici]
foo_src_compile
[plus de code personnalisé ici]
}
|
Les sections de fonction
Parfois, étendre une fonctions en ajoutant du code avant et après n'est pas
assez flexible. Avec des fonctions longues et complexes, on veut parfois
pouvoir utiliser son propre code au sein des fonctions par défaut.
Les sections de fonction proposent une plus grande flexibilité qui permet de
s'affranchir du problème soulevé. Elles cassent les fonctions en sections et
vous permettent d'exécuter du code entre deux sections quelconques.
L'implémentation est simple. Prenons par exemple la fonction src_compile()
depuis base.eclass (Note : il n'existe plus, mais c'est un assez bon
exemple). Cette fonction ressemble à ceci :
Exemple de code 1.8 : Exemple pris sur le fichier base.eclass d'origine |
base_src_compile() {
./configure || die
emake || die
}
|
Ici, on trouve une même fonction, divisée en deux sections :
Exemple de code 1.9 : La même fonction, divisée en sections |
base_src_compile() {
[ -z "$1" ] && base_src_compile all
while [ "$1" ]; do
case $1 in
configure)
./configure || die;;
make)
emake || die;;
all)
base_src_compile configure make;;
esac
shift
done
}
|
Ce code a été divisé en deux sections : configure et make.
Dans notre exemple, ils correspondent aux deux commandes de la fonction
d'origine.
Au centre de notre fonction, on a un bloc while;case...esac;shift;done. Ce bloc
vérifie les paramètres passés à la fonction et exécute les lignes de code
correspondant aux paramètres passés.
Le cas particulier all appelle la fonction de manière récursive avec une
liste de sections dans l'ordre. C'est à l'auteur de l'eclass de maintenir cette
liste.
La ligne avant le bloc indique que si on effectue un appel à cette fonction
sans lui donner de paramètres, alors il faut agir de la même manière que si on
avait pour paramètre all. Comme vous pouvez le constater, cette
fonction effectue des appels récursifs. Remarquez également que faire
base_src_compile configure all make est tout aussi autorisé. Il
exécutera en fait base_src_compile configure configure make make.
Désormais, dans votre ebuild (ou eclass) héritant de base.eclass, vous
récupérez une ébauche de fonction src_compile qui appelle base_src_compile sans
paramètre. Cela est en fait équivalent à un appel de base_src_compile avec
pour paramètre all, c'est-à-dire une exécution de toutes ses sections.
Vous pouvez le laisser tel quel. Si vous désirez faire une extension à votre
appel de fonction, vous pouvez définir un nouveau src_compile et appeler
base_src_compile section après section :
Exemple de code 1.10 : Utiliser src_compile() sectionné |
src_compile() {
run_my_code1
base_src_compile configure
run_my_code2
base_src_compile make
run_my_code3
}
|
Comme vous pouvez le remarquer, les sections de la fonction ajoutent une
certaine flexibilité dans la mesure où vous pouvez désormais insérer du code
entre deux sections, mais vous pouvez aussi les lancer dans un ordre différent,
ou lancer seulement certaines sections proposées. Cela permet de mieux
réutiliser le code.
Les fonctions debug-print-*
De nombreuses fonctions sont déjà proposées par ebuild.sh. Certaines d'entre
elles, les fonctions debug-print-*, donnent accès à des fonctions de retour
d'erreur de débogage pour les eclass. Elles vous permettront de faciliter le
traçage de l'exécution de ceux-ci sans avoir à lire les (très) longs retour de
déboggage de bash en mode debug. Par exemple, tous les eclass que j'ai créés
appellent énormément ces fonctions.
debug-print() affiche simplement l'ensemble de ses paramètres avec un préfixe
en « debug: ». Elle est utilisée quand un événement intéressant peut
être mis dans les fichiers log de déboggage.
debug-print-function() affiche « debug: entering function $1, parameters:
$2 [$3 ..] ». Elle est communément appelée au début d'une fonction.
debug-print-section() affiche « debug: now in section $1 ». Elle est
habituellement appelée au début d'une section de fonction.
Les retours de déboggage vont normalement dans
${T}/eclass-debug.log. Vous pouvez cependant assigner une valeur
dans la variable ECLASS_DEBUG_OUTPUT (dans make.globals/conf ou
dans votre environnement tout simplement) et alors le retour y sera envoyé à la
place de la valeur par défaut. Vous pouvez également utiliser la valeur
spéciale « on » qui permet d'envoyer les messages sur stdout avec les
autres messages d'emerge.
Ajoutons un retour de déboggage typique pour récupérer l'état d'avancement de
l'exécution dans notre fonction exemple :
Exemple de code 1.11 : Ajouter des retours de déboggage |
base_src_compile() {
debug-print-function
[ -z "$1" ] && base_src_compile all
while [ "$1" ]; do
case $1 in
configure)
debug-print-section configure
./configure || die;;
make)
debug-print-section make
make || die;;
all)
debug-print-section all
base_src_compile configure make;;
esac
shift
done
debug-print "${FUNCNAME}: result is ${RESULT}"
}
|
Pour votre information, ${FUNCNAME} est une variable interne de bash qui
retourne le nom de la fonction courante.
2.b. Fichiers eclass existants
Introduction
La plupart des eclass sont simples et vous pouvez simplement les lire et
repérer un certain nombre d'ebuilds utilisant ceux-ci pour comprendre comment
ils marchent. De plus, la plupart des eclass sont bien commentés, donc c'est
mieux de les lire directement.
Ce chapitre documente les relations existant entre les eclass kde*.
base.eclass
Cet eclass définit plusieurs variables et fonctions par défaut similairement à
celles que l'on aurait dans un ebuild n'héritant pas d'un eclass (et qui sont
alors définies dans ebuild.sh). Vous ne les utiliserez probablement pas
directement, mais exploiterez des eclass kde qui héritent de base.eclass et
utilisent ces fonctions.
Une fonctionnalité intéressante est auto-patch. Si vous initialisez la
variable PATCHES à une liste de fichiers dans votre ebuild utilisant
base_src_unpack() ou kde_src_unpack(), les sources seront alors corrigées
depuis ces fichiers. Les correctifs doivent fonctionner avec l'option -p0 s'ils
sont lancés depuis ${S}.
Remarquez que vous pouvez initialiser PATCHES sans définir un src_unpack()
personnalisé dans votre ebuild ! C'est là l'astuce.
La récente fonction epatch() dans eutils.eclass est cependant bien plus
puissante. Elle supporte les correctifs archivés, les répertoires de correctifs
et les séries de correctifs, et détecte automatiquement le niveau de correctif
requis. Il est probable que autopatch l'utilise un jour ou l'autre.
Remarquez que la section patch dans base_src_unpack() est
désuète et sera bientôt supprimée. Si vous repérez un ebuild l'utilisant
il devra être changé pour utiliser autopatch à la place.
cvs.eclass
Cet eclass propose un ensemble de fonctionnalités nécessaires pour créer des
ebuilds cvs en « live ». Ce type d'ebuilds récupère les sources sur
un serveur cvs spécifique au moment du désarchivage, ce qui permet de toujours
avoir les derniers correctifs disponibles.
Cependant, le support nécessaire (exploitation des versions, etc.) pour des
ebuilds « live » dans un cvs n'a pas encore été ajouté à Portage.
Ils peuvent fonctionner avec cet eclass, mais ce n'est pas très pratique pour
plusieurs raisons. Pensez-y à deux fois avant de créer un ebuild de ce
type : il est fort probable que récupérer un instantané d'un cvs sera
suffisant voire mieux qu'utiliser cvs.eclass. Si vous essayez d'ajouter un tel
ebuild à Portage, appliquez à la lettre le guide d'utilisation de cvs dans les
guides pour développeurs.
Avant de faire un héritage de cvs.eclass, initialisez toutes les configurations
que vous souhaitez (et qui ne sont pas celles par défaut) ou au moins l'adresse
du serveur et le nom du module. Voir la liste des possibilités de configuration
et les valeurs par défaut au début du fichier cvs.eclass, marqués comme
« ebuild-configurable settings ».
Ensuite, tout se passe de manière plus ou moins automatique. Une fonction (sans
section) cvs_src_unpack() est proposée. Si vous voulez en savoir plus, lisez
directement l'eclass.
kde-functions.eclass
Cet eclass contient toutes les fonctions d'aide relatives à KDE. Parmi elles,
il en est certaines que vous n'utiliserez jamais directement dans un
ebuild ; elles ne sont pas mentionnées ici et sont suffisamment commentées
dans le fichier source.
Par « fonctions d'aide », nous entendons toutes les fonctions qui ne
sont pas des fonctions spécifiques aux ebuilds (src_unpack(), etc.) Tous les
eclass kde contenant de telles fonctions spéciales héritent de kde-functions.
La seule portion de code qui n'appartienne pas à une fonction dans
kde-functions.eclass (qui est donc lancé lors de la récupération des fonctions
à l'héritage) est un bloc qui détermine si oui ou non l'ebuild actuel est un
ebuild de kde-base. Si c'est le cas, on aura KDEBASE=true. Cette variable est
utilisée dans plusieurs tests ailleurs et il est commode d'avoir un test
centralisé pour faire cela.
L'arborescence utilisée actuellement pour KDE
Une courte explication sur comment Gentoo gère les multiples versions
pour KDE peut être utile :
Une application KDE de kde-base est toujours placée dans
/usr/kde/${version-majeure}.${version-mineure}. Donc par exemple,
KDE 3.1.x est mis dans /usr/kde/3.1. Cependant, ce schéma a été
mis en place après la mise à disposition de KDE 3.0, ce qui fait que les
anciennes versions sont situées dans des répertoires non standards : KDE
3.0.x est situé dans /usr/kde/3 (et non dans
/usr/kde/3.0) et KDE 2.2.2 (la seule version disponible sous
Gentoo pour les versions 2.x) est dans /usr/kde/2. Certains
ebuilds sont installés dans /usr/kde/cvs.
De ce fait, tous les KDE ayant un numéro de version mineur différent entre eux
peuvent coexister sur un même système. Les paquets kde-base ont un SLOT
majeur.mineur (par exemple, 3.0, 3.1).
Depuis que les versions mineures de KDE sont supposées utiliser une version de
QT compatible entre les versions mineures, nous n'avons qu'une seule version
majeure installée, avec un slot différent : ils sont dans
/usr/qt/${major}.
Un ebuild autre que kde-base est toujours installé dans /usr. Le
paquet kde-env ajoute KDEDIRS=/usr dans /etc/env.d
permettant aux applications concernées de fonctionner correctement.
L'application compile et se lie avec la dernière version des bibliothèques KDE
trouvées : l'eclass vérifie les emplacements standards dans un ordre
décroissant (c'est-à-dire /usr/kde/cvs, puis /usr/kde/3.1, puis /usr/kde/3).
Les ebuilds de kde-base se lieront toujours avec la bibliothèque kdelibs de sa
propre version. Cela dépend bien sûr du paramètre passé à need-kde() (voir plus
bas).
Plusieurs variables spéciales permettent de changer la configuration par défaut
du système. Leur première utilité est de compiler un ebuild en utilisant un KDE
spécifique que vous avez installé pour faire des tests, mais vous pouvez aussi
les utiliser pour installer KDE dans un répertoire non standard, et donc avoir
par exemple KDE 3.0.1 et 3.0.2 installés en même temps sur un même système.
Encore une fois, c'est plus utile pour les tests et le développement que pour
une utilisation normale.
Toutes les applications KDE (base et non-base) seront installées dans
${KDEPREFIX}, s'il est initialisé. Il a priorité sur toutes les actions
d'installation dans un répertoire pour tous les eclass.
Une application KDE (même si c'est une application de kde-base) essaiera de se
lier au kdelibs installé dans ${KDELIBSDIR} s'il est initialisé. S'il échoue, il
utilisera le processus par défaut expliqué plus haut pour identifier la
dernière version de kdelibs (ou la bonne version pour kde-base).
need-kde(), need-qt(), set-kdedir(), set-qtdir()
kde-functions.eclass fournit deux paires de fonctions : need-kde(),
need-qt() et set-kdedir(), set-qtdir(). Ces fonctions s'occupent de la mise en
place de tous les petits détails pour l'installation de multiples KDE et QT.
La fonction need-kde() est appelée avec un paramètre qui est le numéro de
version minimal requis pour la bibliothèque kdelibs. Il ajoute les bonnes
dépendances à DEPEND et RDEPEND, et appelle la fonction set-kdedir(). Si aucun
paramètre n'est donné, le numéro de version 0 sera utilisé, ce qui signifie en
fait que toutes les versions satisferont les dépendances requises. need-kde()
appelle également need-autoconf() et need-automake() avec les paramètres
adaptés à la version de KDE.
La fonction set-kdedir() détermine ensuite le préfixe d'installation et le
répertoire pour kdelibs, qui seront utilisés dans votre ebuild. Ils sont
ensuite disponibles avec respectivement ${PREFIX} et ${KDEDIR}, et sont gérés
automatiquement dans kde.eclass. Remarquez qu'aucun ebuild ne devrait
initialiser ${KDEPREFIX} et ${KDELIBSDIR} directement.
need-kde() regarde également la version minimale de QT requise pour cette
version de kdelibs dans une table. Il appelle ensuite need-qt() avec cette
version. L'ebuild d'une application qt-uniquement (c'est-à-dire non-kde)
appelle en général directement need-qt(), sans passer par need-kde().
La fonction need-qt() ajoute la version requise de QT dans DEPEND et RDEPEND,
puis appelle set-qtdir() avec celle-ci. La fonction set-qtdir() initialise
${QTDIR} pour qu'il contienne le répertoire par défaut de cette version de QT.
Contrairement à set-kdedir(), set-qtdir() ne vérifie en fait pas si QT est bien
installé où indiqué.
need-kde() ou need-qt() doit être appelé depuis la partie principale d'un
ebuild (c'est-à-dire pas depuis une fonction), afin que tous les changements
effectués sur DEPEND et RDEPEND affectent emerge.
need-autoconf(), need-automake()
Ces fonctions initialisent les variables d'environnement nécessaires pour
pouvoir exécuter les versions requises de autoconf et automake. Elles
suppriment également toutes les variables de ce type initialisées auparavant.
Par exemple, appeler « need-automake 1.4 » supprimera toutes les
variables WANT_AUTOMAKE* et initialisera NEED_AUTOMAKE_1_4 à 1. Pour plus
d'informations, lire le code de ces fonctions et les commentaires au début de
/usr/bin/auto{conf,make} (sur un système Gentoo).
kde_sandbox_patch()
Certains Makefile de KDE sont cassés. Ils effectuent des chown et
chmod dans PREFIX à l'installation, mais ne respectent pas DESTDIR
(${D}). Ainsi, à l'installation, ils copient correctement un fichier dans
${DESTDIR}/${PREFIX}/repertoire/de/foo, mais essaient ensuite de faire un
chmod +x sur le fichier ${PREFIX}/repertoire/de/foo sur le système de
fichiers, qui n'existent à priori même pas. Et s'il existe, le bac à sable
(sandbox) empêche de réaliser cette opération.
Cette fonction lance un sed générique sur les Makefile qui résoud tous
les problèmes connus. Elle est appelée avec les répertoires à traiter en
paramètres et utilise les fichiers Makefile, Makefile.in et Makefile.am situés
dans ces mêmes répertoires. Par exemple :
Exemple de code 2.1 : Utilisation de kde_sandbox_patch |
src_unpack() {
base_src_unpack
kde_sandbox_patch ${S}/dir1 ${S}/dir2/dir3
}
|
kde_remove_flag()
Il sert à ignorer les paramètres passés au compilateur qui sont connus pour
casser les paquets générés. Vous devez l'appeler après avoir préparé l'espace
de travail (dé-archivage des sources...) en lui donnant comme premier paramètre
le sous-répertoire de travail de ${S} et comme second paramètre, le nom d'un
paramètre à enlever. Remarquez que la fonction n'est pas récursive. Un exemple
d'appel à cette fonction serait donc : kde_remove_flag foodir/barfoo
-fomit-frame-pointer.
kde_remove_dir() et ${KDE_REMOVE_DIR}
Cette fonction supprime de la compilation un répertoire spécifique. Elle
l'efface et supprime toutes les références à ce répertoire dans les fichiers
dansles sous-répertoires, dans les fichiers configure et dans les Makefile.
Remarquez que cela ne fonctionne que sur des sous-répertoires de ${S} pour le
moment et ne fonctionne pas non plus pour les sous-répertoires de profondeur
supérieure à 2. Vous pouvez l'appeler avec une liste des sous-répertoires à
enlever ; elle travaille sur tous les répertoires les uns après les
autres.
Vous pouvez l'appeler directement, mais pour éviter d'avoir à définir une
fonction personnalisée pour src_unpack() juste pour cela, vous pouvez
initialiser la variable KDE_REMOVE_DIR à la liste des sous-répertoires à
enlever. kde_src_unpack() appellera kde_remove_dir ${KDE_REMOVE_DIR}
après avoir fait son travail. Comme vous pouvez le constater, cela vous permet
de vous économiser la peine d'avoir à redéfinir une fonction dans un ebuild, ce
qui rend les ebuilds bien plus lisibles et propres.
kde.eclass
C'est l'eclass principal et central de KDE. Il contient la plupart du code
relatif à KDE. Tous les ebuilds pour KDE en héritent d'une manière ou d'une
autre. l'eclass kde hérite lui-même de base et de kde-functions.
Comme pour les autres eclass, lisez-le pour trouver ce qu'il fait. La plupart
de ses fonctions sont simples et coulent de source. Voici un petit
résumé :
La section globale de l'eclass (c'est-à-dire celle qui est exécutée lors de
l'opération d'héritage) ajoute les bonnes dépendances pour kde-env, automake,
autoconf, make et perl (ce dernier est utilisé par les scripts standards de
configuration « configure » pour générer rapidement les Makefile).
Il initialise également SLOT="0" par défaut.
kde_src_unpack() appelle simplement base_src_unpack() en lui passant tous les
paramètres nécessaires (par exemple, les sections à exécuter). Ensuite, elle
ajoute des petits éléments spécifiques à KDE. Elle touche à tous les fichiers
.ui dans les sources non désarchivées pour regénérer tous les fichiers .cpp et
.h. Elle appelle également kde_remove_dir() avec ${KDE_REMOVE_DIR} comme
paramètre si cette variable est bien initialisée (voir plus haut dans la
partie sur kde-functions).
kde_src_compile() effectue également un certain nombre d'opérations. Parmi
celles-ci, elle exporte kde_widgetdir="${KDEDIR}/lib/kde3/plugins/designer" pour
contourner un problème rencontré avec les anciens fichiers acinclude.m4.in de
KDE. Elle initialise également HOME="${T}/fakehome" pour que tous les accès à
${HOME}/.kde et ${HOME}/.qt ne soient pas refusés par le sandbox et pour ne pas
affecter directement les répertoires des utilisateurs. C'est une erreur de sa
part de toujours vouloir accéder aux fichiers de configuration de ces
répertoires.
kde_src_compile() comporte différentes sections. myconf ajoute à
${myconf} les paramètres par défaut du script de configuration de la compilation
pour KDE (./configure), comme par exemple --prefix=${PREFIX}
(souvenez-vous, ${PREFIX} est initialisé par set-kdedir()). Vous pouvez ajouter
vos propres valeurs à ${myconf}, avant ou après cette section d'ailleurs ;
souvenez-vous simplement de ne jamais écraser les anciennes valeurs parce que
les utilisateurs peuvent eux aussi mettre des paramètres dans ${myconf}, dans le
shell, pour pouvoir ajouter des paramètres qui seront utilisés par l'ebuild.
La section configure lance le script de configuration dans ${S} en lui
passant ${myconf} en paramètre. Si le script de configuration n'existe pas, il
essaiera de le générer en lançant make -f Makefile.cvs ou make -f
admin/Makefile.common. Cela dit, cette étape de la compilation (qui est
nécessaire pour les instantanés cvs ou pour les ebuilds qui modifient des
fichiers comme configure.in) est également faite automatiquement.
La section make lance simplement emake || die. Enfin, une section
all lance successivement toutes les sections présentées plus haut.
Finalement, kde_src_install() a une section make qui lance make
install et une section dodoc qui lance dodoc sur certains
noms de documents dans ${S}, comme par exemple README et COPYING.
kde-base.eclass
Cet eclass est maintenant désuet, les ebuilds doivent utiliser « inherit
kde » à la place.
kde-dist.eclass
Cet eclass est utilisé pour les paquets de distribution kde core dans
kde-base/*. Il hérite de kde.
Il initialise les variables DESCRIPTION et HOMEPAGE correctement et appelle
need-kde ${PV}. Les petis paquets simples de kde-base/ (par exemple,
kdetoys) n'ont généralement pas besoin de faire de changement ici.
kde-i18n.eclass
Cet eclass est fait pour les paquets kde-i18n-*. En fait, tous les ebuilds
kde-i18n sont rigoureusement identiques et tout ce qu'ils ont à faire est
d'hériter de cet eclass. Leurs variables ${P} et ${PV} feront le reste.
kde.org.eclass
Cet eclass est également désuet et tout son code a été déplacé dans
kde-dist.eclass.
koffice-i18n.eclass
Cet eclass est fait pour les paquets de koffice-i18n-* et est très similaire à
kde-i18n.eclass. Encore une fois, tous les ebuilds koffice-i18n sont identiques
et tout ce qu'ils ont à faire est d'hériter de cet eclass.
kde-source.eclass
Cet eclass travaille à un niveau au dessus de cvs.eclass en ajoutant quelques
fonctionnalités spécifiques à KDE. Par exemple, il récupère automatiquement le
répertoire admin/ dans le module kde-common du cvs pour KDE.
Lisez l'eclass directement pour en savoir d'avantage, notamment les
configurations spécifiques au cvs pour KDE que vous pouvez lui passer.
2.c. Écrire des ebuilds KDE
Introduction
Ce chapitre explique comment écrire des ebuilds pour KDE. Tout ce qui est dit
ici est une récupération et restructuration des informations présentes dans les
eclass cités plus haut. Si vous avez un doute quelconque, allez voir d'autres
ebuild, lire les eclass ou demandez tout simplement.
Un ebuild typique KDE
Le code ci-dessous devrait être évident pour vous après avoir lu ce
HOWTO :
Exemple de code 3.1 : Un ebuild simple pour KDE, #1 |
<Les en-têtes viennent ici...>
inherit kde
|
Certains ebuilds finissent directement ici. D'autres ont besoin d'un peu de
personnalisation.
L'étape suivante est l'ajout de toutes les dépendances supplémentaires.
Souvenez-vous : toujours ajouter aux variables, jamais les
écraser !
Puisque notre objectif est d'éviter de définir des fonctions personnalisées
dans nos ebuilds, sauf si c'est vraiment nécessaire, nous initialisons tout ce
qu'on peut initialiser et appelons toutes les fonctions d'aide possible
directement dans la section principale de l'ebuild. Souvenez-vous cependant
qu'il y a des limitations dans le code de la section principale ; par
exemple il ne doit pas produire de sortie (à l'exclusion à priori de
l'utilisation raisonnable de debug-print()).
Exemple de code 3.2 : Un ebuild simple pour KDE, #2 : ajouter des dépendances supplémentaires |
DEPEND="foo/bar"
RDEPEND="bar/foo"
|
Vous pouvez également vouloir ajouter quelques arguments supplémentaires à
myconf, qui seront ensuite passés à ./configure (en supposant qu'on utilise la
section configure de kde_src_compile()) :
Exemple de code 3.3 : Un ebuild simple pour KDE, #3 : passer des arguments à configure |
myconf="${myconf} --with-foobar"
|
Nous devons également ajouter un correctif. S'il peut s'appliquer en utilisant
le paramètre -p0 dans ${S}, vous pouvez utiliser la section autopatch de
base_src_unpack(). Souvenez-vous, kde_src_unpack() appelle base_src_unpack()
en lui passant tous les arguments passés à kde_src_unpack().
Exemple de code 3.4 : Un ebuild simple pour KDE, #4 : correctifs automatiques |
PATCHES="${FILESDIR}/${P-myfix}.diff"
|
Finalement, nous voulons une version étendue de src_install() pour s'occuper
également de certaines documentations :
Exemple de code 3.5 : Un ebuild simple pour KDE, #5 : étendre src_install() |
src_unpack() {
kde_src_install
dodoc ${S}/doc/*
}
|
Regardons maintenant l'ebuild que nous avons créé dans notre exemple :
Exemple de code 3.6 : Un ebuild simple pour KDE - complet |
<Les en-têtes viennent ici...>
inherit kde
# add deps
DEPEND="foo/bar"
RDEPEND="bar/foo"
# always enable foobar
myconf="${myconf} --with-foobar"
# fix terrible bug
PATCHES="${FILESDIR}/${P-myfix}.diff"
src_unpack() {
kde_src_install
# install some extra docs not included in make install's targets
dodoc ${S}/doc/*
}
|
Un ebuild typique avec une fonctionnalité optionnelle KDE
Quand vous ajoutez une fonctionnalité KDE (eclass) à un ebuild existant, vous
n'avez qu'à préfixer toutes les lignes spécifiques à KDE avec use kde
&&, ou à créer des blocs entiers if [ -n "`use kde`" ]; then;
fi.
Dans la section générale, ajoutez les lignes suivantes (seulement si le
paramètre USE kde est mis, évidemment) :
Exemple de code 3.7 : Support optionnel KDE - section principale de l'ebuild |
inherit kde-functions
# This will add kdelibs, kde-env to your dep strings and set ${KDEDIR}
# to the correct value:
need-kde ${version}
# Add anything else you need for kde support:
use kde && myconf="${myconf} --with-my-parameter"
|
Ensuite, indiquez à votre application de rechercher KDE dans la configuration
${KDEDIR} qui est disponible après un appel de need-kde(). Si vous ne voulez pas
ajouter les dépendances à kdelibs, appelez set-kdedir() à la place de
need-kde().
3. Erreurs classiques dans les ebuilds
3.a. Erreurs communes dans les ebuilds
Introduction
On peut retrouver un certain nombre d'erreurs communes dans les ebuilds qui
sont soumis par les utilisateurs. Assurez-vous que les ebuilds que vous
soumettez ne possèdent aucune de ces erreurs. Avant de soumettre un ebuild,
assurez-vous que vous avez bien lu la Politique
de développement des ebuilds pour Gentoo et le Guide des ebuilds pour Gentoo. Lisez aussi
quelques ebuilds (plus d'un ou deux) dans l'arbre de Portage pour connaître le
style dans lequel les ebuilds sont écrits.
Ensuite, il pourrait être utile de lire quelques ebuilds qui utilisent des
eclass et comprendre comment les utiliser en lisant le Guide eclass. Finalement, vous devez lire le
Guide de contribution d'ebuilds
soigneusement avant de soumettre vos ebuilds.
En-tête cassé/invalide/manquant
Quand vous soumettez vos ebuilds, l'en-tête doit être exactement le même
que celui de /usr/portage/skel.ebuild. Il est important de ne pas
le modifier et de s'assurer que la ligne $Header: $ est
intacte.
Les trois premières lignes doivent ressembler à celles-ci :
Exemple de code 1.1 : En-tête valide |
# Copyright 1999-2004 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: $
|
Nous n'avez pas besoin de modifier la ligne $Header: $ même si
vous soumettez un ebuild pour une nouvelle version ou une correction. La ligne
doit être présente. Quand on enregistre l'ebuild dans le CVS, cet en-tête sera
modifié avec la version appropriée et la date. Il n'y a donc pas besoin de la
modifier manuellement.
Non déclaration de IUSE
L'oubli le plus fréquent, et de loin, est la variable IUSE. Vous devez (selon le
Guide des ebuilds pour Gentoo) inclure la
variable IUSE, même si aucun paramètre USE n'est utilisé. S'il n'y en a aucun de
supporté, ajoutez simplement la ligne suivante :
Exemple de code 1.2 : IUSE vide |
IUSE=""
|
P, PV, PN, PF redéfinis
Vous ne devez jamais redéfinir ces variables. Utilisez toujours MY_P, MY_PN,
MY_PV, P0, etc. Lisez d'autres ebuilds dans Portage qui utilisent cela pour plus
d'informations. La plupart des ebuilds utilisent la fonctionnalité bash des
« expansions de paramètres ». Lire la page de manuel de bash pour
comprendre comment elles fonctionnent.
Soit dit en passant, si vous trouvez un paquet qui redéfinit une de ces
variables, ne le copiez pas. Soumettez un bogue pour cet ebuild.
Inclure les numéros de version dans SRC_URI et S
Vous devez essayer d'éviter d'inclure les numéros de version dans les variables
SRC_URI et S. Toujours essayer d'utiliser ${PV} ou ${P}. Cela facilite la
maintenance de l'ebuild. Si un numéro de version n'est pas cohérent par rapport
à l'archive/source, alors utilisez MY_P. Par exemple, dev-python/pyopenal
récupère une archive nommée PyOpenAL, donc nous effectuons une redéfinition
comme suit :
Exemple de code 1.3 : Exemple de redéfinition de version |
MY_P=${P/pyopenal/PyOpenAL}
SRC_URI="http://oomadness.tuxfamily.org/downloads/${MY_P}.tar.gz"
S=${WORKDIR}/${MY_P}
|
DEPEND comporte des erreurs de syntaxe
Il y a plusieurs choses qui ne vont pas avec les variables DEPEND et RDEPEND
soumis par des utilisateurs en général... Voici les points les plus importants
à suivre lorsque vous écrivez la partie sur les dépendances.
-
Toujours inclure la catégorie
Par exemple, utilisez >=x11-libs/gtk+-2 et non >=gtk+-2.
-
N'utilisez pas d'astérisque (*) pour les dépendances en >=.
Par exemple, on doit avoir >=x11-libs/gtk+-2 à la place de
>=x11-libs/gtk+-2*.
-
Spécifique à GTK : toujours utiliser =x11-libs/gtk+-1.2* pour les
applications GTK+1.
-
Ne jamais dépendre d'un paquet meta
Du coup, ne pas dépendre de gnome-base/gnome, mais toujours d'une
bibliothèque spécifique, comme libgnome.
-
Une dépendance par ligne.
Ne mettez pas plusieurs dépendances sur la même ligne. Cela rend le code
plus difficile à lire et à suivre.
DEPEND est incomplet
Voilà encore une erreur assez commune. La personne qui soumet l'ebuild le
soumet, et l'ebuild fonctionne tout simplement, sans vérifier si les dépendances
sont correctes. Voici quelques trucs pour trouver les bonnes dépendances.
-
Lisez les fichiers configure.in ou configure.ac
Lisez-les pour vérifier les paquets qui y sont inclus. Les éléments à
rechercher sont l'utilisation de pkg-config ou les fonctions AM_* qui
vérifient une version spécifique.
-
Regardez les fichiers .spec inclus
Un bon indicateur des dépendances est de regarder dans les fichiers .spec
pour repérer des dépendances intéressantes. Cependant, ne vous y fiez pas
uniquement en pensant que ce sera une liste complète des dépendances.
-
Lire le site Internet de l'application/la bibliothèque
Regardez sur le site de l'application pour repérer les dépendances qu'ils
suggèrent comme étant nécessaires.
-
Lisez les fichiers README et INSTALL du paquet
Ils contiennent souvent des informations utiles sur comment construire et
installer les paquets.
-
Souvenez-vous des dépendances non-binaires comme pkg-config, les
programmes de génération de documentation, etc.
Souvent, le processus de construction nécessite des dépendances comme
intltool, libtool, pkg-config, doxygen, scrollkeeper, gtk-doc, etc.
Assurez-vous que ces dépendances sont bien respectées.
LICENSE invalide
Une autre erreur commune que les utilisateurs font au moment de soumettre des
ebuilds est de proposer une licence invalide. Par exemple, GPL n'est pas
une licence valide. Vous devez spécifier GPL-1 ou GPL-2. Même
chose pour la LGPL. Assurez-vous que la licence que vous utilisez dans
le champ LICENSE est une licence qui existe dans
/usr/portage/licenses. Pour connaître la licence, vous pouvez lire
le fichier COPYING dans l'archive source, il contient souvent la
licence. Si la licence n'est pas spécifiée, utilisez la GPL-1 ou
GPL-2 : on est souvent en présence de la GPL-2.
Si la licence du paquet que vous soumettez est unique et n'est pas dans
/usr/portage/licenses/, alors vous devez soumettre une
nouvelle licence dans un fichier séparé.
Architectures non testées dans les KEYWORDS
Merci de n'ajouter d'architectures dans les KEYWORDS que si l'ebuild a
effectivement été testé sur cette architecture. De même, tous les nouveaux
ebuilds doivent être en « ~ARCH ». Assurez-vous que quand vous
incrémentez une version, toutes les architectures stables sont marquées d'un
~.
SLOT manquant
Assurez-vous que vous avez la variable SLOT déclarée dans l'ebuild. Si vous
n'avez pas l'intention de l'utiliser, ne la supprimez pas. Mettez :
Exemple de code 1.4 : Variable SLOT par défaut |
SLOT="0"
|
DESCRIPTION et HOMEPAGE incorrectes
Merci de vérifier si la variable HOMEPAGE est correcte et pointe bien sur la
bonne page si les utilisateurs veulent récupérer plus d'informations sur le
paquet. Et assurez-vous que la variable DESCRIPTION n'est pas trop longue. Les
bonnes descriptions décrivent la fonction principale d'un paquet en une ligne.
Utilisation incorrecte des espaces au lieu de tabulations
Ce n'est pas vraiment un plaisir que de reformatter des lignes d'ebuilds parce
que la personne qui l'a soumis ne suit pas les guides pour utiliser des
tabulations à la place d'espaces. Donc s'il vous plaît, utilisez des
tabulations.
Espaces en fin de lignes
Souvenez-vous que vous pouvez utiliser repoman sur vos ebuilds pour qu'il puisse
vous signaler s'il reste des espaces inutiles à la fin de vos lignes, ou dans
les lignes vides.
Ajouter des S=${WORKDIR}/${P} redondants
Si S=${WORKDIR}/${P}, alors vous ne devez pas l'ajouter dans votre
ebuild. Vous ne devez l'ajouter que si l'on a quelque chose d'autre que
${WORKDIR}/${P}.
Documentation manquante
Si votre paquet a une documentation, assurez-vous que vous l'installez en
utilisant dodoc ou en les mettant dans /usr/share/doc/${PF}.
N'oubliez pas de vérifier s'il y a des erreurs quand vous lancez dodoc ou
doins.
3.b. Erreurs communes de soumission d'ebuilds
Introduction
Merci de soumettre vos ebuilds correctement en suivant le
Guide contribuer pour les ebuilds
sur la page de documentation Gentoo.
Archiver un ebuild
S'il vous plaît, par pitié, n'attachez pas les ebuilds en archives. De plus
attachez les correctifs séparément afin qu'on puisse les examiner facilement.
Proposer des ebuilds
Ne copiez-collez pas un ebuild dans le champ de commentaire du bugzilla.
Aucune description sur ce qu'est le paquet
Merci de nous permettre de savoir ce qu'est le paquet et remplissez le champ
URL avec la page Internet de l'application, si elle existe.
Mise à jour d'un paquet sans changer le changelog
Si vous soumettez une mise à jour de paquet, assurez-vous de bien expliquer les
changements que vous avez fait sur l'ebuild. Par exemple, si un paquet introduit
une nouvelle fonctionnalité ou option et que vous utilisez un paramètre USE,
indiquez-le dans votre bogue. Ne nous obligez pas à partir à la chasse aux
modifications non expliquées.
C'est toujours mieux de soumettre un diff de mise à jour de paquet plutôt que de
soumettre l'ebuild complet. La meilleure méthode pour le générer est
celle-ci :
Exemple de code 2.1 : Créer un diff |
$ diff -u un-paquet-0.1.0.ebuild un-paquet-0.2.0.ebuild > ~/un-paquet-0.2.0.diff
|
Soumettre des ebuilds non changés pour incrémenter la version d'un ebuild.
Si vous soumettez une nouvelle version d'un paquet dans Portage, assurez-vous
que l'ebuild existant fonctionne et que les changements sont inclus dans le
nouvel ebuild (comme par exemple des nouveaux guides et manuels). S'il n'y a pas
de changements nécessaires à effectuer sur l'ebuild par rapport à l'ancienne
version, n'attachez pas l'ebuild. Signalez simplement dans le rapport de bogue
que vous avez copié l'ebuild et vérifié que le paquet fonctionne et s'installe
correctement.
3.c. Commentaires et suggestions
Merci d'envoyer vos commentaires, corrections et suggestions à Alastair Tse (en anglais).
4. Gentoo Metadata
4.a. L'utilité des fichiers metadada.xml
Le fichier metadata.xml a pour objectif de donner des informations
supplémentaires sur les ebuilds. Le fichier metadata.xml devrait être
présent dans tout répertoire de paquet. Vous pourrez trouver un fichier
skel dans l'arbre de Portage, nommé skel.metadata.xml.
Note :
Exécutez la commande xmllint --valid metadata.xml avant de soumettre un
fichier metadata.xml. Nous espérons intégrer rapidement dans repoman le
support des fichiers metadata.xml.
|
4.b. La structure d'un metadata
Un fichier metadata.xml peut contenir un certain nombre de
balises :
| balise |
description |
| <pkgmetadata> |
C'est l'élément racine d'un fichier metadata.xml d'un paquet. Il n'a pas
d'attributs. Il doit avoir la balise fille suivante :
<herd>. Il peut également admettre les balises filles
suivantes : <email> pour une adresse électronique
de herd (groupe travaillant sur le projet),
<maintainer>, et
<longdescription>.
|
|
<catmetadata>
|
C'est l'élément racine d'un fichier metadata.xml d'une catégorie (cf. GLEP 34.) Il n'a pas d'attributs.
Il contient plusieurs éléments <longdescription>, un
par langue.
|
| <herd> |
Il doit y avoir au moins une balise fille de type herd. Le contenu
de cette balise doit être le nom d'un groupe, comme spécifié dans le
fichier herds.xml.
Elle ne doit apparaître qu'une et une seule fois.
|
| <maintainer> |
Au delà du fait d'appartenir à un groupe, un paquet peut aussi être
maintenu de manière directe. Les mainteneurs du paquet peuvent être indiqué
à l'aide de la balise <maintainer>. Cette balise a une
balise fille obligatoire :<email>. Elle a deux
balises filles optionnels : <name> et
<description>.
|
| <email> |
Celle-ci contient l'adresse électronique du mainteneur. Elle est
obligatoire.
|
| <name> |
Cette balise contient un texte libre avec le nom du mainteneur. Elle est
optionnelle.
|
| <description> |
La balise de description contient une description sur la maintenance ou par
exemple une remarque indiquant aux personnes intéressées qu'elle peuvent se
charger de la maintenance. Cette balise est optionnelle.
|
| <longdescription> |
Cette balise contient une description du paquet. Elle a pour objectif
d'ajouter des informations au champ DESCRIPTION présent dans les ebuilds.
|
Certains attributs peuvent être utilisés avec ces balises. Ils sont tous
optionnels :
| Attribut |
Balises |
Description |
| lang |
<description>, <longdescription>
|
Dans tous les cas pour lesquels une description est nécessaire, il doit y
avoir au moins une description en anglais. Si une description dans
une autre langue est proposée, cet attribut est utilisé pour spécifier la
langue utilisée. On utilise le code de la langue en deux caractères défini
par la norme
ISO-639-1.
|
| restrict |
<herd>, <maintainer>,
<longdescription>
|
L'attribut restrict permet de restreindre l'application de certaines
balises à certaines versions d'un paquet. Quand cet attribut est utilisé,
une balise sans attribut doit également exister. Cette balise sans
l'attribut restrict servira de balise par défaut. Le format de
l'attribut restrict est celui utilisé dans les paramètres DEPEND, à
l'exception du fait que "<" et ">" doivent être spécifiés avec des
< et >.
Par exemple pour le paquet db, un attribut
restrict=">=sys-libs/db-3.2.9-r5" dans la balise du mainteneur
indiquera que je suis actuellement mainteneur dans toutes les versions
supérieures à la 3.2.9-r5.
|
4.c. Exemples de metadata
Premier exemple
Dans le premier exemple nous vous proposons un fichier
metadata.xml pour OpenOffice.org, dans lequel les ebuilds sont
complètement gérés par un groupe nommé openoffice :
Exemple de code 3.1 : Paquet géré par un groupe |
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE pkgmetadata SYSTEM "http://www.gentoo.org/dtd/metadata.dtd">
<pkgmetadata>
<herd>openoffice</herd>
<longdescription>
OpenOffice is the opensource version of staroffice.
This ebuild allows you to compile it yourself. Unfortunately this
compilation can take up to a day depending on the speed of your
computer. It will however make a snappier openoffice than the binary
version.
</longdescription>
</pkgmetadata>
|
Le groupe openoffice est défini dans herds.xml par le Projet de métastructure Gentoo.
Note :
Cet exemple est probablement démodé à l'heure où vous lisez ces lignes. Ce
n'est qu'un exemple !
|
Exemple de code 3.2 : Exemple de groupe OpenOffice |
<herd>
<name>openoffice</name>
<email>openoffice@gentoo.org</email>
<description>openoffice related packages</description>
<maintainer><email>pauldv@gentoo.org</email></maintainer>
<maintainer><email>brad@gentoo.org</email></maintainer>
</herd>
|
Si vous souhaitez vous ajouter (ou enlever) dans un groupe, éditez
herds.xml, qui est situé dans [gentoo]/misc dans le
dépôt CVS de Gentoo. Assurez-vous de connaître l'alias mail caractérisant le
groupe en question (par exemple le groupe sound a pour alias sound@gentoo.org) et ajoutez-vous à l'alias en
question (en éditant /var/mail/alias/misc/<nom de l'alias>
sur dev.gentoo.org).
Second exemple
Comme second exemple, nous allons voir le metadata.xml de
mirrorselect. Cet ebuild est maintenu par le groupe
tools-portage, mais a un mainteneur à part.
Exemple de code 3.3 : Paquet d'un groupe avec un mainteneur individuel |
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE pkgmetadata SYSTEM "http://www.gentoo.org/dtd/metadata.dtd">
<pkgmetadata>
<herd>tools-portage</herd>
<maintainer>
<email>johnm@gentoo.org</email>
<name>John Mylchreest</name>
</maintainer>
<longdescription>
This utility is used to select the fastest mirror (distfiles) and provide a
nicer front-end for mirror selection (both rsync + distfiles) to a user.
</longdescription>
</pkgmetadata>
|
5. Guide de maintenance des ebuilds
5.a. Introduction
Ce guide a pour objectif de présenter les procédures courantes de maintenance
des ebuilds ainsi que les procédures de maintenance plus rares avec lesquelles
les développeurs ne sont pas forcément très familiers.
5.b. Ajouter un ebuild
Quand vous créez un nouvel ebuild, vous ne devez inclure que les
KEYWORDS pour les architectures qui ont été effectivement testées pour
cet ebuild, ce qui confirmera qu'il fonctionne effectivement bien comme nous
l'espérons et que les paramètres USE sont bien respectés dans le paquet
résultant de l'installation à partir de l'ebuild. Dans la mesure du possible,
vous devez également préciser les bibliothèques ou applications qui ont été
effectivement utilisées lors des tests dans la mesure où vous serez responsable
des problèmes inhérents à votre paquet pour les architectures présentées. Un
minimum de vérifications doit être effectué comme s'assurer que l'application
se lance bien et sans erreurs.
Si vous ajoutez un ebuild proposé par un utilisateur, faites comme si celui-ci
n'avait pas fait de vérification sur les différentes architectures : il
arrive souvent que les KEYWORDS aient été récupérés sur d'autres
paquets ou générés à partir de la documentation proposée avec les sources des
paquets. Cela ne signifie en rien que le paquet fonctionnera effectivement sur
ces mêmes architectures.
5.c. Stabiliser des ebuilds
Les ebuilds ne peuvent être stabilisés, c'est-à-dire placés de ~arch à
arch que si le mainteneur de l'ebuild ou un mainteneur de l'architecture
concernée considère l'ebuild comme effectivement stable. Le mainteneur du
paquet doit toujours être contacté juste pour le cas où il y ait une raison
pour que l'ebuild ne soit pas stabilisé pour cette architecture. Si vous faites
partie d'une équipe qui gère une architecture, alors vous pouvez marquer un
ebuild pour celle-ci. Si l'architecture qui vous intéresse n'est pas indiquée,
veuillez consulter le responsable.
Vous ne devez jamais stabiliser des paquets sur des architectures pour
lesquelles vous ne pouvez faire aucun test. À la place, vous devez remplir un
formulaire de bogue destiné à l'équipe de l'architecture correspondante, comme
par exemple sparc@gentoo.org pour que
l'équipe s'occupant de l'architecture SPARC stabilise si possible l'ebuild.
Sinon, vous pouvez également chercher des développeurs Gentoo sur IRC qui
pourront vous aider dans votre demande.
Il vaut mieux éviter d'utiliser arch-maintainers@gentoo.org et
préférer ajouter les équipes d'architecture dans le champ CC d'un rapport de
bogue à la place. De cette manière les équipes peuvent s'enlever de la liste
une fois qu'ils ont effectué le travail, ce qui permet de savoir de manière
précise quelles sont les équipes qui doivent toujours stabiliser le paquet.
5.d. Règles pour stabiliser un ebuild
SPARC : vous devez avoir l'autorisation du responsable (actuellement Weeve).
Vous devriez être inscrit dans l'alias sparc pour pouvoir suivre le processus
d'assurance-qualité, mais d'autres dispositions peuvent être prises si vous ne
travaillez que sur un petit nombre d'ebuilds.
ALPHA : les responsables de paquets peuvent marquer leurs paquets stables pour
Alpha, mais il leur est demandé d'en informer l'équipe Alpha pour effectuer des
tests supplémentaires et ainsi permettre de corriger les éventuelles erreurs.
MIPS : vous devez avoir l'autorisation d'un développeur MIPS expérimenté. À
cause de la grande variété de matériel, vous devez être inscrit dans l'alias
mips et avoir accès à des machines MIPS.
5.e. Mettre à jour des ebuilds
Les nouveaux ebuilds sont rarement proposés directement avec un mot-clef
arch et, même s'ils le sont, les paquets doivent être testés sur
toutes les architectures listées dans la variable KEYWORDS d'un nouvel
ebuild.
Les exceptions à la règle qui consiste à ne jamais proposer directement un
ebuild en arch sont les correctifs majeurs ou les mises à jour de
sécurité. Si la version précédente d'un ebuild contient des mots-clefs
KEYWORDS pour lesquels vous ne pouvez pas faire de tests, vous devez
les replacer en instable en changeant tous les arch que vous ne pouvez
pas tester en ~arch. Si vous pensez que votre paquet ne fonctionnera pas
du tout même en le mettant comme ~arch, alors il est préférable
d'enlever le mot-clef et de faire une demande de tests à l'équipe
concernée : si vous êtes amenés à faire ce genre de chose, vous devez
faire un rapport de bogue à destination de l'équipe en question.
Si une nouvelle version introduit de nouvelles dépendances qui ne sont pas
disponibles sur certaines architectures, vous devez rapporter un bogue ou
demander de l'aide sur IRC avant de mettre à jour le paquet. Si vous avez
réellement besoin d'ajouter cet ebuild et que c'est urgent, par exemple, pour
une correction de sécurité, alors vous devez enlever tous les KEYWORDS
qui posent problème et mettre en CC les architectures en question dans le
bogue rapporté. Vous devez pour cela ouvrir un nouveau bogue pour
l'architecture en question, sauf si celui-ci existe déjà.
S'il n'y a pas de nouvelles dépendances, n'enlevez pas de mots-clefs. Si la
soumission échoue avec repoman, essayez de faire un cvs update complet
et si le problème subsiste, alors faites votre soumission avec repoman
-I et rapportez un nouveau bogue pour l'architecture qui pose problème en
indiquant le problème dans votre message de soumission de CVS.
Attention :
Lorsque vous faites votre soumission CVS, assurez-vous que vous référencez bien
tous les bogues rencontrés ainsi que le message CVS. Ne pas le faire est
considéré comme un geste de très mauvais goût et peut donner lieu à une
sanction disciplinaire.
|
5.f. Déplacer des ebuilds
Déplacer des ebuilds se fait en deux temps :
Tout d'abord, vous devez déplacer l'ebuild dans le CVS. Pour faire cela, vous
devrez copier l'ebuild à sa nouvelle position et soumettre celui-ci comme si
vous soumettiez un nouvel ebuild.
Ensuite, vous devez changer tous les ebuilds qui dépendent (via la variable
DEPEND) de l'ancien ebuild pour qu'ils pointent vers le nouveau. Alors
seulement, vous pourrez enlever l'ensemble des fichiers relatifs à l'ancien
ebuild avec cvs remove dans l'ancien répertoire.
Note :
CVS ne peut pas détruire de répertoire : il ne recréera tout simplement
pas ceux-ci si ils sont vides, dans l'hypothèse ou vous utilisez l'option
-P de cvs.
|
Une autre méthode consiste à utiliser epkgmove qui fera le travail pour
vous :
Exemple de code 6.1 : Déplacer un paquet avec epkgmove |
# epkgmove net-ancien/paquet net-nouveau/paquet
|
Une fois que le déplacement a été fait, ajoutez une entrée au dernier fichier
dans profiles/updates/ dans l'arbre de Portage, avec la syntaxe
suivante :
Exemple de code 6.2 : Ajouter une entrée dans les mises à jour |
move net-misc/fwbuilder net-firewall/fwbuilder
|
Cet exemple devrait déplacer de manière transparente
net-misc/fwbuilder vers net-firewall si les
utilisateurs l'ont installé. De cette manière, les utilisateurs pourront
désormais récupérer les mises à jour sur net-firewall quand elles
sont disponibles.
5.g. Enlever des ebuilds
Quand vous supprimez un ebuild, assurez-vous qu'aucune dépendance dans Portage ne
se casse à cause de la suppression. De plus, votre message de soumission au CVS
devra expliquer clairement pourquoi l'ebuild a été supprimé du CVS.
Si vous avez besoin d'enlever des ebuilds, assurez-vous de ne pas enlever de
manière accidentelle des ebuilds nouveaux ou stables uniquement pour certaines
architectures. Si vous voulez faire une nouvelle version marquée comme stable,
merci de faire un rapport de bogue ou d'en discuter sur IRC.
Vous devez également éviter de diminuer les versions stables des paquets quand
vous supprimez des ebuilds. À la place, le mieux est de prendre la plus récente
version marquée comme ~arch en premier lieu, puis supprimez les versions
redondantes de l'ebuild.
5.h. Collision de fichiers
Si vous trouvez des paquets qui essaient d'installer des fichiers déjà installés
par un autre paquet (par exemple en utilisant
FEATURES=collision-protect), vous devez résoudre ce problème avant de
soumettre l'ebuild. Si l'ebuild est déjà dans l'arbre Portage, remplissez un
rapport de bogue sur ce paquet (voir plus bas pour une liste d'exceptions). La
raison pour laquelle les collisions de fichiers sont critiques est que si
« foo » installe le fichier /usr/bin/exemple et
« bar » essaie d'écrire un autre fichier par dessus, puis plus tard
« bar » est désinstallé, Portage va supprimer
/usr/bin/exemple, avec de grandes chances pour que cela empêche
« foo » de fonctionner.
La solution la plus évidente est d'ajouter une dépendance bloquante sur les
deux paquets qui veulent installer le même fichier, afin qu'ils ne puissent
pas être installés tous les deux en même temps. Mais, à moins qu'il n'y ait
d'autres raisons pour que ces paquets se bloquent entre eux, vous devriez
éviter ce genre de manipulation et essayer plutôt de modifier les paquets
en utilisant l'une des méthodes suivantes (liste non exhaustive) :
-
Modifiez le (R)DEPEND de « foo » pour que ce dernier dépende de
« bar ».
-
Enlevez les fichiers qui engendrent la collision de « foo » dans
src_install ou pkg_preinst.
-
Déplacez les fichiers en conflit dans un nouveau sous-paquet et faites en
sorte que « foo » et « bar » dépendent ((R)DEPEND) tous
deux de ce paquet.
-
Changez le répertoire dans lequel « foo » ou « bar »
installent les fichiers en conflit.
Dans certains cas, les collisions de fichiers ne peuvent pas être résolues ou ne
sont pas critiques. Les exceptions connues actuellement sont les pages de
manuel des modules Perl (qui écrasent celles de Perl lui-même), ainsi que les
fichiers protégés par CONFIG_PROTECT (les collisions sur ces fichiers
devraient tout de même être corrigées, mais elles sont moins graves puisque
Portage n'écrasera aucun de ces fichiers).
6. Guide pour signer des modifications
6.a. Comment signer des Manifests
Prérequis :
- >=sys-apps/portage-2.0.51_pre10
- >=app-crypt/gnupg-1.2.4
Préparation de la clef :
-
Créez une nouvelle
clef GnuPG DSA d'une longueur d'au moins 1024 bits, d'une période
d'expiration de moins de six mois et avec un bon mot de passe.
-
Envoyez la clef au
serveur de clefs.
Configuration de Portage :
-
Mettez à la variable PORTAGE_GPG_DIR la valeur de votre
répertoire gnupg (par exemple ~/.gnupg/ ou le répertoire où
le fichier contenant la clef se trouve).
-
Mettez à la variable PORTAGE_GPG_KEY la valeur de votre clef
d'identification pour la nouvelle clef.
- Ajoutez le paramètre FEATURES="sign" à votre configuration.
Maintenant, vous devriez pouvoir signer vos Manifests lorsque vous effectuez
une soumission avec repoman. Repoman va vous demander votre mot de
passe avant de soumettre le Manifest. Cette étape se fait après qu'il ait
soumis l'ensemble des autres fichiers. Pour le moment, repoman ne vérifie pas
encore si le Manifest était déjà signé ou non, ce qui fait que d'autres
développeurs peuvent supprimer votre signature du paquet ultérieurement. Cet
état de fait changera lorsque la signature des Manifests deviendra
obligatoire.
6.b. Comment vérifier des Manifests
Pour le moment Portage n'a pas encore intégré d'outil de vérification. Un
premier essai qui permette de vérifier un Manifest est disponible pour tester
ici.
C'est un code en version alpha, très incomplet, et il n'est là que pour
tester. Aucune garantie n'est donnée.
C. Les politiques
1. La politique concernant les ebuilds
1.a. Principes généraux
Il existe un certain nombre de principes de développement généraux à
suivre :
-
Toujours vérifier les changements avec repoman : utilisez repoman
commit à la place de cvs commit.
-
Si un paquet est soit cassé dans sa version actuelle, soit utilise un
processus de construction/installation vraiment horrible, jetez un coup
d'œil sur ce que les autres distributions font pour ce paquet :
-
Votre paquet, une fois terminé et démasqué, est supposé « simplement
fonctionner » pour les utilisateurs finaux. Avoir à bidouiller un
paquet installé pour qu'il marche devrait être optionnel. Du coup, vous
devez installer le paquet en question avec une configuration par défaut
raisonnable.
-
N'ayez pas peur de consulter notre documentation en ligne et les ebuilds
écrits et maintenus par plusieurs développeurs expérimentés. Vous pouvez
aussi contacter les développeurs expérimentés directement pour poser des
questions techniques ou concernant la politique générale.
-
Faites attention à ce que vous soumettez. Souvenez-vous que vos soumissions
peuvent potentiellement affecter des milliers d'utilisateurs. Si votre
soumission entraîne des problèmes dans l'arbre de Portage, ils doivent être
résolu dans un temps très court.
-
Tous les paquets doivent être accompagnés d'un fichier
metadata.xml qui liste, entre autres,
à quel groupe de travail (ou/et quels mainteneurs individuels) est affecté
la maintenance du paquet.
1.b. Principes spécifiques
fPIC
Sur certaines architectures, les bibliothèques partagées doivent être
construites avec l'option -fPIC. Sur x86 et d'autres, les bibliothèques
partagées peuvent parfois être construites sans -fPIC, mais cela impliquerait
du gaspillage et peut causer une perte de performance. Si vous rencontrez un
paquet qui ne construit pas ses bibliothèques avec -fPIC, corrigez le Makefile
pour construire uniquement ses bibliothèques partagées avec -fPIC. Plus
d'informations sur -fPIC sont disponibles sur
http://www.gentoo.org/proj/en/hardened/pic-internals.xml. En cas de
doute, veuillez demander de l'aide, par exemple sur la liste de diffusion
gentoo-dev ou le canal IRC #gentoo-dev.
Perl
Les nouveaux modules Perl doivent être ajoutés dans Portage uniquement si l'une
des conditions suivantes est vérifiée :
- le module est nécessaire pour satisfaire une dépendance ;
- le module ne peut pas être récupéré avec g-cpan ;
- le module ajoute une fonctionnalité à un ebuild déjà existant ;
-
le module fournit des outils, des applications ou autres fonctionnalités
(c'est-à-dire plus que ce qu'offrent leurs .PM).
Merci de vous assurer qu'au moins une personne du groupe de travail sur Perl
approuve votre ajout.
1.c. Politique sur les ebuilds
Politique des noms des ebuilds
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.
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 |
| (aucun) |
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 provenant de Gentoo
Linux, 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.
Choisir la version et incrémenter une révision
Le numéro de révision d'un paquet doit être augmenté par les développeurs
Gentoo quand l'ebuild a changé à un point tel que les utilisateurs peuvent
vouloir faire une mise à jour. Typiquement, c'est le cas quand des correctifs
sont fait sur un ebuild qui affectent les fichiers installés résultant, mais
l'ebuild utilise la même archive source, comme pour l'ebuild précédent. Si vous
faites un changement interne stylistique à un ebuild qui ne change aucun
fichier installé alors il n'y a pas besoin de remonter le numéro de révision.
D'ailleurs, si vous corrigez un problème de compilation sur un ebuild qui
affecte des utilisateurs, il n'y a pas besoin de remonter le numéro de version,
dans la mesure où ceux pour qui cela fonctionnait parfaitement ne verront
aucune différence en installant la nouvelle révision et ceux qui avaient un
problème n'ont pas pu installer leur paquet (puisque la compilation avait
échoué), et donc n'ont pas besoin d'avoir un nouveau numéro de révision pour
les forcer à mettre à jour. Une incrémentation de révision n'est également pas
nécessaire si une minorité d'utilisateurs seraient affectés et que le paquet
prend un temps de compilation important : faites appel à votre bon sens
pour juger de la circonstance.
Important :
Quand vous créez une nouvelle révision pour un ebuild, assurez-vous de mettre à
jour le ChangeLog dans le répertoire de l'ebuild. Ne pas le faire
est considéré comme une faute importante et peut entraîner des sanctions
disciplinaires.
|
Les ebuilds devraient se calquer sur la version précédente pour s'assurer que
des correctifs ne sont pas supprimés accidentellement. Les correctifs doivent
inclure des commentaires appropriés dans l'ebuild pour expliquer ce qu'ils font
et pourquoi ils sont nécessaires. Si vous n'êtes pas très familier avec les
correctifs ou que vous n'arrivez pas à déterminer si ils sont toujours
nécessaires, vous ne devez pas mettre à jour l'ebuild.
Virtuals
Portage supporte un concept appelé les paquets virtuels (virtual packages en
anglais). En les utilisant, vous permettez d'avoir un nom catégorie/paquet
particulier qui pointe vers un autre.
Voici un exemple d'utilisation des paquets virtuels. Imaginons que vous créez un
nouveau paquet cron appelé foocron. Gentoo Linux est préparé actuellement
pour que tout ce qui nécessite l'usage d'un paquet cron dépend du paquet
virtual/cron. Cela permet aux ebuilds de s'assurer qu'il y a plusieurs
paquets pour cron disponibles et l'utilisateur peut de manière arbitraire
choisir l'un ou l'autre, selon ses préférences. Pour ajouter
foocron-1.0.ebuild dans le système, vous devrez ajouter une ligne
dans l'ebuild comme suit :
Exemple de code 3.1 : Comment utiliser un paquet virtuel |
PROVIDE="virtual/cron"
|
Maintenant, dès que foocron-1.0 sera installé, le paquet
virtual/cron sera enregistré. Si vous n'aviez aucun paquet cron installé
auparavant, cela signifiera que tous les paquets dépendant de
virtual/cron auront cette dépendance satisfaite de manière complète.
Remarquez qu'il est possible de spécifier une valeur PROVIDE à tous les
types de paquets. Il faut juste ne pas commencer par virtual. Cela dit,
vous devez utiliser la catégorie virtual/, sauf dans le cas où vous
utilisez la fonctionnalité proposée par PROVIDE pour pointer vers des
paquets qui ont été renommés.
Il y a une seconde composante dans l'implémentation des paquets virtuels dans
Gentoo. Qu'arrive-t-il si aucun paquet n'est installé pour fournir
virtual/cron ? Comment Portage choisira-t-il le « bon »
cron à installer pour satisfaire une dépendance à virtual/cron ?
Portage s'en charge en utilisant un fichier de correspondance de profil
spécifique de paquets virtuels, nommé virtuals qui est présent
dans /etc/make.profile. Si vous jetez un coup d'œil dans le vôtre,
vous verrez que le contenu ressemble un peu à ceci :
Exemple de code 3.2 : Exemple de fichier virtuals |
virtual/lpr net-print/cups
virtual/python dev-lang/python
virtual/mta net-mail/ssmtp
|
La première ligne de ce fichier indique à Portage que si un paquet dépend de
virtual/lpr et qu'aucun paquet fournissant cette dépendance n'est
installé et que le paquet virtual/lpr n'est pas disponible dans l'arbre
de Portage, alors net-print/cups devra être installé pour satisfaire
cette dépendance. net-print/cups contient une ligne
PROVIDE="virtual/lpr" pour que les prochaines dépendances sur
virtual/lpr puissent être satisfaites.
Parlons désormais de la conduite à suivre pour les développeurs. Si vous devez
ajouter un paquet foocron, vous devrez évidemment vous assurez que tous
les programmes qui dépendent de virtual/cron peuvent fonctionner
correctement avec votre paquet. Si vous voulez ajouter un paquet
foobarosité qui dépend de virtual/cron, vous devrez probablement
vous assurer que tous les paquets proposant virtual/cron pourront faire
fonctionner correctement votre paquet.
Avant de créer des nouveaux paquets virtuels, merci de commencer à en parler sur
la liste de diffusion interne pour les développeurs. Maintenir informés les
développeurs de nouveaux paquets virtuels est essentiel pour s'assurer de leur
utilisation uniforme.
Visibilité des variables
Quand un ebuild est lu par Portage, les fonctions et les variables qu'il
définit sont chargées en mémoire par l'interpréteur. Cependant, seules les
variables et les instructions qui ne font pas partie d'une fonction telle que
src_compile() sont exécutées lors de la compilatin de l'ebuild.
Le code compris dans des fonctions a une visibilité locale alors que tout ce
qui n'est pas dans une fonction a une visibilité globale et est exécuté à
chaque utilisation de l'ebuild.
Une application externe comme grep, sed ou awk ne devrait jamais être utilisée
dans la partie à visibilité globale pour des raisons de performance. De plus,
les fonctionnalités internes de bash telles que le remplacement de texte
doivent être utilisées au maximum. Veuillez consulter Advanced Bash Scripting Guide
pour les détails.
De plus, une application externe n'est pas nécessairement disponible sur le
système de l'utilisateur. En utilisant l'application externe dans une fonction
telle que pkg_setup(), il est possible de garantir sa présence en
l'ajoutant dans la variable ${DEPEND} de l'ebuild.
Politique des sources CVS
Il y a deux moyens de construire un ebuild basé sur des sources à partir de
l'arbre de développement CVS. Le premier moyen (traditionnel) est de créer un
ebuild « instantané CVS » en créant votre propre instantané archivé de
l'arbre CVS récupéré, en mettant les sources en miroir avec les dépôts officiels
de fichiers distribués, puis vous écrivez un ebuild qui utilise spécifiquement
cette archive. Nous appellerons désormais ce type d'ebuilds « ebuilds d'instantané CVS ».
L'autre méthode pour créer un ebuild utilisant le CVS consiste à utiliser
cvs.eclass pour créer un ebuild CVS « live ». Un tel
ebuild récupérera de manière dynamique la dernière archive sur le dépôt CVS mise
sur le CVS, assurant ainsi que les sources sont les plus à jour possible. Nous
les nommerons les « ebuilds 'live' ».
Les paragraphes suivants détaillent la politique relative à l'utilisation des
ebuilds basés sur CVS. Remarquez qu'elle définit des règles strictes à propos de
l'ajout de ce type d'ebuilds dans l'arbre de Portage.
Les ebuilds d'instantané CVS sont largement préférés aux ebuilds
« live » utilisant cvs.eclass.
Les ebuilds d'instantané CVS sont autorisés si un instantané du CVS
contient les correctifs connus qui sont nécessaires au bon
fonctionnement du paquet logiciel ou si la version CVS d'un paquet
logiciel particulier est connue pour ou a été prouvée comme
fonctionnant mieux que les versions sorties sous forme de paquet.
Les ebuilds « live » sont généralement utilisés uniquement pour les
commodités des développeurs et devraient toujours être masqués avec un mot-clef
de type ~[arch]. Il est impossible de garantir le bon fonctionnement d'un
ebuild « live » dans la mesure où l'arbre cvs du serveur peut changer
à tout moment, ce qui explique le masquage systématique.
Que ce soit pour un ebuild « live » ou un ebuild d'instantané CVS,
vous, développeur serez responsable du bon fonctionnement de l'ebuild. Il
est particulièrement difficile de s'en assurer pour les ebuilds
« live » pour des raisons évidentes.
Si les ebuilds (quel que soit le type) ne fonctionnent pas correctement, ils
doivent être corrigés ou supprimés de l'arbre de Portage. Si ce sont des ebuilds
« live », ils doivent être marqués en ~[arch] à vie. Cette
exception est expliquée plus bas.
Si un ou plusieurs utilisateurs demandent un ebuild « live », vous
pouvez en ajouter un pour eux. Il doit avoir des mots-clef en ~[arch]
afin que les autres utilisateurs ne puissent l'installer inconsciemment.
De cette manière, les utilisateurs qui le veulent peuvent l'installer, mais les
autres utilisateurs seront protégés de son installation accidentelle. Encore une
fois, cela ne s'applique que dans les situations où les utilisateurs demandent
de manière spécifique un ebuild « live ». Les ebuilds d'instantanés
CVS ne doivent être ajoutés à l'arbre de Portage que dans l'intention de les
mettre en stable ou pour proposer des fonctionnalités améliorées par rapport aux
versions habituelles de sortie d'un même logiciel.
Important :
Les ebuilds d'instantanés CVS de sources CVS de pré-sortie doivent être
nommés ainsi : foo-x.y_preYYYYMMDD.ebuild. foo est le
nom du paquet, x.y est le numéro de version de la sortie
antérieure, _pre est utilisé tel quel et YYYYMMDD est une
marque indiquant le jour auquel l'instantané CVS a été fait. Utilisez cette
convention de nom pour vous assurer que la version de sortie x.y.1 ne
sera pas considérée comme plus ancienne que l'instantané x.y et pour
vous assurer en même temps que la sortie officielle x.y sera considérée
comme plus récente que votre version d'instantané CVS. Pour les instantanés
CVS de sources CVS déjà sorties, utilisez le format
foo-x.y_pYYYYMMDD.ebuild (notez le _p pour
« patchlevel »). Cela assurera que votre ebuild CVS sera considéré
comme plus récent que la sortie x.y standard.
|
Important :
Actuellement, la politique des noms des ebuilds « live » est de
s'assurer que le nom du paquet se termine par -cvs. Dans le futur, un
suffixe de version -cvs pourra être ajouté aux fonctionnalités de Portage
et cette politique de nommage sera alors mise à jour.
|
ebuilds soumis par les utilisateurs
Les ebuilds soumis par les utilisateurs ne doivent jamais être considérés comme
sûr et doivent toujours être audités et testés de manière suffisante, avant de
les soumettre au CVS. Si un ebuild soumis par un utilisateur a des problèmes,
vous en serez tenu pour responsable direct. En l'incorporant au CVS, vous
affirmez que cet ebuild suit tous les standards de développement de Gentoo
Linux.
Assurez-vous que l'ebuild soumis par l'utilisateur ne contient pas d'en-tête
personnalisées comme celle-ci :
Exemple de code 3.3 : Un en-tête personnel qui doit être déplacé dans le ChangeLog |
# Ebuild updated by: me <me@me.com>
|
Ces informations doivent être ajoutées au ChangeLog en utilisant la
syntaxe correcte des commentaires de ChangeLog. Toujours s'assurer que le
ChangeLog attribue les crédits à l'utilisateur qui a proposé l'ebuild. Ces
informations doivent apparaître dans la première entrée du ChangeLog.
Assurez-vous également que tous les nouveaux ebuilds que vous soumettez au CVS
contiennent la ligne suivante :
Exemple de code 3.4 : En-tête d'un ebuild |
# $Header: $
|
Un certain nombre d'ebuilds soumis par les utilisateurs sont basés sur des
fichiers utilisant rsync qui peuvent contenir des lignes d'en-tête incorrectes.
Encouragez les utilisateurs à proposer des « diffs » sur les ebuilds
existants s'ils proposent une mise à jour. En faisant cela, nous pouvons mieux
éviter d'avoir à réintroduire des correctifs de bogues déjà identifiés et
corrigés auparavant dans les nouveaux ebuilds. Si vous ne travaillez pas à
partir d'un diff soumis par un utilisateur, alors utilisez la commande
diff pour voir les changements, en gardant un œil sur tout ce qui
devrait apparaître dans le nouveau ebuild et qui était présent dans l'actuel, ou
sur tout ce qui dans le nouvel ebuild devrait être corrigé ou supprimé.
En général, laissez l'utilisateur faire ce travail pour qu'il obtienne de
lui-même un ebuild correct, sauf si vous voulez nettoyer l'ebuild sans
le consulter. Toutefois, il est toujours meilleur de laisser l'utilisateur
faire ce travail pour qu'il puisse apprendre de ses erreurs et soumettre des
ebuilds plus propres dans le futur. N'oubliez pas de toujours remercier pour
toute soumission, même si elle n'est pas vraiment bonne. Soyez poli, mais
honnête. Si un ebuild n'est pas utilisable, on peut dire à l'utilisateur d'une
manière non insultante que leur ebuild ne convient pas, sans porter atteinte à
leur capacité actuelle à écrire un ebuild. Souvenez-vous que les utilisateurs
qui proposent des ebuilds cassés peuvent être dans le futur des membres
productifs et expérimentés pour notre projet dans le futur, c'est-à-dire s'ils
reçoivent suffisamment d'encouragements et de support et continuent à
s'améliorer.
1.d. Politique QA
Politique de sortie de Portage et baselayout
Seul les membres de l'équipe Portage peuvent sortir des nouvelles versions de
Portage. Personne d'autre n'est autorisé à sortie de nouvelle version
de Portage.
Seul les membres de l'équipe baselayout peuvent sortir des nouvelles versions.
Personne d'autre n'est autorisé à sortie de nouvelle version de
sys-apps/baselayout.
Paquets masqués
/usr/portage/profiles/package.mask contient une liste des paquets
qui ne doivent pas être installés par les utilisateurs et des commentaires
détaillant la raison du masquage. Package.mask est utilisé pour empêcher
d'installer des paquets qui sont cassés, qui cassent d'autres éléments ou qui
ont mal été testés avant d'avoir un mot-clef en ~ARCH dans l'arbre. Quand vous
ajoutez un ebuild à package.mask, toujours soumettre package.mask avant de
soumettre l'ebuild masqué. Cela empêche l'ebuild d'être récupéré par des
utilisateurs avant que la mise à jour de package.mask ait été faite.
Une attention particulière doit être apportée quand un paquet est enlevé de
package.mask. Gardez à l'esprit que si un ebuild est dans
package.mask, c'est pour une bonne raison. Si vous n'avez pas
masqué vous-même l'ebuild, toujours contacter le développeur cité dans les
commentaires de package.mask avant de prendre une initiative. De
plus, si le paquet masqué est un paquet core, une dépendance d'un paquet core,
ou si démasquer le paquet peut avoir des effets secondaires, le changement
doit être fait après discussion interne sur la liste de diffusion des
développeurs.
~ARCH dans la variable KEYWORDS
L'objectif de ~arch est de permettre de tester des nouveaux paquets ajoutés dans
Portage.
Il y a une différence entre utiliser package.mask et ~arch pour
les ebuilds. L'utilisation de ~arch dénote que l'ebuild a besoin d'être
testé. L'utilisation de package.mask dénote que l'application ou
la bibliothèque est clairement instable. Par exemple si gimp-1.2.0 est
une version stable des développeurs de Gimp et qu'un nouveau correctif est
disponible en tant que 1.2.1, alors le développeur doit marquer l'ebuild comme
~arch pour qu'il soit testé dans Portage parce que la version est considérée
comme stable par Gimp. Un autre exemple, si Gimp décide de proposer une version
de développement ou instable marquée 1.3.0, alors les ebuilds résultant doivent
être mis dans package.mask car le logiciel lui-même est qualifié
de logiciel en développement et qu'il n'est pas recommandé par les développeurs
à la distribution.
Tous les nouveaux paquets qui entrent dans Portage doivent être marqués d'un
~arch pour les architectures sur lesquelles cette version est connue comme
fonctionnant. Le développeur qui soumet l'ebuild doit vérifier qu'il est en
état de fonctionnement et que la variable KEYWORDS est correcte.
Déplacer des versions de paquet de ~ARCH à ARCH
Quand une version de paquet a été testée pendant une période de temps
suffisante et considérée comme stable, et quand le mainteneur Gentoo de ce
paquet est sûr que la mise à jour n'entraînera pas de problèmes sur une machine
d'utilisateur normal, alors cette version peut passer de ~ARCH à ARCH. Une
indication pour savoir si un paquet est stable peut être de constater qu'aucun
rapport de bogue sur un mois après l'introduction du nouveau paquet n'a été
effectué pour cette version.
C'est au mainteneur du paquet de décider quelles versions sont stables ou si les
versions de développement doivent être mises dans package.mask ou
laissés en ~arch.
Vous devez également vous assurer que toutes les dépendances pour cette version
de paquet sont également en ARCH.
Attention :
L'étape ~ARCH peut être ignorée uniquement si la version en
question du paquet contient un correctif de sécurité ou est nécessaire
pour corriger un bogue important dans le système Gentoo.
|
1.e. Variables
Variables requises
La politique de Gentoo Linux requiert que tous les ebuilds contiennent les
variables KEYWORDS, LICENSE et SLOT. HOMEPAGE,
SRC_URI et DESCRIPTION doivent être ajoutés sauf dans certains
cas très spéciaux. DEPEND (et si besoin est, RDEPEND) doivent
être inclus si votre paquet a respectivement des dépendances à la compilation
ou à l'exécution.
DEPEND et RDEPEND
Utilisez DEPEND pour définir les dépendances nécessaires à la
compilation d'un paquet particulier et RDEPEND pour les dépendances
nécessaires à l'exécution d'un paquet particulier. Vous n'avez besoin de
spécifier explicitement RDEPEND que si les dépendances de lancement de
l'ebuild sont différentes de celles spécifiées dans DEPEND ; Si
RDEPEND n'est pas spécifié, la valeur par défaut sera celle de
DEPEND. Ne jamais initialiser RDEPEND à DEPEND par
vous-même dans un ebuild.
Exemple de code 5.1 : variable RDEPEND mauvaise et correcte |
# Acceptable :
RDEPEND="${DEPEND}
net-ftp/curl
virtual/libc"
# Non acceptable :
RDEPEND="${DEPEND}"
|
Il est également important de remarquer que seules les dépendances de
RDEPEND sont satisfaites quand on installe un paquet binaire
.tbz2. Utilisez ces informations pour vous aider à choisir les bonnes
dépendances RDEPEND. Sinon, RDEPEND aura les dépendances de
DEPEND.
Un paquet doit dépendre de la version la plus ancienne qui satisfait la
dépendance. Si le paquet fonctionne avec libfoo-1.2.x, ne le faites pas
dépendre de libfoo-2.x juste parce que c'est la version que vous avez
d'installée.
En général, les paquets doivent dépendre de =libfoo-1.2* à la place de
>=libfoo-1.2. Sinon, votre paquet va commencer à créer des problèmes
quand le paquet libfoo-2.0 sera disponible.
Dépendre d'un paquet virtuel comme virtual/foo ne fonctionne que si les
différents paquets proposant de valider la dépendance virtual/foo ont
des interfaces identiques. Considérons par exemple virtual/jdk-1.3.
Certains paquets ne fonctionnent pas avec ibm-jdk-1.3 alors qu'ils
fonctionneront bien avec sun-jdk-1.3. Pour cette raison, assurez-vous
que votre paquet a été testé avec tous les paquets ayant une correspondance
virtuelle avant de le démasquer. Il peut arriver que la dépendance soit
correcte seulement pour un certain nombre d'entre eux, mais qu'elle ne soit pas
correcte pour le paquet virtuel lui-même.
2. La politique concernant l'étiquette
2.a. Introduction et quelques suggestions simples
Ces suggestions sont faites pour servir de guide simplifié à ce que les
Relations entre Développeurs voient comme
étant une bonne étiquette pour les développeurs. Elles devraient couvrir
l'ensemble du sujet et devraient être appliquées autant que possible.
Cela ne veut pas dire que nous voulons que vous suiviez ce guide à la
lettre : cela ne veut pas non plus dire que vous devez être d'accord sur
tous ses points. En revanche on espère que tous les développeurs gardent une
sorte de standard dans le comportement vis-à-vis de la communauté. Cela dit,
vous pourriez être sanctionné ou suspendu si un tel standard n'est pas atteint.
Par standards raisonnables, nous n'entendons pas que vous agissiez d'une
manière la plus formelle possible ou que vous parliez comme un CEO. Nous
voulons juste que vous ayez du respect autant envers les développeurs qu'envers
les utilisateurs, quelles que soient les opinions de chacun (même si vous
pensez qu'ils ont tort).
Vous devez faire votre possible pour écrire avec le moins de fautes
d'orthographe et de grammaire, où que vous soyez : que ce soit dans les
messages de soumission CVS, dans un ChangeLog ou même sur IRC si vous voulez
être bien vu par les autres. Mais ne vous inquiétez pas. Ce n'est pas dramatique
si vous n'y arrivez pas. Vous ne le remarquez peut-être pas, mais en essayant de
corriger tout ça, le temps passé à essayer de lire vos phrases est largement
augmenté si vous ne faites pas un effort. D'un autre côté il ne faut pas non
plus perdre trop de temps à essayer d'être d'une éloquence extrême qui sera
longue à déchiffrer.
2.b. Ce que vous devez essayer d'éviter
Vous devez essayer de ne pas être brutal, rude, abusif ou impoli, quelles que
soient les circonstances. Parfois, un simple commentaire sarcastique peut
changer le regard que porte le lecteur vis-à-vis de ce que vous écrivez. Si
vous pensez devoir dire quelque chose de désagréable au point de déranger et
que vous avez vraiment besoin de le dire, assurez-vous que les gens
comprennent que vous n'essayez pas d'être offensant.
Souvenez-vous que vous êtes un représentant officiel de Gentoo. Cette fonction
doit vous rappeler que vous devez garder un certain niveau de professionalisme
et de courtoisie dans votre vie de tous les jours face aux autres développeurs
et aux utilisateurs.
2.c. Trucs et astuces
ChangeLogs
-
Rendez vos ChangeLogs lisibles par un utilisateur moyen : essayez de
garder les choses simples et courtes autant que possible, mais n'oubliez pas
de donner toutes les informations critiques nécessaires. Souvenez-vous que
les ChangeLogs doivent être écrits dans un bon anglais, même s'ils sont
courts. La ponctuation est, par exemple, essentielle.
-
Merci d'éviter de parler dans un langage « gentooifié », sauf pour
des termes acceptés classiquement comme « ebuild »,
« eclass »ou « Portage ». Si vous commencez à écrire
beaucoup, utilisez une ponctuation juste et bien placée.
-
Tout nom de fonction doit être encapsulé dans des signes de ponctuation.
-
Écrire : « version bump. » c'est bien ; écrire
« Version bump; see bug #... » c'est beaucoup mieux. Cela n'aide
pas seulement l'utilisateur, mais aussi les autres développeurs.
-
N'utilisez pas de phrases du genre « Tested for months, should
work. », ou « I think this should fix the problems. » pour
quelque chose qui fait ou non son boulot. C'est mieux de signaler aux
utilisateurs de tester le paquet en profondeur et vous rapporter tous les
bogues rencontrés.
-
Quand vous faites une référence à des sections d'un ebuild, comme par
exemple la variable homepage, utilisez « HOMEPAGE » en
n'oubliant pas de mettre des guillemets anglais et d'utiliser la bonne casse
(majuscule ou non). Cela rend les choses plus précises et indique au
lecteur que vous avez effectivement changé la variable, au lieu par exemple
du homepage où votre paquet ira quand il démarrera.
-
Quand vous utilisez des acronymes, merci d'utiliser la bonne casse. Par
exemple, « ALSA » et non « alsa », « Win4Lin »
et non « win4lin ».
Ebuilds
-
Essayez de ne pas faire de mises à jour continuelles sauf si c'est
réellement une nécessité, par exemple si la mise à jour apporte un
plus ou si c'est une correction de sécurité importante. Voici des exemples
de mises à jour intempestives à éviter :
-
Vous changez des erreurs d'orthographe dans les commentaires d'un
fichier de script, vous modifiez l'indentation du code ou toute autre
modification du même ordre ;
-
Vous modifiez un ebuild non lié au noyau pour qu'il supporte une
nouvelle version de noyau (ou une nouvelle version d'une bibliothèque)
pour permettre à plus d'utilisateurs d'installer votre ebuild, mais sans
rien changer pour les utilisateurs de la version courante.
En règle générale, des corrections qui apportent des changements non
triviaux sur un quelconque fichier d'un ebuild justifient une révision.
Autrement dit, si votre correctif modifie un comportement pour les
utilisateurs courants, vous devez faire votre révision en faisant en sorte
qu'ils puissent savoir qu'ils peuvent faire une mise à jour.
Veuillez consulter les règles à propos des ebuilds.
-
Respectez les préférences des développeurs en matière de code. Modifier de
manière inutile la syntaxe d'un ebuild augmente la charge du serveur CVS et
peut causer des complications pour les autres. Les modifications de syntaxe
doivent toujours être appliquées si elles apportent un réel plus, comme par
exemple une compilation plus rapide, des informations supplémentaires pour
l'utilisateur ou une conformité aux politiques du projet Gentoo.
IRC
-
Soyez courtois et respectez tout le monde, même s'ils vous submergent de
messages.
-
N'abusez pas de votre position et ne discriminez pas d'utilisateurs, que ce
soit pour une blague ou par pur sarcasme.
-
Répondez aux questions en utilisant vos connaissances étendues. Il est
toujours mieux de ne pas répondre aux questions pour lesquelles vous ne
sauriez répondre sans éviter la moindre confusion. Il n'y a pas de
politique sur les dommages collatéraux que peuvent causer les développeurs
aux utilisateurs, mais si un développeur peut apporter de l'aide et
qu'il lui est proposé par exemple un accès SSH sur la machine en panne, le
développeur sera tenu responsable de ce qu'il effectuera sur la machine de
l'utilisateur. De ce fait, nous ne recommandons clairement pas ce genre de
manipulations.
-
Si vous êtes un développeur ayant un statut d'opérateur, vous ne devez
pas en abuser. Si vous êtes en désaccord avec un utilisateur, vous devez
résoudre le problème de la manière la plus pacifique possible et ne pas en
venir à les renvoyer ou même les bannir, sauf si la situation est vraiment
sans issue et que les autres développeurs approuvent l'usage de ce type de
mesure.
-
#gentoo et #gentoo-dev sont des canaux de discussion où le langage est poli
et courtois. Les autres canaux de type #gentoo- suivent les règles
établies par leurs propriétaires respectifs. Puis que la majorité du
traffic sur #gentoo-dev est générée par des développeurs Gentoo, les gens
perçoivent ce canal comme celui qui représente officiellement Gentoo. Afin
de présenter Gentoo de manière la plus professionnelle possible nous
demandons que les développeurs gardent #gentoo-dev de manière la plus
professionnelle possible.
Forums
-
Soyez courtois et respectez tout le monde, même s'il y en a qui posent des
questions inimaginables. Soit vous répondez de manière courtoise, soit
vous ne donnez pas votre opinion.
-
Suivez les règles du forum et essayez de rester dans le fil du sujet au lieu
d'en sortir.
-
Essayez d'être actif. Si des utilisateurs demandent pourquoi quelque chose a
été ajouté, merci de l'expliquer. Si les utilisateurs demandent pourquoi
un élément est manquant, expliquez-le. Utilisez vos connaissances et aidez
dans la mesure du possible. Cela dit, si vous ne savez pas, ne répondez pas,
pour éviter toute confusion.
Courrier électronique
-
N'envoyez pas de courrier électronique en HTML (cela peut énerver) et il est
recommandé d'utiliser un client mail qui formate le texte (80 caractères par
lignes, etc.) avant l'envoi. Certaines personnes bloquent les mails
contenant du code HTML, ce qui peut occasionner quelques problèmes dans les
correspondances.
-
Quand vous répondez à des utilisateurs ou développeurs par mail, soyez
courtois et ne renvoyez pas un utilisateur à un autre développeur. Essayez
d'expliquer pourquoi les choses sont ce qu'elles sont, dans la mesure du
possible. Un exemple à suivre par exemple, serait : « Je
transmets votre courrier à <insérer un nom ici> dans la mesure
où <personne> est désormais le mainteneur de ce paquet. Toute
question se rapportant à ce sujet doit désormais être adressée à
<personne>. Veuillez nous excuser du dérangement que cela
peut vous occasionner. »
Ce document est protégé par la licence Creative
Commons : Paternité - Partage des Conditions Initiales à
l'Identique 2.5.
|