python3Packages.orjson: Disable failing tests on 32 bit
[NixPkgs.git] / pkgs / games / steam / fhsenv.nix
blobea9db37cbddfa37d962fe7454487834a02674b58
1 { config, lib, writeScript, buildFHSUserEnv, steam, glxinfo-i686
2 , steam-runtime-wrapped, steam-runtime-wrapped-i686 ? null
3 , extraPkgs ? pkgs: [ ] # extra packages to add to targetPkgs
4 , extraLibraries ? pkgs: [ ] # extra packages to add to multiPkgs
5 , extraProfile ? "" # string to append to profile
6 , extraArgs ? "" # arguments to always pass to steam
7 , runtimeOnly ? false
8 , runtimeShell
9 , stdenv
11 # DEPRECATED
12 , withJava ? config.steam.java or false
13 , withPrimus ? config.steam.primus or false
16 let
17   commonTargetPkgs = pkgs: with pkgs;
18     [
19       # Needed for operating system detection until
20       # https://github.com/ValveSoftware/steam-for-linux/issues/5909 is resolved
21       lsb-release
22       # Errors in output without those
23       pciutils
24       # Games' dependencies
25       xorg.xrandr
26       which
27       # Needed by gdialog, including in the steam-runtime
28       perl
29       # Open URLs
30       xdg-utils
31       iana-etc
32       # Steam Play / Proton
33       python3
34       # Steam VR
35       procps
36       usbutils
38       # electron based launchers need newer versions of these libraries than what runtime provides
39       mesa
40       sqlite
41     ] ++ lib.optional withJava jdk8 # TODO: upgrade https://github.com/NixOS/nixpkgs/pull/89731
42       ++ lib.optional withPrimus primus
43       ++ extraPkgs pkgs;
45   ldPath = lib.optionals stdenv.is64bit [ "/lib64" ]
46   ++ [ "/lib32" ]
47   ++ map (x: "/steamrt/${steam-runtime-wrapped.arch}/" + x) steam-runtime-wrapped.libs
48   ++ lib.optionals (steam-runtime-wrapped-i686 != null) (map (x: "/steamrt/${steam-runtime-wrapped-i686.arch}/" + x) steam-runtime-wrapped-i686.libs);
50   # Zachtronics and a few other studios expect STEAM_LD_LIBRARY_PATH to be present
51   exportLDPath = ''
52     export LD_LIBRARY_PATH=${lib.concatStringsSep ":" ldPath}''${LD_LIBRARY_PATH:+:}$LD_LIBRARY_PATH
53     export STEAM_LD_LIBRARY_PATH="$STEAM_LD_LIBRARY_PATH''${STEAM_LD_LIBRARY_PATH:+:}$LD_LIBRARY_PATH"
54   '';
56   # bootstrap.tar.xz has 444 permissions, which means that simple deletes fail
57   # and steam will not be able to start
58   fixBootstrap = ''
59     if [ -r $HOME/.local/share/Steam/bootstrap.tar.xz ]; then
60       chmod +w $HOME/.local/share/Steam/bootstrap.tar.xz
61     fi
62   '';
64 in buildFHSUserEnv rec {
65   name = "steam";
67   targetPkgs = pkgs: with pkgs; [
68     steamPackages.steam
69     # License agreement
70     gnome.zenity
71   ] ++ commonTargetPkgs pkgs;
73   multiPkgs = pkgs: with pkgs; [
74     # These are required by steam with proper errors
75     xorg.libXcomposite
76     xorg.libXtst
77     xorg.libXrandr
78     xorg.libXext
79     xorg.libX11
80     xorg.libXfixes
81     libGL
82     libva
83     pipewire.lib
85     # steamwebhelper
86     harfbuzz
87     libthai
88     pango
90     # Not formally in runtime but needed by some games
91     at-spi2-atk
92     at-spi2-core   # CrossCode
93     gst_all_1.gstreamer
94     gst_all_1.gst-plugins-ugly
95     gst_all_1.gst-plugins-base
96     json-glib # paradox launcher (Stellaris)
97     libdrm
98     libxkbcommon # paradox launcher
99     libvorbis # Dead Cells
100     mono
101     xorg.xkeyboardconfig
102     xorg.libpciaccess
103     xorg.libXScrnSaver # Dead Cells
104     udev # shadow of the tomb raider
105     icu # dotnet runtime, e.g. stardew valley
107     # screeps dependencies
108     gtk3
109     dbus
110     zlib
111     atk
112     cairo
113     freetype
114     gdk-pixbuf
115     fontconfig
117     # friends options won't display "Launch Game" without it
118     lsof
120     # called by steam's setup.sh
121     file
123     # Prison Architect
124     libGLU
125     libuuid
126     libbsd
127     alsa-lib
129     # Loop Hero
130     libidn2
131     libpsl
132     nghttp2.lib
133     openssl_1_1
134     rtmpdump
136     # dependencies for mesa drivers, needed inside pressure-vessel
137     mesa.llvmPackages.llvm.lib
138     vulkan-loader
139     expat
140     wayland
141     xorg.libxcb
142     xorg.libXdamage
143     xorg.libxshmfence
144     xorg.libXxf86vm
145     libelf
147     # Required
148     glib
149     gtk2
150     bzip2
152     # Without these it silently fails
153     xorg.libXinerama
154     xorg.libXcursor
155     xorg.libXrender
156     xorg.libXScrnSaver
157     xorg.libXi
158     xorg.libSM
159     xorg.libICE
160     gnome2.GConf
161     curlWithGnuTls
162     nspr
163     nss
164     cups
165     libcap
166     SDL2
167     libusb1
168     dbus-glib
169     ffmpeg
170     # Only libraries are needed from those two
171     libudev0-shim
173     # Verified games requirements
174     xorg.libXt
175     xorg.libXmu
176     libogg
177     libvorbis
178     SDL
179     SDL2_image
180     glew110
181     libidn
182     tbb
184     # Other things from runtime
185     flac
186     freeglut
187     libjpeg
188     libpng
189     libpng12
190     libsamplerate
191     libmikmod
192     libtheora
193     libtiff
194     pixman
195     speex
196     SDL_image
197     SDL_ttf
198     SDL_mixer
199     SDL2_ttf
200     SDL2_mixer
201     libappindicator-gtk2
202     libdbusmenu-gtk2
203     libindicator-gtk2
204     libcaca
205     libcanberra
206     libgcrypt
207     libvpx
208     librsvg
209     xorg.libXft
210     libvdpau
211   ]
212   ++ steamPackages.steam-runtime-wrapped.overridePkgs
213   ++ extraLibraries pkgs;
215   extraInstallCommands = ''
216     mkdir -p $out/share/applications
217     ln -s ${steam}/share/icons $out/share
218     ln -s ${steam}/share/pixmaps $out/share
219     ln -s ${steam}/share/applications/steam.desktop $out/share/applications/steam.desktop
220   '';
222   profile = ''
223     # Workaround for issue #44254 (Steam cannot connect to friends network)
224     # https://github.com/NixOS/nixpkgs/issues/44254
225     if [ -z ''${TZ+x} ]; then
226       new_TZ="$(readlink -f /etc/localtime | grep -P -o '(?<=/zoneinfo/).*$')"
227       if [ $? -eq 0 ]; then
228         export TZ="$new_TZ"
229       fi
230     fi
232     # udev event notifications don't work reliably inside containers.
233     # SDL2 already tries to automatically detect flatpak and pressure-vessel
234     # and falls back to inotify-based discovery [1]. We make SDL2 do the
235     # same by telling it explicitly.
236     #
237     # [1] <https://github.com/libsdl-org/SDL/commit/8e2746cfb6e1f1a1da5088241a1440fd2535e321>
238     export SDL_JOYSTICK_DISABLE_UDEV=1
239   '' + extraProfile;
241   runScript = writeScript "steam-wrapper.sh" ''
242     #!${runtimeShell}
243     if [ -f /host/etc/NIXOS ]; then   # Check only useful on NixOS
244       ${glxinfo-i686}/bin/glxinfo >/dev/null 2>&1
245       # If there was an error running glxinfo, we know something is wrong with the configuration
246       if [ $? -ne 0 ]; then
247         cat <<EOF > /dev/stderr
248     **
249     WARNING: Steam is not set up. Add the following options to /etc/nixos/configuration.nix
250     and then run \`sudo nixos-rebuild switch\`:
251     {
252       hardware.opengl.driSupport32Bit = true;
253       hardware.pulseaudio.support32Bit = true;
254     }
255     **
256     EOF
257       fi
258     fi
260     ${exportLDPath}
261     ${fixBootstrap}
262     exec steam ${extraArgs} "$@"
263   '';
265   inherit (steam) meta;
267   # allows for some gui applications to share IPC
268   # this fixes certain issues where they don't render correctly
269   unshareIpc = false;
271   # Some applications such as Natron need access to MIT-SHM or other
272   # shared memory mechanisms. Unsharing the pid namespace
273   # breaks the ability for application to reference shared memory.
274   unsharePid = false;
276   passthru.run = buildFHSUserEnv {
277     name = "steam-run";
279     targetPkgs = commonTargetPkgs;
280     inherit multiPkgs profile extraInstallCommands;
282     inherit unshareIpc unsharePid;
284     runScript = writeScript "steam-run" ''
285       #!${runtimeShell}
286       run="$1"
287       if [ "$run" = "" ]; then
288         echo "Usage: steam-run command-to-run args..." >&2
289         exit 1
290       fi
291       shift
293       ${exportLDPath}
294       ${fixBootstrap}
295       exec -- "$run" "$@"
296     '';
298     meta = steam.meta // {
299       description = "Run commands in the same FHS environment that is used for Steam";
300       name = "steam-run";
301     };
302   };