Hi Tim, On Thursday, March 16, 2023 7:23:46 PM EDT Tim Johann wrote: > A few weeks ago I wanted to use Racket on Guix on aarch64, but was made > aware, that Racket was not available as a substitute and it did not build. > On the other hand, recent versions of Racket were available on Raspberry Pi > OS which is explicitly running on aarch64. The machine I am running Guix > on actually is a Raspberry Pi 4B. > Thanks again for your investigation of this problem! As I commented on the upstream issue at , I still think this is an upstream bug (and your analysis helped a great deal in finding the root cause), but the approach in your patch is probably the easiest way to fix things for Guix users for now. I'd just ask that you add a comment referencing the upstream issue and with some explanation, because it's not my preferred long-term approach. > > [...] > > using the Racket utility > ../rktboot/main.rkt > This script would actually accept the flag '--machine' and would set the > environment variable MACH to the value of the argument following the flag. > > The problem is that in the case of aarch64 the recipe would not set the > flag. In the recipe for chez-scheme-for-racket-bootstrap-bootfiles in > module (gnu packages chez), we find the lines > ,---- > > | #~(invoke > | > | (search-input-file (or native-inputs inputs) > | > | "/opt/racket-vm/bin/racket") > | > | "../rktboot/main.rkt" > | #$@(if (racket-cs-native-supported-system?) > | > | #~() > | (let ((m (nix-system->pbarch-machine-type))) > | > | #~("--machine" #$m))))))))))))) > > `---- > and, since `(racket-cs-native-supported-system?)' returns `tarm64le', the > first branch of the if expression is taken, ommitting the flag. > The "rktboot" scripts (which simulate enough of Chez Scheme to bootstrap its bootfiles) are supposed to be able to infer right machine type for the current platform, at least if the platform is natively supported. The problem is that the upstream code to doesn't actually work on architectures other than i386 and x86_64. > I suggest to change the above code to the following: > ,---- > > | #~(invoke > | > | (search-input-file (or native-inputs inputs) > | > | "/opt/racket-vm/bin/racket") > | > | "../rktboot/main.rkt" > | #$@(let ((m (or (racket-cs-native-supported-system?) > | > | (nix-system->pbarch-machine-type)))) > | > | #~("--machine" #$m)))))))))))) > > `---- > which sets the flag for natively supported architectures and those supported > by portable bytecode. This is a good work-around. The reason I'd like to avoid it in the long run is that, ideally, I'd like to get us out of the business of managing Chez machine types and the translation from normal architecture and OS strings. I think we'll at least be able to eliminate `%chez-features-table` once the ongoing work to reunify upstream Chez Scheme with Racket's branch is complete. Reducing the number of places where we have to use these machine-type- producing functions should help advance that goal, so I'd prefer to have a comment here reminding us that we can reconsider "--machine" once is fixed. -Philip