How to package software for Guix (3)
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!