ruby-build-system: Add a new wrap phase.

Wrap files in bin/ and sbin/ with the location of the gem itself and the
location of any other gems in use (GEM_PATH). This ensures that the bin files
will run with the right environment when executed.

It does however mean that native-inputs will also get wrapped up in any
binaries, which is not good, as it increases the size of the closure, and
risks this code being used at runtime.

* guix/build/ruby-build-system.scm (wrap): New procedure.
  (%standard-phases): Add the wrap phase.
This commit is contained in:
Christopher Baines 2017-10-10 07:41:19 +01:00
parent d9df4bf055
commit 2c2ec3d04a
No known key found for this signature in database
GPG key ID: 5E28A33B0B84F577

View file

@ -21,6 +21,7 @@
(define-module (guix build ruby-build-system)
#:use-module ((guix build gnu-build-system) #:prefix gnu:)
#:use-module (guix build utils)
#:use-module (ice-9 ftw)
#:use-module (ice-9 match)
#:use-module (ice-9 popen)
#:use-module (ice-9 regex)
@ -276,6 +277,31 @@ (define (export-variable lst)
(chmod prog-tmp #o755)
(rename-file prog-tmp prog))))
(define* (wrap #:key inputs outputs #:allow-other-keys)
(define (list-of-files dir)
(map (cut string-append dir "/" <>)
(or (scandir dir (lambda (f)
(let ((s (stat (string-append dir "/" f))))
(eq? 'regular (stat:type s)))))
'())))
(define bindirs
(append-map (match-lambda
((_ . dir)
(list (string-append dir "/bin")
(string-append dir "/sbin"))))
outputs))
(let* ((out (assoc-ref outputs "out"))
(var `("GEM_PATH" prefix
(,(string-append out "/lib/ruby/vendor_ruby")
,(getenv "GEM_PATH")))))
(for-each (lambda (dir)
(let ((files (list-of-files dir)))
(for-each (cut wrap-ruby-program <> var)
files)))
bindirs)))
(define (log-file-deletion file)
(display (string-append "deleting '" file "' for reproducibility\n")))
@ -287,7 +313,8 @@ (define %standard-phases
(add-after 'extract-gemspec 'replace-git-ls-files replace-git-ls-files)
(replace 'build build)
(replace 'check check)
(replace 'install install)))
(replace 'install install)
(add-after 'install 'wrap wrap)))
(define* (ruby-build #:key inputs (phases %standard-phases)
#:allow-other-keys #:rest args)