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()