Hi Giovanni, Giovanni Biscuolo writes:
> I want to share this issue and show my "workaround" to fix it, please > send your comments on alternative ways or other caveats you may find in > my reasoning Thank you for sharing you experience with us. > I'm running Guix on top of Debian/stretch, recently I made Guix > environment the default execution one for my console and graphical > applications (bad idea?) and now I have to fix env every time I want to > run a Debian installed application I have a similar experience. I run Guix on top of Debian Sid. > Since I'm connecting to my machine via an LTSP terminal, I followed this > guide https://wiki.debian.org/EnvironmentVariables#Quick_guide to have > the Guix profile automatically set up when I login via LDM; so now I > have this in my .profile: > > --8<---------------cut here---------------start------------->8--- > ### Guix settings > # > # add Guix current path > export PATH="$HOME/.config/guix/current/bin${PATH:+:}$PATH" > # add Guix infopath > export INFOPATH="$HOME/.config/guix/current/share/info:$INFOPATH" > # set default Guix profile > export GUIX_PROFILE="$HOME/.guix-profile" > # source default Guix profile > . $GUIX_PROFILE/etc/profile > # set Guix locale path > export GUIX_LOCPATH="$GUIX_PROFILE/lib/locale" > ### end Guix > --8<---------------cut here---------------end--------------->8--- > > and this in my .bash_profile *and* .xsessionrc: > > --8<---------------cut here---------------start------------->8--- > if [ -f ~/.profile ]; then > . ~/.profile > fi > --8<---------------cut here---------------end--------------->8--- > > and lastly this in $GUIX_PROFILE/etc/profile: > > --8<---------------cut here---------------start------------->8--- > # Source this file to define all the relevant environment variables in Bash > # for this profile. You may want to define the 'GUIX_PROFILE' environment > # variable to point to the "visible" name of the profile, like this: > # > # GUIX_PROFILE=/path/to/profile ; \ > # source /path/to/profile/etc/profile > # > # When GUIX_PROFILE is undefined, the various environment variables refer > # to this specific profile generation. > > export > PATH="${GUIX_PROFILE:-/gnu/store/gvfl5wxrgalxjjmyp7cwgfj48bdd34n4-profile}/bin:${GUIX_PROFILE:-/gnu/store/gvfl5wxrgalxjjmyp7cwgfj48bdd34n4-profile}/sbin${PATH:+:}$PATH" > export > GST_PLUGIN_SYSTEM_PATH="${GUIX_PROFILE:-/gnu/store/gvfl5wxrgalxjjmyp7cwgfj48bdd34n4-profile}/lib/gstreamer-1.0${GST_PLUGIN_SYSTEM_PATH:+:}$GST_PLUGIN_SYSTEM_PATH" > export > XDG_DATA_DIRS="${GUIX_PROFILE:-/gnu/store/gvfl5wxrgalxjjmyp7cwgfj48bdd34n4-profile}/share${XDG_DATA_DIRS:+:}$XDG_DATA_DIRS" > export > GIO_EXTRA_MODULES="${GUIX_PROFILE:-/gnu/store/gvfl5wxrgalxjjmyp7cwgfj48bdd34n4-profile}/lib/gio/modules${GIO_EXTRA_MODULES:+:}$GIO_EXTRA_MODULES" > --8<---------------cut here---------------end--------------->8--- > > AFAIU it conforms to the suggested way to setup a working user profile: > right? > > The problem here is I'm getting this env when I login and open a > terminal emulator: > > --8<---------------cut here---------------start------------->8--- > ~ $ env | grep -i guix > GIO_EXTRA_MODULES=/home/giovanni/.guix-profile/lib/gio/modules > GST_PLUGIN_SYSTEM_PATH=/home/giovanni/.guix-profile/lib/gstreamer-1.0 > GUIX_LOCPATH=/home/giovanni/.guix-profile/lib/locale > GUIX_PROFILE=/home/giovanni/.guix-profile > INFOPATH=/home/giovanni/.config/guix/current/share/info: > PATH=/home/giovanni/.guix-profile/bin:/home/giovanni/.guix-profile/sbin:/home/giovanni/.config/guix/current/bin:/usr/local/bin/Zotero_linux-x86_64:/home/giovanni/.local/bin:/home/giovanni/bin:/usr/local/bin:/usr/bin:/bin:/usr/games:/home/giovanni/bin:/home/giovanni/.local/bin:/home/giovanni/go/bin:/home/giovanni/bin:/home/giovanni/.local/bin > XDG_DATA_DIRS=/home/giovanni/.guix-profile/share > --8<---------------cut here---------------end--------------->8--- > > This causes some Debian installed GUI applications to chrash with a > GLib-GIO-ERROR like this (evince in this case, I also tried eom from > Mate and gnome-character-map): > > --8<---------------cut here---------------start------------->8--- > ~ $ evince > > (evince:26326): GLib-GIO-ERROR **: Settings schema 'org.gnome.Evince' is not > installed > > rilevato trace/breakpoint > --8<---------------cut here---------------end--------------->8--- > > At first I did not ralized it was an env problem, then looking at an > strace log it tunrs out that it reads gschema.compiled from my user Guix > profile and not from Debian standard folder [2]: > > --8<---------------cut here---------------start------------->8--- > openat(AT_FDCWD, > "/home/giovanni/.guix-profile/share/glib-2.0/schemas/gschemas.compiled", > O_RDONLY) = 12 > --8<---------------cut here---------------end--------------->8--- > > [1] /usr/share/gnome:/usr/local/share/:/usr/share/ as documented here > https://www.debian.org/doc/manuals/debian-reference/ch09.en.html#_starting_a_program_from_gui > > To fix this issue now I do (in a terminal emulator): > > --8<---------------cut here---------------start------------->8--- > unset XDG_DATA_DIRS > export > XDG_DATA_DIRS="${GUIX_PROFILE:-/gnu/store/gvfl5wxrgalxjjmyp7cwgfj48bdd34n4-profile}/share:/usr/share/gnome:/usr/local/share/:/usr/share/" > --8<---------------cut here---------------end--------------->8--- > > Now I should just "backport" this fix in my ~/.profile so it will be > applied to my graphical login session, too > > WDYT? Thanks, Gio' According to the XDG Base Directory Specification [1]: #+begin_quote If $XDG_DATA_DIRS is either not set or empty, a value equal to /usr/local/share/:/usr/share/ should be used. If $XDG_CONFIG_DIRS is either not set or empty, a value equal to /etc/xdg should be used. #+end_quote And according to my experience, $XDG_DATA_DIRS and $XDG_CONFIG_DIRS are not set by default on Debian. So they should be set to their default values before adding extra paths to them. Thus I have this code snippet in my login shell's config (fish rather than bash). Fish script is very easy to understand. I think you can translate it into bash. #+begin_src fish if status is-login || status is-interactive set -gx MY_PROFILE "$HOME/.guix-profile" # Guix on foreign distros. # This test is a dirty hack. if test -d /var/guix && ! test -L /run/current-system # Environment set -gx ROOT_PROFILE "/var/guix/profiles/per-user/root/guix-profile" set -gx GUIX_LOCPATH "$ROOT_PROFILE/lib/locale" set -gx SSL_CERT_DIR "$ROOT_PROFILE/etc/ssl/certs" set -gx SSL_CERT_FILE "$ROOT_PROFILE/etc/ssl/certs/ca-certificates.crt" # XDG # ==========> Look at here! <========= # Set $XDG_CONFIG_DIRS and $XDG_DATA_DIRS to their default # values if they are not set. test "$XDG_CONFIG_DIRS" = "" && set -gx XDG_CONFIG_DIRS "/etc/xdg" test "$XDG_DATA_DIRS" = "" && set -gx XDG_DATA_DIRS "/usr/local/share:/usr/share" set -gx XDG_CONFIG_DIRS "$MY_PROFILE/etc/xdg:$XDG_CONFIG_DIRS" set -gx XDG_DATA_DIRS "$MY_PROFILE/share:$XDG_DATA_DIRS" # ==========> Look at here! <========= # Source my etc/profile set -gx GUIX_PROFILE $MY_PROFILE fenv source $MY_PROFILE/etc/profile set -eu GUIX_PROFILE # $PATH # add_path is a function defined by me. It adds the argument # into $PATH add_path $MY_PROFILE/sbin add_path $MY_PROFILE/bin add_path $XDG_CONFIG_HOME/guix/current/bin end end #+end_src [1]. XDG Base Directory Specification https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html -- Meiyo Peng https://www.pengmeiyu.com/
