Atlas - CMakeLists.txt
Home / ext / SDL Lines: 3 | Size: 150093 bytes [Download] [Show on GitHub] [Search similar files] [Raw] [Raw (proxy)][FILE BEGIN]1cmake_minimum_required(VERSION 3.16) 2 3if(NOT DEFINED CMAKE_BUILD_TYPE) 4 set(cmake_build_type_undefined 1) 5endif() 6 7# See docs/release_checklist.md 8project(SDL3 LANGUAGES C VERSION "3.5.0") 9 10if(CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR) 11 set(SDL3_MAINPROJECT ON) 12else() 13 set(SDL3_MAINPROJECT OFF) 14endif() 15 16# Add UTF-8 encoding support for MSVC compiler. 17# This ensures that the MSVC compiler interprets source files as UTF-8 encoded, 18# which is useful for projects containing non-ASCII characters in source files. 19add_compile_options("$<$<C_COMPILER_ID:MSVC>:/utf-8>") 20add_compile_options("$<$<CXX_COMPILER_ID:MSVC>:/utf-8>") 21 22# By default, configure SDL3 in RelWithDebInfo configuration 23if(SDL3_MAINPROJECT) 24 get_property(is_multi_config GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) 25 if(is_multi_config) 26 # The first item in CMAKE_CONFIGURATION_TYPES is the default configuration 27 if(DEFINED CMAKE_CONFIGURATION_TYPES AND "RelWithDebInfo" IN_LIST CMAKE_CONFIGURATION_TYPES) 28 list(REMOVE_ITEM CMAKE_CONFIGURATION_TYPES "RelWithDebInfo") 29 list(INSERT CMAKE_CONFIGURATION_TYPES 0 "RelWithDebInfo") 30 set(CMAKE_CONFIGURATION_TYPES "${CMAKE_CONFIGURATION_TYPES}" CACHE STRING "CMake configuration types" FORCE) 31 endif() 32 else() 33 if(cmake_build_type_undefined) 34 set(CMAKE_BUILD_TYPE "RelWithDebInfo" CACHE STRING "CMake build type" FORCE) 35 endif() 36 endif() 37endif() 38 39# CMake 3.0 expands the "if(${A})" in "set(OFF 1);set(A OFF);if(${A})" to "if(1)" 40# CMake 3.24+ emits a warning when not set. 41unset(OFF) 42unset(ON) 43if(POLICY CMP0054) 44 cmake_policy(SET CMP0054 NEW) 45endif() 46 47include(CheckLibraryExists) 48include(CheckIncludeFile) 49include(CheckIncludeFiles) 50include(CheckLanguage) 51include(CheckSymbolExists) 52include(CheckCSourceCompiles) 53include(CheckCSourceRuns) 54include(CheckCCompilerFlag) 55include(CheckCXXCompilerFlag) 56include(CheckStructHasMember) 57include(CMakeDependentOption) 58include(CMakeParseArguments) 59include(CMakePushCheckState) 60include(GNUInstallDirs) 61 62if(NOT DEFINED OpenGL_GL_PREFERENCE) 63 set(OpenGL_GL_PREFERENCE GLVND) 64endif() 65 66find_package(PkgConfig) 67 68list(APPEND CMAKE_MODULE_PATH "${SDL3_SOURCE_DIR}/cmake") 69include("${SDL3_SOURCE_DIR}/cmake/macros.cmake") 70include("${SDL3_SOURCE_DIR}/cmake/sdlchecks.cmake") 71include("${SDL3_SOURCE_DIR}/cmake/sdlcommands.cmake") 72include("${SDL3_SOURCE_DIR}/cmake/sdlcompilers.cmake") 73include("${SDL3_SOURCE_DIR}/cmake/sdlcpu.cmake") 74include("${SDL3_SOURCE_DIR}/cmake/sdlmanpages.cmake") 75include("${SDL3_SOURCE_DIR}/cmake/sdlplatform.cmake") 76include("${SDL3_SOURCE_DIR}/cmake/GetGitRevisionDescription.cmake") 77include("${SDL3_SOURCE_DIR}/cmake/3rdparty.cmake") 78include("${SDL3_SOURCE_DIR}/cmake/PreseedMSVCCache.cmake") 79include("${SDL3_SOURCE_DIR}/cmake/PreseedEmscriptenCache.cmake") 80include("${SDL3_SOURCE_DIR}/cmake/PreseedNokiaNGageCache.cmake") 81include("${SDL3_SOURCE_DIR}/cmake/PreseedDOSCache.cmake") 82 83SDL_DetectCompiler() 84SDL_DetectTargetCPUArchitectures(SDL_CPUS) 85if(APPLE AND CMAKE_OSX_ARCHITECTURES) 86 list(LENGTH CMAKE_OSX_ARCHITECTURES _num_arches) 87 if(_num_arches GREATER 1) 88 set(APPLE_MULTIARCH TRUE) 89 endif() 90endif() 91 92# Increment this if there is an incompatible change - but if that happens, 93# we should rename the library from SDL3 to SDL4, at which point this would 94# reset to 0 anyway. 95set(SDL_SO_VERSION_MAJOR "0") 96set(SDL_SO_VERSION_MINOR "${PROJECT_VERSION_MINOR}") 97set(SDL_SO_VERSION_PATCH "${PROJECT_VERSION_PATCH}") 98set(SDL_SO_VERSION "${SDL_SO_VERSION_MAJOR}.${SDL_SO_VERSION_MINOR}.${SDL_SO_VERSION_PATCH}") 99 100if(PROJECT_VERSION_MINOR MATCHES "[02468]$") 101 math(EXPR SDL_DYLIB_COMPAT_VERSION_MAJOR "100 * ${PROJECT_VERSION_MINOR} + 1") 102 set(SDL_DYLIB_COMPAT_VERSION_MINOR "0") 103 math(EXPR SDL_DYLIB_CURRENT_VERSION_MAJOR "${SDL_DYLIB_COMPAT_VERSION_MAJOR}") 104 set(SDL_DYLIB_CURRENT_VERSION_MINOR "${PROJECT_VERSION_PATCH}") 105else() 106 math(EXPR SDL_DYLIB_COMPAT_VERSION_MAJOR "100 * ${PROJECT_VERSION_MINOR} + ${PROJECT_VERSION_PATCH} + 1") 107 set(SDL_DYLIB_COMPAT_VERSION_MINOR "0") 108 math(EXPR SDL_DYLIB_CURRENT_VERSION_MAJOR "${SDL_DYLIB_COMPAT_VERSION_MAJOR}") 109 set(SDL_DYLIB_CURRENT_VERSION_MINOR "0") 110endif() 111set(SDL_DYLIB_CURRENT_VERSION_PATCH "0") 112set(SDL_DYLIB_COMPAT_VERSION_PATCH "0") 113 114set(SDL_DYLIB_CURRENT_VERSION "${SDL_DYLIB_CURRENT_VERSION_MAJOR}.${SDL_DYLIB_CURRENT_VERSION_MINOR}.${SDL_DYLIB_CURRENT_VERSION_PATCH}") 115set(SDL_DYLIB_COMPAT_VERSION "${SDL_DYLIB_COMPAT_VERSION_MAJOR}.${SDL_DYLIB_COMPAT_VERSION_MINOR}.${SDL_DYLIB_COMPAT_VERSION_PATCH}") 116 117message(DEBUG "SDL_SO_VERSION=${SDL_SO_VERSION} SDL_DYLIB_CURRENT_VERSION=${SDL_DYLIB_CURRENT_VERSION} SDL_DYLIB_COMPAT_VERSION=${SDL_DYLIB_COMPAT_VERSION}") 118 119set(SDL_FRAMEWORK_VERSION "A") 120 121set(SDL_CHECK_REQUIRED_INCLUDES "" CACHE STRING "Extra includes (for CMAKE_REQUIRED_INCLUDES)") 122set(SDL_CHECK_REQUIRED_LINK_OPTIONS "" CACHE STRING "Extra link options (for CMAKE_REQUIRED_LINK_OPTIONS)") 123mark_as_advanced(SDL_CHECK_REQUIRED_INCLUDES SDL_CHECK_REQUIRED_LINK_OPTIONS) 124 125string(APPEND CMAKE_REQUIRED_FLAGS " -D_GNU_SOURCE=1") 126list(APPEND CMAKE_REQUIRED_INCLUDES ${SDL_CHECK_REQUIRED_INCLUDES}) 127list(APPEND CMAKE_REQUIRED_LINK_OPTIONS ${SDL_CHECK_REQUIRED_LINK_OPTIONS}) 128 129# Get the platform 130SDL_DetectCMakePlatform() 131 132# Don't mistake macOS for unix 133if(UNIX AND NOT ANDROID AND NOT APPLE AND NOT RISCOS) 134 set(UNIX_SYS ON) 135else() 136 set(UNIX_SYS OFF) 137endif() 138 139if(UNIX OR APPLE) 140 set(UNIX_OR_MAC_SYS ON) 141else() 142 set(UNIX_OR_MAC_SYS OFF) 143endif() 144 145# Emscripten pthreads work, but you need to have a non-pthread fallback build 146# for systems without support. It's not currently enough to not use 147# pthread functions in a pthread-build; it won't start up on unsupported 148# browsers. As such, you have to explicitly enable it on Emscripten builds 149# for the time being. This default will change to ON once this becomes 150# commonly supported in browsers or the Emscripten team makes a single 151# binary work everywhere. 152if (UNIX_OR_MAC_SYS AND NOT EMSCRIPTEN) 153 set(SDL_PTHREADS_DEFAULT ON) 154else() 155 set(SDL_PTHREADS_DEFAULT OFF) 156endif() 157 158if(UNIX_SYS OR ANDROID) 159 set(SDL_CLOCK_GETTIME_DEFAULT ON) 160else() 161 set(SDL_CLOCK_GETTIME_DEFAULT OFF) 162endif() 163 164# The hidraw support doesn't catch Xbox, PS4 and Nintendo controllers, 165# so we'll just use libusb when it's available. libusb does not support iOS, 166# so we default to yes on iOS. 167if(IOS OR TVOS OR VISIONOS OR WATCHOS OR ANDROID OR NGAGE OR DOS) 168 set(SDL_HIDAPI_LIBUSB_AVAILABLE FALSE) 169else() 170 set(SDL_HIDAPI_LIBUSB_AVAILABLE TRUE) 171endif() 172 173set(SDL_ASSEMBLY_DEFAULT OFF) 174if(USE_CLANG OR USE_GCC OR USE_INTELCC OR USE_TCC OR MSVC_VERSION GREATER 1400) 175 set(SDL_ASSEMBLY_DEFAULT ON) 176endif() 177 178set(SDL_GCC_ATOMICS_DEFAULT OFF) 179if(USE_GCC OR USE_CLANG OR USE_INTELCC OR USE_QCC OR USE_TCC) 180 set(SDL_GCC_ATOMICS_DEFAULT ON) 181endif() 182 183# Default option knobs 184set(SDL_LIBC_DEFAULT ON) 185set(SDL_SYSTEM_ICONV_DEFAULT ON) 186if(WINDOWS OR MACOS OR IOS OR TVOS OR VISIONOS OR WATCHOS) 187 set(SDL_SYSTEM_ICONV_DEFAULT OFF) 188endif() 189 190set(SDL_RELOCATABLE_DEFAULT OFF) 191if(MSVC) 192 set(SDL_RELOCATABLE_DEFAULT ON) 193endif() 194 195set(SDL_SHARED_DEFAULT ON) 196set(SDL_STATIC_DEFAULT ON) 197 198set(SDL_SHARED_AVAILABLE ON) 199set(SDL_STATIC_AVAILABLE ON) 200 201# All these *_DEFAULT vars will default to ON if not specified, 202# so you only need to override them if they need to be disabled. 203if(EMSCRIPTEN) 204 # Set up default values for the currently supported set of subsystems: 205 # Emscripten/Javascript does not have assembly support, a dynamic library 206 # loading architecture, or low-level CPU inspection. 207 set(SDL_ASSEMBLY_DEFAULT OFF) 208 set(SDL_SHARED_AVAILABLE OFF) 209endif() 210 211if(VITA OR PSP OR PS2 OR N3DS OR RISCOS OR NGAGE OR DOS) 212 set(SDL_SHARED_AVAILABLE OFF) 213endif() 214 215if((RISCOS OR UNIX_SYS) AND NOT (LINUX OR NETBSD OR OPENBSD)) 216 set(SDL_OSS_DEFAULT ON) 217else() 218 set(SDL_OSS_DEFAULT OFF) 219endif() 220 221if(NOT SDL_SHARED_AVAILABLE) 222 set(SDL_SHARED_DEFAULT OFF) 223endif() 224 225if(SDL_SHARED_DEFAULT AND SDL_STATIC_DEFAULT AND SDL_SHARED_AVAILABLE) 226 if(DEFINED BUILD_SHARED_LIBS) 227 # When defined, use BUILD_SHARED_LIBS as default 228 if(BUILD_SHARED_LIBS) 229 set(SDL_STATIC_DEFAULT OFF) 230 else() 231 set(SDL_SHARED_DEFAULT OFF) 232 endif() 233 else() 234 # Default to just building the shared library 235 set(SDL_STATIC_DEFAULT OFF) 236 endif() 237endif() 238 239dep_option(SDL_DEPS_SHARED "Load dependencies dynamically" ON SDL_SHARED_AVAILABLE OFF) 240 241set(SDL_SUBSYSTEMS ) 242 243macro(define_sdl_subsystem _name) 244 cmake_parse_arguments("_ds" "" "" "DEPS" ${ARGN}) 245 string(TOUPPER ${_name} _uname) 246 if(NOT DEFINED SDL_${_uname}_DEFAULT) 247 set(SDL_${_uname}_DEFAULT ON) 248 endif() 249 if(_ds_DEPS) 250 cmake_dependent_option(SDL_${_uname} "Enable the ${_name} subsystem" "${SDL_${_uname}_DEFAULT}" "${_ds_DEPS}" OFF) 251 else() 252 option(SDL_${_uname} "Enable the ${_name} subsystem" "${SDL_${_uname}_DEFAULT}") 253 endif() 254 list(APPEND SDL_SUBSYSTEMS "${_name}") 255endmacro() 256 257define_sdl_subsystem(Audio) 258define_sdl_subsystem(Video) 259define_sdl_subsystem(GPU DEPS SDL_VIDEO) 260define_sdl_subsystem(Render DEPS SDL_VIDEO) 261define_sdl_subsystem(Camera DEPS SDL_VIDEO) 262define_sdl_subsystem(Joystick) 263define_sdl_subsystem(Haptic) 264define_sdl_subsystem(Hidapi) 265define_sdl_subsystem(Power) 266define_sdl_subsystem(Sensor) 267define_sdl_subsystem(Dialog) 268define_sdl_subsystem(Tray) 269 270cmake_dependent_option(SDL_FRAMEWORK "Build SDL libraries as Apple Framework" OFF "APPLE" OFF) 271if(SDL_FRAMEWORK) 272 set(SDL_STATIC_AVAILABLE FALSE) 273endif() 274 275if(UNIX AND NOT ANDROID AND NOT RISCOS AND NOT SDL_FRAMEWORK) 276 set(SDL_RPATH_DEFAULT ON) 277else() 278 set(SDL_RPATH_DEFAULT OFF) 279endif() 280 281set(SDL_PRESEED_AVAILABLE OFF) 282if(COMMAND SDL_Preseed_CMakeCache) 283 set(SDL_PRESEED_AVAILABLE ON) 284endif() 285 286set(SDL_VULKAN_DEFAULT ON) 287 288set(SDL_X11_XRANDR_DEFAULT ON) 289if(SOLARIS) 290 set(SDL_VULKAN_DEFAULT OFF) 291 set(SDL_X11_XRANDR_DEFAULT OFF) 292endif() 293 294# Allow some projects to be built conditionally. 295set_option(SDL_INSTALL "Enable installation of SDL3" ${SDL3_MAINPROJECT}) 296cmake_dependent_option(SDL_INSTALL_CPACK "Create binary SDL3 archive using CPack" ${SDL3_MAINPROJECT} "SDL_INSTALL" ON) 297cmake_dependent_option(SDL_INSTALL_DOCS "Install docs for SDL3" OFF "SDL_INSTALL;NOT SDL_FRAMEWORK" ON) 298set_option(SDL_UNINSTALL "Enable uninstallation of SDL3" ${SDL3_MAINPROJECT}) 299cmake_dependent_option(SDL_PRESEED "Preseed CMake cache to speed up configuration" ON "${SDL_PRESEED_AVAILABLE}" OFF) 300cmake_dependent_option(SDL_RELOCATABLE "Create relocatable SDL package" ${SDL_RELOCATABLE_DEFAULT} "SDL_INSTALL" OFF) 301 302cmake_dependent_option(SDL_ANDROID_JAR "Enable creation of SDL3.jar" ${SDL3_MAINPROJECT} "ANDROID" ON) 303 304option_string(SDL_ASSERTIONS "Enable internal sanity checks (auto/disabled/release/enabled/paranoid)" "auto") 305set_option(SDL_ASSEMBLY "Enable assembly routines" ${SDL_ASSEMBLY_DEFAULT}) 306dep_option(SDL_AVX "Use AVX assembly routines" ON "SDL_ASSEMBLY;SDL_CPU_X86 OR SDL_CPU_X64" OFF) 307dep_option(SDL_AVX2 "Use AVX2 assembly routines" ON "SDL_ASSEMBLY;SDL_CPU_X86 OR SDL_CPU_X64" OFF) 308dep_option(SDL_AVX512F "Use AVX512F assembly routines" ON "SDL_ASSEMBLY;SDL_CPU_X86 OR SDL_CPU_X64" OFF) 309dep_option(SDL_SSE "Use SSE assembly routines" ON "SDL_ASSEMBLY;SDL_CPU_X86 OR SDL_CPU_X64" OFF) 310dep_option(SDL_SSE2 "Use SSE2 assembly routines" ON "SDL_ASSEMBLY;SDL_CPU_X86 OR SDL_CPU_X64" OFF) 311dep_option(SDL_SSE3 "Use SSE3 assembly routines" ON "SDL_ASSEMBLY;SDL_CPU_X86 OR SDL_CPU_X64" OFF) 312dep_option(SDL_SSE4_1 "Use SSE4.1 assembly routines" ON "SDL_ASSEMBLY;SDL_CPU_X86 OR SDL_CPU_X64" OFF) 313dep_option(SDL_SSE4_2 "Use SSE4.2 assembly routines" ON "SDL_ASSEMBLY;SDL_CPU_X86 OR SDL_CPU_X64" OFF) 314dep_option(SDL_MMX "Use MMX assembly routines" ON "SDL_ASSEMBLY;SDL_CPU_X86 OR SDL_CPU_X64" OFF) 315dep_option(SDL_ALTIVEC "Use Altivec assembly routines" ON "SDL_ASSEMBLY;SDL_CPU_POWERPC32 OR SDL_CPU_POWERPC64" OFF) 316dep_option(SDL_ARMNEON "Use NEON assembly routines" ON "SDL_ASSEMBLY;SDL_CPU_ARM32 OR SDL_CPU_ARM64" OFF) 317dep_option(SDL_LSX "Use LSX assembly routines" ON "SDL_ASSEMBLY;SDL_CPU_LOONGARCH64" OFF) 318dep_option(SDL_LASX "Use LASX assembly routines" ON "SDL_ASSEMBLY;SDL_CPU_LOONGARCH64" OFF) 319 320dep_option(SDL_DLOPEN_NOTES "Record dlopen dependencies in .note.dlopen section" TRUE UNIX_SYS OFF) 321set_option(SDL_LIBC "Use the system C library" ${SDL_LIBC_DEFAULT}) 322set_option(SDL_SYSTEM_ICONV "Use iconv() from system-installed libraries" ${SDL_SYSTEM_ICONV_DEFAULT}) 323set_option(SDL_LIBICONV "Prefer iconv() from libiconv, if available, over libc version" OFF) 324set_option(SDL_GCC_ATOMICS "Use gcc builtin atomics" ${SDL_GCC_ATOMICS_DEFAULT}) 325dep_option(SDL_DBUS "Enable D-Bus support" ON "${UNIX_SYS}" OFF) 326dep_option(SDL_LIBURING "Enable liburing support" ON "${UNIX_SYS}" OFF) 327dep_option(SDL_DISKAUDIO "Support the disk writer audio driver" ON "SDL_AUDIO" OFF) 328dep_option(SDL_DUMMYAUDIO "Support the dummy audio driver" ON "SDL_AUDIO" OFF) 329dep_option(SDL_DUMMYVIDEO "Use dummy video driver" ON "SDL_VIDEO" OFF) 330dep_option(SDL_IBUS "Enable IBus support" ON "${UNIX_SYS}" OFF) 331dep_option(SDL_OPENGL "Include OpenGL support" ON "SDL_VIDEO;NOT IOS;NOT VISIONOS;NOT TVOS;NOT WATCHOS" OFF) 332dep_option(SDL_OPENGLES "Include OpenGL ES support" ON "SDL_VIDEO;NOT VISIONOS;NOT TVOS;NOT WATCHOS" OFF) 333set_option(SDL_PTHREADS "Use POSIX threads for multi-threading" ${SDL_PTHREADS_DEFAULT}) 334dep_option(SDL_PTHREADS_SEM "Use pthread semaphores" ON "SDL_PTHREADS" OFF) 335dep_option(SDL_OSS "Support the OSS audio API" ${SDL_OSS_DEFAULT} "UNIX_SYS OR RISCOS;SDL_AUDIO" OFF) 336dep_option(SDL_ALSA "Support the ALSA audio API" ${UNIX_SYS} "SDL_AUDIO" OFF) 337dep_option(SDL_ALSA_SHARED "Dynamically load ALSA audio support" ON "SDL_ALSA;SDL_DEPS_SHARED" OFF) 338dep_option(SDL_JACK "Support the JACK audio API" ${UNIX_SYS} "SDL_AUDIO" OFF) 339dep_option(SDL_JACK_SHARED "Dynamically load JACK audio support" ON "SDL_JACK;SDL_DEPS_SHARED" OFF) 340set_option(SDL_PIPEWIRE "Use Pipewire audio" ${UNIX_SYS}) 341dep_option(SDL_PIPEWIRE_SHARED "Dynamically load Pipewire support" ON "SDL_PIPEWIRE;SDL_DEPS_SHARED" OFF) 342dep_option(SDL_PULSEAUDIO "Use PulseAudio" ${UNIX_SYS} "SDL_AUDIO" OFF) 343dep_option(SDL_PULSEAUDIO_SHARED "Dynamically load PulseAudio support" ON "SDL_PULSEAUDIO;SDL_DEPS_SHARED" OFF) 344dep_option(SDL_SNDIO "Support the sndio audio API" ${UNIX_SYS} "SDL_AUDIO" OFF) 345dep_option(SDL_SNDIO_SHARED "Dynamically load the sndio audio API" ON "SDL_SNDIO;SDL_DEPS_SHARED" OFF) 346set_option(SDL_RPATH "Use an rpath when linking SDL" ${SDL_RPATH_DEFAULT}) 347set_option(SDL_CLOCK_GETTIME "Use clock_gettime() instead of gettimeofday()" ${SDL_CLOCK_GETTIME_DEFAULT}) 348dep_option(SDL_X11 "Use X11 video driver" ${UNIX_SYS} "SDL_VIDEO" OFF) 349dep_option(SDL_X11_SHARED "Dynamically load X11 support" ON "SDL_X11;SDL_DEPS_SHARED" OFF) 350dep_option(SDL_X11_XCURSOR "Enable Xcursor support" ON SDL_X11 OFF) 351dep_option(SDL_X11_XDBE "Enable Xdbe support" ON SDL_X11 OFF) 352dep_option(SDL_X11_XINPUT "Enable XInput support" ON SDL_X11 OFF) 353dep_option(SDL_X11_XFIXES "Enable Xfixes support" ON SDL_X11 OFF) 354dep_option(SDL_X11_XRANDR "Enable Xrandr support" "${SDL_X11_XRANDR_DEFAULT}" SDL_X11 OFF) 355dep_option(SDL_X11_XSCRNSAVER "Enable Xscrnsaver support" ON SDL_X11 OFF) 356dep_option(SDL_X11_XSHAPE "Enable XShape support" ON SDL_X11 OFF) 357dep_option(SDL_X11_XSYNC "Enable Xsync support" ON SDL_X11 OFF) 358dep_option(SDL_X11_XTEST "Enable XTest support" ON SDL_X11 OFF) 359dep_option(SDL_FRIBIDI "Enable Fribidi support" ON SDL_X11 OFF) 360dep_option(SDL_FRIBIDI_SHARED "Dynamically load Fribidi support" ON "SDL_FRIBIDI;SDL_DEPS_SHARED" OFF) 361dep_option(SDL_LIBTHAI "Enable Thai support" ON SDL_X11 OFF) 362dep_option(SDL_LIBTHAI_SHARED "Dynamically load Thai support" ON "SDL_LIBTHAI;SDL_DEPS_SHARED" OFF) 363dep_option(SDL_WAYLAND "Use Wayland video driver" ${UNIX_SYS} "SDL_VIDEO" OFF) 364dep_option(SDL_WAYLAND_SHARED "Dynamically load Wayland support" ON "SDL_WAYLAND;SDL_DEPS_SHARED" OFF) 365dep_option(SDL_WAYLAND_LIBDECOR "Use client-side window decorations on Wayland" ON "SDL_WAYLAND" OFF) 366dep_option(SDL_WAYLAND_LIBDECOR_SHARED "Dynamically load libdecor support" ON "SDL_WAYLAND_LIBDECOR;SDL_WAYLAND_SHARED;SDL_DEPS_SHARED" OFF) 367dep_option(SDL_RPI "Use Raspberry Pi video driver" ON "SDL_VIDEO;UNIX_SYS;SDL_CPU_ARM32 OR SDL_CPU_ARM64" OFF) 368dep_option(SDL_ROCKCHIP "Use ROCKCHIP Hardware Acceleration video driver" ON "SDL_VIDEO;UNIX_SYS;SDL_CPU_ARM32 OR SDL_CPU_ARM64" OFF) 369dep_option(SDL_COCOA "Use Cocoa video driver" ON "APPLE" OFF) 370dep_option(SDL_DIRECTX "Use DirectX for Windows audio/video" ON "SDL_AUDIO OR SDL_VIDEO;WINDOWS" OFF) 371dep_option(SDL_XINPUT "Use Xinput for Windows" ON "WINDOWS" OFF) 372dep_option(SDL_WASAPI "Use the Windows WASAPI audio driver" ON "WINDOWS;SDL_AUDIO" OFF) 373dep_option(SDL_RENDER_D3D "Enable the Direct3D 9 render driver" ON "SDL_RENDER;SDL_DIRECTX" OFF) 374dep_option(SDL_RENDER_D3D11 "Enable the Direct3D 11 render driver" ON "SDL_RENDER;SDL_DIRECTX" OFF) 375dep_option(SDL_RENDER_D3D12 "Enable the Direct3D 12 render driver" ON "SDL_RENDER;SDL_DIRECTX" OFF) 376dep_option(SDL_RENDER_METAL "Enable the Metal render driver" ON "SDL_RENDER;APPLE" OFF) 377dep_option(SDL_RENDER_GPU "Enable the SDL_GPU render driver" ON "SDL_RENDER;SDL_GPU" OFF) 378dep_option(SDL_VIVANTE "Use Vivante EGL video driver" ON "${UNIX_SYS};SDL_CPU_ARM32" OFF) 379dep_option(SDL_VULKAN "Enable Vulkan support" "${SDL_VULKAN_DEFAULT}" "SDL_VIDEO;ANDROID OR APPLE OR LINUX OR FREEBSD OR OPENBSD OR WINDOWS" OFF) 380dep_option(SDL_RENDER_VULKAN "Enable the Vulkan render driver" ON "SDL_RENDER;SDL_VULKAN" OFF) 381dep_option(SDL_METAL "Enable Metal support" ON "APPLE" OFF) 382set_option(SDL_OPENVR "Use OpenVR video driver" OFF) 383dep_option(SDL_KMSDRM "Use KMS DRM video driver" ${UNIX_SYS} "SDL_VIDEO" OFF) 384dep_option(SDL_KMSDRM_SHARED "Dynamically load KMS DRM support" ON "SDL_KMSDRM;SDL_DEPS_SHARED" OFF) 385set_option(SDL_OFFSCREEN "Use offscreen video driver" ON) 386dep_option(SDL_DUMMYCAMERA "Support the dummy camera driver" ON SDL_CAMERA OFF) 387option_string(SDL_BACKGROUNDING_SIGNAL "number to use for magic backgrounding signal or 'OFF'" OFF) 388option_string(SDL_FOREGROUNDING_SIGNAL "number to use for magic foregrounding signal or 'OFF'" OFF) 389dep_option(SDL_HIDAPI "Enable the HIDAPI subsystem" ON "NOT VISIONOS" OFF) 390dep_option(SDL_HIDAPI_LIBUSB "Use libusb for low level joystick drivers" ON "SDL_HIDAPI;SDL_HIDAPI_LIBUSB_AVAILABLE" OFF) 391dep_option(SDL_HIDAPI_LIBUSB_SHARED "Dynamically load libusb support" ON "SDL_HIDAPI_LIBUSB;SDL_DEPS_SHARED" OFF) 392dep_option(SDL_HIDAPI_JOYSTICK "Use HIDAPI for low level joystick drivers" ON SDL_HIDAPI OFF) 393dep_option(SDL_VIRTUAL_JOYSTICK "Enable the virtual-joystick driver" ON SDL_HIDAPI OFF) 394set_option(SDL_LIBUDEV "Enable libudev support" ON) 395set_option(SDL_ASAN "Use AddressSanitizer to detect memory errors" OFF) 396set_option(SDL_CCACHE "Use Ccache to speed up build" OFF) 397set_option(SDL_CLANG_TIDY "Run clang-tidy static analysis" OFF) 398dep_option(SDL_GPU_OPENXR "Build SDL_GPU with OpenXR support" ON "SDL_GPU;NOT RISCOS" OFF) 399 400if(EMSCRIPTEN) 401 option_string(SDL_EMSCRIPTEN_PERSISTENT_PATH "Path to mount Emscripten IDBFS at startup or '' to disable" "") 402endif() 403 404set(SDL_VENDOR_INFO "" CACHE STRING "Vendor name and/or version to add to SDL_REVISION") 405 406if(DEFINED CACHE{SDL_SHARED} OR DEFINED CACHE{SDL_STATIC}) 407 cmake_dependent_option(SDL_SHARED "Build a shared version of the library" ${SDL_SHARED_DEFAULT} SDL_SHARED_AVAILABLE OFF) 408 cmake_dependent_option(SDL_STATIC "Build a static version of the library" ${SDL_STATIC_DEFAULT} SDL_STATIC_AVAILABLE OFF) 409else() 410 if(NOT DEFINED SDL_SHARED) 411 set(SDL_SHARED ${SDL_SHARED_DEFAULT}) 412 endif() 413 if(NOT DEFINED SDL_STATIC) 414 set(SDL_STATIC ${SDL_STATIC_DEFAULT}) 415 endif() 416endif() 417option(SDL_TEST_LIBRARY "Build the SDL3_test library" ON) 418 419dep_option(SDL_TESTS "Build the test directory" ${SDL3_MAINPROJECT} SDL_TEST_LIBRARY OFF) 420dep_option(SDL_INSTALL_TESTS "Install test-cases" OFF "SDL_INSTALL;NOT SDL_FRAMEWORK" OFF) 421dep_option(SDL_TESTS_LINK_SHARED "link tests to shared SDL library" "${SDL_SHARED}" "SDL_SHARED;SDL_STATIC" "${SDL_SHARED}") 422set(SDL_TESTS_TIMEOUT_MULTIPLIER "1" CACHE STRING "Timeout multiplier to account for really slow machines") 423 424set_option(SDL_EXAMPLES "Build the examples directory") 425dep_option(SDL_EXAMPLES_LINK_SHARED "link examples to shared SDL library" "${SDL_SHARED}" "SDL_SHARED;SDL_STATIC" "${SDL_SHARED}") 426 427if(VITA) 428 set_option(VIDEO_VITA_PIB "Build with PSVita piglet gles2 support" OFF) 429 set_option(VIDEO_VITA_PVR "Build with PSVita PVR gles/gles2 support" OFF) 430endif() 431 432if(DOS) 433 set(SDL_GPU OFF) 434 set(SDL_CAMERA OFF) 435 set(SDL_HAPTIC OFF) 436 set(SDL_HIDAPI OFF) 437 set(SDL_POWER OFF) 438 set(SDL_SENSOR OFF) 439 set(SDL_DIALOG OFF) 440 set(SDL_DUMMYCAMERA OFF) 441 set(SDL_OFFSCREEN OFF) 442 set(SDL_RENDER_GPU OFF) 443 set(SDL_TRAY OFF) 444 set(SDL_PROCESS OFF) 445endif() 446 447if (NGAGE) 448 set(SDL_GPU OFF) 449 set(SDL_CAMERA OFF) 450 set(SDL_JOYSTICK OFF) 451 set(SDL_HAPTIC OFF) 452 set(SDL_HIDAPI OFF) 453 set(SDL_POWER OFF) 454 set(SDL_SENSOR OFF) 455 set(SDL_DIALOG OFF) 456 set(SDL_DISKAUDIO OFF) 457 set(SDL_DUMMYAUDIO OFF) 458 set(SDL_DUMMYCAMERA OFF) 459 set(SDL_DUMMYVIDEO OFF) 460 set(SDL_OFFSCREEN OFF) 461 set(SDL_RENDER_GPU OFF) 462 set(SDL_TRAY OFF) 463 set(SDL_VIRTUAL_JOYSTICK OFF) 464endif() 465 466if(NOT (SDL_SHARED OR SDL_STATIC)) 467 message(FATAL_ERROR "SDL_SHARED and SDL_STATIC cannot both be disabled") 468endif() 469 470if(SDL_PRESEED) 471 SDL_Preseed_CMakeCache() 472endif() 473 474if(MSVC) 475 if(NOT SDL_LIBC) 476 # Make sure /RTC1 is disabled, otherwise it will use functions from the CRT 477 foreach(flag_var 478 CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE 479 CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO 480 CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE 481 CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO) 482 string(REGEX REPLACE "/RTC(su|[1su])" "" ${flag_var} "${${flag_var}}") 483 endforeach(flag_var) 484 set(CMAKE_MSVC_RUNTIME_CHECKS "") 485 endif() 486 487 if(MSVC_CLANG) 488 # clang-cl treats /W4 as '-Wall -Wextra' -- we don't need -Wextra 489 foreach(flag_var 490 CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE 491 CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO) 492 string(REGEX REPLACE "/W4" "/W3" ${flag_var} "${${flag_var}}") 493 endforeach(flag_var) 494 endif() 495endif() 496 497if(SDL_SHARED) 498 add_library(SDL3-shared SHARED) 499 add_library(SDL3::SDL3-shared ALIAS SDL3-shared) 500 SDL_AddCommonCompilerFlags(SDL3-shared) 501 target_compile_definitions(SDL3-shared PRIVATE "$<$<CONFIG:Debug>:DEBUG>") 502 set_property(TARGET SDL3-shared PROPERTY UNITY_BUILD OFF) 503 if ("c_std_99" IN_LIST CMAKE_C_COMPILE_FEATURES) 504 target_compile_features(SDL3-shared PRIVATE c_std_99) 505 else() 506 # tcc does support the subset of C99 used by SDL 507 if (NOT USE_TCC) 508 message(WARNING "target_compile_features does not know c_std_99 for C compiler") 509 endif() 510 endif() 511endif() 512 513if(SDL_STATIC) 514 add_library(SDL3-static STATIC) 515 add_library(SDL3::SDL3-static ALIAS SDL3-static) 516 SDL_AddCommonCompilerFlags(SDL3-static) 517 target_compile_definitions(SDL3-static PRIVATE "$<$<CONFIG:Debug>:DEBUG>") 518 set_property(TARGET SDL3-static PROPERTY UNITY_BUILD OFF) 519 if ("c_std_99" IN_LIST CMAKE_C_COMPILE_FEATURES) 520 target_compile_features(SDL3-static PRIVATE c_std_99) 521 else() 522 if (NOT USE_TCC) 523 message(WARNING "target_compile_features does not know c_std_99 for C compiler") 524 endif() 525 endif() 526endif() 527 528if(SDL_TEST_LIBRARY) 529 add_library(SDL3_test STATIC) 530 add_library(SDL3::SDL3_test ALIAS SDL3_test) 531 SDL_AddCommonCompilerFlags(SDL3_test) 532 target_compile_definitions(SDL3_test PRIVATE "$<$<CONFIG:Debug>:DEBUG>") 533endif() 534 535# Make sure SDL3::SDL3 always exists 536if(TARGET SDL3::SDL3-shared) 537 add_library(SDL3::SDL3 ALIAS SDL3-shared) 538else() 539 add_library(SDL3::SDL3 ALIAS SDL3-static) 540endif() 541 542sdl_pc_link_options("-lSDL3") 543 544# Enable large file support on 32-bit glibc, so that we can access files 545# with large inode numbers 546check_symbol_exists("__GLIBC__" "stdlib.h" LIBC_IS_GLIBC) 547if (LIBC_IS_GLIBC AND CMAKE_SIZEOF_VOID_P EQUAL 4) 548 # Enable large file support on 32-bit glibc, so that we can access files with large inode numbers 549 sdl_compile_definitions(PRIVATE "_FILE_OFFSET_BITS=64") 550 # Enable 64-bit time_t on 32-bit glibc, so that time stamps remain correct beyond January 2038 551 sdl_compile_definitions(PRIVATE "_TIME_BITS=64") 552endif() 553 554check_linker_supports_version_file(HAVE_WL_VERSION_SCRIPT) 555if(HAVE_WL_VERSION_SCRIPT) 556 sdl_shared_link_options("-Wl,--version-script=${CMAKE_CURRENT_SOURCE_DIR}/src/dynapi/SDL_dynapi.sym") 557else() 558 # When building with tcc on Linux+glibc or Android, avoid emitting an error 559 # for lack of support of the version-script linker flag: the option will be 560 # silently ignored by the compiler and the build will still succeed. 561 if(((LINUX AND LIBC_IS_GLIBC) OR ANDROID) AND (NOT USE_TCC)) 562 message(FATAL_ERROR "Linker does not support '-Wl,--version-script=xxx.sym'. This is required on the current host platform (${SDL_CMAKE_PLATFORM}).") 563 endif() 564endif() 565 566if(CYGWIN) 567 # We build SDL on cygwin without the UNIX emulation layer 568 sdl_include_directories(PUBLIC SYSTEM "/usr/include/mingw") 569 cmake_push_check_state() 570 string(APPEND CMAKE_REQUIRED_FLAGS " -mno-cygwin") 571 check_c_source_compiles("int main(int argc, char **argv) { return 0; }" 572 HAVE_GCC_NO_CYGWIN) 573 cmake_pop_check_state() 574 if(HAVE_GCC_NO_CYGWIN) 575 sdl_shared_link_options("-mno-cygwin") 576 endif() 577endif() 578 579# General includes 580sdl_compile_definitions(PRIVATE "USING_GENERATED_CONFIG_H") 581sdl_include_directories( 582 PRIVATE 583 "${SDL3_BINARY_DIR}/include-config-$<LOWER_CASE:$<CONFIG>>/build_config" 584 "${SDL3_BINARY_DIR}/include-revision" 585 "${SDL3_SOURCE_DIR}/include" 586) 587# Note: The clang toolset for Visual Studio does not support the '-idirafter' option. 588if(USE_GCC OR USE_INTELCC OR (USE_CLANG AND NOT MSVC_CLANG)) 589 sdl_compile_options(NO_EXPORT PRIVATE "$<BUILD_INTERFACE:-idirafter${SDL3_SOURCE_DIR}/src/video/khronos>") 590else() 591 sdl_include_directories(NO_EXPORT SYSTEM PRIVATE "$<BUILD_INTERFACE:${SDL3_SOURCE_DIR}/src/video/khronos>") 592endif() 593 594if(MSVC AND TARGET SDL3-shared AND NOT SDL_LIBC) 595 if(SDL_CPU_X64) 596 enable_language(ASM_MASM) 597 set(asm_src "${SDL3_SOURCE_DIR}/src/stdlib/SDL_mslibc_x64.masm") 598 target_compile_options(SDL3-shared PRIVATE "$<$<COMPILE_LANGUAGE:ASM_MASM>:/nologo>") 599 set_property(SOURCE "${asm_src}" PROPERTY LANGUAGE "ASM_MASM") 600 target_sources(SDL3-shared PRIVATE "${asm_src}") 601 elseif(SDL_CPU_ARM64) 602 enable_language(ASM_MARMASM) 603 set(asm_src "${SDL3_SOURCE_DIR}/src/stdlib/SDL_mslibc_arm64.masm") 604 target_compile_options(SDL3-shared PRIVATE "$<$<COMPILE_LANGUAGE:ASM_MARMASM>:/nologo>") 605 set_property(SOURCE "${asm_src}" PROPERTY LANGUAGE "ASM_MARMASM") 606 target_sources(SDL3-shared PRIVATE "${asm_src}") 607 elseif(SDL_CPU_ARM32) 608 # FIXME 609 endif() 610endif() 611 612if(USE_INTELCC) 613 # warning #39: division by zero 614 # warning #239: floating point underflow 615 # warning #264: floating-point value does not fit in required floating-point type 616 set_property(SOURCE "${SDL3_SOURCE_DIR}/src/libm/e_exp.c" APPEND_STRING PROPERTY COMPILE_FLAGS " -wd239 -wd264") 617 set_property(SOURCE "${SDL3_SOURCE_DIR}/src/libm/e_log.c" APPEND_STRING PROPERTY COMPILE_FLAGS " -wd39") 618 set_property(SOURCE "${SDL3_SOURCE_DIR}/src/libm/e_log10.c" APPEND_STRING PROPERTY COMPILE_FLAGS " -wd39") 619 set_property(SOURCE 620 "${SDL3_SOURCE_DIR}/src/libm/e_exp.c" 621 "${SDL3_SOURCE_DIR}/src/libm/e_log.c" 622 "${SDL3_SOURCE_DIR}/src/libm/e_log10.c" 623 PROPERTY SKIP_PRECOMPILE_HEADERS 1) 624endif() 625 626set(SDL_DEFAULT_ASSERT_LEVEL_CONFIGURED 1) 627if(SDL_ASSERTIONS MATCHES "^(auto|)$") 628 # Do nada - use optimization settings to determine the assertion level 629 set(SDL_DEFAULT_ASSERT_LEVEL ) 630 set(SDL_DEFAULT_ASSERT_LEVEL_CONFIGURED 0) 631elseif(SDL_ASSERTIONS MATCHES "^(disabled|0)$") 632 set(SDL_DEFAULT_ASSERT_LEVEL 0) 633elseif(SDL_ASSERTIONS MATCHES "^(release|1)$") 634 set(SDL_DEFAULT_ASSERT_LEVEL 1) 635elseif(SDL_ASSERTIONS MATCHES "^(enabled|2)$") 636 set(SDL_DEFAULT_ASSERT_LEVEL 2) 637elseif(SDL_ASSERTIONS MATCHES "^(paranoid|3)$") 638 set(SDL_DEFAULT_ASSERT_LEVEL 3) 639else() 640 message(FATAL_ERROR "unknown assertion level") 641endif() 642set(HAVE_ASSERTIONS ${SDL_ASSERTIONS}) 643 644if(NOT SDL_BACKGROUNDING_SIGNAL STREQUAL "OFF") 645 sdl_compile_definitions(PRIVATE "SDL_BACKGROUNDING_SIGNAL=${SDL_BACKGROUNDING_SIGNAL}") 646endif() 647 648if(NOT SDL_FOREGROUNDING_SIGNAL STREQUAL "OFF") 649 sdl_compile_definitions(PRIVATE "SDL_FOREGROUNDING_SIGNAL=${SDL_FOREGROUNDING_SIGNAL}") 650endif() 651 652# Compiler option evaluation 653if(USE_GCC OR USE_CLANG OR USE_INTELCC OR USE_QCC) 654 if(SDL_GCC_ATOMICS) 655 check_c_source_compiles("int main(int argc, char **argv) { 656 int a; 657 void *x, *y, *z; 658 __sync_lock_test_and_set(&a, 4); 659 __sync_lock_test_and_set(&x, y); 660 __sync_fetch_and_add(&a, 1); 661 __sync_bool_compare_and_swap(&a, 5, 10); 662 __sync_bool_compare_and_swap(&x, y, z); 663 return 0; }" COMPILER_SUPPORTS_GCC_ATOMICS) 664 set(HAVE_GCC_ATOMICS ${COMPILER_SUPPORTS_GCC_ATOMICS}) 665 if(NOT HAVE_GCC_ATOMICS) 666 check_c_source_compiles("int main(int argc, char **argv) { 667 int a; 668 __sync_lock_test_and_set(&a, 1); 669 __sync_lock_release(&a); 670 return 0; }" COMPILER_SUPPORTS_SYNC_LOCK_TEST_AND_SET) 671 set(HAVE_GCC_SYNC_LOCK_TEST_AND_SET ${COMPILER_SUPPORTS_SYNC_LOCK_TEST_AND_SET}) 672 endif() 673 endif() 674 675 cmake_push_check_state() 676 string(APPEND CMAKE_REQUIRED_FLAGS " -fvisibility=hidden -Werror") 677 check_c_source_compiles(" 678 #if !defined(__GNUC__) || __GNUC__ < 4 679 #error SDL only uses visibility attributes in GCC 4 or newer 680 #endif 681 __attribute__((visibility(\"default\"))) int foo(void); 682 __attribute__((visibility(\"hidden\"))) int bar(void); 683 int foo(void) { return 0; } 684 int bar(void) { return 1; } 685 int main(void) { return 0; }" HAVE_GCC_FVISIBILITY) 686 cmake_pop_check_state() 687 688 if(APPLE) 689 check_c_compiler_flag(-Wno-error=deprecated-declarations COMPILER_SUPPORTS_WNO_ERROR_DEPRECATED_DECLARATIONS) 690 if(COMPILER_SUPPORTS_WNO_ERROR_DEPRECATED_DECLARATIONS) 691 sdl_compile_options(PRIVATE "-Wno-error=deprecated-declarations") 692 endif() 693 check_c_compiler_flag(-Wno-deprecated-declarations COMPILER_SUPPORTS_WNO_DEPRECATED_DECLARATIONS) 694 if(COMPILER_SUPPORTS_WNO_DEPRECATED_DECLARATIONS) 695 sdl_compile_options(PRIVATE "-Wno-deprecated-declarations") 696 endif() 697 endif() 698 699 if(NOT OPENBSD) 700 cmake_push_check_state() 701 check_linker_flag(C "-Wl,--no-undefined" LINKER_SUPPORTS_WL_NO_UNDEFINED) 702 #FIXME: originally this if had an additional "AND NOT (USE_CLANG AND WINDOWS)" 703 if(LINKER_SUPPORTS_WL_NO_UNDEFINED) 704 sdl_shared_link_options("-Wl,--no-undefined") 705 endif() 706 endif() 707endif() 708 709if(MSVC) 710 sdl_compile_definitions( 711 PRIVATE 712 "_CRT_SECURE_NO_DEPRECATE" 713 "_CRT_NONSTDC_NO_DEPRECATE" 714 "_CRT_SECURE_NO_WARNINGS" 715 ) 716 717 # CET support was added in VS 2019 16.7 718 if(MSVC_VERSION GREATER 1926 AND CMAKE_GENERATOR_PLATFORM MATCHES "Win32|x64") 719 # Mark SDL3.dll as compatible with Control-flow Enforcement Technology (CET) 720 sdl_shared_link_options("-CETCOMPAT") 721 endif() 722 723 # for VS >= 17.14 targeting ARM64: inline the Interlocked funcs 724 if(MSVC_VERSION GREATER 1943 AND SDL_CPU_ARM64 AND NOT SDL_LIBC) 725 sdl_compile_options(PRIVATE "/forceInterlockedFunctions-") 726 endif() 727endif() 728 729if(CMAKE_C_COMPILER_ID STREQUAL "MSVC") 730 # Due to a limitation of Microsoft's LTO implementation, LTO must be disabled for memcpy and memset. 731 # The same applies to various functions normally belonging in the C library (for x86 architecture). 732 set_property(SOURCE "${SDL3_SOURCE_DIR}/src/stdlib/SDL_mslibc.c" APPEND_STRING PROPERTY COMPILE_FLAGS " /GL-") 733endif() 734 735if(SDL_ASSEMBLY) 736 set(HAVE_ASSEMBLY TRUE) 737 738 if(SDL_MMX) 739 cmake_push_check_state() 740 if(USE_GCC OR USE_CLANG OR USE_INTELCC) 741 string(APPEND CMAKE_REQUIRED_FLAGS " -mmmx") 742 endif() 743 check_x86_source_compiles([==[ 744 #include <mmintrin.h> 745 void ints_add(int *dest, int *a, int *b, unsigned size) { 746 for (; size >= 2; size -= 2, dest += 2, a += 2, b += 2) { 747 *(__m64*)dest = _mm_add_pi32(*(__m64*)a, *(__m64*)b); 748 } 749 } 750 int main(int argc, char *argv[]) { 751 ints_add((int*)0, (int*)0, (int*)0, 0); 752 return 0; 753 }]==] COMPILER_SUPPORTS_MMX) 754 cmake_pop_check_state() 755 if(COMPILER_SUPPORTS_MMX) 756 set(HAVE_MMX TRUE) 757 endif() 758 endif() 759 if(SDL_SSE) 760 cmake_push_check_state() 761 if(USE_GCC OR USE_CLANG OR USE_INTELCC) 762 string(APPEND CMAKE_REQUIRED_FLAGS " -msse") 763 endif() 764 check_x86_source_compiles([==[ 765 #include <xmmintrin.h> 766 void floats_add(float *dest, float *a, float *b, unsigned size) { 767 for (; size >= 4; size -= 4, dest += 4, a += 4, b += 4) { 768 _mm_storeu_ps(dest, _mm_add_ps(_mm_loadu_ps(a), _mm_loadu_ps (b))); 769 } 770 } 771 int main(int argc, char **argv) { 772 floats_add((float*)0, (float*)0, (float*)0, 0); 773 return 0; 774 }]==] COMPILER_SUPPORTS_SSE) 775 cmake_pop_check_state() 776 if(COMPILER_SUPPORTS_SSE) 777 set(HAVE_SSE TRUE) 778 endif() 779 endif() 780 if(SDL_SSE2) 781 cmake_push_check_state() 782 if(USE_GCC OR USE_CLANG OR USE_INTELCC) 783 string(APPEND CMAKE_REQUIRED_FLAGS " -msse2") 784 endif() 785 check_x86_source_compiles([==[ 786 #include <emmintrin.h> 787 void doubles_add(double *dest, double *a, double *b, unsigned size) { 788 for (; size >= 4; size -= 4, dest += 4, a += 4, b += 4) { 789 _mm_store_pd(dest, _mm_add_pd(_mm_loadu_pd(a), _mm_loadu_pd(b))); 790 } 791 } 792 int main(int argc, char **argv) { 793 doubles_add((double*)0, (double*)0, (double*)0, 0); 794 return 0; 795 }]==] COMPILER_SUPPORTS_SSE2) 796 cmake_pop_check_state() 797 if(COMPILER_SUPPORTS_SSE2) 798 set(HAVE_SSE2 TRUE) 799 endif() 800 endif() 801 if(SDL_SSE3) 802 cmake_push_check_state() 803 if(USE_GCC OR USE_CLANG OR USE_INTELCC) 804 string(APPEND CMAKE_REQUIRED_FLAGS " -msse3") 805 endif() 806 check_x86_source_compiles([==[ 807 #include <pmmintrin.h> 808 void ints_add(int *dest, int *a, int *b, unsigned size) { 809 for (; size >= 4; size -= 4, dest += 4, a += 4, b += 4) { 810 _mm_storeu_si128((__m128i*)dest, _mm_add_epi32(_mm_lddqu_si128((__m128i*)a), _mm_lddqu_si128((__m128i*)b))); 811 } 812 } 813 int main(int argc, char **argv) { 814 ints_add((int*)0, (int*)0, (int*)0, 0); 815 return 0; 816 }]==] COMPILER_SUPPORTS_SSE3) 817 cmake_pop_check_state() 818 if(COMPILER_SUPPORTS_SSE3) 819 set(HAVE_SSE3 TRUE) 820 endif() 821 endif() 822 if(SDL_SSE4_1) 823 cmake_push_check_state() 824 if(USE_GCC OR USE_CLANG OR USE_INTELCC) 825 string(APPEND CMAKE_REQUIRED_FLAGS " -msse4.1") 826 endif() 827 check_x86_source_compiles([==[ 828 #include <smmintrin.h> 829 void ints_mul(int *dest, int *a, int *b, unsigned size) { 830 for (; size >= 4; size -= 4, dest += 4, a += 4, b += 4) { 831 _mm_storeu_si128((__m128i*)dest, _mm_mullo_epi32(_mm_lddqu_si128((__m128i*)a), _mm_lddqu_si128((__m128i*)b))); 832 } 833 } 834 int main(int argc, char **argv) { 835 ints_mul((int*)0, (int*)0, (int*)0, 0); 836 return 0; 837 }]==] COMPILER_SUPPORTS_SSE4_1) 838 cmake_pop_check_state() 839 if(COMPILER_SUPPORTS_SSE4_1) 840 set(HAVE_SSE4_1 TRUE) 841 endif() 842 endif() 843 if(SDL_SSE4_2) 844 cmake_push_check_state() 845 if(USE_GCC OR USE_CLANG OR USE_INTELCC) 846 string(APPEND CMAKE_REQUIRED_FLAGS " -msse4.2") 847 endif() 848 check_x86_source_compiles([==[ 849 #include <nmmintrin.h> 850 __m128i bitmask; 851 char data[16]; 852 int main(int argc, char **argv) { 853 bitmask = _mm_cmpgt_epi64(_mm_set1_epi64x(0), _mm_loadu_si128((void*)data)); 854 return 0; 855 }]==] COMPILER_SUPPORTS_SSE4_2) 856 cmake_pop_check_state() 857 if(COMPILER_SUPPORTS_SSE4_2) 858 set(HAVE_SSE4_2 TRUE) 859 endif() 860 endif() 861 if(SDL_AVX) 862 cmake_push_check_state() 863 if(USE_GCC OR USE_CLANG OR USE_INTELCC) 864 string(APPEND CMAKE_REQUIRED_FLAGS " -mavx") 865 endif() 866 check_x86_source_compiles([==[ 867 #include <immintrin.h> 868 void floats_add(float *dest, float *a, float *b, unsigned size) { 869 for (; size >= 8; size -= 8, dest += 8, a += 8, b += 8) { 870 _mm256_storeu_ps(dest, _mm256_add_ps(_mm256_loadu_ps(a), _mm256_loadu_ps(b))); 871 } 872 } 873 int main(int argc, char **argv) { 874 floats_add((float*)0, (float*)0, (float*)0, 0); 875 return 0; 876 }]==] COMPILER_SUPPORTS_AVX) 877 cmake_pop_check_state() 878 if(COMPILER_SUPPORTS_AVX) 879 set(HAVE_AVX TRUE) 880 endif() 881 endif() 882 if(SDL_AVX2) 883 cmake_push_check_state() 884 if(USE_GCC OR USE_CLANG OR USE_INTELCC) 885 string(APPEND CMAKE_REQUIRED_FLAGS " -mavx2") 886 endif() 887 check_x86_source_compiles([==[ 888 #include <immintrin.h> 889 void ints_add(int *dest, int *a, int *b, unsigned size) { 890 for (; size >= 8; size -= 8, dest += 8, a += 8, b += 8) { 891 _mm256_storeu_si256((__m256i*)dest, _mm256_add_epi32(_mm256_loadu_si256((__m256i*)a), _mm256_loadu_si256((__m256i*)b))); 892 } 893 } 894 int main(int argc, char **argv) { 895 ints_add((int*)0, (int*)0, (int*)0, 0); 896 return 0; 897 }]==] COMPILER_SUPPORTS_AVX2) 898 cmake_pop_check_state() 899 if(COMPILER_SUPPORTS_AVX2) 900 set(HAVE_AVX2 TRUE) 901 endif() 902 endif() 903 if(SDL_AVX512F) 904 cmake_push_check_state() 905 if(USE_GCC OR USE_CLANG OR USE_INTELCC) 906 string(APPEND CMAKE_REQUIRED_FLAGS " -mavx512f") 907 endif() 908 check_x86_source_compiles([==[ 909 #include <immintrin.h> 910 void floats_add(float *dest, float *a, float *b, unsigned size) { 911 for (; size >= 16; size -= 16, dest += 16, a += 16, b += 16) { 912 _mm512_storeu_ps(dest, _mm512_add_ps(_mm512_loadu_ps(a), _mm512_loadu_ps(b))); 913 } 914 } 915 int main(int argc, char **argv) { 916 floats_add((float*)0, (float*)0, (float*)0, 0); 917 return 0; 918 }]==] COMPILER_SUPPORTS_AVX512F) 919 cmake_pop_check_state() 920 if(COMPILER_SUPPORTS_AVX512F) 921 set(HAVE_AVX512F TRUE) 922 endif() 923 endif() 924 925 if(SDL_ARMNEON) 926 check_arm_source_compiles([==[ 927 #include <arm_neon.h> 928 void floats_add(float *dest, float *a, float *b, unsigned size) { 929 for (; size >= 4; size -= 4, dest += 4, a += 4, b += 4) { 930 vst1q_f32(dest, vaddq_f32(vld1q_f32(a), vld1q_f32(b))); 931 } 932 } 933 int main(int argc, char *argv[]) { 934 floats_add((float*)0, (float*)0, (float*)0, 0); 935 return 0; 936 }]==] COMPILER_SUPPORTS_ARMNEON) 937 if(COMPILER_SUPPORTS_ARMNEON) 938 set(HAVE_ARMNEON TRUE) 939 endif() 940 endif() 941 942 if(USE_GCC OR USE_CLANG) 943 # TODO: Those all seem to be quite GCC specific - needs to be 944 # reworked for better compiler support 945 946 if(SDL_ALTIVEC) 947 cmake_push_check_state() 948 string(APPEND CMAKE_REQUIRED_FLAGS " -maltivec") 949 check_c_source_compiles(" 950 #include <altivec.h> 951 vector unsigned int vzero() { 952 return vec_splat_u32(0); 953 } 954 int main(int argc, char **argv) { return 0; }" COMPILER_SUPPORTS_ALTIVEC) 955 cmake_pop_check_state() 956 if(COMPILER_SUPPORTS_ALTIVEC) 957 set(HAVE_ALTIVEC TRUE) 958 set(SDL_ALTIVEC_BLITTERS 1) 959 sdl_compile_options(PRIVATE "-maltivec") 960 sdl_compile_options(PRIVATE "-fno-tree-vectorize") 961 set_property(SOURCE "${SDL3_SOURCE_DIR}/src/video/SDL_blit_N.c" APPEND PROPERTY COMPILE_DEFINITIONS "SDL_ENABLE_ALTIVEC") 962 set_property(SOURCE "${SDL3_SOURCE_DIR}/src/video/SDL_blit_N.c" PROPERTY SKIP_PRECOMPILE_HEADERS 1) 963 endif() 964 endif() 965 966 if(SDL_LSX) 967 cmake_push_check_state() 968 string(APPEND CMAKE_REQUIRED_FLAGS " -mlsx") 969 check_c_source_compiles(" 970 #ifndef __loongarch_sx 971 #error Assembler CPP flag not enabled 972 #endif 973 int main(int argc, char **argv) { return 0; }" COMPILER_SUPPORTS_LSX) 974 check_include_file("lsxintrin.h" HAVE_LSXINTRIN_H) 975 cmake_pop_check_state() 976 977 if(COMPILER_SUPPORTS_LSX AND HAVE_LSXINTRIN_H) 978 set_property(SOURCE 979 "${SDL3_SOURCE_DIR}/src/video/yuv2rgb/yuv_rgb_lsx.c" 980 "${SDL3_SOURCE_DIR}/src/video/SDL_blit_A.c" 981 "${SDL3_SOURCE_DIR}/src/video/SDL_fillrect.c" 982 APPEND PROPERTY COMPILE_OPTIONS "-mlsx") 983 984 set_property(SOURCE 985 "${SDL3_SOURCE_DIR}/src/video/yuv2rgb/yuv_rgb_lsx.c" 986 "${SDL3_SOURCE_DIR}/src/video/SDL_blit_A.c" 987 "${SDL3_SOURCE_DIR}/src/video/SDL_fillrect.c" 988 PROPERTY SKIP_PRECOMPILE_HEADERS 1) 989 set(HAVE_LSX TRUE) 990 endif() 991 endif() 992 993 if(SDL_LASX) 994 cmake_push_check_state() 995 string(APPEND CMAKE_REQUIRED_FLAGS " -mlasx") 996 check_c_source_compiles(" 997 #ifndef __loongarch_asx 998 #error Assembler CPP flag not enabled 999 #endif 1000 int main(int argc, char **argv) { return 0; }" COMPILER_SUPPORTS_LASX) 1001 check_include_file("lasxintrin.h" HAVE_LASXINTRIN_H) 1002 cmake_pop_check_state() 1003 if(COMPILER_SUPPORTS_LASX AND HAVE_LASXINTRIN_H) 1004 set(HAVE_LASX TRUE) 1005 endif() 1006 endif() 1007 endif() 1008endif() 1009 1010if(NOT HAVE_MMX) 1011 set(SDL_DISABLE_MMX 1) 1012endif() 1013 1014if(NOT HAVE_SSE) 1015 set(SDL_DISABLE_SSE 1) 1016endif() 1017 1018if(NOT HAVE_SSE2) 1019 set(SDL_DISABLE_SSE2 1) 1020endif() 1021 1022if(NOT HAVE_SSE3) 1023 set(SDL_DISABLE_SSE3 1) 1024endif() 1025 1026if(NOT HAVE_SSE4_1) 1027 set(SDL_DISABLE_SSE4_1 1) 1028endif() 1029 1030if(NOT HAVE_SSE4_2) 1031 set(SDL_DISABLE_SSE4_2 1) 1032endif() 1033 1034if(NOT HAVE_AVX) 1035 set(SDL_DISABLE_AVX 1) 1036endif() 1037 1038if(NOT HAVE_AVX2) 1039 set(SDL_DISABLE_AVX2 1) 1040endif() 1041 1042if(NOT HAVE_AVX512F) 1043 set(SDL_DISABLE_AVX512F 1) 1044endif() 1045 1046if(NOT HAVE_LSX) 1047 set(SDL_DISABLE_LSX 1) 1048endif() 1049 1050if(NOT HAVE_LASX) 1051 set(SDL_DISABLE_LASX 1) 1052endif() 1053 1054if(NOT HAVE_ARMNEON) 1055 set(SDL_DISABLE_NEON 1) 1056endif() 1057 1058set(SDL_DISABLE_ALLOCA 0) 1059check_include_file("alloca.h" "HAVE_ALLOCA_H") 1060if(MSVC) 1061 check_include_file("malloc.h" "HAVE_MALLOC_H") 1062 # Cannot use CheckSymbolExists for _alloca: purely intrinsic functions have no address (C7552) 1063 if(NOT DEFINED _ALLOCA_IN_MALLOC_H) 1064 message(STATUS "Looking for _alloca in malloc.h") 1065 set(testsrc "${CMAKE_CURRENT_SOURCE_DIR}/test_malloc_alloca.c") 1066 file(WRITE "${testsrc}" "#include <malloc.h>\n\nint main(int argc, char *argv[]) { void *ptr = _alloca(argc * (int)argv[0][0]); return ptr != (void *)0; }") 1067 try_compile(_ALLOCA_IN_MALLOC_H "${CMAKE_CURRENT_BINARY_DIR}/alloca_in_malloc_h" SOURCES "${testsrc}") 1068 message(STATUS "Looking for _alloca in malloc.h - ${_ALLOCA_IN_MALLOC_H}") 1069 endif() 1070 if(NOT HAVE_ALLOCA_H AND NOT _ALLOCA_IN_MALLOC_H) 1071 set(SDL_DISABLE_ALLOCA 1) 1072 endif() 1073endif() 1074 1075# TODO: Can't deactivate on FreeBSD? w/o LIBC, SDL_stdinc.h can't define anything. 1076if(SDL_LIBC) 1077 set(available_headers) 1078 set(HAVE_LIBC TRUE) 1079 set(headers_to_check 1080 float.h 1081 iconv.h 1082 inttypes.h 1083 limits.h 1084 malloc.h 1085 math.h 1086 memory.h 1087 signal.h 1088 stdarg.h 1089 stdbool.h 1090 stddef.h 1091 stdint.h 1092 stdio.h 1093 stdlib.h 1094 string.h 1095 strings.h 1096 sys/types.h 1097 time.h 1098 wchar.h 1099 ) 1100 foreach(_HEADER IN LISTS headers_to_check) 1101 string(TOUPPER "${_HEADER}" HEADER_IDENTIFIER) 1102 string(REGEX REPLACE "[./]" "_" HEADER_IDENTIFIER "${HEADER_IDENTIFIER}") 1103 set(LIBC_HAS_VAR "LIBC_HAS_${HEADER_IDENTIFIER}") 1104 check_include_file("${_HEADER}" "${LIBC_HAS_VAR}") 1105 set(HAVE_${HEADER_IDENTIFIER} ${${LIBC_HAS_VAR}}) 1106 if(HAVE_${HEADER_IDENTIFIER}) 1107 list(APPEND available_headers "${_HEADER}") 1108 endif() 1109 endforeach() 1110 1111 set(symbols_to_check 1112 abs acos acosf asin asinf atan atan2 atan2f atanf atof atoi 1113 bcopy 1114 ceil ceilf copysign copysignf cos cosf 1115 _Exit exp expf 1116 fabs fabsf floor floorf fmod fmodf fopen64 fseeko fseeko64 1117 getenv 1118 _i64toa index itoa 1119 log log10 log10f logf lround lroundf _ltoa 1120 malloc memcmp memcpy memmove memset modf modff 1121 pow powf putenv 1122 rindex round roundf 1123 scalbn scalbnf setenv sin sinf sqr sqrt sqrtf sscanf strchr 1124 strcmp strlcat strlcpy strlen strncmp strnlen strpbrk 1125 strrchr strstr strnstr strtod strtok_r strtol strtoll strtoul strtoull 1126 tan tanf trunc truncf 1127 unsetenv 1128 vsnprintf vsscanf 1129 wcsnlen wcscmp wcsdup wcslcat wcslcpy wcslen wcsncmp wcsstr wcstol 1130 ) 1131 if(WINDOWS) 1132 list(APPEND symbols_to_check 1133 _copysign _fseeki64 _strrev _ui64toa _uitoa _ultoa _wcsdup 1134 ) 1135 else() 1136 list(APPEND symbols_to_check 1137 strcasestr 1138 ) 1139 endif() 1140 check_library_exists(m pow "" HAVE_LIBM) 1141 cmake_push_check_state() 1142 if(HAVE_LIBM) 1143 sdl_link_dependency(math LIBS m) 1144 list(APPEND CMAKE_REQUIRED_LIBRARIES m) 1145 endif() 1146 foreach(_FN IN LISTS symbols_to_check) 1147 string(TOUPPER ${_FN} _UPPER) 1148 set(LIBC_HAS_VAR "LIBC_HAS_${_UPPER}") 1149 check_symbol_exists("${_FN}" "${available_headers}" ${LIBC_HAS_VAR}) 1150 set(HAVE_${_UPPER} ${${LIBC_HAS_VAR}}) 1151 endforeach() 1152 cmake_pop_check_state() 1153 1154 cmake_push_check_state() 1155 if(MSVC) 1156 string(APPEND CMAKE_REQUIRED_FLAGS " -we4244 -WX") # 'conversion' conversion from 'type1' to 'type2', possible loss of data 1157 elseif(HAVE_GCC_WFLOAT_CONVERSION) 1158 string(APPEND CMAKE_REQUIRED_FLAGS " -Wfloat-conversion -Werror") 1159 else() 1160 string(APPEND CMAKE_REQUIRED_FLAGS " -Wconversion -Werror") 1161 endif() 1162 foreach(math_fn isinf isnan) 1163 string(TOUPPER "${math_fn}" MATH_FN) 1164 check_c_source_compiles(" 1165 #include <math.h> 1166 int main() { 1167 double d = 3.14159; 1168 return ${math_fn}(d); 1169 } 1170 " LIBC_HAS_${MATH_FN}) 1171 set(HAVE_${MATH_FN} ${LIBC_HAS_${MATH_FN}}) 1172 1173 check_c_source_compiles(" 1174 #include <math.h> 1175 int main() { 1176 float f = 3.14159f; 1177 return ${math_fn}(f); 1178 } 1179 " LIBC_${MATH_FN}_HANDLES_FLOAT) 1180 set(HAVE_${MATH_FN}_FLOAT_MACRO ${LIBC_${MATH_FN}_HANDLES_FLOAT}) 1181 1182 check_c_source_compiles(" 1183 #include <math.h> 1184 int main() { 1185 float f = 3.14159f; 1186 return ${math_fn}f(f); 1187 } 1188 " LIBC_HAS_${MATH_FN}F) 1189 set(HAVE_${MATH_FN}F "${LIBC_HAS_${MATH_FN}F}") 1190 endforeach() 1191 cmake_pop_check_state() 1192 1193 if(NOT WINDOWS) 1194 check_symbol_exists(fdatasync "unistd.h" HAVE_FDATASYNC) 1195 check_symbol_exists(gethostname "unistd.h" HAVE_GETHOSTNAME) 1196 check_symbol_exists(getpagesize "unistd.h" HAVE_GETPAGESIZE) 1197 check_symbol_exists(getresgid "unistd.h" HAVE_GETRESGID) 1198 check_symbol_exists(getresuid "unistd.h" HAVE_GETRESUID) 1199 check_symbol_exists(sigaction "signal.h" HAVE_SIGACTION) 1200 check_symbol_exists(sigtimedwait "signal.h" HAVE_SIGTIMEDWAIT) 1201 check_symbol_exists(setjmp "setjmp.h" HAVE_SETJMP) 1202 check_symbol_exists(nanosleep "time.h" HAVE_NANOSLEEP) 1203 check_symbol_exists(gmtime_r "time.h" HAVE_GMTIME_R) 1204 check_symbol_exists(localtime_r "time.h" HAVE_LOCALTIME_R) 1205 check_symbol_exists(nl_langinfo "langinfo.h" HAVE_NL_LANGINFO) 1206 check_symbol_exists(sysconf "unistd.h" HAVE_SYSCONF) 1207 check_symbol_exists(sysctlbyname "sys/types.h;sys/sysctl.h" HAVE_SYSCTLBYNAME) 1208 check_symbol_exists(getauxval "sys/auxv.h" HAVE_GETAUXVAL) 1209 check_symbol_exists(elf_aux_info "sys/auxv.h" HAVE_ELF_AUX_INFO) 1210 check_symbol_exists(ppoll "poll.h" HAVE_PPOLL) 1211 check_symbol_exists(memfd_create "sys/mman.h" HAVE_MEMFD_CREATE) 1212 check_symbol_exists(posix_fallocate "fcntl.h" HAVE_POSIX_FALLOCATE) 1213 check_symbol_exists(posix_spawn_file_actions_addchdir "spawn.h" HAVE_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR) 1214 check_symbol_exists(posix_spawn_file_actions_addchdir_np "spawn.h" HAVE_POSIX_SPAWN_FILE_ACTIONS_ADDCHDIR_NP) 1215 endif() 1216 if(SDL_SYSTEM_ICONV) 1217 check_c_source_compiles(" 1218 #define LIBICONV_PLUG 1 /* in case libiconv header is in include path */ 1219 #include <stddef.h> 1220 #include <iconv.h> 1221 int main(int argc, char **argv) { 1222 return !iconv_open(NULL,NULL); 1223 }" ICONV_IN_LIBC) 1224 1225 cmake_push_check_state() 1226 list(APPEND CMAKE_REQUIRED_LIBRARIES iconv) 1227 check_c_source_compiles(" 1228 #include <stddef.h> 1229 #include <iconv.h> 1230 int main(int argc, char **argv) { 1231 return !iconv_open(NULL,NULL); 1232 }" ICONV_IN_LIBICONV) 1233 cmake_pop_check_state() 1234 1235 if(ICONV_IN_LIBC OR ICONV_IN_LIBICONV) 1236 set(HAVE_ICONV 1) 1237 set(HAVE_SYSTEM_ICONV TRUE) 1238 if(ICONV_IN_LIBICONV AND (SDL_LIBICONV OR (NOT ICONV_IN_LIBC))) 1239 sdl_link_dependency(iconv LIBS iconv) 1240 set(SDL_USE_LIBICONV 1) 1241 set(HAVE_LIBICONV TRUE) 1242 endif() 1243 endif() 1244 1245 check_struct_has_member("struct sigaction" "sa_sigaction" "signal.h" HAVE_SA_SIGACTION) 1246 check_struct_has_member("struct stat" "st_mtim" "sys/stat.h" HAVE_ST_MTIM) 1247 endif() 1248else() 1249 set(headers 1250 stdarg.h 1251 stddef.h 1252 stdint.h 1253 ) 1254 foreach(_HEADER ${headers}) 1255 string(TOUPPER "${_HEADER}" HEADER_IDENTIFIER) 1256 string(REGEX REPLACE "[./]" "_" HEADER_IDENTIFIER "${HEADER_IDENTIFIER}") 1257 set(LIBC_HAS_VAR "LIBC_HAS_${HEADER_IDENTIFIER}") 1258 check_include_file("${_HEADER}" "${LIBC_HAS_VAR}") 1259 set(HAVE_${HEADER_IDENTIFIER} ${${LIBC_HAS_VAR}}) 1260 endforeach() 1261 1262 if(MSVC AND USE_CLANG) 1263 check_c_compiler_flag("/Q_no-use-libirc" HAS_Q_NO_USE_LIBIRC) 1264 endif() 1265endif() 1266 1267# General source files 1268sdl_glob_sources( 1269 "${SDL3_SOURCE_DIR}/src/*.c" 1270 "${SDL3_SOURCE_DIR}/src/*.h" 1271 "${SDL3_SOURCE_DIR}/src/atomic/*.c" 1272 "${SDL3_SOURCE_DIR}/src/atomic/*.h" 1273 "${SDL3_SOURCE_DIR}/src/audio/*.c" 1274 "${SDL3_SOURCE_DIR}/src/audio/*.h" 1275 "${SDL3_SOURCE_DIR}/src/camera/*.c" 1276 "${SDL3_SOURCE_DIR}/src/camera/*.h" 1277 "${SDL3_SOURCE_DIR}/src/core/*.c" 1278 "${SDL3_SOURCE_DIR}/src/core/*.h" 1279 "${SDL3_SOURCE_DIR}/src/cpuinfo/*.c" 1280 "${SDL3_SOURCE_DIR}/src/cpuinfo/*.h" 1281 "${SDL3_SOURCE_DIR}/src/dynapi/*.c" 1282 "${SDL3_SOURCE_DIR}/src/dynapi/*.h" 1283 "${SDL3_SOURCE_DIR}/src/events/*.c" 1284 "${SDL3_SOURCE_DIR}/src/events/*.h" 1285 "${SDL3_SOURCE_DIR}/src/io/*.c" 1286 "${SDL3_SOURCE_DIR}/src/io/*.h" 1287 "${SDL3_SOURCE_DIR}/src/io/generic/*.c" 1288 "${SDL3_SOURCE_DIR}/src/io/generic/*.h" 1289 "${SDL3_SOURCE_DIR}/src/filesystem/*.c" 1290 "${SDL3_SOURCE_DIR}/src/filesystem/*.h" 1291 "${SDL3_SOURCE_DIR}/src/gpu/*.c" 1292 "${SDL3_SOURCE_DIR}/src/gpu/*.h" 1293 "${SDL3_SOURCE_DIR}/src/gpu/xr/*.c" 1294 "${SDL3_SOURCE_DIR}/src/gpu/xr/*.h" 1295 "${SDL3_SOURCE_DIR}/src/joystick/*.c" 1296 "${SDL3_SOURCE_DIR}/src/joystick/*.h" 1297 "${SDL3_SOURCE_DIR}/src/haptic/*.c" 1298 "${SDL3_SOURCE_DIR}/src/haptic/*.h" 1299 "${SDL3_SOURCE_DIR}/src/hidapi/*.c" 1300 "${SDL3_SOURCE_DIR}/src/hidapi/*.h" 1301 "${SDL3_SOURCE_DIR}/src/locale/*.c" 1302 "${SDL3_SOURCE_DIR}/src/locale/*.h" 1303 "${SDL3_SOURCE_DIR}/src/main/*.c" 1304 "${SDL3_SOURCE_DIR}/src/main/*.h" 1305 "${SDL3_SOURCE_DIR}/src/misc/*.c" 1306 "${SDL3_SOURCE_DIR}/src/misc/*.h" 1307 "${SDL3_SOURCE_DIR}/src/power/*.c" 1308 "${SDL3_SOURCE_DIR}/src/power/*.h" 1309 "${SDL3_SOURCE_DIR}/src/render/*.c" 1310 "${SDL3_SOURCE_DIR}/src/render/*.h" 1311 "${SDL3_SOURCE_DIR}/src/render/*/*.c" 1312 "${SDL3_SOURCE_DIR}/src/render/*/*.h" 1313 "${SDL3_SOURCE_DIR}/src/sensor/*.c" 1314 "${SDL3_SOURCE_DIR}/src/sensor/*.h" 1315 "${SDL3_SOURCE_DIR}/src/stdlib/*.c" 1316 "${SDL3_SOURCE_DIR}/src/stdlib/*.h" 1317 "${SDL3_SOURCE_DIR}/src/storage/*.c" 1318 "${SDL3_SOURCE_DIR}/src/storage/*.h" 1319 "${SDL3_SOURCE_DIR}/src/thread/*.c" 1320 "${SDL3_SOURCE_DIR}/src/thread/*.h" 1321 "${SDL3_SOURCE_DIR}/src/time/*.c" 1322 "${SDL3_SOURCE_DIR}/src/time/*.h" 1323 "${SDL3_SOURCE_DIR}/src/timer/*.c" 1324 "${SDL3_SOURCE_DIR}/src/timer/*.h" 1325 "${SDL3_SOURCE_DIR}/src/video/*.c" 1326 "${SDL3_SOURCE_DIR}/src/video/*.h" 1327 "${SDL3_SOURCE_DIR}/src/video/yuv2rgb/*.c" 1328 "${SDL3_SOURCE_DIR}/src/video/yuv2rgb/*.h" 1329) 1330 1331file(GLOB SDL_UCLIBC_SOURCES "${SDL3_SOURCE_DIR}/src/libm/*.c") 1332if(TARGET SDL3-shared) 1333 # Build uclibc as a static library such that non-used symbols don't end up in the SDL3 shared library. 1334 add_library(SDL_uclibc STATIC ${SDL_UCLIBC_SOURCES}) 1335 set_property(TARGET SDL_uclibc PROPERTY POSITION_INDEPENDENT_CODE TRUE) 1336 target_compile_definitions(SDL_uclibc PRIVATE USING_GENERATED_CONFIG_H) 1337 target_include_directories(SDL_uclibc PRIVATE "${SDL3_BINARY_DIR}/include-config-$<LOWER_CASE:$<CONFIG>>/build_config") 1338 target_include_directories(SDL_uclibc PRIVATE "${SDL3_SOURCE_DIR}/src") 1339 target_include_directories(SDL_uclibc PRIVATE "${SDL3_SOURCE_DIR}/include") 1340 SDL_AddCommonCompilerFlags(SDL_uclibc) 1341 target_compile_definitions(SDL_uclibc PRIVATE "$<$<CONFIG:Debug>:DEBUG>") 1342 set_property(TARGET SDL_uclibc PROPERTY UNITY_BUILD OFF) 1343 target_link_libraries(SDL3-shared PRIVATE SDL_uclibc) 1344 if(HAVE_GCC_FVISIBILITY) 1345 set_property(TARGET SDL_uclibc PROPERTY C_VISIBILITY_PRESET "hidden") 1346 endif() 1347endif() 1348if(TARGET SDL3-static) 1349 target_sources(SDL3-static PRIVATE ${SDL_UCLIBC_SOURCES}) 1350endif() 1351 1352# Enable/disable various subsystems of the SDL library 1353foreach(_SUB ${SDL_SUBSYSTEMS}) 1354 string(TOUPPER ${_SUB} _OPT) 1355 if(NOT SDL_${_OPT}) 1356 set(SDL_${_OPT}_DISABLED 1) 1357 endif() 1358endforeach() 1359if(SDL_HAPTIC) 1360 if(NOT SDL_JOYSTICK) 1361 # Haptic requires some private functions from the joystick subsystem. 1362 message(FATAL_ERROR "SDL_HAPTIC requires SDL_JOYSTICK, which is not enabled") 1363 endif() 1364endif() 1365 1366 1367# General SDL subsystem options, valid for all platforms 1368if(SDL_AUDIO) 1369 # CheckDummyAudio/CheckDiskAudio - valid for all platforms 1370 if(SDL_DUMMYAUDIO) 1371 set(SDL_AUDIO_DRIVER_DUMMY 1) 1372 sdl_glob_sources( 1373 "${SDL3_SOURCE_DIR}/src/audio/dummy/*.c" 1374 "${SDL3_SOURCE_DIR}/src/audio/dummy/*.h" 1375 ) 1376 set(HAVE_DUMMYAUDIO TRUE) 1377 set(HAVE_SDL_AUDIO TRUE) 1378 endif() 1379 if(SDL_DISKAUDIO) 1380 set(SDL_AUDIO_DRIVER_DISK 1) 1381 sdl_glob_sources( 1382 "${SDL3_SOURCE_DIR}/src/audio/disk/*.c" 1383 "${SDL3_SOURCE_DIR}/src/audio/disk/*.h" 1384 ) 1385 set(HAVE_DISKAUDIO TRUE) 1386 set(HAVE_SDL_AUDIO TRUE) 1387 endif() 1388endif() 1389 1390if(SDL_CAMERA) 1391 # CheckDummyCamera/CheckDiskCamera - valid for all platforms 1392 if(SDL_DUMMYCAMERA) 1393 set(SDL_CAMERA_DRIVER_DUMMY 1) 1394 sdl_glob_sources( 1395 "${SDL3_SOURCE_DIR}/src/camera/dummy/*.c" 1396 "${SDL3_SOURCE_DIR}/src/camera/dummy/*.h" 1397 ) 1398 set(HAVE_DUMMYCAMERA TRUE) 1399 set(HAVE_SDL_CAMERA TRUE) 1400 endif() 1401 # !!! FIXME: for later. 1402 #if(SDL_DISKCAMERA) 1403 # set(SDL_CAMERA_DRIVER_DISK 1) 1404 # sdl_glob_sources("${SDL3_SOURCE_DIR}/src/camera/disk/*.c") 1405 # set(HAVE_DISKCAMERA TRUE) 1406 # set(HAVE_SDL_CAMERA TRUE) 1407 #endif() 1408endif() 1409 1410if(UNIX OR APPLE) 1411 # Relevant for Unix/Darwin only 1412 set(DYNAPI_NEEDS_DLOPEN 1) 1413 CheckDLOPEN() 1414 if(HAVE_DLOPEN) 1415 set(SDL_LOADSO_DLOPEN 1) 1416 sdl_glob_sources( 1417 "${SDL3_SOURCE_DIR}/src/loadso/dlopen/*.c" 1418 "${SDL3_SOURCE_DIR}/src/loadso/dlopen/*.h" 1419 ) 1420 set(HAVE_SDL_LOADSO TRUE) 1421 endif() 1422endif() 1423 1424if(UNIX OR APPLE OR HAIKU OR RISCOS) 1425 CheckO_CLOEXEC() 1426endif() 1427 1428if(SDL_JOYSTICK) 1429 if(SDL_VIRTUAL_JOYSTICK) 1430 set(HAVE_VIRTUAL_JOYSTICK TRUE) 1431 set(SDL_JOYSTICK_VIRTUAL 1) 1432 sdl_glob_sources( 1433 "${SDL3_SOURCE_DIR}/src/joystick/virtual/*.c" 1434 "${SDL3_SOURCE_DIR}/src/joystick/virtual/*.h" 1435 ) 1436 endif() 1437endif() 1438 1439if(SDL_VIDEO) 1440 if(SDL_DUMMYVIDEO) 1441 set(SDL_VIDEO_DRIVER_DUMMY 1) 1442 sdl_glob_sources( 1443 "${SDL3_SOURCE_DIR}/src/video/dummy/*.c" 1444 "${SDL3_SOURCE_DIR}/src/video/dummy/*.h" 1445 ) 1446 set(HAVE_DUMMYVIDEO TRUE) 1447 set(HAVE_SDL_VIDEO TRUE) 1448 endif() 1449endif() 1450 1451# Platform-specific options and settings 1452if(ANDROID) 1453 list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake/android") 1454 1455 sdl_glob_sources( 1456 "${SDL3_SOURCE_DIR}/src/core/android/*.c" 1457 "${SDL3_SOURCE_DIR}/src/core/android/*.h" 1458 ) 1459 1460 sdl_glob_sources( 1461 "${SDL3_SOURCE_DIR}/src/misc/android/*.c" 1462 "${SDL3_SOURCE_DIR}/src/misc/android/*.h" 1463 ) 1464 set(HAVE_SDL_MISC TRUE) 1465 1466 # SDL_spinlock.c Needs to be compiled in ARM mode. 1467 # There seems to be no better way currently to set the ARM mode. 1468 # see: https://issuetracker.google.com/issues/62264618 1469 # Another option would be to set ARM mode to all compiled files 1470 cmake_push_check_state() 1471 string(APPEND CMAKE_REQUIRED_FLAGS " -Werror=unused-command-line-argument") 1472 check_c_compiler_flag(-marm HAVE_ARM_MODE) 1473 cmake_pop_check_state() 1474 if(HAVE_ARM_MODE) 1475 set_property(SOURCE "${SDL3_SOURCE_DIR}/src/atomic/SDL_spinlock.c" APPEND_STRING PROPERTY COMPILE_FLAGS " -marm") 1476 set_source_files_properties(src/atomic/SDL_spinlock.c PROPERTIES SKIP_PRECOMPILE_HEADERS 1) 1477 endif() 1478 1479 if(SDL_AUDIO) 1480 set(SDL_AUDIO_DRIVER_OPENSLES 1) 1481 sdl_glob_sources( 1482 "${SDL3_SOURCE_DIR}/src/audio/openslES/*.c" 1483 "${SDL3_SOURCE_DIR}/src/audio/openslES/*.h" 1484 ) 1485 1486 sdl_link_dependency(opensles LIBS ${ANDROID_DL_LIBRARY} OpenSLES) 1487 1488 set(SDL_AUDIO_DRIVER_AAUDIO 1) 1489 sdl_glob_sources( 1490 "${SDL3_SOURCE_DIR}/src/audio/aaudio/*.c" 1491 "${SDL3_SOURCE_DIR}/src/audio/aaudio/*.h" 1492 ) 1493 1494 set(HAVE_SDL_AUDIO TRUE) 1495 endif() 1496 1497 set(SDL_FILESYSTEM_ANDROID 1) 1498 sdl_glob_sources( 1499 "${SDL3_SOURCE_DIR}/src/filesystem/android/*.c" 1500 "${SDL3_SOURCE_DIR}/src/filesystem/android/*.h" 1501 ) 1502 set(HAVE_SDL_FILESYSTEM TRUE) 1503 1504 set(SDL_FSOPS_POSIX 1) # !!! FIXME: this might need something else for .apk data? 1505 sdl_sources("${SDL3_SOURCE_DIR}/src/filesystem/posix/SDL_sysfsops.c") 1506 set(HAVE_SDL_FSOPS TRUE) 1507 1508 if(SDL_HAPTIC) 1509 set(SDL_HAPTIC_ANDROID 1) 1510 sdl_glob_sources( 1511 "${SDL3_SOURCE_DIR}/src/haptic/android/*.c" 1512 "${SDL3_SOURCE_DIR}/src/haptic/android/*.h" 1513 ) 1514 set(HAVE_SDL_HAPTIC TRUE) 1515 endif() 1516 1517 CheckHIDAPI() 1518 1519 if(SDL_JOYSTICK) 1520 set(SDL_JOYSTICK_ANDROID 1) 1521 sdl_glob_sources( 1522 "${SDL3_SOURCE_DIR}/src/joystick/android/*.c" 1523 "${SDL3_SOURCE_DIR}/src/joystick/android/*.h" 1524 ) 1525 set(HAVE_SDL_JOYSTICK TRUE) 1526 endif() 1527 1528 set(SDL_LOADSO_DLOPEN 1) 1529 sdl_glob_sources( 1530 "${SDL3_SOURCE_DIR}/src/loadso/dlopen/*.c" 1531 "${SDL3_SOURCE_DIR}/src/loadso/dlopen/*.h" 1532 ) 1533 set(HAVE_SDL_LOADSO TRUE) 1534 1535 if(SDL_POWER) 1536 set(SDL_POWER_ANDROID 1) 1537 sdl_glob_sources( 1538 "${SDL3_SOURCE_DIR}/src/power/android/*.c" 1539 "${SDL3_SOURCE_DIR}/src/power/android/*.h" 1540 ) 1541 set(HAVE_SDL_POWER TRUE) 1542 endif() 1543 1544 sdl_glob_sources( 1545 "${SDL3_SOURCE_DIR}/src/locale/android/*.c" 1546 "${SDL3_SOURCE_DIR}/src/locale/android/*.h" 1547 ) 1548 set(HAVE_SDL_LOCALE TRUE) 1549 1550 set(SDL_TIME_UNIX 1) 1551 sdl_glob_sources( 1552 "${SDL3_SOURCE_DIR}/src/time/unix/*.c" 1553 "${SDL3_SOURCE_DIR}/src/time/unix/*.h" 1554 ) 1555 set(HAVE_SDL_TIME TRUE) 1556 1557 set(SDL_TIMER_UNIX 1) 1558 sdl_glob_sources( 1559 "${SDL3_SOURCE_DIR}/src/timer/unix/*.c" 1560 "${SDL3_SOURCE_DIR}/src/timer/unix/*.h" 1561 ) 1562 set(HAVE_SDL_TIMERS TRUE) 1563 1564 if(SDL_SENSOR) 1565 set(SDL_SENSOR_ANDROID 1) 1566 set(HAVE_SDL_SENSORS TRUE) 1567 sdl_glob_sources( 1568 "${SDL3_SOURCE_DIR}/src/sensor/android/*.c" 1569 "${SDL3_SOURCE_DIR}/src/sensor/android/*.h" 1570 ) 1571 endif() 1572 1573 if(SDL_CAMERA) 1574 set(SDL_CAMERA_DRIVER_ANDROID 1) 1575 set(HAVE_CAMERA TRUE) 1576 sdl_glob_sources( 1577 "${SDL3_SOURCE_DIR}/src/camera/android/*.c" 1578 "${SDL3_SOURCE_DIR}/src/camera/android/*.h" 1579 ) 1580 endif() 1581 1582 if(SDL_VIDEO) 1583 set(SDL_VIDEO_DRIVER_ANDROID 1) 1584 sdl_glob_sources( 1585 "${SDL3_SOURCE_DIR}/src/video/android/*.c" 1586 "${SDL3_SOURCE_DIR}/src/video/android/*.h" 1587 ) 1588 set(HAVE_SDL_VIDEO TRUE) 1589 1590 # Core stuff 1591 # find_library(ANDROID_DL_LIBRARY dl) 1592 # FIXME failing dlopen https://github.com/android-ndk/ndk/issues/929 1593 sdl_link_dependency(android_video LIBS dl log android) 1594 sdl_compile_definitions(PRIVATE "GL_GLEXT_PROTOTYPES") 1595 1596 #enable gles 1597 if(SDL_OPENGLES) 1598 set(SDL_VIDEO_OPENGL_EGL 1) 1599 set(HAVE_OPENGLES TRUE) 1600 set(SDL_VIDEO_OPENGL_ES 1) 1601 set(SDL_VIDEO_OPENGL_ES2 1) 1602 set(SDL_VIDEO_RENDER_OGL_ES2 1) 1603 1604 sdl_link_dependency(opengles LIBS GLESv1_CM GLESv2) 1605 endif() 1606 1607 if(SDL_VULKAN) 1608 check_c_source_compiles(" 1609 #if defined(__ARM_ARCH) && __ARM_ARCH < 7 1610 #error Vulkan doesn't work on this configuration 1611 #endif 1612 int main(int argc, char **argv) { return 0; } 1613 " VULKAN_PASSED_ANDROID_CHECKS) 1614 if(VULKAN_PASSED_ANDROID_CHECKS) 1615 set(SDL_VIDEO_VULKAN 1) 1616 set(HAVE_VULKAN TRUE) 1617 if(SDL_RENDER_VULKAN) 1618 set(SDL_VIDEO_RENDER_VULKAN 1) 1619 set(HAVE_RENDER_VULKAN TRUE) 1620 endif() 1621 endif() 1622 endif() 1623 endif() 1624 1625 CheckPTHREAD() 1626 if(SDL_CLOCK_GETTIME) 1627 set(HAVE_CLOCK_GETTIME 1) 1628 endif() 1629 1630 if(SDL_ANDROID_JAR) 1631 find_package(Java) 1632 find_package(SdlAndroidPlatform MODULE) 1633 1634 if(Java_FOUND AND SdlAndroidPlatform_FOUND AND NOT CMAKE_VERSION VERSION_LESS "3.19") 1635 include(UseJava) 1636 set(path_android_jar "${SDL_ANDROID_PLATFORM_ROOT}/android.jar") 1637 set(android_java_sources_root "${SDL3_SOURCE_DIR}/android-project/app/src/main/java") 1638 file(GLOB SDL_JAVA_SOURCES "${android_java_sources_root}/org/libsdl/app/*.java") 1639 set(CMAKE_JAVA_COMPILE_FLAGS "-encoding;utf-8") 1640 add_jar(SDL3-jar 1641 SOURCES ${SDL_JAVA_SOURCES} 1642 INCLUDE_JARS "${path_android_jar}" 1643 OUTPUT_NAME "SDL3" 1644 VERSION "${SDL3_VERSION}" 1645 ) 1646 set_property(TARGET SDL3-jar PROPERTY OUTPUT "${SDL3_BINARY_DIR}/SDL3-${SDL3_VERSION}.jar") 1647 add_library(SDL3__Jar INTERFACE) 1648 add_library(SDL3::Jar ALIAS SDL3__Jar) 1649 get_property(sdl3_jar_location TARGET SDL3-jar PROPERTY JAR_FILE) 1650 set_property(TARGET SDL3__Jar PROPERTY JAR_FILE "${sdl3_jar_location}") 1651 set(javasourcesjar "${SDL3_BINARY_DIR}/SDL3-${SDL3_VERSION}-sources.jar") 1652 string(REGEX REPLACE "${android_java_sources_root}/" "" sdl_relative_java_sources "${SDL_JAVA_SOURCES}") 1653 add_custom_command( 1654 OUTPUT "${javasourcesjar}" 1655 COMMAND ${Java_JAR_EXECUTABLE} cf "${javasourcesjar}" ${sdl_relative_java_sources} 1656 WORKING_DIRECTORY "${android_java_sources_root}" 1657 DEPENDS ${SDL_JAVA_SOURCES} 1658 ) 1659 add_custom_target(SDL3-javasources ALL DEPENDS "${javasourcesjar}") 1660 if(SDL_INSTALL_DOCS) 1661 set(javadocdir "${SDL3_BINARY_DIR}/docs/javadoc") 1662 set(javadocjar "${SDL3_BINARY_DIR}/SDL3-${SDL3_VERSION}-javadoc.jar") 1663 set(javadoc_index_html "${javadocdir}/index.html") 1664 add_custom_command( 1665 OUTPUT "${javadoc_index_html}" 1666 COMMAND ${CMAKE_COMMAND} -E rm -rf "${javadocdir}" "${javadocjar}" 1667 COMMAND ${Java_JAVADOC_EXECUTABLE} -encoding utf8 -d "${javadocdir}" 1668 -classpath "${path_android_jar}" 1669 -author -use -version ${SDL_JAVA_SOURCES} 1670 DEPENDS ${SDL_JAVA_SOURCES} "${path_android_jar}" 1671 ) 1672 add_custom_command( 1673 OUTPUT "${javadocjar}" 1674 COMMAND ${Java_JAR_EXECUTABLE} -c -f "${javadocjar}" 1675 -C "${javadocdir}" * 1676 WORKING_DIRECTORY "${javadocdir}" 1677 DEPENDS ${javadoc_index_html} 1678 ) 1679 add_custom_target(SDL3-javadoc ALL DEPENDS "${javadoc_index_html}" "${javadocjar}") 1680 set_property(TARGET SDL3-javadoc PROPERTY OUTPUT_DIR "${javadocdir}") 1681 endif() 1682 endif() 1683 endif() 1684 if(TARGET SDL3-static) 1685 target_link_options(SDL3-static INTERFACE "-Wl,-u,JNI_OnLoad") 1686 endif() 1687 1688elseif(EMSCRIPTEN) 1689 # Hide noisy warnings that intend to aid mostly during initial stages of porting a new 1690 # project. Uncomment at will for verbose cross-compiling -I/../ path info. 1691 sdl_compile_options(PRIVATE "-Wno-warn-absolute-paths") 1692 1693 if(NOT SDL_EMSCRIPTEN_PERSISTENT_PATH STREQUAL "") 1694 set(SDL_EMSCRIPTEN_PERSISTENT_PATH_STRING "${SDL_EMSCRIPTEN_PERSISTENT_PATH}") 1695 sdl_link_dependency(idbfs LIBS idbfs.js) 1696 endif() 1697 1698 sdl_glob_sources( 1699 "${SDL3_SOURCE_DIR}/src/main/emscripten/*.c" 1700 "${SDL3_SOURCE_DIR}/src/main/emscripten/*.h" 1701 ) 1702 set(HAVE_SDL_MAIN_CALLBACKS TRUE) 1703 1704 sdl_glob_sources( 1705 "${SDL3_SOURCE_DIR}/src/misc/emscripten/*.c" 1706 "${SDL3_SOURCE_DIR}/src/misc/emscripten/*.h" 1707 ) 1708 set(HAVE_SDL_MISC TRUE) 1709 1710 if(SDL_AUDIO) 1711 set(SDL_AUDIO_DRIVER_EMSCRIPTEN 1) 1712 sdl_glob_sources( 1713 "${SDL3_SOURCE_DIR}/src/audio/emscripten/*.c" 1714 "${SDL3_SOURCE_DIR}/src/audio/emscripten/*.h" 1715 ) 1716 set(HAVE_SDL_AUDIO TRUE) 1717 endif() 1718 1719 set(SDL_FILESYSTEM_EMSCRIPTEN 1) 1720 sdl_glob_sources( 1721 "${SDL3_SOURCE_DIR}/src/filesystem/emscripten/*.c" 1722 "${SDL3_SOURCE_DIR}/src/filesystem/emscripten/*.h" 1723 ) 1724 set(HAVE_SDL_FILESYSTEM TRUE) 1725 1726 set(SDL_FSOPS_POSIX 1) 1727 sdl_sources("${SDL3_SOURCE_DIR}/src/filesystem/posix/SDL_sysfsops.c") 1728 set(HAVE_SDL_FSOPS TRUE) 1729 1730 if(SDL_CAMERA) 1731 set(SDL_CAMERA_DRIVER_EMSCRIPTEN 1) 1732 set(HAVE_CAMERA TRUE) 1733 sdl_glob_sources( 1734 "${SDL3_SOURCE_DIR}/src/camera/emscripten/*.c" 1735 "${SDL3_SOURCE_DIR}/src/camera/emscripten/*.h" 1736 ) 1737 endif() 1738 1739 if(SDL_JOYSTICK) 1740 set(SDL_JOYSTICK_EMSCRIPTEN 1) 1741 sdl_glob_sources( 1742 "${SDL3_SOURCE_DIR}/src/joystick/emscripten/*.c" 1743 "${SDL3_SOURCE_DIR}/src/joystick/emscripten/*.h" 1744 ) 1745 set(HAVE_SDL_JOYSTICK TRUE) 1746 endif() 1747 1748 if(SDL_POWER) 1749 set(SDL_POWER_EMSCRIPTEN 1) 1750 sdl_glob_sources( 1751 "${SDL3_SOURCE_DIR}/src/power/emscripten/*.c" 1752 "${SDL3_SOURCE_DIR}/src/power/emscripten/*.h" 1753 ) 1754 set(HAVE_SDL_POWER TRUE) 1755 endif() 1756 1757 sdl_glob_sources( 1758 "${SDL3_SOURCE_DIR}/src/locale/emscripten/*.c" 1759 "${SDL3_SOURCE_DIR}/src/locale/emscripten/*.h" 1760 ) 1761 set(HAVE_SDL_LOCALE TRUE) 1762 1763 set(SDL_TIME_UNIX 1) 1764 sdl_glob_sources( 1765 "${SDL3_SOURCE_DIR}/src/time/unix/*.c" 1766 "${SDL3_SOURCE_DIR}/src/time/unix/*.h" 1767 ) 1768 set(HAVE_SDL_TIME TRUE) 1769 1770 set(SDL_TIMER_UNIX 1) 1771 sdl_glob_sources( 1772 "${SDL3_SOURCE_DIR}/src/timer/unix/*.c" 1773 "${SDL3_SOURCE_DIR}/src/timer/unix/*.h" 1774 ) 1775 set(HAVE_SDL_TIMERS TRUE) 1776 1777 if(SDL_CLOCK_GETTIME) 1778 set(HAVE_CLOCK_GETTIME 1) 1779 endif() 1780 1781 if(SDL_SENSOR) 1782 set(SDL_SENSOR_EMSCRIPTEN 1) 1783 set(HAVE_SDL_SENSORS TRUE) 1784 sdl_glob_sources( 1785 "${SDL3_SOURCE_DIR}/src/sensor/emscripten/*.c" 1786 "${SDL3_SOURCE_DIR}/src/sensor/emscripten/*.h" 1787 ) 1788 endif() 1789 1790 if(SDL_VIDEO) 1791 set(SDL_VIDEO_DRIVER_EMSCRIPTEN 1) 1792 sdl_glob_sources( 1793 "${SDL3_SOURCE_DIR}/src/video/emscripten/*.c" 1794 "${SDL3_SOURCE_DIR}/src/video/emscripten/*.h" 1795 ) 1796 set(HAVE_SDL_VIDEO TRUE) 1797 1798 #enable gles 1799 if(SDL_OPENGLES) 1800 set(HAVE_OPENGLES TRUE) 1801 set(SDL_VIDEO_OPENGL_ES2 1) 1802 set(SDL_VIDEO_RENDER_OGL_ES2 1) 1803 endif() 1804 endif() 1805 1806 CheckPTHREAD() 1807 CheckLibUnwind() 1808 1809elseif(UNIX AND NOT APPLE AND NOT RISCOS AND NOT HAIKU) 1810 1811 set(SDL_DISABLE_DLOPEN_NOTES TRUE) 1812 if(SDL_DLOPEN_NOTES) 1813 set(CHECK_ELF_DLNOTES_SRC [==[ 1814 #ifndef __ELF__ 1815 ELF DL notes is only supported on ELF platforms 1816 #endif 1817 __attribute__ ((used,aligned(4),section(".note.dlopen"))) static const struct { 1818 struct { int a; int b; int c; } hdr; char name[4]; __attribute__((aligned(4))) char json[24]; 1819 } dlnote = { { 4, 0x407c0c0aU, 16 }, "FDO", "[\\"a\\":{\\"a\\":\\"1\\",\\"b\\":\\"2\\"}]" }; 1820 int main(int argc, char *argv[]) { 1821 return argc + dlnote.hdr.a; 1822 } 1823 ]==]) 1824 check_c_source_compiles("${CHECK_ELF_DLNOTES_SRC}" COMPILER_SUPPORTS_ELFNOTES) 1825 if(COMPILER_SUPPORTS_ELFNOTES) 1826 set(SDL_DISABLE_DLOPEN_NOTES FALSE) 1827 set(HAVE_DLOPEN_NOTES TRUE) 1828 endif() 1829 endif() 1830 1831 if(SDL_AUDIO) 1832 if(NETBSD) 1833 set(SDL_AUDIO_DRIVER_NETBSD 1) 1834 sdl_glob_sources( 1835 "${SDL3_SOURCE_DIR}/src/audio/netbsd/*.c" 1836 "${SDL3_SOURCE_DIR}/src/audio/netbsd/*.h" 1837 ) 1838 set(HAVE_SDL_AUDIO TRUE) 1839 elseif(QNX AND (CMAKE_SYSTEM_VERSION VERSION_LESS "8.0.0")) 1840 set(SDL_AUDIO_DRIVER_QNX 1) 1841 sdl_glob_sources( 1842 "${SDL3_SOURCE_DIR}/src/audio/qnx/*.c" 1843 "${SDL3_SOURCE_DIR}/src/audio/qnx/*.h" 1844 ) 1845 sdl_link_dependency(asound LIBS asound) 1846 set(HAVE_SDL_AUDIO TRUE) 1847 endif() 1848 CheckOSS() 1849 CheckALSA() 1850 CheckJACK() 1851 CheckPipewire() 1852 CheckPulseAudio() 1853 CheckSNDIO() 1854 endif() 1855 1856 if(SDL_VIDEO) 1857 # Need to check for Raspberry PI first and add platform specific compiler flags, otherwise the test for GLES fails! 1858 CheckRPI() 1859 # Need to check for ROCKCHIP platform and get rid of "Can't window GBM/EGL surfaces on window creation." 1860 CheckROCKCHIP() 1861 CheckX11() 1862 CheckFribidi() 1863 CheckLibThai() 1864 # Need to check for EGL first because KMSDRM and Wayland depend on it. 1865 CheckEGL() 1866 CheckKMSDRM() 1867 CheckGLX() 1868 CheckOpenGL() 1869 CheckOpenGLES() 1870 CheckWayland() 1871 CheckOpenVR() 1872 CheckVivante() 1873 CheckVulkan() 1874 CheckQNXScreen() 1875 endif() 1876 1877 if(SDL_TRAY) 1878 sdl_glob_sources( 1879 "${SDL3_SOURCE_DIR}/src/tray/unix/*.c" 1880 "${SDL3_SOURCE_DIR}/src/tray/unix/*.h" 1881 ) 1882 set(HAVE_SDL_TRAY TRUE) 1883 endif() 1884 1885 if(UNIX) 1886 sdl_glob_sources( 1887 "${SDL3_SOURCE_DIR}/src/core/unix/*.c" 1888 "${SDL3_SOURCE_DIR}/src/core/unix/*.h" 1889 ) 1890 1891 check_c_source_compiles(" 1892 #include <linux/input.h> 1893 #ifndef EVIOCGNAME 1894 #error EVIOCGNAME() ioctl not available 1895 #endif 1896 int main(int argc, char** argv) { return 0; }" HAVE_LINUX_INPUT_H) 1897 1898 if(LINUX) 1899 check_c_source_compiles(" 1900 #include <linux/kd.h> 1901 #include <linux/keyboard.h> 1902 #include <sys/ioctl.h> 1903 int main(int argc, char **argv) { 1904 struct kbentry kbe; 1905 kbe.kb_table = KG_CTRL; 1906 ioctl(0, KDGKBENT, &kbe); 1907 return 0; 1908 }" HAVE_INPUT_KD) 1909 check_c_source_compiles(" 1910 #include <linux/videodev2.h> 1911 int main(int argc, char** argv) { return 0; }" HAVE_LINUX_VIDEODEV2_H) 1912 elseif(FREEBSD) 1913 check_c_source_compiles(" 1914 #include <sys/kbio.h> 1915 #include <sys/ioctl.h> 1916 int main(int argc, char **argv) { 1917 accentmap_t accTable; 1918 ioctl(0, KDENABIO, 1); 1919 return 0; 1920 }" HAVE_INPUT_KBIO) 1921 elseif(OPENBSD OR NETBSD) 1922 check_c_source_compiles(" 1923 #include <sys/time.h> 1924 #include <dev/wscons/wsconsio.h> 1925 #include <dev/wscons/wsksymdef.h> 1926 #include <dev/wscons/wsksymvar.h> 1927 #include <sys/ioctl.h> 1928 int main(int argc, char **argv) { 1929 struct wskbd_map_data data; 1930 ioctl(0, WSKBDIO_GETMAP, &data); 1931 return 0; 1932 }" HAVE_INPUT_WSCONS) 1933 endif() 1934 1935 if(SDL_CAMERA AND HAVE_LINUX_VIDEODEV2_H) 1936 set(SDL_CAMERA_DRIVER_V4L2 1) 1937 set(HAVE_CAMERA TRUE) 1938 sdl_glob_sources( 1939 "${SDL3_SOURCE_DIR}/src/camera/v4l2/*.c" 1940 "${SDL3_SOURCE_DIR}/src/camera/v4l2/*.h" 1941 ) 1942 endif() 1943 1944 if(HAVE_LINUX_INPUT_H) 1945 set(SDL_INPUT_LINUXEV 1) 1946 endif() 1947 1948 if(SDL_HAPTIC AND HAVE_LINUX_INPUT_H) 1949 set(SDL_HAPTIC_LINUX 1) 1950 sdl_glob_sources( 1951 "${SDL3_SOURCE_DIR}/src/haptic/linux/*.c" 1952 "${SDL3_SOURCE_DIR}/src/haptic/linux/*.h" 1953 ) 1954 set(HAVE_SDL_HAPTIC TRUE) 1955 endif() 1956 1957 if(HAVE_INPUT_KD) 1958 set(SDL_INPUT_LINUXKD 1) 1959 endif() 1960 1961 if(HAVE_INPUT_KBIO) 1962 set(SDL_INPUT_FBSDKBIO 1) 1963 endif() 1964 1965 if(HAVE_INPUT_WSCONS) 1966 set(SDL_INPUT_WSCONS 1) 1967 endif() 1968 1969 CheckLibUDev() 1970 check_include_file("sys/inotify.h" HAVE_SYS_INOTIFY_H) 1971 check_symbol_exists(inotify_init "sys/inotify.h" HAVE_INOTIFY_INIT) 1972 check_symbol_exists(inotify_init1 "sys/inotify.h" HAVE_INOTIFY_INIT1) 1973 1974 if(HAVE_SYS_INOTIFY_H AND HAVE_INOTIFY_INIT) 1975 set(HAVE_INOTIFY 1) 1976 endif() 1977 1978 if(PKG_CONFIG_FOUND) 1979 if(SDL_DBUS) 1980 pkg_search_module(DBUS dbus-1 dbus) 1981 if(DBUS_FOUND) 1982 set(HAVE_DBUS_DBUS_H TRUE) 1983 sdl_include_directories(PRIVATE SYSTEM ${DBUS_INCLUDE_DIRS}) 1984 # Fcitx need only dbus. 1985 set(HAVE_FCITX TRUE) 1986 set(HAVE_DBUS TRUE) 1987 endif() 1988 endif() 1989 1990 if(SDL_IBUS) 1991 pkg_search_module(IBUS ibus-1.0 ibus) 1992 find_path(HAVE_SYS_INOTIFY_H NAMES sys/inotify.h) 1993 if(IBUS_FOUND AND HAVE_SYS_INOTIFY_H) 1994 set(HAVE_IBUS_IBUS_H TRUE) 1995 sdl_include_directories(PRIVATE SYSTEM ${IBUS_INCLUDE_DIRS}) 1996 set(HAVE_IBUS TRUE) 1997 endif() 1998 endif() 1999 2000 if (HAVE_IBUS_IBUS_H OR HAVE_FCITX) 2001 set(SDL_USE_IME 1) 2002 endif() 2003 2004 if(SDL_LIBURING) 2005 pkg_search_module(LIBURING liburing-ffi) 2006 find_path(HAVE_LIBURING_H NAMES liburing.h) 2007 if(LIBURING_FOUND AND HAVE_LIBURING_H) 2008 set(HAVE_LIBURING_LIBURING_H TRUE) 2009 sdl_include_directories(PRIVATE SYSTEM ${LIBURING_INCLUDE_DIRS}) 2010 set(HAVE_LIBURING TRUE) 2011 endif() 2012 endif() 2013 if((FREEBSD OR NETBSD) AND NOT HAVE_INOTIFY) 2014 set(LibInotify_PKG_CONFIG_SPEC libinotify) 2015 pkg_check_modules(PC_LIBINOTIFY IMPORTED_TARGET ${LibInotify_PKG_CONFIG_SPEC}) 2016 if(PC_LIBINOTIFY_FOUND) 2017 set(HAVE_INOTIFY 1) 2018 sdl_link_dependency(libinotify LIBS PkgConfig::PC_LIBINOTIFY PKG_CONFIG_PREFIX PC_LIBINOTIFY PKG_CONFIG_SPECS ${LibInotify_PKG_CONFIG_SPEC}) 2019 endif() 2020 endif() 2021 2022 CheckLibUnwind() 2023 endif() 2024 2025 if(HAVE_DBUS_DBUS_H) 2026 sdl_sources( 2027 "${SDL3_SOURCE_DIR}/src/core/linux/SDL_dbus.c" 2028 "${SDL3_SOURCE_DIR}/src/core/linux/SDL_dbus.h" 2029 "${SDL3_SOURCE_DIR}/src/core/linux/SDL_system_theme.c" 2030 "${SDL3_SOURCE_DIR}/src/core/linux/SDL_system_theme.h" 2031 "${SDL3_SOURCE_DIR}/src/core/linux/SDL_progressbar.c" 2032 "${SDL3_SOURCE_DIR}/src/core/linux/SDL_progressbar.h" 2033 ) 2034 endif() 2035 2036 if(SDL_USE_IME) 2037 sdl_sources( 2038 "${SDL3_SOURCE_DIR}/src/core/linux/SDL_ime.c" 2039 "${SDL3_SOURCE_DIR}/src/core/linux/SDL_ime.h" 2040 ) 2041 endif() 2042 2043 if(HAVE_IBUS_IBUS_H) 2044 sdl_sources( 2045 "${SDL3_SOURCE_DIR}/src/core/linux/SDL_ibus.c" 2046 "${SDL3_SOURCE_DIR}/src/core/linux/SDL_ibus.h" 2047 ) 2048 endif() 2049 2050 if(HAVE_FCITX) 2051 sdl_sources( 2052 "${SDL3_SOURCE_DIR}/src/core/linux/SDL_fcitx.c" 2053 "${SDL3_SOURCE_DIR}/src/core/linux/SDL_fcitx.h" 2054 ) 2055 endif() 2056 2057 if(HAVE_LIBUDEV_H) 2058 sdl_sources( 2059 "${SDL3_SOURCE_DIR}/src/core/linux/SDL_udev.c" 2060 "${SDL3_SOURCE_DIR}/src/core/linux/SDL_udev.h" 2061 ) 2062 endif() 2063 2064 if(HAVE_LINUX_INPUT_H) 2065 sdl_sources( 2066 "${SDL3_SOURCE_DIR}/src/core/linux/SDL_evdev.c" 2067 "${SDL3_SOURCE_DIR}/src/core/linux/SDL_evdev_kbd.c" 2068 ) 2069 endif() 2070 2071 if(HAVE_INPUT_KBIO) 2072 sdl_sources( 2073 "${SDL3_SOURCE_DIR}/src/core/freebsd/SDL_evdev_kbd_freebsd.c" 2074 "${SDL3_SOURCE_DIR}/src/core/freebsd/SDL_evdev_kbd_default_keyaccmap.h" 2075 ) 2076 endif() 2077 2078 if(HAVE_INPUT_WSCONS) 2079 sdl_sources( 2080 "${SDL3_SOURCE_DIR}/src/core/openbsd/SDL_wscons_kbd.c" 2081 "${SDL3_SOURCE_DIR}/src/core/openbsd/SDL_wscons_mouse.c" 2082 "${SDL3_SOURCE_DIR}/src/core/openbsd/SDL_wscons.h" 2083 ) 2084 endif() 2085 2086 if(HAVE_LIBURING_H) 2087 sdl_sources("${SDL3_SOURCE_DIR}/src/io/io_uring/SDL_asyncio_liburing.c") 2088 endif() 2089 2090 # Always compiled for Linux, unconditionally: 2091 sdl_sources( 2092 "${SDL3_SOURCE_DIR}/src/core/linux/SDL_evdev_capabilities.c" 2093 "${SDL3_SOURCE_DIR}/src/core/linux/SDL_evdev_capabilities.h" 2094 "${SDL3_SOURCE_DIR}/src/core/linux/SDL_threadprio.c" 2095 ) 2096 2097 # src/core/unix/*.c is included in a generic if(UNIX) section, elsewhere. 2098 endif() 2099 2100 if(SDL_HIDAPI) 2101 CheckHIDAPI() 2102 endif() 2103 2104 if(SDL_JOYSTICK) 2105 if(FREEBSD OR NETBSD OR OPENBSD OR BSDI) 2106 CheckUSBHID() 2107 endif() 2108 if((LINUX OR FREEBSD) AND HAVE_LINUX_INPUT_H AND NOT ANDROID) 2109 set(SDL_JOYSTICK_LINUX 1) 2110 sdl_glob_sources( 2111 "${SDL3_SOURCE_DIR}/src/joystick/linux/*.c" 2112 "${SDL3_SOURCE_DIR}/src/joystick/linux/*.h" 2113 ) 2114 set(HAVE_SDL_JOYSTICK TRUE) 2115 endif() 2116 endif() 2117 2118 CheckPTHREAD() 2119 2120 if(SDL_CLOCK_GETTIME) 2121 check_library_exists(c clock_gettime "" FOUND_CLOCK_GETTIME_LIBC) 2122 if(FOUND_CLOCK_GETTIME_LIBC) 2123 set(HAVE_CLOCK_GETTIME 1) 2124 else() 2125 check_library_exists(rt clock_gettime "" FOUND_CLOCK_GETTIME_LIBRT) 2126 if(FOUND_CLOCK_GETTIME_LIBRT) 2127 set(HAVE_CLOCK_GETTIME 1) 2128 sdl_link_dependency(clock LIBS rt) 2129 endif() 2130 endif() 2131 endif() 2132 2133 sdl_glob_sources("${SDL3_SOURCE_DIR}/src/misc/unix/*.c") 2134 set(HAVE_SDL_MISC TRUE) 2135 2136 if(SDL_POWER) 2137 if(LINUX) 2138 set(SDL_POWER_LINUX 1) 2139 sdl_glob_sources("${SDL3_SOURCE_DIR}/src/power/linux/*.c") 2140 set(HAVE_SDL_POWER TRUE) 2141 endif() 2142 endif() 2143 2144 sdl_glob_sources("${SDL3_SOURCE_DIR}/src/locale/unix/*.c") 2145 set(HAVE_SDL_LOCALE TRUE) 2146 2147 set(SDL_FILESYSTEM_UNIX 1) 2148 sdl_glob_sources("${SDL3_SOURCE_DIR}/src/filesystem/unix/*.c") 2149 set(HAVE_SDL_FILESYSTEM TRUE) 2150 2151 set(SDL_STORAGE_GENERIC 1) 2152 sdl_glob_sources("${SDL3_SOURCE_DIR}/src/storage/generic/*.c") 2153 if(LINUX) 2154 set(SDL_STORAGE_STEAM 1) 2155 sdl_glob_sources( 2156 "${SDL3_SOURCE_DIR}/src/storage/steam/*.c" 2157 "${SDL3_SOURCE_DIR}/src/storage/steam/*.h" 2158 ) 2159 endif() 2160 set(HAVE_SDL_STORAGE 1) 2161 2162 set(SDL_FSOPS_POSIX 1) 2163 sdl_sources("${SDL3_SOURCE_DIR}/src/filesystem/posix/SDL_sysfsops.c") 2164 set(HAVE_SDL_FSOPS TRUE) 2165 2166 set(SDL_TIME_UNIX 1) 2167 sdl_glob_sources("${SDL3_SOURCE_DIR}/src/time/unix/*.c") 2168 set(HAVE_SDL_TIME TRUE) 2169 2170 set(SDL_TIMER_UNIX 1) 2171 sdl_glob_sources("${SDL3_SOURCE_DIR}/src/timer/unix/*.c") 2172 set(HAVE_SDL_TIMERS TRUE) 2173 2174 set(SDL_RLD_FLAGS "") 2175 if(SDL_RPATH AND SDL_SHARED) 2176 if(BSDI OR FREEBSD OR LINUX OR NETBSD) 2177 cmake_push_check_state() 2178 string(APPEND CMAKE_REQUIRED_FLAGS " -Wl,--enable-new-dtags") 2179 check_c_compiler_flag("" HAVE_ENABLE_NEW_DTAGS) 2180 cmake_pop_check_state() 2181 if(HAVE_ENABLE_NEW_DTAGS) 2182 set(SDL_RLD_FLAGS "-Wl,-rpath,\${libdir} -Wl,--enable-new-dtags") 2183 else() 2184 set(SDL_RLD_FLAGS "-Wl,-rpath,\${libdir}") 2185 endif() 2186 set(HAVE_RPATH TRUE) 2187 elseif(SOLARIS) 2188 set(SDL_RLD_FLAGS "-R\${libdir}") 2189 set(HAVE_RPATH TRUE) 2190 endif() 2191 endif() 2192 2193 if(QNX) 2194 # QNX's *printf() family generates a SIGSEGV if NULL is passed for a string 2195 # specifier (on purpose), but SDL expects "(null)". Use the built-in 2196 # implementation. 2197 set (HAVE_VSNPRINTF 0) 2198 set (USE_POSIX_SPAWN 1) 2199 endif() 2200elseif(WINDOWS) 2201 enable_language(CXX) 2202 check_c_source_compiles(" 2203 #include <windows.h> 2204 int main(int argc, char **argv) { return 0; }" HAVE_WIN32_CC) 2205 2206 sdl_glob_sources( 2207 "${SDL3_SOURCE_DIR}/src/core/windows/*.c" 2208 "${SDL3_SOURCE_DIR}/src/core/windows/*.cpp" 2209 "${SDL3_SOURCE_DIR}/src/core/windows/*.h" 2210 ) 2211 sdl_glob_sources("${SDL3_SOURCE_DIR}/src/main/windows/*.c") 2212 sdl_glob_sources("${SDL3_SOURCE_DIR}/src/io/windows/*.c") 2213 2214 if(TARGET SDL3-shared AND MSVC AND NOT SDL_LIBC) 2215 # Prevent codegen that would use the VC runtime libraries. 2216 target_compile_options(SDL3-shared PRIVATE $<$<COMPILE_LANGUAGE:C,CXX>:/GS-> $<$<COMPILE_LANGUAGE:C,CXX>:/Gs1048576>) 2217 target_compile_options(SDL_uclibc PRIVATE $<$<COMPILE_LANGUAGE:C,CXX>:/GS-> $<$<COMPILE_LANGUAGE:C,CXX>:/Gs1048576>) 2218 if(SDL_CPU_X86) 2219 target_compile_options(SDL3-shared PRIVATE "/arch:SSE") 2220 target_compile_options(SDL_uclibc PRIVATE "/arch:SSE") 2221 endif() 2222 endif() 2223 2224 sdl_glob_sources("${SDL3_SOURCE_DIR}/src/misc/windows/*.c") 2225 2226 set(HAVE_SDL_MISC TRUE) 2227 2228 # Check for DirectX 2229 if(SDL_DIRECTX) 2230 cmake_push_check_state() 2231 if(DEFINED MSVC_VERSION AND NOT ${MSVC_VERSION} LESS 1700) 2232 set(USE_WINSDK_DIRECTX TRUE) 2233 endif() 2234 if(NOT MINGW AND NOT USE_WINSDK_DIRECTX) 2235 if("$ENV{DXSDK_DIR}" STREQUAL "") 2236 message(FATAL_ERROR "DIRECTX requires the \$DXSDK_DIR environment variable to be set") 2237 endif() 2238 string(APPEND CMAKE_REQUIRED_FLAGS " /I\"$ENV{DXSDK_DIR}\\Include\"") 2239 endif() 2240 2241 check_include_file(d3d9.h HAVE_D3D9_H) 2242 check_include_file(d3d11_1.h HAVE_D3D11_H) 2243 check_include_file(ddraw.h HAVE_DDRAW_H) 2244 check_include_file(dsound.h HAVE_DSOUND_H) 2245 check_include_file(dinput.h HAVE_DINPUT_H) 2246 if(SDL_CPU_ARM32) # !!! FIXME: this should probably check if we're !(x86 or x86-64) instead of arm. 2247 set(HAVE_DINPUT_H 0) 2248 endif() 2249 check_include_file(dxgi.h HAVE_DXGI_H) 2250 cmake_pop_check_state() 2251 if(HAVE_D3D9_H OR HAVE_D3D11_H OR HAVE_DDRAW_H OR HAVE_DSOUND_H OR HAVE_DINPUT_H) 2252 set(HAVE_DIRECTX TRUE) 2253 if(NOT MINGW AND NOT USE_WINSDK_DIRECTX) 2254 if(CMAKE_SIZEOF_VOID_P EQUAL 8) 2255 set(PROCESSOR_ARCH "x64") 2256 else() 2257 set(PROCESSOR_ARCH "x86") 2258 endif() 2259 sdl_link_directories("$<BUILD_INTERFACE:$ENV{DXSDK_DIR}\\lib\\${PROCESSOR_ARCH}>") 2260 sdl_include_directories(PRIVATE SYSTEM "$<BUILD_INTERFACE:$ENV{DXSDK_DIR}\\Include>") 2261 endif() 2262 endif() 2263 endif() 2264 2265 if(SDL_XINPUT) 2266 # xinput.h may need windows.h, but does not include it itself. 2267 check_c_source_compiles(" 2268 #include <windows.h> 2269 #include <xinput.h> 2270 int main(int argc, char **argv) { return 0; }" HAVE_XINPUT_H 2271 ) 2272 endif() 2273 2274 # headers needed elsewhere 2275 check_c_source_compiles(" 2276 #define COBJMACROS 2277 #include <windows.gaming.input.h> 2278 static __x_ABI_CWindows_CGaming_CInput_CIGamepadStatics2 *s2; 2279 int main(int argc, char **argv) { return 0; }" HAVE_WINDOWS_GAMING_INPUT_H 2280 ) 2281 check_c_source_compiles(" 2282 #include <stdbool.h> 2283 #define COBJMACROS 2284 #include <gameinput.h> 2285 int main(int argc, char **argv) { return 0; }" HAVE_GAMEINPUT_H 2286 ) 2287 check_include_file(dxgi1_5.h HAVE_DXGI1_5_H) 2288 check_include_file(dxgi1_6.h HAVE_DXGI1_6_H) 2289 check_include_file(tpcshrd.h HAVE_TPCSHRD_H) 2290 check_include_file(roapi.h HAVE_ROAPI_H) 2291 check_include_file(mmdeviceapi.h HAVE_MMDEVICEAPI_H) 2292 check_include_file(audioclient.h HAVE_AUDIOCLIENT_H) 2293 check_include_file(sensorsapi.h HAVE_SENSORSAPI_H) 2294 check_include_file(shellscalingapi.h HAVE_SHELLSCALINGAPI_H) 2295 check_c_source_compiles(" 2296 #include <windows.h> 2297 #include <mfapi.h> 2298 #include <mfidl.h> 2299 #include <mfreadwrite.h> 2300 static MFVideoPrimaries primaries = MFVideoPrimaries_DCI_P3; 2301 int main(int argc, char **argv) { return 0; } 2302 " HAVE_MFAPI_H 2303 ) 2304 2305 if(SDL_AUDIO) 2306 if(HAVE_DSOUND_H) 2307 set(SDL_AUDIO_DRIVER_DSOUND 1) 2308 sdl_glob_sources( 2309 "${SDL3_SOURCE_DIR}/src/audio/directsound/*.c" 2310 "${SDL3_SOURCE_DIR}/src/audio/directsound/*.h" 2311 ) 2312 set(HAVE_SDL_AUDIO TRUE) 2313 endif() 2314 2315 if(SDL_WASAPI AND HAVE_AUDIOCLIENT_H AND HAVE_MMDEVICEAPI_H) 2316 set(SDL_AUDIO_DRIVER_WASAPI 1) 2317 set(HAVE_WASAPI TRUE) 2318 sdl_glob_sources( 2319 "${SDL3_SOURCE_DIR}/src/audio/wasapi/*.c" 2320 "${SDL3_SOURCE_DIR}/src/audio/wasapi/*.h" 2321 ) 2322 set(HAVE_SDL_AUDIO TRUE) 2323 endif() 2324 endif() 2325 2326 if(SDL_VIDEO) 2327 set(SDL_VIDEO_DRIVER_WINDOWS 1) 2328 sdl_glob_sources( 2329 "${SDL3_SOURCE_DIR}/src/video/windows/*.c" 2330 "${SDL3_SOURCE_DIR}/src/video/windows/*.cpp" 2331 "${SDL3_SOURCE_DIR}/src/video/windows/*.h" 2332 ) 2333 2334 CheckOpenVR() 2335 2336 if(SDL_RENDER_D3D AND HAVE_D3D9_H) 2337 set(SDL_VIDEO_RENDER_D3D 1) 2338 set(HAVE_RENDER_D3D TRUE) 2339 endif() 2340 if(SDL_RENDER_D3D11 AND HAVE_D3D11_H) 2341 set(SDL_VIDEO_RENDER_D3D11 1) 2342 set(HAVE_RENDER_D3D11 TRUE) 2343 endif() 2344 if(SDL_RENDER_D3D12 AND HAVE_DXGI1_6_H) 2345 set(SDL_VIDEO_RENDER_D3D12 1) 2346 set(HAVE_RENDER_D3D12 TRUE) 2347 endif() 2348 set(HAVE_SDL_VIDEO TRUE) 2349 endif() 2350 2351 set(SDL_THREAD_GENERIC_COND_SUFFIX 1) 2352 set(SDL_THREAD_GENERIC_RWLOCK_SUFFIX 1) 2353 set(SDL_THREAD_WINDOWS 1) 2354 sdl_sources( 2355 "${SDL3_SOURCE_DIR}/src/thread/generic/SDL_syscond.c" 2356 "${SDL3_SOURCE_DIR}/src/thread/generic/SDL_syscond_c.h" 2357 "${SDL3_SOURCE_DIR}/src/thread/generic/SDL_sysrwlock.c" 2358 "${SDL3_SOURCE_DIR}/src/thread/generic/SDL_sysrwlock_c.h" 2359 "${SDL3_SOURCE_DIR}/src/thread/windows/SDL_syscond_cv.c" 2360 "${SDL3_SOURCE_DIR}/src/thread/windows/SDL_sysmutex.c" 2361 "${SDL3_SOURCE_DIR}/src/thread/windows/SDL_sysrwlock_srw.c" 2362 "${SDL3_SOURCE_DIR}/src/thread/windows/SDL_syssem.c" 2363 "${SDL3_SOURCE_DIR}/src/thread/windows/SDL_systhread.c" 2364 "${SDL3_SOURCE_DIR}/src/thread/windows/SDL_systls.c" 2365 ) 2366 2367 set(HAVE_SDL_THREADS TRUE) 2368 2369 if(SDL_SENSOR AND HAVE_SENSORSAPI_H) 2370 set(SDL_SENSOR_WINDOWS 1) 2371 set(HAVE_SDL_SENSORS TRUE) 2372 sdl_glob_sources( 2373 "${SDL3_SOURCE_DIR}/src/sensor/windows/*.c" 2374 "${SDL3_SOURCE_DIR}/src/sensor/windows/*.h" 2375 ) 2376 endif() 2377 2378 if(SDL_POWER) 2379 set(SDL_POWER_WINDOWS 1) 2380 sdl_sources("${SDL3_SOURCE_DIR}/src/power/windows/SDL_syspower.c") 2381 set(HAVE_SDL_POWER TRUE) 2382 endif() 2383 2384 sdl_glob_sources("${SDL3_SOURCE_DIR}/src/locale/windows/*.c") 2385 set(HAVE_SDL_LOCALE TRUE) 2386 2387 set(SDL_FILESYSTEM_WINDOWS 1) 2388 sdl_glob_sources("${SDL3_SOURCE_DIR}/src/filesystem/windows/*.c") 2389 set(HAVE_SDL_FILESYSTEM TRUE) 2390 2391 set(SDL_FSOPS_WINDOWS 1) 2392 set(HAVE_SDL_FSOPS TRUE) 2393 2394 set(SDL_STORAGE_GENERIC 1) 2395 sdl_glob_sources("${SDL3_SOURCE_DIR}/src/storage/generic/*.c") 2396 set(SDL_STORAGE_STEAM 1) 2397 sdl_glob_sources( 2398 "${SDL3_SOURCE_DIR}/src/storage/steam/*.c" 2399 "${SDL3_SOURCE_DIR}/src/storage/steam/*.h" 2400 ) 2401 set(HAVE_SDL_STORAGE 1) 2402 2403 # Libraries for Win32 native and MinGW 2404 sdl_link_dependency(base LIBS kernel32 user32 gdi32 winmm imm32 ole32 oleaut32 version uuid advapi32 setupapi shell32 hid) 2405 2406 set(SDL_TIME_WINDOWS 1) 2407 sdl_glob_sources("${SDL3_SOURCE_DIR}/src/time/windows/*.c") 2408 set(HAVE_SDL_TIME TRUE) 2409 2410 set(SDL_TIMER_WINDOWS 1) 2411 sdl_glob_sources("${SDL3_SOURCE_DIR}/src/timer/windows/*.c") 2412 set(HAVE_SDL_TIMERS TRUE) 2413 2414 set(SDL_LOADSO_WINDOWS 1) 2415 sdl_glob_sources("${SDL3_SOURCE_DIR}/src/loadso/windows/*.c") 2416 set(HAVE_SDL_LOADSO TRUE) 2417 2418 sdl_glob_sources( 2419 "${SDL3_SOURCE_DIR}/src/core/windows/*.c" 2420 "${SDL3_SOURCE_DIR}/src/core/windows/*.h" 2421 ) 2422 2423 if(SDL_VIDEO) 2424 if(SDL_OPENGL) 2425 set(SDL_VIDEO_OPENGL 1) 2426 set(SDL_VIDEO_OPENGL_WGL 1) 2427 set(SDL_VIDEO_RENDER_OGL 1) 2428 set(HAVE_OPENGL TRUE) 2429 endif() 2430 2431 if(SDL_OPENGLES) 2432 set(SDL_VIDEO_OPENGL_EGL 1) 2433 set(SDL_VIDEO_OPENGL_ES2 1) 2434 set(SDL_VIDEO_RENDER_OGL_ES2 1) 2435 set(HAVE_OPENGLES TRUE) 2436 endif() 2437 2438 if(SDL_VULKAN) 2439 set(SDL_VIDEO_VULKAN 1) 2440 set(HAVE_VULKAN TRUE) 2441 if(SDL_RENDER_VULKAN) 2442 set(SDL_VIDEO_RENDER_VULKAN 1) 2443 set(HAVE_RENDER_VULKAN TRUE) 2444 endif() 2445 endif() 2446 endif() 2447 2448 if(SDL_TRAY) 2449 sdl_glob_sources("${SDL3_SOURCE_DIR}/src/tray/windows/*.c") 2450 set(HAVE_SDL_TRAY TRUE) 2451 endif() 2452 2453 if(SDL_HIDAPI) 2454 CheckHIDAPI() 2455 endif() 2456 2457 if(SDL_JOYSTICK) 2458 sdl_glob_sources( 2459 "${SDL3_SOURCE_DIR}/src/joystick/windows/*.c" 2460 "${SDL3_SOURCE_DIR}/src/joystick/windows/*.h" 2461 ) 2462 2463 set(SDL_JOYSTICK_RAWINPUT 1) 2464 if(HAVE_DINPUT_H) 2465 set(SDL_JOYSTICK_DINPUT 1) 2466 sdl_link_dependency(joystick LIBS dinput8) 2467 endif() 2468 if(HAVE_XINPUT_H) 2469 set(SDL_JOYSTICK_XINPUT 1) 2470 set(HAVE_XINPUT TRUE) 2471 endif() 2472 if(HAVE_WINDOWS_GAMING_INPUT_H) 2473 set(SDL_JOYSTICK_WGI 1) 2474 endif() 2475 if(HAVE_GAMEINPUT_H) 2476 sdl_glob_sources("${SDL3_SOURCE_DIR}/src/joystick/gdk/*.cpp") 2477 set(SDL_JOYSTICK_GAMEINPUT 1) 2478 endif() 2479 set(HAVE_SDL_JOYSTICK TRUE) 2480 2481 if(SDL_HAPTIC) 2482 if(HAVE_DINPUT_H) 2483 sdl_glob_sources( 2484 "${SDL3_SOURCE_DIR}/src/haptic/windows/*.c" 2485 "${SDL3_SOURCE_DIR}/src/haptic/windows/*.h" 2486 ) 2487 set(SDL_HAPTIC_DINPUT 1) 2488 set(HAVE_SDL_HAPTIC TRUE) 2489 endif() 2490 endif() 2491 endif() 2492 2493 if(SDL_CAMERA) 2494 if(HAVE_MFAPI_H) 2495 set(HAVE_CAMERA TRUE) 2496 set(SDL_CAMERA_DRIVER_MEDIAFOUNDATION 1) 2497 sdl_glob_sources("${SDL3_SOURCE_DIR}/src/camera/mediafoundation/*.c") 2498 endif() 2499 endif() 2500 2501 enable_language(RC) 2502 sdl_glob_sources(SHARED "${SDL3_SOURCE_DIR}/src/core/windows/*.rc") 2503 if(MINGW OR CYGWIN) 2504 sdl_pc_link_options("-mwindows") 2505 endif() 2506 2507elseif(APPLE) 2508 # TODO: rework this all for proper macOS, iOS and Darwin support 2509 2510 # !!! FIXME: all the `if(IOS OR TVOS OR VISIONOS)` checks should get merged into one variable, so we're ready for the next platform (or just WatchOS). 2511 2512 # We always need these libs on macOS at the moment. 2513 # !!! FIXME: we need Carbon for some very old API calls in 2514 # !!! FIXME: src/video/cocoa/SDL_cocoakeyboard.c, but we should figure out 2515 # !!! FIXME: how to dump those. 2516 if(MACOS) 2517 set(SDL_FRAMEWORK_COCOA 1) 2518 set(SDL_FRAMEWORK_CARBON 1) 2519 set(SDL_FRAMEWORK_UTTYPES 1) 2520 endif() 2521 set(SDL_FRAMEWORK_FOUNDATION 1) 2522 set(SDL_FRAMEWORK_COREVIDEO 1) 2523 2524 # iOS can use a CADisplayLink for main callbacks. macOS just uses the generic one atm. 2525 if(IOS OR TVOS OR VISIONOS OR WATCHOS) 2526 sdl_glob_sources("${SDL3_SOURCE_DIR}/src/main/ios/*.m") 2527 set(HAVE_SDL_MAIN_CALLBACKS TRUE) 2528 endif() 2529 2530 if(SDL_CAMERA) 2531 if(MACOS OR IOS) 2532 set(SDL_CAMERA_DRIVER_COREMEDIA 1) 2533 set(HAVE_CAMERA TRUE) 2534 sdl_glob_sources("${SDL3_SOURCE_DIR}/src/camera/coremedia/*.m") 2535 set(SDL_FRAMEWORK_AVFOUNDATION 1) 2536 endif() 2537 endif() 2538 2539 if(IOS OR TVOS OR VISIONOS OR WATCHOS) 2540 sdl_glob_sources("${SDL3_SOURCE_DIR}/src/misc/ios/*.m") 2541 else() 2542 sdl_glob_sources("${SDL3_SOURCE_DIR}/src/misc/macos/*.m") 2543 endif() 2544 set(HAVE_SDL_MISC TRUE) 2545 2546 if(SDL_AUDIO) 2547 set(SDL_AUDIO_DRIVER_COREAUDIO 1) 2548 sdl_glob_sources( 2549 "${SDL3_SOURCE_DIR}/src/audio/coreaudio/*.m" 2550 "${SDL3_SOURCE_DIR}/src/audio/coreaudio/*.h" 2551 ) 2552 set(HAVE_SDL_AUDIO TRUE) 2553 set(SDL_FRAMEWORK_COREAUDIO 1) 2554 set(SDL_FRAMEWORK_AUDIOTOOLBOX 1) 2555 set(SDL_FRAMEWORK_AVFOUNDATION 1) 2556 endif() 2557 2558 if(SDL_HIDAPI) 2559 CheckHIDAPI() 2560 endif() 2561 2562 if(SDL_JOYSTICK) 2563 sdl_glob_sources( 2564 "${SDL3_SOURCE_DIR}/src/joystick/apple/*.m" 2565 "${SDL3_SOURCE_DIR}/src/joystick/apple/*.h" 2566 ) 2567 if(IOS OR TVOS OR VISIONOS OR WATCHOS) 2568 set(SDL_JOYSTICK_MFI 1) 2569 if(IOS OR VISIONOS OR WATCHOS) 2570 set(SDL_FRAMEWORK_COREMOTION 1) 2571 endif() 2572 set(SDL_FRAMEWORK_GAMECONTROLLER 1) 2573 set(SDL_FRAMEWORK_COREHAPTICS 1) 2574 else() 2575 sdl_glob_sources( 2576 "${SDL3_SOURCE_DIR}/src/joystick/darwin/*.c" 2577 "${SDL3_SOURCE_DIR}/src/joystick/darwin/*.h" 2578 ) 2579 set_property(SOURCE ${MFI_JOYSTICK_SOURCES} APPEND_STRING PROPERTY COMPILE_FLAGS " -fobjc-weak") 2580 check_objc_source_compiles(" 2581 #include <AvailabilityMacros.h> 2582 #include <TargetConditionals.h> 2583 #import <Foundation/Foundation.h> 2584 #import <GameController/GameController.h> 2585 #if MAC_OS_X_VERSION_MIN_REQUIRED < 1080 2586 #error GameController framework doesn't work on this configuration 2587 #endif 2588 #if TARGET_CPU_X86 2589 #error GameController framework doesn't work on this configuration 2590 #endif 2591 int main() { return 0; }" HAVE_FRAMEWORK_GAMECONTROLLER) 2592 check_objc_source_compiles(" 2593 #include <AvailabilityMacros.h> 2594 #include <TargetConditionals.h> 2595 #import <Foundation/Foundation.h> 2596 #import <CoreHaptics/CoreHaptics.h> 2597 int main() { return 0; }" HAVE_FRAMEWORK_COREHAPTICS) 2598 if(HAVE_FRAMEWORK_GAMECONTROLLER AND HAVE_FRAMEWORK_COREHAPTICS) 2599 # Only enable MFI if we also have CoreHaptics to ensure rumble works 2600 set(SDL_JOYSTICK_MFI 1) 2601 set(SDL_FRAMEWORK_GAMECONTROLLER 1) 2602 set(SDL_FRAMEWORK_COREHAPTICS 1) 2603 endif() 2604 if(NOT VISIONOS) 2605 set(SDL_JOYSTICK_IOKIT 1) 2606 set(SDL_FRAMEWORK_IOKIT 1) 2607 endif() 2608 set(SDL_FRAMEWORK_FF 1) 2609 endif() 2610 set(HAVE_SDL_JOYSTICK TRUE) 2611 endif() 2612 2613 if(SDL_HAPTIC) 2614 if (IOS OR TVOS OR VISIONOS OR WATCHOS) 2615 sdl_glob_sources("${SDL3_SOURCE_DIR}/src/haptic/dummy/*.c") 2616 set(SDL_HAPTIC_DUMMY 1) 2617 else() 2618 sdl_glob_sources( 2619 "${SDL3_SOURCE_DIR}/src/haptic/darwin/*.c" 2620 "${SDL3_SOURCE_DIR}/src/haptic/darwin/*.h" 2621 ) 2622 set(SDL_HAPTIC_IOKIT 1) 2623 set(SDL_FRAMEWORK_IOKIT 1) 2624 set(SDL_FRAMEWORK_FF 1) 2625 endif() 2626 set(HAVE_SDL_HAPTIC TRUE) 2627 endif() 2628 2629 if(SDL_POWER) 2630 if (IOS OR TVOS OR VISIONOS OR WATCHOS) 2631 sdl_glob_sources( 2632 "${SDL3_SOURCE_DIR}/src/power/uikit/*.m" 2633 "${SDL3_SOURCE_DIR}/src/power/uikit/*.h" 2634 ) 2635 set(SDL_POWER_UIKIT 1) 2636 else() 2637 sdl_glob_sources("${SDL3_SOURCE_DIR}/src/power/macos/*.c") 2638 set(SDL_POWER_MACOSX 1) 2639 set(SDL_FRAMEWORK_IOKIT 1) 2640 endif() 2641 set(HAVE_SDL_POWER TRUE) 2642 endif() 2643 2644 sdl_glob_sources("${SDL3_SOURCE_DIR}/src/locale/macos/*.m") 2645 set(HAVE_SDL_LOCALE TRUE) 2646 2647 set(SDL_TIME_UNIX 1) 2648 sdl_glob_sources("${SDL3_SOURCE_DIR}/src/time/unix/*.c") 2649 set(HAVE_SDL_TIME TRUE) 2650 2651 set(SDL_TIMER_UNIX 1) 2652 sdl_glob_sources("${SDL3_SOURCE_DIR}/src/timer/unix/*.c") 2653 set(HAVE_SDL_TIMERS TRUE) 2654 2655 set(SDL_FILESYSTEM_COCOA 1) 2656 sdl_glob_sources("${SDL3_SOURCE_DIR}/src/filesystem/cocoa/*.m") 2657 set(HAVE_SDL_FILESYSTEM TRUE) 2658 2659 # TODO: SDL_STORAGE_ICLOUD 2660 set(SDL_STORAGE_GENERIC 1) 2661 sdl_glob_sources("${SDL3_SOURCE_DIR}/src/storage/generic/*.c") 2662 if(MACOS) 2663 set(SDL_STORAGE_STEAM 1) 2664 sdl_glob_sources( 2665 "${SDL3_SOURCE_DIR}/src/storage/steam/*.c" 2666 "${SDL3_SOURCE_DIR}/src/storage/steam/*.h" 2667 ) 2668 endif() 2669 set(HAVE_SDL_STORAGE 1) 2670 2671 set(SDL_FSOPS_POSIX 1) 2672 sdl_sources("${SDL3_SOURCE_DIR}/src/filesystem/posix/SDL_sysfsops.c") 2673 set(HAVE_SDL_FSOPS TRUE) 2674 2675 if(SDL_SENSOR) 2676 if(IOS OR VISIONOS OR WATCHOS) 2677 set(SDL_SENSOR_COREMOTION 1) 2678 set(HAVE_SDL_SENSORS TRUE) 2679 sdl_glob_sources( 2680 "${SDL3_SOURCE_DIR}/src/sensor/coremotion/*.m" 2681 "${SDL3_SOURCE_DIR}/src/sensor/coremotion/*.h" 2682 ) 2683 endif() 2684 endif() 2685 2686 # iOS hack needed - http://code.google.com/p/ios-cmake/ ? 2687 if(SDL_VIDEO) 2688 if(IOS OR TVOS OR VISIONOS OR WATCHOS) 2689 set(SDL_VIDEO_DRIVER_UIKIT 1) 2690 set(SDL_FRAMEWORK_COREGRAPHICS 1) 2691 set(SDL_FRAMEWORK_QUARTZCORE 1) 2692 set(SDL_FRAMEWORK_UIKIT 1) 2693 set(SDL_IPHONE_KEYBOARD 1) 2694 set(SDL_IPHONE_LAUNCHSCREEN 1) 2695 set(SDL_FRAMEWORK_GAMECONTROLLER 1) 2696 sdl_glob_sources( 2697 "${SDL3_SOURCE_DIR}/src/video/uikit/*.m" 2698 "${SDL3_SOURCE_DIR}/src/video/uikit/*.h" 2699 ) 2700 set(HAVE_SDL_VIDEO TRUE) 2701 else() 2702 CheckCOCOA() 2703 if(SDL_OPENGL) 2704 set(SDL_VIDEO_OPENGL 1) 2705 set(SDL_VIDEO_OPENGL_CGL 1) 2706 set(SDL_VIDEO_RENDER_OGL 1) 2707 set(HAVE_OPENGL TRUE) 2708 endif() 2709 endif() 2710 2711 if(SDL_OPENGLES) 2712 if(IOS OR TVOS OR VISIONOS OR WATCHOS) 2713 set(SDL_FRAMEWORK_OPENGLES 1) 2714 set(SDL_VIDEO_OPENGL_ES 1) 2715 else() 2716 set(SDL_VIDEO_OPENGL_EGL 1) 2717 endif() 2718 set(SDL_VIDEO_OPENGL_ES2 1) 2719 set(SDL_VIDEO_RENDER_OGL_ES2 1) 2720 set(HAVE_OPENGLES TRUE) 2721 endif() 2722 2723 if(SDL_VULKAN OR SDL_METAL OR SDL_RENDER_METAL) 2724 check_objc_source_compiles(" 2725 #include <AvailabilityMacros.h> 2726 #import <Metal/Metal.h> 2727 #import <QuartzCore/CAMetalLayer.h> 2728 2729 #if (!TARGET_CPU_X86_64 && !TARGET_CPU_ARM64) 2730 #error Metal doesn't work on this configuration 2731 #endif 2732 int main(int argc, char **argv) { return 0; }" HAVE_FRAMEWORK_METAL) 2733 if(HAVE_FRAMEWORK_METAL) 2734 set(SDL_FRAMEWORK_METAL 1) 2735 set(SDL_FRAMEWORK_QUARTZCORE 1) 2736 if(SDL_VULKAN) 2737 set(SDL_VIDEO_VULKAN 1) 2738 set(HAVE_VULKAN TRUE) 2739 if(SDL_RENDER_VULKAN) 2740 set(SDL_VIDEO_RENDER_VULKAN 1) 2741 set(HAVE_RENDER_VULKAN TRUE) 2742 endif() 2743 endif() 2744 if(SDL_METAL) 2745 set(SDL_VIDEO_METAL 1) 2746 set(HAVE_METAL TRUE) 2747 endif() 2748 if(SDL_RENDER_METAL) 2749 sdl_glob_sources( 2750 "${SDL3_SOURCE_DIR}/src/render/metal/*.m" 2751 "${SDL3_SOURCE_DIR}/src/render/metal/*.h" 2752 ) 2753 set(SDL_VIDEO_RENDER_METAL 1) 2754 set(HAVE_RENDER_METAL TRUE) 2755 endif() 2756 endif() 2757 endif() 2758 endif() 2759 2760 if(SDL_TRAY AND MACOS) 2761 sdl_glob_sources("${SDL3_SOURCE_DIR}/src/tray/cocoa/*.m") 2762 set(HAVE_SDL_TRAY TRUE) 2763 endif() 2764 2765 # Minimum version for $<LINK_LIBRARY:feature,library-list> 2766 cmake_minimum_required(VERSION 3.24) 2767 2768 # Actually load the frameworks at the end so we don't duplicate include. 2769 if(SDL_FRAMEWORK_COREVIDEO) 2770 find_library(COREMEDIA CoreMedia) 2771 if(COREMEDIA) 2772 sdl_link_dependency(corevideo LIBS "$<LINK_LIBRARY:FRAMEWORK,CoreMedia>" PKG_CONFIG_LINK_OPTIONS "-Wl,-framework,CoreMedia") 2773 endif() 2774 sdl_link_dependency(corevideo LIBS "$<LINK_LIBRARY:FRAMEWORK,CoreVideo>" PKG_CONFIG_LINK_OPTIONS "-Wl,-framework,CoreVideo") 2775 endif() 2776 if(SDL_FRAMEWORK_COCOA) 2777 sdl_link_dependency(cocoa LIBS "$<LINK_LIBRARY:FRAMEWORK,Cocoa>" PKG_CONFIG_LINK_OPTIONS "-Wl,-framework,Cocoa") 2778 # macOS 11.0+ iOS 14.0+ tvOS 14.0+ 2779 sdl_link_dependency(uniformtypeidentifiers LIBS "$<LINK_LIBRARY:WEAK_FRAMEWORK,UniformTypeIdentifiers>" PKG_CONFIG_LINK_OPTIONS "-Wl,-weak_framework,UniformTypeIdentifiers") 2780 endif() 2781 if(SDL_FRAMEWORK_IOKIT) 2782 sdl_link_dependency(iokit LIBS "$<LINK_LIBRARY:FRAMEWORK,IOKit>" PKG_CONFIG_LINK_OPTIONS "-Wl,-framework,IOKit") 2783 endif() 2784 if(SDL_FRAMEWORK_FF) 2785 sdl_link_dependency(ff LIBS "$<LINK_LIBRARY:FRAMEWORK,ForceFeedback>" PKG_CONFIG_LINK_OPTIONS "-Wl,-framework,ForceFeedback") 2786 endif() 2787 if(SDL_FRAMEWORK_CARBON) 2788 sdl_link_dependency(carbon LIBS "$<LINK_LIBRARY:FRAMEWORK,Carbon>" PKG_CONFIG_LINK_OPTIONS "-Wl,-framework,Carbon") 2789 endif() 2790 if(SDL_FRAMEWORK_COREAUDIO) 2791 sdl_link_dependency(core_audio LIBS "$<LINK_LIBRARY:FRAMEWORK,CoreAudio>" PKG_CONFIG_LINK_OPTIONS "-Wl,-framework,CoreAudio") 2792 endif() 2793 if(SDL_FRAMEWORK_AUDIOTOOLBOX) 2794 sdl_link_dependency(audio_toolbox LIBS "$<LINK_LIBRARY:FRAMEWORK,AudioToolbox>" PKG_CONFIG_LINK_OPTIONS "-Wl,-framework,AudioToolbox") 2795 endif() 2796 if(SDL_FRAMEWORK_AVFOUNDATION) 2797 sdl_link_dependency(av_foundation LIBS "$<LINK_LIBRARY:FRAMEWORK,AVFoundation>" PKG_CONFIG_LINK_OPTIONS "-Wl,-framework,AVFoundation") 2798 endif() 2799 if(SDL_FRAMEWORK_COREBLUETOOTH) 2800 sdl_link_dependency(core_bluetooth LIBS "$<LINK_LIBRARY:FRAMEWORK,CoreBluetooth>" PKG_CONFIG_LINK_OPTIONS "-Wl,-framework,CoreBluetooth") 2801 endif() 2802 if(SDL_FRAMEWORK_COREGRAPHICS) 2803 sdl_link_dependency(core_graphics LIBS "$<LINK_LIBRARY:FRAMEWORK,CoreGraphics>" PKG_CONFIG_LINK_OPTIONS "-Wl,-framework,CoreGraphics") 2804 endif() 2805 if(SDL_FRAMEWORK_COREMOTION) 2806 sdl_link_dependency(core_motion LIBS "$<LINK_LIBRARY:FRAMEWORK,CoreMotion>" PKG_CONFIG_LINK_OPTIONS "-Wl,-framework,CoreMotion") 2807 endif() 2808 if(SDL_FRAMEWORK_FOUNDATION) 2809 sdl_link_dependency(foundation LIBS "$<LINK_LIBRARY:FRAMEWORK,Foundation>" PKG_CONFIG_LINK_OPTIONS "-Wl,-framework,Foundation") 2810 endif() 2811 if(SDL_FRAMEWORK_GAMECONTROLLER) 2812 find_library(GAMECONTROLLER GameController) 2813 if(GAMECONTROLLER) 2814 sdl_link_dependency(game_controller LIBS "$<LINK_LIBRARY:FRAMEWORK,GameController>" PKG_CONFIG_LINK_OPTIONS "-Wl,-framework,GameController") 2815 endif() 2816 endif() 2817 if(SDL_FRAMEWORK_METAL) 2818 sdl_link_dependency(metal LIBS "$<LINK_LIBRARY:FRAMEWORK,Metal>" PKG_CONFIG_LINK_OPTIONS "-Wl,-framework,Metal") 2819 endif() 2820 if(SDL_FRAMEWORK_OPENGLES) 2821 sdl_link_dependency(opengles LIBS "$<LINK_LIBRARY:FRAMEWORK,OpenGLES>" PKG_CONFIG_LINK_OPTIONS "-Wl,-framework,OpenGLES") 2822 endif() 2823 if(SDL_FRAMEWORK_QUARTZCORE) 2824 sdl_link_dependency(quartz_core LIBS "$<LINK_LIBRARY:FRAMEWORK,QuartzCore>" PKG_CONFIG_LINK_OPTIONS "-Wl,-framework,QuartzCore") 2825 endif() 2826 if(SDL_FRAMEWORK_UIKIT) 2827 sdl_link_dependency(ui_kit LIBS "$<LINK_LIBRARY:FRAMEWORK,UIKit>" PKG_CONFIG_LINK_OPTIONS "-Wl,-framework,UIKit") 2828 endif() 2829 if(SDL_FRAMEWORK_COREHAPTICS) 2830 find_library(COREHAPTICS CoreHaptics) 2831 if(COREHAPTICS) 2832 # macOS 10.15+ iOS 13.0+ tvOS 14.0+ 2833 sdl_link_dependency(core_haptics LIBS "$<LINK_LIBRARY:WEAK_FRAMEWORK,CoreHaptics>" PKG_CONFIG_LINK_OPTIONS "-Wl,-weak_framework,CoreHaptics") 2834 endif() 2835 endif() 2836 2837 CheckPTHREAD() 2838 2839 if(SDL_RPATH AND SDL_SHARED) 2840 set(SDL_RLD_FLAGS "-Wl,-rpath,\${libdir}") 2841 set(HAVE_RPATH TRUE) 2842 endif() 2843 2844elseif(HAIKU) 2845 enable_language(CXX) 2846 if(SDL_AUDIO) 2847 set(SDL_AUDIO_DRIVER_HAIKU 1) 2848 sdl_glob_sources( 2849 "${SDL3_SOURCE_DIR}/src/audio/haiku/*.cc" 2850 "${SDL3_SOURCE_DIR}/src/audio/haiku/*.h" 2851 ) 2852 set(HAVE_SDL_AUDIO TRUE) 2853 endif() 2854 2855 if(SDL_JOYSTICK) 2856 set(SDL_JOYSTICK_HAIKU 1) 2857 sdl_glob_sources("${SDL3_SOURCE_DIR}/src/joystick/haiku/*.cc") 2858 set(HAVE_SDL_JOYSTICK TRUE) 2859 endif() 2860 2861 sdl_glob_sources("${SDL3_SOURCE_DIR}/src/misc/haiku/*.cc") 2862 set(HAVE_SDL_MISC TRUE) 2863 2864 if(SDL_VIDEO) 2865 set(SDL_VIDEO_DRIVER_HAIKU 1) 2866 sdl_glob_sources( 2867 "${SDL3_SOURCE_DIR}/src/video/haiku/*.cc" 2868 "${SDL3_SOURCE_DIR}/src/video/haiku/*.h" 2869 ) 2870 set(HAVE_SDL_VIDEO TRUE) 2871 2872 if(SDL_OPENGL) 2873 # TODO: Use FIND_PACKAGE(OpenGL) instead 2874 set(SDL_VIDEO_OPENGL 1) 2875 set(SDL_VIDEO_OPENGL_HAIKU 1) 2876 set(SDL_VIDEO_RENDER_OGL 1) 2877 sdl_link_dependency(opengl LIBS GL) 2878 set(HAVE_OPENGL TRUE) 2879 endif() 2880 endif() 2881 2882 set(SDL_FILESYSTEM_HAIKU 1) 2883 sdl_glob_sources("${SDL3_SOURCE_DIR}/src/filesystem/haiku/*.cc") 2884 set(HAVE_SDL_FILESYSTEM TRUE) 2885 2886 set(SDL_FSOPS_POSIX 1) 2887 sdl_sources("${SDL3_SOURCE_DIR}/src/filesystem/posix/SDL_sysfsops.c") 2888 set(HAVE_SDL_FSOPS TRUE) 2889 2890 set(SDL_TIME_UNIX 1) 2891 sdl_glob_sources("${SDL3_SOURCE_DIR}/src/time/unix/*.c") 2892 set(HAVE_SDL_TIME TRUE) 2893 2894 set(SDL_TIMER_HAIKU 1) 2895 sdl_glob_sources("${SDL3_SOURCE_DIR}/src/timer/haiku/*.c") 2896 set(HAVE_SDL_TIMERS TRUE) 2897 2898 if(SDL_POWER) 2899 set(SDL_POWER_HAIKU 1) 2900 sdl_glob_sources("${SDL3_SOURCE_DIR}/src/power/haiku/*.c") 2901 set(HAVE_SDL_POWER TRUE) 2902 endif() 2903 2904 sdl_glob_sources("${SDL3_SOURCE_DIR}/src/locale/haiku/*.cc") 2905 set(HAVE_SDL_LOCALE TRUE) 2906 2907 sdl_glob_sources( 2908 "${SDL3_SOURCE_DIR}/src/core/haiku/*.cc" 2909 "${SDL3_SOURCE_DIR}/src/core/haiku/*.h" 2910 ) 2911 2912 CheckPTHREAD() 2913 sdl_link_dependency(base LIBS root be media game device textencoding tracker) 2914 2915elseif(RISCOS) 2916 sdl_glob_sources("${SDL3_SOURCE_DIR}/src/misc/riscos/*.c") 2917 set(HAVE_SDL_MISC TRUE) 2918 2919 if(SDL_VIDEO) 2920 set(SDL_VIDEO_DRIVER_RISCOS 1) 2921 sdl_glob_sources( 2922 "${SDL3_SOURCE_DIR}/src/video/riscos/*.c" 2923 "${SDL3_SOURCE_DIR}/src/video/riscos/*.h" 2924 ) 2925 set(HAVE_SDL_VIDEO TRUE) 2926 endif() 2927 2928 set(SDL_FILESYSTEM_RISCOS 1) 2929 sdl_glob_sources("${SDL3_SOURCE_DIR}/src/filesystem/riscos/*.c") 2930 set(HAVE_SDL_FILESYSTEM TRUE) 2931 2932 set(SDL_FSOPS_POSIX 1) 2933 sdl_sources("${SDL3_SOURCE_DIR}/src/filesystem/posix/SDL_sysfsops.c") 2934 set(HAVE_SDL_FSOPS TRUE) 2935 2936 set(SDL_TIME_UNIX 1) 2937 sdl_glob_sources("${SDL3_SOURCE_DIR}/src/time/unix/*.c") 2938 set(HAVE_SDL_TIME TRUE) 2939 2940 set(SDL_TIMER_UNIX 1) 2941 sdl_glob_sources("${SDL3_SOURCE_DIR}/src/timer/unix/*.c") 2942 set(HAVE_SDL_TIMERS TRUE) 2943 2944 if(SDL_CLOCK_GETTIME) 2945 set(HAVE_CLOCK_GETTIME 1) 2946 endif() 2947 2948 CheckPTHREAD() 2949 2950 if(SDL_AUDIO) 2951 CheckOSS() 2952 endif() 2953 2954elseif(VITA) 2955 # SDL_spinlock.c Needs to be compiled in ARM mode. 2956 cmake_push_check_state() 2957 string(APPEND CMAKE_REQUIRED_FLAGS " -Werror=unused-command-line-argument") 2958 check_c_compiler_flag(-marm HAVE_ARM_MODE) 2959 cmake_pop_check_state() 2960 if(HAVE_ARM_MODE) 2961 set_property(SOURCE "${SDL3_SOURCE_DIR}/src/atomic/SDL_spinlock.c" APPEND_STRING PROPERTY COMPILE_FLAGS " -marm") 2962 endif() 2963 2964 sdl_glob_sources( 2965 "${SDL3_SOURCE_DIR}/src/misc/vita/*.c" 2966 ) 2967 set(HAVE_SDL_MISC TRUE) 2968 2969 if(SDL_AUDIO) 2970 set(SDL_AUDIO_DRIVER_VITA 1) 2971 sdl_glob_sources( 2972 "${SDL3_SOURCE_DIR}/src/audio/vita/*.c" 2973 "${SDL3_SOURCE_DIR}/src/audio/vita/*.h" 2974 ) 2975 set(HAVE_SDL_AUDIO TRUE) 2976 endif() 2977 2978 set(SDL_FILESYSTEM_VITA 1) 2979 sdl_glob_sources("${SDL3_SOURCE_DIR}/src/filesystem/vita/*.c") 2980 set(HAVE_SDL_FILESYSTEM TRUE) 2981 2982 set(SDL_FSOPS_POSIX 1) 2983 sdl_sources("${SDL3_SOURCE_DIR}/src/filesystem/posix/SDL_sysfsops.c") 2984 set(HAVE_SDL_FSOPS TRUE) 2985 2986 if(SDL_JOYSTICK) 2987 set(SDL_JOYSTICK_VITA 1) 2988 sdl_glob_sources("${SDL3_SOURCE_DIR}/src/joystick/vita/*.c") 2989 set(HAVE_SDL_JOYSTICK TRUE) 2990 endif() 2991 2992 if(SDL_POWER) 2993 set(SDL_POWER_VITA 1) 2994 sdl_glob_sources("${SDL3_SOURCE_DIR}/src/power/vita/*.c") 2995 set(HAVE_SDL_POWER TRUE) 2996 endif() 2997 2998 set(SDL_THREAD_VITA 1) 2999 sdl_sources( 3000 "${SDL3_SOURCE_DIR}/src/thread/vita/SDL_sysmutex.c" 3001 "${SDL3_SOURCE_DIR}/src/thread/vita/SDL_sysmutex_c.h" 3002 "${SDL3_SOURCE_DIR}/src/thread/vita/SDL_syssem.c" 3003 "${SDL3_SOURCE_DIR}/src/thread/vita/SDL_systhread.c" 3004 "${SDL3_SOURCE_DIR}/src/thread/vita/SDL_systhread_c.h" 3005 "${SDL3_SOURCE_DIR}/src/thread/generic/SDL_syscond.c" 3006 "${SDL3_SOURCE_DIR}/src/thread/generic/SDL_syscond_c.h" 3007 "${SDL3_SOURCE_DIR}/src/thread/generic/SDL_sysrwlock.c" 3008 "${SDL3_SOURCE_DIR}/src/thread/generic/SDL_sysrwlock_c.h" 3009 "${SDL3_SOURCE_DIR}/src/thread/generic/SDL_systls.c" 3010 ) 3011 set(HAVE_SDL_THREADS TRUE) 3012 3013 sdl_glob_sources("${SDL3_SOURCE_DIR}/src/locale/vita/*.c") 3014 set(HAVE_SDL_LOCALE TRUE) 3015 3016 set(SDL_TIME_VITA 1) 3017 sdl_glob_sources("${SDL3_SOURCE_DIR}/src/time/vita/*.c") 3018 set(HAVE_SDL_TIME TRUE) 3019 3020 set(SDL_TIMER_VITA 1) 3021 sdl_glob_sources("${SDL3_SOURCE_DIR}/src/timer/vita/*.c") 3022 set(HAVE_SDL_TIMERS TRUE) 3023 3024 if(SDL_SENSOR) 3025 set(SDL_SENSOR_VITA 1) 3026 set(HAVE_SDL_SENSORS TRUE) 3027 sdl_glob_sources( 3028 "${SDL3_SOURCE_DIR}/src/sensor/vita/*.c" 3029 "${SDL3_SOURCE_DIR}/src/sensor/vita/*.h" 3030 ) 3031 endif() 3032 3033 if(SDL_CAMERA) 3034 set(SDL_CAMERA_DRIVER_VITA 1) 3035 set(HAVE_CAMERA TRUE) 3036 sdl_glob_sources("${SDL3_SOURCE_DIR}/src/camera/vita/*.c") 3037 endif() 3038 3039 if(SDL_VIDEO) 3040 set(SDL_VIDEO_DRIVER_VITA 1) 3041 sdl_glob_sources( 3042 "${SDL3_SOURCE_DIR}/src/video/vita/*.c" 3043 "${SDL3_SOURCE_DIR}/src/video/vita/*.h" 3044 ) 3045 set(HAVE_SDL_VIDEO TRUE) 3046 3047 if(VIDEO_VITA_PIB) 3048 check_include_file(pib.h HAVE_PIGS_IN_BLANKET_H) 3049 3050 if(HAVE_PIGS_IN_BLANKET_H) 3051 set(SDL_VIDEO_OPENGL_ES2 1) 3052 sdl_link_dependency(pib 3053 LIBS 3054 pib 3055 libScePiglet_stub_weak 3056 taihen_stub_weak 3057 SceShaccCg_stub_weak 3058 ) 3059 set(HAVE_VIDEO_VITA_PIB ON) 3060 set(SDL_VIDEO_VITA_PIB 1) 3061 else() 3062 set(HAVE_VIDEO_VITA_PIB OFF) 3063 endif() 3064 endif() 3065 3066 if(VIDEO_VITA_PVR) 3067 check_include_file(gpu_es4/psp2_pvr_hint.h HAVE_PVR_H) 3068 if(HAVE_PVR_H) 3069 sdl_compile_definitions(PRIVATE "__psp2__") 3070 set(SDL_VIDEO_OPENGL_EGL 1) 3071 set(HAVE_OPENGLES TRUE) 3072 set(SDL_VIDEO_OPENGL_ES 1) 3073 set(SDL_VIDEO_OPENGL_ES2 1) 3074 set(SDL_VIDEO_RENDER_OGL_ES2 1) 3075 3076 sdl_link_dependency(pvr 3077 LIBS 3078 libgpu_es4_ext_stub_weak 3079 libIMGEGL_stub_weak 3080 SceIme_stub 3081 ) 3082 3083 set(HAVE_VIDEO_VITA_PVR ON) 3084 set(SDL_VIDEO_VITA_PVR 1) 3085 3086 if(SDL_OPENGL) 3087 check_include_file(gl4esinit.h HAVE_GL4ES_H) 3088 if(HAVE_GL4ES_H) 3089 set(HAVE_OPENGL TRUE) 3090 set(SDL_VIDEO_OPENGL 1) 3091 set(SDL_VIDEO_RENDER_OGL 1) 3092 sdl_link_dependency(opengl LIBS libGL_stub) 3093 set(SDL_VIDEO_VITA_PVR_OGL 1) 3094 endif() 3095 endif() 3096 3097 else() 3098 set(HAVE_VIDEO_VITA_PVR OFF) 3099 endif() 3100 endif() 3101 3102 set(SDL_VIDEO_RENDER_VITA_GXM 1) 3103 sdl_link_dependency(base 3104 LIBS 3105 SceGxm_stub 3106 SceDisplay_stub 3107 SceCtrl_stub 3108 SceAppMgr_stub 3109 SceAppUtil_stub 3110 SceAudio_stub 3111 SceAudioIn_stub 3112 SceSysmodule_stub 3113 SceDisplay_stub 3114 SceCtrl_stub 3115 SceIofilemgr_stub 3116 SceCommonDialog_stub 3117 SceTouch_stub 3118 SceHid_stub 3119 SceMotion_stub 3120 ScePower_stub 3121 SceProcessmgr_stub 3122 SceCamera_stub 3123 ) 3124 endif() 3125 3126 sdl_compile_definitions(PRIVATE "__VITA__") 3127 3128elseif(PSP) 3129 sdl_glob_sources("${SDL3_SOURCE_DIR}/src/main/psp/*.c") 3130 3131 if(SDL_AUDIO) 3132 set(SDL_AUDIO_DRIVER_PSP 1) 3133 sdl_glob_sources( 3134 "${SDL3_SOURCE_DIR}/src/audio/psp/*.c" 3135 "${SDL3_SOURCE_DIR}/src/audio/psp/*.h" 3136 ) 3137 set(HAVE_SDL_AUDIO TRUE) 3138 endif() 3139 3140 set(SDL_FILESYSTEM_PSP 1) 3141 sdl_glob_sources("${SDL3_SOURCE_DIR}/src/filesystem/psp/*.c") 3142 set(HAVE_SDL_FILESYSTEM TRUE) 3143 3144 set(SDL_FSOPS_POSIX 1) 3145 sdl_sources("${SDL3_SOURCE_DIR}/src/filesystem/posix/SDL_sysfsops.c") 3146 set(HAVE_SDL_FSOPS TRUE) 3147 3148 if(SDL_JOYSTICK) 3149 set(SDL_JOYSTICK_PSP 1) 3150 sdl_glob_sources("${SDL3_SOURCE_DIR}/src/joystick/psp/*.c") 3151 set(HAVE_SDL_JOYSTICK TRUE) 3152 endif() 3153 3154 if(SDL_POWER) 3155 set(SDL_POWER_PSP 1) 3156 sdl_glob_sources("${SDL3_SOURCE_DIR}/src/power/psp/*.c") 3157 set(HAVE_SDL_POWER TRUE) 3158 endif() 3159 3160 set(SDL_THREAD_PSP 1) 3161 sdl_glob_sources( 3162 "${SDL3_SOURCE_DIR}/src/thread/generic/SDL_syscond.c" 3163 "${SDL3_SOURCE_DIR}/src/thread/generic/SDL_syscond_c.h" 3164 "${SDL3_SOURCE_DIR}/src/thread/generic/SDL_systls.c" 3165 "${SDL3_SOURCE_DIR}/src/thread/generic/SDL_sysrwlock.c" 3166 "${SDL3_SOURCE_DIR}/src/thread/generic/SDL_sysrwlock_c.h" 3167 "${SDL3_SOURCE_DIR}/src/thread/psp/*.c" 3168 "${SDL3_SOURCE_DIR}/src/thread/psp/*.h" 3169 ) 3170 set(HAVE_SDL_THREADS TRUE) 3171 3172 sdl_glob_sources("${SDL3_SOURCE_DIR}/src/locale/psp/*.c") 3173 set(HAVE_SDL_LOCALE TRUE) 3174 3175 set(SDL_TIME_PSP 1) 3176 sdl_glob_sources("${SDL3_SOURCE_DIR}/src/time/psp/*.c") 3177 set(HAVE_SDL_TIME TRUE) 3178 3179 set(SDL_TIMER_PSP 1) 3180 sdl_glob_sources("${SDL3_SOURCE_DIR}/src/timer/psp/*.c") 3181 set(HAVE_SDL_TIMERS TRUE) 3182 3183 if(SDL_VIDEO) 3184 set(SDL_VIDEO_DRIVER_PSP 1) 3185 set(SDL_VIDEO_RENDER_PSP 1) 3186 sdl_glob_sources( 3187 "${SDL3_SOURCE_DIR}/src/video/psp/*.c" 3188 "${SDL3_SOURCE_DIR}/src/video/psp/*.h" 3189 ) 3190 set(SDL_VIDEO_OPENGL 1) 3191 set(HAVE_SDL_VIDEO TRUE) 3192 endif() 3193 3194 sdl_link_dependency(base 3195 LIBS 3196 GL 3197 pspvram 3198 pspaudio 3199 pspvfpu 3200 pspdisplay 3201 pspgu 3202 pspge 3203 psphprm 3204 pspctrl 3205 psppower 3206 ) 3207 3208elseif(PS2) 3209 sdl_glob_sources("${SDL3_SOURCE_DIR}/src/main/ps2/*.c") 3210 3211 if(SDL_AUDIO) 3212 set(SDL_AUDIO_DRIVER_PS2 1) 3213 sdl_glob_sources( 3214 "${SDL3_SOURCE_DIR}/src/audio/ps2/*.c" 3215 "${SDL3_SOURCE_DIR}/src/audio/ps2/*.h" 3216 ) 3217 set(HAVE_SDL_AUDIO TRUE) 3218 endif() 3219 3220 set(SDL_FILESYSTEM_PS2 1) 3221 sdl_glob_sources("${SDL3_SOURCE_DIR}/src/filesystem/ps2/*.c") 3222 set(HAVE_SDL_FILESYSTEM TRUE) 3223 3224 set(SDL_FSOPS_POSIX 1) 3225 sdl_sources("${SDL3_SOURCE_DIR}/src/filesystem/posix/SDL_sysfsops.c") 3226 set(HAVE_SDL_FSOPS TRUE) 3227 3228 if(SDL_JOYSTICK) 3229 set(SDL_JOYSTICK_PS2 1) 3230 sdl_glob_sources("${SDL3_SOURCE_DIR}/src/joystick/ps2/*.c") 3231 set(HAVE_SDL_JOYSTICK TRUE) 3232 endif() 3233 3234 set(SDL_THREAD_PS2 1) 3235 sdl_glob_sources( 3236 "${SDL3_SOURCE_DIR}/src/thread/generic/SDL_syscond.c" 3237 "${SDL3_SOURCE_DIR}/src/thread/generic/SDL_syscond_c.h" 3238 "${SDL3_SOURCE_DIR}/src/thread/generic/SDL_sysmutex.c" 3239 "${SDL3_SOURCE_DIR}/src/thread/generic/SDL_sysrwlock.c" 3240 "${SDL3_SOURCE_DIR}/src/thread/generic/SDL_sysrwlock_c.h" 3241 "${SDL3_SOURCE_DIR}/src/thread/generic/SDL_systls.c" 3242 "${SDL3_SOURCE_DIR}/src/thread/ps2/*.c" 3243 "${SDL3_SOURCE_DIR}/src/thread/ps2/*.h" 3244 ) 3245 set(HAVE_SDL_THREADS TRUE) 3246 3247 set(SDL_TIME_PS2 1) 3248 sdl_glob_sources("${SDL3_SOURCE_DIR}/src/time/ps2/*.c") 3249 set(HAVE_SDL_TIME TRUE) 3250 3251 set(SDL_TIMER_PS2 1) 3252 sdl_glob_sources("${SDL3_SOURCE_DIR}/src/timer/ps2/*.c") 3253 set(HAVE_SDL_TIMERS TRUE) 3254 3255 if(SDL_VIDEO) 3256 set(SDL_VIDEO_DRIVER_PS2 1) 3257 set(SDL_VIDEO_RENDER_PS2 1) 3258 sdl_glob_sources( 3259 "${SDL3_SOURCE_DIR}/src/video/ps2/*.c" 3260 "${SDL3_SOURCE_DIR}/src/render/ps2/*.c" 3261 ) 3262 set(SDL_VIDEO_OPENGL 0) 3263 set(HAVE_SDL_VIDEO TRUE) 3264 endif() 3265 3266 sdl_link_dependency(base 3267 LIBS 3268 patches 3269 gskit 3270 dmakit 3271 ps2_drivers 3272 atomic 3273 ) 3274elseif(N3DS) 3275 sdl_glob_sources("${SDL3_SOURCE_DIR}/src/main/n3ds/*.c") 3276 3277 if(SDL_AUDIO) 3278 set(SDL_AUDIO_DRIVER_N3DS 1) 3279 sdl_glob_sources( 3280 "${SDL3_SOURCE_DIR}/src/audio/n3ds/*.c" 3281 "${SDL3_SOURCE_DIR}/src/audio/n3ds/*.h" 3282 ) 3283 set(HAVE_SDL_AUDIO TRUE) 3284 endif() 3285 3286 set(SDL_FILESYSTEM_N3DS 1) 3287 sdl_glob_sources("${SDL3_SOURCE_DIR}/src/filesystem/n3ds/*.c") 3288 set(HAVE_SDL_FILESYSTEM TRUE) 3289 3290 # !!! FIXME: do we need a FSops implementation for this? 3291 3292 if(SDL_JOYSTICK) 3293 set(SDL_JOYSTICK_N3DS 1) 3294 sdl_glob_sources("${SDL3_SOURCE_DIR}/src/joystick/n3ds/*.c") 3295 set(HAVE_SDL_JOYSTICK TRUE) 3296 endif() 3297 3298 if(SDL_POWER) 3299 set(SDL_POWER_N3DS 1) 3300 sdl_glob_sources("${SDL3_SOURCE_DIR}/src/power/n3ds/*.c") 3301 set(HAVE_SDL_POWER TRUE) 3302 endif() 3303 3304 set(SDL_THREAD_N3DS 1) 3305 sdl_glob_sources( 3306 "${SDL3_SOURCE_DIR}/src/thread/n3ds/*.c" 3307 "${SDL3_SOURCE_DIR}/src/thread/n3ds/*.h" 3308 ) 3309 sdl_sources( 3310 "${SDL3_SOURCE_DIR}/src/thread/generic/SDL_syscond.c" 3311 "${SDL3_SOURCE_DIR}/src/thread/generic/SDL_syscond_c.h" 3312 "${SDL3_SOURCE_DIR}/src/thread/generic/SDL_systls.c" 3313 "${SDL3_SOURCE_DIR}/src/thread/generic/SDL_sysrwlock.c" 3314 "${SDL3_SOURCE_DIR}/src/thread/generic/SDL_sysrwlock_c.h" 3315 ) 3316 set(HAVE_SDL_THREADS TRUE) 3317 3318 set(SDL_TIME_N3DS 1) 3319 sdl_glob_sources("${SDL3_SOURCE_DIR}/src/time/n3ds/*.c") 3320 set(HAVE_SDL_TIME TRUE) 3321 3322 set(SDL_TIMER_N3DS 1) 3323 sdl_glob_sources("${SDL3_SOURCE_DIR}/src/timer/n3ds/*.c") 3324 set(HAVE_SDL_TIMERS TRUE) 3325 3326 set(SDL_FSOPS_POSIX 1) 3327 sdl_sources("${SDL3_SOURCE_DIR}/src/filesystem/posix/SDL_sysfsops.c") 3328 set(HAVE_SDL_FSOPS TRUE) 3329 3330 if(SDL_SENSOR) 3331 set(SDL_SENSOR_N3DS 1) 3332 sdl_glob_sources("${SDL3_SOURCE_DIR}/src/sensor/n3ds/*.c") 3333 set(HAVE_SDL_SENSORS TRUE) 3334 endif() 3335 3336 if(SDL_VIDEO) 3337 set(SDL_VIDEO_DRIVER_N3DS 1) 3338 sdl_glob_sources( 3339 "${SDL3_SOURCE_DIR}/src/video/n3ds/*.c" 3340 "${SDL3_SOURCE_DIR}/src/video/n3ds/*.h" 3341 ) 3342 set(HAVE_SDL_VIDEO TRUE) 3343 endif() 3344 3345 sdl_glob_sources("${SDL3_SOURCE_DIR}/src/locale/n3ds/*.c") 3346 set(HAVE_SDL_LOCALE TRUE) 3347 3348 sdl_glob_sources( 3349 "${SDL3_SOURCE_DIR}/src/io/n3ds/*.c" 3350 "${SDL3_SOURCE_DIR}/src/io/n3ds/*.h" 3351 ) 3352 3353elseif(DOS) 3354 sdl_glob_sources("${SDL3_SOURCE_DIR}/src/main/dos/*.c") 3355 sdl_glob_sources("${SDL3_SOURCE_DIR}/src/core/dos/*.c") 3356 3357 set(SDL_AUDIO_DRIVER_DOS_SOUNDBLASTER 1) 3358 sdl_glob_sources("${SDL3_SOURCE_DIR}/src/audio/dos/*.c") 3359 set(HAVE_SDL_AUDIO TRUE) 3360 3361 set(SDL_VIDEO_DRIVER_DOSVESA 1) 3362 sdl_glob_sources("${SDL3_SOURCE_DIR}/src/video/dos/*.c") 3363 set(HAVE_SDL_VIDEO TRUE) 3364 3365 set(SDL_FSOPS_POSIX 1) 3366 sdl_sources("${SDL3_SOURCE_DIR}/src/filesystem/posix/SDL_sysfsops.c") 3367 set(HAVE_SDL_FSOPS TRUE) 3368 3369 set(SDL_FILESYSTEM_DOS 1) 3370 sdl_glob_sources("${SDL3_SOURCE_DIR}/src/filesystem/dos/*.c") 3371 set(HAVE_SDL_FILESYSTEM TRUE) 3372 3373 # Wall-clock time (SDL_GetDateTimeLocalized etc.) reuses the Unix implementation; 3374 # DJGPP provides gettimeofday/localtime so this works as-is. 3375 set(SDL_TIME_UNIX 1) 3376 sdl_glob_sources("${SDL3_SOURCE_DIR}/src/time/unix/*.c") 3377 set(HAVE_SDL_TIME TRUE) 3378 3379 set(SDL_TIMER_DOS 1) 3380 sdl_glob_sources("${SDL3_SOURCE_DIR}/src/timer/dos/*.c") 3381 set(HAVE_SDL_TIMERS TRUE) 3382 3383 set(SDL_JOYSTICK_DOS 1) 3384 sdl_glob_sources("${SDL3_SOURCE_DIR}/src/joystick/dos/*.c") 3385 set(HAVE_SDL_JOYSTICK TRUE) 3386 3387 set(SDL_THREAD_DOS 1) 3388 sdl_glob_sources( 3389 "${SDL3_SOURCE_DIR}/src/thread/generic/SDL_syscond.c" 3390 "${SDL3_SOURCE_DIR}/src/thread/generic/SDL_syscond_c.h" 3391 "${SDL3_SOURCE_DIR}/src/thread/generic/SDL_sysrwlock.c" 3392 "${SDL3_SOURCE_DIR}/src/thread/generic/SDL_sysrwlock_c.h" 3393 "${SDL3_SOURCE_DIR}/src/thread/dos/*.c" 3394 "${SDL3_SOURCE_DIR}/src/thread/dos/*.h" 3395 ) 3396 set(HAVE_SDL_THREADS TRUE) 3397 3398elseif(NGAGE) 3399 3400 enable_language(CXX) 3401 3402 set(SDL_MAIN_USE_CALLBACKS 1) 3403 sdl_glob_sources( 3404 "${SDL3_SOURCE_DIR}/src/main/ngage/*.c" 3405 "${SDL3_SOURCE_DIR}/src/main/ngage/*.cpp" 3406 "${SDL3_SOURCE_DIR}/src/main/ngage/*.hpp" 3407 ) 3408 sdl_glob_sources( 3409 "${SDL3_SOURCE_DIR}/src/core/ngage/*.cpp" 3410 "${SDL3_SOURCE_DIR}/src/core/ngage/*.h" 3411 ) 3412 set(HAVE_SDL_MAIN_CALLBACKS TRUE) 3413 3414 if(SDL_AUDIO) 3415 set(SDL_AUDIO_DRIVER_NGAGE 1) 3416 sdl_glob_sources( 3417 "${SDL3_SOURCE_DIR}/src/audio/ngage/*.c" 3418 "${SDL3_SOURCE_DIR}/src/audio/ngage/*.cpp" 3419 "${SDL3_SOURCE_DIR}/src/audio/ngage/*.h" 3420 "${SDL3_SOURCE_DIR}/src/audio/ngage/*.hpp" 3421 ) 3422 set(HAVE_SDL_AUDIO TRUE) 3423 endif() 3424 3425 set(SDL_FILESYSTEM_NGAGE 1) 3426 sdl_glob_sources("${SDL3_SOURCE_DIR}/src/filesystem/ngage/*.c") 3427 sdl_glob_sources("${SDL3_SOURCE_DIR}/src/filesystem/ngage/*.cpp") 3428 sdl_glob_sources("${SDL3_SOURCE_DIR}/src/filesystem/posix/*.c") 3429 set(HAVE_SDL_FILESYSTEM TRUE) 3430 3431 sdl_glob_sources("${SDL3_SOURCE_DIR}/src/locale/ngage/*.cpp") 3432 3433 if(SDL_RENDER) 3434 set(SDL_VIDEO_RENDER_NGAGE 1) 3435 sdl_glob_sources( 3436 "${SDL3_SOURCE_DIR}/src/render/ngage/*.c" 3437 "${SDL3_SOURCE_DIR}/src/render/ngage/*.h" 3438 "${SDL3_SOURCE_DIR}/src/render/ngage/*.hpp" 3439 ) 3440 endif() 3441 3442 sdl_glob_sources("${SDL3_SOURCE_DIR}/src/time/ngage/*.cpp") 3443 set(SDL_TIME_NGAGE 1) 3444 3445 sdl_glob_sources( 3446 "${SDL3_SOURCE_DIR}/src/render/ngage/*.cpp" 3447 "${SDL3_SOURCE_DIR}/src/render/ngage/*.h" 3448 ) 3449 sdl_glob_sources("${SDL3_SOURCE_DIR}/src/time/unix/*.c") 3450 3451 set(SDL_TIMER_NGAGE 1) 3452 sdl_glob_sources("${SDL3_SOURCE_DIR}/src/timer/ngage/*.cpp") 3453 3454 set(SDL_FSOPS_POSIX 1) 3455 3456 set(SDL_VIDEO_DRIVER_NGAGE 1) 3457 sdl_glob_sources( 3458 "${SDL3_SOURCE_DIR}/src/video/ngage/*.c" 3459 "${SDL3_SOURCE_DIR}/src/video/ngage/*.h" 3460 ) 3461 set(HAVE_SDL_TIMERS TRUE) 3462 3463 set_option(SDL_LEAN_AND_MEAN "Enable lean and mean" ON) 3464 if(SDL_LEAN_AND_MEAN) 3465 sdl_compile_definitions( 3466 PRIVATE 3467 SDL_LEAN_AND_MEAN 3468 ) 3469 endif() 3470 3471 sdl_link_dependency(ngage 3472 LINK_OPTIONS "SHELL:-s MAIN_COMPAT=0" 3473 PKG_CONFIG_LINK_OPTIONS "-s;MAIN_COMPAT=0" 3474 LIBS 3475 NRenderer 3476 3dtypes 3477 cone 3478 libgcc 3479 libgcc_ngage 3480 mediaclientaudiostream 3481 charconv 3482 bitgdi 3483 euser 3484 estlib 3485 ws32 3486 hal 3487 fbscli 3488 efsrv 3489 scdv 3490 gdi 3491 ) 3492endif() 3493 3494sdl_sources(${SDL3_SOURCE_DIR}/src/dialog/SDL_dialog.c) 3495if (SDL_DIALOG) 3496 sdl_sources(${SDL3_SOURCE_DIR}/src/dialog/SDL_dialog_utils.c) 3497 if(ANDROID) 3498 sdl_sources(${SDL3_SOURCE_DIR}/src/dialog/android/SDL_androiddialog.c) 3499 set(HAVE_SDL_DIALOG TRUE) 3500 elseif(UNIX AND NOT APPLE AND NOT RISCOS AND NOT HAIKU) 3501 sdl_sources(${SDL3_SOURCE_DIR}/src/dialog/unix/SDL_unixdialog.c) 3502 sdl_sources(${SDL3_SOURCE_DIR}/src/dialog/unix/SDL_portaldialog.c) 3503 sdl_sources(${SDL3_SOURCE_DIR}/src/dialog/unix/SDL_portaldialog.h) 3504 sdl_sources(${SDL3_SOURCE_DIR}/src/dialog/unix/SDL_zenitydialog.c) 3505 sdl_sources(${SDL3_SOURCE_DIR}/src/dialog/unix/SDL_zenitydialog.h) 3506 set(HAVE_SDL_DIALOG TRUE) 3507 elseif(HAIKU) 3508 sdl_sources(${SDL3_SOURCE_DIR}/src/dialog/haiku/SDL_haikudialog.cc) 3509 set(HAVE_SDL_DIALOG TRUE) 3510 elseif(WINDOWS) 3511 sdl_sources(${SDL3_SOURCE_DIR}/src/dialog/windows/SDL_windowsdialog.c) 3512 set(HAVE_SDL_DIALOG TRUE) 3513 elseif(MACOS) 3514 sdl_sources(${SDL3_SOURCE_DIR}/src/dialog/cocoa/SDL_cocoadialog.m) 3515 set(HAVE_SDL_DIALOG TRUE) 3516 endif() 3517endif() 3518if(UNIX AND NOT APPLE AND NOT RISCOS AND NOT HAIKU) 3519 sdl_sources(${SDL3_SOURCE_DIR}/src/dialog/unix/SDL_zenitymessagebox.h) 3520 sdl_sources(${SDL3_SOURCE_DIR}/src/dialog/unix/SDL_zenitymessagebox.c) 3521endif() 3522 3523sdl_sources("${SDL3_SOURCE_DIR}/src/process/SDL_process.c") 3524if(WINDOWS) 3525 sdl_glob_sources( 3526 "${SDL3_SOURCE_DIR}/src/process/windows/*.c" 3527 "${SDL3_SOURCE_DIR}/src/process/windows/*.h" 3528 ) 3529 set(SDL_PROCESS_WINDOWS 1) 3530 set(HAVE_SDL_PROCESS TRUE) 3531elseif(NOT ANDROID) 3532 check_c_source_compiles(" 3533#include <spawn.h> 3534#include <unistd.h> 3535 3536int main(void) 3537{ 3538 int pipes[2]; 3539 int pid; 3540 3541 const char * args[] = { 3542 \"/bin/false\", 3543 NULL 3544 }; 3545 3546 const char * env[] = { NULL }; 3547 3548 pipe(pipes); 3549 3550 posix_spawnattr_t attr; 3551 posix_spawn_file_actions_t fa; 3552 3553 posix_spawnattr_init(&attr); 3554 posix_spawn_file_actions_init(&fa); 3555 3556 posix_spawn_file_actions_addclose(&fa, pipes[0]); 3557 posix_spawn_file_actions_adddup2(&fa, pipes[1], STDOUT_FILENO); 3558 3559 posix_spawn(&pid, args[0], &fa, &attr, (char * const *) args, (char * const *) env); 3560 posix_spawnp(&pid, args[0], &fa, &attr, (char * const *) args, (char * const *) env); 3561 3562 posix_spawn_file_actions_destroy(&fa); 3563 posix_spawnattr_destroy(&attr); 3564 3565 return 0; 3566} 3567" HAVE_POSIX_SPAWN) 3568 if(NOT APPLE) 3569 check_symbol_exists(vfork "unistd.h" LIBC_HAS_VFORK) 3570 endif() 3571 if(HAVE_POSIX_SPAWN AND (APPLE OR LIBC_HAS_VFORK)) 3572 sdl_glob_sources( 3573 "${SDL3_SOURCE_DIR}/src/process/posix/*.c" 3574 "${SDL3_SOURCE_DIR}/src/process/posix/*.h" 3575 ) 3576 set(SDL_PROCESS_POSIX 1) 3577 set(HAVE_SDL_PROCESS TRUE) 3578 endif() 3579endif() 3580 3581# Platform-independent options 3582 3583if(SDL_VIDEO) 3584 if(SDL_OFFSCREEN) 3585 set(SDL_VIDEO_DRIVER_OFFSCREEN 1) 3586 sdl_glob_sources( 3587 "${SDL3_SOURCE_DIR}/src/video/offscreen/*.c" 3588 "${SDL3_SOURCE_DIR}/src/video/offscreen/*.h" 3589 ) 3590 set(HAVE_OFFSCREEN TRUE) 3591 set(HAVE_SDL_VIDEO TRUE) 3592 endif() 3593endif() 3594 3595sdl_glob_sources(${SDL3_SOURCE_DIR}/src/tray/*.c) 3596 3597if(SDL_GPU) 3598 if(HAVE_DXGI1_6_H) 3599 sdl_glob_sources( 3600 "${SDL3_SOURCE_DIR}/src/gpu/d3d12/*.c" 3601 "${SDL3_SOURCE_DIR}/src/gpu/d3d12/*.h" 3602 ) 3603 set(SDL_GPU_D3D12 1) 3604 set(HAVE_SDL_GPU TRUE) 3605 endif() 3606 if(SDL_VIDEO_VULKAN) 3607 sdl_glob_sources( 3608 "${SDL3_SOURCE_DIR}/src/gpu/vulkan/*.c" 3609 "${SDL3_SOURCE_DIR}/src/gpu/vulkan/*.h" 3610 ) 3611 set(SDL_GPU_VULKAN 1) 3612 set(HAVE_SDL_GPU TRUE) 3613 endif() 3614 if(SDL_VIDEO_METAL) 3615 sdl_glob_sources( 3616 "${SDL3_SOURCE_DIR}/src/gpu/metal/*.m" 3617 "${SDL3_SOURCE_DIR}/src/gpu/metal/*.h" 3618 ) 3619 set(SDL_GPU_METAL 1) 3620 set(HAVE_SDL_GPU TRUE) 3621 endif() 3622 if(SDL_RENDER_GPU AND HAVE_SDL_GPU) 3623 set(SDL_VIDEO_RENDER_GPU 1) 3624 set(HAVE_RENDER_GPU TRUE) 3625 endif() 3626 if(SDL_GPU_OPENXR) 3627 set(HAVE_GPU_OPENXR 1) 3628 endif() 3629endif() 3630 3631# Dummies 3632# configure.ac does it differently: 3633# if not have X 3634# if enable_X { SDL_X_DISABLED = 1 } 3635# [add dummy sources] 3636# so it always adds a dummy, without checking, if it was actually requested. 3637# This leads to missing internal references on building, since the 3638# src/X/*.c does not get included. 3639if(NOT HAVE_SDL_AUDIO) 3640 set(SDL_AUDIO_DRIVER_DUMMY 1) 3641 sdl_glob_sources( 3642 "${SDL3_SOURCE_DIR}/src/audio/dummy/*.c" 3643 "${SDL3_SOURCE_DIR}/src/audio/dummy/*.h" 3644 ) 3645endif() 3646if(NOT HAVE_SDL_VIDEO) 3647 set(SDL_VIDEO_DRIVER_DUMMY 1) 3648 sdl_glob_sources( 3649 "${SDL3_SOURCE_DIR}/src/video/dummy/*.c" 3650 "${SDL3_SOURCE_DIR}/src/video/dummy/*.h" 3651 ) 3652endif() 3653if(NOT HAVE_SDL_JOYSTICK) 3654 set(SDL_JOYSTICK_DUMMY 1) 3655 sdl_glob_sources( 3656 "${SDL3_SOURCE_DIR}/src/joystick/dummy/*.c" 3657 "${SDL3_SOURCE_DIR}/src/joystick/dummy/*.h" 3658 ) 3659endif() 3660if(NOT HAVE_SDL_HAPTIC) 3661 set(SDL_HAPTIC_DUMMY 1) 3662 sdl_glob_sources( 3663 "${SDL3_SOURCE_DIR}/src/haptic/dummy/*.c" 3664 "${SDL3_SOURCE_DIR}/src/haptic/dummy/*.h" 3665 ) 3666endif() 3667if(NOT HAVE_SDL_SENSORS) 3668 set(SDL_SENSOR_DUMMY 1) 3669 sdl_glob_sources( 3670 "${SDL3_SOURCE_DIR}/src/sensor/dummy/*.c" 3671 "${SDL3_SOURCE_DIR}/src/sensor/dummy/*.h" 3672 ) 3673endif() 3674if(NOT HAVE_SDL_LOADSO) 3675 set(SDL_LOADSO_DUMMY 1) 3676 sdl_glob_sources( 3677 "${SDL3_SOURCE_DIR}/src/loadso/dummy/*.c" 3678 "${SDL3_SOURCE_DIR}/src/loadso/dummy/*.h" 3679 ) 3680endif() 3681if(NOT HAVE_SDL_FILESYSTEM) 3682 set(SDL_FILESYSTEM_DUMMY 1) 3683 sdl_glob_sources( 3684 "${SDL3_SOURCE_DIR}/src/filesystem/dummy/*.c" 3685 "${SDL3_SOURCE_DIR}/src/filesystem/dummy/*.h" 3686 ) 3687endif() 3688if(NOT HAVE_SDL_STORAGE) 3689 set(SDL_STORAGE_GENERIC 1) 3690 sdl_glob_sources( 3691 "${SDL3_SOURCE_DIR}/src/storage/generic/*.c" 3692 "${SDL3_SOURCE_DIR}/src/storage/generic/*.h" 3693 ) 3694endif() 3695if(NOT HAVE_SDL_FSOPS) 3696 set(SDL_FSOPS_DUMMY 1) 3697 sdl_sources("${SDL3_SOURCE_DIR}/src/filesystem/dummy/SDL_sysfsops.c") 3698endif() 3699if(NOT HAVE_SDL_LOCALE) 3700 set(SDL_LOCALE_DUMMY 1) 3701 sdl_glob_sources( 3702 "${SDL3_SOURCE_DIR}/src/locale/dummy/*.c" 3703 "${SDL3_SOURCE_DIR}/src/locale/dummy/*.h" 3704 ) 3705endif() 3706if(NOT HAVE_SDL_MISC) 3707 set(SDL_MISC_DUMMY 1) 3708 sdl_glob_sources( 3709 "${SDL3_SOURCE_DIR}/src/misc/dummy/*.c" 3710 "${SDL3_SOURCE_DIR}/src/misc/dummy/*.h" 3711 ) 3712endif() 3713if(NOT HAVE_SDL_DIALOG) 3714 set(SDL_DIALOG_DUMMY 1) 3715 sdl_sources(${SDL3_SOURCE_DIR}/src/dialog/dummy/SDL_dummydialog.c) 3716endif() 3717if(NOT HAVE_SDL_PROCESS) 3718 set(SDL_PROCESS_DUMMY 1) 3719 sdl_glob_sources(${SDL3_SOURCE_DIR}/src/process/dummy/*.c) 3720endif() 3721if(NOT HAVE_SDL_TRAY) 3722 set(SDL_TRAY_DUMMY 1) 3723 sdl_glob_sources(${SDL3_SOURCE_DIR}/src/tray/dummy/*.c) 3724endif() 3725if(NOT HAVE_CAMERA) 3726 set(SDL_CAMERA_DRIVER_DUMMY 1) 3727 sdl_glob_sources( 3728 "${SDL3_SOURCE_DIR}/src/camera/dummy/*.c" 3729 "${SDL3_SOURCE_DIR}/src/camera/dummy/*.h" 3730 ) 3731endif() 3732 3733# We always need to have threads and timers around 3734if(NOT HAVE_SDL_THREADS) 3735 # The Emscripten and N-Gage platform has been carefully vetted to work without threads 3736 if(EMSCRIPTEN OR NGAGE) 3737 set(SDL_THREADS_DISABLED 1) 3738 sdl_glob_sources( 3739 "${SDL3_SOURCE_DIR}/src/thread/generic/*.c" 3740 "${SDL3_SOURCE_DIR}/src/thread/generic/*.h" 3741 ) 3742 else() 3743 message(FATAL_ERROR "Threads are needed by many SDL subsystems and may not be disabled") 3744 endif() 3745endif() 3746if(NOT HAVE_SDL_TIMERS) 3747 message(FATAL_ERROR "Timers are needed by many SDL subsystems and may not be disabled") 3748endif() 3749 3750# Most platforms use this. 3751if(NOT HAVE_SDL_MAIN_CALLBACKS) 3752 sdl_glob_sources( 3753 "${SDL3_SOURCE_DIR}/src/main/generic/*.c" 3754 "${SDL3_SOURCE_DIR}/src/main/generic/*.h" 3755 ) 3756endif() 3757 3758# config variables may contain generator expression, so we need to generate SDL_build_config.h in 2 steps: 3759# 1. replace all `#cmakedefine`'s and `@abc@` 3760configure_file("${SDL3_SOURCE_DIR}/include/build_config/SDL_build_config.h.cmake" 3761 "${SDL3_BINARY_DIR}/CMakeFiles/SDL_build_config.h.intermediate") 3762# 2. generate SDL_build_config.h in an build_type-dependent folder (which should be first in the include search path) 3763file(GENERATE 3764 OUTPUT "${SDL3_BINARY_DIR}/include-config-$<LOWER_CASE:$<CONFIG>>/build_config/SDL_build_config.h" 3765 INPUT "${SDL3_BINARY_DIR}/CMakeFiles/SDL_build_config.h.intermediate" 3766) 3767 3768file(GLOB SDL3_INCLUDE_FILES "${SDL3_SOURCE_DIR}/include/SDL3/*.h") 3769file(GLOB SDL3_TEST_INCLUDE_FILES "${SDL3_SOURCE_DIR}/include/SDL3/SDL_test*.h") 3770foreach(_hdr IN LISTS SDL3_INCLUDE_FILES) 3771 if(_hdr MATCHES ".*SDL_revision\\.h" OR _hdr MATCHES ".*SDL_test.*\\.h") 3772 list(REMOVE_ITEM SDL3_INCLUDE_FILES "${_hdr}") 3773 endif() 3774endforeach() 3775 3776# If REVISION.txt exists, then we are building from a SDL release. 3777# SDL_revision.h(.cmake) in source releases have SDL_REVISION baked into them. 3778if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/REVISION.txt") 3779 file(STRINGS "${CMAKE_CURRENT_SOURCE_DIR}/REVISION.txt" revisions) 3780 list(GET revisions 0 revisions_0) 3781 string(STRIP "${revisions_0}" revisions_0_stripped) 3782 set(SDL_REVISION "SDL-${revisions_0_stripped}") 3783else() 3784 set(SDL_REVISION "" CACHE STRING "Custom SDL revision (only used when REVISION.txt does not exist)") 3785endif() 3786if(NOT SDL_REVISION) 3787 # If SDL_REVISION is not overridden, use git to describe 3788 git_describe(SDL_REVISION_GIT) 3789 set(SDL_REVISION "SDL-${SDL3_VERSION}-${SDL_REVISION_GIT}") 3790endif() 3791 3792execute_process(COMMAND "${CMAKE_COMMAND}" -E make_directory "${SDL3_BINARY_DIR}/include-revision/SDL3") 3793configure_file(include/build_config/SDL_revision.h.cmake include-revision/SDL3/SDL_revision.h @ONLY) 3794list(APPEND SDL3_INCLUDE_FILES "${SDL3_BINARY_DIR}/include-revision/SDL3/SDL_revision.h") 3795 3796if(SDL_FRAMEWORK) 3797 # With Apple frameworks, headers in the PUBLIC_HEADER property also need to be added as sources 3798 list(APPEND SDL3_INCLUDE_FILES ${SDL3_TEST_INCLUDE_FILES}) 3799endif() 3800 3801sdl_sources(${SDL3_INCLUDE_FILES}) 3802 3803if((CMAKE_STATIC_LIBRARY_PREFIX STREQUAL "" AND CMAKE_STATIC_LIBRARY_SUFFIX STREQUAL ".lib") OR SDL_FRAMEWORK) 3804 # - Avoid conflict between the dll import library and the static library 3805 # - Create SDL3-static Apple Framework 3806 set(sdl_static_libname "SDL3-static") 3807else() 3808 set(sdl_static_libname "SDL3") 3809endif() 3810 3811macro(check_add_debug_flag FLAG SUFFIX) 3812 check_c_compiler_flag(${FLAG} HAS_C_FLAG_${SUFFIX}) 3813 if(HAS_C_FLAG_${SUFFIX}) 3814 string(APPEND CMAKE_C_FLAGS_DEBUG " ${FLAG}") 3815 endif() 3816 3817 if(CMAKE_CXX_COMPILER) 3818 check_cxx_compiler_flag(${FLAG} HAS_CXX_${SUFFIX}) 3819 if(HAS_CXX_${SUFFIX}) 3820 string(APPEND CMAKE_CXX_FLAGS_DEBUG " ${FLAG}") 3821 endif() 3822 endif() 3823endmacro() 3824 3825macro(asan_check_add_debug_flag ASAN_FLAG) 3826 check_add_debug_flag("-fsanitize=${ASAN_FLAG}" "${ASAN_FLAG}") 3827 if(HAS_C_${ASAN_FLAG} OR HAS_CXX_${ASAN_FLAG}) 3828 set(HAVE_ASAN ON) 3829 endif() 3830endmacro() 3831 3832macro(asan_check_add_debug_flag2 ASAN_FLAG) 3833 # for some sanitize flags we have to manipulate the CMAKE_REQUIRED_LIBRARIES: 3834 # http://cmake.3232098.n2.nabble.com/CHECK-CXX-COMPILER-FLAG-doesn-t-give-correct-result-for-fsanitize-address-tp7600216p7600217.html 3835 3836 set(FLAG "-fsanitize=${ASAN_FLAG}") 3837 3838 cmake_push_check_state() 3839 list(APPEND CMAKE_REQUIRED_LIBRARIES ${FLAG} asan) 3840 3841 check_c_compiler_flag (${FLAG} HAS_C_FLAG_${ASAN_FLAG}) 3842 if (HAS_C_FLAG_${ASAN_FLAG}) 3843 string(APPEND CMAKE_C_FLAGS_DEBUG " ${FLAG}") 3844 endif() 3845 3846 if(CMAKE_CXX_COMPILER) 3847 check_cxx_compiler_flag (${FLAG} HAS_CXX_FLAG_${ASAN_FLAG}) 3848 if (HAS_CXX_${ASAN_FLAG}) 3849 string(APPEND CMAKE_CXX_FLAGS_DEBUG " ${FLAG}") 3850 endif() 3851 endif() 3852 3853 cmake_pop_check_state() 3854 if(HAS_C_${ASAN_FLAG} OR HAS_CXX_${ASAN_FLAG}) 3855 set(HAVE_ASAN ON) 3856 endif() 3857endmacro() 3858 3859# enable AddressSanitizer if supported 3860if(SDL_ASAN) 3861 asan_check_add_debug_flag2("address") 3862 asan_check_add_debug_flag("bool") 3863 asan_check_add_debug_flag("bounds") 3864 asan_check_add_debug_flag("enum") 3865 asan_check_add_debug_flag("float-cast-overflow") 3866 asan_check_add_debug_flag("float-divide-by-zero") 3867 asan_check_add_debug_flag("nonnull-attribute") 3868 asan_check_add_debug_flag("returns-nonnull-attribute") 3869 asan_check_add_debug_flag("signed-integer-overflow") 3870 asan_check_add_debug_flag("undefined") 3871 asan_check_add_debug_flag("vla-bound") 3872 asan_check_add_debug_flag("leak") 3873 # The object size sanitizer has no effect on unoptimized builds on Clang, 3874 # but causes warnings. 3875 if(NOT USE_CLANG OR CMAKE_BUILD_TYPE STREQUAL "") 3876 asan_check_add_debug_flag("object-size") 3877 endif() 3878endif() 3879 3880if(SDL_CCACHE) 3881 find_program(CCACHE_BINARY ccache) 3882 if(CCACHE_BINARY) 3883 set(CMAKE_C_COMPILER_LAUNCHER ${CCACHE_BINARY}) 3884 set(CMAKE_CXX_COMPILER_LAUNCHER ${CCACHE_BINARY}) 3885 set(CMAKE_OBJC_COMPILER_LAUNCHER ${CCACHE_BINARY}) 3886 set(HAVE_CCACHE ON) 3887 else() 3888 set(HAVE_CCACHE OFF) 3889 endif() 3890else() 3891 set(HAVE_CCACHE OFF) 3892endif() 3893 3894if(SDL_CLANG_TIDY) 3895 find_program(CLANG_TIDY_BINARY clang-tidy) 3896 3897 if(CLANG_TIDY_BINARY) 3898 set(HAVE_CLANG_TIDY ON) 3899 get_clang_tidy_ignored_files(CLANG_TIDY_IGNORED_FILES) 3900 set(CLANG_TIDY_COMMAND "${CLANG_TIDY_BINARY}" "-extra-arg=-Wno-unknown-warning-option" "--line-filter=[${CLANG_TIDY_IGNORED_FILES}]") 3901 if(SDL_WERROR) 3902 list(APPEND CLANG_TIDY_COMMAND "--warnings-as-errors=*") 3903 endif() 3904 set(CMAKE_C_CLANG_TIDY ${CLANG_TIDY_COMMAND}) 3905 set(CMAKE_CXX_CLANG_TIDY ${CLANG_TIDY_COMMAND}) 3906 set(CMAKE_OBJC_CLANG_TIDY ${CLANG_TIDY_COMMAND}) 3907 get_property(shared_sources TARGET SDL3-collector PROPERTY INTERFACE_SOURCES) 3908 set_source_files_properties(${shared_sources} PROPERTIES SKIP_PRECOMPILE_HEADERS TRUE) 3909 file(GLOB STDLIB_SOURCES "${SDL3_SOURCE_DIR}/src/stdlib/*.c") 3910 set_property(SOURCE ${STDLIB_SOURCES} APPEND PROPERTY COMPILE_DEFINITIONS "SDL_DISABLE_ANALYZE_MACROS") 3911 else() 3912 set(HAVE_CLANG_TIDY OFF) 3913 endif() 3914endif() 3915 3916if(SDL_TESTS) 3917 set(HAVE_TESTS ON) 3918endif() 3919 3920if(CMAKE_SIZEOF_VOID_P EQUAL 8) 3921 set(ARCH_64 TRUE) 3922else() 3923 set(ARCH_64 FALSE) 3924endif() 3925 3926if(APPLE) 3927 cmake_push_check_state(RESET) 3928 check_c_compiler_flag(-fobjc-arc COMPILER_SUPPORTS_FOBJC_ARC) 3929 cmake_pop_check_state() 3930 if(NOT COMPILER_SUPPORTS_FOBJC_ARC) 3931 message(FATAL_ERROR "Compiler does not support -fobjc-arc: this is required on Apple platforms") 3932 endif() 3933 sdl_compile_options(PRIVATE "-fobjc-arc") 3934endif() 3935 3936if(PS2) 3937 sdl_compile_options(PRIVATE "-Wno-error=declaration-after-statement") 3938endif() 3939 3940if(NOT SDL_LIBC) 3941 if(MSVC) 3942 set(saved_CMAKE_TRY_COMPILE_TARGET_TYPE "${CMAKE_TRY_COMPILE_TARGET_TYPE}") 3943 cmake_push_check_state(RESET) 3944 set(CMAKE_TRY_COMPILE_TARGET_TYPE "STATIC_LIBRARY") 3945 check_c_compiler_flag("/Zl" COMPILER_SUPPORTS_Zl) 3946 cmake_pop_check_state() 3947 set(CMAKE_TRY_COMPILE_TARGET_TYPE "${saved_CMAKE_TRY_COMPILE_TARGET_TYPE}") 3948 if(COMPILER_SUPPORTS_Zl) 3949 # /Zl omits the default C runtime library name from the .obj file. 3950 sdl_compile_options(PRIVATE "$<$<OR:$<COMPILE_LANGUAGE:C>,$<COMPILE_LANGUAGE:CXX>>:/Zl>") 3951 if(TARGET SDL3_test) 3952 target_compile_options(SDL3_test PRIVATE "/Zl") 3953 endif() 3954 endif() 3955 endif() 3956endif() 3957 3958if(APPLE) 3959 get_property(sources TARGET SDL3-collector PROPERTY INTERFACE_SOURCES) 3960 foreach(SOURCE_FILE IN LISTS sources) 3961 get_filename_component(FILE_EXTENSION ${SOURCE_FILE} EXT) 3962 if(FILE_EXTENSION STREQUAL ".m") 3963 set_property(SOURCE ${SOURCE_FILE} APPEND_STRING PROPERTY COMPILE_FLAGS " -x objective-c") 3964 endif() 3965 if(NOT FILE_EXTENSION STREQUAL ".c" AND NOT FILE_EXTENSION STREQUAL ".cpp") 3966 set_property(SOURCE ${SOURCE_FILE} PROPERTY SKIP_PRECOMPILE_HEADERS 1) 3967 endif() 3968 endforeach() 3969endif() 3970 3971# Disable precompiled headers on SDL_dynapi.c to avoid applying dynapi overrides 3972set_source_files_properties(src/dynapi/SDL_dynapi.c PROPERTIES SKIP_PRECOMPILE_HEADERS 1) 3973 3974set(SDL_FRAMEWORK_RESOURCES 3975 LICENSE.txt 3976 README.md 3977) 3978if(SDL_FRAMEWORK) 3979 sdl_sources(${SDL_FRAMEWORK_RESOURCES}) 3980endif() 3981 3982add_library(SDL3_Headers INTERFACE) 3983add_library(SDL3::Headers ALIAS SDL3_Headers) 3984set_property(TARGET SDL3_Headers PROPERTY EXPORT_NAME "Headers") 3985target_include_directories(SDL3_Headers 3986 INTERFACE 3987 "$<BUILD_INTERFACE:${SDL3_BINARY_DIR}/include-revision>" 3988 "$<BUILD_INTERFACE:${SDL3_SOURCE_DIR}/include>" 3989) 3990if(SDL_FRAMEWORK) 3991 target_include_directories(SDL3_Headers 3992 INTERFACE 3993 "$<INSTALL_INTERFACE:$<INSTALL_PREFIX>/SDL3.framework/Headers>" 3994 ) 3995 # Add `-F <parent folder of SDL3.framework>` to make sure `#include "SDL3/..."` works. 3996 target_compile_options(SDL3_Headers 3997 INTERFACE 3998 "$<INSTALL_INTERFACE:SHELL:-F $<INSTALL_PREFIX>>" 3999 ) 4000else() 4001 target_include_directories(SDL3_Headers 4002 INTERFACE 4003 "$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>" 4004 ) 4005endif() 4006 4007if(SDL_SHARED) 4008 set_target_properties(SDL3-shared PROPERTIES 4009 OUTPUT_NAME "SDL3" 4010 POSITION_INDEPENDENT_CODE TRUE 4011 LINK_DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/src/dynapi/SDL_dynapi.sym" 4012 INTERFACE_LINK_DEPENDS "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src/dynapi/SDL_dynapi.sym>" 4013 WINDOWS_EXPORT_ALL_SYMBOLS FALSE 4014 DEFINE_SYMBOL "DLL_EXPORT" 4015 ) 4016 if(HAVE_GCC_FVISIBILITY) 4017 set_target_properties(SDL3-shared PROPERTIES 4018 C_VISIBILITY_PRESET "hidden" 4019 CXX_VISIBILITY_PRESET "hidden" 4020 OBJC_VISIBILITY_PRESET "hidden" 4021 ) 4022 endif() 4023 if(NOT SDL_LIBC) 4024 if(MSVC AND NOT MSVC_CLANG) 4025 # Don't try to link with the default set of libraries. 4026 # Note: The clang toolset for Visual Studio does not support /NODEFAULTLIB. 4027 target_link_options(SDL3-shared PRIVATE "/NODEFAULTLIB") 4028 if(SDL_CPU_ARM32) 4029 # linking to msvcrt.lib avoid unresolved external symbols 4030 # (__rt_sdiv, __rt_udiv, __rt_sdiv64, _rt_udiv64, __dtou64, __u64tod, __i64tos) 4031 target_link_libraries(SDL3-shared PRIVATE msvcrt.lib) 4032 endif() 4033 find_library(HAVE_ONECORE_LIB NAMES "onecore.lib") 4034 if(HAVE_ONECORE_LIB) 4035 # SDL_malloc.c: __imp_MapViewOfFileNuma2 referenced in function MapViewOfFile2 4036 target_link_libraries(SDL3-shared PRIVATE onecore.lib) 4037 endif() 4038 find_library(HAVE_VOLATILEACCESSU_LIB NAMES "volatileaccessu.lib") 4039 if(HAVE_VOLATILEACCESSU_LIB) 4040 # SDL_malloc.c : RtlSetVolatileMemory referenced in function RtlFillVolatileMemory 4041 # SDL_malloc.c : RtlFillDeviceMemory referenced in function RtlZeroDeviceMemory 4042 target_link_libraries(SDL3-shared PRIVATE volatileaccessu.lib) 4043 endif() 4044 endif() 4045 if(HAS_Q_NO_USE_LIBIRC) 4046 target_compile_options(SDL3-shared PRIVATE /Q_no-use-libirc) 4047 endif() 4048 endif() 4049 if(APPLE) 4050 cmake_minimum_required(VERSION 3.17) 4051 set_target_properties(SDL3-shared PROPERTIES 4052 MACOSX_RPATH TRUE 4053 FRAMEWORK "${SDL_FRAMEWORK}" 4054 SOVERSION "${SDL_SO_VERSION_MAJOR}" 4055 MACHO_COMPATIBILITY_VERSION "${SDL_DYLIB_COMPAT_VERSION}" 4056 MACHO_CURRENT_VERSION "${SDL_DYLIB_CURRENT_VERSION}" 4057 ) 4058 if(SDL_FRAMEWORK) 4059 set_target_properties(SDL3-shared PROPERTIES 4060 PUBLIC_HEADER "${SDL3_INCLUDE_FILES}" 4061 FRAMEWORK_VERSION "${SDL_FRAMEWORK_VERSION}" 4062 MACOSX_FRAMEWORK_IDENTIFIER "org.libsdl.SDL3" 4063 RESOURCE "${SDL_FRAMEWORK_RESOURCES}" 4064 ) 4065 endif() 4066 elseif(UNIX AND NOT ANDROID) 4067 set_target_properties(SDL3-shared PROPERTIES 4068 VERSION "${SDL_SO_VERSION}" 4069 SOVERSION "${SDL_SO_VERSION_MAJOR}" 4070 ) 4071 else() 4072 if(WINDOWS OR CYGWIN) 4073 set_target_properties(SDL3-shared PROPERTIES 4074 PREFIX "" 4075 ) 4076 endif() 4077 endif() 4078 4079 target_link_libraries(SDL3-shared PRIVATE ${SDL_CMAKE_DEPENDS}) 4080 target_include_directories(SDL3-shared 4081 PRIVATE 4082 "$<BUILD_INTERFACE:${SDL3_BINARY_DIR}/include-config-$<LOWER_CASE:$<CONFIG>>>/build_config" 4083 "$<BUILD_INTERFACE:${SDL3_SOURCE_DIR}/src>" 4084 ) 4085 target_link_libraries(SDL3-shared PUBLIC $<TARGET_NAME:SDL3::Headers>) 4086 if(MINGW OR CYGWIN) 4087 target_link_options(SDL3-shared PRIVATE -static-libgcc) 4088 endif() 4089 # Use `Compatible Interface Properties` to: 4090 # - allow consumers to enforce a shared/static library 4091 # - block linking to SDL libraries of different major version 4092 set_property(TARGET SDL3-shared APPEND PROPERTY COMPATIBLE_INTERFACE_BOOL SDL3_SHARED) 4093 set_property(TARGET SDL3-shared PROPERTY INTERFACE_SDL3_SHARED TRUE) 4094 set_property(TARGET SDL3-shared APPEND PROPERTY COMPATIBLE_INTERFACE_STRING "SDL_VERSION") 4095 set_property(TARGET SDL3-shared PROPERTY INTERFACE_SDL_VERSION "SDL${SDL3_VERSION_MAJOR}") 4096 set_property(TARGET SDL3-shared APPEND PROPERTY EXPORT_PROPERTIES "SDL_FULL_VERSION") 4097 set_property(TARGET SDL3-shared PROPERTY SDL_FULL_VERSION "${PROJECT_VERSION}") 4098 if(NOT CMAKE_VERSION VERSION_LESS "3.16") 4099 target_precompile_headers(SDL3-shared PRIVATE "$<$<OR:$<COMPILE_LANGUAGE:C>,$<COMPILE_LANGUAGE:CXX>>:${PROJECT_SOURCE_DIR}/src/SDL_internal.h>") 4100 endif() 4101endif() 4102 4103if(SDL_STATIC) 4104 set_target_properties(SDL3-static PROPERTIES 4105 OUTPUT_NAME "${sdl_static_libname}" 4106 ) 4107 target_compile_definitions(SDL3-static PRIVATE SDL_STATIC_LIB) 4108 target_link_libraries(SDL3-static PRIVATE ${SDL_CMAKE_DEPENDS}) 4109 target_include_directories(SDL3-static 4110 PRIVATE 4111 "$<BUILD_INTERFACE:${SDL3_BINARY_DIR}/include-config-$<LOWER_CASE:$<CONFIG>>>/build_config" 4112 "$<BUILD_INTERFACE:${SDL3_SOURCE_DIR}/src>" 4113 ) 4114 target_link_libraries(SDL3-static PUBLIC $<TARGET_NAME:SDL3::Headers>) 4115 # Use `Compatible Interface Properties` to: 4116 # - allow consumers to enforce a shared/static library 4117 # - block linking to SDL libraries of different major version 4118 set_property(TARGET SDL3-static APPEND PROPERTY COMPATIBLE_INTERFACE_BOOL SDL3_SHARED) 4119 set_property(TARGET SDL3-static PROPERTY INTERFACE_SDL3_SHARED FALSE) 4120 set_property(TARGET SDL3-static APPEND PROPERTY COMPATIBLE_INTERFACE_STRING "SDL_VERSION") 4121 set_property(TARGET SDL3-static PROPERTY INTERFACE_SDL_VERSION "SDL${SDL3_VERSION_MAJOR}") 4122 set_property(TARGET SDL3-static APPEND PROPERTY EXPORT_PROPERTIES "SDL_FULL_VERSION") 4123 set_property(TARGET SDL3-static PROPERTY SDL_FULL_VERSION "${PROJECT_VERSION}") 4124 if(NOT CMAKE_VERSION VERSION_LESS "3.16") 4125 target_precompile_headers(SDL3-static PRIVATE "$<$<OR:$<COMPILE_LANGUAGE:C>,$<COMPILE_LANGUAGE:CXX>>:${PROJECT_SOURCE_DIR}/src/SDL_internal.h>") 4126 endif() 4127endif() 4128 4129sdl_compile_definitions( 4130 PRIVATE 4131 "SDL_BUILD_MAJOR_VERSION=${PROJECT_VERSION_MAJOR}" 4132 "SDL_BUILD_MINOR_VERSION=${PROJECT_VERSION_MINOR}" 4133 "SDL_BUILD_MICRO_VERSION=${PROJECT_VERSION_PATCH}" 4134) 4135 4136##### Tests ##### 4137 4138if(SDL_TEST_LIBRARY) 4139 file(GLOB TEST_SOURCES "${SDL3_SOURCE_DIR}/src/test/*.c" "${SDL3_SOURCE_DIR}/src/test/*.h") 4140 target_sources(SDL3_test PRIVATE ${TEST_SOURCES}) 4141 if(APPLE) 4142 set_target_properties(SDL3_test PROPERTIES 4143 FRAMEWORK "${SDL_FRAMEWORK}" 4144 ) 4145 if(SDL_FRAMEWORK) 4146 set_target_properties(SDL3_test PROPERTIES 4147 FRAMEWORK_VERSION "${SDL_FRAMEWORK_VERSION}" 4148 MACOSX_FRAMEWORK_IDENTIFIER "org.libsdl.SDL3_test" 4149 RESOURCE "${SDL_FRAMEWORK_RESOURCES}" 4150 ) 4151 endif() 4152 endif() 4153 target_link_libraries(SDL3_test PUBLIC $<TARGET_NAME:SDL3::Headers>) 4154 # FIXME: get rid of EXTRA_TEST_LIBS variable 4155 target_link_libraries(SDL3_test PRIVATE ${EXTRA_TEST_LIBS}) 4156 set_property(TARGET SDL3_test APPEND PROPERTY COMPATIBLE_INTERFACE_STRING "SDL_VERSION") 4157 set_property(TARGET SDL3_test PROPERTY INTERFACE_SDL_VERSION "SDL${SDL3_VERSION_MAJOR}") 4158endif() 4159 4160##### Configure installation folders ##### 4161 4162if(WINDOWS AND NOT MINGW) 4163 set(SDL_INSTALL_CMAKEDIR_ROOT_DEFAULT "cmake") 4164else() 4165 set(SDL_INSTALL_CMAKEDIR_ROOT_DEFAULT "${CMAKE_INSTALL_LIBDIR}/cmake/SDL3") 4166endif() 4167set(SDL_INSTALL_CMAKEDIR_ROOT "${SDL_INSTALL_CMAKEDIR_ROOT_DEFAULT}" CACHE STRING "Root folder where to install SDL3Config.cmake related files (SDL3 subfolder for MSVC projects)") 4168 4169if(FREEBSD) 4170 # FreeBSD uses ${PREFIX}/libdata/pkgconfig 4171 set(SDL_PKGCONFIG_INSTALLDIR "libdata/pkgconfig") 4172else() 4173 set(SDL_PKGCONFIG_INSTALLDIR "${CMAKE_INSTALL_LIBDIR}/pkgconfig") 4174endif() 4175 4176if(WINDOWS AND NOT MINGW) 4177 set(SDL_INSTALL_CMAKEDIR "${SDL_INSTALL_CMAKEDIR_ROOT}") 4178 set(SDL_INSTALL_LICENSEDIR "licenses/SDL3") 4179 set(SDL_INSTALL_HEADERSDIR "${CMAKE_INSTALL_INCLUDEDIR}/SDL3") 4180elseif(SDL_FRAMEWORK) 4181 set(SDL_INSTALL_CMAKEDIR "SDL3.framework/Versions/${SDL_FRAMEWORK_VERSION}/Resources/CMake") 4182 set(SDL_INSTALL_LICENSEDIR "Resources") 4183 set(SDL_INSTALL_HEADERSDIR "Headers") 4184else() 4185 set(SDL_INSTALL_CMAKEDIR "${SDL_INSTALL_CMAKEDIR_ROOT}") 4186 set(SDL_INSTALL_LICENSEDIR "${CMAKE_INSTALL_DATAROOTDIR}/licenses/${PROJECT_NAME}") 4187 set(SDL_INSTALL_HEADERSDIR "${CMAKE_INSTALL_INCLUDEDIR}/SDL3") 4188endif() 4189 4190if(SDL_FRAMEWORK) 4191 set(SDL_SDL_INSTALL_RESOURCEDIR "SDL3.framework/Resources") 4192 set(SDL_SDL_INSTALL_CMAKEDIR "${SDL_SDL_INSTALL_RESOURCEDIR}/CMake") 4193 set(SDL_SDL_INSTALL_REAL_RESOURCEDIR "SDL3.framework/Versions/${SDL_FRAMEWORK_VERSION}/Resources") 4194 set(SDL_SDL_INSTALL_REAL_CMAKEDIR "${SDL_SDL_INSTALL_REAL_RESOURCEDIR}/CMake") 4195 4196 set(SDL_SDLtest_INSTALL_RESOURCEDIR "SDL3_test.framework/Resources") 4197 set(SDL_SDLtest_INSTALL_CMAKEDIR "${SDL_SDLtest_INSTALL_RESOURCEDIR}/CMake") 4198 set(SDL_SDLtest_INSTALL_CMAKEFILENAME "SDL3_testConfig.cmake") 4199else() 4200 set(SDL_SDL_INSTALL_RESOURCEDIR ".") 4201 set(SDL_SDL_INSTALL_CMAKEDIR ${SDL_INSTALL_CMAKEDIR}) 4202 set(SDL_SDL_INSTALL_REAL_CMAKEDIR ${SDL_INSTALL_CMAKEDIR}) 4203 4204 # Install SDL3*Targets.cmake files in lib/cmake/SDL3 4205 set(SDL_SDLstatic_INSTALL_RESOURCEDIR ".") 4206 set(SDL_SDLstatic_INSTALL_CMAKEDIR "${SDL_SDL_INSTALL_CMAKEDIR}") 4207 set(SDL_SDLstatic_INSTALL_CMAKEFILENAME "SDL3staticTargets.cmake") 4208 4209 set(SDL_SDLtest_INSTALL_RESOURCEDIR ".") 4210 set(SDL_SDLtest_INSTALL_CMAKEDIR "${SDL_SDL_INSTALL_CMAKEDIR}") 4211 set(SDL_SDLtest_INSTALL_CMAKEFILENAME "SDL3testTargets.cmake") 4212endif() 4213 4214export(TARGETS SDL3_Headers NAMESPACE "SDL3::" FILE "SDL3headersTargets.cmake") 4215 4216if(SDL_SHARED) 4217 export(TARGETS SDL3-shared NAMESPACE "SDL3::" FILE "SDL3sharedTargets.cmake") 4218endif() 4219 4220if(SDL_STATIC) 4221 export(TARGETS SDL3-static NAMESPACE "SDL3::" FILE "SDL3staticTargets.cmake") 4222endif() 4223 4224if(SDL_TEST_LIBRARY) 4225 export(TARGETS SDL3_test NAMESPACE "SDL3::" FILE "SDL3testTargets.cmake") 4226endif() 4227 4228sdl_cmake_config_find_pkg_config_commands(SDL_FIND_PKG_CONFIG_COMMANDS 4229 COLLECTOR SDL3-collector 4230 CONFIG_COMPONENT_FOUND_NAME SDL3_SDL3-static_FOUND 4231) 4232sdl_cmake_config_find_pkg_config_commands(SDL_TEST_FIND_PKG_CONFIG_COMMANDS 4233 COLLECTOR SDL3_test-collector 4234 CONFIG_COMPONENT_FOUND_NAME SDL3_SDL3_test_FOUND 4235) 4236 4237include(CMakePackageConfigHelpers) 4238configure_package_config_file(cmake/SDL3Config.cmake.in SDL3Config.cmake 4239 NO_SET_AND_CHECK_MACRO 4240 PATH_VARS CMAKE_INSTALL_PREFIX 4241 INSTALL_DESTINATION "${SDL_SDL_INSTALL_CMAKEDIR}" 4242) 4243write_basic_package_version_file("${CMAKE_CURRENT_BINARY_DIR}/SDL3ConfigVersion.cmake" 4244 COMPATIBILITY AnyNewerVersion 4245) 4246 4247sdl_cmake_config_required_modules(sdl_cmake_modules) 4248if(sdl_cmake_modules) 4249 execute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different ${sdl_cmake_modules} "${SDL3_BINARY_DIR}") 4250endif() 4251 4252if(SDL_INSTALL) 4253 4254 ##### sdl3.pc ##### 4255 configure_sdl3_pc() 4256 if(NOT SDL_FRAMEWORK) 4257 install(FILES ${SDL3_BINARY_DIR}/sdl3.pc DESTINATION "${SDL_PKGCONFIG_INSTALLDIR}") 4258 endif() 4259 4260 ##### Installation targets #####() 4261 4262 install(TARGETS SDL3_Headers EXPORT SDL3headersTargets) 4263 4264 if(SDL_SHARED) 4265 install(TARGETS SDL3-shared EXPORT SDL3sharedTargets 4266 PUBLIC_HEADER DESTINATION "${SDL_INSTALL_HEADERSDIR}" 4267 ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" 4268 LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" 4269 RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" 4270 FRAMEWORK DESTINATION "." 4271 RESOURCE DESTINATION "${SDL_SDL_INSTALL_RESOURCEDIR}" 4272 ) 4273 if(MSVC) 4274 SDL_install_pdb(SDL3-shared "${CMAKE_INSTALL_BINDIR}") 4275 endif() 4276 endif() 4277 4278 if(SDL_STATIC) 4279 install(TARGETS SDL3-static EXPORT SDL3staticTargets 4280 ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" 4281 FRAMEWORK DESTINATION "." 4282 RESOURCE DESTINATION "${SDL_SDLstatic_INSTALL_RESOURCEDIR}" 4283 ) 4284 if(MSVC) 4285 SDL_install_pdb(SDL3-static "${CMAKE_INSTALL_LIBDIR}") 4286 endif() 4287 endif() 4288 4289 if(SDL_TEST_LIBRARY) 4290 install(TARGETS SDL3_test EXPORT SDL3testTargets 4291 ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" 4292 FRAMEWORK DESTINATION "." 4293 RESOURCE DESTINATION "${SDL_SDLtest_INSTALL_RESOURCEDIR}" 4294 ) 4295 if(MSVC) 4296 SDL_install_pdb(SDL3_test "${CMAKE_INSTALL_LIBDIR}") 4297 endif() 4298 endif() 4299 4300 ##### Install CMake Targets ##### 4301 4302 install(EXPORT SDL3headersTargets 4303 FILE "SDL3headersTargets.cmake" 4304 NAMESPACE SDL3:: 4305 DESTINATION "${SDL_SDL_INSTALL_CMAKEDIR}" 4306 ) 4307 4308 if(SDL_SHARED) 4309 install(EXPORT SDL3sharedTargets 4310 FILE "SDL3sharedTargets.cmake" 4311 NAMESPACE SDL3:: 4312 DESTINATION "${SDL_SDL_INSTALL_CMAKEDIR}" 4313 ) 4314 endif() 4315 4316 if(SDL_STATIC) 4317 install(EXPORT SDL3staticTargets 4318 FILE "${SDL_SDLstatic_INSTALL_CMAKEFILENAME}" 4319 NAMESPACE SDL3:: 4320 DESTINATION "${SDL_SDLstatic_INSTALL_CMAKEDIR}" 4321 ) 4322 endif() 4323 4324 if(SDL_TEST_LIBRARY) 4325 install(EXPORT SDL3testTargets 4326 FILE "${SDL_SDLtest_INSTALL_CMAKEFILENAME}" 4327 NAMESPACE SDL3:: 4328 DESTINATION "${SDL_SDLtest_INSTALL_CMAKEDIR}" 4329 ) 4330 endif() 4331 4332 install(FILES 4333 ${CMAKE_CURRENT_BINARY_DIR}/SDL3Config.cmake 4334 ${CMAKE_CURRENT_BINARY_DIR}/SDL3ConfigVersion.cmake 4335 ${sdl_cmake_modules} 4336 DESTINATION "${SDL_SDL_INSTALL_REAL_CMAKEDIR}" 4337 ) 4338 4339 if(NOT SDL_FRAMEWORK) 4340 install(FILES ${SDL3_INCLUDE_FILES} 4341 DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/SDL3" 4342 ) 4343 if(SDL_TEST_LIBRARY) 4344 install(FILES ${SDL3_TEST_INCLUDE_FILES} 4345 DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/SDL3" 4346 ) 4347 endif() 4348 4349 install(FILES "LICENSE.txt" DESTINATION "${SDL_INSTALL_LICENSEDIR}") 4350 endif() 4351 4352 if(SDL_INSTALL_CPACK) 4353 if(SDL_FRAMEWORK) 4354 set(CPACK_GENERATOR "DragNDrop") 4355 elseif(MSVC) 4356 set(CPACK_GENERATOR "ZIP") 4357 else() 4358 set(CPACK_GENERATOR "TGZ") 4359 endif() 4360 configure_file(cmake/CPackProjectConfig.cmake.in CPackProjectConfig.cmake @ONLY) 4361 set(CPACK_PROJECT_CONFIG_FILE "${SDL3_BINARY_DIR}/CPackProjectConfig.cmake") 4362 # CPACK_SOURCE_PACKAGE_FILE_NAME must end with "-src" (so we can block creating a source archive) 4363 set(CPACK_SOURCE_PACKAGE_FILE_NAME "SDL${PROJECT_VERSION_MAJOR}-${PROJECT_VERSION}-src") 4364 set(CPACK_PACKAGE_DIRECTORY "${CMAKE_BINARY_DIR}/dist") 4365 include(CPack) 4366 endif() 4367 4368 if(ANDROID) 4369 if(TARGET SDL3-jar) 4370 set(SDL_INSTALL_JAVADIR "${CMAKE_INSTALL_DATAROOTDIR}/java" CACHE PATH "Path where to install java classes + java sources") 4371 set(PROGUARD_RULES_PATH "${CMAKE_CURRENT_SOURCE_DIR}/android-project/app/proguard-rules.pro") 4372 # install_jar or $<TARGET_PROPERTY:SDL3-jar,INSTALL_FILES> does not work on Windows: a SDL3.jar symlink is not generated 4373 install(FILES "${CMAKE_CURRENT_BINARY_DIR}/SDL3-${SDL3_VERSION}.jar" 4374 DESTINATION "${SDL_INSTALL_JAVADIR}/SDL3") 4375 install(FILES "${PROGUARD_RULES_PATH}" RENAME "proguard.txt" 4376 DESTINATION "${SDL_INSTALL_JAVADIR}/SDL3") 4377 configure_package_config_file(cmake/SDL3jarTargets.cmake.in SDL3jarTargets.cmake 4378 INSTALL_DESTINATION "${SDL_SDL_INSTALL_CMAKEDIR}" 4379 PATH_VARS SDL_INSTALL_JAVADIR 4380 NO_CHECK_REQUIRED_COMPONENTS_MACRO 4381 INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}" 4382 ) 4383 install(FILES "${CMAKE_CURRENT_BINARY_DIR}/SDL3jarTargets.cmake" 4384 DESTINATION "${SDL_SDL_INSTALL_CMAKEDIR}" 4385 ) 4386 endif() 4387 if(TARGET SDL3-javasources) 4388 install(FILES "${SDL3_BINARY_DIR}/SDL3-${SDL3_VERSION}-sources.jar" 4389 DESTINATION "${SDL_INSTALL_JAVADIR}/SDL3") 4390 endif() 4391 endif() 4392 4393 if(SDL_INSTALL_DOCS) 4394 SDL_generate_manpages( 4395 HEADERS_DIR "${PROJECT_SOURCE_DIR}/include/SDL3" 4396 SYMBOL "SDL_Init" 4397 WIKIHEADERS_PL_PATH "${CMAKE_CURRENT_SOURCE_DIR}/build-scripts/wikiheaders.pl" 4398 REVISION "${SDL_REVISION}" 4399 ) 4400 if(TARGET SDL3-javadoc) 4401 set(SDL_INSTALL_JAVADOCDIR "${CMAKE_INSTALL_DATAROOTDIR}/javadoc" CACHE PATH "Path where to install SDL3 javadoc") 4402 install(FILES "${SDL3_BINARY_DIR}/SDL3-${SDL3_VERSION}-javadoc.jar" 4403 DESTINATION "${SDL_INSTALL_JAVADOCDIR}/SDL3") 4404 endif() 4405 endif() 4406endif() 4407 4408##### Uninstall target ##### 4409 4410if(SDL_UNINSTALL) 4411 set(HAVE_UNINSTALL ON) 4412 if(NOT TARGET uninstall) 4413 configure_file(cmake/cmake_uninstall.cmake.in cmake_uninstall.cmake IMMEDIATE @ONLY) 4414 4415 add_custom_target(uninstall 4416 COMMAND ${CMAKE_COMMAND} -P "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake") 4417 endif() 4418endif() 4419 4420##### Tests subproject (must appear after the install/uninstall targets) ##### 4421 4422if(SDL_TESTS) 4423 set(HAVE_TESTS ON) 4424 enable_testing() 4425 add_subdirectory(test) 4426endif() 4427 4428##### Examples subproject (must appear after the install/uninstall targets) ##### 4429 4430if(SDL_EXAMPLES) 4431 set(HAVE_EXAMPLES ON) 4432 add_subdirectory(examples) 4433endif() 4434 4435##### Fix Objective C builds ##### 4436string(APPEND CMAKE_OBJC_FLAGS " ${CMAKE_C_FLAGS}") 4437 4438SDL_PrintSummary() 4439debug_show_sdl_deps() 4440[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.