From mboxrd@z Thu Jan 1 00:00:00 1970 From: Meiyo Peng Subject: Re: XDG_DATA_DIRS issue in execution environment on LTSP Date: Thu, 28 Mar 2019 09:55:13 +0800 Message-ID: <878swz930e.fsf@riseup.net> References: <87r2asweu1.fsf@roquette.mug.biscuolo.net> Mime-Version: 1.0 Content-Type: text/plain Return-path: Received: from eggs.gnu.org ([209.51.188.92]:51816) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1h9KKY-00033j-B8 for guix-devel@gnu.org; Wed, 27 Mar 2019 21:59:47 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1h9KKW-00010a-P3 for guix-devel@gnu.org; Wed, 27 Mar 2019 21:59:46 -0400 Received: from mx1.riseup.net ([198.252.153.129]:36516) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1h9KKW-00010C-8k for guix-devel@gnu.org; Wed, 27 Mar 2019 21:59:44 -0400 In-reply-to: <87r2asweu1.fsf@roquette.mug.biscuolo.net> List-Id: "Development of GNU Guix and the GNU System distribution." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: guix-devel-bounces+gcggd-guix-devel=m.gmane.org@gnu.org Sender: "Guix-devel" To: Giovanni Biscuolo Cc: guix-devel@gnu.org 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/