Subject: Re: bug#24120: ERROR: In procedure struct-ref: Argument 1 out of range: 10

From: [email-masked] (Ludovic Courtès)
Date: Mon, 01 Aug 2016 10:20:46 +0200

Hello,

myglc2 <[email-masked]> skribis:

> g1@g1 ~/src/guix [env]$ make
> make  all-recursive
> make[1]: Entering directory '/home/g1/src/guix'
> Making all in po/guix
> make[2]: Entering directory '/home/g1/src/guix/po/guix'
> make[2]: Leaving directory '/home/g1/src/guix/po/guix'
> Making all in po/packages
> make[2]: Entering directory '/home/g1/src/guix/po/packages'
> make[2]: Leaving directory '/home/g1/src/guix/po/packages'
> make[2]: Entering directory '/home/g1/src/guix'
> Compiling Scheme modules...
>   LOAD     (guix base32)
>   LOAD     (guix base64)
>   LOAD     (guix cpio)
>   LOAD     (guix records)
>   LOAD     (guix gcrypt)
> ;;; note: source file ./guix/config.scm
> ;;;       newer than compiled /home/g1/.cache/guile/ccache/2.0-LE-8-2.0/home/g1/src/guix/guix/config.scm.go

[...]

> ;;; note: source file ./gnu/packages/perl.scm
> ;;;       newer than compiled /home/g1/.cache/guile/ccache/2.0-LE-8-2.0/home/g1/src/guix/gnu/packages/perl.scm.go
> ;;; Failed to autoload canonical-package in (gnu packages base):
> ;;; ERROR: In procedure struct-ref: Argument 1 out of range: 10

The problem is that ~/.cache/guile contains .go files that get loaded
and take precedence over the code being compiled (probably these files
exist because you used C-c C-k in Geiser or something similar).
However, some of these files are stale and expect a different ABI, hence
the error.

“rm -rf ~/.cache/guile/ccache” would solve the problem, but could you
instead try the attached patch and see if it solves the problem?

Thanks,
Ludo’.

diff --git a/Makefile.am b/Makefile.am
index d18e330..1f01465 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -402,11 +402,13 @@ CLEANFILES =					\
 # there that are newer than the local .scm files (for instance because the
 # user ran 'make install' recently).  When that happens, we end up loading
 # those previously-installed .go files, which may be stale, thereby breaking
-# the whole thing.
+# the whole thing.  Likewise, set 'XDG_CACHE_HOME' to avoid loading possibly
+# stale files from ~/.cache/guile/ccache.
 %.go: make-go ; @:
 make-go: $(MODULES) guix/config.scm guix/tests.scm
 	$(AM_V_at)echo "Compiling Scheme modules..." ;			\
 	unset GUILE_LOAD_COMPILED_PATH ;				\
+	XDG_CACHE_HOME=/nowhere						\
 	host=$(host) srcdir="$(top_srcdir)"				\
 	$(top_builddir)/pre-inst-env					\
 	$(GUILE) -L "$(top_builddir)" -L "$(top_srcdir)"		\