diff --git a/nixos/modules/programs/steam.nix b/nixos/modules/programs/steam.nix index 92e6f4ccaeb1..dab8425721c5 100644 --- a/nixos/modules/programs/steam.nix +++ b/nixos/modules/programs/steam.nix @@ -31,7 +31,7 @@ in { default = pkgs.steam; defaultText = lib.literalExpression "pkgs.steam"; example = lib.literalExpression '' - pkgs.steam-small.override { + pkgs.steam.override { extraEnv = { MANGOHUD = true; OBS_VKCAPTURE = true; diff --git a/pkgs/build-support/build-fhsenv-bubblewrap/buildFHSEnv.nix b/pkgs/build-support/build-fhsenv-bubblewrap/buildFHSEnv.nix index a18885ac5990..25f8b8a39b6b 100644 --- a/pkgs/build-support/build-fhsenv-bubblewrap/buildFHSEnv.nix +++ b/pkgs/build-support/build-fhsenv-bubblewrap/buildFHSEnv.nix @@ -12,6 +12,7 @@ , targetPkgs ? pkgs: [] , multiPkgs ? pkgs: [] , multiArch ? false # Whether to include 32bit packages +, includeClosures ? false # Whether to include closures of all packages , nativeBuildInputs ? [] , extraBuildCommands ? "" , extraBuildCommandsMulti ? "" @@ -171,6 +172,7 @@ let ${pkgs.glib.dev}/bin/glib-compile-schemas $out/share/glib-2.0/schemas fi ''; + inherit includeClosures; }; staticUsrProfileMulti = buildEnv { @@ -178,6 +180,7 @@ let paths = baseMultiPaths ++ multiPaths; extraOutputsToInstall = [ "out" "lib" ] ++ extraOutputsToInstall; ignoreCollisions = true; + inherit includeClosures; }; # setup library paths only for the targeted architecture diff --git a/pkgs/games/steam/default.nix b/pkgs/games/steam/default.nix index 4d3f2ba7140c..ee2b72be5400 100644 --- a/pkgs/games/steam/default.nix +++ b/pkgs/games/steam/default.nix @@ -1,5 +1,5 @@ { makeScopeWithSplicing', generateSplicesForMkScope -, stdenv, buildFHSEnv, pkgsi686Linux, mesa-demos +, stdenv }: let @@ -10,21 +10,8 @@ let else if stdenv.hostPlatform.system == "i686-linux" then "i386" else throw "Unsupported platform: ${stdenv.hostPlatform.system}"; - steam-runtime = callPackage ./runtime.nix { }; - steam-runtime-wrapped = callPackage ./runtime-wrapped.nix { }; steam = callPackage ./steam.nix { }; - steam-fhsenv = callPackage ./fhsenv.nix { - mesa-demos-i686 = - if self.steamArch == "amd64" - then pkgsi686Linux.mesa-demos - else mesa-demos; - steam-runtime-wrapped-i686 = - if self.steamArch == "amd64" - then pkgsi686Linux.steamPackages.steam-runtime-wrapped - else null; - inherit buildFHSEnv; - }; - steam-fhsenv-small = steam-fhsenv.override { withGameSpecificLibraries = false; }; + steam-fhsenv = callPackage ./fhsenv.nix {}; # This has to exist so Hydra tries to build all of Steam's dependencies. # FIXME: Maybe we should expose it as something more generic? diff --git a/pkgs/games/steam/fhsenv.nix b/pkgs/games/steam/fhsenv.nix index 6a4a1e002058..1eb6dffd3a39 100644 --- a/pkgs/games/steam/fhsenv.nix +++ b/pkgs/games/steam/fhsenv.nix @@ -1,340 +1,127 @@ -{ lib, stdenv, writeShellScript, buildFHSEnv, steam, mesa-demos-i686 -, steam-runtime-wrapped, steam-runtime-wrapped-i686 ? null -, 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 (real default is at usage site) -, 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 - -# steamwebhelper deletes unrelated electron programs' singleton cookies from /tmp on startup: -# https://github.com/ValveSoftware/steam-for-linux/issues/9121 -, privateTmp ? true # Whether to separate steam's /tmp from the host system - -, withGameSpecificLibraries ? true # include game specific libraries -}@args: - +{ + lib, + steam, + 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 - # run.sh wants ldconfig - glibc_multi.bin - # 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 + steamEnv = { name, runScript, passthru ? {}, meta ? {} }: + buildFHSEnv { + inherit name runScript passthru meta; - # It tries to execute xdg-user-dir and spams the log with command not founds - xdg-user-dirs + multiArch = true; + includeClosures = true; - # electron based launchers need newer versions of these libraries than what runtime provides - mesa - sqlite - ] ++ extraPkgs pkgs; + # https://gitlab.steamos.cloud/steamrt/steam-runtime-tools/-/blob/main/docs/distro-assumptions.md#command-line-tools + targetPkgs = pkgs: with pkgs; [ + steam - ldPath = lib.optionals stdenv.hostPlatform.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); + bash + coreutils + file + lsb-release # not documented, called from Big Picture + pciutils # not documented, complains about lspci on startup + glibc_multi.bin + xz + zenity - # 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" - ''; + # Steam expects it to be /sbin specifically + (pkgs.runCommand "sbin-ldconfig" {} '' + mkdir -p $out/sbin + ln -s /bin/ldconfig $out/sbin/ldconfig + '') - # bootstrap.tar.xz has 444 permissions, which means that simple deletes fail - # and steam will not be able to start - fixBootstrap = '' - if [ -r $HOME/.steam/steam/bootstrap.tar.xz ]; then - chmod +w $HOME/.steam/steam/bootstrap.tar.xz - fi - ''; + # 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; - envScript = '' - # prevents various error messages - unset GIO_EXTRA_MODULES + # https://gitlab.steamos.cloud/steamrt/steam-runtime-tools/-/blob/main/docs/distro-assumptions.md#shared-libraries + multiPkgs = pkgs: with pkgs; [ + glibc + libxcrypt + libGL - # 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 - GTK_IM_MODULE='xim' - '' + lib.toShellVars extraEnv; + libdrm + mesa # for libgbm + udev + libudev0-shim + libva + vulkan-loader -in buildFHSEnv rec { + 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 != null) '' + ln -s ${steam}/share $out/share + ''; + + 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} + ''; + + privateTmp = true; + + inherit extraPreBwrapCmds; + + 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 - 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 - elfutils - - # Without these it silently fails - xorg.libXinerama - xorg.libXcursor - xorg.libXrender - xorg.libXScrnSaver - xorg.libXi - xorg.libSM - xorg.libICE - 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 - libglut - 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 - # same thing, but for Xwayland (usually via gamescope), already in the closure - libkrb5 - keyutils - ] ++ 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) - 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 - gdk-pixbuf - - # 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 - ] - # This needs to come from pkgs as the passed-in steam-runtime-wrapped may not be the same architecture - ++ pkgs.steamPackages.steam-runtime-wrapped.overridePkgs - ++ extraLibraries pkgs; - - extraInstallCommands = lib.optionalString (steam != null) '' - mkdir -p $out/share/applications - ln -s ${steam}/share/icons $out/share - ln -s ${steam}/share/pixmaps $out/share - ln -s ${steam}/share/applications/steam.desktop $out/share/applications/steam.desktop - ''; - - 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; - - runScript = writeShellScript "steam-wrapper.sh" '' - if [ -f /etc/NIXOS ]; then # Check only useful on NixOS - ${mesa-demos-i686}/bin/glxinfo 2>&1 | grep -q Error - # If there was an error running glxinfo, we know something is wrong with the configuration - if [ $? -eq 0 ]; then - cat < /dev/stderr - ** - WARNING: Steam is not set up. Add the following options to /etc/nixos/configuration.nix - and then run \`sudo nixos-rebuild switch\`: - { - hardware.graphics.enable32Bit = true; - hardware.pulseaudio.support32Bit = true; - } - ** - EOF - fi - fi - - ${exportLDPath} - ${fixBootstrap} - - set -o allexport # Export the following env vars - ${envScript} + runScript = writeShellScript "steam-wrapped" '' exec steam ${extraArgs} "$@" ''; - inherit privateTmp; - - extraPreBwrapCmds = '' - install -m 1777 -d /tmp/dumps - '' + args.extraPreBwrapCmds or ""; - - extraBwrapArgs = [ - "--bind-try /etc/NIXOS /etc/NIXOS" # required 32bit driver check in runScript - "--bind-try /tmp/dumps /tmp/dumps" - ] ++ args.extraBwrapArgs or []; - - meta = - if steam != null - then - steam.meta // lib.optionalAttrs (!withGameSpecificLibraries) { - description = steam.meta.description + " (without game specific libraries)"; - mainProgram = "steam"; - } - else { - description = "Steam dependencies (dummy package, do not use)"; - }; - - passthru.steamargs = args; - passthru.run = buildFHSEnv { + passthru.run = steamEnv { name = "steam-run"; - targetPkgs = commonTargetPkgs; - inherit multiArch multiPkgs profile extraInstallCommands 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 - ${exportLDPath} - ${fixBootstrap} - - set -o allexport # Export the following env vars - ${envScript} - exec -- "$run" "$@" + exec "$@" ''; meta = (steam.meta or {}) // { @@ -347,4 +134,8 @@ in buildFHSEnv rec { license = lib.licenses.mit; }; }; + + meta = (steam.meta or {}) // { + description = "Steam dependencies (dummy package, do not use)"; + }; } diff --git a/pkgs/games/steam/runtime-wrapped.nix b/pkgs/games/steam/runtime-wrapped.nix deleted file mode 100644 index 648e012d3fe5..000000000000 --- a/pkgs/games/steam/runtime-wrapped.nix +++ /dev/null @@ -1,45 +0,0 @@ -{ stdenv, steamArch, lib, perl, pkgs, steam-runtime -, runtimeOnly ? false -}: - -let - overridePkgs = lib.optionals (!runtimeOnly) (with pkgs; [ - libgpg-error - libpulseaudio - alsa-lib - openalSoft - libva1 - libvdpau - vulkan-loader - gcc.cc.lib - nss - nspr - xorg.libxcb - ]); - - allPkgs = overridePkgs ++ [ steam-runtime ]; - - gnuArch = if steamArch == "amd64" then "x86_64-linux-gnu" - else if steamArch == "i386" then "i386-linux-gnu" - else throw "Unsupported architecture"; - - libs = [ "lib/${gnuArch}" "lib" "usr/lib/${gnuArch}" "usr/lib" ]; - bins = [ "bin" "usr/bin" ]; - -in stdenv.mkDerivation { - name = "steam-runtime-wrapped"; - - nativeBuildInputs = [ perl ]; - - builder = ./build-wrapped.sh; - - passthru = { - inherit gnuArch libs bins overridePkgs; - arch = steamArch; - }; - - installPhase = '' - buildDir "${toString libs}" "${toString (map lib.getLib allPkgs)}" - buildDir "${toString bins}" "${toString (map lib.getBin allPkgs)}" - ''; -} diff --git a/pkgs/games/steam/runtime.nix b/pkgs/games/steam/runtime.nix deleted file mode 100644 index f736ac8daa47..000000000000 --- a/pkgs/games/steam/runtime.nix +++ /dev/null @@ -1,37 +0,0 @@ -{ lib, stdenv, fetchurl - -# for update script -, writeShellScript, curl, nix-update -}: - -stdenv.mkDerivation (finalAttrs: { - - pname = "steam-runtime"; - # from https://repo.steampowered.com/steamrt-images-scout/snapshots/latest-steam-client-general-availability/VERSION.txt - version = "0.20240415.84615"; - - src = fetchurl { - url = "https://repo.steampowered.com/steamrt-images-scout/snapshots/${finalAttrs.version}/steam-runtime.tar.xz"; - hash = "sha256-C8foNnIVA+O4YwuCrIf9N6Lr/GlApPVgZsYgi+3OZUE="; - name = "scout-runtime-${finalAttrs.version}.tar.gz"; - }; - - buildCommand = '' - mkdir -p $out - tar -C $out --strip=1 -x -f $src - ''; - - passthru = { - updateScript = writeShellScript "update.sh" '' - version=$(${curl}/bin/curl https://repo.steampowered.com/steamrt-images-scout/snapshots/latest-steam-client-general-availability/VERSION.txt) - ${lib.getExe nix-update} --version "$version" steamPackages.steam-runtime - ''; - }; - - meta = { - description = "Official runtime used by Steam"; - homepage = "https://github.com/ValveSoftware/steam-runtime"; - license = lib.licenses.unfreeRedistributable; # Includes NVIDIA CG toolkit - maintainers = with lib.maintainers; [ hrdinka abbradar ]; - }; -}) diff --git a/pkgs/top-level/aliases.nix b/pkgs/top-level/aliases.nix index 88b828c32cbe..659b60117a31 100644 --- a/pkgs/top-level/aliases.nix +++ b/pkgs/top-level/aliases.nix @@ -1520,6 +1520,7 @@ mapAliases { ssm-agent = amazon-ssm-agent; # Added 2023-10-17 starboard-octant-plugin = throw "starboard-octant-plugin has been dropped due to needing octant which is archived"; # Added 2023-09-29 starspace = throw "starspace has been removed from nixpkgs, as it was broken"; # Added 2024-07-15 + steam-small = steam; # Added 2024-09-12 steam-run-native = steam-run; # added 2022-02-21 StormLib = stormlib; # Added 2024-01-21 sumneko-lua-language-server = lua-language-server; # Added 2023-02-07 diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index 1d7359382592..2ac9e6be40c3 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -35332,7 +35332,6 @@ with pkgs; steamPackages = recurseIntoAttrs (callPackage ../games/steam { }); steam = steamPackages.steam-fhsenv; - steam-small = steamPackages.steam-fhsenv-small; steam-run = steam.run;