From 8e7fecb19ada68fc33fa5348bc41528e0978c976 Mon Sep 17 00:00:00 2001 From: K900 Date: Tue, 17 Dec 2024 14:16:10 +0300 Subject: [PATCH] wrapAAGL: sync with latest nixpkgs Steam packaging This removes a bunch of hacks and massively reduces closure size, and also fixes build on staging-next where the GNOME2 bits are in an ongoing state of falling apart. --- pkgs/wrapAAGL/fhsenv.nix | 365 ++++++++++++--------------------------- 1 file changed, 115 insertions(+), 250 deletions(-) diff --git a/pkgs/wrapAAGL/fhsenv.nix b/pkgs/wrapAAGL/fhsenv.nix index 61807b1..8019c9e 100644 --- a/pkgs/wrapAAGL/fhsenv.nix +++ b/pkgs/wrapAAGL/fhsenv.nix @@ -1,274 +1,139 @@ -{ lib, writeShellScript, buildFHSEnv -, extraPkgs ? pkgs: [ ] # extra packages to add to targetPkgs -, extraLibraries ? pkgs: [ ] # extra packages to add to multiPkgs -, extraProfile ? "" # string to append to profile -, extraBwrapArgs ? [ ] # extra arguments to pass to bubblewrap -, extraEnv ? { } # Environment variables to pass to Steam -, withGameSpecificLibraries ? true # include game specific libraries +{ + lib, + steam-unwrapped, + buildFHSEnv, + writeShellScript, + extraPkgs ? pkgs: [ ], # extra packages to add to targetPkgs + extraLibraries ? pkgs: [ ], # extra packages to add to multiPkgs + extraProfile ? "", # string to append to profile + extraPreBwrapCmds ? "", # extra commands to run before calling bubblewrap + extraBwrapArgs ? [ ], # extra arguments to pass to bubblewrap (real default is at usage site) + extraArgs ? "", # arguments to always pass to steam + extraEnv ? { }, # Environment variables to pass to Steam }: - let - commonTargetPkgs = pkgs: with pkgs; [ - # Needed for operating system detection until - # https://github.com/ValveSoftware/steam-for-linux/issues/5909 is resolved - lsb-release - # Errors in output without those - pciutils - # Games' dependencies - xorg.xrandr - which - # Needed by gdialog, including in the steam-runtime - perl - # Open URLs - xdg-utils - iana-etc - # Steam Play / Proton - python3 - # Steam VR - procps - usbutils - - # It tries to execute xdg-user-dir and spams the log with command not founds - xdg-user-dirs - - # electron based launchers need newer versions of these libraries than what runtime provides - mesa - sqlite - ] ++ extraPkgs pkgs; + steamEnv = { name, runScript, passthru ? {}, meta ? {} }: + buildFHSEnv { + inherit name runScript passthru meta; + + multiArch = true; + includeClosures = true; + + # https://gitlab.steamos.cloud/steamrt/steam-runtime-tools/-/blob/main/docs/distro-assumptions.md#command-line-tools + targetPkgs = pkgs: with pkgs; [ + bash + coreutils + file + lsb-release # not documented, called from Big Picture + pciutils # not documented, complains about lspci on startup + glibc_multi.bin + xz + zenity + + # Steam expects it to be /sbin specifically + (pkgs.runCommand "sbin-ldconfig" {} '' + mkdir -p $out/sbin + ln -s /bin/ldconfig $out/sbin/ldconfig + '') + + # crashes on startup if it can't find libX11 locale files + (pkgs.runCommand "xorg-locale" {} '' + mkdir -p $out + ln -s ${xorg.libX11}/share $out/share + '') + ] ++ extraPkgs pkgs; + + # https://gitlab.steamos.cloud/steamrt/steam-runtime-tools/-/blob/main/docs/distro-assumptions.md#shared-libraries + multiPkgs = pkgs: with pkgs; [ + glibc + libxcrypt + libGL + + libdrm + (pkgs.libgbm or pkgs.mesa) + udev + libudev0-shim + libva + vulkan-loader + + networkmanager # not documented, used for network status things in Big Picture + # FIXME: figure out how to only build libnm? + libcap # not documented, required by srt-bwrap + ] ++ extraLibraries pkgs; + + extraInstallCommands = lib.optionalString (steam-unwrapped != null) '' + ln -s ${steam-unwrapped}/share $out/share + ''; - # ldPath = lib.optionals stdenv.is64bit [ "/lib64" ] - # ++ [ "/lib32" ] - # ++ map (x: "/steamrt/${steam-runtime-wrapped.arch}/" + x) steam-runtime-wrapped.libs - # ++ lib.optionals (steam-runtime-wrapped-i686 != null) (map (x: "/steamrt/${steam-runtime-wrapped-i686.arch}/" + x) steam-runtime-wrapped-i686.libs); - # - # # Zachtronics and a few other studios expect STEAM_LD_LIBRARY_PATH to be present - # exportLDPath = '' - # export LD_LIBRARY_PATH=${lib.concatStringsSep ":" ldPath}''${LD_LIBRARY_PATH:+:}$LD_LIBRARY_PATH - # export STEAM_LD_LIBRARY_PATH="$STEAM_LD_LIBRARY_PATH''${STEAM_LD_LIBRARY_PATH:+:}$LD_LIBRARY_PATH" - # ''; + profile = '' + # prevents log spam from SteamRT GTK trying to load host GIO modules + unset GIO_EXTRA_MODULES + + # udev event notifications don't work reliably inside containers. + # SDL2 already tries to automatically detect flatpak and pressure-vessel + # and falls back to inotify-based discovery [1]. We make SDL2 do the + # same by telling it explicitly. + # + # [1] + export SDL_JOYSTICK_DISABLE_UDEV=1 + + # This is needed for IME (e.g. iBus, fcitx5) to function correctly on non-CJK locales + # https://github.com/ValveSoftware/steam-for-linux/issues/781#issuecomment-2004757379 + export GTK_IM_MODULE='xim' + + # See https://gitlab.steamos.cloud/steamrt/steam-runtime-tools/-/blob/main/docs/distro-assumptions.md#graphics-driver + export LIBGL_DRIVERS_PATH=/run/opengl-driver/lib/dri:/run/opengl-driver-32/lib/dri + export __EGL_VENDOR_LIBRARY_DIRS=/run/opengl-driver/share/glvnd/egl_vendor.d:/run/opengl-driver-32/share/glvnd/egl_vendor.d + export LIBVA_DRIVERS_PATH=/run/opengl-driver/lib/dri:/run/opengl-driver-32/lib/dri + export VDPAU_DRIVER_PATH=/run/opengl-driver/lib/vdpau:/run/opengl-driver-32/lib/vdpau + + set -a + ${lib.toShellVars extraEnv} + set +a + + ${extraProfile} + ''; - # bootstrap.tar.xz has 444 permissions, which means that simple deletes fail - # and steam will not be able to start - fixBootstrap = '' - if [ -r $HOME/.local/share/Steam/bootstrap.tar.xz ]; then - chmod +w $HOME/.local/share/Steam/bootstrap.tar.xz - fi - ''; + privateTmp = true; - envScript = lib.toShellVars extraEnv; + inherit extraPreBwrapCmds; -in buildFHSEnv rec { + extraBwrapArgs = [ + # Steam will dump crash reports here, make those more accessible + "--bind-try /tmp/dumps /tmp/dumps" + ] ++ extraBwrapArgs; + }; +in steamEnv { name = "steam"; - # Steam still needs 32bit and various native games do too - multiArch = true; - - targetPkgs = pkgs: with pkgs; [ - steam - # License agreement - gnome.zenity - ] ++ commonTargetPkgs pkgs; - - multiPkgs = pkgs: with pkgs; [ - # These are required by steam with proper errors - xorg.libXcomposite - xorg.libXtst - xorg.libXrandr - xorg.libXext - xorg.libX11 - xorg.libXfixes - libGL - libva - pipewire - - # steamwebhelper - harfbuzz - libthai - pango - - lsof # friends options won't display "Launch Game" without it - file # called by steam's setup.sh - - # dependencies for mesa drivers, needed inside pressure-vessel - mesa.llvmPackages.llvm.lib - vulkan-loader - expat - wayland - xorg.libxcb - xorg.libXdamage - xorg.libxshmfence - xorg.libXxf86vm - libelf - (lib.getLib elfutils) - - # Without these it silently fails - xorg.libXinerama - xorg.libXcursor - xorg.libXrender - xorg.libXScrnSaver - xorg.libXi - xorg.libSM - xorg.libICE - gnome2.GConf - curl - nspr - nss - cups - libcap - SDL2 - libusb1 - dbus-glib - gsettings-desktop-schemas - ffmpeg - libudev0-shim - - # Verified games requirements - fontconfig - freetype - xorg.libXt - xorg.libXmu - libogg - libvorbis - SDL - SDL2_image - glew110 - libdrm - libidn - tbb - zlib - - # SteamVR - udev - dbus - - # Other things from runtime - glib - gtk2 - bzip2 - flac - freeglut - libjpeg - libpng - libpng12 - libsamplerate - libmikmod - libtheora - libtiff - pixman - speex - SDL_image - SDL_ttf - SDL_mixer - SDL2_ttf - SDL2_mixer - libappindicator-gtk2 - libdbusmenu-gtk2 - libindicator-gtk2 - libcaca - libcanberra - libgcrypt - libunwind - libvpx - librsvg - xorg.libXft - libvdpau - - # required by coreutils stuff to run correctly - # Steam ends up with LD_LIBRARY_PATH=:/usr/lib: - # which overrides DT_RUNPATH in our binaries, so it tries to dynload the - # very old versions of stuff from the runtime. - # FIXME: how do we even fix this correctly - attr - ] ++ lib.optionals withGameSpecificLibraries [ - # Not formally in runtime but needed by some games - at-spi2-atk - at-spi2-core # CrossCode - gst_all_1.gstreamer - gst_all_1.gst-plugins-ugly - gst_all_1.gst-plugins-base - json-glib # paradox launcher (Stellaris) - libdrm - libxkbcommon # paradox launcher - libvorbis # Dead Cells - libxcrypt # Alien Isolation, XCOM 2, Company of Heroes 2 - mono - ncurses # Crusader Kings III - openssl - xorg.xkeyboardconfig - xorg.libpciaccess - xorg.libXScrnSaver # Dead Cells - icu # dotnet runtime, e.g. Stardew Valley - - # screeps dependencies - gtk3 - zlib - atk - cairo - freetype - gdk-pixbuf - fontconfig - - # Prison Architect - libGLU - libuuid - libbsd - alsa-lib - - # Loop Hero - # FIXME: Also requires openssl_1_1, which is EOL. Either find an alternative solution, or remove these dependencies (if not needed by other games) - libidn2 - libpsl - nghttp2.lib - rtmpdump - ] - ++ extraLibraries pkgs; - - profile = '' - # Workaround for issue #44254 (Steam cannot connect to friends network) - # https://github.com/NixOS/nixpkgs/issues/44254 - if [ -z ''${TZ+x} ]; then - new_TZ="$(readlink -f /etc/localtime | grep -P -o '(?<=/zoneinfo/).*$')" - if [ $? -eq 0 ]; then - export TZ="$new_TZ" - fi - fi - - # udev event notifications don't work reliably inside containers. - # SDL2 already tries to automatically detect flatpak and pressure-vessel - # and falls back to inotify-based discovery [1]. We make SDL2 do the - # same by telling it explicitly. - # - # [1] - export SDL_JOYSTICK_DISABLE_UDEV=1 - '' + extraProfile; - - inherit extraBwrapArgs; + runScript = writeShellScript "steam-wrapped" '' + exec steam ${extraArgs} "$@" + ''; - passthru.run = buildFHSEnv { + passthru.run = steamEnv { name = "steam-run"; - targetPkgs = commonTargetPkgs; - inherit multiArch multiPkgs profile extraBwrapArgs; - runScript = writeShellScript "steam-run" '' - run="$1" - if [ "$run" = "" ]; then + if [ $# -eq 0 ]; then echo "Usage: steam-run command-to-run args..." >&2 exit 1 fi - shift - ${fixBootstrap} - - set -o allexport # Export the following env vars - ${envScript} - exec -- "$run" "$@" + exec "$@" ''; - meta = ({}) // { + meta = (steam-unwrapped.meta or {}) // { description = "Run commands in the same FHS environment that is used for Steam"; mainProgram = "steam-run"; name = "steam-run"; + # steam-run itself is just a script that lives in nixpkgs (which is licensed under MIT). + # steam is a dependency and already unfree, so normal steam-run will not install without + # allowing unfree packages or appropriate `allowUnfreePredicate` rules. + license = lib.licenses.mit; }; }; + + meta = (steam-unwrapped.meta or {}) // { + description = "Steam dependencies (dummy package, do not use)"; + }; }