Sergei Trofimovich schreef op ma 16-08-2021 om 18:28 [+0100]: > On Sat, 15 May 2021 10:52:27 +0100 > Sergei Trofimovich wrote: > > > I observed the problem when tried to run 'guix refresh' from local git checkout: > > > > $ strace -f ./pre-inst-env guix refresh -u re2c |& fgrep re2c.scm > > ... > > [pid 3014757] openat(AT_FDCWD, "/usr/share/guile/site/3.0/gnu/packages/re2c.scm.qilB0R", > > O_RDWR|O_CREAT|O_EXCL, 0600) = -1 EACCES (Permission denied) > > > > Attempt to /usr/share happens because local directory override is ignored: > > > > $ ./pre-inst-env guile -c '(display (search-path %load-path "gnu/packages/re2c.scm")) (newline) (display %load-path) (newline)' > > /usr/share/guile/site/3.0/gnu/packages/re2c.scm > > (/usr/share/guile/3.0 \ > > /usr/share/guile/site/3.0 \ > > /usr/share/guile/site \ > > /usr/share/guile \ > > /home/slyfox/dev/git/guix \ > > /home/slyfox/dev/git/guix) ^ here's the checkout in the load path > > > > It happens because ./guile ignores GUILE_LOAD_PATH / GUILE_LOAD_COMPILED_PATH > > unconditionally. The local directory isn't ignored, it's at the end (the effect is about the same though). > > The change keeps GUILE_LOAD_PATH / GUILE_LOAD_COMPILED_PATH for ./pre-inst-env. > > > > * gnu/packages/aux-files/guile-launcher.c (main): don't ignore > > GUILE_LOAD_PATH / GUILE_LOAD_COMPILED_PATH in GUIX_UNINSTALLED=1 mode. Could you do something like #define GUIX_UNINSTALLED 1 #if GUIX_UNINSTALLED new behaviour #else OLD BEHAVIOUR #endif and change "Makefile.am" to compile two variants of "guile", one with "DGUIX_UNINSTALLED=1" which goes into libexec, and another with "DGUIX_UNINSTALLED=0" named "$CHECKOUT/guile" which isn't installed anywhere but will be added to PATH by "pre-inst-env", or something like that? I've a bit of an aversion towards using $..._UNINSTALLED environment variables, as it leads to difficult situations like ‘what should happen if I /gnu/store/.../bin/guix is run with GUIX_UNINSTALLED set to 1’: (a): Reset "GUILE_LOAD{,_COMPILED}_PATH" because we're running directly from the store (b): Don't reset "GUILE_LOAD_{,_COMPILED}_PATH" because GUIX_UNINSTALLED is set to 1. As a comparison, GUIX_UNINSTALLED, the preprocessor variable, is like a ‘lexical variable’, and GUIX_UNINSTALLED, the environment variable, is like a ‘parameter object’/‘dynamically bound variable’ (see, e.g., 6.11.12 Parameters in the Guile manual). I tend to prefer the former, except for dynamic things like LC_ALL, $[...]_PATH (when used by "guile", "gcc" -- applications typically shouldn't depend on $GUILE_LOAD_PATH, if they do, they need 'wrap-program' or the like’). Also, "guile-launcher.c" is used by 'quiet-quile" in (guix self). It should probably be verified that "guix pull" still works well. Greetings, Maxime.