From 15f1bff4b6f3a89cb0c9cd10f8cbefdc6d9ac350 Mon Sep 17 00:00:00 2001 From: Julien Lepiller Date: Sun, 17 Feb 2019 20:45:44 +0100 Subject: nls: Update 'fr' translation of the manual. --- doc/contributing.fr.texi | 539 +- doc/guix.fr.texi | 18524 +++++++++++++++++++++++---------------------- 2 files changed, 9962 insertions(+), 9101 deletions(-) (limited to 'doc') diff --git a/doc/contributing.fr.texi b/doc/contributing.fr.texi index 502de9f7f0..8900c7c704 100644 --- a/doc/contributing.fr.texi +++ b/doc/contributing.fr.texi @@ -25,6 +25,7 @@ quel nom ou pseudonyme de leur choix. * Construire depuis Git:: toujours le plus récent. * Lancer Guix avant qu'il ne soit installé:: Astuces pour les hackers. * La configuration parfaite:: Les bons outils. +* Consignes d'empaquetage:: Faire grandir la distribution. * Style de code:: Hygiène du contributeur. * Envoyer des correctifs:: Partager votre travail. @end menu @@ -99,7 +100,7 @@ valeur @code{localstatedir} utilisée par votre installation actuelle 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}. +à la liste @email{guix-devel@@gnu.org}. @node Lancer Guix avant qu'il ne soit installé @@ -169,12 +170,15 @@ arborescence des source locale. @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}. +The Perfect Setup to hack on Guix is basically the perfect setup used for +Guile hacking (@pxref{Using Guile in Emacs,,, guile, Guile Reference +Manual}). First, you need more than an editor, you need +@url{http://www.gnu.org/software/emacs, Emacs}, empowered by the wonderful +@url{http://nongnu.org/geiser/, Geiser}. To set that up, run: + +@example +guix package -i emacs guile emacs-geiser +@end example 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 @@ -229,6 +233,461 @@ déclenchement @code{origin…}, qui peut aussi être étendue. L'extrait finissent sur @code{…}, qui peuvent aussi être étendues. +@node Consignes d'empaquetage +@section Consignes d'empaquetage + +@cindex paquets, création +The GNU distribution is nascent and may well lack some of your favorite +packages. This section describes how you can help make the distribution +grow. + +Les paquets de logiciels libres sont habituellement distribués sous forme +@dfn{d'archives de sources} — typiquement des fichiers @file{.tar.gz} +contenant tous les fichiers sources. Ajouter un paquet à la distribution +signifie essentiellement deux choses : ajouter une @dfn{recette} qui décrit +comment construire le paquet, avec une liste d'autres paquets requis pour le +construire, et ajouter des @dfn{métadonnées de paquet} avec la recette, +comme une description et une licence. + +Dans Guix, toutes ces informations sont incorporées dans les +@dfn{définitions de paquets}. Les définitions de paquets fournissent une +vue de haut-niveau du paquet. Elles sont écrites avec la syntaxe du langage +de programmation Scheme ; en fait, pour chaque paquet nous définissons une +variable liée à la définition et exportons cette variable à partir d'un +module (@pxref{Modules de paquets}). Cependant, il n'est @emph{pas} nécessaire +d'avoir une connaissance approfondie du Scheme pour créer des paquets. Pour +plus d'informations sur les définitions des paquets, @pxref{Définition des paquets}. + +Une fois une définition de paquet en place, stocké dans un fichier de +l'arborescence des sources de Guix, il peut être testé avec la commande +@command{guix build} (@pxref{Invoquer guix build}). Par exemple, en +supposant que le nouveau paquet s'appelle @code{gnew}, vous pouvez lancer +cette commande depuis l'arborescence de construction de Guix (@pxref{Lancer Guix avant qu'il ne soit installé}) : + +@example +./pre-inst-env guix build gnew --keep-failed +@end example + +Utiliser @code{--keep-failed} rend facile le débogage des échecs car il +fournit l'accès à l'arborescence de construction qui a échouée. Une autre +sous-commande utile pour le débogage est @code{--log-file}, pour accéder au +journal de construction. + +Si le paquet n'est pas connu de la commande @command{guix}, il se peut que +le fichier source ait une erreur de syntaxe, ou qu'il manque une clause +@code{define-public} pour exporter la variable du paquet. Pour comprendre +cela, vous pouvez charger le module depuis Guile pour avoir plus +d'informations sur la véritable erreur : + +@example +./pre-inst-env guile -c '(use-modules (gnu packages gnew))' +@end example + +Once your package builds correctly, please send us a patch +(@pxref{Envoyer des correctifs}). Well, if you need help, we will be happy to +help you too. Once the patch is committed in the Guix repository, the new +package automatically gets built on the supported platforms by +@url{http://hydra.gnu.org/jobset/gnu/master, our continuous integration +system}. + +@cindex substitution +Users can obtain the new package definition simply by running @command{guix +pull} (@pxref{Invoquer guix pull}). When @code{@value{SUBSTITUTE-SERVER}} +is done building the package, installing the package automatically downloads +binaries from there (@pxref{Substituts}). The only place where human +intervention is needed is to review and apply the patch. + + +@menu +* Liberté logiciel:: Ce que la distribution peut contenir. +* Conventions de nommage:: Qu'est-ce qu'un bon nom ? +* Numéros de version:: Lorsque le nom n'est pas suffisant. +* Synopsis et descriptions:: Aider les utilisateurs à trouver le bon + paquet. +* Modules python:: Un peu de comédie anglaise. +* Modules perl:: Petites perles. +* Paquets java:: Pause café. +* Polices de caractères:: À fond les fontes. +@end menu + +@node Liberté logiciel +@subsection Liberté logiciel + +@c =========================================================================== +@c +@c This file was generated with po4a. Translate the source file. +@c +@c =========================================================================== +@c Adapted from http://www.gnu.org/philosophy/philosophy.html. +@cindex logiciel libre +Le système d'exploitation GNU a été développé pour que les utilisateurs +puissent utiliser leur ordinateur en toute liberté. GNU est un +@dfn{logiciel libre}, ce qui signifie que les utilisateur ont les +@url{http://www.gnu.org/philosophy/free-sw.fr.html,quatre libertés +essentielles} : exécuter le programmer, étudier et modifier le programme +sous sa forme source, redistribuer des copies exactes et distribuer les +versions modifiées. Les paquets qui se trouvent dans la distribution GNU ne +fournissent que des logiciels qui respectent ces quatre libertés. + +En plus, la distribution GNU suit les +@url{http://www.gnu.org/distros/free-system-distribution-guidelines.html,recommandations +pour les distributions systèmes libres}. Entre autres choses, ces +recommandations rejettent les microgiciels non libres, les recommandations +de logiciels non libres et discute des façon de gérer les marques et les +brevets. + +Certaines sources amont autrement parfaitement libres contiennent une petite +partie facultative qui viole les recommandations ci-dessus, par exemple car +cette partie est du code non-libre. Lorsque cela arrive, les éléments en +question sont supprimés avec des correctifs ou des bouts de codes appropriés +dans la forme @code{origin} du paquet (@pxref{Définition des paquets}). De cette +manière, @code{guix build --source} renvoie la source « libérée » plutôt que +la source amont sans modification. + + +@node Conventions de nommage +@subsection Conventions de nommage + +@cindex nom du paquet +Un paquet a en fait deux noms qui lui sont associés : d'abord il y a le nom +de la @emph{variable Scheme}, celui qui suit @code{define-public}. Par ce +nom, le paquet peut se faire connaître par le code Scheme, par exemple comme +entrée d'un autre paquet. Deuxièmement, il y a la chaîne dans le champ +@code{name} d'une définition de paquet. Ce nom est utilisé par les +commandes de gestion des paquets comme @command{guix package} et +@command{guix build}. + +Les deux sont habituellement les mêmes et correspondent à la conversion en +minuscule du nom du projet choisi en amont, où les underscores sont +remplacés par des tirets. Par exemple, GNUnet est disponible en tant que +@code{gnunet} et SDL_net en tant que @code{sdl-net}. + +Nous n'ajoutons pas de préfixe @code{lib} au bibliothèques de paquets, à +moins qu'il ne fasse partie du nom officiel du projet. Mais @pxref{Modules python} et @ref{Modules perl} pour des règles spéciales concernant les +modules pour les langages Python et Perl. + +Les noms de paquets de polices sont gérés différemment, @pxref{Polices de caractères}. + + +@node Numéros de version +@subsection Numéros de version + +@cindex version du paquet +Nous n'incluons en général que la dernière version d'un projet de logiciel +libre donné. Mais parfois, par exemple pour des versions incompatibles de +bibliothèques, deux (ou plus) versions du même paquet sont requises. Elles +ont besoin d'un nom de variable Scheme différent. Nous utilisons le nom +défini dans @ref{Conventions de nommage} pour la version la plus récente ; les +versions précédentes utilisent le même nom, suffixé par @code{-} et le plus +petit préfixe du numéro de version qui permet de distinguer deux versions. + +Le nom dans la définition du paquet est le même pour toutes les versions +d'un paquet et ne contient pas de numéro de version. + +Par exemple, les version 2.24.20 et 3.9.12 de GTK+ peuvent être inclus de +cette manière : + +@example +(define-public gtk+ + (package + (name "gtk+") + (version "3.9.12") + ...)) +(define-public gtk+-2 + (package + (name "gtk+") + (version "2.24.20") + ...)) +@end example +Si nous voulons aussi GTK+ 3.8.2, cela serait inclus de cette manière : +@example +(define-public gtk+-3.8 + (package + (name "gtk+") + (version "3.8.2") + ...)) +@end example + +@c See , +@c for a discussion of what follows. +@cindex numéro de version, pour les instantanés des systèmes de contrôle de version +Parfois, nous incluons des paquets provenant d'instantanés de systèmes de +contrôle de version (VCS) au lieu de versions publiées formellement. Cela +devrait rester exceptionnel, car c'est le rôle des développeurs amont de +spécifier quel est la version stable. Cependant, c'est parfois nécessaire. +Donc, que faut-il mettre dans le champ @code{version} ? + +Clairement, nous devons rendre l'identifiant de commit de l'instantané du +VCS visible dans la version, mais nous devons aussi nous assurer que la +version augmente de manière monotone pour que @command{guix package +--upgrade} puisse déterminer quelle version est la plus récente. Comme les +identifiants de commits, notamment avec Git, n'augmentent pas, nous ajoutons +un numéro de révision qui nous augmentons à chaque fois que nous mettons à +jour vers un nouvel instantané. La chaîne qui en résulte ressemble à cela : + +@example +2.0.11-3.cabba9e + ^ ^ ^ + | | `-- ID du commit en amont + | | + | `--- révision du paquet Guix + | +dernière version en amont +@end example + +C'est une bonne idée de tronquer les identifiants dans le champ +@code{version} à disons 7 caractères. Cela évite un problème esthétique (en +supposant que l'esthétique ait un rôle à jouer ici) et des problèmes avec +les limites de l'OS comme la longueur maximale d'un shebang (127 octets pour +le noyau Linux). Il vaut mieux utilise l'identifiant de commit complet dans +@code{origin} cependant, pour éviter les ambiguïtés. Une définition de +paquet peut ressembler à ceci : + +@example +(define my-package + (let ((commit "c3f29bc928d5900971f65965feaae59e1272a3f7") + (revision "1")) ;révision du paquet Guix + (package + (version (git-version "0.9" revision commit)) + (source (origin + (method git-fetch) + (uri (git-reference + (url "git://example.org/my-package.git") + (commit commit))) + (sha256 (base32 "1mbikn@dots{}")) + (file-name (git-file-name name version)))) + ;; @dots{} + ))) +@end example + +@node Synopsis et descriptions +@subsection Synopsis et descriptions + +@cindex description du paquet +@cindex résumé du paquet +Comme nous l'avons vu avant, chaque paquet dans GNU@tie{}Guix contient un +résumé et une description (@pxref{Définition des paquets}). Les résumés et les +descriptions sont importants : ce sont eux que recherche @command{guix +package --search}, et c'est une source d'informations cruciale pour aider +les utilisateurs à déterminer si un paquet donner correspond à leurs +besoins. En conséquence, les mainteneurs doivent prêter attention à leur +contenu. + +Les résumés doivent commencer par une lettre capitale et ne doit pas finir +par un point. Ils ne doivent pas commencer par « a » ou « the » (« un » ou +« le/la »), ce qui n'apporte généralement rien ; par exemple, préférez « +File-frobbing tool » (« Outil de frobage de fichier ») à « A tool that frobs +file » (« Un outil qui frobe les fichiers »). Le résumé devrait dire ce que +le paquet est — p.@: ex.@: « Utilitaire du cœur de GNU (fichier, text, +shell) » — ou ce à quoi il sert — p.@: ex.@: le résumé de grep est « Affiche +des lignes correspondant à un motif ». + +Gardez à l'esprit que le résumé doit avoir un sens pour une large audience. +Par exemple « Manipulation d'alignements au format SAM » peut avoir du sens +pour un bioinformaticien chevronné, mais n'aidera pas ou pourra perdre une +audience de non-spécialistes. C'est une bonne idée de créer un résumé qui +donne une idée du domaine d'application du paquet. Dans cet exemple, cela +donnerait « Manipulation d'alignements de séquences de nucléotides », ce qui +devrait donner une meilleure idée à l'utilisateur pour savoir si c'est ce +qu'il recherche. + +Les descriptions devraient faire entre cinq et dix lignes. Utilisez des +phrases complètes, et évitez d'utiliser des acronymes sans les introduire +d'abord. Évitez les phrases marketings comme « world-leading », « +industrial-strength » et « next-generation » et évitez les superlatifs comme +« the most advanced » — ils ne sont pas utiles pour les utilisateurs qui +cherchent un paquet et semblent même un peu suspects. À la place, essayez +d'être factuels, en mentionnant les cas d'utilisation et les +fonctionnalités. + +@cindex balisage texinfo, dans les descriptions de paquets +Les descriptions peuvent inclure du balisage Texinfo, ce qui est utile pour +introduire des ornements comme @code{@@code} ou @code{@@dfn}, des listes à +points ou des hyperliens (@pxref{Overview,,, texinfo, GNU Texinfo}). +Cependant soyez prudents lorsque vous utilisez certains symboles, par +exemple @samp{@@} et les accolades qui sont les caractères spéciaux de base +en Texinfo (@pxref{Special Characters,,, texinfo, GNU Texinfo}). Les +interfaces utilisateurs comme @command{guix package --show} prennent en +charge le rendu. + +Les résumés et les descriptions sont traduits par des volontaires +@uref{http://translationproject.org/domain/guix-packages.html, sur le projet +de traduction} pour que le plus d'utilisateurs possible puissent les lire +dans leur langue natale. Les interfaces utilisateurs les recherchent et les +affichent dans la langue spécifiée par le paramètre de régionalisation +actuel. + +Pour permettre à @command{xgettext} de les extraire comme des chaînes +traduisibles, les résumés et les descriptions @emph{doivent être des chaînes +litérales}. Cela signifie que vous ne pouvez pas utiliser +@code{string-append} ou @code{format} pour construire ces chaînes : + +@lisp +(package + ;; @dots{} + (synopsis "Ceci est traduisible") + (description (string-append "Ceci n'est " "*pas*" " traduisible."))) +@end lisp + +La traduction demande beaucoup de travail, donc en tant que packageur, +faîtes encore plus attention à vos résumés et descriptions car chaque +changement peut demander d'autant plus de travail de la part des +traducteurs. Pour les aider, il est possible de donner des recommandations +ou des instructions qu'ils pourront voir en insérant des commentaires +spéciaux comme ceci (@pxref{xgettext Invocation,,, gettext, GNU Gettext}) : + +@example +;; TRANSLATORS: "X11 resize-and-rotate" should not be translated. +(description "ARandR is designed to provide a simple visual front end +for the X11 resize-and-rotate (RandR) extension. @dots{}") +@end example + + +@node Modules python +@subsection Modules python + +@cindex python +Nous incluons actuellement Python 2 et Python 3, sous les noms de variables +Scheme @code{python-2} et @code{python} comme expliqué dans @ref{Numéros de version}. Pour éviter la confusion et les problèmes de noms avec d'autres +langages de programmation, il semble désirable que le nom d'un paquet pour +un module Python contienne le mot @code{python}. + +Certains modules ne sont compatibles qu'avec une version de Python, d'autres +avec les deux. Si le paquet Foo ne compile qu'avec Ptyhon 3, on le nomme +@code{python-foo} ; s'il ne compile qu'avec Python 2, on le nome +@code{python2-foo}. S'il est compatible avec les deux versions, nous créons +deux paquets avec les noms correspondant. + +If a project already contains the word @code{python}, we drop this; for +instance, the module python-dateutil is packaged under the names +@code{python-dateutil} and @code{python2-dateutil}. If the project name +starts with @code{py} (e.g.@: @code{pytz}), we keep it and prefix it as +described above. + +@subsubsection Spécifier les dépendances +@cindex entrées, pour les paquets Python + +Les informations de dépendances pour les paquets Python se trouvent +généralement dans l'arborescence des source du paquet, avec plus ou moins de +précision : dans le fichier @file{setup.py}, dans @file{requirements.txt} ou +dans @file{tox.ini}. + +Votre mission, lorsque vous écrivez une recette pour un paquet Python, est +de faire correspondre ces dépendances au bon type « d'entrée » +(@pxref{Référence de paquet, inputs}). Bien que l'importeur @code{pypi} fasse +du bon boulot (@pxref{Invoquer guix import}), vous devriez vérifier la liste +suivant pour déterminer où va telle dépendance. + +@itemize + +@item +Nous empaquetons Python 2 avec @code{setuptools} et @code{pip} installé +comme Python 3.4 par défaut. Ainsi, vous n'avez pas à spécifié ces +entrées. @command{guix lint} vous avertira si vous faîtes cela. + +@item +Les dépendances Python requises à l'exécutions vont dans +@code{propagated-inputs}. Elles sont typiquement définies dans le mot-clef +@code{install_requires} dans @file{setup.py} ou dans le fichier +@file{requirements.txt}. + +@item +Les paquets Python requis uniquement à la construction — p.@: ex.@: ceux +listés dans le mot-clef @code{setup_requires} de @file{setup.py} — ou +seulement pour les tests — p.@: ex.@: ceux dans @code{tests_require} — vont +dans @code{native-inputs}. La raison est qu'ils n'ont pas besoin d'être +propagés car ils ne sont pas requis à l'exécution et dans le cas d'une +compilation croisée, c'est l'entrée « native » qu'il nous faut. + +Les cadriciels de tests @code{pytest}, @code{mock} et @code{nose} sont des +exemples. Bien sûr si l'un de ces paquets est aussi requis à l'exécution, +il doit aller dans @code{propagated-inputs}. + +@item +Tout ce qui ne tombe pas dans les catégories précédentes va dans +@code{inputs}, par exemple des programmes pour des bibliothèques C requises +pour construire des paquets Python avec des extensions C. + +@item +Si un paquet Python a des dépendances facultatives (@code{extras_require}), +c'est à vous de décider de les ajouter ou non, en fonction du ratio entre +utilité et complexité (@pxref{Envoyer des correctifs, @command{guix size}}). + +@end itemize + + +@node Modules perl +@subsection Modules perl + +@cindex perl +Les programmes Perl utiles en soit sont nommés comme les autres paquets, +avec le nom amont en minuscule. Pour les paquets Perl contenant une seule +classe, nous utilisons le nom de la classe en minuscule, en remplaçant les +occurrences de @code{::} par des tirets et en préfixant le tout par +@code{perl-}. Donc la classe @code{XML::Parser} devient +@code{perl-xml-parser}. Les modules contenant plusieurs classes gardent +leur nom amont en minuscule et sont aussi préfixés par @code{perl-}. Ces +modules tendent à avoir le mot @code{perl} quelque part dans leur nom, que +nous supprimons en faveur du préfixe. Par exemple, @code{libwww-perl} +devient @code{perl-libwww}. + + +@node Paquets java +@subsection Paquets java + +@cindex java +Le programmes Java utiles en soit sont nommés comme les autres paquets, avec +le nom amont en minuscule. + +Pour éviter les confusions et les problèmes de nom avec d'autres langages de +programmation, il est désirable que le nom d'un paquet Java soit préfixé par +@code{java-}. Si un projet contient déjà le mot @code{java}, nous le +supprimons, par exemple le paquet @code{ngsjava} est empaqueté sous le nom +@code{java-ngs}. + +Pour les paquets java contenant une seul classe ou une petite hiérarchie de +classes, nous utilisons le nom de la classe en minuscule, en remplaçant les +occurrences de @code{.} par des tirets et en préfixant le tout par +@code{java-}. Donc la classe @code{apache.commons.cli} devient +@code{java-apache-commons-cli}. + + +@node Polices de caractères +@subsection Polices de caractères + +@cindex polices +Pour les polices qui n esont en général par installées par un utilisateurs +pour du traitement de texte, ou qui sont distribuées en tant que partie d'un +paquet logiciel plus gros, nous nous appuyons sur les règles générales pour +les logiciels ; par exemple, cela s'applique aux polices livrées avec le +système X.Org ou les polices qui font partie de TeX Live. + +Pour rendre plus facile la recherche par l'utilisateur, les noms des autres +paquets contenant seulement des polices sont construits ainsi, +indépendamment du nom du paquet en amont. + +Le nom d'un paquet contenant une unique famille de polices commence par +@code{font-} ; il est suivi du nom du fondeur et d'un tiret @code{-} si le +fondeur est connu, et du nom de la police, dont les espaces sont remplacés +par des tirets (et comme d'habitude, toutes les lettres majuscules sont +transformées en minuscules). Par exemple, la famille de polices Gentium de +SIL est empaqueté sous le nom @code{font-sil-gentium}. + +Pour un paquet contenant plusieurs familles de polices, le nom de la +collection est utilisée à la place du nom de la famille. Par exemple les +polices Liberation consistent en trois familles, Liberation Sans, Liberation +Serif et Liberation Mono. Elles pourraient être empaquetées séparément sous +les noms @code{font-liberation-sans} etc, mais comme elles sont distribuées +ensemble sous un nom commun, nous préférons les empaqueter ensemble en tant +que @code{font-liberation}. + +Dans le cas où plusieurs formats de la même famille ou collection sont +empaquetés séparément, une forme courte du format, préfixé d'un tiret est +ajouté au nom du paquet. Nous utilisont @code{-ttf} pour les polices +TrueType, @code{-otf} pour les polices OpenType et @code{-type1} pour les +polices Type 1 de PostScript. + + @node Style de code @section Style de code @@ -323,9 +782,8 @@ vous l'entrez. En plus, @code{paredit.vim}} peut vous aider à gérer toutes ces parenthèses. 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. +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 @@ -375,6 +833,33 @@ paquet ou du paquet modifié, et corrigez les erreurs qu'il rapporte Assurez-vous que le paquet se construise sur votre plate-forme avec @code{guix build @var{paquet}}. +@item +We recommend you also try building the package on other supported +platforms. As you may not have access to actual hardware platforms, we +recommend using the @code{qemu-binfmt-service-type} to emulate them. In +order to enable it, add the following service to the list of services in +your @code{operating-system} configuration: + +@example +(service qemu-binfmt-service-type + (qemu-binfmt-configuration + (platforms (lookup-qemu-platforms "arm" "aarch64" "ppc" "mips64el")) + (guix-support? #t))) +@end example + +Then reconfigure your system. + +You can then build packages for different platforms by specifying the +@code{--system} option. For example, to build the "hello" package for the +armhf, aarch64, powerpc, or mips64 architectures, you would run the +following commands, respectively: +@example +guix build --system=armhf-linux --rounds=2 hello +guix build --system=aarch64-linux --rounds=2 hello +guix build --system=powerpc-linux --rounds=2 hello +guix build --system=mips64el-linux --rounds=2 hello +@end example + @item @cindex construction groupée Assurez-vous que le paquet n'utilise pas de copie groupée d'un logiciel déjà @@ -391,21 +876,18 @@ 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. +Take a look at the profile reported by @command{guix size} (@pxref{Invoquer guix size}). This will allow you to notice references to other packages +unwillingly retained. It may also help determine whether to split the +package (@pxref{Des paquets avec plusieurs résultats}), and which optional +dependencies should be used. In particular, avoid adding @code{texlive} as +a dependency: because of its extreme size, use @code{texlive-tiny} or +@code{texlive-union} instead. @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 . @cindex stratégie de branche @cindex stratégie de planification des reconstructions @@ -418,7 +900,7 @@ principes : branche @code{master} (changements non-disruptifs). @item entre 300 et 1 200 paquets dépendants -branche @code{staging} (changemets non-disruptifs). Cette branche devrait +branche @code{staging} (changements 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}). @@ -460,15 +942,14 @@ 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}. +Another option is to use @command{guix challenge} (@pxref{Invoquer guix challenge}). You may run it once the package has been committed and built +by @code{@value{SUBSTITUTE-SERVER}} to check whether it obtains the same +result as you did. Better yet: Find another machine that can build it and +run @command{guix publish}. Since the remote build machine is likely +different from yours, this can catch non-determinism issues related to the +hardware---e.g., use of different instruction set extensions---or to the +operating system kernel---e.g., reliance on @code{uname} or @file{/proc} +files. @item Lorsque vous écrivez de la documentation, utilisez une formulation au genre diff --git a/doc/guix.fr.texi b/doc/guix.fr.texi index c8a01f18c6..4ef3c1a0ff 100644 --- a/doc/guix.fr.texi +++ b/doc/guix.fr.texi @@ -20,21 +20,25 @@ @set OPENPGP-SIGNING-KEY-ID 3CE464558A84FDC69DB40CFB090B11993D9AEBB5 @set KEY-SERVER pool.sks-keyservers.net +@c The official substitute server used by default. +@set SUBSTITUTE-SERVER ci.guix.fr.info + @copying -Copyright @copyright{} 2012, 2013, 2014, 2015, 2016, 2017, 2018 Ludovic -Courtès@* Copyright @copyright{} 2013, 2014, 2016 Andreas Enge@* Copyright -@copyright{} 2013 Nikita Karetnikov@* Copyright @copyright{} 2014, 2015, -2016 Alex Kost@* Copyright @copyright{} 2015, 2016 Mathieu Lirzin@* +Copyright @copyright{} 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019 +Ludovic Courtès@* Copyright @copyright{} 2013, 2014, 2016 Andreas Enge@* +Copyright @copyright{} 2013 Nikita Karetnikov@* Copyright @copyright{} 2014, +2015, 2016 Alex Kost@* Copyright @copyright{} 2015, 2016 Mathieu Lirzin@* Copyright @copyright{} 2014 Pierre-Antoine Rault@* Copyright @copyright{} 2015 Taylan Ulrich Bayırlı/Kammer@* Copyright @copyright{} 2015, 2016, 2017 -Leo Famulari@* Copyright @copyright{} 2015, 2016, 2017, 2018 Ricardo +Leo Famulari@* Copyright @copyright{} 2015, 2016, 2017, 2018, 2019 Ricardo Wurmus@* Copyright @copyright{} 2016 Ben Woodcroft@* Copyright @copyright{} 2016, 2017, 2018 Chris Marusich@* Copyright @copyright{} 2016, 2017, 2018 Efraim Flashner@* Copyright @copyright{} 2016 John Darrington@* Copyright @copyright{} 2016, 2017 Nils Gillmann@* Copyright @copyright{} 2016, 2017, -2018 Jan Nieuwenhuizen@* Copyright @copyright{} 2016 Julien Lepiller@* -Copyright @copyright{} 2016 Alex ter Weele@* Copyright @copyright{} 2017, -2018 Clément Lassieur@* Copyright @copyright{} 2017, 2018 Mathieu Othacehe@* +2018, 2019 Jan Nieuwenhuizen@* Copyright @copyright{} 2016 Julien Lepiller@* +Copyright @copyright{} 2016 Alex ter Weele@* Copyright @copyright{} 2016, +2017, 2018, 2019 Christopher Baines@* Copyright @copyright{} 2017, 2018 +Clément Lassieur@* Copyright @copyright{} 2017, 2018 Mathieu Othacehe@* Copyright @copyright{} 2017 Federico Beffa@* Copyright @copyright{} 2017, 2018 Carlo Zancanaro@* Copyright @copyright{} 2017 Thomas Danckaert@* Copyright @copyright{} 2017 humanitiesNerd@* Copyright @copyright{} 2017 @@ -62,7 +66,7 @@ Documentation License ». @direntry * Guix: (guix.fr). Gérer les logiciels installés et la configuration du système. -* guix package : (guix.fr)Invoquer guix package. Intaller, supprimer et +* guix package : (guix.fr)Invoquer guix package. Installer, supprimer et mettre à jour des paquets. * guix gc : (guix.fr)Invoquer guix gc. Récupérer de l'espace disque @@ -119,10 +123,19 @@ traduc@@traduc.org}. @menu * Introduction:: Qu'est-ce que Guix ? * Installation:: Installer Guix. +* Installation du système:: Installer le système d'exploitation complet. * Gestion de paquets:: Installation des paquets, mises à jour, etc. +* Development:: Guix-aided software development. * Interface de programmation:: Utiliser Guix en Scheme. * Utilitaires:: Commandes de gestion de paquets. -* Distribution GNU:: Des logiciels pour un système GNU convivial. +* Configuration système:: Configurer le système d'exploitation. +* Documentation:: Visualiser les manuels d'utilisateur des + logiciels. +* Installer les fichiers de débogage:: Nourrir le débogueur. +* Mises à jour de sécurité:: Déployer des correctifs de sécurité + rapidement. +* Bootstrapping:: GNU/Linux depuis zéro. +* Porter:: Cibler une autre plateforme ou un autre noyau. * Contribuer:: Nous avons besoin de votre aide ! * Remerciements:: Merci ! @@ -135,6 +148,13 @@ traduc@@traduc.org}. +Introduction + + + +* Managing Software the Guix Way:: What's special. +* Distribution GNU:: The packages and tools. + Installation @@ -159,6 +179,19 @@ Paramétrer le démon machines distantes. * Support de SELinux:: Utiliser une politique SELinux pour le démon. +Installation du système + + + +* Limitations:: Ce à quoi vous attendre. +* Considérations matérielles:: Matériel supporté. +* Installation depuis une clef USB ou un DVD:: Préparer le média + d'installation. +* Préparer l'installation:: Réseau, partitionnement, etc. +* Effectuer l'installation:: Pour de vrai. +* Installing Guix in a VM:: Guix System playground. +* Construire l'image d'installation:: D'où vient tout cela. + Gestion de paquets @@ -175,7 +208,6 @@ Gestion de paquets * Inférieurs:: Interagir avec une autre révision de Guix. * Invoquer guix describe:: Affiche des informations sur la révision Guix actuelle. -* Invoquer guix pack:: Créer des lots de logiciels. * Invoquer guix archive:: Exporter et importer des fichiers du dépôt. Substituts @@ -185,23 +217,32 @@ Substituts * Serveur de substituts officiel:: Une source particulière de substituts. * Autoriser un serveur de substituts:: Comment activer ou désactiver les substituts. -* Authentification des substituts:: Coment Guix vérifie les substituts. +* Authentification des substituts:: Comment Guix vérifie les substituts. * Paramètres de serveur mandataire:: Comment récupérer des substituts à travers un serveur mandataire. * Échec de substitution:: Qu'arrive-t-il quand la substitution échoue. * De la confiance en des binaires:: Comment pouvez-vous avoir confiance en un paquet binaire ? +Development + + + +* Invoquer guix environment:: Mettre en place des environnements de + développement. +* Invoquer guix pack:: Créer des lots de logiciels. + Interface de programmation +* Modules de paquets:: Les paquets du point de vu du programmeur. * Définition des paquets:: Définir de nouveaux paquets. * Systèmes de construction:: Spécifier comment construire les paquets. * Le dépôt:: Manipuler le dépôt de paquets. * Dérivations:: Interface de bas-niveau avec les dérivations de paquets. -* La monad du dépôt:: Interface purement fonctionnelle avec le +* La monade du dépôt:: Interface purement fonctionnelle avec le dépôt. * G-Expressions:: Manipuler les expressions de construction. * Invoquer guix repl:: S'amuser avec Guix de manière interactive. @@ -228,8 +269,6 @@ Utilitaires paquets. * Invoquer guix size:: Profiler l'utilisation du disque. * Invoquer guix graph:: Visualiser le graphe des paquets. -* Invoquer guix environment:: Mettre en place des environnements de - développement. * Invoquer guix publish:: Partager des substituts. * Invoquer guix challenge:: Défier les serveurs de substituts. * Invoquer guix copy:: Copier vers et depuis un dépôt distant. @@ -248,35 +287,6 @@ Invoquer @command{guix build} guix build ». * Débogage des échecs de construction:: La vie d'un empaqueteur. -Distribution GNU - - - -* Installation du système:: Installer le système d'exploitation complet. -* Configuration système:: Configurer le système d'exploitation. -* Documentation:: Visualiser les manuels d'utilisateur des - logiciels. -* Installer les fichiers de débogage:: Nourrir le débogueur. -* Mises à jour de sécurité:: Déployer des correctifs de sécurité - rapidement. -* Modules de paquets:: Les paquets du point de vu du programmeur. -* Consignes d'empaquetage:: Faire grandir la distribution. -* Bootstrapping:: GNU/Linux depuis zéro. -* Porter:: Cibler une autre plateforme ou un autre noyau. - -Installation du système - - - -* Limitations:: Ce à quoi vous attendre. -* Considérations matérielles:: Matériel supporté. -* Installation depuis une clef USB ou un DVD:: Préparer le média - d'installation. -* Préparer l'installation:: Réseau, partitionnement, etc. -* Effectuer l'installation:: Pour de vrai. -* Installer GuixSD dans une VM:: Jouer avec GuixSD@. -* Construire l'image d'installation:: D'où vient tout cela. - Configuration système @@ -300,8 +310,7 @@ Configuration système * Configuration du chargeur d'amorçage:: Configurer le chargeur d'amorçage. * Invoquer guix system:: Instantier une configuration du système. -* Lancer GuixSD dans une VM:: Comment lancer GuixSD dans une machine - virtuelle. +* Running Guix in a VM:: How to run Guix System in a virtual machine. * Définir des services:: Ajouter de nouvelles définitions de services. Services @@ -311,7 +320,7 @@ Services * Services de base:: Services systèmes essentiels. * Exécution de tâches planifiées:: Le service mcron. * Rotation des journaux:: Le service rottlog. -* Services réseau:: Paramétres réseau, démon SSH, etc. +* Services réseau:: Paramètres réseau, démon SSH, etc. * Système de fenêtrage X:: Affichage graphique. * Services d'impression:: Support pour les imprimantes locales et distantes. @@ -347,40 +356,6 @@ Définir des services * Référence de service:: Référence de l'API@. * Services Shepherd:: Un type de service particulier. -Consignes d'empaquetage - - - -* Liberté logiciel:: Ce que la distribution peut contenir. -* Conventions de nommage:: Qu'est-ce qu'un bon nom ? -* Numéros de version:: Lorsque le nom n'est pas suffisant. -* Synopsis et descriptions:: Aider les utilisateurs à trouver le bon - paquet. -* Modules python:: Un peu de comédie anglaise. -* Modules perl:: Petites perles. -* Paquets java:: Pause café. -* Polices de caractères:: À fond les fontes. - -Contribuer - - - -* Construire depuis Git:: toujours le plus récent. -* 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. - -Style de code - - - -* 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 detailmenu @end menu @@ -389,19 +364,37 @@ Style de code @chapter Introduction @cindex but -GNU Guix@footnote{« Guix » se prononce comme « geeks » (en prononçant le -« s »), ou « ɡiːks » dans l'alphabet phonétique international (API).} est un -outil de gestion de paquets pour le système GNU@. Guix facilite pour les -utilisateurs non privilégiés l'installation, la mise à jour et la -suppression de paquets, la restauration à un ensemble de paquets précédent, -la construction de paquets depuis les sources et plus généralement aide à la -création et à la maintenance d'environnements logiciels. +GNU Guix@footnote{``Guix'' is pronounced like ``geeks'', or ``ɡiːks'' using +the international phonetic alphabet (IPA).} is a package management tool for +and distribution of the GNU system. Guix makes it easy for unprivileged +users to install, upgrade, or remove software packages, to roll back to a +previous package set, to build packages from source, and generally assists +with the creation and maintenance of software environments. + +@cindex Guix System +@cindex GuixSD, now Guix System +@cindex Guix System Distribution, now Guix System +You can install GNU@tie{}Guix on top of an existing GNU/Linux system where +it complements the available tools without interference +(@pxref{Installation}), or you can use it as a standalone operating system +distribution, @dfn{Guix@tie{}System}@footnote{We used to refer to Guix +System as ``Guix System Distribution'' or ``GuixSD''. We now consider it +makes more sense to group everything under the ``Guix'' banner since, after +all, Guix System is readily available through the @command{guix system} +command, even if you're using a different distro underneath!}. @xref{Distribution GNU}. + +@menu +* Managing Software the Guix Way:: What's special. +* Distribution GNU:: The packages and tools. +@end menu + +@node Managing Software the Guix Way +@section Managing Software the Guix Way @cindex interfaces utilisateurs -Guix fournit une interface de gestion des paquets par la ligne de commande -(@pxref{Invoquer guix package}), un ensemble d'utilitaires en ligne de -commande (@pxref{Utilitaires}) ainsi que des interfaces de programmation -Scheme (@pxref{Interface de programmation}). +Guix provides a command-line package management interface (@pxref{Gestion de paquets}), tools to help with software development (@pxref{Development}), +command-line utilities for more advanced usage, (@pxref{Utilitaires}), as well +as Scheme programming interfaces (@pxref{Interface de programmation}). @cindex démon de construction Son @dfn{démon de construction} est responsable de la construction des paquets pour les utilisateurs (@pxref{Paramétrer le démon}) et du @@ -419,17 +412,6 @@ indépendants (@pxref{Modules de paquets}). Il est aussi définitions de paquets spécialisées à partir de définitions existantes, même depuis la ligne de commande (@pxref{Options de transformation de paquets}). -@cindex Distribution Système Guix -@cindex GuixSD -Vous pouvez installer GNU@tie{}Guix sur un système GNU/Linux existant pour -compléter les outils disponibles sans interférence (@pxref{Installation}) ou -vous pouvez l'utiliser à travers la @dfn{Distribution Système Guix} ou -GuixSD (@pxref{Distribution GNU}) distincte. Avec GNU@tie{}GuixSD, vous -@emph{déclarez} tous les aspects de la configuration du système -d'exploitation et Guix s'occupe de créer la configuration d'une manière -transactionnelle, reproductible et sans état (@pxref{Configuration -système}). - @cindex gestion de paquet fonctionnelle @cindex isolation Sous le capot, Guix implémente la discipline de @dfn{gestion de paquet @@ -463,34 +445,112 @@ transactionnels, l'installation différenciée par utilisateur et le ramassage de miettes pour les paquets (@pxref{Fonctionnalités}). +@node Distribution GNU +@section Distribution GNU + +@cindex Guix System +Guix comes with a distribution of the GNU system consisting entirely of free +software@footnote{The term ``free'' here refers to the +@url{http://www.gnu.org/philosophy/free-sw.html,freedom provided to users of +that software}.}. The distribution can be installed on its own +(@pxref{Installation du système}), but it is also possible to install Guix as a +package manager on top of an installed GNU/Linux system +(@pxref{Installation}). When we need to distinguish between the two, we +refer to the standalone distribution as Guix@tie{}System. + +la distribution fournit les paquets cœur de GNU comme la GNU libc, GCC et +Binutils, ainsi que de nombreuses applications GNU et non-GNU. La liste +complète des paquets disponibles se trouve +@url{http://www.gnu.org/software/guix/packages,en ligne} ou en lançant +@command{guix package} (@pxref{Invoquer guix package}) : + +@example +guix package --list-available +@end example + +Notre but est de fournir une distribution logicielle entièrement libre de +GNU/Linux et d'autres variantes de GNU, en se concentrant sur la promotion +et l'intégration étroite des composants GNU en insistant sur les programmes +et les outils qui aident l'utilisateur à exercer ses libertés. + +Les paquets sont actuellement disponibles pour les plateformes suivantes : + +@table @code + +@item x86_64-linux +l'architecture Intel et AMD @code{x86_64} avec le noyau Linux-libre ; + +@item i686-linux +l'architecture Intel 32-bits (IA32) avec le noyau Linux-libre ; + +@item armhf-linux +l'architecture ARMv7-A avec gestion des flottants matérielle, Thumb-2 et +NEON, avec l'interface binaire applicative (ABI) EABI hard-float et le noyau +Linux-libre ; + +@item aarch64-linux +les processeurs ARMv8-A 64-bits en little-endian avec le noyau Linux-libre. +Le support est actuellement expérimental et limité. @xref{Contribuer}, +pour savoir comment aider ! + +@item mips64el-linux +les processeurs MIPS 64-bits little-endian, spécifiquement la série +Loongson, ABI n32, avec le noyau Linux-libre. + +@end table + +With Guix@tie{}System, you @emph{declare} all aspects of the operating +system configuration and Guix takes care of instantiating the configuration +in a transactional, reproducible, and stateless fashion (@pxref{Configuration système}). Guix System uses the Linux-libre kernel, the Shepherd +initialization system (@pxref{Introduction,,, shepherd, The GNU Shepherd +Manual}), the well-known GNU utilities and tool chain, as well as the +graphical environment or system services of your choice. + +Guix System is available on all the above platforms except +@code{mips64el-linux}. + +@noindent +Pour des informations sur comment porter vers d'autres architectures et +d'autres noyau, @pxref{Porter}. + +La construction de cette distribution est un effort collaboratif et nous +vous invitons à nous rejoindre ! @xref{Contribuer}, pour des informations +sur la manière de nous aider. + + @c ********************************************************************* @node Installation @chapter Installation @cindex installer Guix -@cindex site officiel -GNU Guix est disponible au téléchargement depuis son site web sur -@url{http://www.gnu.org/software/guix/}. Cette section décrit les -pré-requis logiciels de Guix ainsi que la manière de l'installer et de se -préparer à l'utiliser. -Remarquez que cette section concerne l'installation du gestionnaire de -paquet, ce qui se fait sur un système GNU/Linux en cours d'exécution. Si -vous souhaitez plutôt installer le système d'exploitation GNU complet, -@pxref{Installation du système}. +@quotation Remarque +We recommend the use of this +@uref{https://git.savannah.gnu.org/cgit/guix.git/plain/etc/guix-install.sh, +shell installer script} to install Guix on top of a running GNU/Linux +system, thereafter called a @dfn{foreign distro}.@footnote{This section is +concerned with the installation of the package manager, which can be done on +top of a running GNU/Linux system. If, instead, you want to install the +complete GNU operating system, @pxref{Installation du système}.} The script +automates the download, installation, and initial configuration of Guix. It +should be run as the root user. +@end quotation @cindex distro extérieure @cindex répertoires liés aux distro extérieures - -Lorsqu'il est installé sur un système GNU/Linux existant — ci-après nommé -@dfn{distro extérieure} — GNU@tie{}Guix complète les outils disponibles sans -interférence. Ses données se trouvent exclusivement dans deux répertoires, -typiquement @file{/gnu/store} et @file{/var/guix} ; les autres fichiers de -votre système comme @file{/etc} sont laissés intacts. +When installed on a foreign distro, GNU@tie{}Guix complements the available +tools without interference. Its data lives exclusively in two directories, +usually @file{/gnu/store} and @file{/var/guix}; other files on your system, +such as @file{/etc}, are left untouched. Une fois installé, Guix peut être mis à jour en lançant @command{guix pull} (@pxref{Invoquer guix pull}). +If you prefer to perform the installation steps manually or want to tweak +them, you may find the following subsections useful. They describe the +software requirements of Guix, as well as how to install it manually and get +ready to use it. + @menu * Installation binaire:: Commencer à utiliser Guix en un rien de temps ! @@ -508,18 +568,12 @@ Une fois installé, Guix peut être mis à jour en lançant @command{guix pull} @cindex installer Guix depuis les binaires @cindex script d'installation -Cette section décrit comment intaller Guix sur un système quelconque depuis +Cette section décrit comment installer Guix sur un système quelconque depuis un archive autonome qui fournit les binaires pour Guix et toutes ses dépendances. C'est souvent plus rapide que d'installer depuis les sources, -ce qui est décrit dans les sections suivantes. Le seul pré-requis est +ce qui est décrit dans les sections suivantes. Le seul prérequis est d'avoir GNU@tie{}tar et Xz. -Nous fournissons un script -@uref{https://git.savannah.gnu.org/cgit/guix.git/plain/etc/guix-install.sh, -script d'intallation shell} qui automatise le téléchargement, l'installation -et la configuration initiale de Guix. Il devrait être lancé en tant -qu'utilisateur root. - L'installation se comme ceci : @enumerate @@ -564,7 +618,7 @@ tant que @code{root}, lancez : @end example Cela crée @file{/gnu/store} (@pxref{Le dépôt}) and @file{/var/guix}. Ce -deuxième dossier contient un profil pret à être utilisé pour @code{root} +deuxième dossier contient un profil prêt à être utilisé pour @code{root} (voir les étapes suivantes). Ne décompressez @emph{pas} l'archive sur un système Guix lancé car cela @@ -664,12 +718,12 @@ changer le chemin de recherche de Info). @item @cindex substituts, autorisations -Pour utiliser les substituts de @code{hydra.gnu.org} ou l'un de ses mirroirs -(@pxref{Substituts}), autorisez-les : +To use substitutes from @code{@value{SUBSTITUTE-SERVER}} or one of its +mirrors (@pxref{Substituts}), authorize them: @example # guix archive --authorize < \ - ~root/.config/guix/current/share/guix/hydra.gnu.org.pub + ~root/.config/guix/current/share/guix/@value{SUBSTITUTE-SERVER}.pub @end example @item @@ -694,7 +748,7 @@ retrouveriez gravement handicapé par l'absence de la commande @code{guix package -r guix}. L'archive d'installation binaire peut être (re)produite et vérifiée -simplement en lançaint la commande suivante dans l'arborescence des sources +simplement en lançant la commande suivante dans l'arborescence des sources de Guix : @example @@ -714,17 +768,20 @@ guix pack -s @var{system} --localstatedir \ @node Prérequis @section Prérequis -Cette section dresse la liste des pré-requis pour la construction de Guix +Cette section dresse la liste des prérequis pour la construction de Guix depuis les sources. La procédure de construction pour Guix est la même que pour les autres logiciels GNU, et n'est pas expliquée ici. Regardez les fichiers @file{README} et @file{INSTALL} dans l'arborescence des sources de Guix pour plus de détails. +@cindex site officiel +GNU Guix is available for download from its website at +@url{https://www.gnu.org/software/guix/}. + GNU Guix dépend des paquets suivants : @itemize -@item @url{http://gnu.org/software/guile/, GNU Guile}, version 2.0.13 ou -supérieure, dont 2.2.x, +@item @url{http://gnu.org/software/guile/, GNU Guile}, version 2.2.x; @item @url{https://notabug.org/cwebber/guile-gcrypt, Guile-Gcrypt}, version 0.1.0 ou supérieure, @item @@ -738,6 +795,7 @@ version 0.1.0 ou supérieure, @c FIXME: Specify a version number once a release has been made. @uref{https://gitlab.com/guile-git/guile-git, Guile-Git}, d'août 2017 ou ultérieur, +@item @uref{https://savannah.nongnu.org/projects/guile-json/, Guile-JSON}; @item @url{http://zlib.net, zlib}, @item @url{http://www.gnu.org/software/make/, GNU Make}. @end itemize @@ -745,18 +803,12 @@ ultérieur, Les dépendances suivantes sont facultatives : @itemize -@item -Installer @url{http://savannah.nongnu.org/projects/guile-json/, Guile-JSON} -vous permettra d'utiliser la commande @command{guix import pypi} -(@pxref{Invoquer guix import}). Il est surtout utile pour les développeurs -et pas pour les utilisateurs occasionnels. - @item @c Note: We need at least 0.10.2 for 'channel-send-eof'. Le support pour la décharge de construction (@pxref{Réglages du délestage du démon}) et @command{guix copy} (@pxref{Invoquer guix copy}) dépend de @uref{https://github.com/artyom-poptsov/guile-ssh, Guile-SSH}, version -0.10.2 ou ulltérieure. +0.10.2 ou ultérieure. @item Lorsque @url{http://www.bzip.org, libbz2} est disponible, @@ -828,7 +880,7 @@ make check TESTS="tests/store.scm tests/cpio.scm" Par défaut, les résultats des tests sont affichés au niveau du fichier. Pour voir les détails de chaque cas de test individuel, il est possible de -définire la variable makefile @code{SCM_LOG_DRIVER_FLAGS} comme dans cet +définir la variable makefile @code{SCM_LOG_DRIVER_FLAGS} comme dans cet exemple : @example @@ -840,9 +892,9 @@ le fichier @file{test-suite.log}. Précisez la version de Guix utilisée ainsi que les numéros de version de ses dépendances (@pxref{Prérequis}) dans votre message. -Guix possède aussi une suite de tests de systèmes complets qui test des -instances complètes du système d'exploitation GuixSD@. Elle ne peut être -lancée qui sur un système où Guix est déjà installé, avec : +Guix also comes with a whole-system test suite that tests complete Guix +System instances. It can only run on systems where Guix is already +installed, using: @example make check-system @@ -1156,13 +1208,11 @@ les machines de construction correspondantes. @end table @end deftp -La commande @code{guile} doit être dans le chemin de recherche des machines -de construction. En plus, les modules Guix doivent se trouver dans -@code{$GUILE_LOAD_PATH} sur la machine de construction. Vous pouvez -vérifier si c'est le cas en lançant : +The @command{guix} command must be in the search path on the build +machines. You can check whether this is the case by running: @example -ssh build-machine guile -c "'(use-modules (guix config))'" +ssh build-machine guix repl --version @end example Il reste une dernière chose à faire maintenant que @file{machines.scm} est @@ -1238,11 +1288,11 @@ cette commande sur le nœud principal : @cindex SELinux, politique du démon @cindex contrôle d'accès obligatoire, SELinux @cindex sécurité, guix-daemon -Guix inclus un fichier de politique SELniux dans @file{etc/guix-daemon.cil} -qui peut être installé sur un système où SELinux est activé pour que les -fichiers Guix soient étiquetés et pour spécifier le comportement attendu du -démon. Comme GuixSD ne fournit pas de politique SELniux de base, la -politique du démon ne peut pas être utilisée sur GuixSD@. +Guix includes an SELinux policy file at @file{etc/guix-daemon.cil} that can +be installed on a system where SELinux is enabled, in order to label Guix +files and to specify the expected behavior of the daemon. Since Guix System +does not provide an SELinux base policy, the daemon policy cannot be used on +Guix System. @subsubsection Installer la politique SELinux @cindex SELinux, installation de la politique @@ -1270,7 +1320,7 @@ permet toutes les opérations nécessaires. @subsubsection Limitations @cindex SELinux, limites -La politique n'et pas parfaite. Voici une liste de limitations et de +La politique n'est pas parfaite. Voici une liste de limitations et de bizarreries qui vous devriez prendre en compte avant de déployer la politique SELinux fournie pour le démon Guix. @@ -1389,10 +1439,9 @@ distante @code{set-build-options} (@pxref{Le dépôt}). @item --substitute-urls=@var{urls} @anchor{daemon-substitute-urls} -Considèrer @var{urls} comme la liste séparée par des espaces des URL des -sources de substituts par défaut. Lorsque cette option est omise, -@indicateurl{https://mirror.hydra.gnu.org https://hydra.gnu.org} est utilisé -(@code{mirror.hydra.gnu.org} est un mirroire de @code{hydra.gnu.org}). +Consider @var{urls} the default whitespace-separated list of substitute +source URLs. When this option is omitted, +@indicateurl{https://@value{SUBSTITUTE-SERVER}} is used. Cela signifie que les substituts sont téléchargés depuis les @var{urls}, tant qu'ils sont signés par une signature de confiance (@pxref{Substituts}). @@ -1458,7 +1507,7 @@ si les résultats de construction consécutifs ne sont pas identiques bit-à-bit. Remarquez que ce paramètre peut être modifié par les clients comme @command{guix build} (@pxref{Invoquer guix build}). -Lorsqu'utilisé avec @option{--keep-failed}, la sourtie différente est gardée +Lorsqu'utilisé avec @option{--keep-failed}, la sortie différente est gardée dans le dépôt sous @file{/gnu/store/@dots{}-check}. Cela rend plus facile l'étude des différences entre les deux résultats. @@ -1603,15 +1652,14 @@ connexions sur le socket Unix-domain situé à @section Réglages applicatifs @cindex distro extérieure -Lorsque vous utilisez Guix par dessus une distribution GNU/Linux différente -de GuixSD — ce qu'on appelle une @dfn{distro externe} — quelques étapes -supplémentaires sont requises pour que tout soit en place. En voici -certaines. +When using Guix on top of GNU/Linux distribution other than Guix System---a +so-called @dfn{foreign distro}---a few additional steps are needed to get +everything in place. Here are some of them. @subsection Régionalisation @anchor{locales-and-locpath} -@cindex régionalisation, en dehors de GuixSD +@cindex locales, when not on Guix System @vindex LOCPATH @vindex GUIX_LOCPATH Les paquets installés @i{via} Guix n'utiliseront pas les données de @@ -1686,12 +1734,13 @@ GNU C Reference Manual}) Lorsqu'ils essayent d'effectuer une résolution de nom — par exemple en appelant la fonction @code{getaddrinfo} en C — les applications essayent d'abord de se connecter au nscd ; en cas de réussite, nscd effectue la -résolution de nom pour eux. Si le nscd ne tourne pas, alors ils effectue la -résolution eux-même, en changeant les service de résolution dans leur propre -espace d'adressage et en le lançant. Ce services de résolution de noms — -les fichiers @file{libnns_*.so} — sont @code{dlopen}és mais ils peuvent -provenir de la bibliothèque C du système, plutôt que de la bibliothèque C à -laquelle l'application est liée (la bibliothèque C de Guix). +résolution de nom pour eux. Si le nscd ne tourne pas, alors ils effectuent +la résolution eux-mêmes, en changeant les service de résolution dans leur +propre espace d'adressage et en le lançant. Ce services de résolution de +noms — les fichiers @file{libnns_*.so} — sont @code{dlopen}és mais ils +peuvent provenir de la bibliothèque C du système, plutôt que de la +bibliothèque C à laquelle l'application est liée (la bibliothèque C de +Guix). Et c'est là que se trouve le problème : si votre application est liée à la bibliothèque C de Guix (disons, glibc-2.24) et essaye de charger les @@ -1728,7 +1777,7 @@ guix package -i font-adobe-source-han-sans:cn @cindex @code{xterm} Les vieux programmes comme @command{xterm} n'utilisent pas fontconfig et s'appuient sur le rendu du côté du serveur. Ces programmes ont besoin de -spécifier le nom complet de la police en utlisant XLFD (X Logical Font +spécifier le nom complet de la police en utilisant XLFD (X Logical Font Description), comme ceci : @example @@ -1786,7 +1835,7 @@ The GNU Emacs Manual}). Par défaut, Emacs (installé avec Guix) « sait » où ces paquets ce trouvent, donc vous n'avez pas besoin de le configurer. Si, pour quelque raison que ce soit, vous souhaitez éviter de charger automatiquement les paquets Emacs -installés avec Guix, vous pouvez le faire en lançaint Emacs avec l'option +installés avec Guix, vous pouvez le faire en lançant Emacs avec l'option @code{--no-site-file} (@pxref{Init File,,, emacs, The GNU Emacs Manual}). @subsection La chaîne d'outils GCC @@ -1802,8224 +1851,8386 @@ lui-même, la bibliothèque C de GNU (les en-têtes et les binaires, plus les symboles de débogage dans la sortie @code{debug}), Binutils et une enveloppe pour l'éditeur de liens. -@cindex tentative d'utiliser une bibliothèque impure, message d'erreur - -Le rôle de l'enveloppe est d'inspecter les paramètres @code{-L} et @code{-l} -passés à l'éditeur de liens, d'ajouter des arguments @code{-rpath} -correspondants et d'invoquer le véritable éditeur de liens avec ce nouvel -ensemble d'arguments. Par défaut, l'enveloppe refuse de lier des -bibliothèques en dehors du dépôt pour assure la « pureté ». Cela peut être -embêtant lorsque vous utilisez la chaîne d'outils pour lier des -bibliothèques locales. Pour permettre des références à des bibliothèques en -dehors du dépôt, vous devrez définir la variable d'environnement -@code{GUIX_LD_WRAPPER_ALLOW_IMPURITIES}. +The wrapper's purpose is to inspect the @code{-L} and @code{-l} switches +passed to the linker, add corresponding @code{-rpath} arguments, and invoke +the actual linker with this new set of arguments. You can instruct the +wrapper to refuse to link against libraries not in the store by setting the +@code{GUIX_LD_WRAPPER_ALLOW_IMPURITIES} environment variable to @code{no}. @c TODO What else? @c ********************************************************************* -@node Gestion de paquets -@chapter Gestion de paquets +@node Installation du système +@chapter Installation du système -@cindex paquets -Le but de GNU Guix est de permettre à ses utilisateurs d'installer, mettre à -jour et supprimer facilement des paquets logiciels sans devoir connaître -leur procédure de construction ou leurs dépendances. Guix va aussi plus -loin que ces fonctionnalités évidentes. +@cindex installing Guix System +@cindex Guix System, installation +This section explains how to install Guix System on a machine. Guix, as a +package manager, can also be installed on top of a running GNU/Linux system, +@pxref{Installation}. -Ce chapitre décrit les principales fonctionnalités de Guix, ainsi que des -outils de gestion des paquets qu'il fournit. En plus de l'interface en -ligne de commande décrite en dessous de (@pxref{Invoquer guix package, -@code{guix package}}), vous pouvez aussi utiliser l'interface Emacs-Guix -(@pxref{Top,,, emacs-guix, Le manuel de référence de emacs-guix}), après -avoir installé le paquet @code{emacs-guix} (lancez la commande @kbd{M-x -guix-help} pour le démarrer) : +@ifinfo +@quotation Remarque +@c This paragraph is for people reading this from tty2 of the +@c installation image. +Vous lisez cette documentation avec un lecteur Info. Pour des détails sur +son utilisation, appuyez sur la touche @key{ENTRÉE} (« Entrée » ou « à la +ligne ») sur le lien suivant : @pxref{Top, Info reader,, info-stnd, +Stand-alone GNU Info}. Appuyez ensuite sur @kbd{l} pour revenir ici. -@example -guix package -i emacs-guix -@end example +Autrement, lancez @command{info info} dans un autre tty pour garder ce +manuel ouvert. +@end quotation +@end ifinfo @menu -* Fonctionnalités:: Comment Guix va rendre votre vie plus heureuse. -* Invoquer guix package:: Installation, suppression, etc.@: de paquets. -* Substituts:: Télécharger des binaire déjà construits. -* Des paquets avec plusieurs résultats:: Un seul paquet source, plusieurs - résultats. -* Invoquer guix gc:: Lancer le ramasse-miettes. -* Invoquer guix pull:: Récupérer la dernière version de Guix et de - la distribution. -* Canaux:: Personnaliser la collection des paquets. -* Inférieurs:: Interagir avec une autre révision de Guix. -* Invoquer guix describe:: Affiche des informations sur la révision Guix - actuelle. -* Invoquer guix pack:: Créer des lots de logiciels. -* Invoquer guix archive:: Exporter et importer des fichiers du dépôt. +* Limitations:: Ce à quoi vous attendre. +* Considérations matérielles:: Matériel supporté. +* Installation depuis une clef USB ou un DVD:: Préparer le média + d'installation. +* Préparer l'installation:: Réseau, partitionnement, etc. +* Effectuer l'installation:: Pour de vrai. +* Installing Guix in a VM:: Guix System playground. +* Construire l'image d'installation:: D'où vient tout cela. @end menu -@node Fonctionnalités -@section Fonctionnalités +@node Limitations +@section Limitations + +As of version @value{VERSION}, Guix System is not production-ready. It may +contain bugs and lack important features. Thus, if you are looking for a +stable production system that respects your freedom as a computer user, a +good solution at this point is to consider +@url{http://www.gnu.org/distros/free-distros.html, one of the more +established GNU/Linux distributions}. We hope you can soon switch to the +Guix System without fear, of course. In the meantime, you can also keep +using your distribution and try out the package manager on top of it +(@pxref{Installation}). -Lorsque vous utilisez Guix, chaque paquet arrive dans @dfn{dépôt des -paquets}, dans son propre répertoire — quelque chose comme -@file{/gnu/store/xxx-paquet-1.2}, où @code{xxx} est une chaîne en base32. +Avant de procéder à l'installation, soyez conscient de ces limitations les +plus importantes qui s'appliquent à la version @value{VERSION} : -Plutôt que de se rapporter à ces répertoires, les utilisateurs ont leur -propre @dfn{profil} qui pointe vers les paquets qu'ils veulent vraiment -utiliser. Ces profils sont stockés dans le répertoire personnel de chaque -utilisateur dans @code{$HOME/.guix-profile}. +@itemize +@item +Le procédé d'installation n'a pas d'interface utilisateur graphique et +requiert une certaine familiarité avec GNU/Linux (voir les sous-sections +suivantes pour avoir un aperçu de ce que cela signifie). -Par exemple, @code{alice} installe GCC 4.7.2. Il en résulte que -@file{/home/alice/.guix-profile/bin/gcc} pointe vers -@file{/gnu/store/@dots{}-gcc-4.7.2/bin/gcc}. Maintenant, sur la même -machine, @code{bob} a déjà intallé GCC 4.8.0. Le profil de @code{bob} -continue simplement de pointer vers -@file{/gnu/store/@dots{}-gcc-4.8.0/bin/gcc} — c.-à-d.@: les deux versions de -GCC coexistent surs le même système sans aucune interférence. +@item +LVM (gestionnaire de volumes logiques) n'est pas supporté. -La commande @command{guix package} est l'outil central pour gérer les -paquets (@pxref{Invoquer guix package}). Il opère sur les profils -utilisateurs et peut être utilisé avec les @emph{privilèges utilisateurs -normaux}. +@item +De plus en plus de services systèmes sont fournis (@pxref{Services}) mais +certains manquent toujours cruellement. -@cindex transactions -La commande fournit les opérations évidentes d'installation, de suppression -et de mise à jour. Chaque invocation est en fait une @emph{transaction} : -soit l'opération demandée réussi, soit rien ne se passe. Ainsi, si le -processus @command{guix package} est terminé pendant la transaction ou si -une panne de courant arrive pendant la transaction, le profil de -l'utilisateur reste dans son état précédent et reste utilisable. +@item +More than 8,500 packages are available, but you might occasionally find that +a useful package is missing. -En plus, il est possible @emph{d'annuler} toute transaction sur les -paquets. Donc si par exemple un mise à jour installe une nouvelle version -d'un paquet qui révèle un bogue sérieux, les utilisateurs peuvent revenir en -arrière à l'instance précédente de leur profil qui est connu pour bien -fonctionner. De manière similaire, la configuration globale du système dans -GuixSD est sujette aux mises à jour transactionnelles et aux annulations -(@pxref{Utiliser le système de configuration}). +@item +GNOME, Xfce, LXDE et Enlightenment sont disponibles (@pxref{Services de bureaux}), ainsi qu'un certain nombre de gestionnaires de fenêtres X11. +cependant, certaines applications graphiques peuvent manquer, ainsi que KDE. +@end itemize -Tous les paquets du dépôt des paquets peut être @emph{glané}. Guix peut -déterminer quels paquets sont toujours référencés par les profils des -utilisateurs et supprimer ceux qui ne sont plus référencés de manière -prouvable (@pxref{Invoquer guix gc}). Les utilisateurs peuvent toujours -explicitement supprimer les anciennes générations de leur profil pour que -les paquets auxquels elles faisaient référence puissent être glanés. +Vous êtes avertis ! Mais plus qu'un avertissement, c'est une invitation à +rapporter les problèmes (et vos succès !) et à nous rejoindre pour améliorer +la distribution. @xref{Contribuer}, pour plus d'info. -@cindex reproductibilité -@cindex constructions reproductibles -Guix prend une approche @dfn{purement fonctionnelle} de la gestion de -paquets, telle que décrite dans l'introduction (@pxref{Introduction}). -Chaque nom de répertoire de paquet dans @file{/gnu/store} contient un hash -de toutes les entrées qui ont été utilisées pendant la construction de ce -paquet — le compilateur, les bibliothèques, les scripts de construction, -etc. Cette correspondance directe permet aux utilisateurs de s'assurer que -l'installation d'un paquet donné correspond à l'état actuel de leur -distribution. Elle aide aussi à maximiser la @dfn{reproductibilité} : grâce -aux environnements de construction utilisés, une construction donnée à de -forte chances de donner des fichiers identiques bit-à-bit lorsqu'elle est -effectuée sur des machines différents (@pxref{Invoquer guix-daemon, -container}). -@cindex substituts -Ce fondement permet à Guix de supporter le @dfn{déploiement transparent de -binaire ou source}. Lorsqu'une binaire pré-construit pour une entrée de -@file{/gnu/store} est disponible depuis une source externe (un -@dfn{substitut}), Guix le télécharge simplement et le décompresse ; sinon, -il construit le paquet depuis les sources localement (@pxref{Substituts}). -Comme les résultats des constructions sont généralement reproductibles au -bit près, si vous n'avez pas besoin de faire confiance aux serveurs qui -fournissent les substituts : vous pouvez forcer une construction locale et -@emph{défier} les fournisseurs (@pxref{Invoquer guix challenge}). +@node Considérations matérielles +@section Considérations matérielles -Le contrôle de l'environnement de construction est aussi une fonctionnalité -utile pour les développeurs. La commande @command{guix environment} permet -aux développeurs d'un paquet de mettre en place rapidement le bon -environnement de développement pour leur paquet, sans avoir à installer -manuellement les dépendances du paquet dans leur profil (@pxref{Invoquer guix environment}). +@cindex hardware support on Guix System +GNU@tie{}Guix focuses on respecting the user's computing freedom. It builds +around the kernel Linux-libre, which means that only hardware for which free +software drivers and firmware exist is supported. Nowadays, a wide range of +off-the-shelf hardware is supported on GNU/Linux-libre---from keyboards to +graphics cards to scanners and Ethernet controllers. Unfortunately, there +are still areas where hardware vendors deny users control over their own +computing, and such hardware is not supported on Guix System. -@cindex réplication, des environnements logiciels -@cindex suivi de la provenance, des artefacts logiciels -La totalité de Guix et des définitions de paquets sont placés sous contrôle -de version, et @command{guix pull} vous permet de « voyager dans le temps » -de l'historique de Guix lui-même (@pxref{Invoquer guix pull}). Cela est -rend possible la réplication d'une instance Guix sur une machine différente -ou plus tard, ce qui vous permet de @emph{répliquer des environnements -logiciels complets}, tout en garantissant un @dfn{suivi de provenance} -précis des logiciels. +@cindex WiFi, support matériel +One of the main areas where free drivers or firmware are lacking is WiFi +devices. WiFi devices known to work include those using Atheros chips +(AR9271 and AR7010), which corresponds to the @code{ath9k} Linux-libre +driver, and those using Broadcom/AirForce chips (BCM43xx with Wireless-Core +Revision 5), which corresponds to the @code{b43-open} Linux-libre driver. +Free firmware exists for both and is available out-of-the-box on Guix +System, as part of @var{%base-firmware} (@pxref{Référence de système d'exploitation, +@code{firmware}}). -@node Invoquer guix package -@section Invoquer @command{guix package} +@cindex RYF, Respects Your Freedom +La @uref{https://www.fsf.org/, Free Software Foundation} a un programme de +certification nommé @uref{https://www.fsf.org/ryf, @dfn{Respects Your +Freedom}} (RYF), pour les produits matériels qui respectent votre liberté et +votre vie privée en s'assurant que vous avez le contrôle sur l'appareil. +Nous vous encourageons à vérifier la liste des appareils certifiés par RYF. -@cindex installer des paquets -@cindex supprimer des paquets -@cindex installation de paquets -@cindex suppression de paquets -La commande @command{guix package} est l'outil qui permet d'installer, -mettre à jour et supprimer les paquets ainsi que de revenir à une -configuration précédente. Elle n'opère que dans le profil de l'utilisateur -et fonctionne avec les privilèges utilisateurs normaux -(@pxref{Fonctionnalités}). Sa syntaxe est : +Une autre ressource utile est le site web @uref{https://www.h-node.org/, +H-Node}. Il contient un catalogue d'appareils avec des informations sur +leur support dans GNU/Linux. -@example -guix package @var{options} -@end example -@cindex transactions -@var{options} spécifie d'abord les opérations à effectuer pendant la -transaction. À la fin, une nouvelle génération du profil est créée mais les -@dfn{générations} précédentes du profil restent disponibles si l'utilisateur -souhaite y revenir. -Par exemple, pour supprimer @code{lua} et installer @code{guile} et -@code{guile-cairo} en une seule transaction : +@node Installation depuis une clef USB ou un DVD +@section Installation depuis une clef USB ou un DVD + +Une image d'installation ISO-9660 téléchargeable depuis +@indicateurl{https://alpha.gnu.org/gnu/guix/guixsd-install-@value{VERSION}.@var{système}.iso.xz} +peut être écrite sur une clef USB ou gravée sur un DVD, où @var{système} est +l'une de ces valeurs : + +@table @code +@item x86_64-linux +pour un système GNU/Linux sur un CPU compatible Intel/AMD 64-bits ; + +@item i686-linux +pour un système GNU/Linux sur un CPU compatible Intel 32-bits ; +@end table + +@c start duplication of authentication part from ``Binary Installation'' +Assurez-vous de télécharger les fichiers @file{.sig} associés et de vérifier +l'authenticité de l'image avec, de cette manière : @example -guix package -r lua -i guile guile-cairo +$ wget https://alpha.gnu.org/gnu/guix/guixsd-install-@value{VERSION}.@var{system}.iso.xz.sig +$ gpg --verify guixsd-install-@value{VERSION}.@var{system}.iso.xz.sig @end example -@command{guix package} supporte aussi une @dfn{approche déclarative} où -l'utilisateur spécifie l'ensemble exact des paquets qui doivent être -disponibles le passe @i{via} l'option @option{--manifest} -(@pxref{profile-manifest, @option{--manifest}}). - -@cindex profil -Pour chaque utilisateur, un lien symbolique vers le profil par défaut de cet -utilisateur est automatiquement créé dans @file{$HOME/.guix-profile}. Ce -lien symbolique pointe toujours vers la génération actuelle du profil par -défaut de l'utilisateur. Ainsi, les utilisateurs peuvent ajouter -@file{$HOME/.guix-profile/bin} à leur variable d'environnement @code{PATH} -etc. -@cindex chemins de recherche -Si vous n'utilisez pas la distribution système Guix, vous devriez ajouter -les lignes suivantes à votre @file{~/.bash_profile} (@pxref{Bash Startup -Files,,, bash, The GNU Bash Reference Manual}) pour que les shells créés -ensuite aient les bonnes définitions des variables d'environnement : +Si cette commande échoue parce que vous n'avez pas la clef publique requise, +lancez cette commande pour l'importer : @example -GUIX_PROFILE="$HOME/.guix-profile" ; \ -source "$HOME/.guix-profile/etc/profile" +$ gpg --keyserver @value{KEY-SERVER} \ + --recv-keys @value{OPENPGP-SIGNING-KEY-ID} @end example -Dans un environnement multi-utilisateur, les profils utilisateurs sont -stockés comme une @dfn{racine du ramasse-miettes}, vers laquelle pointe -@file{$HOME/.guix-profile} (@pxref{Invoquer guix gc}). Ce répertoire est -normalement -@code{@var{localstatedir}/guix/profiles/per-user/@var{utilisateur}}, où -@var{localstatedir} est la valeur passée à @code{configure} avec -@code{--localstatedir} et @var{utilisateur} le nom d'utilisateur. Le -répertoire @file{per-user} est créé lorsque @command{guix-daemon} est -démarré et sous-répertoire @var{utilisateur} est créé par @command{guix -package}. +@noindent +@c end duplication +et relancez la commande @code{gpg --verify}. -Les @var{options} peuvent être les suivante : +Cette image contient les outils nécessaires à l'installation. Elle est +faite pour être copiée @emph{telle quelle} sur une clef USB assez grosse ou +un DVD. -@table @code +@unnumberedsubsec Copie sur une clef USB -@item --install=@var{paquet} @dots{} -@itemx -i @var{paquet} @dots{} -Installer les @var{paquet}s spécifiés. +Pour copier l'image sur une clef USB, suivez ces étapes : -Chaque @var{paquet} peut spécifier soit un simple nom de paquet, comme -@code{guile} ou un nom de paquet suivi d'un arobase et d'un numéro de -version, comme @code{guile@@1.8.8} ou simplement @code{guile@@1.8} (dans ce -dernier cas, la version la plus récente commençant par @code{1.8} est -utilisée). +@enumerate +@item +Décompressez l'image avec la commande @command{xz} : -Si aucun numéro de version n'est spécifié, la version la plus récente -disponible est choisie. En plus, @var{paquet} peut contenir un deux-points, -suivi du nom d'une des sorties du paquet, comme dans @code{gcc:doc} ou -@code{binutils@@2.22:lib} (@pxref{Des paquets avec plusieurs résultats}). Des -paquets avec un nom correspondant et (éventuellement une version) sont -recherchés dans les modules de la distribution GNU (@pxref{Modules de paquets}). +@example +xz -d guixsd-install-@value{VERSION}.@var{système}.iso.xz +@end example -@cindex entrées propagées -Parfois les paquets ont des @dfn{entrées propagées} : ce sont des -dépendances qui sont installées automatiquement avec le paquet demandé -(@pxref{package-propagated-inputs, @code{propagated-inputs} in -@code{package} objects} pour plus d'informations sur les entrées propagées -dans les définitions des paquets). +@item +Insérez la clef USB de 1@tie{}Gio ou plus dans votre machine et déterminez +son nom d'appareil. En supposant que la clef usb est connue sous le nom de +@file{/dev/sdX}, copiez l'image avec : -@anchor{package-cmd-propagated-inputs} -Un exemple est la bibliothèque MPC de GNU : ses fichiers d'en-tête C se -réfèrent à ceux de la bibliothèque MPFR de GNU, qui se réfèrent en retour à -ceux de la bibliothèque GMP. Ainsi, lorsqu'on installe MPC, les -bibliothèques MPFR et GMP sont aussi installées dans le profil ; supprimer -MPC supprimera aussi MPFR et GMP — à moins qu'ils n'aient été aussi -installés explicitement par l'utilisateur. +@example +dd if=guixsd-install-@value{VERSION}.@var{system}.iso of=/dev/sdX +sync +@end example -D'autre part, les paquets dépendent parfois de la définition de variables -d'environnement pour leur chemin de recherche (voir les explications sur -@code{--search-paths} plus bas). Toute définition de variable -d'environnement manquante ou possiblement incorrecte est rapportée ici. +Accéder à @file{/dev/sdX} requiert généralement les privilèges +super-utilisateur. +@end enumerate -@item --install-from-expression=@var{exp} -@itemx -e @var{exp} -Installer le paquet évalué par @var{exp} +@unnumberedsubsec Graver sur un DVD -@var{exp} doit être une expression Scheme qui s'évalue en un objet -@code{}. Cette option est notamment utile pour distinguer les -variantes d'un paquet avec le même nom, avec des expressions comme @code{(@@ -(gnu packages base) guile-final)}. +Pour copier l'image sur un DVD, suivez ces étapes : -Remarquez que cette option installe la première sortie du paquet, ce qui -peut être insuffisant lorsque vous avez besoin d'une sortie spécifique d'un -paquet à plusieurs sorties. +@enumerate +@item +Décompressez l'image avec la commande @command{xz} : -@item --install-from-file=@var{fichier} -@itemx -f @var{fichier} -Installer le paquet évalué par le code dans le @var{fichier}. +@example +xz -d guixsd-install-@value{VERSION}.@var{système}.iso.xz +@end example -Par exemple, @var{fichier} peut contenir une définition comme celle-ci -(@pxref{Définition des paquets}) : +@item +Insérez un DVD vierge dans votre machine et déterminez son nom d'appareil. +En supposant que le DVD soit connu sont le nom de @file{/dev/srX}, copiez +l'image avec : @example -@verbatiminclude package-hello.scm +growisofs -dvd-compat -Z /dev/srX=guixsd-install-@value{VERSION}.@var{system}.iso @end example -Les développeurs peuvent trouver utile d'inclure un tel fichier -@file{guix.scm} à la racine de l'arborescence des sources de leur projet qui -pourrait être utilisé pour tester des versions de développement et créer des -environnements de développement reproductibles (@pxref{Invoquer guix environment}). +Accéder à @file{/dev/srX} requiert généralement les privilèges +super-utilisateur. +@end enumerate -@item --remove=@var{paquet} @dots{} -@itemx -r @var{paquet} @dots{} -Supprimer les @var{paquet}s spécifiés. +@unnumberedsubsec Démarrage -Comme pour @code{--install}, chaque @var{paquet} peut spécifier un numéro de -version ou un nom de sortie en plus du nom du paquet. Par exemple, @code{-r -glibc:debug} supprimerait la sortie @code{debug} de @code{glibc}. +Une fois que c'est fait, vous devriez pouvoir redémarrer le système et +démarrer depuis la clef USB ou le DVD. Pour cela, vous devrez généralement +entrer dans le menu de démarrage BIOS ou UEFI, où vous pourrez choisir de +démarrer sur la clef USB. -@item --upgrade[=@var{regexp} @dots{}] -@itemx -u [@var{regexp} @dots{}] -@cindex mettre à jour des paquets -Mettre à jour tous les paquets installés. Si une @var{regexp} ou plus est -spécifiée, la mise à jour n'installera que les paquets dont le nom -correspond à @var{regexp}. Voyez aussi l'option @code{--do-not-upgrade} en -dessous. +@xref{Installing Guix in a VM}, if, instead, you would like to install Guix +System in a virtual machine (VM). -Remarquez que cela met à jour vers la dernière version des paquets trouvée -dans la distribution actuellement installée. Pour mettre à jour votre -distribution, vous devriez lancer régulièrement @command{guix pull} -(@pxref{Invoquer guix pull}). -@item --do-not-upgrade[=@var{regexp} @dots{}] -Lorsqu'elle est utilisée avec l'option @code{--upgrade}, ne @emph{pas} -mettre à jour les paquets dont le nom correspond à @var{regexp}. Par -exemple, pour mettre à jour tous les paquets du profil actuel à l'exception -de ceux qui contiennent la chaîne « emacs » : +@node Préparer l'installation +@section Préparer l'installation + +Once you have successfully booted your computer using the installation +medium, you should end up with the welcome page of the graphical installer. +The graphical installer is a text-based user interface built upon the newt +library. It shall guide you through all the different steps needed to +install GNU@tie{}Guix System. However, as the graphical installer is still +under heavy development, you might want to fallback to the original, shell +based install process, by switching to TTYs 3 to 6 with the shortcuts +CTRL-ALT-F[3-6]. The following sections describe the installation procedure +assuming you're using one of those TTYs. They are configured and can be used +to run commands as root. + +TTY2 shows this documentation, browsable using the Info reader commands +(@pxref{Top,,, info-stnd, Stand-alone GNU Info}). The installation system +runs the GPM mouse daemon, which allows you to select text with the left +mouse button and to paste it with the middle button. -@example -$ guix package --upgrade . --do-not-upgrade emacs -@end example +@quotation Remarque +L'installation nécessite un accès au réseau pour que les dépendances +manquantes de votre configuration système puissent être téléchargées. Voyez +la section « réseau » plus bas. +@end quotation -@item @anchor{profile-manifest}--manifest=@var{fichier} -@itemx -m @var{fichier} -@cindex déclaration de profil -@cindex manifest de profil -Créer une nouvelle génération du profil depuis l'objet manifeste renvoyé par -le code Scheme dans @var{fichier}. +The installation system includes many common tools needed for this task. +But it is also a full-blown Guix System, which means that you can install +additional packages, should you need it, using @command{guix package} +(@pxref{Invoquer guix package}). -Cela vous permet de @emph{déclarer} le contenu du profil plutôt que de le -construire avec une série de @code{--install} et de commandes similaires. -L'avantage étant que le @var{fichier} peut être placé sous contrôle de -version, copié vers d'autres machines pour reproduire le même profil, etc. +@subsection Disposition du clavier -@c FIXME: Add reference to (guix profile) documentation when available. -@var{fichier} doit retourner un objet @dfn{manifest} qui est en gros une -liste de paquets : +@cindex disposition du clavier +L'image d'installation utilise la disposition clavier qwerty (US). Si vous +voulez la changer, vous pouvez utiliser la commande @command{loadkeys}. Par +exemple, la commande suivante sélectionne la disposition Dvorak : -@findex packages->manifest @example -(use-package-modules guile emacs) - -(packages->manifest - (list emacs - guile-2.0 - ;; Utiliser une sortie spécifique d'un paquet. - (list guile-2.0 "debug"))) +loadkeys dvorak @end example -@findex specifications->manifest -Dans cet exemple on doit savoir quels modules définissent les variables -@code{emacs} et @code{guile-2.0} pour fournir la bonne ligne -@code{use-package-modules} ce qui peut être embêtant. On peut à la place -fournir des spécifications de paquets normales et laisser -@code{specifications->manifest} rechercher les objets de paquets -correspondants, comme ceci : +Consultez les fichiers dans @file{/run/current-system/profile/share/keymaps} +pour trouver une liste des dispositions disponibles. Lancez @command{man +loadkey} pour plus d'informations. + +@subsection Réseau + +Lancez la commande suivante pour voir comment vos interfaces réseau sont +appelées : @example -(specifications->manifest - '("emacs" "guile@@2.2" "guile@@2.2:debug")) +ifconfig -a @end example -@item --roll-back -@cindex revenir en arrière -@cindex défaire des transactions -@cindex transactions, défaire -Revenir à la @dfn{génération} précédente du profil c.-à-d.@: défaire la -dernière transaction. +@noindent +@dots{} ou, avec la commande spécifique à GNU/Linux @command{ip} : -Lorsqu'elle est combinée avec des options comme @code{--install}, cette -option revient en arrière avant toute autre action. +@example +ip a +@end example -Lorsque vous revenez de la première génération qui contient des fichiers, le -profil pointera vers la @dfn{zéroième génération} qui ne contient aucun -fichier en dehors de ses propres métadonnées. +@c http://cgit.freedesktop.org/systemd/systemd/tree/src/udev/udev-builtin-net_id.c#n20 +Les interfaces filaires ont un nom qui commence par @samp{e} ; par exemple, +l'interface qui correspond au premier contrôleur Ethernet sur la carte mère +est appelé @samp{eno1}. Les interfaces sans-fil ont un nom qui commence par +@samp{w}, comme @samp{w1p2s0}. -Après être revenu en arrière, l'installation, la suppression et la mise à -jour de paquets réécrit les futures générations précédentes. Ainsi, -l'historique des générations dans un profil est toujours linéaire. +@table @asis +@item Connexion filaire +Pour configure une connexion filaire, lancez la commande suivante, en +remplaçant @var{interface} par le nom de l'interface filaire que vous voulez +utiliser. -@item --switch-generation=@var{motif} -@itemx -S @var{motif} -@cindex générations -Basculer vers une génération particulière définie par le @var{motif}. +@example +ifconfig @var{interface} up +@end example -Le @var{motif} peut être soit un numéro de génération soit un nombre précédé -de « + » ou « - ». Ce dernier signifie : se déplacer en avant ou en arrière -d'un nombre donné de générations. Par exemple, si vous voulez retourner à -la dernière génération après @code{--roll-back}, utilisez -@code{--switch-generation=+1}. +@item Connexion sans-fil +@cindex sans-fil +@cindex WiFi +Pour configurer le réseau sans-fil, vous pouvez créer un fichier de +configuration pour l'outil de configuration @command{wpa_supplicant} (son +emplacement importe peu) avec l'un des éditeurs de texte disponibles comme +@command{nano} : -La différence entre @code{--roll-back} et @code{--switch-generation=-1} est -que @code{--switch-generation} ne vous amènera pas à la zéroième génération, -donc si la génération demandée n'existe pas la génération actuelle ne -changera pas. +@example +nano wpa_supplicant.conf +@end example -@item --search-paths[=@var{genre}] -@cindex chemins de recherche -Rapporter les définitions des variables d'environnement dans la syntaxe Bash -qui peuvent être requises pour utiliser l'ensemble des paquets installés. -Ces variables d'environnement sont utilisées pour spécifier les @dfn{chemins -de recherche} de fichiers utilisés par les paquets installés. +Par exemple, la déclaration qui suit peut aller dans ce fichier et +fonctionnera pour plusieurs réseaux sans-fil, si vous donnez le vrai SSID et +la phrase de passe pour le réseau auquel vous vous connectez : -Par exemple, GCC a besoin des variables d'environnement @code{CPATH} et -@code{LIBRARY_PATH} pour trouver les en-têtes et les bibliothèques dans le -profil de l'utilisateur (@pxref{Environment Variables,,, gcc, Using the GNU -Compiler Collection (GCC)}). Si GCC et, disons, la bibliothèque C sont -installés dans le profil, alors @code{--search-paths} suggérera -d'initialiser ces variables à @code{@var{profil}/include} et -@code{@var{profil}/lib}, respectivement. +@example +network=@{ + ssid="@var{mon-ssid}" + key_mgmt=WPA-PSK + psk="la phrase de passe secrète du réseau" +@} +@end example -Le cas d'utilisation typique est de définir ces variables d'environnement -dans le shell : +Démarrez le service sans-fil et lancez-le en tache de fond avec la commande +suivante (en remplaçant @var{interface} par le nom de l'interface réseau que +vous voulez utiliser) : @example -$ eval `guix package --search-paths` +wpa_supplicant -c wpa_supplicant.conf -i @var{interface} -B @end example -@var{genre} peut être l'une des valeurs @code{exact}, @code{prefix} ou -@code{suffix}, ce qui signifie que les définitions des variables -d'environnement retournées seront soit les paramètres exactes, ou placés -avant ou après la valeur actuelle de ces paramètres. Lorsqu'il est omis, -@var{genre} a pour valeur par défaut @code{exact}. +Lancez @command{man wpa_supplicant} pour plus d'informations. +@end table -Cette option peut aussi être utilisé pour calculer les chemins de recherche -@emph{combinés} de plusieurs profils. Regardez cet exemple : +@cindex DHCP +À partir de ce moment, vous avez besoin d'une adresse IP. Sur les réseaux +où les IP sont automatiquement attribuée par DHCP, vous pouvez lancer : @example -$ guix package -p foo -i guile -$ guix package -p bar -i guile-json -$ guix package -p foo -p bar --search-paths +dhclient -v @var{interface} @end example -La dernière commande ci-dessus montre la variable @code{GUILE_LOAD_PATH} -bien que, pris individuellement, ni @file{foo} ni @file{bar} n'auraient -donné cette recommendation. +Essayez de pinger un serveur pour voir si le réseau fonctionne : +@example +ping -c 3 gnu.org +@end example -@item --profile=@var{profil} -@itemx -p @var{profil} -Utiliser le @var{profil} à la place du profil par défaut de l'utilisateur. +Mettre en place un accès réseau est presque toujours une nécessité parce que +l'image ne contient pas tous les logiciels et les outils dont vous pourriez +avoir besoin. -@cindex collisions, dans un profil -@cindex faire des collisions de paquets dans des profils -@cindex profil, collisions -@item --allow-collisions -Permettre des collisions de paquets dans le nouveau profil. À utiliser à -vos risques et périls ! +@cindex installer par SSH +Si vous le souhaitez, vous pouvez continuer l'installation à distance en +démarrant un serveur SSH : -Par défaut, @command{guix package} rapporte les @dfn{collisions} dans le -profil comme des erreurs. Les collisions ont lieu quand deux version ou -variantes d'un paquet donné se retrouvent dans le profil. +@example +herd start ssh-daemon +@end example -@item --verbose -Produire une sortie verbeuse. En particulier, fournir les journaux de -construction de l'environnement sur le port d'erreur standard. +Assurez-vous soit de définir un mot de passe avec @command{passwd}, soit de +configurer l'authentification par clef OpenSSH avant de vous connecter. -@item --bootstrap -Utiliser le programme d'amorçage Guile pour compiler le profil. Cette -option n'est utile que pour les développeurs de la distriibution. +@subsection Partitionnement -@end table +À moins que vous ne l'ayez déjà fait, l'étape suivante consiste à +partitionner le disque puis à formater les partitions cibles. -En plus de ces actions, @command{guix package} supporte les options -suivantes pour demander l'état actuel d'un profil ou la disponibilité des -paquets : +L'image d'installation inclus plusieurs outils de partitionnement, dont +Parted (@pxref{Overview,,, parted, GNU Parted User Manual}), +@command{fdisk}, et @command{cfdisk}. Lancez-en un et paramétrez votre +disque avec le partitionnement qui vous convient : -@table @option +@example +cfdisk +@end example -@item --search=@var{regexp} -@itemx -s @var{regexp} -@cindex chercher des paquets -Lister les paquets disponibles dont le nom, le synopsis ou la description -correspondent à la @var{regexp}, triés par pertinence. Afficher toutes les -métadonnées des paquets correspondants au format @code{recutils} -(@pxref{Top, GNU recutils databases,, recutils, GNU recutils manual}). +Si votre disque utilise le format des tables de partitions GUID (GPT) et que +vous souhaitez installer un GRUB pour système BIOS (c'est le cas par +défaut), assurez-vous de créer qu'une partition de démarrage BIOS soit bien +disponible (@pxref{BIOS installation,,, grub, GNU GRUB manual}). -Cela permet à des champs spécifiques d'être extraits avec la commande -@command{recsel}, par exemple : +@cindex EFI, installation +@cindex UEFI, installation +@cindex ESP, partition système EFI +If you instead wish to use EFI-based GRUB, a FAT32 @dfn{EFI System +Partition} (ESP) is required. This partition can be mounted at +@file{/boot/efi} for instance and must have the @code{esp} flag set. E.g., +for @command{parted}: @example -$ guix package -s malloc | recsel -p name,version,relevance -name: jemalloc -version: 4.5.0 -relevance: 6 - -name: glibc -version: 2.25 -relevance: 1 - -name: libgc -version: 7.6.0 -relevance: 1 +parted /dev/sda set 1 esp on @end example -De manière similaire, pour montrer le nom de tous les paquets disponibles -sous license GNU@tie{}LGPL version 3 : +@quotation Remarque +@vindex grub-bootloader +@vindex grub-efi-bootloader +Vous n'êtes pas sûr de savoir si vous devez utiliser un GRUB EFI ou BIOS ? +Si le répertoire @file{/sys/firmware/efi} existe sur l'image d'installation, +vous devriez probablement effectuer une installation EFI, avec +@code{grub-efi-bootloader}. Sinon, vous devriez utiliser le GRUB en BIOS, +@code{grub-bootloader}. @xref{Configuration du chargeur d'amorçage} pour plus +d'information sur le chargeur d'amorçage. +@end quotation -@example -$ guix package -s "" | recsel -p name -e 'license ~ "LGPL 3"' -name: elfutils +Once you are done partitioning the target hard disk drive, you have to +create a file system on the relevant partition(s)@footnote{Currently Guix +System only supports ext4 and btrfs file systems. In particular, code that +reads file system UUIDs and labels only works for these file system +types.}. For the ESP, if you have one and assuming it is @file{/dev/sda1}, +run: -name: gmp -@dots{} +@example +mkfs.fat -F32 /dev/sda1 @end example -Il est aussi possible de raffiner les résultats de la recherche avec -plusieurs options @code{-s}. Par exemple, la commande suivante renvoie la -liste des jeux de plateau : +Préférez assigner une étiquette au système de fichier pour que vous puissiez +vous y référer de manière fiable dans la déclaration @code{file-system} +(@pxref{Systèmes de fichiers}). On le fait habituellement avec l'option @code{-L} +de @command{mkfs.ext4} et des commandes liées. Donc, en supposant que la +partition racine soit sur @file{/dev/sda2}, on peut créer un système de +fichier avec pour étiquette @code{my-root} avec : @example -$ guix package -s '\' -s game | recsel -p name -name: gnubg -@dots{} +mkfs.ext4 -L my-root /dev/sda2 @end example -Si on avait oublié @code{-s game}, on aurait aussi eu les paquets logiciels -qui s'occupent de circuits imprimés (en anglais : circuit board) ; supprimer -les chevrons autour de @code{board} aurait aussi ajouté les paquets qui -parlent de clavier (en anglais : key@emph{board}). - -Et maintenant un exemple plus élaboré. La commande suivante recherche les -bibliothèques cryptographiques, retire les bibliothèques Haskell, Perl, -Python et Ruby et affiche le nom et le synopsis des paquets correspondants : +@cindex chiffrement du disque +Si vous voulez plutôt chiffrer la partition racine, vous pouvez utiliser les +utilitaires Cryptsetup et LUKS pour cela (voir @inlinefmtifelse{html, +@uref{https://linux.die.net/man/8/cryptsetup, @code{man cryptsetup}}, +@code{man cryptsetup}} pour plus d'informations). En supposant que vous +voulez stocker la partition racine sur @file{/dev/sda2}, la séquence de +commandes suivante vous mènerait à ce résultat : @example -$ guix package -s crypto -s library | \ - recsel -e '! (name ~ "^(ghc|perl|python|ruby)")' -p name,synopsis +cryptsetup luksFormat /dev/sda2 +cryptsetup open --type luks /dev/sda2 my-partition +mkfs.ext4 -L my-root /dev/mapper/my-partition @end example -@noindent -@xref{Selection Expressions,,, recutils, GNU recutils manual} pour plus -d'information sur les @dfn{expressions de sélection} pour @code{recsel -e}. - -@item --show=@var{paquet} -Afficher les détails du @var{paquet} dans la liste des paquets disponibles, -au format @code{recutils} (@pxref{Top, GNU recutils databases,, recutils, -GNU recutils manual}). +Une fois cela effectué, montez le système de fichier cible dans @file{/mnt} +avec une commande comme (de nouveau, en supposant que @code{my-root} est +l'étiquette du système de fichiers racine) : @example -$ guix package --show=python | recsel -p name,version -name: python -version: 2.7.6 - -name: python -version: 3.3.5 +mount LABEL=my-root /mnt @end example -Vous pouvez aussi spécifier le nom complet d'un paquet pour n'avoir que les -détails concernant une version spécifique : +Also mount any other file systems you would like to use on the target system +relative to this path. If you have opted for @file{/boot/efi} as an EFI +mount point for example, mount it at @file{/mnt/boot/efi} now so it is found +by @code{guix system init} afterwards. + +Enfin, si vous souhaitez utiliser une ou plusieurs partitions de swap +(@pxref{Memory Concepts, swap space,, libc, The GNU C Library Reference +Manual}), assurez-vous de les initialiser avec @command{mkswap}. En +supposant que vous avez une partition de swap sur @file{/dev/sda3}, vous +pouvez lancer : + @example -$ guix package --show=python@@3.4 | recsel -p name,version -name: python -version: 3.4.3 +mkswap /dev/sda3 +swapon /dev/sda3 @end example +Autrement, vous pouvez utiliser un fichier de swap. Par exemple, en +supposant que dans le nouveau système vous voulez utiliser le fichier +@file{/swapfile} comme fichier de swap, vous lanceriez@footnote{Cet exemple +fonctionnera sur plusieurs types de systèmes de fichiers (p.@: ex.@: ext4). +Cependant, pour les systèmes de fichiers qui utilisent la copie sur écriture +(COW) comme btrfs, les étapes requises peuvent varier. Pour plus de +détails, regardez les pages de manuel de @command{mkswap} et +@command{swapon}.} : +@example +# Cela représente 10 Gio d'espace d'échange. Ajustez « count » pour changer la taille. +dd if=/dev/zero of=/mnt/swapfile bs=1MiB count=10240 +# Par sécurité, laissez le fichier en lecture et en écriture uniquement pour root. +chmod 600 /mnt/swapfile +mkswap /mnt/swapfile +swapon /mnt/swapfile +@end example -@item --list-installed[=@var{regexp}] -@itemx -I [@var{regexp}] -Liste les paquets actuellement installés dans le profil spécifié, avec les -paquets les plus récemment installés en dernier. Lorsque @var{regexp} est -spécifié, liste uniquement les paquets installés dont le nom correspond à -@var{regexp}. +Remarquez que si vous avez chiffré la partition racine et créé un fichier +d'échange dans son système de fichier comme décrit ci-dessus, alors le +chiffrement protégera aussi le fichier d'échange, comme n'importe quel +fichier de ce système de fichiers. -Pour chaque paquet installé, affiche les éléments suivants, séparés par des -tabulations : le nom du paquet, sa version, la partie du paquet qui est -installé (par exemple, @code{out} pour la sortie par défaut, @code{include} -pour ses en-têtes, etc) et le chemin du paquet dans le dépôt. +@node Effectuer l'installation +@section Effectuer l'installation -@item --list-available[=@var{regexp}] -@itemx -A [@var{regexp}] -Lister les paquets actuellement disponibles dans la distribution pour ce -système (@pxref{Distribution GNU}). Lorsque @var{regexp} est spécifié, -liste uniquement les paquets dont le nom correspond à @var{regexp}. +Lorsque la partition cible est prête et que les autres partitions sont +montées, on est prêt à commencer l'installation. Commencez par : -Pour chaque paquet, affiche les éléments suivants séparés par des -tabulations : son nom, sa version, les parties du paquet (@pxref{Des paquets avec plusieurs résultats}), et l'emplacement de sa définition. +@example +herd start cow-store /mnt +@end example -@item --list-generations[=@var{motif}] -@itemx -l [@var{motif}] -@cindex générations -Renvoyer la liste des générations avec leur date de création ; pour chaque -génération, montre les paquets installés avec les paquets installés les plus -récemment en dernier. Remarquez que la zéroième génération n'est jamais -montrée. +Cela rend @file{/gnu/store} capable de faire de la copie sur écriture, de +sorte que les paquets ajoutés pendant l'installation sont écrits sur le +disque cible sur @file{/mnt} plutôt que gardés en mémoire. Cela est +nécessaire parce que la première phase de la commande @command{guix system +init} (voir plus bas) implique de télécharger ou de construire des éléments +de @file{/gnu/store} qui est initialement un système de fichiers en mémoire. -Pour chaque paquet installé, afficher les éléments suivants, séparés par des -tabulations : le nom du paquet, sa version, la partie du paquet qui a été -installée (@pxref{Des paquets avec plusieurs résultats}), et l'emplacement du -paquet dans le dépôt. +Ensuite, vous devrez modifier un fichier et fournir la déclaration du +système à installer. Pour cela, le système d'installation propose trois +éditeurs de texte. Nous recommandons GNU nano (@pxref{Top,,, nano, GNU nano +Manual}), qui supporte la coloration syntaxique la correspondance de +parenthèses ; les autres éditeurs sont GNU Zile (un clone d'Emacs) et nvi +(un clone de l'éditeur @command{vi} original de BSD). Nous recommandons +vivement de stocker ce fichier sur le système de fichier racine cible, +disons en tant que @file{/mnt/etc/config.scm}. Sinon, vous perdrez votre +fichier de configuration une fois que vous aurez redémarré sur votre nouveau +système. -Lorsque @var{motif} est utilisé, la commande ne renvoie que les générations -correspondantes. Les motifs valides sont : +@xref{Utiliser le système de configuration}, pour un aperçu de comment créer votre +fichier de configuration. Les exemples de configuration dont on parle dans +cette section sont disponibles dans @file{/etc/configuration} sur l'image +d'installation. Ainsi, pour commencer avec une configuration du système qui +fournit un serveur d'affichage graphique (un système de « bureau »), vous +pouvez lancer ce qui suit : -@itemize -@item @emph{Des entiers et des entiers séparés par des virgules}. Les deux motifs correspondent -à des numéros de version. Par exemple, @code{--list-generations=1} renvoie -la première. +@example +# mkdir /mnt/etc +# cp /etc/configuration/desktop.scm /mnt/etc/config.scm +# nano /mnt/etc/config.scm +@end example -Et @code{--list-generations=1,8,2} renvoie les trois générations dans -l'ordre spécifié. Aucune espace ni virgule surnuméraire n'est permise. +Vous devriez faire attention à ce que contient votre fichier de +configuration, en particulier : -@item @emph{Des interval}. @code{--list-generations=2..9} affiche les -générations demandées et tout ce qui se trouvent entre elles. Remarquez que -le début d'un interval doit être plus petit que sa fin. +@itemize +@item +Make sure the @code{bootloader-configuration} form refers to the target you +want to install GRUB on. It should mention @code{grub-bootloader} if you +are installing GRUB in the legacy way, or @code{grub-efi-bootloader} for +newer UEFI systems. For legacy systems, the @code{target} field names a +device, like @code{/dev/sda}; for UEFI systems it names a path to a mounted +EFI partition, like @code{/boot/efi}; do make sure the path is currently +mounted and a @code{file-sytem} entry is specified in your configuration. -Il est aussi possible d'omettre le numéro final. Par exemple, -@code{--list-generations=2..} renvoie toutes les générations à partir de la -deuxième. +@item +Assurez-vous que les étiquettes de vos systèmes de fichiers correspondent +aux valeurs de leur champs @code{device} dans votre configuration +@code{file-system}, en supposant que la configuration @code{file-system} +utilise la procédure @code{file-system-label} dans son champ @code{device}. -@item @emph{Des durées}. Vous pouvez aussi récupérer les derniers @emph{N}@tie{}jours, semaines, -ou moins en passant un entier avec la première lettre de la durée (en -anglais : d, w ou m). Par exemple @code{--list-generations=20d} liste les -générations qui sont agées d'au plus 20 jours. +@item +Si vous avez des partitions RAID ou chiffrées, assurez-vous d'ajouter un +champ @code{mapped-device} pour les décrire (@pxref{Périphériques mappés}). @end itemize -@item --delete-generations[=@var{motif}] -@itemx -d [@var{motif}] -Lorsque @var{motif} est omis, supprimer toutes les générations en dehors de -l'actuelle. +Une fois que vous avez fini les préparatifs sur le fichier de configuration, +le nouveau système peut être initialisé (rappelez-vous que le système de +fichiers racine cible est dans @file{/mnt}) : -Cette commande accepte les même motifs que @option{--list-generations}. -Lorsque @var{motif} est spécifié, supprimer les générations correspondante. -Lorsque @var{motif} spécifie une durée, les générations @emph{plus vieilles} -que la durée spécifiée correspondent. Par exemple -@code{--delete-generations=1m} supprime les générations vieilles de plus -d'un mois. +@example +guix system init /mnt/etc/config.scm /mnt +@end example -Si la génération actuelle correspond, elle n'est @emph{pas} supprimée. La -zéroième génération n'est elle non plus jamais supprimée. +@noindent +Cela copie tous les fichiers nécessaires et installe GRUB sur +@file{/dev/sdX} à moins que vous ne passiez l'option +@option{--no-bootloader}. Pour plus d'informations, @pxref{Invoquer guix system}. Cette commande peut engendrer des téléchargements ou des +constructions pour les paquets manquants, ce qui peut prendre du temps. -Remarquez que supprimer des générations empêche de revenir en arrière vers -elles. Ainsi, cette commande doit être utilisée avec précaution. +Une fois que cette commande a terminée — et on l'espère réussi ! — vous +pouvez lancer @command{reboot} et démarrer sur votre nouveau système. Le +mot de passe @code{root} est d'abord vide ; les mots de passe des autres +utilisateurs doivent être initialisés avec la commande @command{passwd} en +tant que @code{root}, à mois que votre configuration ne spécifie autre chose +(@pxref{user-account-password, mot de passe des comptes utilisateurs}). -@end table +@cindex upgrading Guix System +From then on, you can update the system whenever you want by running, say: -Enfin, comme @command{guix package} peut démarrer des processus de -construction, elle supporte les options de construction communes -(@pxref{Options de construction communes}). Elle supporte aussi les options de -transformation de paquets comme @option{--with-source} (@pxref{Options de transformation de paquets}). Cependant, remarquez que les transformations de -paquets sont perdues à la mise à jour ; pour les préserver à travers les -mises à jours, vous devriez définir vos propres variantes des paquets dans -une module Guile et l'ajouter à @code{GUIX_PACKAGE_PATH} (@pxref{Définition des paquets}). +@example +guix pull +sudo guix system reconfigure /etc/config.scm +@end example -@node Substituts -@section Substituts +@noindent +This builds a new system generation with the latest packages and services +(@pxref{Invoquer guix system}). We recommend doing that regularly so that +your system includes the latest security updates (@pxref{Mises à jour de sécurité}). -@cindex substituts -@cindex binaires pré-construits -Guix gère le déploiement depuis des binaires ou des sources de manière -transparente ce qui signifie qu'il peut aussi bien construire localement que -télécharger des éléments pré-construits depuis un serveur ou les deux. Nous -appelons ces éléments pré-construits des @dfn{substituts} — ils se -substituent aux résultats des constructions locales. Dans la plupart des -cas, télécharger un substitut est bien plus rapide que de construire les -choses localement. +@c See . +@quotation Remarque +@cindex sudo vs. @command{guix pull} +Note that @command{sudo guix} runs your user's @command{guix} command and +@emph{not} root's, because @command{sudo} leaves @code{PATH} unchanged. To +explicitly run root's @command{guix}, type @command{sudo -i guix @dots{}}. +@end quotation -Les substituts peuvent être tout ce qui résulte d'une construction de -dérivation (@pxref{Dérivations}). Bien sûr dans le cas général, il s'agit -de paquets binaires pré-construits, mais les archives des sources par -exemple résultent aussi de la construction d'une dérivation qui peut aussi -être disponible en tant que substitut. +Join us on @code{#guix} on the Freenode IRC network or on +@email{guix-devel@@gnu.org} to share your experience---good or not so good. -@menu -* Serveur de substituts officiel:: Une source particulière de substituts. -* Autoriser un serveur de substituts:: Comment activer ou désactiver les - substituts. -* Authentification des substituts:: Coment Guix vérifie les substituts. -* Paramètres de serveur mandataire:: Comment récupérer des substituts à - travers un serveur mandataire. -* Échec de substitution:: Qu'arrive-t-il quand la substitution échoue. -* De la confiance en des binaires:: Comment pouvez-vous avoir confiance en - un paquet binaire ? -@end menu +@node Installing Guix in a VM +@section Installing Guix in a Virtual Machine -@node Serveur de substituts officiel -@subsection Serveur de substituts officiel +@cindex virtual machine, Guix System installation +@cindex serveur privé virtuel (VPS) +@cindex VPS (serveur privé virtuel) +If you'd like to install Guix System in a virtual machine (VM) or on a +virtual private server (VPS) rather than on your beloved machine, this +section is for you. -@cindex hydra -@cindex ferme de construction -Le serveur @code{mirror.hydra.gnu.org} est une interface à la ferme de -construction officielle qui construit des paquets pour Guix continuellement -pour certaines architectures et les rend disponibles en tant que -substituts. C'est la source par défaut des substituts ; elle peut être -modifiée en passant l'option @option{--substitute-urls} soit à -@command{guix-daemon} (@pxref{daemon-substitute-urls,, @code{guix-daemon ---substitute-urls}}) soit aux outils clients comme @command{guix package} -(@pxref{client-substitute-urls,, client @option{--substitute-urls} option}). +To boot a @uref{http://qemu.org/,QEMU} VM for installing Guix System in a +disk image, follow these steps: -Les URL des substituts peuvent être soit en HTTP soit en HTTPS. Le HTTPS -est recommandé parce que les communications sont chiffrées ; à l'inverse -HTTP rend les communications visibles pour un espion qui peut utiliser les -informations accumulées sur vous pour déterminer par exemple si votre -système a des vulnérabilités de sécurités non corrigées. +@enumerate +@item +First, retrieve and decompress the Guix system installation image as +described previously (@pxref{Installation depuis une clef USB ou un DVD}). -Les substituts de la ferme de construction officielle sont activés par -défaut dans la distribution système Guix (@pxref{Distribution GNU}). -Cependant, ils sont désactivés par défaut lorsque vous utilisez Guix sur une -distribution externe, à moins que vous ne les ayez explicitement activés via -l'une des étapes d'installation recommandées (@pxref{Installation}). Les -paragraphes suivants décrivent comment activer ou désactiver les substituts -de la ferme de construction ; la même procédure peut être utilisée pour -activer les substituts de n'importe quel autre serveur de substituts. +@item +Créez une image disque qui contiendra le système installé. Pour créer une +image qcow2, utilise la commande @command{qemu-img} : -@node Autoriser un serveur de substituts -@subsection Autoriser un serveur de substituts +@example +qemu-img create -f qcow2 guixsd.img 50G +@end example -@cindex sécurité -@cindex substituts, autorisations -@cindex liste de contrôle d'accès (ACL), pour les substituts -@cindex ACL (liste de contrôle d'accès), pour les substituts -Pour permettre à Guix de télécharger les substituts depuis -@code{hydra.gnu.org} ou un mirroir, vous devez ajouter sa clef publique à la -liste de contrôle d'accès (ACL) des imports d'archives, avec la commande -@command{guix archive} (@pxref{Invoquer guix archive}). Cela implique que -vous faîtes confiance à @code{hydra.gnu.org} pour ne pas être compromis et -vous servir des substituts authentiques. +Le fichier qui en résulte sera bien plus petit que les 50 Go (habituellement +moins de 1 Mo) mais il grossira au fur et à mesure que le stockage virtuel +grossira. -La clef publique pour @code{hydra.gnu.org} est installée avec Guix, dans -@code{@var{préfixe}/share/guix/hydra.gnu.org.pub}, où @var{préfixe} est le -préfixe d'installation de Guix. Si vous avez installé Guix depuis les -sources, assurez-vous d'avoir vérifié la signature GPG de -@file{guix-@value{VERSION}.tar.gz} qui contient ce fichier de clef -publique. Ensuite vous pouvez lancer quelque chose comme ceci : +@item +Démarrez l'image d'installation USB dans une VM : @example -# guix archive --authorize < @var{préfixe}/share/guix/hydra.gnu.org.pub +qemu-system-x86_64 -m 1024 -smp 1 \ + -net user -net nic,model=virtio -boot menu=on \ + -drive file=guixsd-install-@value{VERSION}.@var{system}.iso \ + -drive file=guixsd.img @end example -@quotation Remarque -De même, le fichier @file{berlin.guixsd.org.pub} contient la clef publique -de la nouvelle ferme de construction du projet, disponible depuis -@indicateurl{https://berlin.guixsd.org}. - -Au moment où ces lignes sont écrites, @code{berlin.guixsd.org} est mis à -niveau pour mieux passer à l'échelle, mais vous pourriez vouloir le tester. -Il est associé à 20 nœuds de construction x86_64/i686 et pourrait fournir -des substituts plus rapidement que @code{mirror.hydra.gnu.org} -@end quotation +L'ordre des périphérique est important -Une fois que cela est en place, la sortie d'une commande comme @code{guix -build} devrait changer de quelque chose comme : +Dans la console de la VM, appuyez rapidement sur @kbd{F12} pour entrer dans +le menu de démarrage. Ensuite appuyez sur @kbd{2} et la touche @kbd{Entrée} +pour valider votre choix. -@example -$ guix build emacs --dry-run -Les dérivations suivantes seraient construites : - /gnu/store/yr7bnx8xwcayd6j95r2clmkdl1qh688w-emacs-24.3.drv - /gnu/store/x8qsh1hlhgjx6cwsjyvybnfv2i37z23w-dbus-1.6.4.tar.gz.drv - /gnu/store/1ixwp12fl950d15h2cj11c73733jay0z-alsa-lib-1.0.27.1.tar.bz2.drv - /gnu/store/nlma1pw0p603fpfiqy7kn4zm105r5dmw-util-linux-2.21.drv -@dots{} -@end example +@item +Vous êtes maintenant root dans la VM, continuez en suivant la procédure +d'installation. @xref{Préparer l'installation}, et suivez les +instructions. +@end enumerate -@noindent -à quelque chose comme : +Once installation is complete, you can boot the system that's on your +@file{guixsd.img} image. @xref{Running Guix in a VM}, for how to do that. + +@node Construire l'image d'installation +@section Construire l'image d'installation + +@cindex image d'installation +L'image d'installation décrite plus haut a été construite avec la commande +@command{guix system}, plus précisément : @example -$ guix build emacs --dry-run -112.3 Mo seraient téléchargés : - /gnu/store/pk3n22lbq6ydamyymqkkz7i69wiwjiwi-emacs-24.3 - /gnu/store/2ygn4ncnhrpr61rssa6z0d9x22si0va3-libjpeg-8d - /gnu/store/71yz6lgx4dazma9dwn2mcjxaah9w77jq-cairo-1.12.16 - /gnu/store/7zdhgp0n1518lvfn8mb96sxqfmvqrl7v-libxrender-0.9.7 -@dots{} +guix system disk-image --file-system-type=iso9660 \ + gnu/system/install.scm @end example -@noindent -Cela indique que les substituts de @code{hydra.gnu.org} sont utilisables et -seront téléchargés, si possible, pour les futures constructions. - -@cindex substituts, comment les désactiver -Le mécanisme de substitution peut être désactivé globalement en lançant -@code{guix-daemon} avec @code{--no-substitutes} (@pxref{Invoquer guix-daemon}). Il peut aussi être désactivé temporairement en passant -l'option @code{--no-substitutes} à @command{guix package}, @command{guix -build} et aux autres outils en ligne de commande. +Regardez le fichier @file{gnu/system/install.scm} dans l'arborescence des +sources et regardez aussi @ref{Invoquer guix system} pour plus +d'informations sur l'image d'installation. -@node Authentification des substituts -@subsection Authentification des substituts +@section Construire l'image d'installation pour les cartes ARM -@cindex signatures numériques -Guix détecte et lève une erreur lorsqu'il essaye d'utiliser un substituts -qui a été modifié. De même, il ignore les substituts qui ne sont pas signés -ou qui ne sont pas signés par l'une des clefs listés dans l'ACL. +De nombreuses cartes ARM requièrent une variante spécifique du chargeur +d'amorçage @uref{http://www.denx.de/wiki/U-Boot/, U-Boot}. -Il y a une exception cependant : si un serveur non autorisé fournit des -substituts qui sont @emph{identiques bit-à-bit} à ceux fournis par un -serveur autorisé, alors le serveur non autorisé devient disponible pour les -téléchargements. Par exemple en supposant qu'on a choisi deux serveurs de -substituts avec cette option : +Si vous construisez une image disque et que le chargeur d'amorçage n'est pas +disponible autrement (sur un autre périphérique d'amorçage etc), il est +recommandé de construire une image qui inclus le chargeur d'amorçage, plus +précisément : @example ---substitute-urls="https://a.example.org https://b.example.org" +guix system disk-image --system=armhf-linux -e '((@@ (gnu system install) os-with-u-boot) (@@ (gnu system install) installation-os) "A20-OLinuXino-Lime2")' @end example -@noindent -@cindex constructions reproductibles -Si l'ACL contient uniquement la clef de @code{b.example.org}, et si -@code{a.example.org} sert @emph{exactement les mêmes} substituts, alors Guix -téléchargera les substituts de @code{a.example.org} parce qu'il vient en -premier dans la liste et peut être considéré comme un mirroir de -@code{b.example.org}. En pratique, des machines de constructions produisent -souvent les mêmes binaires grâce à des construction reproductibles au bit -près (voir plus bas). - -Lorsque vous utilisez HTTPS, le certificat X.509 du serveur n'est @emph{pas} -validé (en d'autre termes, le serveur n'est pas authentifié), contrairement -à ce que des clients HTTPS comme des navigateurs web font habituellement. -Cela est dû au fait que Guix authentifie les informations sur les substituts -eux-même, comme expliqué plus haut, ce dont on se soucie réellement (alors -que les certificats X.509 authentifie la relation entre nom de domaine et -clef publique). - -@node Paramètres de serveur mandataire -@subsection Paramètres de serveur mandataire +@code{A20-OLinuXino-Lime2} est le nom de la carte. Si vous spécifiez une +carte invalide, une liste de cartes possibles sera affichée. -@vindex http_proxy -Les substituts sont téléchargés par HTTP ou HTTPS. La variable -d'environnement @code{http_proxy} peut être initialisée dans l'environnement -de @command{guix-daemon} et est respectée pour le téléchargement des -substituts. Remarquez que la valeur de @code{http_proxy} dans -l'environnement où tournent @command{guix build}, @command{guix package} et -les autres clients n'a @emph{absolument aucun effet}. +@c ********************************************************************* +@node Gestion de paquets +@chapter Gestion de paquets -@node Échec de substitution -@subsection Échec de substitution +@cindex paquets +Le but de GNU Guix est de permettre à ses utilisateurs d'installer, mettre à +jour et supprimer facilement des paquets logiciels sans devoir connaître +leur procédure de construction ou leurs dépendances. Guix va aussi plus +loin que ces fonctionnalités évidentes. -Même lorsqu'un substitut pour une dérivation est disponible, la substitution -échoue parfois. Cela peut arriver pour plusieurs raisons : le serveur de -substitut peut être hors ligne, le substitut a récemment été supprimé du -serveur, la connexion peut avoir été interrompue, etc. +Ce chapitre décrit les principales fonctionnalités de Guix, ainsi que des +outils de gestion des paquets qu'il fournit. En plus de l'interface en +ligne de commande décrite en dessous de (@pxref{Invoquer guix package, +@code{guix package}}), vous pouvez aussi utiliser l'interface Emacs-Guix +(@pxref{Top,,, emacs-guix, Le manuel de référence de emacs-guix}), après +avoir installé le paquet @code{emacs-guix} (lancez la commande @kbd{M-x +guix-help} pour le démarrer) : -Lorsque les substituts sont activés et qu'un substitut pour une dérivation -est disponible, mais que la tentative de substitution échoue, Guix essaiera -de construire la dérivation localement si @code{--fallback} a été passé en -argument (@pxref{option de repli,, common build option @code{--fallback}}). -Plus spécifiquement, si cet option n'a pas été passée en argument, alors -aucune construction locale n'est effectuée et la dérivation est considérée -comme étant en échec. Cependant, si @code{--fallback} est passé en argument, -alors Guix essaiera de construire la dérivation localement et l'échec ou le -succès de la dérivation dépend de l'échec ou du succès de la construction -locale. Remarquez que lorsque les substituts sont désactivés ou qu'aucun -substitut n'est disponible pour la dérivation en question, une construction -locale sera @emph{toujours} effectuée, indépendamment du fait que l'argument -@code{--fallback} ait été ou non passé. +@example +guix package -i emacs-guix +@end example -Pour se donner une idée du nombre de substituts disponibles maintenant, vous -pouvez essayer de lancer la commande @command{guix weather} (@pxref{Invoquer guix weather}). Cette command fournit des statistiques sur les substituts -fournis par un serveur. +@menu +* Fonctionnalités:: Comment Guix va rendre votre vie plus heureuse. +* Invoquer guix package:: Installation, suppression, etc.@: de paquets. +* Substituts:: Télécharger des binaire déjà construits. +* Des paquets avec plusieurs résultats:: Un seul paquet source, plusieurs + résultats. +* Invoquer guix gc:: Lancer le ramasse-miettes. +* Invoquer guix pull:: Récupérer la dernière version de Guix et de + la distribution. +* Canaux:: Personnaliser la collection des paquets. +* Inférieurs:: Interagir avec une autre révision de Guix. +* Invoquer guix describe:: Affiche des informations sur la révision Guix + actuelle. +* Invoquer guix archive:: Exporter et importer des fichiers du dépôt. +@end menu -@node De la confiance en des binaires -@subsection De la confiance en des binaires +@node Fonctionnalités +@section Fonctionnalités -@cindex confiance, en des binaires pré-construits -De nos jours, le contrôle individuel sur son utilisation propre de -l'informatique est à la merci d'institutions, de sociétés et de groupes avec -assez de pouvoir et de détermination pour contourner les infrastructures -informatiques et exploiter leurs faiblesses. Bien qu'utiliser les -substituts de @code{hydra.gnu.org} soit pratique, nous encourageons les -utilisateurs à construire aussi par eux-même, voir à faire tourner leur -propre ferme de construction, pour que @code{hydra.gnu.org} devienne une -cible moins intéressante. Une façon d'aider est de publier les logiciels -que vous construisez avec @command{guix publish} pour que les autres aient -plus de choix de serveurs où télécharger les substituts (@pxref{Invoquer guix publish}). +Lorsque vous utilisez Guix, chaque paquet arrive dans @dfn{dépôt des +paquets}, dans son propre répertoire — quelque chose comme +@file{/gnu/store/xxx-paquet-1.2}, où @code{xxx} est une chaîne en base32. -Guix possède les fondations pour maximiser la reproductibilité logicielle -(@pxref{Fonctionnalités}). Dans la plupart des cas, des constructions -indépendantes d'un paquet donnée ou d'une dérivation devrait donner des -résultats identiques au bit près. Ainsi, à travers un ensemble de -constructions de paquets indépendantes il est possible de renforcer -l'intégrité du système. La commande @command{guix challenge} a pour but -d'aider les utilisateurs à tester les serveurs de substituts et à aider les -développeurs à trouver les constructions de paquets non-déterministes -(@pxref{Invoquer guix challenge}). De même, l'option @option{--check} de -@command{guix build} permet aux utilisateurs de vérifier si les substituts -précédemment installés sont authentiques en les reconstruisant localement -(@pxref{vérification de la construction, @command{guix build --check}}). +Plutôt que de se rapporter à ces répertoires, les utilisateurs ont leur +propre @dfn{profil} qui pointe vers les paquets qu'ils veulent vraiment +utiliser. Ces profils sont stockés dans le répertoire personnel de chaque +utilisateur dans @code{$HOME/.guix-profile}. -Dans le futur, nous aimerions que Guix puisse publier et recevoir des -binaires d'autres utilisateurs, d'une manière pair-à-pair. Si vous voulez -discuter de ce projet, rejoignez-nous sur @email{guix-devel@@gnu.org}. +Par exemple, @code{alice} installe GCC 4.7.2. Il en résulte que +@file{/home/alice/.guix-profile/bin/gcc} pointe vers +@file{/gnu/store/@dots{}-gcc-4.7.2/bin/gcc}. Maintenant, sur la même +machine, @code{bob} a déjà installé GCC 4.8.0. Le profil de @code{bob} +continue simplement de pointer vers +@file{/gnu/store/@dots{}-gcc-4.8.0/bin/gcc} — c.-à-d.@: les deux versions de +GCC coexistent surs le même système sans aucune interférence. -@node Des paquets avec plusieurs résultats -@section Des paquets avec plusieurs résultats +La commande @command{guix package} est l'outil central pour gérer les +paquets (@pxref{Invoquer guix package}). Il opère sur les profils +utilisateurs et peut être utilisé avec les @emph{privilèges utilisateurs +normaux}. -@cindex paquets avec plusieurs résultats -@cindex sorties de paquets -@cindex sorties +@cindex transactions +La commande fournit les opérations évidentes d'installation, de suppression +et de mise à jour. Chaque invocation est en fait une @emph{transaction} : +soit l'opération demandée réussi, soit rien ne se passe. Ainsi, si le +processus @command{guix package} est terminé pendant la transaction ou si +une panne de courant arrive pendant la transaction, le profil de +l'utilisateur reste dans son état précédent et reste utilisable. -Souvent, les paquets définis dans Guix ont une seule @dfn{sortie} — -c.-à-d.@: que le paquet source conduit à exactement un répertoire dans le -dépôt. Lorsque vous lancez @command{guix package -i glibc}, vous installez -la sortie par défaut du paquet GNU libc ; la sortie par défaut est appelée -@code{out} mais son nom peut être omis comme le montre cette commande. Dans -ce cas particuliers, la sortie par défaut de @code{glibc} contient tous les -fichiers d'en-tête C, les bibliothèques partagées, les bibliothèques -statiques, la documentation Info et les autres fichiers de support. +In addition, any package transaction may be @emph{rolled back}. So, if, for +example, an upgrade installs a new version of a package that turns out to +have a serious bug, users may roll back to the previous instance of their +profile, which was known to work well. Similarly, the global system +configuration on Guix is subject to transactional upgrades and roll-back +(@pxref{Utiliser le système de configuration}). -Parfois il est plus approprié de séparer les divers types de fichiers -produits par un même paquet source en plusieurs sorties. Par exemple, la -bibliothèque C GLib (utilisée par GTK+ et des paquets associés) installe -plus de 20 Mo de documentation de référence dans des pages HTML. Pour -préserver l'espace disque des utilisateurs qui n'en ont pas besoin, la -documentation va dans une sortie séparée nommée @code{doc}. Pour installer -la sortie principale de GLib, qui contient tout sauf la documentation, on -devrait lancer : +Tous les paquets du dépôt des paquets peut être @emph{glané}. Guix peut +déterminer quels paquets sont toujours référencés par les profils des +utilisateurs et supprimer ceux qui ne sont plus référencés de manière +prouvable (@pxref{Invoquer guix gc}). Les utilisateurs peuvent toujours +explicitement supprimer les anciennes générations de leur profil pour que +les paquets auxquels elles faisaient référence puissent être glanés. -@example -guix package -i glib -@end example +@cindex reproductibilité +@cindex constructions reproductibles +Guix prend une approche @dfn{purement fonctionnelle} de la gestion de +paquets, telle que décrite dans l'introduction (@pxref{Introduction}). +Chaque nom de répertoire de paquet dans @file{/gnu/store} contient un hash +de toutes les entrées qui ont été utilisées pendant la construction de ce +paquet — le compilateur, les bibliothèques, les scripts de construction, +etc. Cette correspondance directe permet aux utilisateurs de s'assurer que +l'installation d'un paquet donné correspond à l'état actuel de leur +distribution. Elle aide aussi à maximiser la @dfn{reproductibilité} : grâce +aux environnements de construction utilisés, une construction donnée à de +forte chances de donner des fichiers identiques bit-à-bit lorsqu'elle est +effectuée sur des machines différents (@pxref{Invoquer guix-daemon, +container}). -@cindex documentation -La commande pour installer la documentation est : +@cindex substituts +Ce fondement permet à Guix de supporter le @dfn{déploiement transparent de +binaire ou source}. Lorsqu'une binaire pré-construit pour une entrée de +@file{/gnu/store} est disponible depuis une source externe (un +@dfn{substitut}), Guix le télécharge simplement et le décompresse ; sinon, +il construit le paquet depuis les sources localement (@pxref{Substituts}). +Comme les résultats des constructions sont généralement reproductibles au +bit près, si vous n'avez pas besoin de faire confiance aux serveurs qui +fournissent les substituts : vous pouvez forcer une construction locale et +@emph{défier} les fournisseurs (@pxref{Invoquer guix challenge}). -@example -guix package -i glib:doc -@end example +Le contrôle de l'environnement de construction est aussi une fonctionnalité +utile pour les développeurs. La commande @command{guix environment} permet +aux développeurs d'un paquet de mettre en place rapidement le bon +environnement de développement pour leur paquet, sans avoir à installer +manuellement les dépendances du paquet dans leur profil (@pxref{Invoquer guix environment}). -Certains paquets installent des programmes avec des « empreintes dépendances -» différentes. Par exemple le paquet WordNet installe à la fois les outils -en ligne de commande et les interfaces graphiques (GUI). La première ne -dépend que de la bibliothèque C, alors que cette dernière dépend de Tcl/Tk -et des bibliothèques X sous-jacentes. Dans ce cas, nous laissons les outils -en ligne de commande dans la sortie par défaut et l'interface graphique dans -une sortie séparée. Cela permet aux utilisateurs qui n'ont pas besoin -d'interface graphique de gagner de la place. La commande @command{guix -size} peut aider à trouver ces situations (@pxref{Invoquer guix size}). @command{guix graph} peut aussi être utile (@pxref{Invoquer guix graph}). +@cindex réplication, des environnements logiciels +@cindex suivi de la provenance, des artefacts logiciels +La totalité de Guix et des définitions de paquets sont placés sous contrôle +de version, et @command{guix pull} vous permet de « voyager dans le temps » +de l'historique de Guix lui-même (@pxref{Invoquer guix pull}). Cela est +rend possible la réplication d'une instance Guix sur une machine différente +ou plus tard, ce qui vous permet de @emph{répliquer des environnements +logiciels complets}, tout en garantissant un @dfn{suivi de provenance} +précis des logiciels. -Il y a plusieurs paquets à sorties multiples dans la distribution GNU. -D'autres noms de sorties conventionnels sont @code{lib} pour les -bibliothèques et éventuellement les fichiers d'en-tête, @code{bin} pour les -programmes indépendants et @code{debug} pour les informations de débogage -(@pxref{Installer les fichiers de débogage}). Les sorties d'un paquet sont listés -dans la troisième colonne de la sortie de @command{guix package ---list-available} (@pxref{Invoquer guix package}). +@node Invoquer guix package +@section Invoquer @command{guix package} +@cindex installer des paquets +@cindex supprimer des paquets +@cindex installation de paquets +@cindex suppression de paquets +La commande @command{guix package} est l'outil qui permet d'installer, +mettre à jour et supprimer les paquets ainsi que de revenir à une +configuration précédente. Elle n'opère que dans le profil de l'utilisateur +et fonctionne avec les privilèges utilisateurs normaux +(@pxref{Fonctionnalités}). Sa syntaxe est : -@node Invoquer guix gc -@section Invoquer @command{guix gc} +@example +guix package @var{options} +@end example +@cindex transactions +@var{options} spécifie d'abord les opérations à effectuer pendant la +transaction. À la fin, une nouvelle génération du profil est créée mais les +@dfn{générations} précédentes du profil restent disponibles si l'utilisateur +souhaite y revenir. -@cindex ramasse-miettes -@cindex espace disque -Les paquets qui sont installés mais pas utilisés peuvent être @dfn{glanés}. -La commande @command{guix gc} permet aux utilisateurs de lancer -explicitement le ramasse-miettes pour récupérer de l'espace dans le -répertoire @file{/gnu/store}. C'est la @emph{seule} manière de supprimer -des fichiers de @file{/gnu/store} — supprimer des fichiers ou des -répertoires à la main peut le casser de manière impossible à réparer ! +Par exemple, pour supprimer @code{lua} et installer @code{guile} et +@code{guile-cairo} en une seule transaction : -@cindex racines du GC -@cindex racines du ramasse-miettes -Le ramasse-miettes a un ensemble de @dfn{racines} connues : tout fichier -dans @file{/gnu/store} atteignable depuis une racine est considéré comme -@dfn{utilisé} et ne peut pas être supprimé ; tous les autres fichiers sont -considérés comme @dfn{inutilisés} et peuvent être supprimés. L'ensemble des -racines du ramasse-miettes (ou « racines du GC » pour faire court) inclue -les profils par défaut des utilisateurs ; par défaut les liens symboliques -sous @file{/var/guix/gcroots} représentent ces racines du GC. De nouvelles -racines du GC peuvent être ajoutées avec la @command{guix build -- root} par -exemple (@pxref{Invoquer guix build}). +@example +guix package -r lua -i guile guile-cairo +@end example -Avant de lancer @code{guix gc --collect-garbage} pour faire de la place, -c'est souvent utile de supprimer les anciennes génération des profils -utilisateurs ; de cette façon les anciennes constructions de paquets -référencées par ces générations peuvent être glanées. Cela se fait en -lançaint @code{guix package --delete-generations} (@pxref{Invoquer guix package}). +@command{guix package} supporte aussi une @dfn{approche déclarative} où +l'utilisateur spécifie l'ensemble exact des paquets qui doivent être +disponibles le passe @i{via} l'option @option{--manifest} +(@pxref{profile-manifest, @option{--manifest}}). -Nous recommandons de lancer le ramasse-miettes régulièrement ou lorsque vous -avez besoin d'espace disque. Par exemple pour garantir qu'au moins -5@tie{}Go d'espace reste libre sur votre disque, lancez simplement : +@cindex profil +Pour chaque utilisateur, un lien symbolique vers le profil par défaut de cet +utilisateur est automatiquement créé dans @file{$HOME/.guix-profile}. Ce +lien symbolique pointe toujours vers la génération actuelle du profil par +défaut de l'utilisateur. Ainsi, les utilisateurs peuvent ajouter +@file{$HOME/.guix-profile/bin} à leur variable d'environnement @code{PATH} +etc. +@cindex chemins de recherche +Si vous n'utilisez pas la distribution système Guix, vous devriez ajouter +les lignes suivantes à votre @file{~/.bash_profile} (@pxref{Bash Startup +Files,,, bash, The GNU Bash Reference Manual}) pour que les shells créés +ensuite aient les bonnes définitions des variables d'environnement : @example -guix gc -F 5G +GUIX_PROFILE="$HOME/.guix-profile" ; \ +source "$HOME/.guix-profile/etc/profile" @end example -Il est parfaitement possible de le lancer comme une tâche périodique -non-interactive (@pxref{Exécution de tâches planifiées} pour apprendre comment -paramétrer une telle tâche sur GuixSD). Lancer @command{guix gc} sans -argument ramassera autant de miettes que possible mais ça n'est pas le plus -pratique : vous pourriez vous retrouver à reconstruire ou re-télécharger des -logiciels « inutilisés » du point de vu du GC mais qui sont nécessaires pour -construire d'autres logiciels — p.@: ex.@: la chaîne de compilation. +Dans un environnement multi-utilisateur, les profils utilisateurs sont +stockés comme une @dfn{racine du ramasse-miettes}, vers laquelle pointe +@file{$HOME/.guix-profile} (@pxref{Invoquer guix gc}). Ce répertoire est +normalement +@code{@var{localstatedir}/guix/profiles/per-user/@var{utilisateur}}, où +@var{localstatedir} est la valeur passée à @code{configure} avec +@code{--localstatedir} et @var{utilisateur} le nom d'utilisateur. Le +répertoire @file{per-user} est créé lorsque @command{guix-daemon} est +démarré et sous-répertoire @var{utilisateur} est créé par @command{guix +package}. -La command @command{guix gc} a trois modes d'opération : il peut être -utilisé pour glaner des fichiers inutilisés (par défaut), pour supprimer des -fichiers spécifiques (l'option @code{--delete}), pour afficher des -informations sur le ramasse-miettes ou pour des requêtes plus avancées. Les -options du ramasse-miettes sont : +Les @var{options} peuvent être les suivante : @table @code -@item --collect-garbage[=@var{min}] -@itemx -C [@var{min}] -Ramasse les miettes — c.-à-d.@: les fichiers inaccessibles de -@file{/gnu/store} et ses sous-répertoires. C'est l'opération par défaut -lorsqu'aucune option n'est spécifiée. - -Lorsque @var{min} est donné, s'arrêter une fois que @var{min} octets ont été -collectés. @var{min} pour être un nombre d'octets ou inclure un suffixe -d'unité, comme @code{MiB} pour mébioctet et @code{GB} pour gigaoctet -(@pxref{Block size, size specifications,, coreutils, GNU Coreutils}). -Lorsque @var{min} est omis, tout glaner. +@item --install=@var{paquet} @dots{} +@itemx -i @var{paquet} @dots{} +Installer les @var{paquet}s spécifiés. -@item --free-space=@var{libre} -@itemx -F @var{libre} -Glaner jusqu'à ce que @var{libre} espace soit disponible dans -@file{/gnu/store} si possible ; @var{libre} est une quantité de stockage -comme @code{500MiB} comme décrit ci-dessus. +Chaque @var{paquet} peut spécifier soit un simple nom de paquet, comme +@code{guile} ou un nom de paquet suivi d'un arobase et d'un numéro de +version, comme @code{guile@@1.8.8} ou simplement @code{guile@@1.8} (dans ce +dernier cas, la version la plus récente commençant par @code{1.8} est +utilisée). -Lorsque @var{libre} ou plus est disponible dans @file{/gnu/store} ne rien -faire et s'arrêter immédiatement. +Si aucun numéro de version n'est spécifié, la version la plus récente +disponible est choisie. En plus, @var{paquet} peut contenir un deux-points, +suivi du nom d'une des sorties du paquet, comme dans @code{gcc:doc} ou +@code{binutils@@2.22:lib} (@pxref{Des paquets avec plusieurs résultats}). Des +paquets avec un nom correspondant et (éventuellement une version) sont +recherchés dans les modules de la distribution GNU (@pxref{Modules de paquets}). -@item --delete -@itemx -d -Essayer de supprimer tous les fichiers et les répertoires du dépôt spécifiés -en argument. Cela échoue si certains des fichiers ne sont pas dans le dépôt -ou s'ils sont toujours utilisés. +@cindex entrées propagées +Parfois les paquets ont des @dfn{entrées propagées} : ce sont des +dépendances qui sont installées automatiquement avec le paquet demandé +(@pxref{package-propagated-inputs, @code{propagated-inputs} in +@code{package} objects} pour plus d'informations sur les entrées propagées +dans les définitions des paquets). -@item --list-failures -Lister les éléments du dépôt qui correspondent à des échecs de construction +@anchor{package-cmd-propagated-inputs} +Un exemple est la bibliothèque MPC de GNU : ses fichiers d'en-tête C se +réfèrent à ceux de la bibliothèque MPFR de GNU, qui se réfèrent en retour à +ceux de la bibliothèque GMP. Ainsi, lorsqu'on installe MPC, les +bibliothèques MPFR et GMP sont aussi installées dans le profil ; supprimer +MPC supprimera aussi MPFR et GMP — à moins qu'ils n'aient été aussi +installés explicitement par l'utilisateur. -Cela n'affiche rien à moins que le démon n'ait été démarré avec -@option{--cache-failures} (@pxref{Invoquer guix-daemon, -@option{--cache-failures}}). +D'autre part, les paquets dépendent parfois de la définition de variables +d'environnement pour leur chemin de recherche (voir les explications sur +@code{--search-paths} plus bas). Toute définition de variable +d'environnement manquante ou possiblement incorrecte est rapportée ici. -@item --clear-failures -Supprimer les éléments du dépôt spécifiés du cache des constructions -échouées. +@item --install-from-expression=@var{exp} +@itemx -e @var{exp} +Installer le paquet évalué par @var{exp} -De nouveau, cette option ne fait de sens que lorsque le démon est démarré -avec @option{--cache-failures}. Autrement elle ne fait rien. +@var{exp} doit être une expression Scheme qui s'évalue en un objet +@code{}. Cette option est notamment utile pour distinguer les +variantes d'un paquet avec le même nom, avec des expressions comme @code{(@@ +(gnu packages base) guile-final)}. -@item --list-dead -Montrer la liste des fichiers et des répertoires inutilisés encore présents -dans le dépôt — c.-à-d.@: les fichiers et les répertoires qui ne sont plus -atteignables par aucune racine. +Remarquez que cette option installe la première sortie du paquet, ce qui +peut être insuffisant lorsque vous avez besoin d'une sortie spécifique d'un +paquet à plusieurs sorties. -@item --list-live -Montrer la liste des fichiers et des répertoires du dépôt utilisés. +@item --install-from-file=@var{fichier} +@itemx -f @var{fichier} +Installer le paquet évalué par le code dans le @var{fichier}. -@end table +Par exemple, @var{fichier} peut contenir une définition comme celle-ci +(@pxref{Définition des paquets}) : -En plus, les références entre les fichiers existants du dépôt peuvent être -demandés : +@example +@verbatiminclude package-hello.scm +@end example -@table @code +Les développeurs peuvent trouver utile d'inclure un tel fichier +@file{guix.scm} à la racine de l'arborescence des sources de leur projet qui +pourrait être utilisé pour tester des versions de développement et créer des +environnements de développement reproductibles (@pxref{Invoquer guix environment}). -@item --references -@itemx --referrers -@cindex dépendances des paquets -Lister les références (respectivement les référents) des fichiers du dépôt -en argument. +@item --remove=@var{paquet} @dots{} +@itemx -r @var{paquet} @dots{} +Supprimer les @var{paquet}s spécifiés. -@item --requisites -@itemx -R -@cindex closure -Lister les prérequis des fichiers du dépôt passés en argument. Les -prérequis sont le fichier du dépôt lui-même, leur références et les -références de ces références, récursivement. En d'autre termes, la liste -retournée est la @dfn{closure transitive} des fichiers du dépôt. +Comme pour @code{--install}, chaque @var{paquet} peut spécifier un numéro de +version ou un nom de sortie en plus du nom du paquet. Par exemple, @code{-r +glibc:debug} supprimerait la sortie @code{debug} de @code{glibc}. -@xref{Invoquer guix size} pour un outil pour surveiller la taille de la -closure d'un élément. @xref{Invoquer guix graph} pour un outil pour -visualiser le graphe des références. +@item --upgrade[=@var{regexp} @dots{}] +@itemx -u [@var{regexp} @dots{}] +@cindex mettre à jour des paquets +Mettre à jour tous les paquets installés. Si une @var{regexp} ou plus est +spécifiée, la mise à jour n'installera que les paquets dont le nom +correspond à @var{regexp}. Voyez aussi l'option @code{--do-not-upgrade} en +dessous. -@item --derivers -@cindex dérivation -Renvoie les dérivations menant aux éléments du dépôt donnés -(@pxref{Dérivations}). +Remarquez que cela met à jour vers la dernière version des paquets trouvée +dans la distribution actuellement installée. Pour mettre à jour votre +distribution, vous devriez lancer régulièrement @command{guix pull} +(@pxref{Invoquer guix pull}). -Par exemple cette commande : +@item --do-not-upgrade[=@var{regexp} @dots{}] +Lorsqu'elle est utilisée avec l'option @code{--upgrade}, ne @emph{pas} +mettre à jour les paquets dont le nom correspond à @var{regexp}. Par +exemple, pour mettre à jour tous les paquets du profil actuel à l'exception +de ceux qui contiennent la chaîne « emacs » : @example -guix gc --derivers `guix package -I ^emacs$ | cut -f4` +$ guix package --upgrade . --do-not-upgrade emacs @end example -@noindent -renvoie les fichiers @file{.drv} menant au paquet @code{emacs} installé dans -votre profil. - -Remarquez qu'il peut n'y avoir aucun fichier @file{.drv} par exemple quand -ces fichiers ont été glanés. Il peut aussi y avoir plus d'un fichier -@file{.drv} correspondant à cause de dérivations à sortie fixées. -@end table - -Enfin, les options suivantes vous permettent de vérifier l'intégrité du -dépôt et de contrôler l'utilisation du disque. +@item @anchor{profile-manifest}--manifest=@var{fichier} +@itemx -m @var{fichier} +@cindex déclaration de profil +@cindex manifest de profil +Créer une nouvelle génération du profil depuis l'objet manifeste renvoyé par +le code Scheme dans @var{fichier}. -@table @option +Cela vous permet de @emph{déclarer} le contenu du profil plutôt que de le +construire avec une série de @code{--install} et de commandes similaires. +L'avantage étant que le @var{fichier} peut être placé sous contrôle de +version, copié vers d'autres machines pour reproduire le même profil, etc. -@item --verify[=@var{options}] -@cindex intégrité, du dépôt -@cindex vérification d'intégrité -Vérifier l'intégrité du dépôt. +@c FIXME: Add reference to (guix profile) documentation when available. +@var{fichier} doit retourner un objet @dfn{manifest} qui est en gros une +liste de paquets : -Par défaut, s'assurer que tous les éléments du dépôt marqués comme valides -dans la base de données du démon existent bien dans @file{/gnu/store}. +@findex packages->manifest +@example +(use-package-modules guile emacs) -Lorsqu'elle est fournie, l'@var{option} doit être une liste séparée par des -virgule de l'un ou plus parmi @code{contents} et @code{repair}. +(packages->manifest + (list emacs + guile-2.0 + ;; Utiliser une sortie spécifique d'un paquet. + (list guile-2.0 "debug"))) +@end example -Lorsque vous passez @option{--verify=contents}, le démon calcul le hash du -contenu de chaque élément du dépôt et le compare au hash de sa base de -données. Les différences de hash sont rapportées comme des corruptions de -données. Comme elle traverse @emph{tous les fichiers du dépôt}, cette -commande peut prendre très longtemps pour terminer, surtout sur un système -avec un disque lent. +@findex specifications->manifest +Dans cet exemple on doit savoir quels modules définissent les variables +@code{emacs} et @code{guile-2.0} pour fournir la bonne ligne +@code{use-package-modules} ce qui peut être embêtant. On peut à la place +fournir des spécifications de paquets normales et laisser +@code{specifications->manifest} rechercher les objets de paquets +correspondants, comme ceci : -@cindex réparer le dépôt -@cindex corruption, récupérer de -Utiliser @option{--verify=repair} ou @option{--verify=contents,repair} fait -que le démon essaie de réparer les objets du dépôt corrompus en récupérant -leurs substituts (@pxref{Substituts}). Comme la réparation n'est pas -atomique et donc potentiellement dangereuse, elle n'est disponible que pour -l'administrateur système. Une alternative plus légère lorsque vous -connaissez exactement quelle entrée est corrompue consiste à lancer -@command{guix build --repair} (@pxref{Invoquer guix build}). +@example +(specifications->manifest + '("emacs" "guile@@2.2" "guile@@2.2:debug")) +@end example -@item --optimize -@cindex déduplication -Optimiser le dépôt en liant en dur les fichiers identiques — c'est la -@dfn{déduplication}. +@item --roll-back +@cindex revenir en arrière +@cindex défaire des transactions +@cindex transactions, défaire +Revenir à la @dfn{génération} précédente du profil c.-à-d.@: défaire la +dernière transaction. -Le démon effectue une déduplication à chaque construction réussie ou import -d'archive à moins qu'il n'ait été démarré avec -@code{--disable-deduplication} (@pxref{Invoquer guix-daemon, -@code{--disable-deduplication}}). Ainsi, cette option est surtout utile -lorsque le démon tourne avec @code{--disable-deduplication}. +Lorsqu'elle est combinée avec des options comme @code{--install}, cette +option revient en arrière avant toute autre action. -@end table +Lorsque vous revenez de la première génération qui contient des fichiers, le +profil pointera vers la @dfn{zéroième génération} qui ne contient aucun +fichier en dehors de ses propres métadonnées. -@node Invoquer guix pull -@section Invoquer @command{guix pull} +Après être revenu en arrière, l'installation, la suppression et la mise à +jour de paquets réécrit les futures générations précédentes. Ainsi, +l'historique des générations dans un profil est toujours linéaire. -@cindex mettre à niveau Guix -@cindex mettre à jour Guix -@cindex @command{guix pull} -@cindex pull -Les paquets sont installés ou mis à jour vers la dernière version disponible -dans la distribution actuellement disponible sur votre machine locale. Pour -mettre à jour cette distribution, en même temps que les outils Guix, vous -devez lancer @command{guix pull} ; la commande télécharge le dernier code -source de Guix et des descriptions de paquets et le déploie. Le code source -est téléchargé depuis un dépôt @uref{https://git-scm.com, Git}, par défaut -le dépôt officiel de GNU@tie{}Guix, bien que cela puisse être personnalisé. +@item --switch-generation=@var{motif} +@itemx -S @var{motif} +@cindex générations +Basculer vers une génération particulière définie par le @var{motif}. -À la fin, @command{guix package} utilisera les paquets et les versions des -paquets de la copie de Guix tout juste récupérée. Non seulement ça, mais -toutes les commandes Guix et les modules Scheme seront aussi récupérés -depuis la dernière version. Les nouvelles sous-commandes de @command{guix} -ajoutés par la mise à jour sont aussi maintenant disponibles. +Le @var{motif} peut être soit un numéro de génération soit un nombre précédé +de « + » ou « - ». Ce dernier signifie : se déplacer en avant ou en arrière +d'un nombre donné de générations. Par exemple, si vous voulez retourner à +la dernière génération après @code{--roll-back}, utilisez +@code{--switch-generation=+1}. -Chaque utilisateur peut mettre à jour sa copie de Guix avec @command{guix -pull} et l'effet est limité à l'utilisateur qui a lancé @command{guix -pull}. Par exemple, lorsque l'utilisateur @code{root} lance @command{guix -pull}, cela n'a pas d'effet sur la version de Guix que vois @code{alice} et -vice-versa +La différence entre @code{--roll-back} et @code{--switch-generation=-1} est +que @code{--switch-generation} ne vous amènera pas à la zéroième génération, +donc si la génération demandée n'existe pas la génération actuelle ne +changera pas. -Le résultat après avoir lancé @command{guix pull} est un @dfn{profil} -disponible sous @file{~/.config/guix/current} contenant la dernière version -de Guix. Ainsi, assurez-vous de l'ajouter au début de votre chemin de -recherche pour que vous utilisiez la dernière version. Le même conseil -s'applique au manuel Info (@pxref{Documentation}) : +@item --search-paths[=@var{genre}] +@cindex chemins de recherche +Rapporter les définitions des variables d'environnement dans la syntaxe Bash +qui peuvent être requises pour utiliser l'ensemble des paquets installés. +Ces variables d'environnement sont utilisées pour spécifier les @dfn{chemins +de recherche} de fichiers utilisés par les paquets installés. -@example -export PATH="$HOME/.config/guix/current/bin:$PATH" -export INFOPATH="$HOME/.config/guix/current/share/info:$INFOPATH" -@end example +Par exemple, GCC a besoin des variables d'environnement @code{CPATH} et +@code{LIBRARY_PATH} pour trouver les en-têtes et les bibliothèques dans le +profil de l'utilisateur (@pxref{Environment Variables,,, gcc, Using the GNU +Compiler Collection (GCC)}). Si GCC et, disons, la bibliothèque C sont +installés dans le profil, alors @code{--search-paths} suggérera +d'initialiser ces variables à @code{@var{profil}/include} et +@code{@var{profil}/lib}, respectivement. -L'option @code{--list-generations} ou @code{-l} liste les anciennes -générations produites par @command{guix pull}, avec des détails sur leur -origine : +Le cas d'utilisation typique est de définir ces variables d'environnement +dans le shell : @example -$ guix pull -l -Génération 1 10 juin 2018 00:18:18 - guix 65956ad - URL du dépôt : https://git.savannah.gnu.org/git/guix.git - branche : origin/master - commit : 65956ad3526ba09e1f7a40722c96c6ef7c0936fe - -Génération 2 11 juin 2018 11:02:49 - guix e0cc7f6 - URL du dépôt : https://git.savannah.gnu.org/git/guix.git - branche : origin/master - commit : e0cc7f669bec22c37481dd03a7941c7d11a64f1d - 2 nouveaux paquets : keepalived, libnfnetlink - 6 paquets mis à jour : emacs-nix-mode@@2.0.4, - guile2.0-guix@@0.14.0-12.77a1aac, guix@@0.14.0-12.77a1aac, - heimdal@@7.5.0, milkytracker@@1.02.00, nix@@2.0.4 - -Génération 3 13 juin 2018 23:31:07 (actuelle) - guix 844cc1c - URL du dépôt : https://git.savannah.gnu.org/git/guix.git - branche : origin/master - commit : 844cc1c8f394f03b404c5bb3aee086922373490c - 28 nouveaux paquets : emacs-helm-ls-git, emacs-helm-mu, @dots{} - 69 paquets mis à jour : borg@@1.1.6, cheese@@3.28.0, @dots{} +$ eval `guix package --search-paths` @end example -@ref{Invoquer guix describe, @command{guix describe}} pour d'autres manières -de décrire le statut actuel de Guix. +@var{genre} peut être l'une des valeurs @code{exact}, @code{prefix} ou +@code{suffix}, ce qui signifie que les définitions des variables +d'environnement retournées seront soit les paramètres exactes, ou placés +avant ou après la valeur actuelle de ces paramètres. Lorsqu'il est omis, +@var{genre} a pour valeur par défaut @code{exact}. -Ce profil @code{~/.config/guix/current} fonctionne comme les autres profils -créés par @command{guix package} (@pxref{Invoquer guix package}). -C'est-à-dire que vous pouvez lister les générations, revenir en arrière à -une génération précédente — c.-à-d.@: la version de Guix précédente — etc : +Cette option peut aussi être utilisé pour calculer les chemins de recherche +@emph{combinés} de plusieurs profils. Regardez cet exemple : @example -$ guix package -p ~/.config/guix/current --roll-back -passé de la génération 3 à 2 -$ guix package -p ~/.config/guix/current --delete-generations=1 -suppression de /var/guix/profiles/per-user/charlie/current-guix-1-link +$ guix package -p foo -i guile +$ guix package -p bar -i guile-json +$ guix package -p foo -p bar --search-paths @end example -La commande @command{guix pull} est typiquement invoquée sans arguments mais -il supporte les options suivantes : - -@table @code -@item --url=@var{url} -@itemx --commit=@var{commit} -@itemx --branch=@var{branche} -Télécharger le code depuis l'@var{url} spécifié, au @var{commit} donné (un -commit Git valide représenté par une chaîne hexadécimale) ou à la branche -@var{branch}. - -@cindex @file{channels.scm}, fichier de configuration -@cindex fichier de configuration pour les canaux -Ces options sont fournies pour votre confort, mais vous pouvez aussi -spécifier votre configuration dans le fichier -@file{~/.config/guix/channels.scm} ou en utilisant l'option -@option{--channels} (voir plus bas). - -@item --channels=@var{file} -@itemx -C @var{file} -Lit la liste des canaux dans @var{file} plutôt que dans -@file{~/.config/guix/channels.scm}. @var{file} doit contenir un code Scheme -qui s'évalue en une liste d'objets de canaux. @xref{Canaux} pour plus -d'informations. - -@item --list-generations[=@var{motif}] -@itemx -l [@var{motif}] -Liste toutes les générations de @file{~/.config/guix/current} ou, si -@var{motif} est fournit, le sous-ensemble des générations qui correspondent -à @var{motif}. La syntaxe de @var{motif} est la même qu'avec @code{guix -package --list-generations} (@pxref{Invoquer guix package}). +La dernière commande ci-dessus montre la variable @code{GUILE_LOAD_PATH} +bien que, pris individuellement, ni @file{foo} ni @file{bar} n'auraient +donné cette recommandation. -@ref{Invoquer guix describe}, pour une manière d'afficher des informations -sur la génération actuelle uniquement. @item --profile=@var{profil} @itemx -p @var{profil} -Utiliser le @var{profil} à la place de @file{~/.config/guix/current}. +Utiliser le @var{profil} à la place du profil par défaut de l'utilisateur. -@item --dry-run -@itemx -n -Montrer quels commits des canaux seraient utilisés et ce qui serait -construit ou substitué mais ne pas le faire vraiment. +@cindex collisions, dans un profil +@cindex faire des collisions de paquets dans des profils +@cindex profil, collisions +@item --allow-collisions +Permettre des collisions de paquets dans le nouveau profil. À utiliser à +vos risques et périls ! -@item --verbose -Produire une sortie verbeuse, en écrivant les journaux de construction sur -la sortie d'erreur standard. +Par défaut, @command{guix package} rapporte les @dfn{collisions} dans le +profil comme des erreurs. Les collisions ont lieu quand deux version ou +variantes d'un paquet donné se retrouvent dans le profil. @item --bootstrap -Utiliser le programme d'amorçage Guile pour construire la dernière version -de Guix. Cette option n'est utile que pour les développeurs de Guix. -@end table +Utiliser le programme d'amorçage Guile pour compiler le profil. Cette +option n'est utile que pour les développeurs de la distribution. -Le mécanisme de @dfn{canaux} vous permet de dire à @command{guix pull} quels -répertoires et branches récupérer, ainsi que les dépôts -@emph{supplémentaires} contenant des modules de paquets qui devraient être -déployés. @xref{Canaux} pour plus d'information. +@end table -En plus, @command{guix pull} supporte toutes les options de construction -communes (@pxref{Options de construction communes}). - -@node Canaux -@section Canaux - -@cindex canaux -@cindex @file{channels.scm}, fichier de configuration -@cindex fichier de configuration pour les canaux -@cindex @command{guix pull}, fichier de configuration -@cindex configuration de @command{guix pull} -Guix et sa collection de paquets sont mis à jour en lançant @command{guix -pull} (@pxref{Invoquer guix pull}). Par défaut @command{guix pull} -télécharge et déploie Guix lui-même depuis le dépôt officiel de -GNU@tie{}Guix. Cela peut être personnalisé en définissant des @dfn{canaux} -dans le fichier @file{~/.config/guix/channels.scm}. Un canal spécifie l'URL -et la branche d'un répertoire Git à déployer et on peut demander à -@command{guix pull} de récupérer un ou plusieurs canaux. En d'autres -termes, les canaux peuvent être utilisés pour personnaliser et pour -@emph{étendre} Guix, comme on le verra plus bas. - -@subsection Utiliser un canal Guix personnalisé +En plus de ces actions, @command{guix package} supporte les options +suivantes pour demander l'état actuel d'un profil ou la disponibilité des +paquets : -Le canal nommé @code{guix} spécifie où Guix lui-même — ses outils en ligne -de commande ainsi que sa collection de paquets — sera téléchargé. Par -exemple, supposons que vous voulez effectuer les mises à jour depuis votre -propre copie du dépôt Guix sur @code{example.org}, et plus particulièrement -depuis la branche @code{super-hacks}. Vous pouvez écrire cette -spécification dans @code{~/.config/guix/channels.scm} : +@table @option -@lisp -;; Dit à « guix pull » d'utiliser mon propre dépôt. -(list (channel - (name 'guix) - (url "https://example.org/my-guix.git") - (branch "super-hacks"))) -@end lisp +@item --search=@var{regexp} +@itemx -s @var{regexp} +@cindex chercher des paquets +List the available packages whose name, synopsis, or description matches +@var{regexp} (in a case-insensitive fashion), sorted by relevance. Print +all the metadata of matching packages in @code{recutils} format (@pxref{Top, +GNU recutils databases,, recutils, GNU recutils manual}). -@noindent -Maintenant, @command{guix pull} récupérera le code depuis la branche -@code{super-hacks} du dépôt sur @code{example.org}. +Cela permet à des champs spécifiques d'être extraits avec la commande +@command{recsel}, par exemple : -@subsection Spécifier des canaux supplémentaires +@example +$ guix package -s malloc | recsel -p name,version,relevance +name: jemalloc +version: 4.5.0 +relevance: 6 -@cindex étendre la collection de paquets (canaux) -@cindex paquets personnels (canaux) -@cindex canaux, pour des paquets personnels -Vous pouvez aussi spécifier des @emph{canaux supplémentaires} à récupérer. -Disons que vous avez un ensemble de paquets personnels ou de variantes -personnalisées qu'il ne vaudrait pas le coup de contribuer au projet Guix, -mais que vous voudriez pouvoir utiliser de manière transparente sur la ligne -de commande. Vous écririez d'abord des modules contenant ces définitions de -paquets (@pxref{Modules de paquets}), en les maintenant dans un dépôt Git, puis -vous ou n'importe qui d'autre pourrait l'utiliser comme un canal -supplémentaire où trouver ces paquets. Sympa, non ? +name: glibc +version: 2.25 +relevance: 1 -@c What follows stems from discussions at -@c as well as -@c earlier discussions on guix-devel@gnu.org. -@quotation Attention -Avant que vous, cher utilisateur, ne vous exclamiez « Oh mais c'est -@emph{super génial} ! » et que vous ne publiez vos canaux personnels -publiquement, nous voudrions vous donner quelques avertissements : +name: libgc +version: 7.6.0 +relevance: 1 +@end example -@itemize -@item -Avant de publier un canal, envisagez de contribuer vos définitions de -paquets dans Guix (@pxref{Contribuer}). Guix en tant que projet est -ouvert à tous les logiciels libres de toutes sortes, et les paquets dans -Guix sont déjà disponibles à tous les utilisateurs de Guix et bénéficient -des processus d'assurance qualité du projet. +De manière similaire, pour montrer le nom de tous les paquets disponibles +sous license GNU@tie{}LGPL version 3 : -@item -Lorsque vous maintenez des définitions de paquets en dehors de Guix, nous, -les développeurs de Guix, considérons que @emph{la charge de la -compatibilité vous incombe}. Rappelez-vous que les modules de paquets et -les définitions de paquets ne sont que du code Scheme qui utilise diverses -interfaces de programmation (API). Nous souhaitons rester libres de changer -ces API pour continuer à améliorer Guix, éventuellement d'une manière qui -casse votre canal. Nous ne changeons jamais l'API gratuitement, mais nous -ne nous engageons @emph{pas} à geler les API non plus. +@example +$ guix package -s "" | recsel -p name -e 'license ~ "LGPL 3"' +name: elfutils -@item -Corollaire : si vous utilisez un canal externe et que le canal est cassé, -merci de @emph{rapporter le problème à l'auteur du canal}, pas au projet -Guix. -@end itemize +name: gmp +@dots{} +@end example -Vous avez été prévenus ! Maintenant, nous pensons que des canaux externes -sont une manière pratique d'exercer votre liberté pour augmenter la -collection de paquets de Guix et de partager vos améliorations, qui sont les -principes de bases du @uref{https://www.gnu.org/philosophy/free-sw.html, -logiciel libe}. Contactez-nous par courriel sur @email{guix-devel@@gnu.org} -si vous souhaitez discuter à ce propos. -@end quotation +Il est aussi possible de raffiner les résultats de la recherche avec +plusieurs options @code{-s}. Par exemple, la commande suivante renvoie la +liste des jeux de plateau : -Une fois que vous avez un dépôt Git contenant vos propres modules de -paquets, vous pouvez écrire @code{~/.config/guix/channels.scm} pour dire à -@command{guix pull} de récupérer votre canal personnel @emph{en plus} des -canaux Guix par défaut : +@example +$ guix package -s '\' -s game | recsel -p name +name: gnubg +@dots{} +@end example -@vindex %default-channels -@lisp -;; Ajouter mes paquets personnels à ceux fournis par Guix. -(cons (channel - (name 'my-personal-packages) - (url "https://example.org/personal-packages.git")) - %default-channels) -@end lisp +Si on avait oublié @code{-s game}, on aurait aussi eu les paquets logiciels +qui s'occupent de circuits imprimés (en anglais : circuit board) ; supprimer +les chevrons autour de @code{board} aurait aussi ajouté les paquets qui +parlent de clavier (en anglais : key@emph{board}). -@noindent -Note that the snippet above is (as always!)@: Scheme code; we use -@code{cons} to add a channel the list of channels that the variable -@code{%default-channels} is bound to (@pxref{Pairs, @code{cons} and lists,, -guile, GNU Guile Reference Manual}). With this file in place, @command{guix -pull} builds not only Guix but also the package modules from your own -repository. The result in @file{~/.config/guix/current} is the union of -Guix with your own package modules: +Et maintenant un exemple plus élaboré. La commande suivante recherche les +bibliothèques cryptographiques, retire les bibliothèques Haskell, Perl, +Python et Ruby et affiche le nom et le synopsis des paquets correspondants : @example -$ guix pull --list-generations -@dots{} -Génération 19 Aug 27 2018 16:20:48 - guix d894ab8 - URL du dépôt : https://git.savannah.gnu.org/git/guix.git - branche : master - commit : d894ab8e9bfabcefa6c49d9ba2e834dd5a73a300 - my-personal-packages dd3df5e - URL du dépôt : https://example.org/personal-packages.git - branche : master - commit : dd3df5e2c8818760a8fc0bd699e55d3b69fef2bb - 11 nouveaux paquets : my-gimp, my-emacs-with-cool-features, @dots{} - 4 paquets mis à jour : emacs-racket-mode@@0.0.2-2.1b78827, @dots{} +$ guix package -s crypto -s library | \ + recsel -e '! (name ~ "^(ghc|perl|python|ruby)")' -p name,synopsis @end example @noindent -La sortie de @command{guix pull} ci-dessus montre que la génération@tie{}19 -contient aussi bien Guix que les paquets du canal -@code{my-personal-packages}. Parmi les nouveaux paquets et les paquets mis -à jour qui sont listés, certains comme @code{my-gimp} et -@code{my-emacs-with-cool-features} peuvent provenir de -@code{my-personal-packages}, tandis que d'autres viennent du canal par -défaut de Guix. +@xref{Selection Expressions,,, recutils, GNU recutils manual} pour plus +d'information sur les @dfn{expressions de sélection} pour @code{recsel -e}. -@subsection Répliquer Guix +@item --show=@var{paquet} +Afficher les détails du @var{paquet} dans la liste des paquets disponibles, +au format @code{recutils} (@pxref{Top, GNU recutils databases,, recutils, +GNU recutils manual}). -@cindex épinglage, canaux -@cindex répliquer Guix -@cindex reproductibilité, de Guix -La sortie de @command{guix pull --list-generations} ci-dessus montre -précisément quels commits ont été utilisés pour construire cette instance de -Guix. Nous pouvons donc la répliquer, disons sur une autre machine, en -fournissant une spécification de canal dans -@file{~/.config/guix/channels.scm} qui est « épinglé » à ces commits : +@example +$ guix package --show=python | recsel -p name,version +name: python +version: 2.7.6 -@lisp -;; Déployer des commits précis de mes canaux préférés. -(list (channel - (name 'guix) - (url "https://git.savannah.gnu.org/git/guix.git") - (commit "d894ab8e9bfabcefa6c49d9ba2e834dd5a73a300")) - (channel - (name 'my-personal-packages) - (url "https://example.org/personal-packages.git") - (branch "dd3df5e2c8818760a8fc0bd699e55d3b69fef2bb"))) -@end lisp +name: python +version: 3.3.5 +@end example -La commande @command{guix describe --format=channels} peut même générer -cette liste de canaux directement (@pxref{Invoquer guix describe}). +Vous pouvez aussi spécifier le nom complet d'un paquet pour n'avoir que les +détails concernant une version spécifique : +@example +$ guix package --show=python@@3.4 | recsel -p name,version +name: python +version: 3.4.3 +@end example -À ce moment les deux machines font tourner @emph{exactement le même Guix}, -avec l'accès @emph{exactement aux même paquets}. La sortie de @command{guix -build gimp} sur une machine sera exactement la même, au bit près, que la -sortie de la même commande sur l'autre machine. Cela signifie aussi que les -deux machines ont accès à tous les codes sources de Guix, et transitivement, -à tous les codes sources de tous les paquets qu'il définit. -Cela vous donne des super-pouvoirs, ce qui vous permet de suivre la -provenance des artefacts binaires avec un grain très fin et de reproduire -les environnements logiciels à volonté — une sorte de capacité de « -méta-reproductibilité », si vous voulez. @xref{Inférieurs}, pour une autre -manière d'utiliser ces super-pouvoirs. -@node Inférieurs -@section Inférieurs +@item --list-installed[=@var{regexp}] +@itemx -I [@var{regexp}] +Liste les paquets actuellement installés dans le profil spécifié, avec les +paquets les plus récemment installés en dernier. Lorsque @var{regexp} est +spécifié, liste uniquement les paquets installés dont le nom correspond à +@var{regexp}. -@c TODO: Remove this once we're more confident about API stability. -@quotation Remarque -La fonctionnalité décrite ici est un « démonstrateur technique » à la -version @value{VERSION}. Ainsi, l'interface est sujette à changements. -@end quotation +Pour chaque paquet installé, affiche les éléments suivants, séparés par des +tabulations : le nom du paquet, sa version, la partie du paquet qui est +installé (par exemple, @code{out} pour la sortie par défaut, @code{include} +pour ses en-têtes, etc) et le chemin du paquet dans le dépôt. -@cindex inférieurs -@cindex composition de révisions de Guix -Parfois vous pourriez avoir à mélanger des paquets de votre révision de Guix -avec des paquets disponibles dans une révision différente de Guix. Les -@dfn{inférieurs} de Guix vous permettent d'accomplir cette tâche en -composant différentes versions de Guix de manière arbitraire. +@item --list-available[=@var{regexp}] +@itemx -A [@var{regexp}] +Lister les paquets actuellement disponibles dans la distribution pour ce +système (@pxref{Distribution GNU}). Lorsque @var{regexp} est spécifié, +liste uniquement les paquets dont le nom correspond à @var{regexp}. -@cindex paquets inférieurs -Techniquement, un « inférieur » est surtout un processus Guix séparé -connecté à votre processus Guix principal à travers un REPL (@pxref{Invoquer guix repl}). Le module @code{(guix inferior)} vous permet de créer des -inférieurs et de communiquer avec eux. Il fournit aussi une interface de -haut-niveau pour naviguer dans les paquets d'un inférieur — @dfn{des paquets -inférieurs} — et les manipuler. +Pour chaque paquet, affiche les éléments suivants séparés par des +tabulations : son nom, sa version, les parties du paquet (@pxref{Des paquets avec plusieurs résultats}), et l'emplacement de sa définition. -Lorsqu'on les combine avec des canaux (@pxref{Canaux}), les inférieurs -fournissent une manière simple d'interagir avec un révision de Guix -séparée. Par exemple, disons que vous souhaitiez installer dans votre -profil le paquet guile actuel, avec le @code{guile-json} d'une ancienne -révision de Guix — peut-être parce que la nouvelle version de -@code{guile-json} a une API incompatible et que vous voulez lancer du code -avec l'ancienne API. Pour cela, vous pourriez écrire un manifeste à -utiliser avec @code{guix package --manifest} (@pxref{Invoquer guix package}) -; dans ce manifeste, vous créeriez un inférieur pour l'ancienne révision de -Guix qui vous intéresse et vous chercheriez le paquet @code{guile-json} dans -l'inférieur : +@item --list-generations[=@var{motif}] +@itemx -l [@var{motif}] +@cindex générations +Renvoyer la liste des générations avec leur date de création ; pour chaque +génération, montre les paquets installés avec les paquets installés les plus +récemment en dernier. Remarquez que la zéroième génération n'est jamais +montrée. -@lisp -(use-modules (guix inferior) (guix channels) - (srfi srfi-1)) ;pour « first » +Pour chaque paquet installé, afficher les éléments suivants, séparés par des +tabulations : le nom du paquet, sa version, la partie du paquet qui a été +installée (@pxref{Des paquets avec plusieurs résultats}), et l'emplacement du +paquet dans le dépôt. -(define channels - ;; L'ancienne révision depuis laquelle on veut - ;; extraire guile-json. - (list (channel - (name 'guix) - (url "https://git.savannah.gnu.org/git/guix.git") - (commit - "65956ad3526ba09e1f7a40722c96c6ef7c0936fe")))) +Lorsque @var{motif} est utilisé, la commande ne renvoie que les générations +correspondantes. Les motifs valides sont : -(define inferior - ;; Un inférieur représentant la révision ci-dessus. - (inferior-for-channels channels)) +@itemize +@item @emph{Des entiers et des entiers séparés par des virgules}. Les deux motifs correspondent +à des numéros de version. Par exemple, @code{--list-generations=1} renvoie +la première. -;; Maintenant on crée un manifeste avec le paquet « guile » actuel -;; et l'ancien paquet « guile-json ». -(packages->manifest - (list (first (lookup-inferior-packages inferior "guile-json")) - (specification->package "guile"))) -@end lisp +Et @code{--list-generations=1,8,2} renvoie les trois générations dans +l'ordre spécifié. Aucune espace ni virgule surnuméraire n'est permise. -Durant la première exécution, @command{guix package --manifest} pourrait -avoir besoin de construire le canal que vous avez spécifié avant de créer -l'inférieur ; les exécutions suivantes seront bien plus rapides parce que la -révision de Guix sera déjà en cache. +@item @emph{Des intervalles}. @code{--list-generations=2..9} affiche les +générations demandées et tout ce qui se trouvent entre elles. Remarquez que +le début d'un intervalle doit être plus petit que sa fin. -Le module @code{(guix inferior)} fournit les procédures suivantes pour -ouvrir un inférieur : +Il est aussi possible d'omettre le numéro final. Par exemple, +@code{--list-generations=2..} renvoie toutes les générations à partir de la +deuxième. -@deffn {Procédure Scheme} inferior-for-channels @var{channels} @ - [#:cache-directory] [#:ttl] -Renvoie un inférieur pour @var{channels}, une liste de canaux. Elle utilise -le cache dans @var{cache-directory}, où les entrées peuvent être glanées -après @var{ttl} secondes. Cette procédure ouvre une nouvelle connexion au -démon de construction. +@item @emph{Des durées}. Vous pouvez aussi récupérer les derniers @emph{N}@tie{}jours, semaines, +ou moins en passant un entier avec la première lettre de la durée (en +anglais : d, w ou m). Par exemple @code{--list-generations=20d} liste les +générations qui sont âgées d'au plus 20 jours. +@end itemize -Elle a pour effet de bord de construire ou de substituer des binaires pour -@var{channels}, ce qui peut prendre du temps. -@end deffn +@item --delete-generations[=@var{motif}] +@itemx -d [@var{motif}] +Lorsque @var{motif} est omis, supprimer toutes les générations en dehors de +l'actuelle. -@deffn {Procédure Scheme} open-inferior @var{directory} @ - [#:command "bin/guix"] -Ouvre le Guix inférieur dans @var{directory} et lance -@code{@var{directory}/@var{command} repl} ou équivalent. Renvoie @code{#f} -si l'inférieur n'a pas pu être lancé. -@end deffn +Cette commande accepte les même motifs que @option{--list-generations}. +Lorsque @var{motif} est spécifié, supprimer les générations correspondante. +Lorsque @var{motif} spécifie une durée, les générations @emph{plus vieilles} +que la durée spécifiée correspondent. Par exemple +@code{--delete-generations=1m} supprime les générations vieilles de plus +d'un mois. -@cindex paquets inférieurs -Les procédures listées plus bas vous permettent d'obtenir et de manipuler -des paquets inférieurs. +Si la génération actuelle correspond, elle n'est @emph{pas} supprimée. La +zéroième génération n'est elle non plus jamais supprimée. -@deffn {Procédure Scheme} inferior-packages @var{inferior} -Renvoie la liste des paquets connus de l'inférieur @var{inferior}. -@end deffn +Remarquez que supprimer des générations empêche de revenir en arrière vers +elles. Ainsi, cette commande doit être utilisée avec précaution. -@deffn {Procédure Scheme} lookup-inferior-packages @var{inferior} @var{name} @ - [@var{version}] -Renvoie la liste triée des paquets inférieurs qui correspondent à @var{name} -dans @var{inferior}, avec le plus haut numéro de version en premier. Si -@var{version} est vrai, renvoie seulement les paquets avec un numéro de -version préfixé par @var{version}. -@end deffn +@end table -@deffn {Procédure Scheme} inferior-package? @var{obj} -Renvoie vrai si @var{obj} est un paquet inférieur. -@end deffn +Enfin, comme @command{guix package} peut démarrer des processus de +construction, elle supporte les options de construction communes +(@pxref{Options de construction communes}). Elle supporte aussi les options de +transformation de paquets comme @option{--with-source} (@pxref{Options de transformation de paquets}). Cependant, remarquez que les transformations de +paquets sont perdues à la mise à jour ; pour les préserver à travers les +mises à jours, vous devriez définir vos propres variantes des paquets dans +une module Guile et l'ajouter à @code{GUIX_PACKAGE_PATH} (@pxref{Définition des paquets}). -@deffn {Procédure Scheme} inferior-package-name @var{package} -@deffnx {Procédure Scheme} inferior-package-version @var{package} -@deffnx {Procédure Scheme} inferior-package-synopsis @var{package} -@deffnx {Procédure Scheme} inferior-package-description @var{package} -@deffnx {Procédure Scheme} inferior-package-home-page @var{package} -@deffnx {Procédure Scheme} inferior-package-location @var{package} -@deffnx {Procédure Scheme} inferior-package-inputs @var{package} -@deffnx {Procédure Scheme} inferior-package-native-inputs @var{package} -@deffnx {Procédure Scheme} inferior-package-propagated-inputs @var{package} -@deffnx {Procédure Scheme} inferior-package-transitive-propagated-inputs @var{package} -@deffnx {Procédure Scheme} inferior-package-native-search-paths @var{package} -@deffnx {Procédure Scheme} inferior-package-transitive-native-search-paths @var{package} -@deffnx {Procédure Scheme} inferior-package-search-paths @var{package} -Ces procédures sont la contrepartie des accesseurs des enregistrements de -paquets (@pxref{Référence de paquet}). La plupart fonctionne en effectuant -des requêtes à l'inférieur dont provient @var{package}, donc l'inférieur -doit toujours être disponible lorsque vous appelez ces procédures. -@end deffn +@node Substituts +@section Substituts -Les paquets inférieurs peuvent être utilisés de manière transparente comme -tout autre paquet ou objet simili-fichier dans des G-expressions -(@pxref{G-Expressions}). Ils sont aussi gérés de manière transparente par -la procédure @code{packages->manifest}, qui est typiquement utilisée dans -des manifestes (@pxref{Invoquer guix package, l'option @option{--manifest} -de @command{guix package}}). Ainsi, vous pouvez insérer un paquet inférieur -à peu près n'importe où vous utiliseriez un paquet normal : dans des -manifestes, dans le champ @code{packages} de votre déclaration -@code{operating-system}, etc. +@cindex substituts +@cindex binaires pré-construits +Guix gère le déploiement depuis des binaires ou des sources de manière +transparente ce qui signifie qu'il peut aussi bien construire localement que +télécharger des éléments pré-construits depuis un serveur ou les deux. Nous +appelons ces éléments pré-construits des @dfn{substituts} — ils se +substituent aux résultats des constructions locales. Dans la plupart des +cas, télécharger un substitut est bien plus rapide que de construire les +choses localement. -@node Invoquer guix describe -@section Invoquer @command{guix describe} +Les substituts peuvent être tout ce qui résulte d'une construction de +dérivation (@pxref{Dérivations}). Bien sûr dans le cas général, il s'agit +de paquets binaires pré-construits, mais les archives des sources par +exemple résultent aussi de la construction d'une dérivation qui peut aussi +être disponible en tant que substitut. -@cindex reproductibilité -@cindex répliquer Guix -Souvent vous voudrez répondre à des questions comme « quelle révision de -Guix j'utilise ? » ou « quels canaux est-ce que j'utilise ? ». C'est une -information utile dans de nombreuses situations : si vous voulez -@emph{répliquer} un environnement sur une machine différente ou un compte -utilisateur, si vous voulez rapporter un bogue ou pour déterminer quel -changement dans les canaux que vous utilisez l'a causé ou si vous voulez -enregistrer l'état de votre système pour le reproduire. La commande -@command{guix describe} répond à ces questions. +@menu +* Serveur de substituts officiel:: Une source particulière de substituts. +* Autoriser un serveur de substituts:: Comment activer ou désactiver les + substituts. +* Authentification des substituts:: Comment Guix vérifie les substituts. +* Paramètres de serveur mandataire:: Comment récupérer des substituts à + travers un serveur mandataire. +* Échec de substitution:: Qu'arrive-t-il quand la substitution échoue. +* De la confiance en des binaires:: Comment pouvez-vous avoir confiance en + un paquet binaire ? +@end menu -Lorsqu'elle est lancée depuis un @command{guix} mis à jour avec -@command{guix pull}, @command{guix describe} affiche les canaux qui ont été -construits, avec l'URL de leur dépôt et l'ID de leur commit -(@pxref{Canaux}) : +@node Serveur de substituts officiel +@subsection Serveur de substituts officiel + +@cindex hydra +@cindex ferme de construction +The @code{@value{SUBSTITUTE-SERVER}} server is a front-end to an official +build farm that builds packages from Guix continuously for some +architectures, and makes them available as substitutes. This is the default +source of substitutes; it can be overridden by passing the +@option{--substitute-urls} option either to @command{guix-daemon} +(@pxref{daemon-substitute-urls,, @code{guix-daemon --substitute-urls}}) or +to client tools such as @command{guix package} +(@pxref{client-substitute-urls,, client @option{--substitute-urls} option}). + +Les URL des substituts peuvent être soit en HTTP soit en HTTPS. Le HTTPS +est recommandé parce que les communications sont chiffrées ; à l'inverse +HTTP rend les communications visibles pour un espion qui peut utiliser les +informations accumulées sur vous pour déterminer par exemple si votre +système a des vulnérabilités de sécurités non corrigées. + +Les substituts de la ferme de construction officielle sont activés par +défaut dans la distribution système Guix (@pxref{Distribution GNU}). +Cependant, ils sont désactivés par défaut lorsque vous utilisez Guix sur une +distribution externe, à moins que vous ne les ayez explicitement activés via +l'une des étapes d'installation recommandées (@pxref{Installation}). Les +paragraphes suivants décrivent comment activer ou désactiver les substituts +de la ferme de construction ; la même procédure peut être utilisée pour +activer les substituts de n'importe quel autre serveur de substituts. + +@node Autoriser un serveur de substituts +@subsection Autoriser un serveur de substituts + +@cindex sécurité +@cindex substituts, autorisations +@cindex liste de contrôle d'accès (ACL), pour les substituts +@cindex ACL (liste de contrôle d'accès), pour les substituts +To allow Guix to download substitutes from @code{@value{SUBSTITUTE-SERVER}} +or a mirror thereof, you must add its public key to the access control list +(ACL) of archive imports, using the @command{guix archive} command +(@pxref{Invoquer guix archive}). Doing so implies that you trust +@code{@value{SUBSTITUTE-SERVER}} to not be compromised and to serve genuine +substitutes. + +The public key for @code{@value{SUBSTITUTE-SERVER}} is installed along with +Guix, in @code{@var{prefix}/share/guix/@value{SUBSTITUTE-SERVER}.pub}, where +@var{prefix} is the installation prefix of Guix. If you installed Guix from +source, make sure you checked the GPG signature of +@file{guix-@value{VERSION}.tar.gz}, which contains this public key file. +Then, you can run something like this: @example -$ guix describe -Generation 10 03 sep. 2018 17:32:44 (actuelle) - guix e0fa68c - URL du dépôt : https://git.savannah.gnu.org/git/guix.git - branche : master - commit : e0fa68c7718fffd33d81af415279d6ddb518f727 +# guix archive --authorize < @var{prefix}/share/guix/@value{SUBSTITUTE-SERVER}.pub @end example -Si vous connaissez bien le système de contrôle de version Git, cela -ressemble en essence à @command{git describe} ; la sortie est aussi -similaire à celle de @command{guix pull --list-generations}, mais limitée à -la génération actuelle (@pxref{Invoquer guix pull, l'option -@option{--list-generations}}). Comme l'ID de commit de Git ci-dessus se -réfère sans aucune ambiguïté à un instantané de Guix, cette information est -tout ce dont vous avez besoin pour décrire la révision de Guix que vous -utilisez et pour la répliquer. +@quotation Remarque +Similarly, the @file{hydra.gnu.org.pub} file contains the public key of an +independent build farm also run by the project, reachable at +@indicateurl{https://mirror.hydra.gnu.org}. +@end quotation -Pour rendre plus facile la réplication de Guix, @command{guix describe} peut -aussi renvoyer une liste de canaux plutôt que la description lisible par un -humain au-dessus : +Une fois que cela est en place, la sortie d'une commande comme @code{guix +build} devrait changer de quelque chose comme : @example -$ guix describe -f channels -(list (channel - (name 'guix) - (url "https://git.savannah.gnu.org/git/guix.git") - (commit - "e0fa68c7718fffd33d81af415279d6ddb518f727"))) +$ guix build emacs --dry-run +Les dérivations suivantes seraient construites : + /gnu/store/yr7bnx8xwcayd6j95r2clmkdl1qh688w-emacs-24.3.drv + /gnu/store/x8qsh1hlhgjx6cwsjyvybnfv2i37z23w-dbus-1.6.4.tar.gz.drv + /gnu/store/1ixwp12fl950d15h2cj11c73733jay0z-alsa-lib-1.0.27.1.tar.bz2.drv + /gnu/store/nlma1pw0p603fpfiqy7kn4zm105r5dmw-util-linux-2.21.drv +@dots{} @end example @noindent -Vous pouvez sauvegarder ceci dans un fichier et le donner à @command{guix -pull -C} sur une autre machine ou plus tard, ce qui instantiera -@emph{exactement la même révision de Guix} (@pxref{Invoquer guix pull, -l'option @option{-C}}). À partir de là, comme vous pouvez déployer la même -révision de Guix, vous pouvez aussi bien @emph{répliquer un environnement -logiciel complet}. Nous pensons humblement que c'est @emph{génial}, et nous -espérons que vous aimerez ça aussi ! - -Voici les détails des options supportées par @command{guix describe} : - -@table @code -@item --format=@var{format} -@itemx -f @var{format} -Produire la sortie dans le @var{format} donné, parmi : - -@table @code -@item human -produire une sortie lisible par un humain, -@item canaux -produire une liste de spécifications de canaux qui peut être passée à -@command{guix pull -C} ou installée dans @file{~/.config/guix/channels.scm} -(@pxref{Invoquer guix pull}), -@item json -@cindex JSON -produire une liste de spécifications de canaux dans le format JSON, -@item recutils -produire une liste de spécifications de canaux dans le format Recutils. -@end table - -@item --profile=@var{profil} -@itemx -p @var{profil} -Afficher les informations sur le @var{profil}. -@end table - -@node Invoquer guix pack -@section Invoquer @command{guix pack} - -Parfois vous voulez passer un logiciel à des gens qui n'ont pas (encore !) -la chance d'utiliser Guix. Vous leur diriez bien de lancer @command{guix -package -i @var{quelque chose}} mais ce n'est pas possible dans ce cas. -C'est là que @command{guix pack} entre en jeu. - -@quotation Remarque -Si vous cherchez comment échanger des binaires entre des machines où Guix -est déjà installé, @pxref{Invoquer guix copy}, @ref{Invoquer guix publish}, -et @ref{Invoquer guix archive}. -@end quotation - -@cindex pack -@cindex lot -@cindex lot d'applications -@cindex lot de logiciels -La commande @command{guix pack} crée un @dfn{pack} ou @dfn{lot de logiciels} -: elle crée une archive tar ou un autre type d'archive contenunt les -binaires pour le logiciel qui vous intéresse ainsi que ses dépendances. -L'archive qui en résulte peut être utilisée sur toutes les machines qui -n'ont pas Guix et les gens peuvent lancer exactement les mêmes binaires que -ceux que vous avez avec Guix. Le pack lui-même est créé d'une manière -reproductible au bit près, pour que n'importe qui puisse vérifier qu'il -contient bien les résultats que vous prétendez proposer. - -Par exemple, pour créer un lot contenant Guile, Emacs, Geiser et toutes -leurs dépendances, vous pouvez lancer : +à quelque chose comme : @example -$ guix pack guile emacs geiser +$ guix build emacs --dry-run +112.3 Mo seraient téléchargés : + /gnu/store/pk3n22lbq6ydamyymqkkz7i69wiwjiwi-emacs-24.3 + /gnu/store/2ygn4ncnhrpr61rssa6z0d9x22si0va3-libjpeg-8d + /gnu/store/71yz6lgx4dazma9dwn2mcjxaah9w77jq-cairo-1.12.16 + /gnu/store/7zdhgp0n1518lvfn8mb96sxqfmvqrl7v-libxrender-0.9.7 @dots{} -/gnu/store/@dots{}-pack.tar.gz @end example -Le résultat ici est une archive tar contenant un répertoire -@file{/gnu/store} avec tous les paquets nécessaires. L'archive qui en -résulte contient un @dfn{profil} avec les trois paquets qui vous intéressent -; le profil est le même qui celui qui aurait été créé avec @command{guix -package -i}. C'est ce mécanisme qui est utilisé pour créer les archives tar -binaires indépendantes de Guix (@pxref{Installation binaire}). +@noindent +This indicates that substitutes from @code{@value{SUBSTITUTE-SERVER}} are +usable and will be downloaded, when possible, for future builds. -Les utilisateurs de ce pack devraient lancer -@file{/gnu/store/@dots{}-profile/bin/guile} pour lancer Guile, ce qui n'est -pas très pratique. Pour éviter cela, vous pouvez créer, disons, un lien -symbolique @file{/opt/gnu/bin} vers le profil : +@cindex substituts, comment les désactiver +Le mécanisme de substitution peut être désactivé globalement en lançant +@code{guix-daemon} avec @code{--no-substitutes} (@pxref{Invoquer guix-daemon}). Il peut aussi être désactivé temporairement en passant +l'option @code{--no-substitutes} à @command{guix package}, @command{guix +build} et aux autres outils en ligne de commande. + +@node Authentification des substituts +@subsection Authentification des substituts + +@cindex signatures numériques +Guix détecte et lève une erreur lorsqu'il essaye d'utiliser un substituts +qui a été modifié. De même, il ignore les substituts qui ne sont pas signés +ou qui ne sont pas signés par l'une des clefs listés dans l'ACL. + +Il y a une exception cependant : si un serveur non autorisé fournit des +substituts qui sont @emph{identiques bit-à-bit} à ceux fournis par un +serveur autorisé, alors le serveur non autorisé devient disponible pour les +téléchargements. Par exemple en supposant qu'on a choisi deux serveurs de +substituts avec cette option : @example -guix pack -S /opt/gnu/bin=bin guile emacs geiser +--substitute-urls="https://a.example.org https://b.example.org" @end example @noindent -De cette façon, les utilisateurs peuvent joyeusement taper -@file{/opt/gnu/bin/guile} et profiter. +@cindex constructions reproductibles +Si l'ACL contient uniquement la clef de @code{b.example.org}, et si +@code{a.example.org} sert @emph{exactement les mêmes} substituts, alors Guix +téléchargera les substituts de @code{a.example.org} parce qu'il vient en +premier dans la liste et peut être considéré comme un miroir de +@code{b.example.org}. En pratique, des machines de constructions produisent +souvent les mêmes binaires grâce à des construction reproductibles au bit +près (voir plus bas). -@cindex binaires repositionnables, avec @command{guix pack} -Et si le destinataire de votre pack n'a pas les privilèges root sur sa -machine, et ne peut donc pas le décompresser dans le système de fichiers -racine ? Dans ce cas, vous pourriez utiliser l'option @code{--relocatable} -(voir plus bas). Cette option produite des @dfn{binaire repositionnables}, -ce qui signifie qu'ils peuvent être placés n'importe où dans l'arborescence -du système de fichiers : dans l'exemple au-dessus, les utilisateurs peuvent -décompresser votre archive dans leur répertoire personnel et lancer -directement @file{./opt/gnu/bin/guile}. +Lorsque vous utilisez HTTPS, le certificat X.509 du serveur n'est @emph{pas} +validé (en d'autre termes, le serveur n'est pas authentifié), contrairement +à ce que des clients HTTPS comme des navigateurs web font habituellement. +Cela est dû au fait que Guix authentifie les informations sur les substituts +eux-mêmes, comme expliqué plus haut, ce dont on se soucie réellement (alors +que les certificats X.509 authentifie la relation entre nom de domaine et +clef publique). -@cindex Docker, construire une image avec guix pack -Autrement, vous pouvez produire un pack au format d'image Docker avec la -commande suivante : +@node Paramètres de serveur mandataire +@subsection Paramètres de serveur mandataire -@example -guix pack -f docker guile emacs geiser -@end example +@vindex http_proxy +Les substituts sont téléchargés par HTTP ou HTTPS. La variable +d'environnement @code{http_proxy} peut être initialisée dans l'environnement +de @command{guix-daemon} et est respectée pour le téléchargement des +substituts. Remarquez que la valeur de @code{http_proxy} dans +l'environnement où tournent @command{guix build}, @command{guix package} et +les autres clients n'a @emph{absolument aucun effet}. -@noindent -Le résultat est une archive tar qui peut être passée à la commande -@command{docker load}. Voir la -@uref{https://docs.docker.com/engine/reference/commandline/load/, -documentation de Docker} pour plus d'informations. +@node Échec de substitution +@subsection Échec de substitution -@cindex Singularity, construire une image avec guix pack -@cindex SquashFS, construire une image avec guix pack -Autrement, vous pouvez produire une image SquashFS avec la commande suivante -: +Même lorsqu'un substitut pour une dérivation est disponible, la substitution +échoue parfois. Cela peut arriver pour plusieurs raisons : le serveur de +substitut peut être hors ligne, le substitut a récemment été supprimé du +serveur, la connexion peut avoir été interrompue, etc. -@example -guix pack -f squashfs guile emacs geiser -@end example +Lorsque les substituts sont activés et qu'un substitut pour une dérivation +est disponible, mais que la tentative de substitution échoue, Guix essaiera +de construire la dérivation localement si @code{--fallback} a été passé en +argument (@pxref{option de repli,, common build option @code{--fallback}}). +Plus spécifiquement, si cet option n'a pas été passée en argument, alors +aucune construction locale n'est effectuée et la dérivation est considérée +comme étant en échec. Cependant, si @code{--fallback} est passé en argument, +alors Guix essaiera de construire la dérivation localement et l'échec ou le +succès de la dérivation dépend de l'échec ou du succès de la construction +locale. Remarquez que lorsque les substituts sont désactivés ou qu'aucun +substitut n'est disponible pour la dérivation en question, une construction +locale sera @emph{toujours} effectuée, indépendamment du fait que l'argument +@code{--fallback} ait été ou non passé. -@noindent -Le résultat est une image de système de fichiers SquashFS qui peut soit être -montée directement soit être utilisée comme image de conteneur de système de -fichiers avec l'@uref{http://singularity.lbl.gov, environnement d'exécution -conteneurisé Singularity}, avec des commandes comme @command{singularity -shell} ou @command{singularity exec}. +Pour se donner une idée du nombre de substituts disponibles maintenant, vous +pouvez essayer de lancer la commande @command{guix weather} (@pxref{Invoquer guix weather}). Cette command fournit des statistiques sur les substituts +fournis par un serveur. -Diverses options en ligne de commande vous permettent de personnaliser votre -pack : +@node De la confiance en des binaires +@subsection De la confiance en des binaires -@table @code -@item --format=@var{format} -@itemx -f @var{format} -Produire un pack dans le @var{format} donné. +@cindex confiance, en des binaires pré-construits +Today, each individual's control over their own computing is at the mercy of +institutions, corporations, and groups with enough power and determination +to subvert the computing infrastructure and exploit its weaknesses. While +using @code{@value{SUBSTITUTE-SERVER}} substitutes can be convenient, we +encourage users to also build on their own, or even run their own build +farm, such that @code{@value{SUBSTITUTE-SERVER}} is less of an interesting +target. One way to help is by publishing the software you build using +@command{guix publish} so that others have one more choice of server to +download substitutes from (@pxref{Invoquer guix publish}). -Les formats disponibles sont : +Guix possède les fondations pour maximiser la reproductibilité logicielle +(@pxref{Fonctionnalités}). Dans la plupart des cas, des constructions +indépendantes d'un paquet donnée ou d'une dérivation devrait donner des +résultats identiques au bit près. Ainsi, à travers un ensemble de +constructions de paquets indépendantes il est possible de renforcer +l'intégrité du système. La commande @command{guix challenge} a pour but +d'aider les utilisateurs à tester les serveurs de substituts et à aider les +développeurs à trouver les constructions de paquets non-déterministes +(@pxref{Invoquer guix challenge}). De même, l'option @option{--check} de +@command{guix build} permet aux utilisateurs de vérifier si les substituts +précédemment installés sont authentiques en les reconstruisant localement +(@pxref{vérification de la construction, @command{guix build --check}}). -@table @code -@item tarball -C'est le format par défaut. Il produit une archive tar contenant tous les -binaires et les liens symboliques spécifiés. +Dans le futur, nous aimerions que Guix puisse publier et recevoir des +binaires d'autres utilisateurs, d'une manière pair-à-pair. Si vous voulez +discuter de ce projet, rejoignez-nous sur @email{guix-devel@@gnu.org}. -@item docker -Cela produit une archive tar qui suit la -@uref{https://github.com/docker/docker/blob/master/image/spec/v1.2.md, -spécification des images Docker}. +@node Des paquets avec plusieurs résultats +@section Des paquets avec plusieurs résultats -@item squashfs -Cela produit une image SquashFS contenant tous les binaires et liens -symboliques spécifiés, ainsi que des points de montages vides pour les -systèmes de fichiers virtuels comme procfs. -@end table +@cindex paquets avec plusieurs résultats +@cindex sorties de paquets +@cindex sorties -@item --relocatable -@itemx -R -Produit des @dfn{binaires repositionnables} — c.-à-d.@: des binaires que -vous pouvez placer n'importe où dans l'arborescence du système de fichiers -et les lancer à partir de là. Par exemple, si vous créez un pack contenant -Bash avec : +Souvent, les paquets définis dans Guix ont une seule @dfn{sortie} — +c.-à-d.@: que le paquet source conduit à exactement un répertoire dans le +dépôt. Lorsque vous lancez @command{guix package -i glibc}, vous installez +la sortie par défaut du paquet GNU libc ; la sortie par défaut est appelée +@code{out} mais son nom peut être omis comme le montre cette commande. Dans +ce cas particuliers, la sortie par défaut de @code{glibc} contient tous les +fichiers d'en-tête C, les bibliothèques partagées, les bibliothèques +statiques, la documentation Info et les autres fichiers de support. + +Parfois il est plus approprié de séparer les divers types de fichiers +produits par un même paquet source en plusieurs sorties. Par exemple, la +bibliothèque C GLib (utilisée par GTK+ et des paquets associés) installe +plus de 20 Mo de documentation de référence dans des pages HTML. Pour +préserver l'espace disque des utilisateurs qui n'en ont pas besoin, la +documentation va dans une sortie séparée nommée @code{doc}. Pour installer +la sortie principale de GLib, qui contient tout sauf la documentation, on +devrait lancer : @example -guix pack -R -S /mybin=bin bash +guix package -i glib @end example -@noindent -...@: you can copy that pack to a machine that lacks Guix, and from your -home directory as a normal user, run: +@cindex documentation +La commande pour installer la documentation est : @example -tar xf pack.tar.gz -./mybin/sh +guix package -i glib:doc @end example -@noindent -Dans ce shell, si vous tapez @code{ls /gnu/store}, vous remarquerez que -@file{/gnu/store} apparaît et contient toutes les dépendances de -@code{bash}, même si la machine n'a pas du tout de @file{/gnu/store} ! -C'est sans doute la manière la plus simple de déployer du logiciel construit -avec Guix sur une machine sans Guix. +Certains paquets installent des programmes avec des « empreintes dépendances +» différentes. Par exemple le paquet WordNet installe à la fois les outils +en ligne de commande et les interfaces graphiques (GUI). La première ne +dépend que de la bibliothèque C, alors que cette dernière dépend de Tcl/Tk +et des bibliothèques X sous-jacentes. Dans ce cas, nous laissons les outils +en ligne de commande dans la sortie par défaut et l'interface graphique dans +une sortie séparée. Cela permet aux utilisateurs qui n'ont pas besoin +d'interface graphique de gagner de la place. La commande @command{guix +size} peut aider à trouver ces situations (@pxref{Invoquer guix size}). @command{guix graph} peut aussi être utile (@pxref{Invoquer guix graph}). -Il y a un inconvénient cependant : cette technique repose sur les -@dfn{espaces de noms} du noyau Linux qui permettent à des utilisateurs -non-privilégiés de monter des systèmes de fichiers ou de changer de racine. -Les anciennes versions de Linux ne le supportaient pas et certaines -distributions GNU/Linux les désactivent ; sur ces système, les programme du -pack @emph{ne fonctionneront pas} à moins qu'ils ne soient décompressés à la -racine du système de fichiers. +Il y a plusieurs paquets à sorties multiples dans la distribution GNU. +D'autres noms de sorties conventionnels sont @code{lib} pour les +bibliothèques et éventuellement les fichiers d'en-tête, @code{bin} pour les +programmes indépendants et @code{debug} pour les informations de débogage +(@pxref{Installer les fichiers de débogage}). Les sorties d'un paquet sont listés +dans la troisième colonne de la sortie de @command{guix package +--list-available} (@pxref{Invoquer guix package}). -@item --expression=@var{expr} -@itemx -e @var{expr} -Considérer le paquet évalué par @var{expr}. -Cela a le même but que l'option de même nom de @command{guix build} -(@pxref{Options de construction supplémentaires, @code{--expression} dans @command{guix -build}}). +@node Invoquer guix gc +@section Invoquer @command{guix gc} -@item --manifest=@var{fichier} -@itemx -m @var{fichier} -Utiliser les paquets contenus dans l'objet manifeste renvoyé par le code -Scheme dans @var{fichier} +@cindex ramasse-miettes +@cindex espace disque +Les paquets qui sont installés mais pas utilisés peuvent être @dfn{glanés}. +La commande @command{guix gc} permet aux utilisateurs de lancer +explicitement le ramasse-miettes pour récupérer de l'espace dans le +répertoire @file{/gnu/store}. C'est la @emph{seule} manière de supprimer +des fichiers de @file{/gnu/store} — supprimer des fichiers ou des +répertoires à la main peut le casser de manière impossible à réparer ! -Elle a un but similaire à l'option de même nom dans @command{guix package} -(@pxref{profile-manifest, @option{--manifest}}) et utilise les mêmes -fichiers manifeste. Ils vous permettent de définir une collection de -paquets une fois et de l'utiliser aussi bien pour créer des profils que pour -créer des archives pour des machines qui n'ont pas Guix d'installé. -Remarquez que vous pouvez spécifier @emph{soit} un fichier manifeste, -@emph{soit} une liste de paquet, mais pas les deux. +@cindex racines du GC +@cindex racines du ramasse-miettes +Le ramasse-miettes a un ensemble de @dfn{racines} connues : tout fichier +dans @file{/gnu/store} atteignable depuis une racine est considéré comme +@dfn{utilisé} et ne peut pas être supprimé ; tous les autres fichiers sont +considérés comme @dfn{inutilisés} et peuvent être supprimés. L'ensemble des +racines du ramasse-miettes (ou « racines du GC » pour faire court) inclue +les profils par défaut des utilisateurs ; par défaut les liens symboliques +sous @file{/var/guix/gcroots} représentent ces racines du GC. De nouvelles +racines du GC peuvent être ajoutées avec la @command{guix build -- root} par +exemple (@pxref{Invoquer guix build}). -@item --system=@var{système} -@itemx -s @var{système} -Tenter de construire pour le @var{système} — p.@: ex.@: @code{i686-linux} — -plutôt que pour le type de système de l'hôte de construction. +Avant de lancer @code{guix gc --collect-garbage} pour faire de la place, +c'est souvent utile de supprimer les anciennes génération des profils +utilisateurs ; de cette façon les anciennes constructions de paquets +référencées par ces générations peuvent être glanées. Cela se fait en +lançant @code{guix package --delete-generations} (@pxref{Invoquer guix package}). -@item --target=@var{triplet} -@cindex compilation croisée -Effectuer une compilation croisée pour @var{triplet} qui doit être un -triplet GNU valide, comme @code{"mips64el-linux-gnu"} (@pxref{Specifying -target triplets, GNU configuration triplets,, autoconf, Autoconf}). +Nous recommandons de lancer le ramasse-miettes régulièrement ou lorsque vous +avez besoin d'espace disque. Par exemple pour garantir qu'au moins +5@tie{}Go d'espace reste libre sur votre disque, lancez simplement : -@item --compression=@var{outil} -@itemx -C @var{outil} -Compresser l'archive résultante avec @var{outil} — l'un des outils parmi -@code{bzip2}, @code{xz}, @code{lzip} ou @code{none} pour aucune compression. +@example +guix gc -F 5G +@end example -@item --symlink=@var{spec} -@itemx -S @var{spec} -Ajouter les liens symboliques spécifiés par @var{spec} dans le pack. Cette -option peut apparaître plusieurs fois. +It is perfectly safe to run as a non-interactive periodic job +(@pxref{Exécution de tâches planifiées}, for how to set up such a job). Running +@command{guix gc} with no arguments will collect as much garbage as it can, +but that is often inconvenient: you may find yourself having to rebuild or +re-download software that is ``dead'' from the GC viewpoint but that is +necessary to build other pieces of software---e.g., the compiler tool chain. -@var{spec} a la forme @code{@var{source}=@var{cible}}, où @var{source} est -le lien symbolique qui sera créé et @var{cible} est la cible du lien. +La command @command{guix gc} a trois modes d'opération : il peut être +utilisé pour glaner des fichiers inutilisés (par défaut), pour supprimer des +fichiers spécifiques (l'option @code{--delete}), pour afficher des +informations sur le ramasse-miettes ou pour des requêtes plus avancées. Les +options du ramasse-miettes sont : -Par exemple, @code{-S /opt/gnu/bin=bin} crée un lien symbolique -@file{/opt/gnu/bin} qui pointe vers le sous-répertoire @file{bin} du profil. +@table @code +@item --collect-garbage[=@var{min}] +@itemx -C [@var{min}] +Ramasse les miettes — c.-à-d.@: les fichiers inaccessibles de +@file{/gnu/store} et ses sous-répertoires. C'est l'opération par défaut +lorsqu'aucune option n'est spécifiée. -@item --localstatedir -@itemx --profile-name=@var{nom} -Inclus le « répertoire d'état local », @file{/var/guix}, dans le lot qui en -résulte, et notamment le profil -@file{/var/guix/profiles/per-user/root/@var{nom}} — par défaut @var{nom} est -@code{guix-profile}, ce qui correspond à @file{~root/.guix-profile}. +Lorsque @var{min} est donné, s'arrêter une fois que @var{min} octets ont été +collectés. @var{min} pour être un nombre d'octets ou inclure un suffixe +d'unité, comme @code{MiB} pour mébioctet et @code{GB} pour gigaoctet +(@pxref{Block size, size specifications,, coreutils, GNU Coreutils}). -@file{/var/guix} contient la base de données du dépôt (@pxref{Le dépôt}) -ainsi que les racines du ramasse-miettes (@pxref{Invoquer guix gc}). Le -fournir dans le pack signifie que le dépôt et « complet » et gérable par -Guix ; ne pas le fournir dans le pack signifie que le dépôt est « mort » : -aucun élément ne peut être ajouté ni enlevé après l'extraction du pack. +Lorsque @var{min} est omis, tout glaner. -Un cas d'utilisation est l'archive binaire indépendante de Guix -(@pxref{Installation binaire}). +@item --free-space=@var{libre} +@itemx -F @var{libre} +Glaner jusqu'à ce que @var{libre} espace soit disponible dans +@file{/gnu/store} si possible ; @var{libre} est une quantité de stockage +comme @code{500MiB} comme décrit ci-dessus. -@item --bootstrap -Utiliser les programmes d'amorçage pour construire le pack. Cette option -n'est utile que pour les développeurs de Guix. -@end table +Lorsque @var{libre} ou plus est disponible dans @file{/gnu/store} ne rien +faire et s'arrêter immédiatement. -En plus, @command{guix pack} supporte toutes les options de construction -communes (@pxref{Options de construction communes}) et toutes les options de -transformation de paquets (@pxref{Options de transformation de paquets}). +@item --delete +@itemx -d +Essayer de supprimer tous les fichiers et les répertoires du dépôt spécifiés +en argument. Cela échoue si certains des fichiers ne sont pas dans le dépôt +ou s'ils sont toujours utilisés. +@item --list-failures +Lister les éléments du dépôt qui correspondent à des échecs de construction -@node Invoquer guix archive -@section Invoquer @command{guix archive} +Cela n'affiche rien à moins que le démon n'ait été démarré avec +@option{--cache-failures} (@pxref{Invoquer guix-daemon, +@option{--cache-failures}}). -@cindex @command{guix archive} -@cindex archive -La commande @command{guix archive} permet aux utilisateurs d'@dfn{exporter} -des fichiers du dépôt dans une simple archive puis ensuite de les -@dfn{importer} sur une machine qui fait tourner Guix. En particulier, elle -permet de transférer des fichiers du dépôt d'une machine vers le dépôt d'une -autre machine. +@item --clear-failures +Supprimer les éléments du dépôt spécifiés du cache des constructions +échouées. -@quotation Remarque -Si vous chercher une manière de produire des archives dans un format adapté -pour des outils autres que Guix, @pxref{Invoquer guix pack}. -@end quotation +De nouveau, cette option ne fait de sens que lorsque le démon est démarré +avec @option{--cache-failures}. Autrement elle ne fait rien. -@cindex exporter des éléments du dépôt -Pour exporter des fichiers du dépôt comme une archive sur la sortie -standard, lancez : +@item --list-dead +Montrer la liste des fichiers et des répertoires inutilisés encore présents +dans le dépôt — c.-à-d.@: les fichiers et les répertoires qui ne sont plus +atteignables par aucune racine. -@example -guix archive --export @var{options} @var{spécifications}... -@end example +@item --list-live +Montrer la liste des fichiers et des répertoires du dépôt utilisés. -@var{spécifications} peut être soit des noms de fichiers soit des -spécifications de paquets, comme pour @command{guix package} -(@pxref{Invoquer guix package}). Par exemple, la commande suivante crée une -archive contenant la sortie @code{gui} du paquet @code{git} et la sortie -principale de @code{emacs} : +@end table -@example -guix archive --export git:gui /gnu/store/...-emacs-24.3 > great.nar -@end example +En plus, les références entre les fichiers existants du dépôt peuvent être +demandés : -Si les paquets spécifiés ne sont pas déjà construits, @command{guix archive} -les construit automatiquement. Le processus de construction peut être -contrôlé avec les options de construction communes (@pxref{Options de construction communes}). +@table @code -Pour transférer le paquet @code{emacs} vers une machine connectée en SSH, on -pourrait lancer : +@item --references +@itemx --referrers +@cindex dépendances des paquets +Lister les références (respectivement les référents) des fichiers du dépôt +en argument. -@example -guix archive --export -r emacs | ssh la-machine guix archive --import -@end example +@item --requisites +@itemx -R +@cindex closure +Lister les prérequis des fichiers du dépôt passés en argument. Les +prérequis sont le fichier du dépôt lui-même, leur références et les +références de ces références, récursivement. En d'autre termes, la liste +retournée est la @dfn{closure transitive} des fichiers du dépôt. -@noindent -De même, on peut transférer un profil utilisateur complet d'une machine à -une autre comme cela : +@xref{Invoquer guix size} pour un outil pour surveiller la taille de la +closure d'un élément. @xref{Invoquer guix graph} pour un outil pour +visualiser le graphe des références. + +@item --derivers +@cindex dérivation +Renvoie les dérivations menant aux éléments du dépôt donnés +(@pxref{Dérivations}). + +Par exemple cette commande : @example -guix archive --export -r $(readlink -f ~/.guix-profile) | \ - ssh la-machine guix-archive --import +guix gc --derivers `guix package -I ^emacs$ | cut -f4` @end example @noindent -Cependant, remarquez que, dans les deux exemples, le paquet @code{emacs}, le -profil ainsi que toutes leurs dépendances sont transférées (à cause de -@code{-r}), indépendamment du fait qu'ils soient disponibles dans le dépôt -de la machine cible. L'option @code{--missing} peut vous aider à comprendre -les éléments qui manquent dans le dépôt de la machine cible. La commande -@command{guix copy} simplifie et optimise ce processus, c'est donc ce que -vous devriez utiliser dans ce cas (@pxref{Invoquer guix copy}). +renvoie les fichiers @file{.drv} menant au paquet @code{emacs} installé dans +votre profil. -@cindex nar, format d'archive -@cindex archive normalisée (nar) -Les archives sont stockées au format « archive normalisé » ou « nar », qui -est comparable dans l'esprit à « tar » mais avec des différences qui le -rendent utilisable pour ce qu'on veut faire. Tout d'abord, au lieu de -stocker toutes les métadonnées Unix de chaque fichier, le format nar ne -mentionne que le type de fichier (normal, répertoire ou lien symbolique) ; -les permissions Unix, le groupe et l'utilisateur ne sont pas mentionnés. -Ensuite, l'ordre dans lequel les entrées de répertoires sont stockés suit -toujours l'ordre des noms de fichier dans l'environnement linguistique C. -Cela rend la production des archives entièrement déterministe. +Remarquez qu'il peut n'y avoir aucun fichier @file{.drv} par exemple quand +ces fichiers ont été glanés. Il peut aussi y avoir plus d'un fichier +@file{.drv} correspondant à cause de dérivations à sortie fixées. +@end table -@c FIXME: Add xref to daemon doc about signatures. -Lors de l'export, le démon signe numériquement le contenu de l'archive et -cette signature est ajoutée à la fin du fichier. Lors de l'import, le démon -vérifie la signature et rejette l'import en cas de signature invalide ou si -la clef de signature n'est pas autorisée. +Enfin, les options suivantes vous permettent de vérifier l'intégrité du +dépôt et de contrôler l'utilisation du disque. -Les principales options sont : +@table @option -@table @code -@item --export -Exporter les fichiers ou les paquets du dépôt (voir plus bas). Écrire -l'archive résultante sur la sortie standard. +@item --verify[=@var{options}] +@cindex intégrité, du dépôt +@cindex vérification d'intégrité +Vérifier l'intégrité du dépôt. -Les dépendances ne sont @emph{pas} incluses dans la sortie à moins que -@code{--recursive} ne soit passé. +Par défaut, s'assurer que tous les éléments du dépôt marqués comme valides +dans la base de données du démon existent bien dans @file{/gnu/store}. -@item -r -@itemx --recursive -En combinaison avec @code{--export}, cette option demande à @command{guix -archive} d'inclure les dépendances des éléments donnés dans l'archive. -Ainsi, l'archive résultante est autonome : elle contient la closure des -éléments du dépôt exportés. +Lorsqu'elle est fournie, l'@var{option} doit être une liste séparée par des +virgule de l'un ou plus parmi @code{contents} et @code{repair}. -@item --import -Lire une archive depuis l'entrée standard et importer les fichiers inclus -dans le dépôt. Annuler si l'archive a une signature invalide ou si elle est -signée par une clef publique qui ne se trouve pas dans le clefs autorisées -(voir @code{--authorize} plus bas.) +Lorsque vous passez @option{--verify=contents}, le démon calcul le hash du +contenu de chaque élément du dépôt et le compare au hash de sa base de +données. Les différences de hash sont rapportées comme des corruptions de +données. Comme elle traverse @emph{tous les fichiers du dépôt}, cette +commande peut prendre très longtemps pour terminer, surtout sur un système +avec un disque lent. -@item --missing -Liste une liste de noms de fichiers du dépôt sur l'entrée standard, un par -ligne, et écrit sur l'entrée standard le sous-ensemble de ces fichiers qui -manquent dans le dépôt. +@cindex réparer le dépôt +@cindex corruption, récupérer de +Utiliser @option{--verify=repair} ou @option{--verify=contents,repair} fait +que le démon essaie de réparer les objets du dépôt corrompus en récupérant +leurs substituts (@pxref{Substituts}). Comme la réparation n'est pas +atomique et donc potentiellement dangereuse, elle n'est disponible que pour +l'administrateur système. Une alternative plus légère lorsque vous +connaissez exactement quelle entrée est corrompue consiste à lancer +@command{guix build --repair} (@pxref{Invoquer guix build}). -@item --generate-key[=@var{paramètres}] -@cindex signature, archives -Générer une nouvelle paire de clefs pour le démon. Cela est un prérequis -avant que les archives ne puissent être exportées avec @code{--export}. -Remarquez que cette opération prend généralement du temps parce qu'elle doit -récupère suffisamment d'entropie pour générer la paire de clefs. +@item --optimize +@cindex déduplication +Optimiser le dépôt en liant en dur les fichiers identiques — c'est la +@dfn{déduplication}. -La paire de clefs générée est typiquement stockée dans @file{/etc/guix}, -dans @file{signing-key.pub} (clef publique) et @file{signing-key.sec} (clef -privée, qui doit rester secrète). Lorsque @var{paramètres} est omis, une -clef ECDSA utilisant la courbe Ed25519 est générée ou pour les version de -libgcrypt avant 1.6.0, une clef RSA de 4096 bits. Autrement, -@var{paramètres} peut spécifier les paramètres @code{genkey} adaptés pour -libgcrypt (@pxref{General public-key related Functions, -@code{gcry_pk_genkey},, gcrypt, The Libgcrypt Reference Manual}). +Le démon effectue une déduplication à chaque construction réussie ou import +d'archive à moins qu'il n'ait été démarré avec +@code{--disable-deduplication} (@pxref{Invoquer guix-daemon, +@code{--disable-deduplication}}). Ainsi, cette option est surtout utile +lorsque le démon tourne avec @code{--disable-deduplication}. -@item --authorize -@cindex autorisation, archives -Autoriser les imports signés par la clef publique passée sur l'entrée -standard. La clef publique doit être au « format avancé s-expression » — -c.-à-d.@: le même format que le fichier @file{signing-key.pub}. +@end table -La liste des clefs autorisées est gardée dans un fichier modifiable par des -humains dans @file{/etc/guix/acl}. Le fichier contient des -@url{http://people.csail.mit.edu/rivest/Sexp.txt, « s-expressions au format -avancé »} et est structuré comme une liste de contrôle d'accès dans -l'@url{http://theworld.com/~cme/spki.txt, infrastructure à clefs publiques -simple (SPKI)}. +@node Invoquer guix pull +@section Invoquer @command{guix pull} -@item --extract=@var{répertoire} -@itemx -x @var{répertoire} -Lit une archive à un seul élément telle que servie par un serveur de -substituts (@pxref{Substituts}) et l'extrait dans @var{répertoire}. C'est -une opération de bas niveau requise seulement dans de rares cas d'usage ; -voir plus loin. +@cindex mettre à niveau Guix +@cindex mettre à jour Guix +@cindex @command{guix pull} +@cindex pull +Les paquets sont installés ou mis à jour vers la dernière version disponible +dans la distribution actuellement disponible sur votre machine locale. Pour +mettre à jour cette distribution, en même temps que les outils Guix, vous +devez lancer @command{guix pull} ; la commande télécharge le dernier code +source de Guix et des descriptions de paquets et le déploie. Le code source +est téléchargé depuis un dépôt @uref{https://git-scm.com, Git}, par défaut +le dépôt officiel de GNU@tie{}Guix, bien que cela puisse être personnalisé. + +À la fin, @command{guix package} utilisera les paquets et les versions des +paquets de la copie de Guix tout juste récupérée. Non seulement ça, mais +toutes les commandes Guix et les modules Scheme seront aussi récupérés +depuis la dernière version. Les nouvelles sous-commandes de @command{guix} +ajoutés par la mise à jour sont aussi maintenant disponibles. -Par exemple, la commande suivante extrait le substitut pour Emacs servi par -@code{hydra.gnu.org} dans @file{/tmp/emacs} : +Chaque utilisateur peut mettre à jour sa copie de Guix avec @command{guix +pull} et l'effet est limité à l'utilisateur qui a lancé @command{guix +pull}. Par exemple, lorsque l'utilisateur @code{root} lance @command{guix +pull}, cela n'a pas d'effet sur la version de Guix que vois @code{alice} et +vice-versa + +Le résultat après avoir lancé @command{guix pull} est un @dfn{profil} +disponible sous @file{~/.config/guix/current} contenant la dernière version +de Guix. Ainsi, assurez-vous de l'ajouter au début de votre chemin de +recherche pour que vous utilisiez la dernière version. Le même conseil +s'applique au manuel Info (@pxref{Documentation}) : @example -$ wget -O - \ - https://hydra.gnu.org/nar/@dots{}-emacs-24.5 \ - | bunzip2 | guix archive -x /tmp/emacs +export PATH="$HOME/.config/guix/current/bin:$PATH" +export INFOPATH="$HOME/.config/guix/current/share/info:$INFOPATH" @end example -Les archives à un seul élément sont différentes des archives à plusieurs -éléments produites par @command{guix archive --export} ; elles contiennent -un seul élément du dépôt et elles n'embarquent @emph{pas} de signature. -Ainsi cette opération ne vérifie @emph{pas} de signature et sa sortie -devrait être considérée comme non sûre. +L'option @code{--list-generations} ou @code{-l} liste les anciennes +générations produites par @command{guix pull}, avec des détails sur leur +origine : -Le but principal de cette opération est de faciliter l'inspection du contenu -des archives venant de serveurs auxquels on ne fait potentiellement pas -confiance. +@example +$ guix pull -l +Génération 1 10 juin 2018 00:18:18 + guix 65956ad + URL du dépôt : https://git.savannah.gnu.org/git/guix.git + branche : origin/master + commit : 65956ad3526ba09e1f7a40722c96c6ef7c0936fe -@end table +Génération 2 11 juin 2018 11:02:49 + guix e0cc7f6 + URL du dépôt : https://git.savannah.gnu.org/git/guix.git + branche : origin/master + commit : e0cc7f669bec22c37481dd03a7941c7d11a64f1d + 2 nouveaux paquets : keepalived, libnfnetlink + 6 paquets mis à jour : emacs-nix-mode@@2.0.4, + guile2.0-guix@@0.14.0-12.77a1aac, guix@@0.14.0-12.77a1aac, + heimdal@@7.5.0, milkytracker@@1.02.00, nix@@2.0.4 -@c ********************************************************************* -@node Interface de programmation -@chapter Interface de programmation +Génération 3 13 juin 2018 23:31:07 (actuelle) + guix 844cc1c + URL du dépôt : https://git.savannah.gnu.org/git/guix.git + branche : origin/master + commit : 844cc1c8f394f03b404c5bb3aee086922373490c + 28 nouveaux paquets : emacs-helm-ls-git, emacs-helm-mu, @dots{} + 69 paquets mis à jour : borg@@1.1.6, cheese@@3.28.0, @dots{} +@end example -GNU Guix fournit diverses interface de programmation Scheme (API) qui pour -définir, construire et faire des requêtes sur des paquets. La première -interface permet aux utilisateurs d'écrire des définitions de paquets de -haut-niveau. Ces définitions se réfèrent à des concepts de création de -paquets familiers, comme le nom et la version du paquet, son système de -construction et ses dépendances. Ces définitions peuvent ensuite être -transformées en actions concrètes lors de la construction. +@ref{Invoquer guix describe, @command{guix describe}} pour d'autres manières +de décrire le statut actuel de Guix. -Les actions de construction sont effectuées par le démon Guix, pour le -compte des utilisateurs. Dans un environnement standard, le démon possède -les droits en écriture sur le dépôt — le répertoire @file{/gnu/store} — mais -pas les utilisateurs. La configuration recommandée permet aussi au démon -d'effectuer la construction dans des chroots, avec un utilisateur de -construction spécifique pour minimiser les interférences avec le reste du -système. +Ce profil @code{~/.config/guix/current} fonctionne comme les autres profils +créés par @command{guix package} (@pxref{Invoquer guix package}). +C'est-à-dire que vous pouvez lister les générations, revenir en arrière à +une génération précédente — c.-à-d.@: la version de Guix précédente — etc : -@cindex dérivation -Il y a des API de plus bas niveau pour interagir avec le démon et le dépôt. -Pour demander au démon d'effectuer une action de construction, les -utilisateurs lui donnent en fait une @dfn{dérivation}. Une dérivation est -une représentation à bas-niveau des actions de construction à entreprendre -et l'environnement dans lequel elles devraient avoir lieu — les dérivations -sont aux définitions de paquets ce que l'assembleur est aux programmes C. -Le terme de « dérivation » vient du fait que les résultats de la -construction en @emph{dérivent}. +@example +$ guix package -p ~/.config/guix/current --roll-back +passé de la génération 3 à 2 +$ guix package -p ~/.config/guix/current --delete-generations=1 +suppression de /var/guix/profiles/per-user/charlie/current-guix-1-link +@end example -Ce chapitre décrit toutes ces API tour à tour, à partir des définitions de -paquets à haut-niveau. +La commande @command{guix pull} est typiquement invoquée sans arguments mais +il supporte les options suivantes : -@menu -* Définition des paquets:: Définir de nouveaux paquets. -* Systèmes de construction:: Spécifier comment construire les paquets. -* Le dépôt:: Manipuler le dépôt de paquets. -* Dérivations:: Interface de bas-niveau avec les dérivations - de paquets. -* La monad du dépôt:: Interface purement fonctionnelle avec le - dépôt. -* G-Expressions:: Manipuler les expressions de construction. -* Invoquer guix repl:: S'amuser avec Guix de manière interactive. -@end menu +@table @code +@item --url=@var{url} +@itemx --commit=@var{commit} +@itemx --branch=@var{branche} +Télécharger le code depuis l'@var{url} spécifié, au @var{commit} donné (un +commit Git valide représenté par une chaîne hexadécimale) ou à la branche +@var{branch}. -@node Définition des paquets -@section Définition des paquets +@cindex @file{channels.scm}, fichier de configuration +@cindex fichier de configuration pour les canaux +Ces options sont fournies pour votre confort, mais vous pouvez aussi +spécifier votre configuration dans le fichier +@file{~/.config/guix/channels.scm} ou en utilisant l'option +@option{--channels} (voir plus bas). -L'interface de haut-niveau pour les définitions de paquets est implémentée -dans les modules @code{(guix packages)} et @code{(guix build-system)}. Par -exemple, la définition du paquet, ou la @dfn{recette}, du paquet GNU Hello -ressemble à cela : +@item --channels=@var{file} +@itemx -C @var{file} +Lit la liste des canaux dans @var{file} plutôt que dans +@file{~/.config/guix/channels.scm}. @var{file} doit contenir un code Scheme +qui s'évalue en une liste d'objets de canaux. @xref{Canaux} pour plus +d'informations. -@example -(define-module (gnu packages hello) - #:use-module (guix packages) - #:use-module (guix download) - #:use-module (guix build-system gnu) - #:use-module (guix licenses) - #:use-module (gnu packages gawk)) +@item --list-generations[=@var{motif}] +@itemx -l [@var{motif}] +Liste toutes les générations de @file{~/.config/guix/current} ou, si +@var{motif} est fournit, le sous-ensemble des générations qui correspondent +à @var{motif}. La syntaxe de @var{motif} est la même qu'avec @code{guix +package --list-generations} (@pxref{Invoquer guix package}). -(define-public hello - (package - (name "hello") - (version "2.10") - (source (origin - (method url-fetch) - (uri (string-append "mirror://gnu/hello/hello-" version - ".tar.gz")) - (sha256 - (base32 - "0ssi1wpaf7plaswqqjwigppsg5fyh99vdlb9kzl7c9lng89ndq1i")))) - (build-system gnu-build-system) - (arguments '(#:configure-flags '("--enable-silent-rules"))) - (inputs `(("gawk" ,gawk))) - (synopsis "Hello, GNU world: An example GNU package") - (description "Guess what GNU Hello prints!") - (home-page "http://www.gnu.org/software/hello/") - (license gpl3+))) -@end example +@ref{Invoquer guix describe}, pour une manière d'afficher des informations +sur la génération actuelle uniquement. -@noindent -Sans être un expert Scheme, le lecteur peut comprendre la signification des -différents champs présents. Cette expression lie la variable @code{hello} à -un objet @code{}, qui est essentiellement un enregistrement -(@pxref{SRFI-9, Scheme records,, guile, GNU Guile Reference Manual}). On -peut inspecter cet objet de paquet avec les procédures qui se trouvent dans -le module @code{(guix packages)} ; par exemple, @code{(package-name hello)} -renvoie — oh surprise ! — @code{"hello"}. +@item --profile=@var{profil} +@itemx -p @var{profil} +Utiliser le @var{profil} à la place de @file{~/.config/guix/current}. -Avec un peu de chance, vous pourrez importer tout ou partie de la définition -du paquet qui vous intéresse depuis un autre répertoire avec la commande -@code{guix import} (@pxref{Invoquer guix import}). +@item --dry-run +@itemx -n +Montrer quels commits des canaux seraient utilisés et ce qui serait +construit ou substitué mais ne pas le faire vraiment. -Dans l'exemple précédent, @var{hello} est défini dans un module à part, -@code{(gnu packages hello)}. Techniquement, cela n'est pas strictement -nécessaire, mais c'est pratique : tous les paquets définis dans des modules -sous @code{(gnu packages @dots{})} sont automatiquement connus des outils en -ligne de commande (@pxref{Modules de paquets}). +@item --system=@var{système} +@itemx -s @var{système} +Tenter de construire pour le @var{système} — p.@: ex.@: @code{i686-linux} — +plutôt que pour le type de système de l'hôte de construction. -Il y a quelques points à remarquer dans la définition de paquet précédente : +@item --verbose +Produire une sortie verbeuse, en écrivant les journaux de construction sur +la sortie d'erreur standard. -@itemize -@item -Le champ @code{source} du paquet est un objet @code{} (@pxref{Référence d'origine}, pour la référence complète). Ici, on utilise la méthode -@code{url-fetch} de @code{(guix download)}, ce qui signifie que la source -est un fichier à télécharger par FTP ou HTTP. +@item --bootstrap +Utiliser le programme d'amorçage Guile pour construire la dernière version +de Guix. Cette option n'est utile que pour les développeurs de Guix. +@end table -Le préfixe @code{mirror://gnu} demande à @code{url-fetch} d'utiliser l'un -des miroirs GNU définis dans @code{(guix download)}. +Le mécanisme de @dfn{canaux} vous permet de dire à @command{guix pull} quels +répertoires et branches récupérer, ainsi que les dépôts +@emph{supplémentaires} contenant des modules de paquets qui devraient être +déployés. @xref{Canaux} pour plus d'information. -Le champ @code{sha256} spécifie le hash SHA256 attendu pour le fichier -téléchargé. Il est requis et permet à Guix de vérifier l'intégrité du -fichier. La forme @code{(base32 @dots{})} introduit a représentation en -base32 du hash. Vous pouvez obtenir cette information avec @code{guix -download} (@pxref{Invoquer guix download}) et @code{guix hash} -(@pxref{Invoquer guix hash}). +En plus, @command{guix pull} supporte toutes les options de construction +communes (@pxref{Options de construction communes}). -@cindex correctifs -Lorsque cela est requis, la forme @code{origin} peut aussi avec un champ -@code{patches} qui liste les correctifs à appliquer et un champ -@code{snippet} qui donne une expression Scheme pour modifier le code source. +@node Canaux +@section Canaux -@item -@cindex Système de construction GNU -Le champ @code{build-system} spécifie la procédure pour construire le paquet -(@pxref{Systèmes de construction}). Ici, @var{gnu-build-system} représente le système -de construction GNU familier, où les paquets peuvent être configurés, -construits et installés avec la séquence @code{./configure && make && make -check && make install} habituelle. +@cindex canaux +@cindex @file{channels.scm}, fichier de configuration +@cindex fichier de configuration pour les canaux +@cindex @command{guix pull}, fichier de configuration +@cindex configuration de @command{guix pull} +Guix et sa collection de paquets sont mis à jour en lançant @command{guix +pull} (@pxref{Invoquer guix pull}). Par défaut @command{guix pull} +télécharge et déploie Guix lui-même depuis le dépôt officiel de +GNU@tie{}Guix. Cela peut être personnalisé en définissant des @dfn{canaux} +dans le fichier @file{~/.config/guix/channels.scm}. Un canal spécifie l'URL +et la branche d'un répertoire Git à déployer et on peut demander à +@command{guix pull} de récupérer un ou plusieurs canaux. En d'autres +termes, les canaux peuvent être utilisés pour personnaliser et pour +@emph{étendre} Guix, comme on le verra plus bas. -@item -Le champ @code{arguments} spécifie des options pour le système de -construction (@pxref{Systèmes de construction}). Ici il est interprété par -@var{gnu-build-system} comme une demande de lancer @file{configure} avec le -drapeau @code{--enable-silent-rules}. +@subsection Utiliser un canal Guix personnalisé -@cindex quote -@cindex quoting -@findex ' -@findex quote -Que sont ces apostrophes (@code{'}) ? C'est de la syntaxe Scheme pour -introduire une liste ; @code{'} est synonyme de la fonction @code{quote}. -@xref{Expression Syntax, quoting,, guile, GNU Guile Reference Manual}, pour -des détails. Ice la valeur du champ @code{arguments} est une liste -d'arguments passés au système de construction plus tard, comme avec -@code{apply} (@pxref{Fly Evaluation, @code{apply},, guile, GNU Guile -Reference Manual}). +Le canal nommé @code{guix} spécifie où Guix lui-même — ses outils en ligne +de commande ainsi que sa collection de paquets — sera téléchargé. Par +exemple, supposons que vous voulez effectuer les mises à jour depuis votre +propre copie du dépôt Guix sur @code{example.org}, et plus particulièrement +depuis la branche @code{super-hacks}. Vous pouvez écrire cette +spécification dans @code{~/.config/guix/channels.scm} : -La séquence dièse-deux-points (@code{#:}) définie un @dfn{mot-clef} Scheme -(@pxref{Keywords,,, guile, GNU Guile Reference Manual}), et -@code{#:configure-flags} est un mot-clef utilisé pour passer un argument au -système de construction (@pxref{Coding With Keywords,,, guile, GNU Guile -Reference Manual}). +@lisp +;; Dit à « guix pull » d'utiliser mon propre dépôt. +(list (channel + (name 'guix) + (url "https://example.org/my-guix.git") + (branch "super-hacks"))) +@end lisp -@item -Le champ @code{inputs} spécifie les entrées du processus de construction — -c.-à-d.@: les dépendances à la construction ou à l'exécution du paquet. Ici -on définie une entrée nommée @code{"gawk"} dont la valeur est la variable -@var{gawk} ; @var{gawk} est elle-même liée à un objet @code{}. +@noindent +Maintenant, @command{guix pull} récupérera le code depuis la branche +@code{super-hacks} du dépôt sur @code{example.org}. -@cindex accent grave (quasiquote) -@findex ` -@findex quasiquote -@cindex virgule (unquote) -@findex , -@findex unquote -@findex ,@@ -@findex unquote-splicing -De nouveau, @code{`} (un accent grave, synonyme de la fonction -@code{quasiquote}) nous permet d'introduire une liste litérale dans le champ -@code{inputs}, tandis que @code{,} (une virgule, synonyme de la fonction -@code{unquote}) nous permet d'insérer une valeur dans cette liste -(@pxref{Expression Syntax, unquote,, guile, GNU Guile Reference Manual}). +@subsection Spécifier des canaux supplémentaires -Remarquez que GCC, Coreutils, Bash et les autres outils essentiels n'ont pas -besoin d'être spécifiés en tant qu'entrées ici. À la place, le -@var{gnu-build-system} est en charge de s'assurer qu'ils sont présents -(@pxref{Systèmes de construction}). +@cindex étendre la collection de paquets (canaux) +@cindex paquets personnels (canaux) +@cindex canaux, pour des paquets personnels +Vous pouvez aussi spécifier des @emph{canaux supplémentaires} à récupérer. +Disons que vous avez un ensemble de paquets personnels ou de variantes +personnalisées qu'il ne vaudrait pas le coup de contribuer au projet Guix, +mais que vous voudriez pouvoir utiliser de manière transparente sur la ligne +de commande. Vous écririez d'abord des modules contenant ces définitions de +paquets (@pxref{Modules de paquets}), en les maintenant dans un dépôt Git, puis +vous ou n'importe qui d'autre pourrait l'utiliser comme un canal +supplémentaire où trouver ces paquets. Sympa, non ? -Cependant, toutes les autres dépendances doivent être spécifiées dans le -champ @code{inputs}. Toute dépendance qui ne serait pas spécifiée ici sera -simplement indisponible pour le processus de construction, ce qui peut mener -à un échec de la construction. -@end itemize +@c What follows stems from discussions at +@c as well as +@c earlier discussions on guix-devel@gnu.org. +@quotation Attention +Avant que vous, cher utilisateur, ne vous exclamiez « Oh mais c'est +@emph{super génial} ! » et que vous ne publiez vos canaux personnels +publiquement, nous voudrions vous donner quelques avertissements : -@xref{Référence de paquet}, pour une description complète des champs -possibles. +@itemize +@item +Avant de publier un canal, envisagez de contribuer vos définitions de +paquets dans Guix (@pxref{Contribuer}). Guix en tant que projet est +ouvert à tous les logiciels libres de toutes sortes, et les paquets dans +Guix sont déjà disponibles à tous les utilisateurs de Guix et bénéficient +des processus d'assurance qualité du projet. -Lorsqu'une définition de paquet est en place, le paquet peut enfin être -construit avec l'outil en ligne de commande @code{guix build} -(@pxref{Invoquer guix build}), pour résoudre les échecs de construction que -vous pourriez rencontrer (@pxref{Débogage des échecs de construction}). Vous pouvez -aisément revenir à la définition du paquet avec la commande @command{guix -edit} (@pxref{Invoquer guix edit}). @xref{Consignes d'empaquetage}, pour plus -d'inforamtions sur la manière de tester des définitions de paquets et -@ref{Invoquer guix lint}, pour des informations sur la manière de vérifier -que la définition réspecte les conventions de style. -@vindex GUIX_PACKAGE_PATH -Enfin, @pxref{Canaux} pour des informations sur la manière d'étendre la -distribution en ajoutant vos propres définitions de paquets dans un « canal -». +@item +Lorsque vous maintenez des définitions de paquets en dehors de Guix, nous, +les développeurs de Guix, considérons que @emph{la charge de la +compatibilité vous incombe}. Rappelez-vous que les modules de paquets et +les définitions de paquets ne sont que du code Scheme qui utilise diverses +interfaces de programmation (API). Nous souhaitons rester libres de changer +ces API pour continuer à améliorer Guix, éventuellement d'une manière qui +casse votre canal. Nous ne changeons jamais l'API gratuitement, mais nous +ne nous engageons @emph{pas} à geler les API non plus. -Finalement, la mise à jour de la définition du paquet à une nouvelle version -amont peut en partie s'automatiser avec la commande @command{guix refresh} -(@pxref{Invoquer guix refresh}). +@item +Corollaire : si vous utilisez un canal externe et que le canal est cassé, +merci de @emph{rapporter le problème à l'auteur du canal}, pas au projet +Guix. +@end itemize -Sous le capot, une dérivation qui correspond à un objet @code{} est -d'abord calculé par la procédure @code{package-derivation}. Cette -dérivation est stockée dans un fichier @code{.drv} dans @file{/gnu/store}. -Les actions de construction qu'il prescrit peuvent ensuite être réalisées -par la procédure @code{build-derivation} (@pxref{Le dépôt}). +Vous avez été prévenus ! Maintenant, nous pensons que des canaux externes +sont une manière pratique d'exercer votre liberté pour augmenter la +collection de paquets de Guix et de partager vos améliorations, qui sont les +principes de bases du @uref{https://www.gnu.org/philosophy/free-sw.html, +logiciel libre}. Contactez-nous par courriel sur +@email{guix-devel@@gnu.org} si vous souhaitez discuter à ce propos. +@end quotation -@deffn {Procédure Scheme} package-derivation @var{store} @var{package} [@var{system}] -Renvoie l'objet @code{} du @var{paquet} pour le @var{système} -(@pxref{Dérivations}). +To use a channel, write @code{~/.config/guix/channels.scm} to instruct +@command{guix pull} to pull from it @emph{in addition} to the default Guix +channel(s): -@var{paquet} doit être un objet @code{} valide et @var{système} une -chaîne indiquant le type de système cible — p.ex.@: @code{"x86_64-linux"} -pour un système GNU x86_64 basé sur Linux. @var{dépôt} doit être une -connexion au démon, qui opère sur les dépôt (@pxref{Le dépôt}). -@end deffn +@vindex %default-channels +@lisp +;; Ajouter mes paquets personnels à ceux fournis par Guix. +(cons (channel + (name 'my-personal-packages) + (url "https://example.org/personal-packages.git")) + %default-channels) +@end lisp @noindent -@cindex compilation croisée -De manière identique, il est possible de calculer une dérivation qui -effectue une compilation croisée d'un paquet pour un autre système : - -@deffn {Procédure Scheme} package-cross-derivation @var{store} @ - @var{paquet} @var{cible} [@var{système}] renvoie l'objet @code{} -duof @var{paquet} construit depuis @var{système} pour @var{cible}. - -@var{cible} doit être un triplet GNU valide indiquant le matériel cible et -le système d'exploitation, comme @code{"mips64el-linux-gnu"} -(@pxref{Configuration Names, GNU configuration triplets,, configure, GNU -Configure and Build System}). -@end deffn - -@cindex transformations de paquets -@cindex réécriture d'entrées -@cindex réécriture de l'arbre des dépendances -On peut manipuler les paquets de manière arbitraire. Une transformation -utile est par exemple la @dfn{réécriture d'entrées} où l'arbre des -dépendances d'un paquet est réécrit en replaçant des entrées spécifiques par -d'autres : - -@deffn {Procédure Scheme} package-input-rewriting @var{replacements} @ - [@var{nom-réécrit}] Renvoie une procédure qui, lorsqu'on lui donne un -paquet, remplace des dépendances directes et indirectes (mais pas ses -entrées implicites) en fonction de @var{remplacements}. @var{remplacements} -est une liste de paires de paquets ; le premier élément de chaque pair est -le paquet à remplacer, le second son remplaçant. +Note that the snippet above is (as always!)@: Scheme code; we use +@code{cons} to add a channel the list of channels that the variable +@code{%default-channels} is bound to (@pxref{Pairs, @code{cons} and lists,, +guile, GNU Guile Reference Manual}). With this file in place, @command{guix +pull} builds not only Guix but also the package modules from your own +repository. The result in @file{~/.config/guix/current} is the union of +Guix with your own package modules: -De manière facultative, @var{nom-réécrit} est une procédure à un argument -qui prend le nom d'un paquet et renvoie son nouveau nom après l'avoir -réécrit. -@end deffn +@example +$ guix pull --list-generations +@dots{} +Génération 19 Aug 27 2018 16:20:48 + guix d894ab8 + URL du dépôt : https://git.savannah.gnu.org/git/guix.git + branche : master + commit : d894ab8e9bfabcefa6c49d9ba2e834dd5a73a300 + my-personal-packages dd3df5e + URL du dépôt : https://example.org/personal-packages.git + branche : master + commit : dd3df5e2c8818760a8fc0bd699e55d3b69fef2bb + 11 nouveaux paquets : my-gimp, my-emacs-with-cool-features, @dots{} + 4 paquets mis à jour : emacs-racket-mode@@0.0.2-2.1b78827, @dots{} +@end example @noindent -Regardez cet exemple : +La sortie de @command{guix pull} ci-dessus montre que la génération@tie{}19 +contient aussi bien Guix que les paquets du canal +@code{my-personal-packages}. Parmi les nouveaux paquets et les paquets mis +à jour qui sont listés, certains comme @code{my-gimp} et +@code{my-emacs-with-cool-features} peuvent provenir de +@code{my-personal-packages}, tandis que d'autres viennent du canal par +défaut de Guix. -@example -(define libressl-instead-of-openssl - ;; Cette procédure remplace OPENSSL par LIBRESSL, - ;; récursivement. - (package-input-rewriting `((,openssl . ,libressl)))) +To create a channel, create a Git repository containing your own package +modules and make it available. The repository can contain anything, but a +useful channel will contain Guile modules that export packages. Once you +start using a channel, Guix will behave as if the root directory of that +channel's Git repository has been added to the Guile load path (@pxref{Load +Paths,,, guile, GNU Guile Reference Manual}). For example, if your channel +contains a file at @file{my-packages/my-tools.scm} that defines a Guile +module, then the module will be available under the name @code{(my-packages +my-tools)}, and you will be able to use it like any other module +(@pxref{Modules,,, guile, GNU Guile Reference Manual}). -(define git-with-libressl - (libressl-instead-of-openssl git)) -@end example +@cindex dependencies, channels +@cindex meta-data, channels +@subsection Declaring Channel Dependencies -@noindent -Ici nous définissons d'abord une procédure de réécriture qui remplace -@var{openssl} par @var{libressl}. Ensuite nous l'utilisons pour définir une -@dfn{variante} du paquet @var{git} qui utilise @var{libressl} plutôt que -@var{openssl}. cela est exactement ce que l'option en ligne de commande -@option{--with-input} fait (@pxref{Options de transformation de paquets, -@option{--with-input}}). +Channel authors may decide to augment a package collection provided by other +channels. They can declare their channel to be dependent on other channels +in a meta-data file @file{.guix-channel}, which is to be placed in the root +of the channel repository. -Une procédure plus générique pour réécrire un graphe de dépendance d'un -paquet est @code{package-mapping} : elle supporte n'importe quel changement -dans les nœuds du graphe. +The meta-data file should contain a simple S-expression like this: -@deffn {Procédure Scheme} package-mapping @var{proc} [@var{cut?}] -Renvoie une procédure qui, avec un paquet, applique @var{proc} sur tous les -paquets dont il dépend et renvoie le paquet qui en résulte. La procédure -arrête la récursion là où @var{cut?} renvoie vrai pour un paquet donné. -@end deffn +@lisp +(channel + (version 0) + (dependencies + (channel + (name some-collection) + (url "https://example.org/first-collection.git")) + (channel + (name some-other-collection) + (url "https://example.org/second-collection.git") + (branch "testing")))) +@end lisp -@menu -* Référence de paquet:: Le type de donnée des paquets. -* Référence d'origine:: Le type de données d'origine. -@end menu +In the above example this channel is declared to depend on two other +channels, which will both be fetched automatically. The modules provided by +the channel will be compiled in an environment where the modules of all +these declared channels are available. +For the sake of reliability and maintainability, you should avoid +dependencies on channels that you don't control, and you should aim to keep +the number of dependencies to a minimum. -@node Référence de paquet -@subsection Référence de @code{package} +@subsection Répliquer Guix -Cette section résume toutes les options disponibles dans les déclarations -@code{package} (@pxref{Définition des paquets}). +@cindex épinglage, canaux +@cindex répliquer Guix +@cindex reproductibilité, de Guix +La sortie de @command{guix pull --list-generations} ci-dessus montre +précisément quels commits ont été utilisés pour construire cette instance de +Guix. Nous pouvons donc la répliquer, disons sur une autre machine, en +fournissant une spécification de canal dans +@file{~/.config/guix/channels.scm} qui est « épinglé » à ces commits : -@deftp {Type de données} package -C'est le type de donnée représentant une recette de paquets +@lisp +;; Déployer des commits précis de mes canaux préférés. +(list (channel + (name 'guix) + (url "https://git.savannah.gnu.org/git/guix.git") + (commit "d894ab8e9bfabcefa6c49d9ba2e834dd5a73a300")) + (channel + (name 'my-personal-packages) + (url "https://example.org/personal-packages.git") + (branch "dd3df5e2c8818760a8fc0bd699e55d3b69fef2bb"))) +@end lisp -@table @asis -@item @code{name} -Le nom du paquet, comme une chaîne de caractères. +La commande @command{guix describe --format=channels} peut même générer +cette liste de canaux directement (@pxref{Invoquer guix describe}). -@item @code{version} -La version du paquet, comme une chaîne de caractères. +À ce moment les deux machines font tourner @emph{exactement le même Guix}, +avec l'accès @emph{exactement aux même paquets}. La sortie de @command{guix +build gimp} sur une machine sera exactement la même, au bit près, que la +sortie de la même commande sur l'autre machine. Cela signifie aussi que les +deux machines ont accès à tous les codes sources de Guix, et transitivement, +à tous les codes sources de tous les paquets qu'il définit. -@item @code{source} -Un objet qui indique comment le code source du paquet devrait être -récupéré. La plupart du temps, c'est un objet @code{origin} qui indique un -fichier récupéré depuis internet (@pxref{Référence d'origine}). Il peut aussi -s'agir de tout autre objet ``simili-fichier'' comme un @code{local-file} qui -indique un fichier du système de fichier local (@pxref{G-Expressions, -@code{local-file}}). +Cela vous donne des super-pouvoirs, ce qui vous permet de suivre la +provenance des artefacts binaires avec un grain très fin et de reproduire +les environnements logiciels à volonté — une sorte de capacité de « +méta-reproductibilité », si vous voulez. @xref{Inférieurs}, pour une autre +manière d'utiliser ces super-pouvoirs. -@item @code{build-system} -Le système de construction qui devrait être utilisé pour construire le -paquet (@pxref{Systèmes de construction}). +@node Inférieurs +@section Inférieurs + +@c TODO: Remove this once we're more confident about API stability. +@quotation Remarque +La fonctionnalité décrite ici est un « démonstrateur technique » à la +version @value{VERSION}. Ainsi, l'interface est sujette à changements. +@end quotation -@item @code{arguments} (par défaut : @code{'()}) -Les arguments à passer au système de construction. C'est une liste qui -contient typiquement une séquence de paires de clefs-valeurs. +@cindex inférieurs +@cindex composition de révisions de Guix +Parfois vous pourriez avoir à mélanger des paquets de votre révision de Guix +avec des paquets disponibles dans une révision différente de Guix. Les +@dfn{inférieurs} de Guix vous permettent d'accomplir cette tâche en +composant différentes versions de Guix de manière arbitraire. -@item @code{inputs} (par défaut : @code{'()}) -@itemx @code{native-inputs} (par défaut : @code{'()}) -@itemx @code{propagated-inputs} (par défaut : @code{'()}) -@cindex entrées, des paquets -Ces champs listent les dépendances du paquet. Chacune est une liste de -tuples, où chaque tuple a une étiquette pour une entrée (une chaîne de -caractères) comme premier élément, un paquet, une origine ou une dérivation -comme deuxième élément et éventuellement le nom d'une sortie à utiliser qui -est @code{"out"} par défaut (@pxref{Des paquets avec plusieurs résultats}, pour -plus d'informations sur les sorties des paquets). Par exemple, la liste -suivante spécifie trois entrées : +@cindex paquets inférieurs +Techniquement, un « inférieur » est surtout un processus Guix séparé +connecté à votre processus Guix principal à travers un REPL (@pxref{Invoquer guix repl}). Le module @code{(guix inferior)} vous permet de créer des +inférieurs et de communiquer avec eux. Il fournit aussi une interface de +haut-niveau pour naviguer dans les paquets d'un inférieur — @dfn{des paquets +inférieurs} — et les manipuler. -@example -`(("libffi" ,libffi) - ("libunistring" ,libunistring) - ("glib:bin" ,glib "bin")) ;la sortie "bin" de Glib -@end example +Lorsqu'on les combine avec des canaux (@pxref{Canaux}), les inférieurs +fournissent une manière simple d'interagir avec un révision de Guix +séparée. Par exemple, disons que vous souhaitiez installer dans votre +profil le paquet guile actuel, avec le @code{guile-json} d'une ancienne +révision de Guix — peut-être parce que la nouvelle version de +@code{guile-json} a une API incompatible et que vous voulez lancer du code +avec l'ancienne API. Pour cela, vous pourriez écrire un manifeste à +utiliser avec @code{guix package --manifest} (@pxref{Invoquer guix package}) +; dans ce manifeste, vous créeriez un inférieur pour l'ancienne révision de +Guix qui vous intéresse et vous chercheriez le paquet @code{guile-json} dans +l'inférieur : -@cindex compilation croisée, dépendances des paquets -La distinction entre @code{native-inputs} et @code{inputs} est nécessaire -lorsqu'on considère la compilation croisée. Lors d'une compilation croisée, -les dépendances listées dans @code{inputs} sont construites pour -l'architecture @emph{cible} ; inversement, les dépendances listées dans -@code{native-inputs} sont construites pour l'architecture de la machine de -@emph{construction}. +@lisp +(use-modules (guix inferior) (guix channels) + (srfi srfi-1)) ;pour « first » -@code{native-inputs} est typiquement utilisé pour lister les outils requis à -la construction mais pas à l'exécution, comme Autoconf, Automake, -pkg-config, Gettext ou Bison. @command{guix lint} peut rapporter des -erreurs de ce type (@pxref{Invoquer guix lint}). +(define channels + ;; L'ancienne révision depuis laquelle on veut + ;; extraire guile-json. + (list (channel + (name 'guix) + (url "https://git.savannah.gnu.org/git/guix.git") + (commit + "65956ad3526ba09e1f7a40722c96c6ef7c0936fe")))) -@anchor{package-propagated-inputs} -Enfin, @code{propagated-inputs} est similaire à @code{inputs}, mais les -paquets spécifiés seront automatiquement installés avec le paquet auquel ils -appartiennent (@pxref{package-cmd-propagated-inputs, @command{guix -package}}, pour des informations sur la manière dont @command{guix package} -traite les entrées propagées). +(define inferior + ;; Un inférieur représentant la révision ci-dessus. + (inferior-for-channels channels)) -Par exemple cela est nécessaire lorsque des bibliothèques C/C++ ont besoin -d'en-têtes d'une autre bibliothèque pour être compilé ou lorsqu'un fichier -pkg-config se rapporte à un autre @i{via} son champ @code{Requires}. +;; Maintenant on crée un manifeste avec le paquet « guile » actuel +;; et l'ancien paquet « guile-json ». +(packages->manifest + (list (first (lookup-inferior-packages inferior "guile-json")) + (specification->package "guile"))) +@end lisp -Un autre exemple où @code{propagated-inputs} est utile est pour les langages -auxquels il manque un moyen de retenir le chemin de recherche comme c'est le -cas du @code{RUNPATH} des fichiers ELF ; cela comprend Guile, Python, Perl -et plus. Pour s'assurer que les bibliothèques écrites dans ces langages -peuvent trouver le code des bibliothèques dont elles dépendent à -l'exécution, les dépendances à l'exécution doivent être listées dans -@code{propagated-inputs} plutôt que @code{inputs}. +Durant la première exécution, @command{guix package --manifest} pourrait +avoir besoin de construire le canal que vous avez spécifié avant de créer +l'inférieur ; les exécutions suivantes seront bien plus rapides parce que la +révision de Guix sera déjà en cache. -@item @code{self-native-input?} (par défaut : @code{#f}) -C'est un champ booléen qui indique si le paquet devrait s'utiliser lui-même -comme entrée native lors de la compilation croisée. +Le module @code{(guix inferior)} fournit les procédures suivantes pour +ouvrir un inférieur : -@item @code{outputs} (par défaut : @code{'("out")}) -La liste des noms de sorties du paquet. @xref{Des paquets avec plusieurs résultats}, pour des exemples typiques d'utilisation de sorties -supplémentaires. +@deffn {Procédure Scheme} inferior-for-channels @var{channels} @ + [#:cache-directory] [#:ttl] +Renvoie un inférieur pour @var{channels}, une liste de canaux. Elle utilise +le cache dans @var{cache-directory}, où les entrées peuvent être glanées +après @var{ttl} secondes. Cette procédure ouvre une nouvelle connexion au +démon de construction. -@item @code{native-search-paths} (par défaut : @code{'()}) -@itemx @code{search-paths} (par défaut : @code{'()}) -Une liste d'objets @code{search-path-specification} décrivant les variables -d'environnement de recherche de chemins que ce paquet utilise. +Elle a pour effet de bord de construire ou de substituer des binaires pour +@var{channels}, ce qui peut prendre du temps. +@end deffn -@item @code{replacement} (par défaut : @code{#f}) -Ce champ doit être soit @code{#f} soit un objet de paquet qui sera utilisé -comme @dfn{remplaçant} de ce paquet. @xref{Mises à jour de sécurité, grafts}, pour -plus de détails. +@deffn {Procédure Scheme} open-inferior @var{directory} @ + [#:command "bin/guix"] +Ouvre le Guix inférieur dans @var{directory} et lance +@code{@var{directory}/@var{command} repl} ou équivalent. Renvoie @code{#f} +si l'inférieur n'a pas pu être lancé. +@end deffn -@item @code{synopsis} -Une description sur une ligne du paquet. +@cindex paquets inférieurs +Les procédures listées plus bas vous permettent d'obtenir et de manipuler +des paquets inférieurs. -@item @code{description} -Une description plus détaillée du paquet. +@deffn {Procédure Scheme} inferior-packages @var{inferior} +Renvoie la liste des paquets connus de l'inférieur @var{inferior}. +@end deffn -@item @code{license} -@cindex licence, des paquets -La licence du paquet ; une valeur tirée de @code{(guix licenses)} ou une -liste de ces valeurs. +@deffn {Procédure Scheme} lookup-inferior-packages @var{inferior} @var{name} @ + [@var{version}] +Renvoie la liste triée des paquets inférieurs qui correspondent à @var{name} +dans @var{inferior}, avec le plus haut numéro de version en premier. Si +@var{version} est vrai, renvoie seulement les paquets avec un numéro de +version préfixé par @var{version}. +@end deffn -@item @code{home-page} -L'URL de la page d'accueil du paquet, en tant que chaîne de caractères. +@deffn {Procédure Scheme} inferior-package? @var{obj} +Renvoie vrai si @var{obj} est un paquet inférieur. +@end deffn -@item @code{supported-systems} (par défaut : @var{%supported-systems}) -La liste des systèmes supportés par le paquet, comme des chaînes de -caractères de la forme @code{architecture-noyau}, par exemple -@code{"x86_64-linux"}. +@deffn {Procédure Scheme} inferior-package-name @var{package} +@deffnx {Procédure Scheme} inferior-package-version @var{package} +@deffnx {Procédure Scheme} inferior-package-synopsis @var{package} +@deffnx {Procédure Scheme} inferior-package-description @var{package} +@deffnx {Procédure Scheme} inferior-package-home-page @var{package} +@deffnx {Procédure Scheme} inferior-package-location @var{package} +@deffnx {Procédure Scheme} inferior-package-inputs @var{package} +@deffnx {Procédure Scheme} inferior-package-native-inputs @var{package} +@deffnx {Procédure Scheme} inferior-package-propagated-inputs @var{package} +@deffnx {Procédure Scheme} inferior-package-transitive-propagated-inputs @var{package} +@deffnx {Procédure Scheme} inferior-package-native-search-paths @var{package} +@deffnx {Procédure Scheme} inferior-package-transitive-native-search-paths @var{package} +@deffnx {Procédure Scheme} inferior-package-search-paths @var{package} +Ces procédures sont la contrepartie des accesseurs des enregistrements de +paquets (@pxref{Référence de paquet}). La plupart fonctionne en effectuant +des requêtes à l'inférieur dont provient @var{package}, donc l'inférieur +doit toujours être disponible lorsque vous appelez ces procédures. +@end deffn -@item @code{maintainers} (par défaut : @code{'()}) -La liste des mainteneurs du paquet, comme des objets @code{maintainer}. +Les paquets inférieurs peuvent être utilisés de manière transparente comme +tout autre paquet ou objet simili-fichier dans des G-expressions +(@pxref{G-Expressions}). Ils sont aussi gérés de manière transparente par +la procédure @code{packages->manifest}, qui est typiquement utilisée dans +des manifestes (@pxref{Invoquer guix package, l'option @option{--manifest} +de @command{guix package}}). Ainsi, vous pouvez insérer un paquet inférieur +à peu près n'importe où vous utiliseriez un paquet normal : dans des +manifestes, dans le champ @code{packages} de votre déclaration +@code{operating-system}, etc. -@item @code{location} (par défaut : emplacement de la source de la forme @code{package}) -L'emplacement de la source du paquet. C'est utile de le remplacer lorsqu'on -hérite d'un autre paquet, auquel cas ce champ n'est pas automatiquement -corrigé. -@end table -@end deftp +@node Invoquer guix describe +@section Invoquer @command{guix describe} + +@cindex reproductibilité +@cindex répliquer Guix +Souvent vous voudrez répondre à des questions comme « quelle révision de +Guix j'utilise ? » ou « quels canaux est-ce que j'utilise ? ». C'est une +information utile dans de nombreuses situations : si vous voulez +@emph{répliquer} un environnement sur une machine différente ou un compte +utilisateur, si vous voulez rapporter un bogue ou pour déterminer quel +changement dans les canaux que vous utilisez l'a causé ou si vous voulez +enregistrer l'état de votre système pour le reproduire. La commande +@command{guix describe} répond à ces questions. +Lorsqu'elle est lancée depuis un @command{guix} mis à jour avec +@command{guix pull}, @command{guix describe} affiche les canaux qui ont été +construits, avec l'URL de leur dépôt et l'ID de leur commit +(@pxref{Canaux}) : -@node Référence d'origine -@subsection Référence de @code{origin} +@example +$ guix describe +Generation 10 03 sep. 2018 17:32:44 (actuelle) + guix e0fa68c + URL du dépôt : https://git.savannah.gnu.org/git/guix.git + branche : master + commit : e0fa68c7718fffd33d81af415279d6ddb518f727 +@end example -Cette section résume toutes les options disponibles dans le déclarations -@code{origin} (@pxref{Définition des paquets}). +Si vous connaissez bien le système de contrôle de version Git, cela +ressemble en essence à @command{git describe} ; la sortie est aussi +similaire à celle de @command{guix pull --list-generations}, mais limitée à +la génération actuelle (@pxref{Invoquer guix pull, l'option +@option{--list-generations}}). Comme l'ID de commit de Git ci-dessus se +réfère sans aucune ambiguïté à un instantané de Guix, cette information est +tout ce dont vous avez besoin pour décrire la révision de Guix que vous +utilisez et pour la répliquer. -@deftp {Type de données} origin -C'est le type de donnée qui représente l'origine d'un code source. +Pour rendre plus facile la réplication de Guix, @command{guix describe} peut +aussi renvoyer une liste de canaux plutôt que la description lisible par un +humain au-dessus : -@table @asis -@item @code{uri} -Un objet contenant l'URI de la source. Le type d'objet dépend de la -@code{method} (voir plus bas). Par exemple, avec la méthode @var{url-fetch} -de @code{(guix download)}, les valeurs valide d'@code{uri} sont : une URL -représentée par une chaîne de caractères, ou une liste de chaînes de -caractères. +@example +$ guix describe -f channels +(list (channel + (name 'guix) + (url "https://git.savannah.gnu.org/git/guix.git") + (commit + "e0fa68c7718fffd33d81af415279d6ddb518f727"))) +@end example -@item @code{method} -Un procédure qui gère l'URI. +@noindent +Vous pouvez sauvegarder ceci dans un fichier et le donner à @command{guix +pull -C} sur une autre machine ou plus tard, ce qui instantiera +@emph{exactement la même révision de Guix} (@pxref{Invoquer guix pull, +l'option @option{-C}}). À partir de là, comme vous pouvez déployer la même +révision de Guix, vous pouvez aussi bien @emph{répliquer un environnement +logiciel complet}. Nous pensons humblement que c'est @emph{génial}, et nous +espérons que vous aimerez ça aussi ! -Quelques exemples : +Voici les détails des options supportées par @command{guix describe} : -@table @asis -@item @var{url-fetch} de @code{(guix download)} -télécharge un fichier depuis l'URL HTTP, HTTPS ou FTP spécifiée dans le -champ @code{uri} ; +@table @code +@item --format=@var{format} +@itemx -f @var{format} +Produire la sortie dans le @var{format} donné, parmi : -@vindex git-fetch -@item @var{git-fetch} de @code{(guix git-download)} -clone le dépôt sous contrôle de version Git et récupère la révision -spécifiée dans le champ @code{uri} en tant qu'objet @code{git-reference} ; -un objet @code{git-reference} ressemble à cela : +@table @code +@item human +produire une sortie lisible par un humain, +@item canaux +produire une liste de spécifications de canaux qui peut être passée à +@command{guix pull -C} ou installée dans @file{~/.config/guix/channels.scm} +(@pxref{Invoquer guix pull}), +@item json +@cindex JSON +produire une liste de spécifications de canaux dans le format JSON, +@item recutils +produire une liste de spécifications de canaux dans le format Recutils. +@end table -@example -(git-reference - (url "git://git.debian.org/git/pkg-shadow/shadow") - (commit "v4.1.5.1")) -@end example +@item --profile=@var{profil} +@itemx -p @var{profil} +Afficher les informations sur le @var{profil}. @end table -@item @code{sha256} -Un bytevector contenant le hash SHA-256 de la source. Typiquement la forme -@code{base32} est utilisée ici pour générer le bytevector depuis une chaîne -de caractères en base-32. +@node Invoquer guix archive +@section Invoquer @command{guix archive} -Vous pouvez obtenir cette information avec @code{guix download} -(@pxref{Invoquer guix download}) ou @code{guix hash} (@pxref{Invoquer guix hash}). +@cindex @command{guix archive} +@cindex archive +La commande @command{guix archive} permet aux utilisateurs d'@dfn{exporter} +des fichiers du dépôt dans une simple archive puis ensuite de les +@dfn{importer} sur une machine qui fait tourner Guix. En particulier, elle +permet de transférer des fichiers du dépôt d'une machine vers le dépôt d'une +autre machine. -@item @code{file-name} (par défaut : @code{#f}) -Le nom de fichier à utiliser pour sauvegarder le fichier. Lorsqu'elle est à -@code{#f}, une valeur par défaut raisonnable est utilisée dans la plupart -des cas. Dans le cas où la source est récupérée depuis une URL, le nom de -fichier est celui de l'URL. Pour les sources récupérées depuis un outil de -contrôle de version, il est recommandé de fournir un nom de fichier -explicitement parce que le nom par défaut n'est pas très descriptif. +@quotation Remarque +Si vous chercher une manière de produire des archives dans un format adapté +pour des outils autres que Guix, @pxref{Invoquer guix pack}. +@end quotation -@item @code{patches} (par défaut : @code{'()}) -Une liste de noms de fichiers, d'origines ou d'objets simili-fichiers -(@pxref{G-Expressions, file-like objects}) qui pointent vers des correctifs -à appliquer sur la source. +@cindex exporter des éléments du dépôt +Pour exporter des fichiers du dépôt comme une archive sur la sortie +standard, lancez : -Cette liste de correctifs doit être inconditionnelle. En particulier, elle -ne peut pas dépendre des valeurs de @code{%current-system} ou -@code{%current-target-system}. +@example +guix archive --export @var{options} @var{spécifications}... +@end example -@item @code{snippet} (par défaut : @code{#f}) -Une G-expression (@pxref{G-Expressions}) ou une S-expression qui sera lancée -dans le répertoire des sources. C'est une manière pratique de modifier la -source, parfois plus qu'un correctif. +@var{spécifications} peut être soit des noms de fichiers soit des +spécifications de paquets, comme pour @command{guix package} +(@pxref{Invoquer guix package}). Par exemple, la commande suivante crée une +archive contenant la sortie @code{gui} du paquet @code{git} et la sortie +principale de @code{emacs} : -@item @code{patch-flags} (par défaut : @code{'("-p1")}) -Une liste de drapeaux à passer à la commande @code{patch}. +@example +guix archive --export git:gui /gnu/store/...-emacs-24.3 > great.nar +@end example -@item @code{patch-inputs} (par défaut : @code{#f}) -Paquets d'entrées ou dérivations pour le processus de correction. -Lorsqu'elle est à @code{#f}, l'ensemble d'entrées habituellement nécessaire -pour appliquer des correctifs est fournit, comme GNU@tie{}Patch. +Si les paquets spécifiés ne sont pas déjà construits, @command{guix archive} +les construit automatiquement. Le processus de construction peut être +contrôlé avec les options de construction communes (@pxref{Options de construction communes}). -@item @code{modules} (par défaut : @code{'()}) -Une liste de modules Guile qui devraient être chargés pendant le processus -de correction et pendant que le lancement du code du champ @code{snippet}. +Pour transférer le paquet @code{emacs} vers une machine connectée en SSH, on +pourrait lancer : -@item @code{patch-guile} (par défaut : @code{#f}) -Le paquet Guile à utiliser dans le processus de correction. Lorsqu'elle est -à @code{#f}, une valeur par défaut raisonnable est utilisée. -@end table -@end deftp +@example +guix archive --export -r emacs | ssh la-machine guix archive --import +@end example +@noindent +De même, on peut transférer un profil utilisateur complet d'une machine à +une autre comme cela : -@node Systèmes de construction -@section Systèmes de construction +@example +guix archive --export -r $(readlink -f ~/.guix-profile) | \ + ssh la-machine guix-archive --import +@end example -@cindex système de construction -Chaque définition de paquet définie un @dfn{système de construction} et des -arguments pour ce système de construction (@pxref{Définition des paquets}). Ce -champ @code{build-system} représente la procédure de construction du paquet, -ainsi que des dépendances implicites pour cette procédure de construction. +@noindent +Cependant, remarquez que, dans les deux exemples, le paquet @code{emacs}, le +profil ainsi que toutes leurs dépendances sont transférées (à cause de +@code{-r}), indépendamment du fait qu'ils soient disponibles dans le dépôt +de la machine cible. L'option @code{--missing} peut vous aider à comprendre +les éléments qui manquent dans le dépôt de la machine cible. La commande +@command{guix copy} simplifie et optimise ce processus, c'est donc ce que +vous devriez utiliser dans ce cas (@pxref{Invoquer guix copy}). -Les systèmes de construction sont des objets -@code{}. L'interface pour les créer et les manipuler est -fournie par le module @code{(guix build-system)} et les systèmes de -construction eux-mêmes sont exportés par des modules spécifiques. +@cindex nar, format d'archive +@cindex archive normalisée (nar) +Les archives sont stockées au format « archive normalisé » ou « nar », qui +est comparable dans l'esprit à « tar » mais avec des différences qui le +rendent utilisable pour ce qu'on veut faire. Tout d'abord, au lieu de +stocker toutes les métadonnées Unix de chaque fichier, le format nar ne +mentionne que le type de fichier (normal, répertoire ou lien symbolique) ; +les permissions Unix, le groupe et l'utilisateur ne sont pas mentionnés. +Ensuite, l'ordre dans lequel les entrées de répertoires sont stockés suit +toujours l'ordre des noms de fichier dans l'environnement linguistique C. +Cela rend la production des archives entièrement déterministe. -@cindex sac (représentation à bas-niveau des paquets) -Sous le capot, les systèmes de construction compilent d'abord des objets -paquets en @dfn{sacs}. Un @dfn{sac} est comme un paquet, mais avec moins de -décoration — en d'autres mots, un sac est une représentation à bas-niveau -d'un paquet, qui inclus toutes les entrées de ce paquet, dont certaines ont -été implicitement ajoutées par le système de construction. Cette -représentation intermédiaire est ensuite compilée en une dérivation -(@pxref{Dérivations}). +@c FIXME: Add xref to daemon doc about signatures. +Lors de l'export, le démon signe numériquement le contenu de l'archive et +cette signature est ajoutée à la fin du fichier. Lors de l'import, le démon +vérifie la signature et rejette l'import en cas de signature invalide ou si +la clef de signature n'est pas autorisée. -Les systèmes de construction acceptent une liste d'@dfn{arguments} -facultatifs. Dans les définitions de paquets, ils sont passés @i{via} le -champ @code{arguments} (@pxref{Définition des paquets}). Ce sont typiquement des -arguments par mot-clef (@pxref{Optional Arguments, keyword arguments in -Guile,, guile, GNU Guile Reference Manual}). La valeur de ces arguments est -habituellement évaluée dans la @dfn{strate de construction} — c.-à-d.@: par -un processus Guile lancé par le démon (@pxref{Dérivations}). +Les principales options sont : -Le système de construction principal est le @var{gnu-build-system} qui -implémente les procédures de construction standard pour les paquets GNU et -de nombreux autres. Il est fournit par le module @code{(guix build-system -gnu)}. +@table @code +@item --export +Exporter les fichiers ou les paquets du dépôt (voir plus bas). Écrire +l'archive résultante sur la sortie standard. -@defvr {Variable Scheme} gnu-build-system -@var{gnu-build-system} représente le système de construction GNU et ses -variantes (@pxref{Configuration, configuration and makefile conventions,, -standards, GNU Coding Standards}). +Les dépendances ne sont @emph{pas} incluses dans la sortie à moins que +@code{--recursive} ne soit passé. -@cindex phases de construction -En résumé, les paquets qui l'utilisent sont configurés, construits et -installés avec la séquence @code{./configure && make && make check && make -install} habituelle. En pratique, des étapes supplémentaires sont souvent -requises. Toutes ces étapes sont séparées dans des @dfn{phases} -différentes, notamment@footnote{Regardez les modules @code{(guix build -gnu-build-system)} pour plus de détails sur les phases de construction.}: +@item -r +@itemx --recursive +En combinaison avec @code{--export}, cette option demande à @command{guix +archive} d'inclure les dépendances des éléments donnés dans l'archive. +Ainsi, l'archive résultante est autonome : elle contient la closure des +éléments du dépôt exportés. -@table @code -@item unpack -Décompresse l'archive des sources et se déplace dans l'arborescence des -sources fraîchement extraites. Si la source est en fait un répertoire, le -copie dans l'arborescence de construction et entre dans ce répertoire. +@item --import +Lire une archive depuis l'entrée standard et importer les fichiers inclus +dans le dépôt. Annuler si l'archive a une signature invalide ou si elle est +signée par une clef publique qui ne se trouve pas dans le clefs autorisées +(voir @code{--authorize} plus bas.) -@item patch-source-shebangs -Corrige les shebangs (@code{#!}) rencontrés dans les fichiers pour qu'ils se -réfèrent aux bons noms de fichiers. Par exemple, elle change -@code{#!/bin/sh} en @code{#!/gnu/store/@dots{}-bash-4.3/bin/sh}. +@item --missing +Liste une liste de noms de fichiers du dépôt sur l'entrée standard, un par +ligne, et écrit sur l'entrée standard le sous-ensemble de ces fichiers qui +manquent dans le dépôt. -@item configure -Lance le script @code{configure} avec un certain nombre d'options par -défaut, comme @code{--prefix=/gnu/store/@dots{}}, ainsi que les options -spécifiées par l'argument @code{#:configure-flags}. +@item --generate-key[=@var{paramètres}] +@cindex signature, archives +Générer une nouvelle paire de clefs pour le démon. Cela est un prérequis +avant que les archives ne puissent être exportées avec @code{--export}. +Remarquez que cette opération prend généralement du temps parce qu'elle doit +récupère suffisamment d'entropie pour générer la paire de clefs. -@item build -Lance @code{make} avec la liste des drapeaux spécifiés avec -@code{#:make-flags}. Si l'argument @code{#:parallel-build?} est vrai (par -défaut), construit avec @code{make -j}. +La paire de clefs générée est typiquement stockée dans @file{/etc/guix}, +dans @file{signing-key.pub} (clef publique) et @file{signing-key.sec} (clef +privée, qui doit rester secrète). Lorsque @var{paramètres} est omis, une +clef ECDSA utilisant la courbe Ed25519 est générée ou pour les version de +libgcrypt avant 1.6.0, une clef RSA de 4096 bits. Autrement, +@var{paramètres} peut spécifier les paramètres @code{genkey} adaptés pour +libgcrypt (@pxref{General public-key related Functions, +@code{gcry_pk_genkey},, gcrypt, The Libgcrypt Reference Manual}). -@item check -Lance @code{make check}, ou une autre cible spécifiée par -@code{#:test-target}, à moins que @code{#:tests? #f} ne soit passé. Si -l'argument @code{#:parallel-tests?} est vrai (par défaut), lance @code{make -check -j}. +@item --authorize +@cindex autorisation, archives +Autoriser les imports signés par la clef publique passée sur l'entrée +standard. La clef publique doit être au « format avancé s-expression » — +c.-à-d.@: le même format que le fichier @file{signing-key.pub}. + +La liste des clefs autorisées est gardée dans un fichier modifiable par des +humains dans @file{/etc/guix/acl}. Le fichier contient des +@url{http://people.csail.mit.edu/rivest/Sexp.txt, « s-expressions au format +avancé »} et est structuré comme une liste de contrôle d'accès dans +l'@url{http://theworld.com/~cme/spki.txt, infrastructure à clefs publiques +simple (SPKI)}. + +@item --extract=@var{répertoire} +@itemx -x @var{répertoire} +Lit une archive à un seul élément telle que servie par un serveur de +substituts (@pxref{Substituts}) et l'extrait dans @var{répertoire}. C'est +une opération de bas niveau requise seulement dans de rares cas d'usage ; +voir plus loin. -@item install -Lance @code{make install} avec les drapeaux listés dans @code{#:make-flags}. +For example, the following command extracts the substitute for Emacs served +by @code{@value{SUBSTITUTE-SERVER}} to @file{/tmp/emacs}: -@item patch-shebangs -Corrige les shebangs des fichiers exécutables installés. +@example +$ wget -O - \ + https://@value{SUBSTITUTE-SERVER}/nar/@dots{}-emacs-24.5 \ + | bunzip2 | guix archive -x /tmp/emacs +@end example -@item strip -Nettoie les symboles de débogage dans les fichiers ELF (à moins que -@code{#:strip-binaries?} ne soit faux), les copie dans la sortie -@code{debug} lorsqu'elle est disponible (@pxref{Installer les fichiers de débogage}). -@end table +Les archives à un seul élément sont différentes des archives à plusieurs +éléments produites par @command{guix archive --export} ; elles contiennent +un seul élément du dépôt et elles n'embarquent @emph{pas} de signature. +Ainsi cette opération ne vérifie @emph{pas} de signature et sa sortie +devrait être considérée comme non sûre. -@vindex %standard-phases -Le module du côté du constructeur @code{(guix build gnu-build-system)} -définie @var{%standard-phases} comme la liste par défaut des phases de -construction. @var{%standard-phases} est une liste de paires de symboles -et de procédures, où la procédure implémente la phase en question. +Le but principal de cette opération est de faciliter l'inspection du contenu +des archives venant de serveurs auxquels on ne fait potentiellement pas +confiance. -La liste des phases utilisées par un paquet particulier peut être modifiée -avec le paramètre @code{#:phases}. Par exemple, en passant : +@end table -@example -#:phases (modify-phases %standard-phases (delete 'configure)) -@end example -signifie que toutes les procédures décrites plus haut seront utilisées, sauf -la phase @code{configure}. +@c ********************************************************************* +@node Development +@chapter Development -En plus, ce système de construction s'assure que l'environnement « standard -» pour les paquets GNU est disponible. Cela inclus des outils comme GCC, -libc, Coreutils, Bash, Make, Diffutils, grep et sed (voir le module -@code{(guix build-system gnu)} pour une liste complète). Nous les appelons -les @dfn{entrées implicites} d'un paquet parce que la définition du paquet -ne les mentionne pas. -@end defvr +@cindex software development +If you are a software developer, Guix provides tools that you should find +helpful---independently of the language you're developing in. This is what +this chapter is about. -D'autres objets @code{} sont définis pour supporter d'autres -conventions et outils utilisés par les paquets de logiciels libres. Ils -héritent de la plupart de @var{gnu-build-system} et diffèrent surtout dans -l'ensemble des entrées implicites ajoutées au processus de construction et -dans la liste des phases exécutées. Certains de ces systèmes de -construction sont listés ci-dessous. +The @command{guix environment} command provides a convenient way to set up +@dfn{development environments} containing all the dependencies and tools +necessary to work on the software package of your choice. The @command{guix +pack} command allows you to create @dfn{application bundles} that can be +easily distributed to users who do not run Guix. -@defvr {Variable Scheme} ant-build-system -Cette variable est exportée par @code{(guix build-system ant)}. Elle -implémente la procédure de construction pour les paquets Java qui peuvent -être construits avec @url{http://ant.apache.org/, l'outil de construction -Ant}. +@menu +* Invoquer guix environment:: Mettre en place des environnements de + développement. +* Invoquer guix pack:: Créer des lots de logiciels. +@end menu -Elle ajoute à la fois @code{ant} et the @dfn{kit de développement Java} -(JDK) fournit par le paquet @code{icedtea} à l'ensemble des entrées. Des -paquets différents peuvent être spécifiés avec les paramètres @code{#:ant} -et @code{#:jdk} respectivement. +@node Invoquer guix environment +@section Invoquer @command{guix environment} -Lorsque le paquet d'origine ne fournit pas de fichier de construction Ant -acceptable, le paramètre @code{#:jar-name} peut être utilisé pour générer un -fichier de construction Ant @file{build.xml} minimal, avec des tâches pour -construire l'archive jar spécifiée. Dans ce cas, le paramètre -@code{#:source-dir} peut être utilisé pour spécifier le sous-répertoire des -sources, par défaut « src ». +@cindex environnements de construction reproductibles +@cindex environnement de développement +@cindex @command{guix environment} +@cindex environnement de construction de paquets +Le but de @command{guix environment} est d'assister les hackers dans la +création d'environnements de développement reproductibles sans polluer leur +profil de paquets. L'outil @command{guix environment} prend un ou plusieurs +paquets, construit leurs entrées et crée un environnement shell pour pouvoir +les utiliser. -Le paramètre @code{#:main-class} peut être utilisé avec le fichier de -construction minimal pour spécifier la classe principale du jar. Cela rend -le fichier jar exécutable. Le paramètre @code{#:test-include} peut être -utilisé pour spécifier la liste des tests junit à lancer. Il vaut par -défaut @code{(list "**/*Test.java")}. Le paramètre @code{#:test-exclude} -peut être utilisé pour désactiver certains tests. Sa valeur par défaut est -@code{(list "**/Abstract*.java")}, parce que les classes abstraites ne -peuvent pas être utilisées comme des tests. +La syntaxe générale est : -Le paramètre @code{#:build-target} peut être utilisé pour spécifier la tâche -Ant qui devrait être lancée pendant la phase @code{build}. Par défaut la -tâche « jar » sera lancée. +@example +guix environment @var{options} @var{paquet}@dots{} +@end example -@end defvr +L'exemple suivant crée un nouveau shell préparé pour le développement de +GNU@tie{}Guile : -@defvr {Variable Scheme} android-ndk-build-system -@cindex Distribution android -@cindex système de construction Android NDK -Cette variable est exportée par @code{(guix build-system android-ndk)}. -Elle implémente une procédure de construction pour les paquets du NDK -Android (@i{native development kit}) avec des processus de construction -spécifiques à Guix. +@example +guix environment guile +@end example -Le système de construction suppose que les paquets installent leur interface -publique (les en-têtes) dans un sous-répertoire de « include » de la sortie -« out » et leurs bibliothèques dans le sous-répertoire « lib » de la sortie -« out ». +Si les dépendances requises ne sont pas déjà construites, @command{guix +environment} les construit automatiquement. L'environnement du nouveau +shell est une version améliorée de l'environnement dans lequel @command{guix +environment} a été lancé. Il contient les chemins de recherche nécessaires +à la construction du paquet donné en plus des variables d'environnement +existantes. Pour créer un environnement « pur », dans lequel les variables +d'environnement de départ ont été nettoyées, utilisez l'option +@code{--pure}@footnote{Les utilisateurs ajoutent parfois à tord des valeurs +supplémentaires dans les variables comme @code{PATH} dans leur +@file{~/.bashrc}. En conséquence, lorsque @code{guix environment} le lance, +Bash peut lire @file{~/.bashrc}, ce qui produit des « impuretés » dans ces +variables d'environnement. C'est une erreur de définir ces variables +d'environnement dans @file{.bashrc} ; à la place, elles devraient être +définie dans @file{.bash_profile}, qui est sourcé uniquement par les shells +de connexion. @xref{Bash Startup Files,,, bash, The GNU Bash Reference +Manual}, pour des détails sur les fichiers de démarrage de Bash.}. -Il est aussi supposé que l'union de toutes les dépendances d'un paquet n'a -pas de fichiers en conflit. +@vindex GUIX_ENVIRONMENT +@command{guix environment} définie la variable @code{GUIX_ENVIRONMENT} dans +le shell qu'il crée ; sa valeur est le nom de fichier du profil de cet +environnement. Cela permet aux utilisateur, disons, de définir un prompt +spécifique pour les environnement de développement dans leur @file{.bashrc} +(@pxref{Bash Startup Files,,, bash, The GNU Bash Reference Manual}) : -Pour l'instant, la compilation croisée n'est pas supportées — donc pour -l'instant les bibliothèques et les fichiers d'en-têtes sont supposés être -des outils de l'hôte. +@example +if [ -n "$GUIX_ENVIRONMENT" ] +then + export PS1="\u@@\h \w [dev]\$ " +fi +@end example -@end defvr +@noindent +...@: or to browse the profile: -@defvr {Variable Scheme} asdf-build-system/source -@defvrx {Variable Scheme} asdf-build-system/sbcl -@defvrx {Variable Scheme} asdf-build-system/ecl +@example +$ ls "$GUIX_ENVIRONMENT/bin" +@end example -Ces variables, exportées par @code{(guix build-system asdf)}, implémentent -les procédures de constructions pour les paquets en Common Lisp qui -utilisent @url{https://common-lisp.net/project/asdf/, ``ASDF''}. ASDF est -un dispositif de définition de systèmes pour les programmes et les -bibliothèques en Common Lisp. +En plus, plus d'un paquet peut être spécifié, auquel cas l'union des entrées +des paquets données est utilisée. Par exemple, la commande ci-dessous crée +un shell où toutes les dépendances de Guile et Emacs sont disponibles : -Le système @code{asdf-build-system/source} installe les paquets au format -source qui peuvent être chargés avec n'importe quelle implémentation de -common lisp, via ASDF. Les autres, comme @code{asdf-build-system/sbcl}, -installent des binaires au format qu'un implémentation particulière -comprend. Ces systèmes de constructions peuvent aussi être utilisés pour -produire des programmes exécutables ou des images lisp qui contiennent un -ensemble de paquets pré-chargés. +@example +guix environment guile emacs +@end example -Le système de construction utilise des conventions de nommage. Pour les -paquets binaires, le nom du paquet devrait être préfixé par l'implémentation -lisp, comme @code{sbcl-} pour @code{asdf-build-system/sbcl}. +Parfois, une session shell interactive est inutile. On peut invoquer une +commande arbitraire en plaçant le jeton @code{--} pour séparer la commande +du reste des arguments : -En plus, le paquet source correspondant devrait étiquetté avec la même -convention que les paquets python (voir @ref{Modules python}), avec le -préfixe @code{cl-}. +@example +guix environment guile -- make -j4 +@end example -Pour les paquets binaires, chaque système devrait être défini comme un -paquet Guix. Si un paquet @code{origine} contient plusieurs systèmes, on -peut créer des variantes du paquet pour construire tous les systèmes. Les -paquets sources, qui utilisent @code{asdf-build-system/source}, peuvent -contenir plusieurs systèmes. +Dans d'autres situations, il est plus pratique de spécifier la liste des +paquets requis dans l'environnement. Par exemple, la commande suivante +lance @command{python} dans un environnement contenant Python@tie{}2.7 et +NumPy : -Pour créer des programmes exécutables et des images, les procédures côté -construction @code{build-program} et @code{build-image} peuvent être -utilisées. Elles devraient être appelées dans une phase de construction -après la phase @code{create-symlinks} pour que le système qui vient d'être -construit puisse être utilisé dans l'image créée. @code{build-program} -requiert une liste d'expressions Common Lisp dans l'argument -@code{#:entry-program}. +@example +guix environment --ad-hoc python2-numpy python-2.7 -- python +@end example -Si le système n'est pas défini dans son propre fichier @code{.asd} du même -nom, alors le paramètre @code{#:asd-file} devrait être utilisé pour -spécifier dans quel fichier le système est défini. De plus, si le paquet -défini un système pour ses tests dans un fichier séparé, il sera chargé -avant que les tests ne soient lancés s'il est spécifié par le paramètre -@code{#:test-asd-file}. S'il n'est pas spécifié, les fichiers -@code{-tests.asd}, @code{-test.asd}, @code{tests.asd} et -@code{test.asd} seront testés. +En plus, on peut vouloir les dépendance d'un paquet et aussi des paquets +supplémentaires qui ne sont pas des dépendances à l'exécution ou à la +construction, mais qui sont utiles au développement tout de même. À cause +de cela, le drapeau @code{--ad-hoc} est positionnel. Les paquets qui +apparaissent avant @code{--ad-hoc} sont interprétés comme les paquets dont +les dépendances seront ajoutées à l'environnement. Les paquets qui +apparaissent après @code{--ad-hoc} sont interprétés comme les paquets à +ajouter à l'environnement directement. Par exemple, la commande suivante +crée un environnement de développement pour Guix avec les paquets Git et +strace en plus : -Si pour quelque raison que ce soit le paquet doit être nommé d'une manière -différente de ce que la convention de nommage suggère, le paramètre -@code{#:asd-system-name} peut être utilisé pour spécifier le nom du système. +@example +guix environment guix --ad-hoc git strace +@end example -@end defvr +Sometimes it is desirable to isolate the environment as much as possible, +for maximal purity and reproducibility. In particular, when using Guix on a +host distro that is not Guix System, it is desirable to prevent access to +@file{/usr/bin} and other system-wide resources from the development +environment. For example, the following command spawns a Guile REPL in a +``container'' where only the store and the current working directory are +mounted: -@defvr {Variable Scheme} cargo-build-system -@cindex Langage de programmation Rust -@cindex Cargo (système de construction Rust) -Cette variable est exportée par @code{(guix build-system cargo)}. Elle -supporte les construction de paquets avec Cargo, le système de construction -du @uref{https://www.rust-lang.org, langage de programmation Rust}. +@example +guix environment --ad-hoc --container guile -- guile +@end example -Dans sa phase @code{configure}, ce système de construction remplace les -dépendances spécifiées dans le fichier @file{Cargo.toml} par des paquets -Guix. La phase @code{install} installe les binaires et installe aussi le -code source et le fichier @file{Cargo.toml}. -@end defvr +@quotation Remarque +L'option @code{--container} requiert Linux-libre 3.19 ou supérieur. +@end quotation -@cindex Clojure (langage de programmation) -@cindex système de construction Clojure simple -@defvr {Variable Scheme} clojure-build-system -Cette variable est exportée par @code{(guix build-system clojure)}. Elle -implémente une procédure de construction des paquets simple qui utilise le -bon vieux @code{compile} de Clojure. La compilation croisée n'est pas -encore supportée. +Les options disponibles sont résumées ci-dessous. + +@table @code +@item --root=@var{fichier} +@itemx -r @var{fichier} +@cindex environnement persistent +@cindex racine du ramasse-miettes, pour les environnements +Fait de @var{fichier} un lien symbolique vers le profil de cet +environnement, et l'enregistre comme une racine du ramasse-miettes. -Elle ajoute @code{clojure}, @code{icedtea} et @code{zip} à l'ensemble des -entrées. Des paquets différents peuvent être spécifiés avec les paramètres -@code{#:clojure}, @code{#:jdk} et @code{#:zip}. +C'est utile si vous souhaitez protéger votre environnement du +ramasse-miettes, pour le rendre « persistent ». -Une liste de répertoires sources, de répertoires de tests et de noms de jar -peuvent être spécifiés avec les paramètres @code{#:source-dirs}, -@code{#:test-dirs} et @code{#:jar-names}. Le répertoire de construction est -la classe principale peuvent être spécifiés avec les paramètres -@code{#:compile-dir} et @code{#:main-class}. Les autres paramètres sont -documentés plus bas. +Lorsque cette option est omise, l'environnement n'est protégé du +ramasse-miettes que le temps de la session @command{guix environment}. Cela +signifie que la prochaine fois que vous créerez le même environnement, vous +pourriez avoir à reconstruire ou télécharger des paquets. @xref{Invoquer guix gc}, pour plus d'informations sur les racines du GC. -Ce système de construction est une extension de @var{ant-build-system}, mais -avec les phases suivantes modifiées : +@item --expression=@var{expr} +@itemx -e @var{expr} +Crée un environnement pour le paquet ou la liste de paquets en lesquels +s'évalue @var{expr}. -@table @code +Par exemple, lancer : -@item build -Cette phase appelle @code{compile} en Clojure pour compiler les fichiers -sources et lance @command{jar} pour créer les fichiers jar à partir des -fichiers sources et des fichiers compilés en suivant la liste d'inclusion et -d'exclusion spécifiées dans @code{#:aot-include} et @code{#:aot-exclude}. -La liste d'exclusion a la priorité sur la liste d'inclusion. Ces listes -consistent en des symboles représentant des bibliothèque Clojure ou le mot -clef spécial @code{#:all}, représentant toutes les bibliothèques Clojure -trouvées dans les répertoires des sources. Le paramètre -@code{#:omit-source?} décide si les sources devraient être incluses dans les -fichiers jar. +@example +guix environment -e '(@@ (gnu packages maths) petsc-openmpi)' +@end example -@item check -Cette phase lance les tests en suivant les liste d'inclusion et d'exclusion -spécifiées dans @code{#:test-include} et @code{#:test-exclude}. Leur -signification est analogue à celle de @code{#:aot-include} et -@code{#:aot-exclude}, sauf que le mot-clef spécial @code{#:all} signifie -maintenant toutes les bibliothèques Clojure trouvées dans les répertoires de -tests. Le paramètre @code{#:tests?} décide si les tests devraient être -lancés. +démarre un shell avec l'environnement pour cette variante spécifique du +paquet PETSc. -@item install -Cette phase installe tous les fichiers jar précédemment construits. -@end table +Lancer : -En dehors de cela, le système de construction contient aussi la phase -suivante : +@example +guix environment --ad-hoc -e '(@@ (gnu) %base-packages)' +@end example -@table @code +starts a shell with all the base system packages available. -@item install-doc -Cette phase installe tous les fichiers dans le répertoire de plus haut -niveau dont le nom correspond à @var{%doc-regex}. On peut spécifier une -regex différente avec le paramètre @code{#:doc-regex}. Tous les fichiers -(récursivement) dans les répertoires de documentations spécifiés dans -@code{#:doc-dirs} sont aussi installés. -@end table -@end defvr +Les commande au-dessus n'utilisent que les sorties par défaut des paquets +donnés. Pour choisir d'autres sorties, on peut spécifier des pairs : -@defvr {Variable Scheme} cmake-build-system -Cette variable est exportée par @code{(guix build-system cmake)}. Elle -implémente la procédure de construction des paquets qui utilisent -l'@url{http://www.cmake.org, outil de construction CMake}. +@example +guix environment --ad-hoc -e '(list (@@ (gnu packages bash) bash) "include")' +@end example -Elle ajoute automatiquement le paquet @code{cmake} à l'ensemble des -entrées. Le paquet utilisé peut être spécifié par le paramètre -@code{#:cmake}. +@item --load=@var{fichier} +@itemx -l @var{fichier} +Crée un environnement pour le paquet ou la liste de paquets en lesquels +@var{fichier} s'évalue. -Le paramètre @code{#:configure-flags} est pris comme une liste de drapeaux à -passer à la commande @command{cmake}. Le paramètre @code{#:build-type} -spécifie en termes abstrait les drapeaux passés au compilateur ; sa valeur -par défaut est @code{"RelWithDebInfo"} (ce qui veut dire « mode public avec -les informations de débogage » en plus court), ce qui signifie en gros que -le code sera compilé avec @code{-O2 -g} comme pour les paquets autoconf par -défaut. -@end defvr +Par exemple, @var{fichier} peut contenir une définition comme celle-ci +(@pxref{Définition des paquets}) : -@defvr {Variable Scheme} go-build-system -Cette variable est exportée par @code{(guix build-system go)}. Elle -implémente la procédure pour les paquets Go utilisant les -@url{https://golang.org/cmd/go/#hdr-Compile_packages_and_dependencies, -mécanismes de construction Go} standard. +@example +@verbatiminclude environment-gdb.scm +@end example -L'utilisateur doit fournir une valeur à la clef @code{#:import-path} et, -dans certains cas, @code{#:unpack-path}. Le -@url{https://golang.org/doc/code.html#ImportPaths, chemin d'import} -correspond au chemin dans le système de fichiers attendu par le script de -construction du paquet et les paquets qui s'y réfèrent et fournit une -manière unique de se référer à un paquet Go. Il est typiquement basé sur -une combinaison de l'URI du code source du paquet et d'une structure -hiérarchique du système de fichier. Dans certains cas, vous devrez extraire -le code source du paquet dans une structure de répertoires différente que -celle indiquée par le chemin d'import et @code{#:unpack-path} devrait être -utilisé dans ces cas-là. +@item --manifest=@var{fichier} +@itemx -m @var{fichier} +Crée un environnement pour les paquets contenus dans l'objet manifeste +renvoyé par le code Scheme dans @var{fichier}. -Les paquets qui fournissent des bibliothèques Go devraient être installées -avec leur code source. La clef @code{#:install-soruce?}, qui vaut @code{#t} -par défaut, contrôle l'installation du code source. Elle peut être mise à -@code{#f} pour les paquets qui ne fournissent que des fichiers exécutables. -@end defvr +C'est similaire à l'option de même nom de @command{guix package} +(@pxref{profile-manifest, @option{--manifest}}) et utilise les même fichiers +manifestes. -@defvr {Variable Scheme} glib-or-gtk-build-system -Cette variable est exportée par @code{(guix build-system glib-or-gtk)}. -Elle est conçue pour être utilisée par des paquets qui utilisent GLib ou -GTK+. +@item --ad-hoc +Inclut tous les paquets spécifiés dans l'environnement qui en résulte, comme +si un paquet @i{ad hoc} était spécifié, avec ces paquets comme entrées. +Cette option est utile pour créer un environnement rapidement sans avoir à +écrire une expression de paquet contenant les entrées désirées. -Ce système de construction ajoute les deux phases suivantes à celles -définies par @var{gnu-build-system} : +Par exemple la commande : -@table @code -@item glib-or-gtk-wrap -La phase @code{glib-or-gtk-wrap} s'assure que les programmes dans -@file{bin/} sont capable de trouver les « schemas » GLib et les -@uref{https://developer.gnome.org/gtk3/stable/gtk-running.html, modules -GTK+}. Ceci est fait en enveloppant les programmes dans des scripts de -lancement qui initialisent correctement les variables d'environnement -@code{XDG_DATA_DIRS} et @code{GTK_PATH}. +@example +guix environment --ad-hoc guile guile-sdl -- guile +@end example -Il est possible d'exclure des sorties spécifiques de ce processus -d'enveloppage en listant leur nom dans le paramètre -@code{#:glib-or-gtk-wrap-excluded-outputs}. C'est utile lorsqu'une sortie -est connue pour ne pas contenir de binaires GLib ou GTK+, et où l'enveloppe -ajouterait une dépendance inutile vers GLib et GTK+. +lance @command{guile} dans un environnement où Guile et Guile-SDDL sont +disponibles. -@item glib-or-gtk-compile-schemas -La phase @code{glib-or-gtk-compile-schemas} s'assure que tous les -@uref{https://developer.gnome.org/gio/stable/glib-compile-schemas.html, -schémas GSettings} de GLib sont compilés. La compilation est effectuée par -le programme @command{glib-compile-schemas}. Il est fournit par le paquet -@code{glib:bin} qui est automatiquement importé par le système de -construction. Le paquet @code{glib} qui fournit -@command{glib-compile-schemas} peut être spécifié avec le paramètre -@code{#:glib}. -@end table +Remarquez que cet exemple demande implicitement la sortie par défaut de +@code{guile} et @code{guile-sdl}, mais il est possible de demander une +sortie spécifique — p.@: ex.@: @code{glib:bin} demande la sortie @code{bin} +de @code{glib} (@pxref{Des paquets avec plusieurs résultats}). -Ces deux phases sont exécutées après la phase @code{install}. -@end defvr +Cette option peut être composée avec le comportement par défaut de +@command{guix environment}. Les paquets qui apparaissent avant +@code{--ad-hoc} sont interprétés comme les paquets dont les dépendances +seront ajoutées à l'environnement, le comportement par défaut. Les paquets +qui apparaissent après @code{--ad-hoc} sont interprétés comme les paquets à +ajouter à l'environnement directement. -@defvr {Variable Scheme} guile-build-system -Ce système de construction sert aux paquets Guile qui consistent -exclusivement en code Scheme et qui sont si simple qu'ils n'ont même pas un -makefile, sans parler d'un script @file{configure}. Il compile le code -Scheme en utilisant @command{guild compile} (@pxref{Compilation,,, guile, -GNU Guile Reference Manual}) et installe les fichiers @file{.scm} et -@file{.go} aux bons emplacements. Il installe aussi la documentation. +@item --pure +Unset existing environment variables when building the new environment, +except those specified with @option{--inherit} (see below.) This has the +effect of creating an environment in which search paths only contain package +inputs. -Ce système de construction supporte la compilation croisée en utilisant -l'option @code{--target} de @command{guild compile}. +@item --inherit=@var{regexp} +When used alongside @option{--pure}, inherit all the environment variables +matching @var{regexp}---in other words, put them on a ``white list'' of +environment variables that must be preserved. This option can be repeated +several times. -Les paquets construits avec @code{guile-build-system} doivent fournir un -paquet Guile dans leur champ @code{native-inputs}. -@end defvr +@example +guix environment --pure --inherit=^SLURM --ad-hoc openmpi @dots{} \ + -- mpirun @dots{} +@end example -@defvr {Variable Scheme} minify-build-system -Cette variable est exportée par @code{(guix build-system minify)}. Elle -implémente une procédure de minification pour des paquets JavaScript -simples. +This example runs @command{mpirun} in a context where the only environment +variables defined are @code{PATH}, environment variables whose name starts +with @code{SLURM}, as well as the usual ``precious'' variables (@code{HOME}, +@code{USER}, etc.) -Elle ajoute @code{uglify-js} à l'ensemble des entrées et l'utilise pour -compresser tous les fichiers JavaScript du répertoire @file{src}. Un -minifieur différent peut être spécifié avec le paramètre @code{#:uglify-js} -mais il est attendu que ce paquet écrive le code minifié sur la sortie -standard. +@item --search-paths +Affiche les définitions des variables d'environnement qui composent +l'environnement. -Lorsque les fichiers JavaScript d'entrée ne sont pas situés dans le -répertoire @file{src}, le paramètre @code{#:javascript-files} peut être -utilisé pour spécifier une liste de noms de fichiers à donner au minifieur. -@end defvr +@item --system=@var{système} +@itemx -s @var{système} +Essaye de construire pour @var{système} — p.@: ex.@: @code{i686-linux}. -@defvr {Variable Scheme} ocaml-build-system -Cette variable est exportée par @code{(guix build-system ocaml)}. Elle -implémente une procédure de construction pour les paquets -@uref{https://ocaml.org, OCaml} qui consiste à choisir le bon ensemble de -commande à lancer pour chaque paquet. Les paquets OCaml peuvent demander -des commandes diverses pour être construit. Ce système de construction en -essaye certaines. +@item --container +@itemx -C +@cindex conteneur +Lance @var{commande} dans un conteneur isolé. Le répertoire de travail +actuel en dehors du conteneur est monté dans le conteneur. En plus, à moins +de le changer avec @code{--user}, un répertoire personnel fictif est créé +pour correspondre à celui de l'utilisateur actuel et @file{/etc/passwd} est +configuré en conséquence. Le processus est lancé en tant que l'utilisateur +actuel en dehors du conteneur, mais a les privilèges root dans le contexte +du conteneur. -Lorsqu'un fichier @file{setup.ml} est présent dans le répertoire de plus -haut niveau, elle lancera @code{ocaml setup.ml -configure}, @code{ocaml -setup.ml -build} et @code{ocaml setup.ml -install}. Le système de -construction supposera que ces fichiers ont été générés par -@uref{http://oasis.forge.ocamlcore.org/, OASIS} et prendra soin -d'initialiser le préfixe et d'activer les tests s'ils ne sont pas -désactivés. Vous pouvez passer des drapeaux de configuration et de -consturction avec @code{#:configure-flags} et @code{#:build-flags}. La clef -@code{#:test-flags} peut être passée pour changer l'ensemble des drapeaux -utilisés pour activer les tests. La clef @code{#:use-make?} peut être -utilisée pour outrepasser ce système dans les phases de construction et -d'installation. +@item --network +@itemx -N +Pour les conteneurs, partage l'espace de nom du réseau avec le système +hôte. Les conteneurs créés sans cette option n'ont accès qu'à l'interface +de boucle locale. -Lorsque le paquet a un fichier @file{configure}, il est supposé qu'il s'agit -d'un script configure écrit à la main qui demande un format différent de -celui de @code{gnu-build-system}. Vous pouvez ajouter plus de drapeaux avec -la clef @code{#:configure-flags}. +@item --link-profile +@itemx -P +Pour les conteneurs, lie le profil de l'environnement à +@file{~/.guix-profile} dans le conteneur. C'est équivalent à lance la +commande @command{ln -s $GUIX_ENVIRONMENT ~/.guix-profile} dans le +conteneur. La liaison échouera et annulera l'environnement si le répertoire +existe déjà, ce qui sera sans doute le cas si @command{guix environment} est +invoqué dans le répertoire personnel de l'utilisateur. -Lorsque le paquet a un fichier @file{Makefile} (ou @code{#:use-make?} vaut -@code{#t}), il sera utilisé et plus de drapeaux peuvent être passés à la -construction et l'installation avec la clef @code{#:make-flags}. +Certains paquets sont configurés pour chercher des fichiers de configuration +et des données dans @code{~/.guix-profile}@footnote{Par exemple, le paquet +@code{fontconfig} inspecte @file{~/.guix-profile/share/fonts} pour trouver +des polices supplémentaires.} ; @code{--link-profile} permet à ces +programmes de se comporter comme attendu dans l'environnement. -Enfin, certains paquets n'ont pas ces fichiers mais utilisent un emplacement -plus ou moins standard pour leur système de construction. Dans ce cas, le -système de construction lancera @code{ocaml pkg/pkg.ml} ou -@code{pkg/build.ml} et prendra soin de fournir le chemin du module findlib -requis. Des drapeaux supplémentaires peuvent être passés via la clef -@code{#:bulid-flags}. L'installation se fait avec -@command{opam-installer}. Dans ce cas, le paquet @code{opam} doit être -ajouté au champ @code{native-inputs} de la définition du paquet. +@item --user=@var{utilisateur} +@itemx -u @var{utilisateur} +Pour les conteneurs, utilise le nom d'utilisateur @var{utilisateur} à la +place de l'utilisateur actuel. L'entrée générée dans @file{/etc/passwd} +dans le conteneur contiendra le nom @var{utilisateur} ; le répertoire +personnel sera @file{/home/UTILISATEUR} ; et aucune donnée GECOS ne sera +copiée. @var{utilisateur} n'a pas besoin d'exister sur le système. -Remarquez que la plupart des paquets OCaml supposent qu'ils seront installés -dans le même répertoire qu'OCaml, ce qui n'est pas ce que nous voulons faire -dans Guix. En particulier, ils installeront leurs fichiers @file{.so} dans -leur propre répertoire de module, ce qui est normalement correct puisqu'il -s'agit du répertoire du compilateur OCaml. Dans Guix en revanche, le -bibliothèques ne peuvent pas y être trouvées et on utilise -@code{CAML_LD_LIBRARY_PATH} à la place. Cette variable pointe vers -@file{lib/ocaml/site-lib/stubslibs} et c'est là où les bibliothèques -@file{.so} devraient être installées. -@end defvr +En plus, tous les chemins partagés ou exposés (voir @code{--share} et +@code{--expose} respectivement) dont la cible est dans le répertoire +personnel de l'utilisateur seront remontés relativement à +@file{/home/UTILISATEUR} ; cela comprend le montage automatique du +répertoire de travail actuel. -@defvr {Variable Scheme} python-build-system -Cette variable est exportée par @code{(guix build-system python)}. Elle -implémente la procédure de construction plus ou moins standarde utilisée -pour les paquets Python, qui consiste à lancer @code{python setup.py build} -puis @code{python setup.py install --prefix=/gnu/store/@dots{}}. +@example +# exposera les chemins comme /home/foo/wd, /home/foo/test et /home/foo/target +cd $HOME/wd +guix environment --container --user=foo \ + --expose=$HOME/test \ + --expose=/tmp/target=$HOME/target +@end example -Pour les paquets qui installent des programmes autonomes dans @code{bin/}, -elle prend soin d'envelopper ces binaires pour que leur variable -d'environnement @code{PYTHONPATH} pointe vers toutes les bibliothèques -Python dont ils dépendent. +Bien que cela limite la fuite de l'identité de l'utilisateur à travers le +chemin du répertoire personnel et des champs de l'utilisateur, ce n'est +qu'un composant utile pour une solution d'anonymisation ou de préservation +de la vie privée — pas une solution en elle-même. -Le paquet Python utilisé pour effectuer la construction peut être spécifié -avec le paramètre @code{#:python}. C'est une manière utile de forcer un -paquet à être construit avec une version particulière de l'interpréteur -python, ce qui peut être nécessaire si le paquet n'est compatible qu'avec -une version de l'interpréteur. +@item --expose=@var{source}[=@var{cible}] +Pour les conteneurs, expose le système de fichiers @var{source} du système +hôte comme un système de fichiers en lecture seule @var{cible} dans le +conteneur. Si @var{cible} n'est pas spécifiée, @var{source} est utilisé +comme point de montage dans le conteneur. -Par défaut Guix appelle @code{setup.py} sous le contrôle de -@code{setuptools}, comme le fait @command{pip}. Certains paquets ne sont -pas compatibles avec setuptools (et pip), ainsi vous pouvez désactiver cela -en mettant le paramètre @code{#:use-setuptools} à @code{#f}. -@end defvr +L'exemple ci-dessous crée un REPL Guile dans un conteneur dans lequel le +répertoire personnel de l'utilisateur est accessible en lecture-seule via le +répertoire @file{/exchange} : -@defvr {Variable Scheme} perl-build-system -Cette variable est exportée par @code{(guix build-system perl)}. Elle -implémente la procédure de construction standarde des paquets Perl, qui -consiste soit à lancer @code{perl Build.PL --prefix=/gnu/store/@dots{}}, -suivi de @code{Build} et @code{Build install} ; ou à lancer @code{perl -Makefile.PL PREFIX=/gnu/store/@dots{}}, suivi de @code{make} et @code{make -install}, en fonction de la présence de @code{Build.PL} ou -@code{Makefile.PL} dans la distribution du paquet. Le premier a la -préférence si @code{Build.PL} et @code{Makefile.PL} existent tous deux dans -la distribution du paquet. Cette préférence peut être inversée en -spécifiant @code{#t} pour le paramètre @code{#:make-maker?}. +@example +guix environment --container --expose=$HOME=/exchange --ad-hoc guile -- guile +@end example -L'invocation initiale de @code{perl Makefile.PL} ou @code{perl Build.PL} -passe les drapeaux spécifiés par le paramètre @code{#:make-maker-flags} ou -@code{#:module-build-flags}, respectivement. +@item --share=@var{source}[=@var{cible}] +Pour les conteneurs, partage le système de fichiers @var{source} du système +hôte comme un système de fichiers en lecture-écriture @var{cible} dans le +conteneur. Si @var{cible} n'est pas spécifiée, @var{source} est utilisée +comme point de montage dans le conteneur. -Le paquet Perl utilisé peut être spécifié avec @code{#:perl}. -@end defvr +L'exemple ci-dessous crée un REPL Guile dans un conteneur dans lequel le +répertoire personnel de l'utilisateur est accessible en lecture-écriture via +le répertoire @file{/exchange} : -@defvr {Variable Scheme} r-build-system -Cette variable est exportée par @code{(guix build-system r)}. Elle -implémente la procédure de construction utilisée par les paquets -@uref{http://r-project.org, R} qui consiste à lancer à peine plus que -@code{R CMD INSTALL --library=/gnu/store/@dots{}} dans un environnement où -@code{R_LIBS_SITE} contient les chemins de toutes les entrées R. Les tests -sont lancés après l'installation avec la fonction R -@code{tools::testInstalledPackage}. -@end defvr +@example +guix environment --container --share=$HOME=/exchange --ad-hoc guile -- guile +@end example +@end table -@defvr {Variable Scheme} texlive-build-system -Cette variable est exportée par @code{(guix build-system texlive)}. Elle -est utilisée pour construire des paquets TeX en mode batch avec le moteur -spécifié. Le système de construction initialise la variable -@code{TEXINPUTS} pour trouver tous les fichiers source TeX dans ses entrées. +@command{guix environment} also supports all of the common build options +that @command{guix build} supports (@pxref{Options de construction communes}) as well as +package transformation options (@pxref{Options de transformation de paquets}). -Par défaut, elle lance @code{luatex} sur tous les fichiers qui se terminent -par @code{ins}. Un moteur et un format différent peuvent être spécifiés -avec l'argument @code{#:tex-format}. Plusieurs cibles de constructions -peuvent être indiquées avec l'argument @code{#:build-targets} qui attend une -liste de noms de fichiers. Le système de construction ajoute uniquement -@code{texlive-bin} et @code{texlive-latex-base} (de @code{(gnu packages -tex)} à la liste des entrées. Les deux peuvent être remplacés avec les -arguments @code{#:texlive-bin} et @code{#:texlive-latex-base}, -respectivement. +@node Invoquer guix pack +@section Invoquer @command{guix pack} -Le paramètre @code{#:tex-directory} dit au système de construction où -installer les fichiers construit dans l'arbre texmf. -@end defvr +Parfois vous voulez passer un logiciel à des gens qui n'ont pas (encore !) +la chance d'utiliser Guix. Vous leur diriez bien de lancer @command{guix +package -i @var{quelque chose}} mais ce n'est pas possible dans ce cas. +C'est là que @command{guix pack} entre en jeu. -@defvr {Variable Scheme} ruby-build-system -Cette variable est exportée par @code{(guix build-system ruby)}. Elle -implémenter la procédure de construction RubyGems utilisée par les paquets -Ruby qui consiste à lancer @code{gem build} suivi de @code{gem install}. +@quotation Remarque +Si vous cherchez comment échanger des binaires entre des machines où Guix +est déjà installé, @pxref{Invoquer guix copy}, @ref{Invoquer guix publish}, +et @ref{Invoquer guix archive}. +@end quotation -Le champ @code{source} d'un paquet qui utilise ce système de construction -référence le plus souvent une archive gem, puisque c'est le format utilisé -par les développeurs Ruby quand ils publient leur logiciel. Le système de -construction décompresse l'archive gem, éventuellement en corrigeant les -sources, lance la suite de tests, recompresse la gemme et l'installe. En -plus, des répertoires et des archives peuvent être référencés pour permettre -de construire des gemmes qui n'ont pas été publiées depuis Git ou une -archive de sources traditionnelle. +@cindex pack +@cindex lot +@cindex lot d'applications +@cindex lot de logiciels +La commande @command{guix pack} crée un @dfn{pack} ou @dfn{lot de logiciels} +: elle crée une archive tar ou un autre type d'archive contenant les +binaires pour le logiciel qui vous intéresse ainsi que ses dépendances. +L'archive qui en résulte peut être utilisée sur toutes les machines qui +n'ont pas Guix et les gens peuvent lancer exactement les mêmes binaires que +ceux que vous avez avec Guix. Le pack lui-même est créé d'une manière +reproductible au bit près, pour que n'importe qui puisse vérifier qu'il +contient bien les résultats que vous prétendez proposer. -Le paquet Ruby utilisé peut être spécifié avec le paramètre @code{#:ruby}. -Une liste de drapeaux supplémentaires à passer à la commande @command{gem} -peut être spécifiée avec le paramètre @code{#:gem-flags}. -@end defvr +Par exemple, pour créer un lot contenant Guile, Emacs, Geiser et toutes +leurs dépendances, vous pouvez lancer : -@defvr {Variable Scheme} waf-build-system -Cette variable est exportée par @code{(guix build-system waf)}. Elle -implémente une procédure de construction autour du script @code{waf}. Les -phases usuelles — @code{configure}, @code{build} et @code{install} — sont -implémentée en passant leur nom en argument au script @code{waf}. +@example +$ guix pack guile emacs geiser +@dots{} +/gnu/store/@dots{}-pack.tar.gz +@end example -Le script @code{waf} est exécuté par l'interpréteur Python. Le paquet -Python utilisé pour lancer le script peut être spécifié avec le paramètre -@code{#:python}. -@end defvr +Le résultat ici est une archive tar contenant un répertoire +@file{/gnu/store} avec tous les paquets nécessaires. L'archive qui en +résulte contient un @dfn{profil} avec les trois paquets qui vous intéressent +; le profil est le même qui celui qui aurait été créé avec @command{guix +package -i}. C'est ce mécanisme qui est utilisé pour créer les archives tar +binaires indépendantes de Guix (@pxref{Installation binaire}). -@defvr {Variable Scheme} scons-build-system -Cette variable est exportée par @code{(guix build-system scons)}. Elle -implémente la procédure de construction utilisée par l'outil de construction -SCons. Ce système de construction lance @code{scons} pour construire le -paquet, @code{scons test} pour lancer les tests puis @code{scons install} -pour installer le paquet. +Les utilisateurs de ce pack devraient lancer +@file{/gnu/store/@dots{}-profile/bin/guile} pour lancer Guile, ce qui n'est +pas très pratique. Pour éviter cela, vous pouvez créer, disons, un lien +symbolique @file{/opt/gnu/bin} vers le profil : -On peut passer des drapeaux supplémentaires à @code{scons} en les spécifiant -avec le paramètre @code{#:scons-flags}. La version de python utilisée pour -lancer SCons peut être spécifiée en sélectionnant le paquet SCons approprié -avec le paramètre @code{#:scons}. -@end defvr +@example +guix pack -S /opt/gnu/bin=bin guile emacs geiser +@end example -@defvr {Variable Scheme} haskell-build-system -Cette variable est exportée par @code{(guix build-system haskell)}. Elle -implémente la procédure de construction Cabal utilisée par les paquets -Haskell, qui consiste à lancer @code{runhaskell Setup.hs configure ---prefix=/gnu/store/@dots{}} et @code{runhaskell Setup.hs build}. Plutôt -que d'installer le paquets en lançant @code{runhaskell Setup.hs install}, -pour éviter d'essayer d'enregistrer les bibliothèques dans le répertoire du -dépôt en lecture-seule du compilateur, le système de construction utilise -@code{runhaskell Setup.hs copy}, suivi de @code{runhaskell Setup.hs -register}. En plus, le système de construction génère la documentation du -paquet en lançant @code{runhaskell Setup.hs haddock}, à moins que -@code{#:haddock? #f} ne soit passé. Des paramètres facultatifs pour Haddock -peuvent être passés à l'aide du paramètre @code{#:haddock-flags}. Si le -fichier @code{Setup.hs} n'est pas trouvé, le système de construction -cherchera @code{Setup.lhs} à la place. +@noindent +De cette façon, les utilisateurs peuvent joyeusement taper +@file{/opt/gnu/bin/guile} et profiter. -Le compilateur Haskell utilisé peut être spécifié avec le paramètre -@code{#:haskell} qui a pour valeur par défaut @code{ghc}. -@end defvr +@cindex binaires repositionnables, avec @command{guix pack} +Et si le destinataire de votre pack n'a pas les privilèges root sur sa +machine, et ne peut donc pas le décompresser dans le système de fichiers +racine ? Dans ce cas, vous pourriez utiliser l'option @code{--relocatable} +(voir plus bas). Cette option produite des @dfn{binaire repositionnables}, +ce qui signifie qu'ils peuvent être placés n'importe où dans l'arborescence +du système de fichiers : dans l'exemple au-dessus, les utilisateurs peuvent +décompresser votre archive dans leur répertoire personnel et lancer +directement @file{./opt/gnu/bin/guile}. -@defvr {Variable Scheme} dub-build-system -Cette variable est exportée par @code{(guix build-system dub)}. Elle -implémente la procédure de construction Dub utilisée par les paquets D qui -consiste à lancer @code{dub build} et @code{dub run}. L'installation est -effectuée en copiant les fichiers manuellement. +@cindex Docker, construire une image avec guix pack +Autrement, vous pouvez produire un pack au format d'image Docker avec la +commande suivante : -Le compilateur D utilisé peut être spécifié avec le paramètre @code{#:ldc} -qui vaut par défaut @code{ldc}. -@end defvr +@example +guix pack -f docker guile emacs geiser +@end example + +@noindent +Le résultat est une archive tar qui peut être passée à la commande +@command{docker load}. Voir la +@uref{https://docs.docker.com/engine/reference/commandline/load/, +documentation de Docker} pour plus d'informations. -@defvr {Variable Scheme} emacs-build-system -Cette variable est exportée par @code{(guix build-system emacs)}. Elle -implémente une procédure d'installation similaire au système de gestion de -paquet d'Emacs lui-même (@pxref{Packages,,, emacs, The GNU Emacs Manual}). +@cindex Singularity, construire une image avec guix pack +@cindex SquashFS, construire une image avec guix pack +Autrement, vous pouvez produire une image SquashFS avec la commande suivante +: -Elle crée d'abord le fichier @code{@var{package}-autoloads.el}, puis compile -tous les fichiers Emacs Lisp en bytecode. Contrairement au système de -gestion de paquets d'Emacs, les fichiers de documentation info sont déplacés -dans le répertoire standard et le fichier @file{dir} est supprimé. Chaque -paquet est installé dans son propre répertoire dans -@file{share/emacs/site-lisp/guix.d}. -@end defvr +@example +guix pack -f squashfs guile emacs geiser +@end example -@defvr {Variable Scheme} font-build-system -This variable is exported by @code{(guix build-system font)}. It implements -an installation procedure for font packages where upstream provides -pre-compiled TrueType, OpenType, etc.@: font files that merely need to be -copied into place. It copies font files to standard locations in the output -directory. -@end defvr +@noindent +Le résultat est une image de système de fichiers SquashFS qui peut soit être +montée directement soit être utilisée comme image de conteneur de système de +fichiers avec l'@uref{http://singularity.lbl.gov, environnement d'exécution +conteneurisé Singularity}, avec des commandes comme @command{singularity +shell} ou @command{singularity exec}. -@defvr {Variable Scheme} meson-build-system -Cette variable est exportée par @code{(guix build-system meson)}. Elle -implémente la procédure de construction des paquets qui utilisent -@url{http://mesonbuild.com, Meson} comme système de construction. +Diverses options en ligne de commande vous permettent de personnaliser votre +pack : -Elle ajoute à la fois Meson et @uref{https://ninja-build.org/, Ninja} à -l'ensemble des entrées, et ils peuvent être modifiés avec les paramètres -@code{#:meson} et @code{#:ninja} si requis. Le Meson par défaut est -@code{meson-for-build}, qui est spécial parce qu'il ne nettoie pas le -@code{RUNPATH} des binaires et les bibliothèques qu'il installe. +@table @code +@item --format=@var{format} +@itemx -f @var{format} +Produire un pack dans le @var{format} donné. -Ce système de construction est une extension de @var{gnu-build-system}, mais -avec les phases suivantes modifiées pour Meson : +Les formats disponibles sont : @table @code +@item tarball +C'est le format par défaut. Il produit une archive tar contenant tous les +binaires et les liens symboliques spécifiés. -@item configure -La phase lance @code{meson} avec les drapeaux spécifiés dans -@code{#:configure-flags}. Le drapeau @code{--build-type} est toujours -initialisé à @code{plain} à moins que quelque chose d'autre ne soit spécifié -dans @code{#:build-type}. +@item docker +Cela produit une archive tar qui suit la +@uref{https://github.com/docker/docker/blob/master/image/spec/v1.2.md, +spécification des images Docker}. -@item build -La phase lance @code{ninja} pour construire le paquet en parallèle par -défaut, mais cela peut être changé avec @code{#:parallel-build?}. +@item squashfs +Cela produit une image SquashFS contenant tous les binaires et liens +symboliques spécifiés, ainsi que des points de montages vides pour les +systèmes de fichiers virtuels comme procfs. +@end table -@item check -La phase lance @code{ninja} avec la cible spécifiée dans -@code{#:test-target}, qui est @code{"test"} par défaut. +@item --relocatable +@itemx -R +Produit des @dfn{binaires repositionnables} — c.-à-d.@: des binaires que +vous pouvez placer n'importe où dans l'arborescence du système de fichiers +et les lancer à partir de là. Par exemple, si vous créez un pack contenant +Bash avec : -@item install -La phase lance @code{ninja install} et ne peut pas être changée. -@end table +@example +guix pack -R -S /mybin=bin bash +@end example -En dehors de cela, le système de construction ajoute aussi la phase suivante -: +@noindent +...@: you can copy that pack to a machine that lacks Guix, and from your +home directory as a normal user, run: -@table @code +@example +tar xf pack.tar.gz +./mybin/sh +@end example -@item fix-runpath -Cette phase s'assure que tous les binaire peuvent trouver les bibliothèques -dont ils ont besoin. Elle cherche les bibliothèques requises dans les -sous-répertoires du paquet en construction et les ajoute au @code{RUNPATH} -là où c'est nécessaire. Elle supprime aussi les références aux -bibliothèques laissées là par la phase de construction par -@code{meson-for-build} comme les dépendances des tests, qui ne sont pas -vraiment requises pour le programme. +@noindent +Dans ce shell, si vous tapez @code{ls /gnu/store}, vous remarquerez que +@file{/gnu/store} apparaît et contient toutes les dépendances de +@code{bash}, même si la machine n'a pas du tout de @file{/gnu/store} ! +C'est sans doute la manière la plus simple de déployer du logiciel construit +avec Guix sur une machine sans Guix. -@item glib-or-gtk-wrap -Cette phase est la phase fournie par @code{glib-or-gtk-build-system} et -n'est pas activée par défaut. Elle peut l'être avec @code{#:glib-or-gtk?}. +Il y a un inconvénient cependant : cette technique repose sur les +@dfn{espaces de noms} du noyau Linux qui permettent à des utilisateurs +non-privilégiés de monter des systèmes de fichiers ou de changer de racine. +Les anciennes versions de Linux ne le supportaient pas et certaines +distributions GNU/Linux les désactivent ; sur ces système, les programme du +pack @emph{ne fonctionneront pas} à moins qu'ils ne soient décompressés à la +racine du système de fichiers. -@item glib-or-gtk-compile-schemas -Cette phase est la phase fournie par @code{glib-or-gtk-build-system} et -n'est pas activée par défaut. Elle peut l'être avec @code{#:glib-or-gtk?}. -@end table -@end defvr +@item --expression=@var{expr} +@itemx -e @var{expr} +Considérer le paquet évalué par @var{expr}. -Enfin, pour les paquets qui n'ont pas besoin de choses sophistiquées, un -système de construction « trivial » est disponible. Il est trivial dans le -sens où il ne fournit en gros aucun support : il n'apporte pas de dépendance -implicite, et n'a pas de notion de phase de construction. +Cela a le même but que l'option de même nom de @command{guix build} +(@pxref{Options de construction supplémentaires, @code{--expression} dans @command{guix +build}}). -@defvr {Variable Scheme} trivial-build-system -Cette variable est exportée par @code{(guix build-system trivial)}. +@item --manifest=@var{fichier} +@itemx -m @var{fichier} +Utiliser les paquets contenus dans l'objet manifeste renvoyé par le code +Scheme dans @var{fichier} -Ce système de construction requiert un argument @code{#:builder}. Cet -argument doit être une expression Scheme qui construit la sortie du paquet — -comme avec @code{build-expression->derivation} (@pxref{Dérivations, -@code{build-expression->derivation}}). -@end defvr +Elle a un but similaire à l'option de même nom dans @command{guix package} +(@pxref{profile-manifest, @option{--manifest}}) et utilise les mêmes +fichiers manifeste. Ils vous permettent de définir une collection de +paquets une fois et de l'utiliser aussi bien pour créer des profils que pour +créer des archives pour des machines qui n'ont pas Guix d'installé. +Remarquez que vous pouvez spécifier @emph{soit} un fichier manifeste, +@emph{soit} une liste de paquet, mais pas les deux. -@node Le dépôt -@section Le dépôt +@item --system=@var{système} +@itemx -s @var{système} +Tenter de construire pour le @var{système} — p.@: ex.@: @code{i686-linux} — +plutôt que pour le type de système de l'hôte de construction. -@cindex dépôt -@cindex éléments du dépôt -@cindex chemins dans le dépôt +@item --target=@var{triplet} +@cindex compilation croisée +Effectuer une compilation croisée pour @var{triplet} qui doit être un +triplet GNU valide, comme @code{"mips64el-linux-gnu"} (@pxref{Specifying +target triplets, GNU configuration triplets,, autoconf, Autoconf}). -Conceptuellement, le @dfn{dépôt} est l'endroit où les dérivations qui ont -bien été construites sont stockées — par défaut, @file{/gnu/store}. Les -sous-répertoires dans le dépôt s'appellent des @dfn{éléments du dépôt} ou -parfois des @dfn{chemins du dépôt}. Le dépôt a une base de données associée -qui contient des informations comme les chemins du dépôt auxquels se -réfèrent chaque chemin du dépôt et la liste des éléments du dépôt -@emph{valides} — les résultats d'une construction réussie. Cette base de -données se trouve dans @file{@var{localstatedir}/guix/db} où -@var{localstatedir} est le répertoire d'états spécifié @i{via} @option -{--localstatedir} à la configuration, typiquement @file{/var}. +@item --compression=@var{outil} +@itemx -C @var{outil} +Compresser l'archive résultante avec @var{outil} — l'un des outils parmi +@code{bzip2}, @code{xz}, @code{lzip} ou @code{none} pour aucune compression. -C'est @emph{toujours} le démon qui accède au dépôt pour le compte de ses -clients (@pxref{Invoquer guix-daemon}). Pour manipuler le dépôt, les -clients se connectent au démon par un socket Unix-domain, envoient une -requête dessus et lisent le résultat — ce sont des appels de procédures -distantes, ou RPC. +@item --symlink=@var{spec} +@itemx -S @var{spec} +Ajouter les liens symboliques spécifiés par @var{spec} dans le pack. Cette +option peut apparaître plusieurs fois. -@quotation Remarque -Les utilisateurs ne doivent @emph{jamais} modifier les fichiers dans -@file{/gnu/store} directement. Cela entraînerait des incohérences et -casserait l'hypothèse d'immutabilité du modèle fonctionnel de Guix -(@pxref{Introduction}). +@var{spec} a la forme @code{@var{source}=@var{cible}}, où @var{source} est +le lien symbolique qui sera créé et @var{cible} est la cible du lien. -@xref{Invoquer guix gc, @command{guix gc --verify}}, pour des informations -sur la manière de vérifier l'intégrité du dépôt et d'essayer de réparer des -modifications accidentelles. -@end quotation +Par exemple, @code{-S /opt/gnu/bin=bin} crée un lien symbolique +@file{/opt/gnu/bin} qui pointe vers le sous-répertoire @file{bin} du profil. -Le module @code{(guix store)} fournit des procédures pour se connecter au -démon et pour effectuer des RPC. Elles sont décrites plus bas. Par défaut, -@code{open-connection}, et donc toutes les commandes @command{guix} se -connectent au démon local ou à l'URI spécifiée par la variable -d'environnement @code{GUIX_DAEMON_SOCKET}. +@item --localstatedir +@itemx --profile-name=@var{nom} +Inclus le « répertoire d'état local », @file{/var/guix}, dans le lot qui en +résulte, et notamment le profil +@file{/var/guix/profiles/per-user/root/@var{nom}} — par défaut @var{nom} est +@code{guix-profile}, ce qui correspond à @file{~root/.guix-profile}. -@defvr {Variable d'environnement} GUIX_DAEMON_SOCKET -Lorsqu'elle est initialisée, la valeur de cette variable devrait être un nom -de fichier ou une URI qui désigne l'extrémité du démon. Lorsque c'est un -nom de fichier, il dénote un socket Unix-domain où se connecter. En plus -des noms de fichiers, les schémas d'URI supportés sont : +@file{/var/guix} contient la base de données du dépôt (@pxref{Le dépôt}) +ainsi que les racines du ramasse-miettes (@pxref{Invoquer guix gc}). Le +fournir dans le pack signifie que le dépôt et « complet » et gérable par +Guix ; ne pas le fournir dans le pack signifie que le dépôt est « mort » : +aucun élément ne peut être ajouté ni enlevé après l'extraction du pack. -@table @code -@item file -@itemx unix -Pour les sockets Unix-domain. @code{file:///var/guix/daemon-socket/socket} -est équivalent à @file{/var/guix/daemon-socket/socket}. +Un cas d'utilisation est l'archive binaire indépendante de Guix +(@pxref{Installation binaire}). -@item guix -@cindex démon, accès distant -@cindex accès distant au démon -@cindex démon, paramètres de grappes -@cindex grappes, paramètres du démon -Ces URI dénotent des connexions par TCP/IP, sans chiffrement ni -authentification de l'hôte distant. L'URI doit spécifier le nom d'hôte et -éventuellement un numéro de port (par défaut 44146) : +@item --bootstrap +Utiliser les programmes d'amorçage pour construire le pack. Cette option +n'est utile que pour les développeurs de Guix. +@end table -@example -guix://master.guix.example.org:1234 -@end example +En plus, @command{guix pack} supporte toutes les options de construction +communes (@pxref{Options de construction communes}) et toutes les options de +transformation de paquets (@pxref{Options de transformation de paquets}). + + +@c ********************************************************************* +@node Interface de programmation +@chapter Interface de programmation + +GNU Guix fournit diverses interface de programmation Scheme (API) qui pour +définir, construire et faire des requêtes sur des paquets. La première +interface permet aux utilisateurs d'écrire des définitions de paquets de +haut-niveau. Ces définitions se réfèrent à des concepts de création de +paquets familiers, comme le nom et la version du paquet, son système de +construction et ses dépendances. Ces définitions peuvent ensuite être +transformées en actions concrètes lors de la construction. -Ce paramétrage est adapté aux réseaux locaux, comme dans le cas de grappes -de serveurs, où seuls des noms de confiance peuvent se connecter au démon de -construction sur @code{master.guix.example.org}. +Les actions de construction sont effectuées par le démon Guix, pour le +compte des utilisateurs. Dans un environnement standard, le démon possède +les droits en écriture sur le dépôt — le répertoire @file{/gnu/store} — mais +pas les utilisateurs. La configuration recommandée permet aussi au démon +d'effectuer la construction dans des chroots, avec un utilisateur de +construction spécifique pour minimiser les interférences avec le reste du +système. -L'option @code{--listen} de @command{guix-daemon} peut être utilisé pour lui -dire d'écouter des connexions TCP (@pxref{Invoquer guix-daemon, -@code{--listen}}). +@cindex dérivation +Il y a des API de plus bas niveau pour interagir avec le démon et le dépôt. +Pour demander au démon d'effectuer une action de construction, les +utilisateurs lui donnent en fait une @dfn{dérivation}. Une dérivation est +une représentation à bas-niveau des actions de construction à entreprendre +et l'environnement dans lequel elles devraient avoir lieu — les dérivations +sont aux définitions de paquets ce que l'assembleur est aux programmes C. +Le terme de « dérivation » vient du fait que les résultats de la +construction en @emph{dérivent}. -@item ssh -@cindex accès SSH au démon de construction -Ces URI vous permettent de vous connecter au démon à distance à travers -SSH@footnote{Cette fonctionnalité requiert Guile-SSH -(@pxref{Prérequis}).}. +Ce chapitre décrit toutes ces API tour à tour, à partir des définitions de +paquets à haut-niveau. -@example -ssh://charlie@@guix.example.org:22 -@end example +@menu +* Modules de paquets:: Les paquets du point de vu du programmeur. +* Définition des paquets:: Définir de nouveaux paquets. +* Systèmes de construction:: Spécifier comment construire les paquets. +* Le dépôt:: Manipuler le dépôt de paquets. +* Dérivations:: Interface de bas-niveau avec les dérivations + de paquets. +* La monade du dépôt:: Interface purement fonctionnelle avec le + dépôt. +* G-Expressions:: Manipuler les expressions de construction. +* Invoquer guix repl:: S'amuser avec Guix de manière interactive. +@end menu -Comme pour @command{guix copy}, les fichiers de configuration du client -OpenSSH sont respectés (@pxref{Invoquer guix copy}). -@end table +@node Modules de paquets +@section Modules de paquets -Des schémas d'URI supplémentaires pourraient être supportés dans le futur. +D'un point de vue programmatique, les définitions de paquets de la +distribution GNU sont fournies par des modules Guile dans l'espace de noms +@code{(gnu packages @dots{})}@footnote{Remarquez que les paquets sous +l'espace de nom @code{(gnu packages @dots{})} ne sont pas nécessairement des +« paquets GNU ». Le nom de ce module suit la convention de nommage usuelle +de Guile : @code{gnu} signifie que ces modules sont distribués dans le +système GNU, et @code{packages} identifie les modules qui définissent les +paquets.} (@pxref{Modules, Guile modules,, guile, GNU Guile Reference +Manual}). Par exemple, le module @code{(gnu packages emacs)} exporte une +variable nommée @code{emacs}, qui est liée à un objet @code{} +(@pxref{Définition des paquets}). + +L'espace de nom @code{(gnu packages @dots{})} est automatiquement scanné par +les outils en ligne de commande. Par exemple, lorsque vous lancez +@code{guix package -i emacs}, tous les modules @code{(gnu packages @dots{})} +sont scannés jusqu'à en trouver un qui exporte un objet de paquet dont le +nom est @code{emacs}. Cette capacité à chercher des paquets est implémentée +dans le module @code{(gnu packages)}. -@c XXX: Remove this note when the protocol incurs fewer round trips -@c and when (guix derivations) no longer relies on file system access. -@quotation Remarque -La capacité de se connecter à un démon de construction distant est considéré -comme expérimental à la version @value{VERSION}. Contactez-nous pour -partager vos problèmes ou des suggestions que vous pourriez avoir -(@pxref{Contribuer}). -@end quotation -@end defvr +@cindex personnalisation, des paquets +@cindex chemin de recherche des modules de paquets +Les utilisateurs peuvent stocker des définitions dans des modules avec des +noms différents — p.@: ex.@: @code{(my-packages emacs)}@footnote{Remarquez +que le nom de fichier et de module doivent être identiques. Par exemple, le +module @code{(my-packages emacs)} doit être stocké dans un fichier +@file{my-packages/emacs.scm} relativement au chemin de chargement spécifié +avec @option{--load-path} ou @code{GUIX_PACKAGE_PATH}. @xref{Modules and +the File System,,, guile, GNU Guile Reference Manual} pour plus de +détails}. Il y a deux manières de rendre ces définitions visibles aux +interfaces utilisateurs : -@deffn {Procédure Scheme} open-connection [@var{uri}] [#:reserve-space? #t] -Se connecte au démon à travers le socket Unix-domain à @var{uri} (une chaîne -de caractères). Lorsque @var{reserve-space?} est vrai, cela demande de -réserver un peu de place supplémentaire sur le système de fichiers pour que -le ramasse-miette puisse opérer au cas où le disque serait plein. Renvoie -un objet serveur. +@enumerate +@item +En ajoutant le répertoire contenant vos modules de paquets au chemin de +recherche avec le drapeau @code{-L} de @command{guix package} et des autres +commandes (@pxref{Options de construction communes}) ou en indiquant la variable +d'environnement @code{GUIX_PACKAGE_PATH} décrite plus bas. -@var{file} a pour valeur par défaut @var{%default-socket-path}, qui est -l'emplacement normal en fonction des options données à @command{configure}. -@end deffn +@item +En définissant un @dfn{canal} et en configurant @command{guix pull} pour +qu'il l'utilise. Un canal est essentiellement un dépôt Git contenant des +modules de paquets. @xref{Canaux}, pour plus d'informations sur comment +définir et utiliser des canaux. +@end enumerate -@deffn {Procédure Scheme} close-connection @var{server} -Ferme la connexion au @var{serveur}. -@end deffn +@code{GUIX_PACKAGE_PATH} fonctionne comme les autres variables de chemins de +recherche : -@defvr {Variable Scheme} current-build-output-port -Cette variable est liée à un paramètre SRFI-39, qui se réfère au port où les -journaux de construction et d'erreur envoyés par le démon devraient être -écrits. +@defvr {Variable d'environnement} GUIX_PACKAGE_PATH +C'est une liste séparée par des deux-points de répertoires dans lesquels +trouver des modules de paquets supplémentaires. Les répertoires listés dans +cette variable sont prioritaires par rapport aux paquets de la distribution. @end defvr -Les procédures qui font des RPC prennent toutes un objet serveur comme -premier argument. +La distribution est entièrement @dfn{bootstrappée} et @dfn{auto-contenue} : +chaque paquet est construit uniquement à partir d'autres paquets de la +distribution. La racine de ce graphe de dépendance est un petit ensemble de +@dfn{binaires de bootstrap} fournis par le module @code{(gnu packages +bootstrap)}. Pour plus d'informations sur le bootstrap, +@pxref{Bootstrapping}. -@deffn {Procédure Scheme} valid-path? @var{server} @var{path} -@cindex éléments du dépôt invalides -Renvoie @code{#t} lorsque @var{path} désigne un élément du dépôt valide et -@code{#f} sinon (un élément invalide peut exister sur le disque mais rester -invalide, par exemple parce que c'est le résultat d'une construction annulée -ou échouée). +@node Définition des paquets +@section Définition des paquets -Une condition @code{&nix-protocol-error} est levée si @var{path} n'est pas -préfixée par le répertoire du dépôt (@file{/gnu/store}). -@end deffn +L'interface de haut-niveau pour les définitions de paquets est implémentée +dans les modules @code{(guix packages)} et @code{(guix build-system)}. Par +exemple, la définition du paquet, ou la @dfn{recette}, du paquet GNU Hello +ressemble à cela : -@deffn {Procédure Scheme} add-text-to-store @var{server} @var{name} @var{text} [@var{references}] -Ajoute @var{text} dans le fichier @var{name} dans le dépôt et renvoie son -chemin. @var{references} est la liste des chemins du dépôt référencés par -le chemin du dépôt qui en résulte. -@end deffn +@example +(define-module (gnu packages hello) + #:use-module (guix packages) + #:use-module (guix download) + #:use-module (guix build-system gnu) + #:use-module (guix licenses) + #:use-module (gnu packages gawk)) -@deffn {Procédure Scheme} build-derivations @var{server} @var{derivations} -Construit @var{derivaton} (ne liste d'objets @code{} ou de -chemins de dérivations) et retourne quand le travailleur a fini de les -construire. Renvoie @code{#t} en cas de réussite. -@end deffn +(define-public hello + (package + (name "hello") + (version "2.10") + (source (origin + (method url-fetch) + (uri (string-append "mirror://gnu/hello/hello-" version + ".tar.gz")) + (sha256 + (base32 + "0ssi1wpaf7plaswqqjwigppsg5fyh99vdlb9kzl7c9lng89ndq1i")))) + (build-system gnu-build-system) + (arguments '(#:configure-flags '("--enable-silent-rules"))) + (inputs `(("gawk" ,gawk))) + (synopsis "Hello, GNU world: An example GNU package") + (description "Guess what GNU Hello prints!") + (home-page "http://www.gnu.org/software/hello/") + (license gpl3+))) +@end example -Remarque que le module @code{(guix monads)} fournit une monad ainsi que des -version monadiques des procédures précédentes, avec le but de rendre plus -facile de travailler avec le code qui accède au dépôt (@pxref{La monad du dépôt}). +@noindent +Sans être un expert Scheme, le lecteur peut comprendre la signification des +différents champs présents. Cette expression lie la variable @code{hello} à +un objet @code{}, qui est essentiellement un enregistrement +(@pxref{SRFI-9, Scheme records,, guile, GNU Guile Reference Manual}). On +peut inspecter cet objet de paquet avec les procédures qui se trouvent dans +le module @code{(guix packages)} ; par exemple, @code{(package-name hello)} +renvoie — oh surprise ! — @code{"hello"}. -@c FIXME -@i{Cette section est actuellement incomplète.} +Avec un peu de chance, vous pourrez importer tout ou partie de la définition +du paquet qui vous intéresse depuis un autre répertoire avec la commande +@code{guix import} (@pxref{Invoquer guix import}). -@node Dérivations -@section Dérivations +Dans l'exemple précédent, @var{hello} est défini dans un module à part, +@code{(gnu packages hello)}. Techniquement, cela n'est pas strictement +nécessaire, mais c'est pratique : tous les paquets définis dans des modules +sous @code{(gnu packages @dots{})} sont automatiquement connus des outils en +ligne de commande (@pxref{Modules de paquets}). -@cindex dérivations -Les actions de construction à bas-niveau et l'environnement dans lequel -elles sont effectuées sont représentés par des @dfn{dérivations}. Une -dérivation contient cet ensemble d'informations : +Il y a quelques points à remarquer dans la définition de paquet précédente : @itemize @item -Les sorties de la dérivation — les dérivations produisent au moins un -fichier ou répertoire dans le dépôt, mais peuvent en produire plus. +Le champ @code{source} du paquet est un objet @code{} (@pxref{Référence d'origine}, pour la référence complète). Ici, on utilise la méthode +@code{url-fetch} de @code{(guix download)}, ce qui signifie que la source +est un fichier à télécharger par FTP ou HTTP. -@item -Les entrées de la dérivation, qui peuvent être d'autres dérivations ou des -fichiers dans le dépôt (correctifs, scripts de construction, etc). +Le préfixe @code{mirror://gnu} demande à @code{url-fetch} d'utiliser l'un +des miroirs GNU définis dans @code{(guix download)}. -@item -Le type de système ciblé par la dérivation — p.ex.@: @code{x86_64-linux}. +Le champ @code{sha256} spécifie le hash SHA256 attendu pour le fichier +téléchargé. Il est requis et permet à Guix de vérifier l'intégrité du +fichier. La forme @code{(base32 @dots{})} introduit a représentation en +base32 du hash. Vous pouvez obtenir cette information avec @code{guix +download} (@pxref{Invoquer guix download}) et @code{guix hash} +(@pxref{Invoquer guix hash}). -@item -Le nom de fichier d'un script de construction dans le dépôt avec les -arguments à lui passer. +@cindex correctifs +Lorsque cela est requis, la forme @code{origin} peut aussi avec un champ +@code{patches} qui liste les correctifs à appliquer et un champ +@code{snippet} qui donne une expression Scheme pour modifier le code source. @item -Une liste de variables d'environnement à définir. +@cindex Système de construction GNU +Le champ @code{build-system} spécifie la procédure pour construire le paquet +(@pxref{Systèmes de construction}). Ici, @var{gnu-build-system} représente le système +de construction GNU familier, où les paquets peuvent être configurés, +construits et installés avec la séquence @code{./configure && make && make +check && make install} habituelle. -@end itemize +@item +Le champ @code{arguments} spécifie des options pour le système de +construction (@pxref{Systèmes de construction}). Ici il est interprété par +@var{gnu-build-system} comme une demande de lancer @file{configure} avec le +drapeau @code{--enable-silent-rules}. -@cindex chemin de dérivation -Les dérivations permettent aux client du démon de communiquer des actions de -construction dans le dépôt. Elles existent sous deux formes : en tant que -représentation en mémoire, à la fois côté client et démon, et en tant que -fichiers dans le dépôt dont le nom fini par @code{.drv} — on dit que ce sont -des @dfn{chemins de dérivations}. Les chemins de dérivations peuvent être -passés à la procédure @code{build-derivations} pour effectuer les actions de -construction qu'ils prescrivent (@pxref{Le dépôt}). +@cindex quote +@cindex quoting +@findex ' +@findex quote +Que sont ces apostrophes (@code{'}) ? C'est de la syntaxe Scheme pour +introduire une liste ; @code{'} est synonyme de la fonction @code{quote}. +@xref{Expression Syntax, quoting,, guile, GNU Guile Reference Manual}, pour +des détails. Ice la valeur du champ @code{arguments} est une liste +d'arguments passés au système de construction plus tard, comme avec +@code{apply} (@pxref{Fly Evaluation, @code{apply},, guile, GNU Guile +Reference Manual}). -@cindex dérivations à sortie fixe -Des opérations comme le téléchargement de fichiers et la récupération de -sources gérés par un logiciel de contrôle de version pour lesquels le hash -du contenu est connu à l'avance sont modélisés par des @dfn{dérivations à -sortie fixe}. Contrairement aux dérivation habituelles, les sorties d'une -dérivation à sortie fixe sont indépendantes de ses entrées — p.ex.@: un code -source téléchargé produit le même résultat quelque soit la méthode de -téléchargement utilisée. +La séquence dièse-deux-points (@code{#:}) définie un @dfn{mot-clef} Scheme +(@pxref{Keywords,,, guile, GNU Guile Reference Manual}), et +@code{#:configure-flags} est un mot-clef utilisé pour passer un argument au +système de construction (@pxref{Coding With Keywords,,, guile, GNU Guile +Reference Manual}). -Le module @code{(guix derivations)} fournit une représentation des -dérivations comme des objets Scheme, avec des procédures pour créer et -manipuler des dérivations. La primitive de plus bas-niveau pour créer une -dérivation est la procédure @code{derivation} : +@item +Le champ @code{inputs} spécifie les entrées du processus de construction — +c.-à-d.@: les dépendances à la construction ou à l'exécution du paquet. Ici +on définie une entrée nommée @code{"gawk"} dont la valeur est la variable +@var{gawk} ; @var{gawk} est elle-même liée à un objet @code{}. -@deffn {Procédure Scheme} derivation @var{store} @var{name} @var{builder} @ - @var{args} [#:outputs '("out")] [#:hash #f] [#:hash-algo #f] @ -[#:recursive? #f] [#:inputs '()] [#:env-vars '()] @ -[#:system (%current-system)] [#:references-graphs #f] @ -[#:allowed-references #f] [#:disallowed-references #f] @ -[#:leaked-env-vars #f] [#:local-build? #f] @ -[#:substitutable? #t] [#:properties '()] -Construit une dérivation avec les arguments donnés et renvoie l'objet -@code{} obtenu. +@cindex accent grave (quasiquote) +@findex ` +@findex quasiquote +@cindex virgule (unquote) +@findex , +@findex unquote +@findex ,@@ +@findex unquote-splicing +De nouveau, @code{`} (un accent grave, synonyme de la fonction +@code{quasiquote}) nous permet d'introduire une liste littérale dans le +champ @code{inputs}, tandis que @code{,} (une virgule, synonyme de la +fonction @code{unquote}) nous permet d'insérer une valeur dans cette liste +(@pxref{Expression Syntax, unquote,, guile, GNU Guile Reference Manual}). -Lorsque @var{hash} et @var{hash-algo} sont donnés, une @dfn{dérivation à -sortie fixe} est créée — c.-à-d.@: une dérivation dont le résultat est connu -à l'avance, comme dans le cas du téléchargement d'un fichier. Si, en plus, -@var{recursive?} est vrai, alors la sortie fixe peut être un fichier -exécutable ou un répertoire et @var{hash} doit être le hash d'une archive -contenant la sortie. +Remarquez que GCC, Coreutils, Bash et les autres outils essentiels n'ont pas +besoin d'être spécifiés en tant qu'entrées ici. À la place, le +@var{gnu-build-system} est en charge de s'assurer qu'ils sont présents +(@pxref{Systèmes de construction}). -Lorsque @var{references-graphs} est vrai, il doit s'agir d'une liste de -paires de noms de fichiers et de chemins du dépôt. Dans ce cas, le graphe -des références de chaque chemin du dépôt est exporté dans l'environnement de -construction dans le fichier correspondant, dans un simple format texte. +Cependant, toutes les autres dépendances doivent être spécifiées dans le +champ @code{inputs}. Toute dépendance qui ne serait pas spécifiée ici sera +simplement indisponible pour le processus de construction, ce qui peut mener +à un échec de la construction. +@end itemize -Lorsque @var{allowed-references} est vrai, il doit s'agir d'une liste -d'éléments du dépôt ou de sorties auxquelles la sortie de la dérivations -peut faire référence. De même, @var{disallowed-references}, si vrai, doit -être une liste de choses que la sortie ne doit @emph{pas} référencer. +@xref{Référence de paquet}, pour une description complète des champs +possibles. -Lorsque @var{leaked-env-vars} est vrai, il doit s'agir d'une liste de -chaînes de caractères qui désignent les variables d'environnements qui -peuvent « fuiter » de l'environnement du démon dans l'environnement de -construction. Ce n'est possible que pour les dérivations à sortie fixe — -c.-à-d.@: lorsque @var{hash} est vrai. L'utilisation principale est de -permettre à des variables comme @code{http_proxy} d'être passées aux -dérivations qui téléchargent des fichiers. +Lorsqu'une définition de paquet est en place, le paquet peut enfin être +construit avec l'outil en ligne de commande @code{guix build} +(@pxref{Invoquer guix build}), pour résoudre les échecs de construction que +vous pourriez rencontrer (@pxref{Débogage des échecs de construction}). Vous pouvez +aisément revenir à la définition du paquet avec la commande @command{guix +edit} (@pxref{Invoquer guix edit}). @xref{Consignes d'empaquetage}, pour plus +d'informations sur la manière de tester des définitions de paquets et +@ref{Invoquer guix lint}, pour des informations sur la manière de vérifier +que la définition respecte les conventions de style. +@vindex GUIX_PACKAGE_PATH +Enfin, @pxref{Canaux} pour des informations sur la manière d'étendre la +distribution en ajoutant vos propres définitions de paquets dans un « canal +». -Lorsque @var{local-build?} est vrai, déclare que la dérivation n'est pas un -bon candidat pour le déchargement et devrait plutôt être construit -localement (@pxref{Réglages du délestage du démon}). C'est le cas des petites -dérivations où le coût du transfert de données est plus important que les -bénéfices. +Finalement, la mise à jour de la définition du paquet à une nouvelle version +amont peut en partie s'automatiser avec la commande @command{guix refresh} +(@pxref{Invoquer guix refresh}). -Lorsque que @var{substitutable?} est faux, déclare que les substituts de la -sortie de la dérivation ne devraient pas être utilisés -(@pxref{Substituts}). Cela est utile par exemple pour construire des paquets -qui utilisent des détails du jeu d'instruction du CPU hôte. +Sous le capot, une dérivation qui correspond à un objet @code{} est +d'abord calculé par la procédure @code{package-derivation}. Cette +dérivation est stockée dans un fichier @code{.drv} dans @file{/gnu/store}. +Les actions de construction qu'il prescrit peuvent ensuite être réalisées +par la procédure @code{build-derivation} (@pxref{Le dépôt}). -@var{properties} doit être une liste d'association décrivant les « -propriétés » de la dérivation. Elle est gardée telle-quelle, sans être -interprétée, dans la dérivation. +@deffn {Procédure Scheme} package-derivation @var{store} @var{package} [@var{system}] +Renvoie l'objet @code{} du @var{paquet} pour le @var{système} +(@pxref{Dérivations}). + +@var{paquet} doit être un objet @code{} valide et @var{système} une +chaîne indiquant le type de système cible — p.ex.@: @code{"x86_64-linux"} +pour un système GNU x86_64 basé sur Linux. @var{dépôt} doit être une +connexion au démon, qui opère sur les dépôt (@pxref{Le dépôt}). @end deffn @noindent -Voici un exemple avec un script shell comme constructeur, en supposant que -@var{store} est une connexion ouverte au démon et @var{bash} pointe vers un -exécutable Bash dans le dépôt : +@cindex compilation croisée +De manière identique, il est possible de calculer une dérivation qui +effectue une compilation croisée d'un paquet pour un autre système : -@lisp -(use-modules (guix utils) - (guix store) - (guix derivations)) +@deffn {Procédure Scheme} package-cross-derivation @var{store} @ + @var{paquet} @var{cible} [@var{système}] renvoie l'objet @code{} +du @var{paquet} construit depuis @var{système} pour @var{cible}. -(let ((builder ; ajoute le script Bash au dépôt - (add-text-to-store store "my-builder.sh" - "echo hello world > $out\n" '()))) - (derivation store "foo" - bash `("-e" ,builder) - #:inputs `((,bash) (,builder)) - #:env-vars '(("HOME" . "/homeless")))) -@result{} # /gnu/store/@dots{}-foo> -@end lisp +@var{cible} doit être un triplet GNU valide indiquant le matériel cible et +le système d'exploitation, comme @code{"mips64el-linux-gnu"} +(@pxref{Configuration Names, GNU configuration triplets,, configure, GNU +Configure and Build System}). +@end deffn -Comme on pourrait s'en douter, cette primitive est difficile à utiliser -directement. Une meilleure approche est d'écrire les scripts de -construction en Scheme, bien sur ! Le mieux à faire pour cela est d'écrire -le code de construction comme une « G-expression » et de la passer à -@code{gexp->derivation}. Pour plus d'informations, @pxref{G-Expressions}. +@cindex transformations de paquets +@cindex réécriture d'entrées +@cindex réécriture de l'arbre des dépendances +On peut manipuler les paquets de manière arbitraire. Une transformation +utile est par exemple la @dfn{réécriture d'entrées} où l'arbre des +dépendances d'un paquet est réécrit en replaçant des entrées spécifiques par +d'autres : -Il fut un temps où @code{gexp->derivation} n'existait pas et où construire -une dérivation donc le code de construction était écrit en Scheme se faisait -avec @code{build-expression->derivation}, documenté plus bas. Cette -procédure est maintenant obsolète, remplacée par @code{gexp->derivation} qui -est meilleure. +@deffn {Procédure Scheme} package-input-rewriting @var{replacements} @ + [@var{nom-réécrit}] Renvoie une procédure qui, lorsqu'on lui donne un +paquet, remplace des dépendances directes et indirectes (mais pas ses +entrées implicites) en fonction de @var{remplacements}. @var{remplacements} +est une liste de paires de paquets ; le premier élément de chaque pair est +le paquet à remplacer, le second son remplaçant. -@deffn {Procédure Scheme} build-expression->derivation @var{store} @ - @var{name} @var{exp} @ -[#:system (%current-system)] [#:inputs '()] @ -[#:outputs '("out")] [#:hash #f] [#:hash-algo #f] @ -[#:recursive? #f] [#:env-vars '()] [#:modules '()] @ -[#:references-graphs #f] [#:allowed-references #f] @ -[#:disallowed-references #f] @ -[#:local-build? #f] [#:substitutable? #t] [#:guile-for-build #f] -Renvoie une dérivation qui exécute l'expression Scheme @var{exp} comme un -constructeur pour la dérivation @var{name}. @var{inputs} doit être une -liste de tuples @code{(name drv-path sub-drv)} ; lorsque @var{sub-drv} est -omis, @code{"out"} est utilisé. @var{modules} est une liste de noms de -modules Guile du chemin de recherche actuel qui seront copiés dans le dépôt, -compilés et rendus disponibles dans le chemin de chargement pendant -l'exécution de @var{exp} — p.@: ex.@: @code{((guix build utils) (guix build -gnu-build-system))}. +De manière facultative, @var{nom-réécrit} est une procédure à un argument +qui prend le nom d'un paquet et renvoie son nouveau nom après l'avoir +réécrit. +@end deffn -@var{exp} est évaluée dans une environnement où @code{%outputs} est lié à -une liste de paires de sortie/chemin, et où @code{%build-inputs} est lié à -une liste de paires de chaînes de caractères et de chemin de sortie -construite à partir de @var{inputs}. Éventuellement, @var{env-vars} est une -liste de paires de chaînes de caractères spécifiant le nom et la valeur de -variables d'environnement visibles pour le constructeur. Le constructeur -termine en passant le résultat de @var{exp} à @code{exit} ; ainsi, lorsque -@var{exp} renvoie @code{#f}, la construction est considérée en échec. +@noindent +Regardez cet exemple : -@var{exp} est construite avec @var{guile-for-build} (une dérivation). -Lorsque @var{guile-for-build} est omis où est @code{#f}, la valeur du fluide -@code{%guile-for-build} est utilisée à la place. +@example +(define libressl-instead-of-openssl + ;; Cette procédure remplace OPENSSL par LIBRESSL, + ;; récursivement. + (package-input-rewriting `((,openssl . ,libressl)))) -Voir la procédure @code{derivation} pour la signification de -@var{references-graph}, @var{allowed-references}, -@var{disallowed-references}, @var{local-build?} et @var{substitutable?}. -@end deffn +(define git-with-libressl + (libressl-instead-of-openssl git)) +@end example @noindent -Voici un exemple de dérivation à sortie unique qui crée un répertoire avec -un fichier : +Ici nous définissons d'abord une procédure de réécriture qui remplace +@var{openssl} par @var{libressl}. Ensuite nous l'utilisons pour définir une +@dfn{variante} du paquet @var{git} qui utilise @var{libressl} plutôt que +@var{openssl}. cela est exactement ce que l'option en ligne de commande +@option{--with-input} fait (@pxref{Options de transformation de paquets, +@option{--with-input}}). -@lisp -(let ((builder '(let ((out (assoc-ref %outputs "out"))) - (mkdir out) ; create /gnu/store/@dots{}-goo - (call-with-output-file (string-append out "/test") - (lambda (p) - (display '(hello guix) p)))))) - (build-expression->derivation store "goo" builder)) +Une procédure plus générique pour réécrire un graphe de dépendance d'un +paquet est @code{package-mapping} : elle supporte n'importe quel changement +dans les nœuds du graphe. -@result{} # @dots{}> -@end lisp +@deffn {Procédure Scheme} package-mapping @var{proc} [@var{cut?}] +Renvoie une procédure qui, avec un paquet, applique @var{proc} sur tous les +paquets dont il dépend et renvoie le paquet qui en résulte. La procédure +arrête la récursion là où @var{cut?} renvoie vrai pour un paquet donné. +@end deffn +@menu +* Référence de paquet:: Le type de donnée des paquets. +* Référence d'origine:: Le type de données d'origine. +@end menu -@node La monad du dépôt -@section La monad du dépôt -@cindex monad +@node Référence de paquet +@subsection Référence de @code{package} -Les procédures qui travaillent sur le dépôt décrites dans les sections -précédentes prennent toutes une connexion ouverte au démon de construction -comme premier argument. Bien que le modèle sous-jacent soit fonctionnel, -elles ont soit des effets de bord, soit dépendent de l'état actuel du dépôt. +Cette section résume toutes les options disponibles dans les déclarations +@code{package} (@pxref{Définition des paquets}). -Le premier point est embêtant : on doit se balader avec la connexion au -démon dans toutes ces fonctions, ce qui rend impossible le fait de composer -des fonctions qui ne prennent pas ce paramètre avec des fonctions qui le -prennent. Le deuxième point est problématique : comme les opérations sur le -dépôt ont des effets de bord ou dépendent d'états externes, elles doivent -être enchaînés correctement. +@deftp {Type de données} package +C'est le type de donnée représentant une recette de paquets -@cindex valeurs monadiques -@cindex fonctions monadiques -C'est là que le module @code{(guix monads)} arrive à la rescousse. Ce -module fournit un cadre pour travailler avec des @dfn{monads}, en -particulier une monad très utile pour notre usage, la @dfn{monad du dépôt}. -Les monads sont des constructions qui permettent deux choses : associer un « -contexte » avec une valeur (dans notre cas, le contexte est le dépôt) et -construire une séquence de calculs (ici les calculs comprennent des accès au -dépôt). Les valeurs dans une monad — les valeurs qui contiennent ce -contexte supplémentaire — sont appelées des @dfn{valeurs monadiques} ; les -procédures qui renvoient ce genre de valeur sont appelées des -@dfn{procédures monadiques}. +@table @asis +@item @code{name} +Le nom du paquet, comme une chaîne de caractères. -Considérez cette procédure « normale » : +@item @code{version} +La version du paquet, comme une chaîne de caractères. -@example -(define (sh-symlink store) - ;; Renvoie une dérivation qui crée un lien symbolique vers l'exécutable « bash ». - (let* ((drv (package-derivation store bash)) - (out (derivation->output-path drv)) - (sh (string-append out "/bin/bash"))) - (build-expression->derivation store "sh" - `(symlink ,sh %output)))) -@end example +@item @code{source} +Un objet qui indique comment le code source du paquet devrait être +récupéré. La plupart du temps, c'est un objet @code{origin} qui indique un +fichier récupéré depuis internet (@pxref{Référence d'origine}). Il peut aussi +s'agir de tout autre objet ``simili-fichier'' comme un @code{local-file} qui +indique un fichier du système de fichier local (@pxref{G-Expressions, +@code{local-file}}). -En utilisant @code{(guix monads)} et @code{(guix gexp)}, on peut la réécrire -en une fonction monadique : +@item @code{build-system} +Le système de construction qui devrait être utilisé pour construire le +paquet (@pxref{Systèmes de construction}). + +@item @code{arguments} (par défaut : @code{'()}) +Les arguments à passer au système de construction. C'est une liste qui +contient typiquement une séquence de paires de clefs-valeurs. + +@item @code{inputs} (par défaut : @code{'()}) +@itemx @code{native-inputs} (par défaut : @code{'()}) +@itemx @code{propagated-inputs} (par défaut : @code{'()}) +@cindex entrées, des paquets +Ces champs listent les dépendances du paquet. Chacune est une liste de +tuples, où chaque tuple a une étiquette pour une entrée (une chaîne de +caractères) comme premier élément, un paquet, une origine ou une dérivation +comme deuxième élément et éventuellement le nom d'une sortie à utiliser qui +est @code{"out"} par défaut (@pxref{Des paquets avec plusieurs résultats}, pour +plus d'informations sur les sorties des paquets). Par exemple, la liste +suivante spécifie trois entrées : @example -(define (sh-symlink) - ;; Pareil, mais renvoie une valeur monadique. - (mlet %store-monad ((drv (package->derivation bash))) - (gexp->derivation "sh" - #~(symlink (string-append #$drv "/bin/bash") - #$output)))) +`(("libffi" ,libffi) + ("libunistring" ,libunistring) + ("glib:bin" ,glib "bin")) ;la sortie "bin" de Glib @end example -Il y a plusieurs choses à remarquer avec cette deuxième version : le -paramètre @code{store} est maintenant implicitement « enfilé » dans les -appels aux procédures monadiques @code{package->derivation} et -@code{gexp->derivation}, et la valeur monadique renvoyée par -@code{package->derivation} est @dfn{liée} avec @code{mlet} plutôt qu'avec un -simple @code{let}. +@cindex compilation croisée, dépendances des paquets +La distinction entre @code{native-inputs} et @code{inputs} est nécessaire +lorsqu'on considère la compilation croisée. Lors d'une compilation croisée, +les dépendances listées dans @code{inputs} sont construites pour +l'architecture @emph{cible} ; inversement, les dépendances listées dans +@code{native-inputs} sont construites pour l'architecture de la machine de +@emph{construction}. -Il se trouve que l'appel à @code{package->derivation} peut même être omis -puisqu'il aura lieu implicitement, comme nous le verrons plus tard -(@pxref{G-Expressions}) : +@code{native-inputs} est typiquement utilisé pour lister les outils requis à +la construction mais pas à l'exécution, comme Autoconf, Automake, +pkg-config, Gettext ou Bison. @command{guix lint} peut rapporter des +erreurs de ce type (@pxref{Invoquer guix lint}). -@example -(define (sh-symlink) - (gexp->derivation "sh" - #~(symlink (string-append #$bash "/bin/bash") - #$output))) -@end example +@anchor{package-propagated-inputs} +Enfin, @code{propagated-inputs} est similaire à @code{inputs}, mais les +paquets spécifiés seront automatiquement installés avec le paquet auquel ils +appartiennent (@pxref{package-cmd-propagated-inputs, @command{guix +package}}, pour des informations sur la manière dont @command{guix package} +traite les entrées propagées). -@c See -@c -@c for the funny quote. -L'appel à la procédure monadique @code{sh-symlink} n'a aucun effet. En -anglais on pourrait dire « you exit a monad like you exit a building on -fire: by running »@footnote{NdT : « on sort d'une monad comme d'un immeuble -en flamme, en courant ». Le jeu de mot est perdu à la traduction : courrir -et lancer utilisent le même verbe @i{run} en anglais.}. Donc, pour sortir de -la monad et obtenir l'effet escompté, on doit utiliser -@code{run-with-store}. +Par exemple cela est nécessaire lorsque des bibliothèques C/C++ ont besoin +d'en-têtes d'une autre bibliothèque pour être compilé ou lorsqu'un fichier +pkg-config se rapporte à un autre @i{via} son champ @code{Requires}. -@example -(run-with-store (open-connection) (sh-symlink)) -@result{} /gnu/store/...-sh-symlink -@end example +Un autre exemple où @code{propagated-inputs} est utile est pour les langages +auxquels il manque un moyen de retenir le chemin de recherche comme c'est le +cas du @code{RUNPATH} des fichiers ELF ; cela comprend Guile, Python, Perl +et plus. Pour s'assurer que les bibliothèques écrites dans ces langages +peuvent trouver le code des bibliothèques dont elles dépendent à +l'exécution, les dépendances à l'exécution doivent être listées dans +@code{propagated-inputs} plutôt que @code{inputs}. -Remarquez que le module @code{(guix monad-repl)} étend la console Guile avec -de nouvelles « méta-commandes » pour rendre plus facile la manipulation de -procédures monadiques : @code{run-in-store} et @code{enter-store-monad}. La -première est utilisée pour « lancer » une seule valeur monadique à travers -le dépôt : +@item @code{self-native-input?} (par défaut : @code{#f}) +C'est un champ booléen qui indique si le paquet devrait s'utiliser lui-même +comme entrée native lors de la compilation croisée. -@example -scheme@@(guile-user)> ,run-in-store (package->derivation hello) -$1 = # @dots{}> -@end example +@item @code{outputs} (par défaut : @code{'("out")}) +La liste des noms de sorties du paquet. @xref{Des paquets avec plusieurs résultats}, pour des exemples typiques d'utilisation de sorties +supplémentaires. -La deuxième entre dans une console récursive, où toutes les valeurs de -retour sont automatiquement lancées à travers le dépôt : +@item @code{native-search-paths} (par défaut : @code{'()}) +@itemx @code{search-paths} (par défaut : @code{'()}) +Une liste d'objets @code{search-path-specification} décrivant les variables +d'environnement de recherche de chemins que ce paquet utilise. -@example -scheme@@(guile-user)> ,enter-store-monad -store-monad@@(guile-user) [1]> (package->derivation hello) -$2 = # @dots{}> -store-monad@@(guile-user) [1]> (text-file "foo" "Hello!") -$3 = "/gnu/store/@dots{}-foo" -store-monad@@(guile-user) [1]> ,q -scheme@@(guile-user)> -@end example +@item @code{replacement} (par défaut : @code{#f}) +Ce champ doit être soit @code{#f} soit un objet de paquet qui sera utilisé +comme @dfn{remplaçant} de ce paquet. @xref{Mises à jour de sécurité, grafts}, pour +plus de détails. -@noindent -Remarquez qu'on ne peut pas renvoyer de valeur non monadique dans la console -@code{store-monad}. +@item @code{synopsis} +Une description sur une ligne du paquet. -Les formes syntaxiques principales pour utiliser des monads en général sont -disponibles dans le module @code{(guix monads)} et sont décrites ci-dessous. +@item @code{description} +Une description plus détaillée du paquet. -@deffn {Syntaxe Scheme} with-monad @var{monad} @var{body} ... -Évalue n'importe quelle forme @code{>>=} ou @code{return} dans @var{body} -comme une @var{monad}. -@end deffn +@item @code{license} +@cindex licence, des paquets +La licence du paquet ; une valeur tirée de @code{(guix licenses)} ou une +liste de ces valeurs. -@deffn {Syntaxe Scheme} return @var{val} -Renvoie une valeur monadique qui encapsule @var{val}. -@end deffn +@item @code{home-page} +L'URL de la page d'accueil du paquet, en tant que chaîne de caractères. -@deffn {Syntaxe Scheme} >>= @var{mval} @var{mproc} ... -@dfn{Lie} une valeur monadique @var{mval}, en passant son « contenu » aux -procédures monadiques @var{mproc}@dots{}@footnote{Cette opération est -souvent appelée « bind », mais ce nom dénote une procédure qui n'a rien à -voir en Guile. Ainsi, nous empruntons ce symbole quelque peu cryptique au -langage Haskell}. Il peut y avoir une ou plusieurs @code{mproc}, comme dans -cet exemple : +@item @code{supported-systems} (par défaut : @var{%supported-systems}) +La liste des systèmes supportés par le paquet, comme des chaînes de +caractères de la forme @code{architecture-noyau}, par exemple +@code{"x86_64-linux"}. -@example -(run-with-state - (with-monad %state-monad - (>>= (return 1) - (lambda (x) (return (+ 1 x))) - (lambda (x) (return (* 2 x))))) - 'some-state) +@item @code{maintainers} (par défaut : @code{'()}) +La liste des mainteneurs du paquet, comme des objets @code{maintainer}. -@result{} 4 -@result{} some-state -@end example -@end deffn +@item @code{location} (par défaut : emplacement de la source de la forme @code{package}) +L'emplacement de la source du paquet. C'est utile de le remplacer lorsqu'on +hérite d'un autre paquet, auquel cas ce champ n'est pas automatiquement +corrigé. +@end table +@end deftp -@deffn {Syntaxe Scheme} mlet @var{monad} ((@var{var} @var{mval}) ...) @ - @var{body} ... -@deffnx {Syntaxe Scheme} mlet* @var{monad} ((@var{var} @var{mval}) ...) @ - @var{body} ... -Lie les variables @var{var} aux valeurs monadiques @var{mval} dans -@var{body}, une séquence d'expressions. Comme avec l'opérateur de liaison, -on peut réfléchir comme si on « ouvrait » la valeur non-monadique « contenue -» dans @var{mval} et comme si on faisait en sorte que @var{var} se réfère à -cette valeur pure, non-monadique, dans la portée de @var{body}. La forme -(@var{var} -> @var{val}) lie @var{var} à la valeur « normale » @var{val}, -comme @code{let}. L'opération de liaison a lieu en séquence de la gauche -vers la droite. La dernière expression de @var{body} doit être une -expression monadique et son résultat deviendra le résultat de @code{mlet} ou -@code{mlet*} lorsque lancé dans la @var{monad}. -@code{mlet*} est à @code{mlet} ce que @code{let*} est à @code{let} -(@pxref{Local Bindings,,, guile, GNU Guile Reference Manual}). -@end deffn +@node Référence d'origine +@subsection Référence de @code{origin} -@deffn {Système Scheme} mbegin @var{monad} @var{mexp} ... -Lie @var{mexp} et les expressions monadiques suivantes en séquence, et -renvoie le résultat de la dernière expression. Chaque expression dans la -séquence doit être une expression monadique. +Cette section résume toutes les options disponibles dans le déclarations +@code{origin} (@pxref{Définition des paquets}). -Cette procédure est similaire à @code{mlet}, sauf que les valeurs de retour -des expressions monadiques sont ignorées. Dans ce sens, elle est analogue à -@code{begin}, mais appliqué à des expressions monadiques. -@end deffn +@deftp {Type de données} origin +C'est le type de donnée qui représente l'origine d'un code source. -@deffn {Système Scheme} mwhen @var{condition} @var{mexp0} @var{mexp*} ... -Lorsque la @var{condition} est vraie, évalue la séquence des expressions -monadiques @var{mexp0}..@var{mexp*} comme dans un @code{mbegin}. Lorsque la -@var{condition} est fausse, renvoie @code{*unspecified*} dans la monad -actuelle. Cahque expression dans la séquence doit être une expression -monadique. -@end deffn +@table @asis +@item @code{uri} +Un objet contenant l'URI de la source. Le type d'objet dépend de la +@code{method} (voir plus bas). Par exemple, avec la méthode @var{url-fetch} +de @code{(guix download)}, les valeurs valide d'@code{uri} sont : une URL +représentée par une chaîne de caractères, ou une liste de chaînes de +caractères. -@deffn {Système Scheme} munless @var{condition} @var{mexp0} @var{mexp*} ... -Lorsque la @var{condition} est fausse, évalue la séquence des expressions -monadiques @var{mexp0}..@var{mexp*} comme dans un @code{mbegin}. Lorsque la -@var{condition} est vraie, renvoie @code{*unspecified*} dans la monad -actuelle. Cahque expression dans la séquence doit être une expression -monadique. -@end deffn +@item @code{method} +Un procédure qui gère l'URI. -@cindex monad d'état -Le module @code{(guix monads)} fournit la @dfn{monad d'état} qui permet à -une valeur supplémentaire — l'état — d'être enfilée à travers les appels de -procédures. +Quelques exemples : -@defvr {Variable Scheme} %state-monad -La monad d'état. les procédure dans la monad d'état peuvent accéder et -modifier l'état qui est enfilé. +@table @asis +@item @var{url-fetch} de @code{(guix download)} +télécharge un fichier depuis l'URL HTTP, HTTPS ou FTP spécifiée dans le +champ @code{uri} ; -Considérez l'exemple ci-dessous. La procédure @code{square} renvoie une -valeur dans la monad d'état. Elle renvoie le carré de son argument, mais -incrémente aussi la valeur actuelle de l'état : +@vindex git-fetch +@item @var{git-fetch} de @code{(guix git-download)} +clone le dépôt sous contrôle de version Git et récupère la révision +spécifiée dans le champ @code{uri} en tant qu'objet @code{git-reference} ; +un objet @code{git-reference} ressemble à cela : @example -(define (square x) - (mlet %state-monad ((count (current-state))) - (mbegin %state-monad - (set-current-state (+ 1 count)) - (return (* x x))))) - -(run-with-state (sequence %state-monad (map square (iota 3))) 0) -@result{} (0 1 4) -@result{} 3 +(git-reference + (url "git://git.debian.org/git/pkg-shadow/shadow") + (commit "v4.1.5.1")) @end example +@end table -Lorsqu'on la lance à travers @var{%state-monad}, on obtient cet valeur -d'état supplémentaire, qui est le nombre d'appels à @code{square}. -@end defvr +@item @code{sha256} +Un bytevector contenant le hash SHA-256 de la source. Typiquement la forme +@code{base32} est utilisée ici pour générer le bytevector depuis une chaîne +de caractères en base-32. + +Vous pouvez obtenir cette information avec @code{guix download} +(@pxref{Invoquer guix download}) ou @code{guix hash} (@pxref{Invoquer guix hash}). + +@item @code{file-name} (par défaut : @code{#f}) +Le nom de fichier à utiliser pour sauvegarder le fichier. Lorsqu'elle est à +@code{#f}, une valeur par défaut raisonnable est utilisée dans la plupart +des cas. Dans le cas où la source est récupérée depuis une URL, le nom de +fichier est celui de l'URL. Pour les sources récupérées depuis un outil de +contrôle de version, il est recommandé de fournir un nom de fichier +explicitement parce que le nom par défaut n'est pas très descriptif. + +@item @code{patches} (par défaut : @code{'()}) +Une liste de noms de fichiers, d'origines ou d'objets simili-fichiers +(@pxref{G-Expressions, file-like objects}) qui pointent vers des correctifs +à appliquer sur la source. + +Cette liste de correctifs doit être inconditionnelle. En particulier, elle +ne peut pas dépendre des valeurs de @code{%current-system} ou +@code{%current-target-system}. -@deffn {Procédure monadique} current-state -Renvoie l'état actuel dans une valeur monadique. -@end deffn +@item @code{snippet} (par défaut : @code{#f}) +Une G-expression (@pxref{G-Expressions}) ou une S-expression qui sera lancée +dans le répertoire des sources. C'est une manière pratique de modifier la +source, parfois plus qu'un correctif. -@deffn {Procédure monadique} set-current-state @var{value} -Initialise l'état actuel à @var{value} et renvoie l'état précédent dans une -valeur monadique. -@end deffn +@item @code{patch-flags} (par défaut : @code{'("-p1")}) +Une liste de drapeaux à passer à la commande @code{patch}. -@deffn {Procédure monadique} state-push @var{value} -Pousse @var{value} sur l'état actuel, qui est supposé être une liste, et -renvoie l'état précédent dans une valeur monadique. -@end deffn +@item @code{patch-inputs} (par défaut : @code{#f}) +Paquets d'entrées ou dérivations pour le processus de correction. +Lorsqu'elle est à @code{#f}, l'ensemble d'entrées habituellement nécessaire +pour appliquer des correctifs est fournit, comme GNU@tie{}Patch. -@deffn {Procédure monadique} state-pop -Récupère (pop) une valeur dans l'état actuel et la renvoie comme une valeur -monadique. L'état est supposé être une liste. -@end deffn +@item @code{modules} (par défaut : @code{'()}) +Une liste de modules Guile qui devraient être chargés pendant le processus +de correction et pendant que le lancement du code du champ @code{snippet}. -@deffn {Procédure Scheme} run-with-state @var{mval} [@var{state}] -Lance la valeur monadique @var{mval} avec @var{state} comme valeur -initiale. Renvoie deux valeurs : la valeur du résultat et l'état du -résultat. -@end deffn +@item @code{patch-guile} (par défaut : @code{#f}) +Le paquet Guile à utiliser dans le processus de correction. Lorsqu'elle est +à @code{#f}, une valeur par défaut raisonnable est utilisée. +@end table +@end deftp -L'interface principale avec la monad du dépôt, fournit par le module -@code{(guix store)}, est la suivante. -@defvr {Variable Scheme} %store-monad -La monad du dépôt — un alias pour @var{%state-monad}. +@node Systèmes de construction +@section Systèmes de construction -Les valeurs dans la monad du dépôt encapsulent des accès au dépôt. Lorsque -son effet est requis, une valeur de la monad du dépôt doit être « évaluée » -en la passant à la procédure @code{run-with-store} (voir plus bas). -@end defvr +@cindex système de construction +Chaque définition de paquet définie un @dfn{système de construction} et des +arguments pour ce système de construction (@pxref{Définition des paquets}). Ce +champ @code{build-system} représente la procédure de construction du paquet, +ainsi que des dépendances implicites pour cette procédure de construction. -@deffn {Procédure Scheme} run-with-store @var{store} @var{mval} [#:guile-for-build] [#:system (%current-system)] -Lance @var{mval}, une valeur monadique dans la monad du dépôt, dans -@var{store}, une connexion ouvert au dépôt. -@end deffn +Les systèmes de construction sont des objets +@code{}. L'interface pour les créer et les manipuler est +fournie par le module @code{(guix build-system)} et les systèmes de +construction eux-mêmes sont exportés par des modules spécifiques. -@deffn {Procédure monadique} text-file @var{name} @var{text} [@var{references}] -Renvoie une valeur monadique correspondant au nom de fichier dans le dépôt -du fichier contenant @var{text}, une chaîne de caractères. @var{references} -est une liste d'éléments du dépôt auxquels le fichier texte en résultat se -réfère ; c'est la liste vide par défaut. -@end deffn +@cindex sac (représentation à bas-niveau des paquets) +Sous le capot, les systèmes de construction compilent d'abord des objets +paquets en @dfn{sacs}. Un @dfn{sac} est comme un paquet, mais avec moins de +décoration — en d'autres mots, un sac est une représentation à bas-niveau +d'un paquet, qui inclus toutes les entrées de ce paquet, dont certaines ont +été implicitement ajoutées par le système de construction. Cette +représentation intermédiaire est ensuite compilée en une dérivation +(@pxref{Dérivations}). -@deffn {Procédure monadique} binary-file @var{name} @var{data} [@var{references}] -Renvoie une valeur monadique correspondant au nom de fichier absolu dans le -dépôt du fichier contenant @var{data}, un vecteur d'octets. -@var{references} est une liste d'éléments du dépôt auxquels le fichier -binaire en résultat se réfère ; c'est la liste vide par défaut. -@end deffn +Les systèmes de construction acceptent une liste d'@dfn{arguments} +facultatifs. Dans les définitions de paquets, ils sont passés @i{via} le +champ @code{arguments} (@pxref{Définition des paquets}). Ce sont typiquement des +arguments par mot-clef (@pxref{Optional Arguments, keyword arguments in +Guile,, guile, GNU Guile Reference Manual}). La valeur de ces arguments est +habituellement évaluée dans la @dfn{strate de construction} — c.-à-d.@: par +un processus Guile lancé par le démon (@pxref{Dérivations}). -@deffn {Procédure monadique} interned-file @var{file} [@var{name}] @ - [#:recursive? #t] [#:select? (const #t)] -Renvoie le nom de @var{file} une fois ajouté au dépôt. Utilise @var{name} -comme nom dans le dépôt ou le nom de fichier de @var{file} si @var{name} est -omis. +Le système de construction principal est le @var{gnu-build-system} qui +implémente les procédures de construction standard pour les paquets GNU et +de nombreux autres. Il est fournit par le module @code{(guix build-system +gnu)}. -Lorsque @var{recursive?} est vraie, le contenu de @var{file} est ajouté -récursivement ; si @var{file} désigne un fichier simple et que -@var{recursive?} est vrai, son contenu est ajouté et ses bits de permissions -sont préservés. +@defvr {Variable Scheme} gnu-build-system +@var{gnu-build-system} représente le système de construction GNU et ses +variantes (@pxref{Configuration, configuration and makefile conventions,, +standards, GNU Coding Standards}). -Lorsque @var{recursive?} est vraie, appelle @code{(@var{select?} @var{file} -@var{stat})} pour chaque répertoire où @var{file} est le nom de fichier -absolu de l'entrée et @var{stat} est le résultat de @code{lstat} ; à -l'exception des entrées pour lesquelles @var{select?} ne renvoie pas vrai. +@cindex phases de construction +En résumé, les paquets qui l'utilisent sont configurés, construits et +installés avec la séquence @code{./configure && make && make check && make +install} habituelle. En pratique, des étapes supplémentaires sont souvent +requises. Toutes ces étapes sont séparées dans des @dfn{phases} +différentes, notamment@footnote{Regardez les modules @code{(guix build +gnu-build-system)} pour plus de détails sur les phases de construction.}: -L'exemple ci-dessous ajoute un fichier au dépôt, sous deux noms différents : +@table @code +@item unpack +Décompresse l'archive des sources et se déplace dans l'arborescence des +sources fraîchement extraites. Si la source est en fait un répertoire, le +copie dans l'arborescence de construction et entre dans ce répertoire. -@example -(run-with-store (open-connection) - (mlet %store-monad ((a (interned-file "README")) - (b (interned-file "README" "LEGU-MIN"))) - (return (list a b)))) +@item patch-source-shebangs +Corrige les shebangs (@code{#!}) rencontrés dans les fichiers pour qu'ils se +réfèrent aux bons noms de fichiers. Par exemple, elle change +@code{#!/bin/sh} en @code{#!/gnu/store/@dots{}-bash-4.3/bin/sh}. -@result{} ("/gnu/store/rwm@dots{}-README" "/gnu/store/44i@dots{}-LEGU-MIN") -@end example +@item configure +Lance le script @code{configure} avec un certain nombre d'options par +défaut, comme @code{--prefix=/gnu/store/@dots{}}, ainsi que les options +spécifiées par l'argument @code{#:configure-flags}. -@end deffn +@item build +Lance @code{make} avec la liste des drapeaux spécifiés avec +@code{#:make-flags}. Si l'argument @code{#:parallel-build?} est vrai (par +défaut), construit avec @code{make -j}. -Le module @code{(guix packages)} exporte les procédures monadiques liées aux -paquets suivantes : +@item check +Lance @code{make check}, ou une autre cible spécifiée par +@code{#:test-target}, à moins que @code{#:tests? #f} ne soit passé. Si +l'argument @code{#:parallel-tests?} est vrai (par défaut), lance @code{make +check -j}. -@deffn {Procédure monadique} package-file @var{package} [@var{file}] @ - [#:system (%current-system)] [#:target #f] @ -[#:output "out"] -Renvoie une valeur monadique qui contient le nom de fichier absolu de -@var{file} dans le répertoire @var{output} de @var{package}. Lorsque -@var{file} est omis, renvoie le nom du répertoire @var{output} de -@var{package}. Lorsque @var{target} est vrai, l'utilise comme un triplet de -cible pour la compilation croisée. -@end deffn +@item install +Lance @code{make install} avec les drapeaux listés dans @code{#:make-flags}. -@deffn {Procédure monadique} package->derivation @var{package} [@var{system}] -@deffnx {Procédure monadique} package->cross-derivation @var{package} @ - @var{target} [@var{system}] -Version monadique de @code{package-derivation} et -@code{package-cross-derivation} (@pxref{Définition des paquets}). -@end deffn +@item patch-shebangs +Corrige les shebangs des fichiers exécutables installés. +@item strip +Nettoie les symboles de débogage dans les fichiers ELF (à moins que +@code{#:strip-binaries?} ne soit faux), les copie dans la sortie +@code{debug} lorsqu'elle est disponible (@pxref{Installer les fichiers de débogage}). +@end table -@node G-Expressions -@section G-Expressions +@vindex %standard-phases +Le module du côté du constructeur @code{(guix build gnu-build-system)} +définie @var{%standard-phases} comme la liste par défaut des phases de +construction. @var{%standard-phases} est une liste de paires de symboles +et de procédures, où la procédure implémente la phase en question. -@cindex G-expression -@cindex quoting du code de construction -On a donc des « dérivations » qui représentent une séquence d'actions de -construction à effectuer pour produire un élément du dépôt -(@pxref{Dérivations}). Ces actions de construction sont effectuées -lorsqu'on demande au démon de construire effectivement les dérivations ; -elles sont lancées par le démon dans un conteneur (@pxref{Invoquer guix-daemon}). +La liste des phases utilisées par un paquet particulier peut être modifiée +avec le paramètre @code{#:phases}. Par exemple, en passant : -@cindex strate de code -Ça ne devrait pas vous surprendre, mais nous aimons écrire ces actions de -construction en Scheme. Lorsqu'on fait ça, on fini avec deux @dfn{strates} -de code Scheme@footnote{Le terme @dfn{strate} dans ce contexte a été inventé -par Manuel Serrano et ses collaborateurs dans le contexte de leur travaux -sur Hop. Oleg Kiselyov, qui a écrit des -@url{http://okmij.org/ftp/meta-programming/#meta-scheme, essais perspicaces -et du code sur le sujet}, utilise le terme de « mise en scène » pour ce -genre de génération de code.} : le « code hôte » — le code qui défini les -paquets, parle au démon, etc — et le « code côté construction » — le code -qui effectue effectivement les actions de construction, comme créer des -répertoires, invoquer @code{make}, etc. +@example +#:phases (modify-phases %standard-phases (delete 'configure)) +@end example -Pour décrire une dérivation et ses actions de construction, on a typiquement -besoin d'intégrer le code de construction dans le code hôte. Ça revient à -manipuler le code de construction comme de la donnée, et l'homoiconicité de -Scheme — le code a une représentation directe en tant que donnée — est très -utile pour cela. Mais on a besoin de plus que le mécanisme de -@code{quasiquote} en Scheme pour construire des expressions de construction. +signifie que toutes les procédures décrites plus haut seront utilisées, sauf +la phase @code{configure}. -Le module @code{(guix gexp)} implémente les @dfn{G-expressions}, une forme -de S-expression adaptée aux expressions de construction. Les G-expression, -ou @dfn{gexps}, consistent en gros en trois formes syntaxiques : -@code{gexp}, @code{ungexp} et @code{ungexp-splicing} (ou plus simplement : -@code{#~}, @code{#$} et @code{#$@@}), qui sont comparable à -@code{quasiquote}, @code{unquote} ett @code{unquote-splicing} respectivement -(@pxref{Expression Syntax, @code{quasiquote},, guile, GNU Guile Reference -Manual}). Cependant il y a des différences majeures : +En plus, ce système de construction s'assure que l'environnement « standard +» pour les paquets GNU est disponible. Cela inclus des outils comme GCC, +libc, Coreutils, Bash, Make, Diffutils, grep et sed (voir le module +@code{(guix build-system gnu)} pour une liste complète). Nous les appelons +les @dfn{entrées implicites} d'un paquet parce que la définition du paquet +ne les mentionne pas. +@end defvr -@itemize -@item -Les Gexps sont conçues pour être écrites dans un fichier et être lancées ou -manipulées par d'autres processus. +D'autres objets @code{} sont définis pour supporter d'autres +conventions et outils utilisés par les paquets de logiciels libres. Ils +héritent de la plupart de @var{gnu-build-system} et diffèrent surtout dans +l'ensemble des entrées implicites ajoutées au processus de construction et +dans la liste des phases exécutées. Certains de ces systèmes de +construction sont listés ci-dessous. -@item -Lorsqu'un objet de haut-niveau comme un paquet ou une dérivation est -unquotée dans une gexp, le résultat est comme si le nom de fichier de son -résultat avait été introduit. +@defvr {Variable Scheme} ant-build-system +Cette variable est exportée par @code{(guix build-system ant)}. Elle +implémente la procédure de construction pour les paquets Java qui peuvent +être construits avec @url{http://ant.apache.org/, l'outil de construction +Ant}. -@item -Les gexps transportent des informatinos sur les paquets ou les dérivations -auxquels elles se réfèrent, et ces dépendances sont automatiquement ajoutées -comme des entrées du processus de construction qui les utilise. -@end itemize +Elle ajoute à la fois @code{ant} et the @dfn{kit de développement Java} +(JDK) fournit par le paquet @code{icedtea} à l'ensemble des entrées. Des +paquets différents peuvent être spécifiés avec les paramètres @code{#:ant} +et @code{#:jdk} respectivement. + +Lorsque le paquet d'origine ne fournit pas de fichier de construction Ant +acceptable, le paramètre @code{#:jar-name} peut être utilisé pour générer un +fichier de construction Ant @file{build.xml} minimal, avec des tâches pour +construire l'archive jar spécifiée. Dans ce cas, le paramètre +@code{#:source-dir} peut être utilisé pour spécifier le sous-répertoire des +sources, par défaut « src ». -@cindex abaissement, des objets haut-niveau dans les gepxs -Ce mécanisme n'est pas limité aux paquets et aux dérivations : on peut -définir des @dfn{compilateurs} capable « d'abaisser » d'autres objets de -haut-niveau ou des fichiers dans le dépôt, pour que ces objets puissent -aussi être insérés dans des gexps. Par exemple, des objets haut-niveau -utiles qui pourraient être insérées dans une gexp sont les « objets -simili-fichiers », qui rendent facile l'ajout de fichiers dans le dépôt et -les références vers eux dans les dérivations et autres (voir -@code{local-file} et @code{plain-file} ci-dessous). +Le paramètre @code{#:main-class} peut être utilisé avec le fichier de +construction minimal pour spécifier la classe principale du jar. Cela rend +le fichier jar exécutable. Le paramètre @code{#:test-include} peut être +utilisé pour spécifier la liste des tests junits à lancer. Il vaut par +défaut @code{(list "**/*Test.java")}. Le paramètre @code{#:test-exclude} +peut être utilisé pour désactiver certains tests. Sa valeur par défaut est +@code{(list "**/Abstract*.java")}, parce que les classes abstraites ne +peuvent pas être utilisées comme des tests. -Pour illustrer cette idée, voici un exemple de gexp : +Le paramètre @code{#:build-target} peut être utilisé pour spécifier la tâche +Ant qui devrait être lancée pendant la phase @code{build}. Par défaut la +tâche « jar » sera lancée. -@example -(define build-exp - #~(begin - (mkdir #$output) - (chdir #$output) - (symlink (string-append #$coreutils "/bin/ls") - "list-files"))) -@end example +@end defvr -Cette gexp peut être passée à @code{gexp->derivation} ; on obtient une -dérivation qui construit une répertoire contenant exactement un lien -symbolique à @file{/gnu/store/@dots{}-coreutils-8.22/bin/ls} : +@defvr {Variable Scheme} android-ndk-build-system +@cindex Distribution android +@cindex système de construction Android NDK +Cette variable est exportée par @code{(guix build-system android-ndk)}. +Elle implémente une procédure de construction pour les paquets du NDK +Android (@i{native development kit}) avec des processus de construction +spécifiques à Guix. -@example -(gexp->derivation "the-thing" build-exp) -@end example +Le système de construction suppose que les paquets installent leur interface +publique (les en-têtes) dans un sous-répertoire de « include » de la sortie +« out » et leurs bibliothèques dans le sous-répertoire « lib » de la sortie +« out ». -Comme on pourrait s'y attendre, la chaîne -@code{"/gnu/store/@dots{}-coreutils-8.22"} est substituée à la place de la -référence au paquet @var{coreutils} dans le code de construction final, et -@var{coreutils} est automatiquement devenu une entrée de la dérivation. De -même, @code{#$output} (équivalent à @code{(ungexp output)}) est remplacé par -une chaîne de caractères contenant le nom du répertoire de la sortie de la -dérivation. +Il est aussi supposé que l'union de toutes les dépendances d'un paquet n'a +pas de fichiers en conflit. -@cindex compilation croisée -Dans le contexte d'une compilation croisée, il est utile de distinguer entre -des références à la construction @emph{native} d'un paquet — qui peut être -lancé par l'hôte — et des références à la construction croisée d'un paquet. -Pour cela, @code{#+} joue le même rôle que @code{#$}, mais référence une -construction native d'un paquet : +Pour l'instant, la compilation croisée n'est pas supportées — donc pour +l'instant les bibliothèques et les fichiers d'en-têtes sont supposés être +des outils de l'hôte. -@example -(gexp->derivation "vi" - #~(begin - (mkdir #$output) - (system* (string-append #+coreutils "/bin/ln") - "-s" - (string-append #$emacs "/bin/emacs") - (string-append #$output "/bin/vi"))) - #:target "mips64el-linux-gnu") -@end example +@end defvr -@noindent -Dans l'exemple ci-dessus, la construction native de @var{coreutils} est -utilisée, pour que @command{ln} puisse effectivement être lancé sur l'hôte ; -mais ensuite la construction croisée d'@var{emacs} est utilisée. +@defvr {Variable Scheme} asdf-build-system/source +@defvrx {Variable Scheme} asdf-build-system/sbcl +@defvrx {Variable Scheme} asdf-build-system/ecl -@cindex modules importés, pour les gexps -@findex with-imported-modules -Une autre fonctionnalité, ce sont les @dfn{modules importés} : parfois vous -voudriez pouvoir utiliser certains modules Guile de « l'environnement hôte » -dans la gexp, donc ces modules devraient être importés dans « -l'environnement de construction ». La forme @code{with-imported-modules} -vous permet d'exprimer ça : +Ces variables, exportées par @code{(guix build-system asdf)}, implémentent +les procédures de constructions pour les paquets en Common Lisp qui +utilisent @url{https://common-lisp.net/project/asdf/, ``ASDF''}. ASDF est +un dispositif de définition de systèmes pour les programmes et les +bibliothèques en Common Lisp. -@example -(let ((build (with-imported-modules '((guix build utils)) - #~(begin - (use-modules (guix build utils)) - (mkdir-p (string-append #$output "/bin")))))) - (gexp->derivation "empty-dir" - #~(begin - #$build - (display "success!\n") - #t))) -@end example +Le système @code{asdf-build-system/source} installe les paquets au format +source qui peuvent être chargés avec n'importe quelle implémentation de +common lisp, via ASDF. Les autres, comme @code{asdf-build-system/sbcl}, +installent des binaires au format qu'un implémentation particulière +comprend. Ces systèmes de constructions peuvent aussi être utilisés pour +produire des programmes exécutables ou des images lisp qui contiennent un +ensemble de paquets pré-chargés. -@noindent -Dans cet exemple, le module @code{(guix build utils)} est automatiquement -récupéré dans l'environnement de construction isolé de notre gexp, pour que -@code{(use-modules (guix build utils))} fonctionne comme on s'y attendrait. +Le système de construction utilise des conventions de nommage. Pour les +paquets binaires, le nom du paquet devrait être préfixé par l'implémentation +lisp, comme @code{sbcl-} pour @code{asdf-build-system/sbcl}. -@cindex closure de module -@findex source-module-closure -Typiquement, vous voudriez que la @emph{closure} complète du mondule soit -importé — c.-à-d.@: le module lui-même et tous les modules dont il dépend — -plutôt que seulement le module ; sinon, une tentative de chargement du -module échouera à cause des modules dépendants manquants. La procédure -@code{source-module-closure} calcule la closure d'un module en cherchant -dans ses en-têtes sources, ce qui est pratique dans ce cas : +En plus, le paquet source correspondant devrait étiquetté avec la même +convention que les paquets python (voir @ref{Modules python}), avec le +préfixe @code{cl-}. -@example -(use-modules (guix modules)) ;pour 'source-module-closure' +Pour les paquets binaires, chaque système devrait être défini comme un +paquet Guix. Si un paquet @code{origine} contient plusieurs systèmes, on +peut créer des variantes du paquet pour construire tous les systèmes. Les +paquets sources, qui utilisent @code{asdf-build-system/source}, peuvent +contenir plusieurs systèmes. -(with-imported-modules (source-module-closure - '((guix build utils) - (gnu build vm))) - (gexp->derivation "something-with-vms" - #~(begin - (use-modules (guix build utils) - (gnu build vm)) - @dots{}))) -@end example +Pour créer des programmes exécutables et des images, les procédures côté +construction @code{build-program} et @code{build-image} peuvent être +utilisées. Elles devraient être appelées dans une phase de construction +après la phase @code{create-symlinks} pour que le système qui vient d'être +construit puisse être utilisé dans l'image créée. @code{build-program} +requiert une liste d'expressions Common Lisp dans l'argument +@code{#:entry-program}. -@cindex extensions, des gexps -@findex with-extensions -Dans la même idée, parfois vous pouvez souhaiter importer non seulement des -modules en Scheme pur, mais aussi des « extensions » comme des liaisons -Guile de bibliothèques C ou d'autres paquet « complets ». Disons que vous -voulez utiliser le paquet @code{guile-json} du côté de la construction, -voici comme procéder : +Si le système n'est pas défini dans son propre fichier @code{.asd} du même +nom, alors le paramètre @code{#:asd-file} devrait être utilisé pour +spécifier dans quel fichier le système est défini. De plus, si le paquet +défini un système pour ses tests dans un fichier séparé, il sera chargé +avant que les tests ne soient lancés s'il est spécifié par le paramètre +@code{#:test-asd-file}. S'il n'est pas spécifié, les fichiers +@code{-tests.asd}, @code{-test.asd}, @code{tests.asd} et +@code{test.asd} seront testés. -@example -(use-modules (gnu packages guile)) ;pour 'guile-json' +Si pour quelque raison que ce soit le paquet doit être nommé d'une manière +différente de ce que la convention de nommage suggère, le paramètre +@code{#:asd-system-name} peut être utilisé pour spécifier le nom du système. -(with-extensions (list guile-json) - (gexp->derivation "something-with-json" - #~(begin - (use-modules (json)) - @dots{}))) -@end example +@end defvr -La forme syntaxique pour construire des gexps est résumée ci-dessous. +@defvr {Variable Scheme} cargo-build-system +@cindex Langage de programmation Rust +@cindex Cargo (système de construction Rust) +Cette variable est exportée par @code{(guix build-system cargo)}. Elle +supporte les construction de paquets avec Cargo, le système de construction +du @uref{https://www.rust-lang.org, langage de programmation Rust}. -@deffn {Syntaxe Scheme} #~@var{exp} -@deffnx {Syntaxe Scheme} (gexp @var{exp}) -Renvoie une G-expression contenant @var{exp}. @var{exp} peut contenir une -ou plusieurs de ces formes : +Dans sa phase @code{configure}, ce système de construction remplace les +dépendances spécifiées dans le fichier @file{Cargo.toml} par des paquets +Guix. La phase @code{install} installe les binaires et installe aussi le +code source et le fichier @file{Cargo.toml}. +@end defvr -@table @code -@item #$@var{obj} -@itemx (ungexp @var{obj}) -Introduit une référence à @var{obj}. @var{obj} peut être d'un des types -supportés, par exemple un paquet ou une dérivation, auquel cas la forme -@code{ungexp} est remplacée par le nom de fichier de sa sortie — p.@: ex.@: -@code{"/gnu/store/@dots{}-coreutils-8.22}. +@cindex Clojure (langage de programmation) +@cindex système de construction Clojure simple +@defvr {Variable Scheme} clojure-build-system +Cette variable est exportée par @code{(guix build-system clojure)}. Elle +implémente une procédure de construction des paquets simple qui utilise le +bon vieux @code{compile} de Clojure. La compilation croisée n'est pas +encore supportée. -Si @var{boj} est une liste, elle est traversée et les références aux objets -supportés sont substitués de manière similaire. +Elle ajoute @code{clojure}, @code{icedtea} et @code{zip} à l'ensemble des +entrées. Des paquets différents peuvent être spécifiés avec les paramètres +@code{#:clojure}, @code{#:jdk} et @code{#:zip}. -Si @var{obj} est une autre gexp, son contenu est inséré et ses dépendances -sont ajoutées à celle de la gexp qui l'entoure. +Une liste de répertoires sources, de répertoires de tests et de noms de jar +peuvent être spécifiés avec les paramètres @code{#:source-dirs}, +@code{#:test-dirs} et @code{#:jar-names}. Le répertoire de construction est +la classe principale peuvent être spécifiés avec les paramètres +@code{#:compile-dir} et @code{#:main-class}. Les autres paramètres sont +documentés plus bas. -Si @var{obj} est un autre type d'objet, il est inséré tel quel. +Ce système de construction est une extension de @var{ant-build-system}, mais +avec les phases suivantes modifiées : -@item #$@var{obj}:@var{output} -@itemx (ungexp @var{obj} @var{output}) -Cette forme est similaire à la précédente, mais se réfère explicitement à la -sortie @var{output} de l'objet @var{obj} — c'est utile lorsque @var{obj} -produit plusieurs sorties (@pxref{Des paquets avec plusieurs résultats}). +@table @code -@item #+@var{obj} -@itemx #+@var{obj}:output -@itemx (ungexp-native @var{obj}) -@itemx (ungexp-native @var{obj} @var{output}) -Comme @code{ungexp}, mais produit une référence à la construction -@emph{native} de @var{obj} lorsqu'elle est utilisée dans une compilation -croisée. +@item build +Cette phase appelle @code{compile} en Clojure pour compiler les fichiers +sources et lance @command{jar} pour créer les fichiers jar à partir des +fichiers sources et des fichiers compilés en suivant la liste d'inclusion et +d'exclusion spécifiées dans @code{#:aot-include} et @code{#:aot-exclude}. +La liste d'exclusion a la priorité sur la liste d'inclusion. Ces listes +consistent en des symboles représentant des bibliothèque Clojure ou le mot +clef spécial @code{#:all}, représentant toutes les bibliothèques Clojure +trouvées dans les répertoires des sources. Le paramètre +@code{#:omit-source?} décide si les sources devraient être incluses dans les +fichiers jar. -@item #$output[:@var{output}] -@itemx (ungexp output [@var{output}]) -Insère une référence à la sortie @var{output} de la dérivation, ou à la -sortie principale lorsque @var{output} est omis. +@item check +Cette phase lance les tests en suivant les liste d'inclusion et d'exclusion +spécifiées dans @code{#:test-include} et @code{#:test-exclude}. Leur +signification est analogue à celle de @code{#:aot-include} et +@code{#:aot-exclude}, sauf que le mot-clef spécial @code{#:all} signifie +maintenant toutes les bibliothèques Clojure trouvées dans les répertoires de +tests. Le paramètre @code{#:tests?} décide si les tests devraient être +lancés. -Cela ne fait du sens que pour les gexps passées à @code{gexp->derivation}. +@item install +Cette phase installe tous les fichiers jar précédemment construits. +@end table -@item #$@@@var{lst} -@itemx (ungexp-splicing @var{lst}) -Comme au dessus, mais recolle (@i{splice}) le contenu de @var{lst} dans la -liste qui la contient. +En dehors de cela, le système de construction contient aussi la phase +suivante : -@item #+@@@var{lst} -@itemx (ungexp-native-splicing @var{lst}) -Comme au dessus, mais se réfère à la construction native des objets listés -dans @var{lst}. +@table @code +@item install-doc +Cette phase installe tous les fichiers dans le répertoire de plus haut +niveau dont le nom correspond à @var{%doc-regex}. On peut spécifier une +regex différente avec le paramètre @code{#:doc-regex}. Tous les fichiers +(récursivement) dans les répertoires de documentations spécifiés dans +@code{#:doc-dirs} sont aussi installés. @end table +@end defvr -Les G-expressions crées par @code{gexp} ou @code{#~} sont des objets à -l'exécution du type @code{gexp?} (voir plus bas). -@end deffn +@defvr {Variable Scheme} cmake-build-system +Cette variable est exportée par @code{(guix build-system cmake)}. Elle +implémente la procédure de construction des paquets qui utilisent +l'@url{http://www.cmake.org, outil de construction CMake}. -@deffn {Syntaxe Scheme} with-imported-modules @var{modules} @var{body}@dots{} -Marque les gexps définies dans @var{body}@dots{} comme requérant -@var{modules} dans leur environnement d'exécution. +Elle ajoute automatiquement le paquet @code{cmake} à l'ensemble des +entrées. Le paquet utilisé peut être spécifié par le paramètre +@code{#:cmake}. -Chaque élément dans @var{module} peut être le nom d'un module, comme -@code{(guix build utils)} ou le nom d'un module suivi d'une flêche, suivie -d'un objet simili-fichier : +Le paramètre @code{#:configure-flags} est pris comme une liste de drapeaux à +passer à la commande @command{cmake}. Le paramètre @code{#:build-type} +spécifie en termes abstrait les drapeaux passés au compilateur ; sa valeur +par défaut est @code{"RelWithDebInfo"} (ce qui veut dire « mode public avec +les informations de débogage » en plus court), ce qui signifie en gros que +le code sera compilé avec @code{-O2 -g} comme pour les paquets autoconf par +défaut. +@end defvr -@example -`((guix build utils) - (guix gcrypt) - ((guix config) => ,(scheme-file "config.scm" - #~(define-module @dots{})))) -@end example +@defvr {Scheme Variable} dune-build-system +This variable is exported by @code{(guix build-system dune)}. It supports +builds of packages using @uref{https://dune.build/, Dune}, a build tool for +the OCaml programming language. It is implemented as an extension of the +@code{ocaml-build-system} which is described below. As such, the +@code{#:ocaml} and @code{#:findlib} parameters can be passed to this build +system. -@noindent -Dans l'exemple au dessus, les deux premiers modules sont récupérés dans le -chemin de recherche, et le dernier est créé à partir d'un objet -simili-fichier. +It automatically adds the @code{dune} package to the set of inputs. Which +package is used can be specified with the @code{#:dune} parameter. -Cette forme a une portée @emph{lexicale} : elle a un effet sur les gexp -directement définies dans @var{body}@dots{}, mais pas sur celles définies -dans des procédures appelées par @var{body}@dots{}. -@end deffn +There is no @code{configure} phase because dune packages typically don't +need to be configured. The @code{#:build-flags} parameter is taken as a +list of flags passed to the @code{dune} command during the build. -@deffn {Syntaxe Scheme} with-extensions @var{extensions} @var{body}@dots{} -Marque les gexps définies dans @var{body}@dots{} comme requérant -@var{extensions} dans leur environnement de construction et d'exécution. -@var{extensions} est typiquement une liste d'objets paquets comme définis -dans le module @code{(gnu packages guile)}. +The @code{#:jbuild?} parameter can be passed to use the @code{jbuild} +command instead of the more recent @code{dune} command while building a +package. Its default value is @code{#f}. +@end defvr -Concrètement, les paquets listés dans @var{extensions} sont ajoutés au -chemin de chargement lors de la compilation des modules importés dans -@var{body}@dots{} ; ils sont aussi ajoutés au chemin de chargement de la -gexp renvoyée par @var{body}@dots{}. -@end deffn +@defvr {Variable Scheme} go-build-system +Cette variable est exportée par @code{(guix build-system go)}. Elle +implémente la procédure pour les paquets Go utilisant les +@url{https://golang.org/cmd/go/#hdr-Compile_packages_and_dependencies, +mécanismes de construction Go} standard. -@deffn {Procédure Scheme} gexp? @var{obj} -Renvoie @code{#t} si @var{obj} est une G-expression. -@end deffn +L'utilisateur doit fournir une valeur à la clef @code{#:import-path} et, +dans certains cas, @code{#:unpack-path}. Le +@url{https://golang.org/doc/code.html#ImportPaths, chemin d'import} +correspond au chemin dans le système de fichiers attendu par le script de +construction du paquet et les paquets qui s'y réfèrent et fournit une +manière unique de se référer à un paquet Go. Il est typiquement basé sur +une combinaison de l'URI du code source du paquet et d'une structure +hiérarchique du système de fichier. Dans certains cas, vous devrez extraire +le code source du paquet dans une structure de répertoires différente que +celle indiquée par le chemin d'import et @code{#:unpack-path} devrait être +utilisé dans ces cas-là. -Les G-expressions sont conçues pour être écrites sur le disque, soit en tant -que code pour construire une dérivation, soit en tant que fichier normal -dans le dépôt. Les procédure monadiques suivantes vous permettent de faire -cela (@pxref{La monad du dépôt}, pour plus d'information sur les monads). +Les paquets qui fournissent des bibliothèques Go devraient être installées +avec leur code source. La clef @code{#:install-soruce?}, qui vaut @code{#t} +par défaut, contrôle l'installation du code source. Elle peut être mise à +@code{#f} pour les paquets qui ne fournissent que des fichiers exécutables. +@end defvr -@deffn {Procédure monadique} gexp->derivation @var{name} @var{exp} @ - [#:system (%current-system)] [#:target #f] [#:graft? #t] @ -[#:hash #f] [#:hash-algo #f] @ -[#:recursive? #f] [#:env-vars '()] [#:modules '()] @ -[#:module-path @var{%load-path}] @ -[#:effective-version "2.2"] @ -[#:references-graphs #f] [#:allowed-references #f] @ -[#:disallowed-references #f] @ [#:leaked-env-vars #f] @ -[#:script-name (string-append @var{name} "-builder")] @ -[#:deprecation-warnings #f] @ -[#:local-build? #f] [#:substitutable? #t] @ -[#:properties '()] [#:guile-for-build #f] -Renvoie une dérivation @var{name} qui lance @var{exp} (une gexp) avec -@var{guile-for-build} (une dérivation) sur @var{system} ; @var{exp} est -stocké dans un fichier appelé @var{script-name}. Lorsque @var{target} est -vraie, elle est utilisée comme triplet de cible de compilation croisée pour -les paquets référencés par @var{exp}. +@defvr {Variable Scheme} glib-or-gtk-build-system +Cette variable est exportée par @code{(guix build-system glib-or-gtk)}. +Elle est conçue pour être utilisée par des paquets qui utilisent GLib ou +GTK+. -@var{modules} est devenu obsolète en faveur de -@code{with-imported-modules}. Sa signification est de rendre @var{modules} -disponibles dans le contexte d'évaluation de @var{exp} ; @var{modules} est -une liste de noms de modules Guile qui sont cherchés dans @var{module-path} -pour les copier dans le dépôt, les compiler et les rendre disponibles dans -le chemin de chargement pendant l'exécution de @var{exp} — p.@: ex.@: -@code{((guix build utils) (guix build gnu-build-system))}. +Ce système de construction ajoute les deux phases suivantes à celles +définies par @var{gnu-build-system} : -@var{effective-version} détermine la chaîne à utiliser lors d'ajout -d'extensions de @var{exp} (voir @code{with-extensions}) au chemin de -recherche — p.@: ex.@: @code{"2.2"}. +@table @code +@item glib-or-gtk-wrap +La phase @code{glib-or-gtk-wrap} s'assure que les programmes dans +@file{bin/} sont capable de trouver les « schemas » GLib et les +@uref{https://developer.gnome.org/gtk3/stable/gtk-running.html, modules +GTK+}. Ceci est fait en enveloppant les programmes dans des scripts de +lancement qui initialisent correctement les variables d'environnement +@code{XDG_DATA_DIRS} et @code{GTK_PATH}. -@var{graft?} détermine si les paquets référencés par @var{exp} devraient -être greffés si possible. +Il est possible d'exclure des sorties spécifiques de ce processus +d'enveloppage en listant leur nom dans le paramètre +@code{#:glib-or-gtk-wrap-excluded-outputs}. C'est utile lorsqu'une sortie +est connue pour ne pas contenir de binaires GLib ou GTK+, et où l'enveloppe +ajouterait une dépendance inutile vers GLib et GTK+. -Lorsque @var{references-graphs} est vrai, il doit s'agir d'une liste de -tuples de la forme suivante : +@item glib-or-gtk-compile-schemas +La phase @code{glib-or-gtk-compile-schemas} s'assure que tous les +@uref{https://developer.gnome.org/gio/stable/glib-compile-schemas.html, +schémas GSettings} de GLib sont compilés. La compilation est effectuée par +le programme @command{glib-compile-schemas}. Il est fournit par le paquet +@code{glib:bin} qui est automatiquement importé par le système de +construction. Le paquet @code{glib} qui fournit +@command{glib-compile-schemas} peut être spécifié avec le paramètre +@code{#:glib}. +@end table -@example -(@var{file-name} @var{package}) -(@var{file-name} @var{package} @var{output}) -(@var{file-name} @var{derivation}) -(@var{file-name} @var{derivation} @var{output}) -(@var{file-name} @var{store-item}) -@end example +Ces deux phases sont exécutées après la phase @code{install}. +@end defvr -La partie droite des éléments de @var{references-graphs} est automatiquement -transformée en une entrée du processus de construction @var{exp}. Dans -l'environnement de construction, chaque @var{file-name} contient le graphe -des références de l'élément correspondant, dans un format texte simple. +@defvr {Variable Scheme} guile-build-system +Ce système de construction sert aux paquets Guile qui consistent +exclusivement en code Scheme et qui sont si simple qu'ils n'ont même pas un +makefile, sans parler d'un script @file{configure}. Il compile le code +Scheme en utilisant @command{guild compile} (@pxref{Compilation,,, guile, +GNU Guile Reference Manual}) et installe les fichiers @file{.scm} et +@file{.go} aux bons emplacements. Il installe aussi la documentation. -@var{allowed-references} doit soit être @code{#f}, soit une liste de noms de -sorties ou de paquets. Dans ce dernier cas, la liste dénote les éléments du -dépôt auxquels le résultat a le droit de faire référence. Toute référence à -un autre élément du dépôt conduira à une erreur à la construction. Comme -pour @var{disallowed-references}, qui peut lister des éléments qui ne -doivent pas être référencés par les sorties. +Ce système de construction supporte la compilation croisée en utilisant +l'option @code{--target} de @command{guild compile}. -@var{deprecation-warnings} détermine s'il faut afficher les avertissement -d'obsolescence à la compilation de modules. Il peut valoir @code{#f}, -@code{t} ou @code{'detailed}. +Les paquets construits avec @code{guile-build-system} doivent fournir un +paquet Guile dans leur champ @code{native-inputs}. +@end defvr -Les autres arguments sont les mêmes que pour @code{derivation} -(@pxref{Dérivations}). -@end deffn +@defvr {Variable Scheme} minify-build-system +Cette variable est exportée par @code{(guix build-system minify)}. Elle +implémente une procédure de minification pour des paquets JavaScript +simples. -@cindex objets simili-fichiers -Les procédures @code{local-file}, @code{plain-file}, @code{computed-file}, -@code{program-file} et @code{scheme-file} ci-dessous renvoient des -@dfn{objets simili-fichiers}. C'est-à-dire, lorsqu'ils sont unquotés dans -une G-expression, ces objets donnent un fichier dans le dépôt. Considérez -cette G-expression : +Elle ajoute @code{uglify-js} à l'ensemble des entrées et l'utilise pour +compresser tous les fichiers JavaScript du répertoire @file{src}. Un +minifieur différent peut être spécifié avec le paramètre @code{#:uglify-js} +mais il est attendu que ce paquet écrive le code minifié sur la sortie +standard. -@example -#~(system* #$(file-append glibc "/sbin/nscd") "-f" - #$(local-file "/tmp/my-nscd.conf")) -@end example +Lorsque les fichiers JavaScript d'entrée ne sont pas situés dans le +répertoire @file{src}, le paramètre @code{#:javascript-files} peut être +utilisé pour spécifier une liste de noms de fichiers à donner au minifieur. +@end defvr -Ici, l'effet est « d'internaliser » @file{/tmp/my-nscd.conf} en le copiant -dans le dépôt. Une fois étendu, par exemple via @code{gexp->derivation}, la -G-expression se réfère à cette copie dans @file{/gnu/store} ; ainsi, -modifier ou supprimer le fichier dans @file{/tmp} n'a aucun effet sur ce que -fait la G-expression. @code{plain-file} peut être utilisé de la même -manière ; elle est seulement différente par le fait que le contenu du -fichier est passé directement par une chaîne de caractères. +@defvr {Variable Scheme} ocaml-build-system +Cette variable est exportée par @code{(guix build-system ocaml)}. Elle +implémente une procédure de construction pour les paquets +@uref{https://ocaml.org, OCaml} qui consiste à choisir le bon ensemble de +commande à lancer pour chaque paquet. Les paquets OCaml peuvent demander +des commandes diverses pour être construit. Ce système de construction en +essaye certaines. -@deffn {Procédure Scheme} local-file @var{file} [@var{name}] @ - [#:recursive? #f] [#:select? (const #t)] -Renvoie un objet représentant un fichier local @var{file} à ajouter au dépôt -; cet objet peut être utilisé dans une gexp. Si @var{file} est un nom de -fichier relatif, il est récupéré à partir de la position du fichier source -dans lequel il apparaît. @var{file} sera ajouté au dépôt sous le nom -@var{name} — par défaut le nom de base de @var{file}. +Lorsqu'un fichier @file{setup.ml} est présent dans le répertoire de plus +haut niveau, elle lancera @code{ocaml setup.ml -configure}, @code{ocaml +setup.ml -build} et @code{ocaml setup.ml -install}. Le système de +construction supposera que ces fichiers ont été générés par +@uref{http://oasis.forge.ocamlcore.org/, OASIS} et prendra soin +d'initialiser le préfixe et d'activer les tests s'ils ne sont pas +désactivés. Vous pouvez passer des drapeaux de configuration et de +construction avec @code{#:configure-flags} et @code{#:build-flags}. La clef +@code{#:test-flags} peut être passée pour changer l'ensemble des drapeaux +utilisés pour activer les tests. La clef @code{#:use-make?} peut être +utilisée pour outrepasser ce système dans les phases de construction et +d'installation. + +Lorsque le paquet a un fichier @file{configure}, il est supposé qu'il s'agit +d'un script configure écrit à la main qui demande un format différent de +celui de @code{gnu-build-system}. Vous pouvez ajouter plus de drapeaux avec +la clef @code{#:configure-flags}. -Lorsque @var{recursive?} est vraie, le contenu de @var{file} est ajouté -récursivement ; si @var{file} désigne un fichier simple et que -@var{recursive?} est vrai, son contenu est ajouté et ses bits de permissions -sont préservés. +Lorsque le paquet a un fichier @file{Makefile} (ou @code{#:use-make?} vaut +@code{#t}), il sera utilisé et plus de drapeaux peuvent être passés à la +construction et l'installation avec la clef @code{#:make-flags}. -Lorsque @var{recursive?} est vraie, appelle @code{(@var{select?} @var{file} -@var{stat})} pour chaque répertoire où @var{file} est le nom de fichier -absolu de l'entrée et @var{stat} est le résultat de @code{lstat} ; à -l'exception des entrées pour lesquelles @var{select?} ne renvoie pas vrai. +Enfin, certains paquets n'ont pas ces fichiers mais utilisent un emplacement +plus ou moins standard pour leur système de construction. Dans ce cas, le +système de construction lancera @code{ocaml pkg/pkg.ml} ou +@code{pkg/build.ml} et prendra soin de fournir le chemin du module findlib +requis. Des drapeaux supplémentaires peuvent être passés via la clef +@code{#:bulid-flags}. L'installation se fait avec +@command{opam-installer}. Dans ce cas, le paquet @code{opam} doit être +ajouté au champ @code{native-inputs} de la définition du paquet. -C'est la version déclarative de la procédure monadique @code{interned-file} -(@pxref{La monad du dépôt, @code{interned-file}}). -@end deffn +Remarquez que la plupart des paquets OCaml supposent qu'ils seront installés +dans le même répertoire qu'OCaml, ce qui n'est pas ce que nous voulons faire +dans Guix. En particulier, ils installeront leurs fichiers @file{.so} dans +leur propre répertoire de module, ce qui est normalement correct puisqu'il +s'agit du répertoire du compilateur OCaml. Dans Guix en revanche, le +bibliothèques ne peuvent pas y être trouvées et on utilise +@code{CAML_LD_LIBRARY_PATH} à la place. Cette variable pointe vers +@file{lib/ocaml/site-lib/stubslibs} et c'est là où les bibliothèques +@file{.so} devraient être installées. +@end defvr -@deffn {Procédure Scheme} plain-file @var{name} @var{content} -Renvoie un objet représentant un fichier texte nommé @var{name} avec pour -contenu @var{content} (une chaîne de caractères ou un vecteur d'octets) à -ajouter un dépôt. +@defvr {Variable Scheme} python-build-system +Cette variable est exportée par @code{(guix build-system python)}. Elle +implémente la procédure de construction plus ou moins standard utilisée pour +les paquets Python, qui consiste à lancer @code{python setup.py build} puis +@code{python setup.py install --prefix=/gnu/store/@dots{}}. -C'est la version déclarative de @code{text-file}. -@end deffn +Pour les paquets qui installent des programmes autonomes dans @code{bin/}, +elle prend soin d'envelopper ces binaires pour que leur variable +d'environnement @code{PYTHONPATH} pointe vers toutes les bibliothèques +Python dont ils dépendent. -@deffn {Procédure Scheme} computed-file @var{name} @var{gexp} @ - [#:options '(#:local-build? #t)] -Renvoie un objet représentant un élément du dépôt @var{name}, un fichier ou -un répertoire calculé par @var{gexp}. @var{options} est une liste -d'arguments supplémentaires à passer à @code{gexp->derivation}. +Le paquet Python utilisé pour effectuer la construction peut être spécifié +avec le paramètre @code{#:python}. C'est une manière utile de forcer un +paquet à être construit avec une version particulière de l'interpréteur +python, ce qui peut être nécessaire si le paquet n'est compatible qu'avec +une version de l'interpréteur. -C'est la version déclarative de @code{gexp->derivation}. -@end deffn +Par défaut Guix appelle @code{setup.py} sous le contrôle de +@code{setuptools}, comme le fait @command{pip}. Certains paquets ne sont +pas compatibles avec setuptools (et pip), ainsi vous pouvez désactiver cela +en mettant le paramètre @code{#:use-setuptools} à @code{#f}. +@end defvr -@deffn {Procédure monadique} gexp->script @var{name} @var{exp} @ - [#:guile (default-guile)] [#:module-path %load-path] -Renvoie un script exécutable @var{name} qui lance @var{exp} avec -@var{guile}, avec les modules importés de @var{exp} dans son chemin de -recherche. Cherche les modules de @var{exp} dans @var{module-path}. +@defvr {Variable Scheme} perl-build-system +Cette variable est exportée par @code{(guix build-system perl)}. Elle +implémente la procédure de construction standard des paquets Perl, qui +consiste soit à lancer @code{perl Build.PL --prefix=/gnu/store/@dots{}}, +suivi de @code{Build} et @code{Build install} ; ou à lancer @code{perl +Makefile.PL PREFIX=/gnu/store/@dots{}}, suivi de @code{make} et @code{make +install}, en fonction de la présence de @code{Build.PL} ou +@code{Makefile.PL} dans la distribution du paquet. Le premier a la +préférence si @code{Build.PL} et @code{Makefile.PL} existent tous deux dans +la distribution du paquet. Cette préférence peut être inversée en +spécifiant @code{#t} pour le paramètre @code{#:make-maker?}. -L'exemple ci-dessous construit un script qui invoque simplement la commande -@command{ls} : +L'invocation initiale de @code{perl Makefile.PL} ou @code{perl Build.PL} +passe les drapeaux spécifiés par le paramètre @code{#:make-maker-flags} ou +@code{#:module-build-flags}, respectivement. -@example -(use-modules (guix gexp) (gnu packages base)) +Le paquet Perl utilisé peut être spécifié avec @code{#:perl}. +@end defvr -(gexp->script "list-files" - #~(execl #$(file-append coreutils "/bin/ls") - "ls")) -@end example +@defvr {Variable Scheme} r-build-system +Cette variable est exportée par @code{(guix build-system r)}. Elle +implémente la procédure de construction utilisée par les paquets +@uref{http://r-project.org, R} qui consiste à lancer à peine plus que +@code{R CMD INSTALL --library=/gnu/store/@dots{}} dans un environnement où +@code{R_LIBS_SITE} contient les chemins de toutes les entrées R. Les tests +sont lancés après l'installation avec la fonction R +@code{tools::testInstalledPackage}. +@end defvr -Lorsqu'elle est « lancée » à travers le dépôt (@pxref{La monad du dépôt, -@code{run-with-store}}), on obtient une dérivation qui produit une fichier -exécutable @file{/gnu/store/@dots{}-list-files} qui ressemble à : +@defvr {Variable Scheme} texlive-build-system +Cette variable est exportée par @code{(guix build-system texlive)}. Elle +est utilisée pour construire des paquets TeX en mode batch avec le moteur +spécifié. Le système de construction initialise la variable +@code{TEXINPUTS} pour trouver tous les fichiers source TeX dans ses entrées. -@example -#!/gnu/store/@dots{}-guile-2.0.11/bin/guile -ds -!# -(execl "/gnu/store/@dots{}-coreutils-8.22"/bin/ls" "ls") -@end example -@end deffn +Par défaut, elle lance @code{luatex} sur tous les fichiers qui se terminent +par @code{ins}. Un moteur et un format différent peuvent être spécifiés +avec l'argument @code{#:tex-format}. Plusieurs cibles de constructions +peuvent être indiquées avec l'argument @code{#:build-targets} qui attend une +liste de noms de fichiers. Le système de construction ajoute uniquement +@code{texlive-bin} et @code{texlive-latex-base} (de @code{(gnu packages +tex)} à la liste des entrées. Les deux peuvent être remplacés avec les +arguments @code{#:texlive-bin} et @code{#:texlive-latex-base}, +respectivement. -@deffn {Procédure Scheme} program-file @var{name} @var{exp} @ - [#:guile #f] [#:module-path %load-path] -Renvoie un objet représentant un élément du dépôt @var{name} qui lance -@var{gexp}. @var{guile} est le paquet Guile à utiliser pour exécuter le -script. Les modules importés par @var{gexp} sont recherchés dans -@var{module-path}. +Le paramètre @code{#:tex-directory} dit au système de construction où +installer les fichiers construit dans l'arbre texmf. +@end defvr -C'est la version déclarative de @code{gexp->script}. -@end deffn +@defvr {Variable Scheme} ruby-build-system +Cette variable est exportée par @code{(guix build-system ruby)}. Elle +implémenter la procédure de construction RubyGems utilisée par les paquets +Ruby qui consiste à lancer @code{gem build} suivi de @code{gem install}. -@deffn {Procédure monadique} gexp->file @var{name} @var{exp} @ - [#:set-load-path? #t] [#:module-path %load-path] @ -[#:splice? #f] @ -[#:guile (default-guile)] -Renvoie une dérivation qui construit un fichier @var{name} contenant -@var{exp}. Lorsque @var{splice?} est vrai, @var{exp} est considéré comme -une liste d'expressions qui seront splicée dans le fichier qui en résulte. +Le champ @code{source} d'un paquet qui utilise ce système de construction +référence le plus souvent une archive gem, puisque c'est le format utilisé +par les développeurs Ruby quand ils publient leur logiciel. Le système de +construction décompresse l'archive gem, éventuellement en corrigeant les +sources, lance la suite de tests, recompresse la gemme et l'installe. En +plus, des répertoires et des archives peuvent être référencés pour permettre +de construire des gemmes qui n'ont pas été publiées depuis Git ou une +archive de sources traditionnelle. -Lorsque @var{set-load-path?} est vrai, émet du code dans le fichier de -résultat pour initialiser @code{%load-path} et @code{%load-compiled-path} -pour honorer les modules importés de @var{exp}. Les modules de @var{exp} -sont trouvés dans @var{module-path}. +Le paquet Ruby utilisé peut être spécifié avec le paramètre @code{#:ruby}. +Une liste de drapeaux supplémentaires à passer à la commande @command{gem} +peut être spécifiée avec le paramètre @code{#:gem-flags}. +@end defvr -Le fichier qui en résulte retient les références à toutes les dépendances de -@var{exp} ou un sous-ensemble. -@end deffn +@defvr {Variable Scheme} waf-build-system +Cette variable est exportée par @code{(guix build-system waf)}. Elle +implémente une procédure de construction autour du script @code{waf}. Les +phases usuelles — @code{configure}, @code{build} et @code{install} — sont +implémentée en passant leur nom en argument au script @code{waf}. -@deffn {Procédure Scheme} scheme-file @var{name} @var{exp} [#:splice? #f] -Renvoie un objet représentant le fichier Scheme @var{name} qui contient -@var{exp}. +Le script @code{waf} est exécuté par l'interpréteur Python. Le paquet +Python utilisé pour lancer le script peut être spécifié avec le paramètre +@code{#:python}. +@end defvr -C'est la version déclarative de @code{gexp->file}. -@end deffn +@defvr {Variable Scheme} scons-build-system +Cette variable est exportée par @code{(guix build-system scons)}. Elle +implémente la procédure de construction utilisée par l'outil de construction +SCons. Ce système de construction lance @code{scons} pour construire le +paquet, @code{scons test} pour lancer les tests puis @code{scons install} +pour installer le paquet. -@deffn {Procédure monadique} text-file* @var{name} @var{text} @dots{} -Renvoie une valeur monadique qui construit un ficher texte contenant -@var{text}. @var{text} peut lister, en plus de chaînes de caractères, des -objet de n'importe quel type qui peut être utilisé dans une gexp : des -paquets, des dérivations, des fichiers objet locaux, etc. Le fichier du -dépôt qui en résulte en retient toutes les références. +On peut passer des drapeaux supplémentaires à @code{scons} en les spécifiant +avec le paramètre @code{#:scons-flags}. La version de python utilisée pour +lancer SCons peut être spécifiée en sélectionnant le paquet SCons approprié +avec le paramètre @code{#:scons}. +@end defvr -Cette variante devrait être préférée à @code{text-file} lorsque vous -souhaitez créer des fichiers qui référencent le dépôt. Cela est le cas -typiquement lorsque vous construisez un fichier de configuration qui -contient des noms de fichiers du dépôt, comme ceci : +@defvr {Variable Scheme} haskell-build-system +Cette variable est exportée par @code{(guix build-system haskell)}. Elle +implémente la procédure de construction Cabal utilisée par les paquets +Haskell, qui consiste à lancer @code{runhaskell Setup.hs configure +--prefix=/gnu/store/@dots{}} et @code{runhaskell Setup.hs build}. Plutôt +que d'installer le paquets en lançant @code{runhaskell Setup.hs install}, +pour éviter d'essayer d'enregistrer les bibliothèques dans le répertoire du +dépôt en lecture-seule du compilateur, le système de construction utilise +@code{runhaskell Setup.hs copy}, suivi de @code{runhaskell Setup.hs +register}. En plus, le système de construction génère la documentation du +paquet en lançant @code{runhaskell Setup.hs haddock}, à moins que +@code{#:haddock? #f} ne soit passé. Des paramètres facultatifs pour Haddock +peuvent être passés à l'aide du paramètre @code{#:haddock-flags}. Si le +fichier @code{Setup.hs} n'est pas trouvé, le système de construction +cherchera @code{Setup.lhs} à la place. -@example -(define (profile.sh) - ;; Renvoie le nom d'un script shell dans le dépôt qui initialise - ;; la variable d'environnement « PATH ». - (text-file* "profile.sh" - "export PATH=" coreutils "/bin:" - grep "/bin:" sed "/bin\n")) -@end example +Le compilateur Haskell utilisé peut être spécifié avec le paramètre +@code{#:haskell} qui a pour valeur par défaut @code{ghc}. +@end defvr -Dans cet exemple, le fichier @file{/gnu/store/@dots{}-profile.sh} qui en -résulte référence @var{coreutils}, @var{grep} et @var{sed}, ce qui les -empêche d'être glanés tant que le script est accessible. -@end deffn +@defvr {Variable Scheme} dub-build-system +Cette variable est exportée par @code{(guix build-system dub)}. Elle +implémente la procédure de construction Dub utilisée par les paquets D qui +consiste à lancer @code{dub build} et @code{dub run}. L'installation est +effectuée en copiant les fichiers manuellement. -@deffn {Procédure Scheme} mixed-text-file @var{name} @var{text} @dots{} -Renvoie un objet représentant le fichier du dépôt @var{name} contenant -@var{text}. @var{text} est une séquence de chaînes de caractères et de -fichiers simili-objets, comme dans : +Le compilateur D utilisé peut être spécifié avec le paramètre @code{#:ldc} +qui vaut par défaut @code{ldc}. +@end defvr -@example -(mixed-text-file "profile" - "export PATH=" coreutils "/bin:" grep "/bin") -@end example +@defvr {Variable Scheme} emacs-build-system +Cette variable est exportée par @code{(guix build-system emacs)}. Elle +implémente une procédure d'installation similaire au système de gestion de +paquet d'Emacs lui-même (@pxref{Packages,,, emacs, The GNU Emacs Manual}). + +Elle crée d'abord le fichier @code{@var{package}-autoloads.el}, puis compile +tous les fichiers Emacs Lisp en bytecode. Contrairement au système de +gestion de paquets d'Emacs, les fichiers de documentation info sont déplacés +dans le répertoire standard et le fichier @file{dir} est supprimé. Chaque +paquet est installé dans son propre répertoire dans +@file{share/emacs/site-lisp/guix.d}. +@end defvr -C'est la version déclarative de @code{text-file*}. -@end deffn +@defvr {Variable Scheme} font-build-system +This variable is exported by @code{(guix build-system font)}. It implements +an installation procedure for font packages where upstream provides +pre-compiled TrueType, OpenType, etc.@: font files that merely need to be +copied into place. It copies font files to standard locations in the output +directory. +@end defvr -@deffn {Procédure Scheme} file-union @var{name} @var{files} -Renvoie un @code{} qui construit un répertoire qui contient -tous les fichiers de @var{files}. Chaque élément de @var{files} doit être -une paire où le premier élément est le nom de fichier à utiliser dans le -nouveau répertoire et le second élément est une gexp dénotant le fichier -cible. Voici un exemple : +@defvr {Variable Scheme} meson-build-system +Cette variable est exportée par @code{(guix build-system meson)}. Elle +implémente la procédure de construction des paquets qui utilisent +@url{http://mesonbuild.com, Meson} comme système de construction. -@example -(file-union "etc" - `(("hosts" ,(plain-file "hosts" - "127.0.0.1 localhost")) - ("bashrc" ,(plain-file "bashrc" - "alias ls='ls --color=auto'")))) -@end example +Elle ajoute à la fois Meson et @uref{https://ninja-build.org/, Ninja} à +l'ensemble des entrées, et ils peuvent être modifiés avec les paramètres +@code{#:meson} et @code{#:ninja} si requis. Le Meson par défaut est +@code{meson-for-build}, qui est spécial parce qu'il ne nettoie pas le +@code{RUNPATH} des binaires et les bibliothèques qu'il installe. -Cela crée un répertoire @code{etc} contenant ces deux fichiers. -@end deffn +Ce système de construction est une extension de @var{gnu-build-system}, mais +avec les phases suivantes modifiées pour Meson : -@deffn {Procédure Scheme} directory-union @var{name} @var{things} -Renvoie un répertoire qui est l'union de @var{things}, où @var{things} est -une liste d'objets simili-fichiers qui dénotent des répertoires. Par exemple -: +@table @code -@example -(directory-union "guile+emacs" (list guile emacs)) -@end example +@item configure +La phase lance @code{meson} avec les drapeaux spécifiés dans +@code{#:configure-flags}. Le drapeau @code{--build-type} est toujours +initialisé à @code{plain} à moins que quelque chose d'autre ne soit spécifié +dans @code{#:build-type}. -crée un répertoire qui est l'union des paquets @code{guile} et @code{emacs}. -@end deffn +@item build +La phase lance @code{ninja} pour construire le paquet en parallèle par +défaut, mais cela peut être changé avec @code{#:parallel-build?}. -@deffn {Procédure Scheme} file-append @var{obj} @var{suffix} @dots{} -Renvoie un objet simili-fichier qui correspond à la concaténation de -@var{obj} et @var{suffix} où @var{obj} est un objet abaissable et chaque -@var{suffix} est une chaîne de caractères. +@item check +La phase lance @code{ninja} avec la cible spécifiée dans +@code{#:test-target}, qui est @code{"test"} par défaut. -Par exemple, considérez cette gexp : +@item install +La phase lance @code{ninja install} et ne peut pas être changée. +@end table -@example -(gexp->script "run-uname" - #~(system* #$(file-append coreutils - "/bin/uname"))) -@end example +En dehors de cela, le système de construction ajoute aussi la phase suivante +: -On peut obtenir le même effet avec : +@table @code -@example -(gexp->script "run-uname" - #~(system* (string-append #$coreutils - "/bin/uname"))) -@end example +@item fix-runpath +Cette phase s'assure que tous les binaire peuvent trouver les bibliothèques +dont ils ont besoin. Elle cherche les bibliothèques requises dans les +sous-répertoires du paquet en construction et les ajoute au @code{RUNPATH} +là où c'est nécessaire. Elle supprime aussi les références aux +bibliothèques laissées là par la phase de construction par +@code{meson-for-build} comme les dépendances des tests, qui ne sont pas +vraiment requises pour le programme. -Il y a une différence cependant : dans le cas @code{file-append}, le script -qui en résulte contient le nom de fichier absolu comme une chaîne de -caractère alors que dans le deuxième cas, le script contient une expression -@code{(string-append @dots{})} pour construire le nom de fichier @emph{à -l'exécution}. -@end deffn +@item glib-or-gtk-wrap +Cette phase est la phase fournie par @code{glib-or-gtk-build-system} et +n'est pas activée par défaut. Elle peut l'être avec @code{#:glib-or-gtk?}. +@item glib-or-gtk-compile-schemas +Cette phase est la phase fournie par @code{glib-or-gtk-build-system} et +n'est pas activée par défaut. Elle peut l'être avec @code{#:glib-or-gtk?}. +@end table +@end defvr -Bien sûr, en plus de gexps inclues dans le code « hôte », certains modules -contiennent des outils de construction. Pour savoir facilement qu'ils sont -à utiliser dans la strate de construction, ces modules sont gardés dans -l'espace de nom @code{(guix build @dots{})}. +Enfin, pour les paquets qui n'ont pas besoin de choses sophistiquées, un +système de construction « trivial » est disponible. Il est trivial dans le +sens où il ne fournit en gros aucun support : il n'apporte pas de dépendance +implicite, et n'a pas de notion de phase de construction. -@cindex abaissement, des objets haut-niveau dans les gepxs -En interne, les objets de haut-niveau sont @dfn{abaissés}, avec leur -compilateur, soit en des dérivations, soit en des objets du dépôt. Par -exemple, abaisser un paquet crée une dérivation, et abaisser un -@code{plain-file} crée un élément du dépôt. Cela est effectué par la -procédure monadique @code{lower-object}. +@defvr {Variable Scheme} trivial-build-system +Cette variable est exportée par @code{(guix build-system trivial)}. -@deffn {Procédure monadique} lower-object @var{obj} [@var{system}] @ - [#:target #f] -Renvoie la dérivation ou l'élément du dépôt comme une valeur de -@var{%store-monad} qui correspond à @var{obj} pour @var{system}, en -compilant de manière croisée pour @var{target} si @var{target} est vrai. -@var{obj} doit être un objet qui a un compilateur de gexp associé, comme un -@code{}. -@end deffn +Ce système de construction requiert un argument @code{#:builder}. Cet +argument doit être une expression Scheme qui construit la sortie du paquet — +comme avec @code{build-expression->derivation} (@pxref{Dérivations, +@code{build-expression->derivation}}). +@end defvr -@node Invoquer guix repl -@section Invoquer @command{guix repl} +@node Le dépôt +@section Le dépôt -@cindex REPL, read-eval-print loop -La commande @command{guix repl} démarre un @dfn{boucle -lecture-évaluation-affichage} Guile pour la programmation interactive -(@pxref{Using Guile Interactively,,, guile, GNU Guile Reference Manual}). -Comparé au lancement de la commande @command{guile}, @command{guix repl} -garanti que tous les modules Guix et toutes ses dépendances sont disponibles -dans le chemin de recherche. Vous pouvez l'utiliser de cette manière : +@cindex dépôt +@cindex éléments du dépôt +@cindex chemins dans le dépôt -@example -$ guix repl -scheme@@(guile-user)> ,use (gnu packages base) -scheme@@(guile-user)> coreutils -$1 = # -@end example +Conceptuellement, le @dfn{dépôt} est l'endroit où les dérivations qui ont +bien été construites sont stockées — par défaut, @file{/gnu/store}. Les +sous-répertoires dans le dépôt s'appellent des @dfn{éléments du dépôt} ou +parfois des @dfn{chemins du dépôt}. Le dépôt a une base de données associée +qui contient des informations comme les chemins du dépôt auxquels se +réfèrent chaque chemin du dépôt et la liste des éléments du dépôt +@emph{valides} — les résultats d'une construction réussie. Cette base de +données se trouve dans @file{@var{localstatedir}/guix/db} où +@var{localstatedir} est le répertoire d'états spécifié @i{via} @option +{--localstatedir} à la configuration, typiquement @file{/var}. -@cindex inférieurs -En plus, @command{guix repl} implémente un protocole REPL simple lisible par -une machine à utiliser avec @code{(guix inferior)}, un dispositif pour -interagir avec des @dfn{inférieurs}, des processus séparés qui font tourner -une version potentiellement différente de Guix. +C'est @emph{toujours} le démon qui accède au dépôt pour le compte de ses +clients (@pxref{Invoquer guix-daemon}). Pour manipuler le dépôt, les +clients se connectent au démon par un socket Unix-domain, envoient une +requête dessus et lisent le résultat — ce sont des appels de procédures +distantes, ou RPC. -Les options disponibles sont les suivante : +@quotation Remarque +Les utilisateurs ne doivent @emph{jamais} modifier les fichiers dans +@file{/gnu/store} directement. Cela entraînerait des incohérences et +casserait l'hypothèse d'immutabilité du modèle fonctionnel de Guix +(@pxref{Introduction}). -@table @code -@item --type=@var{type} -@itemx -t @var{type} -Démarrer un REPL du @var{type} donné, qui peut être l'un de ces types : +@xref{Invoquer guix gc, @command{guix gc --verify}}, pour des informations +sur la manière de vérifier l'intégrité du dépôt et d'essayer de réparer des +modifications accidentelles. +@end quotation -@table @code -@item guile -C'est la valeur par défaut. Elle démarre un REPL Guile standard -fonctionnel. -@item machine -Démarre un REPL qui utilise le protocole lisible par machine. C'est le -protocole que parle le module @code{(guix inferior)}. -@end table +Le module @code{(guix store)} fournit des procédures pour se connecter au +démon et pour effectuer des RPC. Elles sont décrites plus bas. Par défaut, +@code{open-connection}, et donc toutes les commandes @command{guix} se +connectent au démon local ou à l'URI spécifiée par la variable +d'environnement @code{GUIX_DAEMON_SOCKET}. -@item --listen=@var{extrémité} -Par défaut, @command{guix repl} lit depuis l'entrée standard et écrit sur la -sortie standard. Lorsque cette option est passée, il écoutera plutôt les -connexions sur @var{endpoint}. Voici un exemple d'options valides : +@defvr {Variable d'environnement} GUIX_DAEMON_SOCKET +Lorsqu'elle est initialisée, la valeur de cette variable devrait être un nom +de fichier ou une URI qui désigne l'extrémité du démon. Lorsque c'est un +nom de fichier, il dénote un socket Unix-domain où se connecter. En plus +des noms de fichiers, les schémas d'URI supportés sont : @table @code -@item --listen=tcp:37146 -Accepte les connexions sur localhost, sur le port 31. - -@item --listen=unix:/tmp/socket -Accepte les connexions sur le socket Unix-domain @file{/tmp/socket}. -@end table -@end table - -@c ********************************************************************* -@node Utilitaires -@chapter Utilitaires +@item file +@itemx unix +Pour les sockets Unix-domain. @code{file:///var/guix/daemon-socket/socket} +est équivalent à @file{/var/guix/daemon-socket/socket}. -cette section décrit les utilitaires en ligne de commande de Guix. certains -sont surtout faits pour les développeurs qui écrivent de nouvelles -définitions de paquets tandis que d'autres sont plus utiles pour une -utilisation générale. Ils complètent l'interface de programmation Scheme de -Guix d'une manière pratique. +@item guix +@cindex démon, accès distant +@cindex accès distant au démon +@cindex démon, paramètres de grappes +@cindex grappes, paramètres du démon +Ces URI dénotent des connexions par TCP/IP, sans chiffrement ni +authentification de l'hôte distant. L'URI doit spécifier le nom d'hôte et +éventuellement un numéro de port (par défaut 44146) : -@menu -* Invoquer guix build:: Construire des paquets depuis la ligne de - commande. -* Invoquer guix edit:: Modifier les définitions de paquets. -* Invoquer guix download:: Télécharger un fichier et afficher son hash. -* Invoquer guix hash:: Calculer le hash cryptographique d'un fichier. -* Invoquer guix import:: Importer des définitions de paquets. -* Invoquer guix refresh:: Mettre à jour les définitions de paquets. -* Invoquer guix lint:: Trouver des erreurs dans les définitions de - paquets. -* Invoquer guix size:: Profiler l'utilisation du disque. -* Invoquer guix graph:: Visualiser le graphe des paquets. -* Invoquer guix environment:: Mettre en place des environnements de - développement. -* Invoquer guix publish:: Partager des substituts. -* Invoquer guix challenge:: Défier les serveurs de substituts. -* Invoquer guix copy:: Copier vers et depuis un dépôt distant. -* Invoquer guix container:: Isolation de processus. -* Invoquer guix weather:: Mesurer la disponibilité des substituts. -* Invoquer guix processes:: Lister les processus clients. -@end menu +@example +guix://master.guix.example.org:1234 +@end example -@node Invoquer guix build -@section Invoquer @command{guix build} +Ce paramétrage est adapté aux réseaux locaux, comme dans le cas de grappes +de serveurs, où seuls des noms de confiance peuvent se connecter au démon de +construction sur @code{master.guix.example.org}. -@cindex construction de paquets -@cindex @command{guix build} -La commande @command{guix build} construit des paquets ou des dérivations et -leurs dépendances et affiche les chemins du dépôt qui en résulte. Remarquez -qu'elle ne modifie pas le profil de l'utilisateur — c'est le travail de la -commande @command{guix package} (@pxref{Invoquer guix package}). Ainsi, -elle est surtout utile pour les développeurs de la distribution. +L'option @code{--listen} de @command{guix-daemon} peut être utilisé pour lui +dire d'écouter des connexions TCP (@pxref{Invoquer guix-daemon, +@code{--listen}}). -La syntaxe générale est : +@item ssh +@cindex accès SSH au démon de construction +Ces URI vous permettent de vous connecter au démon à distance à travers +SSH@footnote{Cette fonctionnalité requiert Guile-SSH +(@pxref{Prérequis}).}. @example -guix build @var{options} @var{package-or-derivation}@dots{} +ssh://charlie@@guix.example.org:22 @end example -Par exemple, la commande suivante construit la dernière version d'Emacs et -de Guile, affiche leur journaux de construction et enfin affiche les -répertoires des résultats : +Comme pour @command{guix copy}, les fichiers de configuration du client +OpenSSH sont respectés (@pxref{Invoquer guix copy}). +@end table -@example -guix build emacs guile -@end example +Des schémas d'URI supplémentaires pourraient être supportés dans le futur. -De même, la commande suivante construit tous les paquets disponibles : +@c XXX: Remove this note when the protocol incurs fewer round trips +@c and when (guix derivations) no longer relies on file system access. +@quotation Remarque +La capacité de se connecter à un démon de construction distant est considéré +comme expérimental à la version @value{VERSION}. Contactez-nous pour +partager vos problèmes ou des suggestions que vous pourriez avoir +(@pxref{Contribuer}). +@end quotation +@end defvr -@example -guix build --quiet --keep-going \ - `guix package -A | cut -f1,2 --output-delimiter=@@` -@end example +@deffn {Procédure Scheme} open-connection [@var{uri}] [#:reserve-space? #t] +Se connecte au démon à travers le socket Unix-domain à @var{uri} (une chaîne +de caractères). Lorsque @var{reserve-space?} est vrai, cela demande de +réserver un peu de place supplémentaire sur le système de fichiers pour que +le ramasse-miette puisse opérer au cas où le disque serait plein. Renvoie +un objet serveur. -@var{package-or-derivation} peut être soit le nom d'un paquet trouvé dans la -distribution logicielle comme @code{coreutils}, soit @code{coreutils@@8.20}, -soit une dérivation comme @file{/gnu/store/@dots{}-coreutils-8.19.drv}. -Dans le premier cas, la commande cherchera un paquet avec le nom -correspondant (et éventuellement la version) dans les modules de la -distribution GNU (@pxref{Modules de paquets}). +@var{file} a pour valeur par défaut @var{%default-socket-path}, qui est +l'emplacement normal en fonction des options données à @command{configure}. +@end deffn -Autrement, l'option @code{--expression} peut être utilisée pour spécifier -une expression Scheme qui s'évalue en un paquet ; c'est utile pour -différencier des paquets avec le même nom ou des variantes de paquets. +@deffn {Procédure Scheme} close-connection @var{server} +Ferme la connexion au @var{serveur}. +@end deffn -Il peut y avoir aucune, une ou plusieurs @var{options}. Les options -disponibles sont décrites dans les sous-sections ci-dessous. +@defvr {Variable Scheme} current-build-output-port +Cette variable est liée à un paramètre SRFI-39, qui se réfère au port où les +journaux de construction et d'erreur envoyés par le démon devraient être +écrits. +@end defvr -@menu -* Options de construction communes:: Options de construction pour la - plupart des commandes. -* Options de transformation de paquets:: Créer des variantes de paquets. -* Options de construction supplémentaires:: Options spécifiques à « - guix build ». -* Débogage des échecs de construction:: La vie d'un empaqueteur. -@end menu +Les procédures qui font des RPC prennent toutes un objet serveur comme +premier argument. -@node Options de construction communes -@subsection Options de construction communes +@deffn {Procédure Scheme} valid-path? @var{server} @var{path} +@cindex éléments du dépôt invalides +Renvoie @code{#t} lorsque @var{path} désigne un élément du dépôt valide et +@code{#f} sinon (un élément invalide peut exister sur le disque mais rester +invalide, par exemple parce que c'est le résultat d'une construction annulée +ou échouée). -Un certain nombre d'options qui contrôlent le processus de construction sont -communes avec @command{guix build} et les autres commandes qui peuvent -générer des constructions, comme @command{guix package} ou @command{guix -archive}. Voici ces options : +A @code{&store-protocol-error} condition is raised if @var{path} is not +prefixed by the store directory (@file{/gnu/store}). +@end deffn -@table @code +@deffn {Procédure Scheme} add-text-to-store @var{server} @var{name} @var{text} [@var{references}] +Ajoute @var{text} dans le fichier @var{name} dans le dépôt et renvoie son +chemin. @var{references} est la liste des chemins du dépôt référencés par +le chemin du dépôt qui en résulte. +@end deffn -@item --load-path=@var{répertoire} -@itemx -L @var{répertoire} -Ajoute @var{répertoire} au début du chemin de recherche de module de paquets -(@pxref{Modules de paquets}). +@deffn {Procédure Scheme} build-derivations @var{server} @var{derivations} +Construit @var{derivaton} (ne liste d'objets @code{} ou de +chemins de dérivations) et retourne quand le travailleur a fini de les +construire. Renvoie @code{#t} en cas de réussite. +@end deffn -Cela permet à des utilisateurs de définir leur propres paquets et les rendre -disponibles aux outils en ligne de commande. +Remarque que le module @code{(guix monads)} fournit une monade ainsi que des +version monadiques des procédures précédentes, avec le but de rendre plus +facile de travailler avec le code qui accède au dépôt (@pxref{La monade du dépôt}). -@item --keep-failed -@itemx -K -Garde l'arborescence de construction des constructions en échec. Ainsi, si -une construction échoue, son arborescence de construction est préservée dans -@file{/tmp}, dans un répertoire dont le nom est affiché à la fin du journal -de construction. Cela est utile pour déboguer des échecs de construction. -@xref{Débogage des échecs de construction}, pour des astuces sur la manière de déboguer -des problèmes de construction. +@c FIXME +@i{Cette section est actuellement incomplète.} -Cette option n'a pas d'effet lors de la connexion à un démon distant avec -l'URI @code{guix://} (@pxref{Le dépôt, la variable -@code{GUIX_DAEMON_SOCKET}}). +@node Dérivations +@section Dérivations -@item --keep-going -@itemx -k -Continue lorsque certaines dérivations échouent ; ne s'arrête que lorsque -toutes les constructions ont soit réussies, soit échouées. +@cindex dérivations +Les actions de construction à bas-niveau et l'environnement dans lequel +elles sont effectuées sont représentés par des @dfn{dérivations}. Une +dérivation contient cet ensemble d'informations : -Le comportement par défaut est de s'arrêter dès qu'une des dérivations -spécifiées échoue. +@itemize +@item +Les sorties de la dérivation — les dérivations produisent au moins un +fichier ou répertoire dans le dépôt, mais peuvent en produire plus. -@item --dry-run -@itemx -n -Ne pas construire les dérivations. +@item +Les entrées de la dérivation, qui peuvent être d'autres dérivations ou des +fichiers dans le dépôt (correctifs, scripts de construction, etc). -@anchor{option de repli} -@item --fallback -Lorsque la substitution d'un binaire pré-compilé échoue, construit les -paquets localement à la place (@pxref{Échec de substitution}). +@item +Le type de système ciblé par la dérivation — p.ex.@: @code{x86_64-linux}. -@item --substitute-urls=@var{urls} -@anchor{client-substitute-urls} -Considère @var{urls} comme une liste d'URL de sources de substituts séparés -par des espaces, et remplace la liste par défaut d'URL de -@command{guix-daemon} (@pxref{daemon-substitute-urls,, @command{guix-daemon} -URLs}). +@item +Le nom de fichier d'un script de construction dans le dépôt avec les +arguments à lui passer. -Cela signifie que les substituts peuvent être téléchargés depuis @var{urls}, -tant qu'ils sont signés par une clef autorisée par l'administrateur système -(@pxref{Substituts}). +@item +Une liste de variables d'environnement à définir. -Lorsque @var{urls} est la chaîne vide, cela a pour effet de désactiver la -substitution. +@end itemize -@item --no-substitutes -Ne pas utiliser de substitut pour les résultats de la construction. -C'est-à-dire, toujours construire localement plutôt que de permettre le -téléchargement de binaires pré-construits (@pxref{Substituts}). +@cindex chemin de dérivation +Les dérivations permettent aux client du démon de communiquer des actions de +construction dans le dépôt. Elles existent sous deux formes : en tant que +représentation en mémoire, à la fois côté client et démon, et en tant que +fichiers dans le dépôt dont le nom fini par @code{.drv} — on dit que ce sont +des @dfn{chemins de dérivations}. Les chemins de dérivations peuvent être +passés à la procédure @code{build-derivations} pour effectuer les actions de +construction qu'ils prescrivent (@pxref{Le dépôt}). -@item --no-grafts -Ne par « greffer » les paquets. En pratique, cela signifie que les mises à -jour des paquets disponibles comme des greffes ne sont pas appliquées. -@xref{Mises à jour de sécurité}, pour plus d'information sur les greffes. +@cindex dérivations à sortie fixe +Des opérations comme le téléchargement de fichiers et la récupération de +sources gérés par un logiciel de contrôle de version pour lesquels le hash +du contenu est connu à l'avance sont modélisés par des @dfn{dérivations à +sortie fixe}. Contrairement aux dérivation habituelles, les sorties d'une +dérivation à sortie fixe sont indépendantes de ses entrées — p.ex.@: un code +source téléchargé produit le même résultat quelque soit la méthode de +téléchargement utilisée. -@item --rounds=@var{n} -Construit chaque dérivation @var{n} fois d'affilé, et renvoie une erreur si -les constructions consécutives ne sont pas identiques bit-à-bit. +Le module @code{(guix derivations)} fournit une représentation des +dérivations comme des objets Scheme, avec des procédures pour créer et +manipuler des dérivations. La primitive de plus bas-niveau pour créer une +dérivation est la procédure @code{derivation} : -Cela est une manière utile pour détecter des processus de construction non -déterministes. Les processus de construction non déterministes sont -problématiques car ils rendent pratiquement impossible la -@emph{vérification} par les utilisateurs de l'authenticité de binaires -tiers. @xref{Invoquer guix challenge}, pour plus d'informations. +@deffn {Procédure Scheme} derivation @var{store} @var{name} @var{builder} @ + @var{args} [#:outputs '("out")] [#:hash #f] [#:hash-algo #f] @ +[#:recursive? #f] [#:inputs '()] [#:env-vars '()] @ +[#:system (%current-system)] [#:references-graphs #f] @ +[#:allowed-references #f] [#:disallowed-references #f] @ +[#:leaked-env-vars #f] [#:local-build? #f] @ +[#:substitutable? #t] [#:properties '()] +Construit une dérivation avec les arguments donnés et renvoie l'objet +@code{} obtenu. -Remarquez que, les résultats qui diffèrent ne sont pas gardés, donc vous -devrez inspecter manuellement chaque erreur — p.@: ex.@: en gardant l'un des -résultats avec @code{guix archive --export} (@pxref{Invoquer guix archive}), -puis en reconstruisant, et enfin en comparant les deux résultats. +Lorsque @var{hash} et @var{hash-algo} sont donnés, une @dfn{dérivation à +sortie fixe} est créée — c.-à-d.@: une dérivation dont le résultat est connu +à l'avance, comme dans le cas du téléchargement d'un fichier. Si, en plus, +@var{recursive?} est vrai, alors la sortie fixe peut être un fichier +exécutable ou un répertoire et @var{hash} doit être le hash d'une archive +contenant la sortie. -@item --no-build-hook -N'essaye pas de décharger les constructions via le « crochet de construction -» du démon (@pxref{Réglages du délestage du démon}). C'est-à-dire que tout sera -construit localement plutôt que de décharger les constructions à une machine -distante. +Lorsque @var{references-graphs} est vrai, il doit s'agir d'une liste de +paires de noms de fichiers et de chemins du dépôt. Dans ce cas, le graphe +des références de chaque chemin du dépôt est exporté dans l'environnement de +construction dans le fichier correspondant, dans un simple format texte. -@item --max-silent-time=@var{secondes} -Lorsque le processus de construction ou de substitution restent silencieux -pendant plus de @var{secondes}, le terminer et rapporter une erreur de -construction. +Lorsque @var{allowed-references} est vrai, il doit s'agir d'une liste +d'éléments du dépôt ou de sorties auxquelles la sortie de la dérivations +peut faire référence. De même, @var{disallowed-references}, si vrai, doit +être une liste de choses que la sortie ne doit @emph{pas} référencer. -Par défaut, les paramètres du démon sont pris en compte (@pxref{Invoquer guix-daemon, @code{--max-silent-time}}). +Lorsque @var{leaked-env-vars} est vrai, il doit s'agir d'une liste de +chaînes de caractères qui désignent les variables d'environnements qui +peuvent « fuiter » de l'environnement du démon dans l'environnement de +construction. Ce n'est possible que pour les dérivations à sortie fixe — +c.-à-d.@: lorsque @var{hash} est vrai. L'utilisation principale est de +permettre à des variables comme @code{http_proxy} d'être passées aux +dérivations qui téléchargent des fichiers. + +Lorsque @var{local-build?} est vrai, déclare que la dérivation n'est pas un +bon candidat pour le déchargement et devrait plutôt être construit +localement (@pxref{Réglages du délestage du démon}). C'est le cas des petites +dérivations où le coût du transfert de données est plus important que les +bénéfices. -@item --timeout=@var{secondes} -De même, lorsque le processus de construction ou de substitution dure plus -de @var{secondes}, le terminer et rapporter une erreur de construction. +Lorsque que @var{substitutable?} est faux, déclare que les substituts de la +sortie de la dérivation ne devraient pas être utilisés +(@pxref{Substituts}). Cela est utile par exemple pour construire des paquets +qui utilisent des détails du jeu d'instruction du CPU hôte. -Par défaut, les paramètres du démon sont pris en compte (@pxref{Invoquer guix-daemon, @code{--timeout}}). +@var{properties} doit être une liste d'association décrivant les « +propriétés » de la dérivation. Elle est gardée telle-quelle, sans être +interprétée, dans la dérivation. +@end deffn -@item --verbosity=@var{level} -Utilise le niveau de verbosité donné. @var{level} doit être un entier entre -0 et 5 ; les entiers les plus hauts signifient une sortie plus verbeuse. Le -mettre à 4 ou plus peut être utile pour déboguer des problèmes de -configuration du démon de construction. +@noindent +Voici un exemple avec un script shell comme constructeur, en supposant que +@var{store} est une connexion ouverte au démon et @var{bash} pointe vers un +exécutable Bash dans le dépôt : -@item --cores=@var{n} -@itemx -c @var{n} -Permet d'utiliser jusqu'à @var{n} cœurs du CPU pour la construction. La -valeur spéciale @code{0} signifie autant de cœurs que possible. +@lisp +(use-modules (guix utils) + (guix store) + (guix derivations)) -@item --max-jobs=@var{n} -@itemx -M @var{n} -Permet au plus @var{n} travaux de construction en parallèle. @xref{Invoquer guix-daemon, @code{--max-jobs}}, pour plus de détails sur cette option et -l'option équivalente pour @command{guix-daemon}. +(let ((builder ; ajoute le script Bash au dépôt + (add-text-to-store store "my-builder.sh" + "echo hello world > $out\n" '()))) + (derivation store "foo" + bash `("-e" ,builder) + #:inputs `((,bash) (,builder)) + #:env-vars '(("HOME" . "/homeless")))) +@result{} # /gnu/store/@dots{}-foo> +@end lisp -@end table +Comme on pourrait s'en douter, cette primitive est difficile à utiliser +directement. Une meilleure approche est d'écrire les scripts de +construction en Scheme, bien sur ! Le mieux à faire pour cela est d'écrire +le code de construction comme une « G-expression » et de la passer à +@code{gexp->derivation}. Pour plus d'informations, @pxref{G-Expressions}. -Sous le capot, @command{guix build} est surtout un interface à la procédure -@code{package-derivation} du module @code{(guix packages)}, et à la -procédure @code{build-derivations} du module @code{(guix derivations)}. +Il fut un temps où @code{gexp->derivation} n'existait pas et où construire +une dérivation donc le code de construction était écrit en Scheme se faisait +avec @code{build-expression->derivation}, documenté plus bas. Cette +procédure est maintenant obsolète, remplacée par @code{gexp->derivation} qui +est meilleure. -En plus des options passées explicitement par la ligne de commande, -@command{guix build} et les autres commande @command{guix} qui peuvent -effectuer des construction honorent la variable d'environnement -@code{GUIX_BUILD_OPTIONS}. +@deffn {Procédure Scheme} build-expression->derivation @var{store} @ + @var{name} @var{exp} @ +[#:system (%current-system)] [#:inputs '()] @ +[#:outputs '("out")] [#:hash #f] [#:hash-algo #f] @ +[#:recursive? #f] [#:env-vars '()] [#:modules '()] @ +[#:references-graphs #f] [#:allowed-references #f] @ +[#:disallowed-references #f] @ +[#:local-build? #f] [#:substitutable? #t] [#:guile-for-build #f] +Renvoie une dérivation qui exécute l'expression Scheme @var{exp} comme un +constructeur pour la dérivation @var{name}. @var{inputs} doit être une +liste de tuples @code{(name drv-path sub-drv)} ; lorsque @var{sub-drv} est +omis, @code{"out"} est utilisé. @var{modules} est une liste de noms de +modules Guile du chemin de recherche actuel qui seront copiés dans le dépôt, +compilés et rendus disponibles dans le chemin de chargement pendant +l'exécution de @var{exp} — p.@: ex.@: @code{((guix build utils) (guix build +gnu-build-system))}. -@defvr {Variable d'environnement} GUIX_BUILD_OPTIONS -Les utilisateurs peuvent définir cette variable à une liste d'options de la -ligne de commande qui seront automatiquement utilisées par @command{guix -build} et les autres commandes @command{guix} qui peuvent effectuer des -constructions, comme dans l'exemple suivant : +@var{exp} est évaluée dans une environnement où @code{%outputs} est lié à +une liste de paires de sortie/chemin, et où @code{%build-inputs} est lié à +une liste de paires de chaînes de caractères et de chemin de sortie +construite à partir de @var{inputs}. Éventuellement, @var{env-vars} est une +liste de paires de chaînes de caractères spécifiant le nom et la valeur de +variables d'environnement visibles pour le constructeur. Le constructeur +termine en passant le résultat de @var{exp} à @code{exit} ; ainsi, lorsque +@var{exp} renvoie @code{#f}, la construction est considérée en échec. -@example -$ export GUIX_BUILD_OPTIONS="--no-substitutes -c 2 -L /foo/bar" -@end example +@var{exp} est construite avec @var{guile-for-build} (une dérivation). +Lorsque @var{guile-for-build} est omis où est @code{#f}, la valeur du fluide +@code{%guile-for-build} est utilisée à la place. -Ces options sont analysées indépendamment, et le résultat est ajouté aux -options de la ligne de commande analysées. -@end defvr +Voir la procédure @code{derivation} pour la signification de +@var{references-graph}, @var{allowed-references}, +@var{disallowed-references}, @var{local-build?} et @var{substitutable?}. +@end deffn +@noindent +Voici un exemple de dérivation à sortie unique qui crée un répertoire avec +un fichier : -@node Options de transformation de paquets -@subsection Options de transformation de paquets +@lisp +(let ((builder '(let ((out (assoc-ref %outputs "out"))) + (mkdir out) ; create /gnu/store/@dots{}-goo + (call-with-output-file (string-append out "/test") + (lambda (p) + (display '(hello guix) p)))))) + (build-expression->derivation store "goo" builder)) -@cindex variantes de paquets -Un autre ensemble d'options de la ligne de commande supportés par -@command{guix build} et aussi @command{guix package} sont les @dfn{options -de transformation de paquets}. Ce sont des options qui rendent possible la -définition de @dfn{variantes de paquets} — par exemple, des paquets -construit à partir de sources différentes. C'est une manière simple de -créer des paquets personnalisés à la volée sans avoir à taper les -définitions de variantes de paquets (@pxref{Définition des paquets}). +@result{} # @dots{}> +@end lisp -@table @code -@item --with-source=@var{source} -@itemx --with-source=@var{paquet}=@var{source} -@itemx --with-source=@var{paquet}@@@var{version}=@var{source} -Utiles @var{source} comme la source de @var{paquet}, et @var{version} comme -son numéro de version. @var{source} doit être un nom de fichier ou une URL, -comme pour @command{guix download} (@pxref{Invoquer guix download}). +@node La monade du dépôt +@section La monade du dépôt -Lorsque @var{paquet} est omis, la commande utilisera le nom de paquet -spécifié par la base de @var{source} — p.@: ex.@: si @var{source} est -@code{/src/guix-2.0.10.tar.gz}, le paquet correspondant est @code{guile}. +@cindex monad -De même, lorsque @var{version} est omis, la chaîne de version est inférée à -partir de @var{source} ; dans l'exemple précédent, il s'agit de -@code{2.0.10}. +Les procédures qui travaillent sur le dépôt décrites dans les sections +précédentes prennent toutes une connexion ouverte au démon de construction +comme premier argument. Bien que le modèle sous-jacent soit fonctionnel, +elles ont soit des effets de bord, soit dépendent de l'état actuel du dépôt. -Cette option permet aux utilisateurs d'essayer des version des paquets -différentes de celles fournies par la distribution. L'exemple ci-dessous -télécharge @file{ed-1.7.tar.g} depuis un mirroir GNU et l'utilise comme -source pour le paquet @code{ed} : +Le premier point est embêtant : on doit se balader avec la connexion au +démon dans toutes ces fonctions, ce qui rend impossible le fait de composer +des fonctions qui ne prennent pas ce paramètre avec des fonctions qui le +prennent. Le deuxième point est problématique : comme les opérations sur le +dépôt ont des effets de bord ou dépendent d'états externes, elles doivent +être enchaînés correctement. -@example -guix build ed --with-source=mirror://gnu/ed/ed-1.7.tar.gz -@end example +@cindex valeurs monadiques +@cindex fonctions monadiques +C'est là que le module @code{(guix monads)} arrive à la rescousse. Ce +module fournit un cadre pour travailler avec des @dfn{monads}, en +particulier une monade très utile pour notre usage, la @dfn{monade du +dépôt}. Les monades sont des constructions qui permettent deux choses : +associer un « contexte » avec une valeur (dans notre cas, le contexte est le +dépôt) et construire une séquence de calculs (ici les calculs comprennent +des accès au dépôt). Les valeurs dans une monade — les valeurs qui +contiennent ce contexte supplémentaire — sont appelées des @dfn{valeurs +monadiques} ; les procédures qui renvoient ce genre de valeur sont appelées +des @dfn{procédures monadiques}. -En tant que développeur, @code{--with-source} permet de tester facilement -des version bêta : +Considérez cette procédure « normale » : @example -guix build guile --with-source=../guile-2.0.9.219-e1bb7.tar.xz +(define (sh-symlink store) + ;; Renvoie une dérivation qui crée un lien symbolique vers l'exécutable « bash ». + (let* ((drv (package-derivation store bash)) + (out (derivation->output-path drv)) + (sh (string-append out "/bin/bash"))) + (build-expression->derivation store "sh" + `(symlink ,sh %output)))) @end example -@dots{} ou pour construire un dépôt de gestion de version dans un -environnement vierge : +En utilisant @code{(guix monads)} et @code{(guix gexp)}, on peut la réécrire +en une fonction monadique : @example -$ git clone git://git.sv.gnu.org/guix.git -$ guix build guix --with-source=guix@@1.0=./guix +(define (sh-symlink) + ;; Pareil, mais renvoie une valeur monadique. + (mlet %store-monad ((drv (package->derivation bash))) + (gexp->derivation "sh" + #~(symlink (string-append #$drv "/bin/bash") + #$output)))) @end example -@item --with-input=@var{paquet}=@var{remplaçant} -Remplace la dépendance sur @var{paquet} par une dépendance à -@var{remplaçant}. @var{paquet} doit être un nom de paquet et -@var{remplaçant} doit être une spécification de paquet comme @code{guile} ou -@code{guile@@1.8}. +Il y a plusieurs choses à remarquer avec cette deuxième version : le +paramètre @code{store} est maintenant implicitement « enfilé » dans les +appels aux procédures monadiques @code{package->derivation} et +@code{gexp->derivation}, et la valeur monadique renvoyée par +@code{package->derivation} est @dfn{liée} avec @code{mlet} plutôt qu'avec un +simple @code{let}. -Par exemple, la commande suivante construit Guix, mais remplace sa -dépendance à la version stable actuelle de Guile par une dépendance à une -ancienne version de Guile, @code{guile@@2.0} : +Il se trouve que l'appel à @code{package->derivation} peut même être omis +puisqu'il aura lieu implicitement, comme nous le verrons plus tard +(@pxref{G-Expressions}) : @example -guix build --with-input=guile=guile@@2.0 guix +(define (sh-symlink) + (gexp->derivation "sh" + #~(symlink (string-append #$bash "/bin/bash") + #$output))) @end example -C'est un remplacement récursif profond. Donc dans cet exemple, à la fois -@code{guix} et ses dépendances @code{guile-json} (qui dépend aussi de -@code{guile}) sont reconstruits avec @code{guile@@2.0}. - -Cette option est implémentée avec la procédure Scheme -@code{package-input-rewriting} (@pxref{Définition des paquets, -@code{package-input-rewriting}}). - -@item --with-graft=@var{paquet}=@var{remplaçant} -Cette option est similaire à @code{--with-input} mais avec une différence -importante : plutôt que de reconstruire la chaîne de dépendance complète, -@var{remplaçant} est construit puis @dfn{greffé} sur les binaires qui -référençaient initialement @var{paquet}. @xref{Mises à jour de sécurité}, pour plus -d'information sur les greffes. - -Par exemple, la commande ci-dessous greffe la version 3.5.4 de GnuTLS sur -Wget et toutes ses dépendances, en remplaçant les références à la version -actuelle de GnuTLS à laquelle ils se réfèrent actuellement : +@c See +@c +@c for the funny quote. +L'appel à la procédure monadique @code{sh-symlink} n'a aucun effet. En +anglais on pourrait dire « you exit a monad like you exit a building on +fire: by running »@footnote{NdT : « on sort d'une monade comme d'un immeuble +en flamme, en courant ». Le jeu de mot est perdu à la traduction : courir +et lancer utilisent le même verbe @i{run} en anglais.}. Donc, pour sortir de +la monade et obtenir l'effet escompté, on doit utiliser +@code{run-with-store}. @example -guix build --with-graft=gnutls=gnutls@@3.5.4 wget +(run-with-store (open-connection) (sh-symlink)) +@result{} /gnu/store/...-sh-symlink @end example -Cela a l'avantage d'être bien plus rapide que de tout reconstruire. Mais il -y a un piège : cela ne fonctionne que si @var{paquet} et @var{remplaçant} -sont strictement compatibles — par exemple, s'ils fournissent une -bibliothèque, l'interface binaire applicative (ABI) de ces bibliothèques -doivent être compatibles. Si @var{remplaçant} est incompatible avec -@var{paquet}, alors le paquet qui en résulte peut devenir inutilisable. À -utilisez avec précaution ! - -@item --with-branch=@var{package}=@var{branch} -@cindex Git, using the latest commit -@cindex latest commit, building -Build @var{package} from the latest commit of @var{branch}. The -@code{source} field of @var{package} must be an origin with the -@code{git-fetch} method (@pxref{Référence d'origine}) or a @code{git-checkout} -object; the repository URL is taken from that @code{source}. +Remarquez que le module @code{(guix monad-repl)} étend la console Guile avec +de nouvelles « méta-commandes » pour rendre plus facile la manipulation de +procédures monadiques : @code{run-in-store} et @code{enter-store-monad}. La +première est utilisée pour « lancer » une seule valeur monadique à travers +le dépôt : -For instance, the following command builds @code{guile-sqlite3} from the -latest commit of its @code{master} branch, and then builds @code{guix} -(which depends on it) and @code{cuirass} (which depends on @code{guix}) -against this specific @code{guile-sqlite3} build: +@example +scheme@@(guile-user)> ,run-in-store (package->derivation hello) +$1 = # @dots{}> +@end example + +La deuxième entre dans une console récursive, où toutes les valeurs de +retour sont automatiquement lancées à travers le dépôt : @example -guix build --with-branch=guile-sqlite3=master cuirass +scheme@@(guile-user)> ,enter-store-monad +store-monad@@(guile-user) [1]> (package->derivation hello) +$2 = # @dots{}> +store-monad@@(guile-user) [1]> (text-file "foo" "Hello!") +$3 = "/gnu/store/@dots{}-foo" +store-monad@@(guile-user) [1]> ,q +scheme@@(guile-user)> @end example -@cindex intégration continue -Obviously, since it uses the latest commit of the given branch, the result -of such a command varies over time. Nevertheless it is a convenient way to -rebuild entire software stacks against the latest commit of one or more -packages. This is particularly useful in the context of continuous -integration (CI). +@noindent +Remarquez qu'on ne peut pas renvoyer de valeur non monadique dans la console +@code{store-monad}. -Checkouts are kept in a cache under @file{~/.cache/guix/checkouts} to speed -up consecutive accesses to the same repository. You may want to clean it up -once in a while to save disk space. +Les formes syntaxiques principales pour utiliser des monades en général sont +disponibles dans le module @code{(guix monads)} et sont décrites ci-dessous. -@item --with-commit=@var{package}=@var{commit} -This is similar to @code{--with-branch}, except that it builds from -@var{commit} rather than the tip of a branch. @var{commit} must be a valid -Git commit SHA1 identifier. -@end table +@deffn {Syntaxe Scheme} with-monad @var{monad} @var{body} ... +Évalue n'importe quelle forme @code{>>=} ou @code{return} dans @var{body} +comme une @var{monad}. +@end deffn -@node Options de construction supplémentaires -@subsection Options de construction supplémentaires +@deffn {Syntaxe Scheme} return @var{val} +Renvoie une valeur monadique qui encapsule @var{val}. +@end deffn -Les options de la ligne de commande ci-dessous sont spécifiques à -@command{guix build}. +@deffn {Syntaxe Scheme} >>= @var{mval} @var{mproc} ... +@dfn{Lie} une valeur monadique @var{mval}, en passant son « contenu » aux +procédures monadiques @var{mproc}@dots{}@footnote{Cette opération est +souvent appelée « bind », mais ce nom dénote une procédure qui n'a rien à +voir en Guile. Ainsi, nous empruntons ce symbole quelque peu cryptique au +langage Haskell}. Il peut y avoir une ou plusieurs @code{mproc}, comme dans +cet exemple : -@table @code +@example +(run-with-state + (with-monad %state-monad + (>>= (return 1) + (lambda (x) (return (+ 1 x))) + (lambda (x) (return (* 2 x))))) + 'some-state) -@item --quiet -@itemx -q -Construire en silence, sans afficher les journaux de construction. À la -fin, le journal de construction est gardé dans @file{/var} (ou similaire) et -on peut toujours l'y trouver avec l'option @option{--log-file}. +@result{} 4 +@result{} some-state +@end example +@end deffn -@item --file=@var{fichier} -@itemx -f @var{fichier} -Construit le paquet, la dérivation ou l'objet simili-fichier en lequel le -code dans @var{file} s'évalue (@pxref{G-Expressions, file-like objects}). +@deffn {Syntaxe Scheme} mlet @var{monad} ((@var{var} @var{mval}) ...) @ + @var{body} ... +@deffnx {Syntaxe Scheme} mlet* @var{monad} ((@var{var} @var{mval}) ...) @ + @var{body} ... +Lie les variables @var{var} aux valeurs monadiques @var{mval} dans +@var{body}, une séquence d'expressions. Comme avec l'opérateur de liaison, +on peut réfléchir comme si on « ouvrait » la valeur non-monadique « contenue +» dans @var{mval} et comme si on faisait en sorte que @var{var} se réfère à +cette valeur pure, non-monadique, dans la portée de @var{body}. La forme +(@var{var} -> @var{val}) lie @var{var} à la valeur « normale » @var{val}, +comme @code{let}. L'opération de liaison a lieu en séquence de la gauche +vers la droite. La dernière expression de @var{body} doit être une +expression monadique et son résultat deviendra le résultat de @code{mlet} ou +@code{mlet*} lorsque lancé dans la @var{monad}. -Par exemple, @var{file} peut contenir une définition de paquet comme ceci -(@pxref{Définition des paquets}) : +@code{mlet*} est à @code{mlet} ce que @code{let*} est à @code{let} +(@pxref{Local Bindings,,, guile, GNU Guile Reference Manual}). +@end deffn -@example -@verbatiminclude package-hello.scm -@end example +@deffn {Système Scheme} mbegin @var{monad} @var{mexp} ... +Lie @var{mexp} et les expressions monadiques suivantes en séquence, et +renvoie le résultat de la dernière expression. Chaque expression dans la +séquence doit être une expression monadique. -@item --expression=@var{expr} -@itemx -e @var{expr} -Construit le paquet ou la dérivation en lequel @var{expr} s'évalue. +Cette procédure est similaire à @code{mlet}, sauf que les valeurs de retour +des expressions monadiques sont ignorées. Dans ce sens, elle est analogue à +@code{begin}, mais appliqué à des expressions monadiques. +@end deffn -Par exemple, @var{expr} peut être @code{(@@ (gnu packages guile) -guile-1.8)}, qui désigne sans ambiguïté cette variante spécifique de la -version 1.8 de Guile. +@deffn {Système Scheme} mwhen @var{condition} @var{mexp0} @var{mexp*} ... +Lorsque la @var{condition} est vraie, évalue la séquence des expressions +monadiques @var{mexp0}..@var{mexp*} comme dans un @code{mbegin}. Lorsque la +@var{condition} est fausse, renvoie @code{*unspecified*} dans la monade +actuelle. Chaque expression dans la séquence doit être une expression +monadique. +@end deffn -Autrement, @var{exp} peut être une G-expression, auquel cas elle est -utilisée comme un programme de construction passé à @code{gexp->derivation} -(@pxref{G-Expressions}). +@deffn {Système Scheme} munless @var{condition} @var{mexp0} @var{mexp*} ... +Lorsque la @var{condition} est fausse, évalue la séquence des expressions +monadiques @var{mexp0}..@var{mexp*} comme dans un @code{mbegin}. Lorsque la +@var{condition} est vraie, renvoie @code{*unspecified*} dans la monade +actuelle. Chaque expression dans la séquence doit être une expression +monadique. +@end deffn -Enfin, @var{expr} peut se référer à une procédure monadique à au moins un -argument (@pxref{La monad du dépôt}). La procédure doit renvoyer une -dérivation comme une valeur monadique, qui est ensuite lancée à travers -@code{run-with-store}. +@cindex monade d'état +Le module @code{(guix monads)} fournit la @dfn{monade d'état} qui permet à +une valeur supplémentaire — l'état — d'être enfilée à travers les appels de +procédures. -@item --source -@itemx -S -Construit les dérivation source des paquets, plutôt que des paquets -eux-même. +@defvr {Variable Scheme} %state-monad +La monade d'état. les procédure dans la monade d'état peuvent accéder et +modifier l'état qui est enfilé. -Par exemple, @code{guix build -S gcc} renvoie quelque chose comme -@file{/gnu/store/@dots{}-gcc-4.7.2.tar.bz2}, qui est l'archive des sources -de GCC. +Considérez l'exemple ci-dessous. La procédure @code{square} renvoie une +valeur dans la monade d'état. Elle renvoie le carré de son argument, mais +incrémente aussi la valeur actuelle de l'état : -L'archive des sources renvoyée est le résultat de l'application des -correctifs et des extraits de code éventuels spécifiés dans le champ -@code{origin} du paquet (@pxref{Définition des paquets}). +@example +(define (square x) + (mlet %state-monad ((count (current-state))) + (mbegin %state-monad + (set-current-state (+ 1 count)) + (return (* x x))))) -@item --sources -Récupère et renvoie la source de @var{package-or-derivation} et toute ses -dépendances, récursivement. C'est pratique pour obtenir une copie locale de -tous les codes sources requis pour construire @var{packages}, ce qui vous -permet de les construire plus tard même sans accès réseau. C'est une -extension de l'option @code{--source} et peut accepter l'un des arguments -facultatifs suivants : +(run-with-state (sequence %state-monad (map square (iota 3))) 0) +@result{} (0 1 4) +@result{} 3 +@end example -@table @code -@item package -Cette valeur fait que l'option @code{--sources} se comporte comme l'option -@code{--source}. +Lorsqu'on la lance à travers @var{%state-monad}, on obtient cet valeur +d'état supplémentaire, qui est le nombre d'appels à @code{square}. +@end defvr -@item all -Construit les dérivations des sources de tous les paquets, dont les sources -qui pourraient être listées dans @code{inputs}. C'est la valeur par défaut. +@deffn {Procédure monadique} current-state +Renvoie l'état actuel dans une valeur monadique. +@end deffn -@example -$ guix build --sources tzdata -The following derivations will be built: - /gnu/store/@dots{}-tzdata2015b.tar.gz.drv - /gnu/store/@dots{}-tzcode2015b.tar.gz.drv -@end example +@deffn {Procédure monadique} set-current-state @var{value} +Initialise l'état actuel à @var{value} et renvoie l'état précédent dans une +valeur monadique. +@end deffn -@item transitive -Build the source derivations of all packages, as well of all transitive -inputs to the packages. This can be used e.g.@: to prefetch package source -for later offline building. +@deffn {Procédure monadique} state-push @var{value} +Pousse @var{value} sur l'état actuel, qui est supposé être une liste, et +renvoie l'état précédent dans une valeur monadique. +@end deffn -@example -$ guix build --sources=transitive tzdata -The following derivations will be built: - /gnu/store/@dots{}-tzcode2015b.tar.gz.drv - /gnu/store/@dots{}-findutils-4.4.2.tar.xz.drv - /gnu/store/@dots{}-grep-2.21.tar.xz.drv - /gnu/store/@dots{}-coreutils-8.23.tar.xz.drv - /gnu/store/@dots{}-make-4.1.tar.xz.drv - /gnu/store/@dots{}-bash-4.3.tar.xz.drv -@dots{} -@end example +@deffn {Procédure monadique} state-pop +Récupère (pop) une valeur dans l'état actuel et la renvoie comme une valeur +monadique. L'état est supposé être une liste. +@end deffn -@end table +@deffn {Procédure Scheme} run-with-state @var{mval} [@var{state}] +Lance la valeur monadique @var{mval} avec @var{state} comme valeur +initiale. Renvoie deux valeurs : la valeur du résultat et l'état du +résultat. +@end deffn -@item --system=@var{système} -@itemx -s @var{système} -Tenter de construire pour le @var{système} — p.@: ex.@: @code{i686-linux} — -plutôt que pour le type de système de l'hôte de construction. +L'interface principale avec la monade du dépôt, fournit par le module +@code{(guix store)}, est la suivante. -@quotation Remarque -Le drapeau @code{--system} est utilisé pour une compilation @emph{native} et -ne doit pas être confondu avec une compilation croisée. Voir -@code{--target} ci-dessous pour des informations sur la compilation croisée. -@end quotation +@defvr {Variable Scheme} %store-monad +La monade du dépôt — un alias pour @var{%state-monad}. -Par exemple, passer @code{--system=i686-linux} sur un système -@code{x86_64-linux} ou @code{--system=armhf-linux} sur un système -@code{aarch64-linux} vous permet de construire des paquets dans un -environnement entièrement 32-bits. C'est une exemple d'utilisation de cette -option sur les systèmes Linux, qui peuvent émuler plusieurs personnalités. +Les valeurs dans la monade du dépôt encapsulent des accès au dépôt. Lorsque +son effet est requis, une valeur de la monade du dépôt doit être « évaluée » +en la passant à la procédure @code{run-with-store} (voir plus bas). +@end defvr -@quotation Remarque -La possibilité de construire pour un système @code{armhf-linux} est activé -sans condition sur les machines @code{aarch64-linux}, bien que certaines -puces aarch64 n'en soient pas capables, comme les ThunderX. -@end quotation +@deffn {Procédure Scheme} run-with-store @var{store} @var{mval} [#:guile-for-build] [#:system (%current-system)] +Lance @var{mval}, une valeur monadique dans la monade du dépôt, dans +@var{store}, une connexion ouvert au dépôt. +@end deffn -De même, lorsque l'émulation transparente avec QEMU et @code{binfnmt_misc} -est activée (@pxref{Services de virtualisation, -@code{qemu-binfmt-service-type}}), vous pouvez construire pour n'importe -quel système pour lequel un gestionnaire QEMU @code{binfmt_misc} est -installé. +@deffn {Procédure monadique} text-file @var{name} @var{text} [@var{references}] +Renvoie une valeur monadique correspondant au nom de fichier dans le dépôt +du fichier contenant @var{text}, une chaîne de caractères. @var{references} +est une liste d'éléments du dépôt auxquels le fichier texte en résultat se +réfère ; c'est la liste vide par défaut. +@end deffn -Les constructions pour un autre système que celui de la machine que vous -utilisez peuvent aussi être déchargées à une machine distante de la bonne -architecture. @xref{Réglages du délestage du démon}, pour plus d'information sur le -déchargement. +@deffn {Procédure monadique} binary-file @var{name} @var{data} [@var{references}] +Renvoie une valeur monadique correspondant au nom de fichier absolu dans le +dépôt du fichier contenant @var{data}, un vecteur d'octets. +@var{references} est une liste d'éléments du dépôt auxquels le fichier +binaire en résultat se réfère ; c'est la liste vide par défaut. +@end deffn + +@deffn {Procédure monadique} interned-file @var{file} [@var{name}] @ + [#:recursive? #t] [#:select? (const #t)] +Renvoie le nom de @var{file} une fois ajouté au dépôt. Utilise @var{name} +comme nom dans le dépôt ou le nom de fichier de @var{file} si @var{name} est +omis. -@item --target=@var{triplet} -@cindex compilation croisée -Effectuer une compilation croisée pour @var{triplet} qui doit être un -triplet GNU valide, comme @code{"mips64el-linux-gnu"} (@pxref{Specifying -target triplets, GNU configuration triplets,, autoconf, Autoconf}). +Lorsque @var{recursive?} est vraie, le contenu de @var{file} est ajouté +récursivement ; si @var{file} désigne un fichier simple et que +@var{recursive?} est vrai, son contenu est ajouté et ses bits de permissions +sont préservés. -@anchor{vérification de la construction} -@item --check -@cindex déterminisme, vérification -@cindex reproductibilité, vérification -Reconstruit les @var{package-or-derivation}, qui sont déjà disponibles dans -le dépôt et lève une erreur si les résultats des constructions ne sont pas -identiques bit-à-bit. +Lorsque @var{recursive?} est vraie, appelle @code{(@var{select?} @var{file} +@var{stat})} pour chaque répertoire où @var{file} est le nom de fichier +absolu de l'entrée et @var{stat} est le résultat de @code{lstat} ; à +l'exception des entrées pour lesquelles @var{select?} ne renvoie pas vrai. -Ce mécanisme vous permet de vérifier si les substituts précédemment -installés sont authentiques (@pxref{Substituts}) ou si le résultat de la -construction d'un paquet est déterministe. @xref{Invoquer guix challenge} -pour plus d'informations et pour les outils. +L'exemple ci-dessous ajoute un fichier au dépôt, sous deux noms différents : -Lorsqu'utilisé avec @option{--keep-failed}, la sourtie différente est gardée -dans le dépôt sous @file{/gnu/store/@dots{}-check}. Cela rend plus facile -l'étude des différences entre les deux résultats. +@example +(run-with-store (open-connection) + (mlet %store-monad ((a (interned-file "README")) + (b (interned-file "README" "LEGU-MIN"))) + (return (list a b)))) -@item --repair -@cindex réparer les éléments du dépôt -@cindex corruption, récupérer de -Essaye de réparer les éléments du dépôt spécifiés, s'ils sont corrompus, en -les téléchargeant ou en les construisant à nouveau. +@result{} ("/gnu/store/rwm@dots{}-README" "/gnu/store/44i@dots{}-LEGU-MIN") +@end example -Cette opération n'est pas atomique et donc restreinte à l'utilisateur -@code{root} +@end deffn -@item --derivations -@itemx -d -Renvoie les chemins de dérivation, et non les chemins de sortie, des paquets -donnés. +Le module @code{(guix packages)} exporte les procédures monadiques liées aux +paquets suivantes : -@item --root=@var{fichier} -@itemx -r @var{fichier} -@cindex racines du GC, ajout -@cindex ajout de racines au ramasse-miettes -Fait de @var{fichier} un lien symbolique vers le résultat, et l'enregistre -en tant que racine du ramasse-miettes. +@deffn {Procédure monadique} package-file @var{package} [@var{file}] @ + [#:system (%current-system)] [#:target #f] @ +[#:output "out"] +Renvoie une valeur monadique qui contient le nom de fichier absolu de +@var{file} dans le répertoire @var{output} de @var{package}. Lorsque +@var{file} est omis, renvoie le nom du répertoire @var{output} de +@var{package}. Lorsque @var{target} est vrai, l'utilise comme un triplet de +cible pour la compilation croisée. +@end deffn -En conséquence, les résultats de cette invocation de @command{guix build} -sont protégés du ramasse-miettes jusqu'à ce que @var{fichier} soit -supprimé. Lorsque cette option est omise, les constructions sont -susceptibles d'être glanées. +@deffn {Procédure monadique} package->derivation @var{package} [@var{system}] +@deffnx {Procédure monadique} package->cross-derivation @var{package} @ + @var{target} [@var{system}] +Version monadique de @code{package-derivation} et +@code{package-cross-derivation} (@pxref{Définition des paquets}). +@end deffn -@item --log-file -@cindex journaux de construction, accès -Renvoie les noms des journaux de construction ou les URL des -@var{package-or-derivation} donnés ou lève une erreur si les journaux de -construction sont absents. -Cela fonctionne indépendamment de la manière dont les paquets ou les -dérivations sont spécifiées. Par exemple, les invocations suivantes sont -équivalentes : +@node G-Expressions +@section G-Expressions -@example -guix build --log-file `guix build -d guile` -guix build --log-file `guix build guile` -guix build --log-file guile -guix build --log-file -e '(@@ (gnu packages guile) guile-2.0)' -@end example +@cindex G-expression +@cindex quoting du code de construction +On a donc des « dérivations » qui représentent une séquence d'actions de +construction à effectuer pour produire un élément du dépôt +(@pxref{Dérivations}). Ces actions de construction sont effectuées +lorsqu'on demande au démon de construire effectivement les dérivations ; +elles sont lancées par le démon dans un conteneur (@pxref{Invoquer guix-daemon}). -Si un journal n'est pas disponible localement, à moins que -@code{--no-substitutes} ne soit passé, la commande cherche un journal -correspondant sur l'un des serveurs de substituts (tels que spécifiés avec -@code{--substitute-urls}.) +@cindex strate de code +Ça ne devrait pas vous surprendre, mais nous aimons écrire ces actions de +construction en Scheme. Lorsqu'on fait ça, on fini avec deux @dfn{strates} +de code Scheme@footnote{Le terme @dfn{strate} dans ce contexte a été inventé +par Manuel Serrano et ses collaborateurs dans le contexte de leur travaux +sur Hop. Oleg Kiselyov, qui a écrit des +@url{http://okmij.org/ftp/meta-programming/#meta-scheme, essais perspicaces +et du code sur le sujet}, utilise le terme de « mise en scène » pour ce +genre de génération de code.} : le « code hôte » — le code qui défini les +paquets, parle au démon, etc — et le « code côté construction » — le code +qui effectue effectivement les actions de construction, comme créer des +répertoires, invoquer @code{make}, etc. -Donc par exemple, imaginons que vous souhaitiez voir le journal de -construction de GDB sur MIPS, mais que vous n'avez qu'une machine -@code{x86_64} : +Pour décrire une dérivation et ses actions de construction, on a typiquement +besoin d'intégrer le code de construction dans le code hôte. Ça revient à +manipuler le code de construction comme de la donnée, et l'homoiconicité de +Scheme — le code a une représentation directe en tant que donnée — est très +utile pour cela. Mais on a besoin de plus que le mécanisme de +@code{quasiquote} en Scheme pour construire des expressions de construction. -@example -$ guix build --log-file gdb -s mips64el-linux -https://hydra.gnu.org/log/@dots{}-gdb-7.10 -@end example +Le module @code{(guix gexp)} implémente les @dfn{G-expressions}, une forme +de S-expression adaptée aux expressions de construction. Les G-expression, +ou @dfn{gexps}, consistent en gros en trois formes syntaxiques : +@code{gexp}, @code{ungexp} et @code{ungexp-splicing} (ou plus simplement : +@code{#~}, @code{#$} et @code{#$@@}), qui sont comparable à +@code{quasiquote}, @code{unquote} et @code{unquote-splicing} respectivement +(@pxref{Expression Syntax, @code{quasiquote},, guile, GNU Guile Reference +Manual}). Cependant il y a des différences majeures : -Vous pouvez accéder librement à un vaste bibliothèque de journaux de -construction ! -@end table +@itemize +@item +Les Gexps sont conçues pour être écrites dans un fichier et être lancées ou +manipulées par d'autres processus. -@node Débogage des échecs de construction -@subsection Débogage des échecs de construction +@item +Lorsqu'un objet de haut-niveau comme un paquet ou une dérivation est +unquotée dans une gexp, le résultat est comme si le nom de fichier de son +résultat avait été introduit. -@cindex échecs de construction, débogage -Lors de la définition d'un nouveau paquet (@pxref{Définition des paquets}), vous -passerez probablement du temps à déboguer et modifier la construction -jusqu'à ce que ça marche. Pour cela, vous devez effectuer les commandes de -construction vous-même dans un environnement le plus proche possible de -celui qu'utilise le démon de construction. +@item +Les gexps transportent des informations sur les paquets ou les dérivations +auxquels elles se réfèrent, et ces dépendances sont automatiquement ajoutées +comme des entrées du processus de construction qui les utilise. +@end itemize -Pour cela, la première chose à faire est d'utiliser l'option -@option{--keep-failed} ou @option{-K} de @command{guix build}, qui gardera -l'arborescence de construction dans @file{/tmp} ou le répertoire spécifié -par @code{TMPDIR} (@pxref{Invoquer guix build, @code{--keep-failed}}). +@cindex abaissement, des objets haut-niveau dans les gepxs +Ce mécanisme n'est pas limité aux paquets et aux dérivations : on peut +définir des @dfn{compilateurs} capable « d'abaisser » d'autres objets de +haut-niveau ou des fichiers dans le dépôt, pour que ces objets puissent +aussi être insérés dans des gexps. Par exemple, des objets haut-niveau +utiles qui pourraient être insérées dans une gexp sont les « objets +simili-fichiers », qui rendent facile l'ajout de fichiers dans le dépôt et +les références vers eux dans les dérivations et autres (voir +@code{local-file} et @code{plain-file} ci-dessous). -À partir de là, vous pouvez vous déplacer dans l'arborescence de -construction et sourcer le fichier @file{environment-variables}, qui -contient toutes les variables d'environnement qui étaient définies lorsque -la construction a échoué. Disons que vous déboguez un échec de construction -dans le paquet @code{foo} ; une session typique ressemblerait à cela : +Pour illustrer cette idée, voici un exemple de gexp : @example -$ guix build foo -K -@dots{} @i{build fails} -$ cd /tmp/guix-build-foo.drv-0 -$ source ./environment-variables -$ cd foo-1.2 +(define build-exp + #~(begin + (mkdir #$output) + (chdir #$output) + (symlink (string-append #$coreutils "/bin/ls") + "list-files"))) @end example -Maintenant, vous pouvez invoquer les commandes comme si vous étiez le démon -(presque) et corriger le processus de construction. - -Parfois il arrive que, par exemple, les tests d'un paquet réussissent -lorsque vous les lancez manuellement mais échouent quand ils sont lancés par -le démon. Cela peut arriver parce que le démon tourne dans un conteneur où, -contrairement à notre environnement au-dessus, l'accès réseau est -indisponible, @file{/bin/sh} n'existe pas, etc (@pxref{Réglages de l'environnement de construction}). - -Dans ce cas, vous pourriez avoir besoin de lancer le processus de -construction dans un conteneur similaire à celui que le démon crée : +Cette gexp peut être passée à @code{gexp->derivation} ; on obtient une +dérivation qui construit une répertoire contenant exactement un lien +symbolique à @file{/gnu/store/@dots{}-coreutils-8.22/bin/ls} : @example -$ guix build -K foo -@dots{} -$ cd /tmp/guix-build-foo.drv-0 -$ guix environment --no-grafts -C foo --ad-hoc strace gdb -[env]# source ./environment-variables -[env]# cd foo-1.2 +(gexp->derivation "the-thing" build-exp) @end example -Ici, @command{guix environment -C} crée un conteneur et démarre un nouveau -shell dedans (@pxref{Invoquer guix environment}). La partie -@command{--ad-hoc strace gdb} ajoute les commandes @command{strace} et -@command{gdb} dans le conteneur, ce qui pourrait s'avérer utile pour le -débogage. L'option @option{--no-grafts} s'assure qu'on obtient le même -environnement, avec des paquets non greffés (@pxref{Mises à jour de sécurité}, pour -plus d'informations sur les greffes). +Comme on pourrait s'y attendre, la chaîne +@code{"/gnu/store/@dots{}-coreutils-8.22"} est substituée à la place de la +référence au paquet @var{coreutils} dans le code de construction final, et +@var{coreutils} est automatiquement devenu une entrée de la dérivation. De +même, @code{#$output} (équivalent à @code{(ungexp output)}) est remplacé par +une chaîne de caractères contenant le nom du répertoire de la sortie de la +dérivation. -Pour obtenir un conteneur plus proche de ce qui serait utilisé par le démon -de construction, on peut enlever @file{/bin/sh} : +@cindex compilation croisée +Dans le contexte d'une compilation croisée, il est utile de distinguer entre +des références à la construction @emph{native} d'un paquet — qui peut être +lancé par l'hôte — et des références à la construction croisée d'un paquet. +Pour cela, @code{#+} joue le même rôle que @code{#$}, mais référence une +construction native d'un paquet : @example -[env]# rm /bin/sh +(gexp->derivation "vi" + #~(begin + (mkdir #$output) + (system* (string-append #+coreutils "/bin/ln") + "-s" + (string-append #$emacs "/bin/emacs") + (string-append #$output "/bin/vi"))) + #:target "mips64el-linux-gnu") @end example -Ne vous inquiétez pas, c'est sans danger : tout cela se passe dans un -conteneur jetable créé par @command{guix environment}. +@noindent +Dans l'exemple ci-dessus, la construction native de @var{coreutils} est +utilisée, pour que @command{ln} puisse effectivement être lancé sur l'hôte ; +mais ensuite la construction croisée d'@var{emacs} est utilisée. -La commande @command{strace} n'est probablement pas dans le chemin de -recherche, mais on peut lancer : +@cindex modules importés, pour les gexps +@findex with-imported-modules +Une autre fonctionnalité, ce sont les @dfn{modules importés} : parfois vous +voudriez pouvoir utiliser certains modules Guile de « l'environnement hôte » +dans la gexp, donc ces modules devraient être importés dans « +l'environnement de construction ». La forme @code{with-imported-modules} +vous permet d'exprimer ça : @example -[env]# $GUIX_ENVIRONMENT/bin/strace -f -o log make check +(let ((build (with-imported-modules '((guix build utils)) + #~(begin + (use-modules (guix build utils)) + (mkdir-p (string-append #$output "/bin")))))) + (gexp->derivation "empty-dir" + #~(begin + #$build + (display "success!\n") + #t))) @end example -De cette manière, non seulement vous aurez reproduit les variables -d'environnement utilisées par le démon, mais vous lancerez aussi le -processus de construction dans un conteneur similaire à celui utilisé par le -démon. +@noindent +Dans cet exemple, le module @code{(guix build utils)} est automatiquement +récupéré dans l'environnement de construction isolé de notre gexp, pour que +@code{(use-modules (guix build utils))} fonctionne comme on s'y attendrait. +@cindex closure de module +@findex source-module-closure +Typiquement, vous voudriez que la @emph{closure} complète du module soit +importé — c.-à-d.@: le module lui-même et tous les modules dont il dépend — +plutôt que seulement le module ; sinon, une tentative de chargement du +module échouera à cause des modules dépendants manquants. La procédure +@code{source-module-closure} calcule la closure d'un module en cherchant +dans ses en-têtes sources, ce qui est pratique dans ce cas : -@node Invoquer guix edit -@section Invoquer @command{guix edit} +@example +(use-modules (guix modules)) ;pour 'source-module-closure' -@cindex @command{guix edit} -@cindex définition de paquets, modification -Tant de paquets, tant de fichiers source ! La commande @command{guix edit} -facilite la vie des utilisateurs et des packagers en plaçant leur éditeur -sur le fichier source qui contient la définition des paquets spécifiés. Par -exemple : +(with-imported-modules (source-module-closure + '((guix build utils) + (gnu build vm))) + (gexp->derivation "something-with-vms" + #~(begin + (use-modules (guix build utils) + (gnu build vm)) + @dots{}))) +@end example + +@cindex extensions, des gexps +@findex with-extensions +Dans la même idée, parfois vous pouvez souhaiter importer non seulement des +modules en Scheme pur, mais aussi des « extensions » comme des liaisons +Guile de bibliothèques C ou d'autres paquet « complets ». Disons que vous +voulez utiliser le paquet @code{guile-json} du côté de la construction, +voici comme procéder : @example -guix edit gcc@@4.9 vim +(use-modules (gnu packages guile)) ;pour 'guile-json' + +(with-extensions (list guile-json) + (gexp->derivation "something-with-json" + #~(begin + (use-modules (json)) + @dots{}))) @end example -@noindent -lance le programme spécifié dans la variable d'environnement @code{VISUAL} -ou @code{EDITOR} pour visionner la recette de GCC@tie{}4.9.3 et cele de Vim. +La forme syntaxique pour construire des gexps est résumée ci-dessous. -Si vous utilisez une copie du dépôt Git de Guix (@pxref{Construire depuis Git}), -ou que vous avez créé vos propres paquets dans @code{GUIX_PACKAGE_PATH} -(@pxref{Modules de paquets}), vous pourrez modifier les recettes des paquets. -Sinon, vous pourrez examiner les recettes en lecture-seule des paquets -actuellement dans le dépôt. +@deffn {Syntaxe Scheme} #~@var{exp} +@deffnx {Syntaxe Scheme} (gexp @var{exp}) +Renvoie une G-expression contenant @var{exp}. @var{exp} peut contenir une +ou plusieurs de ces formes : +@table @code +@item #$@var{obj} +@itemx (ungexp @var{obj}) +Introduit une référence à @var{obj}. @var{obj} peut être d'un des types +supportés, par exemple un paquet ou une dérivation, auquel cas la forme +@code{ungexp} est remplacée par le nom de fichier de sa sortie — p.@: ex.@: +@code{"/gnu/store/@dots{}-coreutils-8.22}. -@node Invoquer guix download -@section Invoquer @command{guix download} +Si @var{boj} est une liste, elle est traversée et les références aux objets +supportés sont substitués de manière similaire. -@cindex @command{guix download} -@cindex télécharger les sources des paquets -En écrivant des définitions de paquets, les développeurs ont généralement -besoin de télécharger une archive des sources, calculer son hash SHA256 et -écrire ce hash dans la définition du paquet (@pxref{Définition des paquets}). -L'outil @command{guix download} aide à cette tâche : il télécharge un -fichier à l'URL donné, l'ajoute au dépôt et affiche à la fois son nom dans -le dépôt et son hash SHA56. +Si @var{obj} est une autre gexp, son contenu est inséré et ses dépendances +sont ajoutées à celle de la gexp qui l'entoure. -Le fait que le fichier téléchargé soit ajouté au dépôt préserve la bande -passante : losque les développeurs finissent par construire le paquet -nouvellement défini avec @command{guix build}, l'archive des sources n'aura -pas besoin d'être téléchargée de nouveau puisqu'elle se trouvera déjà dans -le dépôt. C'est aussi une manière pratique de garder des fichiers -temporairement, qui pourront ensuite être supprimés (@pxref{Invoquer guix gc}). +Si @var{obj} est un autre type d'objet, il est inséré tel quel. -La commande @command{guix download} supporte les mêmes URI que celles -utilisées dans les définitions de paquets. En particulier, elle supporte -les URI @code {mirror://}. Les URI @code{http} (HTTP sur TLS) sont -supportées @emph{si} les liaisons Guile de GnuTLS sont disponibles dans -l'environnement de l'utilisateur ; si elle ne sont pas disponibles, une -erreur est renvoyée. @xref{Guile Preparations, how to install the GnuTLS -bindings for Guile,, gnutls-guile, GnuTLS-Guile}, pour plus d'informations. +@item #$@var{obj}:@var{output} +@itemx (ungexp @var{obj} @var{output}) +Cette forme est similaire à la précédente, mais se réfère explicitement à la +sortie @var{output} de l'objet @var{obj} — c'est utile lorsque @var{obj} +produit plusieurs sorties (@pxref{Des paquets avec plusieurs résultats}). -@command{guix download} vérifie les certificats du serveur HTTPS en -chargeant les autorités de certification X.509 depuis le répertoire vers -lequel pointe la variable d'environnement @code{SSL_CERT_DIR} (@pxref{Certificats X.509}), à moins que @option{--no-check-certificate} ne soit utilisé. +@item #+@var{obj} +@itemx #+@var{obj}:output +@itemx (ungexp-native @var{obj}) +@itemx (ungexp-native @var{obj} @var{output}) +Comme @code{ungexp}, mais produit une référence à la construction +@emph{native} de @var{obj} lorsqu'elle est utilisée dans une compilation +croisée. -Les options suivantes sont disponibles : +@item #$output[:@var{output}] +@itemx (ungexp output [@var{output}]) +Insère une référence à la sortie @var{output} de la dérivation, ou à la +sortie principale lorsque @var{output} est omis. -@table @code -@item --format=@var{fmt} -@itemx -f @var{fmt} -Écrit le hash dans le format spécifié par @var{fmt}. Pour plus -d'informations sur les valeurs valides pour @var{fmt}, @pxref{Invoquer guix hash}. +Cela ne fait du sens que pour les gexps passées à @code{gexp->derivation}. -@item --no-check-certificate -Ne pas valider les certificats HTTPS des serveurs. +@item #$@@@var{lst} +@itemx (ungexp-splicing @var{lst}) +Comme au dessus, mais recolle (@i{splice}) le contenu de @var{lst} dans la +liste qui la contient. -Lorsque vous utilisez cette option, vous n'avez @emph{absolument aucune -garanti} que vous communiquez avec le serveur authentique responsable de -l'URL donnée, ce qui vous rend vulnérable à des attaques de « l'homme du -milieu ». +@item #+@@@var{lst} +@itemx (ungexp-native-splicing @var{lst}) +Comme au dessus, mais se réfère à la construction native des objets listés +dans @var{lst}. -@item --output=@var{fichier} -@itemx -o @var{fichier} -Enregistre le fichier téléchargé dans @var{fichier} plutôt que de l'ajouter -au dépôt. @end table -@node Invoquer guix hash -@section Invoquer @command{guix hash} +Les G-expressions crées par @code{gexp} ou @code{#~} sont des objets à +l'exécution du type @code{gexp?} (voir plus bas). +@end deffn -@cindex @command{guix hash} -La commande @command{guix hash} calcul le hash SHA256 d'un fichier. C'est -surtout un outil pour simplifier la vie des contributeurs de la distribution -: il calcul le hash cryptographique d'un fichier, qui peut être utilisé dans -la définition d'un paquet (@pxref{Définition des paquets}). +@deffn {Syntaxe Scheme} with-imported-modules @var{modules} @var{body}@dots{} +Marque les gexps définies dans @var{body}@dots{} comme requérant +@var{modules} dans leur environnement d'exécution. -La syntaxe générale est : +Chaque élément dans @var{module} peut être le nom d'un module, comme +@code{(guix build utils)} ou le nom d'un module suivi d'une flèche, suivie +d'un objet simili-fichier : @example -guix hash @var{option} @var{fichier} +`((guix build utils) + (guix gcrypt) + ((guix config) => ,(scheme-file "config.scm" + #~(define-module @dots{})))) @end example -Lorsque @var{fichier} est @code{-} (un tiret), @command{guix hash} calcul le -hash des données lues depuis l'entrée standard. @command{guix hash} a les -options suivantes : - -@table @code - -@item --format=@var{fmt} -@itemx -f @var{fmt} -Écrit le hash dans le format spécifié par @var{fmt}. +@noindent +Dans l'exemple au dessus, les deux premiers modules sont récupérés dans le +chemin de recherche, et le dernier est créé à partir d'un objet +simili-fichier. -Les formats supportés sont : @code{nix-base32}, @code{base32}, @code{base16} -(@code{hex} et @code{hexadecimal} peuvent aussi être utilisés). +Cette forme a une portée @emph{lexicale} : elle a un effet sur les gexp +directement définies dans @var{body}@dots{}, mais pas sur celles définies +dans des procédures appelées par @var{body}@dots{}. +@end deffn -Si l'option @option {--format} n'est pas spécifiée, @command{guix hash} -affichera le hash en @code{nix-base32}. Cette représentation est utilisée -dans les définitions des paquets. +@deffn {Syntaxe Scheme} with-extensions @var{extensions} @var{body}@dots{} +Marque les gexps définies dans @var{body}@dots{} comme requérant +@var{extensions} dans leur environnement de construction et d'exécution. +@var{extensions} est typiquement une liste d'objets paquets comme définis +dans le module @code{(gnu packages guile)}. -@item --recursive -@itemx -r -Calcule le hash sur @var{fichier} récursivement. +Concrètement, les paquets listés dans @var{extensions} sont ajoutés au +chemin de chargement lors de la compilation des modules importés dans +@var{body}@dots{} ; ils sont aussi ajoutés au chemin de chargement de la +gexp renvoyée par @var{body}@dots{}. +@end deffn -@c FIXME: Replace xref above with xref to an ``Archive'' section when -@c it exists. -Dans ce cas, le hash est calculé sur une archive contenant @var{fichier}, -dont ses enfants si c'est un répertoire. Certaines métadonnées de -@var{fichier} fait partie de l'archive ; par exemple lorsque @var{fichier} -est un fichier normal, le hash est différent que le @var{fichier} soit -exécutable ou non. Les métadonnées comme un horodatage n'ont aucun impact -sur le hash (@pxref{Invoquer guix archive}). +@deffn {Procédure Scheme} gexp? @var{obj} +Renvoie @code{#t} si @var{obj} est une G-expression. +@end deffn -@item --exclude-vcs -@itemx -x -Lorsqu'elle est combinée à @option{--recursive}, exclut les répertoires de -système de contrôle de version (@file{.bzr}, @file{.git}, @file{.hg}, etc). +Les G-expressions sont conçues pour être écrites sur le disque, soit en tant +que code pour construire une dérivation, soit en tant que fichier normal +dans le dépôt. Les procédure monadiques suivantes vous permettent de faire +cela (@pxref{La monade du dépôt}, pour plus d'information sur les monads). -@vindex git-fetch -Par exemple, voici comment calculer le hash d'un dépôt Git, ce qui est utile -avec la méthode @code{git-fetch} (@pxref{Référence d'origine}) : +@deffn {Procédure monadique} gexp->derivation @var{name} @var{exp} @ + [#:system (%current-system)] [#:target #f] [#:graft? #t] @ +[#:hash #f] [#:hash-algo #f] @ +[#:recursive? #f] [#:env-vars '()] [#:modules '()] @ +[#:module-path @var{%load-path}] @ +[#:effective-version "2.2"] @ +[#:references-graphs #f] [#:allowed-references #f] @ +[#:disallowed-references #f] @ [#:leaked-env-vars #f] @ +[#:script-name (string-append @var{name} "-builder")] @ +[#:deprecation-warnings #f] @ +[#:local-build? #f] [#:substitutable? #t] @ +[#:properties '()] [#:guile-for-build #f] +Renvoie une dérivation @var{name} qui lance @var{exp} (une gexp) avec +@var{guile-for-build} (une dérivation) sur @var{system} ; @var{exp} est +stocké dans un fichier appelé @var{script-name}. Lorsque @var{target} est +vraie, elle est utilisée comme triplet de cible de compilation croisée pour +les paquets référencés par @var{exp}. -@example -$ git clone http://example.org/foo.git -$ cd foo -$ guix hash -rx . -@end example -@end table +@var{modules} est devenu obsolète en faveur de +@code{with-imported-modules}. Sa signification est de rendre @var{modules} +disponibles dans le contexte d'évaluation de @var{exp} ; @var{modules} est +une liste de noms de modules Guile qui sont cherchés dans @var{module-path} +pour les copier dans le dépôt, les compiler et les rendre disponibles dans +le chemin de chargement pendant l'exécution de @var{exp} — p.@: ex.@: +@code{((guix build utils) (guix build gnu-build-system))}. -@node Invoquer guix import -@section Invoquer @command{guix import} +@var{effective-version} détermine la chaîne à utiliser lors d'ajout +d'extensions de @var{exp} (voir @code{with-extensions}) au chemin de +recherche — p.@: ex.@: @code{"2.2"}. -@cindex importer des paquets -@cindex paquets importés -@cindex conversion de paquets -@cindex Invoquer @command{guix import} -La commande @command{guix import} est utile pour les gens qui voudraient -ajouter un paquet à la distribution avec aussi peu de travail que possible — -une demande légitime. La commande connaît quelques dépôts logiciels d'où -elle peut « importer » des métadonnées de paquets. Le résultat est une -définition de paquet, ou un modèle de définition, dans le format reconnu par -Guix (@pxref{Définition des paquets}). +@var{graft?} détermine si les paquets référencés par @var{exp} devraient +être greffés si possible. -La syntaxe générale est : +Lorsque @var{references-graphs} est vrai, il doit s'agir d'une liste de +tuples de la forme suivante : @example -guix import @var{importer} @var{options}@dots{} +(@var{file-name} @var{package}) +(@var{file-name} @var{package} @var{output}) +(@var{file-name} @var{derivation}) +(@var{file-name} @var{derivation} @var{output}) +(@var{file-name} @var{store-item}) @end example -@var{importer} spécifie la source depuis laquelle importer des métadonnées -de paquets, et @var{options} spécifie un identifiant de paquet et d'autres -options spécifiques à @var{importer}. Actuellement les « importateurs » -disponibles sont : +La partie droite des éléments de @var{references-graphs} est automatiquement +transformée en une entrée du processus de construction @var{exp}. Dans +l'environnement de construction, chaque @var{file-name} contient le graphe +des références de l'élément correspondant, dans un format texte simple. -@table @code -@item gnu -Importe des métadonnées d'un paquet GNU donné. Cela fournit un modèle pour -la dernière version de ce paquet GNU, avec le hash de son archive, le -synopsis et la description canonique. +@var{allowed-references} doit soit être @code{#f}, soit une liste de noms de +sorties ou de paquets. Dans ce dernier cas, la liste dénote les éléments du +dépôt auxquels le résultat a le droit de faire référence. Toute référence à +un autre élément du dépôt conduira à une erreur à la construction. Comme +pour @var{disallowed-references}, qui peut lister des éléments qui ne +doivent pas être référencés par les sorties. -Les informations supplémentaires comme les dépendances du paquet et sa -licence doivent être renseignées manuellement. +@var{deprecation-warnings} détermine s'il faut afficher les avertissement +d'obsolescence à la compilation de modules. Il peut valoir @code{#f}, +@code{t} ou @code{'detailed}. -Par exemple, la commande suivante renvoie une définition de paquets pour -GNU@tie{}Hello : +Les autres arguments sont les mêmes que pour @code{derivation} +(@pxref{Dérivations}). +@end deffn + +@cindex objets simili-fichiers +Les procédures @code{local-file}, @code{plain-file}, @code{computed-file}, +@code{program-file} et @code{scheme-file} ci-dessous renvoient des +@dfn{objets simili-fichiers}. C'est-à-dire, lorsqu'ils sont unquotés dans +une G-expression, ces objets donnent un fichier dans le dépôt. Considérez +cette G-expression : @example -guix import gnu hello +#~(system* #$(file-append glibc "/sbin/nscd") "-f" + #$(local-file "/tmp/my-nscd.conf")) @end example -Les options spécifiques sont : +Ici, l'effet est « d'internaliser » @file{/tmp/my-nscd.conf} en le copiant +dans le dépôt. Une fois étendu, par exemple via @code{gexp->derivation}, la +G-expression se réfère à cette copie dans @file{/gnu/store} ; ainsi, +modifier ou supprimer le fichier dans @file{/tmp} n'a aucun effet sur ce que +fait la G-expression. @code{plain-file} peut être utilisé de la même +manière ; elle est seulement différente par le fait que le contenu du +fichier est passé directement par une chaîne de caractères. -@table @code -@item --key-download=@var{politique} -Comme pour @code{guix refresh}, spécifie la politique de gestion des clefs -OpenPGP manquantes lors de la vérification de la signature d'un paquet. -@xref{Invoquer guix refresh, @code{--key-download}}. -@end table +@deffn {Procédure Scheme} local-file @var{file} [@var{name}] @ + [#:recursive? #f] [#:select? (const #t)] +Renvoie un objet représentant un fichier local @var{file} à ajouter au dépôt +; cet objet peut être utilisé dans une gexp. Si @var{file} est un nom de +fichier relatif, il est récupéré à partir de la position du fichier source +dans lequel il apparaît. @var{file} sera ajouté au dépôt sous le nom +@var{name} — par défaut le nom de base de @var{file}. -@item pypi -@cindex pypi -Importe des métadonnées depuis @uref{https://pypi.python.org/, l'index des -paquets Python}@footnote{Cette fonctionnalité requiert l'installation de -Guile-JSON. @xref{Prérequis}.}. Les informations sont récupérées à -partir de la description en JSON disponible sur @code{pypi.python.org} et -inclus généralement toutes les informations utiles, dont les dépendances des -paquets. Pour une efficacité maximale, il est recommandé d'installer -l'utilitaire @command{unzip}, pour que l'importateur puisse dézipper les -wheels Python et récupérer les informations contenues à l'intérieur. +Lorsque @var{recursive?} est vraie, le contenu de @var{file} est ajouté +récursivement ; si @var{file} désigne un fichier simple et que +@var{recursive?} est vrai, son contenu est ajouté et ses bits de permissions +sont préservés. -La commande ci-dessous importe les métadonnées du paquet Python -@code{itsdangerous} : +Lorsque @var{recursive?} est vraie, appelle @code{(@var{select?} @var{file} +@var{stat})} pour chaque répertoire où @var{file} est le nom de fichier +absolu de l'entrée et @var{stat} est le résultat de @code{lstat} ; à +l'exception des entrées pour lesquelles @var{select?} ne renvoie pas vrai. -@example -guix import pypi itsdangerous -@end example +C'est la version déclarative de la procédure monadique @code{interned-file} +(@pxref{La monade du dépôt, @code{interned-file}}). +@end deffn -@table @code -@item --recursive -@itemx -r -Traverse le graphe des dépendances du paquet amont donné et génère les -expressions de paquets de tous ceux qui ne sont pas déjà dans Guix. -@end table +@deffn {Procédure Scheme} plain-file @var{name} @var{content} +Renvoie un objet représentant un fichier texte nommé @var{name} avec pour +contenu @var{content} (une chaîne de caractères ou un vecteur d'octets) à +ajouter un dépôt. -@item gem -@cindex gem -Importe des métadonnées de @uref{https://rubygems.org/, -RubyGems}@footnote{Cette fonctionnalité requiert l'installation de -Guile-JSON. @xref{Prérequis}.}. Les informations sont récupérées au -format JSON disponible sur @code{rubygems.org} et inclut les informations -les plus utiles, comme les dépendances à l'exécution. Il y a des pièges -cependant. Les métadonnées ne distinguent pas synopsis et description, donc -la même chaîne est utilisée pour les deux champs. En plus, les détails des -dépendances non Ruby requises pour construire des extensions natives sont -indisponibles et laissé en exercice au packager. +C'est la version déclarative de @code{text-file}. +@end deffn -La commande ci-dessous importe les métadonnées pour le paquet Ruby -@code{rails} : +@deffn {Procédure Scheme} computed-file @var{name} @var{gexp} @ + [#:options '(#:local-build? #t)] +Renvoie un objet représentant un élément du dépôt @var{name}, un fichier ou +un répertoire calculé par @var{gexp}. @var{options} est une liste +d'arguments supplémentaires à passer à @code{gexp->derivation}. -@example -guix import gem rails -@end example +C'est la version déclarative de @code{gexp->derivation}. +@end deffn -@table @code -@item --recursive -@itemx -r -Traverse le graphe des dépendances du paquet amont donné et génère les -expressions de paquets de tous ceux qui ne sont pas déjà dans Guix. -@end table +@deffn {Procédure monadique} gexp->script @var{name} @var{exp} @ + [#:guile (default-guile)] [#:module-path %load-path] +Renvoie un script exécutable @var{name} qui lance @var{exp} avec +@var{guile}, avec les modules importés de @var{exp} dans son chemin de +recherche. Cherche les modules de @var{exp} dans @var{module-path}. -@item cpan -@cindex CPAN -Importe des métadonnées de @uref{https://www.metacpan.org/, -MetaCPAN}@footnote{Cette fonctionnalité requiert l'installation de -Guile-JSON. @xref{Prérequis}.}. Les informations sont récupérées au -format JSON disponible à travers @uref{https://fastapi.metacpan.org/, l'API -de MetaCPAN} et inclus les informations les plus utiles, comme les -dépendances des modules. L'information sur les licences doit être vérifiée -avec attention. Si Perl est disponible dans le dépôt, alors l'utilitaire -@code{corelist} sera utiliser pour exclure les modules du cœur de la -distribution Perl de la liste des dépendances. +L'exemple ci-dessous construit un script qui invoque simplement la commande +@command{ls} : -La commande ci-dessous importe les métadonnées du module Perl -@code{Acme::Boolean} : +@example +(use-modules (guix gexp) (gnu packages base)) + +(gexp->script "list-files" + #~(execl #$(file-append coreutils "/bin/ls") + "ls")) +@end example + +Lorsqu'elle est « lancée » à travers le dépôt (@pxref{La monade du dépôt, +@code{run-with-store}}), on obtient une dérivation qui produit une fichier +exécutable @file{/gnu/store/@dots{}-list-files} qui ressemble à : @example -guix import cpan Acme::Boolean +#!/gnu/store/@dots{}-guile-2.0.11/bin/guile -ds +!# +(execl "/gnu/store/@dots{}-coreutils-8.22"/bin/ls" "ls") @end example +@end deffn -@item cran -@cindex CRAN -@cindex Bioconductor -Importe des métadonnées de @uref{https://cran.r-project.org/, CRAN}, le -dépôt central de @uref{http://r-project.org, l'environnement statistique et -graphique GUN@tie{}R}. +@deffn {Procédure Scheme} program-file @var{name} @var{exp} @ + [#:guile #f] [#:module-path %load-path] +Renvoie un objet représentant un élément du dépôt @var{name} qui lance +@var{gexp}. @var{guile} est le paquet Guile à utiliser pour exécuter le +script. Les modules importés par @var{gexp} sont recherchés dans +@var{module-path}. -Les informations sont extraites du fichier @file{DESCRIPTION} du paquet. +C'est la version déclarative de @code{gexp->script}. +@end deffn -La commande ci-dessous importe les métadonnées du paquet R @code{Cairo} : +@deffn {Procédure monadique} gexp->file @var{name} @var{exp} @ + [#:set-load-path? #t] [#:module-path %load-path] @ +[#:splice? #f] @ +[#:guile (default-guile)] +Renvoie une dérivation qui construit un fichier @var{name} contenant +@var{exp}. Lorsque @var{splice?} est vrai, @var{exp} est considéré comme +une liste d'expressions qui seront splicée dans le fichier qui en résulte. -@example -guix import cran Cairo -@end example +Lorsque @var{set-load-path?} est vrai, émet du code dans le fichier de +résultat pour initialiser @code{%load-path} et @code{%load-compiled-path} +pour honorer les modules importés de @var{exp}. Les modules de @var{exp} +sont trouvés dans @var{module-path}. -Lorsque l'option @code{--recursive} est utilisée, l'importateur traversera -le graphe des dépendances du paquet amont récursivement et générera des -expressions de paquets pour tous ceux qui ne sont pas déjà dans Guix. +Le fichier qui en résulte retient les références à toutes les dépendances de +@var{exp} ou un sous-ensemble. +@end deffn -Lorsque l'option @code{--archive=bioconductor} est utilisée, les métadonnées -sont importées de @uref{https://www.bioconductor.org/, Bioconductor}, un -répertoire de paquets R pour l'analyse et la compréhension de données -génomiques volumineuses en bioinformatique. +@deffn {Procédure Scheme} scheme-file @var{name} @var{exp} [#:splice? #f] +Renvoie un objet représentant le fichier Scheme @var{name} qui contient +@var{exp}. -Les informations sont extraites du fichier @file{DESCRIPTION} d'un paquet -publié sur l'interface web du dépôt SVN de Bioconductor. +C'est la version déclarative de @code{gexp->file}. +@end deffn -La commande ci-dessous importe les métadonnées du paquet R -@code{GenomicRanges} : +@deffn {Procédure monadique} text-file* @var{name} @var{text} @dots{} +Renvoie une valeur monadique qui construit un ficher texte contenant +@var{text}. @var{text} peut lister, en plus de chaînes de caractères, des +objet de n'importe quel type qui peut être utilisé dans une gexp : des +paquets, des dérivations, des fichiers objet locaux, etc. Le fichier du +dépôt qui en résulte en retient toutes les références. + +Cette variante devrait être préférée à @code{text-file} lorsque vous +souhaitez créer des fichiers qui référencent le dépôt. Cela est le cas +typiquement lorsque vous construisez un fichier de configuration qui +contient des noms de fichiers du dépôt, comme ceci : @example -guix import cran --archive=bioconductor GenomicRanges +(define (profile.sh) + ;; Renvoie le nom d'un script shell dans le dépôt qui initialise + ;; la variable d'environnement « PATH ». + (text-file* "profile.sh" + "export PATH=" coreutils "/bin:" + grep "/bin:" sed "/bin\n")) @end example -@item texlive -@cindex TeX Live -@cindex CTAN -Importe les métadonnées de @uref{http://www.ctan.org/, CTAN}, l'archive TeX -réseau complète pour les paquets TeX qui font partie de la -@uref{https://www.tug.org/texlive/, distribution TeX Live}. - -Les informations sur les paquets sont obtenues à travers l'API XML fournie -par CTAN, tandis que le code source est téléchargé depuis le dépôt SVN du -projet Tex Live. Cette méthode est utilisée parce que CTAN ne garde pas -d'archives versionnées. +Dans cet exemple, le fichier @file{/gnu/store/@dots{}-profile.sh} qui en +résulte référence @var{coreutils}, @var{grep} et @var{sed}, ce qui les +empêche d'être glanés tant que le script est accessible. +@end deffn -La commande ci-dessous importe les métadonnées du paquet TeX @code{fontspec} -: +@deffn {Procédure Scheme} mixed-text-file @var{name} @var{text} @dots{} +Renvoie un objet représentant le fichier du dépôt @var{name} contenant +@var{text}. @var{text} est une séquence de chaînes de caractères et de +fichiers simili-objets, comme dans : @example -guix import texlive fontspec +(mixed-text-file "profile" + "export PATH=" coreutils "/bin:" grep "/bin") @end example -Lorsque l'option @code{--archive=DIRECTORY} est utilisée, le code source -n'est pas téléchargé depuis le sous-répertoire @file{latex} du -l'arborescence @file{texmf-dist/source} dans le dépôt SVN de TeX Live, mais -depuis le répertoire voisin spécifié sous la même racine. +C'est la version déclarative de @code{text-file*}. +@end deffn -La commande ci-dessous importe les métadonnées du paquet @code{ifxetex} -depuis CTAN en récupérant les sources depuis le répertoire -@file{texmf/source/generic} : +@deffn {Procédure Scheme} file-union @var{name} @var{files} +Renvoie un @code{} qui construit un répertoire qui contient +tous les fichiers de @var{files}. Chaque élément de @var{files} doit être +une paire où le premier élément est le nom de fichier à utiliser dans le +nouveau répertoire et le second élément est une gexp dénotant le fichier +cible. Voici un exemple : @example -guix import texlive --archive=generic ifxetex +(file-union "etc" + `(("hosts" ,(plain-file "hosts" + "127.0.0.1 localhost")) + ("bashrc" ,(plain-file "bashrc" + "alias ls='ls --color=auto'")))) @end example -@item json -@cindex JSON, import -Importe des métadonnées d'un fichier JSON local@footnote{Cette -fonctionnalité requiert l'installation de Guile-JSON. -@xref{Prérequis}.}. Considérez l'exemple suivant d'une définition de -paquet au format JSON : +Cela crée un répertoire @code{etc} contenant ces deux fichiers. +@end deffn + +@deffn {Procédure Scheme} directory-union @var{name} @var{things} +Renvoie un répertoire qui est l'union de @var{things}, où @var{things} est +une liste d'objets simili-fichiers qui dénotent des répertoires. Par exemple +: @example -@{ - "name": "hello", - "version": "2.10", - "source": "mirror://gnu/hello/hello-2.10.tar.gz", - "build-system": "gnu", - "home-page": "https://www.gnu.org/software/hello/", - "synopsis": "Hello, GNU world: An example GNU package", - "description": "GNU Hello prints a greeting.", - "license": "GPL-3.0+", - "native-inputs": ["gcc@@6"] -@} +(directory-union "guile+emacs" (list guile emacs)) @end example -Les noms des champs sont les mêmes que pour les enregistrements de -@code{} (@xref{Définition des paquets}). Les référence à d'autres -paquets sont fournies comme des listes JSON de chaînes de spécifications de -paquets comme @code{guile} ou @code{guile@@2.0}. +crée un répertoire qui est l'union des paquets @code{guile} et @code{emacs}. +@end deffn -L'importateur supporte aussi une définition plus explicite des sources avec -les champs habituels pour les enregistrements @code{} : +@deffn {Procédure Scheme} file-append @var{obj} @var{suffix} @dots{} +Renvoie un objet simili-fichier qui correspond à la concaténation de +@var{obj} et @var{suffix} où @var{obj} est un objet abaissable et chaque +@var{suffix} est une chaîne de caractères. + +Par exemple, considérez cette gexp : @example -@{ - @dots{} - "source": @{ - "method": "url-fetch", - "uri": "mirror://gnu/hello/hello-2.10.tar.gz", - "sha256": @{ - "base32": "0ssi1wpaf7plaswqqjwigppsg5fyh99vdlb9kzl7c9lng89ndq1i" - @} - @} - @dots{} -@} +(gexp->script "run-uname" + #~(system* #$(file-append coreutils + "/bin/uname"))) @end example -La commande ci-dessous lit les métadonnées du fichier JSON @code{hello.json} -et renvoie une expression de paquet : +On peut obtenir le même effet avec : @example -guix import json hello.json +(gexp->script "run-uname" + #~(system* (string-append #$coreutils + "/bin/uname"))) @end example -@item nix -Importe les métadonnées d'une copie locale des source de -@uref{http://nixos.org/nixpkgs/, la distribution Nixpkgs}@footnote{Cela -repose sur la commande @command{nix-instantiate} de -@uref{http://nixos.org/nix/, Nix}.}. Les définitions de paquets dans -Nixpkgs sont habituellement écrites en un mélange entre le langage Nix et -Bash. Cette commande n'importe que la structure de haut-niveau du paquet -qui est écrite dans le langage Nix. Elle inclut normalement tous les champs -de base de la définition d'un paquet. +Il y a une différence cependant : dans le cas @code{file-append}, le script +qui en résulte contient le nom de fichier absolu comme une chaîne de +caractère alors que dans le deuxième cas, le script contient une expression +@code{(string-append @dots{})} pour construire le nom de fichier @emph{à +l'exécution}. +@end deffn -Lorsque vous importez un paquet GNU, le synopsis et la description sont -replacés par la version canonique en amont. -Normalement, vous devrez d'abord faire : +Bien sûr, en plus de gexps inclues dans le code « hôte », certains modules +contiennent des outils de construction. Pour savoir facilement qu'ils sont +à utiliser dans la strate de construction, ces modules sont gardés dans +l'espace de nom @code{(guix build @dots{})}. -@example -export NIX_REMOTE=daemon -@end example +@cindex abaissement, des objets haut-niveau dans les gepxs +En interne, les objets de haut-niveau sont @dfn{abaissés}, avec leur +compilateur, soit en des dérivations, soit en des objets du dépôt. Par +exemple, abaisser un paquet crée une dérivation, et abaisser un +@code{plain-file} crée un élément du dépôt. Cela est effectué par la +procédure monadique @code{lower-object}. -@noindent -pour que @command{nix-instantiate} n'essaye pas d'ouvrir la base de données -de Nix. +@deffn {Procédure monadique} lower-object @var{obj} [@var{system}] @ + [#:target #f] +Renvoie la dérivation ou l'élément du dépôt comme une valeur de +@var{%store-monad} qui correspond à @var{obj} pour @var{system}, en +compilant de manière croisée pour @var{target} si @var{target} est vrai. +@var{obj} doit être un objet qui a un compilateur de gexp associé, comme un +@code{}. +@end deffn -Par exemple, la commande ci-dessous importe la définition du paquet de -LibreOffice (plus précisément, elle importe la définition du paquet lié à -l'attribut de plus haut-niveau @code{libreoffice}) : +@node Invoquer guix repl +@section Invoquer @command{guix repl} + +@cindex REPL, read-eval-print loop +La commande @command{guix repl} démarre un @dfn{boucle +lecture-évaluation-affichage} Guile pour la programmation interactive +(@pxref{Using Guile Interactively,,, guile, GNU Guile Reference Manual}). +Comparé au lancement de la commande @command{guile}, @command{guix repl} +garanti que tous les modules Guix et toutes ses dépendances sont disponibles +dans le chemin de recherche. Vous pouvez l'utiliser de cette manière : @example -guix import nix ~/path/to/nixpkgs libreoffice +$ guix repl +scheme@@(guile-user)> ,use (gnu packages base) +scheme@@(guile-user)> coreutils +$1 = # @end example -@item hackage -@cindex hackage -Importe les métadonnées de l'archive de paquets centrale de la communauté -Haskell, @uref{https://hackage.haskell.org/, Hackage}. Les informations -sont récupérées depuis les fichiers Cabal et incluent toutes les -informations utiles, dont les dépendances des paquets. +@cindex inférieurs +En plus, @command{guix repl} implémente un protocole REPL simple lisible par +une machine à utiliser avec @code{(guix inferior)}, un dispositif pour +interagir avec des @dfn{inférieurs}, des processus séparés qui font tourner +une version potentiellement différente de Guix. -Les options spécifiques sont : +Les options disponibles sont les suivante : @table @code -@item --stdin -@itemx -s -Lit un fichier Cabal depuis l'entrée standard. -@item --no-test-dependencies -@itemx -t -N'inclut pas les dépendances requises uniquement par les suites de tests. -@item --cabal-environment=@var{alist} -@itemx -e @var{alist} -@var{alist} est une alist Scheme qui définie l'environnement dans lequel les -conditions de Cabal sont évaluées. Les clefs acceptées sont : @code{os}, -@code{arch}, @code{impl} et une représentation sous forme de chaîne de -caractères du nom d'un drapeau. La valeur associée à un drapeau doit être -le symbole @code{true} ou @code{false}. La valeur associée aux autres clefs -doivent se conformer avec la définition du format de fichiers Cabal. La -valeur par défaut associée avec les clefs @code{os}, @code{arch} et -@code{impl} sont respectivement @samp{linux}, @samp{x86_64} et @samp{ghc}. -@item --recursive -@itemx -r -Traverse le graphe des dépendances du paquet amont donné et génère les -expressions de paquets de tous ceux qui ne sont pas déjà dans Guix. +@item --type=@var{type} +@itemx -t @var{type} +Démarrer un REPL du @var{type} donné, qui peut être l'un de ces types : + +@table @code +@item guile +C'est la valeur par défaut. Elle démarre un REPL Guile standard +fonctionnel. +@item machine +Démarre un REPL qui utilise le protocole lisible par machine. C'est le +protocole que parle le module @code{(guix inferior)}. @end table -La commande ci-dessous importe les métadonnées de la dernière version du -paquet Haskell @code{HTTP} sans inclure les dépendances des tests et en -spécifiant la valeur du drapeau @samp{network-uri} comme étant @code{false} -: +@item --listen=@var{extrémité} +Par défaut, @command{guix repl} lit depuis l'entrée standard et écrit sur la +sortie standard. Lorsque cette option est passée, il écoutera plutôt les +connexions sur @var{endpoint}. Voici un exemple d'options valides : -@example -guix import hackage -t -e "'((\"network-uri\" . false))" HTTP -@end example +@table @code +@item --listen=tcp:37146 +Accepte les connexions sur localhost, sur le port 31. -Une version spécifique du paquet peut éventuellement être spécifiée en -faisant suivre le nom du paquet par un arobase et un numéro de version comme -dans l'exemple suivant : +@item --listen=unix:/tmp/socket +Accepte les connexions sur le socket Unix-domain @file{/tmp/socket}. +@end table +@end table -@example -guix import hackage mtl@@2.1.3.1 -@end example +@c ********************************************************************* +@node Utilitaires +@chapter Utilitaires -@item stackage -@cindex stackage -L'importateur @code{stackage} est une enveloppe autour de l'importateur -@code{hackage}. Il prend un nom de paquet, recherche la version incluse -dans une version au support étendu (LTS) de @uref{https://www.stackage.org, -Stackage} et utilise l'importateur @code{hackage} pour récupérer les -métadonnées. Remarquez que c'est à vous de choisir une version LTS -compatible avec le compilateur GHC utilisé par Guix. +cette section décrit les utilitaires en ligne de commande de Guix. certains +sont surtout faits pour les développeurs qui écrivent de nouvelles +définitions de paquets tandis que d'autres sont plus utiles pour une +utilisation générale. Ils complètent l'interface de programmation Scheme de +Guix d'une manière pratique. -Les options spécifiques sont : +@menu +* Invoquer guix build:: Construire des paquets depuis la ligne de + commande. +* Invoquer guix edit:: Modifier les définitions de paquets. +* Invoquer guix download:: Télécharger un fichier et afficher son hash. +* Invoquer guix hash:: Calculer le hash cryptographique d'un fichier. +* Invoquer guix import:: Importer des définitions de paquets. +* Invoquer guix refresh:: Mettre à jour les définitions de paquets. +* Invoquer guix lint:: Trouver des erreurs dans les définitions de + paquets. +* Invoquer guix size:: Profiler l'utilisation du disque. +* Invoquer guix graph:: Visualiser le graphe des paquets. +* Invoquer guix publish:: Partager des substituts. +* Invoquer guix challenge:: Défier les serveurs de substituts. +* Invoquer guix copy:: Copier vers et depuis un dépôt distant. +* Invoquer guix container:: Isolation de processus. +* Invoquer guix weather:: Mesurer la disponibilité des substituts. +* Invoquer guix processes:: Lister les processus clients. +@end menu -@table @code -@item --no-test-dependencies -@itemx -t -N'inclut pas les dépendances requises uniquement par les suites de tests. -@item --lts-version=@var{version} -@itemx -l @var{version} -@var{version} est la version LTS désirée. Si elle est omise, la dernière -version est utilisée. -@item --recursive -@itemx -r -Traverse le graphe des dépendances du paquet amont donné et génère les -expressions de paquets de tous ceux qui ne sont pas déjà dans Guix. -@end table +@node Invoquer guix build +@section Invoquer @command{guix build} -La commande ci-dessous importe les métadonnées du paquet Haskell @code{HTTP} -inclus dans la version LTS 7.18 de Stackage : +@cindex construction de paquets +@cindex @command{guix build} +La commande @command{guix build} construit des paquets ou des dérivations et +leurs dépendances et affiche les chemins du dépôt qui en résulte. Remarquez +qu'elle ne modifie pas le profil de l'utilisateur — c'est le travail de la +commande @command{guix package} (@pxref{Invoquer guix package}). Ainsi, +elle est surtout utile pour les développeurs de la distribution. + +La syntaxe générale est : @example -guix import stackage --lts-version=7.18 HTTP +guix build @var{options} @var{package-or-derivation}@dots{} @end example -@item elpa -@cindex elpa -Importe les métadonnées du dépôt de paquets ELPA (Emacs Lisp Package -Archive) (@pxref{Packages,,, emacs, The GNU Emacs Manual}). - -Les options spécifiques sont : +Par exemple, la commande suivante construit la dernière version d'Emacs et +de Guile, affiche leur journaux de construction et enfin affiche les +répertoires des résultats : -@table @code -@item --archive=@var{repo} -@itemx -a @var{repo} -@var{repo} identifie le dépôt d'archive depuis lequel récupérer les -informations. Actuellement les dépôts supportés et leurs identifiants sont -: -@itemize - -@item -@uref{http://elpa.gnu.org/packages, GNU}, qu'on peut choisir avec -l'identifiant @code{gnu}. C'est la valeur par défaut. +@example +guix build emacs guile +@end example -Les paquets de @code{elpa.gnu.org} avec l'une des clefs contenues dans le -porte-clef GnuPG @file{share/emacs/25.1/etc/package-keyring.gpg} (ou -similaire) dans le paquet @code{emacs} (@pxref{Package Installation, ELPA -package signatures,, emacs, The GNU Emacs Manual}). +De même, la commande suivante construit tous les paquets disponibles : -@item -@uref{http://stable.melpa.org/packages, MELPA-Stable}, qu'on peut -sélectionner avec l'identifiant @code{melpa-stable}. +@example +guix build --quiet --keep-going \ + `guix package -A | cut -f1,2 --output-delimiter=@@` +@end example -@item -@uref{http://melpa.org/packages, MELPA}, qu'on peut sélectionner avec -l'identifiant @code{melpa}. -@end itemize +@var{package-or-derivation} peut être soit le nom d'un paquet trouvé dans la +distribution logicielle comme @code{coreutils}, soit @code{coreutils@@8.20}, +soit une dérivation comme @file{/gnu/store/@dots{}-coreutils-8.19.drv}. +Dans le premier cas, la commande cherchera un paquet avec le nom +correspondant (et éventuellement la version) dans les modules de la +distribution GNU (@pxref{Modules de paquets}). -@item --recursive -@itemx -r -Traverse le graphe des dépendances du paquet amont donné et génère les -expressions de paquets de tous ceux qui ne sont pas déjà dans Guix. -@end table +Autrement, l'option @code{--expression} peut être utilisée pour spécifier +une expression Scheme qui s'évalue en un paquet ; c'est utile pour +différencier des paquets avec le même nom ou des variantes de paquets. -@item crate -@cindex crate -Importe les métadonnées du répertoire des paquets Rust -@uref{https://crates.io, crates.io}. +Il peut y avoir aucune, une ou plusieurs @var{options}. Les options +disponibles sont décrites dans les sous-sections ci-dessous. -@item opam -@cindex OPAM -@cindex OCaml -Importe les métadonnées du répertoire de paquets -@uref{https://opam.ocaml.org/, OPAM} utilisé par la communauté OCaml -@end table +@menu +* Options de construction communes:: Options de construction pour la + plupart des commandes. +* Options de transformation de paquets:: Créer des variantes de paquets. +* Options de construction supplémentaires:: Options spécifiques à « + guix build ». +* Débogage des échecs de construction:: La vie d'un empaqueteur. +@end menu -La structure du code de @command{guix import} est modulaire. Il serait -utile d'avoir plus d'importateurs pour d'autres formats de paquets et votre -aide est la bienvenue sur ce sujet (@pxref{Contribuer}). +@node Options de construction communes +@subsection Options de construction communes -@node Invoquer guix refresh -@section Invoquer @command{guix refresh} +Un certain nombre d'options qui contrôlent le processus de construction sont +communes avec @command{guix build} et les autres commandes qui peuvent +générer des constructions, comme @command{guix package} ou @command{guix +archive}. Voici ces options : -@cindex @command{guix refresh} -L'audience première de la commande @command{guix refresh} est l'ensemble des -développeurs de la distribution logicielle GNU. Par défaut, elle rapporte -les paquets fournis par la distribution qui sont en retard par rapport aux -dernières versions disponibles en amont, comme ceci : +@table @code -@example -$ guix refresh -gnu/packages/gettext.scm:29:13: gettext serait mis à jour de 0.18.1.1 à 0.18.2.1 -gnu/packages/glib.scm:77:12: glib serait mis à jour de 2.34.3 à 2.37.0 -@end example +@item --load-path=@var{répertoire} +@itemx -L @var{répertoire} +Ajoute @var{répertoire} au début du chemin de recherche de module de paquets +(@pxref{Modules de paquets}). -Autrement, on peut spécifier les paquets à considérer, auquel cas un -avertissement est émis pour les paquets qui n'ont pas de gestionnaire de -mise à jour associé : +Cela permet à des utilisateurs de définir leur propres paquets et les rendre +disponibles aux outils en ligne de commande. -@example -$ guix refresh coreutils guile guile-ssh -gnu/packages/ssh.scm:205:2 : avertissement : aucun gestionnaire de mise à jour pour guile-ssh -gnu/packages/guile.scm:136:12 : guile serait mis à jour de 2.0.12 à 2.0.13 -@end example +@item --keep-failed +@itemx -K +Garde l'arborescence de construction des constructions en échec. Ainsi, si +une construction échoue, son arborescence de construction est préservée dans +@file{/tmp}, dans un répertoire dont le nom est affiché à la fin du journal +de construction. Cela est utile pour déboguer des échecs de construction. +@xref{Débogage des échecs de construction}, pour des astuces sur la manière de déboguer +des problèmes de construction. -@command{guix refresh} navigue le dépôt amont de chaque paquet et détermine -le numéro de version le plus élevé parmi les versions publiées. La commande -sait comment mettre à jour certains types de paquets : les paquets GNU, les -paquets ELPA, etc. — voir la documentation pour @option{--type} ci-dessous. -Il y a beaucoup de paquet cependant pour lesquels il manque une méthode pour -déterminer si une nouvelle version est disponible en amont. Cependant, le -mécanisme est extensible, alors n'hésitez pas à nous contacter pour ajouter -une nouvelle méthode ! +Cette option n'a pas d'effet lors de la connexion à un démon distant avec +l'URI @code{guix://} (@pxref{Le dépôt, la variable +@code{GUIX_DAEMON_SOCKET}}). -Parfois les noms en amont diffèrent du nom de paquet utilisé par Guix et -@command{guix refresh} a besoin d'un peu d'aide. La plupart des -gestionnaires de mise à jour honorent la propriété @code{upstream-name} dans -les définitions de paquets, ce qui peut être utilisé à cette fin : +@item --keep-going +@itemx -k +Continue lorsque certaines dérivations échouent ; ne s'arrête que lorsque +toutes les constructions ont soit réussies, soit échouées. -@example -(define-public network-manager - (package - (name "network-manager") - ;; @dots{} - (properties '((upstream-name . "NetworkManager"))))) -@end example +Le comportement par défaut est de s'arrêter dès qu'une des dérivations +spécifiées échoue. -Lorsque l'option @code{--update} est utilisée, elle modifie les fichiers -source de la distribution pour mettre à jour le numéro de version et le hash -de l'archive source de ces recettes de paquets (@pxref{Définition des paquets}). -Cela est effectué en téléchargeant la dernière version de l'archive des -sources de chaque paquet et des signatures associées, en authentifiant -l'archive téléchargée avec sa signature en utilisant @command{gpg} puis en -calculant son hash. Lorsque la clef publique utilisée pour signer l'archive -manque du porte-clefs de l'utilisateur, le gestionnaire tente de la -récupérer automatiquement d'un serveur de clef public ; si cela réussi, la -clef est ajoutée au porte-clefs de l'utilisateur, sinon @command{guix -refresh} rapporte une erreur. +@item --dry-run +@itemx -n +Ne pas construire les dérivations. -Les options suivantes sont supportées : +@anchor{option de repli} +@item --fallback +Lorsque la substitution d'un binaire pré-compilé échoue, construit les +paquets localement à la place (@pxref{Échec de substitution}). -@table @code +@item --substitute-urls=@var{urls} +@anchor{client-substitute-urls} +Considère @var{urls} comme une liste d'URL de sources de substituts séparés +par des espaces, et remplace la liste par défaut d'URL de +@command{guix-daemon} (@pxref{daemon-substitute-urls,, @command{guix-daemon} +URLs}). -@item --expression=@var{expr} -@itemx -e @var{expr} -Considérer le paquet évalué par @var{expr}. +Cela signifie que les substituts peuvent être téléchargés depuis @var{urls}, +tant qu'ils sont signés par une clef autorisée par l'administrateur système +(@pxref{Substituts}). -C'est utile pour précisément se référer à un paquet, comme dans cet exemple -: +Lorsque @var{urls} est la chaîne vide, cela a pour effet de désactiver la +substitution. -@example -guix refresh -l -e '(@@@@ (gnu packages commencement) glibc-final)' -@end example +@item --no-substitutes +Ne pas utiliser de substitut pour les résultats de la construction. +C'est-à-dire, toujours construire localement plutôt que de permettre le +téléchargement de binaires pré-construits (@pxref{Substituts}). -Cette commande liste les paquets qui dépendent de la libc « finale » (en -gros tous les paquets). +@item --no-grafts +Ne par « greffer » les paquets. En pratique, cela signifie que les mises à +jour des paquets disponibles comme des greffes ne sont pas appliquées. +@xref{Mises à jour de sécurité}, pour plus d'information sur les greffes. -@item --update -@itemx -u -Met à jour les fichiers source de la distribution (les recettes de paquets) -en place. Cette option est généralement utilisée depuis une copie du dépôt -git de Guix (@pxref{Lancer Guix avant qu'il ne soit installé}) : +@item --rounds=@var{n} +Construit chaque dérivation @var{n} fois d'affilé, et renvoie une erreur si +les constructions consécutives ne sont pas identiques bit-à-bit. -@example -$ ./pre-inst-env guix refresh -s non-core -u -@end example +Cela est une manière utile pour détecter des processus de construction non +déterministes. Les processus de construction non déterministes sont +problématiques car ils rendent pratiquement impossible la +@emph{vérification} par les utilisateurs de l'authenticité de binaires +tiers. @xref{Invoquer guix challenge}, pour plus d'informations. -@xref{Définition des paquets}, pour plus d'information sur les définitions des -paquets. +Remarquez que, les résultats qui diffèrent ne sont pas gardés, donc vous +devrez inspecter manuellement chaque erreur — p.@: ex.@: en gardant l'un des +résultats avec @code{guix archive --export} (@pxref{Invoquer guix archive}), +puis en reconstruisant, et enfin en comparant les deux résultats. -@item --select=[@var{subset}] -@itemx -s @var{subset} -Choisi tous les paquets dans @var{subset}, entre @code{core} et -@code{non-core}. +@item --no-build-hook +N'essaye pas de décharger les constructions via le « crochet de construction +» du démon (@pxref{Réglages du délestage du démon}). C'est-à-dire que tout sera +construit localement plutôt que de décharger les constructions à une machine +distante. -Le sous-ensemble @code{core} se réfère à tous les paquets du cœur de la -distribution — c.-à-d.@: les paquets qui sont utilisés pour construire « -tout le rest ». Cela comprend GCC, libc, Binutils, Bash, etc. -Habituellement, changer l'un de ces paquets dans la distribution implique de -reconstruire tous les autres. Ainsi, ces mises à jour sont une nuisance -pour les utilisateurs, en terme de temps de compilation et de bande passante -utilisés pour effectuer la mise à jour. +@item --max-silent-time=@var{secondes} +Lorsque le processus de construction ou de substitution restent silencieux +pendant plus de @var{secondes}, le terminer et rapporter une erreur de +construction. -Le sous-ensemble @code{non-core} se réfère au reste des paquets. C'est -habituellement utile dans les cas où une mise à jour des paquets du cœur -serait dérangeante. +Par défaut, les paramètres du démon sont pris en compte (@pxref{Invoquer guix-daemon, @code{--max-silent-time}}). -@item --manifest=@var{fichier} -@itemx -m @var{fichier} -Choisi tous les paquets du manifeste dans @var{file}. C'est utile pour -vérifier qu'aucun des paquets du manifeste utilisateur ne peut être mis à -jour. +@item --timeout=@var{secondes} +De même, lorsque le processus de construction ou de substitution dure plus +de @var{secondes}, le terminer et rapporter une erreur de construction. -@item --type=@var{updater} -@itemx -t @var{updater} -Chois uniquement les paquets pris en charge par @var{updater} -(éventuellement une liste de gestionnaires de mise à jour séparés par des -virgules). Actuellement, @var{updater} peut être l'une des valeurs suivantes -: +Par défaut, les paramètres du démon sont pris en compte (@pxref{Invoquer guix-daemon, @code{--timeout}}). -@table @code -@item gnu -le gestionnaire de mise à jour pour les paquets GNU ; -@item gnome -le gestionnaire de mise à jour pour les paquets GNOME ; -@item kde -le gestionnaire de mise à jour pour les paquets KDE ; -@item xorg -le gestionnaire de mise à jour pour les paquets X.org ; -@item kernel.org -le gestionnaire de mise à jour pour les paquets hébergés sur kernel.org ; -@item elpa -le gestionnaire de mise à jour pour les paquets @uref{http://elpa.gnu.org/, -ELPA} ; -@item cran -le gestionnaire de mise à jour pour les paquets -@uref{https://cran.r-project.org/, CRAN} ; -@item bioconductor -le gestionnaire de mise à jour pour les paquets -@uref{https://www.bioconductor.org/, Bioconductor} ; -@item cpan -le gestionnaire de mise à jour pour les paquets @uref{http://www.cpan.org/, -CPAN} ; -@item pypi -le gestionnaire de mise à jour pour les paquets -@uref{https://pypi.python.org, PyPI} ; -@item gem -le gestionnaire de mise à jour pour les paquets @uref{https://rubygems.org, -RubyGems} ; -@item github -le gestionnaire de mise à jour pour les paquets @uref{https://github.com, -GitHub} ; -@item hackage -le gestionnaire de mise à jour pour les paquets -@uref{https://hackage.haskell.org, Hackage} ; -@item stackage -le gestionnaire de mise à jour pour les paquets -@uref{https://www.stackage.org, Stackage} ; -@item crate -le gestionnaire de mise à jour pour les paquets @uref{https://crates.io, -Crates} ; -@end table +@c Note: This option is actually not part of %standard-build-options but +@c most programs honor it. +@cindex verbosity, of the command-line tools +@cindex build logs, verbosity +@item -v @var{level} +@itemx --verbosity=@var{level} +Use the given verbosity @var{level}, an integer. Choosing 0 means that no +output is produced, 1 is for quiet output, and 2 shows all the build log +output on standard error. -Par exemple, la commande suivante ne vérifie que les mises à jour des -paquets Emacs hébergés sur @code{elpa.gnu.org} et les paquets CRAN : +@item --cores=@var{n} +@itemx -c @var{n} +Permet d'utiliser jusqu'à @var{n} cœurs du CPU pour la construction. La +valeur spéciale @code{0} signifie autant de cœurs que possible. -@example -$ guix refresh --type=elpa,cran -gnu/packages/statistics.scm:819:13 : r-testthat serait mis à jour de 0.10.0 à 0.11.0 -gnu/packages/emacs.scm:856:13 : emacs-auctex serait mis à jour de 11.88.6 à 11.88.9 -@end example +@item --max-jobs=@var{n} +@itemx -M @var{n} +Permet au plus @var{n} travaux de construction en parallèle. @xref{Invoquer guix-daemon, @code{--max-jobs}}, pour plus de détails sur cette option et +l'option équivalente pour @command{guix-daemon}. + +@item --debug=@var{level} +Produce debugging output coming from the build daemon. @var{level} must be +an integer between 0 and 5; higher means more verbose output. Setting a +level of 4 or more may be helpful when debugging setup issues with the build +daemon. @end table -En plus, on peut passer à @command{guix refresh} un ou plusieurs noms de -paquets, comme dans cet exemple : +Sous le capot, @command{guix build} est surtout un interface à la procédure +@code{package-derivation} du module @code{(guix packages)}, et à la +procédure @code{build-derivations} du module @code{(guix derivations)}. + +En plus des options passées explicitement par la ligne de commande, +@command{guix build} et les autres commande @command{guix} qui peuvent +effectuer des construction honorent la variable d'environnement +@code{GUIX_BUILD_OPTIONS}. + +@defvr {Variable d'environnement} GUIX_BUILD_OPTIONS +Les utilisateurs peuvent définir cette variable à une liste d'options de la +ligne de commande qui seront automatiquement utilisées par @command{guix +build} et les autres commandes @command{guix} qui peuvent effectuer des +constructions, comme dans l'exemple suivant : @example -$ ./pre-inst-env guix refresh -u emacs idutils gcc@@4.8 +$ export GUIX_BUILD_OPTIONS="--no-substitutes -c 2 -L /foo/bar" @end example -@noindent -La commande au-dessus met à jour spécifiquement les paquets @code{emacs} et -@code{idutils}. L'option @code{--select} n'aurait aucun effet dans ce cas. +Ces options sont analysées indépendamment, et le résultat est ajouté aux +options de la ligne de commande analysées. +@end defvr -Pour déterminer s'il faut mettre à jour un paquet, il est parfois pratique -de savoir quels paquets seraient affectés par la mise à jour pour pouvoir -vérifier la compatibilité. Pour cela l'option suivante peut être utilisée -avec un ou plusieurs noms de paquets passés à @command{guix refresh} : + +@node Options de transformation de paquets +@subsection Options de transformation de paquets + +@cindex variantes de paquets +Un autre ensemble d'options de la ligne de commande supportés par +@command{guix build} et aussi @command{guix package} sont les @dfn{options +de transformation de paquets}. Ce sont des options qui rendent possible la +définition de @dfn{variantes de paquets} — par exemple, des paquets +construit à partir de sources différentes. C'est une manière simple de +créer des paquets personnalisés à la volée sans avoir à taper les +définitions de variantes de paquets (@pxref{Définition des paquets}). @table @code -@item --list-updaters -@itemx -L -Liste les gestionnaires de mise à jour et quitte (voir l'option -@option{--type} plus haut). +@item --with-source=@var{source} +@itemx --with-source=@var{paquet}=@var{source} +@itemx --with-source=@var{paquet}@@@var{version}=@var{source} +Utiles @var{source} comme la source de @var{paquet}, et @var{version} comme +son numéro de version. @var{source} doit être un nom de fichier ou une URL, +comme pour @command{guix download} (@pxref{Invoquer guix download}). -Pour chaque gestionnaire, affiche le pourcentage de paquets qu'il couvre ; à -la fin, affiche le pourcentage de paquets couverts par tous les -gestionnaires. +Lorsque @var{paquet} est omis, la commande utilisera le nom de paquet +spécifié par la base de @var{source} — p.@: ex.@: si @var{source} est +@code{/src/guix-2.0.10.tar.gz}, le paquet correspondant est @code{guile}. -@item --list-dependent -@itemx -l -Liste les paquets de plus haut-niveau qui devraient être reconstruits après -la mise à jour d'un ou plusieurs paquets. +De même, lorsque @var{version} est omis, la chaîne de version est inférée à +partir de @var{source} ; dans l'exemple précédent, il s'agit de +@code{2.0.10}. -@xref{Invoquer guix graph, le type @code{reverse-package} de @command{guix -graph}}, pour des informations sur la manière de visualiser la liste des -paquets dépendant d'un autre. +Cette option permet aux utilisateurs d'essayer des version des paquets +différentes de celles fournies par la distribution. L'exemple ci-dessous +télécharge @file{ed-1.7.tar.g} depuis un miroir GNU et l'utilise comme +source pour le paquet @code{ed} : -@end table +@example +guix build ed --with-source=mirror://gnu/ed/ed-1.7.tar.gz +@end example -Soyez conscients que l'option @code{--list-dependent} ne fait -@emph{qu'approximer} les reconstructions qui seraient requises par une mise -à jour. Plus de reconstructions pourraient être requises dans certaines -circonstances. +En tant que développeur, @code{--with-source} permet de tester facilement +des version bêta : @example -$ guix refresh --list-dependent flex -Building the following 120 packages would ensure 213 dependent packages are rebuilt: -hop@@2.4.0 geiser@@0.4 notmuch@@0.18 mu@@0.9.9.5 cflow@@1.4 idutils@@4.6 @dots{} +guix build guile --with-source=../guile-2.0.9.219-e1bb7.tar.xz @end example -La commande ci-dessus liste un ensemble de paquets qui peuvent être -construits pour vérifier la compatibilité d'une mise à jour de @code{flex}. +@dots{} ou pour construire un dépôt de gestion de version dans un +environnement vierge : -Les options suivante peuvent être utilisées pour personnaliser les -opérations avec GnuPG : +@example +$ git clone git://git.sv.gnu.org/guix.git +$ guix build guix --with-source=guix@@1.0=./guix +@end example -@table @code +@item --with-input=@var{paquet}=@var{remplaçant} +Remplace la dépendance sur @var{paquet} par une dépendance à +@var{remplaçant}. @var{paquet} doit être un nom de paquet et +@var{remplaçant} doit être une spécification de paquet comme @code{guile} ou +@code{guile@@1.8}. -@item --gpg=@var{commande} -Utilise @var{commande} comme la commande de GnuPG 2.x. @var{commande} est -recherchée dans @code{PATH}. +Par exemple, la commande suivante construit Guix, mais remplace sa +dépendance à la version stable actuelle de Guile par une dépendance à une +ancienne version de Guile, @code{guile@@2.0} : -@item --keyring=@var{fichier} -Utilise @var{fichier} comme porte-clefs pour les clefs amont. @var{fichier} -doit être dans le @dfn{format keybox}. Les fichiers Keybox ont d'habitude -un nom qui fini par @file{.kbx} et GNU@tie{}Privacy Guard (GPG) peut -manipuler ces fichiers (@pxref{kbxutil, @command{kbxutil},, gnupg, Using the -Privacy Guard}, pour plus d'informations sur un outil pour manipuler des -fichiers keybox). +@example +guix build --with-input=guile=guile@@2.0 guix +@end example -Lorsque cette option est omise, @command{guix refresh} utilise -@file{~/.config/guix/upstream/trustedkeys.kbx} comme porte-clefs pour les -clefs de signature amont. Les signatures OpenPGP sont vérifiées avec ces -clefs ; les clefs manquantes sont aussi téléchargées dans ce porte-clefs -(voir @option{--key-download} plus bas). +C'est un remplacement récursif profond. Donc dans cet exemple, à la fois +@code{guix} et ses dépendances @code{guile-json} (qui dépend aussi de +@code{guile}) sont reconstruits avec @code{guile@@2.0}. -Vous pouvez exporter les clefs de votre porte-clefs GPG par défaut dans un -fichier keybox avec une commande telle que : +Cette option est implémentée avec la procédure Scheme +@code{package-input-rewriting} (@pxref{Définition des paquets, +@code{package-input-rewriting}}). + +@item --with-graft=@var{paquet}=@var{remplaçant} +Cette option est similaire à @code{--with-input} mais avec une différence +importante : plutôt que de reconstruire la chaîne de dépendance complète, +@var{remplaçant} est construit puis @dfn{greffé} sur les binaires qui +référençaient initialement @var{paquet}. @xref{Mises à jour de sécurité}, pour plus +d'information sur les greffes. + +Par exemple, la commande ci-dessous greffe la version 3.5.4 de GnuTLS sur +Wget et toutes ses dépendances, en remplaçant les références à la version +actuelle de GnuTLS à laquelle ils se réfèrent actuellement : @example -gpg --export rms@@gnu.org | kbxutil --import-openpgp >> mykeyring.kbx +guix build --with-graft=gnutls=gnutls@@3.5.4 wget @end example -De même, vous pouvez récupérer des clefs dans un fichier keybox spécifique -comme ceci : +Cela a l'avantage d'être bien plus rapide que de tout reconstruire. Mais il +y a un piège : cela ne fonctionne que si @var{paquet} et @var{remplaçant} +sont strictement compatibles — par exemple, s'ils fournissent une +bibliothèque, l'interface binaire applicative (ABI) de ces bibliothèques +doivent être compatibles. Si @var{remplaçant} est incompatible avec +@var{paquet}, alors le paquet qui en résulte peut devenir inutilisable. À +utilisez avec précaution ! + +@item --with-branch=@var{package}=@var{branch} +@cindex Git, using the latest commit +@cindex latest commit, building +Build @var{package} from the latest commit of @var{branch}. The +@code{source} field of @var{package} must be an origin with the +@code{git-fetch} method (@pxref{Référence d'origine}) or a @code{git-checkout} +object; the repository URL is taken from that @code{source}. Git +sub-modules of the repository are fetched, recursively. + +For instance, the following command builds @code{guile-sqlite3} from the +latest commit of its @code{master} branch, and then builds @code{guix} +(which depends on it) and @code{cuirass} (which depends on @code{guix}) +against this specific @code{guile-sqlite3} build: @example -gpg --no-default-keyring --keyring mykeyring.kbx \ - --recv-keys @value{OPENPGP-SIGNING-KEY-ID} +guix build --with-branch=guile-sqlite3=master cuirass @end example -@ref{GPG Configuration Options, @option{--keyring},, gnupg, Using the GNU -Privacy Guard} pour plus d'informations sur l'option @option{--keyring} de -GPG. +@cindex intégration continue +Obviously, since it uses the latest commit of the given branch, the result +of such a command varies over time. Nevertheless it is a convenient way to +rebuild entire software stacks against the latest commit of one or more +packages. This is particularly useful in the context of continuous +integration (CI). -@item --key-download=@var{politique} -Gère les clefs OpenPGP manquantes d'après la @var{politique}, qui peut être -l'une des suivantes : +Checkouts are kept in a cache under @file{~/.cache/guix/checkouts} to speed +up consecutive accesses to the same repository. You may want to clean it up +once in a while to save disk space. -@table @code -@item always -Toujours télécharger les clefs manquantes depuis un serveur de clefs et les -ajouter au porte-clefs de l'utilisateur. +@item --with-commit=@var{package}=@var{commit} +This is similar to @code{--with-branch}, except that it builds from +@var{commit} rather than the tip of a branch. @var{commit} must be a valid +Git commit SHA1 identifier. +@end table -@item never -Ne jamais essayer de télécharger les clefs OpenPGP manquante. Quitter à la -place. +@node Options de construction supplémentaires +@subsection Options de construction supplémentaires + +Les options de la ligne de commande ci-dessous sont spécifiques à +@command{guix build}. -@item interactive -Lorsqu'on rencontre un paquet signé par une clef OpenPGP inconnue, demander -à l'utilisateur s'il souhaite la télécharger ou non. C'est le comportement -par défaut. -@end table +@table @code -@item --key-server=@var{host} -Utiliser @var{host} comme serveur de clefs OpenPGP lors de l'importe d'une -clef publique. +@item --quiet +@itemx -q +Build quietly, without displaying the build log; this is equivalent to +@code{--verbosity=0}. Upon completion, the build log is kept in @file{/var} +(or similar) and can always be retrieved using the @option{--log-file} +option. -@end table +@item --file=@var{fichier} +@itemx -f @var{fichier} +Construit le paquet, la dérivation ou l'objet simili-fichier en lequel le +code dans @var{file} s'évalue (@pxref{G-Expressions, file-like objects}). -The @code{github} updater uses the @uref{https://developer.github.com/v3/, -GitHub API} to query for new releases. When used repeatedly e.g.@: when -refreshing all packages, GitHub will eventually refuse to answer any further -API requests. By default 60 API requests per hour are allowed, and a full -refresh on all GitHub packages in Guix requires more than this. -Authentication with GitHub through the use of an API token alleviates these -limits. To use an API token, set the environment variable -@code{GUIX_GITHUB_TOKEN} to a token procured from -@uref{https://github.com/settings/tokens} or otherwise. +Par exemple, @var{file} peut contenir une définition de paquet comme ceci +(@pxref{Définition des paquets}) : +@example +@verbatiminclude package-hello.scm +@end example -@node Invoquer guix lint -@section Invoquer @command{guix lint} +@item --expression=@var{expr} +@itemx -e @var{expr} +Construit le paquet ou la dérivation en lequel @var{expr} s'évalue. -@cindex @command{guix lint} -@cindex paquets, chercher des erreurs -La commande @command{guix lint} est conçue pour aider les développeurs à -éviter des erreurs commune et à utiliser un style cohérent lors de -l'écriture de recettes de paquets. Elle lance des vérifications sur un -ensemble de paquets donnés pour trouver des erreurs communes dans leur -définition. Les @dfn{vérifieurs} disponibles comprennent (voir -@code{--list-checkers} pour une liste complète) : +Par exemple, @var{expr} peut être @code{(@@ (gnu packages guile) +guile-1.8)}, qui désigne sans ambiguïté cette variante spécifique de la +version 1.8 de Guile. -@table @code -@item synopsis -@itemx description -Vérifie certaines règles typographiques et stylistiques dans les -descriptions et les synopsis. +Autrement, @var{exp} peut être une G-expression, auquel cas elle est +utilisée comme un programme de construction passé à @code{gexp->derivation} +(@pxref{G-Expressions}). -@item inputs-should-be-native -Identifie les entrées qui devraient sans doute plutôt être des entrées -natives. +Enfin, @var{expr} peut se référer à une procédure monadique à au moins un +argument (@pxref{La monade du dépôt}). La procédure doit renvoyer une +dérivation comme une valeur monadique, qui est ensuite lancée à travers +@code{run-with-store}. -@item source -@itemx home-page -@itemx mirror-url -@itemx source-file-name -Probe @code{home-page} and @code{source} URLs and report those that are -invalid. Suggest a @code{mirror://} URL when applicable. Check that the -source file name is meaningful, e.g.@: is not just a version number or -``git-checkout'', without a declared @code{file-name} (@pxref{Référence d'origine}). +@item --source +@itemx -S +Construit les dérivation source des paquets, plutôt que des paquets +eux-mêmes. -@item cve -@cindex vulnérabilités -@cindex CVE, Common Vulnerabilities and Exposures -Rapporte les vulnérabilités connues trouvées dans les bases de données CVE -(Common Vulnerabilities and Exposures) de l'année en cours et des années -précédentes @uref{https://nvd.nist.gov/download.cfm#CVE_FEED, publié par le -NIST américain}. +Par exemple, @code{guix build -S gcc} renvoie quelque chose comme +@file{/gnu/store/@dots{}-gcc-4.7.2.tar.bz2}, qui est l'archive des sources +de GCC. -Pour voir les informations sur une vulnérabilité en particulier, visitez les -pages : +L'archive des sources renvoyée est le résultat de l'application des +correctifs et des extraits de code éventuels spécifiés dans le champ +@code{origin} du paquet (@pxref{Définition des paquets}). -@itemize -@item -@indicateurl{https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-ANNÉE-ABCD} -@item -@indicateurl{https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-ANNÉE-ABCD} -@end itemize +@item --sources +Récupère et renvoie la source de @var{package-or-derivation} et toute ses +dépendances, récursivement. C'est pratique pour obtenir une copie locale de +tous les codes sources requis pour construire @var{packages}, ce qui vous +permet de les construire plus tard même sans accès réseau. C'est une +extension de l'option @code{--source} et peut accepter l'un des arguments +facultatifs suivants : -@noindent -où @code{CVE-ANNÉE-ABCD} est l'identifiant CVE — p.@: ex.@: -@code{CVE-2015-7554}. +@table @code +@item package +Cette valeur fait que l'option @code{--sources} se comporte comme l'option +@code{--source}. -Les développeurs de paquets peuvent spécifier dans les recettes des paquets -le nom @uref{https://nvd.nist.gov/cpe.cfm,CPE (Common Platform Enumeration)} -et la version du paquet s'ils diffèrent du nom et de la version que Guix -utilise, comme dans cet exemple : +@item all +Construit les dérivations des sources de tous les paquets, dont les sources +qui pourraient être listées dans @code{inputs}. C'est la valeur par défaut. @example -(package - (name "grub") - ;; @dots{} - ;; CPE calls this package "grub2". - (properties '((cpe-name . "grub2") - (cpe-version . "2.3"))) +$ guix build --sources tzdata +The following derivations will be built: + /gnu/store/@dots{}-tzdata2015b.tar.gz.drv + /gnu/store/@dots{}-tzcode2015b.tar.gz.drv @end example -@c See . -Certaines entrées dans la base de données CVE ne spécifient pas la version -du paquet auquel elles s'appliquent et lui restera donc attachée pour -toujours. Les développeurs qui trouvent des alertes CVE et ont vérifiés -qu'elles peuvent être ignorées peuvent les déclarer comme dans cet exemple : +@item transitive +Build the source derivations of all packages, as well of all transitive +inputs to the packages. This can be used e.g.@: to prefetch package source +for later offline building. @example -(package - (name "t1lib") - ;; @dots{} - ;; Ces CVE ne s'appliquent plus et peuvent être ignorée sans problème. - (properties `((lint-hidden-cve . ("CVE-2011-0433" - "CVE-2011-1553" - "CVE-2011-1554" - "CVE-2011-5244"))))) +$ guix build --sources=transitive tzdata +The following derivations will be built: + /gnu/store/@dots{}-tzcode2015b.tar.gz.drv + /gnu/store/@dots{}-findutils-4.4.2.tar.xz.drv + /gnu/store/@dots{}-grep-2.21.tar.xz.drv + /gnu/store/@dots{}-coreutils-8.23.tar.xz.drv + /gnu/store/@dots{}-make-4.1.tar.xz.drv + /gnu/store/@dots{}-bash-4.3.tar.xz.drv +@dots{} @end example -@item formatting -Avertit le développeurs lorsqu'il y a des problèmes de formatage du code -source évident : des espaces en fin de ligne, des tabulations, etc. @end table -La syntaxe générale est : +@item --system=@var{système} +@itemx -s @var{système} +Tenter de construire pour le @var{système} — p.@: ex.@: @code{i686-linux} — +plutôt que pour le type de système de l'hôte de construction. -@example -guix lint @var{options} @var{package}@dots{} -@end example +@quotation Remarque +Le drapeau @code{--system} est utilisé pour une compilation @emph{native} et +ne doit pas être confondu avec une compilation croisée. Voir +@code{--target} ci-dessous pour des informations sur la compilation croisée. +@end quotation -Si aucun paquet n'est donné par la ligne de commande, tous les paquets -seront vérifiés. Les @var{options} peuvent contenir aucune ou plus des -options suivantes : +Par exemple, passer @code{--system=i686-linux} sur un système +@code{x86_64-linux} ou @code{--system=armhf-linux} sur un système +@code{aarch64-linux} vous permet de construire des paquets dans un +environnement entièrement 32-bits. C'est une exemple d'utilisation de cette +option sur les systèmes Linux, qui peuvent émuler plusieurs personnalités. -@table @code -@item --list-checkers -@itemx -l -Liste et décrit tous les vérificateurs disponibles qui seront lancés sur les -paquets puis quitte. +@quotation Remarque +La possibilité de construire pour un système @code{armhf-linux} est activé +sans condition sur les machines @code{aarch64-linux}, bien que certaines +puces aarch64 n'en soient pas capables, comme les ThunderX. +@end quotation -@item --checkers -@itemx -c -N'active que les vérificateurs spécifiés dans une liste de noms séparés par -des virgules parmi la liste renvoyée par @code{--list-checkers}. +De même, lorsque l'émulation transparente avec QEMU et @code{binfnmt_misc} +est activée (@pxref{Services de virtualisation, +@code{qemu-binfmt-service-type}}), vous pouvez construire pour n'importe +quel système pour lequel un gestionnaire QEMU @code{binfmt_misc} est +installé. -@end table +Les constructions pour un autre système que celui de la machine que vous +utilisez peuvent aussi être déchargées à une machine distante de la bonne +architecture. @xref{Réglages du délestage du démon}, pour plus d'information sur le +déchargement. -@node Invoquer guix size -@section Invoquer @command{guix size} +@item --target=@var{triplet} +@cindex compilation croisée +Effectuer une compilation croisée pour @var{triplet} qui doit être un +triplet GNU valide, comme @code{"mips64el-linux-gnu"} (@pxref{Specifying +target triplets, GNU configuration triplets,, autoconf, Autoconf}). -@cindex taille -@cindex paquet, taille -@cindex closure -@cindex @command{guix size} -La commande @command{guix size} aide les développeurs à dresser un profil de -l'utilisation du disque que font les paquets. C'est facile de négliger -l'impact d'une dépendance supplémentaire ajoutée à un paquet, ou l'impact de -l'utilisation d'une sortie unique pour un paquet qui pourrait être -facilement séparé (@pxref{Des paquets avec plusieurs résultats}). Ce sont les -problèmes que @command{guix size} peut typiquement mettre en valeur. +@anchor{vérification de la construction} +@item --check +@cindex déterminisme, vérification +@cindex reproductibilité, vérification +Reconstruit les @var{package-or-derivation}, qui sont déjà disponibles dans +le dépôt et lève une erreur si les résultats des constructions ne sont pas +identiques bit-à-bit. + +Ce mécanisme vous permet de vérifier si les substituts précédemment +installés sont authentiques (@pxref{Substituts}) ou si le résultat de la +construction d'un paquet est déterministe. @xref{Invoquer guix challenge} +pour plus d'informations et pour les outils. + +Lorsqu'utilisé avec @option{--keep-failed}, la sortie différente est gardée +dans le dépôt sous @file{/gnu/store/@dots{}-check}. Cela rend plus facile +l'étude des différences entre les deux résultats. + +@item --repair +@cindex réparer les éléments du dépôt +@cindex corruption, récupérer de +Essaye de réparer les éléments du dépôt spécifiés, s'ils sont corrompus, en +les téléchargeant ou en les construisant à nouveau. + +Cette opération n'est pas atomique et donc restreinte à l'utilisateur +@code{root} + +@item --derivations +@itemx -d +Renvoie les chemins de dérivation, et non les chemins de sortie, des paquets +donnés. + +@item --root=@var{fichier} +@itemx -r @var{fichier} +@cindex racines du GC, ajout +@cindex ajout de racines au ramasse-miettes +Fait de @var{fichier} un lien symbolique vers le résultat, et l'enregistre +en tant que racine du ramasse-miettes. + +En conséquence, les résultats de cette invocation de @command{guix build} +sont protégés du ramasse-miettes jusqu'à ce que @var{fichier} soit +supprimé. Lorsque cette option est omise, les constructions sont +susceptibles d'être glanées. + +@item --log-file +@cindex journaux de construction, accès +Renvoie les noms des journaux de construction ou les URL des +@var{package-or-derivation} donnés ou lève une erreur si les journaux de +construction sont absents. -On peut passer un ou plusieurs spécifications de paquets à la commande, -comme @code{gcc@@4.8} ou @code{guile:debug}, ou un nom de fichier dans le -dépôt. Regardez cet exemple : +Cela fonctionne indépendamment de la manière dont les paquets ou les +dérivations sont spécifiées. Par exemple, les invocations suivantes sont +équivalentes : @example -$ guix size coreutils -store item total self -/gnu/store/@dots{}-gcc-5.5.0-lib 60.4 30.1 38.1% -/gnu/store/@dots{}-glibc-2.27 30.3 28.8 36.6% -/gnu/store/@dots{}-coreutils-8.28 78.9 15.0 19.0% -/gnu/store/@dots{}-gmp-6.1.2 63.1 2.7 3.4% -/gnu/store/@dots{}-bash-static-4.4.12 1.5 1.5 1.9% -/gnu/store/@dots{}-acl-2.2.52 61.1 0.4 0.5% -/gnu/store/@dots{}-attr-2.4.47 60.6 0.2 0.3% -/gnu/store/@dots{}-libcap-2.25 60.5 0.2 0.2% -total: 78.9 MiB +guix build --log-file `guix build -d guile` +guix build --log-file `guix build guile` +guix build --log-file guile +guix build --log-file -e '(@@ (gnu packages guile) guile-2.0)' @end example -@cindex closure -Les éléments du dépôt listés ici constituent la @dfn{cloture transitive} de -Coreutils — c.-à-d.@: Coreutils et toutes ses dépendances, récursivement — -comme ce qui serait renvoyé par : +Si un journal n'est pas disponible localement, à moins que +@code{--no-substitutes} ne soit passé, la commande cherche un journal +correspondant sur l'un des serveurs de substituts (tels que spécifiés avec +@code{--substitute-urls}.) + +Donc par exemple, imaginons que vous souhaitiez voir le journal de +construction de GDB sur MIPS, mais que vous n'avez qu'une machine +@code{x86_64} : @example -$ guix gc -R /gnu/store/@dots{}-coreutils-8.23 +$ guix build --log-file gdb -s mips64el-linux +https://@value{SUBSTITUTE-SERVER}/log/@dots{}-gdb-7.10 @end example -Ici, la sortie possède trois colonnes à côté de chaque élément du dépôt. La -première colonne, nommée « total », montre la taille en mébioctet (Mio) de -la cloture de l'élément du dépôt — c'est-à-dire sa propre taille plus la -taille de ses dépendances. La colonne suivante, nommée « lui-même », montre -la taille de l'élément lui-même. La dernière colonne montre le ration de la -taille de l'élément lui-même par rapport à celle de tous les éléments -montrés. +Vous pouvez accéder librement à un vaste bibliothèque de journaux de +construction ! +@end table -Dans cet exemple, on voit que la cloture de Coreutils pèse 79@tie{}Mio, dont -la plupart est dû à la libc et aux bibliothèques à l'exécution de GCC (ce -n'est pas un problème en soit que la libc et les bibliothèques de GCC -représentent une grande part de la cloture parce qu'elles sont toujours -disponibles sur le système de toute façon). +@node Débogage des échecs de construction +@subsection Débogage des échecs de construction -Lorsque les paquets passés à @command{guix size} sont disponibles dans le -dépôt@footnote{Plus précisément, @command{guix size} cherche les variantes -@emph{non greffées} des paquets donnés, tels qu'ils sont renvoyés par -@code{guix build @var{paquet} --no-graft}. @xref{Mises à jour de sécurité} pour des -informations sur les greffes}, @command{guix size} demande au démon de -déterminer ses dépendances, et mesure sa taille dans le dépôt, comme avec -@command{du -ms --apparent-size} (@pxref{du invocation,,, coreutils, GNU -Coreutils}). +@cindex échecs de construction, débogage +Lors de la définition d'un nouveau paquet (@pxref{Définition des paquets}), vous +passerez probablement du temps à déboguer et modifier la construction +jusqu'à ce que ça marche. Pour cela, vous devez effectuer les commandes de +construction vous-même dans un environnement le plus proche possible de +celui qu'utilise le démon de construction. -Lorsque les paquets donnés ne sont @emph{pas} dans le dépôt, @command{guix -size} rapporte les informations en se basant sur les substituts disponibles -(@pxref{Substituts}). Cela permet de profiler l'utilisation du disque des -éléments du dépôt même s'ils ne sont pas sur le disque, mais disponibles à -distance. +Pour cela, la première chose à faire est d'utiliser l'option +@option{--keep-failed} ou @option{-K} de @command{guix build}, qui gardera +l'arborescence de construction dans @file{/tmp} ou le répertoire spécifié +par @code{TMPDIR} (@pxref{Invoquer guix build, @code{--keep-failed}}). -Vous pouvez aussi spécifier plusieurs noms de paquets : +À partir de là, vous pouvez vous déplacer dans l'arborescence de +construction et sourcer le fichier @file{environment-variables}, qui +contient toutes les variables d'environnement qui étaient définies lorsque +la construction a échoué. Disons que vous déboguez un échec de construction +dans le paquet @code{foo} ; une session typique ressemblerait à cela : @example -$ guix size coreutils grep sed bash -store item total self -/gnu/store/@dots{}-coreutils-8.24 77.8 13.8 13.4% -/gnu/store/@dots{}-grep-2.22 73.1 0.8 0.8% -/gnu/store/@dots{}-bash-4.3.42 72.3 4.7 4.6% -/gnu/store/@dots{}-readline-6.3 67.6 1.2 1.2% -@dots{} -total: 102.3 MiB +$ guix build foo -K +@dots{} @i{build fails} +$ cd /tmp/guix-build-foo.drv-0 +$ source ./environment-variables +$ cd foo-1.2 @end example -@noindent -Dans cet exemple on voit que la combinaison des quatre paquets prent -102.3@tie{}Mio en tout, ce qui est bien moins que la somme des clotures -puisqu'ils ont beaucoup de dépendances en commun. +Maintenant, vous pouvez invoquer les commandes comme si vous étiez le démon +(presque) et corriger le processus de construction. -Les options disponibles sont : +Parfois il arrive que, par exemple, les tests d'un paquet réussissent +lorsque vous les lancez manuellement mais échouent quand ils sont lancés par +le démon. Cela peut arriver parce que le démon tourne dans un conteneur où, +contrairement à notre environnement au-dessus, l'accès réseau est +indisponible, @file{/bin/sh} n'existe pas, etc (@pxref{Réglages de l'environnement de construction}). -@table @option +Dans ce cas, vous pourriez avoir besoin de lancer le processus de +construction dans un conteneur similaire à celui que le démon crée : -@item --substitute-urls=@var{urls} -Utilise les informations de substituts de @var{urls}. -@xref{client-substitute-urls, the same option for @code{guix build}}. +@example +$ guix build -K foo +@dots{} +$ cd /tmp/guix-build-foo.drv-0 +$ guix environment --no-grafts -C foo --ad-hoc strace gdb +[env]# source ./environment-variables +[env]# cd foo-1.2 +@end example -@item --sort=@var{clef} -Trie les lignes en fonction de la @var{clef}, l'une des optinos suivantes : +Ici, @command{guix environment -C} crée un conteneur et démarre un nouveau +shell dedans (@pxref{Invoquer guix environment}). La partie +@command{--ad-hoc strace gdb} ajoute les commandes @command{strace} et +@command{gdb} dans le conteneur, ce qui pourrait s'avérer utile pour le +débogage. L'option @option{--no-grafts} s'assure qu'on obtient le même +environnement, avec des paquets non greffés (@pxref{Mises à jour de sécurité}, pour +plus d'informations sur les greffes). -@table @code -@item self -la taille de chaque élément (par défaut) ; -@item closure -la taille totale de la cloture de l'élémente. -@end table +Pour obtenir un conteneur plus proche de ce qui serait utilisé par le démon +de construction, on peut enlever @file{/bin/sh} : -@item --map-file=@var{fichier} -Écrit un schéma de l'utilisation du disque au format PNG dans @var{fichier}. +@example +[env]# rm /bin/sh +@end example -Pour l'exemple au-dessus, le schéma ressemble à ceci : +Ne vous inquiétez pas, c'est sans danger : tout cela se passe dans un +conteneur jetable créé par @command{guix environment}. -@image{images/coreutils-size-map,5in,, schéma de l'utilisation du disque de -Coreutils produit par @command{guix size}} +La commande @command{strace} n'est probablement pas dans le chemin de +recherche, mais on peut lancer : -Cette option requiert l'installation de -@uref{http://wingolog.org/software/guile-charting/, Guile-Charting} et qu'il -soit visible dans le chemin de recherche des modules Guile. Lorsque ce -n'est pas le cas, @command{guix size} plante en essayant de le charger. +@example +[env]# $GUIX_ENVIRONMENT/bin/strace -f -o log make check +@end example -@item --system=@var{système} -@itemx -s @var{système} -Considère les paquets pour @var{système} — p.@: ex.@: @code{x86_64-linux}. +De cette manière, non seulement vous aurez reproduit les variables +d'environnement utilisées par le démon, mais vous lancerez aussi le +processus de construction dans un conteneur similaire à celui utilisé par le +démon. -@end table -@node Invoquer guix graph -@section Invoque @command{guix graph} +@node Invoquer guix edit +@section Invoquer @command{guix edit} -@cindex DAG -@cindex @command{guix graph} -@cindex dépendances des paquets -Les paquets et leurs dépendances forment un @dfn{graphe}, plus précisément -un graphe orienté acyclique (DAG). Il peut vite devenir difficile d'avoir -une représentation mentale du DAG d'un paquet, donc la commande -@command{guix graph} fournit une représentation visuelle du DAG. Par -défaut, @command{guix graph} émet un représentation du DAG dans le format -d'entrée de @uref{http://www.graphviz.org/, Graphviz}, pour que sa sortie -puisse être passée directement à la commande @command{dot} de Graphviz. -Elle peut aussi émettre une page HTML avec du code Javascript pour afficher -un « digramme d'accords » dans un navigateur Web, grâce à la bibliothèque -@uref{https://d3js.org/, d3.js}, ou émettre des requêtes Cypher pour -construire un graphe dans une base de donnée de graphes supportant le -langage de requêtes @uref{http://www.opencypher.org/, openCypher}. La -syntaxe générale est : +@cindex @command{guix edit} +@cindex définition de paquets, modification +Tant de paquets, tant de fichiers source ! La commande @command{guix edit} +facilite la vie des utilisateurs et des empaqueteurs en plaçant leur éditeur +sur le fichier source qui contient la définition des paquets spécifiés. Par +exemple : @example -guix graph @var{options} @var{paquet}@dots{} +guix edit gcc@@4.9 vim @end example -Par exemple, la commande suivante génère un fichier PDF représentant le DAG -du paquet pour GNU@tie{}Core Utilities, qui montre ses dépendances à la -compilation : +@noindent +lance le programme spécifié dans la variable d'environnement @code{VISUAL} +ou @code{EDITOR} pour visionner la recette de GCC@tie{}4.9.3 et celle de +Vim. -@example -guix graph coreutils | dot -Tpdf > dag.pdf -@end example +Si vous utilisez une copie du dépôt Git de Guix (@pxref{Construire depuis Git}), +ou que vous avez créé vos propres paquets dans @code{GUIX_PACKAGE_PATH} +(@pxref{Modules de paquets}), vous pourrez modifier les recettes des paquets. +Sinon, vous pourrez examiner les recettes en lecture-seule des paquets +actuellement dans le dépôt. -La sortie ressemble à ceci : -@image{images/coreutils-graph,2in,,Graphe de dépendance de GNU Coreutils} +@node Invoquer guix download +@section Invoquer @command{guix download} -Joli petit graphe, non ? +@cindex @command{guix download} +@cindex télécharger les sources des paquets +En écrivant des définitions de paquets, les développeurs ont généralement +besoin de télécharger une archive des sources, calculer son hash SHA256 et +écrire ce hash dans la définition du paquet (@pxref{Définition des paquets}). +L'outil @command{guix download} aide à cette tâche : il télécharge un +fichier à l'URL donné, l'ajoute au dépôt et affiche à la fois son nom dans +le dépôt et son hash SHA56. -Mais il y a plus qu'un seul graphe ! Celui au-dessus est concis : c'est le -graphe des objets paquets, en omettant les entrées implicites comme GCC, -libc, grep, etc. Il est souvent utile d'avoir ces graphes concis, mais -parfois on veut voir plus de détails. @command{guix graph} supporte -plusieurs types de graphes, qui vous permettent de choisir le niveau de -détails : +Le fait que le fichier téléchargé soit ajouté au dépôt préserve la bande +passante : lorsque les développeurs finissent par construire le paquet +nouvellement défini avec @command{guix build}, l'archive des sources n'aura +pas besoin d'être téléchargée de nouveau puisqu'elle se trouvera déjà dans +le dépôt. C'est aussi une manière pratique de garder des fichiers +temporairement, qui pourront ensuite être supprimés (@pxref{Invoquer guix gc}). + +La commande @command{guix download} supporte les mêmes URI que celles +utilisées dans les définitions de paquets. En particulier, elle supporte +les URI @code {mirror://}. Les URI @code{http} (HTTP sur TLS) sont +supportées @emph{si} les liaisons Guile de GnuTLS sont disponibles dans +l'environnement de l'utilisateur ; si elle ne sont pas disponibles, une +erreur est renvoyée. @xref{Guile Preparations, how to install the GnuTLS +bindings for Guile,, gnutls-guile, GnuTLS-Guile}, pour plus d'informations. + +@command{guix download} vérifie les certificats du serveur HTTPS en +chargeant les autorités de certification X.509 depuis le répertoire vers +lequel pointe la variable d'environnement @code{SSL_CERT_DIR} (@pxref{Certificats X.509}), à moins que @option{--no-check-certificate} ne soit utilisé. + +Les options suivantes sont disponibles : @table @code -@item package -C'est le type par défaut utilisé dans l'exemple plus haut. Il montre le DAG -des objets paquets, sans les dépendances implicites. C'est concis, mais -omet pas mal de détails. +@item --format=@var{fmt} +@itemx -f @var{fmt} +Écrit le hash dans le format spécifié par @var{fmt}. Pour plus +d'informations sur les valeurs valides pour @var{fmt}, @pxref{Invoquer guix hash}. -@item reverse-package -Cela montre le DAG @emph{inversé} des paquets. Par exemple : +@item --no-check-certificate +Ne pas valider les certificats HTTPS des serveurs. -@example -guix graph --type=reverse-package ocaml -@end example +Lorsque vous utilisez cette option, vous n'avez @emph{absolument aucune +garanti} que vous communiquez avec le serveur authentique responsable de +l'URL donnée, ce qui vous rend vulnérable à des attaques de « l'homme du +milieu ». -...@: yields the graph of packages that depend on OCaml. +@item --output=@var{fichier} +@itemx -o @var{fichier} +Enregistre le fichier téléchargé dans @var{fichier} plutôt que de l'ajouter +au dépôt. +@end table -Remarquez que pour les paquets du cœur de la distribution, cela crée des -graphes énormes. Si vous voulez seulement voir le nombre de paquets qui -dépendent d'un paquet donnés, utilisez @command{guix refresh ---list-dependent} (@pxref{Invoquer guix refresh, -@option{--list-dependent}}). +@node Invoquer guix hash +@section Invoquer @command{guix hash} -@item bag-emerged -C'est le DAG du paquet, @emph{avec} les entrées implicites. +@cindex @command{guix hash} +La commande @command{guix hash} calcul le hash SHA256 d'un fichier. C'est +surtout un outil pour simplifier la vie des contributeurs de la distribution +: il calcul le hash cryptographique d'un fichier, qui peut être utilisé dans +la définition d'un paquet (@pxref{Définition des paquets}). -Par exemple, la commande suivante : +La syntaxe générale est : @example -guix graph --type=bag-emerged coreutils | dot -Tpdf > dag.pdf +guix hash @var{option} @var{fichier} @end example -...@: yields this bigger graph: +Lorsque @var{fichier} est @code{-} (un tiret), @command{guix hash} calcul le +hash des données lues depuis l'entrée standard. @command{guix hash} a les +options suivantes : -@image{images/coreutils-bag-graph,,5in,Graphe des dépendances détaillé de -GNU Coreutils} +@table @code -En bas du graphe, on voit toutes les entrées implicites de -@var{gnu-build-system} (@pxref{Systèmes de construction, @code{gnu-build-system}}). +@item --format=@var{fmt} +@itemx -f @var{fmt} +Écrit le hash dans le format spécifié par @var{fmt}. -Maintenant, remarquez que les dépendances de ces entrées implicites — -c'est-à-dire les @dfn{dépendances de bootstrap} (@pxref{Bootstrapping}) — ne -sont pas affichées, pour rester concis. +Les formats supportés sont : @code{nix-base32}, @code{base32}, @code{base16} +(@code{hex} et @code{hexadecimal} peuvent aussi être utilisés). -@item bag -Comme @code{bag-emerged} mais cette fois inclus toutes les dépendances de -bootstrap. +Si l'option @option {--format} n'est pas spécifiée, @command{guix hash} +affichera le hash en @code{nix-base32}. Cette représentation est utilisée +dans les définitions des paquets. -@item bag-with-origins -Comme @code{bag}, mais montre aussi les origines et leurs dépendances. +@item --recursive +@itemx -r +Calcule le hash sur @var{fichier} récursivement. -@item dérivation -C'est la représentation lu plus détaillée : elle montre le DAG des -dérivations (@pxref{Dérivations}) et des éléments du dépôt. Comparé à la -représentation ci-dessus, beaucoup plus de nœuds sont visibles, dont les -scripts de construction, les correctifs, les modules Guile, etc. +@c FIXME: Replace xref above with xref to an ``Archive'' section when +@c it exists. +Dans ce cas, le hash est calculé sur une archive contenant @var{fichier}, +dont ses enfants si c'est un répertoire. Certaines métadonnées de +@var{fichier} fait partie de l'archive ; par exemple lorsque @var{fichier} +est un fichier normal, le hash est différent que le @var{fichier} soit +exécutable ou non. Les métadonnées comme un horodatage n'ont aucun impact +sur le hash (@pxref{Invoquer guix archive}). -Pour ce type de graphe, il est aussi possible de passer un nom de fichier -@file{.drv} à la place d'un nom de paquet, comme dans : +@item --exclude-vcs +@itemx -x +Lorsqu'elle est combinée à @option{--recursive}, exclut les répertoires de +système de contrôle de version (@file{.bzr}, @file{.git}, @file{.hg}, etc). + +@vindex git-fetch +Par exemple, voici comment calculer le hash d'un dépôt Git, ce qui est utile +avec la méthode @code{git-fetch} (@pxref{Référence d'origine}) : @example -guix graph -t derivation `guix system build -d my-config.scm` +$ git clone http://example.org/foo.git +$ cd foo +$ guix hash -rx . @end example +@end table -@item module -C'est le graphe des @dfn{modules de paquets} (@pxref{Modules de paquets}). Par -exemple, la commande suivante montre le graphe des modules de paquets qui -définissent le paquet @code{guile} : +@node Invoquer guix import +@section Invoquer @command{guix import} + +@cindex importer des paquets +@cindex paquets importés +@cindex conversion de paquets +@cindex Invoquer @command{guix import} +La commande @command{guix import} est utile pour les gens qui voudraient +ajouter un paquet à la distribution avec aussi peu de travail que possible — +une demande légitime. La commande connaît quelques dépôts logiciels d'où +elle peut « importer » des métadonnées de paquets. Le résultat est une +définition de paquet, ou un modèle de définition, dans le format reconnu par +Guix (@pxref{Définition des paquets}). + +La syntaxe générale est : @example -guix graph -t module guile | dot -Tpdf > module-graph.pdf +guix import @var{importer} @var{options}@dots{} @end example -@end table -Tous les types ci-dessus correspondent aux @emph{dépendances à la -construction}. Le type de graphe suivant représente les @emph{dépendances à -l'exécution} : +@var{importer} spécifie la source depuis laquelle importer des métadonnées +de paquets, et @var{options} spécifie un identifiant de paquet et d'autres +options spécifiques à @var{importer}. Actuellement les « importateurs » +disponibles sont : @table @code -@item references -C'est le graphe des @dfn{references} d'une sortie d'un paquet, telles que -renvoyées par @command{guix gc --references} (@pxref{Invoquer guix gc}). +@item gnu +Importe des métadonnées d'un paquet GNU donné. Cela fournit un modèle pour +la dernière version de ce paquet GNU, avec le hash de son archive, le +synopsis et la description canonique. -Si la sortie du paquet donnée n'est pas disponible dans le dépôt, -@command{guix graph} essayera d'obtenir les informations sur les dépendances -à travers les substituts. +Les informations supplémentaires comme les dépendances du paquet et sa +licence doivent être renseignées manuellement. -Vous pouvez aussi passer un nom de fichier du dépôt plutôt qu'un nom de -paquet. Par exemple, la commande ci-dessous produit le graphe des -références de votre profile (qui peut être gros !) : +Par exemple, la commande suivante renvoie une définition de paquets pour +GNU@tie{}Hello : @example -guix graph -t references `readlink -f ~/.guix-profile` +guix import gnu hello @end example -@item referrers -C'est le graphe des @dfn{référents} d'un élément du dépôt, tels que renvoyés -par @command{guix gc --referrers} (@pxref{Invoquer guix gc}). - -Cela repose exclusivement sur les informations de votre dépôt. Par exemple, -supposons que Inkscape est actuellement disponible dans 10 profils sur votre -machine ; @command{guix graph -t referrers inkscape} montrera le graphe dont -la racine est Inkscape avec 10 profils qui y sont liés. - -Cela peut aider à déterminer ce qui empêche un élément du dépôt d'être -glané. +Les options spécifiques sont : +@table @code +@item --key-download=@var{politique} +Comme pour @code{guix refresh}, spécifie la politique de gestion des clefs +OpenPGP manquantes lors de la vérification de la signature d'un paquet. +@xref{Invoquer guix refresh, @code{--key-download}}. @end table -Les options disponibles sont les suivante : - -@table @option -@item --type=@var{type} -@itemx -t @var{type} -Produit un graphe en sortie de type @var{type} où @var{type} doit être l'un -des types au-dessus. - -@item --list-types -Liste les types de graphes supportés. +@item pypi +@cindex pypi +Import metadata from the @uref{https://pypi.python.org/, Python Package +Index}. Information is taken from the JSON-formatted description available +at @code{pypi.python.org} and usually includes all the relevant information, +including package dependencies. For maximum efficiency, it is recommended +to install the @command{unzip} utility, so that the importer can unzip +Python wheels and gather data from them. -@item --backend=@var{moteur} -@itemx -b @var{moteur} -Produit un graphe avec le @var{moteur} choisi. +La commande ci-dessous importe les métadonnées du paquet Python +@code{itsdangerous} : -@item --list-backends -Liste les moteurs de graphes supportés. +@example +guix import pypi itsdangerous +@end example -Actuellement les moteurs disponibles sont Graphviz et d3.js. +@table @code +@item --recursive +@itemx -r +Traverse le graphe des dépendances du paquet amont donné et génère les +expressions de paquets de tous ceux qui ne sont pas déjà dans Guix. +@end table -@item --expression=@var{expr} -@itemx -e @var{expr} -Considérer le paquet évalué par @var{expr}. +@item gem +@cindex gem +Import metadata from @uref{https://rubygems.org/, RubyGems}. Information is +taken from the JSON-formatted description available at @code{rubygems.org} +and includes most relevant information, including runtime dependencies. +There are some caveats, however. The metadata doesn't distinguish between +synopses and descriptions, so the same string is used for both fields. +Additionally, the details of non-Ruby dependencies required to build native +extensions is unavailable and left as an exercise to the packager. -C'est utile pour précisément se référer à un paquet, comme dans cet exemple -: +La commande ci-dessous importe les métadonnées pour le paquet Ruby +@code{rails} : @example -guix graph -e '(@@@@ (gnu packages commencement) gnu-make-final)' +guix import gem rails @end example -@item --system=@var{système} -@itemx -s @var{système} -Affiche le graphe pour @var{système} — p.@: ex.@: @code{i686-linux}. - -Le graphe de dépendance des paquets est la plupart du temps indépendant de -l'architecture, mais il y a quelques parties qui dépendent de l'architecture -que cette option vous permet de visualiser. +@table @code +@item --recursive +@itemx -r +Traverse le graphe des dépendances du paquet amont donné et génère les +expressions de paquets de tous ceux qui ne sont pas déjà dans Guix. @end table +@item cpan +@cindex CPAN +Import metadata from @uref{https://www.metacpan.org/, MetaCPAN}. +Information is taken from the JSON-formatted metadata provided through +@uref{https://fastapi.metacpan.org/, MetaCPAN's API} and includes most +relevant information, such as module dependencies. License information +should be checked closely. If Perl is available in the store, then the +@code{corelist} utility will be used to filter core modules out of the list +of dependencies. -@node Invoquer guix environment -@section Invoquer @command{guix environment} - -@cindex environnements de construction reproductibles -@cindex environnement de développement -@cindex @command{guix environment} -@cindex environnement de construction de paquets -Le but de @command{guix environment} est d'assister les hackers dans la -création d'environnements de développement reproductibles sans polluer leur -profil de paquets. L'outil @command{guix environment} prend un ou plusieurs -paquets, construit leurs entrées et crée un environnement shell pour pouvoir -les utiliser. - -La syntaxe générale est : +La commande ci-dessous importe les métadonnées du module Perl +@code{Acme::Boolean} : @example -guix environment @var{options} @var{paquet}@dots{} +guix import cpan Acme::Boolean @end example -L'exemple suivant crée un nouveau shell préparé pour le développement de -GNU@tie{}Guile : +@item cran +@cindex CRAN +@cindex Bioconductor +Importe des métadonnées de @uref{https://cran.r-project.org/, CRAN}, le +dépôt central de @uref{http://r-project.org, l'environnement statistique et +graphique GUN@tie{}R}. + +Les informations sont extraites du fichier @file{DESCRIPTION} du paquet. + +La commande ci-dessous importe les métadonnées du paquet R @code{Cairo} : @example -guix environment guile +guix import cran Cairo @end example -Si les dépendances requises ne sont pas déjà construites, @command{guix -environment} les construit automatiquement. L'environnement du nouveau -shell est une version améliorée de l'environnement dans lequel @command{guix -environment} a été lancé. Il contient les chemins de recherche nécessaires -à la construction du paquet donné en plus des variables d'environnement -existantes. Pour créer un environnement « pur », dans lequel les variables -d'environnement de départ ont été nettoyées, utilisez l'option -@code{--pure}@footnote{Les utilisateurs ajoutent parfois à tord des valeurs -supplémentaires dans les variables comme @code{PATH} dans leur -@file{~/.bashrc}. En conséquence, lorsque @code{guix environment} le lance, -Bash peut lire @file{~/.bashrc}, ce qui produit des « impuretés » dans ces -variables d'environnement. C'est une erreur de définir ces variables -d'environnement dans @file{.bashrc} ; à la place, elles devraient être -définie dans @file{.bash_profile}, qui est sourcé uniquement par les shells -de connexion. @xref{Bash Startup Files,,, bash, The GNU Bash Reference -Manual}, pour des détails sur les fichiers de démarrage de Bash.}. +Lorsque l'option @code{--recursive} est utilisée, l'importateur traversera +le graphe des dépendances du paquet amont récursivement et générera des +expressions de paquets pour tous ceux qui ne sont pas déjà dans Guix. + +Lorsque l'option @code{--archive=bioconductor} est utilisée, les métadonnées +sont importées de @uref{https://www.bioconductor.org/, Bioconductor}, un +répertoire de paquets R pour l'analyse et la compréhension de données +génomiques volumineuses en bioinformatique. + +Les informations sont extraites du fichier @file{DESCRIPTION} d'un paquet +publié sur l'interface web du dépôt SVN de Bioconductor. -@vindex GUIX_ENVIRONMENT -@command{guix environment} définie la variable @code{GUIX_ENVIRONMENT} dans -le shell qu'il crée ; sa valeur est le nom de fichier du profil de cet -environnement. Cela permet aux utilisateur, disons, de définir un prompt -spécifique pour les environnement de développement dans leur @file{.bashrc} -(@pxref{Bash Startup Files,,, bash, The GNU Bash Reference Manual}) : +La commande ci-dessous importe les métadonnées du paquet R +@code{GenomicRanges} : @example -if [ -n "$GUIX_ENVIRONMENT" ] -then - export PS1="\u@@\h \w [dev]\$ " -fi +guix import cran --archive=bioconductor GenomicRanges @end example -@noindent -...@: or to browse the profile: +@item texlive +@cindex TeX Live +@cindex CTAN +Importe les métadonnées de @uref{http://www.ctan.org/, CTAN}, l'archive TeX +réseau complète pour les paquets TeX qui font partie de la +@uref{https://www.tug.org/texlive/, distribution TeX Live}. -@example -$ ls "$GUIX_ENVIRONMENT/bin" -@end example +Les informations sur les paquets sont obtenues à travers l'API XML fournie +par CTAN, tandis que le code source est téléchargé depuis le dépôt SVN du +projet Tex Live. Cette méthode est utilisée parce que CTAN ne garde pas +d'archives versionnées. -En plus, plus d'un paquet peut être spécifié, auquel cas l'union des entrées -des paquets données est utilisée. Par exemple, la commande ci-dessous crée -un shell où toutes les dépendances de Guile et Emacs sont disponibles : +La commande ci-dessous importe les métadonnées du paquet TeX @code{fontspec} +: @example -guix environment guile emacs +guix import texlive fontspec @end example -Parfois, une session shell interactive est inutile. On peut invoquer une -commande arbitraire en plaçant le jeton @code{--} pour séparer la commande -du reste des arguments : +Lorsque l'option @code{--archive=DIRECTORY} est utilisée, le code source +n'est pas téléchargé depuis le sous-répertoire @file{latex} du +l'arborescence @file{texmf-dist/source} dans le dépôt SVN de TeX Live, mais +depuis le répertoire voisin spécifié sous la même racine. + +La commande ci-dessous importe les métadonnées du paquet @code{ifxetex} +depuis CTAN en récupérant les sources depuis le répertoire +@file{texmf/source/generic} : @example -guix environment guile -- make -j4 +guix import texlive --archive=generic ifxetex @end example -Dans d'autres situations, il est plus pratique de spécifier la liste des -paquets requis dans l'environnement. Par exemple, la commande suivante -lance @command{python} dans un environnement contenant Python@tie{}2.7 et -NumPy : +@item json +@cindex JSON, import +Import package metadata from a local JSON file. Consider the following +example package definition in JSON format: @example -guix environment --ad-hoc python2-numpy python-2.7 -- python +@{ + "name": "hello", + "version": "2.10", + "source": "mirror://gnu/hello/hello-2.10.tar.gz", + "build-system": "gnu", + "home-page": "https://www.gnu.org/software/hello/", + "synopsis": "Hello, GNU world: An example GNU package", + "description": "GNU Hello prints a greeting.", + "license": "GPL-3.0+", + "native-inputs": ["gcc@@6"] +@} @end example -En plus, on peut vouloir les dépendance d'un paquet et aussi des paquets -supplémentaires qui ne sont pas des dépendances à l'exécution ou à la -construction, mais qui sont utiles au développement tout de même. À cause -de cela, le drapeau @code{--ad-hoc} est positionnel. Les paquets qui -apparaissent avant @code{--ad-hoc} sont interprétés comme les paquets dont -les dépendances seront ajoutées à l'environnement. Les paquets qui -apparaissent après @code{--ad-hoc} sont interprétés comme les paquets à -ajouter à l'environnement directement. Par exemple, la commande suivante -crée un environnement de développement pour Guix avec les paquets Git et -strace en plus : +Les noms des champs sont les mêmes que pour les enregistrements de +@code{} (@xref{Définition des paquets}). Les référence à d'autres +paquets sont fournies comme des listes JSON de chaînes de spécifications de +paquets comme @code{guile} ou @code{guile@@2.0}. + +L'importateur supporte aussi une définition plus explicite des sources avec +les champs habituels pour les enregistrements @code{} : @example -guix environment guix --ad-hoc git strace +@{ + @dots{} + "source": @{ + "method": "url-fetch", + "uri": "mirror://gnu/hello/hello-2.10.tar.gz", + "sha256": @{ + "base32": "0ssi1wpaf7plaswqqjwigppsg5fyh99vdlb9kzl7c9lng89ndq1i" + @} + @} + @dots{} +@} @end example -Parfois il est souhaitable d'isoler l'environnement le plus possible, pour -une pureté et une reproductibilité maximale. En particulier, lorsque vous -utilisez Guix sur une distribution hôte qui n'est pas GuixSD, il est -souhaitable d'éviter l'accès à @file{/usr/bin} et d'autres ressources du -système depuis les environnements de développement. Par exemple, la -commande suivante crée un REPL Guile dans un « conteneur » où seuls le dépôt -et le répertoire de travail actuel sont montés : +La commande ci-dessous lit les métadonnées du fichier JSON @code{hello.json} +et renvoie une expression de paquet : @example -guix environment --ad-hoc --container guile -- guile +guix import json hello.json @end example -@quotation Remarque -L'option @code{--container} requiert Linux-libre 3.19 ou supérieur. -@end quotation - -Les options disponibles sont résumées ci-dessous. - -@table @code -@item --root=@var{fichier} -@itemx -r @var{fichier} -@cindex environnement persistent -@cindex racine du ramasse-miettes, pour les environnements -Fait de @var{fichier} un lien symbolique vers le profil de cet -environnement, et l'enregistre comme une racine du ramasse-miettes. - -C'est utile si vous souhaitez protéger votre environnement du -ramasse-miettes, pour le rendre « persistent ». - -Lorsque cette option est omise, l'environnement n'est protégé du -ramasse-miettes que le temps de la session @command{guix environment}. Cela -signifie que la prochaine fois que vous créerez le même environnement, vous -pourriez avoir à reconstruire ou télécharger des paquets. @xref{Invoquer guix gc}, pour plus d'informations sur les racines du GC. +@item nix +Importe les métadonnées d'une copie locale des source de +@uref{http://nixos.org/nixpkgs/, la distribution Nixpkgs}@footnote{Cela +repose sur la commande @command{nix-instantiate} de +@uref{http://nixos.org/nix/, Nix}.}. Les définitions de paquets dans +Nixpkgs sont habituellement écrites en un mélange entre le langage Nix et +Bash. Cette commande n'importe que la structure de haut-niveau du paquet +qui est écrite dans le langage Nix. Elle inclut normalement tous les champs +de base de la définition d'un paquet. -@item --expression=@var{expr} -@itemx -e @var{expr} -Crée un environnement pour le paquet ou la liste de paquets en lesquels -s'évalue @var{expr}. +Lorsque vous importez un paquet GNU, le synopsis et la description sont +replacés par la version canonique en amont. -Par exemple, lancer : +Normalement, vous devrez d'abord faire : @example -guix environment -e '(@@ (gnu packages maths) petsc-openmpi)' +export NIX_REMOTE=daemon @end example -démarre un shell avec l'environnement pour cette variante spécifique du -paquet PETSc. +@noindent +pour que @command{nix-instantiate} n'essaye pas d'ouvrir la base de données +de Nix. -Lancer : +Par exemple, la commande ci-dessous importe la définition du paquet de +LibreOffice (plus précisément, elle importe la définition du paquet lié à +l'attribut de plus haut-niveau @code{libreoffice}) : @example -guix environment --ad-hoc -e '(@@ (gnu) %base-packages)' +guix import nix ~/path/to/nixpkgs libreoffice @end example -démarre un shell où tous les paquets de base de GuixSD sont disponibles. +@item hackage +@cindex hackage +Importe les métadonnées de l'archive de paquets centrale de la communauté +Haskell, @uref{https://hackage.haskell.org/, Hackage}. Les informations +sont récupérées depuis les fichiers Cabal et incluent toutes les +informations utiles, dont les dépendances des paquets. -Les commande au-dessus n'utilisent que les sorties par défaut des paquets -donnés. Pour choisir d'autres sorties, on peut spécifier des pairs : +Les options spécifiques sont : + +@table @code +@item --stdin +@itemx -s +Lit un fichier Cabal depuis l'entrée standard. +@item --no-test-dependencies +@itemx -t +N'inclut pas les dépendances requises uniquement par les suites de tests. +@item --cabal-environment=@var{alist} +@itemx -e @var{alist} +@var{alist} est une alist Scheme qui définie l'environnement dans lequel les +conditions de Cabal sont évaluées. Les clefs acceptées sont : @code{os}, +@code{arch}, @code{impl} et une représentation sous forme de chaîne de +caractères du nom d'un drapeau. La valeur associée à un drapeau doit être +le symbole @code{true} ou @code{false}. La valeur associée aux autres clefs +doivent se conformer avec la définition du format de fichiers Cabal. La +valeur par défaut associée avec les clefs @code{os}, @code{arch} et +@code{impl} sont respectivement @samp{linux}, @samp{x86_64} et @samp{ghc}. +@item --recursive +@itemx -r +Traverse le graphe des dépendances du paquet amont donné et génère les +expressions de paquets de tous ceux qui ne sont pas déjà dans Guix. +@end table + +La commande ci-dessous importe les métadonnées de la dernière version du +paquet Haskell @code{HTTP} sans inclure les dépendances des tests et en +spécifiant la valeur du drapeau @samp{network-uri} comme étant @code{false} +: @example -guix environment --ad-hoc -e '(list (@@ (gnu packages bash) bash) "include")' +guix import hackage -t -e "'((\"network-uri\" . false))" HTTP @end example -@item --load=@var{fichier} -@itemx -l @var{fichier} -Crée un environnement pour le paquet ou la liste de paquets en lesquels -@var{fichier} s'évalue. - -Par exemple, @var{fichier} peut contenir une définition comme celle-ci -(@pxref{Définition des paquets}) : +Une version spécifique du paquet peut éventuellement être spécifiée en +faisant suivre le nom du paquet par un arobase et un numéro de version comme +dans l'exemple suivant : @example -@verbatiminclude environment-gdb.scm +guix import hackage mtl@@2.1.3.1 @end example -@item --manifest=@var{fichier} -@itemx -m @var{fichier} -Crée un environnement pour les paquets contenus dans l'objet manifeste -renvoyé par le code Scheme dans @var{fichier}. +@item stackage +@cindex stackage +L'importateur @code{stackage} est une enveloppe autour de l'importateur +@code{hackage}. Il prend un nom de paquet, recherche la version incluse +dans une version au support étendu (LTS) de @uref{https://www.stackage.org, +Stackage} et utilise l'importateur @code{hackage} pour récupérer les +métadonnées. Remarquez que c'est à vous de choisir une version LTS +compatible avec le compilateur GHC utilisé par Guix. -C'est similaire à l'option de même nom de @command{guix package} -(@pxref{profile-manifest, @option{--manifest}}) et utilise les même fichiers -manifestes. +Les options spécifiques sont : -@item --ad-hoc -Inclut tous les paquets spécifiés dans l'environnement qui en résulte, comme -si un paquet @i{ad hoc} était spécifié, avec ces paquets comme entrées. -Cette option est utile pour créer un environnement rapidement sans avoir à -écrire une expression de paquet contenant les entrées désirées. +@table @code +@item --no-test-dependencies +@itemx -t +N'inclut pas les dépendances requises uniquement par les suites de tests. +@item --lts-version=@var{version} +@itemx -l @var{version} +@var{version} est la version LTS désirée. Si elle est omise, la dernière +version est utilisée. +@item --recursive +@itemx -r +Traverse le graphe des dépendances du paquet amont donné et génère les +expressions de paquets de tous ceux qui ne sont pas déjà dans Guix. +@end table -Par exemple la commande : +La commande ci-dessous importe les métadonnées du paquet Haskell @code{HTTP} +inclus dans la version LTS 7.18 de Stackage : @example -guix environment --ad-hoc guile guile-sdl -- guile +guix import stackage --lts-version=7.18 HTTP @end example -lance @command{guile} dans un environnement où Guile et Guile-SDDL sont -disponibles. +@item elpa +@cindex elpa +Importe les métadonnées du dépôt de paquets ELPA (Emacs Lisp Package +Archive) (@pxref{Packages,,, emacs, The GNU Emacs Manual}). + +Les options spécifiques sont : + +@table @code +@item --archive=@var{repo} +@itemx -a @var{repo} +@var{repo} identifie le dépôt d'archive depuis lequel récupérer les +informations. Actuellement les dépôts supportés et leurs identifiants sont +: +@itemize - +@item +@uref{http://elpa.gnu.org/packages, GNU}, qu'on peut choisir avec +l'identifiant @code{gnu}. C'est la valeur par défaut. -Remarquez que cet exemple demande implicitement la sortie par défaut de -@code{guile} et @code{guile-sdl}, mais il est possible de demander une -sortie spécifique — p.@: ex.@: @code{glib:bin} demande la sortie @code{bin} -de @code{glib} (@pxref{Des paquets avec plusieurs résultats}). +Les paquets de @code{elpa.gnu.org} avec l'une des clefs contenues dans le +porte-clef GnuPG @file{share/emacs/25.1/etc/package-keyring.gpg} (ou +similaire) dans le paquet @code{emacs} (@pxref{Package Installation, ELPA +package signatures,, emacs, The GNU Emacs Manual}). -Cette option peut être composée avec le comportement par défaut de -@command{guix environment}. Les paquets qui apparaissent avant -@code{--ad-hoc} sont interprétés comme les paquets dont les dépendances -seront ajoutées à l'environnement, le comportement par défaut. Les paquets -qui apparaissent après @code{--ad-hoc} sont interprétés comme les paquets à -ajouter à l'environnement directement. +@item +@uref{http://stable.melpa.org/packages, MELPA-Stable}, qu'on peut +sélectionner avec l'identifiant @code{melpa-stable}. -@item --pure -Nettoie les variables d'environnement existantes lors de la construction du -nouvel environnement. Cela a pour effet de créer un environnement dans -lequel les chemins de recherche ne contiennent que des entrées de paquets. +@item +@uref{http://melpa.org/packages, MELPA}, qu'on peut sélectionner avec +l'identifiant @code{melpa}. +@end itemize -@item --search-paths -Affiche les définitions des variables d'environnement qui composent -l'environnement. +@item --recursive +@itemx -r +Traverse le graphe des dépendances du paquet amont donné et génère les +expressions de paquets de tous ceux qui ne sont pas déjà dans Guix. +@end table -@item --system=@var{système} -@itemx -s @var{système} -Essaye de construire pour @var{système} — p.@: ex.@: @code{i686-linux}. +@item crate +@cindex crate +Importe les métadonnées du répertoire des paquets Rust +@uref{https://crates.io, crates.io}. -@item --container -@itemx -C -@cindex conteneur -Lance @var{commande} dans un conteneur isolé. Le répertoire de travail -actuel en dehors du conteneur est monté dans le conteneur. En plus, à moins -de le changer avec @code{--user}, un répertoire personnel fictif est créé -pour correspondre à celui de l'utilisateur actuel et @file{/etc/passwod} est -configuré en conséquence. Le processus est lancé en tant que l'utilisateur -actuel en dehors du conteneur, mais a les privilèges root dans le contexte -du conteneur. +@item opam +@cindex OPAM +@cindex OCaml +Importe les métadonnées du répertoire de paquets +@uref{https://opam.ocaml.org/, OPAM} utilisé par la communauté OCaml +@end table -@item --network -@itemx -N -Pour les conteneurs, partage l'espace de nom du réseau avec le système -hôte. Les conteneurs créés sans cette option n'ont accès qu'à l'interface -de boucle locale. +La structure du code de @command{guix import} est modulaire. Il serait +utile d'avoir plus d'importateurs pour d'autres formats de paquets et votre +aide est la bienvenue sur ce sujet (@pxref{Contribuer}). -@item --link-profile -@itemx -P -Pour les conteneurs, lie le profil de l'environnement à -@file{~/.guix-profile} dans le conteneur. C'est équivalent à lance la -commande @command{ln -s $GUIX_ENVIRONMENT ~/.guix-profile} dans le -conteneur. La liaison échouera et annulera l'environnement si le répertoire -existe déjà, ce qui sera sans doute le cas si @command{guix environment} est -invoqué dans le répertoire personnel de l'utilisateur. +@node Invoquer guix refresh +@section Invoquer @command{guix refresh} -Certains paquets sont configurés pour chercher des fichiers de configuration -et des données dans @code{~/.guix-profile}@footnote{Par exemple, le paquet -@code{fontconfig} inspecte @file{~/.guix-profile/share/fonts} pour trouver -des polices supplémentaires.} ; @code{--link-profile} permet à ces -programmes de se comporter comme attendu dans l'environnement. +@cindex @command{guix refresh} +L'audience première de la commande @command{guix refresh} est l'ensemble des +développeurs de la distribution logicielle GNU. Par défaut, elle rapporte +les paquets fournis par la distribution qui sont en retard par rapport aux +dernières versions disponibles en amont, comme ceci : -@item --user=@var{utilisateur} -@itemx -u @var{utilisateur} -Pour les conteneurs, utilise le nom d'utilisateur @var{utilisateur} à la -place de l'utilisateur actuel. L'entrée générée dans @file{/etc/passwod} -dans le conteneur contiendra le nom @var{utilisateur} ; le répertoire -personnel sera @file{/home/UTILISATEUR} ; et aucune donnée GECOS ne sera -copiée. @var{utilisateur} n'a pas besoin d'exister sur le système. +@example +$ guix refresh +gnu/packages/gettext.scm:29:13: gettext serait mis à jour de 0.18.1.1 à 0.18.2.1 +gnu/packages/glib.scm:77:12: glib serait mis à jour de 2.34.3 à 2.37.0 +@end example -En plus, tous les chemins partagés ou exposés (voir @code{--share} et -@code{--expose} respectivement) dont la cible est dans le répertoire -personnel de l'utilisateur seront remontés relativement à -@file{/home/UTILISATEUR} ; cela comprend le montage automatique du -répertoire de travail actuel. +Autrement, on peut spécifier les paquets à considérer, auquel cas un +avertissement est émis pour les paquets qui n'ont pas de gestionnaire de +mise à jour associé : @example -# exposera les chemins comme /home/foo/wd, /home/foo/test et /home/foo/target -cd $HOME/wd -guix environment --container --user=foo \ - --expose=$HOME/test \ - --expose=/tmp/target=$HOME/target +$ guix refresh coreutils guile guile-ssh +gnu/packages/ssh.scm:205:2 : avertissement : aucun gestionnaire de mise à jour pour guile-ssh +gnu/packages/guile.scm:136:12 : guile serait mis à jour de 2.0.12 à 2.0.13 @end example -Bien que cela limite la fuite de l'identité de l'utilisateur à travers le -chemin du répertoire personnel et des champs de l'utilisateur, ce n'est -qu'un composant utile pour une solution d'anonymisation ou de préservation -de la vie privée — pas une solution en elle-même. +@command{guix refresh} navigue le dépôt amont de chaque paquet et détermine +le numéro de version le plus élevé parmi les versions publiées. La commande +sait comment mettre à jour certains types de paquets : les paquets GNU, les +paquets ELPA, etc. — voir la documentation pour @option{--type} ci-dessous. +Il y a beaucoup de paquet cependant pour lesquels il manque une méthode pour +déterminer si une nouvelle version est disponible en amont. Cependant, le +mécanisme est extensible, alors n'hésitez pas à nous contacter pour ajouter +une nouvelle méthode ! -@item --expose=@var{source}[=@var{cible}] -Pour les conteneurs, expose le système de fichiers @var{source} du système -hôte comme un système de fichiers en lecture seule @var{cible} dans le -conteneur. Si @var{cible} n'est pas spécifiée, @var{source} est utilisé -comme point de montage dans le conteneur. +@table @code -L'exemple ci-dessous crée un REPL Guile dans un conteneur dans lequel le -répertoire personnel de l'utilisateur est accessible en lecture-seule via le -répertoire @file{/exchange} : +@item --recursive +Consider the packages specified, and all the packages upon which they +depend. @example -guix environment --container --expose=$HOME=/exchange --ad-hoc guile -- guile +$ guix refresh --recursive coreutils +gnu/packages/acl.scm:35:2: warning: no updater for acl +gnu/packages/m4.scm:30:12: info: 1.4.18 is already the latest version of m4 +gnu/packages/xml.scm:68:2: warning: no updater for expat +gnu/packages/multiprecision.scm:40:12: info: 6.1.2 is already the latest version of gmp +@dots{} @end example -@item --share=@var{source}[=@var{cible}] -Pour les conteneurs, partage le système de fichiers @var{soruce} du système -hôte comme un système de fichiers en lecture-écriture @var{cible} dans le -conteneur. Si @var{cible} n'est pas spécifiée, @var{source} est utilisée -comme point de montage dans le conteneur. +@end table -L'exemple ci-dessous crée un REPL Guile dans un conteneur dans lequel le -répertoire personnel de l'utilisateur est accessible en lecture-écriture via -le répertoire @file{/exchange} : +Parfois les noms en amont diffèrent du nom de paquet utilisé par Guix et +@command{guix refresh} a besoin d'un peu d'aide. La plupart des +gestionnaires de mise à jour honorent la propriété @code{upstream-name} dans +les définitions de paquets, ce qui peut être utilisé à cette fin : @example -guix environment --container --share=$HOME=/exchange --ad-hoc guile -- guile +(define-public network-manager + (package + (name "network-manager") + ;; @dots{} + (properties '((upstream-name . "NetworkManager"))))) @end example -@end table -@command{guix environment} supporte aussi toutes les options de construction -que @command{guix build} supporte (@pxref{Options de construction communes}). +Lorsque l'option @code{--update} est utilisée, elle modifie les fichiers +source de la distribution pour mettre à jour le numéro de version et le hash +de l'archive source de ces recettes de paquets (@pxref{Définition des paquets}). +Cela est effectué en téléchargeant la dernière version de l'archive des +sources de chaque paquet et des signatures associées, en authentifiant +l'archive téléchargée avec sa signature en utilisant @command{gpg} puis en +calculant son hash. Lorsque la clef publique utilisée pour signer l'archive +manque du porte-clefs de l'utilisateur, le gestionnaire tente de la +récupérer automatiquement d'un serveur de clef public ; si cela réussi, la +clef est ajoutée au porte-clefs de l'utilisateur, sinon @command{guix +refresh} rapporte une erreur. +Les options suivantes sont supportées : -@node Invoquer guix publish -@section Invoquer @command{guix publish} +@table @code -@cindex @command{guix publish} -Le but de @command{guix publish} est de vous permettre de partager -facilement votre dépôt avec d'autres personnes qui peuvent ensuite -l'utiliser comme serveur de substituts (@pxref{Substituts}). +@item --expression=@var{expr} +@itemx -e @var{expr} +Considérer le paquet évalué par @var{expr}. -Lorsque @command{guix publish} est lancé, il crée un serveur HTTP qui permet -à n'importe qui avec un accès réseau d'y récupérer des substituts. Cela -signifie que toutes les machines qui font tourner Guix peuvent aussi agir -comme une ferme de construction, puisque l'interface HTTP est compatible -avec Hydra, le logiciel derrière la ferme de construction -@code{hydra.gnu.org}. +C'est utile pour précisément se référer à un paquet, comme dans cet exemple +: -Pour des raisons de sécurité, chaque substitut est signé, ce qui permet aux -destinataires de vérifier leur authenticité et leur intégrité -(@pxref{Substituts}). Comme @command{guix publish} utilise la clef de -signature du système, qui n'est lisible que par l'administrateur système, il -doit être lancé en root ; l'option @code{--user} lui fait baisser ses -privilèges le plus tôt possible. +@example +guix refresh -l -e '(@@@@ (gnu packages commencement) glibc-final)' +@end example -La pair de clefs pour les signatures doit être générée avant de lancer -@command{guix publish}, avec @command{guix archive --generate-key} -(@pxref{Invoquer guix archive}). +Cette commande liste les paquets qui dépendent de la libc « finale » (en +gros tous les paquets). -La syntaxe générale est : +@item --update +@itemx -u +Met à jour les fichiers source de la distribution (les recettes de paquets) +en place. Cette option est généralement utilisée depuis une copie du dépôt +git de Guix (@pxref{Lancer Guix avant qu'il ne soit installé}) : @example -guix publish @var{options}@dots{} +$ ./pre-inst-env guix refresh -s non-core -u @end example -Lancer @command{guix publish} sans arguments supplémentaires lancera un -serveur HTTP sur le port 8080 : +@xref{Définition des paquets}, pour plus d'information sur les définitions des +paquets. -@example -guix publish -@end example +@item --select=[@var{subset}] +@itemx -s @var{subset} +Choisi tous les paquets dans @var{subset}, entre @code{core} et +@code{non-core}. -Une fois qu'un serveur de publication a été autorisé (@pxref{Invoquer guix archive}), le démon peut télécharger des substituts à partir de lui : +Le sous-ensemble @code{core} se réfère à tous les paquets du cœur de la +distribution — c.-à-d.@: les paquets qui sont utilisés pour construire « +tout le reste ». Cela comprend GCC, libc, Binutils, Bash, etc. +Habituellement, changer l'un de ces paquets dans la distribution implique de +reconstruire tous les autres. Ainsi, ces mises à jour sont une nuisance +pour les utilisateurs, en terme de temps de compilation et de bande passante +utilisés pour effectuer la mise à jour. -@example -guix-daemon --substitute-urls=http://example.org:8080 -@end example +Le sous-ensemble @code{non-core} se réfère au reste des paquets. C'est +habituellement utile dans les cas où une mise à jour des paquets du cœur +serait dérangeante. -Par défaut, @command{guix publish} compresse les archives à la volée quand -il les sert. Ce mode « à la volée » est pratique puisqu'il ne demande -aucune configuration et est disponible immédiatement. Cependant, lorsqu'il -s'agit de servir beaucoup de clients, nous recommandons d'utiliser l'option -@option{--cache}, qui active le cache des archives avant de les envoyer aux -clients — voir les détails plus bas. La commande @command{guix weather} -fournit un manière pratique de vérifier ce qu'un serveur fournit -(@pxref{Invoquer guix weather}). +@item --manifest=@var{fichier} +@itemx -m @var{fichier} +Choisi tous les paquets du manifeste dans @var{file}. C'est utile pour +vérifier qu'aucun des paquets du manifeste utilisateur ne peut être mis à +jour. + +@item --type=@var{updater} +@itemx -t @var{updater} +Chois uniquement les paquets pris en charge par @var{updater} +(éventuellement une liste de gestionnaires de mise à jour séparés par des +virgules). Actuellement, @var{updater} peut être l'une des valeurs suivantes +: + +@table @code +@item gnu +le gestionnaire de mise à jour pour les paquets GNU ; +@item gnome +le gestionnaire de mise à jour pour les paquets GNOME ; +@item kde +le gestionnaire de mise à jour pour les paquets KDE ; +@item xorg +le gestionnaire de mise à jour pour les paquets X.org ; +@item kernel.org +le gestionnaire de mise à jour pour les paquets hébergés sur kernel.org ; +@item elpa +le gestionnaire de mise à jour pour les paquets @uref{http://elpa.gnu.org/, +ELPA} ; +@item cran +le gestionnaire de mise à jour pour les paquets +@uref{https://cran.r-project.org/, CRAN} ; +@item bioconductor +le gestionnaire de mise à jour pour les paquets +@uref{https://www.bioconductor.org/, Bioconductor} ; +@item cpan +le gestionnaire de mise à jour pour les paquets @uref{http://www.cpan.org/, +CPAN} ; +@item pypi +le gestionnaire de mise à jour pour les paquets +@uref{https://pypi.python.org, PyPI} ; +@item gem +le gestionnaire de mise à jour pour les paquets @uref{https://rubygems.org, +RubyGems} ; +@item github +le gestionnaire de mise à jour pour les paquets @uref{https://github.com, +GitHub} ; +@item hackage +le gestionnaire de mise à jour pour les paquets +@uref{https://hackage.haskell.org, Hackage} ; +@item stackage +le gestionnaire de mise à jour pour les paquets +@uref{https://www.stackage.org, Stackage} ; +@item crate +le gestionnaire de mise à jour pour les paquets @uref{https://crates.io, +Crates} ; +@end table -En bonus, @command{guix publish} sert aussi un miroir adressé par le contenu -des fichiers source référencées dans les enregistrements @code{origin} -(@pxref{Référence d'origine}). Par exemple, en supposant que @command{guix -publish} tourne sur @code{example.org}, l'URL suivante renverra le fichie -brut @file{hello-2.10.tar.gz} avec le hash SHA256 donné (représenté sous le -format @code{nix-base32}, @pxref{Invoquer guix hash}) : +Par exemple, la commande suivante ne vérifie que les mises à jour des +paquets Emacs hébergés sur @code{elpa.gnu.org} et les paquets CRAN : @example -http://example.org/file/hello-2.10.tar.gz/sha256/0ssi1@dots{}ndq1i +$ guix refresh --type=elpa,cran +gnu/packages/statistics.scm:819:13 : r-testthat serait mis à jour de 0.10.0 à 0.11.0 +gnu/packages/emacs.scm:856:13 : emacs-auctex serait mis à jour de 11.88.6 à 11.88.9 @end example -Évidemment, ces URL ne fonctionnent que pour des fichiers dans le dépôt ; -dans les autres cas, elles renvoie une erreur 404 (« Introuvable »). +@end table -@cindex journaux de construction, publication -Les journaux de construction sont disponibles à partir des URL @code{/log} -comme ceci : +En plus, on peut passer à @command{guix refresh} un ou plusieurs noms de +paquets, comme dans cet exemple : @example -http://example.org/log/gwspk@dots{}-guile-2.2.3 +$ ./pre-inst-env guix refresh -u emacs idutils gcc@@4.8 @end example @noindent -Lorsque @command{guix-daemon} est configuré pour sauvegarder les journaux de -construction compressés, comme c'est le cas par défaut (@pxref{Invoquer guix-daemon}), les URL @code{/log} renvoient le journal compressé tel-quel, -avec un en-tête @code{Content-Type} ou @code{Content-Encoding} approprié. -Nous recommandons de lancer @command{guix-daemon} avec -@code{--log-compression=gzip} pace que les navigateurs web les décompressent -automatiquement, ce qui n'est pas le cas avec la compression bzip2. +La commande au-dessus met à jour spécifiquement les paquets @code{emacs} et +@code{idutils}. L'option @code{--select} n'aurait aucun effet dans ce cas. -Les options suivantes sont disponibles : +Pour déterminer s'il faut mettre à jour un paquet, il est parfois pratique +de savoir quels paquets seraient affectés par la mise à jour pour pouvoir +vérifier la compatibilité. Pour cela l'option suivante peut être utilisée +avec un ou plusieurs noms de paquets passés à @command{guix refresh} : @table @code -@item --port=@var{port} -@itemx -p @var{port} -Écoute les requêtes HTTP sur le @var{port} - -@item --listen=@var{hôte} -Écoute sur l'interface réseau de @var{hôte}. Par défaut, la commande -accepte les connexions de n'importe quelle interface. - -@item --user=@var{utilisateur} -@itemx -u @var{utilisateur} -Charge les privilèges de @var{utilisateur} le plus vite possible — -c.-à-d. une fois que la socket du serveur est ouverte et que la clef de -signature a été lue. - -@item --compression[=@var{niveau}] -@itemx -C [@var{niveau}] -Compresse les données au @var{niveau} donné. Lorsque le @var{niveau} est -zéro, désactive la compression. L'intervalle 1 à 9 correspond aux -différents niveaux de compression gzip : 1 est le plus rapide et 9 est la -meilleure (mais gourmande en CPU). Le niveau par défaut est 3. - -À moins que @option{--cache} ne soit utilisé, la compression se fait à la -volée et les flux compressés ne sont pas cachés. Ainsi, pour réduire la -charge sur la machine qui fait tourner @command{guix publish}, c'est une -bonne idée de choisir un niveau de compression faible, de lancer -@command{guix publish} derrière un serveur de cache ou d'utiliser -@option{--cache}. Utilise @option{--cache} a l'avantage qu'il permet à -@command{guix publish} d'ajouter l'en-tête HTTP @code{Content-Length} à sa -réponse. - -@item --cache=@var{répertoire} -@itemx -c @var{répertoire} -Cache les archives et les métadonnées (les URL @code{.narinfo}) dans -@var{répertoire} et ne sert que les archives dans ce cache. - -Lorsque cette option est omise, les archives et les métadonnées sont crées à -la volée. Cela réduit la bande passante disponible, surtout quand la -compression est activée puisqu'elle pourrait être limitée par le CPU. Un -autre inconvénient au mode par défaut est que la taille des archives n'est -pas connue à l'avance, donc @command{guix publish} n'ajoute pas l'en-tête -@code{Content-Length} à ses résponses, ce qui empêche les clients de savoir -la quantité de données à télécharger. - -À l'inverse, lorsque @option{--cache} est utilisée, la première requête pour -un élément du dépôt (via une URL @code{.narinfo}) renvoie une erreur 404 et -déclenche la création de l'archive — en calculant son @code{.narinfo} et en -compressant l'archive au besoin. Une fois l'archive cachée dans -@var{répertoire}, les requêtes suivantes réussissent et sont servies -directement depuis le cache, ce qui garanti que les clients ont la meilleure -bande passante possible. - -Le processus de création est effectué par des threads de travail. Par -défaut, un thread par cœur du CPU est créé, mais cela peut être -personnalisé. Voir @option{--workers} plus bas. - -Lorsque l'option @option{--ttl} est utilisée, les entrées cachées sont -automatiquement supprimées lorsqu'elles expirent. - -@item --workers=@var{N} -Lorsque @option{--cache} est utilisée, demande l'allocation de @var{N} -thread de travail pour créer les archives. - -@item --ttl=@var{ttl} -Produit des en-têtes HTTP @code{Cache-Control} qui expriment une durée de -vie (TTL) de @var{ttl}. @var{ttl} peut dénoter une durée : @code{5d} -signifie 5 jours, @code{1m} signifie un mois, etc. -Cela permet au Guix de l'utilisateur de garder les informations en cache -pendant @var{ttl}. Cependant, remarquez que @code{guix publish} ne garanti -pas lui-même que les éléments du dépôt qu'il fournit seront toujours -disponible pendant la durée @var{ttl}. - -En plus, lorsque @option{--cache} est utilisée, les entrées cachées qui -n'ont pas été demandé depuis @var{ttl} et n'ont pas d'élément correspondant -dans le dépôt peuvent être supprimées. - -@item --nar-path=@var{chemin} -Utilise @var{chemin} comme préfixe des URL de fichier « nar » -(@pxref{Invoquer guix archive, normalized archives}). +@item --list-updaters +@itemx -L +Liste les gestionnaires de mise à jour et quitte (voir l'option +@option{--type} plus haut). -Par défaut, les nars sont présents à l'URL comme -@code{/nar/gzip/@dots{}-coreutils-8.25}. Cette option vous permet de -changer la partie @code{/nar} en @var{chemin}. +Pour chaque gestionnaire, affiche le pourcentage de paquets qu'il couvre ; à +la fin, affiche le pourcentage de paquets couverts par tous les +gestionnaires. -@item --public-key=@var{fichier} -@itemx --private-key=@var{fichier} -Utilise les @var{fichier}s spécifiques comme pair de clefs utilisées pour -signer les éléments avant de les publier. +@item --list-dependent +@itemx -l +Liste les paquets de plus haut-niveau qui devraient être reconstruits après +la mise à jour d'un ou plusieurs paquets. -Les fichiers doivent correspondre à la même pair de clefs (la clef privée -est utilisée pour signer et la clef publique est seulement ajouté aux -métadonnées de la signature). Ils doivent contenir les clefs dans le format -s-expression canonique produit par @command{guix archive --generate-key} -(@pxref{Invoquer guix archive}). Par défaut, -@file{/etc/guix/signing-key.pub} et @file{/etc/guix/signing-key.sec} sont -utilisés. +@xref{Invoquer guix graph, le type @code{reverse-package} de @command{guix +graph}}, pour des informations sur la manière de visualiser la liste des +paquets dépendant d'un autre. -@item --repl[=@var{port}] -@itemx -r [@var{port}] -Crée un serveur REPL Guile (@pxref{REPL Servers,,, guile, GNU Guile -Reference Manual}) sur @var{pport} (37146 par défaut). C'est surtout utile -pour déboguer un serveur @command{guix publish} qui tourne. @end table -Activer @command{guix publish} sur un système GuixSD est vraiment une seule -ligne : instantiez simplement un service @code{guix-publish-service-type} -dans le champs @code{services} de votre déclaration @code{operating-system} -(@pxref{guix-publish-service-type, @code{guix-publish-service-type}}). - -Si vous avez installé Guix sur une « distro extérieure », suivez ces -instructions : - -@itemize -@item -Si votre distro hôte utilise le système d'init systemd : +Soyez conscients que l'option @code{--list-dependent} ne fait +@emph{qu'approximer} les reconstructions qui seraient requises par une mise +à jour. Plus de reconstructions pourraient être requises dans certaines +circonstances. @example -# ln -s ~root/.guix-profile/lib/systemd/system/guix-publish.service \ - /etc/systemd/system/ -# systemctl start guix-publish && systemctl enable guix-publish +$ guix refresh --list-dependent flex +Building the following 120 packages would ensure 213 dependent packages are rebuilt: +hop@@2.4.0 geiser@@0.4 notmuch@@0.18 mu@@0.9.9.5 cflow@@1.4 idutils@@4.6 @dots{} @end example -@item -Si votre distribution hôte utilise le système d'initialisation Upstart : +La commande ci-dessus liste un ensemble de paquets qui peuvent être +construits pour vérifier la compatibilité d'une mise à jour de @code{flex}. -@example -# ln -s ~root/.guix-profile/lib/upstart/system/guix-publish.conf /etc/init/ -# start guix-publish -@end example +@table @code -@item -Sinon, procédez de manière similaire avec votre système d'init de votre -distro. -@end itemize +@item --list-transitive +List all the packages which one or more packages depend upon. -@node Invoquer guix challenge -@section Invoquer @command{guix challenge} +@example +$ guix refresh --list-transitive flex +flex@@2.6.4 depends on the following 25 packages: perl@@5.28.0 help2man@@1.47.6 +bison@@3.0.5 indent@@2.2.10 tar@@1.30 gzip@@1.9 bzip2@@1.0.6 xz@@5.2.4 file@@5.33 @dots{} +@end example -@cindex constructions reproductibles -@cindex constructions vérifiables -@cindex @command{guix challenge} -@cindex défi -Est-ce que les binaires fournis par ce serveur correspondent réellement au -code source qu'il dit avoir construit ? Est-ce que le processus de -construction d'un paquet est déterministe ? Ce sont les question auxquelles -la commande @command{guix challenge} essaye de répondre. +@end table -La première question est évidemment importante : avant d'utiliser un serveur -de substituts (@pxref{Substituts}), il vaut mieux @emph{vérifier} qu'il -fournit les bons binaires et donc le @emph{défier}. La deuxième est ce qui -permet la première : si les constructions des paquets sont déterministes -alors des constructions indépendantes du paquet devraient donner le même -résultat, bit à bit ; si un serveur fournit un binaire différent de celui -obtenu localement, il peut être soit corrompu, soit malveillant. +The command above lists a set of packages which, when changed, would cause +@code{flex} to be rebuilt. -On sait que le hash qui apparaît dans @file{/gnu/store} est le hash de -toutes les entrées du processus qui construit le fichier ou le répertoire — -les compilateurs, les bibliothèques, les scripts de construction, -etc. (@pxref{Introduction}). En supposant que les processus de construction -sont déterministes, un nom de fichier dans le dépôt devrait correspondre -exactement à une sortie de construction. @command{guix challenge} vérifie -si il y a bien effectivement une seule correspondance en comparant les -sorties de plusieurs constructions indépendantes d'un élément du dépôt -donné. +Les options suivante peuvent être utilisées pour personnaliser les +opérations avec GnuPG : -La sortie de la commande ressemble à : +@table @code -@smallexample -$ guix challenge --substitute-urls="https://hydra.gnu.org https://guix.example.org" -mise à jour de la liste des substituts depuis 'https://hydra.gnu.org'... 100.0% -mise à jour de la liste des substituts depuis 'https://guix.example.org'... 100.0% -le contenu de /gnu/store/@dots{}-openssl-1.0.2d diffère : - empreinte locale : 0725l22r5jnzazaacncwsvp9kgf42266ayyp814v7djxs7nk963q - https://hydra.gnu.org/nar/@dots{}-openssl-1.0.2d : 0725l22r5jnzazaacncwsvp9kgf42266ayyp814v7djxs7nk963q - https://guix.example.org/nar/@dots{}-openssl-1.0.2d : 1zy4fmaaqcnjrzzajkdn3f5gmjk754b43qkq47llbyak9z0qjyim -le contenu de /gnu/store/@dots{}-git-2.5.0 diffère : - empreinte locale : 00p3bmryhjxrhpn2gxs2fy0a15lnip05l97205pgbk5ra395hyha - https://hydra.gnu.org/nar/@dots{}-git-2.5.0 : 069nb85bv4d4a6slrwjdy8v1cn4cwspm3kdbmyb81d6zckj3nq9f - https://guix.example.org/nar/@dots{}-git-2.5.0 : 0mdqa9w1p6cmli6976v4wi0sw9r4p5prkj7lzfd1877wk11c9c73 -le contenu de /gnu/store/@dots{}-pius-2.1.1 diffère : - empreinte locale : 0k4v3m9z1zp8xzzizb7d8kjj72f9172xv078sq4wl73vnq9ig3ax - https://hydra.gnu.org/nar/@dots{}-pius-2.1.1 : 0k4v3m9z1zp8xzzizb7d8kjj72f9172xv078sq4wl73vnq9ig3ax - https://guix.example.org/nar/@dots{}-pius-2.1.1 : 1cy25x1a4fzq5rk0pmvc8xhwyffnqz95h2bpvqsz2mpvlbccy0gs +@item --gpg=@var{commande} +Utilise @var{commande} comme la commande de GnuPG 2.x. @var{commande} est +recherchée dans @code{PATH}. -@dots{} +@item --keyring=@var{fichier} +Utilise @var{fichier} comme porte-clefs pour les clefs amont. @var{fichier} +doit être dans le @dfn{format keybox}. Les fichiers Keybox ont d'habitude +un nom qui fini par @file{.kbx} et GNU@tie{}Privacy Guard (GPG) peut +manipuler ces fichiers (@pxref{kbxutil, @command{kbxutil},, gnupg, Using the +Privacy Guard}, pour plus d'informations sur un outil pour manipuler des +fichiers keybox). -6,406 éléments du dépôt ont été analysés : - - 4,749 (74.1%) étaient identiques - - 525 (8.2%) étaient différents - - 1,132 (17.7%) étaient impossibles à évaluer -@end smallexample +Lorsque cette option est omise, @command{guix refresh} utilise +@file{~/.config/guix/upstream/trustedkeys.kbx} comme porte-clefs pour les +clefs de signature amont. Les signatures OpenPGP sont vérifiées avec ces +clefs ; les clefs manquantes sont aussi téléchargées dans ce porte-clefs +(voir @option{--key-download} plus bas). -@noindent -Dans cet exemple, @command{guix challenge} scanne d'abord le dépôt pour -déterminer l'ensemble des dérivations construites localement — en opposition -aux éléments qui ont été téléchargées depuis un serveur de substituts — puis -demande leur avis à tous les serveurs de substituts. Il rapporte ensuite -les éléments du dépôt pour lesquels les serveurs ont obtenu un résultat -différent de la construction locale. +Vous pouvez exporter les clefs de votre porte-clefs GPG par défaut dans un +fichier keybox avec une commande telle que : -@cindex non-déterminisme, dans les constructions des paquets -Dans l'exemple, @code{guix.example.org} obtient toujours une réponse -différente. Inversement, @code{hydra.gnu.org} est d'accord avec les -constructions locale, sauf dans le cas de Git. Cela peut indiquer que le -processus de construction de Git est non-déterministe, ce qui signifie que -sa sortie diffère en fonction de divers choses que Guix ne contrôle pas -parfaitement, malgré l'isolation des constructions (@pxref{Fonctionnalités}). Les -sources les plus communes de non-déterminisme comprennent l'ajout -d'horodatage dans les résultats des constructions, l'inclusion de nombres -aléatoires et des listes de fichiers ordonnés par numéro d'inœud. Voir -@uref{https://reproducible-builds.org/docs/}, pour plus d'informations. +@example +gpg --export rms@@gnu.org | kbxutil --import-openpgp >> mykeyring.kbx +@end example -Pour trouver ce qui ne va pas avec le binaire de Git, on peut faire quelque -chose comme cela (@pxref{Invoquer guix archive}) : +De même, vous pouvez récupérer des clefs dans un fichier keybox spécifique +comme ceci : @example -$ wget -q -O - https://hydra.gnu.org/nar/@dots{}-git-2.5.0 \ - | guix archive -x /tmp/git -$ diff -ur --no-dereference /gnu/store/@dots{}-git.2.5.0 /tmp/git +gpg --no-default-keyring --keyring mykeyring.kbx \ + --recv-keys @value{OPENPGP-SIGNING-KEY-ID} @end example -Cette commande montre les différences entre les fichiers qui résultent de la -construction locale et des fichiers qui résultent de la construction sur -@code{hydra.gnu.org} (@pxref{Overview, Comparing and Merging Files,, -diffutils, Comparing and Merging Files}). La commande @command{diff} -fonctionne bien avec des fichiers texte. Lorsque des fichiers binaires -diffèrent cependant, @uref{https://diffoscope.org/, Diffoscope} est une -meilleure option. C'est un outil qui aide à visualiser les différences -entre toute sorte de fichiers. +@ref{GPG Configuration Options, @option{--keyring},, gnupg, Using the GNU +Privacy Guard} pour plus d'informations sur l'option @option{--keyring} de +GPG. -Une fois que vous avez fait ce travail, vous pourrez dire si les différences -sont dues au non-déterminisme du processus de construction ou à la -malhonnêteté du serveur. Nous avons fait beaucoup d'effort pour éliminer -les sources de non-déterminisme dans les paquets pour rendre plus facile la -vérification des substituts, mais bien sûr, c'est un processus qui -n'implique pas que Guix, mais une grande partie de la communauté des -logiciels libres. Pendant ce temps, @command{guix challenge} est un outil -pour aider à corriger le problème. +@item --key-download=@var{politique} +Gère les clefs OpenPGP manquantes d'après la @var{politique}, qui peut être +l'une des suivantes : -Si vous écrivez un paquet pour Guix, nous vous encourageons à vérifier si -@code{hydra.gnu.org} et d'autres serveurs de substituts obtiennent le même -résultat que vous avec : +@table @code +@item always +Toujours télécharger les clefs manquantes depuis un serveur de clefs et les +ajouter au porte-clefs de l'utilisateur. -@example -$ guix challenge @var{paquet} -@end example +@item never +Ne jamais essayer de télécharger les clefs OpenPGP manquante. Quitter à la +place. -@noindent -où @var{paquet} est une spécification de paquet comme @code{guile@@2.0} ou -@code{glibc:debug}. +@item interactive +Lorsqu'on rencontre un paquet signé par une clef OpenPGP inconnue, demander +à l'utilisateur s'il souhaite la télécharger ou non. C'est le comportement +par défaut. +@end table -La syntaxe générale est : +@item --key-server=@var{host} +Utiliser @var{host} comme serveur de clefs OpenPGP lors de l'importe d'une +clef publique. -@example -guix challenge @var{options} [@var{paquets}@dots{}] -@end example +@end table -Lorsqu'une différence est trouvée entre l'empreinte d'un élément construit -localement et celle d'un substitut fournit par un serveur, ou parmi les -substituts fournis par différents serveurs, la commande l'affiche comme dans -l'exemple ci-dessus et sa valeur de sortie est 2 (les autres valeurs -différentes de 0 indiquent d'autres sortes d'erreurs). +The @code{github} updater uses the @uref{https://developer.github.com/v3/, +GitHub API} to query for new releases. When used repeatedly e.g.@: when +refreshing all packages, GitHub will eventually refuse to answer any further +API requests. By default 60 API requests per hour are allowed, and a full +refresh on all GitHub packages in Guix requires more than this. +Authentication with GitHub through the use of an API token alleviates these +limits. To use an API token, set the environment variable +@code{GUIX_GITHUB_TOKEN} to a token procured from +@uref{https://github.com/settings/tokens} or otherwise. -L'option qui compte est : + +@node Invoquer guix lint +@section Invoquer @command{guix lint} + +@cindex @command{guix lint} +@cindex paquets, chercher des erreurs +La commande @command{guix lint} est conçue pour aider les développeurs à +éviter des erreurs commune et à utiliser un style cohérent lors de +l'écriture de recettes de paquets. Elle lance des vérifications sur un +ensemble de paquets donnés pour trouver des erreurs communes dans leur +définition. Les @dfn{vérifieurs} disponibles comprennent (voir +@code{--list-checkers} pour une liste complète) : @table @code +@item synopsis +@itemx description +Vérifie certaines règles typographiques et stylistiques dans les +descriptions et les synopsis. -@item --substitute-urls=@var{urls} -Considère @var{urls} comme la liste des URL des sources de substituts -séparés par des espaces avec lesquels comparer les paquets locaux. +@item inputs-should-be-native +Identifie les entrées qui devraient sans doute plutôt être des entrées +natives. -@item --verbose -@itemx -v -Montre des détails sur les correspondances (contenu identique) en plus des -informations sur différences. +@item source +@itemx home-page +@itemx mirror-url +@itemx github-url +@itemx source-file-name +Probe @code{home-page} and @code{source} URLs and report those that are +invalid. Suggest a @code{mirror://} URL when applicable. If the +@code{source} URL redirects to a GitHub URL, recommend usage of the GitHub +URL. Check that the source file name is meaningful, e.g.@: is not just a +version number or ``git-checkout'', without a declared @code{file-name} +(@pxref{Référence d'origine}). -@end table +@item source-unstable-tarball +Parse the @code{source} URL to determine if a tarball from GitHub is +autogenerated or if it is a release tarball. Unfortunately GitHub's +autogenerated tarballs are sometimes regenerated. -@node Invoquer guix copy -@section Invoquer @command{guix copy} +@item cve +@cindex vulnérabilités +@cindex CVE, Common Vulnerabilities and Exposures +Rapporte les vulnérabilités connues trouvées dans les bases de données CVE +(Common Vulnerabilities and Exposures) de l'année en cours et des années +précédentes @uref{https://nvd.nist.gov/download.cfm#CVE_FEED, publié par le +NIST américain}. -@cindex copier des éléments du dépôt par SSH -@cindex SSH, copie d'éléments du dépôt -@cindex partager des éléments du dépôt entre plusieurs machines -@cindex transférer des éléments du dépôt entre plusieurs machines -La commande @command{guix copy} copie des éléments du dépôt d'une machine -vers le dépôt d'une autre machine à travers une connexion SSH@footnote{Cette -commande n'est disponible que si Guile-SSH est trouvé. @xref{Prérequis}, -pour des détails}. Par exemple, la commande suivante copie le paquet -@code{coreutils}, le profil utilisateur et toutes leurs dépendances sur -@var{hôte}, en tant qu'utilisateur @var{utilisateur} : +Pour voir les informations sur une vulnérabilité en particulier, visitez les +pages : -@example -guix copy --to=@var{utilisateur}@@@var{hôte} \ - coreutils `readlink -f ~/.guix-profile` -@end example +@itemize +@item +@indicateurl{https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-ANNÉE-ABCD} +@item +@indicateurl{https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-ANNÉE-ABCD} +@end itemize -Si certains éléments à copier sont déjà présents sur @var{hôte}, ils ne sont -pas envoyés. +@noindent +où @code{CVE-ANNÉE-ABCD} est l'identifiant CVE — p.@: ex.@: +@code{CVE-2015-7554}. -La commande ci-dessous récupère @code{libreoffice} et @code{gimp} depuis -@var{hôte}, en supposant qu'ils y sont présents : +Les développeurs de paquets peuvent spécifier dans les recettes des paquets +le nom @uref{https://nvd.nist.gov/cpe.cfm,CPE (Common Platform Enumeration)} +et la version du paquet s'ils diffèrent du nom et de la version que Guix +utilise, comme dans cet exemple : @example -guix copy --from=@var{hôte} libreoffice gimp +(package + (name "grub") + ;; @dots{} + ;; CPE calls this package "grub2". + (properties '((cpe-name . "grub2") + (cpe-version . "2.3"))) @end example -La connexion SSH est établie avec le client Guile-SSH, qui set compatible -avec OpenSSH : il honore @file{~/.ssh/known_hosts} et @file{~/.ssh/config} -et utilise l'agent SSH pour l'authentification. +@c See . +Certaines entrées dans la base de données CVE ne spécifient pas la version +du paquet auquel elles s'appliquent et lui restera donc attachée pour +toujours. Les développeurs qui trouvent des alertes CVE et ont vérifiés +qu'elles peuvent être ignorées peuvent les déclarer comme dans cet exemple : -La clef utilisée pour signer les éléments qui sont envoyés doit être -acceptée par la machine distante. De même, la clef utilisée pour la machine -distante depuis laquelle vous récupérez des éléments doit être dans -@file{/etc/guix/acl} pour qu'ils soient acceptés par votre propre démon. -@xref{Invoquer guix archive}, pour plus d'informations sur -l'authentification des éléments du dépôt. +@example +(package + (name "t1lib") + ;; @dots{} + ;; Ces CVE ne s'appliquent plus et peuvent être ignorée sans problème. + (properties `((lint-hidden-cve . ("CVE-2011-0433" + "CVE-2011-1553" + "CVE-2011-1554" + "CVE-2011-5244"))))) +@end example + +@item formatting +Avertit le développeurs lorsqu'il y a des problèmes de formatage du code +source évident : des espaces en fin de ligne, des tabulations, etc. +@end table La syntaxe générale est : @example -guix copy [--to=@var{spec}|--from=@var{spec}] @var{items}@dots{} +guix lint @var{options} @var{package}@dots{} @end example -Vous devez toujours spécifier l'une des options suivantes : +Si aucun paquet n'est donné par la ligne de commande, tous les paquets +seront vérifiés. Les @var{options} peuvent contenir aucune ou plus des +options suivantes : @table @code -@item --to=@var{spec} -@itemx --from=@var{spec} -Spécifie l'hôte où envoyer ou d'où recevoir les éléments. @var{spec} doit -être une spécification SSH comme @code{example.org}, -@code{charlie@@example.org} ou @code{charlie@@example.org:2222}. -@end table +@item --list-checkers +@itemx -l +Liste et décrit tous les vérificateurs disponibles qui seront lancés sur les +paquets puis quitte. -L'option @var{items} peut être des noms de paquets, comme @code{gimp} ou des -éléments du dépôt comme @file{/gnu/store/@dots{}-idutils-4.6}. +@item --checkers +@itemx -c +N'active que les vérificateurs spécifiés dans une liste de noms séparés par +des virgules parmi la liste renvoyée par @code{--list-checkers}. -Lorsque vous spécifiez le nom d'un paquet à envoyer, il est d'abord -construit au besoin, sauf si l'option @option{--dry-run} est spécifiée. Les -options de construction communes sont supportées (@pxref{Options de construction communes}). +@end table +@node Invoquer guix size +@section Invoquer @command{guix size} -@node Invoquer guix container -@section Invoquer @command{guix container} -@cindex conteneur -@cindex @command{guix container} -@quotation Remarque -À la version @value{VERSION}, cet outil est toujours expérimental. -L'interface est sujette à changement radicaux dans le futur. -@end quotation +@cindex taille +@cindex paquet, taille +@cindex closure +@cindex @command{guix size} +La commande @command{guix size} aide les développeurs à dresser un profil de +l'utilisation du disque que font les paquets. C'est facile de négliger +l'impact d'une dépendance supplémentaire ajoutée à un paquet, ou l'impact de +l'utilisation d'une sortie unique pour un paquet qui pourrait être +facilement séparé (@pxref{Des paquets avec plusieurs résultats}). Ce sont les +problèmes que @command{guix size} peut typiquement mettre en valeur. -Le but de @command{guix container} est de manipuler des processus qui -tournent dans un environnement séparé, connus sous le nom de « conteneur », -typiquement créés par les commandes @command{guix environment} -(@pxref{Invoquer guix environment}) et @command{guix system container} -(@pxref{Invoquer guix system}). +On peut passer un ou plusieurs spécifications de paquets à la commande, +comme @code{gcc@@4.8} ou @code{guile:debug}, ou un nom de fichier dans le +dépôt. Regardez cet exemple : + +@example +$ guix size coreutils +store item total self +/gnu/store/@dots{}-gcc-5.5.0-lib 60.4 30.1 38.1% +/gnu/store/@dots{}-glibc-2.27 30.3 28.8 36.6% +/gnu/store/@dots{}-coreutils-8.28 78.9 15.0 19.0% +/gnu/store/@dots{}-gmp-6.1.2 63.1 2.7 3.4% +/gnu/store/@dots{}-bash-static-4.4.12 1.5 1.5 1.9% +/gnu/store/@dots{}-acl-2.2.52 61.1 0.4 0.5% +/gnu/store/@dots{}-attr-2.4.47 60.6 0.2 0.3% +/gnu/store/@dots{}-libcap-2.25 60.5 0.2 0.2% +total: 78.9 MiB +@end example -La syntaxe générale est : +@cindex closure +Les éléments du dépôt listés ici constituent la @dfn{clôture transitive} de +Coreutils — c.-à-d.@: Coreutils et toutes ses dépendances, récursivement — +comme ce qui serait renvoyé par : @example -guix container @var{action} @var{options}@dots{} +$ guix gc -R /gnu/store/@dots{}-coreutils-8.23 @end example -@var{action} spécifie les opérations à effectuer avec un conteneur, et -@var{options} spécifie les arguments spécifiques au contexte pour l'action. - -Les actions suivantes sont disponibles : - -@table @code -@item exec -Exécute une commande dans le contexte d'un conteneur lancé. +Ici, la sortie possède trois colonnes à côté de chaque élément du dépôt. La +première colonne, nommée « total », montre la taille en mébioctet (Mio) de +la clôture de l'élément du dépôt — c'est-à-dire sa propre taille plus la +taille de ses dépendances. La colonne suivante, nommée « lui-même », montre +la taille de l'élément lui-même. La dernière colonne montre le ration de la +taille de l'élément lui-même par rapport à celle de tous les éléments +montrés. -La syntaxe est : +Dans cet exemple, on voit que la clôture de Coreutils pèse 79@tie{}Mio, dont +la plupart est dû à la libc et aux bibliothèques à l'exécution de GCC (ce +n'est pas un problème en soit que la libc et les bibliothèques de GCC +représentent une grande part de la clôture parce qu'elles sont toujours +disponibles sur le système de toute façon). -@example -guix container exec @var{pid} @var{programme} @var{arguments}@dots{} -@end example +Lorsque les paquets passés à @command{guix size} sont disponibles dans le +dépôt@footnote{Plus précisément, @command{guix size} cherche les variantes +@emph{non greffées} des paquets donnés, tels qu'ils sont renvoyés par +@code{guix build @var{paquet} --no-graft}. @xref{Mises à jour de sécurité} pour des +informations sur les greffes}, @command{guix size} demande au démon de +déterminer ses dépendances, et mesure sa taille dans le dépôt, comme avec +@command{du -ms --apparent-size} (@pxref{du invocation,,, coreutils, GNU +Coreutils}). -@var{pid} spécifie le PID du conteneur lancé. @var{programme} spécifie le -nom du fichier exécutable dans le système de fichiers racine du conteneur. -@var{arguments} sont les options supplémentairesà passer à @var{programme}. +Lorsque les paquets donnés ne sont @emph{pas} dans le dépôt, @command{guix +size} rapporte les informations en se basant sur les substituts disponibles +(@pxref{Substituts}). Cela permet de profiler l'utilisation du disque des +éléments du dépôt même s'ils ne sont pas sur le disque, mais disponibles à +distance. -La commande suivante lance un shell de connexion interactif dans un -conteneur GuixSD, démarré par @command{guix system container} et dont le PID -est 9001 : +Vous pouvez aussi spécifier plusieurs noms de paquets : @example -guix container exec 9001 /run/current-system/profile/bin/bash --login +$ guix size coreutils grep sed bash +store item total self +/gnu/store/@dots{}-coreutils-8.24 77.8 13.8 13.4% +/gnu/store/@dots{}-grep-2.22 73.1 0.8 0.8% +/gnu/store/@dots{}-bash-4.3.42 72.3 4.7 4.6% +/gnu/store/@dots{}-readline-6.3 67.6 1.2 1.2% +@dots{} +total: 102.3 MiB @end example -Remarquez que @var{pid} ne peut pas être le processus parent d'un -conteneur. Ce doit être le PID 1 du conteneur ou l'un de ses processus -fils. - -@end table +@noindent +Dans cet exemple on voit que la combinaison des quatre paquets prend +102.3@tie{}Mio en tout, ce qui est bien moins que la somme des clôtures +puisqu'ils ont beaucoup de dépendances en commun. -@node Invoquer guix weather -@section Invoquer @command{guix weather} +Les options disponibles sont : -Vous pouvez parfois grogner lorsque les substituts ne sont pas disponibles -et que vous devez construire les paquets vous-même (@pxref{Substituts}). La -commande @command{guix weather} rapporte la disponibilité des substituts sur -les serveurs spécifiés pour que vous sachiez si vous allez raller -aujourd'hui. Cela peut parfois être une information utile pour les -utilisateurs, mais elle est surtout utile pour les personnes qui font -tourner @command{guix publish} (@pxref{Invoquer guix publish}). +@table @option -@cindex statistiques sur les substituts -@cindex disponibilité des substituts -@cindex substuts, disponibilité -@cindex weather, disponibilité des substituts -Voici un exemple : +@item --substitute-urls=@var{urls} +Utilise les informations de substituts de @var{urls}. +@xref{client-substitute-urls, the same option for @code{guix build}}. -@example -$ guix weather --substitute-urls=https://guix.example.org -calcul de 5,872 dérivations de paquets pour x86_64-linux… -recherche de 6,128 éléments du dépôt sur https://guix.example.org… -mise à jour de la liste des substituts depuis 'https://guix.example.org'... 100.0% -https://guix.example.org - 43.4% substituts disponibles (2,658 sur 6,128) - 7,032.5 Mo de fichiers nar (compressés) - 19,824.2 Mo sur le disque (décompressés) - 0.030 secondes par requêtes (182.9 secondes au total) - 33.5 requêtes par seconde +@item --sort=@var{clef} +Trie les lignes en fonction de la @var{clef}, l'une des options suivantes : - 9.8% (342 sur 3,470) des éléments manquants sont dans la queue - 867 constructions dans la queue - x86_64-linux : 518 (59.7%) - i686-linux : 221 (25.5%) - aarch64-linux : 128 (14.8%) - vitesse de construction : 23.41 constructions par heure - x86_64-linux : 11.16 constructions par heure - i686-linux : 6.03 constructions par heure - aarch64-linux : 6.41 constructions par heure -@end example +@table @code +@item self +la taille de chaque élément (par défaut) ; +@item closure +la taille totale de la clôture de l'élément. +@end table -@cindex intégration continue, statistiques -Comme vous pouvez le voir, elle rapporte le pourcentage des paquets pour -lesquels des substituts sont disponibles sur le serveur — indépendamment du -fait que les substituts soient activés, et indépendamment du fait que la -clef de signature du serveur soit autorisée. Elle rapporte aussi la taille -des archives compressées fournies par le serveur, la taille des éléments du -dépôt correspondant dans le dépôt (en supposant que la déduplication soit -désactivée) et la vitesse du serveur. La deuxième partie donne des -statistiques sur l'intégration continue (CI), si le serveur le supporte. +@item --map-file=@var{fichier} +Écrit un schéma de l'utilisation du disque au format PNG dans @var{fichier}. -Pour cela, @command{guix weather} récupère par HTTP(S) les métadonnées -(@dfn{narinfos}@ de tous les éléments du dépôts pertinents. Comme -@command{guix challenge}, il ignore les signatures de ces substituts, ce qui -n'est pas dangereux puisque la commande ne fait que récupérer des -statistiques et n'installe pas ces substituts. +Pour l'exemple au-dessus, le schéma ressemble à ceci : -Entre autres choses, il est possible de demander des types de système -particuliers et des ensembles de paquets particuliers. Les options -disponibles sont listées plus bas. +@image{images/coreutils-size-map,5in,, schéma de l'utilisation du disque de +Coreutils produit par @command{guix size}} -@table @code -@item --substitute-urls=@var{urls} -@var{urls} est la liste des URL des serveurs de substituts séparés par des -espaces. Lorsque cette option n'est pas renseignée, l'ensemble des serveurs -de substituts par défaut est utilisé. +Cette option requiert l'installation de +@uref{http://wingolog.org/software/guile-charting/, Guile-Charting} et qu'il +soit visible dans le chemin de recherche des modules Guile. Lorsque ce +n'est pas le cas, @command{guix size} plante en essayant de le charger. @item --system=@var{système} @itemx -s @var{système} -Effectue des requêtes pour les substituts @var{système} — p.@: ex.@: -@code{aarch64-linux}. Cette option peut être répétée, auquel cas -@command{guix weather} demandera les substituts de plusieurs types de -systèmes. +Considère les paquets pour @var{système} — p.@: ex.@: @code{x86_64-linux}. -@item --manifest=@var{fichier} -Plutôt que de demander des substituts pour tous les paquets, demande -uniquement les paquets spécifiés dans @var{fichier}. @var{fichier} doit -contenir un @dfn{manifeste} comme avec l'option @code{-m} de @command{guix -package} (@pxref{Invoquer guix package}). @end table -@node Invoquer guix processes -@section Invoquer @command{guix processes} +@node Invoquer guix graph +@section Invoque @command{guix graph} -La commande @command{guix processes} peut être utile pour les développeurs -et les administrateurs systèmes, surtout sur des machines multi-utilisateurs -et sur les fermes de construction : elle liste les sessions actuelles (les -connexions au démon), ainsi que des informations sur les processus en -question@footnote{Les sessions distantes, lorsque @command{guix-daemon} est -démarré avec @option{--listen} en spécifiant un point d'entrée TCP, ne sont -@emph{pas} listées.}. Voici un exemple des informations qu'elle renvoie : +@cindex DAG +@cindex @command{guix graph} +@cindex dépendances des paquets +Les paquets et leurs dépendances forment un @dfn{graphe}, plus précisément +un graphe orienté acyclique (DAG). Il peut vite devenir difficile d'avoir +une représentation mentale du DAG d'un paquet, donc la commande +@command{guix graph} fournit une représentation visuelle du DAG. Par +défaut, @command{guix graph} émet un représentation du DAG dans le format +d'entrée de @uref{http://www.graphviz.org/, Graphviz}, pour que sa sortie +puisse être passée directement à la commande @command{dot} de Graphviz. +Elle peut aussi émettre une page HTML avec du code Javascript pour afficher +un « digramme d'accords » dans un navigateur Web, grâce à la bibliothèque +@uref{https://d3js.org/, d3.js}, ou émettre des requêtes Cypher pour +construire un graphe dans une base de donnée de graphes supportant le +langage de requêtes @uref{http://www.opencypher.org/, openCypher}. La +syntaxe générale est : @example -$ sudo guix processes -SessionPID: 19002 -ClientPID: 19090 -ClientCommand: guix environment --ad-hoc python +guix graph @var{options} @var{paquet}@dots{} +@end example -SessionPID: 19402 -ClientPID: 19367 -ClientCommand: guix publish -u guix-publish -p 3000 -C 9 @dots{} +Par exemple, la commande suivante génère un fichier PDF représentant le DAG +du paquet pour GNU@tie{}Core Utilities, qui montre ses dépendances à la +compilation : -SessionPID: 19444 -ClientPID: 19419 -ClientCommand: cuirass --cache-directory /var/cache/cuirass @dots{} -LockHeld: /gnu/store/@dots{}-perl-ipc-cmd-0.96.lock -LockHeld: /gnu/store/@dots{}-python-six-bootstrap-1.11.0.lock -LockHeld: /gnu/store/@dots{}-libjpeg-turbo-2.0.0.lock -ChildProcess: 20495: guix offload x86_64-linux 7200 1 28800 -ChildProcess: 27733: guix offload x86_64-linux 7200 1 28800 -ChildProcess: 27793: guix offload x86_64-linux 7200 1 28800 +@example +guix graph coreutils | dot -Tpdf > dag.pdf @end example -Dans cet exemple, on voit que @command{guix-daemon} a trois clients directs -: @command{guix environment}, @command{guix publish} et l'outil -d'intégration continue Cuirass ; leur identifiant de processus (PID) est -donné par le champ @code{ClientPID}. Le champ @code{SessionPID} fournit le -PID du sous-processus @command{guix-daemon} de cette session particulière. +La sortie ressemble à ceci : -Les champs @code{LockHeld} montrent quels éléments du dépôt sont -actuellement verrouillés par cette session, ce qui correspond aux éléments -du dépôt qui sont en train d'être construits ou d'être substitués (le champ -@code{LockHeld} n'est pas montré si @command{guix processes} n'est pas lancé -en root). Enfin, en regardant le champ @code{ChildProcess}, on comprend que -ces trois constructions sont déchargées (@pxref{Réglages du délestage du démon}). +@image{images/coreutils-graph,2in,,Graphe de dépendance de GNU Coreutils} -La sortie est dans le format Recutils pour qu'on puisse utiliser la commande -@command{recsel} pour sélectionner les sessions qui nous intéressent -(@pxref{Selection Expressions,,, recutils, GNU recutils manual}). Par -exemple, la commande montre la ligne de commande et le PID du client qui -effectue la construction d'un paquet Perl : +Joli petit graphe, non ? + +Mais il y a plus qu'un seul graphe ! Celui au-dessus est concis : c'est le +graphe des objets paquets, en omettant les entrées implicites comme GCC, +libc, grep, etc. Il est souvent utile d'avoir ces graphes concis, mais +parfois on veut voir plus de détails. @command{guix graph} supporte +plusieurs types de graphes, qui vous permettent de choisir le niveau de +détails : + +@table @code +@item package +C'est le type par défaut utilisé dans l'exemple plus haut. Il montre le DAG +des objets paquets, sans les dépendances implicites. C'est concis, mais +omet pas mal de détails. + +@item reverse-package +Cela montre le DAG @emph{inversé} des paquets. Par exemple : @example -$ sudo guix processes | \ - recsel -p ClientPID,ClientCommand -e 'LockHeld ~ "perl"' -ClientPID: 19419 -ClientCommand: cuirass --cache-directory /var/cache/cuirass @dots{} +guix graph --type=reverse-package ocaml @end example -@c ********************************************************************* -@node Distribution GNU -@chapter Distribution GNU - -@cindex Distribution Système Guix -@cindex GuixSD -Guix fournit aussi une distribution du système GNU contenant uniquement des -logiciels libres@footnote{Le terme « libre » se réfère ici bien sûr à -@url{http://www.gnu.org/philosophy/free-sw.fr.html,la liberté offerte à -l'utilisateur de ces logiciels}.}. On peut installer la distribution -elle-même (@pxref{Installation du système}), mais on peut aussi installer Guix -comme gestionnaire de paquets par dessus un système GNU/Linux déjà installé -(@pxref{Installation}). Pour distinguer ces deux cas, on appelle la -distribution autonome « Distribution Système Guix » ou GuixSD. +...@: yields the graph of packages that depend on OCaml. -la distribution fournit les paquets cœur de GNU comme la GNU libc, GCC et -Binutils, ainsi que de nombreuses applications GNU et non-GNU. La liste -complète des paquets disponibles se trouve -@url{http://www.gnu.org/software/guix/packages,en ligne} ou en lançant -@command{guix package} (@pxref{Invoquer guix package}) : +Remarquez que pour les paquets du cœur de la distribution, cela crée des +graphes énormes. Si vous voulez seulement voir le nombre de paquets qui +dépendent d'un paquet donnés, utilisez @command{guix refresh +--list-dependent} (@pxref{Invoquer guix refresh, +@option{--list-dependent}}). + +@item bag-emerged +C'est le DAG du paquet, @emph{avec} les entrées implicites. + +Par exemple, la commande suivante : @example -guix package --list-available +guix graph --type=bag-emerged coreutils | dot -Tpdf > dag.pdf @end example -Notre but est de fournir une distribution logicielle entièrement libre de -GNU/Linux et d'autres variantes de GNU, en se concentrant sur la promotion -et l'intégration étroite des composants GNU en insistant sur les programmes -et les outils qui aident l'utilisateur à exercer ses libertés. +...@: yields this bigger graph: + +@image{images/coreutils-bag-graph,,5in,Graphe des dépendances détaillé de +GNU Coreutils} -Les paquets sont actuellement disponibles pour les plateformes suivantes : +En bas du graphe, on voit toutes les entrées implicites de +@var{gnu-build-system} (@pxref{Systèmes de construction, @code{gnu-build-system}}). -@table @code +Maintenant, remarquez que les dépendances de ces entrées implicites — +c'est-à-dire les @dfn{dépendances de bootstrap} (@pxref{Bootstrapping}) — ne +sont pas affichées, pour rester concis. -@item x86_64-linux -l'architecture Intel et AMD @code{x86_64} avec le noyau Linux-libre ; +@item bag +Comme @code{bag-emerged} mais cette fois inclus toutes les dépendances de +bootstrap. -@item i686-linux -l'architecture Intel 32-bits (IA32) avec le noyau Linux-libre ; +@item bag-with-origins +Comme @code{bag}, mais montre aussi les origines et leurs dépendances. -@item armhf-linux -l'architecture ARMv7-A avec gestion des flottants matérielle, Thumb-2 et -NEON, avec l'interface binaire applicative (ABI) EABI hard-float et le noyau -Linux-libre ; +@item dérivation +C'est la représentation lu plus détaillée : elle montre le DAG des +dérivations (@pxref{Dérivations}) et des éléments du dépôt. Comparé à la +représentation ci-dessus, beaucoup plus de nœuds sont visibles, dont les +scripts de construction, les correctifs, les modules Guile, etc. -@item aarch64-linux -les processeurs ARMv8-A 64-bits en little-endian avec le noyau Linux-libre. -Le support est actuellement expérimental et limité. @xref{Contribuer}, -pour savoir comment aider ! +Pour ce type de graphe, il est aussi possible de passer un nom de fichier +@file{.drv} à la place d'un nom de paquet, comme dans : -@item mips64el-linux -les processeurs MIPS 64-bits little-endian, spécifiquement la série -Loongson, ABI n32, avec le noyau Linux-libre. +@example +guix graph -t derivation `guix system build -d my-config.scm` +@end example + +@item module +C'est le graphe des @dfn{modules de paquets} (@pxref{Modules de paquets}). Par +exemple, la commande suivante montre le graphe des modules de paquets qui +définissent le paquet @code{guile} : +@example +guix graph -t module guile | dot -Tpdf > module-graph.pdf +@end example @end table -GuixSD lui-même est actuellement disponible sur @code{i686} et -@code{x86_64}. +Tous les types ci-dessus correspondent aux @emph{dépendances à la +construction}. Le type de graphe suivant représente les @emph{dépendances à +l'exécution} : -@noindent -Pour des informations sur comment porter vers d'autres architectures et -d'autres noyau, @pxref{Porter}. +@table @code +@item references +C'est le graphe des @dfn{references} d'une sortie d'un paquet, telles que +renvoyées par @command{guix gc --references} (@pxref{Invoquer guix gc}). -@menu -* Installation du système:: Installer le système d'exploitation complet. -* Configuration système:: Configurer le système d'exploitation. -* Documentation:: Visualiser les manuels d'utilisateur des - logiciels. -* Installer les fichiers de débogage:: Nourrir le débogueur. -* Mises à jour de sécurité:: Déployer des correctifs de sécurité - rapidement. -* Modules de paquets:: Les paquets du point de vu du programmeur. -* Consignes d'empaquetage:: Faire grandir la distribution. -* Bootstrapping:: GNU/Linux depuis zéro. -* Porter:: Cibler une autre plateforme ou un autre noyau. -@end menu +Si la sortie du paquet donnée n'est pas disponible dans le dépôt, +@command{guix graph} essayera d'obtenir les informations sur les dépendances +à travers les substituts. -La construction de cette distribution est un effort collaboratif et nous -vous invitons à nous rejoindre ! @xref{Contribuer}, pour des informations -sur la manière de nous aider. +Vous pouvez aussi passer un nom de fichier du dépôt plutôt qu'un nom de +paquet. Par exemple, la commande ci-dessous produit le graphe des +références de votre profile (qui peut être gros !) : -@node Installation du système -@section Installation du système +@example +guix graph -t references `readlink -f ~/.guix-profile` +@end example -@cindex installer GuixSD -@cindex Distribution Système Guix -Cette section explique comment installer la distribution système Guix -(GuixSD) sur votre machine. Le gestionnaire de paquets Guix peut aussi être -installé sur un système GNU/Linux déjà installé, @pxref{Installation}. +@item referrers +C'est le graphe des @dfn{référents} d'un élément du dépôt, tels que renvoyés +par @command{guix gc --referrers} (@pxref{Invoquer guix gc}). -@ifinfo -@quotation Remarque -@c This paragraph is for people reading this from tty2 of the -@c installation image. -Vous lisez cette documentation avec un lecteur Info. Pour des détails sur -son utilisation, appuyez sur la touche @key{ENTRÉE} (« Entrée » ou « à la -ligne ») sur le lien suivant : @pxref{Top, Info reader,, info-stnd, -Stand-alone GNU Info}. Appuyez ensuite sur @kbd{l} pour revenir ici. +Cela repose exclusivement sur les informations de votre dépôt. Par exemple, +supposons que Inkscape est actuellement disponible dans 10 profils sur votre +machine ; @command{guix graph -t referrers inkscape} montrera le graphe dont +la racine est Inkscape avec 10 profils qui y sont liés. -Autrement, lancez @command{info info} dans un autre tty pour garder ce -manuel ouvert. -@end quotation -@end ifinfo +Cela peut aider à déterminer ce qui empêche un élément du dépôt d'être +glané. -@menu -* Limitations:: Ce à quoi vous attendre. -* Considérations matérielles:: Matériel supporté. -* Installation depuis une clef USB ou un DVD:: Préparer le média - d'installation. -* Préparer l'installation:: Réseau, partitionnement, etc. -* Effectuer l'installation:: Pour de vrai. -* Installer GuixSD dans une VM:: Jouer avec GuixSD@. -* Construire l'image d'installation:: D'où vient tout cela. -@end menu +@end table -@node Limitations -@subsection Limitations - -À la version @value{VERSION}, la distribution système Guix (GuixSD) n'est -pas prête pour la production. Elle peut contenir des bogues et ne pas avoir -certaines fonctionnalités importantes. Ainsi, si vous cherche un système de -production stable qui respecte votre liberté en tant qu'utilisateur, une -bonne solution consiste à utiliser -@url{http://www.gnu.org/distros/free-distros.html, une des distributions -GNU/Linux mieux établie}. Nous espérons que vous pourrez bientôt passer à -GuixSD sans peur, bien sûr. Pendant ce temps, vous pouvez aussi utiliser -votre distribution actuelle et essayer le gestionnaire de paquet par dessus -celle-ci (@pxref{Installation}). +Les options disponibles sont les suivante : -Avant de procéder à l'installation, soyez conscient de ces limitations les -plus importantes qui s'appliquent à la version @value{VERSION} : +@table @option +@item --type=@var{type} +@itemx -t @var{type} +Produit un graphe en sortie de type @var{type} où @var{type} doit être l'un +des types au-dessus. -@itemize -@item -Le procédé d'installation n'a pas d'interface utilisateur graphique et -requiert une certaine familiarité avec GNU/Linux (voir les sous-sections -suivantes pour avoir un aperçu de ce que cela signifie). +@item --list-types +Liste les types de graphes supportés. -@item -LVM (gestionnaire de volumes logiques) n'est pas supporté. +@item --backend=@var{moteur} +@itemx -b @var{moteur} +Produit un graphe avec le @var{moteur} choisi. -@item -De plus en plus de services systèmes sont fournis (@pxref{Services}) mais -certains manquent toujours cruellement. +@item --list-backends +Liste les moteurs de graphes supportés. -@item -Plus de 7@tie{}500 paquets sont disponibles, mais vous pourrez parfois -trouver qu'un paquet utile est absent. +Actuellement les moteurs disponibles sont Graphviz et d3.js. -@item -GNOME, Xfce, LXDE et Enlightenment sont disponibles (@pxref{Services de bureaux}), ainsi qu'un certain nombre de gestionnaires de fenêtres X11. -cependant, certaines applications graphiques peuvent manquer, ainsi que KDE. -@end itemize +@item --expression=@var{expr} +@itemx -e @var{expr} +Considérer le paquet évalué par @var{expr}. -Vous êtes avertis ! Mais plus qu'un avertissement, c'est une invitation à -rapporter les problèmes (et vos succès !) et à nous rejoindre pour améliorer -la distribution. @xref{Contribuer}, pour plus d'info. +C'est utile pour précisément se référer à un paquet, comme dans cet exemple +: +@example +guix graph -e '(@@@@ (gnu packages commencement) gnu-make-final)' +@end example -@node Considérations matérielles -@subsection Considérations matérielles - -@cindex support matériel sur GuixSD -GNU@tie{}GuixSD se concentre sur le respect des libertés de ses -utilisateurs. Il est construit autour du noyau Linux-libre, ce qui signifie -que seuls les matériels pour lesquels des pilotes logiciels et des -microgiciels libres sont disponibles sont supportés. De nos jours, une -grande gamme de matériel qu'on peut acheter est supporté par GNU/Linux-libre -— des claviers aux cartes graphiques en passant par les scanners et les -contrôleurs Ethernet. Malheureusement, il reste des produit dont les -fabriquants refusent de laisser le contrôle aux utilisateurs sur leur propre -utilisation de l'ordinateur, et ces matériels ne sont pas supportés par -GuixSD. +@item --system=@var{système} +@itemx -s @var{système} +Affiche le graphe pour @var{système} — p.@: ex.@: @code{i686-linux}. -@cindex WiFi, support matériel -L'un des types de matériels où les pilotes ou les microgiciels sont le moins -disponibles sont les appareils WiFi. Les appareils WiFi connus pour -fonctionner sont ceux qui utilisent des puces Atheros (AR9271 et AR7010) qui -correspondent au pilote @code{ath9k} de Linux-libre, et ceux qui utilisent -des puces Broadcom/AirForce (BCM43xx avec la révision Wireless-Core 5), qui -correspondent au pilote @code{b43-open} de Linux-libre. Des microgiciels -libres existent pour les deux et sont disponibles directement sur GuixSD, -dans @var{%base-firmware} (@pxref{Référence de système d'exploitation, -@code{firmware}}). +Le graphe de dépendance des paquets est la plupart du temps indépendant de +l'architecture, mais il y a quelques parties qui dépendent de l'architecture +que cette option vous permet de visualiser. +@end table -@cindex RYF, Respects Your Freedom -La @uref{https://www.fsf.org/, Free Software Foundation} a un programme de -certification nommé @uref{https://www.fsf.org/ryf, @dfn{Respects Your -Freedom}} (RYF), pour les produits matériels qui respectent votre liberté et -votre vie privée en s'assurant que vous avez le contrôle sur l'appareil. -Nous vous encourageons à vérifier la liste des appareils certifiés par RYF. -Une autre ressource utile est le site web @uref{https://www.h-node.org/, -H-Node}. Il contient un catalogue d'appareils avec des informations sur -leur support dans GNU/Linux. +@node Invoquer guix publish +@section Invoquer @command{guix publish} -@node Installation depuis une clef USB ou un DVD -@subsection Installation depuis une clef USB ou un DVD +@cindex @command{guix publish} +Le but de @command{guix publish} est de vous permettre de partager +facilement votre dépôt avec d'autres personnes qui peuvent ensuite +l'utiliser comme serveur de substituts (@pxref{Substituts}). -Une image d'installation ISO-9660 téléchargeable depuis -@indicateurl{https://alpha.gnu.org/gnu/guix/guixsd-install-@value{VERSION}.@var{système}.iso.xz} -peut être écrite sur une clef USB ou gravée sur un DVD, où @var{système} est -l'une de ces valeurs : +When @command{guix publish} runs, it spawns an HTTP server which allows +anyone with network access to obtain substitutes from it. This means that +any machine running Guix can also act as if it were a build farm, since the +HTTP interface is compatible with Hydra, the software behind the +@code{@value{SUBSTITUTE-SERVER}} build farm. -@table @code -@item x86_64-linux -pour un système GNU/Linux sur un CPU compatible Intel/AMD 64-bits ; +Pour des raisons de sécurité, chaque substitut est signé, ce qui permet aux +destinataires de vérifier leur authenticité et leur intégrité +(@pxref{Substituts}). Comme @command{guix publish} utilise la clef de +signature du système, qui n'est lisible que par l'administrateur système, il +doit être lancé en root ; l'option @code{--user} lui fait baisser ses +privilèges le plus tôt possible. -@item i686-linux -pour un système GNU/Linux sur un CPU compatible Intel 32-bits ; -@end table +La pair de clefs pour les signatures doit être générée avant de lancer +@command{guix publish}, avec @command{guix archive --generate-key} +(@pxref{Invoquer guix archive}). -@c start duplication of authentication part from ``Binary Installation'' -Assurez-vous de télécharger les fichiers @file{.sig} associés et de vérifier -l'authenticité de l'image avec, de cette manière : +La syntaxe générale est : @example -$ wget https://alpha.gnu.org/gnu/guix/guixsd-install-@value{VERSION}.@var{system}.iso.xz.sig -$ gpg --verify guixsd-install-@value{VERSION}.@var{system}.iso.xz.sig +guix publish @var{options}@dots{} @end example -Si cette commande échoue parce que vous n'avez pas la clef publique requise, -lancez cette commande pour l'importer : +Lancer @command{guix publish} sans arguments supplémentaires lancera un +serveur HTTP sur le port 8080 : @example -$ gpg --keyserver @value{KEY-SERVER} \ - --recv-keys @value{OPENPGP-SIGNING-KEY-ID} +guix publish @end example -@noindent -@c end duplication -et relancez la commande @code{gpg --verify}. - -Cette image contient les outils nécessaires à l'installation. Elle est -faite pour être copiée @emph{telle quelle} sur une clef USB assez grosse ou -un DVD. +Une fois qu'un serveur de publication a été autorisé (@pxref{Invoquer guix archive}), le démon peut télécharger des substituts à partir de lui : -@unnumberedsubsubsec Copie sur une clef USB +@example +guix-daemon --substitute-urls=http://example.org:8080 +@end example -Pour copier l'image sur une clef USB, suivez ces étapes : +Par défaut, @command{guix publish} compresse les archives à la volée quand +il les sert. Ce mode « à la volée » est pratique puisqu'il ne demande +aucune configuration et est disponible immédiatement. Cependant, lorsqu'il +s'agit de servir beaucoup de clients, nous recommandons d'utiliser l'option +@option{--cache}, qui active le cache des archives avant de les envoyer aux +clients — voir les détails plus bas. La commande @command{guix weather} +fournit un manière pratique de vérifier ce qu'un serveur fournit +(@pxref{Invoquer guix weather}). -@enumerate -@item -Décompressez l'image avec la commande @command{xz} : +En bonus, @command{guix publish} sert aussi un miroir adressé par le contenu +des fichiers source référencées dans les enregistrements @code{origin} +(@pxref{Référence d'origine}). Par exemple, en supposant que @command{guix +publish} tourne sur @code{example.org}, l'URL suivante renverra le fichier +brut @file{hello-2.10.tar.gz} avec le hash SHA256 donné (représenté sous le +format @code{nix-base32}, @pxref{Invoquer guix hash}) : @example -xz -d guixsd-install-@value{VERSION}.@var{système}.iso.xz +http://example.org/file/hello-2.10.tar.gz/sha256/0ssi1@dots{}ndq1i @end example -@item -Insérez la clef USB de 1@tie{}Gio ou plus dans votre machine et déterminez -son nom d'appareil. En supposant que la clef usb est connue sous le nom de -@file{/dev/sdX}, copiez l'image avec : +Évidemment, ces URL ne fonctionnent que pour des fichiers dans le dépôt ; +dans les autres cas, elles renvoie une erreur 404 (« Introuvable »). + +@cindex journaux de construction, publication +Les journaux de construction sont disponibles à partir des URL @code{/log} +comme ceci : @example -dd if=guixsd-install-@value{VERSION}.x86_64-linux.iso of=/dev/sdX -sync +http://example.org/log/gwspk@dots{}-guile-2.2.3 @end example -Accéder à @file{/dev/sdX} requiert généralement les privilèges -super-utilisateur. -@end enumerate +@noindent +Lorsque @command{guix-daemon} est configuré pour sauvegarder les journaux de +construction compressés, comme c'est le cas par défaut (@pxref{Invoquer guix-daemon}), les URL @code{/log} renvoient le journal compressé tel-quel, +avec un en-tête @code{Content-Type} ou @code{Content-Encoding} approprié. +Nous recommandons de lancer @command{guix-daemon} avec +@code{--log-compression=gzip} parce que les navigateurs web les +décompressent automatiquement, ce qui n'est pas le cas avec la compression +bzip2. -@unnumberedsubsubsec Graver sur un DVD +Les options suivantes sont disponibles : -Pour copier l'image sur un DVD, suivez ces étapes : +@table @code +@item --port=@var{port} +@itemx -p @var{port} +Écoute les requêtes HTTP sur le @var{port} -@enumerate -@item -Décompressez l'image avec la commande @command{xz} : +@item --listen=@var{hôte} +Écoute sur l'interface réseau de @var{hôte}. Par défaut, la commande +accepte les connexions de n'importe quelle interface. -@example -xz -d guixsd-install-@value{VERSION}.@var{système}.iso.xz -@end example +@item --user=@var{utilisateur} +@itemx -u @var{utilisateur} +Charge les privilèges de @var{utilisateur} le plus vite possible — +c.-à-d. une fois que la socket du serveur est ouverte et que la clef de +signature a été lue. -@item -Insérez un DVD vierge dans votre machine et déterminez son nom d'appareil. -En supposant que le DVD soit connu sont le nom de @file{/dev/srX}, copiez -l'image avec : +@item --compression[=@var{niveau}] +@itemx -C [@var{niveau}] +Compresse les données au @var{niveau} donné. Lorsque le @var{niveau} est +zéro, désactive la compression. L'intervalle 1 à 9 correspond aux +différents niveaux de compression gzip : 1 est le plus rapide et 9 est la +meilleure (mais gourmande en CPU). Le niveau par défaut est 3. -@example -growisofs -dvd-compat -Z /dev/srX=guixsd-install-@value{VERSION}.x86_64.iso -@end example +À moins que @option{--cache} ne soit utilisé, la compression se fait à la +volée et les flux compressés ne sont pas cachés. Ainsi, pour réduire la +charge sur la machine qui fait tourner @command{guix publish}, c'est une +bonne idée de choisir un niveau de compression faible, de lancer +@command{guix publish} derrière un serveur de cache ou d'utiliser +@option{--cache}. Utilise @option{--cache} a l'avantage qu'il permet à +@command{guix publish} d'ajouter l'en-tête HTTP @code{Content-Length} à sa +réponse. -Accéder à @file{/dev/srX} requiert généralement les privilèges -super-utilisateur. -@end enumerate +@item --cache=@var{répertoire} +@itemx -c @var{répertoire} +Cache les archives et les métadonnées (les URL @code{.narinfo}) dans +@var{répertoire} et ne sert que les archives dans ce cache. -@unnumberedsubsubsec Démarrage +Lorsque cette option est omise, les archives et les métadonnées sont crées à +la volée. Cela réduit la bande passante disponible, surtout quand la +compression est activée puisqu'elle pourrait être limitée par le CPU. Un +autre inconvénient au mode par défaut est que la taille des archives n'est +pas connue à l'avance, donc @command{guix publish} n'ajoute pas l'en-tête +@code{Content-Length} à ses réponses, ce qui empêche les clients de savoir +la quantité de données à télécharger. -Une fois que c'est fait, vous devriez pouvoir redémarrer le système et -démarrer depuis la clef USB ou le DVD. Pour cela, vous devrez généralement -entrer dans le menu de démarrage BIOS ou UEFI, où vous pourrez choisir de -démarrer sur la clef USB. +À l'inverse, lorsque @option{--cache} est utilisée, la première requête pour +un élément du dépôt (via une URL @code{.narinfo}) renvoie une erreur 404 et +déclenche la création de l'archive — en calculant son @code{.narinfo} et en +compressant l'archive au besoin. Une fois l'archive cachée dans +@var{répertoire}, les requêtes suivantes réussissent et sont servies +directement depuis le cache, ce qui garanti que les clients ont la meilleure +bande passante possible. -@xref{Installer GuixSD dans une VM}, si, à la place, vous souhaitez installer -GuixSD dans une machine virtuelle (VM). +Le processus de création est effectué par des threads de travail. Par +défaut, un thread par cœur du CPU est créé, mais cela peut être +personnalisé. Voir @option{--workers} plus bas. +Lorsque l'option @option{--ttl} est utilisée, les entrées cachées sont +automatiquement supprimées lorsqu'elles expirent. -@node Préparer l'installation -@subsection Préparer l'installation +@item --workers=@var{N} +Lorsque @option{--cache} est utilisée, demande l'allocation de @var{N} +thread de travail pour créer les archives. -Une fois que vous avez démarré votre ordinateur sur le média d'installation, -vous devriez vous retrouver sur un prompt en root. Plusieurs TTY sont -configurées et peuvent être utilisés pour lancer des commandes en root. Le -TTY2 affiche cette documentation, dans la quelle vous pouvez naviguer avec -les commandes du lecteur Info (@pxref{Top,,, info-stnd, Stand-alone GNU -Info}). Le démon de souris GPM tourne sur le système d'installation, ce qui -vous permet de sélectionner du texte avec le bouton gauche de la souris et -de le coller en appuyant sur la molette. +@item --ttl=@var{ttl} +Produit des en-têtes HTTP @code{Cache-Control} qui expriment une durée de +vie (TTL) de @var{ttl}. @var{ttl} peut dénoter une durée : @code{5d} +signifie 5 jours, @code{1m} signifie un mois, etc. -@quotation Remarque -L'installation nécessite un accès au réseau pour que les dépendances -manquantes de votre configuration système puissent être téléchargées. Voyez -la section « réseau » plus bas. -@end quotation +Cela permet au Guix de l'utilisateur de garder les informations en cache +pendant @var{ttl}. Cependant, remarquez que @code{guix publish} ne garanti +pas lui-même que les éléments du dépôt qu'il fournit seront toujours +disponible pendant la durée @var{ttl}. + +En plus, lorsque @option{--cache} est utilisée, les entrées cachées qui +n'ont pas été demandé depuis @var{ttl} et n'ont pas d'élément correspondant +dans le dépôt peuvent être supprimées. -Le système d'installation inclus plusieurs outils usuels pour requis pour -cette tâche. Mais c'est aussi un système GuixSD complet, ce qui signifie -que vous pouvez installer des paquets supplémentaires si vous en avez -besoin, avec @command{guix package} (@pxref{Invoquer guix package}). +@item --nar-path=@var{chemin} +Utilise @var{chemin} comme préfixe des URL de fichier « nar » +(@pxref{Invoquer guix archive, normalized archives}). -@subsubsection Disposition du clavier +Par défaut, les nars sont présents à l'URL comme +@code{/nar/gzip/@dots{}-coreutils-8.25}. Cette option vous permet de +changer la partie @code{/nar} en @var{chemin}. -@cindex disposition du clavier -L'image d'installation utilise la disposition clavier qwerty (US). Si vous -voulez la changer, vous pouvez utiliser la commande @command{loadkeys}. Par -exemple, la commande suivante sélectionne la disposition Dvorak : +@item --public-key=@var{fichier} +@itemx --private-key=@var{fichier} +Utilise les @var{fichier}s spécifiques comme pair de clefs utilisées pour +signer les éléments avant de les publier. -@example -loadkeys dvorak -@end example +Les fichiers doivent correspondre à la même pair de clefs (la clef privée +est utilisée pour signer et la clef publique est seulement ajouté aux +métadonnées de la signature). Ils doivent contenir les clefs dans le format +s-expression canonique produit par @command{guix archive --generate-key} +(@pxref{Invoquer guix archive}). Par défaut, +@file{/etc/guix/signing-key.pub} et @file{/etc/guix/signing-key.sec} sont +utilisés. -Consultez les fichiers dans @file{/run/current-system/profile/share/keymaps} -pour trouver une liste des dispositions disponibles. Lancez @command{man -loadkey} pour plus d'informations. +@item --repl[=@var{port}] +@itemx -r [@var{port}] +Crée un serveur REPL Guile (@pxref{REPL Servers,,, guile, GNU Guile +Reference Manual}) sur @var{pport} (37146 par défaut). C'est surtout utile +pour déboguer un serveur @command{guix publish} qui tourne. +@end table -@subsubsection Réseau +Enabling @command{guix publish} on Guix System is a one-liner: just +instantiate a @code{guix-publish-service-type} service in the +@code{services} field of the @code{operating-system} declaration +(@pxref{guix-publish-service-type, @code{guix-publish-service-type}}). -Lancez la commande suivante pour voir comment vos interfaces réseau sont -appelées : +Si vous avez installé Guix sur une « distro extérieure », suivez ces +instructions : + +@itemize +@item +Si votre distro hôte utilise le système d'init systemd : @example -ifconfig -a +# ln -s ~root/.guix-profile/lib/systemd/system/guix-publish.service \ + /etc/systemd/system/ +# systemctl start guix-publish && systemctl enable guix-publish @end example -@noindent -@dots{} ou, avec la commande spécifique à GNU/Linux @command{ip} : +@item +Si votre distribution hôte utilise le système d'initialisation Upstart : @example -ip a +# ln -s ~root/.guix-profile/lib/upstart/system/guix-publish.conf /etc/init/ +# start guix-publish @end example -@c http://cgit.freedesktop.org/systemd/systemd/tree/src/udev/udev-builtin-net_id.c#n20 -Les interfaces filaires ont un nom qui commence par @samp{e} ; par exemple, -l'interface qui correspond au premier contrôleur Ethernet sur la carte mère -est appelé @samp{eno1}. Les interfaces sans-fil ont un nom qui commence par -@samp{w}, comme @samp{w1p2s0}. +@item +Sinon, procédez de manière similaire avec votre système d'init de votre +distro. +@end itemize -@table @asis -@item Connexion filaire -Pour configure une connexion filaire, lancez la commande suivante, en -remplaçant @var{interface} par le nom de l'interface filaire que vous voulez -utiliser. +@node Invoquer guix challenge +@section Invoquer @command{guix challenge} -@example -ifconfig @var{interface} up -@end example +@cindex constructions reproductibles +@cindex constructions vérifiables +@cindex @command{guix challenge} +@cindex défi +Est-ce que les binaires fournis par ce serveur correspondent réellement au +code source qu'il dit avoir construit ? Est-ce que le processus de +construction d'un paquet est déterministe ? Ce sont les question auxquelles +la commande @command{guix challenge} essaye de répondre. -@item Connexion sans-fil -@cindex sans-fil -@cindex WiFi -Pour configurer le réseau sans-fil, vous pouvez créer un fichier de -configuration pour l'outil de configuration @command{wpa_supplicant} (son -emplacement importe peu) avec l'un des éditeurs de texte disponibles comme -@command{nano} : +La première question est évidemment importante : avant d'utiliser un serveur +de substituts (@pxref{Substituts}), il vaut mieux @emph{vérifier} qu'il +fournit les bons binaires et donc le @emph{défier}. La deuxième est ce qui +permet la première : si les constructions des paquets sont déterministes +alors des constructions indépendantes du paquet devraient donner le même +résultat, bit à bit ; si un serveur fournit un binaire différent de celui +obtenu localement, il peut être soit corrompu, soit malveillant. -@example -nano wpa_supplicant.conf -@end example +On sait que le hash qui apparaît dans @file{/gnu/store} est le hash de +toutes les entrées du processus qui construit le fichier ou le répertoire — +les compilateurs, les bibliothèques, les scripts de construction, +etc. (@pxref{Introduction}). En supposant que les processus de construction +sont déterministes, un nom de fichier dans le dépôt devrait correspondre +exactement à une sortie de construction. @command{guix challenge} vérifie +si il y a bien effectivement une seule correspondance en comparant les +sorties de plusieurs constructions indépendantes d'un élément du dépôt +donné. -Par exemple, la déclaration qui suit peut aller dans ce fichier et -fonctionnera pour plusieurs réseaux sans-fil, si vous donnez le vrai SSID et -la phrase de passe pour le réseau auquel vous vous connectez : +La sortie de la commande ressemble à : -@example -network=@{ - ssid="@var{mon-ssid}" - key_mgmt=WPA-PSK - psk="la phrase de passe secrète du réseau" -@} -@end example +@smallexample +$ guix challenge --substitute-urls="https://@value{SUBSTITUTE-SERVER} https://guix.example.org" +updating list of substitutes from 'https://@value{SUBSTITUTE-SERVER}'... 100.0% +updating list of substitutes from 'https://guix.example.org'... 100.0% +/gnu/store/@dots{}-openssl-1.0.2d contents differ: + local hash: 0725l22r5jnzazaacncwsvp9kgf42266ayyp814v7djxs7nk963q + https://@value{SUBSTITUTE-SERVER}/nar/@dots{}-openssl-1.0.2d: 0725l22r5jnzazaacncwsvp9kgf42266ayyp814v7djxs7nk963q + https://guix.example.org/nar/@dots{}-openssl-1.0.2d: 1zy4fmaaqcnjrzzajkdn3f5gmjk754b43qkq47llbyak9z0qjyim +/gnu/store/@dots{}-git-2.5.0 contents differ: + local hash: 00p3bmryhjxrhpn2gxs2fy0a15lnip05l97205pgbk5ra395hyha + https://@value{SUBSTITUTE-SERVER}/nar/@dots{}-git-2.5.0: 069nb85bv4d4a6slrwjdy8v1cn4cwspm3kdbmyb81d6zckj3nq9f + https://guix.example.org/nar/@dots{}-git-2.5.0: 0mdqa9w1p6cmli6976v4wi0sw9r4p5prkj7lzfd1877wk11c9c73 +/gnu/store/@dots{}-pius-2.1.1 contents differ: + local hash: 0k4v3m9z1zp8xzzizb7d8kjj72f9172xv078sq4wl73vnq9ig3ax + https://@value{SUBSTITUTE-SERVER}/nar/@dots{}-pius-2.1.1: 0k4v3m9z1zp8xzzizb7d8kjj72f9172xv078sq4wl73vnq9ig3ax + https://guix.example.org/nar/@dots{}-pius-2.1.1: 1cy25x1a4fzq5rk0pmvc8xhwyffnqz95h2bpvqsz2mpvlbccy0gs -Démarrez le service sans-file et lancez-le en tache de fond avec la commande -suivante (en remplaçant @var{interface} par le nom de l'interface réseau que -vous voulez utiliser) : +@dots{} -@example -wpa_supplicant -c wpa_supplicant.conf -i @var{interface} -B -@end example +6,406 éléments du dépôt ont été analysés : + - 4,749 (74.1%) étaient identiques + - 525 (8.2%) étaient différents + - 1,132 (17.7%) étaient impossibles à évaluer +@end smallexample -Lancez @command{man wpa_supplicant} pour plus d'informations. -@end table +@noindent +Dans cet exemple, @command{guix challenge} scanne d'abord le dépôt pour +déterminer l'ensemble des dérivations construites localement — en opposition +aux éléments qui ont été téléchargées depuis un serveur de substituts — puis +demande leur avis à tous les serveurs de substituts. Il rapporte ensuite +les éléments du dépôt pour lesquels les serveurs ont obtenu un résultat +différent de la construction locale. -@cindex DHCP -À partir de ce moment, vous avez besoin d'une adresse IP. Sur les réseaux -où les IP sont automatiquement attribuée par DHCP, vous pouvez lancer : +@cindex non-déterminisme, dans les constructions des paquets +As an example, @code{guix.example.org} always gets a different answer. +Conversely, @code{@value{SUBSTITUTE-SERVER}} agrees with local builds, +except in the case of Git. This might indicate that the build process of +Git is non-deterministic, meaning that its output varies as a function of +various things that Guix does not fully control, in spite of building +packages in isolated environments (@pxref{Fonctionnalités}). Most common sources +of non-determinism include the addition of timestamps in build results, the +inclusion of random numbers, and directory listings sorted by inode number. +See @uref{https://reproducible-builds.org/docs/}, for more information. + +Pour trouver ce qui ne va pas avec le binaire de Git, on peut faire quelque +chose comme cela (@pxref{Invoquer guix archive}) : @example -dhclient -v @var{interface} +$ wget -q -O - https://@value{SUBSTITUTE-SERVER}/nar/@dots{}-git-2.5.0 \ + | guix archive -x /tmp/git +$ diff -ur --no-dereference /gnu/store/@dots{}-git.2.5.0 /tmp/git @end example -Essayez de pinger un serveur pour voir si le réseau fonctionne : +This command shows the difference between the files resulting from the local +build, and the files resulting from the build on +@code{@value{SUBSTITUTE-SERVER}} (@pxref{Overview, Comparing and Merging +Files,, diffutils, Comparing and Merging Files}). The @command{diff} +command works great for text files. When binary files differ, a better +option is @uref{https://diffoscope.org/, Diffoscope}, a tool that helps +visualize differences for all kinds of files. + +Une fois que vous avez fait ce travail, vous pourrez dire si les différences +sont dues au non-déterminisme du processus de construction ou à la +malhonnêteté du serveur. Nous avons fait beaucoup d'effort pour éliminer +les sources de non-déterminisme dans les paquets pour rendre plus facile la +vérification des substituts, mais bien sûr, c'est un processus qui +n'implique pas que Guix, mais une grande partie de la communauté des +logiciels libres. Pendant ce temps, @command{guix challenge} est un outil +pour aider à corriger le problème. + +If you are writing packages for Guix, you are encouraged to check whether +@code{@value{SUBSTITUTE-SERVER}} and other substitute servers obtain the +same build result as you did with: @example -ping -c 3 gnu.org +$ guix challenge @var{paquet} @end example -Mettre en place un accès réseau est presque toujours une nécessité parce que -l'image ne contient pas tous les logiciels et les outils dont vous pourriez -avoir besoin. +@noindent +où @var{paquet} est une spécification de paquet comme @code{guile@@2.0} ou +@code{glibc:debug}. -@cindex installer par SSH -Si vous le souhaitez, vous pouvez continuer l'installation à distance en -démarrant un serveur SSH : +La syntaxe générale est : @example -herd start ssh-daemon +guix challenge @var{options} [@var{paquets}@dots{}] @end example -Assurez-vous soit de définir un mot de passe avec @command{passwd}, soit de -configurer l'authentification par clef OpenSSH avant de vous connecter. - -@subsubsection Partitionnement - -À moins que vous ne l'ayez déjà fait, l'étape suivante consiste à -partitionner le disque puis à formater les partitions cibles. +Lorsqu'une différence est trouvée entre l'empreinte d'un élément construit +localement et celle d'un substitut fournit par un serveur, ou parmi les +substituts fournis par différents serveurs, la commande l'affiche comme dans +l'exemple ci-dessus et sa valeur de sortie est 2 (les autres valeurs +différentes de 0 indiquent d'autres sortes d'erreurs). -L'image d'installation inclus plusieurs outils de partitionnement, dont -Parted (@pxref{Overview,,, parted, GNU Parted User Manual}), -@command{fdisk}, et @command{cfdisk}. Lancez-en un et paramétrez votre -disque avec le partitionnement qui vous convient : +L'option qui compte est : -@example -cfdisk -@end example +@table @code -Si votre disque utilise le format des tables de partitions GUID (GPT) et que -vous souhaitez installer un GRUB pour système BIOS (c'est le cas par -défaut), assurez-vous de créer qu'une partition de démarrage BIOS soit bien -disponible (@pxref{BIOS installation,,, grub, GNU GRUB manual}). +@item --substitute-urls=@var{urls} +Considère @var{urls} comme la liste des URL des sources de substituts +séparés par des espaces avec lesquels comparer les paquets locaux. -@cindex EFI, installation -@cindex UEFI, installation -@cindex ESP, partition système EFI -Si vous souhaitez à la place utilise GRUB pour système EFI, vous devrez -avoir une @dfn{partition système EFI} (ESP) en FAT32. Cette partition -devrait être montée dans @file{/boot/efi} et doit avoir le drapeau -@code{esp}. P.@: ex.@: pour @command{parted} : +@item --verbose +@itemx -v +Montre des détails sur les correspondances (contenu identique) en plus des +informations sur différences. -@example -parted /dev/sda set 1 esp on -@end example +@end table -@quotation Remarque -@vindex grub-bootloader -@vindex grub-efi-bootloader -Vous n'êtes pas sûr de savoir si vous devez utiliser un GRUB EFI ou BIOS ? -Si le répertoire @file{/sys/firmware/efi} existe sur l'image d'installation, -vous devriez probablement effectuer une installation EFI, avec -@code{grub-efi-bootloader}. Sinon, vous devriez utiliser le GRUB en BIOS, -@code{grub-bootloader}. @xref{Configuration du chargeur d'amorçage} pour plus -d'information sur le chargeur d'amorçage. -@end quotation +@node Invoquer guix copy +@section Invoquer @command{guix copy} -Une fois que vous avez fini le partitionnement du disque dur cible, vous -devez créer un système de fichier sur les partitions@footnote{Actuellement -GuixSD ne supporte que les systèmes de fichiers ext4 et btrfs. En -particulier, le code qui lit les UUID des systèmes de fichiers et les -étiquettes ne fonctionne que pour ces types de systèmes de fichiers.}. Pour -l'ESP, si vous en avez une et en supposant que ce soit @file{/dev/sda1}, -lancez : +@cindex copier des éléments du dépôt par SSH +@cindex SSH, copie d'éléments du dépôt +@cindex partager des éléments du dépôt entre plusieurs machines +@cindex transférer des éléments du dépôt entre plusieurs machines +La commande @command{guix copy} copie des éléments du dépôt d'une machine +vers le dépôt d'une autre machine à travers une connexion SSH@footnote{Cette +commande n'est disponible que si Guile-SSH est trouvé. @xref{Prérequis}, +pour des détails}. Par exemple, la commande suivante copie le paquet +@code{coreutils}, le profil utilisateur et toutes leurs dépendances sur +@var{hôte}, en tant qu'utilisateur @var{utilisateur} : @example -mkfs.fat -F32 /dev/sda1 +guix copy --to=@var{utilisateur}@@@var{hôte} \ + coreutils `readlink -f ~/.guix-profile` @end example -Préférez assigner une étiquette au système de fichier pour que vous puissiez -vous y référer de manière fiable dans la déclaration @code{file-system} -(@pxref{Systèmes de fichiers}). On le fait habituellement avec l'option @code{-L} -de @command{mkfs.ext4} et des commandes liées. Donc, en supposant que la -partition racine soit sur @file{/dev/sda2}, on peut créer un système de -fichier avec pour étiquette @code{my-root} avec : +Si certains éléments à copier sont déjà présents sur @var{hôte}, ils ne sont +pas envoyés. + +La commande ci-dessous récupère @code{libreoffice} et @code{gimp} depuis +@var{hôte}, en supposant qu'ils y sont présents : @example -mkfs.ext4 -L my-root /dev/sda2 +guix copy --from=@var{hôte} libreoffice gimp @end example -@cindex chiffrement du disque -Si vous voulez plutôt chiffrer la partition racine, vous pouvez utiliser les -utilitaires Cryptsetup et LUKS pour cela (voir @inlinefmtifelse{html, -@uref{https://linux.die.net/man/8/cryptsetup, @code{man cryptsetup}}, -@code{man cryptsetup}} pour plus d'informations). En supposant que vous -voulez stocker la partition racine sur @file{/dev/sda2}, la séquence de -commandes suivante vous mènerait à ce résultat : +La connexion SSH est établie avec le client Guile-SSH, qui set compatible +avec OpenSSH : il honore @file{~/.ssh/known_hosts} et @file{~/.ssh/config} +et utilise l'agent SSH pour l'authentification. -@example -cryptsetup luksFormat /dev/sda2 -cryptsetup open --type luks /dev/sda2 my-partition -mkfs.ext4 -L my-root /dev/mapper/my-partition -@end example +La clef utilisée pour signer les éléments qui sont envoyés doit être +acceptée par la machine distante. De même, la clef utilisée pour la machine +distante depuis laquelle vous récupérez des éléments doit être dans +@file{/etc/guix/acl} pour qu'ils soient acceptés par votre propre démon. +@xref{Invoquer guix archive}, pour plus d'informations sur +l'authentification des éléments du dépôt. -Une fois cela effectué, montez le système de fichier cible dans @file{/mnt} -avec une commande comme (de nouveau, en supposant que @code{my-root} est -l'étiquette du système de fichiers racine) : +La syntaxe générale est : @example -mount LABEL=my-root /mnt +guix copy [--to=@var{spec}|--from=@var{spec}] @var{items}@dots{} @end example -Montez aussi tous les systèmes de fichiers que vous voudriez utiliser sur le -système cible relativement à ce chemin. Si vous avez un @file{/boot} sur -une partition séparé par exemple, montez-le sur @file{/mnt/boot} maintenant -pour qu'il puisse être trouvé par @code{guix system init} ensuite. +Vous devez toujours spécifier l'une des options suivantes : -Enfin, si vous souhaitez utiliser une ou plusieurs partitions de swap -(@pxref{Memory Concepts, swap space,, libc, The GNU C Library Reference -Manual}), assurez-vous de les initialiser avec @command{mkswap}. En -supposant que vous avez une partition de swap sur @file{/dev/sda3}, vous -pouvez lancer : +@table @code +@item --to=@var{spec} +@itemx --from=@var{spec} +Spécifie l'hôte où envoyer ou d'où recevoir les éléments. @var{spec} doit +être une spécification SSH comme @code{example.org}, +@code{charlie@@example.org} ou @code{charlie@@example.org:2222}. +@end table -@example -mkswap /dev/sda3 -swapon /dev/sda3 -@end example +L'option @var{items} peut être des noms de paquets, comme @code{gimp} ou des +éléments du dépôt comme @file{/gnu/store/@dots{}-idutils-4.6}. -Autrement, vous pouvez utiliser un fichier de swap. Par exemple, en -supposant que dans le nouveau système vous voulez utiliser le fichier -@file{/swapfile} comme fichier de swap, vous lanceriez@footnote{Cet exemple -fonctionnera sur plusieurs types de systèmes de fichiers (p.@: ex.@: ext4). -Cependant, pour les systèmes de fichiers qui utilisent la copie sur écriture -(COW) comme btrfs, les étapes requises peuvent varier. Pour plus de -détails, regardez les pages de manuel de @command{mkswap} et -@command{swapon}.} : +Lorsque vous spécifiez le nom d'un paquet à envoyer, il est d'abord +construit au besoin, sauf si l'option @option{--dry-run} est spécifiée. Les +options de construction communes sont supportées (@pxref{Options de construction communes}). -@example -# Cela représente 10 Gio d'espace d'échange. Ajustez « count » pour changer la taille. -dd if=/dev/zero of=/mnt/swapfile bs=1MiB count=10240 -# Par sécurité, laissez le fichier en lecture et en écriture uniquement pour root. -chmod 600 /mnt/swapfile -mkswap /mnt/swapfile -swapon /mnt/swapfile -@end example -Remarquez que si vous avez chiffré la partition racine et créé un fichier -d'échange dans son système de fichier comme décrit ci-dessus, alors le -chiffrement protégera aussi le fichier d'échange, comme n'importe quel -fichier de ce système de fichiers. +@node Invoquer guix container +@section Invoquer @command{guix container} +@cindex conteneur +@cindex @command{guix container} +@quotation Remarque +À la version @value{VERSION}, cet outil est toujours expérimental. +L'interface est sujette à changement radicaux dans le futur. +@end quotation -@node Effectuer l'installation -@subsection Effectuer l'installation +Le but de @command{guix container} est de manipuler des processus qui +tournent dans un environnement séparé, connus sous le nom de « conteneur », +typiquement créés par les commandes @command{guix environment} +(@pxref{Invoquer guix environment}) et @command{guix system container} +(@pxref{Invoquer guix system}). -Lorsque la partition cible est prête et que les autres partitions sont -montées, on est prêt à commencer l'installation. Commencez par : +La syntaxe générale est : @example -herd start cow-store /mnt +guix container @var{action} @var{options}@dots{} @end example -Cela rend @file{/gnu/store} capable de faire de la copie sur écriture, de -sorte que les paquets ajoutés pendant l'installation sont écrits sur le -disque cible sur @file{/mnt} plutôt que gardés en mémoire. Cela est -nécessaire parce que la première phase de la commande @command{guix system -init} (voir plus bas) implique de télécharger ou de construire des éléments -de @file{/gnu/store} qui est initialement un système de fichiers en mémoire. +@var{action} spécifie les opérations à effectuer avec un conteneur, et +@var{options} spécifie les arguments spécifiques au contexte pour l'action. -Ensuite, vous devrez modifier un fichier et fournir la déclaration du -système à installer. Pour cela, le système d'installation propose trois -éditeurs de texte. Nous recommandons GNU nano (@pxref{Top,,, nano, GNU nano -Manual}), qui supporte la coloration syntaxique la correspondance de -parenthèses ; les autres éditeurs sont GNU Zile (un clone d'Emacs) et nvi -(un clone de l'éditeur @command{vi} original de BSD). Nous recommandons -vivement de stocker ce fichier sur le système de fichier racine cible, -disons en tant que @file{/mnt/etc/config.scm}. Sinon, vous perdrez votre -fichier de configuration une fois que vous aurez redémarré sur votre nouveau -système. +Les actions suivantes sont disponibles : -@xref{Utiliser le système de configuration}, pour un aperçu de comment créer votre -fichier de configuration. Les exemples de configuration dont on parle dans -cette section sont disponibles dans @file{/etc/configuration} sur l'image -d'installation. Ainsi, pour commencer avec une configuration du système qui -fournit un serveur d'affichage graphique (un système de « bureau »), vous -pouvez lancer ce qui suit : +@table @code +@item exec +Exécute une commande dans le contexte d'un conteneur lancé. + +La syntaxe est : @example -# mkdir /mnt/etc -# cp /etc/configuration/desktop.scm /mnt/etc/config.scm -# nano /mnt/etc/config.scm +guix container exec @var{pid} @var{programme} @var{arguments}@dots{} @end example -Vous devriez faire attention à ce que contient votre fichier de -configuration, en particulier : - -@itemize -@item -Assurez-vous que la forme @code{bootloader-configuration} se réfère à la -cible où vous voulez installer GRUB. Elle devrait aussi mentionner -@code{grub-bootloader} si vous installer GRUB en mode BIOS (ou « legacy ») -ou @code{grub-efi-bootloader} pour les système UEFI plus récents. Pour les -anciens systèmes, le champs @code{target} contient un périphérique comme -@code{/dev/sda} ; pour les systèmes UEFI il contient un chemin vers une -partition EFI montée, comme @code{/boot/efi}, et assurez-vous que ce chemin -est bien monté. - -@item -Assurez-vous que les étiquettes de vos systèmes de fichiers correspondent -aux valeurs de leur champs @code{device} dans votre configuration -@code{file-system}, en supposant que la configuration @code{file-system} -utilise la procédure @code{file-system-label} dans son champ @code{device}. - -@item -Si vous avez des partitions RAID ou chiffrées, assurez-vous d'ajouter un -champ @code{mapped-device} pour les décrire (@pxref{Périphériques mappés}). -@end itemize +@var{pid} spécifie le PID du conteneur lancé. @var{programme} spécifie le +nom du fichier exécutable dans le système de fichiers racine du conteneur. +@var{arguments} sont les options supplémentaires à passer à @var{programme}. -Une fois que vous avez fini les préparatifs sur le fichier de configuration, -le nouveau système peut être initialisé (rappelez-vous que le système de -fichiers racine cible est dans @file{/mnt}) : +The following command launches an interactive login shell inside a Guix +system container, started by @command{guix system container}, and whose +process ID is 9001: @example -guix system init /mnt/etc/config.scm /mnt +guix container exec 9001 /run/current-system/profile/bin/bash --login @end example -@noindent -Cela copie tous les fichiers nécessaires et installe GRUB sur -@file{/dev/sdX} à moins que vous ne passiez l'option -@option{--no-bootloader}. Pour plus d'informations, @pxref{Invoquer guix system}. Cette commande peut engendrer des téléchargements ou des -constructions pour les paquets manquants, ce qui peut prendre du temps. +Remarquez que @var{pid} ne peut pas être le processus parent d'un +conteneur. Ce doit être le PID 1 du conteneur ou l'un de ses processus +fils. -Une fois que cette commande a terminée — et on l'espère réussi ! — vous -pouvez lancer @command{reboot} et démarrer sur votre nouveau système. Le -mot de passe @code{root} est d'abord vide ; les mots de passe des autres -utilisateurs doivent être initialisés avec la commande @command{passwd} en -tant que @code{root}, à mois que votre configuration ne spécifie autre chose -(@pxref{user-account-password, mot de passe des comptes utilisateurs}). +@end table + +@node Invoquer guix weather +@section Invoquer @command{guix weather} -@cindex mettre à jour GuixSD -À partir de maintenant, vous pouvez mettre à jour GuixSD lorsque vous le -souhaitez en lançant @command{guix pull} en tant que @code{root} -(@pxref{Invoquer guix pull}), puis en lançant @command{guix system -reconfigure} pour construire une nouvelle génération du système avec les -derniers paquets et les derniers services (@pxref{Invoquer guix system}). -Nous vous recommandons de le faire régulièrement pour que votre système -inclus les dernières mises à jour de sécurité (@pxref{Mises à jour de sécurité}). +Vous pouvez parfois grogner lorsque les substituts ne sont pas disponibles +et que vous devez construire les paquets vous-même (@pxref{Substituts}). La +commande @command{guix weather} rapporte la disponibilité des substituts sur +les serveurs spécifiés pour que vous sachiez si vous allez raller +aujourd'hui. Cela peut parfois être une information utile pour les +utilisateurs, mais elle est surtout utile pour les personnes qui font +tourner @command{guix publish} (@pxref{Invoquer guix publish}). -Rejoignez-nous sur @code{#guix} sur le réseau IRC Freenode ou sur -@file{guix-devel@@gnu.org} pour partager votre expérience — bonne ou -mauvaise. +@cindex statistiques sur les substituts +@cindex disponibilité des substituts +@cindex substituts, disponibilité +@cindex weather, disponibilité des substituts +Voici un exemple : -@node Installer GuixSD dans une VM -@subsection Installer GuixSD sur une machine virtuelle +@example +$ guix weather --substitute-urls=https://guix.example.org +calcul de 5,872 dérivations de paquets pour x86_64-linux… +recherche de 6,128 éléments du dépôt sur https://guix.example.org… +mise à jour de la liste des substituts depuis 'https://guix.example.org'... 100.0% +https://guix.example.org + 43.4% substituts disponibles (2,658 sur 6,128) + 7,032.5 Mo de fichiers nar (compressés) + 19,824.2 Mo sur le disque (décompressés) + 0.030 secondes par requêtes (182.9 secondes au total) + 33.5 requêtes par seconde -@cindex machine virtuelle, installation de GuixSD -@cindex serveur privé virtuel (VPS) -@cindex VPS (serveur privé virtuel) -Si vous souhaitez installer GuixSD sur une machine virtuelle (VM) ou un -serveur privé virtuel (VPS) plutôt que sur votre machine chérie, cette -section est faite pour vous. + 9.8% (342 sur 3,470) des éléments manquants sont dans la queue + 867 constructions dans la queue + x86_64-linux : 518 (59.7%) + i686-linux : 221 (25.5%) + aarch64-linux : 128 (14.8%) + vitesse de construction : 23.41 constructions par heure + x86_64-linux : 11.16 constructions par heure + i686-linux : 6.03 constructions par heure + aarch64-linux : 6.41 constructions par heure +@end example -Pour démarrer une VM @uref{http://qemu.org/,QEMU} pour installer GuixSD sur -une image disque, suivez ces étapes : +@cindex intégration continue, statistiques +As you can see, it reports the fraction of all the packages for which +substitutes are available on the server---regardless of whether substitutes +are enabled, and regardless of whether this server's signing key is +authorized. It also reports the size of the compressed archives (``nars'') +provided by the server, the size the corresponding store items occupy in the +store (assuming deduplication is turned off), and the server's throughput. +The second part gives continuous integration (CI) statistics, if the server +supports it. In addition, using the @option{--coverage} option, +@command{guix weather} can list ``important'' package substitutes missing on +the server (see below). -@enumerate -@item -Tout d'abord récupérez et décompressez l'image d'installation de GuixSD -comme décrit précédemment (@pxref{Installation depuis une clef USB ou un DVD}). +Pour cela, @command{guix weather} récupère par HTTP(S) les métadonnées +(@dfn{narinfos}@ de tous les éléments du dépôts pertinents. Comme +@command{guix challenge}, il ignore les signatures de ces substituts, ce qui +n'est pas dangereux puisque la commande ne fait que récupérer des +statistiques et n'installe pas ces substituts. -@item -Créez une image disque qui contiendra le système installé. Pour créer une -image qcow2, utilise la commande @command{qemu-img} : +Entre autres choses, il est possible de demander des types de système +particuliers et des ensembles de paquets particuliers. Les options +disponibles sont listées plus bas. -@example -qemu-img create -f qcow2 guixsd.img 50G -@end example +@table @code +@item --substitute-urls=@var{urls} +@var{urls} est la liste des URL des serveurs de substituts séparés par des +espaces. Lorsque cette option n'est pas renseignée, l'ensemble des serveurs +de substituts par défaut est utilisé. -Le fichier qui en résulte sera bien plus petit que les 50 Go (habituellement -moins de 1 Mo) mais il grossira au fur et à mesure que le stockage virtuel -grossira. +@item --system=@var{système} +@itemx -s @var{système} +Effectue des requêtes pour les substituts @var{système} — p.@: ex.@: +@code{aarch64-linux}. Cette option peut être répétée, auquel cas +@command{guix weather} demandera les substituts de plusieurs types de +systèmes. -@item -Démarrez l'image d'installation USB dans une VM : +@item --manifest=@var{fichier} +Plutôt que de demander des substituts pour tous les paquets, demande +uniquement les paquets spécifiés dans @var{fichier}. @var{fichier} doit +contenir un @dfn{manifeste} comme avec l'option @code{-m} de @command{guix +package} (@pxref{Invoquer guix package}). -@example -qemu-system-x86_64 -m 1024 -smp 1 \ - -net user -net nic,model=virtio -boot menu=on \ - -drive file=guixsd-install-@value{VERSION}.@var{system}.iso \ - -drive file=guixsd.img +@item --coverage[=@var{count}] +@itemx -c [@var{count}] +Report on substitute coverage for packages: list packages with at least +@var{count} dependents (zero by default) for which substitutes are +unavailable. Dependent packages themselves are not listed: if @var{b} +depends on @var{a} and @var{a} has no substitutes, only @var{a} is listed, +even though @var{b} usually lacks substitutes as well. The result looks +like this: + +@example +$ guix weather --substitute-urls=https://ci.guix.fr.info -c 10 +computing 8,983 package derivations for x86_64-linux... +looking for 9,343 store items on https://ci.guix.fr.info... +updating substitutes from 'https://ci.guix.fr.info'... 100.0% +https://ci.guix.fr.info + 64.7% substitutes available (6,047 out of 9,343) +@dots{} +2502 packages are missing from 'https://ci.guix.fr.info' for 'x86_64-linux', among which: + 58 kcoreaddons@@5.49.0 /gnu/store/@dots{}-kcoreaddons-5.49.0 + 46 qgpgme@@1.11.1 /gnu/store/@dots{}-qgpgme-1.11.1 + 37 perl-http-cookiejar@@0.008 /gnu/store/@dots{}-perl-http-cookiejar-0.008 + @dots{} @end example -L'ordre des périphérique est important +What this example shows is that @code{kcoreaddons} and presumably the 58 +packages that depend on it have no substitutes at @code{ci.guix.fr.info}; +likewise for @code{qgpgme} and the 46 packages that depend on it. -Dans la console de la VM, appuyez rapidement sur @kbd{F12} pour entrer dans -le menu de démarrage. Ensuite appuyez sur @kbd{2} et la touche @kbd{Entrée} -pour valider votre choix. +If you are a Guix developer, or if you are taking care of this build farm, +you'll probably want to have a closer look at these packages: they may +simply fail to build. +@end table -@item -Vous êtes maintenant root dans la VM, continuez en suivant la procédure -d'installation. @xref{Préparer l'installation}, et suivez les -instructions. -@end enumerate +@node Invoquer guix processes +@section Invoquer @command{guix processes} -Une fois l'installation terminée, vous pouvez démarrer le système dans votre -image @file{guixsd.img}. @xref{Lancer GuixSD dans une VM}, pour une manière de -faire. +La commande @command{guix processes} peut être utile pour les développeurs +et les administrateurs systèmes, surtout sur des machines multi-utilisateurs +et sur les fermes de construction : elle liste les sessions actuelles (les +connexions au démon), ainsi que des informations sur les processus en +question@footnote{Les sessions distantes, lorsque @command{guix-daemon} est +démarré avec @option{--listen} en spécifiant un point d'entrée TCP, ne sont +@emph{pas} listées.}. Voici un exemple des informations qu'elle renvoie : -@node Construire l'image d'installation -@subsection Construire l'image d'installation +@example +$ sudo guix processes +SessionPID: 19002 +ClientPID: 19090 +ClientCommand: guix environment --ad-hoc python -@cindex image d'installation -L'image d'installation décrite plus haut a été construite avec la commande -@command{guix system}, plus précisément : +SessionPID: 19402 +ClientPID: 19367 +ClientCommand: guix publish -u guix-publish -p 3000 -C 9 @dots{} -@example -guix system disk-image gnu/system/install.scm +SessionPID: 19444 +ClientPID: 19419 +ClientCommand: cuirass --cache-directory /var/cache/cuirass @dots{} +LockHeld: /gnu/store/@dots{}-perl-ipc-cmd-0.96.lock +LockHeld: /gnu/store/@dots{}-python-six-bootstrap-1.11.0.lock +LockHeld: /gnu/store/@dots{}-libjpeg-turbo-2.0.0.lock +ChildProcess: 20495: guix offload x86_64-linux 7200 1 28800 +ChildProcess: 27733: guix offload x86_64-linux 7200 1 28800 +ChildProcess: 27793: guix offload x86_64-linux 7200 1 28800 @end example -Regardez le fichier @file{gnu/system/install.scm} dans l'arborescence des -sources et regardez aussi @ref{Invoquer guix system} pour plus -d'informations sur l'image d'installation. - -@subsection Construire l'image d'installation pour les cartes ARM +Dans cet exemple, on voit que @command{guix-daemon} a trois clients directs +: @command{guix environment}, @command{guix publish} et l'outil +d'intégration continue Cuirass ; leur identifiant de processus (PID) est +donné par le champ @code{ClientPID}. Le champ @code{SessionPID} fournit le +PID du sous-processus @command{guix-daemon} de cette session particulière. -De nombreuses cartes ARM requièrent une variante spécifique du chargeur -d'amorçage @uref{http://www.denx.de/wiki/U-Boot/, U-Boot}. +Les champs @code{LockHeld} montrent quels éléments du dépôt sont +actuellement verrouillés par cette session, ce qui correspond aux éléments +du dépôt qui sont en train d'être construits ou d'être substitués (le champ +@code{LockHeld} n'est pas montré si @command{guix processes} n'est pas lancé +en root). Enfin, en regardant le champ @code{ChildProcess}, on comprend que +ces trois constructions sont déchargées (@pxref{Réglages du délestage du démon}). -Si vous construisez une image disque et que le chargeur d'amorçage n'est pas -disponible autrement (sur un autre périphérique d'amorçage etc), il est -recommandé de construire une image qui inclus le chargeur d'amorçage, plus -précisément : +La sortie est dans le format Recutils pour qu'on puisse utiliser la commande +@command{recsel} pour sélectionner les sessions qui nous intéressent +(@pxref{Selection Expressions,,, recutils, GNU recutils manual}). Par +exemple, la commande montre la ligne de commande et le PID du client qui +effectue la construction d'un paquet Perl : @example -guix system disk-image --system=armhf-linux -e '((@@ (gnu system install) os-with-u-boot) (@@ (gnu system install) installation-os) "A20-OLinuXino-Lime2")' +$ sudo guix processes | \ + recsel -p ClientPID,ClientCommand -e 'LockHeld ~ "perl"' +ClientPID: 19419 +ClientCommand: cuirass --cache-directory /var/cache/cuirass @dots{} @end example -@code{A20-OLinuXino-Lime2} est le nom de la carte. Si vous spécifiez une -carte invalide, une liste de cartes possibles sera affichée. @node Configuration système -@section Configuration système +@chapter Configuration système @cindex configuration du système La distribution système Guix utilise un mécanisme de configuration du @@ -10065,13 +10276,12 @@ est configuré et instancié. Ensuite nous montrons comment ce mécanisme peut * Configuration du chargeur d'amorçage:: Configurer le chargeur d'amorçage. * Invoquer guix system:: Instantier une configuration du système. -* Lancer GuixSD dans une VM:: Comment lancer GuixSD dans une machine - virtuelle. +* Running Guix in a VM:: How to run Guix System in a virtual machine. * Définir des services:: Ajouter de nouvelles définitions de services. @end menu @node Utiliser le système de configuration -@subsection Utiliser le système de configuration +@section Utiliser le système de configuration Le système d'exploitation est configuré en fournissant une déclaration @code{operating-system} dans un fichier qui peut être passé à la command @@ -10095,7 +10305,7 @@ importants (@pxref{Référence de système d'exploitation}, pour des détails su les champs disponibles) et comment @dfn{instancier} le système d'exploitation avec @command{guix system}. -@unnumberedsubsubsec Bootloader +@unnumberedsubsec Bootloader @cindex ancien système de démarrage, sur les machines Intel @cindex démarrage BIOS, sur les machines Intel @@ -10117,7 +10327,7 @@ Extensible Firmware Interface}) pour démarrer. Dans ce cas, le champ @xref{Configuration du chargeur d'amorçage}, pour plus d'informations sur les options de configuration disponibles. -@unnumberedsubsubsec Paquets visibles sur tout le système +@unnumberedsubsec Paquets visibles sur tout le système @vindex %base-packages Le champ @code{packages} liste les paquets qui seront visibles sur tout le @@ -10162,18 +10372,17 @@ le meilleur paquet pour un nom donné ou un nom et une version : %base-packages))) @end lisp -@unnumberedsubsubsec Services systèmes +@unnumberedsubsec Services systèmes @cindex services @vindex %base-services -Le champ @code{services} liste les @dfn{services système} à rendre -disponible lorsque le système démarre (@pxref{Services}). La déclaration -@code{operating-system} au-dessus spécifie que, en plus des services de -base, on veut que le démon ssh @command{lshd} écoute sur le port 2222 -(@pxref{Services réseau, @code{lsh-service}}). Sous le capot, -@code{lsh-service} s'arrange pour que @code{lshd} soit lancé avec les bonnes -options de la ligne de commande, éventuellement en générant des fichiers de -configuration (@pxref{Définir des services}). +The @code{services} field lists @dfn{system services} to be made available +when the system starts (@pxref{Services}). The @code{operating-system} +declaration above specifies that, in addition to the basic services, we want +the OpenSSH secure shell daemon listening on port 2222 (@pxref{Services réseau, @code{openssh-service-type}}). Under the hood, +@code{openssh-service-type} arranges so that @command{sshd} is started with +the right command-line options, possibly with supporting configuration files +generated as needed (@pxref{Définir des services}). @cindex personnalisation des services @findex modify-services @@ -10253,7 +10462,7 @@ l'expression suivante renvoie une liste qui contient tous les services dans %desktop-services) @end example -@unnumberedsubsubsec Instancier le système +@unnumberedsubsec Instancier le système En supposant que la déclaration @code{operating-system} est stockée dans le fichier @file{my-system-config.scm}, la commande @command{guix system @@ -10286,10 +10495,10 @@ actuelle n'est pas la dernière (p.@: ex.@: après avoir invoqué @command{guix system roll-back}), puisque l'opération pourrait remplacer une génération suivante (@pxref{Invoquer guix system}). -@unnumberedsubsubsec L'interface de programmation +@unnumberedsubsec L'interface de programmation Au niveau Scheme, la grosse déclaration @code{operating-system} est -instanciée avec la procédure monadique suivante (@pxref{La monad du dépôt}) : +instanciée avec la procédure monadique suivante (@pxref{La monade du dépôt}) : @deffn {Procédure monadique} operating-system-derivation os Renvoie une dérivation qui construit @var{os}, un objet @@ -10299,13 +10508,13 @@ La sortie de la dérivation est un répertoire qui se réfère à tous les paquets et d'autres fichiers supports requis pour instancier @var{os}. @end deffn -Cette procédure est fournie par le module @code{(gnu system)}. Avec -@code{(gnu srevices)} (@pxref{Services}), ce module contient les entrailles -de GuixSD. Ouvrez-le un jour ! +This procedure is provided by the @code{(gnu system)} module. Along with +@code{(gnu services)} (@pxref{Services}), this module contains the guts of +Guix System. Make sure to visit it! @node Référence de système d'exploitation -@subsection Référence de @code{operating-system} +@section Référence de @code{operating-system} Cette section résume toutes les options disponibles dans les déclarations @code{operating-system} (@pxref{Utiliser le système de configuration}). @@ -10462,7 +10671,7 @@ membres du groupe @code{wheel} peuvent utiliser @code{sudo}. @end deftp @node Systèmes de fichiers -@subsection Systèmes de fichiers +@section Systèmes de fichiers La liste des systèmes de fichiers à monter est spécifiée dans le champ @code{file-systems} de la déclaration de système d'exploitation @@ -10634,7 +10843,7 @@ chargé. @end defvr @node Périphériques mappés -@subsection Périphériques mappés +@section Périphériques mappés @cindex mappage de périphériques @cindex périphériques mappés @@ -10758,7 +10967,7 @@ automatiquement. @node Comptes utilisateurs -@subsection Comptes utilisateurs +@section Comptes utilisateurs @cindex utilisateurs @cindex comptes @@ -10897,7 +11106,7 @@ particulier et il est automatiquement ajouté qu'il soit spécifié ou non. @end defvr @node Régionalisation -@subsection Régionalisation +@section Régionalisation @cindex paramètres linguistiques Un @dfn{paramètre linguistique} définie les conventions culturelles d'une @@ -10989,7 +11198,7 @@ Library Reference Manual}). Donc par exemple il y a @code{uk_UA.utf8} mais @emph{pas}, disons, @code{uk_UA.UTF-8}. @end defvr -@subsubsection Considérations sur la compatibilité des données linguistiques +@subsection Considérations sur la compatibilité des données linguistiques @cindex incompatibilité, des données linguistiques Les déclaration @code{operating-system} fournissent un champ @@ -11012,11 +11221,10 @@ mais pas toutes les données linguistiques de la libc 2.21 (spécifiquement les données @code{LC_COLLATE} sont incompatibles) ; donc les appels à @code{setlocale} peuvent échouer, mais les programmes ne plantent pas. -Le « problème » avec GuixSD c'est que les utilisateurs ont beaucoup de -liberté : ils peuvent choisir s'ils veulent et quand ils veulent mettre à -jour les logiciels de leur profil, et peuvent utiliser une version -différente de la libc de celle que l'administrateur système utilise pour -construire les données linguistiques du système global. +The ``problem'' with Guix is that users have a lot of freedom: They can +choose whether and when to upgrade software in their profiles, and might be +using a libc version different from the one the system administrator used to +build the system-wide locale data. Heureusement, les utilisateurs non privilégiés peuvent aussi installer leur propres données linguistiques et définir @var{GUIX_LOCPATH} comme il le faut @@ -11043,7 +11251,7 @@ linguistiques pour la libc 2.21 et pour la version actuelle de la libc dans @node Services -@subsection Services +@section Services @cindex services systèmes Une part importante de la préparation d'une déclaration @@ -11052,13 +11260,11 @@ configuration (@pxref{Utiliser le système de configuration}). Les services systèmes sont typiquement des démons lancés au démarrage ou d'autres actions requises à ce moment-là — p.@: ex.@: configurer les accès réseaux. -GuixSD a une définition large de « service » (@pxref{Composition de services}), -mais beaucoup de services sont gérés par le GNU@tie{}Shepherd -(@pxref{Services Shepherd}). Sur un système lancé, la commande -@command{herd} vous permet de lister les services disponibles, montrer leur -statut, les démarrer et les arrêter, ou faire d'autres opérations -spécifiques (@pxref{Jump Start,,, shepherd, The GNU Shepherd Manual}). Par -exemple : +Guix has a broad definition of ``service'' (@pxref{Composition de services}), +but many services are managed by the GNU@tie{}Shepherd (@pxref{Services Shepherd}). On a running system, the @command{herd} command allows you to +list the available services, show their status, start and stop them, or do +other specific operations (@pxref{Jump Start,,, shepherd, The GNU Shepherd +Manual}). For example: @example # herd status @@ -11096,7 +11302,7 @@ par les services de base qui peuvent être utilisés avec une déclaration * Services de base:: Services systèmes essentiels. * Exécution de tâches planifiées:: Le service mcron. * Rotation des journaux:: Le service rottlog. -* Services réseau:: Paramétres réseau, démon SSH, etc. +* Services réseau:: Paramètres réseau, démon SSH, etc. * Système de fenêtrage X:: Affichage graphique. * Services d'impression:: Support pour les imprimantes locales et distantes. @@ -11125,10 +11331,10 @@ par les services de base qui peuvent être utilisés avec une déclaration @end menu @node Services de base -@subsubsection Services de base +@subsection Services de base Le module @code{(gnu services base)} fournit des définitions de services -poru les services de base qu'on peut attendre du système. Les services +pour les services de base qu'on peut attendre du système. Les services exportés par ce module sort listés ci-dessous. @defvr {Variable Scheme} %base-services @@ -11143,7 +11349,9 @@ système, vous voudrez ajouter des services à ceux de @var{%base-services}, comme ceci : @example -(cons* (avahi-service) (lsh-service) %base-services) +(append (list (service avahi-service-type) + (service openssh-service-type)) + %base-services) @end example @end defvr @@ -11493,7 +11701,7 @@ actions suivantes : @item invalidate @cindex invalidation du cache, nscd @cindex nscd, invalidation du cache -Cela invalide le cache dnné. Par exemple, en laçant : +Cela invalide le cache donné. Par exemple, en laçant : @example herd invalidate nscd hosts @@ -11526,7 +11734,7 @@ Liste des paquets dénotant des @dfn{services de noms} qui doivent être visible pour nscd, p.@: ex.@: @code{(list @var{nss-mdns})}. @item @code{glibc} (par défaut : @var{glibc}) -Objet de paquet qui dénote la Biblothèque C de GNU qui fournit la commande +Objet de paquet qui dénote la Bibliothèque C de GNU qui fournit la commande @command{nscd}. @item @code{log-file} (par défaut : @code{"/var/log/nscd.log"}) @@ -11645,14 +11853,15 @@ Nombre de comptes utilisateurs de construction à créer. @item @code{authorize-key?} (par défaut : @code{#t}) @cindex substituts, autorisations -Autoriser ou non les clefs de substituts listées dans @code{authorize-keys} -— par défaut celle de @code{hydra.gny.org} (@pxref{Substituts}). +Whether to authorize the substitute keys listed in +@code{authorized-keys}---by default that of @code{@value{SUBSTITUTE-SERVER}} +(@pxref{Substituts}). @vindex %default-authorized-guix-keys @item @code{authorized-keys} (par défaut : @var{%default-authorized-guix-keys}) -La liste des fichiers de clefs autorisées pour les imports d'archives, en -tant que liste de gexps sous forme de chaînes (@pxref{Invoquer guix archive}). Par défaut, elle contient celle de @code{hydra.gnu.org} -(@pxref{Substituts}). +The list of authorized key files for archive imports, as a list of +string-valued gexps (@pxref{Invoquer guix archive}). By default, it +contains that of @code{@value{SUBSTITUTE-SERVER}} (@pxref{Substituts}). @item @code{use-substitutes?} (par défaut : @code{#t}) S'il faut utiliser les substituts. @@ -11693,10 +11902,11 @@ Lance @var{udev}, qui rempli le répertoire @file{/dev} dynamiquement. Les règles udev peuvent être fournies comme une liste de fichier via la variable @var{rules}. Les procédures @var{udev-rule} et @var{file->udev-rule} de @code{(gnu services base)} simplifient la création de ces fichiers de règle. +@end deffn @deffn {Procédure Scheme} udev-rule [@var{file-name} @var{contents}] Renvoie un fichier de règle udev nommé @var{file-name} contenant les règles -définie par le litéral @var{contents}. +définie par le littéral @var{contents}. Dans l'exemple suivant, on définie une règle pour un périphérique USB qui sera stockée dans le fichier @file{90-usb-thing.rules}. La règle lance un @@ -11711,6 +11921,9 @@ donné. "ATTR@{product@}==\"Example\", " "RUN+=\"/path/to/script\""))) @end example + +The @command{herd rules udev} command, as root, returns the name of the +directory containing all the active udev rules. @end deffn Ici on montre comment le service @var{udev-service} par défaut peut être @@ -11760,7 +11973,7 @@ android)}. L'exemple suivant montre comment utiliser le paquet @var{android-udev-rules} pour que l'outil Android @command{adb} puisse détecter les appareils sans -privilège root. Il détaille aussi comment créer le grope @code{adbusers}, +privilège root. Il détaille aussi comment créer le groupe @code{adbusers}, requis pour le bon fonctionnement des règles définies dans le paquet @var{android-udev-rules}. Pour créer ce groupe, on doit le définir dans les @var{supplementary-groups} de la déclaration @var{user-account} ainsi que @@ -11786,13 +11999,13 @@ dans le champ @var{groups} de l'enregistrement @var{operating-system}. ;; @dots{} (services - (modify-services %desktop-services - (udev-service-type config => - (udev-configuration (inherit config) - (rules (cons* android-udev-rules - (udev-configuration-rules config)))))))) + (modify-services %desktop-services + (udev-service-type + config => + (udev-configuration (inherit config) + (rules (cons android-udev-rules + (udev-configuration-rules config)))))))) @end example -@end deffn @defvr {Variable Scheme} urandom-seed-service-type Garde de l'entropie dans @var{%random-seed-file} pour démarrer @@ -11952,7 +12165,7 @@ sont souvent utilisés sur les systèmes audio temps-réel. @end deffn @node Exécution de tâches planifiées -@subsubsection Exécution de tâches planifiées +@subsection Exécution de tâches planifiées @cindex cron @cindex mcron @@ -11960,11 +12173,11 @@ sont souvent utilisés sur les systèmes audio temps-réel. Le module @code{(gnu services mcron)} fournit une interface pour GNU@tie{}mcron, un démon qui lance des tâches planifiées (@pxref{Top,,, mcron, GNU@tie{}mcron}). GNU@tie{}mcron est similaire au démon Unix -traditionel @command{cron} ; la principale différence est qu'il est +traditionnel @command{cron} ; la principale différence est qu'il est implémenté en Guile Scheme, qui fournit beaucoup de flexibilité lors de la spécification de la planification des tâches et de leurs actions. -L'exemple en dessous définit un système d'exploitation qu lance les +L'exemple en dessous définit un système d'exploitation qui lance les commandes @command{updatebd} (@pxref{Invoking updatedb,,, find, Finding Files}) et @command{guix gc} (@pxref{Invoquer guix gc}) tous les jours, ainsi que la commande @command{mkid} en tant qu'utilisateur non privilégié @@ -12000,9 +12213,11 @@ gexps pour introduire des définitions de tâches qui sont passées à mcron (operating-system ;; @dots{} - (services (cons (mcron-service (list garbage-collector-job - updatedb-job - idutils-job)) + (services (cons (service mcron-service-type + (mcron-configuration + (jobs (list garbage-collector-job + updatedb-job + idutils-job)))) %base-services))) @end lisp @@ -12025,18 +12240,6 @@ pouvez spécifier le nombre de tâches à afficher : # herd schedule mcron 10 @end example -@deffn {Procédure Scheme} mcron-service @var{jobs} [#:mcron @var{mcron}] -Renvoie un service mcron qui lance @var{mcron} qui planifie les tâches -@var{jobs}, une liste de gexps qui dénotent des spécifications de tâches de -mcron. - -C'est un raccourci pour : -@example -(service mcron-service-type - (mcron-configuration (mcron mcron) (jobs jobs))) -@end example -@end deffn - @defvr {Variable Scheme} mcron-service-type C'est le type du service @code{mcron}, dont la valeur est un objet @code{mcron-configuration} @@ -12062,7 +12265,7 @@ specifications,, mcron, GNU@tie{}mcron}). @node Rotation des journaux -@subsubsection Rotation des journaux +@subsection Rotation des journaux @cindex rottlog @cindex journaux, rotation @@ -12167,7 +12370,7 @@ s'agit de : @code{'("/var/log/messages" "/var/log/secure")} @end defvr @node Services réseau -@subsubsection Services réseau +@subsection Services réseau Le module @code{(gnu services networking)} fournit des services pour configurer les interfaces réseaux. @@ -12260,7 +12463,7 @@ Par exemple : @cindex gestion du réseau @deffn {Procédure Scheme} wicd-service [#:wicd @var{wicd}] Renvoie un service qui lance @url{https://launchpad.net/wicd,Wicd}, un démon -de gestion réseau qui cherche à simplifier la configuration des résaux +de gestion réseau qui cherche à simplifier la configuration des réseaux filaires et sans fil. Ce service ajoute le paquet @var{wicd} au profil global, pour fournir des @@ -12540,13 +12743,13 @@ secondes. @cindex inetd @deffn {Variable Scheme} inetd-service-type Ce service lance le démon @command{inetd} (@pxref{inetd invocation,,, -inetutils, GNU Inetutils}). @command{inetd} écoute des connexionssur des +inetutils, GNU Inetutils}). @command{inetd} écoute des connexions sur des sockets internet et démarre le programme spécifié uniquement lorsqu'une connexion arrive sur l'un de ces sockets. La valeur de ce service est un objet @code{inetd-configuration}. L'exemple suivant configure le démon @command{inetd} pour qu'il fournisse le service -@command{echo}, ainsi qu'in service smtp qui transfère le trafic smtp par +@command{echo}, ainsi qu'un service smtp qui transfère le trafic smtp par ssh à un serveur @code{smtp-server} derrière une passerelle @code{hostname} : @@ -12642,12 +12845,6 @@ lancé en tant qu'utilisateur non privilégié @code{tor}, membre du groupe @end defvr -@deffn {Procédure Scheme} tor-service [@var{config-file}] [#:tor @var{tor}] -Cette procédure est obsolète et sera supprimée dans les futures versions. -Renvoie un service de type @code{tor-service-type}. @var{config-file} et -@var{tor} ont la même signification que dans @code{}. -@end deffn - @deftp {Type de données} tor-configuration @table @asis @item @code{tor} (par défaut : @code{tor}) @@ -12985,6 +13182,19 @@ C'est le symbole qui spécifie le niveau de journalisation : @code{quiet}, Voir la page de manuel de @file{sshd_config} pour trouver la liste complète des noms de niveaux. +@item @code{extra-content} (par défaut : @code{""}) +This field can be used to append arbitrary text to the configuration file. +It is especially useful for elaborate configurations that cannot be +expressed otherwise. This configuration, for example, would generally +disable root logins, but permit them from one specific IP address: + +@example +(openssh-configuration + (extra-content "\ +Match Address 192.168.0.1 + PermitRootLogin yes")) +@end example + @end table @end deftp @@ -12994,7 +13204,7 @@ Dropbear} avec la configuration @var{config} donnée, un objet @code{}. Par exemple, pour spécifier un service Dropbear qui écoute sur le port 1234, -ajoutez cet appel au champ @code{services} d evotre système d'exploitation : +ajoutez cet appel au champ @code{services} de votre système d'exploitation : @example (dropbear-service (dropbear-configuration @@ -13060,34 +13270,53 @@ des navigateurs Web, ne se connectent à Facebook. Le module @code{(gnu services avahi)} fourni la définition suivante. -@deffn {Procédure Scheme} avahi-service [#:avahi @var{avahi}] @ - [#:host-name #f] [#:publish? #t] [#:ipv4? #t] @ -[#:ipv6? #t] [#:wide-area? #f] @ -[#:domains-to-browse '()] [#:debug? #f] -Renvoie un service qui lance @command{avahi-daemon}, un serveur qui répond -aux requêtes mDNS/DNS-SD qui permet de découvrir des services et de chercher -des noms d'hôtes « sans configuration » (voir @uref{http://avahi.org/}) et -qui étend le démon de cache de services de noms (nscd) pour qu'il puisse -résoudre des noms en @code{.local} avec -@uref{http://0pointer.de/lennart/projects/nss-mdns/, nss-mdns}. En plus, -ajoute le paquet @var{avahi} au profil du système pour que les commandes -comme @command{avahi-browse} soient directement utilisables. - -Si @var{host-name} n'est pas @code{#f}, utilise cette valeur comme nom -d'hôte à publier pour la machine ; sinon, utilise le vrai nom d'hôte de la -machine. - -Lorsque la valeur de @var{publish?} est vraie, la publication des noms -d'hôtes et des domaines sont autorisés ; en particulier, avahi-daemon -publiera le nom d'hôte et l'adresse IP de la machine via mDNS sur le réseau -local. - -Lorsque la valeur de @var{wide-area?} est vraie, DNS-SD sur DNS unicast est -activé. - -Les valeurs booléennes @var{ipv4?} et @var{ipv6?} déterminent s'il faut -utiliser un socket IPv4 ou IPv6 respectivement. -@end deffn +@defvr {Scheme Variable} avahi-service-type +This is the service that runs @command{avahi-daemon}, a system-wide +mDNS/DNS-SD responder that allows for service discovery and +``zero-configuration'' host name lookups (see @uref{http://avahi.org/}). +Its value must be a @code{zero-configuration} record---see below. + +This service extends the name service cache daemon (nscd) so that it can +resolve @code{.local} host names using +@uref{http://0pointer.de/lennart/projects/nss-mdns/, nss-mdns}. @xref{Name Service Switch}, for information on host name resolution. + +Additionally, add the @var{avahi} package to the system profile so that +commands such as @command{avahi-browse} are directly usable. +@end defvr + +@deftp {Data Type} avahi-configuration +Data type representation the configuration for Avahi. + +@table @asis + +@item @code{host-name} (default: @code{#f}) +If different from @code{#f}, use that as the host name to publish for this +machine; otherwise, use the machine's actual host name. + +@item @code{publish?} (default: @code{#t}) +When true, allow host names and services to be published (broadcast) over +the network. + +@item @code{publish-workstation?} (default: @code{#t}) +When true, @command{avahi-daemon} publishes the machine's host name and IP +address via mDNS on the local network. To view the host names published on +your local network, you can run: + +@example +avahi-browse _workstation._tcp +@end example + +@item @code{wide-area?} (default: @code{#f}) +When true, DNS-SD over unicast DNS is enabled. + +@item @code{ipv4?} (default: @code{#t}) +@itemx @code{ipv6?} (default: @code{#t}) +These fields determine whether to use IPv4/IPv6 sockets. + +@item @code{domains-to-browse} (default: @code{'()}) +This is a list of domains to browse. +@end table +@end deftp @deffn {Variable Scheme} openvswitch-service-type C'est le type du service @uref{http://www.openvswitch.org, Open vSwitch}, @@ -13107,7 +13336,7 @@ Objet de paquet de Open vSwitch. @end deftp @node Système de fenêtrage X -@subsubsection Système de fenêtrage X +@subsection Système de fenêtrage X @cindex X11 @cindex Système de fenêtrage X @@ -13309,18 +13538,33 @@ avec une configuration de type @code{}. @end deffn @deffn {Procédure Scheme} xorg-start-command [#:guile] @ - [#:modules %default-xorg-modules] @ -[#:fonts %default-xorg-fonts] @ -[#:configuration-file (xorg-configuration-file @dots{})] @ -[#:xorg-server @var{xorg-server}] -Renvoie un script @code{startx} dans lequel @var{modules}, une liste de -paquets de modules X et @var{fonts}, une liste de répertoires de polices X, -sont disponibles. Voir @code{xorg-wrapper} pour plus de détails sur les -arguments. Le résultat devrait être utilisé à la place de @code{startx}. + [#:modules %default-xorg-modules] @ [#:fonts %default-xorg-fonts] @ +[#:configuration-file (xorg-configuration-file @dots{})] @ [#:xorg-server +@var{xorg-server}] [#:xserver-arguments '("-nolisten" "tcp")] Return a +@code{startx} script in which @var{modules}, a list of X module packages, +and @var{fonts}, a list of X font directories, are available. See +@code{xorg-wrapper} for more details on the arguments. The result should be +used in place of @code{startx}. Habituellement le serveur X est démarré par un gestionnaire de connexion. @end deffn +@cindex @code{-listen tcp}, for X11. +This procedure is useful to override command line options for the X server, +such as having it listen to over TCP: + +@example +(operating-system + ... + (services + (modify-services %desktop-services + (slim-service-type config => + (slim-configuration + (inherit config) + (startx (xorg-start-command + #:xserver-arguments '("-listen" "tcp")))))))) +@end example + @deffn {Procédure Scheme} xorg-configuration-file @ [#:modules %default-xorg-modules] @ [#:fonts %default-xorg-fonts] @ @@ -13401,13 +13645,12 @@ rend utilisable le bon vieux XlockMore. @node Services d'impression -@subsubsection Services d'impression +@subsection Services d'impression @cindex support des imprimantes avec CUPS -Le module @code{(gnu services cups)} fournit une définition de service Guix -pour le service d'impression CUPS. Pour ajouter le support d'une imprimante -à un système GuixSD, ajoutez un @code{cups-service} à la définition du -système d'exploitation : +The @code{(gnu services cups)} module provides a Guix service definition for +the CUPS printing service. To add printer support to a Guix system, add a +@code{cups-service} to the operating system definition: @deffn {Variable Scheme} cups-service-type Le type de service pour un serveur d'impression CUPS. Sa valeur devrait @@ -13428,7 +13671,7 @@ auto-signé si besoin, pour les connexions sécurisée avec le serveur d'impression. Supposons que vous souhaitiez activer l'interface Web de CUPS et ajouter le -support pour les imprimantes Epson via le paquet @code{escpr} et our les +support pour les imprimantes Epson via le paquet @code{escpr} et pour les imprimantes HP via le paquet @code{hplip-minimal}. Vous pouvez le faire directement, comme ceci (vous devez utiliser le module @code{(gnu packages cups)}) : @@ -13776,7 +14019,7 @@ La valeur par défaut est @samp{stop-printer}. Spécifie le coût maximum des filtres qui sont lancés en même temps, pour minimiser les problèmes de ressources de disque, de mémoire et de CPU. Une limite de 0 désactive la limite de filtrage. Une impression standard vers -une imprimante non-PostScript requirt une limite de filtre d'environ 200. +une imprimante non-PostScript requiert une limite de filtre d'environ 200. Une imprimante PostScript requiert environ la moitié (100). Mettre en place la limite en dessous de ces valeurs limitera l'ordonnanceur à un seul travail d'impression à la fois. @@ -13852,7 +14095,7 @@ La valeur par défaut est @samp{0}. @deftypevr {paramètre de @code{cups-configuration}} multiline-string-list listen Écoute sur les interfaces spécifiées. Les valeurs valides sont de la forme -@var{adresse}:@var{port}, où @var{adresse} est sotit une daresse IPv6 dans +@var{adresse}:@var{port}, où @var{adresse} est soit une adresse IPv6 dans des crochets, soit une adresse IPv4, soit @code{*} pour indiquer toutes les adresses. Les valeurs peuvent aussi être des noms de fichiers de socket UNIX domain. La directive Listen est similaire à la directive Port mais @@ -14275,7 +14518,7 @@ cette manière : @node Services de bureaux -@subsubsection Services de bureaux +@subsection Services de bureaux Le module @code{(gnu services desktop)} fournit des services qui sont habituellement utiles dans le contexte d'une installation « de bureau » — @@ -14505,24 +14748,80 @@ exemple, un utilisateur normal peut obtenir le droit de mettre le système en veille si l'utilisateur est connecté localement. @end deffn -@deffn {Procédure Scheme} upower-service [#:upower @var{upower}] @ - [#:watts-up-pro? #f] @ -[#:poll-batteries? #t] @ -[#:ignore-lid? #f] @ -[#:use-percentage-for-policy? #f] @ -[#:percentage-low 10] @ -[#:percentage-critical 3] @ -[#:percentage-action 2] @ -[#:time-low 1200] @ -[#:time-critical 300] @ -[#:time-action 120] @ -[#:critical-power-action 'hybrid-sleep] -Renvoie un service qui lance @uref{http://upower.freedesktop.org/, -@command{upowerd}}, un moniteur système pour la consommation électrique et -le niveau de batterie, avec les paramètres de configuration données. Il -implémente l'interface D-Bus @code{org.freedesktop.UPower} et est notamment -utilisé par GNOME. -@end deffn +@defvr {Scheme Variable} upower-service-type +Service that runs @uref{http://upower.freedesktop.org/, @command{upowerd}}, +a system-wide monitor for power consumption and battery levels, with the +given configuration settings. + +It implements the @code{org.freedesktop.UPower} D-Bus interface, and is +notably used by GNOME. +@end defvr + +@deftp {Data Type} upower-configuration +Data type representation the configuration for UPower. + +@table @asis + +@item @code{upower} (default: @var{upower}) +Package to use for @code{upower}. + +@item @code{watts-up-pro?} (default: @code{#f}) +Enable the Watts Up Pro device. + +@item @code{poll-batteries?} (default: @code{#t}) +Enable polling the kernel for battery level changes. + +@item @code{ignore-lid?} (default: @code{#f}) +Ignore the lid state, this can be useful if it's incorrect on a device. + +@item @code{use-percentage-for-policy?} (default: @code{#f}) +Whether battery percentage based policy should be used. The default is to +use the time left, change to @code{#t} to use the percentage. + +@item @code{percentage-low} (default: @code{10}) +When @code{use-percentage-for-policy?} is @code{#t}, this sets the +percentage at which the battery is considered low. + +@item @code{percentage-critical} (default: @code{3}) +When @code{use-percentage-for-policy?} is @code{#t}, this sets the +percentage at which the battery is considered critical. + +@item @code{percentage-action} (default: @code{2}) +When @code{use-percentage-for-policy?} is @code{#t}, this sets the +percentage at which action will be taken. + +@item @code{time-low} (default: @code{1200}) +When @code{use-time-for-policy?} is @code{#f}, this sets the time remaining +in seconds at which the battery is considered low. + +@item @code{time-critical} (default: @code{300}) +When @code{use-time-for-policy?} is @code{#f}, this sets the time remaining +in seconds at which the battery is considered critical. + +@item @code{time-action} (default: @code{120}) +When @code{use-time-for-policy?} is @code{#f}, this sets the time remaining +in seconds at which action will be taken. + +@item @code{critical-power-action} (default: @code{'hybrid-sleep}) +The action taken when @code{percentage-action} or @code{time-action} is +reached (depending on the configuration of +@code{use-percentage-for-policy?}). + +Possible values are: + +@itemize @bullet +@item +@code{'power-off} + +@item +@code{'hibernate} + +@item +@code{'hybrid-sleep}. +@end itemize + +@end table +@end deftp @deffn {Procédure Scheme} udisks-service [#:udisks @var{udisks}] Renvoie un service pour @uref{http://udisks.freedesktop.org/docs/latest/, @@ -14590,7 +14889,7 @@ service D-Bus. @end deffn @node Services de son -@subsubsection Services de son +@subsection Services de son @cindex support du son @cindex ALSA @@ -14603,7 +14902,7 @@ pilote de sortie préféré d'ALSA. @deffn {Variable Scheme} alsa-service-type C'est le type pour le système @uref{https://alsa-project.org/, Advanced Linux Sound Architecture} (ALSA), qui génère le fichier de configuration -@file{/etc/asound.conf}. La valer de ce type est un enregistrement +@file{/etc/asound.conf}. La valeur de ce type est un enregistrement @command{alsa-configuration} comme dans cet exemple : @example @@ -14672,22 +14971,57 @@ détails. @node Services de bases de données -@subsubsection Services de bases de données +@subsection Services de bases de données @cindex database @cindex SQL Le module @code{(gnu services databases)} fournit les services suivants. @deffn {Procédure Scheme} postgresql-service [#:postgresql postgresql] @ - [#:config-file] [#:data-directory ``/var/lib/postgresql/data''] @ -[#:port 5432] [#:locale ``en_US.utf8''] -Renvoie un service qui lance @var{postgresql}, le service de bases de -données PostgreSQL. + [#:config-file] [#:data-directory ``/var/lib/postgresql/data''] @ [#:port +5432] [#:locale ``en_US.utf8''] [#:extension-packages '()] Return a service +that runs @var{postgresql}, the PostgreSQL database server. Le démon PostgreSQL charge sa configuration à l'exécution depuis @var{config-file}, crée une grappe de bases de données avec @var{locale} comme paramètre de régionalisation par défaut, stockée dans @var{data-directory}. Il écoute ensuite sur @var{port}. + +@cindex postgresql extension-packages +Additional extensions are loaded from packages listed in +@var{extension-packages}. Extensions are available at runtime. For +instance, to create a geographic database using the @code{postgis} +extension, a user can configure the postgresql-service as in this example: + +@cindex postgis +@example +(use-package-modules databases geo) + +(operating-system + ... + ;; postgresql is required to run `psql' but postgis is not required for + ;; proper operation. + (packages (cons* postgresql %base-packages)) + (services + (cons* + (postgresql-service #:extension-packages (list postgis)) + %base-services))) +@end example + +Then the extension becomes visible and you can initialise an empty +geographic database in this way: + +@example +psql -U postgres +> create database postgistest; +> \connect postgistest; +> create extension postgis; +> create extension postgis_topology; +@end example + +There is no need to add this field for contrib extensions such as hstore or +dblink as they are already loadable by postgresql. This field is only +required to add extensions provided by other packages. @end deffn @deffn {Procédure Scheme} mysql-service [#:config (mysql-configuration)] @@ -14799,7 +15133,7 @@ Répertoire dans lequel stocker la base de données et les fichiers liés. @end deftp @node Services de courriels -@subsubsection Services de courriels +@subsection Services de courriels @cindex courriel @cindex email @@ -15790,7 +16124,7 @@ par défaut est @samp{#t}. @deftypevr {paramètre de @code{dovecot-configuration}} boolean mbox-very-dirty-syncs? Comme @samp{mbox-dirty-syncs}, mais ne synchronise pas complètement même avec les commandes SELECT, EXAMINE, EXPUNGE ou CHECK. Si l'option n'est pas -actifée, @samp{mbox-dirty-syncs} est ignorée. La valeur par défaut est +activée, @samp{mbox-dirty-syncs} est ignorée. La valeur par défaut est @samp{#f}. @end deftypevr @@ -16085,7 +16419,7 @@ Contournements pour divers bogues de certains client : @table @code @item delay-newmail -Envoie des notifications de nouveau message EXISTS/RECENT seulement en +Envoi des notifications de nouveau message EXISTS/RECENT seulement en réponse aux commandes NOOP et CHECK. Certains clients les ignorent autrement, par exemple OSX Mail (< v2.1). Outlook Express est encore plus cassé, sans cela il peut montrer des erreurs de type « Le message n'est plus @@ -16112,11 +16446,11 @@ autorise tous. La valeur par défaut est @samp{""}. @end deftypevr -Ouf ! Tant d'options de configuration. La bonne nouvelle, c'est que GuixSD -a une interface complète avec le langage de configuration de Dovecot. Cela -permet non seulement de déclarer la configuration de manière agréable, mais -aussi d'offrir des capacités de réflexion : les utilisateurs peuvent écrire -du code pour inspecter et transformer les configuration depuis Scheme. +Whew! Lots of configuration options. The nice thing about it though is that +Guix has a complete interface to Dovecot's configuration language. This +allows not only a nice way to declare configurations, but also offers +reflective capabilities as well: users can write code to inspect and +transform configurations from within Scheme. Cependant, vous pourriez avoir un fichier @code{dovecot.conf} déjà tout prêt. Dans ce cas, vous pouvez passer un objet @@ -16168,7 +16502,7 @@ Objet de paquet du serveur SMTP OpenSMTPD. Objet simili-fichier du fichier de configuration de OpenSMTPD à utiliser. Par défaut il écoute sur l'interface de boucle locale et accepte les courriels des utilisateurs et des démons de la machine locale, et autorise -l'envoie de courriels à des serveurs distants. Lancez @command{man +l'envoi de courriels à des serveurs distants. Lancez @command{man smtpd.conf} pour plus d'information. @end table @@ -16243,9 +16577,9 @@ système. Dans l'exemple au-dessus, il n'y a pas besoin d'une entrée @code{bob@@example.com} et @code{bob@@example2.com}). @node Services de messagerie -@subsubsection Services de messagerie +@subsection Services de messagerie -@cindex messagerie intantanée +@cindex messagerie instantanée @cindex jabber @cindex XMPP Le module @code{(gnu services messaging)} fournit des définitions de @@ -16514,10 +16848,9 @@ d'information sur l'utilisation du moteur hashed. Voir aussi @end deftypevr @deftypevr {paramètre de @code{prosody-configuration}} maybe-string log -Indique les options de journalisation. La configuration avancée des -journaux n'est pas encore supportée par le service Prosody dans GuixSD. -Voir @url{https://prosody.im/doc/logging}. La valeur par défaut est -@samp{"*syslog"}. +Set logging options. Advanced logging configuration is not yet supported by +the Guix Prosody Service. See @url{https://prosody.im/doc/logging}. +Defaults to @samp{"*syslog"}. @end deftypevr @deftypevr {paramètre de @code{prosody-configuration}} file-name pidfile @@ -16718,7 +17051,7 @@ C'est le type de service pour le démon de passerelle IRC @url{http://bitlbee.org,BitlBee}. Sa valeur est un @code{bitlbee-configuration} (voir plus bas). -Pour que BitlBee écoute sur le pourt 6667 sur localhost, ajoutez cette ligne +Pour que BitlBee écoute sur le port 6667 sur localhost, ajoutez cette ligne à vos services : @example @@ -16752,9 +17085,37 @@ BitlBee. @end table @end deftp - +@subsubheading Quassel Service + +@cindex IRC (Internet Relay Chat) +@url{https://quassel-irc.org/,Quassel} is a distributed IRC client, meaning +that one or more clients can attach to and detach from the central core. + +@defvr {Scheme Variable} quassel-service-type +This is the service type for the @url{https://quassel-irc.org/,Quassel} IRC +backend daemon. Its value is a @code{quassel-configuration} (see below). +@end defvr + +@deftp {Data Type} quassel-configuration +This is the configuration for Quassel, with the following fields: + +@table @asis +@item @code{quassel} (default: @code{quassel}) +The Quassel package to use. + +@item @code{interface} (default: @code{"::,0.0.0.0"}) +@item @code{port} (default: @code{4242}) +Listen on the network interface(s) corresponding to the IPv4 or IPv6 +interfaces specified in the comma delimited @var{interface}, on @var{port}. + +@item @code{loglevel} (default: @code{"Info"}) +The level of logging desired. Accepted values are Debug, Info, Warning and +Error. +@end table +@end deftp + @node Services de téléphonie -@subsubsection Services de téléphonie +@subsection Services de téléphonie @cindex Murmur (serveur VoIP) @cindex serveur VoIP @@ -16770,14 +17131,14 @@ configuration : (service murmur-service-type (murmur-configuration (welcome-text - "Welcome to this Mumble server running on GuixSD!") + "Welcome to this Mumble server running on Guix!") (cert-required? #t) ;disallow text password logins (ssl-cert "/etc/letsencrypt/live/mumble.example.com/fullchain.pem") (ssl-key "/etc/letsencrypt/live/mumble.example.com/privkey.pem"))) @end example Après avoir reconfiguré votre système, vous pouvez manuellement indiquer le -mot de passe @code{SuperUser} de murmur avac la commande qui s'affiche +mot de passe @code{SuperUser} de murmur avec la commande qui s'affiche pendant la phase d'activation. Il est recommandé d'enregistrer un compte utilisateur Mumble normal et de @@ -16978,7 +17339,7 @@ indiquée votre serveur sera listé par son nom d'hôte. @node Services de surveillance -@subsubsection Services de surveillance +@subsection Services de surveillance @subsubheading Service Tailon @@ -17068,105 +17429,424 @@ Configurez @code{debug?} à @code{#t} pour montrer les messages de débogage. à @code{#t} pour retourner à la ligne (par défaut) ou à @code{#f} pour ne pas retourner à la ligne au début. -@item @code{http-auth} (par défaut : @code{#f}) -Type d'authentification HTTP à utiliser. Indiquez @code{#f} pour désactiver -l'authentification (par défaut). Les valeur supportées sont @code{"digest"} -et @code{"basic"}. +@item @code{http-auth} (par défaut : @code{#f}) +Type d'authentification HTTP à utiliser. Indiquez @code{#f} pour désactiver +l'authentification (par défaut). Les valeur supportées sont @code{"digest"} +et @code{"basic"}. + +@item @code{users} (par défaut : @code{#f}) +Si l'authentification HTTP est activée (voir @code{http-auth}), l'accès sera +restreint aux identifiants fournis ici. Pour configurer des utilisateurs, +utilisez une liste de paires, où le premier élément de la paire est le nom +d'utilisateur et le second élément est le mot de passe. + +@example +(tailon-configuration-file + (http-auth "basic") + (users '(("user1" . "password1") + ("user2" . "password2")))) +@end example + +@end table +@end deftp + + +@subsubheading Service Darkstat +@cindex darkstat +Darkstat est un « renifleur de paquets » qui capture le trafic réseau, +calcul des statistiques sur l'utilisation et sert des rapport sur HTTP. + +@defvar {Variable Scheme} darkstat-service-type +C'est le type de service pour le service +@uref{https://unix4lyfe.org/darkstat/, darkstat}, sa valeur doit être un +enregistrement @code{darkstat-configuration} comme dans cet exemple : + +@example +(service darkstat-service-type + (darkstat-configuration + (interface "eno1"))) +@end example +@end defvar + +@deftp {Type de données} darkstat-configuration +Type de données représentant la configuration de @command{darkstat}. + +@table @asis +@item @code{package} (par défaut : @code{darkstat}) +Le paquet darkstat à utiliser. + +@item @code{interface} +Capture le trafic sur l'interface réseau spécifiée. + +@item @code{port} (par défaut : @code{"667"}) +Lie l'interface web sur le port spécifié. + +@item @code{bind-address} (par défaut : @code{"127.0.0.1"}) +Lie l'interface web sur l'adresse spécifiée. + +@item @code{base} (par défaut : @code{"/"}) +Spécifie le chemin de base des URL. C'est utile si on accède à +@command{darkstat} à travers un proxy inverse. + +@end table +@end deftp + +@subsubheading Service d'export de nœud de Prometheus + +@cindex prometheus-node-exporter +L'exportateur de nœuds de Prometheus rend disponible les statistiques sur le +matériel et le système d'exploitation fournies par le noyau Linux pour le +système de surveillance Prometheus. Ce service devrait être déployé sur +tous les nœuds physiques et les machines virtuelles, où vous voulez +surveiller ces statistiques. + +@defvar {Variable Scheme} prometheus-node-exporter-service-type +C'est le type de service pour le service +@uref{https://github.com/prometheus/node_exporter/, +prometheus-node-exporter}, sa valeur doit être un enregistrement +@code{prometheus-node-exporter-configuration} comme dans cet exemple : + +@example +(service prometheus-node-exporter-service-type + (prometheus-node-exporter-configuration + (web-listen-address ":9100"))) +@end example +@end defvar + +@deftp {Type de données} prometheus-node-exporter-configuration +Type de données représentant la configuration de @command{node_exporter} + +@table @asis +@item @code{package} (par défaut : @code{go-github-com-prometheus-node-exporter}) +Le paquet prometheus-node-exporter à utiliser. + +@item @code{web-listen-address} (par défaut : @code{":9100"}) +Lie l'interface web sur l'adresse spécifiée. + +@end table +@end deftp + +@subsubheading Zabbix server +@cindex zabbix zabbix-server +Zabbix provides monitoring metrics, among others network utilization, CPU +load and disk space consumption: + +@itemize +@item High performance, high capacity (able to monitor hundreds of thousands of devices). +@item Auto-discovery of servers and network devices and interfaces. +@item Low-level discovery, allows to automatically start monitoring new items, file systems or network interfaces among others. +@item Distributed monitoring with centralized web administration. +@item Native high performance agents. +@item SLA, and ITIL KPI metrics on reporting. +@item High-level (business) view of monitored resources through user-defined visual console screens and dashboards. +@item Remote command execution through Zabbix proxies. +@end itemize + +@c %start of fragment + +Available @code{zabbix-server-configuration} fields are: + +@deftypevr {@code{zabbix-server-configuration} parameter} package zabbix-server +The zabbix-server package. + +@end deftypevr + +@deftypevr {@code{zabbix-server-configuration} parameter} string user +User who will run the Zabbix server. + +Defaults to @samp{"zabbix"}. + +@end deftypevr + +@deftypevr {@code{zabbix-server-configuration} parameter} group group +Group who will run the Zabbix server. + +Defaults to @samp{"zabbix"}. + +@end deftypevr + +@deftypevr {@code{zabbix-server-configuration} parameter} string db-host +Database host name. + +Defaults to @samp{"127.0.0.1"}. + +@end deftypevr + +@deftypevr {@code{zabbix-server-configuration} parameter} string db-name +Database name. + +Defaults to @samp{"zabbix"}. + +@end deftypevr + +@deftypevr {@code{zabbix-server-configuration} parameter} string db-user +Database user. + +Defaults to @samp{"zabbix"}. + +@end deftypevr + +@deftypevr {@code{zabbix-server-configuration} parameter} string db-password +Database password. Please, use @code{include-files} with +@code{DBPassword=SECRET} inside a specified file instead. + +La valeur par défaut est @samp{""}. + +@end deftypevr + +@deftypevr {@code{zabbix-server-configuration} parameter} number db-port +Database port. + +Defaults to @samp{5432}. + +@end deftypevr + +@deftypevr {@code{zabbix-server-configuration} parameter} string log-type +Specifies where log messages are written to: + +@itemize @bullet +@item +@code{system} - syslog. + +@item +@code{file} - file specified with @code{log-file} parameter. + +@item +@code{console} - standard output. + +@end itemize + +La valeur par défaut est @samp{""}. + +@end deftypevr + +@deftypevr {@code{zabbix-server-configuration} parameter} string log-file +Log file name for @code{log-type} @code{file} parameter. + +Defaults to @samp{"/var/log/zabbix/server.log"}. + +@end deftypevr + +@deftypevr {@code{zabbix-server-configuration} parameter} string pid-file +Name of PID file. + +Defaults to @samp{"/var/run/zabbix/zabbix_server.pid"}. + +@end deftypevr + +@deftypevr {@code{zabbix-server-configuration} parameter} string ssl-ca-location +The location of certificate authority (CA) files for SSL server certificate +verification. + +Defaults to @samp{"/etc/ssl/certs/ca-certificates.crt"}. + +@end deftypevr + +@deftypevr {@code{zabbix-server-configuration} parameter} string ssl-cert-location +Location of SSL client certificates. + +Defaults to @samp{"/etc/ssl/certs"}. + +@end deftypevr + +@deftypevr {@code{zabbix-server-configuration} parameter} string extra-options +Extra options will be appended to Zabbix server configuration file. + +La valeur par défaut est @samp{""}. + +@end deftypevr + +@deftypevr {@code{zabbix-server-configuration} parameter} include-files include-files +You may include individual files or all files in a directory in the +configuration file. + +La valeur par défaut est @samp{()}. + +@end deftypevr + +@c %end of fragment + +@subsubheading Zabbix agent +@cindex zabbix zabbix-agent + +Zabbix agent gathers information for Zabbix server. + +@c %start of fragment + +Available @code{zabbix-agent-configuration} fields are: + +@deftypevr {@code{zabbix-agent-configuration} parameter} package zabbix-agent +The zabbix-agent package. + +@end deftypevr + +@deftypevr {@code{zabbix-agent-configuration} parameter} string user +User who will run the Zabbix agent. + +Defaults to @samp{"zabbix"}. + +@end deftypevr + +@deftypevr {@code{zabbix-agent-configuration} parameter} group group +Group who will run the Zabbix agent. + +Defaults to @samp{"zabbix"}. + +@end deftypevr + +@deftypevr {@code{zabbix-agent-configuration} parameter} string hostname +Unique, case sensitive hostname which is required for active checks and must +match hostname as configured on the server. + +Defaults to @samp{"Zabbix server"}. + +@end deftypevr + +@deftypevr {@code{zabbix-agent-configuration} parameter} string log-type +Specifies where log messages are written to: + +@itemize @bullet +@item +@code{system} - syslog. + +@item +@code{file} - file specified with @code{log-file} parameter. + +@item +@code{console} - standard output. + +@end itemize + +La valeur par défaut est @samp{""}. + +@end deftypevr + +@deftypevr {@code{zabbix-agent-configuration} parameter} string log-file +Log file name for @code{log-type} @code{file} parameter. + +Defaults to @samp{"/var/log/zabbix/agent.log"}. + +@end deftypevr + +@deftypevr {@code{zabbix-agent-configuration} parameter} string pid-file +Name of PID file. + +Defaults to @samp{"/var/run/zabbix/zabbix_agent.pid"}. + +@end deftypevr + +@deftypevr {@code{zabbix-agent-configuration} parameter} list server +List of IP addresses, optionally in CIDR notation, or hostnames of Zabbix +servers and Zabbix proxies. Incoming connections will be accepted only from +the hosts listed here. + +Defaults to @samp{("127.0.0.1")}. + +@end deftypevr + +@deftypevr {@code{zabbix-agent-configuration} parameter} list server-active +List of IP:port (or hostname:port) pairs of Zabbix servers and Zabbix +proxies for active checks. If port is not specified, default port is used. +If this parameter is not specified, active checks are disabled. + +Defaults to @samp{("127.0.0.1")}. + +@end deftypevr + +@deftypevr {@code{zabbix-agent-configuration} parameter} string extra-options +Extra options will be appended to Zabbix server configuration file. + +La valeur par défaut est @samp{""}. + +@end deftypevr + +@deftypevr {@code{zabbix-agent-configuration} parameter} include-files include-files +You may include individual files or all files in a directory in the +configuration file. + +La valeur par défaut est @samp{()}. + +@end deftypevr + +@c %end of fragment + +@subsubheading Zabbix front-end +@cindex zabbix zabbix-front-end + +This service provides a WEB interface to Zabbix server. + +@c %start of fragment + +Available @code{zabbix-front-end-configuration} fields are: + +@deftypevr {@code{zabbix-front-end-configuration} parameter} nginx-server-configuration-list nginx +Configuration Nginx. + +@end deftypevr + +@deftypevr {@code{zabbix-front-end-configuration} parameter} string db-host +Database host name. + +La valeur par défaut est @samp{"localhost"}. + +@end deftypevr + +@deftypevr {@code{zabbix-front-end-configuration} parameter} number db-port +Database port. -@item @code{users} (par défaut : @code{#f}) -Si l'authentification HTTP est activée (voir @code{http-auth}), l'accès sera -restreint aux identifiants fournis ici. Pour configurer des utilisateurs, -utilisez une liste de paires, où le premier élément de la paire est le nom -d'utilisateur et le second élément est le mot de passe. +Defaults to @samp{5432}. -@example -(tailon-configuration-file - (http-auth "basic") - (users '(("user1" . "password1") - ("user2" . "password2")))) -@end example +@end deftypevr -@end table -@end deftp +@deftypevr {@code{zabbix-front-end-configuration} parameter} string db-name +Database name. +Defaults to @samp{"zabbix"}. -@subsubheading Service Darkstat -@cindex darkstat -Darkstat est un « renifleur de paquets » qui capture le trafic réseau, -calcul des statistiques sur l'utilisation et sert des rapport sur HTTP. +@end deftypevr -@defvar {Variable Scheme} darkstat-service-type -C'est le type de service pour le service -@uref{https://unix4lyfe.org/darkstat/, darkstat}, sa valeur doit être un -enregistrement @code{darkstat-configuration} comme dans cet exemple : +@deftypevr {@code{zabbix-front-end-configuration} parameter} string db-user +Database user. -@example -(service darkstat-service-type - (darkstat-configuration - (interface "eno1"))) -@end example -@end defvar +Defaults to @samp{"zabbix"}. -@deftp {Type de données} darkstat-configuration -Type de données représentant la configuration de @command{darkstat}. +@end deftypevr -@table @asis -@item @code{package} (par défaut : @code{darkstat}) -Le paquet darkstat à utiliser. +@deftypevr {@code{zabbix-front-end-configuration} parameter} string db-password +Database password. Please, use @code{db-secret-file} instead. -@item @code{interface} -Capture le trafic sur l'interface réseau spécifiée. +La valeur par défaut est @samp{""}. -@item @code{port} (par défaut : @code{"667"}) -Lie l'interface web sur le port spécifié. +@end deftypevr -@item @code{bind-address} (par défaut : @code{"127.0.0.1"}) -Lie l'interface web sur l'adresse spécifiée. +@deftypevr {@code{zabbix-front-end-configuration} parameter} string db-secret-file +Secret file which will be appended to @file{zabbix.conf.php} file. This +file contains credentials for use by Zabbix front-end. You are expected to +create it manually. -@item @code{base} (par défaut : @code{"/"}) -Spécifie le chemin de base des URL. C'est utile si on accède à -@command{darkstat} à travers un proxy inverse. +La valeur par défaut est @samp{""}. -@end table -@end deftp +@end deftypevr -@subsubheading Service d'export de nœud de Prometheus +@deftypevr {@code{zabbix-front-end-configuration} parameter} string zabbix-host +Zabbix server hostname. -@cindex prometheus-node-exporter -L'exportateur de nœuds de Prometheus rend disponible les statistiques sur le -matériel et le système d'exploitation fournies par le noyau Linux pour le -système de surveillance Prometheus. Ce service devrait être déployé sur -tous les nœuds physiques et les machines virtuelles, où vous voulez -surveiller ces statistiques. +La valeur par défaut est @samp{"localhost"}. -@defvar {Variable Scheme} prometheus-node-exporter-service-type -C'est le type de service pour le service -@uref{https://github.com/prometheus/node_exporter/, -prometheus-node-exporter}, sa valeur doit être un enregistrement -@code{prometheus-node-exporter-configuration} comme dans cet exemple : +@end deftypevr -@example -(service prometheus-node-exporter-service-type - (prometheus-node-exporter-configuration - (web-listen-address ":9100"))) -@end example -@end defvar +@deftypevr {@code{zabbix-front-end-configuration} parameter} number zabbix-port +Zabbix server port. -@deftp {Type de données} prometheus-node-exporter-configuration -Type de données représentant la configuration de @command{node_exporter} +Defaults to @samp{10051}. -@table @asis -@item @code{package} (par défaut : @code{go-github-com-prometheus-node-exporter}) -Le paquet prometheus-node-exporter à utiliser. +@end deftypevr -@item @code{web-listen-address} (par défaut : @code{":9100"}) -Lie l'interface web sur l'adresse spécifiée. -@end table -@end deftp +@c %end of fragment @node Services Kerberos -@subsubsection Services Kerberos +@subsection Services Kerberos @cindex Kerberos Le module @code{(gnu services kerberos)} fournit des services liés au @@ -17291,7 +17971,7 @@ devraient être tentées. Les comptes locaux avec une valeur plus petite @node Services web -@subsubsection Services web +@subsection Services web @cindex web @cindex www @@ -17518,7 +18198,7 @@ configuration, donc il utilise les fichiers par défaut pour les messages d'erreur. S'il échoue à charger sa configuration, c'est là où les messages seront enregistrés. Après la lecture du fichier de configuration, le fichier de journal d'erreur par défaut change en fonction de celle-ci. Dans -notre cas, les messages d'erreur au démarage se trouvent dans +notre cas, les messages d'erreur au démarrage se trouvent dans @file{/var/run/nginx/logs/error.log} et après la configuration dans @file{/var/log/nginx/error.log}. Ce second emplacement peut être modifié avec l'option de configuration @var{log-directory}. @@ -17699,7 +18379,7 @@ URI qui correspond à ce bloc. @anchor{nginx-location-configuration body} @item @code{body} Corps du block location, spécifié comme une liste de chaînes de caractères. -Cela peut contenir de nombreuses directives de configuration. PAr exemple, +Cela peut contenir de nombreuses directives de configuration. Par exemple, pour passer des requêtes à un groupe de serveurs amont définis dans un bloc @code{nginx-upstream-configuration}, la directive suivante peut être spécifiée dans le corps : @samp{(list "proxy_pass http://upstream-name;")}. @@ -17810,7 +18490,7 @@ Arguments supplémentaires à passer au processus @command{varnishd}. @cindex fastcgi @cindex fcgiwrap FastCGI est une interface entre le frontal et le moteur d'un service web. -C'est un dispositif quelque peu désué ; les nouveaux services devraient +C'est un dispositif quelque peu désuet ; les nouveaux services devraient généralement juste parler HTTP entre le frontal et le moteur. Cependant il y a un certain nombre de services de moteurs comme PHP ou l'accès aux dépôts Git optimisé en HTTP qui utilisent FastCGI, donc nous le supportons dans @@ -17828,8 +18508,8 @@ Un type de service pour le mandataire FastCGI @code{fcgiwrap}. @end defvr @deftp {Type de données} fcgiwrap-configuration -Type de données représentant la configuration d'un service @code{fcgiwrap}. -Ce type a les paramètres suivants : +Data type representing the configuration of the @code{fcgiwrap} service. +This type has the following parameters: @table @asis @item @code{package} (par défaut : @code{fcgiwrap}) Le paquet fcgiwrap à utiliser. @@ -17892,7 +18572,7 @@ Type de données pour la configuration du service php-fpm. @item @code{php} (par défaut : @code{php}) Le paquet php à utiliser. @item @code{socket} (par défaut : @code{(string-append "/var/run/php" (version-major (package-version php)) "-fpm.sock")}) -L'adresse sur laquelle accepter les requêts FastCGI. Les syntaxes valides +L'adresse sur laquelle accepter les requêtes FastCGI. Les syntaxes valides sont : @table @asis @item @code{"ip.add.re.ss:port"} @@ -17930,6 +18610,8 @@ clients et affichés dans leur navigateur. Cela est utile pour un développement php local, mais un risque pour la sécurité pour les sites publics, comme les messages d'erreur peuvent révéler des mots de passes et des données personnelles. +@item @code{timezone} (default @code{#f}) +Specifies @code{php_admin_value[date.timezone]} parameter. @item @code{workers-logfile} (par défaut : @code{(string-append "/var/log/php" (version-major (package-version php)) "-fpm.www.log")}) Ce fichier enregistrera la sortie @code{stderr} des processus de travail de php. On peut indiquer @code{#f} pour désactiver la journalisation. @@ -17999,7 +18681,7 @@ Une configuration simple de services pour php ressemble à ceci : (root "/srv/http/") (locations (list (nginx-php-location))) - (https-port #f) + (listen '("80")) (ssl-certificate #f) (ssl-certificate-key #f))) %base-services)) @@ -18011,7 +18693,7 @@ l'utilisation de php-fpm dans @code{Nginx}. Il permet de générer des avatars de chats à partir d'une graine, par exemple le hash de l'adresse de courriel d'un utilisateur. -@deffn {Procédure Scheme} cat-avatar-generator-serice @ +@deffn {Scheme Procedure} cat-avatar-generator-service @ [#:cache-dir "/var/cache/cat-avatar-generator"] @ [#:package cat-avatar-generator] @ [#:configuration (nginx-server-configuration)] @@ -18111,7 +18793,7 @@ certificats dans le champ @code{packages} de votre configuration. @end quotation @node Services de certificats -@subsubsection Services de certificats +@subsection Services de certificats @cindex Web @cindex HTTP, HTTPS @@ -18202,13 +18884,14 @@ de problème et des notifications importantes sur le compte. Taille de la clef RSA. @item @code{default-location} (par défaut : @i{voir plus bas}) -Le @code{nginx-location-configuration} par défaut. Come @code{certbot} doit -pouvoir servir les défis et les réponses, il doit être capable de lancer un -serveur web. Cela se fait en étendant le service web @code{nginx} avec un -@code{nginx-server-configuration} qui écoute sur les @var{domains} sur le -port 80 et qui a un @code{nginx-location-configuration} pour le chemin -@code{/.well-known/} utilisé par Let's Encrypt. @xref{Services web} pour -plus d'information sur les types de données de la configuration de nginx. +Le @code{nginx-location-configuration} par défaut. Comme @code{certbot} +doit pouvoir servir les défis et les réponses, il doit être capable de +lancer un serveur web. Cela se fait en étendant le service web @code{nginx} +avec un @code{nginx-server-configuration} qui écoute sur les @var{domains} +sur le port 80 et qui a un @code{nginx-location-configuration} pour le +chemin @code{/.well-known/} utilisé par Let's Encrypt. @xref{Services web} +pour plus d'information sur les types de données de la configuration de +nginx. Les requêtes vers d'autres URL correspondra à @code{default-location}, qui, s'il est présent, sera ajout é à tous les @code{nginx-server-configuration}. @@ -18254,7 +18937,7 @@ Pour chaque @code{certificate-configuration}, le certificat est sauvegardé dans @code{/etc/letsencrypt/live/@var{name}/fullchain.pem} et la clef est sauvegardée dans @code{/etc/letsencrypt/live/@var{name}/privkey.pem}. @node Services DNS -@subsubsection Services DNS +@subsection Services DNS @cindex DNS (domain name system) @cindex domain name system (DNS) @@ -18657,7 +19340,7 @@ Une politique entre @code{'increment} et @code{'unixtime}. @end deftp @deftp {Type de données} knot-configuration -Type de donées représentant la configuration de Knot. Ce type a les +Type de données représentant la configuration de Knot. Ce type a les paramètres suivants : @table @asis @@ -18749,7 +19432,7 @@ Lorsque la valeur est fausse, désactive le cache des réponses négatives. @subsubheading Service ddclient @cindex ddclient -Le srevice ddclient décrit plus bas lance le démon ddclient, qui prend en +Le service ddclient décrit plus bas lance le démon ddclient, qui prend en charge la mise à jour automatique des entrées DNS pour les fournisseurs de service comme @uref{https://dyn.com/dns/, Dyn}. @@ -18857,7 +19540,7 @@ La valeur par défaut est @samp{()}. @node Services VPN -@subsubsection Services VPN +@subsection Services VPN @cindex VPN (réseau privé virtuel) @cindex réseau privé virtuel (VPN) @@ -19167,7 +19850,7 @@ La valeur par défaut est @samp{#f}. Fait que des messages de ping sont envoyés régulièrement dans les deux sens pour que chaque côté sache quand l'autre n'est plus disponible. @code{keepalive} a besoin d'une paire. Le premier élément est la période -d'envoie du ping, et le second élément est le délai d'attente avant de +d'envoi du ping, et le second élément est le délai d'attente avant de considéré que l'autre côté n'est plus disponible. @end deftypevr @@ -19222,7 +19905,7 @@ La valeur par défaut est @samp{#f}. @node Système de fichiers en réseau -@subsubsection Système de fichiers en réseau +@subsection Système de fichiers en réseau @cindex NFS Le module @code{(gnu services nfs)} fournit les services suivants, qui sont @@ -19338,7 +20021,7 @@ domaine pleinement qualifié de l'hôte. @end deftp @node Intégration continue -@subsubsection Intégration continue +@subsection Intégration continue @cindex intégration continue @uref{https://git.savannah.gnu.org/cgit/guix/guix-cuirass.git, Cuirass} est @@ -19458,7 +20141,7 @@ Le paquet Cuirass à utiliser. @end deftp @node Services de gestion de l'énergie -@subsubsection Services de gestion de l'énergie +@subsection Services de gestion de l'énergie @cindex tlp @cindex gestion de l'énergie avec TLP @@ -20003,7 +20686,7 @@ Objet du paquet de thermald. @end deftp @node Services audio -@subsubsection Services audio +@subsection Services audio Le module @code{(gnu services audio)} fournit un service qui lance MPD (le démon de lecture de musique). @@ -20054,7 +20737,7 @@ chemin absolu peut être spécifié ici. @end deftp @node Services de virtualisation -@subsubsection services de virtualisation +@subsection services de virtualisation Le module @code{(gnu services virtualization)} fournit des services pour les démons libvirt et virtlog, ainsi que d'autres services liés à la @@ -20377,61 +21060,62 @@ La valeur par défaut est @samp{20}. @end deftypevr @deftypevr {paramètre de @code{libvirt-configuration}} integer max-client-requests -Limit on concurrent requests from a single client connection. To avoid one -client monopolizing the server this should be a small fraction of the global -max_requests and max_workers parameter. +Limite de requêtes concurrentes depuis une connexion cliente unique. Pour +éviter qu'un client ne monopolise le serveur, vous devriez indiquer une +petite partie des paramètres global max_requests et max_workers. La valeur par défaut est @samp{5}. @end deftypevr @deftypevr {paramètre de @code{libvirt-configuration}} integer admin-min-workers -Same as @code{min-workers} but for the admin interface. +Comme @code{min-workers} mais pour l'interface d'administration. La valeur par défaut est @samp{1}. @end deftypevr @deftypevr {paramètre de @code{libvirt-configuration}} integer admin-max-workers -Same as @code{max-workers} but for the admin interface. +Comme @code{max-workers} mais pour l'interface d'administration. La valeur par défaut est @samp{5}. @end deftypevr @deftypevr {paramètre de @code{libvirt-configuration}} integer admin-max-clients -Same as @code{max-clients} but for the admin interface. +Comme @code{max-clients} mais pour l'interface d'administration. La valeur par défaut est @samp{5}. @end deftypevr @deftypevr {paramètre de @code{libvirt-configuration}} integer admin-max-queued-clients -Same as @code{max-queued-clients} but for the admin interface. +Comme @code{max-queued-clients} mais pour l'interface d'administration. La valeur par défaut est @samp{5}. @end deftypevr @deftypevr {paramètre de @code{libvirt-configuration}} integer admin-max-client-requests -Same as @code{max-client-requests} but for the admin interface. +Comme @code{max-client-requests} mais pour l'interface d'administration. La valeur par défaut est @samp{5}. @end deftypevr @deftypevr {paramètre de @code{libvirt-configuration}} integer log-level -Logging level. 4 errors, 3 warnings, 2 information, 1 debug. +Niveau de journalisation. 4 : erreurs, 3 : avertissements, 2 : information, +1 : débogage. La valeur par défaut est @samp{3}. @end deftypevr @deftypevr {paramètre de @code{libvirt-configuration}} string log-filters -Logging filters. +Filtres de journalisation. -A filter allows to select a different logging level for a given category of -logs The format for a filter is one of: +Un filtre qui permet de sélectionner plusieurs niveaux de journalisation +pour une catégorie donnée. Le format d'un filtre est : @itemize @bullet @item @@ -20442,92 +21126,95 @@ x:+nom @end itemize -where @code{name} is a string which is matched against the category given in -the @code{VIR_LOG_INIT()} at the top of each libvirt source file, e.g., -"remote", "qemu", or "util.json" (the name in the filter can be a substring -of the full category name, in order to match multiple similar categories), -the optional "+" prefix tells libvirt to log stack trace for each message -matching name, and @code{x} is the minimal level where matching messages -should be logged: +où @code{nom} est une chaîne de caractères qui correspond à la catégorie +donnée dans @code{VIR_LOG_INIT()} au début de chaque fichier source de +libvirt, p.@: ex.@: « remote », « qemu » ou « util.json » (le nom dans le +filtre peut être une sous-chaîne du nom complet de la catégorie, pour +pouvoir correspondre à plusieurs catégories similaires), le préfixe +facultatif « + » dit à libvirt d'enregistrer les traces de piles pour chaque +message qui correspond au nom, et @code{x} est le niveau minimal des +messages qui devraient être enregistrés : @itemize @bullet @item -1: DEBUG +1 : DEBUG @item -2: INFO +2 : INFO @item -3: WARNING +3 : WARNING @item -4: ERROR +4 : ERROR @end itemize -Multiple filters can be defined in a single filters statement, they just -need to be separated by spaces. +On peut définir plusieurs filtres dans une seule déclaration de filtres, ils +doivent juste être séparés par des espaces. La valeur par défaut est @samp{"3:remote 4:event"}. @end deftypevr @deftypevr {paramètre de @code{libvirt-configuration}} string log-outputs -Logging outputs. +Sorties de débogage. -An output is one of the places to save logging information The format for an -output can be: +Une sortie est l'un des endroits où les journaux sont enregistrés. Le +format d'une sortie peut être : @table @code @item x:stderr -output goes to stderr +la sortie va vers stderr -@item x:syslog:name -use syslog for the output and use the given name as the ident +@item x:syslog:nom +utilise syslog comme sortie et utilise le nom donné comme identifiant -@item x:file:file_path -output to a file, with the given filepath +@item x:file:chemin_fichier +la sortie va vers un fichier, avec le chemin donné @item x:journald -output to journald logging system +la sortie va vers le système de journalisation journald @end table -In all case the x prefix is the minimal level, acting as a filter +Dans tous les cas, le préfixe x est le niveau minimal, qui agit comme un +filtre @itemize @bullet @item -1: DEBUG +1 : DEBUG @item -2: INFO +2 : INFO @item -3: WARNING +3 : WARNING @item -4: ERROR +4 : ERROR @end itemize -Multiple outputs can be defined, they just need to be separated by spaces. +Plusieurs sorties peuvent être définies, elles doivent juste être séparées +par des espaces. La valeur par défaut est @samp{"3:stderr"}. @end deftypevr @deftypevr {paramètre de @code{libvirt-configuration}} integer audit-level -Allows usage of the auditing subsystem to be altered +Permet de modifier l'utilisation du sous-système d'audit. @itemize @bullet @item -0: disable all auditing +0 : désactive tout audit @item -1: enable auditing, only if enabled on host +1 : active l'audit, seulement s'il est activé sur l'hôte @item -2: enable auditing, and exit if disabled on host. +2 : active l'audit, et quitte s'il est désactivé sur l'hôte. @end itemize @@ -20536,83 +21223,84 @@ La valeur par défaut est @samp{1}. @end deftypevr @deftypevr {paramètre de @code{libvirt-configuration}} boolean audit-logging -Send audit messages via libvirt logging infrastructure. +Envoie les messages d'audit via l'infrastructure de journalisation de +libvirt La valeur par défaut est @samp{#f}. @end deftypevr @deftypevr {paramètre de @code{libvirt-configuration}} optional-string host-uuid -Host UUID. UUID must not have all digits be the same. +UUID de l'hôte. L'UUID ne doit pas avoir tous ses nombres identiques. La valeur par défaut est @samp{""}. @end deftypevr @deftypevr {paramètre de @code{libvirt-configuration}} string host-uuid-source -Source to read host UUID. +Source où lire l'UUID de l'hôte. @itemize @bullet @item -@code{smbios}: fetch the UUID from @code{dmidecode -s system-uuid} +@code{smbios} : récupère l'UUID à partir de @code{dmidecode -s system-uuid} @item -@code{machine-id}: fetch the UUID from @code{/etc/machine-id} +@code{machine-id} : récupère l'UUID à partir de @code{/etc/machine-id} @end itemize -If @code{dmidecode} does not provide a valid UUID a temporary UUID will be -generated. +Si @code{dmidecode} ne fournit pas un UUID valide, un UUID temporaire sera +généré. La valeur par défaut est @samp{"smbios"}. @end deftypevr @deftypevr {paramètre de @code{libvirt-configuration}} integer keepalive-interval -A keepalive message is sent to a client after @code{keepalive_interval} -seconds of inactivity to check if the client is still responding. If set to --1, libvirtd will never send keepalive requests; however clients can still -send them and the daemon will send responses. +Un message keepalive est envoyé au client après @code{keepalive_interval} +secondes d'inactivité pour vérifier si le client répond toujours. Si la +valeur est -1, libvirtd n'enverra jamais de requête keepalive ; cependant +les clients peuvent toujours en envoyer et le démon y répondra. La valeur par défaut est @samp{5}. @end deftypevr @deftypevr {paramètre de @code{libvirt-configuration}} integer keepalive-count -Maximum number of keepalive messages that are allowed to be sent to the -client without getting any response before the connection is considered -broken. +Nombre maximum de messages keepalive qui peuvent être envoyés au client sans +réponse avant que la connexion ne soit considérée comme cassée. -In other words, the connection is automatically closed approximately after -@code{keepalive_interval * (keepalive_count + 1)} seconds since the last -message received from the client. When @code{keepalive-count} is set to 0, -connections will be automatically closed after @code{keepalive-interval} -seconds of inactivity without sending any keepalive messages. +En d'autres termes, la connexion est approximativement fermée après +@code{keepalive_interval * (keepalive_count + 1)} secondes après le dernier +message reçu de la part du client. Lorsque @code{keepalive-count} est à 0, +les connexions seront automatiquement fermées après +@code{keepalive-interval} secondes d'inactivité sans envoyer le moindre +message keepalive. La valeur par défaut est @samp{5}. @end deftypevr @deftypevr {paramètre de @code{libvirt-configuration}} integer admin-keepalive-interval -Same as above but for admin interface. +Comme précédemment, mais pour l'interface d'administration. La valeur par défaut est @samp{5}. @end deftypevr @deftypevr {paramètre de @code{libvirt-configuration}} integer admin-keepalive-count -Same as above but for admin interface. +Comme précédemment, mais pour l'interface d'administration. La valeur par défaut est @samp{5}. @end deftypevr @deftypevr {paramètre de @code{libvirt-configuration}} integer ovs-timeout -Timeout for Open vSwitch calls. +Délai d'attente pour les appels Open vSwitch. -The @code{ovs-vsctl} utility is used for the configuration and its timeout -option is set by default to 5 seconds to avoid potential infinite waits -blocking libvirt. +L'utilitaire @code{ovs-vsctl} est utilisé pour la configuration et son +option de délai d'attente est à 5 secondes pour éviter qu'une attente +infinie ne bloque libvirt. La valeur par défaut est @samp{5}. @@ -20621,18 +21309,18 @@ La valeur par défaut est @samp{5}. @c %end of autogenerated docs @subsubheading démon Virrlog -The virtlogd service is a server side daemon component of libvirt that is -used to manage logs from virtual machine consoles. +Le service virtlogd est un démon côté serveur qui fait partie de libvirt, +utilisé pour gérer les journaux des consoles des machines virtuelles. -This daemon is not used directly by libvirt client applications, rather it -is called on their behalf by @code{libvirtd}. By maintaining the logs in a -standalone daemon, the main @code{libvirtd} daemon can be restarted without -risk of losing logs. The @code{virtlogd} daemon has the ability to re-exec() -itself upon receiving @code{SIGUSR1}, to allow live upgrades without -downtime. +Ce démon n'est pas utilisé directement par les clients libvirt, mais il est +appelé pour eux par @code{libvirtd}. En maintenant les journaux dans un +démon séparé, le démon @code{libvirtd} principal peut être redémarré sans +risque de perte de journaux. Le démon @code{virtlogd} a la possibilité de +ré-exécuter exec() sur lui-même quand il reçoit @code{SIGUSR1}, pour +permettre des mises à jour à chaux sans temps mort. @deffn {Variable Scheme} virtlog-service-type -This is the type of the virtlog daemon. Its value must be a +Le type de service pour le démon virtlogd. Sa valeur doit être un @code{virtlog-configuration}. @example @@ -20643,17 +21331,18 @@ This is the type of the virtlog daemon. Its value must be a @end deffn @deftypevr {paramètre de @code{virtlog-configuration}} integer log-level -Logging level. 4 errors, 3 warnings, 2 information, 1 debug. +Niveau de journalisation. 4 : erreurs, 3 : avertissements, 2 : information, +1 : débogage. La valeur par défaut est @samp{3}. @end deftypevr @deftypevr {paramètre de @code{virtlog-configuration}} string log-filters -Logging filters. +Filtres de journalisation. -A filter allows to select a different logging level for a given category of -logs The format for a filter is one of: +Un filtre qui permet de sélectionner plusieurs niveaux de journalisation +pour une catégorie donnée. Le format d'un filtre est : @itemize @bullet @item @@ -20664,75 +21353,78 @@ x:+nom @end itemize -where @code{name} is a string which is matched against the category given in -the @code{VIR_LOG_INIT()} at the top of each libvirt source file, e.g., -"remote", "qemu", or "util.json" (the name in the filter can be a substring -of the full category name, in order to match multiple similar categories), -the optional "+" prefix tells libvirt to log stack trace for each message -matching name, and @code{x} is the minimal level where matching messages -should be logged: +où @code{nom} est une chaîne de caractères qui correspond à la catégorie +donnée dans @code{VIR_LOG_INIT()} au début de chaque fichier source de +libvirt, p.@: ex.@: « remote », « qemu » ou « util.json » (le nom dans le +filtre peut être une sous-chaîne du nom complet de la catégorie, pour +pouvoir correspondre à plusieurs catégories similaires), le préfixe +facultatif « + » dit à libvirt d'enregistrer les traces de piles pour chaque +message qui correspond au nom, et @code{x} est le niveau minimal des +messages qui devraient être enregistrés : @itemize @bullet @item -1: DEBUG +1 : DEBUG @item -2: INFO +2 : INFO @item -3: WARNING +3 : WARNING @item -4: ERROR +4 : ERROR @end itemize -Multiple filters can be defined in a single filters statement, they just -need to be separated by spaces. +On peut définir plusieurs filtres dans une seule déclaration de filtres, ils +doivent juste être séparés par des espaces. La valeur par défaut est @samp{"3:remote 4:event"}. @end deftypevr @deftypevr {paramètre de @code{virtlog-configuration}} string log-outputs -Logging outputs. +Sorties de débogage. -An output is one of the places to save logging information The format for an -output can be: +Une sortie est l'un des endroits où les journaux sont enregistrés. Le +format d'une sortie peut être : @table @code @item x:stderr -output goes to stderr +la sortie va vers stderr -@item x:syslog:name -use syslog for the output and use the given name as the ident +@item x:syslog:nom +utilise syslog comme sortie et utilise le nom donné comme identifiant -@item x:file:file_path -output to a file, with the given filepath +@item x:file:chemin_fichier +la sortie va vers un fichier, avec le chemin donné @item x:journald -output to journald logging system +la sortie va vers le système de journalisation journald @end table -In all case the x prefix is the minimal level, acting as a filter +Dans tous les cas, le préfixe x est le niveau minimal, qui agit comme un +filtre @itemize @bullet @item -1: DEBUG +1 : DEBUG @item -2: INFO +2 : INFO @item -3: WARNING +3 : WARNING @item -4: ERROR +4 : ERROR @end itemize -Multiple outputs can be defined, they just need to be separated by spaces. +Plusieurs sorties peuvent être définies, elles doivent juste être séparées +par des espaces. La valeur par défaut est @samp{"3:stderr"}. @@ -20746,14 +21438,14 @@ La valeur par défaut est @samp{1024}. @end deftypevr @deftypevr {paramètre de @code{virtlog-configuration}} integer max-size -Maximum file size before rolling over. +Taille de fichier maximale avant roulement. La valeur par défaut est @samp{2MB}. @end deftypevr @deftypevr {paramètre de @code{virtlog-configuration}} integer max-backups -Maximum number of backup files to keep. +Nombre maximal de fichiers de sauvegardes à garder. La valeur par défaut est @samp{3}. @@ -20763,16 +21455,17 @@ La valeur par défaut est @samp{3}. @cindex émulation @cindex @code{binfmt_misc} -@code{qemu-binfmt-service-type} provides support for transparent emulation -of program binaries built for different architectures---e.g., it allows you -to transparently execute an ARMv7 program on an x86_64 machine. It achieves -this by combining the @uref{https://www.qemu.org, QEMU} emulator and the -@code{binfmt_misc} feature of the kernel Linux. +@code{qemu-binfmt-service-type} fournit le support de l'émulation +transparente de binaires construits pour des architectures différentes — +p.@: ex.@: il permet d'exécuter de manière transparente des programmes ARMv +sur une machine x86_64. Cela se fait en combinant l'émulateur +@uref{https://www.qemu.org, QEMU} et la fonctionnalité @code{binfmt_misc} du +noyau Linux. @defvr {Variable Scheme} qemu-binfmt-service-type -This is the type of the QEMU/binfmt service for transparent emulation. Its -value must be a @code{qemu-binfmt-configuration} object, which specifies the -QEMU package to use as well as the architecture we want to emulated: +Le type du service QEMU/binfmt pour l'émulation transparente. Sa valeur +doit être un objet @code{qemu-binfmt-configuration}, qui spécifie le paquet +QEMU à utiliser ainsi que l'architecture que vous voulez émuler : @example (service qemu-binfmt-service-type @@ -20780,29 +21473,30 @@ QEMU package to use as well as the architecture we want to emulated: (platforms (lookup-qemu-platforms "arm" "aarch64" "ppc")))) @end example -In this example, we enable transparent emulation for the ARM and aarch64 -platforms. Running @code{herd stop qemu-binfmt} turns it off, and running -@code{herd start qemu-binfmt} turns it back on (@pxref{Invoking herd, the +Dans cet exemple, on active l'émulation transparente pour les plateformes +ARM et aarch64. Lancer @code{herd stop qemu-binfmt} l'éteint et lancer +@code{herd start qemu-binfmt} le rallume (@pxref{Invoking herd, the @command{herd} command,, shepherd, The GNU Shepherd Manual}). @end defvr @deftp {Type de données} qemu-binfmt-configuration -This is the configuration for the @code{qemu-binfmt} service. +La configuration du service @code{qemu-binfmt}. @table @asis @item @code{platforms} (par défaut : @code{'()}) -The list of emulated QEMU platforms. Each item must be a @dfn{platform -object} as returned by @code{lookup-qemu-platforms} (see below). +La liste des plates-formes émulées par QEMU. Chaque élément doit être un +objet @dfn{platform object} tel que renvoyé par @code{lookup-qemu-platforms} +(voir plus bas). @item @code{guix-support?} (par défaut : @code{#f}) -When it is true, QEMU and all its dependencies are added to the build -environment of @command{guix-daemon} (@pxref{Invoquer guix-daemon, -@code{--chroot-directory} option}). This allows the @code{binfmt_misc} -handlers to be used within the build environment, which in turn means that -you can transparently build programs for another architecture. +Lorsque la valeur est vraie, QEMU et toutes ses dépendances sont ajoutés à +l'environnement de construction de @command{guix-daemon} (@pxref{Invoquer guix-daemon, @code{--chroot-directory} option}). Cela permet d'utiliser les +gestionnaires @code{binfmt_misc} dans l'environnement de cosntruction, ce +qui signifie que vous pouvez construire des programmes pour d'autres +architectures de manière transparente. -For example, let's suppose you're on an x86_64 machine and you have this -service: +Par exemple, supposons que vous soyez sur une machine x86_64 et que vous +avez ce services : @example (service qemu-binfmt-service-type @@ -20818,9 +21512,10 @@ guix build -s armhf-linux inkscape @end example @noindent -and it will build Inkscape for ARMv7 @emph{as if it were a native build}, -transparently using QEMU to emulate the ARMv7 CPU. Pretty handy if you'd -like to test a package build for an architecture you don't have access to! +et cela construira Inkscape pour ARMv7 @emph{comme s'il s'agissait d'une +construction native}, de manière transparente avec QEMU pour émuler un CPU +ARMv7. Plutôt pratique si vous voulez tester un paquet construit pour une +architecture à laquelle vous n'avez pas accès ! @item @code{qemu} (par défaut : @code{qemu}) Le paquet QEMU à utiliser. @@ -20828,131 +21523,135 @@ Le paquet QEMU à utiliser. @end deftp @deffn {Procédure Scheme} lookup-qemu-platforms @var{platforms}@dots{} -Return the list of QEMU platform objects corresponding to -@var{platforms}@dots{}. @var{platforms} must be a list of strings -corresponding to platform names, such as @code{"arm"}, @code{"sparc"}, -@code{"mips64el"}, and so on. +Renvoie la liste des objets de plates-formes QEMU correspondant à +@var{platforms}@dots{}. @var{platforms} doit être une liste de chaînes de +caractères correspondant aux noms de plates-formes, comme @code{"arm"}, +@code{"sparc"}, @code{"mips64el"} etc. @end deffn @deffn {Procédure Scheme} qemu-platform? @var{obj} -Return true if @var{obj} is a platform object. +Renvoie vrai s i@var{obj} est un objet de plate-forme. @end deffn @deffn {Procédure Scheme} qemu-platform-name @var{platform} -Return the name of @var{platform}---a string such as @code{"arm"}. +Renvoie le nom de @var{platform} — une chaîne comme @code{"arm"}. @end deffn @node Services de contrôle de version -@subsubsection Services de contrôle de version +@subsection Services de contrôle de version -The @code{(gnu services version-control)} module provides a service to allow -remote access to local Git repositories. There are three options: the -@code{git-daemon-service}, which provides access to repositories via the -@code{git://} unsecured TCP-based protocol, extending the @code{nginx} web -server to proxy some requests to @code{git-http-backend}, or providing a web -interface with @code{cgit-service-type}. +Le module @code{(gnu services version-control)} fournit un service pour +permettre l'accès à distance à des dépôts Git locaux. Il y a trois options +: en utilisant @code{git-daemon-service} qui fournit un accès aux dépôts via +le protocole non sécurisé @code{git://} basé sur TCP, en étendant le serveur +web @code{nginx} pour relayer les requêtes vers @code{git-http-backend} ou +en fournissant une interface web avec @code{cgit-service-type}. @deffn {Procédure Scheme} git-daemon-service [#:config (git-daemon-configuration)] -Return a service that runs @command{git daemon}, a simple TCP server to -expose repositories over the Git protocol for anonymous access. +Renvoie un service qui lance @command{git daemon}, un serveur TCP simple +pour exposer des dépôts sur le protocole Git pour des accès anonymes. -The optional @var{config} argument should be a -@code{} object, by default it allows read-only -access to exported@footnote{By creating the magic file -"git-daemon-export-ok" in the repository directory.} repositories under -@file{/srv/git}. +L'argument facultatif @var{config} devrait être un objet +@code{}, par défaut il permet l'accès en +lecture-seule aux dépôts exportés@footnote{En créant le fichier magique « +git-daemon-export-ok » dans le répertoire du dépôt.} dans @file{/srv/git}. @end deffn @deftp {Type de données} git-daemon-configuration -Data type representing the configuration for @code{git-daemon-service}. +Type de données représentnt la configuration de @code{git-daemon-service}. @table @asis @item @code{package} (par défaut : @var{git}) -Package object of the Git distributed version control system. +Objet de paquet du système de contrôle de version distribué Git. @item @code{export-all?} (par défaut : @var{#f}) -Whether to allow access for all Git repositories, even if they do not have -the @file{git-daemon-export-ok} file. +Indique s'il faut permettre l'accès à tous les dépôts Git, même s'ils n'ont +pas le fichier @file{git-daemon-export-ok}. @item @code{base-path} (par défaut : @file{/srv/git}) -Whether to remap all the path requests as relative to the given path. If -you run git daemon with @var{(base-path "/srv/git")} on example.com, then if -you later try to pull @code{git://example.com/hello.git}, git daemon will -interpret the path as @code{/srv/git/hello.git}. +Indique s'il faut traduire toutes les requêtes de chemins relativement au +chemin actuel. Si vous lancez le démon git avec @var{(base-path +"/srv/git")} sur example.com, si vous essayez ensuite de récupérer +@code{git://example.com/hello.git}, le démon git interprétera ce chemin +comme étant @code{/srv/git/hello.git}. @item @code{user-path} (par défaut : @var{#f}) -Whether to allow @code{~user} notation to be used in requests. When -specified with empty string, requests to @code{git://host/~alice/foo} is -taken as a request to access @code{foo} repository in the home directory of -user @code{alice}. If @var{(user-path "path")} is specified, the same -request is taken as a request to access @code{path/foo} repository in the -home directory of user @code{alice}. +Indique s'il faut permettre la notation @code{~user} dans les requêtes. +Lorsque spécifié avec une chaîne vide, les requêtes à +@code{git://host/~alice/foo} sont des requêtes d'accès au dépôt @code{foo} +dans le répertoire personnel de l'utilisateur @code{alice}. Si +@var{(user-path "chemin")} est spécifié, la même requête est interprétée +comme accédant au répertoire @code{chemin/foo} dans le répertoire personnel +de l'utilisateur @code{alice}. @item @code{listen} (par défaut : @var{'()}) -Whether to listen on specific IP addresses or hostnames, defaults to all. +Indique s'il faut écouter sur des adresses IP ou des noms d'hôtes +particuliers, par défaut tous. @item @code{port} (par défaut : @var{#f}) -Whether to listen on an alternative port, which defaults to 9418. +Indique s'il faut écouter sur un port particulier, par défaut le 9418. @item @code{whitelist} (par défaut : @var{'()}) -If not empty, only allow access to this list of directories. +Si la liste n'est pas vide, n'autoriser l'accès qu'aux dossiers spécifiés. @item @code{extra-options} (par défaut : @var{'()}) -Extra options will be passed to @code{git daemon}, please run @command{man -git-daemon} for more information. +Options supplémentaires qui seront passées à @code{git daemon}, lancez +@command{man git-daemon} pour plus d'informations. @end table @end deftp -The @code{git://} protocol lacks authentication. When you pull from a -repository fetched via @code{git://}, you don't know that the data you -receive was modified is really coming from the specified host, and you have -your connection is subject to eavesdropping. It's better to use an -authenticated and encrypted transport, such as @code{https}. Although Git -allows you to serve repositories using unsophisticated file-based web -servers, there is a faster protocol implemented by the -@code{git-http-backend} program. This program is the back-end of a proper -Git web service. It is designed to sit behind a FastCGI proxy. @xref{Services web}, for more on running the necessary @code{fcgiwrap} daemon. - -Guix has a separate configuration data type for serving Git repositories -over HTTP. +Le protocole @code{git://} ne permet pas l'authentification. Lorsque vous +récupérez un dépôt via @code{git://}, vous ne pouvez pas savoir si les +données que vous recevez ont été modifiées ou si elles viennent bien de +l'hôte spécifié, et votre connexion pourrait être espionnée. Il est +préférable d'utiliser un protocole de transport authentifié et chiffré, +comme @code{https}. Bien que Git vous permette de servir des dépôts avec un +serveur web peu sophistiqué basé sur les fichiers, il y a un protocole plus +rapide implémenté par le programme @code{git-http-backend}. Ce programme +est le moteur des services web Git corrects. Il est conçu pour se trouver +derrière un mandataire FastCGI. @xref{Services web} pour plus +d'informations sur la manière de lancer le démon @code{fcgiwrap} nécessaire. + +Guix a un type de données de configuration séparé pour servir des dépôts Git +par HTTP. @deftp {Type de données} git-http-configuration -Data type representing the configuration for @code{git-http-service}. +Type de données représentant la configuration de @code{git-http-service}. @table @asis @item @code{package} (par défaut : @var{git}) -Package object of the Git distributed version control system. +Objet de paquet du système de contrôle de version distribué Git. @item @code{git-root} (par défaut : @file{/srv/git}) -Directory containing the Git repositories to expose to the world. +Répertoire contenant les dépôts Git à exposer au monde. @item @code{export-all?} (par défaut : @var{#f}) -Whether to expose access for all Git repositories in @var{git-root}, even if -they do not have the @file{git-daemon-export-ok} file. +Indique s'il faut exposer l'accès de tous les dépôts Git dans +@var{git-root}, même s'ils n'ont pas le fichier @file{git-daemon-export-ok}. @item @code{uri-path} (par défaut : @file{/git/}) -Path prefix for Git access. With the default @code{/git/} prefix, this will -map @code{http://@var{server}/git/@var{repo}.git} to -@code{/srv/git/@var{repo}.git}. Requests whose URI paths do not begin with -this prefix are not passed on to this Git instance. +Préfixe du chemin pour l'accès Git. Avec le préfixe @code{/git/} par +défaut, cela traduira @code{http://@var{server}/git/@var{repo}.git} en +@code{/sr/git/@var{repo}.git}. Les requêtes dont les chemins d'URI ne +commencent pas par ce préfixe ne seront pas passées à cette instance de Git. @item @code{fcgiwrap-socket} (par défaut : @code{127.0.0.1:9000}) -The socket on which the @code{fcgiwrap} daemon is listening. @xref{Services web}. +Le socket sur lequel le démon @code{fcgiwrap} écoute. @xref{Services web}. @end table @end deftp -There is no @code{git-http-service-type}, currently; instead you can create -an @code{nginx-location-configuration} from a @code{git-http-configuration} -and then add that location to a web server. +Il n'y a pas de @code{git-http-service-type}, actuellement ; à la place vous +pouvez créer un @code{nginx-location-configuration} à partir d'un +@code{git-http-configuration} puis ajouter cela au serveur web. @deffn {Procédure Scheme} git-http-nginx-location-configuration @ - [config=(git-http-configuration)] Compute an -@code{nginx-location-configuration} that corresponds to the given Git http -configuration. An example nginx service definition to serve the default -@file{/srv/git} over HTTPS might be: + [config=(git-http-configuration)] +Calcule un @code{nginx-location-configuration} qui correspond à la +configuration http Git donnée. Voici un exemple de définition de service +nginx qui sert le répertoire @file{/srv/git} par défaut en HTTPS : @example (service nginx-service-type @@ -20972,11 +21671,11 @@ configuration. An example nginx service definition to serve the default (git-http-configuration (uri-path "/")))))))))) @end example -This example assumes that you are using Let's Encrypt to get your TLS -certificate. @xref{Services de certificats}. The default @code{certbot} -service will redirect all HTTP traffic on @code{git.my-host.org} to HTTPS. -You will also need to add an @code{fcgiwrap} proxy to your system services. -@xref{Services web}. +Ce exemple suppose que vous utilisez Let's Encrypt pour récupérer votre +certificat TLS. @xref{Services de certificats}. Le service @code{certbot} par +défaut redirigera tout le trafic HTTP de @code{git.my-host.org} en HTTPS. +Vous devrez aussi ajouter un mandataire @code{fcgiwrap} à vos services +systèmes. @xref{Services web}. @end deffn @subsubheading Service Cgit @@ -20986,15 +21685,15 @@ You will also need to add an @code{fcgiwrap} proxy to your system services. @uref{https://git.zx2c4.com/cgit/, Cgit} est une interface web pour des dépôts Git écrite en C. -The following example will configure the service with default values. By -default, Cgit can be accessed on port 80 (@code{http://localhost:80}). +L'exemple suivant configurera le service avec les valeurs par défaut. Par +défaut, on peut accéder à Cgit sur le port (@code{http://localhost:80}). @example (service cgit-service-type) @end example -The @code{file-object} type designates either a file-like object -(@pxref{G-Expressions, file-like objects}) or a string. +Le type @code{file-object} désigne soit un objet simili-fichier +(@pxref{G-Expressions, file-like objects}), soit une chaîne. @c %start of fragment @@ -21011,276 +21710,278 @@ Configuration Nginx. @end deftypevr @deftypevr {paramètre de @code{cgit-configuration}} file-object about-filter -Specifies a command which will be invoked to format the content of about -pages (both top-level and for each repository). +Spécifie une commande qui doit être invoquée pour formater le contenu des +pages « à propos » (au plus haut niveau et pour chaque dépôt). La valeur par défaut est @samp{""}. @end deftypevr @deftypevr {paramètre de @code{cgit-configuration}} string agefile -Specifies a path, relative to each repository path, which can be used to -specify the date and time of the youngest commit in the repository. +Spécifie un chemin, relativement à chaque dépôt, qui peut être utilisé pour +spécifier la date et l'heure du plus récent commit du dépôt. La valeur par défaut est @samp{""}. @end deftypevr @deftypevr {paramètre de @code{cgit-configuration}} file-object auth-filter -Specifies a command that will be invoked for authenticating repository -access. +Spécifie une commande qui sera invoquée pour authentifier l'accès au dépôt. La valeur par défaut est @samp{""}. @end deftypevr @deftypevr {paramètre de @code{cgit-configuration}} string branch-sort -Flag which, when set to @samp{age}, enables date ordering in the branch ref -list, and when set @samp{name} enables ordering by branch name. +Drapeau qui, lorsqu'il vaut @samp{age}, active le trie par date dans la +liste des branches, et le trie par nom lorsqu'il vaut @samp{name}. La valeur par défaut est @samp{"name"}. @end deftypevr @deftypevr {paramètre de @code{cgit-configuration}} string cache-root -Path used to store the cgit cache entries. +Chemin utilisé pour stocker les entrées de cache de cgit. La valeur par défaut est @samp{"/var/cache/cgit"}. @end deftypevr @deftypevr {paramètre de @code{cgit-configuration}} integer cache-static-ttl -Number which specifies the time-to-live, in minutes, for the cached version -of repository pages accessed with a fixed SHA1. +Nombre qui spécifie le temps de vie, en minute, des versions en cache des +pages du dépôt accédées par leur SHA-1. La valeur par défaut est @samp{-1}. @end deftypevr @deftypevr {paramètre de @code{cgit-configuration}} integer cache-dynamic-ttl -Number which specifies the time-to-live, in minutes, for the cached version -of repository pages accessed without a fixed SHA1. +Nombre qui spécifie le temps de vie, en minutes, des version en cache des +pages du dépôt accédées sans leur SHA1. La valeur par défaut est @samp{5}. @end deftypevr @deftypevr {paramètre de @code{cgit-configuration}} integer cache-repo-ttl -Number which specifies the time-to-live, in minutes, for the cached version -of the repository summary page. +Nombre qui spécifie le temps de vie, en minute, des version en cache de la +page de résumé du dépôt. La valeur par défaut est @samp{5}. @end deftypevr @deftypevr {paramètre de @code{cgit-configuration}} integer cache-root-ttl -Number which specifies the time-to-live, in minutes, for the cached version -of the repository index page. +Nombre qui spécifie le temps de vie, en minutes, de la version en cache de +la page d'index du dépôt. La valeur par défaut est @samp{5}. @end deftypevr @deftypevr {paramètre de @code{cgit-configuration}} integer cache-scanrc-ttl -Number which specifies the time-to-live, in minutes, for the result of -scanning a path for Git repositories. +Nombre qui spécifie le temps de vie, en minutes, de la version en cache du +résultat du scan d'un chemin dans le dépôt Git. La valeur par défaut est @samp{15}. @end deftypevr @deftypevr {paramètre de @code{cgit-configuration}} integer cache-about-ttl -Number which specifies the time-to-live, in minutes, for the cached version -of the repository about page. +Nombre qui spécifie le temps de vie, en minutes, de la version en cache de +la page « à propos » du dépôt. La valeur par défaut est @samp{15}. @end deftypevr @deftypevr {paramètre de @code{cgit-configuration}} integer cache-snapshot-ttl -Number which specifies the time-to-live, in minutes, for the cached version -of snapshots. +Nombre qui spécifie le temps de vie, en minutes, de la version en cache des +archives. La valeur par défaut est @samp{5}. @end deftypevr @deftypevr {paramètre de @code{cgit-configuration}} integer cache-size -The maximum number of entries in the cgit cache. When set to @samp{0}, -caching is disabled. +Le nombre maximum d'entrées dans le cache de cgit. Lorsque la valeur est +@samp{0}, le cache est désactivé. La valeur par défaut est @samp{0}. @end deftypevr @deftypevr {paramètre de @code{cgit-configuration}} boolean case-sensitive-sort? -Sort items in the repo list case sensitively. +Indique si le tri des éléments est sensible à la casse. La valeur par défaut est @samp{#t}. @end deftypevr @deftypevr {paramètre de @code{cgit-configuration}} list clone-prefix -List of common prefixes which, when combined with a repository URL, -generates valid clone URLs for the repository. +Liste des préfixes communs qui, lorsqu'ils sont combinés à l'URL du dépôt, +génèrent des URL de clone valides pour le dépôt. La valeur par défaut est @samp{()}. @end deftypevr @deftypevr {paramètre de @code{cgit-configuration}} list clone-url -List of @code{clone-url} templates. +Liste des modèles @code{clone-url} La valeur par défaut est @samp{()}. @end deftypevr @deftypevr {paramètre de @code{cgit-configuration}} file-object commit-filter -Command which will be invoked to format commit messages. +Commande qui sera invoquée pour formater les messages de commit. La valeur par défaut est @samp{""}. @end deftypevr @deftypevr {paramètre de @code{cgit-configuration}} string commit-sort -Flag which, when set to @samp{date}, enables strict date ordering in the -commit log, and when set to @samp{topo} enables strict topological ordering. +Drapeau qui, s'il vaut @samp{date}, active le tri par date strict dans le +messages de commit, et le tri topologique strict lorsqu'il vaut @samp{topo}. La valeur par défaut est @samp{"git log"}. @end deftypevr @deftypevr {paramètre de @code{cgit-configuration}} file-object css -URL which specifies the css document to include in all cgit pages. +URL qui spécifie le document css à inclure dans les pages cgit. La valeur par défaut est @samp{"/share/cgit/cgit.css"}. @end deftypevr @deftypevr {paramètre de @code{cgit-configuration}} file-object email-filter -Specifies a command which will be invoked to format names and email address -of committers, authors, and taggers, as represented in various places -throughout the cgit interface. +Spécifie une commande qui sera invoquée pour formater les noms et l'adresse +de courriel des commiteurs, des auteurs et des taggueurs, représentés à +plusieurs endroits dans l'interface cgit. La valeur par défaut est @samp{""}. @end deftypevr @deftypevr {paramètre de @code{cgit-configuration}} boolean embedded? -Flag which, when set to @samp{#t}, will make cgit generate a HTML fragment -suitable for embedding in other HTML pages. +Drapeau qui, s'il vaut @samp{#t}, fera générer un fragment HTML à cgit qu'il +sera possible d'inclure dans d'autres pages HTML. La valeur par défaut est @samp{#f}. @end deftypevr @deftypevr {paramètre de @code{cgit-configuration}} boolean enable-commit-graph? -Flag which, when set to @samp{#t}, will make cgit print an ASCII-art commit -history graph to the left of the commit messages in the repository log page. +Drapeau qui, lorsqu'il vaut @samp{#t}, fera afficher un historique en +ASCII-art à gauche des messages de commit dans la page de log du dépôt. La valeur par défaut est @samp{#f}. @end deftypevr @deftypevr {paramètre de @code{cgit-configuration}} boolean enable-filter-overrides? -Flag which, when set to @samp{#t}, allows all filter settings to be -overridden in repository-specific cgitrc files. +Drapeau qui, lorsqu'il vaut @samp{#t}, permet à tous les paramètres de +filtrage d'être modifiés dans des fichiers cgitrc spécifiques au dépôt. La valeur par défaut est @samp{#f}. @end deftypevr @deftypevr {paramètre de @code{cgit-configuration}} boolean enable-follow-links? -Flag which, when set to @samp{#t}, allows users to follow a file in the log -view. +Drapeau qui, s'il vaut @samp{#t}, permet aux utilisateurs de suivre un +fichier dans la vue « log ». La valeur par défaut est @samp{#f}. @end deftypevr @deftypevr {paramètre de @code{cgit-configuration}} boolean enable-http-clone? -If set to @samp{#t}, cgit will act as an dumb HTTP endpoint for Git clones. +Si la valeur est @samp{#t}, cgit agira comme un point d'accès HTTP idiot +pour les clones Git. La valeur par défaut est @samp{#t}. @end deftypevr @deftypevr {paramètre de @code{cgit-configuration}} boolean enable-index-links? -Flag which, when set to @samp{#t}, will make cgit generate extra links -"summary", "commit", "tree" for each repo in the repository index. +Drapeau qui, s'il vaut @samp{#t}, fera générer des liens « résumé », « +commit » et « arborescence » supplémentaires poru chaque dépôt dans l'index +des dépôts. La valeur par défaut est @samp{#f}. @end deftypevr @deftypevr {paramètre de @code{cgit-configuration}} boolean enable-index-owner? -Flag which, when set to @samp{#t}, will make cgit display the owner of each -repo in the repository index. +Drapeau qui, s'il vaut @samp{#t}, fera afficher le propriétaire de chaque +dépôt dans l'index des dépôts. La valeur par défaut est @samp{#t}. @end deftypevr @deftypevr {paramètre de @code{cgit-configuration}} boolean enable-log-filecount? -Flag which, when set to @samp{#t}, will make cgit print the number of -modified files for each commit on the repository log page. +Drapeau qui, s'il vaut @samp{#t}, fera afficher à cgit le nombre de fichiers +modifiés pour chaque commit sur la page de log du dépôt. La valeur par défaut est @samp{#f}. @end deftypevr @deftypevr {paramètre de @code{cgit-configuration}} boolean enable-log-linecount? -Flag which, when set to @samp{#t}, will make cgit print the number of added -and removed lines for each commit on the repository log page. +Drapeau qui, s'il vaut @samp{#t}, fera afficher à cgit le nombre de lignes +ajoutées et enlevées pour chaque commit de la page de log du dépôt. La valeur par défaut est @samp{#f}. @end deftypevr @deftypevr {paramètre de @code{cgit-configuration}} boolean enable-remote-branches? -Flag which, when set to @code{#t}, will make cgit display remote branches in -the summary and refs views. +Drapeau qui, s'il vaut @samp{#t}, fera afficher les branches distantes dans +les vues du résumé et des références. La valeur par défaut est @samp{#f}. @end deftypevr @deftypevr {paramètre de @code{cgit-configuration}} boolean enable-subject-links? -Flag which, when set to @code{1}, will make cgit use the subject of the -parent commit as link text when generating links to parent commits in commit -view. +Drapeau qui, s'il vaut @samp{1}, fera utiliser à cgit le sujet du commit +parent comme texte du lien lors de la génération des liens vers les commits +parents dans la vue des commits. La valeur par défaut est @samp{#f}. @end deftypevr @deftypevr {paramètre de @code{cgit-configuration}} boolean enable-html-serving? -Flag which, when set to @samp{#t}, will make cgit use the subject of the -parent commit as link text when generating links to parent commits in commit -view. +Drapeau qui, s'il vaut @samp{#t}, fera utiliser à cgit l esujet du commit +parent comme texte du lien lors de la génération des liens vers le commit +parent dans la vue des commits. La valeur par défaut est @samp{#f}. @end deftypevr @deftypevr {paramètre de @code{cgit-configuration}} boolean enable-tree-linenumbers? -Flag which, when set to @samp{#t}, will make cgit generate linenumber links -for plaintext blobs printed in the tree view. +Drapeau qui, s'il vaut @samp{#t}, fera générer à cgit des liens vers le +numéro de ligne pour les blobs en texte brut affichés dans la vue de +l'arborescence. La valeur par défaut est @samp{#t}. @end deftypevr @deftypevr {paramètre de @code{cgit-configuration}} boolean enable-git-config? -Flag which, when set to @samp{#f}, will allow cgit to use Git config to set -any repo specific settings. +Drapeau qui, s'il vaut @samp{#t}, permettra à cgit d'utiliser la +configuration Git pour spécifier des paramètres spécifiques au dépôt. La valeur par défaut est @samp{#f}. @end deftypevr @deftypevr {paramètre de @code{cgit-configuration}} file-object favicon -URL used as link to a shortcut icon for cgit. +URL utilisée comme lien vers un icône pour cgit. La valeur par défaut est @samp{"/favicon.ico"}. @@ -21296,129 +21997,131 @@ La valeur par défaut est @samp{""}. @end deftypevr @deftypevr {paramètre de @code{cgit-configuration}} string head-include -The content of the file specified with this option will be included verbatim -in the HTML HEAD section on all pages. +Le contenu du fichier spécifié dans cette option sera inclus directement +dans la section HEAD HTML de toutes les pages. La valeur par défaut est @samp{""}. @end deftypevr @deftypevr {paramètre de @code{cgit-configuration}} string header -The content of the file specified with this option will be included verbatim -at the top of all pages. +Le contenu du fichier spécifié avec cette option sera inclus directement au +début de toutes les pages. La valeur par défaut est @samp{""}. @end deftypevr @deftypevr {paramètre de @code{cgit-configuration}} file-object include -Name of a configfile to include before the rest of the current config- file -is parsed. +Nom d'un fichier de configuration à inclure avant que le reste du fichier de +configuration actuel ne soit analysé. La valeur par défaut est @samp{""}. @end deftypevr @deftypevr {paramètre de @code{cgit-configuration}} string index-header -The content of the file specified with this option will be included verbatim -above the repository index. +Le contenu du fichier spécifié avec cette option sera inclus directement au +dessus de l'index des dépôts. La valeur par défaut est @samp{""}. @end deftypevr @deftypevr {paramètre de @code{cgit-configuration}} string index-info -The content of the file specified with this option will be included verbatim -below the heading on the repository index page. +Le contenu du fichier spécifié avec cette option sera inclus directement en +dessous de l'en-tête sur la page d'index du dépôt. La valeur par défaut est @samp{""}. @end deftypevr @deftypevr {paramètre de @code{cgit-configuration}} boolean local-time? -Flag which, if set to @samp{#t}, makes cgit print commit and tag times in -the servers timezone. +Drapeau qui, s'il vaut @samp{#t}, fera afficher à cgit l'heure et la date de +commit et de tag dans le fuseau horaire du serveur. La valeur par défaut est @samp{#f}. @end deftypevr @deftypevr {paramètre de @code{cgit-configuration}} file-object logo -URL which specifies the source of an image which will be used as a logo on -all cgit pages. +URL qui spécifie la source d'une image utilisé comme logo sur toutes les +pages cgit. La valeur par défaut est @samp{"/share/cgit/cgit.png"}. @end deftypevr @deftypevr {paramètre de @code{cgit-configuration}} string logo-link -URL loaded when clicking on the cgit logo image. +URL chargée lors du clic sur l'image du logo de cgit. La valeur par défaut est @samp{""}. @end deftypevr @deftypevr {paramètre de @code{cgit-configuration}} file-object owner-filter -Command which will be invoked to format the Owner column of the main page. +Commande qui sera invoquée pour formater la colonne propriétaire sur la page +principale. La valeur par défaut est @samp{""}. @end deftypevr @deftypevr {paramètre de @code{cgit-configuration}} integer max-atom-items -Number of items to display in atom feeds view. +Nombre d'éléments à afficher dans la vue des flux atom. La valeur par défaut est @samp{10}. @end deftypevr @deftypevr {paramètre de @code{cgit-configuration}} integer max-commit-count -Number of entries to list per page in "log" view. +Nombre d'éléments à lister par page dans la vue « log ». La valeur par défaut est @samp{50}. @end deftypevr @deftypevr {paramètre de @code{cgit-configuration}} integer max-message-length -Number of commit message characters to display in "log" view. +Nombre caractères de messages de commit à afficher dans la vue « log ». La valeur par défaut est @samp{80}. @end deftypevr @deftypevr {paramètre de @code{cgit-configuration}} integer max-repo-count -Specifies the number of entries to list per page on the repository index -page. +Spécifie le nombre d'éléments à lister par page sur la page de l'index des +dépôts. La valeur par défaut est @samp{50}. @end deftypevr @deftypevr {paramètre de @code{cgit-configuration}} integer max-repodesc-length -Specifies the maximum number of repo description characters to display on -the repository index page. +Spécifie le nombre maximum de caractères de description de dépôts à afficher +sur la page d'index des dépôts. La valeur par défaut est @samp{80}. @end deftypevr @deftypevr {paramètre de @code{cgit-configuration}} integer max-blob-size -Specifies the maximum size of a blob to display HTML for in KBytes. +Spécifie la taille maximale d'un blob pour lequel afficher du HTML en +kilo-octets. La valeur par défaut est @samp{0}. @end deftypevr @deftypevr {paramètre de @code{cgit-configuration}} string max-stats -Maximum statistics period. Valid values are @samp{week},@samp{month}, -@samp{quarter} and @samp{year}. +Période de statistiques maximale. Les valeurs valides sont @samp{week}, +@samp{month}, @samp{quarter} et @samp{year}. La valeur par défaut est @samp{""}. @end deftypevr @deftypevr {paramètre de @code{cgit-configuration}} mimetype-alist mimetype -Mimetype for the specified filename extension. +Type mime pour l'extension de fichier spécifiée. La valeur par défaut est @samp{((gif "image/gif") (html "text/html") (jpg "image/jpeg") (jpeg "image/jpeg") (pdf "application/pdf") (png "image/png") @@ -21427,131 +22130,132 @@ La valeur par défaut est @samp{((gif "image/gif") (html "text/html") (jpg @end deftypevr @deftypevr {paramètre de @code{cgit-configuration}} file-object mimetype-file -Specifies the file to use for automatic mimetype lookup. +Spécifie le fichier à utiliser pour la recherche automatique de type mime. La valeur par défaut est @samp{""}. @end deftypevr @deftypevr {paramètre de @code{cgit-configuration}} string module-link -Text which will be used as the formatstring for a hyperlink when a submodule -is printed in a directory listing. +Texte qui sera utilisé comme chaîne de formatage pour un lien hypertexte +lorsqu'un sous-module est affiché dans la liste du répertoire. La valeur par défaut est @samp{""}. @end deftypevr @deftypevr {paramètre de @code{cgit-configuration}} boolean nocache? -If set to the value @samp{#t} caching will be disabled. +Si la valeur est @samp{#t}, le cache est désactivé. La valeur par défaut est @samp{#f}. @end deftypevr @deftypevr {paramètre de @code{cgit-configuration}} boolean noplainemail? -If set to @samp{#t} showing full author email addresses will be disabled. +Si la valeur est @samp{#t}, l'affichage des adresse de courriel des auteurs +sera désactivé. La valeur par défaut est @samp{#f}. @end deftypevr @deftypevr {paramètre de @code{cgit-configuration}} boolean noheader? -Flag which, when set to @samp{#t}, will make cgit omit the standard header -on all pages. +Drapeau qui, s'il vaut @samp{#t}, fera omettre à cgit l'en-tête standard sur +toutes les pages. La valeur par défaut est @samp{#f}. @end deftypevr @deftypevr {paramètre de @code{cgit-configuration}} project-list project-list -A list of subdirectories inside of @code{repository-directory}, relative to -it, that should loaded as Git repositories. An empty list means that all -subdirectories will be loaded. +UNe liste de sous-répertoires dans @code{repository-directory}, relativement +à lui, qui devrait être chargé comme des dépôts Git. Une liste vide +signifie que tous les sous-répertoires seront chargés. La valeur par défaut est @samp{()}. @end deftypevr @deftypevr {paramètre de @code{cgit-configuration}} file-object readme -Text which will be used as default value for @code{cgit-repo-readme}. +Texte utilisé comme valeur par défaut pour @code{cgit-repo-readme}. La valeur par défaut est @samp{""}. @end deftypevr @deftypevr {paramètre de @code{cgit-configuration}} boolean remove-suffix? -If set to @code{#t} and @code{repository-directory} is enabled, if any -repositories are found with a suffix of @code{.git}, this suffix will be -removed for the URL and name. +Si la valeur est @code{#t} et que @code{repository-directory} est activé, si +un dépôt avec un suffixe de @code{.git} est trouvé, ce suffixe sera supprimé +de l'URL et du nom. La valeur par défaut est @samp{#f}. @end deftypevr @deftypevr {paramètre de @code{cgit-configuration}} integer renamelimit -Maximum number of files to consider when detecting renames. +Nombre maximum de fichiers à considérer lors de la détection des renommages. La valeur par défaut est @samp{-1}. @end deftypevr @deftypevr {paramètre de @code{cgit-configuration}} string repository-sort -The way in which repositories in each section are sorted. +La manière dont les dépôt de chaque section sont rangés. La valeur par défaut est @samp{""}. @end deftypevr @deftypevr {paramètre de @code{cgit-configuration}} robots-list robots -Text used as content for the @code{robots} meta-tag. +Texte utilisé comme contenu du méta-attribut @code{robots}. La valeur par défaut est @samp{("noindex" "nofollow")}. @end deftypevr @deftypevr {paramètre de @code{cgit-configuration}} string root-desc -Text printed below the heading on the repository index page. +Texte affiché en dessous de l'en-tête de la page d'index des dépôts. La valeur par défaut est @samp{"a fast webinterface for the git dscm"}. @end deftypevr @deftypevr {paramètre de @code{cgit-configuration}} string root-readme -The content of the file specified with this option will be included verbatim -below thef "about" link on the repository index page. +Le contenu du fichier spécifié avec cette option sera inclus directement en +dessous du lien « à propos » sur la page d'index du dépôt. La valeur par défaut est @samp{""}. @end deftypevr @deftypevr {paramètre de @code{cgit-configuration}} string root-title -Text printed as heading on the repository index page. +Texte affiché sur la page d'index des dépôts. La valeur par défaut est @samp{""}. @end deftypevr @deftypevr {paramètre de @code{cgit-configuration}} boolean scan-hidden-path -If set to @samp{#t} and repository-directory is enabled, -repository-directory will recurse into directories whose name starts with a -period. Otherwise, repository-directory will stay away from such -directories, considered as "hidden". Note that this does not apply to the -".git" directory in non-bare repos. +Si la valeur est @samp{#t} et que repository-directory est activé, +repository-directory recherchera de manière récursive dans les répertoires +dont le nom commence par un point. Sinon, repository-directory restera hors +de ces répertoires, considérés comme « cachés ». Remarquez que cela ne +s'applique pas au répertoire « .git » dans le dépôts. La valeur par défaut est @samp{#f}. @end deftypevr @deftypevr {paramètre de @code{cgit-configuration}} list snapshots -Text which specifies the default set of snapshot formats that cgit generates -links for. +Texte qui spécifie l'ensemble des formats d'archives par défaut pour +lesquelles cgit générera un lien. La valeur par défaut est @samp{()}. @end deftypevr @deftypevr {paramètre de @code{cgit-configuration}} repository-directory repository-directory -Name of the directory to scan for repositories (represents +Nom du répertoire à scanner pour trouver les dépôts (représente @code{scan-path}). La valeur par défaut est @samp{"/srv/git"}. @@ -21559,328 +22263,329 @@ La valeur par défaut est @samp{"/srv/git"}. @end deftypevr @deftypevr {paramètre de @code{cgit-configuration}} string section -The name of the current repository section - all repositories defined after -this option will inherit the current section name. +Le nom de la section de dépôts actuelle — tous les dépôts définis après ce +point hériterons du nom de section actuel. La valeur par défaut est @samp{""}. @end deftypevr @deftypevr {paramètre de @code{cgit-configuration}} string section-sort -Flag which, when set to @samp{1}, will sort the sections on the repository -listing by name. +Drapeau qui, s'il vaut @samp{1}, triera les sections dans la liste des +dépôts par nom. La valeur par défaut est @samp{""}. @end deftypevr @deftypevr {paramètre de @code{cgit-configuration}} integer section-from-path -A number which, if defined prior to repository-directory, specifies how many -path elements from each repo path to use as a default section name. +Un nombre qui, s'il est défini avant repository-directory, spécifier combien +d'éléments de chemin de chaque chemin de dépôt utiliser comme nom de section +par défaut. La valeur par défaut est @samp{0}. @end deftypevr @deftypevr {paramètre de @code{cgit-configuration}} boolean side-by-side-diffs? -If set to @samp{#t} shows side-by-side diffs instead of unidiffs per -default. +Si la valeur est @samp{#t}, afficher des diffs côte à côte au lieu des +unidiffs par défaut. La valeur par défaut est @samp{#f}. @end deftypevr @deftypevr {paramètre de @code{cgit-configuration}} file-object source-filter -Specifies a command which will be invoked to format plaintext blobs in the -tree view. +Spécifie une commande qui sera invoquée pour formater les blobs en texte +brut dans la vue de l'arborescence. La valeur par défaut est @samp{""}. @end deftypevr @deftypevr {paramètre de @code{cgit-configuration}} integer summary-branches -Specifies the number of branches to display in the repository "summary" -view. +Spécifie le nombre de branches à afficher dans la vue de résumé du dépôt. La valeur par défaut est @samp{10}. @end deftypevr @deftypevr {paramètre de @code{cgit-configuration}} integer summary-log -Specifies the number of log entries to display in the repository "summary" -view. +Spécifie le nombre d'élément du journal à afficher dans la vue résumé du +dépôt. La valeur par défaut est @samp{10}. @end deftypevr @deftypevr {paramètre de @code{cgit-configuration}} integer summary-tags -Specifies the number of tags to display in the repository "summary" view. +Spécifie le nombre de tags à afficher dans la vue résumé du dépôt. La valeur par défaut est @samp{10}. @end deftypevr @deftypevr {paramètre de @code{cgit-configuration}} string strict-export -Filename which, if specified, needs to be present within the repository for -cgit to allow access to that repository. +Nom de fichier qui, s'il est spécifié, doit être présent dans le dépôt pour +que cgit accorde l'accès à ce dépôt. La valeur par défaut est @samp{""}. @end deftypevr @deftypevr {paramètre de @code{cgit-configuration}} string virtual-root -URL which, if specified, will be used as root for all cgit links. +URL qui, si elle est spécifiée, sera utilisée comme racine pour tous les +liens cgit. La valeur par défaut est @samp{"/"}. @end deftypevr @deftypevr {paramètre de @code{cgit-configuration}} repository-cgit-configuration-list repositories -A list of @dfn{cgit-repo} records to use with config. +Une liste d'enregistrements @dfn{cgit-repo} à utiliser avec config. La valeur par défaut est @samp{()}. Les champs de @code{repository-cgit-configuration} disponibles sont : @deftypevr {paramètre de @code{repository-cgit-configuration}} repo-list snapshots -A mask of snapshot formats for this repo that cgit generates links for, -restricted by the global @code{snapshots} setting. +Un masque de formats d'archives pour ce dépôt pour lesquelles cgit générera +un lien, restreint par le paramètre @code{snapshots} global. La valeur par défaut est @samp{()}. @end deftypevr @deftypevr {paramètre de @code{repository-cgit-configuration}} repo-file-object source-filter -Override the default @code{source-filter}. +Modifie le @code{source-filter} par défaut. La valeur par défaut est @samp{""}. @end deftypevr @deftypevr {paramètre de @code{repository-cgit-configuration}} repo-string url -The relative URL used to access the repository. +URL relative utilisée pour accéder au dépôt. La valeur par défaut est @samp{""}. @end deftypevr @deftypevr {paramètre de @code{repository-cgit-configuration}} repo-file-object about-filter -Override the default @code{about-filter}. +Modifie le paramètre @code{about-filter} par défaut. La valeur par défaut est @samp{""}. @end deftypevr @deftypevr {paramètre de @code{repository-cgit-configuration}} repo-string branch-sort -Flag which, when set to @samp{age}, enables date ordering in the branch ref -list, and when set to @samp{name} enables ordering by branch name. +Drapeau qui, s'il vaut @samp{age}, active le tri par date dans la liste des +branches, et lorsqu'il vaut @samp{name}, le tri par nom. La valeur par défaut est @samp{""}. @end deftypevr @deftypevr {paramètre de @code{repository-cgit-configuration}} repo-list clone-url -A list of URLs which can be used to clone repo. +Un liste d'URL qui peuvent être utilisées pour cloner ce dépôt. La valeur par défaut est @samp{()}. @end deftypevr @deftypevr {paramètre de @code{repository-cgit-configuration}} repo-file-object commit-filter -Override the default @code{commit-filter}. +Modifie le paramètre @code{commit-filter} par défaut. La valeur par défaut est @samp{""}. @end deftypevr @deftypevr {paramètre de @code{repository-cgit-configuration}} repo-string commit-sort -Flag which, when set to @samp{date}, enables strict date ordering in the -commit log, and when set to @samp{topo} enables strict topological ordering. +Drapeau qui, s'il vaut @samp{date}, active le tri par date strict dans le +messages de commit, et le tri topologique strict lorsqu'il vaut @samp{topo}. La valeur par défaut est @samp{""}. @end deftypevr @deftypevr {paramètre de @code{repository-cgit-configuration}} repo-string defbranch -The name of the default branch for this repository. If no such branch -exists in the repository, the first branch name (when sorted) is used as -default instead. By default branch pointed to by HEAD, or "master" if there -is no suitable HEAD. +Le nom de la branche par défaut de ce dépôt. Si cette branche n'existe pas +dans le dépôt, le premier nom de branche (trié) sera utilisé par défaut. +Par défaut la branche pointée par HEAD, ou « master » s'il n'y a pas de HEAD +convenable. La valeur par défaut est @samp{""}. @end deftypevr @deftypevr {paramètre de @code{repository-cgit-configuration}} repo-string desc -The value to show as repository description. +La valeur à afficher comme description du dépôt. La valeur par défaut est @samp{""}. @end deftypevr @deftypevr {paramètre de @code{repository-cgit-configuration}} repo-string homepage -The value to show as repository homepage. +La valeur à afficher comme page d'accueil du dépôt. La valeur par défaut est @samp{""}. @end deftypevr @deftypevr {paramètre de @code{repository-cgit-configuration}} repo-file-object email-filter -Override the default @code{email-filter}. +Modifie le paramètre @code{email-filter} par défaut. La valeur par défaut est @samp{""}. @end deftypevr @deftypevr {paramètre de @code{repository-cgit-configuration}} maybe-repo-boolean enable-commit-graph? -A flag which can be used to disable the global setting -@code{enable-commit-graph?}. +Un drapeau qui peut être utilisé pour désactiver le paramètre +@code{enable-commit-graph?} global. La valeur par défaut est @samp{disabled}. @end deftypevr @deftypevr {paramètre de @code{repository-cgit-configuration}} maybe-repo-boolean enable-log-filecount? -A flag which can be used to disable the global setting -@code{enable-log-filecount?}. +Un drapeau qui peut être utilisé pour désactiver le paramètre +@code{enable-log-filecount?} global. La valeur par défaut est @samp{disabled}. @end deftypevr @deftypevr {paramètre de @code{repository-cgit-configuration}} maybe-repo-boolean enable-log-linecount? -A flag which can be used to disable the global setting -@code{enable-log-linecount?}. +Un drapeau qui peut être utilisé pour désactiver le paramètre +@code{enable-log-linecount?} global. La valeur par défaut est @samp{disabled}. @end deftypevr @deftypevr {paramètre de @code{repository-cgit-configuration}} maybe-repo-boolean enable-remote-branches? -Flag which, when set to @code{#t}, will make cgit display remote branches in -the summary and refs views. +Drapeau qui, s'il vaut @samp{#t}, fera afficher les branches distantes dans +les vues du résumé et des références. La valeur par défaut est @samp{disabled}. @end deftypevr @deftypevr {paramètre de @code{repository-cgit-configuration}} maybe-repo-boolean enable-subject-links? -A flag which can be used to override the global setting -@code{enable-subject-links?}. +Un drapeau qui peut être utilisé pour modifier le paramètre +@code{enable-subject-links?} global. La valeur par défaut est @samp{disabled}. @end deftypevr @deftypevr {paramètre de @code{repository-cgit-configuration}} maybe-repo-boolean enable-html-serving? -A flag which can be used to override the global setting -@code{enable-html-serving?}. +Un drapeau qui peut être utilisé pour modifier le paramètre +@code{enable-html-serving?} global. La valeur par défaut est @samp{disabled}. @end deftypevr @deftypevr {paramètre de @code{repository-cgit-configuration}} repo-boolean hide? -Flag which, when set to @code{#t}, hides the repository from the repository -index. +Drapeau qui, s'il vaut @code{#t}, cache le dépôt de l'index des dépôts. La valeur par défaut est @samp{#f}. @end deftypevr @deftypevr {paramètre de @code{repository-cgit-configuration}} repo-boolean ignore? -Flag which, when set to @samp{#t}, ignores the repository. +Drapeau qui, s'il vaut @code{#t}, ignore le dépôt. La valeur par défaut est @samp{#f}. @end deftypevr @deftypevr {paramètre de @code{repository-cgit-configuration}} repo-file-object logo -URL which specifies the source of an image which will be used as a logo on -this repo’s pages. +URL qui spécifie la source d'une image qui sera utilisée comme logo sur les +pages de ce dépôt. La valeur par défaut est @samp{""}. @end deftypevr @deftypevr {paramètre de @code{repository-cgit-configuration}} repo-string logo-link -URL loaded when clicking on the cgit logo image. +URL chargée lors du clic sur l'image du logo de cgit. La valeur par défaut est @samp{""}. @end deftypevr @deftypevr {paramètre de @code{repository-cgit-configuration}} repo-file-object owner-filter -Override the default @code{owner-filter}. +Modifie le paramètre @code{owner-filter} par défaut. La valeur par défaut est @samp{""}. @end deftypevr @deftypevr {paramètre de @code{repository-cgit-configuration}} repo-string module-link -Text which will be used as the formatstring for a hyperlink when a submodule -is printed in a directory listing. The arguments for the formatstring are -the path and SHA1 of the submodule commit. +Texte qui sera utilisé comme chaîne de formatage pour un lien hypertexte +lorsqu'un sous-module est affiché dans une liste de fichiers. Les arguments +pour la chaîne de formatage sont le chemin et le SHA1 du commit du +sous-module. La valeur par défaut est @samp{""}. @end deftypevr @deftypevr {paramètre de @code{repository-cgit-configuration}} module-link-path module-link-path -Text which will be used as the formatstring for a hyperlink when a submodule -with the specified subdirectory path is printed in a directory listing. +Texte qui sera utilisé comme chaîne de formatage lorsqu'un sous-module avec +un chemin spécifié sera affiché dans une liste de fichiers. La valeur par défaut est @samp{()}. @end deftypevr @deftypevr {paramètre de @code{repository-cgit-configuration}} repo-string max-stats -Override the default maximum statistics period. +Modifie la période de statistique maximale par défaut. La valeur par défaut est @samp{""}. @end deftypevr @deftypevr {paramètre de @code{repository-cgit-configuration}} repo-string name -The value to show as repository name. +La valeur à afficher comme nom de dépôt. La valeur par défaut est @samp{""}. @end deftypevr @deftypevr {paramètre de @code{repository-cgit-configuration}} repo-string owner -A value used to identify the owner of the repository. +Une valeur utilisée pour identifier le propriétaire du dépôt. La valeur par défaut est @samp{""}. @end deftypevr @deftypevr {paramètre de @code{repository-cgit-configuration}} repo-string path -An absolute path to the repository directory. +Un chemin absolu vers le répertoire du dépôt. La valeur par défaut est @samp{""}. @end deftypevr @deftypevr {paramètre de @code{repository-cgit-configuration}} repo-string readme -A path (relative to repo) which specifies a file to include verbatim as the -"About" page for this repo. +Un chemin (relatif au dépôt) qui spécifie un fichier à inclure directement +comme page « À propos » pour ce dépôt. La valeur par défaut est @samp{""}. @end deftypevr @deftypevr {paramètre de @code{repository-cgit-configuration}} repo-string section -The name of the current repository section - all repositories defined after -this option will inherit the current section name. +Le nom de la section de dépôts actuelle — tous les dépôts définis après ce +point hériterons du nom de section actuel. La valeur par défaut est @samp{""}. @end deftypevr @deftypevr {paramètre de @code{repository-cgit-configuration}} repo-list extra-options -Extra options will be appended to cgitrc file. +Options supplémentaires ajoutées à la fin du fichier cgitrc. La valeur par défaut est @samp{()}. @@ -21889,7 +22594,7 @@ La valeur par défaut est @samp{()}. @end deftypevr @deftypevr {paramètre de @code{cgit-configuration}} list extra-options -Extra options will be appended to cgitrc file. +Options supplémentaires ajoutées à la fin du fichier cgitrc. La valeur par défaut est @samp{()}. @@ -21898,23 +22603,24 @@ La valeur par défaut est @samp{()}. @c %end of fragment -However, it could be that you just want to get a @code{cgitrc} up and -running. In that case, you can pass an @code{opaque-cgit-configuration} as -a record to @code{cgit-service-type}. As its name indicates, an opaque -configuration does not have easy reflective capabilities. +Cependant, vous pourriez vouloir simplement récupérer un @code{cgitrc} et +l'utiliser. Dans ce cas, vous pouvez passer un +@code{opaque-cgit-configuration} comme enregistrement à +@code{cgit-service-type}. Comme son nom l'indique, une configuration opaque +n'a pas de capacité de réflexion facile. Les champs de @code{opaque-cgit-configuration} disponibles sont : @deftypevr {paramètre de @code{opaque-cgit-configuration}} package cgit -The cgit package. +Le paquet cgit. @end deftypevr @deftypevr {paramètre de @code{opaque-cgit-configuration}} string string -The contents of the @code{cgitrc}, as a string. +Le contenu de @code{cgitrc}, en tant que chaîne de caractère. @end deftypevr -For example, if your @code{cgitrc} is just the empty string, you could -instantiate a cgit service like this: +Par exemple, si votre @code{cgitrc} est juste la chaîne vide, vous pouvez +instancier un service cgit ainsi : @example (service cgit-service-type @@ -21926,14 +22632,14 @@ instantiate a cgit service like this: @cindex service Gitolite @cindex Git, hébergement -@uref{http://gitolite.com/gitolite/, Gitolite} is a tool for hosting Git -repositories on a central server. +@uref{http://gitolite.com/gitolite/, Gitolite} est un outil pour héberger +des dépôts Git sur un serveur central. -Gitolite can handle multiple repositories and users, and supports flexible -configuration of the permissions for the users on the repositories. +Gitolite peut gérer plusieurs dépôts et utilisateurs et supporte une +configuration flexible des permissions pour les utilisateurs sur ces dépôts. -The following example will configure Gitolite using the default @code{git} -user, and the provided SSH public key. +L'exemple suivant configure Gitolite en utilisant l'utilisateur @code{git} +par défaut et la clef SSH fournie. @example (service gitolite-service-type @@ -21943,18 +22649,18 @@ user, and the provided SSH public key. "ssh-rsa AAAA... guix@@example.com")))) @end example -Gitolite is configured through a special admin repository which you can -clone, for example, if you setup Gitolite on @code{example.com}, you would -run the following command to clone the admin repository. +Gitolite est configuré via un dépôt d'administration spécial que vous pouvez +cloner. Par exemple, si vous hébergez Gitolite sur @code{example.com}, vous +pouvez lancer la commande suivante pour cloner le dépôt d'administration : @example git clone git@@example.com:gitolite-admin @end example -When the Gitolite service is activated, the provided @code{admin-pubkey} -will be inserted in to the @file{keydir} directory in the gitolite-admin -repository. If this results in a change in the repository, it will be -committed using the message ``gitolite setup by GNU Guix''. +Lorsque le service Gitolite est activé, la clef @code{admin-pubkey} fournie +sera insérée dans le répertoire @file{keydir} du dépôt gitolite-admin. Si +cela change le dépôt, un commit sera effectué avec le message « gitolite +setup by GNU Guix ». @deftp {Type de données} gitolite-configuration Type de données représentant la configuration de @@ -21965,8 +22671,8 @@ Type de données représentant la configuration de Le paquet Gitolite à utiliser. @item @code{user} (par défaut : @var{git}) -User to use for Gitolite. This will be user that you use when accessing -Gitolite over SSH. +Utilisateur pour utiliser Gitolite. Cela sera l'utilisateur à utiliser pour +accéder à Gitolite par SSH. @item @code{group} (par défaut : @var{git}) Groupe à utiliser pour Gitolite. @@ -21983,7 +22689,8 @@ Un objet « simili-fichier » (@pxref{G-Expressions, file-like objects}) utilisé pour paramétrer Gitolite. Il sera inséré dans le répertoire @file{keydir} dans le dépôt gitolite-admin. -To specify the SSH key as a string, use the @code{plain-file} function. +Pour spécifier la clef SSH comme chaîne de caractère, utilisez la fonction +@code{plain-file}. @example (plain-file "yourname.pub" "ssh-rsa AAAA... guix@@example.com") @@ -21997,40 +22704,43 @@ Type de données représentant le fichier RC de Gitolite. @table @asis @item @code{umask} (par défaut : @code{#o0077}) -This controls the permissions Gitolite sets on the repositories and their -contents. +Cela contrôle les permissions que Gitolite propose sur les dépôts et leur +contenu. -A value like @code{#o0027} will give read access to the group used by -Gitolite (by default: @code{git}). This is necessary when using Gitolite -with software like cgit or gitweb. +Une valeur comme @code{#o0027} donnera accès en lecture au groupe utilisé +par Gitolite (par défaut : @code{git}). Cel aest nécessaire lorsque vous +utilise Gitolite avec un logiciel comme cgit ou gitweb. @item @code{git-config-keys} (par défaut : @code{""}) -Gitolite allows you to set git config values using the "config" -keyword. This setting allows control over the config keys to accept. +Gitolite vous permet de modifier les configurations git avec le mot-clef « +config ». Ce paramètre vous permet de contrôler les clefs de configuration +acceptables. @item @code{roles} (par défaut : @code{'(("READERS" . 1) ("WRITERS" . ))}) -Set the role names allowed to be used by users running the perms command. +Indique les noms des rôles qui peuvent être utilisés par les utilisateurs +avec la commande perms. @item @code{enable} (par défaut : @code{'("help" "desc" "info" "perms" "writable" "ssh-authkeys" "git-config" "daemon" "gitweb")}) -This setting controls the commands and features to enable within Gitolite. +Ce paramètre contrôle les commandes et les fonctionnalités à activer dans +Gitolite. @end table @end deftp @node Services de jeu -@subsubsection Services de jeu +@subsection Services de jeu -@subsubheading The Battle for Wesnoth Service +@subsubheading Le service de la Bataille pour Wesnoth @cindex wesnothd -@uref{https://wesnoth.org, The Battle for Wesnoth} is a fantasy, turn based -tactical strategy game, with several single player campaigns, and -multiplayer games (both networked and local). +@uref{https://wesnoth.org, La Bataille pour Wesnoth} est un jeu de stratégie +en tour par tour dans un univers fantastique, avec plusieurs campagnes solo +et des parties multijoueurs (en réseau et en local). @defvar {Variable Scheme} wesnothd-service-type -Service type for the wesnothd service. Its value must be a -@code{wesnothd-configuration} object. To run wesnothd in the default -configuration, instantiate it as: +Type de service pour le service wesnothd. Sa valeur doit être un objet +@code{wesnothd-configuration}. Pour lancer wesnothd avec la configuration +par défaut, instanciez-le ainsi : @example (service wesnothd-service-type) @@ -22038,29 +22748,29 @@ configuration, instantiate it as: @end defvar @deftp {Type de données} wesnothd-configuration -Data type representing the configuration of @command{wesnothd}. +Type de donées représentant la configuration de @command{wesnothd}. @table @asis @item @code{package} (par défaut : @code{wesnoth-server}) -The wesnoth server package to use. +Le paquet de serveur de wesnoth à utiliser. @item @code{port} (par défaut : @code{15000}) -The port to bind the server to. +Le pour sur lequel lier le serveur. @end table @end deftp @node Services divers -@subsubsection Services divers +@subsection Services divers -@cindex fingerprint +@cindex empreinte digitale @subsubheading Service d'empreintes digitales Le module @code{(gnu services fingerprint)} fournit un service DBus pour lire et identifier les empreintes digitales via un lecteur d'empreinte. @defvr {Variable Scheme} fprintd-service-type -The service type for @command{fprintd}, which provides the fingerprint -reading capability. +Le type de service pour @command{fprintd}, qui fournit des capacités de +lecture d'empreinte. @example (service fprintd-service-type) @@ -22068,15 +22778,15 @@ reading capability. @end defvr @cindex sysctl -@subsubheading System Control Service +@subsubheading Service de contrôle du système -The @code{(gnu services sysctl)} provides a service to configure kernel -parameters at boot. +Le module @code{(gnu services sysctl)} fournit un service pour configurer +les paramètres du noyau au démarrage. @defvr {Variable Scheme} sysctl-service-type -The service type for @command{sysctl}, which modifies kernel parameters -under @file{/proc/sys/}. To enable IPv4 forwarding, it can be instantiated -as: +Le type de service pour @command{sysctl}, qui modifie les paramètres du +noyau dans @file{/proc/sys/}. Pour activer le transfert d'IPv4, vous pouvez +l'instancier ainsi : @example (service sysctl-service-type @@ -22086,26 +22796,25 @@ as: @end defvr @deftp {Type de données} sysctl-configuration -The data type representing the configuration of @command{sysctl}. +Le type de données représentant la configuration de @command{sysctl}. @table @asis @item @code{sysctl} (par défaut : @code{(file-append procps "/sbin/sysctl"}) -The @command{sysctl} executable to use. +L'exécutable @command{sysctl} à utiliser. @item @code{settings} (par défaut : @code{'()}) -An association list specifies kernel parameters and their values. +Une liste d'association spécifiant les paramètres du noyau et leur valeur. @end table @end deftp @cindex pcscd -@subsubheading PC/SC Smart Card Daemon Service +@subsubheading Service du démon PC/SC Smart Card -The @code{(gnu services security-token)} module provides the following -service to run @command{pcscd}, the PC/SC Smart Card Daemon. -@command{pcscd} is the daemon program for pcsc-lite and the MuscleCard -framework. It is a resource manager that coordinates communications with -smart card readers, smart cards and cryptographic tokens that are connected -to the system. +Le module @code{(gnu services security-token)} fournit le service suivant +qui lance @command{pcscd}, le démon PC/SC Smart Card. @command{pcscd} est +le démon pour pcsc-lite et MuscleCard. C'est un gestionnaire de ressource +qui coordonne les communications avec les lecteurs de smart cards, les smart +cards et les jetons cryptographiques connectés au système. @defvr {Variable Scheme} pcscd-service-type Le type de service pour le service @command{pcscd}. Sa valeur doit être un @@ -22124,120 +22833,129 @@ Type de données représentant la configuration de @command{pcscd}. @item @code{pcsc-lite} (par défaut : @code{pcsc-lite}) Le paquet pcsc-lite qui fournit pcscd. @item @code{usb-drivers} (par défaut : @code{(list ccid)}) -List of packages that provide USB drivers to pcscd. Drivers are expected to -be under @file{pcsc/drivers} in the store directory of the package. +Liste des paquets qui fournissent des pilotes USB à pcscd. Les pilotes +doivent être dans @file{pcsc/drivers} dans le répertoire du dépôt du paquet. @end table @end deftp @cindex lirc -@subsubheading Lirc Service +@subsubheading Service Lirc -The @code{(gnu services lirc)} module provides the following service. +Le module @code{(gnu services lirc)} fournit le service suivant. @deffn {Procédure Scheme} lirc-service [#:lirc lirc] @ - [#:device #f] [#:driver #f] [#:config-file #f] @ [#:extra-options '()] -Return a service that runs @url{http://www.lirc.org,LIRC}, a daemon that -decodes infrared signals from remote controls. + [#:device #f] [#:driver #f] [#:config-file #f] @ +[#:extra-options '()] +Renvoie un service qui lance @url{http://www.lirc.org,LIRC}, un démon qui +décode les signaux infrarouges des télécommandes. -Optionally, @var{device}, @var{driver} and @var{config-file} (configuration -file name) may be specified. See @command{lircd} manual for details. +Éventuellement, @var{device}, @var{driver} et @var{config-file} (le nom du +fichier de configuration) peuvent être spécifiés. Voir le manuel de +@command{lircd} pour plus de détails. -Finally, @var{extra-options} is a list of additional command-line options -passed to @command{lircd}. +Enfin, @var{extra-options} est une liste d'options de la ligne de commande +supplémentaires à passer à @command{lircd}. @end deffn @cindex spice -@subsubheading Spice Service +@subsubheading Service Spice -The @code{(gnu services spice)} module provides the following service. +Le module @code{(gnu services spice)} fournit le service suivant. @deffn {Procédure Scheme} spice-vdagent-service [#:spice-vdagent] -Returns a service that runs @url{http://www.spice-space.org,VDAGENT}, a -daemon that enables sharing the clipboard with a vm and setting the guest -display resolution when the graphical console window resizes. +Renvoie un service qui lance @url{http://www.spice-space.org,VDAGENT}, un +démon qui permet le partage du presse-papier avec une vm et de configurer la +résolution d'affichage du client lorsque la fenêtre de la console graphique +est redimensionnée. @end deffn -@subsubsection Dictionary Services -@cindex dictionary -The @code{(gnu services dict)} module provides the following service: +@subsection Services de dictionnaires +@cindex dictionnaire +Le module @code{(gnu services dict)} fournit le service suivant : @deffn {Procédure Scheme} dicod-service [#:config (dicod-configuration)] -Return a service that runs the @command{dicod} daemon, an implementation of -DICT server (@pxref{Dicod,,, dico, GNU Dico Manual}). +Renvoie un service qui lance le démon @command{dicod}, une implémentation du +serveur DICT (@pxref{Dicod,,, dico, GNU Dico Manual}). -The optional @var{config} argument specifies the configuration for -@command{dicod}, which should be a @code{} object, by -default it serves the GNU Collaborative International Dictonary of English. +L'argument @var{config} facultatif spécifie la configuration pour +@command{dicod}, qui devrait être un objet @code{}, par +défaut il sert le dictionnaire international collaboratif de GNU pour +l'anglais. -You can add @command{open localhost} to your @file{~/.dico} file to make -@code{localhost} the default server for @command{dico} client -(@pxref{Initialization File,,, dico, GNU Dico Manual}). +Vous pouvez ajouter @command{open localhost} à votre fichier @file{~/.dico} +pour faire de @code{localhost} le serveur par défaut du client +@command{dico} (@pxref{Initialization File,,, dico, GNU Dico Manual}). @end deffn @deftp {Type de données} dicod-configuration -Data type representing the configuration of dicod. +Type de données représentant la configuration de dicod. @table @asis @item @code{dico} (par défaut : @var{dico}) -Package object of the GNU Dico dictionary server. +Objet de paquet du serveur de dictionnaire GNU Dico. @item @code{interfaces} (par défaut : @var{'("localhost")}) -This is the list of IP addresses and ports and possibly socket file names to -listen to (@pxref{Server Settings, @code{listen} directive,, dico, GNU Dico -Manual}). +C'est la liste des adresses IP et des ports et éventuellement des noms de +fichiers de socket sur lesquels écouter (@pxref{Server Settings, +@code{listen} directive,, dico, GNU Dico Manual}). @item @code{handlers} (par défaut : @var{'()}) -List of @code{} objects denoting handlers (module instances). +Liste des objets @code{} qui définissent des gestionnaires +(des instances de modules). @item @code{databases} (par défaut : @var{(list %dicod-database:gcide)}) -List of @code{} objects denoting dictionaries to be served. +Liste d'objets @code{} qui définissent des dictionnaires à +servir. @end table @end deftp @deftp {Type de données} dicod-handler -Data type representing a dictionary handler (module instance). +Type de données représentant un gestionnaire de dictionnaire (instance de +module). @table @asis @item @code{name} -Name of the handler (module instance). +Nom du gestionnaire (instance de module). @item @code{module} (par défaut : @var{#f}) -Name of the dicod module of the handler (instance). If it is @code{#f}, the -module has the same name as the handler. (@pxref{Modules,,, dico, GNU Dico -Manual}). +Nom du module dicod du gestionnaire (instance). Si la valeur est @code{#f}, +le module a le même nom que le gestionnaire. (@pxref{Modules,,, dico, GNU +Dico Manual}). @item @code{options} -List of strings or gexps representing the arguments for the module handler +Liste de chaînes ou de gexps représentant les arguments pour le gestionnaire +de module. @end table @end deftp @deftp {Type de données} dicod-database -Data type representing a dictionary database. +Type de données représentant une base de données de dictionnaire. @table @asis @item @code{name} -Name of the database, will be used in DICT commands. +Nom de la base de données, qui sera utilisée dans les commande DICT. @item @code{handler} -Name of the dicod handler (module instance) used by this database -(@pxref{Handlers,,, dico, GNU Dico Manual}). +Nom du gestionnaire dicod (instance de module) utilisé par cette base de +données (@pxref{Handlers,,, dico, GNU Dico Manual}). @item @code{complex?} (par défaut : @var{#f}) -Whether the database configuration complex. The complex configuration will -need a corresponding @code{} object, otherwise not. +Indique si la configuration est pour une base de données complexe. La +configuration complexe a besoin d'un objet @code{} +correspondant, sinon inutile. @item @code{options} -List of strings or gexps representing the arguments for the database -(@pxref{Databases,,, dico, GNU Dico Manual}). +Liste de chaînes ou de gexps représentant les arguments pour la base de +données (@pxref{Databases,,, dico, GNU Dico Manual}). @end table @end deftp @defvr {Variable Scheme} %dicod-database:gcide -A @code{} object serving the GNU Collaborative International -Dictionary of English using the @code{gcide} package. +Un objet @code{} servant le dictionnaire international +collaboratif en anglais via le paquet @code{gcide}. @end defvr -The following is an example @code{dicod-service} configuration. +Voici un exemple de configuration de @code{dicod-service}. @example (dicod-service #:config @@ -22255,91 +22973,127 @@ The following is an example @code{dicod-service} configuration. %dicod-database:gcide)))) @end example +@cindex Docker +@subsubheading Docker Service + +The @code{(gnu services docker)} module provides the following service. + +@defvr {Scheme Variable} docker-service-type + +This is the type of the service that runs +@url{http://www.docker.com,Docker}, a daemon that can execute application +bundles (sometimes referred to as ``containers'') in isolated environments. + +@end defvr + +@deftp {Data Type} docker-configuration +This is the data type representing the configuration of Docker and +Containerd. + +@table @asis + +@item @code{package} (default: @code{docker}) +The Docker package to use. + +@item @code{containerd} (default: @var{containerd}) +The Containerd package to use. + +@end table +@end deftp + @node Programmes setuid -@subsection Programmes setuid - -@cindex setuid programs -Some programs need to run with ``root'' privileges, even when they are -launched by unprivileged users. A notorious example is the @command{passwd} -program, which users can run to change their password, and which needs to -access the @file{/etc/passwd} and @file{/etc/shadow} files---something -normally restricted to root, for obvious security reasons. To address that, -these executables are @dfn{setuid-root}, meaning that they always run with -root privileges (@pxref{How Change Persona,,, libc, The GNU C Library -Reference Manual}, for more info about the setuid mechanism.) - -The store itself @emph{cannot} contain setuid programs: that would be a -security issue since any user on the system can write derivations that -populate the store (@pxref{Le dépôt}). Thus, a different mechanism is -used: instead of changing the setuid bit directly on files that are in the -store, we let the system administrator @emph{declare} which programs should -be setuid root. - -The @code{setuid-programs} field of an @code{operating-system} declaration -contains a list of G-expressions denoting the names of programs to be -setuid-root (@pxref{Utiliser le système de configuration}). For instance, the -@command{passwd} program, which is part of the Shadow package, can be -designated by this G-expression (@pxref{G-Expressions}): +@section Programmes setuid + +@cindex programmes setuid +Certains programmes doivent être lancés avec les privilèges « root » même +lorsqu'ils sont lancés par un utilisateur non privilégié. Un exemple +notoire est le programme @command{passwd}, que les utilisateurs peuvent +appeler pour modifier leur mot de passe et qui doit accéder à +@file{/etc/passwd} et @file{/etc/shadow} — ce qui est normalement réservé à +root, pour des raisons de sécurité évidentes. Pour contourner cela, ces +exécutables sont @dfn{setuid-root}, ce qui signifie qu'ils seront toujours +lancés avec les privilèges root (@pxref{How Change Persona,,, libc, The GNU +C Library Reference Manual}, pour plus d'informations sur le mécanisme +setuid). + +Le dépôt lui-même ne @emph{peut pas} contenir de programmes setuid ; cela +serait un problème de sécurité puisque n'importe quel utilisateur du système +peut écrire une dérivation qui rempli le dépôt (@pxref{Le dépôt}). Donc, +un mécanisme différent est utilisé : au lieu de changer le bit setuid +directement sur les fichiers qui sont dans le dépôt, nous laissons à +l'administrateur système le soit de @emph{déclarer} les programmes qui +devraient être setuid root. + +Le champ @code{setuid-programs} d'une déclaration @code{operating-system} +contient une liste de G-expressions qui dénotent les noms des programmes à +rendre setuid-root (@pxref{Utiliser le système de configuration}). Par exemple, +le programme @command{passwd}, qui fait partie du paquet Shadow, peut être +désigné par cette G-expression (@pxref{G-Expressions}) : @example #~(string-append #$shadow "/bin/passwd") @end example -A default set of setuid programs is defined by the @code{%setuid-programs} -variable of the @code{(gnu system)} module. +Un ensemble de programmes par défaut est défini par la variable +@code{%setuid-programs} du module @code{(gnu system)}. @defvr {Variable Scheme} %setuid-programs -A list of G-expressions denoting common programs that are setuid-root. +Une liste de G-expressions qui dénotent les programmes communément +setuid-root. -The list includes commands such as @command{passwd}, @command{ping}, -@command{su}, and @command{sudo}. +La liste inclus des commandes comme @command{passwd}, @command{ping}, +@command{su} et @command{sudo}. @end defvr -Under the hood, the actual setuid programs are created in the -@file{/run/setuid-programs} directory at system activation time. The files -in this directory refer to the ``real'' binaries, which are in the store. +Sous le capot, les programmes setuid sont créés dans le répertoire +@file{/run/setuid-programs} au moment de l'activation du système. Les +fichiers dans ce répertoire se réfèrent aux « vrais » binaires, qui sont +dans le dépot. @node Certificats X.509 -@subsection Certificats X.509 +@section Certificats X.509 -@cindex HTTPS, certificates -@cindex X.509 certificates +@cindex HTTPS, certificats +@cindex certificats X.509 @cindex TLS -Web servers available over HTTPS (that is, HTTP over the transport-layer -security mechanism, TLS) send client programs an @dfn{X.509 certificate} -that the client can then use to @emph{authenticate} the server. To do that, -clients verify that the server's certificate is signed by a so-called -@dfn{certificate authority} (CA). But to verify the CA's signature, clients -must have first acquired the CA's certificate. - -Web browsers such as GNU@tie{}IceCat include their own set of CA -certificates, such that they are able to verify CA signatures -out-of-the-box. - -However, most other programs that can talk HTTPS---@command{wget}, -@command{git}, @command{w3m}, etc.---need to be told where CA certificates -can be found. +Les serveurs web disponibles par HTTPS (c'est-à-dire HTTP sur le mécanisme +de la couche de transport sécurisée, TLS) envoient aux clients un +@dfn{certificat X.509} que les clients peuvent utiliser pour +@emph{authentifier} le serveur. Pour cela, les clients vérifient que le +certificat du serveur est signé par une @dfn{autorité de certification} (AC +ou CA). Mais pour vérifier la signature de la CA, les clients doivent +d'abord avoir récupéré le certificat de la CA. + +Les navigateurs web comme GNU@tie{}IceCat incluent leur propre liste de +certificats, pour qu'ils puissent vérifier les signatures des CA +directement. + +Cependant, la plupart des autres programmes qui peuvent parler HTTPS — +@command{wget}, @command{git}, @command{w3m}, etc — doivent savoir où +trouver les certificats des CA. @cindex @code{nss-certs} -In GuixSD, this is done by adding a package that provides certificates to -the @code{packages} field of the @code{operating-system} declaration -(@pxref{Référence de système d'exploitation}). GuixSD includes one such package, +In Guix, this is done by adding a package that provides certificates to the +@code{packages} field of the @code{operating-system} declaration +(@pxref{Référence de système d'exploitation}). Guix includes one such package, @code{nss-certs}, which is a set of CA certificates provided as part of Mozilla's Network Security Services. -Note that it is @emph{not} part of @var{%base-packages}, so you need to -explicitly add it. The @file{/etc/ssl/certs} directory, which is where most -applications and libraries look for certificates by default, points to the -certificates installed globally. - -Unprivileged users, including users of Guix on a foreign distro, can also -install their own certificate package in their profile. A number of -environment variables need to be defined so that applications and libraries -know where to find them. Namely, the OpenSSL library honors the -@code{SSL_CERT_DIR} and @code{SSL_CERT_FILE} variables. Some applications -add their own environment variables; for instance, the Git version control -system honors the certificate bundle pointed to by the @code{GIT_SSL_CAINFO} -environment variable. Thus, you would typically run something like: +Remarquez qu'il ne fait @emph{pas} partie de @var{%base-packages}, donc vous +devez explicitement l'ajouter. Le répertoire @file{/etc/ssl/certs}, là où +la plupart des applications et bibliothèques vont rechercher les certificats +par défaut, pointe vers les certificats installés globalement. + +Les utilisateurs non privilégiés, dont les utilisateurs de Guix sur une +distro externe, peuvent aussi installer leur propre paquet de certificats +dans leur profil. Un certain nombre de variables d'environnement doivent +être définies pour que les applications et les bibliothèques puissent les +trouver. En particulier, la bibliothèque OpenSSL honore les variables +@code{SSL_CERT_DIR} et @code{SSL_CERT_FILE}. Certaines applications +ajoutent leurs propres variables, par exemple le système de contrôle de +version Git honore le lot de certificats pointé par la variable +d'environnement @code{GIT_SSL_CAINFO}. Ainsi, vous lanceriez quelque chose +comme ceci : @example $ guix package -i nss-certs @@ -22348,107 +23102,110 @@ $ export SSL_CERT_FILE="$HOME/.guix-profile/etc/ssl/certs/ca-certificates.crt" $ export GIT_SSL_CAINFO="$SSL_CERT_FILE" @end example -As another example, R requires the @code{CURL_CA_BUNDLE} environment -variable to point to a certificate bundle, so you would have to run -something like this: +Un autre exemple serait R, qui requière que la variable d'environnement +@code{CURL_CA_BUNDLE} pointe sur le lot de certificats, donc vous lanceriez +quelque chose comme ceci : @example $ guix package -i nss-certs $ export CURL_CA_BUNDLE="$HOME/.guix-profile/etc/ssl/certs/ca-certificates.crt" @end example -For other applications you may want to look up the required environment -variable in the relevant documentation. +Pour d'autres applications vous pourriez avoir besoin de chercher la +variable d'environnement requise dans leur documentation. @node Name Service Switch -@subsection Name Service Switch +@section Name Service Switch @cindex name service switch @cindex NSS -The @code{(gnu system nss)} module provides bindings to the configuration -file of the libc @dfn{name service switch} or @dfn{NSS} (@pxref{NSS -Configuration File,,, libc, The GNU C Library Reference Manual}). In a -nutshell, the NSS is a mechanism that allows libc to be extended with new -``name'' lookup methods for system databases, which includes host names, -service names, user accounts, and more (@pxref{Name Service Switch, System +Le module @code{(gnu system nss)} fournit des liaisons pour le fichier de +configuration du @dfn{name service switch} ou @dfn{NSS} de la libc +(@pxref{NSS Configuration File,,, libc, The GNU C Library Reference +Manual}). En résumé, NSS est un mécanisme qui permet à la libc d'être +étendue avec de nouvelles méthodes de résolution de « noms » dans les bases +de données du système, comme les noms d'hôtes, les noms des services, les +comptes utilisateurs et bien plus (@pxref{Name Service Switch, System Databases and Name Service Switch,, libc, The GNU C Library Reference Manual}). -The NSS configuration specifies, for each system database, which lookup -method is to be used, and how the various methods are chained together---for -instance, under which circumstances NSS should try the next method in the -list. The NSS configuration is given in the @code{name-service-switch} -field of @code{operating-system} declarations (@pxref{Référence de système d'exploitation, @code{name-service-switch}}). +La configuration de NSS spécifie, pour chaque base de données du système, +quelle méthode de résolution utiliser, et comment les diverses méthodes sont +enchaînées — par exemple, sous certaines circonstances, NSS devrait essayer +la méthode suivante de la liste. La configuration de NSS est donnée dans le +champ @code{name-service-switch} de la déclaration @code{operating-system} +(@pxref{Référence de système d'exploitation, @code{name-service-switch}}). @cindex nss-mdns -@cindex .local, host name lookup -As an example, the declaration below configures the NSS to use the -@uref{http://0pointer.de/lennart/projects/nss-mdns/, @code{nss-mdns} -back-end}, which supports host name lookups over multicast DNS (mDNS) for -host names ending in @code{.local}: +@cindex .local, résolution de nom d'hôte +Par exemple, la déclation ci-dessous configure NSS pour utiliser le +@uref{http://0pointer.de/lennart/projects/nss-mdns/, moteur +@code{nss-mdns}}, qui supporte la résolution de nom d'hôte sur le DNS +multicast (mDNS) pour les noms d'hôtes terminant par @code{.local} : @example (name-service-switch (hosts (list %files ;first, check /etc/hosts - ;; If the above did not succeed, try - ;; with 'mdns_minimal'. + ;; Si ce qui précède n'a pas fonctionné, essayer + ;; avec « mdns_minimal ». (name-service (name "mdns_minimal") - ;; 'mdns_minimal' is authoritative for - ;; '.local'. When it returns "not found", - ;; no need to try the next methods. + ;; « mdns_minimal » fait autorité pour + ;; « .local ». Lorsqu'il renvoie « pas trouvé », + ;; inutile d'essayer la méthode suivante. (reaction (lookup-specification (not-found => return)))) - ;; Then fall back to DNS. + ;; Puis revenir sur DNS. (name-service (name "dns")) - ;; Finally, try with the "full" 'mdns'. + ;; Enfin, essayer avec « mdns complet ». (name-service (name "mdns"))))) @end example -Do not worry: the @code{%mdns-host-lookup-nss} variable (see below) -contains this configuration, so you will not have to type it if all you want -is to have @code{.local} host lookup working. +Ne vous inquiétez pas : la variable @code{%mdns-host-lookup-nss} (voir plus +bas) contient cette configuration, donc vous n'avez pas besoin de tout taper +si vous voulez simplement que la résolution de nom en @code{.local} +fonctionne. Note that, in this case, in addition to setting the @code{name-service-switch} of the @code{operating-system} declaration, you -also need to use @code{avahi-service} (@pxref{Services réseau, -@code{avahi-service}}), or @var{%desktop-services}, which includes it +also need to use @code{avahi-service-type} (@pxref{Services réseau, +@code{avahi-service-type}}), or @var{%desktop-services}, which includes it (@pxref{Services de bureaux}). Doing this makes @code{nss-mdns} accessible to the name service cache daemon (@pxref{Services de base, @code{nscd-service}}). -For convenience, the following variables provide typical NSS configurations. +Pour votre confort, les variables suivantes contiennent des configurations +NSS typiques. @defvr {Variable Scheme} %default-nss -This is the default name service switch configuration, a -@code{name-service-switch} object. +C'est la configuration NSS par défaut, un objet @code{name-service-switch}. @end defvr @defvr {Variable Scheme} %mdns-host-lookup-nss -This is the name service switch configuration with support for host name -lookup over multicast DNS (mDNS) for host names ending in @code{.local}. +C'est la configuration NSS avec le support de la résolution de noms sur DNS +multicast (mDNS) pour les noms d'hôtes en @code{.local}. @end defvr -The reference for name service switch configuration is given below. It is a -direct mapping of the configuration file format of the C library , so please -refer to the C library manual for more information (@pxref{NSS Configuration -File,,, libc, The GNU C Library Reference Manual}). Compared to the -configuration file format of libc NSS, it has the advantage not only of -adding this warm parenthetic feel that we like, but also static checks: you -will know about syntax errors and typos as soon as you run @command{guix +La référence pour la configuration de NSS est donnée ci-dessous. C'est une +correspondance directe avec le format de fichier de la bibliothèque C, donc +référez-vous au manuel de la bibliothèque C pour plus d'informations +(@pxref{NSS Configuration File,,, libc, The GNU C Library Reference +Manual}). Comparé au format de fichier de configuration de NSS, cette +configuration a l'avantage non seulement d'ajouter ces bonnes vieilles +parenthèses, mais aussi des vérifications statiques ; vous saurez s'il y a +des erreurs de syntaxe et des coquilles dès que vous lancerez @command{guix system}. @deftp {Type de données} name-service-switch -This is the data type representation the configuration of libc's name -service switch (NSS). Each field below represents one of the supported -system databases. +C'est le type de données représentant la configuration de NSS. Chaque champ +ci-dessous représente l'un des système de bases de données supportés. @table @code @item aliases @@ -22464,30 +23221,30 @@ system databases. @itemx rpc @itemx services @itemx shadow -The system databases handled by the NSS. Each of these fields must be a -list of @code{} objects (see below). +Les bases de données du système gérées par NSS. Chaque champ doit être une +liste d'objets @code{} (voir plus bas). @end table @end deftp @deftp {Type de données} name-service -This is the data type representing an actual name service and the associated -lookup action. +C'est le type de données représentant un service de noms et l'action de +résolution associée. @table @code @item name -A string denoting the name service (@pxref{Services in the NSS +Une chaîne dénotant le service de nom (@pxref{Services in the NSS configuration,,, libc, The GNU C Library Reference Manual}). -Note that name services listed here must be visible to nscd. This is -achieved by passing the @code{#:name-services} argument to -@code{nscd-service} the list of packages providing the needed name services +Remarquez que les services de dnoms listés ici doivent être visibles à +nscd. Cela se fait en passant la liste des paquets fournissant les services +de noms à l'argument @code{#:name-services} de @code{nscd-service} (@pxref{Services de base, @code{nscd-service}}). @item reaction -An action specified using the @code{lookup-specification} macro +Une action spécifiée par la macro @code{lookup-specification} (@pxref{Actions in the NSS configuration,,, libc, The GNU C Library -Reference Manual}). For example: +Reference Manual}). Par exemple : @example (lookup-specification (unavailable => continue) @@ -22497,23 +23254,24 @@ Reference Manual}). For example: @end deftp @node Disque de RAM initial -@subsection Disque de RAM initial +@section Disque de RAM initial @cindex initrd @cindex disque de RAM initial -For bootstrapping purposes, the Linux-Libre kernel is passed an @dfn{initial -RAM disk}, or @dfn{initrd}. An initrd contains a temporary root file system -as well as an initialization script. The latter is responsible for mounting -the real root file system, and for loading any kernel modules that may be -needed to achieve that. - -The @code{initrd-modules} field of an @code{operating-system} declaration -allows you to specify Linux-libre kernel modules that must be available in -the initrd. In particular, this is where you would list modules needed to -actually drive the hard disk where your root partition is---although the -default value of @code{initrd-modules} should cover most use cases. For -example, assuming you need the @code{megaraid_sas} module in addition to the -default modules to be able to access your root file system, you would write: +Pour le démarrage, on passe au noyau Linux-Libre un @dfn{disque de RAM +initial} ou @dfn{initrd}. Un initrd contient un système de fichier racine +temporaire ainsi qu'un script d'initialisation. Ce dernier est responsable +du montage du vrai système de fichier racine et du chargement des modules du +noyau qui peuvent être nécessaires à cette tâche. + +Le champ @code{initrd-modules} d'une déclaration @code{operating-system} +vous permet de spécifier les modules du noyau Linux-Libre qui doivent être +disponibles dans l'initrd. En particulier, c'est là où vous devez lister +les modules requis pour effectivement piloter le disque dur où se trouve la +partition racine — bien que la valeur par défaut de @code{initrd-modules} +couvre la plupart des cas. Par exemple, en supposant que vous ayez besoin +du module @code{megaraid_sas} en plus des modules par défaut pour accéder à +votre système de fichiers racine, vous écririez : @example (operating-system @@ -22522,372 +23280,388 @@ default modules to be able to access your root file system, you would write: @end example @defvr {Variable Scheme} %base-initrd-modules -This is the list of kernel modules included in the initrd by default. +C'est la liste des modules du noyau inclus dans l'initrd par défaut. @end defvr -Furthermore, if you need lower-level customization, the @code{initrd} field -of an @code{operating-system} declaration allows you to specify which initrd -you would like to use. The @code{(gnu system linux-initrd)} module provides -three ways to build an initrd: the high-level @code{base-initrd} procedure -and the low-level @code{raw-initrd} and @code{expression->initrd} -procedures. +En plus, si vous avez besoin de paramétrages plus bas niveau, le champ +@code{initrd} d'une déclaration @code{operating-system} vous permet de +spécifier quel initrd vous voudriez utiliser. Le module @code{(gnu system +linux-initrd)} fournit trois manières de construire un initrd : la procédure +@code{base-initrd} de haut niveau et les procédures @code{raw-initrd} et +@code{expression->initrd} de bas niveau. -The @code{base-initrd} procedure is intended to cover most common uses. For -example, if you want to add a bunch of kernel modules to be loaded at boot -time, you can define the @code{initrd} field of the operating system -declaration like this: +La procédure @code{base-initrd} est conçue pour couvrir la plupart des +usages courants. Par exemple, si vous voulez ajouter des modules du noyau à +charger au démarrage, vous pouvez définir le champ @code{initrd} de votre +déclaration de système d'exploitation ainsi : @example (initrd (lambda (file-systems . rest) - ;; Create a standard initrd but set up networking - ;; with the parameters QEMU expects by default. + ;; Crée un initrd standard mais paramètre le réseau + ;; avec les paramètres que QEMU attend par défaut. (apply base-initrd file-systems #:qemu-networking? #t rest))) @end example -The @code{base-initrd} procedure also handles common use cases that involves -using the system as a QEMU guest, or as a ``live'' system with volatile root -file system. +La procédure @code{base-initrd} gère aussi les cas d'utilisation courants +qui concernent l'utilisation du système comme client QEMU, ou comme un +système « live » avec un système de fichier racine volatile. -The @code{base-initrd} procedure is built from @code{raw-initrd} procedure. -Unlike @code{base-initrd}, @code{raw-initrd} doesn't do anything high-level, -such as trying to guess which kernel modules and packages should be included -to the initrd. An example use of @code{raw-initrd} is when a user has a -custom Linux kernel configuration and default kernel modules included by -@code{base-initrd} are not available. +La procédure @code{base-initrd} est construite à partir de la procédure +@code{raw-initrd}. Contrairement à @code{base-initrd}, @code{raw-initrd} ne +fait rien à haut-niveau, comme essayer de deviner les modules du noyau et +les paquets qui devraient être inclus dans l'initrd. Un exemple +d'utilisation de @code{raw-initrd} serait si un utilisateur a une +configuration personnalisée du noyau Linux et que les modules du noyau +inclus par défaut par @code{base-initrd} ne sont pas disponibles. -The initial RAM disk produced by @code{base-initrd} or @code{raw-initrd} -honors several options passed on the Linux kernel command line (that is, -arguments passed @i{via} the @code{linux} command of GRUB, or the -@code{-append} option of QEMU), notably: +Le disque de RAM initial produit par @code{base-initrd} ou @code{raw-initrd} +honore plusieurs options passées par la ligne de commande du noyau Linux +(c'est-à-dire les arguments passés via la commande @code{linux} de GRUB ou +l'option @code{-append} de QEMU), notamment : @table @code @item --load=@var{boot} -Tell the initial RAM disk to load @var{boot}, a file containing a Scheme -program, once it has mounted the root file system. +Dit au disque de RAM initial de charger @var{boot}, un fichier contenant un +programme Scheme, une fois qu'il a monté le système de fichier racine. -GuixSD uses this option to yield control to a boot program that runs the +Guix uses this option to yield control to a boot program that runs the service activation programs and then spawns the GNU@tie{}Shepherd, the initialization system. @item --root=@var{root} -Mount @var{root} as the root file system. @var{root} can be a device name -like @code{/dev/sda1}, a file system label, or a file system UUID. +Monte @var{root} comme système de fichier racine. @var{root} peut être un +nom de périphérique comme @code{/dev/sda1}, une étiquette de système de +fichiers ou un UUID de système de fichiers. @item --system=@var{système} -Have @file{/run/booted-system} and @file{/run/current-system} point to -@var{system}. +S'assure que @file{/run/booted-system} et @file{/run/current-system} +pointent vers @var{system}. @item modprobe.blacklist=@var{modules}@dots{} -@cindex module, black-listing -@cindex black list, of kernel modules -Instruct the initial RAM disk as well as the @command{modprobe} command -(from the kmod package) to refuse to load @var{modules}. @var{modules} must -be a comma-separated list of module names---e.g., @code{usbkbd,9pnet}. +@cindex module, black-list +@cindex black-list, des modules du noyau +Dit au disque de RAM initial ainsi qu'à la commande @command{modprobe} (du +paquet kmod) de refuser de charger @var{modules}. @var{modules} doit être +une liste de noms de modules séparés par des virgules — p.@: ex.@: +@code{usbkbd,9pnet}. @item --repl -Start a read-eval-print loop (REPL) from the initial RAM disk before it -tries to load kernel modules and to mount the root file system. Our -marketing team calls it @dfn{boot-to-Guile}. The Schemer in you will love -it. @xref{Using Guile Interactively,,, guile, GNU Guile Reference Manual}, -for more information on Guile's REPL. +Démarre une boucle lecture-évaluation-affichage (REPL) depuis le disque de +RAM initial avant qu'il n'essaye de charger les modules du noyau et de +monter le système de fichiers racine. Notre équipe commerciale appelle cela +@dfn{boot-to-Guile}. Le Schemeur en vous va adorer. @xref{Using Guile +Interactively,,, guile, GNU Guile Reference Manual}, pour plus d'information +sur le REPL de Guile. @end table -Now that you know all the features that initial RAM disks produced by -@code{base-initrd} and @code{raw-initrd} provide, here is how to use it and -customize it further. +Maintenant que vous connaissez toutes les fonctionnalités des disques de RAM +initiaux produits par @code{base-initrd} et @code{raw-initrd}, voici comment +l'utiliser le personnalisé plus avant. @cindex initrd @cindex disque de RAM initial @deffn {Procédure Scheme} raw-initrd @var{file-systems} @ - [#:linux-modules '()] [#:mapped-devices '()] @ [#:helper-packages '()] -[#:qemu-networking? #f] [#:volatile-root? #f] Return a derivation that -builds a raw initrd. @var{file-systems} is a list of file systems to be -mounted by the initrd, possibly in addition to the root file system -specified on the kernel command line via @code{--root}. @var{linux-modules} -is a list of kernel modules to be loaded at boot time. @var{mapped-devices} -is a list of device mappings to realize before @var{file-systems} are -mounted (@pxref{Périphériques mappés}). @var{helper-packages} is a list of -packages to be copied in the initrd. It may include @code{e2fsck/static} or -other packages needed by the initrd to check the root file system. - -When @var{qemu-networking?} is true, set up networking with the standard -QEMU parameters. When @var{virtio?} is true, load additional modules so -that the initrd can be used as a QEMU guest with para-virtualized I/O -drivers. - -When @var{volatile-root?} is true, the root file system is writable but any -changes to it are lost. + [#:linux-modules '()] [#:mapped-devices '()] @ +[#:helper-packages '()] [#:qemu-networking? #f] [#:volatile-root? #f] +Renvoie une dérivation qui construit un initrd. @var{file-systems} est une +liste de systèmes de fichiers à monter par l'initrd, éventuellement en plus +du système de fichier racine spécifié sur la ligne de commande du noyau via +@code{--root}. @var{linux-modules} est une liste de modules du noyau à +charger au démarrage. @var{mapped-devices} est une liste de correspondances +de périphériques à réaliser avant que les @var{file-systems} ne soient +montés (@pxref{Périphériques mappés}). @var{helper-packages} est une liste de +paquets à copier dans l'initrd. Elle peut inclure @code{e2fsck/static} ou +d'autres paquets requis par l'initrd pour vérifier le système de fichiers +racine. + +Lorsque @var{qemu-networking?} est vrai, paramètre le réseau avec les +paramètres QEMU standards. Lorsque @var{virtio?} est vrai, charge des +modules supplémentaires pour que l'initrd puisse être utilisé comme client +QEMU avec les pilotes I/O para-virtualisés. + +Lorsque @var{volatile-root?} est vrai, le système de fichier racine est +inscriptible mais tous les changements seront perdus. @end deffn @deffn {Procédure Scheme} base-initrd @var{file-systems} @ - [#:mapped-devices '()] [#:qemu-networking? #f] [#:volatile-root? #f]@ -[#:linux-modules '()] Return as a file-like object a generic initrd, with -kernel modules taken from @var{linux}. @var{file-systems} is a list of -file-systems to be mounted by the initrd, possibly in addition to the root -file system specified on the kernel command line via @code{--root}. -@var{mapped-devices} is a list of device mappings to realize before -@var{file-systems} are mounted. - -@var{qemu-networking?} and @var{volatile-root?} behaves as in + [#:mapped-devices '()] [#:qemu-networking? #f] [#:volatile-root? #f] @ +[#:linux-modules '()] +Renvoie un objet simili-fichier contenant un initrd générique, avec les +modules du noyau de @var{linux}. @var{file-systems} est une liste de +systèmes de fichiers à monter par l'initrd, éventuellement en plus du +système de fichiers racine spécifié sur la ligne de commande du noyau via +@code{--root}. @var{mapped-devices} est une liste de correspondances de +périphériques à réaliser avant de monter les @var{file-systems}. + +@var{qemu-networking?} et @var{volatile-root?} se comportent comme pour @code{raw-initrd}. -The initrd is automatically populated with all the kernel modules necessary -for @var{file-systems} and for the given options. Additional kernel modules -can be listed in @var{linux-modules}. They will be added to the initrd, and -loaded at boot time in the order in which they appear. +L'initrd est automatiquement remplie avec tous les modules du noyau requis +pour @var{file-systems} et pour les options données. On peut lister des +modules supplémentaires dans @var{linux-modules}. Ils seront ajoutés à +l'initrd et chargés au démarrage dans l'ordre dans lequel ils apparaissent. @end deffn -Needless to say, the initrds we produce and use embed a statically-linked -Guile, and the initialization program is a Guile program. That gives a lot -of flexibility. The @code{expression->initrd} procedure builds such an -initrd, given the program to run in that initrd. +Inutile de le dire, les initrds que nous produisons et utilisons incluent +une version de Guile liée statiquement, et le programme d'initialisation est +un programme Guile. Cela donne beaucoup de flexibilité. La procédure +@code{expression->initrd} construit un tel initrd, étant donné le programme +à lancer dans cet initrd. @deffn {Procédure Scheme} expression->initrd @var{exp} @ - [#:guile %guile-static-stripped] [#:name "guile-initrd"] Return as a -file-like object a Linux initrd (a gzipped cpio archive) containing -@var{guile} and that evaluates @var{exp}, a G-expression, upon booting. All -the derivations referenced by @var{exp} are automatically copied to the -initrd. + [#:guile %guile-static-stripped] [#:name "guile-initrd"] +Renvoie un objet simili-fichier contenant un initrd Linux (une archive cpio +compressée avec gzip) contenant @var{guile} et qui évalue @var{exp}, une +G-expression, au démarrage. Toutes les dérivations référencées par +@var{exp} sont automatiquement copiées dans l'initrd. @end deffn @node Configuration du chargeur d'amorçage -@subsection Configuration du chargeur d'amorçage +@section Configuration du chargeur d'amorçage @cindex bootloader -@cindex boot loader +@cindex chargeur d'amorçage -The operating system supports multiple bootloaders. The bootloader is -configured using @code{bootloader-configuration} declaration. All the -fields of this structure are bootloader agnostic except for one field, -@code{bootloader} that indicates the bootloader to be configured and -installed. +Le système d'exploitation supporte plusieurs chargeurs d'amorçage. La +configuration du chargeur d'amorçage se fait avec la déclaration +@code{bootloader-configuration}. Tous les champs de cette structure sont +indépendants du chargeur d'amorçage sauf un, @code{bootloader} qui indique +le chargeur d'amorçage à configurer et à installer. -Some of the bootloaders do not honor every field of -@code{bootloader-configuration}. For instance, the extlinux bootloader does -not support themes and thus ignores the @code{theme} field. +Certains chargeurs d'amorçage ne respectent pas tous les champs de +@code{bootloader-configuration}. Par exemple, le chargeur d'amorçage +extlinux ne supporte pas les thèmes et ignore donc le champ @code{theme}. @deftp {Type de données} bootloader-configuration -The type of a bootloader configuration declaration. +Le type d'une déclaration de configuration de chargeur d'amorçage. @table @asis @item @code{bootloader} -@cindex EFI, bootloader -@cindex UEFI, bootloader -@cindex BIOS, bootloader -The bootloader to use, as a @code{bootloader} object. For now -@code{grub-bootloader}, @code{grub-efi-bootloader}, -@code{extlinux-bootloader} and @code{u-boot-bootloader} are supported. +@cindex EFI, chargeur d'amorçage +@cindex UEFI, chargeur d'amorçage +@cindex BIOS, chargeur d'amorçage +Le chargeur d'amorçage à utiliser, comme objet @code{bootloader}. Pour +l'instant @code{grub-bootloader}, @code{grub-efi-bootloader}, +@code{extlinux-bootloader} et @code{u-boot-bootloader} sont supportés. @vindex grub-efi-bootloader -@code{grub-efi-bootloader} allows to boot on modern systems using the -@dfn{Unified Extensible Firmware Interface} (UEFI). This is what you should -use if the installation image contains a @file{/sys/firmware/efi} directory -when you boot it on your system. +@code{grub-efi-bootloader} permet de démarrer sur un système moderne qui +utilise l'UEFI (@dfn{Unified Extensible Firmware Interface}). C'est ce que +vous devriez utiliser si l'image d'installation contient un répertoire +@file{/sys/firmware/efi} lorsque vous démarrez dessus sur votre machine. @vindex grub-bootloader -@code{grub-bootloader} allows you to boot in particular Intel-based machines -in ``legacy'' BIOS mode. +@code{grub-bootloader} vous permet de démarrer en particulier sur des +machines Intel en mode BIOS « legacy ». @cindex ARM, chargeurs d'amorçage @cindex AArch64, chargeurs d'amorçage -Available bootloaders are described in @code{(gnu bootloader @dots{})} -modules. In particular, @code{(gnu bootloader u-boot)} contains definitions -of bootloaders for a wide range of ARM and AArch64 systems, using the -@uref{http://www.denx.de/wiki/U-Boot/, U-Boot bootloader}. +Les chargeurs d'amorçage disponibles sont décrits dans les modules +@code{(gnu bootloader @dots{})}. En particulier, @code{(gnu bootloader +u-boot)} contient des définitions de chargeurs d'amorçage pour une large +gamme de systèmes ARM et AArch, à l'aide du +@uref{http://www.denx.de/wiki/U-Boot/, chargeur d'amorçage U-Boot} @item @code{target} -This is a string denoting the target onto which to install the bootloader. +C'est une chaîne qui dénote la cible sur laquelle installer le chargeur +d'amorçage. -The interpretation depends on the bootloader in question. For -@code{grub-bootloader}, for example, it should be a device name understood -by the bootloader @command{installer} command, such as @code{/dev/sda} or -@code{(hd0)} (@pxref{Invoking grub-install,,, grub, GNU GRUB Manual}). For -@code{grub-efi-bootloader}, it should be the mount point of the EFI file -system, usually @file{/boot/efi}. +L'interprétation dépend du chargeur d'amorçage en question. Pour +@code{grub-bootloader} par exemple, cela devrait être un nom de périphérique +compris par la commande @command{installer} du chargeur d'amorçage, comme +@code{/dev/sda} ou @code{(hd0)} (@pxref{Invoking grub-install,,, grub, GNU +GRUB Manual}). Pour @code{grub-efi-bootloader}, cela devrait être le point +de montage du système de fichiers EFI, typiquement @file{/boot/efi}. @item @code{menu-entries} (par défaut : @code{()}) -A possibly empty list of @code{menu-entry} objects (see below), denoting -entries to appear in the bootloader menu, in addition to the current system -entry and the entry pointing to previous system generations. +Une liste éventuellement vide d'objets @code{menu-entry} (voir plus bas), +dénotant les entrées qui doivent apparaître dans le menu du chargeur +d'amorçage, en plus de l'entrée pour le système actuel et l'entrée pointant +vers les générations précédentes. @item @code{default-entry} (par défaut : @code{0}) -The index of the default boot menu entry. Index 0 is for the entry of the -current system. +L'index de l'entrée du menu de démarrage par défaut. L'index 0 correspond +au système actuel. @item @code{timeout} (par défaut : @code{5}) -The number of seconds to wait for keyboard input before booting. Set to 0 -to boot immediately, and to -1 to wait indefinitely. +Le nombre de secondes à attendre une entrée clavier avant de démarrer. +Indiquez 0 pour démarre immédiatement, et -1 pour attendre indéfiniment. @item @code{theme} (par défaut : @var{#f}) -The bootloader theme object describing the theme to use. If no theme is -provided, some bootloaders might use a default theme, that's true for GRUB. +L'objet de thème du chargeur d'amorçage décrivant le thème utilisé. Si +aucun thème n'est fournit, certains chargeurs d'amorçage peuvent utiliser un +thème par défaut, c'est le cas de GRUB. @item @code{terminal-outputs} (par défaut : @code{'gfxterm}) -The output terminals used for the bootloader boot menu, as a list of -symbols. GRUB accepts the values: @code{console}, @code{serial}, -@code{serial_@{0-3@}}, @code{gfxterm}, @code{vga_text}, @code{mda_text}, -@code{morse}, and @code{pkmodem}. This field corresponds to the GRUB -variable @code{GRUB_TERMINAL_OUTPUT} (@pxref{Simple configuration,,, -grub,GNU GRUB manual}). +Les terminaux de sortie utilisés par le menu de démarrage du chargeur +d'amorçage, en tant que liste de symboles. GRUB accepte les valeurs +@code{console}, @code{serial}, @code{serial_@{0-3@}}, @code{gfxterm}, +@code{vga_text}, @code{mda_text}, @code{morse} et @code{pkmodem}. Ce champ +correspond à la variable GRUB @code{GRUB_TERMINAL_OUTPUT} (@pxref{Simple +configuration,,, grub,GNU GRUB manual}). @item @code{terminal-inputs} (par défaut : @code{'()}) -The input terminals used for the bootloader boot menu, as a list of -symbols. For GRUB, the default is the native platform terminal as -determined at run-time. GRUB accepts the values: @code{console}, -@code{serial}, @code{serial_@{0-3@}}, @code{at_keyboard}, and -@code{usb_keyboard}. This field corresponds to the GRUB variable -@code{GRUB_TERMINAL_INPUT} (@pxref{Simple configuration,,, grub,GNU GRUB -manual}). +Les terminaux d'entrée utilisés par le menu de démarrage du chargeur +d'amorçage, en tant que liste de symboles. Pour GRUB, la valeur par défaut +est le terminal natif de la plate-forme déterminé à l'exécution. GRUB +accepte les valeurs @code{console}, @code{serial}, @code{serial_@{0-3@}}, +@code{at_keyboard} et @code{usb_keyboard}. Ce champ correspond à la +variable GRUB @code{GRUB_TERMINAL_INPUT} (@pxref{Simple configuration,,, +grub,GNU GRUB manual}). @item @code{serial-unit} (par défaut : @code{#f}) -The serial unit used by the bootloader, as an integer from 0 to 3. For -GRUB, it is chosen at run-time; currently GRUB chooses 0, which corresponds -to COM1 (@pxref{Serial terminal,,, grub,GNU GRUB manual}). +L'unitié série utilisée par le chargeur d'amorçage, en tant qu'entier entre +0 et 3. Pour GRUB, il est choisi à l'exécution ; actuellement GRUB choisi +0, ce qui correspond à COM1 (@pxref{Serial terminal,,, grub,GNU GRUB +manual}). @item @code{serial-speed} (par défaut : @code{#f}) -The speed of the serial interface, as an integer. For GRUB, the default -value is chosen at run-time; currently GRUB chooses 9600@tie{}bps -(@pxref{Serial terminal,,, grub,GNU GRUB manual}). +La vitesse de l'interface série, en tant qu'entier. Pour GRUB, la valeur +par défaut est choisie à l'exécution ; actuellement GRUB choisi +9600@tie{}bps (@pxref{Serial terminal,,, grub,GNU GRUB manual}). @end table @end deftp @cindex dual boot -@cindex boot menu -Should you want to list additional boot menu entries @i{via} the -@code{menu-entries} field above, you will need to create them with the -@code{menu-entry} form. For example, imagine you want to be able to boot -another distro (hard to imagine!), you can define a menu entry along these -lines: +@cindex menu de démarrage +Si vous voulez lister des entrées du menu de démarrage supplémentaires via +le champ @code{menu-entries} ci-dessus, vous devrez les créer avec la forme +@code{menu-entry}. Par exemple, imaginons que vous souhaitiez pouvoir +démarrer sur une autre distro (c'est difficile à concevoir !), vous pourriez +alors définir une entrée du menu comme ceci : @example (menu-entry - (label "The Other Distro") + (label "L'autre distro") (linux "/boot/old/vmlinux-2.6.32") (linux-arguments '("root=/dev/sda2")) (initrd "/boot/old/initrd")) @end example -Details below. +Les détails suivent. @deftp {Type de données} menu-entry -The type of an entry in the bootloader menu. +Le type d'une entrée dans le menu du chargeur d'amorçage. @table @asis @item @code{label} -The label to show in the menu---e.g., @code{"GNU"}. +L'étiquette à montrer dans le menu — p.@: ex.@: @code{"GNU"}. @item @code{linux} -The Linux kernel image to boot, for example: +L'image du noyau Linux à démarrer, par exemple : @example (file-append linux-libre "/bzImage") @end example -For GRUB, it is also possible to specify a device explicitly in the file -path using GRUB's device naming convention (@pxref{Naming convention,,, -grub, GNU GRUB manual}), for example: +Pour GRUB, il est aussi possible de spécifier un périphérique explicitement +dans le chemin de fichier avec la convention de nommage de GRUB +(@pxref{Naming convention,,, grub, GNU GRUB manual}), par exemple : @example "(hd0,msdos1)/boot/vmlinuz" @end example -If the device is specified explicitly as above, then the @code{device} field -is ignored entirely. +Si le périphérique est spécifié explicitement comme au-dessus, le champ +@code{device} est complètement ignoré. @item @code{linux-arguments} (par défaut : @code{()}) -The list of extra Linux kernel command-line arguments---e.g., -@code{("console=ttyS0")}. +La liste des arguments de la ligne de commande du noyau supplémentaires — +p.@: ex.@: @code{("console=ttyS0")}. @item @code{initrd} -A G-Expression or string denoting the file name of the initial RAM disk to -use (@pxref{G-Expressions}). +Une G-expression ou une chaîne dénotant le nom de fichier du disque de RAM +initial à utiliser (@pxref{G-Expressions}). @item @code{device} (par défaut : @code{#f}) -The device where the kernel and initrd are to be found---i.e., for GRUB, -@dfn{root} for this menu entry (@pxref{root,,, grub, GNU GRUB manual}). +Le périphérique où le noyau et l'initrd se trouvent — c.-à-d.@: pour GRUB, +l'option @dfn{root} de cette entrée de menu (@pxref{root,,, grub, GNU GRUB +manual}). -This may be a file system label (a string), a file system UUID (a -bytevector, @pxref{Systèmes de fichiers}), or @code{#f}, in which case the -bootloader will search the device containing the file specified by the -@code{linux} field (@pxref{search,,, grub, GNU GRUB manual}). It must -@emph{not} be an OS device name such as @file{/dev/sda1}. +Cela peut être une étiquette de système de fichiers (une chaîne), un UUID de +système de fichiers (un vecteur d'octets, @pxref{Systèmes de fichiers}) ou +@code{#f}, auquel cas le chargeur d'amorçage recherchera le périphérique +contenant le fichier spécifié par le champ @code{linux} (@pxref{search,,, +grub, GNU GRUB manual}). Cela ne doit @emph{pas} être un nom de +périphérique donné par l'OS comme @file{/dev/sda1}. @end table @end deftp @c FIXME: Write documentation once it's stable. -Fow now only GRUB has theme support. GRUB themes are created using the -@code{grub-theme} form, which is not documented yet. +Pour l'instant seul GRUB supporte les thèmes. On crée un thème GRUB avec la +forme @code{grub-theme}, qui n'est pas encore documentée. @defvr {Variable Scheme} %default-theme -This is the default GRUB theme used by the operating system if no -@code{theme} field is specified in @code{bootloader-configuration} record. +C'est le thème par défaut de GRUB utilisé par le système d'exploitation si +aucun champ @code{theme} n'est spécifié dans l'enregistrement +@code{bootloader-configuration}. -It comes with a fancy background image displaying the GNU and Guix logos. +Il contient une image de fond sympathique avec les logos de GNU et de Guix. @end defvr @node Invoquer guix system -@subsection Invoquer @code{guix system} +@section Invoquer @code{guix system} -Once you have written an operating system declaration as seen in the -previous section, it can be @dfn{instantiated} using the @command{guix -system} command. The synopsis is: +Une fois que vous avez écrit une déclaration de système d'exploitation comme +nous l'avons vu dans les sections précédentes, elle peut être instanciée +avec la commande @command{guix system}. Voici le résumé de la commande : @example guix system @var{options}@dots{} @var{action} @var{file} @end example -@var{file} must be the name of a file containing an @code{operating-system} -declaration. @var{action} specifies how the operating system is -instantiated. Currently the following values are supported: +@var{file} doit être le nom d'un fichier contenant une déclaration +@code{operating-system}. @var{action} spécifie comme le système +d'exploitation est instancié. Actuellement les valeurs suivantes sont +supportées : @table @code @item search -Display available service type definitions that match the given regular -expressions, sorted by relevance: +Affiche les définitions des types de services disponibles qui correspondent +aux expressions régulières données, triées par pertinence. @example $ guix system search console font name: console-fonts -location: gnu/services/base.scm:729:2 +location: gnu/services/base.scm:773:2 extends: shepherd-root -description: Install the given fonts on the specified ttys (fonts are -+ per virtual console on GNU/Linux). The value of this service is a list -+ of tty/font pairs like: +description: Installe des polices données sur les ttys spécifiés (les polices sont par console virtuelle sous GNU/Linux). la valeur de ces service est une liste de paires ++ de tty/police comme ceci : + + '(("tty1" . "LatGrkCyr-8x16")) -relevance: 20 +relevance: 16 name: mingetty -location: gnu/services/base.scm:1048:2 +location: gnu/services/base.scm:1144:2 extends: shepherd-root -description: Provide console login using the `mingetty' program. -relevance: 2 +description: Fournit la connexion en console avec le programme `mingetty'. +relevance: 4 name: login -location: gnu/services/base.scm:775:2 +location: gnu/services/base.scm:819:2 extends: pam -description: Provide a console log-in service as specified by its -+ configuration value, a `login-configuration' object. -relevance: 2 +description: Fournit un service de connexion en console tel que spécifié par sa valeur de configuration, un objet `login-configuration'. +relevance: 4 @dots{} @end example -As for @command{guix package --search}, the result is written in -@code{recutils} format, which makes it easy to filter the output -(@pxref{Top, GNU recutils databases,, recutils, GNU recutils manual}). +Comme pour @command{guix package --search}, le résultat est écrit au format +@code{recutils}, ce qui rend facile le filtrage de la sortie (@pxref{Top, +GNU recutils databases,, recutils, GNU recutils manual}). @item reconfigure Build the operating system described in @var{file}, activate it, and switch to it@footnote{This action (and the related actions @code{switch-generation} -and @code{roll-back}) are usable only on systems already running GuixSD.}. +and @code{roll-back}) are usable only on systems already running Guix +System.}. This effects all the configuration specified in @var{file}: user accounts, system services, global package list, setuid programs, etc. The command @@ -22896,168 +23670,217 @@ running; if a service is currently running this command will arrange for it to be upgraded the next time it is stopped (e.g.@: by @code{herd stop X} or @code{herd restart X}). -This command creates a new generation whose number is one greater than the -current generation (as reported by @command{guix system list-generations}). -If that generation already exists, it will be overwritten. This behavior -mirrors that of @command{guix package} (@pxref{Invoquer guix package}). +Cette commande crée une nouvelle génération dont le numéro est un de plus +que la génération actuelle (rapportée par @command{guix system +list-generations}). Si cette génération existe déjà, elle sera réécrite. +Ce comportement correspond à celui de @command{guix package} +(@pxref{Invoquer guix package}). -It also adds a bootloader menu entry for the new OS configuration, ---unless -@option{--no-bootloader} is passed. For GRUB, it moves entries for older -configurations to a submenu, allowing you to choose an older system -generation at boot time should you need it. +Elle ajoute aussi une entrée de menu du chargeur d'amorçage pour la nouvelle +configuration, à moins que @option{--no-bootloader} ne soit passé. Pour +GRUB, elle déplace les entrées pour les anciennes configurations dans un +sous-menu, ce qui vous permet de choisir une ancienne génération au +démarrage si vous en avez besoin. @quotation Remarque @c The paragraph below refers to the problem discussed at @c . -It is highly recommended to run @command{guix pull} once before you run -@command{guix system reconfigure} for the first time (@pxref{Invoquer guix pull}). Failing to do that you would see an older version of Guix once -@command{reconfigure} has completed. +Il est grandement recommandé de lancer @command{guix pull} une fois avant de +lancer @command{guix system reconfigure} pour la première fois +(@pxref{Invoquer guix pull}). Sans cela, vous verriez une version plus +ancienne de Guix une fois @command{reconfigure} terminé. @end quotation @item switch-generation @cindex générations -Switch to an existing system generation. This action atomically switches -the system profile to the specified system generation. It also rearranges -the system's existing bootloader menu entries. It makes the menu entry for -the specified system generation the default, and it moves the entries for -the other generatiors to a submenu, if supported by the bootloader being -used. The next time the system boots, it will use the specified system -generation. +Passe à une génération existante du système. Cette action change +automatiquement le profil système vers la génération spécifiée. Elle +réarrange aussi les entrées existantes du menu du chargeur d'amorçage du +système. Elle fait de l'entrée du menu pour la génération spécifiée +l'entrée par défaut et déplace les entrées pour les autres générations dans +un sous-menu, si cela est supporté par le chargeur d'amorçage utilisé. Lors +du prochain démarrage du système, la génération du système spécifiée sera +utilisée. -The bootloader itself is not being reinstalled when using this command. -Thus, the installed bootloader is used with an updated configuration file. +Le chargeur d'amorçage lui-même n'est pas réinstallé avec cette commande. +Ainsi, le chargeur d'amorçage est utilisé avec un fichier de configuration +plus à jour. -The target generation can be specified explicitly by its generation number. -For example, the following invocation would switch to system generation 7: +La génération cible peut être spécifiée explicitement par son numéro de +génération. Par exemple, l'invocation suivante passerait à la génération 7 +du système : @example guix system switch-generation 7 @end example -The target generation can also be specified relative to the current -generation with the form @code{+N} or @code{-N}, where @code{+3} means ``3 -generations ahead of the current generation,'' and @code{-1} means ``1 -generation prior to the current generation.'' When specifying a negative -value such as @code{-1}, you must precede it with @code{--} to prevent it -from being parsed as an option. For example: +La génération cible peut aussi être spécifiée relativement à la génération +actuelle avec la forme @code{+N} ou @code{-N}, où @code{+3} signifie « trois +générations après la génération actuelle » et @code{-1} signifie « une +génération précédent la génération actuelle ». Lorsque vous spécifiez un +nombre négatif comme @code{-1}, il doit être précédé de @code{--} pour +éviter qu'il ne soit compris comme une option. Par exemple : @example guix system switch-generation -- -1 @end example -Currently, the effect of invoking this action is @emph{only} to switch the -system profile to an existing generation and rearrange the bootloader menu -entries. To actually start using the target system generation, you must -reboot after running this action. In the future, it will be updated to do -the same things as @command{reconfigure}, like activating and deactivating -services. +Actuellement, l'effet de l'invocation de cette action est @emph{uniquement} +de passer au profil du système vers une autre génération existante et de +réarranger le menu du chargeur d'amorçage. Pour vraiment commencer à +utiliser la génération spécifiée, vous devez redémarrer après avoir lancé +cette action. Dans le futur, elle sera corrigée pour faire la même chose +que @command{reconfigure}, comme réactiver et désactiver les services. -This action will fail if the specified generation does not exist. +Cette action échouera si la génération spécifiée n'existe pas. @item roll-back @cindex revenir en arrière -Switch to the preceding system generation. The next time the system boots, -it will use the preceding system generation. This is the inverse of -@command{reconfigure}, and it is exactly the same as invoking -@command{switch-generation} with an argument of @code{-1}. +Passe à la génération précédente du système. Au prochain démarrage, la +génération précédente sera utilisée. C'est le contraire de +@command{reconfigure}, et c'est exactement comme invoquer +@command{switch-generation} avec pour argument @code{-1}. + +Actuellement, comme pour @command{switch-generation}, vous devez redémarrer +après avoir lancé cette action pour vraiment démarrer sur la génération +précédente du système. + +@item delete-generations +@cindex deleting system generations +@cindex saving space +Delete system generations, making them candidates for garbage collection +(@pxref{Invoquer guix gc}, for information on how to run the ``garbage +collector''). + +This works in the same way as @command{guix package --delete-generations} +(@pxref{Invoquer guix package, @code{--delete-generations}}). With no +arguments, all system generations but the current one are deleted: + +@example +guix system delete-generations +@end example -Currently, as with @command{switch-generation}, you must reboot after -running this action to actually start using the preceding system generation. +You can also select the generations you want to delete. The example below +deletes all the system generations that are more than two month old: + +@example +guix system delete-generations 2m +@end example + +Running this command automatically reinstalls the bootloader with an updated +list of menu entries---e.g., the ``old generations'' sub-menu in GRUB no +longer lists the generations that have been deleted. @item build -Build the derivation of the operating system, which includes all the -configuration files and programs needed to boot and run the system. This -action does not actually install anything. +Construit la dérivation du système d'exploitation, ce qui comprend tous les +fichiers de configuration et les programmes requis pour démarrer et lancer +le système. Cette action n'installe rien. @item init Populate the given directory with all the files necessary to run the operating system specified in @var{file}. This is useful for first-time -installations of GuixSD. For instance: +installations of Guix System. For instance: @example guix system init my-os-config.scm /mnt @end example -copies to @file{/mnt} all the store items required by the configuration -specified in @file{my-os-config.scm}. This includes configuration files, -packages, and so on. It also creates other essential files needed for the -system to operate correctly---e.g., the @file{/etc}, @file{/var}, and -@file{/run} directories, and the @file{/bin/sh} file. +copie tous les éléments du dépôt requis par la configuration spécifiée dans +@file{my-os-config.scm} dans @file{/mnt}. Cela comprend les fichiers de +configuration, les paquets, etc. Elle crée aussi d'autres fichiers +essentiels requis pour que le système fonctionne correctement — p.@: ex.@: +les répertoires @file{/etc}, @file{/var} et @file{/run} et le fichier +@file{/bin/sh}. -This command also installs bootloader on the target specified in -@file{my-os-config}, unless the @option{--no-bootloader} option was passed. +Cette commande installe aussi le chargeur d'amorçage sur la cible spécifiée +dans @file{my-os-config}, à moins que l'option @option{--no-bootloader} ne +soit passée. @item vm -@cindex virtual machine +@cindex machine virtuelle @cindex VM @anchor{guix system vm} Build a virtual machine that contains the operating system declared in -@var{file}, and return a script to run that virtual machine (VM). Arguments -given to the script are passed to QEMU as in the example below, which -enables networking and requests 1@tie{}GiB of RAM for the emulated machine: +@var{file}, and return a script to run that virtual machine (VM). + +@quotation Remarque +The @code{vm} action and others below can use KVM support in the Linux-libre +kernel. Specifically, if the machine has hardware virtualization support, +the corresponding KVM kernel module should be loaded, and the +@file{/dev/kvm} device node must exist and be readable and writable by the +user and by the build users of the daemon (@pxref{Réglages de l'environnement de construction}). +@end quotation + +Arguments given to the script are passed to QEMU as in the example below, +which enables networking and requests 1@tie{}GiB of RAM for the emulated +machine: @example $ /gnu/store/@dots{}-run-vm.sh -m 1024 -net user @end example -The VM shares its store with the host system. +La VM partage sont dépôt avec le système hôte. -Additional file systems can be shared between the host and the VM using the -@code{--share} and @code{--expose} command-line options: the former -specifies a directory to be shared with write access, while the latter -provides read-only access to the shared directory. +Vous pouvez partager des fichiers supplémentaires entre l'hôte et la VM avec +les options en ligne de commande @code{--share} et @code{--expose} : la +première spécifie un répertoire à partager avec accès en écriture, tandis +que le deuxième fournit un accès en lecture-seule au répertoire partagé. -The example below creates a VM in which the user's home directory is -accessible read-only, and where the @file{/exchange} directory is a -read-write mapping of @file{$HOME/tmp} on the host: +L'exemple ci-dessous crée une VM dans laquelle le répertoire personnel de +l'utilisateur est accessible en lecture-seule, et où le répertoire +@file{/exchange} est une correspondance en lecture-écriture à +@file{$HOME/tmp} sur l'hôte : @example guix system vm my-config.scm \ --expose=$HOME --share=$HOME/tmp=/exchange @end example -On GNU/Linux, the default is to boot directly to the kernel; this has the -advantage of requiring only a very tiny root disk image since the store of -the host can then be mounted. +Sur GNU/Linux, le comportement par défaut consiste à démarrer directement +sur le noyau ; cela a l'avantage de n'avoir besoin que d'une toute petite +image disque puisque le dépôt de l'hôte peut ensuite être monté. -The @code{--full-boot} option forces a complete boot sequence, starting with -the bootloader. This requires more disk space since a root image containing -at least the kernel, initrd, and bootloader data files must be created. The -@code{--image-size} option can be used to specify the size of the image. +L'option @code{--full-boot} force une séquence de démarrage complète, en +commençant par le chargeur d'amorçage. Cela requiert plus d'espace disque +puisqu'une image racine contenant au moins le noyau, l'initrd et les +fichiers de données du chargeur d'amorçage doit être créé. On peut utiliser +l'option @code{--image-size} pour spécifier la taille de l'image. -@cindex System images, creation in various formats -@cindex Creating system images in various formats +@cindex Images système, création en divers formats +@cindex Créer des images systèmes sous différents formats @item vm-image @itemx disk-image @itemx docker-image -Return a virtual machine, disk image, or Docker image of the operating -system declared in @var{file} that stands alone. By default, @command{guix -system} estimates the size of the image needed to store the system, but you -can use the @option{--image-size} option to specify a value. Docker images -are built to contain exactly what they need, so the @option{--image-size} -option is ignored in the case of @code{docker-image}. +Renvoie une machine virtuelle, une image disque ou une image Docker du +système d'exploitation déclaré dans @var{file} qui se suffit à elle-même. +Par défaut, @command{guix system} estime la taille de l'image requise pour +stocker le système, mais vous pouvez utiliser l'option @option{--image-size} +pour spécifier une valeur. Les images Docker sont construites pour contenir +exactement ce dont elles ont besoin, donc l'option @option{--image-size} est +ignorée dans le cas de @code{docker-image}. -You can specify the root file system type by using the -@option{--file-system-type} option. It defaults to @code{ext4}. +Vous pouvez spécifier le type de système de fichiers racine avec l'option +@option{--file-system-type}. La valeur par défaut est @code{ext4}. When using @code{vm-image}, the returned image is in qcow2 format, which the -QEMU emulator can efficiently use. @xref{Lancer GuixSD dans une VM}, for more +QEMU emulator can efficiently use. @xref{Running Guix in a VM}, for more information on how to run the image in a virtual machine. -When using @code{disk-image}, a raw disk image is produced; it can be copied -as is to a USB stick, for instance. Assuming @code{/dev/sdc} is the device -corresponding to a USB stick, one can copy the image to it using the -following command: +Lorsque vous utilisez @code{disk-image}, une image disque brute est produite +; elle peut être copiée telle quelle sur un périphérique USB. En supposant +que @code{/dev/sdc} est le périphérique correspondant à une clef USB, on +peut copier l'image dessus avec la commande suivante : @example # dd if=$(guix system disk-image my-os.scm) of=/dev/sdc @end example -When using @code{docker-image}, a Docker image is produced. Guix builds the -image from scratch, not from a pre-existing Docker base image. As a result, -it contains @emph{exactly} what you define in the operating system -configuration file. You can then load the image and launch a Docker -container using commands like the following: +En utilisant @code{docker-image}, on produit une image Docker. Guix +construit l'image de zéro, et non à partir d'une image Docker de base +pré-existante. En conséquence, elle contient @emph{exactly} ce que vous +avez défini dans le fichier de configuration du système. Vous pouvez +ensuite charger l'image et lancer un conteneur Docker avec des commande +comme : @example image_id="$(docker load < guixsd-docker-image.tar.gz)" @@ -23067,27 +23890,29 @@ docker run -e GUIX_NEW_SYSTEM=/var/guix/profiles/system \\ @end example This command starts a new Docker container from the specified image. It -will boot the GuixSD system in the usual manner, which means it will start -any services you have defined in the operating system configuration. -Depending on what you run in the Docker container, it may be necessary to -give the container additional permissions. For example, if you intend to -build software using Guix inside of the Docker container, you may need to -pass the @option{--privileged} option to @code{docker run}. +will boot the Guix system in the usual manner, which means it will start any +services you have defined in the operating system configuration. Depending +on what you run in the Docker container, it may be necessary to give the +container additional permissions. For example, if you intend to build +software using Guix inside of the Docker container, you may need to pass the +@option{--privileged} option to @code{docker run}. @item conteneur -Return a script to run the operating system declared in @var{file} within a -container. Containers are a set of lightweight isolation mechanisms -provided by the kernel Linux-libre. Containers are substantially less -resource-demanding than full virtual machines since the kernel, shared -objects, and other resources can be shared with the host system; this also -means they provide thinner isolation. +Renvoie un script qui lance le système d'exploitation déclaré dans +@var{file} dans un conteneur. Les conteneurs sont un ensemble de mécanismes +d'isolation légers fournis par le noyau Linux-libre. Les conteneurs sont +substantiellement moins gourmands en ressources que les machines virtuelles +complètes car le noyau, les objets partagés et d'autres ressources peuvent +être partagés avec le système hôte ; cela signifie aussi une isolation moins +complète. -Currently, the script must be run as root in order to support more than a -single user and group. The container shares its store with the host system. +Actuellement, le script doit être lancé en root pour pouvoir supporter plus +d'un utilisateur et d'un groupe. Le conteneur partage son dépôt avec le +système hôte. -As with the @code{vm} action (@pxref{guix system vm}), additional file -systems to be shared between the host and container can be specified using -the @option{--share} and @option{--expose} options: +Comme avec l'action @code{vm} (@pxref{guix system vm}), des systèmes de +fichiers supplémentaires peuvent être partagés entre l'hôte et le conteneur +avec les options @option{--share} et @option{--expose} : @example guix system container my-config.scm \ @@ -23095,52 +23920,53 @@ guix system container my-config.scm \ @end example @quotation Remarque -This option requires Linux-libre 3.19 or newer. +Cette option requiert Linux-libre ou supérieur. @end quotation @end table -@var{options} can contain any of the common build options (@pxref{Options de construction communes}). In addition, @var{options} can contain one of the -following: +@var{options} peut contenir n'importe quelle option commune de construction +(@pxref{Options de construction communes}). En plus, @var{options} peut contenir l'une +de ces options : @table @option @item --expression=@var{expr} @itemx -e @var{expr} Consider the operating-system @var{expr} evaluates to. This is an alternative to specifying a file which evaluates to an operating system. -This is used to generate the GuixSD installer @pxref{Construire l'image d'installation}). +This is used to generate the Guix system installer @pxref{Construire l'image d'installation}). @item --system=@var{système} @itemx -s @var{système} -Attempt to build for @var{system} instead of the host system type. This -works as per @command{guix build} (@pxref{Invoquer guix build}). +Essaye de construire pour @var{system} au lieu du type du système hôte. +Cela fonction comme pour @command{guix build} (@pxref{Invoquer guix build}). @item --derivation @itemx -d -Return the derivation file name of the given operating system without -building anything. +Renvoie le nom du fichier de dérivation du système d'exploitation donné sans +rien construire. @item --file-system-type=@var{type} @itemx -t @var{type} -For the @code{disk-image} action, create a file system of the given -@var{type} on the image. +Pour l'action @code{disk-image}, crée un système de fichier du @var{type} +donné sur l'image. -When this option is omitted, @command{guix system} uses @code{ext4}. +Lorsque cette option est omise, @command{guix system} utilise @code{ext4}. -@cindex ISO-9660 format -@cindex CD image format -@cindex DVD image format -@code{--file-system-type=iso9660} produces an ISO-9660 image, suitable for -burning on CDs and DVDs. +@cindex format ISO-9660 +@cindex format d'image de CD +@cindex format d'image de DVD +@code{--file-system-type=iso9660} produit une image ISO-9660, qu'il est +possible de graver sur un CD ou un DVD. @item --image-size=@var{size} -For the @code{vm-image} and @code{disk-image} actions, create an image of -the given @var{size}. @var{size} may be a number of bytes, or it may -include a unit as a suffix (@pxref{Block size, size specifications,, +Pour les actions @code{vm-image} et @code{disk-image}, crée une image de la +taille donnée @var{size}. @var{size} peut être un nombre d'octets ou +contenir un suffixe d'unité (@pxref{Block size, size specifications,, coreutils, GNU Coreutils}). -When this option is omitted, @command{guix system} computes an estimate of -the image size as a function of the size of the system declared in +Lorsque cette option est omise, @command{guix system} calcule une estimation +de la taille de l'image en fonction de la taille du système déclaré dans @var{file}. @item --root=@var{fichier} @@ -23149,59 +23975,58 @@ Fait de @var{fichier} un lien symbolique vers le résultat, et l'enregistre en tant que racine du ramasse-miettes. @item --skip-checks -Skip pre-installation safety checks. - -By default, @command{guix system init} and @command{guix system reconfigure} -perform safety checks: they make sure the file systems that appear in the -@code{operating-system} declaration actually exist (@pxref{Systèmes de fichiers}), -and that any Linux kernel modules that may be needed at boot time are listed -in @code{initrd-modules} (@pxref{Disque de RAM initial}). Passing this option -skips these tests altogether. - +Passe les vérifications de sécurité avant l'installation. + +Par défaut, @command{guix system init} et @command{guix system reconfigure} +effectuent des vérifications de sécurité : ils s'assurent que les systèmes +de fichiers qui apparaissent dans la déclaration @code{operating-system} +existent vraiment (@pxref{Systèmes de fichiers}) et que les modules de noyau Linux +qui peuvent être requis au démarrage sont listés dans @code{initrd-modules} +(@pxref{Disque de RAM initial}). Passer cette option saute ces vérifications +complètement. + +@cindex on-error +@cindex on-error strategy +@cindex error strategy @item --on-error=@var{strategy} -Apply @var{strategy} when an error occurs when reading @var{file}. -@var{strategy} may be one of the following: +Applique @var{strategy} lorsqu'une erreur arrive lors de la lecture de +@var{file}. @var{strategy} peut être l'une des valeurs suivantes : @table @code @item nothing-special -Report the error concisely and exit. This is the default strategy. +Rapporte l'erreur de manière concise et quitte. C'est la stratégie par +défaut. @item backtrace -Likewise, but also display a backtrace. +Pareil, mais affiche aussi une trace de débogage. @item debug -Report the error and enter Guile's debugger. From there, you can run -commands such as @code{,bt} to get a backtrace, @code{,locals} to display -local variable values, and more generally inspect the state of the program. -@xref{Debug Commands,,, guile, GNU Guile Reference Manual}, for a list of -available debugging commands. +Rapporte l'erreur et entre dans le débogueur Guile. À partir de là, vous +pouvez lancer des commandes comme @code{,bt} pour obtenir une trace de +débogage, @code{,locals} pour afficher les valeurs des variables locales et +plus généralement inspecter l'état du programme. @xref{Debug Commands,,, +guile, GNU Guile Reference Manual}, pour une liste de commandes de débogage +disponibles. @end table @end table -@quotation Remarque -All the actions above, except @code{build} and @code{init}, can use KVM -support in the Linux-libre kernel. Specifically, if the machine has -hardware virtualization support, the corresponding KVM kernel module should -be loaded, and the @file{/dev/kvm} device node must exist and be readable -and writable by the user and by the build users of the daemon (@pxref{Réglages de l'environnement de construction}). -@end quotation - Once you have built, configured, re-configured, and re-re-configured your -GuixSD installation, you may find it useful to list the operating system +Guix installation, you may find it useful to list the operating system generations available on disk---and that you can choose from the bootloader boot menu: @table @code @item list-generations -List a summary of each generation of the operating system available on disk, -in a human-readable way. This is similar to the @option{--list-generations} -option of @command{guix package} (@pxref{Invoquer guix package}). +Affiche un résumé de chaque génération du système d'exploitation disponible +sur le disque, dans un format lisible pour un humain. C'est similaire à +l'option @option{--list-generations} de @command{guix package} +(@pxref{Invoquer guix package}). -Optionally, one can specify a pattern, with the same syntax that is used in -@command{guix package --list-generations}, to restrict the list of -generations displayed. For instance, the following command displays -generations that are up to 10 days old: +Éventuellement, on peut spécifier un motif, avec la même syntaxe utilisée +pour @command{guix package --list-generations}, pour restreindre la liste +des générations affichées. Par exemple, la commande suivante affiche les +générations de moins de 10 jours : @example $ guix system list-generations 10d @@ -23209,39 +24034,43 @@ $ guix system list-generations 10d @end table -The @command{guix system} command has even more to offer! The following -sub-commands allow you to visualize how your system services relate to each -other: +La commande @command{guix system} a même plus à proposer ! Les +sous-commandes suivantes vous permettent de visualiser comme vos services +systèmes sont liés les uns aux autres : @anchor{system-extension-graph} @table @code @item extension-graph -Emit in Dot/Graphviz format to standard output the @dfn{service extension -graph} of the operating system defined in @var{file} (@pxref{Composition de services}, for more information on service extensions.) +Affiche le @dfn{graphe d'extension des services} du système d'exploitation +défini dans @var{file} au format Dot/Graphviz sur la sortie standard +(@pxref{Composition de services}, pour plus d'informations sur l'extension des +services). -The command: +La commande : @example $ guix system extension-graph @var{file} | dot -Tpdf > services.pdf @end example -produces a PDF file showing the extension relations among services. +produit un fichier PDF montrant les relations d'extension entre les +services. @anchor{system-shepherd-graph} @item shepherd-graph -Emit in Dot/Graphviz format to standard output the @dfn{dependency graph} of -shepherd services of the operating system defined in @var{file}. -@xref{Services Shepherd}, for more information and for an example graph. +Affiche le @dfn{graphe de dépendance} des services shepherd du système +d'exploitation défini dans @var{file} au format Dot/Graphviz sur la sortie +standard. @xref{Services Shepherd}, pour plus d'informations et un exemple +de graphe. @end table -@node Lancer GuixSD dans une VM -@subsection Running GuixSD in a Virtual Machine +@node Running Guix in a VM +@section Running Guix in a Virtual Machine -@cindex virtual machine -To run GuixSD in a virtual machine (VM), one can either use the pre-built -GuixSD VM image distributed at +@cindex machine virtuelle +To run Guix in a virtual machine (VM), one can either use the pre-built Guix +VM image distributed at @indicateurl{https://alpha.gnu.org/gnu/guix/guixsd-vm-image-@value{VERSION}.@var{system}.xz} , or build their own virtual machine image using @command{guix system vm-image} (@pxref{Invoquer guix system}). The returned image is in qcow2 @@ -23249,10 +24078,12 @@ format, which the @uref{http://qemu.org/, QEMU emulator} can efficiently use. @cindex QEMU -If you built your own image, you must copy it out of the store (@pxref{Le dépôt}) and give yourself permission to write to the copy before you can use -it. When invoking QEMU, you must choose a system emulator that is suitable -for your hardware platform. Here is a minimal QEMU invocation that will -boot the result of @command{guix system vm-image} on x86_64 hardware: +Si vous construisez votre propre image, vous devez la copier en dehors du +dépôt (@pxref{Le dépôt}) et vous donner la permission d'écrire sur la copie +avant de pouvoir l'utiliser. Lorsque vous invoquez QEMU, vous devez choisir +un émulateur système correspondant à votre plate-forme matérielle. Voici +une invocation minimale de QEMU qui démarrera le résultat de @command{guix +system vm-image} sur un matériel x8_64. @example $ qemu-system-x86_64 \ @@ -23260,84 +24091,85 @@ $ qemu-system-x86_64 \ -enable-kvm -m 256 /tmp/qemu-image @end example -Here is what each of these options means: +Voici la signification de ces options : @table @code @item qemu-system-x86_64 -This specifies the hardware platform to emulate. This should match the -host. +Cela spécifie la plate-forme matérielle à émuler. Elle doit correspondre à +l'hôte. @item -net user -Enable the unprivileged user-mode network stack. The guest OS can access -the host but not vice versa. This is the simplest way to get the guest OS -online. +Active la pile réseau non privilégiée en mode utilisateur. L'OS émulé peut +accéder à l'hôte mais pas l'inverse. C'est la manière la plus simple de +connecter le client. @item -net nic,model=virtio -You must create a network interface of a given model. If you do not create -a NIC, the boot will fail. Assuming your hardware platform is x86_64, you -can get a list of available NIC models by running -@command{qemu-system-x86_64 -net nic,model=help}. +Vous devez créer une interface réseau d'un modèle donné. Si vous ne créez +pas de NIC, le démarrage échouera. En supposant que votre plate-forme est +x86_64, vous pouvez récupérer une liste des modèles de NIC disponibles en +lançant @command{qemu-system-x86_64 -net nic,model=help}. @item -enable-kvm -If your system has hardware virtualization extensions, enabling the virtual -machine support (KVM) of the Linux kernel will make things run faster. +Si votre système a des extensions de virtualisation matérielle, activer le +support des machines virtuelles de Linux (KVM) accélérera les choses. @item -m 256 -RAM available to the guest OS, in mebibytes. Defaults to 128@tie{}MiB, -which may be insufficient for some operations. +RAM disponible sur l'OS émulé, en mébioctets. La valeur par défaut est +128@tie{}Mo, ce qui peut ne pas suffire pour certaines opérations. @item /tmp/qemu-image -The file name of the qcow2 image. +Le nom de fichier de l'image qcow2. @end table -The default @command{run-vm.sh} script that is returned by an invocation of -@command{guix system vm} does not add a @command{-net user} flag by -default. To get network access from within the vm add the -@code{(dhcp-client-service)} to your system definition and start the VM -using @command{`guix system vm config.scm` -net user}. An important caveat -of using @command{-net user} for networking is that @command{ping} will not -work, because it uses the ICMP protocol. You'll have to use a different -command to check for network connectivity, for example @command{guix +Le script @command{run-vm.sh} par défaut renvoyé par une invocation de +@command{guix system vm} n'ajoute pas le drapeau @command{-net user} par +défaut. Pour avoir accès au réseau dans la vm, ajoutez le +@code{(dhcp-client-service)} à votre définition et démarrez la VM avec +@command{`guix system vm config.scm` -net user}. Un problème important avec +@command{-net user} pour le réseau, est que @command{ping} ne fonctionnera +pas, car il utilise le protocole ICMP. Vous devrez utiliser une autre +commande pour vérifier la connectivité réseau, par exemple @command{guix download}. -@subsubsection Connecting Through SSH +@subsection Se connecter par SSH @cindex SSH @cindex serveur SSH -To enable SSH inside a VM you need to add a SSH server like -@code{(dropbear-service)} or @code{(lsh-service)} to your VM. The -@code{(lsh-service}) doesn't currently boot unsupervised. It requires you -to type some characters to initialize the randomness generator. In addition -you need to forward the SSH port, 22 by default, to the host. You can do -this with +Pour activer SSH dans une VM vous devez ajouter un serveur SSH comme +@code{(dropbear-service)} ou @code{(lsh-service)} à votre VM. Le service +@code{(lsh-service)} ne peut actuellement pas démarrer sans supervision. Il +a besoin que vous tapiez quelques caractères pour initialiser le générateur +d'aléatoire. En plus vous devez transférer le port 22, par défaut, à +l'hôte. Vous pouvez faire cela avec : @example `guix system vm config.scm` -net user,hostfwd=tcp::10022-:22 @end example -To connect to the VM you can run +Pour vous connecter à la VM vous pouvez lancer @example ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -p 10022 @end example -The @command{-p} tells @command{ssh} the port you want to connect to. -@command{-o UserKnownHostsFile=/dev/null} prevents @command{ssh} from -complaining every time you modify your @command{config.scm} file and the -@command{-o StrictHostKeyChecking=no} prevents you from having to allow a -connection to an unknown host every time you connect. +Le @command{-p} donne le port auquel vous voulez vous connecter à +@command{ssh}, @command{-o UserKnownHostsFile=/dev/null} évite que +@command{ssh} ne se plaigne à chaque fois que vous modifiez le fichier +@command{config.scm} et @command{-o StrictHostKeyChecking=no} évite que vous +n'ayez à autoriser une connexion à un hôte inconnu à chaque fois que vous +vous connectez. -@subsubsection Using @command{virt-viewer} with Spice +@subsection Utiliser @command{virt-viewer} avec Spice -As an alternative to the default @command{qemu} graphical client you can use -the @command{remote-viewer} from the @command{virt-viewer} package. To -connect pass the @command{-spice port=5930,disable-ticketing} flag to -@command{qemu}. See previous section for further information on how to do -this. +Alternativement au client graphique @command{qemu} par défaut vous pouvez +utiliser @command{remote-viewer} du paquet @command{virt-viewer}. Pour vous +connecter, passez le drapeau @command{-spice port=5930,disable-ticketing} à +@command{qemu}. Voir les sections précédentes pour plus d'informations sur +comment faire cela. -Spice also allows you to do some nice stuff like share your clipboard with -your VM. To enable that you'll also have to pass the following flags to -@command{qemu}: +Spice a aussi de chouettes fonctionnalités comme le partage de votre +presse-papier avec la VM. Pour activer cela vous devrez aussi passer les +drapeaux suivants à @command{qemu} : @example -device virtio-serial-pci,id=virtio-serial0,max_ports=16,bus=pci.0,addr=0x5 @@ -23346,14 +24178,14 @@ your VM. To enable that you'll also have to pass the following flags to name=com.redhat.spice.0 @end example -You'll also need to add the @pxref{Services divers, Spice service}. +Vous devrez aussi ajouter le @pxref{Services divers, Spice service}. @node Définir des services -@subsection Définir des services +@section Définir des services -The previous sections show the available services and how one can combine -them in an @code{operating-system} declaration. But how do we define them -in the first place? And what is a service anyway? +Les sections précédentes montrent les services disponibles et comment on +peut les combiner dans une déclaration @code{operating-system}. Mais, déjà, +comment les définir ? Et qu'est-ce qu'un service au fait ? @menu * Composition de services:: Le modèle de composition des services. @@ -23363,65 +24195,68 @@ in the first place? And what is a service anyway? @end menu @node Composition de services -@subsubsection Composition de services +@subsection Composition de services @cindex services -@cindex daemons -Here we define a @dfn{service} as, broadly, something that extends the -functionality of the operating system. Often a service is a process---a -@dfn{daemon}---started when the system boots: a secure shell server, a Web -server, the Guix build daemon, etc. Sometimes a service is a daemon whose -execution can be triggered by another daemon---e.g., an FTP server started -by @command{inetd} or a D-Bus service activated by @command{dbus-daemon}. -Occasionally, a service does not map to a daemon. For instance, the -``account'' service collects user accounts and makes sure they exist when -the system runs; the ``udev'' service collects device management rules and -makes them available to the eudev daemon; the @file{/etc} service populates -the @file{/etc} directory of the system. - -@cindex service extensions -GuixSD services are connected by @dfn{extensions}. For instance, the secure -shell service @emph{extends} the Shepherd---the GuixSD initialization +@cindex démons +Ici nous définissons un @dfn{service} comme étant, assez largement, quelque +chose qui étend la fonctionnalité d'un système d'exploitation. Souvent un +service est un processus — un @dfn{démon} — démarré lorsque le système +démarre : un serveur ssh, un serveur web, le démon de construction de Guix, +etc. Parfois un service est un démon dont l'exécution peut être déclenchée +par un autre démon — p.@: ex.@: un serveur FTP démarré par @command{inetd} +ou un service D-Bus activé par @command{dbus-daemon}. Parfois, un service +ne correspond pas à un démon. Par exemple, le service « de comptes » +récupère la liste des comptes utilisateurs et s'assure qu'ils existent bien +lorsque le système est lancé ; le service « udev » récupère les règles de +gestion des périphériques et les rend disponible au démon eudev ; le service +@file{/etc} rempli le répertoire @file{/etc} du système. + +@cindex extensions de service +Guix system services are connected by @dfn{extensions}. For instance, the +secure shell service @emph{extends} the Shepherd---the initialization system, running as PID@tie{}1---by giving it the command lines to start and stop the secure shell daemon (@pxref{Services réseau, -@code{lsh-service}}); the UPower service extends the D-Bus service by -passing it its @file{.service} specification, and extends the udev service -by passing it device management rules (@pxref{Services de bureaux, +@code{openssh-service-type}}); the UPower service extends the D-Bus service +by passing it its @file{.service} specification, and extends the udev +service by passing it device management rules (@pxref{Services de bureaux, @code{upower-service}}); the Guix daemon service extends the Shepherd by passing it the command lines to start and stop the daemon, and extends the account service by passing it a list of required build user accounts (@pxref{Services de base}). -All in all, services and their ``extends'' relations form a directed acyclic -graph (DAG). If we represent services as boxes and extensions as arrows, a -typical system might provide something like this: +En définitive, les services et leurs relation « d'extensions » forment un +graphe orienté acyclique (DAG). Si nous représentons les services comme des +boîtes et les extensions comme des flèches, un système typique pourrait +fournir quelque chose comme cela : -@image{images/service-graph,,5in,Typical service extension graph.} +@image{images/service-graph,,5in,Graphe d'extension des services typique.} -@cindex system service -At the bottom, we see the @dfn{system service}, which produces the directory -containing everything to run and boot the system, as returned by the -@command{guix system build} command. @xref{Référence de service}, to learn -about the other service types shown here. @xref{system-extension-graph, the -@command{guix system extension-graph} command}, for information on how to -generate this representation for a particular operating system definition. +@cindex service système +En bas, on voit le @dfn{service système} qui produit le répertoire contenant +tout et lançant et démarrant le système, renvoyé par la commande +@command{guix system build}. @xref{Référence de service}, pour apprendre les +autres types de services montrés ici. @xref{system-extension-graph, the +@command{guix system extension-graph} command}, pour plus d'informations sur +la manière de générer cette représentation pour une définition de système +d'exploitation particulière. -@cindex service types +@cindex types de services Technically, developers can define @dfn{service types} to express these relations. There can be any number of services of a given type on the system---for instance, a system running two instances of the GNU secure -shell server (lsh) has two instances of @var{lsh-service-type}, with +shell server (lsh) has two instances of @code{lsh-service-type}, with different parameters. -The following section describes the programming interface for service types -and services. +La section suivante décrit l'interface de programmation des types de +services et des services. @node Types service et services -@subsubsection Types service et services +@subsection Types service et services -A @dfn{service type} is a node in the DAG described above. Let us start -with a simple example, the service type for the Guix build daemon -(@pxref{Invoquer guix-daemon}): +Un @dfn{type de service} est un nœud dans le DAG décrit plus haut. +Commençons avec un exemple simple, le type de service pour le démon de +construction de Guix (@pxref{Invoquer guix-daemon}) : @example (define guix-service-type @@ -23435,44 +24270,45 @@ with a simple example, the service type for the Guix build daemon @end example @noindent -It defines three things: +Il définit trois choses : @enumerate @item -A name, whose sole purpose is to make inspection and debugging easier. +Un nom, dont le seul but de rendre l'inspection et le débogage plus faciles. @item -A list of @dfn{service extensions}, where each extension designates the -target service type and a procedure that, given the parameters of the -service, returns a list of objects to extend the service of that type. +Une liste d'@dfn{extensions de services}, où chaque extension désigne le +type de service cible et une procédure qui, étant donné les paramètres du +service, renvoie une liste d'objets pour étendre le service de ce type. -Every service type has at least one service extension. The only exception -is the @dfn{boot service type}, which is the ultimate service. +Chaque type de service a au moins une extension de service. La seule +exception est le @dfn{type de service boot}, qui est le service ultime. @item -Optionally, a default value for instances of this type. +Éventuellement, une valeur par défaut pour les instances de ce type. @end enumerate -In this example, @var{guix-service-type} extends three services: +Dans cet exemple, @var{guix-service-type} étend trois services : @table @var @item shepherd-root-service-type -The @var{guix-shepherd-service} procedure defines how the Shepherd service -is extended. Namely, it returns a @code{} object that -defines how @command{guix-daemon} is started and stopped (@pxref{Services Shepherd}). +La procédure @var{guix-shepherd-service} définit comment le service du +Shepherd est étendu. En fait, elle renvoie un objet +@code{} qui définit comment @command{guix-daemon} est +démarré et stoppé (@pxref{Services Shepherd}). @item account-service-type -This extension for this service is computed by @var{guix-accounts}, which -returns a list of @code{user-group} and @code{user-account} objects -representing the build user accounts (@pxref{Invoquer guix-daemon}). +Cette extension pour ce service est calculée par @var{guix-accounts}, qui +renvoie une liste d'objets @code{user-group} et @code{user-account} +représentant les comptes des utilisateurs de construction (@pxref{Invoquer guix-daemon}). @item activation-service-type -Here @var{guix-activation} is a procedure that returns a gexp, which is a -code snippet to run at ``activation time''---e.g., when the service is -booted. +Ici, @var{guix-activation} est une procédure qui renvoie une gexp, qui est +un bout de code qui s'exécute au moment de l'activation — p.@: ex.@: lorsque +le service est démarré. @end table -A service of this type is instantiated like this: +Un service de ce type est instancié de cette manière : @example (service guix-service-type @@ -23481,22 +24317,23 @@ A service of this type is instantiated like this: (use-substitutes? #f))) @end example -The second argument to the @code{service} form is a value representing the -parameters of this specific service instance. -@xref{guix-configuration-type, @code{guix-configuration}}, for information -about the @code{guix-configuration} data type. When the value is omitted, -the default value specified by @code{guix-service-type} is used: +Le deuxième argument de la forme @code{service} est une valeur représentant +les paramètres de cet instance spécifique du service. +@xref{guix-configuration-type, @code{guix-configuration}}, pour plus +d'informations sur le type de données @code{guix-configuration}. Lorsque la +valeur est omise, la valeur par défaut spécifiée par +@code{guix-service-type} est utilisée : @example (service guix-service-type) @end example -@var{guix-service-type} is quite simple because it extends other services -but is not extensible itself. +@var{guix-service-type} est très simple car il étend d'autres services mais +ne peut pas être étendu. @c @subsubsubsection Extensible Service Types -The service type for an @emph{extensible} service looks like this: +Le type de service pour un service @emph{extensible} ressemble à ceci : @example (define udev-service-type @@ -23505,98 +24342,100 @@ The service type for an @emph{extensible} service looks like this: (list (service-extension shepherd-root-service-type udev-shepherd-service))) - (compose concatenate) ;concatenate the list of rules + (compose concatenate) ; concatène la liste des règles (extend (lambda (config rules) (match config (($ udev initial-rules) (udev-configuration - (udev udev) ;the udev package to use + (udev udev) ; le paquet udev à utiliser (rules (append initial-rules rules))))))))) @end example -This is the service type for the -@uref{https://wiki.gentoo.org/wiki/Project:Eudev, eudev device management -daemon}. Compared to the previous example, in addition to an extension of -@var{shepherd-root-service-type}, we see two new fields: +C'est le type de service pour le +@uref{https://wiki.gentoo.org/wiki/Project:Eudev, le démon de gestion des +périphériques eudev}. Comparé à l'exemple précédent, en plus d'une +extension de @var{shepherd-root-service-type}, on trouve deux nouveaux +champs : @table @code @item compose -This is the procedure to @dfn{compose} the list of extensions to services of -this type. +C'est la procédure pour @dfn{composer} la liste des extensions de services +de ce type. -Services can extend the udev service by passing it lists of rules; we -compose those extensions simply by concatenating them. +Les services peuvent étendre le service udev en lui passant des listes de +règles ; on compose ces extensions simplement en les concaténant. @item extend -This procedure defines how the value of the service is @dfn{extended} with -the composition of the extensions. +Cette procédure définie comme la valeur du service est @dfn{étendue} avec la +composition des extensions. -Udev extensions are composed into a list of rules, but the udev service -value is itself a @code{} record. So here, we extend -that record by appending the list of rules it contains to the list of -contributed rules. +Les extensions Udev sont composés en une liste de règles, mais la valeur du +service udev est elle-même un enregistrement @code{}. +Donc ici, nous étendons cet enregistrement en ajoutant la liste des règle +contribuées à la liste des règles qu'il contient déjà. @item description -This is a string giving an overview of the service type. The string can -contain Texinfo markup (@pxref{Overview,,, texinfo, GNU Texinfo}). The -@command{guix system search} command searches these strings and displays -them (@pxref{Invoquer guix system}). +C'est une chaîne donnant un aperçu du type de service. Elle peut contenir +du balisage Texinfo (@pxref{Overview,,, texinfo, GNU Texinfo}). La commande +@command{guix system search} permet de rechercher dans ces chaînes et de les +afficher (@pxref{Invoquer guix system}). @end table -There can be only one instance of an extensible service type such as -@var{udev-service-type}. If there were more, the @code{service-extension} -specifications would be ambiguous. +Il ne peut y avoir qu'une instance d'un type de service extensible comme +@var{udev-service-type}. S'il y en avait plus, les spécification +@code{service-extension} seraient ambiguës. -Still here? The next section provides a reference of the programming -interface for services. +Toujours ici ? La section suivante fournit une référence de l'interface de +programmation des services. @node Référence de service -@subsubsection Référence de service +@subsection Référence de service -We have seen an overview of service types (@pxref{Types service et services}). This section provides a reference on how to manipulate services -and service types. This interface is provided by the @code{(gnu services)} -module. +Nous avons vu un résumé des types de services (@pxref{Types service et services}). Cette section fournit une référence sur la manière de manipuler +les services et les types de services. Cette interface est fournie par le +module @code{(gnu services)}. @deffn {Procédure Scheme} service @var{type} [@var{value}] -Return a new service of @var{type}, a @code{} object (see -below.) @var{value} can be any object; it represents the parameters of this -particular service instance. +Renvoie un nouveau service de type @var{type}, un objet +@code{} (voir plus bas). @var{value}peut être n'importe quel +objet ; il représente les paramètres de cette instance particulière du +service. -When @var{value} is omitted, the default value specified by @var{type} is -used; if @var{type} does not specify a default value, an error is raised. +Lorsque @var{value} est omise, la valeur par défaut spécifiée par @var{type} +est utilisée ; si @var{type} ne spécifie pas de valeur par défaut, une +erreur est levée. -For instance, this: +Par exemple ceci : @example (service openssh-service-type) @end example @noindent -is equivalent to this: +est équivalent à ceci : @example (service openssh-service-type (openssh-configuration)) @end example -In both cases the result is an instance of @code{openssh-service-type} with -the default configuration. +Dans les deux cas le résultat est une instance de +@code{openssh-service-type} avec la configuration par défaut. @end deffn @deffn {Procédure Scheme} service? @var{obj} -Return true if @var{obj} is a service. +Renvoie vrai si @var{obj} est un service. @end deffn @deffn {Procédure Scheme} service-kind @var{service} -Return the type of @var{service}---i.e., a @code{} object. +Renvoie le type de @var{service} — c.-à-d.@: un objet @code{}. @end deffn @deffn {Procédure Scheme} service-value @var{service} -Return the value associated with @var{service}. It represents its -parameters. +Renvoie la valeur associée à @var{service}. Elle représente ses paramètres. @end deffn -Here is an example of how a service is created and manipulated: +Voici un exemple de la manière dont un service est créé et manipulé : @example (define s @@ -23614,102 +24453,105 @@ Here is an example of how a service is created and manipulated: @result{} #t @end example -The @code{modify-services} form provides a handy way to change the -parameters of some of the services of a list such as @var{%base-services} -(@pxref{Services de base, @code{%base-services}}). It evaluates to a list of -services. Of course, you could always use standard list combinators such as -@code{map} and @code{fold} to do that (@pxref{SRFI-1, List Library,, guile, -GNU Guile Reference Manual}); @code{modify-services} simply provides a more -concise form for this common pattern. +La forme @code{modify-services} fournit une manière pratique de modifier les +paramètres de certains services d'une liste comme @var{%base-services} +(@pxref{Services de base, @code{%base-services}}). Elle s'évalue en une liste +de services. Bien sûr, vous pouvez toujours utiliser les combinateurs de +liste standards comme @code{map} et @code{fold} pour cela (@pxref{SRFI-1, +List Library,, guile, GNU Guile Reference Manual}) ; @code{modify-services} +fournit simplement une manière plus concise pour ce besoin commun. -@deffn {Scheme Syntax} modify-services @var{services} @ +@deffn {Syntaxe Scheme} modify-services @var{services} @ (@var{type} @var{variable} => @var{body}) @dots{} -Modify the services listed in @var{services} according to the given -clauses. Each clause has the form: +Modifie les services listés dans @var{services} en fonction des clauses +données. Chaque clause à la forme : @example (@var{type} @var{variable} => @var{body}) @end example -where @var{type} is a service type---e.g., @code{guix-service-type}---and -@var{variable} is an identifier that is bound within the @var{body} to the -service parameters---e.g., a @code{guix-configuration} instance---of the -original service of that @var{type}. +où @var{type} est un type de service — p.@: ex.@: @code{guix-service-type} — +et @var{variable} est un identifiant lié dans @var{body} aux paramètres du +service — p.@: ex.@: une instance de @code{guix-configuration} — du service +original de ce @var{type}. -The @var{body} should evaluate to the new service parameters, which will be -used to configure the new service. This new service will replace the -original in the resulting list. Because a service's service parameters are -created using @code{define-record-type*}, you can write a succinct -@var{body} that evaluates to the new service parameters by using the -@code{inherit} feature that @code{define-record-type*} provides. +La variable @var{body} devrait s'évaluer en de nouveaux paramètres de +service, qui seront utilisés pour configurer le nouveau service. Ce nouveau +service remplacera l'original dans la liste qui en résulte. Comme les +paramètres d'un service sont créés avec @code{define-record-type*}, vous +pouvez écrire un @var{body} court qui s'évalue en de nouveaux paramètres +pour le services en utilisant @code{inherit}, fourni par +@code{define-record-type*}. -@xref{Utiliser le système de configuration}, for example usage. +@xref{Utiliser le système de configuration} pour des exemples d'utilisation. @end deffn -Next comes the programming interface for service types. This is something -you want to know when writing new service definitions, but not necessarily -when simply looking for ways to customize your @code{operating-system} -declaration. +Suit l'interface de programmation des types de services. Vous devrez la +connaître pour écrire de nouvelles définitions de services, mais pas +forcément lorsque vous cherchez des manières simples de personnaliser votre +déclaration @code{operating-system}. @deftp {Type de données} service-type @cindex type de service -This is the representation of a @dfn{service type} (@pxref{Types service et services}). +C'est la représentation d'un @dfn{type de service} (@pxref{Types service et services}). @table @asis @item @code{name} -This is a symbol, used only to simplify inspection and debugging. +C'est un symbole, utilisé seulement pour simplifier l'inspection et le +débogage. @item @code{extensions} -A non-empty list of @code{} objects (see below). +Une liste non-vide d'objets @code{} (voir plus bas). @item @code{compose} (par défaut : @code{#f}) -If this is @code{#f}, then the service type denotes services that cannot be -extended---i.e., services that do not receive ``values'' from other -services. +S'il s'agit de @code{#f}, le type de service dénote des services qui ne +peuvent pas être étendus — c.-à-d.@: qui ne reçoivent pas de « valeurs » +d'autres services. -Otherwise, it must be a one-argument procedure. The procedure is called by -@code{fold-services} and is passed a list of values collected from -extensions. It may return any single value. +Sinon, ce doit être une procédure à un argument. La procédure est appelée +par @code{fold-services} et on lui passe une liste de valeurs collectées par +les extensions. Elle peut renvoyer n'importe quelle valeur simple. @item @code{extend} (par défaut : @code{#f}) -If this is @code{#f}, services of this type cannot be extended. - -Otherwise, it must be a two-argument procedure: @code{fold-services} calls -it, passing it the initial value of the service as the first argument and -the result of applying @code{compose} to the extension values as the second -argument. It must return a value that is a valid parameter value for the -service instance. +Si la valeur est @code{#f}, les services de ce type ne peuvent pas être +étendus. + +Sinon, il doit s'agir 'une procédure à deux arguments : @code{fold-services} +l'appelle et lui passe la valeur initiale du service comme premier argument +et le résultat de l'application de @code{compose} sur les valeurs +d'extension en second argument. Elle doit renvoyer une valeur qui est une +valeur de paramètre valide pour l'instance du service. @end table -@xref{Types service et services}, for examples. +@xref{Types service et services}, pour des exemples. @end deftp @deffn {Procédure Scheme} service-extension @var{target-type} @ - @var{compute} Return a new extension for services of type -@var{target-type}. @var{compute} must be a one-argument procedure: -@code{fold-services} calls it, passing it the value associated with the -service that provides the extension; it must return a valid value for the -target service. + @var{compute} +Renvoie une nouvelle extension pour les services de type @var{target-type}. +@var{compute} doit être une procédure à un argument : @code{fold-services} +l'appelle et lui passe la valeur associée au service qui fournit cette +extension ; elle doit renvoyer une valeur valide pour le service cible. @end deffn @deffn {Procédure Scheme} service-extension? @var{obj} -Return true if @var{obj} is a service extension. +Renvoie vrai si @var{obj} est une extension de service. @end deffn -Occasionally, you might want to simply extend an existing service. This -involves creating a new service type and specifying the extension of -interest, which can be verbose; the @code{simple-service} procedure provides -a shorthand for this. +Parfois, vous voudrez simplement étendre un service existant. Cela implique +de créer un nouveau type de service et de spécifier l'extension qui vous +intéresse, ce qui peut être assez verbeux ; la procédure +@code{simple-service} fournit un raccourci pour ce cas. @deffn {Procédure Scheme} simple-service @var{name} @var{target} @var{value} -Return a service that extends @var{target} with @var{value}. This works by -creating a singleton service type @var{name}, of which the returned service -is an instance. +Renvoie un service qui étend @var{target} avec @var{value}. Cela fonctionne +en créant un type de service singleton @var{name}, dont le service renvoyé +est une instance. -For example, this extends mcron (@pxref{Exécution de tâches planifiées}) with an -additional job: +Par exemple, cela étend mcron (@pxref{Exécution de tâches planifiées}) avec une +tâche supplémentaire : @example (simple-service 'my-mcron-job mcron-service-type @@ -23717,219 +24559,230 @@ additional job: @end example @end deffn -At the core of the service abstraction lies the @code{fold-services} -procedure, which is responsible for ``compiling'' a list of services down to -a single directory that contains everything needed to boot and run the -system---the directory shown by the @command{guix system build} command -(@pxref{Invoquer guix system}). In essence, it propagates service -extensions down the service graph, updating each node parameters on the way, -until it reaches the root node. +Au cœur de l'abstraction des services se cache la procédure +@code{fold-services}, responsable de la « compilation » d'une liste de +services en un répertoire unique qui contient tout ce qui est nécessaire au +démarrage et à l'exécution du système — le répertoire indiqué par la +commande @command{guix system build} (@pxref{Invoquer guix system}). En +soit, elle propage les extensions des services le long du graphe des +services, en mettant à jour chaque paramètre des nœuds sur son chemin, +jusqu'à atteindre le nœud racine. @deffn {Procédure Scheme} fold-services @var{services} @ - [#:target-type @var{system-service-type}] Fold @var{services} by propagating -their extensions down to the root of type @var{target-type}; return the root -service adjusted accordingly. + [#:target-type @var{system-service-type}] +Replie @var{services} en propageant leurs extensions jusqu'à la racine de +type @var{target-type} ; renvoie le service racine ajusté de cette manière. @end deffn -Lastly, the @code{(gnu services)} module also defines several essential -service types, some of which are listed below. +Enfin, le module @code{(gnu services)} définie aussi divers types de +services essentiels, dont certains sont listés ci-dessous. @defvr {Variable Scheme} system-service-type -This is the root of the service graph. It produces the system directory as -returned by the @command{guix system build} command. +C'est la racine du graphe des services. Il produit le répertoire du système +renvoyé par la commande @command{guix system build}. @end defvr @defvr {Variable Scheme} boot-service-type -The type of the ``boot service'', which produces the @dfn{boot script}. The -boot script is what the initial RAM disk runs when booting. +Le type du service « boot », qui produit le @dfn{script de démarrage}. Le +script de démarrage est ce que le disque de RAM initial lance au démarrage. @end defvr @defvr {Variable Scheme} etc-service-type -The type of the @file{/etc} service. This service is used to create files -under @file{/etc} and can be extended by passing it name/file tuples such -as: +Le type du service @file{/etc}. Ce service est utilisé pour créer des +fichiers dans @file{/etc} et peut être étendu en lui passant des tuples +nom/fichier comme ceci : @example -(list `("issue" ,(plain-file "issue" "Welcome!\n"))) +(list `("issue" ,(plain-file "issue" "Bienvenue !\n"))) @end example -In this example, the effect would be to add an @file{/etc/issue} file -pointing to the given file. +Dans cet exemple, l'effet serait d'ajouter un fichier @file{/etc/issue} +pointant vers le fichier donné. @end defvr @defvr {Variable Scheme} setuid-program-service-type -Type for the ``setuid-program service''. This service collects lists of -executable file names, passed as gexps, and adds them to the set of -setuid-root programs on the system (@pxref{Programmes setuid}). +Le type du « service setuid ». Ce service récupère des listes de noms de +fichiers exécutables, passés en tant que gexps, et les ajoute à l'ensemble +des programmes setuid root sur le système (@pxref{Programmes setuid}). @end defvr @defvr {Variable Scheme} profile-service-type -Type of the service that populates the @dfn{system profile}---i.e., the -programs under @file{/run/current-system/profile}. Other services can -extend it by passing it lists of packages to add to the system profile. +De type du service qui rempli le @dfn{profil du système} — c.-à-d.@: les +programmes dans @file{/run/current-system/profile}. Les autres services +peuvent l'étendre en lui passant des listes de paquets à ajouter au profil +du système. @end defvr @node Services Shepherd -@subsubsection Services Shepherd +@subsection Services Shepherd @cindex services shepherd @cindex PID 1 -@cindex init system +@cindex système d'init The @code{(gnu services shepherd)} module provides a way to define services -managed by the GNU@tie{}Shepherd, which is the GuixSD initialization -system---the first process that is started when the system boots, also known -as PID@tie{}1 (@pxref{Introduction,,, shepherd, The GNU Shepherd Manual}). +managed by the GNU@tie{}Shepherd, which is the initialization system---the +first process that is started when the system boots, also known as +PID@tie{}1 (@pxref{Introduction,,, shepherd, The GNU Shepherd Manual}). -Services in the Shepherd can depend on each other. For instance, the SSH -daemon may need to be started after the syslog daemon has been started, -which in turn can only happen once all the file systems have been mounted. -The simple operating system defined earlier (@pxref{Utiliser le système de configuration}) results in a service graph like this: +Les services dans le Shepherd peuvent dépendre les uns des autres. Par +exemple, le démon SSH peut avoir besoin d'être démarré après le démon +syslog, qui à son tour doit être démarré après le montage des systèmes de +fichiers. Le système d'exploitation simple déclaré précédemment +(@pxref{Utiliser le système de configuration}) crée un graphe de service comme +ceci : -@image{images/shepherd-graph,,5in,Typical shepherd service graph.} +@image{images/shepherd-graph,,5in,Graphe de service typique du shepherd.} -You can actually generate such a graph for any operating system definition -using the @command{guix system shepherd-graph} command +Vous pouvez générer un tel graphe pour n'importe quelle définition de +système d'exploitation avec la commande @command{guix system shepherd-graph} (@pxref{system-shepherd-graph, @command{guix system shepherd-graph}}). -The @var{%shepherd-root-service} is a service object representing -PID@tie{}1, of type @var{shepherd-root-service-type}; it can be extended by -passing it lists of @code{} objects. +La variable @var{%shepherd-root-service} est un objet de service +représentant le PID@tie{}1, de type @var{shepherd-root-service-type} ; il +peut être étendu en lui passant des listes d'objets +@code{}. @deftp {Type de données} shepherd-service -The data type representing a service managed by the Shepherd. +Le type de données représentant un service géré par le Shepherd. @table @asis @item @code{provision} -This is a list of symbols denoting what the service provides. +C'est une liste de symboles dénotant ce que le service fournit. -These are the names that may be passed to @command{herd start}, -@command{herd status}, and similar commands (@pxref{Invoking herd,,, +Ce sont les noms qui peuvent être passés à @command{herd start}, +@command{herd status} et les commandes similaires (@pxref{Invoking herd,,, shepherd, The GNU Shepherd Manual}). @xref{Slots of services, the -@code{provides} slot,, shepherd, The GNU Shepherd Manual}, for details. +@code{provides} slot,, shepherd, The GNU Shepherd Manual}, pour plus de +détails. @item @code{requirements} (par défaut : @code{'()}) -List of symbols denoting the Shepherd services this one depends on. +Liste de symboles dénotant les services du Shepherd dont celui-ci dépend. @item @code{respawn?} (par défaut : @code{#t}) -Whether to restart the service when it stops, for instance when the -underlying process dies. +Indique s'il faut redémarrer le service lorsqu'il s'arrête, par exemple si +le processus sous-jacent meurt. @item @code{start} @itemx @code{stop} (par défaut : @code{#~(const #f)}) -The @code{start} and @code{stop} fields refer to the Shepherd's facilities -to start and stop processes (@pxref{Service De- and Constructors,,, -shepherd, The GNU Shepherd Manual}). They are given as G-expressions that -get expanded in the Shepherd configuration file (@pxref{G-Expressions}). +Les champs @code{start} et @code{stop} se réfèrent à la capacité du Shepherd +de démarrer et d'arrêter des processus (@pxref{Service De- and +Constructors,,, shepherd, The GNU Shepherd Manual}). Ils sont donnés comme +des G-expressions qui sont étendues dans le fichier de configuration du +Shepherd (@pxref{G-Expressions}). @item @code{actions} (par défaut : @code{'()}) @cindex action, des services Shepherd -This is a list of @code{shepherd-action} objects (see below) defining -@dfn{actions} supported by the service, in addition to the standard -@code{start} and @code{stop} actions. Actions listed here become available -as @command{herd} sub-commands: +C'est une liste d'objets @code{shepherd-action} (voir plus bas) définissant +des @dfn{actions} supportées par le service, en plus des actions +@code{start} et @code{stop} standards. Les actions listées ici sont +disponibles en tant que sous-commande de @command{herd}. @example herd @var{action} @var{service} [@var{arguments}@dots{}] @end example @item @code{documentation} -A documentation string, as shown when running: +Une chaîne de documentation, montrée lorsqu'on lance : @example herd doc @var{service-name} @end example -where @var{service-name} is one of the symbols in @var{provision} +où @var{service-name} est l'un des symboles dans @var{provision} (@pxref{Invoking herd,,, shepherd, The GNU Shepherd Manual}). @item @code{modules} (par défaut : @var{%default-modules}) -This is the list of modules that must be in scope when @code{start} and -@code{stop} are evaluated. +C'est la liste des modules qui doivent être dans le contexte lorsque +@code{start} et @code{stop} sont évalués. @end table @end deftp @deftp {Type de données} shepherd-action -This is the data type that defines additional actions implemented by a -Shepherd service (see above). +C'est le type de données qui définie des actions supplémentaires +implémentées par un service Shepherd (voir au-dessus). @table @code @item name Symbole nommant l'action @item documentation -This is a documentation string for the action. It can be viewed by running: +C'est une chaîne de documentation pour l'action. Elle peut être consultée +avec : @example herd doc @var{service} action @var{action} @end example @item procedure -This should be a gexp that evaluates to a procedure of at least one -argument, which is the ``running value'' of the service (@pxref{Slots of -services,,, shepherd, The GNU Shepherd Manual}). +Cela devrait être une gexp qui s'évalue en une procédure à au moins un +argument, la « valeur de lancement » du service (@pxref{Slots of services,,, +shepherd, The GNU Shepherd Manual}). @end table -The following example defines an action called @code{say-hello} that kindly -greets the user: +L'exemple suivant définie une action nommée @code{dire-bonjour} qui salue +amicalement l'utilisateur : @example (shepherd-action - (name 'say-hello) - (documentation "Say hi!") + (name 'dire-bonjour) + (documentation "Dit salut !") (procedure #~(lambda (running . args) - (format #t "Hello, friend! arguments: ~s\n" + (format #t "Salut, l'ami ! arguments : ~s\n" args) #t))) @end example -Assuming this action is added to the @code{example} service, then you can -do: +En supposant que cette action est ajoutée dans le service @code{example}, +vous pouvez écrire : @example -# herd say-hello example -Hello, friend! arguments: () -# herd say-hello example a b c -Hello, friend! arguments: ("a" "b" "c") +# herd dire-bonjour example +Salut, l'ami ! arguments : () +# herd dire-bonjour example a b c +Salut, l'ami ! arguments : ("a" "b" "c") @end example -This, as you can see, is a fairly sophisticated way to say hello. -@xref{Service Convenience,,, shepherd, The GNU Shepherd Manual}, for more -info on actions. +Comme vous pouvez le voir, c'est une manière assez sophistiquée de dire +bonjour. @xref{Service Convenience,,, shepherd, The GNU Shepherd Manual}, +pour plus d'informations sur les actions. @end deftp @defvr {Variable Scheme} shepherd-root-service-type -The service type for the Shepherd ``root service''---i.e., PID@tie{}1. +Le type de service pour le « service racine » du Shepherd — c.-à-d.@: le +PID@tie{}1. -This is the service type that extensions target when they want to create -shepherd services (@pxref{Types service et services}, for an example). -Each extension must pass a list of @code{}. +C'est le type de service que les extensions ciblent lorqu'elles veulent +créer un service shepherd (@pxref{Types service et services}, pour un +exemple). Chaque extension doit passer une liste de +@code{}. @end defvr @defvr {Variable Scheme} %shepherd-root-service -This service represents PID@tie{}1. +Ce service représente le PID@tie{}1. @end defvr @node Documentation -@section Documentation - -@cindex documentation, searching for -@cindex searching for documentation -@cindex Info, documentation format -@cindex man pages -@cindex manual pages -In most cases packages installed with Guix come with documentation. There -are two main documentation formats: ``Info'', a browseable hypertext format -used for GNU software, and ``manual pages'' (or ``man pages''), the linear -documentation format traditionally found on Unix. Info manuals are accessed -with the @command{info} command or with Emacs, and man pages are accessed -using @command{man}. - -You can look for documentation of software installed on your system by -keyword. For example, the following command searches for information about -``TLS'' in Info manuals: +@chapter Documentation + +@cindex documentation, recherche +@cindex chercher de la documentation +@cindex Info, format de documentation +@cindex man, pages de manuel +@cindex pages de manuel +Dans la plupart des cas les paquets installés avec Guix ont une +documentation. Il y a deux formats de documentation principaux : « Info », +un format hypertexte navigable utilisé par les logiciels GNU et les « pages +de manuel » (ou « pages de man »), le format de documentation linéaire +traditionnel chez Unix. Les manuels Info sont disponibles via la commande +@command{info} ou avec Emacs, et les pages de man sont accessibles via la +commande @command{man}. + +Vous pouvez chercher de la documentation pour les logiciels installés sur +votre système par mot-clef. Par exemple, la commande suivante recherche des +informations sur « TLS » dans les manuels Info : @example $ info -k TLS @@ -23941,7 +24794,7 @@ $ info -k TLS @end example @noindent -The command below searches for the same keyword in man pages: +La commande suivante recherche le même mot-clef dans les pages de man : @example $ man -k TLS @@ -23950,40 +24803,42 @@ certtool (1) - GnuTLS certificate tool @dots {} @end example -These searches are purely local to your computer so you have the guarantee -that documentation you find corresponds to what you have actually installed, -you can access it off-line, and your privacy is respected. +Ces recherches sont purement locales à votre ordinateur donc vous savez que +la documentation trouvée correspond à ce qui est effectivement installé, +vous pouvez y accéder hors ligne et votre vie privée est préservée. -Once you have these results, you can view the relevant documentation by -running, say: +Une fois que vous avez ces résultats, vous pouvez visualiser la +documentation appropriée avec, disons : @example $ info "(gnutls)Core TLS API" @end example @noindent -or: +ou : @example $ man certtool @end example -Info manuals contain sections and indices as well as hyperlinks like those -found in Web pages. The @command{info} reader (@pxref{Top, Info reader,, -info-stnd, Stand-alone GNU Info}) and its Emacs counterpart (@pxref{Misc -Help,,, emacs, The GNU Emacs Manual}) provide intuitive key bindings to -navigate manuals. @xref{Getting Started,,, info, Info: An Introduction}, -for an introduction to Info navigation. +Les manuels Info contiennent des sections et des indexs ainsi que des +hyperliens comme ce qu'on trouve sur les pages Web. Le lecteur +@command{info} (@pxref{Top, Info reader,, info-stnd, Stand-alone GNU Info}) +et sa contre-partie dans Emacs (@pxref{Misc Help,,, emacs, The GNU Emacs +Manual}) fournissent des raccourcis claviers intuitifs pour naviguer dans +les manuels @xref{Getting Started,,, info, Info: An Introduction} pour +trouver une introduction sur la navigation dans info. @node Installer les fichiers de débogage -@section Installer les fichiers de débogage +@chapter Installer les fichiers de débogage -@cindex debugging files -Program binaries, as produced by the GCC compilers for instance, are -typically written in the ELF format, with a section containing -@dfn{debugging information}. Debugging information is what allows the -debugger, GDB, to map binary code to source code; it is required to debug a -compiled program in good conditions. +@cindex fichiers de débogage +Les binaires des programmes, produits par les compilateurs GCC par exemple, +sont typiquement écrits au format ELF, avec une section contenant des +@dfn{informations de débogage}. Les informations de débogage sont ce qui +permet au débogueur, GDB, de relier le code binaire et le code source ; +elles sont requises pour déboguer un programme compilé dans de bonnes +conditions. Le problème avec les informations de débogage est qu'elles prennent pas mal de place sur le disque. Par exemple, les informations de débogage de la @@ -23994,76 +24849,79 @@ pas empêcher le débogage — en particulier, dans le système GNU, qui devrait faciliter pour ses utilisateurs l'exercice de leurs libertés (@pxref{Distribution GNU}). -Thankfully, the GNU Binary Utilities (Binutils) and GDB provide a mechanism -that allows users to get the best of both worlds: debugging information can -be stripped from the binaries and stored in separate files. GDB is then -able to load debugging information from those files, when they are available +Heureusement, les utilitaires binaires de GNU (Binutils) et GDB fournissent +un mécanisme qui permet aux utilisateurs d'avoir le meilleur des deux mondes +: les informations de débogage peuvent être nettoyées des binaires et +stockées dans des fichiers séparés. GDB peut ensuite charger les +informations de débogage depuis ces fichiers, lorsqu'elles sont disponibles (@pxref{Separate Debug Files,,, gdb, Debugging with GDB}). -The GNU distribution takes advantage of this by storing debugging -information in the @code{lib/debug} sub-directory of a separate package -output unimaginatively called @code{debug} (@pxref{Des paquets avec plusieurs résultats}). Users can choose to install the @code{debug} output of a package -when they need it. For instance, the following command installs the -debugging information for the GNU C Library and for GNU Guile: +La distribution GNU se sert de cela pour stocker les informations de +débogage dans le sous-répertoire @code{lib/debug} d'une sortie séparée du +paquet appelée sans grande imagination @code{debug} (@pxref{Des paquets avec plusieurs résultats}). Les utilisateurs peuvent choisir d'installer la sortie +@code{debug} d'un paquet lorsqu'ils en ont besoin. Par exemple, la commande +suivante installe les informations de débogage pour la bibliothèque C de GNU +et pour GNU Guile. @example guix package -i glibc:debug guile:debug @end example -GDB must then be told to look for debug files in the user's profile, by -setting the @code{debug-file-directory} variable (consider setting it from -the @file{~/.gdbinit} file, @pxref{Startup,,, gdb, Debugging with GDB}): +On doit ensuite dire à GDB de chercher les fichiers de débogage dans le +profil de l'utilisateur, en remplissant la variable +@code{debug-file-directory} (vous pourriez aussi l'instancier depuis le +fichier @file{~/.gdbinit}, @pxref{Startup,,, gdb, Debugging with GDB}) : @example (gdb) set debug-file-directory ~/.guix-profile/lib/debug @end example -From there on, GDB will pick up debugging information from the @code{.debug} -files under @file{~/.guix-profile/lib/debug}. +À partir de maintenant, GDB récupérera les informations de débogage dans les +fichiers @code{.debug} de @file{~/.guix-profile/lib/debug}. -In addition, you will most likely want GDB to be able to show the source -code being debugged. To do that, you will have to unpack the source code of -the package of interest (obtained with @code{guix build --source}, -@pxref{Invoquer guix build}), and to point GDB to that source directory -using the @code{directory} command (@pxref{Source Path, @code{directory},, -gdb, Debugging with GDB}). +EN plus, vous voudrez sans doute que GDB puisse montrer le code source +débogué. Pour cela, vous devrez désarchiver le code source du paquet qui +vous intéresse (obtenu via @code{guix build --source}, @pxref{Invoquer guix build}) et pointer GDB vers ce répertoire des sources avec la commande +@code{directory} (@pxref{Source Path, @code{directory},, gdb, Debugging with +GDB}). @c XXX: keep me up-to-date -The @code{debug} output mechanism in Guix is implemented by the -@code{gnu-build-system} (@pxref{Systèmes de construction}). Currently, it is -opt-in---debugging information is available only for the packages with -definitions explicitly declaring a @code{debug} output. This may be changed -to opt-out in the future if our build farm servers can handle the load. To -check whether a package has a @code{debug} output, use @command{guix package ---list-available} (@pxref{Invoquer guix package}). +Le mécanisme de la sortie @code{debug} dans Guix est implémenté par le +@code{gnu-build-system} (@pxref{Systèmes de construction}). Actuellement, ce n'est pas +obligatoire — les informations de débogage sont disponibles uniquement si +les définitions déclarent explicitement une sortie @code{debug}. Cela +pourrait être modifié tout en permettant aux paquets de s'en passer dans le +futur si nos serveurs de construction peuvent tenir la charge. Pour +vérifier si un paquet a une sortie @code{debug}, utilisez @command{guix +package --list-available} (@pxref{Invoquer guix package}). @node Mises à jour de sécurité -@section Mises à jour de sécurité +@chapter Mises à jour de sécurité -@cindex security updates +@cindex mises à jour de sécurité @cindex vulnérabilités -Occasionally, important security vulnerabilities are discovered in software -packages and must be patched. Guix developers try hard to keep track of -known vulnerabilities and to apply fixes as soon as possible in the -@code{master} branch of Guix (we do not yet provide a ``stable'' branch -containing only security updates.) The @command{guix lint} tool helps -developers find out about vulnerable versions of software packages in the -distribution: +Parfois, des vulnérabilités importantes sont découvertes dans les paquets +logiciels et doivent être corrigées. Les développeurs de Guix essayent de +suivre les vulnérabilités connues et d'appliquer des correctifs aussi vite +que possible dans la branche @code{master} de Guix (nous n'avons pas encore +de branche « stable » contenant seulement des mises à jour de sécurité). +L'outil @command{guix lint} aide les développeurs à trouver les versions +vulnérables des paquets logiciels dans la distribution. @smallexample $ guix lint -c cve -gnu/packages/base.scm:652:2: glibc@@2.21: probably vulnerable to CVE-2015-1781, CVE-2015-7547 -gnu/packages/gcc.scm:334:2: gcc@@4.9.3: probably vulnerable to CVE-2015-5276 -gnu/packages/image.scm:312:2: openjpeg@@2.1.0: probably vulnerable to CVE-2016-1923, CVE-2016-1924 +gnu/packages/base.scm:652:2: glibc@@2.21: probablement vulnérable à CVE-2015-1781, CVE-2015-7547 +gnu/packages/gcc.scm:334:2: gcc@@4.9.3: probablement vulnérable à CVE-2015-5276 +gnu/packages/image.scm:312:2: openjpeg@@2.1.0: probablement vulnérable à CVE-2016-1923, CVE-2016-1924 @dots{} @end smallexample -@xref{Invoquer guix lint}, for more information. +@xref{Invoquer guix lint}, pour plus d'informations. @quotation Remarque -As of version @value{VERSION}, the feature described below is considered -``beta''. +À la version @value{VERSION}, la fonctionnalité ci-dessous est considérée +comme « bêta ». @end quotation Guix suit une discipline de gestion de paquets fonctionnelle @@ -24076,20 +24934,22 @@ d'être reconstruite. Cela aide d'utiliser des binaires pré-construits temps de souhaité. @cindex greffes -To address this, Guix implements @dfn{grafts}, a mechanism that allows for -fast deployment of critical updates without the costs associated with a -whole-distribution rebuild. The idea is to rebuild only the package that -needs to be patched, and then to ``graft'' it onto packages explicitly -installed by the user and that were previously referring to the original -package. The cost of grafting is typically very low, and order of -magnitudes lower than a full rebuild of the dependency chain. - -@cindex replacements of packages, for grafts -For instance, suppose a security update needs to be applied to Bash. Guix -developers will provide a package definition for the ``fixed'' Bash, say -@var{bash-fixed}, in the usual way (@pxref{Définition des paquets}). Then, the -original package definition is augmented with a @code{replacement} field -pointing to the package containing the bug fix: +Pour corriger cela, Guix implémente les @dfn{greffes}, un mécanisme qui +permet un déploiement rapide des mises à jour de sécurité critiques sans le +coût associé à une reconstruction complète de la distribution. L'idée est +de reconstruire uniquement le paquet qui doit être corrigé puis de le « +greffer » sur les paquets qui sont explicitement installés par l'utilisateur +et qui se référaient avant au paquet d'origine. Le coût d'une greffe est +typiquement très bas, et plusieurs ordres de grandeurs moins élevé que de +reconstruire tout la chaîne de dépendance. + +@cindex remplacement de paquet, pour les greffes +Par exemple, supposons qu'une mise à jour de sécurité doive être appliquée à +Bash. Les développeurs de Guix fourniront une définition de paquet pour le +Bash « corrigé », disons @var{bash-fixed}, de la manière habituelle +(@pxref{Définition des paquets}). Ensuite, la définition originale du paquet est +augmentée avec un champ @code{replacement} qui pointe vers le paquet +contenant le correctif de sécurité : @example (define bash @@ -24099,44 +24959,44 @@ pointing to the package containing the bug fix: (replacement bash-fixed))) @end example -From there on, any package depending directly or indirectly on Bash---as -reported by @command{guix gc --requisites} (@pxref{Invoquer guix gc})---that -is installed is automatically ``rewritten'' to refer to @var{bash-fixed} -instead of @var{bash}. This grafting process takes time proportional to the -size of the package, usually less than a minute for an ``average'' package -on a recent machine. Grafting is recursive: when an indirect dependency -requires grafting, then grafting ``propagates'' up to the package that the -user is installing. +À partir de maintenant, tout paquet dépendant directement ou indirectement +de Bash — rapporté par @command{guix gc --requisites} (@pxref{Invoquer guix gc}) — installé est automatiquement « réécrit » pour se référer à +@var{bash-fixed} au lieu de @var{bash}. Ce processus de greffe prend du +temps en proportion de la taille du paquet, typiquement moins d'une minute +pour un paquet de taille « moyenne » sur une machine récente. La greffe est +récursive : lorsqu'une dépendance indirecte a besoin d'être greffée, la +greffe se « propage » jusqu'au paquet que l'utilisateur installe. -Currently, the length of the name and version of the graft and that of the -package it replaces (@var{bash-fixed} and @var{bash} in the example above) -must be equal. This restriction mostly comes from the fact that grafting -works by patching files, including binary files, directly. Other -restrictions may apply: for instance, when adding a graft to a package -providing a shared library, the original shared library and its replacement -must have the same @code{SONAME} and be binary-compatible. +Actuellement la longueur du nom et la version de la greffe et du paquet +qu'il remplace (@var{bash-fixed} et @var{bash} dans l'exemple ci-dessus) +doivent être identiques. Cette restriction vient surtout du fait que la +greffe fonctionne en corrigeant les fichiers, dont des fichiers binaires, +directement. D'autres restrictions peuvent apparaître : par exemple, si +vous ajoutez une greffe à un paquet fournissant une bibliothèque partagée, +la bibliothèque partagée originale et son remplacement doivent avoir le même +@code{SONAME} et être compatibles au niveau binaire. -The @option{--no-grafts} command-line option allows you to forcefully avoid -grafting (@pxref{Options de construction communes, @option{--no-grafts}}). Thus, the -command: +L'option en ligne de commande @option{--no-grafts} vous permet d'éviter les +greffes (@pxref{Options de construction communes, @option{--no-grafts}}). Donc la +commande : @example guix build bash --no-grafts @end example @noindent -returns the store file name of the original Bash, whereas: +renvoie le nom de fichier dans les dépôt du Bash original, alors que : @example guix build bash @end example @noindent -returns the store file name of the ``fixed'', replacement Bash. This allows -you to distinguish between the two variants of Bash. +renvoie le nom de fichier du Bash « corrigé » de remplacement. Cela vous +permet de distinguer les deux variantes de Bash. -To verify which Bash your whole profile refers to, you can run -(@pxref{Invoquer guix gc}): +Pour vérifier à quel Bash votre profil se réfère, vous pouvez lancer +(@pxref{Invoquer guix gc}) : @example guix gc -R `readlink -f ~/.guix-profile` | grep bash @@ -24144,554 +25004,62 @@ guix gc -R `readlink -f ~/.guix-profile` | grep bash @noindent @dots{} and compare the store file names that you get with those above. -Likewise for a complete GuixSD system generation: +Likewise for a complete Guix system generation: @example guix gc -R `guix system build my-config.scm` | grep bash @end example -Lastly, to check which Bash running processes are using, you can use the -@command{lsof} command: +Enfin, pour vérifier quelles processus Bash lancés vous utilisez, vous +pouvez utiliser la commande @command{lsof} : @example lsof | grep /gnu/store/.*bash @end example -@node Modules de paquets -@section Modules de paquets - -From a programming viewpoint, the package definitions of the GNU -distribution are provided by Guile modules in the @code{(gnu packages -@dots{})} name space@footnote{Note that packages under the @code{(gnu -packages @dots{})} module name space are not necessarily ``GNU packages''. -This module naming scheme follows the usual Guile module naming convention: -@code{gnu} means that these modules are distributed as part of the GNU -system, and @code{packages} identifies modules that define packages.} -(@pxref{Modules, Guile modules,, guile, GNU Guile Reference Manual}). For -instance, the @code{(gnu packages emacs)} module exports a variable named -@code{emacs}, which is bound to a @code{} object (@pxref{Définition des paquets}). - -The @code{(gnu packages @dots{})} module name space is automatically scanned -for packages by the command-line tools. For instance, when running -@code{guix package -i emacs}, all the @code{(gnu packages @dots{})} modules -are scanned until one that exports a package object whose name is -@code{emacs} is found. This package search facility is implemented in the -@code{(gnu packages)} module. - -@cindex personnalisation, des paquets -@cindex package module search path -Users can store package definitions in modules with different names---e.g., -@code{(my-packages emacs)}@footnote{Note that the file name and module name -must match. For instance, the @code{(my-packages emacs)} module must be -stored in a @file{my-packages/emacs.scm} file relative to the load path -specified with @option{--load-path} or @code{GUIX_PACKAGE_PATH}. -@xref{Modules and the File System,,, guile, GNU Guile Reference Manual}, for -details.}. There are two ways to make these package definitions visible to -the user interfaces: - -@enumerate -@item -By adding the directory containing your package modules to the search path -with the @code{-L} flag of @command{guix package} and other commands -(@pxref{Options de construction communes}), or by setting the @code{GUIX_PACKAGE_PATH} -environment variable described below. - -@item -By defining a @dfn{channel} and configuring @command{guix pull} so that it -pulls from it. A channel is essentially a Git repository containing package -modules. @xref{Canaux}, for more information on how to define and use -channels. -@end enumerate - -@code{GUIX_PACKAGE_PATH} works similarly to other search path variables: - -@defvr {Environment Variable} GUIX_PACKAGE_PATH -This is a colon-separated list of directories to search for additional -package modules. Directories listed in this variable take precedence over -the own modules of the distribution. -@end defvr - -The distribution is fully @dfn{bootstrapped} and @dfn{self-contained}: each -package is built based solely on other packages in the distribution. The -root of this dependency graph is a small set of @dfn{bootstrap binaries}, -provided by the @code{(gnu packages bootstrap)} module. For more -information on bootstrapping, @pxref{Bootstrapping}. - -@node Consignes d'empaquetage -@section Consignes d'empaquetage - -@cindex packages, creating -The GNU distribution is nascent and may well lack some of your favorite -packages. This section describes how you can help make the distribution -grow. @xref{Contribuer}, for additional information on how you can help. - -Free software packages are usually distributed in the form of @dfn{source -code tarballs}---typically @file{tar.gz} files that contain all the source -files. Adding a package to the distribution means essentially two things: -adding a @dfn{recipe} that describes how to build the package, including a -list of other packages required to build it, and adding @dfn{package -metadata} along with that recipe, such as a description and licensing -information. - -In Guix all this information is embodied in @dfn{package definitions}. -Package definitions provide a high-level view of the package. They are -written using the syntax of the Scheme programming language; in fact, for -each package we define a variable bound to the package definition, and -export that variable from a module (@pxref{Modules de paquets}). However, -in-depth Scheme knowledge is @emph{not} a prerequisite for creating -packages. For more information on package definitions, @pxref{Définition des paquets}. - -Once a package definition is in place, stored in a file in the Guix source -tree, it can be tested using the @command{guix build} command -(@pxref{Invoquer guix build}). For example, assuming the new package is -called @code{gnew}, you may run this command from the Guix build tree -(@pxref{Lancer Guix avant qu'il ne soit installé}): - -@example -./pre-inst-env guix build gnew --keep-failed -@end example - -Using @code{--keep-failed} makes it easier to debug build failures since it -provides access to the failed build tree. Another useful command-line -option when debugging is @code{--log-file}, to access the build log. - -If the package is unknown to the @command{guix} command, it may be that the -source file contains a syntax error, or lacks a @code{define-public} clause -to export the package variable. To figure it out, you may load the module -from Guile to get more information about the actual error: - -@example -./pre-inst-env guile -c '(use-modules (gnu packages gnew))' -@end example - -Once your package builds correctly, please send us a patch -(@pxref{Contribuer}). Well, if you need help, we will be happy to help -you too. Once the patch is committed in the Guix repository, the new -package automatically gets built on the supported platforms by -@url{http://hydra.gnu.org/jobset/gnu/master, our continuous integration -system}. - -@cindex substituter -On peut obtenir la nouvelle définition du paquet simplement en lançant -@command{guix pull} (@pxref{Invoquer guix pull}). Lorsque -@code{hydra.gnu.org} a fini de construire le paquet, l'installation du -paquet y télécharge automatiquement les binaires (@pxref{Substituts}). La -seule intervention humaine requise est pendant la revue et l'application du -correctif. - - -@menu -* Liberté logiciel:: Ce que la distribution peut contenir. -* Conventions de nommage:: Qu'est-ce qu'un bon nom ? -* Numéros de version:: Lorsque le nom n'est pas suffisant. -* Synopsis et descriptions:: Aider les utilisateurs à trouver le bon - paquet. -* Modules python:: Un peu de comédie anglaise. -* Modules perl:: Petites perles. -* Paquets java:: Pause café. -* Polices de caractères:: À fond les fontes. -@end menu - -@node Liberté logiciel -@subsection Liberté logiciel - -@c Adapted from http://www.gnu.org/philosophy/philosophy.html. -@cindex free software -The GNU operating system has been developed so that users can have freedom -in their computing. GNU is @dfn{free software}, meaning that users have the -@url{http://www.gnu.org/philosophy/free-sw.html,four essential freedoms}: to -run the program, to study and change the program in source code form, to -redistribute exact copies, and to distribute modified versions. Packages -found in the GNU distribution provide only software that conveys these four -freedoms. - -In addition, the GNU distribution follow the -@url{http://www.gnu.org/distros/free-system-distribution-guidelines.html,free -software distribution guidelines}. Among other things, these guidelines -reject non-free firmware, recommendations of non-free software, and discuss -ways to deal with trademarks and patents. - -Some otherwise free upstream package sources contain a small and optional -subset that violates the above guidelines, for instance because this subset -is itself non-free code. When that happens, the offending items are removed -with appropriate patches or code snippets in the @code{origin} form of the -package (@pxref{Définition des paquets}). This way, @code{guix build --source} -returns the ``freed'' source rather than the unmodified upstream source. - - -@node Conventions de nommage -@subsection Conventions de nommage - -@cindex package name -A package has actually two names associated with it: First, there is the -name of the @emph{Scheme variable}, the one following @code{define-public}. -By this name, the package can be made known in the Scheme code, for instance -as input to another package. Second, there is the string in the @code{name} -field of a package definition. This name is used by package management -commands such as @command{guix package} and @command{guix build}. - -Both are usually the same and correspond to the lowercase conversion of the -project name chosen upstream, with underscores replaced with hyphens. For -instance, GNUnet is available as @code{gnunet}, and SDL_net as -@code{sdl-net}. - -We do not add @code{lib} prefixes for library packages, unless these are -already part of the official project name. But @pxref{Modules python} and -@ref{Modules perl} for special rules concerning modules for the Python and -Perl languages. - -Font package names are handled differently, @pxref{Polices de caractères}. - - -@node Numéros de version -@subsection Numéros de version - -@cindex package version -We usually package only the latest version of a given free software -project. But sometimes, for instance for incompatible library versions, two -(or more) versions of the same package are needed. These require different -Scheme variable names. We use the name as defined in @ref{Conventions de nommage} -for the most recent version; previous versions use the same name, suffixed -by @code{-} and the smallest prefix of the version number that may -distinguish the two versions. - -The name inside the package definition is the same for all versions of a -package and does not contain any version number. - -For instance, the versions 2.24.20 and 3.9.12 of GTK+ may be packaged as -follows: - -@example -(define-public gtk+ - (package - (name "gtk+") - (version "3.9.12") - ...)) -(define-public gtk+-2 - (package - (name "gtk+") - (version "2.24.20") - ...)) -@end example -If we also wanted GTK+ 3.8.2, this would be packaged as -@example -(define-public gtk+-3.8 - (package - (name "gtk+") - (version "3.8.2") - ...)) -@end example - -@c See , -@c for a discussion of what follows. -@cindex version number, for VCS snapshots -Occasionally, we package snapshots of upstream's version control system -(VCS) instead of formal releases. This should remain exceptional, because -it is up to upstream developers to clarify what the stable release is. Yet, -it is sometimes necessary. So, what should we put in the @code{version} -field? - -Clearly, we need to make the commit identifier of the VCS snapshot visible -in the version string, but we also need to make sure that the version string -is monotonically increasing so that @command{guix package --upgrade} can -determine which version is newer. Since commit identifiers, notably with -Git, are not monotonically increasing, we add a revision number that we -increase each time we upgrade to a newer snapshot. The resulting version -string looks like this: - -@example -2.0.11-3.cabba9e - ^ ^ ^ - | | `-- upstream commit ID - | | - | `--- Guix package revision - | -latest upstream version -@end example - -It is a good idea to strip commit identifiers in the @code{version} field -to, say, 7 digits. It avoids an aesthetic annoyance (assuming aesthetics -have a role to play here) as well as problems related to OS limits such as -the maximum shebang length (127 bytes for the Linux kernel.) It is best to -use the full commit identifiers in @code{origin}s, though, to avoid -ambiguities. A typical package definition may look like this: - -@example -(define my-package - (let ((commit "c3f29bc928d5900971f65965feaae59e1272a3f7") - (revision "1")) ;révision du paquet Guix - (package - (version (git-version "0.9" revision commit)) - (source (origin - (method git-fetch) - (uri (git-reference - (url "git://example.org/my-package.git") - (commit commit))) - (sha256 (base32 "1mbikn@dots{}")) - (file-name (git-file-name name version)))) - ;; @dots{} - ))) -@end example - -@node Synopsis et descriptions -@subsection Synopsis et descriptions - -@cindex package description -@cindex package synopsis -As we have seen before, each package in GNU@tie{}Guix includes a synopsis -and a description (@pxref{Définition des paquets}). Synopses and descriptions -are important: They are what @command{guix package --search} searches, and a -crucial piece of information to help users determine whether a given package -suits their needs. Consequently, packagers should pay attention to what -goes into them. - -Synopses must start with a capital letter and must not end with a period. -They must not start with ``a'' or ``the'', which usually does not bring -anything; for instance, prefer ``File-frobbing tool'' over ``A tool that -frobs files''. The synopsis should say what the package is---e.g., ``Core -GNU utilities (file, text, shell)''---or what it is used for---e.g., the -synopsis for GNU@tie{}grep is ``Print lines matching a pattern''. - -Keep in mind that the synopsis must be meaningful for a very wide audience. -For example, ``Manipulate alignments in the SAM format'' might make sense -for a seasoned bioinformatics researcher, but might be fairly unhelpful or -even misleading to a non-specialized audience. It is a good idea to come up -with a synopsis that gives an idea of the application domain of the -package. In this example, this might give something like ``Manipulate -nucleotide sequence alignments'', which hopefully gives the user a better -idea of whether this is what they are looking for. - -Descriptions should take between five and ten lines. Use full sentences, -and avoid using acronyms without first introducing them. Please avoid -marketing phrases such as ``world-leading'', ``industrial-strength'', and -``next-generation'', and avoid superlatives like ``the most -advanced''---they are not helpful to users looking for a package and may -even sound suspicious. Instead, try to be factual, mentioning use cases and -features. - -@cindex Texinfo markup, in package descriptions -Descriptions can include Texinfo markup, which is useful to introduce -ornaments such as @code{@@code} or @code{@@dfn}, bullet lists, or hyperlinks -(@pxref{Overview,,, texinfo, GNU Texinfo}). However you should be careful -when using some characters for example @samp{@@} and curly braces which are -the basic special characters in Texinfo (@pxref{Special Characters,,, -texinfo, GNU Texinfo}). User interfaces such as @command{guix package ---show} take care of rendering it appropriately. - -Synopses and descriptions are translated by volunteers -@uref{http://translationproject.org/domain/guix-packages.html, at the -Translation Project} so that as many users as possible can read them in -their native language. User interfaces search them and display them in the -language specified by the current locale. - -To allow @command{xgettext} to extract them as translatable strings, -synopses and descriptions @emph{must be literal strings}. This means that -you cannot use @code{string-append} or @code{format} to construct these -strings: - -@lisp -(package - ;; @dots{} - (synopsis "This is translatable") - (description (string-append "This is " "*not*" " translatable."))) -@end lisp - -Translation is a lot of work so, as a packager, please pay even more -attention to your synopses and descriptions as every change may entail -additional work for translators. In order to help them, it is possible to -make recommendations or instructions visible to them by inserting special -comments like this (@pxref{xgettext Invocation,,, gettext, GNU Gettext}): - -@example -;; TRANSLATORS: "X11 resize-and-rotate" should not be translated. -(description "ARandR is designed to provide a simple visual front end -for the X11 resize-and-rotate (RandR) extension. @dots{}") -@end example - - -@node Modules python -@subsection Modules python - -@cindex python -We currently package Python 2 and Python 3, under the Scheme variable names -@code{python-2} and @code{python} as explained in @ref{Numéros de version}. To -avoid confusion and naming clashes with other programming languages, it -seems desirable that the name of a package for a Python module contains the -word @code{python}. - -Some modules are compatible with only one version of Python, others with -both. If the package Foo compiles only with Python 3, we name it -@code{python-foo}; if it compiles only with Python 2, we name it -@code{python2-foo}. If it is compatible with both versions, we create two -packages with the corresponding names. - -If a project already contains the word @code{python}, we drop this; for -instance, the module python-dateutil is packaged under the names -@code{python-dateutil} and @code{python2-dateutil}. If the project name -starts with @code{py} (e.g.@: @code{pytz}), we keep it and prefix it as -described above. - -@subsubsection Specifying Dependencies -@cindex inputs, for Python packages - -Dependency information for Python packages is usually available in the -package source tree, with varying degrees of accuracy: in the -@file{setup.py} file, in @file{requirements.txt}, or in @file{tox.ini}. - -Your mission, when writing a recipe for a Python package, is to map these -dependencies to the appropriate type of ``input'' (@pxref{Référence de paquet, -inputs}). Although the @code{pypi} importer normally does a good job -(@pxref{Invoquer guix import}), you may want to check the following check -list to determine which dependency goes where. - -@itemize - -@item -We currently package Python 2 with @code{setuptools} and @code{pip} -installed like Python 3.4 has per default. Thus you don't need to specify -either of these as an input. @command{guix lint} will warn you if you do. - -@item -Python dependencies required at run time go into @code{propagated-inputs}. -They are typically defined with the @code{install_requires} keyword in -@file{setup.py}, or in the @file{requirements.txt} file. - -@item -Python packages required only at build time---e.g., those listed with the -@code{setup_requires} keyword in @file{setup.py}---or only for -testing---e.g., those in @code{tests_require}---go into -@code{native-inputs}. The rationale is that (1) they do not need to be -propagated because they are not needed at run time, and (2) in a -cross-compilation context, it's the ``native'' input that we'd want. - -Examples are the @code{pytest}, @code{mock}, and @code{nose} test -frameworks. Of course if any of these packages is also required at -run-time, it needs to go to @code{propagated-inputs}. - -@item -Anything that does not fall in the previous categories goes to -@code{inputs}, for example programs or C libraries required for building -Python packages containing C extensions. - -@item -If a Python package has optional dependencies (@code{extras_require}), it is -up to you to decide whether to add them or not, based on their -usefulness/overhead ratio (@pxref{Envoyer des correctifs, @command{guix size}}). - -@end itemize - - -@node Modules perl -@subsection Modules perl - -@cindex perl -Perl programs standing for themselves are named as any other package, using -the lowercase upstream name. For Perl packages containing a single class, -we use the lowercase class name, replace all occurrences of @code{::} by -dashes and prepend the prefix @code{perl-}. So the class @code{XML::Parser} -becomes @code{perl-xml-parser}. Modules containing several classes keep -their lowercase upstream name and are also prepended by @code{perl-}. Such -modules tend to have the word @code{perl} somewhere in their name, which -gets dropped in favor of the prefix. For instance, @code{libwww-perl} -becomes @code{perl-libwww}. - - -@node Paquets java -@subsection Paquets java - -@cindex java -Java programs standing for themselves are named as any other package, using -the lowercase upstream name. - -To avoid confusion and naming clashes with other programming languages, it -is desirable that the name of a package for a Java package is prefixed with -@code{java-}. If a project already contains the word @code{java}, we drop -this; for instance, the package @code{ngsjava} is packaged under the name -@code{java-ngs}. - -For Java packages containing a single class or a small class hierarchy, we -use the lowercase class name, replace all occurrences of @code{.} by dashes -and prepend the prefix @code{java-}. So the class @code{apache.commons.cli} -becomes package @code{java-apache-commons-cli}. - - -@node Polices de caractères -@subsection Polices de caractères - -@cindex polices -For fonts that are in general not installed by a user for typesetting -purposes, or that are distributed as part of a larger software package, we -rely on the general packaging rules for software; for instance, this applies -to the fonts delivered as part of the X.Org system or fonts that are part of -TeX Live. - -To make it easier for a user to search for fonts, names for other packages -containing only fonts are constructed as follows, independently of the -upstream package name. - -The name of a package containing only one font family starts with -@code{font-}; it is followed by the foundry name and a dash @code{-} if the -foundry is known, and the font family name, in which spaces are replaced by -dashes (and as usual, all upper case letters are transformed to lower -case). For example, the Gentium font family by SIL is packaged under the -name @code{font-sil-gentium}. - -For a package containing several font families, the name of the collection -is used in the place of the font family name. For instance, the Liberation -fonts consist of three families, Liberation Sans, Liberation Serif and -Liberation Mono. These could be packaged separately under the names -@code{font-liberation-sans} and so on; but as they are distributed together -under a common name, we prefer to package them together as -@code{font-liberation}. - -In the case where several formats of the same font family or font collection -are packaged separately, a short form of the format, prepended by a dash, is -added to the package name. We use @code{-ttf} for TrueType fonts, -@code{-otf} for OpenType fonts and @code{-type1} for PostScript Type 1 -fonts. - - - @node Bootstrapping -@section Bootstrapping +@chapter Bootstrapping @c Adapted from the ELS 2013 paper. -@cindex bootstrapping - -Bootstrapping in our context refers to how the distribution gets built -``from nothing''. Remember that the build environment of a derivation -contains nothing but its declared inputs (@pxref{Introduction}). So there's -an obvious chicken-and-egg problem: how does the first package get built? -How does the first compiler get compiled? Note that this is a question of -interest only to the curious hacker, not to the regular user, so you can -shamelessly skip this section if you consider yourself a ``regular user''. - -@cindex bootstrap binaries -The GNU system is primarily made of C code, with libc at its core. The GNU -build system itself assumes the availability of a Bourne shell and -command-line tools provided by GNU Coreutils, Awk, Findutils, `sed', and -`grep'. Furthermore, build programs---programs that run @code{./configure}, -@code{make}, etc.---are written in Guile Scheme (@pxref{Dérivations}). -Consequently, to be able to build anything at all, from scratch, Guix relies -on pre-built binaries of Guile, GCC, Binutils, libc, and the other packages -mentioned above---the @dfn{bootstrap binaries}. - -These bootstrap binaries are ``taken for granted'', though we can also -re-create them if needed (more on that later). - -@unnumberedsubsec Preparing to Use the Bootstrap Binaries +@cindex bootstrap + +Dans notre contexte, le bootstrap se réfère à la manière dont la +distribution est construite « à partir de rien ». Rappelez-vous que +l'environnement de construction d'une dérivation ne contient rien d'autre +que les entrées déclarées (@pxref{Introduction}). Donc il y a un problème +évident de poule et d'œuf : comment le premier paquet est-il construit ? +Comment le premier compilateur est-il construit ? Remarquez que c'est une +question qui intéressera uniquement le hacker curieux, pas l'utilisateur +normal, donc vous pouvez sauter cette section sans avoir honte si vous vous +considérez comme un « utilisateur normal ». + +@cindex binaires de bootstrap +Le système GNU est surtout fait de code C, avec la libc en son cœur. Le +système de construction GNU lui-même suppose la disponibilité d'un shell +Bourne et d'outils en ligne de commande fournis par GNU Coreutils, Awk, +Findutils, sed et grep. En plus, les programmes de construction — les +programmes qui exécutent @code{./configure}, @code{make} etc — sont écrits +en Guile Scheme (@pxref{Dérivations}). En conséquence, pour pouvoir +construire quoi que ce soit, de zéro, Guix a besoin de binaire +pré-construits de Guile, GCC, Binutils, la libc et des autres paquets +mentionnés plus haut — les @dfn{binaires de bootstrap}. + +Ces binaires de bootstrap sont pris comme des acquis, bien qu'on puisse les +recréer (ça arrive plus tard). + +@unnumberedsec Se préparer à utiliser les binaires de bootstrap @c As of Emacs 24.3, Info-mode displays the image, but since it's a @c large image, it's hard to scroll. Oh well. -@image{images/bootstrap-graph,6in,,Dependency graph of the early bootstrap -derivations} +@image{images/bootstrap-graph,6in,,Graphe de dépendance des premières +dérivations de bootstrap} -The figure above shows the very beginning of the dependency graph of the -distribution, corresponding to the package definitions of the @code{(gnu -packages bootstrap)} module. A similar figure can be generated with -@command{guix graph} (@pxref{Invoquer guix graph}), along the lines of: +La figure ci-dessus montre le tout début du graphe de dépendances de la +distribution, correspondant aux définitions des paquets du module @code{(gnu +packages bootstrap)}. Une figure similaire peut être générée avec +@command{guix graph} (@pxref{Invoquer guix graph}), de cette manière : @example guix graph -t derivation \ @@ -24699,54 +25067,57 @@ guix graph -t derivation \ | dot -Tps > t.ps @end example -At this level of detail, things are slightly complex. First, Guile itself -consists of an ELF executable, along with many source and compiled Scheme -files that are dynamically loaded when it runs. This gets stored in the -@file{guile-2.0.7.tar.xz} tarball shown in this graph. This tarball is part -of Guix's ``source'' distribution, and gets inserted into the store with -@code{add-to-store} (@pxref{Le dépôt}). - -But how do we write a derivation that unpacks this tarball and adds it to -the store? To solve this problem, the @code{guile-bootstrap-2.0.drv} -derivation---the first one that gets built---uses @code{bash} as its -builder, which runs @code{build-bootstrap-guile.sh}, which in turn calls -@code{tar} to unpack the tarball. Thus, @file{bash}, @file{tar}, @file{xz}, -and @file{mkdir} are statically-linked binaries, also part of the Guix -source distribution, whose sole purpose is to allow the Guile tarball to be -unpacked. - -Once @code{guile-bootstrap-2.0.drv} is built, we have a functioning Guile -that can be used to run subsequent build programs. Its first task is to -download tarballs containing the other pre-built binaries---this is what the -@code{.tar.xz.drv} derivations do. Guix modules such as -@code{ftp-client.scm} are used for this purpose. The -@code{module-import.drv} derivations import those modules in a directory in -the store, using the original layout. The @code{module-import-compiled.drv} -derivations compile those modules, and write them in an output directory -with the right layout. This corresponds to the @code{#:modules} argument of -@code{build-expression->derivation} (@pxref{Dérivations}). - -Finally, the various tarballs are unpacked by the derivations -@code{gcc-bootstrap-0.drv}, @code{glibc-bootstrap-0.drv}, etc., at which -point we have a working C tool chain. - - -@unnumberedsubsec Building the Build Tools - -Bootstrapping is complete when we have a full tool chain that does not -depend on the pre-built bootstrap tools discussed above. This no-dependency -requirement is verified by checking whether the files of the final tool -chain contain references to the @file{/gnu/store} directories of the -bootstrap inputs. The process that leads to this ``final'' tool chain is -described by the package definitions found in the @code{(gnu packages -commencement)} module. - -The @command{guix graph} command allows us to ``zoom out'' compared to the -graph above, by looking at the level of package objects instead of -individual derivations---remember that a package may translate to several -derivations, typically one derivation to download its source, one to build -the Guile modules it needs, and one to actually build the package from -source. The command: +À ce niveau de détails, les choses sont légèrement complexes. Tout d'abord, +Guile lui-même consiste en an exécutable ELF, avec plusieurs fichiers Scheme +sources et compilés qui sont chargés dynamiquement quand il est exécuté. +Cela est stocké dans l'archive @file{guile-2.0.7.tar.xz} montrée dans ce +graphe. Cette archive fait parti de la distribution « source » de Guix, et +est insérée dans le dépôt avec @code{add-to-store} (@pxref{Le dépôt}). + +Mais comment écrire une dérivation qui décompresse cette archive et l'ajoute +au dépôt ? Pour résoudre ce problème, la dérivation +@code{guile-bootstrap-2.0.drv} — la première qui est construite — utilise +@code{bash} comme constructeur, qui lance @code{build-bootstrap-guile.sh}, +qui à son tour appelle @code{tar} pour décompresser l'archive. Ainsi, +@file{bash}, @file{tar}, @file{xz} et @file{mkdir} sont des binaires liés +statiquement, qui font aussi partie de la distribution source de Guix, dont +le seul but est de permettre à l'archive de Guile d'être décompressée. + +Une fois que @code{guile-bootstrap-2.0.drv} est construit, nous avons un +Guile fonctionnel qui peut être utilisé pour exécuter les programmes de +construction suivants. Sa première tâche consiste à télécharger les +archives contenant les autres binaires pré-construits — c'est ce que la +dérivation @code{.tar.xz.drv} fait. Les modules Guix comme +@code{ftp-client.scm} sont utilisés pour cela. Les dérivations +@code{module-import.drv} importent ces modules dans un répertoire dans le +dépôt, en utilisant la disposition d'origine. Les dérivations +@code{module-import-compiled.drv} compilent ces modules, et les écrivent +dans un répertoire de sortie avec le bon agencement. Cela correspond à +l'argument @code{#:modules} de @code{build-expression->derivation} +(@pxref{Dérivations}). + +Enfin, les diverses archives sont décompressées par les dérivations +@code{gcc-bootstrap-0.drv}, @code{glibc-bootstrap-0.drv}, etc, à partir de +quoi nous avons une chaîne de compilation C fonctionnelle. + + +@unnumberedsec Construire les outils de construction + +Le bootstrap est complet lorsque nous avons une chaîne d'outils complète qui +ne dépend pas des outils de bootstrap pré-construits dont on vient de +parler. Ce pré-requis d'indépendance est vérifié en s'assurant que les +fichiers de la chaîne d'outil finale ne contiennent pas de référence vers +les répertoires @file{/gnu/store} des entrées de bootstrap. Le processus +qui mène à cette chaîne d'outils « finale » est décrit par les définitions +de paquets qui se trouvent dans le module @code{(gnu packages +commencement)}. + +La commande @command{guix graph} nous permet de « dézoomer » comparé au +graphe précédent, en regardant au niveau des objets de paquets plutôt que +des dérivations individuelles — rappelez-vous qu'un paquet peut se traduire +en plusieurs dérivations, typiquement une dérivation pour télécharger ses +sources, une pour les modules Guile dont il a besoin et une pour +effectivement compiler le paquet depuis les sources. La commande : @example guix graph -t bag \ @@ -24755,123 +25126,132 @@ guix graph -t bag \ @end example @noindent -produces the dependency graph leading to the ``final'' C -library@footnote{You may notice the @code{glibc-intermediate} label, -suggesting that it is not @emph{quite} final, but as a good approximation, -we will consider it final.}, depicted below. +produit le graphe de dépendances qui mène à la bibliothèque C « finale +»@footnote{Vous remarquerez qu'elle s'appelle @code{glibc-intermediate}, ce +qui suggère qu'elle n'est pas @emph{tout à fait} finale, mais c'est une +bonne approximation tout de même.}, que voici : @image{images/bootstrap-packages,6in,,Graphe de dépendance des premiers paquets} @c See . -The first tool that gets built with the bootstrap binaries is -GNU@tie{}Make---noted @code{make-boot0} above---which is a prerequisite for -all the following packages. From there Findutils and Diffutils get built. +Le premier outil construit avec les binaires de bootstrap est GNU@tie{}Make +— appelé @code{make-boot0} ci-dessus — qui est un prérequis de tous les +paquets suivants . Ensuite, Findutils et Diffutils sont construits. -Then come the first-stage Binutils and GCC, built as pseudo cross -tools---i.e., with @code{--target} equal to @code{--host}. They are used to -build libc. Thanks to this cross-build trick, this libc is guaranteed not -to hold any reference to the initial tool chain. +Ensuite vient la première passe de Binutils et GCC, construits comme des +pseudo outils croisés — c.-à-d.@: dont @code{--target} égal à +@code{--host}. Ils sont utilisés pour construire la libc. Grâce à cette +astuce de compilation croisée, la libc est garantie de ne contenir aucune +référence à la chaîne d'outils initiale. -From there the final Binutils and GCC (not shown above) are built. GCC uses -@code{ld} from the final Binutils, and links programs against the just-built -libc. This tool chain is used to build the other packages used by Guix and -by the GNU Build System: Guile, Bash, Coreutils, etc. +À partir de là, les Bintulis et GCC finaux (pas visibles ci-dessus) sont +construits. GCC utilise @code{ld} du Binutils final et lie les programme +avec la libc qui vient d'être construite. Cette chaîne d'outils est +utilisée pour construire les autres paquets utilisés par Guix et par le +système de construction de GNU : Guile, Bash, Coreutils, etc. -And voilà! At this point we have the complete set of build tools that the -GNU Build System expects. These are in the @code{%final-inputs} variable of -the @code{(gnu packages commencement)} module, and are implicitly used by -any package that uses @code{gnu-build-system} (@pxref{Systèmes de construction, -@code{gnu-build-system}}). +Et voilà ! À partir de là nous avons l'ensemble complet des outils auxquels +s'attend le système de construction GNU. Ils sont dans la variable +@code{%final-inputs} du module @code{(gnu packages commencement)} et sont +implicitement utilisés par tous les paquets qui utilisent le +@code{gnu-build-system} (@pxref{Systèmes de construction, @code{gnu-build-system}}). -@unnumberedsubsec Building the Bootstrap Binaries +@unnumberedsec Construire les binaires de bootstrap -@cindex bootstrap binaries -Because the final tool chain does not depend on the bootstrap binaries, -those rarely need to be updated. Nevertheless, it is useful to have an -automated way to produce them, should an update occur, and this is what the -@code{(gnu packages make-bootstrap)} module provides. +@cindex binaires de bootstrap +Comme la chaîne d'outils finale ne dépend pas des binaires de bootstrap, ils +ont rarement besoin d'être mis à jour. Cependant, il est utile d'avoir une +manière de faire cela automatiquement, dans le cas d'une mise à jour et +c'est ce que le module @code{(gnu packages make-bootstrap)} fournit. -The following command builds the tarballs containing the bootstrap binaries -(Guile, Binutils, GCC, libc, and a tarball containing a mixture of Coreutils -and other basic command-line tools): +La commande suivante construit les archives contenant les binaires de +bootstrap (Guile, Binutils, GCC, la libc et une archive contenant un mélange +de Coreutils et d'autres outils en ligne de commande de base) : @example guix build bootstrap-tarballs @end example -The generated tarballs are those that should be referred to in the -@code{(gnu packages bootstrap)} module mentioned at the beginning of this -section. +Les archives générées sont celles qui devraient être référencées dans le +module @code{(gnu packages bootstrap)} au début de cette section. -Still here? Then perhaps by now you've started to wonder: when do we reach a -fixed point? That is an interesting question! The answer is unknown, but if -you would like to investigate further (and have significant computational -and storage resources to do so), then let us know. +Vous êtes toujours là ? Alors peut-être que maintenant vous vous demandez, +quand est-ce qu'on atteint un point fixe ? C'est une question intéressante +! La réponse est inconnue, mais si vous voulez enquêter plus profondément +(et que vous avez les ressources en puissance de calcul et en capacité de +stockage pour cela), dites-le nous. -@unnumberedsubsec Reducing the Set of Bootstrap Binaries +@unnumberedsec Réduire l'ensemble des binaires de bootstrap -Our bootstrap binaries currently include GCC, Guile, etc. That's a lot of -binary code! Why is that a problem? It's a problem because these big chunks -of binary code are practically non-auditable, which makes it hard to -establish what source code produced them. Every unauditable binary also -leaves us vulnerable to compiler backdoors as described by Ken Thompson in -the 1984 paper @emph{Reflections on Trusting Trust}. +Nous binaires de bootstrap incluent actuellement GCC, Guile, etc. C'est +beaucoup de code binaire ! Pourquoi est-ce un problème ? C'est un problème +parce que ces gros morceaux de code binaire sont en pratique impossibles à +auditer, ce qui fait qu'il est difficile d'établir quel code source les a +produit. Chaque binaire non auditable nous rend aussi vulnérable à des +portes dérobées dans les compilateurs comme le décrit Ken Thompson dans le +papier de 1984 @emph{Reflections on Trusting Trust}. -This is mitigated by the fact that our bootstrap binaries were generated -from an earlier Guix revision. Nevertheless it lacks the level of -transparency that we get in the rest of the package dependency graph, where -Guix always gives us a source-to-binary mapping. Thus, our goal is to -reduce the set of bootstrap binaries to the bare minimum. +Cela est rendu moins inquiétant par le fait que les binaires de bootstrap +ont été générés par une révision antérieure de Guix. Cependant, il leur +manque le niveau de transparence que l'on obtient avec le reste des paquets +du graphe de dépendance, où Guix nous donne toujours une correspondance +source-binaire. Ainsi, notre but est de réduire l'ensemble des binaires de +bootstrap au minimum. -The @uref{http://bootstrappable.org, Bootstrappable.org web site} lists -on-going projects to do that. One of these is about replacing the bootstrap -GCC with a sequence of assemblers, interpreters, and compilers of increasing -complexity, which could be built from source starting from a simple and -auditable assembler. Your help is welcome! +Le @uref{http://bootstrappable.org, site web Bootstrappable.org} liste les +projets en cours à ce sujet. L'un d'entre eux parle de remplacer le GCC de +bootstrap par une série d'assembleurs, d'interpréteurs et de compilateurs +d'une complexité croissante, qui pourraient être construits à partir des +sources à partir d'un assembleur simple et auditable. Votre aide est la +bienvenue ! @node Porter -@section Porter vers une nouvelle plateforme +@chapter Porter vers une nouvelle plateforme -As discussed above, the GNU distribution is self-contained, and -self-containment is achieved by relying on pre-built ``bootstrap binaries'' -(@pxref{Bootstrapping}). These binaries are specific to an operating system -kernel, CPU architecture, and application binary interface (ABI). Thus, to -port the distribution to a platform that is not yet supported, one must -build those bootstrap binaries, and update the @code{(gnu packages -bootstrap)} module to use them on that platform. +Comme nous en avons discuté plus haut, la distribution GNU est +auto-contenue, et cela est possible en se basant sur des « binaires de +bootstrap » pré-construits (@pxref{Bootstrapping}). Ces binaires sont +spécifiques au noyau de système d'exploitation, à l'architecture CPU et à +l'interface applicative binaire (ABI). Ainsi, pour porter la distribution +sur une plateforme qui n'est pas encore supportée, on doit construire ces +binaires de bootstrap et mettre à jour le module @code{(gnu packages +bootstrap)} pour les utiliser sur cette plateforme. -Fortunately, Guix can @emph{cross compile} those bootstrap binaries. When -everything goes well, and assuming the GNU tool chain supports the target -platform, this can be as simple as running a command like this one: +Heureusement, Guix peut effectuer une @emph{compilation croisée} de ces +binaires de bootstrap. Lorsque tout va bien, et en supposant que la chaîne +d'outils GNU supporte la plateforme cible, cela peut être aussi simple que +de lancer une commande comme ceci : @example guix build --target=armv5tel-linux-gnueabi bootstrap-tarballs @end example -For this to work, the @code{glibc-dynamic-linker} procedure in @code{(gnu -packages bootstrap)} must be augmented to return the right file name for -libc's dynamic linker on that platform; likewise, -@code{system->linux-architecture} in @code{(gnu packages linux)} must be -taught about the new platform. - -Once these are built, the @code{(gnu packages bootstrap)} module needs to be -updated to refer to these binaries on the target platform. That is, the -hashes and URLs of the bootstrap tarballs for the new platform must be added -alongside those of the currently supported platforms. The bootstrap Guile -tarball is treated specially: it is expected to be available locally, and -@file{gnu/local.mk} has rules to download it for the supported -architectures; a rule for the new platform must be added as well. - -In practice, there may be some complications. First, it may be that the -extended GNU triplet that specifies an ABI (like the @code{eabi} suffix -above) is not recognized by all the GNU tools. Typically, glibc recognizes -some of these, whereas GCC uses an extra @code{--with-abi} configure flag -(see @code{gcc.scm} for examples of how to handle this). Second, some of -the required packages could fail to build for that platform. Lastly, the -generated binaries could be broken for some reason. +Pour que cela fonctione, la procédure @code{glibc-dynamic-linker} dans +@code{(gnu packages bootstrap)} doit être augmentée pour renvoyer le bon nom +de fichier pour l'éditeur de lien dynamique de la libc sur cette plateforme +; de même, il faut indiquer cette nouvelle platefore à +@code{system->linux-architecture} dans @code{(gnu packages linux)}. + +Une fois qu'ils sont construits, le module @code{(gnu packages bootstrap)} +doit être mis à jour pour se référer à ces binaires sur la plateforme +cible. C'est à dire que les hashs et les URL des archives de bootstrap pour +la nouvelle plateforme doivent être ajoutés avec ceux des plateformes +actuellement supportées. L'archive de bootstrap de Guile est traitée +séparément : elle doit être disponible localement, et @file{gnu/local.mk} a +une règle pour la télécharger pour les architectures supportées ; vous devez +également ajouter une règle pour la nouvelle plateforme. + +En pratique, il peut y avoir des complications. Déjà, il se peut que le +triplet GNU étendu qui spécifie l'ABI (comme le suffixe @code{eabi} +ci-dessus) ne soit pas reconnu par tous les outils GNU. Typiquement, la +glibc en reconnais certains, alors que GCC utilise un drapeau de configure +@code{--with-abi} supplémentaire (voir @code{gcc.scm} pour trouver des +exemples où ce cas est géré). Ensuite, certains des paquets requis +pourraient échouer à se construire pour cette plateforme. Enfin, les +binaires générés pourraient être cassé pour une raison ou une autre. @c ********************************************************************* @include contributing.fr.texi @@ -24881,7 +25261,7 @@ generated binaries could be broken for some reason. @chapter Remerciements Guix se base sur le @uref{http://nixos.org/nix/, gestionnaire de paquets -Nix} conçu et implémenté par Eelco Dolstra, avec des constributions d'autres +Nix} conçu et implémenté par Eelco Dolstra, avec des contributions d'autres personnes (voir le fichier @file{nix/AUTHORS} dans Guix). Nix a inventé la gestion de paquet fonctionnelle et promu des fonctionnalités sans précédents comme les mises à jour de paquets transactionnelles et les retours en -- cgit 1.4.1 From c483c5c82c129b51ef6068fad3d3f0fbca1f5df1 Mon Sep 17 00:00:00 2001 From: Ludovic Courtès Date: Mon, 4 Mar 2019 13:55:41 +0100 Subject: doc: Better explain the 'password' field of . * doc/guix.texi (User Accounts): Provide an example use of 'crypt', and mention the security implications. --- doc/guix.texi | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) (limited to 'doc') diff --git a/doc/guix.texi b/doc/guix.texi index 9fb5cff06d..7fcfcb1454 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -10695,6 +10695,7 @@ account. System accounts are sometimes treated specially; for instance, graphical login managers do not list them. @anchor{user-account-password} +@cindex password, for user accounts @item @code{password} (default: @code{#f}) You would normally leave this field to @code{#f}, initialize user passwords as @code{root} with the @command{passwd} command, and then let @@ -10702,11 +10703,29 @@ users change it with @command{passwd}. Passwords set with @command{passwd} are of course preserved across reboot and reconfiguration. -If you @emph{do} want to have a preset password for an account, then -this field must contain the encrypted password, as a string. -@xref{crypt,,, libc, The GNU C Library Reference Manual}, for more information -on password encryption, and @ref{Encryption,,, guile, GNU Guile Reference -Manual}, for information on Guile's @code{crypt} procedure. +If you @emph{do} want to set an initial password for an account, then +this field must contain the encrypted password, as a string. You can use the +@code{crypt} procedure for this purpose: + +@example +(user-account + (name "charlie") + (home-directory "/home/charlie") + (group "users") + + ;; Specify a SHA-512-hashed initial password. + (password (crypt "InitialPassword!" "$6$abc"))) +@end example + +@quotation Note +The hash of this initial password will be available in a file in +@file{/gnu/store}, readable by all the users, so this method must be used with +care. +@end quotation + +@xref{Passphrase Storage,,, libc, The GNU C Library Reference Manual}, for +more information on password encryption, and @ref{Encryption,,, guile, GNU +Guile Reference Manual}, for information on Guile's @code{crypt} procedure. @end table @end deftp -- cgit 1.4.1 From dca58219584c1163a9fbf88fccea885eb53bf2af Mon Sep 17 00:00:00 2001 From: Ludovic Courtès Date: Mon, 4 Mar 2019 14:19:55 +0100 Subject: environment: Rename '--inherit' to '--preserve'. Suggested by Eric Bavier and Ricardo Wurmus. * guix/scripts/environment.scm (show-help, %options): Emit a deprecation warning for "--inherit" and add -E/--preserve. * tests/guix-environment.sh: Adjust accordingly. * doc/guix.texi (Invoking guix environment): Update accordingly. --- doc/guix.texi | 9 +++++---- guix/scripts/environment.scm | 11 +++++++++-- tests/guix-environment.sh | 4 ++-- 3 files changed, 16 insertions(+), 8 deletions(-) (limited to 'doc') diff --git a/doc/guix.texi b/doc/guix.texi index 7fcfcb1454..1b77881eb6 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -4456,17 +4456,18 @@ that will be added to the environment directly. @item --pure Unset existing environment variables when building the new environment, except -those specified with @option{--inherit} (see below.) This has the effect of +those specified with @option{--preserve} (see below.) This has the effect of creating an environment in which search paths only contain package inputs. -@item --inherit=@var{regexp} -When used alongside @option{--pure}, inherit all the environment variables +@item --preserve=@var{regexp} +@itemx -E @var{regexp} +When used alongside @option{--pure}, preserve the environment variables matching @var{regexp}---in other words, put them on a ``white list'' of environment variables that must be preserved. This option can be repeated several times. @example -guix environment --pure --inherit=^SLURM --ad-hoc openmpi @dots{} \ +guix environment --pure --preserve=^SLURM --ad-hoc openmpi @dots{} \ -- mpirun @dots{} @end example diff --git a/guix/scripts/environment.scm b/guix/scripts/environment.scm index 0cf7b3fd5e..63f6129279 100644 --- a/guix/scripts/environment.scm +++ b/guix/scripts/environment.scm @@ -141,7 +141,7 @@ COMMAND or an interactive shell in that environment.\n")) (display (G_ " --pure unset existing environment variables")) (display (G_ " - --inherit=REGEXP inherit environment variables that match REGEXP")) + -E, --preserve=REGEXP preserve environment variables that match REGEXP")) (display (G_ " --search-paths display needed environment variable definitions")) (display (G_ " @@ -215,11 +215,18 @@ COMMAND or an interactive shell in that environment.\n")) (option '("pure") #f #f (lambda (opt name arg result) (alist-cons 'pure #t result))) - (option '("inherit") #t #f + (option '(#\E "preserve") #t #f (lambda (opt name arg result) (alist-cons 'inherit-regexp (make-regexp* arg) result))) + (option '("inherit") #t #f ;deprecated + (lambda (opt name arg result) + (warning (G_ "'--inherit' is deprecated, \ +use '--preserve' instead~%")) + (alist-cons 'inherit-regexp + (make-regexp* arg) + result))) (option '("search-paths") #f #f (lambda (opt name arg result) (alist-cons 'search-paths #t result))) diff --git a/tests/guix-environment.sh b/tests/guix-environment.sh index d6df6234f6..7ea9c200de 100644 --- a/tests/guix-environment.sh +++ b/tests/guix-environment.sh @@ -49,13 +49,13 @@ test -x `sed -r 's/^export PATH="(.*)"/\1/' "$tmpdir/a"`/guile cmp "$tmpdir/a" "$tmpdir/b" -# Check '--inherit'. +# Check '--preserve'. GUIX_TEST_ABC=1 GUIX_TEST_DEF=2 GUIX_TEST_XYZ=3 export GUIX_TEST_ABC GUIX_TEST_DEF GUIX_TEST_XYZ guix environment --bootstrap --ad-hoc guile-bootstrap --pure \ - --inherit='^GUIX_TEST_A' --inherit='^GUIX_TEST_D' \ + --preserve='^GUIX_TEST_A' --preserve='^GUIX_TEST_D' \ -- "$SHELL" -c set > "$tmpdir/a" grep '^PATH=' "$tmpdir/a" grep '^GUIX_TEST_ABC=' "$tmpdir/a" -- cgit 1.4.1