unofficial mirror of guix-patches@gnu.org 
 help / color / mirror / code / Atom feed
* [bug#48434] [PATCH] guile: allow pre-inst-env inject local paths
@ 2021-05-15  9:52 Sergei Trofimovich
  2021-08-16 17:28 ` Sergei Trofimovich
  0 siblings, 1 reply; 9+ messages in thread
From: Sergei Trofimovich @ 2021-05-15  9:52 UTC (permalink / raw)
  To: 48434; +Cc: Ludovic Courtès, Sergei Trofimovich

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)

It happens because ./guile ignores GUILE_LOAD_PATH / GUILE_LOAD_COMPILED_PATH
unconditionally.

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.

Signed-off-by: Sergei Trofimovich <slyfox@gentoo.org>
---
 gnu/packages/aux-files/guile-launcher.c | 19 ++++++++++++-------
 1 file changed, 12 insertions(+), 7 deletions(-)

diff --git a/gnu/packages/aux-files/guile-launcher.c b/gnu/packages/aux-files/guile-launcher.c
index 47ba069de1..bed63353a9 100644
--- a/gnu/packages/aux-files/guile-launcher.c
+++ b/gnu/packages/aux-files/guile-launcher.c
@@ -73,14 +73,19 @@ main (int argc, char **argv)
        which is always preferable over the C locale.  */
     setlocale (LC_ALL, "en_US.utf8");
 
-  const char *str;
-  str = getenv ("GUILE_LOAD_PATH");
-  load_path = str != NULL ? strdup (str) : NULL;
-  str = getenv ("GUILE_LOAD_COMPILED_PATH");
-  load_compiled_path = str ? strdup (str) : NULL;
+  /* Allow ./pre-inst-env to inject local paths. That way local sources
+     are preferred for most operations.  */
+  if (getenv ("GUIX_UNINSTALLED") == NULL)
+    {
+      const char *str;
+      str = getenv ("GUILE_LOAD_PATH");
+      load_path = str != NULL ? strdup (str) : NULL;
+      str = getenv ("GUILE_LOAD_COMPILED_PATH");
+      load_compiled_path = str ? strdup (str) : NULL;
 
-  unsetenv ("GUILE_LOAD_PATH");
-  unsetenv ("GUILE_LOAD_COMPILED_PATH");
+      unsetenv ("GUILE_LOAD_PATH");
+      unsetenv ("GUILE_LOAD_COMPILED_PATH");
+    }
 
   /* XXX: Do not let GMP allocate via libgc as this can lead to memory
      corruption in GnuTLS/Nettle since Nettle also uses GMP:
-- 
2.31.1





^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [bug#48434] [PATCH] guile: allow pre-inst-env inject local paths
  2021-05-15  9:52 [bug#48434] [PATCH] guile: allow pre-inst-env inject local paths Sergei Trofimovich
@ 2021-08-16 17:28 ` Sergei Trofimovich
  2021-08-16 18:52   ` Maxime Devos
  0 siblings, 1 reply; 9+ messages in thread
From: Sergei Trofimovich @ 2021-08-16 17:28 UTC (permalink / raw)
  To: 48434

On Sat, 15 May 2021 10:52:27 +0100
Sergei Trofimovich <slyfox@gentoo.org> 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)
> 
> It happens because ./guile ignores GUILE_LOAD_PATH / GUILE_LOAD_COMPILED_PATH
> unconditionally.
> 
> 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.
> 
> Signed-off-by: Sergei Trofimovich <slyfox@gentoo.org>
> ---
>  gnu/packages/aux-files/guile-launcher.c | 19 ++++++++++++-------
>  1 file changed, 12 insertions(+), 7 deletions(-)
> 
> diff --git a/gnu/packages/aux-files/guile-launcher.c b/gnu/packages/aux-files/guile-launcher.c
> index 47ba069de1..bed63353a9 100644
> --- a/gnu/packages/aux-files/guile-launcher.c
> +++ b/gnu/packages/aux-files/guile-launcher.c
> @@ -73,14 +73,19 @@ main (int argc, char **argv)
>         which is always preferable over the C locale.  */
>      setlocale (LC_ALL, "en_US.utf8");
>  
> -  const char *str;
> -  str = getenv ("GUILE_LOAD_PATH");
> -  load_path = str != NULL ? strdup (str) : NULL;
> -  str = getenv ("GUILE_LOAD_COMPILED_PATH");
> -  load_compiled_path = str ? strdup (str) : NULL;
> +  /* Allow ./pre-inst-env to inject local paths. That way local sources
> +     are preferred for most operations.  */
> +  if (getenv ("GUIX_UNINSTALLED") == NULL)
> +    {
> +      const char *str;
> +      str = getenv ("GUILE_LOAD_PATH");
> +      load_path = str != NULL ? strdup (str) : NULL;
> +      str = getenv ("GUILE_LOAD_COMPILED_PATH");
> +      load_compiled_path = str ? strdup (str) : NULL;
>  
> -  unsetenv ("GUILE_LOAD_PATH");
> -  unsetenv ("GUILE_LOAD_COMPILED_PATH");
> +      unsetenv ("GUILE_LOAD_PATH");
> +      unsetenv ("GUILE_LOAD_COMPILED_PATH");
> +    }
>  
>    /* XXX: Do not let GMP allocate via libgc as this can lead to memory
>       corruption in GnuTLS/Nettle since Nettle also uses GMP:

Stumbled on it again today when cloned fresh guix repo and forgot to
apply this patch. Is it a reasonable approach? Or something else is
at fault here?

Thanks!

-- 

  Sergei




^ permalink raw reply	[flat|nested] 9+ messages in thread

* [bug#48434] [PATCH] guile: allow pre-inst-env inject local paths
  2021-08-16 17:28 ` Sergei Trofimovich
@ 2021-08-16 18:52   ` Maxime Devos
  2021-08-17  8:28     ` Sergei Trofimovich
  0 siblings, 1 reply; 9+ messages in thread
From: Maxime Devos @ 2021-08-16 18:52 UTC (permalink / raw)
  To: Sergei Trofimovich, 48434

[-- Attachment #1: Type: text/plain, Size: 2968 bytes --]

Sergei Trofimovich schreef op ma 16-08-2021 om 18:28 [+0100]:
> On Sat, 15 May 2021 10:52:27 +0100
> Sergei Trofimovich <slyfox@gentoo.org> 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.

[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 260 bytes --]

^ permalink raw reply	[flat|nested] 9+ messages in thread

* [bug#48434] [PATCH] guile: allow pre-inst-env inject local paths
  2021-08-16 18:52   ` Maxime Devos
@ 2021-08-17  8:28     ` Sergei Trofimovich
  2021-08-17  9:35       ` Sergei Trofimovich
  2021-08-17 10:24       ` Maxime Devos
  0 siblings, 2 replies; 9+ messages in thread
From: Sergei Trofimovich @ 2021-08-17  8:28 UTC (permalink / raw)
  To: Maxime Devos; +Cc: 48434


[-- Attachment #1.1: Type: text/plain, Size: 4207 bytes --]

On Mon, 16 Aug 2021 20:52:48 +0200
Maxime Devos <maximedevos@telenet.be> wrote:

> Sergei Trofimovich schreef op ma 16-08-2021 om 18:28 [+0100]:
> > On Sat, 15 May 2021 10:52:27 +0100
> > Sergei Trofimovich <slyfox@gentoo.org> 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:

> The local directory isn't ignored, it's at the end (the effect is about the same though).

Reworded to: "because local directory override has too low priority".

> > > 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?

Attached v2 patch that should solve all the above.

Added two 'guile' flavours:
    inplace/guile (to be used inplace)
    store/guile (to be installed to libexec)
While at it moved 'guix-daemon' to 'inplace/' as well to make it clear that
tests use inplace variant sometimes. Installation location did not change.

Also moved scripts/guix to inplace/guix as ./pre-inst-env relies on it to
be injected to PATH.

> Also, "guile-launcher.c" is used by 'quiet-quile" in (guix self).  It should probably be
> verified that "guix pull" still works well.

It's a bit hard to test right now as guix-master is slightly broken due to
missing installed files when installed as a primary package manager, but at
least fetch part works fine:

$ guix pull
Updating channel 'guix' from Git repository at 'https://git.savannah.gnu.org/git/guix.git'...
Authenticating channel 'guix', commits 9edb3f6 to f7094f5 (29 new commits)...
Building from this channel:
  guix      https://git.savannah.gnu.org/git/guix.git   f7094f5
Backtrace:
In ice-9/boot-9.scm:
   222:29 19 (map1 (((guix store)) ((guix records)) ((guix #)) (#) …))
   222:29 18 (map1 (((guix records)) ((guix profiles)) ((guix #)) # …))
   222:29 17 (map1 (((guix profiles)) ((guix discovery)) ((guix …)) …))
   222:29 16 (map1 (((guix discovery)) ((guix combinators)) ((# …)) …))
   222:29 15 (map1 (((guix combinators)) ((guix channels)) ((# #)) …))
   222:29 14 (map1 (((guix channels)) ((guix describe)) ((guix #)) …))
   222:29 13 (map1 (((guix describe)) ((guix sets)) ((guix ui)) (#) …))
   222:29 12 (map1 (((guix sets)) ((guix ui)) ((guix diagnostics)) …))
   222:29 11 (map1 (((guix ui)) ((guix diagnostics)) ((guix #)) (#) …))
   222:29 10 (map1 (((guix diagnostics)) ((guix modules)) ((# #)) # …))
   222:29  9 (map1 (((guix modules)) ((guix packages)) ((guix #)) # …))
   222:29  8 (map1 (((guix packages)) ((guix utils)) ((gnu # #)) # …))
   222:29  7 (map1 (((guix utils)) ((gnu packages base)) ((gnu …)) …))
   222:29  6 (map1 (((gnu packages base)) ((gnu packages bash)) (#) …))
   222:29  5 (map1 (((gnu packages bash)) ((gnu packages hurd)) (#) …))
   222:29  4 (map1 (((gnu packages hurd)) ((gnu system setuid)) (#) …))
   222:17  3 (map1 (((gnu system setuid)) ((srfi srfi-1)) ((# #)) # …))
   3329:6  2 (resolve-interface (gnu system setuid) #:select _ #:hide …)
  1685:16  1 (raise-exception _ #:continuable? _)
  1685:16  0 (raise-exception _ #:continuable? _)

ice-9/boot-9.scm:1685:16: In procedure raise-exception:
no code for module (gnu system setuid)

Thanks!

-- 

  Sergei

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1.2: v2-0001-guile-allow-pre-inst-env-inject-local-paths.patch --]
[-- Type: text/x-patch, Size: 11517 bytes --]

From 20fea816b93f31f6b079aa752c0a2ec681649cd0 Mon Sep 17 00:00:00 2001
From: Sergei Trofimovich <slyich@gmail.com>
Date: Sat, 15 May 2021 10:40:12 +0100
Subject: [PATCH v2] guile: allow pre-inst-env inject local paths

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 has too low priority:

    $ ./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)

It happens because ./guile ignores GUILE_LOAD_PATH / GUILE_LOAD_COMPILED_PATH
unconditionally.

The change drops 'GUILE_LOAD_PATH' environment variable handling. Instead
we bake the constant with into 'guile' binary by distinguishing 'store/guile'
and 'inplace/guile'. And we bake '%guix-is-inplace' in 'inplace/guix' and
in '/usr/bin/guix'. While at it also move 'guix-daemon' to
'inplace/guix-daemon' to make it clear it is used locally by tests.

	* .gitignore: Ignore new 'store' and 'inplace' directories, ignore
	two new 'guile-launcher' object files.
	* Makefile.am: Move 'scripts/guix' to 'inplace/guix'. Move './guile'
	to 'inplace/guile'. Add 'store/guile' that differes from 'inplace/guile'
	by absence of '-DGUIX_INPLACE_GUILE=1' define.
	* build-aux/pre-inst-env.in: Don't add '$abs_top_builddir' to the
	'PATH'. Add only '$abs_top_builddir/inplace' to the 'PATH'. Drop
	'GUIX_UNINSTALLED' environment variable.
	* build-aux/test-env.in: Update to new 'inplace/guix-daemon' location.
	* doc/local.mk: Update to new 'inplace/guix-daemon' location.
	* gnu/packages/aux-files/guile-launcher.c (main): Use compile-time
	* nix/local.mk: Move 'guix-daemon' to 'inplace/guix-daemon'.
	'GUIX_INPLACE_GUILE' define to distinguish 'guile' binary used inplace
	and used from store.
	* scripts/guix.in: Drop 'GUIX_UNINSTALLED' environment variable
	handling in favour of new '%guix-is-inplace' constant.
---
 .gitignore                              |  5 ++++-
 Makefile.am                             | 29 +++++++++++++++++--------
 build-aux/pre-inst-env.in               | 12 ++++------
 build-aux/test-env.in                   |  4 ++--
 doc/local.mk                            |  2 +-
 gnu/packages/aux-files/guile-launcher.c | 26 ++++++++++++++++------
 nix/local.mk                            | 14 ++++++------
 scripts/guix.in                         |  6 +++--
 8 files changed, 61 insertions(+), 37 deletions(-)

diff --git a/.gitignore b/.gitignore
index 88fe24586d..5a7dfa1f31 100644
--- a/.gitignore
+++ b/.gitignore
@@ -78,6 +78,7 @@
 /etc/openrc/guix-daemon
 /guix-*
 /guix/config.scm
+/inplace
 /libformat.a
 /libstore.a
 /libutil.a
@@ -132,6 +133,7 @@
 /pre-inst-env
 /release-*
 /scripts/guix
+/store
 /test-env
 /test-tmp
 /tests/*.trs
@@ -152,5 +154,6 @@ tmp
 /.version
 /doc/stamp-*
 /gnu/packages/bootstrap
-/gnu/packages/aux-files/guile-guile-launcher.o
+/gnu/packages/aux-files/inplace_guile-guile-launcher.o
+/gnu/packages/aux-files/store_guile-guile-launcher.o
 /guile
diff --git a/Makefile.am b/Makefile.am
index 5542aa1c56..0666c7b7c2 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -33,33 +33,44 @@
 
 MSGMERGE_UPDATE = @MSGMERGE@ --update
 
-bin_SCRIPTS = scripts/guix
+bin_SCRIPTS = inplace/guix
 
 # Handle substitution of fully-expanded Autoconf variables.
 do_subst = $(SED)					\
   -e 's,[@]GUILE[@],$(GUILE),g'				\
   -e 's,[@]guilemoduledir[@],$(guilemoduledir),g'	\
   -e 's,[@]guileobjectdir[@],$(guileobjectdir),g'	\
+  -e 's,[@]guix_is_inplace[@],t,g'			\
   -e 's,[@]abs_top_builddir[@],$(abs_top_builddir),g'	\
   -e 's,[@]localedir[@],$(localedir),g'
 
-scripts/guix: scripts/guix.in Makefile
+inplace/guix: scripts/guix.in Makefile
 	$(AM_V_at)rm -f $@ $@-t
 	$(AM_V_at)$(MKDIR_P) "$(@D)"
-	$(AM_V_GEN)$(do_subst) < "$(srcdir)/$@.in" > "$@-t"
+	$(AM_V_GEN)$(do_subst) < "$(srcdir)/$<" > "$@-t"
 	$(AM_V_at)chmod a+x,a-w "$@-t" && mv -f "$@-t" "$@"
 
 # This is our variant of the 'guile' executable, one that doesn't complain
-# about locales.
-pkglibexec_PROGRAMS = guile
-guile_SOURCES = gnu/packages/aux-files/guile-launcher.c
-guile_LDADD   = $(GUILE_LIBS)
-guile_CFLAGS  = $(GUILE_CFLAGS)
+# about locales. Intended to be executed from store.
+pkglibexec_PROGRAMS = store/guile
+store_guile_SOURCES = gnu/packages/aux-files/guile-launcher.c
+store_guile_LDADD   = $(GUILE_LIBS)
+store_guile_CFLAGS  = $(GUILE_CFLAGS)
+
+# This is similar to pkglibexec_PROGRAMS with an exception of honoring local
+# modules:
+# - GUILE_LOAD_PATH / GUILE_LOAD_COMPILED_PATH to allow './pre-inst-env guix refresh'
+#   and friends access to inplace sources: http://issues.guix.gnu.org/48434.
+noinst_PROGRAMS = inplace/guile
+inplace_guile_SOURCES = gnu/packages/aux-files/guile-launcher.c
+inplace_guile_LDADD   = $(GUILE_LIBS)
+inplace_guile_CFLAGS  = $(GUILE_CFLAGS) -DGUIX_INPLACE_GUILE=1
 
 # Have the 'guix' command refer to our 'guile'.
 install-exec-hook:
 	$(SED) -i "$(DESTDIR)$(bindir)/guix"				\
-	       -e 's,^#![[:graph:]]\+,#!$(pkglibexecdir)/guile,g'
+	       -e 's,^#![[:graph:]]\+,#!$(pkglibexecdir)/guile,g'	\
+	       -e 's,define %guix-is-inplace #t,define %guix-is-inplace #f,g'
 
 nodist_noinst_SCRIPTS =				\
   pre-inst-env					\
diff --git a/build-aux/pre-inst-env.in b/build-aux/pre-inst-env.in
index cd90a06cbc..d4e03a92fb 100644
--- a/build-aux/pre-inst-env.in
+++ b/build-aux/pre-inst-env.in
@@ -39,17 +39,13 @@ export GUILE_LOAD_COMPILED_PATH GUILE_LOAD_PATH
 
 # Define $PATH so that `guix' and friends are easily found.
 
-PATH="$abs_top_builddir/scripts:$abs_top_builddir:$PATH"
+PATH="$abs_top_builddir/inplace:$PATH"
 export PATH
 
 # The daemon invokes 'guix'; tell it which one to use.
-GUIX="$abs_top_builddir/scripts/guix"
+# Use inpalce `guix' to honor local GUILE_LOAD_PATH / GUILE_LOAD_COMPILED_PATH:
+# http://issues.guix.gnu.org/48434
+GUIX="$abs_top_builddir/inplace/guix"
 export GUIX
 
-# Define $GUIX_UNINSTALLED to prevent `guix' from
-# prepending @guilemoduledir@ to the Guile load paths.
-
-GUIX_UNINSTALLED=1
-export GUIX_UNINSTALLED
-
 exec "$@"
diff --git a/build-aux/test-env.in b/build-aux/test-env.in
index 7efc43206c..b41662393d 100644
--- a/build-aux/test-env.in
+++ b/build-aux/test-env.in
@@ -39,7 +39,7 @@ case "$1" in
 	;;
 esac
 
-if [ -x "@abs_top_builddir@/guix-daemon" ]
+if [ -x "@abs_top_builddir@/inplace/guix-daemon" ]
 then
     NIX_STORE_DIR="@GUIX_TEST_ROOT@/store"
 
@@ -100,7 +100,7 @@ then
     # Launch the daemon without chroot support because is may be
     # unavailable, for instance if we're not running as root.
     "@abs_top_builddir@/pre-inst-env"				\
-	"@abs_top_builddir@/guix-daemon" --disable-chroot	\
+	"@abs_top_builddir@/inplace/guix-daemon" --disable-chroot	\
 	--substitute-urls="$GUIX_BINARY_SUBSTITUTE_URL" &
 
     daemon_pid=$!
diff --git a/doc/local.mk b/doc/local.mk
index 8340b75a87..6068a2cd2b 100644
--- a/doc/local.mk
+++ b/doc/local.mk
@@ -251,7 +251,7 @@ if !CROSS_COMPILING
 
 dist_man1_MANS += $(srcdir)/%D%/guix-daemon.1
 
-$(srcdir)/%D%/guix-daemon.1: guix-daemon$(EXEEXT)
+$(srcdir)/%D%/guix-daemon.1: inplace/guix-daemon$(EXEEXT)
 	-$(AM_V_HELP2MAN)$(gen_man) --output="$@" `basename "$@" .1`
 
 endif
diff --git a/gnu/packages/aux-files/guile-launcher.c b/gnu/packages/aux-files/guile-launcher.c
index 47ba069de1..3dbd738573 100644
--- a/gnu/packages/aux-files/guile-launcher.c
+++ b/gnu/packages/aux-files/guile-launcher.c
@@ -66,6 +66,12 @@ inner_main (void *unused, int argc, char **argv)
 int
 main (int argc, char **argv)
 {
+#if defined(GUIX_INPLACE_GUILE)
+  int run_guile_from_store = 0;
+#else
+  int run_guile_from_store = 1;
+#endif
+
   /* Try to install the current locale; remain silent if it fails.  */
   if (setlocale (LC_ALL, "") == NULL)
     /* The 'guix pull'-provided 'guix' includes at least en_US.utf8 so use
@@ -73,14 +79,20 @@ main (int argc, char **argv)
        which is always preferable over the C locale.  */
     setlocale (LC_ALL, "en_US.utf8");
 
-  const char *str;
-  str = getenv ("GUILE_LOAD_PATH");
-  load_path = str != NULL ? strdup (str) : NULL;
-  str = getenv ("GUILE_LOAD_COMPILED_PATH");
-  load_compiled_path = str ? strdup (str) : NULL;
 
-  unsetenv ("GUILE_LOAD_PATH");
-  unsetenv ("GUILE_LOAD_COMPILED_PATH");
+  /* Allow ./pre-inst-env to inject local paths. That way local sources
+     are preferred for most operations.  */
+  if (run_guile_from_store)
+    {
+      const char *str;
+      str = getenv ("GUILE_LOAD_PATH");
+      load_path = str != NULL ? strdup (str) : NULL;
+      str = getenv ("GUILE_LOAD_COMPILED_PATH");
+      load_compiled_path = str ? strdup (str) : NULL;
+
+      unsetenv ("GUILE_LOAD_PATH");
+      unsetenv ("GUILE_LOAD_COMPILED_PATH");
+    }
 
   /* XXX: Do not let GMP allocate via libgc as this can lead to memory
      corruption in GnuTLS/Nettle since Nettle also uses GMP:
diff --git a/nix/local.mk b/nix/local.mk
index 7c438ea78c..1d7705b1e5 100644
--- a/nix/local.mk
+++ b/nix/local.mk
@@ -111,33 +111,33 @@ libstore_a_CPPFLAGS =				\
 libstore_a_CXXFLAGS = $(AM_CXXFLAGS)		\
   $(SQLITE3_CFLAGS) $(LIBGCRYPT_CFLAGS)
 
-bin_PROGRAMS = guix-daemon
+bin_PROGRAMS = inplace/guix-daemon
 
-guix_daemon_SOURCES =				\
+inplace_guix_daemon_SOURCES =			\
   %D%/nix-daemon/nix-daemon.cc			\
   %D%/nix-daemon/guix-daemon.cc
 
-guix_daemon_CPPFLAGS =				\
+inplace_guix_daemon_CPPFLAGS =			\
   -DLOCALEDIR=\"$(localedir)\"			\
   $(libutil_a_CPPFLAGS)				\
   -I$(top_srcdir)/%D%/libstore
 
-guix_daemon_LDADD =				\
+inplace_guix_daemon_LDADD =			\
   libstore.a libutil.a libformat.a -lz		\
   $(SQLITE3_LIBS) $(LIBGCRYPT_LIBS)
 
-guix_daemon_headers =				\
+inplace_guix_daemon_headers =			\
   %D%/nix-daemon/shared.hh
 
 if HAVE_LIBBZ2
 
-guix_daemon_LDADD += -lbz2
+inplace_guix_daemon_LDADD += -lbz2
 
 endif HAVE_LIBBZ2
 
 noinst_HEADERS =						\
   $(libformat_headers) $(libutil_headers) $(libstore_headers)	\
-  $(guix_daemon_headers)
+  $(inplace_guix_daemon_headers)
 
 %D%/libstore/schema.sql.hh: guix/store/schema.sql
 	$(AM_V_GEN)$(GUILE) --no-auto-compile -c		\
diff --git a/scripts/guix.in b/scripts/guix.in
index e0194d6ea2..a9fc29baa4 100644
--- a/scripts/guix.in
+++ b/scripts/guix.in
@@ -1,4 +1,4 @@
-#!@abs_top_builddir@/guile \
+#!@abs_top_builddir@/inplace/guile \
 --no-auto-compile -e main -s
 !#
 ;;; GNU Guix --- Functional package management for GNU
@@ -31,8 +31,10 @@
   (push! "@guilemoduledir@" %load-path)
   (push! "@guileobjectdir@" %load-compiled-path))
 
+(define %guix-is-inplace #@guix_is_inplace@)
+
 (define* (main #:optional (args (command-line)))
-  (unless (getenv "GUIX_UNINSTALLED")
+  (unless %guix-is-inplace
     (augment-load-paths!))
 
   (let ((guix-main (module-ref (resolve-interface '(guix ui))
-- 
2.32.0


[-- Attachment #2: Цифровая подпись OpenPGP --]
[-- Type: application/pgp-signature, Size: 981 bytes --]

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [bug#48434] [PATCH] guile: allow pre-inst-env inject local paths
  2021-08-17  8:28     ` Sergei Trofimovich
@ 2021-08-17  9:35       ` Sergei Trofimovich
  2021-08-17 10:24       ` Maxime Devos
  1 sibling, 0 replies; 9+ messages in thread
From: Sergei Trofimovich @ 2021-08-17  9:35 UTC (permalink / raw)
  To: Maxime Devos; +Cc: 48434

[-- Attachment #1: Type: text/plain, Size: 4606 bytes --]

On Tue, 17 Aug 2021 09:28:30 +0100
Sergei Trofimovich <slyich@gmail.com> wrote:

> On Mon, 16 Aug 2021 20:52:48 +0200
> Maxime Devos <maximedevos@telenet.be> wrote:
> 
> > Sergei Trofimovich schreef op ma 16-08-2021 om 18:28 [+0100]:  
> > > On Sat, 15 May 2021 10:52:27 +0100
> > > Sergei Trofimovich <slyfox@gentoo.org> 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:  
> 
> > The local directory isn't ignored, it's at the end (the effect is about the same though).  
> 
> Reworded to: "because local directory override has too low priority".
> 
> > > > 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?  
> 
> Attached v2 patch that should solve all the above.
> 
> Added two 'guile' flavours:
>     inplace/guile (to be used inplace)
>     store/guile (to be installed to libexec)
> While at it moved 'guix-daemon' to 'inplace/' as well to make it clear that
> tests use inplace variant sometimes. Installation location did not change.
> 
> Also moved scripts/guix to inplace/guix as ./pre-inst-env relies on it to
> be injected to PATH.
> 
> > Also, "guile-launcher.c" is used by 'quiet-quile" in (guix self).  It should probably be
> > verified that "guix pull" still works well.  
> 
> It's a bit hard to test right now as guix-master is slightly broken due to
> missing installed files when installed as a primary package manager, but at
> least fetch part works fine:
> 
> $ guix pull
> Updating channel 'guix' from Git repository at 'https://git.savannah.gnu.org/git/guix.git'...
> Authenticating channel 'guix', commits 9edb3f6 to f7094f5 (29 new commits)...
> Building from this channel:
>   guix      https://git.savannah.gnu.org/git/guix.git   f7094f5
> Backtrace:
> In ice-9/boot-9.scm:
>    222:29 19 (map1 (((guix store)) ((guix records)) ((guix #)) (#) …))
>    222:29 18 (map1 (((guix records)) ((guix profiles)) ((guix #)) # …))
>    222:29 17 (map1 (((guix profiles)) ((guix discovery)) ((guix …)) …))
>    222:29 16 (map1 (((guix discovery)) ((guix combinators)) ((# …)) …))
>    222:29 15 (map1 (((guix combinators)) ((guix channels)) ((# #)) …))
>    222:29 14 (map1 (((guix channels)) ((guix describe)) ((guix #)) …))
>    222:29 13 (map1 (((guix describe)) ((guix sets)) ((guix ui)) (#) …))
>    222:29 12 (map1 (((guix sets)) ((guix ui)) ((guix diagnostics)) …))
>    222:29 11 (map1 (((guix ui)) ((guix diagnostics)) ((guix #)) (#) …))
>    222:29 10 (map1 (((guix diagnostics)) ((guix modules)) ((# #)) # …))
>    222:29  9 (map1 (((guix modules)) ((guix packages)) ((guix #)) # …))
>    222:29  8 (map1 (((guix packages)) ((guix utils)) ((gnu # #)) # …))
>    222:29  7 (map1 (((guix utils)) ((gnu packages base)) ((gnu …)) …))
>    222:29  6 (map1 (((gnu packages base)) ((gnu packages bash)) (#) …))
>    222:29  5 (map1 (((gnu packages bash)) ((gnu packages hurd)) (#) …))
>    222:29  4 (map1 (((gnu packages hurd)) ((gnu system setuid)) (#) …))
>    222:17  3 (map1 (((gnu system setuid)) ((srfi srfi-1)) ((# #)) # …))
>    3329:6  2 (resolve-interface (gnu system setuid) #:select _ #:hide …)
>   1685:16  1 (raise-exception _ #:continuable? _)
>   1685:16  0 (raise-exception _ #:continuable? _)
> 
> ice-9/boot-9.scm:1685:16: In procedure raise-exception:
> no code for module (gnu system setuid)

With https://debbugs.gnu.org/cgi/bugreport.cgi?bug=50090 applied 'guix pull'
works successfully on a multi-user foreign distribution.

-- 

  Sergei

[-- Attachment #2: Цифровая подпись OpenPGP --]
[-- Type: application/pgp-signature, Size: 981 bytes --]

^ permalink raw reply	[flat|nested] 9+ messages in thread

* [bug#48434] [PATCH] guile: allow pre-inst-env inject local paths
  2021-08-17  8:28     ` Sergei Trofimovich
  2021-08-17  9:35       ` Sergei Trofimovich
@ 2021-08-17 10:24       ` Maxime Devos
  2021-08-17 12:15         ` Sergei Trofimovich
  1 sibling, 1 reply; 9+ messages in thread
From: Maxime Devos @ 2021-08-17 10:24 UTC (permalink / raw)
  To: Sergei Trofimovich; +Cc: 48434

[-- Attachment #1: Type: text/plain, Size: 976 bytes --]

Sergei Trofimovich schreef op di 17-08-2021 om 09:28 [+0100]:
> It's a bit hard to test right now as guix-master is slightly broken due to
> missing installed files when installed as a primary package manager, but at
> least fetch part works fine:
> 
> $ guix pull
> Updating channel 'guix' from Git repository at 'https://git.savannah.gnu.org/git/guix.git'...
> Authenticating channel 'guix', commits 9edb3f6 to f7094f5 (29 new commits)...
> Building from this channel:
>   guix      https://git.savannah.gnu.org/git/guix.git   f7094f5

I meant something like "$ guix pull --url=. --commit=... --root=guix0"
or "$ ./pre-inst-env guix pull --url=. --commit=... --root=guix1" or
"$ ./pre-inst-env guix pull --root=guix2".  Simply running "$
guix pull",
outside "./pre-inst-env", would simply test the (unpatched) guix you have
installed (with "make install" or "apt-get install guix" or "guix pull"),
and doesn't test the patched guix.

Greetings,
Maxime.

[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 260 bytes --]

^ permalink raw reply	[flat|nested] 9+ messages in thread

* [bug#48434] [PATCH] guile: allow pre-inst-env inject local paths
  2021-08-17 10:24       ` Maxime Devos
@ 2021-08-17 12:15         ` Sergei Trofimovich
  2021-08-17 13:59           ` Maxime Devos
  0 siblings, 1 reply; 9+ messages in thread
From: Sergei Trofimovich @ 2021-08-17 12:15 UTC (permalink / raw)
  To: Maxime Devos; +Cc: 48434

[-- Attachment #1: Type: text/plain, Size: 1558 bytes --]

On Tue, 17 Aug 2021 12:24:50 +0200
Maxime Devos <maximedevos@telenet.be> wrote:

> Sergei Trofimovich schreef op di 17-08-2021 om 09:28 [+0100]:
> > It's a bit hard to test right now as guix-master is slightly broken due to
> > missing installed files when installed as a primary package manager, but at
> > least fetch part works fine:
> > 
> > $ guix pull
> > Updating channel 'guix' from Git repository at 'https://git.savannah.gnu.org/git/guix.git'...
> > Authenticating channel 'guix', commits 9edb3f6 to f7094f5 (29 new commits)...
> > Building from this channel:
> >   guix      https://git.savannah.gnu.org/git/guix.git   f7094f5  
> 
> I meant something like "$ guix pull --url=. --commit=... --root=guix0"
> or "$ ./pre-inst-env guix pull --url=. --commit=... --root=guix1" or
> "$ ./pre-inst-env guix pull --root=guix2".  Simply running "$
> guix pull",
> outside "./pre-inst-env", would simply test the (unpatched) guix you have
> installed (with "make install" or "apt-get install guix" or "guix pull"),
> and doesn't test the patched guix.

Ah. I did install patched guix into the system (and that's how
https://debbugs.gnu.org/cgi/bugreport.cgi?bug=50090).

I still don't quite understand if channel we pull from also should be patched.
Let's assume it should:

  $ LANG=C ./pre-inst-env guix pull --url=. --commit=e9029ed5eae45ee8f53f055ee66f9bce353cac84 --root=guix0
  guix pull: error: root=guix0: unrecognized option

I'm not sure what --root= does. Is it a user name? Or a profile name?

-- 

  Sergei

[-- Attachment #2: Цифровая подпись OpenPGP --]
[-- Type: application/pgp-signature, Size: 981 bytes --]

^ permalink raw reply	[flat|nested] 9+ messages in thread

* [bug#48434] [PATCH] guile: allow pre-inst-env inject local paths
  2021-08-17 12:15         ` Sergei Trofimovich
@ 2021-08-17 13:59           ` Maxime Devos
  2021-08-17 17:42             ` Sergei Trofimovich
  0 siblings, 1 reply; 9+ messages in thread
From: Maxime Devos @ 2021-08-17 13:59 UTC (permalink / raw)
  To: Sergei Trofimovich; +Cc: 48434

[-- Attachment #1: Type: text/plain, Size: 778 bytes --]

> Ah. I did install patched guix into the system (and that's how
> https://debbugs.gnu.org/cgi/bugreport.cgi?bug=50090).
> 
> I still don't quite understand if channel we pull from also should be patched.
> Let's assume it should:
> 
>   $ LANG=C ./pre-inst-env guix pull --url=. --commit=e9029ed5eae45ee8f53f055ee66f9bce353cac84 --root=guix0
>   guix pull: error: root=guix0: unrecognized option
> 
> I'm not sure what --root= does. Is it a user name? Or a profile name?

I forgot the exact option, it should have been "--profile=guix0".
From (guix)Submitting patches:

  15. Make sure your changes do not break Guix and simulate a ‘guix
     pull’ with:
          guix pull --url=/path/to/your/checkout --profile=/tmp/guix.master

Greetings,
Maxime.


[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 260 bytes --]

^ permalink raw reply	[flat|nested] 9+ messages in thread

* [bug#48434] [PATCH] guile: allow pre-inst-env inject local paths
  2021-08-17 13:59           ` Maxime Devos
@ 2021-08-17 17:42             ` Sergei Trofimovich
  0 siblings, 0 replies; 9+ messages in thread
From: Sergei Trofimovich @ 2021-08-17 17:42 UTC (permalink / raw)
  To: Maxime Devos; +Cc: 48434

[-- Attachment #1: Type: text/plain, Size: 1137 bytes --]

On Tue, 17 Aug 2021 15:59:05 +0200
Maxime Devos <maximedevos@telenet.be> wrote:

> > Ah. I did install patched guix into the system (and that's how
> > https://debbugs.gnu.org/cgi/bugreport.cgi?bug=50090).
> > 
> > I still don't quite understand if channel we pull from also should be patched.
> > Let's assume it should:
> > 
> >   $ LANG=C ./pre-inst-env guix pull --url=. --commit=e9029ed5eae45ee8f53f055ee66f9bce353cac84 --root=guix0
> >   guix pull: error: root=guix0: unrecognized option
> > 
> > I'm not sure what --root= does. Is it a user name? Or a profile name?  
> 
> I forgot the exact option, it should have been "--profile=guix0".
> From (guix)Submitting patches:
> 
>   15. Make sure your changes do not break Guix and simulate a ‘guix
>      pull’ with:
>           guix pull --url=/path/to/your/checkout --profile=/tmp/guix.master
> 

Aha, thank you! That works:

$                guix pull --commit=... --url=${PWD} --profile=/tmp/g1.master --disable-authentication
$ ./pre-inst-env guix pull --commit=... --url=${PWD} --profile=/tmp/g2.master --disable-authentication

-- 

  Sergei

[-- Attachment #2: Цифровая подпись OpenPGP --]
[-- Type: application/pgp-signature, Size: 981 bytes --]

^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2021-08-17 17:43 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-05-15  9:52 [bug#48434] [PATCH] guile: allow pre-inst-env inject local paths Sergei Trofimovich
2021-08-16 17:28 ` Sergei Trofimovich
2021-08-16 18:52   ` Maxime Devos
2021-08-17  8:28     ` Sergei Trofimovich
2021-08-17  9:35       ` Sergei Trofimovich
2021-08-17 10:24       ` Maxime Devos
2021-08-17 12:15         ` Sergei Trofimovich
2021-08-17 13:59           ` Maxime Devos
2021-08-17 17:42             ` Sergei Trofimovich

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/guix.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).