db236e588d
The desktop application and the absoloute path work fine. But consider desktop environments such as KDE where, in the application menu, one can right click entries and pin them to widgets/panels, add them to the desktop, etc. Doing so effectively means copying /run/current-system/sw/share/applications/steam.desktop to ~/.local/share/plasma_icons/ or ~/Desktop/, i.e. managed stated gets duplicated outside the nix scope. The problem here is that steam.desktop hardcodes Exec=/nix/store/<derivation hash>-steam/bin/steam %U this means such copies will point at wrong/outdated derivations once the steam package changes, i.e. widgets/panels/desktop icons will no longer work and must be recreated. Therefore replace the absoloute path with a $PATH lookup to allow "safe" copying; this isn't optimal but other applications such Firefox and Thunderbrid currently behave the same way ($PATH lookup in their .desktop file).
287 lines
6.9 KiB
Nix
287 lines
6.9 KiB
Nix
{ config, lib, writeScript, buildFHSUserEnv, 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
|
|
, nativeOnly ? false
|
|
, runtimeOnly ? false
|
|
, runtimeShell
|
|
|
|
# DEPRECATED
|
|
, withJava ? config.steam.java or false
|
|
, withPrimus ? config.steam.primus or false
|
|
}:
|
|
|
|
let
|
|
commonTargetPkgs = pkgs: with pkgs;
|
|
[
|
|
steamPackages.steam-fonts
|
|
# 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
|
|
python2
|
|
# 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
|
|
] ++ lib.optional withJava jdk8 # TODO: upgrade https://github.com/NixOS/nixpkgs/pull/89731
|
|
++ lib.optional withPrimus primus
|
|
++ extraPkgs pkgs;
|
|
|
|
ldPath = 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=/lib32:/lib64:${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"
|
|
'';
|
|
|
|
setupSh = writeScript "setup.sh" ''
|
|
#!${runtimeShell}
|
|
'';
|
|
|
|
runSh = writeScript "run.sh" ''
|
|
#!${runtimeShell}
|
|
runtime_paths="/lib32:/lib64:${lib.concatStringsSep ":" ldPath}"
|
|
if [ "$1" == "--print-steam-runtime-library-paths" ]; then
|
|
echo "$runtime_paths"
|
|
exit 0
|
|
fi
|
|
export LD_LIBRARY_PATH="$runtime_paths''${LD_LIBRARY_PATH:+:}$LD_LIBRARY_PATH"
|
|
export STEAM_LD_LIBRARY_PATH="$STEAM_LD_LIBRARY_PATH''${STEAM_LD_LIBRARY_PATH:+:}$LD_LIBRARY_PATH"
|
|
exec "$@"
|
|
'';
|
|
|
|
in buildFHSUserEnv rec {
|
|
name = "steam";
|
|
|
|
targetPkgs = pkgs: with pkgs; [
|
|
steamPackages.steam
|
|
# License agreement
|
|
gnome3.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
|
|
|
|
# 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
|
|
libdrm
|
|
mono
|
|
xorg.xkeyboardconfig
|
|
xorg.libpciaccess
|
|
udev # shadow of the tomb raider
|
|
|
|
## screeps dependencies
|
|
gtk3
|
|
dbus
|
|
zlib
|
|
glib
|
|
atk
|
|
cairo
|
|
freetype
|
|
gdk-pixbuf
|
|
pango
|
|
fontconfig
|
|
|
|
# friends options won't display "Launch Game" without it
|
|
lsof
|
|
|
|
# called by steam's setup.sh
|
|
file
|
|
|
|
# Prison Architect
|
|
libGLU
|
|
libuuid
|
|
libbsd
|
|
alsaLib
|
|
] ++ (if (!nativeOnly) then [
|
|
(steamPackages.steam-runtime-wrapped.override {
|
|
inherit runtimeOnly;
|
|
})
|
|
] else [
|
|
# Required
|
|
glib
|
|
gtk2
|
|
bzip2
|
|
zlib
|
|
gdk-pixbuf
|
|
|
|
# Without these it silently fails
|
|
xorg.libXinerama
|
|
xorg.libXdamage
|
|
xorg.libXcursor
|
|
xorg.libXrender
|
|
xorg.libXScrnSaver
|
|
xorg.libXxf86vm
|
|
xorg.libXi
|
|
xorg.libSM
|
|
xorg.libICE
|
|
gnome2.GConf
|
|
freetype
|
|
(curl.override { gnutlsSupport = true; sslSupport = false; })
|
|
nspr
|
|
nss
|
|
fontconfig
|
|
cairo
|
|
pango
|
|
expat
|
|
dbus
|
|
cups
|
|
libcap
|
|
SDL2
|
|
libusb1
|
|
dbus-glib
|
|
libav
|
|
atk
|
|
# Only libraries are needed from those two
|
|
libudev0-shim
|
|
networkmanager098
|
|
|
|
# Verified games requirements
|
|
xorg.libXt
|
|
xorg.libXmu
|
|
xorg.libxcb
|
|
libogg
|
|
libvorbis
|
|
SDL
|
|
SDL2_image
|
|
glew110
|
|
openssl
|
|
libidn
|
|
tbb
|
|
wayland
|
|
mesa
|
|
libxkbcommon
|
|
|
|
# Other things from runtime
|
|
flac
|
|
freeglut
|
|
libjpeg
|
|
libpng12
|
|
libsamplerate
|
|
libmikmod
|
|
libtheora
|
|
libtiff
|
|
pixman
|
|
speex
|
|
SDL_image
|
|
SDL_ttf
|
|
SDL_mixer
|
|
SDL2_ttf
|
|
SDL2_mixer
|
|
libappindicator-gtk2
|
|
libcaca
|
|
libcanberra
|
|
libgcrypt
|
|
libvpx
|
|
librsvg
|
|
xorg.libXft
|
|
libvdpau
|
|
] ++ steamPackages.steam-runtime-wrapped.overridePkgs) ++ extraLibraries pkgs;
|
|
|
|
extraBuildCommands = if (!nativeOnly) then ''
|
|
mkdir -p steamrt
|
|
ln -s ../lib/steam-runtime steamrt/${steam-runtime-wrapped.arch}
|
|
${lib.optionalString (steam-runtime-wrapped-i686 != null) ''
|
|
ln -s ../lib32/steam-runtime steamrt/${steam-runtime-wrapped-i686.arch}
|
|
''}
|
|
ln -s ${runSh} steamrt/run.sh
|
|
ln -s ${setupSh} steamrt/setup.sh
|
|
'' else ''
|
|
ln -s /usr/lib/libbz2.so usr/lib/libbz2.so.1.0
|
|
${lib.optionalString (steam-runtime-wrapped-i686 != null) ''
|
|
ln -s /usr/lib32/libbz2.so usr/lib32/libbz2.so.1.0
|
|
''}
|
|
'';
|
|
|
|
extraInstallCommands = ''
|
|
mkdir -p $out/share/applications
|
|
ln -s ${steam}/share/icons $out/share
|
|
ln -s ${steam}/share/pixmaps $out/share
|
|
sed "s,/usr/bin/steam,steam,g" ${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
|
|
|
|
export STEAM_RUNTIME=${if nativeOnly then "0" else "/steamrt"}
|
|
'' + extraProfile;
|
|
|
|
runScript = writeScript "steam-wrapper.sh" ''
|
|
#!${runtimeShell}
|
|
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
|
|
${lib.optionalString (!nativeOnly) exportLDPath}
|
|
exec steam "$@"
|
|
'';
|
|
|
|
meta = steam.meta // {
|
|
broken = nativeOnly;
|
|
};
|
|
|
|
passthru.run = buildFHSUserEnv {
|
|
name = "steam-run";
|
|
|
|
targetPkgs = commonTargetPkgs;
|
|
inherit multiPkgs extraBuildCommands;
|
|
|
|
runScript = writeScript "steam-run" ''
|
|
#!${runtimeShell}
|
|
run="$1"
|
|
if [ "$run" = "" ]; then
|
|
echo "Usage: steam-run command-to-run args..." >&2
|
|
exit 1
|
|
fi
|
|
shift
|
|
${lib.optionalString (!nativeOnly) exportLDPath}
|
|
exec -- "$run" "$@"
|
|
'';
|
|
};
|
|
}
|