summaryrefslogtreecommitdiff
path: root/shit-run.nix
blob: ed0c7d07cb1d148d86a1a5fa3411db2107007d01 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
{ inputs }:
let
  pkgs2505 = import inputs.nixpkgs2505 { };
  pkgs2003 = import inputs.nixpkgs2003 { };

  ldPath = [ "/lib64" ] ++ [ "/lib32" ];

  exportLDPath =
    lib: with lib; ''
      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"
  #    '';

  envScript = ''
    # prevents various error messages
    unset GIO_EXTRA_MODULES

    # This is needed for IME (e.g. iBus, fcitx5) to function correctly on non-CJK locales
    # https://github.com/ValveSoftware/steam-for-linux/issues/781#issuecomment-2004757379
    GTK_IM_MODULE='xim'
  '';

in
mod: orig: {
  #  steam-run_my = with orig; with steam; with steamPackages; buildFHSEnv  {
  shit-run =
    with orig;
    buildFHSEnv {
      name = "shit-run";

      # Steam still needs 32bit and various native games do too
      multiArch = true;

      targetPkgs = pkgs: ([
        #    steam
        # License agreement
        #    gnome.zenity

        # 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
        # run.sh wants ldconfig
        glibc.bin
        # 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

      ]);

      multiPkgs = pkgs: ([
        # These are required by steam with proper errors
        xorg.libXcomposite
        xorg.libXtst
        xorg.libXrandr
        xorg.libXext
        xorg.libX11
        xorg.libXfixes
        sqlite
        mod.mesa
        libGL
        libva
        mod.pipewire
        wireplumber
        pulseaudio
        openal

        # 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
        elfutils

        # Without these it silently fails
        xorg.libXinerama
        xorg.libXcursor
        xorg.libXrender
        xorg.libXScrnSaver
        xorg.libXi
        xorg.libSM
        xorg.libICE
        pkgs2505.gnome2.GConf
#        (gnome2.GConf.overrideAttrs (
#          old: rec {
#            nativeBuildInputs = old.nativeBuildInputs ++ [ python3Packages.2to3 ];
#          }
#          )
#        )
        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
        zstd

        # SteamVR
        udev
        dbus

        # 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
        libunwind
        libvpx
        librsvg
        xorg.libXft
        libvdpau

        # 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

        # 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
        ncurses # Crusader Kings III
        openssl
        pkgs2003.openssl_1_0_2
        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
        # FIXME: Also requires openssl_1_1, which is EOL. Either find an alternative solution, or remove these dependencies (if not needed by other games)
        libidn2
        libpsl
        nghttp2.lib
        rtmpdump
      ]);

      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
      '';

      # runScript = (writeShellScript "shit-run" ''
      #   run="$1"
      #   if [ "$run" = "" ]; then
      #     echo "Usage: shit-run command-to-run args..." >&2
      #     exit 1
      #   fi
      #   shift
      #
      #  ${exportLDPath}
      #
      #   set -o allexport # Export the following env vars
      #   ${envScript}
      #   exec -- "$run" "$@"
      # '');
      runScript = (
        writeShellScript "shit-run" ''
          run="$1"
          if [ "$run" = "" ]; then
            echo "Usage: shit-run command-to-run args..." >&2
            exit 1
          fi
          shift


          set -o allexport # Export the following env vars
          ${envScript}
          exec -- "$run" "$@"
        ''
      );

      #    runScript = "bash";
      privateTmp = true;

      extraPreBwrapCmds = ''
        install -m 1777 -d /tmp/dumps
      '';

      extraBwrapArgs = [
        "--bind-try /tmp/dumps /tmp/dumps"
      ];

      meta = {
        description = "shit-run (steam-run clone)";
      };
    };
}