doc: Move "System Configuration" higher.
* doc/guix.texi (GNU Distribution): Move "System Configuration" right after "System Installation".
This commit is contained in:
		
							parent
							
								
									79ad1c6999
								
							
						
					
					
						commit
						cf4a912919
					
				
					 1 changed files with 467 additions and 468 deletions
				
			
		
							
								
								
									
										935
									
								
								doc/guix.texi
									
										
									
									
									
								
							
							
						
						
									
										935
									
								
								doc/guix.texi
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -2604,12 +2604,12 @@ For information on porting to other architectures or kernels,
 | 
			
		|||
 | 
			
		||||
@menu
 | 
			
		||||
* System Installation::         Installing the whole operating system.
 | 
			
		||||
* System Configuration::        Configuring a GNU system.
 | 
			
		||||
* Installing Debugging Files::  Feeding the debugger.
 | 
			
		||||
* Package Modules::             Packages from the programmer's viewpoint.
 | 
			
		||||
* Packaging Guidelines::        Growing the distribution.
 | 
			
		||||
* Bootstrapping::               GNU/Linux built from scratch.
 | 
			
		||||
* Porting::                     Targeting another platform or kernel.
 | 
			
		||||
* System Configuration::        Configuring a GNU system.
 | 
			
		||||
@end menu
 | 
			
		||||
 | 
			
		||||
Building this distribution is a cooperative effort, and you are invited
 | 
			
		||||
| 
						 | 
				
			
			@ -2781,473 +2781,6 @@ guix system disk-image --image-size=800MiB gnu/system/install.scm
 | 
			
		|||
@file{gnu/system/install.scm} in the source tree for more information
 | 
			
		||||
about the installation image.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@node Installing Debugging Files
 | 
			
		||||
@section Installing Debugging Files
 | 
			
		||||
 | 
			
		||||
@cindex debugging files
 | 
			
		||||
Program binaries, as produced by the GCC compilers for instance, are
 | 
			
		||||
typically written in the ELF format, with a section containing
 | 
			
		||||
@dfn{debugging information}.  Debugging information is what allows the
 | 
			
		||||
debugger, GDB, to map binary code to source code; it is required to
 | 
			
		||||
debug a compiled program in good conditions.
 | 
			
		||||
 | 
			
		||||
The problem with debugging information is that is takes up a fair amount
 | 
			
		||||
of disk space.  For example, debugging information for the GNU C Library
 | 
			
		||||
weighs in at more than 60 MiB.  Thus, as a user, keeping all the
 | 
			
		||||
debugging info of all the installed programs is usually not an option.
 | 
			
		||||
Yet, space savings should not come at the cost of an impediment to
 | 
			
		||||
debugging---especially in the GNU system, which should make it easier
 | 
			
		||||
for users to exert their computing freedom (@pxref{GNU Distribution}).
 | 
			
		||||
 | 
			
		||||
Thankfully, the GNU Binary Utilities (Binutils) and GDB provide a
 | 
			
		||||
mechanism that allows users to get the best of both worlds: debugging
 | 
			
		||||
information can be stripped from the binaries and stored in separate
 | 
			
		||||
files.  GDB is then able to load debugging information from those files,
 | 
			
		||||
when they are available (@pxref{Separate Debug Files,,, gdb, Debugging
 | 
			
		||||
with GDB}).
 | 
			
		||||
 | 
			
		||||
The GNU distribution takes advantage of this by storing debugging
 | 
			
		||||
information in the @code{lib/debug} sub-directory of a separate package
 | 
			
		||||
output unimaginatively called @code{debug} (@pxref{Packages with
 | 
			
		||||
Multiple Outputs}).  Users can choose to install the @code{debug} output
 | 
			
		||||
of a package when they need it.  For instance, the following command
 | 
			
		||||
installs the debugging information for the GNU C Library and for GNU
 | 
			
		||||
Guile:
 | 
			
		||||
 | 
			
		||||
@example
 | 
			
		||||
guix package -i glibc:debug guile:debug
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
GDB must then be told to look for debug files in the user's profile, by
 | 
			
		||||
setting the @code{debug-file-directory} variable (consider setting it
 | 
			
		||||
from the @file{~/.gdbinit} file, @pxref{Startup,,, gdb, Debugging with
 | 
			
		||||
GDB}):
 | 
			
		||||
 | 
			
		||||
@example
 | 
			
		||||
(gdb) set debug-file-directory ~/.guix-profile/lib/debug
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
From there on, GDB will pick up debugging information from the
 | 
			
		||||
@code{.debug} files under @file{~/.guix-profile/lib/debug}.
 | 
			
		||||
 | 
			
		||||
In addition, you will most likely want GDB to be able to show the source
 | 
			
		||||
code being debugged.  To do that, you will have to unpack the source
 | 
			
		||||
code of the package of interest (obtained with @code{guix build
 | 
			
		||||
--source}, @pxref{Invoking guix build}), and to point GDB to that source
 | 
			
		||||
directory using the @code{directory} command (@pxref{Source Path,
 | 
			
		||||
@code{directory},, gdb, Debugging with GDB}).
 | 
			
		||||
 | 
			
		||||
@c XXX: keep me up-to-date
 | 
			
		||||
The @code{debug} output mechanism in Guix is implemented by the
 | 
			
		||||
@code{gnu-build-system} (@pxref{Build Systems}).  Currently, it is
 | 
			
		||||
opt-in---debugging information is available only for those packages
 | 
			
		||||
whose definition explicitly declares a @code{debug} output.  This may be
 | 
			
		||||
changed to opt-out in the future, if our build farm servers can handle
 | 
			
		||||
the load.  To check whether a package has a @code{debug} output, use
 | 
			
		||||
@command{guix package --list-available} (@pxref{Invoking guix package}).
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@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 special: it is
 | 
			
		||||
automatically scanned for packages by the command-line tools.  For
 | 
			
		||||
instance, when running @code{guix package -i 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.
 | 
			
		||||
 | 
			
		||||
Users can store package definitions in modules with different
 | 
			
		||||
names---e.g., @code{(my-packages emacs)}.  In that case, commands such
 | 
			
		||||
as @command{guix package} and @command{guix build} have to be used with
 | 
			
		||||
the @code{-e} option so that they know where to find the package.
 | 
			
		||||
 | 
			
		||||
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,
 | 
			
		||||
@ref{Bootstrapping}.
 | 
			
		||||
 | 
			
		||||
@node Packaging Guidelines
 | 
			
		||||
@section Packaging Guidelines
 | 
			
		||||
 | 
			
		||||
The GNU distribution is nascent and may well lack some of your favorite
 | 
			
		||||
packages.  This section describes how you can help make the distribution
 | 
			
		||||
grow.  @xref{Contributing}, for additional information on how you can
 | 
			
		||||
help.
 | 
			
		||||
 | 
			
		||||
Free software packages are usually distributed in the form of
 | 
			
		||||
@dfn{source code tarballs}---typically @file{tar.gz} files that contain
 | 
			
		||||
all the source files.  Adding a package to the distribution means
 | 
			
		||||
essentially two things: adding a @dfn{recipe} that describes how to
 | 
			
		||||
build the package, including a list of other packages required to build
 | 
			
		||||
it, and adding @dfn{package meta-data} along with that recipe, such as a
 | 
			
		||||
description and licensing information.
 | 
			
		||||
 | 
			
		||||
In Guix all this information is embodied in @dfn{package definitions}.
 | 
			
		||||
Package definitions provide a high-level view of the package.  They are
 | 
			
		||||
written using the syntax of the Scheme programming language; in fact,
 | 
			
		||||
for each package we define a variable bound to the package definition,
 | 
			
		||||
and export that variable from a module (@pxref{Package Modules}).
 | 
			
		||||
However, in-depth Scheme knowledge is @emph{not} a prerequisite for
 | 
			
		||||
creating packages.  For more information on package definitions,
 | 
			
		||||
@ref{Defining Packages}.
 | 
			
		||||
 | 
			
		||||
Once a package definition is in place, stored in a file in the Guix
 | 
			
		||||
source tree, it can be tested using the @command{guix build} command
 | 
			
		||||
(@pxref{Invoking guix build}).  For example, assuming the new package is
 | 
			
		||||
called @code{gnew}, you may run this command from the Guix build tree:
 | 
			
		||||
 | 
			
		||||
@example
 | 
			
		||||
./pre-inst-env guix build gnew --keep-failed
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
Using @code{--keep-failed} makes it easier to debug build failures since
 | 
			
		||||
it provides access to the failed build tree.  Another useful
 | 
			
		||||
command-line option when debugging is @code{--log-file}, to access the
 | 
			
		||||
build log.
 | 
			
		||||
 | 
			
		||||
If the package is unknown to the @command{guix} command, it may be that
 | 
			
		||||
the source file contains a syntax error, or lacks a @code{define-public}
 | 
			
		||||
clause to export the package variable.  To figure it out, you may load
 | 
			
		||||
the module from Guile to get more information about the actual error:
 | 
			
		||||
 | 
			
		||||
@example
 | 
			
		||||
./pre-inst-env guile -c '(use-modules (gnu packages gnew))'
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
Once your package builds correctly, please send us a patch
 | 
			
		||||
(@pxref{Contributing}).  Well, if you need help, we will be happy to
 | 
			
		||||
help you too.  Once the patch is committed in the Guix repository, the
 | 
			
		||||
new package automatically gets built on the supported platforms by
 | 
			
		||||
@url{http://hydra.gnu.org/gnu/master, our continuous integration
 | 
			
		||||
system}.
 | 
			
		||||
 | 
			
		||||
@cindex substituter
 | 
			
		||||
Users can obtain the new package definition simply by running
 | 
			
		||||
@command{guix pull} (@pxref{Invoking guix pull}).  When
 | 
			
		||||
@code{hydra.gnu.org} is done building the package, installing the
 | 
			
		||||
package automatically downloads binaries from there
 | 
			
		||||
(@pxref{Substitutes}).  The only place where human intervention is
 | 
			
		||||
needed is to review and apply the patch.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@menu
 | 
			
		||||
* Software Freedom::     What may go into the distribution.
 | 
			
		||||
* Package Naming::       What's in a name?
 | 
			
		||||
* Version Numbers::      When the name is not enough.
 | 
			
		||||
* Python Modules::       Taming the snake.
 | 
			
		||||
* Perl Modules::         Little pearls.
 | 
			
		||||
@end menu
 | 
			
		||||
 | 
			
		||||
@node Software Freedom
 | 
			
		||||
@subsection Software Freedom
 | 
			
		||||
 | 
			
		||||
@c Adapted from http://www.gnu.org/philosophy/philosophy.html.
 | 
			
		||||
 | 
			
		||||
The GNU operating system has been developed so that users can have
 | 
			
		||||
freedom in their computing.  GNU is @dfn{free software}, meaning that
 | 
			
		||||
users have the @url{http://www.gnu.org/philosophy/free-sw.html,four
 | 
			
		||||
essential freedoms}: to run the program, to study and change the program
 | 
			
		||||
in source code form, to redistribute exact copies, and to distribute
 | 
			
		||||
modified versions.  Packages found in the GNU distribution provide only
 | 
			
		||||
software that conveys these four freedoms.
 | 
			
		||||
 | 
			
		||||
In addition, the GNU distribution follow the
 | 
			
		||||
@url{http://www.gnu.org/distros/free-system-distribution-guidelines.html,free
 | 
			
		||||
software distribution guidelines}.  Among other things, these guidelines
 | 
			
		||||
reject non-free firmware, recommendations of non-free software, and
 | 
			
		||||
discuss ways to deal with trademarks and patents.
 | 
			
		||||
 | 
			
		||||
Some packages contain a small and optional subset that violates the
 | 
			
		||||
above guidelines, for instance because this subset is itself non-free
 | 
			
		||||
code.  When that happens, the offending items are removed with
 | 
			
		||||
appropriate patches or code snippets in the package definition's
 | 
			
		||||
@code{origin} form (@pxref{Defining Packages}).  That way, @code{guix
 | 
			
		||||
build --source} returns the ``freed'' source rather than the unmodified
 | 
			
		||||
upstream source.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@node Package Naming
 | 
			
		||||
@subsection Package Naming
 | 
			
		||||
 | 
			
		||||
A package has actually two names associated with it:
 | 
			
		||||
First, there is the name of the @emph{Scheme variable}, the one following
 | 
			
		||||
@code{define-public}.  By this name, the package can be made known in the
 | 
			
		||||
Scheme code, for instance as input to another package.  Second, there is
 | 
			
		||||
the string in the @code{name} field of a package definition.  This name
 | 
			
		||||
is used by package management commands such as
 | 
			
		||||
@command{guix package} and @command{guix build}.
 | 
			
		||||
 | 
			
		||||
Both are usually the same and correspond to the lowercase conversion of
 | 
			
		||||
the project name chosen upstream, with underscores replaced with
 | 
			
		||||
hyphens.  For instance, GNUnet is available as @code{gnunet}, and
 | 
			
		||||
SDL_net as @code{sdl-net}.
 | 
			
		||||
 | 
			
		||||
We do not add @code{lib} prefixes for library packages, unless these are
 | 
			
		||||
already part of the official project name.  But see @pxref{Python
 | 
			
		||||
Modules} and @ref{Perl Modules} for special rules concerning modules for
 | 
			
		||||
the Python and Perl languages.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@node Version Numbers
 | 
			
		||||
@subsection Version Numbers
 | 
			
		||||
 | 
			
		||||
We usually package only the latest version of a given free software
 | 
			
		||||
project.  But sometimes, for instance for incompatible library versions,
 | 
			
		||||
two (or more) versions of the same package are needed.  These require
 | 
			
		||||
different Scheme variable names.  We use the name as defined
 | 
			
		||||
in @ref{Package Naming}
 | 
			
		||||
for the most recent version; previous versions use the same name, suffixed
 | 
			
		||||
by @code{-} and the smallest prefix of the version number that may
 | 
			
		||||
distinguish the two versions.
 | 
			
		||||
 | 
			
		||||
The name inside the package definition is the same for all versions of a
 | 
			
		||||
package and does not contain any version number.
 | 
			
		||||
 | 
			
		||||
For instance, the versions 2.24.20 and 3.9.12 of GTK+ may be packaged as follows:
 | 
			
		||||
 | 
			
		||||
@example
 | 
			
		||||
(define-public gtk+
 | 
			
		||||
  (package
 | 
			
		||||
   (name "gtk+")
 | 
			
		||||
   (version "3.9.12")
 | 
			
		||||
   ...))
 | 
			
		||||
(define-public gtk+-2
 | 
			
		||||
  (package
 | 
			
		||||
   (name "gtk+")
 | 
			
		||||
   (version "2.24.20")
 | 
			
		||||
   ...))
 | 
			
		||||
@end example
 | 
			
		||||
If we also wanted GTK+ 3.8.2, this would be packaged as
 | 
			
		||||
@example
 | 
			
		||||
(define-public gtk+-3.8
 | 
			
		||||
  (package
 | 
			
		||||
   (name "gtk+")
 | 
			
		||||
   (version "3.8.2")
 | 
			
		||||
   ...))
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@node Python Modules
 | 
			
		||||
@subsection Python Modules
 | 
			
		||||
 | 
			
		||||
We currently package Python 2 and Python 3, under the Scheme variable names
 | 
			
		||||
@code{python-2} and @code{python} as explained in @ref{Version Numbers}.
 | 
			
		||||
To avoid confusion and naming clashes with other programming languages, it
 | 
			
		||||
seems desirable that the name of a package for a Python module contains
 | 
			
		||||
the word @code{python}.
 | 
			
		||||
 | 
			
		||||
Some modules are compatible with only one version of Python, others with both.
 | 
			
		||||
If the package Foo compiles only with Python 3, we name it
 | 
			
		||||
@code{python-foo}; if it compiles only with Python 2, we name it
 | 
			
		||||
@code{python2-foo}. If it is compatible with both versions, we create two
 | 
			
		||||
packages with the corresponding names.
 | 
			
		||||
 | 
			
		||||
If a project already contains the word @code{python}, we drop this;
 | 
			
		||||
for instance, the module python-dateutil is packaged under the names
 | 
			
		||||
@code{python-dateutil} and @code{python2-dateutil}.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@node Perl Modules
 | 
			
		||||
@subsection Perl Modules
 | 
			
		||||
 | 
			
		||||
Perl programs standing for themselves are named as any other package,
 | 
			
		||||
using the lowercase upstream name.
 | 
			
		||||
For Perl packages containing a single class, we use the lowercase class name,
 | 
			
		||||
replace all occurrences of @code{::} by dashes and prepend the prefix
 | 
			
		||||
@code{perl-}.
 | 
			
		||||
So the class @code{XML::Parser} becomes @code{perl-xml-parser}.
 | 
			
		||||
Modules containing several classes keep their lowercase upstream name and
 | 
			
		||||
are also prepended by @code{perl-}.  Such modules tend to have the word
 | 
			
		||||
@code{perl} somewhere in their name, which gets dropped in favor of the
 | 
			
		||||
prefix.  For instance, @code{libwww-perl} becomes @code{perl-libwww}.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@node Bootstrapping
 | 
			
		||||
@section Bootstrapping
 | 
			
		||||
 | 
			
		||||
@c Adapted from the ELS 2013 paper.
 | 
			
		||||
 | 
			
		||||
@cindex bootstrapping
 | 
			
		||||
 | 
			
		||||
Bootstrapping in our context refers to how the distribution gets built
 | 
			
		||||
``from nothing''.  Remember that the build environment of a derivation
 | 
			
		||||
contains nothing but its declared inputs (@pxref{Introduction}).  So
 | 
			
		||||
there's an obvious chicken-and-egg problem: how does the first package
 | 
			
		||||
get built?  How does the first compiler get compiled?  Note that this is
 | 
			
		||||
a question of interest only to the curious hacker, not to the regular
 | 
			
		||||
user, so you can shamelessly skip this section if you consider yourself
 | 
			
		||||
a ``regular user''.
 | 
			
		||||
 | 
			
		||||
@cindex bootstrap binaries
 | 
			
		||||
The GNU system is primarily made of C code, with libc at its core.  The
 | 
			
		||||
GNU build system itself assumes the availability of a Bourne shell and
 | 
			
		||||
command-line tools provided by GNU Coreutils, Awk, Findutils, `sed', and
 | 
			
		||||
`grep'.  Furthermore, build programs---programs that run
 | 
			
		||||
@code{./configure}, @code{make}, etc.---are written in Guile Scheme
 | 
			
		||||
(@pxref{Derivations}).  Consequently, to be able to build anything at
 | 
			
		||||
all, from scratch, Guix relies on pre-built binaries of Guile, GCC,
 | 
			
		||||
Binutils, libc, and the other packages mentioned above---the
 | 
			
		||||
@dfn{bootstrap binaries}.
 | 
			
		||||
 | 
			
		||||
These bootstrap binaries are ``taken for granted'', though we can also
 | 
			
		||||
re-create them if needed (more on that later).
 | 
			
		||||
 | 
			
		||||
@unnumberedsubsec Preparing to Use the Bootstrap Binaries
 | 
			
		||||
 | 
			
		||||
@c As of Emacs 24.3, Info-mode displays the image, but since it's a
 | 
			
		||||
@c large image, it's hard to scroll.  Oh well.
 | 
			
		||||
@image{images/bootstrap-graph,6in,,Dependency graph of the early bootstrap derivations}
 | 
			
		||||
 | 
			
		||||
The figure above shows the very beginning of the dependency graph of the
 | 
			
		||||
distribution, corresponding to the package definitions of the @code{(gnu
 | 
			
		||||
packages bootstrap)} module.  At this level of detail, things are
 | 
			
		||||
slightly complex.  First, Guile itself consists of an ELF executable,
 | 
			
		||||
along with many source and compiled Scheme files that are dynamically
 | 
			
		||||
loaded when it runs.  This gets stored in the @file{guile-2.0.7.tar.xz}
 | 
			
		||||
tarball shown in this graph.  This tarball is part of Guix's ``source''
 | 
			
		||||
distribution, and gets inserted into the store with @code{add-to-store}
 | 
			
		||||
(@pxref{The Store}).
 | 
			
		||||
 | 
			
		||||
But how do we write a derivation that unpacks this tarball and adds it
 | 
			
		||||
to the store?  To solve this problem, the @code{guile-bootstrap-2.0.drv}
 | 
			
		||||
derivation---the first one that gets built---uses @code{bash} as its
 | 
			
		||||
builder, which runs @code{build-bootstrap-guile.sh}, which in turn calls
 | 
			
		||||
@code{tar} to unpack the tarball.  Thus, @file{bash}, @file{tar},
 | 
			
		||||
@file{xz}, and @file{mkdir} are statically-linked binaries, also part of
 | 
			
		||||
the Guix source distribution, whose sole purpose is to allow the Guile
 | 
			
		||||
tarball to be unpacked.
 | 
			
		||||
 | 
			
		||||
Once @code{guile-bootstrap-2.0.drv} is built, we have a functioning
 | 
			
		||||
Guile that can be used to run subsequent build programs.  Its first task
 | 
			
		||||
is to download tarballs containing the other pre-built binaries---this
 | 
			
		||||
is what the @code{.tar.xz.drv} derivations do.  Guix modules such as
 | 
			
		||||
@code{ftp-client.scm} are used for this purpose.  The
 | 
			
		||||
@code{module-import.drv} derivations import those modules in a directory
 | 
			
		||||
in the store, using the original layout.  The
 | 
			
		||||
@code{module-import-compiled.drv} derivations compile those modules, and
 | 
			
		||||
write them in an output directory with the right layout.  This
 | 
			
		||||
corresponds to the @code{#:modules} argument of
 | 
			
		||||
@code{build-expression->derivation} (@pxref{Derivations}).
 | 
			
		||||
 | 
			
		||||
Finally, the various tarballs are unpacked by the
 | 
			
		||||
derivations @code{gcc-bootstrap-0.drv}, @code{glibc-bootstrap-0.drv},
 | 
			
		||||
etc., at which point we have a working C tool chain.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@unnumberedsubsec Building the Build Tools
 | 
			
		||||
 | 
			
		||||
@c TODO: Add a package-level dependency graph generated from (gnu
 | 
			
		||||
@c packages base).
 | 
			
		||||
 | 
			
		||||
Bootstrapping is complete when we have a full tool chain that does not
 | 
			
		||||
depend on the pre-built bootstrap tools discussed above.  This
 | 
			
		||||
no-dependency requirement is verified by checking whether the files of
 | 
			
		||||
the final tool chain contain references to the @file{/gnu/store}
 | 
			
		||||
directories of the bootstrap inputs.  The process that leads to this
 | 
			
		||||
``final'' tool chain is described by the package definitions found in
 | 
			
		||||
the @code{(gnu packages base)} module.
 | 
			
		||||
 | 
			
		||||
@c See <http://lists.gnu.org/archive/html/gnu-system-discuss/2012-10/msg00000.html>.
 | 
			
		||||
The first tool that gets built with the bootstrap binaries is
 | 
			
		||||
GNU Make, which is a prerequisite for all the following packages.
 | 
			
		||||
From there Findutils and Diffutils get built.
 | 
			
		||||
 | 
			
		||||
Then come the first-stage Binutils and GCC, built as pseudo cross
 | 
			
		||||
tools---i.e., with @code{--target} equal to @code{--host}.  They are
 | 
			
		||||
used to build libc.  Thanks to this cross-build trick, this libc is
 | 
			
		||||
guaranteed not to hold any reference to the initial tool chain.
 | 
			
		||||
 | 
			
		||||
From there the final Binutils and GCC are built.  GCC uses @code{ld}
 | 
			
		||||
from the final Binutils, and links programs against the just-built libc.
 | 
			
		||||
This tool chain is used to build the other packages used by Guix and by
 | 
			
		||||
the GNU Build System: Guile, Bash, Coreutils, etc.
 | 
			
		||||
 | 
			
		||||
And voilà!  At this point we have the complete set of build tools that
 | 
			
		||||
the GNU Build System expects.  These are in the @code{%final-inputs}
 | 
			
		||||
variables of the @code{(gnu packages base)} module, and are implicitly
 | 
			
		||||
used by any package that uses @code{gnu-build-system} (@pxref{Defining
 | 
			
		||||
Packages}).
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@unnumberedsubsec Building the Bootstrap Binaries
 | 
			
		||||
 | 
			
		||||
Because the final tool chain does not depend on the bootstrap binaries,
 | 
			
		||||
those rarely need to be updated.  Nevertheless, it is useful to have an
 | 
			
		||||
automated way to produce them, should an update occur, and this is what
 | 
			
		||||
the @code{(gnu packages make-bootstrap)} module provides.
 | 
			
		||||
 | 
			
		||||
The following command builds the tarballs containing the bootstrap
 | 
			
		||||
binaries (Guile, Binutils, GCC, libc, and a tarball containing a mixture
 | 
			
		||||
of Coreutils and other basic command-line tools):
 | 
			
		||||
 | 
			
		||||
@example
 | 
			
		||||
guix build bootstrap-tarballs
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
The generated tarballs are those that should be referred to in the
 | 
			
		||||
@code{(gnu packages bootstrap)} module mentioned at the beginning of
 | 
			
		||||
this section.
 | 
			
		||||
 | 
			
		||||
Still here?  Then perhaps by now you've started to wonder: when do we
 | 
			
		||||
reach a fixed point?  That is an interesting question!  The answer is
 | 
			
		||||
unknown, but if you would like to investigate further (and have
 | 
			
		||||
significant computational and storage resources to do so), then let us
 | 
			
		||||
know.
 | 
			
		||||
 | 
			
		||||
@node Porting
 | 
			
		||||
@section Porting to a New Platform
 | 
			
		||||
 | 
			
		||||
As discussed above, the GNU distribution is self-contained, and
 | 
			
		||||
self-containment is achieved by relying on pre-built ``bootstrap
 | 
			
		||||
binaries'' (@pxref{Bootstrapping}).  These binaries are specific to an
 | 
			
		||||
operating system kernel, CPU architecture, and application binary
 | 
			
		||||
interface (ABI).  Thus, to port the distribution to a platform that is
 | 
			
		||||
not yet supported, one must build those bootstrap binaries, and update
 | 
			
		||||
the @code{(gnu packages bootstrap)} module to use them on that platform.
 | 
			
		||||
 | 
			
		||||
Fortunately, Guix can @emph{cross compile} those bootstrap binaries.
 | 
			
		||||
When everything goes well, and assuming the GNU tool chain supports the
 | 
			
		||||
target platform, this can be as simple as running a command like this
 | 
			
		||||
one:
 | 
			
		||||
 | 
			
		||||
@example
 | 
			
		||||
guix build --target=armv5tel-linux-gnueabi bootstrap-tarballs
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
Once these are built, the @code{(gnu packages bootstrap)} module needs
 | 
			
		||||
to be updated to refer to these binaries on the target platform.  In
 | 
			
		||||
addition, the @code{glibc-dynamic-linker} procedure in that module must
 | 
			
		||||
be augmented to return the right file name for libc's dynamic linker on
 | 
			
		||||
that platform; likewise, @code{system->linux-architecture} in @code{(gnu
 | 
			
		||||
packages linux)} must be taught about the new platform.
 | 
			
		||||
 | 
			
		||||
In practice, there may be some complications.  First, it may be that the
 | 
			
		||||
extended GNU triplet that specifies an ABI (like the @code{eabi} suffix
 | 
			
		||||
above) is not recognized by all the GNU tools.  Typically, glibc
 | 
			
		||||
recognizes some of these, whereas GCC uses an extra @code{--with-abi}
 | 
			
		||||
configure flag (see @code{gcc.scm} for examples of how to handle this).
 | 
			
		||||
Second, some of the required packages could fail to build for that
 | 
			
		||||
platform.  Lastly, the generated binaries could be broken for some
 | 
			
		||||
reason.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@node System Configuration
 | 
			
		||||
@section System Configuration
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -3846,6 +3379,472 @@ on-line documentation.  Thus, the commands @command{deco start ncsd},
 | 
			
		|||
would expect (@pxref{Invoking deco,,, dmd, GNU dmd Manual}).
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@node Installing Debugging Files
 | 
			
		||||
@section Installing Debugging Files
 | 
			
		||||
 | 
			
		||||
@cindex debugging files
 | 
			
		||||
Program binaries, as produced by the GCC compilers for instance, are
 | 
			
		||||
typically written in the ELF format, with a section containing
 | 
			
		||||
@dfn{debugging information}.  Debugging information is what allows the
 | 
			
		||||
debugger, GDB, to map binary code to source code; it is required to
 | 
			
		||||
debug a compiled program in good conditions.
 | 
			
		||||
 | 
			
		||||
The problem with debugging information is that is takes up a fair amount
 | 
			
		||||
of disk space.  For example, debugging information for the GNU C Library
 | 
			
		||||
weighs in at more than 60 MiB.  Thus, as a user, keeping all the
 | 
			
		||||
debugging info of all the installed programs is usually not an option.
 | 
			
		||||
Yet, space savings should not come at the cost of an impediment to
 | 
			
		||||
debugging---especially in the GNU system, which should make it easier
 | 
			
		||||
for users to exert their computing freedom (@pxref{GNU Distribution}).
 | 
			
		||||
 | 
			
		||||
Thankfully, the GNU Binary Utilities (Binutils) and GDB provide a
 | 
			
		||||
mechanism that allows users to get the best of both worlds: debugging
 | 
			
		||||
information can be stripped from the binaries and stored in separate
 | 
			
		||||
files.  GDB is then able to load debugging information from those files,
 | 
			
		||||
when they are available (@pxref{Separate Debug Files,,, gdb, Debugging
 | 
			
		||||
with GDB}).
 | 
			
		||||
 | 
			
		||||
The GNU distribution takes advantage of this by storing debugging
 | 
			
		||||
information in the @code{lib/debug} sub-directory of a separate package
 | 
			
		||||
output unimaginatively called @code{debug} (@pxref{Packages with
 | 
			
		||||
Multiple Outputs}).  Users can choose to install the @code{debug} output
 | 
			
		||||
of a package when they need it.  For instance, the following command
 | 
			
		||||
installs the debugging information for the GNU C Library and for GNU
 | 
			
		||||
Guile:
 | 
			
		||||
 | 
			
		||||
@example
 | 
			
		||||
guix package -i glibc:debug guile:debug
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
GDB must then be told to look for debug files in the user's profile, by
 | 
			
		||||
setting the @code{debug-file-directory} variable (consider setting it
 | 
			
		||||
from the @file{~/.gdbinit} file, @pxref{Startup,,, gdb, Debugging with
 | 
			
		||||
GDB}):
 | 
			
		||||
 | 
			
		||||
@example
 | 
			
		||||
(gdb) set debug-file-directory ~/.guix-profile/lib/debug
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
From there on, GDB will pick up debugging information from the
 | 
			
		||||
@code{.debug} files under @file{~/.guix-profile/lib/debug}.
 | 
			
		||||
 | 
			
		||||
In addition, you will most likely want GDB to be able to show the source
 | 
			
		||||
code being debugged.  To do that, you will have to unpack the source
 | 
			
		||||
code of the package of interest (obtained with @code{guix build
 | 
			
		||||
--source}, @pxref{Invoking guix build}), and to point GDB to that source
 | 
			
		||||
directory using the @code{directory} command (@pxref{Source Path,
 | 
			
		||||
@code{directory},, gdb, Debugging with GDB}).
 | 
			
		||||
 | 
			
		||||
@c XXX: keep me up-to-date
 | 
			
		||||
The @code{debug} output mechanism in Guix is implemented by the
 | 
			
		||||
@code{gnu-build-system} (@pxref{Build Systems}).  Currently, it is
 | 
			
		||||
opt-in---debugging information is available only for those packages
 | 
			
		||||
whose definition explicitly declares a @code{debug} output.  This may be
 | 
			
		||||
changed to opt-out in the future, if our build farm servers can handle
 | 
			
		||||
the load.  To check whether a package has a @code{debug} output, use
 | 
			
		||||
@command{guix package --list-available} (@pxref{Invoking guix package}).
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@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 special: it is
 | 
			
		||||
automatically scanned for packages by the command-line tools.  For
 | 
			
		||||
instance, when running @code{guix package -i 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.
 | 
			
		||||
 | 
			
		||||
Users can store package definitions in modules with different
 | 
			
		||||
names---e.g., @code{(my-packages emacs)}.  In that case, commands such
 | 
			
		||||
as @command{guix package} and @command{guix build} have to be used with
 | 
			
		||||
the @code{-e} option so that they know where to find the package.
 | 
			
		||||
 | 
			
		||||
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,
 | 
			
		||||
@ref{Bootstrapping}.
 | 
			
		||||
 | 
			
		||||
@node Packaging Guidelines
 | 
			
		||||
@section Packaging Guidelines
 | 
			
		||||
 | 
			
		||||
The GNU distribution is nascent and may well lack some of your favorite
 | 
			
		||||
packages.  This section describes how you can help make the distribution
 | 
			
		||||
grow.  @xref{Contributing}, for additional information on how you can
 | 
			
		||||
help.
 | 
			
		||||
 | 
			
		||||
Free software packages are usually distributed in the form of
 | 
			
		||||
@dfn{source code tarballs}---typically @file{tar.gz} files that contain
 | 
			
		||||
all the source files.  Adding a package to the distribution means
 | 
			
		||||
essentially two things: adding a @dfn{recipe} that describes how to
 | 
			
		||||
build the package, including a list of other packages required to build
 | 
			
		||||
it, and adding @dfn{package meta-data} along with that recipe, such as a
 | 
			
		||||
description and licensing information.
 | 
			
		||||
 | 
			
		||||
In Guix all this information is embodied in @dfn{package definitions}.
 | 
			
		||||
Package definitions provide a high-level view of the package.  They are
 | 
			
		||||
written using the syntax of the Scheme programming language; in fact,
 | 
			
		||||
for each package we define a variable bound to the package definition,
 | 
			
		||||
and export that variable from a module (@pxref{Package Modules}).
 | 
			
		||||
However, in-depth Scheme knowledge is @emph{not} a prerequisite for
 | 
			
		||||
creating packages.  For more information on package definitions,
 | 
			
		||||
@ref{Defining Packages}.
 | 
			
		||||
 | 
			
		||||
Once a package definition is in place, stored in a file in the Guix
 | 
			
		||||
source tree, it can be tested using the @command{guix build} command
 | 
			
		||||
(@pxref{Invoking guix build}).  For example, assuming the new package is
 | 
			
		||||
called @code{gnew}, you may run this command from the Guix build tree:
 | 
			
		||||
 | 
			
		||||
@example
 | 
			
		||||
./pre-inst-env guix build gnew --keep-failed
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
Using @code{--keep-failed} makes it easier to debug build failures since
 | 
			
		||||
it provides access to the failed build tree.  Another useful
 | 
			
		||||
command-line option when debugging is @code{--log-file}, to access the
 | 
			
		||||
build log.
 | 
			
		||||
 | 
			
		||||
If the package is unknown to the @command{guix} command, it may be that
 | 
			
		||||
the source file contains a syntax error, or lacks a @code{define-public}
 | 
			
		||||
clause to export the package variable.  To figure it out, you may load
 | 
			
		||||
the module from Guile to get more information about the actual error:
 | 
			
		||||
 | 
			
		||||
@example
 | 
			
		||||
./pre-inst-env guile -c '(use-modules (gnu packages gnew))'
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
Once your package builds correctly, please send us a patch
 | 
			
		||||
(@pxref{Contributing}).  Well, if you need help, we will be happy to
 | 
			
		||||
help you too.  Once the patch is committed in the Guix repository, the
 | 
			
		||||
new package automatically gets built on the supported platforms by
 | 
			
		||||
@url{http://hydra.gnu.org/gnu/master, our continuous integration
 | 
			
		||||
system}.
 | 
			
		||||
 | 
			
		||||
@cindex substituter
 | 
			
		||||
Users can obtain the new package definition simply by running
 | 
			
		||||
@command{guix pull} (@pxref{Invoking guix pull}).  When
 | 
			
		||||
@code{hydra.gnu.org} is done building the package, installing the
 | 
			
		||||
package automatically downloads binaries from there
 | 
			
		||||
(@pxref{Substitutes}).  The only place where human intervention is
 | 
			
		||||
needed is to review and apply the patch.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@menu
 | 
			
		||||
* Software Freedom::     What may go into the distribution.
 | 
			
		||||
* Package Naming::       What's in a name?
 | 
			
		||||
* Version Numbers::      When the name is not enough.
 | 
			
		||||
* Python Modules::       Taming the snake.
 | 
			
		||||
* Perl Modules::         Little pearls.
 | 
			
		||||
@end menu
 | 
			
		||||
 | 
			
		||||
@node Software Freedom
 | 
			
		||||
@subsection Software Freedom
 | 
			
		||||
 | 
			
		||||
@c Adapted from http://www.gnu.org/philosophy/philosophy.html.
 | 
			
		||||
 | 
			
		||||
The GNU operating system has been developed so that users can have
 | 
			
		||||
freedom in their computing.  GNU is @dfn{free software}, meaning that
 | 
			
		||||
users have the @url{http://www.gnu.org/philosophy/free-sw.html,four
 | 
			
		||||
essential freedoms}: to run the program, to study and change the program
 | 
			
		||||
in source code form, to redistribute exact copies, and to distribute
 | 
			
		||||
modified versions.  Packages found in the GNU distribution provide only
 | 
			
		||||
software that conveys these four freedoms.
 | 
			
		||||
 | 
			
		||||
In addition, the GNU distribution follow the
 | 
			
		||||
@url{http://www.gnu.org/distros/free-system-distribution-guidelines.html,free
 | 
			
		||||
software distribution guidelines}.  Among other things, these guidelines
 | 
			
		||||
reject non-free firmware, recommendations of non-free software, and
 | 
			
		||||
discuss ways to deal with trademarks and patents.
 | 
			
		||||
 | 
			
		||||
Some packages contain a small and optional subset that violates the
 | 
			
		||||
above guidelines, for instance because this subset is itself non-free
 | 
			
		||||
code.  When that happens, the offending items are removed with
 | 
			
		||||
appropriate patches or code snippets in the package definition's
 | 
			
		||||
@code{origin} form (@pxref{Defining Packages}).  That way, @code{guix
 | 
			
		||||
build --source} returns the ``freed'' source rather than the unmodified
 | 
			
		||||
upstream source.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@node Package Naming
 | 
			
		||||
@subsection Package Naming
 | 
			
		||||
 | 
			
		||||
A package has actually two names associated with it:
 | 
			
		||||
First, there is the name of the @emph{Scheme variable}, the one following
 | 
			
		||||
@code{define-public}.  By this name, the package can be made known in the
 | 
			
		||||
Scheme code, for instance as input to another package.  Second, there is
 | 
			
		||||
the string in the @code{name} field of a package definition.  This name
 | 
			
		||||
is used by package management commands such as
 | 
			
		||||
@command{guix package} and @command{guix build}.
 | 
			
		||||
 | 
			
		||||
Both are usually the same and correspond to the lowercase conversion of
 | 
			
		||||
the project name chosen upstream, with underscores replaced with
 | 
			
		||||
hyphens.  For instance, GNUnet is available as @code{gnunet}, and
 | 
			
		||||
SDL_net as @code{sdl-net}.
 | 
			
		||||
 | 
			
		||||
We do not add @code{lib} prefixes for library packages, unless these are
 | 
			
		||||
already part of the official project name.  But see @pxref{Python
 | 
			
		||||
Modules} and @ref{Perl Modules} for special rules concerning modules for
 | 
			
		||||
the Python and Perl languages.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@node Version Numbers
 | 
			
		||||
@subsection Version Numbers
 | 
			
		||||
 | 
			
		||||
We usually package only the latest version of a given free software
 | 
			
		||||
project.  But sometimes, for instance for incompatible library versions,
 | 
			
		||||
two (or more) versions of the same package are needed.  These require
 | 
			
		||||
different Scheme variable names.  We use the name as defined
 | 
			
		||||
in @ref{Package Naming}
 | 
			
		||||
for the most recent version; previous versions use the same name, suffixed
 | 
			
		||||
by @code{-} and the smallest prefix of the version number that may
 | 
			
		||||
distinguish the two versions.
 | 
			
		||||
 | 
			
		||||
The name inside the package definition is the same for all versions of a
 | 
			
		||||
package and does not contain any version number.
 | 
			
		||||
 | 
			
		||||
For instance, the versions 2.24.20 and 3.9.12 of GTK+ may be packaged as follows:
 | 
			
		||||
 | 
			
		||||
@example
 | 
			
		||||
(define-public gtk+
 | 
			
		||||
  (package
 | 
			
		||||
   (name "gtk+")
 | 
			
		||||
   (version "3.9.12")
 | 
			
		||||
   ...))
 | 
			
		||||
(define-public gtk+-2
 | 
			
		||||
  (package
 | 
			
		||||
   (name "gtk+")
 | 
			
		||||
   (version "2.24.20")
 | 
			
		||||
   ...))
 | 
			
		||||
@end example
 | 
			
		||||
If we also wanted GTK+ 3.8.2, this would be packaged as
 | 
			
		||||
@example
 | 
			
		||||
(define-public gtk+-3.8
 | 
			
		||||
  (package
 | 
			
		||||
   (name "gtk+")
 | 
			
		||||
   (version "3.8.2")
 | 
			
		||||
   ...))
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@node Python Modules
 | 
			
		||||
@subsection Python Modules
 | 
			
		||||
 | 
			
		||||
We currently package Python 2 and Python 3, under the Scheme variable names
 | 
			
		||||
@code{python-2} and @code{python} as explained in @ref{Version Numbers}.
 | 
			
		||||
To avoid confusion and naming clashes with other programming languages, it
 | 
			
		||||
seems desirable that the name of a package for a Python module contains
 | 
			
		||||
the word @code{python}.
 | 
			
		||||
 | 
			
		||||
Some modules are compatible with only one version of Python, others with both.
 | 
			
		||||
If the package Foo compiles only with Python 3, we name it
 | 
			
		||||
@code{python-foo}; if it compiles only with Python 2, we name it
 | 
			
		||||
@code{python2-foo}. If it is compatible with both versions, we create two
 | 
			
		||||
packages with the corresponding names.
 | 
			
		||||
 | 
			
		||||
If a project already contains the word @code{python}, we drop this;
 | 
			
		||||
for instance, the module python-dateutil is packaged under the names
 | 
			
		||||
@code{python-dateutil} and @code{python2-dateutil}.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@node Perl Modules
 | 
			
		||||
@subsection Perl Modules
 | 
			
		||||
 | 
			
		||||
Perl programs standing for themselves are named as any other package,
 | 
			
		||||
using the lowercase upstream name.
 | 
			
		||||
For Perl packages containing a single class, we use the lowercase class name,
 | 
			
		||||
replace all occurrences of @code{::} by dashes and prepend the prefix
 | 
			
		||||
@code{perl-}.
 | 
			
		||||
So the class @code{XML::Parser} becomes @code{perl-xml-parser}.
 | 
			
		||||
Modules containing several classes keep their lowercase upstream name and
 | 
			
		||||
are also prepended by @code{perl-}.  Such modules tend to have the word
 | 
			
		||||
@code{perl} somewhere in their name, which gets dropped in favor of the
 | 
			
		||||
prefix.  For instance, @code{libwww-perl} becomes @code{perl-libwww}.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@node Bootstrapping
 | 
			
		||||
@section Bootstrapping
 | 
			
		||||
 | 
			
		||||
@c Adapted from the ELS 2013 paper.
 | 
			
		||||
 | 
			
		||||
@cindex bootstrapping
 | 
			
		||||
 | 
			
		||||
Bootstrapping in our context refers to how the distribution gets built
 | 
			
		||||
``from nothing''.  Remember that the build environment of a derivation
 | 
			
		||||
contains nothing but its declared inputs (@pxref{Introduction}).  So
 | 
			
		||||
there's an obvious chicken-and-egg problem: how does the first package
 | 
			
		||||
get built?  How does the first compiler get compiled?  Note that this is
 | 
			
		||||
a question of interest only to the curious hacker, not to the regular
 | 
			
		||||
user, so you can shamelessly skip this section if you consider yourself
 | 
			
		||||
a ``regular user''.
 | 
			
		||||
 | 
			
		||||
@cindex bootstrap binaries
 | 
			
		||||
The GNU system is primarily made of C code, with libc at its core.  The
 | 
			
		||||
GNU build system itself assumes the availability of a Bourne shell and
 | 
			
		||||
command-line tools provided by GNU Coreutils, Awk, Findutils, `sed', and
 | 
			
		||||
`grep'.  Furthermore, build programs---programs that run
 | 
			
		||||
@code{./configure}, @code{make}, etc.---are written in Guile Scheme
 | 
			
		||||
(@pxref{Derivations}).  Consequently, to be able to build anything at
 | 
			
		||||
all, from scratch, Guix relies on pre-built binaries of Guile, GCC,
 | 
			
		||||
Binutils, libc, and the other packages mentioned above---the
 | 
			
		||||
@dfn{bootstrap binaries}.
 | 
			
		||||
 | 
			
		||||
These bootstrap binaries are ``taken for granted'', though we can also
 | 
			
		||||
re-create them if needed (more on that later).
 | 
			
		||||
 | 
			
		||||
@unnumberedsubsec Preparing to Use the Bootstrap Binaries
 | 
			
		||||
 | 
			
		||||
@c As of Emacs 24.3, Info-mode displays the image, but since it's a
 | 
			
		||||
@c large image, it's hard to scroll.  Oh well.
 | 
			
		||||
@image{images/bootstrap-graph,6in,,Dependency graph of the early bootstrap derivations}
 | 
			
		||||
 | 
			
		||||
The figure above shows the very beginning of the dependency graph of the
 | 
			
		||||
distribution, corresponding to the package definitions of the @code{(gnu
 | 
			
		||||
packages bootstrap)} module.  At this level of detail, things are
 | 
			
		||||
slightly complex.  First, Guile itself consists of an ELF executable,
 | 
			
		||||
along with many source and compiled Scheme files that are dynamically
 | 
			
		||||
loaded when it runs.  This gets stored in the @file{guile-2.0.7.tar.xz}
 | 
			
		||||
tarball shown in this graph.  This tarball is part of Guix's ``source''
 | 
			
		||||
distribution, and gets inserted into the store with @code{add-to-store}
 | 
			
		||||
(@pxref{The Store}).
 | 
			
		||||
 | 
			
		||||
But how do we write a derivation that unpacks this tarball and adds it
 | 
			
		||||
to the store?  To solve this problem, the @code{guile-bootstrap-2.0.drv}
 | 
			
		||||
derivation---the first one that gets built---uses @code{bash} as its
 | 
			
		||||
builder, which runs @code{build-bootstrap-guile.sh}, which in turn calls
 | 
			
		||||
@code{tar} to unpack the tarball.  Thus, @file{bash}, @file{tar},
 | 
			
		||||
@file{xz}, and @file{mkdir} are statically-linked binaries, also part of
 | 
			
		||||
the Guix source distribution, whose sole purpose is to allow the Guile
 | 
			
		||||
tarball to be unpacked.
 | 
			
		||||
 | 
			
		||||
Once @code{guile-bootstrap-2.0.drv} is built, we have a functioning
 | 
			
		||||
Guile that can be used to run subsequent build programs.  Its first task
 | 
			
		||||
is to download tarballs containing the other pre-built binaries---this
 | 
			
		||||
is what the @code{.tar.xz.drv} derivations do.  Guix modules such as
 | 
			
		||||
@code{ftp-client.scm} are used for this purpose.  The
 | 
			
		||||
@code{module-import.drv} derivations import those modules in a directory
 | 
			
		||||
in the store, using the original layout.  The
 | 
			
		||||
@code{module-import-compiled.drv} derivations compile those modules, and
 | 
			
		||||
write them in an output directory with the right layout.  This
 | 
			
		||||
corresponds to the @code{#:modules} argument of
 | 
			
		||||
@code{build-expression->derivation} (@pxref{Derivations}).
 | 
			
		||||
 | 
			
		||||
Finally, the various tarballs are unpacked by the
 | 
			
		||||
derivations @code{gcc-bootstrap-0.drv}, @code{glibc-bootstrap-0.drv},
 | 
			
		||||
etc., at which point we have a working C tool chain.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@unnumberedsubsec Building the Build Tools
 | 
			
		||||
 | 
			
		||||
@c TODO: Add a package-level dependency graph generated from (gnu
 | 
			
		||||
@c packages base).
 | 
			
		||||
 | 
			
		||||
Bootstrapping is complete when we have a full tool chain that does not
 | 
			
		||||
depend on the pre-built bootstrap tools discussed above.  This
 | 
			
		||||
no-dependency requirement is verified by checking whether the files of
 | 
			
		||||
the final tool chain contain references to the @file{/gnu/store}
 | 
			
		||||
directories of the bootstrap inputs.  The process that leads to this
 | 
			
		||||
``final'' tool chain is described by the package definitions found in
 | 
			
		||||
the @code{(gnu packages base)} module.
 | 
			
		||||
 | 
			
		||||
@c See <http://lists.gnu.org/archive/html/gnu-system-discuss/2012-10/msg00000.html>.
 | 
			
		||||
The first tool that gets built with the bootstrap binaries is
 | 
			
		||||
GNU Make, which is a prerequisite for all the following packages.
 | 
			
		||||
From there Findutils and Diffutils get built.
 | 
			
		||||
 | 
			
		||||
Then come the first-stage Binutils and GCC, built as pseudo cross
 | 
			
		||||
tools---i.e., with @code{--target} equal to @code{--host}.  They are
 | 
			
		||||
used to build libc.  Thanks to this cross-build trick, this libc is
 | 
			
		||||
guaranteed not to hold any reference to the initial tool chain.
 | 
			
		||||
 | 
			
		||||
From there the final Binutils and GCC are built.  GCC uses @code{ld}
 | 
			
		||||
from the final Binutils, and links programs against the just-built libc.
 | 
			
		||||
This tool chain is used to build the other packages used by Guix and by
 | 
			
		||||
the GNU Build System: Guile, Bash, Coreutils, etc.
 | 
			
		||||
 | 
			
		||||
And voilà!  At this point we have the complete set of build tools that
 | 
			
		||||
the GNU Build System expects.  These are in the @code{%final-inputs}
 | 
			
		||||
variables of the @code{(gnu packages base)} module, and are implicitly
 | 
			
		||||
used by any package that uses @code{gnu-build-system} (@pxref{Defining
 | 
			
		||||
Packages}).
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@unnumberedsubsec Building the Bootstrap Binaries
 | 
			
		||||
 | 
			
		||||
Because the final tool chain does not depend on the bootstrap binaries,
 | 
			
		||||
those rarely need to be updated.  Nevertheless, it is useful to have an
 | 
			
		||||
automated way to produce them, should an update occur, and this is what
 | 
			
		||||
the @code{(gnu packages make-bootstrap)} module provides.
 | 
			
		||||
 | 
			
		||||
The following command builds the tarballs containing the bootstrap
 | 
			
		||||
binaries (Guile, Binutils, GCC, libc, and a tarball containing a mixture
 | 
			
		||||
of Coreutils and other basic command-line tools):
 | 
			
		||||
 | 
			
		||||
@example
 | 
			
		||||
guix build bootstrap-tarballs
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
The generated tarballs are those that should be referred to in the
 | 
			
		||||
@code{(gnu packages bootstrap)} module mentioned at the beginning of
 | 
			
		||||
this section.
 | 
			
		||||
 | 
			
		||||
Still here?  Then perhaps by now you've started to wonder: when do we
 | 
			
		||||
reach a fixed point?  That is an interesting question!  The answer is
 | 
			
		||||
unknown, but if you would like to investigate further (and have
 | 
			
		||||
significant computational and storage resources to do so), then let us
 | 
			
		||||
know.
 | 
			
		||||
 | 
			
		||||
@node Porting
 | 
			
		||||
@section Porting to a New Platform
 | 
			
		||||
 | 
			
		||||
As discussed above, the GNU distribution is self-contained, and
 | 
			
		||||
self-containment is achieved by relying on pre-built ``bootstrap
 | 
			
		||||
binaries'' (@pxref{Bootstrapping}).  These binaries are specific to an
 | 
			
		||||
operating system kernel, CPU architecture, and application binary
 | 
			
		||||
interface (ABI).  Thus, to port the distribution to a platform that is
 | 
			
		||||
not yet supported, one must build those bootstrap binaries, and update
 | 
			
		||||
the @code{(gnu packages bootstrap)} module to use them on that platform.
 | 
			
		||||
 | 
			
		||||
Fortunately, Guix can @emph{cross compile} those bootstrap binaries.
 | 
			
		||||
When everything goes well, and assuming the GNU tool chain supports the
 | 
			
		||||
target platform, this can be as simple as running a command like this
 | 
			
		||||
one:
 | 
			
		||||
 | 
			
		||||
@example
 | 
			
		||||
guix build --target=armv5tel-linux-gnueabi bootstrap-tarballs
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
Once these are built, the @code{(gnu packages bootstrap)} module needs
 | 
			
		||||
to be updated to refer to these binaries on the target platform.  In
 | 
			
		||||
addition, the @code{glibc-dynamic-linker} procedure in that module must
 | 
			
		||||
be augmented to return the right file name for libc's dynamic linker on
 | 
			
		||||
that platform; likewise, @code{system->linux-architecture} in @code{(gnu
 | 
			
		||||
packages linux)} must be taught about the new platform.
 | 
			
		||||
 | 
			
		||||
In practice, there may be some complications.  First, it may be that the
 | 
			
		||||
extended GNU triplet that specifies an ABI (like the @code{eabi} suffix
 | 
			
		||||
above) is not recognized by all the GNU tools.  Typically, glibc
 | 
			
		||||
recognizes some of these, whereas GCC uses an extra @code{--with-abi}
 | 
			
		||||
configure flag (see @code{gcc.scm} for examples of how to handle this).
 | 
			
		||||
Second, some of the required packages could fail to build for that
 | 
			
		||||
platform.  Lastly, the generated binaries could be broken for some
 | 
			
		||||
reason.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@c *********************************************************************
 | 
			
		||||
@node Contributing
 | 
			
		||||
@chapter Contributing
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Reference in a new issue