Subject: [bug#77033] [PATCH] deploy: Support --target and --system.

From: Maxim Cournoyer <[email-masked]>
Date: Sat, 22 Mar 2025 21:32:30 +0900

Hi Sergey,

Sergey Trofimov <[email-masked]> writes:

> Hi Maxim,
>
> Maxim Cournoyer <[email-masked]> writes:
>
>> [...]
>>
>>>>> Additionally `guix-daemon` should know all the systems the host
>>>>> supports. Currently it knows only the native one (`--system`
>>>>> parameter).
>>>>
>>>> I've never used such feature, so I wouldn't know of how useful that
>>>> would be :-).  Perhaps useful if the machine is to be used
>>>> exclusively
>>>> for cross-compiling by default?  You could also set that via 'export
>>>> GUIX_BUILD_OPTIONS=--target=$gnu-triplet', no?
>>>
>>> You've mentioned it in the previous mail:
>>>
>>>> In my experience, assuming a powerful x86_64 workstation,
>>>> cross-compilation > native-compilation (on lower spec ARM machine) >
>>>> emulated native compilation (QEMU).
>>
>> I was answering the specific implementation details you seemed to allude
>> to, regarding that guix-daemon should know also about the non-native
>> (cross-compiled) target systems supported.
>>
>> I didn't understand that part.  Why would we need to teach the daemon
>> something new?  It already can cross-compile things as it is, even it
>> lacks such explicit knowledge, it seems.
>
> `build-machine` declares the systems it supports and local host is in
> fact also a build machine. Having explicit supported system declaration
> would:
> 1. allow better error messages ("can't build for `targetX`" instead of
> failing to build actual derivations)
>
> 2. provide more data to the offloading algorithm. It could then select
> the current host when necessary

I think one way to tackle both points above could be to allow defining
localhost as a build machine in /etc/guix/machines.scm (perhaps there
could be an option to make this implicit/automatic), though we would
need to special case it so that ssh is not used to communicate with it.

> 3. potentially allow to get rid of the `--system` build parameter (or
> replace it with `--build-type=native|emulated|cross`).

I'm not sure about this one, or at least I don't understand how that'd
capture all the necessary information.  Perhaps you are considering only
in the narrow context of 'guix deploy' ?  I think there's value that it
works the same everywhere.

-- 
Thanks,
Maxim