sdl

FORK: Simple Directmedia Layer
git clone https://git.neptards.moe/neptards/sdl.git
Log | Files | Refs

sdlchecks.cmake (38574B)


      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_symbol_exists(dlopen "dlfcn.h" 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_recover "" HAVE_LIBASOUND)
    109     endif()
    110     if(HAVE_LIBASOUND)
    111       set(HAVE_ALSA TRUE)
    112       file(GLOB ALSA_SOURCES ${SDL2_SOURCE_DIR}/src/audio/alsa/*.c)
    113       set(SOURCE_FILES ${SOURCE_FILES} ${ALSA_SOURCES})
    114       set(SDL_AUDIO_DRIVER_ALSA 1)
    115       if(ALSA_SHARED)
    116         if(NOT HAVE_DLOPEN)
    117           message_warn("You must have SDL_LoadObject() support for dynamic ALSA loading")
    118         else()
    119           FindLibraryAndSONAME("asound")
    120           set(SDL_AUDIO_DRIVER_ALSA_DYNAMIC "\"${ASOUND_LIB_SONAME}\"")
    121           set(HAVE_ALSA_SHARED TRUE)
    122         endif()
    123       else()
    124         list(APPEND EXTRA_LIBS asound)
    125       endif()
    126       set(HAVE_SDL_AUDIO TRUE)
    127     endif()
    128   endif()
    129 endmacro()
    130 
    131 # Requires:
    132 # - PkgCheckModules
    133 # Optional:
    134 # - PULSEAUDIO_SHARED opt
    135 # - HAVE_DLOPEN opt
    136 macro(CheckPulseAudio)
    137   if(PULSEAUDIO)
    138     pkg_check_modules(PKG_PULSEAUDIO libpulse-simple)
    139     if(PKG_PULSEAUDIO_FOUND)
    140       set(HAVE_PULSEAUDIO TRUE)
    141       file(GLOB PULSEAUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/pulseaudio/*.c)
    142       set(SOURCE_FILES ${SOURCE_FILES} ${PULSEAUDIO_SOURCES})
    143       set(SDL_AUDIO_DRIVER_PULSEAUDIO 1)
    144       list(APPEND EXTRA_CFLAGS ${PKG_PULSEAUDIO_CFLAGS})
    145       if(PULSEAUDIO_SHARED)
    146         if(NOT HAVE_DLOPEN)
    147           message_warn("You must have SDL_LoadObject() support for dynamic PulseAudio loading")
    148         else()
    149           FindLibraryAndSONAME("pulse-simple")
    150           set(SDL_AUDIO_DRIVER_PULSEAUDIO_DYNAMIC "\"${PULSE_SIMPLE_LIB_SONAME}\"")
    151           set(HAVE_PULSEAUDIO_SHARED TRUE)
    152         endif()
    153       else()
    154         list(APPEND EXTRA_LDFLAGS ${PKG_PULSEAUDIO_LDFLAGS})
    155       endif()
    156       set(HAVE_SDL_AUDIO TRUE)
    157     endif()
    158   endif()
    159 endmacro()
    160 
    161 # Requires:
    162 # - PkgCheckModules
    163 # Optional:
    164 # - JACK_SHARED opt
    165 # - HAVE_DLOPEN opt
    166 macro(CheckJACK)
    167   if(JACK)
    168     pkg_check_modules(PKG_JACK jack)
    169     if(PKG_JACK_FOUND)
    170       set(HAVE_JACK TRUE)
    171       file(GLOB JACK_SOURCES ${SDL2_SOURCE_DIR}/src/audio/jack/*.c)
    172       set(SOURCE_FILES ${SOURCE_FILES} ${JACK_SOURCES})
    173       set(SDL_AUDIO_DRIVER_JACK 1)
    174       list(APPEND EXTRA_CFLAGS ${PKG_JACK_CFLAGS})
    175       if(JACK_SHARED)
    176         if(NOT HAVE_DLOPEN)
    177           message_warn("You must have SDL_LoadObject() support for dynamic JACK audio loading")
    178         else()
    179           FindLibraryAndSONAME("jack")
    180           set(SDL_AUDIO_DRIVER_JACK_DYNAMIC "\"${JACK_LIB_SONAME}\"")
    181           set(HAVE_JACK_SHARED TRUE)
    182         endif()
    183       else()
    184         list(APPEND EXTRA_LDFLAGS ${PKG_JACK_LDFLAGS})
    185       endif()
    186       set(HAVE_SDL_AUDIO TRUE)
    187     endif()
    188   endif()
    189 endmacro()
    190 
    191 # Requires:
    192 # - PkgCheckModules
    193 # Optional:
    194 # - ESD_SHARED opt
    195 # - HAVE_DLOPEN opt
    196 macro(CheckESD)
    197   if(ESD)
    198     pkg_check_modules(PKG_ESD esound)
    199     if(PKG_ESD_FOUND)
    200       set(HAVE_ESD TRUE)
    201       file(GLOB ESD_SOURCES ${SDL2_SOURCE_DIR}/src/audio/esd/*.c)
    202       set(SOURCE_FILES ${SOURCE_FILES} ${ESD_SOURCES})
    203       set(SDL_AUDIO_DRIVER_ESD 1)
    204       list(APPEND EXTRA_CFLAGS ${PKG_ESD_CFLAGS})
    205       if(ESD_SHARED)
    206         if(NOT HAVE_DLOPEN)
    207           message_warn("You must have SDL_LoadObject() support for dynamic ESD loading")
    208         else()
    209           FindLibraryAndSONAME(esd)
    210           set(SDL_AUDIO_DRIVER_ESD_DYNAMIC "\"${ESD_LIB_SONAME}\"")
    211           set(HAVE_ESD_SHARED TRUE)
    212         endif()
    213       else()
    214         list(APPEND EXTRA_LDFLAGS ${PKG_ESD_LDFLAGS})
    215       endif()
    216       set(HAVE_SDL_AUDIO TRUE)
    217     endif()
    218   endif()
    219 endmacro()
    220 
    221 # Requires:
    222 # - n/a
    223 # Optional:
    224 # - ARTS_SHARED opt
    225 # - HAVE_DLOPEN opt
    226 macro(CheckARTS)
    227   if(ARTS)
    228     find_program(ARTS_CONFIG arts-config)
    229     if(ARTS_CONFIG)
    230       execute_process(CMD_ARTSCFLAGS ${ARTS_CONFIG} --cflags
    231         OUTPUT_VARIABLE ARTS_CFLAGS OUTPUT_STRIP_TRAILING_WHITESPACE)
    232       list(APPEND EXTRA_CFLAGS ${ARTS_CFLAGS})
    233       execute_process(CMD_ARTSLIBS ${ARTS_CONFIG} --libs
    234         OUTPUT_VARIABLE ARTS_LIBS OUTPUT_STRIP_TRAILING_WHITESPACE)
    235       file(GLOB ARTS_SOURCES ${SDL2_SOURCE_DIR}/src/audio/arts/*.c)
    236       set(SOURCE_FILES ${SOURCE_FILES} ${ARTS_SOURCES})
    237       set(SDL_AUDIO_DRIVER_ARTS 1)
    238       set(HAVE_ARTS TRUE)
    239       if(ARTS_SHARED)
    240         if(NOT HAVE_DLOPEN)
    241           message_warn("You must have SDL_LoadObject() support for dynamic ARTS loading")
    242         else()
    243           # TODO
    244           FindLibraryAndSONAME(artsc)
    245           set(SDL_AUDIO_DRIVER_ARTS_DYNAMIC "\"${ARTSC_LIB_SONAME}\"")
    246           set(HAVE_ARTS_SHARED TRUE)
    247         endif()
    248       else()
    249         list(APPEND EXTRA_LDFLAGS ${ARTS_LIBS})
    250       endif()
    251       set(HAVE_SDL_AUDIO TRUE)
    252     endif()
    253   endif()
    254 endmacro()
    255 
    256 # Requires:
    257 # - n/a
    258 # Optional:
    259 # - NAS_SHARED opt
    260 # - HAVE_DLOPEN opt
    261 macro(CheckNAS)
    262   if(NAS)
    263     # TODO: set include paths properly, so the NAS headers are found
    264     check_include_file(audio/audiolib.h HAVE_NAS_H)
    265     find_library(D_NAS_LIB audio)
    266     if(HAVE_NAS_H AND D_NAS_LIB)
    267       set(HAVE_NAS TRUE)
    268       file(GLOB NAS_SOURCES ${SDL2_SOURCE_DIR}/src/audio/nas/*.c)
    269       set(SOURCE_FILES ${SOURCE_FILES} ${NAS_SOURCES})
    270       set(SDL_AUDIO_DRIVER_NAS 1)
    271       if(NAS_SHARED)
    272         if(NOT HAVE_DLOPEN)
    273           message_warn("You must have SDL_LoadObject() support for dynamic NAS loading")
    274         else()
    275           FindLibraryAndSONAME("audio")
    276           set(SDL_AUDIO_DRIVER_NAS_DYNAMIC "\"${AUDIO_LIB_SONAME}\"")
    277           set(HAVE_NAS_SHARED TRUE)
    278         endif()
    279       else()
    280         list(APPEND EXTRA_LIBS ${D_NAS_LIB})
    281       endif()
    282       set(HAVE_SDL_AUDIO TRUE)
    283     endif()
    284   endif()
    285 endmacro()
    286 
    287 # Requires:
    288 # - n/a
    289 # Optional:
    290 # - SNDIO_SHARED opt
    291 # - HAVE_DLOPEN opt
    292 macro(CheckSNDIO)
    293   if(SNDIO)
    294     # TODO: set include paths properly, so the sndio headers are found
    295     check_include_file(sndio.h HAVE_SNDIO_H)
    296     find_library(D_SNDIO_LIB sndio)
    297     if(HAVE_SNDIO_H AND D_SNDIO_LIB)
    298       set(HAVE_SNDIO TRUE)
    299       file(GLOB SNDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/sndio/*.c)
    300       set(SOURCE_FILES ${SOURCE_FILES} ${SNDIO_SOURCES})
    301       set(SDL_AUDIO_DRIVER_SNDIO 1)
    302       if(SNDIO_SHARED)
    303         if(NOT HAVE_DLOPEN)
    304           message_warn("You must have SDL_LoadObject() support for dynamic sndio loading")
    305         else()
    306           FindLibraryAndSONAME("sndio")
    307           set(SDL_AUDIO_DRIVER_SNDIO_DYNAMIC "\"${SNDIO_LIB_SONAME}\"")
    308           set(HAVE_SNDIO_SHARED TRUE)
    309         endif()
    310       else()
    311         list(APPEND EXTRA_LIBS ${D_SNDIO_LIB})
    312       endif()
    313       set(HAVE_SDL_AUDIO TRUE)
    314     endif()
    315   endif()
    316 endmacro()
    317 
    318 # Requires:
    319 # - PkgCheckModules
    320 # Optional:
    321 # - FUSIONSOUND_SHARED opt
    322 # - HAVE_DLOPEN opt
    323 macro(CheckFusionSound)
    324   if(FUSIONSOUND)
    325     pkg_check_modules(PKG_FUSIONSOUND fusionsound>=1.0.0)
    326     if(PKG_FUSIONSOUND_FOUND)
    327       set(HAVE_FUSIONSOUND TRUE)
    328       file(GLOB FUSIONSOUND_SOURCES ${SDL2_SOURCE_DIR}/src/audio/fusionsound/*.c)
    329       set(SOURCE_FILES ${SOURCE_FILES} ${FUSIONSOUND_SOURCES})
    330       set(SDL_AUDIO_DRIVER_FUSIONSOUND 1)
    331       list(APPEND EXTRA_CFLAGS ${PKG_FUSIONSOUND_CFLAGS})
    332       if(FUSIONSOUND_SHARED)
    333         if(NOT HAVE_DLOPEN)
    334           message_warn("You must have SDL_LoadObject() support for dynamic FusionSound loading")
    335         else()
    336           FindLibraryAndSONAME("fusionsound")
    337           set(SDL_AUDIO_DRIVER_FUSIONSOUND_DYNAMIC "\"${FUSIONSOUND_LIB_SONAME}\"")
    338           set(HAVE_FUSIONSOUND_SHARED TRUE)
    339         endif()
    340       else()
    341         list(APPEND EXTRA_LDFLAGS ${PKG_FUSIONSOUND_LDFLAGS})
    342       endif()
    343       set(HAVE_SDL_AUDIO TRUE)
    344     endif()
    345   endif()
    346 endmacro()
    347 
    348 # Requires:
    349 # - LIBSAMPLERATE
    350 # Optional:
    351 # - LIBSAMPLERATE_SHARED opt
    352 # - HAVE_DLOPEN opt
    353 macro(CheckLibSampleRate)
    354   if(LIBSAMPLERATE)
    355     check_include_file(samplerate.h HAVE_LIBSAMPLERATE_H)
    356     if(HAVE_LIBSAMPLERATE_H)
    357       set(HAVE_LIBSAMPLERATE TRUE)
    358       if(LIBSAMPLERATE_SHARED)
    359         if(NOT HAVE_DLOPEN)
    360           message_warn("You must have SDL_LoadObject() support for dynamic libsamplerate loading")
    361         else()
    362           FindLibraryAndSONAME("samplerate")
    363           set(SDL_LIBSAMPLERATE_DYNAMIC "\"${SAMPLERATE_LIB_SONAME}\"")
    364           set(HAVE_LIBSAMPLERATE_SHARED TRUE)
    365         endif()
    366       else()
    367         list(APPEND EXTRA_LDFLAGS -lsamplerate)
    368       endif()
    369     endif()
    370   endif()
    371 endmacro()
    372 
    373 # Requires:
    374 # - n/a
    375 # Optional:
    376 # - X11_SHARED opt
    377 # - HAVE_DLOPEN opt
    378 macro(CheckX11)
    379   if(VIDEO_X11)
    380     foreach(_LIB X11 Xext Xcursor Xinerama Xi Xrandr Xrender Xss Xxf86vm)
    381         FindLibraryAndSONAME("${_LIB}")
    382     endforeach()
    383 
    384     find_path(X_INCLUDEDIR X11/Xlib.h
    385         /usr/pkg/xorg/include
    386         /usr/X11R6/include
    387         /usr/X11R7/include
    388         /usr/local/include/X11
    389         /usr/include/X11
    390         /usr/openwin/include
    391         /usr/openwin/share/include
    392         /opt/graphics/OpenGL/include
    393         /opt/X11/include
    394     )
    395 
    396     if(X_INCLUDEDIR)
    397       list(APPEND EXTRA_CFLAGS "-I${X_INCLUDEDIR}")
    398       list(APPEND CMAKE_REQUIRED_INCLUDES "${X_INCLUDEDIR}")
    399     endif()
    400 
    401     check_include_file(X11/Xcursor/Xcursor.h HAVE_XCURSOR_H)
    402     check_include_file(X11/extensions/Xinerama.h HAVE_XINERAMA_H)
    403     check_include_file(X11/extensions/XInput2.h HAVE_XINPUT_H)
    404     check_include_file(X11/extensions/Xrandr.h HAVE_XRANDR_H)
    405     check_include_file(X11/extensions/Xrender.h HAVE_XRENDER_H)
    406     check_include_file(X11/extensions/scrnsaver.h HAVE_XSS_H)
    407     check_include_file(X11/extensions/shape.h HAVE_XSHAPE_H)
    408     check_include_files("X11/Xlib.h;X11/extensions/xf86vmode.h" HAVE_XF86VM_H)
    409     check_include_files("X11/Xlib.h;X11/Xproto.h;X11/extensions/Xext.h" HAVE_XEXT_H)
    410 
    411     if(X11_LIB)
    412       if(NOT HAVE_XEXT_H)
    413         message_error("Missing Xext.h, maybe you need to install the libxext-dev package?")
    414       endif()
    415 
    416       set(HAVE_VIDEO_X11 TRUE)
    417       set(HAVE_SDL_VIDEO TRUE)
    418 
    419       file(GLOB X11_SOURCES ${SDL2_SOURCE_DIR}/src/video/x11/*.c)
    420       set(SOURCE_FILES ${SOURCE_FILES} ${X11_SOURCES})
    421       set(SDL_VIDEO_DRIVER_X11 1)
    422 
    423       if(APPLE)
    424         set(X11_SHARED OFF)
    425       endif()
    426 
    427       check_symbol_exists(shmat "sys/shm.h" HAVE_SHMAT)
    428       if(NOT HAVE_SHMAT)
    429         check_library_exists(ipc shmat "" HAVE_SHMAT)
    430         if(HAVE_SHMAT)
    431           list(APPEND EXTRA_LIBS ipc)
    432         endif()
    433         if(NOT HAVE_SHMAT)
    434           add_definitions(-DNO_SHARED_MEMORY)
    435           list(APPEND EXTRA_CFLAGS "-DNO_SHARED_MEMORY")
    436         endif()
    437       endif()
    438 
    439       if(X11_SHARED)
    440         if(NOT HAVE_DLOPEN)
    441           message_warn("You must have SDL_LoadObject() support for dynamic X11 loading")
    442           set(HAVE_X11_SHARED FALSE)
    443         else()
    444           set(HAVE_X11_SHARED TRUE)
    445         endif()
    446         if(HAVE_X11_SHARED)
    447           set(SDL_VIDEO_DRIVER_X11_DYNAMIC "\"${X11_LIB_SONAME}\"")
    448           set(SDL_VIDEO_DRIVER_X11_DYNAMIC_XEXT "\"${XEXT_LIB_SONAME}\"")
    449         else()
    450           list(APPEND EXTRA_LIBS ${X11_LIB} ${XEXT_LIB})
    451         endif()
    452       endif()
    453 
    454       set(CMAKE_REQUIRED_LIBRARIES ${X11_LIB} ${X11_LIB})
    455       check_c_source_compiles("
    456           #include <X11/Xlib.h>
    457           #include <X11/Xproto.h>
    458           #include <X11/extensions/Xext.h>
    459           #include <X11/extensions/extutil.h>
    460           extern XExtDisplayInfo* XextAddDisplay(XExtensionInfo* a,Display* b,_Xconst char* c,XExtensionHooks* d,int e,XPointer f);
    461           int main(int argc, char **argv) {}" HAVE_CONST_XEXT_ADDDISPLAY)
    462       if(HAVE_CONST_XEXT_ADDDISPLAY)
    463         set(SDL_VIDEO_DRIVER_X11_CONST_PARAM_XEXTADDDISPLAY 1)
    464       endif()
    465 
    466       check_c_source_compiles("
    467           #include <X11/Xlib.h>
    468           int main(int argc, char **argv) {
    469             Display *display;
    470             XEvent event;
    471             XGenericEventCookie *cookie = &event.xcookie;
    472             XNextEvent(display, &event);
    473             XGetEventData(display, cookie);
    474             XFreeEventData(display, cookie); }" HAVE_XGENERICEVENT)
    475       if(HAVE_XGENERICEVENT)
    476         set(SDL_VIDEO_DRIVER_X11_SUPPORTS_GENERIC_EVENTS 1)
    477       endif()
    478 
    479       check_symbol_exists(XkbKeycodeToKeysym "X11/Xlib.h;X11/XKBlib.h" SDL_VIDEO_DRIVER_X11_HAS_XKBKEYCODETOKEYSYM)
    480 
    481       if(VIDEO_X11_XCURSOR AND HAVE_XCURSOR_H)
    482         set(HAVE_VIDEO_X11_XCURSOR TRUE)
    483         if(HAVE_X11_SHARED AND XCURSOR_LIB)
    484           set(SDL_VIDEO_DRIVER_X11_DYNAMIC_XCURSOR "\"${XCURSOR_LIB_SONAME}\"")
    485         else()
    486           list(APPEND EXTRA_LIBS ${XCURSOR_LIB})
    487         endif()
    488         set(SDL_VIDEO_DRIVER_X11_XCURSOR 1)
    489       endif()
    490 
    491       if(VIDEO_X11_XINERAMA AND HAVE_XINERAMA_H)
    492         set(HAVE_VIDEO_X11_XINERAMA TRUE)
    493         if(HAVE_X11_SHARED AND XINERAMA_LIB)
    494           set(SDL_VIDEO_DRIVER_X11_DYNAMIC_XINERAMA "\"${XINERAMA_LIB_SONAME}\"")
    495         else()
    496           list(APPEND EXTRA_LIBS ${XINERAMA_LIB})
    497         endif()
    498         set(SDL_VIDEO_DRIVER_X11_XINERAMA 1)
    499       endif()
    500 
    501       if(VIDEO_X11_XINPUT AND HAVE_XINPUT_H)
    502         set(HAVE_VIDEO_X11_XINPUT TRUE)
    503         if(HAVE_X11_SHARED AND XI_LIB)
    504           set(SDL_VIDEO_DRIVER_X11_DYNAMIC_XINPUT2 "\"${XI_LIB_SONAME}\"")
    505         else()
    506           list(APPEND EXTRA_LIBS ${XI_LIB})
    507         endif()
    508         set(SDL_VIDEO_DRIVER_X11_XINPUT2 1)
    509 
    510         # Check for multitouch
    511         check_c_source_compiles("
    512             #include <X11/Xlib.h>
    513             #include <X11/Xproto.h>
    514             #include <X11/extensions/XInput2.h>
    515             int event_type = XI_TouchBegin;
    516             XITouchClassInfo *t;
    517             Status XIAllowTouchEvents(Display *a,int b,unsigned int c,Window d,int f)
    518             {
    519               return (Status)0;
    520             }
    521             int main(int argc, char **argv) {}" HAVE_XINPUT2_MULTITOUCH)
    522         if(HAVE_XINPUT2_MULTITOUCH)
    523           set(SDL_VIDEO_DRIVER_X11_XINPUT2_SUPPORTS_MULTITOUCH 1)
    524         endif()
    525       endif()
    526 
    527       if(VIDEO_X11_XRANDR AND HAVE_XRANDR_H)
    528         if(HAVE_X11_SHARED AND XRANDR_LIB)
    529           set(SDL_VIDEO_DRIVER_X11_DYNAMIC_XRANDR "\"${XRANDR_LIB_SONAME}\"")
    530         else()
    531           list(APPEND EXTRA_LIBS ${XRANDR_LIB})
    532         endif()
    533         set(SDL_VIDEO_DRIVER_X11_XRANDR 1)
    534         set(HAVE_VIDEO_X11_XRANDR TRUE)
    535       endif()
    536 
    537       if(VIDEO_X11_XSCRNSAVER AND HAVE_XSS_H)
    538         if(HAVE_X11_SHARED AND XSS_LIB)
    539           set(SDL_VIDEO_DRIVER_X11_DYNAMIC_XSS "\"${XSS_LIB_SONAME}\"")
    540         else()
    541           list(APPEND EXTRA_LIBS ${XSS_LIB})
    542         endif()
    543         set(SDL_VIDEO_DRIVER_X11_XSCRNSAVER 1)
    544         set(HAVE_VIDEO_X11_XSCRNSAVER TRUE)
    545       endif()
    546 
    547       if(VIDEO_X11_XSHAPE AND HAVE_XSHAPE_H)
    548         set(SDL_VIDEO_DRIVER_X11_XSHAPE 1)
    549         set(HAVE_VIDEO_X11_XSHAPE TRUE)
    550       endif()
    551 
    552       if(VIDEO_X11_XVM AND HAVE_XF86VM_H)
    553         if(HAVE_X11_SHARED AND XXF86VM_LIB)
    554           set(SDL_VIDEO_DRIVER_X11_DYNAMIC_XVIDMODE "\"${XXF86VM_LIB_SONAME}\"")
    555         else()
    556           list(APPEND EXTRA_LIBS ${XXF86VM_LIB})
    557         endif()
    558         set(SDL_VIDEO_DRIVER_X11_XVIDMODE 1)
    559         set(HAVE_VIDEO_X11_XVM TRUE)
    560       endif()
    561 
    562       set(CMAKE_REQUIRED_LIBRARIES)
    563     endif()
    564   endif()
    565 endmacro()
    566 
    567 macro(WaylandProtocolGen _SCANNER _XML _PROTL)
    568     set(_WAYLAND_PROT_C_CODE "${CMAKE_CURRENT_BINARY_DIR}/wayland-generated-protocols/${_PROTL}-protocol.c")
    569     set(_WAYLAND_PROT_H_CODE "${CMAKE_CURRENT_BINARY_DIR}/wayland-generated-protocols/${_PROTL}-client-protocol.h")
    570 
    571     add_custom_command(
    572         OUTPUT "${_WAYLAND_PROT_H_CODE}"
    573         DEPENDS "${_XML}"
    574         COMMAND "${_SCANNER}"
    575         ARGS client-header "${_XML}" "${_WAYLAND_PROT_H_CODE}"
    576     )
    577 
    578     add_custom_command(
    579         OUTPUT "${_WAYLAND_PROT_C_CODE}"
    580         DEPENDS "${_WAYLAND_PROT_H_CODE}"
    581         COMMAND "${_SCANNER}"
    582         ARGS code "${_XML}" "${_WAYLAND_PROT_C_CODE}"
    583     )
    584 
    585     set(SOURCE_FILES ${SOURCE_FILES} "${_WAYLAND_PROT_C_CODE}")
    586 endmacro()
    587 
    588 # Requires:
    589 # - EGL
    590 # - PkgCheckModules
    591 # Optional:
    592 # - WAYLAND_SHARED opt
    593 # - HAVE_DLOPEN opt
    594 macro(CheckWayland)
    595   if(VIDEO_WAYLAND)
    596     pkg_check_modules(WAYLAND wayland-client wayland-scanner wayland-egl wayland-cursor egl xkbcommon)
    597 
    598     if(WAYLAND_FOUND)
    599       execute_process(
    600         COMMAND ${PKG_CONFIG_EXECUTABLE} --variable=wayland_scanner wayland-scanner
    601         WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}"
    602         RESULT_VARIABLE WAYLAND_SCANNER_RC
    603         OUTPUT_VARIABLE WAYLAND_SCANNER
    604         ERROR_QUIET
    605         OUTPUT_STRIP_TRAILING_WHITESPACE
    606       )
    607       if(NOT WAYLAND_SCANNER_RC EQUAL 0)
    608         set(WAYLAND_FOUND FALSE)
    609       endif()
    610     endif()
    611 
    612     if(WAYLAND_FOUND)
    613       link_directories(
    614           ${WAYLAND_LIBRARY_DIRS}
    615       )
    616       include_directories(
    617           ${WAYLAND_INCLUDE_DIRS}
    618       )
    619       set(HAVE_VIDEO_WAYLAND TRUE)
    620       set(HAVE_SDL_VIDEO TRUE)
    621 
    622       file(GLOB WAYLAND_SOURCES ${SDL2_SOURCE_DIR}/src/video/wayland/*.c)
    623       set(SOURCE_FILES ${SOURCE_FILES} ${WAYLAND_SOURCES})
    624 
    625       # We have to generate some protocol interface code for some unstable Wayland features.
    626       file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/wayland-generated-protocols")
    627       include_directories("${CMAKE_CURRENT_BINARY_DIR}/wayland-generated-protocols")
    628 
    629       file(GLOB WAYLAND_PROTOCOLS_XML RELATIVE "${SDL2_SOURCE_DIR}/wayland-protocols/" "${SDL2_SOURCE_DIR}/wayland-protocols/*.xml")
    630       foreach(_XML ${WAYLAND_PROTOCOLS_XML})
    631         string(REGEX REPLACE "\\.xml$" "" _PROTL "${_XML}")
    632         WaylandProtocolGen("${WAYLAND_SCANNER}" "${SDL2_SOURCE_DIR}/wayland-protocols/${_XML}" "${_PROTL}")
    633       endforeach()
    634 
    635       if(VIDEO_WAYLAND_QT_TOUCH)
    636           set(HAVE_VIDEO_WAYLAND_QT_TOUCH TRUE)
    637           set(SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH 1)
    638       endif()
    639 
    640       if(WAYLAND_SHARED)
    641         if(NOT HAVE_DLOPEN)
    642           message_warn("You must have SDL_LoadObject() support for dynamic Wayland loading")
    643         else()
    644           FindLibraryAndSONAME(wayland-client)
    645           FindLibraryAndSONAME(wayland-egl)
    646           FindLibraryAndSONAME(wayland-cursor)
    647           FindLibraryAndSONAME(xkbcommon)
    648           set(SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC "\"${WAYLAND_CLIENT_LIB_SONAME}\"")
    649           set(SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_EGL "\"${WAYLAND_EGL_LIB_SONAME}\"")
    650           set(SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_CURSOR "\"${WAYLAND_CURSOR_LIB_SONAME}\"")
    651           set(SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_XKBCOMMON "\"${XKBCOMMON_LIB_SONAME}\"")
    652           set(HAVE_WAYLAND_SHARED TRUE)
    653         endif()
    654       else()
    655         set(EXTRA_LIBS ${WAYLAND_LIBRARIES} ${EXTRA_LIBS})
    656       endif()
    657 
    658       set(SDL_VIDEO_DRIVER_WAYLAND 1)
    659     endif()
    660   endif()
    661 endmacro()
    662 
    663 # Requires:
    664 # - n/a
    665 #
    666 macro(CheckCOCOA)
    667   if(VIDEO_COCOA)
    668     if(APPLE) # Apple always has Cocoa.
    669       set(HAVE_VIDEO_COCOA TRUE)
    670     endif()
    671     if(HAVE_VIDEO_COCOA)
    672       file(GLOB COCOA_SOURCES ${SDL2_SOURCE_DIR}/src/video/cocoa/*.m)
    673       set_source_files_properties(${COCOA_SOURCES} PROPERTIES LANGUAGE C)
    674       set(SOURCE_FILES ${SOURCE_FILES} ${COCOA_SOURCES})
    675       set(SDL_VIDEO_DRIVER_COCOA 1)
    676       set(HAVE_SDL_VIDEO TRUE)
    677     endif()
    678   endif()
    679 endmacro()
    680 
    681 # Requires:
    682 # - PkgCheckModules
    683 # Optional:
    684 # - DIRECTFB_SHARED opt
    685 # - HAVE_DLOPEN opt
    686 macro(CheckDirectFB)
    687   if(VIDEO_DIRECTFB)
    688     pkg_check_modules(PKG_DIRECTFB directfb>=1.0.0)
    689     if(PKG_DIRECTFB_FOUND)
    690       set(HAVE_VIDEO_DIRECTFB TRUE)
    691       file(GLOB DIRECTFB_SOURCES ${SDL2_SOURCE_DIR}/src/video/directfb/*.c)
    692       set(SOURCE_FILES ${SOURCE_FILES} ${DIRECTFB_SOURCES})
    693       set(SDL_VIDEO_DRIVER_DIRECTFB 1)
    694       set(SDL_VIDEO_RENDER_DIRECTFB 1)
    695       list(APPEND EXTRA_CFLAGS ${PKG_DIRECTFB_CFLAGS})
    696       if(DIRECTFB_SHARED)
    697         if(NOT HAVE_DLOPEN)
    698           message_warn("You must have SDL_LoadObject() support for dynamic DirectFB loading")
    699         else()
    700           FindLibraryAndSONAME("directfb")
    701           set(SDL_VIDEO_DRIVER_DIRECTFB_DYNAMIC "\"${DIRECTFB_LIB_SONAME}\"")
    702           set(HAVE_DIRECTFB_SHARED TRUE)
    703         endif()
    704       else()
    705         list(APPEND EXTRA_LDFLAGS ${PKG_DIRECTFB_LDFLAGS})
    706       endif()
    707       set(HAVE_SDL_VIDEO TRUE)
    708     endif()
    709   endif()
    710 endmacro()
    711 
    712 # Requires:
    713 # - n/a
    714 macro(CheckVivante)
    715   if(VIDEO_VIVANTE)
    716     check_c_source_compiles("
    717         #include <gc_vdk.h>
    718         int main(int argc, char** argv) {}" HAVE_VIDEO_VIVANTE_VDK)
    719     check_c_source_compiles("
    720         #define LINUX
    721         #define EGL_API_FB
    722         #include <EGL/eglvivante.h>
    723         int main(int argc, char** argv) {}" HAVE_VIDEO_VIVANTE_EGL_FB)
    724     if(HAVE_VIDEO_VIVANTE_VDK OR HAVE_VIDEO_VIVANTE_EGL_FB)
    725       set(HAVE_VIDEO_VIVANTE TRUE)
    726       set(HAVE_SDL_VIDEO TRUE)
    727 
    728       file(GLOB VIVANTE_SOURCES ${SDL2_SOURCE_DIR}/src/video/vivante/*.c)
    729       set(SOURCE_FILES ${SOURCE_FILES} ${VIVANTE_SOURCES})
    730       set(SDL_VIDEO_DRIVER_VIVANTE 1)
    731       if(HAVE_VIDEO_VIVANTE_VDK)
    732         set(SDL_VIDEO_DRIVER_VIVANTE_VDK 1)
    733         list(APPEND EXTRA_LIBS VDK VIVANTE)
    734       else()
    735         set(SDL_CFLAGS "${SDL_CFLAGS} -DLINUX -DEGL_API_FB")
    736         list(APPEND EXTRA_LIBS EGL)
    737       endif(HAVE_VIDEO_VIVANTE_VDK)
    738     endif(HAVE_VIDEO_VIVANTE_VDK OR HAVE_VIDEO_VIVANTE_EGL_FB)
    739   endif(VIDEO_VIVANTE)
    740 endmacro(CheckVivante)
    741 
    742 # Requires:
    743 # - nada
    744 macro(CheckOpenGLX11)
    745   if(VIDEO_OPENGL)
    746     check_c_source_compiles("
    747         #include <GL/gl.h>
    748         #include <GL/glx.h>
    749         int main(int argc, char** argv) {}" HAVE_VIDEO_OPENGL)
    750 
    751     if(HAVE_VIDEO_OPENGL)
    752       set(HAVE_VIDEO_OPENGL TRUE)
    753       set(SDL_VIDEO_OPENGL 1)
    754       set(SDL_VIDEO_OPENGL_GLX 1)
    755       set(SDL_VIDEO_RENDER_OGL 1)
    756     endif()
    757   endif()
    758 endmacro()
    759 
    760 # Requires:
    761 # - PkgCheckModules
    762 macro(CheckOpenGLESX11)
    763   pkg_check_modules(EGL egl)
    764   set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} ${EGL_CFLAGS}")
    765   if(VIDEO_OPENGLES)
    766     check_c_source_compiles("
    767         #define EGL_API_FB
    768         #include <EGL/egl.h>
    769         int main (int argc, char** argv) {}" HAVE_VIDEO_OPENGL_EGL)
    770     if(HAVE_VIDEO_OPENGL_EGL)
    771         set(SDL_VIDEO_OPENGL_EGL 1)
    772     endif()
    773     check_c_source_compiles("
    774       #include <GLES/gl.h>
    775       #include <GLES/glext.h>
    776       int main (int argc, char** argv) {}" HAVE_VIDEO_OPENGLES_V1)
    777     if(HAVE_VIDEO_OPENGLES_V1)
    778         set(HAVE_VIDEO_OPENGLES TRUE)
    779         set(SDL_VIDEO_OPENGL_ES 1)
    780         set(SDL_VIDEO_RENDER_OGL_ES 1)
    781     endif()
    782     check_c_source_compiles("
    783       #include <GLES2/gl2.h>
    784       #include <GLES2/gl2ext.h>
    785       int main (int argc, char** argv) {}" HAVE_VIDEO_OPENGLES_V2)
    786     if(HAVE_VIDEO_OPENGLES_V2)
    787         set(HAVE_VIDEO_OPENGLES TRUE)
    788         set(SDL_VIDEO_OPENGL_ES2 1)
    789         set(SDL_VIDEO_RENDER_OGL_ES2 1)
    790     endif()
    791 
    792   endif()
    793 endmacro()
    794 
    795 # Requires:
    796 # - nada
    797 # Optional:
    798 # - THREADS opt
    799 # Sets:
    800 # PTHREAD_CFLAGS
    801 # PTHREAD_LIBS
    802 macro(CheckPTHREAD)
    803   if(PTHREADS)
    804     if(ANDROID)
    805       # the android libc provides built-in support for pthreads, so no
    806       # additional linking or compile flags are necessary
    807     elseif(LINUX)
    808       set(PTHREAD_CFLAGS "-D_REENTRANT")
    809       set(PTHREAD_LDFLAGS "-pthread")
    810     elseif(BSDI)
    811       set(PTHREAD_CFLAGS "-D_REENTRANT -D_THREAD_SAFE")
    812       set(PTHREAD_LDFLAGS "")
    813     elseif(DARWIN)
    814       set(PTHREAD_CFLAGS "-D_THREAD_SAFE")
    815       # causes Carbon.p complaints?
    816       # set(PTHREAD_CFLAGS "-D_REENTRANT -D_THREAD_SAFE")
    817       set(PTHREAD_LDFLAGS "")
    818     elseif(FREEBSD)
    819       set(PTHREAD_CFLAGS "-D_REENTRANT -D_THREAD_SAFE")
    820       set(PTHREAD_LDFLAGS "-pthread")
    821     elseif(NETBSD)
    822       set(PTHREAD_CFLAGS "-D_REENTRANT -D_THREAD_SAFE")
    823       set(PTHREAD_LDFLAGS "-lpthread")
    824     elseif(OPENBSD)
    825       set(PTHREAD_CFLAGS "-D_REENTRANT")
    826       set(PTHREAD_LDFLAGS "-pthread")
    827     elseif(SOLARIS)
    828       set(PTHREAD_CFLAGS "-D_REENTRANT")
    829       set(PTHREAD_LDFLAGS "-pthread -lposix4")
    830     elseif(SYSV5)
    831       set(PTHREAD_CFLAGS "-D_REENTRANT -Kthread")
    832       set(PTHREAD_LDFLAGS "")
    833     elseif(AIX)
    834       set(PTHREAD_CFLAGS "-D_REENTRANT -mthreads")
    835       set(PTHREAD_LDFLAGS "-pthread")
    836     elseif(HPUX)
    837       set(PTHREAD_CFLAGS "-D_REENTRANT")
    838       set(PTHREAD_LDFLAGS "-L/usr/lib -pthread")
    839     elseif(HAIKU)
    840       set(PTHREAD_CFLAGS "-D_REENTRANT")
    841       set(PTHREAD_LDFLAGS "")
    842     else()
    843       set(PTHREAD_CFLAGS "-D_REENTRANT")
    844       set(PTHREAD_LDFLAGS "-lpthread")
    845     endif()
    846 
    847     # Run some tests
    848     set(ORIG_CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}")
    849     set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} ${PTHREAD_CFLAGS} ${PTHREAD_LDFLAGS}")
    850     if(CMAKE_CROSSCOMPILING)
    851       set(HAVE_PTHREADS 1)
    852     else()
    853       check_c_source_runs("
    854         #include <pthread.h>
    855         int main(int argc, char** argv) {
    856           pthread_attr_t type;
    857           pthread_attr_init(&type);
    858           return 0;
    859         }" HAVE_PTHREADS)
    860     endif()
    861     if(HAVE_PTHREADS)
    862       set(SDL_THREAD_PTHREAD 1)
    863       list(APPEND EXTRA_CFLAGS ${PTHREAD_CFLAGS})
    864       list(APPEND EXTRA_LDFLAGS ${PTHREAD_LDFLAGS})
    865       set(SDL_CFLAGS "${SDL_CFLAGS} ${PTHREAD_CFLAGS}")
    866       list(APPEND SDL_LIBS ${PTHREAD_LDFLAGS})
    867 
    868       check_c_source_compiles("
    869         #include <pthread.h>
    870         int main(int argc, char **argv) {
    871           pthread_mutexattr_t attr;
    872           pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
    873           return 0;
    874         }" HAVE_RECURSIVE_MUTEXES)
    875       if(HAVE_RECURSIVE_MUTEXES)
    876         set(SDL_THREAD_PTHREAD_RECURSIVE_MUTEX 1)
    877       else()
    878         check_c_source_compiles("
    879             #include <pthread.h>
    880             int main(int argc, char **argv) {
    881               pthread_mutexattr_t attr;
    882               pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE_NP);
    883               return 0;
    884             }" HAVE_RECURSIVE_MUTEXES_NP)
    885         if(HAVE_RECURSIVE_MUTEXES_NP)
    886           set(SDL_THREAD_PTHREAD_RECURSIVE_MUTEX_NP 1)
    887         endif()
    888       endif()
    889 
    890       if(PTHREADS_SEM)
    891         check_c_source_compiles("#include <pthread.h>
    892                                  #include <semaphore.h>
    893                                  int main(int argc, char **argv) { return 0; }" HAVE_PTHREADS_SEM)
    894         if(HAVE_PTHREADS_SEM)
    895           check_c_source_compiles("
    896               #include <pthread.h>
    897               #include <semaphore.h>
    898               int main(int argc, char **argv) {
    899                   sem_timedwait(NULL, NULL);
    900                   return 0;
    901               }" HAVE_SEM_TIMEDWAIT)
    902         endif()
    903       endif()
    904 
    905       check_include_files("pthread.h" HAVE_PTHREAD_H)
    906       check_include_files("pthread_np.h" HAVE_PTHREAD_NP_H)
    907       if (HAVE_PTHREAD_H)
    908         check_symbol_exists(pthread_setname_np "pthread.h" HAVE_PTHREAD_SETNAME_NP)
    909         if (HAVE_PTHREAD_NP_H)
    910           check_symbol_exists(pthread_set_name_np "pthread.h;pthread_np.h" HAVE_PTHREAD_SET_NAME_NP)
    911         endif()
    912       endif()
    913 
    914       set(SOURCE_FILES ${SOURCE_FILES}
    915           ${SDL2_SOURCE_DIR}/src/thread/pthread/SDL_systhread.c
    916           ${SDL2_SOURCE_DIR}/src/thread/pthread/SDL_sysmutex.c   # Can be faked, if necessary
    917           ${SDL2_SOURCE_DIR}/src/thread/pthread/SDL_syscond.c    # Can be faked, if necessary
    918           ${SDL2_SOURCE_DIR}/src/thread/pthread/SDL_systls.c
    919           )
    920       if(HAVE_PTHREADS_SEM)
    921         set(SOURCE_FILES ${SOURCE_FILES}
    922             ${SDL2_SOURCE_DIR}/src/thread/pthread/SDL_syssem.c)
    923       else()
    924         set(SOURCE_FILES ${SOURCE_FILES}
    925             ${SDL2_SOURCE_DIR}/src/thread/generic/SDL_syssem.c)
    926       endif()
    927       set(HAVE_SDL_THREADS TRUE)
    928     endif()
    929     set(CMAKE_REQUIRED_FLAGS "${ORIG_CMAKE_REQUIRED_FLAGS}")
    930   endif()
    931 endmacro()
    932 
    933 # Requires
    934 # - nada
    935 # Optional:
    936 # Sets:
    937 # USB_LIBS
    938 # USB_CFLAGS
    939 macro(CheckUSBHID)
    940   check_library_exists(usbhid hid_init "" LIBUSBHID)
    941   if(LIBUSBHID)
    942     check_include_file(usbhid.h HAVE_USBHID_H)
    943     if(HAVE_USBHID_H)
    944       set(USB_CFLAGS "-DHAVE_USBHID_H")
    945     endif()
    946 
    947     check_include_file(libusbhid.h HAVE_LIBUSBHID_H)
    948     if(HAVE_LIBUSBHID_H)
    949       set(USB_CFLAGS "${USB_CFLAGS} -DHAVE_LIBUSBHID_H")
    950     endif()
    951     set(USB_LIBS ${USB_LIBS} usbhid)
    952   else()
    953     check_include_file(usb.h HAVE_USB_H)
    954     if(HAVE_USB_H)
    955       set(USB_CFLAGS "-DHAVE_USB_H")
    956     endif()
    957     check_include_file(libusb.h HAVE_LIBUSB_H)
    958     if(HAVE_LIBUSB_H)
    959       set(USB_CFLAGS "${USB_CFLAGS} -DHAVE_LIBUSB_H")
    960     endif()
    961     check_library_exists(usb hid_init "" LIBUSB)
    962     if(LIBUSB)
    963       set(USB_LIBS ${USB_LIBS} usb)
    964     endif()
    965   endif()
    966 
    967   set(ORIG_CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}")
    968   set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} ${USB_CFLAGS}")
    969   set(CMAKE_REQUIRED_LIBRARIES "${USB_LIBS}")
    970   check_c_source_compiles("
    971        #include <sys/types.h>
    972         #if defined(HAVE_USB_H)
    973         #include <usb.h>
    974         #endif
    975         #ifdef __DragonFly__
    976         # include <bus/u4b/usb.h>
    977         # include <bus/u4b/usbhid.h>
    978         #else
    979         # include <dev/usb/usb.h>
    980         # include <dev/usb/usbhid.h>
    981         #endif
    982         #if defined(HAVE_USBHID_H)
    983         #include <usbhid.h>
    984         #elif defined(HAVE_LIBUSB_H)
    985         #include <libusb.h>
    986         #elif defined(HAVE_LIBUSBHID_H)
    987         #include <libusbhid.h>
    988         #endif
    989         int main(int argc, char **argv) {
    990           struct report_desc *repdesc;
    991           struct usb_ctl_report *repbuf;
    992           hid_kind_t hidkind;
    993           return 0;
    994         }" HAVE_USBHID)
    995   if(HAVE_USBHID)
    996     check_c_source_compiles("
    997           #include <sys/types.h>
    998           #if defined(HAVE_USB_H)
    999           #include <usb.h>
   1000           #endif
   1001           #ifdef __DragonFly__
   1002           # include <bus/u4b/usb.h>
   1003           # include <bus/u4b/usbhid.h>
   1004           #else
   1005           # include <dev/usb/usb.h>
   1006           # include <dev/usb/usbhid.h>
   1007           #endif
   1008           #if defined(HAVE_USBHID_H)
   1009           #include <usbhid.h>
   1010           #elif defined(HAVE_LIBUSB_H)
   1011           #include <libusb.h>
   1012           #elif defined(HAVE_LIBUSBHID_H)
   1013           #include <libusbhid.h>
   1014           #endif
   1015           int main(int argc, char** argv) {
   1016             struct usb_ctl_report buf;
   1017             if (buf.ucr_data) { }
   1018             return 0;
   1019           }" HAVE_USBHID_UCR_DATA)
   1020     if(HAVE_USBHID_UCR_DATA)
   1021       set(USB_CFLAGS "${USB_CFLAGS} -DUSBHID_UCR_DATA")
   1022     endif()
   1023 
   1024     check_c_source_compiles("
   1025           #include <sys/types.h>
   1026           #if defined(HAVE_USB_H)
   1027           #include <usb.h>
   1028           #endif
   1029           #ifdef __DragonFly__
   1030           #include <bus/u4b/usb.h>
   1031           #include <bus/u4b/usbhid.h>
   1032           #else
   1033           #include <dev/usb/usb.h>
   1034           #include <dev/usb/usbhid.h>
   1035           #endif
   1036           #if defined(HAVE_USBHID_H)
   1037           #include <usbhid.h>
   1038           #elif defined(HAVE_LIBUSB_H)
   1039           #include <libusb.h>
   1040           #elif defined(HAVE_LIBUSBHID_H)
   1041           #include <libusbhid.h>
   1042           #endif
   1043           int main(int argc, char **argv) {
   1044             report_desc_t d;
   1045             hid_start_parse(d, 1, 1);
   1046             return 0;
   1047           }" HAVE_USBHID_NEW)
   1048     if(HAVE_USBHID_NEW)
   1049       set(USB_CFLAGS "${USB_CFLAGS} -DUSBHID_NEW")
   1050     endif()
   1051 
   1052     check_c_source_compiles("
   1053         #include <machine/joystick.h>
   1054         int main(int argc, char** argv) {
   1055             struct joystick t;
   1056             return 0;
   1057         }" HAVE_MACHINE_JOYSTICK)
   1058     if(HAVE_MACHINE_JOYSTICK)
   1059       set(SDL_JOYSTICK_USBHID_MACHINE_JOYSTICK_H 1)
   1060     endif()
   1061     set(SDL_JOYSTICK_USBHID 1)
   1062     file(GLOB BSD_JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/bsd/*.c)
   1063     set(SOURCE_FILES ${SOURCE_FILES} ${BSD_JOYSTICK_SOURCES})
   1064     list(APPEND EXTRA_CFLAGS ${USB_CFLAGS})
   1065     list(APPEND EXTRA_LIBS ${USB_LIBS})
   1066     set(HAVE_SDL_JOYSTICK TRUE)
   1067 
   1068     set(CMAKE_REQUIRED_LIBRARIES)
   1069     set(CMAKE_REQUIRED_FLAGS "${ORIG_CMAKE_REQUIRED_FLAGS}")
   1070   endif()
   1071 endmacro()
   1072 
   1073 # Check for HIDAPI joystick drivers. This is currently a Unix thing, not Windows or macOS!
   1074 macro(CheckHIDAPI)
   1075   if(HIDAPI)
   1076     if(HIDAPI_SKIP_LIBUSB)
   1077       set(HAVE_HIDAPI TRUE)
   1078     else()
   1079       set(HAVE_HIDAPI FALSE)
   1080       pkg_check_modules(LIBUSB libusb-1.0)
   1081       if (LIBUSB_FOUND)
   1082         check_include_file(libusb.h HAVE_LIBUSB_H ${LIBUSB_CFLAGS})
   1083         if (HAVE_LIBUSB_H)
   1084           set(HAVE_HIDAPI TRUE)
   1085         endif()
   1086       endif()
   1087     endif()
   1088 
   1089     if(HAVE_HIDAPI)
   1090       set(SDL_JOYSTICK_HIDAPI 1)
   1091       set(HAVE_SDL_JOYSTICK TRUE)
   1092       file(GLOB HIDAPI_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/hidapi/*.c)
   1093       set(SOURCE_FILES ${SOURCE_FILES} ${HIDAPI_SOURCES})
   1094       set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${LIBUSB_CFLAGS} \"-I${SDL2_SOURCE_DIR}/src/hidapi/hidapi\"")
   1095       if(NOT HIDAPI_SKIP_LIBUSB)
   1096         if(HIDAPI_ONLY_LIBUSB)
   1097           set(SOURCE_FILES ${SOURCE_FILES} ${SDL2_SOURCE_DIR}/src/hidapi/libusb/hid.c)
   1098           list(APPEND EXTRA_LIBS ${LIBUSB_LIBS})
   1099         else()
   1100           set(SOURCE_FILES ${SOURCE_FILES} ${SDL2_SOURCE_DIR}/src/hidapi/SDL_hidapi.c)
   1101           # libusb is loaded dynamically, so don't add it to EXTRA_LIBS
   1102           FindLibraryAndSONAME("usb-1.0")
   1103           set(SDL_LIBUSB_DYNAMIC "\"${USB_LIB_SONAME}\"")
   1104         endif()
   1105       endif()
   1106     endif()
   1107   endif()
   1108 endmacro()
   1109 
   1110 
   1111 # Requires:
   1112 # - n/a
   1113 macro(CheckRPI)
   1114   if(VIDEO_RPI)
   1115     pkg_check_modules(VIDEO_RPI bcm_host brcmegl)
   1116     if (NOT VIDEO_RPI_FOUND)
   1117       set(VIDEO_RPI_INCLUDE_DIRS "/opt/vc/include" "/opt/vc/include/interface/vcos/pthreads" "/opt/vc/include/interface/vmcs_host/linux/" )
   1118       set(VIDEO_RPI_LIBRARY_DIRS "/opt/vc/lib" )
   1119       set(VIDEO_RPI_LIBRARIES bcm_host )
   1120       set(VIDEO_RPI_LDFLAGS "-Wl,-rpath,/opt/vc/lib")
   1121     endif()
   1122     listtostr(VIDEO_RPI_INCLUDE_DIRS VIDEO_RPI_INCLUDE_FLAGS "-I")
   1123     listtostr(VIDEO_RPI_LIBRARY_DIRS VIDEO_RPI_LIBRARY_FLAGS "-L")
   1124 
   1125     set(ORIG_CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}")
   1126     set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} ${VIDEO_RPI_INCLUDE_FLAGS} ${VIDEO_RPI_LIBRARY_FLAGS}")
   1127     set(CMAKE_REQUIRED_LIBRARIES "${VIDEO_RPI_LIBRARIES}")
   1128     check_c_source_compiles("
   1129         #include <bcm_host.h>
   1130         int main(int argc, char **argv) {}" HAVE_VIDEO_RPI)
   1131     set(CMAKE_REQUIRED_FLAGS "${ORIG_CMAKE_REQUIRED_FLAGS}")
   1132     set(CMAKE_REQUIRED_LIBRARIES)
   1133 
   1134     if(SDL_VIDEO AND HAVE_VIDEO_RPI)
   1135       set(HAVE_SDL_VIDEO TRUE)
   1136       set(SDL_VIDEO_DRIVER_RPI 1)
   1137       file(GLOB VIDEO_RPI_SOURCES ${SDL2_SOURCE_DIR}/src/video/raspberry/*.c)
   1138       set(SOURCE_FILES ${SOURCE_FILES} ${VIDEO_RPI_SOURCES})
   1139       list(APPEND EXTRA_LIBS ${VIDEO_RPI_LIBRARIES})
   1140       set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${VIDEO_RPI_INCLUDE_FLAGS} ${VIDEO_RPI_LIBRARY_FLAGS}")
   1141       list(APPEND EXTRA_LDFLAGS ${VIDEO_RPI_LDFLAGS})
   1142     endif(SDL_VIDEO AND HAVE_VIDEO_RPI)
   1143   endif(VIDEO_RPI)
   1144 endmacro(CheckRPI)
   1145 
   1146 # Requires:
   1147 # - EGL
   1148 # - PkgCheckModules
   1149 # Optional:
   1150 # - KMSDRM_SHARED opt
   1151 # - HAVE_DLOPEN opt
   1152 macro(CheckKMSDRM)
   1153   if(VIDEO_KMSDRM)
   1154     pkg_check_modules(KMSDRM libdrm gbm egl)
   1155     if(KMSDRM_FOUND)
   1156       link_directories(
   1157         ${KMSDRM_LIBRARY_DIRS}
   1158       )
   1159       include_directories(
   1160         ${KMSDRM_INCLUDE_DIRS}
   1161       )
   1162       set(HAVE_VIDEO_KMSDRM TRUE)
   1163       set(HAVE_SDL_VIDEO TRUE)
   1164 
   1165       file(GLOB KMSDRM_SOURCES ${SDL2_SOURCE_DIR}/src/video/kmsdrm/*.c)
   1166       file(GLOB KMSDRM_LEGACY_SOURCES ${SDL2_SOURCE_DIR}/src/video/kmsdrm_legacy/*.c)
   1167       set(SOURCE_FILES ${SOURCE_FILES} ${KMSDRM_SOURCES} ${KMSDRM_LEGACY_SOURCES})
   1168 
   1169       list(APPEND EXTRA_CFLAGS ${KMSDRM_CFLAGS})
   1170 
   1171       set(SDL_VIDEO_DRIVER_KMSDRM 1)
   1172 
   1173       if(KMSDRM_SHARED)
   1174         if(NOT HAVE_DLOPEN)
   1175           message_warn("You must have SDL_LoadObject() support for dynamic KMS/DRM loading")
   1176         else()
   1177           FindLibraryAndSONAME(drm)
   1178           FindLibraryAndSONAME(gbm)
   1179           set(SDL_VIDEO_DRIVER_KMSDRM_DYNAMIC "\"${DRM_LIB_SONAME}\"")
   1180           set(SDL_VIDEO_DRIVER_KMSDRM_DYNAMIC_GBM "\"${GBM_LIB_SONAME}\"")
   1181           set(HAVE_KMSDRM_SHARED TRUE)
   1182         endif()
   1183       else()
   1184         set(EXTRA_LIBS ${KMSDRM_LIBRARIES} ${EXTRA_LIBS})
   1185       endif()
   1186     endif()
   1187   endif()
   1188 endmacro()