diff --git a/gnu/local.mk b/gnu/local.mk index 15addbe72b..01665ecce8 100644 --- a/gnu/local.mk +++ b/gnu/local.mk @@ -1100,6 +1100,7 @@ dist_patch_DATA = \ %D%/packages/patches/gd-brect-bounds.patch \ %D%/packages/patches/gd-Revert-fix-303-gdlib.pc-use-Requires-instead-of-Libs.patch \ %D%/packages/patches/gdm-default-session.patch \ + %D%/packages/patches/gdm-elogind-support.patch \ %D%/packages/patches/geary-CVE-2020-24661.patch \ %D%/packages/patches/genimage-signedness.patch \ %D%/packages/patches/geoclue-config.patch \ diff --git a/gnu/packages/gnome.scm b/gnu/packages/gnome.scm index 0f4182aa0b..bb0e2aa6d3 100644 --- a/gnu/packages/gnome.scm +++ b/gnu/packages/gnome.scm @@ -8116,128 +8116,132 @@ library.") (define-public gdm (package (name "gdm") - (version "3.34.1") + (version "40.1") (source (origin (method url-fetch) (uri (string-append "mirror://gnome/sources/" name "/" - (version-major+minor version) "/" + (version-major version) "/" name "-" version ".tar.xz")) (sha256 (base32 - "1lyqvcwxhwxklbxn4xjswjzr6fhjix6h28mi9ypn34wdm9bzcpg8")) - (patches (search-patches "gdm-default-session.patch")))) - (build-system glib-or-gtk-build-system) + "1zbks7bwbys1pn7sk0aq0dbn09adx51amb441z4z4j28cvma3f5b")) + (patches + (search-patches + "gdm-default-session.patch" + "gdm-elogind-support.patch")))) + (build-system meson-build-system) (arguments - '(#:configure-flags - `("--without-plymouth" - "--disable-systemd-journal" + `(#:glib-or-gtk? #t + #:configure-flags + ,#~(list + "-Dplymouth=disabled" + "-Dsystemd-journal=false" - ;; Using --with-initial-vt=7 allows GDM to run alongside TTY 1, - ;; instead of having to replace it (i.e., stopping the mingetty - ;; service for TTY 1 before starting GDM). - "--with-initial-vt=7" + ;; Using --with-initial-vt=7 allows GDM to run alongside TTY 1, + ;; instead of having to replace it (i.e., stopping the mingetty + ;; service for TTY 1 before starting GDM). + "-Dinitial-vt=7" - ;; Use '/etc/environment' for locale settings instead of the - ;; systemd-specific '/etc/locale.conf'. - "--with-lang-file=/etc/environment" + ;; Use elogind instead of systemd. + "-Dlogind-provider=elogind" + "-Dsystemdsystemunitdir=no" + "-Dsystemduserunitdir=no" - ,(string-append "--with-udevdir=" - (assoc-ref %outputs "out") "/lib/udev") + ;; Use '/etc/environment' for locale settings instead of the + ;; systemd-specific '/etc/locale.conf'. + "-Dlang-file=/etc/environment" - "--localstatedir=/var" - ,(string-append "--with-default-path=" - (string-join '("/run/setuid-programs" - "/run/current-system/profile/bin" - "/run/current-system/profile/sbin") - ":")) - ;; Put GDM in bindir so that glib-or-gtk-build-system wraps the - ;; XDG_DATA_DIRS so that it finds its schemas. - "--sbindir" ,(string-append (assoc-ref %outputs "out") "/bin")) + (string-append "-Dudev-dir=" #$output "/lib/udev") + + "--localstatedir=/var" + (string-append "-Ddefault-path=" + (string-join '("/run/setuid-programs" + "/run/current-system/profile/bin" + "/run/current-system/profile/sbin") + ":")) + ;; Put GDM in bindir so that glib-or-gtk-build-system wraps the + ;; XDG_DATA_DIRS so that it finds its schemas. + "--sbindir" (string-append #$output "/bin")) #:phases (modify-phases %standard-phases (add-before - 'configure 'pre-configure - (lambda* (#:key inputs outputs #:allow-other-keys) - ;; We don't have . - (substitute* '("common/gdm-log.c" - "daemon/gdm-server.c" - "daemon/gdm-session-worker.c" - "daemon/gdm-session-worker-job.c") - (("#include ") "")) - ;; Use elogind for sd-login. - (substitute* '("common/gdm-common.c" - "daemon/gdm-local-display-factory.c" - "daemon/gdm-manager.c" - "libgdm/gdm-user-switching.c") - (("#include ") - "#include ")) - ;; Check for elogind. - (substitute* '("configure") - (("libsystemd") - "libelogind")) - ;; Look for system-installed sessions in - ;; /run/current-system/profile/share. - (substitute* '("libgdm/gdm-sessions.c" - "daemon/gdm-session.c" - "daemon/gdm-display.c" - "daemon/gdm-launch-environment.c") - (("DATADIR \"/x") - "\"/run/current-system/profile/share/x") - (("DATADIR \"/wayland") - "\"/run/current-system/profile/share/wayland") - (("DATADIR \"/gnome") - "\"/run/current-system/profile/share/gnome")) - (let ((propagate '("GDM_CUSTOM_CONF" - "GDM_DBUS_DAEMON" - "GDM_X_SERVER" - "GDM_X_SESSION" - ;; XXX: Remove this once GNOME Shell is - ;; a dependency of GDM. - "XDG_DATA_DIRS"))) - (substitute* "daemon/gdm-session.c" - (("set_up_session_environment \\(self\\);") - (apply string-append - "set_up_session_environment (self);\n" - (map (lambda (name) - (string-append - "gdm_session_set_environment_variable " - "(self, \"" name "\"," - "g_getenv (\"" name "\"));\n")) - propagate))))) - ;; Find the configuration file using an environment variable. - (substitute* '("common/gdm-settings.c") - (("GDM_CUSTOM_CONF") - (string-append "(g_getenv(\"GDM_CUSTOM_CONF\") != NULL" - " ? g_getenv(\"GDM_CUSTOM_CONF\")" - " : GDM_CUSTOM_CONF)"))) - ;; Use service-supplied path to X. - (substitute* '("daemon/gdm-server.c") - (("\\(X_SERVER X_SERVER_ARG_FORMAT") - "(\"%s\" X_SERVER_ARG_FORMAT, g_getenv (\"GDM_X_SERVER\")")) - (substitute* '("daemon/gdm-wayland-session.c" - "daemon/gdm-x-session.c") - (("\"dbus-daemon\"") - "g_getenv (\"GDM_DBUS_DAEMON\")") - (("X_SERVER") - "g_getenv (\"GDM_X_SERVER\")") - (("GDMCONFDIR \"/Xsession\"") - "g_getenv (\"GDM_X_SESSION\")")) - ;; Use an absolute path for GNOME Session. - (substitute* "daemon/gdm-launch-environment.c" - (("\"gnome-session\"") - (string-append "\"" (assoc-ref inputs "gnome-session") - "/bin/gnome-session\""))) - ;; Do not automatically select the placeholder session. - (substitute* "daemon/gdm-session.c" - (("!g_str_has_suffix [(]base_name, \"\\.desktop\"[)]") - (string-append "!g_str_has_suffix (base_name, \".desktop\") || " - "(g_strcmp0(search_dirs[i], \"" - (assoc-ref outputs "out") "/share/gdm/BuiltInSessions/" - "\") == 0 && " - "g_strcmp0(base_name, \"fail.desktop\") == 0)")) - (("g_error [(]\"GdmSession: no session desktop files installed, aborting\\.\\.\\.\"[)];") - "{ self->fallback_session_name = g_strdup(\"fail\"); goto out; }")) - #t)) + 'configure 'pre-configure + (lambda* (#:key inputs outputs #:allow-other-keys) + ;; We don't have . + (substitute* '("common/gdm-log.c" + "daemon/gdm-server.c" + "daemon/gdm-session-worker.c" + "daemon/gdm-session-worker-job.c") + (("#include ") "")) + ;; Use elogind for sd-login. + (substitute* '("common/gdm-common.c" + "daemon/gdm-local-display-factory.c" + "daemon/gdm-manager.c" + "libgdm/gdm-user-switching.c") + (("#include ") + "#include ")) + ;; Look for system-installed sessions in + ;; /run/current-system/profile/share. + (substitute* '("libgdm/gdm-sessions.c" + "daemon/gdm-session.c" + "daemon/gdm-display.c" + "daemon/gdm-launch-environment.c") + (("DATADIR \"/x") + "\"/run/current-system/profile/share/x") + (("DATADIR \"/wayland") + "\"/run/current-system/profile/share/wayland") + (("DATADIR \"/gnome") + "\"/run/current-system/profile/share/gnome")) + (let ((propagate '("GDM_CUSTOM_CONF" + "GDM_DBUS_DAEMON" + "GDM_X_SERVER" + "GDM_X_SESSION" + ;; XXX: Remove this once GNOME Shell is + ;; a dependency of GDM. + "XDG_DATA_DIRS"))) + (substitute* "daemon/gdm-session.c" + (("set_up_session_environment \\(self\\);") + (apply string-append + "set_up_session_environment (self);\n" + (map (lambda (name) + (string-append + "gdm_session_set_environment_variable " + "(self, \"" name "\"," + "g_getenv (\"" name "\"));\n")) + propagate))))) + ;; Find the configuration file using an environment variable. + (substitute* '("common/gdm-settings.c") + (("GDM_CUSTOM_CONF") + (string-append "(g_getenv(\"GDM_CUSTOM_CONF\") != NULL" + " ? g_getenv(\"GDM_CUSTOM_CONF\")" + " : GDM_CUSTOM_CONF)"))) + ;; Use service-supplied path to X. + (substitute* '("daemon/gdm-server.c") + (("\\(X_SERVER X_SERVER_ARG_FORMAT") + "(\"%s\" X_SERVER_ARG_FORMAT, g_getenv (\"GDM_X_SERVER\")")) + (substitute* '("daemon/gdm-wayland-session.c" + "daemon/gdm-x-session.c") + (("\"dbus-daemon\"") + "g_getenv (\"GDM_DBUS_DAEMON\")") + (("X_SERVER") + "g_getenv (\"GDM_X_SERVER\")") + (("GDMCONFDIR \"/Xsession\"") + "g_getenv (\"GDM_X_SESSION\")")) + ;; Use an absolute path for GNOME Session. + (substitute* "daemon/gdm-launch-environment.c" + (("\"gnome-session\"") + (string-append "\"" (assoc-ref inputs "gnome-session") + "/bin/gnome-session\""))) + ;; Do not automatically select the placeholder session. + (substitute* "daemon/gdm-session.c" + (("!g_str_has_suffix [(]base_name, \"\\.desktop\"[)]") + (string-append "!g_str_has_suffix (base_name, \".desktop\") || " + "(g_strcmp0(search_dirs[i], \"" + (assoc-ref outputs "out") "/share/gdm/BuiltInSessions/" + "\") == 0 && " + "g_strcmp0(base_name, \"fail.desktop\") == 0)")) + (("g_error [(]\"GdmSession: no session desktop files installed, aborting\\.\\.\\.\"[)];") + "{ self->fallback_session_name = g_strdup(\"fail\"); goto out; }")))) ;; GDM requires that there be at least one desktop entry ;; file. This phase installs a hidden one that simply ;; fails. This enables users to use GDM with a @@ -8259,8 +8263,7 @@ library.") "Name=Fail\n" "Comment=This session fails immediately.\n" "NoDisplay=true\n" - "Exec=false\n")))) - #t))) + "Exec=false\n"))))))) ;; GDM needs GNOME Session to run these applications. We link ;; their autostart files in `share/gdm/greeter/autostart' ;; because GDM explicitly tells GNOME Session to look there. @@ -8277,8 +8280,8 @@ library.") (with-directory-excursion autostart (for-each (lambda (desktop) (symlink desktop (basename desktop))) - (find-files (string-append settings "/etc/xdg")))) - #t)))))) + (find-files + (string-append settings "/etc/xdg")))))))))) (native-inputs `(("dconf" ,dconf) ("glib:bin" ,glib "bin") ; for glib-compile-schemas, etc. @@ -8291,6 +8294,7 @@ library.") `(("accountsservice" ,accountsservice) ("check" ,check-0.14) ;for testing ("elogind" ,elogind) + ("eudev" ,eudev) ("gnome-session" ,gnome-session) ("gnome-settings-daemon" ,gnome-settings-daemon) ("gtk+" ,gtk+) diff --git a/gnu/packages/patches/gdm-default-session.patch b/gnu/packages/patches/gdm-default-session.patch index 9ab2829cdb..3ff8d0da7c 100644 --- a/gnu/packages/patches/gdm-default-session.patch +++ b/gnu/packages/patches/gdm-default-session.patch @@ -4,11 +4,9 @@ and not in the directories listed in $XDG_DATA_DIRS. The latter includes /run/current-system/profile, and only then. Fixes . - -diff -ur a/daemon/gdm-session.c b/daemon/gdm-session.c ---- a/daemon/gdm-session.c 2019-09-25 10:40:24.000000000 -0400 -+++ b/daemon/gdm-session.c 2020-04-18 18:30:02.671856808 -0400 -@@ -348,24 +348,18 @@ +--- a/daemon/gdm-session.c 2021-07-23 15:16:15.164201000 +0000 ++++ b/daemon/gdm-session.c 2021-09-26 08:18:58.730134555 +0000 +@@ -354,13 +354,12 @@ GArray *search_array = NULL; char **search_dirs; int i; @@ -19,22 +17,23 @@ diff -ur a/daemon/gdm-session.c b/daemon/gdm-session.c DMCONFDIR "/Sessions/", DATADIR "/gdm/BuiltInSessions/", - DATADIR "/xsessions/", -+ "/run/current-system/profile/share/xsessions/" ++ "/run/current-system/profile/share/xsessions/", }; static const char *wayland_search_dir = DATADIR "/wayland-sessions/"; - +@@ -368,11 +367,6 @@ search_array = g_array_new (TRUE, TRUE, sizeof (char *)); -- for (i = 0; system_data_dirs[i]; i++) { -- gchar *dir = g_build_filename (system_data_dirs[i], "xsessions", NULL); -- g_array_append_val (search_array, dir); -- } + if (type == NULL || g_str_equal (type, "x11")) { +- for (i = 0; system_data_dirs[i]; i++) { +- gchar *dir = g_build_filename (system_data_dirs[i], "xsessions", NULL); +- g_array_append_val (search_array, dir); +- } - - g_array_append_vals (search_array, x_search_dirs, G_N_ELEMENTS (x_search_dirs)); + g_array_append_vals (search_array, x_search_dirs, G_N_ELEMENTS (x_search_dirs)); + } - #ifdef ENABLE_WAYLAND_SUPPORT -@@ -373,16 +367,7 @@ +@@ -382,16 +376,7 @@ #ifdef ENABLE_USER_DISPLAY_SERVER g_array_prepend_val (search_array, wayland_search_dir); diff --git a/gnu/packages/patches/gdm-elogind-support.patch b/gnu/packages/patches/gdm-elogind-support.patch new file mode 100644 index 0000000000..39cd12dd22 --- /dev/null +++ b/gnu/packages/patches/gdm-elogind-support.patch @@ -0,0 +1,211 @@ +https://gitlab.gnome.org/GNOME/gdm/-/merge_requests/113 + +From 462cc0f5346f5913cf7151044f1c232c5d21c1c3 Mon Sep 17 00:00:00 2001 +From: Dudemanguy +Date: Mon, 5 Oct 2020 18:41:55 -0500 +Subject: [PATCH] meson: allow building with elogind + +Currently, the GDM meson build has a hard dependency on systemd. +However, GDM can function just fine if one is using elogind. This allows +a user to build GDM against libelogind and also disable the systemd +system and user units. +--- + common/meson.build | 2 +- + data/meson.build | 62 ++++++++++++++---------- + data/pam-arch/gdm-launch-environment.pam | 1 + + libgdm/meson.build | 2 +- + meson.build | 36 +++++++++----- + meson_options.txt | 5 +- + 6 files changed, 66 insertions(+), 42 deletions(-) + +diff --git a/common/meson.build b/common/meson.build +index 074dd92e1..bca58f7c4 100644 +--- a/common/meson.build ++++ b/common/meson.build +@@ -11,7 +11,7 @@ libgdmcommon_src = files( + ) + + libgdmcommon_deps = [ +- libsystemd_dep, ++ logind_dep, + gobject_dep, + gio_dep, + gio_unix_dep, +diff --git a/data/meson.build b/data/meson.build +index 7c5222eaf..403336c31 100644 +--- a/data/meson.build ++++ b/data/meson.build +@@ -168,41 +168,53 @@ else + service_config.set('PLYMOUTH_QUIT_SERVICE', '') + endif + +-if get_option('systemdsystemunitdir') != '' +- systemd_systemunitdir = get_option('systemdsystemunitdir') +-else +- systemd_systemunitdir = systemd_dep.get_pkgconfig_variable('systemdsystemunitdir') ++systemdsystemunitdir = get_option('systemdsystemunitdir') ++if systemdsystemunitdir != 'no' ++ assert(systemd_dep.found(), 'systemd required but not found, please provide a valid systemd system unit dir or disable it') ++ if get_option('systemdsystemunitdir') != '' ++ systemd_systemunitdir = get_option('systemdsystemunitdir') ++ else ++ systemd_systemunitdir = systemd_dep.get_pkgconfig_variable('systemdsystemunitdir') ++ endif + endif + +-if get_option('systemduserunitdir') != '' +- systemd_userunitdir = get_option('systemduserunitdir') +-else +- systemd_userunitdir = systemd_dep.get_pkgconfig_variable('systemduserunitdir', +- define_variable: ['prefix', get_option('prefix')]) ++systemduserunitdir = get_option('systemduserunitdir') ++if systemduserunitdir != 'no' ++ assert(systemd_dep.found(), 'systemd required but not found, please provide a valid systemd user unit dir or disable it') ++ if get_option('systemduserunitdir') != '' ++ systemd_userunitdir = get_option('systemduserunitdir') ++ else ++ systemd_userunitdir = systemd_dep.get_pkgconfig_variable('systemduserunitdir', ++ define_variable: ['prefix', get_option('prefix')]) ++ endif + endif + +-configure_file( +- input: 'gdm.service.in', +- output: '@BASENAME@', +- configuration: service_config, +- install_dir: systemd_systemunitdir, +- format: 'cmake' +-) ++if systemdsystemunitdir != 'no' ++ configure_file( ++ input: 'gdm.service.in', ++ output: '@BASENAME@', ++ configuration: service_config, ++ install_dir: systemd_systemunitdir, ++ format: 'cmake' ++ ) ++endif + + gdm_gnome_session_wanted_targets = [] + foreach component: gdm_gnome_user_session_wanted_components + gdm_gnome_session_wanted_targets += 'Wants=@0@.target'.format(component) + endforeach + +-configure_file( +- input: 'session.conf.in', +- output: 'session.conf', +- configuration: { +- 'requires_component': gdm_gnome_shell_component, +- 'wants_required_components': '\n'.join(gdm_gnome_session_wanted_targets), +- }, +- install_dir: systemd_userunitdir / 'gnome-session@gnome-login.target.d', +-) ++if systemduserunitdir != 'no' ++ configure_file( ++ input: 'session.conf.in', ++ output: 'session.conf', ++ configuration: { ++ 'requires_component': gdm_gnome_shell_component, ++ 'wants_required_components': '\n'.join(gdm_gnome_session_wanted_targets), ++ }, ++ install_dir: systemd_userunitdir / 'gnome-session@gnome-login.target.d', ++ ) ++endif + + # XSession + if get_option('gdm-xsession') +diff --git a/libgdm/meson.build b/libgdm/meson.build +index 3f8cafbb7..83e95151b 100644 +--- a/libgdm/meson.build ++++ b/libgdm/meson.build +@@ -56,7 +56,7 @@ libgdm_deps = [ + glib_dep, + gio_dep, + gio_unix_dep, +- libsystemd_dep, ++ logind_dep, + libgdmcommon_dep, + ] + +diff --git a/meson.build b/meson.build +index e6fcf4b8b..a86a486b7 100644 +--- a/meson.build ++++ b/meson.build +@@ -92,21 +92,30 @@ xdmcp_dep = cc.find_library('Xdmcp', required: get_option('xdmcp')) + if xdmcp_dep.found() and get_option('tcp-wrappers') + libwrap_dep = cc.find_library('libwrap') + endif +-# systemd +-systemd_dep = dependency('systemd') +-libsystemd_dep = dependency('libsystemd') +-if meson.version().version_compare('>= 0.53') +- systemd_multiseat_x = find_program('systemd-multi-seat-x', +- required: false, +- dirs: [ +- systemd_dep.get_pkgconfig_variable('systemdutildir'), +- '/lib/systemd', +- '/usr/lib/systemd', +- ]) ++ ++logind_provider = get_option('logind-provider') ++systemd_dep = dependency('systemd', required: false) ++if logind_provider == 'systemd' ++ libsystemd_dep = dependency('libsystemd') ++ logind_dep = libsystemd_dep ++ if meson.version().version_compare('>= 0.53') ++ systemd_multiseat_x = find_program('systemd-multi-seat-x', ++ required: false, ++ dirs: [ ++ systemd_dep.get_pkgconfig_variable('systemdutildir'), ++ '/lib/systemd', ++ '/usr/lib/systemd', ++ ]) ++ else ++ systemd_multiseat_x = find_program('systemd-multi-seat-x', required: false) ++ endif ++ systemd_x_server = systemd_multiseat_x.found()? systemd_multiseat_x.path() : '/lib/systemd/systemd-multi-seat-x' + else +- systemd_multiseat_x = find_program('systemd-multi-seat-x', required: false) ++ elogind_dep = dependency('libelogind') ++ logind_dep = elogind_dep ++ systemd_x_server = 'disabled' + endif +-systemd_x_server = systemd_multiseat_x.found()? systemd_multiseat_x.path() : '/lib/systemd/systemd-multi-seat-x' ++ + # Plymouth + plymouth_dep = dependency('ply-boot-client', required: get_option('plymouth')) + # Check for Solaris auditing API (ADT) +@@ -313,6 +322,7 @@ summary({ + 'PAM Syslog': have_pam_syslog, + 'Supports PAM Extensions': pam_extensions_supported, + 'SeLinux': libselinux_dep.found(), ++ 'Logind Provider': get_option('logind-provider'), + 'Use GDM Xsession': get_option('gdm-xsession'), + 'Use UserDisplayServer': get_option('user-display-server'), + 'Use SystemdJournal': get_option('systemd-journal'), +diff --git a/meson_options.txt b/meson_options.txt +index 14e0b908b..5135d7d66 100644 +--- a/meson_options.txt ++++ b/meson_options.txt +@@ -12,6 +12,7 @@ option('initial-vt', type: 'integer', value: 1, description: 'Initial virtual te + option('ipv6', type: 'boolean', value: false, description: 'Enables compilation of IPv6 code.') + option('lang-file', type: 'string', value: '', description: 'File containing default language settings.') + option('libaudit', type: 'feature', value: 'auto', description: 'Add Linux audit support.') ++option('logind-provider', type: 'combo', choices: ['systemd', 'elogind'], value: 'systemd', description: 'Which logind library to use.') + option('log-dir', type: 'string', value: '/var/log/gdm', description: 'Log directory.') + option('pam-mod-dir', type: 'string', value: '', description: 'Directory to install PAM modules in.') + option('pam-prefix', type: 'string', value: '', description: 'Specify where PAM files go.') +@@ -27,8 +28,8 @@ option('solaris', type: 'boolean', value: false, description: 'Build for Solaris + option('split-authentication', type: 'boolean', value: true, description: 'Enable multiple simultaneous PAM conversations during login.') + option('sysconfsubdir', type: 'string', value: 'gdm', description: 'Directory name used under sysconfdir.') + option('systemd-journal', type: 'boolean', value: true, description: 'Use journald support.') +-option('systemdsystemunitdir', type: 'string', value: '', description: 'Directory for systemd service files.') +-option('systemduserunitdir', type: 'string', value: '', description: 'Directory for systemd user service files.') ++option('systemdsystemunitdir', type: 'string', value: '', description: 'Directory for systemd service files, or \'no\' to disable.') ++option('systemduserunitdir', type: 'string', value: '', description: 'Directory for systemd user service files, or \'no\' to disable.') + option('tcp-wrappers', type: 'boolean', value: false, description: 'Use TCP wrappers.') + option('udev-dir', type: 'string', value: '', description: 'Directory for udev rules file.') + option('user', type: 'string', value: 'gdm', description: 'GDM\'s username.') +-- +GitLab +