Empaqueter ac-geiser pour Guix (1)

#guix #package #français

Premier volet de la série sur la création de ma première définition de paquet pour le gestionnaire de paquet Guix ! J'ai choisi ac-geiser car j'utilise cette extension pour apporter un soupçon d'auto-complétion à Geiser lorsque j'hack avec Guile dans Emacs (et puis surtout parce que son paquet n'existait pas à ce jour) !

Dans cette série, je documente ma méthode d'apprentissage de la création de paquet pour Guix. C'est une méthode qui le veut axée sur la pratique. C'est le retour de la console qui guide notre besoin de recourir à la documentation.

Quels sont les pré requis ou les assumptions utiles à la compréhension de ce qui suit ?

Place à l'action !

Avant toute chose, je me place dans un environnement isolé virtuellement de mon système :

$ guix environment --pure guix

Ensuite, j'utilise l'outil guix build qui va demander à Guix de construire le paquet d'un logiciel à partir de la définition que je lui fourni (/tmp/emacs-ac-geiser.scm). :

[dev]$ ./pre-inst-env guix build -f /tmp/emacs-ac-geiser.scm
guix build: error: failed to load '/tmp/emacs-ac-geiser.scm': No such file or directory

Guix me dit que le fichier /tmp/emacs-ac-geiser.scm n'existe pas. C'est pas faux haha! Je le créé et je relance la commande :

[dev]$ touch /tmp/emacs-ac-geiser.scm
[dev]$ ./pre-inst-env guix build -f /tmp/emacs-ac-geiser.scm
guix build: error: #<unspecified>: not something we can build

Apparemment, Guix ne peut pas construire un fichier vide. Remplissons-le avec une définition vide :

[dev]$ echo "(define-public ac-geiser (package))" > 
/tmp/emacs-ac-geiser.scm
[dev]$ ./pre-inst-env guix build -f /tmp/emacs-ac-geiser.scm 
ice-9/boot-9.scm:3832:12: error: package: unbound variable
hint: Did you forget `(use-modules (guix packages))'?

Guix ne connait pas la variable “package” donc il me signale une erreur, mais m'indique comment la résoudre (trop gentil).

[dev]$ echo "(use-modules (guix packages)) (define-public ac-geiser (package))" > /tmp/emacs-ac-geiser.scm
[dev]$ ./pre-inst-env guix build -f /tmp/emacs-ac-geiser.scm 
/tmp/emacs-ac-geiser.scm:1:55: error: (package): missing field initializers (name version source build-system synopsis description license home-page)

Nouvelle tentative, nouvelle erreur (mais c'est comme ça qu'on apprend, non?).

Donc, là, Guix me dit que l'initialisation de plusieurs champs manque à (package) et me précise lesquels. J'ai déjà dit que Guix est gentil ? On rajoute les champs demandés dans notre définition et on relance.

[dev]$ echo "(use-modules (guix packages)) (define-public ac-geiser (package name version source build-system synopsis description license home-page))" > /tmp/emacs-ac-geiser.scm
[dev]$ ./pre-inst-env guix build -f /tmp/emacs-ac-geiser.scm 
/tmp/emacs-ac-geiser.scm:1:55: error: name: invalid field specifier

Ah, on progresse ! À présent, Guix me signal que le champ name est mal spécifié. Puisque je n'ai aucune idée de comment name doit être spécifié, je vais aller chercher un peu d'information dans la documentation de Guix. C'est tellement bien fait qu'il y a tout une page de référence du type package. J'y apprend notamment que le champ name attend une chaîne de caractères. Allez, j'essaye (ATTENTION pour le paramètre de echo j'utilise des apostrophes):

[dev]$ echo '(use-modules (guix packages)) (define-public ac-geiser (package (name "") version source build-system synopsis description license home-page))' > /tmp/emacs-ac-geiser.scm
[dev]$ ./pre-inst-env guix build -f /tmp/emacs-ac-geiser.scm 
/tmp/emacs-ac-geiser.scm:1:55: error: version: invalid field specifier

Pour version, même punition !

[dev]$ echo '(use-modules (guix packages)) (define-public ac-geiser (package (name "") (version "") source build-system synopsis description license home-page))' > /tmp/emacs-ac-geiser.scm
[dev]$ ./pre-inst-env guix build -f /tmp/emacs-ac-geiser.scm 
/tmp/emacs-ac-geiser.scm:1:55: error: source: invalid field specifier

Pour source, ça se complique. La suite dans le prochain article !

P:S: En formalisant tout ça, je me suis rendu compte que je me base parfois sur des suppositions/assumptions/intuitions et que je pourrais me poser plus de questions, être plus curieux. Par exemple : – si le fichier de la définition passé à guix build n'est pas .scm ça fonctionne aussi, pourquoi ? Ça sert à quoi une extension de fichier en fait ? – pourquoi j'ai choisi ce modèle de définition vide avec define-public et compagnie ? d'où vient cette intuition ? sans doute de lectures passées mais qu'est-ce qui les avaient motivées ?