mirror of
https://git.in.rschanz.org/ryan77627/guix.git
synced 2024-11-07 15:36:20 -05:00
doc: Add 'Debugging Build Failures' node.
* doc/guix.texi (Debugging Build Failures): New node. Co-authored-by: Ludovic Courtès <ludo@gnu.org>
This commit is contained in:
parent
634088a565
commit
fc06b15e86
1 changed files with 83 additions and 2 deletions
|
@ -34,7 +34,8 @@ Copyright @copyright{} 2017 Clément Lassieur@*
|
|||
Copyright @copyright{} 2017 Mathieu Othacehe@*
|
||||
Copyright @copyright{} 2017 Federico Beffa@*
|
||||
Copyright @copyright{} 2017 Carlo Zancanaro@*
|
||||
Copyright @copyright{} 2017 Thomas Danckaert
|
||||
Copyright @copyright{} 2017 Thomas Danckaert@*
|
||||
Copyright @copyright{} 2017 humanitiesNerd
|
||||
|
||||
Permission is granted to copy, distribute and/or modify this document
|
||||
under the terms of the GNU Free Documentation License, Version 1.3 or
|
||||
|
@ -2879,7 +2880,8 @@ unavailable to the build process, possibly leading to a build failure.
|
|||
|
||||
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}). You can easily jump back to the
|
||||
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
|
||||
|
@ -4832,6 +4834,7 @@ described in the subsections below.
|
|||
* Common Build Options:: Build options for most commands.
|
||||
* Package Transformation Options:: Creating variants of packages.
|
||||
* Additional Build Options:: Options specific to 'guix build'.
|
||||
* Debugging Build Failures:: Real life packaging experience
|
||||
@end menu
|
||||
|
||||
@node Common Build Options
|
||||
|
@ -4857,6 +4860,8 @@ the command-line tools.
|
|||
Keep the build tree of failed builds. Thus, if a build fails, 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.
|
||||
@xref{Debugging Build Failures}, for tips and tricks on how to debug
|
||||
build issues.
|
||||
|
||||
@item --keep-going
|
||||
@itemx -k
|
||||
|
@ -5244,6 +5249,82 @@ https://hydra.gnu.org/log/@dots{}-gdb-7.10
|
|||
You can freely access a huge library of build logs!
|
||||
@end table
|
||||
|
||||
@node Debugging Build Failures
|
||||
@subsection Debugging Build Failures
|
||||
|
||||
@cindex build failures, debugging
|
||||
When defining a new package (@pxref{Defining Packages}), you will
|
||||
probably find yourself spending some time debugging and tweaking the
|
||||
build until it succeeds. To do that, you need to operate the build
|
||||
commands yourself in an environment as close as possible to the one the
|
||||
build daemon uses.
|
||||
|
||||
To that end, the first thing to do is to use the @option{--keep-failed}
|
||||
or @option{-K} option of @command{guix build}, which will keep the
|
||||
failed build tree in @file{/tmp} or whatever directory you specified as
|
||||
@code{TMPDIR} (@pxref{Invoking guix build, @code{--keep-failed}}).
|
||||
|
||||
From there on, you can @command{cd} to the failed build tree and source
|
||||
the @file{environment-variables} file, which contains all the
|
||||
environment variable definitions that were in place when the build
|
||||
failed. So let's say you're debugging a build failure in package
|
||||
@code{foo}; a typical session would look like this:
|
||||
|
||||
@example
|
||||
$ guix build foo -K
|
||||
@dots{} @i{build fails}
|
||||
$ cd /tmp/guix-build-foo.drv-0
|
||||
$ source ./environment-variables
|
||||
$ cd foo-1.2
|
||||
@end example
|
||||
|
||||
Now, you can invoke commands as if you were the daemon (almost) and
|
||||
troubleshoot your build process.
|
||||
|
||||
Sometimes it happens that, for example, a package's tests pass when you
|
||||
run them manually but they fail when the daemon runs them. This can
|
||||
happen because the daemon runs builds in containers where, unlike in our
|
||||
environment above, network access is missing, @file{/bin/sh} does not
|
||||
exist, etc. (@pxref{Build Environment Setup}).
|
||||
|
||||
In such cases, you may need to run inspect the build process from within
|
||||
a container similar to the one the build daemon creates:
|
||||
|
||||
@example
|
||||
$ guix build -K foo
|
||||
@dots{}
|
||||
$ cd /tmp/guix-build-foo.drv-0
|
||||
$ guix environment -C foo --ad-hoc strace gdb
|
||||
[env]# source ./environment-variables
|
||||
[env]# cd foo-1.2
|
||||
@end example
|
||||
|
||||
Here, @command{guix environment -C} creates a container and spawns a new
|
||||
shell in it (@pxref{Invoking guix environment}). The @command{--ad-hoc
|
||||
strace gdb} part adds the @command{strace} and @command{gdb} commands to
|
||||
the container, which would may find handy while debugging.
|
||||
|
||||
To get closer to a container like that used by the build daemon, we can
|
||||
remove @file{/bin/sh}:
|
||||
|
||||
@example
|
||||
[env]# rm /bin/sh
|
||||
@end example
|
||||
|
||||
(Don't worry, this is harmless: this is all happening in the throw-away
|
||||
container created by @command{guix environment}.)
|
||||
|
||||
The @command{strace} command is probably not in the search path, but we
|
||||
can run:
|
||||
|
||||
@example
|
||||
[env]# $GUIX_ENVIRONMENT/bin/strace -f -o log make check
|
||||
@end example
|
||||
|
||||
In this way, not only you will have reproduced the environment variables
|
||||
the daemon uses, you will also be running the build process in a container
|
||||
similar to the one the daemon uses.
|
||||
|
||||
|
||||
@node Invoking guix edit
|
||||
@section Invoking @command{guix edit}
|
||||
|
|
Loading…
Reference in a new issue