~ruther/guix-local

11996d85d3cfa31ecf969421b4dc718b617bf2ff — Andreas Enge 13 years ago 93a6f55
Patch-shebang: Handle "#!/usr/bin/env command"

* guix/build/utils.scm (patch-shebang): Handle replacement of
   "#!.*/env CMD ARGS" by "#!/nix/store/path/.../to/CMD ARGS".
1 files changed, 22 insertions(+), 10 deletions(-)

M guix/build/utils.scm
M guix/build/utils.scm => guix/build/utils.scm +22 -10
@@ 1,5 1,6 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2012, 2013 Ludovic Courtès <ludo@gnu.org>
;;; Copyright © 2013 Andreas Enge <andreas@enge.fr>
;;;
;;; This file is part of GNU Guix.
;;;


@@ 51,7 52,7 @@
            fold-port-matches
            remove-store-references))



;;;
;;; Directories.
;;;


@@ 426,7 427,7 @@ bytes transferred and the continuation of the transfer as a thunk."
         (stat:mtimensec stat)))

(define patch-shebang
  (let ((shebang-rx (make-regexp "^[[:blank:]]*([[:graph:]]+)(.*)$")))
  (let ((shebang-rx (make-regexp "^[[:blank:]]*([[:graph:]]+)[[:blank:]]*([[:graph:]]*)(.*)$")))
    (lambda* (file
              #:optional
              (path (search-path-as-string->list (getenv "PATH")))


@@ 465,16 466,27 @@ FILE are kept unchanged."
               (let ((line (false-if-exception (read-line p))))
                 (and=> (and line (regexp-exec shebang-rx line))
                        (lambda (m)
                          (let* ((cmd (match:substring m 1))
                                 (bin (search-path path (basename cmd))))
                          (let* ((interp (match:substring m 1))
                                 (arg1 (match:substring m 2))
                                 (rest (match:substring m 3))
                                 (has-env (string-suffix? "/env" interp))
                                 (cmd (if has-env arg1 (basename interp)))
                                 (bin (search-path path cmd)))
                            (if bin
                                (if (string=? bin cmd)
                                (if (string=? bin interp)
                                    #f            ; nothing to do
                                    (begin
                                      (format (current-error-port)
                                              "patch-shebang: ~a: changing `~a' to `~a'~%"
                                              file cmd bin)
                                      (patch p bin (match:substring m 2))))
                                    (if has-env
                                        (begin
                                          (format (current-error-port)
                                                  "patch-shebang: ~a: changing `~a' to `~a'~%"
                                                  file (string-append interp " " arg1) bin)
                                          (patch p bin rest))
                                      (begin 
                                        (format (current-error-port)
                                                "patch-shebang: ~a: changing `~a' to `~a'~%"
                                                file interp bin)
                                        (patch p bin
                                               (string-append " " arg1 rest)))))
                                (begin
                                  (format (current-error-port)
                                          "patch-shebang: ~a: warning: no binary for interpreter `~a' found in $PATH~%"