packages: Honor system and target system for graft replacements.

Fixes <https://issues.guix.gnu.org/76110>.

Fixes a regression introduced in
28e4018e59 where the system and target
system would be ignored.

* guix/packages.scm (input-graft, input-cross-graft): Wrap graft replacement
in ‘with-parameters’.
* 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 by comparing the replacement
after lowering to a derivation.
("package-grafts, indirect grafts, #:system argument"): New test.

Change-Id: I1663f0cc50842bb9abb53ba4aa9935052022d1f4
Signed-off-by: Ludovic Courtès <ludo@gnu.org>
Reported-by: Denis 'GNUtoo' Carikli <GNUtoo@cyberdimension.org>
This commit is contained in:
David Elsing 2025-03-02 22:43:30 +00:00 committed by Ludovic Courtès
parent 5ead9fa56c
commit 70c7b4d7f0
No known key found for this signature in database
GPG key ID: 090B11993D9AEBB5
2 changed files with 51 additions and 10 deletions

View file

@ -1824,7 +1824,9 @@ graft, and #f otherwise."
(return (graft (return (graft
(origin orig) (origin orig)
(origin-output output) (origin-output output)
(replacement replacement) (replacement
(with-parameters ((%current-system system))
replacement))
(replacement-output output)))) (replacement-output output))))
package output system) package output system)
(return #f)))) (return #f))))
@ -1846,7 +1848,10 @@ graft, and #f otherwise."
(return (graft (return (graft
(origin orig) (origin orig)
(origin-output output) (origin-output output)
(replacement replacement) (replacement
(with-parameters ((%current-system system)
(%current-target-system target))
replacement))
(replacement-output output)))) (replacement-output output))))
(return #f)))) (return #f))))
(_ (_

View file

@ -4,6 +4,7 @@
;;; Copyright © 2021 Maxim Cournoyer <maxim.cournoyer@gmail.com> ;;; Copyright © 2021 Maxim Cournoyer <maxim.cournoyer@gmail.com>
;;; Copyright © 2021 Maxime Devos <maximedevos@telenet.be> ;;; Copyright © 2021 Maxime Devos <maximedevos@telenet.be>
;;; Copyright © 2023 Simon Tournier <zimon.toutoune@gmail.com> ;;; Copyright © 2023 Simon Tournier <zimon.toutoune@gmail.com>
;;; Copyright © 2025 David Elsing <david.elsing@posteo.net>
;;; ;;;
;;; This file is part of GNU Guix. ;;; This file is part of GNU Guix.
;;; ;;;
@ -1095,7 +1096,29 @@
((graft) ((graft)
(and (eq? (graft-origin graft) (and (eq? (graft-origin graft)
(package-derivation %store dep)) (package-derivation %store dep))
(eq? (graft-replacement graft) new)))))) (eq? (run-with-store %store
(lower-object (graft-replacement graft)))
(package-derivation %store new)))))))
(test-assert "package-grafts, indirect grafts, #:system argument"
(let* ((system (if (string=? (%current-system) "riscv64-linux")
"x86_64-linux"
"riscv64-linux"))
(new (dummy-package "dep"
(arguments `(#:implicit-inputs? #f
#:system ,system))))
(dep (package (inherit new) (version "0.0")))
(dep* (package (inherit dep) (replacement new)))
(dummy (dummy-package "dummy"
(arguments '(#:implicit-inputs? #f))
(inputs (list dep*)))))
(match (package-grafts %store dummy)
((graft)
(and (eq? (graft-origin graft)
(package-derivation %store dep system))
(eq? (run-with-store %store
(lower-object (graft-replacement graft)))
(package-derivation %store new)))))))
;; XXX: This test would require building the cross toolchain just to see if it ;; XXX: This test would require building the cross toolchain just to see if it
;; needs grafting, which is obviously too expensive, and thus disabled. ;; needs grafting, which is obviously too expensive, and thus disabled.
@ -1132,7 +1155,9 @@
((graft) ((graft)
(and (eq? (graft-origin graft) (and (eq? (graft-origin graft)
(package-derivation %store dep)) (package-derivation %store dep))
(eq? (graft-replacement graft) new)))))) (eq? (run-with-store %store
(lower-object (graft-replacement graft)))
(package-derivation %store new)))))))
(test-assert "package-grafts, same replacement twice" (test-assert "package-grafts, same replacement twice"
(let* ((new (dummy-package "dep" (let* ((new (dummy-package "dep"
@ -1157,7 +1182,9 @@
(package-derivation %store (package-derivation %store
(package (inherit dep) (package (inherit dep)
(replacement #f)))) (replacement #f))))
(eq? (graft-replacement graft) new)))))) (eq? (run-with-store %store
(lower-object (graft-replacement graft)))
(package-derivation %store new)))))))
(test-assert "package-grafts, dependency on several outputs" (test-assert "package-grafts, dependency on several outputs"
;; Make sure we get one graft per output; see <https://bugs.gnu.org/41796>. ;; Make sure we get one graft per output; see <https://bugs.gnu.org/41796>.
@ -1177,9 +1204,11 @@
((graft1 graft2) ((graft1 graft2)
(and (eq? (graft-origin graft1) (graft-origin graft2) (and (eq? (graft-origin graft1) (graft-origin graft2)
(package-derivation %store p0)) (package-derivation %store p0))
(eq? (graft-replacement graft1) (eq? (run-with-store %store
(graft-replacement graft2) (lower-object (graft-replacement graft1)))
p0*) (run-with-store %store
(lower-object (graft-replacement graft2)))
(package-derivation %store p0*))
(string=? "lib" (string=? "lib"
(graft-origin-output graft1) (graft-origin-output graft1)
(graft-replacement-output graft1)) (graft-replacement-output graft1))
@ -1256,10 +1285,17 @@
((graft1 graft2) ((graft1 graft2)
(and (eq? (graft-origin graft1) (and (eq? (graft-origin graft1)
(package-derivation %store p1 #:graft? #f)) (package-derivation %store p1 #:graft? #f))
(eq? (graft-replacement graft1) p1r) (eq? (run-with-store %store
(lower-object (graft-replacement graft1)))
(package-derivation %store p1r #:graft? #t))
(eq? (graft-origin graft2) (eq? (graft-origin graft2)
(package-derivation %store p2 #:graft? #f)) (package-derivation %store p2 #:graft? #f))
(eq? (graft-replacement graft2) p2r)))))) ;; XXX: Remove parameterize when
;; <https://issues.guix.gnu.org/75879> is fixed.
(eq? (parameterize ((%graft? #t))
(run-with-store %store
(lower-object (graft-replacement graft2))))
(package-derivation %store p2r #:graft? #t)))))))
;;; XXX: Nowadays 'graft-derivation' needs to build derivations beforehand to ;;; XXX: Nowadays 'graft-derivation' needs to build derivations beforehand to
;;; find out about their run-time dependencies, so this test is no longer ;;; find out about their run-time dependencies, so this test is no longer