~ruther/guix-local

8102cf0b37e100f760d25b500cf91ed38928615c — Ludovic Courtès 8 years ago e80514b
gnu: commencement: Memoize 'linux-libre-headers-boot0'.

Fixes <https://bugs.gnu.org/30155>.

The effect can be seen in the package graph produced by:

  guix graph -e '(@@ (gnu packages commencement) static-bash-for-glibc)'

This reduces the number of "duplicate" nodes in this graph, i.e.,
distinct package objects that correspond to the same derivation (objects
that are not 'eq?' but semantically equal.)

* gnu/packages/commencement.scm (linux-libre-headers-boot0): Make an
'mlambda' instead of a 'lambda'.
(hurd-core-headers-boot0): Ditto.
2 files changed, 31 insertions(+), 23 deletions(-)

M gnu/packages/commencement.scm
M guix/packages.scm
M gnu/packages/commencement.scm => gnu/packages/commencement.scm +28 -23
@@ 47,6 47,7 @@
  #:use-module (guix download)
  #:use-module (guix build-system gnu)
  #:use-module (guix build-system trivial)
  #:use-module (guix memoization)
  #:use-module (guix utils)
  #:use-module (srfi srfi-1)
  #:use-module (srfi srfi-26)


@@ 371,18 372,21 @@
                                   (current-source-location)
                                   #:guile %bootstrap-guile))))

(define (linux-libre-headers-boot0)
  "Return Linux-Libre header files for the bootstrap environment."
  ;; Note: this is wrapped in a thunk to nicely handle circular dependencies
  ;; between (gnu packages linux) and this module.
  (package-with-bootstrap-guile
   (package (inherit linux-libre-headers)
     (arguments `(#:guile ,%bootstrap-guile
                  #:implicit-inputs? #f
                  ,@(package-arguments linux-libre-headers)))
     (native-inputs
      `(("perl" ,perl-boot0)
        ,@%boot0-inputs)))))
(define linux-libre-headers-boot0
  (mlambda ()
    "Return Linux-Libre header files for the bootstrap environment."
    ;; Note: this is wrapped in a thunk to nicely handle circular dependencies
    ;; between (gnu packages linux) and this module.  Additionally, memoize
    ;; the result to play well with further memoization and code that relies
    ;; on pointer identity; see <https://bugs.gnu.org/30155>.
    (package-with-bootstrap-guile
     (package (inherit linux-libre-headers)
              (arguments `(#:guile ,%bootstrap-guile
                           #:implicit-inputs? #f
                           ,@(package-arguments linux-libre-headers)))
              (native-inputs
               `(("perl" ,perl-boot0)
                 ,@%boot0-inputs))))))

(define gnumach-headers-boot0
  (package-with-bootstrap-guile


@@ 423,18 427,19 @@
                                   (current-source-location)
                                   #:guile %bootstrap-guile))))

(define (hurd-core-headers-boot0)
  "Return the Hurd and Mach headers as well as initial Hurd libraries for
(define hurd-core-headers-boot0
  (mlambda ()
    "Return the Hurd and Mach headers as well as initial Hurd libraries for
the bootstrap environment."
  (package-with-bootstrap-guile
   (package (inherit hurd-core-headers)
            (arguments `(#:guile ,%bootstrap-guile
                                 ,@(package-arguments hurd-core-headers)))
            (inputs
             `(("gnumach-headers" ,gnumach-headers-boot0)
               ("hurd-headers" ,hurd-headers-boot0)
               ("hurd-minimal" ,hurd-minimal-boot0)
               ,@%boot0-inputs)))))
    (package-with-bootstrap-guile
     (package (inherit hurd-core-headers)
              (arguments `(#:guile ,%bootstrap-guile
                           ,@(package-arguments hurd-core-headers)))
              (inputs
               `(("gnumach-headers" ,gnumach-headers-boot0)
                 ("hurd-headers" ,hurd-headers-boot0)
                 ("hurd-minimal" ,hurd-minimal-boot0)
                 ,@%boot0-inputs))))))

(define* (kernel-headers-boot0 #:optional (system (%current-system)))
  (match system

M guix/packages.scm => guix/packages.scm +3 -0
@@ 620,6 620,9 @@ itself.
This is implemented as a breadth-first traversal such that INPUTS is
preserved, and only duplicate propagated inputs are removed."
  (define (seen? seen item outputs)
    ;; FIXME: We're using pointer identity here, which is extremely sensitive
    ;; to memoization in package-producing procedures; see
    ;; <https://bugs.gnu.org/30155>.
    (match (vhash-assq item seen)
      ((_ . o) (equal? o outputs))
      (_       #f)))