On 26-07-2022 20:38, Marcel van der Boom wrote: >> The 'patches' field is delayed, not thunked, so only the first >> system+target it sees will take effect. This will break things if for >> whatever reason you compute the derivation of the package for >> multiple systems in the same process. > > Where can I read up on 'delayed' vs 'thunked' to understand that > concept? I have no idea what it is at the moment and the manual does > not mention this. AFAICT, it is not documented, though you could read the code at (guix records). Basically: * thunked = field value is wrapped in a (lambda () the-value).   This allows for target-specific inputs, as (inputs (list (if It's-this-architecture these those))) is internally translated to   (inputs (lambda () (if [...] [...] [...]))).   That way, the inputs are not decided when the package is being defined, but when it is compiled to a particular architecture on a particular architecture (or more precisely, a little before building, in what is called 'lowering', which is a bit of a low-level concept and hence probably not well-known). * delayed = field value is wrapped in a (delay the-value).    For documentation on 'delay', see the manual. This is useful for avoiding computation until it's really needed, but unlike 'lambda', it will only be computed once, so only the first value of the-value is taken in account. As such, this won't work well when target-specific things are required. Greetings, Maxime.