Atlas - CMakeLists.txt

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