Red Nose Hacker

Do me a favor : hack for good :-)

Logo Guix

This serie of blog posts is an invitation to see how one can learn how to package software for Guix. Without prior knowledge about Guix or even software packaging, I show you what resources are needed and how to use them. My method is driven by doing. The commands execution rhythms my iterations and its return guides the code to produce and the use of external resources (documentation, source code, community).

In this article, I continue the work of the previous one.

In the Guix repository you've cloned in the first article of this serie, do the following :

$ git pull
$ guix environment --pure guix
[dev]$ ./bootstrap && ./configure --localstatedir=/var && make

You now have an up-to-date stuff.

I retrieve the last commands executed (the first one to create a package definition, the second to build the package according to the definition):

$ echo '(use-modules (guix packages)) (package (name "") (version "") source build-system synopsis description license home-page)' > /tmp/dummy-package-definition.scm
$ ./pre-inst-env guix build -f /tmp/dummy-package-definition.scm
/tmp/dummy-package-definition.scm:1:30: error: source: invalid field specifier

Right! The source field of the package object is incorrectly specified. How do you specify it? I don't know yet.

Lets have a look at the Guix documentation about it. I can read that the source field needs an `origin' object. Let's try this without looking further.

$ echo '(use-modules (guix packages)) (package (name "") (version "") (source origin) build-system synopsis description license home-page)' > /tmp/dummy-package-definition.scm
$ ./pre-inst-env guix build -f /tmp/dummy-package-definition.scm
/tmp/dummy-package-definition.scm:1:30: error: build-system: invalid field specifier

That seems enough for Guix concerning the source field. Now, Guix point the build-system field out. A little tour in the appropriate section in the documentation, where I learn this field needs to be specified with one of many build systems. One could be appropriate for my package so I'm trying it out : emacs-buid-system. I don't forget to add the (guix build-system emacs) dependency as specified in the documentation.

$ echo '(use-modules (guix packages) (guix build-system emacs)) (package (name "") (version "") (source origin) (build-system emacs-build-system) synopsis description license home-page)' > /tmp/dummy-package-definition.scm
$ ./pre-inst-env guix build -f /tmp/dummy-package-definition.scm
/tmp/dummy-package-definition.scm:1:56: error: synopsis: invalid field specifier

Guix isn't complaining, so I can move on to the next field: synopsis. The documentation doesn't specify what type of data is expected, but given the field name, I'll bet on a string.

$ echo '(use-modules (guix packages) (guix build-system emacs)) (package (name "") (version "") (source origin) (build-system emacs-build-system) (synopsis "") description license home-page)' > /tmp/dummy-package-definition.scm
$ ./pre-inst-env guix build -f /tmp/dummy-package-definition.scm

Ditto for description !

$ echo '(use-modules (guix packages) (guix build-system emacs)) (package (name "") (version "") (source origin) (build-system emacs-build-system) (synopsis "") (description "") license home-page)' > /tmp/dummy-package-definition.scm
$ ./pre-inst-env guix build -f /tmp/dummy-package-definition.scm
/tmp/dummy-package-definition.scm:1:56: error: license: invalid field specifier

No worries, Guix is still satisfied. In the next article, I will start by fixing the license field !

Here is the definition obtained at this point:

(use-modules
 (guix packages)
 (guix build-system emacs))

(package
 (name "")
 (version "")
 (source origin)
 (build-system emacs-build-system)
 (synopsis "")
 (description "")
 license
 home-page)

Thank you so much for reading this article !

Don't hesitate to give me your opinion, leave a comment, or ask a question via :E-mail: jeremy AT korwin-zmijowski DOT frMastodon: @jeko@framapiaf.orgPeertube: @jeko@video.tedomum.netTwitter: @JeremyKorwin

Also, please subscribe so you don't miss the next ones :blog via Mastodon @jeko@write.as et RSSscreencast via Peertube jeko@video.tedomum.net et RSS

And most importantly, share the blog and tell your friends it's the best blog in the history of Free Software! No shit!

#guix #package #english

#kata #tdd #testdrivendevelopment #guile #scheme #emacs #screencast

Guile Logo

Pour ce kata, j'ai choisi un exercice du site Programming Praxis : String Rotations.

Je choisi généralement de faire des sessions de 25 minutes. Pour ce kata, je n'avais pas d'objectif particulier autre que voir de quoi je suis capable avec les outils que j'utilise.

Bon screencast !

Merci beaucoup d'avoir regardé ce screencast ! N'hésites pas à me donner ton avis, proposer une idée d'amélioration, laisser un commentaire, ou poser une question via :E-mail: jeremy AT korwin-zmijowski DOT frMastodon: @jeko@framapiaf.orgPeertube: @jeko@video.tedomum.netTwitter: @JeremyKorwin

Abonnes-toi pour ne pas manquer les prochains articles et épisodes:blog via Mastodon @jeko@write.as et RSSscreencast via Peertube jeko@video.tedomum.net et RSS

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

Logo Guix

This serie of blog posts is an invitation to see how one can learn how to package software for Guix. Without prior knowledge about Guix or even software packaging, I show you what resources are needed and how to use them. My method is driven by doing. The commands execution rhythms my iterations and its return guides the code to produce and the use of external resources (documentation, source code, community). At the end of this serie, I would have packaged a simple piece of free software : ac-geiser, an extension of Emacs that brings a hint of self-completion to Geiser when I hack with the Guile language.

Before we get started, I want to talk to you about my style, yeah baby. I'm lazy. I like to do as little as possible. So I have a penchant for sobriety. I also like things tidy and clear. I only read documentation when I know what I'm looking for. Also, I like to do things on my own. Even when I find a shortcut, I will always take a step back to see how I could have figure it out by myself. But I don't like to waste my time. So I don't hesitate to approach the Guixters community once I admit my failure (not a pleasant feeling). Well, enough coming out. Let's get started !

To understand the following, you will need to be familiar with the syntax of the Guile programming language. I can suggest you to start with Mu Lei's Scheme tutorial as Guile is a Scheme implementation. To reproduce manipulations, you will need to have Guix installed. Here is a way to do so :

$ cd /tmp
$ wget https://git.savannah.gnu.org/cgit/guix.git/plain/etc/guix-install.sh
$ chmod +x guix-install.sh
$ sudo ./guix-install.sh

Done, you think ? Hell no, haha. Because we are going to hack Guix itself, we need to download the Guix's source code and compile it. Then use the result as our main toolkit. Follow the guide ! (All these steps are decribed here)

$ git clone https://git.savannah.gnu.org/git/guix.git
$ cd guix
$ guix environment --pure guix
[dev]$ ./bootstrap # for [dev]$ see https://guix.gnu.org/manual/en/html_node/Invoking-guix-environment.html
[dev]$ ./configure --localstatedir=/var
[dev]$ make # coffee? tea? workout? meditation? poo?

If you encounter errors while executing these commands, you may need to ask for help to the Guixters Community, don't hesitate!

Fair enough.

What is a package, for Guix point of view ? According to the documentation, a Guix package is represented by an instanciation of the package Guile object.

How do I build a package definition ? Using... guix build ! It won't install anything on my system (good to know as I am pretty sure I will make a lot of mistakes). With the —file option, I can specify a package definition file as an input.

Remember to use the Guix binary (previously compiled) through the pre-inst-env script freshly generated. Lets try it once, to see what happen :

What if I just execute this :

$ ./pre-inst-env guix build

Well, nothing. What about :

$ ./pre-inst-env guix build -f
guix build: error: invalid argument: Missing required argument after `-f'

As expected, and now, I give it a filename :

$ ./pre-inst-env guix build -f /tmp/dummy-package-definition.scm
guix build: error: failed to load '/tmp/dummy-package-definition.scm': No such file or directory

Here, Guix is telling me the file in location /tmp/dummy-package-definition.scm doesn't exist. It is true, I didn't create that file yet. So what if I create the file and re-execute the guix build -f command :

$ touch /tmp/dummy-package-definition.scm
$ ./pre-inst-env guix build -f /tmp/dummy-package-definition.scm
guix build: error: #<unspecified>: not something we can build

Now there is a file, Guix tells me it is not buildable. Could be because the file doesn't have a package definition, I mean, a package object. Lets try that :

$ echo "(package)" > /tmp/dummy-package-definition.scm
$ ./pre-inst-env guix build -f /tmp/dummy-package-definition.scm 
/tmp/dummy-package-definition.scm:1:0: error: package: unbound variable
hint: Did you forget `(use-modules (guix packages))'?

Guix points out to me the variable package is unbound and suggest to me I how I can fix this error (so kind).

$ echo "(use-modules (guix packages)) (package)" > /tmp/dummy-package-definition.scm
$ ./pre-inst-env guix build -f /tmp/dummy-package-definition.scm
/tmp/dummy-package-definition.scm:1:30: error: (package): missing field initializers (name version source build-system synopsis description license home-page)

Another attempt, another mistake (but that's how you learn, isn't it?).

So, here, Guix tells me that the initialization of several fields is missing from (package) and tells me which ones. Did I mention that Guix is nice? I add the requested fields in my definition and I retry.

$ echo "(use-modules (guix packages)) (package name version source build-system synopsis description license home-page)" > /tmp/dummy-package-definition.scm
$ ./pre-inst-env guix build -f /tmp/dummy-package-definition.scm
/tmp/dummy-package-definition.scm:1:30: error: name: invalid field specifier

Ah, we're making progress (yeah, in my world, another error is what I call a new step) ! Now, Guix tells me that the name field is misspecified. Since I have no idea how name should be specified, I'm going to look up some information in the Guix documentation. It is so well done that there is a whole package reference page. I learn there that the name field is waiting for a string. OK !

$ echo '(use-modules (guix packages)) (package (name "") version source build-system synopsis description license home-page)' > /tmp/dummy-package-definition.scm
$ ./pre-inst-env guix build -f /tmp/dummy-package-definition.scm
/tmp/dummy-package-definition.scm:1:30: error: version: invalid field specifier

For version, same punishment!

$ echo '(use-modules (guix packages)) (package (name "") (version "") source build-system synopsis description license home-page)' > /tmp/dummy-package-definition.scm
$ ./pre-inst-env guix build -f /tmp/dummy-package-definition.scm
/tmp/dummy-package-definition.scm:1:30: error: source: invalid field specifier

I'll stop here for today. I'll look into the source field in the next article. Here is the definition obtained at this point:

(use-modules
 (guix packages))
(package
 (name "")
 (version "")
 source
 build-system
 synopsis
 description
 license
 home-page)

Thank you so much for reading this article !

Don't hesitate to give me your opinion, leave a comment, or ask a question via :E-mail: jeremy AT korwin-zmijowski DOT frMastodon: @jeko@framapiaf.orgPeertube: @jeko@video.tedomum.netTwitter: @JeremyKorwin

Subscribe so you don't miss the next ones :blog via Mastodon @jeko@write.as et RSSscreencast via Peertube jeko@video.tedomum.net et RSS

And most importantly, share the blog and tell your friends it's the best blog in the history of Free Software! No shit!

#guix #package #english

#guix #package #screencast #français Logo Guix

Cet article s'inscrit dans la lignée de ma série sur la découverte de l'empaquetage (communément appelé packaging) de logiciel pour le gestionnaire de paquet Guix. J'y documente ma façon d'apprendre. Tu peux y voir les difficultés auxquelles je fais face et les options que j'ai pour m'aider à les surmonter. Dans cet article, je poursuis le travail de l'article précédent.

Si tu préfères le format vidéo, je te met à disposition le screencast de cette session!

Pour démarrer cette nouvelle session de travail, je prend le réflexe de me placer dans un environnement de développement isolé :

$ guix environment --pure guix

Je reprends les commandes de la dernière étape de l'article précédent :

[dev]$ echo '(use-modules (guix packages) (guix build-system emacs) (guix licenses)) (define-public ac-geiser (package (name "") (version "") (source (origin (uri (git-reference (url "") (commit ""))) (method git-fetch) sha256)) (build-system emacs-build-system) (synopsis "") (description "") (license bsd-3) (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:137: error: sha256: invalid field specifier

N'ayant aucune idée de comment spécifier sha256, je vais voir ce que me dit la documentation à ce sujet. Malheureusement, je ne trouve pas beaucoup d'informations sur comment utiliser sha256. J'ai donc regarder l'exemple du paquet hello de la documentation pour me débloquer (c'est le joker de la session). Je peux maintenant modifier ma définition en conséquence.

[dev]$ echo '(use-modules (guix packages) (guix build-system emacs) (guix licenses) (guix git-download)) (define-public ac-geiser (package (name "") (version "") (source (origin (uri (git-reference (url "") (commit ""))) (method git-fetch) (sha256 (base32 "")))) (build-system emacs-build-system) (synopsis "") (description "") (license bsd-3) (home-page "")))' > /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

Maintenant, Guix ne comprend plus rien. Je bloque, je réfléchis, le temps passe et j'arrive à la fin du temps imparti pour la session !

Je pense que la prochaine s'annonce déjà comme étant riche en action... Je solliciterai quand même l'aide de la communauté des Guixters pour comprendre ce qui ne va pas.

Voici la définition obtenue à ce stade :

(use-modules
 (guix packages)
 (guix build-system emacs)
 (guix licenses)
 (guix git-download))

(define-public ac-geiser
  (package
   (name "")
   (version "")
   (source
    (origin
     (uri
      (git-reference (url "") (commit "")))
     (method git-fetch)
     (sha256
      (base32 ""))))
   (build-system emacs-build-system)
   (synopsis "")
   (description "")
   (license bsd-3)
   (home-page "")))

Merci beaucoup d'avoir lu cet article ! N'hésites pas à me donner ton avis, proposer une idée d'amélioration, laisser un commentaire, ou poser une question via :E-mail: jeremy AT korwin-zmijowski DOT frMastodon: @jeko@framapiaf.orgPeertube: @jeko@video.tedomum.netTwitter: @JeremyKorwin Abonnes-toi pour ne pas manquer les prochains :articles via Mastodon @jeko@write.as et RSSscreencasts via Peertube jeko@video.tedomum.net et RSS

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

#guix #package #screencast #français Logo Guix

Je documente ici la poursuite du travail de l'article précédent. Ces articles font partie d'une série sur l'empaquetage de logiciels pour le gestionnaire de paquet Guix.

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

$ guix environment --pure guix

Je reprends les commandes de la dernière étape de l'article précédent :

[dev]$ echo '(use-modules (guix packages) (guix build-system emacs) (guix licenses)) (define-public ac-geiser (package (name "") (version "") (source origin) (build-system emacs-build-system) (synopsis "") (description "") (license bsd-3) (home-page "")))' > /tmp/emacs-ac-geiser.scm
[dev]$ ./pre-inst-env guix build -f /tmp/emacs-ac-geiser.scm
guix build: error: origin: source expression failed to match any pattern

À priori, cette portion de la définition pose problème (source origin). Je vais voir ce que me dit la documentation à ce sujet. Effectiovement, origin est un objet et pas un symbole. Je modifie la définition pour coller avec ça :

[dev]$ echo '(use-modules (guix packages) (guix build-system emacs) (guix licenses)) (define-public ac-geiser (package (name "") (version "") (source (origin)) (build-system emacs-build-system) (synopsis "") (description "") (license bsd-3) (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:137: error: (origin): missing field initializers (uri method sha256)

Guix m'indique que l'objet origin est au moins constitué de trois champs obligatoires : (uri method sha256). Je vais les passer brutalement à origin et voir ce que Guix me dit :

[dev]$ echo '(use-modules (guix packages) (guix build-system emacs) (guix licenses)) (define-public ac-geiser (package (name "") (version "") (source (origin uri method sha256)) (build-system emacs-build-system) (synopsis "") (description "") (license bsd-3) (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:137: error: uri: invalid field specifier

uri n'est pas spécifié. Je vais vérifier dans la documentation de origin comment spécifier ce champ. Il s'agit d'une chaîne de caractères. Essayons ça :

[dev]$ echo '(use-modules (guix packages) (guix build-system emacs) (guix licenses)) (define-public ac-geiser (package (name "") (version "") (source (origin (uri "") method sha256)) (build-system emacs-build-system) (synopsis "") (description "") (license bsd-3) (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:137: error: method: invalid field specifier

Bingo, maintenant, je peux avancer avec le deuxième champ : method. La documetation me dit que c'est une procédure qui va récupérer les sources du logiciel soit depuis une URL, soit depuis un dépôt git. Dans mon cas, ce sera un dépôt git. Ce que me dit aussi la documentation, c'est que pour un dépôt git, uri doit être un objet git-reference et pas une chaîne de caratère comme je l'ai spécifié à l'étape d'avant. Je vais reprendre ça avant d'avancer sur method.

[dev]$ echo '(use-modules (guix packages) (guix build-system emacs) (guix licenses)) (define-public ac-geiser (package (name "") (version "") (source (origin (uri (git-reference (url "") (commit ""))) method sha256)) (build-system emacs-build-system) (synopsis "") (description "") (license bsd-3) (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:137: error: method: invalid field specifier

La construction de mon uri semble convenir Guix. Maintenant, je vais m'occuper du champ method. La documentation me dit que method, pour récupérer les sources d'un logiciel via git doit prendre la valeur git-fetch :

[dev]$ echo '(use-modules (guix packages) (guix build-system emacs) (guix licenses)) (define-public ac-geiser (package (name "") (version "") (source (origin (uri (git-reference (url "") (commit ""))) (method git-fetch) sha256)) (build-system emacs-build-system) (synopsis "") (description "") (license bsd-3) (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:137: error: sha256: invalid field specifier

Cool, la spécification de champ method est OK pour Guix.

Mais je m'arrête là pour aujourd'hui. Je me pencherai dessus dans un prochain article. Voici la définition obtenue à ce stade :

(use-modules 
 (guix packages) 
 (guix build-system emacs) 
 (guix licenses)) 

(define-public ac-geiser 
  (package 
   (name "") 
   (version "") 
   (source 
    (origin 
     (uri (git-reference 
	   (url "") (commit "")))
     (method git-fetch) 
     sha256))
   (build-system emacs-build-system) 
   (synopsis "") 
   (description "") 
   (license bsd-3) 
   (home-page "")))

Merci beaucoup d'avoir lu cet article ! N'hésites pas à me donner ton avis, laisser un commentaire, ou poser une question via :e-mail: jeremy AT korwin-zmijowski DOT frMastodon: @jeko@framapiaf.orgTwitter: @JeremyKorwin Abonnes-toi pour ne pas manquer les prochains articles :via une plateforme fédérée (ex: mastodon) @jeko@write.asvia RSS https://jeko.write.as/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

Logo Guix

Je documente ici la poursuite du travail de l'article précédent. Ces articles font partie d'une série sur l'empaquetage de logiciels pour le gestionnaire de paquet Guix.

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

$ guix environment --pure guix

Je reprends les commandes de la dernière étape de l'article précédent :

[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

Je cherche à corriger l'erreur que me signal Guix, à savoir : le champ license qui n'est pas spécifié.

Dans la documentation, je trouve peu d'informations concernant la façon de spécifier le champ license. J'ai pu voir, dans l'exemple donné pour le logiciel hello la valeur gpl3+, or, pour l'instant, je recherche quelque chose de plus proche d'une valeur nulle, à défaut d'avoir la valeur qui convient directement à mon cas. Je pourrai essayer de bidouiller au hasard (par exemple essayer bsd3) jusqu'a tomber sur la bonne valeur, mais ce serais pas assez scientifique comme démarche, à mon goût. Je décide donc d'aller chercher dans le code source. La documentation stipule que le champ license doit être valorisé (ou spécifié) avec les valeurs tirées du module (guix licenses). Un petit tour dans le dépot git de Guix me permet de trouver le fichier source de ce module, logiquement : guix/licenses.scm .

Dans ce fichier, je vois que le module exporte le symbole bsd-3 (et non, ce n'était pas bsd3), qui conviendrait à mon paquet. Je vais donc modifier la définition que je suis en train de construire pour importer le module (guix licenses) et ainsi pouvoir spécifier le champ license avec le symbole adéquat :

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

Guix ne me renvoit pas d'erreur avec ces modifications, donc je peux passer au dernier champ encore non spécifié : home-page. Facile, celui-ci attend une chaîne de caractères.

[dev]$ echo '(use-modules (guix packages) (guix build-system emacs) (guix licenses)) (define-public ac-geiser (package (name "") (version "") (source origin) (build-system emacs-build-system) (synopsis "") (description "") (license bsd-3) (home-page "")))' > /tmp/emacs-ac-geiser.scm
[dev]$ ./pre-inst-env guix build -f /tmp/emacs-ac-geiser.scm
guix build: error: origin: source expression failed to match any pattern

Visiblement, on en a fini avec la spécification des champs obligatoires de package. La nouvelle erreur va nous faire rentrer dans le détail de l'objet source, plus précisément, l'objet origin qui sert à le valoriser.

Mais je m'arrête là pour aujourd'hui. Je me pencherai dessus dans un prochain article. Voici la définition obtenue à ce stade :

(use-modules
 (guix packages)
 (guix build-system emacs)
 (guix licenses))

(define-public ac-geiser
  (package
   (name "")
   (version "")
   (source origin)
   (build-system emacs-build-system)
   (synopsis "")
   (description "")
   (license bsd-3)
   (home-page "")))

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

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 ?

I want to write about my hacking journey with Guile programming language and Guix System.

Follow this blog from Mastodon and other federated platforms! Just search for @jeko@write.as to start getting my posts (french and english).

Cheers !

Hello World !