Subject: Re: Inconsistent guile enviornment from guix shell

From: Skyler <[email-masked]>
Date: Wed, 29 Mar 2023 21:23:38 +0000

Hello again,

I did some more digging, and it looks like the issue is that guile also has to be specified in the shell environment. I suppose this is reasonable, because the result of the shell environment should not depend on the calling environment, and the existence of guile in the environment is what tells guix that the variables need to be set. The load path is set with the -D flag because guile is a non-propagated input to the package, so it exists in the development shell environment automatically, but not in an ad-hoc environment.

I determined this by trying variations of the shell command in test users with clean environments, one of them including a home environment because I thought that might be a factor. There was no change based on whether the user had a home environment installed, but both users experienced the problem when guile was not included in the shell command. Incidentally, using the pure or container flags always works, because guile must be specified regardless of the calling environment in those cases, but I don't think it is immediately obvious why those flags "make it work".

In spite of being reasonable, it is not particularly intuitive. Could I recommend an addition to the manual in section "7.1 Invoking guix-shell", adding text like the below after the example invocation `guix shell python python-numpy -- python3​`?

"Note that it is necessary to include the main python package in this command even if it is already installed into your environment. This is so that the shell environment knows to set PYTHONPATH and other related variables. The shell environment cannot check the previously installed environment, because then it would be non-deterministic."

Thanks,
Skyler
------- Original Message -------
On Saturday, March 25th, 2023 at 12:10 PM, Skyler <[email-masked]> wrote:

> Hello,
>
> The modules available in a guile REPL seem to be inconsistent after running the guix shell command, where using the -D flag to create a development environment behaves as expected, but leaving out that flag to add the package itself to the environment does not. I am experiencing this issue with some random code on my machine, but I will use guile-pubstrate defined in guix code (https://git.savannah.gnu.org/cgit/guix.git/tree/gnu/packages/guile-xyz.scm?id=04724e59971b03f86a410285653d24005c62b924#n340) as an example for reproduction. Note that guile-pubstrate lists guile-webutils as a propagated input.
>
> When I use guix shell -D guile-pubstrate​, I am able to import the (webutils bytevectors)​ module, as I would expect. I am not able to import (pubstrate apclient)​, also as I would expect. Inspecting GUILE_LOAD_PATH shows that a new profile path was added which contains the dependencies:
>
> $ guix shell -D guile-pubstrate --check
> guix shell: checking the environment variables visible from shell '/gnu/store/d99ykvj3axzzidygsmdmzxah4lvxd6hw-bash-5.1.8/bin/bash'...
> guix shell: All is good! The shell gets correct environment variables.
> [env]$ guile
> GNU Guile 3.0.7
> Copyright (C) 1995-2021 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)> (use-modules (webutils bytevectors))
> scheme@(guile-user)> (use-modules (pubstrate apclient))
> While compiling expression:
> no code for module (pubstrate apclient)
> scheme@(guile-user)> ,q
> [env]$ echo $GUILE_LOAD_PATH
> /gnu/store/pr4vyrz2xsziv25hrdfyim0wy331p4z5-profile/share/guile/site/3.0:/run/current-system/profile/share/guile/site/3.0:/home/skyler/.guix-profile/share/guile/site/3.0
> $ ls /gnu/store/pr4vyrz2xsziv25hrdfyim0wy331p4z5-profile/share/guile/site/3.0
> 8sync apicheck.scm config debugging fibers gcrypt gnutls graph io match-bind.scm md5.scm rx search sjson.scm term text web
> 8sync.scm compat container fash.scm fibers.scm gdbm.scm gnutls.scm htmlprag.scm logging math os scheme sjson string texinfo unit-test.scm webutils
>
> However, when I use guix shell guile-pubstrate, neither (webutils bytevectors) nor (pubstrate apclient) are available. I would expect both of them to be, the former because it is a propagated input and the latter because it is the package that was directly added. If guile was able to locate pubstrate's modules, I would expect loading to fail because its runtime dependencies are not available. Inspecting GUILE_LOAD_PATH shows that nothing was added to it:
>
> $ guix shell guile-pubstrate --check
> guix shell: checking the environment variables visible from shell '/gnu/store/d99ykvj3axzzidygsmdmzxah4lvxd6hw-bash-5.1.8/bin/bash'...
> guix shell: All is good! The shell gets correct environment variables.
> [env]$ guile
> GNU Guile 3.0.9
> Copyright (C) 1995-2023 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)> (use-modules (webutils bytevectors))
> While compiling expression:
> no code for module (webutils bytevectors)
> scheme@(guile-user)> (use-modules (pubstrate apclient))
> While compiling expression:
> no code for module (pubstrate apclient)
> scheme@(guile-user)> ,q
> [env]$ echo $GUILE_LOAD_PATH
> /run/current-system/profile/share/guile/site/3.0:/home/skyler/.guix-profile/share/guile/site/3.0
>
> This is not an issue with the guile-pubstrate definition in particular, because guix shell guile-webutils also fails to add its modules to my environment:
>
> $ guix shell --check guile-webutils
> The following derivation will be built:
> /gnu/store/ca8gv3yk2khs0h60kc5v682g7gvfqd23-profile.drv
>
> building CA certificate bundle...
> listing Emacs sub-directories...
> building fonts directory...
> building directory of Info manuals...
> building profile with 1 package...
> guix shell: checking the environment variables visible from shell '/gnu/store/d99ykvj3axzzidygsmdmzxah4lvxd6hw-bash-5.1.8/bin/bash'...
> guix shell: All is good! The shell gets correct environment variables.
> [env]$ guile
> GNU Guile 3.0.9
> Copyright (C) 1995-2023 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)> (use-modules (webutils bytevectors))
> While compiling expression:
> no code for module (webutils bytevectors)
>
> My machine is up-to-date as of today:
>
> Generation 32 Mar 25 2023 11:32:38 (current)
> guix 04724e5
> repository URL: https://git.savannah.gnu.org/git/guix.git
> branch: master
> commit: 04724e59971b03f86a410285653d24005c62b924
> rde a7b5944
> repository URL: https://git.sr.ht/~abcdw/rde
> branch: master
> commit: a7b59443405169600a00f0b295a3fb1de360cb0b
>
> Let me know if there is anything I can do to help diagnose or fix this issue.
>
> Thanks,
> Skyler