2023-04-11 10:52:27 +00:00
|
|
|
{ lib, stdenv, writeShellScript, buildFHSEnv, steam, glxinfo-i686
|
2017-10-15 23:58:04 +00:00
|
|
|
, steam-runtime-wrapped, steam-runtime-wrapped-i686 ? null
|
2017-05-28 18:04:25 +00:00
|
|
|
, extraPkgs ? pkgs: [ ] # extra packages to add to targetPkgs
|
2018-10-14 23:38:19 +00:00
|
|
|
, extraLibraries ? pkgs: [ ] # extra packages to add to multiPkgs
|
2018-06-03 21:49:27 +00:00
|
|
|
, extraProfile ? "" # string to append to profile
|
2023-12-09 05:29:32 +00:00
|
|
|
, 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)
|
2022-07-23 23:14:39 +00:00
|
|
|
, extraArgs ? "" # arguments to always pass to steam
|
2023-01-29 13:56:57 +00:00
|
|
|
, extraEnv ? { } # Environment variables to pass to Steam
|
2023-12-21 16:35:33 +00:00
|
|
|
|
|
|
|
# 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
|
|
|
|
|
2023-07-05 22:18:59 +00:00
|
|
|
, withGameSpecificLibraries ? true # include game specific libraries
|
2023-12-09 05:29:32 +00:00
|
|
|
}@args:
|
2013-09-13 21:58:59 +00:00
|
|
|
|
2016-04-03 01:19:00 +00:00
|
|
|
let
|
2023-02-18 15:02:22 +00:00
|
|
|
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
|
2023-12-09 05:30:47 +00:00
|
|
|
# run.sh wants ldconfig
|
|
|
|
glibc.bin
|
2023-02-18 15:02:22 +00:00
|
|
|
# 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
|
|
|
|
|
2023-04-16 11:24:42 +00:00
|
|
|
# It tries to execute xdg-user-dir and spams the log with command not founds
|
|
|
|
xdg-user-dirs
|
|
|
|
|
2023-02-18 15:02:22 +00:00
|
|
|
# electron based launchers need newer versions of these libraries than what runtime provides
|
|
|
|
mesa
|
|
|
|
sqlite
|
|
|
|
] ++ extraPkgs pkgs;
|
2014-04-22 23:03:14 +00:00
|
|
|
|
2020-12-20 20:31:27 +00:00
|
|
|
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);
|
2017-11-11 12:51:12 +00:00
|
|
|
|
2020-07-30 23:51:38 +00:00
|
|
|
# Zachtronics and a few other studios expect STEAM_LD_LIBRARY_PATH to be present
|
|
|
|
exportLDPath = ''
|
2020-12-20 20:31:27 +00:00
|
|
|
export LD_LIBRARY_PATH=${lib.concatStringsSep ":" ldPath}''${LD_LIBRARY_PATH:+:}$LD_LIBRARY_PATH
|
2022-03-04 22:51:43 +00:00
|
|
|
export STEAM_LD_LIBRARY_PATH="$STEAM_LD_LIBRARY_PATH''${STEAM_LD_LIBRARY_PATH:+:}$LD_LIBRARY_PATH"
|
2020-07-30 23:51:38 +00:00
|
|
|
'';
|
|
|
|
|
2020-12-21 01:27:57 +00:00
|
|
|
# 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
|
|
|
|
'';
|
|
|
|
|
2023-12-09 05:31:45 +00:00
|
|
|
envScript = ''
|
|
|
|
# prevents various error messages
|
|
|
|
unset GIO_EXTRA_MODULES
|
|
|
|
'' + lib.toShellVars extraEnv;
|
2023-01-29 13:56:57 +00:00
|
|
|
|
2023-04-11 10:52:27 +00:00
|
|
|
in buildFHSEnv rec {
|
2016-05-26 11:33:18 +00:00
|
|
|
name = "steam";
|
2014-04-22 23:03:14 +00:00
|
|
|
|
2023-07-01 04:41:07 +00:00
|
|
|
# Steam still needs 32bit and various native games do too
|
|
|
|
multiArch = true;
|
|
|
|
|
2016-05-26 11:33:18 +00:00
|
|
|
targetPkgs = pkgs: with pkgs; [
|
2023-05-16 18:30:54 +00:00
|
|
|
steam
|
2016-05-26 11:33:18 +00:00
|
|
|
# License agreement
|
2021-05-07 21:18:14 +00:00
|
|
|
gnome.zenity
|
2016-07-11 15:07:55 +00:00
|
|
|
] ++ commonTargetPkgs pkgs;
|
2015-08-06 18:21:43 +00:00
|
|
|
|
2016-05-26 11:33:18 +00:00
|
|
|
multiPkgs = pkgs: with pkgs; [
|
|
|
|
# These are required by steam with proper errors
|
2018-03-13 10:16:03 +00:00
|
|
|
xorg.libXcomposite
|
|
|
|
xorg.libXtst
|
|
|
|
xorg.libXrandr
|
|
|
|
xorg.libXext
|
|
|
|
xorg.libX11
|
|
|
|
xorg.libXfixes
|
2018-03-19 09:36:10 +00:00
|
|
|
libGL
|
2020-01-22 17:58:10 +00:00
|
|
|
libva
|
2023-10-19 21:41:55 +00:00
|
|
|
pipewire
|
2014-04-22 23:03:14 +00:00
|
|
|
|
2021-09-11 12:38:13 +00:00
|
|
|
# steamwebhelper
|
|
|
|
harfbuzz
|
|
|
|
libthai
|
|
|
|
pango
|
|
|
|
|
2023-02-18 15:02:35 +00:00
|
|
|
lsof # friends options won't display "Launch Game" without it
|
|
|
|
file # called by steam's setup.sh
|
2021-03-22 21:24:06 +00:00
|
|
|
|
2021-02-03 20:17:56 +00:00
|
|
|
# dependencies for mesa drivers, needed inside pressure-vessel
|
2021-07-10 02:19:27 +00:00
|
|
|
mesa.llvmPackages.llvm.lib
|
2021-03-01 19:22:27 +00:00
|
|
|
vulkan-loader
|
2021-02-03 20:17:56 +00:00
|
|
|
expat
|
|
|
|
wayland
|
2021-03-14 12:42:33 +00:00
|
|
|
xorg.libxcb
|
|
|
|
xorg.libXdamage
|
|
|
|
xorg.libxshmfence
|
|
|
|
xorg.libXxf86vm
|
2021-02-03 20:17:56 +00:00
|
|
|
libelf
|
2023-02-18 15:02:35 +00:00
|
|
|
(lib.getLib elfutils)
|
2018-03-15 23:37:42 +00:00
|
|
|
|
|
|
|
# Without these it silently fails
|
|
|
|
xorg.libXinerama
|
|
|
|
xorg.libXcursor
|
|
|
|
xorg.libXrender
|
|
|
|
xorg.libXScrnSaver
|
|
|
|
xorg.libXi
|
|
|
|
xorg.libSM
|
|
|
|
xorg.libICE
|
|
|
|
gnome2.GConf
|
2022-04-30 16:56:59 +00:00
|
|
|
curlWithGnuTls
|
2018-03-15 23:37:42 +00:00
|
|
|
nspr
|
|
|
|
nss
|
|
|
|
cups
|
|
|
|
libcap
|
|
|
|
SDL2
|
|
|
|
libusb1
|
|
|
|
dbus-glib
|
2023-05-07 01:05:05 +00:00
|
|
|
gsettings-desktop-schemas
|
2021-02-01 22:05:10 +00:00
|
|
|
ffmpeg
|
2018-03-15 23:37:42 +00:00
|
|
|
libudev0-shim
|
|
|
|
|
|
|
|
# Verified games requirements
|
2023-02-18 15:02:35 +00:00
|
|
|
fontconfig
|
|
|
|
freetype
|
2018-03-20 19:06:14 +00:00
|
|
|
xorg.libXt
|
2018-03-15 23:37:42 +00:00
|
|
|
xorg.libXmu
|
|
|
|
libogg
|
|
|
|
libvorbis
|
|
|
|
SDL
|
|
|
|
SDL2_image
|
|
|
|
glew110
|
2023-02-18 15:02:35 +00:00
|
|
|
libdrm
|
2018-03-15 23:37:42 +00:00
|
|
|
libidn
|
|
|
|
tbb
|
2023-02-18 15:02:35 +00:00
|
|
|
zlib
|
2018-03-15 23:37:42 +00:00
|
|
|
|
2023-04-16 11:14:49 +00:00
|
|
|
# SteamVR
|
|
|
|
udev
|
2023-07-22 18:30:19 +00:00
|
|
|
dbus
|
2023-04-16 11:14:49 +00:00
|
|
|
|
2018-03-15 23:37:42 +00:00
|
|
|
# Other things from runtime
|
2023-02-18 15:02:35 +00:00
|
|
|
glib
|
|
|
|
gtk2
|
|
|
|
bzip2
|
2018-03-15 23:37:42 +00:00
|
|
|
flac
|
|
|
|
freeglut
|
|
|
|
libjpeg
|
2022-08-02 19:55:42 +00:00
|
|
|
libpng
|
2018-03-15 23:37:42 +00:00
|
|
|
libpng12
|
|
|
|
libsamplerate
|
|
|
|
libmikmod
|
|
|
|
libtheora
|
|
|
|
libtiff
|
|
|
|
pixman
|
|
|
|
speex
|
|
|
|
SDL_image
|
|
|
|
SDL_ttf
|
|
|
|
SDL_mixer
|
|
|
|
SDL2_ttf
|
|
|
|
SDL2_mixer
|
|
|
|
libappindicator-gtk2
|
2022-07-12 13:14:06 +00:00
|
|
|
libdbusmenu-gtk2
|
|
|
|
libindicator-gtk2
|
2018-03-15 23:37:42 +00:00
|
|
|
libcaca
|
|
|
|
libcanberra
|
|
|
|
libgcrypt
|
2023-10-20 01:18:47 +00:00
|
|
|
libunwind
|
2018-03-15 23:37:42 +00:00
|
|
|
libvpx
|
|
|
|
librsvg
|
|
|
|
xorg.libXft
|
|
|
|
libvdpau
|
2023-06-08 07:56:49 +00:00
|
|
|
|
|
|
|
# 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
|
2023-02-18 15:02:35 +00:00
|
|
|
] ++ 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
|
2023-06-15 09:58:25 +00:00
|
|
|
ncurses # Crusader Kings III
|
2023-07-05 22:18:59 +00:00
|
|
|
openssl
|
2023-02-18 15:02:35 +00:00
|
|
|
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
|
2023-07-05 22:18:59 +00:00
|
|
|
# FIXME: Also requires openssl_1_1, which is EOL. Either find an alternative solution, or remove these dependencies (if not needed by other games)
|
2023-02-18 15:02:35 +00:00
|
|
|
libidn2
|
|
|
|
libpsl
|
|
|
|
nghttp2.lib
|
|
|
|
rtmpdump
|
2023-05-22 06:46:02 +00:00
|
|
|
]
|
|
|
|
# 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
|
2022-02-02 22:38:55 +00:00
|
|
|
++ extraLibraries pkgs;
|
|
|
|
|
2023-05-16 18:30:54 +00:00
|
|
|
extraInstallCommands = lib.optionalString (steam != null) ''
|
2016-05-26 11:33:18 +00:00
|
|
|
mkdir -p $out/share/applications
|
|
|
|
ln -s ${steam}/share/icons $out/share
|
|
|
|
ln -s ${steam}/share/pixmaps $out/share
|
2020-12-20 23:33:07 +00:00
|
|
|
ln -s ${steam}/share/applications/steam.desktop $out/share/applications/steam.desktop
|
2016-05-26 11:33:18 +00:00
|
|
|
'';
|
2015-12-03 21:57:54 +00:00
|
|
|
|
2016-05-26 11:33:18 +00:00
|
|
|
profile = ''
|
2018-11-10 03:17:04 +00:00
|
|
|
# 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
|
2022-09-06 05:45:32 +00:00
|
|
|
|
|
|
|
# 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
|
2018-06-03 21:49:27 +00:00
|
|
|
'' + extraProfile;
|
2015-02-05 15:16:02 +00:00
|
|
|
|
2023-01-29 13:42:38 +00:00
|
|
|
runScript = writeShellScript "steam-wrapper.sh" ''
|
2017-12-31 10:43:21 +00:00
|
|
|
if [ -f /host/etc/NIXOS ]; then # Check only useful on NixOS
|
2018-03-15 23:37:42 +00:00
|
|
|
${glxinfo-i686}/bin/glxinfo >/dev/null 2>&1
|
2017-12-31 10:43:21 +00:00
|
|
|
# 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\`:
|
2019-02-26 11:45:54 +00:00
|
|
|
{
|
2017-12-31 10:43:21 +00:00
|
|
|
hardware.opengl.driSupport32Bit = true;
|
|
|
|
hardware.pulseaudio.support32Bit = true;
|
|
|
|
}
|
|
|
|
**
|
|
|
|
EOF
|
|
|
|
fi
|
2017-12-30 20:06:09 +00:00
|
|
|
fi
|
2022-02-02 22:38:55 +00:00
|
|
|
|
2022-03-04 22:51:43 +00:00
|
|
|
${exportLDPath}
|
2020-12-21 01:27:57 +00:00
|
|
|
${fixBootstrap}
|
2023-01-29 13:56:57 +00:00
|
|
|
|
|
|
|
set -o allexport # Export the following env vars
|
|
|
|
${envScript}
|
2022-07-23 23:14:39 +00:00
|
|
|
exec steam ${extraArgs} "$@"
|
2017-12-30 20:06:09 +00:00
|
|
|
'';
|
2016-04-03 01:19:00 +00:00
|
|
|
|
2023-12-21 16:35:33 +00:00
|
|
|
inherit privateTmp;
|
2023-12-09 05:29:32 +00:00
|
|
|
|
|
|
|
extraPreBwrapCmds = ''
|
|
|
|
install -m 1777 -d /tmp/dumps
|
|
|
|
'' + args.extraPreBwrapCmds or "";
|
|
|
|
|
|
|
|
extraBwrapArgs = [
|
|
|
|
"--bind-try /tmp/dumps /tmp/dumps"
|
|
|
|
] ++ args.extraBwrapArgs or [];
|
2023-10-20 21:55:54 +00:00
|
|
|
|
2023-05-16 18:30:54 +00:00
|
|
|
meta =
|
|
|
|
if steam != null
|
|
|
|
then
|
|
|
|
steam.meta // lib.optionalAttrs (!withGameSpecificLibraries) {
|
|
|
|
description = steam.meta.description + " (without game specific libraries)";
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
description = "Steam dependencies (dummy package, do not use)";
|
|
|
|
};
|
2018-03-15 23:37:42 +00:00
|
|
|
|
2023-04-11 10:52:27 +00:00
|
|
|
passthru.run = buildFHSEnv {
|
2016-05-26 11:33:18 +00:00
|
|
|
name = "steam-run";
|
2016-04-03 01:19:00 +00:00
|
|
|
|
2016-05-26 11:33:18 +00:00
|
|
|
targetPkgs = commonTargetPkgs;
|
2023-10-20 21:55:54 +00:00
|
|
|
inherit multiArch multiPkgs profile extraInstallCommands extraBwrapArgs;
|
2021-01-15 21:12:22 +00:00
|
|
|
|
2023-01-29 13:42:38 +00:00
|
|
|
runScript = writeShellScript "steam-run" ''
|
2017-11-11 12:51:12 +00:00
|
|
|
run="$1"
|
|
|
|
if [ "$run" = "" ]; then
|
|
|
|
echo "Usage: steam-run command-to-run args..." >&2
|
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
shift
|
2022-03-04 22:51:43 +00:00
|
|
|
|
|
|
|
${exportLDPath}
|
2020-12-21 01:27:57 +00:00
|
|
|
${fixBootstrap}
|
2023-01-29 13:56:57 +00:00
|
|
|
|
|
|
|
set -o allexport # Export the following env vars
|
|
|
|
${envScript}
|
2018-03-15 23:37:42 +00:00
|
|
|
exec -- "$run" "$@"
|
2017-11-11 12:51:12 +00:00
|
|
|
'';
|
2022-10-16 14:18:10 +00:00
|
|
|
|
2023-05-16 18:30:54 +00:00
|
|
|
meta = (steam.meta or {}) // {
|
2022-10-16 14:18:10 +00:00
|
|
|
description = "Run commands in the same FHS environment that is used for Steam";
|
2023-11-12 21:54:04 +00:00
|
|
|
mainProgram = "steam-run";
|
2022-10-16 14:18:10 +00:00
|
|
|
name = "steam-run";
|
|
|
|
};
|
2016-05-26 11:33:18 +00:00
|
|
|
};
|
|
|
|
}
|