Subject: Re: bug#31392: gnome.scm cannot import (gnu packages rust)

From: [email-masked] (Ludovic Courtès)
Date: Thu, 10 May 2018 00:56:10 +0200

Hello,

Marius Bakke <[email-masked]> skribis:

> I'm trying to update librsvg, which requires "rust".

Speaking of which, what are other distros doing?  Are all of them
switching to the Rust implementation, or are some keeping the C
implementation?

Not that I’m fond of C, but adding Rust (which is not bootstrapped,
etc.) in this place can be problematic.

> However adding this simple diff:
>
> --- a/gnu/packages/gnome.scm
> +++ b/gnu/packages/gnome.scm
> @@ -114,6 +114,7 @@
>    #:use-module (gnu packages pulseaudio)
>    #:use-module (gnu packages python)
>    #:use-module (gnu packages rdesktop)
> +  #:use-module (gnu packages rust)
>    #:use-module (gnu packages scanner)
>    #:use-module (gnu packages selinux)
>    #:use-module (gnu packages slang)
>
> Causes the module to compile (sometimes), but any Guix action results in
> a backtrace similar to this:

Here’s a debugging trick (not as helpful as one might like, but still):

--8<---------------cut here---------------start------------->8---
$ GUIX_PACKAGE_PATH= ./pre-inst-env guile
GNU Guile 2.2.3
Copyright (C) 1995-2017 Free Software Foundation, Inc.

Guile comes with ABSOLUTELY NO WARRANTY; for details type `,show w'.
This program is free software, and you are welcome to redistribute it
under certain conditions; type `,show c' for details.

Enter `,help' for help.
scheme@(guile-user)> (primitive-load "gnu/packages/abiword.scm")
gnu/packages/rust.scm:241:25: error: gcc: unbound variable

Entering a new prompt.  Type `,bt' for a backtrace or `,q' to continue.
scheme@(gnu packages rust) [1]> ,bt
         1190 (primitive-load "gnu/packages/abiword.scm")
In ice-9/eval.scm:
   721:201189 (primitive-eval _)
In ice-9/psyntax.scm:
  1235:361188 (expand-top-sequence _ _ _ #f _ _ _)
  1182:241187 (parse _ (("placeholder" placeholder)) ((top) #(ribcage () () ())) _ e # …)
   285:101186 (parse _ (("placeholder" placeholder)) (()) _ c&e (eval) (hygiene #))
In ice-9/eval.scm:
   293:341185 (_ #<directory (guile-user) 995140>)
In ice-9/boot-9.scm:
   2862:41184 (define-module* _ #:filename _ #:pure _ #:version _ #:imports _ # _ # _ …)
  2071:241183 (call-with-deferred-observers _)
  2875:241182 (_)
   222:291181 (map1 _)
   222:291180 (map1 _)
   222:291179 (map1 _)
   222:291178 (map1 _)
   222:291177 (map1 _)
   222:291176 (map1 _)
   222:171175 (map1 (((gnu packages autotools)) ((gnu packages boost)) ((gnu # #)) # …))
  2788:171174 (resolve-interface (gnu packages autotools) #:select _ #:hide _ #:prefix …)

[...]

In unknown file:
          22 (primitive-load-path "gnu/packages/gnome" #<procedure 1311b40 at ice-9/b…>)
In gnu/packages/gnome.scm:
     49:0 21 (_)
In ice-9/boot-9.scm:
   2862:4 20 (define-module* _ #:filename _ #:pure _ #:version _ #:imports _ #:exports …)
  2875:24 19 (_)
   222:29 18 (map1 _)
   222:29 17 (map1 _)
   222:29 16 (map1 _)
   222:29 15 (map1 _)
   222:29 14 (map1 _)
   222:29 13 (map1 _)
   222:29 12 (map1 _)
   222:29 11 (map1 _)
   222:29 10 (map1 _)
   222:29  9 (map1 _)
   222:29  8 (map1 _)
   222:17  7 (map1 (((gnu packages rust)) ((gnu packages admin)) ((gnu packages #)) …))
  2788:17  6 (resolve-interface (gnu packages rust) #:select _ #:hide _ #:prefix _ # _ …)
  2714:10  5 (_ (gnu packages rust) _ _ #:ensure _)
  2982:16  4 (try-module-autoload _ _)
   2312:4  3 (save-module-excursion _)
  3002:22  2 (_)
In unknown file:
           1 (primitive-load-path "gnu/packages/rust" #<procedure 1311a40 at ice-9/bo…>)
In gnu/packages/rust.scm:
   241:25  0 (_)
scheme@(gnu packages rust) [1]> ,error
gnu/packages/rust.scm:241:25: error: gcc: unbound variable
--8<---------------cut here---------------end--------------->8---

The issue was the reference to ‘gcc’ from the ‘native-search-paths’
field (a “top level reference” because it’s executed as soon as we load
rust.scm.)  While Guile allows for circular dependencies among modules,
it only works if the top-level of modules don’t look up variables
exported by each other, if you see what I mean.

Fixed in afc2bf53066975558676bc7f4957ad85d0ec170a.

Thanks,
Ludo’.