Subject: bug#28265: guix system build fails

From: [email-masked] (Ludovic Courtès)
Date: Wed, 30 Aug 2017 11:07:21 +0200

Hello!

Christopher Baines <[email-masked]> skribis:

> On Mon, 28 Aug 2017 21:52:32 +0300
> Efraim Flashner <[email-masked]> wrote:
>
>> efraim@macbook42:~/workspace/guix$ time nice ./pre-inst-env guix
>> system build ~/lightweight-desktop.scm Backtrace:
>>           11 (primitive-load
>> "/home/efraim/workspace/guix/scripts/gu…") In guix/ui.scm:
>>   1331:12 10 (run-guix-command _ . _)
>> In ice-9/boot-9.scm:
>>     837:9  9 (catch _ _ #<procedure 7f4e83aea8c0 at guix/ui.scm:448…>
>> …) 837:9  8 (catch _ _ #<procedure 7f4e83aea8d8 at guix/ui.scm:536…>
>> …) In guix/scripts/system.scm:
>>    1022:8  7 (_)
>>     905:6  6 (process-action _ _ _)
>> In guix/store.scm:
>>   1441:24  5 (run-with-store _ _ #:guile-for-build _ #:system _)
>> In guix/scripts/system.scm:
>>     637:2  4 (_ _)
>> In gnu/system.scm:
>>     884:4  3 (_ _)
>> In gnu/bootloader/grub.scm:
>>    343:29  2 (grub-configuration-file #<<bootloader-configuration> …>
>> …) 207:30  1 (eye-candy #<<bootloader-configuration> bootloader: #<…>
>> …) 149:22  0 (grub-background-image #<<bootloader-configuration> bo…>
>> …)
>> 
>> gnu/bootloader/grub.scm:149:22: In procedure grub-background-image:
>> gnu/bootloader/grub.scm:149:22: In procedure struct_vtable: Wrong
>> type argument in position 1 (expecting struct): 5
>> 
>
> I tried this, and got the same error, but then I deleted all the .go
> files, re-ran make, and then tried again, and then it worked.

Yeah, this kind of error is typical of an ABI mismatch.  The reason is
that in Guile, record field accessors of SRFI-9 record types are
inlined:

--8<---------------cut here---------------start------------->8---
scheme@(guile-user)> ,use(srfi srfi-9)
scheme@(guile-user)> (define-record-type <foo>
		       (make-foo x)
		       foo?
		       (x foo-x))
scheme@(guile-user)> ,expand (foo-x bar)
$2 = (let ((s bar))
  (if ((@@ (srfi srfi-9) eq?)
       ((@@ (srfi srfi-9) struct-vtable) s)
       <foo>)
    ((@@ (srfi srfi-9) struct-ref) s 0)
    (let ((s* s))
      ((@@ (srfi srfi-9) throw)
       'wrong-type-arg
       'foo-x
       "Wrong type argument: ~S"
       ((@@ (srfi srfi-9) list) s*)
       ((@@ (srfi srfi-9) list) s*)))))
--8<---------------cut here---------------end--------------->8---

The (struct-ref s 0) above becomes incorrect if, say, we add a field
right before ‘x’, because ‘x’ would now be at offset 1.

The safe solution here is to “make clean-go && make”.

Ludo’.