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
?