summary refs log tree commit diff
path: root/gnu
diff options
context:
space:
mode:
Diffstat (limited to 'gnu')
-rw-r--r--gnu/packages/base.scm57
-rw-r--r--gnu/packages/commencement.scm77
-rw-r--r--gnu/packages/gawk.scm12
-rw-r--r--gnu/packages/gettext.scm4
-rw-r--r--gnu/packages/gtk.scm4
-rw-r--r--gnu/packages/guile.scm30
-rw-r--r--gnu/packages/multiprecision.scm6
-rw-r--r--gnu/packages/patches/coreutils-racy-tail-test.patch13
-rw-r--r--gnu/packages/patches/glibc-locale-incompatibility.patch23
-rw-r--r--gnu/packages/patches/glibc-versioned-locpath.patch240
-rw-r--r--gnu/packages/patches/gmp-faulty-test.patch11
-rw-r--r--gnu/packages/patches/pixman-pointer-arithmetic.patch15
-rw-r--r--gnu/packages/patches/python-2.7-search-paths.patch16
-rw-r--r--gnu/packages/patches/python-3-search-paths.patch19
-rw-r--r--gnu/packages/python.scm95
-rw-r--r--gnu/packages/texinfo.scm7
-rw-r--r--gnu/packages/xdisorg.scm27
-rw-r--r--gnu/packages/xml.scm2
-rw-r--r--gnu/packages/xorg.scm6
-rw-r--r--gnu/system/locale.scm9
20 files changed, 462 insertions, 211 deletions
diff --git a/gnu/packages/base.scm b/gnu/packages/base.scm
index a3e3e36608..f951e28b3b 100644
--- a/gnu/packages/base.scm
+++ b/gnu/packages/base.scm
@@ -251,7 +251,14 @@ used to apply commands with arbitrarily long arguments.")
              (base32
               "0w11jw3fb5sslf0f72kxy7llxgk1ia3a6bcw0c9kmvxrlj355mx2"))
             (patches
-             (list (search-patch "coreutils-racy-tail-test.patch")))))
+             (list (origin
+                     (method url-fetch)
+                     (uri "http://git.savannah.gnu.org/cgit/coreutils.git/\
+patch/?id=3ba68f9e64fa2eb8af22d510437a0c6441feb5e0")
+                     (sha256
+                      (base32
+                       "1dnlszhc8lihhg801i9sz896mlrgfsjfcz62636prb27k5hmixqz"))
+                     (file-name "coreutils-tail-inotify-race.patch"))))))
    (build-system gnu-build-system)
    (inputs `(("acl"  ,acl)                        ; TODO: add SELinux
              ("gmp"  ,gmp)                        ;bignums in 'expr', yay!
@@ -476,6 +483,8 @@ store.")
             (modules '((guix build utils)))
             (patches (map search-patch
                           '("glibc-ldd-x86_64.patch"
+                            "glibc-locale-incompatibility.patch"
+                            "glibc-versioned-locpath.patch"
                             "glibc-o-largefile.patch")))))
    (build-system gnu-build-system)
 
@@ -509,12 +518,16 @@ store.")
             ;; Set the default locale path.  In practice, $LOCPATH may be
             ;; defined to point whatever locales users want.  However, setuid
             ;; binaries don't honor $LOCPATH, so they'll instead look into
-            ;; $libc_cv_localedir; we choose /run/current-system/locale, with
-            ;; the idea that it is going to be populated by the sysadmin.
+            ;; $libc_cv_localedir; we choose /run/current-system/locale/X.Y,
+            ;; with the idea that it is going to be populated by the sysadmin.
+            ;; The "X.Y" sub-directory is because locale data formats are
+            ;; incompatible across libc versions; see
+            ;; <https://lists.gnu.org/archive/html/guix-devel/2015-08/msg00737.html>.
             ;;
             ;; `--localedir' is not honored, so work around it.
             ;; See <http://sourceware.org/ml/libc-alpha/2013-03/msg00093.html>.
-            (string-append "libc_cv_localedir=/run/current-system/locale")
+            (string-append "libc_cv_localedir=/run/current-system/locale/"
+                           ,version)
 
             (string-append "--with-headers="
                            (assoc-ref %build-inputs "linux-headers")
@@ -602,9 +615,11 @@ store.")
 
    (native-search-paths
     ;; Search path for packages that provide locale data.  This is useful
-    ;; primarily in build environments.
+    ;; primarily in build environments.  Use 'GUIX_LOCPATH' rather than
+    ;; 'LOCPATH' to avoid interference with the host system's libc on foreign
+    ;; distros.
     (list (search-path-specification
-           (variable "LOCPATH")
+           (variable "GUIX_LOCPATH")
            (files '("lib/locale")))))
 
    (synopsis "The GNU C Library")
@@ -645,10 +660,11 @@ the 'share/locale' sub-directory of this package.")
             (alist-delete 'install ,phases)))
          ((#:configure-flags flags)
           `(append ,flags
-                   ;; Use $(libdir)/locale as is the case by default.
+                   ;; Use $(libdir)/locale/X.Y as is the case by default.
                    (list (string-append "libc_cv_localedir="
                                         (assoc-ref %outputs "out")
-                                        "/lib/locale")))))))))
+                                        "/lib/locale/"
+                                        ,(package-version glibc))))))))))
 
 (define-public glibc-utf8-locales
   (package
@@ -657,7 +673,7 @@ the 'share/locale' sub-directory of this package.")
     (source #f)
     (build-system trivial-build-system)
     (arguments
-     '(#:modules ((guix build utils))
+     `(#:modules ((guix build utils))
        #:builder (begin
                    (use-modules (srfi srfi-1)
                                 (guix build utils))
@@ -665,18 +681,29 @@ the 'share/locale' sub-directory of this package.")
                    (let* ((libc      (assoc-ref %build-inputs "glibc"))
                           (gzip      (assoc-ref %build-inputs "gzip"))
                           (out       (assoc-ref %outputs "out"))
-                          (localedir (string-append out "/lib/locale")))
+                          (localedir (string-append out "/lib/locale/"
+                                                    ,version)))
                      ;; 'localedef' needs 'gzip'.
                      (setenv "PATH" (string-append libc "/bin:" gzip "/bin"))
 
                      (mkdir-p localedir)
                      (every (lambda (locale)
-                              (zero? (system* "localedef" "--no-archive"
-                                              "--prefix" localedir "-i" locale
-                                              "-f" "UTF-8"
+                              (define file
+                                ;; Use the "normalized codeset" by
+                                ;; default--e.g., "en_US.utf8".
+                                (string-append localedir "/" locale ".utf8"))
+
+                              (and (zero? (system* "localedef" "--no-archive"
+                                                   "--prefix" localedir
+                                                   "-i" locale
+                                                   "-f" "UTF-8" file))
+                                   (begin
+                                     ;; For backward compatibility with Guix
+                                     ;; <= 0.8.3, add "xx_YY.UTF-8".
+                                     (symlink (string-append locale ".utf8")
                                               (string-append localedir "/"
-                                                             locale
-                                                             ".UTF-8"))))
+                                                             locale ".UTF-8"))
+                                     #t)))
 
                             ;; These are the locales commonly used for
                             ;; tests---e.g., in Guile's i18n tests.
diff --git a/gnu/packages/commencement.scm b/gnu/packages/commencement.scm
index 56c4cefaf9..73b0ce4364 100644
--- a/gnu/packages/commencement.scm
+++ b/gnu/packages/commencement.scm
@@ -660,46 +660,6 @@ exec ~a/bin/~a-~a -B~a/lib -Wl,-dynamic-linker -Wl,~a/~a \"$@\"~%"
                                               (current-source-location)
                                               #:guile %bootstrap-guile))))))
 
-(define (locale-proof-package p)
-  "Return a new package based on P that ignores 'LOCPATH'.  The result is a
-\"locale-proof\" package in the sense that it cannot end up loading locale
-data that is not in the format its libc expects.  This is useful because the
-locale binary format may change incompatibly between libc versions."
-  (package
-    (inherit p)
-    (name (string-append (package-name p) "-lp"))
-    (build-system trivial-build-system)
-    (inputs `(("original" ,p)
-              ("bash" ,bash-final)))
-    (outputs '("out"))
-    (arguments
-     '(#:modules ((guix build utils))
-       #:builder
-       (begin
-         (use-modules (guix build utils))
-
-         (let* ((out      (assoc-ref %outputs "out"))
-                (bin      (string-append out "/bin"))
-                (bash     (assoc-ref %build-inputs "bash"))
-                (binaries (assoc-ref %build-inputs "original"))
-                (programs (find-files (string-append binaries "/bin"))))
-           (define (wrap-program program)
-             (let ((base (basename program)))
-               (call-with-output-file base
-                 (lambda (port)
-                   (format port "#!~a/bin/sh
-# Unset 'LOCPATH' so that the program does not end up loading incompatible
-# locale data.
-unset LOCPATH
-exec \"~a\" \"$@\"\n"
-                           bash program)))
-               (chmod base #o755)))
-
-           (mkdir-p bin)
-           (with-directory-excursion bin
-             (for-each wrap-program programs)
-             #t)))))))
-
 (define-public ld-wrapper
   ;; The final 'ld' wrapper, which uses the final Guile and Binutils.
   (package (inherit ld-wrapper-boot3)
@@ -710,40 +670,11 @@ exec \"~a\" \"$@\"\n"
                       '("guile" "bash"))))))
 
 (define %boot5-inputs
-  ;; Now with UTF-8 locales.  Since the locale binary format differs between
-  ;; libc versions, we have to rebuild some of the packages so that they use
-  ;; the new libc, which allows them to load locale data from
-  ;; GLIBC-UTF8-LOCALES-FINAL (remember that the bootstrap binaries were built
-  ;; with an older libc, which cannot load the new locale format.)  See
+  ;; Now with UTF-8 locales.  Remember that the bootstrap binaries were built
+  ;; with an older libc, which cannot load the new locale format.  See
   ;; <https://lists.gnu.org/archive/html/guix-devel/2015-08/msg00737.html>.
-  (let ((new-libc-package (compose package-with-bootstrap-guile
-                                   (cut package-with-explicit-inputs <>
-                                        %boot4-inputs
-                                        (current-source-location)
-                                        #:guile %bootstrap-guile))))
-    `(("locales" ,glibc-utf8-locales-final)
-      ("ld-wrapper" ,ld-wrapper)
-      ("binutils" ,binutils-final)
-      ("bash" ,bash-final)
-      ("make" ,(new-libc-package gnu-make))
-
-      ;; Some test suites (grep, Gnulib) use 'diff' to compare files in locale
-      ;; encoding, so we need support this.
-      ("diffutils" ,(new-libc-package diffutils))
-      ("findutils" ,(new-libc-package findutils))
-
-      ;; Grep's test suite uses 'timeout' from Coreutils to execute command,
-      ;; and yet these commands need to see the valid 'LOCPATH'.
-      ("coreutils" ,(new-libc-package coreutils-minimal))
-
-      ;; We just wrap the remaining binaries (tar, gzip, xz, etc.)  so that
-      ;; they ignore 'LOCPATH' (if they did not, they would be hit by an
-      ;; assertion failure in loadlocale.c.)
-      ("coreutils&co" ,(locale-proof-package %bootstrap-coreutils&co))
-
-      ,@(fold alist-delete %boot4-inputs
-              '("coreutils&co" "findutils" "diffutils" "make"
-                "bash" "binutils-cross" "ld-wrapper")))))
+  `(("locales" ,glibc-utf8-locales-final)
+    ,@%boot4-inputs))
 
 (define gnu-make-final
   ;; The final GNU Make, which uses the final Guile.
diff --git a/gnu/packages/gawk.scm b/gnu/packages/gawk.scm
index d2639a32a3..6bfea34667 100644
--- a/gnu/packages/gawk.scm
+++ b/gnu/packages/gawk.scm
@@ -57,17 +57,7 @@
                                (string-append "### " match))))
                           '())))
 
-                (alist-cons-before
-                 'check 'install-locales
-                 (lambda _
-                   ;; A bunch of tests require the availability of a UTF-8
-                   ;; locale and otherwise fail.  Since UTF-8 locales are not
-                   ;; available during bootstrap, create one here.
-                   (setenv "LOCPATH" (getcwd))
-                   (zero? (system* "localedef" "--no-archive"
-                                   "--prefix" (getcwd) "-i" "en_US"
-                                   "-f" "UTF-8" "./en_US.UTF-8")))
-                 %standard-phases))))
+                %standard-phases)))
    (inputs `(("libsigsegv" ,libsigsegv)
 
              ,@(if (%current-target-system)
diff --git a/gnu/packages/gettext.scm b/gnu/packages/gettext.scm
index f1b0221629..14dedc51b5 100644
--- a/gnu/packages/gettext.scm
+++ b/gnu/packages/gettext.scm
@@ -40,14 +40,14 @@
 (define-public gnu-gettext
   (package
     (name "gettext")
-    (version "0.19.5")
+    (version "0.19.6")
     (source (origin
              (method url-fetch)
              (uri (string-append "mirror://gnu/gettext/gettext-"
                                  version ".tar.gz"))
              (sha256
               (base32
-               "0fppvj4l9maa9q1swvhnv96hsqxx90vcjbdyjhqpir3ll55q2n0j"))))
+               "0pb9vp4ifymvdmc31ks3xxcnfqgzj8shll39czmk8c1splclqjzd"))))
     (build-system gnu-build-system)
     (inputs
      `(("expat" ,expat)))
diff --git a/gnu/packages/gtk.scm b/gnu/packages/gtk.scm
index a44c2dd3fe..a01e6d0dd3 100644
--- a/gnu/packages/gtk.scm
+++ b/gnu/packages/gtk.scm
@@ -332,7 +332,7 @@ printing and other features typical of a source code editor.")
 (define-public gdk-pixbuf
   (package
    (name "gdk-pixbuf")
-   (version "2.31.6")
+   (version "2.32.1")
    (source (origin
             (method url-fetch)
             (uri (string-append "mirror://gnome/sources/" name "/"
@@ -340,7 +340,7 @@ printing and other features typical of a source code editor.")
                                 name "-" version ".tar.xz"))
             (sha256
              (base32
-              "062x2gqd7p6yxhxlib1ha4l3gk9ihcj080hrwwv9vmlmybb064hi"))))
+              "1g7kjxv67jcdasi14n7jan4icrnnppd1m99wrdmpv32k4m7vfcj4"))))
    (build-system gnu-build-system)
    (arguments
     '(#:configure-flags '("--with-x11")
diff --git a/gnu/packages/guile.scm b/gnu/packages/guile.scm
index 1b01c4d7ca..e778bf0f6e 100644
--- a/gnu/packages/guile.scm
+++ b/gnu/packages/guile.scm
@@ -296,25 +296,17 @@ many readers as needed).")
                                (string-append "--with-guilesitedir="
                                               (assoc-ref %outputs "out")
                                               "/share/guile/site/2.0"))
-       #:phases (alist-cons-before
-                 'check 'change-locale
-                 (lambda _
-                   ;; Use the locale that's actually available in the build
-                   ;; environment.
-                   (substitute* "test/f009_form_wide.test"
-                     (("en_US\\.utf8")
-                      "en_US.UTF-8")))
-                 (alist-cons-after
-                  'install 'post-install
-                  (lambda* (#:key outputs #:allow-other-keys)
-                    (let* ((out   (assoc-ref outputs "out"))
-                           (dir   (string-append out "/share/guile/site/"))
-                           (files (find-files dir ".scm")))
-                      (substitute* files
-                        (("\"libguile-ncurses\"")
-                         (format #f "\"~a/lib/libguile-ncurses\""
-                                 out)))))
-                  %standard-phases))))
+       #:phases (alist-cons-after
+                 'install 'post-install
+                 (lambda* (#:key outputs #:allow-other-keys)
+                   (let* ((out   (assoc-ref outputs "out"))
+                          (dir   (string-append out "/share/guile/site/"))
+                          (files (find-files dir ".scm")))
+                     (substitute* files
+                       (("\"libguile-ncurses\"")
+                        (format #f "\"~a/lib/libguile-ncurses\""
+                                out)))))
+                 %standard-phases)))
     (home-page "http://www.gnu.org/software/guile-ncurses/")
     (synopsis "Guile bindings to ncurses")
     (description
diff --git a/gnu/packages/multiprecision.scm b/gnu/packages/multiprecision.scm
index 903d160b24..ee74c03700 100644
--- a/gnu/packages/multiprecision.scm
+++ b/gnu/packages/multiprecision.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2012, 2013 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2012, 2013, 2015 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2014 Mark H Weaver <mhw@netris.org>
 ;;; Copyright © 2015 Andreas Enge <andreas@enge.fr>
 ;;;
@@ -39,7 +39,9 @@
             (sha256
              (base32
               "0r5pp27cy7ch3dg5v0rsny8bib1zfvrza6027g2mp5f6v8pd6mli"))
-            (patches (list (search-patch "gmp-arm-asm-nothumb.patch")))))
+            (patches (map search-patch
+                          '("gmp-arm-asm-nothumb.patch"
+                            "gmp-faulty-test.patch")))))
    (build-system gnu-build-system)
    (native-inputs `(("m4" ,m4)))
    (outputs '("out" "debug"))
diff --git a/gnu/packages/patches/coreutils-racy-tail-test.patch b/gnu/packages/patches/coreutils-racy-tail-test.patch
deleted file mode 100644
index 91640513e4..0000000000
--- a/gnu/packages/patches/coreutils-racy-tail-test.patch
+++ /dev/null
@@ -1,13 +0,0 @@
-Skip this test, which uncovers a race condition in how 'tail' handles
-file deletion.  See <http://bugs.gnu.org/21460>.
-
---- a/tests/tail-2/assert.sh
-+++ b/tests/tail-2/assert.sh
-@@ -16,6 +16,7 @@
- # You should have received a copy of the GNU General Public License
- # along with this program.  If not, see <http://www.gnu.org/licenses/>.
- 
-+exit 77				# see <http://bugs.gnu.org/21460>
- 
- # This test fails with tail from textutils-2.0.
- # It would get something like this:
diff --git a/gnu/packages/patches/glibc-locale-incompatibility.patch b/gnu/packages/patches/glibc-locale-incompatibility.patch
new file mode 100644
index 0000000000..baf30a79a7
--- /dev/null
+++ b/gnu/packages/patches/glibc-locale-incompatibility.patch
@@ -0,0 +1,23 @@
+This patch avoids an assertion failure when incompatible locale data
+is encountered:
+
+  https://sourceware.org/ml/libc-alpha/2015-09/msg00575.html
+
+--- glibc-2.22/locale/loadlocale.c	2015-09-22 17:16:02.321981548 +0200
++++ glibc-2.22/locale/loadlocale.c	2015-09-22 17:17:34.814659064 +0200
+@@ -120,10 +120,11 @@
+ 	 _nl_value_type_LC_XYZ array.  There are all pointers.  */
+       switch (category)
+ 	{
+-#define CATTEST(cat) \
+-	case LC_##cat:							      \
+-	  assert (cnt < (sizeof (_nl_value_type_LC_##cat)		      \
+-			 / sizeof (_nl_value_type_LC_##cat[0])));	      \
++#define CATTEST(cat)						\
++	case LC_##cat:						\
++	  if (cnt >= (sizeof (_nl_value_type_LC_##cat)		\
++		      / sizeof (_nl_value_type_LC_##cat[0])))	\
++	    goto puntdata;					\
+ 	  break
+ 	  CATTEST (NUMERIC);
+ 	  CATTEST (TIME);
diff --git a/gnu/packages/patches/glibc-versioned-locpath.patch b/gnu/packages/patches/glibc-versioned-locpath.patch
new file mode 100644
index 0000000000..bc7652127f
--- /dev/null
+++ b/gnu/packages/patches/glibc-versioned-locpath.patch
@@ -0,0 +1,240 @@
+The format of locale data can be incompatible between libc versions, and
+loading incompatible data can lead to 'setlocale' returning EINVAL at best
+or triggering an assertion failure at worst.  See
+https://lists.gnu.org/archive/html/guix-devel/2015-09/msg00717.html
+for background information.
+
+To address that, this patch changes libc to honor a new 'GUIX_LOCPATH'
+variable, and to look for locale data in version-specific sub-directories of
+that variable.  So, if GUIX_LOCPATH=/foo:/bar, locale data is searched for in
+/foo/X.Y and /bar/X.Y, where X.Y is the libc version number.
+
+That way, a single 'GUIX_LOCPATH' setting can work even if different libc
+versions coexist on the system.
+
+--- a/locale/newlocale.c
++++ b/locale/newlocale.c
+@@ -30,6 +30,7 @@
+ /* Lock for protecting global data.  */
+ __libc_rwlock_define (extern , __libc_setlocale_lock attribute_hidden)
+ 
++extern error_t compute_locale_search_path (char **, size_t *);
+ 
+ /* Use this when we come along an error.  */
+ #define ERROR_RETURN							      \
+@@ -48,7 +49,6 @@ __newlocale (int category_mask, const char *locale, __locale_t base)
+   __locale_t result_ptr;
+   char *locale_path;
+   size_t locale_path_len;
+-  const char *locpath_var;
+   int cnt;
+   size_t names_len;
+ 
+@@ -102,17 +102,8 @@ __newlocale (int category_mask, const char *locale, __locale_t base)
+   locale_path = NULL;
+   locale_path_len = 0;
+ 
+-  locpath_var = getenv ("LOCPATH");
+-  if (locpath_var != NULL && locpath_var[0] != '\0')
+-    {
+-      if (__argz_create_sep (locpath_var, ':',
+-			     &locale_path, &locale_path_len) != 0)
+-	return NULL;
+-
+-      if (__argz_add_sep (&locale_path, &locale_path_len,
+-			  _nl_default_locale_path, ':') != 0)
+-	return NULL;
+-    }
++  if (compute_locale_search_path (&locale_path, &locale_path_len) != 0)
++    return NULL;
+ 
+   /* Get the names for the locales we are interested in.  We either
+      allow a composite name or a single name.  */
+diff --git a/locale/setlocale.c b/locale/setlocale.c
+index ead030d..0c0e314 100644
+--- a/locale/setlocale.c
++++ b/locale/setlocale.c
+@@ -215,12 +215,65 @@ setdata (int category, struct __locale_data *data)
+     }
+ }
+ 
++/* Return in *LOCALE_PATH and *LOCALE_PATH_LEN the locale data search path as
++   a colon-separated list.  Return ENOMEN on error, zero otherwise.  */
++error_t
++compute_locale_search_path (char **locale_path, size_t *locale_path_len)
++{
++  char* guix_locpath_var = getenv ("GUIX_LOCPATH");
++  char *locpath_var = getenv ("LOCPATH");
++
++  if (guix_locpath_var != NULL && guix_locpath_var[0] != '\0')
++    {
++      /* Entries in 'GUIX_LOCPATH' take precedence over 'LOCPATH'.  These
++	 entries are systematically prefixed with "/X.Y" where "X.Y" is the
++	 libc version.  */
++      if (__argz_create_sep (guix_locpath_var, ':',
++			     locale_path, locale_path_len) != 0
++	  || __argz_suffix_entries (locale_path, locale_path_len,
++				    "/" VERSION) != 0)
++	goto bail_out;
++    }
++
++  if (locpath_var != NULL && locpath_var[0] != '\0')
++    {
++      char *reg_locale_path = NULL;
++      size_t reg_locale_path_len = 0;
++
++      if (__argz_create_sep (locpath_var, ':',
++			     &reg_locale_path, &reg_locale_path_len) != 0)
++	goto bail_out;
++
++      if (__argz_append (locale_path, locale_path_len,
++			 reg_locale_path, reg_locale_path_len) != 0)
++	goto bail_out;
++
++      free (reg_locale_path);
++    }
++
++  if (*locale_path != NULL)
++    {
++      /* Append the system default locale directory.  */
++      if (__argz_add_sep (locale_path, locale_path_len,
++			  _nl_default_locale_path, ':') != 0)
++	goto bail_out;
++    }
++
++  return 0;
++
++ bail_out:
++  free (*locale_path);
++  *locale_path = NULL;
++  *locale_path_len = 0;
++
++  return ENOMEM;
++}
++
+ char *
+ setlocale (int category, const char *locale)
+ {
+   char *locale_path;
+   size_t locale_path_len;
+-  const char *locpath_var;
+   char *composite;
+ 
+   /* Sanity check for CATEGORY argument.  */
+@@ -251,17 +304,10 @@ setlocale (int category, const char *locale)
+   locale_path = NULL;
+   locale_path_len = 0;
+ 
+-  locpath_var = getenv ("LOCPATH");
+-  if (locpath_var != NULL && locpath_var[0] != '\0')
++  if (compute_locale_search_path (&locale_path, &locale_path_len) != 0)
+     {
+-      if (__argz_create_sep (locpath_var, ':',
+-			     &locale_path, &locale_path_len) != 0
+-	  || __argz_add_sep (&locale_path, &locale_path_len,
+-			     _nl_default_locale_path, ':') != 0)
+-	{
+-	  __libc_rwlock_unlock (__libc_setlocale_lock);
+-	  return NULL;
+-	}
++      __libc_rwlock_unlock (__libc_setlocale_lock);
++      return NULL;
+     }
+ 
+   if (category == LC_ALL)
+diff --git a/string/Makefile b/string/Makefile
+index 8424a61..f925503 100644
+--- a/string/Makefile
++++ b/string/Makefile
+@@ -38,7 +38,7 @@ routines	:= strcat strchr strcmp strcoll strcpy strcspn		\
+ 		   swab strfry memfrob memmem rawmemchr strchrnul	\
+ 		   $(addprefix argz-,append count create ctsep next	\
+ 				     delete extract insert stringify	\
+-				     addsep replace)			\
++				     addsep replace suffix)		\
+ 		   envz basename					\
+ 		   strcoll_l strxfrm_l string-inlines memrchr		\
+ 		   xpg-strerror strerror_l
+diff --git a/string/argz-suffix.c b/string/argz-suffix.c
+new file mode 100644
+index 0000000..505b0f2
+--- /dev/null
++++ b/string/argz-suffix.c
+@@ -0,0 +1,56 @@
++/* Copyright (C) 2015 Free Software Foundation, Inc.
++   This file is part of the GNU C Library.
++   Contributed by Ludovic Courtès <ludo@gnu.org>.
++
++   The GNU C Library is free software; you can redistribute it and/or
++   modify it under the terms of the GNU Lesser General Public
++   License as published by the Free Software Foundation; either
++   version 2.1 of the License, or (at your option) any later version.
++
++   The GNU C Library 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
++   Lesser General Public License for more details.
++
++   You should have received a copy of the GNU Lesser General Public
++   License along with the GNU C Library; if not, see
++   <http://www.gnu.org/licenses/>.  */
++
++#include <argz.h>
++#include <errno.h>
++#include <stdlib.h>
++#include <string.h>
++
++
++error_t
++__argz_suffix_entries (char **argz, size_t *argz_len, const char *suffix)
++
++{
++  size_t suffix_len = strlen (suffix);
++  size_t count = __argz_count (*argz, *argz_len);
++  size_t new_argz_len = *argz_len + count * suffix_len;
++  char *new_argz = malloc (new_argz_len);
++
++  if (new_argz)
++    {
++      char *p = new_argz, *entry;
++
++      for (entry = *argz;
++	   entry != NULL;
++	   entry = argz_next (*argz, *argz_len, entry))
++	{
++	  p = stpcpy (p, entry);
++	  p = stpcpy (p, suffix);
++	  p++;
++	}
++
++      free (*argz);
++      *argz = new_argz;
++      *argz_len = new_argz_len;
++
++      return 0;
++    }
++  else
++    return ENOMEM;
++}
++weak_alias (__argz_suffix_entries, argz_suffix_entries)
+diff --git a/string/argz.h b/string/argz.h
+index bb62a31..d276a35 100644
+--- a/string/argz.h
++++ b/string/argz.h
+@@ -134,6 +134,16 @@ extern error_t argz_replace (char **__restrict __argz,
+ 			     const char *__restrict __str,
+ 			     const char *__restrict __with,
+ 			     unsigned int *__restrict __replace_count);
++
++/* Suffix each entry of ARGZ & ARGZ_LEN with SUFFIX.  Return 0 on success,
++   and ENOMEN if memory cannot be allocated.  */
++extern error_t __argz_suffix_entries (char **__restrict __argz,
++				      size_t *__restrict __argz_len,
++				      const char *__restrict __suffix);
++extern error_t argz_suffix_entries (char **__restrict __argz,
++				    size_t *__restrict __argz_len,
++				    const char *__restrict __suffix);
++
+ 
+ /* Returns the next entry in ARGZ & ARGZ_LEN after ENTRY, or NULL if there
+    are no more.  If entry is NULL, then the first entry is returned.  This
diff --git a/gnu/packages/patches/gmp-faulty-test.patch b/gnu/packages/patches/gmp-faulty-test.patch
new file mode 100644
index 0000000000..3fd8a1f8d6
--- /dev/null
+++ b/gnu/packages/patches/gmp-faulty-test.patch
@@ -0,0 +1,11 @@
+Skip a test that randomly fails on ARMv7: <http://bugs.gnu.org/21620>.
+
+--- a/tests/mpz/reuse.c
++++ b/tests/mpz/reuse.c
+@@ -213,6 +213,7 @@ main (int argc, char **argv)
+   mpz_t bs;
+   unsigned long bsi, size_range;
+ 
++  exit (77);					  /* skip */
+   tests_start ();
+   TESTS_REPS (reps, argv, argc);
diff --git a/gnu/packages/patches/pixman-pointer-arithmetic.patch b/gnu/packages/patches/pixman-pointer-arithmetic.patch
deleted file mode 100644
index d34e6632a0..0000000000
--- a/gnu/packages/patches/pixman-pointer-arithmetic.patch
+++ /dev/null
@@ -1,15 +0,0 @@
-Fix <https://bugs.freedesktop.org/show_bug.cgi?id=92027> whereby
-an arithemitic overflow could occur while doing pointer arithmetic,
-leading pixman to use an invalid address as the destination buffer.
-
---- pixman-0.32.6/pixman/pixman-general.c	2015-09-21 15:14:34.695981325 +0200
-+++ pixman-0.32.6/pixman/pixman-general.c	2015-09-21 15:19:48.898355548 +0200
-@@ -144,8 +144,7 @@ general_composite_rect  (pixman_implemen
-     mask_buffer = ALIGN (src_buffer + width * Bpp);
-     dest_buffer = ALIGN (mask_buffer + width * Bpp);
- 
--    if (ALIGN (dest_buffer + width * Bpp) >
--	    scanline_buffer + sizeof (stack_scanline_buffer))
-+    if ((width + 1) * Bpp * 3 > sizeof (stack_scanline_buffer))
-     {
- 	scanline_buffer = pixman_malloc_ab_plus_c (width, Bpp * 3, 32 * 3);
diff --git a/gnu/packages/patches/python-2.7-search-paths.patch b/gnu/packages/patches/python-2.7-search-paths.patch
new file mode 100644
index 0000000000..6e5339f3a6
--- /dev/null
+++ b/gnu/packages/patches/python-2.7-search-paths.patch
@@ -0,0 +1,16 @@
+Make sure the build system honors CPATH and LIBRARY_PATH when looking for
+headers and libraries.
+
+--- Python-2.7.10/setup.py	2015-10-07 18:33:18.125153186 +0200
++++ Python-2.7.10/setup.py	2015-10-07 18:33:47.497347552 +0200
+@@ -526,6 +526,10 @@ class PyBuildExt(build_ext):
+             inc_dirs += ['/system/include', '/atheos/autolnk/include']
+             inc_dirs += os.getenv('C_INCLUDE_PATH', '').split(os.pathsep)
+ 
++        # Always honor these variables.
++        lib_dirs += os.getenv('LIBRARY_PATH', '').split(os.pathsep)
++        inc_dirs += os.getenv('CPATH', '').split(os.pathsep)
++
+         # OSF/1 and Unixware have some stuff in /usr/ccs/lib (like -ldb)
+         if host_platform in ['osf1', 'unixware7', 'openunix8']:
+             lib_dirs += ['/usr/ccs/lib']
diff --git a/gnu/packages/patches/python-3-search-paths.patch b/gnu/packages/patches/python-3-search-paths.patch
new file mode 100644
index 0000000000..547feae1b9
--- /dev/null
+++ b/gnu/packages/patches/python-3-search-paths.patch
@@ -0,0 +1,19 @@
+Make sure the build system honors CPATH and LIBRARY_PATH when looking for
+headers and libraries.
+
+--- setup.py	2015-10-07 23:32:58.891329173 +0200
++++ setup.py	2015-10-07 23:46:29.653349924 +0200
+@@ -507,11 +507,8 @@ class PyBuildExt(build_ext):
+         # if a file is found in one of those directories, it can
+         # be assumed that no additional -I,-L directives are needed.
+         if not cross_compiling:
+-            lib_dirs = self.compiler.library_dirs + [
+-                '/lib64', '/usr/lib64',
+-                '/lib', '/usr/lib',
+-                ]
+-            inc_dirs = self.compiler.include_dirs + ['/usr/include']
++            lib_dirs = os.getenv('LIBRARY_PATH', '').split(os.pathsep)
++            inc_dirs = os.getenv('CPATH', '').split(os.pathsep)
+         else:
+             lib_dirs = self.compiler.library_dirs[:]
+             inc_dirs = self.compiler.include_dirs[:]
diff --git a/gnu/packages/python.scm b/gnu/packages/python.scm
index d15589ce97..fc4fad6f98 100644
--- a/gnu/packages/python.scm
+++ b/gnu/packages/python.scm
@@ -66,6 +66,7 @@
   #:use-module (gnu packages xml)
   #:use-module (gnu packages xorg)
   #:use-module (gnu packages zip)
+  #:use-module (gnu packages tcl)
   #:use-module (guix packages)
   #:use-module (guix download)
   #:use-module (guix git-download)
@@ -86,7 +87,8 @@
                           version "/Python-" version ".tar.xz"))
       (sha256
        (base32
-        "1h7zbrf9pkj29hlm18b10548ch9757f75m64l47sy75rh43p7lqw"))))
+        "1h7zbrf9pkj29hlm18b10548ch9757f75m64l47sy75rh43p7lqw"))
+      (patches (list (search-patch "python-2.7-search-paths.patch")))))
     (build-system gnu-build-system)
     (arguments
      `(#:tests? #f
@@ -132,32 +134,10 @@
        ;; such file or directory
        #:test-target "test"
        #:configure-flags
-        (let ((bz2 (assoc-ref %build-inputs "bzip2"))
-              (gdbm (assoc-ref %build-inputs "gdbm"))
-              (libffi (assoc-ref %build-inputs "libffi"))
-              (sqlite (assoc-ref %build-inputs "sqlite"))
-              (openssl (assoc-ref %build-inputs "openssl"))
-              (readline (assoc-ref %build-inputs "readline"))
-              (zlib (assoc-ref %build-inputs "zlib"))
-              (out (assoc-ref %outputs "out")))
-         (list "--enable-shared"                  ; allow embedding
-               "--with-system-ffi"                ; build ctypes
-               (string-append "CPPFLAGS="
-                "-I" bz2 "/include "
-                "-I" gdbm "/include "
-                "-I" sqlite "/include "
-                "-I" openssl "/include "
-                "-I" readline "/include "
-                "-I" zlib "/include")
-               (string-append "LDFLAGS="
-                "-L" bz2 "/lib "
-                "-L" gdbm "/lib "
-                "-L" libffi "/lib "
-                "-L" sqlite "/lib "
-                "-L" openssl "/lib "
-                "-L" readline "/lib "
-                "-L" zlib "/lib "
-                "-Wl,-rpath=" out "/lib")))
+       (list "--enable-shared"                    ;allow embedding
+             "--with-system-ffi"                  ;build ctypes
+             (string-append "LDFLAGS=-Wl,-rpath="
+                            (assoc-ref %outputs "out") "/lib"))
 
         #:modules ((ice-9 ftw)
                    ,@%gnu-build-system-modules)
@@ -200,7 +180,9 @@
        ("sqlite" ,sqlite)                         ; for sqlite extension
        ("openssl" ,openssl)
        ("readline" ,readline)
-       ("zlib" ,zlib)))
+       ("zlib" ,zlib)
+       ("tcl" ,tcl)
+       ("tk" ,tk)))                               ; for tkinter
     (native-inputs
      `(("pkg-config" ,pkg-config)))
     (native-search-paths
@@ -208,8 +190,7 @@
             (variable "PYTHONPATH")
             (files '("lib/python2.7/site-packages")))))
     (home-page "http://python.org")
-    (synopsis
-     "High-level, dynamically-typed programming language")
+    (synopsis "High-level, dynamically-typed programming language")
     (description
      "Python is a remarkably powerful dynamic programming language that
 is used in a wide variety of application domains.  Some of its key
@@ -227,9 +208,11 @@ data types.")
               (method url-fetch)
               (uri (string-append "https://www.python.org/ftp/python/"
                                   version "/Python-" version ".tar.xz"))
-              (patches (list (search-patch "python-fix-tests.patch")
-                             ;; XXX Try removing this patch for python > 3.4.3
-                             (search-patch "python-disable-ssl-test.patch")))
+              (patches (map search-patch
+                            '("python-fix-tests.patch"
+                              ;; XXX Try removing this patch for python > 3.4.3
+                              "python-disable-ssl-test.patch"
+                              "python-3-search-paths.patch")))
               (patch-flags '("-p0"))
               (sha256
                (base32
@@ -243,9 +226,38 @@ data types.")
                                         (version-major+minor version)
                                         "/site-packages"))))))))
 
-(define-public python-wrapper
+;; Minimal variants of Python, mostly used to break the cycle between Tk and
+;; Python (Tk -> libxcb -> Python.)
+
+(define-public python2-minimal
+  (package (inherit python-2)
+    (name "python-minimal")
+    (arguments
+     (substitute-keyword-arguments (package-arguments python-2)
+       ((#:configure-flags _)
+        `(list "--enable-shared"
+               (string-append "LDFLAGS=-Wl,-rpath="
+                              (assoc-ref %outputs "out") "/lib")))))
+    (inputs '())))                          ;none of the optional dependencies
+
+(define-public python-minimal
   (package (inherit python)
-    (name "python-wrapper")
+    (name "python-minimal")
+    (arguments
+     (substitute-keyword-arguments (package-arguments python)
+       ((#:configure-flags _)
+        `(list "--enable-shared"
+               (string-append "LDFLAGS=-Wl,-rpath="
+                              (assoc-ref %outputs "out") "/lib")))))
+
+    ;; OpenSSL is a mandatory dependency of Python 3.x, for urllib;
+    ;; zlib is required by 'zipimport', used by pip.
+    (inputs `(("openssl" ,openssl)
+              ("zlib" ,zlib)))))
+
+(define* (wrap-python3 python #:optional (name "python-wrapper"))
+  (package (inherit python)
+    (name name)
     (source #f)
     (build-system trivial-build-system)
     (propagated-inputs `(("python" ,python)))
@@ -263,9 +275,14 @@ data types.")
                              (string-append bin "/" new)))
                   `("python3", "pydoc3", "idle3")
                   `("python",  "pydoc",  "idle"))))))
-    (description (string-append (package-description python)
-     "\n\nThis wrapper package provides symbolic links to the python binaries
-      without version suffix."))))
+    (synopsis "Wrapper for the Python 3 commands")
+    (description
+     "This package provides wrappers for the commands of Python@tie{}3.x such
+that they can be invoked under their usual name---e.g., @command{python}
+instead of @command{python3}.")))
+
+(define-public python-wrapper (wrap-python3 python))
+(define-public python-minimal-wrapper (wrap-python3 python-minimal))
 
 (define-public python-psutil
   (package
@@ -4015,7 +4032,7 @@ without using the configuration machinery.")
                    (man1 (string-append data "/man/man1"))
                    (info (string-append data "/info"))
                    (examples (string-append doc "/examples")))
-              (setenv "LANG" "en_US.UTF-8")
+              (setenv "LANG" "en_US.utf8")
               (with-directory-excursion "docs"
                 ;; FIXME: html and pdf fail to build
                 ;; (system* "make" "html")
diff --git a/gnu/packages/texinfo.scm b/gnu/packages/texinfo.scm
index 92bd9471dd..591fb1f298 100644
--- a/gnu/packages/texinfo.scm
+++ b/gnu/packages/texinfo.scm
@@ -45,6 +45,13 @@
     (inputs `(("ncurses" ,ncurses)
               ("xz" ,xz)
               ("perl" ,perl)))
+
+    (native-search-paths
+     ;; This is the variable used by the standalone Info reader.
+     (list (search-path-specification
+            (variable "INFOPATH")
+            (files '("share/info")))))
+
     (home-page "http://www.gnu.org/software/texinfo/")
     (synopsis "The GNU documentation format")
     (description
diff --git a/gnu/packages/xdisorg.scm b/gnu/packages/xdisorg.scm
index 96e7c3ae71..fbe8af33d0 100644
--- a/gnu/packages/xdisorg.scm
+++ b/gnu/packages/xdisorg.scm
@@ -171,24 +171,21 @@ following the mouse.")
 (define-public pixman
   (package
     (name "pixman")
-    (version "0.32.6")
-    (source
-      (origin
-        (method url-fetch)
-        (uri (string-append
-               "http://cairographics.org/releases/pixman-"
-               version
-               ".tar.gz"))
-        (sha256
-          (base32
-           "0129g4zdrw5hif5783li7rzcr4vpbc2cfia91azxmsk0h0xx3zix"))
-        (patches (list (search-patch "pixman-pointer-arithmetic.patch")))))
+    (version "0.32.8")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append
+                    "http://cairographics.org/releases/pixman-"
+                    version ".tar.gz"))
+              (sha256
+               (base32
+                "0pfn0247sjsi95kwjih0wwqpp28wadihqk1bn28x6iqbqhbxwnjp"))))
     (build-system gnu-build-system)
     (inputs
-      `(("libpng" ,libpng)
-        ("zlib" ,zlib)))
+     `(("libpng" ,libpng)
+       ("zlib" ,zlib)))
     (native-inputs
-      `(("pkg-config" ,pkg-config)))
+     `(("pkg-config" ,pkg-config)))
     (home-page "http://www.pixman.org/")
     (synopsis "Low-level pixel manipulation library")
     (description "Pixman is a low-level software library for pixel
diff --git a/gnu/packages/xml.scm b/gnu/packages/xml.scm
index 5d65648bfb..d9c92d6d93 100644
--- a/gnu/packages/xml.scm
+++ b/gnu/packages/xml.scm
@@ -135,7 +135,7 @@ project (but it is usable outside of the Gnome platform).")
     (synopsis "C library for applying XSLT stylesheets to XML documents")
     (inputs `(("libgcrypt" ,libgcrypt)
               ("libxml2" ,libxml2)
-              ("python" ,python-wrapper)
+              ("python" ,python-minimal-wrapper)
               ("zlib" ,zlib)))
     (description
      "Libxslt is an XSLT C library developed for the GNOME project.  It is
diff --git a/gnu/packages/xorg.scm b/gnu/packages/xorg.scm
index b166260080..efef1eadc2 100644
--- a/gnu/packages/xorg.scm
+++ b/gnu/packages/xorg.scm
@@ -2050,7 +2050,7 @@ legacy X clients.")
             "0bp3f53l9fy5x3mn1rkj1g81aiyzl90wacwvqdgy831aa3kfxb5l"))))
     (build-system gnu-build-system)
     (native-inputs
-      `(("pkg-config" ,pkg-config) ("python" ,python-wrapper)))
+      `(("pkg-config" ,pkg-config) ("python" ,python-minimal-wrapper)))
     (home-page "http://www.x.org/wiki/")
     (synopsis "XML-XCB protocol descriptions")
     (description
@@ -4804,7 +4804,7 @@ protocol.")
         ("libxslt" ,libxslt)))
     (native-inputs
       `(("pkg-config" ,pkg-config)
-        ("python" ,python-wrapper)))
+        ("python" ,python-minimal-wrapper)))
     (arguments
      `(#:configure-flags '("--enable-xkb")))
     (home-page "http://www.x.org/wiki/")
@@ -4889,7 +4889,7 @@ over Xlib, including:
         ("xtrans" ,xtrans)
         ("zlib" ,zlib)))
     (native-inputs
-       `(("python" ,python-wrapper)
+       `(("python" ,python-minimal-wrapper)
          ("pkg-config" ,pkg-config)))
     (arguments
      `(#:parallel-tests? #f
diff --git a/gnu/system/locale.scm b/gnu/system/locale.scm
index 393dd42354..010fb45272 100644
--- a/gnu/system/locale.scm
+++ b/gnu/system/locale.scm
@@ -19,6 +19,7 @@
 (define-module (gnu system locale)
   #:use-module (guix gexp)
   #:use-module (guix records)
+  #:use-module (guix packages)
   #:use-module (gnu packages base)
   #:use-module (gnu packages compression)
   #:use-module (srfi srfi-26)
@@ -57,14 +58,20 @@
                       "-i" #$(locale-definition-source locale)
                       "-f" #$(locale-definition-charset locale)
                       (string-append #$output "/"
+                                     #$(package-version libc) "/"
                                      #$(locale-definition-name locale))))))
 
 (define* (locale-directory locales
                            #:key (libc (canonical-package glibc)))
-  "Return a directory containing all of LOCALES compiled."
+  "Return a directory containing all of LOCALES for LIBC compiled.
+
+Because locale data formats are incompatible when switching from one libc to
+another, locale data is put in a sub-directory named after the 'version' field
+of LIBC."
   (define build
     #~(begin
         (mkdir #$output)
+        (mkdir (string-append #$output "/" #$(package-version libc)))
 
         ;; 'localedef' executes 'gzip' to access compressed locale sources.
         (setenv "PATH" (string-append #$gzip "/bin"))