diff options
| author | Ludovic Courtès <ludo@gnu.org> | 2016-10-14 10:36:37 +0200 |
|---|---|---|
| committer | Ludovic Courtès <ludo@gnu.org> | 2016-10-14 23:05:41 +0200 |
| commit | d0025d01445ff271ececea20cfa6a2346593d1d6 (patch) | |
| tree | 1696964b83bf5c1d73d50a99d2493c76e642e29b | |
| parent | b280e67ca6f62c176c72439df4533a9737b9130a (diff) | |
packages: 'package-grafts' applies grafts on replacement.
Partly fixes <http://bugs.gnu.org/24418>.
* guix/packages.scm (input-graft): Compute 'new' with #:graft? #t.
(input-cross-graft): Likewise.
* tests/packages.scm ("package-grafts, indirect grafts, cross"): Comment
out.
("replacement also grafted"): New test.
| -rw-r--r-- | guix/packages.scm | 6 | ||||
| -rw-r--r-- | tests/packages.scm | 106 |
2 files changed, 94 insertions, 18 deletions
diff --git a/guix/packages.scm b/guix/packages.scm index 2264c5acefc..a3fab4dc13f 100644 --- a/guix/packages.scm +++ b/guix/packages.scm | |||
| @@ -916,7 +916,8 @@ and return it." | |||
| 916 | (cached (=> %graft-cache) package system | 916 | (cached (=> %graft-cache) package system |
| 917 | (let ((orig (package-derivation store package system | 917 | (let ((orig (package-derivation store package system |
| 918 | #:graft? #f)) | 918 | #:graft? #f)) |
| 919 | (new (package-derivation store replacement system))) | 919 | (new (package-derivation store replacement system |
| 920 | #:graft? #t))) | ||
| 920 | (graft | 921 | (graft |
| 921 | (origin orig) | 922 | (origin orig) |
| 922 | (replacement new))))))) | 923 | (replacement new))))))) |
| @@ -932,7 +933,8 @@ and return it." | |||
| 932 | (let ((orig (package-cross-derivation store package target system | 933 | (let ((orig (package-cross-derivation store package target system |
| 933 | #:graft? #f)) | 934 | #:graft? #f)) |
| 934 | (new (package-cross-derivation store replacement | 935 | (new (package-cross-derivation store replacement |
| 935 | target system))) | 936 | target system |
| 937 | #:graft? #t))) | ||
| 936 | (graft | 938 | (graft |
| 937 | (origin orig) | 939 | (origin orig) |
| 938 | (replacement new)))))) | 940 | (replacement new)))))) |
diff --git a/tests/packages.scm b/tests/packages.scm index b8e1f111cd0..5f5fb5de879 100644 --- a/tests/packages.scm +++ b/tests/packages.scm | |||
| @@ -662,22 +662,25 @@ | |||
| 662 | (origin (package-derivation %store dep)) | 662 | (origin (package-derivation %store dep)) |
| 663 | (replacement (package-derivation %store new))))))) | 663 | (replacement (package-derivation %store new))))))) |
| 664 | 664 | ||
| 665 | (test-assert "package-grafts, indirect grafts, cross" | 665 | ;; XXX: This test would require building the cross toolchain just to see if it |
| 666 | (let* ((new (dummy-package "dep" | 666 | ;; needs grafting, which is obviously too expensive, and thus disabled. |
| 667 | (arguments '(#:implicit-inputs? #f)))) | 667 | ;; |
| 668 | (dep (package (inherit new) (version "0.0"))) | 668 | ;; (test-assert "package-grafts, indirect grafts, cross" |
| 669 | (dep* (package (inherit dep) (replacement new))) | 669 | ;; (let* ((new (dummy-package "dep" |
| 670 | (dummy (dummy-package "dummy" | 670 | ;; (arguments '(#:implicit-inputs? #f)))) |
| 671 | (arguments '(#:implicit-inputs? #f)) | 671 | ;; (dep (package (inherit new) (version "0.0"))) |
| 672 | (inputs `(("dep" ,dep*))))) | 672 | ;; (dep* (package (inherit dep) (replacement new))) |
| 673 | (target "mips64el-linux-gnu")) | 673 | ;; (dummy (dummy-package "dummy" |
| 674 | ;; XXX: There might be additional grafts, for instance if the distro | 674 | ;; (arguments '(#:implicit-inputs? #f)) |
| 675 | ;; defines replacements for core packages like Perl. | 675 | ;; (inputs `(("dep" ,dep*))))) |
| 676 | (member (graft | 676 | ;; (target "mips64el-linux-gnu")) |
| 677 | (origin (package-cross-derivation %store dep target)) | 677 | ;; ;; XXX: There might be additional grafts, for instance if the distro |
| 678 | (replacement | 678 | ;; ;; defines replacements for core packages like Perl. |
| 679 | (package-cross-derivation %store new target))) | 679 | ;; (member (graft |
| 680 | (package-grafts %store dummy #:target target)))) | 680 | ;; (origin (package-cross-derivation %store dep target)) |
| 681 | ;; (replacement | ||
| 682 | ;; (package-cross-derivation %store new target))) | ||
| 683 | ;; (package-grafts %store dummy #:target target)))) | ||
| 681 | 684 | ||
| 682 | (test-assert "package-grafts, indirect grafts, propagated inputs" | 685 | (test-assert "package-grafts, indirect grafts, propagated inputs" |
| 683 | (let* ((new (dummy-package "dep" | 686 | (let* ((new (dummy-package "dep" |
| @@ -719,6 +722,77 @@ | |||
| 719 | (replacement #f)))) | 722 | (replacement #f)))) |
| 720 | (replacement (package-derivation %store new))))))) | 723 | (replacement (package-derivation %store new))))))) |
| 721 | 724 | ||
| 725 | (test-assert "replacement also grafted" | ||
| 726 | ;; We build a DAG as below, where dotted arrows represent replacements and | ||
| 727 | ;; solid arrows represent dependencies: | ||
| 728 | ;; | ||
| 729 | ;; P1 ·············> P1R | ||
| 730 | ;; |\__________________. | ||
| 731 | ;; v v | ||
| 732 | ;; P2 ·············> P2R | ||
| 733 | ;; | | ||
| 734 | ;; v | ||
| 735 | ;; P3 | ||
| 736 | ;; | ||
| 737 | ;; We want to make sure that: | ||
| 738 | ;; grafts(P3) = (P1,P1R) + (P2, grafted(P2R, (P1,P1R))) | ||
| 739 | ;; where: | ||
| 740 | ;; (A,B) is a graft to replace A by B | ||
| 741 | ;; grafted(DRV,G) denoted DRV with graft G applied | ||
| 742 | (let* ((p1r (dummy-package "P1" | ||
| 743 | (build-system trivial-build-system) | ||
| 744 | (arguments | ||
| 745 | `(#:guile ,%bootstrap-guile | ||
| 746 | #:builder (let ((out (assoc-ref %outputs "out"))) | ||
| 747 | (mkdir out) | ||
| 748 | (call-with-output-file | ||
| 749 | (string-append out "/replacement") | ||
| 750 | (const #t))))))) | ||
| 751 | (p1 (package | ||
| 752 | (inherit p1r) (name "p1") (replacement p1r) | ||
| 753 | (arguments | ||
| 754 | `(#:guile ,%bootstrap-guile | ||
| 755 | #:builder (mkdir (assoc-ref %outputs "out")))))) | ||
| 756 | (p2r (dummy-package "P2" | ||
| 757 | (build-system trivial-build-system) | ||
| 758 | (inputs `(("p1" ,p1))) | ||
| 759 | (arguments | ||
| 760 | `(#:guile ,%bootstrap-guile | ||
| 761 | #:builder (let ((out (assoc-ref %outputs "out"))) | ||
| 762 | (mkdir out) | ||
| 763 | (chdir out) | ||
| 764 | (symlink (assoc-ref %build-inputs "p1") "p1") | ||
| 765 | (call-with-output-file (string-append out "/replacement") | ||
| 766 | (const #t))))))) | ||
| 767 | (p2 (package | ||
| 768 | (inherit p2r) (name "p2") (replacement p2r) | ||
| 769 | (arguments | ||
| 770 | `(#:guile ,%bootstrap-guile | ||
| 771 | #:builder (let ((out (assoc-ref %outputs "out"))) | ||
| 772 | (mkdir out) | ||
| 773 | (chdir out) | ||
| 774 | (symlink (assoc-ref %build-inputs "p1") | ||
| 775 | "p1")))))) | ||
| 776 | (p3 (dummy-package "p3" | ||
| 777 | (build-system trivial-build-system) | ||
| 778 | (inputs `(("p2" ,p2))) | ||
| 779 | (arguments | ||
| 780 | `(#:guile ,%bootstrap-guile | ||
| 781 | #:builder (let ((out (assoc-ref %outputs "out"))) | ||
| 782 | (mkdir out) | ||
| 783 | (chdir out) | ||
| 784 | (symlink (assoc-ref %build-inputs "p2") | ||
| 785 | "p2"))))))) | ||
| 786 | (lset= equal? | ||
| 787 | (package-grafts %store p3) | ||
| 788 | (list (graft | ||
| 789 | (origin (package-derivation %store p1 #:graft? #f)) | ||
| 790 | (replacement (package-derivation %store p1r))) | ||
| 791 | (graft | ||
| 792 | (origin (package-derivation %store p2 #:graft? #f)) | ||
| 793 | (replacement | ||
| 794 | (package-derivation %store p2r #:graft? #t))))))) | ||
| 795 | |||
| 722 | ;;; XXX: Nowadays 'graft-derivation' needs to build derivations beforehand to | 796 | ;;; XXX: Nowadays 'graft-derivation' needs to build derivations beforehand to |
| 723 | ;;; find out about their run-time dependencies, so this test is no longer | 797 | ;;; find out about their run-time dependencies, so this test is no longer |
| 724 | ;;; applicable since it would trigger a full rebuild. | 798 | ;;; applicable since it would trigger a full rebuild. |
