aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--guix/build-system/gnu.scm82
1 files changed, 50 insertions, 32 deletions
diff --git a/guix/build-system/gnu.scm b/guix/build-system/gnu.scm
index 78e8bf0652..434a6dd5e0 100644
--- a/guix/build-system/gnu.scm
+++ b/guix/build-system/gnu.scm
@@ -41,42 +41,60 @@
;;
;; Code:
-(define* (package-with-explicit-inputs p boot-inputs
+(define* (package-with-explicit-inputs p inputs
#:optional
(loc (current-source-location))
- #:key guile)
- "Rewrite P, which is assumed to use GNU-BUILD-SYSTEM, to take
-BOOT-INPUTS as explicit inputs instead of the implicit default, and
-return it. Use GUILE to run the builder, or the distro's final Guile
-when GUILE is #f."
- (define rewritten-input
- (match-lambda
- ((name (? package? p) sub-drv ...)
- (cons* name
- (package-with-explicit-inputs p boot-inputs #:guile guile)
- sub-drv))
- (x x)))
-
- (define boot-input-names
- (map car boot-inputs))
+ #:key (native-inputs '())
+ guile)
+ "Rewrite P, which is assumed to use GNU-BUILD-SYSTEM, to take INPUTS and
+NATIVE-INPUTS as explicit inputs instead of the implicit default, and return
+it. INPUTS and NATIVE-INPUTS can be either input lists or thunks; in the
+latter case, they will be called in a context where the `%current-system' and
+`%current-target-system' are suitably parametrized. Use GUILE to run the
+builder, or the distro's final Guile when GUILE is #f."
+ (define inputs* inputs)
+ (define native-inputs* native-inputs)
+
+ (define (call inputs)
+ (if (procedure? inputs)
+ (inputs)
+ inputs))
+
+ (define (duplicate-filter inputs)
+ (let ((names (match (call inputs)
+ (((name _ ...) ...)
+ name))))
+ (lambda (inputs)
+ (fold alist-delete inputs names))))
- (define (filtered-inputs inputs)
- (fold alist-delete inputs boot-input-names))
+ (let loop ((p p))
+ (define rewritten-input
+ (memoize
+ (match-lambda
+ ((name (? package? p) sub-drv ...)
+ (cons* name (loop p) sub-drv))
+ (x x))))
- (package (inherit p)
- (location (if (pair? loc) (source-properties->location loc) loc))
- (arguments
- (let ((args (package-arguments p)))
- `(#:guile ,guile
- #:implicit-inputs? #f ,@args)))
- (native-inputs (map rewritten-input
- (filtered-inputs (package-native-inputs p))))
- (propagated-inputs (map rewritten-input
- (filtered-inputs
- (package-propagated-inputs p))))
- (inputs `(,@boot-inputs
- ,@(map rewritten-input
- (filtered-inputs (package-inputs p)))))))
+ (package (inherit p)
+ (location (if (pair? loc) (source-properties->location loc) loc))
+ (arguments
+ (let ((args (package-arguments p)))
+ `(#:guile ,guile
+ #:implicit-inputs? #f
+ ,@args)))
+ (native-inputs
+ (let ((filtered (duplicate-filter native-inputs*)))
+ `(,@(call native-inputs*)
+ ,@(map rewritten-input
+ (filtered (package-native-inputs p))))))
+ (propagated-inputs
+ (map rewritten-input
+ (package-propagated-inputs p)))
+ (inputs
+ (let ((filtered (duplicate-filter inputs*)))
+ `(,@(call inputs*)
+ ,@(map rewritten-input
+ (filtered (package-inputs p)))))))))
(define (package-with-extra-configure-variable p variable value)
"Return a version of P with VARIABLE=VALUE specified as an extra `configure'