Atlas - CMakeLists.txt

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