Atlas - CMakeLists.txt

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