[PATCH] build-system: copy: Fix cross-compilation.

  • Open
  • quality assurance status badge
Details
2 participants
  • dan
  • Ludovic Courtès
Owner
unassigned
Submitted by
dan
Severity
normal
D
(address . guix-patches@gnu.org)
20a614ca2a6064bfa597cd11b7b87ceb926de866.1713682643.git.i@dan.games
* guix/build-system/copy.scm (lower): Change arguments passed to host-inputs
and build-inputs.

Change-Id: I2991854b48587ab00ccc03712304e2850727e6b7
---

This patch tries to fix a issue related to grafting when cross-compiling.
See https://issues.guix.gnu.org/66866for more discussion.

guix/build-system/copy.scm | 15 ++++++++-------
1 file changed, 8 insertions(+), 7 deletions(-)

Toggle diff (37 lines)
diff --git a/guix/build-system/copy.scm b/guix/build-system/copy.scm
index d58931b33c..64bd61a53f 100644
--- a/guix/build-system/copy.scm
+++ b/guix/build-system/copy.scm
@@ -3,6 +3,7 @@
;;; Copyright © 2020 Pierre Neidhardt <mail@ambrevar.xyz>
;;; Copyright © 2021, 2022 Ludovic Courtès <ludo@gnu.org>
;;; Copyright © 2023 Jonathan Brielmaier <jonathan.brielmaier@web.de>
+;;; Copyright © 2024 dan <i@dan.games>
;;;
;;; This file is part of GNU Guix.
;;;
@@ -66,13 +67,13 @@ (define* (lower name
(bag
(name name)
(system system)
- (host-inputs `(,@(if source
- `(("source" ,source))
- '())
- ,@inputs
- ;; Keep the standard inputs of 'gnu-build-system'.
- ,@(standard-packages)))
- (build-inputs native-inputs)
+ (build-inputs `(,@(if source
+ `(("source" ,source))
+ '())
+ ,@inputs
+ ,@native-inputs
+ ;; Keep the standard inputs of 'gnu-build-system'.
+ ,@(standard-packages)))
(outputs outputs)
(build copy-build)
(arguments (strip-keyword-arguments private-keywords arguments))))

base-commit: 38b88d710ea13ba024aed0543bc2862772cdb645
--
2.41.0
L
L
Ludovic Courtès wrote 2 days ago
Re: bug#66866: Grafting breaks cross-compilation
(name . dan)(address . i@dan.games)
8734r143fv.fsf_-_@gnu.org
Hi,

dan <i@dan.games> skribis:

Toggle quote (34 lines)
> I spent some time digging into the rabbit hole. After changing
> the lower function of the copy-build-system to look more like the
> lower function of the gnu-build-system, I'm able to cross compile
> alsa-lib without the --no-grafts flag. The changes I made are
> like:
>
> diff --git a/guix/build-system/copy.scm
> b/guix/build-system/copy.scm
> index d58931b33c..74304b4bfb 100644
> --- a/guix/build-system/copy.scm
> +++ b/guix/build-system/copy.scm
> @@ -66,13 +66,13 @@ (define* (lower name
> (bag
> (name name)
> (system system)
> - (host-inputs `(,@(if source
> + (build-inputs `(,@(if source
> `(("source" ,source))
> '())
> - ,@inputs
> + ,@native-inputs
> ;; Keep the standard inputs of
> 'gnu-build-system'.
> ,@(standard-packages)))
> - (build-inputs native-inputs)
> + (host-inputs inputs)
> (outputs outputs)
> (build copy-build)
> (arguments (strip-keyword-arguments private-keywords
> arguments))))
>
> Can we put everything inside build-inputs? From my understanding,
> copy-build-system shouldn't care about cross-compilation at all.

Intuitively, if ‘copy-build-system’ is about copying
architecture-independent files, then it should do the same thing whether
or not we are cross-compiling.

However, users can and do add phases whose result is
architecture-dependent. Small sample:

• ‘desec-certbot-hook’ captures a reference to curl, so it would get
the wrong one when cross-compiling if we assumed build-inputs =
host-inputs.

• ‘chez-scheme-for-racket-bootstrap-bootfiles’ builds stuff when
cross-compiling. Philip, could you explain the intent and what you
expect here?

So it would seem we can’t just assume everything is a native input like

Now, as David and you found out, the use of inputs in
build-system/copy.scm:lower is bogus. It seems that it can be fixed by
following the intended definition of build/host inputs, as David
suggested:
Toggle diff (23 lines)
diff --git a/guix/build-system/copy.scm b/guix/build-system/copy.scm
index d58931b33c2..cf0214320bf 100644
--- a/guix/build-system/copy.scm
+++ b/guix/build-system/copy.scm
@@ -66,13 +66,13 @@ (define* (lower name
(bag
(name name)
(system system)
- (host-inputs `(,@(if source
+ (build-inputs `(,@(if source
`(("source" ,source))
'())
- ,@inputs
- ;; Keep the standard inputs of 'gnu-build-system'.
- ,@(standard-packages)))
- (build-inputs native-inputs)
+ ,@native-inputs
+ ;; Keep the standard inputs of 'gnu-build-system'.
+ ,@(standard-packages)))
+ (host-inputs inputs)
(outputs outputs)
(build copy-build)
(arguments (strip-keyword-arguments private-keywords arguments))))
But wait! That’s all theoretical because the bag always has (target #f)
and ‘copy-build’ bundles build and host inputs together, as if doing a
native build.

So it seems like https://issues.guix.gnu.org/70492(putting everything
in ‘build-inputs’) is OK, after all.

But still, there seem to be some expectation that ‘copy-build-system’
can support cross-compilation for real, so maybe we should add a
‘copy-cross-build’ procedure in addition to the patch above.

Thoughts?

Ludo’.
?