Another set of command-line options supported by
guix package are package transformation
options. These are options that make it possible to define package
variants—for instance, packages built from different source code.
This is a convenient way to create customized packages on the fly
without having to type in the definitions of package variants
(see Defining Packages).
Package transformation options are preserved across upgrades:
guix upgrade attempts to apply transformation options
initially used when creating the profile to the upgraded packages.
The available options are listed below. Most commands support them and also support a --help-transform option that lists all the available options and a synopsis (these options are not shown in the --help output for brevity).
Use source as the source of package, and version as
its version number.
source must be a file name or a URL, as for
download (see Invoking guix download).
When package is omitted,
it is taken to be the package name specified on the
command line that matches the base of source—e.g.,
if source is
/src/guile-2.0.10.tar.gz, the corresponding
Likewise, when version is omitted, the version string is inferred from
source; in the previous example, it is
This option allows users to try out versions of packages other than the
one provided by the distribution. The example below downloads
ed-1.7.tar.gz from a GNU mirror and uses that as the source for
guix build ed --with-source=mirror://gnu/ed/ed-1.7.tar.gz
As a developer, --with-source makes it easy to test release candidates:
guix build guile --with-source=../guile-18.104.22.168-e1bb7.tar.xz
… or to build from a checkout in a pristine environment:
$ git clone git://git.sv.gnu.org/guix.git $ guix build guix --email@example.com=./guix
Replace dependency on package by a dependency on
replacement. package must be a package name, and
replacement must be a package specification such as
For instance, the following command builds Guix, but replaces its
dependency on the current stable version of Guile with a dependency on
the legacy version of Guile,
guix build --firstname.lastname@example.org guix
This is a recursive, deep replacement. So in this example, both
guix and its dependency
guile-json (which also depends on
guile) get rebuilt against
This is implemented using the
This is similar to --with-input but with an important difference: instead of rebuilding the whole dependency chain, replacement is built and then grafted onto the binaries that were initially referring to package. See Security Updates, for more information on grafts.
For example, the command below grafts version 3.5.4 of GnuTLS onto Wget and all its dependencies, replacing references to the version of GnuTLS they currently refer to:
guix build --email@example.com wget
This has the advantage of being much faster than rebuilding everything. But there is a caveat: it works if and only if package and replacement are strictly compatible—for example, if they provide a library, the application binary interface (ABI) of those libraries must be compatible. If replacement is somehow incompatible with package, then the resulting package may be unusable. Use with care!
Build package in a way that preserves its debugging info and graft
it onto packages that depend on it. This is useful if package
does not already provide debugging info as a
(see Installing Debugging Files).
For example, suppose you’re experiencing a crash in Inkscape and would
like to see what’s up in GLib, a library deep down in Inkscape’s
dependency graph. GLib lacks a
debug output, so debugging is
tough. Fortunately, you rebuild GLib with debugging info and tack it on
guix install inkscape --with-debug-info=glib
Only GLib needs to be recompiled so this takes a reasonable amount of time. See Installing Debugging Files, for more info.
Note: Under the hood, this option works by passing the ‘#:strip-binaries? #f’ to the build system of the package of interest (see Build Systems). Most build systems support that option but some do not. In that case, an error is raised.
Likewise, if a C/C++ package is built without
-g(which is rarely the case), debugging info will remain unavailable even when
This option changes the compilation of package and everything that depends on it so that they get built with toolchain instead of the default GNU tool chain for C/C++.
Consider this example:
guix build octave-cli \ --with-c-toolchain=fftw=gcc-toolchain@10 \ --with-c-toolchain=fftwf=gcc-toolchain@10
The command above builds a variant of the
packages using version 10 of
gcc-toolchain instead of the default
tool chain, and then builds a variant of the GNU Octave
command-line interface using them. GNU Octave itself is also built
This other example builds the Hardware Locality (
and its dependents up to
intel-mpi-benchmarks with the Clang C
guix build --with-c-toolchain=hwloc=clang-toolchain \ intel-mpi-benchmarks
Note: There can be application binary interface (ABI) incompatibilities among tool chains. This is particularly true of the C++ standard library and run-time support libraries such as that of OpenMP. By rebuilding all dependents with the same tool chain, --with-c-toolchain minimizes the risks of incompatibility but cannot entirely eliminate them. Choose package wisely.
Build package from the latest commit of the
master branch of the
Git repository at url. Git sub-modules of the repository are fetched,
For example, the following command builds the NumPy Python library against the latest commit of the master branch of Python itself:
guix build python-numpy \ --with-git-url=python=https://github.com/python/cpython
This option can also be combined with --with-branch or --with-commit (see below).
Obviously, since it uses the latest commit of the given branch, the result of such a command varies over time. Nevertheless it is a convenient way to rebuild entire software stacks against the latest commit of one or more packages. This is particularly useful in the context of continuous integration (CI).
Checkouts are kept in a cache under ~/.cache/guix/checkouts to speed up consecutive accesses to the same repository. You may want to clean it up once in a while to save disk space.
Build package from the latest commit of branch. If the
source field of package is an origin with the
method (see origin Reference) or a
git-checkout object, the
repository URL is taken from that
source. Otherwise you have to use
--with-git-url to specify the URL of the Git repository.
For instance, the following command builds
guile-sqlite3 from the
latest commit of its
master branch, and then builds
depends on it) and
cuirass (which depends on
guix) against this
guix build --with-branch=guile-sqlite3=master cuirass
This is similar to --with-branch, except that it builds from commit rather than the tip of a branch. commit must be a valid Git commit SHA1 identifier or a tag.
Build package without running its tests. This can be useful in situations where you want to skip the lengthy test suite of a intermediate package, or if a package’s test suite fails in a non-deterministic fashion. It should be used with care because running the test suite is a good way to ensure a package is working as intended.
Turning off tests leads to a different store item. Consequently, when using this option, anything that depends on package must be rebuilt, as in this example:
guix install --without-tests=python python-notebook
The command above installs
python-notebook on top of
python built without running its test suite. To do so, it also
rebuilds everything that depends on
Internally, --without-tests relies on changing the
#:tests? option of a package’s
check phase (see Build Systems). Note that some packages use a customized
that does not respect a
#:tests? #f setting. Therefore,
--without-tests has no effect on these packages.
Wondering how to achieve the same effect using Scheme code, for example in your manifest, or how to write your own package transformation? See Defining Package Variants, for an overview of the programming interfaces available.