aboutsummaryrefslogtreecommitdiff
path: root/guix/gexp.scm
diff options
context:
space:
mode:
authorLudovic Courtès <ludo@gnu.org>2021-02-28 18:22:11 +0100
committerLudovic Courtès <ludo@gnu.org>2021-03-30 22:48:43 +0200
commita76b6f8120d54516e784da265884245cd6a3cc7d (patch)
tree615af531baa6998a157e055082689a910d0bf7bf /guix/gexp.scm
parent789babb76174758cbe0f159d4f61a65aefa9b4a4 (diff)
downloadguix-a76b6f8120d54516e784da265884245cd6a3cc7d.tar
guix-a76b6f8120d54516e784da265884245cd6a3cc7d.tar.gz
gexp: Optimize 'with-build-variables'.
* guix/gexp.scm (input-tuples->gexp, outputs->gexp): New procedures. (with-build-variables): Use it.
Diffstat (limited to 'guix/gexp.scm')
-rw-r--r--guix/gexp.scm50
1 files changed, 41 insertions, 9 deletions
diff --git a/guix/gexp.scm b/guix/gexp.scm
index 6bdc7ba11d..3817bdd855 100644
--- a/guix/gexp.scm
+++ b/guix/gexp.scm
@@ -1787,6 +1787,43 @@ are searched for in PATH. Return #f when MODULES and EXTENSIONS are empty."
extensions))
%load-compiled-path)))))))))
+(define* (input-tuples->gexp inputs #:key native?)
+ "Given INPUTS, a list of label/gexp-input tuples, return a gexp that expands
+to an input alist."
+ (define references
+ (map (match-lambda
+ ((label input) input))
+ inputs))
+
+ (define labels
+ (match inputs
+ (((labels . _) ...)
+ labels)))
+
+ (define (proc . args)
+ (cons 'quote (list (map cons labels args))))
+
+ ;; This gexp is more efficient than an equivalent hand-written gexp: fewer
+ ;; allocations, no need to scan long list-valued <gexp-input> records in
+ ;; search of file-like objects, etc.
+ (make-gexp references '() '() proc
+ (source-properties inputs)))
+
+(define (outputs->gexp outputs)
+ "Given OUTPUTS, a list of output names, return a gexp that expands to an
+output alist."
+ (define references
+ (map gexp-output outputs))
+
+ (define (proc . args)
+ `(list ,@(map (lambda (name)
+ `(cons ,name ((@ (guile) getenv) ,name)))
+ outputs)))
+
+ ;; This gexp is more efficient than an equivalent hand-written gexp.
+ (make-gexp references '() '() proc
+ (source-properties outputs)))
+
(define (with-build-variables inputs outputs body)
"Return a gexp that surrounds BODY with a definition of the legacy
'%build-inputs', '%outputs', and '%output' variables based on INPUTS, a list
@@ -1798,17 +1835,12 @@ of name/gexp-input tuples, and OUTPUTS, a list of strings."
;; expected.
(gexp (begin
(define %build-inputs
- (map (lambda (tuple)
- (apply cons tuple))
- '(ungexp inputs)))
+ (ungexp (input-tuples->gexp inputs)))
(define %outputs
- (list (ungexp-splicing
- (map (lambda (name)
- (gexp (cons (ungexp name)
- (ungexp output name))))
- outputs))))
- (define %output
+ (ungexp (outputs->gexp outputs)))
+ (define %output
(assoc-ref %outputs "out"))
+
(ungexp body))))
(define* (gexp->script name exp