summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--distro/packages/base.scm7
-rw-r--r--distro/packages/bootstrap.scm5
-rw-r--r--guix/build/gnu-build-system.scm16
3 files changed, 22 insertions, 6 deletions
diff --git a/distro/packages/base.scm b/distro/packages/base.scm
index ea6297107f..30bd804b56 100644
--- a/distro/packages/base.scm
+++ b/distro/packages/base.scm
@@ -774,6 +774,7 @@ identifier SYSTEM."
                     (let* ((binutils (assoc-ref %build-inputs "binutils"))
                            (gcc      (assoc-ref %build-inputs "gcc"))
                            (libc     (assoc-ref %build-inputs "libc"))
+                           (bash     (assoc-ref %build-inputs "bash"))
                            (out      (assoc-ref %outputs "out"))
                            (bindir   (string-append out "/bin"))
                            (triplet  ,(boot-triplet system)))
@@ -790,8 +791,9 @@ identifier SYSTEM."
                         ;; the dynamic linker.
                         (call-with-output-file "gcc"
                           (lambda (p)
-                            (format p "#!/bin/sh
+                            (format p "#!~a/bin/bash
 exec ~a/bin/~a-gcc -B~a/lib -Wl,-dynamic-linker -Wl,~a/~a \"$@\"~%"
+                                    bash
                                     gcc triplet
                                     libc libc
                                     ,(glibc-dynamic-linker system))))
@@ -800,7 +802,8 @@ exec ~a/bin/~a-gcc -B~a/lib -Wl,-dynamic-linker -Wl,~a/~a \"$@\"~%"
     (native-inputs
      `(("binutils" ,binutils-boot0)
        ("gcc" ,gcc-boot0)
-       ("libc" ,glibc-final)))
+       ("libc" ,glibc-final)
+       ("bash" ,(assoc-ref %boot1-inputs "bash"))))
     (inputs '())))
 
 (define %boot2-inputs
diff --git a/distro/packages/bootstrap.scm b/distro/packages/bootstrap.scm
index 63e8109800..963b6526da 100644
--- a/distro/packages/bootstrap.scm
+++ b/distro/packages/bootstrap.scm
@@ -366,6 +366,9 @@ exec ~a/bin/.gcc-wrapped -B~a/lib \
   `(("libc" ,%bootstrap-glibc)
     ("gcc" ,%bootstrap-gcc)
     ("binutils" ,%bootstrap-binutils)
-    ("coreutils&co" ,%bootstrap-coreutils&co)))
+    ("coreutils&co" ,%bootstrap-coreutils&co)
+
+    ;; In gnu-build-system.scm, we rely on the availability of Bash.
+    ("bash" ,%bootstrap-coreutils&co)))
 
 ;;; bootstrap.scm ends here
diff --git a/guix/build/gnu-build-system.scm b/guix/build/gnu-build-system.scm
index 2b7d1c180e..efee570292 100644
--- a/guix/build/gnu-build-system.scm
+++ b/guix/build/gnu-build-system.scm
@@ -90,12 +90,17 @@
                          (append patch-flags (list "--input" p)))))
          patches))
 
-(define* (configure #:key outputs (configure-flags '()) out-of-source?
+(define* (configure #:key inputs outputs (configure-flags '()) out-of-source?
                     #:allow-other-keys)
   (let* ((prefix     (assoc-ref outputs "out"))
          (libdir     (assoc-ref outputs "lib"))
          (includedir (assoc-ref outputs "include"))
-         (flags      `(,(string-append "--prefix=" prefix)
+         (bash       (or (and=> (assoc-ref inputs "bash")
+                                (cut string-append <> "/bin/bash"))
+                         "/bin/sh"))
+         (flags      `(,(string-append "CONFIG_SHELL=" bash)
+                       ,(string-append "SHELL=" bash)
+                       ,(string-append "--prefix=" prefix)
                        "--enable-fast-install"    ; when using Libtool
 
                        ;; Produce multiple outputs when specific output names
@@ -121,10 +126,15 @@
     (format #t "build directory: ~s~%" (getcwd))
     (format #t "configure flags: ~s~%" flags)
 
+    ;; Use BASH to reduce reliance on /bin/sh since it may not always be
+    ;; reliable (see
+    ;; <http://thread.gmane.org/gmane.linux.distributions.nixos/9748>
+    ;; for a summary of the situation.)
+    ;;
     ;; Call `configure' with a relative path.  Otherwise, GCC's build system
     ;; (for instance) records absolute source file names, which typically
     ;; contain the hash part of the `.drv' file, leading to a reference leak.
-    (zero? (apply system*
+    (zero? (apply system* bash
                   (string-append srcdir "/configure")
                   flags))))