Merge pull request #268619 from tweag/lib-descriptions
[NixPkgs.git] / pkgs / games / steam / fhsenv.nix
blob8ba5087ef7fe76995c005732ada4821e74ba2be2
1 { lib, stdenv, writeShellScript, buildFHSEnv, 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 , extraBwrapArgs ? [ ] # extra arguments to pass to bubblewrap
7 , extraArgs ? "" # arguments to always pass to steam
8 , extraEnv ? { } # Environment variables to pass to Steam
9 , withGameSpecificLibraries ? true # include game specific libraries
12 let
13   commonTargetPkgs = pkgs: with pkgs; [
14     # Needed for operating system detection until
15     # https://github.com/ValveSoftware/steam-for-linux/issues/5909 is resolved
16     lsb-release
17     # Errors in output without those
18     pciutils
19     # Games' dependencies
20     xorg.xrandr
21     which
22     # Needed by gdialog, including in the steam-runtime
23     perl
24     # Open URLs
25     xdg-utils
26     iana-etc
27     # Steam Play / Proton
28     python3
29     # Steam VR
30     procps
31     usbutils
33     # It tries to execute xdg-user-dir and spams the log with command not founds
34     xdg-user-dirs
36     # electron based launchers need newer versions of these libraries than what runtime provides
37     mesa
38     sqlite
39   ] ++ extraPkgs pkgs;
41   ldPath = lib.optionals stdenv.is64bit [ "/lib64" ]
42   ++ [ "/lib32" ]
43   ++ map (x: "/steamrt/${steam-runtime-wrapped.arch}/" + x) steam-runtime-wrapped.libs
44   ++ lib.optionals (steam-runtime-wrapped-i686 != null) (map (x: "/steamrt/${steam-runtime-wrapped-i686.arch}/" + x) steam-runtime-wrapped-i686.libs);
46   # Zachtronics and a few other studios expect STEAM_LD_LIBRARY_PATH to be present
47   exportLDPath = ''
48     export LD_LIBRARY_PATH=${lib.concatStringsSep ":" ldPath}''${LD_LIBRARY_PATH:+:}$LD_LIBRARY_PATH
49     export STEAM_LD_LIBRARY_PATH="$STEAM_LD_LIBRARY_PATH''${STEAM_LD_LIBRARY_PATH:+:}$LD_LIBRARY_PATH"
50   '';
52   # bootstrap.tar.xz has 444 permissions, which means that simple deletes fail
53   # and steam will not be able to start
54   fixBootstrap = ''
55     if [ -r $HOME/.local/share/Steam/bootstrap.tar.xz ]; then
56       chmod +w $HOME/.local/share/Steam/bootstrap.tar.xz
57     fi
58   '';
60   envScript = lib.toShellVars extraEnv;
62 in buildFHSEnv rec {
63   name = "steam";
65   # Steam still needs 32bit and various native games do too
66   multiArch = true;
68   targetPkgs = pkgs: with pkgs; [
69     steam
70     # License agreement
71     gnome.zenity
72   ] ++ commonTargetPkgs pkgs;
74   multiPkgs = pkgs: with pkgs; [
75     # These are required by steam with proper errors
76     xorg.libXcomposite
77     xorg.libXtst
78     xorg.libXrandr
79     xorg.libXext
80     xorg.libX11
81     xorg.libXfixes
82     libGL
83     libva
84     pipewire
86     # steamwebhelper
87     harfbuzz
88     libthai
89     pango
91     lsof # friends options won't display "Launch Game" without it
92     file # called by steam's setup.sh
94     # dependencies for mesa drivers, needed inside pressure-vessel
95     mesa.llvmPackages.llvm.lib
96     vulkan-loader
97     expat
98     wayland
99     xorg.libxcb
100     xorg.libXdamage
101     xorg.libxshmfence
102     xorg.libXxf86vm
103     libelf
104     (lib.getLib elfutils)
106     # Without these it silently fails
107     xorg.libXinerama
108     xorg.libXcursor
109     xorg.libXrender
110     xorg.libXScrnSaver
111     xorg.libXi
112     xorg.libSM
113     xorg.libICE
114     gnome2.GConf
115     curlWithGnuTls
116     nspr
117     nss
118     cups
119     libcap
120     SDL2
121     libusb1
122     dbus-glib
123     gsettings-desktop-schemas
124     ffmpeg
125     libudev0-shim
127     # Verified games requirements
128     fontconfig
129     freetype
130     xorg.libXt
131     xorg.libXmu
132     libogg
133     libvorbis
134     SDL
135     SDL2_image
136     glew110
137     libdrm
138     libidn
139     tbb
140     zlib
142     # SteamVR
143     udev
144     dbus
146     # Other things from runtime
147     glib
148     gtk2
149     bzip2
150     flac
151     freeglut
152     libjpeg
153     libpng
154     libpng12
155     libsamplerate
156     libmikmod
157     libtheora
158     libtiff
159     pixman
160     speex
161     SDL_image
162     SDL_ttf
163     SDL_mixer
164     SDL2_ttf
165     SDL2_mixer
166     libappindicator-gtk2
167     libdbusmenu-gtk2
168     libindicator-gtk2
169     libcaca
170     libcanberra
171     libgcrypt
172     libunwind
173     libvpx
174     librsvg
175     xorg.libXft
176     libvdpau
178     # required by coreutils stuff to run correctly
179     # Steam ends up with LD_LIBRARY_PATH=<bunch of runtime stuff>:/usr/lib:<etc>
180     # which overrides DT_RUNPATH in our binaries, so it tries to dynload the
181     # very old versions of stuff from the runtime.
182     # FIXME: how do we even fix this correctly
183     attr
184   ] ++ lib.optionals withGameSpecificLibraries [
185     # Not formally in runtime but needed by some games
186     at-spi2-atk
187     at-spi2-core   # CrossCode
188     gst_all_1.gstreamer
189     gst_all_1.gst-plugins-ugly
190     gst_all_1.gst-plugins-base
191     json-glib # paradox launcher (Stellaris)
192     libdrm
193     libxkbcommon # paradox launcher
194     libvorbis # Dead Cells
195     libxcrypt # Alien Isolation, XCOM 2, Company of Heroes 2
196     mono
197     ncurses # Crusader Kings III
198     openssl
199     xorg.xkeyboardconfig
200     xorg.libpciaccess
201     xorg.libXScrnSaver # Dead Cells
202     icu # dotnet runtime, e.g. Stardew Valley
204     # screeps dependencies
205     gtk3
206     zlib
207     atk
208     cairo
209     freetype
210     gdk-pixbuf
211     fontconfig
213     # Prison Architect
214     libGLU
215     libuuid
216     libbsd
217     alsa-lib
219     # Loop Hero
220     # FIXME: Also requires openssl_1_1, which is EOL. Either find an alternative solution, or remove these dependencies (if not needed by other games)
221     libidn2
222     libpsl
223     nghttp2.lib
224     rtmpdump
225   ]
226   # This needs to come from pkgs as the passed-in steam-runtime-wrapped may not be the same architecture
227   ++ pkgs.steamPackages.steam-runtime-wrapped.overridePkgs
228   ++ extraLibraries pkgs;
230   extraInstallCommands = lib.optionalString (steam != null) ''
231     mkdir -p $out/share/applications
232     ln -s ${steam}/share/icons $out/share
233     ln -s ${steam}/share/pixmaps $out/share
234     ln -s ${steam}/share/applications/steam.desktop $out/share/applications/steam.desktop
235   '';
237   profile = ''
238     # Workaround for issue #44254 (Steam cannot connect to friends network)
239     # https://github.com/NixOS/nixpkgs/issues/44254
240     if [ -z ''${TZ+x} ]; then
241       new_TZ="$(readlink -f /etc/localtime | grep -P -o '(?<=/zoneinfo/).*$')"
242       if [ $? -eq 0 ]; then
243         export TZ="$new_TZ"
244       fi
245     fi
247     # udev event notifications don't work reliably inside containers.
248     # SDL2 already tries to automatically detect flatpak and pressure-vessel
249     # and falls back to inotify-based discovery [1]. We make SDL2 do the
250     # same by telling it explicitly.
251     #
252     # [1] <https://github.com/libsdl-org/SDL/commit/8e2746cfb6e1f1a1da5088241a1440fd2535e321>
253     export SDL_JOYSTICK_DISABLE_UDEV=1
254   '' + extraProfile;
256   runScript = writeShellScript "steam-wrapper.sh" ''
257     if [ -f /host/etc/NIXOS ]; then   # Check only useful on NixOS
258       ${glxinfo-i686}/bin/glxinfo >/dev/null 2>&1
259       # If there was an error running glxinfo, we know something is wrong with the configuration
260       if [ $? -ne 0 ]; then
261         cat <<EOF > /dev/stderr
262     **
263     WARNING: Steam is not set up. Add the following options to /etc/nixos/configuration.nix
264     and then run \`sudo nixos-rebuild switch\`:
265     {
266       hardware.opengl.driSupport32Bit = true;
267       hardware.pulseaudio.support32Bit = true;
268     }
269     **
270     EOF
271       fi
272     fi
274     ${exportLDPath}
275     ${fixBootstrap}
277     set -o allexport # Export the following env vars
278     ${envScript}
279     exec steam ${extraArgs} "$@"
280   '';
282   inherit extraBwrapArgs;
284   meta =
285     if steam != null
286     then
287       steam.meta // lib.optionalAttrs (!withGameSpecificLibraries) {
288         description = steam.meta.description + " (without game specific libraries)";
289       }
290     else {
291       description = "Steam dependencies (dummy package, do not use)";
292     };
294   passthru.run = buildFHSEnv {
295     name = "steam-run";
297     targetPkgs = commonTargetPkgs;
298     inherit multiArch multiPkgs profile extraInstallCommands extraBwrapArgs;
300     runScript = writeShellScript "steam-run" ''
301       run="$1"
302       if [ "$run" = "" ]; then
303         echo "Usage: steam-run command-to-run args..." >&2
304         exit 1
305       fi
306       shift
308       ${exportLDPath}
309       ${fixBootstrap}
311       set -o allexport # Export the following env vars
312       ${envScript}
313       exec -- "$run" "$@"
314     '';
316     meta = (steam.meta or {}) // {
317       description = "Run commands in the same FHS environment that is used for Steam";
318       mainProgram = "steam-run";
319       name = "steam-run";
320     };
321   };