aboutsummaryrefslogtreecommitdiff
path: root/gnu/build/locale.scm
blob: 412759a320bb8df9cfa980f36b50ff8c2b4398cd (about) (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2019 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 build locale)
  #:use-module (guix build utils)
  #:use-module (srfi srfi-1)
  #:use-module (ice-9 rdelim)
  #:use-module (ice-9 match)
  #:use-module (ice-9 regex)
  #:export (build-locale
            normalize-codeset
            locale->name+codeset
            read-supported-locales))

(define locale-rx
  ;; Regexp matching a locale line in 'localedata/SUPPORTED'.
  (make-regexp
   "^[[:space:]]*([[:graph:]]+)/([[:graph:]]+)[[:space:]]*\\\\$"))

(define (read-supported-locales port)
  "Read the 'localedata/SUPPORTED' file from PORT.  That file is actually a
makefile snippet, with one locale per line, and a header that can be
discarded."
  (let loop ((locales '()))
    (define line
      (read-line port))

    (cond ((eof-object? line)
           (reverse locales))
          ((string-prefix? "#" (string-trim line)) ;comment
           (loop locales))
          ((string-contains line "=")            ;makefile variable assignment
           (loop locales))
          (else
           (match (regexp-exec locale-rx line)
             (#f
              (loop locales))
             (m
              (loop (alist-cons (match:substring m 1)
                                (match:substring m 2)
                                locales))))))))

(define (normalize-codeset codeset)
  "Compute the \"normalized\" variant of CODESET."
  ;; info "(libc) Using gettextized software", for the algorithm used to
  ;; compute the normalized codeset.
  (letrec-syntax ((-> (syntax-rules ()
                        ((_ proc value)
                         (proc value))
                        ((_ proc rest ...)
                         (proc (-> rest ...))))))
    (-> (lambda (str)
          (if (string-every char-set:digit str)
              (string-append "iso" str)
              str))
        string-downcase
        (lambda (str)
          (string-filter char-set:letter+digit str))
        codeset)))

(define* (build-locale locale
                       #:key
                       (localedef "localedef")
                       (directory ".")
                       (codeset "UTF-8")
                       (name (string-append locale "." codeset)))
  "Compute locale data for LOCALE and CODESET--e.g., \"en_US\" and
\"UTF-8\"--with LOCALEDEF, and store it in DIRECTORY under NAME."
  (format #t "building locale '~a'...~%" name)
  (invoke localedef "--no-archive" "--prefix" directory
          "-i" locale "-f" codeset
          (string-append directory "/" name)))

(define (locale->name+codeset locale)
  "Split a locale name such as \"aa_ER@saaho.UTF-8\" into two values: the
language/territory/modifier part, and the codeset."
  (match (string-rindex locale #\.)
    (#f  (values locale #f))
    (dot (values (string-take locale dot)
                 (string-drop locale (+ dot 1))))))
"/icu4c-" (string-map (lambda (x) (if (char=? x #\.) #\_ x)) version) "-src.tgz")) (sha256 (base32 "0icps0avkwy5df3wwc5kybxcg63hcgk4phdh9g244g0xrmx7pfjc")))))) (define-public icu4c-build-root (package (inherit icu4c) (name "icu4c-build-root") (arguments (substitute-keyword-arguments (package-arguments icu4c) ((#:tests? _ #f) #f) ((#:out-of-source? _ #t) #t) ((#:phases phases) #~(modify-phases #$phases (replace 'install (lambda _ (copy-recursively "../build" #$output))))))) (native-inputs '()))) (define-public java-icu4j (package (name "java-icu4j") (version "70.1") (source (origin (method url-fetch) (uri (string-append "https://github.com/unicode-org/icu/releases/download/release-" (string-map (lambda (x) (if (char=? x #\.) #\- x)) version) "/icu4j-" (string-map (lambda (x) (if (char=? x #\.) #\_ x)) version) ".tgz")) (sha256 (base32 "0qrs75iyzn19kf54q55jn8wf6xjlpkrihdwqpxm39jdh2hz4cgvj")))) (build-system ant-build-system) (arguments `(#:make-flags ,#~(list (string-append "-Djunit.core.jar=" (car (find-files #$(this-package-native-input "java-junit") ".*.jar$"))) (string-append "-Djunit.junitparams.jar=" (car (find-files #$(this-package-native-input "java-junitparams") ".*.jar$"))) (string-append "-Djunit.hamcrest.jar=" (car (find-files #$(this-package-native-input "java-hamcrest-core") ".*.jar$")))) #:phases (modify-phases %standard-phases (add-before 'configure 'chdir (lambda _ (chdir ".."))) (add-before 'build 'remove-ivy (lambda _ ;; This target wants to download ivy and use it to download ;; junit. (substitute* "build.xml" (("depends=\"test-init-junit-dependency\"") "")))) (replace 'install (lambda* (#:key outputs #:allow-other-keys) (let ((share (string-append (assoc-ref outputs "out") "/share/java/"))) (mkdir-p share) (install-file "icu4j.jar" share))))))) (native-inputs (list java-junit java-junitparams java-hamcrest-core)) (home-page "http://site.icu-project.org/") (synopsis "International Components for Unicode") (description "ICU is a set of C/C++ and Java libraries providing Unicode and globalisation support for software applications. This package contains the Java part.") (license x11))) (define-public icu4c-for-skia ;; The current version of skia needs this exact commit ;; for its test dependencies. (let ((commit "a0718d4f121727e30b8d52c7a189ebf5ab52421f") (revision "0")) (package (inherit icu4c) (name "icu4c-for-skia") (version "skia") (source (origin (method git-fetch) (uri (git-reference (url "https://chromium.googlesource.com/chromium/deps/icu.git") (commit commit))) (file-name (git-file-name name version)) (sha256 (base32 "1qxws2p91f6dmhy7d3967r5ygz06r88pkmpm97px067x0zzdz384")))) (arguments (list #:make-flags #~(list (string-append "DESTDIR=" #$output)) #:configure-flags #~(list "--prefix=" "--exec-prefix=") #:phases #~(modify-phases %standard-phases (add-after 'unpack 'chdir-to-source (lambda _ (chdir "source"))) (replace 'configure (lambda* (#:key inputs parallel-build? configure-flags #:allow-other-keys) (setenv "CONFIG_SHELL" (which "sh")) (setenv "OPTS" (string-join configure-flags)) (invoke "./runConfigureICU" "Linux/gcc" "--disable-layout" "--disable-tests"))) (add-after 'install 'install-cleanup (lambda* (#:key make-flags #:allow-other-keys) (with-directory-excursion "data" (apply invoke "make" "clean" make-flags)))) (add-after 'install-cleanup 'configure-filtered-data (lambda* (#:key configure-flags #:allow-other-keys) (setenv "OPTS" (string-join configure-flags)) (setenv "ICU_DATA_FILTER_FILE" (string-append (getcwd) "/../filters/common.json")) (invoke "./runConfigureICU" "Linux/gcc" "--disable-layout" "--disable-tests"))) (add-after 'configure-filtered-data 'build-filtered-data (lambda* (#:key parallel-build? make-flags #:allow-other-keys) (let ((job-count (if parallel-build? (number->string (parallel-job-count)) "1"))) (apply invoke "make" "-j" job-count make-flags) (setenv "DESTDIR" #$output) (invoke "bash" "../scripts/copy_data.sh" "common")))) (add-after 'build-filtered-data 'install-scripts-and-data (lambda _ (let* ((share (string-append #$output "/share")) (scripts (string-append share "/scripts")) (data (string-append share "/data/common"))) ;; Install scripts. (mkdir-p scripts) (copy-recursively "../scripts/" scripts) ;; Install data. (mkdir-p data) (copy-recursively "./dataout/common/data/out/tmp" data) (symlink (string-append data "/icudt69l.dat") (string-append data "/icudtl.dat"))))) (add-before 'check 'disable-failing-uconv-test (lambda _ (substitute* "extra/uconv/Makefile.in" (("check: check-local") ""))))))) (native-inputs (list cpio pkg-config python)))))