Suivant: Configuration, Monter: Didacticiel d’empaquetage [Table des matières][Index]
La section « Définir des paquets » du manuel explique les bases de l’empaquetage avec Guix (voir Définir des paquets dans le manuel de référence de GNU Guix). Dans la section suivante, nous reparlerons en partie de ces bases.
GNU Hello est un exemple de projet qui sert d’exemple idiomatique pour
l’empaquetage. Il utilise le système de construction de GNU
(./configure && make && make install
). Guix fournit déjà une
définition de paquet qui est un parfait exemple pour commencer. Vous pouvez
voir sa déclaration avec guix edit hello
depuis la ligne de
commande. Voyons à quoi elle ressemble :
(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)
(synopsis "Hello, GNU world: An example GNU package")
(description
"GNU Hello prints the message \"Hello, world!\" and then exits. It
serves as an example of standard GNU coding practices. As such, it supports
command-line arguments, multiple languages, and so on.")
(home-page "https://www.gnu.org/software/hello/")
(license gpl3+)))
Comme vous pouvez le voir, la plus grosse partie est assez simple. Mais examinons les champs ensemble :
Le nom du projet. Avec les conventions de Scheme, on préfère le laisser en minuscule, sans tiret du bas, en séparant les mots par des tirets.
Ce champ contient une description de l’origine du code
source. L’enregistrement origin
contient ces champs :
url-fetch
pour télécharger via HTTP/FTP, mais d’autres méthodes
existent, comme git-fetch
pour les dépôts Git.
https://
pour url-fetch
. Ici
le code spécial « mirror://gnu » fait référence à une ensemble
d’emplacements bien connus, qui peuvent tous être utilisés par Guix pour
récupérer la source, si l’un d’entre eux échoue.
sha256
du fichier demandé. C’est essentiel pour s’assurer
que la source n’est pas corrompue. Remarquez que Guix fonctionne avec des
chaînes en base32, d’où l’appel à la fonction base32
.
C’est ici que la puissance d’abstraction du langage Scheme brille de toute
sa splendeur : dans ce cas, le gnu-build-system
permet d’abstraire
les fameuses invocations shell ./configure && make && make
install
. Parmi les autres systèmes de construction on trouve le
trivial-build-system
qui ne fait rien et demande de programmer toutes
les étapes de construction, le python-build-system
,
emacs-build-system
et bien d’autres (voir Systèmes de
construction dans le manuel de référence de GNU Guix).
Le synopsis devrait être un résumé court de ce que fait le paquet. Pour beaucoup de paquets, le slogan de la page d’accueil du projet est approprié pour le synopsis.
Comme le synopsis, vous pouvez réutiliser la description de la page d’accueil du projet. Remarquez que Guix utilise la syntaxe Texinfo.
Utilisez l’adresse en HTTPS si elle est disponible.
Voir guix/licenses.scm
dans les sources du projet pour une liste
complète des licences disponibles.
Il est temps de construire notre premier paquet ! Rien de bien compliqué
pour l’instant : nous allons garder notre exemple avec my-hello
, une
copie de la déclaration montrée plus haut.
Comme avec le rituel « Hello World » enseigné avec la plupart des langages de programmation, ce sera sans doute l’approche la plus « manuelle » d’empaquetage que vous utiliserez. Nous vous montrerons une configuration idéale plus tard, pour l’instant nous allons suivre la voie la plus simple.
Enregistrez ce qui suit dans un fichier nommé my-hello.scm.
(use-modules (guix packages) (guix download) (guix build-system gnu) (guix licenses)) (package (name "my-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) (synopsis "Hello, Guix world: An example custom Guix package") (description "GNU Hello prints the message \"Hello, world!\" and then exits. It serves as an example of standard GNU coding practices. As such, it supports command-line arguments, multiple languages, and so on.") (home-page "https://www.gnu.org/software/hello/") (license gpl3+))
Nous allons expliquer le code supplémentaire dans un moment.
Essayez de jouer avec les différentes valeurs des différents champs. Si vous changez la source, vous devrez mettre à jour la somme de contrôle. En fait, Guix refusera de construire quoi que ce soit si la somme de contrôle donnée ne correspond pas à la somme de contrôle calculée de la source téléchargée. Pour obtenir la bonne somme de contrôle pour une déclaration de paquet, vous devrez télécharger la source, calculer la somme de contrôle sha256 et la convertir en base32.
Heureusement, Guix peut automatiser cette tache pour nous ; tout ce qu’on doit faire est de lui fournir l’URI :
$ guix download mirror://gnu/hello/hello-2.10.tar.gz Starting download of /tmp/guix-file.JLYgL7 From https://ftpmirror.gnu.org/gnu/hello/hello-2.10.tar.gz... following redirection to `https://mirror.ibcp.fr/pub/gnu/hello/hello-2.10.tar.gz'... …10.tar.gz 709KiB 2.5MiB/s 00:00 [##################] 100.0% /gnu/store/hbdalsf5lpf01x4dcknwx6xbn6n5km6k-hello-2.10.tar.gz 0ssi1wpaf7plaswqqjwigppsg5fyh99vdlb9kzl7c9lng89ndq1i
Dans ce cas particulier, la sortie nous dit quel miroir a été choisi. Si le
résultat de la commande au-dessus n’est pas le même que ce qui est montré,
mettez à jour votre déclaration my-hello
en fonction.
Remarquez que les archives des paquets GNU sont accompagnées de leur signature OpenPGP, donc vous devriez vérifier la signature de cette archive avec « gpg » pour l’authentifier avant d’aller plus loin :
$ guix download mirror://gnu/hello/hello-2.10.tar.gz.sig Starting download of /tmp/guix-file.03tFfb From https://ftpmirror.gnu.org/gnu/hello/hello-2.10.tar.gz.sig... following redirection to `https://ftp.igh.cnrs.fr/pub/gnu/hello/hello-2.10.tar.gz.sig'... ….tar.gz.sig 819B 1.2MiB/s 00:00 [##################] 100.0% /gnu/store/rzs8wba9ka7grrmgcpfyxvs58mly0sx6-hello-2.10.tar.gz.sig 0q0v86n3y38z17rl146gdakw9xc4mcscpk8dscs412j22glrv9jf $ gpg --verify /gnu/store/rzs8wba9ka7grrmgcpfyxvs58mly0sx6-hello-2.10.tar.gz.sig /gnu/store/hbdalsf5lpf01x4dcknwx6xbn6n5km6k-hello-2.10.tar.gz gpg: Signature faite le dim. 16 nov. 2014 13:08:37 CET gpg: avec la clef RSA A9553245FDE9B739 gpg: Bonne signature de « Sami Kerola (https://www.iki.fi/kerolasa/) <kerolasa@iki.fi> » [inconnu] gpg: Attention : cette clef n'est pas certifiée avec une signature de confiance. gpg: Rien n'indique que la signature appartient à son propriétaire. Empreinte de clef principale : 8ED3 96E3 7E38 D471 A005 30D3 A955 3245 FDE9 B739
Vous pouvez ensuite lancer
$ guix package --install-from-file=my-hello.scm
Vous devriez maintenant avoir my-hello
dans votre profil !
$ guix package --list-installed=my-hello my-hello 2.10 out /gnu/store/f1db2mfm8syb8qvc357c53slbvf1g9m9-my-hello-2.10
Nous sommes allés aussi loin que possible sans aucune connaissance de Scheme. Avant de continuer sur des paquets plus complexes, il est maintenant temps de vous renforcer sur votre connaissance du langage Scheme. Voir Cours accéléré du langage Scheme pour démarrer.
Suivant: Configuration, Monter: Didacticiel d’empaquetage [Table des matières][Index]