diff options
author | Ludovic Courtès <ludo@gnu.org> | 2019-01-12 18:19:13 +0100 |
---|---|---|
committer | Ludovic Courtès <ludo@gnu.org> | 2019-01-15 20:24:09 +0100 |
commit | ae927822409b220e0e9a006df5912c617973c736 (patch) | |
tree | 9d73d3d59311df02b409f3b084cbd0fde9f4becb | |
parent | e2a903c807ccacec5925f197ce26f626060e1953 (diff) | |
download | guix-ae927822409b220e0e9a006df5912c617973c736.tar.gz |
inferior: Add 'gexp->derivation-in-inferior'.
* guix/inferior.scm (gexp->derivation-in-inferior): New procedure.
-rw-r--r-- | guix/inferior.scm | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/guix/inferior.scm b/guix/inferior.scm index ba8d00866b..4dfb242e44 100644 --- a/guix/inferior.scm +++ b/guix/inferior.scm @@ -81,6 +81,8 @@ inferior-package->manifest-entry + gexp->derivation-in-inferior + %inferior-cache-directory inferior-for-channels)) @@ -484,6 +486,30 @@ PACKAGE must be live." ;; Compile PACKAGE for SYSTEM, optionally cross-building for TARGET. (inferior-package->derivation package system #:target target)) +(define* (gexp->derivation-in-inferior name exp guix + #:rest rest) + "Return a derivation that evaluates EXP with GUIX, an instance of Guix as +returned for example by 'channel-instances->derivation'. Other arguments are +passed as-is to 'gexp->derivation'." + (define trampoline + ;; This is a crude way to run EXP on GUIX. TODO: use 'raw-derivation' and + ;; make 'guix repl' the "builder"; this will require "opening up" the + ;; mechanisms behind 'gexp->derivation', and adding '-l' to 'guix repl'. + #~(begin + (use-modules (ice-9 popen)) + + (let ((pipe (open-pipe* OPEN_WRITE + #+(file-append guix "/bin/guix") + "repl" "-t" "machine"))) + ;; Unquote EXP right here so that its references to #$output + ;; propagate to the surrounding gexp. + (write '#$exp pipe) ;XXX: load path for EXP? + + (unless (zero? (close-pipe pipe)) + (error "inferior failed" #+guix))))) + + (apply gexp->derivation name trampoline rest)) + ;;; ;;; Manifest entries. |