;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2018, 2019, 2020 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2018, 2019, 2020, 2021 Ludovic Courtès <ludo@gnu.org>
;;;
;;; This file is part of GNU Guix.
;;;
#:use-module (guix store)
#:use-module (guix derivations)
#:use-module (guix base32)
+ #:use-module ((guix memoization) #:select (mlambdaq))
#:use-module (gcrypt hash)
#:autoload (guix cache) (maybe-remove-expired-cache-entries
file-expiration-time)
record."
loc)))
package-location))))
-(define (inferior-package-input-field package field)
+(define (inferior-package-input-field field)
"Return the input field FIELD (e.g., 'native-inputs') of PACKAGE, an
inferior package."
+ (mlambdaq (package)
(define field*
`(compose (lambda (inputs)
(map (match-lambda
inferior package."
`(,label ,(inferior-package inferior name version id)
,@rest))
(x x))
- inputs))
+ inputs)))
(define inferior-package-inputs
- (cut inferior-package-input-field <> 'package-inputs))
+ (inferior-package-input-field 'package-inputs))
(define inferior-package-native-inputs
- (cut inferior-package-input-field <> 'package-native-inputs))
+ (inferior-package-input-field 'package-native-inputs))
(define inferior-package-propagated-inputs
- (cut inferior-package-input-field <> 'package-propagated-inputs))
+ (inferior-package-input-field 'package-propagated-inputs))
(define inferior-package-transitive-propagated-inputs
- (cut inferior-package-input-field <> 'package-transitive-propagated-inputs))
+ (inferior-package-input-field 'package-transitive-propagated-inputs))
-(define (%inferior-package-search-paths package field)
+(define (%inferior-package-search-paths field)
"Return the list of search path specifications of PACKAGE, an inferior
package."
+ (mlambdaq (package)
(define paths
(inferior-package-field package
`(compose (lambda (paths)
package."
paths))
,field)))
- (map sexp->search-path-specification paths))
+ (map sexp->search-path-specification paths)))
(define inferior-package-native-search-paths
- (cut %inferior-package-search-paths <> 'package-native-search-paths))
+ (%inferior-package-search-paths 'package-native-search-paths))
(define inferior-package-search-paths
- (cut %inferior-package-search-paths <> 'package-search-paths))
+ (%inferior-package-search-paths 'package-search-paths))
(define inferior-package-transitive-native-search-paths
- (cut %inferior-package-search-paths <> 'package-transitive-native-search-paths))
+ (%inferior-package-search-paths 'package-transitive-native-search-paths))
(define (inferior-package-provenance package)
"Return a \"provenance sexp\" for PACKAGE, an inferior package. The result
failing when GUIX is too old and lacks the 'guix repl' command."
;;; Manifest entries.
;;;
-(define* (inferior-package->manifest-entry package
- #:optional (output "out")
+(define inferior-package->manifest-entry
+ (let ((results vlist-null))
+ (lambda* (package #:optional (output "out")
#:key (parent (delay #f))
(properties '()))
"Return a manifest entry for the OUTPUT of package PACKAGE."
+ (define key package)
+ (or (and=> (vhash-assoc key results)
+ (lambda (result)
+ (pk 'mem package)
+ (cdr result)))
+ (begin
+ (pk 'compute package)
;; For each dependency, keep a promise pointing to its "parent" entry.
(letrec* ((deps (map (match-lambda
((label package)
failing when GUIX is too old and lacks the 'guix repl' command."
(inferior-package-transitive-native-search-paths package))
(parent parent)
(properties properties))))
- entry))
+ (set! results (vhash-cons key entry results))
+ entry))))))
;;;