This is the first part of a series where I'll showcase advanced features of Guix that may not be known to the average user.
They are inspired by the "Nix pills" series. I'm calling them "drops" as some pills are hard to swallow, and because I'm not a total fraud. The best medicines are often liquid, too.
One of the coolest features of Guix is the ability to transform packages "on the fly", directly from the command line. Software is, as its name implies, supposed to be malleable, unlike hardware and some humans.
Many transformation options are available, I'll demonstrate some of them here.
--with-source is useful when you want to build a package with a different
source code than the one in Guix. I previously wrote about
guix shell is great for software development:
--with-source makes it easy to also install your patched software, and test
other packages against the patched version.
A real world example is trying software that I hack on:
guix shell zabbix-cli \ --with-source=zabbix-cli=$HOME/src/zabbix-cli \ -- zabbix-cli
This will build
zabbix-cli with my local source checkout and enter a new shell
environment with the patched
zabbix-cli available. The
-- zabbix-cli at the
guix shell to also run the patched
directly instead of just giving that boring Bash prompt waiting for my input.
Another cool transformation option is
--with-latest. Let's say you are a
zabbix-cli and the package in Guix is older than the latest release
(shame on me for that, as a contributor to both projects!). You can simply
guix shell (or
guix package, etc) to use the latest
guix shell zabbix-cli --with-latest=zabbix-cli
Guix will download the latest tagged release and build it on the fly. All transformations are cached, so if you run the same command again it does not have to be built anew (unless an even newer version is released, of course, at which point Guix will hopefully consider it).
This can also be used to try newer versions of dependencies. For example, if
I want to check whether
zabbix-cli works with the latest
guix shell zabbix-cli --with-latest=python-requests
Now Guix will fetch the latest version of
python-requests and build
against it (and run tests, etc). Neat!
For packages that are built from a Git checkout, you can also use specific commits or branches:
guix shell zabbix-cli --with-commit=zabbix-cli=abc123 \ --with-branch=python-requests=late-bugfixes-2022 \ --with-source=python=within
Here we also build the Python interpreter from a hypothetical
which presumably contains some long overdue performance improvements.
Creativity is the limit for these transformations; I often use them along with
git bisect, for example to track down
which change in SQLite lead to a test failure in NSS.
The amount of effort that has been put into making Guix such a developer-friendly tool is humbling! I wish I could take credit for some of it, but that honor is not mine to bear. I'm just a happy user of these parts of the Guix codebase.