aboutsummaryrefslogtreecommitdiff
path: root/gnu/packages/commencement.scm
diff options
context:
space:
mode:
Diffstat (limited to 'gnu/packages/commencement.scm')
-rw-r--r--gnu/packages/commencement.scm95
1 files changed, 83 insertions, 12 deletions
diff --git a/gnu/packages/commencement.scm b/gnu/packages/commencement.scm
index fe26089494..caadc94485 100644
--- a/gnu/packages/commencement.scm
+++ b/gnu/packages/commencement.scm
@@ -660,10 +660,90 @@ 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)
+ (name "ld-wrapper")
+ (inputs `(("guile" ,guile-final)
+ ("bash" ,bash-final)
+ ,@(fold alist-delete (package-inputs ld-wrapper-boot3)
+ '("guile" "bash"))))))
+
(define %boot5-inputs
- ;; Now with UTF-8 locale.
- `(("locales" ,glibc-utf8-locales-final)
- ,@%boot4-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
+ ;; <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-light))
+
+ ;; 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")))))
(define gnu-make-final
;; The final GNU Make, which uses the final Guile.
@@ -673,15 +753,6 @@ exec ~a/bin/~a-~a -B~a/lib -Wl,-dynamic-linker -Wl,~a/~a \"$@\"~%"
,@%boot5-inputs)
(current-source-location))))
-(define-public ld-wrapper
- ;; The final `ld' wrapper, which uses the final Guile.
- (package (inherit ld-wrapper-boot3)
- (name "ld-wrapper")
- (inputs `(("guile" ,guile-final)
- ("bash" ,bash-final)
- ,@(fold alist-delete (package-inputs ld-wrapper-boot3)
- '("guile" "bash"))))))
-
(define coreutils-final
;; The final Coreutils. Treat them specially because some packages, such as
;; Findutils, keep a reference to the Coreutils they were built with.