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