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