summary refs log tree commit diff
diff options
context:
space:
mode:
authorLudovic Courtès <ludo@gnu.org>2013-03-04 23:27:24 +0100
committerLudovic Courtès <ludo@gnu.org>2013-03-04 23:27:24 +0100
commit81eec00cb221231123b74d14245ef7caa9d89ff6 (patch)
tree3beeb77c5535038dc75db843dd88a1775fb541bb
parent8689a1908a8353b80ed1fcbb81feddc5eb799f24 (diff)
parent2a1e82bb5c2ae28b0018aa765cff6733136b3f70 (diff)
downloadguix-81eec00cb221231123b74d14245ef7caa9d89ff6.tar.gz
Merge branch 'master' into core-updates
Conflicts:
	Makefile.am
	guix/scripts/gc.scm
	guix/scripts/package.scm
	guix/ui.scm
	tests/guix-package.sh
-rw-r--r--Makefile.am7
-rw-r--r--doc/guix.texi25
-rw-r--r--gnu/packages/global.scm17
-rw-r--r--gnu/packages/libdaemon.scm61
-rw-r--r--gnu/packages/libpng.scm6
-rw-r--r--gnu/packages/patches/vpnc-script.patch15
-rw-r--r--gnu/packages/screen.scm2
-rw-r--r--gnu/packages/vpn.scm66
-rw-r--r--gnu/packages/xml.scm34
-rw-r--r--guix/build-system/gnu.scm2
-rw-r--r--guix/build-system/perl.scm103
-rw-r--r--guix/build/perl-build-system.scm61
-rw-r--r--guix/download.scm47
-rw-r--r--guix/scripts/build.scm33
-rw-r--r--guix/scripts/gc.scm56
-rw-r--r--guix/scripts/package.scm24
-rw-r--r--guix/store.scm28
-rw-r--r--guix/ui.scm21
-rw-r--r--release.nix51
-rw-r--r--tests/guix-gc.sh12
-rw-r--r--tests/guix-package.sh15
-rw-r--r--tests/store.scm26
22 files changed, 655 insertions, 57 deletions
diff --git a/Makefile.am b/Makefile.am
index d87e6e0572..c9dcc4a356 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -39,12 +39,14 @@ MODULES =					\
   guix/licenses.scm				\
   guix/build-system.scm				\
   guix/build-system/gnu.scm			\
+  guix/build-system/perl.scm			\
   guix/build-system/trivial.scm			\
   guix/ftp-client.scm				\
   guix/store.scm				\
   guix/ui.scm					\
   guix/build/download.scm			\
   guix/build/gnu-build-system.scm		\
+  guix/build/perl-build-system.scm		\
   guix/build/utils.scm				\
   guix/build/union.scm				\
   guix/packages.scm				\
@@ -99,6 +101,7 @@ MODULES =					\
   gnu/packages/ld-wrapper.scm			\
   gnu/packages/less.scm				\
   gnu/packages/libapr.scm 			\
+  gnu/packages/libdaemon.scm			\
   gnu/packages/libevent.scm			\
   gnu/packages/libffi.scm			\
   gnu/packages/libidn.scm			\
@@ -158,6 +161,7 @@ MODULES =					\
   gnu/packages/tmux.scm 			\
   gnu/packages/tor.scm				\
   gnu/packages/vim.scm 				\
+  gnu/packages/vpn.scm				\
   gnu/packages/wdiff.scm			\
   gnu/packages/wget.scm				\
   gnu/packages/which.scm			\
@@ -216,7 +220,8 @@ dist_patch_DATA =						\
   gnu/packages/patches/shishi-gets-undeclared.patch		\
   gnu/packages/patches/tar-gets-undeclared.patch		\
   gnu/packages/patches/tcsh-fix-autotest.patch 			\
-  gnu/packages/patches/teckit-cstdio.patch
+  gnu/packages/patches/teckit-cstdio.patch			\
+  gnu/packages/patches/vpnc-script.patch
 
 bootstrapdir = $(guilemoduledir)/gnu/packages/bootstrap
 bootstrap_x86_64_linuxdir = $(bootstrapdir)/x86_64-linux
diff --git a/doc/guix.texi b/doc/guix.texi
index 6a9ebab1f6..a07c277e70 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -514,6 +514,19 @@ Thus, when installing MPC, the MPFR and GMP libraries also get installed
 in the profile; removing MPC also removes MPFR and GMP---unless they had
 also been explicitly installed independently.
 
+@item --install-from-expression=@var{exp}
+@itemx -e @var{exp}
+Install the package @var{exp} evaluates to.
+
+@var{exp} must be a Scheme expression that evaluates to a
+@code{<package>} object.  This option is notably useful to disambiguate
+between same-named variants of a package, with expressions such as
+@code{(@@ (gnu packages base) guile-final)}.
+
+Note that this option installs the first output of the specified
+package, which may be insufficient when needing a specific output of a
+multiple-output package.
+
 @item --remove=@var{package}
 @itemx -r @var{package}
 Remove @var{package}.
@@ -657,6 +670,18 @@ store---i.e., files and directories no longer reachable from any root.
 
 @item --list-live
 Show the list of live store files and directories.
+
+@end table
+
+In addition, the references among existing store files can be queried:
+
+@table @code
+
+@item --references
+@itemx --referrers
+List the references (respectively, the referrers) of store files given
+as arguments.
+
 @end table
 
 
diff --git a/gnu/packages/global.scm b/gnu/packages/global.scm
index b604ab6478..6ef36d5aea 100644
--- a/gnu/packages/global.scm
+++ b/gnu/packages/global.scm
@@ -28,15 +28,14 @@
 (define-public global                             ; a global variable
   (package
     (name "global")
-    (version "6.2.7")
-    (source
-     (origin
-      (method url-fetch)
-      (uri (string-append "mirror://gnu/global/global-"
-                          version ".tar.gz"))
-      (sha256
-       (base32
-        "1dr250kz65wqpbms4lhz857mzmvmpmiaxgyqxvxkb4b0s840i14i"))))
+    (version "6.2.8")
+    (source (origin
+             (method url-fetch)
+             (uri (string-append "mirror://gnu/global/global-"
+                                 version ".tar.gz"))
+             (sha256
+              (base32
+               "1l6g51kff5010gwmw08jbks1mssgddz7wggjvfsky3g000jkpvf1"))))
     (build-system gnu-build-system)
     (inputs `(("ncurses" ,ncurses)
               ("libtool" ,libtool)))
diff --git a/gnu/packages/libdaemon.scm b/gnu/packages/libdaemon.scm
new file mode 100644
index 0000000000..0c77e280ac
--- /dev/null
+++ b/gnu/packages/libdaemon.scm
@@ -0,0 +1,61 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2013 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 libdaemon)
+  #:use-module (guix licenses)
+  #:use-module (guix packages)
+  #:use-module (guix download)
+  #:use-module (guix build-system gnu))
+
+(define-public libdaemon
+  (package
+    (name "libdaemon")
+    (version "0.14")
+    (source (origin
+             (method url-fetch)
+             (uri (string-append
+                   "http://0pointer.de/lennart/projects/libdaemon/libdaemon-"
+                   version
+                   ".tar.gz"))
+             (sha256
+              (base32
+               "0d5qlq5ab95wh1xc87rqrh1vx6i8lddka1w3f1zcqvcqdxgyn8zx"))))
+    (build-system gnu-build-system)
+    (home-page "http://0pointer.de/lennart/projects/libdaemon/")
+    (synopsis "Lightweight C library that eases the writing of UNIX daemons")
+    (description
+     "libdaemon is a lightweight C library that eases the writing of UNIX
+daemons. It consists of the following parts:
+
+  • A wrapper around fork() which does the correct daemonization procedure of
+    a process
+
+  • A wrapper around syslog() for simpler and compatible log output to Syslog
+    or STDERR
+
+  • An API for writing PID files
+
+  • An API for serializing UNIX signals into a pipe for usage with select() or
+    poll()
+
+  • An API for running subprocesses with STDOUT and STDERR redirected to
+    syslog.
+
+APIs like these are used in most daemon software available. It is not that
+simple to get it done right and code duplication is not a goal.")
+    (license lgpl2.1+)))
diff --git a/gnu/packages/libpng.scm b/gnu/packages/libpng.scm
index d351ddcbf7..06facc9a9a 100644
--- a/gnu/packages/libpng.scm
+++ b/gnu/packages/libpng.scm
@@ -27,15 +27,15 @@
 (define-public libpng
   (package
    (name "libpng")
-   (version "1.5.13")
+   (version "1.5.14")
    (source (origin
             (method url-fetch)
             (uri (string-append
                    "http://downloads.sourceforge.net/project/libpng/libpng15/"
                    version "/libpng-"
-                   version ".tar.gz"))
+                   version ".tar.xz"))
             (sha256 (base32
-                     "0dbh332qjhm3pa8m4ac73rk7dbbmigbqd3ch084m24ggg9qq4k0d"))))
+                     "0m3vz3gig7s63zanq5b1dgb5ph12qm0cylw4g4fbxlsq3f74hn8l"))))
    (build-system gnu-build-system)
    (inputs `(("zlib" ,zlib)))
    (synopsis "Libpng, a library for handling PNG files")
diff --git a/gnu/packages/patches/vpnc-script.patch b/gnu/packages/patches/vpnc-script.patch
new file mode 100644
index 0000000000..a0d9481952
--- /dev/null
+++ b/gnu/packages/patches/vpnc-script.patch
@@ -0,0 +1,15 @@
+This patch adapts the vpnc script to newer kernel versions, see
+   https://lkml.org/lkml/2011/3/24/645
+
+diff -u a/vpnc-script.in b/vpnc-script.in
+--- a/vpnc-script.in	2013-03-03 13:55:16.000000000 +0100
++++ b/vpnc-script.in	2013-03-03 13:56:11.000000000 +0100
+@@ -116,7 +116,7 @@
+ 
+ if [ -n "$IPROUTE" ]; then
+ 	fix_ip_get_output () {
+-		sed 's/cache//;s/metric \?[0-9]\+ [0-9]\+//g;s/hoplimit [0-9]\+//g'
++		sed 's/cache//;s/metric \?[0-9]\+ [0-9]\+//g;s/hoplimit [0-9]\+//g;s/ipid 0x....//g'
+ 	}
+ 
+ 	set_vpngateway_route() {
diff --git a/gnu/packages/screen.scm b/gnu/packages/screen.scm
index 608e63c7c6..ea1c21716a 100644
--- a/gnu/packages/screen.scm
+++ b/gnu/packages/screen.scm
@@ -31,7 +31,7 @@
     (version "4.0.3")
     (source (origin
              (method url-fetch)
-             (uri (string-append "http://ftp.gnu.org/gnu/screen/screen-"
+             (uri (string-append "mirror://gnu/screen/screen-"
                                  version ".tar.gz"))
              (sha256
               (base32 "0xvckv1ia5pjxk7fs4za6gz2njwmfd54sc464n8ab13096qxbw3q"))))
diff --git a/gnu/packages/vpn.scm b/gnu/packages/vpn.scm
new file mode 100644
index 0000000000..9393e1e7b4
--- /dev/null
+++ b/gnu/packages/vpn.scm
@@ -0,0 +1,66 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2013 Andreas Enge <andreas@enge.fr>
+;;;
+;;; 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 vpn)
+  #:use-module ((guix licenses)
+                #:renamer (symbol-prefix-proc 'license:))
+  #:use-module (guix packages)
+  #:use-module (guix download)
+  #:use-module (guix build-system gnu)
+  #:use-module (gnu packages)
+  #:use-module (gnu packages gnupg)
+  #:use-module (gnu packages perl))
+
+(define-public vpnc
+  (package
+   (name "vpnc")
+   (version "0.5.3")
+   (source (origin
+            (method url-fetch)
+            (uri (string-append "http://www.unix-ag.uni-kl.de/~massar/vpnc/vpnc-"
+                                version ".tar.gz"))
+            (sha256 (base32
+                     "1128860lis89g1s21hqxvap2nq426c9j4bvgghncc1zj0ays7kj6"))))
+   (build-system gnu-build-system)
+   (inputs `(("libgcrypt" ,libgcrypt)
+             ("perl" ,perl)
+             ("patch/script"
+                 ,(search-patch "vpnc-script.patch"))))
+   (arguments
+    `(#:tests? #f ; there is no check target
+      #:patches (list (assoc-ref %build-inputs
+                                 "patch/script"))
+      #:phases
+      (alist-replace
+       'configure
+       (lambda* (#:key outputs #:allow-other-keys)
+         (let ((out (assoc-ref outputs "out")))
+           (substitute* "Makefile"
+             (("PREFIX=/usr/local") (string-append "PREFIX=" out)))
+           (substitute* "Makefile"
+             (("ETCDIR=/etc/vpnc") (string-append "ETCDIR=" out "/etc/vpnc")))))
+       %standard-phases)))
+   (synopsis "vpnc, a client for cisco vpn concentrators")
+   (description
+    "vpnc is a VPN client compatible with Cisco's EasyVPN equipment.
+It supports IPSec (ESP) with Mode Configuration and Xauth. It supports only
+shared-secret IPSec authentication with Xauth, AES (256, 192, 128), 3DES,
+1DES, MD5, SHA1, DH1/2/5 and IP tunneling. It runs entirely in userspace.
+Only \"Universal TUN/TAP device driver support\" is needed in the kernel.")
+   (license license:gpl2+) ; some file are bsd-2, see COPYING
+   (home-page "http://www.unix-ag.uni-kl.de/~massar/vpnc/")))
diff --git a/gnu/packages/xml.scm b/gnu/packages/xml.scm
index 1d7060a044..b3c5f7d512 100644
--- a/gnu/packages/xml.scm
+++ b/gnu/packages/xml.scm
@@ -26,7 +26,8 @@
                 #:renamer (symbol-prefix-proc 'license:))
   #:use-module (guix packages)
   #:use-module (guix download)
-  #:use-module (guix build-system gnu))
+  #:use-module (guix build-system gnu)
+  #:use-module (guix build-system perl))
 
 (define-public expat
   (package
@@ -90,3 +91,34 @@ things the parser might find in the XML document (like start tags).")
      "Libxslt is an XSLT C library developed for the GNOME project. It is
 based on libxml for XML parsing, tree manipulation and XPath support.")
     (license license:x11)))
+
+(define-public perl-xml-parser
+  (package
+    (name "perl-xml-parser")
+    (version "2.41")
+    (source (origin
+             (method url-fetch)
+             (uri (string-append
+                   "mirror://cpan/authors/id/M/MS/MSERGEANT/XML-Parser-"
+                   version ".tar.gz"))
+             (sha256
+              (base32
+               "1sadi505g5qmxr36lgcbrcrqh3a5gcdg32b405gnr8k54b6rg0dl"))))
+    (build-system perl-build-system)
+    (arguments `(#:make-maker-flags
+                 (let ((expat (assoc-ref %build-inputs "expat")))
+                   (list (string-append "EXPATLIBPATH=" expat "/lib")
+                         (string-append "EXPATINCPATH=" expat "/include")))))
+    (inputs `(("expat" ,expat)))
+    (license (package-license perl))
+    (synopsis "Perl bindings to the Expat XML parsing library")
+    (description
+     "This module provides ways to parse XML documents.  It is built on top of
+XML::Parser::Expat, which is a lower level interface to James Clark's expat
+library.  Each call to one of the parsing methods creates a new instance of
+XML::Parser::Expat which is then used to parse the document.  Expat options
+may be provided when the XML::Parser object is created.  These options are
+then passed on to the Expat object on each parse call.  They can also be given
+as extra arguments to the parse methods, in which case they override options
+given at XML::Parser creation time.")
+    (home-page "http://search.cpan.org/~toddr/XML-Parser-2.41/Parser.pm")))
diff --git a/guix/build-system/gnu.scm b/guix/build-system/gnu.scm
index 5be4782c2f..8049e7510f 100644
--- a/guix/build-system/gnu.scm
+++ b/guix/build-system/gnu.scm
@@ -21,13 +21,13 @@
   #:use-module (guix utils)
   #:use-module (guix derivations)
   #:use-module (guix build-system)
-  #:use-module (guix build-system gnu)
   #:use-module (guix packages)
   #:use-module (srfi srfi-1)
   #:use-module (srfi srfi-39)
   #:use-module (ice-9 match)
   #:export (gnu-build
             gnu-build-system
+            standard-inputs
             package-with-explicit-inputs
             package-with-extra-configure-variable
             static-libgcc-package
diff --git a/guix/build-system/perl.scm b/guix/build-system/perl.scm
new file mode 100644
index 0000000000..537c29e799
--- /dev/null
+++ b/guix/build-system/perl.scm
@@ -0,0 +1,103 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2013 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 (guix build-system perl)
+  #:use-module (guix store)
+  #:use-module (guix utils)
+  #:use-module (guix derivations)
+  #:use-module (guix build-system)
+  #:use-module (guix build-system gnu)
+  #:use-module (guix packages)
+  #:use-module (ice-9 match)
+  #:export (perl-build
+            perl-build-system))
+
+;; Commentary:
+;;
+;; Standard build procedure for Perl packages using the "makefile
+;; maker"---i.e., "perl Makefile.PL".  This is implemented as an extension of
+;; `gnu-build-system'.
+;;
+;; Code:
+
+(define* (perl-build store name source inputs
+                     #:key
+                     (perl (@ (gnu packages perl) perl))
+                     (tests? #t)
+                     (make-maker-flags ''())
+                     (phases '(@ (guix build perl-build-system)
+                                 %standard-phases))
+                     (outputs '("out"))
+                     (system (%current-system))
+                     (guile #f)
+                     (imported-modules '((guix build perl-build-system)
+                                         (guix build gnu-build-system)
+                                         (guix build utils)))
+                     (modules '((guix build perl-build-system)
+                                (guix build gnu-build-system)
+                                (guix build utils))))
+  "Build SOURCE using PERL, and with INPUTS.  This assumes that SOURCE
+provides a `Makefile.PL' file as its build system."
+  (define builder
+    `(begin
+       (use-modules ,@modules)
+       (perl-build #:name ,name
+                   #:source ,(if (and source (derivation-path? source))
+                                 (derivation-path->output-path source)
+                                 source)
+                   #:make-maker-flags ,make-maker-flags
+                   #:system ,system
+                   #:test-target "test"
+                   #:tests? ,tests?
+                   #:outputs %outputs
+                   #:inputs %build-inputs)))
+
+  (define guile-for-build
+    (match guile
+      ((? package?)
+       (package-derivation store guile system))
+      ((and (? string?) (? derivation-path?))
+       guile)
+      (#f                                         ; the default
+       (let* ((distro (resolve-interface '(gnu packages base)))
+              (guile  (module-ref distro 'guile-final)))
+         (package-derivation store guile system)))))
+
+  (let ((perl (package-derivation store perl system)))
+    (build-expression->derivation store name system
+                                  builder
+                                  `(,@(if source
+                                          `(("source" ,source))
+                                          '())
+                                    ("perl" ,perl)
+                                    ,@inputs
+
+                                    ;; Keep the standard inputs of
+                                    ;; `gnu-build-system'.
+                                    ,@(standard-inputs system))
+
+                                  #:modules imported-modules
+                                  #:outputs outputs
+                                  #:guile-for-build guile-for-build)))
+
+(define perl-build-system
+  (build-system (name 'perl)
+                (description "The standard Perl build system")
+                (build perl-build)))
+
+;;; perl.scm ends here
diff --git a/guix/build/perl-build-system.scm b/guix/build/perl-build-system.scm
new file mode 100644
index 0000000000..d625ef3ed6
--- /dev/null
+++ b/guix/build/perl-build-system.scm
@@ -0,0 +1,61 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2013 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 (guix build perl-build-system)
+  #:use-module ((guix build gnu-build-system)
+                #:renamer (symbol-prefix-proc 'gnu:))
+  #:use-module (guix build utils)
+  #:use-module (ice-9 match)
+  #:export (%standard-phases
+            perl-build))
+
+;; Commentary:
+;;
+;; Builder-side code of the standard Perl package build procedure.
+;;
+;; Code:
+
+(define* (configure #:key outputs (make-maker-flags '())
+                    #:allow-other-keys)
+  "Configure the given Perl package."
+  (let ((out (assoc-ref outputs "out")))
+    (if (file-exists? "Makefile.PL")
+        (let ((args `("Makefile.PL" ,(string-append "PREFIX=" out)
+                      "INSTALLDIRS=site" ,@make-maker-flags)))
+          (format #t "running `perl' with arguments ~s~%" args)
+          (zero? (apply system* "perl" args)))
+        (error "no Makefile.PL found"))))
+
+(define %standard-phases
+  ;; Everything is as with the GNU Build System except for the `configure'
+  ;; phase.
+  (alist-replace 'configure configure
+                 gnu:%standard-phases))
+
+(define* (perl-build #:key inputs (phases %standard-phases)
+                     #:allow-other-keys #:rest args)
+  "Build the given Perl package, applying all of PHASES in order."
+  (set-path-environment-variable "PERL5LIB" '("lib/perl5/site_perl")
+                                 (match inputs
+                                   (((_ . path) ...)
+                                    path)))
+  (apply gnu:gnu-build
+         #:inputs inputs #:phases phases
+         args))
+
+;;; perl-build-system.scm ends here
diff --git a/guix/download.scm b/guix/download.scm
index 846c9e1e0b..b6bf6a0822 100644
--- a/guix/download.scm
+++ b/guix/download.scm
@@ -1,5 +1,6 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2012, 2013 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2013 Andreas Enge <andreas@enge.fr>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -98,7 +99,51 @@
        "ftp://gd.tuwien.ac.at/pub/infosys/servers/http/apache/dist/"
        "http://apache.belnet.be/"
        "http://mirrors.ircam.fr/pub/apache/"
-       "http://apache-mirror.rbc.ru/pub/apache/"))))
+       "http://apache-mirror.rbc.ru/pub/apache/")
+      (xorg               ; from http://www.x.org/wiki/Releases/Download
+       "http://xorg.freedesktop.org/releases/" ; main mirrors
+       "http://www.x.org/pub/"
+       "ftp://mirror.csclub.uwaterloo.ca/x.org/" ; North America
+       "ftp://xorg.mirrors.pair.com/"
+       "http://mirror.csclub.uwaterloo.ca/x.org/"
+       "http://xorg.mirrors.pair.com/"
+       "http://mirror.us.leaseweb.net/xorg/"
+       "ftp://artfiles.org/x.org/" ; Europe
+       "ftp://ftp.chg.ru/pub/X11/x.org/"
+       "ftp://ftp.fu-berlin.de/unix/X11/FTP.X.ORG/"
+       "ftp://ftp.gwdg.de/pub/x11/x.org/"
+       "ftp://ftp.mirrorservice.org/sites/ftp.x.org/"
+       "ftp://ftp.ntua.gr/pub/X11/"
+       "ftp://ftp.piotrkosoft.net/pub/mirrors/ftp.x.org/"
+       "ftp://ftp.portal-to-web.de/pub/mirrors/x.org/"
+       "ftp://ftp.solnet.ch/mirror/x.org/"
+       "ftp://ftp.sunet.se/pub/X11/"
+       "ftp://gd.tuwien.ac.at/X11/"
+       "ftp://mi.mirror.garr.it/mirrors/x.org/"
+       "ftp://mirror.cict.fr/x.org/"
+       "ftp://mirror.switch.ch/mirror/X11/"
+       "ftp://mirrors.ircam.fr/pub/x.org/"
+       "ftp://x.mirrors.skynet.be/pub/ftp.x.org/"
+       "ftp://ftp.cs.cuhk.edu.hk/pub/X11" ; East Asia
+       "ftp://ftp.u-aizu.ac.jp/pub/x11/x.org/"
+       "ftp://ftp.yz.yamagata-u.ac.jp/pub/X11/x.org/"
+       "ftp://ftp.kaist.ac.kr/x.org/"
+       "ftp://mirrors.go-part.com/xorg/"
+       "http://x.cs.pu.edu.tw/"
+       "ftp://ftp.is.co.za/pub/x.org")            ; South Africa
+      (cpan                              ; from http://www.cpan.org/SITES.html
+       "http://cpan.enstimac.fr/"
+       "ftp://ftp.ciril.fr/pub/cpan/"
+       "ftp://artfiles.org/cpan.org/"
+       "http://www.cpan.org/"
+       "ftp://cpan.rinet.ru/pub/mirror/CPAN/"
+       "http://cpan.cu.be/"
+       "ftp://cpan.inode.at/"
+       "ftp://cpan.iht.co.il/"
+       "ftp://ftp.osuosl.org/pub/CPAN/"
+       "ftp://ftp.nara.wide.ad.jp/pub/CPAN/"
+       "http://mirrors.163.com/cpan/"
+       "ftp://cpan.mirror.ac.za/"))))
 
 (define (gnutls-derivation store system)
   "Return the GnuTLS derivation for SYSTEM."
diff --git a/guix/scripts/build.scm b/guix/scripts/build.scm
index fbd22a9e29..a49bfdbeb8 100644
--- a/guix/scripts/build.scm
+++ b/guix/scripts/build.scm
@@ -38,21 +38,18 @@
 (define %store
   (make-parameter #f))
 
-(define (derivations-from-package-expressions exp system source?)
-  "Eval EXP and return the corresponding derivation path for SYSTEM.
+(define (derivations-from-package-expressions str system source?)
+  "Read/eval STR and return the corresponding derivation path for SYSTEM.
 When SOURCE? is true, return the derivations of the package sources."
-  (let ((p (eval exp (current-module))))
-    (if (package? p)
-        (if source?
-            (let ((source (package-source p))
-                  (loc    (package-location p)))
-              (if source
-                  (package-source-derivation (%store) source)
-                  (leave (_ "~a: error: package `~a' has no source~%")
-                         (location->string loc) (package-name p))))
-            (package-derivation (%store) p system))
-        (leave (_ "expression `~s' does not evaluate to a package~%")
-               exp))))
+  (let ((p (read/eval-package-expression str)))
+    (if source?
+        (let ((source (package-source p))
+              (loc    (package-location p)))
+          (if source
+              (package-source-derivation (%store) source)
+              (leave (_ "~a: error: package `~a' has no source~%")
+                     (location->string loc) (package-name p))))
+        (package-derivation (%store) p system))))
 
 
 ;;;
@@ -119,9 +116,7 @@ Build the given PACKAGE-OR-DERIVATION and return their output paths.\n"))
                   (alist-cons 'derivations-only? #t result)))
         (option '(#\e "expression") #t #f
                 (lambda (opt name arg result)
-                  (alist-cons 'expression
-                              (call-with-input-string arg read)
-                              result)))
+                  (alist-cons 'expression arg result)))
         (option '(#\K "keep-failed") #f #f
                 (lambda (opt name arg result)
                   (alist-cons 'keep-failed? #t result)))
@@ -227,8 +222,8 @@ Build the given PACKAGE-OR-DERIVATION and return their output paths.\n"))
         (let* ((src? (assoc-ref opts 'source?))
                (sys  (assoc-ref opts 'system))
                (drv  (filter-map (match-lambda
-                                  (('expression . exp)
-                                   (derivations-from-package-expressions exp sys
+                                  (('expression . str)
+                                   (derivations-from-package-expressions str sys
                                                                          src?))
                                   (('argument . (? derivation-path? drv))
                                    drv)
diff --git a/guix/scripts/gc.scm b/guix/scripts/gc.scm
index f2d2e17d4b..12d80fd171 100644
--- a/guix/scripts/gc.scm
+++ b/guix/scripts/gc.scm
@@ -20,6 +20,7 @@
   #:use-module (guix ui)
   #:use-module (guix store)
   #:use-module (ice-9 match)
+  #:use-module (ice-9 regex)
   #:use-module (srfi srfi-1)
   #:use-module (srfi srfi-26)
   #:use-module (srfi srfi-37)
@@ -48,6 +49,11 @@ Invoke the garbage collector.\n"))
       --list-live        list live paths"))
   (newline)
   (display (_ "
+      --references       list the references of PATHS"))
+  (display (_ "
+      --referrers        list the referrers of PATHS"))
+  (newline)
+  (display (_ "
   -h, --help             display this help and exit"))
   (display (_ "
   -V, --version          display version information and exit"))
@@ -125,6 +131,14 @@ interpreted."
         (option '("list-live") #f #f
                 (lambda (opt name arg result)
                   (alist-cons 'action 'list-live
+                              (alist-delete 'action result))))
+        (option '("references") #f #f
+                (lambda (opt name arg result)
+                  (alist-cons 'action 'list-references
+                              (alist-delete 'action result))))
+        (option '("referrers") #f #f
+                (lambda (opt name arg result)
+                  (alist-cons 'action 'list-referrers
                               (alist-delete 'action result))))))
 
 
@@ -142,9 +156,37 @@ interpreted."
                  (alist-cons 'argument arg result))
                %default-options))
 
+  (define (symlink-target file)
+    (let ((s (false-if-exception (lstat file))))
+      (if (and s (eq? 'symlink (stat:type s)))
+          (symlink-target (readlink file))
+          file)))
+
+  (define (store-directory file)
+    ;; Return the store directory that holds FILE if it's in the store,
+    ;; otherwise return FILE.
+    (or (and=> (string-match (string-append "^" (regexp-quote (%store-prefix))
+                                            "/([^/]+)")
+                             file)
+               (compose (cut string-append (%store-prefix) "/" <>)
+                        (cut match:substring <> 1)))
+        file))
+
   (with-error-handling
-    (let ((opts  (parse-options))
-          (store (open-connection)))
+    (let* ((opts  (parse-options))
+           (store (open-connection))
+           (paths (filter-map (match-lambda
+                               (('argument . arg) arg)
+                               (_ #f))
+                              opts)))
+      (define (list-relatives relatives)
+        (for-each (compose (lambda (path)
+                             (for-each (cut simple-format #t "~a~%" <>)
+                                       (relatives store path)))
+                           store-directory
+                           symlink-target)
+                  paths))
+
       (case (assoc-ref opts 'action)
         ((collect-garbage)
          (let ((min-freed (assoc-ref opts 'min-freed)))
@@ -152,11 +194,11 @@ interpreted."
                (collect-garbage store min-freed)
                (collect-garbage store))))
         ((delete)
-         (let ((paths (filter-map (match-lambda
-                                   (('argument . arg) arg)
-                                   (_ #f))
-                                  opts)))
-           (delete-paths store paths)))
+         (delete-paths store paths))
+        ((list-references)
+         (list-relatives references))
+        ((list-referrers)
+         (list-relatives referrers))
         ((list-dead)
          (for-each (cut simple-format #t "~a~%" <>)
                    (dead-paths store)))
diff --git a/guix/scripts/package.scm b/guix/scripts/package.scm
index 1f9355ff22..ccca614d88 100644
--- a/guix/scripts/package.scm
+++ b/guix/scripts/package.scm
@@ -281,6 +281,9 @@ Install, remove, or upgrade PACKAGES in a single transaction.\n"))
   (display (_ "
   -i, --install=PACKAGE  install PACKAGE"))
   (display (_ "
+  -e, --install-from-expression=EXP
+                         install the package EXP evaluates to"))
+  (display (_ "
   -r, --remove=PACKAGE   remove PACKAGE"))
   (display (_ "
   -u, --upgrade=REGEXP   upgrade all the installed packages matching REGEXP"))
@@ -325,6 +328,10 @@ Install, remove, or upgrade PACKAGES in a single transaction.\n"))
         (option '(#\i "install") #t #f
                 (lambda (opt name arg result)
                   (alist-cons 'install arg result)))
+        (option '(#\e "install-from-expression") #t #f
+                (lambda (opt name arg result)
+                  (alist-cons 'install (read/eval-package-expression arg)
+                              result)))
         (option '(#\r "remove") #t #f
                 (lambda (opt name arg result)
                   (alist-cons 'remove arg result)))
@@ -490,6 +497,19 @@ Install, remove, or upgrade PACKAGES in a single transaction.\n"))
 
       (delete-duplicates (map input->name+path deps) same?))
 
+    (define (package->tuple p)
+      (let ((path (package-derivation (%store) p))
+            (deps (package-transitive-propagated-inputs p)))
+        `(,(package-name p)
+          ,(package-version p)
+
+          ;; When given a package via `-e', install the first of its
+          ;; outputs (XXX).
+          ,(car (package-outputs p))
+
+          ,path
+          ,(canonicalize-deps deps))))
+
     ;; First roll back if asked to.
     (if (and (assoc-ref opts 'roll-back?) (not dry-run?))
         (begin
@@ -515,6 +535,8 @@ Install, remove, or upgrade PACKAGES in a single transaction.\n"))
                (install  (append
                           upgrade
                           (filter-map (match-lambda
+                                       (('install . (? package? p))
+                                        #f)
                                        (('install . (? store-path?))
                                         #f)
                                        (('install . package)
@@ -530,6 +552,8 @@ Install, remove, or upgrade PACKAGES in a single transaction.\n"))
                                      install))
                (install* (append
                           (filter-map (match-lambda
+                                       (('install . (? package? p))
+                                        (package->tuple p))
                                        (('install . (? store-path? path))
                                         (let-values (((name version)
                                                       (package-name->name+version
diff --git a/guix/store.scm b/guix/store.scm
index 3627d5be04..80b36daf93 100644
--- a/guix/store.scm
+++ b/guix/store.scm
@@ -66,6 +66,10 @@
             substitutable-paths
             substitutable-path-info
 
+            references
+            referrers
+            valid-derivers
+            query-derivation-outputs
             live-paths
             dead-paths
             collect-garbage
@@ -126,7 +130,8 @@
   (query-path-from-hash-part 29)
   (query-substitutable-path-infos 30)
   (query-valid-paths 31)
-  (query-substitutable-paths 32))
+  (query-substitutable-paths 32)
+  (query-valid-derivers 33))
 
 (define-enumerate-type hash-algo
   ;; hash.hh
@@ -597,6 +602,27 @@ name--it is the caller's responsibility to ensure that it is an absolute
 file name.  Return #t on success."
   boolean)
 
+(define references
+  (operation (query-references (store-path path))
+             "Return the list of references of PATH."
+             store-path-list))
+
+(define referrers
+  (operation (query-referrers (store-path path))
+             "Return the list of path that refer to PATH."
+             store-path-list))
+
+(define valid-derivers
+  (operation (query-valid-derivers (store-path path))
+             "Return the list of valid \"derivers\" of PATH---i.e., all the
+.drv present in the store that have PATH among their outputs."
+             store-path-list))
+
+(define query-derivation-outputs  ; avoid name clash with `derivation-outputs'
+  (operation (query-derivation-outputs (store-path path))
+             "Return the list of outputs of PATH, a .drv file."
+             store-path-list))
+
 (define-operation (has-substitutes? (store-path path))
   "Return #t if binary substitutes are available for PATH, and #f otherwise."
   boolean)
diff --git a/guix/ui.scm b/guix/ui.scm
index 7e0c61b4f8..03d881a428 100644
--- a/guix/ui.scm
+++ b/guix/ui.scm
@@ -38,6 +38,7 @@
             show-what-to-build
             call-with-error-handling
             with-error-handling
+            read/eval-package-expression
             location->string
             call-with-temporary-output-file
             switch-symlinks
@@ -116,6 +117,26 @@ General help using GNU software: <http://www.gnu.org/gethelp/>"))
                     (nix-protocol-error-message c))))
     (thunk)))
 
+(define (read/eval-package-expression str)
+  "Read and evaluate STR and return the package it refers to, or exit an
+error."
+  (let ((exp (catch #t
+               (lambda ()
+                 (call-with-input-string str read))
+               (lambda args
+                 (leave (_ "failed to read expression ~s: ~s~%")
+                        str args)))))
+    (let ((p (catch #t
+               (lambda ()
+                 (eval exp the-scm-module))
+               (lambda args
+                 (leave (_ "failed to evaluate expression `~a': ~s~%")
+                        exp args)))))
+      (if (package? p)
+          p
+          (leave (_ "expression `~s' does not evaluate to a package~%")
+                 exp)))))
+
 (define* (show-what-to-build store drv #:optional dry-run?)
   "Show what will or would (depending on DRY-RUN?) be built in realizing the
 derivations listed in DRV.  Return #t if there's something to build, #f
diff --git a/release.nix b/release.nix
index 369d54ed96..5aab8600ab 100644
--- a/release.nix
+++ b/release.nix
@@ -1,5 +1,5 @@
 /* GNU Guix --- Functional package management for GNU
-   Copyright (C) 2012  Ludovic Courtès <ludo@gnu.org>
+   Copyright (C) 2012, 2013  Ludovic Courtès <ludo@gnu.org>
 
    This file is part of GNU Guix.
 
@@ -26,6 +26,28 @@ let
   succeedOnFailure = true;
   keepBuildDirectory = true;
 
+  # Run the given derivation in outside of a chroot.  This hack is used on
+  # hydra.gnu.org where we want Guix derivations to run in a chroot that lacks
+  # /bin, whereas Nixpkgs relies on /bin/sh.
+  unchroot =
+    let
+      pkgs = import nixpkgs {};
+
+      # XXX: The `python' derivation contains a `modules' attribute that makes
+      # `overrideDerivation' fail with "cannot coerce an attribute set (except
+      # a derivation) to a string", so just remove it.
+      pythonKludge = drv: removeAttrs drv [ "modules" ];
+    in
+      drv:
+        if builtins.isAttrs drv
+        then pkgs.lib.overrideDerivation (pythonKludge drv) (args: {
+          __noChroot = true;
+          buildNativeInputs = map unchroot args.buildNativeInputs;
+          propagatedBuildNativeInputs =
+            map unchroot args.propagatedBuildNativeInputs;
+        })
+        else drv;
+
   # The Guile used to bootstrap the whole thing.  It's normally
   # downloaded by the build system, but here we download it via a
   # fixed-output derivation and stuff it into the build tree.
@@ -44,23 +66,35 @@ let
 
   jobs = {
     tarball =
-      let pkgs = import nixpkgs {}; in
+      unchroot
+      (let pkgs = import nixpkgs {}; in
       pkgs.releaseTools.sourceTarball {
         name = "guix-tarball";
         src = <guix>;
-        buildInputs = with pkgs; [ guile sqlite bzip2 git libgcrypt ];
+        buildInputs =
+          let git_light = pkgs.git.override {
+              # Minimal Git to avoid building too many dependencies.
+              withManual = false;
+              pythonSupport = false;
+              svnSupport = false;
+              guiSupport = false;
+            };
+          in
+            [ git_light ] ++
+            (with pkgs; [ guile sqlite bzip2 libgcrypt ]);
         buildNativeInputs = with pkgs; [ texinfo gettext cvs pkgconfig ];
         preAutoconf = ''git config submodule.nix.url "${<nix>}"'';
         configureFlags =
           [ "--with-libgcrypt-prefix=${pkgs.libgcrypt}"
             "--localstatedir=/nix/var"
           ];
-      };
+      });
 
     build =
       { system ? builtins.currentSystem }:
 
-      let pkgs = import nixpkgs { inherit system; }; in
+      unchroot
+      (let pkgs = import nixpkgs { inherit system; }; in
       pkgs.releaseTools.nixBuild {
         name = "guix";
         buildInputs = with pkgs; [ guile sqlite bzip2 libgcrypt ];
@@ -83,13 +117,14 @@ let
 
         inherit succeedOnFailure keepBuildDirectory
           buildOutOfSourceTree;
-      };
+      });
 
 
     build_disable_daemon =
       { system ? builtins.currentSystem }:
 
-      let
+      unchroot
+      (let
         pkgs = import nixpkgs { inherit system; };
         build = jobs.build { inherit system; };
       in
@@ -101,7 +136,7 @@ let
           # the chroot.
           preConfigure = "export NIX_REMOTE=daemon";
           __noChroot = true;
-        });
+        }));
 
     # Jobs to test the distro.
     distro = {
diff --git a/tests/guix-gc.sh b/tests/guix-gc.sh
index a90d085ab2..eac9d82e89 100644
--- a/tests/guix-gc.sh
+++ b/tests/guix-gc.sh
@@ -25,6 +25,18 @@ guix gc --version
 trap "rm -f guix-gc-root" EXIT
 rm -f guix-gc-root
 
+# Check the references of a .drv.
+drv="`guix build guile-bootstrap -d`"
+out="`guix build guile-bootstrap`"
+test -f "$drv" && test -d "$out"
+
+guix gc --references "$drv" | grep -e -bash
+guix gc --references "$out"
+guix gc --references "$out/bin/guile"
+
+if guix gc --references /dev/null;
+then false; else true; fi
+
 # Add then reclaim a .drv file.
 drv="`guix build idutils -d`"
 test -f "$drv"
diff --git a/tests/guix-package.sh b/tests/guix-package.sh
index cf8bc5c7e8..f84893ba0b 100644
--- a/tests/guix-package.sh
+++ b/tests/guix-package.sh
@@ -33,6 +33,10 @@ rm -f "$profile"
 
 trap 'rm "$profile" "$profile-"[0-9]* ; rm -rf t-home-'"$$" EXIT
 
+# Use `-e' with a non-package expression.
+if guix package --bootstrap -e +;
+then false; else true; fi
+
 guix package --bootstrap -p "$profile" -i guile-bootstrap
 test -L "$profile" && test -L "$profile-1-link"
 test -f "$profile/bin/guile"
@@ -46,8 +50,9 @@ test -f "$profile/bin/guile"
 # Check whether we have network access.
 if guile -c '(getaddrinfo "www.gnu.org" "80" AI_NUMERICSERV)' 2> /dev/null
 then
-    boot_make="`guix build -e '(@@ (gnu packages base) gnu-make-boot0)'`"
-    guix package --bootstrap -p "$profile" -i "$boot_make"
+    boot_make="(@@ (gnu packages base) gnu-make-boot0)"
+    boot_make_drv="`guix build -e "$boot_make"`"
+    guix package --bootstrap -p "$profile" -i "$boot_make_drv"
     test -L "$profile-2-link"
     test -f "$profile/bin/make" && test -f "$profile/bin/guile"
 
@@ -94,7 +99,7 @@ then
     done
 
     # Reinstall after roll-back to the empty profile.
-    guix package --bootstrap -p "$profile" -i "$boot_make"
+    guix package --bootstrap -p "$profile" -e "$boot_make"
     test "`readlink_base "$profile"`" = "$profile-1-link"
     test -x "$profile/bin/guile" && ! test -x "$profile/bin/make"
 
@@ -104,7 +109,7 @@ then
     test -x "$profile/bin/guile" && ! test -x "$profile/bin/make"
 
     # Install Make.
-    guix package --bootstrap -p "$profile" -i "$boot_make"
+    guix package --bootstrap -p "$profile" -e "$boot_make"
     test "`readlink_base "$profile"`" = "$profile-2-link"
     test -x "$profile/bin/guile" && test -x "$profile/bin/make"
 
@@ -145,7 +150,7 @@ test -f "$HOME/.guix-profile/bin/guile"
 
 if guile -c '(getaddrinfo "www.gnu.org" "80" AI_NUMERICSERV)' 2> /dev/null
 then
-    guix package --bootstrap -i "$boot_make"
+    guix package --bootstrap -e "$boot_make"
     test -f "$HOME/.guix-profile/bin/make"
     first_environment="`cd $HOME/.guix-profile ; pwd`"
 
diff --git a/tests/store.scm b/tests/store.scm
index c90fd3fed9..c2de99e160 100644
--- a/tests/store.scm
+++ b/tests/store.scm
@@ -23,6 +23,7 @@
   #:use-module (guix base32)
   #:use-module (guix packages)
   #:use-module (guix derivations)
+  #:use-module (gnu packages)
   #:use-module (gnu packages bootstrap)
   #:use-module (ice-9 match)
   #:use-module (srfi srfi-1)
@@ -79,6 +80,31 @@
            (> freed 0)
            (not (file-exists? p))))))
 
+(test-assert "references"
+  (let* ((t1 (add-text-to-store %store "random1"
+                                (random-text) '()))
+         (t2 (add-text-to-store %store "random2"
+                                (random-text) (list t1))))
+    (and (equal? (list t1) (references %store t2))
+         (equal? (list t2) (referrers %store t1))
+         (null? (references %store t1))
+         (null? (referrers %store t2)))))
+
+(test-assert "derivers"
+  (let* ((b (add-text-to-store %store "build" "echo $foo > $out" '()))
+         (s (add-to-store %store "bash" #t "sha256"
+                          (search-bootstrap-binary "bash"
+                                                   (%current-system))))
+         (d (derivation %store "the-thing" (%current-system)
+                        s `("-e" ,b) `(("foo" . ,(random-text)))
+                        `((,b) (,s))))
+         (o (derivation-path->output-path d)))
+    (and (build-derivations %store (list d))
+         (equal? (query-derivation-outputs %store d)
+                 (list o))
+         (equal? (valid-derivers %store o)
+                 (list d)))))
+
 (test-assert "no substitutes"
   (let* ((s  (open-connection))
          (d1 (package-derivation s %bootstrap-guile (%current-system)))