Skip to content
Snippets Groups Projects
guix.texi 429 KiB
Newer Older
  • Learn to ignore specific revisions
  • This is useful to debug daemon start-up issues, but then it may be
    overridden by clients, for example the @code{--verbosity} option of
    
    @command{guix build} (@pxref{Invoking guix build}).
    
    
    @item --chroot-directory=@var{dir}
    Add @var{dir} to the build chroot.
    
    Doing this may change the result of build processes---for instance if
    they use optional dependencies found in @var{dir} when it is available,
    and not otherwise.  For that reason, it is not recommended to do so.
    Instead, make sure that each derivation declares all the inputs that it
    needs.
    
    @item --disable-chroot
    Disable chroot builds.
    
    Using this option is not recommended since, again, it would allow build
    
    processes to gain access to undeclared dependencies.  It is necessary,
    though, when @command{guix-daemon} is running under an unprivileged user
    account.
    
    
    @item --disable-log-compression
    Disable compression of the build logs.
    
    
    Unless @code{--lose-logs} is used, all the build logs are kept in the
    @var{localstatedir}.  To save space, the daemon automatically compresses
    them with bzip2 by default.  This option disables that.
    
    
    @item --disable-deduplication
    @cindex deduplication
    
    Disable automatic file ``deduplication'' in the store.
    
    
    By default, files added to the store are automatically ``deduplicated'':
    
    if a newly added file is identical to another one found in the store,
    the daemon makes the new file a hard link to the other file.  This can
    
    Steve Sprang's avatar
    Steve Sprang committed
    noticeably reduce disk usage, at the expense of slightly increased
    
    input/output load at the end of a build process.  This option disables
    this optimization.
    
    @item --gc-keep-outputs[=yes|no]
    Tell whether the garbage collector (GC) must keep outputs of live
    derivations.
    
    When set to ``yes'', the GC will keep the outputs of any live derivation
    available in the store---the @code{.drv} files.  The default is ``no'',
    meaning that derivation outputs are kept only if they are GC roots.
    
    @item --gc-keep-derivations[=yes|no]
    Tell whether the garbage collector (GC) must keep derivations
    corresponding to live outputs.
    
    When set to ``yes'', as is the case by default, the GC keeps
    derivations---i.e., @code{.drv} files---as long as at least one of their
    outputs is live.  This allows users to keep track of the origins of
    items in their store.  Setting it to ``no'' saves a bit of disk space.
    
    Note that when both @code{--gc-keep-derivations} and
    @code{--gc-keep-outputs} are used, the effect is to keep all the build
    prerequisites (the sources, compiler, libraries, and other build-time
    tools) of live objects in the store, regardless of whether these
    prerequisites are live.  This is convenient for developers since it
    saves rebuilds or downloads.
    
    
    @item --impersonate-linux-2.6
    On Linux-based systems, impersonate Linux 2.6.  This means that the
    kernel's @code{uname} system call will report 2.6 as the release number.
    
    This might be helpful to build programs that (usually wrongfully) depend
    on the kernel version number.
    
    @item --lose-logs
    Do not keep build logs.  By default they are kept under
    
    @code{@var{localstatedir}/guix/log}.
    
    
    @item --system=@var{system}
    Assume @var{system} as the current system type.  By default it is the
    architecture/kernel pair found at configure time, such as
    @code{x86_64-linux}.
    
    
    @item --listen=@var{socket}
    Listen for connections on @var{socket}, the file name of a Unix-domain
    socket.  The default socket is
    @file{@var{localstatedir}/daemon-socket/socket}.  This option is only
    useful in exceptional circumstances, such as if you need to run several
    daemons on the same machine.
    
    @node Application Setup
    @section Application Setup
    
    
    When using Guix on top of GNU/Linux distribution other than GuixSD---a
    so-called @dfn{foreign distro}---a few additional steps are needed to
    get everything in place.  Here are some of them.
    
    @anchor{locales-and-locpath}
    
    @cindex locales, when not on GuixSD
    
    Andreas Enge's avatar
    Andreas Enge committed
    Packages installed @i{via} Guix will not use the locale data of the
    host system.  Instead, you must first install one of the locale packages
    
    available with Guix and then define the @code{GUIX_LOCPATH} environment
    variable:
    
    
    @example
    $ guix package -i glibc-locales
    
    $ export GUIX_LOCPATH=$HOME/.guix-profile/lib/locale
    
    @end example
    
    Note that the @code{glibc-locales} package contains data for all the
    locales supported by the GNU@tie{}libc and weighs in at around
    
    Andreas Enge's avatar
    Andreas Enge committed
    110@tie{}MiB.  Alternatively, the @code{glibc-utf8-locales} is smaller but
    
    limited to a few UTF-8 locales.
    
    
    The @code{GUIX_LOCPATH} variable plays a role similar to @code{LOCPATH}
    (@pxref{Locale Names, @code{LOCPATH},, libc, The GNU C Library Reference
    Manual}).  There are two important differences though:
    
    @enumerate
    @item
    
    Andreas Enge's avatar
    Andreas Enge committed
    @code{GUIX_LOCPATH} is honored only by the libc in Guix, and not by the libc
    
    provided by foreign distros.  Thus, using @code{GUIX_LOCPATH} allows you
    
    Andreas Enge's avatar
    Andreas Enge committed
    to make sure the programs of the foreign distro will not end up loading
    
    incompatible locale data.
    
    @item
    libc suffixes each entry of @code{GUIX_LOCPATH} with @code{/X.Y}, where
    @code{X.Y} is the libc version---e.g., @code{2.22}.  This means that,
    should your Guix profile contain a mixture of programs linked against
    different libc version, each libc version will only try to load locale
    data in the right format.
    @end enumerate
    
    This is important because the locale data format used by different libc
    versions may be incompatible.
    
    
    @subsection X11 Fonts
    
    
    Steve Sprang's avatar
    Steve Sprang committed
    The majority of graphical applications use Fontconfig to locate and
    
    Andreas Enge's avatar
    Andreas Enge committed
    load fonts and perform X11-client-side rendering.  The @code{fontconfig}
    package in Guix looks for fonts in @file{$HOME/.guix-profile}
    
    by default.  Thus, to allow graphical applications installed with Guix
    
    Andreas Enge's avatar
    Andreas Enge committed
    to display fonts, you have to install fonts with Guix as well.
    
    Essential font packages include @code{gs-fonts}, @code{font-dejavu}, and
    
    @code{font-gnu-freefont-ttf}.
    
    To display text written in Chinese languages, Japanese, or Korean in
    graphical applications, consider installing
    @code{font-adobe-source-han-sans} or @code{font-wqy-zenhei}.  The former
    has multiple outputs, one per language family (@pxref{Packages with
    Multiple Outputs}).  For instance, the following command installs fonts
    for Chinese languages:
    
    @example
    guix package -i font-adobe-source-han-sans:cn
    @end example
    
    
    @subsection Emacs Packages
    
    When you install Emacs packages with Guix, the elisp files may be placed
    either in @file{$HOME/.guix-profile/share/emacs/site-lisp/} or in
    sub-directories of
    @file{$HOME/.guix-profile/share/emacs/site-lisp/guix.d/}.  The latter
    directory exists because potentially there may exist thousands of Emacs
    packages and storing all their files in a single directory may be not
    reliable (because of name conflicts).  So we think using a separate
    directory for each package is a good idea.  It is very similar to how
    the Emacs package system organizes the file structure (@pxref{Package
    Files,,, emacs, The GNU Emacs Manual}).
    
    By default, Emacs (installed with Guix) ``knows'' where these packages
    
    Andreas Enge's avatar
    Andreas Enge committed
    are placed, so you do not need to perform any configuration.  If, for
    
    some reason, you want to avoid auto-loading Emacs packages installed
    
    Andreas Enge's avatar
    Andreas Enge committed
    with Guix, you can do so by running Emacs with @code{--no-site-file}
    
    option (@pxref{Init File,,, emacs, The GNU Emacs Manual}).
    
    
    @c *********************************************************************
    @node Package Management
    @chapter Package Management
    
    
    The purpose of GNU Guix is to allow users to easily install, upgrade, and
    
    remove software packages, without having to know about their build
    
    Andreas Enge's avatar
    Andreas Enge committed
    procedures or dependencies.  Guix also goes beyond this obvious set of
    
    features.
    
    This chapter describes the main features of Guix, as well as the package
    
    management tools it provides.  Two user interfaces are provided for
    
    routine package management tasks: A command-line interface described below
    (@pxref{Invoking guix package, @code{guix package}}), as well as a visual user
    interface in Emacs described in a subsequent chapter (@pxref{Emacs Interface}).
    
    
    @menu
    * Features::                    How Guix will make your life brighter.
    
    * Invoking guix package::       Package installation, removal, etc.
    
    * Substitutes::                 Downloading pre-built binaries.
    
    Ludovic Courtès's avatar
    Ludovic Courtès committed
    * Packages with Multiple Outputs::  Single source package, multiple outputs.
    
    * Invoking guix gc::            Running the garbage collector.
    
    Ludovic Courtès's avatar
    Ludovic Courtès committed
    * Invoking guix pull::          Fetching the latest Guix and distribution.
    
    Ludovic Courtès's avatar
    Ludovic Courtès committed
    * Invoking guix archive::       Exporting and importing store files.
    
    @end menu
    
    @node Features
    @section Features
    
    When using Guix, each package ends up in the @dfn{package store}, in its
    own directory---something that resembles
    
    Alex Kost's avatar
    Alex Kost committed
    @file{/gnu/store/xxx-package-1.2}, where @code{xxx} is a base32 string
    (note that Guix comes with an Emacs extension to shorten those file
    
    names, @pxref{Emacs Prettify}.)
    
    
    Instead of referring to these directories, users have their own
    @dfn{profile}, which points to the packages that they actually want to
    
    use.  These profiles are stored within each user's home directory, at
    @code{$HOME/.guix-profile}.
    
    For example, @code{alice} installs GCC 4.7.2.  As a result,
    
    @file{/home/alice/.guix-profile/bin/gcc} points to
    
    @file{/gnu/store/@dots{}-gcc-4.7.2/bin/gcc}.  Now, on the same machine,
    
    @code{bob} had already installed GCC 4.8.0.  The profile of @code{bob}
    simply continues to point to
    
    @file{/gnu/store/@dots{}-gcc-4.8.0/bin/gcc}---i.e., both versions of GCC
    
    coexist on the same system without any interference.
    
    The @command{guix package} command is the central tool to manage
    
    Andreas Enge's avatar
    Andreas Enge committed
    packages (@pxref{Invoking guix package}).  It operates on the per-user
    
    profiles, and can be used @emph{with normal user privileges}.
    
    
    The command provides the obvious install, remove, and upgrade
    operations.  Each invocation is actually a @emph{transaction}: either
    
    Ludovic Courtès's avatar
    Ludovic Courtès committed
    the specified operation succeeds, or nothing happens.  Thus, if the
    
    @command{guix package} process is terminated during the transaction,
    
    or if a power outage occurs during the transaction, then the user's
    profile remains in its previous state, and remains usable.
    
    In addition, any package transaction may be @emph{rolled back}.  So, if,
    for example, an upgrade installs a new version of a package that turns
    out to have a serious bug, users may roll back to the previous instance
    
    of their profile, which was known to work well.  Similarly, the global
    
    system configuration on GuixSD is subject to
    transactional upgrades and roll-back
    
    (@pxref{Using the Configuration System}).
    
    Andreas Enge's avatar
    Andreas Enge committed
    All packages in the package store may be @emph{garbage-collected}.
    Guix can determine which packages are still referenced by user
    
    Ludovic Courtès's avatar
    Ludovic Courtès committed
    profiles, and remove those that are provably no longer referenced
    
    (@pxref{Invoking guix gc}).  Users may also explicitly remove old
    
    Ludovic Courtès's avatar
    Ludovic Courtès committed
    generations of their profile so that the packages they refer to can be
    collected.
    
    @cindex reproducibility
    @cindex reproducible builds
    
    Finally, Guix takes a @dfn{purely functional} approach to package
    management, as described in the introduction (@pxref{Introduction}).
    
    Each @file{/gnu/store} package directory name contains a hash of all the
    
    inputs that were used to build that package---compiler, libraries, build
    scripts, etc.  This direct correspondence allows users to make sure a
    given package installation matches the current state of their
    
    distribution.  It also helps maximize @dfn{build reproducibility}:
    thanks to the isolated build environments that are used, a given build
    is likely to yield bit-identical files when performed on different
    machines (@pxref{Invoking guix-daemon, container}).
    
    @cindex substitutes
    
    This foundation allows Guix to support @dfn{transparent binary/source
    
    deployment}.  When a pre-built binary for a @file{/gnu/store} item is
    
    available from an external source---a @dfn{substitute}, Guix just
    
    downloads it and unpacks it;
    otherwise, it builds the package from source, locally
    
    (@pxref{Substitutes}).  Because build results are usually bit-for-bit
    reproducible, users do not have to trust servers that provide
    substitutes: they can force a local build and @emph{challenge} providers
    (@pxref{Invoking guix challenge}).
    
    Control over the build environment is a feature that is also useful for
    developers.  The @command{guix environment} command allows developers of
    a package to quickly set up the right development environment for their
    
    Andreas Enge's avatar
    Andreas Enge committed
    package, without having to manually install the dependencies of the
    package into their profile (@pxref{Invoking guix environment}).
    
    @node Invoking guix package
    @section Invoking @command{guix package}
    
    The @command{guix package} command is the tool that allows users to
    
    install, upgrade, and remove packages, as well as rolling back to
    previous configurations.  It operates only on the user's own profile,
    and works with normal user privileges (@pxref{Features}).  Its syntax
    is:
    
    @example
    
    guix package @var{options}
    
    Ludovic Courtès's avatar
    Ludovic Courtès committed
    Primarily, @var{options} specifies the operations to be performed during
    
    the transaction.  Upon completion, a new profile is created, but
    
    previous @dfn{generations} of the profile remain available, should the user
    
    For example, to remove @code{lua} and install @code{guile} and
    @code{guile-cairo} in a single transaction:
    
    @example
    guix package -r lua -i guile guile-cairo
    @end example
    
    
    @command{guix package} also supports a @dfn{declarative approach}
    whereby the user specifies the exact set of packages to be available and
    passes it @i{via} the @option{--manifest} option
    (@pxref{profile-manifest, @option{--manifest}}).
    
    
    For each user, a symlink to the user's default profile is automatically
    
    created in @file{$HOME/.guix-profile}.  This symlink always points to the
    
    current generation of the user's default profile.  Thus, users can add
    @file{$HOME/.guix-profile/bin} to their @code{PATH} environment
    variable, and so on.
    
    @cindex search paths
    If you are not using the Guix System Distribution, consider adding the
    following lines to your @file{~/.bash_profile} (@pxref{Bash Startup
    Files,,, bash, The GNU Bash Reference Manual}) so that newly-spawned
    shells get all the right environment variable definitions:
    
    @example
    GUIX_PROFILE="$HOME/.guix-profile" \
    source "$HOME/.guix-profile/etc/profile"
    @end example
    
    In a multi-user setup, user profiles are stored in a place registered as
    a @dfn{garbage-collector root}, which @file{$HOME/.guix-profile} points
    to (@pxref{Invoking guix gc}).  That directory is normally
    
    @code{@var{localstatedir}/profiles/per-user/@var{user}}, where
    @var{localstatedir} is the value passed to @code{configure} as
    
    @code{--localstatedir}, and @var{user} is the user name.  The
    @file{per-user} directory is created when @command{guix-daemon} is
    started, and the @var{user} sub-directory is created by @command{guix
    package}.
    
    
    The @var{options} can be among the following:
    
    
    @item --install=@var{package} @dots{}
    @itemx -i @var{package} @dots{}
    Install the specified @var{package}s.
    
    Each @var{package} may specify either a simple package name, such as
    
    @code{guile}, or a package name followed by an at-sign and version number,
    such as @code{guile@@1.8.8} or simply @code{guile@@1.8} (in the latter
    
    case, the newest version prefixed by @code{1.8} is selected.)
    
    If no version number is specified, the
    
    newest available version will be selected.  In addition, @var{package}
    may contain a colon, followed by the name of one of the outputs of the
    
    package, as in @code{gcc:doc} or @code{binutils@@2.22:lib}
    
    (@pxref{Packages with Multiple Outputs}).  Packages with a corresponding
    name (and optionally version) are searched for among the GNU
    distribution modules (@pxref{Package Modules}).
    
    @cindex propagated inputs
    Sometimes packages have @dfn{propagated inputs}: these are dependencies
    
    that automatically get installed along with the required package
    (@pxref{package-propagated-inputs, @code{propagated-inputs} in
    @code{package} objects}, for information about propagated inputs in
    package definitions).
    
    @anchor{package-cmd-propagated-inputs}
    
    An example is the GNU MPC library: its C header files refer to those of
    the GNU MPFR library, which in turn refer to those of the GMP library.
    Thus, when installing MPC, the MPFR and GMP libraries also get installed
    in the profile; removing MPC also removes MPFR and GMP---unless they had
    
    Andreas Enge's avatar
    Andreas Enge committed
    also been explicitly installed by the user.
    
    Nikita Karetnikov's avatar
    Nikita Karetnikov committed
    Besides, packages sometimes rely on the definition of environment
    
    variables for their search paths (see explanation of
    
    Nikita Karetnikov's avatar
    Nikita Karetnikov committed
    @code{--search-paths} below).  Any missing or possibly incorrect
    
    environment variable definitions are reported here.
    
    
    Finally, when installing a GNU package, the tool reports the
    
    availability of a newer upstream version.  In the future, it may provide
    the option of installing directly from the upstream version, even if
    that version is not yet in the distribution.
    
    
    @item --install-from-expression=@var{exp}
    @itemx -e @var{exp}
    Install the package @var{exp} evaluates to.
    
    @var{exp} must be a Scheme expression that evaluates to a
    @code{<package>} object.  This option is notably useful to disambiguate
    between same-named variants of a package, with expressions such as
    @code{(@@ (gnu packages base) guile-final)}.
    
    Note that this option installs the first output of the specified
    package, which may be insufficient when needing a specific output of a
    multiple-output package.
    
    
    @item --install-from-file=@var{file}
    @itemx -f @var{file}
    Install the package that the code within @var{file} evaluates to.
    
    As an example, @var{file} might contain a definition like this
    (@pxref{Defining Packages}):
    
    @example
    @verbatiminclude package-hello.scm
    @end example
    
    
    Developers may find it useful to include such a @file{guix.scm} file
    
    Andreas Enge's avatar
    Andreas Enge committed
    in the root of their project source tree that can be used to test
    
    development snapshots and create reproducible development environments
    (@pxref{Invoking guix environment}).
    
    
    @item --remove=@var{package} @dots{}
    @itemx -r @var{package} @dots{}
    Remove the specified @var{package}s.
    
    As for @code{--install}, each @var{package} may specify a version number
    
    and/or output name in addition to the package name.  For instance,
    @code{-r glibc:debug} would remove the @code{debug} output of
    @code{glibc}.
    
    
    @item --upgrade[=@var{regexp} @dots{}]
    @itemx -u [@var{regexp} @dots{}]
    Upgrade all the installed packages.  If one or more @var{regexp}s are
    specified, upgrade only installed packages whose name matches a
    
    @var{regexp}.  Also see the @code{--do-not-upgrade} option below.
    
    Ludovic Courtès's avatar
    Ludovic Courtès committed
    Note that this upgrades package to the latest version of packages found
    in the distribution currently installed.  To update your distribution,
    you should regularly run @command{guix pull} (@pxref{Invoking guix
    pull}).
    
    
    @item --do-not-upgrade[=@var{regexp} @dots{}]
    When used together with the @code{--upgrade} option, do @emph{not}
    upgrade any packages whose name matches a @var{regexp}.  For example, to
    upgrade all packages in the current profile except those containing the
    substring ``emacs'':
    
    @example
    $ guix package --upgrade . --do-not-upgrade emacs
    @end example
    
    
    @item @anchor{profile-manifest}--manifest=@var{file}
    
    @itemx -m @var{file}
    
    @cindex profile declaration
    @cindex profile manifest
    Create a new generation of the profile from the manifest object
    
    returned by the Scheme code in @var{file}.
    
    
    This allows you to @emph{declare} the profile's contents rather than
    constructing it through a sequence of @code{--install} and similar
    commands.  The advantage is that @var{file} can be put under version
    control, copied to different machines to reproduce the same profile, and
    so on.
    
    @c FIXME: Add reference to (guix profile) documentation when available.
    @var{file} must return a @dfn{manifest} object, which is roughly a list
    of packages:
    
    @findex packages->manifest
    
    (use-package-modules guile emacs)
    
    
    (packages->manifest
    
     (list emacs
           guile-2.0
    
           ;; Use a specific package output.
    
           (list guile-2.0 "debug")))
    
    @item --roll-back
    Roll back to the previous @dfn{generation} of the profile---i.e., undo
    the last transaction.
    
    When combined with options such as @code{--install}, roll back occurs
    before any other actions.
    
    
    When rolling back from the first generation that actually contains
    
    installed packages, the profile is made to point to the @dfn{zeroth
    
    Andreas Enge's avatar
    Andreas Enge committed
    generation}, which contains no files apart from its own metadata.
    
    Andreas Enge's avatar
    Andreas Enge committed
    After having rolled back, installing, removing, or upgrading packages
    overwrites previous future generations.  Thus, the history of the
    generations in a profile is always linear.
    
    @item --switch-generation=@var{pattern}
    @itemx -S @var{pattern}
    Switch to a particular generation defined by @var{pattern}.
    
    @var{pattern} may be either a generation number or a number prefixed
    with ``+'' or ``-''.  The latter means: move forward/backward by a
    specified number of generations.  For example, if you want to return to
    the latest generation after @code{--roll-back}, use
    @code{--switch-generation=+1}.
    
    The difference between @code{--roll-back} and
    @code{--switch-generation=-1} is that @code{--switch-generation} will
    not make a zeroth generation, so if a specified generation does not
    exist, the current generation will not be changed.
    
    
    @item --search-paths[=@var{kind}]
    
    @cindex search paths
    Report environment variable definitions, in Bash syntax, that may be
    needed in order to use the set of installed packages.  These environment
    variables are used to specify @dfn{search paths} for files used by some
    of the installed packages.
    
    For example, GCC needs the @code{CPATH} and @code{LIBRARY_PATH}
    environment variables to be defined so it can look for headers and
    libraries in the user's profile (@pxref{Environment Variables,,, gcc,
    Using the GNU Compiler Collection (GCC)}).  If GCC and, say, the C
    library are installed in the profile, then @code{--search-paths} will
    suggest setting these variables to @code{@var{profile}/include} and
    @code{@var{profile}/lib}, respectively.
    
    
    The typical use case is to define these environment variables in the
    shell:
    
    @example
    $ eval `guix package --search-paths`
    @end example
    
    @var{kind} may be one of @code{exact}, @code{prefix}, or @code{suffix},
    meaning that the returned environment variable definitions will either
    be exact settings, or prefixes or suffixes of the current value of these
    variables.  When omitted, @var{kind} defaults to @code{exact}.
    
    
    This option can also be used to compute the @emph{combined} search paths
    of several profiles.  Consider this example:
    
    @example
    $ guix package -p foo -i guile
    $ guix package -p bar -i guile-json
    $ guix package -p foo -p bar --search-paths
    @end example
    
    The last command above reports about the @code{GUILE_LOAD_PATH}
    variable, even though, taken individually, neither @file{foo} nor
    @file{bar} would lead to that recommendation.
    
    
    
    @item --profile=@var{profile}
    @itemx -p @var{profile}
    Use @var{profile} instead of the user's default profile.
    
    
    Andreas Enge's avatar
    Andreas Enge committed
    Produce verbose output.  In particular, emit the build log of the
    environment on the standard error port.
    
    @item --bootstrap
    Use the bootstrap Guile to build the profile.  This option is only
    useful to distribution developers.
    
    @end table
    
    
    Andreas Enge's avatar
    Andreas Enge committed
    In addition to these actions, @command{guix package} supports the
    
    following options to query the current state of a profile, or the
    availability of packages:
    
    @item --search=@var{regexp}
    @itemx -s @var{regexp}
    
    @cindex searching for packages
    
    List the available packages whose name, synopsis, or description matches
    
    Andreas Enge's avatar
    Andreas Enge committed
    @var{regexp}.  Print all the metadata of matching packages in
    
    @code{recutils} format (@pxref{Top, GNU recutils databases,, recutils,
    GNU recutils manual}).
    
    This allows specific fields to be extracted using the @command{recsel}
    command, for instance:
    
    @example
    
    $ guix package -s malloc | recsel -p name,version
    
    name: glibc
    version: 2.17
    
    name: libgc
    version: 7.2alpha6
    @end example
    
    Similarly, to show the name of all the packages available under the
    terms of the GNU@tie{}LGPL version 3:
    
    @example
    $ guix package -s "" | recsel -p name -e 'license ~ "LGPL 3"'
    name: elfutils
    
    name: gmp
    @dots{}
    @end example
    
    
    It is also possible to refine search results using several @code{-s}
    flags.  For example, the following command returns a list of board
    games:
    
    @example
    $ guix package -s '\<board\>' -s game | recsel -p name
    name: gnubg
    @dots{}
    @end example
    
    If we were to omit @code{-s game}, we would also get software packages
    that deal with printed circuit boards; removing the angle brackets
    around @code{board} would further add packages that have to do with
    keyboards.
    
    
    And now for a more elaborate example.  The following command searches
    for cryptographic libraries, filters out Haskell, Perl, Python, and Ruby
    libraries, and prints the name and synopsis of the matching packages:
    
    @example
    $ guix package -s crypto -s library | \
        recsel -e '! (name ~ "^(ghc|perl|python|ruby)")' -p name,synopsis
    @end example
    
    @noindent
    @xref{Selection Expressions,,, recutils, GNU recutils manual}, for more
    information on @dfn{selection expressions} for @code{recsel -e}.
    
    
    @item --show=@var{package}
    Show details about @var{package}, taken from the list of available packages, in
    @code{recutils} format (@pxref{Top, GNU recutils databases,, recutils, GNU
    recutils manual}).
    
    @example
    $ guix package --show=python | recsel -p name,version
    name: python
    version: 2.7.6
    
    name: python
    version: 3.3.5
    @end example
    
    You may also specify the full name of a package to only get details about a
    specific version of it:
    @example
    $ guix package --show=python-3.3.5 | recsel -p name,version
    name: python
    version: 3.3.5
    @end example
    
    
    
    
    @item --list-installed[=@var{regexp}]
    @itemx -I [@var{regexp}]
    
    List the currently installed packages in the specified profile, with the
    most recently installed packages shown last.  When @var{regexp} is
    specified, list only installed packages whose name matches @var{regexp}.
    
    
    For each installed package, print the following items, separated by
    tabs: the package name, its version string, the part of the package that
    is installed (for instance, @code{out} for the default output,
    @code{include} for its headers, etc.), and the path of this package in
    the store.
    
    
    @item --list-available[=@var{regexp}]
    @itemx -A [@var{regexp}]
    
    List packages currently available in the distribution for this system
    
    (@pxref{GNU Distribution}).  When @var{regexp} is specified, list only
    installed packages whose name matches @var{regexp}.
    
    
    For each package, print the following items separated by tabs: its name,
    
    its version string, the parts of the package (@pxref{Packages with
    Multiple Outputs}), and the source location of its definition.
    
    @item --list-generations[=@var{pattern}]
    @itemx -l [@var{pattern}]
    Return a list of generations along with their creation dates; for each
    generation, show the installed packages, with the most recently
    
    installed packages shown last.  Note that the zeroth generation is never
    shown.
    
    
    For each installed package, print the following items, separated by
    tabs: the name of a package, its version string, the part of the package
    that is installed (@pxref{Packages with Multiple Outputs}), and the
    location of this package in the store.
    
    When @var{pattern} is used, the command returns only matching
    generations.  Valid patterns include:
    
    @itemize
    @item @emph{Integers and comma-separated integers}.  Both patterns denote
    generation numbers.  For instance, @code{--list-generations=1} returns
    the first one.
    
    And @code{--list-generations=1,8,2} outputs three generations in the
    specified order.  Neither spaces nor trailing commas are allowed.
    
    @item @emph{Ranges}.  @code{--list-generations=2..9} prints the
    specified generations and everything in between.  Note that the start of
    
    Andreas Enge's avatar
    Andreas Enge committed
    a range must be smaller than its end.
    
    
    It is also possible to omit the endpoint.  For example,
    @code{--list-generations=2..}, returns all generations starting from the
    second one.
    
    @item @emph{Durations}.  You can also get the last @emph{N}@tie{}days, weeks,
    or months by passing an integer along with the first letter of the
    
    duration.  For example, @code{--list-generations=20d} lists generations
    that are up to 20 days old.
    
    @item --delete-generations[=@var{pattern}]
    @itemx -d [@var{pattern}]
    
    When @var{pattern} is omitted, delete all generations except the current
    one.
    
    
    This command accepts the same patterns as @option{--list-generations}.
    
    When @var{pattern} is specified, delete the matching generations.  When
    @var{pattern} specifies a duration, generations @emph{older} than the
    specified duration match.  For instance, @code{--delete-generations=1m}
    deletes generations that are more than one month old.
    
    
    If the current generation matches, it is @emph{not} deleted.  Also, the
    zeroth generation is never deleted.
    
    Andreas Enge's avatar
    Andreas Enge committed
    Note that deleting generations prevents rolling back to them.
    
    Consequently, this command must be used with care.
    
    
    Finally, since @command{guix package} may actually start build
    
    processes, it supports all the common build options (@pxref{Common Build
    
    Andreas Enge's avatar
    Andreas Enge committed
    Options}).  It also supports package transformation options, such as
    
    @option{--with-source} (@pxref{Package Transformation Options}).
    However, note that package transformations are lost when upgrading; to
    
    Andreas Enge's avatar
    Andreas Enge committed
    preserve transformations across upgrades, you should define your own
    
    package variant in a Guile module and add it to @code{GUIX_PACKAGE_PATH}
    (@pxref{Defining Packages}).
    
    
    @node Substitutes
    @section Substitutes
    
    @cindex substitutes
    @cindex pre-built binaries
    Guix supports transparent source/binary deployment, which means that it
    can either build things locally, or download pre-built items from a
    server.  We call these pre-built items @dfn{substitutes}---they are
    substitutes for local build results.  In many cases, downloading a
    substitute is much faster than building things locally.
    
    Substitutes can be anything resulting from a derivation build
    (@pxref{Derivations}).  Of course, in the common case, they are
    pre-built package binaries, but source tarballs, for instance, which
    also result from derivation builds, can be available as substitutes.
    
    The @code{hydra.gnu.org} server is a front-end to a build farm that
    builds packages from the GNU distribution continuously for some
    
    Alex Kost's avatar
    Alex Kost committed
    architectures, and makes them available as substitutes (@pxref{Emacs
    Hydra}, for information on how to query the continuous integration
    server).  This is the
    
    default source of substitutes; it can be overridden by passing the
    @option{--substitute-urls} option either to @command{guix-daemon}
    (@pxref{daemon-substitute-urls,, @code{guix-daemon --substitute-urls}})
    or to client tools such as @command{guix package}
    (@pxref{client-substitute-urls,, client @option{--substitute-urls}
    option}).
    
    Substitute URLs can be either HTTP or HTTPS@footnote{For HTTPS access,
    the Guile bindings of GnuTLS must be installed.  @xref{Requirements}.}
    HTTPS is recommended because communications are encrypted; conversely,
    using HTTP makes all communications visible to an eavesdropper, who
    could use the information gathered to determine, for instance, whether
    your system has unpatched security vulnerabilities.
    
    
    @cindex security
    @cindex digital signatures
    
    To allow Guix to download substitutes from @code{hydra.gnu.org} or a
    mirror thereof, you
    
    must add its public key to the access control list (ACL) of archive
    imports, using the @command{guix archive} command (@pxref{Invoking guix
    archive}).  Doing so implies that you trust @code{hydra.gnu.org} to not
    be compromised and to serve genuine substitutes.
    
    This public key is installed along with Guix, in
    @code{@var{prefix}/share/guix/hydra.gnu.org.pub}, where @var{prefix} is
    the installation prefix of Guix.  If you installed Guix from source,
    make sure you checked the GPG signature of
    @file{guix-@value{VERSION}.tar.gz}, which contains this public key file.
    Then, you can run something like this:
    
    @example
    # guix archive --authorize < hydra.gnu.org.pub
    @end example
    
    Once this is in place, the output of a command like @code{guix build}
    should change from something like:
    
    @example
    $ guix build emacs --dry-run
    The following derivations would be built:
       /gnu/store/yr7bnx8xwcayd6j95r2clmkdl1qh688w-emacs-24.3.drv
       /gnu/store/x8qsh1hlhgjx6cwsjyvybnfv2i37z23w-dbus-1.6.4.tar.gz.drv
       /gnu/store/1ixwp12fl950d15h2cj11c73733jay0z-alsa-lib-1.0.27.1.tar.bz2.drv
       /gnu/store/nlma1pw0p603fpfiqy7kn4zm105r5dmw-util-linux-2.21.drv
    @dots{}
    @end example
    
    @noindent
    to something like:
    
    @example
    $ guix build emacs --dry-run
    The following files would be downloaded:
       /gnu/store/pk3n22lbq6ydamyymqkkz7i69wiwjiwi-emacs-24.3
       /gnu/store/2ygn4ncnhrpr61rssa6z0d9x22si0va3-libjpeg-8d
       /gnu/store/71yz6lgx4dazma9dwn2mcjxaah9w77jq-cairo-1.12.16
       /gnu/store/7zdhgp0n1518lvfn8mb96sxqfmvqrl7v-libxrender-0.9.7
    @dots{}
    @end example
    
    @noindent
    This indicates that substitutes from @code{hydra.gnu.org} are usable and
    will be downloaded, when possible, for future builds.
    
    Guix ignores substitutes that are not signed, or that are not signed by
    
    Alex Sassmannshausen's avatar
    Alex Sassmannshausen committed
    one of the keys listed in the ACL.  It also detects and raises an error
    
    when attempting to use a substitute that has been tampered with.
    
    
    @vindex http_proxy
    
    Substitutes are downloaded over HTTP or HTTPS.
    The @code{http_proxy} environment
    
    variable can be set in the environment of @command{guix-daemon} and is
    honored for downloads of substitutes.  Note that the value of
    @code{http_proxy} in the environment where @command{guix build},
    @command{guix package}, and other client commands are run has
    @emph{absolutely no effect}.
    
    
    When using HTTPS, the server's X.509 certificate is @emph{not} validated
    (in other words, the server is not authenticated), contrary to what
    HTTPS clients such as Web browsers usually do.  This is because Guix
    authenticates substitute information itself, as explained above, which
    is what we care about (whereas X.509 certificates are about
    authenticating bindings between domain names and public keys.)
    
    
    The substitute mechanism can be disabled globally by running
    @code{guix-daemon} with @code{--no-substitutes} (@pxref{Invoking
    guix-daemon}).  It can also be disabled temporarily by passing the
    @code{--no-substitutes} option to @command{guix package}, @command{guix
    build}, and other command-line tools.
    
    
    
    @unnumberedsubsec On Trusting Binaries
    
    
    Today, each individual's control over their own computing is at the
    mercy of institutions, corporations, and groups with enough power and
    determination to subvert the computing infrastructure and exploit its
    weaknesses.  While using @code{hydra.gnu.org} substitutes can be
    convenient, we encourage users to also build on their own, or even run
    their own build farm, such that @code{hydra.gnu.org} is less of an
    
    interesting target.  One way to help is by publishing the software you
    build using @command{guix publish} so that others have one more choice
    of server to download substitutes from (@pxref{Invoking guix publish}).
    
    
    Guix has the foundations to maximize build reproducibility
    (@pxref{Features}).  In most cases, independent builds of a given
    package or derivation should yield bit-identical results.  Thus, through
    a diverse set of independent package builds, we can strengthen the
    
    Ludovic Courtès's avatar
    Ludovic Courtès committed
    integrity of our systems.  The @command{guix challenge} command aims to
    help users assess substitute servers, and to assist developers in
    finding out about non-deterministic package builds (@pxref{Invoking guix
    
    challenge}).  Similarly, the @option{--check} option of @command{guix
    build} allows users to check whether previously-installed substitutes
    are genuine by rebuilding them locally (@pxref{build-check,
    @command{guix build --check}}).
    
    
    In the future, we want Guix to have support to publish and retrieve
    binaries to/from other users, in a peer-to-peer fashion.  If you would
    like to discuss this project, join us on @email{guix-devel@@gnu.org}.
    
    
    
    @node Packages with Multiple Outputs
    @section Packages with Multiple Outputs
    
    @cindex multiple-output packages
    @cindex package outputs
    
    Often, packages defined in Guix have a single @dfn{output}---i.e., the
    
    Andreas Enge's avatar
    Andreas Enge committed
    source package leads to exactly one directory in the store.  When running
    
    @command{guix package -i glibc}, one installs the default output of the
    GNU libc package; the default output is called @code{out}, but its name
    can be omitted as shown in this command.  In this particular case, the
    default output of @code{glibc} contains all the C header files, shared
    libraries, static libraries, Info documentation, and other supporting
    files.
    
    Sometimes it is more appropriate to separate the various types of files
    produced from a single source package into separate outputs.  For
    instance, the GLib C library (used by GTK+ and related packages)
    installs more than 20 MiB of reference documentation as HTML pages.
    To save space for users who do not need it, the documentation goes to a
    separate output, called @code{doc}.  To install the main GLib output,
    which contains everything but the documentation, one would run:
    
    @example
    guix package -i glib
    @end example
    
    The command to install its documentation is:
    
    @example
    guix package -i glib:doc
    @end example
    
    Some packages install programs with different ``dependency footprints''.
    
    Andreas Enge's avatar
    Andreas Enge committed
    For instance, the WordNet package installs both command-line tools and
    
    graphical user interfaces (GUIs).  The former depend solely on the C
    library, whereas the latter depend on Tcl/Tk and the underlying X
    libraries.  In this case, we leave the command-line tools in the default
    output, whereas the GUIs are in a separate output.  This allows users
    
    Ludovic Courtès's avatar
    Ludovic Courtès committed
    who do not need the GUIs to save space.  The @command{guix size} command
    can help find out about such situations (@pxref{Invoking guix size}).
    
    Ludovic Courtès's avatar
    Ludovic Courtès committed
    @command{guix graph} can also be helpful (@pxref{Invoking guix graph}).
    
    
    There are several such multiple-output packages in the GNU distribution.
    
    Other conventional output names include @code{lib} for libraries and
    possibly header files, @code{bin} for stand-alone programs, and
    @code{debug} for debugging information (@pxref{Installing Debugging
    Files}).  The outputs of a packages are listed in the third column of
    the output of @command{guix package --list-available} (@pxref{Invoking
    guix package}).
    
    @node Invoking guix gc
    @section Invoking @command{guix gc}
    
    Ludovic Courtès's avatar
    Ludovic Courtès committed
    
    @cindex garbage collector
    
    Andreas Enge's avatar
    Andreas Enge committed
    Packages that are installed, but not used, may be @dfn{garbage-collected}.
    
    The @command{guix gc} command allows users to explicitly run the garbage
    
    collector to reclaim space from the @file{/gnu/store} directory.  It is
    the @emph{only} way to remove files from @file{/gnu/store}---removing
    files or directories manually may break it beyond repair!
    
    Ludovic Courtès's avatar
    Ludovic Courtès committed
    
    The garbage collector has a set of known @dfn{roots}: any file under
    
    @file{/gnu/store} reachable from a root is considered @dfn{live} and
    
    Ludovic Courtès's avatar
    Ludovic Courtès committed
    cannot be deleted; any other file is considered @dfn{dead} and may be
    deleted.  The set of garbage collector roots includes default user
    
    profiles, and may be augmented with @command{guix build --root}, for
    example (@pxref{Invoking guix build}).
    
    Ludovic Courtès's avatar
    Ludovic Courtès committed
    
    
    Prior to running @code{guix gc --collect-garbage} to make space, it is
    often useful to remove old generations from user profiles; that way, old
    package builds referenced by those generations can be reclaimed.  This
    is achieved by running @code{guix package --delete-generations}
    (@pxref{Invoking guix package}).
    
    
    The @command{guix gc} command has three modes of operation: it can be
    
    Ludovic Courtès's avatar
    Ludovic Courtès committed
    used to garbage-collect any dead files (the default), to delete specific
    
    files (the @code{--delete} option), to print garbage-collector
    information, or for more advanced queries.  The garbage collection
    options are as follows:
    
    Ludovic Courtès's avatar
    Ludovic Courtès committed
    
    @table @code
    @item --collect-garbage[=@var{min}]
    @itemx -C [@var{min}]
    
    Collect garbage---i.e., unreachable @file{/gnu/store} files and
    
    Ludovic Courtès's avatar
    Ludovic Courtès committed
    sub-directories.  This is the default operation when no option is
    specified.
    
    When @var{min} is given, stop once @var{min} bytes have been collected.
    @var{min} may be a number of bytes, or it may include a unit as a
    
    suffix, such as @code{MiB} for mebibytes and @code{GB} for gigabytes
    (@pxref{Block size, size specifications,, coreutils, GNU Coreutils}).
    
    Ludovic Courtès's avatar
    Ludovic Courtès committed
    
    When @var{min} is omitted, collect all the garbage.
    
    @item --delete
    @itemx -d
    Attempt to delete all the store files and directories specified as
    arguments.  This fails if some of the files are not in the store, or if
    they are still live.
    
    
    @item --list-failures
    List store items corresponding to cached build failures.
    
    This prints nothing unless the daemon was started with
    @option{--cache-failures} (@pxref{Invoking guix-daemon,
    @option{--cache-failures}}).
    
    @item --clear-failures
    Remove the specified store items from the failed-build cache.
    
    Again, this option only makes sense when the daemon is started with
    @option{--cache-failures}.  Otherwise, it does nothing.
    
    
    Ludovic Courtès's avatar
    Ludovic Courtès committed
    @item --list-dead
    Show the list of dead files and directories still present in the
    store---i.e., files and directories no longer reachable from any root.
    
    @item --list-live
    Show the list of live store files and directories.
    
    
    @end table
    
    In addition, the references among existing store files can be queried: