Skip to content
Snippets Groups Projects
guix.texi 273 KiB
Newer Older
  • Learn to ignore specific revisions
  • is true, its contents are added, and its permission bits are kept.
    
    The example below adds a file to the store, under two different names:
    
    @example
    (run-with-store (open-connection)
      (mlet %store-monad ((a (interned-file "README"))
                          (b (interned-file "README" "LEGU-MIN")))
        (return (list a b))))
    
    @result{} ("/gnu/store/rwm@dots{}-README" "/gnu/store/44i@dots{}-LEGU-MIN")
    @end example
    
    @end deffn
    
    
    The @code{(guix packages)} module exports the following package-related
    monadic procedures:
    
    
    Ludovic Courtès's avatar
    Ludovic Courtès committed
    @deffn {Monadic Procedure} package-file @var{package} [@var{file}] @
    
           [#:system (%current-system)] [#:target #f] @
           [#:output "out"] Return as a monadic
    
    Ludovic Courtès's avatar
    Ludovic Courtès committed
    value in the absolute file name of @var{file} within the @var{output}
    directory of @var{package}.  When @var{file} is omitted, return the name
    
    of the @var{output} directory of @var{package}.  When @var{target} is
    true, use it as a cross-compilation target triplet.
    
    Ludovic Courtès's avatar
    Ludovic Courtès committed
    @end deffn
    
    @deffn {Monadic Procedure} package->derivation @var{package} [@var{system}]
    
    @deffnx {Monadic Procedure} package->cross-derivation @var{package} @
              @var{target} [@var{system}]
    Monadic version of @code{package-derivation} and
    @code{package-cross-derivation} (@pxref{Defining Packages}).
    
    Ludovic Courtès's avatar
    Ludovic Courtès committed
    @node G-Expressions
    @section G-Expressions
    
    @cindex G-expression
    @cindex build code quoting
    So we have ``derivations'', which represent a sequence of build actions
    to be performed to produce an item in the store (@pxref{Derivations}).
    Those build actions are performed when asking the daemon to actually
    build the derivations; they are run by the daemon in a container
    (@pxref{Invoking guix-daemon}).
    
    @cindex strata of code
    It should come as no surprise that we like to write those build actions
    in Scheme.  When we do that, we end up with two @dfn{strata} of Scheme
    code@footnote{The term @dfn{stratum} in this context was coined by
    
    Manuel Serrano et al.@: in the context of their work on Hop.  Oleg
    Kiselyov, who has written insightful
    @url{http://okmij.org/ftp/meta-programming/#meta-scheme, essays and code
    on this topic}, refers to this kind of code generation as
    @dfn{staging}.}: the ``host code''---code that defines packages, talks
    to the daemon, etc.---and the ``build code''---code that actually
    performs build actions, such as making directories, invoking
    @command{make}, etc.
    
    Ludovic Courtès's avatar
    Ludovic Courtès committed
    
    To describe a derivation and its build actions, one typically needs to
    embed build code inside host code.  It boils down to manipulating build
    code as data, and Scheme's homoiconicity---code has a direct
    representation as data---comes in handy for that.  But we need more than
    Scheme's normal @code{quasiquote} mechanism to construct build
    expressions.
    
    The @code{(guix gexp)} module implements @dfn{G-expressions}, a form of
    S-expressions adapted to build expressions.  G-expressions, or
    @dfn{gexps}, consist essentially in three syntactic forms: @code{gexp},
    @code{ungexp}, and @code{ungexp-splicing} (or simply: @code{#~},
    @code{#$}, and @code{#$@@}), which are comparable respectively to
    @code{quasiquote}, @code{unquote}, and @code{unquote-splicing}
    (@pxref{Expression Syntax, @code{quasiquote},, guile, GNU Guile
    Reference Manual}).  However, there are major differences:
    
    @itemize
    @item
    Gexps are meant to be written to a file and run or manipulated by other
    processes.
    
    @item
    
    When a high-level object such as a package or derivation is unquoted
    inside a gexp, the result is as if its output file name had been
    introduced.
    
    Ludovic Courtès's avatar
    Ludovic Courtès committed
    @item
    Gexps carry information about the packages or derivations they refer to,
    and these dependencies are automatically added as inputs to the build
    processes that use them.
    @end itemize
    
    
    This mechanism is not limited to package and derivation
    objects: @dfn{compilers} able to ``lower'' other high-level objects to
    
    derivations can be defined, such that these objects can also be inserted
    
    into gexps.  For example, a useful type of high-level object that can be
    inserted in a gexp is ``file-like objects'', which make it easy to
    add files to the store and refer to them in
    
    derivations and such (see @code{local-file} and @code{plain-file}
    below.)
    
    Ludovic Courtès's avatar
    Ludovic Courtès committed
    To illustrate the idea, here is an example of a gexp:
    
    @example
    (define build-exp
      #~(begin
          (mkdir #$output)
          (chdir #$output)
    
          (symlink (string-append #$coreutils "/bin/ls")
    
    Ludovic Courtès's avatar
    Ludovic Courtès committed
                   "list-files")))
    @end example
    
    This gexp can be passed to @code{gexp->derivation}; we obtain a
    derivation that builds a directory containing exactly one symlink to
    @file{/gnu/store/@dots{}-coreutils-8.22/bin/ls}:
    
    @example
    (gexp->derivation "the-thing" build-exp)
    @end example
    
    
    As one would expect, the @code{"/gnu/store/@dots{}-coreutils-8.22"} string is
    
    Ludovic Courtès's avatar
    Ludovic Courtès committed
    substituted to the reference to the @var{coreutils} package in the
    actual build code, and @var{coreutils} is automatically made an input to
    the derivation.  Likewise, @code{#$output} (equivalent to @code{(ungexp
    output)}) is replaced by a string containing the derivation's output
    
    directory name.
    
    @cindex cross compilation
    In a cross-compilation context, it is useful to distinguish between
    references to the @emph{native} build of a package---that can run on the
    host---versus references to cross builds of a package.  To that end, the
    @code{#+} plays the same role as @code{#$}, but is a reference to a
    native package build:
    
    @example
    (gexp->derivation "vi"
       #~(begin
           (mkdir #$output)
           (system* (string-append #+coreutils "/bin/ln")
                    "-s"
                    (string-append #$emacs "/bin/emacs")
                    (string-append #$output "/bin/vi")))
       #:target "mips64el-linux")
    @end example
    
    @noindent
    In the example above, the native build of @var{coreutils} is used, so
    that @command{ln} can actually run on the host; but then the
    cross-compiled build of @var{emacs} is referenced.
    
    The syntactic form to construct gexps is summarized below.
    
    Ludovic Courtès's avatar
    Ludovic Courtès committed
    
    @deffn {Scheme Syntax} #~@var{exp}
    @deffnx {Scheme Syntax} (gexp @var{exp})
    Return a G-expression containing @var{exp}.  @var{exp} may contain one
    or more of the following forms:
    
    @table @code
    @item #$@var{obj}
    @itemx (ungexp @var{obj})
    
    Introduce a reference to @var{obj}.  @var{obj} may have one of the
    supported types, for example a package or a
    
    Ludovic Courtès's avatar
    Ludovic Courtès committed
    derivation, in which case the @code{ungexp} form is replaced by its
    output file name---e.g., @code{"/gnu/store/@dots{}-coreutils-8.22}.
    
    
    If @var{obj} is a list, it is traversed and references to supported
    objects are substituted similarly.
    
    Ludovic Courtès's avatar
    Ludovic Courtès committed
    
    If @var{obj} is another gexp, its contents are inserted and its
    dependencies are added to those of the containing gexp.
    
    If @var{obj} is another kind of object, it is inserted as is.
    
    
    @item #$@var{obj}:@var{output}
    @itemx (ungexp @var{obj} @var{output})
    
    Ludovic Courtès's avatar
    Ludovic Courtès committed
    This is like the form above, but referring explicitly to the
    
    @var{output} of @var{obj}---this is useful when @var{obj} produces
    multiple outputs (@pxref{Packages with Multiple Outputs}).
    
    @item #+@var{obj}
    @itemx #+@var{obj}:output
    @itemx (ungexp-native @var{obj})
    @itemx (ungexp-native @var{obj} @var{output})
    Same as @code{ungexp}, but produces a reference to the @emph{native}
    build of @var{obj} when used in a cross compilation context.
    
    
    Ludovic Courtès's avatar
    Ludovic Courtès committed
    @item #$output[:@var{output}]
    @itemx (ungexp output [@var{output}])
    Insert a reference to derivation output @var{output}, or to the main
    output when @var{output} is omitted.
    
    This only makes sense for gexps passed to @code{gexp->derivation}.
    
    @item #$@@@var{lst}
    @itemx (ungexp-splicing @var{lst})
    Like the above, but splices the contents of @var{lst} inside the
    containing list.
    
    
    @item #+@@@var{lst}
    @itemx (ungexp-native-splicing @var{lst})
    Like the above, but refers to native builds of the objects listed in
    @var{lst}.
    
    
    Ludovic Courtès's avatar
    Ludovic Courtès committed
    @end table
    
    G-expressions created by @code{gexp} or @code{#~} are run-time objects
    of the @code{gexp?} type (see below.)
    @end deffn
    
    @deffn {Scheme Procedure} gexp? @var{obj}
    Return @code{#t} if @var{obj} is a G-expression.
    @end deffn
    
    G-expressions are meant to be written to disk, either as code building
    some derivation, or as plain files in the store.  The monadic procedures
    below allow you to do that (@pxref{The Store Monad}, for more
    information about monads.)
    
    @deffn {Monadic Procedure} gexp->derivation @var{name} @var{exp} @
    
           [#:system (%current-system)] [#:target #f] [#:graft? #t] @
    
    Ludovic Courtès's avatar
    Ludovic Courtès committed
           [#:hash #f] [#:hash-algo #f] @
           [#:recursive? #f] [#:env-vars '()] [#:modules '()] @
    
           [#:module-path @var{%load-path}] @
    
           [#:references-graphs #f] [#:allowed-references #f] @
    
           [#:leaked-env-vars #f] @
    
           [#:local-build? #f] [#:substitutable? #t] [#:guile-for-build #f]
    
    Ludovic Courtès's avatar
    Ludovic Courtès committed
    Return a derivation @var{name} that runs @var{exp} (a gexp) with
    
    @var{guile-for-build} (a derivation) on @var{system}.  When @var{target}
    is true, it is used as the cross-compilation target triplet for packages
    referred to by @var{exp}.
    
    Make @var{modules} available in the evaluation context of @var{exp};
    @var{modules} is a list of names of Guile modules searched in
    @var{module-path} to be copied in the store, compiled, and made available in
    
    Ludovic Courtès's avatar
    Ludovic Courtès committed
    the load path during the execution of @var{exp}---e.g., @code{((guix
    build utils) (guix build gnu-build-system))}.
    
    
    @var{graft?} determines whether packages referred to by @var{exp} should be grafted when
    applicable.
    
    
    When @var{references-graphs} is true, it must be a list of tuples of one of the
    following forms:
    
    @example
    (@var{file-name} @var{package})
    (@var{file-name} @var{package} @var{output})
    (@var{file-name} @var{derivation})
    (@var{file-name} @var{derivation} @var{output})
    (@var{file-name} @var{store-item})
    @end example
    
    The right-hand-side of each element of @var{references-graphs} is automatically made
    an input of the build process of @var{exp}.  In the build environment, each
    @var{file-name} contains the reference graph of the corresponding item, in a simple
    text format.
    
    
    @var{allowed-references} must be either @code{#f} or a list of output names and packages.
    In the latter case, the list denotes store items that the result is allowed to
    refer to.  Any reference to another store item will lead to a build error.
    
    
    The other arguments are as for @code{derivation} (@pxref{Derivations}).
    
    Ludovic Courtès's avatar
    Ludovic Courtès committed
    @end deffn
    
    
    @cindex file-like objects
    The @code{local-file} and @code{plain-file} procedures below return
    @dfn{file-like objects}.  That is, when unquoted in a G-expression,
    these objects lead to a file in the store.  Consider this G-expression:
    
    @example
    #~(system* (string-append #$glibc "/sbin/nscd") "-f"
               #$(local-file "/tmp/my-nscd.conf"))
    @end example
    
    The effect here is to ``intern'' @file{/tmp/my-nscd.conf} by copying it
    to the store.  Once expanded, for instance @i{via}
    @code{gexp->derivation}, the G-expression refers to that copy under
    @file{/gnu/store}; thus, modifying or removing the file in @file{/tmp}
    does not have any effect on what the G-expression does.
    @code{plain-file} can be used similarly; it differs in that the file
    content is directly passed as a string.
    
    
    @deffn {Scheme Procedure} local-file @var{file} [@var{name}] @
       [#:recursive? #t]
    Return an object representing local file @var{file} to add to the store; this
    object can be used in a gexp.  @var{file} will be added to the store under @var{name}--by
    default the base name of @var{file}.
    
    When @var{recursive?} is true, the contents of @var{file} are added recursively; if @var{file}
    designates a flat file and @var{recursive?} is true, its contents are added, and its
    permission bits are kept.
    
    This is the declarative counterpart of the @code{interned-file} monadic
    procedure (@pxref{The Store Monad, @code{interned-file}}).
    @end deffn
    
    
    @deffn {Scheme Procedure} plain-file @var{name} @var{content}
    Return an object representing a text file called @var{name} with the given
    @var{content} (a string) to be added to the store.
    
    This is the declarative counterpart of @code{text-file}.
    @end deffn
    
    
    Ludovic Courtès's avatar
    Ludovic Courtès committed
    @deffn {Monadic Procedure} gexp->script @var{name} @var{exp}
    Return an executable script @var{name} that runs @var{exp} using
    @var{guile} with @var{modules} in its search path.
    
    The example below builds a script that simply invokes the @command{ls}
    command:
    
    @example
    (use-modules (guix gexp) (gnu packages base))
    
    (gexp->script "list-files"
                  #~(execl (string-append #$coreutils "/bin/ls")
                           "ls"))
    @end example
    
    When ``running'' it through the store (@pxref{The Store Monad,
    
    @code{run-with-store}}), we obtain a derivation that produces an
    
    Ludovic Courtès's avatar
    Ludovic Courtès committed
    executable file @file{/gnu/store/@dots{}-list-files} along these lines:
    
    @example
    #!/gnu/store/@dots{}-guile-2.0.11/bin/guile -ds
    !#
    (execl (string-append "/gnu/store/@dots{}-coreutils-8.22"/bin/ls")
           "ls")
    @end example
    @end deffn
    
    @deffn {Monadic Procedure} gexp->file @var{name} @var{exp}
    Return a derivation that builds a file @var{name} containing @var{exp}.
    
    The resulting file holds references to all the dependencies of @var{exp}
    or a subset thereof.
    @end deffn
    
    
    @deffn {Monadic Procedure} text-file* @var{name} @var{text} @dots{}
    Return as a monadic value a derivation that builds a text file
    containing all of @var{text}.  @var{text} may list, in addition to
    
    strings, objects of any type that can be used in a gexp: packages,
    derivations, local file objects, etc.  The resulting store file holds
    references to all these.
    
    
    This variant should be preferred over @code{text-file} anytime the file
    to create will reference items from the store.  This is typically the
    case when building a configuration file that embeds store file names,
    like this:
    
    @example
    (define (profile.sh)
      ;; Return the name of a shell script in the store that
      ;; initializes the 'PATH' environment variable.
      (text-file* "profile.sh"
                  "export PATH=" coreutils "/bin:"
                  grep "/bin:" sed "/bin\n"))
    @end example
    
    In this example, the resulting @file{/gnu/store/@dots{}-profile.sh} file
    will references @var{coreutils}, @var{grep}, and @var{sed}, thereby
    preventing them from being garbage-collected during its lifetime.
    @end deffn
    
    Ludovic Courtès's avatar
    Ludovic Courtès committed
    
    Of course, in addition to gexps embedded in ``host'' code, there are
    also modules containing build tools.  To make it clear that they are
    meant to be used in the build stratum, these modules are kept in the
    @code{(guix build @dots{})} name space.
    
    
    
    @c *********************************************************************
    @node Utilities
    @chapter Utilities
    
    
    This section describes tools primarily targeted at developers and users
    who write new package definitions.  They complement the Scheme
    programming interface of Guix in a convenient way.
    
    
    * Invoking guix build::         Building packages from the command line.
    
    Ludovic Courtès's avatar
    Ludovic Courtès committed
    * Invoking guix edit::          Editing package definitions.
    
    * Invoking guix download::      Downloading a file and printing its hash.
    
    * Invoking guix hash::          Computing the cryptographic hash of a file.
    
    * Invoking guix import::        Importing package definitions.
    
    * Invoking guix refresh::       Updating package definitions.
    
    Cyril Roelandt's avatar
    Cyril Roelandt committed
    * Invoking guix lint::          Finding errors in package definitions.
    
    Ludovic Courtès's avatar
    Ludovic Courtès committed
    * Invoking guix size::          Profiling disk usage.
    
    * Invoking guix environment::   Setting up development environments.
    
    * Invoking guix publish::       Sharing substitutes.
    
    @node Invoking guix build
    @section Invoking @command{guix build}
    
    The @command{guix build} command builds packages or derivations and
    
    their dependencies, and prints the resulting store paths.  Note that it
    does not modify the user's profile---this is the job of the
    
    @command{guix package} command (@pxref{Invoking guix package}).  Thus,
    
    it is mainly useful for distribution developers.
    
    The general syntax is:
    
    guix build @var{options} @var{package-or-derivation}@dots{}
    
    @end example
    
    @var{package-or-derivation} may be either the name of a package found in
    
    the software distribution such as @code{coreutils} or
    @code{coreutils-8.20}, or a derivation such as
    
    @file{/gnu/store/@dots{}-coreutils-8.19.drv}.  In the former case, a
    
    package with the corresponding name (and optionally version) is searched
    for among the GNU distribution modules (@pxref{Package Modules}).
    
    Alternatively, the @code{--expression} option may be used to specify a
    Scheme expression that evaluates to a package; this is useful when
    disambiguation among several same-named packages or package variants is
    needed.
    
    
    The @var{options} may be zero or more of the following:
    
    @table @code
    
    @item --expression=@var{expr}
    @itemx -e @var{expr}
    
    Build the package or derivation @var{expr} evaluates to.
    
    For example, @var{expr} may be @code{(@@ (gnu packages guile)
    
    guile-1.8)}, which unambiguously designates this specific variant of
    version 1.8 of Guile.
    
    
    Alternately, @var{expr} may be a G-expression, in which case it is used
    as a build program passed to @code{gexp->derivation}
    (@pxref{G-Expressions}).
    
    Lastly, @var{expr} may refer to a zero-argument monadic procedure
    
    (@pxref{The Store Monad}).  The procedure must return a derivation as a
    monadic value, which is then passed through @code{run-with-store}.
    
    
    @item --source
    @itemx -S
    Build the packages' source derivations, rather than the packages
    themselves.
    
    
    For instance, @code{guix build -S gcc} returns something like
    
    @file{/gnu/store/@dots{}-gcc-4.7.2.tar.bz2}, which is GCC's source tarball.
    
    The returned source tarball is the result of applying any patches and
    code snippets specified in the package's @code{origin} (@pxref{Defining
    Packages}).
    
    
    @item --sources
    Fetch and return the source of @var{package-or-derivation} and all their
    dependencies, recursively.  This is a handy way to obtain a local copy
    of all the source code needed to build @var{packages}, allowing you to
    eventually build them even without network access.  It is an extension
    of the @code{--source} option and can accept one of the following
    optional argument values:
    
    @table @code
    @item package
    This value causes the @code{--sources} option to behave in the same way
    as the @code{--source} option.
    
    @item all
    Build all packages' source derivations, including any source that might
    be listed as @code{inputs}.  This is the default value.
    
    @example
    $ guix build --sources tzdata
    The following derivations will be built:
       /gnu/store/@dots{}-tzdata2015b.tar.gz.drv
       /gnu/store/@dots{}-tzcode2015b.tar.gz.drv
    @end example
    
    @item transitive
    Build all packages' source derivations, as well as all source
    derivations for packages' transitive inputs.  This can be used e.g. to
    prefetch package source for later offline building.
    
    @example
    $ guix build --sources=transitive tzdata
    The following derivations will be built:
       /gnu/store/@dots{}-tzcode2015b.tar.gz.drv
       /gnu/store/@dots{}-findutils-4.4.2.tar.xz.drv
       /gnu/store/@dots{}-grep-2.21.tar.xz.drv
       /gnu/store/@dots{}-coreutils-8.23.tar.xz.drv
       /gnu/store/@dots{}-make-4.1.tar.xz.drv
       /gnu/store/@dots{}-bash-4.3.tar.xz.drv
    @dots{}
    @end example
    
    @end table
    
    
    @item --system=@var{system}
    @itemx -s @var{system}
    Attempt to build for @var{system}---e.g., @code{i686-linux}---instead of
    the host's system type.
    
    An example use of this is on Linux-based systems, which can emulate
    different personalities.  For instance, passing
    @code{--system=i686-linux} on an @code{x86_64-linux} system allows users
    to build packages in a complete 32-bit environment.
    
    
    @item --target=@var{triplet}
    @cindex cross-compilation
    Cross-build for @var{triplet}, which must be a valid GNU triplet, such
    as @code{"mips64el-linux-gnu"} (@pxref{Configuration Names, GNU
    configuration triplets,, configure, GNU Configure and Build System}).
    
    
    @item --with-source=@var{source}
    Use @var{source} as the source of the corresponding package.
    @var{source} must be a file name or a URL, as for @command{guix
    download} (@pxref{Invoking guix download}).
    
    The ``corresponding package'' is taken to be one specified on the
    command line whose name matches the base of @var{source}---e.g., if
    @var{source} is @code{/src/guile-2.0.10.tar.gz}, the corresponding
    package is @code{guile}.  Likewise, the version string is inferred from
    @var{source}; in the previous example, it's @code{2.0.10}.
    
    This option allows users to try out versions of packages other than the
    one provided by the distribution.  The example below downloads
    @file{ed-1.7.tar.gz} from a GNU mirror and uses that as the source for
    the @code{ed} package:
    
    @example
    guix build ed --with-source=mirror://gnu/ed/ed-1.7.tar.gz
    @end example
    
    As a developer, @code{--with-source} makes it easy to test release
    candidates:
    
    @example
    guix build guile --with-source=../guile-2.0.9.219-e1bb7.tar.xz
    @end example
    
    
    @dots{} or to build from a checkout in a pristine environment:
    
    @example
    $ git clone git://git.sv.gnu.org/guix.git
    $ guix build guix --with-source=./guix
    @end example
    
    
    @item --no-grafts
    Do not ``graft'' packages.  In practice, this means that package updates
    available as grafts are not applied.  @xref{Security Updates}, for more
    information on grafts.
    
    @item --derivations
    @itemx -d
    Return the derivation paths, not the output paths, of the given
    packages.
    
    
    @item --root=@var{file}
    @itemx -r @var{file}
    Make @var{file} a symlink to the result, and register it as a garbage
    collector root.
    
    @item --log-file
    Return the build log file names for the given
    @var{package-or-derivation}s, or raise an error if build logs are
    missing.
    
    This works regardless of how packages or derivations are specified.  For
    instance, the following invocations are equivalent:
    
    @example
    guix build --log-file `guix build -d guile`
    guix build --log-file `guix build guile`
    guix build --log-file guile
    guix build --log-file -e '(@@ (gnu packages guile) guile-2.0)'
    @end example
    
    
    @end table
    
    @cindex common build options
    In addition, a number of options that control the build process are
    common to @command{guix build} and other commands that can spawn builds,
    such as @command{guix package} or @command{guix archive}.  These are the
    following:
    
    @table @code
    
    
    @item --load-path=@var{directory}
    @itemx -L @var{directory}
    Add @var{directory} to the front of the package module search path
    (@pxref{Package Modules}).
    
    This allows users to define their own packages and make them visible to
    the command-line tools.
    
    
    @item --keep-failed
    @itemx -K
    Keep the build tree of failed builds.  Thus, if a build fail, its build
    tree is kept under @file{/tmp}, in a directory whose name is shown at
    the end of the build log.  This is useful when debugging build issues.
    
    @item --dry-run
    @itemx -n
    Do not build the derivations.
    
    
    @item --fallback
    When substituting a pre-built binary fails, fall back to building
    packages locally.
    
    
    @item --substitute-urls=@var{urls}
    @anchor{client-substitute-urls}
    Consider @var{urls} the whitespace-separated list of substitute source
    URLs, overriding the default list of URLs of @command{guix-daemon}
    (@pxref{daemon-substitute-urls,, @command{guix-daemon} URLs}).
    
    This means that substitutes may be downloaded from @var{urls}, provided
    they are signed by a key authorized by the system administrator
    (@pxref{Substitutes}).
    
    
    @item --no-substitutes
    
    Do not use substitutes for build products.  That is, always build things
    
    locally instead of allowing downloads of pre-built binaries
    (@pxref{Substitutes}).
    
    @item --no-build-hook
    
    Do not attempt to offload builds @i{via} the daemon's ``build hook''
    (@pxref{Daemon Offload Setup}).  That is, always build things locally
    instead of offloading builds to remote machines.
    
    @item --max-silent-time=@var{seconds}
    When the build or substitution process remains silent for more than
    @var{seconds}, terminate it and report a build failure.
    
    
    @item --timeout=@var{seconds}
    Likewise, when the build or substitution process lasts for more than
    @var{seconds}, terminate it and report a build failure.
    
    By default there is no timeout.  This behavior can be restored with
    @code{--timeout=0}.
    
    
    @item --verbosity=@var{level}
    Use the given verbosity level.  @var{level} must be an integer between 0
    and 5; higher means more verbose output.  Setting a level of 4 or more
    may be helpful when debugging setup issues with the build daemon.
    
    
    @item --cores=@var{n}
    @itemx -c @var{n}
    Allow the use of up to @var{n} CPU cores for the build.  The special
    value @code{0} means to use as many CPU cores as available.
    
    @item --max-jobs=@var{n}
    @itemx -M @var{n}
    Allow at most @var{n} build jobs in parallel.  @xref{Invoking
    guix-daemon, @code{--max-jobs}}, for details about this option and the
    equivalent @command{guix-daemon} option.
    
    
    Behind the scenes, @command{guix build} is essentially an interface to
    
    the @code{package-derivation} procedure of the @code{(guix packages)}
    module, and to the @code{build-derivations} procedure of the @code{(guix
    
    derivations)} module.
    
    In addition to options explicitly passed on the command line,
    @command{guix build} and other @command{guix} commands that support
    building honor the @code{GUIX_BUILD_OPTIONS} environment variable.
    
    @defvr {Environment Variable} GUIX_BUILD_OPTIONS
    Users can define this variable to a list of command line options that
    will automatically be used by @command{guix build} and other
    @command{guix} commands that can perform builds, as in the example
    below:
    
    @example
    $ export GUIX_BUILD_OPTIONS="--no-substitutes -c 2 -L /foo/bar"
    @end example
    
    
    These options are parsed independently, and the result is appended to
    the parsed command-line options.
    
    Ludovic Courtès's avatar
    Ludovic Courtès committed
    @node Invoking guix edit
    @section Invoking @command{guix edit}
    
    @cindex package definition, editing
    So many packages, so many source files!  The @command{guix edit} command
    facilitates the life of packagers by pointing their editor at the source
    file containing the definition of the specified packages.  For instance:
    
    @example
    guix edit gcc-4.8 vim
    @end example
    
    @noindent
    launches the program specified in the @code{EDITOR} environment variable
    to edit the recipe of GCC@tie{}4.8.4 and that of Vim.
    
    If you are using Emacs, note that the Emacs user interface provides
    
    similar functionality in the ``package info'' and ``package list''
    buffers created by @kbd{M-x guix-search-by-name} and similar commands
    (@pxref{Emacs Commands}).
    
    @node Invoking guix download
    @section Invoking @command{guix download}
    
    When writing a package definition, developers typically need to download
    the package's source tarball, compute its SHA256 hash, and write that
    hash in the package definition (@pxref{Defining Packages}).  The
    @command{guix download} tool helps with this task: it downloads a file
    from the given URI, adds it to the store, and prints both its file name
    in the store and its SHA256 hash.
    
    The fact that the downloaded file is added to the store saves bandwidth:
    when the developer eventually tries to build the newly defined package
    with @command{guix build}, the source tarball will not have to be
    downloaded again because it is already in the store.  It is also a
    convenient way to temporarily stash files, which may be deleted
    eventually (@pxref{Invoking guix gc}).
    
    The @command{guix download} command supports the same URIs as used in
    package definitions.  In particular, it supports @code{mirror://} URIs.
    @code{https} URIs (HTTP over TLS) are supported @emph{provided} the
    Guile bindings for GnuTLS are available in the user's environment; when
    
    they are not available, an error is raised.  @xref{Guile Preparations,
    how to install the GnuTLS bindings for Guile,, gnutls-guile,
    GnuTLS-Guile}, for more information.
    
    
    The following option is available:
    
    @table @code
    @item --format=@var{fmt}
    @itemx -f @var{fmt}
    Write the hash in the format specified by @var{fmt}.  For more
    
    information on the valid values for @var{fmt}, @pxref{Invoking guix hash}.
    
    Nikita Karetnikov's avatar
    Nikita Karetnikov committed
    @node Invoking guix hash
    @section Invoking @command{guix hash}
    
    
    The @command{guix hash} command computes the SHA256 hash of a file.
    
    Nikita Karetnikov's avatar
    Nikita Karetnikov committed
    It is primarily a convenience tool for anyone contributing to the
    distribution: it computes the cryptographic hash of a file, which can be
    used in the definition of a package (@pxref{Defining Packages}).
    
    The general syntax is:
    
    @example
    guix hash @var{option} @var{file}
    @end example
    
    @command{guix hash} has the following option:
    
    @table @code
    
    @item --format=@var{fmt}
    @itemx -f @var{fmt}
    
    Write the hash in the format specified by @var{fmt}.
    
    Nikita Karetnikov's avatar
    Nikita Karetnikov committed
    
    Supported formats: @code{nix-base32}, @code{base32}, @code{base16}
    (@code{hex} and @code{hexadecimal} can be used as well).
    
    If the @option{--format} option is not specified, @command{guix hash}
    will output the hash in @code{nix-base32}.  This representation is used
    in the definitions of packages.
    
    
    @item --recursive
    @itemx -r
    Compute the hash on @var{file} recursively.
    
    In this case, the hash is computed on an archive containing @var{file},
    including its children if it is a directory.  Some of @var{file}'s
    meta-data is part of the archive; for instance, when @var{file} is a
    regular file, the hash is different depending on whether @var{file} is
    executable or not.  Meta-data such as time stamps has no impact on the
    hash (@pxref{Invoking guix archive}).
    @c FIXME: Replace xref above with xref to an ``Archive'' section when
    @c it exists.
    
    
    Nikita Karetnikov's avatar
    Nikita Karetnikov committed
    @end table
    
    
    @node Invoking guix import
    @section Invoking @command{guix import}
    
    @cindex importing packages
    @cindex package import
    @cindex package conversion
    The @command{guix import} command is useful for people willing to add a
    package to the distribution but who'd rather do as little work as
    possible to get there---a legitimate demand.  The command knows of a few
    repositories from which it can ``import'' package meta-data.  The result
    is a package definition, or a template thereof, in the format we know
    (@pxref{Defining Packages}).
    
    The general syntax is:
    
    @example
    guix import @var{importer} @var{options}@dots{}
    @end example
    
    @var{importer} specifies the source from which to import package
    meta-data, and @var{options} specifies a package identifier and other
    options specific to @var{importer}.  Currently, the available
    ``importers'' are:
    
    @table @code
    @item gnu
    Import meta-data for the given GNU package.  This provides a template
    for the latest version of that GNU package, including the hash of its
    source tarball, and its canonical synopsis and description.
    
    Additional information such as the package's dependencies and its
    license needs to be figured out manually.
    
    For example, the following command returns a package definition for
    GNU@tie{}Hello:
    
    @example
    guix import gnu hello
    @end example
    
    Specific command-line options are:
    
    @table @code
    @item --key-download=@var{policy}
    As for @code{guix refresh}, specify the policy to handle missing OpenPGP
    keys when verifying the package's signature.  @xref{Invoking guix
    refresh, @code{--key-download}}.
    @end table
    
    @item pypi
    @cindex pypi
    Import meta-data from the @uref{https://pypi.python.org/, Python Package
    Index}@footnote{This functionality requires Guile-JSON to be installed.
    @xref{Requirements}.}.  Information is taken from the JSON-formatted
    description available at @code{pypi.python.org} and usually includes all
    the relevant information, including package dependencies.
    
    The command below imports meta-data for the @code{itsdangerous} Python
    package:
    
    @example
    guix import pypi itsdangerous
    @end example
    
    
    Eric Bavier's avatar
    Eric Bavier committed
    @item cpan
    @cindex CPAN
    Import meta-data from @uref{https://www.metacpan.org/, MetaCPAN}.
    Information is taken from the JSON-formatted meta-data provided through
    @uref{https://api.metacpan.org/, MetaCPAN's API} and includes most
    
    relevant information, such as module dependencies.  License information
    should be checked closely.  If Perl is available in the store, then the
    @code{corelist} utility will be used to filter core modules out of the
    list of dependencies.
    
    Eric Bavier's avatar
    Eric Bavier committed
    
    The command command below imports meta-data for the @code{Acme::Boolean}
    Perl module:
    
    @example
    guix import cpan Acme::Boolean
    @end example
    
    
    @item nix
    Import meta-data from a local copy of the source of the
    @uref{http://nixos.org/nixpkgs/, Nixpkgs distribution}@footnote{This
    relies on the @command{nix-instantiate} command of
    @uref{http://nixos.org/nix/, Nix}.}.  Package definitions in Nixpkgs are
    typically written in a mixture of Nix-language and Bash code.  This
    command only imports the high-level package structure that is written in
    the Nix language.  It normally includes all the basic fields of a
    package definition.
    
    When importing a GNU package, the synopsis and descriptions are replaced
    by their canonical upstream variant.
    
    As an example, the command below imports the package definition of
    LibreOffice (more precisely, it imports the definition of the package
    bound to the @code{libreoffice} top-level attribute):
    
    @example
    guix import nix ~/path/to/nixpkgs libreoffice
    @end example
    
    
    @item hackage
    @cindex hackage
    Import meta-data from Haskell community's central package archive
    @uref{https://hackage.haskell.org/, Hackage}.  Information is taken from
    Cabal files and includes all the relevant information, including package
    dependencies.
    
    Specific command-line options are:
    
    @table @code
    
    @item --stdin
    @itemx -s
    Read a Cabal file from the standard input.
    
    @item --no-test-dependencies
    @itemx -t
    
    Do not include dependencies required by the test suites only.
    @item --cabal-environment=@var{alist}
    @itemx -e @var{alist}
    @var{alist} is a Scheme alist defining the environment in which the
    Cabal conditionals are evaluated.  The accepted keys are: @code{os},
    @code{arch}, @code{impl} and a string representing the name of a flag.
    The value associated with a flag has to be either the symbol
    @code{true} or @code{false}.  The value associated with other keys
    has to conform to the Cabal file format definition.  The default value
    associated with the keys @code{os}, @code{arch} and @code{impl} is
    @samp{linux}, @samp{x86_64} and @samp{ghc} respectively.
    
    @end table
    
    The command below imports meta-data for the latest version of the
    
    @code{HTTP} Haskell package without including test dependencies and
    specifying the value of the flag @samp{network-uri} as @code{false}:
    
    guix import hackage -t -e "'((\"network-uri\" . false))" HTTP
    
    @end example
    
    A specific package version may optionally be specified by following the
    package name by a hyphen and a version number as in the following example:
    
    @example
    guix import hackage mtl-2.1.3.1
    @end example
    
    
    @item elpa
    @cindex elpa
    Import meta-data from an Emacs Lisp Package Archive (ELPA) package
    repository (@pxref{Packages,,, emacs, The GNU Emacs Manual}).
    
    Specific command-line options are:
    
    @table @code
    @item --archive=@var{repo}
    @itemx -a @var{repo}
    @var{repo} identifies the archive repository from which to retrieve the
    information.  Currently the supported repositories and their identifiers
    are:
    @itemize -
    @item
    
    @uref{http://elpa.gnu.org/packages, GNU}, selected by the @code{gnu}
    
    identifier.  This is the default.
    
    @item
    
    @uref{http://stable.melpa.org/packages, MELPA-Stable}, selected by the
    
    @code{melpa-stable} identifier.
    
    @item
    
    @uref{http://melpa.org/packages, MELPA}, selected by the @code{melpa}
    
    identifier.
    @end itemize
    @end table
    
    @end table
    
    The structure of the @command{guix import} code is modular.  It would be
    useful to have more importers for other package formats, and your help
    is welcome here (@pxref{Contributing}).
    
    
    @node Invoking guix refresh
    @section Invoking @command{guix refresh}
    
    The primary audience of the @command{guix refresh} command is developers
    of the GNU software distribution.  By default, it reports any packages
    provided by the distribution that are outdated compared to the latest
    upstream version, like this:
    
    @example
    $ guix refresh
    gnu/packages/gettext.scm:29:13: gettext would be upgraded from 0.18.1.1 to 0.18.2.1
    gnu/packages/glib.scm:77:12: glib would be upgraded from 2.34.3 to 2.37.0
    @end example
    
    It does so by browsing each package's FTP directory and determining the
    highest version number of the source tarballs
    therein@footnote{Currently, this only works for GNU packages.}.
    
    When passed @code{--update}, it modifies distribution source files to
    update the version numbers and source tarball hashes of those packages'
    recipes (@pxref{Defining Packages}).  This is achieved by downloading
    each package's latest source tarball and its associated OpenPGP
    signature, authenticating the downloaded tarball against its signature
    using @command{gpg}, and finally computing its hash.  When the public
    key used to sign the tarball is missing from the user's keyring, an
    attempt is made to automatically retrieve it from a public key server;
    when it's successful, the key is added to the user's keyring; otherwise,
    @command{guix refresh} reports an error.
    
    The following options are supported:
    
    @table @code
    
    @item --update
    @itemx -u
    Update distribution source files (package recipes) in place.
    
    @xref{Defining Packages}, for more information on package definitions.
    
    
    @item --select=[@var{subset}]
    @itemx -s @var{subset}
    Select all the packages in @var{subset}, one of @code{core} or
    @code{non-core}.
    
    The @code{core} subset refers to all the packages at the core of the
    distribution---i.e., packages that are used to build ``everything
    else''.  This includes GCC, libc, Binutils, Bash, etc.  Usually,