1macro(FindLibraryAndSONAME _LIB)
2  string(TOUPPER ${_LIB} _UPPERLNAME)
3  string(REGEX REPLACE "\\-" "_" _LNAME "${_UPPERLNAME}")
4
5  find_library(${_LNAME}_LIB ${_LIB})
6  if(${_LNAME}_LIB)
7    # reduce the library name for shared linking
8
9    get_filename_component(_LIB_REALPATH ${${_LNAME}_LIB} REALPATH)  # resolves symlinks
10    get_filename_component(_LIB_JUSTNAME ${_LIB_REALPATH} NAME)
11
12    if(APPLE)
13      string(REGEX REPLACE "(\\.[0-9]*)\\.[0-9\\.]*dylib$" "\\1.dylib" _LIB_REGEXD "${_LIB_JUSTNAME}")
14    else()
15      string(REGEX REPLACE "(\\.[0-9]*)\\.[0-9\\.]*$" "\\1" _LIB_REGEXD "${_LIB_JUSTNAME}")
16    endif()
17
18    SET(_DEBUG_FindSONAME FALSE)
19    if(_DEBUG_FindSONAME)
20      message_warn("DYNLIB OUTPUTVAR: ${_LIB} ... ${_LNAME}_LIB")
21      message_warn("DYNLIB ORIGINAL LIB: ${_LIB} ... ${${_LNAME}_LIB}")
22      message_warn("DYNLIB REALPATH LIB: ${_LIB} ... ${_LIB_REALPATH}")
23      message_warn("DYNLIB JUSTNAME LIB: ${_LIB} ... ${_LIB_JUSTNAME}")
24      message_warn("DYNLIB REGEX'd LIB: ${_LIB} ... ${_LIB_REGEXD}")
25    endif()
26
27    message(STATUS "dynamic lib${_LIB} -> ${_LIB_REGEXD}")
28    set(${_LNAME}_LIB_SONAME ${_LIB_REGEXD})
29  endif()
30endmacro()
31
32macro(CheckDLOPEN)
33  check_symbol_exists(dlopen "dlfcn.h" HAVE_DLOPEN)
34  if(NOT HAVE_DLOPEN)
35    check_library_exists(dl dlopen "" DLOPEN_LIB)
36    if(DLOPEN_LIB)
37      list(APPEND EXTRA_LIBS dl)
38      set(_DLLIB dl)
39      set(HAVE_DLOPEN TRUE)
40    endif()
41  endif()
42  if(HAVE_DLOPEN)
43    if(_DLLIB)
44      set(CMAKE_REQUIRED_LIBRARIES ${_DLLIB})
45    endif()
46    check_c_source_compiles("
47       #include <dlfcn.h>
48       int main(int argc, char **argv) {
49         void *handle = dlopen(\"\", RTLD_NOW);
50         const char *loaderror = (char *) dlerror();
51       }" HAVE_DLOPEN)
52    set(CMAKE_REQUIRED_LIBRARIES)
53  endif()
54endmacro()
55
56macro(CheckO_CLOEXEC)
57  check_c_source_compiles("
58    #include <fcntl.h>
59    int flag = O_CLOEXEC;
60    int main(void) {
61   }" HAVE_O_CLOEXEC)
62endmacro()
63
64# Requires:
65# - n/a
66macro(CheckOSS)
67  if(SDL_OSS)
68    set(OSS_HEADER_FILE "sys/soundcard.h")
69    check_c_source_compiles("
70        #include <sys/soundcard.h>
71        int main() { int arg = SNDCTL_DSP_SETFRAGMENT; }" OSS_FOUND)
72    if(NOT OSS_FOUND)
73      set(OSS_HEADER_FILE "soundcard.h")
74      check_c_source_compiles("
75          #include <soundcard.h>
76          int main() { int arg = SNDCTL_DSP_SETFRAGMENT; }" OSS_FOUND)
77    endif()
78
79    if(OSS_FOUND)
80      set(HAVE_OSS TRUE)
81      file(GLOB OSS_SOURCES ${SDL2_SOURCE_DIR}/src/audio/dsp/*.c)
82      if(OSS_HEADER_FILE STREQUAL "soundcard.h")
83        set(SDL_AUDIO_DRIVER_OSS_SOUNDCARD_H 1)
84      endif()
85      set(SDL_AUDIO_DRIVER_OSS 1)
86      set(SOURCE_FILES ${SOURCE_FILES} ${OSS_SOURCES})
87      if(NETBSD OR OPENBSD)
88        list(APPEND EXTRA_LIBS ossaudio)
89      endif()
90      set(HAVE_SDL_AUDIO TRUE)
91    endif()
92  endif()
93endmacro()
94
95# Requires:
96# - n/a
97# Optional:
98# - SDL_ALSA_SHARED opt
99# - HAVE_SDL_LOADSO opt
100macro(CheckALSA)
101  if(SDL_ALSA)
102    CHECK_INCLUDE_FILE(alsa/asoundlib.h HAVE_ASOUNDLIB_H)
103    if(HAVE_ASOUNDLIB_H)
104      CHECK_LIBRARY_EXISTS(asound snd_pcm_recover "" HAVE_LIBASOUND)
105    endif()
106    if(HAVE_LIBASOUND)
107      set(HAVE_ALSA TRUE)
108      file(GLOB ALSA_SOURCES ${SDL2_SOURCE_DIR}/src/audio/alsa/*.c)
109      set(SOURCE_FILES ${SOURCE_FILES} ${ALSA_SOURCES})
110      set(SDL_AUDIO_DRIVER_ALSA 1)
111      if(SDL_ALSA_SHARED AND NOT HAVE_SDL_LOADSO)
112        message_warn("You must have SDL_LoadObject() support for dynamic ALSA loading")
113      endif()
114      if(SDL_ALSA_SHARED AND HAVE_SDL_LOADSO)
115        FindLibraryAndSONAME("asound")
116        set(SDL_AUDIO_DRIVER_ALSA_DYNAMIC "\"${ASOUND_LIB_SONAME}\"")
117        set(HAVE_ALSA_SHARED TRUE)
118      else()
119        list(APPEND EXTRA_LIBS asound)
120      endif()
121      set(HAVE_SDL_AUDIO TRUE)
122    endif()
123  endif()
124endmacro()
125
126# Requires:
127# - PkgCheckModules
128# Optional:
129# - SDL_PIPEWIRE_SHARED opt
130# - HAVE_SDL_LOADSO opt
131macro(CheckPipewire)
132    if(SDL_PIPEWIRE)
133        pkg_check_modules(PKG_PIPEWIRE libpipewire-0.3>=0.3.20)
134        if(PKG_PIPEWIRE_FOUND)
135            set(HAVE_PIPEWIRE TRUE)
136            file(GLOB PIPEWIRE_SOURCES ${SDL2_SOURCE_DIR}/src/audio/pipewire/*.c)
137            set(SOURCE_FILES ${SOURCE_FILES} ${PIPEWIRE_SOURCES})
138            set(SDL_AUDIO_DRIVER_PIPEWIRE 1)
139            list(APPEND EXTRA_CFLAGS ${PKG_PIPEWIRE_CFLAGS})
140            if(SDL_PIPEWIRE_SHARED AND NOT HAVE_SDL_LOADSO)
141                message_warn("You must have SDL_LoadObject() support for dynamic Pipewire loading")
142            endif()
143            if(SDL_PIPEWIRE_SHARED AND HAVE_SDL_LOADSO)
144                FindLibraryAndSONAME("pipewire-0.3")
145                set(SDL_AUDIO_DRIVER_PIPEWIRE_DYNAMIC "\"${PIPEWIRE_0.3_LIB_SONAME}\"")
146                set(HAVE_PIPEWIRE_SHARED TRUE)
147            else()
148                list(APPEND EXTRA_LDFLAGS ${PKG_PIPEWIRE_LDFLAGS})
149            endif()
150            set(HAVE_SDL_AUDIO TRUE)
151        endif()
152    endif()
153endmacro()
154
155# Requires:
156# - PkgCheckModules
157# Optional:
158# - SDL_PULSEAUDIO_SHARED opt
159# - HAVE_SDL_LOADSO opt
160macro(CheckPulseAudio)
161  if(SDL_PULSEAUDIO)
162    pkg_check_modules(PKG_PULSEAUDIO libpulse-simple)
163    if(PKG_PULSEAUDIO_FOUND)
164      set(HAVE_PULSEAUDIO TRUE)
165      file(GLOB PULSEAUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/pulseaudio/*.c)
166      set(SOURCE_FILES ${SOURCE_FILES} ${PULSEAUDIO_SOURCES})
167      set(SDL_AUDIO_DRIVER_PULSEAUDIO 1)
168      list(APPEND EXTRA_CFLAGS ${PKG_PULSEAUDIO_CFLAGS})
169      if(SDL_PULSEAUDIO_SHARED AND NOT HAVE_SDL_LOADSO)
170        message_warn("You must have SDL_LoadObject() support for dynamic PulseAudio loading")
171      endif()
172      if(SDL_PULSEAUDIO_SHARED AND HAVE_SDL_LOADSO)
173        FindLibraryAndSONAME("pulse-simple")
174        set(SDL_AUDIO_DRIVER_PULSEAUDIO_DYNAMIC "\"${PULSE_SIMPLE_LIB_SONAME}\"")
175        set(HAVE_PULSEAUDIO_SHARED TRUE)
176      else()
177        list(APPEND EXTRA_LDFLAGS ${PKG_sPULSEAUDIO_LDFLAGS})
178      endif()
179      set(HAVE_SDL_AUDIO TRUE)
180    endif()
181  endif()
182endmacro()
183
184# Requires:
185# - PkgCheckModules
186# Optional:
187# - SDL_JACK_SHARED opt
188# - HAVE_SDL_LOADSO opt
189macro(CheckJACK)
190  if(SDL_JACK)
191    pkg_check_modules(PKG_JACK jack)
192    if(PKG_JACK_FOUND)
193      set(HAVE_JACK TRUE)
194      file(GLOB JACK_SOURCES ${SDL2_SOURCE_DIR}/src/audio/jack/*.c)
195      set(SOURCE_FILES ${SOURCE_FILES} ${JACK_SOURCES})
196      set(SDL_AUDIO_DRIVER_JACK 1)
197      list(APPEND EXTRA_CFLAGS ${PKG_JACK_CFLAGS})
198      if(SDL_JACK_SHARED AND NOT HAVE_SDL_LOADSO)
199        message_warn("You must have SDL_LoadObject() support for dynamic JACK audio loading")
200      endif()
201      if(SDL_JACK_SHARED AND HAVE_SDL_LOADSO)
202        FindLibraryAndSONAME("jack")
203        set(SDL_AUDIO_DRIVER_JACK_DYNAMIC "\"${JACK_LIB_SONAME}\"")
204        set(HAVE_JACK_SHARED TRUE)
205      else()
206        list(APPEND EXTRA_LDFLAGS ${PKG_JACK_LDFLAGS})
207      endif()
208      set(HAVE_SDL_AUDIO TRUE)
209    endif()
210  endif()
211endmacro()
212
213# Requires:
214# - PkgCheckModules
215# Optional:
216# - SDL_ESD_SHARED opt
217# - HAVE_SDL_LOADSO opt
218macro(CheckESD)
219  if(SDL_ESD)
220    pkg_check_modules(PKG_ESD esound)
221    if(PKG_ESD_FOUND)
222      set(HAVE_ESD TRUE)
223      file(GLOB ESD_SOURCES ${SDL2_SOURCE_DIR}/src/audio/esd/*.c)
224      set(SOURCE_FILES ${SOURCE_FILES} ${ESD_SOURCES})
225      set(SDL_AUDIO_DRIVER_ESD 1)
226      list(APPEND EXTRA_CFLAGS ${PKG_ESD_CFLAGS})
227      if(SDL_ESD_SHARED AND NOT HAVE_SDL_LOADSO)
228          message_warn("You must have SDL_LoadObject() support for dynamic ESD loading")
229      endif()
230      if(SDL_ESD_SHARED AND HAVE_SDL_LOADSO)
231          FindLibraryAndSONAME(esd)
232          set(SDL_AUDIO_DRIVER_ESD_DYNAMIC "\"${ESD_LIB_SONAME}\"")
233          set(HAVE_ESD_SHARED TRUE)
234      else()
235          list(APPEND EXTRA_LDFLAGS ${PKG_ESD_LDFLAGS})
236      endif()
237      set(HAVE_SDL_AUDIO TRUE)
238    endif()
239  endif()
240endmacro()
241
242# Requires:
243# - n/a
244# Optional:
245# - SDL_ARTS_SHARED opt
246# - HAVE_SDL_LOADSO opt
247macro(CheckARTS)
248  if(SDL_ARTS)
249    find_program(ARTS_CONFIG arts-config)
250    if(ARTS_CONFIG)
251      execute_process(CMD_ARTSCFLAGS ${ARTS_CONFIG} --cflags
252        OUTPUT_VARIABLE ARTS_CFLAGS OUTPUT_STRIP_TRAILING_WHITESPACE)
253      list(APPEND EXTRA_CFLAGS ${ARTS_CFLAGS})
254      execute_process(CMD_ARTSLIBS ${ARTS_CONFIG} --libs
255        OUTPUT_VARIABLE ARTS_LIBS OUTPUT_STRIP_TRAILING_WHITESPACE)
256      file(GLOB ARTS_SOURCES ${SDL2_SOURCE_DIR}/src/audio/arts/*.c)
257      set(SOURCE_FILES ${SOURCE_FILES} ${ARTS_SOURCES})
258      set(SDL_AUDIO_DRIVER_ARTS 1)
259      set(HAVE_ARTS TRUE)
260      if(SDL_ARTS_SHARED AND NOT HAVE_SDL_LOADSO)
261        message_warn("You must have SDL_LoadObject() support for dynamic ARTS loading")
262      endif()
263      if(SDL_ARTS_SHARED AND HAVE_SDL_LOADSO)
264        # TODO
265        FindLibraryAndSONAME(artsc)
266        set(SDL_AUDIO_DRIVER_ARTS_DYNAMIC "\"${ARTSC_LIB_SONAME}\"")
267        set(HAVE_ARTS_SHARED TRUE)
268      else()
269        list(APPEND EXTRA_LDFLAGS ${ARTS_LIBS})
270      endif()
271      set(HAVE_SDL_AUDIO TRUE)
272    endif()
273  endif()
274endmacro()
275
276# Requires:
277# - n/a
278# Optional:
279# - SDL_NAS_SHARED opt
280# - HAVE_SDL_LOADSO opt
281macro(CheckNAS)
282  if(SDL_NAS)
283    # TODO: set include paths properly, so the NAS headers are found
284    check_include_file(audio/audiolib.h HAVE_NAS_H)
285    find_library(D_NAS_LIB audio)
286    if(HAVE_NAS_H AND D_NAS_LIB)
287      set(HAVE_NAS TRUE)
288      file(GLOB NAS_SOURCES ${SDL2_SOURCE_DIR}/src/audio/nas/*.c)
289      set(SOURCE_FILES ${SOURCE_FILES} ${NAS_SOURCES})
290      set(SDL_AUDIO_DRIVER_NAS 1)
291      if(SDL_NAS_SHARED AND NOT HAVE_SDL_LOADSO)
292        message_warn("You must have SDL_LoadObject() support for dynamic NAS loading")
293      endif()
294      if(SDL_NAS_SHARED AND HAVE_SDL_LOADSO)
295        FindLibraryAndSONAME("audio")
296        set(SDL_AUDIO_DRIVER_NAS_DYNAMIC "\"${AUDIO_LIB_SONAME}\"")
297        set(HAVE_NAS_SHARED TRUE)
298      else()
299        list(APPEND EXTRA_LIBS ${D_NAS_LIB})
300      endif()
301      set(HAVE_SDL_AUDIO TRUE)
302    endif()
303  endif()
304endmacro()
305
306# Requires:
307# - n/a
308# Optional:
309# - SDL_SNDIO_SHARED opt
310# - HAVE_SDL_LOADSO opt
311macro(CheckSNDIO)
312  if(SDL_SNDIO)
313    # TODO: set include paths properly, so the sndio headers are found
314    check_include_file(sndio.h HAVE_SNDIO_H)
315    find_library(D_SNDIO_LIB sndio)
316    if(HAVE_SNDIO_H AND D_SNDIO_LIB)
317      set(HAVE_SNDIO TRUE)
318      file(GLOB SNDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/sndio/*.c)
319      set(SOURCE_FILES ${SOURCE_FILES} ${SNDIO_SOURCES})
320      set(SDL_AUDIO_DRIVER_SNDIO 1)
321      if(SDL_SNDIO_SHARED AND NOT HAVE_SDL_LOADSO)
322        message_warn("You must have SDL_LoadObject() support for dynamic sndio loading")
323      endif()
324      if(SDL_SNDIO_SHARED AND HAVE_SDL_LOADSO)
325        FindLibraryAndSONAME("sndio")
326        set(SDL_AUDIO_DRIVER_SNDIO_DYNAMIC "\"${SNDIO_LIB_SONAME}\"")
327        set(HAVE_SNDIO_SHARED TRUE)
328      else()
329        list(APPEND EXTRA_LIBS ${D_SNDIO_LIB})
330      endif()
331      set(HAVE_SDL_AUDIO TRUE)
332    endif()
333  endif()
334endmacro()
335
336# Requires:
337# - PkgCheckModules
338# Optional:
339# - FUSIONSOUND_SHARED opt
340# - HAVE_SDL_LOADSO opt
341macro(CheckFusionSound)
342  if(FUSIONSOUND)
343    pkg_check_modules(PKG_FUSIONSOUND fusionsound>=1.0.0)
344    if(PKG_FUSIONSOUND_FOUND)
345      set(HAVE_FUSIONSOUND TRUE)
346      file(GLOB FUSIONSOUND_SOURCES ${SDL2_SOURCE_DIR}/src/audio/fusionsound/*.c)
347      set(SOURCE_FILES ${SOURCE_FILES} ${FUSIONSOUND_SOURCES})
348      set(SDL_AUDIO_DRIVER_FUSIONSOUND 1)
349      list(APPEND EXTRA_CFLAGS ${PKG_FUSIONSOUND_CFLAGS})
350      if(FUSIONSOUND_SHARED AND NOT HAVE_SDL_LOADSO)
351        message_warn("You must have SDL_LoadObject() support for dynamic FusionSound loading")
352      endif()
353      if(FUSIONSOUND_SHARED AND HAVE_SDL_LOADSO)
354        FindLibraryAndSONAME("fusionsound")
355        set(SDL_AUDIO_DRIVER_FUSIONSOUND_DYNAMIC "\"${FUSIONSOUND_LIB_SONAME}\"")
356        set(HAVE_FUSIONSOUND_SHARED TRUE)
357      else()
358        list(APPEND EXTRA_LDFLAGS ${PKG_FUSIONSOUND_LDFLAGS})
359      endif()
360      set(HAVE_SDL_AUDIO TRUE)
361    endif()
362  endif()
363endmacro()
364
365# Requires:
366# - SDL_LIBSAMPLERATE
367# Optional:
368# - SDL_LIBSAMPLERATE_SHARED opt
369# - HAVE_SDL_LOADSO opt
370macro(CheckLibSampleRate)
371  if(SDL_LIBSAMPLERATE)
372    check_include_file(samplerate.h HAVE_LIBSAMPLERATE_H)
373    if(HAVE_LIBSAMPLERATE_H)
374      set(HAVE_LIBSAMPLERATE TRUE)
375      if(SDL_LIBSAMPLERATE_SHARED AND NOT HAVE_SDL_LOADSO)
376        message_warn("You must have SDL_LoadObject() support for dynamic libsamplerate loading")
377      endif()
378      if(SDL_LIBSAMPLERATE_SHARED AND HAVE_SDL_LOADSO)
379        FindLibraryAndSONAME("samplerate")
380        set(SDL_LIBSAMPLERATE_DYNAMIC "\"${SAMPLERATE_LIB_SONAME}\"")
381        set(HAVE_LIBSAMPLERATE_SHARED TRUE)
382      else()
383        list(APPEND EXTRA_LDFLAGS -lsamplerate)
384      endif()
385    endif()
386  endif()
387endmacro()
388
389# Requires:
390# - n/a
391# Optional:
392# - SDL_X11_SHARED opt
393# - HAVE_SDL_LOADSO opt
394macro(CheckX11)
395  if(SDL_X11)
396    foreach(_LIB X11 Xext Xcursor Xinerama Xi Xfixes Xrandr Xrender Xss Xxf86vm)
397        FindLibraryAndSONAME("${_LIB}")
398    endforeach()
399
400    find_path(X_INCLUDEDIR X11/Xlib.h
401        /usr/pkg/xorg/include
402        /usr/X11R6/include
403        /usr/X11R7/include
404        /usr/local/include/X11
405        /usr/include/X11
406        /usr/openwin/include
407        /usr/openwin/share/include
408        /opt/graphics/OpenGL/include
409        /opt/X11/include
410    )
411
412    if(X_INCLUDEDIR)
413      list(APPEND EXTRA_CFLAGS "-I${X_INCLUDEDIR}")
414      list(APPEND CMAKE_REQUIRED_INCLUDES "${X_INCLUDEDIR}")
415    endif()
416
417    check_include_file(X11/Xcursor/Xcursor.h HAVE_XCURSOR_H)
418    check_include_file(X11/extensions/Xinerama.h HAVE_XINERAMA_H)
419    check_include_file(X11/extensions/XInput2.h HAVE_XINPUT2_H)
420    check_include_file(X11/extensions/Xrandr.h HAVE_XRANDR_H)
421    check_include_file(X11/extensions/Xfixes.h HAVE_XFIXES_H)
422    check_include_file(X11/extensions/Xrender.h HAVE_XRENDER_H)
423    check_include_file(X11/extensions/scrnsaver.h HAVE_XSS_H)
424    check_include_file(X11/extensions/shape.h HAVE_XSHAPE_H)
425    check_include_files("X11/Xlib.h;X11/extensions/Xdbe.h" HAVE_XDBE_H)
426    check_include_files("X11/Xlib.h;X11/extensions/xf86vmode.h" HAVE_XF86VM_H)
427    check_include_files("X11/Xlib.h;X11/Xproto.h;X11/extensions/Xext.h" HAVE_XEXT_H)
428
429    if(X11_LIB)
430      if(NOT HAVE_XEXT_H)
431        message_error("Missing Xext.h, maybe you need to install the libxext-dev package?")
432      endif()
433
434      set(HAVE_X11 TRUE)
435      set(HAVE_SDL_VIDEO TRUE)
436
437      file(GLOB X11_SOURCES ${SDL2_SOURCE_DIR}/src/video/x11/*.c)
438      set(SOURCE_FILES ${SOURCE_FILES} ${X11_SOURCES})
439      set(SDL_VIDEO_DRIVER_X11 1)
440
441      # !!! FIXME: why is this disabled for Apple?
442      if(APPLE)
443        set(SDL_X11_SHARED OFF)
444      endif()
445
446      check_symbol_exists(shmat "sys/shm.h" HAVE_SHMAT)
447      if(NOT HAVE_SHMAT)
448        check_library_exists(ipc shmat "" HAVE_SHMAT)
449        if(HAVE_SHMAT)
450          list(APPEND EXTRA_LIBS ipc)
451        endif()
452        if(NOT HAVE_SHMAT)
453          list(APPEND EXTRA_CFLAGS "-DNO_SHARED_MEMORY")
454        endif()
455      endif()
456
457      if(SDL_X11_SHARED)
458        if(NOT HAVE_SDL_LOADSO)
459          message_warn("You must have SDL_LoadObject() support for dynamic X11 loading")
460          set(HAVE_X11_SHARED FALSE)
461        else()
462          set(HAVE_X11_SHARED TRUE)
463        endif()
464        if(HAVE_X11_SHARED)
465          set(SDL_VIDEO_DRIVER_X11_DYNAMIC "\"${X11_LIB_SONAME}\"")
466          set(SDL_VIDEO_DRIVER_X11_DYNAMIC_XEXT "\"${XEXT_LIB_SONAME}\"")
467        else()
468          list(APPEND EXTRA_LIBS ${X11_LIB} ${XEXT_LIB})
469        endif()
470      endif()
471
472      set(CMAKE_REQUIRED_LIBRARIES ${X11_LIB} ${X11_LIB})
473
474      check_c_source_compiles("
475          #include <X11/Xlib.h>
476          int main(int argc, char **argv) {
477            Display *display;
478            XEvent event;
479            XGenericEventCookie *cookie = &event.xcookie;
480            XNextEvent(display, &event);
481            XGetEventData(display, cookie);
482            XFreeEventData(display, cookie); }" HAVE_XGENERICEVENT)
483      if(HAVE_XGENERICEVENT)
484        set(SDL_VIDEO_DRIVER_X11_SUPPORTS_GENERIC_EVENTS 1)
485      endif()
486
487      check_symbol_exists(XkbKeycodeToKeysym "X11/Xlib.h;X11/XKBlib.h" SDL_VIDEO_DRIVER_X11_HAS_XKBKEYCODETOKEYSYM)
488
489      if(SDL_X11_XCURSOR AND HAVE_XCURSOR_H)
490        set(HAVE_X11_XCURSOR TRUE)
491        if(HAVE_X11_SHARED AND XCURSOR_LIB)
492          set(SDL_VIDEO_DRIVER_X11_DYNAMIC_XCURSOR "\"${XCURSOR_LIB_SONAME}\"")
493        else()
494          list(APPEND EXTRA_LIBS ${XCURSOR_LIB})
495        endif()
496        set(SDL_VIDEO_DRIVER_X11_XCURSOR 1)
497      endif()
498
499      if(SDL_X11_XDBE AND HAVE_XDBE_H)
500        set(HAVE_X11_XDBE TRUE)
501        set(SDL_VIDEO_DRIVER_X11_XDBE 1)
502      endif()
503
504      if(SDL_X11_XINERAMA AND HAVE_XINERAMA_H)
505        set(HAVE_X11_XINERAMA TRUE)
506        if(HAVE_X11_SHARED AND XINERAMA_LIB)
507          set(SDL_VIDEO_DRIVER_X11_DYNAMIC_XINERAMA "\"${XINERAMA_LIB_SONAME}\"")
508        else()
509          list(APPEND EXTRA_LIBS ${XINERAMA_LIB})
510        endif()
511        set(SDL_VIDEO_DRIVER_X11_XINERAMA 1)
512      endif()
513
514      if(SDL_X11_XINPUT AND HAVE_XINPUT2_H)
515        set(HAVE_X11_XINPUT TRUE)
516        if(HAVE_X11_SHARED AND XI_LIB)
517          set(SDL_VIDEO_DRIVER_X11_DYNAMIC_XINPUT2 "\"${XI_LIB_SONAME}\"")
518        else()
519          list(APPEND EXTRA_LIBS ${XI_LIB})
520        endif()
521        set(SDL_VIDEO_DRIVER_X11_XINPUT2 1)
522
523        # Check for multitouch
524        check_c_source_compiles("
525            #include <X11/Xlib.h>
526            #include <X11/Xproto.h>
527            #include <X11/extensions/XInput2.h>
528            int event_type = XI_TouchBegin;
529            XITouchClassInfo *t;
530            Status XIAllowTouchEvents(Display *a,int b,unsigned int c,Window d,int f)
531            {
532              return (Status)0;
533            }
534            int main(int argc, char **argv) {}" HAVE_XINPUT2_MULTITOUCH)
535        if(HAVE_XINPUT2_MULTITOUCH)
536          set(SDL_VIDEO_DRIVER_X11_XINPUT2_SUPPORTS_MULTITOUCH 1)
537        endif()
538      endif()
539
540      # check along with XInput2.h because we use Xfixes with XIBarrierReleasePointer
541      if(SDL_X11_XFIXES AND HAVE_XFIXES_H AND HAVE_XINPUT2_H)
542        if(HAVE_X11_SHARED AND XFIXES_LIB)
543          set(SDL_VIDEO_DRIVER_X11_DYNAMIC_XFIXES "\"${XFIXES_LIB_SONAME}\"")
544        else()
545          list(APPEND EXTRA_LIBS ${XFIXES_LIB})
546        endif()
547        set(SDL_VIDEO_DRIVER_X11_XFIXES 1)
548        set(HAVE_X11_XFIXES TRUE)
549      endif()
550
551      if(SDL_X11_XRANDR AND HAVE_XRANDR_H)
552        if(HAVE_X11_SHARED AND XRANDR_LIB)
553          set(SDL_VIDEO_DRIVER_X11_DYNAMIC_XRANDR "\"${XRANDR_LIB_SONAME}\"")
554        else()
555          list(APPEND EXTRA_LIBS ${XRANDR_LIB})
556        endif()
557        set(SDL_VIDEO_DRIVER_X11_XRANDR 1)
558        set(HAVE_X11_XRANDR TRUE)
559      endif()
560
561      if(SDL_X11_XSCRNSAVER AND HAVE_XSS_H)
562        if(HAVE_X11_SHARED AND XSS_LIB)
563          set(SDL_VIDEO_DRIVER_X11_DYNAMIC_XSS "\"${XSS_LIB_SONAME}\"")
564        else()
565          list(APPEND EXTRA_LIBS ${XSS_LIB})
566        endif()
567        set(SDL_VIDEO_DRIVER_X11_XSCRNSAVER 1)
568        set(HAVE_X11_XSCRNSAVER TRUE)
569      endif()
570
571      if(SDL_X11_XSHAPE AND HAVE_XSHAPE_H)
572        set(SDL_VIDEO_DRIVER_X11_XSHAPE 1)
573        set(HAVE_X11_XSHAPE TRUE)
574      endif()
575
576      if(SDL_X11_XVM AND HAVE_XF86VM_H)
577        if(HAVE_X11_SHARED AND XXF86VM_LIB)
578          set(SDL_VIDEO_DRIVER_X11_DYNAMIC_XVIDMODE "\"${XXF86VM_LIB_SONAME}\"")
579        else()
580          list(APPEND EXTRA_LIBS ${XXF86VM_LIB})
581        endif()
582        set(SDL_VIDEO_DRIVER_X11_XVIDMODE 1)
583        set(HAVE_X11_XVM TRUE)
584      endif()
585
586      set(CMAKE_REQUIRED_LIBRARIES)
587    endif()
588  endif()
589  if(NOT HAVE_X11)
590    # Prevent Mesa from including X11 headers
591    list(APPEND EXTRA_CFLAGS "-DMESA_EGL_NO_X11_HEADERS -DEGL_NO_X11")
592  endif()
593endmacro()
594
595macro(WaylandProtocolGen _SCANNER _CODE_MODE _XML _PROTL)
596    set(_WAYLAND_PROT_C_CODE "${CMAKE_CURRENT_BINARY_DIR}/wayland-generated-protocols/${_PROTL}-protocol.c")
597    set(_WAYLAND_PROT_H_CODE "${CMAKE_CURRENT_BINARY_DIR}/wayland-generated-protocols/${_PROTL}-client-protocol.h")
598
599    add_custom_command(
600        OUTPUT "${_WAYLAND_PROT_H_CODE}"
601        DEPENDS "${_XML}"
602        COMMAND "${_SCANNER}"
603        ARGS client-header "${_XML}" "${_WAYLAND_PROT_H_CODE}"
604    )
605
606    add_custom_command(
607        OUTPUT "${_WAYLAND_PROT_C_CODE}"
608        DEPENDS "${_WAYLAND_PROT_H_CODE}"
609        COMMAND "${_SCANNER}"
610        ARGS "${_CODE_MODE}" "${_XML}" "${_WAYLAND_PROT_C_CODE}"
611    )
612
613    set(SOURCE_FILES ${SOURCE_FILES} "${_WAYLAND_PROT_C_CODE}")
614endmacro()
615
616# Requires:
617# - EGL
618# - PkgCheckModules
619# Optional:
620# - SDL_WAYLAND_SHARED opt
621# - HAVE_SDL_LOADSO opt
622macro(CheckWayland)
623  if(SDL_WAYLAND)
624    pkg_check_modules(WAYLAND wayland-client wayland-egl wayland-cursor egl "xkbcommon>=0.5.0")
625
626    if(WAYLAND_FOUND)
627      find_program(WAYLAND_SCANNER NAMES wayland-scanner REQUIRED)
628      execute_process(
629        COMMAND ${WAYLAND_SCANNER} --version
630        RESULT_VARIABLE WAYLAND_SCANNER_VERSION_RC
631        ERROR_VARIABLE WAYLAND_SCANNER_VERSION
632        ERROR_STRIP_TRAILING_WHITESPACE
633      )
634      if(NOT WAYLAND_SCANNER_VERSION_RC EQUAL 0)
635        message(FATAL "Failed to get wayland-scanner version")
636        set(WAYLAND_FOUND FALSE)
637      endif()
638      string(REPLACE "wayland-scanner " "" WAYLAND_SCANNER_VERSION ${WAYLAND_SCANNER_VERSION})
639
640      string(COMPARE GREATER_EQUAL ${WAYLAND_SCANNER_VERSION} "1.15.0" WAYLAND_SCANNER_1_15_FOUND)
641      if(WAYLAND_SCANNER_1_15_FOUND)
642        set(WAYLAND_SCANNER_CODE_MODE "private-code")
643      else()
644        set(WAYLAND_SCANNER_CODE_MODE "code")
645      endif()
646    endif()
647
648    if(WAYLAND_FOUND)
649      target_link_directories(sdl-build-options INTERFACE "${WAYLAND_LIBRARY_DIRS}")
650      target_include_directories(sdl-build-options INTERFACE "${WAYLAND_INCLUDE_DIRS}")
651
652      set(HAVE_WAYLAND TRUE)
653      set(HAVE_SDL_VIDEO TRUE)
654
655      file(GLOB WAYLAND_SOURCES ${SDL2_SOURCE_DIR}/src/video/wayland/*.c)
656      set(SOURCE_FILES ${SOURCE_FILES} ${WAYLAND_SOURCES})
657
658      # We have to generate some protocol interface code for some unstable Wayland features.
659      file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/wayland-generated-protocols")
660      target_include_directories(sdl-build-options INTERFACE "${CMAKE_CURRENT_BINARY_DIR}/wayland-generated-protocols")
661
662      file(GLOB WAYLAND_PROTOCOLS_XML RELATIVE "${SDL2_SOURCE_DIR}/wayland-protocols/" "${SDL2_SOURCE_DIR}/wayland-protocols/*.xml")
663      foreach(_XML ${WAYLAND_PROTOCOLS_XML})
664        string(REGEX REPLACE "\\.xml$" "" _PROTL "${_XML}")
665        WaylandProtocolGen("${WAYLAND_SCANNER}" "${WAYLAND_SCANNER_CODE_MODE}" "${SDL2_SOURCE_DIR}/wayland-protocols/${_XML}" "${_PROTL}")
666      endforeach()
667
668      if(SDL_WAYLAND_QT_TOUCH)
669          set(HAVE_WAYLAND_QT_TOUCH TRUE)
670          set(SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH 1)
671      endif()
672
673      if(SDL_WAYLAND_SHARED AND NOT HAVE_SDL_LOADSO)
674        message_warn("You must have SDL_LoadObject() support for dynamic Wayland loading")
675      endif()
676      if(SDL_WAYLAND_SHARED AND HAVE_SDL_LOADSO)
677        FindLibraryAndSONAME(wayland-client)
678        FindLibraryAndSONAME(wayland-egl)
679        FindLibraryAndSONAME(wayland-cursor)
680        FindLibraryAndSONAME(xkbcommon)
681        set(SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC "\"${WAYLAND_CLIENT_LIB_SONAME}\"")
682        set(SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_EGL "\"${WAYLAND_EGL_LIB_SONAME}\"")
683        set(SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_CURSOR "\"${WAYLAND_CURSOR_LIB_SONAME}\"")
684        set(SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_XKBCOMMON "\"${XKBCOMMON_LIB_SONAME}\"")
685        set(HAVE_WAYLAND_SHARED TRUE)
686      else()
687        set(EXTRA_LIBS ${WAYLAND_LIBRARIES} ${EXTRA_LIBS})
688      endif()
689
690      if(SDL_WAYLAND_LIBDECOR)
691        pkg_check_modules(LIBDECOR libdecor-0)
692        if(LIBDECOR_FOUND)
693            set(HAVE_WAYLAND_LIBDECOR TRUE)
694            set(HAVE_LIBDECOR_H 1)
695            target_link_directories(sdl-build-options INTERFACE "${LIBDECOR_LIBRARY_DIRS}")
696            target_include_directories(sdl-build-options INTERFACE "${LIBDECOR_INCLUDE_DIRS}")
697            if(SDL_WAYLAND_LIBDECOR_SHARED AND NOT HAVE_SDL_LOADSO)
698                message_warn("You must have SDL_LoadObject() support for dynamic libdecor loading")
699            endif()
700            if(SDL_WAYLAND_LIBDECOR_SHARED AND HAVE_SDL_LOADSO)
701                set(HAVE_LIBDECOR_SHARED TRUE)
702                FindLibraryAndSONAME(decor-0)
703                set(SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_LIBDECOR "\"${DECOR_0_LIB_SONAME}\"")
704            else()
705              set(EXTRA_LIBS ${LIBDECOR_LIBRARIES} ${EXTRA_LIBS})
706            endif()
707        endif()
708      endif()
709
710      set(SDL_VIDEO_DRIVER_WAYLAND 1)
711    endif()
712  endif()
713endmacro()
714
715# Requires:
716# - n/a
717#
718macro(CheckCOCOA)
719  if(SDL_COCOA)
720    if(APPLE) # Apple always has Cocoa.
721      set(HAVE_COCOA TRUE)
722    endif()
723    if(HAVE_COCOA)
724      file(GLOB COCOA_SOURCES ${SDL2_SOURCE_DIR}/src/video/cocoa/*.m)
725      set_source_files_properties(${COCOA_SOURCES} PROPERTIES LANGUAGE C)
726      set(SOURCE_FILES ${SOURCE_FILES} ${COCOA_SOURCES})
727      set(SDL_VIDEO_DRIVER_COCOA 1)
728      set(HAVE_SDL_VIDEO TRUE)
729    endif()
730  endif()
731endmacro()
732
733# Requires:
734# - PkgCheckModules
735# Optional:
736# - DIRECTFB_SHARED opt
737# - HAVE_SDL_LOADSO opt
738macro(CheckDirectFB)
739  if(SDL_DIRECTFB)
740    pkg_check_modules(PKG_DIRECTFB directfb>=1.0.0)
741    if(PKG_DIRECTFB_FOUND)
742      set(HAVE_DIRECTFB TRUE)
743      file(GLOB DIRECTFB_SOURCES ${SDL2_SOURCE_DIR}/src/video/directfb/*.c)
744      set(SOURCE_FILES ${SOURCE_FILES} ${DIRECTFB_SOURCES})
745      set(SDL_VIDEO_DRIVER_DIRECTFB 1)
746      set(SDL_VIDEO_RENDER_DIRECTFB 1)
747      list(APPEND EXTRA_CFLAGS ${PKG_DIRECTFB_CFLAGS})
748      if(SDL_DIRECTFB_SHARED AND NOT HAVE_SDL_LOADSO)
749        message_warn("You must have SDL_LoadObject() support for dynamic DirectFB loading")
750      endif()
751      if(SDL_DIRECTFB_SHARED AND HAVE_SDL_LOADSO)
752        FindLibraryAndSONAME("directfb")
753        set(SDL_VIDEO_DRIVER_DIRECTFB_DYNAMIC "\"${DIRECTFB_LIB_SONAME}\"")
754        set(HAVE_DIRECTFB_SHARED TRUE)
755      else()
756        list(APPEND EXTRA_LDFLAGS ${PKG_DIRECTFB_LDFLAGS})
757      endif()
758      set(HAVE_SDL_VIDEO TRUE)
759    endif()
760  endif()
761endmacro()
762
763# Requires:
764# - n/a
765macro(CheckVivante)
766  if(SDL_VIVANTE)
767    check_c_source_compiles("
768        #include <gc_vdk.h>
769        int main(int argc, char** argv) {}" HAVE_VIVANTE_VDK)
770    check_c_source_compiles("
771        #define LINUX
772        #define EGL_API_FB
773        #include <EGL/eglvivante.h>
774        int main(int argc, char** argv) {}" HAVE_VIVANTE_EGL_FB)
775    if(HAVE_VIVANTE_VDK OR HAVE_VIVANTE_EGL_FB)
776      set(HAVE_VIVANTE TRUE)
777      set(HAVE_SDL_VIDEO TRUE)
778
779      file(GLOB VIVANTE_SOURCES ${SDL2_SOURCE_DIR}/src/video/vivante/*.c)
780      set(SOURCE_FILES ${SOURCE_FILES} ${VIVANTE_SOURCES})
781      set(SDL_VIDEO_DRIVER_VIVANTE 1)
782      if(HAVE_VIVANTE_VDK)
783        set(SDL_VIDEO_DRIVER_VIVANTE_VDK 1)
784        list(APPEND EXTRA_LIBS VDK VIVANTE)
785      else()
786        set(SDL_CFLAGS "${SDL_CFLAGS} -DLINUX -DEGL_API_FB")
787        list(APPEND EXTRA_LIBS EGL)
788      endif(HAVE_VIVANTE_VDK)
789    endif()
790  endif()
791endmacro()
792
793# Requires:
794# - nada
795macro(CheckGLX)
796  if(SDL_OPENGL)
797    check_c_source_compiles("
798        #include <GL/glx.h>
799        int main(int argc, char** argv) {}" HAVE_OPENGL_GLX)
800    if(HAVE_OPENGL_GLX)
801      set(SDL_VIDEO_OPENGL_GLX 1)
802    endif()
803  endif()
804endmacro()
805
806# Requires:
807# - PkgCheckModules
808macro(CheckEGL)
809  if (SDL_OPENGL OR SDL_OPENGLES)
810    pkg_check_modules(EGL egl)
811    string(REPLACE "-D_THREAD_SAFE;" "-D_THREAD_SAFE=1;" EGL_CFLAGS "${EGL_CFLAGS}")
812    set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} ${EGL_CFLAGS}")
813    check_c_source_compiles("
814        #define EGL_API_FB
815        #define MESA_EGL_NO_X11_HEADERS
816        #define EGL_NO_X11
817        #include <EGL/egl.h>
818        #include <EGL/eglext.h>
819        int main (int argc, char** argv) {}" HAVE_OPENGL_EGL)
820    if(HAVE_OPENGL_EGL)
821      set(SDL_VIDEO_OPENGL_EGL 1)
822    endif()
823  endif()
824endmacro()
825
826# Requires:
827# - nada
828macro(CheckOpenGL)
829  if(SDL_OPENGL)
830    check_c_source_compiles("
831        #include <GL/gl.h>
832        #include <GL/glext.h>
833        int main(int argc, char** argv) {}" HAVE_OPENGL)
834    if(HAVE_OPENGL)
835      set(SDL_VIDEO_OPENGL 1)
836      set(SDL_VIDEO_RENDER_OGL 1)
837    endif()
838  endif()
839endmacro()
840
841# Requires:
842# - nada
843macro(CheckOpenGLES)
844  if(SDL_OPENGLES)
845    check_c_source_compiles("
846        #include <GLES/gl.h>
847        #include <GLES/glext.h>
848        int main (int argc, char** argv) {}" HAVE_OPENGLES_V1)
849    if(HAVE_OPENGLES_V1)
850        set(HAVE_OPENGLES TRUE)
851        set(SDL_VIDEO_OPENGL_ES 1)
852        set(SDL_VIDEO_RENDER_OGL_ES 1)
853    endif()
854    check_c_source_compiles("
855        #include <GLES2/gl2.h>
856        #include <GLES2/gl2ext.h>
857        int main (int argc, char** argv) {}" HAVE_OPENGLES_V2)
858    if(HAVE_OPENGLES_V2)
859        set(HAVE_OPENGLES TRUE)
860        set(SDL_VIDEO_OPENGL_ES2 1)
861        set(SDL_VIDEO_RENDER_OGL_ES2 1)
862    endif()
863  endif()
864endmacro()
865
866# Requires:
867# - nada
868# Optional:
869# - THREADS opt
870# Sets:
871# PTHREAD_CFLAGS
872# PTHREAD_LIBS
873macro(CheckPTHREAD)
874  if(SDL_THREADS AND SDL_PTHREADS)
875    if(ANDROID)
876      # the android libc provides built-in support for pthreads, so no
877      # additional linking or compile flags are necessary
878    elseif(LINUX)
879      set(PTHREAD_CFLAGS "-D_REENTRANT")
880      set(PTHREAD_LDFLAGS "-pthread")
881    elseif(BSDI)
882      set(PTHREAD_CFLAGS "-D_REENTRANT -D_THREAD_SAFE")
883      set(PTHREAD_LDFLAGS "")
884    elseif(DARWIN)
885      set(PTHREAD_CFLAGS "-D_THREAD_SAFE")
886      # causes Carbon.p complaints?
887      # set(PTHREAD_CFLAGS "-D_REENTRANT -D_THREAD_SAFE")
888      set(PTHREAD_LDFLAGS "")
889    elseif(FREEBSD)
890      set(PTHREAD_CFLAGS "-D_REENTRANT -D_THREAD_SAFE")
891      set(PTHREAD_LDFLAGS "-pthread")
892    elseif(NETBSD)
893      set(PTHREAD_CFLAGS "-D_REENTRANT -D_THREAD_SAFE")
894      set(PTHREAD_LDFLAGS "-lpthread")
895    elseif(OPENBSD)
896      set(PTHREAD_CFLAGS "-D_REENTRANT")
897      set(PTHREAD_LDFLAGS "-pthread")
898    elseif(SOLARIS)
899      set(PTHREAD_CFLAGS "-D_REENTRANT")
900      set(PTHREAD_LDFLAGS "-pthread -lposix4")
901    elseif(SYSV5)
902      set(PTHREAD_CFLAGS "-D_REENTRANT -Kthread")
903      set(PTHREAD_LDFLAGS "")
904    elseif(AIX)
905      set(PTHREAD_CFLAGS "-D_REENTRANT -mthreads")
906      set(PTHREAD_LDFLAGS "-pthread")
907    elseif(HPUX)
908      set(PTHREAD_CFLAGS "-D_REENTRANT")
909      set(PTHREAD_LDFLAGS "-L/usr/lib -pthread")
910    elseif(HAIKU)
911      set(PTHREAD_CFLAGS "-D_REENTRANT")
912      set(PTHREAD_LDFLAGS "")
913    elseif(EMSCRIPTEN)
914      set(PTHREAD_CFLAGS "-D_REENTRANT -pthread")
915      set(PTHREAD_LDFLAGS "-pthread")
916    else()
917      set(PTHREAD_CFLAGS "-D_REENTRANT")
918      set(PTHREAD_LDFLAGS "-lpthread")
919    endif()
920
921    # Run some tests
922    set(ORIG_CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}")
923    set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} ${PTHREAD_CFLAGS} ${PTHREAD_LDFLAGS}")
924    check_c_source_compiles("
925      #include <pthread.h>
926      int main(int argc, char** argv) {
927        pthread_attr_t type;
928        pthread_attr_init(&type);
929        return 0;
930      }" HAVE_PTHREADS)
931    if(HAVE_PTHREADS)
932      set(SDL_THREAD_PTHREAD 1)
933      list(APPEND EXTRA_CFLAGS ${PTHREAD_CFLAGS})
934      list(APPEND EXTRA_LDFLAGS ${PTHREAD_LDFLAGS})
935      set(SDL_CFLAGS "${SDL_CFLAGS} ${PTHREAD_CFLAGS}")
936      list(APPEND SDL_LIBS ${PTHREAD_LDFLAGS})
937
938      check_c_source_compiles("
939        #define _GNU_SOURCE 1
940        #include <pthread.h>
941        int main(int argc, char **argv) {
942          pthread_mutexattr_t attr;
943          pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
944          return 0;
945        }" HAVE_RECURSIVE_MUTEXES)
946      if(HAVE_RECURSIVE_MUTEXES)
947        set(SDL_THREAD_PTHREAD_RECURSIVE_MUTEX 1)
948      else()
949        check_c_source_compiles("
950            #define _GNU_SOURCE 1
951            #include <pthread.h>
952            int main(int argc, char **argv) {
953              pthread_mutexattr_t attr;
954              pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE_NP);
955              return 0;
956            }" HAVE_RECURSIVE_MUTEXES_NP)
957        if(HAVE_RECURSIVE_MUTEXES_NP)
958          set(SDL_THREAD_PTHREAD_RECURSIVE_MUTEX_NP 1)
959        endif()
960      endif()
961
962      if(SDL_PTHREADS_SEM)
963        check_c_source_compiles("#include <pthread.h>
964                                 #include <semaphore.h>
965                                 int main(int argc, char **argv) { return 0; }" HAVE_PTHREADS_SEM)
966        if(HAVE_PTHREADS_SEM)
967          check_c_source_compiles("
968              #include <pthread.h>
969              #include <semaphore.h>
970              int main(int argc, char **argv) {
971                  sem_timedwait(NULL, NULL);
972                  return 0;
973              }" HAVE_SEM_TIMEDWAIT)
974        endif()
975      endif()
976
977      check_include_files("pthread.h" HAVE_PTHREAD_H)
978      check_include_files("pthread_np.h" HAVE_PTHREAD_NP_H)
979      if (HAVE_PTHREAD_H)
980        check_c_source_compiles("
981            #define _GNU_SOURCE 1
982            #include <pthread.h>
983            int main(int argc, char **argv) {
984              pthread_setname_np(pthread_self(), \"\");
985              return 0;
986            }" HAVE_PTHREAD_SETNAME_NP)
987        if (HAVE_PTHREAD_NP_H)
988          check_symbol_exists(pthread_set_name_np "pthread.h;pthread_np.h" HAVE_PTHREAD_SET_NAME_NP)
989        endif()
990      endif()
991
992      set(SOURCE_FILES ${SOURCE_FILES}
993          ${SDL2_SOURCE_DIR}/src/thread/pthread/SDL_systhread.c
994          ${SDL2_SOURCE_DIR}/src/thread/pthread/SDL_sysmutex.c   # Can be faked, if necessary
995          ${SDL2_SOURCE_DIR}/src/thread/pthread/SDL_syscond.c    # Can be faked, if necessary
996          ${SDL2_SOURCE_DIR}/src/thread/pthread/SDL_systls.c
997          )
998      if(HAVE_PTHREADS_SEM)
999        set(SOURCE_FILES ${SOURCE_FILES}
1000            ${SDL2_SOURCE_DIR}/src/thread/pthread/SDL_syssem.c)
1001      else()
1002        set(SOURCE_FILES ${SOURCE_FILES}
1003            ${SDL2_SOURCE_DIR}/src/thread/generic/SDL_syssem.c)
1004      endif()
1005      set(HAVE_SDL_THREADS TRUE)
1006    endif()
1007    set(CMAKE_REQUIRED_FLAGS "${ORIG_CMAKE_REQUIRED_FLAGS}")
1008  endif()
1009endmacro()
1010
1011# Requires
1012# - nada
1013# Optional:
1014# Sets:
1015# USB_LIBS
1016# USB_CFLAGS
1017macro(CheckUSBHID)
1018  check_library_exists(usbhid hid_init "" LIBUSBHID)
1019  if(LIBUSBHID)
1020    check_include_file(usbhid.h HAVE_USBHID_H)
1021    if(HAVE_USBHID_H)
1022      set(USB_CFLAGS "-DHAVE_USBHID_H")
1023    endif()
1024
1025    check_include_file(libusbhid.h HAVE_LIBUSBHID_H)
1026    if(HAVE_LIBUSBHID_H)
1027      set(USB_CFLAGS "${USB_CFLAGS} -DHAVE_LIBUSBHID_H")
1028    endif()
1029    set(USB_LIBS ${USB_LIBS} usbhid)
1030  else()
1031    check_include_file(usb.h HAVE_USB_H)
1032    if(HAVE_USB_H)
1033      set(USB_CFLAGS "-DHAVE_USB_H")
1034    endif()
1035    check_include_file(libusb.h HAVE_LIBUSB_H)
1036    if(HAVE_LIBUSB_H)
1037      set(USB_CFLAGS "${USB_CFLAGS} -DHAVE_LIBUSB_H")
1038    endif()
1039    check_library_exists(usb hid_init "" LIBUSB)
1040    if(LIBUSB)
1041      set(USB_LIBS ${USB_LIBS} usb)
1042    endif()
1043  endif()
1044
1045  set(ORIG_CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}")
1046  set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} ${USB_CFLAGS}")
1047  set(CMAKE_REQUIRED_LIBRARIES "${USB_LIBS}")
1048  check_c_source_compiles("
1049       #include <sys/types.h>
1050        #if defined(HAVE_USB_H)
1051        #include <usb.h>
1052        #endif
1053        #ifdef __DragonFly__
1054        # include <bus/u4b/usb.h>
1055        # include <bus/u4b/usbhid.h>
1056        #else
1057        # include <dev/usb/usb.h>
1058        # include <dev/usb/usbhid.h>
1059        #endif
1060        #if defined(HAVE_USBHID_H)
1061        #include <usbhid.h>
1062        #elif defined(HAVE_LIBUSB_H)
1063        #include <libusb.h>
1064        #elif defined(HAVE_LIBUSBHID_H)
1065        #include <libusbhid.h>
1066        #endif
1067        int main(int argc, char **argv) {
1068          struct report_desc *repdesc;
1069          struct usb_ctl_report *repbuf;
1070          hid_kind_t hidkind;
1071          return 0;
1072        }" HAVE_USBHID)
1073  if(HAVE_USBHID)
1074    check_c_source_compiles("
1075          #include <sys/types.h>
1076          #if defined(HAVE_USB_H)
1077          #include <usb.h>
1078          #endif
1079          #ifdef __DragonFly__
1080          # include <bus/u4b/usb.h>
1081          # include <bus/u4b/usbhid.h>
1082          #else
1083          # include <dev/usb/usb.h>
1084          # include <dev/usb/usbhid.h>
1085          #endif
1086          #if defined(HAVE_USBHID_H)
1087          #include <usbhid.h>
1088          #elif defined(HAVE_LIBUSB_H)
1089          #include <libusb.h>
1090          #elif defined(HAVE_LIBUSBHID_H)
1091          #include <libusbhid.h>
1092          #endif
1093          int main(int argc, char** argv) {
1094            struct usb_ctl_report buf;
1095            if (buf.ucr_data) { }
1096            return 0;
1097          }" HAVE_USBHID_UCR_DATA)
1098    if(HAVE_USBHID_UCR_DATA)
1099      set(USB_CFLAGS "${USB_CFLAGS} -DUSBHID_UCR_DATA")
1100    endif()
1101
1102    check_c_source_compiles("
1103          #include <sys/types.h>
1104          #if defined(HAVE_USB_H)
1105          #include <usb.h>
1106          #endif
1107          #ifdef __DragonFly__
1108          #include <bus/u4b/usb.h>
1109          #include <bus/u4b/usbhid.h>
1110          #else
1111          #include <dev/usb/usb.h>
1112          #include <dev/usb/usbhid.h>
1113          #endif
1114          #if defined(HAVE_USBHID_H)
1115          #include <usbhid.h>
1116          #elif defined(HAVE_LIBUSB_H)
1117          #include <libusb.h>
1118          #elif defined(HAVE_LIBUSBHID_H)
1119          #include <libusbhid.h>
1120          #endif
1121          int main(int argc, char **argv) {
1122            report_desc_t d;
1123            hid_start_parse(d, 1, 1);
1124            return 0;
1125          }" HAVE_USBHID_NEW)
1126    if(HAVE_USBHID_NEW)
1127      set(USB_CFLAGS "${USB_CFLAGS} -DUSBHID_NEW")
1128    endif()
1129
1130    check_c_source_compiles("
1131        #include <machine/joystick.h>
1132        int main(int argc, char** argv) {
1133            struct joystick t;
1134            return 0;
1135        }" HAVE_MACHINE_JOYSTICK)
1136    if(HAVE_MACHINE_JOYSTICK)
1137      set(SDL_HAVE_MACHINE_JOYSTICK_H 1)
1138    endif()
1139    set(SDL_JOYSTICK_USBHID 1)
1140    file(GLOB BSD_JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/bsd/*.c)
1141    set(SOURCE_FILES ${SOURCE_FILES} ${BSD_JOYSTICK_SOURCES})
1142    list(APPEND EXTRA_CFLAGS ${USB_CFLAGS})
1143    list(APPEND EXTRA_LIBS ${USB_LIBS})
1144    set(HAVE_SDL_JOYSTICK TRUE)
1145
1146    set(CMAKE_REQUIRED_LIBRARIES)
1147    set(CMAKE_REQUIRED_FLAGS "${ORIG_CMAKE_REQUIRED_FLAGS}")
1148  endif()
1149endmacro()
1150
1151# Check for HIDAPI support
1152macro(CheckHIDAPI)
1153  set(HAVE_HIDAPI TRUE)
1154  if(NOT HIDAPI_SKIP_LIBUSB)
1155    set(HAVE_LIBUSB FALSE)
1156    pkg_check_modules(LIBUSB libusb-1.0)
1157    if (LIBUSB_FOUND)
1158      check_include_file(libusb.h HAVE_LIBUSB_H ${LIBUSB_CFLAGS})
1159      if(HAVE_LIBUSB_H)
1160        set(HAVE_LIBUSB TRUE)
1161        set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${LIBUSB_CFLAGS}")
1162        if(HIDAPI_ONLY_LIBUSB)
1163          list(APPEND EXTRA_LIBS ${LIBUSB_LIBS})
1164        else()
1165          # libusb is loaded dynamically, so don't add it to EXTRA_LIBS
1166          FindLibraryAndSONAME("usb-1.0")
1167          set(SDL_LIBUSB_DYNAMIC "\"${USB_LIB_SONAME}\"")
1168        endif()
1169      endif()
1170    endif()
1171    if(HIDAPI_ONLY_LIBUSB AND NOT HAVE_LIBUSB)
1172      set(HAVE_HIDAPI FALSE)
1173    endif()
1174  endif()
1175
1176  if(HAVE_HIDAPI)
1177    if(ANDROID)
1178      set(SOURCE_FILES ${SOURCE_FILES} ${SDL2_SOURCE_DIR}/src/hidapi/android/hid.cpp)
1179    endif()
1180    if(IOS OR TVOS)
1181      set(SOURCE_FILES ${SOURCE_FILES} ${SDL2_SOURCE_DIR}/src/hidapi/ios/hid.m)
1182      set(SDL_FRAMEWORK_COREBLUETOOTH 1)
1183    endif()
1184    set(HAVE_SDL_HIDAPI TRUE)
1185
1186    if(SDL_JOYSTICK AND SDL_HIDAPI_JOYSTICK)
1187      set(SDL_JOYSTICK_HIDAPI 1)
1188      set(HAVE_SDL_JOYSTICK TRUE)
1189      set(HAVE_HIDAPI_JOYSTICK TRUE)
1190      file(GLOB HIDAPI_JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/hidapi/*.c)
1191      set(SOURCE_FILES ${SOURCE_FILES} ${HIDAPI_JOYSTICK_SOURCES})
1192    endif()
1193  endif()
1194endmacro()
1195
1196# Requires:
1197# - n/a
1198macro(CheckRPI)
1199  if(SDL_RPI)
1200    pkg_check_modules(VIDEO_RPI bcm_host brcmegl)
1201    if (NOT VIDEO_RPI_FOUND)
1202      set(VIDEO_RPI_INCLUDE_DIRS "/opt/vc/include" "/opt/vc/include/interface/vcos/pthreads" "/opt/vc/include/interface/vmcs_host/linux/" )
1203      set(VIDEO_RPI_LIBRARY_DIRS "/opt/vc/lib" )
1204      set(VIDEO_RPI_LIBRARIES bcm_host )
1205      set(VIDEO_RPI_LDFLAGS "-Wl,-rpath,/opt/vc/lib")
1206    endif()
1207    listtostr(VIDEO_RPI_INCLUDE_DIRS VIDEO_RPI_INCLUDE_FLAGS "-I")
1208    listtostr(VIDEO_RPI_LIBRARY_DIRS VIDEO_RPI_LIBRARY_FLAGS "-L")
1209
1210    set(ORIG_CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}")
1211    set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} ${VIDEO_RPI_INCLUDE_FLAGS} ${VIDEO_RPI_LIBRARY_FLAGS}")
1212    set(CMAKE_REQUIRED_LIBRARIES "${VIDEO_RPI_LIBRARIES}")
1213    check_c_source_compiles("
1214        #include <bcm_host.h>
1215        int main(int argc, char **argv) {}" HAVE_RPI)
1216    set(CMAKE_REQUIRED_FLAGS "${ORIG_CMAKE_REQUIRED_FLAGS}")
1217    set(CMAKE_REQUIRED_LIBRARIES)
1218
1219    if(SDL_VIDEO AND HAVE_RPI)
1220      set(HAVE_SDL_VIDEO TRUE)
1221      set(SDL_VIDEO_DRIVER_RPI 1)
1222      file(GLOB VIDEO_RPI_SOURCES ${SDL2_SOURCE_DIR}/src/video/raspberry/*.c)
1223      set(SOURCE_FILES ${SOURCE_FILES} ${VIDEO_RPI_SOURCES})
1224      list(APPEND EXTRA_LIBS ${VIDEO_RPI_LIBRARIES})
1225      # !!! FIXME: shouldn't be using CMAKE_C_FLAGS, right?
1226      set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${VIDEO_RPI_INCLUDE_FLAGS} ${VIDEO_RPI_LIBRARY_FLAGS}")
1227      list(APPEND EXTRA_LDFLAGS ${VIDEO_RPI_LDFLAGS})
1228    endif()
1229  endif()
1230endmacro()
1231
1232# Requires:
1233# - EGL
1234# - PkgCheckModules
1235# Optional:
1236# - SDL_KMSDRM_SHARED opt
1237# - HAVE_SDL_LOADSO opt
1238macro(CheckKMSDRM)
1239  if(SDL_KMSDRM)
1240    pkg_check_modules(KMSDRM libdrm gbm egl)
1241    if(KMSDRM_FOUND AND HAVE_OPENGL_EGL)
1242      link_directories(
1243        ${KMSDRM_LIBRARY_DIRS}
1244      )
1245      target_include_directories(sdl-build-options INTERFACE "${KMSDRM_INCLUDE_DIRS}")
1246      set(HAVE_KMSDRM TRUE)
1247      set(HAVE_SDL_VIDEO TRUE)
1248
1249      file(GLOB KMSDRM_SOURCES ${SDL2_SOURCE_DIR}/src/video/kmsdrm/*.c)
1250      set(SOURCE_FILES ${SOURCE_FILES} ${KMSDRM_SOURCES})
1251
1252      list(APPEND EXTRA_CFLAGS ${KMSDRM_CFLAGS})
1253
1254      set(SDL_VIDEO_DRIVER_KMSDRM 1)
1255
1256      if(SDL_KMSDRM_SHARED AND NOT HAVE_SDL_LOADSO)
1257        message_warn("You must have SDL_LoadObject() support for dynamic KMS/DRM loading")
1258      endif()
1259      if(SDL_KMSDRM_SHARED AND HAVE_SDL_LOADSO)
1260        FindLibraryAndSONAME(drm)
1261        FindLibraryAndSONAME(gbm)
1262        set(SDL_VIDEO_DRIVER_KMSDRM_DYNAMIC "\"${DRM_LIB_SONAME}\"")
1263        set(SDL_VIDEO_DRIVER_KMSDRM_DYNAMIC_GBM "\"${GBM_LIB_SONAME}\"")
1264        set(HAVE_KMSDRM_SHARED TRUE)
1265      else()
1266        set(EXTRA_LIBS ${KMSDRM_LIBRARIES} ${EXTRA_LIBS})
1267      endif()
1268    endif()
1269  endif()
1270endmacro()
1271