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
 | 
					@menu
 | 
				
			||||||
* System Installation::         Installing the whole operating system.
 | 
					* System Installation::         Installing the whole operating system.
 | 
				
			||||||
 | 
					* System Configuration::        Configuring a GNU system.
 | 
				
			||||||
* Installing Debugging Files::  Feeding the debugger.
 | 
					* Installing Debugging Files::  Feeding the debugger.
 | 
				
			||||||
* Package Modules::             Packages from the programmer's viewpoint.
 | 
					* Package Modules::             Packages from the programmer's viewpoint.
 | 
				
			||||||
* Packaging Guidelines::        Growing the distribution.
 | 
					* Packaging Guidelines::        Growing the distribution.
 | 
				
			||||||
* Bootstrapping::               GNU/Linux built from scratch.
 | 
					* Bootstrapping::               GNU/Linux built from scratch.
 | 
				
			||||||
* Porting::                     Targeting another platform or kernel.
 | 
					* Porting::                     Targeting another platform or kernel.
 | 
				
			||||||
* System Configuration::        Configuring a GNU system.
 | 
					 | 
				
			||||||
@end menu
 | 
					@end menu
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Building this distribution is a cooperative effort, and you are invited
 | 
					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
 | 
					@file{gnu/system/install.scm} in the source tree for more information
 | 
				
			||||||
about the installation image.
 | 
					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
 | 
					@node System Configuration
 | 
				
			||||||
@section 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}).
 | 
					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 *********************************************************************
 | 
					@c *********************************************************************
 | 
				
			||||||
@node Contributing
 | 
					@node Contributing
 | 
				
			||||||
@chapter Contributing
 | 
					@chapter Contributing
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Reference in a new issue