unzip fails to cross-compile

  • Done
  • quality assurance status badge
Details
3 participants
  • Andrew Patterson
  • Maxime Devos
  • Tobias Geerinckx-Rice
Owner
unassigned
Submitted by
Andrew Patterson
Severity
normal
A
A
Andrew Patterson wrote on 11 Aug 2022 00:06
(address . bug-guix@gnu.org)
87y1vvoecx.fsf@gmail.com
unzip fails to build when cross-compiling (at least from x86_64
linux), complaining that '%output' is unbound. It gives identical
errors when compiling for aarch64, riscv64, and arm.
Interestingly, it gives the same errors when explicitly building
for x86_64 on an x86_64 machine, even though I would expect doing
so to compile as normal. When not cross-compiling, unzip
successfully builds as normal on both x86_64 and aarch64.

On my x86_64 machines, 'guix show unzip' does only have
x86_64-linux and i686-linux in the 'systems' list, but that's also
true of htop, which does cross-compile. (Also, why does it do
that? The same command on my aarch64 machine shows many more
system types.)

I'm working on testing if cross-compiling from aarch64 does the
same thing, but building a cross-compilation toolchain on pinebook
pro is very slow.

Steps to reproduce: run 'guix build unzip --target=$TARGET'

Here's the build log from 'guix build unzip
--target=aarch64-linux-gnu':
WARNING: (guile-user): imported module (guix build utils) overrides core binding `delete'
Backtrace:
In ice-9/eval.scm:
217:50 19 (lp (#<procedure 7ffff4b64c00 at ice-9/eval.scm:282:?> ?))
217:50 18 (lp (#<procedure 7ffff4b64ba0 at ice-9/eval.scm:649:?> ?))
217:50 17 (lp (#<procedure 7ffff4b64b80 at ice-9/eval.scm:282:?> ?))
217:50 16 (lp (#<procedure 7ffff4b64b60 at ice-9/eval.scm:282:?> ?))
217:50 15 (lp (#<procedure 7ffff4b64b40 at ice-9/eval.scm:282:?> ?))
217:50 14 (lp (#<procedure 7ffff4b64b20 at ice-9/eval.scm:282:?> ?))
217:50 13 (lp (#<procedure 7ffff4b64b00 at ice-9/eval.scm:282:?> ?))
217:50 12 (lp (#<procedure 7ffff4b64980 at ice-9/eval.scm:649:?> ?))
217:50 11 (lp (#<procedure 7ffff4b64960 at ice-9/eval.scm:282:?> ?))
217:50 10 (lp (#<procedure 7ffff4b64940 at ice-9/eval.scm:282:?> ?))
217:50 9 (lp (#<procedure 7ffff4b64920 at ice-9/eval.scm:282:?> ?))
217:50 8 (lp (#<procedure 7ffff4b648c0 at ice-9/eval.scm:649:?> ?))
217:50 7 (lp (#<procedure 7ffff4b648a0 at ice-9/eval.scm:282:?> ?))
217:50 6 (lp (#<procedure 7ffff4b64880 at ice-9/eval.scm:282:?> ?))
217:50 5 (lp (#<procedure 7ffff4b64860 at ice-9/eval.scm:282:?> ?))
217:33 4 (lp (#<procedure 7ffff5fe9480 at ice-9/eval.scm:212:?> ?))
213:45 3 (_ #f)
196:43 2 (_ #f)
223:20 1 (proc #<directory (guile-user) 7ffff5fdbc80>)
In unknown file:
0 (%resolve-variable (7 . %output) #<directory (guile-use?>)

ERROR: In procedure %resolve-variable:
Unbound variable: %output
--
Andrew Patterson
A
A
Andrew Patterson wrote on 11 Aug 2022 02:45
(address . 57127@debbugs.gnu.org)
87r11nob96.fsf@gmail.com
Cross-compiling to x86_64 on aarch64 failed the same way. Log
below:
WARNING: (guile-user): imported module (guix build utils) overrides core binding `delete'
Backtrace:
In ice-9/eval.scm:
217:50 19 (lp (#<procedure 7d93a0 at ice-9/eval.scm:282:4 (env)> ?))
217:50 18 (lp (#<procedure 7d9340 at ice-9/eval.scm:649:6 (env)> ?))
217:50 17 (lp (#<procedure 7d9320 at ice-9/eval.scm:282:4 (env)> ?))
217:50 16 (lp (#<procedure 7d9300 at ice-9/eval.scm:282:4 (env)> ?))
217:50 15 (lp (#<procedure 7d92e0 at ice-9/eval.scm:282:4 (env)> ?))
217:50 14 (lp (#<procedure 7d92c0 at ice-9/eval.scm:282:4 (env)> ?))
217:50 13 (lp (#<procedure 7d92a0 at ice-9/eval.scm:282:4 (env)> ?))
217:50 12 (lp (#<procedure 7d9120 at ice-9/eval.scm:649:6 (env)> ?))
217:50 11 (lp (#<procedure 7d9100 at ice-9/eval.scm:282:4 (env)> ?))
217:50 10 (lp (#<procedure 7d90e0 at ice-9/eval.scm:282:4 (env)> ?))
217:50 9 (lp (#<procedure 7d90c0 at ice-9/eval.scm:282:4 (env)> ?))
217:50 8 (lp (#<procedure 7d9060 at ice-9/eval.scm:649:6 (env)> ?))
217:50 7 (lp (#<procedure 7d9040 at ice-9/eval.scm:282:4 (env)> ?))
217:50 6 (lp (#<procedure 7d9020 at ice-9/eval.scm:282:4 (env)> ?))
217:50 5 (lp (#<procedure 7d9000 at ice-9/eval.scm:282:4 (env)> ?))
217:33 4 (lp (#<procedure 6044c0 at ice-9/eval.scm:212:12 (en?> ?))
213:45 3 (_ #f)
196:43 2 (_ #f)
223:20 1 (proc #<directory (guile-user) 5ebc80>)
In unknown file:
0 (%resolve-variable (7 . %output) #<directory (guile-use?>)

ERROR: In procedure %resolve-variable:
Unbound variable: %output
--
Andrew Patterson
M
M
Maxime Devos wrote on 11 Aug 2022 10:48
Re: bug#57127: unzip fails to cross-compile
370176aa-d981-bcc1-05bc-70e3bd1b7bcd@telenet.be
On 11-08-2022 00:06, Andrew Patterson wrote:
Toggle quote (2 lines)
> unzip fails to build when cross-compiling (at least from x86_64
> linux), complaining that '%output' is unbound.
Change #:make-flags to use a G-exp instead of a S-exp and replace the
undocumented %output by the #$output.
For consistency, you can do the same for #:phases.
For simplicity, I recommend not using ` for argument but 'list':
(arguments (list #:phases #~(modify-phases ...) #:make-flags #~(list ...))).
Toggle quote (4 lines)
>   It gives identical errors when compiling for aarch64, riscv64, and
> arm. Interestingly, it gives the same errors when explicitly building
> for x86_64 on an x86_64 machine, even though I would expect doing so
> to compile as normal.
Technically that's cross-compilation from Guix perspective, though maybe
it should just compile natively in that case.
Toggle quote (4 lines)
> On my x86_64 machines, 'guix show unzip' does only have x86_64-linux
> and i686-linux in the 'systems' list, but that's also true of htop,
> which does cross-compile.  (Also, why does it do that?  The same
> command on my aarch64 machine shows many more system types.)
I don't know.
Greetings,
Maxime.
Attachment: OpenPGP_signature
T
T
Tobias Geerinckx-Rice wrote on 11 Aug 2022 12:12
0714DAB3-DDD7-47E9-B41E-BE571378F54C@tobias.gr
Hi Andrew,

This is a bug in Guix, not really related to cross-compiling (hence you can stop cross-testing and reporting different architectures, although the effort is appreciated!).

%output is practically deprecated, but is still present in a good number of packages. Sometimes it happens to work, because a specific build system explicitly kept support for it. Some build systems don't, making support for it feel unreliable. It is. %output is obsolete for new code.

What also happens is that build systems still support it in the well-tested native build path, but not when cross-compiling. That seems to be the case here.

Toggle quote (3 lines)
> Interestingly, it gives the same errors when explicitly building for x86_64
> on an x86_64 machine, even though I would expect doing so to compile as normal.

You don't define what you mean by 'explicitly building'.

If you mean --target=x86_64-linux-gnu, why would it not fail? You're cross-compiling. Guix doesn't silently fall back to a non-cross build when the architectures match, no should it IMO.

The fix should be simple: rewrite unzip to use gexps and hence #$output. Why didn't I simply do so yet? Because too many packages depend on unzip to simply do so on master. There's probably a way around that, but I'll try it when I'm back at a computer.

Kind regards,

T G-R

Sent on the go. Excuse or enjoy my brevity.
T
T
Tobias Geerinckx-Rice wrote on 11 Aug 2022 12:28
495C499E-9B2E-4BEA-B95A-5AE6286354AA@tobias.gr
(Now home:) fixed in 45db0ca5e9.

Can you confirm that it works for you?

Closing,

T G-R

Sent on the go. Excuse or enjoy my brevity.
A
A
Andrew Patterson wrote on 11 Aug 2022 20:11
(name . Tobias Geerinckx-Rice)(address . me@tobias.gr)(address . 57127@debbugs.gnu.org)
87mtcaodhy.fsf@gmail.com
unzip now cross-compiles successfully. Thank you!

--
Andrew Patterson
?
Your comment

This issue is archived.

To comment on this conversation send an email to 57127@debbugs.gnu.org

To respond to this issue using the mumi CLI, first switch to it
mumi current 57127
Then, you may apply the latest patchset in this issue (with sign off)
mumi am -- -s
Or, compose a reply to this issue
mumi compose
Or, send patches to this issue
mumi send-email *.patch