steam: decimate

This commit is contained in:
K900 2024-09-19 18:21:35 +03:00
parent 70cb669a2f
commit a3ccb7f562
8 changed files with 114 additions and 415 deletions

View File

@ -31,7 +31,7 @@ in {
default = pkgs.steam; default = pkgs.steam;
defaultText = lib.literalExpression "pkgs.steam"; defaultText = lib.literalExpression "pkgs.steam";
example = lib.literalExpression '' example = lib.literalExpression ''
pkgs.steam-small.override { pkgs.steam.override {
extraEnv = { extraEnv = {
MANGOHUD = true; MANGOHUD = true;
OBS_VKCAPTURE = true; OBS_VKCAPTURE = true;

View File

@ -12,6 +12,7 @@
, targetPkgs ? pkgs: [] , targetPkgs ? pkgs: []
, multiPkgs ? pkgs: [] , multiPkgs ? pkgs: []
, multiArch ? false # Whether to include 32bit packages , multiArch ? false # Whether to include 32bit packages
, includeClosures ? false # Whether to include closures of all packages
, nativeBuildInputs ? [] , nativeBuildInputs ? []
, extraBuildCommands ? "" , extraBuildCommands ? ""
, extraBuildCommandsMulti ? "" , extraBuildCommandsMulti ? ""
@ -171,6 +172,7 @@ let
${pkgs.glib.dev}/bin/glib-compile-schemas $out/share/glib-2.0/schemas ${pkgs.glib.dev}/bin/glib-compile-schemas $out/share/glib-2.0/schemas
fi fi
''; '';
inherit includeClosures;
}; };
staticUsrProfileMulti = buildEnv { staticUsrProfileMulti = buildEnv {
@ -178,6 +180,7 @@ let
paths = baseMultiPaths ++ multiPaths; paths = baseMultiPaths ++ multiPaths;
extraOutputsToInstall = [ "out" "lib" ] ++ extraOutputsToInstall; extraOutputsToInstall = [ "out" "lib" ] ++ extraOutputsToInstall;
ignoreCollisions = true; ignoreCollisions = true;
inherit includeClosures;
}; };
# setup library paths only for the targeted architecture # setup library paths only for the targeted architecture

View File

@ -1,5 +1,5 @@
{ makeScopeWithSplicing', generateSplicesForMkScope { makeScopeWithSplicing', generateSplicesForMkScope
, stdenv, buildFHSEnv, pkgsi686Linux, mesa-demos , stdenv
}: }:
let let
@ -10,21 +10,8 @@ let
else if stdenv.hostPlatform.system == "i686-linux" then "i386" else if stdenv.hostPlatform.system == "i686-linux" then "i386"
else throw "Unsupported platform: ${stdenv.hostPlatform.system}"; else throw "Unsupported platform: ${stdenv.hostPlatform.system}";
steam-runtime = callPackage ./runtime.nix { };
steam-runtime-wrapped = callPackage ./runtime-wrapped.nix { };
steam = callPackage ./steam.nix { }; steam = callPackage ./steam.nix { };
steam-fhsenv = callPackage ./fhsenv.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; };
# This has to exist so Hydra tries to build all of Steam's dependencies. # This has to exist so Hydra tries to build all of Steam's dependencies.
# FIXME: Maybe we should expose it as something more generic? # FIXME: Maybe we should expose it as something more generic?

View File

@ -1,340 +1,127 @@
{ lib, stdenv, writeShellScript, buildFHSEnv, steam, mesa-demos-i686 {
, steam-runtime-wrapped, steam-runtime-wrapped-i686 ? null lib,
, extraPkgs ? pkgs: [ ] # extra packages to add to targetPkgs steam,
, extraLibraries ? pkgs: [ ] # extra packages to add to multiPkgs buildFHSEnv,
, extraProfile ? "" # string to append to profile writeShellScript,
, extraPreBwrapCmds ? "" # extra commands to run before calling bubblewrap (real default is at usage site) extraPkgs ? pkgs: [ ], # extra packages to add to targetPkgs
, extraBwrapArgs ? [ ] # extra arguments to pass to bubblewrap (real default is at usage site) extraLibraries ? pkgs: [ ], # extra packages to add to multiPkgs
, extraArgs ? "" # arguments to always pass to steam extraProfile ? "", # string to append to profile
, extraEnv ? { } # Environment variables to pass to Steam extraPreBwrapCmds ? "", # extra commands to run before calling bubblewrap
extraBwrapArgs ? [ ], # extra arguments to pass to bubblewrap (real default is at usage site)
# steamwebhelper deletes unrelated electron programs' singleton cookies from /tmp on startup: extraArgs ? "", # arguments to always pass to steam
# https://github.com/ValveSoftware/steam-for-linux/issues/9121 extraEnv ? { }, # Environment variables to pass to Steam
, privateTmp ? true # Whether to separate steam's /tmp from the host system }:
, withGameSpecificLibraries ? true # include game specific libraries
}@args:
let let
commonTargetPkgs = pkgs: with pkgs; [ steamEnv = { name, runScript, passthru ? {}, meta ? {} }:
# Needed for operating system detection until buildFHSEnv {
# https://github.com/ValveSoftware/steam-for-linux/issues/5909 is resolved inherit name runScript passthru meta;
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
# It tries to execute xdg-user-dir and spams the log with command not founds multiArch = true;
xdg-user-dirs includeClosures = true;
# electron based launchers need newer versions of these libraries than what runtime provides # https://gitlab.steamos.cloud/steamrt/steam-runtime-tools/-/blob/main/docs/distro-assumptions.md#command-line-tools
mesa targetPkgs = pkgs: with pkgs; [
sqlite steam
] ++ extraPkgs pkgs;
ldPath = lib.optionals stdenv.hostPlatform.is64bit [ "/lib64" ] bash
++ [ "/lib32" ] coreutils
++ map (x: "/steamrt/${steam-runtime-wrapped.arch}/" + x) steam-runtime-wrapped.libs file
++ lib.optionals (steam-runtime-wrapped-i686 != null) (map (x: "/steamrt/${steam-runtime-wrapped-i686.arch}/" + x) steam-runtime-wrapped-i686.libs); 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 # Steam expects it to be /sbin specifically
exportLDPath = '' (pkgs.runCommand "sbin-ldconfig" {} ''
export LD_LIBRARY_PATH=${lib.concatStringsSep ":" ldPath}''${LD_LIBRARY_PATH:+:}$LD_LIBRARY_PATH mkdir -p $out/sbin
export STEAM_LD_LIBRARY_PATH="$STEAM_LD_LIBRARY_PATH''${STEAM_LD_LIBRARY_PATH:+:}$LD_LIBRARY_PATH" ln -s /bin/ldconfig $out/sbin/ldconfig
''; '')
# bootstrap.tar.xz has 444 permissions, which means that simple deletes fail # crashes on startup if it can't find libX11 locale files
# and steam will not be able to start (pkgs.runCommand "xorg-locale" {} ''
fixBootstrap = '' mkdir -p $out
if [ -r $HOME/.steam/steam/bootstrap.tar.xz ]; then ln -s ${xorg.libX11}/share $out/share
chmod +w $HOME/.steam/steam/bootstrap.tar.xz '')
fi ] ++ extraPkgs pkgs;
'';
envScript = '' # https://gitlab.steamos.cloud/steamrt/steam-runtime-tools/-/blob/main/docs/distro-assumptions.md#shared-libraries
# prevents various error messages multiPkgs = pkgs: with pkgs; [
unset GIO_EXTRA_MODULES glibc
libxcrypt
libGL
# This is needed for IME (e.g. iBus, fcitx5) to function correctly on non-CJK locales libdrm
# https://github.com/ValveSoftware/steam-for-linux/issues/781#issuecomment-2004757379 mesa # for libgbm
GTK_IM_MODULE='xim' udev
'' + lib.toShellVars extraEnv; 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] <https://github.com/libsdl-org/SDL/commit/8e2746cfb6e1f1a1da5088241a1440fd2535e321>
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"; name = "steam";
# Steam still needs 32bit and various native games do too runScript = writeShellScript "steam-wrapped" ''
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:<bunch of runtime stuff>:<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
# 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] <https://github.com/libsdl-org/SDL/commit/8e2746cfb6e1f1a1da5088241a1440fd2535e321>
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 <<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.graphics.enable32Bit = true;
hardware.pulseaudio.support32Bit = true;
}
**
EOF
fi
fi
${exportLDPath}
${fixBootstrap}
set -o allexport # Export the following env vars
${envScript}
exec steam ${extraArgs} "$@" exec steam ${extraArgs} "$@"
''; '';
inherit privateTmp; passthru.run = steamEnv {
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 {
name = "steam-run"; name = "steam-run";
targetPkgs = commonTargetPkgs;
inherit multiArch multiPkgs profile extraInstallCommands extraBwrapArgs;
runScript = writeShellScript "steam-run" '' runScript = writeShellScript "steam-run" ''
run="$1" if [ $# -eq 0 ]; then
if [ "$run" = "" ]; then
echo "Usage: steam-run command-to-run args..." >&2 echo "Usage: steam-run command-to-run args..." >&2
exit 1 exit 1
fi fi
shift
${exportLDPath} exec "$@"
${fixBootstrap}
set -o allexport # Export the following env vars
${envScript}
exec -- "$run" "$@"
''; '';
meta = (steam.meta or {}) // { meta = (steam.meta or {}) // {
@ -347,4 +134,8 @@ in buildFHSEnv rec {
license = lib.licenses.mit; license = lib.licenses.mit;
}; };
}; };
meta = (steam.meta or {}) // {
description = "Steam dependencies (dummy package, do not use)";
};
} }

View File

@ -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)}"
'';
}

View File

@ -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 ];
};
})

View File

@ -1520,6 +1520,7 @@ mapAliases {
ssm-agent = amazon-ssm-agent; # Added 2023-10-17 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 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 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 steam-run-native = steam-run; # added 2022-02-21
StormLib = stormlib; # Added 2024-01-21 StormLib = stormlib; # Added 2024-01-21
sumneko-lua-language-server = lua-language-server; # Added 2023-02-07 sumneko-lua-language-server = lua-language-server; # Added 2023-02-07

View File

@ -35332,7 +35332,6 @@ with pkgs;
steamPackages = recurseIntoAttrs (callPackage ../games/steam { }); steamPackages = recurseIntoAttrs (callPackage ../games/steam { });
steam = steamPackages.steam-fhsenv; steam = steamPackages.steam-fhsenv;
steam-small = steamPackages.steam-fhsenv-small;
steam-run = steam.run; steam-run = steam.run;