~ruther/guix-local

46bd6edd5af4b4fe1f1d066028a6a84ed17ce96b — Ludovic Courtès 10 years ago c24fff6
gnu: libc: Look for locale data under /run/current-system/locale/X.Y.

* gnu/packages/base.scm (glibc)[arguments]: Append VERSION to
  'libc_cv_localedir'.
* gnu/system/locale.scm (localedef-command): Write to the sub-directory
  called (package-version libc) in #$output.
  (locale-directory): Create said directory.
* doc/guix.texi (Locales): Mention the per-version sub-directory.
3 files changed, 19 insertions(+), 7 deletions(-)

M doc/guix.texi
M gnu/packages/base.scm
M gnu/system/locale.scm
M doc/guix.texi => doc/guix.texi +4 -3
@@ 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

M gnu/packages/base.scm => gnu/packages/base.scm +7 -3
@@ 509,12 509,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")

M gnu/system/locale.scm => gnu/system/locale.scm +8 -1
@@ 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"))