diff --git a/guix/derivations.scm b/guix/derivations.scm index ec438e833c49bffd2ebf864e9ec2acd090cc18f2..2f015089a3e69f2d1057c718bac55aaa7578106b 100644 --- a/guix/derivations.scm +++ b/guix/derivations.scm @@ -31,6 +31,7 @@ (define-module (guix derivations) #:use-module (guix hash) #:use-module (guix base32) #:use-module (guix records) + #:use-module (guix sets) #:export (<derivation> derivation? derivation-outputs @@ -162,16 +163,18 @@ (define (derivation-input-output-paths input) (define (derivation-prerequisites drv) "Return the list of derivation-inputs required to build DRV, recursively." - (let loop ((drv drv) - (result '())) - (let ((inputs (remove (cut member <> result) ; XXX: quadratic + (let loop ((drv drv) + (result '()) + (input-set (set))) + (let ((inputs (remove (cut set-contains? input-set <>) (derivation-inputs drv)))) - (fold loop - (append inputs result) - (map (lambda (i) - (call-with-input-file (derivation-input-path i) - read-derivation)) - inputs))))) + (fold2 loop + (append inputs result) + (fold set-insert input-set inputs) + (map (lambda (i) + (call-with-input-file (derivation-input-path i) + read-derivation)) + inputs))))) (define (offloadable-derivation? drv) "Return true if DRV can be offloaded, false otherwise."