Skip to content
Snippets Groups Projects
guix.texi 1010 KiB
Newer Older
  • Learn to ignore specific revisions
  • already run Guix, @pxref{Invoking guix copy}, @ref{Invoking guix
    publish}, and @ref{Invoking guix archive}.
    @end quotation
    
    @cindex pack
    @cindex bundle
    @cindex application bundle
    @cindex software bundle
    The @command{guix pack} command creates a shrink-wrapped @dfn{pack} or
    @dfn{software bundle}: it creates a tarball or some other archive
    containing the binaries of the software you're interested in, and all
    its dependencies.  The resulting archive can be used on any machine that
    does not have Guix, and people can run the exact same binaries as those
    you have with Guix.  The pack itself is created in a bit-reproducible
    fashion, so anyone can verify that it really contains the build results
    that you pretend to be shipping.
    
    For example, to create a bundle containing Guile, Emacs, Geiser, and all
    their dependencies, you can run:
    
    @example
    $ guix pack guile emacs geiser
    @dots{}
    /gnu/store/@dots{}-pack.tar.gz
    @end example
    
    The result here is a tarball containing a @file{/gnu/store} directory
    with all the relevant packages.  The resulting tarball contains a
    @dfn{profile} with the three packages of interest; the profile is the
    same as would be created by @command{guix package -i}.  It is this
    mechanism that is used to create Guix's own standalone binary tarball
    (@pxref{Binary Installation}).
    
    Users of this pack would have to run
    @file{/gnu/store/@dots{}-profile/bin/guile} to run Guile, which you may
    find inconvenient.  To work around it, you can create, say, a
    @file{/opt/gnu/bin} symlink to the profile:
    
    @example
    guix pack -S /opt/gnu/bin=bin guile emacs geiser
    @end example
    
    @noindent
    That way, users can happily type @file{/opt/gnu/bin/guile} and enjoy.
    
    @cindex relocatable binaries, with @command{guix pack}
    What if the recipient of your pack does not have root privileges on
    their machine, and thus cannot unpack it in the root file system?  In
    that case, you will want to use the @code{--relocatable} option (see
    below).  This option produces @dfn{relocatable binaries}, meaning they
    they can be placed anywhere in the file system hierarchy: in the example
    above, users can unpack your tarball in their home directory and
    directly run @file{./opt/gnu/bin/guile}.
    
    @cindex Docker, build an image with guix pack
    Alternatively, you can produce a pack in the Docker image format using
    the following command:
    
    guix pack -f docker -S /bin=bin guile guile-readline
    
    @end example
    
    @noindent
    The result is a tarball that can be passed to the @command{docker load}
    
    command, followed by @code{docker run}:
    
    @example
    docker load < @var{file}
    docker run -ti guile-guile-readline /bin/guile
    @end example
    
    @noindent
    where @var{file} is the image returned by @var{guix pack}, and
    @code{guile-guile-readline} is its ``image tag''.  See the
    
    @uref{https://docs.docker.com/engine/reference/commandline/load/, Docker
    documentation} for more information.
    
    @cindex Singularity, build an image with guix pack
    @cindex SquashFS, build an image with guix pack
    Yet another option is to produce a SquashFS image with the following
    command:
    
    guix pack -f squashfs bash guile emacs geiser
    
    @noindent
    The result is a SquashFS file system image that can either be mounted or
    directly be used as a file system container image with the
    
    Marius Bakke's avatar
    Marius Bakke committed
    @uref{https://singularity.lbl.gov, Singularity container execution
    
    environment}, using commands like @command{singularity shell} or
    @command{singularity exec}.
    
    Several command-line options allow you to customize your pack:
    
    @table @code
    @item --format=@var{format}
    @itemx -f @var{format}
    Produce a pack in the given @var{format}.
    
    The available formats are:
    
    @table @code
    @item tarball
    This is the default format.  It produces a tarball containing all the
    specified binaries and symlinks.
    
    @item docker
    This produces a tarball that follows the
    @uref{https://github.com/docker/docker/blob/master/image/spec/v1.2.md,
    
    Docker Image Specification}.  The ``repository name'' as it appears in
    the output of the @command{docker images} command is computed from
    package names passed on the command line or in the manifest file.
    
    @item squashfs
    This produces a SquashFS image containing all the specified binaries and
    symlinks, as well as empty mount points for virtual file systems like
    procfs.
    
    
    @quotation Note
    Singularity @emph{requires} you to provide @file{/bin/sh} in the image.
    For that reason, @command{guix pack -f squashfs} always implies @code{-S
    /bin=bin}.  Thus, your @command{guix pack} invocation must always start
    with something like:
    
    @example
    guix pack -f squashfs bash @dots{}
    @end example
    
    If you forget the @code{bash} (or similar) package, @command{singularity
    run} and @command{singularity exec} will fail with an unhelpful ``no
    such file or directory'' message.
    @end quotation
    
    @cindex relocatable binaries
    
    @item --relocatable
    @itemx -R
    Produce @dfn{relocatable binaries}---i.e., binaries that can be placed
    
    anywhere in the file system hierarchy and run from there.
    
    When this option is passed once, the resulting binaries require support for
    @dfn{user namespaces} in the kernel Linux; when passed
    @emph{twice}@footnote{Here's a trick to memorize it: @code{-RR}, which adds
    PRoot support, can be thought of as the abbreviation of ``Really
    Relocatable''.  Neat, isn't it?}, relocatable binaries fall to back to PRoot
    if user namespaces are unavailable, and essentially work anywhere---see below
    for the implications.
    
    For example, if you create a pack containing Bash with:
    
    guix pack -RR -S /mybin=bin bash
    
    @end example
    
    @noindent
    ...@: you can copy that pack to a machine that lacks Guix, and from your
    home directory as a normal user, run:
    
    @example
    tar xf pack.tar.gz
    ./mybin/sh
    @end example
    
    @noindent
    In that shell, if you type @code{ls /gnu/store}, you'll notice that
    @file{/gnu/store} shows up and contains all the dependencies of
    @code{bash}, even though the machine actually lacks @file{/gnu/store}
    altogether!  That is probably the simplest way to deploy Guix-built
    software on a non-Guix machine.
    
    @quotation Note
    By default, relocatable binaries rely on the @dfn{user namespace} feature of
    the kernel Linux, which allows unprivileged users to mount or change root.
    Old versions of Linux did not support it, and some GNU/Linux distributions
    turn it off.
    
    To produce relocatable binaries that work even in the absence of user
    namespaces, pass @option{--relocatable} or @option{-R} @emph{twice}.  In that
    case, binaries will try user namespace support and fall back to PRoot if user
    namespaces are not supported.
    
    The @uref{https://proot-me.github.io/, PRoot} program provides the necessary
    support for file system virtualization.  It achieves that by using the
    @code{ptrace} system call on the running program.  This approach has the
    advantage to work without requiring special kernel support, but it incurs
    run-time overhead every time a system call is made.
    @end quotation
    
    @cindex entry point, for Docker images
    @item --entry-point=@var{command}
    Use @var{command} as the @dfn{entry point} of the resulting pack, if the pack
    format supports it---currently @code{docker} and @code{squashfs} (Singularity)
    support it.  @var{command} must be relative to the profile contained in the
    pack.
    
    The entry point specifies the command that tools like @code{docker run} or
    @code{singularity run} automatically start by default.  For example, you can
    do:
    
    @example
    guix pack -f docker --entry-point=bin/guile guile
    @end example
    
    The resulting pack can easily be loaded and @code{docker run} with no extra
    arguments will spawn @code{bin/guile}:
    
    @example
    docker load -i pack.tar.gz
    docker run @var{image-id}
    @end example
    
    
    @item --expression=@var{expr}
    @itemx -e @var{expr}
    Consider the package @var{expr} evaluates to.
    
    This has the same purpose as the same-named option in @command{guix
    build} (@pxref{Additional Build Options, @code{--expression} in
    @command{guix build}}).
    
    @item --manifest=@var{file}
    @itemx -m @var{file}
    Use the packages contained in the manifest object returned by the Scheme
    
    code in @var{file}.  This option can be repeated several times, in which
    case the manifests are concatenated.
    
    This has a similar purpose as the same-named option in @command{guix
    package} (@pxref{profile-manifest, @option{--manifest}}) and uses the
    same manifest files.  It allows you to define a collection of packages
    once and use it both for creating profiles and for creating archives
    for use on machines that do not have Guix installed.  Note that you can
    specify @emph{either} a manifest file @emph{or} a list of packages,
    but not both.
    
    @item --system=@var{system}
    @itemx -s @var{system}
    Attempt to build for @var{system}---e.g., @code{i686-linux}---instead of
    the system type of the build host.
    
    @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{Specifying target triplets, GNU
    configuration triplets,, autoconf, Autoconf}).
    
    @item --compression=@var{tool}
    @itemx -C @var{tool}
    Compress the resulting tarball using @var{tool}---one of @code{gzip},
    @code{bzip2}, @code{xz}, @code{lzip}, or @code{none} for no compression.
    
    @item --symlink=@var{spec}
    @itemx -S @var{spec}
    Add the symlinks specified by @var{spec} to the pack.  This option can
    appear several times.
    
    @var{spec} has the form @code{@var{source}=@var{target}}, where
    @var{source} is the symlink that will be created and @var{target} is the
    symlink target.
    
    For instance, @code{-S /opt/gnu/bin=bin} creates a @file{/opt/gnu/bin}
    symlink pointing to the @file{bin} sub-directory of the profile.
    
    @item --save-provenance
    Save provenance information for the packages passed on the command line.
    Provenance information includes the URL and commit of the channels in use
    (@pxref{Channels}).
    
    Provenance information is saved in the
    @file{/gnu/store/@dots{}-profile/manifest} file in the pack, along with the
    usual package metadata---the name and version of each package, their
    propagated inputs, and so on.  It is useful information to the recipient of
    the pack, who then knows how the pack was (supposedly) obtained.
    
    This option is not enabled by default because, like timestamps, provenance
    information contributes nothing to the build process.  In other words, there
    is an infinity of channel URLs and commit IDs that can lead to the same pack.
    Recording such ``silent'' metadata in the output thus potentially breaks the
    source-to-binary bitwise reproducibility property.
    
    
    Ludovic Courtès's avatar
    Ludovic Courtès committed
    @item --root=@var{file}
    @itemx -r @var{file}
    @cindex garbage collector root, for packs
    Make @var{file} a symlink to the resulting pack, and register it as a garbage
    collector root.
    
    
    @item --localstatedir
    @itemx --profile-name=@var{name}
    Include the ``local state directory'', @file{/var/guix}, in the resulting
    pack, and notably the @file{/var/guix/profiles/per-user/root/@var{name}}
    profile---by default @var{name} is @code{guix-profile}, which corresponds to
    @file{~root/.guix-profile}.
    
    @file{/var/guix} contains the store database (@pxref{The Store}) as well
    as garbage-collector roots (@pxref{Invoking guix gc}).  Providing it in
    the pack means that the store is ``complete'' and manageable by Guix;
    not providing it pack means that the store is ``dead'': items cannot be
    added to it or removed from it after extraction of the pack.
    
    One use case for this is the Guix self-contained binary tarball
    (@pxref{Binary Installation}).
    
    @item --derivation
    @itemx -d
    Print the name of the derivation that builds the pack.
    
    
    @item --bootstrap
    Use the bootstrap binaries to build the pack.  This option is only
    useful to Guix developers.
    
    In addition, @command{guix pack} supports all the common build options
    (@pxref{Common Build Options}) and all the package transformation
    options (@pxref{Package Transformation Options}).
    
    @c *********************************************************************
    @node Programming Interface
    @chapter Programming Interface
    
    GNU Guix provides several Scheme programming interfaces (APIs) to
    define, build, and query packages.  The first interface allows users to
    write high-level package definitions.  These definitions refer to
    familiar packaging concepts, such as the name and version of a package,
    its build system, and its dependencies.  These definitions can then be
    turned into concrete build actions.
    
    Build actions are performed by the Guix daemon, on behalf of users.  In a
    standard setup, the daemon has write access to the store---the
    @file{/gnu/store} directory---whereas users do not.  The recommended
    setup also has the daemon perform builds in chroots, under a specific
    build users, to minimize interference with the rest of the system.
    
    @cindex derivation
    Lower-level APIs are available to interact with the daemon and the
    
    store.  To instruct the daemon to perform a build action, users actually
    provide it with a @dfn{derivation}.  A derivation is a low-level
    representation of the build actions to be taken, and the environment in
    which they should occur---derivations are to package definitions what
    assembly is to C programs.  The term ``derivation'' comes from the fact
    that build results @emph{derive} from them.
    
    This chapter describes all these APIs in turn, starting from high-level
    package definitions.
    
    * Package Modules::             Packages from the programmer's viewpoint.
    
    * Defining Packages::           Defining new packages.
    * Build Systems::               Specifying how packages are built.
    * The Store::                   Manipulating the package store.
    * Derivations::                 Low-level interface to package derivations.
    * The Store Monad::             Purely functional interface to the store.
    * G-Expressions::               Manipulating build expressions.
    * Invoking guix repl::          Fiddling with Guix interactively.
    @end menu
    
    @node Package Modules
    @section Package Modules
    
    From a programming viewpoint, the package definitions of the
    GNU distribution are provided by Guile modules in the @code{(gnu packages
    @dots{})} name space@footnote{Note that packages under the @code{(gnu
    packages @dots{})} module name space are not necessarily ``GNU
    packages''.  This module naming scheme follows the usual Guile module
    naming convention: @code{gnu} means that these modules are distributed
    as part of the GNU system, and @code{packages} identifies modules that
    define packages.}  (@pxref{Modules, Guile modules,, guile, GNU Guile
    Reference Manual}).  For instance, the @code{(gnu packages emacs)}
    module exports a variable named @code{emacs}, which is bound to a
    @code{<package>} object (@pxref{Defining Packages}).
    
    The @code{(gnu packages @dots{})} module name space is
    automatically scanned for packages by the command-line tools.  For
    
    instance, when running @code{guix install emacs}, all the @code{(gnu
    
    packages @dots{})} modules are scanned until one that exports a package
    object whose name is @code{emacs} is found.  This package search
    facility is implemented in the @code{(gnu packages)} module.
    
    @cindex customization, of packages
    @cindex package module search path
    Users can store package definitions in modules with different
    names---e.g., @code{(my-packages emacs)}@footnote{Note that the file
    name and module name must match.  For instance, the @code{(my-packages
    emacs)} module must be stored in a @file{my-packages/emacs.scm} file
    relative to the load path specified with @option{--load-path} or
    @code{GUIX_PACKAGE_PATH}.  @xref{Modules and the File System,,,
    guile, GNU Guile Reference Manual}, for details.}.  There are two ways to make
    these package definitions visible to the user interfaces:
    
    @enumerate
    @item
    By adding the directory containing your package modules to the search path
    with the @code{-L} flag of @command{guix package} and other commands
    (@pxref{Common Build Options}), or by setting the @code{GUIX_PACKAGE_PATH}
    environment variable described below.
    
    @item
    By defining a @dfn{channel} and configuring @command{guix pull} so that it
    pulls from it.  A channel is essentially a Git repository containing package
    modules.  @xref{Channels}, for more information on how to define and use
    channels.
    @end enumerate
    
    @code{GUIX_PACKAGE_PATH} works similarly to other search path variables:
    
    @defvr {Environment Variable} GUIX_PACKAGE_PATH
    This is a colon-separated list of directories to search for additional
    package modules.  Directories listed in this variable take precedence
    over the own modules of the distribution.
    @end defvr
    
    The distribution is fully @dfn{bootstrapped} and @dfn{self-contained}:
    each package is built based solely on other packages in the
    distribution.  The root of this dependency graph is a small set of
    @dfn{bootstrap binaries}, provided by the @code{(gnu packages
    bootstrap)} module.  For more information on bootstrapping,
    @pxref{Bootstrapping}.
    
    @node Defining Packages
    @section Defining Packages
    
    The high-level interface to package definitions is implemented in the
    @code{(guix packages)} and @code{(guix build-system)} modules.  As an
    example, the package definition, or @dfn{recipe}, for the GNU Hello
    package looks like this:
    
    (define-module (gnu packages hello)
      #:use-module (guix packages)
      #:use-module (guix download)
      #:use-module (guix build-system gnu)
      #:use-module (guix licenses)
      #:use-module (gnu packages gawk))
    
    (define-public hello
      (package
        (name "hello")
        (version "2.10")
        (source (origin
                  (method url-fetch)
                  (uri (string-append "mirror://gnu/hello/hello-" version
                                      ".tar.gz"))
                  (sha256
                   (base32
                    "0ssi1wpaf7plaswqqjwigppsg5fyh99vdlb9kzl7c9lng89ndq1i"))))
        (build-system gnu-build-system)
        (arguments '(#:configure-flags '("--enable-silent-rules")))
        (inputs `(("gawk" ,gawk)))
        (synopsis "Hello, GNU world: An example GNU package")
        (description "Guess what GNU Hello prints!")
    
    Marius Bakke's avatar
    Marius Bakke committed
        (home-page "https://www.gnu.org/software/hello/")
    
    @noindent
    Without being a Scheme expert, the reader may have guessed the meaning
    of the various fields here.  This expression binds the variable
    @code{hello} to a @code{<package>} object, which is essentially a record
    (@pxref{SRFI-9, Scheme records,, guile, GNU Guile Reference Manual}).
    This package object can be inspected using procedures found in the
    @code{(guix packages)} module; for instance, @code{(package-name hello)}
    returns---surprise!---@code{"hello"}.
    
    With luck, you may be able to import part or all of the definition of
    the package you are interested in from another repository, using the
    @code{guix import} command (@pxref{Invoking guix import}).
    
    In the example above, @var{hello} is defined in a module of its own,
    @code{(gnu packages hello)}.  Technically, this is not strictly
    necessary, but it is convenient to do so: all the packages defined in
    modules under @code{(gnu packages @dots{})} are automatically known to
    the command-line tools (@pxref{Package Modules}).
    
    There are a few points worth noting in the above package definition:
    
    @itemize
    @item
    The @code{source} field of the package is an @code{<origin>} object
    (@pxref{origin Reference}, for the complete reference).
    Here, the @code{url-fetch} method from @code{(guix download)} is used,
    meaning that the source is a file to be downloaded over FTP or HTTP.
    
    The @code{mirror://gnu} prefix instructs @code{url-fetch} to use one of
    the GNU mirrors defined in @code{(guix download)}.
    
    The @code{sha256} field specifies the expected SHA256 hash of the file
    being downloaded.  It is mandatory, and allows Guix to check the
    integrity of the file.  The @code{(base32 @dots{})} form introduces the
    base32 representation of the hash.  You can obtain this information with
    @code{guix download} (@pxref{Invoking guix download}) and @code{guix
    hash} (@pxref{Invoking guix hash}).
    
    @cindex patches
    When needed, the @code{origin} form can also have a @code{patches} field
    listing patches to be applied, and a @code{snippet} field giving a
    Scheme expression to modify the source code.
    
    @item
    @cindex GNU Build System
    The @code{build-system} field specifies the procedure to build the
    package (@pxref{Build Systems}).  Here, @var{gnu-build-system}
    represents the familiar GNU Build System, where packages may be
    configured, built, and installed with the usual @code{./configure &&
    make && make check && make install} command sequence.
    
    @item
    The @code{arguments} field specifies options for the build system
    (@pxref{Build Systems}).  Here it is interpreted by
    @var{gnu-build-system} as a request run @file{configure} with the
    @code{--enable-silent-rules} flag.
    
    @cindex quote
    @cindex quoting
    @findex '
    @findex quote
    What about these quote (@code{'}) characters?  They are Scheme syntax to
    introduce a literal list; @code{'} is synonymous with @code{quote}.
    @xref{Expression Syntax, quoting,, guile, GNU Guile Reference Manual},
    for details.  Here the value of the @code{arguments} field is a list of
    arguments passed to the build system down the road, as with @code{apply}
    (@pxref{Fly Evaluation, @code{apply},, guile, GNU Guile Reference
    Manual}).
    
    The hash-colon (@code{#:}) sequence defines a Scheme @dfn{keyword}
    (@pxref{Keywords,,, guile, GNU Guile Reference Manual}), and
    @code{#:configure-flags} is a keyword used to pass a keyword argument
    to the build system (@pxref{Coding With Keywords,,, guile, GNU Guile
    Reference Manual}).
    
    @item
    The @code{inputs} field specifies inputs to the build process---i.e.,
    build-time or run-time dependencies of the package.  Here, we define an
    input called @code{"gawk"} whose value is that of the @var{gawk}
    variable; @var{gawk} is itself bound to a @code{<package>} object.
    
    @cindex backquote (quasiquote)
    @findex `
    @findex quasiquote
    @cindex comma (unquote)
    @findex ,
    @findex unquote
    @findex ,@@
    @findex unquote-splicing
    Again, @code{`} (a backquote, synonymous with @code{quasiquote}) allows
    us to introduce a literal list in the @code{inputs} field, while
    @code{,} (a comma, synonymous with @code{unquote}) allows us to insert a
    value in that list (@pxref{Expression Syntax, unquote,, guile, GNU Guile
    Reference Manual}).
    
    Note that GCC, Coreutils, Bash, and other essential tools do not need to
    be specified as inputs here.  Instead, @var{gnu-build-system} takes care
    of ensuring that they are present (@pxref{Build Systems}).
    
    However, any other dependencies need to be specified in the
    @code{inputs} field.  Any dependency not specified here will simply be
    unavailable to the build process, possibly leading to a build failure.
    @end itemize
    
    @xref{package Reference}, for a full description of possible fields.
    
    Once a package definition is in place, the
    package may actually be built using the @code{guix build} command-line
    tool (@pxref{Invoking guix build}), troubleshooting any build failures
    you encounter (@pxref{Debugging Build Failures}).  You can easily jump back to the
    package definition using the @command{guix edit} command
    (@pxref{Invoking guix edit}).
    @xref{Packaging Guidelines}, for
    more information on how to test package definitions, and
    @ref{Invoking guix lint}, for information on how to check a definition
    for style conformance.
    @vindex GUIX_PACKAGE_PATH
    Lastly, @pxref{Channels}, for information
    on how to extend the distribution by adding your own package definitions
    in a ``channel''.
    
    Finally, updating the package definition to a new upstream version
    can be partly automated by the @command{guix refresh} command
    (@pxref{Invoking guix refresh}).
    
    Behind the scenes, a derivation corresponding to the @code{<package>}
    object is first computed by the @code{package-derivation} procedure.
    That derivation is stored in a @code{.drv} file under @file{/gnu/store}.
    The build actions it prescribes may then be realized by using the
    @code{build-derivations} procedure (@pxref{The Store}).
    
    @deffn {Scheme Procedure} package-derivation @var{store} @var{package} [@var{system}]
    Return the @code{<derivation>} object of @var{package} for @var{system}
    (@pxref{Derivations}).
    
    @var{package} must be a valid @code{<package>} object, and @var{system}
    must be a string denoting the target system type---e.g.,
    @code{"x86_64-linux"} for an x86_64 Linux-based GNU system.  @var{store}
    must be a connection to the daemon, which operates on the store
    (@pxref{The Store}).
    
    @noindent
    @cindex cross-compilation
    Similarly, it is possible to compute a derivation that cross-builds a
    package for some other system:
    
    @deffn {Scheme Procedure} package-cross-derivation @var{store} @
                @var{package} @var{target} [@var{system}]
    Return the @code{<derivation>} object of @var{package} cross-built from
    @var{system} to @var{target}.
    
    @var{target} must be a valid GNU triplet denoting the target hardware
    and operating system, such as @code{"mips64el-linux-gnu"}
    
    (@pxref{Specifying Target Triplets,,, autoconf, Autoconf}).
    
    @cindex package transformations
    @cindex input rewriting
    @cindex dependency tree rewriting
    Packages can be manipulated in arbitrary ways.  An example of a useful
    transformation is @dfn{input rewriting}, whereby the dependency tree of
    a package is rewritten by replacing specific inputs by others:
    
    @deffn {Scheme Procedure} package-input-rewriting @var{replacements} @
               [@var{rewrite-name}]
    Return a procedure that, when passed a package, replaces its direct and
    indirect dependencies (but not its implicit inputs) according to
    @var{replacements}.  @var{replacements} is a list of package pairs; the
    first element of each pair is the package to replace, and the second one
    is the replacement.
    
    Optionally, @var{rewrite-name} is a one-argument procedure that takes
    the name of a package and returns its new name after rewrite.
    
    (define libressl-instead-of-openssl
      ;; This is a procedure to replace OPENSSL by LIBRESSL,
      ;; recursively.
      (package-input-rewriting `((,openssl . ,libressl))))
    
    (define git-with-libressl
      (libressl-instead-of-openssl git))
    
    @noindent
    Here we first define a rewriting procedure that replaces @var{openssl}
    with @var{libressl}.  Then we use it to define a @dfn{variant} of the
    @var{git} package that uses @var{libressl} instead of @var{openssl}.
    This is exactly what the @option{--with-input} command-line option does
    (@pxref{Package Transformation Options, @option{--with-input}}).
    
    The following variant of @code{package-input-rewriting} can match packages to
    be replaced by name rather than by identity.
    
    @deffn {Scheme Procedure} package-input-rewriting/spec @var{replacements}
    Return a procedure that, given a package, applies the given @var{replacements} to
    all the package graph (excluding implicit inputs).  @var{replacements} is a list of
    spec/procedures pair; each spec is a package specification such as @code{"gcc"} or
    @code{"guile@@2"}, and each procedure takes a matching package and returns a
    replacement for that package.
    @end deffn
    
    The example above could be rewritten this way:
    
    
    (define libressl-instead-of-openssl
      ;; Replace all the packages called "openssl" with LibreSSL.
      (package-input-rewriting/spec `(("openssl" . ,(const libressl)))))
    
    
    The key difference here is that, this time, packages are matched by spec and
    not by identity.  In other words, any package in the graph that is called
    @code{openssl} will be replaced.
    
    
    A more generic procedure to rewrite a package dependency graph is
    @code{package-mapping}: it supports arbitrary changes to nodes in the
    graph.
    
    @deffn {Scheme Procedure} package-mapping @var{proc} [@var{cut?}]
    Return a procedure that, given a package, applies @var{proc} to all the packages
    depended on and returns the resulting package.  The procedure stops recursion
    when @var{cut?} returns true for a given package.
    @end deffn
    
    @menu
    * package Reference::           The package data type.
    * origin Reference::            The origin data type.
    @end menu
    
    @node package Reference
    @subsection @code{package} Reference
    
    This section summarizes all the options available in @code{package}
    declarations (@pxref{Defining Packages}).
    
    @deftp {Data Type} package
    This is the data type representing a package recipe.
    
    @table @asis
    @item @code{name}
    The name of the package, as a string.
    
    @item @code{version}
    The version of the package, as a string.
    
    @item @code{source}
    An object telling how the source code for the package should be
    acquired.  Most of the time, this is an @code{origin} object, which
    denotes a file fetched from the Internet (@pxref{origin Reference}).  It
    can also be any other ``file-like'' object such as a @code{local-file},
    which denotes a file from the local file system (@pxref{G-Expressions,
    @code{local-file}}).
    
    @item @code{build-system}
    The build system that should be used to build the package (@pxref{Build
    Systems}).
    
    @item @code{arguments} (default: @code{'()})
    The arguments that should be passed to the build system.  This is a
    list, typically containing sequential keyword-value pairs.
    
    @item @code{inputs} (default: @code{'()})
    @itemx @code{native-inputs} (default: @code{'()})
    @itemx @code{propagated-inputs} (default: @code{'()})
    @cindex inputs, of packages
    These fields list dependencies of the package.  Each one is a list of
    tuples, where each tuple has a label for the input (a string) as its
    first element, a package, origin, or derivation as its second element,
    and optionally the name of the output thereof that should be used, which
    defaults to @code{"out"} (@pxref{Packages with Multiple Outputs}, for
    more on package outputs).  For example, the list below specifies three
    inputs:
    
    `(("libffi" ,libffi)
      ("libunistring" ,libunistring)
      ("glib:bin" ,glib "bin"))  ;the "bin" output of Glib
    
    @cindex cross compilation, package dependencies
    The distinction between @code{native-inputs} and @code{inputs} is
    necessary when considering cross-compilation.  When cross-compiling,
    dependencies listed in @code{inputs} are built for the @emph{target}
    architecture; conversely, dependencies listed in @code{native-inputs}
    are built for the architecture of the @emph{build} machine.
    
    @code{native-inputs} is typically used to list tools needed at
    build time, but not at run time, such as Autoconf, Automake, pkg-config,
    Gettext, or Bison.  @command{guix lint} can report likely mistakes in
    this area (@pxref{Invoking guix lint}).
    
    @anchor{package-propagated-inputs}
    Lastly, @code{propagated-inputs} is similar to @code{inputs}, but the
    specified packages will be automatically installed alongside the package
    they belong to (@pxref{package-cmd-propagated-inputs, @command{guix
    package}}, for information on how @command{guix package} deals with
    propagated inputs.)
    
    For example this is necessary when a C/C++ library needs headers of
    another library to compile, or when a pkg-config file refers to another
    one @i{via} its @code{Requires} field.
    
    Another example where @code{propagated-inputs} is useful is for languages
    that lack a facility to record the run-time search path akin to the
    @code{RUNPATH} of ELF files; this includes Guile, Python, Perl, and
    more.  To ensure that libraries written in those languages can find
    library code they depend on at run time, run-time dependencies must be
    listed in @code{propagated-inputs} rather than @code{inputs}.
    
    @item @code{outputs} (default: @code{'("out")})
    The list of output names of the package.  @xref{Packages with Multiple
    Outputs}, for typical uses of additional outputs.
    
    @item @code{native-search-paths} (default: @code{'()})
    @itemx @code{search-paths} (default: @code{'()})
    A list of @code{search-path-specification} objects describing
    search-path environment variables honored by the package.
    
    @item @code{replacement} (default: @code{#f})
    This must be either @code{#f} or a package object that will be used as a
    @dfn{replacement} for this package.  @xref{Security Updates, grafts},
    for details.
    
    @item @code{synopsis}
    A one-line description of the package.
    
    @item @code{description}
    A more elaborate description of the package.
    
    @item @code{license}
    @cindex license, of packages
    The license of the package; a value from @code{(guix licenses)},
    or a list of such values.
    
    @item @code{home-page}
    The URL to the home-page of the package, as a string.
    
    @item @code{supported-systems} (default: @var{%supported-systems})
    The list of systems supported by the package, as strings of the form
    @code{architecture-kernel}, for example @code{"x86_64-linux"}.
    
    @item @code{location} (default: source location of the @code{package} form)
    The source location of the package.  It is useful to override this when
    inheriting from another package, in which case this field is not
    automatically corrected.
    @end table
    @end deftp
    
    @deffn {Scheme Syntax} this-package
    When used in the @emph{lexical scope} of a package field definition, this
    identifier resolves to the package being defined.
    
    The example below shows how to add a package as a native input of itself when
    cross-compiling:
    
    
    (package
      (name "guile")
      ;; ...
    
      ;; When cross-compiled, Guile, for example, depends on
      ;; a native version of itself.  Add it here.
      (native-inputs (if (%current-target-system)
                         `(("self" ,this-package))
                         '())))
    
    
    It is an error to refer to @code{this-package} outside a package definition.
    @end deffn
    
    @node origin Reference
    @subsection @code{origin} Reference
    
    This section summarizes all the options available in @code{origin}
    declarations (@pxref{Defining Packages}).
    
    @deftp {Data Type} origin
    This is the data type representing a source code origin.
    
    @table @asis
    @item @code{uri}
    An object containing the URI of the source.  The object type depends on
    the @code{method} (see below).  For example, when using the
    @var{url-fetch} method of @code{(guix download)}, the valid @code{uri}
    values are: a URL represented as a string, or a list thereof.
    
    @item @code{method}
    A procedure that handles the URI.
    
    @table @asis
    @item @var{url-fetch} from @code{(guix download)}
    download a file from the HTTP, HTTPS, or FTP URL specified in the
    @code{uri} field;
    
    @vindex git-fetch
    @item @var{git-fetch} from @code{(guix git-download)}
    clone the Git version control repository, and check out the revision
    specified in the @code{uri} field as a @code{git-reference} object; a
    @code{git-reference} looks like this:
    
      (url "https://git.savannah.gnu.org/git/hello.git")
      (commit "v2.10"))
    
    @item @code{sha256}
    A bytevector containing the SHA-256 hash of the source.  Typically the
    @code{base32} form is used here to generate the bytevector from a
    base-32 string.
    
    You can obtain this information using @code{guix download}
    (@pxref{Invoking guix download}) or @code{guix hash} (@pxref{Invoking
    guix hash}).
    
    @item @code{file-name} (default: @code{#f})
    The file name under which the source code should be saved.  When this is
    @code{#f}, a sensible default value will be used in most cases.  In case
    the source is fetched from a URL, the file name from the URL will be
    used.  For version control checkouts, it is recommended to provide the
    file name explicitly because the default is not very descriptive.
    
    @item @code{patches} (default: @code{'()})
    A list of file names, origins, or file-like objects (@pxref{G-Expressions,
    file-like objects}) pointing to patches to be applied to the source.
    
    This list of patches must be unconditional.  In particular, it cannot
    depend on the value of @code{%current-system} or
    @code{%current-target-system}.
    
    @item @code{snippet} (default: @code{#f})
    A G-expression (@pxref{G-Expressions}) or S-expression that will be run
    in the source directory.  This is a convenient way to modify the source,
    sometimes more convenient than a patch.
    
    @item @code{patch-flags} (default: @code{'("-p1")})
    A list of command-line flags that should be passed to the @code{patch}
    command.
    
    @item @code{patch-inputs} (default: @code{#f})
    Input packages or derivations to the patching process.  When this is
    @code{#f}, the usual set of inputs necessary for patching are provided,
    such as GNU@tie{}Patch.
    
    @item @code{modules} (default: @code{'()})
    A list of Guile modules that should be loaded during the patching
    process and while running the code in the @code{snippet} field.
    
    @item @code{patch-guile} (default: @code{#f})
    The Guile package that should be used in the patching process.  When
    this is @code{#f}, a sensible default is used.
    @end table
    @end deftp
    
    @node Build Systems
    @section Build Systems
    
    @cindex build system
    Each package definition specifies a @dfn{build system} and arguments for
    that build system (@pxref{Defining Packages}).  This @code{build-system}
    field represents the build procedure of the package, as well as implicit
    dependencies of that build procedure.
    
    Build systems are @code{<build-system>} objects.  The interface to
    create and manipulate them is provided by the @code{(guix build-system)}
    module, and actual build systems are exported by specific modules.
    
    @cindex bag (low-level package representation)
    Under the hood, build systems first compile package objects to
    @dfn{bags}.  A @dfn{bag} is like a package, but with less
    ornamentation---in other words, a bag is a lower-level representation of
    a package, which includes all the inputs of that package, including some
    that were implicitly added by the build system.  This intermediate
    representation is then compiled to a derivation (@pxref{Derivations}).
    
    Build systems accept an optional list of @dfn{arguments}.  In package
    definitions, these are passed @i{via} the @code{arguments} field
    (@pxref{Defining Packages}).  They are typically keyword arguments
    (@pxref{Optional Arguments, keyword arguments in Guile,, guile, GNU
    Guile Reference Manual}).  The value of these arguments is usually
    evaluated in the @dfn{build stratum}---i.e., by a Guile process launched
    by the daemon (@pxref{Derivations}).
    
    The main build system is @code{gnu-build-system}, which implements the
    
    standard build procedure for GNU and many other packages.  It
    is provided by the @code{(guix build-system gnu)} module.
    
    @defvr {Scheme Variable} gnu-build-system
    
    @code{gnu-build-system} represents the GNU Build System, and variants
    
    thereof (@pxref{Configuration, configuration and makefile conventions,,
    standards, GNU Coding Standards}).
    
    @cindex build phases
    In a nutshell, packages using it are configured, built, and installed with
    the usual @code{./configure && make && make check && make install}
    command sequence.  In practice, a few additional steps are often needed.
    All these steps are split up in separate @dfn{phases},
    notably@footnote{Please see the @code{(guix build gnu-build-system)}
    modules for more details about the build phases.}:
    
    @table @code
    @item unpack
    Unpack the source tarball, and change the current directory to the
    extracted source tree.  If the source is actually a directory, copy it
    to the build tree, and enter that directory.
    
    @item patch-source-shebangs
    Patch shebangs encountered in source files so they refer to the right
    store file names.  For instance, this changes @code{#!/bin/sh} to
    @code{#!/gnu/store/@dots{}-bash-4.3/bin/sh}.
    
    @item configure
    Run the @file{configure} script with a number of default options, such
    as @code{--prefix=/gnu/store/@dots{}}, as well as the options specified
    by the @code{#:configure-flags} argument.
    
    @item build
    Run @code{make} with the list of flags specified with
    @code{#:make-flags}.  If the @code{#:parallel-build?} argument is true
    (the default), build with @code{make -j}.
    
    @item check
    Run @code{make check}, or some other target specified with
    @code{#:test-target}, unless @code{#:tests? #f} is passed.  If the
    @code{#:parallel-tests?} argument is true (the default), run @code{make
    check -j}.
    
    @item install
    Run @code{make install} with the flags listed in @code{#:make-flags}.
    
    @item patch-shebangs
    Patch shebangs on the installed executable files.
    
    @item strip
    Strip debugging symbols from ELF files (unless @code{#:strip-binaries?}
    is false), copying them to the @code{debug} output when available
    (@pxref{Installing Debugging Files}).