toxic: 0.15.1 -> 0.16.0
[NixPkgs.git] / pkgs / development / libraries / SDL2 / default.nix
blob9e319154717bf4bb63f22f0e3dd973c14ecdc356
2   lib,
3   stdenv,
4   config,
5   fetchFromGitHub,
6   nix-update-script,
7   pkg-config,
8   libGLSupported ? lib.elem stdenv.hostPlatform.system mesa.meta.platforms,
9   openglSupport ? libGLSupported,
10   libGL,
11   alsaSupport ? stdenv.hostPlatform.isLinux && !stdenv.hostPlatform.isAndroid,
12   alsa-lib,
13   x11Support ? !stdenv.hostPlatform.isWindows && !stdenv.hostPlatform.isAndroid,
14   libX11,
15   xorgproto,
16   libICE,
17   libXi,
18   libXScrnSaver,
19   libXcursor,
20   libXinerama,
21   libXext,
22   libXxf86vm,
23   libXrandr,
24   waylandSupport ? stdenv.hostPlatform.isLinux && !stdenv.hostPlatform.isAndroid,
25   wayland,
26   wayland-protocols,
27   wayland-scanner,
28   drmSupport ? false,
29   libdrm,
30   mesa,
31   libxkbcommon,
32   dbusSupport ? stdenv.hostPlatform.isLinux && !stdenv.hostPlatform.isAndroid,
33   dbus,
34   udevSupport ? stdenv.hostPlatform.isLinux && !stdenv.hostPlatform.isAndroid,
35   udev,
36   ibusSupport ? false,
37   ibus,
38   libdecorSupport ? stdenv.hostPlatform.isLinux && !stdenv.hostPlatform.isAndroid,
39   libdecor,
40   pipewireSupport ? stdenv.hostPlatform.isLinux && !stdenv.hostPlatform.isAndroid,
41   pipewire, # NOTE: must be built with SDL2 without pipewire support
42   pulseaudioSupport ?
43     config.pulseaudio or stdenv.hostPlatform.isLinux && !stdenv.hostPlatform.isAndroid,
44   libpulseaudio,
45   AudioUnit,
46   Cocoa,
47   CoreAudio,
48   CoreServices,
49   ForceFeedback,
50   OpenGL,
51   audiofile,
52   libiconv,
53   withStatic ? stdenv.hostPlatform.isMinGW,
54   # passthru.tests
55   testers,
56   guile-sdl2,
57   jazz2,
58   SDL2_ttf,
59   SDL2_net,
60   SDL2_gfx,
61   SDL2_sound,
62   SDL2_mixer,
63   SDL2_image,
64   python3Packages,
67 # NOTE: When editing this expression see if the same change applies to
68 # SDL expression too
70 stdenv.mkDerivation (finalAttrs: {
71   pname = "SDL2";
72   version = "2.30.6";
74   src = fetchFromGitHub {
75     owner = "libsdl-org";
76     repo = "SDL";
77     rev = "release-${finalAttrs.version}";
78     hash = "sha256-ij9/VhSacUaPbMGX1hx2nz0n8b1tDb1PnC7IO9TlNhE=";
79   };
80   dontDisableStatic = if withStatic then 1 else 0;
81   outputs = [
82     "out"
83     "dev"
84   ];
85   outputBin = "dev"; # sdl-config
87   patches = [
88     # `sdl2-config --cflags` from Nixpkgs returns include path to just SDL2.
89     # On a normal distro this is enough for includes from all SDL2* packages to work,
90     # but on NixOS they're spread across different paths.
91     # This patch + the setup-hook will ensure that `sdl2-config --cflags` works correctly.
92     ./find-headers.patch
93   ];
95   postPatch = ''
96     # Fix running wayland-scanner for the build platform when cross-compiling.
97     # See comment here: https://github.com/libsdl-org/SDL/issues/4860#issuecomment-1119003545
98     substituteInPlace configure \
99       --replace '$(WAYLAND_SCANNER)' 'wayland-scanner'
100   '';
102   strictDeps = true;
104   depsBuildBuild = [ pkg-config ];
106   nativeBuildInputs =
107     [ pkg-config ]
108     ++ lib.optionals waylandSupport [
109       wayland
110       wayland-scanner
111     ];
113   dlopenPropagatedBuildInputs =
114     [ ]
115     # Propagated for #include <GLES/gl.h> in SDL_opengles.h.
116     ++ lib.optional (openglSupport && !stdenv.hostPlatform.isDarwin) libGL
117     # Propagated for #include <X11/Xlib.h> and <X11/Xatom.h> in SDL_syswm.h.
118     ++ lib.optionals x11Support [ libX11 ];
120   propagatedBuildInputs =
121     lib.optionals x11Support [ xorgproto ] ++ finalAttrs.dlopenPropagatedBuildInputs;
123   dlopenBuildInputs =
124     lib.optionals alsaSupport [
125       alsa-lib
126       audiofile
127     ]
128     ++ lib.optional dbusSupport dbus
129     ++ lib.optional libdecorSupport libdecor
130     ++ lib.optional pipewireSupport pipewire
131     ++ lib.optional pulseaudioSupport libpulseaudio
132     ++ lib.optional udevSupport udev
133     ++ lib.optionals waylandSupport [
134       wayland
135       libxkbcommon
136     ]
137     ++ lib.optionals x11Support [
138       libICE
139       libXi
140       libXScrnSaver
141       libXcursor
142       libXinerama
143       libXext
144       libXrandr
145       libXxf86vm
146     ]
147     ++ lib.optionals drmSupport [
148       libdrm
149       mesa
150     ];
152   buildInputs =
153     [ libiconv ]
154     ++ finalAttrs.dlopenBuildInputs
155     ++ lib.optional ibusSupport ibus
156     ++ lib.optionals waylandSupport [ wayland-protocols ]
157     ++ lib.optionals stdenv.hostPlatform.isDarwin [
158       AudioUnit
159       Cocoa
160       CoreAudio
161       CoreServices
162       ForceFeedback
163       OpenGL
164     ];
166   enableParallelBuilding = true;
168   configureFlags =
169     [ "--disable-oss" ]
170     ++ lib.optional (!x11Support) "--without-x"
171     ++ lib.optional alsaSupport "--with-alsa-prefix=${alsa-lib.out}/lib"
172     ++ lib.optional stdenv.hostPlatform.isWindows "--disable-video-opengles"
173     ++ lib.optional stdenv.hostPlatform.isDarwin "--disable-sdltest";
175   # We remove libtool .la files when static libs are requested,
176   # because they make the builds of downstream libs like `SDL_tff`
177   # fail with `cannot find -lXext, `-lXcursor` etc. linker errors
178   # because the `.la` files are not pruned if static libs exist
179   # (see https://github.com/NixOS/nixpkgs/commit/fd97db43bcb05e37f6bb77f363f1e1e239d9de53)
180   # and they also don't carry the necessary `-L` paths of their
181   # X11 dependencies.
182   # For static linking, it is better to rely on `pkg-config` `.pc`
183   # files.
184   postInstall = ''
185     if [ "$dontDisableStatic" -eq "1" ]; then
186       rm $out/lib/*.la
187     else
188       rm $out/lib/*.a
189     fi
190     moveToOutput bin/sdl2-config "$dev"
191   '';
193   # SDL is weird in that instead of just dynamically linking with
194   # libraries when you `--enable-*` (or when `configure` finds) them
195   # it `dlopen`s them at runtime. In principle, this means it can
196   # ignore any missing optional dependencies like alsa, pulseaudio,
197   # some x11 libs, wayland, etc if they are missing on the system
198   # and/or work with wide array of versions of said libraries. In
199   # nixpkgs, however, we don't need any of that. Moreover, since we
200   # don't have a global ld-cache we have to stuff all the propagated
201   # libraries into rpath by hand or else some applications that use
202   # SDL API that requires said libraries will fail to start.
203   #
204   # You can grep SDL sources with `grep -rE 'SDL_(NAME|.*_SYM)'` to
205   # list the symbols used in this way.
206   postFixup =
207     let
208       rpath = lib.makeLibraryPath (
209         finalAttrs.dlopenPropagatedBuildInputs ++ finalAttrs.dlopenBuildInputs
210       );
211     in
212     lib.optionalString (stdenv.hostPlatform.extensions.sharedLibrary == ".so") ''
213       for lib in $out/lib/*.so* ; do
214         if ! [[ -L "$lib" ]]; then
215           patchelf --set-rpath "$(patchelf --print-rpath $lib):${rpath}" "$lib"
216         fi
217       done
218     '';
220   setupHook = ./setup-hook.sh;
222   passthru = {
223     inherit openglSupport;
224     updateScript = nix-update-script {
225       extraArgs = [
226         "--version-regex"
227         "release-(.*)"
228       ];
229     };
230     tests = {
231       pkg-config = testers.hasPkgConfigModules { package = finalAttrs.finalPackage; };
232       inherit
233         guile-sdl2
234         jazz2
235         SDL2_ttf
236         SDL2_net
237         SDL2_gfx
238         SDL2_sound
239         SDL2_mixer
240         SDL2_image
241         ;
242       inherit (python3Packages) pygame pygame-ce pygame-sdl2;
243     };
244   };
246   meta = with lib; {
247     description = "Cross-platform multimedia library";
248     mainProgram = "sdl2-config";
249     homepage = "http://www.libsdl.org/";
250     changelog = "https://github.com/libsdl-org/SDL/releases/tag/release-${finalAttrs.version}";
251     license = licenses.zlib;
252     platforms = platforms.all;
253     maintainers = lib.teams.sdl.members;
254     pkgConfigModules = [ "sdl2" ];
255   };