macro(FindLibraryAndSONAME _LIB) cmake_parse_arguments(_FLAS "" "" "LIBDIRS" ${ARGN}) string(TOUPPER ${_LIB} _UPPERLNAME) string(REGEX REPLACE "\\-" "_" _LNAME "${_UPPERLNAME}") find_library(${_LNAME}_LIB ${_LIB} PATHS ${_FLAS_LIBDIRS}) # FIXME: fail FindLibraryAndSONAME when library is not shared. if(${_LNAME}_LIB MATCHES ".*\\${CMAKE_SHARED_LIBRARY_SUFFIX}.*" AND NOT ${_LNAME}_LIB MATCHES ".*\\${CMAKE_STATIC_LIBRARY_SUFFIX}.*") set(${_LNAME}_SHARED TRUE) else() set(${_LNAME}_SHARED FALSE) endif() if(${_LNAME}_LIB) # reduce the library name for shared linking get_filename_component(_LIB_REALPATH ${${_LNAME}_LIB} REALPATH) # resolves symlinks get_filename_component(_LIB_LIBDIR ${_LIB_REALPATH} DIRECTORY) get_filename_component(_LIB_JUSTNAME ${_LIB_REALPATH} NAME) if(APPLE) string(REGEX REPLACE "(\\.[0-9]*)\\.[0-9\\.]*dylib$" "\\1.dylib" _LIB_REGEXD "${_LIB_JUSTNAME}") else() string(REGEX REPLACE "(\\.[0-9]*)\\.[0-9\\.]*$" "\\1" _LIB_REGEXD "${_LIB_JUSTNAME}") endif() if(NOT EXISTS "${_LIB_LIBDIR}/${_LIB_REGEXD}") set(_LIB_REGEXD "${_LIB_JUSTNAME}") endif() set(${_LNAME}_LIBDIR "${_LIB_LIBDIR}") message(STATUS "dynamic lib${_LIB} -> ${_LIB_REGEXD}") set(${_LNAME}_LIB_SONAME ${_LIB_REGEXD}) endif() message(DEBUG "DYNLIB OUTPUTVAR: ${_LIB} ... ${_LNAME}_LIB") message(DEBUG "DYNLIB ORIGINAL LIB: ${_LIB} ... ${${_LNAME}_LIB}") message(DEBUG "DYNLIB REALPATH LIB: ${_LIB} ... ${_LIB_REALPATH}") message(DEBUG "DYNLIB JUSTNAME LIB: ${_LIB} ... ${_LIB_JUSTNAME}") message(DEBUG "DYNLIB SONAME LIB: ${_LIB} ... ${_LIB_REGEXD}") endmacro() macro(CheckDLOPEN) check_symbol_exists(dlopen "dlfcn.h" HAVE_DLOPEN_IN_LIBC) if(NOT HAVE_DLOPEN_IN_LIBC) cmake_push_check_state() list(APPEND CMAKE_REQUIRED_LIBRARIES dl) check_symbol_exists(dlopen "dlfcn.h" HAVE_DLOPEN_IN_LIBDL) cmake_pop_check_state() if(HAVE_DLOPEN_IN_LIBDL) sdl_link_dependency(dl LIBS dl) endif() endif() if(HAVE_DLOPEN_IN_LIBC OR HAVE_DLOPEN_IN_LIBDL) set(HAVE_DLOPEN TRUE) endif() endmacro() macro(CheckO_CLOEXEC) check_c_source_compiles(" #include int flag = O_CLOEXEC; int main(int argc, char **argv) { return 0; }" HAVE_O_CLOEXEC) endmacro() # Requires: # - n/a macro(CheckOSS) if(SDL_OSS) check_c_source_compiles(" #include int main(int argc, char **argv) { int arg = SNDCTL_DSP_SETFRAGMENT; return 0; }" HAVE_OSS_SYS_SOUNDCARD_H) if(HAVE_OSS_SYS_SOUNDCARD_H) set(HAVE_OSS TRUE) sdl_glob_sources(${SDL3_SOURCE_DIR}/src/audio/dsp/*.c) set(SDL_AUDIO_DRIVER_OSS 1) if(NETBSD) sdl_link_dependency(oss LIBS ossaudio) endif() set(HAVE_SDL_AUDIO TRUE) endif() endif() endmacro() # Requires: # - n/a # Optional: # - SDL_ALSA_SHARED opt # - HAVE_SDL_LOADSO opt macro(CheckALSA) if(SDL_ALSA) set(ALSA_PKG_CONFIG_SPEC "alsa") find_package(ALSA MODULE) if(ALSA_FOUND) sdl_glob_sources("${SDL3_SOURCE_DIR}/src/audio/alsa/*.c") set(SDL_AUDIO_DRIVER_ALSA 1) set(HAVE_ALSA TRUE) set(HAVE_ALSA_SHARED FALSE) if(SDL_ALSA_SHARED) if(HAVE_SDL_LOADSO) FindLibraryAndSONAME("asound") if(ASOUND_LIB AND ASOUND_SHARED) sdl_link_dependency(alsa INCLUDES $) set(SDL_AUDIO_DRIVER_ALSA_DYNAMIC "\"${ASOUND_LIB_SONAME}\"") set(HAVE_ALSA_SHARED TRUE) else() message(WARNING "Unable to find asound shared object") endif() else() message(WARNING "You must have SDL_LoadObject() support for dynamic ALSA loading") endif() endif() if(NOT HAVE_ALSA_SHARED) #FIXME: remove this line and property generate sdl3.pc list(APPEND SDL_PC_PRIVATE_REQUIRES alsa) sdl_link_dependency(alsa LIBS ALSA::ALSA CMAKE_MODULE ALSA PKG_CONFIG_SPECS "${ALSA_PKG_CONFIG_SPEC}") endif() set(HAVE_SDL_AUDIO TRUE) endif() else() set(HAVE_ALSA FALSE) message(WARNING "Unable to find the alsa development library") endif() endmacro() # Requires: # - PkgCheckModules # Optional: # - SDL_PIPEWIRE_SHARED opt # - HAVE_SDL_LOADSO opt macro(CheckPipewire) if(SDL_PIPEWIRE) set(PipeWire_PKG_CONFIG_SPEC libpipewire-0.3>=0.3.20) pkg_check_modules(PC_PIPEWIRE IMPORTED_TARGET ${PipeWire_PKG_CONFIG_SPEC}) if(PC_PIPEWIRE_FOUND) set(HAVE_PIPEWIRE TRUE) sdl_glob_sources("${SDL3_SOURCE_DIR}/src/audio/pipewire/*.c") set(SDL_AUDIO_DRIVER_PIPEWIRE 1) if(SDL_PIPEWIRE_SHARED AND NOT HAVE_SDL_LOADSO) message(WARNING "You must have SDL_LoadObject() support for dynamic PipeWire loading") endif() FindLibraryAndSONAME("pipewire-0.3" LIBDIRS ${PC_PIPEWIRE_LIBRARY_DIRS}) if(SDL_PIPEWIRE_SHARED AND PIPEWIRE_0.3_LIB AND HAVE_SDL_LOADSO) set(SDL_AUDIO_DRIVER_PIPEWIRE_DYNAMIC "\"${PIPEWIRE_0.3_LIB_SONAME}\"") set(HAVE_PIPEWIRE_SHARED TRUE) sdl_link_dependency(pipewire INCLUDES $) else() sdl_link_dependency(pipewire LIBS PkgConfig::PC_PIPEWIRE PKG_CONFIG_PREFIX PC_PIPEWIRE PKG_CONFIG_SPECS ${PipeWire_PKG_CONFIG_SPEC}) endif() set(HAVE_SDL_AUDIO TRUE) endif() endif() endmacro() # Requires: # - PkgCheckModules # Optional: # - SDL_PULSEAUDIO_SHARED opt # - HAVE_SDL_LOADSO opt macro(CheckPulseAudio) if(SDL_PULSEAUDIO) set(PulseAudio_PKG_CONFIG_SPEC "libpulse>=5.0") pkg_check_modules(PC_PULSEAUDIO IMPORTED_TARGET ${PulseAudio_PKG_CONFIG_SPEC}) if(PC_PULSEAUDIO_FOUND) set(HAVE_PULSEAUDIO TRUE) sdl_glob_sources("${SDL3_SOURCE_DIR}/src/audio/pulseaudio/*.c") set(SDL_AUDIO_DRIVER_PULSEAUDIO 1) if(SDL_PULSEAUDIO_SHARED AND NOT HAVE_SDL_LOADSO) message(WARNING "You must have SDL_LoadObject() support for dynamic PulseAudio loading") endif() FindLibraryAndSONAME("pulse" LIBDIRS ${PC_PULSEAUDIO_LIBRARY_DIRS}) if(SDL_PULSEAUDIO_SHARED AND PULSE_LIB AND HAVE_SDL_LOADSO) set(SDL_AUDIO_DRIVER_PULSEAUDIO_DYNAMIC "\"${PULSE_LIB_SONAME}\"") set(HAVE_PULSEAUDIO_SHARED TRUE) sdl_link_dependency(pulseaudio INCLUDES $) else() sdl_link_dependency(pulseaudio LIBS PkgConfig::PC_PULSEAUDIO PKG_CONFIG_PREFIX PC_PULSEAUDIO PKG_CONFIG_SPECS "${PulseAudio_PKG_CONFIG_SPEC}") endif() set(HAVE_SDL_AUDIO TRUE) endif() endif() endmacro() # Requires: # - PkgCheckModules # Optional: # - SDL_JACK_SHARED opt # - HAVE_SDL_LOADSO opt macro(CheckJACK) if(SDL_JACK) set(Jack_PKG_CONFIG_SPEC jack) pkg_check_modules(PC_JACK IMPORTED_TARGET ${Jack_PKG_CONFIG_SPEC}) if(PC_JACK_FOUND) set(HAVE_JACK TRUE) sdl_glob_sources("${SDL3_SOURCE_DIR}/src/audio/jack/*.c") set(SDL_AUDIO_DRIVER_JACK 1) if(SDL_JACK_SHARED AND NOT HAVE_SDL_LOADSO) message(WARNING "You must have SDL_LoadObject() support for dynamic JACK audio loading") endif() FindLibraryAndSONAME("jack" LIBDIRS ${PC_JACK_LIBRARY_DIRS}) if(SDL_JACK_SHARED AND JACK_LIB AND HAVE_SDL_LOADSO) set(SDL_AUDIO_DRIVER_JACK_DYNAMIC "\"${JACK_LIB_SONAME}\"") set(HAVE_JACK_SHARED TRUE) sdl_link_dependency(jack INCLUDES $) else() sdl_link_dependency(jack LIBS PkgConfig::PC_JACK PKG_CONFIG_PREFIX PC_JACK PKG_CONFIG_SPECS ${Jack_PKG_CONFIG_SPEC}) endif() set(HAVE_SDL_AUDIO TRUE) endif() endif() endmacro() # Requires: # - PkgCheckModules # Optional: # - SDL_SNDIO_SHARED opt # - HAVE_SDL_LOADSO opt macro(CheckSNDIO) if(SDL_SNDIO) set(SndIO_PKG_CONFIG_SPEC sndio) pkg_check_modules(PC_SNDIO IMPORTED_TARGET ${SndIO_PKG_CONFIG_SPEC}) if(PC_SNDIO_FOUND) set(HAVE_SNDIO TRUE) sdl_glob_sources("${SDL3_SOURCE_DIR}/src/audio/sndio/*.c") set(SDL_AUDIO_DRIVER_SNDIO 1) if(SDL_SNDIO_SHARED AND NOT HAVE_SDL_LOADSO) message(WARNING "You must have SDL_LoadObject() support for dynamic sndio loading") endif() FindLibraryAndSONAME("sndio" LIBDIRS ${PC_SNDIO_LIBRARY_DIRS}) if(SDL_SNDIO_SHARED AND SNDIO_LIB AND HAVE_SDL_LOADSO) set(SDL_AUDIO_DRIVER_SNDIO_DYNAMIC "\"${SNDIO_LIB_SONAME}\"") set(HAVE_SNDIO_SHARED TRUE) sdl_include_directories(PRIVATE SYSTEM $) else() sdl_link_dependency(sndio LIBS PkgConfig::PC_SNDIO PKG_CONFIG_PREFIX PC_SNDIO PKG_CONFIG_SPECS ${SndIO_PKG_CONFIG_SPEC}) endif() set(HAVE_SDL_AUDIO TRUE) endif() endif() endmacro() # Requires: # - n/a # Optional: # - SDL_X11_SHARED opt # - HAVE_SDL_LOADSO opt macro(CheckX11) cmake_push_check_state() if(SDL_X11) set(X11_PKG_CONFIG_SPEC x11) set(Xext_PKG_CONFIG_SPEC xext) set(Xcursor_PKG_CONFIG_SPEC xcursor) set(Xi_PKG_CONFIG_SPEC xi) set(Xfixes_PKG_CONFIG_SPEC xfixes) set(Xrandr_PKG_CONFIG_SPEC xrandr) set(Xrender_PKG_CONFIG_SPEC xrender) set(Xss_PKG_CONFIG_SPEC xscrnsaver) find_package(X11) foreach(_LIB X11 Xext Xcursor Xi Xfixes Xrandr Xrender Xss) get_filename_component(_libdir "${X11_${_LIB}_LIB}" DIRECTORY) FindLibraryAndSONAME("${_LIB}" LIBDIRS ${_libdir}) endforeach() find_path(X11_INCLUDEDIR NAMES X11/Xlib.h PATHS ${X11_INCLUDE_DIR} /usr/pkg/xorg/include /usr/X11R6/include /usr/X11R7/include /usr/local/include/X11 /usr/include/X11 /usr/openwin/include /usr/openwin/share/include /opt/graphics/OpenGL/include /opt/X11/include ) if(X11_INCLUDEDIR) sdl_include_directories(PRIVATE SYSTEM "${X11_INCLUDEDIR}") list(APPEND CMAKE_REQUIRED_INCLUDES ${X11_INCLUDEDIR}) endif() find_file(HAVE_XCURSOR_H NAMES "X11/Xcursor/Xcursor.h" HINTS "${X11_INCLUDEDIR}") find_file(HAVE_XINPUT2_H NAMES "X11/extensions/XInput2.h" HINTS "${X11_INCLUDEDIR}") find_file(HAVE_XRANDR_H NAMES "X11/extensions/Xrandr.h" HINTS "${X11_INCLUDEDIR}") find_file(HAVE_XFIXES_H_ NAMES "X11/extensions/Xfixes.h" HINTS "${X11_INCLUDEDIR}") find_file(HAVE_XRENDER_H NAMES "X11/extensions/Xrender.h" HINTS "${X11_INCLUDEDIR}") find_file(HAVE_XSS_H NAMES "X11/extensions/scrnsaver.h" HINTS "${X11_INCLUDEDIR}") find_file(HAVE_XSHAPE_H NAMES "X11/extensions/shape.h" HINTS "${X11_INCLUDEDIR}") find_file(HAVE_XDBE_H NAMES "X11/extensions/Xdbe.h" HINTS "${X11_INCLUDEDIR}") find_file(HAVE_XEXT_H NAMES "X11/extensions/Xext.h" HINTS "${X11_INCLUDEDIR}") if(X11_LIB) if(NOT HAVE_XEXT_H) message(FATAL_ERROR "Missing Xext.h, maybe you need to install the libxext-dev package?") endif() set(HAVE_X11 TRUE) set(HAVE_SDL_VIDEO TRUE) sdl_glob_sources("${SDL3_SOURCE_DIR}/src/video/x11/*.c") set(SDL_VIDEO_DRIVER_X11 1) # !!! FIXME: why is this disabled for Apple? if(APPLE) set(SDL_X11_SHARED OFF) endif() check_symbol_exists(shmat "sys/shm.h" HAVE_SHMAT_IN_LIBC) if(NOT HAVE_SHMAT_IN_LIBC) check_library_exists(ipc shmat "" HAVE_SHMAT_IN_LIBIPC) if(HAVE_SHMAT_IN_LIBIPC) sdl_link_dependency(x11_ipc LIBS ipc) endif() if(NOT HAVE_SHMAT_IN_LIBIPC) sdl_compile_definitions(PRIVATE "NO_SHARED_MEMORY") endif() endif() if(SDL_X11_SHARED) if(NOT HAVE_SDL_LOADSO) message(WARNING "You must have SDL_LoadObject() support for dynamic X11 loading") set(HAVE_X11_SHARED FALSE) else() set(HAVE_X11_SHARED TRUE) endif() if(X11_LIB) if(HAVE_X11_SHARED) set(SDL_VIDEO_DRIVER_X11_DYNAMIC "\"${X11_LIB_SONAME}\"") else() sdl_link_dependency(x11 LIBS X11::X11 CMAKE_MODULE X11 PKG_CONFIG_SPECS ${X11_PKG_CONFIG_SPEC}) endif() endif() if(XEXT_LIB) if(HAVE_X11_SHARED) set(SDL_VIDEO_DRIVER_X11_DYNAMIC_XEXT "\"${XEXT_LIB_SONAME}\"") else() sdl_link_dependency(xext LIBS X11::Xext CMAKE_MODULE X11 PKG_CONFIG_SPECS ${Xext_PKG_CONFIG_SPEC}) endif() endif() else() sdl_link_dependency(x11 LIBS X11::X11 CMAKE_MODULE X11 PKG_CONFIG_SPECS ${X11_PKG_CONFIG_SPEC}) sdl_link_dependency(xext LIBS X11::Xext CMAKE_MODULE X11 PKG_CONFIG_SPECS ${Xext_PKG_CONFIG_SPEC}) endif() list(APPEND CMAKE_REQUIRED_LIBRARIES ${X11_LIB}) check_c_source_compiles(" #include int main(int argc, char **argv) { Display *display; XEvent event; XGenericEventCookie *cookie = &event.xcookie; XNextEvent(display, &event); XGetEventData(display, cookie); XFreeEventData(display, cookie); return 0; }" HAVE_XGENERICEVENT) if(HAVE_XGENERICEVENT) set(SDL_VIDEO_DRIVER_X11_SUPPORTS_GENERIC_EVENTS 1) endif() check_symbol_exists(XkbKeycodeToKeysym "X11/Xlib.h;X11/XKBlib.h" SDL_VIDEO_DRIVER_X11_HAS_XKBKEYCODETOKEYSYM) if(SDL_X11_XCURSOR AND HAVE_XCURSOR_H AND XCURSOR_LIB) set(HAVE_X11_XCURSOR TRUE) if(HAVE_X11_SHARED) set(SDL_VIDEO_DRIVER_X11_DYNAMIC_XCURSOR "\"${XCURSOR_LIB_SONAME}\"") else() sdl_link_dependency(xcursor LIBS X11::Xcursor CMAKE_MODULE X11 PKG_CONFIG_SPECS ${Xcursor_PKG_CONFIG_SPEC}) endif() set(SDL_VIDEO_DRIVER_X11_XCURSOR 1) endif() if(SDL_X11_XDBE AND HAVE_XDBE_H) set(HAVE_X11_XDBE TRUE) set(SDL_VIDEO_DRIVER_X11_XDBE 1) endif() if(SDL_X11_XINPUT AND HAVE_XINPUT2_H AND XI_LIB) set(HAVE_X11_XINPUT TRUE) if(HAVE_X11_SHARED) set(SDL_VIDEO_DRIVER_X11_DYNAMIC_XINPUT2 "\"${XI_LIB_SONAME}\"") else() sdl_link_dependency(xi LIBS X11::Xi CMAKE_MODULE X11 PKG_CONFIG_SPECS ${Xi_PKG_CONFIG_SPEC}) endif() set(SDL_VIDEO_DRIVER_X11_XINPUT2 1) # Check for multitouch check_c_source_compiles(" #include #include #include int event_type = XI_TouchBegin; XITouchClassInfo *t; Status XIAllowTouchEvents(Display *a,int b,unsigned int c,Window d,int f) { return (Status)0; } int main(int argc, char **argv) { return 0; }" HAVE_XINPUT2_MULTITOUCH) if(HAVE_XINPUT2_MULTITOUCH) set(SDL_VIDEO_DRIVER_X11_XINPUT2_SUPPORTS_MULTITOUCH 1) endif() endif() # check along with XInput2.h because we use Xfixes with XIBarrierReleasePointer if(SDL_X11_XFIXES AND HAVE_XFIXES_H_ AND HAVE_XINPUT2_H) check_c_source_compiles(" #include #include #include #include BarrierEventID b; int main(int argc, char **argv) { return 0; }" HAVE_XFIXES_H) endif() if(SDL_X11_XFIXES AND HAVE_XFIXES_H AND HAVE_XINPUT2_H AND XFIXES_LIB) if(HAVE_X11_SHARED) set(SDL_VIDEO_DRIVER_X11_DYNAMIC_XFIXES "\"${XFIXES_LIB_SONAME}\"") else() sdl_link_dependency(xfixes LIBS X11::Xfixes CMAKE_MODULE X11 PKG_CONFIG_SPECS ${Xfixes_PKG_CONFIG_SPEC}) endif() set(SDL_VIDEO_DRIVER_X11_XFIXES 1) set(HAVE_X11_XFIXES TRUE) endif() if(SDL_X11_XRANDR AND HAVE_XRANDR_H AND XRANDR_LIB) if(HAVE_X11_SHARED) set(SDL_VIDEO_DRIVER_X11_DYNAMIC_XRANDR "\"${XRANDR_LIB_SONAME}\"") else() sdl_link_dependency(xrandr LIBS X11::Xrandr CMAKE_MODULE X11 PKG_CONFIG_SPECS ${Xrandr_PKG_CONFIG_SPEC}) endif() set(SDL_VIDEO_DRIVER_X11_XRANDR 1) set(HAVE_X11_XRANDR TRUE) endif() if(SDL_X11_XSCRNSAVER AND HAVE_XSS_H AND XSS_LIB) if(HAVE_X11_SHARED) set(SDL_VIDEO_DRIVER_X11_DYNAMIC_XSS "\"${XSS_LIB_SONAME}\"") else() sdl_link_dependency(xss LIBS X11::Xss CMAKE_MODULE X11 PKG_CONFIG_SPECS ${Xss_PKG_CONFIG_SPEC}) endif() set(SDL_VIDEO_DRIVER_X11_XSCRNSAVER 1) set(HAVE_X11_XSCRNSAVER TRUE) endif() if(SDL_X11_XSHAPE AND HAVE_XSHAPE_H) set(SDL_VIDEO_DRIVER_X11_XSHAPE 1) set(HAVE_X11_XSHAPE TRUE) endif() endif() endif() if(NOT HAVE_X11) # Prevent Mesa from including X11 headers sdl_compile_definitions(PRIVATE "MESA_EGL_NO_X11_HEADERS" "EGL_NO_X11") endif() cmake_pop_check_state() endmacro() macro(WaylandProtocolGen _SCANNER _CODE_MODE _XML _PROTL) set(_WAYLAND_PROT_C_CODE "${CMAKE_CURRENT_BINARY_DIR}/wayland-generated-protocols/${_PROTL}-protocol.c") set(_WAYLAND_PROT_H_CODE "${CMAKE_CURRENT_BINARY_DIR}/wayland-generated-protocols/${_PROTL}-client-protocol.h") add_custom_command( OUTPUT "${_WAYLAND_PROT_H_CODE}" DEPENDS "${_XML}" COMMAND "${_SCANNER}" ARGS client-header "${_XML}" "${_WAYLAND_PROT_H_CODE}" ) add_custom_command( OUTPUT "${_WAYLAND_PROT_C_CODE}" DEPENDS "${_WAYLAND_PROT_H_CODE}" COMMAND "${_SCANNER}" ARGS "${_CODE_MODE}" "${_XML}" "${_WAYLAND_PROT_C_CODE}" ) sdl_sources("${_WAYLAND_PROT_C_CODE}") endmacro() # Requires: # - EGL # - PkgCheckModules # Optional: # - SDL_WAYLAND_SHARED opt # - HAVE_SDL_LOADSO opt macro(CheckWayland) if(SDL_WAYLAND) set(WAYLAND_PKG_CONFIG_SPEC "wayland-client>=1.18" wayland-egl wayland-cursor egl "xkbcommon>=0.5.0") pkg_check_modules(PC_WAYLAND IMPORTED_TARGET ${WAYLAND_PKG_CONFIG_SPEC}) find_program(WAYLAND_SCANNER NAMES wayland-scanner) set(WAYLAND_FOUND FALSE) if(PC_WAYLAND_FOUND AND WAYLAND_SCANNER) execute_process( COMMAND ${WAYLAND_SCANNER} --version RESULT_VARIABLE WAYLAND_SCANNER_VERSION_RC ERROR_VARIABLE WAYLAND_SCANNER_VERSION_STDERR ERROR_STRIP_TRAILING_WHITESPACE ) if(NOT WAYLAND_SCANNER_VERSION_RC EQUAL 0) message(WARNING "Failed to get wayland-scanner version") else() if(WAYLAND_SCANNER_VERSION_STDERR MATCHES [[([0-9.]+)$]]) set(WAYLAND_FOUND TRUE) set(WAYLAND_SCANNER_VERSION ${CMAKE_MATCH_1}) if(WAYLAND_SCANNER_VERSION VERSION_LESS "1.15.0") set(WAYLAND_SCANNER_CODE_MODE "code") else() set(WAYLAND_SCANNER_CODE_MODE "private-code") endif() endif() endif() endif() if(WAYLAND_FOUND) set(HAVE_WAYLAND TRUE) set(HAVE_SDL_VIDEO TRUE) sdl_glob_sources("${SDL3_SOURCE_DIR}/src/video/wayland/*.c") # We have to generate some protocol interface code for some unstable Wayland features. file(MAKE_DIRECTORY "${SDL3_BINARY_DIR}/wayland-generated-protocols") # Prepend to include path to make sure they override installed protocol headers sdl_include_directories(PRIVATE SYSTEM BEFORE "${SDL3_BINARY_DIR}/wayland-generated-protocols") file(GLOB WAYLAND_PROTOCOLS_XML RELATIVE "${SDL3_SOURCE_DIR}/wayland-protocols/" "${SDL3_SOURCE_DIR}/wayland-protocols/*.xml") foreach(_XML IN LISTS WAYLAND_PROTOCOLS_XML) string(REGEX REPLACE "\\.xml$" "" _PROTL "${_XML}") WaylandProtocolGen("${WAYLAND_SCANNER}" "${WAYLAND_SCANNER_CODE_MODE}" "${SDL3_SOURCE_DIR}/wayland-protocols/${_XML}" "${_PROTL}") endforeach() if(SDL_WAYLAND_QT_TOUCH) set(HAVE_WAYLAND_QT_TOUCH TRUE) set(SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH 1) endif() if(SDL_WAYLAND_SHARED AND NOT HAVE_SDL_LOADSO) message(WARNING "You must have SDL_LoadObject() support for dynamic Wayland loading") endif() FindLibraryAndSONAME(wayland-client LIBDIRS ${PC_WAYLAND_LIBRARY_DIRS}) FindLibraryAndSONAME(wayland-egl LIBDIRS ${PC_WAYLAND_LIBRARY_DIRS}) FindLibraryAndSONAME(wayland-cursor LIBDIRS ${PC_WAYLAND_LIBRARY_DIRS}) FindLibraryAndSONAME(xkbcommon LIBDIRS ${PC_WAYLAND_LIBRARY_DIRS}) if(SDL_WAYLAND_SHARED AND WAYLAND_CLIENT_LIB AND WAYLAND_EGL_LIB AND WAYLAND_CURSOR_LIB AND XKBCOMMON_LIB AND HAVE_SDL_LOADSO) set(SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC "\"${WAYLAND_CLIENT_LIB_SONAME}\"") set(SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_EGL "\"${WAYLAND_EGL_LIB_SONAME}\"") set(SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_CURSOR "\"${WAYLAND_CURSOR_LIB_SONAME}\"") set(SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_XKBCOMMON "\"${XKBCOMMON_LIB_SONAME}\"") set(HAVE_WAYLAND_SHARED TRUE) sdl_link_dependency(wayland INCLUDES $) else() sdl_link_dependency(wayland LIBS PkgConfig::PC_WAYLAND PKG_CONFIG_PREFIX PC_WAYLAND PKG_CONFIG_SPECS ${WAYLAND_PKG_CONFIG_SPEC}) endif() if(SDL_WAYLAND_LIBDECOR) set(LibDecor_PKG_CONFIG_SPEC libdecor-0) pkg_check_modules(PC_LIBDECOR IMPORTED_TARGET ${LibDecor_PKG_CONFIG_SPEC}) if(PC_LIBDECOR_FOUND) # Version 0.2.0 or higher is needed for suspended window state and statically linked min/max getters. if(PC_LIBDECOR_VERSION VERSION_GREATER_EQUAL "0.2.0") set(SDL_HAVE_LIBDECOR_VER_0_2_0 1) set(LibDecor_PKG_CONFIG_SPEC "libdecor-0>=0.2.0") endif() set(HAVE_WAYLAND_LIBDECOR TRUE) set(HAVE_LIBDECOR_H 1) if(SDL_WAYLAND_LIBDECOR_SHARED AND NOT HAVE_SDL_LOADSO) message(WARNING "You must have SDL_LoadObject() support for dynamic libdecor loading") endif() FindLibraryAndSONAME(decor-0 LIBDIRS ${PC_LIBDECOR_LIBRARY_DIRS}) if(SDL_WAYLAND_LIBDECOR_SHARED AND DECOR_0_LIB AND HAVE_SDL_LOADSO) set(HAVE_WAYLAND_LIBDECOR_SHARED TRUE) set(SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_LIBDECOR "\"${DECOR_0_LIB_SONAME}\"") sdl_link_dependency(libdecor INCLUDES $) else() sdl_link_dependency(libdecor LIBS PkgConfig::PC_LIBDECOR PKG_CONFIG_PREFIX PC_LIBDECOR PKG_CONFIG_SPECS ${LibDecor_PKG_CONFIG_SPEC}) endif() endif() endif() set(SDL_VIDEO_DRIVER_WAYLAND 1) endif() endif() endmacro() # Requires: # - n/a # macro(CheckCOCOA) if(SDL_COCOA) if(APPLE) # Apple always has Cocoa. set(HAVE_COCOA TRUE) endif() if(HAVE_COCOA) sdl_glob_sources("${SDL3_SOURCE_DIR}/src/video/cocoa/*.m") set(SDL_VIDEO_DRIVER_COCOA 1) set(HAVE_SDL_VIDEO TRUE) endif() endif() endmacro() # Requires: # - n/a macro(CheckVivante) if(SDL_VIVANTE) check_c_source_compiles(" #include int main(int argc, char** argv) { return 0; }" HAVE_VIVANTE_VDK) check_c_source_compiles(" #define LINUX #define EGL_API_FB #include int main(int argc, char** argv) { return 0; }" HAVE_VIVANTE_EGL_FB) if(HAVE_VIVANTE_VDK OR HAVE_VIVANTE_EGL_FB) set(HAVE_VIVANTE TRUE) set(HAVE_SDL_VIDEO TRUE) sdl_glob_sources("${SDL3_SOURCE_DIR}/src/video/vivante/*.c") set(SDL_VIDEO_DRIVER_VIVANTE 1) # FIXME: Use Find module if(HAVE_VIVANTE_VDK) set(SDL_VIDEO_DRIVER_VIVANTE_VDK 1) find_library(VIVANTE_LIBRARY REQUIRED NAMES VIVANTE vivante drm_vivante) find_library(VIVANTE_VDK_LIBRARY VDK REQUIRED) sdl_link_dependency(vivante LIBS ${VIVANTE_LIBRARY} ${VIVANTE_VDK_LIBRARY}) else() # these defines are needed when including the system EGL headers, which SDL does sdl_compile_definitions(PUBLIC "LINUX" "EGL_API_FB") sdl_link_dependency(vivante LIBS EGL) endif(HAVE_VIVANTE_VDK) endif() endif() endmacro() # Requires: # - nada macro(CheckGLX) if(SDL_OPENGL) check_c_source_compiles(" #include int main(int argc, char** argv) { return 0; }" HAVE_OPENGL_GLX) if(HAVE_OPENGL_GLX AND NOT HAVE_ROCKCHIP) set(SDL_VIDEO_OPENGL_GLX 1) endif() endif() endmacro() # Requires: # - PkgCheckModules macro(CheckEGL) if(SDL_OPENGL OR SDL_OPENGLES) cmake_push_check_state() find_package(OpenGL MODULE) list(APPEND CMAKE_REQUIRED_INCLUDES ${OPENGL_EGL_INCLUDE_DIRS}) check_c_source_compiles(" #define EGL_API_FB #define MESA_EGL_NO_X11_HEADERS #define EGL_NO_X11 #include #include int main (int argc, char** argv) { return 0; }" HAVE_OPENGL_EGL) cmake_pop_check_state() if(HAVE_OPENGL_EGL) set(SDL_VIDEO_OPENGL_EGL 1) sdl_link_dependency(egl INCLUDES ${OPENGL_EGL_INCLUDE_DIRS}) endif() endif() endmacro() # Requires: # - nada macro(CheckOpenGL) if(SDL_OPENGL) check_c_source_compiles(" #include #include int main(int argc, char** argv) { return 0; }" HAVE_OPENGL) if(HAVE_OPENGL) set(SDL_VIDEO_OPENGL 1) set(SDL_VIDEO_RENDER_OGL 1) endif() endif() endmacro() # Requires: # - nada macro(CheckOpenGLES) if(SDL_OPENGLES) check_c_source_compiles(" #include #include int main (int argc, char** argv) { return 0; }" HAVE_OPENGLES_V1) if(HAVE_OPENGLES_V1) set(HAVE_OPENGLES TRUE) set(SDL_VIDEO_OPENGL_ES 1) endif() check_c_source_compiles(" #include #include int main (int argc, char** argv) { return 0; }" HAVE_OPENGLES_V2) if(HAVE_OPENGLES_V2) set(HAVE_OPENGLES TRUE) set(SDL_VIDEO_OPENGL_ES2 1) set(SDL_VIDEO_RENDER_OGL_ES2 1) endif() endif() endmacro() macro(CheckVulkan) if(SDL_VULKAN) set(SDL_VIDEO_VULKAN 1) set(HAVE_VULKAN TRUE) endif() endmacro() # Requires: # - EGL macro(CheckQNXScreen) if(QNX AND HAVE_OPENGL_EGL) check_c_source_compiles(" #include int main (int argc, char** argv) { return 0; }" HAVE_QNX_SCREEN) if(HAVE_QNX_SCREEN) set(SDL_VIDEO_DRIVER_QNX 1) sdl_glob_sources("${SDL3_SOURCE_DIR}/src/video/qnx/*.c") sdl_link_dependency(qnxscreen LIBS screen EGL) endif() endif() endmacro() # Requires: # - nada # Optional: # - THREADS opt # Sets: # PTHREAD_CFLAGS # PTHREAD_LIBS macro(CheckPTHREAD) cmake_push_check_state() if(SDL_THREADS AND SDL_PTHREADS) if(ANDROID) # the android libc provides built-in support for pthreads, so no # additional linking or compile flags are necessary elseif(LINUX) set(PTHREAD_CFLAGS "-D_REENTRANT") set(PTHREAD_LDFLAGS "-pthread") elseif(BSDI) set(PTHREAD_CFLAGS "-D_REENTRANT -D_THREAD_SAFE") set(PTHREAD_LDFLAGS "") elseif(DARWIN) set(PTHREAD_CFLAGS "-D_THREAD_SAFE") # causes Carbon.p complaints? # set(PTHREAD_CFLAGS "-D_REENTRANT -D_THREAD_SAFE") set(PTHREAD_LDFLAGS "") elseif(FREEBSD) set(PTHREAD_CFLAGS "-D_REENTRANT -D_THREAD_SAFE") set(PTHREAD_LDFLAGS "-pthread") elseif(NETBSD) set(PTHREAD_CFLAGS "-D_REENTRANT -D_THREAD_SAFE") set(PTHREAD_LDFLAGS "-lpthread") elseif(OPENBSD) set(PTHREAD_CFLAGS "-D_REENTRANT") set(PTHREAD_LDFLAGS "-lpthread") elseif(SOLARIS) set(PTHREAD_CFLAGS "-D_REENTRANT") set(PTHREAD_LDFLAGS "-pthread -lposix4") elseif(SYSV5) set(PTHREAD_CFLAGS "-D_REENTRANT -Kthread") set(PTHREAD_LDFLAGS "") elseif(AIX) set(PTHREAD_CFLAGS "-D_REENTRANT -mthreads") set(PTHREAD_LDFLAGS "-pthread") elseif(HPUX) set(PTHREAD_CFLAGS "-D_REENTRANT") set(PTHREAD_LDFLAGS "-L/usr/lib -pthread") elseif(HAIKU) set(PTHREAD_CFLAGS "-D_REENTRANT") set(PTHREAD_LDFLAGS "") elseif(EMSCRIPTEN) set(PTHREAD_CFLAGS "-D_REENTRANT -pthread") set(PTHREAD_LDFLAGS "-pthread") elseif(QNX) # pthread support is baked in else() set(PTHREAD_CFLAGS "-D_REENTRANT") set(PTHREAD_LDFLAGS "-lpthread") endif() # Run some tests string(APPEND CMAKE_REQUIRED_FLAGS " ${PTHREAD_CFLAGS} ${PTHREAD_LDFLAGS}") check_c_source_compiles(" #include int main(int argc, char** argv) { pthread_attr_t type; pthread_attr_init(&type); return 0; }" HAVE_PTHREADS) if(HAVE_PTHREADS) set(SDL_THREAD_PTHREAD 1) separate_arguments(PTHREAD_CFLAGS) sdl_compile_options(PRIVATE ${PTHREAD_CFLAGS}) sdl_link_dependency(pthread LINK_OPTIONS ${PTHREAD_LDFLAGS}) check_c_source_compiles(" #include int main(int argc, char **argv) { pthread_mutexattr_t attr; pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); return 0; }" HAVE_RECURSIVE_MUTEXES) if(HAVE_RECURSIVE_MUTEXES) set(SDL_THREAD_PTHREAD_RECURSIVE_MUTEX 1) else() check_c_source_compiles(" #include int main(int argc, char **argv) { pthread_mutexattr_t attr; pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE_NP); return 0; }" HAVE_RECURSIVE_MUTEXES_NP) if(HAVE_RECURSIVE_MUTEXES_NP) set(SDL_THREAD_PTHREAD_RECURSIVE_MUTEX_NP 1) endif() endif() if(SDL_PTHREADS_SEM) check_c_source_compiles("#include #include int main(int argc, char **argv) { return 0; }" HAVE_PTHREADS_SEM) if(HAVE_PTHREADS_SEM) check_c_source_compiles(" #include #include int main(int argc, char **argv) { sem_timedwait(NULL, NULL); return 0; }" COMPILER_HAS_SEM_TIMEDWAIT) set(HAVE_SEM_TIMEDWAIT ${COMPILER_HAS_SEM_TIMEDWAIT}) endif() endif() check_include_file(pthread.h HAVE_PTHREAD_H) check_include_file(pthread_np.h HAVE_PTHREAD_NP_H) if (HAVE_PTHREAD_H) check_c_source_compiles(" #include int main(int argc, char **argv) { #ifdef __APPLE__ pthread_setname_np(\"\"); #else pthread_setname_np(pthread_self(),\"\"); #endif return 0; }" HAVE_PTHREAD_SETNAME_NP) if (HAVE_PTHREAD_NP_H) check_symbol_exists(pthread_set_name_np "pthread.h;pthread_np.h" HAVE_PTHREAD_SET_NAME_NP) endif() endif() sdl_sources( "${SDL3_SOURCE_DIR}/src/thread/pthread/SDL_systhread.c" "${SDL3_SOURCE_DIR}/src/thread/pthread/SDL_sysmutex.c" # Can be faked, if necessary "${SDL3_SOURCE_DIR}/src/thread/pthread/SDL_syscond.c" # Can be faked, if necessary "${SDL3_SOURCE_DIR}/src/thread/pthread/SDL_sysrwlock.c" # Can be faked, if necessary "${SDL3_SOURCE_DIR}/src/thread/pthread/SDL_systls.c" ) if(HAVE_PTHREADS_SEM) sdl_sources("${SDL3_SOURCE_DIR}/src/thread/pthread/SDL_syssem.c") else() sdl_sources("${SDL3_SOURCE_DIR}/src/thread/generic/SDL_syssem.c") endif() set(HAVE_SDL_THREADS TRUE) endif() endif() cmake_pop_check_state() endmacro() # Requires # - nada # Optional: # Sets: # USB_LIBS # USB_CFLAGS macro(CheckUSBHID) cmake_push_check_state() check_library_exists(usbhid hid_init "" LIBUSBHID) if(LIBUSBHID) check_include_file(usbhid.h HAVE_USBHID_H) if(HAVE_USBHID_H) set(USB_CFLAGS "-DHAVE_USBHID_H") endif() check_include_file(libusbhid.h HAVE_LIBUSBHID_H) if(HAVE_LIBUSBHID_H) string(APPEND USB_CFLAGS " -DHAVE_LIBUSBHID_H") endif() set(USB_LIBS ${USB_LIBS} usbhid) else() check_include_file(usb.h HAVE_USB_H) if(HAVE_USB_H) set(USB_CFLAGS "-DHAVE_USB_H") endif() check_include_file(libusb.h HAVE_LIBUSB_H) if(HAVE_LIBUSB_H) string(APPEND USB_CFLAGS " -DHAVE_LIBUSB_H") endif() check_library_exists(usb hid_init "" LIBUSB) if(LIBUSB) list(APPEND USB_LIBS usb) endif() endif() string(APPEND CMAKE_REQUIRED_FLAGS " ${USB_CFLAGS}") list(APPEND CMAKE_REQUIRED_LIBRARIES ${USB_LIBS}) check_c_source_compiles(" #include #if defined(HAVE_USB_H) #include #endif #ifdef __DragonFly__ # include # include #else # include # include #endif #if defined(HAVE_USBHID_H) #include #elif defined(HAVE_LIBUSB_H) #include #elif defined(HAVE_LIBUSBHID_H) #include #endif int main(int argc, char **argv) { struct report_desc *repdesc; struct usb_ctl_report *repbuf; hid_kind_t hidkind; return 0; }" HAVE_USBHID) if(HAVE_USBHID) check_c_source_compiles(" #include #if defined(HAVE_USB_H) #include #endif #ifdef __DragonFly__ # include # include #else # include # include #endif #if defined(HAVE_USBHID_H) #include #elif defined(HAVE_LIBUSB_H) #include #elif defined(HAVE_LIBUSBHID_H) #include #endif int main(int argc, char** argv) { struct usb_ctl_report buf; if (buf.ucr_data) { } return 0; }" HAVE_USBHID_UCR_DATA) if(HAVE_USBHID_UCR_DATA) string(APPEND USB_CFLAGS " -DUSBHID_UCR_DATA") endif() check_c_source_compiles(" #include #if defined(HAVE_USB_H) #include #endif #ifdef __DragonFly__ #include #include #else #include #include #endif #if defined(HAVE_USBHID_H) #include #elif defined(HAVE_LIBUSB_H) #include #elif defined(HAVE_LIBUSBHID_H) #include #endif int main(int argc, char **argv) { report_desc_t d; hid_start_parse(d, 1, 1); return 0; }" HAVE_USBHID_NEW) if(HAVE_USBHID_NEW) string(APPEND USB_CFLAGS " -DUSBHID_NEW") endif() check_c_source_compiles(" #include int main(int argc, char** argv) { struct joystick t; return 0; }" HAVE_MACHINE_JOYSTICK) if(HAVE_MACHINE_JOYSTICK) set(SDL_HAVE_MACHINE_JOYSTICK_H 1) endif() set(SDL_JOYSTICK_USBHID 1) sdl_glob_sources("${SDL3_SOURCE_DIR}/src/joystick/bsd/*.c") separate_arguments(USB_CFLAGS) sdl_compile_options(PRIVATE ${USB_CFLAGS}) #FIXME: properly add usb libs with pkg-config or whatever sdl_link_dependency(usbhid LIBS ${USB_LIBS}) set(HAVE_SDL_JOYSTICK TRUE) endif() cmake_pop_check_state() endmacro() # Check for HIDAPI support macro(CheckHIDAPI) if(SDL_HIDAPI) set(HAVE_HIDAPI ON) if(SDL_HIDAPI_LIBUSB) set(HAVE_LIBUSB FALSE) set(LibUSB_PKG_CONFIG_SPEC libusb-1.0) pkg_check_modules(PC_LIBUSB IMPORTED_TARGET ${LibUSB_PKG_CONFIG_SPEC}) if(PC_LIBUSB_FOUND) cmake_push_check_state() list(APPEND CMAKE_REQUIRED_INCLUDES ${PC_LIBUSB_INCLUDE_DIRS}) list(APPEND CMAKE_REQUIRED_LIBRARIES PkgConfig::PC_LIBUSB) check_c_source_compiles(" #include #include int main(int argc, char **argv) { libusb_close(NULL); return 0; }" HAVE_LIBUSB_H) cmake_pop_check_state() if(HAVE_LIBUSB_H) set(HAVE_LIBUSB TRUE) FindLibraryAndSONAME("usb-1.0" LIBDIRS ${PC_LIBUSB_LIBRARY_DIRS}) if(SDL_HIDAPI_LIBUSB_SHARED AND USB_1.0_LIB_SONAME) set(HAVE_HIDAPI_LIBUSB_SHARED ON) set(SDL_LIBUSB_DYNAMIC "\"${USB_1.0_LIB_SONAME}\"") sdl_link_dependency(hidapi INCLUDES $) else() sdl_link_dependency(hidapi LIBS PkgConfig::PC_LIBUSB PKG_CONFIG_PREFIX PC_LIBUSB PKG_CONFIG_SPECS ${LibUSB_PKG_CONFIG_SPEC}) endif() endif() endif() set(HAVE_HIDAPI_LIBUSB ${HAVE_LIBUSB}) endif() if(HAVE_HIDAPI) if(ANDROID) sdl_sources("${SDL3_SOURCE_DIR}/src/hidapi/android/hid.cpp") endif() if(IOS OR TVOS) sdl_sources("${SDL3_SOURCE_DIR}/src/hidapi/ios/hid.m") set(SDL_FRAMEWORK_COREBLUETOOTH 1) endif() set(HAVE_SDL_HIDAPI TRUE) if(SDL_JOYSTICK AND SDL_HIDAPI_JOYSTICK) set(SDL_JOYSTICK_HIDAPI 1) set(HAVE_SDL_JOYSTICK TRUE) set(HAVE_HIDAPI_JOYSTICK TRUE) sdl_glob_sources("${SDL3_SOURCE_DIR}/src/joystick/hidapi/*.c") endif() else() set(SDL_HIDAPI_DISABLED 1) endif() else() set(SDL_HIDAPI_DISABLED 1) endif() endmacro() # Requires: # - n/a macro(CheckRPI) if(SDL_RPI) set(BCM_HOST_PKG_CONFIG_SPEC bcm_host) set(BRCMEGL_PKG_CONFIG_SPEC brcmegl) set(original_PKG_CONFIG_PATH $ENV{PKG_CONFIG_PATH}) set(ENV{PKG_CONFIG_PATH} "${original_PKG_CONFIG_PATH}:/opt/vc/lib/pkgconfig") pkg_check_modules(PC_BCM_HOST IMPORTED_TARGET QUIET ${BCM_HOST_PKG_CONFIG_SPEC}) pkg_check_modules(PC_BRCMEGL IMPORTED_TARGET QUIET ${BRCMEGL_PKG_CONFIG_SPEC}) set(ENV{PKG_CONFIG_PATH} "${original_PKG_CONFIG_PATH}") if(TARGET PkgConfig::PC_BCM_HOST AND TARGET PkgConfig::PC_BRCMEGL) set(HAVE_RPI TRUE) if(SDL_VIDEO) set(HAVE_SDL_VIDEO TRUE) set(SDL_VIDEO_DRIVER_RPI 1) sdl_glob_sources("${SDL3_SOURCE_DIR}/src/video/raspberry/*.c") sdl_link_dependency(rpi-video LIBS PkgConfig::PC_BCM_HOST PKG_CONFIG_PREFIX PC_BCM_HOST PKG_CONFIG_SPECS ${BCM_HOST_PKG_CONFIG_SPEC}) endif() endif() endif() endmacro() # Requires: # - n/a macro(CheckROCKCHIP) if(SDL_ROCKCHIP) set(MALI_PKG_CONFIG_SPEC mali) pkg_check_modules(PC_MALI QUIET ${MALI_PKG_CONFIG_SPEC}) if(PC_MALI_FOUND) set(HAVE_ROCKCHIP TRUE) endif() if(SDL_VIDEO AND HAVE_ROCKCHIP) set(HAVE_SDL_VIDEO TRUE) set(SDL_VIDEO_DRIVER_ROCKCHIP 1) endif() endif() endmacro() # Requires: # - EGL # - PkgCheckModules # Optional: # - SDL_KMSDRM_SHARED opt # - HAVE_SDL_LOADSO opt macro(CheckKMSDRM) if(SDL_KMSDRM) set(PKG_CONFIG_LIBDRM_SPEC libdrm) set(PKG_CONFIG_GBM_SPEC gbm) pkg_check_modules(PC_LIBDRM IMPORTED_TARGET ${PKG_CONFIG_LIBDRM_SPEC}) pkg_check_modules(PC_GBM IMPORTED_TARGET ${PKG_CONFIG_GBM_SPEC}) if(PC_LIBDRM_FOUND AND PC_GBM_FOUND AND HAVE_OPENGL_EGL) set(HAVE_KMSDRM TRUE) set(HAVE_SDL_VIDEO TRUE) sdl_glob_sources("${SDL3_SOURCE_DIR}/src/video/kmsdrm/*.c") set(SDL_VIDEO_DRIVER_KMSDRM 1) if(SDL_KMSDRM_SHARED AND NOT HAVE_SDL_LOADSO) message(WARNING "You must have SDL_LoadObject() support for dynamic KMS/DRM loading") endif() set(HAVE_KMSDRM_SHARED FALSE) if(SDL_KMSDRM_SHARED AND HAVE_SDL_LOADSO) FindLibraryAndSONAME(drm LIBDIRS ${PC_LIBDRM_LIBRARY_DIRS}) FindLibraryAndSONAME(gbm LIBDIRS ${PC_GBM_LIBRARY_DIRS}) if(DRM_LIB AND DRM_SHARED AND GBM_LIB AND GBM_SHARED) set(SDL_VIDEO_DRIVER_KMSDRM_DYNAMIC "\"${DRM_LIB_SONAME}\"") set(SDL_VIDEO_DRIVER_KMSDRM_DYNAMIC_GBM "\"${GBM_LIB_SONAME}\"") set(HAVE_KMSDRM_SHARED TRUE) sdl_link_dependency(kmsdrm-drm INCLUDES $) sdl_link_dependency(kmsdrm-gbm INCLUDES $) endif() endif() if(NOT HAVE_KMSDRM_SHARED) sdl_link_dependency(kmsdrm-libdrm LIBS PkgConfig::PC_LIBDRM PKG_CONFIG_PREFIX PC_LIBDRM PKG_CONFIG_SPECS ${PKG_CONFIG_LIBDRM_SPEC}) sdl_link_dependency(kmsdrm-gbm LIBS PkgConfig::PC_GBM PKG_CONFIG_PREFIX PC_GBM PKG_CONFIG_SPECS ${PKG_CONFIG_GBM_SPEC}) endif() endif() endif() endmacro() macro(CheckLibUDev) if(SDL_LIBUDEV) check_include_file("libudev.h" HAVE_LIBUDEV_HEADER) if(HAVE_LIBUDEV_HEADER) set(HAVE_LIBUDEV_H TRUE) FindLibraryAndSONAME(udev) if(UDEV_LIB_SONAME) set(SDL_UDEV_DYNAMIC "\"${UDEV_LIB_SONAME}\"") set(HAVE_LIBUDEV TRUE) endif() endif() endif() endmacro() macro(CheckLibUnwind) if(TARGET SDL3_test) set(found_libunwind FALSE) set(_libunwind_src "#include \nint main() {unw_context_t context; unw_getcontext(&context); return 0;}") if(NOT found_libunwind) cmake_push_check_state() check_c_source_compiles("${_libunwind_src}" LIBC_HAS_WORKING_LIBUNWIND) cmake_pop_check_state() if(LIBC_HAS_WORKING_LIBUNWIND) set(found_libunwind TRUE) target_compile_definitions(SDL3_test PRIVATE HAVE_LIBUNWIND_H) endif() endif() if(NOT found_libunwind) cmake_push_check_state() list(APPEND CMAKE_REQUIRED_LIBRARIES "unwind") check_c_source_compiles("${_libunwind_src}" LIBUNWIND_HAS_WORKINGLIBUNWIND) cmake_pop_check_state() if(LIBUNWIND_HAS_WORKINGLIBUNWIND) set(found_libunwind TRUE) sdl_test_link_dependency(UNWIND LIBS unwind) endif() endif() if(NOT found_libunwind) set(LibUnwind_PKG_CONFIG_SPEC libunwind libunwind-generic) pkg_check_modules(PC_LIBUNWIND IMPORTED_TARGET ${LibUnwind_PKG_CONFIG_SPEC}) if(PC_LIBUNWIND_FOUND) cmake_push_check_state() list(APPEND CMAKE_REQUIRED_LIBRARIES ${PC_LIBUNWIND_LIBRARIES}) list(APPEND CMAKE_REQUIRED_INCLUDES ${PC_LIBUNWIND_INCLUDE_DIRS}) check_c_source_compiles("${_libunwind_src}" PC_LIBUNWIND_HAS_WORKING_LIBUNWIND) cmake_pop_check_state() if(PC_LIBUNWIND_HAS_WORKING_LIBUNWIND) set(found_libunwind TRUE) sdl_test_link_dependency(UNWIND LIBS PkgConfig::PC_LIBUNWIND PKG_CONFIG_PREFIX PC_LIBUNWIND PKG_CONFIG_SPECS ${LibUnwind_PKG_CONFIG_SPEC}) endif() endif() endif() if(found_libunwind) target_compile_definitions(SDL3_test PRIVATE HAVE_LIBUNWIND_H) endif() endif() endmacro()