diff --git a/pkgs/applications/display-managers/sddm/default.nix b/pkgs/applications/display-managers/sddm/default.nix index 8c7e1745bcd3..0e09fd43f0c6 100644 --- a/pkgs/applications/display-managers/sddm/default.nix +++ b/pkgs/applications/display-managers/sddm/default.nix @@ -1,82 +1,34 @@ -{ stdenv, lib, fetchFromGitHub -, cmake, pkg-config, qttools -, libxcb, libXau, pam, qtbase, wrapQtAppsHook, qtdeclarative -, qtquickcontrols2 ? null, systemd, xkeyboardconfig +{ + callPackage, + runCommand, + wrapQtAppsHook, + unwrapped ? callPackage ./unwrapped.nix {}, + extraPackages ? [], }: -let - isQt6 = lib.versions.major qtbase.version == "6"; -in stdenv.mkDerivation { - pname = "sddm"; - version = "0.20.0-unstable-2023-12-29"; +runCommand "sddm-wrapped" { + inherit (unwrapped) version; - src = fetchFromGitHub { - owner = "sddm"; - repo = "sddm"; - rev = "501129294be1487f753482c29949fc1c19ef340e"; - hash = "sha256-mLm987Ah0X9s0tBK2a45iERwYoh5JzWb3TFlSoxi8CA="; + buildInputs = unwrapped.buildInputs ++ extraPackages; + nativeBuildInputs = [ wrapQtAppsHook ]; + + passthru = { + inherit unwrapped; }; - patches = [ - ./sddm-ignore-config-mtime.patch - ./sddm-default-session.patch - ]; + meta = unwrapped.meta; +} '' + mkdir -p $out/bin - postPatch = '' - substituteInPlace src/greeter/waylandkeyboardbackend.cpp \ - --replace "/usr/share/X11/xkb/rules/evdev.xml" "${xkeyboardconfig}/share/X11/xkb/rules/evdev.xml" - ''; + cd ${unwrapped} - nativeBuildInputs = [ wrapQtAppsHook cmake pkg-config qttools ]; + for i in *; do + if [ "$i" == "bin" ]; then + continue + fi + ln -s ${unwrapped}/$i $out/$i + done - buildInputs = [ - libxcb - libXau - pam - qtbase - qtdeclarative - qtquickcontrols2 - systemd - ]; - - cmakeFlags = [ - (lib.cmakeBool "BUILD_WITH_QT6" isQt6) - "-DCONFIG_FILE=/etc/sddm.conf" - "-DCONFIG_DIR=/etc/sddm.conf.d" - - # Set UID_MIN and UID_MAX so that the build script won't try - # to read them from /etc/login.defs (fails in chroot). - # The values come from NixOS; they may not be appropriate - # for running SDDM outside NixOS, but that configuration is - # not supported anyway. - "-DUID_MIN=1000" - "-DUID_MAX=29999" - - # we still want to run the DM on VT 7 for the time being, as 1-6 are - # occupied by getties by default - "-DSDDM_INITIAL_VT=7" - - "-DQT_IMPORTS_DIR=${placeholder "out"}/${qtbase.qtQmlPrefix}" - "-DCMAKE_INSTALL_SYSCONFDIR=${placeholder "out"}/etc" - "-DSYSTEMD_SYSTEM_UNIT_DIR=${placeholder "out"}/lib/systemd/system" - "-DSYSTEMD_SYSUSERS_DIR=${placeholder "out"}/lib/sysusers.d" - "-DSYSTEMD_TMPFILES_DIR=${placeholder "out"}/lib/tmpfiles.d" - "-DDBUS_CONFIG_DIR=${placeholder "out"}/share/dbus-1/system.d" - ]; - - postInstall = '' - # remove empty scripts - rm "$out/share/sddm/scripts/Xsetup" "$out/share/sddm/scripts/Xstop" - for f in $out/share/sddm/themes/**/theme.conf ; do - substituteInPlace $f \ - --replace 'background=' "background=$(dirname $f)/" - done - ''; - - meta = with lib; { - description = "QML based X11 display manager"; - homepage = "https://github.com/sddm/sddm"; - maintainers = with maintainers; [ abbradar ttuegel ]; - platforms = platforms.linux; - license = licenses.gpl2Plus; - }; -} + for i in bin/*; do + makeQtWrapper ${unwrapped}/$i $out/$i --set SDDM_GREETER $out/bin/sddm-greeter + done +'' diff --git a/pkgs/applications/display-managers/sddm/greeter-path.patch b/pkgs/applications/display-managers/sddm/greeter-path.patch new file mode 100644 index 000000000000..d8dbc8b30647 --- /dev/null +++ b/pkgs/applications/display-managers/sddm/greeter-path.patch @@ -0,0 +1,32 @@ +diff --git a/src/daemon/Greeter.cpp b/src/daemon/Greeter.cpp +index c0437ae..f814146 100644 +--- a/src/daemon/Greeter.cpp ++++ b/src/daemon/Greeter.cpp +@@ -85,6 +85,9 @@ namespace SDDM { + if (m_started) + return false; + ++ // Nixpkgs: use wrapped greeter if available ++ QString greeter = qEnvironmentVariable("SDDM_GREETER", QStringLiteral("%1/sddm-greeter").arg(QStringLiteral(BIN_INSTALL_DIR))); ++ + // themes + QString xcursorTheme = mainConfig.Theme.CursorTheme.get(); + if (m_themeConfig->contains(QLatin1String("cursorTheme"))) +@@ -139,7 +142,7 @@ namespace SDDM { + m_process->setProcessEnvironment(env); + } + // Greeter command +- m_process->start(QStringLiteral("%1/sddm-greeter").arg(QStringLiteral(BIN_INSTALL_DIR)), args); ++ m_process->start(greeter, args); + + //if we fail to start bail immediately, and don't block in waitForStarted + if (m_process->state() == QProcess::NotRunning) { +@@ -173,7 +176,7 @@ namespace SDDM { + + // command + QStringList cmd; +- cmd << QStringLiteral("%1/sddm-greeter").arg(QStringLiteral(BIN_INSTALL_DIR)) ++ cmd << greeter + << args; + + // greeter environment diff --git a/pkgs/applications/display-managers/sddm/unwrapped.nix b/pkgs/applications/display-managers/sddm/unwrapped.nix new file mode 100644 index 000000000000..a18c33b0f20b --- /dev/null +++ b/pkgs/applications/display-managers/sddm/unwrapped.nix @@ -0,0 +1,86 @@ +{ stdenv, lib, fetchFromGitHub +, cmake, pkg-config, qttools +, libxcb, libXau, pam, qtbase, qtdeclarative +, qtquickcontrols2 ? null, systemd, xkeyboardconfig +}: +let + isQt6 = lib.versions.major qtbase.version == "6"; +in stdenv.mkDerivation { + pname = "sddm-unwrapped"; + version = "0.20.0-unstable-2023-12-29"; + + src = fetchFromGitHub { + owner = "sddm"; + repo = "sddm"; + rev = "501129294be1487f753482c29949fc1c19ef340e"; + hash = "sha256-mLm987Ah0X9s0tBK2a45iERwYoh5JzWb3TFlSoxi8CA="; + }; + + patches = [ + ./greeter-path.patch + ./sddm-ignore-config-mtime.patch + ./sddm-default-session.patch + ]; + + postPatch = '' + substituteInPlace src/greeter/waylandkeyboardbackend.cpp \ + --replace "/usr/share/X11/xkb/rules/evdev.xml" "${xkeyboardconfig}/share/X11/xkb/rules/evdev.xml" + ''; + + nativeBuildInputs = [ cmake pkg-config qttools ]; + + buildInputs = [ + libxcb + libXau + pam + qtbase + qtdeclarative + qtquickcontrols2 + systemd + ]; + + # We will wrap manually later + dontWrapQtApps = true; + + cmakeFlags = [ + (lib.cmakeBool "BUILD_WITH_QT6" isQt6) + "-DCONFIG_FILE=/etc/sddm.conf" + "-DCONFIG_DIR=/etc/sddm.conf.d" + + # Set UID_MIN and UID_MAX so that the build script won't try + # to read them from /etc/login.defs (fails in chroot). + # The values come from NixOS; they may not be appropriate + # for running SDDM outside NixOS, but that configuration is + # not supported anyway. + "-DUID_MIN=1000" + "-DUID_MAX=29999" + + # we still want to run the DM on VT 7 for the time being, as 1-6 are + # occupied by getties by default + "-DSDDM_INITIAL_VT=7" + + "-DQT_IMPORTS_DIR=${placeholder "out"}/${qtbase.qtQmlPrefix}" + "-DCMAKE_INSTALL_SYSCONFDIR=${placeholder "out"}/etc" + "-DSYSTEMD_SYSTEM_UNIT_DIR=${placeholder "out"}/lib/systemd/system" + "-DSYSTEMD_SYSUSERS_DIR=${placeholder "out"}/lib/sysusers.d" + "-DSYSTEMD_TMPFILES_DIR=${placeholder "out"}/lib/tmpfiles.d" + "-DDBUS_CONFIG_DIR=${placeholder "out"}/share/dbus-1/system.d" + ]; + + postInstall = '' + # remove empty scripts + rm "$out/share/sddm/scripts/Xsetup" "$out/share/sddm/scripts/Xstop" + for f in $out/share/sddm/themes/**/theme.conf ; do + substituteInPlace $f \ + --replace 'background=' "background=$(dirname $f)/" + done + ''; + + meta = with lib; { + description = "QML based X11 display manager"; + homepage = "https://github.com/sddm/sddm"; + maintainers = with maintainers; [ abbradar ttuegel k900 ]; + platforms = platforms.linux; + license = licenses.gpl2Plus; + }; +}