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