summaryrefslogtreecommitdiff
path: root/gnu/packages/commencement.scm
diff options
context:
space:
mode:
Diffstat (limited to 'gnu/packages/commencement.scm')
-rw-r--r--gnu/packages/commencement.scm122
1 files changed, 95 insertions, 27 deletions
diff --git a/gnu/packages/commencement.scm b/gnu/packages/commencement.scm
index 74c3f304af..56c4cefaf9 100644
--- a/gnu/packages/commencement.scm
+++ b/gnu/packages/commencement.scm
@@ -419,18 +419,17 @@ exec ~a/bin/~a-~a -B~a/lib -Wl,-dynamic-linker -Wl,~a/~a \"$@\"~%"
#:guile %bootstrap-guile))))
(define static-bash-for-glibc
- ;; A statically-linked Bash to be embedded in GLIBC-FINAL, for use by
- ;; system(3) & co.
+ ;; A statically-linked Bash to be used by GLIBC-FINAL in system(3) & co.
(let* ((gcc (cross-gcc-wrapper gcc-boot0 binutils-boot0
glibc-final-with-bootstrap-bash
(car (assoc-ref %boot1-inputs "bash"))))
- (bash (package (inherit bash-light)
+ (bash (package (inherit static-bash)
(native-inputs `(("bison" ,bison-boot1)))
(arguments
`(#:guile ,%bootstrap-guile
- ,@(package-arguments bash-light))))))
+ ,@(package-arguments static-bash))))))
(package-with-bootstrap-guile
- (package-with-explicit-inputs (static-package bash)
+ (package-with-explicit-inputs bash
`(("gcc" ,gcc)
("libc" ,glibc-final-with-bootstrap-bash)
,@(fold alist-delete %boot1-inputs
@@ -490,6 +489,7 @@ exec ~a/bin/~a-~a -B~a/lib -Wl,-dynamic-linker -Wl,~a/~a \"$@\"~%"
(arguments
`(#:allowed-references
,(cons* `(,gcc-boot0 "lib") (linux-libre-headers-boot0)
+ static-bash-for-glibc
(package-outputs glibc-final-with-bootstrap-bash))
,@(package-arguments glibc-final-with-bootstrap-bash)))))
@@ -562,7 +562,8 @@ exec ~a/bin/~a-~a -B~a/lib -Wl,-dynamic-linker -Wl,~a/~a \"$@\"~%"
`(#:guile ,%bootstrap-guile
#:implicit-inputs? #f
- #:allowed-references ("out" "lib" ,glibc-final)
+ #:allowed-references ("out" "lib"
+ ,glibc-final ,static-bash-for-glibc)
;; Things like libasan.so and libstdc++.so NEED ld.so for some
;; reason, but it is not in their RUNPATH. This is a false
@@ -596,8 +597,12 @@ exec ~a/bin/~a-~a -B~a/lib -Wl,-dynamic-linker -Wl,~a/~a \"$@\"~%"
((#:phases phases)
`(alist-delete 'symlink-libgcc_eh ,phases)))))
- ;; This time we want Texinfo, so we get the manual.
+ ;; This time we want Texinfo, so we get the manual. Add
+ ;; STATIC-BASH-FOR-GLIBC so that it's used in the final shebangs of
+ ;; scripts such as 'mkheaders' and 'fixinc.sh' (XXX: who cares about these
+ ;; scripts?).
(native-inputs `(("texinfo" ,texinfo-boot0)
+ ("static-bash" ,static-bash-for-glibc)
,@(package-native-inputs gcc-boot0)))
(inputs `(("gmp-source" ,(bootstrap-origin (package-source gmp)))
@@ -655,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-minimal))
+
+ ;; 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.
@@ -668,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.
@@ -791,14 +867,6 @@ COREUTILS-FINAL vs. COREUTILS, etc."
(((names . directories) ...)
(union-build out directories)))
- ;; Remove the 'sh' and 'bash' binaries that come with
- ;; libc to avoid polluting the user's profile (these are
- ;; statically-linked binaries with no locale support and
- ;; so on.)
- (for-each (lambda (file)
- (delete-file (string-append out "/bin/" file)))
- '("sh" "bash"))
-
(union-build (assoc-ref %outputs "debug")
(list (assoc-ref %build-inputs
"libc-debug")))))))