summary refs log tree commit diff
diff options
context:
space:
mode:
authorLudovic Courtès <ludo@gnu.org>2012-12-15 16:35:26 +0100
committerLudovic Courtès <ludo@gnu.org>2012-12-15 16:35:26 +0100
commitd008415219df27f0b0ab000ceed12226183cd9b2 (patch)
tree83debd8ecf8b08bd89646d36c251b8755da1b2c6
parentc1c94acf3206a086358e2ea39aa011c8299d29e5 (diff)
downloadguix-d008415219df27f0b0ab000ceed12226183cd9b2.tar.gz
build-system/gnu: Patch shebangs in executable source files.
This allows many packages to build in a chroot that lacks /bin and
thus /bin/sh.

* guix/build/gnu-build-system.scm (patch-source-shebangs): New
  procedure.
  (%standard-phases): Add it.
* guix/build/utils.scm (executable-file?): New procedure.
* distro/packages/perl.scm (perl): Don't use /bin/sh to run `Configure'.
-rw-r--r--distro/packages/perl.scm2
-rw-r--r--guix/build/gnu-build-system.scm21
-rw-r--r--guix/build/utils.scm7
3 files changed, 28 insertions, 2 deletions
diff --git a/distro/packages/perl.scm b/distro/packages/perl.scm
index b17342f7ad..26b25b154d 100644
--- a/distro/packages/perl.scm
+++ b/distro/packages/perl.scm
@@ -55,7 +55,7 @@
                 (("/bin/pwd") pwd))
 
               (zero?
-               (system* "/bin/sh" "./Configure"
+               (system* "./Configure"
                         (string-append "-Dprefix=" out)
                         (string-append "-Dman1dir=" out "/share/man/man1")
                         (string-append "-Dman3dir=" out "/share/man/man3")
diff --git a/guix/build/gnu-build-system.scm b/guix/build/gnu-build-system.scm
index 3b139a99b8..b67918552c 100644
--- a/guix/build/gnu-build-system.scm
+++ b/guix/build/gnu-build-system.scm
@@ -82,6 +82,24 @@
   (and (zero? (system* "tar" "xvf" source))
        (chdir (first-subdirectory "."))))
 
+(define* (patch-source-shebangs #:key source #:allow-other-keys)
+  ;; Patch shebangs in executable source files.  Most scripts honor
+  ;; $SHELL and $CONFIG_SHELL, but some don't, such as `mkinstalldirs'
+  ;; or Automake's `missing' script.
+  (for-each patch-shebang
+            (filter (lambda (file)
+                      (and (executable-file? file)
+                           (not (file-is-directory? file))))
+                    (find-files "." ".*")))
+
+  ;; Gettext-generated po/Makefile.in.in does not honor $SHELL.
+  (let ((bash (search-path (search-path-as-string->list (getenv "PATH"))
+                           "bash")))
+    (when (file-exists? "po/Makefile.in.in")
+      (substitute* "po/Makefile.in.in"
+        (("^SHELL[[:blank:]]*=.*$")
+         (string-append "SHELL = " bash))))))
+
 (define* (patch #:key (patches '()) (patch-flags '("--batch" "-p1"))
                 #:allow-other-keys)
   (every (lambda (p)
@@ -231,7 +249,8 @@
   ;; Standard build phases, as a list of symbol/procedure pairs.
   (let-syntax ((phases (syntax-rules ()
                          ((_ p ...) `((p . ,p) ...)))))
-    (phases set-paths unpack patch configure build check install
+    (phases set-paths unpack patch-source-shebangs patch configure
+            build check install
             patch-shebangs strip)))
 
 
diff --git a/guix/build/utils.scm b/guix/build/utils.scm
index 8f0eb66d39..99a43cfebd 100644
--- a/guix/build/utils.scm
+++ b/guix/build/utils.scm
@@ -26,6 +26,7 @@
   #:use-module (rnrs bytevectors)
   #:use-module (rnrs io ports)
   #:export (directory-exists?
+            executable-file?
             with-directory-excursion
             mkdir-p
             copy-recursively
@@ -56,6 +57,12 @@
     (and s
          (eq? 'directory (stat:type s)))))
 
+(define (executable-file? file)
+  "Return #t if FILE exists and is executable."
+  (let ((s (stat file #f)))
+    (and s
+         (not (zero? (logand (stat:mode s) #o100))))))
+
 (define-syntax-rule (with-directory-excursion dir body ...)
   "Run BODY with DIR as the process's current directory."
   (let ((init (getcwd)))