summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--Makefile.am20
-rw-r--r--TODO15
-rw-r--r--build-aux/download.scm5
-rw-r--r--doc/guix.texi6
-rw-r--r--gnu/packages/avahi.scm77
-rw-r--r--gnu/packages/base.scm114
-rw-r--r--gnu/packages/bootstrap.scm9
-rw-r--r--gnu/packages/cflow.scm51
-rw-r--r--gnu/packages/cmake.scm78
-rw-r--r--gnu/packages/cppi.scm45
-rw-r--r--gnu/packages/emacs.scm6
-rw-r--r--gnu/packages/fdisk.scm54
-rw-r--r--gnu/packages/gcc.scm241
-rw-r--r--gnu/packages/glib.scm60
-rw-r--r--gnu/packages/gnupg.scm19
-rw-r--r--gnu/packages/gnutls.scm4
-rw-r--r--gnu/packages/lsof.scm75
-rw-r--r--gnu/packages/lua.scm63
-rw-r--r--gnu/packages/make-bootstrap.scm1
-rw-r--r--gnu/packages/patches/cmake-fix-tests.patch45
-rw-r--r--gnu/packages/patches/emacs-configure-sh.patch11
-rw-r--r--gnu/packages/patches/glib-tests-prlimit.patch14
-rw-r--r--gnu/packages/patches/w3m-fix-compile.patch15
-rw-r--r--gnu/packages/texinfo.scm4
-rw-r--r--gnu/packages/vpn.scm50
-rw-r--r--gnu/packages/w3m.scm81
-rw-r--r--guix/build-system/cmake.scm123
-rw-r--r--guix/build/cmake-build-system.scm63
-rw-r--r--guix/derivations.scm129
-rw-r--r--guix/download.scm6
-rw-r--r--guix/gnu-maintenance.scm225
-rw-r--r--guix/licenses.scm12
-rw-r--r--guix/packages.scm2
-rw-r--r--guix/scripts/download.scm47
-rw-r--r--guix/scripts/package.scm87
-rw-r--r--guix/scripts/pull.scm6
-rw-r--r--guix/snix.scm11
-rw-r--r--guix/store.scm50
-rw-r--r--guix/ui.scm4
-rw-r--r--hydra.scm17
-rw-r--r--release.nix29
-rw-r--r--tests/packages.scm2
42 files changed, 1671 insertions, 305 deletions
diff --git a/Makefile.am b/Makefile.am
index c9dcc4a356..89a8571019 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -38,6 +38,7 @@ MODULES =					\
   guix/gnu-maintenance.scm			\
   guix/licenses.scm				\
   guix/build-system.scm				\
+  guix/build-system/cmake.scm			\
   guix/build-system/gnu.scm			\
   guix/build-system/perl.scm			\
   guix/build-system/trivial.scm			\
@@ -45,6 +46,7 @@ MODULES =					\
   guix/store.scm				\
   guix/ui.scm					\
   guix/build/download.scm			\
+  guix/build/cmake-build-system.scm		\
   guix/build/gnu-build-system.scm		\
   guix/build/perl-build-system.scm		\
   guix/build/utils.scm				\
@@ -58,6 +60,7 @@ MODULES =					\
   gnu/packages/aspell.scm			\
   gnu/packages/attr.scm				\
   gnu/packages/autotools.scm			\
+  gnu/packages/avahi.scm			\
   gnu/packages/base.scm				\
   gnu/packages/bash.scm				\
   gnu/packages/bdb.scm				\
@@ -65,9 +68,12 @@ MODULES =					\
   gnu/packages/bison.scm			\
   gnu/packages/bootstrap.scm			\
   gnu/packages/cdrom.scm			\
+  gnu/packages/cflow.scm			\
   gnu/packages/check.scm			\
+  gnu/packages/cmake.scm			\
   gnu/packages/compression.scm			\
   gnu/packages/cpio.scm				\
+  gnu/packages/cppi.scm				\
   gnu/packages/cross-base.scm			\
   gnu/packages/curl.scm				\
   gnu/packages/cyrus-sasl.scm			\
@@ -75,10 +81,12 @@ MODULES =					\
   gnu/packages/ddrescue.scm			\
   gnu/packages/ed.scm				\
   gnu/packages/emacs.scm			\
+  gnu/packages/fdisk.scm			\
   gnu/packages/file.scm				\
   gnu/packages/flex.scm				\
   gnu/packages/fontutils.scm			\
   gnu/packages/gawk.scm				\
+  gnu/packages/gcc.scm				\
   gnu/packages/gdb.scm				\
   gnu/packages/gdbm.scm				\
   gnu/packages/gettext.scm			\
@@ -116,6 +124,8 @@ MODULES =					\
   gnu/packages/linux-initrd.scm			\
   gnu/packages/lout.scm				\
   gnu/packages/lsh.scm				\
+  gnu/packages/lsof.scm				\
+  gnu/packages/lua.scm				\
   gnu/packages/m4.scm				\
   gnu/packages/mailutils.scm			\
   gnu/packages/make-bootstrap.scm		\
@@ -162,6 +172,7 @@ MODULES =					\
   gnu/packages/tor.scm				\
   gnu/packages/vim.scm 				\
   gnu/packages/vpn.scm				\
+  gnu/packages/w3m.scm				\
   gnu/packages/wdiff.scm			\
   gnu/packages/wget.scm				\
   gnu/packages/which.scm			\
@@ -183,6 +194,7 @@ dist_patch_DATA =						\
   gnu/packages/patches/automake-skip-amhello-tests.patch	\
   gnu/packages/patches/bigloo-gc-shebangs.patch			\
   gnu/packages/patches/binutils-ld-new-dtags.patch		\
+  gnu/packages/patches/cmake-fix-tests.patch			\
   gnu/packages/patches/cpio-gets-undeclared.patch		\
   gnu/packages/patches/diffutils-gets-undeclared.patch		\
   gnu/packages/patches/emacs-configure-sh.patch			\
@@ -194,6 +206,7 @@ dist_patch_DATA =						\
   gnu/packages/patches/gettext-gets-undeclared.patch		\
   gnu/packages/patches/glib-tests-desktop.patch			\
   gnu/packages/patches/glib-tests-homedir.patch			\
+  gnu/packages/patches/glib-tests-prlimit.patch			\
   gnu/packages/patches/glib-tests-timezone.patch		\
   gnu/packages/patches/glibc-bootstrap-system.patch		\
   gnu/packages/patches/glibc-no-ld-so-cache.patch		\
@@ -202,7 +215,7 @@ dist_patch_DATA =						\
   gnu/packages/patches/guile-default-utf8.patch			\
   gnu/packages/patches/guile-linux-syscalls.patch		\
   gnu/packages/patches/guile-relocatable.patch			\
-  gnu/packages/patches/libapr-skip-getservbyname-test.patch 	\
+  gnu/packages/patches/libapr-skip-getservbyname-test.patch	\
   gnu/packages/patches/libevent-dns-tests.patch			\
   gnu/packages/patches/libtool-skip-tests.patch			\
   gnu/packages/patches/lsh-guile-compat.patch			\
@@ -219,9 +232,10 @@ dist_patch_DATA =						\
   gnu/packages/patches/readline-link-ncurses.patch		\
   gnu/packages/patches/shishi-gets-undeclared.patch		\
   gnu/packages/patches/tar-gets-undeclared.patch		\
-  gnu/packages/patches/tcsh-fix-autotest.patch 			\
+  gnu/packages/patches/tcsh-fix-autotest.patch			\
   gnu/packages/patches/teckit-cstdio.patch			\
-  gnu/packages/patches/vpnc-script.patch
+  gnu/packages/patches/vpnc-script.patch			\
+  gnu/packages/patches/w3m-fix-compile.patch
 
 bootstrapdir = $(guilemoduledir)/gnu/packages/bootstrap
 bootstrap_x86_64_linuxdir = $(bootstrapdir)/x86_64-linux
diff --git a/TODO b/TODO
index ecc8e11217..205e1d71af 100644
--- a/TODO
+++ b/TODO
@@ -8,12 +8,6 @@ Copyright © 2012, 2013 Ludovic Courtès <ludo@gnu.org>
 
 * integrate needed Nix code
 
-Guix uses Nix’s daemon (‘nix-worker’, later renamed to ‘nix-daemon’) to
-actually perform builds, scheduling, substitution of pre-built binaries,
-and GC-related tasks.  The daemon mainly uses ‘libstore’ from Nix.
-Integrating it in Guix itself will make Guix self-contained, thereby
-simplifying our users’ lives.
-
 ** Remove dependency on OpenSSL
 
 The ‘openssl’ command-line tool is used in libstore to sign store paths
@@ -51,14 +45,6 @@ For a start, we may use the instance at hydra.nixos.org, generously
 provided by TU Delft.  However, in the future, we may want to setup our
 own instance at gnu.org.
 
-* add guix pull
-
-A tool that fetches the latest code from [[http://git.savannah.gnu.org/cgit/guix.git/snapshot/guix-master.tar.gz][cgit]], builds a derivation that
-unpacks it, copies only .scm files (this excludes guix/config.in) and
-compiles it, and then links to it from ~/.local/guix/latest .  Change
-guix-build and guix-package to have that directory first in their load
-path.
-
 * user interface
 ** Add a package.el (Emacs) back-end
 
@@ -167,7 +153,6 @@ etc.
 See [[https://github.com/NixOS/nixpkgs/commit/d1662d715514e6ef9d3dc29f132f1b3d8e608a18][Shea Levy's `replace-dependency' in Nixpkgs]].
 
 * distro
-** choose a name! (Jinn?)
 ** port to new GNU/Linux platforms, notably ‘mipsel64-linux’
 ** port to GNU/Hurd, aka. ‘i686-gnu’
 
diff --git a/build-aux/download.scm b/build-aux/download.scm
index 62956378ed..c5486f8970 100644
--- a/build-aux/download.scm
+++ b/build-aux/download.scm
@@ -34,6 +34,11 @@
   ;;"http://www.fdn.fr/~lcourtes/software/guix/packages"
   )
 
+;; XXX: Work around <http://bugs.gnu.org/13095>, present in Guile
+;; up to 2.0.7.
+(module-define! (resolve-module '(web client))
+                'shutdown (const #f))
+
 (define (file-name->uri file)
   "Return the URI for FILE."
   (match (string-tokenize file (char-set-complement (char-set #\/)))
diff --git a/doc/guix.texi b/doc/guix.texi
index a07c277e70..1be172c3f6 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -514,6 +514,12 @@ 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.
 
+@c XXX: keep me up-to-date
+Besides, when installing a GNU package, the tool reports the
+availability of a newer upstream version.  In the future, it may provide
+the option of installing directly from the upstream version, even if
+that version is not yet in the distribution.
+
 @item --install-from-expression=@var{exp}
 @itemx -e @var{exp}
 Install the package @var{exp} evaluates to.
diff --git a/gnu/packages/avahi.scm b/gnu/packages/avahi.scm
new file mode 100644
index 0000000000..f7ce908351
--- /dev/null
+++ b/gnu/packages/avahi.scm
@@ -0,0 +1,77 @@
+;;; 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 avahi)
+  #:use-module ((guix licenses) #:select (lgpl2.1+))
+  #:use-module (guix packages)
+  #:use-module (guix download)
+  #:use-module (guix build-system gnu)
+  #:use-module (gnu packages gdbm)
+  #:use-module (gnu packages libdaemon)
+  #:use-module (gnu packages pkg-config)
+  #:use-module (gnu packages glib)
+  #:use-module (gnu packages xml))
+
+(define-public avahi
+  (package
+    (name "avahi")
+    (version "0.6.31")
+    (home-page "http://avahi.org")
+    (source (origin
+             (method url-fetch)
+             (uri (string-append home-page "/download/avahi-"
+                                 version ".tar.gz"))
+             (sha256
+              (base32
+               "0j5b5ld6bjyh3qhd2nw0jb84znq0wqai7fsrdzg7bpg24jdp2wl3"))))
+    (build-system gnu-build-system)
+    (arguments
+     '(#:configure-flags '("--with-distro=none"
+                           "--disable-python"
+                           "--disable-mono"
+                           "--disable-doxygen-doc"
+                           "--disable-xmltoman"
+                           "--enable-tests"
+                           "--disable-qt3" "--disable-qt4"
+                           "--disable-gtk" "--disable-gtk3")
+       #:phases (alist-cons-before
+                 'configure 'set-perl-path
+                 (lambda* (#:key inputs #:allow-other-keys)
+                   ;; FIXME: Remove this phase when proper support for search
+                   ;; paths is available.
+                   (let ((xml-parser (assoc-ref inputs
+                                                "intltool/perl-xml-parser")))
+                     (setenv "PERL5LIB"
+                             (string-append xml-parser
+                                            "/lib/perl5/site_perl"))
+                     #t))
+                 %standard-phases)))
+    (inputs
+     `(("expat" ,expat)
+       ("glib" ,glib)
+       ("dbus" ,dbus)
+       ("libdaemon" ,libdaemon)
+       ("intltool" ,intltool)
+       ("pkg-config" ,pkg-config)
+       ("gdbm" ,gdbm)))
+    (synopsis "Avahi, an mDNS/DNS-SD implementation")
+    (description
+     "Avahi is a system which facilitates service discovery on a local
+network.  It is an implementation of the mDNS (for \"Multicast DNS\") and
+DNS-SD (for \"DNS-Based Service Discovery\") protocols.")
+    (license lgpl2.1+)))
diff --git a/gnu/packages/base.scm b/gnu/packages/base.scm
index cba1f40c76..606e59b851 100644
--- a/gnu/packages/base.scm
+++ b/gnu/packages/base.scm
@@ -24,6 +24,7 @@
   #:use-module (gnu packages bash)
   #:use-module (gnu packages bootstrap)
   #:use-module (gnu packages compression)
+  #:use-module (gnu packages gcc)
   #:use-module (gnu packages gawk)
   #:use-module (gnu packages guile)
   #:use-module (gnu packages multiprecision)
@@ -382,119 +383,6 @@ BFD (Binary File Descriptor) library, `gprof', `nm', `strip', etc.")
    (license gpl3+)
    (home-page "http://www.gnu.org/software/binutils/")))
 
-(define-public gcc-4.7
-  (let ((stripped? #t))                         ; TODO: make this a parameter
-    (package
-     (name "gcc")
-     (version "4.7.2")
-     (source (origin
-              (method url-fetch)
-              (uri (string-append "mirror://gnu/gcc/gcc-"
-                                  version "/gcc-" version ".tar.bz2"))
-              (sha256
-               (base32
-                "115h03hil99ljig8lkrq4qk426awmzh0g99wrrggxf8g07bq74la"))))
-     (build-system gnu-build-system)
-     (inputs `(("gmp" ,gmp)
-               ("mpfr" ,mpfr)
-               ("mpc" ,mpc)))           ; TODO: libelf, ppl, cloog, zlib, etc.
-     (arguments
-      `(#:out-of-source? #t
-        #:strip-binaries? ,stripped?
-        #:configure-flags
-        `("--enable-plugin"
-          "--enable-languages=c,c++"
-          "--disable-multilib"
-
-          "--with-local-prefix=/no-gcc-local-prefix"
-
-          ,(let ((libc (assoc-ref %build-inputs "libc")))
-             (if libc
-                 (string-append "--with-native-system-header-dir=" libc
-                                "/include")
-                 "--without-headers")))
-        #:make-flags
-        (let ((libc (assoc-ref %build-inputs "libc")))
-          `(,@(if libc
-                  (list (string-append "LDFLAGS_FOR_TARGET="
-                                       "-B" libc "/lib "
-                                       "-Wl,-dynamic-linker "
-                                       "-Wl," libc
-                                       ,(glibc-dynamic-linker)))
-                  '())
-            ,(string-append "BOOT_CFLAGS=-O2 "
-                            ,(if stripped? "-g0" "-g"))))
-
-        #:tests? #f
-        #:phases
-        (alist-cons-before
-         'configure 'pre-configure
-         (lambda* (#:key inputs outputs #:allow-other-keys)
-           (let ((out  (assoc-ref outputs "out"))
-                 (libc (assoc-ref inputs "libc")))
-             (when libc
-               ;; The following is not performed for `--without-headers'
-               ;; cross-compiler builds.
-
-               ;; Fix the dynamic linker's file name.
-               (substitute* (find-files "gcc/config"
-                                        "^linux(64|-elf)?\\.h$")
-                 (("#define GLIBC_DYNAMIC_LINKER([^ ]*).*$" _ suffix)
-                  (format #f "#define GLIBC_DYNAMIC_LINKER~a \"~a\"~%"
-                          suffix
-                          (string-append libc ,(glibc-dynamic-linker)))))
-
-               ;; Tell where to find libstdc++, libc, and `?crt*.o', except
-               ;; `crt{begin,end}.o', which come with GCC.
-               (substitute* (find-files "gcc/config"
-                                        "^(gnu-user(64)?|linux-elf)\\.h$")
-                 (("#define LIB_SPEC (.*)$" _ suffix)
-                  ;; Note that with this "lib" spec, we may still add a
-                  ;; RUNPATH to GCC even when `libgcc_s' is not NEEDED.
-                  ;; There's not much that can be done to avoid it, though.
-                  (format #f "#define LIB_SPEC \"-L~a/lib %{!static:-rpath=~a/lib \
-%{!static-libgcc:-rpath=~a/lib64 -rpath=~a/lib}} \" ~a"
-                          libc libc out out suffix))
-                 (("#define STARTFILE_SPEC.*$" line)
-                  (format #f "#define STANDARD_STARTFILE_PREFIX_1 \"~a/lib\"
-#define STANDARD_STARTFILE_PREFIX_2 \"\"
-~a~%"
-                          libc line))))
-
-             ;; Don't retain a dependency on the build-time sed.
-             (substitute* "fixincludes/fixincl.x"
-               (("static char const sed_cmd_z\\[\\] =.*;")
-                "static char const sed_cmd_z[] = \"sed\";"))))
-
-         (alist-cons-after
-          'configure 'post-configure
-          (lambda _
-            ;; Don't store configure flags, to avoid retaining references to
-            ;; build-time dependencies---e.g., `--with-ppl=/nix/store/xxx'.
-            (substitute* "Makefile"
-              (("^TOPLEVEL_CONFIGURE_ARGUMENTS=(.*)$" _ rest)
-               "TOPLEVEL_CONFIGURE_ARGUMENTS=\n")))
-          (alist-replace 'install
-                         (lambda* (#:key outputs #:allow-other-keys)
-                           (zero?
-                            (system* "make"
-                                     ,(if stripped?
-                                          "install-strip"
-                                          "install"))))
-                         %standard-phases)))))
-
-     (properties `((gcc-libc . ,(assoc-ref inputs "libc"))))
-     (synopsis "The GNU Compiler Collection")
-     (description
-      "The GNU Compiler Collection includes compiler front ends for C, C++,
-Objective-C, Fortran, OpenMP for C/C++/Fortran, Java, and Ada, as well as
-libraries for these languages (libstdc++, libgcj, libgomp,...).
-
-GCC development is a part of the GNU Project, aiming to improve the compiler
-used in the GNU system including the GNU/Linux variant.")
-     (license gpl3+)
-     (home-page "http://gcc.gnu.org/"))))
-
 (define-public glibc
   (package
    (name "glibc")
diff --git a/gnu/packages/bootstrap.scm b/gnu/packages/bootstrap.scm
index 809eb84295..82a8db614f 100644
--- a/gnu/packages/bootstrap.scm
+++ b/gnu/packages/bootstrap.scm
@@ -104,7 +104,8 @@ check whether everything is alright."
        ("tarball" ,(bootstrap-origin (source* (%current-system))))))
     (synopsis description*)
     (description #f)
-    (home-page #f)))
+    (home-page #f)
+    (license #f)))
 
 (define package-with-bootstrap-guile
   (memoize
@@ -285,7 +286,8 @@ $out/bin/guile --version~%"
                           "08hv8i0axwnihrcgbz19x0a7s6zyv3yx38x8r29liwl8h82x9g88")))))))))
     (synopsis "Bootstrap binaries and headers of the GNU C Library")
     (description #f)
-    (home-page #f)))
+    (home-page #f)
+    (license lgpl2.1+)))
 
 (define %bootstrap-gcc
   ;; The initial GCC.  Uses binaries from a tarball typically built by
@@ -352,7 +354,8 @@ exec ~a/bin/.gcc-wrapped -B~a/lib \
                           "06wqs0xxnpw3hn0xjb4c9cs0899p1xwkcysa2rvzhvpra0c5vsg2")))))))))
     (synopsis "Bootstrap binaries of the GNU Compiler Collection")
     (description #f)
-    (home-page #f)))
+    (home-page #f)
+    (license gpl3+)))
 
 (define %bootstrap-inputs
   ;; The initial, pre-built inputs.  From now on, we can start building our
diff --git a/gnu/packages/cflow.scm b/gnu/packages/cflow.scm
new file mode 100644
index 0000000000..bb000ddc59
--- /dev/null
+++ b/gnu/packages/cflow.scm
@@ -0,0 +1,51 @@
+;;; 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 cflow)
+  #:use-module (guix packages)
+  #:use-module (guix download)
+  #:use-module (guix build-system gnu)
+  #:use-module (guix licenses)
+  #:use-module (gnu packages emacs))
+
+(define-public cflow
+  (package
+    (name "cflow")
+    (version "1.4")
+    (source (origin
+             (method url-fetch)
+             (uri (string-append "mirror://gnu/cflow/cflow-"
+                                 version ".tar.bz2"))
+             (sha256
+              (base32
+               "1jkbq97ajcf834z68hbn3xfhiz921zhn39gklml1racf0kb3jzh3"))))
+    (build-system gnu-build-system)
+    (home-page "http://www.gnu.org/software/cflow/")
+    (synopsis "A tool to analyze the control flow of C programs")
+    (description
+     "GNU cflow analyzes a collection of C source files and prints a
+graph, charting control flow within the program.
+
+GNU cflow is able to produce both direct and inverted flowgraphs
+for C sources.  Optionally a cross-reference listing can be
+generated.  Two output formats are implemented: POSIX and GNU
+(extended).
+
+The package also provides Emacs major mode for examining the
+produced flowcharts in Emacs.")
+   (license gpl3+)))
diff --git a/gnu/packages/cmake.scm b/gnu/packages/cmake.scm
new file mode 100644
index 0000000000..734f55f330
--- /dev/null
+++ b/gnu/packages/cmake.scm
@@ -0,0 +1,78 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2013 Cyril Roelandt <tipecaml@gmail.com>
+;;;
+;;; 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 cmake)
+  #:use-module (guix licenses)
+  #:use-module (guix packages)
+  #:use-module (guix download)
+  #:use-module (guix build-system gnu)
+  #:use-module (gnu packages)
+  #:use-module (gnu packages file))
+
+(define-public cmake
+  (package
+    (name "cmake")
+    (version "2.8.10.2")
+    (source (origin
+             (method url-fetch)
+             (uri (string-append
+                   "http://www.cmake.org/files/v"
+                   (substring version 0
+                    (string-index version #\. (+ 1 (string-index version #\.))))
+                   "/cmake-" version ".tar.gz"))
+             (sha256
+              (base32 "1c8fj6i2x9sb39wc9av2ighj415mw33cxfrlfpafcvm0knrlylnf"))))
+    (build-system gnu-build-system)
+    (arguments
+     '(#:test-target "test"
+       #:patches (list (assoc-ref %build-inputs "fix-tests"))
+       #:patch-flags '("-p0")
+       #:phases (alist-replace
+                 'configure
+                 (lambda* (#:key outputs #:allow-other-keys)
+                   (let ((out (assoc-ref outputs "out")))
+                     ;; Replace "/bin/sh" by the right path in... a lot of
+                     ;; files.
+                     (substitute*
+                       '("Modules/CompilerId/Xcode-3.pbxproj.in"
+                         "Modules/CompilerId/Xcode-1.pbxproj.in"
+                         "Modules/CompilerId/Xcode-2.pbxproj.in"
+                         "Modules/CPack.RuntimeScript.in"
+                         "Source/cmakexbuild.cxx"
+                         "Source/cmGlobalXCodeGenerator.cxx"
+                         "Source/CTest/cmCTestBatchTestHandler.cxx"
+                         "Source/cmLocalUnixMakefileGenerator3.cxx"
+                         "Utilities/cmbzip2/Makefile-libbz2_so"
+                         "Utilities/Release/release_cmake.cmake"
+                         "Utilities/cmlibarchive/libarchive/archive_write_set_format_shar.c"
+                         "Tests/CMakeLists.txt")
+                       (("/bin/sh") (which "sh")))
+                     (zero? (system* "./configure"
+                             (string-append "--prefix=" out)))))
+                 %standard-phases)))
+    (inputs
+     `(("file" ,file)
+       ("fix-tests" ,(search-patch "cmake-fix-tests.patch"))))
+    (home-page "http://www.cmake.org/")
+    (synopsis "A cross-platform, open-source build system")
+    (description
+     "CMake is a family of tools designed to build, test and package software.
+CMake is used to control the software compilation process using simple platform
+and compiler independent configuration files. CMake generates native makefiles
+and workspaces that can be used in the compiler environment of your choice.")
+    (license bsd-3)))
diff --git a/gnu/packages/cppi.scm b/gnu/packages/cppi.scm
new file mode 100644
index 0000000000..53f24698fc
--- /dev/null
+++ b/gnu/packages/cppi.scm
@@ -0,0 +1,45 @@
+;;; 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 cppi)
+  #:use-module (guix packages)
+  #:use-module (guix download)
+  #:use-module (guix build-system gnu)
+  #:use-module (guix licenses))
+
+(define-public cppi
+  (package
+    (name "cppi")
+    (version "1.18")
+    (source (origin
+             (method url-fetch)
+             (uri (string-append "mirror://gnu/cppi/cppi-"
+                                 version ".tar.xz"))
+             (sha256
+              (base32
+               "1jk42cjaggk71rimjnx3qpmb6hivps0917vl3z7wbxk3i2whb98j"))))
+    (build-system gnu-build-system)
+    (home-page "http://www.gnu.org/software/cppi/")
+    (synopsis "A cpp directive indenter")
+    (description
+     "GNU cppi indents C preprocessor directives to reflect their nesting and
+ensure that there is exactly one space character between each #if, #elif,
+#define directive and the following token.  The number of spaces between the
+`#' and the following directive must correspond to the level of nesting of
+that directive.")
+    (license gpl3+)))
diff --git a/gnu/packages/emacs.scm b/gnu/packages/emacs.scm
index 6b2cda6e73..9a107967a3 100644
--- a/gnu/packages/emacs.scm
+++ b/gnu/packages/emacs.scm
@@ -31,14 +31,14 @@
 (define-public emacs
   (package
     (name "emacs")
-    (version "24.2")
+    (version "24.3")
     (source (origin
              (method url-fetch)
              (uri (string-append "mirror://gnu/emacs/emacs-"
-                                 version ".tar.bz2"))
+                                 version ".tar.xz"))
              (sha256
               (base32
-               "13wbjfjmz13qpjwssy44nw2230lllmkkgjsy0rqfm6am2cf87n3k"))))
+               "1385qzs3bsa52s5rcncbrkxlydkw0ajzrvfxgv8rws5fx512kakh"))))
     (build-system gnu-build-system)
     (arguments
      '(#:configure-flags
diff --git a/gnu/packages/fdisk.scm b/gnu/packages/fdisk.scm
new file mode 100644
index 0000000000..5cf02a9014
--- /dev/null
+++ b/gnu/packages/fdisk.scm
@@ -0,0 +1,54 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2013 Nikita Karetnikov <nikita@karetnikov.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 fdisk)
+  #:use-module ((guix licenses) #:select (gpl3+))
+  #:use-module ((gnu packages gettext)
+                #:renamer (symbol-prefix-proc 'guix:))
+  #:use-module (gnu packages guile)
+  #:use-module (gnu packages linux)
+  #:use-module (gnu packages parted)
+  #:use-module (guix packages)
+  #:use-module (guix download)
+  #:use-module (guix build-system gnu))
+
+(define-public fdisk
+  (package
+    (name "fdisk")
+    (version "2.0.0a")
+    (source
+     (origin
+      (method url-fetch)
+      (uri (string-append "mirror://gnu/fdisk/gnufdisk-"
+                          version ".tar.gz"))
+      (sha256
+       (base32
+        "04nd7civ561x2lwcmxhsqbprml3178jfc58fy1v7hzqg5k4nbhy3"))))
+    (build-system gnu-build-system)
+    (inputs
+     `(("gettext" ,guix:gettext)
+       ("guile" ,guile-1.8)
+       ("util-linux" ,util-linux)
+       ("parted" ,parted)))
+    (home-page "https://www.gnu.org/software/fdisk/")
+    (synopsis
+     "GNU Fdisk, a command-line disk partitioning tool")
+    (description
+     "GNU Fdisk provides alternatives to util-linux fdisk and util-linux
+cfdisk.  It uses GNU Parted.")
+    (license gpl3+)))
\ No newline at end of file
diff --git a/gnu/packages/gcc.scm b/gnu/packages/gcc.scm
new file mode 100644
index 0000000000..a26dc24a4f
--- /dev/null
+++ b/gnu/packages/gcc.scm
@@ -0,0 +1,241 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2012, 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 gcc)
+  #:use-module (guix licenses)
+  #:use-module (gnu packages)
+  #:use-module (gnu packages bootstrap)
+  #:use-module (gnu packages compression)
+  #:use-module (gnu packages multiprecision)
+  #:use-module (guix packages)
+  #:use-module (guix download)
+  #:use-module (guix build-system gnu))
+
+(define %gcc-infrastructure
+  ;; Base URL for GCC's infrastructure.
+  "ftp://gcc.gnu.org/pub/gcc/infrastructure/")
+
+(define-public gcc-4.7
+  (let ((stripped? #t))                         ; TODO: make this a parameter
+    (package
+     (name "gcc")
+     (version "4.7.2")
+     (source (origin
+              (method url-fetch)
+              (uri (string-append "mirror://gnu/gcc/gcc-"
+                                  version "/gcc-" version ".tar.bz2"))
+              (sha256
+               (base32
+                "115h03hil99ljig8lkrq4qk426awmzh0g99wrrggxf8g07bq74la"))))
+     (build-system gnu-build-system)
+     (inputs `(("gmp" ,gmp)
+               ("mpfr" ,mpfr)
+               ("mpc" ,mpc)))           ; TODO: libelf, ppl, cloog, zlib, etc.
+     (arguments
+      `(#:out-of-source? #t
+        #:strip-binaries? ,stripped?
+        #:configure-flags
+        `("--enable-plugin"
+          "--enable-languages=c,c++"
+          "--disable-multilib"
+
+          "--with-local-prefix=/no-gcc-local-prefix"
+
+          ,(let ((libc (assoc-ref %build-inputs "libc")))
+             (if libc
+                 (string-append "--with-native-system-header-dir=" libc
+                                "/include")
+                 "--without-headers")))
+        #:make-flags
+        (let ((libc (assoc-ref %build-inputs "libc")))
+          `(,@(if libc
+                  (list (string-append "LDFLAGS_FOR_TARGET="
+                                       "-B" libc "/lib "
+                                       "-Wl,-dynamic-linker "
+                                       "-Wl," libc
+                                       ,(glibc-dynamic-linker)))
+                  '())
+            ,(string-append "BOOT_CFLAGS=-O2 "
+                            ,(if stripped? "-g0" "-g"))))
+
+        #:tests? #f
+        #:phases
+        (alist-cons-before
+         'configure 'pre-configure
+         (lambda* (#:key inputs outputs #:allow-other-keys)
+           (let ((out  (assoc-ref outputs "out"))
+                 (libc (assoc-ref inputs "libc")))
+             (when libc
+               ;; The following is not performed for `--without-headers'
+               ;; cross-compiler builds.
+
+               ;; Fix the dynamic linker's file name.
+               (substitute* (find-files "gcc/config"
+                                        "^linux(64|-elf)?\\.h$")
+                 (("#define GLIBC_DYNAMIC_LINKER([^ ]*).*$" _ suffix)
+                  (format #f "#define GLIBC_DYNAMIC_LINKER~a \"~a\"~%"
+                          suffix
+                          (string-append libc ,(glibc-dynamic-linker)))))
+
+               ;; Tell where to find libstdc++, libc, and `?crt*.o', except
+               ;; `crt{begin,end}.o', which come with GCC.
+               (substitute* (find-files "gcc/config"
+                                        "^(gnu-user(64)?|linux-elf)\\.h$")
+                 (("#define LIB_SPEC (.*)$" _ suffix)
+                  ;; Note that with this "lib" spec, we may still add a
+                  ;; RUNPATH to GCC even when `libgcc_s' is not NEEDED.
+                  ;; There's not much that can be done to avoid it, though.
+                  (format #f "#define LIB_SPEC \"-L~a/lib %{!static:-rpath=~a/lib \
+%{!static-libgcc:-rpath=~a/lib64 -rpath=~a/lib}} \" ~a"
+                          libc libc out out suffix))
+                 (("#define STARTFILE_SPEC.*$" line)
+                  (format #f "#define STANDARD_STARTFILE_PREFIX_1 \"~a/lib\"
+#define STANDARD_STARTFILE_PREFIX_2 \"\"
+~a~%"
+                          libc line))))
+
+             ;; Don't retain a dependency on the build-time sed.
+             (substitute* "fixincludes/fixincl.x"
+               (("static char const sed_cmd_z\\[\\] =.*;")
+                "static char const sed_cmd_z[] = \"sed\";"))))
+
+         (alist-cons-after
+          'configure 'post-configure
+          (lambda _
+            ;; Don't store configure flags, to avoid retaining references to
+            ;; build-time dependencies---e.g., `--with-ppl=/nix/store/xxx'.
+            (substitute* "Makefile"
+              (("^TOPLEVEL_CONFIGURE_ARGUMENTS=(.*)$" _ rest)
+               "TOPLEVEL_CONFIGURE_ARGUMENTS=\n")))
+          (alist-replace 'install
+                         (lambda* (#:key outputs #:allow-other-keys)
+                           (zero?
+                            (system* "make"
+                                     ,(if stripped?
+                                          "install-strip"
+                                          "install"))))
+                         %standard-phases)))))
+
+     (properties `((gcc-libc . ,(assoc-ref inputs "libc"))))
+     (synopsis "The GNU Compiler Collection")
+     (description
+      "The GNU Compiler Collection includes compiler front ends for C, C++,
+Objective-C, Fortran, OpenMP for C/C++/Fortran, Java, and Ada, as well as
+libraries for these languages (libstdc++, libgcj, libgomp,...).
+
+GCC development is a part of the GNU Project, aiming to improve the compiler
+used in the GNU system including the GNU/Linux variant.")
+     (license gpl3+)
+     (home-page "http://gcc.gnu.org/"))))
+
+(define-public isl
+  (package
+    (name "isl")
+    (version "0.11.1")
+    (source (origin
+             (method url-fetch)
+             (uri (list (string-append
+                         "ftp://ftp.linux.student.kuleuven.be/pub/people/skimo/isl/isl-"
+                         version
+                         ".tar.bz2")
+                        (string-append %gcc-infrastructure
+                                       name "-" version ".tar.gz")))
+             (sha256
+              (base32
+               "13d9cqa5rzhbjq0xf0b2dyxag7pqa72xj9dhsa03m8ccr1a4npq9"))))
+    (build-system gnu-build-system)
+    (inputs `(("gmp" ,gmp)))
+    (home-page "http://www.kotnet.org/~skimo/isl/")
+    (synopsis
+     "A library for manipulating sets and relations of integer points bounded
+by linear constraints")
+    (description
+     "isl is a library for manipulating sets and relations of integer points
+bounded by linear constraints. Supported operations on sets include
+intersection, union, set difference, emptiness check, convex hull, (integer)
+affine hull, integer projection, computing the lexicographic minimum using
+parametric integer programming, coalescing and parametric vertex
+enumeration. It also includes an ILP solver based on generalized basis
+reduction, transitive closures on maps (which may encode infinite graphs),
+dependence analysis and bounds on piecewise step-polynomials.")
+    (license lgpl2.1+)))
+
+(define-public cloog
+  (package
+    (name "cloog")
+    (version "0.18.0")
+    (source
+     (origin
+      (method url-fetch)
+      (uri (list (string-append
+                  "http://www.bastoul.net/cloog/pages/download/count.php3?url=cloog-"
+                  version
+                  ".tar.gz")
+                 (string-append %gcc-infrastructure
+                                name "-" version ".tar.gz")))
+      (sha256
+       (base32
+        "0a12rwfwp22zd0nlld0xyql11cj390rrq1prw35yjsw8wzfshjhw"))
+      (file-name (string-append name "-" version ".tar.gz"))))
+    (build-system gnu-build-system)
+    (inputs `(("gmp" ,gmp)
+              ("isl" ,isl)))
+    (arguments '(#:configure-flags '("--with-isl=system")))
+    (home-page "http://www.cloog.org/")
+    (synopsis "A library to generate code for scanning Z-polyhedra")
+    (description
+     "CLooG is a free software library to generate code for scanning
+Z-polyhedra.  That is, it finds a code (e.g., in C, FORTRAN...) that
+reaches each integral point of one or more parameterized polyhedra.
+CLooG has been originally written to solve the code generation problem
+for optimizing compilers based on the polytope model.  Nevertheless it
+is used now in various area e.g., to build control automata for
+high-level synthesis or to find the best polynomial approximation of a
+function.  CLooG may help in any situation where scanning polyhedra
+matters.  While the user has full control on generated code quality,
+CLooG is designed to avoid control overhead and to produce a very
+effective code.")
+    (license gpl2+)))
+
+(define-public libelf
+  (package
+    (name "libelf")
+    (version "0.8.13")
+    (source (origin
+             (method url-fetch)
+             (uri (string-append "http://www.mr511.de/software/libelf-"
+                                 version ".tar.gz"))
+             (sha256
+              (base32
+               "0vf7s9dwk2xkmhb79aigqm0x0yfbw1j0b9ksm51207qwr179n6jr"))))
+    (build-system gnu-build-system)
+    (arguments '(#:phases (alist-replace
+                           'configure
+                           (lambda* (#:key outputs #:allow-other-keys)
+                             ;; This old `configure' script doesn't support
+                             ;; variables passed as arguments.
+                             (let ((out (assoc-ref outputs "out")))
+                               (setenv "CONFIG_SHELL" (which "bash"))
+                               (zero?
+                                (system* "./configure"
+                                         (string-append "--prefix=" out)))))
+                           %standard-phases)))
+    (home-page "http://www.mr511.de/software/english.html")
+    (synopsis "An ELF object file access library")
+    (description "libelf is a C library to access ELF object files.")
+    (license lgpl2.0+)))
diff --git a/gnu/packages/glib.scm b/gnu/packages/glib.scm
index 1286700911..fdcc9bdc31 100644
--- a/gnu/packages/glib.scm
+++ b/gnu/packages/glib.scm
@@ -18,7 +18,7 @@
 ;;; along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>.
 
 (define-module (gnu packages glib)
-  #:use-module ((guix licenses) #:select (lgpl2.0+ gpl2+))
+  #:use-module ((guix licenses) #:select (lgpl2.0+ gpl2+ gpl2))
   #:use-module (guix packages)
   #:use-module (guix download)
   #:use-module (guix build-system gnu)
@@ -76,7 +76,7 @@ shared NFS home directories.")
    (version "2.34.3")
    (source (origin
             (method url-fetch)
-            (uri (string-append "http://ftp.gnome.org/pub/gnome/sources/"
+            (uri (string-append "mirror://gnome/sources/"
                                 name "/2.34/"
                                 name "-" version ".tar.xz"))
             (sha256
@@ -99,11 +99,14 @@ shared NFS home directories.")
       ("patch/tests-homedir"
        ,(search-patch "glib-tests-homedir.patch"))
       ("patch/tests-desktop"
-       ,(search-patch "glib-tests-desktop.patch"))))
+       ,(search-patch "glib-tests-desktop.patch"))
+      ("patch/tests-prlimit"
+       ,(search-patch "glib-tests-prlimit.patch"))))
    (arguments
     '(#:patches (list (assoc-ref %build-inputs "patch/tests-tzdata")
                       (assoc-ref %build-inputs "patch/tests-homedir")
-                      (assoc-ref %build-inputs "patch/tests-desktop"))
+                      (assoc-ref %build-inputs "patch/tests-desktop")
+                      (assoc-ref %build-inputs "patch/tests-prlimit"))
       #:phases (alist-cons-before
                 'build 'pre-build
                 (lambda* (#:key inputs outputs #:allow-other-keys)
@@ -124,3 +127,52 @@ and interfaces for such runtime functionality as an event loop, threads,
 dynamic loading, and an object system.")
    (home-page "http://developer.gnome.org/glib/")
    (license lgpl2.0+)))                        ; some files are under lgpl2.1+
+
+(define-public intltool
+  (package
+    (name "intltool")
+    (version "0.40.6")
+    (source (origin
+             (method url-fetch)
+             (uri (string-append
+                   "mirror://gnome/sources/intltool/0.40/intltool-"
+                   version
+                   ".tar.bz2"))
+             (sha256
+              (base32
+               "0r1vkvy5xzqk01yl6a0xlrry39bra24alkrx6279b77hc62my7jd"))))
+    (build-system gnu-build-system)
+    (arguments
+     '(#:phases (alist-cons-before
+                 'configure 'set-perl-path
+                 (lambda* (#:key inputs #:allow-other-keys)
+                   ;; FIXME: Remove this phase when proper support for search
+                   ;; paths is available.
+                   (let ((xml-parser (assoc-ref inputs "perl-xml-parser")))
+                     (setenv "PERL5LIB"
+                             (string-append xml-parser
+                                            "/lib/perl5/site_perl"))
+                     #t))
+                 %standard-phases)))
+    (native-inputs `(("pkg-config" ,pkg-config)))
+    (propagated-inputs
+     `(("gettext" ,guix:gettext)
+       ("perl-xml-parser" ,xml:perl-xml-parser)
+       ("perl" ,perl)))
+    (home-page "http://freedesktop.org/wiki/Software/intltool")
+    (synopsis "Tools to centralize translation of many different file formats")
+    (description
+     "intltool is a set of tools to centralize translation of many different
+file formats using GNU gettext-compatible PO files.
+
+The intltool collection can be used to do these things:
+
+    Extract translatable strings from various source files (.xml.in,
+    glade, .desktop.in, .server.in, .oaf.in).
+
+    Collect the extracted strings together with messages from traditional
+    source files (.c, .h) in po/$(PACKAGE).pot.
+
+    Merge back the translations from .po files into .xml, .desktop and
+    oaf files. This merge step will happen at build resp. installation time.")
+    (license gpl2)))
diff --git a/gnu/packages/gnupg.scm b/gnu/packages/gnupg.scm
index f26582fb22..1810b65fe8 100644
--- a/gnu/packages/gnupg.scm
+++ b/gnu/packages/gnupg.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2012 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2012, 2013 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2013 Andreas Enge <andreas@enge.fr>
 ;;;
 ;;; This file is part of GNU Guix.
@@ -57,15 +57,14 @@ Daemon and possibly more in the future.")
 (define-public libgcrypt
   (package
     (name "libgcrypt")
-    (version "1.5.0")
-    (source
-     (origin
-      (method url-fetch)
-      (uri (string-append "mirror://gnupg/libgcrypt/libgcrypt-"
-                          version ".tar.bz2"))
-      (sha256
-       (base32
-        "1ykkh7dm0gyndz7bbpvn3agijj8xb2h02m02f42hm504c18zqqjb"))))
+    (version "1.5.1")
+    (source (origin
+             (method url-fetch)
+             (uri (string-append "mirror://gnupg/libgcrypt/libgcrypt-"
+                                 version ".tar.bz2"))
+             (sha256
+              (base32
+               "09z5zbxhvg6c7n8qcm8h9ygr28qli2n83hfq1f69jsg711cb37md"))))
     (build-system gnu-build-system)
     (propagated-inputs
      `(("libgpg-error" ,libgpg-error)))
diff --git a/gnu/packages/gnutls.scm b/gnu/packages/gnutls.scm
index 0a681e3a88..dc571adc60 100644
--- a/gnu/packages/gnutls.scm
+++ b/gnu/packages/gnutls.scm
@@ -52,7 +52,7 @@ portable, and only require an ANSI C89 platform.")
 (define-public gnutls
   (package
     (name "gnutls")
-    (version "3.1.6")
+    (version "3.1.9.1")
     (source (origin
              (method url-fetch)
              (uri
@@ -62,7 +62,7 @@ portable, and only require an ANSI C89 platform.")
                              version ".tar.xz"))
              (sha256
               (base32
-               "0zsybr9plllk1phh83bx9bg7c5ccik427j4n3k1s9fiy4j69n0w3"))))
+               "0gkwhz7sypfy39jfj2yzrngbxq5j9l9smqc89mqlqsh25spc8009"))))
     (build-system gnu-build-system)
     (inputs
      `(("guile" ,guile-2.0)
diff --git a/gnu/packages/lsof.scm b/gnu/packages/lsof.scm
new file mode 100644
index 0000000000..d0cdefd533
--- /dev/null
+++ b/gnu/packages/lsof.scm
@@ -0,0 +1,75 @@
+;;; 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 lsof)
+  #: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 perl))
+
+(define-public lsof
+  (package
+   (name "lsof")
+   (version "4.87")
+   (source (origin
+            (method url-fetch)
+            (uri (string-append "ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/lsof_"
+                                version ".tar.bz2"))
+            (sha256 (base32
+                     "0b6si72sml7gr9784ak491cxxbm9mx5bh174yg6rrirbv04kgpfz"))))
+   (build-system gnu-build-system)
+   (inputs `(("perl" ,perl)))
+   (arguments
+    `(#:tests? #f ; no test target
+      #:phases
+      (alist-replace
+       'unpack
+       (lambda* (#:key source name version #:allow-other-keys)
+         (let ((unpack (assoc-ref %standard-phases 'unpack)))
+           (apply unpack (list #:source source))
+           (apply unpack (list #:source (car (find-files "." "\\.tar$"))))))
+      (alist-replace
+       'configure
+       (lambda* (#:key #:allow-other-keys)
+         (setenv "LSOF_CC" "gcc")
+         (setenv "LSOF_MAKE" "make")
+         (system* "./Configure" "linux"))
+      (alist-replace
+       'install
+       (lambda* (#:key outputs #:allow-other-keys)
+         (let ((out (assoc-ref outputs "out")))
+           (mkdir out)
+           (mkdir (string-append out "/bin"))
+           (copy-file "lsof" (string-append out "/bin/lsof"))
+           (mkdir (string-append out "/share"))
+           (mkdir (string-append out "/share/man"))
+           (mkdir (string-append out "/share/man/man8"))
+           (copy-file "lsof.8" (string-append out "/share/man/man8/lsof.8"))
+         ))
+       %standard-phases)))))
+   (synopsis "lsof displays information about open files")
+   (description
+    "Lsof stands for LiSt Open Files, and it does just that.
+It lists information about files that are open by the processes running
+on the system.")
+   (license (license:fsf-free
+             "file://00FAQ"
+             "License inspired by zlib, see point 1.9 of 00FAQ in the distribution."))
+   (home-page "http://people.freebsd.org/~abe/")))
diff --git a/gnu/packages/lua.scm b/gnu/packages/lua.scm
new file mode 100644
index 0000000000..14fc28ced0
--- /dev/null
+++ b/gnu/packages/lua.scm
@@ -0,0 +1,63 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2013 Cyril Roelandt <tipecaml@gmail.com>
+;;;
+;;; 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 lua)
+  #:use-module (guix licenses)
+  #:use-module (guix packages)
+  #:use-module (guix download)
+  #:use-module (guix build-system gnu)
+  #:use-module (gnu packages)
+  #:use-module (gnu packages readline))
+
+(define-public lua
+  (package
+    (name "lua")
+    (version "5.2.1")
+    (source (origin
+             (method url-fetch)
+             (uri (string-append "http://www.lua.org/ftp/lua-"
+                                 version ".tar.gz"))
+             (sha256
+              (base32 "1rbv2ysq5fdksz7xg07dnrkl8i0gnx855hg4z6b324vng6l4sc34"))))
+    (build-system gnu-build-system)
+    (inputs `(("readline", readline)))
+    (arguments
+     '(#:modules ((guix build gnu-build-system)
+                    (guix build utils)
+                    (srfi srfi-1))
+       #:test-target "test"
+       #:phases (alist-replace
+                 'build
+                 (lambda _ (zero? (system* "make" "linux"))) ; XXX: Other OS.
+                 (alist-replace
+                  'install
+                  (lambda* (#:key outputs #:allow-other-keys)
+                    (let ((out (assoc-ref outputs "out")))
+                      (zero? (system
+                              (string-append "make install INSTALL_TOP=" out)))))
+                  (alist-delete 'configure %standard-phases)))))
+    (home-page "http://www.lua.org/")
+    (synopsis "An embeddable scripting language.")
+    (description
+     "Lua is a powerful, fast, lightweight, embeddable scripting language.  Lua
+combines simple procedural syntax with powerful data description constructs
+based on associative arrays and extensible semantics. Lua is dynamically typed,
+runs by interpreting bytecode for a register-based virtual machine, and has
+automatic memory management with incremental garbage collection, making it ideal
+for configuration, scripting, and rapid prototyping.")
+    (license x11)))
diff --git a/gnu/packages/make-bootstrap.scm b/gnu/packages/make-bootstrap.scm
index 3bb926bd36..40e3e21210 100644
--- a/gnu/packages/make-bootstrap.scm
+++ b/gnu/packages/make-bootstrap.scm
@@ -27,6 +27,7 @@
   #:use-module (gnu packages bash)
   #:use-module (gnu packages compression)
   #:use-module (gnu packages gawk)
+  #:use-module (gnu packages gcc)
   #:use-module (gnu packages guile)
   #:use-module (gnu packages bdw-gc)
   #:use-module (gnu packages linux)
diff --git a/gnu/packages/patches/cmake-fix-tests.patch b/gnu/packages/patches/cmake-fix-tests.patch
new file mode 100644
index 0000000000..ae28ca336b
--- /dev/null
+++ b/gnu/packages/patches/cmake-fix-tests.patch
@@ -0,0 +1,45 @@
+--- Tests/CMakeLists.txt	2013-03-20 22:57:13.000000000 +0100
++++ Tests/CMakeLists.txt	2013-03-20 22:58:02.000000000 +0100
+@@ -1706,16 +1706,17 @@
+     PASS_REGULAR_EXPRESSION "Could not find executable"
+     FAIL_REGULAR_EXPRESSION "SegFault")
+ 
+-  configure_file(
+-    "${CMake_SOURCE_DIR}/Tests/CTestTestUpload/test.cmake.in"
+-    "${CMake_BINARY_DIR}/Tests/CTestTestUpload/test.cmake"
+-    @ONLY ESCAPE_QUOTES)
+-  add_test(CTestTestUpload ${CMAKE_CTEST_COMMAND}
+-    -S "${CMake_BINARY_DIR}/Tests/CTestTestUpload/test.cmake" -V
+-    --output-log "${CMake_BINARY_DIR}/Tests/CTestTestUpload/testOut.log"
+-    )
+-  set_tests_properties(CTestTestUpload PROPERTIES
+-    PASS_REGULAR_EXPRESSION "Upload\\.xml")
++# This test requires network connectivity: skip it.
++#  configure_file(
++#    "${CMake_SOURCE_DIR}/Tests/CTestTestUpload/test.cmake.in"
++#    "${CMake_BINARY_DIR}/Tests/CTestTestUpload/test.cmake"
++#    @ONLY ESCAPE_QUOTES)
++#  add_test(CTestTestUpload ${CMAKE_CTEST_COMMAND}
++#    -S "${CMake_BINARY_DIR}/Tests/CTestTestUpload/test.cmake" -V
++#    --output-log "${CMake_BINARY_DIR}/Tests/CTestTestUpload/testOut.log"
++#    )
++#  set_tests_properties(CTestTestUpload PROPERTIES
++#    PASS_REGULAR_EXPRESSION "Upload\\.xml")
+ 
+   configure_file(
+     "${CMake_SOURCE_DIR}/Tests/CTestTestConfigFileInBuildDir/test1.cmake.in"
+--- Utilities/cmcurl/CMakeLists.txt	2013-03-20 22:57:13.000000000 +0100
++++ Utilities/cmcurl/CMakeLists.txt	2013-03-20 23:08:41.000000000 +0100
+@@ -729,8 +729,9 @@
+ ADD_EXECUTABLE(LIBCURL Testing/curltest.c)
+ TARGET_LINK_LIBRARIES(LIBCURL cmcurl ${CMAKE_DL_LIBS})
+ 
+-IF(CMAKE_CURL_TEST_URL)
+-  ADD_TEST(curl LIBCURL ${CMAKE_CURL_TEST_URL})
+-ENDIF(CMAKE_CURL_TEST_URL)
++# This test requires network connectivity: skip it.
++#IF(CMAKE_CURL_TEST_URL)
++#  ADD_TEST(curl LIBCURL ${CMAKE_CURL_TEST_URL})
++#ENDIF(CMAKE_CURL_TEST_URL)
+ 
+ INSTALL(FILES COPYING DESTINATION ${CMake_DOC_DEST}/cmcurl)
diff --git a/gnu/packages/patches/emacs-configure-sh.patch b/gnu/packages/patches/emacs-configure-sh.patch
index fd34d06ced..6f5f3fe93a 100644
--- a/gnu/packages/patches/emacs-configure-sh.patch
+++ b/gnu/packages/patches/emacs-configure-sh.patch
@@ -1,14 +1,13 @@
 Make sure the right shell is used when creating src/epaths.h.
 
---- emacs-24.2/configure	2013-01-13 17:01:53.000000000 +0100
-+++ emacs-24.2/configure	2013-01-13 17:01:57.000000000 +0100
-@@ -24135,7 +24135,7 @@ done
+--- emacs-24.3/configure	2013-03-14 17:42:26.000000000 +0100
++++ emacs-24.3/configure	2013-03-14 17:42:58.000000000 +0100
+@@ -26463,7 +26463,7 @@ done
   ;;
      "epaths":C)
  echo creating src/epaths.h
--${MAKE-make} epaths-force
-+${MAKE-make} epaths-force SHELL="$CONFIG_SHELL"
+-${MAKE-make} MAKEFILE_NAME=do-not-make-Makefile epaths-force
++${MAKE-make} MAKEFILE_NAME=do-not-make-Makefile epaths-force SHELL="$CONFIG_SHELL"
   ;;
      "gdbinit":C)
  if test ! -f src/.gdbinit && test -f $srcdir/src/.gdbinit; then
-
diff --git a/gnu/packages/patches/glib-tests-prlimit.patch b/gnu/packages/patches/glib-tests-prlimit.patch
new file mode 100644
index 0000000000..f2b2a61bee
--- /dev/null
+++ b/gnu/packages/patches/glib-tests-prlimit.patch
@@ -0,0 +1,14 @@
+prlimit(2) returns ENOSYS on Linux 2.6.32-5-xen-amd64 as found on
+hydra.gnu.org, and strace(1) doesn't recognize it.
+
+--- glib-2.34.3/glib/tests/thread.c	2012-11-20 15:27:12.000000000 +0100
++++ glib-2.34.3/glib/tests/thread.c	2013-03-27 14:48:31.000000000 +0100
+@@ -130,7 +130,7 @@ test_thread3 (void)
+ static void
+ test_thread4 (void)
+ {
+-#ifdef HAVE_PRLIMIT
++#if 0
+   struct rlimit ol, nl;
+   GThread *thread;
+   GError *error;
diff --git a/gnu/packages/patches/w3m-fix-compile.patch b/gnu/packages/patches/w3m-fix-compile.patch
new file mode 100644
index 0000000000..5604052f67
--- /dev/null
+++ b/gnu/packages/patches/w3m-fix-compile.patch
@@ -0,0 +1,15 @@
+https://bugs.archlinux.org/task/33397
+
+diff -aur old/main.c new/main.c
+--- main.c	2013-01-14 18:16:14.216210053 -0600
++++ main.c	2013-01-14 18:17:28.816220559 -0600
+@@ -833,7 +833,8 @@
+     mySignal(SIGPIPE, SigPipe);
+ #endif
+
+-    orig_GC_warn_proc = GC_set_warn_proc(wrap_GC_warn_proc);
++    orig_GC_warn_proc = GC_get_warn_proc();
++    GC_set_warn_proc(wrap_GC_warn_proc);
+     err_msg = Strnew();
+     if (load_argc == 0) {
+	/* no URL specified */
diff --git a/gnu/packages/texinfo.scm b/gnu/packages/texinfo.scm
index 96016c053d..4194f48ffe 100644
--- a/gnu/packages/texinfo.scm
+++ b/gnu/packages/texinfo.scm
@@ -28,14 +28,14 @@
 (define-public texinfo
   (package
     (name "texinfo")
-    (version "5.0")
+    (version "5.1")
     (source (origin
              (method url-fetch)
              (uri (string-append "mirror://gnu/texinfo/texinfo-"
                                  version ".tar.xz"))
              (sha256
               (base32
-               "1p34f68h9ggfj6ckgj0p62qlj7pmz3ha3vc91kh4hr44pnwm1pla"))))
+               "0864v5i488x3mb3v5p6nhy2kw0mqkzpa3b0453iibj81zlpq078q"))))
     (build-system gnu-build-system)
     (inputs `(("ncurses" ,ncurses)
               ("xz" ,xz)))
diff --git a/gnu/packages/vpn.scm b/gnu/packages/vpn.scm
index 9393e1e7b4..4cd90cd7f2 100644
--- a/gnu/packages/vpn.scm
+++ b/gnu/packages/vpn.scm
@@ -23,8 +23,14 @@
   #:use-module (guix download)
   #:use-module (guix build-system gnu)
   #:use-module (gnu packages)
+  #:use-module (gnu packages compression)
+  #:use-module ((gnu packages gettext)
+                #:renamer (symbol-prefix-proc 'gnu:))
   #:use-module (gnu packages gnupg)
-  #:use-module (gnu packages perl))
+  #:use-module (gnu packages openssl)
+  #:use-module (gnu packages perl)
+  #:use-module (gnu packages pkg-config)
+  #:use-module (gnu packages xml))
 
 (define-public vpnc
   (package
@@ -64,3 +70,45 @@ shared-secret IPSec authentication with Xauth, AES (256, 192, 128), 3DES,
 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/")))
+
+
+(define-public openconnect
+  (package
+   (name "openconnect")
+   (version "4.99")
+   (source (origin
+            (method url-fetch)
+            (uri (string-append "ftp://ftp.infradead.org/pub/openconnect/openconnect-"
+                                version ".tar.gz"))
+            (sha256 (base32
+                     "1rd8pap455wzkx19i0sy3cqap524b6fwcjvqynxp6lhm01di4bd6"))))
+   (build-system gnu-build-system)
+   (inputs
+    `(("gettext" ,gnu:gettext)
+      ("libxml2" ,libxml2)
+      ("openssl" ,openssl)
+      ("pkg-config" ,pkg-config)
+      ("vpnc" ,vpnc)
+      ("zlib" ,zlib)))
+   (arguments
+    `(#:phases
+      (alist-replace
+       'configure
+       (lambda* (#:key inputs #:allow-other-keys #:rest args)
+         (let ((vpnc (assoc-ref inputs "vpnc"))
+               (configure (assoc-ref %standard-phases 'configure)))
+           (apply configure
+                  (append args
+                          (list '#:configure-flags
+                                (list (string-append "--with-vpnc-script="
+                                                     vpnc
+                                                     "/etc/vpnc/vpnc-script")))))))
+       %standard-phases)))
+   (synopsis "client for cisco vpn")
+   (description
+    "OpenConnect is a client for Cisco's AnyConnect SSL VPN, which is
+supported by the ASA5500 Series, by IOS 12.4(9)T or later on Cisco SR500,
+870, 880, 1800, 2800, 3800, 7200 Series and Cisco 7301 Routers,
+and probably others.")
+   (license license:lgpl2.1)
+   (home-page "http://www.infradead.org/openconnect/")))
diff --git a/gnu/packages/w3m.scm b/gnu/packages/w3m.scm
new file mode 100644
index 0000000000..9199cbd488
--- /dev/null
+++ b/gnu/packages/w3m.scm
@@ -0,0 +1,81 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2013 Nikita Karetnikov <nikita@karetnikov.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 w3m)
+  #:use-module ((guix licenses) #:select (x11-style))
+  #:use-module ((gnu packages gettext)
+                #:renamer (symbol-prefix-proc 'guix:))
+  #:use-module (gnu packages bdw-gc)
+  #:use-module (gnu packages compression)
+  #:use-module (gnu packages ncurses)
+  #:use-module (gnu packages openssl)
+  #:use-module (gnu packages perl)
+  #:use-module (gnu packages pkg-config)
+  #:use-module (gnu packages)
+  #:use-module (guix packages)
+  #:use-module (guix download)
+  #:use-module (guix build-system gnu))
+
+(define-public w3m
+  (package
+    (name "w3m")
+    (version "0.5.3")
+    (source
+     (origin
+      (method url-fetch)
+      (uri (string-append "mirror://sourceforge/w3m/w3m-"
+                          version ".tar.gz"))
+      (sha256
+       (base32
+        "1qx9f0kprf92r1wxl3sacykla0g04qsi0idypzz24b7xy9ix5579"))))
+    (build-system gnu-build-system)
+    (arguments `(#:tests? #f  ; no check target
+                 #:phases (alist-cons-before
+                           'configure 'fix-perl
+                           (lambda _
+                             ;; https://launchpad.net/bugs/935540
+                             ;; 'struct file_handle' is used by 'glibc'
+                             (substitute* '("istream.c" "istream.h")
+                              (("struct[[:blank:]]+file_handle")
+                               "struct w3m_file_handle"))
+                             (substitute* '("scripts/w3mmail.cgi.in"
+                                            "scripts/dirlist.cgi.in")
+                               (("@PERL@") (which "perl"))))
+                           %standard-phases)
+                 ;; cf. https://bugs.archlinux.org/task/33397
+                 #:patches (list (assoc-ref %build-inputs
+                                            "patch/fix-compile"))
+                 #:patch-flags '("-p0")))
+    (inputs
+     `(("gettext" ,guix:gettext)
+       ("libgc" ,libgc)
+       ("ncurses" ,ncurses)
+       ("openssl" ,openssl)
+       ("perl" ,perl)
+       ("pkg-config" ,pkg-config)
+       ("zlib" ,zlib)
+       ("patch/fix-compile" ,(search-patch "w3m-fix-compile.patch"))))
+    (home-page "http://w3m.sourceforge.net/")
+    (synopsis "w3m, a text-mode web browser")
+    (description
+     "w3m is a text-based web browser as well as a pager like 'more' or
+'less'.  With w3m you can browse web pages through a terminal emulator
+window.  Moreover, w3m can be used as a text formatting tool which
+typesets HTML into plain text.")
+    (license (x11-style "file://doc/README"
+                        "See 'doc/README' in the distribution."))))
diff --git a/guix/build-system/cmake.scm b/guix/build-system/cmake.scm
new file mode 100644
index 0000000000..2a9db80cf8
--- /dev/null
+++ b/guix/build-system/cmake.scm
@@ -0,0 +1,123 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2013 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2013 Cyril Roelandt <tipecaml@gmail.com>
+;;;
+;;; 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 cmake)
+  #: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 (cmake-build
+            cmake-build-system))
+
+;; Commentary:
+;;
+;; Standard build procedure for packages using CMake. This is implemented as an
+;; extension of `gnu-build-system'.
+;;
+;; Code:
+
+(define* (cmake-build store name source inputs
+                     #:key (guile #f)
+                     (outputs '("out")) (configure-flags ''())
+                     (make-flags ''())
+                     (patches ''()) (patch-flags ''("--batch" "-p1"))
+                     (cmake (@ (gnu packages cmake) cmake))
+                     (out-of-source? #f)
+                     (path-exclusions ''())
+                     (tests? #t)
+                     (test-target "test")
+                     (parallel-build? #t) (parallel-tests? #f)
+                     (patch-shebangs? #t)
+                     (strip-binaries? #t)
+                     (strip-flags ''("--strip-debug"))
+                     (strip-directories ''("lib" "lib64" "libexec"
+                                           "bin" "sbin"))
+                     (phases '(@ (guix build cmake-build-system)
+                                 %standard-phases))
+                     (system (%current-system))
+                     (imported-modules '((guix build cmake-build-system)
+                                         (guix build gnu-build-system)
+                                         (guix build utils)))
+                     (modules '((guix build cmake-build-system)
+                                (guix build gnu-build-system)
+                                (guix build utils))))
+  "Build SOURCE using CMAKE, and with INPUTS. This assumes that SOURCE
+provides a 'CMakeLists.txt' file as its build system."
+  (define builder
+    `(begin
+       (use-modules ,@modules)
+       (cmake-build #:source ,(if (and source (derivation-path? source))
+                                 (derivation-path->output-path source)
+                                 source)
+                    #:system ,system
+                    #:outputs %outputs
+                    #:inputs %build-inputs
+                    #:patches ,patches
+                    #:patch-flags ,patch-flags
+                    #:phases ,phases
+                    #:configure-flags ,configure-flags
+                    #:make-flags ,make-flags
+                    #:out-of-source? ,out-of-source?
+                    #:path-exclusions ,path-exclusions
+                    #:tests? ,tests?
+                    #:test-target ,test-target
+                    #:parallel-build? ,parallel-build?
+                    #:parallel-tests? ,parallel-tests?
+                    #:patch-shebangs? ,patch-shebangs?
+                    #:strip-binaries? ,strip-binaries?
+                    #:strip-flags ,strip-flags
+                    #:strip-directories ,strip-directories)))
+
+  (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 ((cmake (package-derivation store cmake system)))
+    (build-expression->derivation store name system
+                                  builder
+                                  `(,@(if source
+                                          `(("source" ,source))
+                                          '())
+                                    ("cmake" ,cmake)
+                                    ,@inputs
+
+                                    ;; Keep the standard inputs of
+                                    ;; `gnu-build-system'.
+                                    ,@(standard-inputs system))
+
+                                  #:modules imported-modules
+                                  #:outputs outputs
+                                  #:guile-for-build guile-for-build)))
+
+(define cmake-build-system
+  (build-system (name 'cmake)
+                (description "The standard CMake build system")
+                (build cmake-build)))
+
+;;; cmake.scm ends here
diff --git a/guix/build/cmake-build-system.scm b/guix/build/cmake-build-system.scm
new file mode 100644
index 0000000000..877d8110d7
--- /dev/null
+++ b/guix/build/cmake-build-system.scm
@@ -0,0 +1,63 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2013 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2013 Cyril Roelandt <tipecaml@gmail.com>
+;;;
+;;; 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 cmake-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
+            cmake-build))
+
+;; Commentary:
+;;
+;; Builder-side code of the standard cmake build procedure.
+;;
+;; Code:
+
+(define* (configure #:key outputs (configure-flags '())
+                    #:allow-other-keys)
+  "Configure the given package."
+  (let ((out (assoc-ref outputs "out")))
+    (if (file-exists? "CMakeLists.txt")
+        (let ((args `(,(string-append "-DCMAKE_INSTALL_PREFIX=" out)
+                      ,@configure-flags)))
+          (format #t "running 'cmake' with arguments ~s~%" args)
+          (zero? (apply system* "cmake" args)))
+        (error "no CMakeLists.txt found"))))
+
+(define* (check #:key (tests? #t) (parallel-tests? #t) (test-target "test")
+                #:allow-other-keys)
+  (let ((gnu-check (assoc-ref gnu:%standard-phases 'check)))
+    (gnu-check #:tests? tests? #:test-target test-target
+              #:parallel-tests? parallel-tests?)))
+
+(define %standard-phases
+  ;; Everything is as with the GNU Build System except for the `configure'
+  ;; and 'check' phases.
+  (alist-replace 'configure configure
+    (alist-replace 'check check
+                   gnu:%standard-phases)))
+
+(define* (cmake-build #:key inputs (phases %standard-phases)
+                      #:allow-other-keys #:rest args)
+  "Build the given package, applying all of PHASES in order."
+  (apply gnu:gnu-build #:inputs inputs #:phases phases args))
+
+;;; cmake-build-system.scm ends here
diff --git a/guix/derivations.scm b/guix/derivations.scm
index 18a637ae5a..2243d2ba46 100644
--- a/guix/derivations.scm
+++ b/guix/derivations.scm
@@ -235,6 +235,32 @@ DRV and not already available in STORE, recursively."
               (hash-set! cache file drv)
               drv))))))
 
+(define-inlinable (write-sequence lst write-item port)
+  ;; Write each element of LST with WRITE-ITEM to PORT, separating them with a
+  ;; comma.
+  (match lst
+    (()
+     #t)
+    ((prefix (... ...) last)
+     (for-each (lambda (item)
+                 (write-item item port)
+                 (display "," port))
+               prefix)
+     (write-item last port))))
+
+(define-inlinable (write-list lst write-item port)
+  ;; Write LST as a derivation list to PORT, using WRITE-ITEM to write each
+  ;; element.
+  (display "[" port)
+  (write-sequence lst write-item port)
+  (display "]" port))
+
+(define-inlinable (write-tuple lst write-item port)
+  ;; Same, but write LST as a tuple.
+  (display "(" port)
+  (write-sequence lst write-item port)
+  (display ")" port))
+
 (define (write-derivation drv port)
   "Write the ATerm-like serialization of DRV to PORT.  See Section 2.4 of
 Eelco Dolstra's PhD dissertation for an overview of a previous version of
@@ -243,11 +269,8 @@ that form."
   ;; Make sure we're using the faster implementation.
   (define format simple-format)
 
-  (define (list->string lst)
-    (string-append "[" (string-join lst ",") "]"))
-
-  (define (write-list lst)
-    (display (list->string lst) port))
+  (define (write-string-list lst)
+    (write-list lst write port))
 
   (define (coalesce-duplicate-inputs inputs)
     ;; Return a list of inputs, such that when INPUTS contains the same DRV
@@ -272,6 +295,34 @@ that form."
           '()
           inputs))
 
+  (define (write-output output port)
+    (match output
+     ((name . ($ <derivation-output> path hash-algo hash))
+      (write-tuple (list name path
+                         (or (and=> hash-algo symbol->string) "")
+                         (or (and=> hash bytevector->base16-string)
+                             ""))
+                   write
+                   port))))
+
+  (define (write-input input port)
+    (match input
+      (($ <derivation-input> path sub-drvs)
+       (display "(" port)
+       (write path port)
+       (display "," port)
+       (write-string-list (sort sub-drvs string<?))
+       (display ")" port))))
+
+  (define (write-env-var env-var port)
+    (match env-var
+      ((name . value)
+       (display "(" port)
+       (write name port)
+       (display "," port)
+       (write value port)
+       (display ")" port))))
+
   ;; Note: lists are sorted alphabetically, to conform with the behavior of
   ;; C++ `std::map' in Nix itself.
 
@@ -279,37 +330,28 @@ that form."
     (($ <derivation> outputs inputs sources
         system builder args env-vars)
      (display "Derive(" port)
-     (write-list (map (match-lambda
-                       ((name . ($ <derivation-output> path hash-algo hash))
-                        (format #f "(~s,~s,~s,~s)"
-                                name path
-                                (or (and=> hash-algo symbol->string) "")
-                                (or (and=> hash bytevector->base16-string)
-                                    ""))))
-                      (sort outputs
-                            (lambda (o1 o2)
-                              (string<? (car o1) (car o2))))))
+     (write-list (sort outputs
+                       (lambda (o1 o2)
+                         (string<? (car o1) (car o2))))
+                 write-output
+                 port)
      (display "," port)
-     (write-list (map (match-lambda
-                       (($ <derivation-input> path sub-drvs)
-                        (format #f "(~s,~a)" path
-                                (list->string (map object->string
-                                                   (sort sub-drvs string<?))))))
-                      (sort (coalesce-duplicate-inputs inputs)
-                            (lambda (i1 i2)
-                              (string<? (derivation-input-path i1)
-                                        (derivation-input-path i2))))))
+     (write-list (sort (coalesce-duplicate-inputs inputs)
+                       (lambda (i1 i2)
+                         (string<? (derivation-input-path i1)
+                                   (derivation-input-path i2))))
+                 write-input
+                 port)
      (display "," port)
-     (write-list (map object->string (sort sources string<?)))
+     (write-string-list (sort sources string<?))
      (format port ",~s,~s," system builder)
-     (write-list (map object->string args))
+     (write-string-list args)
      (display "," port)
-     (write-list (map (match-lambda
-                       ((name . value)
-                        (format #f "(~s,~s)" name value)))
-                      (sort env-vars
-                            (lambda (e1 e2)
-                              (string<? (car e1) (car e2))))))
+     (write-list (sort env-vars
+                       (lambda (e1 e2)
+                         (string<? (car e1) (car e2))))
+                 write-env-var
+                 port)
      (display ")" port))))
 
 (define derivation-path->output-path
@@ -699,14 +741,21 @@ omitted or is #f, the value of the `%guile-for-build' fluid is used instead."
                       (unsetenv "LD_LIBRARY_PATH")))
          (builder  (add-text-to-store store
                                       (string-append name "-guile-builder")
-                                      (string-append
-                                       (object->string prologue)
-                                       (object->string
-                                        `(exit
-                                          ,(match exp
-                                             ((_ ...)
-                                              (remove module-form? exp))
-                                             (_ `(,exp))))))
+
+                                      ;; Explicitly use UTF-8 for determinism,
+                                      ;; and also because UTF-8 output is faster.
+                                      (with-fluids ((%default-port-encoding
+                                                     "UTF-8"))
+                                        (call-with-output-string
+                                         (lambda (port)
+                                           (write prologue port)
+                                           (write
+                                            `(exit
+                                              ,(match exp
+                                                 ((_ ...)
+                                                  (remove module-form? exp))
+                                                 (_ `(,exp))))
+                                            port))))
 
                                       ;; The references don't really matter
                                       ;; since the builder is always used in
diff --git a/guix/download.scm b/guix/download.scm
index b6bf6a0822..ea00798b4b 100644
--- a/guix/download.scm
+++ b/guix/download.scm
@@ -43,7 +43,6 @@
             "http://ftpmirror.gnu.org/"
 
             "ftp://ftp.cs.tu-berlin.de/pub/gnu/"
-            "ftp://ftp.chg.ru/pub/gnu/"
             "ftp://ftp.funet.fi/pub/mirrors/ftp.gnu.org/gnu/"
 
             ;; This one is the master repository, and thus it's always
@@ -67,6 +66,11 @@
        "ftp://trumpetti.atm.tut.fi/gcrypt/"
        "ftp://mirror.cict.fr/gnupg/"
        "ftp://ftp.strasbourg.linuxfr.org/pub/gnupg/")
+      (gnome
+       "http://ftp.belnet.be/ftp.gnome.org/"
+       "http://ftp.linux.org.uk/mirrors/ftp.gnome.org/"
+       "http://ftp.gnome.org/pub/GNOME/"
+       "http://mirror.yandex.ru/mirrors/ftp.gnome.org/")
       (savannah
        "http://download.savannah.gnu.org/releases/"
        "ftp://ftp.twaren.net/Unix/NonGNU/"
diff --git a/guix/gnu-maintenance.scm b/guix/gnu-maintenance.scm
index 6475c386d3..979678d076 100644
--- a/guix/gnu-maintenance.scm
+++ b/guix/gnu-maintenance.scm
@@ -1,6 +1,6 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2012 Nikita Karetnikov <nikita@karetnikov.org>
 ;;; Copyright © 2010, 2011, 2012, 2013 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2012, 2013 Nikita Karetnikov <nikita@karetnikov.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -22,6 +22,7 @@
   #:use-module (web client)
   #:use-module (web response)
   #:use-module (ice-9 regex)
+  #:use-module (ice-9 rdelim)
   #:use-module (ice-9 match)
   #:use-module (srfi srfi-1)
   #:use-module (srfi srfi-11)
@@ -29,7 +30,23 @@
   #:use-module (system foreign)
   #:use-module (guix ftp-client)
   #:use-module (guix utils)
-  #:export (official-gnu-packages
+  #:use-module (guix packages)
+  #:export (gnu-package-name
+            gnu-package-mundane-name
+            gnu-package-copyright-holder
+            gnu-package-savannah
+            gnu-package-fsd
+            gnu-package-language
+            gnu-package-logo
+            gnu-package-doc-category
+            gnu-package-doc-summary
+            gnu-package-doc-urls
+            gnu-package-download-url
+
+            official-gnu-packages
+            find-packages
+            gnu-package?
+
             releases
             latest-release
             gnu-package-name->name+version))
@@ -47,16 +64,32 @@
 ;;;
 
 (define (http-fetch uri)
-  "Return a string containing the textual data at URI, a string."
+  "Return an input port containing the textual data at URI, a string."
   (let*-values (((resp data)
                 (http-get (string->uri uri)))
                ((code)
                 (response-code resp)))
     (case code
       ((200)
-       data)
+       (cond ((string<=? (version) "2.0.5")
+              (begin
+                ;; XXX: Guile 2.0.5 and earlier did not support chunked transfer
+                ;; encoding, which is required when fetching %PACKAGE-LIST-URL
+                ;; (see <http://lists.gnu.org/archive/html/guile-devel/2011-09/msg00089.html>).
+                ;; Since users may still be using these versions, warn them and
+                ;; bail out.
+                (format (current-error-port)
+                        "warning: using Guile ~a, ~a ~s encoding~%"
+                        (version)
+                        "which does not support HTTP"
+                        (response-transfer-encoding resp))
+                (error "download failed; use a newer Guile"
+                       uri resp)))
+             ((string<=? (version) "2.0.7")
+              (open-input-string data))
+             (else data)))
       (else
-       (error "download failed:" uri code
+       (error "download failed" uri code
               (response-reason-phrase resp))))))
 
 (define %package-list-url
@@ -64,16 +97,114 @@
                  "viewvc/*checkout*/gnumaint/"
                  "gnupackages.txt?root=womb"))
 
+(define-record-type* <gnu-package-descriptor>
+  gnu-package-descriptor
+  make-gnu-package-descriptor
+
+  gnu-package-descriptor?
+
+  (name             gnu-package-name)
+  (mundane-name     gnu-package-mundane-name)
+  (copyright-holder gnu-package-copyright-holder)
+  (savannah         gnu-package-savannah)
+  (fsd              gnu-package-fsd)
+  (language         gnu-package-language)
+  (logo             gnu-package-logo)
+  (doc-category     gnu-package-doc-category)
+  (doc-summary      gnu-package-doc-summary)
+  (doc-urls         gnu-package-doc-urls)
+  (download-url     gnu-package-download-url))
+
 (define (official-gnu-packages)
-  "Return a list of GNU packages."
-  (define %package-line-rx
-    (make-regexp "^package: (.+)$"))
-
-  (let ((lst (string-split (http-fetch %package-list-url) #\nl)))
-    (filter-map (lambda (line)
-                  (and=> (regexp-exec %package-line-rx line)
-                         (cut match:substring <> 1)))
-                lst)))
+  "Return a list of records, which are GNU packages."
+  (define (group-package-fields port state)
+    ;; Return a list of alists.  Each alist contains fields of a GNU
+    ;; package.
+    (let ((line        (read-line port))
+          (field-rx    (make-regexp "^([[:graph:]]+): (.*)$"))
+          (doc-urls-rx (make-regexp "^doc-url: (.*)$"))
+          (end-rx      (make-regexp "^# End. .+Do not remove this line.+")))
+
+      (define (match-field str)
+        ;; Packages are separated by empty strings.  If STR is an
+        ;; empty string, create a new list to store fields of a
+        ;; different package.  Otherwise, match and create a key-value
+        ;; pair.
+        (match str
+          (""
+           (group-package-fields port (cons '() state)))
+          (str
+           (cond ((regexp-exec doc-urls-rx str)
+                  =>
+                  (lambda (match)
+                    (if (equal? (assoc-ref (first state) "doc-urls") #f)
+                        (group-package-fields
+                         port (cons (cons (cons "doc-urls"
+                                                (list
+                                                 (match:substring match 1)))
+                                          (first state))
+                                    (drop state 1)))
+                        (group-package-fields
+                         port (cons (cons (cons "doc-urls"
+                                                (cons (match:substring match 1)
+                                                      (assoc-ref (first state)
+                                                                 "doc-urls")))
+                                          (assoc-remove! (first state)
+                                                         "doc-urls"))
+                                    (drop state 1))))))
+                 ((regexp-exec field-rx str)
+                  =>
+                  (lambda (match)
+                    (group-package-fields
+                     port (cons (cons (cons (match:substring match 1)
+                                            (match:substring match 2))
+                                      (first state))
+                                (drop state 1)))))
+                 (else (group-package-fields port state))))))
+
+      (if (or (eof-object? line)
+              (regexp-exec end-rx line)) ; don't include dummy fields
+          (remove null-list? state)
+          (match-field line))))
+
+  (define (alist->record alist make keys)
+    ;; Apply MAKE, which should be a syntactic constructor, to the
+    ;; values associated with KEYS in ALIST.
+    (let ((args (map (cut assoc-ref alist <>) keys)))
+      (apply make args)))
+
+  (reverse
+   (map (lambda (alist)
+          (alist->record alist
+                         make-gnu-package-descriptor
+                         (list "package" "mundane-name" "copyright-holder"
+                               "savannah" "fsd" "language" "logo"
+                               "doc-category" "doc-summary" "doc-urls"
+                               "download-url")))
+        (group-package-fields (http-fetch %package-list-url)
+                              '(())))))
+
+(define (find-packages regexp)
+  "Find GNU packages which satisfy REGEXP."
+  (let ((name-rx (make-regexp regexp)))
+    (filter (lambda (package)
+              (false-if-exception
+               (regexp-exec name-rx (gnu-package-name package))))
+            (official-gnu-packages))))
+
+(define gnu-package?
+  (memoize
+   (lambda (package)
+     "Return true if PACKAGE is a GNU package.  This procedure may access the
+network to check in GNU's database."
+     ;; TODO: Find a way to determine that a package is non-GNU without going
+     ;; through the network.
+     (let ((url  (and=> (package-source package) origin-uri))
+           (name (package-name package)))
+       (or (and (string? url) (string-prefix? "mirror://gnu" url))
+           (and (member name (map gnu-package-name (official-gnu-packages)))
+                #t))))))
+
 
 ;;;
 ;;; Latest release.
@@ -119,43 +250,45 @@ pairs.  Example: (\"mit-scheme-9.0.1\" . \"/gnu/mit-scheme/stable.pkg/9.0.1\").
     (let ((end (string-contains tarball ".tar")))
       (substring tarball 0 end)))
 
+  (define (release-file file)
+    ;; Return #f if FILE is not a release tarball, otherwise return
+    ;; PACKAGE-VERSION.
+    (and (not (string-suffix? ".sig" file))
+         (regexp-exec release-rx file)
+         (not (regexp-exec alpha-rx file))
+         (let ((s (sans-extension file)))
+           (and (regexp-exec %package-name-rx s) s))))
+
   (let-values (((server directory) (ftp-server/directory project)))
     (define conn (ftp-open server))
 
     (let loop ((directories (list directory))
                (result      '()))
-      (if (null? directories)
-          (begin
-            (ftp-close conn)
-            result)
-          (let* ((directory (car directories))
-                 (files     (ftp-list conn directory))
-                 (subdirs   (filter-map (lambda (file)
-                                          (match file
-                                            ((name 'directory . _) name)
-                                            (_ #f)))
-                                        files)))
-            (loop (append (map (cut string-append directory "/" <>)
-                               subdirs)
-                          (cdr directories))
-                  (append
-                   ;; Filter out signatures, deltas, and files which
-                   ;; are potentially not releases of PROJECT--e.g.,
-                   ;; in /gnu/guile, filter out guile-oops and
-                   ;; guile-www; in mit-scheme, filter out binaries.
-                   (filter-map (lambda (file)
-                                 (match file
-                                   ((file 'file . _)
-                                    (and (not (string-suffix? ".sig" file))
-                                         (regexp-exec release-rx file)
-                                         (not (regexp-exec alpha-rx file))
-                                         (let ((s (sans-extension file)))
-                                           (and (regexp-exec
-                                                 %package-name-rx s)
-                                                (cons s directory)))))
-                                   (_ #f)))
-                               files)
-                   result)))))))
+      (match directories
+        (()
+         (ftp-close conn)
+         result)
+        ((directory rest ...)
+         (let* ((files   (ftp-list conn directory))
+                (subdirs (filter-map (match-lambda
+                                      ((name 'directory . _) name)
+                                      (_ #f))
+                                     files)))
+           (loop (append (map (cut string-append directory "/" <>)
+                              subdirs)
+                         rest)
+                 (append
+                  ;; Filter out signatures, deltas, and files which
+                  ;; are potentially not releases of PROJECT--e.g.,
+                  ;; in /gnu/guile, filter out guile-oops and
+                  ;; guile-www; in mit-scheme, filter out binaries.
+                  (filter-map (match-lambda
+                                ((file 'file . _)
+                                 (and=> (release-file file)
+                                        (cut cons <> directory)))
+                                (_ #f))
+                              files)
+                  result))))))))
 
 (define (latest-release project)
   "Return (\"FOO-X.Y\" . \"/bar/foo\") or #f."
diff --git a/guix/licenses.scm b/guix/licenses.scm
index 4e4aee2036..9c4e17737a 100644
--- a/guix/licenses.scm
+++ b/guix/licenses.scm
@@ -39,7 +39,7 @@
             psfl public-domain
             qpl
             vim
-            x11
+            x11 x11-style
             zlib
             fsf-free))
 
@@ -236,6 +236,16 @@ which may be a file:// URI pointing the package's tree."
            "http://directory.fsf.org/wiki/License:X11"
            "https://www.gnu.org/licenses/license-list#X11License"))
 
+(define* (x11-style uri #:optional (comment ""))
+  "Return an X11-style license, whose full text can be found at URI,
+which may be a file:// URI pointing the package's tree."
+  (license "X11-style"
+           uri
+           (string-append
+            "This is an X11-style, non-copyleft free software license.  "
+            "Check the URI for details.  "
+            comment)))
+
 (define zlib
   (license "Zlib"
            "http://www.gzip.org/zlib/zlib_license.html"
diff --git a/guix/packages.scm b/guix/packages.scm
index 51984baa3b..81f09d638e 100644
--- a/guix/packages.scm
+++ b/guix/packages.scm
@@ -135,7 +135,7 @@ representation."
 
   (synopsis package-synopsis)                    ; one-line description
   (description package-description)              ; one or two paragraphs
-  (license package-license (default '()))
+  (license package-license)
   (home-page package-home-page)
   (platforms package-platforms (default '()))
   (maintainers package-maintainers (default '()))
diff --git a/guix/scripts/download.scm b/guix/scripts/download.scm
index 3dc227fdcd..3f989a3494 100644
--- a/guix/scripts/download.scm
+++ b/guix/scripts/download.scm
@@ -110,26 +110,27 @@ and the hash of its contents.\n"))
                  (alist-cons 'argument arg result))
                %default-options))
 
-  (let* ((opts  (parse-options))
-         (store (open-connection))
-         (arg   (assq-ref opts 'argument))
-         (uri   (or (string->uri arg)
-                    (leave (_ "guix-download: ~a: failed to parse URI~%")
-                           arg)))
-         (path  (case (uri-scheme uri)
-                  ((file)
-                   (add-to-store store (basename (uri-path uri))
-                                 #f "sha256" (uri-path uri)))
-                  (else
-                   (fetch-and-store store
-                                    (cut url-fetch arg <>
-                                         #:mirrors %mirrors)
-                                    (basename (uri-path uri))))))
-         (hash  (call-with-input-file
-                    (or path
-                        (leave (_ "guix-download: ~a: download failed~%")
-                               arg))
-                  (compose sha256 get-bytevector-all)))
-         (fmt   (assq-ref opts 'format)))
-    (format #t "~a~%~a~%" path (fmt hash))
-    #t))
+  (with-error-handling
+    (let* ((opts  (parse-options))
+           (store (open-connection))
+           (arg   (assq-ref opts 'argument))
+           (uri   (or (string->uri arg)
+                      (leave (_ "guix-download: ~a: failed to parse URI~%")
+                             arg)))
+           (path  (case (uri-scheme uri)
+                    ((file)
+                     (add-to-store store (basename (uri-path uri))
+                                   #f "sha256" (uri-path uri)))
+                    (else
+                     (fetch-and-store store
+                                      (cut url-fetch arg <>
+                                           #:mirrors %mirrors)
+                                      (basename (uri-path uri))))))
+           (hash  (call-with-input-file
+                      (or path
+                          (leave (_ "guix-download: ~a: download failed~%")
+                                 arg))
+                    (compose sha256 get-bytevector-all)))
+           (fmt   (assq-ref opts 'format)))
+      (format #t "~a~%~a~%" path (fmt hash))
+      #t)))
diff --git a/guix/scripts/package.scm b/guix/scripts/package.scm
index ccca614d88..6de2f1beb6 100644
--- a/guix/scripts/package.scm
+++ b/guix/scripts/package.scm
@@ -39,6 +39,7 @@
   #:use-module (gnu packages)
   #:use-module ((gnu packages base) #:select (guile-final))
   #:use-module ((gnu packages bootstrap) #:select (%bootstrap-guile))
+  #:use-module (guix gnu-maintenance)
   #:export (guix-package))
 
 (define %store
@@ -266,6 +267,47 @@ matching packages."
                        (assoc-ref (derivation-outputs drv) sub-drv))))
          `(,name ,out))))))
 
+(define-syntax-rule (waiting exp fmt rest ...)
+  "Display the given message while EXP is being evaluated."
+  (let* ((message (format #f fmt rest ...))
+         (blank   (make-string (string-length message) #\space)))
+    (display message (current-error-port))
+    (force-output (current-error-port))
+    (let ((result exp))
+      ;; Clear the line.
+      (display #\cr (current-error-port))
+      (display blank (current-error-port))
+      (display #\cr (current-error-port))
+      (force-output (current-error-port))
+      exp)))
+
+(define (check-package-freshness package)
+  "Check whether PACKAGE has a newer version available upstream, and report
+it."
+  ;; TODO: Automatically inject the upstream version when desired.
+
+  (catch #t
+    (lambda ()
+      (when (false-if-exception (gnu-package? package))
+        (let ((name      (package-name package))
+              (full-name (package-full-name package)))
+          (match (waiting (latest-release name)
+                          (_ "looking for the latest release of GNU ~a...") name)
+            ((latest-version . _)
+             (when (version>? latest-version full-name)
+               (format (current-error-port)
+                       (_ "~a: note: using ~a \
+but ~a is available upstream~%")
+                       (location->string (package-location package))
+                       full-name latest-version)))
+            (_ #t)))))
+    (lambda (key . args)
+      ;; Silently ignore networking errors rather than preventing
+      ;; installation.
+      (case key
+        ((getaddrinfo-error ftp-error) #f)
+        (else (apply throw key args))))))
+
 
 ;;;
 ;;; Command-line options.
@@ -510,6 +552,44 @@ Install, remove, or upgrade PACKAGES in a single transaction.\n"))
           ,path
           ,(canonicalize-deps deps))))
 
+    (define (show-what-to-remove/install remove install dry-run?)
+      ;; Tell the user what's going to happen in high-level terms.
+      ;; TODO: Report upgrades more clearly.
+      (match remove
+        (((name version _ path _) ..1)
+         (let ((len    (length name))
+               (remove (map (cut format #f "  ~a-~a\t~a" <> <> <>)
+                            name version path)))
+           (if dry-run?
+               (format (current-error-port)
+                       (N_ "The following package would be removed:~% ~{~a~%~}~%"
+                           "The following packages would be removed:~% ~{~a~%~}~%"
+                           len)
+                       remove)
+               (format (current-error-port)
+                       (N_ "The following package will be removed:~% ~{~a~%~}~%"
+                           "The following packages will be removed:~% ~{~a~%~}~%"
+                           len)
+                       remove))))
+        (_ #f))
+      (match install
+        (((name version _ path _) ..1)
+         (let ((len     (length name))
+               (install (map (cut format #f "  ~a-~a\t~a" <> <> <>)
+                             name version path)))
+           (if dry-run?
+               (format (current-error-port)
+                       (N_ "The following package would be installed:~% ~{~a~%~}~%"
+                           "The following packages would be installed:~% ~{~a~%~}~%"
+                           len)
+                       install)
+               (format (current-error-port)
+                       (N_ "The following package will be installed:~% ~{~a~%~}~%"
+                           "The following packages will be installed:~% ~{~a~%~}~%"
+                           len)
+                       install))))
+        (_ #f)))
+
     ;; First roll back if asked to.
     (if (and (assoc-ref opts 'roll-back?) (not dry-run?))
         (begin
@@ -547,6 +627,7 @@ Install, remove, or upgrade PACKAGES in a single transaction.\n"))
                                       ((name version sub-drv
                                              (? package? package)
                                              (deps ...))
+                                       (check-package-freshness package)
                                        (package-derivation (%store) package))
                                       (_ #f))
                                      install))
@@ -576,6 +657,7 @@ Install, remove, or upgrade PACKAGES in a single transaction.\n"))
                                        package)
                                       (_ #f))
                                      opts))
+               (remove*  (filter-map (cut assoc <> installed) remove))
                (packages (append install*
                                  (fold (lambda (package result)
                                          (match package
@@ -587,6 +669,7 @@ Install, remove, or upgrade PACKAGES in a single transaction.\n"))
           (when (equal? profile %current-profile)
             (ensure-default-profile))
 
+          (show-what-to-remove/install remove* install* dry-run?)
           (show-what-to-build (%store) drv dry-run?)
 
           (or dry-run?
@@ -669,8 +752,8 @@ Install, remove, or upgrade PACKAGES in a single transaction.\n"))
 
   (let ((opts (parse-options)))
     (or (process-query opts)
-        (parameterize ((%store (open-connection)))
-          (with-error-handling
+        (with-error-handling
+          (parameterize ((%store (open-connection)))
             (parameterize ((%guile-for-build
                             (package-derivation (%store)
                                                 (if (assoc-ref opts 'bootstrap?)
diff --git a/guix/scripts/pull.scm b/guix/scripts/pull.scm
index 942bf501c5..bc72dc4088 100644
--- a/guix/scripts/pull.scm
+++ b/guix/scripts/pull.scm
@@ -194,9 +194,9 @@ Download and deploy the latest version of Guix.\n"))
                  (leave (_ "~A: unexpected argument~%") arg))
                %default-options))
 
-  (let ((opts  (parse-options))
-        (store (open-connection)))
-    (with-error-handling
+  (with-error-handling
+    (let ((opts  (parse-options))
+          (store (open-connection)))
       (let ((tarball (download-and-store store)))
         (unless tarball
           (leave (_ "failed to download up-to-date source, exiting\n")))
diff --git a/guix/snix.scm b/guix/snix.scm
index 3a470b9b8b..0c19fecb28 100644
--- a/guix/snix.scm
+++ b/guix/snix.scm
@@ -277,7 +277,7 @@ ATTRIBUTE is true, only that attribute is considered."
              %nix-instantiate "--strict" "--eval-only" "--xml"
 
              ;; Pass a dummy `crossSystem' argument so that `buildInputs' and
-             ;; `buildNativeInputs' are not coalesced.
+             ;; `nativeBuildInputs' are not coalesced.
              ;; XXX: This is hacky and has other problems.
              ;"--arg" "crossSystem" cross-system
 
@@ -423,12 +423,15 @@ location of DERIVATION."
              (build-system gnu-build-system)
 
              ;; When doing a native Nixpkgs build, `buildInputs' is empty and
-             ;; everything is in `buildNativeInputs'.  So we can't distinguish
+             ;; everything is in `nativeBuildInputs'.  So we can't distinguish
              ;; between both, here.
+             ;;
+             ;; Note that `nativeBuildInputs' was renamed from
+             ;; `buildNativeInputs' in Nixpkgs sometime around March 2013.
              ,@(maybe-inputs 'inputs
-                             (convert-inputs "buildNativeInputs"))
+                             (convert-inputs "nativeBuildInputs"))
              ,@(maybe-inputs 'propagated-inputs
-                             (convert-inputs "propagatedBuildNativeInputs"))
+                             (convert-inputs "propagatedNativeBuildInputs"))
 
              (home-page ,(and=> (find-attribute-by-name "homepage" meta)
                                 attribute-value))
diff --git a/guix/store.scm b/guix/store.scm
index 80b36daf93..4d078c5899 100644
--- a/guix/store.scm
+++ b/guix/store.scm
@@ -39,6 +39,9 @@
             nix-server-socket
 
             &nix-error nix-error?
+            &nix-connection-error nix-connection-error?
+            nix-connection-error-file
+            nix-connection-error-code
             &nix-protocol-error nix-protocol-error?
             nix-protocol-error-message
             nix-protocol-error-status
@@ -231,8 +234,19 @@
 (define write-store-path-list write-string-list)
 (define read-store-path-list read-string-list)
 
-(define (write-contents file p)
-  "Write the contents of FILE to output port P."
+(define (write-contents file p size)
+  "Write SIZE bytes from FILE to output port P."
+  (define (call-with-binary-input-file file proc)
+    ;; Open FILE as a binary file.  This avoids scan-for-encoding, and thus
+    ;; avoids any initial buffering.  Disable file name canonicalization to
+    ;; avoid stat'ing like crazy.
+    (with-fluids ((%file-port-name-canonicalization #f))
+      (let ((port (open-file file "rb")))
+        (catch #t (cut proc port)
+          (lambda args
+            (close-port port)
+            (apply throw args))))))
+
   (define (dump in size)
     (define buf-size 65536)
     (define buf (make-bytevector buf-size))
@@ -247,13 +261,14 @@
                   (put-bytevector p buf 0 read)
                   (loop (- left read))))))))
 
-  (let ((size (stat:size (lstat file))))
-    (write-string "contents" p)
-    (write-long-long size p)
-    (call-with-input-file file
-      (lambda (p)
-        (dump p size)))
-    (write-padding size p)))
+  (write-string "contents" p)
+  (write-long-long size p)
+  (call-with-binary-input-file file
+    ;; Use `sendfile' when available (Guile 2.0.8+).
+    (if (compile-time-value (defined? 'sendfile))
+        (cut sendfile p <> size 0)
+        (cut dump <> size)))
+  (write-padding size p))
 
 (define (write-file f p)
   (define %archive-version-1 "nix-archive-1")
@@ -271,7 +286,7 @@
              (begin
                (write-string "executable" p)
                (write-string "" p)))
-         (write-contents f p))
+         (write-contents f p (stat:size s)))
         ((directory)
          (write-string "type" p)
          (write-string "directory" p)
@@ -373,6 +388,11 @@
 (define-condition-type &nix-error &error
   nix-error?)
 
+(define-condition-type &nix-connection-error &nix-error
+  nix-connection-error?
+  (file   nix-connection-error-file)
+  (errno  nix-connection-error-code))
+
 (define-condition-type &nix-protocol-error &nix-error
   nix-protocol-error?
   (message nix-protocol-error-message)
@@ -392,7 +412,15 @@ operate, should the disk become full.  Return a server object."
     ;; Enlarge the receive buffer.
     (setsockopt s SOL_SOCKET SO_RCVBUF (* 12 1024))
 
-    (connect s a)
+    (catch 'system-error
+      (cut connect s a)
+      (lambda args
+        ;; Translate the error to something user-friendly.
+        (let ((errno (system-error-errno args)))
+          (raise (condition (&nix-connection-error
+                             (file file)
+                             (errno errno)))))))
+
     (write-int %worker-magic-1 s)
     (let ((r (read-int s)))
       (and (eqv? r %worker-magic-2)
diff --git a/guix/ui.scm b/guix/ui.scm
index 03d881a428..94f0825a0a 100644
--- a/guix/ui.scm
+++ b/guix/ui.scm
@@ -111,6 +111,10 @@ General help using GNU software: <http://www.gnu.org/gethelp/>"))
                (leave (_ "~a:~a:~a: error: package `~a' has an invalid input: ~s~%")
                       file line column
                       (package-full-name package) input)))
+            ((nix-connection-error? c)
+             (leave (_ "error: failed to connect to `~a': ~a~%")
+                    (nix-connection-error-file c)
+                    (strerror (nix-connection-error-code c))))
             ((nix-protocol-error? c)
              ;; FIXME: Server-provided error messages aren't i18n'd.
              (leave (_ "error: build failed: ~a~%")
diff --git a/hydra.scm b/hydra.scm
index 8e3be16b08..8cbfecf34c 100644
--- a/hydra.scm
+++ b/hydra.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2012 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2012, 2013 Ludovic Courtès <ludo@gnu.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -21,6 +21,21 @@
 ;;; tool.
 ;;;
 
+;; Attempt to use our very own Guix modules.
+(eval-when (compile load eval)
+
+  ;; Ignore any available .go, and force recompilation.  This is because our
+  ;; checkout in the store has mtime set to the epoch, and thus .go files look
+  ;; newer, even though they may not correspond.
+  (set! %fresh-auto-compile #t)
+
+  (and=> (assoc-ref (current-source-location) 'filename)
+         (lambda (file)
+           (let ((dir (dirname file)))
+             (format (current-error-port) "prepending ~s to the load path~%"
+                     dir)
+             (set! %load-path (cons dir %load-path))))))
+
 (use-modules (guix store)
              (guix packages)
              ((guix utils) #:select (%current-system))
diff --git a/release.nix b/release.nix
index 5aab8600ab..86560ea15a 100644
--- a/release.nix
+++ b/release.nix
@@ -42,12 +42,23 @@ let
         if builtins.isAttrs drv
         then pkgs.lib.overrideDerivation (pythonKludge drv) (args: {
           __noChroot = true;
-          buildNativeInputs = map unchroot args.buildNativeInputs;
-          propagatedBuildNativeInputs =
-            map unchroot args.propagatedBuildNativeInputs;
+          nativeBuildInputs = map unchroot args.nativeBuildInputs;
+          propagatedNativeBuildInputs =
+            map unchroot args.propagatedNativeBuildInputs;
         })
         else drv;
 
+  # Return a Nixpkgs with some derivations "unchrooted".
+  unchrootedNixpkgs = system:
+    import nixpkgs {
+      # XXX: Hack to make sure these ones also get "unchrooted".
+      config.packageOverrides = pkgs: {
+        zlib = unchroot pkgs.zlib;
+        libunistring = unchroot pkgs.libunistring;
+      };
+      inherit system;
+    };
+
   # 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.
@@ -67,7 +78,7 @@ let
   jobs = {
     tarball =
       unchroot
-      (let pkgs = import nixpkgs {}; in
+      (let pkgs = unchrootedNixpkgs builtins.currentSystem; in
       pkgs.releaseTools.sourceTarball {
         name = "guix-tarball";
         src = <guix>;
@@ -82,7 +93,7 @@ let
           in
             [ git_light ] ++
             (with pkgs; [ guile sqlite bzip2 libgcrypt ]);
-        buildNativeInputs = with pkgs; [ texinfo gettext cvs pkgconfig ];
+        nativeBuildInputs = with pkgs; [ texinfo gettext cvs pkgconfig ];
         preAutoconf = ''git config submodule.nix.url "${<nix>}"'';
         configureFlags =
           [ "--with-libgcrypt-prefix=${pkgs.libgcrypt}"
@@ -94,11 +105,11 @@ let
       { system ? builtins.currentSystem }:
 
       unchroot
-      (let pkgs = import nixpkgs { inherit system; }; in
+      (let pkgs = unchrootedNixpkgs system; in
       pkgs.releaseTools.nixBuild {
         name = "guix";
         buildInputs = with pkgs; [ guile sqlite bzip2 libgcrypt ];
-        buildNativeInputs = [ pkgs.pkgconfig ];
+        nativeBuildInputs = [ pkgs.pkgconfig ];
         src = jobs.tarball;
         configureFlags =
           [ "--with-libgcrypt-prefix=${pkgs.libgcrypt}"
@@ -125,7 +136,7 @@ let
 
       unchroot
       (let
-        pkgs = import nixpkgs { inherit system; };
+        pkgs = unchrootedNixpkgs system;
         build = jobs.build { inherit system; };
       in
         pkgs.lib.overrideDerivation build ({ configureFlags, ... }: {
@@ -144,7 +155,7 @@ let
         { system ? builtins.currentSystem }:
 
         let
-          pkgs = import nixpkgs { inherit system; };
+          pkgs = unchrootedNixpkgs system;
           guix = jobs.build { inherit system; };
         in
           # XXX: We have no way to tell the Nix code to swallow the .drv
diff --git a/tests/packages.scm b/tests/packages.scm
index f441532d22..c5d9d280ed 100644
--- a/tests/packages.scm
+++ b/tests/packages.scm
@@ -49,7 +49,7 @@
   (package (name name*) (version "0") (source #f)
            (build-system gnu-build-system)
            (synopsis #f) (description #f)
-           (home-page #f)
+           (home-page #f) (license #f)
            extra-fields ...))
 
 (test-assert "package-transitive-inputs"