Red Nose Hacker

français

#guix #package #français

Je documente ici la poursuite du travail de l'article précédent.

Pour démarrer la session, je me replace dans un environnement de développement isolé :

$ guix environment --pure guix

Ok donc j'en étais où ? Je reprends les commandes de la dernière étape :

[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

Ah oui, le champ source de l'objet package est mal spécifié. Comment ça se spécifie ? Aucune idée. Je fais un petit tour dans la documentation de Guix pour apprendre qu'il lui faut un objet origin. Essayons ça sans chercher plus loin.

[dev]$ echo '(use-modules (guix packages)) (define-public ac-geiser (package (name "") (version "") (source origin) 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: build-system: invalid field specifier

C'est cool, ça lui suffit. Maintenant, le champ build-system. Un petit tour dans la documentation, j'y apprends notamment qu'il existe plusieurs types de build-system pris en charge par Guix, par exemple : le gestionnaire de paquet du langage Rust ou Clojure ou Go, mais aussi un spécialisé pour les polices de caractères et, ohh! un pour Emacs... Ce dernier me semble approprié pour mon paquet donc je l'essaye (je n'oublie pas d'ajouter la dépendance (guix build-system emacs) comme précisé dans la documentation), on verra si ça bloque à cause de ça plus tard.

[dev]$ echo '(use-modules (guix packages) (guix build-system emacs)) (define-public ac-geiser (package (name "") (version "") (source origin) (build-system emacs-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:81: error: synopsis: invalid field specifier

Guix ne se plaint pas, donc je peux passer au champ suivant : synopsis. La documentation ne précise pas quel type de donnée est attendu mais vue le nom du champ, je parierai sur une chaîne de caractères.

[dev]$ echo '(use-modules (guix packages) (guix build-system emacs)) (define-public ac-geiser (package (name "") (version "") (source origin) (build-system emacs-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:81: error: description: invalid field specifier

Même tarif pour description !

[dev]$ echo '(use-modules (guix packages) (guix build-system emacs)) (define-public ac-geiser (package (name "") (version "") (source origin) (build-system emacs-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:81: error: license: invalid field specifier

Pas de souci, Guix est toujours satisfait. La suite dans un prochain article !

Merci beaucoup d'avoir lu cet article ! N'hésites pas à me donner ton avis ou laisser un commentaire. Abonnes-toi pour ne pas manquer les prochains articles :via une plateforme fédérée (ex: mastodon) @jeko@write.asvia RSS https://write.as/jeko/feed/

Et encore plus important, partages le blog et dis à tes amis que c'est le meilleur blog de l'histoire du logiciel libre ! Sans dec'

#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 ?

  • Des bases en Guile ou Scheme sont nécessaires.
  • Guix doit être installé.
  • On connaît et sait utiliser les sous commandes de Guix : build et environment

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 ?