summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLudovic Courtès <ludo@gnu.org>2012-10-08 21:57:14 +0200
committerLudovic Courtès <ludo@gnu.org>2012-10-08 21:57:14 +0200
commitead1f1086d1d64657ab710f4340dc5e4f79ea045 (patch)
tree71d9c4375764af2867e2800b390870be836540ff
parentdf7bbd381352d3241458488d028ba757e206674d (diff)
packages: Micro-optimize `package-derivation'.
* guix/packages.scm (package-derivation): Move `cache' call before the traversal of PACKAGE's inputs.
-rw-r--r--guix/packages.scm94
1 files changed, 48 insertions, 46 deletions
diff --git a/guix/packages.scm b/guix/packages.scm
index ea5302e60b..8fb77e5fd7 100644
--- a/guix/packages.scm
+++ b/guix/packages.scm
@@ -221,52 +221,54 @@ recursively."
#:optional (system (%current-system)))
"Return the derivation of PACKAGE for SYSTEM."
(or (cached-derivation package system)
- (match package
- (($ <package> name version source (= build-system-builder builder)
- args inputs propagated-inputs native-inputs self-native-input?
- outputs)
- ;; TODO: For `search-paths', add a builder prologue that calls
- ;; `set-path-environment-variable'.
- (let ((inputs (map (match-lambda
- (((? string? name) (? package? package))
- (list name (package-derivation store package)))
- (((? string? name) (? package? package)
- (? string? sub-drv))
- (list name (package-derivation store package)
- sub-drv))
- (((? string? name)
- (and (? string?) (? derivation-path?) drv))
- (list name drv))
- (((? string? name)
- (and (? string?) (? file-exists? file)))
- ;; Add FILE to the store. When FILE is in the
- ;; sub-directory of a store path, it needs to be
- ;; added anyway, so it can be used as a source.
- (list name
- (add-to-store store (basename file)
- #t #f "sha256" file)))
- (((? string? name) (? origin? source))
- (list name
- (package-source-derivation store source)))
- (x
- (raise (condition (&package-input-error
- (package package)
- (input x))))))
- (package-transitive-inputs package))))
-
- ;; Compute the derivation and cache the result. Caching is
- ;; important because some derivations, such as the implicit inputs
- ;; of the GNU build system, will be queried many, many times in a
- ;; row.
- (cache package system
- (apply builder
- store (package-full-name package)
- (and source (package-source-derivation store source))
- inputs
- #:outputs outputs #:system system
- (if (procedure? args)
- (args system)
- args))))))))
+
+ ;; Compute the derivation and cache the result. Caching is
+ ;; important because some derivations, such as the implicit inputs
+ ;; of the GNU build system, will be queried many, many times in a
+ ;; row.
+ (cache
+ package system
+ (match package
+ (($ <package> name version source (= build-system-builder builder)
+ args inputs propagated-inputs native-inputs self-native-input?
+ outputs)
+ ;; TODO: For `search-paths', add a builder prologue that calls
+ ;; `set-path-environment-variable'.
+ (let ((inputs (map (match-lambda
+ (((? string? name) (? package? package))
+ (list name (package-derivation store package)))
+ (((? string? name) (? package? package)
+ (? string? sub-drv))
+ (list name (package-derivation store package)
+ sub-drv))
+ (((? string? name)
+ (and (? string?) (? derivation-path?) drv))
+ (list name drv))
+ (((? string? name)
+ (and (? string?) (? file-exists? file)))
+ ;; Add FILE to the store. When FILE is in the
+ ;; sub-directory of a store path, it needs to be
+ ;; added anyway, so it can be used as a source.
+ (list name
+ (add-to-store store (basename file)
+ #t #f "sha256" file)))
+ (((? string? name) (? origin? source))
+ (list name
+ (package-source-derivation store source)))
+ (x
+ (raise (condition (&package-input-error
+ (package package)
+ (input x))))))
+ (package-transitive-inputs package))))
+
+ (apply builder
+ store (package-full-name package)
+ (and source (package-source-derivation store source))
+ inputs
+ #:outputs outputs #:system system
+ (if (procedure? args)
+ (args system)
+ args))))))))
(define* (package-cross-derivation store package)
;; TODO