unofficial mirror of bug-guix@gnu.org 
 help / color / mirror / code / Atom feed
From: Matt Armstrong <matt@rfc20.org>
To: 59474@debbugs.gnu.org
Subject: bug#59474: Guix Home generated .profile sets XDG_ vars that break GDM+Gnome login on foreign distros
Date: Mon, 21 Nov 2022 22:02:07 -0800	[thread overview]
Message-ID: <87fsebbk80.fsf@rfc20.org> (raw)

I am experimenting with Guix Home on Debian Testing, using GDM+Gnome.
The .profile generated by "guix home reconfigure" broke logging in to
the Gnome desktop.  The gnome session would die, failing to initialize
what it considered to be essential things, and return to the login
screen I could log in to a tty, and was able to undo the new .profile
and get back to a working system.

The home-configuration.scm I used was generated by "guix home import"
and was quite simple:

----------------------------------------------------------------------
(use-modules (gnu home)
             (gnu packages)
             (gnu services)
             (guix gexp)
             (gnu home services shells))

(home-environment
  ;; Below is the list of packages that will show up in your
  ;; Home profile, under ~/.guix-home/profile.
  (packages (specifications->packages (list "glibc-locales")))

  ;; Below is the list of Home services.  To search for available
  ;; services, run 'guix home search KEYWORD' in a terminal.
  (services
   (list (service home-bash-service-type
                  (home-bash-configuration
                   (aliases '(("ls" . "ls --color=auto")))
                   (bashrc (list (local-file ".bashrc" "bashrc")))
                   (bash-logout (list (local-file ".bash_logout"
                                                  "bash_logout"))))))))
----------------------------------------------------------------------

Note: a stock GDM+Gnome setup runs the user's login shell when logging
in via the GDM display manager, and this shell execs
gnome-session-binary.  This doesn't necessarily happen with other
display managers or other desktop environments, so on those systems the
Guix Home .profile may not even run before the DE is initialized.
Nearly all of my time debugging this was spent figuring this out!  :-)

The .profile file generated by Guix Home is this:

----------------------------------------------------------------------
HOME_ENVIRONMENT=$HOME/.guix-home
. $HOME_ENVIRONMENT/setup-environment
$HOME_ENVIRONMENT/on-first-login
----------------------------------------------------------------------

The first thing I see is that $HOME/.guix-home/seutp-environment is
modifying various XDG_ variables incorrectly.  It prepends new values
without honor the variable's default value if it doesn't happen to be
set already.

For example, if XDG_DATA_DIRS is not set its default value is
"/usr/local/share/:/usr/share/".

But .guix-home/setup-environment will instead prepend a value without
checking, leaving XDG_DATA_DIRS set incorrectly to
"$HOME/.guix-home/profile/share:" when it should be
"$HOME/.guix-home/profile/share:/usr/local/share/:/usr/share/".

See this code in setup-environment:

case $XDG_DATA_DIRS in
  *$HOME_ENVIRONMENT/profile/share*) ;;
  *) export XDG_DATA_DIRS=$HOME_ENVIRONMENT/profile/share:$XDG_DATA_DIRS ;;
esac

The correct idiom is this:

XDG_DATA_DIRS=PATH_TO_PREPEND:${XDG_DATA_DIRS:-/usr/local/share/:/usr/share/}

or

XDG_DATA_DIRS=${XDG_DATA_DIRS:-/usr/local/share/:/usr/share/}:PATH_TO_APPEND

The above is what I see in various Nix and Snap configuration files.

Because I have a few other things installed that modify XDG_DATA_DIRS
before Guix Home does, Guix Home doesn't break that particular variable.

It did break XDG_CONFIG_DIRS, since Guix Home was setting it to
"$HOME/.guix-home/profile/etc/xdg:".  I worked around this problem by
running this code before Guix Home's .profile:

    # Note: when XDG_CONFIG_DIRS is not set Guix home sets
    # XDG_CONFIG_DIRS="$HOME/.guix-home/profile/etc/xdg:", which removes
    # the default "/etc/xdg" value.
    if [[ -z $XDG_CONFIG_DIRS ]]; then
        XDG_CONFIG_DIRS=/etc/xdg
    fi

    # Note: when XDG_DATA_DIRS is not set Guix home sets
    # XDG_DATA_DIRS="$HOME/.guix-home/profile/share:", which removes the
    # default "/usr/local/share:/usr/share" value.
    if [[ -z $XDG_DATA_DIRS ]]; then
        XDG_DATA_DIRS="/usr/local/share:/usr/share"
    fi

I have other more minor quibbles about how Guix Home handles XDG values:

XDG_STATE_HOME is set to a non-standard value.  In the current XDG Base
Directory Specification it defaults to "$HOME/.local/state", but Guix
Home sets it to "$HOME/.local/var/lib".  On a foreign distro this is
going to cause some disruption when a user switches to Guix Home, or
switches away.

XDG_LOG_HOME is a non-standard variable.  The spec suggests that logs
should go in XDG_STATE_HOME.  Why not a establish a GUIX_LOG_HOME
variable instead?  (if it ever does become a standard XDG variable, its
default may not be the same one picked by Guix Home, causing the same
issue as above).

Setting XDG_RUNTIME_DIR is not something I would expect Guix Home to do
-- it is the job of whatever logs the user in.

XDG_CACHE_HOME, XDG_CONFIG_HOME, XDG_DATA_HOME are set to their defaults
unnecessarily.

I modified my personal config by unsetting XDG_STATE_HOME, XDG_LOG_HOME,
XDG_CACHE_HOME, XDG_CONFIG_HOME, and XDG_DATA_HOME if Guix Home left
them set to their default values (in the case of XDG_STATE_HOME I unset
it unconditionally).




             reply	other threads:[~2022-11-22 12:42 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-11-22  6:02 Matt Armstrong [this message]
2022-11-22  7:09 ` bug#59474: Guix Home generated .profile sets XDG_ vars that break GDM+Gnome login on foreign distros Liliana Marie Prikler
2022-12-13  5:22   ` Andrew Tropin
2023-05-02  2:55 ` Andrew Tropin

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://guix.gnu.org/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87fsebbk80.fsf@rfc20.org \
    --to=matt@rfc20.org \
    --cc=59474@debbugs.gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).