[PATCH core-updates 00/37] Support cross-compilation with meson

DoneSubmitted by Maxime Devos.
Details
3 participants
  • Ludovic Courtès
  • Maxime Devos
  • Mathieu Othacehe
Owner
unassigned
Severity
normal
M
M
Maxime Devos wrote on 14 Jun 2021 17:22
(address . guix-patches@gnu.org)
419215938396207999184dafa43afaed6d7a0715.camel@telenet.be
This patch series adds cross-compilation support to meson-build-system.
meson-build-system is used by many gtk applications (sometimes directly,
sometimes because a dependency uses meson-build-system).

This has been tested with

./pre-inst-env guix build --target=i686-linux-gnu glib

on a x86_64-linux system. The build succeeds, and
"guix gc --references ..." looked reasonable to me.

Meson cross-compilation is implemented by the last patch.
The one-before-last patch works-around the brokenness of
GCC cross-compilers on current core-updates

The first two patches define a few utilities target-linux?,
target-x86-32? and target-x86-64? which are used by the last patch,
but could be useful elsewhere as well. The third patch is used
in various cross-compilation fixes.

The other 34 patches are cross-compilation fixes for dependencies
of glib, and follow-up patches making the package definitions
somewhat nicer IMHO (like removing trailing #t from phases,
and computing derivation for some architecture-independent packages
when cross-compiling and compiling natively).

Maxime Devos (37):
utils: Define target-linux? predicate.
utils: Define a target-x86-32? and target-x86-64? predicate.
packages: Define this-package-input and this-package-native-input.
net-base: Make #:builder argument a G-expression.
net-base: Fix cross-compilation, eliminating %build-inputs & friends
net-base: Don't cross-compile.
tzdata: Don't bother with cross-compiling.
libgpg-error: Remove trailing #f from phases.
libgpg-error: Prevent silent miscompilation some systems.
libgpgerror: Maybe fix a cross-compilation bug.
libgpg-error: Fix cross-compilation error.
libgcrypt: Fix cross-compilation build error.
wrap-python3: Make #:builder a G-exp instead of a raw S-exp.
wrap-python3: Fix cross-compilation.
python: Fix reference to input when cross-compiling.
openssl: Remove trailing #t from phases.
openssl: Make the #:phases argument a G-expression.
openssl: Use G-exp machinery for referring to outputs.
openssl: Move documentation instead of copying and deleting it.
openssl: Move all man pages to separate output, not only man3.
openssl: Find bin/env when cross-compiling.
openssl: Extract logic for computing CONFIGURE_TARGET_ARCH.
readline: Make #:configure-flags a G-expression.
readline: Fix build error when cross-compiling.
bash: Make #:configure-flags a G-expression.
bash: Fix cross-compilation build error.
fontconfig: Make the #:configure-flags argument a G-expression.
fontconfig: Fix build error when cross-compiling.
glib: Use a correct python in scripts when cross-compiling.
glib: Verify the cross-compiled python is used in installed scripts.
glib: Look up "tzdata" in 'native-inputs', not 'inputs'.
tk: Make #:configure-flags a G-expression.
tk: Do not use %build-inputs when cross-compiling.
libelf: Use the cross-compiler when cross-compiling.
opendht: Correct 'nettle' variable name in inputs.
cross-base: Fix cross-compiler for i686-linux-gnu.
meson: Support cross-compilation.

Makefile.am | 1 +
gnu/packages/admin.scm | 44 ++++---
gnu/packages/base.scm | 9 ++
gnu/packages/bash.scm | 39 +++---
gnu/packages/cross-base.scm | 63 ++++++++-
gnu/packages/elf.scm | 48 ++++---
gnu/packages/fontutils.scm | 8 +-
gnu/packages/glib.scm | 34 ++++-
gnu/packages/gnupg.scm | 60 ++++++---
gnu/packages/networking.scm | 2 +-
gnu/packages/python.scm | 51 ++++----
gnu/packages/readline.scm | 27 ++--
gnu/packages/tcl.scm | 14 +-
gnu/packages/tls.scm | 142 ++++++++++----------
guix/build-system/meson.scm | 200 ++++++++++++++++++++++++++---
guix/build/meson-configuration.scm | 71 ++++++++++
guix/packages.scm | 29 +++++
guix/utils.scm | 26 ++++
tests/packages.scm | 34 +++++
tests/utils.scm | 40 ++++++
20 files changed, 728 insertions(+), 214 deletions(-)
create mode 100644 guix/build/meson-configuration.scm


base-commit: 92803cbef5affa3dbbf049262e1fcf290d8d8622
M
M
Maxime Devos wrote on 14 Jun 2021 17:37
[PATCH core-updates 08/37] libgpg-error: Remove trailing #f from phases.
(address . 49025@debbugs.gnu.org)
719b5bd1487e883362f08afaec6facd58dec1f81.camel@telenet.be
These aren't required anymore.

* gnu/packages/gnupg.scm (libgpgerror)[arguments]{cross-symlinks}:
Remove trailing #f.
---
gnu/packages/gnupg.scm | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
Toggle diff (14 lines)
diff --git a/gnu/packages/gnupg.scm b/gnu/packages/gnupg.scm
index cb481b38e1..2f44e6ec6a 100644
--- a/gnu/packages/gnupg.scm
+++ b/gnu/packages/gnupg.scm
@@ -114,8 +114,7 @@
                            (string-append x "-unknown-linux-gnu")))))
                    (symlink
                     (string-append "lock-obj-pub." triplet ".h")
-                    "src/syscfg/lock-obj-pub.linux-gnu.h"))
-                 #t))))
+                    "src/syscfg/lock-obj-pub.linux-gnu.h"))))))
          '()))
     (native-inputs `(("gettext" ,gettext-minimal)))
     (home-page "https://gnupg.org")
M
M
Maxime Devos wrote on 14 Jun 2021 17:37
[PATCH core-updates 09/37] libgpg-error: Prevent silent miscompilation some systems.
(address . 49025@debbugs.gnu.org)
48d3a94eacade6a6c34f9258f084fd2ac3ee4d8e.camel@telenet.be
* gnu/packages/gpg.scm
(libgpgerror)[arguments]<#:phases>{cross-symlinks}: Only
link to src/syscfg/lock-obj-pub.linux-gnu.h if the package
is being compiled for a Linux target. Do not link either
if the architecture is unknown, as the headers vary with
the architecture.
---
gnu/packages/gnupg.scm | 40 ++++++++++++++++++++++++++--------------
1 file changed, 26 insertions(+), 14 deletions(-)
Toggle diff (72 lines)
diff --git a/gnu/packages/gnupg.scm b/gnu/packages/gnupg.scm
index 2f44e6ec6a..de213d381f 100644
--- a/gnu/packages/gnupg.scm
+++ b/gnu/packages/gnupg.scm
@@ -18,6 +18,7 @@
 ;;; Copyright © 2018 Björn Höfling <bjoern.hoefling@bjoernhoefling.de>
 ;;; Copyright © 2019 Mathieu Othacehe <m.othacehe@gmail.com>
 ;;; Copyright © 2020 Fredrik Salomonsson <plattfot@posteo.net>
+;;; Copyright © 2021 Maxime Devos <maximedevos@telenet.be>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -77,6 +78,7 @@
   #:use-module (guix build-system gnu)
   #:use-module (guix build-system perl)
   #:use-module (guix build-system python)
+  #:use-module (ice-9 match)
   #:use-module (srfi srfi-1))
 
 (define-public libgpg-error
@@ -94,27 +96,37 @@
     (build-system gnu-build-system)
     (arguments
      (if (%current-target-system)
-         `(#:modules ((ice-9 match)
-                      (guix build gnu-build-system)
+         `(#:modules ((guix build gnu-build-system)
                       (guix build utils))
            #:phases
            (modify-phases %standard-phases
              ;; When cross-compiling, some platform specific properties cannot
              ;; be detected. Create a symlink to the appropriate platform
-             ;; file. See Cross-Compiling section at:
+             ;; file if required. Note that these platform files depend on
+             ;; both the operating system and architecture!
+             ;;
+             ;; See Cross-Compiling section at:
              ;; https://github.com/gpg/libgpg-error/blob/master/README
              (add-after 'unpack 'cross-symlinks
-               (lambda* (#:key target inputs #:allow-other-keys)
-                 (let ((triplet
-                        (match (string-take target
-                                            (string-index target #\-))
-                          ("armhf" "arm-unknown-linux-gnueabi")
-                          ("mips64el" "mips-unknown-linux-gnu")
-                          (x
-                           (string-append x "-unknown-linux-gnu")))))
-                   (symlink
-                    (string-append "lock-obj-pub." triplet ".h")
-                    "src/syscfg/lock-obj-pub.linux-gnu.h"))))))
+               (lambda _
+                 (define (link triplet source)
+                   (symlink (string-append "lock-obj-pub." triplet ".h")
+                            (string-append "src/syscfg/lock-obj-pub."
+                                           source ".h")))
+                 ,(let* ((target (%current-target-system))
+                         (architecture
+                          (string-take target (string-index target #\-))))
+                    (cond ((target-linux? target)
+                           (match architecture
+                             ("armhf"
+                              `(link "arm-unknown-linux-gnueabi" "linux-gnu"))
+                             ("mips64el"
+                              `(link "mips-unknown-linux-gnu" "linux-gnu"))
+                             ;; Don't always link to the "linux-gnu"
+                             ;; configuration, as this is not correct for
+                             ;; all architectures.
+                             (_ #t)))
+                          (#t #t)))))))
          '()))
     (native-inputs `(("gettext" ,gettext-minimal)))
     (home-page "https://gnupg.org")
M
M
Maxime Devos wrote on 14 Jun 2021 17:37
[PATCH core-updates 01/37] utils: Define target-linux? predicate.
(address . 49025@debbugs.gnu.org)
1006ad56f7750b41a6566edc2310105b80434aef.camel@telenet.be
* guix/utils.scm (target-linux?): New predicate.
* tests/utils.scm
("target-linux?"): Test it.
("target-mingw?"): Also test ‘target-mingw?’.
---
guix/utils.scm | 6 ++++++
tests/utils.scm | 17 +++++++++++++++++
2 files changed, 23 insertions(+)
Toggle diff (66 lines)
diff --git a/guix/utils.scm b/guix/utils.scm
index 19990ceb8a..4ff2602e23 100644
--- a/guix/utils.scm
+++ b/guix/utils.scm
@@ -11,6 +11,7 @@
 ;;; Copyright © 2020 Maxim Cournoyer <maxim.cournoyer@gmail.com>
 ;;; Copyright © 2021 Simon Tournier <zimon.toutoune@gmail.com>
 ;;; Copyright © 2021 Chris Marusich <cmmarusich@gmail.com>
+;;; Copyright © 2021 Maxime Devos <maximedevos@telenet.be>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -81,6 +82,7 @@
             %current-system
             %current-target-system
             package-name->name+version
+            target-linux?
             target-mingw?
             target-arm32?
             target-aarch64?
@@ -543,6 +545,10 @@ a character other than '@'."
     (idx (values (substring spec 0 idx)
                  (substring spec (1+ idx))))))
 
+(define* (target-linux? #:optional (target (or (%current-target-system)
+                                               (%current-system))))
+  (string-contains target "linux"))
+
 (define* (target-mingw? #:optional (target (%current-target-system)))
   (and target
        (string-suffix? "-mingw32" target)))
diff --git a/tests/utils.scm b/tests/utils.scm
index 7fcbb25552..80a0e669a4 100644
--- a/tests/utils.scm
+++ b/tests/utils.scm
@@ -3,6 +3,7 @@
 ;;; Copyright © 2014 Eric Bavier <bavier@member.fsf.org>
 ;;; Copyright © 2016 Mathieu Lirzin <mthl@gnu.org>
 ;;; Copyright © 2021 Simon Tournier <zimon.toutoune@gmail.com>
+;;; Copyright © 2021 Maxime Devos <maximedevos@telenet.be>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -289,6 +290,22 @@ skip these tests."
    (string-closest "hello" '("kikoo" "helo" "hihihi" "halo"))
    (string-closest "hello" '("aaaaa" "12345" "hellohello" "h"))))
 
+(test-equal "target-linux?"
+  '(#t #f #f #t)
+  (map (compose ->bool target-linux?)
+       '("i686-linux-gnu" "i686-w64-mingw32"
+         ;; Checking that "gnu" is present is not sufficient,
+         ;; as GNU/Hurd exists.
+         "i686-pc-gnu"
+         ;; Some targets have a suffix.
+         "arm-linux-gnueabihf")))
+
+(test-equal "target-mingw?"
+  '(#f #f #t)
+  (map (compose ->bool target-mingw?)
+       '("i686-linux-gnu" "i686-pc-gnu"
+         "i686-w64-mingw32")))
+
 (test-end)
 
 (false-if-exception (delete-file temp-file))
M
M
Maxime Devos wrote on 14 Jun 2021 17:37
[PATCH core-updates 03/37] packages: Define this-package-input and this-package-native-input.
(address . 49025@debbugs.gnu.org)
d5a0fb91ad0c084ec12d66c45cabc27af0d212e9.camel@telenet.be
These macros are intended to be used in build phases.
More precisely, (assoc-ref %build-inputs "input") can be
replaced by #$(this-package-input "input") or #+(this-package-native-input
"native-input") as appropriate.

* guix/packages.scm
(package-input, package-native-input): New (unexported) procedures.
(this-package-input, this-package-native-input): New macros.
---
guix/packages.scm | 29 +++++++++++++++++++++++++++++
tests/packages.scm | 34 ++++++++++++++++++++++++++++++++++
2 files changed, 63 insertions(+)
Toggle diff (99 lines)
diff --git a/guix/packages.scm b/guix/packages.scm
index a66dbea1b7..80c8bbebf0 100644
--- a/guix/packages.scm
+++ b/guix/packages.scm
@@ -108,6 +108,9 @@
             deprecated-package
             package-field-location
 
+            this-package-input
+            this-package-native-input
+
             package-direct-sources
             package-transitive-sources
             package-direct-inputs
@@ -513,6 +516,32 @@ object."
         #f)))
     (_ #f)))
 
+(define (package-input package name)
+  "Return the package input NAME of PACKAGE--i.e., an input
+from the ‘inputs’ or ‘propagated-inputs’ field.  Native inputs are not
+considered.  If this input does not exist, return #f instead."
+  (and=> (or (assoc-ref (package-inputs package) name)
+             (assoc-ref (package-propagated-inputs package) name))
+         car))
+
+(define (package-native-input package name)
+  "Return the native package input NAME of PACKAGE--i.e., an input
+from the ‘native-inputs’ field. If this native input does not exist,
+return #f instead."
+  (and=> (assoc-ref (package-native-inputs package) name)
+         car))
+
+(define-syntax-rule (this-package-input name)
+  "Return the input NAME of the package being defined--i.e., an input
+from the ‘inputs’ or ‘propagated-inputs’ field.  Native inputs are not
+considered.  If this input does not exist, return #f instead."
+  (package-input this-package name))
+
+(define-syntax-rule (this-package-native-input name)
+  "Return the native package input NAME of the package being defined--i.e.,
+an input from the ‘native-inputs’ field.  If this native input does not
+exist, return #f instead."
+  (package-native-input this-package name))
 
 ;; Error conditions.
 
diff --git a/tests/packages.scm b/tests/packages.scm
index 47d10af5bc..91ec38e4cc 100644
--- a/tests/packages.scm
+++ b/tests/packages.scm
@@ -2,6 +2,7 @@
 ;;; Copyright © 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
 ;;; Copyright © 2021 Maxim Cournoyer <maxim.cournoyer@gmail.com>
+;;; Copyright © 2021 Maxime Devos <maximedevos@telenet.be>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -1851,6 +1852,39 @@
   (package-location (specification->package "guile@2"))
   (specification->location "guile@2"))
 
+(test-eq "this-package-input, exists"
+  hello
+  (package-arguments
+   (dummy-package "a"
+     (inputs `(("hello" ,hello)))
+     (arguments (this-package-input "hello")))))
+
+(test-eq "this-package-input, exists in propagated-inputs"
+  hello
+  (package-arguments
+   (dummy-package "a"
+     (propagated-inputs `(("hello" ,hello)))
+     (arguments (this-package-input "hello")))))
+
+(test-eq "this-package-input, does not exist"
+  #f
+  (package-arguments
+   (dummy-package "a"
+     (arguments (this-package-input "hello")))))
+
+(test-eq "this-package-native-input, exists"
+  hello
+  (package-arguments
+   (dummy-package "a"
+     (native-inputs `(("hello" ,hello)))
+     (arguments (this-package-native-input "hello")))))
+
+(test-eq "this-package-native-input, does not exists"
+  #f
+  (package-arguments
+   (dummy-package "a"
+     (arguments (this-package-native-input "hello")))))
+
 (test-end "packages")
 
 ;;; Local Variables:
M
M
Maxime Devos wrote on 14 Jun 2021 17:37
[PATCH core-updates 13/37] wrap-python3: Make #:builder a G-exp instead of a raw S-exp.
(address . 49025@debbugs.gnu.org)
b138b39c4fd038befade024e64ed9c048756a167.camel@telenet.be
This allows using ungexp later.

* gnu/packages/python.scm (wrap-python3)<#:builder>: Make this
a G-expression.
---
gnu/packages/python.scm | 46 ++++++++++++++++++++---------------------
1 file changed, 23 insertions(+), 23 deletions(-)
Toggle diff (57 lines)
diff --git a/gnu/packages/python.scm b/gnu/packages/python.scm
index b2ec486d7a..9628836567 100644
--- a/gnu/packages/python.scm
+++ b/gnu/packages/python.scm
@@ -573,29 +573,29 @@ for more information.")))
     (arguments
      `(#:modules ((guix build utils))
        #:builder
-         (begin
-           (use-modules (guix build utils))
-           (let ((bin (string-append (assoc-ref %outputs "out") "/bin"))
-                 (python (string-append (assoc-ref %build-inputs "python") "/bin/")))
-                (mkdir-p bin)
-                (for-each
-                  (lambda (old new)
-                    (symlink (string-append python old)
-                             (string-append bin "/" new)))
-                  `("python3" ,"pydoc3" ,"idle3" ,"pip3")
-                  `("python"  ,"pydoc"  ,"idle"  ,"pip"))
-                ;; python-config outputs search paths based upon its location,
-                ;; use a bash wrapper to avoid changing its outputs.
-                (let ((bash (string-append (assoc-ref %build-inputs "bash")
-                                           "/bin/bash"))
-                      (old  (string-append python "python3-config"))
-                      (new  (string-append bin "/python-config")))
-                  (with-output-to-file new
-                    (lambda ()
-                      (format #t "#!~a~%" bash)
-                      (format #t "exec \"~a\" \"$@\"~%" old)
-                      (chmod new #o755)
-                      #t)))))))
+       ,#~(begin
+            (use-modules (guix build utils))
+            (let ((bin (string-append (assoc-ref %outputs "out") "/bin"))
+                  (python (string-append (assoc-ref %build-inputs "python") "/bin/")))
+              (mkdir-p bin)
+              (for-each
+               (lambda (old new)
+                 (symlink (string-append python old)
+                          (string-append bin "/" new)))
+               `("python3" ,"pydoc3" ,"idle3" ,"pip3")
+               `("python"  ,"pydoc"  ,"idle"  ,"pip"))
+              ;; python-config outputs search paths based upon its location,
+              ;; use a bash wrapper to avoid changing its outputs.
+              (let ((bash (string-append (assoc-ref %build-inputs "bash")
+                                         "/bin/bash"))
+                    (old  (string-append python "python3-config"))
+                    (new  (string-append bin "/python-config")))
+                (with-output-to-file new
+                  (lambda ()
+                    (format #t "#!~a~%" bash)
+                    (format #t "exec \"~a\" \"$@\"~%" old)
+                    (chmod new #o755)
+                    #t)))))))
     (synopsis "Wrapper for the Python 3 commands")
     (description
      "This package provides wrappers for the commands of Python@tie{}3.x such
M
M
Maxime Devos wrote on 14 Jun 2021 17:37
[PATCH core-updates 14/37] wrap-python3: Fix cross-compilation.
(address . 49025@debbugs.gnu.org)
52ef98617777bb5553dbaa830f39def091999684.camel@telenet.be
When cross-compiling, "bash" is missing from %build-inputs,
leading to a build error. Use this-package-input instead of
%build-inputs to resolve this. While we're at it, eliminate
all uses of %outputs and %build-inputs.

* gnu/packages/python.scm
(wrap-python3)[arguments]<#:builder>: Eliminte %outputs
and %build-inputs.
---
gnu/packages/python.scm | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
Toggle diff (33 lines)
diff --git a/gnu/packages/python.scm b/gnu/packages/python.scm
index 9628836567..fbad0b65b8 100644
--- a/gnu/packages/python.scm
+++ b/gnu/packages/python.scm
@@ -60,6 +60,7 @@
 ;;; Copyright © 2019 Tanguy Le Carrour <tanguy@bioneland.org>
 ;;; Copyright © 2020 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
 ;;; Copyright © 2020, 2021 Greg Hogan <code@greghogan.com>
+;;; Copyright © 2021 Maxime Devos <maximedevos@telenet.be>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -575,8 +576,8 @@ for more information.")))
        #:builder
        ,#~(begin
             (use-modules (guix build utils))
-            (let ((bin (string-append (assoc-ref %outputs "out") "/bin"))
-                  (python (string-append (assoc-ref %build-inputs "python") "/bin/")))
+            (let ((bin (string-append #$output "/bin"))
+                  (python #$(file-append (this-package-input "python") "/bin/")))
               (mkdir-p bin)
               (for-each
                (lambda (old new)
@@ -586,8 +587,7 @@ for more information.")))
                `("python"  ,"pydoc"  ,"idle"  ,"pip"))
               ;; python-config outputs search paths based upon its location,
               ;; use a bash wrapper to avoid changing its outputs.
-              (let ((bash (string-append (assoc-ref %build-inputs "bash")
-                                         "/bin/bash"))
+              (let ((bash #$(file-append (this-package-input "bash") "/bin/bash"))
                     (old  (string-append python "python3-config"))
                     (new  (string-append bin "/python-config")))
                 (with-output-to-file new
M
M
Maxime Devos wrote on 14 Jun 2021 17:37
[PATCH core-updates 12/37] libgcrypt: Fix cross-compilation build error.
(address . 49025@debbugs.gnu.org)
97624d382b54763e0753a1e9526be77c521907c4.camel@telenet.be
When cross-compiling a package using gnu-build-system,
%build-inputs does not exist. But libgcrypt uses %build-inputs
anyway. Fix it.

* gnu/packages/gnupg.scm
(libgcrypt)[arguments]<#:configure-flags>: Make this a G-exp
instead of a raw S-exp. Eliminate %build-inputs and use
this-package-input instead.
---
gnu/packages/gnupg.scm | 12 +++++++-----
1 file changed, 7 insertions(+), 5 deletions(-)
Toggle diff (30 lines)
diff --git a/gnu/packages/gnupg.scm b/gnu/packages/gnupg.scm
index 1fee30584c..35cfdf6f43 100644
--- a/gnu/packages/gnupg.scm
+++ b/gnu/packages/gnupg.scm
@@ -74,6 +74,7 @@
   #:use-module (guix packages)
   #:use-module (guix download)
   #:use-module (guix utils)
+  #:use-module (guix gexp)
   #:use-module (guix git-download)
   #:use-module (guix build-system gnu)
   #:use-module (guix build-system perl)
@@ -169,11 +170,12 @@ Daemon and possibly more in the future.")
      ;; 'configure' uses 'gpg-error-config' to determine the '-L' flag, and
      ;; the 'gpg-error-config' it runs is the native one---i.e., the wrong one.
      `(#:configure-flags
-       (list (string-append "--with-gpg-error-prefix="
-                            (assoc-ref %build-inputs "libgpg-error-host"))
-             ;; When cross-compiling, _gcry_mpih_lshift etc are undefined
-             ,@(if (%current-target-system) '("--disable-asm")
-                   '()))))
+       ,#~(list (string-append "--with-gpg-error-prefix="
+                               #$(this-package-input "libgpg-error-host"))
+                ;; When cross-compiling, _gcry_mpih_lshift etc are undefined
+                #$@(if (%current-target-system)
+                       #~("--disable-asm")
+                       #~()))))
     (outputs '("out" "debug"))
     (home-page "https://gnupg.org/")
     (synopsis "Cryptographic function library")
M
M
Maxime Devos wrote on 14 Jun 2021 17:37
[PATCH core-updates 10/37] libgpgerror: Maybe fix a cross-compilation bug.
(address . 49025@debbugs.gnu.org)
948fec07fa2cea1e1860da413757ea8755c16a89.camel@telenet.be
Previously, a symlink was created at
src/syscfg/lock-obj-pub.linux-gnu.h pointing at
lock-obj-pub.MANGLED-TARGET.h. I would think this has
to be the other way around, but I am not really sure.

* gnu/packages/gnupg.scm
(gnupg)[arguments]<#:phases>{cross-symlinks}(link): Switch
'triplet' and 'source'.
---
gnu/packages/gnupg.scm | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
Toggle diff (16 lines)
diff --git a/gnu/packages/gnupg.scm b/gnu/packages/gnupg.scm
index de213d381f..f5d4118af9 100644
--- a/gnu/packages/gnupg.scm
+++ b/gnu/packages/gnupg.scm
@@ -110,9 +110,9 @@
              (add-after 'unpack 'cross-symlinks
                (lambda _
                  (define (link triplet source)
-                   (symlink (string-append "lock-obj-pub." triplet ".h")
+                   (symlink (string-append "lock-obj-pub." source ".h")
                             (string-append "src/syscfg/lock-obj-pub."
-                                           source ".h")))
+                                           triplet ".h")))
                  ,(let* ((target (%current-target-system))
                          (architecture
                           (string-take target (string-index target #\-))))
M
M
Maxime Devos wrote on 14 Jun 2021 17:37
[PATCH core-updates 11/37] libgpg-error: Fix cross-compilation error.
(address . 49025@debbugs.gnu.org)
bac034757ee982ba494a77e3ebee0a0cf93edaa8.camel@telenet.be
TODO: inform upstream about the cross-compilation error.

* gnu/packages/gnupg.scm
(libgpg-error)[arguments]{fix-gen-lock-obj.sh}: Prevent generated
header files from being sprinkled with ‘\c’.
---
gnu/packages/gnupg.scm | 7 +++++++
1 file changed, 7 insertions(+)
Toggle diff (18 lines)
diff --git a/gnu/packages/gnupg.scm b/gnu/packages/gnupg.scm
index f5d4118af9..1fee30584c 100644
--- a/gnu/packages/gnupg.scm
+++ b/gnu/packages/gnupg.scm
@@ -100,6 +100,13 @@
                       (guix build utils))
            #:phases
            (modify-phases %standard-phases
+             ;; If this is left out, some generated header
+             ;; files will be sprinkled with ‘\c’, which
+             ;; the compiler won't like.
+             (add-after 'unpack 'fix-gen-lock-obj.sh
+               (lambda _
+                 (substitute* "src/gen-lock-obj.sh"
+                   (("if test -n `echo -n`") "if ! test -n `echo -n`"))))
              ;; When cross-compiling, some platform specific properties cannot
              ;; be detected. Create a symlink to the appropriate platform
              ;; file if required. Note that these platform files depend on
M
M
Maxime Devos wrote on 14 Jun 2021 17:37
[PATCH core-updates 16/37] openssl: Remove trailing #t from phases.
(address . 49025@debbugs.gnu.org)
087c14ca9722ecea88b38f7d023c8e8997a8bf09.camel@telenet.be
* gnu/packages/tls.scm
(openssl)[arguments]<#:phases>: Delete trailing #t.
---
gnu/packages/tls.scm | 12 ++++--------
1 file changed, 4 insertions(+), 8 deletions(-)
Toggle diff (44 lines)
diff --git a/gnu/packages/tls.scm b/gnu/packages/tls.scm
index 608a7d05b8..5bfc5545db 100644
--- a/gnu/packages/tls.scm
+++ b/gnu/packages/tls.scm
@@ -366,8 +366,7 @@ required structures.")
                            ((string-prefix? "powerpc64" target)
                             "linux-ppc64")
                            ((string-prefix? "powerpc" target)
-                            "linux-ppc")))
-                 #t)))
+                            "linux-ppc"))))))
            '())
         (replace 'configure
           (lambda* (#:key outputs #:allow-other-keys)
@@ -406,8 +405,7 @@ required structures.")
               (for-each (lambda (file)
                           (install-file file slib)
                           (delete-file file))
-                        (find-files lib "\\.a$"))
-              #t)))
+                        (find-files lib "\\.a$")))))
         (add-after 'install 'move-extra-documentation
           (lambda* (#:key outputs #:allow-other-keys)
                ;; Move man3 pages and full HTML documentation to "doc".
@@ -420,8 +418,7 @@ required structures.")
                  (copy-recursively man3 man-target)
                  (delete-file-recursively man3)
                  (copy-recursively html html-target)
-                 (delete-file-recursively html)
-                 #t)))
+                 (delete-file-recursively html))))
         (add-after
          'install 'remove-miscellany
          (lambda* (#:key outputs #:allow-other-keys)
@@ -430,8 +427,7 @@ required structures.")
            (let ((out (assoc-ref outputs "out")))
              (delete-file-recursively (string-append out "/share/openssl-"
                                                      ,(package-version this-package)
-                                                     "/misc"))
-             #t))))))
+                                                     "/misc"))))))))
    (native-search-paths
     (list (search-path-specification
            (variable "SSL_CERT_DIR")
M
M
Maxime Devos wrote on 14 Jun 2021 17:37
[PATCH core-updates 17/37] openssl: Make the #:phases argument a G-expression.
(address . 49025@debbugs.gnu.org)
6ef2004dd9701ac6e886ba121b3fe0a113741aa3.camel@telenet.be
This allows using this-package-native-input later.

* gnu/packages/tls.scm
(openssl)[arguments]<#:phases>: Make this a G-expression.
(openssl-1.0)[arguments]<#:phases>: Likewise.
---
gnu/packages/tls.scm | 42 ++++++++++++++++++++++--------------------
1 file changed, 22 insertions(+), 20 deletions(-)
Toggle diff (122 lines)
diff --git a/gnu/packages/tls.scm b/gnu/packages/tls.scm
index 5bfc5545db..9de9a78e84 100644
--- a/gnu/packages/tls.scm
+++ b/gnu/packages/tls.scm
@@ -38,6 +38,7 @@
   #:use-module (guix download)
   #:use-module (guix git-download)
   #:use-module (guix utils)
+  #:use-module (guix gexp)
   #:use-module (guix build-system gnu)
   #:use-module (guix build-system go)
   #:use-module (guix build-system perl)
@@ -341,9 +342,10 @@ required structures.")
       ;; so we explicitly disallow it here.
       #:disallowed-references ,(list (canonical-package perl))
       #:phases
+      ,#~
       (modify-phases %standard-phases
-       ,@(if (%current-target-system)
-           '((add-before
+       #$@(if (%current-target-system)
+          #~((add-before
                'configure 'set-cross-compile
                (lambda* (#:key target outputs #:allow-other-keys)
                  (setenv "CROSS_COMPILE" (string-append target "-"))
@@ -367,7 +369,7 @@ required structures.")
                             "linux-ppc64")
                            ((string-prefix? "powerpc" target)
                             "linux-ppc"))))))
-           '())
+             #~())
         (replace 'configure
           (lambda* (#:key outputs #:allow-other-keys)
             (let* ((out (assoc-ref outputs "out"))
@@ -377,9 +379,9 @@ required structures.")
                 (("/usr/bin/env")
                  (string-append (assoc-ref %build-inputs "coreutils")
                                 "/bin/env")))
-              (invoke ,@(if (%current-target-system)
-                          '("./Configure")
-                          '("./config"))
+              (invoke #$@(if (%current-target-system)
+                             #~("./Configure")
+                             #~("./config"))
                       "shared"       ;build shared libraries
                       "--libdir=lib"
 
@@ -388,13 +390,13 @@ required structures.")
                       ;; conventional.
                       (string-append "--openssldir=" out
                                      "/share/openssl-"
-                                     ,(package-version this-package))
+                                     #$(package-version this-package))
 
                       (string-append "--prefix=" out)
                       (string-append "-Wl,-rpath," lib)
-                      ,@(if (%current-target-system)
-                          '((getenv "CONFIGURE_TARGET_ARCH"))
-                          '())))))
+                      #$@(if (%current-target-system)
+                             #~((getenv "CONFIGURE_TARGET_ARCH"))
+                             #~())))))
         (add-after 'install 'move-static-libraries
           (lambda* (#:key outputs #:allow-other-keys)
             ;; Move static libraries to the "static" output.
@@ -426,7 +428,7 @@ required structures.")
            ;; scripts.  Remove them to avoid retaining a reference on Perl.
            (let ((out (assoc-ref outputs "out")))
              (delete-file-recursively (string-append out "/share/openssl-"
-                                                     ,(package-version this-package)
+                                                     #$(package-version this-package)
                                                      "/misc"))))))))
    (native-search-paths
     (list (search-path-specification
@@ -471,7 +473,7 @@ required structures.")
        ;; Parallel build is not supported in 1.0.x.
        ((#:parallel-build? _ #f) #f)
        ((#:phases phases)
-        `(modify-phases ,phases
+       #~(modify-phases #$phases
            (add-before 'patch-source-shebangs 'patch-tests
              (lambda* (#:key inputs native-inputs #:allow-other-keys)
                (let ((bash (assoc-ref (or native-inputs inputs) "bash")))
@@ -494,9 +496,9 @@ required structures.")
 	     ;; Override this phase because OpenSSL 1.0 does not understand -rpath.
 	     (lambda* (#:key outputs #:allow-other-keys)
 	       (let ((out (assoc-ref outputs "out")))
-		 (invoke ,@(if (%current-target-system)
-			       '("./Configure")
-			       '("./config"))
+		 (invoke #$@(if (%current-target-system)
+			        #~("./Configure")
+			        #~("./config"))
 			 "shared"                 ;build shared libraries
 			 "--libdir=lib"
 
@@ -504,12 +506,12 @@ required structures.")
 			 ;; PREFIX/ssl.  Change that to something more
 			 ;; conventional.
 			 (string-append "--openssldir=" out
-					"/share/openssl-" ,version)
+					"/share/openssl-" #$version)
 
 			 (string-append "--prefix=" out)
-			 ,@(if (%current-target-system)
-			       '((getenv "CONFIGURE_TARGET_ARCH"))
-			       '())))))
+			 #$@(if (%current-target-system)
+			        '((getenv "CONFIGURE_TARGET_ARCH"))
+			        '())))))
         (delete 'move-extra-documentation)
         (add-after 'install 'move-man3-pages
           (lambda* (#:key outputs #:allow-other-keys)
@@ -534,7 +536,7 @@ required structures.")
                ;; scripts.  Remove them to avoid retaining a reference on Perl.
                (let ((out (assoc-ref outputs "out")))
                  (delete-file-recursively (string-append out "/share/openssl-"
-                                                         ,version "/misc"))
+                                                         #$version "/misc"))
                  #t)))))))))
 
 (define-public libressl
M
M
Maxime Devos wrote on 14 Jun 2021 17:37
[PATCH core-updates 18/37] openssl: Use G-exp machinery for referring to outputs.
(address . 49025@debbugs.gnu.org)
9f50356b729d98eb09b66c55caa95791b1fe3209.camel@telenet.be
This doesn't fix anything broken, just for simplifying
the code a little while we're rebuilding the world anyway.
IMHO this makes the code a little more readable.

* gnu/packages/tls.scm (openssl)[arguments]<#:phases>: Don't refer
to the association list 'outputs', use #$output, #$output:doc
and #$output:static instead.
---
gnu/packages/tls.scm | 28 ++++++++++++++--------------
1 file changed, 14 insertions(+), 14 deletions(-)
Toggle diff (80 lines)
diff --git a/gnu/packages/tls.scm b/gnu/packages/tls.scm
index 9de9a78e84..90211c733d 100644
--- a/gnu/packages/tls.scm
+++ b/gnu/packages/tls.scm
@@ -16,6 +16,7 @@
 ;;; Copyright © 2019 Mathieu Othacehe <m.othacehe@gmail.com>
 ;;; Copyright © 2020 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
 ;;; Copyright © 2020 Maxim Cournoyer <maxim.cournoyer@gmail.com>
+;;; Copyright © 2021 Maxime Devos <maximedevos@telenet.be>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -347,7 +348,7 @@ required structures.")
        #$@(if (%current-target-system)
           #~((add-before
                'configure 'set-cross-compile
-               (lambda* (#:key target outputs #:allow-other-keys)
+               (lambda* (#:key target #:allow-other-keys)
                  (setenv "CROSS_COMPILE" (string-append target "-"))
                  (setenv "CONFIGURE_TARGET_ARCH"
                          (cond
@@ -371,8 +372,8 @@ required structures.")
                             "linux-ppc"))))))
              #~())
         (replace 'configure
-          (lambda* (#:key outputs #:allow-other-keys)
-            (let* ((out (assoc-ref outputs "out"))
+          (lambda _
+            (let* ((out #$output)
                    (lib (string-append out "/lib")))
               ;; It's not a shebang so patch-source-shebangs misses it.
               (substitute* "config"
@@ -398,23 +399,23 @@ required structures.")
                              #~((getenv "CONFIGURE_TARGET_ARCH"))
                              #~())))))
         (add-after 'install 'move-static-libraries
-          (lambda* (#:key outputs #:allow-other-keys)
+          (lambda _
             ;; Move static libraries to the "static" output.
-            (let* ((out    (assoc-ref outputs "out"))
+            (let* ((out    #$output)
                    (lib    (string-append out "/lib"))
-                   (static (assoc-ref outputs "static"))
+                   (static #$output:static)
                    (slib   (string-append static "/lib")))
               (for-each (lambda (file)
                           (install-file file slib)
                           (delete-file file))
                         (find-files lib "\\.a$")))))
         (add-after 'install 'move-extra-documentation
-          (lambda* (#:key outputs #:allow-other-keys)
+          (lambda _
                ;; Move man3 pages and full HTML documentation to "doc".
-               (let* ((out    (assoc-ref outputs "out"))
+               (let* ((out    #$output)
                       (man3   (string-append out "/share/man/man3"))
                       (html (string-append out "/share/doc/openssl"))
-                      (doc    (assoc-ref outputs "doc"))
+                      (doc    #$output:doc)
                       (man-target (string-append doc "/share/man/man3"))
                       (html-target (string-append doc "/share/doc/openssl")))
                  (copy-recursively man3 man-target)
@@ -423,13 +424,12 @@ required structures.")
                  (delete-file-recursively html))))
         (add-after
          'install 'remove-miscellany
-         (lambda* (#:key outputs #:allow-other-keys)
+         (lambda _
            ;; The 'misc' directory contains random undocumented shell and Perl
            ;; scripts.  Remove them to avoid retaining a reference on Perl.
-           (let ((out (assoc-ref outputs "out")))
-             (delete-file-recursively (string-append out "/share/openssl-"
-                                                     #$(package-version this-package)
-                                                     "/misc"))))))))
+           (delete-file-recursively (string-append #$output "/share/openssl-"
+                                                   #$(package-version this-package)
+                                                   "/misc")))))))
    (native-search-paths
     (list (search-path-specification
            (variable "SSL_CERT_DIR")
M
M
Maxime Devos wrote on 14 Jun 2021 17:37
[PATCH core-updates 19/37] openssl: Move documentation instead of copying and deleting it.
(address . 49025@debbugs.gnu.org)
9ab608462ae4c89963a8c4c0eb15a50e554e9c98.camel@telenet.be
* gnu/packages/tls.scm
(openssl)[arguments]<#:phases>{move-extra-documentation}: Use
'rename-file' instead of 'copy-recursively' and
'delete-file-recursively'.
---
gnu/packages/tls.scm | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
Toggle diff (19 lines)
diff --git a/gnu/packages/tls.scm b/gnu/packages/tls.scm
index 90211c733d..9aa0b5a212 100644
--- a/gnu/packages/tls.scm
+++ b/gnu/packages/tls.scm
@@ -418,10 +418,10 @@ required structures.")
                       (doc    #$output:doc)
                       (man-target (string-append doc "/share/man/man3"))
                       (html-target (string-append doc "/share/doc/openssl")))
-                 (copy-recursively man3 man-target)
-                 (delete-file-recursively man3)
-                 (copy-recursively html html-target)
-                 (delete-file-recursively html))))
+                 (mkdir-p (dirname man3-target))
+                 (mkdir-p (dirname html-target))
+                 (rename-file man3 man-target)
+                 (rename-file html html-target))))
         (add-after
          'install 'remove-miscellany
          (lambda _
M
M
Maxime Devos wrote on 14 Jun 2021 17:38
[PATCH core-updates 21/37] openssl: Find bin/env when cross-compiling.
(address . 49025@debbugs.gnu.org)
4dd136f941566e2aec0e86121a40cb2d38952d38.camel@telenet.be
%build-inputs does not exist when cross-compiling,
so find bin/env by another way.

* (openssl)[arguments]<#:phases>{configure}: Don't use '%build-inputs',
use 'which' instead.
---
gnu/packages/tls.scm | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
Toggle diff (18 lines)
diff --git a/gnu/packages/tls.scm b/gnu/packages/tls.scm
index c178806805..a4e754e27f 100644
--- a/gnu/packages/tls.scm
+++ b/gnu/packages/tls.scm
@@ -376,10 +376,10 @@ required structures.")
             (let* ((out #$output)
                    (lib (string-append out "/lib")))
               ;; It's not a shebang so patch-source-shebangs misses it.
+              ;; Don't use (assoc-ref %build-inputs "coreutils"), as
+              ;; %build-inputs is not defined when cross-compiling.
               (substitute* "config"
-                (("/usr/bin/env")
-                 (string-append (assoc-ref %build-inputs "coreutils")
-                                "/bin/env")))
+                (("/usr/bin/env") (which "env")))
               (invoke #$@(if (%current-target-system)
                              #~("./Configure")
                              #~("./config"))
M
M
Maxime Devos wrote on 14 Jun 2021 17:38
[PATCH core-updates 22/37] openssl: Extract logic for computing CONFIGURE_TARGET_ARCH.
(address . 49025@debbugs.gnu.org)
21aa622c4f4153b6b4d3c61118a3f08b98a9ab13.camel@telenet.be
By computing this value outside the build code, new targets
can be added without causing rebuilds for other targets.

* gnu/packages/tls.scm
(target->openssl-target): New procedure.
(openssl)[arguments]<#:phases>{set-cross-compile}: Use it.
---
gnu/packages/tls.scm | 46 ++++++++++++++++++++++++++------------------
1 file changed, 27 insertions(+), 19 deletions(-)
Toggle diff (64 lines)
diff --git a/gnu/packages/tls.scm b/gnu/packages/tls.scm
index a4e754e27f..af91e42888 100644
--- a/gnu/packages/tls.scm
+++ b/gnu/packages/tls.scm
@@ -313,6 +313,31 @@ required structures.")
 (define-public guile3.0-gnutls
   (deprecated-package "guile3.0-gnutls" gnutls))
 
+(define (target->openssl-target target)
+  "Return the value to set CONFIGURE_TARGET_ARCH to when cross-compiling
+OpenSSL for TARGET."
+  ;; Keep this code outside the build code,
+  ;; such that new targets can be added
+  ;; without causing rebuilds for other targets.
+  (cond ((string-prefix? "i586" target)
+         "hurd-x86")
+        ((string-prefix? "i686" target)
+         "linux-x86")
+        ((string-prefix? "x86_64" target)
+         "linux-x86_64")
+        ((string-prefix? "mips64el" target)
+         "linux-mips64")
+        ((string-prefix? "arm" target)
+         "linux-armv4")
+        ((string-prefix? "aarch64" target)
+         "linux-aarch64")
+        ((string-prefix? "powerpc64le" target)
+         "linux-ppc64le")
+        ((string-prefix? "powerpc64" target)
+         "linux-ppc64")
+        ((string-prefix? "powerpc" target)
+         "linux-ppc")))
+
 (define-public openssl
   (package
    (name "openssl")
@@ -351,25 +376,8 @@ required structures.")
                (lambda* (#:key target #:allow-other-keys)
                  (setenv "CROSS_COMPILE" (string-append target "-"))
                  (setenv "CONFIGURE_TARGET_ARCH"
-                         (cond
-                           ((string-prefix? "i586" target)
-                            "hurd-x86")
-                           ((string-prefix? "i686" target)
-                            "linux-x86")
-                           ((string-prefix? "x86_64" target)
-                            "linux-x86_64")
-                           ((string-prefix? "mips64el" target)
-                            "linux-mips64")
-                           ((string-prefix? "arm" target)
-                            "linux-armv4")
-                           ((string-prefix? "aarch64" target)
-                            "linux-aarch64")
-                           ((string-prefix? "powerpc64le" target)
-                            "linux-ppc64le")
-                           ((string-prefix? "powerpc64" target)
-                            "linux-ppc64")
-                           ((string-prefix? "powerpc" target)
-                            "linux-ppc"))))))
+                         #$(target->openssl-target
+                            (%current-target-system))))))
              #~())
         (replace 'configure
           (lambda _
M
M
Maxime Devos wrote on 14 Jun 2021 17:38
[PATCH core-updates 36/37] cross-base: Fix cross-compiler for i686-linux-gnu.
(address . 49025@debbugs.gnu.org)
ecb08a860518da2cf56e9bddcc4bbcdaea39d8b1.camel@telenet.be
GCC doesn't find libgcc_s.so anymore and looks in the wrong
location. Fix this (well, more a work-around really).

* gnu/packages/cross-base.scm
(cross-gcc-arguments)<#:configure-flags>:
Add --with-toolexecdir, such that libstdc++ ends up in the right
place. Add --with-slibdir such that libgcc_s.so end up in the right place.
(cross-gcc-arguments)<#:phases>{move-shared-libraries}:
New phase, moving libraries in the correct place.
Delete .la files, libasan.so and libusan.so to prevent circular
references. Likewise, fix a reference in libstdc++.so.VERSION-gdb.py.
---
gnu/packages/cross-base.scm | 63 +++++++++++++++++++++++++++++++++++--
1 file changed, 60 insertions(+), 3 deletions(-)
Toggle diff (96 lines)
diff --git a/gnu/packages/cross-base.scm b/gnu/packages/cross-base.scm
index 9487ac9238..995b4ae065 100644
--- a/gnu/packages/cross-base.scm
+++ b/gnu/packages/cross-base.scm
@@ -7,6 +7,7 @@
 ;;; Copyright © 2019, 2020, 2021 Marius Bakke <marius@gnu.org>
 ;;; Copyright © 2019 Carl Dong <contact@carldong.me>
 ;;; Copyright © 2020 Mathieu Othacehe <m.othacehe@gmail.com>
+;;; Copyright © 2021 Maxime Devos <maximedevos@telenet.be>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -33,6 +34,7 @@
   #:use-module (guix packages)
   #:use-module (guix download)
   #:use-module (guix utils)
+  #:use-module (guix gexp)
   #:use-module (guix build-system gnu)
   #:use-module (guix build-system trivial)
   #:use-module (srfi srfi-1)
@@ -169,9 +171,26 @@ base compiler and using LIBC (which may be either a libc package or #f.)"
                                 ))
 
                        ;; Install cross-built libraries such as libgcc_s.so in
-                       ;; the "lib" output.
+                       ;; the "lib" output. At least for version 8.4.0, GCC
+                       ;; will put libstdc++ in ${toolexecdir}/lib instead.
+                       ;; (A bug?) So set --with-toolexecdir as well.
+
                        ,@(if libc
-                             `((string-append "--with-toolexeclibdir="
+                             `((string-append "--with-toolexecdir="
+                                              (assoc-ref %outputs "lib"))
+                               (string-append "--with-toolexeclibdir="
+                                              (assoc-ref %outputs "lib")
+                                              "/" ,target "/lib"))
+                             '())
+                       ;; At least for GCC 8.0, libgcc_s.so and libstdc++.so
+                       ;; are not installed in the location specified in
+                       ;; --with-toolexeclibdir so GCC will not find it
+                       ;; when cross-compiling, say, GNU Hello.
+                       ;;
+                       ;; Work-around by specifying slibdir. This is not
+                       ;; sufficient, see move-shared-libraries below.
+                       ,@(if (and libc (version>=? (package-version xgcc) "8.0"))
+                             `((string-append "--with-slibdir="
                                               (assoc-ref %outputs "lib")
                                               "/" ,target "/lib"))
                              '())
@@ -193,7 +212,45 @@ base compiler and using LIBC (which may be either a libc package or #f.)"
                      ,flags))
             flags))
        ((#:phases phases)
-        `(cross-gcc-build-phases ,target ,phases))))))
+        (if (and libc (version>=? (package-version xgcc) "8.0"))
+            #~(modify-phases (cross-gcc-build-phases #$target #$phases)
+                (add-after 'install 'move-shared-libraries
+                  (lambda _
+                    (let* ((slib (format #f "~a/~a/lib/" #$output:lib #$target))
+                           (badlib (format #f "~a/~a/lib/" #$output #$target))
+                           (libs (map basename (find-files badlib #:fail-on-error? #t))))
+                      (for-each
+                       (lambda (lib)
+                         (let ((from (string-append badlib lib))
+                               (to   (string-append slib lib)))
+                           (when (file-exists? to)
+                             (error "~a was found twice, refusing to overwrite!"
+                                    lib))
+                           ;; The debugging script libstdc++.so.VERSION-gdb.py has
+                           ;; reference to #$output. Correct it.
+                           (when (string-suffix? "-gdb.py" lib)
+                             (substitute* from
+                               (("libdir = '(.*)'")
+                                (string-append "libdir = '" slib "'")))
+                             (system* "cat" from))
+                           ;; The .la files have references to BADLIB,
+                           ;; leading to cyclic references between
+                           ;; the outputs of the package. Remove them
+                           ;; and hope noone notices.
+                           ;;
+                           ;; Likewise, libasan.so.* and libubsan.so.*
+                           ;; have references to #$output.
+                           (if (or (string-suffix? ".la" lib)
+                                   (string-prefix? "libasan.so" lib)
+                                   (string-prefix? "libubsan.so" lib))
+                               (delete-file from)
+                               (rename-file from to))))
+                       libs)
+                      ;; If you have "cyclic references" problems,
+                      ;; uncomment this and use --keep-failed to figure
+                      ;; things out.
+                      (copy-recursively #$output:lib "out-test")))))
+            #~(cross-gcc-build-phases #$target #$phases)))))))
 
 (define (cross-gcc-patches xgcc target)
   "Return GCC patches needed for XGCC and TARGET."
M
M
Maxime Devos wrote on 14 Jun 2021 17:38
[PATCH core-updates 04/37] net-base: Make #:builder argument a G-expression.
(address . 49025@debbugs.gnu.org)
1c6f166aa09333a575a5249fdb395cf1b59ad947.camel@telenet.be
This allows using ungexp-native and this-package-native-input later.

* gnu/packages/admin.scm (net-base)[arguments]{#:builder}: Make this
a G-expression.
---
gnu/packages/admin.scm | 39 ++++++++++++++++++++-------------------
1 file changed, 20 insertions(+), 19 deletions(-)
Toggle diff (57 lines)
diff --git a/gnu/packages/admin.scm b/gnu/packages/admin.scm
index 531686fdbb..5c7e41f51b 100644
--- a/gnu/packages/admin.scm
+++ b/gnu/packages/admin.scm
@@ -74,6 +74,7 @@
   #:use-module ((guix licenses) #:prefix license:)
   #:use-module (guix packages)
   #:use-module (guix utils)
+  #:use-module (guix gexp)
   #:use-module (gnu packages)
   #:use-module (gnu packages algebra)
   #:use-module (gnu packages autogen)
@@ -936,25 +937,25 @@ to allow automatic login and starting any app.")
     (build-system trivial-build-system)
     (arguments
      `(#:modules ((guix build utils))
-       #:builder (begin
-                   (use-modules (guix build utils)
-                                (srfi srfi-26))
-
-                   (let* ((source (assoc-ref %build-inputs "source"))
-                          (tar    (assoc-ref %build-inputs "tar"))
-                          (xz     (assoc-ref %build-inputs "xz"))
-                          (output (assoc-ref %outputs "out"))
-                          (etc    (string-append output "/etc")))
-                     (setenv "PATH" (string-append xz "/bin"))
-                     (invoke (string-append tar "/bin/tar") "xvf"
-                             source)
-                     (chdir ,(string-append "netbase-" version))
-                     (mkdir-p etc)
-                     (for-each copy-file
-                               '("etc-services" "etc-protocols" "etc-rpc")
-                               (map (cut string-append etc "/" <>)
-                                    '("services" "protocols" "rpc")))
-                     #t))))
+       #:builder ,#~(begin
+                      (use-modules (guix build utils)
+                                   (srfi srfi-26))
+
+                      (let* ((source (assoc-ref %build-inputs "source"))
+                             (tar    (assoc-ref %build-inputs "tar"))
+                             (xz     (assoc-ref %build-inputs "xz"))
+                             (output (assoc-ref %outputs "out"))
+                             (etc    (string-append output "/etc")))
+                        (setenv "PATH" (string-append xz "/bin"))
+                        (invoke (string-append tar "/bin/tar") "xvf"
+                                source)
+                        (chdir #$(string-append "netbase-" version))
+                        (mkdir-p etc)
+                        (for-each copy-file
+                                  '("etc-services" "etc-protocols" "etc-rpc")
+                                  (map (cut string-append etc "/" <>)
+                                       '("services" "protocols" "rpc")))
+                        #t))))
     (native-inputs `(("tar" ,tar)
                      ("xz" ,xz)))
     (synopsis "IANA protocol, port, and RPC number assignments")
M
M
Maxime Devos wrote on 14 Jun 2021 17:38
[PATCH core-updates 05/37] net-base: Fix cross-compilation, eliminating %build-inputs & friends
(address . 49025@debbugs.gnu.org)
1d2e246e4d21a5b3d7b4232478d51b04bbf9434e.camel@telenet.be
"source" is not in %build-inputs when cross-compiling, so another
approach for referring to the package source code is needed.

* gnu/packages/admin.scm (net-base)[arguments]<#:builder>: Eliminate
%build-inputs and %outputs.
---
gnu/packages/admin.scm | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
Toggle diff (19 lines)
diff --git a/gnu/packages/admin.scm b/gnu/packages/admin.scm
index 5c7e41f51b..f499a1252b 100644
--- a/gnu/packages/admin.scm
+++ b/gnu/packages/admin.scm
@@ -941,10 +941,10 @@ to allow automatic login and starting any app.")
                       (use-modules (guix build utils)
                                    (srfi srfi-26))
 
-                      (let* ((source (assoc-ref %build-inputs "source"))
-                             (tar    (assoc-ref %build-inputs "tar"))
-                             (xz     (assoc-ref %build-inputs "xz"))
-                             (output (assoc-ref %outputs "out"))
+                      (let* ((source #+(package-source this-package))
+                             (tar    #+(this-package-native-input "tar"))
+                             (xz     #+(this-package-native-input "xz"))
+                             (output #$output)
                              (etc    (string-append output "/etc")))
                         (setenv "PATH" (string-append xz "/bin"))
                         (invoke (string-append tar "/bin/tar") "xvf"
M
M
Maxime Devos wrote on 14 Jun 2021 17:38
[PATCH core-updates 06/37] net-base: Don't cross-compile.
(address . 49025@debbugs.gnu.org)
db8ece5941d1919d27cfa5654322b971cb78f61a.camel@telenet.be
net-base is pure data, so cross-compiling is pointless.

* gnu/packages/admin.scm
(net-base)[arguments]<#:target>: Set to #f.
(net-base)[arguments]<#:allowed-references>: Disallow all
references.
---
gnu/packages/admin.scm | 5 +++++
1 file changed, 5 insertions(+)
Toggle diff (16 lines)
diff --git a/gnu/packages/admin.scm b/gnu/packages/admin.scm
index f499a1252b..5e41ba9967 100644
--- a/gnu/packages/admin.scm
+++ b/gnu/packages/admin.scm
@@ -937,6 +937,11 @@ to allow automatic login and starting any app.")
     (build-system trivial-build-system)
     (arguments
      `(#:modules ((guix build utils))
+       ;; This package consists solely of architecture-independent
+       ;; tables. Cross-compilation is pointless! Make sure we'll
+       ;; always get the same derivation.
+       #:target #f
+       #:allowed-references ()
        #:builder ,#~(begin
                       (use-modules (guix build utils)
                                    (srfi srfi-26))
M
M
Maxime Devos wrote on 14 Jun 2021 17:38
[PATCH core-updates 24/37] readline: Fix build error when cross-compiling.
(address . 49025@debbugs.gnu.org)
d292e8ea74dd87684c36141bf7b6933a25141c85.camel@telenet.be
%build-inputs does not exist when cross-compiling, so
use this-package-input instead.

* gnu/packages/readline.scm
(readline)[arguments]<#:configure-flags>: Use this-package-input
instead of %build-inputs.
---
gnu/packages/readline.scm | 8 +++++---
1 file changed, 5 insertions(+), 3 deletions(-)
Toggle diff (26 lines)
diff --git a/gnu/packages/readline.scm b/gnu/packages/readline.scm
index 6cfa24c666..f9f2797247 100644
--- a/gnu/packages/readline.scm
+++ b/gnu/packages/readline.scm
@@ -4,6 +4,7 @@
 ;;; Copyright © 2016 Jan Nieuwenhuizen <janneke@gnu.org>
 ;;; Copyright © 2018 Tobias Geerinckx-Rice <me@tobias.gr>
 ;;; Copyright © 2019, 2020 Marius Bakke <marius@gnu.org>
+;;; Copyright © 2021 Maxime Devos <maximedevos@telenet.be>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -77,9 +78,10 @@
     (build-system gnu-build-system)
     (propagated-inputs `(("ncurses" ,ncurses)))
     (arguments `(#:configure-flags
-                 ,#~(list (string-append "LDFLAGS=-Wl,-rpath -Wl,"
-                                         (assoc-ref %build-inputs "ncurses")
-                                         "/lib")
+                 ,#~(list (string-append
+                           "LDFLAGS=-Wl,-rpath -Wl,"
+                           #$(this-package-input "ncurses")
+                           "/lib")
 
                           ;; This test does an 'AC_TRY_RUN', which aborts when
                           ;; cross-compiling, so provide the correct answer.
M
M
Maxime Devos wrote on 14 Jun 2021 17:38
[PATCH core-updates 25/37] bash: Make #:configure-flags a G-expression.
(address . 49025@debbugs.gnu.org)
41a77275fd874e715de39219e0d1798d71519164.camel@telenet.be
This allows using this-package-input later.

* gnu/packages/bash.scm
(bash)[arguments]<#:configure-flags>: Make this a G-expression
instead of a raw S-expression.
---
gnu/packages/bash.scm | 22 +++++++++++-----------
1 file changed, 11 insertions(+), 11 deletions(-)
Toggle diff (40 lines)
diff --git a/gnu/packages/bash.scm b/gnu/packages/bash.scm
index 7e98367bbb..b3af873a66 100644
--- a/gnu/packages/bash.scm
+++ b/gnu/packages/bash.scm
@@ -109,15 +109,15 @@ number/base32-hash tuples, directly usable in the 'patch-series' form."
                                   "-DSSH_SOURCE_BASHRC")
                                 " "))
          (configure-flags
-          ``("--with-installed-readline"
-             ,,(string-append "CPPFLAGS=" cppflags)
-             ,(string-append
-               "LDFLAGS=-Wl,-rpath -Wl,"
-               (assoc-ref %build-inputs "readline")
-               "/lib"
-               " -Wl,-rpath -Wl,"
-               (assoc-ref %build-inputs "ncurses")
-               "/lib")))
+          #~`("--with-installed-readline"
+              ,#$(string-append "CPPFLAGS=" cppflags)
+              ,(string-append
+                "LDFLAGS=-Wl,-rpath -Wl,"
+                (assoc-ref %build-inputs "readline")
+                "/lib"
+                " -Wl,-rpath -Wl,"
+                (assoc-ref %build-inputs "ncurses")
+                "/lib")))
          (version "5.1"))
     (package
      (name "bash")
@@ -143,8 +143,8 @@ number/base32-hash tuples, directly usable in the 'patch-series' form."
       `(;; When cross-compiling, `configure' incorrectly guesses that job
         ;; control is missing.
         #:configure-flags ,(if (%current-target-system)
-                               `(cons* "bash_cv_job_control_missing=no"
-                                       ,configure-flags)
+                               #~(cons* "bash_cv_job_control_missing=no"
+                                        #$configure-flags)
                                configure-flags)
 
         ;; Bash is reportedly not parallel-safe.  See, for instance,
M
M
Maxime Devos wrote on 14 Jun 2021 17:38
[PATCH core-updates 27/37] fontconfig: Make the #:configure-flags argument a G-expression.
(address . 49025@debbugs.gnu.org)
008530a77ab5e357e737ff63d4594ceeaaf76a62.camel@telenet.be
This allows using #$(this-package-input ...) later.

* gnu/packages/fontutils.scm
(fontconfig)[arguments]<#:configure-flags>: Make this a
G-expression instead of a raw S-expression.
(fontconfig-with-documentation)[arguments]<#:configure-flags>: Likewise.
---
gnu/packages/fontutils.scm | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
Toggle diff (29 lines)
diff --git a/gnu/packages/fontutils.scm b/gnu/packages/fontutils.scm
index dbce5beba8..234f11129a 100644
--- a/gnu/packages/fontutils.scm
+++ b/gnu/packages/fontutils.scm
@@ -64,6 +64,7 @@
   #:use-module (gnu packages xorg)
   #:use-module (gnu packages tex)
   #:use-module ((guix licenses) #:prefix license:)
+  #:use-module (guix gexp)
   #:use-module (guix packages)
   #:use-module (guix download)
   #:use-module (guix svn-download)
@@ -347,6 +348,7 @@ Font Format (WOFF).")
         ("python" ,python-minimal)))    ;to avoid a cycle through tk
      (arguments
       `(#:configure-flags
+        ,#~
         (list "--disable-docs"
               "--with-cache-dir=/var/cache/fontconfig"
               ;; register the default fonts
@@ -400,7 +402,7 @@ high quality, anti-aliased and subpixel rendered text on a display.")
     (arguments
      (substitute-keyword-arguments (package-arguments fontconfig)
        ((#:configure-flags configure-flags)
-        `(delete "--disable-docs" ,configure-flags))
+        #~(delete "--disable-docs" #$configure-flags))
        ((#:phases phases '%standard-phases)
         `(modify-phases ,phases
            (add-after 'install 'move-man-sections
M
M
Maxime Devos wrote on 14 Jun 2021 17:38
[PATCH core-updates 28/37] fontconfig: Fix build error when cross-compiling.
(address . 49025@debbugs.gnu.org)
945171e6c288773a500fa10ffa6dd945fdf1172f.camel@telenet.be
%build-inputs does not exist when cross-compiling,
so use #$(this-package-input ...) instead.

* gnu/packages/fontutils.scm
(fontconfig)[arguments]<#:configure-flags>: Use this-package-input
instead of %build-inputs.
---
gnu/packages/fontutils.scm | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
Toggle diff (15 lines)
diff --git a/gnu/packages/fontutils.scm b/gnu/packages/fontutils.scm
index 234f11129a..b0d40efeae 100644
--- a/gnu/packages/fontutils.scm
+++ b/gnu/packages/fontutils.scm
@@ -353,8 +353,8 @@ Font Format (WOFF).")
               "--with-cache-dir=/var/cache/fontconfig"
               ;; register the default fonts
               (string-append "--with-default-fonts="
-                             (assoc-ref %build-inputs "font-dejavu")
-                             "/share/fonts")
+                             #$(file-append (this-package-input "font-dejavu")
+                                            "/share/fonts"))
 
               ;; Register fonts from user and system profiles.
               (string-append "--with-add-fonts="
M
M
Maxime Devos wrote on 14 Jun 2021 17:38
[PATCH core-updates 29/37] glib: Use a correct python in scripts when cross-compiling.
(address . 49025@debbugs.gnu.org)
e8f61a5be861a7dd4a933eb5b85954301b997b6e.camel@telenet.be
During the build, a native python should be used as these
scripts will be invoked during the build, but when installed,
they should be a python for the system we're compiling for.

* gnu/packages/glib.scm
(glib)[arguments]<#:phases>{patch-python-references}: Look up
"python" in 'native-inputs', not 'inputs'.
(glib)[inputs]{python,python-wrapper,bash-minimal}: New inputs.
---
gnu/packages/glib.scm | 17 +++++++++++++++--
1 file changed, 15 insertions(+), 2 deletions(-)
Toggle diff (48 lines)
diff --git a/gnu/packages/glib.scm b/gnu/packages/glib.scm
index 94276ae0ef..25c5ae494b 100644
--- a/gnu/packages/glib.scm
+++ b/gnu/packages/glib.scm
@@ -16,6 +16,7 @@
 ;;; Copyright © 2020 Florian Pelz <pelzflorian@pelzflorian.de>
 ;;; Copyright © 2020 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
 ;;; Copyright © 2020 Arthur Margerit <ruhtra.mar@gmail.com>
+;;; Copyright © 2021 Maxime Devos <maximedevos@telenet.be>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -222,14 +223,19 @@ shared NFS home directories.")
              #t))
          ;; Python references are not being patched in patch-phase of build,
          ;; despite using python-wrapper as input. So we patch them manually.
+         ;;
+         ;; These python scripts are both used during build and installed,
+         ;; so at first, use a python from 'native-inputs', not 'inputs'. When
+         ;; cross-compiling, the 'patch-shebangs' phase will replace
+         ;; the native python with a python from 'inputs'.
          (add-after 'unpack 'patch-python-references
-           (lambda* (#:key inputs #:allow-other-keys)
+           (lambda* (#:key native-inputs inputs #:allow-other-keys)
              (substitute* '("gio/gdbus-2.0/codegen/gdbus-codegen.in"
                             "glib/gtester-report.in"
                             "gobject/glib-genmarshal.in"
                             "gobject/glib-mkenums.in")
                (("@PYTHON@")
-                (string-append (assoc-ref inputs "python")
+                (string-append (assoc-ref (or native-inputs inputs) "python")
                                "/bin/python"
                                ,(version-major+minor
                                  (package-version python)))))
@@ -282,6 +288,13 @@ shared NFS home directories.")
        ("xsltproc" ,libxslt)))
     (inputs
      `(("bash-completion" ,bash-completion)
+       ;; "python", "python-wrapper" and "bash-minimal"
+       ;; are for the 'patch-shebangs' phase, to make
+       ;; sure the installed scripts end up with a correct shebang
+       ;; when cross-compiling.
+       ("python" ,python)
+       ("python-wrapper" ,python-wrapper)
+       ("bash-minimal" ,(canonical-package bash-minimal))
        ("dbus" ,dbus)
        ("libelf" ,libelf)))
     (propagated-inputs
M
M
Maxime Devos wrote on 14 Jun 2021 17:39
[PATCH core-updates 07/37] tzdata: Don't bother with cross-compiling.
(address . 49025@debbugs.gnu.org)
d5766d743774fc8b727ba1fde7d90f97dab303d9.camel@telenet.be
The time zone database is architecture-independent,
so trying to cross-compile it is pointless!

* gnu/packages/base.scm
(tzdata)[arguments]<#:target>: Set to #f.
(tzdata)[allowed-references]: Only include the "out" output itself,
to make sure no (architecture-dependent) binaries are installed.
---
gnu/packages/base.scm | 9 +++++++++
1 file changed, 9 insertions(+)
Toggle diff (27 lines)
diff --git a/gnu/packages/base.scm b/gnu/packages/base.scm
index d30299a7b6..2674be8048 100644
--- a/gnu/packages/base.scm
+++ b/gnu/packages/base.scm
@@ -17,6 +17,7 @@
 ;;; Copyright © 2020 Vitaliy Shatrov <D0dyBo0D0dyBo0@protonmail.com>
 ;;; Copyright © 2020 Chris Marusich <cmmarusich@gmail.com>
 ;;; Copyright © 2021 Leo Le Bouter <lle-bout@zaclys.net>
+;;; Copyright © 2021 Maxime Devos <maximedevos@telenet.be>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -1251,6 +1252,14 @@ command.")
     (build-system gnu-build-system)
     (arguments
      `(#:tests? #f
+       ;; This consists purely of (architecture-independent) data,
+       ;; so ‘cross-compilation’ is pointless here!
+       ;; (The binaries zic, dump, and tzselect are deleted in the post-install
+       ;; phase.)
+       #:target #f
+       ;; share/zoneinfo/posix is a symlink to share/zoneinfo,
+       ;; so include the package itself in #:allowed-references.
+       #:allowed-references ("out")
        #:make-flags (let ((out (assoc-ref %outputs "out"))
                           (tmp (getenv "TMPDIR")))
                       (list (string-append "TOPDIR=" out)
M
M
Maxime Devos wrote on 14 Jun 2021 17:39
[PATCH core-updates 30/37] glib: Verify the cross-compiled python is used in installed scripts.
(address . 49025@debbugs.gnu.org)
5e7f30def92fa5a6403df07ca2f2f2e0434b6679.camel@telenet.be
* gnu/packages/glib.scm (glib)[arguments]<#:disallowed-references>:
Disallow the native python when cross-compiling.
---
gnu/packages/glib.scm | 12 +++++++++++-
1 file changed, 11 insertions(+), 1 deletion(-)
Toggle diff (30 lines)
diff --git a/gnu/packages/glib.scm b/gnu/packages/glib.scm
index 25c5ae494b..244544ea6f 100644
--- a/gnu/packages/glib.scm
+++ b/gnu/packages/glib.scm
@@ -77,6 +77,8 @@
   #:use-module ((guix licenses) #:prefix license:)
   #:use-module (guix packages)
   #:use-module (guix utils)
+  #:use-module (guix gexp)
+  #:use-module (srfi srfi-26)
   #:use-module ((srfi srfi-1) #:hide (zip))
 
   ;; Export variables up-front to allow circular dependency with the 'xorg'
@@ -200,7 +202,15 @@ shared NFS home directories.")
     (outputs '("out"   ; everything
                "bin")) ; glib-mkenums, gtester, etc.; depends on Python
     (arguments
-     `(#:disallowed-references (,tzdata-for-tests)
+     `(#:disallowed-references
+       (,tzdata-for-tests
+        ;; Verify glib-mkenums, gtester, ... use the cross-compiled
+        ;; python.
+        ,@(if (%current-target-system)
+              (map (cut gexp-input <> #:native? #t)
+                   `(,(this-package-native-input "python")
+                     ,(this-package-native-input "python-wrapper")))
+              '()))
        #:configure-flags '("-Dman=true"
                            "-Dselinux=disabled")
        #:phases
M
M
Maxime Devos wrote on 14 Jun 2021 17:39
[PATCH core-updates 20/37] openssl: Move all man pages to separate output, not only man3.
(address . 49025@debbugs.gnu.org)
67bd5a45aa9417d5cd4951bb81f735009e394d33.camel@telenet.be
There does not seem to be any reason to only move man3 pages.
So, move all man pages to a separate output for documentation.

* gnu/packages/tls.scm
(openssl)[arguments]<#:phases>{move-extra-documentation}: Move
all man pages, not only man3.
---
gnu/packages/tls.scm | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
Toggle diff (27 lines)
diff --git a/gnu/packages/tls.scm b/gnu/packages/tls.scm
index 9aa0b5a212..c178806805 100644
--- a/gnu/packages/tls.scm
+++ b/gnu/packages/tls.scm
@@ -411,16 +411,16 @@ required structures.")
                         (find-files lib "\\.a$")))))
         (add-after 'install 'move-extra-documentation
           (lambda _
-               ;; Move man3 pages and full HTML documentation to "doc".
+               ;; Move man pages and full HTML documentation to "doc".
                (let* ((out    #$output)
-                      (man3   (string-append out "/share/man/man3"))
-                      (html (string-append out "/share/doc/openssl"))
+                      (man    (string-append out "/share/man"))
+                      (html   (string-append out "/share/doc/openssl"))
                       (doc    #$output:doc)
-                      (man-target (string-append doc "/share/man/man3"))
+                      (man-target (string-append doc "/share/man"))
                       (html-target (string-append doc "/share/doc/openssl")))
-                 (mkdir-p (dirname man3-target))
+                 (mkdir-p (dirname man-target))
                  (mkdir-p (dirname html-target))
-                 (rename-file man3 man-target)
+                 (rename-file man man-target)
                  (rename-file html html-target))))
         (add-after
          'install 'remove-miscellany
M
M
Maxime Devos wrote on 14 Jun 2021 17:39
[PATCH core-updates 34/37] libelf: Use the cross-compiler when cross-compiling.
(address . 49025@debbugs.gnu.org)
f825c25dca2f0304505fb3d6e99185211f632bfd.camel@telenet.be
* gnu/packages/elf.scm
(libelf)[arguments]<#:phases>{delete-configure}: Regenerate
the configure script when cross-compiling.
(libelf)[arguments]<#:phases>{configure}: Do not replace
when cross-compiling.
(libelf)[native-inputs]: Add autoconf when cross-compiling.
---
gnu/packages/elf.scm | 48 +++++++++++++++++++++++++++++---------------
1 file changed, 32 insertions(+), 16 deletions(-)
Toggle diff (73 lines)
diff --git a/gnu/packages/elf.scm b/gnu/packages/elf.scm
index 0309dd95b5..66c2334e5c 100644
--- a/gnu/packages/elf.scm
+++ b/gnu/packages/elf.scm
@@ -9,6 +9,7 @@
 ;;; Copyright © 2020 Mark Wielaard <mark@klomp.org>
 ;;; Copyright © 2020 Michael Rohleder <mike@rohleder.de>
 ;;; Copyright © 2021 Leo Le Bouter <lle-bout@zaclys.net>
+;;; Copyright © 2021 Maxime Devos <maximedevos@telenet.be>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -32,6 +33,7 @@
   #:use-module (guix build-system gnu)
   #:use-module ((guix licenses) #:select (gpl3+ lgpl3+ lgpl2.0+))
   #:use-module (gnu packages)
+  #:use-module (gnu packages autotools)
   #:use-module (gnu packages compression)
   #:use-module (gnu packages documentation)
   #:use-module (gnu packages gcc)
@@ -205,22 +207,36 @@ static analysis of the ELF binaries at hand.")
     (arguments
      `(#:phases
        (modify-phases %standard-phases
-         (replace 'configure
-           (lambda* (#:key outputs #:allow-other-keys)
-             ;; This old `configure' script doesn't support
-             ;; variables passed as arguments.
-             (let ((out (assoc-ref outputs "out")))
-               (setenv "CONFIG_SHELL" (which "bash"))
-               (invoke "./configure"
-                       (string-append "--prefix=" out)
-                       ,@(if (string=? "powerpc64le-linux"
-                                       (%current-system))
-                             '("--host=powerpc64le-unknown-linux-gnu")
-                             '())
-                       ,@(if (string=? "aarch64-linux"
-                                       (%current-system))
-                             '("--host=aarch64-unknown-linux-gnu")
-                             '()))))))))
+         ,(if (%current-target-system)
+              ;; This old 'configure' script doesn't
+              ;; support cross-compilation well. E.g., it fails
+              ;; to find the cross-compiler.
+              `(add-before 'bootstrap 'delete-configure
+                 (lambda _
+                   (delete-file "configure")))
+              `(replace 'configure
+                 ;; This old `configure' script doesn't support
+                 ;; variables passed as arguments. TODO: would
+                 ;; simply regenerating 'configure' work
+                 ;; well enough, even if compiling natively
+                 ;; on powerpc or aarch64?
+                 (lambda* (#:key outputs #:allow-other-keys)
+                   (let ((out (assoc-ref outputs "out")))
+                     (setenv "CONFIG_SHELL" (which "bash"))
+                     (invoke "./configure"
+                             (string-append "--prefix=" out)
+                             ,@(if (string=? "powerpc64le-linux"
+                                             (%current-system))
+                                   '("--host=powerpc64le-unknown-linux-gnu")
+                                   '())
+                             ,@(if (string=? "aarch64-linux"
+                                             (%current-system))
+                                   '("--host=aarch64-unknown-linux-gnu")
+                                   '())))))))))
+    (native-inputs
+     (if (%current-target-system)
+         `(("autoconf" ,autoconf))
+         '()))
     (home-page (string-append "https://web.archive.org/web/20181111033959/"
                               "http://www.mr511.de/software/english.html"))
     (synopsis "ELF object file access library")
M
M
Maxime Devos wrote on 14 Jun 2021 17:39
[PATCH core-updates 35/37] opendht: Correct 'nettle' variable name in inputs.
(address . 49025@debbugs.gnu.org)
dd7bd39200123bd734c2e94ec058f58fe2418ebf.camel@telenet.be
Previously, opendht referred to 'nettle-3.7'.
But nettle-3.7 has been renamed to simply 'nettle'.
So, refer to 'nettle' instead of 'nettle-3.7'.

This should fix recent evaluation failures of core-updates
on ci.guix.gnu.org.

* gnu/packages/networking.scm
(opendht)[inputs]{nettle}: Refer to 'nettle' instead of 'nettle-3.7'.
---
gnu/packages/networking.scm | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
Toggle diff (13 lines)
diff --git a/gnu/packages/networking.scm b/gnu/packages/networking.scm
index 62c4d7a392..6b154067b1 100644
--- a/gnu/packages/networking.scm
+++ b/gnu/packages/networking.scm
@@ -3478,7 +3478,7 @@ and targeted primarily for asynchronous processing of HTTP-requests.")
     (build-system cmake-build-system)
     (inputs
      `(("argon2" ,argon2)
-       ("nettle" ,nettle-3.7)
+       ("nettle" ,nettle)
        ("readline" ,readline)
        ("jsoncpp" ,jsoncpp)
        ("openssl" ,openssl)             ;required for the DHT proxy
M
M
Maxime Devos wrote on 14 Jun 2021 17:39
[PATCH core-updates 31/37] glib: Look up "tzdata" in 'native-inputs', not 'inputs'.
(address . 49025@debbugs.gnu.org)
79799f427dfcc7e916a033e1920d0eeffe5c1f0c.camel@telenet.be
Otherwise, "tzdata" won't be found when cross-compiling
and string-append will complain about types. Alternatively,
"tzdata" could be moved from 'native-inputs' to 'inputs'.

* gnu/packages/glib.scm (glib)[arguments]<#:phases>{pre-check}:
Look up "tzdata" in 'native-inputs', not 'inputs'.
---
gnu/packages/glib.scm | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
Toggle diff (18 lines)
diff --git a/gnu/packages/glib.scm b/gnu/packages/glib.scm
index 244544ea6f..57e8282a89 100644
--- a/gnu/packages/glib.scm
+++ b/gnu/packages/glib.scm
@@ -251,10 +251,11 @@ shared NFS home directories.")
                                  (package-version python)))))
              #t))
          (add-before 'check 'pre-check
-           (lambda* (#:key inputs outputs #:allow-other-keys)
+           (lambda* (#:key native-inputs inputs outputs #:allow-other-keys)
              ;; For tests/gdatetime.c.
              (setenv "TZDIR"
-                     (string-append (assoc-ref inputs "tzdata")
+                     (string-append (assoc-ref (or native-inputs inputs)
+                                               "tzdata")
                                     "/share/zoneinfo"))
              ;; Some tests want write access there.
              (setenv "HOME" (getcwd))
M
M
Maxime Devos wrote on 14 Jun 2021 17:39
[PATCH core-updates 02/37] utils: Define a target-x86-32? and target-x86-64? predicate.
(address . 49025@debbugs.gnu.org)
0e7d032a02bca4bc6d3b3b1a3936f039f7f56da5.camel@telenet.be
* guix/utils.scm (target-x86-32?, target-x86-64?): New predicates.
* tests/utils.scm ("target-x86-32?", "target-x86-64?"): New tests.
---
guix/utils.scm | 20 ++++++++++++++++++++
tests/utils.scm | 23 +++++++++++++++++++++++
2 files changed, 43 insertions(+)
Toggle diff (72 lines)
diff --git a/guix/utils.scm b/guix/utils.scm
index 4ff2602e23..2256ea2ca6 100644
--- a/guix/utils.scm
+++ b/guix/utils.scm
@@ -84,6 +84,8 @@
             package-name->name+version
             target-linux?
             target-mingw?
+            target-x86-32?
+            target-x86-64?
             target-arm32?
             target-aarch64?
             target-arm?
@@ -553,6 +555,24 @@ a character other than '@'."
   (and target
        (string-suffix? "-mingw32" target)))
 
+(define* (target-x86-32? #:optional (target (or (%current-target-system)
+                                                (%current-system))))
+  "Is the architecture of TARGET a variant of Intel's 32-bit architecture
+(IA32)?"
+  ;; Intel also has a 16-bit architecture in the iN86 series, i286
+  ;; (see, e.g. https://en.wikipedia.org/wiki/Intel/808286) so this
+  ;; procedure is not named target-x86?.
+  (or (string-prefix? "i386-" target)
+      (string-prefix? "i486-" target)
+      (string-prefix? "i586-" target)
+      (string-prefix? "i686-" target)))
+
+(define* (target-x86-64? #:optional (target (or (%current-target-system)
+                                                 (%current-system))))
+  "Is the architecture of TARGET a variant of Intel/AMD's 64-bit
+architecture (x86_64)?"
+  (string-prefix? "x86_64-" target))
+
 (define* (target-arm32? #:optional (target (or (%current-target-system)
                                                (%current-system))))
   (string-prefix? "arm" target))
diff --git a/tests/utils.scm b/tests/utils.scm
index 80a0e669a4..92439b5587 100644
--- a/tests/utils.scm
+++ b/tests/utils.scm
@@ -306,6 +306,29 @@ skip these tests."
        '("i686-linux-gnu" "i686-pc-gnu"
          "i686-w64-mingw32")))
 
+(test-equal "target-x86-32?"
+  '(#f #f #f #t #t #t #t #f)
+  ;; These are (according to Wikipedia) two RISC architectures
+  ;; by Intel and presumably not compatible with the x86-32 series.
+  (map target-x86-32?
+       '("i860-gnu" "i960-gnu"
+         ;; This is a 16-bit architecture
+         "i286-gnu"
+         ;; These are part of the x86-32 series.
+         "i386-gnu" "i486-gnu" "i586-gnu" "i686-gnu"
+         ;; Maybe this one will exist some day, but not yet.
+         "i786-gnu")))
+
+(test-equal "target-x86-64?"
+  '(#t #f #f #f)
+  (map target-x86-64?
+       `("x86_64-linux-gnu" "i386-linux-gnu"
+         ;; Just because it includes "64" doesn't make it 64-bit.
+         "aarch64-linux-gnu"
+         ;; Note that (expt 2 109) in decimal notation starts with 64.
+         ;; However, it isn't 32-bit.
+         ,(format #f "x86_~a-linux-gnu" (expt 2 109)))))
+
 (test-end)
 
 (false-if-exception (delete-file temp-file))
M
M
Maxime Devos wrote on 14 Jun 2021 18:04
Re: [bug#49025] [PATCH core-updates 00/37] Support cross-compilation with meson
(address . 49025@debbugs.gnu.org)
b0d2ccc76d79bc67e90ea0a0a662339497f61f08.camel@telenet.be
Maxime Devos schreef op ma 14-06-2021 om 17:22 [+0200]:
Toggle quote (2 lines)
> opendht: Correct 'nettle' variable name in inputs.

This patch is not a cross-compilation fix.
It doesn't belong in this patch series.
Still a fix though. I think it would address
the recent evaluation failures on ci.guix.gnu.org
for core-updates.
-----BEGIN PGP SIGNATURE-----

iI0EABYKADUWIQTB8z7iDFKP233XAR9J4+4iGRcl7gUCYMd+KxccbWF4aW1lZGV2
b3NAdGVsZW5ldC5iZQAKCRBJ4+4iGRcl7lXFAPsHEvub24baznPs/zFry9egH+fC
Y3YIpk3IIsjriiwJwgD/WjLYqKW7IreZCauaMkT+/zB6csqhWkcVKS5hQBrgGgs=
=UBIO
-----END PGP SIGNATURE-----


M
M
Maxime Devos wrote on 14 Jun 2021 17:38
[PATCH core-updates 23/37] readline: Make #:configure-flags a G-expression.
(address . 49025@debbugs.gnu.org)
78483ba71b04fd12db1590219bb39dc50b4dd132.camel@telenet.be
This allos using ungexp and this-package-input later.

* gnu/packages/readline.scm
(readline)[arguments]<#:configure-flags>: Make this a
G-expression.
---
gnu/packages/readline.scm | 25 +++++++++++++------------
1 file changed, 13 insertions(+), 12 deletions(-)
Toggle diff (44 lines)
diff --git a/gnu/packages/readline.scm b/gnu/packages/readline.scm
index b4c91675a4..6cfa24c666 100644
--- a/gnu/packages/readline.scm
+++ b/gnu/packages/readline.scm
@@ -29,6 +29,7 @@
   #:use-module (guix download)
   #:use-module (guix build-system gnu)
   #:use-module (guix utils)
+  #:use-module (guix gexp)
   #:use-module (ice-9 format))
 
 (define (patch-url version seqno)
@@ -76,19 +77,19 @@
     (build-system gnu-build-system)
     (propagated-inputs `(("ncurses" ,ncurses)))
     (arguments `(#:configure-flags
-                 (list (string-append "LDFLAGS=-Wl,-rpath -Wl,"
-                                      (assoc-ref %build-inputs "ncurses")
-                                      "/lib")
+                 ,#~(list (string-append "LDFLAGS=-Wl,-rpath -Wl,"
+                                         (assoc-ref %build-inputs "ncurses")
+                                         "/lib")
 
-                       ;; This test does an 'AC_TRY_RUN', which aborts when
-                       ;; cross-compiling, so provide the correct answer.
-                       ,@(if (%current-target-system)
-                             '("bash_cv_wcwidth_broken=no")
-                             '())
-                       ;; MinGW: ncurses provides the termcap api.
-                       ,@(if (target-mingw?)
-                             '("bash_cv_termcap_lib=ncurses")
-                             '()))
+                          ;; This test does an 'AC_TRY_RUN', which aborts when
+                          ;; cross-compiling, so provide the correct answer.
+                          #$@(if (%current-target-system)
+                                 '("bash_cv_wcwidth_broken=no")
+                                 '())
+                          ;; MinGW: ncurses provides the termcap api.
+                          #$@(if (target-mingw?)
+                                 '("bash_cv_termcap_lib=ncurses")
+                                 '()))
 
                  ,@(if (target-mingw?)
                        ;; MinGW: termcap in ncurses
M
M
Maxime Devos wrote on 14 Jun 2021 17:39
[PATCH core-updates 37/37] meson: Support cross-compilation.
(address . 49025@debbugs.gnu.org)
15c3653940316d32da0c4163c8f07507e6cd1c98.camel@telenet.be
For cross-compilation, meson needs to be passed a
‘cross file’ with information on the architecture,
CPU type, endianness and operating system, and the
name of the cross-compiler binaries.

The new module (guix build meson-configuration) has
some utilities for writing these cross files, used
by 'make-cross-file' in a G-exp. The values for
the cross file are generated by 'make-machine-alist'
and 'make-binaries-alist'.

'make-machine-alist' and 'make-binaries-alist' live
on the host side, such that new architectures and operating
systems can be added without causing rebuilds for old
architectures.

Currently, only GNU/Hurd, GNU/Linux, MinGW, x86-32 and
x86-64 are supported by 'make-machine-alist'. For other
architectures, someone needs to figure out what to
use as ‘CPU type’ first. Only i686-linux-gnu has been
tested.

This has been tested with:

$ ./pre-inst-env guix build glib --target=i686-linux-gnu

on a x86_64-linux system. ‘If it compiles, it should work.’

* guix/build/meson-configuration.scm
(configuration-port): New parameter.
(write-section-header): New procedure.
(write-assignment): New procedure.
(write-assignments): New procedure.
* guix/build-system/meson.scm
(target-hurd?): New predicate.
(make-machine-alist): New procedure.
(make-binaries-alist): New procedure.
(make-cross-file): New procedure.
(meson-cross-build): New procedure.
(lower)[build-inputs]: Add standard cross packages when cross-compiling.
Do not include regular 'inputs' when cross-compiling.
(lower)[host-inputs]: Include 'inputs' when cross-compiling.
(lower)[target-inputs]: Add cross packages when cross-compiling.
(lower)[build]: Call 'meson-cross-build' instead of 'cross-build'
when cross-compiling.
(lower)[target]: Set it.
(lower)[private-keywords]: Do not remove #:target when cross-compiling.
---
Makefile.am | 1 +
guix/build-system/meson.scm | 197 ++++++++++++++++++++++++++---
guix/build/meson-configuration.scm | 71 +++++++++++
3 files changed, 250 insertions(+), 19 deletions(-)
create mode 100644 guix/build/meson-configuration.scm
Toggle diff (325 lines)
diff --git a/Makefile.am b/Makefile.am
index a10e06e5a7..d4bf626fd5 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -234,6 +234,7 @@ MODULES =					\
   guix/build/emacs-utils.scm			\
   guix/build/java-utils.scm			\
   guix/build/lisp-utils.scm			\
+  guix/build/meson-configuration.scm		\
   guix/build/maven/java.scm			\
   guix/build/maven/plugin.scm			\
   guix/build/maven/pom.scm			\
diff --git a/guix/build-system/meson.scm b/guix/build-system/meson.scm
index 5adc0f92c8..1f763af2aa 100644
--- a/guix/build-system/meson.scm
+++ b/guix/build-system/meson.scm
@@ -2,6 +2,7 @@
 ;;; Copyright © 2017 Peter Mikkelsen <petermikkelsen10@gmail.com>
 ;;; Copyright © 2018, 2019 Marius Bakke <mbakke@fastmail.com>
 ;;; Copyright © 2021 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2021 Maxime Devos <maximedevos@telenet.be>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -30,7 +31,8 @@
   #:use-module (guix packages)
   #:use-module (ice-9 match)
   #:export (%meson-build-system-modules
-            meson-build-system))
+            meson-build-system
+            make-cross-file))
 
 ;; Commentary:
 ;;
@@ -40,6 +42,62 @@
 ;;
 ;; Code:
 
+(define (target-hurd? triplet)
+  (and (string-suffix? "-gnu" triplet)
+       (not (string-contains triplet "linux"))))
+
+(define (make-machine-alist triplet)
+  "Make an association list describing what should go into
+the ‘host_machine’ section of the cross file when cross-compiling
+for TRIPLET."
+  `((system . ,(cond ((target-hurd? triplet) "gnu")
+                     ((target-linux? triplet) "linux")
+                     ((target-mingw? triplet) "windows")
+                     (#t (error "meson: unknown operating system"))))
+    (cpu_family . ,(cond ((target-x86-32? triplet) "x86")
+                         ((target-x86-64? triplet) "x86_64")
+                         ((target-arm32? triplet) "arm")
+                         ((target-aarch64? triplet) "aarch64")
+                         ((target-powerpc? triplet)
+                          (if (target-64bit? triplet)
+                              "ppc64"
+                              "ppc"))
+                         (#t (error "meson: unknown architecture"))))
+    (cpu . ,(cond ((target-x86-32? triplet) ; i386, ..., i686
+                   (substring triplet 0 4))
+                  ((target-x86-64? triplet) "x86_64")
+                  (#t (error "meson: unknown CPU"))))
+    (endian . ,(cond ((string-prefix? "powerpc64le-" triplet) "little")
+                     ((string-prefix? "mips64el-" triplet) "little")
+                     ((target-x86-32? triplet) "little")
+                     ((target-x86-64? triplet) "little")
+                     (#t (error "meson: unknown architecture"))))))
+
+(define (make-binaries-alist triplet)
+  "Make an associatoin list describing what should go into
+the ‘binaries’ section of the cross file when cross-compiling for
+TRIPLET."
+  `((c . ,(cc-for-target triplet))
+    (cpp . ,(cxx-for-target triplet))
+    (pkgconfig . ,(pkg-config-for-target triplet))
+    (objcopy . ,(string-append triplet "-objcopy"))
+    (ar . ,(string-append triplet "-ar"))
+    (ld . ,(string-append triplet "-ld"))
+    (strip . ,(string-append triplet "-strip"))))
+
+(define (make-cross-file triplet)
+  (computed-file "cross-file"
+    (with-imported-modules '((guix build meson-configuration))
+      #~(begin
+          (use-modules (guix build meson-configuration))
+          (call-with-output-file #$output
+            (lambda (f)
+              (parameterize ((configuration-port f))
+                (write-section-header "host_machine")
+                (write-assignments '#$(make-machine-alist triplet))
+                (write-section-header "binaries")
+                (write-assignments '#$(make-binaries-alist triplet)))))))))
+
 (define %meson-build-system-modules
   ;; Build-side modules imported by default.
   `((guix build meson-build-system)
@@ -68,24 +126,34 @@
                 #:rest arguments)
   "Return a bag for NAME."
   (define private-keywords
-    `(#:meson #:ninja #:inputs #:native-inputs #:outputs #:target))
-
-  (and (not target) ;; TODO: add support for cross-compilation.
-       (bag
-         (name name)
-         (system system)
-         (build-inputs `(("meson" ,meson)
-                         ("ninja" ,ninja)
-                         ,@native-inputs
-                         ,@inputs
-                         ;; Keep the standard inputs of 'gnu-build-system'.
-                         ,@(standard-packages)))
-         (host-inputs (if source
-                          `(("source" ,source))
-                          '()))
-         (outputs outputs)
-         (build meson-build)
-         (arguments (strip-keyword-arguments private-keywords arguments)))))
+    `(#:meson #:ninja #:inputs #:native-inputs #:outputs
+      ,@(if target
+            '()
+            '(#:target))))
+
+  (bag
+    (name name)
+    (system system) (target target)
+    (build-inputs `(("meson" ,meson)
+                    ("ninja" ,ninja)
+                    ,@native-inputs
+                    ,@(if target '() inputs)
+                    ;; Keep the standard inputs of 'gnu-build-system'.
+                    ,@(if target
+                          (standard-cross-packages target 'host)
+                          '())
+                    ,@(standard-packages)))
+    (host-inputs `(,@(if source
+                         `(("source" ,source))
+                         '())
+                   ,@(if target inputs '())))
+    ;; Keep the standard inputs of 'gnu-buid-system'.
+    (target-inputs (if target
+                       (standard-cross-packages target 'target)
+                       '()))
+    (outputs outputs)
+    (build (if target meson-cross-build meson-build))
+    (arguments (strip-keyword-arguments private-keywords arguments))))
 
 (define* (meson-build name inputs
                       #:key
@@ -161,6 +229,97 @@ has a 'meson.build' file."
                       #:disallowed-references disallowed-references
                       #:guile-for-build guile)))
 
+(define* (meson-cross-build name
+                            #:key
+                            target
+                            build-inputs host-inputs target-inputs
+                            guile source
+                            (outputs '("out"))
+                            (configure-flags ''())
+                            (search-paths '())
+                            (native-search-paths '())
+
+                            (build-type "debugoptimized")
+                            (tests? #f)
+                            (test-target "test")
+                            (glib-or-gtk? #f)
+                            (parallel-build? #t)
+                            (parallel-tests? #f)
+                            (validate-runpath? #t)
+                            (patch-shebangs? #t)
+                            (strip-binaries? #t)
+                            (strip-flags ''("--strip-debug"))
+                            (strip-directories ''("lib" "lib64" "libexec"
+                                                  "bin" "sbin"))
+                            (elf-directories ''("lib" "lib64" "libexec"
+                                                "bin" "sbin"))
+                            (phases '%standard-phases)
+                            (system (%current-system))
+                            (imported-modules %meson-build-system-modules)
+                            (modules '((guix build meson-build-system)
+                                       (guix build utils)))
+                            allowed-references
+                            disallowed-references)
+  "Cross-build SOURCE for TARGET using MESON, and with INPUTS, assuming that
+SOURCE has a 'meson.build' file."
+  (define cross-file
+    (make-cross-file target))
+  (define inputs
+    (if (null? target-inputs)
+        (input-tuples->gexp host-inputs)
+        #~(append #$(input-tuples->gexp host-inputs)
+                  #+(input-tuples->gexp target-inputs))))
+  (define builder
+    (with-imported-modules imported-modules
+      #~(begin
+          (use-modules #$@(sexp->gexp modules))
+
+          (define build-phases
+            #$(let ((phases (if (pair? phases) (sexp->gexp phases) phases)))
+                (if glib-or-gtk?
+                    phases
+                    #~(modify-phases #$phases
+                        (delete 'glib-or-gtk-compile-schemas)
+                        (delete 'glib-or-gtk-wrap)))))
+
+          ;; Do not use 'with-build-variables', as there should be
+          ;; no reason to use %build-inputs and friends.
+          (meson-build #:source #+source
+                       #:system #$system
+                       #:outputs #$(outputs->gexp outputs)
+                       #:inputs #$inputs
+                       #:native-inputs #+(input-tuples->gexp build-inputs)
+                       #:search-paths '#$(sexp->gexp
+                                          (map search-path-specification->sexp
+                                                     search-paths))
+                       #:native-search-paths '#$(sexp->gexp
+                                                 (map search-path-specification->sexp
+                                                      native-search-paths))
+                       #:phases build-phases
+                       #:configure-flags `("--cross-file" #+cross-file
+                                           ,@#$(sexp->gexp configure-flags))
+                       #:build-type #$build-type
+                       #:tests? #$tests?
+                       #:test-target #$test-target
+                       #:parallel-build? #$parallel-build?
+                       #:parallel-tests? #$parallel-tests?
+                       #:validate-runpath? #$validate-runpath?
+                       #:patch-shebangs? #$patch-shebangs?
+                       #:strip-binaries? #$strip-binaries?
+                       #:strip-flags #$(sexp->gexp strip-flags)
+                       #:strip-directories #$(sexp->gexp strip-directories)
+                       #:elf-directories #$(sexp->gexp elf-directories)))))
+
+  (mlet %store-monad ((guile (package->derivation (or guile (default-guile))
+                                                  system #:graft? #f)))
+    (gexp->derivation name builder
+                      #:system system
+                      #:target target
+                      #:substitutable? substitutable?
+                      #:allowed-references allowed-references
+                      #:disallowed-references disallowed-references
+                      #:guile-for-build guile)))
+
 (define meson-build-system
   (build-system
     (name 'meson)
diff --git a/guix/build/meson-configuration.scm b/guix/build/meson-configuration.scm
new file mode 100644
index 0000000000..81b4eaa7e1
--- /dev/null
+++ b/guix/build/meson-configuration.scm
@@ -0,0 +1,71 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2021 Maxime Devos <maximedevos@telenet.be>
+;;;
+;;; This file is part of GNU Guix.
+;;;
+;;; GNU Guix is free software; you can redistribute it and/or modify it
+;;; under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 3 of the License, or (at
+;;; your option) any later version.
+;;;
+;;; GNU Guix is distributed in the hope that it will be useful, but
+;;; WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>.
+
+(define-module (guix build meson-configuration)
+  #:use-module (ice-9 match)
+  #:export (write-section-header write-assignment
+            write-assignments make-machine-alist
+            configuration-port))
+
+;; Commentary:
+;;
+;; Utilities for generating a ‘Cross build definition file’ for
+;; the Meson build system.  Configuration values are currently
+;; never escaped.  In practice this is unlikely to be a problem
+;; in the build environment.
+;;
+;; Code:
+
+(define configuration-port
+  (fluid->parameter (make-unbound-fluid)))
+
+(define (write-section-header section-name)
+  "Write a section header for section named SECTION-NAME
+to the configuration port."
+  (format (configuration-port) "[~a]~%" section-name))
+
+(define (write-assignment key value)
+  "Write an assignment of VALUE to KEY to the configuration
+port.  VALUE must be a string (without any special characters
+such as quotes), a boolean or an integer.  Lists are currently
+not supported"
+  (define port (configuration-port))
+  (match value
+    ((? string?)
+     (format port "~a = '~a'~%" key value))
+    ((? integer?)
+     (format port "~a = ~a~%" key value))
+    (#f
+     (format port "~a = true~%" key))
+    (#t
+     (format port "~a = false~%" key))))
+
+(define* (write-assignments alist)
+  "Write the assignments in ALIST, an association list,
+to the configuration port."
+  (for-each (match-lambda
+              ((key . value)
+               (write-assignment key value)))
+            alist))
+
+(define* (make-machine-alist #:key system cpu-family cpu endian)
+  "Make an association list for the [host_machine] section."
+  `((system . ,system)
+    (cpu-family . ,cpu-family)
+    (cpu . ,cpu)
+    (endian . ,endian)))
M
M
Maxime Devos wrote on 14 Jun 2021 17:38
[PATCH core-updates 15/37] python: Fix reference to input when cross-compiling.
(address . 49025@debbugs.gnu.org)
6248f1f47c912ca357fd1c5f390c9007033dade1.camel@telenet.be
"sitecustomize.py" is a native input, so look it up
in 'native-inputs', not 'inputs'.

* gnu/packages/python.scm (customize-site): Look up "sizecustomize.py"
in 'native-inputs', not 'inputs'.
---
gnu/packages/python.scm | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
Toggle diff (21 lines)
diff --git a/gnu/packages/python.scm b/gnu/packages/python.scm
index fbad0b65b8..f004b8e739 100644
--- a/gnu/packages/python.scm
+++ b/gnu/packages/python.scm
@@ -111,13 +111,14 @@
 
 (define* (customize-site version)
   "Generate a install-sitecustomize.py phase, using VERSION."
-  `(lambda* (#:key inputs outputs #:allow-other-keys)
+  `(lambda* (#:key native-inputs inputs outputs #:allow-other-keys)
      (let* ((out (assoc-ref outputs "out"))
             (site-packages (string-append
                             out "/lib/python"
                             ,(version-major+minor version)
                             "/site-packages"))
-            (sitecustomize.py (assoc-ref inputs "sitecustomize.py"))
+            (sitecustomize.py (assoc-ref (or native-inputs inputs)
+                                         "sitecustomize.py"))
             (dest (string-append site-packages "/sitecustomize.py")))
        (mkdir-p site-packages)
        (copy-file sitecustomize.py dest)
M
M
Maxime Devos wrote on 14 Jun 2021 17:39
[PATCH core-updates 32/37] tk: Make #:configure-flags a G-expression.
(address . 49025@debbugs.gnu.org)
d778346c58c8692861270b75d08d24081a5093c2.camel@telenet.be
This allows using #$(this-package-input ...) later.

* gnu/packages/tcl.scm (tk)[arguments]<#:configure-flags>: Make
this a G-expression instead of an S-expression.
---
gnu/packages/tcl.scm | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
Toggle diff (25 lines)
diff --git a/gnu/packages/tcl.scm b/gnu/packages/tcl.scm
index 5fccfa5da9..c87a8187f2 100644
--- a/gnu/packages/tcl.scm
+++ b/gnu/packages/tcl.scm
@@ -230,15 +230,16 @@ X11 GUIs.")
                                           "/lib -lfontconfig")))))))
 
        #:configure-flags
+       ,#~
        (list (string-append "--with-tcl="
                             (assoc-ref %build-inputs "tcl")
                             "/lib")
              ;; This is needed when cross-compiling, see:
              ;; https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=719247
-             ,@(if (%current-target-system)
-                   '("tcl_cv_strtod_buggy=1"
-                     "ac_cv_func_strtod=yes")
-                   '()))
+             #$@(if (%current-target-system)
+                    #~("tcl_cv_strtod_buggy=1"
+                        "ac_cv_func_strtod=yes")
+                    #~()))
 
        ;; The tests require a running X server, so we just skip them.
        #:tests? #f))
M
M
Maxime Devos wrote on 14 Jun 2021 17:39
[PATCH core-updates 33/37] tk: Do not use %build-inputs when cross-compiling.
(address . 49025@debbugs.gnu.org)
c3f475c569c43a4db3616845e20f92b674901180.camel@telenet.be
%build-inputs does not exists when cross-compiling,
so use #$(this-package-input ...) instead.

* gnu/packages/tcl.scm
(tk)[arguments]<#:configure-flags>: Use 'this-package-input'
instead of '%build-inputs' when cross-compiling.
---
gnu/packages/tcl.scm | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
Toggle diff (23 lines)
diff --git a/gnu/packages/tcl.scm b/gnu/packages/tcl.scm
index c87a8187f2..91ba8bbb3f 100644
--- a/gnu/packages/tcl.scm
+++ b/gnu/packages/tcl.scm
@@ -29,6 +29,7 @@
   #:use-module (guix download)
   #:use-module (guix git-download)
   #:use-module (guix utils)
+  #:use-module (guix gexp)
   #:use-module (guix build-system gnu)
   #:use-module (guix build-system go)
   #:use-module (guix build-system perl)
@@ -232,7 +233,9 @@ X11 GUIs.")
        #:configure-flags
        ,#~
        (list (string-append "--with-tcl="
-                            (assoc-ref %build-inputs "tcl")
+                            #$(if (%current-target-system)
+                                  (this-package-input "tcl")
+                                  #~(assoc-ref %build-inputs "tcl"))
                             "/lib")
              ;; This is needed when cross-compiling, see:
              ;; https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=719247
M
M
Maxime Devos wrote on 14 Jun 2021 17:38
[PATCH core-updates 26/37] bash: Fix cross-compilation build error.
(address . 49025@debbugs.gnu.org)
c176f18a74cedc6dff330b87dea77cce927d9905.camel@telenet.be
%build-inputs does not exist when cross-compiling,
so use this-package-input instead.

* gnu/packages/bash.scm
(bash)[arguments]<#:configure-flags>: Use this-package-input
instead of %build-inputs.
---
gnu/packages/bash.scm | 35 +++++++++++++++++++----------------
1 file changed, 19 insertions(+), 16 deletions(-)
Toggle diff (46 lines)
diff --git a/gnu/packages/bash.scm b/gnu/packages/bash.scm
index b3af873a66..d51ab26bc8 100644
--- a/gnu/packages/bash.scm
+++ b/gnu/packages/bash.scm
@@ -103,22 +103,25 @@ number/base32-hash tuples, directly usable in the 'patch-series' form."
           1))
 
 (define-public bash
-  (let* ((cppflags (string-join '("-DDEFAULT_PATH_VALUE='\"/no-such-path\"'"
-                                  "-DSTANDARD_UTILS_PATH='\"/no-such-path\"'"
-                                  "-DNON_INTERACTIVE_LOGIN_SHELLS"
-                                  "-DSSH_SOURCE_BASHRC")
-                                " "))
-         (configure-flags
-          #~`("--with-installed-readline"
-              ,#$(string-append "CPPFLAGS=" cppflags)
-              ,(string-append
-                "LDFLAGS=-Wl,-rpath -Wl,"
-                (assoc-ref %build-inputs "readline")
-                "/lib"
-                " -Wl,-rpath -Wl,"
-                (assoc-ref %build-inputs "ncurses")
-                "/lib")))
-         (version "5.1"))
+  (let ((cppflags (string-join '("-DDEFAULT_PATH_VALUE='\"/no-such-path\"'"
+                                 "-DSTANDARD_UTILS_PATH='\"/no-such-path\"'"
+                                 "-DNON_INTERACTIVE_LOGIN_SHELLS"
+                                 "-DSSH_SOURCE_BASHRC")
+                               " "))
+        (version "5.1"))
+    ;; Delay expansion to inside a lexical environment
+    ;; where this-package is bound.
+    (define-syntax configure-flags
+      (identifier-syntax
+       #~`("--with-installed-readline"
+           ,#$(string-append "CPPFLAGS=" cppflags)
+           ,(string-append
+             "LDFLAGS=-Wl,-rpath -Wl,"
+             ;; %build-inputs does not exist when cross-compiling,
+             ;; so use this-package-input instead.
+             #$(file-append (this-package-input "readline") "/lib")
+             " -Wl,-rpath -Wl,"
+             #$(file-append (this-package-input "ncurses") "/lib")))))
     (package
      (name "bash")
      (source (origin
M
M
Mathieu Othacehe wrote on 18 Jun 2021 09:55
Re: bug#49025: [PATCH core-updates 00/37] Support cross-compilation with meson
(name . Maxime Devos)(address . maximedevos@telenet.be)(address . 49025@debbugs.gnu.org)
87k0mrd2tu.fsf@gnu.org
Hello Maxime,

I had a first look to this patchset, this is awesome work. I like how
you use G-exp in build expressions to fix cross-compilation issues.

I'd like to apply your patches to review them more closely, but I'm
having some troubles applying them from GNUS. Did you use "git
send-email" or another mechanism?

It would also be great if we could manage to have meson cross-compile
binaries for armhf/aarch64. As we do not have many substitutes for those
architectures, being able to cross-compile fully-featured images has
been a goal of mine for many years.

In the meantime, I applied the 35th patch hoping to fix Cuirass
evaluations on the core-updates branch.

Thanks,

Mathieu
M
M
Mathieu Othacehe wrote on 18 Jun 2021 10:01
(name . Maxime Devos)(address . maximedevos@telenet.be)(address . 49025@debbugs.gnu.org)
87czsjd2jy.fsf@gnu.org
Toggle quote (3 lines)
> In the meantime, I applied the 35th patch hoping to fix Cuirass
> evaluations on the core-updates branch.

Turns out it is already fixed by
b4ad57ae3e5249ee7402b2ab3c41104ce9c01529 and core-updates evaluations
are still broken :(.

Mathieu
L
L
Ludovic Courtès wrote on 18 Jun 2021 14:32
(name . Mathieu Othacehe)(address . othacehe@gnu.org)
87k0mrfj4k.fsf_-_@gnu.org
Hi,

Mathieu Othacehe <othacehe@gnu.org> skribis:

Toggle quote (4 lines)
> I'd like to apply your patches to review them more closely, but I'm
> having some troubles applying them from GNUS. Did you use "git
> send-email" or another mechanism?

Patches are attached, which makes it a bit trickier to apply them.
Unfortunately mumi seems to be unable to extract them via URLs like

Ludo’.
M
M
Maxime Devos wrote on 18 Jun 2021 16:58
(name . Mathieu Othacehe)(address . othacehe@gnu.org)(address . 49025@debbugs.gnu.org)
c0d5836ef4039b110ad461dc30eb6b4248bb9bf2.camel@telenet.be
Mathieu Othacehe schreef op vr 18-06-2021 om 09:55 [+0200]:
Toggle quote (9 lines)
> Hello Maxime,
>
> I had a first look to this patchset, this is awesome work. I like how
> you use G-exp in build expressions to fix cross-compilation issues.
>
> I'd like to apply your patches to review them more closely, but I'm
> having some troubles applying them from GNUS. Did you use "git
> send-email" or another mechanism?

Some combination of "git send-email", "git format-patch --stdout --attach origin",
"git imap-send", manually fixing "References", "In-Reply-To" and "To" headers,
moving the mails to the ‘outbox’ of the e-mail client, trying to
flush the outbox, which didn't do anything and opening the mails in the outbox and
sending them individually.

I'll resend the patches with "git send-email", as a v2 (but the content is
identical).

Toggle quote (3 lines)
> It would also be great if we could manage to have meson cross-compile
> binaries for armhf/aarch64. [...

I was thinking of cross-compiling of cross-compiling for the Hurd.
The glib-or-gtk-build-system would need cross-building support as well,
but it's ‘merely’ a variant of gnu-build-system with two extra phases,
so that should be easy.

Greetings,
Maxime.
-----BEGIN PGP SIGNATURE-----

iI0EABYKADUWIQTB8z7iDFKP233XAR9J4+4iGRcl7gUCYMy0eRccbWF4aW1lZGV2
b3NAdGVsZW5ldC5iZQAKCRBJ4+4iGRcl7s42AQDBEx4oNLZzj6Q3QMYRXLlsG57/
0Ld4GJEPY2AVmnuIzwD/Rj2ewE6Niqbz0F4bDH4ukEyI4UBD6mXFFf99Cs3M8QI=
=vGbw
-----END PGP SIGNATURE-----


M
M
Maxime Devos wrote on 18 Jun 2021 18:09
[[PATCH v2 core-updates] 01/37] utils: Define target-linux? predicate.
(address . 49025@debbugs.gnu.org)
20210618160936.18972-1-maximedevos@telenet.be
* guix/utils.scm (target-linux?): New predicate.
* tests/utils.scm
("target-linux?"): Test it.
("target-mingw?"): Also test ‘target-mingw?’.
---
guix/utils.scm | 6 ++++++
tests/utils.scm | 17 +++++++++++++++++
2 files changed, 23 insertions(+)

Toggle diff (68 lines)
diff --git a/guix/utils.scm b/guix/utils.scm
index 19990ceb8a..4ff2602e23 100644
--- a/guix/utils.scm
+++ b/guix/utils.scm
@@ -11,6 +11,7 @@
 ;;; Copyright © 2020 Maxim Cournoyer <maxim.cournoyer@gmail.com>
 ;;; Copyright © 2021 Simon Tournier <zimon.toutoune@gmail.com>
 ;;; Copyright © 2021 Chris Marusich <cmmarusich@gmail.com>
+;;; Copyright © 2021 Maxime Devos <maximedevos@telenet.be>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -81,6 +82,7 @@
             %current-system
             %current-target-system
             package-name->name+version
+            target-linux?
             target-mingw?
             target-arm32?
             target-aarch64?
@@ -543,6 +545,10 @@ a character other than '@'."
     (idx (values (substring spec 0 idx)
                  (substring spec (1+ idx))))))
 
+(define* (target-linux? #:optional (target (or (%current-target-system)
+                                               (%current-system))))
+  (string-contains target "linux"))
+
 (define* (target-mingw? #:optional (target (%current-target-system)))
   (and target
        (string-suffix? "-mingw32" target)))
diff --git a/tests/utils.scm b/tests/utils.scm
index 7fcbb25552..80a0e669a4 100644
--- a/tests/utils.scm
+++ b/tests/utils.scm
@@ -3,6 +3,7 @@
 ;;; Copyright © 2014 Eric Bavier <bavier@member.fsf.org>
 ;;; Copyright © 2016 Mathieu Lirzin <mthl@gnu.org>
 ;;; Copyright © 2021 Simon Tournier <zimon.toutoune@gmail.com>
+;;; Copyright © 2021 Maxime Devos <maximedevos@telenet.be>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -289,6 +290,22 @@ skip these tests."
    (string-closest "hello" '("kikoo" "helo" "hihihi" "halo"))
    (string-closest "hello" '("aaaaa" "12345" "hellohello" "h"))))
 
+(test-equal "target-linux?"
+  '(#t #f #f #t)
+  (map (compose ->bool target-linux?)
+       '("i686-linux-gnu" "i686-w64-mingw32"
+         ;; Checking that "gnu" is present is not sufficient,
+         ;; as GNU/Hurd exists.
+         "i686-pc-gnu"
+         ;; Some targets have a suffix.
+         "arm-linux-gnueabihf")))
+
+(test-equal "target-mingw?"
+  '(#f #f #t)
+  (map (compose ->bool target-mingw?)
+       '("i686-linux-gnu" "i686-pc-gnu"
+         "i686-w64-mingw32")))
+
 (test-end)
 
 (false-if-exception (delete-file temp-file))
-- 
2.32.0
M
M
Maxime Devos wrote on 18 Jun 2021 18:09
[[PATCH v2 core-updates] 02/37] utils: Define a target-x86-32? and target-x86-64? predicate.
(address . 49025@debbugs.gnu.org)
20210618160936.18972-2-maximedevos@telenet.be
* guix/utils.scm (target-x86-32?, target-x86-64?): New predicates.
* tests/utils.scm ("target-x86-32?", "target-x86-64?"): New tests.
---
guix/utils.scm | 20 ++++++++++++++++++++
tests/utils.scm | 23 +++++++++++++++++++++++
2 files changed, 43 insertions(+)

Toggle diff (74 lines)
diff --git a/guix/utils.scm b/guix/utils.scm
index 4ff2602e23..2256ea2ca6 100644
--- a/guix/utils.scm
+++ b/guix/utils.scm
@@ -84,6 +84,8 @@
             package-name->name+version
             target-linux?
             target-mingw?
+            target-x86-32?
+            target-x86-64?
             target-arm32?
             target-aarch64?
             target-arm?
@@ -553,6 +555,24 @@ a character other than '@'."
   (and target
        (string-suffix? "-mingw32" target)))
 
+(define* (target-x86-32? #:optional (target (or (%current-target-system)
+                                                (%current-system))))
+  "Is the architecture of TARGET a variant of Intel's 32-bit architecture
+(IA32)?"
+  ;; Intel also has a 16-bit architecture in the iN86 series, i286
+  ;; (see, e.g. https://en.wikipedia.org/wiki/Intel/808286) so this
+  ;; procedure is not named target-x86?.
+  (or (string-prefix? "i386-" target)
+      (string-prefix? "i486-" target)
+      (string-prefix? "i586-" target)
+      (string-prefix? "i686-" target)))
+
+(define* (target-x86-64? #:optional (target (or (%current-target-system)
+                                                 (%current-system))))
+  "Is the architecture of TARGET a variant of Intel/AMD's 64-bit
+architecture (x86_64)?"
+  (string-prefix? "x86_64-" target))
+
 (define* (target-arm32? #:optional (target (or (%current-target-system)
                                                (%current-system))))
   (string-prefix? "arm" target))
diff --git a/tests/utils.scm b/tests/utils.scm
index 80a0e669a4..92439b5587 100644
--- a/tests/utils.scm
+++ b/tests/utils.scm
@@ -306,6 +306,29 @@ skip these tests."
        '("i686-linux-gnu" "i686-pc-gnu"
          "i686-w64-mingw32")))
 
+(test-equal "target-x86-32?"
+  '(#f #f #f #t #t #t #t #f)
+  ;; These are (according to Wikipedia) two RISC architectures
+  ;; by Intel and presumably not compatible with the x86-32 series.
+  (map target-x86-32?
+       '("i860-gnu" "i960-gnu"
+         ;; This is a 16-bit architecture
+         "i286-gnu"
+         ;; These are part of the x86-32 series.
+         "i386-gnu" "i486-gnu" "i586-gnu" "i686-gnu"
+         ;; Maybe this one will exist some day, but not yet.
+         "i786-gnu")))
+
+(test-equal "target-x86-64?"
+  '(#t #f #f #f)
+  (map target-x86-64?
+       `("x86_64-linux-gnu" "i386-linux-gnu"
+         ;; Just because it includes "64" doesn't make it 64-bit.
+         "aarch64-linux-gnu"
+         ;; Note that (expt 2 109) in decimal notation starts with 64.
+         ;; However, it isn't 32-bit.
+         ,(format #f "x86_~a-linux-gnu" (expt 2 109)))))
+
 (test-end)
 
 (false-if-exception (delete-file temp-file))
-- 
2.32.0
M
M
Maxime Devos wrote on 18 Jun 2021 18:09
[[PATCH v2 core-updates] 03/37] packages: Define this-package-input and this-package-native-input.
(address . 49025@debbugs.gnu.org)
20210618160936.18972-3-maximedevos@telenet.be
These macros are intended to be used in build phases.
More precisely, (assoc-ref %build-inputs "input") can be
replaced by #$(this-package-input "input") or #+(this-package-native-input
"native-input") as appropriate.

* guix/packages.scm
(package-input, package-native-input): New (unexported) procedures.
(this-package-input, this-package-native-input): New macros.
---
guix/packages.scm | 29 +++++++++++++++++++++++++++++
tests/packages.scm | 34 ++++++++++++++++++++++++++++++++++
2 files changed, 63 insertions(+)

Toggle diff (101 lines)
diff --git a/guix/packages.scm b/guix/packages.scm
index a66dbea1b7..80c8bbebf0 100644
--- a/guix/packages.scm
+++ b/guix/packages.scm
@@ -108,6 +108,9 @@
             deprecated-package
             package-field-location
 
+            this-package-input
+            this-package-native-input
+
             package-direct-sources
             package-transitive-sources
             package-direct-inputs
@@ -513,6 +516,32 @@ object."
         #f)))
     (_ #f)))
 
+(define (package-input package name)
+  "Return the package input NAME of PACKAGE--i.e., an input
+from the ‘inputs’ or ‘propagated-inputs’ field.  Native inputs are not
+considered.  If this input does not exist, return #f instead."
+  (and=> (or (assoc-ref (package-inputs package) name)
+             (assoc-ref (package-propagated-inputs package) name))
+         car))
+
+(define (package-native-input package name)
+  "Return the native package input NAME of PACKAGE--i.e., an input
+from the ‘native-inputs’ field. If this native input does not exist,
+return #f instead."
+  (and=> (assoc-ref (package-native-inputs package) name)
+         car))
+
+(define-syntax-rule (this-package-input name)
+  "Return the input NAME of the package being defined--i.e., an input
+from the ‘inputs’ or ‘propagated-inputs’ field.  Native inputs are not
+considered.  If this input does not exist, return #f instead."
+  (package-input this-package name))
+
+(define-syntax-rule (this-package-native-input name)
+  "Return the native package input NAME of the package being defined--i.e.,
+an input from the ‘native-inputs’ field.  If this native input does not
+exist, return #f instead."
+  (package-native-input this-package name))
 
 ;; Error conditions.
 
diff --git a/tests/packages.scm b/tests/packages.scm
index 47d10af5bc..91ec38e4cc 100644
--- a/tests/packages.scm
+++ b/tests/packages.scm
@@ -2,6 +2,7 @@
 ;;; Copyright © 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
 ;;; Copyright © 2021 Maxim Cournoyer <maxim.cournoyer@gmail.com>
+;;; Copyright © 2021 Maxime Devos <maximedevos@telenet.be>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -1851,6 +1852,39 @@
   (package-location (specification->package "guile@2"))
   (specification->location "guile@2"))
 
+(test-eq "this-package-input, exists"
+  hello
+  (package-arguments
+   (dummy-package "a"
+     (inputs `(("hello" ,hello)))
+     (arguments (this-package-input "hello")))))
+
+(test-eq "this-package-input, exists in propagated-inputs"
+  hello
+  (package-arguments
+   (dummy-package "a"
+     (propagated-inputs `(("hello" ,hello)))
+     (arguments (this-package-input "hello")))))
+
+(test-eq "this-package-input, does not exist"
+  #f
+  (package-arguments
+   (dummy-package "a"
+     (arguments (this-package-input "hello")))))
+
+(test-eq "this-package-native-input, exists"
+  hello
+  (package-arguments
+   (dummy-package "a"
+     (native-inputs `(("hello" ,hello)))
+     (arguments (this-package-native-input "hello")))))
+
+(test-eq "this-package-native-input, does not exists"
+  #f
+  (package-arguments
+   (dummy-package "a"
+     (arguments (this-package-native-input "hello")))))
+
 (test-end "packages")
 
 ;;; Local Variables:
-- 
2.32.0
M
M
Maxime Devos wrote on 18 Jun 2021 18:09
[[PATCH v2 core-updates] 04/37] net-base: Make #:builder argument a G-expression.
(address . 49025@debbugs.gnu.org)
20210618160936.18972-4-maximedevos@telenet.be
This allows using ungexp-native and this-package-native-input later.

* gnu/packages/admin.scm (net-base)[arguments]{#:builder}: Make this
a G-expression.
---
gnu/packages/admin.scm | 39 ++++++++++++++++++++-------------------
1 file changed, 20 insertions(+), 19 deletions(-)

Toggle diff (59 lines)
diff --git a/gnu/packages/admin.scm b/gnu/packages/admin.scm
index 531686fdbb..5c7e41f51b 100644
--- a/gnu/packages/admin.scm
+++ b/gnu/packages/admin.scm
@@ -74,6 +74,7 @@
   #:use-module ((guix licenses) #:prefix license:)
   #:use-module (guix packages)
   #:use-module (guix utils)
+  #:use-module (guix gexp)
   #:use-module (gnu packages)
   #:use-module (gnu packages algebra)
   #:use-module (gnu packages autogen)
@@ -936,25 +937,25 @@ to allow automatic login and starting any app.")
     (build-system trivial-build-system)
     (arguments
      `(#:modules ((guix build utils))
-       #:builder (begin
-                   (use-modules (guix build utils)
-                                (srfi srfi-26))
-
-                   (let* ((source (assoc-ref %build-inputs "source"))
-                          (tar    (assoc-ref %build-inputs "tar"))
-                          (xz     (assoc-ref %build-inputs "xz"))
-                          (output (assoc-ref %outputs "out"))
-                          (etc    (string-append output "/etc")))
-                     (setenv "PATH" (string-append xz "/bin"))
-                     (invoke (string-append tar "/bin/tar") "xvf"
-                             source)
-                     (chdir ,(string-append "netbase-" version))
-                     (mkdir-p etc)
-                     (for-each copy-file
-                               '("etc-services" "etc-protocols" "etc-rpc")
-                               (map (cut string-append etc "/" <>)
-                                    '("services" "protocols" "rpc")))
-                     #t))))
+       #:builder ,#~(begin
+                      (use-modules (guix build utils)
+                                   (srfi srfi-26))
+
+                      (let* ((source (assoc-ref %build-inputs "source"))
+                             (tar    (assoc-ref %build-inputs "tar"))
+                             (xz     (assoc-ref %build-inputs "xz"))
+                             (output (assoc-ref %outputs "out"))
+                             (etc    (string-append output "/etc")))
+                        (setenv "PATH" (string-append xz "/bin"))
+                        (invoke (string-append tar "/bin/tar") "xvf"
+                                source)
+                        (chdir #$(string-append "netbase-" version))
+                        (mkdir-p etc)
+                        (for-each copy-file
+                                  '("etc-services" "etc-protocols" "etc-rpc")
+                                  (map (cut string-append etc "/" <>)
+                                       '("services" "protocols" "rpc")))
+                        #t))))
     (native-inputs `(("tar" ,tar)
                      ("xz" ,xz)))
     (synopsis "IANA protocol, port, and RPC number assignments")
-- 
2.32.0
M
M
Maxime Devos wrote on 18 Jun 2021 18:09
[[PATCH v2 core-updates] 05/37] net-base: Fix cross-compilation, eliminating %build-inputs & friends
(address . 49025@debbugs.gnu.org)
20210618160936.18972-5-maximedevos@telenet.be
"source" is not in %build-inputs when cross-compiling, so another
approach for referring to the package source code is needed.

* gnu/packages/admin.scm (net-base)[arguments]<#:builder>: Eliminate
%build-inputs and %outputs.
---
gnu/packages/admin.scm | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)

Toggle diff (21 lines)
diff --git a/gnu/packages/admin.scm b/gnu/packages/admin.scm
index 5c7e41f51b..f499a1252b 100644
--- a/gnu/packages/admin.scm
+++ b/gnu/packages/admin.scm
@@ -941,10 +941,10 @@ to allow automatic login and starting any app.")
                       (use-modules (guix build utils)
                                    (srfi srfi-26))
 
-                      (let* ((source (assoc-ref %build-inputs "source"))
-                             (tar    (assoc-ref %build-inputs "tar"))
-                             (xz     (assoc-ref %build-inputs "xz"))
-                             (output (assoc-ref %outputs "out"))
+                      (let* ((source #+(package-source this-package))
+                             (tar    #+(this-package-native-input "tar"))
+                             (xz     #+(this-package-native-input "xz"))
+                             (output #$output)
                              (etc    (string-append output "/etc")))
                         (setenv "PATH" (string-append xz "/bin"))
                         (invoke (string-append tar "/bin/tar") "xvf"
-- 
2.32.0
M
M
Maxime Devos wrote on 18 Jun 2021 18:09
[[PATCH v2 core-updates] 06/37] net-base: Don't cross-compile.
(address . 49025@debbugs.gnu.org)
20210618160936.18972-6-maximedevos@telenet.be
net-base is pure data, so cross-compiling is pointless.

* gnu/packages/admin.scm
(net-base)[arguments]<#:target>: Set to #f.
(net-base)[arguments]<#:allowed-references>: Disallow all
references.
---
gnu/packages/admin.scm | 5 +++++
1 file changed, 5 insertions(+)

Toggle diff (18 lines)
diff --git a/gnu/packages/admin.scm b/gnu/packages/admin.scm
index f499a1252b..5e41ba9967 100644
--- a/gnu/packages/admin.scm
+++ b/gnu/packages/admin.scm
@@ -937,6 +937,11 @@ to allow automatic login and starting any app.")
     (build-system trivial-build-system)
     (arguments
      `(#:modules ((guix build utils))
+       ;; This package consists solely of architecture-independent
+       ;; tables. Cross-compilation is pointless! Make sure we'll
+       ;; always get the same derivation.
+       #:target #f
+       #:allowed-references ()
        #:builder ,#~(begin
                       (use-modules (guix build utils)
                                    (srfi srfi-26))
-- 
2.32.0
M
M
Maxime Devos wrote on 18 Jun 2021 18:09
[[PATCH v2 core-updates] 07/37] tzdata: Don't bother with cross-compiling.
(address . 49025@debbugs.gnu.org)
20210618160936.18972-7-maximedevos@telenet.be
The time zone database is architecture-independent,
so trying to cross-compile it is pointless!

* gnu/packages/base.scm
(tzdata)[arguments]<#:target>: Set to #f.
(tzdata)[allowed-references]: Only include the "out" output itself,
to make sure no (architecture-dependent) binaries are installed.
---
gnu/packages/base.scm | 9 +++++++++
1 file changed, 9 insertions(+)

Toggle diff (29 lines)
diff --git a/gnu/packages/base.scm b/gnu/packages/base.scm
index d30299a7b6..2674be8048 100644
--- a/gnu/packages/base.scm
+++ b/gnu/packages/base.scm
@@ -17,6 +17,7 @@
 ;;; Copyright © 2020 Vitaliy Shatrov <D0dyBo0D0dyBo0@protonmail.com>
 ;;; Copyright © 2020 Chris Marusich <cmmarusich@gmail.com>
 ;;; Copyright © 2021 Leo Le Bouter <lle-bout@zaclys.net>
+;;; Copyright © 2021 Maxime Devos <maximedevos@telenet.be>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -1251,6 +1252,14 @@ command.")
     (build-system gnu-build-system)
     (arguments
      `(#:tests? #f
+       ;; This consists purely of (architecture-independent) data,
+       ;; so ‘cross-compilation’ is pointless here!
+       ;; (The binaries zic, dump, and tzselect are deleted in the post-install
+       ;; phase.)
+       #:target #f
+       ;; share/zoneinfo/posix is a symlink to share/zoneinfo,
+       ;; so include the package itself in #:allowed-references.
+       #:allowed-references ("out")
        #:make-flags (let ((out (assoc-ref %outputs "out"))
                           (tmp (getenv "TMPDIR")))
                       (list (string-append "TOPDIR=" out)
-- 
2.32.0
M
M
Maxime Devos wrote on 18 Jun 2021 18:09
[[PATCH v2 core-updates] 08/37] libgpg-error: Remove trailing #f from phases.
(address . 49025@debbugs.gnu.org)
20210618160936.18972-8-maximedevos@telenet.be
These aren't required anymore.

* gnu/packages/gnupg.scm (libgpgerror)[arguments]{cross-symlinks}:
Remove trailing #f.
---
gnu/packages/gnupg.scm | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)

Toggle diff (16 lines)
diff --git a/gnu/packages/gnupg.scm b/gnu/packages/gnupg.scm
index cb481b38e1..2f44e6ec6a 100644
--- a/gnu/packages/gnupg.scm
+++ b/gnu/packages/gnupg.scm
@@ -114,8 +114,7 @@
                            (string-append x "-unknown-linux-gnu")))))
                    (symlink
                     (string-append "lock-obj-pub." triplet ".h")
-                    "src/syscfg/lock-obj-pub.linux-gnu.h"))
-                 #t))))
+                    "src/syscfg/lock-obj-pub.linux-gnu.h"))))))
          '()))
     (native-inputs `(("gettext" ,gettext-minimal)))
     (home-page "https://gnupg.org")
-- 
2.32.0
M
M
Maxime Devos wrote on 18 Jun 2021 18:09
[[PATCH v2 core-updates] 09/37] libgpg-error: Prevent silent miscompilation some systems.
(address . 49025@debbugs.gnu.org)
20210618160936.18972-9-maximedevos@telenet.be
* gnu/packages/gpg.scm
(libgpgerror)[arguments]<#:phases>{cross-symlinks}: Only
link to src/syscfg/lock-obj-pub.linux-gnu.h if the package
is being compiled for a Linux target. Do not link either
if the architecture is unknown, as the headers vary with
the architecture.
---
gnu/packages/gnupg.scm | 40 ++++++++++++++++++++++++++--------------
1 file changed, 26 insertions(+), 14 deletions(-)

Toggle diff (74 lines)
diff --git a/gnu/packages/gnupg.scm b/gnu/packages/gnupg.scm
index 2f44e6ec6a..de213d381f 100644
--- a/gnu/packages/gnupg.scm
+++ b/gnu/packages/gnupg.scm
@@ -18,6 +18,7 @@
 ;;; Copyright © 2018 Björn Höfling <bjoern.hoefling@bjoernhoefling.de>
 ;;; Copyright © 2019 Mathieu Othacehe <m.othacehe@gmail.com>
 ;;; Copyright © 2020 Fredrik Salomonsson <plattfot@posteo.net>
+;;; Copyright © 2021 Maxime Devos <maximedevos@telenet.be>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -77,6 +78,7 @@
   #:use-module (guix build-system gnu)
   #:use-module (guix build-system perl)
   #:use-module (guix build-system python)
+  #:use-module (ice-9 match)
   #:use-module (srfi srfi-1))
 
 (define-public libgpg-error
@@ -94,27 +96,37 @@
     (build-system gnu-build-system)
     (arguments
      (if (%current-target-system)
-         `(#:modules ((ice-9 match)
-                      (guix build gnu-build-system)
+         `(#:modules ((guix build gnu-build-system)
                       (guix build utils))
            #:phases
            (modify-phases %standard-phases
              ;; When cross-compiling, some platform specific properties cannot
              ;; be detected. Create a symlink to the appropriate platform
-             ;; file. See Cross-Compiling section at:
+             ;; file if required. Note that these platform files depend on
+             ;; both the operating system and architecture!
+             ;;
+             ;; See Cross-Compiling section at:
              ;; https://github.com/gpg/libgpg-error/blob/master/README
              (add-after 'unpack 'cross-symlinks
-               (lambda* (#:key target inputs #:allow-other-keys)
-                 (let ((triplet
-                        (match (string-take target
-                                            (string-index target #\-))
-                          ("armhf" "arm-unknown-linux-gnueabi")
-                          ("mips64el" "mips-unknown-linux-gnu")
-                          (x
-                           (string-append x "-unknown-linux-gnu")))))
-                   (symlink
-                    (string-append "lock-obj-pub." triplet ".h")
-                    "src/syscfg/lock-obj-pub.linux-gnu.h"))))))
+               (lambda _
+                 (define (link triplet source)
+                   (symlink (string-append "lock-obj-pub." triplet ".h")
+                            (string-append "src/syscfg/lock-obj-pub."
+                                           source ".h")))
+                 ,(let* ((target (%current-target-system))
+                         (architecture
+                          (string-take target (string-index target #\-))))
+                    (cond ((target-linux? target)
+                           (match architecture
+                             ("armhf"
+                              `(link "arm-unknown-linux-gnueabi" "linux-gnu"))
+                             ("mips64el"
+                              `(link "mips-unknown-linux-gnu" "linux-gnu"))
+                             ;; Don't always link to the "linux-gnu"
+                             ;; configuration, as this is not correct for
+                             ;; all architectures.
+                             (_ #t)))
+                          (#t #t)))))))
          '()))
     (native-inputs `(("gettext" ,gettext-minimal)))
     (home-page "https://gnupg.org")
-- 
2.32.0
M
M
Maxime Devos wrote on 18 Jun 2021 18:09
[[PATCH v2 core-updates] 10/37] libgpgerror: Maybe fix a cross-compilation bug.
(address . 49025@debbugs.gnu.org)
20210618160936.18972-10-maximedevos@telenet.be
Previously, a symlink was created at
src/syscfg/lock-obj-pub.linux-gnu.h pointing at
lock-obj-pub.MANGLED-TARGET.h. I would think this has
to be the other way around, but I am not really sure.

* gnu/packages/gnupg.scm
(gnupg)[arguments]<#:phases>{cross-symlinks}(link): Switch
'triplet' and 'source'.
---
gnu/packages/gnupg.scm | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)

Toggle diff (18 lines)
diff --git a/gnu/packages/gnupg.scm b/gnu/packages/gnupg.scm
index de213d381f..f5d4118af9 100644
--- a/gnu/packages/gnupg.scm
+++ b/gnu/packages/gnupg.scm
@@ -110,9 +110,9 @@
              (add-after 'unpack 'cross-symlinks
                (lambda _
                  (define (link triplet source)
-                   (symlink (string-append "lock-obj-pub." triplet ".h")
+                   (symlink (string-append "lock-obj-pub." source ".h")
                             (string-append "src/syscfg/lock-obj-pub."
-                                           source ".h")))
+                                           triplet ".h")))
                  ,(let* ((target (%current-target-system))
                          (architecture
                           (string-take target (string-index target #\-))))
-- 
2.32.0
M
M
Maxime Devos wrote on 18 Jun 2021 18:09
[[PATCH v2 core-updates] 12/37] libgcrypt: Fix cross-compilation build error.
(address . 49025@debbugs.gnu.org)
20210618160936.18972-12-maximedevos@telenet.be
When cross-compiling a package using gnu-build-system,
%build-inputs does not exist. But libgcrypt uses %build-inputs
anyway. Fix it.

* gnu/packages/gnupg.scm
(libgcrypt)[arguments]<#:configure-flags>: Make this a G-exp
instead of a raw S-exp. Eliminate %build-inputs and use
this-package-input instead.
---
gnu/packages/gnupg.scm | 12 +++++++-----
1 file changed, 7 insertions(+), 5 deletions(-)

Toggle diff (32 lines)
diff --git a/gnu/packages/gnupg.scm b/gnu/packages/gnupg.scm
index 1fee30584c..35cfdf6f43 100644
--- a/gnu/packages/gnupg.scm
+++ b/gnu/packages/gnupg.scm
@@ -74,6 +74,7 @@
   #:use-module (guix packages)
   #:use-module (guix download)
   #:use-module (guix utils)
+  #:use-module (guix gexp)
   #:use-module (guix git-download)
   #:use-module (guix build-system gnu)
   #:use-module (guix build-system perl)
@@ -169,11 +170,12 @@ Daemon and possibly more in the future.")
      ;; 'configure' uses 'gpg-error-config' to determine the '-L' flag, and
      ;; the 'gpg-error-config' it runs is the native one---i.e., the wrong one.
      `(#:configure-flags
-       (list (string-append "--with-gpg-error-prefix="
-                            (assoc-ref %build-inputs "libgpg-error-host"))
-             ;; When cross-compiling, _gcry_mpih_lshift etc are undefined
-             ,@(if (%current-target-system) '("--disable-asm")
-                   '()))))
+       ,#~(list (string-append "--with-gpg-error-prefix="
+                               #$(this-package-input "libgpg-error-host"))
+                ;; When cross-compiling, _gcry_mpih_lshift etc are undefined
+                #$@(if (%current-target-system)
+                       #~("--disable-asm")
+                       #~()))))
     (outputs '("out" "debug"))
     (home-page "https://gnupg.org/")
     (synopsis "Cryptographic function library")
-- 
2.32.0
M
M
Maxime Devos wrote on 18 Jun 2021 18:09
[[PATCH v2 core-updates] 13/37] wrap-python3: Make #:builder a G-exp instead of a raw S-exp.
(address . 49025@debbugs.gnu.org)
20210618160936.18972-13-maximedevos@telenet.be
This allows using ungexp later.

* gnu/packages/python.scm (wrap-python3)<#:builder>: Make this
a G-expression.
---
gnu/packages/python.scm | 46 ++++++++++++++++++++---------------------
1 file changed, 23 insertions(+), 23 deletions(-)

Toggle diff (59 lines)
diff --git a/gnu/packages/python.scm b/gnu/packages/python.scm
index b2ec486d7a..9628836567 100644
--- a/gnu/packages/python.scm
+++ b/gnu/packages/python.scm
@@ -573,29 +573,29 @@ for more information.")))
     (arguments
      `(#:modules ((guix build utils))
        #:builder
-         (begin
-           (use-modules (guix build utils))
-           (let ((bin (string-append (assoc-ref %outputs "out") "/bin"))
-                 (python (string-append (assoc-ref %build-inputs "python") "/bin/")))
-                (mkdir-p bin)
-                (for-each
-                  (lambda (old new)
-                    (symlink (string-append python old)
-                             (string-append bin "/" new)))
-                  `("python3" ,"pydoc3" ,"idle3" ,"pip3")
-                  `("python"  ,"pydoc"  ,"idle"  ,"pip"))
-                ;; python-config outputs search paths based upon its location,
-                ;; use a bash wrapper to avoid changing its outputs.
-                (let ((bash (string-append (assoc-ref %build-inputs "bash")
-                                           "/bin/bash"))
-                      (old  (string-append python "python3-config"))
-                      (new  (string-append bin "/python-config")))
-                  (with-output-to-file new
-                    (lambda ()
-                      (format #t "#!~a~%" bash)
-                      (format #t "exec \"~a\" \"$@\"~%" old)
-                      (chmod new #o755)
-                      #t)))))))
+       ,#~(begin
+            (use-modules (guix build utils))
+            (let ((bin (string-append (assoc-ref %outputs "out") "/bin"))
+                  (python (string-append (assoc-ref %build-inputs "python") "/bin/")))
+              (mkdir-p bin)
+              (for-each
+               (lambda (old new)
+                 (symlink (string-append python old)
+                          (string-append bin "/" new)))
+               `("python3" ,"pydoc3" ,"idle3" ,"pip3")
+               `("python"  ,"pydoc"  ,"idle"  ,"pip"))
+              ;; python-config outputs search paths based upon its location,
+              ;; use a bash wrapper to avoid changing its outputs.
+              (let ((bash (string-append (assoc-ref %build-inputs "bash")
+                                         "/bin/bash"))
+                    (old  (string-append python "python3-config"))
+                    (new  (string-append bin "/python-config")))
+                (with-output-to-file new
+                  (lambda ()
+                    (format #t "#!~a~%" bash)
+                    (format #t "exec \"~a\" \"$@\"~%" old)
+                    (chmod new #o755)
+                    #t)))))))
     (synopsis "Wrapper for the Python 3 commands")
     (description
      "This package provides wrappers for the commands of Python@tie{}3.x such
-- 
2.32.0
M
M
Maxime Devos wrote on 18 Jun 2021 18:09
[[PATCH v2 core-updates] 16/37] openssl: Remove trailing #t from phases.
(address . 49025@debbugs.gnu.org)
20210618160936.18972-16-maximedevos@telenet.be
* gnu/packages/tls.scm
(openssl)[arguments]<#:phases>: Delete trailing #t.
---
gnu/packages/tls.scm | 12 ++++--------
1 file changed, 4 insertions(+), 8 deletions(-)

Toggle diff (46 lines)
diff --git a/gnu/packages/tls.scm b/gnu/packages/tls.scm
index 608a7d05b8..5bfc5545db 100644
--- a/gnu/packages/tls.scm
+++ b/gnu/packages/tls.scm
@@ -366,8 +366,7 @@ required structures.")
                            ((string-prefix? "powerpc64" target)
                             "linux-ppc64")
                            ((string-prefix? "powerpc" target)
-                            "linux-ppc")))
-                 #t)))
+                            "linux-ppc"))))))
            '())
         (replace 'configure
           (lambda* (#:key outputs #:allow-other-keys)
@@ -406,8 +405,7 @@ required structures.")
               (for-each (lambda (file)
                           (install-file file slib)
                           (delete-file file))
-                        (find-files lib "\\.a$"))
-              #t)))
+                        (find-files lib "\\.a$")))))
         (add-after 'install 'move-extra-documentation
           (lambda* (#:key outputs #:allow-other-keys)
                ;; Move man3 pages and full HTML documentation to "doc".
@@ -420,8 +418,7 @@ required structures.")
                  (copy-recursively man3 man-target)
                  (delete-file-recursively man3)
                  (copy-recursively html html-target)
-                 (delete-file-recursively html)
-                 #t)))
+                 (delete-file-recursively html))))
         (add-after
          'install 'remove-miscellany
          (lambda* (#:key outputs #:allow-other-keys)
@@ -430,8 +427,7 @@ required structures.")
            (let ((out (assoc-ref outputs "out")))
              (delete-file-recursively (string-append out "/share/openssl-"
                                                      ,(package-version this-package)
-                                                     "/misc"))
-             #t))))))
+                                                     "/misc"))))))))
    (native-search-paths
     (list (search-path-specification
            (variable "SSL_CERT_DIR")
-- 
2.32.0
M
M
Maxime Devos wrote on 18 Jun 2021 18:09
[[PATCH v2 core-updates] 17/37] openssl: Make the #:phases argument a G-expression.
(address . 49025@debbugs.gnu.org)
20210618160936.18972-17-maximedevos@telenet.be
This allows using this-package-native-input later.

* gnu/packages/tls.scm
(openssl)[arguments]<#:phases>: Make this a G-expression.
(openssl-1.0)[arguments]<#:phases>: Likewise.
---
gnu/packages/tls.scm | 42 ++++++++++++++++++++++--------------------
1 file changed, 22 insertions(+), 20 deletions(-)

Toggle diff (124 lines)
diff --git a/gnu/packages/tls.scm b/gnu/packages/tls.scm
index 5bfc5545db..9de9a78e84 100644
--- a/gnu/packages/tls.scm
+++ b/gnu/packages/tls.scm
@@ -38,6 +38,7 @@
   #:use-module (guix download)
   #:use-module (guix git-download)
   #:use-module (guix utils)
+  #:use-module (guix gexp)
   #:use-module (guix build-system gnu)
   #:use-module (guix build-system go)
   #:use-module (guix build-system perl)
@@ -341,9 +342,10 @@ required structures.")
       ;; so we explicitly disallow it here.
       #:disallowed-references ,(list (canonical-package perl))
       #:phases
+      ,#~
       (modify-phases %standard-phases
-       ,@(if (%current-target-system)
-           '((add-before
+       #$@(if (%current-target-system)
+          #~((add-before
                'configure 'set-cross-compile
                (lambda* (#:key target outputs #:allow-other-keys)
                  (setenv "CROSS_COMPILE" (string-append target "-"))
@@ -367,7 +369,7 @@ required structures.")
                             "linux-ppc64")
                            ((string-prefix? "powerpc" target)
                             "linux-ppc"))))))
-           '())
+             #~())
         (replace 'configure
           (lambda* (#:key outputs #:allow-other-keys)
             (let* ((out (assoc-ref outputs "out"))
@@ -377,9 +379,9 @@ required structures.")
                 (("/usr/bin/env")
                  (string-append (assoc-ref %build-inputs "coreutils")
                                 "/bin/env")))
-              (invoke ,@(if (%current-target-system)
-                          '("./Configure")
-                          '("./config"))
+              (invoke #$@(if (%current-target-system)
+                             #~("./Configure")
+                             #~("./config"))
                       "shared"       ;build shared libraries
                       "--libdir=lib"
 
@@ -388,13 +390,13 @@ required structures.")
                       ;; conventional.
                       (string-append "--openssldir=" out
                                      "/share/openssl-"
-                                     ,(package-version this-package))
+                                     #$(package-version this-package))
 
                       (string-append "--prefix=" out)
                       (string-append "-Wl,-rpath," lib)
-                      ,@(if (%current-target-system)
-                          '((getenv "CONFIGURE_TARGET_ARCH"))
-                          '())))))
+                      #$@(if (%current-target-system)
+                             #~((getenv "CONFIGURE_TARGET_ARCH"))
+                             #~())))))
         (add-after 'install 'move-static-libraries
           (lambda* (#:key outputs #:allow-other-keys)
             ;; Move static libraries to the "static" output.
@@ -426,7 +428,7 @@ required structures.")
            ;; scripts.  Remove them to avoid retaining a reference on Perl.
            (let ((out (assoc-ref outputs "out")))
              (delete-file-recursively (string-append out "/share/openssl-"
-                                                     ,(package-version this-package)
+                                                     #$(package-version this-package)
                                                      "/misc"))))))))
    (native-search-paths
     (list (search-path-specification
@@ -471,7 +473,7 @@ required structures.")
        ;; Parallel build is not supported in 1.0.x.
        ((#:parallel-build? _ #f) #f)
        ((#:phases phases)
-        `(modify-phases ,phases
+       #~(modify-phases #$phases
            (add-before 'patch-source-shebangs 'patch-tests
              (lambda* (#:key inputs native-inputs #:allow-other-keys)
                (let ((bash (assoc-ref (or native-inputs inputs) "bash")))
@@ -494,9 +496,9 @@ required structures.")
 	     ;; Override this phase because OpenSSL 1.0 does not understand -rpath.
 	     (lambda* (#:key outputs #:allow-other-keys)
 	       (let ((out (assoc-ref outputs "out")))
-		 (invoke ,@(if (%current-target-system)
-			       '("./Configure")
-			       '("./config"))
+		 (invoke #$@(if (%current-target-system)
+			        #~("./Configure")
+			        #~("./config"))
 			 "shared"                 ;build shared libraries
 			 "--libdir=lib"
 
@@ -504,12 +506,12 @@ required structures.")
 			 ;; PREFIX/ssl.  Change that to something more
 			 ;; conventional.
 			 (string-append "--openssldir=" out
-					"/share/openssl-" ,version)
+					"/share/openssl-" #$version)
 
 			 (string-append "--prefix=" out)
-			 ,@(if (%current-target-system)
-			       '((getenv "CONFIGURE_TARGET_ARCH"))
-			       '())))))
+			 #$@(if (%current-target-system)
+			        '((getenv "CONFIGURE_TARGET_ARCH"))
+			        '())))))
         (delete 'move-extra-documentation)
         (add-after 'install 'move-man3-pages
           (lambda* (#:key outputs #:allow-other-keys)
@@ -534,7 +536,7 @@ required structures.")
                ;; scripts.  Remove them to avoid retaining a reference on Perl.
                (let ((out (assoc-ref outputs "out")))
                  (delete-file-recursively (string-append out "/share/openssl-"
-                                                         ,version "/misc"))
+                                                         #$version "/misc"))
                  #t)))))))))
 
 (define-public libressl
-- 
2.32.0
M
M
Maxime Devos wrote on 18 Jun 2021 18:09
[[PATCH v2 core-updates] 18/37] openssl: Use G-exp machinery for referring to outputs.
(address . 49025@debbugs.gnu.org)
20210618160936.18972-18-maximedevos@telenet.be
This doesn't fix anything broken, just for simplifying
the code a little while we're rebuilding the world anyway.
IMHO this makes the code a little more readable.

* gnu/packages/tls.scm (openssl)[arguments]<#:phases>: Don't refer
to the association list 'outputs', use #$output, #$output:doc
and #$output:static instead.
---
gnu/packages/tls.scm | 28 ++++++++++++++--------------
1 file changed, 14 insertions(+), 14 deletions(-)

Toggle diff (82 lines)
diff --git a/gnu/packages/tls.scm b/gnu/packages/tls.scm
index 9de9a78e84..90211c733d 100644
--- a/gnu/packages/tls.scm
+++ b/gnu/packages/tls.scm
@@ -16,6 +16,7 @@
 ;;; Copyright © 2019 Mathieu Othacehe <m.othacehe@gmail.com>
 ;;; Copyright © 2020 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
 ;;; Copyright © 2020 Maxim Cournoyer <maxim.cournoyer@gmail.com>
+;;; Copyright © 2021 Maxime Devos <maximedevos@telenet.be>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -347,7 +348,7 @@ required structures.")
        #$@(if (%current-target-system)
           #~((add-before
                'configure 'set-cross-compile
-               (lambda* (#:key target outputs #:allow-other-keys)
+               (lambda* (#:key target #:allow-other-keys)
                  (setenv "CROSS_COMPILE" (string-append target "-"))
                  (setenv "CONFIGURE_TARGET_ARCH"
                          (cond
@@ -371,8 +372,8 @@ required structures.")
                             "linux-ppc"))))))
              #~())
         (replace 'configure
-          (lambda* (#:key outputs #:allow-other-keys)
-            (let* ((out (assoc-ref outputs "out"))
+          (lambda _
+            (let* ((out #$output)
                    (lib (string-append out "/lib")))
               ;; It's not a shebang so patch-source-shebangs misses it.
               (substitute* "config"
@@ -398,23 +399,23 @@ required structures.")
                              #~((getenv "CONFIGURE_TARGET_ARCH"))
                              #~())))))
         (add-after 'install 'move-static-libraries
-          (lambda* (#:key outputs #:allow-other-keys)
+          (lambda _
             ;; Move static libraries to the "static" output.
-            (let* ((out    (assoc-ref outputs "out"))
+            (let* ((out    #$output)
                    (lib    (string-append out "/lib"))
-                   (static (assoc-ref outputs "static"))
+                   (static #$output:static)
                    (slib   (string-append static "/lib")))
               (for-each (lambda (file)
                           (install-file file slib)
                           (delete-file file))
                         (find-files lib "\\.a$")))))
         (add-after 'install 'move-extra-documentation
-          (lambda* (#:key outputs #:allow-other-keys)
+          (lambda _
                ;; Move man3 pages and full HTML documentation to "doc".
-               (let* ((out    (assoc-ref outputs "out"))
+               (let* ((out    #$output)
                       (man3   (string-append out "/share/man/man3"))
                       (html (string-append out "/share/doc/openssl"))
-                      (doc    (assoc-ref outputs "doc"))
+                      (doc    #$output:doc)
                       (man-target (string-append doc "/share/man/man3"))
                       (html-target (string-append doc "/share/doc/openssl")))
                  (copy-recursively man3 man-target)
@@ -423,13 +424,12 @@ required structures.")
                  (delete-file-recursively html))))
         (add-after
          'install 'remove-miscellany
-         (lambda* (#:key outputs #:allow-other-keys)
+         (lambda _
            ;; The 'misc' directory contains random undocumented shell and Perl
            ;; scripts.  Remove them to avoid retaining a reference on Perl.
-           (let ((out (assoc-ref outputs "out")))
-             (delete-file-recursively (string-append out "/share/openssl-"
-                                                     #$(package-version this-package)
-                                                     "/misc"))))))))
+           (delete-file-recursively (string-append #$output "/share/openssl-"
+                                                   #$(package-version this-package)
+                                                   "/misc")))))))
    (native-search-paths
     (list (search-path-specification
            (variable "SSL_CERT_DIR")
-- 
2.32.0
M
M
Maxime Devos wrote on 18 Jun 2021 18:09
[[PATCH v2 core-updates] 19/37] openssl: Move documentation instead of copying and deleting it.
(address . 49025@debbugs.gnu.org)
20210618160936.18972-19-maximedevos@telenet.be
* gnu/packages/tls.scm
(openssl)[arguments]<#:phases>{move-extra-documentation}: Use
'rename-file' instead of 'copy-recursively' and
'delete-file-recursively'.
---
gnu/packages/tls.scm | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)

Toggle diff (21 lines)
diff --git a/gnu/packages/tls.scm b/gnu/packages/tls.scm
index 90211c733d..9aa0b5a212 100644
--- a/gnu/packages/tls.scm
+++ b/gnu/packages/tls.scm
@@ -418,10 +418,10 @@ required structures.")
                       (doc    #$output:doc)
                       (man-target (string-append doc "/share/man/man3"))
                       (html-target (string-append doc "/share/doc/openssl")))
-                 (copy-recursively man3 man-target)
-                 (delete-file-recursively man3)
-                 (copy-recursively html html-target)
-                 (delete-file-recursively html))))
+                 (mkdir-p (dirname man3-target))
+                 (mkdir-p (dirname html-target))
+                 (rename-file man3 man-target)
+                 (rename-file html html-target))))
         (add-after
          'install 'remove-miscellany
          (lambda _
-- 
2.32.0
M
M
Maxime Devos wrote on 18 Jun 2021 18:09
[[PATCH v2 core-updates] 20/37] openssl: Move all man pages to separate output, not only man3.
(address . 49025@debbugs.gnu.org)
20210618160936.18972-20-maximedevos@telenet.be
There does not seem to be any reason to only move man3 pages.
So, move all man pages to a separate output for documentation.

* gnu/packages/tls.scm
(openssl)[arguments]<#:phases>{move-extra-documentation}: Move
all man pages, not only man3.
---
gnu/packages/tls.scm | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)

Toggle diff (29 lines)
diff --git a/gnu/packages/tls.scm b/gnu/packages/tls.scm
index 9aa0b5a212..c178806805 100644
--- a/gnu/packages/tls.scm
+++ b/gnu/packages/tls.scm
@@ -411,16 +411,16 @@ required structures.")
                         (find-files lib "\\.a$")))))
         (add-after 'install 'move-extra-documentation
           (lambda _
-               ;; Move man3 pages and full HTML documentation to "doc".
+               ;; Move man pages and full HTML documentation to "doc".
                (let* ((out    #$output)
-                      (man3   (string-append out "/share/man/man3"))
-                      (html (string-append out "/share/doc/openssl"))
+                      (man    (string-append out "/share/man"))
+                      (html   (string-append out "/share/doc/openssl"))
                       (doc    #$output:doc)
-                      (man-target (string-append doc "/share/man/man3"))
+                      (man-target (string-append doc "/share/man"))
                       (html-target (string-append doc "/share/doc/openssl")))
-                 (mkdir-p (dirname man3-target))
+                 (mkdir-p (dirname man-target))
                  (mkdir-p (dirname html-target))
-                 (rename-file man3 man-target)
+                 (rename-file man man-target)
                  (rename-file html html-target))))
         (add-after
          'install 'remove-miscellany
-- 
2.32.0
M
M
Maxime Devos wrote on 18 Jun 2021 18:09
[[PATCH v2 core-updates] 21/37] openssl: Find bin/env when cross-compiling.
(address . 49025@debbugs.gnu.org)
20210618160936.18972-21-maximedevos@telenet.be
%build-inputs does not exist when cross-compiling,
so find bin/env by another way.

* (openssl)[arguments]<#:phases>{configure}: Don't use '%build-inputs',
use 'which' instead.
---
gnu/packages/tls.scm | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)

Toggle diff (20 lines)
diff --git a/gnu/packages/tls.scm b/gnu/packages/tls.scm
index c178806805..a4e754e27f 100644
--- a/gnu/packages/tls.scm
+++ b/gnu/packages/tls.scm
@@ -376,10 +376,10 @@ required structures.")
             (let* ((out #$output)
                    (lib (string-append out "/lib")))
               ;; It's not a shebang so patch-source-shebangs misses it.
+              ;; Don't use (assoc-ref %build-inputs "coreutils"), as
+              ;; %build-inputs is not defined when cross-compiling.
               (substitute* "config"
-                (("/usr/bin/env")
-                 (string-append (assoc-ref %build-inputs "coreutils")
-                                "/bin/env")))
+                (("/usr/bin/env") (which "env")))
               (invoke #$@(if (%current-target-system)
                              #~("./Configure")
                              #~("./config"))
-- 
2.32.0
M
M
Maxime Devos wrote on 18 Jun 2021 18:09
[[PATCH v2 core-updates] 22/37] openssl: Extract logic for computing CONFIGURE_TARGET_ARCH.
(address . 49025@debbugs.gnu.org)
20210618160936.18972-22-maximedevos@telenet.be
By computing this value outside the build code, new targets
can be added without causing rebuilds for other targets.

* gnu/packages/tls.scm
(target->openssl-target): New procedure.
(openssl)[arguments]<#:phases>{set-cross-compile}: Use it.
---
gnu/packages/tls.scm | 46 ++++++++++++++++++++++++++------------------
1 file changed, 27 insertions(+), 19 deletions(-)

Toggle diff (66 lines)
diff --git a/gnu/packages/tls.scm b/gnu/packages/tls.scm
index a4e754e27f..af91e42888 100644
--- a/gnu/packages/tls.scm
+++ b/gnu/packages/tls.scm
@@ -313,6 +313,31 @@ required structures.")
 (define-public guile3.0-gnutls
   (deprecated-package "guile3.0-gnutls" gnutls))
 
+(define (target->openssl-target target)
+  "Return the value to set CONFIGURE_TARGET_ARCH to when cross-compiling
+OpenSSL for TARGET."
+  ;; Keep this code outside the build code,
+  ;; such that new targets can be added
+  ;; without causing rebuilds for other targets.
+  (cond ((string-prefix? "i586" target)
+         "hurd-x86")
+        ((string-prefix? "i686" target)
+         "linux-x86")
+        ((string-prefix? "x86_64" target)
+         "linux-x86_64")
+        ((string-prefix? "mips64el" target)
+         "linux-mips64")
+        ((string-prefix? "arm" target)
+         "linux-armv4")
+        ((string-prefix? "aarch64" target)
+         "linux-aarch64")
+        ((string-prefix? "powerpc64le" target)
+         "linux-ppc64le")
+        ((string-prefix? "powerpc64" target)
+         "linux-ppc64")
+        ((string-prefix? "powerpc" target)
+         "linux-ppc")))
+
 (define-public openssl
   (package
    (name "openssl")
@@ -351,25 +376,8 @@ required structures.")
                (lambda* (#:key target #:allow-other-keys)
                  (setenv "CROSS_COMPILE" (string-append target "-"))
                  (setenv "CONFIGURE_TARGET_ARCH"
-                         (cond
-                           ((string-prefix? "i586" target)
-                            "hurd-x86")
-                           ((string-prefix? "i686" target)
-                            "linux-x86")
-                           ((string-prefix? "x86_64" target)
-                            "linux-x86_64")
-                           ((string-prefix? "mips64el" target)
-                            "linux-mips64")
-                           ((string-prefix? "arm" target)
-                            "linux-armv4")
-                           ((string-prefix? "aarch64" target)
-                            "linux-aarch64")
-                           ((string-prefix? "powerpc64le" target)
-                            "linux-ppc64le")
-                           ((string-prefix? "powerpc64" target)
-                            "linux-ppc64")
-                           ((string-prefix? "powerpc" target)
-                            "linux-ppc"))))))
+                         #$(target->openssl-target
+                            (%current-target-system))))))
              #~())
         (replace 'configure
           (lambda _
-- 
2.32.0
M
M
Maxime Devos wrote on 18 Jun 2021 18:09
[[PATCH v2 core-updates] 23/37] readline: Make #:configure-flags a G-expression.
(address . 49025@debbugs.gnu.org)
20210618160936.18972-23-maximedevos@telenet.be
This allos using ungexp and this-package-input later.

* gnu/packages/readline.scm
(readline)[arguments]<#:configure-flags>: Make this a
G-expression.
---
gnu/packages/readline.scm | 25 +++++++++++++------------
1 file changed, 13 insertions(+), 12 deletions(-)

Toggle diff (46 lines)
diff --git a/gnu/packages/readline.scm b/gnu/packages/readline.scm
index b4c91675a4..6cfa24c666 100644
--- a/gnu/packages/readline.scm
+++ b/gnu/packages/readline.scm
@@ -29,6 +29,7 @@
   #:use-module (guix download)
   #:use-module (guix build-system gnu)
   #:use-module (guix utils)
+  #:use-module (guix gexp)
   #:use-module (ice-9 format))
 
 (define (patch-url version seqno)
@@ -76,19 +77,19 @@
     (build-system gnu-build-system)
     (propagated-inputs `(("ncurses" ,ncurses)))
     (arguments `(#:configure-flags
-                 (list (string-append "LDFLAGS=-Wl,-rpath -Wl,"
-                                      (assoc-ref %build-inputs "ncurses")
-                                      "/lib")
+                 ,#~(list (string-append "LDFLAGS=-Wl,-rpath -Wl,"
+                                         (assoc-ref %build-inputs "ncurses")
+                                         "/lib")
 
-                       ;; This test does an 'AC_TRY_RUN', which aborts when
-                       ;; cross-compiling, so provide the correct answer.
-                       ,@(if (%current-target-system)
-                             '("bash_cv_wcwidth_broken=no")
-                             '())
-                       ;; MinGW: ncurses provides the termcap api.
-                       ,@(if (target-mingw?)
-                             '("bash_cv_termcap_lib=ncurses")
-                             '()))
+                          ;; This test does an 'AC_TRY_RUN', which aborts when
+                          ;; cross-compiling, so provide the correct answer.
+                          #$@(if (%current-target-system)
+                                 '("bash_cv_wcwidth_broken=no")
+                                 '())
+                          ;; MinGW: ncurses provides the termcap api.
+                          #$@(if (target-mingw?)
+                                 '("bash_cv_termcap_lib=ncurses")
+                                 '()))
 
                  ,@(if (target-mingw?)
                        ;; MinGW: termcap in ncurses
-- 
2.32.0
M
M
Maxime Devos wrote on 18 Jun 2021 18:09
[[PATCH v2 core-updates] 11/37] libgpg-error: Fix cross-compilation error.
(address . 49025@debbugs.gnu.org)
20210618160936.18972-11-maximedevos@telenet.be
TODO: inform upstream about the cross-compilation error.

* gnu/packages/gnupg.scm
(libgpg-error)[arguments]{fix-gen-lock-obj.sh}: Prevent generated
header files from being sprinkled with ‘\c’.
---
gnu/packages/gnupg.scm | 7 +++++++
1 file changed, 7 insertions(+)

Toggle diff (20 lines)
diff --git a/gnu/packages/gnupg.scm b/gnu/packages/gnupg.scm
index f5d4118af9..1fee30584c 100644
--- a/gnu/packages/gnupg.scm
+++ b/gnu/packages/gnupg.scm
@@ -100,6 +100,13 @@
                       (guix build utils))
            #:phases
            (modify-phases %standard-phases
+             ;; If this is left out, some generated header
+             ;; files will be sprinkled with ‘\c’, which
+             ;; the compiler won't like.
+             (add-after 'unpack 'fix-gen-lock-obj.sh
+               (lambda _
+                 (substitute* "src/gen-lock-obj.sh"
+                   (("if test -n `echo -n`") "if ! test -n `echo -n`"))))
              ;; When cross-compiling, some platform specific properties cannot
              ;; be detected. Create a symlink to the appropriate platform
              ;; file if required. Note that these platform files depend on
-- 
2.32.0
M
M
Maxime Devos wrote on 18 Jun 2021 18:09
[[PATCH v2 core-updates] 24/37] readline: Fix build error when cross-compiling.
(address . 49025@debbugs.gnu.org)
20210618160936.18972-24-maximedevos@telenet.be
%build-inputs does not exist when cross-compiling, so
use this-package-input instead.

* gnu/packages/readline.scm
(readline)[arguments]<#:configure-flags>: Use this-package-input
instead of %build-inputs.
---
gnu/packages/readline.scm | 8 +++++---
1 file changed, 5 insertions(+), 3 deletions(-)

Toggle diff (28 lines)
diff --git a/gnu/packages/readline.scm b/gnu/packages/readline.scm
index 6cfa24c666..f9f2797247 100644
--- a/gnu/packages/readline.scm
+++ b/gnu/packages/readline.scm
@@ -4,6 +4,7 @@
 ;;; Copyright © 2016 Jan Nieuwenhuizen <janneke@gnu.org>
 ;;; Copyright © 2018 Tobias Geerinckx-Rice <me@tobias.gr>
 ;;; Copyright © 2019, 2020 Marius Bakke <marius@gnu.org>
+;;; Copyright © 2021 Maxime Devos <maximedevos@telenet.be>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -77,9 +78,10 @@
     (build-system gnu-build-system)
     (propagated-inputs `(("ncurses" ,ncurses)))
     (arguments `(#:configure-flags
-                 ,#~(list (string-append "LDFLAGS=-Wl,-rpath -Wl,"
-                                         (assoc-ref %build-inputs "ncurses")
-                                         "/lib")
+                 ,#~(list (string-append
+                           "LDFLAGS=-Wl,-rpath -Wl,"
+                           #$(this-package-input "ncurses")
+                           "/lib")
 
                           ;; This test does an 'AC_TRY_RUN', which aborts when
                           ;; cross-compiling, so provide the correct answer.
-- 
2.32.0
M
M
Maxime Devos wrote on 18 Jun 2021 18:09
[[PATCH v2 core-updates] 25/37] bash: Make #:configure-flags a G-expression.
(address . 49025@debbugs.gnu.org)
20210618160936.18972-25-maximedevos@telenet.be
This allows using this-package-input later.

* gnu/packages/bash.scm
(bash)[arguments]<#:configure-flags>: Make this a G-expression
instead of a raw S-expression.
---
gnu/packages/bash.scm | 22 +++++++++++-----------
1 file changed, 11 insertions(+), 11 deletions(-)

Toggle diff (42 lines)
diff --git a/gnu/packages/bash.scm b/gnu/packages/bash.scm
index 7e98367bbb..b3af873a66 100644
--- a/gnu/packages/bash.scm
+++ b/gnu/packages/bash.scm
@@ -109,15 +109,15 @@ number/base32-hash tuples, directly usable in the 'patch-series' form."
                                   "-DSSH_SOURCE_BASHRC")
                                 " "))
          (configure-flags
-          ``("--with-installed-readline"
-             ,,(string-append "CPPFLAGS=" cppflags)
-             ,(string-append
-               "LDFLAGS=-Wl,-rpath -Wl,"
-               (assoc-ref %build-inputs "readline")
-               "/lib"
-               " -Wl,-rpath -Wl,"
-               (assoc-ref %build-inputs "ncurses")
-               "/lib")))
+          #~`("--with-installed-readline"
+              ,#$(string-append "CPPFLAGS=" cppflags)
+              ,(string-append
+                "LDFLAGS=-Wl,-rpath -Wl,"
+                (assoc-ref %build-inputs "readline")
+                "/lib"
+                " -Wl,-rpath -Wl,"
+                (assoc-ref %build-inputs "ncurses")
+                "/lib")))
          (version "5.1"))
     (package
      (name "bash")
@@ -143,8 +143,8 @@ number/base32-hash tuples, directly usable in the 'patch-series' form."
       `(;; When cross-compiling, `configure' incorrectly guesses that job
         ;; control is missing.
         #:configure-flags ,(if (%current-target-system)
-                               `(cons* "bash_cv_job_control_missing=no"
-                                       ,configure-flags)
+                               #~(cons* "bash_cv_job_control_missing=no"
+                                        #$configure-flags)
                                configure-flags)
 
         ;; Bash is reportedly not parallel-safe.  See, for instance,
-- 
2.32.0
M
M
Maxime Devos wrote on 18 Jun 2021 18:09
[[PATCH v2 core-updates] 26/37] bash: Fix cross-compilation build error.
(address . 49025@debbugs.gnu.org)
20210618160936.18972-26-maximedevos@telenet.be
%build-inputs does not exist when cross-compiling,
so use this-package-input instead.

* gnu/packages/bash.scm
(bash)[arguments]<#:configure-flags>: Use this-package-input
instead of %build-inputs.
---
gnu/packages/bash.scm | 35 +++++++++++++++++++----------------
1 file changed, 19 insertions(+), 16 deletions(-)

Toggle diff (48 lines)
diff --git a/gnu/packages/bash.scm b/gnu/packages/bash.scm
index b3af873a66..d51ab26bc8 100644
--- a/gnu/packages/bash.scm
+++ b/gnu/packages/bash.scm
@@ -103,22 +103,25 @@ number/base32-hash tuples, directly usable in the 'patch-series' form."
           1))
 
 (define-public bash
-  (let* ((cppflags (string-join '("-DDEFAULT_PATH_VALUE='\"/no-such-path\"'"
-                                  "-DSTANDARD_UTILS_PATH='\"/no-such-path\"'"
-                                  "-DNON_INTERACTIVE_LOGIN_SHELLS"
-                                  "-DSSH_SOURCE_BASHRC")
-                                " "))
-         (configure-flags
-          #~`("--with-installed-readline"
-              ,#$(string-append "CPPFLAGS=" cppflags)
-              ,(string-append
-                "LDFLAGS=-Wl,-rpath -Wl,"
-                (assoc-ref %build-inputs "readline")
-                "/lib"
-                " -Wl,-rpath -Wl,"
-                (assoc-ref %build-inputs "ncurses")
-                "/lib")))
-         (version "5.1"))
+  (let ((cppflags (string-join '("-DDEFAULT_PATH_VALUE='\"/no-such-path\"'"
+                                 "-DSTANDARD_UTILS_PATH='\"/no-such-path\"'"
+                                 "-DNON_INTERACTIVE_LOGIN_SHELLS"
+                                 "-DSSH_SOURCE_BASHRC")
+                               " "))
+        (version "5.1"))
+    ;; Delay expansion to inside a lexical environment
+    ;; where this-package is bound.
+    (define-syntax configure-flags
+      (identifier-syntax
+       #~`("--with-installed-readline"
+           ,#$(string-append "CPPFLAGS=" cppflags)
+           ,(string-append
+             "LDFLAGS=-Wl,-rpath -Wl,"
+             ;; %build-inputs does not exist when cross-compiling,
+             ;; so use this-package-input instead.
+             #$(file-append (this-package-input "readline") "/lib")
+             " -Wl,-rpath -Wl,"
+             #$(file-append (this-package-input "ncurses") "/lib")))))
     (package
      (name "bash")
      (source (origin
-- 
2.32.0
M
M
Maxime Devos wrote on 18 Jun 2021 18:09
[[PATCH v2 core-updates] 28/37] fontconfig: Fix build error when cross-compiling.
(address . 49025@debbugs.gnu.org)
20210618160936.18972-28-maximedevos@telenet.be
%build-inputs does not exist when cross-compiling,
so use #$(this-package-input ...) instead.

* gnu/packages/fontutils.scm
(fontconfig)[arguments]<#:configure-flags>: Use this-package-input
instead of %build-inputs.
---
gnu/packages/fontutils.scm | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)

Toggle diff (17 lines)
diff --git a/gnu/packages/fontutils.scm b/gnu/packages/fontutils.scm
index 234f11129a..b0d40efeae 100644
--- a/gnu/packages/fontutils.scm
+++ b/gnu/packages/fontutils.scm
@@ -353,8 +353,8 @@ Font Format (WOFF).")
               "--with-cache-dir=/var/cache/fontconfig"
               ;; register the default fonts
               (string-append "--with-default-fonts="
-                             (assoc-ref %build-inputs "font-dejavu")
-                             "/share/fonts")
+                             #$(file-append (this-package-input "font-dejavu")
+                                            "/share/fonts"))
 
               ;; Register fonts from user and system profiles.
               (string-append "--with-add-fonts="
-- 
2.32.0
M
M
Maxime Devos wrote on 18 Jun 2021 18:09
[[PATCH v2 core-updates] 29/37] glib: Use a correct python in scripts when cross-compiling.
(address . 49025@debbugs.gnu.org)
20210618160936.18972-29-maximedevos@telenet.be
During the build, a native python should be used as these
scripts will be invoked during the build, but when installed,
they should be a python for the system we're compiling for.

* gnu/packages/glib.scm
(glib)[arguments]<#:phases>{patch-python-references}: Look up
"python" in 'native-inputs', not 'inputs'.
(glib)[inputs]{python,python-wrapper,bash-minimal}: New inputs.
---
gnu/packages/glib.scm | 17 +++++++++++++++--
1 file changed, 15 insertions(+), 2 deletions(-)

Toggle diff (50 lines)
diff --git a/gnu/packages/glib.scm b/gnu/packages/glib.scm
index 94276ae0ef..25c5ae494b 100644
--- a/gnu/packages/glib.scm
+++ b/gnu/packages/glib.scm
@@ -16,6 +16,7 @@
 ;;; Copyright © 2020 Florian Pelz <pelzflorian@pelzflorian.de>
 ;;; Copyright © 2020 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
 ;;; Copyright © 2020 Arthur Margerit <ruhtra.mar@gmail.com>
+;;; Copyright © 2021 Maxime Devos <maximedevos@telenet.be>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -222,14 +223,19 @@ shared NFS home directories.")
              #t))
          ;; Python references are not being patched in patch-phase of build,
          ;; despite using python-wrapper as input. So we patch them manually.
+         ;;
+         ;; These python scripts are both used during build and installed,
+         ;; so at first, use a python from 'native-inputs', not 'inputs'. When
+         ;; cross-compiling, the 'patch-shebangs' phase will replace
+         ;; the native python with a python from 'inputs'.
          (add-after 'unpack 'patch-python-references
-           (lambda* (#:key inputs #:allow-other-keys)
+           (lambda* (#:key native-inputs inputs #:allow-other-keys)
              (substitute* '("gio/gdbus-2.0/codegen/gdbus-codegen.in"
                             "glib/gtester-report.in"
                             "gobject/glib-genmarshal.in"
                             "gobject/glib-mkenums.in")
                (("@PYTHON@")
-                (string-append (assoc-ref inputs "python")
+                (string-append (assoc-ref (or native-inputs inputs) "python")
                                "/bin/python"
                                ,(version-major+minor
                                  (package-version python)))))
@@ -282,6 +288,13 @@ shared NFS home directories.")
        ("xsltproc" ,libxslt)))
     (inputs
      `(("bash-completion" ,bash-completion)
+       ;; "python", "python-wrapper" and "bash-minimal"
+       ;; are for the 'patch-shebangs' phase, to make
+       ;; sure the installed scripts end up with a correct shebang
+       ;; when cross-compiling.
+       ("python" ,python)
+       ("python-wrapper" ,python-wrapper)
+       ("bash-minimal" ,(canonical-package bash-minimal))
        ("dbus" ,dbus)
        ("libelf" ,libelf)))
     (propagated-inputs
-- 
2.32.0
M
M
Maxime Devos wrote on 18 Jun 2021 18:09
[[PATCH v2 core-updates] 30/37] glib: Verify the cross-compiled python is used in installed scripts.
(address . 49025@debbugs.gnu.org)
20210618160936.18972-30-maximedevos@telenet.be
* gnu/packages/glib.scm (glib)[arguments]<#:disallowed-references>:
Disallow the native python when cross-compiling.
---
gnu/packages/glib.scm | 12 +++++++++++-
1 file changed, 11 insertions(+), 1 deletion(-)

Toggle diff (32 lines)
diff --git a/gnu/packages/glib.scm b/gnu/packages/glib.scm
index 25c5ae494b..244544ea6f 100644
--- a/gnu/packages/glib.scm
+++ b/gnu/packages/glib.scm
@@ -77,6 +77,8 @@
   #:use-module ((guix licenses) #:prefix license:)
   #:use-module (guix packages)
   #:use-module (guix utils)
+  #:use-module (guix gexp)
+  #:use-module (srfi srfi-26)
   #:use-module ((srfi srfi-1) #:hide (zip))
 
   ;; Export variables up-front to allow circular dependency with the 'xorg'
@@ -200,7 +202,15 @@ shared NFS home directories.")
     (outputs '("out"   ; everything
                "bin")) ; glib-mkenums, gtester, etc.; depends on Python
     (arguments
-     `(#:disallowed-references (,tzdata-for-tests)
+     `(#:disallowed-references
+       (,tzdata-for-tests
+        ;; Verify glib-mkenums, gtester, ... use the cross-compiled
+        ;; python.
+        ,@(if (%current-target-system)
+              (map (cut gexp-input <> #:native? #t)
+                   `(,(this-package-native-input "python")
+                     ,(this-package-native-input "python-wrapper")))
+              '()))
        #:configure-flags '("-Dman=true"
                            "-Dselinux=disabled")
        #:phases
-- 
2.32.0
M
M
Maxime Devos wrote on 18 Jun 2021 18:09
[[PATCH v2 core-updates] 31/37] glib: Look up "tzdata" in 'native-inputs', not 'inputs'.
(address . 49025@debbugs.gnu.org)
20210618160936.18972-31-maximedevos@telenet.be
Otherwise, "tzdata" won't be found when cross-compiling
and string-append will complain about types. Alternatively,
"tzdata" could be moved from 'native-inputs' to 'inputs'.

* gnu/packages/glib.scm (glib)[arguments]<#:phases>{pre-check}:
Look up "tzdata" in 'native-inputs', not 'inputs'.
---
gnu/packages/glib.scm | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)

Toggle diff (20 lines)
diff --git a/gnu/packages/glib.scm b/gnu/packages/glib.scm
index 244544ea6f..57e8282a89 100644
--- a/gnu/packages/glib.scm
+++ b/gnu/packages/glib.scm
@@ -251,10 +251,11 @@ shared NFS home directories.")
                                  (package-version python)))))
              #t))
          (add-before 'check 'pre-check
-           (lambda* (#:key inputs outputs #:allow-other-keys)
+           (lambda* (#:key native-inputs inputs outputs #:allow-other-keys)
              ;; For tests/gdatetime.c.
              (setenv "TZDIR"
-                     (string-append (assoc-ref inputs "tzdata")
+                     (string-append (assoc-ref (or native-inputs inputs)
+                                               "tzdata")
                                     "/share/zoneinfo"))
              ;; Some tests want write access there.
              (setenv "HOME" (getcwd))
-- 
2.32.0
M
M
Maxime Devos wrote on 18 Jun 2021 18:09
[[PATCH v2 core-updates] 15/37] python: Fix reference to input when cross-compiling.
(address . 49025@debbugs.gnu.org)
20210618160936.18972-15-maximedevos@telenet.be
"sitecustomize.py" is a native input, so look it up
in 'native-inputs', not 'inputs'.

* gnu/packages/python.scm (customize-site): Look up "sizecustomize.py"
in 'native-inputs', not 'inputs'.
---
gnu/packages/python.scm | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)

Toggle diff (23 lines)
diff --git a/gnu/packages/python.scm b/gnu/packages/python.scm
index fbad0b65b8..f004b8e739 100644
--- a/gnu/packages/python.scm
+++ b/gnu/packages/python.scm
@@ -111,13 +111,14 @@
 
 (define* (customize-site version)
   "Generate a install-sitecustomize.py phase, using VERSION."
-  `(lambda* (#:key inputs outputs #:allow-other-keys)
+  `(lambda* (#:key native-inputs inputs outputs #:allow-other-keys)
      (let* ((out (assoc-ref outputs "out"))
             (site-packages (string-append
                             out "/lib/python"
                             ,(version-major+minor version)
                             "/site-packages"))
-            (sitecustomize.py (assoc-ref inputs "sitecustomize.py"))
+            (sitecustomize.py (assoc-ref (or native-inputs inputs)
+                                         "sitecustomize.py"))
             (dest (string-append site-packages "/sitecustomize.py")))
        (mkdir-p site-packages)
        (copy-file sitecustomize.py dest)
-- 
2.32.0
M
M
Maxime Devos wrote on 18 Jun 2021 18:09
[[PATCH v2 core-updates] 33/37] tk: Do not use %build-inputs when cross-compiling.
(address . 49025@debbugs.gnu.org)
20210618160936.18972-33-maximedevos@telenet.be
%build-inputs does not exists when cross-compiling,
so use #$(this-package-input ...) instead.

* gnu/packages/tcl.scm
(tk)[arguments]<#:configure-flags>: Use 'this-package-input'
instead of '%build-inputs' when cross-compiling.
---
gnu/packages/tcl.scm | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)

Toggle diff (25 lines)
diff --git a/gnu/packages/tcl.scm b/gnu/packages/tcl.scm
index c87a8187f2..91ba8bbb3f 100644
--- a/gnu/packages/tcl.scm
+++ b/gnu/packages/tcl.scm
@@ -29,6 +29,7 @@
   #:use-module (guix download)
   #:use-module (guix git-download)
   #:use-module (guix utils)
+  #:use-module (guix gexp)
   #:use-module (guix build-system gnu)
   #:use-module (guix build-system go)
   #:use-module (guix build-system perl)
@@ -232,7 +233,9 @@ X11 GUIs.")
        #:configure-flags
        ,#~
        (list (string-append "--with-tcl="
-                            (assoc-ref %build-inputs "tcl")
+                            #$(if (%current-target-system)
+                                  (this-package-input "tcl")
+                                  #~(assoc-ref %build-inputs "tcl"))
                             "/lib")
              ;; This is needed when cross-compiling, see:
              ;; https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=719247
-- 
2.32.0
M
M
Maxime Devos wrote on 18 Jun 2021 18:09
[[PATCH v2 core-updates] 34/37] libelf: Use the cross-compiler when cross-compiling.
(address . 49025@debbugs.gnu.org)
20210618160936.18972-34-maximedevos@telenet.be
* gnu/packages/elf.scm
(libelf)[arguments]<#:phases>{delete-configure}: Regenerate
the configure script when cross-compiling.
(libelf)[arguments]<#:phases>{configure}: Do not replace
when cross-compiling.
(libelf)[native-inputs]: Add autoconf when cross-compiling.
---
gnu/packages/elf.scm | 48 +++++++++++++++++++++++++++++---------------
1 file changed, 32 insertions(+), 16 deletions(-)

Toggle diff (75 lines)
diff --git a/gnu/packages/elf.scm b/gnu/packages/elf.scm
index 0309dd95b5..66c2334e5c 100644
--- a/gnu/packages/elf.scm
+++ b/gnu/packages/elf.scm
@@ -9,6 +9,7 @@
 ;;; Copyright © 2020 Mark Wielaard <mark@klomp.org>
 ;;; Copyright © 2020 Michael Rohleder <mike@rohleder.de>
 ;;; Copyright © 2021 Leo Le Bouter <lle-bout@zaclys.net>
+;;; Copyright © 2021 Maxime Devos <maximedevos@telenet.be>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -32,6 +33,7 @@
   #:use-module (guix build-system gnu)
   #:use-module ((guix licenses) #:select (gpl3+ lgpl3+ lgpl2.0+))
   #:use-module (gnu packages)
+  #:use-module (gnu packages autotools)
   #:use-module (gnu packages compression)
   #:use-module (gnu packages documentation)
   #:use-module (gnu packages gcc)
@@ -205,22 +207,36 @@ static analysis of the ELF binaries at hand.")
     (arguments
      `(#:phases
        (modify-phases %standard-phases
-         (replace 'configure
-           (lambda* (#:key outputs #:allow-other-keys)
-             ;; This old `configure' script doesn't support
-             ;; variables passed as arguments.
-             (let ((out (assoc-ref outputs "out")))
-               (setenv "CONFIG_SHELL" (which "bash"))
-               (invoke "./configure"
-                       (string-append "--prefix=" out)
-                       ,@(if (string=? "powerpc64le-linux"
-                                       (%current-system))
-                             '("--host=powerpc64le-unknown-linux-gnu")
-                             '())
-                       ,@(if (string=? "aarch64-linux"
-                                       (%current-system))
-                             '("--host=aarch64-unknown-linux-gnu")
-                             '()))))))))
+         ,(if (%current-target-system)
+              ;; This old 'configure' script doesn't
+              ;; support cross-compilation well. E.g., it fails
+              ;; to find the cross-compiler.
+              `(add-before 'bootstrap 'delete-configure
+                 (lambda _
+                   (delete-file "configure")))
+              `(replace 'configure
+                 ;; This old `configure' script doesn't support
+                 ;; variables passed as arguments. TODO: would
+                 ;; simply regenerating 'configure' work
+                 ;; well enough, even if compiling natively
+                 ;; on powerpc or aarch64?
+                 (lambda* (#:key outputs #:allow-other-keys)
+                   (let ((out (assoc-ref outputs "out")))
+                     (setenv "CONFIG_SHELL" (which "bash"))
+                     (invoke "./configure"
+                             (string-append "--prefix=" out)
+                             ,@(if (string=? "powerpc64le-linux"
+                                             (%current-system))
+                                   '("--host=powerpc64le-unknown-linux-gnu")
+                                   '())
+                             ,@(if (string=? "aarch64-linux"
+                                             (%current-system))
+                                   '("--host=aarch64-unknown-linux-gnu")
+                                   '())))))))))
+    (native-inputs
+     (if (%current-target-system)
+         `(("autoconf" ,autoconf))
+         '()))
     (home-page (string-append "https://web.archive.org/web/20181111033959/"
                               "http://www.mr511.de/software/english.html"))
     (synopsis "ELF object file access library")
-- 
2.32.0
M
M
Maxime Devos wrote on 18 Jun 2021 18:09
[[PATCH v2 core-updates] 35/37] opendht: Correct 'nettle' variable name in inputs.
(address . 49025@debbugs.gnu.org)
20210618160936.18972-35-maximedevos@telenet.be
Previously, opendht referred to 'nettle-3.7'.
But nettle-3.7 has been renamed to simply 'nettle'.
So, refer to 'nettle' instead of 'nettle-3.7'.

This should fix recent evaluation failures of core-updates
on ci.guix.gnu.org.

* gnu/packages/networking.scm
(opendht)[inputs]{nettle}: Refer to 'nettle' instead of 'nettle-3.7'.
---
gnu/packages/networking.scm | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

Toggle diff (15 lines)
diff --git a/gnu/packages/networking.scm b/gnu/packages/networking.scm
index 62c4d7a392..6b154067b1 100644
--- a/gnu/packages/networking.scm
+++ b/gnu/packages/networking.scm
@@ -3478,7 +3478,7 @@ and targeted primarily for asynchronous processing of HTTP-requests.")
     (build-system cmake-build-system)
     (inputs
      `(("argon2" ,argon2)
-       ("nettle" ,nettle-3.7)
+       ("nettle" ,nettle)
        ("readline" ,readline)
        ("jsoncpp" ,jsoncpp)
        ("openssl" ,openssl)             ;required for the DHT proxy
-- 
2.32.0
M
M
Maxime Devos wrote on 18 Jun 2021 18:09
[[PATCH v2 core-updates] 36/37] cross-base: Fix cross-compiler for i686-linux-gnu.
(address . 49025@debbugs.gnu.org)
20210618160936.18972-36-maximedevos@telenet.be
GCC doesn't find libgcc_s.so anymore and looks in the wrong
location. Fix this (well, more a work-around really).

* gnu/packages/cross-base.scm
(cross-gcc-arguments)<#:configure-flags>:
Add --with-toolexecdir, such that libstdc++ ends up in the right
place. Add --with-slibdir such that libgcc_s.so end up in the right place.
(cross-gcc-arguments)<#:phases>{move-shared-libraries}:
New phase, moving libraries in the correct place.
Delete .la files, libasan.so and libusan.so to prevent circular
references. Likewise, fix a reference in libstdc++.so.VERSION-gdb.py.
---
gnu/packages/cross-base.scm | 63 +++++++++++++++++++++++++++++++++++--
1 file changed, 60 insertions(+), 3 deletions(-)

Toggle diff (98 lines)
diff --git a/gnu/packages/cross-base.scm b/gnu/packages/cross-base.scm
index 9487ac9238..995b4ae065 100644
--- a/gnu/packages/cross-base.scm
+++ b/gnu/packages/cross-base.scm
@@ -7,6 +7,7 @@
 ;;; Copyright © 2019, 2020, 2021 Marius Bakke <marius@gnu.org>
 ;;; Copyright © 2019 Carl Dong <contact@carldong.me>
 ;;; Copyright © 2020 Mathieu Othacehe <m.othacehe@gmail.com>
+;;; Copyright © 2021 Maxime Devos <maximedevos@telenet.be>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -33,6 +34,7 @@
   #:use-module (guix packages)
   #:use-module (guix download)
   #:use-module (guix utils)
+  #:use-module (guix gexp)
   #:use-module (guix build-system gnu)
   #:use-module (guix build-system trivial)
   #:use-module (srfi srfi-1)
@@ -169,9 +171,26 @@ base compiler and using LIBC (which may be either a libc package or #f.)"
                                 ))
 
                        ;; Install cross-built libraries such as libgcc_s.so in
-                       ;; the "lib" output.
+                       ;; the "lib" output. At least for version 8.4.0, GCC
+                       ;; will put libstdc++ in ${toolexecdir}/lib instead.
+                       ;; (A bug?) So set --with-toolexecdir as well.
+
                        ,@(if libc
-                             `((string-append "--with-toolexeclibdir="
+                             `((string-append "--with-toolexecdir="
+                                              (assoc-ref %outputs "lib"))
+                               (string-append "--with-toolexeclibdir="
+                                              (assoc-ref %outputs "lib")
+                                              "/" ,target "/lib"))
+                             '())
+                       ;; At least for GCC 8.0, libgcc_s.so and libstdc++.so
+                       ;; are not installed in the location specified in
+                       ;; --with-toolexeclibdir so GCC will not find it
+                       ;; when cross-compiling, say, GNU Hello.
+                       ;;
+                       ;; Work-around by specifying slibdir. This is not
+                       ;; sufficient, see move-shared-libraries below.
+                       ,@(if (and libc (version>=? (package-version xgcc) "8.0"))
+                             `((string-append "--with-slibdir="
                                               (assoc-ref %outputs "lib")
                                               "/" ,target "/lib"))
                              '())
@@ -193,7 +212,45 @@ base compiler and using LIBC (which may be either a libc package or #f.)"
                      ,flags))
             flags))
        ((#:phases phases)
-        `(cross-gcc-build-phases ,target ,phases))))))
+        (if (and libc (version>=? (package-version xgcc) "8.0"))
+            #~(modify-phases (cross-gcc-build-phases #$target #$phases)
+                (add-after 'install 'move-shared-libraries
+                  (lambda _
+                    (let* ((slib (format #f "~a/~a/lib/" #$output:lib #$target))
+                           (badlib (format #f "~a/~a/lib/" #$output #$target))
+                           (libs (map basename (find-files badlib #:fail-on-error? #t))))
+                      (for-each
+                       (lambda (lib)
+                         (let ((from (string-append badlib lib))
+                               (to   (string-append slib lib)))
+                           (when (file-exists? to)
+                             (error "~a was found twice, refusing to overwrite!"
+                                    lib))
+                           ;; The debugging script libstdc++.so.VERSION-gdb.py has
+                           ;; reference to #$output. Correct it.
+                           (when (string-suffix? "-gdb.py" lib)
+                             (substitute* from
+                               (("libdir = '(.*)'")
+                                (string-append "libdir = '" slib "'")))
+                             (system* "cat" from))
+                           ;; The .la files have references to BADLIB,
+                           ;; leading to cyclic references between
+                           ;; the outputs of the package. Remove them
+                           ;; and hope noone notices.
+                           ;;
+                           ;; Likewise, libasan.so.* and libubsan.so.*
+                           ;; have references to #$output.
+                           (if (or (string-suffix? ".la" lib)
+                                   (string-prefix? "libasan.so" lib)
+                                   (string-prefix? "libubsan.so" lib))
+                               (delete-file from)
+                               (rename-file from to))))
+                       libs)
+                      ;; If you have "cyclic references" problems,
+                      ;; uncomment this and use --keep-failed to figure
+                      ;; things out.
+                      (copy-recursively #$output:lib "out-test")))))
+            #~(cross-gcc-build-phases #$target #$phases)))))))
 
 (define (cross-gcc-patches xgcc target)
   "Return GCC patches needed for XGCC and TARGET."
-- 
2.32.0
M
M
Maxime Devos wrote on 18 Jun 2021 18:09
[[PATCH v2 core-updates] 37/37] meson: Support cross-compilation.
(address . 49025@debbugs.gnu.org)
20210618160936.18972-37-maximedevos@telenet.be
For cross-compilation, meson needs to be passed a
‘cross file’ with information on the architecture,
CPU type, endianness and operating system, and the
name of the cross-compiler binaries.

The new module (guix build meson-configuration) has
some utilities for writing these cross files, used
by 'make-cross-file' in a G-exp. The values for
the cross file are generated by 'make-machine-alist'
and 'make-binaries-alist'.

'make-machine-alist' and 'make-binaries-alist' live
on the host side, such that new architectures and operating
systems can be added without causing rebuilds for old
architectures.

Currently, only GNU/Hurd, GNU/Linux, MinGW, x86-32 and
x86-64 are supported by 'make-machine-alist'. For other
architectures, someone needs to figure out what to
use as ‘CPU type’ first. Only i686-linux-gnu has been
tested.

This has been tested with:

$ ./pre-inst-env guix build glib --target=i686-linux-gnu

on a x86_64-linux system. ‘If it compiles, it should work.’

* guix/build/meson-configuration.scm
(configuration-port): New parameter.
(write-section-header): New procedure.
(write-assignment): New procedure.
(write-assignments): New procedure.
* guix/build-system/meson.scm
(target-hurd?): New predicate.
(make-machine-alist): New procedure.
(make-binaries-alist): New procedure.
(make-cross-file): New procedure.
(meson-cross-build): New procedure.
(lower)[build-inputs]: Add standard cross packages when cross-compiling.
Do not include regular 'inputs' when cross-compiling.
(lower)[host-inputs]: Include 'inputs' when cross-compiling.
(lower)[target-inputs]: Add cross packages when cross-compiling.
(lower)[build]: Call 'meson-cross-build' instead of 'cross-build'
when cross-compiling.
(lower)[target]: Set it.
(lower)[private-keywords]: Do not remove #:target when cross-compiling.
---
Makefile.am | 1 +
guix/build-system/meson.scm | 197 ++++++++++++++++++++++++++---
guix/build/meson-configuration.scm | 71 +++++++++++
3 files changed, 250 insertions(+), 19 deletions(-)
create mode 100644 guix/build/meson-configuration.scm

Toggle diff (327 lines)
diff --git a/Makefile.am b/Makefile.am
index a10e06e5a7..d4bf626fd5 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -234,6 +234,7 @@ MODULES =					\
   guix/build/emacs-utils.scm			\
   guix/build/java-utils.scm			\
   guix/build/lisp-utils.scm			\
+  guix/build/meson-configuration.scm		\
   guix/build/maven/java.scm			\
   guix/build/maven/plugin.scm			\
   guix/build/maven/pom.scm			\
diff --git a/guix/build-system/meson.scm b/guix/build-system/meson.scm
index 5adc0f92c8..1f763af2aa 100644
--- a/guix/build-system/meson.scm
+++ b/guix/build-system/meson.scm
@@ -2,6 +2,7 @@
 ;;; Copyright © 2017 Peter Mikkelsen <petermikkelsen10@gmail.com>
 ;;; Copyright © 2018, 2019 Marius Bakke <mbakke@fastmail.com>
 ;;; Copyright © 2021 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2021 Maxime Devos <maximedevos@telenet.be>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -30,7 +31,8 @@
   #:use-module (guix packages)
   #:use-module (ice-9 match)
   #:export (%meson-build-system-modules
-            meson-build-system))
+            meson-build-system
+            make-cross-file))
 
 ;; Commentary:
 ;;
@@ -40,6 +42,62 @@
 ;;
 ;; Code:
 
+(define (target-hurd? triplet)
+  (and (string-suffix? "-gnu" triplet)
+       (not (string-contains triplet "linux"))))
+
+(define (make-machine-alist triplet)
+  "Make an association list describing what should go into
+the ‘host_machine’ section of the cross file when cross-compiling
+for TRIPLET."
+  `((system . ,(cond ((target-hurd? triplet) "gnu")
+                     ((target-linux? triplet) "linux")
+                     ((target-mingw? triplet) "windows")
+                     (#t (error "meson: unknown operating system"))))
+    (cpu_family . ,(cond ((target-x86-32? triplet) "x86")
+                         ((target-x86-64? triplet) "x86_64")
+                         ((target-arm32? triplet) "arm")
+                         ((target-aarch64? triplet) "aarch64")
+                         ((target-powerpc? triplet)
+                          (if (target-64bit? triplet)
+                              "ppc64"
+                              "ppc"))
+                         (#t (error "meson: unknown architecture"))))
+    (cpu . ,(cond ((target-x86-32? triplet) ; i386, ..., i686
+                   (substring triplet 0 4))
+                  ((target-x86-64? triplet) "x86_64")
+                  (#t (error "meson: unknown CPU"))))
+    (endian . ,(cond ((string-prefix? "powerpc64le-" triplet) "little")
+                     ((string-prefix? "mips64el-" triplet) "little")
+                     ((target-x86-32? triplet) "little")
+                     ((target-x86-64? triplet) "little")
+                     (#t (error "meson: unknown architecture"))))))
+
+(define (make-binaries-alist triplet)
+  "Make an associatoin list describing what should go into
+the ‘binaries’ section of the cross file when cross-compiling for
+TRIPLET."
+  `((c . ,(cc-for-target triplet))
+    (cpp . ,(cxx-for-target triplet))
+    (pkgconfig . ,(pkg-config-for-target triplet))
+    (objcopy . ,(string-append triplet "-objcopy"))
+    (ar . ,(string-append triplet "-ar"))
+    (ld . ,(string-append triplet "-ld"))
+    (strip . ,(string-append triplet "-strip"))))
+
+(define (make-cross-file triplet)
+  (computed-file "cross-file"
+    (with-imported-modules '((guix build meson-configuration))
+      #~(begin
+          (use-modules (guix build meson-configuration))
+          (call-with-output-file #$output
+            (lambda (f)
+              (parameterize ((configuration-port f))
+                (write-section-header "host_machine")
+                (write-assignments '#$(make-machine-alist triplet))
+                (write-section-header "binaries")
+                (write-assignments '#$(make-binaries-alist triplet)))))))))
+
 (define %meson-build-system-modules
   ;; Build-side modules imported by default.
   `((guix build meson-build-system)
@@ -68,24 +126,34 @@
                 #:rest arguments)
   "Return a bag for NAME."
   (define private-keywords
-    `(#:meson #:ninja #:inputs #:native-inputs #:outputs #:target))
-
-  (and (not target) ;; TODO: add support for cross-compilation.
-       (bag
-         (name name)
-         (system system)
-         (build-inputs `(("meson" ,meson)
-                         ("ninja" ,ninja)
-                         ,@native-inputs
-                         ,@inputs
-                         ;; Keep the standard inputs of 'gnu-build-system'.
-                         ,@(standard-packages)))
-         (host-inputs (if source
-                          `(("source" ,source))
-                          '()))
-         (outputs outputs)
-         (build meson-build)
-         (arguments (strip-keyword-arguments private-keywords arguments)))))
+    `(#:meson #:ninja #:inputs #:native-inputs #:outputs
+      ,@(if target
+            '()
+            '(#:target))))
+
+  (bag
+    (name name)
+    (system system) (target target)
+    (build-inputs `(("meson" ,meson)
+                    ("ninja" ,ninja)
+                    ,@native-inputs
+                    ,@(if target '() inputs)
+                    ;; Keep the standard inputs of 'gnu-build-system'.
+                    ,@(if target
+                          (standard-cross-packages target 'host)
+                          '())
+                    ,@(standard-packages)))
+    (host-inputs `(,@(if source
+                         `(("source" ,source))
+                         '())
+                   ,@(if target inputs '())))
+    ;; Keep the standard inputs of 'gnu-buid-system'.
+    (target-inputs (if target
+                       (standard-cross-packages target 'target)
+                       '()))
+    (outputs outputs)
+    (build (if target meson-cross-build meson-build))
+    (arguments (strip-keyword-arguments private-keywords arguments))))
 
 (define* (meson-build name inputs
                       #:key
@@ -161,6 +229,97 @@ has a 'meson.build' file."
                       #:disallowed-references disallowed-references
                       #:guile-for-build guile)))
 
+(define* (meson-cross-build name
+                            #:key
+                            target
+                            build-inputs host-inputs target-inputs
+                            guile source
+                            (outputs '("out"))
+                            (configure-flags ''())
+                            (search-paths '())
+                            (native-search-paths '())
+
+                            (build-type "debugoptimized")
+                            (tests? #f)
+                            (test-target "test")
+                            (glib-or-gtk? #f)
+                            (parallel-build? #t)
+                            (parallel-tests? #f)
+                            (validate-runpath? #t)
+                            (patch-shebangs? #t)
+                            (strip-binaries? #t)
+                            (strip-flags ''("--strip-debug"))
+                            (strip-directories ''("lib" "lib64" "libexec"
+                                                  "bin" "sbin"))
+                            (elf-directories ''("lib" "lib64" "libexec"
+                                                "bin" "sbin"))
+                            (phases '%standard-phases)
+                            (system (%current-system))
+                            (imported-modules %meson-build-system-modules)
+                            (modules '((guix build meson-build-system)
+                                       (guix build utils)))
+                            allowed-references
+                            disallowed-references)
+  "Cross-build SOURCE for TARGET using MESON, and with INPUTS, assuming that
+SOURCE has a 'meson.build' file."
+  (define cross-file
+    (make-cross-file target))
+  (define inputs
+    (if (null? target-inputs)
+        (input-tuples->gexp host-inputs)
+        #~(append #$(input-tuples->gexp host-inputs)
+                  #+(input-tuples->gexp target-inputs))))
+  (define builder
+    (with-imported-modules imported-modules
+      #~(begin
+          (use-modules #$@(sexp->gexp modules))
+
+          (define build-phases
+            #$(let ((phases (if (pair? phases) (sexp->gexp phases) phases)))
+                (if glib-or-gtk?
+                    phases
+                    #~(modify-phases #$phases
+                        (delete 'glib-or-gtk-compile-schemas)
+                        (delete 'glib-or-gtk-wrap)))))
+
+          ;; Do not use 'with-build-variables', as there should be
+          ;; no reason to use %build-inputs and friends.
+          (meson-build #:source #+source
+                       #:system #$system
+                       #:outputs #$(outputs->gexp outputs)
+                       #:inputs #$inputs
+                       #:native-inputs #+(input-tuples->gexp build-inputs)
+                       #:search-paths '#$(sexp->gexp
+                                          (map search-path-specification->sexp
+                                                     search-paths))
+                       #:native-search-paths '#$(sexp->gexp
+                                                 (map search-path-specification->sexp
+                                                      native-search-paths))
+                       #:phases build-phases
+                       #:configure-flags `("--cross-file" #+cross-file
+                                           ,@#$(sexp->gexp configure-flags))
+                       #:build-type #$build-type
+                       #:tests? #$tests?
+                       #:test-target #$test-target
+                       #:parallel-build? #$parallel-build?
+                       #:parallel-tests? #$parallel-tests?
+                       #:validate-runpath? #$validate-runpath?
+                       #:patch-shebangs? #$patch-shebangs?
+                       #:strip-binaries? #$strip-binaries?
+                       #:strip-flags #$(sexp->gexp strip-flags)
+                       #:strip-directories #$(sexp->gexp strip-directories)
+                       #:elf-directories #$(sexp->gexp elf-directories)))))
+
+  (mlet %store-monad ((guile (package->derivation (or guile (default-guile))
+                                                  system #:graft? #f)))
+    (gexp->derivation name builder
+                      #:system system
+                      #:target target
+                      #:substitutable? substitutable?
+                      #:allowed-references allowed-references
+                      #:disallowed-references disallowed-references
+                      #:guile-for-build guile)))
+
 (define meson-build-system
   (build-system
     (name 'meson)
diff --git a/guix/build/meson-configuration.scm b/guix/build/meson-configuration.scm
new file mode 100644
index 0000000000..81b4eaa7e1
--- /dev/null
+++ b/guix/build/meson-configuration.scm
@@ -0,0 +1,71 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2021 Maxime Devos <maximedevos@telenet.be>
+;;;
+;;; This file is part of GNU Guix.
+;;;
+;;; GNU Guix is free software; you can redistribute it and/or modify it
+;;; under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 3 of the License, or (at
+;;; your option) any later version.
+;;;
+;;; GNU Guix is distributed in the hope that it will be useful, but
+;;; WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>.
+
+(define-module (guix build meson-configuration)
+  #:use-module (ice-9 match)
+  #:export (write-section-header write-assignment
+            write-assignments make-machine-alist
+            configuration-port))
+
+;; Commentary:
+;;
+;; Utilities for generating a ‘Cross build definition file’ for
+;; the Meson build system.  Configuration values are currently
+;; never escaped.  In practice this is unlikely to be a problem
+;; in the build environment.
+;;
+;; Code:
+
+(define configuration-port
+  (fluid->parameter (make-unbound-fluid)))
+
+(define (write-section-header section-name)
+  "Write a section header for section named SECTION-NAME
+to the configuration port."
+  (format (configuration-port) "[~a]~%" section-name))
+
+(define (write-assignment key value)
+  "Write an assignment of VALUE to KEY to the configuration
+port.  VALUE must be a string (without any special characters
+such as quotes), a boolean or an integer.  Lists are currently
+not supported"
+  (define port (configuration-port))
+  (match value
+    ((? string?)
+     (format port "~a = '~a'~%" key value))
+    ((? integer?)
+     (format port "~a = ~a~%" key value))
+    (#f
+     (format port "~a = true~%" key))
+    (#t
+     (format port "~a = false~%" key))))
+
+(define* (write-assignments alist)
+  "Write the assignments in ALIST, an association list,
+to the configuration port."
+  (for-each (match-lambda
+              ((key . value)
+               (write-assignment key value)))
+            alist))
+
+(define* (make-machine-alist #:key system cpu-family cpu endian)
+  "Make an association list for the [host_machine] section."
+  `((system . ,system)
+    (cpu-family . ,cpu-family)
+    (cpu . ,cpu)
+    (endian . ,endian)))
-- 
2.32.0
M
M
Maxime Devos wrote on 18 Jun 2021 18:09
[[PATCH v2 core-updates] 32/37] tk: Make #:configure-flags a G-expression.
(address . 49025@debbugs.gnu.org)
20210618160936.18972-32-maximedevos@telenet.be
This allows using #$(this-package-input ...) later.

* gnu/packages/tcl.scm (tk)[arguments]<#:configure-flags>: Make
this a G-expression instead of an S-expression.
---
gnu/packages/tcl.scm | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)

Toggle diff (27 lines)
diff --git a/gnu/packages/tcl.scm b/gnu/packages/tcl.scm
index 5fccfa5da9..c87a8187f2 100644
--- a/gnu/packages/tcl.scm
+++ b/gnu/packages/tcl.scm
@@ -230,15 +230,16 @@ X11 GUIs.")
                                           "/lib -lfontconfig")))))))
 
        #:configure-flags
+       ,#~
        (list (string-append "--with-tcl="
                             (assoc-ref %build-inputs "tcl")
                             "/lib")
              ;; This is needed when cross-compiling, see:
              ;; https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=719247
-             ,@(if (%current-target-system)
-                   '("tcl_cv_strtod_buggy=1"
-                     "ac_cv_func_strtod=yes")
-                   '()))
+             #$@(if (%current-target-system)
+                    #~("tcl_cv_strtod_buggy=1"
+                        "ac_cv_func_strtod=yes")
+                    #~()))
 
        ;; The tests require a running X server, so we just skip them.
        #:tests? #f))
-- 
2.32.0
M
M
Maxime Devos wrote on 18 Jun 2021 18:09
[[PATCH v2 core-updates] 14/37] wrap-python3: Fix cross-compilation.
(address . 49025@debbugs.gnu.org)
20210618160936.18972-14-maximedevos@telenet.be
When cross-compiling, "bash" is missing from %build-inputs,
leading to a build error. Use this-package-input instead of
%build-inputs to resolve this. While we're at it, eliminate
all uses of %outputs and %build-inputs.

* gnu/packages/python.scm
(wrap-python3)[arguments]<#:builder>: Eliminte %outputs
and %build-inputs.
---
gnu/packages/python.scm | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)

Toggle diff (35 lines)
diff --git a/gnu/packages/python.scm b/gnu/packages/python.scm
index 9628836567..fbad0b65b8 100644
--- a/gnu/packages/python.scm
+++ b/gnu/packages/python.scm
@@ -60,6 +60,7 @@
 ;;; Copyright © 2019 Tanguy Le Carrour <tanguy@bioneland.org>
 ;;; Copyright © 2020 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
 ;;; Copyright © 2020, 2021 Greg Hogan <code@greghogan.com>
+;;; Copyright © 2021 Maxime Devos <maximedevos@telenet.be>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -575,8 +576,8 @@ for more information.")))
        #:builder
        ,#~(begin
             (use-modules (guix build utils))
-            (let ((bin (string-append (assoc-ref %outputs "out") "/bin"))
-                  (python (string-append (assoc-ref %build-inputs "python") "/bin/")))
+            (let ((bin (string-append #$output "/bin"))
+                  (python #$(file-append (this-package-input "python") "/bin/")))
               (mkdir-p bin)
               (for-each
                (lambda (old new)
@@ -586,8 +587,7 @@ for more information.")))
                `("python"  ,"pydoc"  ,"idle"  ,"pip"))
               ;; python-config outputs search paths based upon its location,
               ;; use a bash wrapper to avoid changing its outputs.
-              (let ((bash (string-append (assoc-ref %build-inputs "bash")
-                                         "/bin/bash"))
+              (let ((bash #$(file-append (this-package-input "bash") "/bin/bash"))
                     (old  (string-append python "python3-config"))
                     (new  (string-append bin "/python-config")))
                 (with-output-to-file new
-- 
2.32.0
M
M
Maxime Devos wrote on 18 Jun 2021 18:09
[[PATCH v2 core-updates] 27/37] fontconfig: Make the #:configure-flags argument a G-expression.
(address . 49025@debbugs.gnu.org)
20210618160936.18972-27-maximedevos@telenet.be
This allows using #$(this-package-input ...) later.

* gnu/packages/fontutils.scm
(fontconfig)[arguments]<#:configure-flags>: Make this a
G-expression instead of a raw S-expression.
(fontconfig-with-documentation)[arguments]<#:configure-flags>: Likewise.
---
gnu/packages/fontutils.scm | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)

Toggle diff (31 lines)
diff --git a/gnu/packages/fontutils.scm b/gnu/packages/fontutils.scm
index dbce5beba8..234f11129a 100644
--- a/gnu/packages/fontutils.scm
+++ b/gnu/packages/fontutils.scm
@@ -64,6 +64,7 @@
   #:use-module (gnu packages xorg)
   #:use-module (gnu packages tex)
   #:use-module ((guix licenses) #:prefix license:)
+  #:use-module (guix gexp)
   #:use-module (guix packages)
   #:use-module (guix download)
   #:use-module (guix svn-download)
@@ -347,6 +348,7 @@ Font Format (WOFF).")
         ("python" ,python-minimal)))    ;to avoid a cycle through tk
      (arguments
       `(#:configure-flags
+        ,#~
         (list "--disable-docs"
               "--with-cache-dir=/var/cache/fontconfig"
               ;; register the default fonts
@@ -400,7 +402,7 @@ high quality, anti-aliased and subpixel rendered text on a display.")
     (arguments
      (substitute-keyword-arguments (package-arguments fontconfig)
        ((#:configure-flags configure-flags)
-        `(delete "--disable-docs" ,configure-flags))
+        #~(delete "--disable-docs" #$configure-flags))
        ((#:phases phases '%standard-phases)
         `(modify-phases ,phases
            (add-after 'install 'move-man-sections
-- 
2.32.0
M
M
Maxime Devos wrote on 18 Jun 2021 18:18
Re: [[PATCH v2 core-updates] 01/37] utils: Define target-linux? predicate.
(address . 49025@debbugs.gnu.org)(address . othacehe@gnu.org)
80a252fbb3d4181eb15142eac2dbd7b7b9ad560a.camel@telenet.be
Toggle quote (2 lines)
> [[PATCH v2 core-updates] 01/37] utils: Define target-linux? predicate.

Oops --subject-prefix doesn't work as I thought it does.
I'll send a v3.
-----BEGIN PGP SIGNATURE-----

iI0EABYKADUWIQTB8z7iDFKP233XAR9J4+4iGRcl7gUCYMzHUxccbWF4aW1lZGV2
b3NAdGVsZW5ldC5iZQAKCRBJ4+4iGRcl7mUcAQCVpMHXxcfbQM2ril8GkgEHC4po
wuuapOmR4QlW0pKaTAD+J6aFcZz+TkK0a5SD6Qa9k+eBTlEfzJsGMtPerr9Apw8=
=gHS6
-----END PGP SIGNATURE-----


M
M
Maxime Devos wrote on 18 Jun 2021 19:15
[PATCH v3 core-updates 01/37] utils: Define target-linux? predicate.
(address . 49025@debbugs.gnu.org)
20210618171631.20534-1-maximedevos@telenet.be
* guix/utils.scm (target-linux?): New predicate.
* tests/utils.scm
("target-linux?"): Test it.
("target-mingw?"): Also test ‘target-mingw?’.
---
guix/utils.scm | 6 ++++++
tests/utils.scm | 17 +++++++++++++++++
2 files changed, 23 insertions(+)

Toggle diff (68 lines)
diff --git a/guix/utils.scm b/guix/utils.scm
index 19990ceb8a..4ff2602e23 100644
--- a/guix/utils.scm
+++ b/guix/utils.scm
@@ -11,6 +11,7 @@
 ;;; Copyright © 2020 Maxim Cournoyer <maxim.cournoyer@gmail.com>
 ;;; Copyright © 2021 Simon Tournier <zimon.toutoune@gmail.com>
 ;;; Copyright © 2021 Chris Marusich <cmmarusich@gmail.com>
+;;; Copyright © 2021 Maxime Devos <maximedevos@telenet.be>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -81,6 +82,7 @@
             %current-system
             %current-target-system
             package-name->name+version
+            target-linux?
             target-mingw?
             target-arm32?
             target-aarch64?
@@ -543,6 +545,10 @@ a character other than '@'."
     (idx (values (substring spec 0 idx)
                  (substring spec (1+ idx))))))
 
+(define* (target-linux? #:optional (target (or (%current-target-system)
+                                               (%current-system))))
+  (string-contains target "linux"))
+
 (define* (target-mingw? #:optional (target (%current-target-system)))
   (and target
        (string-suffix? "-mingw32" target)))
diff --git a/tests/utils.scm b/tests/utils.scm
index 7fcbb25552..80a0e669a4 100644
--- a/tests/utils.scm
+++ b/tests/utils.scm
@@ -3,6 +3,7 @@
 ;;; Copyright © 2014 Eric Bavier <bavier@member.fsf.org>
 ;;; Copyright © 2016 Mathieu Lirzin <mthl@gnu.org>
 ;;; Copyright © 2021 Simon Tournier <zimon.toutoune@gmail.com>
+;;; Copyright © 2021 Maxime Devos <maximedevos@telenet.be>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -289,6 +290,22 @@ skip these tests."
    (string-closest "hello" '("kikoo" "helo" "hihihi" "halo"))
    (string-closest "hello" '("aaaaa" "12345" "hellohello" "h"))))
 
+(test-equal "target-linux?"
+  '(#t #f #f #t)
+  (map (compose ->bool target-linux?)
+       '("i686-linux-gnu" "i686-w64-mingw32"
+         ;; Checking that "gnu" is present is not sufficient,
+         ;; as GNU/Hurd exists.
+         "i686-pc-gnu"
+         ;; Some targets have a suffix.
+         "arm-linux-gnueabihf")))
+
+(test-equal "target-mingw?"
+  '(#f #f #t)
+  (map (compose ->bool target-mingw?)
+       '("i686-linux-gnu" "i686-pc-gnu"
+         "i686-w64-mingw32")))
+
 (test-end)
 
 (false-if-exception (delete-file temp-file))
-- 
2.32.0
M
M
Maxime Devos wrote on 18 Jun 2021 19:15
[PATCH v3 core-updates 04/37] net-base: Make #:builder argument a G-expression.
(address . 49025@debbugs.gnu.org)
20210618171631.20534-4-maximedevos@telenet.be
This allows using ungexp-native and this-package-native-input later.

* gnu/packages/admin.scm (net-base)[arguments]{#:builder}: Make this
a G-expression.
---
gnu/packages/admin.scm | 39 ++++++++++++++++++++-------------------
1 file changed, 20 insertions(+), 19 deletions(-)

Toggle diff (59 lines)
diff --git a/gnu/packages/admin.scm b/gnu/packages/admin.scm
index 531686fdbb..5c7e41f51b 100644
--- a/gnu/packages/admin.scm
+++ b/gnu/packages/admin.scm
@@ -74,6 +74,7 @@
   #:use-module ((guix licenses) #:prefix license:)
   #:use-module (guix packages)
   #:use-module (guix utils)
+  #:use-module (guix gexp)
   #:use-module (gnu packages)
   #:use-module (gnu packages algebra)
   #:use-module (gnu packages autogen)
@@ -936,25 +937,25 @@ to allow automatic login and starting any app.")
     (build-system trivial-build-system)
     (arguments
      `(#:modules ((guix build utils))
-       #:builder (begin
-                   (use-modules (guix build utils)
-                                (srfi srfi-26))
-
-                   (let* ((source (assoc-ref %build-inputs "source"))
-                          (tar    (assoc-ref %build-inputs "tar"))
-                          (xz     (assoc-ref %build-inputs "xz"))
-                          (output (assoc-ref %outputs "out"))
-                          (etc    (string-append output "/etc")))
-                     (setenv "PATH" (string-append xz "/bin"))
-                     (invoke (string-append tar "/bin/tar") "xvf"
-                             source)
-                     (chdir ,(string-append "netbase-" version))
-                     (mkdir-p etc)
-                     (for-each copy-file
-                               '("etc-services" "etc-protocols" "etc-rpc")
-                               (map (cut string-append etc "/" <>)
-                                    '("services" "protocols" "rpc")))
-                     #t))))
+       #:builder ,#~(begin
+                      (use-modules (guix build utils)
+                                   (srfi srfi-26))
+
+                      (let* ((source (assoc-ref %build-inputs "source"))
+                             (tar    (assoc-ref %build-inputs "tar"))
+                             (xz     (assoc-ref %build-inputs "xz"))
+                             (output (assoc-ref %outputs "out"))
+                             (etc    (string-append output "/etc")))
+                        (setenv "PATH" (string-append xz "/bin"))
+                        (invoke (string-append tar "/bin/tar") "xvf"
+                                source)
+                        (chdir #$(string-append "netbase-" version))
+                        (mkdir-p etc)
+                        (for-each copy-file
+                                  '("etc-services" "etc-protocols" "etc-rpc")
+                                  (map (cut string-append etc "/" <>)
+                                       '("services" "protocols" "rpc")))
+                        #t))))
     (native-inputs `(("tar" ,tar)
                      ("xz" ,xz)))
     (synopsis "IANA protocol, port, and RPC number assignments")
-- 
2.32.0
M
M
Maxime Devos wrote on 18 Jun 2021 19:15
[PATCH v3 core-updates 02/37] utils: Define a target-x86-32? and target-x86-64? predicate.
(address . 49025@debbugs.gnu.org)
20210618171631.20534-2-maximedevos@telenet.be
* guix/utils.scm (target-x86-32?, target-x86-64?): New predicates.
* tests/utils.scm ("target-x86-32?", "target-x86-64?"): New tests.
---
guix/utils.scm | 20 ++++++++++++++++++++
tests/utils.scm | 23 +++++++++++++++++++++++
2 files changed, 43 insertions(+)

Toggle diff (74 lines)
diff --git a/guix/utils.scm b/guix/utils.scm
index 4ff2602e23..2256ea2ca6 100644
--- a/guix/utils.scm
+++ b/guix/utils.scm
@@ -84,6 +84,8 @@
             package-name->name+version
             target-linux?
             target-mingw?
+            target-x86-32?
+            target-x86-64?
             target-arm32?
             target-aarch64?
             target-arm?
@@ -553,6 +555,24 @@ a character other than '@'."
   (and target
        (string-suffix? "-mingw32" target)))
 
+(define* (target-x86-32? #:optional (target (or (%current-target-system)
+                                                (%current-system))))
+  "Is the architecture of TARGET a variant of Intel's 32-bit architecture
+(IA32)?"
+  ;; Intel also has a 16-bit architecture in the iN86 series, i286
+  ;; (see, e.g. https://en.wikipedia.org/wiki/Intel/808286) so this
+  ;; procedure is not named target-x86?.
+  (or (string-prefix? "i386-" target)
+      (string-prefix? "i486-" target)
+      (string-prefix? "i586-" target)
+      (string-prefix? "i686-" target)))
+
+(define* (target-x86-64? #:optional (target (or (%current-target-system)
+                                                 (%current-system))))
+  "Is the architecture of TARGET a variant of Intel/AMD's 64-bit
+architecture (x86_64)?"
+  (string-prefix? "x86_64-" target))
+
 (define* (target-arm32? #:optional (target (or (%current-target-system)
                                                (%current-system))))
   (string-prefix? "arm" target))
diff --git a/tests/utils.scm b/tests/utils.scm
index 80a0e669a4..92439b5587 100644
--- a/tests/utils.scm
+++ b/tests/utils.scm
@@ -306,6 +306,29 @@ skip these tests."
        '("i686-linux-gnu" "i686-pc-gnu"
          "i686-w64-mingw32")))
 
+(test-equal "target-x86-32?"
+  '(#f #f #f #t #t #t #t #f)
+  ;; These are (according to Wikipedia) two RISC architectures
+  ;; by Intel and presumably not compatible with the x86-32 series.
+  (map target-x86-32?
+       '("i860-gnu" "i960-gnu"
+         ;; This is a 16-bit architecture
+         "i286-gnu"
+         ;; These are part of the x86-32 series.
+         "i386-gnu" "i486-gnu" "i586-gnu" "i686-gnu"
+         ;; Maybe this one will exist some day, but not yet.
+         "i786-gnu")))
+
+(test-equal "target-x86-64?"
+  '(#t #f #f #f)
+  (map target-x86-64?
+       `("x86_64-linux-gnu" "i386-linux-gnu"
+         ;; Just because it includes "64" doesn't make it 64-bit.
+         "aarch64-linux-gnu"
+         ;; Note that (expt 2 109) in decimal notation starts with 64.
+         ;; However, it isn't 32-bit.
+         ,(format #f "x86_~a-linux-gnu" (expt 2 109)))))
+
 (test-end)
 
 (false-if-exception (delete-file temp-file))
-- 
2.32.0
M
M
Maxime Devos wrote on 18 Jun 2021 19:15
[PATCH v3 core-updates 05/37] net-base: Fix cross-compilation, eliminating %build-inputs & friends
(address . 49025@debbugs.gnu.org)
20210618171631.20534-5-maximedevos@telenet.be
"source" is not in %build-inputs when cross-compiling, so another
approach for referring to the package source code is needed.

* gnu/packages/admin.scm (net-base)[arguments]<#:builder>: Eliminate
%build-inputs and %outputs.
---
gnu/packages/admin.scm | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)

Toggle diff (21 lines)
diff --git a/gnu/packages/admin.scm b/gnu/packages/admin.scm
index 5c7e41f51b..f499a1252b 100644
--- a/gnu/packages/admin.scm
+++ b/gnu/packages/admin.scm
@@ -941,10 +941,10 @@ to allow automatic login and starting any app.")
                       (use-modules (guix build utils)
                                    (srfi srfi-26))
 
-                      (let* ((source (assoc-ref %build-inputs "source"))
-                             (tar    (assoc-ref %build-inputs "tar"))
-                             (xz     (assoc-ref %build-inputs "xz"))
-                             (output (assoc-ref %outputs "out"))
+                      (let* ((source #+(package-source this-package))
+                             (tar    #+(this-package-native-input "tar"))
+                             (xz     #+(this-package-native-input "xz"))
+                             (output #$output)
                              (etc    (string-append output "/etc")))
                         (setenv "PATH" (string-append xz "/bin"))
                         (invoke (string-append tar "/bin/tar") "xvf"
-- 
2.32.0
M
M
Maxime Devos wrote on 18 Jun 2021 19:16
[PATCH v3 core-updates 06/37] net-base: Don't cross-compile.
(address . 49025@debbugs.gnu.org)
20210618171631.20534-6-maximedevos@telenet.be
net-base is pure data, so cross-compiling is pointless.

* gnu/packages/admin.scm
(net-base)[arguments]<#:target>: Set to #f.
(net-base)[arguments]<#:allowed-references>: Disallow all
references.
---
gnu/packages/admin.scm | 5 +++++
1 file changed, 5 insertions(+)

Toggle diff (18 lines)
diff --git a/gnu/packages/admin.scm b/gnu/packages/admin.scm
index f499a1252b..5e41ba9967 100644
--- a/gnu/packages/admin.scm
+++ b/gnu/packages/admin.scm
@@ -937,6 +937,11 @@ to allow automatic login and starting any app.")
     (build-system trivial-build-system)
     (arguments
      `(#:modules ((guix build utils))
+       ;; This package consists solely of architecture-independent
+       ;; tables. Cross-compilation is pointless! Make sure we'll
+       ;; always get the same derivation.
+       #:target #f
+       #:allowed-references ()
        #:builder ,#~(begin
                       (use-modules (guix build utils)
                                    (srfi srfi-26))
-- 
2.32.0
M
M
Maxime Devos wrote on 18 Jun 2021 19:16
[PATCH v3 core-updates 07/37] tzdata: Don't bother with cross-compiling.
(address . 49025@debbugs.gnu.org)
20210618171631.20534-7-maximedevos@telenet.be
The time zone database is architecture-independent,
so trying to cross-compile it is pointless!

* gnu/packages/base.scm
(tzdata)[arguments]<#:target>: Set to #f.
(tzdata)[allowed-references]: Only include the "out" output itself,
to make sure no (architecture-dependent) binaries are installed.
---
gnu/packages/base.scm | 9 +++++++++
1 file changed, 9 insertions(+)

Toggle diff (29 lines)
diff --git a/gnu/packages/base.scm b/gnu/packages/base.scm
index d30299a7b6..2674be8048 100644
--- a/gnu/packages/base.scm
+++ b/gnu/packages/base.scm
@@ -17,6 +17,7 @@
 ;;; Copyright © 2020 Vitaliy Shatrov <D0dyBo0D0dyBo0@protonmail.com>
 ;;; Copyright © 2020 Chris Marusich <cmmarusich@gmail.com>
 ;;; Copyright © 2021 Leo Le Bouter <lle-bout@zaclys.net>
+;;; Copyright © 2021 Maxime Devos <maximedevos@telenet.be>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -1251,6 +1252,14 @@ command.")
     (build-system gnu-build-system)
     (arguments
      `(#:tests? #f
+       ;; This consists purely of (architecture-independent) data,
+       ;; so ‘cross-compilation’ is pointless here!
+       ;; (The binaries zic, dump, and tzselect are deleted in the post-install
+       ;; phase.)
+       #:target #f
+       ;; share/zoneinfo/posix is a symlink to share/zoneinfo,
+       ;; so include the package itself in #:allowed-references.
+       #:allowed-references ("out")
        #:make-flags (let ((out (assoc-ref %outputs "out"))
                           (tmp (getenv "TMPDIR")))
                       (list (string-append "TOPDIR=" out)
-- 
2.32.0
M
M
Maxime Devos wrote on 18 Jun 2021 19:16
[PATCH v3 core-updates 08/37] libgpg-error: Remove trailing #f from phases.
(address . 49025@debbugs.gnu.org)
20210618171631.20534-8-maximedevos@telenet.be
These aren't required anymore.

* gnu/packages/gnupg.scm (libgpgerror)[arguments]{cross-symlinks}:
Remove trailing #f.
---
gnu/packages/gnupg.scm | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)

Toggle diff (16 lines)
diff --git a/gnu/packages/gnupg.scm b/gnu/packages/gnupg.scm
index cb481b38e1..2f44e6ec6a 100644
--- a/gnu/packages/gnupg.scm
+++ b/gnu/packages/gnupg.scm
@@ -114,8 +114,7 @@
                            (string-append x "-unknown-linux-gnu")))))
                    (symlink
                     (string-append "lock-obj-pub." triplet ".h")
-                    "src/syscfg/lock-obj-pub.linux-gnu.h"))
-                 #t))))
+                    "src/syscfg/lock-obj-pub.linux-gnu.h"))))))
          '()))
     (native-inputs `(("gettext" ,gettext-minimal)))
     (home-page "https://gnupg.org")
-- 
2.32.0
M
M
Maxime Devos wrote on 18 Jun 2021 19:15
[PATCH v3 core-updates 03/37] packages: Define this-package-input and this-package-native-input.
(address . 49025@debbugs.gnu.org)
20210618171631.20534-3-maximedevos@telenet.be
These macros are intended to be used in build phases.
More precisely, (assoc-ref %build-inputs "input") can be
replaced by #$(this-package-input "input") or #+(this-package-native-input
"native-input") as appropriate.

* guix/packages.scm
(package-input, package-native-input): New (unexported) procedures.
(this-package-input, this-package-native-input): New macros.
---
guix/packages.scm | 29 +++++++++++++++++++++++++++++
tests/packages.scm | 34 ++++++++++++++++++++++++++++++++++
2 files changed, 63 insertions(+)

Toggle diff (101 lines)
diff --git a/guix/packages.scm b/guix/packages.scm
index a66dbea1b7..80c8bbebf0 100644
--- a/guix/packages.scm
+++ b/guix/packages.scm
@@ -108,6 +108,9 @@
             deprecated-package
             package-field-location
 
+            this-package-input
+            this-package-native-input
+
             package-direct-sources
             package-transitive-sources
             package-direct-inputs
@@ -513,6 +516,32 @@ object."
         #f)))
     (_ #f)))
 
+(define (package-input package name)
+  "Return the package input NAME of PACKAGE--i.e., an input
+from the ‘inputs’ or ‘propagated-inputs’ field.  Native inputs are not
+considered.  If this input does not exist, return #f instead."
+  (and=> (or (assoc-ref (package-inputs package) name)
+             (assoc-ref (package-propagated-inputs package) name))
+         car))
+
+(define (package-native-input package name)
+  "Return the native package input NAME of PACKAGE--i.e., an input
+from the ‘native-inputs’ field. If this native input does not exist,
+return #f instead."
+  (and=> (assoc-ref (package-native-inputs package) name)
+         car))
+
+(define-syntax-rule (this-package-input name)
+  "Return the input NAME of the package being defined--i.e., an input
+from the ‘inputs’ or ‘propagated-inputs’ field.  Native inputs are not
+considered.  If this input does not exist, return #f instead."
+  (package-input this-package name))
+
+(define-syntax-rule (this-package-native-input name)
+  "Return the native package input NAME of the package being defined--i.e.,
+an input from the ‘native-inputs’ field.  If this native input does not
+exist, return #f instead."
+  (package-native-input this-package name))
 
 ;; Error conditions.
 
diff --git a/tests/packages.scm b/tests/packages.scm
index 47d10af5bc..91ec38e4cc 100644
--- a/tests/packages.scm
+++ b/tests/packages.scm
@@ -2,6 +2,7 @@
 ;;; Copyright © 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
 ;;; Copyright © 2021 Maxim Cournoyer <maxim.cournoyer@gmail.com>
+;;; Copyright © 2021 Maxime Devos <maximedevos@telenet.be>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -1851,6 +1852,39 @@
   (package-location (specification->package "guile@2"))
   (specification->location "guile@2"))
 
+(test-eq "this-package-input, exists"
+  hello
+  (package-arguments
+   (dummy-package "a"
+     (inputs `(("hello" ,hello)))
+     (arguments (this-package-input "hello")))))
+
+(test-eq "this-package-input, exists in propagated-inputs"
+  hello
+  (package-arguments
+   (dummy-package "a"
+     (propagated-inputs `(("hello" ,hello)))
+     (arguments (this-package-input "hello")))))
+
+(test-eq "this-package-input, does not exist"
+  #f
+  (package-arguments
+   (dummy-package "a"
+     (arguments (this-package-input "hello")))))
+
+(test-eq "this-package-native-input, exists"
+  hello
+  (package-arguments
+   (dummy-package "a"
+     (native-inputs `(("hello" ,hello)))
+     (arguments (this-package-native-input "hello")))))
+
+(test-eq "this-package-native-input, does not exists"
+  #f
+  (package-arguments
+   (dummy-package "a"
+     (arguments (this-package-native-input "hello")))))
+
 (test-end "packages")
 
 ;;; Local Variables:
-- 
2.32.0
M
M
Maxime Devos wrote on 18 Jun 2021 19:16
[PATCH v3 core-updates 09/37] libgpg-error: Prevent silent miscompilation some systems.
(address . 49025@debbugs.gnu.org)
20210618171631.20534-9-maximedevos@telenet.be
* gnu/packages/gpg.scm
(libgpgerror)[arguments]<#:phases>{cross-symlinks}: Only
link to src/syscfg/lock-obj-pub.linux-gnu.h if the package
is being compiled for a Linux target. Do not link either
if the architecture is unknown, as the headers vary with
the architecture.
---
gnu/packages/gnupg.scm | 40 ++++++++++++++++++++++++++--------------
1 file changed, 26 insertions(+), 14 deletions(-)

Toggle diff (74 lines)
diff --git a/gnu/packages/gnupg.scm b/gnu/packages/gnupg.scm
index 2f44e6ec6a..de213d381f 100644
--- a/gnu/packages/gnupg.scm
+++ b/gnu/packages/gnupg.scm
@@ -18,6 +18,7 @@
 ;;; Copyright © 2018 Björn Höfling <bjoern.hoefling@bjoernhoefling.de>
 ;;; Copyright © 2019 Mathieu Othacehe <m.othacehe@gmail.com>
 ;;; Copyright © 2020 Fredrik Salomonsson <plattfot@posteo.net>
+;;; Copyright © 2021 Maxime Devos <maximedevos@telenet.be>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -77,6 +78,7 @@
   #:use-module (guix build-system gnu)
   #:use-module (guix build-system perl)
   #:use-module (guix build-system python)
+  #:use-module (ice-9 match)
   #:use-module (srfi srfi-1))
 
 (define-public libgpg-error
@@ -94,27 +96,37 @@
     (build-system gnu-build-system)
     (arguments
      (if (%current-target-system)
-         `(#:modules ((ice-9 match)
-                      (guix build gnu-build-system)
+         `(#:modules ((guix build gnu-build-system)
                       (guix build utils))
            #:phases
            (modify-phases %standard-phases
              ;; When cross-compiling, some platform specific properties cannot
              ;; be detected. Create a symlink to the appropriate platform
-             ;; file. See Cross-Compiling section at:
+             ;; file if required. Note that these platform files depend on
+             ;; both the operating system and architecture!
+             ;;
+             ;; See Cross-Compiling section at:
              ;; https://github.com/gpg/libgpg-error/blob/master/README
              (add-after 'unpack 'cross-symlinks
-               (lambda* (#:key target inputs #:allow-other-keys)
-                 (let ((triplet
-                        (match (string-take target
-                                            (string-index target #\-))
-                          ("armhf" "arm-unknown-linux-gnueabi")
-                          ("mips64el" "mips-unknown-linux-gnu")
-                          (x
-                           (string-append x "-unknown-linux-gnu")))))
-                   (symlink
-                    (string-append "lock-obj-pub." triplet ".h")
-                    "src/syscfg/lock-obj-pub.linux-gnu.h"))))))
+               (lambda _
+                 (define (link triplet source)