diff options
Diffstat (limited to 'contrib/SDL-3.2.8/cmake/sdlchecks.cmake')
| -rw-r--r-- | contrib/SDL-3.2.8/cmake/sdlchecks.cmake | 1308 |
1 files changed, 1308 insertions, 0 deletions
diff --git a/contrib/SDL-3.2.8/cmake/sdlchecks.cmake b/contrib/SDL-3.2.8/cmake/sdlchecks.cmake new file mode 100644 index 0000000..d95cbfa --- /dev/null +++ b/contrib/SDL-3.2.8/cmake/sdlchecks.cmake | |||
| @@ -0,0 +1,1308 @@ | |||
| 1 | macro(FindLibraryAndSONAME _LIB) | ||
| 2 | cmake_parse_arguments(_FLAS "" "" "LIBDIRS" ${ARGN}) | ||
| 3 | |||
| 4 | string(TOUPPER ${_LIB} _UPPERLNAME) | ||
| 5 | string(REGEX REPLACE "\\-" "_" _LNAME "${_UPPERLNAME}") | ||
| 6 | |||
| 7 | find_library(${_LNAME}_LIB ${_LIB} PATHS ${_FLAS_LIBDIRS}) | ||
| 8 | |||
| 9 | # FIXME: fail FindLibraryAndSONAME when library is not shared. | ||
| 10 | if(${_LNAME}_LIB MATCHES ".*\\${CMAKE_SHARED_LIBRARY_SUFFIX}.*" AND NOT ${_LNAME}_LIB MATCHES ".*\\${CMAKE_STATIC_LIBRARY_SUFFIX}.*") | ||
| 11 | set(${_LNAME}_SHARED TRUE) | ||
| 12 | else() | ||
| 13 | set(${_LNAME}_SHARED FALSE) | ||
| 14 | endif() | ||
| 15 | |||
| 16 | if(${_LNAME}_LIB) | ||
| 17 | # reduce the library name for shared linking | ||
| 18 | |||
| 19 | get_filename_component(_LIB_REALPATH ${${_LNAME}_LIB} REALPATH) # resolves symlinks | ||
| 20 | get_filename_component(_LIB_LIBDIR ${_LIB_REALPATH} DIRECTORY) | ||
| 21 | get_filename_component(_LIB_JUSTNAME ${_LIB_REALPATH} NAME) | ||
| 22 | |||
| 23 | if(APPLE) | ||
| 24 | string(REGEX REPLACE "(\\.[0-9]*)\\.[0-9\\.]*dylib$" "\\1.dylib" _LIB_REGEXD "${_LIB_JUSTNAME}") | ||
| 25 | else() | ||
| 26 | string(REGEX REPLACE "(\\.[0-9]*)\\.[0-9\\.]*$" "\\1" _LIB_REGEXD "${_LIB_JUSTNAME}") | ||
| 27 | endif() | ||
| 28 | |||
| 29 | if(NOT EXISTS "${_LIB_LIBDIR}/${_LIB_REGEXD}") | ||
| 30 | set(_LIB_REGEXD "${_LIB_JUSTNAME}") | ||
| 31 | endif() | ||
| 32 | set(${_LNAME}_LIBDIR "${_LIB_LIBDIR}") | ||
| 33 | |||
| 34 | message(STATUS "dynamic lib${_LIB} -> ${_LIB_REGEXD}") | ||
| 35 | set(${_LNAME}_LIB_SONAME ${_LIB_REGEXD}) | ||
| 36 | endif() | ||
| 37 | |||
| 38 | message(DEBUG "DYNLIB OUTPUTVAR: ${_LIB} ... ${_LNAME}_LIB") | ||
| 39 | message(DEBUG "DYNLIB ORIGINAL LIB: ${_LIB} ... ${${_LNAME}_LIB}") | ||
| 40 | message(DEBUG "DYNLIB REALPATH LIB: ${_LIB} ... ${_LIB_REALPATH}") | ||
| 41 | message(DEBUG "DYNLIB JUSTNAME LIB: ${_LIB} ... ${_LIB_JUSTNAME}") | ||
| 42 | message(DEBUG "DYNLIB SONAME LIB: ${_LIB} ... ${_LIB_REGEXD}") | ||
| 43 | endmacro() | ||
| 44 | |||
| 45 | macro(CheckDLOPEN) | ||
| 46 | check_symbol_exists(dlopen "dlfcn.h" HAVE_DLOPEN_IN_LIBC) | ||
| 47 | if(NOT HAVE_DLOPEN_IN_LIBC) | ||
| 48 | cmake_push_check_state() | ||
| 49 | list(APPEND CMAKE_REQUIRED_LIBRARIES dl) | ||
| 50 | check_symbol_exists(dlopen "dlfcn.h" HAVE_DLOPEN_IN_LIBDL) | ||
| 51 | cmake_pop_check_state() | ||
| 52 | if(HAVE_DLOPEN_IN_LIBDL) | ||
| 53 | sdl_link_dependency(dl LIBS dl) | ||
| 54 | endif() | ||
| 55 | endif() | ||
| 56 | if(HAVE_DLOPEN_IN_LIBC OR HAVE_DLOPEN_IN_LIBDL) | ||
| 57 | set(HAVE_DLOPEN TRUE) | ||
| 58 | endif() | ||
| 59 | endmacro() | ||
| 60 | |||
| 61 | macro(CheckO_CLOEXEC) | ||
| 62 | check_c_source_compiles(" | ||
| 63 | #include <fcntl.h> | ||
| 64 | int flag = O_CLOEXEC; | ||
| 65 | int main(int argc, char **argv) { return 0; }" HAVE_O_CLOEXEC) | ||
| 66 | endmacro() | ||
| 67 | |||
| 68 | # Requires: | ||
| 69 | # - n/a | ||
| 70 | macro(CheckOSS) | ||
| 71 | if(SDL_OSS) | ||
| 72 | check_c_source_compiles(" | ||
| 73 | #include <sys/soundcard.h> | ||
| 74 | int main(int argc, char **argv) { int arg = SNDCTL_DSP_SETFRAGMENT; return 0; }" HAVE_OSS_SYS_SOUNDCARD_H) | ||
| 75 | |||
| 76 | if(HAVE_OSS_SYS_SOUNDCARD_H) | ||
| 77 | set(HAVE_OSS TRUE) | ||
| 78 | sdl_glob_sources(${SDL3_SOURCE_DIR}/src/audio/dsp/*.c) | ||
| 79 | set(SDL_AUDIO_DRIVER_OSS 1) | ||
| 80 | if(NETBSD) | ||
| 81 | sdl_link_dependency(oss LIBS ossaudio) | ||
| 82 | endif() | ||
| 83 | set(HAVE_SDL_AUDIO TRUE) | ||
| 84 | endif() | ||
| 85 | endif() | ||
| 86 | endmacro() | ||
| 87 | |||
| 88 | # Requires: | ||
| 89 | # - n/a | ||
| 90 | # Optional: | ||
| 91 | # - SDL_ALSA_SHARED opt | ||
| 92 | # - HAVE_SDL_LOADSO opt | ||
| 93 | macro(CheckALSA) | ||
| 94 | if(SDL_ALSA) | ||
| 95 | set(ALSA_PKG_CONFIG_SPEC "alsa") | ||
| 96 | find_package(ALSA MODULE) | ||
| 97 | if(ALSA_FOUND) | ||
| 98 | sdl_glob_sources("${SDL3_SOURCE_DIR}/src/audio/alsa/*.c") | ||
| 99 | set(SDL_AUDIO_DRIVER_ALSA 1) | ||
| 100 | set(HAVE_ALSA TRUE) | ||
| 101 | set(HAVE_ALSA_SHARED FALSE) | ||
| 102 | if(SDL_ALSA_SHARED) | ||
| 103 | if(HAVE_SDL_LOADSO) | ||
| 104 | FindLibraryAndSONAME("asound") | ||
| 105 | if(ASOUND_LIB AND ASOUND_SHARED) | ||
| 106 | sdl_link_dependency(alsa INCLUDES $<TARGET_PROPERTY:ALSA::ALSA,INTERFACE_INCLUDE_DIRECTORIES>) | ||
| 107 | set(SDL_AUDIO_DRIVER_ALSA_DYNAMIC "\"${ASOUND_LIB_SONAME}\"") | ||
| 108 | set(HAVE_ALSA_SHARED TRUE) | ||
| 109 | else() | ||
| 110 | message(WARNING "Unable to find asound shared object") | ||
| 111 | endif() | ||
| 112 | else() | ||
| 113 | message(WARNING "You must have SDL_LoadObject() support for dynamic ALSA loading") | ||
| 114 | endif() | ||
| 115 | endif() | ||
| 116 | if(NOT HAVE_ALSA_SHARED) | ||
| 117 | #FIXME: remove this line and property generate sdl3.pc | ||
| 118 | list(APPEND SDL_PC_PRIVATE_REQUIRES alsa) | ||
| 119 | sdl_link_dependency(alsa LIBS ALSA::ALSA CMAKE_MODULE ALSA PKG_CONFIG_SPECS "${ALSA_PKG_CONFIG_SPEC}") | ||
| 120 | endif() | ||
| 121 | set(HAVE_SDL_AUDIO TRUE) | ||
| 122 | else() | ||
| 123 | message(WARNING "Unable to find the alsa development library") | ||
| 124 | endif() | ||
| 125 | else() | ||
| 126 | set(HAVE_ALSA FALSE) | ||
| 127 | endif() | ||
| 128 | endmacro() | ||
| 129 | |||
| 130 | # Requires: | ||
| 131 | # - PkgCheckModules | ||
| 132 | # Optional: | ||
| 133 | # - SDL_PIPEWIRE_SHARED opt | ||
| 134 | # - HAVE_SDL_LOADSO opt | ||
| 135 | macro(CheckPipewire) | ||
| 136 | if(SDL_PIPEWIRE) | ||
| 137 | set(PipeWire_PKG_CONFIG_SPEC libpipewire-0.3>=0.3.44) | ||
| 138 | set(PC_PIPEWIRE_FOUND FALSE) | ||
| 139 | if(PKG_CONFIG_FOUND) | ||
| 140 | pkg_check_modules(PC_PIPEWIRE IMPORTED_TARGET ${PipeWire_PKG_CONFIG_SPEC}) | ||
| 141 | endif() | ||
| 142 | if(PC_PIPEWIRE_FOUND) | ||
| 143 | set(HAVE_PIPEWIRE TRUE) | ||
| 144 | sdl_glob_sources("${SDL3_SOURCE_DIR}/src/audio/pipewire/*.c") | ||
| 145 | sdl_glob_sources("${SDL3_SOURCE_DIR}/src/camera/pipewire/*.c") | ||
| 146 | set(SDL_AUDIO_DRIVER_PIPEWIRE 1) | ||
| 147 | set(SDL_CAMERA_DRIVER_PIPEWIRE 1) | ||
| 148 | if(SDL_PIPEWIRE_SHARED AND NOT HAVE_SDL_LOADSO) | ||
| 149 | message(WARNING "You must have SDL_LoadObject() support for dynamic PipeWire loading") | ||
| 150 | endif() | ||
| 151 | FindLibraryAndSONAME("pipewire-0.3" LIBDIRS ${PC_PIPEWIRE_LIBRARY_DIRS}) | ||
| 152 | if(SDL_PIPEWIRE_SHARED AND PIPEWIRE_0.3_LIB AND HAVE_SDL_LOADSO) | ||
| 153 | set(SDL_AUDIO_DRIVER_PIPEWIRE_DYNAMIC "\"${PIPEWIRE_0.3_LIB_SONAME}\"") | ||
| 154 | set(SDL_CAMERA_DRIVER_PIPEWIRE_DYNAMIC "\"${PIPEWIRE_0.3_LIB_SONAME}\"") | ||
| 155 | set(HAVE_PIPEWIRE_SHARED TRUE) | ||
| 156 | sdl_link_dependency(pipewire INCLUDES $<TARGET_PROPERTY:PkgConfig::PC_PIPEWIRE,INTERFACE_INCLUDE_DIRECTORIES>) | ||
| 157 | else() | ||
| 158 | sdl_link_dependency(pipewire LIBS PkgConfig::PC_PIPEWIRE PKG_CONFIG_PREFIX PC_PIPEWIRE PKG_CONFIG_SPECS ${PipeWire_PKG_CONFIG_SPEC}) | ||
| 159 | endif() | ||
| 160 | set(HAVE_SDL_AUDIO TRUE) | ||
| 161 | endif() | ||
| 162 | endif() | ||
| 163 | endmacro() | ||
| 164 | |||
| 165 | # Requires: | ||
| 166 | # - PkgCheckModules | ||
| 167 | # Optional: | ||
| 168 | # - SDL_PULSEAUDIO_SHARED opt | ||
| 169 | # - HAVE_SDL_LOADSO opt | ||
| 170 | macro(CheckPulseAudio) | ||
| 171 | if(SDL_PULSEAUDIO) | ||
| 172 | set(PulseAudio_PKG_CONFIG_SPEC "libpulse>=0.9.15") | ||
| 173 | set(PC_PULSEAUDIO_FOUND FALSE) | ||
| 174 | if(PKG_CONFIG_FOUND) | ||
| 175 | pkg_check_modules(PC_PULSEAUDIO IMPORTED_TARGET ${PulseAudio_PKG_CONFIG_SPEC}) | ||
| 176 | endif() | ||
| 177 | if(PC_PULSEAUDIO_FOUND) | ||
| 178 | set(HAVE_PULSEAUDIO TRUE) | ||
| 179 | sdl_glob_sources("${SDL3_SOURCE_DIR}/src/audio/pulseaudio/*.c") | ||
| 180 | set(SDL_AUDIO_DRIVER_PULSEAUDIO 1) | ||
| 181 | if(SDL_PULSEAUDIO_SHARED AND NOT HAVE_SDL_LOADSO) | ||
| 182 | message(WARNING "You must have SDL_LoadObject() support for dynamic PulseAudio loading") | ||
| 183 | endif() | ||
| 184 | FindLibraryAndSONAME("pulse" LIBDIRS ${PC_PULSEAUDIO_LIBRARY_DIRS}) | ||
| 185 | if(SDL_PULSEAUDIO_SHARED AND PULSE_LIB AND HAVE_SDL_LOADSO) | ||
| 186 | set(SDL_AUDIO_DRIVER_PULSEAUDIO_DYNAMIC "\"${PULSE_LIB_SONAME}\"") | ||
| 187 | set(HAVE_PULSEAUDIO_SHARED TRUE) | ||
| 188 | sdl_link_dependency(pulseaudio INCLUDES $<TARGET_PROPERTY:PkgConfig::PC_PULSEAUDIO,INTERFACE_INCLUDE_DIRECTORIES>) | ||
| 189 | else() | ||
| 190 | sdl_link_dependency(pulseaudio LIBS PkgConfig::PC_PULSEAUDIO PKG_CONFIG_PREFIX PC_PULSEAUDIO PKG_CONFIG_SPECS "${PulseAudio_PKG_CONFIG_SPEC}") | ||
| 191 | endif() | ||
| 192 | set(HAVE_SDL_AUDIO TRUE) | ||
| 193 | endif() | ||
| 194 | endif() | ||
| 195 | endmacro() | ||
| 196 | |||
| 197 | # Requires: | ||
| 198 | # - PkgCheckModules | ||
| 199 | # Optional: | ||
| 200 | # - SDL_JACK_SHARED opt | ||
| 201 | # - HAVE_SDL_LOADSO opt | ||
| 202 | macro(CheckJACK) | ||
| 203 | if(SDL_JACK) | ||
| 204 | set(Jack_PKG_CONFIG_SPEC jack) | ||
| 205 | set(PC_JACK_FOUND FALSE) | ||
| 206 | if(PKG_CONFIG_FOUND) | ||
| 207 | pkg_check_modules(PC_JACK IMPORTED_TARGET ${Jack_PKG_CONFIG_SPEC}) | ||
| 208 | endif() | ||
| 209 | if(PC_JACK_FOUND) | ||
| 210 | set(HAVE_JACK TRUE) | ||
| 211 | sdl_glob_sources("${SDL3_SOURCE_DIR}/src/audio/jack/*.c") | ||
| 212 | set(SDL_AUDIO_DRIVER_JACK 1) | ||
| 213 | if(SDL_JACK_SHARED AND NOT HAVE_SDL_LOADSO) | ||
| 214 | message(WARNING "You must have SDL_LoadObject() support for dynamic JACK audio loading") | ||
| 215 | endif() | ||
| 216 | FindLibraryAndSONAME("jack" LIBDIRS ${PC_JACK_LIBRARY_DIRS}) | ||
| 217 | if(SDL_JACK_SHARED AND JACK_LIB AND HAVE_SDL_LOADSO) | ||
| 218 | set(SDL_AUDIO_DRIVER_JACK_DYNAMIC "\"${JACK_LIB_SONAME}\"") | ||
| 219 | set(HAVE_JACK_SHARED TRUE) | ||
| 220 | sdl_link_dependency(jack INCLUDES $<TARGET_PROPERTY:PkgConfig::PC_JACK,INTERFACE_INCLUDE_DIRECTORIES>) | ||
| 221 | else() | ||
| 222 | sdl_link_dependency(jack LIBS PkgConfig::PC_JACK PKG_CONFIG_PREFIX PC_JACK PKG_CONFIG_SPECS ${Jack_PKG_CONFIG_SPEC}) | ||
| 223 | endif() | ||
| 224 | set(HAVE_SDL_AUDIO TRUE) | ||
| 225 | endif() | ||
| 226 | endif() | ||
| 227 | endmacro() | ||
| 228 | |||
| 229 | # Requires: | ||
| 230 | # - PkgCheckModules | ||
| 231 | # Optional: | ||
| 232 | # - SDL_SNDIO_SHARED opt | ||
| 233 | # - HAVE_SDL_LOADSO opt | ||
| 234 | macro(CheckSNDIO) | ||
| 235 | if(SDL_SNDIO) | ||
| 236 | set(SndIO_PKG_CONFIG_SPEC sndio) | ||
| 237 | set(PC_SNDIO_FOUND FALSE) | ||
| 238 | if(PKG_CONFIG_FOUND) | ||
| 239 | pkg_check_modules(PC_SNDIO IMPORTED_TARGET ${SndIO_PKG_CONFIG_SPEC}) | ||
| 240 | endif() | ||
| 241 | if(PC_SNDIO_FOUND) | ||
| 242 | set(HAVE_SNDIO TRUE) | ||
| 243 | sdl_glob_sources("${SDL3_SOURCE_DIR}/src/audio/sndio/*.c") | ||
| 244 | set(SDL_AUDIO_DRIVER_SNDIO 1) | ||
| 245 | if(SDL_SNDIO_SHARED AND NOT HAVE_SDL_LOADSO) | ||
| 246 | message(WARNING "You must have SDL_LoadObject() support for dynamic sndio loading") | ||
| 247 | endif() | ||
| 248 | FindLibraryAndSONAME("sndio" LIBDIRS ${PC_SNDIO_LIBRARY_DIRS}) | ||
| 249 | if(SDL_SNDIO_SHARED AND SNDIO_LIB AND HAVE_SDL_LOADSO) | ||
| 250 | set(SDL_AUDIO_DRIVER_SNDIO_DYNAMIC "\"${SNDIO_LIB_SONAME}\"") | ||
| 251 | set(HAVE_SNDIO_SHARED TRUE) | ||
| 252 | sdl_include_directories(PRIVATE SYSTEM $<TARGET_PROPERTY:PkgConfig::PC_SNDIO,INTERFACE_INCLUDE_DIRECTORIES>) | ||
| 253 | else() | ||
| 254 | sdl_link_dependency(sndio LIBS PkgConfig::PC_SNDIO PKG_CONFIG_PREFIX PC_SNDIO PKG_CONFIG_SPECS ${SndIO_PKG_CONFIG_SPEC}) | ||
| 255 | endif() | ||
| 256 | set(HAVE_SDL_AUDIO TRUE) | ||
| 257 | endif() | ||
| 258 | endif() | ||
| 259 | endmacro() | ||
| 260 | |||
| 261 | # Requires: | ||
| 262 | # - n/a | ||
| 263 | # Optional: | ||
| 264 | # - SDL_X11_SHARED opt | ||
| 265 | # - HAVE_SDL_LOADSO opt | ||
| 266 | macro(CheckX11) | ||
| 267 | cmake_push_check_state() | ||
| 268 | if(SDL_X11) | ||
| 269 | set(X11_PKG_CONFIG_SPEC x11) | ||
| 270 | set(Xext_PKG_CONFIG_SPEC xext) | ||
| 271 | set(Xcursor_PKG_CONFIG_SPEC xcursor) | ||
| 272 | set(Xi_PKG_CONFIG_SPEC xi) | ||
| 273 | set(Xfixes_PKG_CONFIG_SPEC xfixes) | ||
| 274 | set(Xrandr_PKG_CONFIG_SPEC xrandr) | ||
| 275 | set(Xrender_PKG_CONFIG_SPEC xrender) | ||
| 276 | set(Xss_PKG_CONFIG_SPEC xscrnsaver) | ||
| 277 | |||
| 278 | find_package(X11) | ||
| 279 | |||
| 280 | foreach(_LIB X11 Xext Xcursor Xi Xfixes Xrandr Xrender Xss) | ||
| 281 | get_filename_component(_libdir "${X11_${_LIB}_LIB}" DIRECTORY) | ||
| 282 | FindLibraryAndSONAME("${_LIB}" LIBDIRS ${_libdir}) | ||
| 283 | endforeach() | ||
| 284 | |||
| 285 | find_path(X11_INCLUDEDIR | ||
| 286 | NAMES X11/Xlib.h | ||
| 287 | PATHS | ||
| 288 | ${X11_INCLUDE_DIR} | ||
| 289 | /usr/pkg/xorg/include | ||
| 290 | /usr/X11R6/include | ||
| 291 | /usr/X11R7/include | ||
| 292 | /usr/local/include/X11 | ||
| 293 | /usr/include/X11 | ||
| 294 | /usr/openwin/include | ||
| 295 | /usr/openwin/share/include | ||
| 296 | /opt/graphics/OpenGL/include | ||
| 297 | /opt/X11/include | ||
| 298 | ) | ||
| 299 | |||
| 300 | if(X11_INCLUDEDIR) | ||
| 301 | sdl_include_directories(PRIVATE SYSTEM "${X11_INCLUDEDIR}") | ||
| 302 | list(APPEND CMAKE_REQUIRED_INCLUDES ${X11_INCLUDEDIR}) | ||
| 303 | endif() | ||
| 304 | |||
| 305 | find_file(HAVE_XCURSOR_H NAMES "X11/Xcursor/Xcursor.h" HINTS "${X11_INCLUDEDIR}") | ||
| 306 | find_file(HAVE_XINPUT2_H NAMES "X11/extensions/XInput2.h" HINTS "${X11_INCLUDEDIR}") | ||
| 307 | find_file(HAVE_XRANDR_H NAMES "X11/extensions/Xrandr.h" HINTS "${X11_INCLUDEDIR}") | ||
| 308 | find_file(HAVE_XFIXES_H_ NAMES "X11/extensions/Xfixes.h" HINTS "${X11_INCLUDEDIR}") | ||
| 309 | find_file(HAVE_XRENDER_H NAMES "X11/extensions/Xrender.h" HINTS "${X11_INCLUDEDIR}") | ||
| 310 | find_file(HAVE_XSYNC_H NAMES "X11/extensions/sync.h" HINTS "${X11_INCLUDEDIR}") | ||
| 311 | find_file(HAVE_XSS_H NAMES "X11/extensions/scrnsaver.h" HINTS "${X11_INCLUDEDIR}") | ||
| 312 | find_file(HAVE_XSHAPE_H NAMES "X11/extensions/shape.h" HINTS "${X11_INCLUDEDIR}") | ||
| 313 | find_file(HAVE_XDBE_H NAMES "X11/extensions/Xdbe.h" HINTS "${X11_INCLUDEDIR}") | ||
| 314 | find_file(HAVE_XEXT_H NAMES "X11/extensions/Xext.h" HINTS "${X11_INCLUDEDIR}") | ||
| 315 | |||
| 316 | if(X11_LIB AND HAVE_XEXT_H) | ||
| 317 | |||
| 318 | set(HAVE_X11 TRUE) | ||
| 319 | set(HAVE_SDL_VIDEO TRUE) | ||
| 320 | |||
| 321 | sdl_glob_sources("${SDL3_SOURCE_DIR}/src/video/x11/*.c") | ||
| 322 | set(SDL_VIDEO_DRIVER_X11 1) | ||
| 323 | |||
| 324 | # Note: Disabled on Apple because the dynamic mode backend for X11 doesn't | ||
| 325 | # work properly on Apple during several issues like inconsistent paths | ||
| 326 | # among platforms. See #6778 (https://github.com/libsdl-org/SDL/issues/6778) | ||
| 327 | if(APPLE) | ||
| 328 | set(SDL_X11_SHARED OFF) | ||
| 329 | endif() | ||
| 330 | |||
| 331 | check_symbol_exists(shmat "sys/shm.h" HAVE_SHMAT_IN_LIBC) | ||
| 332 | if(NOT HAVE_SHMAT_IN_LIBC) | ||
| 333 | check_library_exists(ipc shmat "" HAVE_SHMAT_IN_LIBIPC) | ||
| 334 | if(HAVE_SHMAT_IN_LIBIPC) | ||
| 335 | sdl_link_dependency(x11_ipc LIBS ipc) | ||
| 336 | endif() | ||
| 337 | if(NOT HAVE_SHMAT_IN_LIBIPC) | ||
| 338 | sdl_compile_definitions(PRIVATE "NO_SHARED_MEMORY") | ||
| 339 | endif() | ||
| 340 | endif() | ||
| 341 | |||
| 342 | if(SDL_X11_SHARED) | ||
| 343 | if(NOT HAVE_SDL_LOADSO) | ||
| 344 | message(WARNING "You must have SDL_LoadObject() support for dynamic X11 loading") | ||
| 345 | set(HAVE_X11_SHARED FALSE) | ||
| 346 | else() | ||
| 347 | set(HAVE_X11_SHARED TRUE) | ||
| 348 | endif() | ||
| 349 | if(X11_LIB) | ||
| 350 | if(HAVE_X11_SHARED) | ||
| 351 | set(SDL_VIDEO_DRIVER_X11_DYNAMIC "\"${X11_LIB_SONAME}\"") | ||
| 352 | else() | ||
| 353 | sdl_link_dependency(x11 LIBS X11::X11 CMAKE_MODULE X11 PKG_CONFIG_SPECS ${X11_PKG_CONFIG_SPEC}) | ||
| 354 | endif() | ||
| 355 | endif() | ||
| 356 | if(XEXT_LIB) | ||
| 357 | if(HAVE_X11_SHARED) | ||
| 358 | set(SDL_VIDEO_DRIVER_X11_DYNAMIC_XEXT "\"${XEXT_LIB_SONAME}\"") | ||
| 359 | else() | ||
| 360 | sdl_link_dependency(xext LIBS X11::Xext CMAKE_MODULE X11 PKG_CONFIG_SPECS ${Xext_PKG_CONFIG_SPEC}) | ||
| 361 | endif() | ||
| 362 | endif() | ||
| 363 | else() | ||
| 364 | sdl_link_dependency(x11 LIBS X11::X11 CMAKE_MODULE X11 PKG_CONFIG_SPECS ${X11_PKG_CONFIG_SPEC}) | ||
| 365 | sdl_link_dependency(xext LIBS X11::Xext CMAKE_MODULE X11 PKG_CONFIG_SPECS ${Xext_PKG_CONFIG_SPEC}) | ||
| 366 | endif() | ||
| 367 | |||
| 368 | list(APPEND CMAKE_REQUIRED_LIBRARIES ${X11_LIB}) | ||
| 369 | |||
| 370 | check_c_source_compiles(" | ||
| 371 | #include <X11/Xlib.h> | ||
| 372 | int main(int argc, char **argv) { | ||
| 373 | Display *display; | ||
| 374 | XEvent event; | ||
| 375 | XGenericEventCookie *cookie = &event.xcookie; | ||
| 376 | XNextEvent(display, &event); | ||
| 377 | XGetEventData(display, cookie); | ||
| 378 | XFreeEventData(display, cookie); | ||
| 379 | return 0; }" HAVE_XGENERICEVENT) | ||
| 380 | if(HAVE_XGENERICEVENT) | ||
| 381 | set(SDL_VIDEO_DRIVER_X11_SUPPORTS_GENERIC_EVENTS 1) | ||
| 382 | endif() | ||
| 383 | |||
| 384 | check_symbol_exists(XkbLookupKeySym "X11/Xlib.h;X11/XKBlib.h" SDL_VIDEO_DRIVER_X11_HAS_XKBLOOKUPKEYSYM) | ||
| 385 | |||
| 386 | if(SDL_X11_XCURSOR AND HAVE_XCURSOR_H AND XCURSOR_LIB) | ||
| 387 | set(HAVE_X11_XCURSOR TRUE) | ||
| 388 | if(HAVE_X11_SHARED) | ||
| 389 | set(SDL_VIDEO_DRIVER_X11_DYNAMIC_XCURSOR "\"${XCURSOR_LIB_SONAME}\"") | ||
| 390 | else() | ||
| 391 | sdl_link_dependency(xcursor LIBS X11::Xcursor CMAKE_MODULE X11 PKG_CONFIG_SPECS ${Xcursor_PKG_CONFIG_SPEC}) | ||
| 392 | endif() | ||
| 393 | set(SDL_VIDEO_DRIVER_X11_XCURSOR 1) | ||
| 394 | endif() | ||
| 395 | |||
| 396 | if(SDL_X11_XDBE AND HAVE_XDBE_H) | ||
| 397 | set(HAVE_X11_XDBE TRUE) | ||
| 398 | set(SDL_VIDEO_DRIVER_X11_XDBE 1) | ||
| 399 | endif() | ||
| 400 | |||
| 401 | if(SDL_X11_XINPUT AND HAVE_XINPUT2_H AND XI_LIB) | ||
| 402 | set(HAVE_X11_XINPUT TRUE) | ||
| 403 | if(HAVE_X11_SHARED) | ||
| 404 | set(SDL_VIDEO_DRIVER_X11_DYNAMIC_XINPUT2 "\"${XI_LIB_SONAME}\"") | ||
| 405 | else() | ||
| 406 | sdl_link_dependency(xi LIBS X11::Xi CMAKE_MODULE X11 PKG_CONFIG_SPECS ${Xi_PKG_CONFIG_SPEC}) | ||
| 407 | endif() | ||
| 408 | set(SDL_VIDEO_DRIVER_X11_XINPUT2 1) | ||
| 409 | |||
| 410 | # Check for multitouch | ||
| 411 | check_c_source_compiles(" | ||
| 412 | #include <X11/Xlib.h> | ||
| 413 | #include <X11/Xproto.h> | ||
| 414 | #include <X11/extensions/XInput2.h> | ||
| 415 | int event_type = XI_TouchBegin; | ||
| 416 | XITouchClassInfo *t; | ||
| 417 | Status XIAllowTouchEvents(Display *a,int b,unsigned int c,Window d,int f) { | ||
| 418 | return (Status)0; | ||
| 419 | } | ||
| 420 | int main(int argc, char **argv) { return 0; }" HAVE_XINPUT2_MULTITOUCH) | ||
| 421 | if(HAVE_XINPUT2_MULTITOUCH) | ||
| 422 | set(SDL_VIDEO_DRIVER_X11_XINPUT2_SUPPORTS_MULTITOUCH 1) | ||
| 423 | endif() | ||
| 424 | endif() | ||
| 425 | |||
| 426 | # check along with XInput2.h because we use Xfixes with XIBarrierReleasePointer | ||
| 427 | if(SDL_X11_XFIXES AND HAVE_XFIXES_H_ AND HAVE_XINPUT2_H) | ||
| 428 | check_c_source_compiles(" | ||
| 429 | #include <X11/Xlib.h> | ||
| 430 | #include <X11/Xproto.h> | ||
| 431 | #include <X11/extensions/XInput2.h> | ||
| 432 | #include <X11/extensions/Xfixes.h> | ||
| 433 | BarrierEventID b; | ||
| 434 | int main(int argc, char **argv) { return 0; }" HAVE_XFIXES_H) | ||
| 435 | endif() | ||
| 436 | if(SDL_X11_XFIXES AND HAVE_XFIXES_H AND HAVE_XINPUT2_H AND XFIXES_LIB) | ||
| 437 | if(HAVE_X11_SHARED) | ||
| 438 | set(SDL_VIDEO_DRIVER_X11_DYNAMIC_XFIXES "\"${XFIXES_LIB_SONAME}\"") | ||
| 439 | else() | ||
| 440 | sdl_link_dependency(xfixes LIBS X11::Xfixes CMAKE_MODULE X11 PKG_CONFIG_SPECS ${Xfixes_PKG_CONFIG_SPEC}) | ||
| 441 | endif() | ||
| 442 | set(SDL_VIDEO_DRIVER_X11_XFIXES 1) | ||
| 443 | set(HAVE_X11_XFIXES TRUE) | ||
| 444 | endif() | ||
| 445 | |||
| 446 | if(SDL_X11_XSYNC AND HAVE_XSYNC_H AND XEXT_LIB) | ||
| 447 | set(SDL_VIDEO_DRIVER_X11_XSYNC 1) | ||
| 448 | set(HAVE_X11_XSYNC TRUE) | ||
| 449 | endif() | ||
| 450 | |||
| 451 | if(SDL_X11_XRANDR AND HAVE_XRANDR_H AND XRANDR_LIB) | ||
| 452 | if(HAVE_X11_SHARED) | ||
| 453 | set(SDL_VIDEO_DRIVER_X11_DYNAMIC_XRANDR "\"${XRANDR_LIB_SONAME}\"") | ||
| 454 | else() | ||
| 455 | sdl_link_dependency(xrandr LIBS X11::Xrandr CMAKE_MODULE X11 PKG_CONFIG_SPECS ${Xrandr_PKG_CONFIG_SPEC}) | ||
| 456 | endif() | ||
| 457 | set(SDL_VIDEO_DRIVER_X11_XRANDR 1) | ||
| 458 | set(HAVE_X11_XRANDR TRUE) | ||
| 459 | endif() | ||
| 460 | |||
| 461 | if(SDL_X11_XSCRNSAVER AND HAVE_XSS_H AND XSS_LIB) | ||
| 462 | if(HAVE_X11_SHARED) | ||
| 463 | set(SDL_VIDEO_DRIVER_X11_DYNAMIC_XSS "\"${XSS_LIB_SONAME}\"") | ||
| 464 | else() | ||
| 465 | sdl_link_dependency(xss LIBS X11::Xss CMAKE_MODULE X11 PKG_CONFIG_SPECS ${Xss_PKG_CONFIG_SPEC}) | ||
| 466 | endif() | ||
| 467 | set(SDL_VIDEO_DRIVER_X11_XSCRNSAVER 1) | ||
| 468 | set(HAVE_X11_XSCRNSAVER TRUE) | ||
| 469 | endif() | ||
| 470 | |||
| 471 | if(SDL_X11_XSHAPE AND HAVE_XSHAPE_H) | ||
| 472 | set(SDL_VIDEO_DRIVER_X11_XSHAPE 1) | ||
| 473 | set(HAVE_X11_XSHAPE TRUE) | ||
| 474 | endif() | ||
| 475 | endif() | ||
| 476 | endif() | ||
| 477 | if(NOT HAVE_X11) | ||
| 478 | # Prevent Mesa from including X11 headers | ||
| 479 | sdl_compile_definitions(PRIVATE "MESA_EGL_NO_X11_HEADERS" "EGL_NO_X11") | ||
| 480 | endif() | ||
| 481 | cmake_pop_check_state() | ||
| 482 | endmacro() | ||
| 483 | |||
| 484 | macro(WaylandProtocolGen _SCANNER _CODE_MODE _XML _PROTL) | ||
| 485 | set(_WAYLAND_PROT_C_CODE "${CMAKE_CURRENT_BINARY_DIR}/wayland-generated-protocols/${_PROTL}-protocol.c") | ||
| 486 | set(_WAYLAND_PROT_H_CODE "${CMAKE_CURRENT_BINARY_DIR}/wayland-generated-protocols/${_PROTL}-client-protocol.h") | ||
| 487 | |||
| 488 | add_custom_command( | ||
| 489 | OUTPUT "${_WAYLAND_PROT_H_CODE}" | ||
| 490 | DEPENDS "${_XML}" | ||
| 491 | COMMAND "${_SCANNER}" | ||
| 492 | ARGS client-header "${_XML}" "${_WAYLAND_PROT_H_CODE}" | ||
| 493 | ) | ||
| 494 | |||
| 495 | add_custom_command( | ||
| 496 | OUTPUT "${_WAYLAND_PROT_C_CODE}" | ||
| 497 | DEPENDS "${_WAYLAND_PROT_H_CODE}" | ||
| 498 | COMMAND "${_SCANNER}" | ||
| 499 | ARGS "${_CODE_MODE}" "${_XML}" "${_WAYLAND_PROT_C_CODE}" | ||
| 500 | ) | ||
| 501 | |||
| 502 | sdl_sources("${_WAYLAND_PROT_C_CODE}") | ||
| 503 | endmacro() | ||
| 504 | |||
| 505 | # Requires: | ||
| 506 | # - EGL | ||
| 507 | # - PkgCheckModules | ||
| 508 | # Optional: | ||
| 509 | # - SDL_WAYLAND_SHARED opt | ||
| 510 | # - HAVE_SDL_LOADSO opt | ||
| 511 | macro(CheckWayland) | ||
| 512 | if(SDL_WAYLAND) | ||
| 513 | set(WAYLAND_PKG_CONFIG_SPEC "wayland-client>=1.18" wayland-egl wayland-cursor egl "xkbcommon>=0.5.0") | ||
| 514 | set(PC_WAYLAND_FOUND FALSE) | ||
| 515 | if(PKG_CONFIG_FOUND) | ||
| 516 | pkg_check_modules(PC_WAYLAND IMPORTED_TARGET ${WAYLAND_PKG_CONFIG_SPEC}) | ||
| 517 | endif() | ||
| 518 | find_program(WAYLAND_SCANNER NAMES wayland-scanner) | ||
| 519 | |||
| 520 | set(WAYLAND_FOUND FALSE) | ||
| 521 | if(PC_WAYLAND_FOUND AND WAYLAND_SCANNER) | ||
| 522 | execute_process( | ||
| 523 | COMMAND ${WAYLAND_SCANNER} --version | ||
| 524 | RESULT_VARIABLE WAYLAND_SCANNER_VERSION_RC | ||
| 525 | ERROR_VARIABLE WAYLAND_SCANNER_VERSION_STDERR | ||
| 526 | ERROR_STRIP_TRAILING_WHITESPACE | ||
| 527 | ) | ||
| 528 | if(NOT WAYLAND_SCANNER_VERSION_RC EQUAL 0) | ||
| 529 | message(WARNING "Failed to get wayland-scanner version") | ||
| 530 | else() | ||
| 531 | if(WAYLAND_SCANNER_VERSION_STDERR MATCHES [[([0-9.]+)$]]) | ||
| 532 | set(WAYLAND_FOUND TRUE) | ||
| 533 | set(WAYLAND_SCANNER_VERSION ${CMAKE_MATCH_1}) | ||
| 534 | if(WAYLAND_SCANNER_VERSION VERSION_LESS "1.15.0") | ||
| 535 | set(WAYLAND_SCANNER_CODE_MODE "code") | ||
| 536 | else() | ||
| 537 | set(WAYLAND_SCANNER_CODE_MODE "private-code") | ||
| 538 | endif() | ||
| 539 | endif() | ||
| 540 | endif() | ||
| 541 | endif() | ||
| 542 | |||
| 543 | if(WAYLAND_FOUND) | ||
| 544 | set(HAVE_WAYLAND TRUE) | ||
| 545 | set(HAVE_SDL_VIDEO TRUE) | ||
| 546 | |||
| 547 | sdl_glob_sources("${SDL3_SOURCE_DIR}/src/video/wayland/*.c") | ||
| 548 | |||
| 549 | # We have to generate some protocol interface code for some unstable Wayland features. | ||
| 550 | file(MAKE_DIRECTORY "${SDL3_BINARY_DIR}/wayland-generated-protocols") | ||
| 551 | # Prepend to include path to make sure they override installed protocol headers | ||
| 552 | sdl_include_directories(PRIVATE SYSTEM BEFORE "${SDL3_BINARY_DIR}/wayland-generated-protocols") | ||
| 553 | |||
| 554 | file(GLOB WAYLAND_PROTOCOLS_XML RELATIVE "${SDL3_SOURCE_DIR}/wayland-protocols/" "${SDL3_SOURCE_DIR}/wayland-protocols/*.xml") | ||
| 555 | foreach(_XML IN LISTS WAYLAND_PROTOCOLS_XML) | ||
| 556 | string(REGEX REPLACE "\\.xml$" "" _PROTL "${_XML}") | ||
| 557 | WaylandProtocolGen("${WAYLAND_SCANNER}" "${WAYLAND_SCANNER_CODE_MODE}" "${SDL3_SOURCE_DIR}/wayland-protocols/${_XML}" "${_PROTL}") | ||
| 558 | endforeach() | ||
| 559 | |||
| 560 | if(SDL_WAYLAND_SHARED AND NOT HAVE_SDL_LOADSO) | ||
| 561 | message(WARNING "You must have SDL_LoadObject() support for dynamic Wayland loading") | ||
| 562 | endif() | ||
| 563 | FindLibraryAndSONAME(wayland-client LIBDIRS ${PC_WAYLAND_LIBRARY_DIRS}) | ||
| 564 | FindLibraryAndSONAME(wayland-egl LIBDIRS ${PC_WAYLAND_LIBRARY_DIRS}) | ||
| 565 | FindLibraryAndSONAME(wayland-cursor LIBDIRS ${PC_WAYLAND_LIBRARY_DIRS}) | ||
| 566 | FindLibraryAndSONAME(xkbcommon LIBDIRS ${PC_WAYLAND_LIBRARY_DIRS}) | ||
| 567 | if(SDL_WAYLAND_SHARED AND WAYLAND_CLIENT_LIB AND WAYLAND_EGL_LIB AND WAYLAND_CURSOR_LIB AND XKBCOMMON_LIB AND HAVE_SDL_LOADSO) | ||
| 568 | set(SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC "\"${WAYLAND_CLIENT_LIB_SONAME}\"") | ||
| 569 | set(SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_EGL "\"${WAYLAND_EGL_LIB_SONAME}\"") | ||
| 570 | set(SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_CURSOR "\"${WAYLAND_CURSOR_LIB_SONAME}\"") | ||
| 571 | set(SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_XKBCOMMON "\"${XKBCOMMON_LIB_SONAME}\"") | ||
| 572 | set(HAVE_WAYLAND_SHARED TRUE) | ||
| 573 | sdl_link_dependency(wayland INCLUDES $<TARGET_PROPERTY:PkgConfig::PC_WAYLAND,INTERFACE_INCLUDE_DIRECTORIES>) | ||
| 574 | else() | ||
| 575 | sdl_link_dependency(wayland LIBS PkgConfig::PC_WAYLAND PKG_CONFIG_PREFIX PC_WAYLAND PKG_CONFIG_SPECS ${WAYLAND_PKG_CONFIG_SPEC}) | ||
| 576 | endif() | ||
| 577 | |||
| 578 | if(SDL_WAYLAND_LIBDECOR) | ||
| 579 | set(LibDecor_PKG_CONFIG_SPEC libdecor-0) | ||
| 580 | pkg_check_modules(PC_LIBDECOR IMPORTED_TARGET ${LibDecor_PKG_CONFIG_SPEC}) | ||
| 581 | if(PC_LIBDECOR_FOUND) | ||
| 582 | |||
| 583 | # Libdecor doesn't provide internal version defines, so generate them here. | ||
| 584 | if (PC_LIBDECOR_VERSION MATCHES "^([0-9]+)\\.([0-9]+)\\.([0-9]+)") | ||
| 585 | set(SDL_LIBDECOR_VERSION_MAJOR ${CMAKE_MATCH_1}) | ||
| 586 | set(SDL_LIBDECOR_VERSION_MINOR ${CMAKE_MATCH_2}) | ||
| 587 | set(SDL_LIBDECOR_VERSION_PATCH ${CMAKE_MATCH_3}) | ||
| 588 | else() | ||
| 589 | message(WARNING "Failed to parse libdecor version; defaulting to lowest supported (0.1.0)") | ||
| 590 | set(SDL_LIBDECOR_VERSION_MAJOR 0) | ||
| 591 | set(SDL_LIBDECOR_VERSION_MINOR 1) | ||
| 592 | set(SDL_LIBDECOR_VERSION_PATCH 0) | ||
| 593 | endif() | ||
| 594 | |||
| 595 | if(PC_LIBDECOR_VERSION VERSION_GREATER_EQUAL "0.2.0") | ||
| 596 | set(LibDecor_PKG_CONFIG_SPEC "libdecor-0>=0.2.0") | ||
| 597 | endif() | ||
| 598 | set(HAVE_WAYLAND_LIBDECOR TRUE) | ||
| 599 | set(HAVE_LIBDECOR_H 1) | ||
| 600 | if(SDL_WAYLAND_LIBDECOR_SHARED AND NOT HAVE_SDL_LOADSO) | ||
| 601 | message(WARNING "You must have SDL_LoadObject() support for dynamic libdecor loading") | ||
| 602 | endif() | ||
| 603 | FindLibraryAndSONAME(decor-0 LIBDIRS ${PC_LIBDECOR_LIBRARY_DIRS}) | ||
| 604 | if(SDL_WAYLAND_LIBDECOR_SHARED AND DECOR_0_LIB AND HAVE_SDL_LOADSO) | ||
| 605 | set(HAVE_WAYLAND_LIBDECOR_SHARED TRUE) | ||
| 606 | set(SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_LIBDECOR "\"${DECOR_0_LIB_SONAME}\"") | ||
| 607 | sdl_link_dependency(libdecor INCLUDES $<TARGET_PROPERTY:PkgConfig::PC_LIBDECOR,INTERFACE_INCLUDE_DIRECTORIES>) | ||
| 608 | else() | ||
| 609 | sdl_link_dependency(libdecor LIBS PkgConfig::PC_LIBDECOR PKG_CONFIG_PREFIX PC_LIBDECOR PKG_CONFIG_SPECS ${LibDecor_PKG_CONFIG_SPEC}) | ||
| 610 | endif() | ||
| 611 | endif() | ||
| 612 | endif() | ||
| 613 | |||
| 614 | set(SDL_VIDEO_DRIVER_WAYLAND 1) | ||
| 615 | endif() | ||
| 616 | endif() | ||
| 617 | endmacro() | ||
| 618 | |||
| 619 | # Requires: | ||
| 620 | # - n/a | ||
| 621 | # | ||
| 622 | macro(CheckCOCOA) | ||
| 623 | if(SDL_COCOA) | ||
| 624 | if(APPLE) # Apple always has Cocoa. | ||
| 625 | set(HAVE_COCOA TRUE) | ||
| 626 | endif() | ||
| 627 | if(HAVE_COCOA) | ||
| 628 | sdl_glob_sources("${SDL3_SOURCE_DIR}/src/video/cocoa/*.m") | ||
| 629 | set(SDL_FRAMEWORK_IOKIT 1) | ||
| 630 | set(SDL_VIDEO_DRIVER_COCOA 1) | ||
| 631 | set(HAVE_SDL_VIDEO TRUE) | ||
| 632 | endif() | ||
| 633 | endif() | ||
| 634 | endmacro() | ||
| 635 | |||
| 636 | # Requires: | ||
| 637 | # - n/a | ||
| 638 | macro(CheckVivante) | ||
| 639 | if(SDL_VIVANTE) | ||
| 640 | check_c_source_compiles(" | ||
| 641 | #include <gc_vdk.h> | ||
| 642 | int main(int argc, char** argv) { return 0; }" HAVE_VIVANTE_VDK) | ||
| 643 | check_c_source_compiles(" | ||
| 644 | #define LINUX | ||
| 645 | #define EGL_API_FB | ||
| 646 | #include <EGL/eglvivante.h> | ||
| 647 | int main(int argc, char** argv) { return 0; }" HAVE_VIVANTE_EGL_FB) | ||
| 648 | if(HAVE_VIVANTE_VDK OR HAVE_VIVANTE_EGL_FB) | ||
| 649 | set(HAVE_VIVANTE TRUE) | ||
| 650 | set(HAVE_SDL_VIDEO TRUE) | ||
| 651 | |||
| 652 | sdl_glob_sources("${SDL3_SOURCE_DIR}/src/video/vivante/*.c") | ||
| 653 | set(SDL_VIDEO_DRIVER_VIVANTE 1) | ||
| 654 | # FIXME: Use Find module | ||
| 655 | if(HAVE_VIVANTE_VDK) | ||
| 656 | set(SDL_VIDEO_DRIVER_VIVANTE_VDK 1) | ||
| 657 | find_library(VIVANTE_LIBRARY REQUIRED NAMES VIVANTE vivante drm_vivante) | ||
| 658 | find_library(VIVANTE_VDK_LIBRARY VDK REQUIRED) | ||
| 659 | sdl_link_dependency(vivante LIBS ${VIVANTE_LIBRARY} ${VIVANTE_VDK_LIBRARY}) | ||
| 660 | else() | ||
| 661 | # these defines are needed when including the system EGL headers, which SDL does | ||
| 662 | sdl_compile_definitions(PUBLIC "LINUX" "EGL_API_FB") | ||
| 663 | sdl_link_dependency(vivante LIBS EGL) | ||
| 664 | endif(HAVE_VIVANTE_VDK) | ||
| 665 | endif() | ||
| 666 | endif() | ||
| 667 | endmacro() | ||
| 668 | |||
| 669 | # Requires: | ||
| 670 | # - n/a | ||
| 671 | macro(CheckOpenVR) | ||
| 672 | if(SDL_OPENVR) | ||
| 673 | set(HAVE_OPENVR TRUE) | ||
| 674 | set(HAVE_OPENVR_VIDEO TRUE) | ||
| 675 | |||
| 676 | sdl_glob_sources("${SDL3_SOURCE_DIR}/src/video/openvr/*.c") | ||
| 677 | set(SDL_VIDEO_DRIVER_OPENVR 1) | ||
| 678 | if(NOT WINDOWS) | ||
| 679 | sdl_link_dependency(egl LIBS EGL) | ||
| 680 | endif() | ||
| 681 | endif() | ||
| 682 | endmacro() | ||
| 683 | |||
| 684 | # Requires: | ||
| 685 | # - nada | ||
| 686 | macro(CheckGLX) | ||
| 687 | if(SDL_OPENGL) | ||
| 688 | check_c_source_compiles(" | ||
| 689 | #include <GL/glx.h> | ||
| 690 | int main(int argc, char** argv) { return 0; }" HAVE_OPENGL_GLX) | ||
| 691 | if(HAVE_OPENGL_GLX AND NOT HAVE_ROCKCHIP) | ||
| 692 | set(SDL_VIDEO_OPENGL_GLX 1) | ||
| 693 | endif() | ||
| 694 | endif() | ||
| 695 | endmacro() | ||
| 696 | |||
| 697 | # Requires: | ||
| 698 | # - PkgCheckModules | ||
| 699 | macro(CheckEGL) | ||
| 700 | if(SDL_OPENGL OR SDL_OPENGLES) | ||
| 701 | cmake_push_check_state() | ||
| 702 | find_package(OpenGL MODULE) | ||
| 703 | list(APPEND CMAKE_REQUIRED_INCLUDES ${OPENGL_EGL_INCLUDE_DIRS}) | ||
| 704 | list(APPEND CMAKE_REQUIRED_INCLUDES "${SDL3_SOURCE_DIR}/src/video/khronos") | ||
| 705 | check_c_source_compiles(" | ||
| 706 | #define EGL_API_FB | ||
| 707 | #define MESA_EGL_NO_X11_HEADERS | ||
| 708 | #define EGL_NO_X11 | ||
| 709 | #include <EGL/egl.h> | ||
| 710 | #include <EGL/eglext.h> | ||
| 711 | int main (int argc, char** argv) { return 0; }" HAVE_OPENGL_EGL) | ||
| 712 | cmake_pop_check_state() | ||
| 713 | if(HAVE_OPENGL_EGL) | ||
| 714 | set(SDL_VIDEO_OPENGL_EGL 1) | ||
| 715 | sdl_link_dependency(egl INCLUDES ${OPENGL_EGL_INCLUDE_DIRS}) | ||
| 716 | endif() | ||
| 717 | endif() | ||
| 718 | endmacro() | ||
| 719 | |||
| 720 | # Requires: | ||
| 721 | # - nada | ||
| 722 | macro(CheckOpenGL) | ||
| 723 | if(SDL_OPENGL) | ||
| 724 | check_c_source_compiles(" | ||
| 725 | #include <GL/gl.h> | ||
| 726 | #include <GL/glext.h> | ||
| 727 | int main(int argc, char** argv) { return 0; }" HAVE_OPENGL) | ||
| 728 | if(HAVE_OPENGL) | ||
| 729 | set(SDL_VIDEO_OPENGL 1) | ||
| 730 | set(SDL_VIDEO_RENDER_OGL 1) | ||
| 731 | endif() | ||
| 732 | endif() | ||
| 733 | endmacro() | ||
| 734 | |||
| 735 | # Requires: | ||
| 736 | # - nada | ||
| 737 | macro(CheckOpenGLES) | ||
| 738 | if(SDL_OPENGLES) | ||
| 739 | cmake_push_check_state() | ||
| 740 | list(APPEND CMAKE_REQUIRED_INCLUDES "${SDL3_SOURCE_DIR}/src/video/khronos") | ||
| 741 | check_c_source_compiles(" | ||
| 742 | #include <GLES/gl.h> | ||
| 743 | #include <GLES/glext.h> | ||
| 744 | int main (int argc, char** argv) { return 0; }" HAVE_OPENGLES_V1) | ||
| 745 | check_c_source_compiles(" | ||
| 746 | #include <GLES2/gl2.h> | ||
| 747 | #include <GLES2/gl2ext.h> | ||
| 748 | int main (int argc, char** argv) { return 0; }" HAVE_OPENGLES_V2) | ||
| 749 | cmake_pop_check_state() | ||
| 750 | if(HAVE_OPENGLES_V1) | ||
| 751 | set(HAVE_OPENGLES TRUE) | ||
| 752 | set(SDL_VIDEO_OPENGL_ES 1) | ||
| 753 | endif() | ||
| 754 | if(HAVE_OPENGLES_V2) | ||
| 755 | set(HAVE_OPENGLES TRUE) | ||
| 756 | set(SDL_VIDEO_OPENGL_ES2 1) | ||
| 757 | set(SDL_VIDEO_RENDER_OGL_ES2 1) | ||
| 758 | endif() | ||
| 759 | endif() | ||
| 760 | endmacro() | ||
| 761 | |||
| 762 | macro(CheckVulkan) | ||
| 763 | if(SDL_VULKAN) | ||
| 764 | set(SDL_VIDEO_VULKAN 1) | ||
| 765 | set(HAVE_VULKAN TRUE) | ||
| 766 | if(SDL_RENDER_VULKAN) | ||
| 767 | set(SDL_VIDEO_RENDER_VULKAN 1) | ||
| 768 | set(HAVE_RENDER_VULKAN TRUE) | ||
| 769 | endif() | ||
| 770 | endif() | ||
| 771 | endmacro() | ||
| 772 | |||
| 773 | # Requires: | ||
| 774 | # - EGL | ||
| 775 | macro(CheckQNXScreen) | ||
| 776 | if(QNX AND HAVE_OPENGL_EGL) | ||
| 777 | check_c_source_compiles(" | ||
| 778 | #include <screen/screen.h> | ||
| 779 | int main (int argc, char** argv) { return 0; }" HAVE_QNX_SCREEN) | ||
| 780 | if(HAVE_QNX_SCREEN) | ||
| 781 | set(SDL_VIDEO_DRIVER_QNX 1) | ||
| 782 | sdl_glob_sources("${SDL3_SOURCE_DIR}/src/video/qnx/*.c") | ||
| 783 | sdl_link_dependency(qnxscreen LIBS screen EGL) | ||
| 784 | endif() | ||
| 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 | cmake_push_check_state() | ||
| 797 | if(SDL_PTHREADS) | ||
| 798 | if(ANDROID) | ||
| 799 | # the android libc provides built-in support for pthreads, so no | ||
| 800 | # additional linking or compile flags are necessary | ||
| 801 | elseif(LINUX) | ||
| 802 | set(PTHREAD_CFLAGS "-D_REENTRANT") | ||
| 803 | set(PTHREAD_LDFLAGS "-pthread") | ||
| 804 | elseif(BSDI) | ||
| 805 | set(PTHREAD_CFLAGS "-D_REENTRANT -D_THREAD_SAFE") | ||
| 806 | set(PTHREAD_LDFLAGS "") | ||
| 807 | elseif(DARWIN) | ||
| 808 | set(PTHREAD_CFLAGS "-D_THREAD_SAFE") | ||
| 809 | # causes Carbon.p complaints? | ||
| 810 | # set(PTHREAD_CFLAGS "-D_REENTRANT -D_THREAD_SAFE") | ||
| 811 | set(PTHREAD_LDFLAGS "") | ||
| 812 | elseif(FREEBSD) | ||
| 813 | set(PTHREAD_CFLAGS "-D_REENTRANT -D_THREAD_SAFE") | ||
| 814 | set(PTHREAD_LDFLAGS "-pthread") | ||
| 815 | elseif(NETBSD) | ||
| 816 | set(PTHREAD_CFLAGS "-D_REENTRANT -D_THREAD_SAFE") | ||
| 817 | set(PTHREAD_LDFLAGS "-lpthread") | ||
| 818 | elseif(OPENBSD) | ||
| 819 | set(PTHREAD_CFLAGS "-D_REENTRANT") | ||
| 820 | set(PTHREAD_LDFLAGS "-lpthread") | ||
| 821 | elseif(SOLARIS) | ||
| 822 | set(PTHREAD_CFLAGS "-D_REENTRANT") | ||
| 823 | if(CMAKE_C_COMPILER_ID MATCHES "SunPro") | ||
| 824 | set(PTHREAD_LDFLAGS "-mt -lpthread") | ||
| 825 | else() | ||
| 826 | set(PTHREAD_LDFLAGS "-pthread -lposix4") | ||
| 827 | endif() | ||
| 828 | elseif(SYSV5) | ||
| 829 | set(PTHREAD_CFLAGS "-D_REENTRANT -Kthread") | ||
| 830 | set(PTHREAD_LDFLAGS "") | ||
| 831 | elseif(AIX) | ||
| 832 | set(PTHREAD_CFLAGS "-D_REENTRANT -mthreads") | ||
| 833 | set(PTHREAD_LDFLAGS "-pthread") | ||
| 834 | elseif(HPUX) | ||
| 835 | set(PTHREAD_CFLAGS "-D_REENTRANT") | ||
| 836 | set(PTHREAD_LDFLAGS "-L/usr/lib -pthread") | ||
| 837 | elseif(HAIKU) | ||
| 838 | set(PTHREAD_CFLAGS "-D_REENTRANT") | ||
| 839 | set(PTHREAD_LDFLAGS "") | ||
| 840 | elseif(EMSCRIPTEN) | ||
| 841 | set(PTHREAD_CFLAGS "-D_REENTRANT -pthread") | ||
| 842 | set(PTHREAD_LDFLAGS "-pthread") | ||
| 843 | elseif(QNX) | ||
| 844 | # pthread support is baked in | ||
| 845 | else() | ||
| 846 | set(PTHREAD_CFLAGS "-D_REENTRANT") | ||
| 847 | set(PTHREAD_LDFLAGS "-lpthread") | ||
| 848 | endif() | ||
| 849 | |||
| 850 | # Run some tests | ||
| 851 | string(APPEND CMAKE_REQUIRED_FLAGS " ${PTHREAD_CFLAGS} ${PTHREAD_LDFLAGS}") | ||
| 852 | check_c_source_compiles(" | ||
| 853 | #include <pthread.h> | ||
| 854 | int main(int argc, char** argv) { | ||
| 855 | pthread_attr_t type; | ||
| 856 | pthread_attr_init(&type); | ||
| 857 | return 0; | ||
| 858 | }" HAVE_PTHREADS) | ||
| 859 | if(HAVE_PTHREADS) | ||
| 860 | set(SDL_THREAD_PTHREAD 1) | ||
| 861 | separate_arguments(PTHREAD_CFLAGS) | ||
| 862 | sdl_compile_options(PRIVATE ${PTHREAD_CFLAGS}) | ||
| 863 | sdl_link_dependency(pthread LINK_OPTIONS ${PTHREAD_LDFLAGS}) | ||
| 864 | |||
| 865 | check_c_source_compiles(" | ||
| 866 | #include <pthread.h> | ||
| 867 | int main(int argc, char **argv) { | ||
| 868 | pthread_mutexattr_t attr; | ||
| 869 | pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); | ||
| 870 | return 0; | ||
| 871 | }" HAVE_RECURSIVE_MUTEXES) | ||
| 872 | if(HAVE_RECURSIVE_MUTEXES) | ||
| 873 | set(SDL_THREAD_PTHREAD_RECURSIVE_MUTEX 1) | ||
| 874 | else() | ||
| 875 | check_c_source_compiles(" | ||
| 876 | #include <pthread.h> | ||
| 877 | int main(int argc, char **argv) { | ||
| 878 | pthread_mutexattr_t attr; | ||
| 879 | pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE_NP); | ||
| 880 | return 0; | ||
| 881 | }" HAVE_RECURSIVE_MUTEXES_NP) | ||
| 882 | if(HAVE_RECURSIVE_MUTEXES_NP) | ||
| 883 | set(SDL_THREAD_PTHREAD_RECURSIVE_MUTEX_NP 1) | ||
| 884 | endif() | ||
| 885 | endif() | ||
| 886 | |||
| 887 | if(SDL_PTHREADS_SEM) | ||
| 888 | check_c_source_compiles("#include <pthread.h> | ||
| 889 | #include <semaphore.h> | ||
| 890 | int main(int argc, char **argv) { return 0; }" HAVE_PTHREADS_SEM) | ||
| 891 | if(HAVE_PTHREADS_SEM) | ||
| 892 | check_c_source_compiles(" | ||
| 893 | #include <pthread.h> | ||
| 894 | #include <semaphore.h> | ||
| 895 | int main(int argc, char **argv) { | ||
| 896 | sem_timedwait(NULL, NULL); | ||
| 897 | return 0; | ||
| 898 | }" COMPILER_HAS_SEM_TIMEDWAIT) | ||
| 899 | set(HAVE_SEM_TIMEDWAIT ${COMPILER_HAS_SEM_TIMEDWAIT}) | ||
| 900 | endif() | ||
| 901 | endif() | ||
| 902 | |||
| 903 | check_include_file(pthread.h HAVE_PTHREAD_H) | ||
| 904 | check_include_file(pthread_np.h HAVE_PTHREAD_NP_H) | ||
| 905 | if (HAVE_PTHREAD_H) | ||
| 906 | check_c_source_compiles(" | ||
| 907 | #include <pthread.h> | ||
| 908 | int main(int argc, char **argv) { | ||
| 909 | #ifdef __APPLE__ | ||
| 910 | pthread_setname_np(\"\"); | ||
| 911 | #else | ||
| 912 | pthread_setname_np(pthread_self(),\"\"); | ||
| 913 | #endif | ||
| 914 | return 0; | ||
| 915 | }" HAVE_PTHREAD_SETNAME_NP) | ||
| 916 | if (HAVE_PTHREAD_NP_H) | ||
| 917 | check_symbol_exists(pthread_set_name_np "pthread.h;pthread_np.h" HAVE_PTHREAD_SET_NAME_NP) | ||
| 918 | endif() | ||
| 919 | endif() | ||
| 920 | |||
| 921 | sdl_sources( | ||
| 922 | "${SDL3_SOURCE_DIR}/src/thread/pthread/SDL_systhread.c" | ||
| 923 | "${SDL3_SOURCE_DIR}/src/thread/pthread/SDL_sysmutex.c" # Can be faked, if necessary | ||
| 924 | "${SDL3_SOURCE_DIR}/src/thread/pthread/SDL_syscond.c" # Can be faked, if necessary | ||
| 925 | "${SDL3_SOURCE_DIR}/src/thread/pthread/SDL_sysrwlock.c" # Can be faked, if necessary | ||
| 926 | "${SDL3_SOURCE_DIR}/src/thread/pthread/SDL_systls.c" | ||
| 927 | ) | ||
| 928 | if(HAVE_PTHREADS_SEM) | ||
| 929 | sdl_sources("${SDL3_SOURCE_DIR}/src/thread/pthread/SDL_syssem.c") | ||
| 930 | else() | ||
| 931 | sdl_sources("${SDL3_SOURCE_DIR}/src/thread/generic/SDL_syssem.c") | ||
| 932 | endif() | ||
| 933 | set(HAVE_SDL_THREADS TRUE) | ||
| 934 | endif() | ||
| 935 | endif() | ||
| 936 | cmake_pop_check_state() | ||
| 937 | endmacro() | ||
| 938 | |||
| 939 | # Requires | ||
| 940 | # - nada | ||
| 941 | # Optional: | ||
| 942 | # Sets: | ||
| 943 | # USB_LIBS | ||
| 944 | # USB_CFLAGS | ||
| 945 | macro(CheckUSBHID) | ||
| 946 | cmake_push_check_state() | ||
| 947 | check_library_exists(usbhid hid_init "" LIBUSBHID) | ||
| 948 | if(LIBUSBHID) | ||
| 949 | check_include_file(usbhid.h HAVE_USBHID_H) | ||
| 950 | if(HAVE_USBHID_H) | ||
| 951 | set(USB_CFLAGS "-DHAVE_USBHID_H") | ||
| 952 | endif() | ||
| 953 | |||
| 954 | check_include_file(libusbhid.h HAVE_LIBUSBHID_H) | ||
| 955 | if(HAVE_LIBUSBHID_H) | ||
| 956 | string(APPEND USB_CFLAGS " -DHAVE_LIBUSBHID_H") | ||
| 957 | endif() | ||
| 958 | set(USB_LIBS ${USB_LIBS} usbhid) | ||
| 959 | else() | ||
| 960 | check_include_file(usb.h HAVE_USB_H) | ||
| 961 | if(HAVE_USB_H) | ||
| 962 | set(USB_CFLAGS "-DHAVE_USB_H") | ||
| 963 | endif() | ||
| 964 | check_include_file(libusb.h HAVE_LIBUSB_H) | ||
| 965 | if(HAVE_LIBUSB_H) | ||
| 966 | string(APPEND USB_CFLAGS " -DHAVE_LIBUSB_H") | ||
| 967 | endif() | ||
| 968 | check_library_exists(usb hid_init "" LIBUSB) | ||
| 969 | if(LIBUSB) | ||
| 970 | list(APPEND USB_LIBS usb) | ||
| 971 | endif() | ||
| 972 | endif() | ||
| 973 | |||
| 974 | string(APPEND CMAKE_REQUIRED_FLAGS " ${USB_CFLAGS}") | ||
| 975 | list(APPEND CMAKE_REQUIRED_LIBRARIES ${USB_LIBS}) | ||
| 976 | check_c_source_compiles(" | ||
| 977 | #include <sys/types.h> | ||
| 978 | #if defined(HAVE_USB_H) | ||
| 979 | #include <usb.h> | ||
| 980 | #endif | ||
| 981 | #ifdef __DragonFly__ | ||
| 982 | # include <bus/u4b/usb.h> | ||
| 983 | # include <bus/u4b/usbhid.h> | ||
| 984 | #else | ||
| 985 | # include <dev/usb/usb.h> | ||
| 986 | # include <dev/usb/usbhid.h> | ||
| 987 | #endif | ||
| 988 | #if defined(HAVE_USBHID_H) | ||
| 989 | #include <usbhid.h> | ||
| 990 | #elif defined(HAVE_LIBUSB_H) | ||
| 991 | #include <libusb.h> | ||
| 992 | #elif defined(HAVE_LIBUSBHID_H) | ||
| 993 | #include <libusbhid.h> | ||
| 994 | #endif | ||
| 995 | int main(int argc, char **argv) { | ||
| 996 | struct report_desc *repdesc; | ||
| 997 | struct usb_ctl_report *repbuf; | ||
| 998 | hid_kind_t hidkind; | ||
| 999 | return 0; | ||
| 1000 | }" HAVE_USBHID) | ||
| 1001 | if(HAVE_USBHID) | ||
| 1002 | check_c_source_compiles(" | ||
| 1003 | #include <sys/types.h> | ||
| 1004 | #if defined(HAVE_USB_H) | ||
| 1005 | #include <usb.h> | ||
| 1006 | #endif | ||
| 1007 | #ifdef __DragonFly__ | ||
| 1008 | # include <bus/u4b/usb.h> | ||
| 1009 | # include <bus/u4b/usbhid.h> | ||
| 1010 | #else | ||
| 1011 | # include <dev/usb/usb.h> | ||
| 1012 | # include <dev/usb/usbhid.h> | ||
| 1013 | #endif | ||
| 1014 | #if defined(HAVE_USBHID_H) | ||
| 1015 | #include <usbhid.h> | ||
| 1016 | #elif defined(HAVE_LIBUSB_H) | ||
| 1017 | #include <libusb.h> | ||
| 1018 | #elif defined(HAVE_LIBUSBHID_H) | ||
| 1019 | #include <libusbhid.h> | ||
| 1020 | #endif | ||
| 1021 | int main(int argc, char** argv) { | ||
| 1022 | struct usb_ctl_report buf; | ||
| 1023 | if (buf.ucr_data) { } | ||
| 1024 | return 0; | ||
| 1025 | }" HAVE_USBHID_UCR_DATA) | ||
| 1026 | if(HAVE_USBHID_UCR_DATA) | ||
| 1027 | string(APPEND USB_CFLAGS " -DUSBHID_UCR_DATA") | ||
| 1028 | endif() | ||
| 1029 | |||
| 1030 | check_c_source_compiles(" | ||
| 1031 | #include <sys/types.h> | ||
| 1032 | #if defined(HAVE_USB_H) | ||
| 1033 | #include <usb.h> | ||
| 1034 | #endif | ||
| 1035 | #ifdef __DragonFly__ | ||
| 1036 | #include <bus/u4b/usb.h> | ||
| 1037 | #include <bus/u4b/usbhid.h> | ||
| 1038 | #else | ||
| 1039 | #include <dev/usb/usb.h> | ||
| 1040 | #include <dev/usb/usbhid.h> | ||
| 1041 | #endif | ||
| 1042 | #if defined(HAVE_USBHID_H) | ||
| 1043 | #include <usbhid.h> | ||
| 1044 | #elif defined(HAVE_LIBUSB_H) | ||
| 1045 | #include <libusb.h> | ||
| 1046 | #elif defined(HAVE_LIBUSBHID_H) | ||
| 1047 | #include <libusbhid.h> | ||
| 1048 | #endif | ||
| 1049 | int main(int argc, char **argv) { | ||
| 1050 | report_desc_t d; | ||
| 1051 | hid_start_parse(d, 1, 1); | ||
| 1052 | return 0; | ||
| 1053 | }" HAVE_USBHID_NEW) | ||
| 1054 | if(HAVE_USBHID_NEW) | ||
| 1055 | string(APPEND USB_CFLAGS " -DUSBHID_NEW") | ||
| 1056 | endif() | ||
| 1057 | |||
| 1058 | check_c_source_compiles(" | ||
| 1059 | #include <machine/joystick.h> | ||
| 1060 | int main(int argc, char** argv) { | ||
| 1061 | struct joystick t; | ||
| 1062 | return 0; | ||
| 1063 | }" HAVE_MACHINE_JOYSTICK) | ||
| 1064 | if(HAVE_MACHINE_JOYSTICK) | ||
| 1065 | set(SDL_HAVE_MACHINE_JOYSTICK_H 1) | ||
| 1066 | endif() | ||
| 1067 | set(SDL_JOYSTICK_USBHID 1) | ||
| 1068 | sdl_glob_sources("${SDL3_SOURCE_DIR}/src/joystick/bsd/*.c") | ||
| 1069 | separate_arguments(USB_CFLAGS) | ||
| 1070 | sdl_compile_options(PRIVATE ${USB_CFLAGS}) | ||
| 1071 | #FIXME: properly add usb libs with pkg-config or whatever | ||
| 1072 | sdl_link_dependency(usbhid LIBS ${USB_LIBS}) | ||
| 1073 | set(HAVE_SDL_JOYSTICK TRUE) | ||
| 1074 | endif() | ||
| 1075 | cmake_pop_check_state() | ||
| 1076 | endmacro() | ||
| 1077 | |||
| 1078 | # Check for HIDAPI support | ||
| 1079 | macro(CheckHIDAPI) | ||
| 1080 | if(SDL_HIDAPI) | ||
| 1081 | set(HAVE_HIDAPI ON) | ||
| 1082 | if(SDL_HIDAPI_LIBUSB) | ||
| 1083 | set(HAVE_LIBUSB FALSE) | ||
| 1084 | find_package(LibUSB) | ||
| 1085 | if(LibUSB_FOUND) | ||
| 1086 | cmake_push_check_state() | ||
| 1087 | list(APPEND CMAKE_REQUIRED_LIBRARIES LibUSB::LibUSB) | ||
| 1088 | check_c_source_compiles(" | ||
| 1089 | #include <stddef.h> | ||
| 1090 | #include <libusb.h> | ||
| 1091 | int main(int argc, char **argv) { | ||
| 1092 | libusb_close(NULL); | ||
| 1093 | return 0; | ||
| 1094 | }" HAVE_LIBUSB_H) | ||
| 1095 | cmake_pop_check_state() | ||
| 1096 | if(HAVE_LIBUSB_H) | ||
| 1097 | set(HAVE_LIBUSB TRUE) | ||
| 1098 | target_get_dynamic_library(dynamic_libusb LibUSB::LibUSB) | ||
| 1099 | if(SDL_HIDAPI_LIBUSB_SHARED AND dynamic_libusb) | ||
| 1100 | set(HAVE_HIDAPI_LIBUSB_SHARED ON) | ||
| 1101 | set(SDL_LIBUSB_DYNAMIC "\"${dynamic_libusb}\"") | ||
| 1102 | sdl_link_dependency(hidapi INCLUDES $<TARGET_PROPERTY:LibUSB::LibUSB,INTERFACE_INCLUDE_DIRECTORIES>) | ||
| 1103 | else() | ||
| 1104 | sdl_link_dependency(hidapi LIBS LibUSB::LibUSB PKG_CONFIG_SPECS "${LibUSB_PKG_CONFIG_SPEC}" CMAKE_MODULE LibUSB) | ||
| 1105 | endif() | ||
| 1106 | endif() | ||
| 1107 | endif() | ||
| 1108 | set(HAVE_HIDAPI_LIBUSB ${HAVE_LIBUSB}) | ||
| 1109 | endif() | ||
| 1110 | |||
| 1111 | if(HAVE_HIDAPI) | ||
| 1112 | if(ANDROID) | ||
| 1113 | enable_language(CXX) | ||
| 1114 | sdl_sources("${SDL3_SOURCE_DIR}/src/hidapi/android/hid.cpp") | ||
| 1115 | endif() | ||
| 1116 | if(IOS OR TVOS) | ||
| 1117 | sdl_sources("${SDL3_SOURCE_DIR}/src/hidapi/ios/hid.m") | ||
| 1118 | set(SDL_FRAMEWORK_COREBLUETOOTH 1) | ||
| 1119 | endif() | ||
| 1120 | set(HAVE_SDL_HIDAPI TRUE) | ||
| 1121 | |||
| 1122 | if(SDL_JOYSTICK AND SDL_HIDAPI_JOYSTICK) | ||
| 1123 | set(SDL_JOYSTICK_HIDAPI 1) | ||
| 1124 | set(HAVE_SDL_JOYSTICK TRUE) | ||
| 1125 | set(HAVE_HIDAPI_JOYSTICK TRUE) | ||
| 1126 | sdl_glob_sources("${SDL3_SOURCE_DIR}/src/joystick/hidapi/*.c") | ||
| 1127 | endif() | ||
| 1128 | else() | ||
| 1129 | set(SDL_HIDAPI_DISABLED 1) | ||
| 1130 | endif() | ||
| 1131 | else() | ||
| 1132 | set(SDL_HIDAPI_DISABLED 1) | ||
| 1133 | endif() | ||
| 1134 | endmacro() | ||
| 1135 | |||
| 1136 | # Requires: | ||
| 1137 | # - n/a | ||
| 1138 | macro(CheckRPI) | ||
| 1139 | if(SDL_RPI) | ||
| 1140 | set(BCM_HOST_PKG_CONFIG_SPEC bcm_host) | ||
| 1141 | set(BRCMEGL_PKG_CONFIG_SPEC brcmegl) | ||
| 1142 | |||
| 1143 | set(original_PKG_CONFIG_PATH $ENV{PKG_CONFIG_PATH}) | ||
| 1144 | set(ENV{PKG_CONFIG_PATH} "${original_PKG_CONFIG_PATH}:/opt/vc/lib/pkgconfig") | ||
| 1145 | set(PC_BCM_HOST_FOUND FALSE) | ||
| 1146 | set(PC_BRCMEGL_FOUND FALSE) | ||
| 1147 | if(PKG_CONFIG_FOUND) | ||
| 1148 | pkg_check_modules(PC_BCM_HOST IMPORTED_TARGET QUIET ${BCM_HOST_PKG_CONFIG_SPEC}) | ||
| 1149 | pkg_check_modules(PC_BRCMEGL IMPORTED_TARGET QUIET ${BRCMEGL_PKG_CONFIG_SPEC}) | ||
| 1150 | endif() | ||
| 1151 | set(ENV{PKG_CONFIG_PATH} "${original_PKG_CONFIG_PATH}") | ||
| 1152 | |||
| 1153 | if(TARGET PkgConfig::PC_BCM_HOST AND TARGET PkgConfig::PC_BRCMEGL) | ||
| 1154 | set(HAVE_RPI TRUE) | ||
| 1155 | if(SDL_VIDEO) | ||
| 1156 | set(HAVE_SDL_VIDEO TRUE) | ||
| 1157 | set(SDL_VIDEO_DRIVER_RPI 1) | ||
| 1158 | sdl_glob_sources("${SDL3_SOURCE_DIR}/src/video/raspberry/*.c") | ||
| 1159 | sdl_link_dependency(rpi-video LIBS PkgConfig::PC_BCM_HOST PKG_CONFIG_PREFIX PC_BCM_HOST PKG_CONFIG_SPECS ${BCM_HOST_PKG_CONFIG_SPEC}) | ||
| 1160 | endif() | ||
| 1161 | endif() | ||
| 1162 | endif() | ||
| 1163 | endmacro() | ||
| 1164 | |||
| 1165 | # Requires: | ||
| 1166 | # - n/a | ||
| 1167 | macro(CheckROCKCHIP) | ||
| 1168 | if(SDL_ROCKCHIP) | ||
| 1169 | set(MALI_PKG_CONFIG_SPEC mali) | ||
| 1170 | set(PC_MALI_FOUND FALSE) | ||
| 1171 | if(PKG_CONFIG_FOUND) | ||
| 1172 | pkg_check_modules(PC_MALI QUIET ${MALI_PKG_CONFIG_SPEC}) | ||
| 1173 | endif() | ||
| 1174 | if(PC_MALI_FOUND) | ||
| 1175 | set(HAVE_ROCKCHIP TRUE) | ||
| 1176 | endif() | ||
| 1177 | if(SDL_VIDEO AND HAVE_ROCKCHIP) | ||
| 1178 | set(HAVE_SDL_VIDEO TRUE) | ||
| 1179 | set(SDL_VIDEO_DRIVER_ROCKCHIP 1) | ||
| 1180 | endif() | ||
| 1181 | endif() | ||
| 1182 | endmacro() | ||
| 1183 | |||
| 1184 | # Requires: | ||
| 1185 | # - EGL | ||
| 1186 | # - PkgCheckModules | ||
| 1187 | # Optional: | ||
| 1188 | # - SDL_KMSDRM_SHARED opt | ||
| 1189 | # - HAVE_SDL_LOADSO opt | ||
| 1190 | macro(CheckKMSDRM) | ||
| 1191 | if(SDL_KMSDRM) | ||
| 1192 | set(PKG_CONFIG_LIBDRM_SPEC libdrm) | ||
| 1193 | set(PKG_CONFIG_GBM_SPEC gbm) | ||
| 1194 | set(PC_LIBDRM_FOUND FALSE) | ||
| 1195 | set(PC_GBM_FOUND FALSE) | ||
| 1196 | if(PKG_CONFIG_FOUND) | ||
| 1197 | pkg_check_modules(PC_LIBDRM IMPORTED_TARGET ${PKG_CONFIG_LIBDRM_SPEC}) | ||
| 1198 | pkg_check_modules(PC_GBM IMPORTED_TARGET ${PKG_CONFIG_GBM_SPEC}) | ||
| 1199 | endif() | ||
| 1200 | if(PC_LIBDRM_FOUND AND PC_GBM_FOUND AND HAVE_OPENGL_EGL) | ||
| 1201 | set(HAVE_KMSDRM TRUE) | ||
| 1202 | set(HAVE_SDL_VIDEO TRUE) | ||
| 1203 | |||
| 1204 | sdl_glob_sources("${SDL3_SOURCE_DIR}/src/video/kmsdrm/*.c") | ||
| 1205 | |||
| 1206 | set(SDL_VIDEO_DRIVER_KMSDRM 1) | ||
| 1207 | |||
| 1208 | if(SDL_KMSDRM_SHARED AND NOT HAVE_SDL_LOADSO) | ||
| 1209 | message(WARNING "You must have SDL_LoadObject() support for dynamic KMS/DRM loading") | ||
| 1210 | endif() | ||
| 1211 | set(HAVE_KMSDRM_SHARED FALSE) | ||
| 1212 | if(SDL_KMSDRM_SHARED AND HAVE_SDL_LOADSO) | ||
| 1213 | FindLibraryAndSONAME(drm LIBDIRS ${PC_LIBDRM_LIBRARY_DIRS}) | ||
| 1214 | FindLibraryAndSONAME(gbm LIBDIRS ${PC_GBM_LIBRARY_DIRS}) | ||
| 1215 | if(DRM_LIB AND DRM_SHARED AND GBM_LIB AND GBM_SHARED) | ||
| 1216 | set(SDL_VIDEO_DRIVER_KMSDRM_DYNAMIC "\"${DRM_LIB_SONAME}\"") | ||
| 1217 | set(SDL_VIDEO_DRIVER_KMSDRM_DYNAMIC_GBM "\"${GBM_LIB_SONAME}\"") | ||
| 1218 | set(HAVE_KMSDRM_SHARED TRUE) | ||
| 1219 | sdl_link_dependency(kmsdrm-drm INCLUDES $<TARGET_PROPERTY:PkgConfig::PC_LIBDRM,INTERFACE_INCLUDE_DIRECTORIES>) | ||
| 1220 | sdl_link_dependency(kmsdrm-gbm INCLUDES $<TARGET_PROPERTY:PkgConfig::PC_GBM,INTERFACE_INCLUDE_DIRECTORIES>) | ||
| 1221 | endif() | ||
| 1222 | endif() | ||
| 1223 | if(NOT HAVE_KMSDRM_SHARED) | ||
| 1224 | sdl_link_dependency(kmsdrm-libdrm LIBS PkgConfig::PC_LIBDRM PKG_CONFIG_PREFIX PC_LIBDRM PKG_CONFIG_SPECS ${PKG_CONFIG_LIBDRM_SPEC}) | ||
| 1225 | sdl_link_dependency(kmsdrm-gbm LIBS PkgConfig::PC_GBM PKG_CONFIG_PREFIX PC_GBM PKG_CONFIG_SPECS ${PKG_CONFIG_GBM_SPEC}) | ||
| 1226 | endif() | ||
| 1227 | endif() | ||
| 1228 | endif() | ||
| 1229 | endmacro() | ||
| 1230 | |||
| 1231 | macro(CheckLibUDev) | ||
| 1232 | if(SDL_LIBUDEV) | ||
| 1233 | check_include_file("libudev.h" HAVE_LIBUDEV_HEADER) | ||
| 1234 | if(HAVE_LIBUDEV_HEADER) | ||
| 1235 | set(HAVE_LIBUDEV_H TRUE) | ||
| 1236 | FindLibraryAndSONAME(udev) | ||
| 1237 | if(UDEV_LIB_SONAME) | ||
| 1238 | set(SDL_UDEV_DYNAMIC "\"${UDEV_LIB_SONAME}\"") | ||
| 1239 | set(HAVE_LIBUDEV TRUE) | ||
| 1240 | endif() | ||
| 1241 | endif() | ||
| 1242 | endif() | ||
| 1243 | endmacro() | ||
| 1244 | |||
| 1245 | macro(CheckLibUnwind) | ||
| 1246 | if(TARGET SDL3_test) | ||
| 1247 | set(found_libunwind FALSE) | ||
| 1248 | set(_libunwind_src [==[ | ||
| 1249 | #include <libunwind.h> | ||
| 1250 | int main(int argc, char *argv[]) { | ||
| 1251 | (void)argc; (void)argv; | ||
| 1252 | unw_context_t context; | ||
| 1253 | unw_cursor_t cursor; | ||
| 1254 | unw_word_t pc; | ||
| 1255 | char sym[256]; | ||
| 1256 | unw_word_t offset; | ||
| 1257 | unw_getcontext(&context); | ||
| 1258 | unw_step(&cursor); | ||
| 1259 | unw_get_reg(&cursor, UNW_REG_IP, &pc); | ||
| 1260 | unw_get_proc_name(&cursor, sym, sizeof(sym), &offset); | ||
| 1261 | return 0; | ||
| 1262 | }]==]) | ||
| 1263 | |||
| 1264 | if(NOT found_libunwind) | ||
| 1265 | cmake_push_check_state() | ||
| 1266 | check_c_source_compiles("${_libunwind_src}" LIBC_HAS_WORKING_LIBUNWIND) | ||
| 1267 | cmake_pop_check_state() | ||
| 1268 | if(LIBC_HAS_WORKING_LIBUNWIND) | ||
| 1269 | set(found_libunwind TRUE) | ||
| 1270 | target_compile_definitions(SDL3_test PRIVATE HAVE_LIBUNWIND_H) | ||
| 1271 | endif() | ||
| 1272 | endif() | ||
| 1273 | |||
| 1274 | if(NOT found_libunwind) | ||
| 1275 | cmake_push_check_state() | ||
| 1276 | list(APPEND CMAKE_REQUIRED_LIBRARIES "unwind") | ||
| 1277 | check_c_source_compiles("${_libunwind_src}" LIBUNWIND_HAS_WORKINGLIBUNWIND) | ||
| 1278 | cmake_pop_check_state() | ||
| 1279 | if(LIBUNWIND_HAS_WORKINGLIBUNWIND) | ||
| 1280 | set(found_libunwind TRUE) | ||
| 1281 | sdl_test_link_dependency(UNWIND LIBS unwind) | ||
| 1282 | endif() | ||
| 1283 | endif() | ||
| 1284 | |||
| 1285 | if(NOT found_libunwind) | ||
| 1286 | set(LibUnwind_PKG_CONFIG_SPEC libunwind libunwind-generic) | ||
| 1287 | set(PC_LIBUNWIND_FOUND FALSE) | ||
| 1288 | if(PKG_CONFIG_FOUND) | ||
| 1289 | pkg_check_modules(PC_LIBUNWIND IMPORTED_TARGET ${LibUnwind_PKG_CONFIG_SPEC}) | ||
| 1290 | endif() | ||
| 1291 | if(PC_LIBUNWIND_FOUND) | ||
| 1292 | cmake_push_check_state() | ||
| 1293 | list(APPEND CMAKE_REQUIRED_LIBRARIES ${PC_LIBUNWIND_LIBRARIES}) | ||
| 1294 | list(APPEND CMAKE_REQUIRED_INCLUDES ${PC_LIBUNWIND_INCLUDE_DIRS}) | ||
| 1295 | check_c_source_compiles("${_libunwind_src}" PC_LIBUNWIND_HAS_WORKING_LIBUNWIND) | ||
| 1296 | cmake_pop_check_state() | ||
| 1297 | if(PC_LIBUNWIND_HAS_WORKING_LIBUNWIND) | ||
| 1298 | set(found_libunwind TRUE) | ||
| 1299 | sdl_test_link_dependency(UNWIND LIBS PkgConfig::PC_LIBUNWIND PKG_CONFIG_PREFIX PC_LIBUNWIND PKG_CONFIG_SPECS ${LibUnwind_PKG_CONFIG_SPEC}) | ||
| 1300 | endif() | ||
| 1301 | endif() | ||
| 1302 | endif() | ||
| 1303 | |||
| 1304 | if(found_libunwind) | ||
| 1305 | target_compile_definitions(SDL3_test PRIVATE HAVE_LIBUNWIND_H) | ||
| 1306 | endif() | ||
| 1307 | endif() | ||
| 1308 | endmacro() | ||
