From Mageia wiki
Jump to: navigation, search
m (Les étiquettes sur les architectures (ExclusiveArch / ExcludeArch / %ifarch / %ifnarch): - traduction étiquette arch)
 
(50 intermediate revisions by 3 users not shown)
Line 1: Line 1:
{{Bandeau_multi-langues-fr|[[Packaging_guidelines|English]] ; [[Consignes_empaqueter-fr|Français]] ; }}
+
[[Category:Contributors]]
[[Main_Page | Accueil [en]]] → [[Accueil-fr | Accueil]] → [[Contribuer-fr | Équipes]] → [[Equipe_Packageurs-fr | Packageurs]] → [[Consignes_empaqueter-fr | Consignes]] <hr>
+
[[Category:Packaging]]
 +
[[Category:Policies]]
  
{{information|Cette page est en cours de traduction.}}
+
{{Multi language banner-fr|[[Packaging_guidelines|English]] ; [[Lignes directrices pour la création de paquets-fr|Français]] ; }}
{{warning|Cette page est en cours d'élaboration et doit être réadapté à la politique d'empaquetage de Mageia. N'hésitez pas à la relire et la corriger. Les passages en ''Italique'' sont à revoir.}}
+
[[Main_Page | Accueil [en]]] → [[Accueil-fr | Accueil]] → [[Contribuer-fr | Équipes]] → [[Equipe_Packageurs-fr | Packageurs]] → [[Lignes directrices pour la création de paquets-fr| Consignes]] <hr>
  
= Consignes d'empaquetage de Mageia =
+
{{warning-fr|Cette page est une traduction non relue d’une page qui est en cours d’élaboration et doit être réadapté à la politique d’empaquetage de Mageia. Nous vous invitons à la relire et la corriger. Les passages en ''Italique'' sont à revoir dans la version originale anglaise.}}
  
Ces consigues sont basées sur les consignes de Fedora, OpenSUSE, Meego et d'autres distributions.
+
{{introduction-fr|Cette page à pour objectf de présenter les consignes d’empaquetage de Mageia qui sont basées sur celles de Mandrake/Mandriva.}}
  
= Maintenir un paquet =
+
== Maintenir un paquet ==
Tous les paquet de Mageia doivent être tenus par un mainteneur (maintainer) (alias titulaire (owner), (bug owner)). Chaque paquet sans mainteneur sera automatiquement reconsidéré comme à supprimer de Mageia. Un mainteneur d'un paquet est responsable et s'assure que :
+
 
* son paquet est à jour avec les dernières sources en amont (upstream)
+
Tous les paquets de Mageia doivent être tenus par un mainteneur (maintainer) (alias titulaire (owner), (bug owner)). Chaque paquet sans mainteneur sera automatiquement reconsidéré comme à supprimer de Mageia. Un mainteneur d’un paquet est chargé de s’assurer que :
* son paquet est toujours construit dans le système d'empaquetage de Mageia et répare les échecs lorsqu'elles ont lieux
+
* son paquet est à jour avec les derniers paquets en amont (upstream)
 +
* son paquet intègre toujours le système de compilation Mageia et corrigent les erreurs de compilation lorsqu’elles se produisent
 
* les méta-données (meta-data) du fichier SPEC du RPM est exact
 
* les méta-données (meta-data) du fichier SPEC du RPM est exact
 
* la licence du paquet est correcte
 
* la licence du paquet est correcte
* il/elle suit les sources en amont pour répondre aussi rapidement que possible aux mises à jours de sécurité critiques
+
* il/elle suit les sources en amont pour répondre aussi rapidement que possible aux mises à jour de sécurité critiques
* elle/il fournit les informations à propos des changement majeur aux autres empaqueteurs (packagers) et mainteneurs (maintainers) pour leurs laissez assez de temps pour régler les problèmes de compatibilités.
+
* elle/il fournit les informations sur des changements majeurs aux autres empaqueteurs (packagers) et mainteneurs (maintainers) afin de laisser suffisamment de temps pour résoudre les problèmes de compatibilité.
  
Actuellement les données à propos du titulaire des paquets sont suivis dans http://pkgsubmit.mageia.org/data/maintdb.txt et les paquets non maintenus sont listés dans http://pkgsubmit.mageia.org/data/unmaintained.txt. Ils seront intégré et géré ultérieurement et nous laissons une période de grâce pour les paquets non maintenus. Après cette période de grâce, ces paquet sans mainteneurs serons reconsidéré pour la suppression.
+
Actuellement les données à propos du titulaire des paquets sont suivis dans http://pkgsubmit.mageia.org/data/maintdb.txt et les paquets non maintenus sont listés dans http://pkgsubmit.mageia.org/data/unmaintained.txt. Ils seront intégrés et gérés ultérieurement et nous laissons une période de grâce pour les paquets non maintenus. Après cette période de grâce, ces paquets sans mainteneurs seront proposés pour la suppression.
  
Pour vous ajouter comme mainteneur d'un paquet, veuillez suivre ces étapes :
+
Pour vous ajouter comme mainteneur d’un paquet, veuillez suivre ces étapes :
* mettez à jour à la version la plus récente de mgarepo
+
* mettez à jour à la version la plus récente de [[mgarepo]]
 
* Identifiez le paquet dont vous seul seriez le mainteneur unique
 
* Identifiez le paquet dont vous seul seriez le mainteneur unique
* Pour chaque paquet que vous souhaitez maintenir faites :
+
* Pour chaque paquet que vous souhaitez maintenir faites :
  mgarepo maintdb set [NomDuPaquet] [VotreIdentifiant]
+
 
* Ceci peut être uniquement fait par les empaqueteur, les apprentis n'ont aucun droit pour sur la commande maintdb
+
{{pre-fr|mgarepo maintdb set [NomDuPaquet] [VotreIdentifiant]}}
* '''Vous pouvez le faire uniquement si le paquet est maintenu par personne (nobody) !''''
+
 
* Votre requête sera immédiatement traité et vous serez donc le mainteneur du paquet. Acte de bienveillance, vous aidez à sauver quelques paquets non-maintenus. Allez et montrer leur que vous les aimez :)
+
* Ceci peut être uniquement fait par les empaqueteurs, les apprentis n’ont aucun droit sur la commande maintdb
 +
* '''Vous pouvez le faire uniquement lorsque le paquet n’est maintenu actuellement par aucune personne !''''
 +
* Votre requête sera immédiatement traitée et vous serez donc le mainteneur du paquet. Acte de bienveillance, vous aidez à sauver quelques paquets non maintenus. Allez et montrer leur que vous les aimez :)
 +
 
 +
L’état actuel est visible ici : http://pkgsubmit.mageia.org/data/maintdb.txt
 +
ou si vous avez un compte comme empaqueteur complet (c.-à-d. que vous n’êtes pas un apprenti) vous pouvez directement interroger la base de données des mainteneurs avec :
 +
 
 +
{{pre-fr|mgarepo maintdb get [packagename]}}
 +
 
 +
ou vous pouvez demander à Sophie sur un chat de Mageia :
 +
 
 +
{{pre-fr|:maint [packagename]}}
  
L'état actuel est visible ici : http://pkgsubmit.mageia.org/data/maintdb.txt
+
== [TEC] Mise à jour par un développeur autre que le responsable ==
ou si vous avez un compte comme empaqueteur complet (par exemple n'étant pas un apprenti) vous pouvez directement questionner la base de donné des mainteneur avec :
 
  mgarepo maintdb get [packagename]
 
ou vous pouvez demander à Sophie sur un chat de Mageia :
 
  :maint [packagename]
 
  
= Convention des noms de paquet =
+
Mageia a beaucoup de paquets et relativement peu d’empaqueteurs. En tant que communauté, nous faisons toujours ce que nous pouvons pour faire de Mageia une meilleure distribution et si nous empiétons sur le travail de quelqu’un, nous l’avons fait de bonne foi parce que nous voulons que Mageia soit de la meilleure qualité qui puisse exister.
* Les noms de paquet de base (utilisé pour svn et src.rpm) doit être le même nom que celui du projet du logiciel en amont, toujours en minuscule. Le nom en amon peut contenir des chiffres, des '+', '_' ou '.', mais aucun autre caractère exceptionnel. Dans des cas exceptionnellement rares des majuscules peuvent être acceptés s'il y a une raison qui le justifie (ex : les paquets perl) ou pour des raisons historiques.
 
* Les noms de paquet construit pour Mageia depuis leurs noms en amont doivent uniquement juxtaposer des suffixes en utilisant le délimiteur "-" (par exemple foo-devel ou foo-plugins comme dérivé du paquet foo). Tous "_" et "+" dans les noms des paquet doivent uniquement venir du nom du paquet en amont ! Les "." dans les noms de paquet doivent venir aussi de l'amont ou du schéma standard du versionnage.
 
* Le fichier SPEC doit être nommé en suivant le schéma %{nom}.spec, c.a.d le nom du paquet source et du répertoire svn doivent être utilisés comme nom pour le SPEC.
 
  
= Version et Révision (release) =
+
Ce développement mérite un ensemble de directives ou de politiques et voici une liste des travaux en cours proposés sur @dev.
  
La version du paquet a cette allure : X.Y.Z - R mga V<br>
+
* Les remontées de révisions par le développeur sont bonnes. Il n’est pas nécessaire de demander au mainteneur, à moins qu’il s’agisse d’un changement substantiel (la plupart du temps ce sont des reconstructions ou de petites corrections).
avec :
+
* Les remontées de révisions par le développeur doivent être abordées avec le responsable enregistré (dans maintdb), quand :
 +
** Le paquet est bien établi comme étant maintenu par une personne ou un groupe de personnes (Firefox, paquets KDE, noyau, etc.)
 +
** Le responsable est actif, c’est-à-dire qu’il a travaillé sur des paquets, des MLs ou des bogues au cours des deux derniers mois.
 +
** The version bump is substantial: major/minor bump or soname change, non-trivial spec changes like syncing with another distro that was not the maintainer's documented update workflow
 +
* Pour des raisons de sécurité, les téléchargements de développeur sont acceptables si le responsable n’a pas encore commenté le rapport de bogue et si un délai raisonnable s’est écoulé. Bien sûr, faites preuve de bon sens, si c’est le noyau ou la glibc, donnez au responsable une chance de revoir vos modifications.
 +
* Dans d’autres cas, faites preuve d’empathie et de bon jugement. Envoyer un courriel de deux lignes à un responsable pour l’informer de votre souhait de mettre à jour un paquet, ça ne coûte rien. Souvent, on vous disait même que vous pouvez aller de l’avant et vous remercier pour votre travail, qui vaut toujours la peine d’être pris.
 +
* Lorsque vous effectuez des téléchargements sans mainteneur, soyez prudent avec vos modifications. Ne laissez pas tomber des correctifs que vous ne comprenez pas, demandez au responsable et utilisez la solution pour mieux documenter l’objectif desdits correctifs. Ne synchronisez pas avec un nouveau fichier amont ou une autre distribution sans demander (sauf si ce paquet est identifié comme synchronisé avec une distribution donnée, par exemple rust ou Firefox).
 +
 
 +
== Convention des noms de paquet ==
 +
 
 +
* Les noms de paquet de base (utilisé pour svn et src.rpm) doit être le même nom que celui du projet du logiciel en amont, toujours en minuscule. Le nom en amon peut contenir des chiffres, des '+', '_' ou '.', mais aucun autre caractère exceptionnel. Dans des cas exceptionnellement rares des majuscules peuvent être acceptés s’il y a une raison qui le justifie (ex : les paquets perl) ou pour des raisons historiques.
 +
* Les noms de paquet construit pour Mageia depuis leurs noms en amont doivent uniquement juxtaposer des suffixes en utilisant le délimiteur "-" (par exemple foo-devel ou foo-plugins comme dérivé du paquet foo). Tous « _ » et « + » dans les noms des paquets doivent uniquement venir du nom du paquet en amont ! Les «.» dans les noms de paquet doivent venir aussi de l’amont ou du schéma standard du versionnage.
 +
* Le fichier SPEC doit être nommé en suivant le schéma %{nom}.spec, autrement dit le nom du paquet source et du répertoire svn doivent être utilisés comme nom pour le SPEC.
 +
 
 +
== Version et Révision (release) ==
 +
 
 +
La version du paquet a cette allure : X.Y.Z - R mga V<br>
 +
avec :
 
* X.Y.Z le numéro de 'version' qui est devrait représenter la version du projet
 
* X.Y.Z le numéro de 'version' qui est devrait représenter la version du projet
* ''R est l'étiquette de révision qui est toujours incrémenté après chaque changement du paquet et avant de le soumettre pour une nouvelle construction
+
* ''R est la balise de révision qui est toujours incrémenté après chaque changement du paquet et avant de le soumettre pour une nouvelle construction
 
* mga est le suffixe de la distribution
 
* mga est le suffixe de la distribution
 
* V est la version de la distribution''
 
* V est la version de la distribution''
  
== Version ==
+
=== Version ===
  
 
Le champ 'version' du fichier spec est là où vous inscrivez la version courante du logiciel à empaqueter.
 
Le champ 'version' du fichier spec est là où vous inscrivez la version courante du logiciel à empaqueter.
Il y a des cas où la version en amont ne correspond pas au standard et contient des caractères non numériques :
+
Il y a des cas où la version en amont ne correspond pas au standard et contient des caractères non numériques :
* Paquets en prérévision (pre-release) : les paquets sortie en version "pre-révision" avant une version "final". Elle inclue par exemple des étiquettes "alpha", "beta", "rc", "cvs", "git", "svn", etc et doit être ajouté à l'étiquette révision (release) et non pas à l'étiquette "version". Vous trouverez des détails en dessous.
+
* Paquets en prérévision (pre-release): les paquets sortis en version « pre-révision » avant une version « finale ». Elle inclut par exemple des balises « alpha », « beta », « rc », « cvs », « git », « svn », etc et doit être ajouté à la balise révision (release) et non pas à la balise « version ». Vous trouverez des détails en dessous.
  
== Versions de pré-révision ==
+
=== Versions de pré-révision ===
  
Pour les paquet de développement ou de pré-révision l'étiquette Release (révision) doit commencer par "0." ainsi quand le logiciel devient "final" et ne change pas de version, nous pouvons assurer une mise à jour sûre vers une version stable simplement en changeant Release à 1.
+
Pour les paquets de développement ou de pré-révision la balise Release (révision) doit commencer par « 0. » ainsi quand le logiciel devient « final » et ne change pas de version, nous pouvons assurer une mise à jour sûre vers une version stable simplement en changeant Release à 1.
  
Par exemple :
+
Par exemple :
<pre>
 
monFichierSource-2.9rc2.tar.gz a un fichier de spécification (specfile) contenant les champs Version : 2.9 et Release : %mkrel 0.rc2.1
 
</pre>
 
  
Pour chaque reconstruction du même paquet "pré-révisé" (pre-released), incrémentez simplement l'étiquette Release; comme ici 0.rc2.1 deviendrait 0.rc2.2 etc.
+
{{pre-fr|monFichierSource-2.9rc2.tar.gz a un fichier de spécification (specfile) contenant les champs Version : 2.9 et Release : %mkrel 0.rc2.1}}
  
Il est recommandé d'utiliser la macro "%mkrel -c rc2 1" pour générer 0.rc2.1.
+
Pour chaque reconstruction du même paquet « pré-révisé » (pre-released), incrémentez simplement la balise Release; comme ici 0.rc2.1 deviendrait 0.rc2.2 etc.
  
Pour les amonts de svn ou git, il est préférable d'inclure la date de la prise en compte, avec ou sans le numéro de révision ou du git hash (qui devrait être au moins en commantaire dans le fichier spec). Les exemples suivants sont acceptable :
+
Il est recommandé d’utiliser la macro "%mkrel -c rc2 1 » pour générer 0.rc2.1.
<pre>
+
 
%mkrel -c svn20130213 1
+
Pour les amonts de svn ou git, il est préférable d’inclure la date de la prise en compte, avec ou sans le numéro de révision ou du git hash (qui devrait être au moins en commantaire dans le fichier spec). Les exemples suivants sont acceptables :
 +
 
 +
{{pre-fr|<nowiki>%mkrel -c svn20130213 1
 
%mkrel -c 20130213svn85423 1
 
%mkrel -c 20130213svn85423 1
 
%mkrel -c git20130213 1
 
%mkrel -c git20130213 1
%mkrel -c 20130213gitae25f2 1
+
%mkrel -c 20130213gitae25f2 1</nowiki>}}
</pre>
 
  
rtmpdump peut aider a gérer ces dates de prise en compre, avec les variables %snap et %mkrel :
+
rtmpdump peut aider à gérer ces dates de prise en compre, avec les variables %snap et %mkrel :
 
http://svnweb.mageia.org/packages/cauldron/rtmpdump/current/SPECS/rtmpdump.spec?view=markup
 
http://svnweb.mageia.org/packages/cauldron/rtmpdump/current/SPECS/rtmpdump.spec?view=markup
  
== Révisions (release) ==
+
=== Révisions (release) ===
  
Le numéro de révision (release) doit commencer par 1, et doit revenir à 1 à chaque nouvelle version, ''et s'incrémenter à chaque changement du paquet''.
+
Le numéro de révision (release) doit commencer par 1, et doit revenir à 1 à chaque nouvelle version, ''et s’incrémenter à chaque changement du paquet''.
  
== Sous-révision (sub-release) (applicable uniquement aux mises à jours) ==
+
=== Sous-révision (sub-release) (applicable uniquement aux mises à jours) ===
  
 
Veuillez vous référer la section de nos [[Updates_policy#Maintainer_.28or_any_interested_packager.29|conventions des mises à jours (en)]].
 
Veuillez vous référer la section de nos [[Updates_policy#Maintainer_.28or_any_interested_packager.29|conventions des mises à jours (en)]].
  
= Étiquettes =
+
== Balises ==
 +
 
 +
* La balise de l’empaqueteur (Packager) ne doit pas être utilisée dans le fichier Spec. Les identités des empaqueteurs sont évidentes depuis les entrées du journal de modifications (changelog). En évitant d’utiliser la balise « Packager » vous éviter de retrouver des fichiers binaires compilé par quelqu’un d’autre avec votre nom dans les entêtes. Voir aussi [http://www.rpm.org/max-rpm/s1-rpm-inside-tags.html#S3-RPM-INSIDE-PACKAGER-TAG Maximum RPM definition of the Packager tag (en)]. Si vous avez besoin d’inclure des informations à propos de l’empaqueteur dans les RPM que '''vous''' construisez, utilisez plutôt {{code-fr|%packager}} dans votre {{code-fr|~/.rpmmacros}}
 +
* La balise du vendeur (Vendor) ne pas non plus être utilisé. Il est automatiquement réglé par le système de construction (build system).
 +
* Ordinairement, la balise PreReq doit être remplacé par entièrement par Requires. Pour plus d’information voir [http://www.rpm.org/max-rpm-snapshot/s1-rpm-depend-manual-dependencies.html#S3-RPM-DEPEND-FINE-GRAINED Maximum RPM fine grained dependencies chapter (en)].
 +
* La balise Source informe où trouver la source à l’amont du rpm. Dans la plupart des cas ça doit être le lien internet complet vers l’archive en amont (upstream tarball). La meilleure pratique veut l’utilisation de macros comme %version et %name pour permettre des mises à jours automatiques, mais ce n’est pas nécessaire.
  
* L'étiquette de l'empaqueteur (Packager) ne doit pas être utilisé dans le fichier Spec. Les identités des empaqueteurs sont évident depuis les entrées du registre des changements (changelog). En évitant d'utiliser l'étiquette "Packager" vous éviter de retrouver des fichiers binaires compilé par quelqu'un d'autre avec votre nom dans les entêtes. Voir aussi [http://www.rpm.org/max-rpm/s1-rpm-inside-tags.html#S3-RPM-INSIDE-PACKAGER-TAG Maximum RPM definition of the Packager tag (en)]. Si vous avez besoin d'inclure des informations à propos de l'empaqueteur dans les RPM que '''vous''' construisez, utilisez plutôt <code>%packager</code> dans votre <code>~/.rpmmacros</code>.
+
=== La balise résumée (Summary) ===
* L'étiquette du vendeur (Vendor) ne pas non plus être utilisé. Il est automatiquement réglé par le système de construction (build system).
 
* Ordinairement, l'étiquette PreReq doit être remplacé par entièrement par Requires. Pour plus d'information voir [http://www.rpm.org/max-rpm-snapshot/s1-rpm-depend-manual-dependencies.html#S3-RPM-DEPEND-FINE-GRAINED Maximum RPM fine grained dependencies chapter (en)].
 
* L'étiquette Source informe où trouver la source à l'amont du rpm. Dans la plus part des cas ça doit être le lien internet complet vers l'archive en amont (upstream tarball). La meilleur pratique veut l'utilisation de macros comme %version et %name pour permettre des mises à jours automatiques, mais ce n'est pas nécessaire.
 
  
== L'étiquette résumé (Summary) ==
+
Cette balise décrit en une seule ligne le paquet. De longueur maximum de 79 caractères, elle commence avec une lettre majuscule et non pas avec un espace. Le sommaire doit finir avec un point «. »
Cette étiquette décrit en une seule ligne le paquet. De longueur maximum de 79 caractères, elle commence avec une lettre majuscule et non pas avec un espace. Le sommaire doit finir avec un point ".".
+
Si ça vous dérange d’un point de vue grammatical, asseyez-vous, prenez une profonde inspiration et surmontez cette épreuve.
Si ça vous dérange d'un point de vue grammatical, asseyez vous, prenez une profonde inspiration et surmontez cette épreuve.
 
  
Le nom du paquet ne doit pas être répété dans le résumé. C'est une information redondante et donne un aspect étrange dans certains résultat de programme.
+
Le nom du paquet ne doit pas être répété dans le résumé. C’est une information redondante et donne un aspect étrange dans certains résultats de programme.
  
Il doit être adapté à toutes les situations standard et ne pas se préoccuper de contexte spéciaux. Il est utile dans les listes de paquets ordonnées alphabétiquement ou non, comme dans les listes de tous les paquets.
+
Il doit être adapté à toutes les situations standard et ne pas se préoccuper de contextes spéciaux. Il est utile dans les listes de paquets ordonnées alphabétiquement ou non, comme dans les listes de tous les paquets.
  
Il doit décrire la fonction principale du paquet et les propriétés particulières de ce paquet pour aider l'utilisateur à comparer des paquets aux noms ou fonctions similaires. Par exemple les deux mots "navigateur web" sont dans les résumés de tous navigateurs we, mais utilisant des adjectifs en plus (comme minimal, complexe, GNOME, KDE, rapide, ou l'auteur etc) aide à spécifier un paquet.
+
Il doit décrire la fonction principale du paquet et les propriétés particulières de ce paquet pour aider l’utilisateur à comparer des paquets aux noms ou fonctions similaires. Par exemple les deux mots « navigateur web » sont dans les résumés de tous navigateurs we, mais utilisant des adjectifs en plus (comme minimal, complexe, GNOME, KDE, rapide, ou l’auteur etc) aide à spécifier un paquet.
  
Le résumé dois être bref et précis sans inclure d'information redondante.
+
Le résumé doit être bref et précis sans inclure d’information redondante.
  
 
Le fichier SPEC du RPM contient uniquement la version anglaise afin de garde la base de donnée RPM petite.
 
Le fichier SPEC du RPM contient uniquement la version anglaise afin de garde la base de donnée RPM petite.
  
== L'étiquette de groupe RPM (RPM Group) ==
+
=== La balise de groupe RPM (RPM Group) ===
  
L'étiquette de groupe RPM est utilisé pour des groupes de paquets par leurs types de fonctionnalités qu'ils fournissent, et façonne la liste visible dans rpmdrake. Il est impératif que les groupes gardent leurs titres anglais, vous trouverez la liste de groupes existants à utiliser pour vos paquets sur la page [[RPM_groups_policy|Mageia policy (en)]]. Actuellement la liste est différente de l'originelle inventé par Red Hat, car pour nous, de notre point de vue, elle n'est plus adaptée aux distributions d'aujourd'hui. Vous pouvez encore la trouver [http://wayback.archive.org/web/20080512000048/http://www.rpm.org/RPM-HOWTO/ ici].
+
La balise de groupe RPM est utilisé pour des groupes de paquets par leurs types de fonctionnalités qu’ils fournissent, et façonne la liste visible dans rpmdrake. Il est impératif que les groupes gardent leurs titres anglais, vous trouverez la liste de groupes existants à utiliser pour vos paquets sur la page [[RPM_groups_policy|Mageia policy (en)]]. Actuellement la liste est différente de l’originelle inventé par Red Hat, car pour nous, de notre point de vue, elle n’est plus adaptée aux distributions d’aujourd’hui. Vous pouvez encore la trouver [http://wayback.archive.org/web/20080512000048/http://www.rpm.org/RPM-HOWTO/ ici].
  
== L'étiquette buildRoot ==
+
=== La balise buildRoot ===
  
L'étiquette BuildRoot est obsolète et devrait être supprimée là où elle est rencontrée puisse que sa fonctionnalité est directement gérée par rpm dans mageia.
+
La balise BuildRoot est obsolète et devrait être supprimée là où elle est rencontrée puisse que sa fonctionnalité est directement gérée par rpm dans mageia.
  
== L'étiquette PreReq ==
+
=== La balise PreReq ===
  
''Les paquets ne doivent pas utiliser l'étiquette PreReq. À l'époque, pour résoudre le serpent qui se mort la queue dans la récursion de dépendances, cette étiquette était utilisée pour désigner un "vainqueur" par rapport à ces dépendances et donc déterminer l'ordre de leur installation. Ce cas n'est plus le cas.''
+
''Les paquets ne doivent pas utiliser la balise PreReq. À l’époque, pour résoudre le serpent qui se mord la queue dans la récursion de dépendances, cette balise était utilisée pour désigner un « vainqueur » par rapport à ces dépendances et donc déterminer l’ordre de leur installation. Ce cas n’est plus le cas.''
  
== L'étiquette dépendances (requires) / dépendances explicites (explicit requires) ==
+
=== La balise dépendances (requires) / dépendances explicites (explicit requires) ===
  
Les paquets doivent contenir uniquement des "Requires" (dépendances) si elles sont absolument nécessaires pour que les logiciels fonctionnent correctement. Utilisez des ''dépendances'' versionnées au besoin comme expliqué plus loin.
+
Les paquets doivent contenir uniquement des « Requires » (dépendances) si elles sont absolument nécessaires pour que les logiciels fonctionnent correctement. Utilisez des ''dépendances'' versionnées au besoin comme expliqué plus loin.
  
Les paquet ne doivent pas contenir "explicit Requires" (dépendances explicites) sur des librairies sauf lorsque c'est absolument nécessaire et si tel est le cas il doit y avoir un commentaire le justifiant dans le fichier SPEC.
+
Les paquetages ne doivent pas contenir « explicit Requires » (dépendances explicites) sur des librairies sauf lorsque c’est absolument nécessaire et si tel est le cas il doit y avoir un commentaire le justifiant dans le fichier SPEC.
  
De manière général on comptre sur [[Construire_des_paquetages_RPM-fr#Construire_un_RPM|RPMbuild]] pour ajouter automatiquement les dépendances par le SONAME des librairies (le SONAME est le nom de la librairie suivit de sa révision, comme libGL.so.1 est le SONAME de libGL.so.1.2.0), les interpréteurs de script shell, et les modules utilisés par les programmes écrits dans des langages de script populaires comme Perl et Python.
+
De manière générale on compte sur [[Construire_des_paquetages_RPM-fr#Construire_un_RPM|RPMbuild]] pour ajouter automatiquement les dépendances par le SONAME des librairies (le SONAME est le nom de la librairie suivit de sa révision, comme libGL.so.1 est le SONAME de libGL.so.1.2.0), les interpréteurs de script shell, et les modules utilisés par les programmes écrits dans des langages de script populaires comme Perl et Python.
Les outils de gestion de paquets les plus récents sont capables de résoudre leurs dépendances et de déterminer quel paquets sont nécessaires pour d'autres. Les dépendances explicites sur le nom du paquet peuvent aider l'utilisateur inexpérimenté qui s'apprête à installer un paquet RPM manuellement, mais, l'histoire a montré que de telles dépendances ajoutaient de la confusion quand, la librairie ou les fichiers étaient déplacés d'un paquet à un autre, quand, les paquets étaient renommés, ou quand, l'un des multiples paquets alternatifs aurait suffit. De plus, dans quelques cas, d'ancienne dépendances explicites sur le nom du paquet imposait des mises à jours et des reconstructions inutiles.
+
Les outils de gestion de paquets les plus récents sont capables de résoudre leurs dépendances et de déterminer quels paquets sont nécessaires pour d’autres. Les dépendances explicites sur le nom du paquet peuvent aider l’utilisateur inexpérimenté qui s’apprête à installer un paquet RPM manuellement, mais, l’histoire a montré que de telles dépendances ajoutaient de la confusion quand, la librairie ou les fichiers étaient déplacés d’un paquet à un autre, quand, les paquets étaient renommés, ou quand, l’un des multiples paquets alternatifs aurait suffi. De plus, dans quelques cas, d’anciennes dépendances explicites sur le nom du paquet imposait des mises à jours et des reconstructions inutiles.
  
RPMbuild ajoutera automatiquement des dépendances ''versionnées'' dans quelques cas : avec le SONAME d'une librairie, le symbole faible de version de glibc, et des versions d'API de Perl ou Python quand elles installés comme binaires ou des modules d'extension versionnées. Des dépendances versionnées explicites sont requises quand on a besoin de permettre des mises à jours correctes vers une révision stable ou de mises à jours d'une révision à une autre, et aident quand on rétro-porte des paquets. Quoi qu'il en soit, elles peuvent périmer, devenir inexacte et superflues après quelque temps et doivent être reconsidérées lorsque ces versions deviennent de l'histoire ancienne. La règle du pouce est d'ajouter (ou de garder) une version explicite s'il est nécessaire pour la mise à jours des deux dernières révisions stables.
+
RPMbuild ajoutera automatiquement des dépendances ''versionnées'' dans quelques cas : avec le SONAME d’une librairie, le symbole faible de version de glibc, et des versions d’API de Perl ou Python quand elles sont installées comme binaires ou des modules installéesextension versionnées. Des dépendances versionnées explicites sont requises quand on a besoin de permettre des mises à jours correctes vers une révision stable ou de mises à jours d’une révision à une autre, et aident quand on rétro-porte des paquets. Quoi qu’il en soit, elles peuvent périmer, devenir inexacte et superflues après quelque temps et doivent être reconsidérées lorsque ces versions deviennent de l’histoire ancienne. La règle du pouce est d’ajouter (ou de garder) une version explicite s’il est nécessaire pour la mise à jours des deux dernières révisions stables.
  
Des dépendances versionnées sont particulièrement critiques pour des paquet mis à jours ou rétro-porté à une révision stable. Les utilisateurs pourraient choisir d'installer un sous-ensemble de paquets pendant la mise à jour ou laisser des versions anciennes des paquets installées nécessaires et le résultat est un système non fonctionnel.
+
Des dépendances versionnées sont particulièrement critiques pour des paquets mis à jours ou rétro-porté à une révision stable. Les utilisateurs pourraient choisir d’installer un sous-ensemble de paquets pendant la mise à jour ou laisser des versions anciennes des paquets installées nécessaires et le résultat est un système non fonctionnel.
  
Exemple rationnel pour une dépendance versionnée explicite :
+
Exemple rationnel pour une dépendance versionnée explicite :
  
<pre>
+
{{pre-fr|<nowiki># The automatic dependency on libfubar.so.1 is insufficient,
  # The automatic dependency on libfubar.so.1 is insufficient,
+
#    (La dépendance automatique de libfoo.so.1 est insuffisante,)
  #    (La dépendance automatique de libfoo.so.1 est insuffisante,)
+
# as we strictly need at least the release that fixes two segfaults.
  # as we strictly need at least the release that fixes two segfaults.
+
#    (car on a besoin au minimum d’une révision qui répare deux erreurs de segmentations.)
  #    (car on a besoin au minimum d'une révision qui répare deux erreurs de segmentations.)
+
Requires: libfubar >= 0:1.2.3-7</nowiki>}}
  Requires: libfubar >= 0:1.2.3-7
 
</pre>
 
  
=== Exceptions des dépendances/fournisseurs générées automatiquement ===
+
==== Exceptions des dépendances/fournisseurs générées automatiquement ====
  
Comme tous les fichiers d'un paquet sont scannés automatiquement pour savoir ce dont ils ont besoin ou ce qu'ils fournissent, il est parfois nécessaire de changer quelques fonctions soit d'en exclure. Pour le faire, vous pouvez procéder ainsi :
+
Comme tous les fichiers d’un paquet sont scannés automatiquement pour savoir ce dont ils ont besoin ou ce qu’ils fournissent, il est parfois nécessaire de changer quelques fonctions soit d’en exclure. Pour le faire, vous pouvez procéder ainsi :
<pre>
+
 
  # Suppress automatically generated Requires for devel packages
+
{{pre-fr|<nowiki># Suppress automatically generated Requires for devel packages
  #    (supprime automatiquement les dépendances générées pour)
+
#    (supprime automatiquement les dépendances générées pour)
  #    (le paquet de développement                            )
+
#    (le paquet de développement                            )
  %global __requires_exclude devel\(.*\)
+
%global __requires_exclude devel\(.*\)</nowiki>}}
</pre>
 
 
ou
 
ou
 
-----------
 
-----------
Cette édition est nécessaire puisse que le code à changé (octobre 2014)
+
Cette édition est nécessaire puisque que le code a changé (octobre 2014)
 
This requires some editing as the code has changed (October 2014)
 
This requires some editing as the code has changed (October 2014)
  
Line 161: Line 180:
 
-----------
 
-----------
  
<pre>
 
  # Suppress automatically generated Requires for pear packages
 
  #    (Supprime les dépendances générées automatiquement pour)
 
  #    (les paquets de pear                                  )
 
  %global __requires_exclude pear(vendor/autoload.php)\\|pear(xmlapi.php)
 
</pre>
 
  
<pre>
+
{{pre-fr|<nowiki># Suppress automatically generated Requires for pear packages
  # we don't want to provide private python extension libs
+
#    (Supprime les dépendances générées automatiquement pour)
  #    (Nous ne voulons pas fournir d'extensions privées pour )
+
#    (les paquets de pear)
  #    (les librairies Python.                                )
+
%global __requires_exclude pear(vendor/autoload.php)\\|pear(xmlapi.php)</nowiki>}}
  %define __provides_exclude_from ^(%{python_sitearch}/.*\\.so\\|%{python3_sitearch}/.*\\.so)$
 
</pre>
 
  
Vous pouvez aussi voir [https://fedoraproject.org/wiki/Packaging:AutoProvidesAndRequiresFiltering cette page] du wiki de Fedora pour plus d'information à ce sujet.
 
  
==== Débogage des dépendances récursives ====
+
{{pre-fr|<nowiki># we don't want to provide private python extension libs
 +
#    (Nous ne voulons pas fournir d’extensions privées pour)
 +
#    (les librairies Python.)
 +
%define __provides_exclude_from ^(%{python_sitearch}/.*\\.so\\|%{python3_sitearch}/.*\\.so)$</nowiki>}}
 +
 
 +
Vous pouvez aussi voir [https://fedoraproject.org/wiki/Packaging:AutoProvidesAndRequiresFiltering cette page] du wiki de Fedora pour plus d’information à ce sujet.
 +
 
 +
===== Débogage des dépendances récursives =====
  
 
Il y a une erreur récurrente lorsque des règles de dépendances sont trop nombreuses et contradictoires.
 
Il y a une erreur récurrente lorsque des règles de dépendances sont trop nombreuses et contradictoires.
Alors librpm doit briser cette chaîne de dépendances et le fait un peu aléatoirement en ayant un semblant de chaîne puisqu'il est impossible d'en finir lorsqu'il y a ces conflits dans les étiquettes de dépendances.
+
Alors librpm doit briser cette chaîne de dépendances et le fait un peu aléatoirement en ayant un semblant de chaîne puisqu’il est impossible d’en finir lorsqu’il y a ces conflits dans les balises de dépendances.
  
Il est possible d'utiliser une commande comme "urpmi --debug-librpm --deploops" afin de déboguer ce genre de situations.  
+
Il est possible d’utiliser une commande comme « urpmi --debug-librpm --deploops » afin de déboguer ce genre de situations.  
  
 
Mettre à jour depuis une révision précédente peut être résolu en cassant les boucles de dépendances.
 
Mettre à jour depuis une révision précédente peut être résolu en cassant les boucles de dépendances.
  
== L'étiquette des dépendances de construction (BuildRequires) ==
+
=== La balise des dépendances de construction (BuildRequires) ===
  
Dans le développement et les tests de packages, veuillez vérifier que votre paquet ne manque d'aucune dépendance de construction (BuildRequires) nécessaire. Avoir les dépendances propres pour la construction épargne beaucoup de temps au développeur et aux testeurs ainsi qu'au système de construction car il ne sera pas nécessaire de chercher manuellement les dépendances manquantes. C'est aussi une sécurité pour la construction du paquet qui n'échouerait pas, mais pour lequel il manquerait des fonctionnalités cruciales. Par exemple, une application graphique pourrait exclure le support PNG après que son script de '''configuration''' détecte que libpng n'est pas installé.
+
Dans le développement et les tests de packages, veuillez vérifier que votre paquet ne manque d’aucune dépendance de construction (BuildRequires) nécessaire. Avoir les dépendances propres pour la construction épargne beaucoup de temps au développeur et aux testeurs ainsi qu’au système de construction, car il ne sera pas nécessaire de chercher manuellement les dépendances manquantes. C’est aussi une sécurité pour la construction du paquet qui n’échouerait pas, mais pour lequel il manquerait des fonctionnalités cruciales. Par exemple, une application graphique pourrait exclure le support PNG après que son script de '''configuration''' détecte que libpng n’est pas installé.
  
Les BuildRequires doivent être listés au moyen d'une seule par ligne pour un maximum de lisibilité; au lieu d'en bourrer plusieurs sur une seule ligne, utilisez une étiquette BuildRequires par dépendance. Tandis que les RPM peuvent "voir" une très longue ligne de BuildRequires, nous les humain ne le pouvont pas, même si cela rend la spec plus longue, cela la rends plus lisible.
+
Les BuildRequires doivent être listés au moyen d’une seule par ligne pour un maximum de lisibilité; au lieu d’en bourrer plusieurs sur une seule ligne, utilisez une balise BuildRequires par dépendance. Tandis que les RPM peuvent « voir » une très longue ligne de BuildRequires, nous les humain ne le pouvont pas, même si cela rend la spec plus longue, cela la rend plus lisible.
Avant d'ajouter des BuildRequires à un quelconque paquet, veuillez vous sentir à l'aise avec les [[#L.27.C3.A9tiquette_d.C3.A9pendances_.28requires.29_.2F_d.C3.A9pendances_explicites|dépendances]]. Veuillez aussi vérifier que vous n'ajoutez pas de BuildRequires non nécessaire. Si vous ajoutez les BuildRequires au paquet "A" et aussi des dépendances "Requires" sur les paquet
+
Avant d’ajouter des BuildRequires à un quelconque paquet, veuillez vous sentir à l’aise avec les [[#L.27.C3.A9tiquette_d.C3.A9pendances_.28requires.29_.2F_d.C3.A9pendances_explicites|dépendances]]. Veuillez aussi vérifier que vous n’ajoutez pas de BuildRequires non nécessaire. Si vous ajoutez les BuildRequires au paquet « A » et aussi des dépendances « Requires » sur les paquets.
Si le paquet "A" à les dépendances pour la construction et aussi les dépendances au paquet "B" et C", il est inutile de préciser, d'ajouter en plus ces BuildRequires "B" et "C". Vous pouvez le vérifier avec <code>urpmq -pd</code> sur le paquet "A".
+
Si le paquet « A » a les dépendances pour la construction et aussi les dépendances au paquet « B » et « C », il est inutile de préciser, d’ajouter ces BuildRequires « B » et « C ». Vous pouvez le vérifier avec {{code-fr|urpmq -pd}} sur le paquet « A ».
  
Vous devriez toujours utiliser les produits virtuels indépendants de l'architecture comme BuildRequires. Ces produits virtuels indépendants de l'architectures sont par exemple les '''%name-devel''' (qui a été ajouté manuellement conformément à nos [[Libraries_policy|conventions sur les librairies(en)]]) ou '''pkgconfig(name)''' (qui est déjà disponible pour plein de paquet, et est généré automatiquement).  
+
Lorsque vous déclarez un requis de construction (BuildRequires), il faut utiliser une fourniture virtuelle (virtual porvides) sans spécification d’architecture. Ces fournitures virtueles indépendantes de l’architecture sont par exemple les '''%name-devel''' (qui a été ajouté manuellement conformément à nos [[Libraries_policy|conventions sur les librairies(en)]]) ou '''pkgconfig(name)''' (qui est déjà disponible pour plein de paquet, et est généré automatiquement).  
  
Par exemple, n'utilisez pas libsqlite3-devel, mais utilisez soit sqlite3-devel, soit pkgconfig(sqlite3). Vous pouvez vérifier quel produit virtuel un paquet -devel a, avec :
+
Par exemple, n’utilisez pas libsqlite3-devel, mais utilisez soit sqlite3-devel, soit pkgconfig(sqlite3). Vous pouvez vérifier quel produit virtuel un paquet -devel a, avec :
  
  rpm -q --provides lib64sqlite3-devel
+
{{pre-fr|rpm -q --provides lib64sqlite3-devel}}
qui fournira ce genre de résultat :
+
 
<pre>
+
qui fournira ce genre de résultat :
libsqlite3-devel = 3.7.6.2-3.mga1
+
 
 +
{{pre-fr|<nowiki>libsqlite3-devel = 3.7.6.2-3.mga1
 
sqlite3-devel = 3.7.6.2-3.mga1
 
sqlite3-devel = 3.7.6.2-3.mga1
 
pkgconfig(sqlite3) = 3.7.6.2
 
pkgconfig(sqlite3) = 3.7.6.2
 
devel(libsqlite3(64bit))
 
devel(libsqlite3(64bit))
 
lib64sqlite3-devel = 3.7.6.2-3.mga1
 
lib64sqlite3-devel = 3.7.6.2-3.mga1
lib64sqlite3-devel(x86-64) = 3.7.6.2-3.mga1
+
lib64sqlite3-devel(x86-64) = 3.7.6.2-3.mga1</nowiki>}}
</pre>
 
Comme vous pouvez le voir, seulement les deux recommandés précédemment ne porte aucune référence à l'architecture contrairement à devel(libsqlite3(64bit)) ou lib64sqlite3-devel(x86-64).
 
  
'''IMPORTANT :'''
+
Comme vous pouvez le voir, seulement les deux recommandés précédemment ne portent aucune référence à l’architecture contrairement à devel(libsqlite3(64bit)) ou lib64sqlite3-devel(x86-64).
Si vous utilisez des binaires comme '''desktop-file-install''' vous devez obligatoirement mettre les paquets comme dépendant à la construction qui le contient, sinon le paquet échouera lors de sa construction sur le système de construction de Mageia.
+
 
 +
{{warning-fr|Si vous utilisez des binaires comme '''desktop-file-install''' vous devez obligatoirement mettre les paquets comme dépendant à la construction qui le contient, sinon le paquet échouera lors de sa construction sur le système de construction de Mageia.}}
 +
 
 +
Quand vous construisez un paquet localement, vous pouvez facilement installer les dépendances à la construction du paquet '''foo''' avec la commande :
 +
 
 +
{{cmd-fr|urpmi foo.spec}}
  
Quand vous construisez un paquet localement, vous pouvez facilement installer les dépendances à la construction du paquet foo avec la commande :
 
  urpmi foo.spec
 
 
(ou urpmi --buildrequires foo.spec ou urpmi --buildrequires foo.src.rpm qui serait sa syntaxe la plus correcte.)
 
(ou urpmi --buildrequires foo.spec ou urpmi --buildrequires foo.src.rpm qui serait sa syntaxe la plus correcte.)
Cela placera tous les paquets listé dans le fichier spec comme BuildRequires.
+
Cela placera tous les paquets listés dans le fichier spec comme BuildRequires.
  
== Les étiquettes sur les architectures (ExclusiveArch / ExcludeArch / %ifarch / %ifnarch) ==  
+
=== Les balises sur les architectures (ExclusiveArch / ExcludeArch / %ifarch / %ifnarch) ===
  
N'utilisez ExclusiveArch seulement lorsque vous êtes sûr qu'un paquet ne fonctionne que sur certaines architectures. Pareil pour ExcludeArch, quand vous savez sur quelle architecture il ne fonctionne pas, sans savoir sur quelle architecture il fonctionne.
+
N’utilisez ExclusiveArch seulement lorsque vous êtes sûr qu’un paquet ne fonctionne que sur certaines architectures. Pareil pour ExcludeArch, quand vous savez sur quelle architecture il ne fonctionne pas, sans savoir sur quelle architecture il fonctionne.
  
Pour x86 (i586) la macro a utiliser est %ix86.
+
Pour x86 (i586) la macro à utiliser est %ix86.
  
%ifarch/%ifnarch doivent être évités autant que possible, au moins pour patcher. En général, vous ne devriez pas appliquer un patch conditionnellement pour une seule architecture. Ceci donnera l'avertissement rpmlint :  
+
%ifarch/%ifnarch doivent être évités autant que possible, au moins pour patcher. En général, vous ne devriez pas appliquer un patch conditionnellement pour une seule architecture. Ceci donnera l’avertissement rpmlint :  
  
<pre>%ifarch-applied-patch
+
{{pre-fr|<nowiki>%ifarch-applied-patch
 
A patch is applied inside an %ifarch block. Patches must be
 
A patch is applied inside an %ifarch block. Patches must be
 
applied on all architectures and may contain necessary configure
 
applied on all architectures and may contain necessary configure
and/or code patch to be effective only on a given arch.</pre>
+
and/or code patch to be effective only on a given arch.</nowiki>}}
 +
 
 +
('''traduction''' : Un patch est appliqué au sein d’un bloc %ifarch. Les correctifs doivent être appliqués sur toutes les architectures et peuvent contenir les correctifs de configuration et/ou de code nécessaires pour être efficaces uniquement sur une arche donnée.)
  
(traduction : un patch est appliqué au sein d'un bloque %ifarch. Les patches doivent être
+
=== La balise sources ===
appliqué pour toutes les architectures et devraient contenir une configuration
 
nécessaire et/ou un code de patch pour être effectif sur une architecture donnée.)
 
  
== L'étiquette sources ==
+
Les fichiers sources doivent commencer avec Source'''0''', ne commencez pas avec « Source : » puis « Source1 : ». Même si le paquet a seulement un fichier source, utilisez là encore Source0.
Source files must begin with Source0, do not use Source: and then Source1:; if a package has exactly one source file, still use Source0 as it may not always continue to have exactly one source file.  
+
Si le fichier source a un lien URL pour le télécharger, il doit être inclus. Dans la plupart des cas, c’est le lien complet de l’archive TAR intégrale en amont (upstream). La meilleure pratique serait d’utiliser des macros comme %version et %name pour ce lien, ce qui pourrait rendre automatique les mises à jour, mais c’est optionnel.
If a source file has a downloadable URL that it came from, it must be included. In most cases this should be a complete URL to the upstream tarball. Best practice would be to use macros like %version and %name for this URL where possible to allow for automatic updates, but this is not necessary.
 
  
== L'étiquette patches ==
+
=== La balise patch (correctif, rustine) ===
Each problem should be solved in a separate patch. To allow easy maintenance of patches, the source of the patch should be indicated, especially if the patch may need to be updated from the same source in the future. When the patch is first added, the source of the patch should be stated in the commit message. It also helps to have a comment in the SPEC where the patch comes from, which should be a complete URL to the upstream if this is not obvious, and a description what the patch does in short simple words, if that is not clearly self-evident from the patch name.
 
  
Patches should start from Patch0 keyword in SPEC, similar to the Source tag.
+
Chaque problème doit être résolu dans un patch séparé. Pour faciliter la maintenance des correctifs, la source du correctif doit être indiquée, surtout si le correctif doit être mis à jour à partir de la même source à l’avenir. Lorsque le correctif est ajouté pour la première fois, la source du correctif doit être indiquée dans le message de validation. Il est également utile d’avoir un commentaire dans le SPEC d’où vient le patch, qui devrait être une URL complète vers l’amont si ce n’est pas évident, et une description de ce que fait le patch en quelques mots simples, si cela ne ressort pas clairement du nom du correctif.
Patches should be named in a very explicit manner to make it very clear against which version of the software the patch was originally generated or applied. To that end, patch names usually follow the convention of '''[package_name]-[version]-[description].[filename suffix]''':
 
  
*'''[package_name]''' is the name of the package it applies against, such as 'shadow-utils' or 'gnupg'
+
Les correctifs doivent commencer avec le mot clef Patch0 dans le fichier SPEC, comme la balise Source.
*'''[version]''' is the version of the program this patch was developed against, such as 1.0. If a patch is rediffed because the old patch does not apply to a new version, a new patch must be created with the appropriate name – it is inappropriate to rediff foo-1.0-linking-fix.patch against foo-1.2 and continue to use the same patch name. The new patch must be named foo-1.2-linking-fix.patch. ''For historical purposes, patches should be moved in svn; instead of doing “svn rm foo-1.0-linking-fix.patch” and “svn add foo-1.2-linking-fix.patch”, the original patch should be moved and then the newly-derived patch copied and committed; i.e. “svn mv foo-1.0-linking-fix.patch foo-1.2-linking-fix.patch; svn commit”''
+
Les correctifs doivent être nommés de manière très explicite pour indiquer clairement quelle version du logiciel le correctif a été initialement généré ou appliqué. Enfin, les noms des rustines suivent généralement la convention '''[nom_du_paquet]-[version]-[description].[suffix du nom de fichier]''' où :
*'''[description]''' is a short description of the patch's purpose
+
*'''[nom_du_paquet]''' est le nom du paquet auquel le correctif s’applique, comme « shadow-utils » ou « gnupg »
*'''[filename suffix]''' Normally this is <code class="filename">.patch</code> or in some cases, mostly when reusing upstream patches <code class="filename">.diff</code>
+
*'''[version]''' est la version du programme pour lequel le correctif a été développé, comme 1.0. Si une rustine est rediffusée, car la rustine précédente ne s’applique pas à la nouvelle version, une nouvelle rustine doit alors être crée avec un nom approprié. C’est inapproprié de rediffuser foo-1.0-linking-fix.patch pour foo-1.2 et de continuer d’utiliser le même nom de rustine. La nouvelle rustine doit être nommée foo-1.2-linking-fix.patch. ''Pour des raisons historiques, les rustines doivent être mises sur svn ; au lieu de faire « svn rm foo-1.0-linking-fix.patch » et « svn add foo-1.2-linking-fix.patch », la rustine originale doit être déplacée et après la nouvelle rustine dérivée doit être copié et envoyé; par exemple « svn mv foo-1.0-linking-fix.patch foo-1.2-linking-fix.patch; svn commit »''
 +
*'''[description]''' est une brève discription du but de la rustine
 +
*'''[suffix du nom de fichier]''' Normalement c’est {{code-fr|.patch}} et quelques fois {{code-fr|.diff}} lorsque les rustines sont réutilisées en amont.
  
Patches should be in the unified format (<span>'''diff -u'''</span>) and should be applied with 1 strip level in the spec file (<span>'''%patch -p1'''</span>). The only exceptions are the patches obtained from an another primary source site. The original name, suffix, and format is preserved in this case.
+
Les rustines devraient être au format unifié (<span>'''diff -u'''</span>) et à appliquer avec un niveau d’arborescence 1 dans le fichier spec (<span>'''%patch -p1'''</span>, voir l’option -p avec ''$man patch''). Les seules exceptions sont les rustines obtenues d’un autre site de source primaire. Le nom original, le suffixe et le format sont alors préservés. Chaque rustine doit être conservé au format plein texte et non compressé, ça permet leur utilisation avec l’interface web de SVN par exemple.
Each patch should be kept in plaintext format and uncompressed, to allow for usage with SVN web frontend for example.
 
  
For the patches to be applied, the patches should be mentioned in %prep below %setup, and should be done as follows
+
Pour les rustines à appliquer, elles devraient être mentionnées dans %prep en dessous de %setup, et devrait être fait comme présenté ci-dessous :
  
%patch0 -p1 -b .foobar
+
{{pre-fr|%patch0 -p1 -b .foobar}}
*-p1 is the patch level, relative from where the patch is applied from
 
*-b is the suffix that is appended to the backup files which the patch command creates, in this case .foobar, this should similar to or derived from the [description] part of the patch filename (see above).
 
  
To create patches, you can ease your work by using something like http://labix.org/patcher
+
* -p1 est le niveau d’arborescence, relatif à partir d’où le patch est appliqué
 +
* -b est le suffixe qui est ajouté au fichier de sauvegarde que la commande créer, dans ce cas .foobar, ceci doit être similaire ou découle de la partie [description] de la rustine.
  
*'''Using %apply_patches'''
+
Pour confectionner des rustines, vous pouvez vous faciliter le travail en utilisant quelque chose comme http://labix.org/patcher.
This may be used to replace all the %patchN lines in %prep and can save space in the spec file (especially in packages with many upstream patches) as it will apply all patches listed with one command. However, for this to work '''all''' the patches must be '''-p1''' and the PatchN: keyword definitions '''must''' be placed immediately following the SourceN: definitions in the spec file, otherwise they may be silently ignored (no error messages during build) so be careful.
 
Alternatively, the macro '''%autopatch -p1''' may be used, which works essentially the same way.  This is a new standard macro from upstream RPM, and therefore provides better compatibility with other distributions.
 
  
== L'étiquette %clean ==
+
*'''Utiliser %apply_patches'''
 +
On peut l’utiliser pour remplacer toutes les lignes %patchN dans %prep et gagner de l’espace dans le fichier spec (spécialement dans un paquet avec plein de rustines de l’amont) puisse qu’il appliquera toutes les rustines avec une commande. Quoi qu’il en soit, pour que ça fonctionne '''toutes''' les rustines doivent être '''-p1''' et les mots clefs de définition des PatchN: '''doivent''' être placées immédiatement après les mots clefs de définition sourceN: du fichier spec, sinon ils seront silencieusement ignorés (aucun message d’erreur durant la construction) alors soyez prudent. Autrement, la macro '''%autopatch -p1''' peut être utilisée, elle fonctionne essentiellement de la même manière. C’est une nouvelle macro standard venue de l’amont RPM et donne ainsi une meilleure compatibilité avec d’autres distributions.
  
The %clean section is deprecated and should be removed where encountered, as it is handled directly by rpm in Mageia.
+
=== La balise %clean ===
  
= La documentation =
+
La balise %clean est obsolette et devrait être supprimée systématiquement si elle est rencontrée, car sa fonctionnalité dans Mageia est directement gérée avec rpm.
Any relevant documentation included in the source distribution should be included in the package. Irrelevant documentation include build instructions, the omnipresent ''INSTALL'' file containing generic build instructions, for example, and documentation for non-Linux systems, e.g. ''README.MSDOS''.  Pay also attention about which subpackage you include documentation in, for example API documentation belongs in the -devel subpackage, not the main one.  Or if there's a lot of documentation, consider putting it into a subpackage.  In this case, it is recommended to use <code>*-doc</code> as the subpackage name, and <code>Documentation</code> as the value of the <code>Group</code> tag.
 
  
Also, if a package includes something as <code>%doc</code>, it must not affect the runtime of the application. To summarize: If it is in <code>%doc</code>, the program must run properly if it is not present.
+
== La documentation ==
  
Check that documentation file permissions allow reading by normal users.
+
Tout document pertinente inclut dans les sources doit être inclus dans le paquet. Les documents non pertinents sont les instructions de construction, l’omniprésent fichier ''INSTALL'' contenant des instructions générique de construction et les documents pour les systèmes autres que Linux par exemple ''README.MSDOS''. Faites attention à quel sous-paquet vous ajoutez les documents, par exemple les documents pour une API appartiennent au sous-paquet de développement -devel et non pas au principal. Ou, s’il y a beaucoup de document, il est possible de les rassembler en un sous-paquet séparé. Dans ce cas, il est recommandé d’utiliser le suffixe {{code-fr|*-doc}} au nom du sous-paquet et {{code-fr|Documentation}} comme valeur de la balise {{code-fr|Group}}.
  
When only English man pages are available, install them uncompressed to <code>%{buildroot}%{_mandir}/manX/</code> (where X is the appropriate section number). They will be automatically compressed before being packaged, so they must be referred to in the %<code>files</code> section with a wild card, e.g. <code>%{_mandir}/man1/xyzzy.1*</code>.  Man pages will be automatically given the <code>%doc</code> attribute, so don't add that explicitly.
+
Si le paquet inclut quelque chose comme {{code-fr|%doc}}, il ne doit pas affecter l’exécution et le déroulement du logiciel. En résumé : si c’est dans {{code-fr|%doc}}, le programme doit fonctionner proprement s’il n’est pas présent.
  
= Paquet de développement =
+
Vérifiez que les fichiers des documents ont les permissions permettant d’être lus par les utilisateurs normaux.
If the software being packaged contains files intended solely for development, those files should be put in a -devel subpackage. The following are examples of file types which should be in -devel:
 
* Header files (such as .h files)
 
* Unversioned shared libraries (such as libfoo.so). Versioned shared libraries (such as libfoo.so.3, libfoo.so.3.0.0) should not be in -devel.
 
  
A good rule of thumb is if the file is used for development and not needed for the base package to run properly, it should go in -devel.
+
Quand les pages Man sont uniquement disponibles en anglais, installez les décompressés dans {{code-fr|%{buildroot}%{_mandir}/manX/}} (où X est le numéro de section approprié). Ils seront automatiquement compressés avant d’être empaqueté, ainsi ils doivent être inscrits dans la section {{code-fr|%files}} avec un caractère jocker, ex : {{code-fr|%{_mandir}/man1/xyzzy.1*}}. Les pages Man obtiendront automatiquement l’attribut {{code-fr|%doc}}, alors ne les ajoutez pas explicitement.
  
''
+
== Paquet de développement ==
.a files and .la files should generally not be included anywhere. They are only useful when one wants to statically link a program against the library (i.e. include the library in the program binary itself, so the library isn't needed at run-time), which is generally not done in Mageia.
 
Libtool archives, ''foo.la'' files, should not be included. Packages using libtool will install these by default even if you configure with ''--disable-static'', so they may need to be removed before packaging.  Due to bugs in older versions of libtool or bugs in programs  that use it, there are times when it is not always possible to remove *.la files without modifying the program.  In most cases it is fairly easy to work with upstream to fix these issues.  Note that if you are updating a library in a stable release (not devel) and the package already contains *.la files, removing the *.la files should be treated as an API/ABI change -- ie: Removing them changes the interface that the library gives to the rest of the world and should not be undertaken lightly.''
 
  
== Dépendant du paquet de base ==
+
Si le logiciel qui sera empaqueté contient des fichiers prévus uniquement pour du développement, ces fichiers doivent être placés dans un sous-paquet -devel. Les exemples suivant sont des types de fichiers qui doivent-être placé dans ce sous-paquet -devel :
Devel packages must require the base package using a fully versioned dependency:
+
* Les fichiers d’entête (comme les fichiers .h)
<code>Requires: %{name} = %{version}-%{release}</code>
+
* les librairies partagées non versionnées (comme libfoo.so). Tandis que les librairies versionnées (comme libfoo.so.3, libfoo.so.3.0.0) ne doivent pas être dans un -devel.
Usually, subpackages other than -devel should also require the base package using a fully versioned dependency.
 
  
== Fichiers Pkgconfig ==
+
Une bonne règle est, si le fichier est utilisé pour du développement et n’est pas nécessaire dans le paquet de base du logiciel pour fonctionner proprement, il doit aller dans -devel.
The placement of pkgconfig(.pc) files depends on their usecase. Since they are almost always used for development purposes, they should be placed in a -devel package.
 
A reasonable exception is when the main package itself is a development tool not installed in a user runtime, such as gcc or gdb.
 
  
= Librairies partagées =
+
''Les fichiers .a et .la doivent généralement pas être inclus tout court. Ils sont seulement nécessaires quand on souhaite lier un programme avec des librairies statiques (le programme inclut la librairie en lui-même ainsi la librairie n’est plus nécessaire lors de l’exécution), ce qui n’est généralement pas le cas avec Mageia. Les archives libtool, les fichiers ''foo.la'' ne doivent pas être inclus. Des paquets utilisant libtool les installeront par défaut même si vous les configurez avec ''--disable-static'', alors ils seront à supprimer avec l’emballage du paquet. Dû à des bogues dans des versions précédentes de libtool ou des bogues dans les programmes qui l’utilisent, parfois il n’est pas toujours possible de supprimer simplement les fichiers *.la sans avoir à modifier le programme. Dans la plupart des cas, il est raisonnable et facile de travailler avec l’amont pour corriger ces problèmes. Notez que si vous mettez à jour une librairie vers une version stable (et non une version de développement) et que le paquet contient déjà des fichiers *.la, supprimer ces fichiers *.la doit être traité comme un changement d’API/ABI -- ex : les supprimer change l’interface que la librairie donne au reste du monde ne doit pas être pris à la légère.''
Whenever possible (and feasible), Mageia Packages containing libraries should build them as shared libraries.
 
  
An ldconfig isn't needed anymore for libraries in <code>%post</code> and <code>%postun</code>, this is handled automagically by RPM filetriggers . If this is encountered, please remove the ldconfig calls and if this is the only purpose of %post / %postun then remove the whole %post / %postun section
+
=== Dépendant du paquet de base ===
  
See [[Libraries policy|Libraries policy (en)]] for more details on how to package libraries.
+
Les paquets de développement doivent dépendre des paquets de base en utilisant une dépendance entièrement versionnée :
  
= Fichiers de configuration =
+
{{code-fr|<nowiki>Requires: %{name} = %{version}-%{release}</nowiki>}}
  
Configuration files must be marked as such in packages.
+
Habituellement, les sous-paquet autre que -devel devraient aussi être dépendants du paquet de base aussi en utilisant une dépendance entièrement versionnée.
  
''As a rule of thumb, use <code>%config(noreplace)</code> instead of plain <code>%config</code> unless your best, educated guess is that doing so will break things.  In other words, think hard before overwriting local changes in configuration files on package upgrades.  An example case when /not/ to use <code>noreplace</code> is when a package's configuration file changes so that the new package revision wouldn't work with the config file from the previous package revision.  Whenever plain <code>%config</code> is used, add a brief comment to the specfile explaining why.''
+
=== Fichiers Pkgconfig ===
  
Don't use %config or %config(noreplace) under /usr. /usr is deemed to not contain configuration files in Mageia.
+
Le placement des fichiers pkgconfig(.pc) dépend de leurs usages. Depuis qu’ils sont presque toujours utilisés à des fins de développement, ils sont à placer dans un paquet -devel.
 +
Une exception raisonnable est lorsque le paquet principal lui-même est un outil de développement qui n’est pas installé dans l’environnement d’exécution de l’utilisateur, comme gcc ou gdb.
  
= Gestion de Service / Initscripts =
+
== Bibliothèques partagées ==
  
Since Mageia 3 [http://www.freedesktop.org/wiki/Software/systemd systemd] is the only init system offered, however it is still able to support SystemV-style initscripts with the caveat that they must contain valid LSB headers to allow for proper dependency information to be extracted.
+
Chaque fois que c’est possible (et faisable), les paquets Mageia contenant des bibliothèques devraient les compiler en tant que bibliothèques partagées.
  
Mageia 2 supported both SystemV and systemd boots and thus required both a SystemV-style initscript and (optionally) a systemd unit.
+
Un ldconfig n’est plus nécessaire pour les librairies dans {{code-fr|%post}} ni {{code-fr|%postun}}, c’est automatiquement géré par le RPM filetriggers. Si c’est le cas, veuillez enlever les appels à ldconfig et si c’était l’unique but de %post / %postun, alors supprimez entièrement ces sections vides.
  
Mageia 1 only supported SystemV.
+
Consulter [[Libraries policy|Libraries policy (en)]] pour plus de détails sur la façon de créer des bibliothèques pour les paquetages.
  
For more information on packaging services see the [[System_Service_policy|System Service policy (en)]].
+
== Fichiers de configuration ==
  
= Fichiers desktop =
+
Les fichiers de configuration doivent être marqués comme tel dans les paquets.
  
If a package contains a GUI application, then it needs to also include a properly installed .desktop file.  For the purposes of these guidelines, a GUI application is defined as any application which draws an X window and runs from within that window.  Installed .desktop files MUST follow the [http://standards.freedesktop.org/desktop-entry-spec/desktop-entry-spec-latest.html desktop-entry-spec]  , paying particular attention to validating correct usage of Name, GenericName, [http://standards.freedesktop.org/menu-spec/latest/apa.html Categories]  ,
+
''Comme bonne règle, utiliser {{code-fr|%config(noreplace)}} à la place d’un simple {{code-fr|%config}} à moins que vous pensiez que faire ainsi brisera les choses. En d’autres mots, réfléchissez bien avant d’écraser un fichier de configuration local par la mise à jours du paquet. Un exemple quand il ne faut pas utiliser {{code-fr|noreplace}}, quand un fichier de configuration d’un paquet change à tel point que la nouvelle version du paquet ne fonctionnerait plus avec l’ancien fichier de configuration. Dès que vous utilisez un simple {{code-fr|%config}}, veuillez ajouter un bref commentaire dans le fichier spec expliquant pourquoi.''
[http://www.freedesktop.org/Standards/startup-notification-spec StartupNotify]
 
entries.
 
Please always validate .desktop files via <code>desktop-file-validate</code> from the package desktop-file-utils.
 
  
== La clé Icon des fichiers Desktop ==
+
Veuillez ne pas utiliser %config ou %config(replace) dans /usr. /usr n’est censé contenir de fichier de configuration sur Mageia.
''The icon key can only be specified in one way:
 
  
* Short name without file extension/path:
+
== Gestion de Service / Initscripts ==
<code>Icon=comical</code>
 
  
The short name without file extension allows for icon theming (it assumes .png by default, then tries .svg and finally .xpm)''
+
Depuis Mageia 3, [http://www.freedesktop.org/wiki/Software/systemd systemd] est le seul système d’initialisation offert, cependant, il supporte encore les scripts d’initialisations de style systemV avec la mise en garde qu’ils doivent contenir un entête LSB valide pour permettre d’extraire les informations sur les dépendances proprement.
  
== Création du fichier .desktop ==
+
Mageia 2 supportait autant le démarrage avec SystemV et systemd, et dépendait autant de scripts d’initialisation de style SystemV et optionnelement d’une unité systemd.
If the package doesn't already include and install its own .desktop file, you need to make your own. You can do this by generating a .desktop file you create as a Source: (such as Source3: %{name}.desktop) or generating it in the spec file via a "here document". Here is an example for such a here document, the green part is the contents of the .desktop file
 
  
 +
Mageia 1 ne supportait que SystemV.
  
  mkdir -p %{buildroot}%{_datadir}/applications
+
Pour plus d’information sur l’empaquetage des services, veuillez voir les [[System_Service_policy|consignes d’empaquetage des services (en)]].
  cat > %{buildroot}%{_datadir}/applications/%{name}.desktop << EOF
 
  <span style="color:#0c0;">[Desktop Entry]
 
  Name=Ginkgo
 
  Comment=Ginkgo is a graphical front-end for Nepomuk
 
  Exec=%{_bindir}/%{name}
 
  Icon=nepomuk
 
  Type=Application
 
  Categories=Utility;KDE;Qt;</span>
 
  EOF
 
  
== Localiser les fichiers .desktop ==
+
== Fichiers desktop ==
The values of Name or GenericName are displayed as captions to the graphical desktop icon, so they should be localized according to the [http://standards.freedesktop.org/desktop-entry-spec/latest/ar01s04.html Desktop Entry Specification].  Most of the time, only ''language'' codes or ''language/country'' codes are needed to select the intended system locale.  For example:
 
  
<pre>
+
Si un paquet contient une application avec interface graphique, alors il est nécessaire aussi d’installer proprement un fichier .desktop. Une application avec interface graphique défini toutes application qui dessine une fenêtre X et s’execute depuis cette fenêtre. Le fichier .desktop installé DOIT suivre les [http://standards.freedesktop.org/desktop-entry-spec/desktop-entry-spec-latest.html spécifications d’entrer desktop (en)], avec une attention particulière de bien valider correctement les entrées Name, GenericName, [http://standards.freedesktop.org/menu-spec/latest/apa.html Categories] et [http://www.freedesktop.org/Standards/startup-notification-spec StartupNotify].
[Desktop Entry]
+
Veuillez toujours faire valider le fichier .desktop avec le logiciel {{code-fr|desktop-file-validate}} du paquet desktop-file-utils.
 +
 
 +
=== La clé Icon des fichiers Desktop ===
 +
 
 +
''La clef Icon peut être uniquement spécifié d’une manière :
 +
'' * Nom court sans chemin ni extension au nom :
 +
''{{code-fr|Icon{{=}}comical}}
 +
 
 +
''Le nom court sans extension permet pour d’utiliser des thèmes (Par défaut on suppose que l’extension est .png, puis on essaie avec .svg et enfin .xpm)''
 +
 
 +
=== Création du fichier .desktop ===
 +
 
 +
Si le paquet n’en contient pas déjà un ni installe son propre fichier .desktop, il est nécessaire d’en créer un. Vous pouvez générer un fichier .desktop comme une source : (comme Source3: %{name}.desktop) ou en le générant dans le fichier spec à « here document ». Voyez ci-dessous en exemple la création par « here document », la partie verte est le contenu du fichier .desktop.
 +
 
 +
{{pre-fr|<nowiki>mkdir -p %{buildroot}%{_datadir}/applications
 +
cat > %{buildroot}%{_datadir}/applications/%{name}.desktop << EOF
 +
<span style="color:#0c0;">[Desktop Entry]
 +
Name=Ginkgo
 +
Comment=Ginkgo is a graphical front-end for Nepomuk
 +
Exec=%{_bindir}/%{name}
 +
Icon=nepomuk
 +
Type=Application
 +
Categories=Utility;KDE;Qt;</span>
 +
EOF</nowiki>}}
 +
 
 +
=== Régionnaliser les fichiers .desktop ===
 +
 
 +
Les valeurs de Name et de GenericName sont affichés comme légende à l’icône du bureau, ainsi elles doivent s’accorder avec la régionnalisation conformément aux [http://standards.freedesktop.org/desktop-entry-spec/latest/ar01s04.html spécifications des entrées Desktop]. La plupart du temps, seulement le code du ''langage'' (fr, de, etc) ou l’ensemble codes ''langage/pays'' sont nécessaires pour sélectionner la régionnalisation du système. Par exemple :
 +
 
 +
{{pre-fr|<nowiki>[Desktop Entry]
 
Type=Application
 
Type=Application
 
Name=Clocks
 
Name=Clocks
Line 364: Line 384:
 
Name[fr]=Horloges
 
Name[fr]=Horloges
 
Name[pt_BR]=Relógios
 
Name[pt_BR]=Relógios
Name[zh_CN]=时钟
+
Name[zh_CN]=时钟</nowiki>}}
</pre>
 
  
In the above .desktop file, <tt>[de]</tt> specifies the German language locale, covering any German-speaking locale, such as <tt>de_DE</tt> or <tt>de_AT</tt>.
+
Dans le fichier .desktop ci-dessus, <tt>[de]</tt> spécifier la langue allemande, recouvrant tous les pays dont la langue est l’allemand, aussi bien <tt>de_DE</tt> l’Allemagne que <tt>de_AT</tt> l’Autriche.
  
'''Note:''' Since a ''language/country'' code (e.g. <tt>pt_BR</tt>) is more specific than a ''language'' code (e.g. <tt>pt</tt>), a string for the <tt>pt_BR</tt> locale will '''not''' be used for the Portuguese language locale (<tt>pt</tt>). If a string is appropriate for every Portuguese locale, you can use "<tt>Name[pt]</tt>" instead.
+
'''Note :''' comme l’ensemble ''langage/pays'' (ex : <tt>pt_BR</tt> est plus spécifique que le code ''langage'' (ex : <tt>pt</tt>), une chaine de caractère pour les lieux <tt>pt_BR</tt> '''ne''' sera '''pas''' utilisé pour les lieux de la langue portugaise (<tt>pt</tt>). Si une chaine est appropriée pour tous les lieux dont la langue est le portugais, utilisez "<tt>Name[pt]</tt>" à la place.
  
== Utilisation de desktop-file-install ==
+
=== Utilisation de desktop-file-install ===
<code>desktop-file-install</code> SHOULD be used if there are changes desired to an upstream provided .desktop file (such as add/removing categories, etc).  Note: The limited available editing options can be queried via <code>desktop-file-install --help-edit</code> or <code>desktop-file-install --help-all</code>
 
  
Here are some usage examples:
+
{{code-fr|desktop-file-install}} DOIT être utilisé s’il y a des changements désirés sur un fichier .desktop délivré par l’amont (comme l’ajout ou la suppression d’une catégorie, etc). Note : Les options d’édition limitées disponibles peuvent être demandées via {{code-fr|desktop-file-install --help-edit}} ou {{code-fr|desktop-file-install --help-all}}
  
 +
Voici quelques usages :
  
  desktop-file-install --vendor="%{_real_vendor}" \
+
{{pre-fr|<nowiki>desktop-file-install --vendor="%{_real_vendor}" \
  --remove-category="Application" \
+
--remove-category="Application" \
  --add-category="Settings;HardwareSettings;" \
+
--add-category="Settings;HardwareSettings;" \
  --dir %{buildroot}%{_datadir}/applications %{buildroot}%{_datadir}/applications/%{name}.desktop
+
--dir %{buildroot}%{_datadir}/applications %{buildroot}%{_datadir}/applications/%{name}.desktop</nowiki>}}
  
 +
{{pre-fr|<nowiki>desktop-file-install --vendor="%{_real_vendor}" \
 +
--dir=%{buildroot}%{_datadir}/applications \
 +
--remove-category='Application' \
 +
--remove-category='Utility' \
 +
--add-category='System' \
 +
--add-category='Settings' \
 +
--add-category='Printing' \
 +
--add-category='Qt' \
 +
--add-category='HardwareSettings' \
 +
--add-category='X-Mageia-CrossDesktop' \
 +
--remove-key='Version' \
 +
%{buildroot}%{_datadir}/applications/hplip.desktop</nowiki>}}
  
  desktop-file-install --vendor="%{_real_vendor}" \
+
L’installation du fichier .desktop sur le system cible ne doit plus être géré manuellement comme précédemment dans %post/%postun, maintenant, c’est automatiquement géré avec [[RPM filetriggers|RPM filetriggers (en)]]. Veuillez juste vérifier que tous les fichiers .desktop que vous souhaitez installer sont correctes et valides comme souligné au par avant.
  --dir=%{buildroot}%{_datadir}/applications \
 
  --remove-category='Application' \
 
  --remove-category='Utility' \
 
  --add-category='System' \
 
  --add-category='Settings' \
 
  --add-category='Printing' \
 
  --add-category='Qt' \
 
  --add-category='HardwareSettings' \
 
  --add-category='X-Mageia-CrossDesktop' \
 
  --remove-key='Version' \
 
  %{buildroot}%{_datadir}/applications/hplip.desktop
 
  
The installation of the desktop file on the target system does not have to be handled manually any more as had to be done previously in %post/%postun, this is automagically handled now via [[RPM filetriggers|RPM filetriggers (en)]]. Just make sure that all desktop files you want to install are correct and validated as pointed out above.
+
=== Catégorie spécial MandrivaLinux ===
  
== Catégorie spécial MandrivaLinux ==
+
Dans plusieurs paquets importés de Mandriva, les fichiers .desktop ont des entrées de catégories "X-MandrivaLinux" obsolètes. Elles avaient leur utilisé lors de la transition du système de menu Debian vers le système de menu Freedesktop XDG, donc obsolètes et sont à remplacer par la catégorie standard de Freedesktop. Vous les trouverez dans la [http://standards.freedesktop.org/menu-spec/latest/apa.html spécification de Freedesktop].
  
In many older .desktop files in packages imported from Mandriva there are deprecated X-MandrivaLinux category entries. They were used when switching from Debian Menu System to Freedesktop XDG menu system, and are deprecated and should be replaced by standard Freedesktop categories. Those can be seen in
+
La seule catégorie de Mandriva qui a son équivalent encore sur Mageia est '''X-MandrivaLinux-CrossDesktop'''. Cette catégorie est prévue pour les applications de type « kit d’outils » (comme GTK, QT, KDE) dans leur fichier desktop (et seront donc affichés dans « plus » de sous-menu dans d’autre environnement) quand on ne veut pas qu’ils aillent dans ''CrossDesktop''. Pour une référence, veuillez-vous référer au rapport de bogue : [https://bugs.mageia.org/show_bug.cgi?id=2449 Bug 2449 - X-MandrivaLinux-* should be dropped].
[http://standards.freedesktop.org/menu-spec/latest/apa.html Freedesktop specification]
 
  
The only Mandriva one that has an equivalent in Mageia is '''X-MandrivaLinux-CrossDesktop'''. This is for applications which have toolkit-related categories (like GTK, QT, KDE) in their desktop files (and would thus be shown in ''More'' submenu in other desktop environment) when we want them to ''not'' go to the ''More'' submenu on any desktop. These entries should be replaced by '''X-Mageia-CrossDesktop'''. For reference have a look at this bugreport: [https://bugs.mageia.org/show_bug.cgi?id=2449 Bug 2449 - X-MandrivaLinux-* should be dropped]
+
Voici un exemple comment ça doit être fait. Le fichier totem.desktop du lecteur multimédia Totem contient :
  
Here's one example on how it should be done. totem.desktop file from Totem media player contains:
+
{{pre-fr|Categories{{=}}GTK;GNOME;AudioVideo;Player;Video;X-MandrivaLinux-CrossDesktop;X-MandrivaLinux-Multimedia-Video;}}
  Categories=GTK;GNOME;AudioVideo;Player;Video;X-MandrivaLinux-CrossDesktop;X-MandrivaLinux-Multimedia-Video;
 
  
So X-MandrivaLinux-CrossDesktop should be replaced by X-Mageia-CrossDesktop (or one could remove the GTK and GNOME categories from the desktop file, but this will also remove information which could be useful to some desktop environments)
+
Ainsi X-MandrivaLinux-CrossDesktop doit être remplacé par X-Mageia-CrossDesktop (ou on peut supprimer les catégories GTK et GNOME du fichier desktop, mais ceci supprimerait aussi des informations potentiellement intéressantes pour quelques environnements graphiques).
  
Also X-MandrivaLinux-Multimedia-Video is such a deprecated category and should definitely not be used anymore, instead replaced by the main Freedesktop category '''AudioVideo''' and supplemented by at least one additional category from http://standards.freedesktop.org/menu-spec/latest/apa.html.
+
Aussi, X-MandrivaLinux-Multimedia-Video est une catégorie obsolète et définitivement ne doit plus être utilisée, à la place la catégorie est remplacée par la catégorie principale de Freedesktop '''AudioVideo''' et complété au moins par une catégorie additionnelle de http://standards.freedesktop.org/menu-spec/latest/apa.html. Comme c’est déjà le cas (AudioVideo;Player;Video; voir ci-dessus) cette catégorie X-MandrivaLinux doit simplement être enlevée.
As this is already the case (AudioVideo;Player;Video; see above) this X-MandrivaLinux category should simply be removed.
 
  
= Macros vs variables =
+
== Macros vs variables ==
'''%{buildroot} and %{optflags} vs $RPM_BUILD_ROOT and $RPM_OPT_FLAGS'''
 
There are generally two styles of defining the rpm BuildRoot and Optimization Flags in a spec file:
 
  
{| border="1" cellspacing="0" cellpadding="5%"
+
'''%{buildroot} et %{optflags} vs $RPM_BUILD_ROOT et $RPM_OPT_FLAGS'''
|-
+
De manière générale il y a deux style pour définir le BuildRoot du RPM et les drapeaux d’optimisation dans le fichier spec :
| ||macro style ||  variable style
+
 
 +
{| {{UsualTable}}
 +
| || style macro ||  variable style
 
|-
 
|-
 
|Build Root||%{buildroot}||$RPM_BUILD_ROOT
 
|Build Root||%{buildroot}||$RPM_BUILD_ROOT
Line 426: Line 443:
 
|}
 
|}
  
According to [[RPM_Specfile_policy#Variables|our SPEC syntax policy (en)]]
+
Conformément à [[RPM_Specfile_policy#Variables|nos consignes de syntaxe des SPEC (en)]] les variables qui sont réellement des définitions tel que $RPM_OPT_FLAGS ou $RPM_BUILD_ROOT ne doivent pas être utilisées. Les macros comme %{optflags} et %{buildroot} doivent les remplacer. Gardez les variables "$*" pour les constructions du shell et non pas pour les définitions de base d’un RPM.
variables which are really definitions, such as $RPM_OPT_FLAGS or $RPM_BUILD_ROOT must not be used. Macros like %{optflags} and %{buildroot} must be used instead. Keep "$*" variables strictly limited to shell constructs and not RPM-based definitions.
 
  
= Tenue des fichiers d'internationalisation =
+
== Tenue des fichiers d’internationalisation ==
Locale files, also known as localisations or (as an abbreviation) l10n files or i18n files (short form of internationalisation, the number shows how many letters have been left out) are compiled .mo files.
 
'''This section is not about man pages.'''
 
  
<!-- If a given package includes translations, add
+
Les fichiers régionaux (autrement dénommé Localizations (en francais, régionnalisation), son abréviation est l10n, ou Internationalisation (i18n), le numéro dans les abréviations correspond au nombre de lettres omises), sont compilés dans des fichiers .mo.
<pre>
+
'''Cette section n’est pas à propos des pages Man.'''
BuildRequires: gettext
 
</pre>
 
If you don't, your package could fail to generate translation files in the buildroot.-->
 
  
(If a package includes translations, it is no longer needed to add the gettext BuildRequire, because gettext is already present in the build environment.)<br/>
+
<!-- Si un paquet donné inclut des traductions, ajoutez :
  
Mageia includes an rpm macro called <code>%find_lang</code>. This macro will locate all of the locale files that belong to your package (by name), and put this list in a file. You can then use that file to include all of the locales. <code>%find_lang</code> should be run in the %install section of your spec file, after all of the files have been installed into the buildroot. The correct syntax for <code>%find_lang</code> is usually:
+
{{pre-fr|BuildRequires: gettext}}
<pre>
+
 
%find_lang %{name}
+
Si vous ne l’ajoutez pas, dans buildroot votre paquet pourrait ne pas réussir à générer les fichiers de traduction.-->
</pre>
+
 
In some cases, the application may use a different "name" for its locales. You may have to look at the locale files and see what they are named. If they are named <code>myapp.mo</code>, then you will need to pass <code>myapp</code> to <code>%find_lang</code> instead of <code>%{name</code>}.
+
(Si un paquet inclut des traductions, il n’est plus nécessaire d’ajouter gettext comme dépendance de construction (BuildRequire), car gettext est déjà présent dans l’environnement de construction.)<br/>
After <code>%find_lang</code> is run, it will generate a file in the active directory (by default, the top level of the source dir). This file will be named based on what you passed as the option to the <code>%find_lang</code> macro. Usually, it will be named <code>%{name}.lang</code>. You should then use this file in the <code>%files</code> list to include the locales detected by <code>%find_lang</code>. To do this, you should include it with the -f parameter to <code>%files</code>.
+
 
<pre>
+
Mageia inclut une macro rpm nommée {{code-fr|%find_lang}}. Cette macro trouvera tous les fichiers régionaux qui appartiennent au paquet (par nom), et placera cette liste dans un fichier. Vous pouvez alors utiliser ce fichier pour inclure les fichiers régionaux. {{code-fr|%find_lang}} doit être exécuté dans la section %install de votre fichier spec, après que tous les fichiers ont été installés dans le buildroot. La syntaxe correcte pour {{code-fr|%find_lang}} est habituellement :
%files -f %{name}.lang
+
 
 +
{{pre-fr|<nowiki>%find_lang %{name}</nowiki>}}
 +
 
 +
Dans certains cas, l’application utilisera des « name » différents pour des régions. Vous devriez jeter un coup d’œil aux fichiers régionaux pour connaitre leur dénomination. S’ils sont nommés {{code-fr|myapp.mo}}, alors vous devez donner {{code-fr|myapp}} à {{code-fr|%find_lang}} à la place de {{code-fr|%{name}}}.
 +
Après l’exécution de {{code-fr|%find_lang}}, un fichier sera généré dans le répertoire courant (par défaut la racine des sources). Ce fichier prendra un nom basé sur les options que vous aurez données à la macro {{code-fr|%find_lang}}. Habituellement, il sera nommé {{code-fr|%{name}.lang}}. Vous devriez alors utiliser ce fichier dans la liste {{code-fr|%files}} pour ajouter les fichiers régionaux détectés par {{code-fr|%find_lang}}. Pour ce faire, vous devriez l’inclure avec le paramètre -f à {{code-fr|%files}}.
 +
 
 +
{{pre-fr|<nowiki>%files -f %{name}.lang
 
%{_bindir}/foobar
 
%{_bindir}/foobar
...
+
</nowiki>}}
</pre>
 
If you are already using the -f parameter for the <code>%files</code> section where the locales should live, just append the contents of <code>%{name}.lang</code> to the end of the file that you are already using with -f. (Note that only one file may be used with <code>%files -f</code>.)
 
  
'''Why do we need to use %find_lang?'''
+
Si le paramètre -f est déjà utilisé pour la section {{code-fr|%files}} où vous devriez ajouter les fichiers régionaux, ajoutez simplement le contenu de {{code-fr|%{name}.lang}} après le fichier utilisant déjà le paramètre -f. (Notez qu’uniquement un fichier peut être utilisé avec {{code-fr|%files -f}}.)
  
Using <code>%find_lang</code> helps keep the spec file simple, and helps avoid several other packaging mistakes.
+
'''Pourquoi avons-nous besoin d’utiliser %find_lang?'''
  
* Packages that use <code>%{_datadir}/*</code> to grab all the locale files in one line also grab ownership of the locale directories, which is not permitted.
+
L’utilisation de {{code-fr|%find_lang}} aide à garder un fichier de spécification simple et aide à éviter quelques erreurs d’empaquetage.
* Most packages that have locales have lots of locales. Using <code>%find_lang</code> is much easier in the spec file than having to do:
+
 
<pre>
+
* Les paquets qui utilisent {{code-fr|%{_datadir}/*}} pour extraire tous les fichiers régionaux en une ligne extrait aussi le propriétaire des répertoires locaux, ce qui n’est pas permis.
%{_datadir}/locale/ar/LC_MESSAGES/%{name}.mo
+
* La plupart des paquets qui ont des fichiers régionaux en ont beaucoup. Utiliser {{code-fr|%find_lang}} est bien plus conviviale (utilisation, clarté…) dans le fichier de spécification que d’avoir à écrire :
 +
 
 +
{{pre-fr|<nowiki>%{_datadir}/locale/ar/LC_MESSAGES/%{name}.mo
 
%{_datadir}/locale/be/LC_MESSAGES/%{name}.mo
 
%{_datadir}/locale/be/LC_MESSAGES/%{name}.mo
 
%{_datadir}/locale/cs/LC_MESSAGES/%{name}.mo
 
%{_datadir}/locale/cs/LC_MESSAGES/%{name}.mo
 
%{_datadir}/locale/de/LC_MESSAGES/%{name}.mo
 
%{_datadir}/locale/de/LC_MESSAGES/%{name}.mo
 
%{_datadir}/locale/es/LC_MESSAGES/%{name}.mo
 
%{_datadir}/locale/es/LC_MESSAGES/%{name}.mo
...
+
</nowiki>}}
</pre>
+
 
* As new locale files appear in later package revisions, <code>%find_lang</code> will automatically include them when it is run, preventing you from having to update the spec any more than is necessary.
+
* Comme de nouveaux fichiers régionaux peuvent apparaitrent dans de futures versions, {{code-fr|%find_lang}} les inclura automatiquement à son exécution et vous évitera de mettre à jour le fichier de spécification plus que nécessaire.
 +
 
 +
Gardez à l’esprit que l’usage de {{code-fr|%find_lang}} dans un paquet contenant des fichiers régionaux est un IMPÉRATIF.
 +
 
 +
== Scriptlets ==
  
Keep in mind that usage of <code>%find_lang</code> in packages containing locales is a MUST.
+
Une grande attention doit être porté lors de l’utilisation de scriptlet dans les paquets de Mageia. Si des scriptlets sont utilisés, ceux-ci doivent être sains.
  
= Scriptlets =
+
'''Prérequis des Scriptlets'''
Great care should be taken when using scriptlets in Mageia packages. If scriptlets are used, those scriptlets must be sane.
+
N’utilisez pas le style de notation {{code-fr|Requires(pre,post)}} pour les dépendances aux scriptlets en raison de deux bugs dans RPM. À la place, vous devriez les séparer comme ceci :
  
 +
{{pre-fr|<nowiki>Requires (pre): …
 +
Requires (post): …</nowiki>}}
  
'''Scriptlets requirements'''
+
Pour plus d’information, veuillez voir [http://www.redhat.com/archives/fedora-devel-list/2004-April/msg00674.html www.redhat.com] .
Do not use the <code>Requires(pre,post)</code> style notation for scriptlet dependencies, because of two bugs in RPM. Instead, they should be split like this:
 
<pre>
 
Requires(pre): ...
 
Requires(post): ...
 
</pre>
 
For more information, see [http://www.redhat.com/archives/fedora-devel-list/2004-April/msg00674.html www.redhat.com] .
 
  
'''Running scriptlets only in certain situations'''
+
'''Exécution de scriptlets uniquement dans certaines situations'''
When the rpm command executes the scriptlets in a package it indicates if the action preformed is an install, erase, upgrade or reinstall by passing an integer argument to the script in question according to the following:
+
Lorsque la commande rpm exécute un scriptlet d’un paquet, l’action associée (quelle soit une installation, un effaçage, une mise à jour ou une réinstallation) est donnée par un entier en paramètre du script en question, en suivant les codes suivant :
  
{| border="1" cellspacing="0" cellpadding="5%" style="text-align: center"
+
{| {{UsualTable}}
||macro || install || erase || upgrade || reinstall
+
||macro   || install || erase || upgrade || reinstall
 
|-
 
|-
||%pre || 1 || - || 2 || 2
+
||%pre   || 1       || -     || 2       || 2
 
|-
 
|-
||%post || 1 || - || 2 || 2
+
||%post   || 1       || -     || 2       || 2
 
|-
 
|-
||%preun || - || 0 || 1 || -
+
||%preun || -       || 0     || 1       || -
 
|-
 
|-
||%postun || - || 0 || 1 || -
+
||%postun || -       || 0     || 1       || -
 
|}
 
|}
  
This means that for example a package that installs an init script with the <code>chkconfig</code> command should uninstall it only on erase and not upgrade with the following snippet:
+
Ceci signifie par exemple qu’un paquet qui installe un script d’initialisation avec la commande {{code-fr|chkconfig}} doit le désinstaller uniquement avec « erase » et non avec une mise à jour avec le snippet suivant :
<pre>
+
This means that for example a package that installs an init script with the {{code-fr|chkconfig}} command should uninstall it only on erase and not upgrade with the following snippet:
%preun
+
 
 +
{{pre-fr|<nowiki>%preun
 
if [ $1 -eq 0 ] ; then
 
if [ $1 -eq 0 ] ; then
 
/sbin/chkconfig --del %{name}
 
/sbin/chkconfig --del %{name}
fi
+
fi</nowiki>}}
</pre>
+
 
See also <code>/usr/share/doc/rpm-*/triggers</code>, which gives a more formal, generalized definition about the integer value(s) passed to various scripts.
+
Veuillez aussi voir {{code-fr|/usr/share/doc/rpm-*/triggers}}, qui donne une définition plus formelle et générale à propos des valeurs entières passé aux scripts.
  
'''Scriplets are only allowed to write in certain directories'''
+
'''Les scriplets sont autorisés d’écrire uniquement dans certains dossiers'''
Build scripts of packages (%prep, %build, %install, %check and %clean) may only alter files (create, modify, delete) under %{buildroot}, %{_builddir} and valid temporary locations like /tmp, /var/tmp (or $TMPDIR or %{_tmppath} as set by the rpmbuild process) according to the following matrix
+
Les scripts de construction des paquets (%prep, %build, %install, %check et %clean) peuvent gérer seulement les fichiers (créer, modifier, supprimer) sous %{buildroot}, %{_builddir} et les répertoires temporaires valides comme /tmp, /var/tmp (ou $TMPDIR, %{_tmppath} comme définit par le processus rpmbuild), conformément au tableau suivant :
  
{| border="1" cellspacing="0" cellpadding="5%" style="text-align: center"
+
{| {{UsualTable}}
|-
 
 
|        || /tmp, /var/tmp, $TMPDIR, %{_tmppath} || %{_builddir} || %{buildroot}
 
|        || /tmp, /var/tmp, $TMPDIR, %{_tmppath} || %{_builddir} || %{buildroot}
 
|-
 
|-
|%prep    || yes                                  || yes          || no
+
|%prep    || {{yes-fr}}                                 || {{yes-fr}}         || {{no-fr}}
 
|-
 
|-
|%build  || yes                                  || yes          || no
+
|%build  || {{yes-fr}}                                 || {{yes-fr}}         || {{no-fr}}
 
|-
 
|-
|%install || yes                                  || yes          || yes
+
|%install || {{yes-fr}}                                 || {{yes-fr}}         || {{yes-fr}}
 
|-
 
|-
|%check  || yes                                  || yes          || no
+
|%check  || {{yes-fr}}                                 || {{yes-fr}}         || {{no-fr}}
 
|-
 
|-
|%clean  || yes                                  || yes          || yes
+
|%clean  || {{yes-fr}}                                 || {{yes-fr}}         || {{yes-fr}}
 
|}
 
|}
  
Further clarification: That should hold true irrespective of the builder's uid.
+
Clarification complémentaire : Ceci reste vrai quel que soit l’UID du constructeur.
 
 
= L'usage de l'étiquette Epochs =
 
The Epoch tag in RPM is to be used only as a last resort, and should be avoided whenever possible. However, it is sometimes necessary to use an Epoch to handle upstream versioning changes or to ease transition from third party repositories.  
 
  
 +
== L’usage de la balise Epoch ==
  
 +
La balise Epoch dans RPM doit être utilisée qu’en dernier recours, et doit être évitée autant que possible. Quoi qu’il en soit, il est parfois nécessaire d’utiliser Epoch pour gérer un changement de version de l’amont ou de faciliter la transition d’un dépôt tiers.
  
= Créer un paquet à partir de rien =
+
== Créer un paquet à partir de zéro ==
  
If you want to create a package from scratch, here is a skeleton SPEC where you just need to replace '''foo''' with the proper values according to these guidelines
+
Si vous voulez créer un paquet de zéro, voici le squelette d’un fichier SPEC où vous n’avez qu’à remplacer '''foo''' avec vos propres valeurs conformément à ce guide.
  
<pre>Name: foo
+
{{pre-fr|<nowiki>Name: foo
 
Version: 1.0
 
Version: 1.0
 
Release: %mkrel 1
 
Release: %mkrel 1
Line 563: Line 579:
 
%find_lang %name
 
%find_lang %name
  
%files -n %name
+
%files -n %name</nowiki>}}
</pre>
 
  
= Modifier un paquet existant =
+
== Modifier un paquet existant ==
  
If you base a new package on an existing non-Mageia package, make sure you verify the correctness of the package and it's spec file to understand exactly what has been done to package the software. Do not submit a package without knowing what those strange, but innocent looking commands do.
+
Si pour créer un paquet mageia basé sur un paquet existant d’une autre distribution, soyez sûr d’avoir vérifié l’exactitude du paquet et de son fichier spec pour comprendre exactement ce qui a été fait pour construire le paquet. Ne soumettez pas un paquet sans savoir ce que les étranges commandes d’apparences innocentes font.
  
In particular, you should
+
Vous devez particulièrement :
  
* ensure that original tarballs are self-contained pristine tarballs. The tarball should not contain symlinks that reference outside the tarball root directory
+
* Vous assurer que l’archive est autonome. Une archive ne doit pas contenir de lien symbolique qui aurait une référence à l’extérieur de la racine de l’archive
* verify any sources and patches and remove patches or sources that:
+
* vérifier toutes les sources et correctifs, supprimez ceux qui :
** are related to platforms we do not support (example: sparc, ia64, ppc, ...)
+
** sont relié à des plateformes que nous ne supportons pas (ex : sparc, ia64, ppc…)
** Implement features we do not support (example: selinux)
+
** ou implémenter des fonctionnalités que nous ne supportons pas (ex : selinux)
** Read every patch and understand what it does, if it is needed, put an explanation in the header justifying why the patch is needed.
+
** Lire tous les correctifs et comprenez ce qu’ils font. Si ce n’est pas nécessaire, ajouter à l’entête du correctif une explication justifiant pourquoi.
* verify that the license stated in the spec file matches the actual license of the software, for this it is advised to also look/grep in the header files of the source code to verify the license information
+
* Vérifier que la licence précisée dans le fichier spec correspond bien à la licence actuelle du logiciel. Nous conseillons pour ça de faire un grep sur tous les fichiers sources et vérifier les informations des licences.
* skim the summary and description for typos and oddities (see Summary and description ),
+
* parcourez les sommaires et les descriptions pour des fautes de frappes et bizarreries (voir Sommaire et description),
* make sure that the correct build root is used,
+
* assurez-vous que la bonne racine de construction est utilisée,
* ensure that macro usage is consistent and that the macros are available in Mageia (see Macros )
+
* assurez-vous de la consistance de l’usage des macros et de leur existence dans Mageia (voir Macros)
  
Keep old changelog entries to credit the original authors. Entries that are several years old or refer to ancient versions of the software may be erased. If you end up doing radical changes and re-write most of the spec file anyway, feel free to start the changelog from scratch. In other words, use your best judgement.
+
Gardez les vieilles entrées dans les registres de changement pour créditer l’auteur originel. Les entrées âgées de plusieurs années ou référençant une ancienne version du logiciel peuvent être effacées. Si au final vous avez radicalement changé ou réécrit la majorité du fichier spec, jugée par vous-même si vous démarrer de zéro un nouveau journal de modifications (changelog).
  
= Registre des changements =
+
== Journal des modifications (Changelogs) ==
  
This section describes the Mageia policy for RPM changelogs. (Original changelogs included in the original source are not affected by this policy.)  
+
Cette section décrit les consignes chez Mageia concernant le journal de modifications des RPM nommé « changelogs ». (Le journal de modifications original des sources du logiciel en amont ne sont pas affectés par ces consignes.)
  
Please consider that a "normal end user with some technical skills" should be able to read and understand an RPM changelog. Changelog entries have to be in reverse chronological order: newer change log entries are listed above older entries, with the first entry being the most recent.
+
Lorsque vous [[Importing_packages|importez un paquet]], pensez à importer le changelog !
  
Please bear in mind that Mageia changelogs will be automatically parsed to prepare distribution release notes and to report on bugs and CVEs and malformed entries may not be read correctly.
+
Veuillez considérer que « l’utilisateur final avec quelques compétences techniques » devrait être capable de comprendre un registre de changement RPM. Les entrées du registre doivent-être d’ordre anti-chronologique : les nouvelles entrées du journal de modifications sont inscrites au-dessus des anciennes entrées de la liste, la première entrée est la plus récente.
  
== Informations générales ==
+
Gardez à l’esprit que le journal de modifications de Mageia est automatiquement analysé pour préparer la note de version de la distribution, pour les rapports de bogues et pour les CVEs ainsi une entrée malformée ne sera pas lue correctement.
  
* Changelogs are stored in the SVN commit logs, but should still be considered as part of the final spec when committing to svn (see below)
+
=== Informations générales ===
* The %changelog section must not be used in the .spec file as the svn commit logs produce the RPM changelog upon build
 
* one supplies a commit message when commiting changes, either via '''svn ci''' or '''mgarepo ci''' via the option '''-m '- this is my commit message''''
 
* provide meaningful and detailed commit messages and make them verbose enough that those coming later do not need to look at a diff of changes to see what actually happened.
 
  
*<span style="color:#c00;font-weight:bold;">A bad example would be:</span>
+
* Les registres de changements sont stockés dans les registres des commits sur SVN, mais ils doivent tout de même être considérés comme une part de la spec final quand ils sont soumis sur SVN (voir en dessous)
  - fixed foo
+
* La section %changelog ne doit pas être utilisé dans le fichier .spec puisse que les registres des commits svn produisent le journal de modifications du RPM pour la construction
This tells no one anything and after a year, whomever made the commit likely has no idea what they did in that commit.
+
* On écrit un message lors de la soumission lorsqu’il y a des changements, soit par '''svn ci''' ou '''mgarepo ci''' avec l’option '''-m '- ici le message de soumission''''
*<span style="color:#0c0;font-weight:bold;">A good example would be:</span>
+
* Fournissez un message de soumission significatif et détaillé et rendez-le suffisamment explicite afin que les personnes qui viendront plus tard n'aient pas besoin de regarder une liste de changements pour comprendre ce qui s'est réellement passé.
  
  - rediffed description.patch to fix foo
+
* <span style="color:#c00;font-weight:bold;">Voici un mauvais exemple :</span>
  - added foo-manpages.tar.bz2 to provide such and such for foo
 
  - dropped cvsfix32.patch; merged upstream
 
  
The above is far more telling as to what was actually done. Note that source files must be referred to by their full name (in the above, foo-manpages.tar.bz2, not "S23" or "source23" or something similar). Patches do not need to be referred to by their full names, but can be referred to by the "description" portion of the patch. For instance, the first comment is "rediffed description.patch to fix foo", where description.patch is noted. The patch could in reality be named foo-1.2-mga-description.patch; the prefix (foo-1.2-mga) can be dropped as it should be fairly straightforward to determine what patch has modified/added/removed based on the unique description of the patch. If the patch name is not unique (i.e. there is foo-1.2-mga-description.patch and foo-1.0-cvs-description.patch), then one of the patch names can (and probably should) be changed or the entire patch name should be noted in the changelog.
+
{{pre-fr|- fixed foo}}
Do not refer to source files or patch numbers numerically (i.e. using S23 or P12) as patches and source files may be renumbered from time to time and a patch number is not guaranteed to remain consistent.
 
  
* when adding multi-line commit messages, every seperate entry must begin with the '-' character. Like
+
Ceci ne dit rien à personne et après un an, quelle que soit la personne qui ait fait ce genre de soumission n’a plus aucune idée des changements sur cette soumission.
  - Bumped release
 
  - Added foo.patch
 
  
This is optional for single line messages, as in that case it's automatically added if not present
+
* <span style="color:#0c0;font-weight:bold;">Voici un bon exemple :</span>
To create a multi-line message simply leave the current line unterminated (no final quote mark) and hit ENTER and continue writing. Finally terminate the last line with a quote mark. Or write the commit messages into a file and use the -F option for svn ci / mgarepo ci.
 
  
== Références externes ==
+
{{pre-fr|<nowiki>- rediffed description.patch to fix foo
 +
- added foo-manpages.tar.bz2 to provide such and such for foo
 +
- dropped cvsfix32.patch; merged upstream</nowiki>}}
  
Each external reference (bug numbers etc) should be of the form:
+
Ce dernier exemple est bien plus parlant sur ce qui s’est réellement passé. Notez que les fichiers sources doivent être référés par leur nom entier (sur l’exemple précédent foo-manages.tar.gz, mais pas « S2"3 ou « Source23 » ou autre). Il n’est pas nécessaire de référer les correctifs par leur nom complet, mais peuvent être référé par la portion de leur « description ». Par exemple, le premier commentaire est « rediffed description.patch to fix foo" et description.patch est noté. Les correctifs peuvent en réalité être nommés foo-1.2-mga-description.patch ; le préfix (foo-1.2-mga) peut être omis puisse qu’il est simple de le retrouver par sa simple description quel correctif a changé/ajouté ou supprimer quelque chose. Si le nom du correctif n’est pas unique (ex : il y a foo-1.2-mga-description.patch et foo-1.0-cvs-description.patch), alors l’un des deux noms de correctifs peut (et probablement doit) être changé ou le nom tout entier du correctif doit être noté dans le journal de modifications.
"(" + external reference code + bug number +")"
+
Ne référez par les fichiers sources ou les correctifs par leur numéro (ex S23 ou P12) puisse que les correctifs et les fichiers sources peuvent être renumérotés parfois ainsi il n’est pas exclu que ça ne reste pas consistant.
  
Currently defined:
+
* Quand vous ajoutez un message de soumission sur plusieurs lignes, chaque entrée différente doivent commencer avec le caractère 'moins' comme :
* Mageia Bugs : mga#
 
* Common Vulnerability / Exposure : CVE
 
  
'''Bug Numbers in the change log'''
+
{{pre-fr|<nowiki>- Bumped release
 +
- Added foo.patch</nowiki>}}
  
During maintenance of a distribution, every change has to be marked with the correct bug number. Normally this has to be a number from https://bugs.mageia.org/. Add an entry with the bugzilla number and a short description of the bug summary. For example:
+
Ceci est optionnel pour les messages sur une seule ligne puisque dans ce cas, il est ajouté s’il n’est pas présent.
- Removed invalid desktop Category "Application" (mga#4654).
+
Pour créer un message sur plusieurs lignes, laissez simplement la première ligne dans un état indéterminé (sans signe de citation final), appuyez sur [entrer], et continuez à écrire sur la ligne en dessous. Finissez la dernière ligne avec le signe de fin de citation. Ou encore écrivez un message de soumission dans un fichier et incorporez lors de la ligne de commande avec l’option -F pour svn ci / mgarepo ci.
- Symlink icon to pixmaps dir (mga#2108)
 
- Added gnome-ui-properties to control-center (mga#1960).
 
  
New packages related to new features will refer also to the corresponding bug number in bugzilla, For example:
+
=== Références externes ===
- Adding Qt Contacts support (mga#8011)
 
  
'''CVE numbers in change log'''
+
Toutes références externes (numéro de bogue etc) doivent être de cette forme :
  
As with bug numbers: Add a short description (normally the CVE summary should be enough), the Bugzilla and the CVE number to the changelog entry, and also the name and origin of the patch fixing that CVE. Example:
+
{{pre-fr|<nowiki>"(" + code de référence externe + numéro de bogue +")"</nowiki>}}
- fix CVE-2012-1234, denial of service through user stupidity (fix-cve-2012-1234.patch, from upstream).
 
  
== Modifications du fichier de spécification ==
+
Actuellement défini :
Be as precise as possible! This is especially important if you remove something from the spec file.
+
* Mageia Bugs : mga#
 +
* Common Vulnerability / Exposure : CVE
  
* Removing original source code must be declared in spec file with a comment ("useful for FreeBSD only" for example) - not necessary to repeat the comment in specfile.
+
'''Les numéros de bogue dans les registres de changements'''
* Extra commands (for example during %install) can be illustrated with a short comment in spec file
 
* Adding/Removing packages from Requires/Provides must be described in the changelog
 
* one thing which should not be done without communicating with the maintainer beforehand, is reindentation of some parts of the SPEC file. Albeit only small changes in the spec itself (like exchanging a space by one/two tabs between the Tags in the preamble and the values) the diff which is produced by this will be huge.
 
  
== Modification du code source ==
+
Durant la maintenance de la distribution, chaque changement doit être marché avec le numéro de bogue correspondant. Normalement ceci doit être un numéro de https://bugs.mageia.org/. Ajoutez une entrée avec le numéro de bogue de bugzilla et une courte description du résumé du bogue. Par exemple :
 +
{{pre-fr|<nowiki>
 +
- Removed invalid desktop Category « Application » ({{bug-fr|4654}}).
 +
- Symlink icon to pixmaps dir (mga#2108)
 +
- Added gnome-ui-properties to control-center ({{bug-fr|1960}}).</nowiki>}}
  
Document the most important changes but limit verbosity.
+
Les nouveaux paquets reliés à une nouvelle fonctionnalité seront référé aussi avec le numéro de bogue correspondant sur bugzilla, par exemple :
  
* look into the source changelog and pick up the most important changes for the distribution (changes for other operating systems are not important). Include what has changed in the new version, usually in the level of detail of a NEWS file; the change log files are usually too long. More than '''10-15 lines''' shouldn't be necessary to describe the most important changes.
+
{{pre-fr|- Adding Qt Contacts support ({{bug-fr|8011}})}}
* arrange the original changes behind the version update information. Example:
 
  - Update to 1.3.2:
 
    + fixes memory leak in import function
 
    + new API command: unlock_client()
 
    + the following bugs are closed by this new upstream release:
 
    ++ ............ [mga:332]
 
    ++ ............ [mga:337]
 
  - split of devel package
 
* If upstream does not provide a meaningful change log, then only do best effort. Don't waste too much time over it.
 
* If the upstream tarball really has not changed except for the version number, just the version number in the change log would be fine. Same goes for packages just containing some graphics or theming (unless upstream already provides something that fits). If the upstream changes just consist of "updated translation" or "several bug fixes" even that can be sufficient for a changelog entry (unless these bug fixes contain something you find worth mentioning).
 
  
= Empaquetage des librairies statiques =
+
'''Le numéro de CVE dans le registre de changement'''
Packages including libraries should exclude static libs as far as possible (eg by configuring with ''--disable-static''). Static libraries should only be included in exceptional circumstances.  Applications linking against libraries should as far as possible link against shared libraries not static versions.
+
Comme avec le numéro de bogue : ajoutez une courte description (normalement le résumé de CVE doit être suffisant), les numéros de bugzilla et de CVE au journal de modifications et aussi le nom et l’origine du correctif qui répare ce CVE. Par exemple :
  
''.a files and .la files should generally not be included anywhere. They are only useful when one wants to statically link a program against the library (i.e. include the library in the program binary itself, so the library isn't needed at run-time), which is generally not done in Mageia.
+
{{pre-fr|- fix CVE-2012-1234, denial of service through user stupidity (fix-cve-2012-1234.patch, from upstream).}}
Libtool archives, ''foo.la'' files, should not be included. Packages using libtool will install these by default even if you configure with ''--disable-static'', so they may need to be removed before packaging.  Due to bugs in older versions of libtool or bugs in programs  that use it, there are times when it is not always possible to remove *.la files without modifying the program.  In most cases it is fairly easy to work with upstream to fix these issues.  Note that if you are updating a library in a stable release (not devel) and the package already contains *.la files, removing the *.la files should be treated as an API/ABI change -- i.e. removing them changes the interface that the library gives to the rest of the world and should not be undertaken lightly.''
 
  
 +
=== Modifications du fichier de spécifications ===
  
== Empaquetage des librairies statiques ==
+
Soyez aussi précis que possible ! Ceci est d’autant plus important si vous supprimez quelque chose du fichier spec.
* In general, packagers are strongly encouraged not to ship static libs unless a compelling reason exists.
 
  
* We want to be able to track which packages are using static libraries (so we can find which packages need to be rebuilt if a security flaw in a static library is fixed, for instance). There are two scenarios in which static libraries are packaged:
+
* Supprimer du code source originel doit être déclaré dans le fichier spec avec un commentaire ("Useful for FreeBSD only" par exemple) - il n’est pas nécessaire de répéter le commentaire dans le fichier de spécification.
# '''Static libraries and shared libraries.''' In this case, the static libraries must be placed in a ''*-static-devel'' subpackage. Separating the static libraries from the other development files in ''*-devel'' allow us to track this usage by checking which packages <code>BuildRequire</code> the ''*-static-devel'' package. The intent is that whenever possible, packages will move away from using these static libraries, to the shared libraries.
+
* Les commandes supplémentaires (par exemple durant %install) peuvent être illustrées avec un court commentaire dans le fichier de spécification.
# '''Static libraries only.''' When a package only provides static libraries you can place all the static library files in the ''*-devel'' subpackage.
+
* Ajouter/supprimer des paquets de Requires/Provides doit être décrit dans le journal de modifications.
 +
* Une chose qui ne doit pas être faite sans en avertir avec le mainteneur avant de manipuler, est de ré-indenter quelques parties du fichier SPEC. Quoique, seulement les petits changements dans le fichier spec (comme le changement d’une tabulation par deux entre deux balises du préambule et des valeurs) la différence qui est produite par ça sera énorme.
  
* If (and only if) a package has shared libraries which require static libraries to be functional, the static libraries can be included in the ''*-devel'' subpackage.
+
=== Modifications du code source ===
  
== Lier statiquement les exécutables ==
+
Commentez les changements les plus importants, mais limitez la verbosité.
* Static linkage is a special exception and should be decided on a case-by-case basis.  The packager must provide rationale for linking statically, including precedences where available, to release engineering for approval.
 
  
= Rendre un paquet obsolète =
+
* Regardez dans le journal de modifications et sélectionnez les changements les plus importants pour la distribution (les changements pour d’autres systèmes d’exploitations ne sont pas fondamentaux). Incluez ce qui a changé dans la nouvelle version, habituellement, le niveau de détail du fichier NEWS ; les fichiers des registres des changements sont généralement trop longs. Plus de '''10-15 lignes''' ne sont pas nécessaires pour décrire les changements les plus importants.
When a package is no longer needed in the distribution it should be obsoleted and removed from cauldron.
+
* Arrangez les changements originaux derrière l’information de mise à jour de version. Exemple :
  
To obsolete and remove a package from cauldron :
+
{{pre-fr|<nowiki>- Update to 1.3.2:
* on svn, move the package to the directory svn+ssh://svn.mageia.org/svn/packages/obsolete/ (see also [[Packagers_svn#How_to_drop_a_package_from_SVN.3F|How to drop a package from SVN (en)]] )
+
  + fixes memory leak in import function
* if the package is replaced by an other one which provides the same functionality, add it as obsolete in the new package. '''Using versioned obsoletes is recommended (Obsoletes: foo < last cauldron version + 1) - This applies for all subpackages which should be obsoleted!'''
+
  + new API command: unlock_client()
* if the package is not replaced by an other one and is simply dropped, obsolete it by the task-obsolete package. Don't forget to add a comment with the reason for obsoleting, or a link to the discussion on the mailing list explaining the reasons.). '''Using versioned obsoletes is recommended (Obsoletes: foo < last cauldron version + 1) - This applies for all subpackages which should be obsoleted!'''
+
  + the following bugs are closed by this new upstream release:
 +
  ++ ............ [mga:332]
 +
  ++ ............ [mga:337]
 +
- split of devel package</nowiki>}}
  
When a package is obsoleted by another package it will automatically be removed from the cauldron repository.
+
* si l’amont ne produit pas un registre de changements plein de sens, alors faites seulement de votre mieux. Ne perdez pas trop de temps à ça.
 +
* Si l’archive de l’amont n’a vraiment aucun registre de changement excepté un numéro de version différent, ajoutez simplement le numéro de version dans le journal de modifications fera l’affaire. C’est pareil pour les paquets qui ne contiennent juste quelques graphiques ou thèmes (sauf si l’amont fourni déjà quelque chose qui convient). Si les changements de l’amont consistent juste à « mise à jour des traductions » ou « réparation que quelques bogues », rien que ça suffise pour l’entrée du journal de modifications (à moins que ces correctifs contiennent quelque chose que vous trouvez en valoir la peine).
  
''This was imported from [http://wiki.meego.com MeeGo wiki] licensed under CC-By 3.0''<br />
+
== Empaquetage des bibliothèques statiques ==
''As the wiki doesn't exist anymore, have a look at the archived version:  
+
 
 +
Les paquets incluant des bibliothèques devraient exclure celles qui sont statiques dans la mesure du possible (par exemple en configurant avec ''--disable-static''). Les bibliothèques logicielles statiques devraient être incluses uniquement dans des circonstances exceptionnelles. Les logiciels qui sont liés aux bibliothèques statiques devraient autant que possible être liés aux versions partagées des bibliothèques.
 +
 
 +
''Les fichiers .a et .la ne devraient généralement pas être inclus nulle part. Ils sont utiles uniquement lorsque quelqu’un veut lier statiquement un programme à une bibliothèque (par exemple inclure la bibliothèque dans le binaire du programme lui-même, de cette manière la bibliothèque n’est plus nécessaire lors de l’exécution du programme), ce qui n’est généralement pas le cas dans Mageia.
 +
Les archives Libtool, les fichiers ''foo.la'' ne doivent pas être inclus. Les paquets utilisant libtool l’installeront par défaut même si vous spécifiez ''--disable-static'' dans la configuration, alors ils seront à supprimer avant l’empaquetage. À cause de bogues dans les anciennes versions de libtool ou de bogues dans les programmes qui l’utilisent, parfois il n’est pas possible de supprimer les fichiers .la sans modifier le programme. Dans la plupart des cas, il est facile de travailler de concours avec l’amont du logiciel pour régler ces problèmes. Notez que si vous chargez une bibliothèque dans sa version stage (pas en développement) et que le paquet contiennent déjà des fichiers .la, les supprimer doit être considéré comment un changement API/ABI -- c’est-à-dire, les supprimer change l’interface que la bibliothèque donne au reste du monde et ne doit pas être entrepris à la légère.''
 +
 
 +
=== Empaquetage des bibliothèques statiques ===
 +
 
 +
* En général, les empaqueteurs sont fortement découragés à envoyer des bibliothèques statiques à moins qu’une irrésistible raison existe.
 +
 
 +
* Nous voulons être en mesure de traquer quels paquets utilisent des bibliothèquess statiques (comme ça, nous pouvons trouver quels paquets il est nécessaire de reconstruire au cas où un défaut de sécurité dans une bibliothèque statique est réglé par exemple). Il y a deux cas où une bibliothèque statique est empaqueté :
 +
# ''' bibliothèque statique et bibliothèque partagé''' Dans ce cas, la bibliothèque statique doit être placée dans un sous-paquet ''*-statis-devel''. Séparer les bibliothèques statiques des autres ficheirs de développement dans un ''*-devel'' nous permet de traquer cet usage en vérifiant quels paquets dépendent pour leur construction {{code-fr|BuildRequire}} le paquet ''*-static-devel''. L’intention est, lorsqu’il est possible, d’éloigner ces paquets de l’utilisation des bibliothèques statiques vers les bibliothèques partagées.
 +
# '''bibliothèques statiques uniquement.''' Quand un paquet fournit uniquement des bibliothèques statiques, vous pouvez placer tous les fichiers de bibliothèques statiques dans un sous-paquet ''*-devel''.
 +
 
 +
* Si (et seulement si) un paquet à une bibliothèque partagée qui requière une bibliothèque statique pour être fonctionnelle, les bibliothèques statiques peuvent être incluses dans un sous-paquet ''*-devel''.
 +
 
 +
=== Lier statiquement les exécutables ===
 +
 
 +
* La liaison statique est une exception spéciale et doit être décidée au cas par cas. L’empaqueteur doit fournir une justification de la liaison statique, pour obtenir une approbation.
 +
 
 +
== Rendre un paquet obsolète ==
 +
 
 +
Lorsqu’un paquet devient inutile dans la distribution, il doit être rendu obsolète ou supprimé de la cauldron/du chaudron.
 +
 
 +
Pour rendre obsolète et supprimer un paquet du chaudron :
 +
* Sur SVN, déplacer le paquet dans le répertoire svn+ssh://svn.mageia.org/svn/packages/obsolete/ (veuillez aussi voir [[Empaqueteur_svn-fr#Comment_abandonner_un_paquet_depuis_SVN_.3F|Comment abandonner un paquet depuis SVN (en)]]).
 +
* Si un paquet est remplacé par un autre qui fourni les mêmes fonctionnalités, ajoutez-le comme obsolète dans un nouveau paquet. '''Utilisez des obsolètes versionnés est recommandé (Obsolète : foo < dernière version du chaudron + 1) - Ceci s’applique pour tous les sous-paquets qui devraient être obsolètes !'''
 +
* Si un paquet n’est pas remplacé par un autre et est simplement abandonné, rendez-le obsolète par le paquet task-obsolete. N’oubliez pas d’ajouter un commentaire avec la raison de l’obsolescence ou un lien vers la discussion de la liste de diffusion expliquant les raisons.). '''Utiliser des obsolètes versionnés est recommandé (Obsolète : foo < dernière version du chaudron +1) - ceci s’applique pour tous les sous-paquets qui devraient être obsolètes !'''
 +
 
 +
Quand un paquet est rendu obsolète par un autre paquet, il sera automatiquement supprimé des dépôts du chaudron.
 +
 
 +
''Ceci a été importé depuis [http://wiki.meego.com MeeGo wiki] sous licence CC-By 3.0''<br />
 +
''Comme le wiki n’existe plus, regardez sa version archivée :  
 
http://wayback.archive.org/web/20130903235324/http://wiki.meego.com/Main_Page
 
http://wayback.archive.org/web/20130903235324/http://wiki.meego.com/Main_Page
  
= Langages de programmation spécifiques =
+
== Langages de programmation spécifiques ==
  
[[Nodejs packaging|Nodejs packaging (en)]]
+
Voir https://en.opensuse.org/openSUSE:Packaging_nodejs (en)
  
[[Category:Packaging]]
+
[[Equipe Packageurs-fr|Retour au '''Portail d'information de l'équipe de construction des paquets'''.]]
[[Category:Policies]]
 
[[Category:Contributors]]
 

Latest revision as of 06:56, 27 March 2023


Drakconf multiflag.png
Autres langues
English ; Français ;

Accueil [en] Accueil Équipes Packageurs Consignes


Attention !
Cette page est une traduction non relue d’une page qui est en cours d’élaboration et doit être réadapté à la politique d’empaquetage de Mageia. Nous vous invitons à la relire et la corriger. Les passages en Italique sont à revoir dans la version originale anglaise.
Résumé :
Cette page à pour objectf de présenter les consignes d’empaquetage de Mageia qui sont basées sur celles de Mandrake/Mandriva.

Contents

Maintenir un paquet

Tous les paquets de Mageia doivent être tenus par un mainteneur (maintainer) (alias titulaire (owner), (bug owner)). Chaque paquet sans mainteneur sera automatiquement reconsidéré comme à supprimer de Mageia. Un mainteneur d’un paquet est chargé de s’assurer que :

  • son paquet est à jour avec les derniers paquets en amont (upstream)
  • son paquet intègre toujours le système de compilation Mageia et corrigent les erreurs de compilation lorsqu’elles se produisent
  • les méta-données (meta-data) du fichier SPEC du RPM est exact
  • la licence du paquet est correcte
  • il/elle suit les sources en amont pour répondre aussi rapidement que possible aux mises à jour de sécurité critiques
  • elle/il fournit les informations sur des changements majeurs aux autres empaqueteurs (packagers) et mainteneurs (maintainers) afin de laisser suffisamment de temps pour résoudre les problèmes de compatibilité.

Actuellement les données à propos du titulaire des paquets sont suivis dans http://pkgsubmit.mageia.org/data/maintdb.txt et les paquets non maintenus sont listés dans http://pkgsubmit.mageia.org/data/unmaintained.txt. Ils seront intégrés et gérés ultérieurement et nous laissons une période de grâce pour les paquets non maintenus. Après cette période de grâce, ces paquets sans mainteneurs seront proposés pour la suppression.

Pour vous ajouter comme mainteneur d’un paquet, veuillez suivre ces étapes :

  • mettez à jour à la version la plus récente de mgarepo
  • Identifiez le paquet dont vous seul seriez le mainteneur unique
  • Pour chaque paquet que vous souhaitez maintenir faites :
mgarepo maintdb set [NomDuPaquet] [VotreIdentifiant]
  • Ceci peut être uniquement fait par les empaqueteurs, les apprentis n’ont aucun droit sur la commande maintdb
  • Vous pouvez le faire uniquement lorsque le paquet n’est maintenu actuellement par aucune personne !'
  • Votre requête sera immédiatement traitée et vous serez donc le mainteneur du paquet. Acte de bienveillance, vous aidez à sauver quelques paquets non maintenus. Allez et montrer leur que vous les aimez :)

L’état actuel est visible ici : http://pkgsubmit.mageia.org/data/maintdb.txt ou si vous avez un compte comme empaqueteur complet (c.-à-d. que vous n’êtes pas un apprenti) vous pouvez directement interroger la base de données des mainteneurs avec :

mgarepo maintdb get [packagename]

ou vous pouvez demander à Sophie sur un chat de Mageia :

:maint [packagename]

[TEC] Mise à jour par un développeur autre que le responsable

Mageia a beaucoup de paquets et relativement peu d’empaqueteurs. En tant que communauté, nous faisons toujours ce que nous pouvons pour faire de Mageia une meilleure distribution et si nous empiétons sur le travail de quelqu’un, nous l’avons fait de bonne foi parce que nous voulons que Mageia soit de la meilleure qualité qui puisse exister.

Ce développement mérite un ensemble de directives ou de politiques et voici une liste des travaux en cours proposés sur @dev.

  • Les remontées de révisions par le développeur sont bonnes. Il n’est pas nécessaire de demander au mainteneur, à moins qu’il s’agisse d’un changement substantiel (la plupart du temps ce sont des reconstructions ou de petites corrections).
  • Les remontées de révisions par le développeur doivent être abordées avec le responsable enregistré (dans maintdb), quand :
    • Le paquet est bien établi comme étant maintenu par une personne ou un groupe de personnes (Firefox, paquets KDE, noyau, etc.)
    • Le responsable est actif, c’est-à-dire qu’il a travaillé sur des paquets, des MLs ou des bogues au cours des deux derniers mois.
    • The version bump is substantial: major/minor bump or soname change, non-trivial spec changes like syncing with another distro that was not the maintainer's documented update workflow
  • Pour des raisons de sécurité, les téléchargements de développeur sont acceptables si le responsable n’a pas encore commenté le rapport de bogue et si un délai raisonnable s’est écoulé. Bien sûr, faites preuve de bon sens, si c’est le noyau ou la glibc, donnez au responsable une chance de revoir vos modifications.
  • Dans d’autres cas, faites preuve d’empathie et de bon jugement. Envoyer un courriel de deux lignes à un responsable pour l’informer de votre souhait de mettre à jour un paquet, ça ne coûte rien. Souvent, on vous disait même que vous pouvez aller de l’avant et vous remercier pour votre travail, qui vaut toujours la peine d’être pris.
  • Lorsque vous effectuez des téléchargements sans mainteneur, soyez prudent avec vos modifications. Ne laissez pas tomber des correctifs que vous ne comprenez pas, demandez au responsable et utilisez la solution pour mieux documenter l’objectif desdits correctifs. Ne synchronisez pas avec un nouveau fichier amont ou une autre distribution sans demander (sauf si ce paquet est identifié comme synchronisé avec une distribution donnée, par exemple rust ou Firefox).

Convention des noms de paquet

  • Les noms de paquet de base (utilisé pour svn et src.rpm) doit être le même nom que celui du projet du logiciel en amont, toujours en minuscule. Le nom en amon peut contenir des chiffres, des '+', '_' ou '.', mais aucun autre caractère exceptionnel. Dans des cas exceptionnellement rares des majuscules peuvent être acceptés s’il y a une raison qui le justifie (ex : les paquets perl) ou pour des raisons historiques.
  • Les noms de paquet construit pour Mageia depuis leurs noms en amont doivent uniquement juxtaposer des suffixes en utilisant le délimiteur "-" (par exemple foo-devel ou foo-plugins comme dérivé du paquet foo). Tous « _ » et « + » dans les noms des paquets doivent uniquement venir du nom du paquet en amont ! Les «.» dans les noms de paquet doivent venir aussi de l’amont ou du schéma standard du versionnage.
  • Le fichier SPEC doit être nommé en suivant le schéma %{nom}.spec, autrement dit le nom du paquet source et du répertoire svn doivent être utilisés comme nom pour le SPEC.

Version et Révision (release)

La version du paquet a cette allure : X.Y.Z - R mga V
avec :

  • X.Y.Z le numéro de 'version' qui est devrait représenter la version du projet
  • R est la balise de révision qui est toujours incrémenté après chaque changement du paquet et avant de le soumettre pour une nouvelle construction
  • mga est le suffixe de la distribution
  • V est la version de la distribution

Version

Le champ 'version' du fichier spec est là où vous inscrivez la version courante du logiciel à empaqueter. Il y a des cas où la version en amont ne correspond pas au standard et contient des caractères non numériques :

  • Paquets en prérévision (pre-release) : les paquets sortis en version « pre-révision » avant une version « finale ». Elle inclut par exemple des balises « alpha », « beta », « rc », « cvs », « git », « svn », etc et doit être ajouté à la balise révision (release) et non pas à la balise « version ». Vous trouverez des détails en dessous.

Versions de pré-révision

Pour les paquets de développement ou de pré-révision la balise Release (révision) doit commencer par « 0. » ainsi quand le logiciel devient « final » et ne change pas de version, nous pouvons assurer une mise à jour sûre vers une version stable simplement en changeant Release à 1.

Par exemple :

monFichierSource-2.9rc2.tar.gz a un fichier de spécification (specfile) contenant les champs Version : 2.9 et Release : %mkrel 0.rc2.1

Pour chaque reconstruction du même paquet « pré-révisé » (pre-released), incrémentez simplement la balise Release; comme ici 0.rc2.1 deviendrait 0.rc2.2 etc.

Il est recommandé d’utiliser la macro "%mkrel -c rc2 1 » pour générer 0.rc2.1.

Pour les amonts de svn ou git, il est préférable d’inclure la date de la prise en compte, avec ou sans le numéro de révision ou du git hash (qui devrait être au moins en commantaire dans le fichier spec). Les exemples suivants sont acceptables :

%mkrel -c svn20130213 1 %mkrel -c 20130213svn85423 1 %mkrel -c git20130213 1 %mkrel -c 20130213gitae25f2 1

rtmpdump peut aider à gérer ces dates de prise en compre, avec les variables %snap et %mkrel : http://svnweb.mageia.org/packages/cauldron/rtmpdump/current/SPECS/rtmpdump.spec?view=markup

Révisions (release)

Le numéro de révision (release) doit commencer par 1, et doit revenir à 1 à chaque nouvelle version, et s’incrémenter à chaque changement du paquet.

Sous-révision (sub-release) (applicable uniquement aux mises à jours)

Veuillez vous référer la section de nos conventions des mises à jours (en).

Balises

  • La balise de l’empaqueteur (Packager) ne doit pas être utilisée dans le fichier Spec. Les identités des empaqueteurs sont évidentes depuis les entrées du journal de modifications (changelog). En évitant d’utiliser la balise « Packager » vous éviter de retrouver des fichiers binaires compilé par quelqu’un d’autre avec votre nom dans les entêtes. Voir aussi Maximum RPM definition of the Packager tag (en). Si vous avez besoin d’inclure des informations à propos de l’empaqueteur dans les RPM que vous construisez, utilisez plutôt %packager dans votre ~/.rpmmacros
  • La balise du vendeur (Vendor) ne pas non plus être utilisé. Il est automatiquement réglé par le système de construction (build system).
  • Ordinairement, la balise PreReq doit être remplacé par entièrement par Requires. Pour plus d’information voir Maximum RPM fine grained dependencies chapter (en).
  • La balise Source informe où trouver la source à l’amont du rpm. Dans la plupart des cas ça doit être le lien internet complet vers l’archive en amont (upstream tarball). La meilleure pratique veut l’utilisation de macros comme %version et %name pour permettre des mises à jours automatiques, mais ce n’est pas nécessaire.

La balise résumée (Summary)

Cette balise décrit en une seule ligne le paquet. De longueur maximum de 79 caractères, elle commence avec une lettre majuscule et non pas avec un espace. Le sommaire doit finir avec un point «. » Si ça vous dérange d’un point de vue grammatical, asseyez-vous, prenez une profonde inspiration et surmontez cette épreuve.

Le nom du paquet ne doit pas être répété dans le résumé. C’est une information redondante et donne un aspect étrange dans certains résultats de programme.

Il doit être adapté à toutes les situations standard et ne pas se préoccuper de contextes spéciaux. Il est utile dans les listes de paquets ordonnées alphabétiquement ou non, comme dans les listes de tous les paquets.

Il doit décrire la fonction principale du paquet et les propriétés particulières de ce paquet pour aider l’utilisateur à comparer des paquets aux noms ou fonctions similaires. Par exemple les deux mots « navigateur web » sont dans les résumés de tous navigateurs we, mais utilisant des adjectifs en plus (comme minimal, complexe, GNOME, KDE, rapide, ou l’auteur etc) aide à spécifier un paquet.

Le résumé doit être bref et précis sans inclure d’information redondante.

Le fichier SPEC du RPM contient uniquement la version anglaise afin de garde la base de donnée RPM petite.

La balise de groupe RPM (RPM Group)

La balise de groupe RPM est utilisé pour des groupes de paquets par leurs types de fonctionnalités qu’ils fournissent, et façonne la liste visible dans rpmdrake. Il est impératif que les groupes gardent leurs titres anglais, vous trouverez la liste de groupes existants à utiliser pour vos paquets sur la page Mageia policy (en). Actuellement la liste est différente de l’originelle inventé par Red Hat, car pour nous, de notre point de vue, elle n’est plus adaptée aux distributions d’aujourd’hui. Vous pouvez encore la trouver ici.

La balise buildRoot

La balise BuildRoot est obsolète et devrait être supprimée là où elle est rencontrée puisse que sa fonctionnalité est directement gérée par rpm dans mageia.

La balise PreReq

Les paquets ne doivent pas utiliser la balise PreReq. À l’époque, pour résoudre le serpent qui se mord la queue dans la récursion de dépendances, cette balise était utilisée pour désigner un « vainqueur » par rapport à ces dépendances et donc déterminer l’ordre de leur installation. Ce cas n’est plus le cas.

La balise dépendances (requires) / dépendances explicites (explicit requires)

Les paquets doivent contenir uniquement des « Requires » (dépendances) si elles sont absolument nécessaires pour que les logiciels fonctionnent correctement. Utilisez des dépendances versionnées au besoin comme expliqué plus loin.

Les paquetages ne doivent pas contenir « explicit Requires » (dépendances explicites) sur des librairies sauf lorsque c’est absolument nécessaire et si tel est le cas il doit y avoir un commentaire le justifiant dans le fichier SPEC.

De manière générale on compte sur RPMbuild pour ajouter automatiquement les dépendances par le SONAME des librairies (le SONAME est le nom de la librairie suivit de sa révision, comme libGL.so.1 est le SONAME de libGL.so.1.2.0), les interpréteurs de script shell, et les modules utilisés par les programmes écrits dans des langages de script populaires comme Perl et Python. Les outils de gestion de paquets les plus récents sont capables de résoudre leurs dépendances et de déterminer quels paquets sont nécessaires pour d’autres. Les dépendances explicites sur le nom du paquet peuvent aider l’utilisateur inexpérimenté qui s’apprête à installer un paquet RPM manuellement, mais, l’histoire a montré que de telles dépendances ajoutaient de la confusion quand, la librairie ou les fichiers étaient déplacés d’un paquet à un autre, quand, les paquets étaient renommés, ou quand, l’un des multiples paquets alternatifs aurait suffi. De plus, dans quelques cas, d’anciennes dépendances explicites sur le nom du paquet imposait des mises à jours et des reconstructions inutiles.

RPMbuild ajoutera automatiquement des dépendances versionnées dans quelques cas : avec le SONAME d’une librairie, le symbole faible de version de glibc, et des versions d’API de Perl ou Python quand elles sont installées comme binaires ou des modules installéesextension versionnées. Des dépendances versionnées explicites sont requises quand on a besoin de permettre des mises à jours correctes vers une révision stable ou de mises à jours d’une révision à une autre, et aident quand on rétro-porte des paquets. Quoi qu’il en soit, elles peuvent périmer, devenir inexacte et superflues après quelque temps et doivent être reconsidérées lorsque ces versions deviennent de l’histoire ancienne. La règle du pouce est d’ajouter (ou de garder) une version explicite s’il est nécessaire pour la mise à jours des deux dernières révisions stables.

Des dépendances versionnées sont particulièrement critiques pour des paquets mis à jours ou rétro-porté à une révision stable. Les utilisateurs pourraient choisir d’installer un sous-ensemble de paquets pendant la mise à jour ou laisser des versions anciennes des paquets installées nécessaires et le résultat est un système non fonctionnel.

Exemple rationnel pour une dépendance versionnée explicite :

# The automatic dependency on libfubar.so.1 is insufficient, # (La dépendance automatique de libfoo.so.1 est insuffisante,) # as we strictly need at least the release that fixes two segfaults. # (car on a besoin au minimum d’une révision qui répare deux erreurs de segmentations.) Requires: libfubar >= 0:1.2.3-7

Exceptions des dépendances/fournisseurs générées automatiquement

Comme tous les fichiers d’un paquet sont scannés automatiquement pour savoir ce dont ils ont besoin ou ce qu’ils fournissent, il est parfois nécessaire de changer quelques fonctions soit d’en exclure. Pour le faire, vous pouvez procéder ainsi :

# Suppress automatically generated Requires for devel packages # (supprime automatiquement les dépendances générées pour) # (le paquet de développement ) %global __requires_exclude devel\(.*\)

ou


Cette édition est nécessaire puisque que le code a changé (octobre 2014) This requires some editing as the code has changed (October 2014)

Utilisez maintenant pour les paquets de pear : %global __requires_exclude pear\\(Blowfish/DefaultKey.php\\)



# Suppress automatically generated Requires for pear packages # (Supprime les dépendances générées automatiquement pour) # (les paquets de pear) %global __requires_exclude pear(vendor/autoload.php)\\|pear(xmlapi.php)


# we don't want to provide private python extension libs # (Nous ne voulons pas fournir d’extensions privées pour) # (les librairies Python.) %define __provides_exclude_from ^(%{python_sitearch}/.*\\.so\\|%{python3_sitearch}/.*\\.so)$

Vous pouvez aussi voir cette page du wiki de Fedora pour plus d’information à ce sujet.

Débogage des dépendances récursives

Il y a une erreur récurrente lorsque des règles de dépendances sont trop nombreuses et contradictoires. Alors librpm doit briser cette chaîne de dépendances et le fait un peu aléatoirement en ayant un semblant de chaîne puisqu’il est impossible d’en finir lorsqu’il y a ces conflits dans les balises de dépendances.

Il est possible d’utiliser une commande comme « urpmi --debug-librpm --deploops » afin de déboguer ce genre de situations.

Mettre à jour depuis une révision précédente peut être résolu en cassant les boucles de dépendances.

La balise des dépendances de construction (BuildRequires)

Dans le développement et les tests de packages, veuillez vérifier que votre paquet ne manque d’aucune dépendance de construction (BuildRequires) nécessaire. Avoir les dépendances propres pour la construction épargne beaucoup de temps au développeur et aux testeurs ainsi qu’au système de construction, car il ne sera pas nécessaire de chercher manuellement les dépendances manquantes. C’est aussi une sécurité pour la construction du paquet qui n’échouerait pas, mais pour lequel il manquerait des fonctionnalités cruciales. Par exemple, une application graphique pourrait exclure le support PNG après que son script de configuration détecte que libpng n’est pas installé.

Les BuildRequires doivent être listés au moyen d’une seule par ligne pour un maximum de lisibilité; au lieu d’en bourrer plusieurs sur une seule ligne, utilisez une balise BuildRequires par dépendance. Tandis que les RPM peuvent « voir » une très longue ligne de BuildRequires, nous les humain ne le pouvont pas, même si cela rend la spec plus longue, cela la rend plus lisible. Avant d’ajouter des BuildRequires à un quelconque paquet, veuillez vous sentir à l’aise avec les dépendances. Veuillez aussi vérifier que vous n’ajoutez pas de BuildRequires non nécessaire. Si vous ajoutez les BuildRequires au paquet « A » et aussi des dépendances « Requires » sur les paquets. Si le paquet « A » a les dépendances pour la construction et aussi les dépendances au paquet « B » et « C », il est inutile de préciser, d’ajouter ces BuildRequires « B » et « C ». Vous pouvez le vérifier avec urpmq -pd sur le paquet « A ».

Lorsque vous déclarez un requis de construction (BuildRequires), il faut utiliser une fourniture virtuelle (virtual porvides) sans spécification d’architecture. Ces fournitures virtueles indépendantes de l’architecture sont par exemple les %name-devel (qui a été ajouté manuellement conformément à nos conventions sur les librairies(en)) ou pkgconfig(name) (qui est déjà disponible pour plein de paquet, et est généré automatiquement).

Par exemple, n’utilisez pas libsqlite3-devel, mais utilisez soit sqlite3-devel, soit pkgconfig(sqlite3). Vous pouvez vérifier quel produit virtuel un paquet -devel a, avec :

rpm -q --provides lib64sqlite3-devel

qui fournira ce genre de résultat :

libsqlite3-devel = 3.7.6.2-3.mga1 sqlite3-devel = 3.7.6.2-3.mga1 pkgconfig(sqlite3) = 3.7.6.2 devel(libsqlite3(64bit)) lib64sqlite3-devel = 3.7.6.2-3.mga1 lib64sqlite3-devel(x86-64) = 3.7.6.2-3.mga1

Comme vous pouvez le voir, seulement les deux recommandés précédemment ne portent aucune référence à l’architecture contrairement à devel(libsqlite3(64bit)) ou lib64sqlite3-devel(x86-64).

Attention !
Si vous utilisez des binaires comme desktop-file-install vous devez obligatoirement mettre les paquets comme dépendant à la construction qui le contient, sinon le paquet échouera lors de sa construction sur le système de construction de Mageia.

Quand vous construisez un paquet localement, vous pouvez facilement installer les dépendances à la construction du paquet foo avec la commande :

urpmi foo.spec

(ou urpmi --buildrequires foo.spec ou urpmi --buildrequires foo.src.rpm qui serait sa syntaxe la plus correcte.) Cela placera tous les paquets listés dans le fichier spec comme BuildRequires.

Les balises sur les architectures (ExclusiveArch / ExcludeArch / %ifarch / %ifnarch)

N’utilisez ExclusiveArch seulement lorsque vous êtes sûr qu’un paquet ne fonctionne que sur certaines architectures. Pareil pour ExcludeArch, quand vous savez sur quelle architecture il ne fonctionne pas, sans savoir sur quelle architecture il fonctionne.

Pour x86 (i586) la macro à utiliser est %ix86.

%ifarch/%ifnarch doivent être évités autant que possible, au moins pour patcher. En général, vous ne devriez pas appliquer un patch conditionnellement pour une seule architecture. Ceci donnera l’avertissement rpmlint :

%ifarch-applied-patch A patch is applied inside an %ifarch block. Patches must be applied on all architectures and may contain necessary configure and/or code patch to be effective only on a given arch.

(traduction : Un patch est appliqué au sein d’un bloc %ifarch. Les correctifs doivent être appliqués sur toutes les architectures et peuvent contenir les correctifs de configuration et/ou de code nécessaires pour être efficaces uniquement sur une arche donnée.)

La balise sources

Les fichiers sources doivent commencer avec Source0, ne commencez pas avec « Source : » puis « Source1 : ». Même si le paquet a seulement un fichier source, utilisez là encore Source0. Si le fichier source a un lien URL pour le télécharger, il doit être inclus. Dans la plupart des cas, c’est le lien complet de l’archive TAR intégrale en amont (upstream). La meilleure pratique serait d’utiliser des macros comme %version et %name pour ce lien, ce qui pourrait rendre automatique les mises à jour, mais c’est optionnel.

La balise patch (correctif, rustine)

Chaque problème doit être résolu dans un patch séparé. Pour faciliter la maintenance des correctifs, la source du correctif doit être indiquée, surtout si le correctif doit être mis à jour à partir de la même source à l’avenir. Lorsque le correctif est ajouté pour la première fois, la source du correctif doit être indiquée dans le message de validation. Il est également utile d’avoir un commentaire dans le SPEC d’où vient le patch, qui devrait être une URL complète vers l’amont si ce n’est pas évident, et une description de ce que fait le patch en quelques mots simples, si cela ne ressort pas clairement du nom du correctif.

Les correctifs doivent commencer avec le mot clef Patch0 dans le fichier SPEC, comme la balise Source. Les correctifs doivent être nommés de manière très explicite pour indiquer clairement quelle version du logiciel le correctif a été initialement généré ou appliqué. Enfin, les noms des rustines suivent généralement la convention [nom_du_paquet]-[version]-[description].[suffix du nom de fichier] où :

  • [nom_du_paquet] est le nom du paquet auquel le correctif s’applique, comme « shadow-utils » ou « gnupg »
  • [version] est la version du programme pour lequel le correctif a été développé, comme 1.0. Si une rustine est rediffusée, car la rustine précédente ne s’applique pas à la nouvelle version, une nouvelle rustine doit alors être crée avec un nom approprié. C’est inapproprié de rediffuser foo-1.0-linking-fix.patch pour foo-1.2 et de continuer d’utiliser le même nom de rustine. La nouvelle rustine doit être nommée foo-1.2-linking-fix.patch. Pour des raisons historiques, les rustines doivent être mises sur svn ; au lieu de faire « svn rm foo-1.0-linking-fix.patch » et « svn add foo-1.2-linking-fix.patch », la rustine originale doit être déplacée et après la nouvelle rustine dérivée doit être copié et envoyé; par exemple « svn mv foo-1.0-linking-fix.patch foo-1.2-linking-fix.patch; svn commit »
  • [description] est une brève discription du but de la rustine
  • [suffix du nom de fichier] Normalement c’est .patch et quelques fois .diff lorsque les rustines sont réutilisées en amont.

Les rustines devraient être au format unifié (diff -u) et à appliquer avec un niveau d’arborescence 1 dans le fichier spec (%patch -p1, voir l’option -p avec $man patch). Les seules exceptions sont les rustines obtenues d’un autre site de source primaire. Le nom original, le suffixe et le format sont alors préservés. Chaque rustine doit être conservé au format plein texte et non compressé, ça permet leur utilisation avec l’interface web de SVN par exemple.

Pour les rustines à appliquer, elles devraient être mentionnées dans %prep en dessous de %setup, et devrait être fait comme présenté ci-dessous :

%patch0 -p1 -b .foobar
  • -p1 est le niveau d’arborescence, relatif à partir d’où le patch est appliqué
  • -b est le suffixe qui est ajouté au fichier de sauvegarde que la commande créer, dans ce cas .foobar, ceci doit être similaire ou découle de la partie [description] de la rustine.

Pour confectionner des rustines, vous pouvez vous faciliter le travail en utilisant quelque chose comme http://labix.org/patcher.

  • Utiliser %apply_patches

On peut l’utiliser pour remplacer toutes les lignes %patchN dans %prep et gagner de l’espace dans le fichier spec (spécialement dans un paquet avec plein de rustines de l’amont) puisse qu’il appliquera toutes les rustines avec une commande. Quoi qu’il en soit, pour que ça fonctionne toutes les rustines doivent être -p1 et les mots clefs de définition des PatchN: doivent être placées immédiatement après les mots clefs de définition sourceN: du fichier spec, sinon ils seront silencieusement ignorés (aucun message d’erreur durant la construction) alors soyez prudent. Autrement, la macro %autopatch -p1 peut être utilisée, elle fonctionne essentiellement de la même manière. C’est une nouvelle macro standard venue de l’amont RPM et donne ainsi une meilleure compatibilité avec d’autres distributions.

La balise %clean

La balise %clean est obsolette et devrait être supprimée systématiquement si elle est rencontrée, car sa fonctionnalité dans Mageia est directement gérée avec rpm.

La documentation

Tout document pertinente inclut dans les sources doit être inclus dans le paquet. Les documents non pertinents sont les instructions de construction, l’omniprésent fichier INSTALL contenant des instructions générique de construction et les documents pour les systèmes autres que Linux par exemple README.MSDOS. Faites attention à quel sous-paquet vous ajoutez les documents, par exemple les documents pour une API appartiennent au sous-paquet de développement -devel et non pas au principal. Ou, s’il y a beaucoup de document, il est possible de les rassembler en un sous-paquet séparé. Dans ce cas, il est recommandé d’utiliser le suffixe *-doc au nom du sous-paquet et Documentation comme valeur de la balise Group.

Si le paquet inclut quelque chose comme %doc, il ne doit pas affecter l’exécution et le déroulement du logiciel. En résumé : si c’est dans %doc, le programme doit fonctionner proprement s’il n’est pas présent.

Vérifiez que les fichiers des documents ont les permissions permettant d’être lus par les utilisateurs normaux.

Quand les pages Man sont uniquement disponibles en anglais, installez les décompressés dans %{buildroot}%{_mandir}/manX/ (où X est le numéro de section approprié). Ils seront automatiquement compressés avant d’être empaqueté, ainsi ils doivent être inscrits dans la section %files avec un caractère jocker, ex : %{_mandir}/man1/xyzzy.1*. Les pages Man obtiendront automatiquement l’attribut %doc, alors ne les ajoutez pas explicitement.

Paquet de développement

Si le logiciel qui sera empaqueté contient des fichiers prévus uniquement pour du développement, ces fichiers doivent être placés dans un sous-paquet -devel. Les exemples suivant sont des types de fichiers qui doivent-être placé dans ce sous-paquet -devel :

  • Les fichiers d’entête (comme les fichiers .h)
  • les librairies partagées non versionnées (comme libfoo.so). Tandis que les librairies versionnées (comme libfoo.so.3, libfoo.so.3.0.0) ne doivent pas être dans un -devel.

Une bonne règle est, si le fichier est utilisé pour du développement et n’est pas nécessaire dans le paquet de base du logiciel pour fonctionner proprement, il doit aller dans -devel.

Les fichiers .a et .la doivent généralement pas être inclus tout court. Ils sont seulement nécessaires quand on souhaite lier un programme avec des librairies statiques (le programme inclut la librairie en lui-même ainsi la librairie n’est plus nécessaire lors de l’exécution), ce qui n’est généralement pas le cas avec Mageia. Les archives libtool, les fichiers foo.la ne doivent pas être inclus. Des paquets utilisant libtool les installeront par défaut même si vous les configurez avec --disable-static, alors ils seront à supprimer avec l’emballage du paquet. Dû à des bogues dans des versions précédentes de libtool ou des bogues dans les programmes qui l’utilisent, parfois il n’est pas toujours possible de supprimer simplement les fichiers *.la sans avoir à modifier le programme. Dans la plupart des cas, il est raisonnable et facile de travailler avec l’amont pour corriger ces problèmes. Notez que si vous mettez à jour une librairie vers une version stable (et non une version de développement) et que le paquet contient déjà des fichiers *.la, supprimer ces fichiers *.la doit être traité comme un changement d’API/ABI -- ex : les supprimer change l’interface que la librairie donne au reste du monde ne doit pas être pris à la légère.

Dépendant du paquet de base

Les paquets de développement doivent dépendre des paquets de base en utilisant une dépendance entièrement versionnée :

Requires: %{name} = %{version}-%{release}

Habituellement, les sous-paquet autre que -devel devraient aussi être dépendants du paquet de base aussi en utilisant une dépendance entièrement versionnée.

Fichiers Pkgconfig

Le placement des fichiers pkgconfig(.pc) dépend de leurs usages. Depuis qu’ils sont presque toujours utilisés à des fins de développement, ils sont à placer dans un paquet -devel. Une exception raisonnable est lorsque le paquet principal lui-même est un outil de développement qui n’est pas installé dans l’environnement d’exécution de l’utilisateur, comme gcc ou gdb.

Bibliothèques partagées

Chaque fois que c’est possible (et faisable), les paquets Mageia contenant des bibliothèques devraient les compiler en tant que bibliothèques partagées.

Un ldconfig n’est plus nécessaire pour les librairies dans %post ni %postun, c’est automatiquement géré par le RPM filetriggers. Si c’est le cas, veuillez enlever les appels à ldconfig et si c’était l’unique but de %post / %postun, alors supprimez entièrement ces sections vides.

Consulter Libraries policy (en) pour plus de détails sur la façon de créer des bibliothèques pour les paquetages.

Fichiers de configuration

Les fichiers de configuration doivent être marqués comme tel dans les paquets.

Comme bonne règle, utiliser %config(noreplace) à la place d’un simple %config à moins que vous pensiez que faire ainsi brisera les choses. En d’autres mots, réfléchissez bien avant d’écraser un fichier de configuration local par la mise à jours du paquet. Un exemple quand il ne faut pas utiliser noreplace, quand un fichier de configuration d’un paquet change à tel point que la nouvelle version du paquet ne fonctionnerait plus avec l’ancien fichier de configuration. Dès que vous utilisez un simple %config, veuillez ajouter un bref commentaire dans le fichier spec expliquant pourquoi.

Veuillez ne pas utiliser %config ou %config(replace) dans /usr. /usr n’est censé contenir de fichier de configuration sur Mageia.

Gestion de Service / Initscripts

Depuis Mageia 3, systemd est le seul système d’initialisation offert, cependant, il supporte encore les scripts d’initialisations de style systemV avec la mise en garde qu’ils doivent contenir un entête LSB valide pour permettre d’extraire les informations sur les dépendances proprement.

Mageia 2 supportait autant le démarrage avec SystemV et systemd, et dépendait autant de scripts d’initialisation de style SystemV et optionnelement d’une unité systemd.

Mageia 1 ne supportait que SystemV.

Pour plus d’information sur l’empaquetage des services, veuillez voir les consignes d’empaquetage des services (en).

Fichiers desktop

Si un paquet contient une application avec interface graphique, alors il est nécessaire aussi d’installer proprement un fichier .desktop. Une application avec interface graphique défini toutes application qui dessine une fenêtre X et s’execute depuis cette fenêtre. Le fichier .desktop installé DOIT suivre les spécifications d’entrer desktop (en), avec une attention particulière de bien valider correctement les entrées Name, GenericName, Categories et StartupNotify. Veuillez toujours faire valider le fichier .desktop avec le logiciel desktop-file-validate du paquet desktop-file-utils.

La clé Icon des fichiers Desktop

La clef Icon peut être uniquement spécifié d’une manière : * Nom court sans chemin ni extension au nom : Icon=comical

Le nom court sans extension permet pour d’utiliser des thèmes (Par défaut on suppose que l’extension est .png, puis on essaie avec .svg et enfin .xpm)

Création du fichier .desktop

Si le paquet n’en contient pas déjà un ni installe son propre fichier .desktop, il est nécessaire d’en créer un. Vous pouvez générer un fichier .desktop comme une source : (comme Source3: %{name}.desktop) ou en le générant dans le fichier spec à « here document ». Voyez ci-dessous en exemple la création par « here document », la partie verte est le contenu du fichier .desktop.

mkdir -p %{buildroot}%{_datadir}/applications cat > %{buildroot}%{_datadir}/applications/%{name}.desktop << EOF <span style="color:#0c0;">[Desktop Entry] Name=Ginkgo Comment=Ginkgo is a graphical front-end for Nepomuk Exec=%{_bindir}/%{name} Icon=nepomuk Type=Application Categories=Utility;KDE;Qt;</span> EOF

Régionnaliser les fichiers .desktop

Les valeurs de Name et de GenericName sont affichés comme légende à l’icône du bureau, ainsi elles doivent s’accorder avec la régionnalisation conformément aux spécifications des entrées Desktop. La plupart du temps, seulement le code du langage (fr, de, etc) ou l’ensemble codes langage/pays sont nécessaires pour sélectionner la régionnalisation du système. Par exemple :

[Desktop Entry] Type=Application Name=Clocks Name[de]=Uhrzeit Name[es]=Relojes Name[fr]=Horloges Name[pt_BR]=Relógios Name[zh_CN]=时钟

Dans le fichier .desktop ci-dessus, [de] spécifier la langue allemande, recouvrant tous les pays dont la langue est l’allemand, aussi bien de_DE l’Allemagne que de_AT l’Autriche.

Note : comme l’ensemble langage/pays (ex : pt_BR est plus spécifique que le code langage (ex : pt), une chaine de caractère pour les lieux pt_BR ne sera pas utilisé pour les lieux de la langue portugaise (pt). Si une chaine est appropriée pour tous les lieux dont la langue est le portugais, utilisez "Name[pt]" à la place.

Utilisation de desktop-file-install

desktop-file-install DOIT être utilisé s’il y a des changements désirés sur un fichier .desktop délivré par l’amont (comme l’ajout ou la suppression d’une catégorie, etc). Note : Les options d’édition limitées disponibles peuvent être demandées via desktop-file-install --help-edit ou desktop-file-install --help-all

Voici quelques usages :

desktop-file-install --vendor="%{_real_vendor}" \ --remove-category="Application" \ --add-category="Settings;HardwareSettings;" \ --dir %{buildroot}%{_datadir}/applications %{buildroot}%{_datadir}/applications/%{name}.desktop
desktop-file-install --vendor="%{_real_vendor}" \ --dir=%{buildroot}%{_datadir}/applications \ --remove-category='Application' \ --remove-category='Utility' \ --add-category='System' \ --add-category='Settings' \ --add-category='Printing' \ --add-category='Qt' \ --add-category='HardwareSettings' \ --add-category='X-Mageia-CrossDesktop' \ --remove-key='Version' \ %{buildroot}%{_datadir}/applications/hplip.desktop

L’installation du fichier .desktop sur le system cible ne doit plus être géré manuellement comme précédemment dans %post/%postun, maintenant, c’est automatiquement géré avec RPM filetriggers (en). Veuillez juste vérifier que tous les fichiers .desktop que vous souhaitez installer sont correctes et valides comme souligné au par avant.

Catégorie spécial MandrivaLinux

Dans plusieurs paquets importés de Mandriva, les fichiers .desktop ont des entrées de catégories "X-MandrivaLinux" obsolètes. Elles avaient leur utilisé lors de la transition du système de menu Debian vers le système de menu Freedesktop XDG, donc obsolètes et sont à remplacer par la catégorie standard de Freedesktop. Vous les trouverez dans la spécification de Freedesktop.

La seule catégorie de Mandriva qui a son équivalent encore sur Mageia est X-MandrivaLinux-CrossDesktop. Cette catégorie est prévue pour les applications de type « kit d’outils » (comme GTK, QT, KDE) dans leur fichier desktop (et seront donc affichés dans « plus » de sous-menu dans d’autre environnement) quand on ne veut pas qu’ils aillent dans CrossDesktop. Pour une référence, veuillez-vous référer au rapport de bogue : Bug 2449 - X-MandrivaLinux-* should be dropped.

Voici un exemple comment ça doit être fait. Le fichier totem.desktop du lecteur multimédia Totem contient :

Categories=GTK;GNOME;AudioVideo;Player;Video;X-MandrivaLinux-CrossDesktop;X-MandrivaLinux-Multimedia-Video;

Ainsi X-MandrivaLinux-CrossDesktop doit être remplacé par X-Mageia-CrossDesktop (ou on peut supprimer les catégories GTK et GNOME du fichier desktop, mais ceci supprimerait aussi des informations potentiellement intéressantes pour quelques environnements graphiques).

Aussi, X-MandrivaLinux-Multimedia-Video est une catégorie obsolète et définitivement ne doit plus être utilisée, à la place la catégorie est remplacée par la catégorie principale de Freedesktop AudioVideo et complété au moins par une catégorie additionnelle de http://standards.freedesktop.org/menu-spec/latest/apa.html. Comme c’est déjà le cas (AudioVideo;Player;Video; voir ci-dessus) cette catégorie X-MandrivaLinux doit simplement être enlevée.

Macros vs variables

%{buildroot} et %{optflags} vs $RPM_BUILD_ROOT et $RPM_OPT_FLAGS De manière générale il y a deux style pour définir le BuildRoot du RPM et les drapeaux d’optimisation dans le fichier spec :

style macro variable style
Build Root %{buildroot} $RPM_BUILD_ROOT
Opt. Flags %{optflags} $RPM_OPT_FLAGS

Conformément à nos consignes de syntaxe des SPEC (en) les variables qui sont réellement des définitions tel que $RPM_OPT_FLAGS ou $RPM_BUILD_ROOT ne doivent pas être utilisées. Les macros comme %{optflags} et %{buildroot} doivent les remplacer. Gardez les variables "$*" pour les constructions du shell et non pas pour les définitions de base d’un RPM.

Tenue des fichiers d’internationalisation

Les fichiers régionaux (autrement dénommé Localizations (en francais, régionnalisation), son abréviation est l10n, ou Internationalisation (i18n), le numéro dans les abréviations correspond au nombre de lettres omises), sont compilés dans des fichiers .mo. Cette section n’est pas à propos des pages Man.


(Si un paquet inclut des traductions, il n’est plus nécessaire d’ajouter gettext comme dépendance de construction (BuildRequire), car gettext est déjà présent dans l’environnement de construction.)

Mageia inclut une macro rpm nommée %find_lang. Cette macro trouvera tous les fichiers régionaux qui appartiennent au paquet (par nom), et placera cette liste dans un fichier. Vous pouvez alors utiliser ce fichier pour inclure les fichiers régionaux. %find_lang doit être exécuté dans la section %install de votre fichier spec, après que tous les fichiers ont été installés dans le buildroot. La syntaxe correcte pour %find_lang est habituellement :

%find_lang %{name}

Dans certains cas, l’application utilisera des « name » différents pour des régions. Vous devriez jeter un coup d’œil aux fichiers régionaux pour connaitre leur dénomination. S’ils sont nommés myapp.mo, alors vous devez donner myapp à %find_lang à la place de %{name}. Après l’exécution de %find_lang, un fichier sera généré dans le répertoire courant (par défaut la racine des sources). Ce fichier prendra un nom basé sur les options que vous aurez données à la macro %find_lang. Habituellement, il sera nommé %{name}.lang. Vous devriez alors utiliser ce fichier dans la liste %files pour ajouter les fichiers régionaux détectés par %find_lang. Pour ce faire, vous devriez l’inclure avec le paramètre -f à %files.

%files -f %{name}.lang %{_bindir}/foobar …

Si le paramètre -f est déjà utilisé pour la section %files où vous devriez ajouter les fichiers régionaux, ajoutez simplement le contenu de %{name}.lang après le fichier utilisant déjà le paramètre -f. (Notez qu’uniquement un fichier peut être utilisé avec %files -f.)

Pourquoi avons-nous besoin d’utiliser %find_lang?

L’utilisation de %find_lang aide à garder un fichier de spécification simple et aide à éviter quelques erreurs d’empaquetage.

  • Les paquets qui utilisent %{_datadir}/* pour extraire tous les fichiers régionaux en une ligne extrait aussi le propriétaire des répertoires locaux, ce qui n’est pas permis.
  • La plupart des paquets qui ont des fichiers régionaux en ont beaucoup. Utiliser %find_lang est bien plus conviviale (utilisation, clarté…) dans le fichier de spécification que d’avoir à écrire :
%{_datadir}/locale/ar/LC_MESSAGES/%{name}.mo %{_datadir}/locale/be/LC_MESSAGES/%{name}.mo %{_datadir}/locale/cs/LC_MESSAGES/%{name}.mo %{_datadir}/locale/de/LC_MESSAGES/%{name}.mo %{_datadir}/locale/es/LC_MESSAGES/%{name}.mo …
  • Comme de nouveaux fichiers régionaux peuvent apparaitrent dans de futures versions, %find_lang les inclura automatiquement à son exécution et vous évitera de mettre à jour le fichier de spécification plus que nécessaire.

Gardez à l’esprit que l’usage de %find_lang dans un paquet contenant des fichiers régionaux est un IMPÉRATIF.

Scriptlets

Une grande attention doit être porté lors de l’utilisation de scriptlet dans les paquets de Mageia. Si des scriptlets sont utilisés, ceux-ci doivent être sains.

Prérequis des Scriptlets N’utilisez pas le style de notation Requires(pre,post) pour les dépendances aux scriptlets en raison de deux bugs dans RPM. À la place, vous devriez les séparer comme ceci :

Requires (pre): … Requires (post): …

Pour plus d’information, veuillez voir www.redhat.com .

Exécution de scriptlets uniquement dans certaines situations Lorsque la commande rpm exécute un scriptlet d’un paquet, l’action associée (quelle soit une installation, un effaçage, une mise à jour ou une réinstallation) est donnée par un entier en paramètre du script en question, en suivant les codes suivant :

macro install erase upgrade reinstall
%pre 1 - 2 2
%post 1 - 2 2
%preun - 0 1 -
%postun - 0 1 -

Ceci signifie par exemple qu’un paquet qui installe un script d’initialisation avec la commande chkconfig doit le désinstaller uniquement avec « erase » et non avec une mise à jour avec le snippet suivant : This means that for example a package that installs an init script with the chkconfig command should uninstall it only on erase and not upgrade with the following snippet:

%preun if [ $1 -eq 0 ] ; then /sbin/chkconfig --del %{name} fi

Veuillez aussi voir /usr/share/doc/rpm-*/triggers, qui donne une définition plus formelle et générale à propos des valeurs entières passé aux scripts.

Les scriplets sont autorisés d’écrire uniquement dans certains dossiers Les scripts de construction des paquets (%prep, %build, %install, %check et %clean) peuvent gérer seulement les fichiers (créer, modifier, supprimer) sous %{buildroot}, %{_builddir} et les répertoires temporaires valides comme /tmp, /var/tmp (ou $TMPDIR, %{_tmppath} comme définit par le processus rpmbuild), conformément au tableau suivant :

/tmp, /var/tmp, $TMPDIR, %{_tmppath} %{_builddir} %{buildroot}
%prep Oui Oui Non
%build Oui Oui Non
%install Oui Oui Oui
%check Oui Oui Non
%clean Oui Oui Oui

Clarification complémentaire : Ceci reste vrai quel que soit l’UID du constructeur.

L’usage de la balise Epoch

La balise Epoch dans RPM doit être utilisée qu’en dernier recours, et doit être évitée autant que possible. Quoi qu’il en soit, il est parfois nécessaire d’utiliser Epoch pour gérer un changement de version de l’amont ou de faciliter la transition d’un dépôt tiers.

Créer un paquet à partir de zéro

Si vous voulez créer un paquet de zéro, voici le squelette d’un fichier SPEC où vous n’avez qu’à remplacer foo avec vos propres valeurs conformément à ce guide.

Name: foo Version: 1.0 Release: %mkrel 1 Summary: foo License: foo Group: foo URL: foo Source0: %name-%version.tar.bz2 %description foo %prep %setup -q %build %configure2_5x %make %install %makeinstall %find_lang %name %files -n %name

Modifier un paquet existant

Si pour créer un paquet mageia basé sur un paquet existant d’une autre distribution, soyez sûr d’avoir vérifié l’exactitude du paquet et de son fichier spec pour comprendre exactement ce qui a été fait pour construire le paquet. Ne soumettez pas un paquet sans savoir ce que les étranges commandes d’apparences innocentes font.

Vous devez particulièrement :

  • Vous assurer que l’archive est autonome. Une archive ne doit pas contenir de lien symbolique qui aurait une référence à l’extérieur de la racine de l’archive
  • vérifier toutes les sources et correctifs, supprimez ceux qui :
    • sont relié à des plateformes que nous ne supportons pas (ex : sparc, ia64, ppc…)
    • ou implémenter des fonctionnalités que nous ne supportons pas (ex : selinux)
    • Lire tous les correctifs et comprenez ce qu’ils font. Si ce n’est pas nécessaire, ajouter à l’entête du correctif une explication justifiant pourquoi.
  • Vérifier que la licence précisée dans le fichier spec correspond bien à la licence actuelle du logiciel. Nous conseillons pour ça de faire un grep sur tous les fichiers sources et vérifier les informations des licences.
  • parcourez les sommaires et les descriptions pour des fautes de frappes et bizarreries (voir Sommaire et description),
  • assurez-vous que la bonne racine de construction est utilisée,
  • assurez-vous de la consistance de l’usage des macros et de leur existence dans Mageia (voir Macros)

Gardez les vieilles entrées dans les registres de changement pour créditer l’auteur originel. Les entrées âgées de plusieurs années ou référençant une ancienne version du logiciel peuvent être effacées. Si au final vous avez radicalement changé ou réécrit la majorité du fichier spec, jugée par vous-même si vous démarrer de zéro un nouveau journal de modifications (changelog).

Journal des modifications (Changelogs)

Cette section décrit les consignes chez Mageia concernant le journal de modifications des RPM nommé « changelogs ». (Le journal de modifications original des sources du logiciel en amont ne sont pas affectés par ces consignes.)

Lorsque vous importez un paquet, pensez à importer le changelog !

Veuillez considérer que « l’utilisateur final avec quelques compétences techniques » devrait être capable de comprendre un registre de changement RPM. Les entrées du registre doivent-être d’ordre anti-chronologique : les nouvelles entrées du journal de modifications sont inscrites au-dessus des anciennes entrées de la liste, la première entrée est la plus récente.

Gardez à l’esprit que le journal de modifications de Mageia est automatiquement analysé pour préparer la note de version de la distribution, pour les rapports de bogues et pour les CVEs ainsi une entrée malformée ne sera pas lue correctement.

Informations générales

  • Les registres de changements sont stockés dans les registres des commits sur SVN, mais ils doivent tout de même être considérés comme une part de la spec final quand ils sont soumis sur SVN (voir en dessous)
  • La section %changelog ne doit pas être utilisé dans le fichier .spec puisse que les registres des commits svn produisent le journal de modifications du RPM pour la construction
  • On écrit un message lors de la soumission lorsqu’il y a des changements, soit par svn ci ou mgarepo ci avec l’option -m '- ici le message de soumission'
  • Fournissez un message de soumission significatif et détaillé et rendez-le suffisamment explicite afin que les personnes qui viendront plus tard n'aient pas besoin de regarder une liste de changements pour comprendre ce qui s'est réellement passé.
  • Voici un mauvais exemple :
- fixed foo

Ceci ne dit rien à personne et après un an, quelle que soit la personne qui ait fait ce genre de soumission n’a plus aucune idée des changements sur cette soumission.

  • Voici un bon exemple :
- rediffed description.patch to fix foo - added foo-manpages.tar.bz2 to provide such and such for foo - dropped cvsfix32.patch; merged upstream

Ce dernier exemple est bien plus parlant sur ce qui s’est réellement passé. Notez que les fichiers sources doivent être référés par leur nom entier (sur l’exemple précédent foo-manages.tar.gz, mais pas « S2"3 ou « Source23 » ou autre). Il n’est pas nécessaire de référer les correctifs par leur nom complet, mais peuvent être référé par la portion de leur « description ». Par exemple, le premier commentaire est « rediffed description.patch to fix foo" et description.patch est noté. Les correctifs peuvent en réalité être nommés foo-1.2-mga-description.patch ; le préfix (foo-1.2-mga) peut être omis puisse qu’il est simple de le retrouver par sa simple description quel correctif a changé/ajouté ou supprimer quelque chose. Si le nom du correctif n’est pas unique (ex : il y a foo-1.2-mga-description.patch et foo-1.0-cvs-description.patch), alors l’un des deux noms de correctifs peut (et probablement doit) être changé ou le nom tout entier du correctif doit être noté dans le journal de modifications. Ne référez par les fichiers sources ou les correctifs par leur numéro (ex S23 ou P12) puisse que les correctifs et les fichiers sources peuvent être renumérotés parfois ainsi il n’est pas exclu que ça ne reste pas consistant.

  • Quand vous ajoutez un message de soumission sur plusieurs lignes, chaque entrée différente doivent commencer avec le caractère 'moins' comme :
- Bumped release - Added foo.patch

Ceci est optionnel pour les messages sur une seule ligne puisque dans ce cas, il est ajouté s’il n’est pas présent. Pour créer un message sur plusieurs lignes, laissez simplement la première ligne dans un état indéterminé (sans signe de citation final), appuyez sur [entrer], et continuez à écrire sur la ligne en dessous. Finissez la dernière ligne avec le signe de fin de citation. Ou encore écrivez un message de soumission dans un fichier et incorporez lors de la ligne de commande avec l’option -F pour svn ci / mgarepo ci.

Références externes

Toutes références externes (numéro de bogue etc) doivent être de cette forme :

"(" + code de référence externe + numéro de bogue +")"

Actuellement défini :

  • Mageia Bugs : mga#
  • Common Vulnerability / Exposure : CVE

Les numéros de bogue dans les registres de changements

Durant la maintenance de la distribution, chaque changement doit être marché avec le numéro de bogue correspondant. Normalement ceci doit être un numéro de https://bugs.mageia.org/. Ajoutez une entrée avec le numéro de bogue de bugzilla et une courte description du résumé du bogue. Par exemple :

- Removed invalid desktop Category « Application » ({{bug-fr|4654}}). - Symlink icon to pixmaps dir (mga#2108) - Added gnome-ui-properties to control-center ({{bug-fr|1960}}).

Les nouveaux paquets reliés à une nouvelle fonctionnalité seront référé aussi avec le numéro de bogue correspondant sur bugzilla, par exemple :

- Adding Qt Contacts support (mga#8011)

Le numéro de CVE dans le registre de changement Comme avec le numéro de bogue : ajoutez une courte description (normalement le résumé de CVE doit être suffisant), les numéros de bugzilla et de CVE au journal de modifications et aussi le nom et l’origine du correctif qui répare ce CVE. Par exemple :

- fix CVE-2012-1234, denial of service through user stupidity (fix-cve-2012-1234.patch, from upstream).

Modifications du fichier de spécifications

Soyez aussi précis que possible ! Ceci est d’autant plus important si vous supprimez quelque chose du fichier spec.

  • Supprimer du code source originel doit être déclaré dans le fichier spec avec un commentaire ("Useful for FreeBSD only" par exemple) - il n’est pas nécessaire de répéter le commentaire dans le fichier de spécification.
  • Les commandes supplémentaires (par exemple durant %install) peuvent être illustrées avec un court commentaire dans le fichier de spécification.
  • Ajouter/supprimer des paquets de Requires/Provides doit être décrit dans le journal de modifications.
  • Une chose qui ne doit pas être faite sans en avertir avec le mainteneur avant de manipuler, est de ré-indenter quelques parties du fichier SPEC. Quoique, seulement les petits changements dans le fichier spec (comme le changement d’une tabulation par deux entre deux balises du préambule et des valeurs) la différence qui est produite par ça sera énorme.

Modifications du code source

Commentez les changements les plus importants, mais limitez la verbosité.

  • Regardez dans le journal de modifications et sélectionnez les changements les plus importants pour la distribution (les changements pour d’autres systèmes d’exploitations ne sont pas fondamentaux). Incluez ce qui a changé dans la nouvelle version, habituellement, le niveau de détail du fichier NEWS ; les fichiers des registres des changements sont généralement trop longs. Plus de 10-15 lignes ne sont pas nécessaires pour décrire les changements les plus importants.
  • Arrangez les changements originaux derrière l’information de mise à jour de version. Exemple :
- Update to 1.3.2: + fixes memory leak in import function + new API command: unlock_client() + the following bugs are closed by this new upstream release: ++ ............ [mga:332] ++ ............ [mga:337] - split of devel package
  • si l’amont ne produit pas un registre de changements plein de sens, alors faites seulement de votre mieux. Ne perdez pas trop de temps à ça.
  • Si l’archive de l’amont n’a vraiment aucun registre de changement excepté un numéro de version différent, ajoutez simplement le numéro de version dans le journal de modifications fera l’affaire. C’est pareil pour les paquets qui ne contiennent juste quelques graphiques ou thèmes (sauf si l’amont fourni déjà quelque chose qui convient). Si les changements de l’amont consistent juste à « mise à jour des traductions » ou « réparation que quelques bogues », rien que ça suffise pour l’entrée du journal de modifications (à moins que ces correctifs contiennent quelque chose que vous trouvez en valoir la peine).

Empaquetage des bibliothèques statiques

Les paquets incluant des bibliothèques devraient exclure celles qui sont statiques dans la mesure du possible (par exemple en configurant avec --disable-static). Les bibliothèques logicielles statiques devraient être incluses uniquement dans des circonstances exceptionnelles. Les logiciels qui sont liés aux bibliothèques statiques devraient autant que possible être liés aux versions partagées des bibliothèques.

Les fichiers .a et .la ne devraient généralement pas être inclus nulle part. Ils sont utiles uniquement lorsque quelqu’un veut lier statiquement un programme à une bibliothèque (par exemple inclure la bibliothèque dans le binaire du programme lui-même, de cette manière la bibliothèque n’est plus nécessaire lors de l’exécution du programme), ce qui n’est généralement pas le cas dans Mageia. Les archives Libtool, les fichiers foo.la ne doivent pas être inclus. Les paquets utilisant libtool l’installeront par défaut même si vous spécifiez --disable-static dans la configuration, alors ils seront à supprimer avant l’empaquetage. À cause de bogues dans les anciennes versions de libtool ou de bogues dans les programmes qui l’utilisent, parfois il n’est pas possible de supprimer les fichiers .la sans modifier le programme. Dans la plupart des cas, il est facile de travailler de concours avec l’amont du logiciel pour régler ces problèmes. Notez que si vous chargez une bibliothèque dans sa version stage (pas en développement) et que le paquet contiennent déjà des fichiers .la, les supprimer doit être considéré comment un changement API/ABI -- c’est-à-dire, les supprimer change l’interface que la bibliothèque donne au reste du monde et ne doit pas être entrepris à la légère.

Empaquetage des bibliothèques statiques

  • En général, les empaqueteurs sont fortement découragés à envoyer des bibliothèques statiques à moins qu’une irrésistible raison existe.
  • Nous voulons être en mesure de traquer quels paquets utilisent des bibliothèquess statiques (comme ça, nous pouvons trouver quels paquets il est nécessaire de reconstruire au cas où un défaut de sécurité dans une bibliothèque statique est réglé par exemple). Il y a deux cas où une bibliothèque statique est empaqueté :
  1. bibliothèque statique et bibliothèque partagé Dans ce cas, la bibliothèque statique doit être placée dans un sous-paquet *-statis-devel. Séparer les bibliothèques statiques des autres ficheirs de développement dans un *-devel nous permet de traquer cet usage en vérifiant quels paquets dépendent pour leur construction BuildRequire le paquet *-static-devel. L’intention est, lorsqu’il est possible, d’éloigner ces paquets de l’utilisation des bibliothèques statiques vers les bibliothèques partagées.
  2. bibliothèques statiques uniquement. Quand un paquet fournit uniquement des bibliothèques statiques, vous pouvez placer tous les fichiers de bibliothèques statiques dans un sous-paquet *-devel.
  • Si (et seulement si) un paquet à une bibliothèque partagée qui requière une bibliothèque statique pour être fonctionnelle, les bibliothèques statiques peuvent être incluses dans un sous-paquet *-devel.

Lier statiquement les exécutables

  • La liaison statique est une exception spéciale et doit être décidée au cas par cas. L’empaqueteur doit fournir une justification de la liaison statique, pour obtenir une approbation.

Rendre un paquet obsolète

Lorsqu’un paquet devient inutile dans la distribution, il doit être rendu obsolète ou supprimé de la cauldron/du chaudron.

Pour rendre obsolète et supprimer un paquet du chaudron :

  • Sur SVN, déplacer le paquet dans le répertoire svn+ssh://svn.mageia.org/svn/packages/obsolete/ (veuillez aussi voir Comment abandonner un paquet depuis SVN (en)).
  • Si un paquet est remplacé par un autre qui fourni les mêmes fonctionnalités, ajoutez-le comme obsolète dans un nouveau paquet. Utilisez des obsolètes versionnés est recommandé (Obsolète : foo < dernière version du chaudron + 1) - Ceci s’applique pour tous les sous-paquets qui devraient être obsolètes !
  • Si un paquet n’est pas remplacé par un autre et est simplement abandonné, rendez-le obsolète par le paquet task-obsolete. N’oubliez pas d’ajouter un commentaire avec la raison de l’obsolescence ou un lien vers la discussion de la liste de diffusion expliquant les raisons.). Utiliser des obsolètes versionnés est recommandé (Obsolète : foo < dernière version du chaudron +1) - ceci s’applique pour tous les sous-paquets qui devraient être obsolètes !

Quand un paquet est rendu obsolète par un autre paquet, il sera automatiquement supprimé des dépôts du chaudron.

Ceci a été importé depuis MeeGo wiki sous licence CC-By 3.0
Comme le wiki n’existe plus, regardez sa version archivée : http://wayback.archive.org/web/20130903235324/http://wiki.meego.com/Main_Page

Langages de programmation spécifiques

Voir https://en.opensuse.org/openSUSE:Packaging_nodejs (en)

Retour au Portail d'information de l'équipe de construction des paquets.