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