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".
This commit is contained in:
Andreas Enge 2013-02-22 23:00:41 +01:00
parent 93a6f5520c
commit 11996d85d3
1 changed files with 22 additions and 10 deletions

View File

@ -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
(if has-env
(begin
(format (current-error-port)
"patch-shebang: ~a: changing `~a' to `~a'~%"
file cmd bin)
(patch p bin (match:substring m 2))))
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~%"