[SDL Tizen] Add vulkan feature to SDL.
[platform/upstream/SDL.git] / cmake / sdlchecks.cmake
1 macro(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()
30 endmacro()
31
32 macro(CheckDLOPEN)
33   check_function_exists(dlopen HAVE_DLOPEN)
34   if(NOT HAVE_DLOPEN)
35     foreach(_LIBNAME dl tdl)
36       check_library_exists("${_LIBNAME}" "dlopen" "" DLOPEN_LIB)
37       if(DLOPEN_LIB)
38         list(APPEND EXTRA_LIBS ${_LIBNAME})
39         set(_DLLIB ${_LIBNAME})
40         set(HAVE_DLOPEN TRUE)
41         break()
42       endif()
43     endforeach()
44   endif()
45
46   if(HAVE_DLOPEN)
47     if(_DLLIB)
48       set(CMAKE_REQUIRED_LIBRARIES ${_DLLIB})
49     endif()
50     check_c_source_compiles("
51        #include <dlfcn.h>
52        int main(int argc, char **argv) {
53          void *handle = dlopen(\"\", RTLD_NOW);
54          const char *loaderror = (char *) dlerror();
55        }" HAVE_DLOPEN)
56     set(CMAKE_REQUIRED_LIBRARIES)
57   endif()
58
59   if (HAVE_DLOPEN)
60     set(SDL_LOADSO_DLOPEN 1)
61     set(HAVE_SDL_DLOPEN TRUE)
62     file(GLOB DLOPEN_SOURCES ${SDL2_SOURCE_DIR}/src/loadso/dlopen/*.c)
63     set(SOURCE_FILES ${SOURCE_FILES} ${DLOPEN_SOURCES})
64     set(HAVE_SDL_LOADSO TRUE)
65   endif()
66 endmacro()
67
68 # Requires:
69 # - n/a
70 macro(CheckOSS)
71   if(OSS)
72     set(OSS_HEADER_FILE "sys/soundcard.h")
73     check_c_source_compiles("
74         #include <sys/soundcard.h>
75         int main() { int arg = SNDCTL_DSP_SETFRAGMENT; }" OSS_FOUND)
76     if(NOT OSS_FOUND)
77       set(OSS_HEADER_FILE "soundcard.h")
78       check_c_source_compiles("
79           #include <soundcard.h>
80           int main() { int arg = SNDCTL_DSP_SETFRAGMENT; }" OSS_FOUND)
81     endif()
82
83     if(OSS_FOUND)
84       set(HAVE_OSS TRUE)
85       file(GLOB OSS_SOURCES ${SDL2_SOURCE_DIR}/src/audio/dsp/*.c)
86       if(OSS_HEADER_FILE STREQUAL "soundcard.h")
87         set(SDL_AUDIO_DRIVER_OSS_SOUNDCARD_H 1)
88       endif()
89       set(SDL_AUDIO_DRIVER_OSS 1)
90       set(SOURCE_FILES ${SOURCE_FILES} ${OSS_SOURCES})
91       if(NETBSD OR OPENBSD)
92         list(APPEND EXTRA_LIBS ossaudio)
93       endif()
94       set(HAVE_SDL_AUDIO TRUE)
95     endif()
96   endif()
97 endmacro()
98
99 # Requires:
100 # - n/a
101 # Optional:
102 # - ALSA_SHARED opt
103 # - HAVE_DLOPEN opt
104 macro(CheckALSA)
105   if(ALSA)
106     CHECK_INCLUDE_FILE(alsa/asoundlib.h HAVE_ASOUNDLIB_H)
107     if(HAVE_ASOUNDLIB_H)
108       CHECK_LIBRARY_EXISTS(asound snd_pcm_open "" HAVE_LIBASOUND)
109       set(HAVE_ALSA TRUE)
110       file(GLOB ALSA_SOURCES ${SDL2_SOURCE_DIR}/src/audio/alsa/*.c)
111       set(SOURCE_FILES ${SOURCE_FILES} ${ALSA_SOURCES})
112       set(SDL_AUDIO_DRIVER_ALSA 1)
113       if(ALSA_SHARED)
114         if(NOT HAVE_DLOPEN)
115           message_warn("You must have SDL_LoadObject() support for dynamic ALSA loading")
116         else()
117           FindLibraryAndSONAME("asound")
118           set(SDL_AUDIO_DRIVER_ALSA_DYNAMIC "\"${ASOUND_LIB_SONAME}\"")
119           set(HAVE_ALSA_SHARED TRUE)
120         endif()
121       else()
122         list(APPEND EXTRA_LIBS asound)
123       endif()
124       set(HAVE_SDL_AUDIO TRUE)
125     endif()
126   endif()
127 endmacro()
128
129 # Requires:
130 # - PkgCheckModules
131 # Optional:
132 # - PULSEAUDIO_SHARED opt
133 # - HAVE_DLOPEN opt
134 macro(CheckPulseAudio)
135   if(PULSEAUDIO)
136     pkg_check_modules(PKG_PULSEAUDIO libpulse-simple)
137     if(PKG_PULSEAUDIO_FOUND)
138       set(HAVE_PULSEAUDIO TRUE)
139       file(GLOB PULSEAUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/pulseaudio/*.c)
140       set(SOURCE_FILES ${SOURCE_FILES} ${PULSEAUDIO_SOURCES})
141       set(SDL_AUDIO_DRIVER_PULSEAUDIO 1)
142       list(APPEND EXTRA_CFLAGS ${PKG_PULSEAUDIO_CFLAGS})
143       if(PULSEAUDIO_SHARED)
144         if(NOT HAVE_DLOPEN)
145           message_warn("You must have SDL_LoadObject() support for dynamic PulseAudio loading")
146         else()
147           FindLibraryAndSONAME("pulse-simple")
148           set(SDL_AUDIO_DRIVER_PULSEAUDIO_DYNAMIC "\"${PULSE_SIMPLE_LIB_SONAME}\"")
149           set(HAVE_PULSEAUDIO_SHARED TRUE)
150         endif()
151       else()
152         list(APPEND EXTRA_LDFLAGS ${PKG_PULSEAUDIO_LDFLAGS})
153       endif()
154       set(HAVE_SDL_AUDIO TRUE)
155     endif()
156   endif()
157 endmacro()
158
159 # Requires:
160 # - PkgCheckModules
161 # Optional:
162 # - ESD_SHARED opt
163 # - HAVE_DLOPEN opt
164 macro(CheckESD)
165   if(ESD)
166     pkg_check_modules(PKG_ESD esound)
167     if(PKG_ESD_FOUND)
168       set(HAVE_ESD TRUE)
169       file(GLOB ESD_SOURCES ${SDL2_SOURCE_DIR}/src/audio/esd/*.c)
170       set(SOURCE_FILES ${SOURCE_FILES} ${ESD_SOURCES})
171       set(SDL_AUDIO_DRIVER_ESD 1)
172       list(APPEND EXTRA_CFLAGS ${PKG_ESD_CFLAGS})
173       if(ESD_SHARED)
174         if(NOT HAVE_DLOPEN)
175           message_warn("You must have SDL_LoadObject() support for dynamic ESD loading")
176         else()
177           FindLibraryAndSONAME(esd)
178           set(SDL_AUDIO_DRIVER_ESD_DYNAMIC "\"${ESD_LIB_SONAME}\"")
179           set(HAVE_ESD_SHARED TRUE)
180         endif()
181       else()
182         list(APPEND EXTRA_LDFLAGS ${PKG_ESD_LDFLAGS})
183       endif()
184       set(HAVE_SDL_AUDIO TRUE)
185     endif()
186   endif()
187 endmacro()
188
189 # Requires:
190 # - n/a
191 # Optional:
192 # - ARTS_SHARED opt
193 # - HAVE_DLOPEN opt
194 macro(CheckARTS)
195   if(ARTS)
196     find_program(ARTS_CONFIG arts-config)
197     if(ARTS_CONFIG)
198       execute_process(CMD_ARTSCFLAGS ${ARTS_CONFIG} --cflags
199         OUTPUT_VARIABLE ARTS_CFLAGS OUTPUT_STRIP_TRAILING_WHITESPACE)
200       list(APPEND EXTRA_CFLAGS ${ARTS_CFLAGS})
201       execute_process(CMD_ARTSLIBS ${ARTS_CONFIG} --libs
202         OUTPUT_VARIABLE ARTS_LIBS OUTPUT_STRIP_TRAILING_WHITESPACE)
203       file(GLOB ARTS_SOURCES ${SDL2_SOURCE_DIR}/src/audio/arts/*.c)
204       set(SOURCE_FILES ${SOURCE_FILES} ${ARTS_SOURCES})
205       set(SDL_AUDIO_DRIVER_ARTS 1)
206       set(HAVE_ARTS TRUE)
207       if(ARTS_SHARED)
208         if(NOT HAVE_DLOPEN)
209           message_warn("You must have SDL_LoadObject() support for dynamic ARTS loading")
210         else()
211           # TODO
212           FindLibraryAndSONAME(artsc)
213           set(SDL_AUDIO_DRIVER_ARTS_DYNAMIC "\"${ARTSC_LIB_SONAME}\"")
214           set(HAVE_ARTS_SHARED TRUE)
215         endif()
216       else()
217         list(APPEND EXTRA_LDFLAGS ${ARTS_LIBS})
218       endif()
219       set(HAVE_SDL_AUDIO TRUE)
220     endif()
221   endif()
222 endmacro()
223
224 # Requires:
225 # - n/a
226 # Optional:
227 # - NAS_SHARED opt
228 # - HAVE_DLOPEN opt
229 macro(CheckNAS)
230   if(NAS)
231     # TODO: set include paths properly, so the NAS headers are found
232     check_include_file(audio/audiolib.h HAVE_NAS_H)
233     find_library(D_NAS_LIB audio)
234     if(HAVE_NAS_H AND D_NAS_LIB)
235       set(HAVE_NAS TRUE)
236       file(GLOB NAS_SOURCES ${SDL2_SOURCE_DIR}/src/audio/nas/*.c)
237       set(SOURCE_FILES ${SOURCE_FILES} ${NAS_SOURCES})
238       set(SDL_AUDIO_DRIVER_NAS 1)
239       if(NAS_SHARED)
240         if(NOT HAVE_DLOPEN)
241           message_warn("You must have SDL_LoadObject() support for dynamic NAS loading")
242         else()
243           FindLibraryAndSONAME("audio")
244           set(SDL_AUDIO_DRIVER_NAS_DYNAMIC "\"${AUDIO_LIB_SONAME}\"")
245           set(HAVE_NAS_SHARED TRUE)
246         endif()
247       else()
248         list(APPEND EXTRA_LIBS ${D_NAS_LIB})
249       endif()
250       set(HAVE_SDL_AUDIO TRUE)
251     endif()
252   endif()
253 endmacro()
254
255 # Requires:
256 # - n/a
257 # Optional:
258 # - SNDIO_SHARED opt
259 # - HAVE_DLOPEN opt
260 macro(CheckSNDIO)
261   if(SNDIO)
262     # TODO: set include paths properly, so the sndio headers are found
263     check_include_file(sndio.h HAVE_SNDIO_H)
264     find_library(D_SNDIO_LIB sndio)
265     if(HAVE_SNDIO_H AND D_SNDIO_LIB)
266       set(HAVE_SNDIO TRUE)
267       file(GLOB SNDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/sndio/*.c)
268       set(SOURCE_FILES ${SOURCE_FILES} ${SNDIO_SOURCES})
269       set(SDL_AUDIO_DRIVER_SNDIO 1)
270       if(SNDIO_SHARED)
271         if(NOT HAVE_DLOPEN)
272           message_warn("You must have SDL_LoadObject() support for dynamic sndio loading")
273         else()
274           FindLibraryAndSONAME("sndio")
275           set(SDL_AUDIO_DRIVER_SNDIO_DYNAMIC "\"${SNDIO_LIB_SONAME}\"")
276           set(HAVE_SNDIO_SHARED TRUE)
277         endif()
278       else()
279         list(APPEND EXTRA_LIBS ${D_SNDIO_LIB})
280       endif()
281       set(HAVE_SDL_AUDIO TRUE)
282     endif()
283   endif()
284 endmacro()
285
286 # Requires:
287 # - PkgCheckModules
288 # Optional:
289 # - FUSIONSOUND_SHARED opt
290 # - HAVE_DLOPEN opt
291 macro(CheckFusionSound)
292   if(FUSIONSOUND)
293     pkg_check_modules(PKG_FUSIONSOUND fusionsound>=1.0.0)
294     if(PKG_FUSIONSOUND_FOUND)
295       set(HAVE_FUSIONSOUND TRUE)
296       file(GLOB FUSIONSOUND_SOURCES ${SDL2_SOURCE_DIR}/src/audio/fusionsound/*.c)
297       set(SOURCE_FILES ${SOURCE_FILES} ${FUSIONSOUND_SOURCES})
298       set(SDL_AUDIO_DRIVER_FUSIONSOUND 1)
299       list(APPEND EXTRA_CFLAGS ${PKG_FUSIONSOUND_CFLAGS})
300       if(FUSIONSOUND_SHARED)
301         if(NOT HAVE_DLOPEN)
302           message_warn("You must have SDL_LoadObject() support for dynamic FusionSound loading")
303         else()
304           FindLibraryAndSONAME("fusionsound")
305           set(SDL_AUDIO_DRIVER_FUSIONSOUND_DYNAMIC "\"${FUSIONSOUND_LIB_SONAME}\"")
306           set(HAVE_FUSIONSOUND_SHARED TRUE)
307         endif()
308       else()
309         list(APPEND EXTRA_LDFLAGS ${PKG_FUSIONSOUND_LDFLAGS})
310       endif()
311       set(HAVE_SDL_AUDIO TRUE)
312     endif()
313   endif()
314 endmacro()
315
316 # Requires:
317 # - n/a
318 # Optional:
319 # - X11_SHARED opt
320 # - HAVE_DLOPEN opt
321 macro(CheckX11)
322   if(VIDEO_X11)
323     foreach(_LIB X11 Xext Xcursor Xinerama Xi Xrandr Xrender Xss Xxf86vm)
324         FindLibraryAndSONAME("${_LIB}")
325     endforeach()
326
327     find_path(X_INCLUDEDIR X11/Xlib.h)
328     if(X_INCLUDEDIR)
329       set(X_CFLAGS "-I${X_INCLUDEDIR}")
330     endif()
331
332     check_include_file(X11/Xcursor/Xcursor.h HAVE_XCURSOR_H)
333     check_include_file(X11/extensions/Xinerama.h HAVE_XINERAMA_H)
334     check_include_file(X11/extensions/XInput2.h HAVE_XINPUT_H)
335     check_include_file(X11/extensions/Xrandr.h HAVE_XRANDR_H)
336     check_include_file(X11/extensions/Xrender.h HAVE_XRENDER_H)
337     check_include_file(X11/extensions/scrnsaver.h HAVE_XSS_H)
338     check_include_file(X11/extensions/shape.h HAVE_XSHAPE_H)
339     check_include_files("X11/Xlib.h;X11/extensions/xf86vmode.h" HAVE_XF86VM_H)
340     check_include_files("X11/Xlib.h;X11/Xproto.h;X11/extensions/Xext.h" HAVE_XEXT_H)
341
342     if(X11_LIB)
343       if(NOT HAVE_XEXT_H)
344         message_error("Missing Xext.h, maybe you need to install the libxext-dev package?")
345       endif()
346
347       set(HAVE_VIDEO_X11 TRUE)
348       set(HAVE_SDL_VIDEO TRUE)
349
350       file(GLOB X11_SOURCES ${SDL2_SOURCE_DIR}/src/video/x11/*.c)
351       set(SOURCE_FILES ${SOURCE_FILES} ${X11_SOURCES})
352       set(SDL_VIDEO_DRIVER_X11 1)
353
354       if(APPLE)
355         set(X11_SHARED OFF)
356       endif()
357
358       check_function_exists("shmat" HAVE_SHMAT)
359       if(NOT HAVE_SHMAT)
360         check_library_exists(ipc shmat "" HAVE_SHMAT)
361         if(HAVE_SHMAT)
362           list(APPEND EXTRA_LIBS ipc)
363         endif()
364         if(NOT HAVE_SHMAT)
365           add_definitions(-DNO_SHARED_MEMORY)
366           set(X_CFLAGS "${X_CFLAGS} -DNO_SHARED_MEMORY")
367         endif()
368       endif()
369
370       if(X11_SHARED)
371         if(NOT HAVE_DLOPEN)
372           message_warn("You must have SDL_LoadObject() support for dynamic X11 loading")
373           set(HAVE_X11_SHARED FALSE)
374         else()
375           set(HAVE_X11_SHARED TRUE)
376         endif()
377         if(HAVE_X11_SHARED)
378           set(SDL_VIDEO_DRIVER_X11_DYNAMIC "\"${X11_LIB_SONAME}\"")
379           set(SDL_VIDEO_DRIVER_X11_DYNAMIC_XEXT "\"${XEXT_LIB_SONAME}\"")
380         else()
381           list(APPEND EXTRA_LIBS ${X11_LIB} ${XEXT_LIB})
382         endif()
383       endif()
384
385       set(SDL_CFLAGS "${SDL_CFLAGS} ${X_CFLAGS}")
386
387       set(CMAKE_REQUIRED_LIBRARIES ${X11_LIB} ${X11_LIB})
388       check_c_source_compiles("
389           #include <X11/Xlib.h>
390           #include <X11/Xproto.h>
391           #include <X11/extensions/Xext.h>
392           #include <X11/extensions/extutil.h>
393           extern XExtDisplayInfo* XextAddDisplay(XExtensionInfo* a,Display* b,_Xconst char* c,XExtensionHooks* d,int e,XPointer f);
394           int main(int argc, char **argv) {}" HAVE_CONST_XEXT_ADDDISPLAY)
395       if(HAVE_CONST_XEXT_ADDDISPLAY)
396         set(SDL_VIDEO_DRIVER_X11_CONST_PARAM_XEXTADDDISPLAY 1)
397       endif()
398
399       check_c_source_compiles("
400           #include <X11/Xlib.h>
401           int main(int argc, char **argv) {
402             Display *display;
403             XEvent event;
404             XGenericEventCookie *cookie = &event.xcookie;
405             XNextEvent(display, &event);
406             XGetEventData(display, cookie);
407             XFreeEventData(display, cookie); }" HAVE_XGENERICEVENT)
408       if(HAVE_XGENERICEVENT)
409         set(SDL_VIDEO_DRIVER_X11_SUPPORTS_GENERIC_EVENTS 1)
410       endif()
411
412       check_function_exists(XkbKeycodeToKeysym SDL_VIDEO_DRIVER_X11_HAS_XKBKEYCODETOKEYSYM)
413
414       if(VIDEO_X11_XCURSOR AND HAVE_XCURSOR_H)
415         set(HAVE_VIDEO_X11_XCURSOR TRUE)
416         if(HAVE_X11_SHARED AND XCURSOR_LIB)
417           set(SDL_VIDEO_DRIVER_X11_DYNAMIC_XCURSOR "\"${XCURSOR_LIB_SONAME}\"")
418         else()
419           list(APPEND EXTRA_LIBS ${XCURSOR_LIB})
420         endif()
421         set(SDL_VIDEO_DRIVER_X11_XCURSOR 1)
422       endif()
423
424       if(VIDEO_X11_XINERAMA AND HAVE_XINERAMA_H)
425         set(HAVE_VIDEO_X11_XINERAMA TRUE)
426         if(HAVE_X11_SHARED AND XINERAMA_LIB)
427           set(SDL_VIDEO_DRIVER_X11_DYNAMIC_XINERAMA "\"${XINERAMA_LIB_SONAME}\"")
428         else()
429           list(APPEND EXTRA_LIBS ${XINERAMA_LIB})
430         endif()
431         set(SDL_VIDEO_DRIVER_X11_XINERAMA 1)
432       endif()
433
434       if(VIDEO_X11_XINPUT AND HAVE_XINPUT_H)
435         set(HAVE_VIDEO_X11_XINPUT TRUE)
436         if(HAVE_X11_SHARED AND XI_LIB)
437           set(SDL_VIDEO_DRIVER_X11_DYNAMIC_XINPUT2 "\"${XI_LIB_SONAME}\"")
438         else()
439           list(APPEND EXTRA_LIBS ${XI_LIB})
440         endif()
441         set(SDL_VIDEO_DRIVER_X11_XINPUT2 1)
442
443         # Check for multitouch
444         check_c_source_compiles("
445             #include <X11/Xlib.h>
446             #include <X11/Xproto.h>
447             #include <X11/extensions/XInput2.h>
448             int event_type = XI_TouchBegin;
449             XITouchClassInfo *t;
450             Status XIAllowTouchEvents(Display *a,int b,unsigned int c,Window d,int f)
451             {
452               return (Status)0;
453             }
454             int main(int argc, char **argv) {}" HAVE_XINPUT2_MULTITOUCH)
455         if(HAVE_XINPUT2_MULTITOUCH)
456           set(SDL_VIDEO_DRIVER_X11_XINPUT2_SUPPORTS_MULTITOUCH 1)
457         endif()
458       endif()
459
460       if(VIDEO_X11_XRANDR AND HAVE_XRANDR_H)
461         if(HAVE_X11_SHARED AND XRANDR_LIB)
462           set(SDL_VIDEO_DRIVER_X11_DYNAMIC_XRANDR "\"${XRANDR_LIB_SONAME}\"")
463         else()
464           list(APPEND EXTRA_LIBS ${XRANDR_LIB})
465         endif()
466         set(SDL_VIDEO_DRIVER_X11_XRANDR 1)
467         set(HAVE_VIDEO_X11_XRANDR TRUE)
468       endif()
469
470       if(VIDEO_X11_XSCRNSAVER AND HAVE_XSS_H)
471         if(HAVE_X11_SHARED AND XSS_LIB)
472           set(SDL_VIDEO_DRIVER_X11_DYNAMIC_XSS "\"${XSS_LIB_SONAME}\"")
473         else()
474           list(APPEND EXTRA_LIBS ${XSS_LIB})
475         endif()
476         set(SDL_VIDEO_DRIVER_X11_XSCRNSAVER 1)
477         set(HAVE_VIDEO_X11_XSCRNSAVER TRUE)
478       endif()
479
480       if(VIDEO_X11_XSHAPE AND HAVE_XSHAPE_H)
481         set(SDL_VIDEO_DRIVER_X11_XSHAPE 1)
482         set(HAVE_VIDEO_X11_XSHAPE TRUE)
483       endif()
484
485       if(VIDEO_X11_XVM AND HAVE_XF86VM_H)
486         if(HAVE_X11_SHARED AND XXF86VM_LIB)
487           set(SDL_VIDEO_DRIVER_X11_DYNAMIC_XVIDMODE "\"${XXF86VM_LIB_SONAME}\"")
488         else()
489           list(APPEND EXTRA_LIBS ${XXF86VM_LIB})
490         endif()
491         set(SDL_VIDEO_DRIVER_X11_XVIDMODE 1)
492         set(HAVE_VIDEO_X11_XVM TRUE)
493       endif()
494
495       set(CMAKE_REQUIRED_LIBRARIES)
496     endif()
497   endif()
498 endmacro()
499
500 # Requires:
501 # - EGL
502 # - PkgCheckModules
503 # Optional:
504 # - MIR_SHARED opt
505 # - HAVE_DLOPEN opt
506 macro(CheckMir)
507     if(VIDEO_MIR)
508         find_library(MIR_LIB mirclient mircommon egl)
509         pkg_check_modules(MIR_TOOLKIT mirclient mircommon)
510         pkg_check_modules(EGL egl)
511         pkg_check_modules(XKB xkbcommon)
512
513         if (MIR_LIB AND MIR_TOOLKIT_FOUND AND EGL_FOUND AND XKB_FOUND)
514             set(HAVE_VIDEO_MIR TRUE)
515             set(HAVE_SDL_VIDEO TRUE)
516
517             file(GLOB MIR_SOURCES ${SDL2_SOURCE_DIR}/src/video/mir/*.c)
518             set(SOURCE_FILES ${SOURCE_FILES} ${MIR_SOURCES})
519             set(SDL_VIDEO_DRIVER_MIR 1)
520
521             list(APPEND EXTRA_CFLAGS ${MIR_TOOLKIT_CFLAGS} ${EGL_CLFAGS} ${XKB_CLFLAGS})
522
523             if(MIR_SHARED)
524                 if(NOT HAVE_DLOPEN)
525                     message_warn("You must have SDL_LoadObject() support for dynamic Mir loading")
526                 else()
527                     FindLibraryAndSONAME(mirclient)
528                     FindLibraryAndSONAME(xkbcommon)
529                     set(SDL_VIDEO_DRIVER_MIR_DYNAMIC "\"${MIRCLIENT_LIB_SONAME}\"")
530                     set(SDL_VIDEO_DRIVER_MIR_DYNAMIC_XKBCOMMON "\"${XKBCOMMON_LIB_SONAME}\"")
531                     set(HAVE_MIR_SHARED TRUE)
532                 endif()
533             else()
534                 set(EXTRA_LIBS ${MIR_TOOLKIT_LIBRARIES} ${EXTRA_LIBS})
535             endif()
536         endif()
537     endif()
538 endmacro()
539
540 # Requires:
541 # - EGL
542 # - PkgCheckModules
543 # Optional:
544 # - WAYLAND_SHARED opt
545 # - HAVE_DLOPEN opt
546 macro(CheckWayland)
547   if(VIDEO_WAYLAND)
548     pkg_check_modules(WAYLAND wayland-client wayland-cursor wayland-egl egl xkbcommon xdg-shell-client text-client tizen-extension-client)
549     if(WAYLAND_FOUND)
550       link_directories(
551           ${WAYLAND_LIBRARY_DIRS}
552       )
553       include_directories(
554           ${WAYLAND_INCLUDE_DIRS}
555       )
556       set(HAVE_VIDEO_WAYLAND TRUE)
557       set(HAVE_SDL_VIDEO TRUE)
558
559       file(GLOB WAYLAND_SOURCES ${SDL2_SOURCE_DIR}/src/video/wayland/*.c)
560       set(SOURCE_FILES ${SOURCE_FILES} ${WAYLAND_SOURCES})
561
562       if(VIDEO_WAYLAND_QT_TOUCH)
563           set(SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH 1)
564       endif()
565
566       if(WAYLAND_SHARED)
567         if(NOT HAVE_DLOPEN)
568           message_warn("You must have SDL_LoadObject() support for dynamic Wayland loading")
569         else()
570           FindLibraryAndSONAME(wayland-client)
571           FindLibraryAndSONAME(wayland-egl)
572           FindLibraryAndSONAME(wayland-cursor)
573           FindLibraryAndSONAME(xkbcommon)
574           FindLibraryAndSONAME(xdg-shell-client)
575           FindLibraryAndSONAME(text-client)
576           FindLibraryAndSONAME(tizen-extension-client)
577           set(SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC "\"${WAYLAND_CLIENT_LIB_SONAME}\"")
578           set(SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_EGL "\"${WAYLAND_EGL_LIB_SONAME}\"")
579           set(SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_CURSOR "\"${WAYLAND_CURSOR_LIB_SONAME}\"")
580           set(SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_XKBCOMMON "\"${XKBCOMMON_LIB_SONAME}\"")
581           set(SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_XDGSHELLCLIENT "\"${XDGSHELLCLIENT_LIB_SONAME}\"")
582           set(SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_TEXTCLIENT "\"${TEXTCLIENT_LIB_SONAME}\"")
583           set(SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_TIZENEXTENSIONCLIENT "\"${TIZENEXTENSIONCLIENT_LIB_SONAME}\"")
584           set(HAVE_WAYLAND_SHARED TRUE)
585         endif()
586       else()
587         set(EXTRA_LIBS ${WAYLAND_LIBRARIES} ${EXTRA_LIBS})
588       endif()
589
590       set(SDL_VIDEO_DRIVER_WAYLAND 1)
591     endif()
592   endif()
593 endmacro()
594
595 macro(CheckTizen)
596   if(VIDEO_TIZEN)
597     pkg_check_modules(TIZEN wayland-client wayland-egl ecore ecore-wayland eina capi-appfw-application capi-appfw-application dlog ecore-imf)
598     if(TIZEN_FOUND)
599       link_directories(
600           ${TIZEN_LIBRARY_DIRS}
601       )
602       include_directories(
603           ${TIZEN_INCLUDE_DIRS}
604       )
605       set(HAVE_VIDEO_TIZEN TRUE)
606       set(HAVE_SDL_VIDEO TRUE)
607
608       file(GLOB TIZEN_SOURCES ${SDL2_SOURCE_DIR}/src/video/tizen/*.c)
609       set(SOURCE_FILES ${SOURCE_FILES} ${TIZEN_SOURCES})
610
611       if(TIZEN_SHARED)
612         if(NOT HAVE_DLOPEN)
613           message_warn("You must have SDL_LoadObject() support for dynamic Tizen loading")
614         else()
615           FindLibraryAndSONAME(wayland-client)
616           FindLibraryAndSONAME(wayland-egl)
617           FindLibraryAndSONAME(ecore)
618           FindLibraryAndSONAME(ecore-wayland)
619           FindLibraryAndSONAME(eina)
620           FindLibraryAndSONAME(capi-appfw-application)
621           FindLibraryAndSONAME(capi-system-system-settings)
622           FindLibraryAndSONAME(dlog)
623           set(SDL_VIDEO_DRIVER_TIZEN_DYNAMIC "\"${WAYLAND_CLIENT_LIB_SONAME}\"")
624           set(SDL_VIDEO_DRIVER_TIZEN_DYNAMIC_EGL "\"${WAYLAND_EGL_LIB_SONAME}\"")
625           set(SDL_VIDEO_DRIVER_TIZEN_DYNAMIC_ECORE "\"${ECORE_LIB_SONAME}\"")
626           set(SDL_VIDEO_DRIVER_TIZEN_DYNAMIC_ECORE_WAYLAND "\"${ECORE_WAYLAND_LIB_SONAME}\"")
627           set(SDL_VIDEO_DRIVER_TIZEN_DYNAMIC_EVAS "\"${EVAS_LIB_SONAME}\"")
628           set(SDL_VIDEO_DRIVER_TIZEN_DYNAMIC_EINA "\"${EINA_LIB_SONAME}\"")
629           set(SDL_VIDEO_DRIVER_TIZEN_DYNAMIC_APPCORE_EFL "\"${APPCORE_EFL_LIB_SONAME}\"")
630           set(SDL_VIDEO_DRIVER_TIZEN_DYNAMIC_DLOG "\"${DLOG_LIB_SONAME}\"")
631           set(HAVE_TIZEN_SHARED TRUE)
632         endif()
633       else()
634         set(EXTRA_LIBS ${TIZEN_LIBRARIES} ${EXTRA_LIBS})
635       endif()
636
637       set(SDL_VIDEO_DRIVER_TIZEN 1)
638     endif()
639   endif()
640 endmacro()
641
642 # Requires:
643 # - n/a
644 #
645 macro(CheckCOCOA)
646   if(VIDEO_COCOA)
647     if(APPLE) # Apple always has Cocoa.
648       set(HAVE_VIDEO_COCOA TRUE)
649     endif()
650     if(HAVE_VIDEO_COCOA)
651       file(GLOB COCOA_SOURCES ${SDL2_SOURCE_DIR}/src/video/cocoa/*.m)
652       set_source_files_properties(${COCOA_SOURCES} PROPERTIES LANGUAGE C)
653       set(SOURCE_FILES ${SOURCE_FILES} ${COCOA_SOURCES})
654       set(SDL_VIDEO_DRIVER_COCOA 1)
655       set(HAVE_SDL_VIDEO TRUE)
656     endif()
657   endif()
658 endmacro()
659
660 # Requires:
661 # - PkgCheckModules
662 # Optional:
663 # - DIRECTFB_SHARED opt
664 # - HAVE_DLOPEN opt
665 macro(CheckDirectFB)
666   if(VIDEO_DIRECTFB)
667     pkg_check_modules(PKG_DIRECTFB directfb>=1.0.0)
668     if(PKG_DIRECTFB_FOUND)
669       set(HAVE_VIDEO_DIRECTFB TRUE)
670       file(GLOB DIRECTFB_SOURCES ${SDL2_SOURCE_DIR}/src/video/directfb/*.c)
671       set(SOURCE_FILES ${SOURCE_FILES} ${DIRECTFB_SOURCES})
672       set(SDL_VIDEO_DRIVER_DIRECTFB 1)
673       set(SDL_VIDEO_RENDER_DIRECTFB 1)
674       list(APPEND EXTRA_CFLAGS ${PKG_DIRECTFB_CFLAGS})
675       if(DIRECTFB_SHARED)
676         if(NOT HAVE_DLOPEN)
677           message_warn("You must have SDL_LoadObject() support for dynamic DirectFB loading")
678         else()
679           FindLibraryAndSONAME("directfb")
680           set(SDL_VIDEO_DRIVER_DIRECTFB_DYNAMIC "\"${DIRECTFB_LIB_SONAME}\"")
681           set(HAVE_DIRECTFB_SHARED TRUE)
682         endif()
683       else()
684         list(APPEND EXTRA_LDFLAGS ${PKG_DIRECTFB_LDFLAGS})
685       endif()
686       set(HAVE_SDL_VIDEO TRUE)
687     endif()
688   endif()
689 endmacro()
690
691 # Requires:
692 # - n/a
693 macro(CheckVivante)
694   if(VIDEO_VIVANTE)
695     check_c_source_compiles("
696         #include <gc_vdk.h>
697         int main(int argc, char** argv) {}" HAVE_VIDEO_VIVANTE_VDK)
698     check_c_source_compiles("
699         #define LINUX
700         #define EGL_API_FB
701         #include <EGL/eglvivante.h>
702         int main(int argc, char** argv) {}" HAVE_VIDEO_VIVANTE_EGL_FB)
703     if(HAVE_VIDEO_VIVANTE_VDK OR HAVE_VIDEO_VIVANTE_EGL_FB)
704       set(HAVE_VIDEO_VIVANTE TRUE)
705       set(HAVE_SDL_VIDEO TRUE)
706
707       file(GLOB VIVANTE_SOURCES ${SDL2_SOURCE_DIR}/src/video/vivante/*.c)
708       set(SOURCE_FILES ${SOURCE_FILES} ${VIVANTE_SOURCES})
709       set(SDL_VIDEO_DRIVER_VIVANTE 1)
710       if(HAVE_VIDEO_VIVANTE_VDK)
711         set(SDL_VIDEO_DRIVER_VIVANTE_VDK 1)
712         list(APPEND EXTRA_LIBS VDK VIVANTE)
713       else()
714         set(SDL_CFLAGS "${SDL_CFLAGS} -DLINUX -DEGL_API_FB")
715         list(APPEND EXTRA_LIBS EGL)
716       endif(HAVE_VIDEO_VIVANTE_VDK)
717     endif(HAVE_VIDEO_VIVANTE_VDK OR HAVE_VIDEO_VIVANTE_EGL_FB)
718   endif(VIDEO_VIVANTE)
719 endmacro(CheckVivante)
720
721 # Requires:
722 # - nada
723 macro(CheckOpenGLX11)
724   if(VIDEO_OPENGL)
725     check_c_source_compiles("
726         #include <GL/gl.h>
727         #include <GL/glx.h>
728         int main(int argc, char** argv) {}" HAVE_VIDEO_OPENGL)
729
730     if(HAVE_VIDEO_OPENGL)
731       set(HAVE_VIDEO_OPENGL TRUE)
732       set(SDL_VIDEO_OPENGL 1)
733       set(SDL_VIDEO_OPENGL_GLX 1)
734       set(SDL_VIDEO_RENDER_OGL 1)
735       list(APPEND EXTRA_LIBS GL)
736     endif()
737   endif()
738 endmacro()
739
740 # Requires:
741 # - nada
742 macro(CheckOpenGLESX11)
743   if(VIDEO_OPENGLES)
744     check_c_source_compiles("
745         #define EGL_API_FB
746         #include <EGL/egl.h>
747         int main (int argc, char** argv) {}" HAVE_VIDEO_OPENGL_EGL)
748     if(HAVE_VIDEO_OPENGL_EGL)
749         set(SDL_VIDEO_OPENGL_EGL 1)
750     endif()
751     check_c_source_compiles("
752       #include <GLES/gl.h>
753       #include <GLES/glext.h>
754       int main (int argc, char** argv) {}" HAVE_VIDEO_OPENGLES_V1)
755     if(HAVE_VIDEO_OPENGLES_V1)
756         set(HAVE_VIDEO_OPENGLES TRUE)
757         set(SDL_VIDEO_OPENGL_ES 1)
758         set(SDL_VIDEO_RENDER_OGL_ES 1)
759     endif()
760     check_c_source_compiles("
761       #include <GLES2/gl2.h>
762       #include <GLES2/gl2ext.h>
763       int main (int argc, char** argv) {}" HAVE_VIDEO_OPENGLES_V2)
764     if(HAVE_VIDEO_OPENGLES_V2)
765         set(HAVE_VIDEO_OPENGLES TRUE)
766         set(SDL_VIDEO_OPENGL_ES2 1)
767         set(SDL_VIDEO_RENDER_OGL_ES2 1)
768     endif()
769
770   endif()
771 endmacro()
772
773 macro(CheckVulkan)
774   if(VIDEO_VULKAN)
775     check_c_source_compiles("
776        #include <vulkan/vulkan.h>
777       int main (int argc, char** argv) {}" HAVE_VIDEO_VULKAN)
778     if(HAVE_VIDEO_VULKAN)
779         set(SDL_VIDEO_VULKAN 1)
780         set(VULKAN_LDFLAGS "-lvulkan")
781         list(APPEND EXTRA_LDFLAGS ${VULKAN_LDFLAGS})
782         list(APPEND SDL_LIBS ${VULKAN_LDFLAGS})
783     endif()
784
785   endif()
786 endmacro()
787
788 # Requires:
789 # - nada
790 # Optional:
791 # - THREADS opt
792 # Sets:
793 # PTHREAD_CFLAGS
794 # PTHREAD_LIBS
795 macro(CheckPTHREAD)
796   if(PTHREADS)
797     if(LINUX)
798       set(PTHREAD_CFLAGS "-D_REENTRANT")
799       set(PTHREAD_LDFLAGS "-pthread")
800     elseif(BSDI)
801       set(PTHREAD_CFLAGS "-D_REENTRANT -D_THREAD_SAFE")
802       set(PTHREAD_LDFLAGS "")
803     elseif(DARWIN)
804       set(PTHREAD_CFLAGS "-D_THREAD_SAFE")
805       # causes Carbon.p complaints?
806       # set(PTHREAD_CFLAGS "-D_REENTRANT -D_THREAD_SAFE")
807       set(PTHREAD_LDFLAGS "")
808     elseif(FREEBSD)
809       set(PTHREAD_CFLAGS "-D_REENTRANT -D_THREAD_SAFE")
810       set(PTHREAD_LDFLAGS "-pthread")
811     elseif(NETBSD)
812       set(PTHREAD_CFLAGS "-D_REENTRANT -D_THREAD_SAFE")
813       set(PTHREAD_LDFLAGS "-lpthread")
814     elseif(OPENBSD)
815       set(PTHREAD_CFLAGS "-D_REENTRANT")
816       set(PTHREAD_LDFLAGS "-pthread")
817     elseif(SOLARIS)
818       set(PTHREAD_CFLAGS "-D_REENTRANT")
819       set(PTHREAD_LDFLAGS "-pthread -lposix4")
820     elseif(SYSV5)
821       set(PTHREAD_CFLAGS "-D_REENTRANT -Kthread")
822       set(PTHREAD_LDFLAGS "")
823     elseif(AIX)
824       set(PTHREAD_CFLAGS "-D_REENTRANT -mthreads")
825       set(PTHREAD_LDFLAGS "-pthread")
826     elseif(HPUX)
827       set(PTHREAD_CFLAGS "-D_REENTRANT")
828       set(PTHREAD_LDFLAGS "-L/usr/lib -pthread")
829     elseif(HAIKU)
830       set(PTHREAD_CFLAGS "-D_REENTRANT")
831       set(PTHREAD_LDFLAGS "")
832     else()
833       set(PTHREAD_CFLAGS "-D_REENTRANT")
834       set(PTHREAD_LDFLAGS "-lpthread")
835     endif()
836
837     # Run some tests
838     set(CMAKE_REQUIRED_FLAGS "${PTHREAD_CFLAGS} ${PTHREAD_LDFLAGS}")
839     if(CMAKE_CROSSCOMPILING)
840       set(HAVE_PTHREADS 1)
841     else()
842       check_c_source_runs("
843         #include <pthread.h>
844         int main(int argc, char** argv) {
845           pthread_attr_t type;
846           pthread_attr_init(&type);
847           return 0;
848         }" HAVE_PTHREADS)
849     endif()
850     if(HAVE_PTHREADS)
851       set(SDL_THREAD_PTHREAD 1)
852       list(APPEND EXTRA_CFLAGS ${PTHREAD_CFLAGS})
853       list(APPEND EXTRA_LDFLAGS ${PTHREAD_LDFLAGS})
854       set(SDL_CFLAGS "${SDL_CFLAGS} ${PTHREAD_CFLAGS}")
855       list(APPEND SDL_LIBS ${PTHREAD_LDFLAGS})
856
857       check_c_source_compiles("
858         #include <pthread.h>
859         int main(int argc, char **argv) {
860           pthread_mutexattr_t attr;
861           pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
862           return 0;
863         }" HAVE_RECURSIVE_MUTEXES)
864       if(HAVE_RECURSIVE_MUTEXES)
865         set(SDL_THREAD_PTHREAD_RECURSIVE_MUTEX 1)
866       else()
867         check_c_source_compiles("
868             #include <pthread.h>
869             int main(int argc, char **argv) {
870               pthread_mutexattr_t attr;
871               pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
872               return 0;
873             }" HAVE_RECURSIVE_MUTEXES_NP)
874         if(HAVE_RECURSIVE_MUTEXES_NP)
875           set(SDL_THREAD_PTHREAD_RECURSIVE_MUTEX_NP 1)
876         endif()
877       endif()
878
879       if(PTHREADS_SEM)
880         check_c_source_compiles("#include <pthread.h>
881                                  #include <semaphore.h>
882                                  int main(int argc, char **argv) { return 0; }" HAVE_PTHREADS_SEM)
883         if(HAVE_PTHREADS_SEM)
884           check_c_source_compiles("
885               #include <pthread.h>
886               #include <semaphore.h>
887               int main(int argc, char **argv) {
888                   sem_timedwait(NULL, NULL);
889                   return 0;
890               }" HAVE_SEM_TIMEDWAIT)
891         endif()
892       endif()
893
894       check_c_source_compiles("
895           #include <pthread.h>
896           #include <pthread_np.h>
897           int main(int argc, char** argv) { return 0; }" HAVE_PTHREAD_NP_H)
898       check_function_exists(pthread_setname_np HAVE_PTHREAD_SETNAME_NP)
899       check_function_exists(pthread_set_name_np HAVE_PTHREAD_SET_NAME_NP)
900       set(CMAKE_REQUIRED_FLAGS)
901
902       set(SOURCE_FILES ${SOURCE_FILES}
903           ${SDL2_SOURCE_DIR}/src/thread/pthread/SDL_systhread.c
904           ${SDL2_SOURCE_DIR}/src/thread/pthread/SDL_sysmutex.c   # Can be faked, if necessary
905           ${SDL2_SOURCE_DIR}/src/thread/pthread/SDL_syscond.c    # Can be faked, if necessary
906           ${SDL2_SOURCE_DIR}/src/thread/pthread/SDL_systls.c
907           )
908       if(HAVE_PTHREADS_SEM)
909         set(SOURCE_FILES ${SOURCE_FILES}
910             ${SDL2_SOURCE_DIR}/src/thread/pthread/SDL_syssem.c)
911       else()
912         set(SOURCE_FILES ${SOURCE_FILES}
913             ${SDL2_SOURCE_DIR}/src/thread/generic/SDL_syssem.c)
914       endif()
915       set(HAVE_SDL_THREADS TRUE)
916     endif()
917   endif()
918 endmacro()
919
920 # Requires
921 # - nada
922 # Optional:
923 # Sets:
924 # USB_LIBS
925 # USB_CFLAGS
926 macro(CheckUSBHID)
927   check_library_exists(usbhid hid_init "" LIBUSBHID)
928   if(LIBUSBHID)
929     check_include_file(usbhid.h HAVE_USBHID_H)
930     if(HAVE_USBHID_H)
931       set(USB_CFLAGS "-DHAVE_USBHID_H")
932     endif()
933
934     check_include_file(libusbhid.h HAVE_LIBUSBHID_H)
935     if(HAVE_LIBUSBHID_H)
936       set(USB_CFLAGS "${USB_CFLAGS} -DHAVE_LIBUSBHID_H")
937     endif()
938     set(USB_LIBS ${USB_LIBS} usbhid)
939   else()
940     check_include_file(usb.h HAVE_USB_H)
941     if(HAVE_USB_H)
942       set(USB_CFLAGS "-DHAVE_USB_H")
943     endif()
944     check_include_file(libusb.h HAVE_LIBUSB_H)
945     if(HAVE_LIBUSB_H)
946       set(USB_CFLAGS "${USB_CFLAGS} -DHAVE_LIBUSB_H")
947     endif()
948     check_library_exists(usb hid_init "" LIBUSB)
949     if(LIBUSB)
950       set(USB_LIBS ${USB_LIBS} usb)
951     endif()
952   endif()
953
954   set(CMAKE_REQUIRED_FLAGS "${USB_CFLAGS}")
955   set(CMAKE_REQUIRED_LIBRARIES "${USB_LIBS}")
956   check_c_source_compiles("
957        #include <sys/types.h>
958         #if defined(HAVE_USB_H)
959         #include <usb.h>
960         #endif
961         #ifdef __DragonFly__
962         # include <bus/usb/usb.h>
963         # include <bus/usb/usbhid.h>
964         #else
965         # include <dev/usb/usb.h>
966         # include <dev/usb/usbhid.h>
967         #endif
968         #if defined(HAVE_USBHID_H)
969         #include <usbhid.h>
970         #elif defined(HAVE_LIBUSB_H)
971         #include <libusb.h>
972         #elif defined(HAVE_LIBUSBHID_H)
973         #include <libusbhid.h>
974         #endif
975         int main(int argc, char **argv) {
976           struct report_desc *repdesc;
977           struct usb_ctl_report *repbuf;
978           hid_kind_t hidkind;
979           return 0;
980         }" HAVE_USBHID)
981   if(HAVE_USBHID)
982     check_c_source_compiles("
983           #include <sys/types.h>
984           #if defined(HAVE_USB_H)
985           #include <usb.h>
986           #endif
987           #ifdef __DragonFly__
988           # include <bus/usb/usb.h>
989           # include <bus/usb/usbhid.h>
990           #else
991           # include <dev/usb/usb.h>
992           # include <dev/usb/usbhid.h>
993           #endif
994           #if defined(HAVE_USBHID_H)
995           #include <usbhid.h>
996           #elif defined(HAVE_LIBUSB_H)
997           #include <libusb.h>
998           #elif defined(HAVE_LIBUSBHID_H)
999           #include <libusbhid.h>
1000           #endif
1001           int main(int argc, char** argv) {
1002             struct usb_ctl_report buf;
1003             if (buf.ucr_data) { }
1004             return 0;
1005           }" HAVE_USBHID_UCR_DATA)
1006     if(HAVE_USBHID_UCR_DATA)
1007       set(USB_CFLAGS "${USB_CFLAGS} -DUSBHID_UCR_DATA")
1008     endif()
1009
1010     check_c_source_compiles("
1011           #include <sys/types.h>
1012           #if defined(HAVE_USB_H)
1013           #include <usb.h>
1014           #endif
1015           #ifdef __DragonFly__
1016           #include <bus/usb/usb.h>
1017           #include <bus/usb/usbhid.h>
1018           #else
1019           #include <dev/usb/usb.h>
1020           #include <dev/usb/usbhid.h>
1021           #endif
1022           #if defined(HAVE_USBHID_H)
1023           #include <usbhid.h>
1024           #elif defined(HAVE_LIBUSB_H)
1025           #include <libusb.h>
1026           #elif defined(HAVE_LIBUSBHID_H)
1027           #include <libusbhid.h>
1028           #endif
1029           int main(int argc, char **argv) {
1030             report_desc_t d;
1031             hid_start_parse(d, 1, 1);
1032             return 0;
1033           }" HAVE_USBHID_NEW)
1034     if(HAVE_USBHID_NEW)
1035       set(USB_CFLAGS "${USB_CFLAGS} -DUSBHID_NEW")
1036     endif()
1037
1038     check_c_source_compiles("
1039         #include <machine/joystick.h>
1040         int main(int argc, char** argv) {
1041             struct joystick t;
1042             return 0;
1043         }" HAVE_MACHINE_JOYSTICK)
1044     if(HAVE_MACHINE_JOYSTICK)
1045       set(SDL_JOYSTICK_USBHID_MACHINE_JOYSTICK_H 1)
1046     endif()
1047     set(SDL_JOYSTICK_USBHID 1)
1048     file(GLOB BSD_JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/bsd/*.c)
1049     set(SOURCE_FILES ${SOURCE_FILES} ${BSD_JOYSTICK_SOURCES})
1050     list(APPEND EXTRA_CFLAGS ${USB_CFLAGS})
1051     list(APPEND EXTRA_LIBS ${USB_LIBS})
1052     set(HAVE_SDL_JOYSTICK TRUE)
1053
1054     set(CMAKE_REQUIRED_LIBRARIES)
1055     set(CMAKE_REQUIRED_FLAGS)
1056   endif()
1057 endmacro()
1058
1059 # Requires:
1060 # - n/a
1061 macro(CheckRPI)
1062   if(VIDEO_RPI)
1063     set(VIDEO_RPI_INCLUDE_DIRS "/opt/vc/include" "/opt/vc/include/interface/vcos/pthreads" "/opt/vc/include/interface/vmcs_host/linux/" )
1064     set(VIDEO_RPI_LIBRARY_DIRS "/opt/vc/lib" )
1065     set(VIDEO_RPI_LIBS bcm_host )
1066     listtostr(VIDEO_RPI_INCLUDE_DIRS VIDEO_RPI_INCLUDE_FLAGS "-I")
1067     listtostr(VIDEO_RPI_LIBRARY_DIRS VIDEO_RPI_LIBRARY_FLAGS "-L")
1068
1069     set(CMAKE_REQUIRED_FLAGS "${VIDEO_RPI_INCLUDE_FLAGS} ${VIDEO_RPI_LIBRARY_FLAGS}")
1070     set(CMAKE_REQUIRED_LIBRARIES "${VIDEO_RPI_LIBS}")
1071     check_c_source_compiles("
1072         #include <bcm_host.h>
1073         int main(int argc, char **argv) {}" HAVE_VIDEO_RPI)
1074     set(CMAKE_REQUIRED_FLAGS)
1075     set(CMAKE_REQUIRED_LIBRARIES)
1076
1077     if(SDL_VIDEO AND HAVE_VIDEO_RPI)
1078       set(HAVE_SDL_VIDEO TRUE)
1079       set(SDL_VIDEO_DRIVER_RPI 1)
1080       file(GLOB VIDEO_RPI_SOURCES ${SDL2_SOURCE_DIR}/src/video/raspberry/*.c)
1081       set(SOURCE_FILES ${SOURCE_FILES} ${VIDEO_RPI_SOURCES})
1082       list(APPEND EXTRA_LIBS ${VIDEO_RPI_LIBS})
1083       set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${VIDEO_RPI_INCLUDE_FLAGS} ${VIDEO_RPI_LIBRARY_FLAGS}")
1084     endif(SDL_VIDEO AND HAVE_VIDEO_RPI)
1085   endif(VIDEO_RPI)
1086 endmacro(CheckRPI)