diff options
Diffstat (limited to 'doc/contributing.fr.texi')
-rw-r--r-- | doc/contributing.fr.texi | 505 |
1 files changed, 505 insertions, 0 deletions
diff --git a/doc/contributing.fr.texi b/doc/contributing.fr.texi new file mode 100644 index 0000000000..0ded44c5fd --- /dev/null +++ b/doc/contributing.fr.texi @@ -0,0 +1,505 @@ +@node Contribuer +@chapter Contribuer + +Ce projet est un effort coopératif et nous avons besoin de votre aide pour +le faire grandir ! Contactez-nous sur @email{guix-devel@@gnu.org} et +@code{#guix} sur le réseau IRC Freenode. Nous accueillons les idées, les +rapports de bogues, les correctifs et tout ce qui pourrait aider le +projet. Nous apprécions particulièrement toute aide sur la création de +paquets (@pxref{Consignes d'empaquetage}). + +@cindex code de conduite, des contributeurs +@cindex convention de contribution +Nous souhaitons fournir un environnement chaleureux, amical et sans +harcèlement pour que tout le monde puisse contribuer au mieux de ses +capacités. Pour cela notre projet a une « Convention de contribution » +adaptée de @url{http://contributor-covenant.org/}. Vous pouvez trouver une +version locale dans le fichier @file{CODE-OF-CONDUCT} dans l'arborescence +des sources. + +Les contributeurs n'ont pas besoin d'utiliser leur nom légal dans leurs +correctifs et leurs communications en ligne ; ils peuvent utiliser n'importe +quel nom ou pseudonyme de leur choix. + +@menu +* Construire depuis Git:: The latest and greatest. +* Lancer Guix avant qu'il ne soit installé:: Astuces pour les hackers. +* La configuration parfaite:: Les bons outils. +* Style de code:: Hygiène du contributeur. +* Envoyer des correctifs:: Partager votre travail. +@end menu + +@node Construire depuis Git +@section Construire depuis Git + +Si vous souhaitez travailler sur Guix lui-même, il est recommandé d'utiliser +la dernière version du dépôt Git : + +@example +git clone https://git.savannah.gnu.org/git/guix.git +@end example + +Lors de la construction de Guix depuis un extrait, les paquets suivants sont +requis en plus de ceux mentionnés dans les instructions d'installation +(@pxref{Prérequis}). + +@itemize +@item @url{http://gnu.org/software/autoconf/, GNU Autoconf}; +@item @url{http://gnu.org/software/automake/, GNU Automake}; +@item @url{http://gnu.org/software/gettext/, GNU Gettext}; +@item @url{http://gnu.org/software/texinfo/, GNU Texinfo}; +@item @url{http://www.graphviz.org/, Graphviz}; +@item @url{http://www.gnu.org/software/help2man/, GNU Help2man (facultatif)}. +@end itemize + +La manière la plus simple de configurer un environnement de développement +pour Guix est, bien sûr, d'utiliser Guix ! La commande suivante démarre un +nouveau shell où toutes les dépendances et les variables d'environnements +appropriées sont configurés pour travailler sur Guix : + +@example +guix environment guix +@end example + +@xref{Invoquer guix environment}, pour plus d'information sur cette +commande. On peut ajouter des dépendances supplémentaires avec +@option{--ad-hoc} : + +@example +guix environment guix --ad-hoc help2man git strace +@end example + +Lancez @command{./bootstrap} pour générer l'infrastructure du système de +construction avec Autoconf et Automake. Si vous avez une erreur comme : + +@example +configure.ac:46: error: possibly undefined macro: PKG_CHECK_MODULES +@end example + +@noindent +cela signifie probablement qu'Autoconf n'a pas pu trouver @file{pkg.m4} qui +est fournit par pkg-config. Assurez-vous que @file{pkg.m4} est +disponible. C'est aussi vrai pour l'ensemble de macros de @file{guile.m4} +fournies par Guile. Par exemple, si vous avez installé Automake dans +@file{/usr/local}, il ne cherchera pas les fichiers @file{.m4} dans +@file{/usr/share}. Dans ce case vous devez invoquer la commande suivante : + +@example +export ACLOCAL_PATH=/usr/share/aclocal +@end example + +@xref{Macro Search Path,,, automake, The GNU Automake Manual}, pour plus +d'information. + +Ensuite, lancez @command{./configure} comme d'habitude. Assurez-vous de +passer @code{--localstatedir=@var{directory}} où @var{directory} est la +valeur @code{localstatedir} utilisée par votre installation actuelle +(@pxref{Le dépôt} pour plus d'informations à ce propos). + +Finalement, vous devez invoquer @code{make check} pour lancer les tests +(@pxref{Lancer la suite de tests}). Si quelque chose échoue, jetez un œil +aux instructions d'installation (@pxref{Installation}) ou envoyez un message +à la list @email{guix-devel@@gnu.org}. + + +@node Lancer Guix avant qu'il ne soit installé +@section Lancer Guix avant qu'il ne soit installé + +Pour garder un environnement de travail sain, il est utile de tester les +changement localement sans les installer pour de vrai. Pour pouvoir +distinguer votre rôle « d'utilisateur final » de celui parfois haut en +couleur de « développeur ». + +Pour cela, tous les outils en ligne de commande sont utilisables même sans +avoir lancé @code{make install}. Vous devez pour cela préfixer chaque +commande par @command{./pre-inst-env} (le script @file{pre-inst-env} se +trouve dans le répertoire de plus haut niveau de l'arborescence des sources +de Guix) comme cela@footnote{L'option @option{-E} de @command{sudo} garantie +que @code{GUILE_LOAD_PATH} est bien paramétré pour @command{guix-daemon} et +les outils qu'il utilise puissent trouver les modules Guile dont ils ont +besoin.} : + +@example +$ sudo -E ./pre-inst-env guix-daemon --build-users-group=guixbuild +$ ./pre-inst-env guix build hello +@end example + +@noindent +De même, pour une session Guile qui utilise les modules Guix : + +@example +$ ./pre-inst-env guile -c '(use-modules (guix utils)) (pk (%current-system))' + +;;; ("x86_64-linux") +@end example + +@noindent +@cindex REPL +@cindex read-eval-print loop +@dots{} et pour un REPL (@pxref{Using Guile Interactively,,, guile, Guile +Reference Manual}) + +@example +$ ./pre-inst-env guile +scheme@@(guile-user)> ,use(guix) +scheme@@(guile-user)> ,use(gnu) +scheme@@(guile-user)> (define snakes + (fold-packages + (lambda (package lst) + (if (string-prefix? "python" + (package-name package)) + (cons package lst) + lst)) + '())) +scheme@@(guile-user)> (length snakes) +$1 = 361 +@end example + +Le script @command{pre-inst-env} paramètre toutes les variables +d'environnement nécessaires, dont @env{PATH} et @env{GUILE_LOAD_PATH}. + +Remarquez que @command{./pre-inst-env guix pull} ne met @emph{pas} à jour +l'arborescence des sources locale ; il met seulement à jour le lien +symbolique @file{~/.config/guix/latest} (@pxref{Invoquer guix pull}). Lancez +@command{git pull} à la place si vous voulez mettre à jour votre +arborescence des sources locale@footnote{Si vous voulez paramétrer +@command{guix} pour qu'il utilise votre dépôt Git, vous pouvez faire pointer +le lien symbolique @file{~/.config/guix/latest} vers le répertoire contenant +ce dépôt. Si vous le seul utilisateur du système, vous pouvez aussi +considérer faire pointer le lien symbolique @file{/root/.config/guix/latest} +vers @file{~/.config/guix/latest} ; comme ça root aura toujours la même +commande @command{guix} que votre utilisateur}. + + +@node La configuration parfaite +@section La configuration parfaite + +La configuration parfaite pour travailler sur Guix est simplement la +configuration parfaite pour travailler en Guile (@pxref{Using Guile in +Emacs,,, guile, Guile Reference Manual}). Tout d'abord, vous avez besoin de +mieux qu'un éditeur de texte, vous avez besoin de +@url{http://www.gnu.org/software/emacs, Emacs}, amélioré par le superbe +@url{http://nongnu.org/geiser/, Geiser}. + +Geiser permet le développement interactif et incrémental depuis Emacs : la +compilation du code et son évaluation depuis les buffers, l'accès à la +documentation en ligne (docstrings), la complétion sensible au contexte, +@kbd{M-.} pour sauter à la définition d'un objet, un REPL pour tester votre +code, et bien plus (@pxref{Introduction,,, geiser, Geiser User +Manual}). Pour travailler confortablement sur Guix, assurez-vous de modifier +le chemin de chargement de Guile pour qu'il trouve les fichiers source de +votre dépôt : + +@lisp +;; @r{Si l'extrait est dans ~/src/guix.} +(with-eval-after-load 'geiser-guile + (add-to-list 'geiser-guile-load-path "~/src/guix")) +@end lisp + +To actually edit the code, Emacs already has a neat Scheme mode. But in +addition to that, you must not miss +@url{http://www.emacswiki.org/emacs/ParEdit, Paredit}. It provides +facilities to directly operate on the syntax tree, such as raising an +s-expression or wrapping it, swallowing or rejecting the following +s-expression, etc. + +@cindex extraits de code +@cindex modèles +@cindex réduire la quantité de code commun +Nous fournissons aussi des modèles pour les messages de commit git communs +et les définitions de paquets dans le répertoire @file{etc/snippets}. Ces +modèles s'utilisent avec @url{http://joaotavora.github.io/yasnippet/, +YASnippet} pour développer des chaînes courtes de déclenchement en extraits +de texte interactifs. Vous pouvez ajouter le répertoire des modèles dans la +variables @var{yas-snippet-dirs} d'Emacs. + +@lisp +;; @r{Si l'extrait est dans ~/src/guix.} +(with-eval-after-load 'yasnippet + (add-to-list 'yas-snippet-dirs "~/src/guix/etc/snippets")) +@end lisp + +Les extraits de messages de commit dépendent de @url{https://magit.vc/, +Magit} pour afficher les fichiers sélectionnés. Lors de la modification d'un +message de commit, tapez @code{add} suivi de @kbd{TAB} pour insérer un +modèle de message de commit pour ajouter un paquet ; tapez @code{update} +suivi de @kbd{TAB} pour insérer un modèle pour la mise à jour d'un paquet. + +L'extrait principal pour @code{scheme-mode} est lancé en tapant +@code{package…} suivi par @kbd{TAB}. Cet extrait insère aussi la chaîne de +déclenchement @code{origin…}, qui peut aussi être étendue. L'extrait +@code{origin} lui-même peut aussi insérer des chaînes de déclenchement qui +finissent sur @code{…}, qui peuvent aussi être étendues. + + +@node Style de code +@section Style de code + +En général notre code suit le Standard de Code GNU (@pxref{Top,,, standards, +GNU Coding Standards}). Cependant, il ne parle pas beaucoup de Scheme, donc +voici quelques règles supplémentaires. + +@menu +* Paradigme de programmation:: Comment composer vos éléments. +* Modules:: Où stocker votre code ? +* Types de données et reconnaissance de motif:: Implémenter des + structures de données. +* Formatage du code:: Conventions d'écriture. +@end menu + +@node Paradigme de programmation +@subsection Paradigme de programmation + +Le code Scheme dans Guix est écrit dans un style purement fonctionnel. Le +code qui s'occupe des entrées-sorties est une exception ainsi que les +procédures qui implémentent des concepts bas-niveau comme la procédure +@code{memoize}. + +@node Modules +@subsection Modules + +Les modules Guile qui sont sensés être utilisés du côté de la construction +doivent se trouver dans l'espace de nom @code{(guix build @dots{})}. Ils ne +doivent pas se référer à d'autres modules Guix ou GNU. Cependant il est +correct pour un module « côté hôte » de dépendre d'un module coté +construction. + +Les modules qui s'occupent du système GNU général devraient se trouver dans +l'espace de nom @code{(gnu @dots{})} plutôt que @code{(guix @dots{})}. + +@node Types de données et reconnaissance de motif +@subsection Types de données et reconnaissance de motif + +La tendance en Lisp classique est d'utiliser des listes pour tout +représenter et de naviguer dedans « à la main ( avec @code{car}, @code{cdr}, +@code{cadr} et compagnie. Il y a plusieurs problèmes avec ce style, +notamment le fait qu'il soit dur à lire, source d'erreur et un obstacle aux +rapports d'erreur bien typés. + +Le code de Guix devrait définir des types de données appropriées (par +exemple, avec @code{define-record-type*}) plutôt que d'abuser des listes. En +plus, il devrait utiliser la recherche de motifs, via le module Guile +@code{(ice-9 match)}, surtout pour rechercher dans des listes. + +@node Formatage du code +@subsection Formatage du code + +@cindex formater le code +@cindex style de code +Lorsque nous écrivons du code Scheme, nous suivons la sagesse commune aux +programmeurs Scheme. En général, nous suivons les +@url{http://mumble.net/~campbell/scheme/style.txt, règles de style de +Riastradh}. Ce document décrit aussi les conventions utilisées dans le code +de Guile. Il est bien pensé et bien écrit, alors n'hésitez pas à le lire. + +Certaines formes spéciales introduites dans Guix comme la macro +@code{substitute*} ont des règles d'indentation spécifiques. Elles sont +définies dans le fichier @file{.dir-locals.el} qu'Emacs utilise +automatiquement. Remarquez aussi qu'Emacs-Guix fournit le mode +@code{guix-devel-mode} qui indente et colore le code Guix correctement +(@pxref{Development,,, emacs-guix, The Emacs-Guix Reference Manual}). + +@cindex indentation, du code +@cindex formatage, du code +Si vous n'utilisez pas Emacs, assurez-vous que votre éditeur connaisse ces +règles. Pour indenter automatiquement une définition de paquet, vous pouvez +aussi lancer : + +@example +./etc/indent-code.el gnu/packages/@var{file}.scm @var{package} +@end example + +@noindent +Cela indente automatiquement la définition de @var{package} dans +@file{gnu/packages/@var{file}.scm} en lançant Emacs en mode commande. Pour +indenter un fichier complet, n'indiquez pas de second argument : + +@example +./etc/indent-code.el gnu/services/@var{file}.scm +@end example + +Nous demandons que toutes les procédure de premier niveau contiennent une +chaîne de documentation. Ce pré-requis peut être relâché pour les procédures +privées simples dans l'espace de nom @code{(guix build @dots{})} cependant. + +Les procédures ne devraient pas avoir plus de quatre paramètres +positionnés. Utilisez des paramètres par mot-clefs pour les procédures qui +prennent plus de quatre paramètres. + + +@node Envoyer des correctifs +@section Envoyer des correctifs + +Le développement se fait avec le système de contrôle de version Git. Ainsi, +l'accès au dépôt n'est pas strictement nécessaire. Nous accueillons les +contributions sous forme de correctifs produits par @code{git format-patch} +envoyés sur la liste de diffusion @email{guix-patches@@gnu.org}. + +Cette liste de diffusion est gérée par une instance Debbugs accessible à +l'adresse @uref{https://bugs.gnu.org/guix-patches}, qui nous permet de +suivre les soumissions. Chaque message envoyé à cette liste se voit +attribuer un numéro de suivi ; les gens peuvent ensuite répondre à cette +soumission en envoyant un courriel à @code{@var{NNN}@@debbugs.gnu.org}, où +@var{NNN} est le numéro de suivi (@pxref{Envoyer une série de correctifs}). + +Veuillez écrire les messages de commit dans le format ChangeLog +(@pxref{Change Logs,,, standards, GNU Coding Standards}) ; vous pouvez +regarder l'historique des commits pour trouver des exemples. + +Avant de soumettre un correctif qui ajoute ou modifie la définition d'un +paquet, veuillez vérifier cette check-list : + +@enumerate +@item +Si les auteurs du paquet logiciel fournissent une signature cryptographique +pour l'archive, faîtes un effort pour vérifier l'authenticité de +l'archive. Pour un fichier de signature GPG détaché, cela se fait avec la +commande @code{gpg --verify}. + +@item +Prenez un peu de temps pour fournir un synopsis et une description adéquats +pour le paquet. Voir @xref{Synopsis et descriptions} pour quelques lignes +directrices. + +@item +Lancez @code{guix lint @var{paquet}}, où @var{paquet} est le nom du nouveau +paquet ou du paquet modifié, et corrigez les erreurs qu'il rapporte +(@pxref{Invoquer guix lint}). + +@item +Assurez-vous que le paquet se construise sur votre plate-forme avec +@code{guix build @var{paquet}}. + +@item +@cindex construction groupée +Assurez-vous que le paquet n'utilise pas de copie groupée d'un logiciel déjà +disponible dans un paquet séparé. + +Parfois, les paquets incluent des copie du code source de leurs dépendances +pour le confort de leurs utilisateurs. Cependant, en tant que distribution, +nous voulons nous assurer que ces paquets utilisent bien les copient que +nous avons déjà dans la distribution si elles existent. Cela améliore +l'utilisation des ressources (la dépendance n'est construite et stockée +qu'une seule fois) et permet à la distribution de faire des changements +transversaux comme appliquer des correctifs de sécurité pour un paquet donné +depuis un unique emplacement et qu'ils affectent tout le système, ce +qu'empêchent les copies groupées. + +@item +Regardez le profile rapporté par @command{guix size} (@pxref{Invoquer guix size}). Cela vous permettra de remarquer des références à d'autres paquets +qui ont été retenus. Il peut aussi aider à déterminer s'il faut découper le +paquet (@pxref{Des paquets avec plusieurs résultats}) et quelle dépendance +facultative utiliser. + +@item +Pour les changements important, vérifiez que les paquets qui en dépendent +(s'ils existent) ne sont pas affectés par le changement ; @code{guix refresh +--list-dependant @var{paquet}} vous aidera (@pxref{Invoquer guix refresh}). + +@c =========================================================================== +@c +@c This file was generated with po4a. Translate the source file. +@c +@c =========================================================================== +@c See <https://lists.gnu.org/archive/html/guix-devel/2016-10/msg00933.html>. +@cindex stratégie de branche +@cindex stratégie de planification des reconstructions +Suivant le nombre de paquets dépendants et donc le nombre de reconstruction +induites, les commits vont vers des branches différentes, suivant ces +principes : + +@table @asis +@item 300 paquets dépendants ou moins +branche @code{master} (changements non-disruptifs). + +@item entre 300 et 1 200 paquets dépendants +branche @code{staging} (changemets non-disruptifs). Cette branche devrait +être fusionnées dans @code{master} tous les 3 semaines. Les changements par +thèmes (par exemple une mise à jour de la pile GNOME) peuvent aller dans une +branche spécifique (disons, @code{gnome-updates}). + +@item plus de 1 200 paquets dépendants +branche @code{core-updates} (peut inclure des changements majeurs et +potentiellement disruptifs). Cette branche devrait être fusionnée dans +@code{master} tous les 2,5 mois environ. +@end table + +Toutes ces branches sont gérées par notre ferme de construction et +fusionnées dans @code{master} une fois que tout a été construit +correctement. Cela nous permet de corriger des problèmes avant qu'ils +n'atteignent les utilisateurs et réduit la fenêtre pendant laquelle les +binaires pré-construits ne sont pas disponibles. + +@item +@cindex déterminisme, du processus de construction +@cindex construction reproductibles, vérification +Vérifiez si le processus de construction du paquet est déterministe. Cela +signifie typiquement vérifier qu'une construction indépendante du paquet +renvoie exactement le même résultat que vous avez obtenu, bit à bit. + +Une manière simple de le faire est de reconstruire le paquet plusieurs fois +à la suite sur votre machine (@pxref{Invoquer guix build}) : + +@example +guix build --rounds=2 mon-paquet +@end example + +Cela est suffisant pour trouver une classe de non-déterminisme commune, +comme l'horodatage ou des sorties générées aléatoirement dans le résultat de +la construction. + +Une autre option consiste à utiliser @command{guix challenge} +(@pxref{Invoquer guix challenge}). Vous pouvez lancer la commande une fois +que les paquets ont été commités et construits par @code{hydra.gnu.org} pour +vérifier s'il obtient le même résultat que vous. Mieux encore : trouvez une +autre machine qui peut le construire et lancez @command{guix publish}. Puis +la machine distante est sûrement différente de la vôtre, cela peut trouver +des problèmes de non-déterminisme liés au matériel — par exemple utiliser +une extension du jeu d'instruction — ou du noyau du système d'exploitation — +par exemple se reposer sur @code{uname} ou les fichiers de @file{/proc}. + +@item +Lorsque vous écrivez de la documentation, utilisez une formulation au genre +neutre lorsque vous vous référez à des personnes, comme le +@uref{https://fr.wikipedia.org/wiki/They_singulier, ``they''@comma{} +``their''@comma{} ``them'' singulier} (en anglais). + +@item +Vérifiez que votre correctif contienne seulement un ensemble de changements +liés. Grouper des changements non liés ensemble rend la revue plus difficile +et plus lente. + +Ajouter plusieurs paquet ou une mise à jour d'un paquet avec des corrections +dans ce paquet sont des exemples de changements sans rapport. + +@item +Suivez nos règles de formatage de code, éventuellement en lançant le script +@command{et/indent-code.el} pour le faire automatiquement (@pxref{Formatage +du code}). + +@end enumerate + +Lorsque vous envoyez un correctif à la liste de diffusion, utilisez +@samp{[PATCH] @dots{}} comme sujet. Vous pouvez utiliser votre client de +courriel ou la commande @command{git send-email} (@pxref{Envoyer une série +de correctifs}). Nous préférons recevoir des correctifs en texte brut, soit +en ligne, soit en pièce-jointe MIME. Nous vous conseillons de faire +attention si votre client de courriel change par exemple les retours à la +ligne ou l'indentation, ce qui peut casser les correctifs. + +Lorsqu'un bogue est résolu, veuillez fermer le fil en envoyant un courriel à +@email{@var{NNN}-done@@debbugs.gnu.org}. + +@unnumberedsubsec Envoyer une série de correctifs +@anchor{Envoyer une série de correctifs} +@cindex série de correctifs +@cindex @code{git send-email} +@cindex @code{git-send-email} + +@c Debbugs bug: https://debbugs.gnu.org/db/15/15361.html +Lorsque vous envoyez une série de correctifs (p.e. avec @code{git +send-email}), envoyez d'abord une premier message à +@email{guix-patches@@gnu.org} puis envoyez le reste des correctifs à +@email{@var{NNN}@@debbugs.gnu.org} pour vous assurer qu'ils seront groupés +ensemble. Voyez @uref{https://debbugs.gnu.org/Advanced.html, la +documentation de Debbugs} pour plus d'informations. |