~ruther/guix-local

ead1f1086d1d64657ab710f4340dc5e4f79ea045 — Ludovic Courtès 13 years ago df7bbd3
packages: Micro-optimize `package-derivation'.

* guix/packages.scm (package-derivation): Move `cache' call before the
  traversal of PACKAGE's inputs.
1 files changed, 48 insertions(+), 46 deletions(-)

M guix/packages.scm
M guix/packages.scm => guix/packages.scm +48 -46
@@ 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