Merge branch 'master' into dbus-update
This commit is contained in:
		
						commit
						eed588d997
					
				
					 74 changed files with 2143 additions and 810 deletions
				
			
		| 
						 | 
					@ -23,6 +23,7 @@
 | 
				
			||||||
   (eval . (put 'lambda* 'scheme-indent-function 1))
 | 
					   (eval . (put 'lambda* 'scheme-indent-function 1))
 | 
				
			||||||
   (eval . (put 'substitute* 'scheme-indent-function 1))
 | 
					   (eval . (put 'substitute* 'scheme-indent-function 1))
 | 
				
			||||||
   (eval . (put 'modify-phases 'scheme-indent-function 1))
 | 
					   (eval . (put 'modify-phases 'scheme-indent-function 1))
 | 
				
			||||||
 | 
					   (eval . (put 'modify-services 'scheme-indent-function 1))
 | 
				
			||||||
   (eval . (put 'with-directory-excursion 'scheme-indent-function 1))
 | 
					   (eval . (put 'with-directory-excursion 'scheme-indent-function 1))
 | 
				
			||||||
   (eval . (put 'package 'scheme-indent-function 0))
 | 
					   (eval . (put 'package 'scheme-indent-function 0))
 | 
				
			||||||
   (eval . (put 'origin 'scheme-indent-function 0))
 | 
					   (eval . (put 'origin 'scheme-indent-function 0))
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -253,6 +253,7 @@ SH_TESTS =					\
 | 
				
			||||||
  tests/guix-archive.sh				\
 | 
					  tests/guix-archive.sh				\
 | 
				
			||||||
  tests/guix-authenticate.sh			\
 | 
					  tests/guix-authenticate.sh			\
 | 
				
			||||||
  tests/guix-environment.sh			\
 | 
					  tests/guix-environment.sh			\
 | 
				
			||||||
 | 
					  tests/guix-environment-container.sh		\
 | 
				
			||||||
  tests/guix-graph.sh				\
 | 
					  tests/guix-graph.sh				\
 | 
				
			||||||
  tests/guix-lint.sh
 | 
					  tests/guix-lint.sh
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -27,6 +27,7 @@ the installation instructions (@pxref{Requirements}).
 | 
				
			||||||
@item @url{http://gnu.org/software/autoconf/, GNU Autoconf};
 | 
					@item @url{http://gnu.org/software/autoconf/, GNU Autoconf};
 | 
				
			||||||
@item @url{http://gnu.org/software/automake/, GNU Automake};
 | 
					@item @url{http://gnu.org/software/automake/, GNU Automake};
 | 
				
			||||||
@item @url{http://gnu.org/software/gettext/, GNU Gettext};
 | 
					@item @url{http://gnu.org/software/gettext/, GNU Gettext};
 | 
				
			||||||
 | 
					@item @url{http://gnu.org/software/texinfo/, GNU Texinfo};
 | 
				
			||||||
@item @url{http://www.graphviz.org/, Graphviz};
 | 
					@item @url{http://www.graphviz.org/, Graphviz};
 | 
				
			||||||
@item @url{http://www.gnu.org/software/help2man/, GNU Help2man (optional)}.
 | 
					@item @url{http://www.gnu.org/software/help2man/, GNU Help2man (optional)}.
 | 
				
			||||||
@end itemize
 | 
					@end itemize
 | 
				
			||||||
| 
						 | 
					@ -86,6 +87,30 @@ Similarly, for a Guile session using the Guix modules:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@example
 | 
					@example
 | 
				
			||||||
$ ./pre-inst-env guile -c '(use-modules (guix utils)) (pk (%current-system))'
 | 
					$ ./pre-inst-env guile -c '(use-modules (guix utils)) (pk (%current-system))'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					;;; ("x86_64-linux")
 | 
				
			||||||
 | 
					@end example
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@noindent
 | 
				
			||||||
 | 
					@cindex REPL
 | 
				
			||||||
 | 
					@cindex read-eval-print loop
 | 
				
			||||||
 | 
					@dots{} and for a REPL (@pxref{Using Guile Interactively,,, guile, Guile
 | 
				
			||||||
 | 
					Reference Manual}):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@example
 | 
				
			||||||
 | 
					$ ./pre-inst-env guile
 | 
				
			||||||
 | 
					scheme@@(guile-user)> ,use(guix)
 | 
				
			||||||
 | 
					scheme@@(guile-user)> ,use(gnu)
 | 
				
			||||||
 | 
					scheme@@(guile-user)> (define snakes
 | 
				
			||||||
 | 
					                       (fold-packages
 | 
				
			||||||
 | 
					                         (lambda (package lst)
 | 
				
			||||||
 | 
					                           (if (string-prefix? "python"
 | 
				
			||||||
 | 
					                                               (package-name package))
 | 
				
			||||||
 | 
					                               (cons package lst)
 | 
				
			||||||
 | 
					                               lst))
 | 
				
			||||||
 | 
					                         '()))
 | 
				
			||||||
 | 
					scheme@@(guile-user)> (length snakes)
 | 
				
			||||||
 | 
					$1 = 361
 | 
				
			||||||
@end example
 | 
					@end example
 | 
				
			||||||
 | 
					
 | 
				
			||||||
The @command{pre-inst-env} script sets up all the environment variables
 | 
					The @command{pre-inst-env} script sets up all the environment variables
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -227,6 +227,8 @@ prefix argument is used.  This has the same meaning as @code{--manifest}
 | 
				
			||||||
option (@pxref{Invoking guix package}).
 | 
					option (@pxref{Invoking guix package}).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@item C-c C-z
 | 
					@item C-c C-z
 | 
				
			||||||
 | 
					@cindex REPL
 | 
				
			||||||
 | 
					@cindex read-eval-print loop
 | 
				
			||||||
Go to the Guix REPL (@pxref{The REPL,,, geiser, Geiser User Manual}).
 | 
					Go to the Guix REPL (@pxref{The REPL,,, geiser, Geiser User Manual}).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@item h
 | 
					@item h
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										246
									
								
								doc/guix.texi
									
										
									
									
									
								
							
							
						
						
									
										246
									
								
								doc/guix.texi
									
										
									
									
									
								
							| 
						 | 
					@ -233,7 +233,8 @@ software packages, etc.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@cindex functional package management
 | 
					@cindex functional package management
 | 
				
			||||||
The term @dfn{functional} refers to a specific package management
 | 
					The term @dfn{functional} refers to a specific package management
 | 
				
			||||||
discipline.  In Guix, the package build and installation process is seen
 | 
					discipline pioneered by Nix (@pxref{Acknowledgments}).
 | 
				
			||||||
 | 
					In Guix, the package build and installation process is seen
 | 
				
			||||||
as a function, in the mathematical sense.  That function takes inputs,
 | 
					as a function, in the mathematical sense.  That function takes inputs,
 | 
				
			||||||
such as build scripts, a compiler, and libraries, and
 | 
					such as build scripts, a compiler, and libraries, and
 | 
				
			||||||
returns an installed package.  As a pure function, its result depends
 | 
					returns an installed package.  As a pure function, its result depends
 | 
				
			||||||
| 
						 | 
					@ -3615,6 +3616,19 @@ The @var{options} may be zero or more of the following:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@table @code
 | 
					@table @code
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@item --file=@var{file}
 | 
				
			||||||
 | 
					@itemx -f @var{file}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Build the package or derivation that the code within @var{file}
 | 
				
			||||||
 | 
					evaluates to.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					As an example, @var{file} might contain a package definition like this
 | 
				
			||||||
 | 
					(@pxref{Defining Packages}):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@example
 | 
				
			||||||
 | 
					@verbatiminclude package-hello.scm
 | 
				
			||||||
 | 
					@end example
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@item --expression=@var{expr}
 | 
					@item --expression=@var{expr}
 | 
				
			||||||
@itemx -e @var{expr}
 | 
					@itemx -e @var{expr}
 | 
				
			||||||
Build the package or derivation @var{expr} evaluates to.
 | 
					Build the package or derivation @var{expr} evaluates to.
 | 
				
			||||||
| 
						 | 
					@ -4263,8 +4277,8 @@ inconvenient.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@item --type=@var{updater}
 | 
					@item --type=@var{updater}
 | 
				
			||||||
@itemx -t @var{updater}
 | 
					@itemx -t @var{updater}
 | 
				
			||||||
Select only packages handled by @var{updater}.  Currently, @var{updater}
 | 
					Select only packages handled by @var{updater} (may be a comma-separated
 | 
				
			||||||
may be one of:
 | 
					list of updaters).  Currently, @var{updater} may be one of:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@table @code
 | 
					@table @code
 | 
				
			||||||
@item gnu
 | 
					@item gnu
 | 
				
			||||||
| 
						 | 
					@ -4279,7 +4293,7 @@ For instance, the following commands only checks for updates of Emacs
 | 
				
			||||||
packages hosted at @code{elpa.gnu.org} and updates of CRAN packages:
 | 
					packages hosted at @code{elpa.gnu.org} and updates of CRAN packages:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@example
 | 
					@example
 | 
				
			||||||
$ guix refresh -t elpa -t cran
 | 
					$ guix refresh --type=elpa,cran
 | 
				
			||||||
gnu/packages/statistics.scm:819:13: r-testthat would be upgraded from 0.10.0 to 0.11.0
 | 
					gnu/packages/statistics.scm:819:13: r-testthat would be upgraded from 0.10.0 to 0.11.0
 | 
				
			||||||
gnu/packages/emacs.scm:856:13: emacs-auctex would be upgraded from 11.88.6 to 11.88.9
 | 
					gnu/packages/emacs.scm:856:13: emacs-auctex would be upgraded from 11.88.6 to 11.88.9
 | 
				
			||||||
@end example
 | 
					@end example
 | 
				
			||||||
| 
						 | 
					@ -4305,6 +4319,10 @@ be used when passing @command{guix refresh} one or more package names:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@table @code
 | 
					@table @code
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@item --list-updaters
 | 
				
			||||||
 | 
					@itemx -L
 | 
				
			||||||
 | 
					List available updaters and exit (see @option{--type} above.)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@item --list-dependent
 | 
					@item --list-dependent
 | 
				
			||||||
@itemx -l
 | 
					@itemx -l
 | 
				
			||||||
List top-level dependent packages that would need to be rebuilt as a
 | 
					List top-level dependent packages that would need to be rebuilt as a
 | 
				
			||||||
| 
						 | 
					@ -4681,6 +4699,32 @@ NumPy:
 | 
				
			||||||
guix environment --ad-hoc python2-numpy python-2.7 -- python
 | 
					guix environment --ad-hoc python2-numpy python-2.7 -- python
 | 
				
			||||||
@end example
 | 
					@end example
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Furthermore, one might want the dependencies of a package and also some
 | 
				
			||||||
 | 
					additional packages that are not build-time or runtime dependencies, but
 | 
				
			||||||
 | 
					are useful when developing nonetheless.  Because of this, the
 | 
				
			||||||
 | 
					@code{--ad-hoc} flag is positional.  Packages appearing before
 | 
				
			||||||
 | 
					@code{--ad-hoc} are interpreted as packages whose dependencies will be
 | 
				
			||||||
 | 
					added to the environment.  Packages appearing after are interpreted as
 | 
				
			||||||
 | 
					packages that will be added to the environment directly.  For example,
 | 
				
			||||||
 | 
					the following command creates a Guix development environment that
 | 
				
			||||||
 | 
					additionally includes Git and strace:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@example
 | 
				
			||||||
 | 
					guix environment guix --ad-hoc git strace
 | 
				
			||||||
 | 
					@end example
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Sometimes it is desirable to isolate the environment as much as
 | 
				
			||||||
 | 
					possible, for maximal purity and reproducibility.  In particular, when
 | 
				
			||||||
 | 
					using Guix on a host distro that is not GuixSD, it is desirable to
 | 
				
			||||||
 | 
					prevent access to @file{/usr/bin} and other system-wide resources from
 | 
				
			||||||
 | 
					the development environment.  For example, the following command spawns
 | 
				
			||||||
 | 
					a Guile REPL in a ``container'' where only the store and the current
 | 
				
			||||||
 | 
					working directory are mounted:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@example
 | 
				
			||||||
 | 
					guix environment --ad-hoc --container guile -- guile
 | 
				
			||||||
 | 
					@end example
 | 
				
			||||||
 | 
					
 | 
				
			||||||
The available options are summarized below.
 | 
					The available options are summarized below.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@table @code
 | 
					@table @code
 | 
				
			||||||
| 
						 | 
					@ -4729,6 +4773,12 @@ Note that this example implicitly asks for the default output of
 | 
				
			||||||
specific output---e.g., @code{glib:bin} asks for the @code{bin} output
 | 
					specific output---e.g., @code{glib:bin} asks for the @code{bin} output
 | 
				
			||||||
of @code{glib} (@pxref{Packages with Multiple Outputs}).
 | 
					of @code{glib} (@pxref{Packages with Multiple Outputs}).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This option may be composed with the default behavior of @command{guix
 | 
				
			||||||
 | 
					environment}.  Packages appearing before @code{--ad-hoc} are interpreted
 | 
				
			||||||
 | 
					as packages whose dependencies will be added to the environment, the
 | 
				
			||||||
 | 
					default behavior.  Packages appearing after are interpreted as packages
 | 
				
			||||||
 | 
					that will be added to the environment directly.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@item --pure
 | 
					@item --pure
 | 
				
			||||||
Unset existing environment variables when building the new environment.
 | 
					Unset existing environment variables when building the new environment.
 | 
				
			||||||
This has the effect of creating an environment in which search paths
 | 
					This has the effect of creating an environment in which search paths
 | 
				
			||||||
| 
						 | 
					@ -4741,6 +4791,49 @@ environment.
 | 
				
			||||||
@item --system=@var{system}
 | 
					@item --system=@var{system}
 | 
				
			||||||
@itemx -s @var{system}
 | 
					@itemx -s @var{system}
 | 
				
			||||||
Attempt to build for @var{system}---e.g., @code{i686-linux}.
 | 
					Attempt to build for @var{system}---e.g., @code{i686-linux}.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@item --container
 | 
				
			||||||
 | 
					@itemx -C
 | 
				
			||||||
 | 
					@cindex container
 | 
				
			||||||
 | 
					Run @var{command} within an isolated container.  The current working
 | 
				
			||||||
 | 
					directory outside the container is mapped to @file{/env} inside the
 | 
				
			||||||
 | 
					container.  Additionally, the spawned process runs as the current user
 | 
				
			||||||
 | 
					outside the container, but has root privileges in the context of the
 | 
				
			||||||
 | 
					container.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@item --network
 | 
				
			||||||
 | 
					@itemx -N
 | 
				
			||||||
 | 
					For containers, share the network namespace with the host system.
 | 
				
			||||||
 | 
					Containers created without this flag only have access to the loopback
 | 
				
			||||||
 | 
					device.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@item --expose=@var{source}[=@var{target}]
 | 
				
			||||||
 | 
					For containers, expose the file system @var{source} from the host system
 | 
				
			||||||
 | 
					as the read-only file system @var{target} within the container.  If
 | 
				
			||||||
 | 
					@var{target} is not specified, @var{source} is used as the target mount
 | 
				
			||||||
 | 
					point in the container.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The example below spawns a Guile REPL in a container in which the user's
 | 
				
			||||||
 | 
					home directory is accessible read-only via the @file{/exchange}
 | 
				
			||||||
 | 
					directory:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@example
 | 
				
			||||||
 | 
					guix environment --container --expose=$HOME=/exchange guile -- guile
 | 
				
			||||||
 | 
					@end example
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@item --share
 | 
				
			||||||
 | 
					For containers, share the file system @var{source} from the host system
 | 
				
			||||||
 | 
					as the writable file system @var{target} within the container.  If
 | 
				
			||||||
 | 
					@var{target} is not specified, @var{source} is used as the target mount
 | 
				
			||||||
 | 
					point in the container.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The example below spawns a Guile REPL in a container in which the user's
 | 
				
			||||||
 | 
					home directory is accessible for both reading and writing via the
 | 
				
			||||||
 | 
					@file{/exchange} directory:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@example
 | 
				
			||||||
 | 
					guix environment --container --share=$HOME=/exchange guile -- guile
 | 
				
			||||||
 | 
					@end example
 | 
				
			||||||
@end table
 | 
					@end table
 | 
				
			||||||
 | 
					
 | 
				
			||||||
It also supports all of the common build options that @command{guix
 | 
					It also supports all of the common build options that @command{guix
 | 
				
			||||||
| 
						 | 
					@ -5283,7 +5376,7 @@ addition to the per-user profiles (@pxref{Invoking guix package}).  The
 | 
				
			||||||
for basic user and administrator tasks---including the GNU Core
 | 
					for basic user and administrator tasks---including the GNU Core
 | 
				
			||||||
Utilities, the GNU Networking Utilities, the GNU Zile lightweight text
 | 
					Utilities, the GNU Networking Utilities, the GNU Zile lightweight text
 | 
				
			||||||
editor, @command{find}, @command{grep}, etc.  The example above adds
 | 
					editor, @command{find}, @command{grep}, etc.  The example above adds
 | 
				
			||||||
Emacs to those, taken from the @code{(gnu packages emacs)} module
 | 
					tcpdump to those, taken from the @code{(gnu packages admin)} module
 | 
				
			||||||
(@pxref{Package Modules}).
 | 
					(@pxref{Package Modules}).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@vindex %base-services
 | 
					@vindex %base-services
 | 
				
			||||||
| 
						 | 
					@ -5291,16 +5384,40 @@ The @code{services} field lists @dfn{system services} to be made
 | 
				
			||||||
available when the system starts (@pxref{Services}).
 | 
					available when the system starts (@pxref{Services}).
 | 
				
			||||||
The @code{operating-system} declaration above specifies that, in
 | 
					The @code{operating-system} declaration above specifies that, in
 | 
				
			||||||
addition to the basic services, we want the @command{lshd} secure shell
 | 
					addition to the basic services, we want the @command{lshd} secure shell
 | 
				
			||||||
daemon listening on port 2222, and allowing remote @code{root} logins
 | 
					daemon listening on port 2222 (@pxref{Networking Services,
 | 
				
			||||||
(@pxref{Invoking lshd,,, lsh, GNU lsh Manual}).  Under the hood,
 | 
					@code{lsh-service}}).  Under the hood,
 | 
				
			||||||
@code{lsh-service} arranges so that @code{lshd} is started with the
 | 
					@code{lsh-service} arranges so that @code{lshd} is started with the
 | 
				
			||||||
right command-line options, possibly with supporting configuration files
 | 
					right command-line options, possibly with supporting configuration files
 | 
				
			||||||
generated as needed (@pxref{Defining Services}).  @xref{operating-system
 | 
					generated as needed (@pxref{Defining Services}).
 | 
				
			||||||
Reference}, for details about the available @code{operating-system}
 | 
					
 | 
				
			||||||
fields.
 | 
					@cindex customization, of services
 | 
				
			||||||
 | 
					@findex modify-services
 | 
				
			||||||
 | 
					Occasionally, instead of using the base services as is, you will want to
 | 
				
			||||||
 | 
					customize them.  For instance, to change the configuration of
 | 
				
			||||||
 | 
					@code{guix-daemon} and Mingetty (the console log-in), you may write the
 | 
				
			||||||
 | 
					following instead of @var{%base-services}:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@lisp
 | 
				
			||||||
 | 
					(modify-services %base-services
 | 
				
			||||||
 | 
					  (guix-service-type config =>
 | 
				
			||||||
 | 
					                     (guix-configuration
 | 
				
			||||||
 | 
					                      (inherit config)
 | 
				
			||||||
 | 
					                      (use-substitutes? #f)
 | 
				
			||||||
 | 
					                      (extra-options '("--gc-keep-outputs"))))
 | 
				
			||||||
 | 
					  (mingetty-service-type config =>
 | 
				
			||||||
 | 
					                         (mingetty-configuration
 | 
				
			||||||
 | 
					                          (inherit config)
 | 
				
			||||||
 | 
					                          (motd (plain-file "motd" "Hi there!")))))
 | 
				
			||||||
 | 
					@end lisp
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@noindent
 | 
				
			||||||
 | 
					The effect here is to change the options passed to @command{guix-daemon}
 | 
				
			||||||
 | 
					when it is started, as well as the ``message of the day'' that appears
 | 
				
			||||||
 | 
					when logging in at the console.  @xref{Service Reference,
 | 
				
			||||||
 | 
					@code{modify-services}}, for more on that.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
The configuration for a typical ``desktop'' usage, with the X11 display
 | 
					The configuration for a typical ``desktop'' usage, with the X11 display
 | 
				
			||||||
server, a desktop environment, network management, an SSH server, and
 | 
					server, a desktop environment, network management, power management, and
 | 
				
			||||||
more, would look like this:
 | 
					more, would look like this:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@lisp
 | 
					@lisp
 | 
				
			||||||
| 
						 | 
					@ -5310,13 +5427,30 @@ more, would look like this:
 | 
				
			||||||
@xref{Desktop Services}, for the exact list of services provided by
 | 
					@xref{Desktop Services}, for the exact list of services provided by
 | 
				
			||||||
@var{%desktop-services}.  @xref{X.509 Certificates}, for background
 | 
					@var{%desktop-services}.  @xref{X.509 Certificates}, for background
 | 
				
			||||||
information about the @code{nss-certs} package that is used here.
 | 
					information about the @code{nss-certs} package that is used here.
 | 
				
			||||||
 | 
					@xref{operating-system Reference}, for details about all the available
 | 
				
			||||||
 | 
					@code{operating-system} fields.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Assuming the above snippet is stored in the @file{my-system-config.scm}
 | 
					Assuming the above snippet is stored in the @file{my-system-config.scm}
 | 
				
			||||||
file, the @command{guix system reconfigure my-system-config.scm} command
 | 
					file, the @command{guix system reconfigure my-system-config.scm} command
 | 
				
			||||||
instantiates that configuration, and makes it the default GRUB boot
 | 
					instantiates that configuration, and makes it the default GRUB boot
 | 
				
			||||||
entry (@pxref{Invoking guix system}).  The normal way to change the
 | 
					entry (@pxref{Invoking guix system}).
 | 
				
			||||||
system's configuration is by updating this file and re-running the
 | 
					
 | 
				
			||||||
@command{guix system} command.
 | 
					The normal way to change the system's configuration is by updating this
 | 
				
			||||||
 | 
					file and re-running @command{guix system reconfigure}.  One should never
 | 
				
			||||||
 | 
					have to touch files in @command{/etc} or to run commands that modify the
 | 
				
			||||||
 | 
					system state such as @command{useradd} or @command{grub-install}.  In
 | 
				
			||||||
 | 
					fact, you must avoid that since that would not only void your warranty
 | 
				
			||||||
 | 
					but also prevent you from rolling back to previous versions of your
 | 
				
			||||||
 | 
					system, should you ever need to.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@cindex roll-back, of the operating system
 | 
				
			||||||
 | 
					Speaking of roll-back, each time you run @command{guix system
 | 
				
			||||||
 | 
					reconfigure}, a new @dfn{generation} of the system is created---without
 | 
				
			||||||
 | 
					modifying or deleting previous generations.  Old system generations get
 | 
				
			||||||
 | 
					an entry in the GRUB boot menu, allowing you to boot them in case
 | 
				
			||||||
 | 
					something went wrong with the latest generation.  Reassuring, no?  The
 | 
				
			||||||
 | 
					@command{guix system list-generations} command lists the system
 | 
				
			||||||
 | 
					generations available on disk.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
At the Scheme level, the bulk of an @code{operating-system} declaration
 | 
					At the Scheme level, the bulk of an @code{operating-system} declaration
 | 
				
			||||||
is instantiated with the following monadic procedure (@pxref{The Store
 | 
					is instantiated with the following monadic procedure (@pxref{The Store
 | 
				
			||||||
| 
						 | 
					@ -6130,6 +6264,9 @@ Whether to authorize the substitute key for @code{hydra.gnu.org}
 | 
				
			||||||
@item @code{use-substitutes?} (default: @code{#t})
 | 
					@item @code{use-substitutes?} (default: @code{#t})
 | 
				
			||||||
Whether to use substitutes.
 | 
					Whether to use substitutes.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@item @code{substitute-urls} (default: @var{%default-substitute-urls})
 | 
				
			||||||
 | 
					The list of URLs where to look for substitutes by default.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@item @code{extra-options} (default: @code{'()})
 | 
					@item @code{extra-options} (default: @code{'()})
 | 
				
			||||||
List of extra command-line options for @command{guix-daemon}.
 | 
					List of extra command-line options for @command{guix-daemon}.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -6379,6 +6516,19 @@ Last, @var{extra-config} is a list of strings or objects appended to the
 | 
				
			||||||
verbatim to the configuration file.
 | 
					verbatim to the configuration file.
 | 
				
			||||||
@end deffn
 | 
					@end deffn
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@deffn {Scheme Procedure} screen-locker-service @var{package} [@var{name}]
 | 
				
			||||||
 | 
					Add @var{package}, a package for a screen-locker or screen-saver whose
 | 
				
			||||||
 | 
					command is @var{program}, to the set of setuid programs and add a PAM entry
 | 
				
			||||||
 | 
					for it.  For example:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@lisp
 | 
				
			||||||
 | 
					(screen-locker-service xlockmore "xlock")
 | 
				
			||||||
 | 
					@end lisp
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					makes the good ol' XlockMore usable.
 | 
				
			||||||
 | 
					@end deffn
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@node Desktop Services
 | 
					@node Desktop Services
 | 
				
			||||||
@subsubsection Desktop Services
 | 
					@subsubsection Desktop Services
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -6396,7 +6546,8 @@ This is a list of services that builds upon @var{%base-services} and
 | 
				
			||||||
adds or adjust services for a typical ``desktop'' setup.
 | 
					adds or adjust services for a typical ``desktop'' setup.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
In particular, it adds a graphical login manager (@pxref{X Window,
 | 
					In particular, it adds a graphical login manager (@pxref{X Window,
 | 
				
			||||||
@code{slim-service}}), a network management tool (@pxref{Networking
 | 
					@code{slim-service}}), screen lockers,
 | 
				
			||||||
 | 
					a network management tool (@pxref{Networking
 | 
				
			||||||
Services, @code{wicd-service}}), energy and color management services,
 | 
					Services, @code{wicd-service}}), energy and color management services,
 | 
				
			||||||
the @code{elogind} login and seat manager, the Polkit privilege service,
 | 
					the @code{elogind} login and seat manager, the Polkit privilege service,
 | 
				
			||||||
the GeoClue location service, an NTP client (@pxref{Networking
 | 
					the GeoClue location service, an NTP client (@pxref{Networking
 | 
				
			||||||
| 
						 | 
					@ -7022,7 +7173,7 @@ supported:
 | 
				
			||||||
@item reconfigure
 | 
					@item reconfigure
 | 
				
			||||||
Build the operating system described in @var{file}, activate it, and
 | 
					Build the operating system described in @var{file}, activate it, and
 | 
				
			||||||
switch to it@footnote{This action is usable only on systems already
 | 
					switch to it@footnote{This action is usable only on systems already
 | 
				
			||||||
running GNU.}.
 | 
					running GuixSD.}.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
This effects all the configuration specified in @var{file}: user
 | 
					This effects all the configuration specified in @var{file}: user
 | 
				
			||||||
accounts, system services, global package list, setuid programs, etc.
 | 
					accounts, system services, global package list, setuid programs, etc.
 | 
				
			||||||
| 
						 | 
					@ -7064,6 +7215,7 @@ This command also installs GRUB on the device specified in
 | 
				
			||||||
@item vm
 | 
					@item vm
 | 
				
			||||||
@cindex virtual machine
 | 
					@cindex virtual machine
 | 
				
			||||||
@cindex VM
 | 
					@cindex VM
 | 
				
			||||||
 | 
					@anchor{guix system vm}
 | 
				
			||||||
Build a virtual machine that contain the operating system declared in
 | 
					Build a virtual machine that contain the operating system declared in
 | 
				
			||||||
@var{file}, and return a script to run that virtual machine (VM).
 | 
					@var{file}, and return a script to run that virtual machine (VM).
 | 
				
			||||||
Arguments given to the script are passed as is to QEMU.
 | 
					Arguments given to the script are passed as is to QEMU.
 | 
				
			||||||
| 
						 | 
					@ -7162,6 +7314,30 @@ KVM kernel module should be loaded, and the @file{/dev/kvm} device node
 | 
				
			||||||
must exist and be readable and writable by the user and by the daemon's
 | 
					must exist and be readable and writable by the user and by the daemon's
 | 
				
			||||||
build users.
 | 
					build users.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Once you have built, configured, re-configured, and re-re-configured
 | 
				
			||||||
 | 
					your GuixSD installation, you may find it useful to list the operating
 | 
				
			||||||
 | 
					system generations available on disk---and that you can choose from the
 | 
				
			||||||
 | 
					GRUB boot menu:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@table @code
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@item list-generations
 | 
				
			||||||
 | 
					List a summary of each generation of the operating system available on
 | 
				
			||||||
 | 
					disk, in a human-readable way.  This is similar to the
 | 
				
			||||||
 | 
					@option{--list-generations} option of @command{guix package}
 | 
				
			||||||
 | 
					(@pxref{Invoking guix package}).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Optionally, one can specify a pattern, with the same syntax that is used
 | 
				
			||||||
 | 
					in @command{guix package --list-generations}, to restrict the list of
 | 
				
			||||||
 | 
					generations displayed.  For instance, the following command displays
 | 
				
			||||||
 | 
					generations up to 10-day old:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@example
 | 
				
			||||||
 | 
					$ guix system list-generations 10d
 | 
				
			||||||
 | 
					@end example
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@end table
 | 
				
			||||||
 | 
					
 | 
				
			||||||
The @command{guix system} command has even more to offer!  The following
 | 
					The @command{guix system} command has even more to offer!  The following
 | 
				
			||||||
sub-commands allow you to visualize how your system services relate to
 | 
					sub-commands allow you to visualize how your system services relate to
 | 
				
			||||||
each other:
 | 
					each other:
 | 
				
			||||||
| 
						 | 
					@ -7424,6 +7600,41 @@ Here is an example of how a service is created and manipulated:
 | 
				
			||||||
@result{} #t
 | 
					@result{} #t
 | 
				
			||||||
@end example
 | 
					@end example
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The @code{modify-services} form provides a handy way to change the
 | 
				
			||||||
 | 
					parameters of some of the services of a list such as
 | 
				
			||||||
 | 
					@var{%base-services} (@pxref{Base Services, @code{%base-services}}).  Of
 | 
				
			||||||
 | 
					course, you could always use standard list combinators such as
 | 
				
			||||||
 | 
					@code{map} and @code{fold} to do that (@pxref{SRFI-1, List Library,,
 | 
				
			||||||
 | 
					guile, GNU Guile Reference Manual}); @code{modify-services} simply
 | 
				
			||||||
 | 
					provides a more concise form for this common pattern.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@deffn {Scheme Syntax} modify-services @var{services} @
 | 
				
			||||||
 | 
					  (@var{type} @var{variable} => @var{body}) @dots{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Modify the services listed in @var{services} according to the given
 | 
				
			||||||
 | 
					clauses.  Each clause has the form:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@example
 | 
				
			||||||
 | 
					(@var{type} @var{variable} => @var{body})
 | 
				
			||||||
 | 
					@end example
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					where @var{type} is a service type, such as @var{guix-service-type}, and
 | 
				
			||||||
 | 
					@var{variable} is an identifier that is bound within @var{body} to the
 | 
				
			||||||
 | 
					value of the service of that @var{type}.  @xref{Using the Configuration
 | 
				
			||||||
 | 
					System}, for an example.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This is a shorthand for:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@example
 | 
				
			||||||
 | 
					(map (lambda (service) @dots{}) @var{services})
 | 
				
			||||||
 | 
					@end example
 | 
				
			||||||
 | 
					@end deffn
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Next comes the programming interface for service types.  This is
 | 
				
			||||||
 | 
					something you want to know when writing new service definitions, but not
 | 
				
			||||||
 | 
					necessarily when simply looking for ways to customize your
 | 
				
			||||||
 | 
					@code{operating-system} declaration.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@deftp {Data Type} service-type
 | 
					@deftp {Data Type} service-type
 | 
				
			||||||
@cindex service type
 | 
					@cindex service type
 | 
				
			||||||
This is the representation of a @dfn{service type} (@pxref{Service Types
 | 
					This is the representation of a @dfn{service type} (@pxref{Service Types
 | 
				
			||||||
| 
						 | 
					@ -8245,7 +8456,8 @@ reason.
 | 
				
			||||||
@node Acknowledgments
 | 
					@node Acknowledgments
 | 
				
			||||||
@chapter Acknowledgments
 | 
					@chapter Acknowledgments
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Guix is based on the Nix package manager, which was designed and
 | 
					Guix is based on the @uref{http://nixos.org/nix/, Nix package manager},
 | 
				
			||||||
 | 
					which was designed and
 | 
				
			||||||
implemented by Eelco Dolstra, with contributions from other people (see
 | 
					implemented by Eelco Dolstra, with contributions from other people (see
 | 
				
			||||||
the @file{nix/AUTHORS} file in Guix.)  Nix pioneered functional package
 | 
					the @file{nix/AUTHORS} file in Guix.)  Nix pioneered functional package
 | 
				
			||||||
management, and promoted unprecedented features, such as transactional
 | 
					management, and promoted unprecedented features, such as transactional
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1035,7 +1035,7 @@ Each element from GENERATIONS is a generation number."
 | 
				
			||||||
                              profile generation)))
 | 
					                              profile generation)))
 | 
				
			||||||
    (guix-eval-in-repl
 | 
					    (guix-eval-in-repl
 | 
				
			||||||
     (guix-make-guile-expression
 | 
					     (guix-make-guile-expression
 | 
				
			||||||
      'switch-to-generation profile generation)
 | 
					      'switch-to-generation* profile generation)
 | 
				
			||||||
     operation-buffer)))
 | 
					     operation-buffer)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(defun guix-package-source-path (package-id)
 | 
					(defun guix-package-source-path (package-id)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -364,8 +364,9 @@ to be modified."
 | 
				
			||||||
                     :name "-- " :char ?= :option? t args)))
 | 
					                     :name "-- " :char ?= :option? t args)))
 | 
				
			||||||
    (let ((command (car commands)))
 | 
					    (let ((command (car commands)))
 | 
				
			||||||
      (cond
 | 
					      (cond
 | 
				
			||||||
       ((member command '("archive" "build" "graph" "edit"
 | 
					       ((member command
 | 
				
			||||||
                          "environment" "lint" "refresh"))
 | 
					                '("archive" "build" "challenge" "edit" "environment"
 | 
				
			||||||
 | 
					                  "graph" "lint" "refresh"))
 | 
				
			||||||
        (argument :doc "Packages" :fun 'guix-read-package-names-string))
 | 
					        (argument :doc "Packages" :fun 'guix-read-package-names-string))
 | 
				
			||||||
       ((string= command "download")
 | 
					       ((string= command "download")
 | 
				
			||||||
        (argument :doc "URL"))
 | 
					        (argument :doc "URL"))
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -198,6 +198,7 @@ to find 'modify-phases' keywords."
 | 
				
			||||||
    "mbegin"
 | 
					    "mbegin"
 | 
				
			||||||
    "mlet"
 | 
					    "mlet"
 | 
				
			||||||
    "mlet*"
 | 
					    "mlet*"
 | 
				
			||||||
 | 
					    "modify-services"
 | 
				
			||||||
    "munless"
 | 
					    "munless"
 | 
				
			||||||
    "mwhen"
 | 
					    "mwhen"
 | 
				
			||||||
    "run-with-state"
 | 
					    "run-with-state"
 | 
				
			||||||
| 
						 | 
					@ -288,6 +289,7 @@ Each rule should have a form (SYMBOL VALUE).  See `put' for details."
 | 
				
			||||||
  (mlet 2)
 | 
					  (mlet 2)
 | 
				
			||||||
  (mlet* 2)
 | 
					  (mlet* 2)
 | 
				
			||||||
  (modify-phases 1)
 | 
					  (modify-phases 1)
 | 
				
			||||||
 | 
					  (modify-services 1)
 | 
				
			||||||
  (munless 1)
 | 
					  (munless 1)
 | 
				
			||||||
  (mwhen 1)
 | 
					  (mwhen 1)
 | 
				
			||||||
  (operating-system 0)
 | 
					  (operating-system 0)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -209,8 +209,8 @@ group - the argument.")
 | 
				
			||||||
  "Complete argument for guix COMMAND."
 | 
					  "Complete argument for guix COMMAND."
 | 
				
			||||||
  (cond
 | 
					  (cond
 | 
				
			||||||
   ((member command
 | 
					   ((member command
 | 
				
			||||||
            '("archive" "build" "graph" "edit" "environment"
 | 
					            '("archive" "build" "challenge" "edit" "environment"
 | 
				
			||||||
              "lint" "refresh" "size"))
 | 
					              "graph" "lint" "refresh" "size"))
 | 
				
			||||||
    (while t
 | 
					    (while t
 | 
				
			||||||
      (pcomplete-here (guix-pcomplete-all-packages))))
 | 
					      (pcomplete-here (guix-pcomplete-all-packages))))
 | 
				
			||||||
   (t (pcomplete-here* (pcomplete-entries)))))
 | 
					   (t (pcomplete-here* (pcomplete-entries)))))
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -121,7 +121,6 @@ GNU_SYSTEM_MODULES =				\
 | 
				
			||||||
  gnu/packages/gcc.scm				\
 | 
					  gnu/packages/gcc.scm				\
 | 
				
			||||||
  gnu/packages/gd.scm				\
 | 
					  gnu/packages/gd.scm				\
 | 
				
			||||||
  gnu/packages/gdb.scm				\
 | 
					  gnu/packages/gdb.scm				\
 | 
				
			||||||
  gnu/packages/gdbm.scm				\
 | 
					 | 
				
			||||||
  gnu/packages/geeqie.scm			\
 | 
					  gnu/packages/geeqie.scm			\
 | 
				
			||||||
  gnu/packages/gettext.scm			\
 | 
					  gnu/packages/gettext.scm			\
 | 
				
			||||||
  gnu/packages/ghostscript.scm			\
 | 
					  gnu/packages/ghostscript.scm			\
 | 
				
			||||||
| 
						 | 
					@ -693,6 +692,7 @@ dist_patch_DATA =						\
 | 
				
			||||||
  gnu/packages/patches/xf86-video-trident-remove-mibstore.patch	\
 | 
					  gnu/packages/patches/xf86-video-trident-remove-mibstore.patch	\
 | 
				
			||||||
  gnu/packages/patches/xf86-video-vmware-glibc-2.20.patch	\
 | 
					  gnu/packages/patches/xf86-video-vmware-glibc-2.20.patch	\
 | 
				
			||||||
  gnu/packages/patches/xfce4-panel-plugins.patch		\
 | 
					  gnu/packages/patches/xfce4-panel-plugins.patch		\
 | 
				
			||||||
 | 
					  gnu/packages/patches/xfce4-session-fix-xflock4.patch		\
 | 
				
			||||||
  gnu/packages/patches/xfce4-settings-defaults.patch		\
 | 
					  gnu/packages/patches/xfce4-settings-defaults.patch		\
 | 
				
			||||||
  gnu/packages/patches/xmodmap-asprintf.patch 			\
 | 
					  gnu/packages/patches/xmodmap-asprintf.patch 			\
 | 
				
			||||||
  gnu/packages/patches/zathura-plugindir-environment-variable.patch
 | 
					  gnu/packages/patches/zathura-plugindir-environment-variable.patch
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -165,7 +165,7 @@ host user identifiers to map into the user namespace."
 | 
				
			||||||
  "Return the number suitable for the 'flags' argument of 'clone' that
 | 
					  "Return the number suitable for the 'flags' argument of 'clone' that
 | 
				
			||||||
corresponds to the symbols in NAMESPACES."
 | 
					corresponds to the symbols in NAMESPACES."
 | 
				
			||||||
  ;; Use the same flags as fork(3) in addition to the namespace flags.
 | 
					  ;; Use the same flags as fork(3) in addition to the namespace flags.
 | 
				
			||||||
  (apply logior SIGCHLD CLONE_CHILD_CLEARTID CLONE_CHILD_SETTID
 | 
					  (apply logior SIGCHLD
 | 
				
			||||||
         (map (match-lambda
 | 
					         (map (match-lambda
 | 
				
			||||||
               ('mnt  CLONE_NEWNS)
 | 
					               ('mnt  CLONE_NEWNS)
 | 
				
			||||||
               ('uts  CLONE_NEWUTS)
 | 
					               ('uts  CLONE_NEWUTS)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -26,6 +26,7 @@
 | 
				
			||||||
  #:use-module (gnu packages perl)
 | 
					  #:use-module (gnu packages perl)
 | 
				
			||||||
  #:use-module (gnu packages readline)
 | 
					  #:use-module (gnu packages readline)
 | 
				
			||||||
  #:use-module (gnu packages flex)
 | 
					  #:use-module (gnu packages flex)
 | 
				
			||||||
 | 
					  #:use-module (gnu packages xorg)
 | 
				
			||||||
  #:use-module ((guix licenses) #:prefix license:)
 | 
					  #:use-module ((guix licenses) #:prefix license:)
 | 
				
			||||||
  #:use-module (guix packages)
 | 
					  #:use-module (guix packages)
 | 
				
			||||||
  #:use-module (guix download)
 | 
					  #:use-module (guix download)
 | 
				
			||||||
| 
						 | 
					@ -125,6 +126,7 @@ solve the shortest vector problem.")
 | 
				
			||||||
                "0k1qqagfl6zn7gvwmsqffj6g9yrzqvszwh2mblhmxpjlw1pigfh8"))))
 | 
					                "0k1qqagfl6zn7gvwmsqffj6g9yrzqvszwh2mblhmxpjlw1pigfh8"))))
 | 
				
			||||||
   (build-system gnu-build-system)
 | 
					   (build-system gnu-build-system)
 | 
				
			||||||
   (inputs `(("gmp" ,gmp)
 | 
					   (inputs `(("gmp" ,gmp)
 | 
				
			||||||
 | 
					             ("libx11" ,libx11)
 | 
				
			||||||
             ("perl" ,perl)
 | 
					             ("perl" ,perl)
 | 
				
			||||||
             ("readline" ,readline)))
 | 
					             ("readline" ,readline)))
 | 
				
			||||||
   (arguments
 | 
					   (arguments
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -23,7 +23,7 @@
 | 
				
			||||||
  #:use-module (guix download)
 | 
					  #:use-module (guix download)
 | 
				
			||||||
  #:use-module (guix build-system gnu)
 | 
					  #:use-module (guix build-system gnu)
 | 
				
			||||||
  #:use-module (gnu packages)
 | 
					  #:use-module (gnu packages)
 | 
				
			||||||
  #:use-module (gnu packages gdbm)
 | 
					  #:use-module (gnu packages databases)
 | 
				
			||||||
  #:use-module (gnu packages libdaemon)
 | 
					  #:use-module (gnu packages libdaemon)
 | 
				
			||||||
  #:use-module (gnu packages pkg-config)
 | 
					  #:use-module (gnu packages pkg-config)
 | 
				
			||||||
  #:use-module (gnu packages glib)
 | 
					  #:use-module (gnu packages glib)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -30,9 +30,12 @@
 | 
				
			||||||
  #:use-module (gnu packages acl)
 | 
					  #:use-module (gnu packages acl)
 | 
				
			||||||
  #:use-module (gnu packages base)
 | 
					  #:use-module (gnu packages base)
 | 
				
			||||||
  #:use-module (gnu packages compression)
 | 
					  #:use-module (gnu packages compression)
 | 
				
			||||||
 | 
					  #:use-module (gnu packages databases)
 | 
				
			||||||
  #:use-module (gnu packages dejagnu)
 | 
					  #:use-module (gnu packages dejagnu)
 | 
				
			||||||
  #:use-module (gnu packages glib)
 | 
					  #:use-module (gnu packages glib)
 | 
				
			||||||
  #:use-module (gnu packages gnupg)
 | 
					  #:use-module (gnu packages gnupg)
 | 
				
			||||||
 | 
					  #:use-module (gnu packages gperf)
 | 
				
			||||||
 | 
					  #:use-module (gnu packages guile)
 | 
				
			||||||
  #:use-module (gnu packages linux)
 | 
					  #:use-module (gnu packages linux)
 | 
				
			||||||
  #:use-module (gnu packages mcrypt)
 | 
					  #:use-module (gnu packages mcrypt)
 | 
				
			||||||
  #:use-module (gnu packages nettle)
 | 
					  #:use-module (gnu packages nettle)
 | 
				
			||||||
| 
						 | 
					@ -147,6 +150,7 @@ backups (called chunks) to allow easy burning to CD/DVD.")
 | 
				
			||||||
              (search-patch "libarchive-fix-lzo-test-case.patch")
 | 
					              (search-patch "libarchive-fix-lzo-test-case.patch")
 | 
				
			||||||
              (search-patch "libarchive-CVE-2013-0211.patch")))))
 | 
					              (search-patch "libarchive-CVE-2013-0211.patch")))))
 | 
				
			||||||
    (build-system gnu-build-system)
 | 
					    (build-system gnu-build-system)
 | 
				
			||||||
 | 
					    ;; TODO: Add -L/path/to/nettle in libarchive.pc.
 | 
				
			||||||
    (inputs
 | 
					    (inputs
 | 
				
			||||||
     `(("zlib" ,zlib)
 | 
					     `(("zlib" ,zlib)
 | 
				
			||||||
       ("nettle" ,nettle)
 | 
					       ("nettle" ,nettle)
 | 
				
			||||||
| 
						 | 
					@ -352,3 +356,44 @@ deduplication technique used makes Attic suitable for daily backups since only
 | 
				
			||||||
changes are stored.")
 | 
					changes are stored.")
 | 
				
			||||||
    (home-page "https://attic-backup.org/")
 | 
					    (home-page "https://attic-backup.org/")
 | 
				
			||||||
    (license license:bsd-3)))
 | 
					    (license license:bsd-3)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(define-public libchop
 | 
				
			||||||
 | 
					  (package
 | 
				
			||||||
 | 
					    (name "libchop")
 | 
				
			||||||
 | 
					    (version "0.5.2")
 | 
				
			||||||
 | 
					    (source (origin
 | 
				
			||||||
 | 
					              (method url-fetch)
 | 
				
			||||||
 | 
					              (uri (string-append "mirror://savannah/libchop/libchop-"
 | 
				
			||||||
 | 
					                                  version ".tar.gz"))
 | 
				
			||||||
 | 
					              (sha256
 | 
				
			||||||
 | 
					               (base32
 | 
				
			||||||
 | 
					                "0fpdyxww41ba52d98blvnf543xvirq1v9xz1i3x1gm9lzlzpmc2g"))
 | 
				
			||||||
 | 
					              (patches
 | 
				
			||||||
 | 
					               (list (search-patch "diffutils-gets-undeclared.patch")))))
 | 
				
			||||||
 | 
					    (build-system gnu-build-system)
 | 
				
			||||||
 | 
					    (native-inputs
 | 
				
			||||||
 | 
					     `(("guile" ,guile-2.0)
 | 
				
			||||||
 | 
					       ("gperf" ,gperf)
 | 
				
			||||||
 | 
					       ("pkg-config" ,pkg-config)))
 | 
				
			||||||
 | 
					    (inputs
 | 
				
			||||||
 | 
					     `(("guile" ,guile-2.0)
 | 
				
			||||||
 | 
					       ("util-linux" ,util-linux)
 | 
				
			||||||
 | 
					       ("gnutls" ,gnutls)
 | 
				
			||||||
 | 
					       ("tdb" ,tdb)
 | 
				
			||||||
 | 
					       ("bdb" ,bdb)
 | 
				
			||||||
 | 
					       ("gdbm" ,gdbm)
 | 
				
			||||||
 | 
					       ("libgcrypt" ,libgcrypt)
 | 
				
			||||||
 | 
					       ("lzo" ,lzo)
 | 
				
			||||||
 | 
					       ("bzip2" ,bzip2)
 | 
				
			||||||
 | 
					       ("zlib" ,zlib)))
 | 
				
			||||||
 | 
					    (home-page "http://nongnu.org/libchop/")
 | 
				
			||||||
 | 
					    (synopsis "Tools & library for data backup and distributed storage")
 | 
				
			||||||
 | 
					    (description
 | 
				
			||||||
 | 
					     "Libchop is a set of utilities and library for data backup and
 | 
				
			||||||
 | 
					distributed storage.  Its main application is @command{chop-backup}, an
 | 
				
			||||||
 | 
					encrypted backup program that supports data integrity checks, versioning,
 | 
				
			||||||
 | 
					distribution among several sites, selective sharing of stored data, adaptive
 | 
				
			||||||
 | 
					compression, and more.  The library itself implements storage techniques such
 | 
				
			||||||
 | 
					as content-addressable storage, content hash keys, Merkle trees, similarity
 | 
				
			||||||
 | 
					detection, and lossless compression.")
 | 
				
			||||||
 | 
					    (license license:gpl3+)))
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -805,15 +805,16 @@ time.")
 | 
				
			||||||
(define-public crossmap
 | 
					(define-public crossmap
 | 
				
			||||||
  (package
 | 
					  (package
 | 
				
			||||||
    (name "crossmap")
 | 
					    (name "crossmap")
 | 
				
			||||||
    (version "0.1.6")
 | 
					    (version "0.2.1")
 | 
				
			||||||
    (source (origin
 | 
					    (source (origin
 | 
				
			||||||
              (method url-fetch)
 | 
					              (method url-fetch)
 | 
				
			||||||
              (uri (string-append "mirror://sourceforge/crossmap/CrossMap-"
 | 
					              (uri (string-append "mirror://sourceforge/crossmap/CrossMap-"
 | 
				
			||||||
                                  version ".tar.gz"))
 | 
					                                  version ".tar.gz"))
 | 
				
			||||||
              (sha256
 | 
					              (sha256
 | 
				
			||||||
               (base32
 | 
					               (base32
 | 
				
			||||||
                "163hi5gjgij6cndxlvbkp5jjwr0k4wbm9im6d2210278q7k9kpnp"))
 | 
					                "07y179f63d7qnzdvkqcziwk9bs3k4zhp81q392fp1hwszjdvy22f"))
 | 
				
			||||||
              ;; patch has been sent upstream already
 | 
					              ;; This patch has been sent upstream already and is available
 | 
				
			||||||
 | 
					              ;; for download from Sourceforge, but it has not been merged.
 | 
				
			||||||
              (patches (list
 | 
					              (patches (list
 | 
				
			||||||
                        (search-patch "crossmap-allow-system-pysam.patch")))
 | 
					                        (search-patch "crossmap-allow-system-pysam.patch")))
 | 
				
			||||||
              (modules '((guix build utils)))
 | 
					              (modules '((guix build utils)))
 | 
				
			||||||
| 
						 | 
					@ -1838,19 +1839,25 @@ the phenotype as it models the data.")
 | 
				
			||||||
    (license license:asl2.0)))
 | 
					    (license license:asl2.0)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(define-public pbtranscript-tofu
 | 
					(define-public pbtranscript-tofu
 | 
				
			||||||
  (let ((commit "c7bbd5472"))
 | 
					  (let ((commit "8f5467fe6"))
 | 
				
			||||||
    (package
 | 
					    (package
 | 
				
			||||||
      (name "pbtranscript-tofu")
 | 
					      (name "pbtranscript-tofu")
 | 
				
			||||||
      (version (string-append "0.4.1." commit))
 | 
					      (version (string-append "2.2.3." commit))
 | 
				
			||||||
      (source (origin
 | 
					      (source (origin
 | 
				
			||||||
                (method git-fetch)
 | 
					                (method git-fetch)
 | 
				
			||||||
                (uri (git-reference
 | 
					                (uri (git-reference
 | 
				
			||||||
                      (url "https://github.com/PacificBiosciences/cDNA_primer.git")
 | 
					                      (url "https://github.com/PacificBiosciences/cDNA_primer.git")
 | 
				
			||||||
                      (commit commit)))
 | 
					                      (commit commit)))
 | 
				
			||||||
                (file-name (string-append name "-" version ".tar.gz"))
 | 
					                (file-name (string-append name "-" version "-checkout"))
 | 
				
			||||||
                (sha256
 | 
					                (sha256
 | 
				
			||||||
                 (base32
 | 
					                 (base32
 | 
				
			||||||
                  "148xkzi689c49g6fdhckp6mnmj2qhjdf1j4wifm6ja7ij95d7fxx"))))
 | 
					                  "1lgnpi35ihay42qx0b6yl3kkgra723i413j33kvs0kvs61h82w0f"))
 | 
				
			||||||
 | 
					                (modules '((guix build utils)))
 | 
				
			||||||
 | 
					                (snippet
 | 
				
			||||||
 | 
					                 '(begin
 | 
				
			||||||
 | 
					                    ;; remove bundled Cython sources
 | 
				
			||||||
 | 
					                    (delete-file "pbtranscript-tofu/pbtranscript/Cython-0.20.1.tar.gz")
 | 
				
			||||||
 | 
					                    #t))))
 | 
				
			||||||
      (build-system python-build-system)
 | 
					      (build-system python-build-system)
 | 
				
			||||||
      (arguments
 | 
					      (arguments
 | 
				
			||||||
       `(#:python ,python-2
 | 
					       `(#:python ,python-2
 | 
				
			||||||
| 
						 | 
					@ -1860,34 +1867,29 @@ the phenotype as it models the data.")
 | 
				
			||||||
         #:configure-flags '("--single-version-externally-managed"
 | 
					         #:configure-flags '("--single-version-externally-managed"
 | 
				
			||||||
                             "--record=pbtranscript-tofu.txt")
 | 
					                             "--record=pbtranscript-tofu.txt")
 | 
				
			||||||
         #:phases
 | 
					         #:phases
 | 
				
			||||||
         (alist-cons-after
 | 
					         (modify-phases %standard-phases
 | 
				
			||||||
          'unpack 'enter-directory-and-clean-up
 | 
					           (add-after 'unpack 'enter-directory
 | 
				
			||||||
            (lambda _
 | 
					            (lambda _
 | 
				
			||||||
              (chdir "pbtranscript-tofu/pbtranscript/")
 | 
					              (chdir "pbtranscript-tofu/pbtranscript/")
 | 
				
			||||||
            ;; Delete clutter
 | 
					              #t))
 | 
				
			||||||
            (delete-file-recursively "dist/")
 | 
					           ;; With setuptools version 18.0 and later this setup.py hack causes
 | 
				
			||||||
            (delete-file-recursively "build/")
 | 
					           ;; a build error, so we disable it.
 | 
				
			||||||
            (delete-file-recursively "setuptools_cython-0.2.1-py2.6.egg/")
 | 
					           (add-after 'enter-directory 'patch-setuppy
 | 
				
			||||||
            (delete-file-recursively "pbtools.pbtranscript.egg-info")
 | 
					            (lambda _
 | 
				
			||||||
            (delete-file "Cython-0.20.1.tar.gz")
 | 
					              (substitute* "setup.py"
 | 
				
			||||||
            (delete-file "setuptools_cython-0.2.1-py2.7.egg")
 | 
					                (("if 'setuptools.extension' in sys.modules:")
 | 
				
			||||||
            (delete-file "setuptools_cython-0.2.1.tar.gz")
 | 
					                 "if False:"))
 | 
				
			||||||
            (delete-file "setup.cfg")
 | 
					              #t)))))
 | 
				
			||||||
            (for-each delete-file
 | 
					 | 
				
			||||||
                      (find-files "." "\\.so$"))
 | 
					 | 
				
			||||||
            ;; files should be writable for install phase
 | 
					 | 
				
			||||||
            (for-each (lambda (f) (chmod f #o755))
 | 
					 | 
				
			||||||
                      (find-files "." "\\.py$")))
 | 
					 | 
				
			||||||
          %standard-phases)))
 | 
					 | 
				
			||||||
      (inputs
 | 
					      (inputs
 | 
				
			||||||
       `(("python-cython" ,python2-cython)
 | 
					       `(("python-numpy" ,python2-numpy)
 | 
				
			||||||
         ("python-numpy" ,python2-numpy)
 | 
					 | 
				
			||||||
         ("python-bx-python" ,python2-bx-python)
 | 
					         ("python-bx-python" ,python2-bx-python)
 | 
				
			||||||
         ("python-networkx" ,python2-networkx)
 | 
					         ("python-networkx" ,python2-networkx)
 | 
				
			||||||
         ("python-scipy" ,python2-scipy)
 | 
					         ("python-scipy" ,python2-scipy)
 | 
				
			||||||
         ("python-pbcore" ,python2-pbcore)))
 | 
					         ("python-pbcore" ,python2-pbcore)
 | 
				
			||||||
 | 
					         ("python-h5py" ,python2-h5py)))
 | 
				
			||||||
      (native-inputs
 | 
					      (native-inputs
 | 
				
			||||||
       `(("python-nose" ,python2-nose)
 | 
					       `(("python-cython" ,python2-cython)
 | 
				
			||||||
 | 
					         ("python-nose" ,python2-nose)
 | 
				
			||||||
         ("python-setuptools" ,python2-setuptools)))
 | 
					         ("python-setuptools" ,python2-setuptools)))
 | 
				
			||||||
      (home-page "https://github.com/PacificBiosciences/cDNA_primer")
 | 
					      (home-page "https://github.com/PacificBiosciences/cDNA_primer")
 | 
				
			||||||
      (synopsis "Analyze transcriptome data generated with the Iso-Seq protocol")
 | 
					      (synopsis "Analyze transcriptome data generated with the Iso-Seq protocol")
 | 
				
			||||||
| 
						 | 
					@ -2703,7 +2705,24 @@ sequences.")
 | 
				
			||||||
    (build-system gnu-build-system)
 | 
					    (build-system gnu-build-system)
 | 
				
			||||||
    (arguments
 | 
					    (arguments
 | 
				
			||||||
     `(#:tests? #f ;no "check" target
 | 
					     `(#:tests? #f ;no "check" target
 | 
				
			||||||
       #:make-flags '("-f" "Makefile.Linux")
 | 
					      ;; The CC and CCFLAGS variables are set to contain a lot of x86_64
 | 
				
			||||||
 | 
					      ;; optimizations by default, so we override these flags such that x86_64
 | 
				
			||||||
 | 
					      ;; flags are only added when the build target is an x86_64 system.
 | 
				
			||||||
 | 
					       #:make-flags
 | 
				
			||||||
 | 
					       (list (let ((system ,(or (%current-target-system)
 | 
				
			||||||
 | 
					                                (%current-system)))
 | 
				
			||||||
 | 
					                   (flags '("-ggdb" "-fomit-frame-pointer"
 | 
				
			||||||
 | 
					                            "-ffast-math" "-funroll-loops"
 | 
				
			||||||
 | 
					                            "-fmessage-length=0"
 | 
				
			||||||
 | 
					                            "-O9" "-Wall" "-DMAKE_FOR_EXON"
 | 
				
			||||||
 | 
					                            "-DMAKE_STANDALONE"
 | 
				
			||||||
 | 
					                            "-DSUBREAD_VERSION=\\\"${SUBREAD_VERSION}\\\""))
 | 
				
			||||||
 | 
					                   (flags64 '("-mmmx" "-msse" "-msse2" "-msse3")))
 | 
				
			||||||
 | 
					               (if (string-prefix? "x86_64" system)
 | 
				
			||||||
 | 
					                   (string-append "CCFLAGS=" (string-join (append flags flags64)))
 | 
				
			||||||
 | 
					                   (string-append "CCFLAGS=" (string-join flags))))
 | 
				
			||||||
 | 
					             "-f" "Makefile.Linux"
 | 
				
			||||||
 | 
					             "CC=gcc ${CCFLAGS}")
 | 
				
			||||||
       #:phases
 | 
					       #:phases
 | 
				
			||||||
       (alist-cons-after
 | 
					       (alist-cons-after
 | 
				
			||||||
        'unpack 'enter-dir
 | 
					        'unpack 'enter-dir
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,5 +1,5 @@
 | 
				
			||||||
;;; GNU Guix --- Functional package management for GNU
 | 
					;;; GNU Guix --- Functional package management for GNU
 | 
				
			||||||
;;; Copyright © 2013, 2014 Ludovic Courtès <ludo@gnu.org>
 | 
					;;; Copyright © 2013, 2014, 2015 Ludovic Courtès <ludo@gnu.org>
 | 
				
			||||||
;;; Copyright © 2013 Andreas Enge <andreas@enge.fr>
 | 
					;;; Copyright © 2013 Andreas Enge <andreas@enge.fr>
 | 
				
			||||||
;;;
 | 
					;;;
 | 
				
			||||||
;;; This file is part of GNU Guix.
 | 
					;;; This file is part of GNU Guix.
 | 
				
			||||||
| 
						 | 
					@ -19,7 +19,7 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(define-module (gnu packages cyrus-sasl)
 | 
					(define-module (gnu packages cyrus-sasl)
 | 
				
			||||||
  #:use-module (gnu packages)
 | 
					  #:use-module (gnu packages)
 | 
				
			||||||
  #:use-module (gnu packages gdbm)
 | 
					  #:use-module (gnu packages databases)
 | 
				
			||||||
  #:use-module (gnu packages mit-krb5)
 | 
					  #:use-module (gnu packages mit-krb5)
 | 
				
			||||||
  #:use-module (gnu packages tls)
 | 
					  #:use-module (gnu packages tls)
 | 
				
			||||||
  #:use-module ((guix licenses) #:prefix license:)
 | 
					  #:use-module ((guix licenses) #:prefix license:)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -53,6 +53,28 @@
 | 
				
			||||||
  #:use-module (srfi srfi-26)
 | 
					  #:use-module (srfi srfi-26)
 | 
				
			||||||
  #:use-module (ice-9 match))
 | 
					  #:use-module (ice-9 match))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(define-public gdbm
 | 
				
			||||||
 | 
					  (package
 | 
				
			||||||
 | 
					    (name "gdbm")
 | 
				
			||||||
 | 
					    (version "1.11")
 | 
				
			||||||
 | 
					    (source (origin
 | 
				
			||||||
 | 
					              (method url-fetch)
 | 
				
			||||||
 | 
					              (uri (string-append "mirror://gnu/gdbm/gdbm-"
 | 
				
			||||||
 | 
					                                  version ".tar.gz"))
 | 
				
			||||||
 | 
					              (sha256
 | 
				
			||||||
 | 
					               (base32
 | 
				
			||||||
 | 
					                "1hz3jgh3pd4qzp6jy0l8pd8x01g9abw7csnrlnj1a2sxy122z4cd"))))
 | 
				
			||||||
 | 
					    (arguments `(#:configure-flags '("--enable-libgdbm-compat")))
 | 
				
			||||||
 | 
					    (build-system gnu-build-system)
 | 
				
			||||||
 | 
					    (home-page "http://www.gnu.org/software/gdbm/")
 | 
				
			||||||
 | 
					    (synopsis
 | 
				
			||||||
 | 
					     "Hash library of database functions compatible with traditional dbm")
 | 
				
			||||||
 | 
					    (description
 | 
				
			||||||
 | 
					     "GDBM is a library for manipulating hashed databases.  It is used to
 | 
				
			||||||
 | 
					store key/value pairs in a file in a manner similar to the Unix dbm library
 | 
				
			||||||
 | 
					and provides interfaces to the traditional file format.")
 | 
				
			||||||
 | 
					    (license gpl3+)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(define-public bdb
 | 
					(define-public bdb
 | 
				
			||||||
  (package
 | 
					  (package
 | 
				
			||||||
    (name "bdb")
 | 
					    (name "bdb")
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -316,7 +316,7 @@ configuration files, such as .gitattributes, .gitignore, and .git/config.")
 | 
				
			||||||
(define-public magit
 | 
					(define-public magit
 | 
				
			||||||
  (package
 | 
					  (package
 | 
				
			||||||
    (name "magit")
 | 
					    (name "magit")
 | 
				
			||||||
    (version "2.2.2")
 | 
					    (version "2.3.0")
 | 
				
			||||||
    (source (origin
 | 
					    (source (origin
 | 
				
			||||||
             (method url-fetch)
 | 
					             (method url-fetch)
 | 
				
			||||||
             (uri (string-append
 | 
					             (uri (string-append
 | 
				
			||||||
| 
						 | 
					@ -324,7 +324,7 @@ configuration files, such as .gitattributes, .gitignore, and .git/config.")
 | 
				
			||||||
                   version "/" name "-" version ".tar.gz"))
 | 
					                   version "/" name "-" version ".tar.gz"))
 | 
				
			||||||
             (sha256
 | 
					             (sha256
 | 
				
			||||||
              (base32
 | 
					              (base32
 | 
				
			||||||
               "1imkj4prprnivhbpdn1mdpiryxkckzy5hbnqaahv7gixwac1irh8"))))
 | 
					               "0bi0vqp9802f00vnii3x80iqycji20bw4pjysy6al0d86mkggjx5"))))
 | 
				
			||||||
    (build-system gnu-build-system)
 | 
					    (build-system gnu-build-system)
 | 
				
			||||||
    (native-inputs `(("texinfo" ,texinfo)
 | 
					    (native-inputs `(("texinfo" ,texinfo)
 | 
				
			||||||
                     ("emacs" ,emacs-no-x)))
 | 
					                     ("emacs" ,emacs-no-x)))
 | 
				
			||||||
| 
						 | 
					@ -372,7 +372,7 @@ operations.")
 | 
				
			||||||
(define-public magit-svn
 | 
					(define-public magit-svn
 | 
				
			||||||
  (package
 | 
					  (package
 | 
				
			||||||
    (name "magit-svn")
 | 
					    (name "magit-svn")
 | 
				
			||||||
    (version "2.1.0")
 | 
					    (version "2.1.1")
 | 
				
			||||||
    (source (origin
 | 
					    (source (origin
 | 
				
			||||||
              (method url-fetch)
 | 
					              (method url-fetch)
 | 
				
			||||||
              (uri (string-append
 | 
					              (uri (string-append
 | 
				
			||||||
| 
						 | 
					@ -381,7 +381,7 @@ operations.")
 | 
				
			||||||
              (file-name (string-append name "-" version ".tar.gz"))
 | 
					              (file-name (string-append name "-" version ".tar.gz"))
 | 
				
			||||||
              (sha256
 | 
					              (sha256
 | 
				
			||||||
               (base32
 | 
					               (base32
 | 
				
			||||||
                "09sz93g7x7g9q75jsw8bdh7yr4jr1igfb4fpg5i302a7l2ahxfr8"))))
 | 
					                "04y88j7q9h8xjbx5dbick6n5nr1522sn9i1znp0qwk3vjb4b5mzz"))))
 | 
				
			||||||
    (build-system trivial-build-system)
 | 
					    (build-system trivial-build-system)
 | 
				
			||||||
    (native-inputs `(("emacs" ,emacs-no-x)
 | 
					    (native-inputs `(("emacs" ,emacs-no-x)
 | 
				
			||||||
                     ("tar" ,tar)
 | 
					                     ("tar" ,tar)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -20,6 +20,7 @@
 | 
				
			||||||
  #:use-module (guix licenses)
 | 
					  #:use-module (guix licenses)
 | 
				
			||||||
  #:use-module (gnu packages doxygen)
 | 
					  #:use-module (gnu packages doxygen)
 | 
				
			||||||
  #:use-module (gnu packages ncurses)
 | 
					  #:use-module (gnu packages ncurses)
 | 
				
			||||||
 | 
					  #:use-module (gnu packages python)
 | 
				
			||||||
  #:use-module (guix packages)
 | 
					  #:use-module (guix packages)
 | 
				
			||||||
  #:use-module (guix download)
 | 
					  #:use-module (guix download)
 | 
				
			||||||
  #:use-module (guix utils)
 | 
					  #:use-module (guix utils)
 | 
				
			||||||
| 
						 | 
					@ -45,7 +46,8 @@
 | 
				
			||||||
    (native-inputs
 | 
					    (native-inputs
 | 
				
			||||||
     `(("doxygen" ,doxygen)))
 | 
					     `(("doxygen" ,doxygen)))
 | 
				
			||||||
    (inputs
 | 
					    (inputs
 | 
				
			||||||
     `(("ncurses" ,ncurses)))
 | 
					     `(("ncurses" ,ncurses)
 | 
				
			||||||
 | 
					       ("python" ,python-wrapper)))   ;for fish_config and manpage completions
 | 
				
			||||||
    (arguments
 | 
					    (arguments
 | 
				
			||||||
     '(#:tests? #f ; no check target
 | 
					     '(#:tests? #f ; no check target
 | 
				
			||||||
       #:configure-flags '("--sysconfdir=/etc")))
 | 
					       #:configure-flags '("--sysconfdir=/etc")))
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -27,14 +27,14 @@
 | 
				
			||||||
(define-public freeipmi
 | 
					(define-public freeipmi
 | 
				
			||||||
  (package
 | 
					  (package
 | 
				
			||||||
    (name "freeipmi")
 | 
					    (name "freeipmi")
 | 
				
			||||||
    (version "1.4.10")
 | 
					    (version "1.4.11")
 | 
				
			||||||
    (source (origin
 | 
					    (source (origin
 | 
				
			||||||
             (method url-fetch)
 | 
					             (method url-fetch)
 | 
				
			||||||
             (uri (string-append "mirror://gnu/freeipmi/freeipmi-"
 | 
					             (uri (string-append "mirror://gnu/freeipmi/freeipmi-"
 | 
				
			||||||
                                 version ".tar.gz"))
 | 
					                                 version ".tar.gz"))
 | 
				
			||||||
             (sha256
 | 
					             (sha256
 | 
				
			||||||
              (base32
 | 
					              (base32
 | 
				
			||||||
               "1l98l8g8lha85q1d288wr7dyx00x36smh9g5wza15n4wm35c9wqs"))))
 | 
					               "0bkghpbj1zkxcgmx2crg0mf97y6dhnxdqvdk5mkw1pyqdxncwq3l"))))
 | 
				
			||||||
    (build-system gnu-build-system)
 | 
					    (build-system gnu-build-system)
 | 
				
			||||||
    (inputs
 | 
					    (inputs
 | 
				
			||||||
     `(("readline" ,readline) ("libgcrypt" ,libgcrypt)))
 | 
					     `(("readline" ,readline) ("libgcrypt" ,libgcrypt)))
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,7 +1,7 @@
 | 
				
			||||||
;;; GNU Guix --- Functional package management for GNU
 | 
					;;; GNU Guix --- Functional package management for GNU
 | 
				
			||||||
;;; Copyright © 2012, 2013, 2014, 2015 Ludovic Courtès <ludo@gnu.org>
 | 
					;;; Copyright © 2012, 2013, 2014, 2015 Ludovic Courtès <ludo@gnu.org>
 | 
				
			||||||
;;; Copyright © 2014, 2015 Mark H Weaver <mhw@netris.org>
 | 
					;;; Copyright © 2014, 2015 Mark H Weaver <mhw@netris.org>
 | 
				
			||||||
;;; Copyright © 2014 Ricardo Wurmus <rekado@elephly.net>
 | 
					;;; Copyright © 2014, 2015 Ricardo Wurmus <rekado@elephly.net>
 | 
				
			||||||
;;; Copyright © 2015 Andreas Enge <andreas@enge.fr>
 | 
					;;; Copyright © 2015 Andreas Enge <andreas@enge.fr>
 | 
				
			||||||
;;;
 | 
					;;;
 | 
				
			||||||
;;; This file is part of GNU Guix.
 | 
					;;; This file is part of GNU Guix.
 | 
				
			||||||
| 
						 | 
					@ -27,6 +27,7 @@
 | 
				
			||||||
  #:use-module (gnu packages compression)
 | 
					  #:use-module (gnu packages compression)
 | 
				
			||||||
  #:use-module (gnu packages multiprecision)
 | 
					  #:use-module (gnu packages multiprecision)
 | 
				
			||||||
  #:use-module (gnu packages texinfo)
 | 
					  #:use-module (gnu packages texinfo)
 | 
				
			||||||
 | 
					  #:use-module (gnu packages dejagnu)
 | 
				
			||||||
  #:use-module (gnu packages doxygen)
 | 
					  #:use-module (gnu packages doxygen)
 | 
				
			||||||
  #:use-module (gnu packages xml)
 | 
					  #:use-module (gnu packages xml)
 | 
				
			||||||
  #:use-module (gnu packages docbook)
 | 
					  #:use-module (gnu packages docbook)
 | 
				
			||||||
| 
						 | 
					@ -460,6 +461,9 @@ using compilers other than GCC."
 | 
				
			||||||
       ("javac.in" ,javac.in)
 | 
					       ("javac.in" ,javac.in)
 | 
				
			||||||
       ("ecj-bootstrap" ,ecj-bootstrap)
 | 
					       ("ecj-bootstrap" ,ecj-bootstrap)
 | 
				
			||||||
       ,@(package-inputs gcc)))
 | 
					       ,@(package-inputs gcc)))
 | 
				
			||||||
 | 
					    (native-inputs
 | 
				
			||||||
 | 
					     `(("dejagnu" ,dejagnu)
 | 
				
			||||||
 | 
					       ,@(package-native-inputs gcc)))
 | 
				
			||||||
    ;; Suppress the separate "lib" output, because otherwise the
 | 
					    ;; Suppress the separate "lib" output, because otherwise the
 | 
				
			||||||
    ;; "lib" and "out" outputs would refer to each other, creating
 | 
					    ;; "lib" and "out" outputs would refer to each other, creating
 | 
				
			||||||
    ;; a cyclic dependency.  <http://debbugs.gnu.org/18101>
 | 
					    ;; a cyclic dependency.  <http://debbugs.gnu.org/18101>
 | 
				
			||||||
| 
						 | 
					@ -471,7 +475,9 @@ using compilers other than GCC."
 | 
				
			||||||
                                                (ice-9 regex)
 | 
					                                                (ice-9 regex)
 | 
				
			||||||
                                                (srfi srfi-1)
 | 
					                                                (srfi srfi-1)
 | 
				
			||||||
                                                (srfi srfi-26))
 | 
					                                                (srfi srfi-26))
 | 
				
			||||||
 | 
					                                     #:test-target "check-target-libjava"
 | 
				
			||||||
                                     ,@(package-arguments gcc))
 | 
					                                     ,@(package-arguments gcc))
 | 
				
			||||||
 | 
					       ((#:tests? _) #t)
 | 
				
			||||||
       ((#:configure-flags flags)
 | 
					       ((#:configure-flags flags)
 | 
				
			||||||
        `(let ((ecj (assoc-ref %build-inputs "ecj-bootstrap")))
 | 
					        `(let ((ecj (assoc-ref %build-inputs "ecj-bootstrap")))
 | 
				
			||||||
           `("--enable-java-home"
 | 
					           `("--enable-java-home"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,46 +0,0 @@
 | 
				
			||||||
;;; GNU Guix --- Functional package management for GNU
 | 
					 | 
				
			||||||
;;; Copyright © 2012 Ludovic Courtès <ludo@gnu.org>
 | 
					 | 
				
			||||||
;;;
 | 
					 | 
				
			||||||
;;; This file is part of GNU Guix.
 | 
					 | 
				
			||||||
;;;
 | 
					 | 
				
			||||||
;;; GNU Guix is free software; you can redistribute it and/or modify it
 | 
					 | 
				
			||||||
;;; under the terms of the GNU General Public License as published by
 | 
					 | 
				
			||||||
;;; the Free Software Foundation; either version 3 of the License, or (at
 | 
					 | 
				
			||||||
;;; your option) any later version.
 | 
					 | 
				
			||||||
;;;
 | 
					 | 
				
			||||||
;;; GNU Guix is distributed in the hope that it will be useful, but
 | 
					 | 
				
			||||||
;;; WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
					 | 
				
			||||||
;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
					 | 
				
			||||||
;;; GNU General Public License for more details.
 | 
					 | 
				
			||||||
;;;
 | 
					 | 
				
			||||||
;;; You should have received a copy of the GNU General Public License
 | 
					 | 
				
			||||||
;;; along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
(define-module (gnu packages gdbm)
 | 
					 | 
				
			||||||
  #:use-module (guix licenses)
 | 
					 | 
				
			||||||
  #:use-module (guix packages)
 | 
					 | 
				
			||||||
  #:use-module (guix download)
 | 
					 | 
				
			||||||
  #:use-module (guix build-system gnu))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
(define-public gdbm
 | 
					 | 
				
			||||||
  (package
 | 
					 | 
				
			||||||
    (name "gdbm")
 | 
					 | 
				
			||||||
    (version "1.11")
 | 
					 | 
				
			||||||
    (source
 | 
					 | 
				
			||||||
     (origin
 | 
					 | 
				
			||||||
      (method url-fetch)
 | 
					 | 
				
			||||||
      (uri (string-append "mirror://gnu/gdbm/gdbm-"
 | 
					 | 
				
			||||||
                          version ".tar.gz"))
 | 
					 | 
				
			||||||
      (sha256
 | 
					 | 
				
			||||||
       (base32
 | 
					 | 
				
			||||||
        "1hz3jgh3pd4qzp6jy0l8pd8x01g9abw7csnrlnj1a2sxy122z4cd"))))
 | 
					 | 
				
			||||||
    (arguments `(#:configure-flags '("--enable-libgdbm-compat")))
 | 
					 | 
				
			||||||
    (build-system gnu-build-system)
 | 
					 | 
				
			||||||
    (home-page "http://www.gnu.org/software/gdbm/")
 | 
					 | 
				
			||||||
    (synopsis
 | 
					 | 
				
			||||||
     "Hash library of database functions compatible with traditional dbm")
 | 
					 | 
				
			||||||
    (description
 | 
					 | 
				
			||||||
     "GDBM is a library for manipulating hashed databases.  It is used to
 | 
					 | 
				
			||||||
store key/value pairs in a file in a manner similar to the Unix dbm library
 | 
					 | 
				
			||||||
and provides interfaces to the traditional file format.")
 | 
					 | 
				
			||||||
    (license gpl3+)))
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,5 +1,6 @@
 | 
				
			||||||
;;; GNU Guix --- Functional package management for GNU
 | 
					;;; GNU Guix --- Functional package management for GNU
 | 
				
			||||||
;;; Copyright © 2013, 2014 Ludovic Courtès <ludo@gnu.org>
 | 
					;;; Copyright © 2013, 2014 Ludovic Courtès <ludo@gnu.org>
 | 
				
			||||||
 | 
					;;; Copyright © 2015 Mark H Weaver <mhw@netris.org>
 | 
				
			||||||
;;;
 | 
					;;;
 | 
				
			||||||
;;; This file is part of GNU Guix.
 | 
					;;; This file is part of GNU Guix.
 | 
				
			||||||
;;;
 | 
					;;;
 | 
				
			||||||
| 
						 | 
					@ -28,6 +29,8 @@
 | 
				
			||||||
  #:use-module (gnu packages fontutils)
 | 
					  #:use-module (gnu packages fontutils)
 | 
				
			||||||
  #:use-module (gnu packages linux)
 | 
					  #:use-module (gnu packages linux)
 | 
				
			||||||
  #:use-module (gnu packages qemu)
 | 
					  #:use-module (gnu packages qemu)
 | 
				
			||||||
 | 
					  #:use-module (gnu packages man)
 | 
				
			||||||
 | 
					  #:use-module (gnu packages texinfo)
 | 
				
			||||||
  #:use-module (gnu packages ncurses)
 | 
					  #:use-module (gnu packages ncurses)
 | 
				
			||||||
  #:use-module (gnu packages cdrom)
 | 
					  #:use-module (gnu packages cdrom)
 | 
				
			||||||
  #:use-module (srfi srfi-1))
 | 
					  #:use-module (srfi srfi-1))
 | 
				
			||||||
| 
						 | 
					@ -84,8 +87,9 @@
 | 
				
			||||||
    (build-system gnu-build-system)
 | 
					    (build-system gnu-build-system)
 | 
				
			||||||
    (arguments
 | 
					    (arguments
 | 
				
			||||||
     '(#:configure-flags '("--disable-werror")
 | 
					     '(#:configure-flags '("--disable-werror")
 | 
				
			||||||
       #:phases (alist-cons-before
 | 
					       #:phases (modify-phases %standard-phases
 | 
				
			||||||
                 'patch-source-shebangs 'patch-stuff
 | 
					                  (add-after
 | 
				
			||||||
 | 
					                   'unpack 'patch-stuff
 | 
				
			||||||
                   (lambda* (#:key inputs #:allow-other-keys)
 | 
					                   (lambda* (#:key inputs #:allow-other-keys)
 | 
				
			||||||
                     (substitute* "grub-core/Makefile.in"
 | 
					                     (substitute* "grub-core/Makefile.in"
 | 
				
			||||||
                       (("/bin/sh") (which "sh")))
 | 
					                       (("/bin/sh") (which "sh")))
 | 
				
			||||||
| 
						 | 
					@ -96,18 +100,22 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                     ;; TODO: Re-enable this test when we have Parted.
 | 
					                     ;; TODO: Re-enable this test when we have Parted.
 | 
				
			||||||
                     (substitute* "tests/partmap_test.in"
 | 
					                     (substitute* "tests/partmap_test.in"
 | 
				
			||||||
                     (("set -e") "exit 77")))
 | 
					                       (("set -e") "exit 77"))
 | 
				
			||||||
                 %standard-phases)))
 | 
					
 | 
				
			||||||
 | 
					                     #t)))))
 | 
				
			||||||
    (inputs
 | 
					    (inputs
 | 
				
			||||||
     `(;; ("lvm2" ,lvm2)
 | 
					     `(;; ("lvm2" ,lvm2)
 | 
				
			||||||
       ("gettext" ,gnu-gettext)
 | 
					       ("gettext" ,gnu-gettext)
 | 
				
			||||||
       ("freetype" ,freetype)
 | 
					       ("freetype" ,freetype)
 | 
				
			||||||
       ;; ("libusb" ,libusb)
 | 
					       ;; ("libusb" ,libusb)
 | 
				
			||||||
 | 
					       ;; ("fuse" ,fuse)
 | 
				
			||||||
       ("ncurses" ,ncurses)))
 | 
					       ("ncurses" ,ncurses)))
 | 
				
			||||||
    (native-inputs
 | 
					    (native-inputs
 | 
				
			||||||
     `(("unifont" ,unifont)
 | 
					     `(("unifont" ,unifont)
 | 
				
			||||||
       ("bison" ,bison)
 | 
					       ("bison" ,bison)
 | 
				
			||||||
       ("flex" ,flex)
 | 
					       ("flex" ,flex)
 | 
				
			||||||
 | 
					       ("texinfo" ,texinfo)
 | 
				
			||||||
 | 
					       ("help2man" ,help2man)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
       ;; Dependencies for the test suite.  The "real" QEMU is needed here,
 | 
					       ;; Dependencies for the test suite.  The "real" QEMU is needed here,
 | 
				
			||||||
       ;; because several targets are used.
 | 
					       ;; because several targets are used.
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -38,7 +38,7 @@
 | 
				
			||||||
  #:use-module (gnu packages base)
 | 
					  #:use-module (gnu packages base)
 | 
				
			||||||
  #:use-module (gnu packages texinfo)
 | 
					  #:use-module (gnu packages texinfo)
 | 
				
			||||||
  #:use-module (gnu packages gettext)
 | 
					  #:use-module (gnu packages gettext)
 | 
				
			||||||
  #:use-module (gnu packages gdbm)
 | 
					  #:use-module (gnu packages databases)
 | 
				
			||||||
  #:use-module (gnu packages python)
 | 
					  #:use-module (gnu packages python)
 | 
				
			||||||
  #:use-module (guix packages)
 | 
					  #:use-module (guix packages)
 | 
				
			||||||
  #:use-module (guix download)
 | 
					  #:use-module (guix download)
 | 
				
			||||||
| 
						 | 
					@ -189,15 +189,15 @@ without requiring the source code to be rewritten.")
 | 
				
			||||||
(define-public guile-next
 | 
					(define-public guile-next
 | 
				
			||||||
  (package (inherit guile-2.0)
 | 
					  (package (inherit guile-2.0)
 | 
				
			||||||
    (name "guile-next")
 | 
					    (name "guile-next")
 | 
				
			||||||
    (version "20150815.00884bb")
 | 
					    (version "20151025.e5bccb6")
 | 
				
			||||||
    (source (origin
 | 
					    (source (origin
 | 
				
			||||||
              (method git-fetch)
 | 
					              (method git-fetch)
 | 
				
			||||||
              (uri (git-reference
 | 
					              (uri (git-reference
 | 
				
			||||||
                    (url "git://git.sv.gnu.org/guile.git")
 | 
					                    (url "git://git.sv.gnu.org/guile.git")
 | 
				
			||||||
                    (commit "00884bb79fff41fdf5f22f24a74e366a94a14c9b")))
 | 
					                    (commit "e5bccb6e5df3485152bc6501e1f36275e09c6352")))
 | 
				
			||||||
              (sha256
 | 
					              (sha256
 | 
				
			||||||
               (base32
 | 
					               (base32
 | 
				
			||||||
                "0qk8m9aq3i7pzw6npim58xmsvjqfz5kl1pkyb6b43awn2vydydi5"))))
 | 
					                "0z7ywryfcargrpz8hdrz6sfs06c2h2y9baqin3mbjvvg96a5bx47"))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    (arguments
 | 
					    (arguments
 | 
				
			||||||
     (substitute-keyword-arguments `(;; Tests aren't passing for now.
 | 
					     (substitute-keyword-arguments `(;; Tests aren't passing for now.
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -865,14 +865,6 @@ OpenAL.")
 | 
				
			||||||
        (base32
 | 
					        (base32
 | 
				
			||||||
         "1sa3zx3vrs1gbinxx33zwq0x2bsf3i964bff7419p7vzidn36k46"))))
 | 
					         "1sa3zx3vrs1gbinxx33zwq0x2bsf3i964bff7419p7vzidn36k46"))))
 | 
				
			||||||
    (build-system haskell-build-system)
 | 
					    (build-system haskell-build-system)
 | 
				
			||||||
    (arguments
 | 
					 | 
				
			||||||
     `(#:phases
 | 
					 | 
				
			||||||
       (modify-phases %standard-phases
 | 
					 | 
				
			||||||
         (add-after
 | 
					 | 
				
			||||||
          'unpack 'fix-/bin/sh
 | 
					 | 
				
			||||||
          (lambda _
 | 
					 | 
				
			||||||
            ;; Use `sh', not `/bin/sh'.
 | 
					 | 
				
			||||||
            (setenv "CONFIG_SHELL" "sh"))))))
 | 
					 | 
				
			||||||
    (inputs
 | 
					    (inputs
 | 
				
			||||||
     `(("sdl" ,sdl)))
 | 
					     `(("sdl" ,sdl)))
 | 
				
			||||||
    (home-page "https://hackage.haskell.org/package/SDL")
 | 
					    (home-page "https://hackage.haskell.org/package/SDL")
 | 
				
			||||||
| 
						 | 
					@ -903,14 +895,7 @@ award winning Linux port of \"Civilization: Call To Power.\"")
 | 
				
			||||||
     `(#:configure-flags
 | 
					     `(#:configure-flags
 | 
				
			||||||
       (let* ((sdl-mixer (assoc-ref %build-inputs "sdl-mixer"))
 | 
					       (let* ((sdl-mixer (assoc-ref %build-inputs "sdl-mixer"))
 | 
				
			||||||
              (sdl-mixer-include (string-append sdl-mixer "/include/SDL")))
 | 
					              (sdl-mixer-include (string-append sdl-mixer "/include/SDL")))
 | 
				
			||||||
         (list (string-append "--extra-include-dirs=" sdl-mixer-include)))
 | 
					         (list (string-append "--extra-include-dirs=" sdl-mixer-include)))))
 | 
				
			||||||
       #:phases
 | 
					 | 
				
			||||||
       (modify-phases %standard-phases
 | 
					 | 
				
			||||||
         (add-after
 | 
					 | 
				
			||||||
          'unpack 'fix-/bin/sh
 | 
					 | 
				
			||||||
          (lambda _
 | 
					 | 
				
			||||||
            ;; Use `sh', not `/bin/sh'.
 | 
					 | 
				
			||||||
            (setenv "CONFIG_SHELL" "sh"))))))
 | 
					 | 
				
			||||||
    (propagated-inputs
 | 
					    (propagated-inputs
 | 
				
			||||||
     `(("ghc-sdl" ,ghc-sdl)))
 | 
					     `(("ghc-sdl" ,ghc-sdl)))
 | 
				
			||||||
    (inputs
 | 
					    (inputs
 | 
				
			||||||
| 
						 | 
					@ -942,14 +927,7 @@ MIDI, Ogg Vorbis, and SMPEG MP3 libraries.")
 | 
				
			||||||
     `(#:configure-flags
 | 
					     `(#:configure-flags
 | 
				
			||||||
       (let* ((sdl-image (assoc-ref %build-inputs "sdl-image"))
 | 
					       (let* ((sdl-image (assoc-ref %build-inputs "sdl-image"))
 | 
				
			||||||
              (sdl-image-include (string-append sdl-image "/include/SDL")))
 | 
					              (sdl-image-include (string-append sdl-image "/include/SDL")))
 | 
				
			||||||
         (list (string-append "--extra-include-dirs=" sdl-image-include)))
 | 
					         (list (string-append "--extra-include-dirs=" sdl-image-include)))))
 | 
				
			||||||
       #:phases
 | 
					 | 
				
			||||||
       (modify-phases %standard-phases
 | 
					 | 
				
			||||||
         (add-after
 | 
					 | 
				
			||||||
          'unpack 'fix-/bin/sh
 | 
					 | 
				
			||||||
          (lambda _
 | 
					 | 
				
			||||||
            ;; Use `sh', not `/bin/sh'.
 | 
					 | 
				
			||||||
            (setenv "CONFIG_SHELL" "sh"))))))
 | 
					 | 
				
			||||||
    (propagated-inputs
 | 
					    (propagated-inputs
 | 
				
			||||||
     `(("ghc-sdl" ,ghc-sdl)))
 | 
					     `(("ghc-sdl" ,ghc-sdl)))
 | 
				
			||||||
    (inputs
 | 
					    (inputs
 | 
				
			||||||
| 
						 | 
					@ -1031,10 +1009,10 @@ found at runtime, a userError is thrown.")
 | 
				
			||||||
    (build-system haskell-build-system)
 | 
					    (build-system haskell-build-system)
 | 
				
			||||||
    (propagated-inputs
 | 
					    (propagated-inputs
 | 
				
			||||||
     `(("ghc-statevar" ,ghc-statevar)
 | 
					     `(("ghc-statevar" ,ghc-statevar)
 | 
				
			||||||
       ("ghc-openglraw" ,ghc-openglraw)))
 | 
					       ("ghc-openglraw" ,ghc-openglraw)
 | 
				
			||||||
    (inputs
 | 
					 | 
				
			||||||
     `(("ghc-opengl" ,ghc-opengl)
 | 
					 | 
				
			||||||
       ("freeglut" ,freeglut)))
 | 
					       ("freeglut" ,freeglut)))
 | 
				
			||||||
 | 
					    (inputs
 | 
				
			||||||
 | 
					     `(("ghc-opengl" ,ghc-opengl)))
 | 
				
			||||||
    (home-page "http://www.haskell.org/haskellwiki/Opengl")
 | 
					    (home-page "http://www.haskell.org/haskellwiki/Opengl")
 | 
				
			||||||
    (synopsis "Haskell bindings for the OpenGL Utility Toolkit")
 | 
					    (synopsis "Haskell bindings for the OpenGL Utility Toolkit")
 | 
				
			||||||
    (description "This library provides Haskell bindings for the OpenGL
 | 
					    (description "This library provides Haskell bindings for the OpenGL
 | 
				
			||||||
| 
						 | 
					@ -1216,12 +1194,6 @@ date and time formats.")
 | 
				
			||||||
        (base32
 | 
					        (base32
 | 
				
			||||||
         "1h9b26s3kfh2k0ih4383w90ibji6n0iwamxp6rfp2lbq1y5ibjqw"))))
 | 
					         "1h9b26s3kfh2k0ih4383w90ibji6n0iwamxp6rfp2lbq1y5ibjqw"))))
 | 
				
			||||||
    (build-system haskell-build-system)
 | 
					    (build-system haskell-build-system)
 | 
				
			||||||
    (arguments
 | 
					 | 
				
			||||||
     `(#:phases
 | 
					 | 
				
			||||||
       (modify-phases %standard-phases
 | 
					 | 
				
			||||||
         (add-after 'unpack 'fix-/bin/sh
 | 
					 | 
				
			||||||
                    (lambda _
 | 
					 | 
				
			||||||
                      (setenv "CONFIG_SHELL" "sh"))))))
 | 
					 | 
				
			||||||
    (propagated-inputs
 | 
					    (propagated-inputs
 | 
				
			||||||
     `(("ghc-old-locale" ,ghc-old-locale)))
 | 
					     `(("ghc-old-locale" ,ghc-old-locale)))
 | 
				
			||||||
    (home-page "http://hackage.haskell.org/package/old-time")
 | 
					    (home-page "http://hackage.haskell.org/package/old-time")
 | 
				
			||||||
| 
						 | 
					@ -1433,12 +1405,6 @@ environment variables.")
 | 
				
			||||||
                           "X11-" version ".tar.gz"))
 | 
					                           "X11-" version ".tar.gz"))
 | 
				
			||||||
       (sha256
 | 
					       (sha256
 | 
				
			||||||
        (base32 "1kzjcynm3rr83ihqx2y2d852jc49da4p18gv6jzm7g87z22x85jj"))))
 | 
					        (base32 "1kzjcynm3rr83ihqx2y2d852jc49da4p18gv6jzm7g87z22x85jj"))))
 | 
				
			||||||
    (arguments
 | 
					 | 
				
			||||||
     `(#:phases (modify-phases %standard-phases
 | 
					 | 
				
			||||||
                  (add-before 'configure 'set-sh
 | 
					 | 
				
			||||||
                              (lambda _
 | 
					 | 
				
			||||||
                                (setenv "CONFIG_SHELL" "sh")
 | 
					 | 
				
			||||||
                                #t)))))
 | 
					 | 
				
			||||||
    (build-system haskell-build-system)
 | 
					    (build-system haskell-build-system)
 | 
				
			||||||
    (inputs
 | 
					    (inputs
 | 
				
			||||||
     `(("libx11" ,libx11)
 | 
					     `(("libx11" ,libx11)
 | 
				
			||||||
| 
						 | 
					@ -1801,13 +1767,8 @@ but also need those types.")
 | 
				
			||||||
         "0dyvyxwaffb94bgri1wc4b9wqaasy32pyjn0lww3dqblxv8fn5ax"))))
 | 
					         "0dyvyxwaffb94bgri1wc4b9wqaasy32pyjn0lww3dqblxv8fn5ax"))))
 | 
				
			||||||
    (build-system haskell-build-system)
 | 
					    (build-system haskell-build-system)
 | 
				
			||||||
    (arguments
 | 
					    (arguments
 | 
				
			||||||
     `(#:tests? #f ; FIXME: Test fails with "System.Time not found".  This is
 | 
					     `(#:tests? #f)) ; FIXME: Test fails with "System.Time not found".  This
 | 
				
			||||||
                   ; weird, that should be provided by GHC 7.10.2.
 | 
					                     ; is weird, that should be provided by GHC 7.10.2.
 | 
				
			||||||
       #:phases
 | 
					 | 
				
			||||||
       (modify-phases %standard-phases
 | 
					 | 
				
			||||||
         (add-after 'unpack 'fix-/bin/sh
 | 
					 | 
				
			||||||
                    (lambda _
 | 
					 | 
				
			||||||
                      (setenv "CONFIG_SHELL" "sh"))))))
 | 
					 | 
				
			||||||
    (propagated-inputs
 | 
					    (propagated-inputs
 | 
				
			||||||
     `(("ghc-old-time" ,ghc-old-time)
 | 
					     `(("ghc-old-time" ,ghc-old-time)
 | 
				
			||||||
       ("ghc-old-locale" ,ghc-old-locale)))
 | 
					       ("ghc-old-locale" ,ghc-old-locale)))
 | 
				
			||||||
| 
						 | 
					@ -3162,11 +3123,7 @@ boxed and storable vectors.")
 | 
				
			||||||
    (inputs
 | 
					    (inputs
 | 
				
			||||||
     `(("ghc-hunit" ,ghc-hunit)))
 | 
					     `(("ghc-hunit" ,ghc-hunit)))
 | 
				
			||||||
    (arguments
 | 
					    (arguments
 | 
				
			||||||
     `(#:tests? #f  ; FIXME: currently missing libraries used for tests.
 | 
					     `(#:tests? #f))      ; FIXME: currently missing libraries used for tests.
 | 
				
			||||||
       #:phases
 | 
					 | 
				
			||||||
       (modify-phases %standard-phases
 | 
					 | 
				
			||||||
         (add-before 'configure 'set-sh
 | 
					 | 
				
			||||||
                     (lambda _ (setenv "CONFIG_SHELL" "sh"))))))
 | 
					 | 
				
			||||||
    (home-page "https://github.com/haskell/network")
 | 
					    (home-page "https://github.com/haskell/network")
 | 
				
			||||||
    (synopsis "Low-level networking interface")
 | 
					    (synopsis "Low-level networking interface")
 | 
				
			||||||
    (description
 | 
					    (description
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -576,7 +576,7 @@ build process and its dependencies, whereas Make uses Makefile format.")
 | 
				
			||||||
    (license license:gpl2+)))
 | 
					    (license license:gpl2+)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(define-public icedtea7
 | 
					(define-public icedtea7
 | 
				
			||||||
  (let* ((version "2.6.1")
 | 
					  (let* ((version "2.6.2")
 | 
				
			||||||
         (drop (lambda (name hash)
 | 
					         (drop (lambda (name hash)
 | 
				
			||||||
                 (origin
 | 
					                 (origin
 | 
				
			||||||
                   (method url-fetch)
 | 
					                   (method url-fetch)
 | 
				
			||||||
| 
						 | 
					@ -594,7 +594,7 @@ build process and its dependencies, whereas Make uses Makefile format.")
 | 
				
			||||||
                      version ".tar.xz"))
 | 
					                      version ".tar.xz"))
 | 
				
			||||||
                (sha256
 | 
					                (sha256
 | 
				
			||||||
                 (base32
 | 
					                 (base32
 | 
				
			||||||
                  "0s107vi1530a5dyxacysc4m64zshgg2d3xpndsc0ws99wz0zmr6c"))
 | 
					                  "0xi0w8gpxx3r68hyi7fb991hxb3rqfp7895nfsl4wj3sa1f5ds5y"))
 | 
				
			||||||
                (modules '((guix build utils)))
 | 
					                (modules '((guix build utils)))
 | 
				
			||||||
                (snippet
 | 
					                (snippet
 | 
				
			||||||
                 '(substitute* "Makefile.in"
 | 
					                 '(substitute* "Makefile.in"
 | 
				
			||||||
| 
						 | 
					@ -728,24 +728,24 @@ build process and its dependencies, whereas Make uses Makefile format.")
 | 
				
			||||||
      (native-inputs
 | 
					      (native-inputs
 | 
				
			||||||
       `(("openjdk-drop"
 | 
					       `(("openjdk-drop"
 | 
				
			||||||
          ,(drop "openjdk"
 | 
					          ,(drop "openjdk"
 | 
				
			||||||
                 "0gs6vbj5c09516r460r68i7vm652sb25h973kq9hfx749qbs0s01"))
 | 
					                 "0jabxc8iw7ciz6f2qshcpla66qniy686vnxnfx3h2yw7syvas4a9"))
 | 
				
			||||||
         ("corba-drop"
 | 
					         ("corba-drop"
 | 
				
			||||||
          ,(drop "corba"
 | 
					          ,(drop "corba"
 | 
				
			||||||
                 "1y7nf6hqry1az28i3b6ln5cs82cww1jj4r61jk54ab8s2xydj0yd"))
 | 
					                 "1bw22djg8mfqqn8kp8mpbj9vi4pl8dk67qwwrny67d0fvirixylj"))
 | 
				
			||||||
         ("jaxp-drop"
 | 
					         ("jaxp-drop"
 | 
				
			||||||
          ,(drop "jaxp"
 | 
					          ,(drop "jaxp"
 | 
				
			||||||
                 "1szs2w0p496k1qi3yl1fymj0g10lgq31am35zlalcz7pi4l4q360"))
 | 
					                 "1h3g2dwbj8ihicl73qbr4cvvc3i5bs5ckrpja1nx6g5b56xa7kcl"))
 | 
				
			||||||
         ("jaxws-drop"
 | 
					         ("jaxws-drop"
 | 
				
			||||||
          ,(drop "jaxws"
 | 
					          ,(drop "jaxws"
 | 
				
			||||||
                 "17xfy9q2zdpap7m2prbf937x55jm3pwrqpp1fdlridraqrfzjprd"))
 | 
					                 "1m1h7455qn4pdhb5yamdl9965iz9260lzwl3njcs35vi14v7fihl"))
 | 
				
			||||||
         ("jdk-drop"
 | 
					         ("jdk-drop"
 | 
				
			||||||
          ,(drop "jdk"
 | 
					          ,(drop "jdk"
 | 
				
			||||||
                 "0qskhwr4nml49zhbppnq8ldj0x001bl37mrcpxslbnsdw5skw258"))
 | 
					                 "1wcaxf2chnlpk34q04c23im6z32dy8fr6f9giz3ih65nyvah3n3s"))
 | 
				
			||||||
         ("langtools-drop"
 | 
					         ("langtools-drop"
 | 
				
			||||||
          ,(drop "langtools"
 | 
					          ,(drop "langtools"
 | 
				
			||||||
                 "0hyxrrb0zrx1pq1s90bmim94hwfligr0ajzs1874da4gclbbvfbd"))
 | 
					                 "0da3cmm8nwz7dk2sqnywvidaa0kjnyzzi33p2lkdi4415f8yhgx5"))
 | 
				
			||||||
         ("hotspot-drop"
 | 
					         ("hotspot-drop"
 | 
				
			||||||
          ,(drop "hotspot"
 | 
					          ,(drop "hotspot"
 | 
				
			||||||
                 "1cv8df2s89mnjzg4rja4i89d4fr8n0c3v5y2cqbww1ma1463n100"))
 | 
					                 "0fn3cjhqsgbkfzychkvvw6whxil2n9dr6q0196ywxzkinny1hjcq"))
 | 
				
			||||||
         ,@(fold alist-delete (package-native-inputs icedtea6)
 | 
					         ,@(fold alist-delete (package-native-inputs icedtea6)
 | 
				
			||||||
                 '("openjdk6-src")))))))
 | 
					                 '("openjdk6-src")))))))
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -210,7 +210,7 @@ for SYSTEM, or #f if there is no configuration for SYSTEM."
 | 
				
			||||||
     #f)))
 | 
					     #f)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(define-public linux-libre
 | 
					(define-public linux-libre
 | 
				
			||||||
  (let* ((version "4.2.4")
 | 
					  (let* ((version "4.2.5")
 | 
				
			||||||
         (build-phase
 | 
					         (build-phase
 | 
				
			||||||
          '(lambda* (#:key system inputs #:allow-other-keys #:rest args)
 | 
					          '(lambda* (#:key system inputs #:allow-other-keys #:rest args)
 | 
				
			||||||
             ;; Apply the neat patch.
 | 
					             ;; Apply the neat patch.
 | 
				
			||||||
| 
						 | 
					@ -220,6 +220,7 @@ for SYSTEM, or #f if there is no configuration for SYSTEM."
 | 
				
			||||||
             (let ((arch (car (string-split system #\-))))
 | 
					             (let ((arch (car (string-split system #\-))))
 | 
				
			||||||
               (setenv "ARCH"
 | 
					               (setenv "ARCH"
 | 
				
			||||||
                       (cond ((string=? arch "i686") "i386")
 | 
					                       (cond ((string=? arch "i686") "i386")
 | 
				
			||||||
 | 
					                             ((string=? arch "mips64el") "mips")
 | 
				
			||||||
                             (else arch)))
 | 
					                             (else arch)))
 | 
				
			||||||
               (format #t "`ARCH' set to `~a'~%" (getenv "ARCH")))
 | 
					               (format #t "`ARCH' set to `~a'~%" (getenv "ARCH")))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -266,7 +267,7 @@ for SYSTEM, or #f if there is no configuration for SYSTEM."
 | 
				
			||||||
               (for-each (lambda (file)
 | 
					               (for-each (lambda (file)
 | 
				
			||||||
                           (copy-file file
 | 
					                           (copy-file file
 | 
				
			||||||
                                      (string-append out "/" (basename file))))
 | 
					                                      (string-append out "/" (basename file))))
 | 
				
			||||||
                         (find-files "." "^(bzImage|System\\.map)$"))
 | 
					                         (find-files "." "^(bzImage|vmlinuz|System\\.map)$"))
 | 
				
			||||||
               (copy-file ".config" (string-append out "/config"))
 | 
					               (copy-file ".config" (string-append out "/config"))
 | 
				
			||||||
               (zero? (system* "make"
 | 
					               (zero? (system* "make"
 | 
				
			||||||
                               (string-append "DEPMOD=" mit "/sbin/depmod")
 | 
					                               (string-append "DEPMOD=" mit "/sbin/depmod")
 | 
				
			||||||
| 
						 | 
					@ -283,8 +284,9 @@ for SYSTEM, or #f if there is no configuration for SYSTEM."
 | 
				
			||||||
             (uri (linux-libre-urls version))
 | 
					             (uri (linux-libre-urls version))
 | 
				
			||||||
             (sha256
 | 
					             (sha256
 | 
				
			||||||
              (base32
 | 
					              (base32
 | 
				
			||||||
               "11r9yhi4c2zwfb8i21zk014gcm1kvnabq410wjy6g6a015d5v37w"))))
 | 
					               "13ar9sghm2g5w2km9x2d07q3lh81rz286d6slklv56qanm24chzx"))))
 | 
				
			||||||
    (build-system gnu-build-system)
 | 
					    (build-system gnu-build-system)
 | 
				
			||||||
 | 
					    (supported-systems '("x86_64-linux" "i686-linux"))
 | 
				
			||||||
    (native-inputs `(("perl" ,perl)
 | 
					    (native-inputs `(("perl" ,perl)
 | 
				
			||||||
                     ("bc" ,bc)
 | 
					                     ("bc" ,bc)
 | 
				
			||||||
                     ("module-init-tools" ,module-init-tools)
 | 
					                     ("module-init-tools" ,module-init-tools)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -36,7 +36,6 @@
 | 
				
			||||||
  #:use-module (gnu packages dejagnu)
 | 
					  #:use-module (gnu packages dejagnu)
 | 
				
			||||||
  #:use-module (gnu packages emacs)
 | 
					  #:use-module (gnu packages emacs)
 | 
				
			||||||
  #:use-module (gnu packages enchant)
 | 
					  #:use-module (gnu packages enchant)
 | 
				
			||||||
  #:use-module (gnu packages gdbm)
 | 
					 | 
				
			||||||
  #:use-module (gnu packages ghostscript)
 | 
					  #:use-module (gnu packages ghostscript)
 | 
				
			||||||
  #:use-module (gnu packages glib)
 | 
					  #:use-module (gnu packages glib)
 | 
				
			||||||
  #:use-module (gnu packages gnome)
 | 
					  #:use-module (gnu packages gnome)
 | 
				
			||||||
| 
						 | 
					@ -48,7 +47,6 @@
 | 
				
			||||||
  #:use-module (gnu packages libidn)
 | 
					  #:use-module (gnu packages libidn)
 | 
				
			||||||
  #:use-module (gnu packages linux)
 | 
					  #:use-module (gnu packages linux)
 | 
				
			||||||
  #:use-module (gnu packages m4)
 | 
					  #:use-module (gnu packages m4)
 | 
				
			||||||
  #:use-module (gnu packages databases)
 | 
					 | 
				
			||||||
  #:use-module (gnu packages ncurses)
 | 
					  #:use-module (gnu packages ncurses)
 | 
				
			||||||
  #:use-module (gnu packages pcre)
 | 
					  #:use-module (gnu packages pcre)
 | 
				
			||||||
  #:use-module (gnu packages perl)
 | 
					  #:use-module (gnu packages perl)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -24,9 +24,9 @@
 | 
				
			||||||
  #:use-module (guix download)
 | 
					  #:use-module (guix download)
 | 
				
			||||||
  #:use-module (guix packages)
 | 
					  #:use-module (guix packages)
 | 
				
			||||||
  #:use-module (guix build-system gnu)
 | 
					  #:use-module (guix build-system gnu)
 | 
				
			||||||
 | 
					  #:use-module (gnu packages databases)
 | 
				
			||||||
  #:use-module (gnu packages flex)
 | 
					  #:use-module (gnu packages flex)
 | 
				
			||||||
  #:use-module (gnu packages gawk)
 | 
					  #:use-module (gnu packages gawk)
 | 
				
			||||||
  #:use-module (gnu packages gdbm)
 | 
					 | 
				
			||||||
  #:use-module (gnu packages groff)
 | 
					  #:use-module (gnu packages groff)
 | 
				
			||||||
  #:use-module (gnu packages less)
 | 
					  #:use-module (gnu packages less)
 | 
				
			||||||
  #:use-module (gnu packages lynx)
 | 
					  #:use-module (gnu packages lynx)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1461,7 +1461,7 @@ constant parts of it.")
 | 
				
			||||||
(define-public openblas
 | 
					(define-public openblas
 | 
				
			||||||
  (package
 | 
					  (package
 | 
				
			||||||
    (name "openblas")
 | 
					    (name "openblas")
 | 
				
			||||||
    (version "0.2.14")
 | 
					    (version "0.2.15")
 | 
				
			||||||
    (source
 | 
					    (source
 | 
				
			||||||
     (origin
 | 
					     (origin
 | 
				
			||||||
       (method url-fetch)
 | 
					       (method url-fetch)
 | 
				
			||||||
| 
						 | 
					@ -1470,7 +1470,7 @@ constant parts of it.")
 | 
				
			||||||
       (file-name (string-append name "-" version ".tar.gz"))
 | 
					       (file-name (string-append name "-" version ".tar.gz"))
 | 
				
			||||||
       (sha256
 | 
					       (sha256
 | 
				
			||||||
        (base32
 | 
					        (base32
 | 
				
			||||||
         "0av3pd96j8rx5i65f652xv9wqfkaqn0w4ma1gvbyz73i6j2hi9db"))))
 | 
					         "1k5f6vjlk54qlplk5m7xkbaw6g2y7dl50lwwdv6xsbcsgsbxfcpy"))))
 | 
				
			||||||
    (build-system gnu-build-system)
 | 
					    (build-system gnu-build-system)
 | 
				
			||||||
    (arguments
 | 
					    (arguments
 | 
				
			||||||
     `(#:tests? #f  ;no "check" target
 | 
					     `(#:tests? #f  ;no "check" target
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -23,9 +23,12 @@
 | 
				
			||||||
  #:use-module (guix git-download)
 | 
					  #:use-module (guix git-download)
 | 
				
			||||||
  #:use-module (guix utils)
 | 
					  #:use-module (guix utils)
 | 
				
			||||||
  #:use-module (guix build-system gnu)
 | 
					  #:use-module (guix build-system gnu)
 | 
				
			||||||
  #:use-module ((guix licenses) #:select (gpl2+ gpl3+ lgpl2.1+))
 | 
					  #:use-module (guix build-system python)
 | 
				
			||||||
 | 
					  #:use-module ((guix licenses) #:select (gpl2+ gpl3+ lgpl2.1+ asl2.0))
 | 
				
			||||||
  #:use-module (gnu packages)
 | 
					  #:use-module (gnu packages)
 | 
				
			||||||
  #:use-module (gnu packages guile)
 | 
					  #:use-module (gnu packages guile)
 | 
				
			||||||
 | 
					  #:use-module (gnu packages file)
 | 
				
			||||||
 | 
					  #:use-module (gnu packages backup)
 | 
				
			||||||
  #:use-module (gnu packages compression)
 | 
					  #:use-module (gnu packages compression)
 | 
				
			||||||
  #:use-module (gnu packages gnupg)
 | 
					  #:use-module (gnu packages gnupg)
 | 
				
			||||||
  #:use-module (gnu packages databases)
 | 
					  #:use-module (gnu packages databases)
 | 
				
			||||||
| 
						 | 
					@ -34,12 +37,17 @@
 | 
				
			||||||
  #:use-module (gnu packages autotools)
 | 
					  #:use-module (gnu packages autotools)
 | 
				
			||||||
  #:use-module (gnu packages gettext)
 | 
					  #:use-module (gnu packages gettext)
 | 
				
			||||||
  #:use-module (gnu packages texinfo)
 | 
					  #:use-module (gnu packages texinfo)
 | 
				
			||||||
 | 
					  #:use-module (gnu packages nettle)
 | 
				
			||||||
  #:use-module (gnu packages perl)
 | 
					  #:use-module (gnu packages perl)
 | 
				
			||||||
  #:use-module (gnu packages curl)
 | 
					  #:use-module (gnu packages curl)
 | 
				
			||||||
  #:use-module (gnu packages web)
 | 
					  #:use-module (gnu packages web)
 | 
				
			||||||
  #:use-module (gnu packages man)
 | 
					  #:use-module (gnu packages man)
 | 
				
			||||||
  #:use-module (gnu packages emacs)
 | 
					  #:use-module (gnu packages emacs)
 | 
				
			||||||
  #:use-module (gnu packages bdw-gc)
 | 
					  #:use-module (gnu packages bdw-gc)
 | 
				
			||||||
 | 
					  #:use-module (gnu packages python)
 | 
				
			||||||
 | 
					  #:use-module (gnu packages popt)
 | 
				
			||||||
 | 
					  #:use-module (gnu packages gnuzilla)
 | 
				
			||||||
 | 
					  #:use-module (gnu packages cpio)
 | 
				
			||||||
  #:use-module (gnu packages tls))
 | 
					  #:use-module (gnu packages tls))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(define (boot-guile-uri arch)
 | 
					(define (boot-guile-uri arch)
 | 
				
			||||||
| 
						 | 
					@ -275,3 +283,130 @@ typically used for managing software packages installed from source, by
 | 
				
			||||||
letting you install them apart in distinct directories and then create
 | 
					letting you install them apart in distinct directories and then create
 | 
				
			||||||
symlinks to the files in a common directory such as /usr/local.")
 | 
					symlinks to the files in a common directory such as /usr/local.")
 | 
				
			||||||
    (license gpl2+)))
 | 
					    (license gpl2+)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(define-public rpm
 | 
				
			||||||
 | 
					  (package
 | 
				
			||||||
 | 
					    (name "rpm")
 | 
				
			||||||
 | 
					    (version "4.12.0")
 | 
				
			||||||
 | 
					    (source (origin
 | 
				
			||||||
 | 
					              (method url-fetch)
 | 
				
			||||||
 | 
					              (uri (string-append "http://rpm.org/releases/rpm-4.12.x/rpm-"
 | 
				
			||||||
 | 
					                                  version ".tar.bz2"))
 | 
				
			||||||
 | 
					              (sha256
 | 
				
			||||||
 | 
					               (base32
 | 
				
			||||||
 | 
					                "18hk47hc755nslvb7xkq4jb095z7va0nlcyxdpxayc4lmb8mq3bp"))))
 | 
				
			||||||
 | 
					    (build-system gnu-build-system)
 | 
				
			||||||
 | 
					    (arguments
 | 
				
			||||||
 | 
					     '(#:configure-flags '("--with-external-db"   ;use the system's bdb
 | 
				
			||||||
 | 
					                           "--enable-python"
 | 
				
			||||||
 | 
					                           "--without-lua")
 | 
				
			||||||
 | 
					       #:phases (modify-phases %standard-phases
 | 
				
			||||||
 | 
					                  (add-before 'configure 'set-nspr-search-path
 | 
				
			||||||
 | 
					                    (lambda* (#:key inputs #:allow-other-keys)
 | 
				
			||||||
 | 
					                      ;; nspr.pc contains the right -I flag pointing to
 | 
				
			||||||
 | 
					                      ;; 'include/nspr', but unfortunately 'configure' doesn't
 | 
				
			||||||
 | 
					                      ;; use 'pkg-config'.  Thus, augment CPATH.
 | 
				
			||||||
 | 
					                      ;; Likewise for NSS.
 | 
				
			||||||
 | 
					                      (let ((nspr (assoc-ref inputs "nspr"))
 | 
				
			||||||
 | 
					                            (nss  (assoc-ref inputs "nss")))
 | 
				
			||||||
 | 
					                        (setenv "CPATH"
 | 
				
			||||||
 | 
					                                (string-append (getenv "CPATH") ":"
 | 
				
			||||||
 | 
					                                               nspr "/include/nspr:"
 | 
				
			||||||
 | 
					                                               nss "/include/nss"))
 | 
				
			||||||
 | 
					                        (setenv "LIBRARY_PATH"
 | 
				
			||||||
 | 
					                                (string-append (getenv "LIBRARY_PATH") ":"
 | 
				
			||||||
 | 
					                                               nss "/lib/nss"))
 | 
				
			||||||
 | 
					                        #t)))
 | 
				
			||||||
 | 
					                  (add-after 'install 'fix-rpm-symlinks
 | 
				
			||||||
 | 
					                    (lambda* (#:key outputs #:allow-other-keys)
 | 
				
			||||||
 | 
					                      ;; 'make install' gets these symlinks wrong.  Fix them.
 | 
				
			||||||
 | 
					                      (let* ((out (assoc-ref outputs "out"))
 | 
				
			||||||
 | 
					                             (bin (string-append out "/bin")))
 | 
				
			||||||
 | 
					                        (with-directory-excursion bin
 | 
				
			||||||
 | 
					                          (for-each (lambda (file)
 | 
				
			||||||
 | 
					                                      (delete-file file)
 | 
				
			||||||
 | 
					                                      (symlink "rpm" file))
 | 
				
			||||||
 | 
					                                    '("rpmquery" "rpmverify"))
 | 
				
			||||||
 | 
					                          #t)))))))
 | 
				
			||||||
 | 
					    (native-inputs
 | 
				
			||||||
 | 
					     `(("pkg-config" ,pkg-config)))
 | 
				
			||||||
 | 
					    (inputs
 | 
				
			||||||
 | 
					     `(("python" ,python-2)
 | 
				
			||||||
 | 
					       ("xz" ,xz)
 | 
				
			||||||
 | 
					       ("bdb" ,bdb)
 | 
				
			||||||
 | 
					       ("popt" ,popt)
 | 
				
			||||||
 | 
					       ("nss" ,nss)
 | 
				
			||||||
 | 
					       ("nspr" ,nspr)
 | 
				
			||||||
 | 
					       ("libarchive" ,libarchive)
 | 
				
			||||||
 | 
					       ("nettle" ,nettle)            ;XXX: actually a dependency of libarchive
 | 
				
			||||||
 | 
					       ("file" ,file)
 | 
				
			||||||
 | 
					       ("bzip2" ,bzip2)
 | 
				
			||||||
 | 
					       ("zlib" ,zlib)
 | 
				
			||||||
 | 
					       ("cpio" ,cpio)))
 | 
				
			||||||
 | 
					    (home-page "http://www.rpm.org/")
 | 
				
			||||||
 | 
					    (synopsis "The RPM Package Manager")
 | 
				
			||||||
 | 
					    (description
 | 
				
			||||||
 | 
					     "The RPM Package Manager (RPM) is a command-line driven package
 | 
				
			||||||
 | 
					management system capable of installing, uninstalling, verifying, querying,
 | 
				
			||||||
 | 
					and updating computer software packages.  Each software package consists of an
 | 
				
			||||||
 | 
					archive of files along with information about the package like its version, a
 | 
				
			||||||
 | 
					description.  There is also a library permitting developers to manage such
 | 
				
			||||||
 | 
					transactions from C or Python.")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ;; The whole is GPLv2+; librpm itself is dual-licensed LGPLv2+ | GPLv2+.
 | 
				
			||||||
 | 
					    (license gpl2+)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(define-public diffoscope
 | 
				
			||||||
 | 
					  (package
 | 
				
			||||||
 | 
					    (name "diffoscope")
 | 
				
			||||||
 | 
					    (version "34")
 | 
				
			||||||
 | 
					    (source (origin
 | 
				
			||||||
 | 
					              (method git-fetch)
 | 
				
			||||||
 | 
					              (uri (git-reference
 | 
				
			||||||
 | 
					                    (url
 | 
				
			||||||
 | 
					                     "https://anonscm.debian.org/cgit/reproducible/diffoscope.git")
 | 
				
			||||||
 | 
					                    (commit version)))
 | 
				
			||||||
 | 
					              (sha256
 | 
				
			||||||
 | 
					               (base32
 | 
				
			||||||
 | 
					                "1g8b7bpkmns0355gkr3a244affwx4xzqwahwsl6ivw4z0qv7dih8"))
 | 
				
			||||||
 | 
					              (file-name (string-append name "-" version "-checkout"))))
 | 
				
			||||||
 | 
					    (build-system python-build-system)
 | 
				
			||||||
 | 
					    (arguments
 | 
				
			||||||
 | 
					     `(#:python ,python-2
 | 
				
			||||||
 | 
					       #:phases (modify-phases %standard-phases
 | 
				
			||||||
 | 
					                  (add-before 'build 'disable-egg-zipping
 | 
				
			||||||
 | 
					                    (lambda _
 | 
				
			||||||
 | 
					                      ;; Leave the .egg file uncompressed.
 | 
				
			||||||
 | 
					                      (let ((port (open-file "setup.cfg" "a")))
 | 
				
			||||||
 | 
					                        (display "\n[easy_install]\nzip_ok = 0\n"
 | 
				
			||||||
 | 
					                                 port)
 | 
				
			||||||
 | 
					                        (close-port port)
 | 
				
			||||||
 | 
					                        #t)))
 | 
				
			||||||
 | 
					                  (add-before 'build 'dependency-on-rpm
 | 
				
			||||||
 | 
					                    (lambda _
 | 
				
			||||||
 | 
					                      (substitute* "setup.py"
 | 
				
			||||||
 | 
					                        ;; Somehow this requirement is reported as not met,
 | 
				
			||||||
 | 
					                        ;; even though rpm.py is in the search path.  So
 | 
				
			||||||
 | 
					                        ;; delete it.
 | 
				
			||||||
 | 
					                        (("'rpm-python',") ""))
 | 
				
			||||||
 | 
					                      #t)))
 | 
				
			||||||
 | 
					       ;; FIXME: Some obscure test failures.
 | 
				
			||||||
 | 
					       #:tests? #f))
 | 
				
			||||||
 | 
					    (inputs `(("rpm" ,rpm)                        ;for rpm-python
 | 
				
			||||||
 | 
					              ("python-file" ,python2-file)
 | 
				
			||||||
 | 
					              ("python-debian" ,python2-debian)
 | 
				
			||||||
 | 
					              ("python-libarchive-c" ,python2-libarchive-c)
 | 
				
			||||||
 | 
					              ("python-tlsh" ,python2-tlsh)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					              ;; Below are modules used for tests.
 | 
				
			||||||
 | 
					              ("python-pytest" ,python2-pytest)
 | 
				
			||||||
 | 
					              ("python-chardet" ,python2-chardet)))
 | 
				
			||||||
 | 
					    (native-inputs `(("python-setuptools" ,python2-setuptools)))
 | 
				
			||||||
 | 
					    (home-page "http://diffoscope.org/")
 | 
				
			||||||
 | 
					    (synopsis "Compare files, archives, and directories in depth")
 | 
				
			||||||
 | 
					    (description
 | 
				
			||||||
 | 
					     "Diffoscope tries to get to the bottom of what makes files or directories
 | 
				
			||||||
 | 
					different.  It recursively unpacks archives of many kinds and transforms
 | 
				
			||||||
 | 
					various binary formats into more human readable forms to compare them.  It can
 | 
				
			||||||
 | 
					compare two tarballs, ISO images, or PDFs just as easily.")
 | 
				
			||||||
 | 
					    (license gpl3+)))
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,6 +1,7 @@
 | 
				
			||||||
;;; GNU Guix --- Functional package management for GNU
 | 
					;;; GNU Guix --- Functional package management for GNU
 | 
				
			||||||
;;; Copyright © 2015 Steve Sprang <scs@stevesprang.com>
 | 
					;;; Copyright © 2015 Steve Sprang <scs@stevesprang.com>
 | 
				
			||||||
;;; Copyright © 2015 Efraim Flashner <efraim@flashner.co.il>
 | 
					;;; Copyright © 2015 Efraim Flashner <efraim@flashner.co.il>
 | 
				
			||||||
 | 
					;;; Copyright © 2015 Aljosha Papsch <misc@rpapsch.de>
 | 
				
			||||||
;;;
 | 
					;;;
 | 
				
			||||||
;;; This file is part of GNU Guix.
 | 
					;;; This file is part of GNU Guix.
 | 
				
			||||||
;;;
 | 
					;;;
 | 
				
			||||||
| 
						 | 
					@ -26,6 +27,9 @@
 | 
				
			||||||
  #:use-module (gnu packages compression)
 | 
					  #:use-module (gnu packages compression)
 | 
				
			||||||
  #:use-module (gnu packages gnupg)
 | 
					  #:use-module (gnu packages gnupg)
 | 
				
			||||||
  #:use-module (gnu packages guile)
 | 
					  #:use-module (gnu packages guile)
 | 
				
			||||||
 | 
					  #:use-module (gnu packages ncurses)
 | 
				
			||||||
 | 
					  #:use-module (gnu packages pkg-config)
 | 
				
			||||||
 | 
					  #:use-module (gnu packages tls)
 | 
				
			||||||
  #:use-module (gnu packages qt)
 | 
					  #:use-module (gnu packages qt)
 | 
				
			||||||
  #:use-module (gnu packages xdisorg)
 | 
					  #:use-module (gnu packages xdisorg)
 | 
				
			||||||
  #:use-module (gnu packages xorg))
 | 
					  #:use-module (gnu packages xorg))
 | 
				
			||||||
| 
						 | 
					@ -104,3 +108,31 @@ For copying and pasting secrets into web browsers and other graphical
 | 
				
			||||||
applications, there is xclip integration." )
 | 
					applications, there is xclip integration." )
 | 
				
			||||||
    (home-page "http://dthompson.us/pages/software/shroud.html")
 | 
					    (home-page "http://dthompson.us/pages/software/shroud.html")
 | 
				
			||||||
    (license license:gpl3+)))
 | 
					    (license license:gpl3+)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(define-public yapet
 | 
				
			||||||
 | 
					  (package
 | 
				
			||||||
 | 
					    (name "yapet")
 | 
				
			||||||
 | 
					    (version "1.0")
 | 
				
			||||||
 | 
					    (source (origin
 | 
				
			||||||
 | 
					              (method url-fetch)
 | 
				
			||||||
 | 
					              (uri (string-append "http://www.guengel.ch/myapps/yapet/downloads/yapet-"
 | 
				
			||||||
 | 
					                                  version
 | 
				
			||||||
 | 
					                                  ".tar.bz2"))
 | 
				
			||||||
 | 
					              (sha256
 | 
				
			||||||
 | 
					               (base32
 | 
				
			||||||
 | 
					                "0ydbnqw6icdh07pnv2w6dhvq501bdfvrklv4xmyr8znca9d753if"))))
 | 
				
			||||||
 | 
					    (build-system gnu-build-system)
 | 
				
			||||||
 | 
					    (inputs
 | 
				
			||||||
 | 
					     `(("ncurses" ,ncurses)
 | 
				
			||||||
 | 
					       ("openssl" ,openssl)))
 | 
				
			||||||
 | 
					    (native-inputs
 | 
				
			||||||
 | 
					     `(("pkg-config" ,pkg-config)))
 | 
				
			||||||
 | 
					    (synopsis "Yet Another Password Encryption Tool")
 | 
				
			||||||
 | 
					    (description "YAPET is a text based password manager using the Blowfish
 | 
				
			||||||
 | 
					encryption algorithm.  Because of its small footprint and very few library
 | 
				
			||||||
 | 
					dependencies, it is suited for installing on desktop and server systems alike.
 | 
				
			||||||
 | 
					The text based user interface allows you to run YAPET easily in a Secure Shell
 | 
				
			||||||
 | 
					session.  Two companion utilities enable users to convert CSV files to YAPET
 | 
				
			||||||
 | 
					and vice versa.")
 | 
				
			||||||
 | 
					    (home-page "http://www.guengel.ch/myapps/yapet/")
 | 
				
			||||||
 | 
					    (license license:gpl3+)))
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										31
									
								
								gnu/packages/patches/xfce4-session-fix-xflock4.patch
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								gnu/packages/patches/xfce4-session-fix-xflock4.patch
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,31 @@
 | 
				
			||||||
 | 
					From cbb9c769316b4d32956a2c78aa01a38b473f0cfc Mon Sep 17 00:00:00 2001
 | 
				
			||||||
 | 
					From: David Thompson <dthompson2@worcester.edu>
 | 
				
			||||||
 | 
					Date: Fri, 30 Oct 2015 08:30:43 -0400
 | 
				
			||||||
 | 
					Subject: [PATCH] xflock4: Do not override PATH with hardcoded value.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The PATH "/bin:/usr/bin" may not be a valid search path on the user's
 | 
				
			||||||
 | 
					machine.  The screen locking program may be in /usr/local/bin or
 | 
				
			||||||
 | 
					elsewhere.  Distros that do not conform to the FHS, such as GuixSD and
 | 
				
			||||||
 | 
					NixOS, will not have their executables in either location.  Thus, we
 | 
				
			||||||
 | 
					simply leave PATH alone.
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					 scripts/xflock4 | 3 ---
 | 
				
			||||||
 | 
					 1 file changed, 3 deletions(-)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					diff --git a/scripts/xflock4 b/scripts/xflock4
 | 
				
			||||||
 | 
					index ec4d05d..e7981ac 100644
 | 
				
			||||||
 | 
					--- a/scripts/xflock4
 | 
				
			||||||
 | 
					+++ b/scripts/xflock4
 | 
				
			||||||
 | 
					@@ -21,9 +21,6 @@
 | 
				
			||||||
 | 
					 #  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 | 
				
			||||||
 | 
					 #
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-PATH=/bin:/usr/bin
 | 
				
			||||||
 | 
					-export PATH
 | 
				
			||||||
 | 
					-
 | 
				
			||||||
 | 
					 # Lock by xscreensaver or gnome-screensaver, if a respective daemon is running
 | 
				
			||||||
 | 
					 for lock_cmd in \
 | 
				
			||||||
 | 
					     "xscreensaver-command -lock" \
 | 
				
			||||||
 | 
					-- 
 | 
				
			||||||
 | 
					2.5.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,6 +1,7 @@
 | 
				
			||||||
;;; GNU Guix --- Functional package management for GNU
 | 
					;;; GNU Guix --- Functional package management for GNU
 | 
				
			||||||
;;; Copyright © 2013 Andreas Enge <andreas@enge.fr>
 | 
					;;; Copyright © 2013 Andreas Enge <andreas@enge.fr>
 | 
				
			||||||
;;; Copyright © 2014, 2015 Mark H Weaver <mhw@netris.org>
 | 
					;;; Copyright © 2014, 2015 Mark H Weaver <mhw@netris.org>
 | 
				
			||||||
 | 
					;;; Copyright © 2015 Ricardo Wurmus <rekado@elephly.net>
 | 
				
			||||||
;;;
 | 
					;;;
 | 
				
			||||||
;;; This file is part of GNU Guix.
 | 
					;;; This file is part of GNU Guix.
 | 
				
			||||||
;;;
 | 
					;;;
 | 
				
			||||||
| 
						 | 
					@ -57,3 +58,37 @@ own native API, as well as a set of wrapper functions that correspond to the
 | 
				
			||||||
POSIX regular expression API.")
 | 
					POSIX regular expression API.")
 | 
				
			||||||
   (license license:bsd-3)
 | 
					   (license license:bsd-3)
 | 
				
			||||||
   (home-page "http://www.pcre.org/")))
 | 
					   (home-page "http://www.pcre.org/")))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(define-public pcre2
 | 
				
			||||||
 | 
					  (package
 | 
				
			||||||
 | 
					    (name "pcre2")
 | 
				
			||||||
 | 
					    (version "10.20")
 | 
				
			||||||
 | 
					    (source (origin
 | 
				
			||||||
 | 
					              (method url-fetch)
 | 
				
			||||||
 | 
					              (uri (string-append "mirror://sourceforge/pcre/pcre2/"
 | 
				
			||||||
 | 
					                                  version "/pcre2-" version ".tar.bz2"))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					              (sha256
 | 
				
			||||||
 | 
					               (base32
 | 
				
			||||||
 | 
					                "0yj8mm9ll9zj3v47rvmmqmr1ybxk72rr2lym3rymdsf905qjhbik"))))
 | 
				
			||||||
 | 
					   (build-system gnu-build-system)
 | 
				
			||||||
 | 
					   (inputs `(("bzip2" ,bzip2)
 | 
				
			||||||
 | 
					             ("readline" ,readline)
 | 
				
			||||||
 | 
					             ("zlib" ,zlib)))
 | 
				
			||||||
 | 
					   (arguments
 | 
				
			||||||
 | 
					    `(#:configure-flags '("--enable-unicode"
 | 
				
			||||||
 | 
					                          "--enable-pcregrep-libz"
 | 
				
			||||||
 | 
					                          "--enable-pcregrep-libbz2"
 | 
				
			||||||
 | 
					                          "--enable-pcretest-libreadline"
 | 
				
			||||||
 | 
					                          "--enable-unicode-properties"
 | 
				
			||||||
 | 
					                          "--enable-pcre2-16"
 | 
				
			||||||
 | 
					                          "--enable-pcre2-32"
 | 
				
			||||||
 | 
					                          "--enable-jit")))
 | 
				
			||||||
 | 
					   (synopsis "Perl Compatible Regular Expressions")
 | 
				
			||||||
 | 
					   (description
 | 
				
			||||||
 | 
					    "The PCRE library is a set of functions that implement regular expression
 | 
				
			||||||
 | 
					pattern matching using the same syntax and semantics as Perl 5.  PCRE has its
 | 
				
			||||||
 | 
					own native API, as well as a set of wrapper functions that correspond to the
 | 
				
			||||||
 | 
					POSIX regular expression API.")
 | 
				
			||||||
 | 
					   (license license:bsd-3)
 | 
				
			||||||
 | 
					   (home-page "http://www.pcre.org/")))
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -27,7 +27,7 @@
 | 
				
			||||||
  #:use-module (gnu packages autotools)
 | 
					  #:use-module (gnu packages autotools)
 | 
				
			||||||
  #:use-module (gnu packages avahi)
 | 
					  #:use-module (gnu packages avahi)
 | 
				
			||||||
  #:use-module (gnu packages check)
 | 
					  #:use-module (gnu packages check)
 | 
				
			||||||
  #:use-module (gnu packages gdbm)
 | 
					  #:use-module (gnu packages databases)
 | 
				
			||||||
  #:use-module (gnu packages glib)
 | 
					  #:use-module (gnu packages glib)
 | 
				
			||||||
  #:use-module (gnu packages gtk)
 | 
					  #:use-module (gnu packages gtk)
 | 
				
			||||||
  #:use-module (gnu packages libcanberra)
 | 
					  #:use-module (gnu packages libcanberra)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -39,8 +39,8 @@
 | 
				
			||||||
  #:use-module (gnu packages backup)
 | 
					  #:use-module (gnu packages backup)
 | 
				
			||||||
  #:use-module (gnu packages compression)
 | 
					  #:use-module (gnu packages compression)
 | 
				
			||||||
  #:use-module (gnu packages databases)
 | 
					  #:use-module (gnu packages databases)
 | 
				
			||||||
 | 
					  #:use-module (gnu packages file)
 | 
				
			||||||
  #:use-module (gnu packages fontutils)
 | 
					  #:use-module (gnu packages fontutils)
 | 
				
			||||||
  #:use-module (gnu packages gdbm)
 | 
					 | 
				
			||||||
  #:use-module (gnu packages gcc)
 | 
					  #:use-module (gnu packages gcc)
 | 
				
			||||||
  #:use-module (gnu packages ghostscript)
 | 
					  #:use-module (gnu packages ghostscript)
 | 
				
			||||||
  #:use-module (gnu packages glib)
 | 
					  #:use-module (gnu packages glib)
 | 
				
			||||||
| 
						 | 
					@ -5761,3 +5761,98 @@ Python's @code{ctypes} foreign function interface (FFI).")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(define-public python2-libarchive-c
 | 
					(define-public python2-libarchive-c
 | 
				
			||||||
  (package-with-python2 python-libarchive-c))
 | 
					  (package-with-python2 python-libarchive-c))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(define-public python-file
 | 
				
			||||||
 | 
					  (package
 | 
				
			||||||
 | 
					    (inherit file)
 | 
				
			||||||
 | 
					    (name "python-file")
 | 
				
			||||||
 | 
					    (build-system python-build-system)
 | 
				
			||||||
 | 
					    (arguments
 | 
				
			||||||
 | 
					     '(#:tests? #f                                ;no tests
 | 
				
			||||||
 | 
					       #:phases (modify-phases %standard-phases
 | 
				
			||||||
 | 
					                  (add-before 'build 'change-directory
 | 
				
			||||||
 | 
					                    (lambda _
 | 
				
			||||||
 | 
					                      (chdir "python")
 | 
				
			||||||
 | 
					                      #t))
 | 
				
			||||||
 | 
					                  (add-before 'build 'set-library-file-name
 | 
				
			||||||
 | 
					                    (lambda* (#:key inputs #:allow-other-keys)
 | 
				
			||||||
 | 
					                      (let ((file (assoc-ref inputs "file")))
 | 
				
			||||||
 | 
					                        (substitute* "magic.py"
 | 
				
			||||||
 | 
					                          (("find_library\\('magic'\\)")
 | 
				
			||||||
 | 
					                           (string-append "'" file "/lib/libmagic.so'")))
 | 
				
			||||||
 | 
					                        #t))))))
 | 
				
			||||||
 | 
					    (inputs `(("file" ,file)))
 | 
				
			||||||
 | 
					    (self-native-input? #f)
 | 
				
			||||||
 | 
					    (synopsis "Python bindings to the libmagic file type guesser")))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(define-public python2-file
 | 
				
			||||||
 | 
					  (package-with-python2 python-file))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(define-public python-debian
 | 
				
			||||||
 | 
					  (package
 | 
				
			||||||
 | 
					    (name "python-debian")
 | 
				
			||||||
 | 
					    (version "0.1.23")
 | 
				
			||||||
 | 
					    (source
 | 
				
			||||||
 | 
					     (origin
 | 
				
			||||||
 | 
					       (method url-fetch)
 | 
				
			||||||
 | 
					       (uri (string-append
 | 
				
			||||||
 | 
					             "https://pypi.python.org/packages/source/p/python-debian/python-debian-"
 | 
				
			||||||
 | 
					             version ".tar.gz"))
 | 
				
			||||||
 | 
					       (sha256
 | 
				
			||||||
 | 
					        (base32
 | 
				
			||||||
 | 
					         "193faznwnjc3n5991wyzim6h9gyq1zxifmfrnpm3avgkh7ahyynh"))))
 | 
				
			||||||
 | 
					    (build-system python-build-system)
 | 
				
			||||||
 | 
					    (inputs
 | 
				
			||||||
 | 
					     `(("python-six" ,python-six)))
 | 
				
			||||||
 | 
					    (native-inputs
 | 
				
			||||||
 | 
					     `(("python-setuptools" ,python-setuptools)))
 | 
				
			||||||
 | 
					    (home-page "http://packages.debian.org/sid/python-debian")
 | 
				
			||||||
 | 
					    (synopsis "Debian package related modules")
 | 
				
			||||||
 | 
					    (description
 | 
				
			||||||
 | 
					     ;; XXX: Use @enumerate instead of @itemize to work around
 | 
				
			||||||
 | 
					     ;; <http://bugs.gnu.org/21772>.
 | 
				
			||||||
 | 
					     "This package provides Python modules that abstract many formats of
 | 
				
			||||||
 | 
					Debian-related files, such as:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@enumerate
 | 
				
			||||||
 | 
					@item Debtags information;
 | 
				
			||||||
 | 
					@item @file{debian/changelog} files;
 | 
				
			||||||
 | 
					@item packages files, pdiffs;
 | 
				
			||||||
 | 
					@item control files of single or multiple RFC822-style paragraphs---e.g.
 | 
				
			||||||
 | 
					   @file{debian/control}, @file{.changes}, @file{.dsc};
 | 
				
			||||||
 | 
					@item Raw @file{.deb} and @file{.ar} files, with (read-only) access to
 | 
				
			||||||
 | 
					   contained files and meta-information.
 | 
				
			||||||
 | 
					@end enumerate\n")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ;; Modules are either GPLv2+ or GPLv3+.
 | 
				
			||||||
 | 
					    (license gpl3+)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(define-public python2-debian
 | 
				
			||||||
 | 
					  (package-with-python2 python-debian))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(define-public python-chardet
 | 
				
			||||||
 | 
					  (package
 | 
				
			||||||
 | 
					    (name "python-chardet")
 | 
				
			||||||
 | 
					    (version "2.3.0")
 | 
				
			||||||
 | 
					    (source
 | 
				
			||||||
 | 
					     (origin
 | 
				
			||||||
 | 
					       (method url-fetch)
 | 
				
			||||||
 | 
					       (uri (string-append
 | 
				
			||||||
 | 
					             "https://pypi.python.org/packages/source/c/chardet/chardet-"
 | 
				
			||||||
 | 
					             version
 | 
				
			||||||
 | 
					             ".tar.gz"))
 | 
				
			||||||
 | 
					       (sha256
 | 
				
			||||||
 | 
					        (base32
 | 
				
			||||||
 | 
					         "1ak87ikcw34fivcgiz2xvi938dmclh078az65l9x3rmgljrkhgp5"))))
 | 
				
			||||||
 | 
					    (build-system python-build-system)
 | 
				
			||||||
 | 
					    (native-inputs
 | 
				
			||||||
 | 
					     `(("python-setuptools" ,python-setuptools)))
 | 
				
			||||||
 | 
					    (home-page "https://github.com/chardet/chardet")
 | 
				
			||||||
 | 
					    (synopsis "Universal encoding detector for Python 2 and 3")
 | 
				
			||||||
 | 
					    (description
 | 
				
			||||||
 | 
					     "This package provides @code{chardet}, a Python module that can
 | 
				
			||||||
 | 
					automatically detect a wide range of file encodings.")
 | 
				
			||||||
 | 
					    (license lgpl2.1+)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(define-public python2-chardet
 | 
				
			||||||
 | 
					  (package-with-python2 python-chardet))
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,6 +1,6 @@
 | 
				
			||||||
;;; GNU Guix --- Functional package management for GNU
 | 
					;;; GNU Guix --- Functional package management for GNU
 | 
				
			||||||
;;; Copyright © 2014, 2015 Pjotr Prins <pjotr.guix@thebird.nl>
 | 
					;;; Copyright © 2014, 2015 Pjotr Prins <pjotr.guix@thebird.nl>
 | 
				
			||||||
;;; Copyright © 2014 Ludovic Courtès <ludo@gnu.org>
 | 
					;;; Copyright © 2014, 2015 Ludovic Courtès <ludo@gnu.org>
 | 
				
			||||||
;;; Copyright © 2014, 2015 Mark H Weaver <mhw@netris.org>
 | 
					;;; Copyright © 2014, 2015 Mark H Weaver <mhw@netris.org>
 | 
				
			||||||
;;; Copyright © 2014, 2015 David Thompson <davet@gnu.org>
 | 
					;;; Copyright © 2014, 2015 David Thompson <davet@gnu.org>
 | 
				
			||||||
;;; Copyright © 2015 Ricardo Wurmus <rekado@elephly.net>
 | 
					;;; Copyright © 2015 Ricardo Wurmus <rekado@elephly.net>
 | 
				
			||||||
| 
						 | 
					@ -30,7 +30,6 @@
 | 
				
			||||||
  #:use-module (gnu packages autotools)
 | 
					  #:use-module (gnu packages autotools)
 | 
				
			||||||
  #:use-module (gnu packages java)
 | 
					  #:use-module (gnu packages java)
 | 
				
			||||||
  #:use-module (gnu packages libffi)
 | 
					  #:use-module (gnu packages libffi)
 | 
				
			||||||
  #:use-module (gnu packages gdbm)
 | 
					 | 
				
			||||||
  #:use-module (gnu packages tls)
 | 
					  #:use-module (gnu packages tls)
 | 
				
			||||||
  #:use-module (gnu packages version-control)
 | 
					  #:use-module (gnu packages version-control)
 | 
				
			||||||
  #:use-module (guix packages)
 | 
					  #:use-module (guix packages)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -22,7 +22,7 @@
 | 
				
			||||||
  #:use-module (guix download)
 | 
					  #:use-module (guix download)
 | 
				
			||||||
  #:use-module (guix build-system gnu)
 | 
					  #:use-module (guix build-system gnu)
 | 
				
			||||||
  #:use-module (gnu packages)
 | 
					  #:use-module (gnu packages)
 | 
				
			||||||
  #:use-module (gnu packages gdbm)
 | 
					  #:use-module (gnu packages databases)
 | 
				
			||||||
  #:use-module (gnu packages gettext)
 | 
					  #:use-module (gnu packages gettext)
 | 
				
			||||||
  #:use-module (gnu packages gtk)
 | 
					  #:use-module (gnu packages gtk)
 | 
				
			||||||
  #:use-module (gnu packages libffi)
 | 
					  #:use-module (gnu packages libffi)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -334,7 +334,7 @@ implementation techniques and as an expository tool.")
 | 
				
			||||||
(define-public racket
 | 
					(define-public racket
 | 
				
			||||||
  (package
 | 
					  (package
 | 
				
			||||||
    (name "racket")
 | 
					    (name "racket")
 | 
				
			||||||
    (version "6.1.1")
 | 
					    (version "6.2.1")
 | 
				
			||||||
    (source (origin
 | 
					    (source (origin
 | 
				
			||||||
             (method url-fetch)
 | 
					             (method url-fetch)
 | 
				
			||||||
             (uri (list (string-append "http://mirror.racket-lang.org/installers/"
 | 
					             (uri (list (string-append "http://mirror.racket-lang.org/installers/"
 | 
				
			||||||
| 
						 | 
					@ -344,7 +344,7 @@ implementation techniques and as an expository tool.")
 | 
				
			||||||
                         version "/racket/racket-" version "-src-unix.tgz")))
 | 
					                         version "/racket/racket-" version "-src-unix.tgz")))
 | 
				
			||||||
             (sha256
 | 
					             (sha256
 | 
				
			||||||
              (base32
 | 
					              (base32
 | 
				
			||||||
               "0xfsfdqkngz0xw2lqmc7bsznwx25cw91l9fjhp7abrr05m96j0h9"))))
 | 
					               "0555j63k7fs10iv0icmivlxpzgp6s7gwcbfddmbwxlf2rk80qhq0"))))
 | 
				
			||||||
    (build-system gnu-build-system)
 | 
					    (build-system gnu-build-system)
 | 
				
			||||||
    (arguments
 | 
					    (arguments
 | 
				
			||||||
     '(#:phases
 | 
					     '(#:phases
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4,6 +4,7 @@
 | 
				
			||||||
;;; Copyright © 2014, 2015 Mark H Weaver <mhw@netris.org>
 | 
					;;; Copyright © 2014, 2015 Mark H Weaver <mhw@netris.org>
 | 
				
			||||||
;;; Copyright © 2015 Taylan Ulrich Bayırlı/Kammer <taylanbayirli@gmail.com>
 | 
					;;; Copyright © 2015 Taylan Ulrich Bayırlı/Kammer <taylanbayirli@gmail.com>
 | 
				
			||||||
;;; Copyright © 2015 Efraim Flashner <efraim@flashner.co.il>
 | 
					;;; Copyright © 2015 Efraim Flashner <efraim@flashner.co.il>
 | 
				
			||||||
 | 
					;;; Copyright © 2015 Andy Patterson <ajpatter@uwaterloo.ca>
 | 
				
			||||||
;;;
 | 
					;;;
 | 
				
			||||||
;;; This file is part of GNU Guix.
 | 
					;;; This file is part of GNU Guix.
 | 
				
			||||||
;;;
 | 
					;;;
 | 
				
			||||||
| 
						 | 
					@ -412,20 +413,10 @@ standards (MPEG-2, MPEG-4 ASP/H.263, MPEG-4 AVC/H.264, and VC-1/VMW3).")
 | 
				
			||||||
       ("yasm" ,yasm)))
 | 
					       ("yasm" ,yasm)))
 | 
				
			||||||
    (arguments
 | 
					    (arguments
 | 
				
			||||||
     `(#:test-target "fate"
 | 
					     `(#:test-target "fate"
 | 
				
			||||||
       #:phases
 | 
					       #:configure-flags
 | 
				
			||||||
       (modify-phases %standard-phases
 | 
					 | 
				
			||||||
         (replace
 | 
					 | 
				
			||||||
          'configure
 | 
					 | 
				
			||||||
          ;; configure does not work followed by "SHELL=..." and
 | 
					 | 
				
			||||||
          ;; "CONFIG_SHELL=..."; set environment variables instead
 | 
					 | 
				
			||||||
          (lambda* (#:key outputs configure-flags #:allow-other-keys)
 | 
					 | 
				
			||||||
            (let ((out (assoc-ref outputs "out")))
 | 
					 | 
				
			||||||
              (substitute* "configure"
 | 
					 | 
				
			||||||
                (("#! /bin/sh") (string-append "#!" (which "bash"))))
 | 
					 | 
				
			||||||
              (setenv "SHELL" (which "bash"))
 | 
					 | 
				
			||||||
              (setenv "CONFIG_SHELL" (which "bash"))
 | 
					 | 
				
			||||||
       ;; possible additional inputs:
 | 
					       ;; possible additional inputs:
 | 
				
			||||||
              ;;   --enable-avisynth        enable reading of AviSynth script files [no]
 | 
					       ;;   --enable-avisynth        enable reading of AviSynth script
 | 
				
			||||||
 | 
					       ;;                            files [no]
 | 
				
			||||||
       ;;   --enable-frei0r          enable frei0r video filtering
 | 
					       ;;   --enable-frei0r          enable frei0r video filtering
 | 
				
			||||||
       ;;   --enable-libaacplus      enable AAC+ encoding via libaacplus [no]
 | 
					       ;;   --enable-libaacplus      enable AAC+ encoding via libaacplus [no]
 | 
				
			||||||
       ;;   --enable-libcelt         enable CELT decoding via libcelt [no]
 | 
					       ;;   --enable-libcelt         enable CELT decoding via libcelt [no]
 | 
				
			||||||
| 
						 | 
					@ -433,7 +424,8 @@ standards (MPEG-2, MPEG-4 ASP/H.263, MPEG-4 AVC/H.264, and VC-1/VMW3).")
 | 
				
			||||||
       ;;                            and libraw1394 [no]
 | 
					       ;;                            and libraw1394 [no]
 | 
				
			||||||
       ;;   --enable-libfaac         enable AAC encoding via libfaac [no]
 | 
					       ;;   --enable-libfaac         enable AAC encoding via libfaac [no]
 | 
				
			||||||
       ;;   --enable-libfdk-aac      enable AAC de/encoding via libfdk-aac [no]
 | 
					       ;;   --enable-libfdk-aac      enable AAC de/encoding via libfdk-aac [no]
 | 
				
			||||||
              ;;   --enable-libflite        enable flite (voice synthesis) support via libflite [no]
 | 
					       ;;   --enable-libflite        enable flite (voice synthesis) support via
 | 
				
			||||||
 | 
					       ;;                            libflite [no]
 | 
				
			||||||
       ;;   --enable-libgme          enable Game Music Emu via libgme [no]
 | 
					       ;;   --enable-libgme          enable Game Music Emu via libgme [no]
 | 
				
			||||||
       ;;   --enable-libgsm          enable GSM de/encoding via libgsm [no]
 | 
					       ;;   --enable-libgsm          enable GSM de/encoding via libgsm [no]
 | 
				
			||||||
       ;;   --enable-libiec61883     enable iec61883 via libiec61883 [no]
 | 
					       ;;   --enable-libiec61883     enable iec61883 via libiec61883 [no]
 | 
				
			||||||
| 
						 | 
					@ -441,34 +433,37 @@ standards (MPEG-2, MPEG-4 ASP/H.263, MPEG-4 AVC/H.264, and VC-1/VMW3).")
 | 
				
			||||||
       ;;   --enable-libmodplug      enable ModPlug via libmodplug [no]
 | 
					       ;;   --enable-libmodplug      enable ModPlug via libmodplug [no]
 | 
				
			||||||
       ;;   --enable-libnut          enable NUT (de)muxing via libnut,
 | 
					       ;;   --enable-libnut          enable NUT (de)muxing via libnut,
 | 
				
			||||||
       ;;                            native (de)muxer exists [no]
 | 
					       ;;                            native (de)muxer exists [no]
 | 
				
			||||||
              ;;   --enable-libopencore-amrnb enable AMR-NB de/encoding via libopencore-amrnb [no]
 | 
					       ;;   --enable-libopencore-amrnb    enable AMR-NB de/encoding via
 | 
				
			||||||
              ;;   --enable-libopencore-amrwb enable AMR-WB decoding via libopencore-amrwb [no]
 | 
					       ;;                                 libopencore-amrnb [no]
 | 
				
			||||||
 | 
					       ;;   --enable-libopencore-amrwb    enable AMR-WB decoding via
 | 
				
			||||||
 | 
					       ;;                                 libopencore-amrwb [no]
 | 
				
			||||||
       ;;   --enable-libopencv       enable video filtering via libopencv [no]
 | 
					       ;;   --enable-libopencv       enable video filtering via libopencv [no]
 | 
				
			||||||
              ;;   --enable-libopenjpeg     enable JPEG 2000 de/encoding via OpenJPEG [no]
 | 
					       ;;   --enable-libopenjpeg     enable JPEG 2000 de/encoding via
 | 
				
			||||||
 | 
					       ;;                            OpenJPEG [no]
 | 
				
			||||||
       ;;   --enable-librtmp         enable RTMP[E] support via librtmp [no]
 | 
					       ;;   --enable-librtmp         enable RTMP[E] support via librtmp [no]
 | 
				
			||||||
              ;;   --enable-libschroedinger enable Dirac de/encoding via libschroedinger [no]
 | 
					       ;;   --enable-libschroedinger enable Dirac de/encoding via
 | 
				
			||||||
              ;;   --enable-libshine        enable fixed-point MP3 encoding via libshine [no]
 | 
					       ;;                            libschroedinger [no]
 | 
				
			||||||
 | 
					       ;;   --enable-libshine        enable fixed-point MP3 encoding via
 | 
				
			||||||
 | 
					       ;;                            libshine [no]
 | 
				
			||||||
       ;;   --enable-libssh          enable SFTP protocol via libssh [no]
 | 
					       ;;   --enable-libssh          enable SFTP protocol via libssh [no]
 | 
				
			||||||
       ;;                            (libssh2 does not work)
 | 
					       ;;                            (libssh2 does not work)
 | 
				
			||||||
              ;;   --enable-libstagefright-h264  enable H.264 decoding via libstagefright [no]
 | 
					       ;;   --enable-libstagefright-h264  enable H.264 decoding via
 | 
				
			||||||
              ;;   --enable-libutvideo      enable Ut Video encoding and decoding via libutvideo [no]
 | 
					       ;;                                 libstagefright [no]
 | 
				
			||||||
 | 
					       ;;   --enable-libutvideo      enable Ut Video encoding and decoding via
 | 
				
			||||||
 | 
					       ;;                            libutvideo [no]
 | 
				
			||||||
       ;;   --enable-libv4l2         enable libv4l2/v4l-utils [no]
 | 
					       ;;   --enable-libv4l2         enable libv4l2/v4l-utils [no]
 | 
				
			||||||
              ;;   --enable-libvidstab      enable video stabilization using vid.stab [no]
 | 
					       ;;   --enable-libvidstab      enable video stabilization using
 | 
				
			||||||
 | 
					       ;;                            vid.stab [no]
 | 
				
			||||||
       ;;   --enable-libvo-aacenc    enable AAC encoding via libvo-aacenc [no]
 | 
					       ;;   --enable-libvo-aacenc    enable AAC encoding via libvo-aacenc [no]
 | 
				
			||||||
              ;;   --enable-libvo-amrwbenc  enable AMR-WB encoding via libvo-amrwbenc [no]
 | 
					       ;;   --enable-libvo-amrwbenc  enable AMR-WB encoding via
 | 
				
			||||||
 | 
					       ;;                            libvo-amrwbenc [no]
 | 
				
			||||||
       ;;   --enable-libwavpack      enable wavpack encoding via libwavpack [no]
 | 
					       ;;   --enable-libwavpack      enable wavpack encoding via libwavpack [no]
 | 
				
			||||||
       ;;   --enable-libxavs         enable AVS encoding via xavs [no]
 | 
					       ;;   --enable-libxavs         enable AVS encoding via xavs [no]
 | 
				
			||||||
       ;;   --enable-libzmq          enable message passing via libzmq [no]
 | 
					       ;;   --enable-libzmq          enable message passing via libzmq [no]
 | 
				
			||||||
       ;;   --enable-libzvbi         enable teletext support via libzvbi [no]
 | 
					       ;;   --enable-libzvbi         enable teletext support via libzvbi [no]
 | 
				
			||||||
       ;;   --enable-opencl          enable OpenCL code
 | 
					       ;;   --enable-opencl          enable OpenCL code
 | 
				
			||||||
       ;;   --enable-x11grab         enable X11 grabbing [no]
 | 
					       ;;   --enable-x11grab         enable X11 grabbing [no]
 | 
				
			||||||
              (zero? (system*
 | 
					       '("--enable-avresample"
 | 
				
			||||||
                      "./configure"
 | 
					 | 
				
			||||||
                      (string-append "--prefix=" out)
 | 
					 | 
				
			||||||
                      ;; Add $libdir to the RUNPATH of all the binaries.
 | 
					 | 
				
			||||||
                      (string-append "--extra-ldflags=-Wl,-rpath="
 | 
					 | 
				
			||||||
                                     %output "/lib")
 | 
					 | 
				
			||||||
                      "--enable-avresample"
 | 
					 | 
				
			||||||
         "--enable-gpl" ; enable optional gpl licensed parts
 | 
					         "--enable-gpl" ; enable optional gpl licensed parts
 | 
				
			||||||
         "--enable-shared"
 | 
					         "--enable-shared"
 | 
				
			||||||
         "--enable-fontconfig"
 | 
					         "--enable-fontconfig"
 | 
				
			||||||
| 
						 | 
					@ -500,7 +495,26 @@ standards (MPEG-2, MPEG-4 ASP/H.263, MPEG-4 AVC/H.264, and VC-1/VMW3).")
 | 
				
			||||||
         "--disable-mips32r2"
 | 
					         "--disable-mips32r2"
 | 
				
			||||||
         "--disable-mipsdspr1"
 | 
					         "--disable-mipsdspr1"
 | 
				
			||||||
         "--disable-mipsdspr2"
 | 
					         "--disable-mipsdspr2"
 | 
				
			||||||
                      "--disable-mipsfpu")))))
 | 
					         "--disable-mipsfpu")
 | 
				
			||||||
 | 
					       #:phases
 | 
				
			||||||
 | 
					       (modify-phases %standard-phases
 | 
				
			||||||
 | 
					         (replace
 | 
				
			||||||
 | 
					          'configure
 | 
				
			||||||
 | 
					          ;; configure does not work followed by "SHELL=..." and
 | 
				
			||||||
 | 
					          ;; "CONFIG_SHELL=..."; set environment variables instead
 | 
				
			||||||
 | 
					          (lambda* (#:key outputs configure-flags #:allow-other-keys)
 | 
				
			||||||
 | 
					            (let ((out (assoc-ref outputs "out")))
 | 
				
			||||||
 | 
					              (substitute* "configure"
 | 
				
			||||||
 | 
					                (("#! /bin/sh") (string-append "#!" (which "bash"))))
 | 
				
			||||||
 | 
					              (setenv "SHELL" (which "bash"))
 | 
				
			||||||
 | 
					              (setenv "CONFIG_SHELL" (which "bash"))
 | 
				
			||||||
 | 
					              (zero? (apply system*
 | 
				
			||||||
 | 
					                            "./configure"
 | 
				
			||||||
 | 
					                            (string-append "--prefix=" out)
 | 
				
			||||||
 | 
					                            ;; Add $libdir to the RUNPATH of all the binaries.
 | 
				
			||||||
 | 
					                            (string-append "--extra-ldflags=-Wl,-rpath="
 | 
				
			||||||
 | 
					                                           out "/lib")
 | 
				
			||||||
 | 
					                            configure-flags)))))
 | 
				
			||||||
         (add-before
 | 
					         (add-before
 | 
				
			||||||
          'check 'set-ld-library-path
 | 
					          'check 'set-ld-library-path
 | 
				
			||||||
          (lambda _
 | 
					          (lambda _
 | 
				
			||||||
| 
						 | 
					@ -797,7 +811,7 @@ projects while introducing many more.")
 | 
				
			||||||
(define-public youtube-dl
 | 
					(define-public youtube-dl
 | 
				
			||||||
  (package
 | 
					  (package
 | 
				
			||||||
    (name "youtube-dl")
 | 
					    (name "youtube-dl")
 | 
				
			||||||
    (version "2015.10.16")
 | 
					    (version "2015.10.24")
 | 
				
			||||||
    (source (origin
 | 
					    (source (origin
 | 
				
			||||||
              (method url-fetch)
 | 
					              (method url-fetch)
 | 
				
			||||||
              (uri (string-append "https://youtube-dl.org/downloads/"
 | 
					              (uri (string-append "https://youtube-dl.org/downloads/"
 | 
				
			||||||
| 
						 | 
					@ -805,7 +819,7 @@ projects while introducing many more.")
 | 
				
			||||||
                                  version ".tar.gz"))
 | 
					                                  version ".tar.gz"))
 | 
				
			||||||
              (sha256
 | 
					              (sha256
 | 
				
			||||||
               (base32
 | 
					               (base32
 | 
				
			||||||
                "001a4md0yl3zx129mksmwc85grss67r3c9rynvranf9vlpv202vn"))))
 | 
					                "1q9srq08vb2yzl81hmjrgqwajckq52fhh9ag2ppbbxjibf91w5gs"))))
 | 
				
			||||||
    (build-system python-build-system)
 | 
					    (build-system python-build-system)
 | 
				
			||||||
    (inputs `(("setuptools" ,python-setuptools)))
 | 
					    (inputs `(("setuptools" ,python-setuptools)))
 | 
				
			||||||
    (home-page "http://youtube-dl.org")
 | 
					    (home-page "http://youtube-dl.org")
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -423,7 +423,10 @@ your system in categories, so you can quickly find and launch them.")
 | 
				
			||||||
                                  "/src/" name "-" version ".tar.bz2"))
 | 
					                                  "/src/" name "-" version ".tar.bz2"))
 | 
				
			||||||
              (sha256
 | 
					              (sha256
 | 
				
			||||||
               (base32
 | 
					               (base32
 | 
				
			||||||
                "01kvbd09c06j20n155hracsgrq06rlmfgdywffjsvlwpn19m9j38"))))
 | 
					                "01kvbd09c06j20n155hracsgrq06rlmfgdywffjsvlwpn19m9j38"))
 | 
				
			||||||
 | 
					              (patches
 | 
				
			||||||
 | 
					               ;; See: https://bugzilla.xfce.org/show_bug.cgi?id=12282
 | 
				
			||||||
 | 
					               (list (search-patch "xfce4-session-fix-xflock4.patch")))))
 | 
				
			||||||
    (build-system gnu-build-system)
 | 
					    (build-system gnu-build-system)
 | 
				
			||||||
    (arguments
 | 
					    (arguments
 | 
				
			||||||
     '(#:configure-flags
 | 
					     '(#:configure-flags
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4,6 +4,7 @@
 | 
				
			||||||
;;; Copyright © 2014, 2015 Eric Bavier <bavier@member.fsf.org>
 | 
					;;; Copyright © 2014, 2015 Eric Bavier <bavier@member.fsf.org>
 | 
				
			||||||
;;; Copyright © 2015 Ludovic Courtès <ludo@gnu.org>
 | 
					;;; Copyright © 2015 Ludovic Courtès <ludo@gnu.org>
 | 
				
			||||||
;;; Copyright © 2015 Eric Dvorsak <eric@dvorsak.fr>
 | 
					;;; Copyright © 2015 Eric Dvorsak <eric@dvorsak.fr>
 | 
				
			||||||
 | 
					;;; Copyright © 2015 Cyrill Schenkel <cyrill.schenkel@gmail.com>
 | 
				
			||||||
;;;
 | 
					;;;
 | 
				
			||||||
;;; This file is part of GNU Guix.
 | 
					;;; This file is part of GNU Guix.
 | 
				
			||||||
;;;
 | 
					;;;
 | 
				
			||||||
| 
						 | 
					@ -5439,3 +5440,44 @@ perl programs to display windows and graphics on X11 servers.")
 | 
				
			||||||
    ;; of the extension modules in the directory Protocol/Ext: see those files
 | 
					    ;; of the extension modules in the directory Protocol/Ext: see those files
 | 
				
			||||||
    ;; for details)."
 | 
					    ;; for details)."
 | 
				
			||||||
    (license (package-license perl))))
 | 
					    (license (package-license perl))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(define-public xcompmgr
 | 
				
			||||||
 | 
					  (package
 | 
				
			||||||
 | 
					    (name "xcompmgr")
 | 
				
			||||||
 | 
					    (version "1.1.7")
 | 
				
			||||||
 | 
					    (source
 | 
				
			||||||
 | 
					     (origin
 | 
				
			||||||
 | 
					       ;; there's no current tarball
 | 
				
			||||||
 | 
					       (method git-fetch)
 | 
				
			||||||
 | 
					       (uri (git-reference
 | 
				
			||||||
 | 
					             (url "http://anongit.freedesktop.org/git/xorg/app/xcompmgr.git")
 | 
				
			||||||
 | 
					             (commit (string-append name "-" version))))
 | 
				
			||||||
 | 
					       (sha256
 | 
				
			||||||
 | 
					        (base32
 | 
				
			||||||
 | 
					         "04swkrm3gk689wrjc418bd3n25w8r20kg1xfbn5j8d7mx1r5gf16"))
 | 
				
			||||||
 | 
					       (file-name (string-append name "-" version))))
 | 
				
			||||||
 | 
					    (build-system gnu-build-system)
 | 
				
			||||||
 | 
					    (arguments
 | 
				
			||||||
 | 
					     `(#:phases (modify-phases %standard-phases
 | 
				
			||||||
 | 
					                  (add-after 'unpack 'autogen
 | 
				
			||||||
 | 
					                              (lambda _
 | 
				
			||||||
 | 
					                                (setenv "NOCONFIGURE" "t")
 | 
				
			||||||
 | 
					                                (zero? (system* "sh" "autogen.sh")))))))
 | 
				
			||||||
 | 
					    (native-inputs
 | 
				
			||||||
 | 
					     `(("pkg-config" ,pkg-config)
 | 
				
			||||||
 | 
					       ("autoconf" ,autoconf)
 | 
				
			||||||
 | 
					       ("automake" ,automake)))
 | 
				
			||||||
 | 
					    (inputs
 | 
				
			||||||
 | 
					     `(("libX11" ,libx11)
 | 
				
			||||||
 | 
					       ("libXext" ,libxext)
 | 
				
			||||||
 | 
					       ("libXcomposite" ,libxcomposite)
 | 
				
			||||||
 | 
					       ("libXfixes" ,libxfixes)
 | 
				
			||||||
 | 
					       ("libXdamage" ,libxdamage)
 | 
				
			||||||
 | 
					       ("libXrender" ,libxrender)))
 | 
				
			||||||
 | 
					    (synopsis "X Compositing manager using RENDER")
 | 
				
			||||||
 | 
					    (description "xcompmgr is a sample compositing manager for X servers
 | 
				
			||||||
 | 
					supporting the XFIXES, DAMAGE, RENDER, and COMPOSITE extensions.  It enables
 | 
				
			||||||
 | 
					basic eye-candy effects.")
 | 
				
			||||||
 | 
					    (home-page "http://cgit.freedesktop.org/xorg/app/xcompmgr/")
 | 
				
			||||||
 | 
					    (license (license:x11-style
 | 
				
			||||||
 | 
					              "http://cgit.freedesktop.org/xorg/app/xcompmgr/tree/COPYING"))))
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										101
									
								
								gnu/services.scm
									
										
									
									
									
								
							
							
						
						
									
										101
									
								
								gnu/services.scm
									
										
									
									
									
								
							| 
						 | 
					@ -48,6 +48,7 @@
 | 
				
			||||||
            service-kind
 | 
					            service-kind
 | 
				
			||||||
            service-parameters
 | 
					            service-parameters
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            modify-services
 | 
				
			||||||
            service-back-edges
 | 
					            service-back-edges
 | 
				
			||||||
            fold-services
 | 
					            fold-services
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -62,6 +63,7 @@
 | 
				
			||||||
            boot-service-type
 | 
					            boot-service-type
 | 
				
			||||||
            activation-service-type
 | 
					            activation-service-type
 | 
				
			||||||
            activation-service->script
 | 
					            activation-service->script
 | 
				
			||||||
 | 
					            %linux-bare-metal-service
 | 
				
			||||||
            etc-service-type
 | 
					            etc-service-type
 | 
				
			||||||
            etc-directory
 | 
					            etc-directory
 | 
				
			||||||
            setuid-program-service-type
 | 
					            setuid-program-service-type
 | 
				
			||||||
| 
						 | 
					@ -133,6 +135,47 @@
 | 
				
			||||||
  (parameters service-parameters))
 | 
					  (parameters service-parameters))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(define-syntax %modify-service
 | 
				
			||||||
 | 
					  (syntax-rules (=>)
 | 
				
			||||||
 | 
					    ((_ service)
 | 
				
			||||||
 | 
					     service)
 | 
				
			||||||
 | 
					    ((_ svc (kind param => exp ...) clauses ...)
 | 
				
			||||||
 | 
					     (if (eq? (service-kind svc) kind)
 | 
				
			||||||
 | 
					         (let ((param (service-parameters svc)))
 | 
				
			||||||
 | 
					           (service (service-kind svc)
 | 
				
			||||||
 | 
					                    (begin exp ...)))
 | 
				
			||||||
 | 
					         (%modify-service svc clauses ...)))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(define-syntax modify-services
 | 
				
			||||||
 | 
					  (syntax-rules ()
 | 
				
			||||||
 | 
					    "Modify the services listed in SERVICES according to CLAUSES.  Each clause
 | 
				
			||||||
 | 
					must have the form:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  (TYPE VARIABLE => BODY)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					where TYPE is a service type, such as 'guix-service-type', and VARIABLE is an
 | 
				
			||||||
 | 
					identifier that is bound within BODY to the value of the service of that
 | 
				
			||||||
 | 
					TYPE.  Consider this example:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  (modify-services %base-services
 | 
				
			||||||
 | 
					    (guix-service-type config =>
 | 
				
			||||||
 | 
					                       (guix-configuration
 | 
				
			||||||
 | 
					                        (inherit config)
 | 
				
			||||||
 | 
					                        (use-substitutes? #f)
 | 
				
			||||||
 | 
					                        (extra-options '(\"--gc-keep-derivations\"))))
 | 
				
			||||||
 | 
					    (mingetty-service-type config =>
 | 
				
			||||||
 | 
					                           (mingetty-configuration
 | 
				
			||||||
 | 
					                            (inherit config)
 | 
				
			||||||
 | 
					                            (motd (plain-file \"motd\" \"Hi there!\")))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					It changes the configuration of the GUIX-SERVICE-TYPE instance, and that of
 | 
				
			||||||
 | 
					all the MINGETTY-SERVICE-TYPE instances.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This is a shorthand for (map (lambda (svc) ...) %base-services)."
 | 
				
			||||||
 | 
					    ((_ services clauses ...)
 | 
				
			||||||
 | 
					     (map (lambda (service)
 | 
				
			||||||
 | 
					            (%modify-service service clauses ...))
 | 
				
			||||||
 | 
					          services))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
;;;
 | 
					;;;
 | 
				
			||||||
| 
						 | 
					@ -202,20 +245,6 @@ file."
 | 
				
			||||||
                        (union-build #$output '#$things))
 | 
					                        (union-build #$output '#$things))
 | 
				
			||||||
                    #:modules '((guix build union))))))
 | 
					                    #:modules '((guix build union))))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(define (modprobe-wrapper)
 | 
					 | 
				
			||||||
  "Return a wrapper for the 'modprobe' command that knows where modules live.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
This wrapper is typically invoked by the Linux kernel ('call_modprobe', in
 | 
					 | 
				
			||||||
kernel/kmod.c), a situation where the 'LINUX_MODULE_DIRECTORY' environment
 | 
					 | 
				
			||||||
variable is not set---hence the need for this wrapper."
 | 
					 | 
				
			||||||
  (let ((modprobe "/run/current-system/profile/bin/modprobe"))
 | 
					 | 
				
			||||||
    (gexp->script "modprobe"
 | 
					 | 
				
			||||||
                  #~(begin
 | 
					 | 
				
			||||||
                      (setenv "LINUX_MODULE_DIRECTORY"
 | 
					 | 
				
			||||||
                              "/run/booted-system/kernel/lib/modules")
 | 
					 | 
				
			||||||
                      (apply execl #$modprobe
 | 
					 | 
				
			||||||
                             (cons #$modprobe (cdr (command-line))))))))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
(define* (activation-service->script service)
 | 
					(define* (activation-service->script service)
 | 
				
			||||||
  "Return as a monadic value the activation script for SERVICE, a service of
 | 
					  "Return as a monadic value the activation script for SERVICE, a service of
 | 
				
			||||||
ACTIVATION-SCRIPT-TYPE."
 | 
					ACTIVATION-SCRIPT-TYPE."
 | 
				
			||||||
| 
						 | 
					@ -240,8 +269,7 @@ ACTIVATION-SCRIPT-TYPE."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  (mlet* %store-monad ((actions  (service-activations))
 | 
					  (mlet* %store-monad ((actions  (service-activations))
 | 
				
			||||||
                       (modules  (imported-modules %modules))
 | 
					                       (modules  (imported-modules %modules))
 | 
				
			||||||
                       (compiled (compiled-modules %modules))
 | 
					                       (compiled (compiled-modules %modules)))
 | 
				
			||||||
                       (modprobe (modprobe-wrapper)))
 | 
					 | 
				
			||||||
    (gexp->file "activate"
 | 
					    (gexp->file "activate"
 | 
				
			||||||
                #~(begin
 | 
					                #~(begin
 | 
				
			||||||
                    (eval-when (expand load eval)
 | 
					                    (eval-when (expand load eval)
 | 
				
			||||||
| 
						 | 
					@ -256,12 +284,6 @@ ACTIVATION-SCRIPT-TYPE."
 | 
				
			||||||
                    (activate-/bin/sh
 | 
					                    (activate-/bin/sh
 | 
				
			||||||
                     (string-append #$(canonical-package bash) "/bin/sh"))
 | 
					                     (string-append #$(canonical-package bash) "/bin/sh"))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    ;; Tell the kernel to use our 'modprobe' command.
 | 
					 | 
				
			||||||
                    (activate-modprobe #$modprobe)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                    ;; Let users debug their own processes!
 | 
					 | 
				
			||||||
                    (activate-ptrace-attach)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                    ;; Run the services' activation snippets.
 | 
					                    ;; Run the services' activation snippets.
 | 
				
			||||||
                    ;; TODO: Use 'load-compiled'.
 | 
					                    ;; TODO: Use 'load-compiled'.
 | 
				
			||||||
                    (for-each primitive-load '#$actions)
 | 
					                    (for-each primitive-load '#$actions)
 | 
				
			||||||
| 
						 | 
					@ -287,6 +309,41 @@ ACTIVATION-SCRIPT-TYPE."
 | 
				
			||||||
  ;; receives.
 | 
					  ;; receives.
 | 
				
			||||||
  (service activation-service-type #t))
 | 
					  (service activation-service-type #t))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(define %modprobe-wrapper
 | 
				
			||||||
 | 
					  ;; Wrapper for the 'modprobe' command that knows where modules live.
 | 
				
			||||||
 | 
					  ;;
 | 
				
			||||||
 | 
					  ;; This wrapper is typically invoked by the Linux kernel ('call_modprobe',
 | 
				
			||||||
 | 
					  ;; in kernel/kmod.c), a situation where the 'LINUX_MODULE_DIRECTORY'
 | 
				
			||||||
 | 
					  ;; environment variable is not set---hence the need for this wrapper.
 | 
				
			||||||
 | 
					  (let ((modprobe "/run/current-system/profile/bin/modprobe"))
 | 
				
			||||||
 | 
					    (program-file "modprobe"
 | 
				
			||||||
 | 
					                  #~(begin
 | 
				
			||||||
 | 
					                      (setenv "LINUX_MODULE_DIRECTORY"
 | 
				
			||||||
 | 
					                              "/run/booted-system/kernel/lib/modules")
 | 
				
			||||||
 | 
					                      (apply execl #$modprobe
 | 
				
			||||||
 | 
					                             (cons #$modprobe (cdr (command-line))))))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(define %linux-kernel-activation
 | 
				
			||||||
 | 
					  ;; Activation of the Linux kernel running on the bare metal (as opposed to
 | 
				
			||||||
 | 
					  ;; running in a container.)
 | 
				
			||||||
 | 
					  #~(begin
 | 
				
			||||||
 | 
					      ;; Tell the kernel to use our 'modprobe' command.
 | 
				
			||||||
 | 
					      (activate-modprobe #$%modprobe-wrapper)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      ;; Let users debug their own processes!
 | 
				
			||||||
 | 
					      (activate-ptrace-attach)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(define linux-bare-metal-service-type
 | 
				
			||||||
 | 
					  (service-type (name 'linux-bare-metal)
 | 
				
			||||||
 | 
					                (extensions
 | 
				
			||||||
 | 
					                 (list (service-extension activation-service-type
 | 
				
			||||||
 | 
					                                          (const %linux-kernel-activation))))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(define %linux-bare-metal-service
 | 
				
			||||||
 | 
					  ;; The service that does things that are needed on the "bare metal", but not
 | 
				
			||||||
 | 
					  ;; necessary or impossible in a container.
 | 
				
			||||||
 | 
					  (service linux-bare-metal-service-type #f))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(define (etc-directory service)
 | 
					(define (etc-directory service)
 | 
				
			||||||
  "Return the directory for SERVICE, a service of type ETC-SERVICE-TYPE."
 | 
					  "Return the directory for SERVICE, a service of type ETC-SERVICE-TYPE."
 | 
				
			||||||
  (files->etc-directory (service-parameters service)))
 | 
					  (files->etc-directory (service-parameters service)))
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -57,6 +57,7 @@
 | 
				
			||||||
            mingetty-configuration
 | 
					            mingetty-configuration
 | 
				
			||||||
            mingetty-configuration?
 | 
					            mingetty-configuration?
 | 
				
			||||||
            mingetty-service
 | 
					            mingetty-service
 | 
				
			||||||
 | 
					            mingetty-service-type
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            %nscd-default-caches
 | 
					            %nscd-default-caches
 | 
				
			||||||
            %nscd-default-configuration
 | 
					            %nscd-default-configuration
 | 
				
			||||||
| 
						 | 
					@ -74,6 +75,7 @@
 | 
				
			||||||
            guix-configuration
 | 
					            guix-configuration
 | 
				
			||||||
            guix-configuration?
 | 
					            guix-configuration?
 | 
				
			||||||
            guix-service
 | 
					            guix-service
 | 
				
			||||||
 | 
					            guix-service-type
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            %base-services))
 | 
					            %base-services))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -142,6 +144,18 @@ FILE-SYSTEM."
 | 
				
			||||||
  (symbol-append 'file-system-
 | 
					  (symbol-append 'file-system-
 | 
				
			||||||
                 (string->symbol (file-system-mount-point file-system))))
 | 
					                 (string->symbol (file-system-mount-point file-system))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(define (mapped-device->dmd-service-name md)
 | 
				
			||||||
 | 
					  "Return the symbol that denotes the dmd service of MD, a <mapped-device>."
 | 
				
			||||||
 | 
					  (symbol-append 'device-mapping-
 | 
				
			||||||
 | 
					                 (string->symbol (mapped-device-target md))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(define dependency->dmd-service-name
 | 
				
			||||||
 | 
					  (match-lambda
 | 
				
			||||||
 | 
					    ((? mapped-device? md)
 | 
				
			||||||
 | 
					     (mapped-device->dmd-service-name md))
 | 
				
			||||||
 | 
					    ((? file-system? fs)
 | 
				
			||||||
 | 
					     (file-system->dmd-service-name fs))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(define file-system-service-type
 | 
					(define file-system-service-type
 | 
				
			||||||
  ;; TODO(?): Make this an extensible service that takes <file-system> objects
 | 
					  ;; TODO(?): Make this an extensible service that takes <file-system> objects
 | 
				
			||||||
  ;; and returns a list of <dmd-service>.
 | 
					  ;; and returns a list of <dmd-service>.
 | 
				
			||||||
| 
						 | 
					@ -158,7 +172,7 @@ FILE-SYSTEM."
 | 
				
			||||||
       (dmd-service
 | 
					       (dmd-service
 | 
				
			||||||
        (provision (list (file-system->dmd-service-name file-system)))
 | 
					        (provision (list (file-system->dmd-service-name file-system)))
 | 
				
			||||||
        (requirement `(root-file-system
 | 
					        (requirement `(root-file-system
 | 
				
			||||||
                       ,@(map file-system->dmd-service-name dependencies)))
 | 
					                       ,@(map dependency->dmd-service-name dependencies)))
 | 
				
			||||||
        (documentation "Check, mount, and unmount the given file system.")
 | 
					        (documentation "Check, mount, and unmount the given file system.")
 | 
				
			||||||
        (start #~(lambda args
 | 
					        (start #~(lambda args
 | 
				
			||||||
                   ;; FIXME: Use or factorize with 'mount-file-system'.
 | 
					                   ;; FIXME: Use or factorize with 'mount-file-system'.
 | 
				
			||||||
| 
						 | 
					@ -751,6 +765,8 @@ failed to register hydra.gnu.org public key: ~a~%" status))))))))
 | 
				
			||||||
                    (default #t))
 | 
					                    (default #t))
 | 
				
			||||||
  (use-substitutes? guix-configuration-use-substitutes? ;Boolean
 | 
					  (use-substitutes? guix-configuration-use-substitutes? ;Boolean
 | 
				
			||||||
                    (default #t))
 | 
					                    (default #t))
 | 
				
			||||||
 | 
					  (substitute-urls  guix-configuration-substitute-urls ;list of strings
 | 
				
			||||||
 | 
					                    (default %default-substitute-urls))
 | 
				
			||||||
  (extra-options    guix-configuration-extra-options ;list of strings
 | 
					  (extra-options    guix-configuration-extra-options ;list of strings
 | 
				
			||||||
                    (default '()))
 | 
					                    (default '()))
 | 
				
			||||||
  (lsof             guix-configuration-lsof       ;<package>
 | 
					  (lsof             guix-configuration-lsof       ;<package>
 | 
				
			||||||
| 
						 | 
					@ -765,7 +781,8 @@ failed to register hydra.gnu.org public key: ~a~%" status))))))))
 | 
				
			||||||
  "Return a <dmd-service> for the Guix daemon service with CONFIG."
 | 
					  "Return a <dmd-service> for the Guix daemon service with CONFIG."
 | 
				
			||||||
  (match config
 | 
					  (match config
 | 
				
			||||||
    (($ <guix-configuration> guix build-group build-accounts authorize-key?
 | 
					    (($ <guix-configuration> guix build-group build-accounts authorize-key?
 | 
				
			||||||
                             use-substitutes? extra-options lsof lsh)
 | 
					                             use-substitutes? substitute-urls extra-options
 | 
				
			||||||
 | 
					                             lsof lsh)
 | 
				
			||||||
     (list (dmd-service
 | 
					     (list (dmd-service
 | 
				
			||||||
            (documentation "Run the Guix daemon.")
 | 
					            (documentation "Run the Guix daemon.")
 | 
				
			||||||
            (provision '(guix-daemon))
 | 
					            (provision '(guix-daemon))
 | 
				
			||||||
| 
						 | 
					@ -777,6 +794,7 @@ failed to register hydra.gnu.org public key: ~a~%" status))))))))
 | 
				
			||||||
                      #$@(if use-substitutes?
 | 
					                      #$@(if use-substitutes?
 | 
				
			||||||
                             '()
 | 
					                             '()
 | 
				
			||||||
                             '("--no-substitutes"))
 | 
					                             '("--no-substitutes"))
 | 
				
			||||||
 | 
					                      "--substitute-urls" #$(string-join substitute-urls)
 | 
				
			||||||
                      #$@extra-options)
 | 
					                      #$@extra-options)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                ;; Add 'lsof' (for the GC) and 'lsh' (for offloading) to the
 | 
					                ;; Add 'lsof' (for the GC) and 'lsh' (for offloading) to the
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -34,6 +34,8 @@
 | 
				
			||||||
  #:use-module (gnu packages gnome)
 | 
					  #:use-module (gnu packages gnome)
 | 
				
			||||||
  #:use-module (gnu packages avahi)
 | 
					  #:use-module (gnu packages avahi)
 | 
				
			||||||
  #:use-module (gnu packages polkit)
 | 
					  #:use-module (gnu packages polkit)
 | 
				
			||||||
 | 
					  #:use-module (gnu packages xdisorg)
 | 
				
			||||||
 | 
					  #:use-module (gnu packages suckless)
 | 
				
			||||||
  #:use-module (guix records)
 | 
					  #:use-module (guix records)
 | 
				
			||||||
  #:use-module (guix packages)
 | 
					  #:use-module (guix packages)
 | 
				
			||||||
  #:use-module (guix store)
 | 
					  #:use-module (guix store)
 | 
				
			||||||
| 
						 | 
					@ -599,6 +601,10 @@ when they log out."
 | 
				
			||||||
  ;; List of services typically useful for a "desktop" use case.
 | 
					  ;; List of services typically useful for a "desktop" use case.
 | 
				
			||||||
  (cons* (slim-service)
 | 
					  (cons* (slim-service)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					         ;; Screen lockers are a pretty useful thing and these are small.
 | 
				
			||||||
 | 
					         (screen-locker-service slock)
 | 
				
			||||||
 | 
					         (screen-locker-service xlockmore "xlock")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
         ;; The D-Bus clique.
 | 
					         ;; The D-Bus clique.
 | 
				
			||||||
         (avahi-service)
 | 
					         (avahi-service)
 | 
				
			||||||
         (wicd-service)
 | 
					         (wicd-service)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -32,16 +32,21 @@
 | 
				
			||||||
  #:use-module (gnu packages bash)
 | 
					  #:use-module (gnu packages bash)
 | 
				
			||||||
  #:use-module (guix gexp)
 | 
					  #:use-module (guix gexp)
 | 
				
			||||||
  #:use-module (guix store)
 | 
					  #:use-module (guix store)
 | 
				
			||||||
 | 
					  #:use-module (guix packages)
 | 
				
			||||||
  #:use-module (guix derivations)
 | 
					  #:use-module (guix derivations)
 | 
				
			||||||
  #:use-module (guix records)
 | 
					  #:use-module (guix records)
 | 
				
			||||||
  #:use-module (srfi srfi-1)
 | 
					  #:use-module (srfi srfi-1)
 | 
				
			||||||
 | 
					  #:use-module (srfi srfi-9)
 | 
				
			||||||
  #:use-module (srfi srfi-26)
 | 
					  #:use-module (srfi srfi-26)
 | 
				
			||||||
  #:use-module (ice-9 match)
 | 
					  #:use-module (ice-9 match)
 | 
				
			||||||
  #:export (xorg-configuration-file
 | 
					  #:export (xorg-configuration-file
 | 
				
			||||||
            xorg-start-command
 | 
					            xorg-start-command
 | 
				
			||||||
            %default-slim-theme
 | 
					            %default-slim-theme
 | 
				
			||||||
            %default-slim-theme-name
 | 
					            %default-slim-theme-name
 | 
				
			||||||
            slim-service))
 | 
					            slim-service
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            screen-locker-service-type
 | 
				
			||||||
 | 
					            screen-locker-service))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
;;; Commentary:
 | 
					;;; Commentary:
 | 
				
			||||||
;;;
 | 
					;;;
 | 
				
			||||||
| 
						 | 
					@ -350,4 +355,52 @@ theme."
 | 
				
			||||||
            (auto-login-session auto-login-session)
 | 
					            (auto-login-session auto-login-session)
 | 
				
			||||||
            (startx startx))))
 | 
					            (startx startx))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					;;;
 | 
				
			||||||
 | 
					;;; Screen lockers & co.
 | 
				
			||||||
 | 
					;;;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(define-record-type <screen-locker>
 | 
				
			||||||
 | 
					  (screen-locker name program empty?)
 | 
				
			||||||
 | 
					  screen-locker?
 | 
				
			||||||
 | 
					  (name    screen-locker-name)                     ;string
 | 
				
			||||||
 | 
					  (program screen-locker-program)                  ;gexp
 | 
				
			||||||
 | 
					  (empty?  screen-locker-allows-empty-passwords?)) ;Boolean
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(define screen-locker-pam-services
 | 
				
			||||||
 | 
					  (match-lambda
 | 
				
			||||||
 | 
					    (($ <screen-locker> name _ empty?)
 | 
				
			||||||
 | 
					     (list (unix-pam-service name
 | 
				
			||||||
 | 
					                             #:allow-empty-passwords? empty?)))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(define screen-locker-setuid-programs
 | 
				
			||||||
 | 
					  (compose list screen-locker-program))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(define screen-locker-service-type
 | 
				
			||||||
 | 
					  (service-type (name 'screen-locker)
 | 
				
			||||||
 | 
					                (extensions
 | 
				
			||||||
 | 
					                 (list (service-extension pam-root-service-type
 | 
				
			||||||
 | 
					                                          screen-locker-pam-services)
 | 
				
			||||||
 | 
					                       (service-extension setuid-program-service-type
 | 
				
			||||||
 | 
					                                          screen-locker-setuid-programs)))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(define* (screen-locker-service package
 | 
				
			||||||
 | 
					                                #:optional
 | 
				
			||||||
 | 
					                                (program (package-name package))
 | 
				
			||||||
 | 
					                                #:key allow-empty-passwords?)
 | 
				
			||||||
 | 
					  "Add @var{package}, a package for a screen-locker or screen-saver whose
 | 
				
			||||||
 | 
					command is @var{program}, to the set of setuid programs and add a PAM entry
 | 
				
			||||||
 | 
					for it.  For example:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@lisp
 | 
				
			||||||
 | 
					(screen-locker-service xlockmore \"xlock\")
 | 
				
			||||||
 | 
					@end lisp
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					makes the good ol' XlockMore usable."
 | 
				
			||||||
 | 
					  (service screen-locker-service-type
 | 
				
			||||||
 | 
					           (screen-locker program
 | 
				
			||||||
 | 
					                          #~(string-append #$package
 | 
				
			||||||
 | 
					                                           #$(string-append "/bin/" program))
 | 
				
			||||||
 | 
					                          allow-empty-passwords?)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
;;; xorg.scm ends here
 | 
					;;; xorg.scm ends here
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -195,19 +195,16 @@ as 'needed-for-boot'."
 | 
				
			||||||
                        (file-system-device fs)))
 | 
					                        (file-system-device fs)))
 | 
				
			||||||
            (operating-system-mapped-devices os)))
 | 
					            (operating-system-mapped-devices os)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  (define (requirements fs)
 | 
					  (define (add-dependencies fs)
 | 
				
			||||||
    ;; XXX: Fiddling with dmd service names is not nice.
 | 
					    ;; Add the dependencies due to device mappings to FS.
 | 
				
			||||||
    (append (map (lambda (fs)
 | 
					    (file-system
 | 
				
			||||||
                   (symbol-append 'file-system-
 | 
					      (inherit fs)
 | 
				
			||||||
                                  (string->symbol
 | 
					      (dependencies
 | 
				
			||||||
                                   (file-system-mount-point fs))))
 | 
					       (delete-duplicates (append (device-mappings fs)
 | 
				
			||||||
                                  (file-system-dependencies fs))
 | 
					                                  (file-system-dependencies fs))
 | 
				
			||||||
            (map (lambda (md)
 | 
					                          eq?))))
 | 
				
			||||||
                   (symbol-append 'device-mapping-
 | 
					 | 
				
			||||||
                                  (string->symbol (mapped-device-target md))))
 | 
					 | 
				
			||||||
                 (device-mappings fs))))
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  (map file-system-service file-systems))
 | 
					  (map (compose file-system-service add-dependencies) file-systems))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(define (mapped-device-user device file-systems)
 | 
					(define (mapped-device-user device file-systems)
 | 
				
			||||||
  "Return a file system among FILE-SYSTEMS that uses DEVICE, or #f."
 | 
					  "Return a file system among FILE-SYSTEMS that uses DEVICE, or #f."
 | 
				
			||||||
| 
						 | 
					@ -290,7 +287,8 @@ a container or that of a \"bare metal\" system."
 | 
				
			||||||
                   ;; container.
 | 
					                   ;; container.
 | 
				
			||||||
                   (if container?
 | 
					                   (if container?
 | 
				
			||||||
                       '()
 | 
					                       '()
 | 
				
			||||||
                       (list (service firmware-service-type
 | 
					                       (list %linux-bare-metal-service
 | 
				
			||||||
 | 
					                             (service firmware-service-type
 | 
				
			||||||
                                      (operating-system-firmware os))))))))
 | 
					                                      (operating-system-firmware os))))))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(define* (operating-system-services os #:key container?)
 | 
					(define* (operating-system-services os #:key container?)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -99,9 +99,8 @@
 | 
				
			||||||
                    (default #t))
 | 
					                    (default #t))
 | 
				
			||||||
  (create-mount-point? file-system-create-mount-point? ; Boolean
 | 
					  (create-mount-point? file-system-create-mount-point? ; Boolean
 | 
				
			||||||
                       (default #f))
 | 
					                       (default #f))
 | 
				
			||||||
  (dependencies     file-system-dependencies      ; list of strings (mount
 | 
					  (dependencies     file-system-dependencies      ; list of <file-system>
 | 
				
			||||||
                                                  ; points depended on)
 | 
					                    (default '())))               ; or <mapped-device>
 | 
				
			||||||
                    (default '())))
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
(define-inlinable (file-system-needed-for-boot? fs)
 | 
					(define-inlinable (file-system-needed-for-boot? fs)
 | 
				
			||||||
  "Return true if FS has the 'needed-for-boot?' flag set, or if it's the root
 | 
					  "Return true if FS has the 'needed-for-boot?' flag set, or if it's the root
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -30,6 +30,7 @@
 | 
				
			||||||
  #:autoload   (gnu packages imagemagick) (imagemagick)
 | 
					  #:autoload   (gnu packages imagemagick) (imagemagick)
 | 
				
			||||||
  #:autoload   (gnu packages compression) (gzip)
 | 
					  #:autoload   (gnu packages compression) (gzip)
 | 
				
			||||||
  #:use-module (ice-9 match)
 | 
					  #:use-module (ice-9 match)
 | 
				
			||||||
 | 
					  #:use-module (ice-9 regex)
 | 
				
			||||||
  #:use-module (srfi srfi-1)
 | 
					  #:use-module (srfi srfi-1)
 | 
				
			||||||
  #:export (grub-image
 | 
					  #:export (grub-image
 | 
				
			||||||
            grub-image?
 | 
					            grub-image?
 | 
				
			||||||
| 
						 | 
					@ -152,10 +153,26 @@ WIDTH/HEIGHT, or #f if none was found."
 | 
				
			||||||
        (with-monad %store-monad
 | 
					        (with-monad %store-monad
 | 
				
			||||||
          (return #f)))))
 | 
					          (return #f)))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(define (eye-candy config port)
 | 
					(define (eye-candy config system port)
 | 
				
			||||||
  "Return in %STORE-MONAD a gexp that writes to PORT (a port-valued gexp) the
 | 
					  "Return in %STORE-MONAD a gexp that writes to PORT (a port-valued gexp) the
 | 
				
			||||||
'grub.cfg' part concerned with graphics mode, background images, colors, and
 | 
					'grub.cfg' part concerned with graphics mode, background images, colors, and
 | 
				
			||||||
all that."
 | 
					all that."
 | 
				
			||||||
 | 
					  (define setup-gfxterm-body
 | 
				
			||||||
 | 
					    ;; Intel systems need to be switched into graphics mode, whereas most
 | 
				
			||||||
 | 
					    ;; other modern architectures have no other mode and therefore don't need
 | 
				
			||||||
 | 
					    ;; to be switched.
 | 
				
			||||||
 | 
					    (if (string-match "^(x86_64|i[3-6]86)-" system)
 | 
				
			||||||
 | 
					        "
 | 
				
			||||||
 | 
					  # Leave 'gfxmode' to 'auto'.
 | 
				
			||||||
 | 
					  insmod vbe
 | 
				
			||||||
 | 
					  insmod vga
 | 
				
			||||||
 | 
					  insmod video_bochs
 | 
				
			||||||
 | 
					  insmod video_cirrus
 | 
				
			||||||
 | 
					  insmod gfxterm
 | 
				
			||||||
 | 
					  terminal_output gfxterm
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
					        ""))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  (define (theme-colors type)
 | 
					  (define (theme-colors type)
 | 
				
			||||||
    (let* ((theme  (grub-configuration-theme config))
 | 
					    (let* ((theme  (grub-configuration-theme config))
 | 
				
			||||||
           (colors (type theme)))
 | 
					           (colors (type theme)))
 | 
				
			||||||
| 
						 | 
					@ -163,22 +180,15 @@ all that."
 | 
				
			||||||
                     (symbol->string (assoc-ref colors 'bg)))))
 | 
					                     (symbol->string (assoc-ref colors 'bg)))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  (mlet* %store-monad ((image (grub-background-image config)))
 | 
					  (mlet* %store-monad ((image (grub-background-image config)))
 | 
				
			||||||
    (return (and image #~(format #$port "
 | 
					    (return (and image
 | 
				
			||||||
function load_video {
 | 
					                 #~(format #$port "
 | 
				
			||||||
  insmod vbe
 | 
					function setup_gfxterm {~a}
 | 
				
			||||||
  insmod vga
 | 
					 | 
				
			||||||
  insmod video_bochs
 | 
					 | 
				
			||||||
  insmod video_cirrus
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Set 'root' to the partition that contains /gnu/store.
 | 
					# Set 'root' to the partition that contains /gnu/store.
 | 
				
			||||||
search --file --set ~a/share/grub/unicode.pf2
 | 
					search --file --set ~a/share/grub/unicode.pf2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if loadfont ~a/share/grub/unicode.pf2; then
 | 
					if loadfont ~a/share/grub/unicode.pf2; then
 | 
				
			||||||
  set gfxmode=640x480
 | 
					  setup_gfxterm
 | 
				
			||||||
  load_video
 | 
					 | 
				
			||||||
  insmod gfxterm
 | 
					 | 
				
			||||||
  terminal_output gfxterm
 | 
					 | 
				
			||||||
fi
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
insmod png
 | 
					insmod png
 | 
				
			||||||
| 
						 | 
					@ -189,6 +199,7 @@ else
 | 
				
			||||||
  set menu_color_normal=cyan/blue
 | 
					  set menu_color_normal=cyan/blue
 | 
				
			||||||
  set menu_color_highlight=white/blue
 | 
					  set menu_color_highlight=white/blue
 | 
				
			||||||
fi~%"
 | 
					fi~%"
 | 
				
			||||||
 | 
					                           #$setup-gfxterm-body
 | 
				
			||||||
                           #$grub #$grub
 | 
					                           #$grub #$grub
 | 
				
			||||||
                           #$image
 | 
					                           #$image
 | 
				
			||||||
                           #$(theme-colors grub-theme-color-normal)
 | 
					                           #$(theme-colors grub-theme-color-normal)
 | 
				
			||||||
| 
						 | 
					@ -206,6 +217,11 @@ fi~%"
 | 
				
			||||||
  "Return the GRUB configuration file corresponding to CONFIG, a
 | 
					  "Return the GRUB configuration file corresponding to CONFIG, a
 | 
				
			||||||
<grub-configuration> object.  OLD-ENTRIES is taken to be a list of menu
 | 
					<grub-configuration> object.  OLD-ENTRIES is taken to be a list of menu
 | 
				
			||||||
entries corresponding to old generations of the system."
 | 
					entries corresponding to old generations of the system."
 | 
				
			||||||
 | 
					  (define linux-image-name
 | 
				
			||||||
 | 
					    (if (string-prefix? "mips" system)
 | 
				
			||||||
 | 
					        "vmlinuz"
 | 
				
			||||||
 | 
					        "bzImage"))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  (define all-entries
 | 
					  (define all-entries
 | 
				
			||||||
    (append entries (grub-configuration-menu-entries config)))
 | 
					    (append entries (grub-configuration-menu-entries config)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -214,16 +230,17 @@ entries corresponding to old generations of the system."
 | 
				
			||||||
     (($ <menu-entry> label linux arguments initrd)
 | 
					     (($ <menu-entry> label linux arguments initrd)
 | 
				
			||||||
      #~(format port "menuentry ~s {
 | 
					      #~(format port "menuentry ~s {
 | 
				
			||||||
  # Set 'root' to the partition that contains the kernel.
 | 
					  # Set 'root' to the partition that contains the kernel.
 | 
				
			||||||
  search --file --set ~a/bzImage~%
 | 
					  search --file --set ~a/~a~%
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  linux ~a/bzImage ~a
 | 
					  linux ~a/~a ~a
 | 
				
			||||||
  initrd ~a
 | 
					  initrd ~a
 | 
				
			||||||
}~%"
 | 
					}~%"
 | 
				
			||||||
                #$label
 | 
					                #$label
 | 
				
			||||||
                #$linux #$linux (string-join (list #$@arguments))
 | 
					                #$linux #$linux-image-name
 | 
				
			||||||
 | 
					                #$linux #$linux-image-name (string-join (list #$@arguments))
 | 
				
			||||||
                #$initrd))))
 | 
					                #$initrd))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  (mlet %store-monad ((sugar (eye-candy config #~port)))
 | 
					  (mlet %store-monad ((sugar (eye-candy config system #~port)))
 | 
				
			||||||
    (define builder
 | 
					    (define builder
 | 
				
			||||||
      #~(call-with-output-file #$output
 | 
					      #~(call-with-output-file #$output
 | 
				
			||||||
          (lambda (port)
 | 
					          (lambda (port)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -178,11 +178,13 @@ loaded at boot time in the order in which they appear."
 | 
				
			||||||
  (define linux-modules
 | 
					  (define linux-modules
 | 
				
			||||||
    ;; Modules added to the initrd and loaded from the initrd.
 | 
					    ;; Modules added to the initrd and loaded from the initrd.
 | 
				
			||||||
    `("ahci"                                  ;for SATA controllers
 | 
					    `("ahci"                                  ;for SATA controllers
 | 
				
			||||||
      "pata_acpi" "pata_atiixp"               ;for ATA controllers
 | 
					 | 
				
			||||||
      "isci"                              ;for SAS controllers like Intel C602
 | 
					 | 
				
			||||||
      "usb-storage" "uas"                     ;for the installation image etc.
 | 
					      "usb-storage" "uas"                     ;for the installation image etc.
 | 
				
			||||||
      "usbkbd" "usbhid"                       ;USB keyboards, for debugging
 | 
					      "usbkbd" "usbhid"                       ;USB keyboards, for debugging
 | 
				
			||||||
      "dm-crypt" "xts"                        ;for encrypted root partitions
 | 
					      "dm-crypt" "xts"                        ;for encrypted root partitions
 | 
				
			||||||
 | 
					      ,@(if (string-match "^(x86_64|i[3-6]86)-" (%current-system))
 | 
				
			||||||
 | 
					            '("pata_acpi" "pata_atiixp"    ;for ATA controllers
 | 
				
			||||||
 | 
					              "isci")                      ;for SAS controllers like Intel C602
 | 
				
			||||||
 | 
					            '())
 | 
				
			||||||
      ,@(if (or virtio? qemu-networking?)
 | 
					      ,@(if (or virtio? qemu-networking?)
 | 
				
			||||||
            virtio-modules
 | 
					            virtio-modules
 | 
				
			||||||
            '())
 | 
					            '())
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -182,8 +182,7 @@ authenticate to run COMMAND."
 | 
				
			||||||
          ;; These programs are setuid-root.
 | 
					          ;; These programs are setuid-root.
 | 
				
			||||||
          (map (cut unix-pam-service <>
 | 
					          (map (cut unix-pam-service <>
 | 
				
			||||||
                    #:allow-empty-passwords? allow-empty-passwords?)
 | 
					                    #:allow-empty-passwords? allow-empty-passwords?)
 | 
				
			||||||
               '("su" "passwd" "sudo"
 | 
					               '("su" "passwd" "sudo"))
 | 
				
			||||||
                 "xlock" "xscreensaver"))
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
          ;; These programs are not setuid-root, and we want root to be able
 | 
					          ;; These programs are not setuid-root, and we want root to be able
 | 
				
			||||||
          ;; to run them without having to authenticate (notably because
 | 
					          ;; to run them without having to authenticate (notably because
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,5 +1,6 @@
 | 
				
			||||||
;;; GNU Guix --- Functional package management for GNU
 | 
					;;; GNU Guix --- Functional package management for GNU
 | 
				
			||||||
;;; Copyright © 2015 Federico Beffa <beffa@fbengineering.ch>
 | 
					;;; Copyright © 2015 Federico Beffa <beffa@fbengineering.ch>
 | 
				
			||||||
 | 
					;;; Copyright © 2015 Paul van der Walt <paul@denknerd.org>
 | 
				
			||||||
;;;
 | 
					;;;
 | 
				
			||||||
;;; This file is part of GNU Guix.
 | 
					;;; This file is part of GNU Guix.
 | 
				
			||||||
;;;
 | 
					;;;
 | 
				
			||||||
| 
						 | 
					@ -96,6 +97,14 @@ and parameters ~s~%"
 | 
				
			||||||
                             '("--enable-tests")
 | 
					                             '("--enable-tests")
 | 
				
			||||||
                             '())
 | 
					                             '())
 | 
				
			||||||
                         configure-flags)))
 | 
					                         configure-flags)))
 | 
				
			||||||
 | 
					    ;; For packages where the Cabal build-type is set to "Configure",
 | 
				
			||||||
 | 
					    ;; ./configure will be executed.  In these cases, the following
 | 
				
			||||||
 | 
					    ;; environment variable is needed to be able to find the shell executable.
 | 
				
			||||||
 | 
					    ;; For other package types, the configure script isn't present.  For more
 | 
				
			||||||
 | 
					    ;; information, see the Build Information section of
 | 
				
			||||||
 | 
					    ;; <https://www.haskell.org/cabal/users-guide/developing-packages.html>.
 | 
				
			||||||
 | 
					    (when (file-exists? "configure")
 | 
				
			||||||
 | 
					      (setenv "CONFIG_SHELL" "sh"))
 | 
				
			||||||
    (run-setuphs "configure" params)))
 | 
					    (run-setuphs "configure" params)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(define* (build #:rest empty)
 | 
					(define* (build #:rest empty)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -413,8 +413,10 @@ for instance, whose releases are now uploaded to elpa.gnu.org."
 | 
				
			||||||
       (gnu-package? package)))
 | 
					       (gnu-package? package)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(define %gnu-updater
 | 
					(define %gnu-updater
 | 
				
			||||||
  (upstream-updater 'gnu
 | 
					  (upstream-updater
 | 
				
			||||||
                    non-emacs-gnu-package?
 | 
					   (name 'gnu)
 | 
				
			||||||
                    latest-release*))
 | 
					   (description "Updater for GNU packages")
 | 
				
			||||||
 | 
					   (pred non-emacs-gnu-package?)
 | 
				
			||||||
 | 
					   (latest latest-release*)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
;;; gnu-maintenance.scm ends here
 | 
					;;; gnu-maintenance.scm ends here
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -236,8 +236,10 @@ representation of the package page."
 | 
				
			||||||
  (string-prefix? "r-" (package-name package)))
 | 
					  (string-prefix? "r-" (package-name package)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(define %cran-updater
 | 
					(define %cran-updater
 | 
				
			||||||
  (upstream-updater 'cran
 | 
					  (upstream-updater
 | 
				
			||||||
                    cran-package?
 | 
					   (name 'cran)
 | 
				
			||||||
                    latest-release))
 | 
					   (description "Updater for CRAN packages")
 | 
				
			||||||
 | 
					   (pred cran-package?)
 | 
				
			||||||
 | 
					   (latest latest-release)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
;;; cran.scm ends here
 | 
					;;; cran.scm ends here
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -272,8 +272,10 @@ as \"debbugs\"."
 | 
				
			||||||
(define %elpa-updater
 | 
					(define %elpa-updater
 | 
				
			||||||
  ;; The ELPA updater.  We restrict it to packages hosted on elpa.gnu.org
 | 
					  ;; The ELPA updater.  We restrict it to packages hosted on elpa.gnu.org
 | 
				
			||||||
  ;; because for other repositories, we typically grab the source elsewhere.
 | 
					  ;; because for other repositories, we typically grab the source elsewhere.
 | 
				
			||||||
  (upstream-updater 'elpa
 | 
					  (upstream-updater
 | 
				
			||||||
                    package-from-gnu.org?
 | 
					   (name 'elpa)
 | 
				
			||||||
                    latest-release))
 | 
					   (description "Updater for ELPA packages")
 | 
				
			||||||
 | 
					   (pred package-from-gnu.org?)
 | 
				
			||||||
 | 
					   (latest latest-release)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
;;; elpa.scm ends here
 | 
					;;; elpa.scm ends here
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -84,13 +84,17 @@
 | 
				
			||||||
            packages->manifest
 | 
					            packages->manifest
 | 
				
			||||||
            %default-profile-hooks
 | 
					            %default-profile-hooks
 | 
				
			||||||
            profile-derivation
 | 
					            profile-derivation
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            generation-number
 | 
					            generation-number
 | 
				
			||||||
            generation-numbers
 | 
					            generation-numbers
 | 
				
			||||||
            profile-generations
 | 
					            profile-generations
 | 
				
			||||||
            relative-generation
 | 
					            relative-generation
 | 
				
			||||||
            previous-generation-number
 | 
					            previous-generation-number
 | 
				
			||||||
            generation-time
 | 
					            generation-time
 | 
				
			||||||
            generation-file-name))
 | 
					            generation-file-name
 | 
				
			||||||
 | 
					            switch-to-generation
 | 
				
			||||||
 | 
					            roll-back
 | 
				
			||||||
 | 
					            delete-generation))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
;;; Commentary:
 | 
					;;; Commentary:
 | 
				
			||||||
;;;
 | 
					;;;
 | 
				
			||||||
| 
						 | 
					@ -844,4 +848,78 @@ case when generations have been deleted (there are \"holes\")."
 | 
				
			||||||
  (make-time time-utc 0
 | 
					  (make-time time-utc 0
 | 
				
			||||||
             (stat:ctime (stat (generation-file-name profile number)))))
 | 
					             (stat:ctime (stat (generation-file-name profile number)))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(define (link-to-empty-profile store generation)
 | 
				
			||||||
 | 
					  "Link GENERATION, a string, to the empty profile.  An error is raised if
 | 
				
			||||||
 | 
					that fails."
 | 
				
			||||||
 | 
					  (let* ((drv  (run-with-store store
 | 
				
			||||||
 | 
					                 (profile-derivation (manifest '()))))
 | 
				
			||||||
 | 
					         (prof (derivation->output-path drv "out")))
 | 
				
			||||||
 | 
					    (build-derivations store (list drv))
 | 
				
			||||||
 | 
					    (switch-symlinks generation prof)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(define (switch-to-generation profile number)
 | 
				
			||||||
 | 
					  "Atomically switch PROFILE to the generation NUMBER.  Return the number of
 | 
				
			||||||
 | 
					the generation that was current before switching."
 | 
				
			||||||
 | 
					  (let ((current    (generation-number profile))
 | 
				
			||||||
 | 
					        (generation (generation-file-name profile number)))
 | 
				
			||||||
 | 
					    (cond ((not (file-exists? profile))
 | 
				
			||||||
 | 
					           (raise (condition (&profile-not-found-error
 | 
				
			||||||
 | 
					                              (profile profile)))))
 | 
				
			||||||
 | 
					          ((not (file-exists? generation))
 | 
				
			||||||
 | 
					           (raise (condition (&missing-generation-error
 | 
				
			||||||
 | 
					                              (profile profile)
 | 
				
			||||||
 | 
					                              (generation number)))))
 | 
				
			||||||
 | 
					          (else
 | 
				
			||||||
 | 
					           (switch-symlinks profile generation)
 | 
				
			||||||
 | 
					           current))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(define (switch-to-previous-generation profile)
 | 
				
			||||||
 | 
					  "Atomically switch PROFILE to the previous generation.  Return the former
 | 
				
			||||||
 | 
					generation number and the current one."
 | 
				
			||||||
 | 
					  (let ((previous (previous-generation-number profile)))
 | 
				
			||||||
 | 
					    (values (switch-to-generation profile previous)
 | 
				
			||||||
 | 
					            previous)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(define (roll-back store profile)
 | 
				
			||||||
 | 
					  "Roll back to the previous generation of PROFILE.  Return the number of the
 | 
				
			||||||
 | 
					generation that was current before switching and the new generation number."
 | 
				
			||||||
 | 
					  (let* ((number              (generation-number profile))
 | 
				
			||||||
 | 
					         (previous-number     (previous-generation-number profile number))
 | 
				
			||||||
 | 
					         (previous-generation (generation-file-name profile previous-number)))
 | 
				
			||||||
 | 
					    (cond ((not (file-exists? profile))           ;invalid profile
 | 
				
			||||||
 | 
					           (raise (condition (&profile-not-found-error
 | 
				
			||||||
 | 
					                              (profile profile)))))
 | 
				
			||||||
 | 
					          ((zero? number)                         ;empty profile
 | 
				
			||||||
 | 
					           (values number number))
 | 
				
			||||||
 | 
					          ((or (zero? previous-number)            ;going to emptiness
 | 
				
			||||||
 | 
					               (not (file-exists? previous-generation)))
 | 
				
			||||||
 | 
					           (link-to-empty-profile store previous-generation)
 | 
				
			||||||
 | 
					           (switch-to-previous-generation profile))
 | 
				
			||||||
 | 
					          (else                                   ;anything else
 | 
				
			||||||
 | 
					           (switch-to-previous-generation profile)))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(define (delete-generation store profile number)
 | 
				
			||||||
 | 
					  "Delete generation with NUMBER from PROFILE.  Return the file name of the
 | 
				
			||||||
 | 
					generation that has been deleted, or #f if nothing was done (for instance
 | 
				
			||||||
 | 
					because the NUMBER is zero.)"
 | 
				
			||||||
 | 
					  (define (delete-and-return)
 | 
				
			||||||
 | 
					    (let ((generation (generation-file-name profile number)))
 | 
				
			||||||
 | 
					      (delete-file generation)
 | 
				
			||||||
 | 
					      generation))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  (let* ((current-number      (generation-number profile))
 | 
				
			||||||
 | 
					         (previous-number     (previous-generation-number profile number))
 | 
				
			||||||
 | 
					         (previous-generation (generation-file-name profile previous-number)))
 | 
				
			||||||
 | 
					    (cond ((zero? number) #f)                     ;do not delete generation 0
 | 
				
			||||||
 | 
					          ((and (= number current-number)
 | 
				
			||||||
 | 
					                (not (file-exists? previous-generation)))
 | 
				
			||||||
 | 
					           (link-to-empty-profile store previous-generation)
 | 
				
			||||||
 | 
					           (switch-to-previous-generation profile)
 | 
				
			||||||
 | 
					           (delete-and-return))
 | 
				
			||||||
 | 
					          ((= number current-number)
 | 
				
			||||||
 | 
					           (roll-back store profile)
 | 
				
			||||||
 | 
					           (delete-and-return))
 | 
				
			||||||
 | 
					          (else
 | 
				
			||||||
 | 
					           (delete-and-return)))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
;;; profiles.scm ends here
 | 
					;;; profiles.scm ends here
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -185,8 +185,7 @@ options handled by 'set-build-options-from-command-line', and listed in
 | 
				
			||||||
                     #:max-build-jobs (or (assoc-ref opts 'max-jobs) 1)
 | 
					                     #:max-build-jobs (or (assoc-ref opts 'max-jobs) 1)
 | 
				
			||||||
                     #:fallback? (assoc-ref opts 'fallback?)
 | 
					                     #:fallback? (assoc-ref opts 'fallback?)
 | 
				
			||||||
                     #:use-substitutes? (assoc-ref opts 'substitutes?)
 | 
					                     #:use-substitutes? (assoc-ref opts 'substitutes?)
 | 
				
			||||||
                     #:substitute-urls (or (assoc-ref opts 'substitute-urls)
 | 
					                     #:substitute-urls (assoc-ref opts 'substitute-urls)
 | 
				
			||||||
                                           %default-substitute-urls)
 | 
					 | 
				
			||||||
                     #:use-build-hook? (assoc-ref opts 'build-hook?)
 | 
					                     #:use-build-hook? (assoc-ref opts 'build-hook?)
 | 
				
			||||||
                     #:max-silent-time (assoc-ref opts 'max-silent-time)
 | 
					                     #:max-silent-time (assoc-ref opts 'max-silent-time)
 | 
				
			||||||
                     #:timeout (assoc-ref opts 'timeout)
 | 
					                     #:timeout (assoc-ref opts 'timeout)
 | 
				
			||||||
| 
						 | 
					@ -290,6 +289,9 @@ Build the given PACKAGE-OR-DERIVATION and return their output paths.\n"))
 | 
				
			||||||
  (display (_ "
 | 
					  (display (_ "
 | 
				
			||||||
  -e, --expression=EXPR  build the package or derivation EXPR evaluates to"))
 | 
					  -e, --expression=EXPR  build the package or derivation EXPR evaluates to"))
 | 
				
			||||||
  (display (_ "
 | 
					  (display (_ "
 | 
				
			||||||
 | 
					  -f, --file=FILE        build the package or derivation that the code within
 | 
				
			||||||
 | 
					                         FILE evaluates to"))
 | 
				
			||||||
 | 
					  (display (_ "
 | 
				
			||||||
  -S, --source           build the packages' source derivations"))
 | 
					  -S, --source           build the packages' source derivations"))
 | 
				
			||||||
  (display (_ "
 | 
					  (display (_ "
 | 
				
			||||||
      --sources[=TYPE]   build source derivations; TYPE may optionally be one
 | 
					      --sources[=TYPE]   build source derivations; TYPE may optionally be one
 | 
				
			||||||
| 
						 | 
					@ -359,6 +361,9 @@ must be one of 'package', 'all', or 'transitive'~%")
 | 
				
			||||||
         (option '(#\e "expression") #t #f
 | 
					         (option '(#\e "expression") #t #f
 | 
				
			||||||
                 (lambda (opt name arg result)
 | 
					                 (lambda (opt name arg result)
 | 
				
			||||||
                   (alist-cons 'expression arg result)))
 | 
					                   (alist-cons 'expression arg result)))
 | 
				
			||||||
 | 
					         (option '(#\f "file") #t #f
 | 
				
			||||||
 | 
					                 (lambda (opt name arg result)
 | 
				
			||||||
 | 
					                   (alist-cons 'file arg result)))
 | 
				
			||||||
         (option '(#\n "dry-run") #f #f
 | 
					         (option '(#\n "dry-run") #f #f
 | 
				
			||||||
                 (lambda (opt name arg result)
 | 
					                 (lambda (opt name arg result)
 | 
				
			||||||
                   (alist-cons 'dry-run? #t result)))
 | 
					                   (alist-cons 'dry-run? #t result)))
 | 
				
			||||||
| 
						 | 
					@ -422,13 +427,8 @@ packages."
 | 
				
			||||||
  (define system
 | 
					  (define system
 | 
				
			||||||
    (or (assoc-ref opts 'system) (%current-system)))
 | 
					    (or (assoc-ref opts 'system) (%current-system)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  (map (match-lambda
 | 
					  (define (object->argument obj)
 | 
				
			||||||
        (('argument . (? string? spec))
 | 
					    (match obj
 | 
				
			||||||
         (if (store-path? spec)
 | 
					 | 
				
			||||||
             `(argument . ,spec)
 | 
					 | 
				
			||||||
             `(argument . ,(specification->package spec))))
 | 
					 | 
				
			||||||
        (('expression . str)
 | 
					 | 
				
			||||||
         (match (read/eval str)
 | 
					 | 
				
			||||||
      ((? package? p)
 | 
					      ((? package? p)
 | 
				
			||||||
       `(argument . ,p))
 | 
					       `(argument . ,p))
 | 
				
			||||||
      ((? procedure? proc)
 | 
					      ((? procedure? proc)
 | 
				
			||||||
| 
						 | 
					@ -445,6 +445,16 @@ packages."
 | 
				
			||||||
                      (gexp->derivation "gexp" gexp
 | 
					                      (gexp->derivation "gexp" gexp
 | 
				
			||||||
                                        #:system system)))))
 | 
					                                        #:system system)))))
 | 
				
			||||||
         `(argument . ,drv)))))
 | 
					         `(argument . ,drv)))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  (map (match-lambda
 | 
				
			||||||
 | 
					        (('argument . (? string? spec))
 | 
				
			||||||
 | 
					         (if (store-path? spec)
 | 
				
			||||||
 | 
					             `(argument . ,spec)
 | 
				
			||||||
 | 
					             `(argument . ,(specification->package spec))))
 | 
				
			||||||
 | 
					        (('file . file)
 | 
				
			||||||
 | 
					         (object->argument (load* file (make-user-module '()))))
 | 
				
			||||||
 | 
					        (('expression . str)
 | 
				
			||||||
 | 
					         (object->argument (read/eval str)))
 | 
				
			||||||
        (opt opt))
 | 
					        (opt opt))
 | 
				
			||||||
       opts))
 | 
					       opts))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -501,6 +511,8 @@ arguments with packages that use the specified source."
 | 
				
			||||||
             (urls  (map (cut string-append <> "/log")
 | 
					             (urls  (map (cut string-append <> "/log")
 | 
				
			||||||
                         (if (assoc-ref opts 'substitutes?)
 | 
					                         (if (assoc-ref opts 'substitutes?)
 | 
				
			||||||
                             (or (assoc-ref opts 'substitute-urls)
 | 
					                             (or (assoc-ref opts 'substitute-urls)
 | 
				
			||||||
 | 
					                                 ;; XXX: This does not necessarily match the
 | 
				
			||||||
 | 
					                                 ;; daemon's substitute URLs.
 | 
				
			||||||
                                 %default-substitute-urls)
 | 
					                                 %default-substitute-urls)
 | 
				
			||||||
                             '())))
 | 
					                             '())))
 | 
				
			||||||
             (roots (filter-map (match-lambda
 | 
					             (roots (filter-map (match-lambda
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -125,9 +125,7 @@ taken since we do not import the archives."
 | 
				
			||||||
                                              servers))
 | 
					                                              servers))
 | 
				
			||||||
                       ;; No 'assert-valid-narinfo' on purpose.
 | 
					                       ;; No 'assert-valid-narinfo' on purpose.
 | 
				
			||||||
                       (narinfos -> (fold (lambda (narinfo vhash)
 | 
					                       (narinfos -> (fold (lambda (narinfo vhash)
 | 
				
			||||||
                                            (if narinfo
 | 
					 | 
				
			||||||
                                            (vhash-cons (narinfo-path narinfo) narinfo
 | 
					                                            (vhash-cons (narinfo-path narinfo) narinfo
 | 
				
			||||||
                                                            vhash)
 | 
					 | 
				
			||||||
                                                        vhash))
 | 
					                                                        vhash))
 | 
				
			||||||
                                          vlist-null
 | 
					                                          vlist-null
 | 
				
			||||||
                                          remote)))
 | 
					                                          remote)))
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -25,13 +25,19 @@
 | 
				
			||||||
  #:use-module (guix profiles)
 | 
					  #:use-module (guix profiles)
 | 
				
			||||||
  #:use-module (guix search-paths)
 | 
					  #:use-module (guix search-paths)
 | 
				
			||||||
  #:use-module (guix utils)
 | 
					  #:use-module (guix utils)
 | 
				
			||||||
 | 
					  #:use-module (guix build utils)
 | 
				
			||||||
  #:use-module (guix monads)
 | 
					  #:use-module (guix monads)
 | 
				
			||||||
  #:use-module ((guix gexp) #:select (lower-inputs))
 | 
					  #:use-module ((guix gexp) #:select (lower-inputs))
 | 
				
			||||||
  #:use-module (guix scripts)
 | 
					  #:use-module (guix scripts)
 | 
				
			||||||
  #:use-module (guix scripts build)
 | 
					  #:use-module (guix scripts build)
 | 
				
			||||||
 | 
					  #:use-module (gnu build linux-container)
 | 
				
			||||||
 | 
					  #:use-module (gnu system linux-container)
 | 
				
			||||||
 | 
					  #:use-module (gnu system file-systems)
 | 
				
			||||||
  #:use-module (gnu packages)
 | 
					  #:use-module (gnu packages)
 | 
				
			||||||
 | 
					  #:use-module (gnu packages bash)
 | 
				
			||||||
  #:use-module (ice-9 format)
 | 
					  #:use-module (ice-9 format)
 | 
				
			||||||
  #:use-module (ice-9 match)
 | 
					  #:use-module (ice-9 match)
 | 
				
			||||||
 | 
					  #:use-module (ice-9 rdelim)
 | 
				
			||||||
  #:use-module (srfi srfi-1)
 | 
					  #:use-module (srfi srfi-1)
 | 
				
			||||||
  #:use-module (srfi srfi-11)
 | 
					  #:use-module (srfi srfi-11)
 | 
				
			||||||
  #:use-module (srfi srfi-26)
 | 
					  #:use-module (srfi srfi-26)
 | 
				
			||||||
| 
						 | 
					@ -60,6 +66,12 @@ OUTPUT) tuples."
 | 
				
			||||||
(define %default-shell
 | 
					(define %default-shell
 | 
				
			||||||
  (or (getenv "SHELL") "/bin/sh"))
 | 
					  (or (getenv "SHELL") "/bin/sh"))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(define %network-configuration-files
 | 
				
			||||||
 | 
					  '("/etc/resolv.conf"
 | 
				
			||||||
 | 
					    "/etc/nsswitch.conf"
 | 
				
			||||||
 | 
					    "/etc/services"
 | 
				
			||||||
 | 
					    "/etc/hosts"))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(define (purify-environment)
 | 
					(define (purify-environment)
 | 
				
			||||||
  "Unset almost all environment variables.  A small number of variables such
 | 
					  "Unset almost all environment variables.  A small number of variables such
 | 
				
			||||||
as 'HOME' and 'USER' are left untouched."
 | 
					as 'HOME' and 'USER' are left untouched."
 | 
				
			||||||
| 
						 | 
					@ -124,6 +136,18 @@ COMMAND or an interactive shell in that environment.\n"))
 | 
				
			||||||
      --search-paths     display needed environment variable definitions"))
 | 
					      --search-paths     display needed environment variable definitions"))
 | 
				
			||||||
  (display (_ "
 | 
					  (display (_ "
 | 
				
			||||||
  -s, --system=SYSTEM    attempt to build for SYSTEM--e.g., \"i686-linux\""))
 | 
					  -s, --system=SYSTEM    attempt to build for SYSTEM--e.g., \"i686-linux\""))
 | 
				
			||||||
 | 
					  (display (_ "
 | 
				
			||||||
 | 
					  -C, --container        run command within an isolated container"))
 | 
				
			||||||
 | 
					  (display (_ "
 | 
				
			||||||
 | 
					  -N, --network          allow containers to access the network"))
 | 
				
			||||||
 | 
					  (display (_ "
 | 
				
			||||||
 | 
					      --share=SPEC       for containers, share writable host file system
 | 
				
			||||||
 | 
					                         according to SPEC"))
 | 
				
			||||||
 | 
					  (display (_ "
 | 
				
			||||||
 | 
					      --expose=SPEC      for containers, expose read-only host file system
 | 
				
			||||||
 | 
					                         according to SPEC"))
 | 
				
			||||||
 | 
					  (display (_ "
 | 
				
			||||||
 | 
					      --bootstrap        use bootstrap binaries to build the environment"))
 | 
				
			||||||
  (newline)
 | 
					  (newline)
 | 
				
			||||||
  (show-build-options-help)
 | 
					  (show-build-options-help)
 | 
				
			||||||
  (newline)
 | 
					  (newline)
 | 
				
			||||||
| 
						 | 
					@ -142,6 +166,16 @@ COMMAND or an interactive shell in that environment.\n"))
 | 
				
			||||||
    (max-silent-time . 3600)
 | 
					    (max-silent-time . 3600)
 | 
				
			||||||
    (verbosity . 0)))
 | 
					    (verbosity . 0)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(define (tag-package-arg opts arg)
 | 
				
			||||||
 | 
					  "Return a two-element list with the form (TAG ARG) that tags ARG with either
 | 
				
			||||||
 | 
					'ad-hoc' in OPTS has the 'ad-hoc?' key set to #t, or 'inputs' otherwise."
 | 
				
			||||||
 | 
					  ;; Normally, the transitive inputs to a package are added to an environment,
 | 
				
			||||||
 | 
					  ;; but the ad-hoc? flag changes the meaning of a package argument such that
 | 
				
			||||||
 | 
					  ;; the package itself is added to the environment instead.
 | 
				
			||||||
 | 
					  (if (assoc-ref opts 'ad-hoc?)
 | 
				
			||||||
 | 
					      `(ad-hoc-package ,arg)
 | 
				
			||||||
 | 
					      `(package ,arg)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(define %options
 | 
					(define %options
 | 
				
			||||||
  ;; Specification of the command-line options.
 | 
					  ;; Specification of the command-line options.
 | 
				
			||||||
  (cons* (option '(#\h "help") #f #f
 | 
					  (cons* (option '(#\h "help") #f #f
 | 
				
			||||||
| 
						 | 
					@ -162,10 +196,14 @@ COMMAND or an interactive shell in that environment.\n"))
 | 
				
			||||||
                   (alist-cons 'search-paths #t result)))
 | 
					                   (alist-cons 'search-paths #t result)))
 | 
				
			||||||
         (option '(#\l "load") #t #f
 | 
					         (option '(#\l "load") #t #f
 | 
				
			||||||
                 (lambda (opt name arg result)
 | 
					                 (lambda (opt name arg result)
 | 
				
			||||||
                   (alist-cons 'load arg result)))
 | 
					                   (alist-cons 'load
 | 
				
			||||||
 | 
					                               (tag-package-arg result arg)
 | 
				
			||||||
 | 
					                               result)))
 | 
				
			||||||
         (option '(#\e "expression") #t #f
 | 
					         (option '(#\e "expression") #t #f
 | 
				
			||||||
                 (lambda (opt name arg result)
 | 
					                 (lambda (opt name arg result)
 | 
				
			||||||
                   (alist-cons 'expression arg result)))
 | 
					                   (alist-cons 'expression
 | 
				
			||||||
 | 
					                               (tag-package-arg result arg)
 | 
				
			||||||
 | 
					                               result)))
 | 
				
			||||||
         (option '("ad-hoc") #f #f
 | 
					         (option '("ad-hoc") #f #f
 | 
				
			||||||
                 (lambda (opt name arg result)
 | 
					                 (lambda (opt name arg result)
 | 
				
			||||||
                   (alist-cons 'ad-hoc? #t result)))
 | 
					                   (alist-cons 'ad-hoc? #t result)))
 | 
				
			||||||
| 
						 | 
					@ -176,6 +214,25 @@ COMMAND or an interactive shell in that environment.\n"))
 | 
				
			||||||
                 (lambda (opt name arg result)
 | 
					                 (lambda (opt name arg result)
 | 
				
			||||||
                   (alist-cons 'system arg
 | 
					                   (alist-cons 'system arg
 | 
				
			||||||
                               (alist-delete 'system result eq?))))
 | 
					                               (alist-delete 'system result eq?))))
 | 
				
			||||||
 | 
					         (option '(#\C "container") #f #f
 | 
				
			||||||
 | 
					                 (lambda (opt name arg result)
 | 
				
			||||||
 | 
					                   (alist-cons 'container? #t result)))
 | 
				
			||||||
 | 
					         (option '(#\N "network") #f #f
 | 
				
			||||||
 | 
					                 (lambda (opt name arg result)
 | 
				
			||||||
 | 
					                   (alist-cons 'network? #t result)))
 | 
				
			||||||
 | 
					         (option '("share") #t #f
 | 
				
			||||||
 | 
					                 (lambda (opt name arg result)
 | 
				
			||||||
 | 
					                   (alist-cons 'file-system-mapping
 | 
				
			||||||
 | 
					                               (specification->file-system-mapping arg #t)
 | 
				
			||||||
 | 
					                               result)))
 | 
				
			||||||
 | 
					         (option '("expose") #t #f
 | 
				
			||||||
 | 
					                 (lambda (opt name arg result)
 | 
				
			||||||
 | 
					                   (alist-cons 'file-system-mapping
 | 
				
			||||||
 | 
					                               (specification->file-system-mapping arg #f)
 | 
				
			||||||
 | 
					                               result)))
 | 
				
			||||||
 | 
					         (option '("bootstrap") #f #f
 | 
				
			||||||
 | 
					                 (lambda (opt name arg result)
 | 
				
			||||||
 | 
					                   (alist-cons 'bootstrap? #t result)))
 | 
				
			||||||
         %standard-build-options))
 | 
					         %standard-build-options))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(define (pick-all alist key)
 | 
					(define (pick-all alist key)
 | 
				
			||||||
| 
						 | 
					@ -189,29 +246,34 @@ COMMAND or an interactive shell in that environment.\n"))
 | 
				
			||||||
            (_ memo)))
 | 
					            (_ memo)))
 | 
				
			||||||
        '() alist))
 | 
					        '() alist))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(define (compact lst)
 | 
				
			||||||
 | 
					  "Remove all #f elements from LST."
 | 
				
			||||||
 | 
					  (filter identity lst))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(define (options/resolve-packages opts)
 | 
					(define (options/resolve-packages opts)
 | 
				
			||||||
  "Return OPTS with package specification strings replaced by actual
 | 
					  "Return OPTS with package specification strings replaced by actual
 | 
				
			||||||
packages."
 | 
					packages."
 | 
				
			||||||
 | 
					  (compact
 | 
				
			||||||
   (append-map (match-lambda
 | 
					   (append-map (match-lambda
 | 
				
			||||||
                (('package . (? string? spec))
 | 
					                 (('package mode (? string? spec))
 | 
				
			||||||
                  (let-values (((package output)
 | 
					                  (let-values (((package output)
 | 
				
			||||||
                                (specification->package+output spec)))
 | 
					                                (specification->package+output spec)))
 | 
				
			||||||
                   `((package ,package ,output))))
 | 
					                    (list (list mode package output))))
 | 
				
			||||||
                (('expression . str)
 | 
					                 (('expression mode str)
 | 
				
			||||||
                  ;; Add all the outputs of the package STR evaluates to.
 | 
					                  ;; Add all the outputs of the package STR evaluates to.
 | 
				
			||||||
                  (match (read/eval str)
 | 
					                  (match (read/eval str)
 | 
				
			||||||
                    ((? package? package)
 | 
					                    ((? package? package)
 | 
				
			||||||
                     (map (lambda (output)
 | 
					                     (map (lambda (output)
 | 
				
			||||||
                           `(package ,package ,output))
 | 
					                            (list mode package output))
 | 
				
			||||||
                          (package-outputs package)))))
 | 
					                          (package-outputs package)))))
 | 
				
			||||||
                (('load . file)
 | 
					                 (('load mode file)
 | 
				
			||||||
                  ;; Add all the outputs of the package defined in FILE.
 | 
					                  ;; Add all the outputs of the package defined in FILE.
 | 
				
			||||||
                  (let ((package (load* file (make-user-module '()))))
 | 
					                  (let ((package (load* file (make-user-module '()))))
 | 
				
			||||||
                    (map (lambda (output)
 | 
					                    (map (lambda (output)
 | 
				
			||||||
                          `(package ,package ,output))
 | 
					                           (list mode package output))
 | 
				
			||||||
                         (package-outputs package))))
 | 
					                         (package-outputs package))))
 | 
				
			||||||
                (opt (list opt)))
 | 
					                 (_ '(#f)))
 | 
				
			||||||
              opts))
 | 
					               opts)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(define (build-inputs inputs opts)
 | 
					(define (build-inputs inputs opts)
 | 
				
			||||||
  "Build the derivations in INPUTS, a list of (DERIVATION) or (DERIVATION
 | 
					  "Build the derivations in INPUTS, a list of (DERIVATION) or (DERIVATION
 | 
				
			||||||
| 
						 | 
					@ -231,10 +293,135 @@ OUTPUT) tuples, using the build options in OPTS."
 | 
				
			||||||
               (built-derivations derivations)
 | 
					               (built-derivations derivations)
 | 
				
			||||||
               (return derivations))))))))
 | 
					               (return derivations))))))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(define requisites* (store-lift requisites))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(define (inputs->requisites inputs)
 | 
				
			||||||
 | 
					  "Convert INPUTS, a list of input tuples or store path strings, into a set of
 | 
				
			||||||
 | 
					requisite store items i.e. the union closure of all the inputs."
 | 
				
			||||||
 | 
					  (define (input->requisites input)
 | 
				
			||||||
 | 
					    (requisites*
 | 
				
			||||||
 | 
					     (match input
 | 
				
			||||||
 | 
					       ((drv output)
 | 
				
			||||||
 | 
					        (derivation->output-path drv output))
 | 
				
			||||||
 | 
					       ((drv)
 | 
				
			||||||
 | 
					        (derivation->output-path drv))
 | 
				
			||||||
 | 
					       ((? direct-store-path? path)
 | 
				
			||||||
 | 
					        path))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  (mlet %store-monad ((reqs (sequence %store-monad
 | 
				
			||||||
 | 
					                                      (map input->requisites inputs))))
 | 
				
			||||||
 | 
					    (return (delete-duplicates (concatenate reqs)))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(define exit/status (compose exit status:exit-val))
 | 
				
			||||||
 | 
					(define primitive-exit/status (compose primitive-exit status:exit-val))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(define (launch-environment command inputs paths pure?)
 | 
				
			||||||
 | 
					  "Run COMMAND in a new environment containing INPUTS, using the native search
 | 
				
			||||||
 | 
					paths defined by the list PATHS.  When PURE?, pre-existing environment
 | 
				
			||||||
 | 
					variables are cleared before setting the new ones."
 | 
				
			||||||
 | 
					  (create-environment inputs paths pure?)
 | 
				
			||||||
 | 
					  (apply system* command))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(define* (launch-environment/container #:key command bash user-mappings
 | 
				
			||||||
 | 
					                                       inputs paths network?)
 | 
				
			||||||
 | 
					  "Run COMMAND within a Linux container.  The environment features INPUTS, a
 | 
				
			||||||
 | 
					list of derivations to be shared from the host system.  Environment variables
 | 
				
			||||||
 | 
					are set according to PATHS, a list of native search paths.  The global shell
 | 
				
			||||||
 | 
					is BASH, a file name for a GNU Bash binary in the store.  When NETWORK?,
 | 
				
			||||||
 | 
					access to the host system network is permitted.  USER-MAPPINGS, a list of file
 | 
				
			||||||
 | 
					system mappings, contains the user-specified host file systems to mount inside
 | 
				
			||||||
 | 
					the container."
 | 
				
			||||||
 | 
					  (mlet %store-monad ((reqs (inputs->requisites
 | 
				
			||||||
 | 
					                             (cons (direct-store-path bash) inputs))))
 | 
				
			||||||
 | 
					    (return
 | 
				
			||||||
 | 
					     (let* ((cwd (getcwd))
 | 
				
			||||||
 | 
					            ;; Bind-mount all requisite store items, user-specified mappings,
 | 
				
			||||||
 | 
					            ;; /bin/sh, the current working directory, and possibly networking
 | 
				
			||||||
 | 
					            ;; configuration files within the container.
 | 
				
			||||||
 | 
					            (mappings
 | 
				
			||||||
 | 
					             (append user-mappings
 | 
				
			||||||
 | 
					                     ;; Current working directory.
 | 
				
			||||||
 | 
					                     (list (file-system-mapping
 | 
				
			||||||
 | 
					                            (source cwd)
 | 
				
			||||||
 | 
					                            (target cwd)
 | 
				
			||||||
 | 
					                            (writable? #t)))
 | 
				
			||||||
 | 
					                     ;; When in Rome, do as Nix build.cc does: Automagically
 | 
				
			||||||
 | 
					                     ;; map common network configuration files.
 | 
				
			||||||
 | 
					                     (if network?
 | 
				
			||||||
 | 
					                         (filter-map (lambda (file)
 | 
				
			||||||
 | 
					                                       (and (file-exists? file)
 | 
				
			||||||
 | 
					                                            (file-system-mapping
 | 
				
			||||||
 | 
					                                             (source file)
 | 
				
			||||||
 | 
					                                             (target file)
 | 
				
			||||||
 | 
					                                             (writable? #f))))
 | 
				
			||||||
 | 
					                                     %network-configuration-files)
 | 
				
			||||||
 | 
					                         '())
 | 
				
			||||||
 | 
					                     ;; Mappings for the union closure of all inputs.
 | 
				
			||||||
 | 
					                     (map (lambda (dir)
 | 
				
			||||||
 | 
					                            (file-system-mapping
 | 
				
			||||||
 | 
					                             (source dir)
 | 
				
			||||||
 | 
					                             (target dir)
 | 
				
			||||||
 | 
					                             (writable? #f)))
 | 
				
			||||||
 | 
					                          reqs)))
 | 
				
			||||||
 | 
					            (file-systems (append %container-file-systems
 | 
				
			||||||
 | 
					                                  (map mapping->file-system mappings))))
 | 
				
			||||||
 | 
					       (exit/status
 | 
				
			||||||
 | 
					        (call-with-container (map file-system->spec file-systems)
 | 
				
			||||||
 | 
					          (lambda ()
 | 
				
			||||||
 | 
					            ;; Setup global shell.
 | 
				
			||||||
 | 
					            (mkdir-p "/bin")
 | 
				
			||||||
 | 
					            (symlink bash "/bin/sh")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            ;; Setup directory for temporary files.
 | 
				
			||||||
 | 
					            (mkdir-p "/tmp")
 | 
				
			||||||
 | 
					            (for-each (lambda (var)
 | 
				
			||||||
 | 
					                        (setenv var "/tmp"))
 | 
				
			||||||
 | 
					                      ;; The same variables as in Nix's 'build.cc'.
 | 
				
			||||||
 | 
					                      '("TMPDIR" "TEMPDIR" "TMP" "TEMP"))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            ;; From Nix build.cc:
 | 
				
			||||||
 | 
					            ;;
 | 
				
			||||||
 | 
					            ;; Set HOME to a non-existing path to prevent certain
 | 
				
			||||||
 | 
					            ;; programs from using /etc/passwd (or NIS, or whatever)
 | 
				
			||||||
 | 
					            ;; to locate the home directory (for example, wget looks
 | 
				
			||||||
 | 
					            ;; for ~/.wgetrc).  I.e., these tools use /etc/passwd if
 | 
				
			||||||
 | 
					            ;; HOME is not set, but they will just assume that the
 | 
				
			||||||
 | 
					            ;; settings file they are looking for does not exist if
 | 
				
			||||||
 | 
					            ;; HOME is set but points to some non-existing path.
 | 
				
			||||||
 | 
					            (setenv "HOME" "/homeless-shelter")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            ;; For convenience, start in the user's current working
 | 
				
			||||||
 | 
					            ;; directory rather than the root directory.
 | 
				
			||||||
 | 
					            (chdir cwd)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            (primitive-exit/status
 | 
				
			||||||
 | 
					             ;; A container's environment is already purified, so no need to
 | 
				
			||||||
 | 
					             ;; request it be purified again.
 | 
				
			||||||
 | 
					             (launch-environment command inputs paths #f)))
 | 
				
			||||||
 | 
					          #:namespaces (if network?
 | 
				
			||||||
 | 
					                           (delq 'net %namespaces) ; share host network
 | 
				
			||||||
 | 
					                           %namespaces)))))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(define (environment-bash container? bootstrap? system)
 | 
				
			||||||
 | 
					  "Return a monadic value in the store monad for the version of GNU Bash
 | 
				
			||||||
 | 
					needed in the environment for SYSTEM, if any.  If CONTAINER? is #f, return #f.
 | 
				
			||||||
 | 
					If CONTAINER? and BOOTSTRAP?, return the store path for the bootstrap Bash.
 | 
				
			||||||
 | 
					Otherwise, return the derivation for the Bash package."
 | 
				
			||||||
 | 
					  (with-monad %store-monad
 | 
				
			||||||
 | 
					    (cond
 | 
				
			||||||
 | 
					     ((and container? (not bootstrap?))
 | 
				
			||||||
 | 
					      (package->derivation bash))
 | 
				
			||||||
 | 
					     ;; Use the bootstrap Bash instead.
 | 
				
			||||||
 | 
					     ((and container? bootstrap?)
 | 
				
			||||||
 | 
					      (interned-file
 | 
				
			||||||
 | 
					       (search-bootstrap-binary "bash" system)))
 | 
				
			||||||
 | 
					     (else
 | 
				
			||||||
 | 
					      (return #f)))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(define (parse-args args)
 | 
					(define (parse-args args)
 | 
				
			||||||
  "Parse the list of command line arguments ARGS."
 | 
					  "Parse the list of command line arguments ARGS."
 | 
				
			||||||
  (define (handle-argument arg result)
 | 
					  (define (handle-argument arg result)
 | 
				
			||||||
    (alist-cons 'package arg result))
 | 
					    (alist-cons 'package (tag-package-arg result arg) result))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  ;; The '--' token is used to separate the command to run from the rest of
 | 
					  ;; The '--' token is used to separate the command to run from the rest of
 | 
				
			||||||
  ;; the operands.
 | 
					  ;; the operands.
 | 
				
			||||||
| 
						 | 
					@ -250,18 +437,21 @@ OUTPUT) tuples, using the build options in OPTS."
 | 
				
			||||||
  (with-error-handling
 | 
					  (with-error-handling
 | 
				
			||||||
    (let* ((opts       (parse-args args))
 | 
					    (let* ((opts       (parse-args args))
 | 
				
			||||||
           (pure?      (assoc-ref opts 'pure))
 | 
					           (pure?      (assoc-ref opts 'pure))
 | 
				
			||||||
           (ad-hoc?  (assoc-ref opts 'ad-hoc?))
 | 
					           (container? (assoc-ref opts 'container?))
 | 
				
			||||||
 | 
					           (network?   (assoc-ref opts 'network?))
 | 
				
			||||||
 | 
					           (bootstrap? (assoc-ref opts 'bootstrap?))
 | 
				
			||||||
 | 
					           (system     (assoc-ref opts 'system))
 | 
				
			||||||
           (command    (assoc-ref opts 'exec))
 | 
					           (command    (assoc-ref opts 'exec))
 | 
				
			||||||
           (packages (pick-all (options/resolve-packages opts) 'package))
 | 
					           (packages   (options/resolve-packages opts))
 | 
				
			||||||
           (inputs   (if ad-hoc?
 | 
					           (mappings   (pick-all opts 'file-system-mapping))
 | 
				
			||||||
 | 
					           (inputs     (delete-duplicates
 | 
				
			||||||
                        (append-map (match-lambda
 | 
					                        (append-map (match-lambda
 | 
				
			||||||
                                       ((package output)
 | 
					                                      (('ad-hoc-package package output)
 | 
				
			||||||
                                       (package+propagated-inputs package
 | 
					                                       (package+propagated-inputs package
 | 
				
			||||||
                                                                   output)))
 | 
					                                                                  output))
 | 
				
			||||||
                                     packages)
 | 
					                                      (('package package output)
 | 
				
			||||||
                         (append-map (compose bag-transitive-inputs
 | 
					                                       (bag-transitive-inputs
 | 
				
			||||||
                                              package->bag
 | 
					                                        (package->bag package))))
 | 
				
			||||||
                                              first)
 | 
					 | 
				
			||||||
                                    packages)))
 | 
					                                    packages)))
 | 
				
			||||||
           (paths      (delete-duplicates
 | 
					           (paths      (delete-duplicates
 | 
				
			||||||
                        (cons $PATH
 | 
					                        (cons $PATH
 | 
				
			||||||
| 
						 | 
					@ -274,26 +464,45 @@ OUTPUT) tuples, using the build options in OPTS."
 | 
				
			||||||
                        eq?)))
 | 
					                        eq?)))
 | 
				
			||||||
      (with-store store
 | 
					      (with-store store
 | 
				
			||||||
        (run-with-store store
 | 
					        (run-with-store store
 | 
				
			||||||
          (mlet %store-monad ((inputs (lower-inputs
 | 
					          (mlet* %store-monad ((inputs (lower-inputs
 | 
				
			||||||
                                        (map (match-lambda
 | 
					                                        (map (match-lambda
 | 
				
			||||||
                                              ((label item)
 | 
					                                              ((label item)
 | 
				
			||||||
                                               (list item))
 | 
					                                               (list item))
 | 
				
			||||||
                                              ((label item output)
 | 
					                                              ((label item output)
 | 
				
			||||||
                                               (list item output)))
 | 
					                                               (list item output)))
 | 
				
			||||||
                                             inputs)
 | 
					                                             inputs)
 | 
				
			||||||
                                       #:system (assoc-ref opts 'system))))
 | 
					                                        #:system system))
 | 
				
			||||||
 | 
					                               ;; Containers need a Bourne shell at /bin/sh.
 | 
				
			||||||
 | 
					                               (bash (environment-bash container?
 | 
				
			||||||
 | 
					                                                       bootstrap?
 | 
				
			||||||
 | 
					                                                       system)))
 | 
				
			||||||
            (mbegin %store-monad
 | 
					            (mbegin %store-monad
 | 
				
			||||||
              ;; First build INPUTS.  This is necessary even for
 | 
					              ;; First build the inputs.  This is necessary even for
 | 
				
			||||||
              ;; --search-paths.
 | 
					              ;; --search-paths.  Additionally, we might need to build bash
 | 
				
			||||||
              (build-inputs inputs opts)
 | 
					              ;; for a container.
 | 
				
			||||||
              (cond ((assoc-ref opts 'dry-run?)
 | 
					              (build-inputs (if (derivation? bash)
 | 
				
			||||||
 | 
					                                `((,bash "out") ,@inputs)
 | 
				
			||||||
 | 
					                                inputs)
 | 
				
			||||||
 | 
					                            opts)
 | 
				
			||||||
 | 
					              (cond
 | 
				
			||||||
 | 
					               ((assoc-ref opts 'dry-run?)
 | 
				
			||||||
                (return #t))
 | 
					                (return #t))
 | 
				
			||||||
               ((assoc-ref opts 'search-paths)
 | 
					               ((assoc-ref opts 'search-paths)
 | 
				
			||||||
                (show-search-paths inputs paths pure?)
 | 
					                (show-search-paths inputs paths pure?)
 | 
				
			||||||
                (return #t))
 | 
					                (return #t))
 | 
				
			||||||
 | 
					               (container?
 | 
				
			||||||
 | 
					                (let ((bash-binary
 | 
				
			||||||
 | 
					                       (if bootstrap?
 | 
				
			||||||
 | 
					                           bash
 | 
				
			||||||
 | 
					                           (string-append (derivation->output-path bash)
 | 
				
			||||||
 | 
					                                          "/bin/sh"))))
 | 
				
			||||||
 | 
					                  (launch-environment/container #:command command
 | 
				
			||||||
 | 
					                                                #:bash bash-binary
 | 
				
			||||||
 | 
					                                                #:user-mappings mappings
 | 
				
			||||||
 | 
					                                                #:inputs inputs
 | 
				
			||||||
 | 
					                                                #:paths paths
 | 
				
			||||||
 | 
					                                                #:network? network?)))
 | 
				
			||||||
               (else
 | 
					               (else
 | 
				
			||||||
                     (create-environment inputs paths pure?)
 | 
					 | 
				
			||||||
                (return
 | 
					                (return
 | 
				
			||||||
                      (exit
 | 
					                 (exit/status
 | 
				
			||||||
                       (status:exit-val
 | 
					                  (launch-environment command inputs paths pure?))))))))))))
 | 
				
			||||||
                        (apply system* command)))))))))))))
 | 
					 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -48,11 +48,7 @@
 | 
				
			||||||
  #:use-module (gnu packages base)
 | 
					  #:use-module (gnu packages base)
 | 
				
			||||||
  #:use-module (gnu packages guile)
 | 
					  #:use-module (gnu packages guile)
 | 
				
			||||||
  #:use-module ((gnu packages bootstrap) #:select (%bootstrap-guile))
 | 
					  #:use-module ((gnu packages bootstrap) #:select (%bootstrap-guile))
 | 
				
			||||||
  #:export (switch-to-generation
 | 
					  #:export (delete-generations
 | 
				
			||||||
            switch-to-previous-generation
 | 
					 | 
				
			||||||
            roll-back
 | 
					 | 
				
			||||||
            delete-generation
 | 
					 | 
				
			||||||
            delete-generations
 | 
					 | 
				
			||||||
            display-search-paths
 | 
					            display-search-paths
 | 
				
			||||||
            guix-package))
 | 
					            guix-package))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -100,149 +96,12 @@ indirectly, or PROFILE."
 | 
				
			||||||
      %user-profile-directory
 | 
					      %user-profile-directory
 | 
				
			||||||
      profile))
 | 
					      profile))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(define (link-to-empty-profile store generation)
 | 
					 | 
				
			||||||
  "Link GENERATION, a string, to the empty profile."
 | 
					 | 
				
			||||||
  (let* ((drv  (run-with-store store
 | 
					 | 
				
			||||||
                 (profile-derivation (manifest '()))))
 | 
					 | 
				
			||||||
         (prof (derivation->output-path drv "out")))
 | 
					 | 
				
			||||||
    (when (not (build-derivations store (list drv)))
 | 
					 | 
				
			||||||
          (leave (_ "failed to build the empty profile~%")))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    (switch-symlinks generation prof)))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
(define (switch-to-generation profile number)
 | 
					 | 
				
			||||||
  "Atomically switch PROFILE to the generation NUMBER."
 | 
					 | 
				
			||||||
  (let ((current    (generation-number profile))
 | 
					 | 
				
			||||||
        (generation (generation-file-name profile number)))
 | 
					 | 
				
			||||||
    (cond ((not (file-exists? profile))
 | 
					 | 
				
			||||||
           (raise (condition (&profile-not-found-error
 | 
					 | 
				
			||||||
                              (profile profile)))))
 | 
					 | 
				
			||||||
          ((not (file-exists? generation))
 | 
					 | 
				
			||||||
           (raise (condition (&missing-generation-error
 | 
					 | 
				
			||||||
                              (profile profile)
 | 
					 | 
				
			||||||
                              (generation number)))))
 | 
					 | 
				
			||||||
          (else
 | 
					 | 
				
			||||||
           (format #t (_ "switching from generation ~a to ~a~%")
 | 
					 | 
				
			||||||
                   current number)
 | 
					 | 
				
			||||||
           (switch-symlinks profile generation)))))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
(define (switch-to-previous-generation profile)
 | 
					 | 
				
			||||||
  "Atomically switch PROFILE to the previous generation."
 | 
					 | 
				
			||||||
  (switch-to-generation profile
 | 
					 | 
				
			||||||
                        (previous-generation-number profile)))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
(define (roll-back store profile)
 | 
					 | 
				
			||||||
  "Roll back to the previous generation of PROFILE."
 | 
					 | 
				
			||||||
  (let* ((number              (generation-number profile))
 | 
					 | 
				
			||||||
         (previous-number     (previous-generation-number profile number))
 | 
					 | 
				
			||||||
         (previous-generation (generation-file-name profile previous-number)))
 | 
					 | 
				
			||||||
    (cond ((not (file-exists? profile))                 ; invalid profile
 | 
					 | 
				
			||||||
           (raise (condition (&profile-not-found-error
 | 
					 | 
				
			||||||
                              (profile profile)))))
 | 
					 | 
				
			||||||
          ((zero? number)                               ; empty profile
 | 
					 | 
				
			||||||
           (format (current-error-port)
 | 
					 | 
				
			||||||
                   (_ "nothing to do: already at the empty profile~%")))
 | 
					 | 
				
			||||||
          ((or (zero? previous-number)                  ; going to emptiness
 | 
					 | 
				
			||||||
               (not (file-exists? previous-generation)))
 | 
					 | 
				
			||||||
           (link-to-empty-profile store previous-generation)
 | 
					 | 
				
			||||||
           (switch-to-previous-generation profile))
 | 
					 | 
				
			||||||
          (else
 | 
					 | 
				
			||||||
           (switch-to-previous-generation profile)))))  ; anything else
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
(define (delete-generation store profile number)
 | 
					 | 
				
			||||||
  "Delete generation with NUMBER from PROFILE."
 | 
					 | 
				
			||||||
  (define (display-and-delete)
 | 
					 | 
				
			||||||
    (let ((generation (generation-file-name profile number)))
 | 
					 | 
				
			||||||
      (format #t (_ "deleting ~a~%") generation)
 | 
					 | 
				
			||||||
      (delete-file generation)))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  (let* ((current-number      (generation-number profile))
 | 
					 | 
				
			||||||
         (previous-number     (previous-generation-number profile number))
 | 
					 | 
				
			||||||
         (previous-generation (generation-file-name profile previous-number)))
 | 
					 | 
				
			||||||
    (cond ((zero? number))              ; do not delete generation 0
 | 
					 | 
				
			||||||
          ((and (= number current-number)
 | 
					 | 
				
			||||||
                (not (file-exists? previous-generation)))
 | 
					 | 
				
			||||||
           (link-to-empty-profile store previous-generation)
 | 
					 | 
				
			||||||
           (switch-to-previous-generation profile)
 | 
					 | 
				
			||||||
           (display-and-delete))
 | 
					 | 
				
			||||||
          ((= number current-number)
 | 
					 | 
				
			||||||
           (roll-back store profile)
 | 
					 | 
				
			||||||
           (display-and-delete))
 | 
					 | 
				
			||||||
          (else
 | 
					 | 
				
			||||||
           (display-and-delete)))))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
(define (delete-generations store profile generations)
 | 
					(define (delete-generations store profile generations)
 | 
				
			||||||
  "Delete GENERATIONS from PROFILE.
 | 
					  "Delete GENERATIONS from PROFILE.
 | 
				
			||||||
GENERATIONS is a list of generation numbers."
 | 
					GENERATIONS is a list of generation numbers."
 | 
				
			||||||
  (for-each (cut delete-generation store profile <>)
 | 
					  (for-each (cut delete-generation* store profile <>)
 | 
				
			||||||
            generations))
 | 
					            generations))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(define* (matching-generations str #:optional (profile %current-profile)
 | 
					 | 
				
			||||||
                               #:key (duration-relation <=))
 | 
					 | 
				
			||||||
  "Return the list of available generations matching a pattern in STR.  See
 | 
					 | 
				
			||||||
'string->generations' and 'string->duration' for the list of valid patterns.
 | 
					 | 
				
			||||||
When STR is a duration pattern, return all the generations whose ctime has
 | 
					 | 
				
			||||||
DURATION-RELATION with the current time."
 | 
					 | 
				
			||||||
  (define (valid-generations lst)
 | 
					 | 
				
			||||||
    (define (valid-generation? n)
 | 
					 | 
				
			||||||
      (any (cut = n <>) (generation-numbers profile)))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    (fold-right (lambda (x acc)
 | 
					 | 
				
			||||||
                  (if (valid-generation? x)
 | 
					 | 
				
			||||||
                      (cons x acc)
 | 
					 | 
				
			||||||
                      acc))
 | 
					 | 
				
			||||||
                '()
 | 
					 | 
				
			||||||
                lst))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  (define (filter-generations generations)
 | 
					 | 
				
			||||||
    (match generations
 | 
					 | 
				
			||||||
      (() '())
 | 
					 | 
				
			||||||
      (('>= n)
 | 
					 | 
				
			||||||
       (drop-while (cut > n <>)
 | 
					 | 
				
			||||||
                   (generation-numbers profile)))
 | 
					 | 
				
			||||||
      (('<= n)
 | 
					 | 
				
			||||||
       (valid-generations (iota n 1)))
 | 
					 | 
				
			||||||
      ((lst ..1)
 | 
					 | 
				
			||||||
       (valid-generations lst))
 | 
					 | 
				
			||||||
      (_ #f)))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  (define (filter-by-duration duration)
 | 
					 | 
				
			||||||
    (define (time-at-midnight time)
 | 
					 | 
				
			||||||
      ;; Return TIME at midnight by setting nanoseconds, seconds, minutes, and
 | 
					 | 
				
			||||||
      ;; hours to zeros.
 | 
					 | 
				
			||||||
      (let ((d (time-utc->date time)))
 | 
					 | 
				
			||||||
         (date->time-utc
 | 
					 | 
				
			||||||
          (make-date 0 0 0 0
 | 
					 | 
				
			||||||
                     (date-day d) (date-month d)
 | 
					 | 
				
			||||||
                     (date-year d) (date-zone-offset d)))))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    (define generation-ctime-alist
 | 
					 | 
				
			||||||
      (map (lambda (number)
 | 
					 | 
				
			||||||
             (cons number
 | 
					 | 
				
			||||||
                   (time-second
 | 
					 | 
				
			||||||
                    (time-at-midnight
 | 
					 | 
				
			||||||
                     (generation-time profile number)))))
 | 
					 | 
				
			||||||
           (generation-numbers profile)))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    (match duration
 | 
					 | 
				
			||||||
      (#f #f)
 | 
					 | 
				
			||||||
      (res
 | 
					 | 
				
			||||||
       (let ((s (time-second
 | 
					 | 
				
			||||||
                 (subtract-duration (time-at-midnight (current-time))
 | 
					 | 
				
			||||||
                                    duration))))
 | 
					 | 
				
			||||||
         (delete #f (map (lambda (x)
 | 
					 | 
				
			||||||
                           (and (duration-relation s (cdr x))
 | 
					 | 
				
			||||||
                                (first x)))
 | 
					 | 
				
			||||||
                         generation-ctime-alist))))))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  (cond ((string->generations str)
 | 
					 | 
				
			||||||
         =>
 | 
					 | 
				
			||||||
         filter-generations)
 | 
					 | 
				
			||||||
        ((string->duration str)
 | 
					 | 
				
			||||||
         =>
 | 
					 | 
				
			||||||
         filter-by-duration)
 | 
					 | 
				
			||||||
        (else #f)))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
(define (delete-matching-generations store profile pattern)
 | 
					(define (delete-matching-generations store profile pattern)
 | 
				
			||||||
  "Delete from PROFILE all the generations matching PATTERN.  PATTERN must be
 | 
					  "Delete from PROFILE all the generations matching PATTERN.  PATTERN must be
 | 
				
			||||||
a string denoting a set of generations: the empty list means \"all generations
 | 
					a string denoting a set of generations: the empty list means \"all generations
 | 
				
			||||||
| 
						 | 
					@ -576,14 +435,14 @@ return the new list of manifest entries."
 | 
				
			||||||
  (define upgrade-regexps
 | 
					  (define upgrade-regexps
 | 
				
			||||||
    (filter-map (match-lambda
 | 
					    (filter-map (match-lambda
 | 
				
			||||||
                 (('upgrade . regexp)
 | 
					                 (('upgrade . regexp)
 | 
				
			||||||
                  (make-regexp (or regexp "")))
 | 
					                  (make-regexp* (or regexp "")))
 | 
				
			||||||
                 (_ #f))
 | 
					                 (_ #f))
 | 
				
			||||||
                opts))
 | 
					                opts))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  (define do-not-upgrade-regexps
 | 
					  (define do-not-upgrade-regexps
 | 
				
			||||||
    (filter-map (match-lambda
 | 
					    (filter-map (match-lambda
 | 
				
			||||||
                 (('do-not-upgrade . regexp)
 | 
					                 (('do-not-upgrade . regexp)
 | 
				
			||||||
                  (make-regexp regexp))
 | 
					                  (make-regexp* regexp))
 | 
				
			||||||
                 (_ #f))
 | 
					                 (_ #f))
 | 
				
			||||||
                opts))
 | 
					                opts))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -678,34 +537,6 @@ doesn't need it."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  (add-indirect-root store absolute))
 | 
					  (add-indirect-root store absolute))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(define (readlink* file)
 | 
					 | 
				
			||||||
  "Call 'readlink' until the result is not a symlink."
 | 
					 | 
				
			||||||
  (define %max-symlink-depth 50)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  (let loop ((file  file)
 | 
					 | 
				
			||||||
             (depth 0))
 | 
					 | 
				
			||||||
    (define (absolute target)
 | 
					 | 
				
			||||||
      (if (absolute-file-name? target)
 | 
					 | 
				
			||||||
          target
 | 
					 | 
				
			||||||
          (string-append (dirname file) "/" target)))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    (if (>= depth %max-symlink-depth)
 | 
					 | 
				
			||||||
        file
 | 
					 | 
				
			||||||
        (call-with-values
 | 
					 | 
				
			||||||
            (lambda ()
 | 
					 | 
				
			||||||
              (catch 'system-error
 | 
					 | 
				
			||||||
                (lambda ()
 | 
					 | 
				
			||||||
                  (values #t (readlink file)))
 | 
					 | 
				
			||||||
                (lambda args
 | 
					 | 
				
			||||||
                  (let ((errno (system-error-errno args)))
 | 
					 | 
				
			||||||
                    (if (or (= errno EINVAL))
 | 
					 | 
				
			||||||
                        (values #f file)
 | 
					 | 
				
			||||||
                        (apply throw args))))))
 | 
					 | 
				
			||||||
          (lambda (success? target)
 | 
					 | 
				
			||||||
            (if success?
 | 
					 | 
				
			||||||
                (loop (absolute target) (+ depth 1))
 | 
					 | 
				
			||||||
                file))))))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
;;;
 | 
					;;;
 | 
				
			||||||
;;; Entry point.
 | 
					;;; Entry point.
 | 
				
			||||||
| 
						 | 
					@ -819,7 +650,7 @@ more information.~%"))
 | 
				
			||||||
    ;; First roll back if asked to.
 | 
					    ;; First roll back if asked to.
 | 
				
			||||||
    (cond ((and (assoc-ref opts 'roll-back?)
 | 
					    (cond ((and (assoc-ref opts 'roll-back?)
 | 
				
			||||||
                (not dry-run?))
 | 
					                (not dry-run?))
 | 
				
			||||||
           (roll-back (%store) profile)
 | 
					           (roll-back* (%store) profile)
 | 
				
			||||||
           (process-actions (alist-delete 'roll-back? opts)))
 | 
					           (process-actions (alist-delete 'roll-back? opts)))
 | 
				
			||||||
          ((and (assoc-ref opts 'switch-generation)
 | 
					          ((and (assoc-ref opts 'switch-generation)
 | 
				
			||||||
                (not dry-run?))
 | 
					                (not dry-run?))
 | 
				
			||||||
| 
						 | 
					@ -833,7 +664,7 @@ more information.~%"))
 | 
				
			||||||
                                      (relative-generation profile number))
 | 
					                                      (relative-generation profile number))
 | 
				
			||||||
                                     (else number)))))
 | 
					                                     (else number)))))
 | 
				
			||||||
                 (if number
 | 
					                 (if number
 | 
				
			||||||
                     (switch-to-generation profile number)
 | 
					                     (switch-to-generation* profile number)
 | 
				
			||||||
                     (leave (_ "cannot switch to generation '~a'~%")
 | 
					                     (leave (_ "cannot switch to generation '~a'~%")
 | 
				
			||||||
                            pattern)))
 | 
					                            pattern)))
 | 
				
			||||||
               (process-actions (alist-delete 'switch-generation opts)))
 | 
					               (process-actions (alist-delete 'switch-generation opts)))
 | 
				
			||||||
| 
						 | 
					@ -883,25 +714,8 @@ more information.~%"))
 | 
				
			||||||
        (('list-generations pattern)
 | 
					        (('list-generations pattern)
 | 
				
			||||||
         (define (list-generation number)
 | 
					         (define (list-generation number)
 | 
				
			||||||
           (unless (zero? number)
 | 
					           (unless (zero? number)
 | 
				
			||||||
             (let ((header (format #f (_ "Generation ~a\t~a") number
 | 
					             (display-generation profile number)
 | 
				
			||||||
                                   (date->string
 | 
					             (display-profile-content profile number)
 | 
				
			||||||
                                    (time-utc->date
 | 
					 | 
				
			||||||
                                     (generation-time profile number))
 | 
					 | 
				
			||||||
                                    "~b ~d ~Y ~T")))
 | 
					 | 
				
			||||||
                   (current (generation-number profile)))
 | 
					 | 
				
			||||||
               (if (= number current)
 | 
					 | 
				
			||||||
                   (format #t (_ "~a\t(current)~%") header)
 | 
					 | 
				
			||||||
                   (format #t "~a~%" header)))
 | 
					 | 
				
			||||||
             (for-each (match-lambda
 | 
					 | 
				
			||||||
                        (($ <manifest-entry> name version output location _)
 | 
					 | 
				
			||||||
                         (format #t "  ~a\t~a\t~a\t~a~%"
 | 
					 | 
				
			||||||
                                 name version output location)))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                       ;; Show most recently installed packages last.
 | 
					 | 
				
			||||||
                       (reverse
 | 
					 | 
				
			||||||
                        (manifest-entries
 | 
					 | 
				
			||||||
                         (profile-manifest
 | 
					 | 
				
			||||||
                          (generation-file-name profile number)))))
 | 
					 | 
				
			||||||
             (newline)))
 | 
					             (newline)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
         (cond ((not (file-exists? profile)) ; XXX: race condition
 | 
					         (cond ((not (file-exists? profile)) ; XXX: race condition
 | 
				
			||||||
| 
						 | 
					@ -922,7 +736,7 @@ more information.~%"))
 | 
				
			||||||
         #t)
 | 
					         #t)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        (('list-installed regexp)
 | 
					        (('list-installed regexp)
 | 
				
			||||||
         (let* ((regexp    (and regexp (make-regexp regexp)))
 | 
					         (let* ((regexp    (and regexp (make-regexp* regexp)))
 | 
				
			||||||
                (manifest  (profile-manifest profile))
 | 
					                (manifest  (profile-manifest profile))
 | 
				
			||||||
                (installed (manifest-entries manifest)))
 | 
					                (installed (manifest-entries manifest)))
 | 
				
			||||||
           (leave-on-EPIPE
 | 
					           (leave-on-EPIPE
 | 
				
			||||||
| 
						 | 
					@ -938,7 +752,7 @@ more information.~%"))
 | 
				
			||||||
           #t))
 | 
					           #t))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        (('list-available regexp)
 | 
					        (('list-available regexp)
 | 
				
			||||||
         (let* ((regexp    (and regexp (make-regexp regexp)))
 | 
					         (let* ((regexp    (and regexp (make-regexp* regexp)))
 | 
				
			||||||
                (available (fold-packages
 | 
					                (available (fold-packages
 | 
				
			||||||
                            (lambda (p r)
 | 
					                            (lambda (p r)
 | 
				
			||||||
                              (let ((n (package-name p)))
 | 
					                              (let ((n (package-name p)))
 | 
				
			||||||
| 
						 | 
					@ -964,7 +778,7 @@ more information.~%"))
 | 
				
			||||||
           #t))
 | 
					           #t))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        (('search regexp)
 | 
					        (('search regexp)
 | 
				
			||||||
         (let ((regexp (make-regexp regexp regexp/icase)))
 | 
					         (let ((regexp (make-regexp* regexp regexp/icase)))
 | 
				
			||||||
           (leave-on-EPIPE
 | 
					           (leave-on-EPIPE
 | 
				
			||||||
            (for-each (cute package->recutils <> (current-output-port))
 | 
					            (for-each (cute package->recutils <> (current-output-port))
 | 
				
			||||||
                      (find-packages-by-description regexp)))
 | 
					                      (find-packages-by-description regexp)))
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -18,6 +18,7 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(define-module (guix scripts pull)
 | 
					(define-module (guix scripts pull)
 | 
				
			||||||
  #:use-module (guix ui)
 | 
					  #:use-module (guix ui)
 | 
				
			||||||
 | 
					  #:use-module (guix utils)
 | 
				
			||||||
  #:use-module (guix scripts)
 | 
					  #:use-module (guix scripts)
 | 
				
			||||||
  #:use-module (guix store)
 | 
					  #:use-module (guix store)
 | 
				
			||||||
  #:use-module (guix config)
 | 
					  #:use-module (guix config)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2,6 +2,7 @@
 | 
				
			||||||
;;; Copyright © 2013, 2014, 2015 Ludovic Courtès <ludo@gnu.org>
 | 
					;;; Copyright © 2013, 2014, 2015 Ludovic Courtès <ludo@gnu.org>
 | 
				
			||||||
;;; Copyright © 2013 Nikita Karetnikov <nikita@karetnikov.org>
 | 
					;;; Copyright © 2013 Nikita Karetnikov <nikita@karetnikov.org>
 | 
				
			||||||
;;; Copyright © 2014 Eric Bavier <bavier@member.fsf.org>
 | 
					;;; Copyright © 2014 Eric Bavier <bavier@member.fsf.org>
 | 
				
			||||||
 | 
					;;; Copyright © 2015 Alex Kost <alezost@gmail.com>
 | 
				
			||||||
;;;
 | 
					;;;
 | 
				
			||||||
;;; This file is part of GNU Guix.
 | 
					;;; This file is part of GNU Guix.
 | 
				
			||||||
;;;
 | 
					;;;
 | 
				
			||||||
| 
						 | 
					@ -68,7 +69,13 @@
 | 
				
			||||||
                            arg)))))
 | 
					                            arg)))))
 | 
				
			||||||
        (option '(#\t "type") #t #f
 | 
					        (option '(#\t "type") #t #f
 | 
				
			||||||
                (lambda (opt name arg result)
 | 
					                (lambda (opt name arg result)
 | 
				
			||||||
                  (alist-cons 'updater (string->symbol arg) result)))
 | 
					                  (let* ((not-comma (char-set-complement (char-set #\,)))
 | 
				
			||||||
 | 
					                         (names (map string->symbol
 | 
				
			||||||
 | 
					                                     (string-tokenize arg not-comma))))
 | 
				
			||||||
 | 
					                    (alist-cons 'updaters names result))))
 | 
				
			||||||
 | 
					        (option '(#\L "list-updaters") #f #f
 | 
				
			||||||
 | 
					                (lambda args
 | 
				
			||||||
 | 
					                  (list-updaters-and-exit)))
 | 
				
			||||||
        (option '(#\l "list-dependent") #f #f
 | 
					        (option '(#\l "list-dependent") #f #f
 | 
				
			||||||
                (lambda (opt name arg result)
 | 
					                (lambda (opt name arg result)
 | 
				
			||||||
                  (alist-cons 'list-dependent? #t result)))
 | 
					                  (alist-cons 'list-dependent? #t result)))
 | 
				
			||||||
| 
						 | 
					@ -110,7 +117,10 @@ specified with `--select'.\n"))
 | 
				
			||||||
  -s, --select=SUBSET    select all the packages in SUBSET, one of
 | 
					  -s, --select=SUBSET    select all the packages in SUBSET, one of
 | 
				
			||||||
                         `core' or `non-core'"))
 | 
					                         `core' or `non-core'"))
 | 
				
			||||||
  (display (_ "
 | 
					  (display (_ "
 | 
				
			||||||
  -t, --type=UPDATER     restrict to updates from UPDATER--e.g., 'gnu'"))
 | 
					  -t, --type=UPDATER,... restrict to updates from the specified updaters
 | 
				
			||||||
 | 
					                         (e.g., 'gnu')"))
 | 
				
			||||||
 | 
					  (display (_ "
 | 
				
			||||||
 | 
					  -L, --list-updaters    list available updaters and exit"))
 | 
				
			||||||
  (display (_ "
 | 
					  (display (_ "
 | 
				
			||||||
  -l, --list-dependent   list top-level dependent packages that would need to
 | 
					  -l, --list-dependent   list top-level dependent packages that would need to
 | 
				
			||||||
                         be rebuilt as a result of upgrading PACKAGE..."))
 | 
					                         be rebuilt as a result of upgrading PACKAGE..."))
 | 
				
			||||||
| 
						 | 
					@ -149,6 +159,16 @@ specified with `--select'.\n"))
 | 
				
			||||||
          (eq? name (upstream-updater-name updater)))
 | 
					          (eq? name (upstream-updater-name updater)))
 | 
				
			||||||
        %updaters))
 | 
					        %updaters))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(define (list-updaters-and-exit)
 | 
				
			||||||
 | 
					  "Display available updaters and exit."
 | 
				
			||||||
 | 
					  (format #t (_ "Available updaters:~%"))
 | 
				
			||||||
 | 
					  (for-each (lambda (updater)
 | 
				
			||||||
 | 
					              (format #t "- ~a: ~a~%"
 | 
				
			||||||
 | 
					                      (upstream-updater-name updater)
 | 
				
			||||||
 | 
					                      (_ (upstream-updater-description updater))))
 | 
				
			||||||
 | 
					            %updaters)
 | 
				
			||||||
 | 
					  (exit 0))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(define* (update-package store package updaters
 | 
					(define* (update-package store package updaters
 | 
				
			||||||
                         #:key (key-download 'interactive))
 | 
					                         #:key (key-download 'interactive))
 | 
				
			||||||
  "Update the source file that defines PACKAGE with the new version.
 | 
					  "Update the source file that defines PACKAGE with the new version.
 | 
				
			||||||
| 
						 | 
					@ -193,15 +213,15 @@ downloaded and authenticated; not updating~%")
 | 
				
			||||||
  (define (options->updaters opts)
 | 
					  (define (options->updaters opts)
 | 
				
			||||||
    ;; Return the list of updaters to use.
 | 
					    ;; Return the list of updaters to use.
 | 
				
			||||||
    (match (filter-map (match-lambda
 | 
					    (match (filter-map (match-lambda
 | 
				
			||||||
                         (('updater . name)
 | 
					                         (('updaters . names)
 | 
				
			||||||
                          (lookup-updater name))
 | 
					                          (map lookup-updater names))
 | 
				
			||||||
                         (_ #f))
 | 
					                         (_ #f))
 | 
				
			||||||
                       opts)
 | 
					                       opts)
 | 
				
			||||||
      (()
 | 
					      (()
 | 
				
			||||||
       ;; Use the default updaters.
 | 
					       ;; Use the default updaters.
 | 
				
			||||||
       %updaters)
 | 
					       %updaters)
 | 
				
			||||||
      (lst
 | 
					      (lists
 | 
				
			||||||
       lst)))
 | 
					       (concatenate lists))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  (define (keep-newest package lst)
 | 
					  (define (keep-newest package lst)
 | 
				
			||||||
    ;; If a newer version of PACKAGE is already in LST, return LST; otherwise
 | 
					    ;; If a newer version of PACKAGE is already in LST, return LST; otherwise
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -252,8 +252,7 @@ Report the size of PACKAGE and its dependencies.\n"))
 | 
				
			||||||
                  (show-version-and-exit "guix size")))))
 | 
					                  (show-version-and-exit "guix size")))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(define %default-options
 | 
					(define %default-options
 | 
				
			||||||
  `((system . ,(%current-system))
 | 
					  `((system . ,(%current-system))))
 | 
				
			||||||
    (substitute-urls . ,%default-substitute-urls)))
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
;;;
 | 
					;;;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -72,6 +72,7 @@
 | 
				
			||||||
            assert-valid-narinfo
 | 
					            assert-valid-narinfo
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            lookup-narinfos
 | 
					            lookup-narinfos
 | 
				
			||||||
 | 
					            lookup-narinfos/diverse
 | 
				
			||||||
            read-narinfo
 | 
					            read-narinfo
 | 
				
			||||||
            write-narinfo
 | 
					            write-narinfo
 | 
				
			||||||
            guix-substitute))
 | 
					            guix-substitute))
 | 
				
			||||||
| 
						 | 
					@ -474,12 +475,13 @@ may be #f, in which case it indicates that PATH is unavailable at CACHE-URL."
 | 
				
			||||||
                            ".narinfo")))
 | 
					                            ".narinfo")))
 | 
				
			||||||
    (build-request (string->uri url) #:method 'GET)))
 | 
					    (build-request (string->uri url) #:method 'GET)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(define (http-multiple-get base-url requests proc)
 | 
					(define (http-multiple-get base-url proc seed requests)
 | 
				
			||||||
  "Send all of REQUESTS to the server at BASE-URL.  Call PROC for each
 | 
					  "Send all of REQUESTS to the server at BASE-URL.  Call PROC for each
 | 
				
			||||||
response, passing it the request object, the response, and a port from which
 | 
					response, passing it the request object, the response, a port from which to
 | 
				
			||||||
to read the response body.  Return the list of results."
 | 
					read the response body, and the previous result, starting with SEED, à la
 | 
				
			||||||
 | 
					'fold'.  Return the final result."
 | 
				
			||||||
  (let connect ((requests requests)
 | 
					  (let connect ((requests requests)
 | 
				
			||||||
                (result   '()))
 | 
					                (result   seed))
 | 
				
			||||||
    ;; (format (current-error-port) "connecting (~a requests left)..."
 | 
					    ;; (format (current-error-port) "connecting (~a requests left)..."
 | 
				
			||||||
    ;;         (length requests))
 | 
					    ;;         (length requests))
 | 
				
			||||||
    (let ((p (open-socket-for-uri base-url)))
 | 
					    (let ((p (open-socket-for-uri base-url)))
 | 
				
			||||||
| 
						 | 
					@ -497,7 +499,7 @@ to read the response body.  Return the list of results."
 | 
				
			||||||
          ((head tail ...)
 | 
					          ((head tail ...)
 | 
				
			||||||
           (let* ((resp   (read-response p))
 | 
					           (let* ((resp   (read-response p))
 | 
				
			||||||
                  (body   (response-body-port resp))
 | 
					                  (body   (response-body-port resp))
 | 
				
			||||||
                  (result (cons (proc head resp body) result)))
 | 
					                  (result (proc head resp body result)))
 | 
				
			||||||
             ;; The server can choose to stop responding at any time, in which
 | 
					             ;; The server can choose to stop responding at any time, in which
 | 
				
			||||||
             ;; case we have to try again.  Check whether that is the case.
 | 
					             ;; case we have to try again.  Check whether that is the case.
 | 
				
			||||||
             ;; Note that even upon "Connection: close", we can read from BODY.
 | 
					             ;; Note that even upon "Connection: close", we can read from BODY.
 | 
				
			||||||
| 
						 | 
					@ -536,7 +538,7 @@ if file doesn't exist, and the narinfo otherwise."
 | 
				
			||||||
                url (* 100. (/ done (length paths))))
 | 
					                url (* 100. (/ done (length paths))))
 | 
				
			||||||
        (set! done (+ 1 done)))))
 | 
					        (set! done (+ 1 done)))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  (define (handle-narinfo-response request response port)
 | 
					  (define (handle-narinfo-response request response port result)
 | 
				
			||||||
    (let ((len (response-content-length response)))
 | 
					    (let ((len (response-content-length response)))
 | 
				
			||||||
      ;; Make sure to read no more than LEN bytes since subsequent bytes may
 | 
					      ;; Make sure to read no more than LEN bytes since subsequent bytes may
 | 
				
			||||||
      ;; belong to the next response.
 | 
					      ;; belong to the next response.
 | 
				
			||||||
| 
						 | 
					@ -545,7 +547,7 @@ if file doesn't exist, and the narinfo otherwise."
 | 
				
			||||||
         (let ((narinfo (read-narinfo port url #:size len)))
 | 
					         (let ((narinfo (read-narinfo port url #:size len)))
 | 
				
			||||||
           (cache-narinfo! url (narinfo-path narinfo) narinfo)
 | 
					           (cache-narinfo! url (narinfo-path narinfo) narinfo)
 | 
				
			||||||
           (update-progress!)
 | 
					           (update-progress!)
 | 
				
			||||||
           narinfo))
 | 
					           (cons narinfo result)))
 | 
				
			||||||
        ((404)                                     ; failure
 | 
					        ((404)                                     ; failure
 | 
				
			||||||
         (let* ((path      (uri-path (request-uri request)))
 | 
					         (let* ((path      (uri-path (request-uri request)))
 | 
				
			||||||
                (hash-part (string-drop-right path 8))) ; drop ".narinfo"
 | 
					                (hash-part (string-drop-right path 8))) ; drop ".narinfo"
 | 
				
			||||||
| 
						 | 
					@ -555,13 +557,13 @@ if file doesn't exist, and the narinfo otherwise."
 | 
				
			||||||
           (cache-narinfo! url
 | 
					           (cache-narinfo! url
 | 
				
			||||||
                           (find (cut string-contains <> hash-part) paths)
 | 
					                           (find (cut string-contains <> hash-part) paths)
 | 
				
			||||||
                           #f)
 | 
					                           #f)
 | 
				
			||||||
           (update-progress!))
 | 
					           (update-progress!)
 | 
				
			||||||
         #f)
 | 
					           result))
 | 
				
			||||||
        (else                                      ; transient failure
 | 
					        (else                                      ; transient failure
 | 
				
			||||||
         (if len
 | 
					         (if len
 | 
				
			||||||
             (get-bytevector-n port len)
 | 
					             (get-bytevector-n port len)
 | 
				
			||||||
             (read-to-eof port))
 | 
					             (read-to-eof port))
 | 
				
			||||||
         #f))))
 | 
					         result))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  (define cache-info
 | 
					  (define cache-info
 | 
				
			||||||
    (download-cache-info url))
 | 
					    (download-cache-info url))
 | 
				
			||||||
| 
						 | 
					@ -574,8 +576,9 @@ if file doesn't exist, and the narinfo otherwise."
 | 
				
			||||||
           ((http)
 | 
					           ((http)
 | 
				
			||||||
            (let ((requests (map (cut narinfo-request url <>) paths)))
 | 
					            (let ((requests (map (cut narinfo-request url <>) paths)))
 | 
				
			||||||
              (update-progress!)
 | 
					              (update-progress!)
 | 
				
			||||||
              (let ((result (http-multiple-get url requests
 | 
					              (let ((result (http-multiple-get url
 | 
				
			||||||
                                               handle-narinfo-response)))
 | 
					                                               handle-narinfo-response '()
 | 
				
			||||||
 | 
					                                               requests)))
 | 
				
			||||||
                (newline (current-error-port))
 | 
					                (newline (current-error-port))
 | 
				
			||||||
                result)))
 | 
					                result)))
 | 
				
			||||||
           ((file #f)
 | 
					           ((file #f)
 | 
				
			||||||
| 
						 | 
					@ -596,7 +599,9 @@ information is available locally."
 | 
				
			||||||
                         (let-values (((valid? value)
 | 
					                         (let-values (((valid? value)
 | 
				
			||||||
                                       (cached-narinfo cache path)))
 | 
					                                       (cached-narinfo cache path)))
 | 
				
			||||||
                           (if valid?
 | 
					                           (if valid?
 | 
				
			||||||
 | 
					                               (if value
 | 
				
			||||||
                                   (values (cons value cached) missing)
 | 
					                                   (values (cons value cached) missing)
 | 
				
			||||||
 | 
					                                   (values cached missing))
 | 
				
			||||||
                               (values cached (cons path missing)))))
 | 
					                               (values cached (cons path missing)))))
 | 
				
			||||||
                       '()
 | 
					                       '()
 | 
				
			||||||
                       '()
 | 
					                       '()
 | 
				
			||||||
| 
						 | 
					@ -606,11 +611,32 @@ information is available locally."
 | 
				
			||||||
        (let ((missing (fetch-narinfos cache missing)))
 | 
					        (let ((missing (fetch-narinfos cache missing)))
 | 
				
			||||||
          (append cached (or missing '()))))))
 | 
					          (append cached (or missing '()))))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(define (lookup-narinfo cache path)
 | 
					(define (lookup-narinfos/diverse caches paths)
 | 
				
			||||||
  "Return the narinfo for PATH in CACHE, or #f when no substitute for PATH was
 | 
					  "Look up narinfos for PATHS on all of CACHES, a list of URLS, in that order.
 | 
				
			||||||
found."
 | 
					That is, when a cache lacks a narinfo, look it up in the next cache, and so
 | 
				
			||||||
  (match (lookup-narinfos cache (list path))
 | 
					on.  Return a list of narinfos for PATHS or a subset thereof."
 | 
				
			||||||
    ((answer) answer)))
 | 
					  (let loop ((caches caches)
 | 
				
			||||||
 | 
					             (paths  paths)
 | 
				
			||||||
 | 
					             (result '()))
 | 
				
			||||||
 | 
					    (match paths
 | 
				
			||||||
 | 
					      (()                                         ;we're done
 | 
				
			||||||
 | 
					       result)
 | 
				
			||||||
 | 
					      (_
 | 
				
			||||||
 | 
					       (match caches
 | 
				
			||||||
 | 
					         ((cache rest ...)
 | 
				
			||||||
 | 
					          (let* ((narinfos (lookup-narinfos cache paths))
 | 
				
			||||||
 | 
					                 (hits     (map narinfo-path narinfos))
 | 
				
			||||||
 | 
					                 (missing  (lset-difference string=? paths hits))) ;XXX: perf
 | 
				
			||||||
 | 
					            (loop rest missing (append narinfos result))))
 | 
				
			||||||
 | 
					         (()                                      ;that's it
 | 
				
			||||||
 | 
					          result))))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(define (lookup-narinfo caches path)
 | 
				
			||||||
 | 
					  "Return the narinfo for PATH in CACHES, or #f when no substitute for PATH
 | 
				
			||||||
 | 
					was found."
 | 
				
			||||||
 | 
					  (match (lookup-narinfos/diverse caches (list path))
 | 
				
			||||||
 | 
					    ((answer) answer)
 | 
				
			||||||
 | 
					    (_        #f)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(define (remove-expired-cached-narinfos directory)
 | 
					(define (remove-expired-cached-narinfos directory)
 | 
				
			||||||
  "Remove expired narinfo entries from DIRECTORY.  The sole purpose of this
 | 
					  "Remove expired narinfo entries from DIRECTORY.  The sole purpose of this
 | 
				
			||||||
| 
						 | 
					@ -752,34 +778,34 @@ expected by the daemon."
 | 
				
			||||||
          (or (narinfo-size narinfo) 0)))
 | 
					          (or (narinfo-size narinfo) 0)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(define* (process-query command
 | 
					(define* (process-query command
 | 
				
			||||||
                        #:key cache-url acl)
 | 
					                        #:key cache-urls acl)
 | 
				
			||||||
  "Reply to COMMAND, a query as written by the daemon to this process's
 | 
					  "Reply to COMMAND, a query as written by the daemon to this process's
 | 
				
			||||||
standard input.  Use ACL as the access-control list against which to check
 | 
					standard input.  Use ACL as the access-control list against which to check
 | 
				
			||||||
authorized substitutes."
 | 
					authorized substitutes."
 | 
				
			||||||
  (define (valid? obj)
 | 
					  (define (valid? obj)
 | 
				
			||||||
    (and (narinfo? obj) (valid-narinfo? obj acl)))
 | 
					    (valid-narinfo? obj acl))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  (match (string-tokenize command)
 | 
					  (match (string-tokenize command)
 | 
				
			||||||
    (("have" paths ..1)
 | 
					    (("have" paths ..1)
 | 
				
			||||||
     ;; Return the subset of PATHS available in CACHE-URL.
 | 
					     ;; Return the subset of PATHS available in CACHE-URLS.
 | 
				
			||||||
     (let ((substitutable (lookup-narinfos cache-url paths)))
 | 
					     (let ((substitutable (lookup-narinfos/diverse cache-urls paths)))
 | 
				
			||||||
       (for-each (lambda (narinfo)
 | 
					       (for-each (lambda (narinfo)
 | 
				
			||||||
                   (format #t "~a~%" (narinfo-path narinfo)))
 | 
					                   (format #t "~a~%" (narinfo-path narinfo)))
 | 
				
			||||||
                 (filter valid? substitutable))
 | 
					                 (filter valid? substitutable))
 | 
				
			||||||
       (newline)))
 | 
					       (newline)))
 | 
				
			||||||
    (("info" paths ..1)
 | 
					    (("info" paths ..1)
 | 
				
			||||||
     ;; Reply info about PATHS if it's in CACHE-URL.
 | 
					     ;; Reply info about PATHS if it's in CACHE-URLS.
 | 
				
			||||||
     (let ((substitutable (lookup-narinfos cache-url paths)))
 | 
					     (let ((substitutable (lookup-narinfos/diverse cache-urls paths)))
 | 
				
			||||||
       (for-each display-narinfo-data (filter valid? substitutable))
 | 
					       (for-each display-narinfo-data (filter valid? substitutable))
 | 
				
			||||||
       (newline)))
 | 
					       (newline)))
 | 
				
			||||||
    (wtf
 | 
					    (wtf
 | 
				
			||||||
     (error "unknown `--query' command" wtf))))
 | 
					     (error "unknown `--query' command" wtf))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(define* (process-substitution store-item destination
 | 
					(define* (process-substitution store-item destination
 | 
				
			||||||
                               #:key cache-url acl)
 | 
					                               #:key cache-urls acl)
 | 
				
			||||||
  "Substitute STORE-ITEM (a store file name) from CACHE-URL, and write it to
 | 
					  "Substitute STORE-ITEM (a store file name) from CACHE-URLS, and write it to
 | 
				
			||||||
DESTINATION as a nar file.  Verify the substitute against ACL."
 | 
					DESTINATION as a nar file.  Verify the substitute against ACL."
 | 
				
			||||||
  (let* ((narinfo (lookup-narinfo cache-url store-item))
 | 
					  (let* ((narinfo (lookup-narinfo cache-urls store-item))
 | 
				
			||||||
         (uri     (narinfo-uri narinfo)))
 | 
					         (uri     (narinfo-uri narinfo)))
 | 
				
			||||||
    ;; Make sure it is signed and everything.
 | 
					    ;; Make sure it is signed and everything.
 | 
				
			||||||
    (assert-valid-narinfo narinfo acl)
 | 
					    (assert-valid-narinfo narinfo acl)
 | 
				
			||||||
| 
						 | 
					@ -876,21 +902,16 @@ found."
 | 
				
			||||||
        b
 | 
					        b
 | 
				
			||||||
        first)))
 | 
					        first)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(define %cache-url
 | 
					(define %cache-urls
 | 
				
			||||||
  (match (and=> (or* (find-daemon-option "untrusted-substitute-urls") ;client
 | 
					  (match (and=> (or* (find-daemon-option "untrusted-substitute-urls") ;client
 | 
				
			||||||
                     (find-daemon-option "substitute-urls"))          ;admin
 | 
					                     (find-daemon-option "substitute-urls"))          ;admin
 | 
				
			||||||
                string-tokenize)
 | 
					                string-tokenize)
 | 
				
			||||||
    ((url)
 | 
					    ((urls ...)
 | 
				
			||||||
     url)
 | 
					     urls)
 | 
				
			||||||
    ((head tail ..1)
 | 
					 | 
				
			||||||
     ;; Currently we don't handle multiple substitute URLs.
 | 
					 | 
				
			||||||
     (warning (_ "these substitute URLs will not be used:~{ ~a~}~%")
 | 
					 | 
				
			||||||
              tail)
 | 
					 | 
				
			||||||
     head)
 | 
					 | 
				
			||||||
    (#f
 | 
					    (#f
 | 
				
			||||||
     ;; This can only happen when this script is not invoked by the
 | 
					     ;; This can only happen when this script is not invoked by the
 | 
				
			||||||
     ;; daemon.
 | 
					     ;; daemon.
 | 
				
			||||||
     "http://hydra.gnu.org")))
 | 
					     '("http://hydra.gnu.org"))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(define (guix-substitute . args)
 | 
					(define (guix-substitute . args)
 | 
				
			||||||
  "Implement the build daemon's substituter protocol."
 | 
					  "Implement the build daemon's substituter protocol."
 | 
				
			||||||
| 
						 | 
					@ -901,20 +922,8 @@ found."
 | 
				
			||||||
  ;; Starting from commit 22144afa in Nix, we are allowed to bail out directly
 | 
					  ;; Starting from commit 22144afa in Nix, we are allowed to bail out directly
 | 
				
			||||||
  ;; when we know we cannot substitute, but we must emit a newline on stdout
 | 
					  ;; when we know we cannot substitute, but we must emit a newline on stdout
 | 
				
			||||||
  ;; when everything is alright.
 | 
					  ;; when everything is alright.
 | 
				
			||||||
  (let ((uri (string->uri %cache-url)))
 | 
					  (when (null? %cache-urls)
 | 
				
			||||||
    (case (uri-scheme uri)
 | 
					    (exit 0))
 | 
				
			||||||
      ((http)
 | 
					 | 
				
			||||||
       ;; Exit gracefully if there's no network access.
 | 
					 | 
				
			||||||
       (let ((host (uri-host uri)))
 | 
					 | 
				
			||||||
         (catch 'getaddrinfo-error
 | 
					 | 
				
			||||||
           (lambda ()
 | 
					 | 
				
			||||||
             (getaddrinfo host))
 | 
					 | 
				
			||||||
           (lambda (key error)
 | 
					 | 
				
			||||||
             (warning (_ "failed to look up host '~a' (~a), \
 | 
					 | 
				
			||||||
substituter disabled~%")
 | 
					 | 
				
			||||||
                      host (gai-strerror error))
 | 
					 | 
				
			||||||
             (exit 0)))))
 | 
					 | 
				
			||||||
      (else #t)))
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  ;; Say hello (see above.)
 | 
					  ;; Say hello (see above.)
 | 
				
			||||||
  (newline)
 | 
					  (newline)
 | 
				
			||||||
| 
						 | 
					@ -929,13 +938,13 @@ substituter disabled~%")
 | 
				
			||||||
            (or (eof-object? command)
 | 
					            (or (eof-object? command)
 | 
				
			||||||
                (begin
 | 
					                (begin
 | 
				
			||||||
                  (process-query command
 | 
					                  (process-query command
 | 
				
			||||||
                                 #:cache-url %cache-url
 | 
					                                 #:cache-urls %cache-urls
 | 
				
			||||||
                                 #:acl acl)
 | 
					                                 #:acl acl)
 | 
				
			||||||
                  (loop (read-line)))))))
 | 
					                  (loop (read-line)))))))
 | 
				
			||||||
       (("--substitute" store-path destination)
 | 
					       (("--substitute" store-path destination)
 | 
				
			||||||
        ;; Download STORE-PATH and add store it as a Nar in file DESTINATION.
 | 
					        ;; Download STORE-PATH and add store it as a Nar in file DESTINATION.
 | 
				
			||||||
        (process-substitution store-path destination
 | 
					        (process-substitution store-path destination
 | 
				
			||||||
                              #:cache-url %cache-url
 | 
					                              #:cache-urls %cache-urls
 | 
				
			||||||
                              #:acl (current-acl)))
 | 
					                              #:acl (current-acl)))
 | 
				
			||||||
       (("--version")
 | 
					       (("--version")
 | 
				
			||||||
        (show-version-and-exit "guix substitute"))
 | 
					        (show-version-and-exit "guix substitute"))
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -25,6 +25,7 @@
 | 
				
			||||||
  #:use-module (guix packages)
 | 
					  #:use-module (guix packages)
 | 
				
			||||||
  #:use-module (guix utils)
 | 
					  #:use-module (guix utils)
 | 
				
			||||||
  #:use-module (guix monads)
 | 
					  #:use-module (guix monads)
 | 
				
			||||||
 | 
					  #:use-module (guix records)
 | 
				
			||||||
  #:use-module (guix profiles)
 | 
					  #:use-module (guix profiles)
 | 
				
			||||||
  #:use-module (guix scripts)
 | 
					  #:use-module (guix scripts)
 | 
				
			||||||
  #:use-module (guix scripts build)
 | 
					  #:use-module (guix scripts build)
 | 
				
			||||||
| 
						 | 
					@ -41,6 +42,8 @@
 | 
				
			||||||
  #:use-module (srfi srfi-1)
 | 
					  #:use-module (srfi srfi-1)
 | 
				
			||||||
  #:use-module (srfi srfi-19)
 | 
					  #:use-module (srfi srfi-19)
 | 
				
			||||||
  #:use-module (srfi srfi-26)
 | 
					  #:use-module (srfi srfi-26)
 | 
				
			||||||
 | 
					  #:use-module (srfi srfi-34)
 | 
				
			||||||
 | 
					  #:use-module (srfi srfi-35)
 | 
				
			||||||
  #:use-module (srfi srfi-37)
 | 
					  #:use-module (srfi srfi-37)
 | 
				
			||||||
  #:use-module (ice-9 match)
 | 
					  #:use-module (ice-9 match)
 | 
				
			||||||
  #:export (guix-system
 | 
					  #:export (guix-system
 | 
				
			||||||
| 
						 | 
					@ -184,6 +187,39 @@ the ownership of '~a' may be incorrect!~%")
 | 
				
			||||||
      (mwhen grub?
 | 
					      (mwhen grub?
 | 
				
			||||||
        (install-grub* grub.cfg device target)))))
 | 
					        (install-grub* grub.cfg device target)))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					;;;
 | 
				
			||||||
 | 
					;;; Boot parameters
 | 
				
			||||||
 | 
					;;;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(define-record-type* <boot-parameters>
 | 
				
			||||||
 | 
					  boot-parameters make-boot-parameters boot-parameters?
 | 
				
			||||||
 | 
					  (label            boot-parameters-label)
 | 
				
			||||||
 | 
					  (root-device      boot-parameters-root-device)
 | 
				
			||||||
 | 
					  (kernel           boot-parameters-kernel)
 | 
				
			||||||
 | 
					  (kernel-arguments boot-parameters-kernel-arguments))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(define (read-boot-parameters port)
 | 
				
			||||||
 | 
					  "Read boot parameters from PORT and return the corresponding
 | 
				
			||||||
 | 
					<boot-parameters> object or #f if the format is unrecognized."
 | 
				
			||||||
 | 
					  (match (read port)
 | 
				
			||||||
 | 
					    (('boot-parameters ('version 0)
 | 
				
			||||||
 | 
					                       ('label label) ('root-device root)
 | 
				
			||||||
 | 
					                       ('kernel linux)
 | 
				
			||||||
 | 
					                       rest ...)
 | 
				
			||||||
 | 
					     (boot-parameters
 | 
				
			||||||
 | 
					      (label label)
 | 
				
			||||||
 | 
					      (root-device root)
 | 
				
			||||||
 | 
					      (kernel linux)
 | 
				
			||||||
 | 
					      (kernel-arguments
 | 
				
			||||||
 | 
					       (match (assq 'kernel-arguments rest)
 | 
				
			||||||
 | 
					         ((_ args) args)
 | 
				
			||||||
 | 
					         (#f       '())))))                       ;the old format
 | 
				
			||||||
 | 
					    (x                                            ;unsupported format
 | 
				
			||||||
 | 
					     (warning (_ "unrecognized boot parameters for '~a'~%")
 | 
				
			||||||
 | 
					              system)
 | 
				
			||||||
 | 
					     #f)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
;;;
 | 
					;;;
 | 
				
			||||||
;;; Reconfiguration.
 | 
					;;; Reconfiguration.
 | 
				
			||||||
| 
						 | 
					@ -247,30 +283,22 @@ it atomically, and then run OS's activation script."
 | 
				
			||||||
  "Return a list of 'menu-entry' for the generations of PROFILE."
 | 
					  "Return a list of 'menu-entry' for the generations of PROFILE."
 | 
				
			||||||
  (define (system->grub-entry system number time)
 | 
					  (define (system->grub-entry system number time)
 | 
				
			||||||
    (unless-file-not-found
 | 
					    (unless-file-not-found
 | 
				
			||||||
     (call-with-input-file (string-append system "/parameters")
 | 
					     (let ((file (string-append system "/parameters")))
 | 
				
			||||||
       (lambda (port)
 | 
					       (match (call-with-input-file file read-boot-parameters)
 | 
				
			||||||
         (match (read port)
 | 
					         (($ <boot-parameters> label root kernel kernel-arguments)
 | 
				
			||||||
           (('boot-parameters ('version 0)
 | 
					 | 
				
			||||||
                              ('label label) ('root-device root)
 | 
					 | 
				
			||||||
                              ('kernel linux)
 | 
					 | 
				
			||||||
                              rest ...)
 | 
					 | 
				
			||||||
          (menu-entry
 | 
					          (menu-entry
 | 
				
			||||||
           (label (string-append label " (#"
 | 
					           (label (string-append label " (#"
 | 
				
			||||||
                                 (number->string number) ", "
 | 
					                                 (number->string number) ", "
 | 
				
			||||||
                                 (seconds->string time) ")"))
 | 
					                                 (seconds->string time) ")"))
 | 
				
			||||||
             (linux linux)
 | 
					           (linux kernel)
 | 
				
			||||||
           (linux-arguments
 | 
					           (linux-arguments
 | 
				
			||||||
            (cons* (string-append "--root=" root)
 | 
					            (cons* (string-append "--root=" root)
 | 
				
			||||||
                   #~(string-append "--system=" #$system)
 | 
					                   #~(string-append "--system=" #$system)
 | 
				
			||||||
                   #~(string-append "--load=" #$system "/boot")
 | 
					                   #~(string-append "--load=" #$system "/boot")
 | 
				
			||||||
                     (match (assq 'kernel-arguments rest)
 | 
					                   kernel-arguments))
 | 
				
			||||||
                       ((_ args) args)
 | 
					 | 
				
			||||||
                       (#f       '()))))          ;old format
 | 
					 | 
				
			||||||
           (initrd #~(string-append #$system "/initrd"))))
 | 
					           (initrd #~(string-append #$system "/initrd"))))
 | 
				
			||||||
           (_                                     ;unsupported format
 | 
					         (#f                                      ;invalid format
 | 
				
			||||||
            (warning (_ "unrecognized boot parameters for '~a'~%")
 | 
					          #f)))))
 | 
				
			||||||
                     system)
 | 
					 | 
				
			||||||
            #f))))))
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  (let* ((numbers (generation-numbers profile))
 | 
					  (let* ((numbers (generation-numbers profile))
 | 
				
			||||||
         (systems (map (cut generation-file-name profile <>)
 | 
					         (systems (map (cut generation-file-name profile <>)
 | 
				
			||||||
| 
						 | 
					@ -325,6 +353,48 @@ list of services."
 | 
				
			||||||
   (label dmd-service-node-label)
 | 
					   (label dmd-service-node-label)
 | 
				
			||||||
   (edges (lift1 (dmd-service-back-edges services) %store-monad))))
 | 
					   (edges (lift1 (dmd-service-back-edges services) %store-monad))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					;;;
 | 
				
			||||||
 | 
					;;; Generations.
 | 
				
			||||||
 | 
					;;;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(define* (display-system-generation number
 | 
				
			||||||
 | 
					                                    #:optional (profile %system-profile))
 | 
				
			||||||
 | 
					  "Display a summary of system generation NUMBER in a human-readable format."
 | 
				
			||||||
 | 
					  (unless (zero? number)
 | 
				
			||||||
 | 
					    (let* ((generation (generation-file-name profile number))
 | 
				
			||||||
 | 
					           (param-file (string-append generation "/parameters"))
 | 
				
			||||||
 | 
					           (params     (call-with-input-file param-file read-boot-parameters)))
 | 
				
			||||||
 | 
					      (display-generation profile number)
 | 
				
			||||||
 | 
					      (format #t (_ "  file name: ~a~%") generation)
 | 
				
			||||||
 | 
					      (format #t (_ "  canonical file name: ~a~%") (readlink* generation))
 | 
				
			||||||
 | 
					      (match params
 | 
				
			||||||
 | 
					        (($ <boot-parameters> label root kernel)
 | 
				
			||||||
 | 
					         ;; TRANSLATORS: Please preserve the two-space indentation.
 | 
				
			||||||
 | 
					         (format #t (_ "  label: ~a~%") label)
 | 
				
			||||||
 | 
					         (format #t (_ "  root device: ~a~%") root)
 | 
				
			||||||
 | 
					         (format #t (_ "  kernel: ~a~%") kernel))
 | 
				
			||||||
 | 
					        (_
 | 
				
			||||||
 | 
					         #f)))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(define* (list-generations pattern #:optional (profile %system-profile))
 | 
				
			||||||
 | 
					  "Display in a human-readable format all the system generations matching
 | 
				
			||||||
 | 
					PATTERN, a string.  When PATTERN is #f, display all the system generations."
 | 
				
			||||||
 | 
					  (cond ((not (file-exists? profile))             ; XXX: race condition
 | 
				
			||||||
 | 
					         (raise (condition (&profile-not-found-error
 | 
				
			||||||
 | 
					                            (profile profile)))))
 | 
				
			||||||
 | 
					        ((string-null? pattern)
 | 
				
			||||||
 | 
					         (for-each display-system-generation (profile-generations profile)))
 | 
				
			||||||
 | 
					        ((matching-generations pattern profile)
 | 
				
			||||||
 | 
					         =>
 | 
				
			||||||
 | 
					         (lambda (numbers)
 | 
				
			||||||
 | 
					           (if (null-list? numbers)
 | 
				
			||||||
 | 
					               (exit 1)
 | 
				
			||||||
 | 
					               (leave-on-EPIPE
 | 
				
			||||||
 | 
					                (for-each display-system-generation numbers)))))
 | 
				
			||||||
 | 
					        (else
 | 
				
			||||||
 | 
					         (leave (_ "invalid syntax: ~a~%") pattern))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
;;;
 | 
					;;;
 | 
				
			||||||
;;; Action.
 | 
					;;; Action.
 | 
				
			||||||
| 
						 | 
					@ -442,13 +512,15 @@ building anything."
 | 
				
			||||||
;;;
 | 
					;;;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(define (show-help)
 | 
					(define (show-help)
 | 
				
			||||||
  (display (_ "Usage: guix system [OPTION] ACTION FILE
 | 
					  (display (_ "Usage: guix system [OPTION] ACTION [FILE]
 | 
				
			||||||
Build the operating system declared in FILE according to ACTION.\n"))
 | 
					Build the operating system declared in FILE according to ACTION.\n"))
 | 
				
			||||||
  (newline)
 | 
					  (newline)
 | 
				
			||||||
  (display (_ "The valid values for ACTION are:\n"))
 | 
					  (display (_ "The valid values for ACTION are:\n"))
 | 
				
			||||||
  (newline)
 | 
					  (newline)
 | 
				
			||||||
  (display (_ "\
 | 
					  (display (_ "\
 | 
				
			||||||
   reconfigure      switch to a new operating system configuration\n"))
 | 
					   reconfigure      switch to a new operating system configuration\n"))
 | 
				
			||||||
 | 
					  (display (_ "\
 | 
				
			||||||
 | 
					   list-generations list the system generations\n"))
 | 
				
			||||||
  (display (_ "\
 | 
					  (display (_ "\
 | 
				
			||||||
   build            build the operating system without installing anything\n"))
 | 
					   build            build the operating system without installing anything\n"))
 | 
				
			||||||
  (display (_ "\
 | 
					  (display (_ "\
 | 
				
			||||||
| 
						 | 
					@ -488,19 +560,6 @@ Build the operating system declared in FILE according to ACTION.\n"))
 | 
				
			||||||
  (newline)
 | 
					  (newline)
 | 
				
			||||||
  (show-bug-report-information))
 | 
					  (show-bug-report-information))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(define (specification->file-system-mapping spec writable?)
 | 
					 | 
				
			||||||
  "Read the SPEC and return the corresponding <file-system-mapping>."
 | 
					 | 
				
			||||||
  (let ((index (string-index spec #\=)))
 | 
					 | 
				
			||||||
    (if index
 | 
					 | 
				
			||||||
        (file-system-mapping
 | 
					 | 
				
			||||||
         (source (substring spec 0 index))
 | 
					 | 
				
			||||||
         (target (substring spec (+ 1 index)))
 | 
					 | 
				
			||||||
         (writable? writable?))
 | 
					 | 
				
			||||||
        (file-system-mapping
 | 
					 | 
				
			||||||
         (source spec)
 | 
					 | 
				
			||||||
         (target spec)
 | 
					 | 
				
			||||||
         (writable? writable?)))))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
(define %options
 | 
					(define %options
 | 
				
			||||||
  ;; Specifications of the command-line options.
 | 
					  ;; Specifications of the command-line options.
 | 
				
			||||||
  (cons* (option '(#\h "help") #f #f
 | 
					  (cons* (option '(#\h "help") #f #f
 | 
				
			||||||
| 
						 | 
					@ -563,6 +622,71 @@ Build the operating system declared in FILE according to ACTION.\n"))
 | 
				
			||||||
;;; Entry point.
 | 
					;;; Entry point.
 | 
				
			||||||
;;;
 | 
					;;;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(define (process-action action args opts)
 | 
				
			||||||
 | 
					  "Process ACTION, a sub-command, with the arguments are listed in ARGS.
 | 
				
			||||||
 | 
					ACTION must be one of the sub-commands that takes an operating system
 | 
				
			||||||
 | 
					declaration as an argument (a file name.)  OPTS is the raw alist of options
 | 
				
			||||||
 | 
					resulting from command-line parsing."
 | 
				
			||||||
 | 
					  (let* ((file     (match args
 | 
				
			||||||
 | 
					                     (() #f)
 | 
				
			||||||
 | 
					                     ((x . _) x)))
 | 
				
			||||||
 | 
					         (system   (assoc-ref opts 'system))
 | 
				
			||||||
 | 
					         (os       (if file
 | 
				
			||||||
 | 
					                       (load* file %user-module
 | 
				
			||||||
 | 
					                              #:on-error (assoc-ref opts 'on-error))
 | 
				
			||||||
 | 
					                       (leave (_ "no configuration file specified~%"))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					         (dry?     (assoc-ref opts 'dry-run?))
 | 
				
			||||||
 | 
					         (grub?    (assoc-ref opts 'install-grub?))
 | 
				
			||||||
 | 
					         (target   (match args
 | 
				
			||||||
 | 
					                     ((first second) second)
 | 
				
			||||||
 | 
					                     (_ #f)))
 | 
				
			||||||
 | 
					         (device   (and grub?
 | 
				
			||||||
 | 
					                        (grub-configuration-device
 | 
				
			||||||
 | 
					                         (operating-system-bootloader os)))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    (with-store store
 | 
				
			||||||
 | 
					      (set-build-options-from-command-line store opts)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      (run-with-store store
 | 
				
			||||||
 | 
					        (mbegin %store-monad
 | 
				
			||||||
 | 
					          (set-guile-for-build (default-guile))
 | 
				
			||||||
 | 
					          (case action
 | 
				
			||||||
 | 
					            ((extension-graph)
 | 
				
			||||||
 | 
					             (export-extension-graph os (current-output-port)))
 | 
				
			||||||
 | 
					            ((dmd-graph)
 | 
				
			||||||
 | 
					             (export-dmd-graph os (current-output-port)))
 | 
				
			||||||
 | 
					            (else
 | 
				
			||||||
 | 
					             (perform-action action os
 | 
				
			||||||
 | 
					                             #:dry-run? dry?
 | 
				
			||||||
 | 
					                             #:derivations-only? (assoc-ref opts
 | 
				
			||||||
 | 
					                                                            'derivations-only?)
 | 
				
			||||||
 | 
					                             #:use-substitutes? (assoc-ref opts 'substitutes?)
 | 
				
			||||||
 | 
					                             #:image-size (assoc-ref opts 'image-size)
 | 
				
			||||||
 | 
					                             #:full-boot? (assoc-ref opts 'full-boot?)
 | 
				
			||||||
 | 
					                             #:mappings (filter-map (match-lambda
 | 
				
			||||||
 | 
					                                                      (('file-system-mapping . m)
 | 
				
			||||||
 | 
					                                                       m)
 | 
				
			||||||
 | 
					                                                      (_ #f))
 | 
				
			||||||
 | 
					                                                    opts)
 | 
				
			||||||
 | 
					                             #:grub? grub?
 | 
				
			||||||
 | 
					                             #:target target #:device device))))
 | 
				
			||||||
 | 
					        #:system system))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(define (process-command command args opts)
 | 
				
			||||||
 | 
					  "Process COMMAND, one of the 'guix system' sub-commands.  ARGS is its
 | 
				
			||||||
 | 
					argument list and OPTS is the option alist."
 | 
				
			||||||
 | 
					  (case command
 | 
				
			||||||
 | 
					    ((list-generations)
 | 
				
			||||||
 | 
					     ;; List generations.  No need to connect to the daemon, etc.
 | 
				
			||||||
 | 
					     (let ((pattern (match args
 | 
				
			||||||
 | 
					                      (() "")
 | 
				
			||||||
 | 
					                      ((pattern) pattern)
 | 
				
			||||||
 | 
					                      (x (leave (_ "wrong number of arguments~%"))))))
 | 
				
			||||||
 | 
					       (list-generations pattern)))
 | 
				
			||||||
 | 
					    (else
 | 
				
			||||||
 | 
					     (process-action command args opts))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(define (guix-system . args)
 | 
					(define (guix-system . args)
 | 
				
			||||||
  (define (parse-sub-command arg result)
 | 
					  (define (parse-sub-command arg result)
 | 
				
			||||||
    ;; Parse sub-command ARG and augment RESULT accordingly.
 | 
					    ;; Parse sub-command ARG and augment RESULT accordingly.
 | 
				
			||||||
| 
						 | 
					@ -571,7 +695,7 @@ Build the operating system declared in FILE according to ACTION.\n"))
 | 
				
			||||||
        (let ((action (string->symbol arg)))
 | 
					        (let ((action (string->symbol arg)))
 | 
				
			||||||
          (case action
 | 
					          (case action
 | 
				
			||||||
            ((build vm vm-image disk-image reconfigure init
 | 
					            ((build vm vm-image disk-image reconfigure init
 | 
				
			||||||
              extension-graph dmd-graph)
 | 
					              extension-graph dmd-graph list-generations)
 | 
				
			||||||
             (alist-cons 'action action result))
 | 
					             (alist-cons 'action action result))
 | 
				
			||||||
            (else (leave (_ "~a: unknown action~%") action))))))
 | 
					            (else (leave (_ "~a: unknown action~%") action))))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -613,49 +737,7 @@ Build the operating system declared in FILE according to ACTION.\n"))
 | 
				
			||||||
                                         #:argument-handler
 | 
					                                         #:argument-handler
 | 
				
			||||||
                                         parse-sub-command))
 | 
					                                         parse-sub-command))
 | 
				
			||||||
           (args     (option-arguments opts))
 | 
					           (args     (option-arguments opts))
 | 
				
			||||||
           (file     (first args))
 | 
					           (command  (assoc-ref opts 'action)))
 | 
				
			||||||
           (action   (assoc-ref opts 'action))
 | 
					      (process-command command args opts))))
 | 
				
			||||||
           (system   (assoc-ref opts 'system))
 | 
					 | 
				
			||||||
           (os       (if file
 | 
					 | 
				
			||||||
                         (load* file %user-module
 | 
					 | 
				
			||||||
                                #:on-error (assoc-ref opts 'on-error))
 | 
					 | 
				
			||||||
                         (leave (_ "no configuration file specified~%"))))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
           (dry?     (assoc-ref opts 'dry-run?))
 | 
					 | 
				
			||||||
           (grub?    (assoc-ref opts 'install-grub?))
 | 
					 | 
				
			||||||
           (target   (match args
 | 
					 | 
				
			||||||
                       ((first second) second)
 | 
					 | 
				
			||||||
                       (_ #f)))
 | 
					 | 
				
			||||||
           (device   (and grub?
 | 
					 | 
				
			||||||
                          (grub-configuration-device
 | 
					 | 
				
			||||||
                           (operating-system-bootloader os))))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
           (store    (open-connection)))
 | 
					 | 
				
			||||||
      (set-build-options-from-command-line store opts)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      (run-with-store store
 | 
					 | 
				
			||||||
        (mbegin %store-monad
 | 
					 | 
				
			||||||
          (set-guile-for-build (default-guile))
 | 
					 | 
				
			||||||
          (case action
 | 
					 | 
				
			||||||
            ((extension-graph)
 | 
					 | 
				
			||||||
             (export-extension-graph os (current-output-port)))
 | 
					 | 
				
			||||||
            ((dmd-graph)
 | 
					 | 
				
			||||||
             (export-dmd-graph os (current-output-port)))
 | 
					 | 
				
			||||||
            (else
 | 
					 | 
				
			||||||
             (perform-action action os
 | 
					 | 
				
			||||||
                             #:dry-run? dry?
 | 
					 | 
				
			||||||
                             #:derivations-only? (assoc-ref opts
 | 
					 | 
				
			||||||
                                                            'derivations-only?)
 | 
					 | 
				
			||||||
                             #:use-substitutes? (assoc-ref opts 'substitutes?)
 | 
					 | 
				
			||||||
                             #:image-size (assoc-ref opts 'image-size)
 | 
					 | 
				
			||||||
                             #:full-boot? (assoc-ref opts 'full-boot?)
 | 
					 | 
				
			||||||
                             #:mappings (filter-map (match-lambda
 | 
					 | 
				
			||||||
                                                      (('file-system-mapping . m)
 | 
					 | 
				
			||||||
                                                       m)
 | 
					 | 
				
			||||||
                                                      (_ #f))
 | 
					 | 
				
			||||||
                                                    opts)
 | 
					 | 
				
			||||||
                             #:grub? grub?
 | 
					 | 
				
			||||||
                             #:target target #:device device))))
 | 
					 | 
				
			||||||
        #:system system))))
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
;;; system.scm ends here
 | 
					;;; system.scm ends here
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -501,11 +501,11 @@ encoding conversion errors."
 | 
				
			||||||
                            (build-cores (current-processor-count))
 | 
					                            (build-cores (current-processor-count))
 | 
				
			||||||
                            (use-substitutes? #t)
 | 
					                            (use-substitutes? #t)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                            ;; Client-provided substitute URLs.  For
 | 
					                            ;; Client-provided substitute URLs.  If it is #f,
 | 
				
			||||||
                            ;; unprivileged clients, these are considered
 | 
					                            ;; the daemon's settings are used.  Otherwise, it
 | 
				
			||||||
                            ;; "untrusted"; for "trusted" users, they override
 | 
					                            ;; overrides the daemons settings; see 'guix
 | 
				
			||||||
                            ;; the daemon's settings.
 | 
					                            ;; substitute'.
 | 
				
			||||||
                            (substitute-urls %default-substitute-urls))
 | 
					                            (substitute-urls #f))
 | 
				
			||||||
  ;; Must be called after `open-connection'.
 | 
					  ;; Must be called after `open-connection'.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  (define socket
 | 
					  (define socket
 | 
				
			||||||
| 
						 | 
					@ -533,7 +533,10 @@ encoding conversion errors."
 | 
				
			||||||
      (let ((pairs `(,@(if timeout
 | 
					      (let ((pairs `(,@(if timeout
 | 
				
			||||||
                           `(("build-timeout" . ,(number->string timeout)))
 | 
					                           `(("build-timeout" . ,(number->string timeout)))
 | 
				
			||||||
                           '())
 | 
					                           '())
 | 
				
			||||||
                     ("substitute-urls" . ,(string-join substitute-urls)))))
 | 
					                     ,@(if substitute-urls
 | 
				
			||||||
 | 
					                           `(("substitute-urls"
 | 
				
			||||||
 | 
					                              . ,(string-join substitute-urls)))
 | 
				
			||||||
 | 
					                           '()))))
 | 
				
			||||||
        (send (string-pairs pairs))))
 | 
					        (send (string-pairs pairs))))
 | 
				
			||||||
    (let loop ((done? (process-stderr server)))
 | 
					    (let loop ((done? (process-stderr server)))
 | 
				
			||||||
      (or done? (process-stderr server)))))
 | 
					      (or done? (process-stderr server)))))
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										157
									
								
								guix/ui.scm
									
										
									
									
									
								
							
							
						
						
									
										157
									
								
								guix/ui.scm
									
										
									
									
									
								
							| 
						 | 
					@ -34,6 +34,7 @@
 | 
				
			||||||
  #:use-module (guix serialization)
 | 
					  #:use-module (guix serialization)
 | 
				
			||||||
  #:use-module ((guix build utils) #:select (mkdir-p))
 | 
					  #:use-module ((guix build utils) #:select (mkdir-p))
 | 
				
			||||||
  #:use-module ((guix licenses) #:select (license? license-name))
 | 
					  #:use-module ((guix licenses) #:select (license? license-name))
 | 
				
			||||||
 | 
					  #:use-module (gnu system file-systems)
 | 
				
			||||||
  #:use-module (srfi srfi-1)
 | 
					  #:use-module (srfi srfi-1)
 | 
				
			||||||
  #:use-module (srfi srfi-11)
 | 
					  #:use-module (srfi srfi-11)
 | 
				
			||||||
  #:use-module (srfi srfi-19)
 | 
					  #:use-module (srfi srfi-19)
 | 
				
			||||||
| 
						 | 
					@ -60,6 +61,7 @@
 | 
				
			||||||
            warn-about-load-error
 | 
					            warn-about-load-error
 | 
				
			||||||
            show-version-and-exit
 | 
					            show-version-and-exit
 | 
				
			||||||
            show-bug-report-information
 | 
					            show-bug-report-information
 | 
				
			||||||
 | 
					            make-regexp*
 | 
				
			||||||
            string->number*
 | 
					            string->number*
 | 
				
			||||||
            size->number
 | 
					            size->number
 | 
				
			||||||
            show-derivation-outputs
 | 
					            show-derivation-outputs
 | 
				
			||||||
| 
						 | 
					@ -72,7 +74,6 @@
 | 
				
			||||||
            read/eval
 | 
					            read/eval
 | 
				
			||||||
            read/eval-package-expression
 | 
					            read/eval-package-expression
 | 
				
			||||||
            location->string
 | 
					            location->string
 | 
				
			||||||
            switch-symlinks
 | 
					 | 
				
			||||||
            config-directory
 | 
					            config-directory
 | 
				
			||||||
            fill-paragraph
 | 
					            fill-paragraph
 | 
				
			||||||
            texi->plain-text
 | 
					            texi->plain-text
 | 
				
			||||||
| 
						 | 
					@ -80,8 +81,15 @@
 | 
				
			||||||
            string->recutils
 | 
					            string->recutils
 | 
				
			||||||
            package->recutils
 | 
					            package->recutils
 | 
				
			||||||
            package-specification->name+version+output
 | 
					            package-specification->name+version+output
 | 
				
			||||||
 | 
					            specification->file-system-mapping
 | 
				
			||||||
            string->generations
 | 
					            string->generations
 | 
				
			||||||
            string->duration
 | 
					            string->duration
 | 
				
			||||||
 | 
					            matching-generations
 | 
				
			||||||
 | 
					            display-generation
 | 
				
			||||||
 | 
					            display-profile-content
 | 
				
			||||||
 | 
					            roll-back*
 | 
				
			||||||
 | 
					            switch-to-generation*
 | 
				
			||||||
 | 
					            delete-generation*
 | 
				
			||||||
            run-guix-command
 | 
					            run-guix-command
 | 
				
			||||||
            run-guix
 | 
					            run-guix
 | 
				
			||||||
            program-name
 | 
					            program-name
 | 
				
			||||||
| 
						 | 
					@ -343,6 +351,16 @@ General help using GNU software: <http://www.gnu.org/gethelp/>"))
 | 
				
			||||||
                 (list (strerror (car errno)) target)
 | 
					                 (list (strerror (car errno)) target)
 | 
				
			||||||
                 (list errno)))))))
 | 
					                 (list errno)))))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(define (make-regexp* regexp . flags)
 | 
				
			||||||
 | 
					  "Like 'make-regexp' but error out if REGEXP is invalid, reporting the error
 | 
				
			||||||
 | 
					nicely."
 | 
				
			||||||
 | 
					  (catch 'regular-expression-syntax
 | 
				
			||||||
 | 
					    (lambda ()
 | 
				
			||||||
 | 
					      (apply make-regexp regexp flags))
 | 
				
			||||||
 | 
					    (lambda (key proc message . rest)
 | 
				
			||||||
 | 
					      (leave (_ "'~a' is not a valid regular expression: ~a~%")
 | 
				
			||||||
 | 
					             regexp message))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(define (string->number* str)
 | 
					(define (string->number* str)
 | 
				
			||||||
  "Like `string->number', but error out with an error message on failure."
 | 
					  "Like `string->number', but error out with an error message on failure."
 | 
				
			||||||
  (or (string->number str)
 | 
					  (or (string->number str)
 | 
				
			||||||
| 
						 | 
					@ -710,13 +728,6 @@ replacement if PORT is not Unicode-capable."
 | 
				
			||||||
    (($ <location> file line column)
 | 
					    (($ <location> file line column)
 | 
				
			||||||
     (format #f "~a:~a:~a" file line column))))
 | 
					     (format #f "~a:~a:~a" file line column))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(define (switch-symlinks link target)
 | 
					 | 
				
			||||||
  "Atomically switch LINK, a symbolic link, to point to TARGET.  Works
 | 
					 | 
				
			||||||
both when LINK already exists and when it does not."
 | 
					 | 
				
			||||||
  (let ((pivot (string-append link ".new")))
 | 
					 | 
				
			||||||
    (symlink target pivot)
 | 
					 | 
				
			||||||
    (rename-file pivot link)))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
(define (config-directory)
 | 
					(define (config-directory)
 | 
				
			||||||
  "Return the name of the configuration directory, after making sure that it
 | 
					  "Return the name of the configuration directory, after making sure that it
 | 
				
			||||||
exists.  Honor the XDG specs,
 | 
					exists.  Honor the XDG specs,
 | 
				
			||||||
| 
						 | 
					@ -946,6 +957,119 @@ following patterns: \"1d\", \"1w\", \"1m\"."
 | 
				
			||||||
           (hours->duration (* 24 30) match)))
 | 
					           (hours->duration (* 24 30) match)))
 | 
				
			||||||
        (else #f)))
 | 
					        (else #f)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(define* (matching-generations str profile
 | 
				
			||||||
 | 
					                               #:key (duration-relation <=))
 | 
				
			||||||
 | 
					  "Return the list of available generations matching a pattern in STR.  See
 | 
				
			||||||
 | 
					'string->generations' and 'string->duration' for the list of valid patterns.
 | 
				
			||||||
 | 
					When STR is a duration pattern, return all the generations whose ctime has
 | 
				
			||||||
 | 
					DURATION-RELATION with the current time."
 | 
				
			||||||
 | 
					  (define (valid-generations lst)
 | 
				
			||||||
 | 
					    (define (valid-generation? n)
 | 
				
			||||||
 | 
					      (any (cut = n <>) (generation-numbers profile)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    (fold-right (lambda (x acc)
 | 
				
			||||||
 | 
					                  (if (valid-generation? x)
 | 
				
			||||||
 | 
					                      (cons x acc)
 | 
				
			||||||
 | 
					                      acc))
 | 
				
			||||||
 | 
					                '()
 | 
				
			||||||
 | 
					                lst))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  (define (filter-generations generations)
 | 
				
			||||||
 | 
					    (match generations
 | 
				
			||||||
 | 
					      (() '())
 | 
				
			||||||
 | 
					      (('>= n)
 | 
				
			||||||
 | 
					       (drop-while (cut > n <>)
 | 
				
			||||||
 | 
					                   (generation-numbers profile)))
 | 
				
			||||||
 | 
					      (('<= n)
 | 
				
			||||||
 | 
					       (valid-generations (iota n 1)))
 | 
				
			||||||
 | 
					      ((lst ..1)
 | 
				
			||||||
 | 
					       (valid-generations lst))
 | 
				
			||||||
 | 
					      (_ #f)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  (define (filter-by-duration duration)
 | 
				
			||||||
 | 
					    (define (time-at-midnight time)
 | 
				
			||||||
 | 
					      ;; Return TIME at midnight by setting nanoseconds, seconds, minutes, and
 | 
				
			||||||
 | 
					      ;; hours to zeros.
 | 
				
			||||||
 | 
					      (let ((d (time-utc->date time)))
 | 
				
			||||||
 | 
					         (date->time-utc
 | 
				
			||||||
 | 
					          (make-date 0 0 0 0
 | 
				
			||||||
 | 
					                     (date-day d) (date-month d)
 | 
				
			||||||
 | 
					                     (date-year d) (date-zone-offset d)))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    (define generation-ctime-alist
 | 
				
			||||||
 | 
					      (map (lambda (number)
 | 
				
			||||||
 | 
					             (cons number
 | 
				
			||||||
 | 
					                   (time-second
 | 
				
			||||||
 | 
					                    (time-at-midnight
 | 
				
			||||||
 | 
					                     (generation-time profile number)))))
 | 
				
			||||||
 | 
					           (generation-numbers profile)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    (match duration
 | 
				
			||||||
 | 
					      (#f #f)
 | 
				
			||||||
 | 
					      (res
 | 
				
			||||||
 | 
					       (let ((s (time-second
 | 
				
			||||||
 | 
					                 (subtract-duration (time-at-midnight (current-time))
 | 
				
			||||||
 | 
					                                    duration))))
 | 
				
			||||||
 | 
					         (delete #f (map (lambda (x)
 | 
				
			||||||
 | 
					                           (and (duration-relation s (cdr x))
 | 
				
			||||||
 | 
					                                (first x)))
 | 
				
			||||||
 | 
					                         generation-ctime-alist))))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  (cond ((string->generations str)
 | 
				
			||||||
 | 
					         =>
 | 
				
			||||||
 | 
					         filter-generations)
 | 
				
			||||||
 | 
					        ((string->duration str)
 | 
				
			||||||
 | 
					         =>
 | 
				
			||||||
 | 
					         filter-by-duration)
 | 
				
			||||||
 | 
					        (else #f)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(define (display-generation profile number)
 | 
				
			||||||
 | 
					  "Display a one-line summary of generation NUMBER of PROFILE."
 | 
				
			||||||
 | 
					  (unless (zero? number)
 | 
				
			||||||
 | 
					    (let ((header (format #f (_ "Generation ~a\t~a") number
 | 
				
			||||||
 | 
					                          (date->string
 | 
				
			||||||
 | 
					                           (time-utc->date
 | 
				
			||||||
 | 
					                            (generation-time profile number))
 | 
				
			||||||
 | 
					                           "~b ~d ~Y ~T")))
 | 
				
			||||||
 | 
					          (current (generation-number profile)))
 | 
				
			||||||
 | 
					      (if (= number current)
 | 
				
			||||||
 | 
					          (format #t (_ "~a\t(current)~%") header)
 | 
				
			||||||
 | 
					          (format #t "~a~%" header)))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(define (display-profile-content profile number)
 | 
				
			||||||
 | 
					  "Display the packages in PROFILE, generation NUMBER, in a human-readable
 | 
				
			||||||
 | 
					way."
 | 
				
			||||||
 | 
					  (for-each (match-lambda
 | 
				
			||||||
 | 
					              (($ <manifest-entry> name version output location _)
 | 
				
			||||||
 | 
					               (format #t "  ~a\t~a\t~a\t~a~%"
 | 
				
			||||||
 | 
					                       name version output location)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            ;; Show most recently installed packages last.
 | 
				
			||||||
 | 
					            (reverse
 | 
				
			||||||
 | 
					             (manifest-entries
 | 
				
			||||||
 | 
					              (profile-manifest (generation-file-name profile number))))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(define (display-generation-change previous current)
 | 
				
			||||||
 | 
					  (format #t (_ "switched from generation ~a to ~a~%") previous current))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(define (roll-back* store profile)
 | 
				
			||||||
 | 
					  "Like 'roll-back', but display what is happening."
 | 
				
			||||||
 | 
					  (call-with-values
 | 
				
			||||||
 | 
					      (lambda ()
 | 
				
			||||||
 | 
					        (roll-back store profile))
 | 
				
			||||||
 | 
					    display-generation-change))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(define (switch-to-generation* profile number)
 | 
				
			||||||
 | 
					  "Like 'switch-generation', but display what is happening."
 | 
				
			||||||
 | 
					  (let ((previous (switch-to-generation profile number)))
 | 
				
			||||||
 | 
					    (display-generation-change previous number)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(define (delete-generation* store profile generation)
 | 
				
			||||||
 | 
					  "Like 'delete-generation', but display what is going on."
 | 
				
			||||||
 | 
					  (format #t (_ "deleting ~a~%")
 | 
				
			||||||
 | 
					          (generation-file-name profile generation))
 | 
				
			||||||
 | 
					  (delete-generation store profile generation))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(define* (package-specification->name+version+output spec
 | 
					(define* (package-specification->name+version+output spec
 | 
				
			||||||
                                                     #:optional (output "out"))
 | 
					                                                     #:optional (output "out"))
 | 
				
			||||||
  "Parse package specification SPEC and return three value: the specified
 | 
					  "Parse package specification SPEC and return three value: the specified
 | 
				
			||||||
| 
						 | 
					@ -966,6 +1090,23 @@ optionally contain a version number and an output name, as in these examples:
 | 
				
			||||||
                 (package-name->name+version name)))
 | 
					                 (package-name->name+version name)))
 | 
				
			||||||
    (values name version sub-drv)))
 | 
					    (values name version sub-drv)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(define (specification->file-system-mapping spec writable?)
 | 
				
			||||||
 | 
					  "Read the SPEC and return the corresponding <file-system-mapping>.  SPEC is
 | 
				
			||||||
 | 
					a string of the form \"SOURCE\" or \"SOURCE=TARGET\".  The former specifies
 | 
				
			||||||
 | 
					that SOURCE from the host should be mounted at SOURCE in the other system.
 | 
				
			||||||
 | 
					The latter format specifies that SOURCE from the host should be mounted at
 | 
				
			||||||
 | 
					TARGET in the other system."
 | 
				
			||||||
 | 
					  (let ((index (string-index spec #\=)))
 | 
				
			||||||
 | 
					    (if index
 | 
				
			||||||
 | 
					        (file-system-mapping
 | 
				
			||||||
 | 
					         (source (substring spec 0 index))
 | 
				
			||||||
 | 
					         (target (substring spec (+ 1 index)))
 | 
				
			||||||
 | 
					         (writable? writable?))
 | 
				
			||||||
 | 
					        (file-system-mapping
 | 
				
			||||||
 | 
					         (source spec)
 | 
				
			||||||
 | 
					         (target spec)
 | 
				
			||||||
 | 
					         (writable? writable?)))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
;;;
 | 
					;;;
 | 
				
			||||||
;;; Command-line option processing.
 | 
					;;; Command-line option processing.
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,5 +1,6 @@
 | 
				
			||||||
;;; GNU Guix --- Functional package management for GNU
 | 
					;;; GNU Guix --- Functional package management for GNU
 | 
				
			||||||
;;; Copyright © 2010, 2011, 2012, 2013, 2014, 2015 Ludovic Courtès <ludo@gnu.org>
 | 
					;;; Copyright © 2010, 2011, 2012, 2013, 2014, 2015 Ludovic Courtès <ludo@gnu.org>
 | 
				
			||||||
 | 
					;;; Copyright © 2015 Alex Kost <alezost@gmail.com>
 | 
				
			||||||
;;;
 | 
					;;;
 | 
				
			||||||
;;; This file is part of GNU Guix.
 | 
					;;; This file is part of GNU Guix.
 | 
				
			||||||
;;;
 | 
					;;;
 | 
				
			||||||
| 
						 | 
					@ -45,6 +46,7 @@
 | 
				
			||||||
            upstream-updater
 | 
					            upstream-updater
 | 
				
			||||||
            upstream-updater?
 | 
					            upstream-updater?
 | 
				
			||||||
            upstream-updater-name
 | 
					            upstream-updater-name
 | 
				
			||||||
 | 
					            upstream-updater-description
 | 
				
			||||||
            upstream-updater-predicate
 | 
					            upstream-updater-predicate
 | 
				
			||||||
            upstream-updater-latest
 | 
					            upstream-updater-latest
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -109,10 +111,11 @@ correspond to the same version."
 | 
				
			||||||
;;; Auto-update.
 | 
					;;; Auto-update.
 | 
				
			||||||
;;;
 | 
					;;;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(define-record-type <upstream-updater>
 | 
					(define-record-type* <upstream-updater>
 | 
				
			||||||
  (upstream-updater name pred latest)
 | 
					  upstream-updater make-upstream-updater
 | 
				
			||||||
  upstream-updater?
 | 
					  upstream-updater?
 | 
				
			||||||
  (name        upstream-updater-name)
 | 
					  (name        upstream-updater-name)
 | 
				
			||||||
 | 
					  (description upstream-updater-description)
 | 
				
			||||||
  (pred        upstream-updater-predicate)
 | 
					  (pred        upstream-updater-predicate)
 | 
				
			||||||
  (latest      upstream-updater-latest))
 | 
					  (latest      upstream-updater-latest))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -120,7 +123,7 @@ correspond to the same version."
 | 
				
			||||||
  "Return an updater among UPDATERS that matches PACKAGE, or #f if none of
 | 
					  "Return an updater among UPDATERS that matches PACKAGE, or #f if none of
 | 
				
			||||||
them matches."
 | 
					them matches."
 | 
				
			||||||
  (any (match-lambda
 | 
					  (any (match-lambda
 | 
				
			||||||
         (($ <upstream-updater> _ pred latest)
 | 
					         (($ <upstream-updater> _ _ pred latest)
 | 
				
			||||||
          (and (pred package) latest)))
 | 
					          (and (pred package) latest)))
 | 
				
			||||||
       updaters))
 | 
					       updaters))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -74,6 +74,7 @@
 | 
				
			||||||
            arguments-from-environment-variable
 | 
					            arguments-from-environment-variable
 | 
				
			||||||
            file-extension
 | 
					            file-extension
 | 
				
			||||||
            file-sans-extension
 | 
					            file-sans-extension
 | 
				
			||||||
 | 
					            switch-symlinks
 | 
				
			||||||
            call-with-temporary-output-file
 | 
					            call-with-temporary-output-file
 | 
				
			||||||
            call-with-temporary-directory
 | 
					            call-with-temporary-directory
 | 
				
			||||||
            with-atomic-file-output
 | 
					            with-atomic-file-output
 | 
				
			||||||
| 
						 | 
					@ -82,6 +83,7 @@
 | 
				
			||||||
            fold-tree-leaves
 | 
					            fold-tree-leaves
 | 
				
			||||||
            split
 | 
					            split
 | 
				
			||||||
            cache-directory
 | 
					            cache-directory
 | 
				
			||||||
 | 
					            readlink*
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            filtered-port
 | 
					            filtered-port
 | 
				
			||||||
            compressed-port
 | 
					            compressed-port
 | 
				
			||||||
| 
						 | 
					@ -556,6 +558,13 @@ minor version numbers from version-string."
 | 
				
			||||||
        (substring file 0 dot)
 | 
					        (substring file 0 dot)
 | 
				
			||||||
        file)))
 | 
					        file)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(define (switch-symlinks link target)
 | 
				
			||||||
 | 
					  "Atomically switch LINK, a symbolic link, to point to TARGET.  Works
 | 
				
			||||||
 | 
					both when LINK already exists and when it does not."
 | 
				
			||||||
 | 
					  (let ((pivot (string-append link ".new")))
 | 
				
			||||||
 | 
					    (symlink target pivot)
 | 
				
			||||||
 | 
					    (rename-file pivot link)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(define* (string-replace-substring str substr replacement
 | 
					(define* (string-replace-substring str substr replacement
 | 
				
			||||||
                                   #:optional
 | 
					                                   #:optional
 | 
				
			||||||
                                   (start 0)
 | 
					                                   (start 0)
 | 
				
			||||||
| 
						 | 
					@ -710,6 +719,33 @@ elements after E."
 | 
				
			||||||
      (and=> (getenv "HOME")
 | 
					      (and=> (getenv "HOME")
 | 
				
			||||||
             (cut string-append <> "/.cache/guix"))))
 | 
					             (cut string-append <> "/.cache/guix"))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(define (readlink* file)
 | 
				
			||||||
 | 
					  "Call 'readlink' until the result is not a symlink."
 | 
				
			||||||
 | 
					  (define %max-symlink-depth 50)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  (let loop ((file  file)
 | 
				
			||||||
 | 
					             (depth 0))
 | 
				
			||||||
 | 
					    (define (absolute target)
 | 
				
			||||||
 | 
					      (if (absolute-file-name? target)
 | 
				
			||||||
 | 
					          target
 | 
				
			||||||
 | 
					          (string-append (dirname file) "/" target)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    (if (>= depth %max-symlink-depth)
 | 
				
			||||||
 | 
					        file
 | 
				
			||||||
 | 
					        (call-with-values
 | 
				
			||||||
 | 
					            (lambda ()
 | 
				
			||||||
 | 
					              (catch 'system-error
 | 
				
			||||||
 | 
					                (lambda ()
 | 
				
			||||||
 | 
					                  (values #t (readlink file)))
 | 
				
			||||||
 | 
					                (lambda args
 | 
				
			||||||
 | 
					                  (let ((errno (system-error-errno args)))
 | 
				
			||||||
 | 
					                    (if (or (= errno EINVAL))
 | 
				
			||||||
 | 
					                        (values #f file)
 | 
				
			||||||
 | 
					                        (apply throw args))))))
 | 
				
			||||||
 | 
					          (lambda (success? target)
 | 
				
			||||||
 | 
					            (if success?
 | 
				
			||||||
 | 
					                (loop (absolute target) (+ depth 1))
 | 
				
			||||||
 | 
					                file))))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
;;;
 | 
					;;;
 | 
				
			||||||
;;; Source location.
 | 
					;;; Source location.
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -12,6 +12,7 @@ guix/scripts/package.scm
 | 
				
			||||||
guix/scripts/gc.scm
 | 
					guix/scripts/gc.scm
 | 
				
			||||||
guix/scripts/hash.scm
 | 
					guix/scripts/hash.scm
 | 
				
			||||||
guix/scripts/import.scm
 | 
					guix/scripts/import.scm
 | 
				
			||||||
 | 
					guix/scripts/import/cran.scm
 | 
				
			||||||
guix/scripts/import/elpa.scm
 | 
					guix/scripts/import/elpa.scm
 | 
				
			||||||
guix/scripts/pull.scm
 | 
					guix/scripts/pull.scm
 | 
				
			||||||
guix/scripts/substitute.scm
 | 
					guix/scripts/substitute.scm
 | 
				
			||||||
| 
						 | 
					@ -23,6 +24,7 @@ guix/scripts/edit.scm
 | 
				
			||||||
guix/scripts/size.scm
 | 
					guix/scripts/size.scm
 | 
				
			||||||
guix/scripts/graph.scm
 | 
					guix/scripts/graph.scm
 | 
				
			||||||
guix/scripts/challenge.scm
 | 
					guix/scripts/challenge.scm
 | 
				
			||||||
 | 
					guix/gnu-maintenance.scm
 | 
				
			||||||
guix/upstream.scm
 | 
					guix/upstream.scm
 | 
				
			||||||
guix/ui.scm
 | 
					guix/ui.scm
 | 
				
			||||||
guix/http-client.scm
 | 
					guix/http-client.scm
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -167,6 +167,33 @@ guix build -e "(begin
 | 
				
			||||||
guix build -e '#~(mkdir #$output)' -d
 | 
					guix build -e '#~(mkdir #$output)' -d
 | 
				
			||||||
guix build -e '#~(mkdir #$output)' -d | grep 'gexp\.drv'
 | 
					guix build -e '#~(mkdir #$output)' -d | grep 'gexp\.drv'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Building from a package file.
 | 
				
			||||||
 | 
					cat > "$module_dir/package.scm"<<EOF
 | 
				
			||||||
 | 
					(use-modules (gnu))
 | 
				
			||||||
 | 
					(use-package-modules bootstrap)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					%bootstrap-guile
 | 
				
			||||||
 | 
					EOF
 | 
				
			||||||
 | 
					guix build --file="$module_dir/package.scm"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Building from a monadic procedure file.
 | 
				
			||||||
 | 
					cat > "$module_dir/proc.scm"<<EOF
 | 
				
			||||||
 | 
					(use-modules (guix gexp))
 | 
				
			||||||
 | 
					(lambda ()
 | 
				
			||||||
 | 
					  (gexp->derivation "test"
 | 
				
			||||||
 | 
					                    (gexp (mkdir (ungexp output)))))
 | 
				
			||||||
 | 
					EOF
 | 
				
			||||||
 | 
					guix build --file="$module_dir/proc.scm" --dry-run
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Building from a gexp file.
 | 
				
			||||||
 | 
					cat > "$module_dir/gexp.scm"<<EOF
 | 
				
			||||||
 | 
					(use-modules (guix gexp))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(gexp (mkdir (ungexp output)))
 | 
				
			||||||
 | 
					EOF
 | 
				
			||||||
 | 
					guix build --file="$module_dir/gexp.scm" -d
 | 
				
			||||||
 | 
					guix build --file="$module_dir/gexp.scm" -d | grep 'gexp\.drv'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Using 'GUIX_BUILD_OPTIONS'.
 | 
					# Using 'GUIX_BUILD_OPTIONS'.
 | 
				
			||||||
GUIX_BUILD_OPTIONS="--dry-run"
 | 
					GUIX_BUILD_OPTIONS="--dry-run"
 | 
				
			||||||
export GUIX_BUILD_OPTIONS
 | 
					export GUIX_BUILD_OPTIONS
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										76
									
								
								tests/guix-environment-container.sh
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										76
									
								
								tests/guix-environment-container.sh
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,76 @@
 | 
				
			||||||
 | 
					# GNU Guix --- Functional package management for GNU
 | 
				
			||||||
 | 
					# Copyright © 2015 David Thompson <davet@gnu.org>
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# This file is part of GNU Guix.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# GNU Guix is free software; you can redistribute it and/or modify it
 | 
				
			||||||
 | 
					# under the terms of the GNU General Public License as published by
 | 
				
			||||||
 | 
					# the Free Software Foundation; either version 3 of the License, or (at
 | 
				
			||||||
 | 
					# your option) any later version.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# GNU Guix is distributed in the hope that it will be useful, but
 | 
				
			||||||
 | 
					# WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
				
			||||||
 | 
					# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
				
			||||||
 | 
					# GNU General Public License for more details.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# You should have received a copy of the GNU General Public License
 | 
				
			||||||
 | 
					# along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# Test 'guix environment'.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					set -e
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					guix environment --version
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					tmpdir="t-guix-environment-$$"
 | 
				
			||||||
 | 
					trap 'rm -r "$tmpdir"' EXIT
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					mkdir "$tmpdir"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Make sure the exit value is preserved.
 | 
				
			||||||
 | 
					if guix environment --container --ad-hoc --bootstrap guile-bootstrap \
 | 
				
			||||||
 | 
					        -- guile -c '(exit 42)'
 | 
				
			||||||
 | 
					then
 | 
				
			||||||
 | 
					    false
 | 
				
			||||||
 | 
					else
 | 
				
			||||||
 | 
					    test $? = 42
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Make sure that the right directories are mapped.
 | 
				
			||||||
 | 
					mount_test_code="
 | 
				
			||||||
 | 
					(use-modules (ice-9 rdelim)
 | 
				
			||||||
 | 
					             (ice-9 match)
 | 
				
			||||||
 | 
					             (srfi srfi-1))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(define mappings
 | 
				
			||||||
 | 
					  (filter-map (lambda (line)
 | 
				
			||||||
 | 
					                (match (string-split line #\space)
 | 
				
			||||||
 | 
					                  ;; Empty line.
 | 
				
			||||||
 | 
					                  ((\"\") #f)
 | 
				
			||||||
 | 
					                  ;; Ignore these types of file systems.
 | 
				
			||||||
 | 
					                  ((_ _ (or \"tmpfs\" \"proc\" \"sysfs\" \"devtmpfs\"
 | 
				
			||||||
 | 
					                            \"devpts\" \"cgroup\" \"mqueue\") _ _ _)
 | 
				
			||||||
 | 
					                   #f)
 | 
				
			||||||
 | 
					                  ((_ mount _ _ _ _)
 | 
				
			||||||
 | 
					                   mount)))
 | 
				
			||||||
 | 
					              (string-split (call-with-input-file \"/proc/mounts\" read-string)
 | 
				
			||||||
 | 
					                            #\newline)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(for-each (lambda (mount)
 | 
				
			||||||
 | 
					            (display mount)
 | 
				
			||||||
 | 
					            (newline))
 | 
				
			||||||
 | 
					          mappings)"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					guix environment --container --ad-hoc --bootstrap guile-bootstrap \
 | 
				
			||||||
 | 
					     -- guile -c "$mount_test_code" > $tmpdir/mounts
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					cat "$tmpdir/mounts"
 | 
				
			||||||
 | 
					test `wc -l < $tmpdir/mounts` -eq 3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					grep -e "$PWD$" $tmpdir/mounts # current directory
 | 
				
			||||||
 | 
					grep $(guix build guile-bootstrap) $tmpdir/mounts
 | 
				
			||||||
 | 
					grep -e "$NIX_STORE_DIR/.*-bash" $tmpdir/mounts # bootstrap bash
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					rm $tmpdir/mounts
 | 
				
			||||||
| 
						 | 
					@ -97,4 +97,18 @@ then
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Make sure the "debug" output is not listed.
 | 
					    # Make sure the "debug" output is not listed.
 | 
				
			||||||
    if grep -E "$make_boot0_debug" "$tmpdir/a"; then false; else true; fi
 | 
					    if grep -E "$make_boot0_debug" "$tmpdir/a"; then false; else true; fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Compute the build environment for the initial GNU Make, but add in the
 | 
				
			||||||
 | 
					    # bootstrap Guile as an ad-hoc addition.
 | 
				
			||||||
 | 
					    guix environment -e '(@@ (gnu packages commencement) gnu-make-boot0)' \
 | 
				
			||||||
 | 
					         --ad-hoc guile-bootstrap --no-substitutes --search-paths \
 | 
				
			||||||
 | 
					         --pure > "$tmpdir/a"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # Make sure the bootstrap binaries are all listed where they belong.
 | 
				
			||||||
 | 
					    cat $tmpdir/a
 | 
				
			||||||
 | 
					    grep -E '^export PATH=.*-bootstrap-binaries-0/bin'      "$tmpdir/a"
 | 
				
			||||||
 | 
					    grep -E '^export PATH=.*-guile-bootstrap-2.0/bin'       "$tmpdir/a"
 | 
				
			||||||
 | 
					    grep -E '^export CPATH=.*-gcc-bootstrap-0/include'      "$tmpdir/a"
 | 
				
			||||||
 | 
					    grep -E '^export CPATH=.*-glibc-bootstrap-0/include'    "$tmpdir/a"
 | 
				
			||||||
 | 
					    grep -E '^export LIBRARY_PATH=.*-glibc-bootstrap-0/lib' "$tmpdir/a"
 | 
				
			||||||
fi
 | 
					fi
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -167,8 +167,8 @@ a file for NARINFO."
 | 
				
			||||||
  (call-with-narinfo narinfo (lambda () body ...)))
 | 
					  (call-with-narinfo narinfo (lambda () body ...)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
;; Transmit these options to 'guix substitute'.
 | 
					;; Transmit these options to 'guix substitute'.
 | 
				
			||||||
(set! (@@ (guix scripts substitute) %cache-url)
 | 
					(set! (@@ (guix scripts substitute) %cache-urls)
 | 
				
			||||||
      (getenv "GUIX_BINARY_SUBSTITUTE_URL"))
 | 
					  (list (getenv "GUIX_BINARY_SUBSTITUTE_URL")))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(test-equal "query narinfo without signature"
 | 
					(test-equal "query narinfo without signature"
 | 
				
			||||||
  ""                                              ; not substitutable
 | 
					  ""                                              ; not substitutable
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Reference in a new issue