Suivant: , Monter: Didacticiel d’empaquetage   [Table des matières][Index]


2.1.1 Un paquet « hello world »

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 :

name

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.

source

Ce champ contient une description de l’origine du code source. L’enregistrement origin contient ces champs :

  1. La méthode, ici url-fetch pour télécharger via HTTP/FTP, mais d’autres méthodes existent, comme git-fetch pour les dépôts Git.
  2. L’URI, qui est typiquement un emplacement 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.
  3. La somme de contrôle 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.
build-system

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).

synopsis

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.

description

Comme le synopsis, vous pouvez réutiliser la description de la page d’accueil du projet. Remarquez que Guix utilise la syntaxe Texinfo.

home-page

Utilisez l’adresse en HTTPS si elle est disponible.

license

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]