diff options
Diffstat (limited to 'nixpkgs/pkgs/games/steam/fhsenv.nix')
-rw-r--r-- | nixpkgs/pkgs/games/steam/fhsenv.nix | 342 |
1 files changed, 342 insertions, 0 deletions
diff --git a/nixpkgs/pkgs/games/steam/fhsenv.nix b/nixpkgs/pkgs/games/steam/fhsenv.nix new file mode 100644 index 000000000000..936a3510b31d --- /dev/null +++ b/nixpkgs/pkgs/games/steam/fhsenv.nix @@ -0,0 +1,342 @@ +{ lib, stdenv, writeShellScript, buildFHSEnv, steam, glxinfo-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: + +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.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 + + # 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; + + 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" + ''; + + # 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 + ''; + + envScript = '' + # prevents various error messages + unset GIO_EXTRA_MODULES + '' + lib.toShellVars extraEnv; + +in buildFHSEnv rec { + 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 + elfutils + + # Without these it silently fails + xorg.libXinerama + xorg.libXcursor + xorg.libXrender + xorg.libXScrnSaver + xorg.libXi + xorg.libSM + xorg.libICE + gnome2.GConf + curlWithGnuTls + 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=<bunch of runtime stuff>:/usr/lib:<etc> + # 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 + ] + # 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] <https://github.com/libsdl-org/SDL/commit/8e2746cfb6e1f1a1da5088241a1440fd2535e321> + export SDL_JOYSTICK_DISABLE_UDEV=1 + '' + extraProfile; + + runScript = writeShellScript "steam-wrapper.sh" '' + if [ -f /host/etc/NIXOS ]; then # Check only useful on NixOS + ${glxinfo-i686}/bin/glxinfo >/dev/null 2>&1 + # If there was an error running glxinfo, we know something is wrong with the configuration + if [ $? -ne 0 ]; then + cat <<EOF > /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.opengl.driSupport32Bit = true; + hardware.pulseaudio.support32Bit = true; + } + ** + EOF + fi + fi + + ${exportLDPath} + ${fixBootstrap} + + set -o allexport # Export the following env vars + ${envScript} + exec steam ${extraArgs} "$@" + ''; + + inherit privateTmp; + + extraPreBwrapCmds = '' + install -m 1777 -d /tmp/dumps + '' + args.extraPreBwrapCmds or ""; + + extraBwrapArgs = [ + "--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 { + name = "steam-run"; + + targetPkgs = commonTargetPkgs; + inherit multiArch multiPkgs profile extraInstallCommands extraBwrapArgs; + + runScript = writeShellScript "steam-run" '' + run="$1" + if [ "$run" = "" ]; 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" "$@" + ''; + + meta = (steam.meta or {}) // { + description = "Run commands in the same FHS environment that is used for Steam"; + mainProgram = "steam-run"; + name = "steam-run"; + }; + }; +} |