
OpenSSL 1.1 is going end of life in 2023/09, which is during the NixOS 23.05 release cycle. The removal unfortunately breaks the Loop Hero game, for which it was added.
307 lines
7.6 KiB
Nix
307 lines
7.6 KiB
Nix
{ 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
|
|
, extraArgs ? "" # arguments to always pass to steam
|
|
, extraEnv ? { } # Environment variables to pass to Steam
|
|
, withGameSpecificLibraries ? true # exclude game specific libraries
|
|
}:
|
|
|
|
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;
|
|
|
|
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 = lib.toShellVars extraEnv;
|
|
|
|
in buildFHSEnv rec {
|
|
name = "steam";
|
|
|
|
targetPkgs = pkgs: with pkgs; [
|
|
steamPackages.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.lib
|
|
|
|
# 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
|
|
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
|
|
|
|
# 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
|
|
libvpx
|
|
librsvg
|
|
xorg.libXft
|
|
libvdpau
|
|
] ++ 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
|
|
xorg.xkeyboardconfig
|
|
xorg.libpciaccess
|
|
xorg.libXScrnSaver # Dead Cells
|
|
icu # dotnet runtime, e.g. Stardew Valley
|
|
|
|
# screeps dependencies
|
|
gtk3
|
|
dbus
|
|
zlib
|
|
atk
|
|
cairo
|
|
freetype
|
|
gdk-pixbuf
|
|
fontconfig
|
|
|
|
# Prison Architect
|
|
libGLU
|
|
libuuid
|
|
libbsd
|
|
alsa-lib
|
|
|
|
# Loop Hero
|
|
libidn2
|
|
libpsl
|
|
nghttp2.lib
|
|
rtmpdump
|
|
] ++ steamPackages.steam-runtime-wrapped.overridePkgs
|
|
++ extraLibraries pkgs;
|
|
|
|
extraInstallCommands = ''
|
|
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} "$@"
|
|
'';
|
|
|
|
meta = steam.meta // lib.optionalAttrs (!withGameSpecificLibraries) {
|
|
description = steam.meta.description + " (without game specific libraries)";
|
|
};
|
|
|
|
# allows for some gui applications to share IPC
|
|
# this fixes certain issues where they don't render correctly
|
|
unshareIpc = false;
|
|
|
|
# Some applications such as Natron need access to MIT-SHM or other
|
|
# shared memory mechanisms. Unsharing the pid namespace
|
|
# breaks the ability for application to reference shared memory.
|
|
unsharePid = false;
|
|
|
|
passthru.run = buildFHSEnv {
|
|
name = "steam-run";
|
|
|
|
targetPkgs = commonTargetPkgs;
|
|
inherit multiPkgs profile extraInstallCommands;
|
|
inherit unshareIpc unsharePid;
|
|
|
|
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 // {
|
|
description = "Run commands in the same FHS environment that is used for Steam";
|
|
name = "steam-run";
|
|
};
|
|
};
|
|
}
|