summary refs log tree commit diff
diff options
context:
space:
mode:
authorLudovic Courtès <ludo@gnu.org>2023-12-06 17:55:49 +0100
committerLudovic Courtès <ludo@gnu.org>2023-12-06 23:50:04 +0100
commitd98a0203b733316a8a5c9440469dfdd10fc9613f (patch)
treeaab053f7ebc269f76a95daa4190e12eb323d0828
parent4a6cef9d66ff26e96d63f2f1f886b8212154ca00 (diff)
downloadguix-d98a0203b733316a8a5c9440469dfdd10fc9613f.tar.gz
shell: ‘--development’ honors ‘--system’.
Fixes a bug whereby ‘package->development-manifest’ would run with the
wrong system in mind, leading to errors like this:

  $ guix shell -s i586-gnu -D shepherd --no-grafts
  guix shell: error: package linux-libre-headers@5.15.49 does not support i586-gnu

* guix/scripts/environment.scm (options/resolve-packages): Define
‘system’ and pass it to ‘package->development-manifest’.’
* tests/guix-shell.sh: Test it.

Change-Id: I95c471c1918913ab80dec7d3ca64fe38583cce78
-rw-r--r--guix/scripts/environment.scm10
-rw-r--r--tests/guix-shell.sh33
2 files changed, 39 insertions, 4 deletions
diff --git a/guix/scripts/environment.scm b/guix/scripts/environment.scm
index 6ae3b11e39..1d7a6e198d 100644
--- a/guix/scripts/environment.scm
+++ b/guix/scripts/environment.scm
@@ -311,6 +311,9 @@ use '--preserve' instead~%"))
 (define (options/resolve-packages store opts)
   "Return OPTS with package specification strings replaced by manifest entries
 for the corresponding packages."
+  (define system
+    (assoc-ref opts 'system))
+
   (define (manifest-entry=? e1 e2)
     (and (eq? (manifest-entry-item e1) (manifest-entry-item e2))
          (string=? (manifest-entry-output e1)
@@ -327,11 +330,11 @@ for the corresponding packages."
       ((? package? package)
        (if (eq? mode 'ad-hoc-package)
            (list (package->manifest-entry* package))
-           (manifest-entries (package->development-manifest package))))
+           (manifest-entries (package->development-manifest package system))))
       (((? package? package) (? string? output))
        (if (eq? mode 'ad-hoc-package)
            (list (package->manifest-entry* package output))
-           (manifest-entries (package->development-manifest package))))
+           (manifest-entries (package->development-manifest package system))))
       ((lst ...)
        (append-map (cut packages->outputs <> mode) lst))))
 
@@ -345,7 +348,8 @@ for the corresponding packages."
                   (('package 'package (? string? spec))
                    (manifest-entries
                     (package->development-manifest
-                     (transform (specification->package+output spec)))))
+                     (transform (specification->package+output spec))
+                     system)))
                   (('expression mode str)
                    ;; Add all the outputs of the package STR evaluates to.
                    (packages->outputs (read/eval str) mode))
diff --git a/tests/guix-shell.sh b/tests/guix-shell.sh
index 2f5fd86809..b2f820bf26 100644
--- a/tests/guix-shell.sh
+++ b/tests/guix-shell.sh
@@ -1,5 +1,5 @@
 # GNU Guix --- Functional package management for GNU
-# Copyright © 2021-2022 Ludovic Courtès <ludo@gnu.org>
+# Copyright © 2021-2023 Ludovic Courtès <ludo@gnu.org>
 #
 # This file is part of GNU Guix.
 #
@@ -103,6 +103,37 @@ guix shell --bootstrap --pure -D -f "$tmpdir/empty-package.scm" \
      guile-bootstrap -- guile --version
 rm "$tmpdir/empty-package.scm"
 
+# Make sure '--development' honors '--system'.
+this_system="$(guile -c '(use-modules (guix utils))
+  (display (%current-system))')"
+other_system="$(guile -c '(use-modules (guix utils))
+  (display (if (string=? "riscv64-linux" (%current-system))
+	       "x86_64-linux"
+	       "riscv64-linux"))')"
+cat > "$tmpdir/some-package.scm" <<EOF
+(use-modules (guix utils)
+             (guix packages)
+             (gnu packages base))
+
+(define unsupported-dependency
+  (package
+    (inherit grep)
+    (name "unsupported-dependency")
+    (supported-systems '())))
+
+(package
+  (inherit hello)
+  (name "phony-package")
+  (inputs
+    (if (string=? (%current-system) "$this_system")
+        (list unsupported-dependency)
+        '())))
+EOF
+
+guix shell -D -f "$tmpdir/some-package.scm" -n && false
+guix shell -D -f "$tmpdir/some-package.scm" -n -s "$other_system"
+
+
 if guile -c '(getaddrinfo "www.gnu.org" "80" AI_NUMERICSERV)' 2> /dev/null
 then
     # Compute the build environment for the initial GNU Make.