gnu: glibc: Honor 'GUIX_LOCPATH'.

* gnu/packages/patches/glibc-guix-locpath.patch: New file.
* gnu-system.am (dist_patch_DATA): Add it.
* gnu/packages/base.scm (glibc)[source]: Use it.
  [native-search-paths]: Use 'GUIX_LOCPATH' instead of 'LOCPATH'.
* doc/guix.texi (Application Setup): Introduce the term "foreign
  distro".  Document 'GUIX_LOCPATH'.
master
Ludovic Courtès 2015-10-01 21:32:50 +02:00
parent 1668dfcd37
commit fbb909ac7e
4 changed files with 59 additions and 9 deletions

View File

@ -933,24 +933,24 @@ daemons on the same machine.
@node Application Setup
@section Application Setup
When using Guix on top of GNU/Linux distribution other than GuixSD, a
few additional steps are needed to get everything in place. Here are
some of them.
When using Guix on top of GNU/Linux distribution other than GuixSD---a
so-called @dfn{foreign distro}---a few additional steps are needed to
get everything in place. Here are some of them.
@subsection Locales
@anchor{locales-and-locpath}
@cindex locales, when not on GuixSD
@vindex LOCPATH
@vindex GUIX_LOCPATH
Packages installed @i{via} Guix will not use the host system's locale
data. Instead, you must first install one of the locale packages
available with Guix and then define the @code{LOCPATH} environment
variable (@pxref{Locale Names, @code{LOCPATH},, libc, The GNU C Library
Reference Manual}):
available with Guix and then define the @code{GUIX_LOCPATH} environment
variable:
@example
$ guix package -i glibc-locales
$ export LOCPATH=$HOME/.guix-profile/lib/locale
$ export GUIX_LOCPATH=$HOME/.guix-profile/lib/locale
@end example
Note that the @code{glibc-locales} package contains data for all the
@ -958,6 +958,18 @@ locales supported by the GNU@tie{}libc and weighs in at around
110@tie{}MiB. Alternately, the @code{glibc-utf8-locales} is smaller but
limited to a few UTF-8 locales.
The @code{GUIX_LOCPATH} variable plays the exact same role as
@code{LOCPATH} (@pxref{Locale Names, @code{LOCPATH},, libc, The GNU C
Library Reference Manual}). However, since it is honored only by Guix's
libc, and not by the libc provided by foreign distros, using
@code{GUIX_LOCPATH} allows you to make sure the the foreign distro's
programs will not end up loading incompatible locale data. This is
important because the locale data format used by different libc versions
may be incompatible.
When both @code{GUIX_LOCPATH} and @code{LOCPATH} are defined, the latter
takes precedence.
@subsection X11 Fonts
The majority of graphical applications use Fontconfig to locate and

View File

@ -468,6 +468,7 @@ dist_patch_DATA = \
gnu/packages/patches/glib-tests-timer.patch \
gnu/packages/patches/glib-tests-gapplication.patch \
gnu/packages/patches/glibc-bootstrap-system.patch \
gnu/packages/patches/glibc-guix-locpath.patch \
gnu/packages/patches/glibc-ldd-x86_64.patch \
gnu/packages/patches/glibc-locales.patch \
gnu/packages/patches/glibc-locale-incompatibility.patch \

View File

@ -484,6 +484,7 @@ store.")
(patches (map search-patch
'("glibc-ldd-x86_64.patch"
"glibc-locale-incompatibility.patch"
"glibc-guix-locpath.patch"
"glibc-o-largefile.patch")))))
(build-system gnu-build-system)
@ -614,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")

View File

@ -0,0 +1,34 @@
Honor a special 'GUIX_LOCPATH' environment variable.
This is most useful when using Guix on top of another distro, which uses an
different libc version with incompatible locale data. In this case, setting
'GUIX_LOCPATH' rather than 'LOCPATH' allows users to tell Guix's libc where to
look for its locale data without breaking programs that use the other libc.
See <https://lists.gnu.org/archive/html/guix-devel/2015-09/msg00717.html> for
some background information.
--- a/locale/newlocale.c
+++ b/locale/newlocale.c
@@ -103,6 +103,8 @@ __newlocale (int category_mask, const char *locale, __locale_t base)
locale_path_len = 0;
locpath_var = getenv ("LOCPATH");
+ if (locpath_var == NULL || locpath_var[0] == '\0')
+ locpath_var = getenv ("GUIX_LOCPATH");
if (locpath_var != NULL && locpath_var[0] != '\0')
{
if (__argz_create_sep (locpath_var, ':',
diff --git a/locale/setlocale.c b/locale/setlocale.c
index ead030d..0e66c7b 100644
--- a/locale/setlocale.c
+++ b/locale/setlocale.c
@@ -252,6 +252,8 @@ setlocale (int category, const char *locale)
locale_path_len = 0;
locpath_var = getenv ("LOCPATH");
+ if (locpath_var == NULL || locpath_var[0] == '\0')
+ locpath_var = getenv ("GUIX_LOCPATH");
if (locpath_var != NULL && locpath_var[0] != '\0')
{
if (__argz_create_sep (locpath_var, ':',