gnu: commencement: Further optimize the package object graph.
For a package like: (define-public xxx (package (inherit (@ (gnu packages base) coreutils)) (name "xxx") (inputs (@ (gnu packages commencement) %final-inputs)) (native-inputs '()) (propagated-inputs '()) (arguments '(#:implicit-inputs? #f)))) this reduces the package object graph from 176 nodes (1852 edges) to 113 nodes (1114 edges). The number of 'add-data-to-store' calls in "guix build coreutils -nd" drops from 2045 to 1301, and the number of memoization tables drops from 102 to 40. "guix build libreoffice -nd" goes from 2.40s to 2.27s. * gnu/packages/commencement.scm (with-boot4): New variable. (guile-final, glibc-utf8-locales-final): Use it. (with-boot4, with-boot5): New variable. (gnu-make-final): Rewrite to avoid 'package-with-explicit-inputs'. (coreutils-final): Use 'with-boot5' instead of 'package-with-explicit-inputs'. (grep-final): Likewise. (with-boot6): New variable. (sed-final, %final-inputs): Use it.master
parent
f618134e4c
commit
8f417ed280
|
@ -2365,14 +2365,14 @@ exec ~a/bin/~a-~a -B~a/lib -Wl,-dynamic-linker -Wl,~a/~a \"$@\"~%"
|
|||
`(("bash" ,bash-final)
|
||||
,@(alist-delete "bash" (%boot3-inputs))))
|
||||
|
||||
(define with-boot4
|
||||
(package-with-explicit-inputs %boot4-inputs %bootstrap-guile))
|
||||
|
||||
(define-public guile-final
|
||||
;; This package must be public because other modules refer to it. However,
|
||||
;; mark it as hidden so that 'fold-packages' ignores it.
|
||||
(package-with-bootstrap-guile
|
||||
(package-with-explicit-inputs (hidden-package guile-2.2/fixed)
|
||||
%boot4-inputs
|
||||
(current-source-location)
|
||||
#:guile %bootstrap-guile)))
|
||||
(with-boot4 (hidden-package
|
||||
(package-with-bootstrap-guile guile-2.2/fixed))))
|
||||
|
||||
(define glibc-utf8-locales-final
|
||||
;; Now that we have GUILE-FINAL, build the UTF-8 locales. They are needed
|
||||
|
@ -2384,10 +2384,7 @@ exec ~a/bin/~a-~a -B~a/lib -Wl,-dynamic-linker -Wl,~a/~a \"$@\"~%"
|
|||
(inherit glibc-utf8-locales)
|
||||
(native-inputs
|
||||
`(("glibc" ,glibc-final)
|
||||
("gzip"
|
||||
,(package-with-explicit-inputs gzip %boot4-inputs
|
||||
(current-source-location)
|
||||
#:guile %bootstrap-guile))))))
|
||||
("gzip" ,(with-boot4 gzip))))))
|
||||
|
||||
(define-public ld-wrapper
|
||||
;; The final 'ld' wrapper, which uses the final Guile and Binutils.
|
||||
|
@ -2403,35 +2400,45 @@ exec ~a/bin/~a-~a -B~a/lib -Wl,-dynamic-linker -Wl,~a/~a \"$@\"~%"
|
|||
`(("locales" ,glibc-utf8-locales-final)
|
||||
,@(%boot4-inputs)))
|
||||
|
||||
(define with-boot5
|
||||
(package-with-explicit-inputs %boot5-inputs))
|
||||
|
||||
(define gnu-make-final
|
||||
;; The final GNU Make, which uses the final Guile.
|
||||
(package-with-explicit-inputs (package-with-bootstrap-guile gnu-make)
|
||||
(lambda _
|
||||
`(("guile" ,guile-final)
|
||||
,@(%boot5-inputs)))
|
||||
(current-source-location)))
|
||||
;; FIXME: This is a mistake: we shouldn't be propagating GUILE-FINAL to
|
||||
;; PKG-CONFIG.
|
||||
;; TODO: Fix that on the next rebuild cycle.
|
||||
(let ((pkg-config (package
|
||||
(inherit pkg-config)
|
||||
(inputs `(("guile" ,guile-final)
|
||||
,@(%boot5-inputs)))
|
||||
(arguments
|
||||
`(#:implicit-inputs? #f
|
||||
,@(package-arguments pkg-config))))))
|
||||
(package
|
||||
(inherit (package-with-bootstrap-guile gnu-make))
|
||||
(inputs `(("guile" ,guile-final)
|
||||
,@(%boot5-inputs)))
|
||||
(native-inputs `(("pkg-config" ,pkg-config)))
|
||||
(arguments
|
||||
`(#:implicit-inputs? #f
|
||||
,@(package-arguments gnu-make))))))
|
||||
|
||||
|
||||
(define coreutils-final
|
||||
;; The final Coreutils. Treat them specially because some packages, such as
|
||||
;; Findutils, keep a reference to the Coreutils they were built with.
|
||||
(package-with-explicit-inputs (package-with-bootstrap-guile coreutils)
|
||||
%boot5-inputs
|
||||
(current-source-location)
|
||||
|
||||
;; Use the final Guile, linked against the
|
||||
;; final libc with working iconv, so that
|
||||
;; 'substitute*' works well when touching
|
||||
;; test files in Gettext.
|
||||
#:guile guile-final))
|
||||
(with-boot5 (package-with-bootstrap-guile coreutils)
|
||||
;; Use the final Guile, linked against the
|
||||
;; final libc with working iconv, so that
|
||||
;; 'substitute*' works well when touching
|
||||
;; test files in Gettext.
|
||||
))
|
||||
|
||||
(define grep-final
|
||||
;; The final grep. Gzip holds a reference to it (via zgrep), so it must be
|
||||
;; built before gzip.
|
||||
(let ((grep (package-with-explicit-inputs
|
||||
(package-with-bootstrap-guile grep)
|
||||
%boot5-inputs
|
||||
(current-source-location)
|
||||
#:guile guile-final)))
|
||||
(let ((grep (with-boot5 (package-with-bootstrap-guile grep))))
|
||||
(package/inherit grep
|
||||
(inputs (alist-delete "pcre" (package-inputs grep)))
|
||||
(native-inputs `(("perl" ,perl-boot0))))))
|
||||
|
@ -2442,12 +2449,12 @@ exec ~a/bin/~a-~a -B~a/lib -Wl,-dynamic-linker -Wl,~a/~a \"$@\"~%"
|
|||
("grep" ,grep-final)
|
||||
,@(%boot5-inputs)))
|
||||
|
||||
(define with-boot6
|
||||
(package-with-explicit-inputs %boot6-inputs))
|
||||
|
||||
(define sed-final
|
||||
;; The final sed.
|
||||
(let ((sed (package-with-explicit-inputs (package-with-bootstrap-guile sed)
|
||||
%boot6-inputs
|
||||
(current-source-location)
|
||||
#:guile guile-final)))
|
||||
(let ((sed (with-boot6 (package-with-bootstrap-guile sed))))
|
||||
(package/inherit sed (native-inputs `(("perl" ,perl-boot0))))))
|
||||
|
||||
(define-public %final-inputs
|
||||
|
@ -2455,8 +2462,7 @@ exec ~a/bin/~a-~a -B~a/lib -Wl,-dynamic-linker -Wl,~a/~a \"$@\"~%"
|
|||
;; still use 'package-with-bootstrap-guile' so that the bootstrap tools are
|
||||
;; used for origins that have patches, thereby avoiding circular
|
||||
;; dependencies.
|
||||
(let ((finalize (compose (cut package-with-explicit-inputs <> %boot6-inputs
|
||||
(current-source-location))
|
||||
(let ((finalize (compose with-boot6
|
||||
package-with-bootstrap-guile)))
|
||||
`(,@(map (match-lambda
|
||||
((name package)
|
||||
|
|
Reference in New Issue