diff options
Diffstat (limited to 'src/contrib/SDL-3.2.20/CMakeLists.txt')
-rw-r--r-- | src/contrib/SDL-3.2.20/CMakeLists.txt | 3812 |
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 @@ | |||
1 | cmake_minimum_required(VERSION 3.16) | ||
2 | |||
3 | if(NOT DEFINED CMAKE_BUILD_TYPE) | ||
4 | set(cmake_build_type_undefined 1) | ||
5 | endif() | ||
6 | |||
7 | # See docs/release_checklist.md | ||
8 | project(SDL3 LANGUAGES C VERSION "3.2.20") | ||
9 | |||
10 | if(CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR) | ||
11 | set(SDL3_MAINPROJECT ON) | ||
12 | else() | ||
13 | set(SDL3_MAINPROJECT OFF) | ||
14 | endif() | ||
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. | ||
19 | add_compile_options("$<$<C_COMPILER_ID:MSVC>:/utf-8>") | ||
20 | add_compile_options("$<$<CXX_COMPILER_ID:MSVC>:/utf-8>") | ||
21 | |||
22 | # By default, configure SDL3 in RelWithDebInfo configuration | ||
23 | if(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() | ||
37 | endif() | ||
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. | ||
41 | unset(OFF) | ||
42 | unset(ON) | ||
43 | if(POLICY CMP0054) | ||
44 | cmake_policy(SET CMP0054 NEW) | ||
45 | endif() | ||
46 | |||
47 | include(CheckLibraryExists) | ||
48 | include(CheckIncludeFile) | ||
49 | include(CheckLanguage) | ||
50 | include(CheckSymbolExists) | ||
51 | include(CheckCSourceCompiles) | ||
52 | include(CheckCSourceRuns) | ||
53 | include(CheckCCompilerFlag) | ||
54 | include(CheckCXXCompilerFlag) | ||
55 | include(CheckStructHasMember) | ||
56 | include(CMakeDependentOption) | ||
57 | include(CMakeParseArguments) | ||
58 | include(CMakePushCheckState) | ||
59 | include(GNUInstallDirs) | ||
60 | |||
61 | if(NOT DEFINED OpenGL_GL_PREFERENCE) | ||
62 | set(OpenGL_GL_PREFERENCE GLVND) | ||
63 | endif() | ||
64 | |||
65 | find_package(PkgConfig) | ||
66 | |||
67 | list(APPEND CMAKE_MODULE_PATH "${SDL3_SOURCE_DIR}/cmake") | ||
68 | include("${SDL3_SOURCE_DIR}/cmake/macros.cmake") | ||
69 | include("${SDL3_SOURCE_DIR}/cmake/sdlchecks.cmake") | ||
70 | include("${SDL3_SOURCE_DIR}/cmake/sdlcompilers.cmake") | ||
71 | include("${SDL3_SOURCE_DIR}/cmake/sdlcpu.cmake") | ||
72 | include("${SDL3_SOURCE_DIR}/cmake/sdlmanpages.cmake") | ||
73 | include("${SDL3_SOURCE_DIR}/cmake/sdlplatform.cmake") | ||
74 | include("${SDL3_SOURCE_DIR}/cmake/sdltargets.cmake") | ||
75 | include("${SDL3_SOURCE_DIR}/cmake/GetGitRevisionDescription.cmake") | ||
76 | include("${SDL3_SOURCE_DIR}/cmake/3rdparty.cmake") | ||
77 | include("${SDL3_SOURCE_DIR}/cmake/PreseedMSVCCache.cmake") | ||
78 | include("${SDL3_SOURCE_DIR}/cmake/PreseedEmscriptenCache.cmake") | ||
79 | |||
80 | SDL_DetectCompiler() | ||
81 | SDL_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. | ||
86 | set(SDL_SO_VERSION_MAJOR "0") | ||
87 | set(SDL_SO_VERSION_MINOR "${PROJECT_VERSION_MINOR}") | ||
88 | set(SDL_SO_VERSION_PATCH "${PROJECT_VERSION_PATCH}") | ||
89 | set(SDL_SO_VERSION "${SDL_SO_VERSION_MAJOR}.${SDL_SO_VERSION_MINOR}.${SDL_SO_VERSION_PATCH}") | ||
90 | |||
91 | if(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}") | ||
96 | else() | ||
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") | ||
101 | endif() | ||
102 | set(SDL_DYLIB_CURRENT_VERSION_PATCH "0") | ||
103 | set(SDL_DYLIB_COMPAT_VERSION_PATCH "0") | ||
104 | |||
105 | set(SDL_DYLIB_CURRENT_VERSION "${SDL_DYLIB_CURRENT_VERSION_MAJOR}.${SDL_DYLIB_CURRENT_VERSION_MINOR}.${SDL_DYLIB_CURRENT_VERSION_PATCH}") | ||
106 | set(SDL_DYLIB_COMPAT_VERSION "${SDL_DYLIB_COMPAT_VERSION_MAJOR}.${SDL_DYLIB_COMPAT_VERSION_MINOR}.${SDL_DYLIB_COMPAT_VERSION_PATCH}") | ||
107 | |||
108 | message(DEBUG "SDL_SO_VERSION=${SDL_SO_VERSION} SDL_DYLIB_CURRENT_VERSION=${SDL_DYLIB_CURRENT_VERSION} SDL_DYLIB_COMPAT_VERSION=${SDL_DYLIB_COMPAT_VERSION}") | ||
109 | |||
110 | set(SDL_FRAMEWORK_VERSION "A") | ||
111 | |||
112 | set(SDL_CHECK_REQUIRED_INCLUDES "" CACHE STRING "Extra includes (for CMAKE_REQUIRED_INCLUDES)") | ||
113 | set(SDL_CHECK_REQUIRED_LINK_OPTIONS "" CACHE STRING "Extra link options (for CMAKE_REQUIRED_LINK_OPTIONS)") | ||
114 | mark_as_advanced(SDL_CHECK_REQUIRED_INCLUDES SDL_CHECK_REQUIRED_LINK_OPTIONS) | ||
115 | |||
116 | string(APPEND CMAKE_REQUIRED_FLAGS " -D_GNU_SOURCE=1") | ||
117 | list(APPEND CMAKE_REQUIRED_INCLUDES ${SDL_CHECK_REQUIRED_INCLUDES}) | ||
118 | list(APPEND CMAKE_REQUIRED_LINK_OPTIONS ${SDL_CHECK_REQUIRED_LINK_OPTIONS}) | ||
119 | |||
120 | # Get the platform | ||
121 | SDL_DetectCMakePlatform() | ||
122 | |||
123 | # Don't mistake macOS for unix | ||
124 | if(UNIX AND NOT ANDROID AND NOT APPLE AND NOT RISCOS) | ||
125 | set(UNIX_SYS ON) | ||
126 | else() | ||
127 | set(UNIX_SYS OFF) | ||
128 | endif() | ||
129 | |||
130 | if(UNIX OR APPLE) | ||
131 | set(UNIX_OR_MAC_SYS ON) | ||
132 | else() | ||
133 | set(UNIX_OR_MAC_SYS OFF) | ||
134 | endif() | ||
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. | ||
143 | if (UNIX_OR_MAC_SYS AND NOT EMSCRIPTEN) | ||
144 | set(SDL_PTHREADS_DEFAULT ON) | ||
145 | else() | ||
146 | set(SDL_PTHREADS_DEFAULT OFF) | ||
147 | endif() | ||
148 | |||
149 | if(UNIX_SYS OR ANDROID) | ||
150 | set(SDL_CLOCK_GETTIME_DEFAULT ON) | ||
151 | else() | ||
152 | set(SDL_CLOCK_GETTIME_DEFAULT OFF) | ||
153 | endif() | ||
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. | ||
158 | if(IOS OR TVOS OR VISIONOS OR WATCHOS OR ANDROID) | ||
159 | set(SDL_HIDAPI_LIBUSB_AVAILABLE FALSE) | ||
160 | else() | ||
161 | set(SDL_HIDAPI_LIBUSB_AVAILABLE TRUE) | ||
162 | endif() | ||
163 | |||
164 | set(SDL_ASSEMBLY_DEFAULT OFF) | ||
165 | if(USE_CLANG OR USE_GCC OR USE_INTELCC OR MSVC_VERSION GREATER 1400) | ||
166 | set(SDL_ASSEMBLY_DEFAULT ON) | ||
167 | endif() | ||
168 | |||
169 | set(SDL_GCC_ATOMICS_DEFAULT OFF) | ||
170 | if(USE_GCC OR USE_CLANG OR USE_INTELCC OR USE_QCC) | ||
171 | set(SDL_GCC_ATOMICS_DEFAULT ON) | ||
172 | endif() | ||
173 | |||
174 | # Default option knobs | ||
175 | set(SDL_LIBC_DEFAULT ON) | ||
176 | set(SDL_SYSTEM_ICONV_DEFAULT ON) | ||
177 | if(WINDOWS OR MACOS OR IOS OR TVOS OR VISIONOS OR WATCHOS) | ||
178 | set(SDL_SYSTEM_ICONV_DEFAULT OFF) | ||
179 | endif() | ||
180 | |||
181 | set(SDL_RELOCATABLE_DEFAULT OFF) | ||
182 | if(MSVC) | ||
183 | set(SDL_RELOCATABLE_DEFAULT ON) | ||
184 | endif() | ||
185 | |||
186 | if(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() | ||
207 | endif() | ||
208 | |||
209 | set(SDL_SHARED_DEFAULT ON) | ||
210 | set(SDL_STATIC_DEFAULT ON) | ||
211 | |||
212 | set(SDL_SHARED_AVAILABLE ON) | ||
213 | set(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. | ||
217 | if(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) | ||
223 | endif() | ||
224 | |||
225 | if(VITA OR PSP OR PS2 OR N3DS OR RISCOS) | ||
226 | set(SDL_SHARED_AVAILABLE OFF) | ||
227 | endif() | ||
228 | |||
229 | if((RISCOS OR UNIX_SYS) AND NOT (LINUX OR NETBSD OR OPENBSD)) | ||
230 | set(SDL_OSS_DEFAULT ON) | ||
231 | else() | ||
232 | set(SDL_OSS_DEFAULT OFF) | ||
233 | endif() | ||
234 | |||
235 | if(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() | ||
247 | endif() | ||
248 | |||
249 | dep_option(SDL_DEPS_SHARED "Load dependencies dynamically" ON SDL_SHARED_AVAILABLE OFF) | ||
250 | |||
251 | set(SDL_SUBSYSTEMS ) | ||
252 | |||
253 | macro(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}") | ||
265 | endmacro() | ||
266 | |||
267 | define_sdl_subsystem(Audio) | ||
268 | define_sdl_subsystem(Video) | ||
269 | define_sdl_subsystem(GPU DEPS SDL_VIDEO) | ||
270 | define_sdl_subsystem(Render DEPS SDL_VIDEO) | ||
271 | define_sdl_subsystem(Camera DEPS SDL_VIDEO) | ||
272 | define_sdl_subsystem(Joystick) | ||
273 | define_sdl_subsystem(Haptic) | ||
274 | define_sdl_subsystem(Hidapi) | ||
275 | define_sdl_subsystem(Power) | ||
276 | define_sdl_subsystem(Sensor) | ||
277 | define_sdl_subsystem(Dialog) | ||
278 | |||
279 | cmake_dependent_option(SDL_FRAMEWORK "Build SDL libraries as Apple Framework" OFF "APPLE" OFF) | ||
280 | if(SDL_FRAMEWORK) | ||
281 | set(SDL_STATIC_AVAILABLE FALSE) | ||
282 | endif() | ||
283 | |||
284 | if(UNIX AND NOT ANDROID AND NOT RISCOS AND NOT SDL_FRAMEWORK) | ||
285 | set(SDL_RPATH_DEFAULT ON) | ||
286 | else() | ||
287 | set(SDL_RPATH_DEFAULT OFF) | ||
288 | endif() | ||
289 | |||
290 | set(SDL_PRESEED_AVAILABLE OFF) | ||
291 | if(COMMAND SDL_Preseed_CMakeCache) | ||
292 | set(SDL_PRESEED_AVAILABLE ON) | ||
293 | endif() | ||
294 | |||
295 | set(SDL_X11_XRANDR_DEFAULT ON) | ||
296 | if(SOLARIS) | ||
297 | set(SDL_X11_XRANDR_DEFAULT OFF) | ||
298 | endif() | ||
299 | |||
300 | # Allow some projects to be built conditionally. | ||
301 | set_option(SDL_INSTALL "Enable installation of SDL3" ${SDL3_MAINPROJECT}) | ||
302 | cmake_dependent_option(SDL_INSTALL_CPACK "Create binary SDL3 archive using CPack" ${SDL3_MAINPROJECT} "SDL_INSTALL" ON) | ||
303 | cmake_dependent_option(SDL_INSTALL_DOCS "Install docs for SDL3" OFF "SDL_INSTALL;NOT SDL_FRAMEWORK" ON) | ||
304 | set_option(SDL_UNINSTALL "Enable uninstallation of SDL3" ${SDL3_MAINPROJECT}) | ||
305 | cmake_dependent_option(SDL_PRESEED "Preseed CMake cache to speed up configuration" ON "${SDL_PRESEED_AVAILABLE}" OFF) | ||
306 | cmake_dependent_option(SDL_RELOCATABLE "Create relocatable SDL package" ${SDL_RELOCATABLE_DEFAULT} "SDL_INSTALL" OFF) | ||
307 | |||
308 | cmake_dependent_option(SDL_ANDROID_JAR "Enable creation of SDL3.jar" ${SDL3_MAINPROJECT} "ANDROID" ON) | ||
309 | |||
310 | option_string(SDL_ASSERTIONS "Enable internal sanity checks (auto/disabled/release/enabled/paranoid)" "auto") | ||
311 | set_option(SDL_ASSEMBLY "Enable assembly routines" ${SDL_ASSEMBLY_DEFAULT}) | ||
312 | dep_option(SDL_AVX "Use AVX assembly routines" ON "SDL_ASSEMBLY;SDL_CPU_X86 OR SDL_CPU_X64" OFF) | ||
313 | dep_option(SDL_AVX2 "Use AVX2 assembly routines" ON "SDL_ASSEMBLY;SDL_CPU_X86 OR SDL_CPU_X64" OFF) | ||
314 | dep_option(SDL_AVX512F "Use AVX512F assembly routines" ON "SDL_ASSEMBLY;SDL_CPU_X86 OR SDL_CPU_X64" OFF) | ||
315 | dep_option(SDL_SSE "Use SSE assembly routines" ON "SDL_ASSEMBLY;SDL_CPU_X86 OR SDL_CPU_X64" OFF) | ||
316 | dep_option(SDL_SSE2 "Use SSE2 assembly routines" ON "SDL_ASSEMBLY;SDL_CPU_X86 OR SDL_CPU_X64" OFF) | ||
317 | dep_option(SDL_SSE3 "Use SSE3 assembly routines" ON "SDL_ASSEMBLY;SDL_CPU_X86 OR SDL_CPU_X64" OFF) | ||
318 | dep_option(SDL_SSE4_1 "Use SSE4.1 assembly routines" ON "SDL_ASSEMBLY;SDL_CPU_X86 OR SDL_CPU_X64" OFF) | ||
319 | dep_option(SDL_SSE4_2 "Use SSE4.2 assembly routines" ON "SDL_ASSEMBLY;SDL_CPU_X86 OR SDL_CPU_X64" OFF) | ||
320 | dep_option(SDL_MMX "Use MMX assembly routines" ON "SDL_ASSEMBLY;SDL_CPU_X86 OR SDL_CPU_X64" OFF) | ||
321 | dep_option(SDL_ALTIVEC "Use Altivec assembly routines" ON "SDL_ASSEMBLY;SDL_CPU_POWERPC32 OR SDL_CPU_POWERPC64" OFF) | ||
322 | dep_option(SDL_ARMNEON "Use NEON assembly routines" ON "SDL_ASSEMBLY;SDL_CPU_ARM32 OR SDL_CPU_ARM64" OFF) | ||
323 | dep_option(SDL_LSX "Use LSX assembly routines" ON "SDL_ASSEMBLY;SDL_CPU_LOONGARCH64" OFF) | ||
324 | dep_option(SDL_LASX "Use LASX assembly routines" ON "SDL_ASSEMBLY;SDL_CPU_LOONGARCH64" OFF) | ||
325 | |||
326 | set_option(SDL_LIBC "Use the system C library" ${SDL_LIBC_DEFAULT}) | ||
327 | set_option(SDL_SYSTEM_ICONV "Use iconv() from system-installed libraries" ${SDL_SYSTEM_ICONV_DEFAULT}) | ||
328 | set_option(SDL_LIBICONV "Prefer iconv() from libiconv, if available, over libc version" OFF) | ||
329 | set_option(SDL_GCC_ATOMICS "Use gcc builtin atomics" ${SDL_GCC_ATOMICS_DEFAULT}) | ||
330 | dep_option(SDL_DBUS "Enable D-Bus support" ON "${UNIX_SYS}" OFF) | ||
331 | dep_option(SDL_LIBURING "Enable liburing support" ON "${UNIX_SYS}" OFF) | ||
332 | dep_option(SDL_DISKAUDIO "Support the disk writer audio driver" ON "SDL_AUDIO" OFF) | ||
333 | dep_option(SDL_DUMMYAUDIO "Support the dummy audio driver" ON "SDL_AUDIO" OFF) | ||
334 | dep_option(SDL_DUMMYVIDEO "Use dummy video driver" ON "SDL_VIDEO" OFF) | ||
335 | dep_option(SDL_IBUS "Enable IBus support" ON "${UNIX_SYS}" OFF) | ||
336 | dep_option(SDL_OPENGL "Include OpenGL support" ON "SDL_VIDEO;NOT IOS;NOT VISIONOS;NOT TVOS;NOT WATCHOS" OFF) | ||
337 | dep_option(SDL_OPENGLES "Include OpenGL ES support" ON "SDL_VIDEO;NOT VISIONOS;NOT TVOS;NOT WATCHOS" OFF) | ||
338 | set_option(SDL_PTHREADS "Use POSIX threads for multi-threading" ${SDL_PTHREADS_DEFAULT}) | ||
339 | dep_option(SDL_PTHREADS_SEM "Use pthread semaphores" ON "SDL_PTHREADS" OFF) | ||
340 | dep_option(SDL_OSS "Support the OSS audio API" ${SDL_OSS_DEFAULT} "UNIX_SYS OR RISCOS;SDL_AUDIO" OFF) | ||
341 | dep_option(SDL_ALSA "Support the ALSA audio API" ${UNIX_SYS} "SDL_AUDIO" OFF) | ||
342 | dep_option(SDL_ALSA_SHARED "Dynamically load ALSA audio support" ON "SDL_ALSA;SDL_DEPS_SHARED" OFF) | ||
343 | dep_option(SDL_JACK "Support the JACK audio API" ${UNIX_SYS} "SDL_AUDIO" OFF) | ||
344 | dep_option(SDL_JACK_SHARED "Dynamically load JACK audio support" ON "SDL_JACK;SDL_DEPS_SHARED" OFF) | ||
345 | set_option(SDL_PIPEWIRE "Use Pipewire audio" ${UNIX_SYS}) | ||
346 | dep_option(SDL_PIPEWIRE_SHARED "Dynamically load Pipewire support" ON "SDL_PIPEWIRE;SDL_DEPS_SHARED" OFF) | ||
347 | dep_option(SDL_PULSEAUDIO "Use PulseAudio" ${UNIX_SYS} "SDL_AUDIO" OFF) | ||
348 | dep_option(SDL_PULSEAUDIO_SHARED "Dynamically load PulseAudio support" ON "SDL_PULSEAUDIO;SDL_DEPS_SHARED" OFF) | ||
349 | dep_option(SDL_SNDIO "Support the sndio audio API" ${UNIX_SYS} "SDL_AUDIO" OFF) | ||
350 | dep_option(SDL_SNDIO_SHARED "Dynamically load the sndio audio API" ON "SDL_SNDIO;SDL_DEPS_SHARED" OFF) | ||
351 | set_option(SDL_RPATH "Use an rpath when linking SDL" ${SDL_RPATH_DEFAULT}) | ||
352 | set_option(SDL_CLOCK_GETTIME "Use clock_gettime() instead of gettimeofday()" ${SDL_CLOCK_GETTIME_DEFAULT}) | ||
353 | dep_option(SDL_X11 "Use X11 video driver" ${UNIX_SYS} "SDL_VIDEO" OFF) | ||
354 | dep_option(SDL_X11_SHARED "Dynamically load X11 support" ON "SDL_X11;SDL_DEPS_SHARED" OFF) | ||
355 | dep_option(SDL_X11_XCURSOR "Enable Xcursor support" ON SDL_X11 OFF) | ||
356 | dep_option(SDL_X11_XDBE "Enable Xdbe support" ON SDL_X11 OFF) | ||
357 | dep_option(SDL_X11_XINPUT "Enable XInput support" ON SDL_X11 OFF) | ||
358 | dep_option(SDL_X11_XFIXES "Enable Xfixes support" ON SDL_X11 OFF) | ||
359 | dep_option(SDL_X11_XRANDR "Enable Xrandr support" "${SDL_X11_XRANDR_DEFAULT}" SDL_X11 OFF) | ||
360 | dep_option(SDL_X11_XSCRNSAVER "Enable Xscrnsaver support" ON SDL_X11 OFF) | ||
361 | dep_option(SDL_X11_XSHAPE "Enable XShape support" ON SDL_X11 OFF) | ||
362 | dep_option(SDL_X11_XSYNC "Enable Xsync support" ON SDL_X11 OFF) | ||
363 | dep_option(SDL_WAYLAND "Use Wayland video driver" ${UNIX_SYS} "SDL_VIDEO" OFF) | ||
364 | dep_option(SDL_WAYLAND_SHARED "Dynamically load Wayland support" ON "SDL_WAYLAND;SDL_DEPS_SHARED" OFF) | ||
365 | dep_option(SDL_WAYLAND_LIBDECOR "Use client-side window decorations on Wayland" ON "SDL_WAYLAND" OFF) | ||
366 | dep_option(SDL_WAYLAND_LIBDECOR_SHARED "Dynamically load libdecor support" ON "SDL_WAYLAND_LIBDECOR;SDL_WAYLAND_SHARED;SDL_DEPS_SHARED" OFF) | ||
367 | dep_option(SDL_RPI "Use Raspberry Pi video driver" ON "SDL_VIDEO;UNIX_SYS;SDL_CPU_ARM32 OR SDL_CPU_ARM64" OFF) | ||
368 | dep_option(SDL_ROCKCHIP "Use ROCKCHIP Hardware Acceleration video driver" ON "SDL_VIDEO;UNIX_SYS;SDL_CPU_ARM32 OR SDL_CPU_ARM64" OFF) | ||
369 | dep_option(SDL_COCOA "Use Cocoa video driver" ON "APPLE" OFF) | ||
370 | dep_option(SDL_DIRECTX "Use DirectX for Windows audio/video" ON "SDL_AUDIO OR SDL_VIDEO;WINDOWS" OFF) | ||
371 | dep_option(SDL_XINPUT "Use Xinput for Windows" ON "WINDOWS" OFF) | ||
372 | dep_option(SDL_WASAPI "Use the Windows WASAPI audio driver" ON "WINDOWS;SDL_AUDIO" OFF) | ||
373 | dep_option(SDL_RENDER_D3D "Enable the Direct3D 9 render driver" ON "SDL_RENDER;SDL_DIRECTX" OFF) | ||
374 | dep_option(SDL_RENDER_D3D11 "Enable the Direct3D 11 render driver" ON "SDL_RENDER;SDL_DIRECTX" OFF) | ||
375 | dep_option(SDL_RENDER_D3D12 "Enable the Direct3D 12 render driver" ON "SDL_RENDER;SDL_DIRECTX" OFF) | ||
376 | dep_option(SDL_RENDER_METAL "Enable the Metal render driver" ON "SDL_RENDER;${APPLE}" OFF) | ||
377 | dep_option(SDL_RENDER_GPU "Enable the SDL_GPU render driver" ON "SDL_RENDER;SDL_GPU" OFF) | ||
378 | dep_option(SDL_VIVANTE "Use Vivante EGL video driver" ON "${UNIX_SYS};SDL_CPU_ARM32" OFF) | ||
379 | dep_option(SDL_VULKAN "Enable Vulkan support" ON "SDL_VIDEO;ANDROID OR APPLE OR LINUX OR FREEBSD OR WINDOWS" OFF) | ||
380 | dep_option(SDL_RENDER_VULKAN "Enable the Vulkan render driver" ON "SDL_RENDER;SDL_VULKAN" OFF) | ||
381 | dep_option(SDL_METAL "Enable Metal support" ON "APPLE" OFF) | ||
382 | set_option(SDL_OPENVR "Use OpenVR video driver" OFF) | ||
383 | dep_option(SDL_KMSDRM "Use KMS DRM video driver" ${UNIX_SYS} "SDL_VIDEO" OFF) | ||
384 | dep_option(SDL_KMSDRM_SHARED "Dynamically load KMS DRM support" ON "SDL_KMSDRM;SDL_DEPS_SHARED" OFF) | ||
385 | set_option(SDL_OFFSCREEN "Use offscreen video driver" ON) | ||
386 | dep_option(SDL_DUMMYCAMERA "Support the dummy camera driver" ON SDL_CAMERA OFF) | ||
387 | option_string(SDL_BACKGROUNDING_SIGNAL "number to use for magic backgrounding signal or 'OFF'" OFF) | ||
388 | option_string(SDL_FOREGROUNDING_SIGNAL "number to use for magic foregrounding signal or 'OFF'" OFF) | ||
389 | dep_option(SDL_HIDAPI "Enable the HIDAPI subsystem" ON "NOT VISIONOS" OFF) | ||
390 | dep_option(SDL_HIDAPI_LIBUSB "Use libusb for low level joystick drivers" ON SDL_HIDAPI_LIBUSB_AVAILABLE OFF) | ||
391 | dep_option(SDL_HIDAPI_LIBUSB_SHARED "Dynamically load libusb support" ON "SDL_HIDAPI_LIBUSB;SDL_DEPS_SHARED" OFF) | ||
392 | dep_option(SDL_HIDAPI_JOYSTICK "Use HIDAPI for low level joystick drivers" ON SDL_HIDAPI OFF) | ||
393 | dep_option(SDL_VIRTUAL_JOYSTICK "Enable the virtual-joystick driver" ON SDL_HIDAPI OFF) | ||
394 | set_option(SDL_LIBUDEV "Enable libudev support" ON) | ||
395 | set_option(SDL_ASAN "Use AddressSanitizer to detect memory errors" OFF) | ||
396 | set_option(SDL_CCACHE "Use Ccache to speed up build" OFF) | ||
397 | set_option(SDL_CLANG_TIDY "Run clang-tidy static analysis" OFF) | ||
398 | set_option(SDL_GPU_DXVK "Build SDL_GPU with DXVK support" OFF) | ||
399 | |||
400 | set(SDL_VENDOR_INFO "" CACHE STRING "Vendor name and/or version to add to SDL_REVISION") | ||
401 | |||
402 | cmake_dependent_option(SDL_SHARED "Build a shared version of the library" ${SDL_SHARED_DEFAULT} ${SDL_SHARED_AVAILABLE} OFF) | ||
403 | cmake_dependent_option(SDL_STATIC "Build a static version of the library" ${SDL_STATIC_DEFAULT} ${SDL_STATIC_AVAILABLE} OFF) | ||
404 | option(SDL_TEST_LIBRARY "Build the SDL3_test library" ON) | ||
405 | |||
406 | dep_option(SDL_TESTS "Build the test directory" OFF SDL_TEST_LIBRARY OFF) | ||
407 | dep_option(SDL_INSTALL_TESTS "Install test-cases" OFF "SDL_INSTALL;NOT SDL_FRAMEWORK" OFF) | ||
408 | dep_option(SDL_TESTS_LINK_SHARED "link tests to shared SDL library" "${SDL_SHARED}" "SDL_SHARED;SDL_STATIC" "${SDL_SHARED}") | ||
409 | set(SDL_TESTS_TIMEOUT_MULTIPLIER "1" CACHE STRING "Timeout multiplier to account for really slow machines") | ||
410 | |||
411 | set_option(SDL_EXAMPLES "Build the examples directory") | ||
412 | dep_option(SDL_EXAMPLES_LINK_SHARED "link examples to shared SDL library" "${SDL_SHARED}" "SDL_SHARED;SDL_STATIC" "${SDL_SHARED}") | ||
413 | |||
414 | if(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) | ||
417 | endif() | ||
418 | |||
419 | if(NOT (SDL_SHARED OR SDL_STATIC)) | ||
420 | message(FATAL_ERROR "SDL_SHARED and SDL_STATIC cannot both be disabled") | ||
421 | endif() | ||
422 | |||
423 | if(SDL_PRESEED) | ||
424 | SDL_Preseed_CMakeCache() | ||
425 | endif() | ||
426 | |||
427 | if(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() | ||
436 | endif() | ||
437 | |||
438 | if(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() | ||
447 | endif() | ||
448 | |||
449 | if(SDL_TEST_LIBRARY) | ||
450 | add_library(SDL3_test STATIC) | ||
451 | add_library(SDL3::SDL3_test ALIAS SDL3_test) | ||
452 | SDL_AddCommonCompilerFlags(SDL3_test) | ||
453 | endif() | ||
454 | |||
455 | # Make sure SDL3::SDL3 always exists | ||
456 | if(TARGET SDL3::SDL3-shared) | ||
457 | add_library(SDL3::SDL3 ALIAS SDL3-shared) | ||
458 | else() | ||
459 | add_library(SDL3::SDL3 ALIAS SDL3-static) | ||
460 | endif() | ||
461 | |||
462 | sdl_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 | ||
466 | check_symbol_exists("__GLIBC__" "stdlib.h" LIBC_IS_GLIBC) | ||
467 | if (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") | ||
472 | endif() | ||
473 | |||
474 | check_linker_supports_version_file(HAVE_WL_VERSION_SCRIPT) | ||
475 | if(HAVE_WL_VERSION_SCRIPT) | ||
476 | sdl_shared_link_options("-Wl,--version-script=${CMAKE_CURRENT_SOURCE_DIR}/src/dynapi/SDL_dynapi.sym") | ||
477 | else() | ||
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() | ||
481 | endif() | ||
482 | |||
483 | if(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() | ||
494 | endif() | ||
495 | |||
496 | # General includes | ||
497 | sdl_compile_definitions(PRIVATE "USING_GENERATED_CONFIG_H") | ||
498 | sdl_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. | ||
505 | if(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>") | ||
507 | else() | ||
508 | sdl_include_directories(NO_EXPORT SYSTEM PRIVATE "$<BUILD_INTERFACE:${SDL3_SOURCE_DIR}/src/video/khronos>") | ||
509 | endif() | ||
510 | |||
511 | if(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() | ||
527 | endif() | ||
528 | |||
529 | if(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) | ||
541 | endif() | ||
542 | |||
543 | set(SDL_DEFAULT_ASSERT_LEVEL_CONFIGURED 1) | ||
544 | if(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) | ||
548 | elseif(SDL_ASSERTIONS MATCHES "^(disabled|0)$") | ||
549 | set(SDL_DEFAULT_ASSERT_LEVEL 0) | ||
550 | elseif(SDL_ASSERTIONS MATCHES "^(release|1)$") | ||
551 | set(SDL_DEFAULT_ASSERT_LEVEL 1) | ||
552 | elseif(SDL_ASSERTIONS MATCHES "^(enabled|2)$") | ||
553 | set(SDL_DEFAULT_ASSERT_LEVEL 2) | ||
554 | elseif(SDL_ASSERTIONS MATCHES "^(paranoid|3)$") | ||
555 | set(SDL_DEFAULT_ASSERT_LEVEL 3) | ||
556 | else() | ||
557 | message(FATAL_ERROR "unknown assertion level") | ||
558 | endif() | ||
559 | set(HAVE_ASSERTIONS ${SDL_ASSERTIONS}) | ||
560 | |||
561 | if(NOT SDL_BACKGROUNDING_SIGNAL STREQUAL "OFF") | ||
562 | sdl_compile_definitions(PRIVATE "SDL_BACKGROUNDING_SIGNAL=${SDL_BACKGROUNDING_SIGNAL}") | ||
563 | endif() | ||
564 | |||
565 | if(NOT SDL_FOREGROUNDING_SIGNAL STREQUAL "OFF") | ||
566 | sdl_compile_definitions(PRIVATE "SDL_FOREGROUNDING_SIGNAL=${SDL_FOREGROUNDING_SIGNAL}") | ||
567 | endif() | ||
568 | |||
569 | # Compiler option evaluation | ||
570 | if(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() | ||
625 | endif() | ||
626 | |||
627 | if(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() | ||
645 | endif() | ||
646 | |||
647 | if(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-") | ||
651 | endif() | ||
652 | |||
653 | if(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() | ||
921 | endif() | ||
922 | |||
923 | if(NOT HAVE_MMX) | ||
924 | set(SDL_DISABLE_MMX 1) | ||
925 | endif() | ||
926 | |||
927 | if(NOT HAVE_SSE) | ||
928 | set(SDL_DISABLE_SSE 1) | ||
929 | endif() | ||
930 | |||
931 | if(NOT HAVE_SSE2) | ||
932 | set(SDL_DISABLE_SSE2 1) | ||
933 | endif() | ||
934 | |||
935 | if(NOT HAVE_SSE3) | ||
936 | set(SDL_DISABLE_SSE3 1) | ||
937 | endif() | ||
938 | |||
939 | if(NOT HAVE_SSE4_1) | ||
940 | set(SDL_DISABLE_SSE4_1 1) | ||
941 | endif() | ||
942 | |||
943 | if(NOT HAVE_SSE4_2) | ||
944 | set(SDL_DISABLE_SSE4_2 1) | ||
945 | endif() | ||
946 | |||
947 | if(NOT HAVE_AVX) | ||
948 | set(SDL_DISABLE_AVX 1) | ||
949 | endif() | ||
950 | |||
951 | if(NOT HAVE_AVX2) | ||
952 | set(SDL_DISABLE_AVX2 1) | ||
953 | endif() | ||
954 | |||
955 | if(NOT HAVE_AVX512F) | ||
956 | set(SDL_DISABLE_AVX512F 1) | ||
957 | endif() | ||
958 | |||
959 | if(NOT HAVE_LSX) | ||
960 | set(SDL_DISABLE_LSX 1) | ||
961 | endif() | ||
962 | |||
963 | if(NOT HAVE_LASX) | ||
964 | set(SDL_DISABLE_LASX 1) | ||
965 | endif() | ||
966 | |||
967 | if(NOT HAVE_ARMNEON) | ||
968 | set(SDL_DISABLE_NEON 1) | ||
969 | endif() | ||
970 | |||
971 | set(SDL_DISABLE_ALLOCA 0) | ||
972 | check_include_file("alloca.h" "HAVE_ALLOCA_H") | ||
973 | if(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() | ||
979 | endif() | ||
980 | |||
981 | # TODO: Can't deactivate on FreeBSD? w/o LIBC, SDL_stdinc.h can't define anything. | ||
982 | if(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() | ||
1148 | else() | ||
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() | ||
1165 | endif() | ||
1166 | |||
1167 | # General source files | ||
1168 | sdl_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. | ||
1201 | file(GLOB SDL_UCLIBC_SOURCES "${SDL3_SOURCE_DIR}/src/libm/*.c") | ||
1202 | add_library(SDL_uclibc STATIC "${SDL_UCLIBC_SOURCES}") | ||
1203 | target_compile_definitions(SDL_uclibc PRIVATE USING_GENERATED_CONFIG_H) | ||
1204 | target_include_directories(SDL_uclibc PRIVATE "${SDL3_BINARY_DIR}/include-config-$<LOWER_CASE:$<CONFIG>>/build_config") | ||
1205 | target_include_directories(SDL_uclibc PRIVATE "${SDL3_SOURCE_DIR}/src") | ||
1206 | target_include_directories(SDL_uclibc PRIVATE "${SDL3_SOURCE_DIR}/include") | ||
1207 | SDL_AddCommonCompilerFlags(SDL_uclibc) | ||
1208 | sdl_sources(STATIC "$<TARGET_OBJECTS:SDL_uclibc>") | ||
1209 | if(TARGET SDL3-shared) | ||
1210 | target_link_libraries(SDL3-shared PRIVATE SDL_uclibc) | ||
1211 | endif() | ||
1212 | if(HAVE_GCC_FVISIBILITY) | ||
1213 | set_property(TARGET SDL_uclibc PROPERTY C_VISIBILITY_PRESET "hidden") | ||
1214 | endif() | ||
1215 | |||
1216 | # Enable/disable various subsystems of the SDL library | ||
1217 | foreach(_SUB ${SDL_SUBSYSTEMS}) | ||
1218 | string(TOUPPER ${_SUB} _OPT) | ||
1219 | if(NOT SDL_${_OPT}) | ||
1220 | set(SDL_${_OPT}_DISABLED 1) | ||
1221 | endif() | ||
1222 | endforeach() | ||
1223 | if(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() | ||
1228 | endif() | ||
1229 | |||
1230 | |||
1231 | # General SDL subsystem options, valid for all platforms | ||
1232 | if(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() | ||
1246 | endif() | ||
1247 | |||
1248 | if(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() | ||
1263 | endif() | ||
1264 | |||
1265 | if(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() | ||
1274 | endif() | ||
1275 | |||
1276 | if(UNIX OR APPLE OR HAIKU OR RISCOS) | ||
1277 | CheckO_CLOEXEC() | ||
1278 | endif() | ||
1279 | |||
1280 | if(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() | ||
1286 | endif() | ||
1287 | |||
1288 | if(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() | ||
1295 | endif() | ||
1296 | |||
1297 | # Platform-specific options and settings | ||
1298 | if(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 | |||
1490 | if(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") | ||
1493 | endif() | ||
1494 | |||
1495 | elseif(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 | |||
1570 | elseif(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() | ||
1904 | elseif(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 | |||
2174 | elseif(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 | |||
2487 | elseif(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 | |||
2549 | elseif(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 | |||
2585 | elseif(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 | |||
2744 | elseif(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 | |||
2815 | elseif(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 | ) | ||
2874 | elseif(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") | ||
2938 | endif() | ||
2939 | |||
2940 | sdl_sources(${SDL3_SOURCE_DIR}/src/dialog/SDL_dialog.c) | ||
2941 | if (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() | ||
2961 | endif() | ||
2962 | |||
2963 | sdl_sources("${SDL3_SOURCE_DIR}/src/process/SDL_process.c") | ||
2964 | if(WINDOWS) | ||
2965 | sdl_glob_sources("${SDL3_SOURCE_DIR}/src/process/windows/*.c") | ||
2966 | set(SDL_PROCESS_WINDOWS 1) | ||
2967 | set(HAVE_SDL_PROCESS TRUE) | ||
2968 | else() | ||
2969 | check_c_source_compiles(" | ||
2970 | #include <spawn.h> | ||
2971 | #include <unistd.h> | ||
2972 | |||
2973 | int 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() | ||
3010 | endif() | ||
3011 | |||
3012 | # Platform-independent options | ||
3013 | |||
3014 | if(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() | ||
3021 | endif() | ||
3022 | |||
3023 | sdl_glob_sources(${SDL3_SOURCE_DIR}/src/tray/*.c) | ||
3024 | |||
3025 | if(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() | ||
3045 | endif() | ||
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. | ||
3055 | if(NOT HAVE_SDL_AUDIO) | ||
3056 | set(SDL_AUDIO_DRIVER_DUMMY 1) | ||
3057 | sdl_glob_sources("${SDL3_SOURCE_DIR}/src/audio/dummy/*.c") | ||
3058 | endif() | ||
3059 | if(NOT HAVE_SDL_VIDEO) | ||
3060 | set(SDL_VIDEO_DRIVER_DUMMY 1) | ||
3061 | sdl_glob_sources("${SDL3_SOURCE_DIR}/src/video/dummy/*.c") | ||
3062 | endif() | ||
3063 | if(NOT HAVE_SDL_JOYSTICK) | ||
3064 | set(SDL_JOYSTICK_DUMMY 1) | ||
3065 | sdl_glob_sources("${SDL3_SOURCE_DIR}/src/joystick/dummy/*.c") | ||
3066 | endif() | ||
3067 | if(NOT HAVE_SDL_HAPTIC) | ||
3068 | set(SDL_HAPTIC_DUMMY 1) | ||
3069 | sdl_glob_sources("${SDL3_SOURCE_DIR}/src/haptic/dummy/*.c") | ||
3070 | endif() | ||
3071 | if(NOT HAVE_SDL_SENSORS) | ||
3072 | set(SDL_SENSOR_DUMMY 1) | ||
3073 | sdl_glob_sources("${SDL3_SOURCE_DIR}/src/sensor/dummy/*.c") | ||
3074 | endif() | ||
3075 | if(NOT HAVE_SDL_LOADSO) | ||
3076 | set(SDL_LOADSO_DUMMY 1) | ||
3077 | sdl_glob_sources("${SDL3_SOURCE_DIR}/src/loadso/dummy/*.c") | ||
3078 | endif() | ||
3079 | if(NOT HAVE_SDL_FILESYSTEM) | ||
3080 | set(SDL_FILESYSTEM_DUMMY 1) | ||
3081 | sdl_glob_sources("${SDL3_SOURCE_DIR}/src/filesystem/dummy/*.c") | ||
3082 | endif() | ||
3083 | if(NOT HAVE_SDL_STORAGE) | ||
3084 | set(SDL_STORAGE_GENERIC 1) | ||
3085 | sdl_glob_sources("${SDL3_SOURCE_DIR}/src/storage/generic/*.c") | ||
3086 | endif() | ||
3087 | if(NOT HAVE_SDL_FSOPS) | ||
3088 | set(SDL_FSOPS_DUMMY 1) | ||
3089 | sdl_sources("${SDL3_SOURCE_DIR}/src/filesystem/dummy/SDL_sysfsops.c") | ||
3090 | endif() | ||
3091 | if(NOT HAVE_SDL_LOCALE) | ||
3092 | set(SDL_LOCALE_DUMMY 1) | ||
3093 | sdl_glob_sources("${SDL3_SOURCE_DIR}/src/locale/dummy/*.c") | ||
3094 | endif() | ||
3095 | if(NOT HAVE_SDL_MISC) | ||
3096 | set(SDL_MISC_DUMMY 1) | ||
3097 | sdl_glob_sources("${SDL3_SOURCE_DIR}/src/misc/dummy/*.c") | ||
3098 | endif() | ||
3099 | if(NOT HAVE_SDL_DIALOG) | ||
3100 | set(SDL_DIALOG_DUMMY 1) | ||
3101 | sdl_sources(${SDL3_SOURCE_DIR}/src/dialog/dummy/SDL_dummydialog.c) | ||
3102 | endif() | ||
3103 | if(NOT HAVE_SDL_PROCESS) | ||
3104 | set(SDL_PROCESS_DUMMY 1) | ||
3105 | sdl_glob_sources(${SDL3_SOURCE_DIR}/src/process/dummy/*.c) | ||
3106 | endif() | ||
3107 | if(NOT HAVE_SDL_TRAY) | ||
3108 | set(SDL_TRAY_DUMMY 1) | ||
3109 | sdl_glob_sources(${SDL3_SOURCE_DIR}/src/tray/dummy/*.c) | ||
3110 | endif() | ||
3111 | if(NOT HAVE_CAMERA) | ||
3112 | set(SDL_CAMERA_DRIVER_DUMMY 1) | ||
3113 | sdl_glob_sources("${SDL3_SOURCE_DIR}/src/camera/dummy/*.c") | ||
3114 | endif() | ||
3115 | |||
3116 | # We always need to have threads and timers around | ||
3117 | if(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() | ||
3125 | endif() | ||
3126 | if(NOT HAVE_SDL_TIMERS) | ||
3127 | message(FATAL_ERROR "Timers are needed by many SDL subsystems and may not be disabled") | ||
3128 | endif() | ||
3129 | |||
3130 | # Most platforms use this. | ||
3131 | if(NOT HAVE_SDL_MAIN_CALLBACKS) | ||
3132 | sdl_glob_sources("${SDL3_SOURCE_DIR}/src/main/generic/*.c") | ||
3133 | endif() | ||
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@` | ||
3137 | configure_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) | ||
3140 | file(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 | |||
3145 | file(GLOB SDL3_INCLUDE_FILES "${SDL3_SOURCE_DIR}/include/SDL3/*.h") | ||
3146 | file(GLOB SDL3_TEST_INCLUDE_FILES "${SDL3_SOURCE_DIR}/include/SDL3/SDL_test*.h") | ||
3147 | foreach(_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() | ||
3151 | endforeach() | ||
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. | ||
3155 | if(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) | ||
3159 | else() | ||
3160 | set(SDL_REVISION "" CACHE STRING "Custom SDL revision (only used when REVISION.txt does not exist)") | ||
3161 | endif() | ||
3162 | if(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}") | ||
3166 | endif() | ||
3167 | |||
3168 | execute_process(COMMAND "${CMAKE_COMMAND}" -E make_directory "${SDL3_BINARY_DIR}/include-revision/SDL3") | ||
3169 | configure_file(include/build_config/SDL_revision.h.cmake include-revision/SDL3/SDL_revision.h @ONLY) | ||
3170 | list(APPEND SDL3_INCLUDE_FILES "${SDL3_BINARY_DIR}/include-revision/SDL3/SDL_revision.h") | ||
3171 | |||
3172 | if(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}) | ||
3176 | endif() | ||
3177 | |||
3178 | if((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") | ||
3182 | else() | ||
3183 | set(sdl_static_libname "SDL3") | ||
3184 | endif() | ||
3185 | |||
3186 | macro(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() | ||
3198 | endmacro() | ||
3199 | |||
3200 | macro(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() | ||
3205 | endmacro() | ||
3206 | |||
3207 | macro(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() | ||
3232 | endmacro() | ||
3233 | |||
3234 | # enable AddressSanitizer if supported | ||
3235 | if(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() | ||
3253 | endif() | ||
3254 | |||
3255 | if(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() | ||
3265 | else() | ||
3266 | set(HAVE_CCACHE OFF) | ||
3267 | endif() | ||
3268 | |||
3269 | if(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() | ||
3289 | endif() | ||
3290 | |||
3291 | if(SDL_TESTS) | ||
3292 | set(HAVE_TESTS ON) | ||
3293 | endif() | ||
3294 | |||
3295 | if(CMAKE_SIZEOF_VOID_P EQUAL 8) | ||
3296 | set(ARCH_64 TRUE) | ||
3297 | else() | ||
3298 | set(ARCH_64 FALSE) | ||
3299 | endif() | ||
3300 | |||
3301 | if(ANDROID) | ||
3302 | sdl_include_directories(PRIVATE SYSTEM "${CMAKE_ANDROID_NDK}/sources/android/cpufeatures") | ||
3303 | endif() | ||
3304 | |||
3305 | if(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") | ||
3313 | endif() | ||
3314 | |||
3315 | if(PS2) | ||
3316 | sdl_compile_options(PRIVATE "-Wno-error=declaration-after-statement") | ||
3317 | endif() | ||
3318 | |||
3319 | if(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() | ||
3335 | endif() | ||
3336 | |||
3337 | if(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() | ||
3348 | endif() | ||
3349 | |||
3350 | # Disable precompiled headers on SDL_dynapi.c to avoid applying dynapi overrides | ||
3351 | set_source_files_properties(src/dynapi/SDL_dynapi.c PROPERTIES SKIP_PRECOMPILE_HEADERS 1) | ||
3352 | |||
3353 | set(SDL_FRAMEWORK_RESOURCES | ||
3354 | LICENSE.txt | ||
3355 | README.md | ||
3356 | ) | ||
3357 | if(SDL_FRAMEWORK) | ||
3358 | sdl_sources(${SDL_FRAMEWORK_RESOURCES}) | ||
3359 | endif() | ||
3360 | |||
3361 | add_library(SDL3_Headers INTERFACE) | ||
3362 | add_library(SDL3::Headers ALIAS SDL3_Headers) | ||
3363 | set_property(TARGET SDL3_Headers PROPERTY EXPORT_NAME "Headers") | ||
3364 | target_include_directories(SDL3_Headers | ||
3365 | INTERFACE | ||
3366 | "$<BUILD_INTERFACE:${SDL3_BINARY_DIR}/include-revision>" | ||
3367 | "$<BUILD_INTERFACE:${SDL3_SOURCE_DIR}/include>" | ||
3368 | ) | ||
3369 | if(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 | ) | ||
3379 | else() | ||
3380 | target_include_directories(SDL3_Headers | ||
3381 | INTERFACE | ||
3382 | "$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>" | ||
3383 | ) | ||
3384 | endif() | ||
3385 | |||
3386 | if(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() | ||
3477 | endif() | ||
3478 | |||
3479 | if(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() | ||
3501 | endif() | ||
3502 | |||
3503 | sdl_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 | |||
3512 | if(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}") | ||
3532 | endif() | ||
3533 | |||
3534 | ##### Configure installation folders ##### | ||
3535 | |||
3536 | if(WINDOWS AND NOT MINGW) | ||
3537 | set(SDL_INSTALL_CMAKEDIR_ROOT_DEFAULT "cmake") | ||
3538 | else() | ||
3539 | set(SDL_INSTALL_CMAKEDIR_ROOT_DEFAULT "${CMAKE_INSTALL_LIBDIR}/cmake/SDL3") | ||
3540 | endif() | ||
3541 | set(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 | |||
3543 | if(FREEBSD) | ||
3544 | # FreeBSD uses ${PREFIX}/libdata/pkgconfig | ||
3545 | set(SDL_PKGCONFIG_INSTALLDIR "libdata/pkgconfig") | ||
3546 | else() | ||
3547 | set(SDL_PKGCONFIG_INSTALLDIR "${CMAKE_INSTALL_LIBDIR}/pkgconfig") | ||
3548 | endif() | ||
3549 | |||
3550 | if(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") | ||
3554 | elseif(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") | ||
3558 | else() | ||
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") | ||
3562 | endif() | ||
3563 | |||
3564 | if(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") | ||
3573 | else() | ||
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") | ||
3586 | endif() | ||
3587 | |||
3588 | export(TARGETS SDL3_Headers NAMESPACE "SDL3::" FILE "SDL3headersTargets.cmake") | ||
3589 | |||
3590 | if(SDL_SHARED) | ||
3591 | export(TARGETS SDL3-shared NAMESPACE "SDL3::" FILE "SDL3sharedTargets.cmake") | ||
3592 | endif() | ||
3593 | |||
3594 | if(SDL_STATIC) | ||
3595 | export(TARGETS SDL3-static NAMESPACE "SDL3::" FILE "SDL3staticTargets.cmake") | ||
3596 | endif() | ||
3597 | |||
3598 | if(SDL_TEST_LIBRARY) | ||
3599 | export(TARGETS SDL3_test NAMESPACE "SDL3::" FILE "SDL3testTargets.cmake") | ||
3600 | endif() | ||
3601 | |||
3602 | sdl_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 | ) | ||
3606 | sdl_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 | |||
3611 | include(CMakePackageConfigHelpers) | ||
3612 | configure_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 | ) | ||
3617 | write_basic_package_version_file("${CMAKE_CURRENT_BINARY_DIR}/SDL3ConfigVersion.cmake" | ||
3618 | COMPATIBILITY AnyNewerVersion | ||
3619 | ) | ||
3620 | |||
3621 | sdl_cmake_config_required_modules(sdl_cmake_modules) | ||
3622 | if(sdl_cmake_modules) | ||
3623 | execute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different ${sdl_cmake_modules} "${SDL3_BINARY_DIR}") | ||
3624 | endif() | ||
3625 | |||
3626 | if(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() | ||
3780 | endif() | ||
3781 | |||
3782 | ##### Uninstall target ##### | ||
3783 | |||
3784 | if(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() | ||
3791 | endif() | ||
3792 | |||
3793 | ##### Tests subproject (must appear after the install/uninstall targets) ##### | ||
3794 | |||
3795 | if(SDL_TESTS) | ||
3796 | set(HAVE_TESTS ON) | ||
3797 | enable_testing() | ||
3798 | add_subdirectory(test) | ||
3799 | endif() | ||
3800 | |||
3801 | ##### Examples subproject (must appear after the install/uninstall targets) ##### | ||
3802 | |||
3803 | if(SDL_EXAMPLES) | ||
3804 | set(HAVE_EXAMPLES ON) | ||
3805 | add_subdirectory(examples) | ||
3806 | endif() | ||
3807 | |||
3808 | ##### Fix Objective C builds ##### | ||
3809 | string(APPEND CMAKE_OBJC_FLAGS " ${CMAKE_C_FLAGS}") | ||
3810 | |||
3811 | SDL_PrintSummary() | ||
3812 | debug_show_sdl_deps() | ||