diff --git a/doc/guix.texi b/doc/guix.texi index 6a3765f56a..68ee451efc 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -5591,9 +5591,10 @@ list only the locales that are actually used, as in: @vindex LOCPATH The compiled locale definitions are available at -@file{/run/current-system/locale}, which is the default location where -the GNU@tie{}libc looks for locale data. This can be overridden using -the @code{LOCPATH} environment variable (@pxref{locales-and-locpath, +@file{/run/current-system/locale/X.Y}, where @code{X.Y} is the libc +version, which is the default location where the GNU@tie{}libc provided +by Guix looks for locale data. This can be overridden using the +@code{LOCPATH} environment variable (@pxref{locales-and-locpath, @code{LOCPATH} and locale packages}). The @code{locale-definition} form is provided by the @code{(gnu system diff --git a/gnu/packages/base.scm b/gnu/packages/base.scm index a3e3e36608..a7d9459913 100644 --- a/gnu/packages/base.scm +++ b/gnu/packages/base.scm @@ -509,12 +509,16 @@ (define-public glibc ;; 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 + ;; . ;; ;; `--localedir' is not honored, so work around it. ;; See . - (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") 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 @@ (define* (localedef-command locale "-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"))