Crafting happiness with Free Software & Hardware

How to package software for Guix (3)

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 I need and how I 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.

History :

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

So I stopped at the license field.

In the documentation, I find little information about how to specify the license field. I could see in the example given for the hello software the value gpl3+, but, for the moment, I'm looking for something closer to a null value, or the value that directly suits my case. I could try to tinker around (e.g. try bsd3) until I find the right value, but that wouldn't be scientific enough for my taste. So I decide to look in the source code. The documentation states that the license field must be valued (or specified) with the values from the (guix licenses) module. A little tour in the Guix git repository allows me to find the source file of this module, logically: guix/licenses.scm.

In the license module file, I see that the module exports the bsd-3 symbol (so it wasn't bsd3 haha), which would fit my package. So I'm going to modify the definition I'm building to import the (guix licenses) module so that I can specify the license field with the appropriate symbol :

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

Guix doesn't return an error concerning the field I just modified, so I can go to the last field still unspecified: home-page. Easy, this one waits for a string.

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

Clearly, we are done specifying the mandatory fields of the package. The new error will make us go into the details of the source object, more precisely, the origin object that is used to value it.

But I'll stop here for today. I'll look into it in a future article. Here is the definition at this point:

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

(package
 (name "")
 (version "")
 (source origin)
 (build-system emacs-build-system)
 (synopsis "")
 (description "")
 (license bsd-3)
 (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 fr
Mastodon: @jeko@framapiaf.org
Peertube: @jeko@video.tedomum.net
Twitter: @JeremyKorwin

Also, please subscribe so you don't miss the next ones :
blog via Mastodon @jeko@write.as et RSS
screencast 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