summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLudovic Courtès <[email protected]>2025-01-28 14:53:03 +0100
committerLudovic Courtès <[email protected]>2025-01-28 14:56:14 +0100
commit28e4018e59d30efb3d52aa950ce2261f11b69b33 (patch)
tree882e8f39932fcdc1e6414b3b17e3bea30b6b5e8e
parent3ad2d21671ad56e61c779da253d4396435658198 (diff)
grafts: Allow file-like objects in the ‘replacement’ field of <graft>.
This is a followup to and simplification of 3331d675fbf5287e8cbe12af48fb2de14f1ad8bc. * guix/grafts.scm (graft-derivation/shallow)[mapping]: Wrap origin and replacement in ‘with-parameters’. (cumulative-grafts)[finalize-graft]: Remove, and remove its sole user. * guix/packages.scm (input-graft, input-cross-graft): Add ‘replacement’ straight into the ‘replacement’ field of <graft>. * tests/packages.scm ("package-grafts, indirect grafts") ("package-grafts, indirect grafts, propagated inputs") ("package-grafts, same replacement twice") ("package-grafts, dependency on several outputs") ("replacement also grafted"): Adjust accordingly. Suggested-by: David Elsing <[email protected]> Change-Id: I286fceae53df9d3051137bbca5f944d51d0c92f3
-rw-r--r--guix/grafts.scm23
-rw-r--r--guix/packages.scm21
-rw-r--r--tests/packages.scm26
3 files changed, 21 insertions, 49 deletions
diff --git a/guix/grafts.scm b/guix/grafts.scm
index 7636df9267..98ef1e4058 100644
--- a/guix/grafts.scm
+++ b/guix/grafts.scm
@@ -101,9 +101,11 @@ are not recursively applied to dependencies of DRV."
;; List of store item pairs.
(map (lambda (graft)
(gexp
- ((ungexp (graft-origin graft)
+ ((ungexp (with-parameters ((%graft? #f))
+ (graft-origin graft))
(graft-origin-output graft))
- . (ungexp (graft-replacement graft)
+ . (ungexp (with-parameters ((%graft? #t))
+ (graft-replacement graft))
(graft-replacement-output graft)))))
grafts))
@@ -275,20 +277,6 @@ derivations to the corresponding set of grafts."
#:system system)))))
(reference-origins drv items)))
- ;; If the 'replacement' field of the <graft> record is a procedure,
- ;; this means that it is a value in the store monad and the actual
- ;; derivation needs to be computed here.
- (define (finalize-graft item)
- (let ((replacement (graft-replacement item)))
- (if (procedure? replacement)
- (graft
- (inherit item)
- (replacement
- (run-with-store store replacement
- #:guile-for-build guile
- #:system system)))
- item)))
-
(with-cache (list (derivation-file-name drv) outputs grafts)
(match (non-self-references store drv outputs)
(() ;no dependencies
@@ -305,8 +293,7 @@ derivations to the corresponding set of grafts."
;; Use APPLICABLE, the subset of GRAFTS that is really
;; applicable to DRV, to avoid creating several identical
;; grafted variants of DRV.
- (let* ((new (graft-derivation/shallow* store drv
- (map finalize-graft applicable)
+ (let* ((new (graft-derivation/shallow* store drv applicable
#:outputs outputs
#:guile guile
#:system system))
diff --git a/guix/packages.scm b/guix/packages.scm
index d266805ba8..78726b089a 100644
--- a/guix/packages.scm
+++ b/guix/packages.scm
@@ -1818,15 +1818,13 @@ graft, and #f otherwise."
(if replacement
(mcached eq? (=> %package-graft-cache)
(mlet %store-monad ((orig (package->derivation package system
- #:graft? #f))
- (new -> (package->derivation replacement system
- #:graft? #t)))
- ;; Keep NEW as a monadic value so that its computation
- ;; is delayed until necessary.
+ #:graft? #f)))
+ ;; Keep REPLACEMENT as a package so that its
+ ;; derivation is computed only when necessary.
(return (graft
(origin orig)
(origin-output output)
- (replacement new)
+ (replacement replacement)
(replacement-output output))))
package output system)
(return #f))))
@@ -1842,16 +1840,13 @@ graft, and #f otherwise."
(if replacement
(mlet %store-monad ((orig (package->cross-derivation package
target system
- #:graft? #f))
- (new -> (package->cross-derivation replacement
- target system
- #:graft? #t)))
- ;; Keep NEW as a monadic value so that its computation
- ;; is delayed until necessary.
+ #:graft? #f)))
+ ;; Keep REPLACEMENT as a package so that its derivation is
+ ;; computed only when necessary.
(return (graft
(origin orig)
(origin-output output)
- (replacement new)
+ (replacement replacement)
(replacement-output output))))
(return #f))))
(_
diff --git a/tests/packages.scm b/tests/packages.scm
index a4a0e2c3e8..2863fb5991 100644
--- a/tests/packages.scm
+++ b/tests/packages.scm
@@ -1095,9 +1095,7 @@
((graft)
(and (eq? (graft-origin graft)
(package-derivation %store dep))
- (eq? (run-with-store %store
- (graft-replacement graft))
- (package-derivation %store new)))))))
+ (eq? (graft-replacement graft) new))))))
;; XXX: This test would require building the cross toolchain just to see if it
;; needs grafting, which is obviously too expensive, and thus disabled.
@@ -1134,9 +1132,7 @@
((graft)
(and (eq? (graft-origin graft)
(package-derivation %store dep))
- (eq? (run-with-store %store
- (graft-replacement graft))
- (package-derivation %store new)))))))
+ (eq? (graft-replacement graft) new))))))
(test-assert "package-grafts, same replacement twice"
(let* ((new (dummy-package "dep"
@@ -1161,9 +1157,7 @@
(package-derivation %store
(package (inherit dep)
(replacement #f))))
- (eq? (run-with-store %store
- (graft-replacement graft))
- (package-derivation %store new)))))))
+ (eq? (graft-replacement graft) new))))))
(test-assert "package-grafts, dependency on several outputs"
;; Make sure we get one graft per output; see <https://bugs.gnu.org/41796>.
@@ -1183,9 +1177,9 @@
((graft1 graft2)
(and (eq? (graft-origin graft1) (graft-origin graft2)
(package-derivation %store p0))
- (eq? (run-with-store %store (graft-replacement graft1))
- (run-with-store %store (graft-replacement graft2))
- (package-derivation %store p0*))
+ (eq? (graft-replacement graft1)
+ (graft-replacement graft2)
+ p0*)
(string=? "lib"
(graft-origin-output graft1)
(graft-replacement-output graft1))
@@ -1262,14 +1256,10 @@
((graft1 graft2)
(and (eq? (graft-origin graft1)
(package-derivation %store p1 #:graft? #f))
- (eq? (run-with-store %store
- (graft-replacement graft1))
- (package-derivation %store p1r))
+ (eq? (graft-replacement graft1) p1r)
(eq? (graft-origin graft2)
(package-derivation %store p2 #:graft? #f))
- (eq? (run-with-store %store
- (graft-replacement graft2))
- (package-derivation %store p2r #:graft? #t)))))))
+ (eq? (graft-replacement graft2) p2r))))))
;;; XXX: Nowadays 'graft-derivation' needs to build derivations beforehand to
;;; find out about their run-time dependencies, so this test is no longer