Fix svace issue
[platform/upstream/SDL.git] / CMakeLists.txt
1 if(${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_BINARY_DIR})
2   message(FATAL_ERROR "Prevented in-tree built. Please create a build directory outside of the SDL source code and call cmake from there")
3 endif()
4
5 cmake_minimum_required(VERSION 3.0.0)
6 project(SDL2 C CXX)
7
8 if(WINDOWS_STORE)
9   enable_language(CXX)
10   cmake_minimum_required(VERSION 3.11)
11   add_definitions(-DSDL_BUILDING_WINRT=1 -ZW)
12   link_libraries(
13     -nodefaultlib:vccorlib$<$<CONFIG:Debug>:d>
14     -nodefaultlib:msvcrt$<$<CONFIG:Debug>:d>
15     vccorlib$<$<CONFIG:Debug>:d>.lib
16     msvcrt$<$<CONFIG:Debug>:d>.lib
17   )
18 endif()
19
20 # !!! FIXME: this should probably do "MACOSX_RPATH ON" as a target property
21 # !!! FIXME:  for the SDL2 shared library (so you get an
22 # !!! FIXME:  install_name ("soname") of "@rpath/libSDL-whatever.dylib"
23 # !!! FIXME:  instead of "/usr/local/lib/libSDL-whatever.dylib"), but I'm
24 # !!! FIXME:  punting for now and leaving the existing behavior. Until this
25 # !!! FIXME:  properly resolved, this line silences a warning in CMake 3.0+.
26 # !!! FIXME:  remove it and this comment entirely once the problem is
27 # !!! FIXME:  properly resolved.
28 #cmake_policy(SET CMP0042 OLD)
29
30 include(CheckLibraryExists)
31 include(CheckIncludeFiles)
32 include(CheckIncludeFile)
33 include(CheckSymbolExists)
34 include(CheckCSourceCompiles)
35 include(CheckCSourceRuns)
36 include(CheckCCompilerFlag)
37 include(CheckTypeSize)
38 include(CheckStructHasMember)
39 include(CMakeDependentOption)
40 include(FindPkgConfig)
41 include(GNUInstallDirs)
42 set(CMAKE_MODULE_PATH "${SDL2_SOURCE_DIR}/cmake")
43 include(${SDL2_SOURCE_DIR}/cmake/macros.cmake)
44 include(${SDL2_SOURCE_DIR}/cmake/sdlchecks.cmake)
45
46 # General settings
47 # Edit include/SDL_version.h and change the version, then:
48 #   SDL_MICRO_VERSION += 1;
49 #   SDL_INTERFACE_AGE += 1;
50 #   SDL_BINARY_AGE += 1;
51 # if any functions have been added, set SDL_INTERFACE_AGE to 0.
52 # if backwards compatibility has been broken,
53 # set SDL_BINARY_AGE and SDL_INTERFACE_AGE to 0.
54 set(SDL_MAJOR_VERSION 2)
55 set(SDL_MINOR_VERSION 0)
56 set(SDL_MICRO_VERSION 14)
57 set(SDL_INTERFACE_AGE 0)
58 set(SDL_BINARY_AGE 14)
59 set(SDL_VERSION "${SDL_MAJOR_VERSION}.${SDL_MINOR_VERSION}.${SDL_MICRO_VERSION}")
60 # the following should match the versions in Xcode project file:
61 set(DYLIB_CURRENT_VERSION 15.0.0)
62 set(DYLIB_COMPATIBILITY_VERSION 1.0.0)
63
64 # Set defaults preventing destination file conflicts
65 set(SDL_CMAKE_DEBUG_POSTFIX "d"
66     CACHE STRING "Name suffix for debug builds")
67
68 mark_as_advanced(CMAKE_IMPORT_LIBRARY_SUFFIX SDL_CMAKE_DEBUG_POSTFIX)
69
70 # Calculate a libtool-like version number
71 math(EXPR LT_CURRENT "${SDL_MICRO_VERSION} - ${SDL_INTERFACE_AGE}")
72 math(EXPR LT_AGE "${SDL_BINARY_AGE} - ${SDL_INTERFACE_AGE}")
73 math(EXPR LT_MAJOR "${LT_CURRENT}- ${LT_AGE}")
74 set(LT_REVISION "${SDL_INTERFACE_AGE}")
75 set(LT_RELEASE "${SDL_MAJOR_VERSION}.${SDL_MINOR_VERSION}")
76 set(LT_VERSION "${LT_MAJOR}.${LT_AGE}.${LT_REVISION}")
77
78 #message(STATUS "${LT_VERSION} :: ${LT_AGE} :: ${LT_REVISION} :: ${LT_CURRENT} :: ${LT_RELEASE}")
79
80 # General settings & flags
81 set(LIBRARY_OUTPUT_DIRECTORY "build")
82 # Check for 64 or 32 bit
83 set(SIZEOF_VOIDP ${CMAKE_SIZEOF_VOID_P})
84 if(CMAKE_SIZEOF_VOID_P EQUAL 8)
85   set(ARCH_64 TRUE)
86   set(PROCESSOR_ARCH "x64")
87 else()
88   set(ARCH_64 FALSE)
89   set(PROCESSOR_ARCH "x86")
90 endif()
91 set(LIBNAME SDL2)
92 if(NOT LIBTYPE)
93   set(LIBTYPE SHARED)
94 endif()
95
96 # Get the platform
97 if(WIN32)
98   if(NOT WINDOWS)
99     set(WINDOWS TRUE)
100   endif()
101 elseif(UNIX AND NOT APPLE)
102   if(CMAKE_SYSTEM_NAME MATCHES ".*Linux")
103     set(LINUX TRUE)
104   elseif(CMAKE_SYSTEM_NAME MATCHES "kFreeBSD.*")
105     set(FREEBSD TRUE)
106   elseif(CMAKE_SYSTEM_NAME MATCHES "kNetBSD.*|NetBSD.*")
107     set(NETBSD TRUE)
108   elseif(CMAKE_SYSTEM_NAME MATCHES "kOpenBSD.*|OpenBSD.*")
109     set(OPENBSD TRUE)
110   elseif(CMAKE_SYSTEM_NAME MATCHES ".*GNU.*")
111     set(GNU TRUE)
112   elseif(CMAKE_SYSTEM_NAME MATCHES ".*BSDI.*")
113     set(BSDI TRUE)
114   elseif(CMAKE_SYSTEM_NAME MATCHES "DragonFly.*|FreeBSD")
115     set(FREEBSD TRUE)
116   elseif(CMAKE_SYSTEM_NAME MATCHES "SYSV5.*")
117     set(SYSV5 TRUE)
118   elseif(CMAKE_SYSTEM_NAME MATCHES "Solaris.*")
119     set(SOLARIS TRUE)
120   elseif(CMAKE_SYSTEM_NAME MATCHES "HP-UX.*")
121     set(HPUX TRUE)
122   elseif(CMAKE_SYSTEM_NAME MATCHES "AIX.*")
123     set(AIX TRUE)
124   elseif(CMAKE_SYSTEM_NAME MATCHES "Minix.*")
125     set(MINIX TRUE)
126   endif()
127 elseif(APPLE)
128   if(CMAKE_SYSTEM_NAME MATCHES ".*Darwin.*")
129     set(DARWIN TRUE)
130   elseif(CMAKE_SYSTEM_NAME MATCHES ".*MacOS.*")
131     set(MACOSX TRUE)
132   elseif(CMAKE_SYSTEM_NAME MATCHES ".*tvOS.*")
133     set(TVOS TRUE)
134   endif()
135   # TODO: iOS?
136 elseif(CMAKE_SYSTEM_NAME MATCHES "BeOS.*")
137   message_error("BeOS support has been removed as of SDL 2.0.2.")
138 elseif(CMAKE_SYSTEM_NAME MATCHES "Haiku.*")
139   set(HAIKU TRUE)
140 endif()
141
142 # Don't mistake osx for unix
143 if(UNIX AND NOT APPLE AND NOT RISCOS)
144   set(UNIX_SYS ON)
145 else()
146   set(UNIX_SYS OFF)
147 endif()
148
149 if(UNIX OR APPLE)
150   set(UNIX_OR_MAC_SYS ON)
151 else()
152   set(UNIX_OR_MAC_SYS OFF)
153 endif()
154
155 if (UNIX_OR_MAC_SYS AND NOT EMSCRIPTEN) # JavaScript does not yet have threading support, so disable pthreads when building for Emscripten.
156   set(SDL_PTHREADS_ENABLED_BY_DEFAULT ON)
157 else()
158   set(SDL_PTHREADS_ENABLED_BY_DEFAULT OFF)
159 endif()
160
161 # Default option knobs
162 if(APPLE OR ARCH_64)
163   if(NOT "${CMAKE_OSX_ARCHITECTURES}" MATCHES "arm")
164     set(OPT_DEF_SSEMATH ON)
165   endif()
166 endif()
167 if(UNIX OR MINGW OR MSYS)
168   set(OPT_DEF_LIBC ON)
169 endif()
170
171 # The hidraw support doesn't catch Xbox, PS4 and Nintendo controllers,
172 #  so we'll just use libusb when it's available. libusb does not support iOS,
173 #  so we default to yes on iOS.
174 #  TODO: Windows can support libusb, the hid.c file just depends on Unix APIs
175 if((WINDOWS AND NOT WINDOWS_STORE) OR IOS OR TVOS OR ANDROID)
176   set(HIDAPI_SKIP_LIBUSB TRUE)
177 else()
178   set(HIDAPI_SKIP_LIBUSB FALSE)
179 endif()
180 if (HIDAPI_SKIP_LIBUSB)
181   set(OPT_DEF_HIDAPI ON)
182 endif()
183
184 # On the other hand, *BSD specifically uses libusb only, so we make a special
185 #  case just for them.
186 if(FREEBSD OR NETBSD OR OPENBSD OR BSDI)
187   set(HIDAPI_ONLY_LIBUSB TRUE)
188 else()
189   set(HIDAPI_ONLY_LIBUSB FALSE)
190 endif()
191
192 # Compiler info
193 if(CMAKE_COMPILER_IS_GNUCC)
194   set(USE_GCC TRUE)
195   set(OPT_DEF_ASM TRUE)
196 elseif(CMAKE_C_COMPILER_ID MATCHES "Clang")
197   set(USE_CLANG TRUE)
198   set(OPT_DEF_ASM TRUE)
199 elseif(MSVC_VERSION GREATER 1400) # VisualStudio 8.0+
200   set(OPT_DEF_ASM TRUE)
201   #set(CMAKE_C_FLAGS "/ZI /WX- /
202 else()
203   set(OPT_DEF_ASM FALSE)
204 endif()
205
206 if(USE_GCC OR USE_CLANG)
207   set(OPT_DEF_GCC_ATOMICS ON)
208 endif()
209
210 # Default flags, if not set otherwise
211 if("$ENV{CFLAGS}" STREQUAL "")
212   if(CMAKE_BUILD_TYPE STREQUAL "")
213     if(USE_GCC OR USE_CLANG)
214       set(CMAKE_C_FLAGS "-g -O3")
215     endif()
216   endif()
217 else()
218   set(CMAKE_C_FLAGS "$ENV{CFLAGS}")
219   list(APPEND EXTRA_CFLAGS "$ENV{CFLAGS}")
220 endif()
221 if(NOT ("$ENV{CFLAGS}" STREQUAL "")) # Hackish, but does the trick on Win32
222   list(APPEND EXTRA_LDFLAGS "$ENV{LDFLAGS}")
223 endif()
224
225 if(MSVC)
226   option(FORCE_STATIC_VCRT "Force /MT for static VC runtimes" OFF)
227   if(FORCE_STATIC_VCRT)
228     foreach(flag_var
229         CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE
230         CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO)
231       if(${flag_var} MATCHES "/MD")
232         string(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}")
233       endif()
234     endforeach()
235   endif()
236
237   # Make sure /RTC1 is disabled, otherwise it will use functions from the CRT
238   foreach(flag_var
239       CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE
240       CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO)
241     string(REGEX REPLACE "/RTC(su|[1su])" "" ${flag_var} "${${flag_var}}")
242   endforeach(flag_var)
243 endif()
244
245 # Those are used for pkg-config and friends, so that the SDL2.pc, sdl2-config,
246 # etc. are created correctly.
247 set(SDL_LIBS "-lSDL2")
248 set(SDL_CFLAGS "")
249
250 # When building shared lib for Windows with MinGW,
251 # avoid the DLL having a "lib" prefix
252 if(WINDOWS)
253   set(CMAKE_SHARED_LIBRARY_PREFIX "")
254 endif()
255
256 # Emscripten toolchain has a nonempty default value for this, and the checks
257 # in this file need to change that, so remember the original value, and
258 # restore back to that afterwards. For check_function_exists() to work in
259 # Emscripten, this value must be at its default value.
260 set(ORIG_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
261
262 if(CYGWIN)
263   # We build SDL on cygwin without the UNIX emulation layer
264   include_directories("-I/usr/include/mingw")
265   set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -mno-cygwin")
266   check_c_source_compiles("int main(int argc, char **argv) {}"
267     HAVE_GCC_NO_CYGWIN)
268   set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS})
269   if(HAVE_GCC_NO_CYGWIN)
270     list(APPEND EXTRA_LDFLAGS "-mno-cygwin")
271     list(APPEND SDL_LIBS "-mno-cygwin")
272   endif()
273   set(SDL_CFLAGS "${SDL_CFLAGS} -I/usr/include/mingw")
274 endif()
275
276 add_definitions(-DUSING_GENERATED_CONFIG_H)
277 # General includes
278 include_directories(${SDL2_BINARY_DIR}/include ${SDL2_SOURCE_DIR}/include)
279 if(USE_GCC OR USE_CLANG)
280   set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -idirafter \"${SDL2_SOURCE_DIR}/src/video/khronos\"")
281 else()
282   include_directories(${SDL2_SOURCE_DIR}/src/video/khronos)
283 endif()
284
285 # All these ENABLED_BY_DEFAULT vars will default to ON if not specified, so
286 #  you only need to have a platform override them if they are disabling.
287 set(OPT_DEF_ASM TRUE)
288 if(EMSCRIPTEN)
289   # Set up default values for the currently supported set of subsystems:
290   # Emscripten/Javascript does not have assembly support, a dynamic library
291   # loading architecture, low-level CPU inspection or multithreading.
292   set(OPT_DEF_ASM FALSE)
293   set(SDL_SHARED_ENABLED_BY_DEFAULT OFF)
294   set(SDL_ATOMIC_ENABLED_BY_DEFAULT OFF)
295   set(SDL_THREADS_ENABLED_BY_DEFAULT OFF)
296   set(SDL_LOADSO_ENABLED_BY_DEFAULT OFF)
297   set(SDL_CPUINFO_ENABLED_BY_DEFAULT OFF)
298   set(SDL_DLOPEN_ENABLED_BY_DEFAULT OFF)
299 endif()
300
301 # When defined, respect CMake's BUILD_SHARED_LIBS setting:
302 set(SDL_STATIC_ENABLED_BY_DEFAULT ON)
303 if (NOT DEFINED SDL_SHARED_ENABLED_BY_DEFAULT)
304   # ...unless decided already (as for EMSCRIPTEN)
305
306   set(SDL_SHARED_ENABLED_BY_DEFAULT OFF)
307
308   if (NOT DEFINED BUILD_SHARED_LIBS)
309     # No preference? Build both, just like the AC/AM configure
310     set(SDL_SHARED_ENABLED_BY_DEFAULT ON)
311
312   elseif (BUILD_SHARED_LIBS)
313     # In this case, we assume the user wants a shared lib and don't build
314     # the static one
315     set(SDL_SHARED_ENABLED_BY_DEFAULT ON)
316     set(SDL_STATIC_ENABLED_BY_DEFAULT OFF)
317   endif()
318 endif()
319
320 set(SDL_SUBSYSTEMS
321     Atomic Audio Video Render Events Joystick Haptic Power Threads Timers
322     File Loadso CPUinfo Filesystem Dlopen Sensor Locale)
323 foreach(_SUB ${SDL_SUBSYSTEMS})
324   string(TOUPPER ${_SUB} _OPT)
325   if (NOT DEFINED SDL_${_OPT}_ENABLED_BY_DEFAULT)
326     set(SDL_${_OPT}_ENABLED_BY_DEFAULT ON)
327   endif()
328   option(SDL_${_OPT} "Enable the ${_SUB} subsystem" ${SDL_${_OPT}_ENABLED_BY_DEFAULT})
329 endforeach()
330
331 option_string(ASSERTIONS "Enable internal sanity checks (auto/disabled/release/enabled/paranoid)" "auto")
332 #set_option(DEPENDENCY_TRACKING "Use gcc -MMD -MT dependency tracking" ON)
333 set_option(LIBC                "Use the system C library" ${OPT_DEF_LIBC})
334 set_option(GCC_ATOMICS         "Use gcc builtin atomics" ${OPT_DEF_GCC_ATOMICS})
335 set_option(ASSEMBLY            "Enable assembly routines" ${OPT_DEF_ASM})
336 set_option(SSEMATH             "Allow GCC to use SSE floating point math" ${OPT_DEF_SSEMATH})
337 set_option(MMX                 "Use MMX assembly routines" ${OPT_DEF_ASM})
338 set_option(3DNOW               "Use 3Dnow! MMX assembly routines" ${OPT_DEF_ASM})
339 set_option(SSE                 "Use SSE assembly routines" ${OPT_DEF_ASM})
340 set_option(SSE2                "Use SSE2 assembly routines" ${OPT_DEF_SSEMATH})
341 set_option(SSE3                "Use SSE3 assembly routines" ${OPT_DEF_SSEMATH})
342 set_option(ALTIVEC             "Use Altivec assembly routines" ${OPT_DEF_ASM})
343 set_option(ARMSIMD             "use SIMD assembly blitters on ARM" OFF)
344 set_option(ARMNEON             "use NEON assembly blitters on ARM" OFF)
345 set_option(DISKAUDIO           "Support the disk writer audio driver" ON)
346 set_option(DUMMYAUDIO          "Support the dummy audio driver" ON)
347 set_option(VIDEO_DIRECTFB      "Use DirectFB video driver" OFF)
348 dep_option(DIRECTFB_SHARED     "Dynamically load directfb support" ON "VIDEO_DIRECTFB" OFF)
349 set_option(VIDEO_DUMMY         "Use dummy video driver" ON)
350 set_option(VIDEO_OPENGL        "Include OpenGL support" ON)
351 set_option(VIDEO_OPENGLES      "Include OpenGL ES support" ON)
352 set_option(PTHREADS            "Use POSIX threads for multi-threading" ${SDL_PTHREADS_ENABLED_BY_DEFAULT})
353 dep_option(PTHREADS_SEM        "Use pthread semaphores" ON "PTHREADS" OFF)
354 set_option(SDL_DLOPEN          "Use dlopen for shared object loading" ${SDL_DLOPEN_ENABLED_BY_DEFAULT})
355 dep_option(OSS                 "Support the OSS audio API" ON "UNIX_SYS OR RISCOS" OFF)
356 set_option(ALSA                "Support the ALSA audio API" ${UNIX_SYS})
357 dep_option(ALSA_SHARED         "Dynamically load ALSA audio support" ON "ALSA" OFF)
358 set_option(JACK                "Support the JACK audio API" ${UNIX_SYS})
359 dep_option(JACK_SHARED         "Dynamically load JACK audio support" ON "JACK" OFF)
360 set_option(ESD                 "Support the Enlightened Sound Daemon" ${UNIX_SYS})
361 dep_option(ESD_SHARED          "Dynamically load ESD audio support" ON "ESD" OFF)
362 set_option(PULSEAUDIO          "Use PulseAudio" ${UNIX_SYS})
363 dep_option(PULSEAUDIO_SHARED   "Dynamically load PulseAudio support" ON "PULSEAUDIO" OFF)
364 set_option(ARTS                "Support the Analog Real Time Synthesizer" ${UNIX_SYS})
365 dep_option(ARTS_SHARED         "Dynamically load aRts audio support" ON "ARTS" OFF)
366 set_option(NAS                 "Support the NAS audio API" ${UNIX_SYS})
367 set_option(NAS_SHARED          "Dynamically load NAS audio API" ${UNIX_SYS})
368 set_option(SNDIO               "Support the sndio audio API" ${UNIX_SYS})
369 dep_option(SNDIO_SHARED        "Dynamically load the sndio audio API" ${UNIX_SYS} ON "SNDIO" OFF)
370 set_option(FUSIONSOUND         "Use FusionSound audio driver" OFF)
371 dep_option(FUSIONSOUND_SHARED  "Dynamically load fusionsound audio support" ON "FUSIONSOUND" OFF)
372 set_option(LIBSAMPLERATE       "Use libsamplerate for audio rate conversion" ${UNIX_SYS})
373 dep_option(LIBSAMPLERATE_SHARED "Dynamically load libsamplerate" ON "LIBSAMPLERATE" OFF)
374 set_option(RPATH               "Use an rpath when linking SDL" ${UNIX_SYS})
375 set_option(CLOCK_GETTIME       "Use clock_gettime() instead of gettimeofday()" OFF)
376 set_option(VIDEO_X11           "Use X11 video driver" ${UNIX_SYS})
377 set_option(VIDEO_WAYLAND       "Use Wayland video driver" ${UNIX_SYS})
378 dep_option(WAYLAND_SHARED      "Dynamically load Wayland support" ON "VIDEO_WAYLAND" OFF)
379 dep_option(VIDEO_WAYLAND_QT_TOUCH  "QtWayland server support for Wayland video driver" ON "VIDEO_WAYLAND" OFF)
380 set_option(VIDEO_RPI           "Use Raspberry Pi video driver" ${UNIX_SYS})
381 dep_option(X11_SHARED          "Dynamically load X11 support" ON "VIDEO_X11" OFF)
382 set_option(VIDEO_TIZEN       "Use Tizen video driver" ${UNIX_SYS})
383 dep_option(TIZEN_SHARED      "Dynamically load Tizen support" ON "VIDEO_TIZEN" OFF)
384 set(SDL_X11_OPTIONS Xcursor Xinerama XInput Xrandr Xscrnsaver XShape Xvm)
385 foreach(_SUB ${SDL_X11_OPTIONS})
386   string(TOUPPER "VIDEO_X11_${_SUB}" _OPT)
387   dep_option(${_OPT}           "Enable ${_SUB} support" ON "VIDEO_X11" OFF)
388 endforeach()
389 set_option(VIDEO_COCOA         "Use Cocoa video driver" ${APPLE})
390 set_option(DIRECTX             "Use DirectX for Windows audio/video" ${WINDOWS})
391 set_option(WASAPI              "Use the Windows WASAPI audio driver" ${WINDOWS})
392 set_option(RENDER_D3D          "Enable the Direct3D render driver" ${WINDOWS})
393 set_option(RENDER_METAL        "Enable the Metal render driver" ${APPLE})
394 set_option(VIDEO_VIVANTE       "Use Vivante EGL video driver" ${UNIX_SYS})
395 dep_option(VIDEO_VULKAN        "Enable Vulkan support" ON "ANDROID OR APPLE OR LINUX OR WINDOWS" OFF)
396 set_option(VIDEO_METAL         "Enable Metal support" ${APPLE})
397 set_option(VIDEO_KMSDRM        "Use KMS DRM video driver" ${UNIX_SYS})
398 dep_option(KMSDRM_SHARED       "Dynamically load KMS DRM support" ON "VIDEO_KMSDRM" OFF)
399 set_option(VIDEO_OFFSCREEN     "Use offscreen video driver" OFF)
400 option_string(BACKGROUNDING_SIGNAL "number to use for magic backgrounding signal or 'OFF'" "OFF")
401 option_string(FOREGROUNDING_SIGNAL "number to use for magic foregrounding signal or 'OFF'" "OFF")
402 set_option(HIDAPI              "Use HIDAPI for low level joystick drivers" ${OPT_DEF_HIDAPI})
403 set_option(JOYSTICK_VIRTUAL    "Enable the virtual-joystick driver" ON)
404
405 set(SDL_SHARED ${SDL_SHARED_ENABLED_BY_DEFAULT} CACHE BOOL "Build a shared version of the library")
406 set(SDL_STATIC ${SDL_STATIC_ENABLED_BY_DEFAULT} CACHE BOOL "Build a static version of the library")
407
408 dep_option(SDL_STATIC_PIC      "Static version of the library should be built with Position Independent Code" OFF "SDL_STATIC" OFF)
409 set_option(SDL_TEST            "Build the test directory" OFF)
410
411 # General source files
412 file(GLOB SOURCE_FILES
413   ${SDL2_SOURCE_DIR}/src/*.c
414   ${SDL2_SOURCE_DIR}/src/atomic/*.c
415   ${SDL2_SOURCE_DIR}/src/audio/*.c
416   ${SDL2_SOURCE_DIR}/src/cpuinfo/*.c
417   ${SDL2_SOURCE_DIR}/src/dynapi/*.c
418   ${SDL2_SOURCE_DIR}/src/events/*.c
419   ${SDL2_SOURCE_DIR}/src/file/*.c
420   ${SDL2_SOURCE_DIR}/src/haptic/*.c
421   ${SDL2_SOURCE_DIR}/src/libm/*.c
422   ${SDL2_SOURCE_DIR}/src/locale/*.c
423   ${SDL2_SOURCE_DIR}/src/misc/*.c
424   ${SDL2_SOURCE_DIR}/src/power/*.c
425   ${SDL2_SOURCE_DIR}/src/render/*.c
426   ${SDL2_SOURCE_DIR}/src/render/*/*.c
427   ${SDL2_SOURCE_DIR}/src/sensor/*.c
428   ${SDL2_SOURCE_DIR}/src/stdlib/*.c
429   ${SDL2_SOURCE_DIR}/src/thread/*.c
430   ${SDL2_SOURCE_DIR}/src/timer/*.c
431   ${SDL2_SOURCE_DIR}/src/video/*.c
432   ${SDL2_SOURCE_DIR}/src/video/yuv2rgb/*.c)
433
434
435 if(ASSERTIONS STREQUAL "auto")
436   # Do nada - use optimization settings to determine the assertion level
437 elseif(ASSERTIONS STREQUAL "disabled")
438   set(SDL_DEFAULT_ASSERT_LEVEL 0)
439 elseif(ASSERTIONS STREQUAL "release")
440   set(SDL_DEFAULT_ASSERT_LEVEL 1)
441 elseif(ASSERTIONS STREQUAL "enabled")
442   set(SDL_DEFAULT_ASSERT_LEVEL 2)
443 elseif(ASSERTIONS STREQUAL "paranoid")
444   set(SDL_DEFAULT_ASSERT_LEVEL 3)
445 else()
446   message_error("unknown assertion level")
447 endif()
448 set(HAVE_ASSERTIONS ${ASSERTIONS})
449
450 if(NOT BACKGROUNDING_SIGNAL STREQUAL "OFF")
451   add_definitions("-DSDL_BACKGROUNDING_SIGNAL=${BACKGROUNDING_SIGNAL}")
452 endif()
453
454 if(NOT FOREGROUNDING_SIGNAL STREQUAL "OFF")
455   add_definitions("-DSDL_FOREGROUNDING_SIGNAL=${FOREGROUNDING_SIGNAL}")
456 endif()
457
458 # Compiler option evaluation
459 if(USE_GCC OR USE_CLANG)
460   # Check for -Wall first, so later things can override pieces of it.
461   check_c_compiler_flag(-Wall HAVE_GCC_WALL)
462   if(HAVE_GCC_WALL)
463     list(APPEND EXTRA_CFLAGS "-Wall")
464     if(HAIKU)
465       set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-multichar")
466     endif()
467   endif()
468
469   check_c_compiler_flag(-fno-strict-aliasing HAVE_GCC_NO_STRICT_ALIASING)
470   if(HAVE_GCC_NO_STRICT_ALIASING)
471     list(APPEND EXTRA_CFLAGS "-fno-strict-aliasing")
472   endif()
473
474   check_c_compiler_flag(-Wdeclaration-after-statement HAVE_GCC_WDECLARATION_AFTER_STATEMENT)
475   if(HAVE_GCC_WDECLARATION_AFTER_STATEMENT)
476     check_c_compiler_flag(-Werror=declaration-after-statement HAVE_GCC_WERROR_DECLARATION_AFTER_STATEMENT)
477     if(HAVE_GCC_WERROR_DECLARATION_AFTER_STATEMENT)
478       list(APPEND EXTRA_CFLAGS "-Werror=declaration-after-statement")
479     endif()
480     list(APPEND EXTRA_CFLAGS "-Wdeclaration-after-statement")
481   endif()
482
483   if(DEPENDENCY_TRACKING)
484     check_c_source_compiles("
485         #if !defined(__GNUC__) || __GNUC__ < 3
486         #error Dependency tracking requires GCC 3.0 or newer
487         #endif
488         int main(int argc, char **argv) { }" HAVE_DEPENDENCY_TRACKING)
489   endif()
490
491   if(GCC_ATOMICS)
492     check_c_source_compiles("int main(int argc, char **argv) {
493         int a;
494         void *x, *y, *z;
495         __sync_lock_test_and_set(&a, 4);
496         __sync_lock_test_and_set(&x, y);
497         __sync_fetch_and_add(&a, 1);
498         __sync_bool_compare_and_swap(&a, 5, 10);
499         __sync_bool_compare_and_swap(&x, y, z); }" HAVE_GCC_ATOMICS)
500     if(NOT HAVE_GCC_ATOMICS)
501       check_c_source_compiles("int main(int argc, char **argv) {
502           int a;
503           __sync_lock_test_and_set(&a, 1);
504           __sync_lock_release(&a); }" HAVE_GCC_SYNC_LOCK_TEST_AND_SET)
505     endif()
506   endif()
507
508   set(CMAKE_REQUIRED_FLAGS "-mpreferred-stack-boundary=2")
509   check_c_source_compiles("int x = 0; int main(int argc, char **argv) {}"
510     HAVE_GCC_PREFERRED_STACK_BOUNDARY)
511   set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS})
512
513   set(CMAKE_REQUIRED_FLAGS "-fvisibility=hidden -Werror")
514   check_c_source_compiles("
515       #if !defined(__GNUC__) || __GNUC__ < 4
516       #error SDL only uses visibility attributes in GCC 4 or newer
517       #endif
518       int main(int argc, char **argv) {}" HAVE_GCC_FVISIBILITY)
519   if(HAVE_GCC_FVISIBILITY)
520     list(APPEND EXTRA_CFLAGS "-fvisibility=hidden")
521   endif()
522   set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS})
523
524   check_c_compiler_flag(-Wshadow HAVE_GCC_WSHADOW)
525   if(HAVE_GCC_WSHADOW)
526     list(APPEND EXTRA_CFLAGS "-Wshadow")
527   endif()
528
529   if(APPLE)
530     list(APPEND EXTRA_LDFLAGS "-Wl,-undefined,error")
531     list(APPEND EXTRA_LDFLAGS "-Wl,-compatibility_version,${DYLIB_COMPATIBILITY_VERSION}")
532     list(APPEND EXTRA_LDFLAGS "-Wl,-current_version,${DYLIB_CURRENT_VERSION}")
533   else()
534     set(CMAKE_REQUIRED_FLAGS "-Wl,--no-undefined")
535     check_c_compiler_flag("" HAVE_NO_UNDEFINED)
536     set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS})
537     if(HAVE_NO_UNDEFINED)
538       list(APPEND EXTRA_LDFLAGS "-Wl,--no-undefined")
539     endif()
540   endif()
541 endif()
542
543 if(ASSEMBLY)
544   if(USE_GCC OR USE_CLANG)
545     set(SDL_ASSEMBLY_ROUTINES 1)
546     # TODO: Those all seem to be quite GCC specific - needs to be
547     # reworked for better compiler support
548     set(HAVE_ASSEMBLY TRUE)
549     if(MMX)
550       set(CMAKE_REQUIRED_FLAGS "-mmmx")
551       check_c_source_compiles("
552           #ifdef __MINGW32__
553           #include <_mingw.h>
554           #ifdef __MINGW64_VERSION_MAJOR
555           #include <intrin.h>
556           #else
557           #include <mmintrin.h>
558           #endif
559           #else
560           #include <mmintrin.h>
561           #endif
562           #ifndef __MMX__
563           #error Assembler CPP flag not enabled
564           #endif
565           int main(int argc, char **argv) { }" HAVE_MMX)
566       if(HAVE_MMX)
567         list(APPEND EXTRA_CFLAGS "-mmmx")
568       endif()
569       set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS})
570     endif()
571
572     if(3DNOW)
573       set(CMAKE_REQUIRED_FLAGS "-m3dnow")
574       check_c_source_compiles("
575           #include <mm3dnow.h>
576           #ifndef __3dNOW__
577           #error Assembler CPP flag not enabled
578           #endif
579           int main(int argc, char **argv) {
580             void *p = 0;
581             _m_prefetch(p);
582           }" HAVE_3DNOW)
583       if(HAVE_3DNOW)
584         list(APPEND EXTRA_CFLAGS "-m3dnow")
585       endif()
586       set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS})
587     endif()
588
589     if(SSE)
590       set(CMAKE_REQUIRED_FLAGS "-msse")
591       check_c_source_compiles("
592           #ifdef __MINGW32__
593           #include <_mingw.h>
594           #ifdef __MINGW64_VERSION_MAJOR
595           #include <intrin.h>
596           #else
597           #include <xmmintrin.h>
598           #endif
599           #else
600           #include <xmmintrin.h>
601           #endif
602           #ifndef __SSE__
603           #error Assembler CPP flag not enabled
604           #endif
605           int main(int argc, char **argv) { }" HAVE_SSE)
606       if(HAVE_SSE)
607         list(APPEND EXTRA_CFLAGS "-msse")
608       endif()
609       set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS})
610     endif()
611
612     if(SSE2)
613       set(CMAKE_REQUIRED_FLAGS "-msse2")
614       check_c_source_compiles("
615           #ifdef __MINGW32__
616           #include <_mingw.h>
617           #ifdef __MINGW64_VERSION_MAJOR
618           #include <intrin.h>
619           #else
620           #include <emmintrin.h>
621           #endif
622           #else
623           #include <emmintrin.h>
624           #endif
625           #ifndef __SSE2__
626           #error Assembler CPP flag not enabled
627           #endif
628           int main(int argc, char **argv) { }" HAVE_SSE2)
629       if(HAVE_SSE2)
630         list(APPEND EXTRA_CFLAGS "-msse2")
631       endif()
632       set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS})
633     endif()
634
635     if(SSE3)
636       set(CMAKE_REQUIRED_FLAGS "-msse3")
637       check_c_source_compiles("
638           #ifdef __MINGW32__
639           #include <_mingw.h>
640           #ifdef __MINGW64_VERSION_MAJOR
641           #include <intrin.h>
642           #else
643           #include <pmmintrin.h>
644           #endif
645           #else
646           #include <pmmintrin.h>
647           #endif
648           #ifndef __SSE3__
649           #error Assembler CPP flag not enabled
650           #endif
651           int main(int argc, char **argv) { }" HAVE_SSE3)
652       if(HAVE_SSE3)
653         list(APPEND EXTRA_CFLAGS "-msse3")
654       endif()
655       set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS})
656     endif()
657
658     if(NOT SSEMATH)
659       if(SSE OR SSE2 OR SSE3)
660         if(USE_GCC)
661           check_c_compiler_flag(-mfpmath=387 HAVE_FP_387)
662           if(HAVE_FP_387)
663             list(APPEND EXTRA_CFLAGS "-mfpmath=387")
664           endif()
665         endif()
666         set(HAVE_SSEMATH TRUE)
667       endif()
668     endif()
669
670     check_include_file("immintrin.h" HAVE_IMMINTRIN_H)
671
672     if(ALTIVEC)
673       set(CMAKE_REQUIRED_FLAGS "-maltivec")
674       check_c_source_compiles("
675           #include <altivec.h>
676           vector unsigned int vzero() {
677               return vec_splat_u32(0);
678           }
679           int main(int argc, char **argv) { }" HAVE_ALTIVEC_H_HDR)
680       check_c_source_compiles("
681           vector unsigned int vzero() {
682               return vec_splat_u32(0);
683           }
684           int main(int argc, char **argv) { }" HAVE_ALTIVEC)
685       set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS})
686       if(HAVE_ALTIVEC OR HAVE_ALTIVEC_H_HDR)
687         set(HAVE_ALTIVEC TRUE) # if only HAVE_ALTIVEC_H_HDR is set
688         list(APPEND EXTRA_CFLAGS "-maltivec")
689         set(SDL_ALTIVEC_BLITTERS 1)
690         if(HAVE_ALTIVEC_H_HDR)
691           set(HAVE_ALTIVEC_H 1)
692         endif()
693       endif()
694     endif()
695
696     if(ARMSIMD)
697       set(ORIG_CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}")
698       set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -x assembler-with-cpp")
699       check_c_source_compiles("
700         .text
701         .arch armv6
702         .object_arch armv4
703         .arm
704         .altmacro
705         #ifndef __ARM_EABI__
706         #error EABI is required (to be sure that calling conventions are compatible)
707         #endif
708         pld [r0]
709         uqadd8 r0, r0, r0
710       " ARMSIMD_FOUND)
711       set(CMAKE_REQUIRED_FLAGS "${ORIG_CMAKE_REQUIRED_FLAGS}")
712
713       if(ARMSIMD_FOUND)
714         set(HAVE_ARMSIMD TRUE)
715         set(SDL_ARM_SIMD_BLITTERS 1)
716         file(GLOB ARMSIMD_SOURCES ${SDL2_SOURCE_DIR}/src/video/arm/pixman-arm-simd*.S)
717         set(SOURCE_FILES ${SOURCE_FILES} ${ARMSIMD_SOURCES})
718         set(WARN_ABOUT_ARM_SIMD_ASM_MIT TRUE)
719       endif()
720     endif()
721
722     if(ARMNEON)
723       set(ORIG_CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}")
724       set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -x assembler-with-cpp")
725       check_c_source_compiles("
726         .text
727         .fpu neon
728         .arch armv7a
729         .object_arch armv4
730         .eabi_attribute 10, 0
731         .arm
732         .altmacro
733         #ifndef __ARM_EABI__
734         #error EABI is required (to be sure that calling conventions are compatible)
735         #endif
736         pld [r0]
737         vmovn.u16 d0, q0
738       " ARMNEON_FOUND)
739       set(CMAKE_REQUIRED_FLAGS "${ORIG_CMAKE_REQUIRED_FLAGS}")
740
741       if(ARMNEON_FOUND)
742         set(HAVE_ARMNEON TRUE)
743         set(SDL_ARM_NEON_BLITTERS 1)
744         file(GLOB ARMNEON_SOURCES ${SDL2_SOURCE_DIR}/src/video/arm/pixman-arm-neon*.S)
745         set(SOURCE_FILES ${SOURCE_FILES} ${ARMNEON_SOURCES})
746         set(WARN_ABOUT_ARM_NEON_ASM_MIT TRUE)
747       endif()
748     endif()
749
750   elseif(MSVC_VERSION GREATER 1500)
751     # TODO: SDL_cpuinfo.h needs to support the user's configuration wish
752     # for MSVC - right now it is always activated
753     if(NOT ARCH_64)
754       set(HAVE_MMX TRUE)
755       set(HAVE_3DNOW TRUE)
756     endif()
757     set(HAVE_SSE TRUE)
758     set(HAVE_SSE2 TRUE)
759     set(HAVE_SSE3 TRUE)
760     set(SDL_ASSEMBLY_ROUTINES 1)
761   endif()
762 # TODO:
763 #else()
764 #  if(USE_GCC OR USE_CLANG)
765 #    list(APPEND EXTRA_CFLAGS "-mno-sse" "-mno-sse2" "-mno-sse3" "-mno-mmx")
766 #  endif()
767 endif()
768
769 # TODO: Can't deactivate on FreeBSD? w/o LIBC, SDL_stdinc.h can't define
770 # anything.
771 if(LIBC)
772   if(WINDOWS AND NOT MINGW)
773     set(HAVE_LIBC TRUE)
774     foreach(_HEADER stdio.h string.h wchar.h ctype.h math.h limits.h)
775       string(TOUPPER "HAVE_${_HEADER}" _UPPER)
776       string(REPLACE "." "_" _HAVE_H ${_UPPER})
777       set(${_HAVE_H} 1)
778     endforeach()
779     set(HAVE_SIGNAL_H 1)
780     foreach(_FN
781             malloc calloc realloc free qsort abs memset memcpy memmove memcmp
782             wcslen wcsdup wcsstr wcscmp wcsncmp _wcsicmp _wcsnicmp
783             strlen _strrev _strupr _strlwr strchr strrchr strstr itoa _ltoa
784             _ultoa strtol strtoul strtoll strtod atoi atof strcmp strncmp
785             _stricmp _strnicmp strtok_s sscanf
786             acos acosf asin asinf atan atanf atan2 atan2f ceil ceilf
787             copysign copysignf cos cosf exp expf fabs fabsf floor floorf fmod fmodf
788             log logf log10 log10f pow powf scalbn scalbnf sin sinf sqrt sqrtf tan tanf
789             trunc truncf)
790       string(TOUPPER ${_FN} _UPPER)
791       set(HAVE_${_UPPER} 1)
792     endforeach()
793     if(NOT CYGWIN AND NOT MINGW)
794       set(HAVE_ALLOCA 1)
795     endif()
796     set(HAVE_M_PI 1)
797     add_definitions(-D_USE_MATH_DEFINES) # needed for M_PI
798     set(STDC_HEADERS 1)
799   else()
800     set(HAVE_LIBC TRUE)
801     check_include_file(sys/types.h HAVE_SYS_TYPES_H)
802     foreach(_HEADER
803             stdio.h stdlib.h stddef.h stdarg.h malloc.h memory.h string.h limits.h
804             strings.h wchar.h inttypes.h stdint.h ctype.h math.h iconv.h signal.h libunwind.h)
805       string(TOUPPER "HAVE_${_HEADER}" _UPPER)
806       string(REPLACE "." "_" _HAVE_H ${_UPPER})
807       check_include_file("${_HEADER}" ${_HAVE_H})
808     endforeach()
809
810     set(STDC_HEADER_NAMES "stddef.h;stdarg.h;stdlib.h;string.h;stdio.h;wchar.h;float.h")
811     check_include_files("${STDC_HEADER_NAMES}" STDC_HEADERS)
812     check_type_size("size_t" SIZEOF_SIZE_T)
813     check_symbol_exists(M_PI math.h HAVE_M_PI)
814     # TODO: refine the mprotect check
815     check_c_source_compiles("#include <sys/types.h>
816                              #include <sys/mman.h>
817                              int main() { }" HAVE_MPROTECT)
818     foreach(_FN
819             strtod malloc calloc realloc free getenv setenv putenv unsetenv
820             qsort abs bcopy memset memcpy memmove memcmp strlen strlcpy strlcat
821             _strrev _strupr _strlwr strchr strrchr strstr strtok_r itoa _ltoa
822             _uitoa _ultoa strtol strtoul _i64toa _ui64toa strtoll strtoull
823             atoi atof strcmp strncmp _stricmp strcasecmp _strnicmp strncasecmp
824             wcscmp wcsdup wcslcat wcslcpy wcslen wcsncmp wcsstr
825             wcscasecmp _wcsicmp wcsncasecmp _wcsnicmp
826             sscanf vsscanf vsnprintf fopen64 fseeko fseeko64 _Exit
827             )
828       string(TOUPPER ${_FN} _UPPER)
829       set(_HAVEVAR "HAVE_${_UPPER}")
830       check_symbol_exists("${_FN}" "${STDC_HEADER_NAMES}" ${_HAVEVAR})
831     endforeach()
832
833     check_symbol_exists(sigaction "signal.h" HAVE_SIGACTION)
834     check_symbol_exists(setjmp "setjmp.h" HAVE_SETJMP)
835     check_symbol_exists(nanosleep "time.h" HAVE_NANOSLEEP)
836     check_symbol_exists(sysconf "unistd.h" HAVE_SYSCONF)
837     check_symbol_exists(sysctlbyname "sys/types.h;sys/sysctl.h" HAVE_SYSCTLBYNAME)
838     check_symbol_exists(getauxval "sys/auxv.h" HAVE_GETAUXVAL)
839     check_symbol_exists(elf_aux_info "sys/auxv.h" HAVE_ELF_AUX_INFO)
840     check_symbol_exists(poll "poll.h" HAVE_POLL)
841
842     check_library_exists(m pow "" HAVE_LIBM)
843     if(HAVE_LIBM)
844       set(CMAKE_REQUIRED_LIBRARIES m)
845       foreach(_FN
846               atan atan2 atanf atan2f ceil ceilf copysign copysignf cos cosf
847               exp expf fabs fabsf floor floorf fmod fmodf log logf log10 log10f
848               pow powf scalbn scalbnf sin sinf sqrt sqrtf tan tanf acos acosf
849               asin asinf trunc truncf)
850         string(TOUPPER ${_FN} _UPPER)
851         set(_HAVEVAR "HAVE_${_UPPER}")
852         check_symbol_exists("${_FN}" "math.h" ${_HAVEVAR})
853       endforeach()
854       set(CMAKE_REQUIRED_LIBRARIES)
855       list(APPEND EXTRA_LIBS m)
856     endif()
857
858     check_library_exists(iconv iconv_open "" HAVE_LIBICONV)
859     check_library_exists(c iconv_open "" HAVE_BUILTIN_ICONV)
860     if(HAVE_BUILTIN_ICONV)
861       set(HAVE_ICONV 1)
862     elseif(HAVE_LIBICONV)
863       list(APPEND EXTRA_LIBS iconv)
864       set(HAVE_ICONV 1)
865     endif()
866
867     if(NOT APPLE)
868       check_include_file(alloca.h HAVE_ALLOCA_H)
869       check_symbol_exists(alloca "alloca.h" HAVE_ALLOCA1)
870       check_symbol_exists(alloca "stdlib.h" HAVE_ALLOCA2)
871       check_symbol_exists(alloca "malloc.h" HAVE_ALLOCA3)
872       if(HAVE_ALLOCA1 OR HAVE_ALLOCA2 OR HAVE_ALLOCA3)
873         set(HAVE_ALLOCA 1)
874       endif()
875     else()
876       set(HAVE_ALLOCA_H 1)
877       set(HAVE_ALLOCA 1)
878     endif()
879
880     check_struct_has_member("struct sigaction" "sa_sigaction" "signal.h" HAVE_SA_SIGACTION)
881   endif()
882 else()
883   if(WINDOWS)
884     set(HAVE_STDARG_H 1)
885     set(HAVE_STDDEF_H 1)
886   endif()
887 endif()
888
889
890 # Enable/disable various subsystems of the SDL library
891 foreach(_SUB ${SDL_SUBSYSTEMS})
892   string(TOUPPER ${_SUB} _OPT)
893   if(NOT SDL_${_OPT})
894     set(SDL_${_OPT}_DISABLED 1)
895   endif()
896 endforeach()
897 if(SDL_JOYSTICK)
898   file(GLOB JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/*.c)
899   set(SOURCE_FILES ${SOURCE_FILES} ${JOYSTICK_SOURCES})
900 endif()
901 if(SDL_HAPTIC)
902   if(NOT SDL_JOYSTICK)
903     # Haptic requires some private functions from the joystick subsystem.
904     message_error("SDL_HAPTIC requires SDL_JOYSTICK, which is not enabled")
905   endif()
906 endif()
907
908
909 # TODO: in configure.ac, the test for LOADSO and SDL_DLOPEN is a bit weird:
910 # if LOADSO is not wanted, SDL_LOADSO_DISABLED is set
911 # If however on Unix or APPLE dlopen() is detected via CheckDLOPEN(),
912 # SDL_LOADSO_DISABLED will not be set, regardless of the LOADSO settings
913
914 # General SDL subsystem options, valid for all platforms
915 if(SDL_AUDIO)
916   # CheckDummyAudio/CheckDiskAudio - valid for all platforms
917   if(DUMMYAUDIO)
918     set(SDL_AUDIO_DRIVER_DUMMY 1)
919     file(GLOB DUMMYAUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/dummy/*.c)
920     set(SOURCE_FILES ${SOURCE_FILES} ${DUMMYAUDIO_SOURCES})
921     set(HAVE_DUMMYAUDIO TRUE)
922   endif()
923   if(DISKAUDIO)
924     set(SDL_AUDIO_DRIVER_DISK 1)
925     file(GLOB DISKAUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/disk/*.c)
926     set(SOURCE_FILES ${SOURCE_FILES} ${DISKAUDIO_SOURCES})
927     set(HAVE_DISKAUDIO TRUE)
928   endif()
929 endif()
930
931 if(SDL_DLOPEN)
932   # Relevant for Unix/Darwin only
933   if(UNIX OR APPLE)
934     CheckDLOPEN()
935   endif()
936 endif()
937
938 if(SDL_JOYSTICK)
939   if(JOYSTICK_VIRTUAL)
940     set(SDL_JOYSTICK_VIRTUAL 1)
941     file(GLOB JOYSTICK_VIRTUAL_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/virtual/*.c)
942     set(SOURCE_FILES ${SOURCE_FILES} ${JOYSTICK_VIRTUAL_SOURCES})
943   endif()
944 endif()
945
946 if(SDL_VIDEO)
947   if(VIDEO_DUMMY)
948     set(SDL_VIDEO_DRIVER_DUMMY 1)
949     file(GLOB VIDEO_DUMMY_SOURCES ${SDL2_SOURCE_DIR}/src/video/dummy/*.c)
950     set(SOURCE_FILES ${SOURCE_FILES} ${VIDEO_DUMMY_SOURCES})
951     set(HAVE_VIDEO_DUMMY TRUE)
952     set(HAVE_SDL_VIDEO TRUE)
953   endif()
954   if(VIDEO_OFFSCREEN)
955     set(SDL_VIDEO_DRIVER_OFFSCREEN 1)
956     file(GLOB VIDEO_OFFSCREEN_SOURCES ${SDL2_SOURCE_DIR}/src/video/offscreen/*.c)
957     set(SOURCE_FILES ${SOURCE_FILES} ${VIDEO_OFFSCREEN_SOURCES})
958     set(HAVE_VIDEO_OFFSCREEN TRUE)
959     set(HAVE_SDL_VIDEO TRUE)
960   endif()
961 endif()
962
963 # Platform-specific options and settings
964 if(ANDROID)
965   file(GLOB ANDROID_CORE_SOURCES ${SDL2_SOURCE_DIR}/src/core/android/*.c)
966   set(SOURCE_FILES ${SOURCE_FILES} ${ANDROID_CORE_SOURCES} ${ANDROID_NDK}/sources/android/cpufeatures/cpu-features.c)
967
968   file(GLOB ANDROID_MISC_SOURCES ${SDL2_SOURCE_DIR}/src/misc/android/*.c)
969   set(SOURCE_FILES ${SOURCE_FILES} ${ANDROID_MISC_SOURCES})
970   set(HAVE_SDL_MISC TRUE)
971
972   # SDL_spinlock.c Needs to be compiled in ARM mode.
973   # There seems to be no better way currently to set the ARM mode.
974   # see: https://issuetracker.google.com/issues/62264618
975   # Another option would be to set ARM mode to all compiled files
976   check_c_compiler_flag(-marm HAVE_ARM_MODE)
977   if(HAVE_ARM_MODE)
978     set_source_files_properties(${SDL2_SOURCE_DIR}/src/atomic/SDL_spinlock.c PROPERTIES COMPILE_FLAGS -marm)
979   endif()
980
981   file(GLOB ANDROID_MAIN_SOURCES ${SDL2_SOURCE_DIR}/src/main/android/*.c)
982   set(SDLMAIN_SOURCES ${SDLMAIN_SOURCES} ${ANDROID_MAIN_SOURCES})
983
984   if(SDL_AUDIO)
985     set(SDL_AUDIO_DRIVER_ANDROID 1)
986     file(GLOB ANDROID_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/android/*.c)
987     set(SOURCE_FILES ${SOURCE_FILES} ${ANDROID_AUDIO_SOURCES})
988     set(HAVE_SDL_AUDIO TRUE)
989   endif()
990   if(SDL_FILESYSTEM)
991     set(SDL_FILESYSTEM_ANDROID 1)
992     file(GLOB ANDROID_FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/android/*.c)
993     set(SOURCE_FILES ${SOURCE_FILES} ${ANDROID_FILESYSTEM_SOURCES})
994     set(HAVE_SDL_FILESYSTEM TRUE)
995   endif()
996   if(SDL_HAPTIC)
997     set(SDL_HAPTIC_ANDROID 1)
998     file(GLOB ANDROID_HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/android/*.c)
999     set(SOURCE_FILES ${SOURCE_FILES} ${ANDROID_HAPTIC_SOURCES})
1000     set(HAVE_SDL_HAPTIC TRUE)
1001   endif()
1002   if(SDL_JOYSTICK)
1003     CheckHIDAPI()
1004     set(SDL_JOYSTICK_ANDROID 1)
1005     file(GLOB ANDROID_JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/android/*.c ${SDL2_SOURCE_DIR}/src/joystick/steam/*.c)
1006     set(SOURCE_FILES ${SOURCE_FILES} ${ANDROID_JOYSTICK_SOURCES})
1007     set(HAVE_SDL_JOYSTICK TRUE)
1008   endif()
1009   if(SDL_LOADSO)
1010     set(SDL_LOADSO_DLOPEN 1)
1011     file(GLOB LOADSO_SOURCES ${SDL2_SOURCE_DIR}/src/loadso/dlopen/*.c)
1012     set(SOURCE_FILES ${SOURCE_FILES} ${LOADSO_SOURCES})
1013     set(HAVE_SDL_LOADSO TRUE)
1014   endif()
1015   if(SDL_POWER)
1016     set(SDL_POWER_ANDROID 1)
1017     file(GLOB ANDROID_POWER_SOURCES ${SDL2_SOURCE_DIR}/src/power/android/*.c)
1018     set(SOURCE_FILES ${SOURCE_FILES} ${ANDROID_POWER_SOURCES})
1019     set(HAVE_SDL_POWER TRUE)
1020   endif()
1021   if(SDL_LOCALE)
1022     file(GLOB ANDROID_LOCALE_SOURCES ${SDL2_SOURCE_DIR}/src/locale/android/*.c)
1023     set(SOURCE_FILES ${SOURCE_FILES} ${ANDROID_LOCALE_SOURCES})
1024     set(HAVE_SDL_LOCALE TRUE)
1025   endif()
1026   if(SDL_TIMERS)
1027     set(SDL_TIMER_UNIX 1)
1028     file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/unix/*.c)
1029     set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES})
1030     set(HAVE_SDL_TIMERS TRUE)
1031   endif()
1032   if(SDL_SENSOR)
1033     set(SDL_SENSOR_ANDROID 1)
1034     set(HAVE_SDL_SENSORS TRUE)
1035     file(GLOB ANDROID_SENSOR_SOURCES ${SDL2_SOURCE_DIR}/src/sensor/android/*.c)
1036     set(SOURCE_FILES ${SOURCE_FILES} ${ANDROID_SENSOR_SOURCES})
1037   endif()
1038   if(SDL_VIDEO)
1039     set(SDL_VIDEO_DRIVER_ANDROID 1)
1040     file(GLOB ANDROID_VIDEO_SOURCES ${SDL2_SOURCE_DIR}/src/video/android/*.c)
1041     set(SOURCE_FILES ${SOURCE_FILES} ${ANDROID_VIDEO_SOURCES})
1042     set(HAVE_SDL_VIDEO TRUE)
1043
1044     # Core stuff
1045     # find_library(ANDROID_DL_LIBRARY dl)
1046     # FIXME failing dlopen https://github.com/android-ndk/ndk/issues/929
1047     find_library(ANDROID_DL_LIBRARY NAMES libdl.so dl)
1048     find_library(ANDROID_LOG_LIBRARY log)
1049     find_library(ANDROID_LIBRARY_LIBRARY android)
1050     list(APPEND EXTRA_LIBS ${ANDROID_DL_LIBRARY} ${ANDROID_LOG_LIBRARY} ${ANDROID_LIBRARY_LIBRARY})
1051     add_definitions(-DGL_GLEXT_PROTOTYPES)
1052
1053     if (HAVE_HIDAPI)
1054         list(APPEND EXTRA_LIBS hidapi)
1055     endif()
1056
1057     #enable gles
1058     if(VIDEO_OPENGLES)
1059       set(SDL_VIDEO_OPENGL_EGL 1)
1060       set(HAVE_VIDEO_OPENGLES TRUE)
1061       set(SDL_VIDEO_OPENGL_ES 1)
1062       set(SDL_VIDEO_RENDER_OGL_ES 1)
1063       set(SDL_VIDEO_OPENGL_ES2 1)
1064       set(SDL_VIDEO_RENDER_OGL_ES2 1)
1065
1066       find_library(OpenGLES1_LIBRARY GLESv1_CM)
1067       find_library(OpenGLES2_LIBRARY GLESv2)
1068       list(APPEND EXTRA_LIBS ${OpenGLES1_LIBRARY} ${OpenGLES2_LIBRARY})
1069     endif()
1070
1071     CHECK_C_SOURCE_COMPILES("
1072     #if defined(__ARM_ARCH) && __ARM_ARCH < 7
1073     #error Vulkan doesn't work on this configuration
1074     #endif
1075     int main()
1076     {
1077         return 0;
1078     }
1079     " VULKAN_PASSED_ANDROID_CHECKS)
1080     if(NOT VULKAN_PASSED_ANDROID_CHECKS)
1081       set(VIDEO_VULKAN OFF)
1082       message(STATUS "Vulkan doesn't work on this configuration")
1083     endif()
1084   endif()
1085
1086   CheckPTHREAD()
1087
1088 elseif(EMSCRIPTEN)
1089   # Hide noisy warnings that intend to aid mostly during initial stages of porting a new
1090   # project. Uncomment at will for verbose cross-compiling -I/../ path info.
1091   add_definitions(-Wno-warn-absolute-paths)
1092   if(SDL_AUDIO)
1093     set(SDL_AUDIO_DRIVER_EMSCRIPTEN 1)
1094     file(GLOB EM_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/emscripten/*.c)
1095     set(SOURCE_FILES ${SOURCE_FILES} ${EM_AUDIO_SOURCES})
1096     set(HAVE_SDL_AUDIO TRUE)
1097   endif()
1098   if(SDL_FILESYSTEM)
1099     set(SDL_FILESYSTEM_EMSCRIPTEN 1)
1100     file(GLOB EM_FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/emscripten/*.c)
1101     set(SOURCE_FILES ${SOURCE_FILES} ${EM_FILESYSTEM_SOURCES})
1102     set(HAVE_SDL_FILESYSTEM TRUE)
1103   endif()
1104   if(SDL_JOYSTICK)
1105     set(SDL_JOYSTICK_EMSCRIPTEN 1)
1106     file(GLOB EM_JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/emscripten/*.c)
1107     set(SOURCE_FILES ${SOURCE_FILES} ${EM_JOYSTICK_SOURCES})
1108     set(HAVE_SDL_JOYSTICK TRUE)
1109   endif()
1110   if(SDL_POWER)
1111     set(SDL_POWER_EMSCRIPTEN 1)
1112     file(GLOB EM_POWER_SOURCES ${SDL2_SOURCE_DIR}/src/power/emscripten/*.c)
1113     set(SOURCE_FILES ${SOURCE_FILES} ${EM_POWER_SOURCES})
1114     set(HAVE_SDL_POWER TRUE)
1115   endif()
1116   if(SDL_LOCALE)
1117     file(GLOB LOCALE_SOURCES ${SDL2_SOURCE_DIR}/src/locale/emscripten/*.c)
1118     set(SOURCE_FILES ${SOURCE_FILES} ${LOCALE_SOURCES})
1119     set(HAVE_SDL_LOCALE TRUE)
1120   endif()
1121   if(SDL_TIMERS)
1122     set(SDL_TIMER_UNIX 1)
1123     file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/unix/*.c)
1124     set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES})
1125     set(HAVE_SDL_TIMERS TRUE)
1126
1127     if(CLOCK_GETTIME)
1128       set(HAVE_CLOCK_GETTIME 1)
1129     endif()
1130   endif()
1131   if(SDL_VIDEO)
1132     set(SDL_VIDEO_DRIVER_EMSCRIPTEN 1)
1133     file(GLOB EM_VIDEO_SOURCES ${SDL2_SOURCE_DIR}/src/video/emscripten/*.c)
1134     set(SOURCE_FILES ${SOURCE_FILES} ${EM_VIDEO_SOURCES})
1135     set(HAVE_SDL_VIDEO TRUE)
1136
1137     #enable gles
1138     if(VIDEO_OPENGLES)
1139       set(SDL_VIDEO_OPENGL_EGL 1)
1140       set(HAVE_VIDEO_OPENGLES TRUE)
1141       set(SDL_VIDEO_OPENGL_ES2 1)
1142       set(SDL_VIDEO_RENDER_OGL_ES2 1)
1143     endif()
1144   endif()
1145
1146 elseif(UNIX AND NOT APPLE AND NOT ANDROID AND NOT RISCOS)
1147   if(SDL_AUDIO)
1148     if(SYSV5 OR SOLARIS OR HPUX)
1149         set(SDL_AUDIO_DRIVER_SUNAUDIO 1)
1150         file(GLOB SUN_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/sun/*.c)
1151         set(SOURCE_FILES ${SOURCE_FILES} ${SUN_AUDIO_SOURCES})
1152         set(HAVE_SDL_AUDIO TRUE)
1153     elseif(NETBSD)
1154         set(SDL_AUDIO_DRIVER_NETBSD 1)
1155         file(GLOB NETBSD_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/netbsd/*.c)
1156         set(SOURCE_FILES ${SOURCE_FILES} ${NETBSD_AUDIO_SOURCES})
1157         set(HAVE_SDL_AUDIO TRUE)
1158     elseif(AIX)
1159         set(SDL_AUDIO_DRIVER_PAUDIO 1)
1160         file(GLOB AIX_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/paudio/*.c)
1161         set(SOURCE_FILES ${SOURCE_FILES} ${AIX_AUDIO_SOURCES})
1162         set(HAVE_SDL_AUDIO TRUE)
1163     endif()
1164     CheckOSS()
1165     CheckALSA()
1166     CheckJACK()
1167     CheckPulseAudio()
1168     CheckESD()
1169     CheckARTS()
1170     CheckNAS()
1171     CheckSNDIO()
1172     CheckFusionSound()
1173     CheckLibSampleRate()
1174   endif()
1175
1176   if(SDL_VIDEO)
1177     # Need to check for Raspberry PI first and add platform specific compiler flags, otherwise the test for GLES fails!
1178     CheckRPI()
1179     CheckX11()
1180     CheckDirectFB()
1181     CheckOpenGLX11()
1182     CheckOpenGLESX11()
1183     CheckWayland()
1184     CheckTizen()
1185     CheckVivante()
1186     CheckKMSDRM()
1187   endif()
1188
1189   if(UNIX)
1190     file(GLOB CORE_UNIX_SOURCES ${SDL2_SOURCE_DIR}/src/core/unix/*.c)
1191     set(SOURCE_FILES ${SOURCE_FILES} ${CORE_UNIX_SOURCES})
1192   endif()
1193
1194   if(LINUX)
1195     check_c_source_compiles("
1196         #include <linux/input.h>
1197         #ifndef EVIOCGNAME
1198         #error EVIOCGNAME() ioctl not available
1199         #endif
1200         int main(int argc, char** argv) {}" HAVE_INPUT_EVENTS)
1201
1202     check_c_source_compiles("
1203         #include <linux/kd.h>
1204         #include <linux/keyboard.h>
1205
1206         int main(int argc, char **argv)
1207         {
1208             struct kbentry kbe;
1209             kbe.kb_table = KG_CTRL;
1210             ioctl(0, KDGKBENT, &kbe);
1211         }" HAVE_INPUT_KD)
1212
1213     if(HAVE_INPUT_EVENTS)
1214       set(SDL_INPUT_LINUXEV 1)
1215     endif()
1216
1217     if(SDL_HAPTIC AND HAVE_INPUT_EVENTS)
1218       set(SDL_HAPTIC_LINUX 1)
1219       file(GLOB HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/linux/*.c)
1220       set(SOURCE_FILES ${SOURCE_FILES} ${HAPTIC_SOURCES})
1221       set(HAVE_SDL_HAPTIC TRUE)
1222     endif()
1223
1224     if(HAVE_INPUT_KD)
1225       set(SDL_INPUT_LINUXKD 1)
1226     endif()
1227
1228     check_include_file("libudev.h" HAVE_LIBUDEV_H)
1229     check_include_file("sys/inotify.h" HAVE_SYS_INOTIFY_H)
1230     check_symbol_exists(inotify_init "sys/inotify.h" HAVE_INOTIFY_INIT)
1231     check_symbol_exists(inotify_init1 "sys/inotify.h" HAVE_INOTIFY_INIT1)
1232     if(HAVE_SYS_INOTIFY_H AND HAVE_INOTIFY_INIT)
1233       set(HAVE_INOTIFY 1)
1234     endif()
1235
1236     if(PKG_CONFIG_FOUND)
1237       pkg_search_module(DBUS dbus-1 dbus)
1238       if(DBUS_FOUND)
1239         set(HAVE_DBUS_DBUS_H TRUE)
1240         include_directories(${DBUS_INCLUDE_DIRS})
1241         list(APPEND EXTRA_LIBS ${DBUS_LIBRARIES})
1242         # Fcitx need only dbus.
1243         set(HAVE_FCITX TRUE)
1244       endif()
1245
1246       pkg_search_module(IBUS ibus-1.0 ibus)
1247       if(IBUS_FOUND)
1248         set(HAVE_IBUS_IBUS_H TRUE)
1249         include_directories(${IBUS_INCLUDE_DIRS})
1250         list(APPEND EXTRA_LIBS ${IBUS_LIBRARIES})
1251       endif()
1252
1253       if (HAVE_IBUS_IBUS_H OR HAVE_FCITX)
1254         set(SDL_USE_IME TRUE)
1255         add_definitions(-DSDL_USE_IME)   # !!! FIXME: why isn't this a definition and not in SDL_config.h.cmake?
1256       endif()
1257       if(HAVE_LIBUNWIND_H)
1258         # We've already found the header, so REQUIRE the lib to be present
1259         pkg_search_module(UNWIND REQUIRED libunwind)
1260         pkg_search_module(UNWIND_GENERIC REQUIRED libunwind-generic)
1261         list(APPEND EXTRA_LIBS ${UNWIND_LIBRARIES} ${UNWIND_GENERIC_LIBRARIES})
1262       endif()
1263     endif()
1264
1265     if(HAVE_DBUS_DBUS_H)
1266       set(SOURCE_FILES ${SOURCE_FILES} "${SDL2_SOURCE_DIR}/src/core/linux/SDL_dbus.c")
1267     endif()
1268
1269     if(SDL_USE_IME)
1270       set(SOURCE_FILES ${SOURCE_FILES} "${SDL2_SOURCE_DIR}/src/core/linux/SDL_ime.c")
1271     endif()
1272
1273     if(HAVE_IBUS_IBUS_H)
1274       set(SOURCE_FILES ${SOURCE_FILES} "${SDL2_SOURCE_DIR}/src/core/linux/SDL_ibus.c")
1275     endif()
1276
1277     if(HAVE_FCITX)
1278       set(SOURCE_FILES ${SOURCE_FILES} "${SDL2_SOURCE_DIR}/src/core/linux/SDL_fcitx.c")
1279     endif()
1280
1281     if(HAVE_LIBUDEV_H)
1282       set(SOURCE_FILES ${SOURCE_FILES} "${SDL2_SOURCE_DIR}/src/core/linux/SDL_udev.c")
1283     endif()
1284
1285     if(HAVE_INPUT_EVENTS)
1286       set(SOURCE_FILES ${SOURCE_FILES} "${SDL2_SOURCE_DIR}/src/core/linux/SDL_evdev.c")
1287       set(SOURCE_FILES ${SOURCE_FILES} "${SDL2_SOURCE_DIR}/src/core/linux/SDL_evdev_kbd.c")
1288     endif()
1289
1290     # Always compiled for Linux, unconditionally:
1291     set(SOURCE_FILES ${SOURCE_FILES} "${SDL2_SOURCE_DIR}/src/core/linux/SDL_evdev_capabilities.c")
1292     set(SOURCE_FILES ${SOURCE_FILES} "${SDL2_SOURCE_DIR}/src/core/linux/SDL_threadprio.c")
1293
1294     # src/core/unix/*.c is included in a generic if(UNIX) section, elsewhere.
1295   endif()
1296
1297   if(SDL_JOYSTICK)
1298     if(FREEBSD OR NETBSD OR OPENBSD OR BSDI)
1299       CheckUSBHID()
1300     endif()
1301     CheckHIDAPI()
1302     if(LINUX AND NOT ANDROID)
1303       set(SDL_JOYSTICK_LINUX 1)
1304       file(GLOB JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/linux/*.c ${SDL2_SOURCE_DIR}/src/joystick/steam/*.c)
1305       set(SOURCE_FILES ${SOURCE_FILES} ${JOYSTICK_SOURCES})
1306       set(HAVE_SDL_JOYSTICK TRUE)
1307     endif()
1308   endif()
1309
1310   CheckPTHREAD()
1311
1312   if(CLOCK_GETTIME)
1313     check_library_exists(rt clock_gettime "" FOUND_CLOCK_GETTIME)
1314     if(FOUND_CLOCK_GETTIME)
1315       list(APPEND EXTRA_LIBS rt)
1316       set(HAVE_CLOCK_GETTIME 1)
1317     else()
1318       check_library_exists(c clock_gettime "" FOUND_CLOCK_GETTIME)
1319       if(FOUND_CLOCK_GETTIME)
1320         set(HAVE_CLOCK_GETTIME 1)
1321       endif()
1322     endif()
1323   endif()
1324
1325   check_include_file(linux/version.h HAVE_LINUX_VERSION_H)
1326   if(HAVE_LINUX_VERSION_H)
1327     set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DHAVE_LINUX_VERSION_H")
1328   endif()
1329
1330   file(GLOB MISC_SOURCES ${SDL2_SOURCE_DIR}/src/misc/unix/*.c)
1331   set(SOURCE_FILES ${SOURCE_FILES} ${MISC_SOURCES})
1332   set(HAVE_SDL_MISC TRUE)
1333
1334   if(SDL_POWER)
1335     if(LINUX)
1336       set(SDL_POWER_LINUX 1)
1337       file(GLOB POWER_SOURCES ${SDL2_SOURCE_DIR}/src/power/linux/*.c)
1338       set(SOURCE_FILES ${SOURCE_FILES} ${POWER_SOURCES})
1339       set(HAVE_SDL_POWER TRUE)
1340     endif()
1341   endif()
1342
1343   if(SDL_LOCALE)
1344     file(GLOB LOCALE_SOURCES ${SDL2_SOURCE_DIR}/src/locale/unix/*.c)
1345     set(SOURCE_FILES ${SOURCE_FILES} ${LOCALE_SOURCES})
1346     set(HAVE_SDL_LOCALE TRUE)
1347   endif()
1348
1349   if(SDL_FILESYSTEM)
1350     set(SDL_FILESYSTEM_UNIX 1)
1351     file(GLOB FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/unix/*.c)
1352     set(SOURCE_FILES ${SOURCE_FILES} ${FILESYSTEM_SOURCES})
1353     set(HAVE_SDL_FILESYSTEM TRUE)
1354   endif()
1355
1356   if(SDL_TIMERS)
1357     set(SDL_TIMER_UNIX 1)
1358     file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/unix/*.c)
1359     set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES})
1360     set(HAVE_SDL_TIMERS TRUE)
1361   endif()
1362
1363   set(SDL_RLD_FLAGS "")
1364   if(RPATH AND SDL_SHARED)
1365     if(BSDI OR FREEBSD OR LINUX OR NETBSD)
1366       set(CMAKE_REQUIRED_FLAGS "-Wl,--enable-new-dtags")
1367       check_c_compiler_flag("" HAVE_ENABLE_NEW_DTAGS)
1368       set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS})
1369       if(HAVE_ENABLE_NEW_DTAGS)
1370         set(SDL_RLD_FLAGS "-Wl,-rpath,\${libdir} -Wl,--enable-new-dtags")
1371       else()
1372         set(SDL_RLD_FLAGS "-Wl,-rpath,\${libdir}")
1373       endif()
1374     elseif(SOLARIS)
1375       set(SDL_RLD_FLAGS "-R\${libdir}")
1376     endif()
1377     set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)
1378     set(HAVE_RPATH TRUE)
1379   endif()
1380
1381 elseif(WINDOWS)
1382   find_program(WINDRES windres)
1383
1384   check_c_source_compiles("
1385     #include <windows.h>
1386     int main(int argc, char **argv) { }" HAVE_WIN32_CC)
1387
1388   file(GLOB CORE_SOURCES ${SDL2_SOURCE_DIR}/src/core/windows/*.c)
1389   set(SOURCE_FILES ${SOURCE_FILES} ${CORE_SOURCES})
1390
1391   if(WINDOWS_STORE)
1392     file(GLOB WINRT_SOURCE_FILES ${SDL2_SOURCE_DIR}/src/core/winrt/*.c ${SDL2_SOURCE_DIR}/src/core/winrt/*.cpp)
1393     list(APPEND SOURCE_FILES ${WINRT_SOURCE_FILES})
1394   endif()
1395
1396   if(MSVC)
1397     # Prevent codegen that would use the VC runtime libraries.
1398     set_property(DIRECTORY . APPEND PROPERTY COMPILE_OPTIONS "/GS-")
1399     if(NOT ARCH_64)
1400       set_property(DIRECTORY . APPEND PROPERTY COMPILE_OPTIONS "/arch:SSE")
1401     endif()
1402   endif()
1403
1404   file(GLOB MISC_SOURCES ${SDL2_SOURCE_DIR}/src/misc/windows/*.c)
1405   set(SOURCE_FILES ${SOURCE_FILES} ${MISC_SOURCES})
1406   set(HAVE_SDL_MISC TRUE)
1407
1408   # Check for DirectX
1409   if(DIRECTX)
1410     if(DEFINED MSVC_VERSION AND NOT ${MSVC_VERSION} LESS 1700)
1411         set(USE_WINSDK_DIRECTX TRUE)
1412     endif()
1413     if(NOT CMAKE_COMPILER_IS_MINGW AND NOT USE_WINSDK_DIRECTX)
1414       if("$ENV{DXSDK_DIR}" STREQUAL "")
1415         message_error("DIRECTX requires the \$DXSDK_DIR environment variable to be set")
1416       endif()
1417       set(CMAKE_REQUIRED_FLAGS "/I\"$ENV{DXSDK_DIR}\\Include\"")
1418     endif()
1419
1420     if(HAVE_WIN32_CC)
1421       # xinput.h may need windows.h, but doesn't include it itself.
1422       check_c_source_compiles("
1423         #include <windows.h>
1424         #include <xinput.h>
1425         int main(int argc, char **argv) { }" HAVE_XINPUT_H)
1426       check_c_source_compiles("
1427         #include <windows.h>
1428         #include <xinput.h>
1429         XINPUT_GAMEPAD_EX x1;
1430         int main(int argc, char **argv) { }" HAVE_XINPUT_GAMEPAD_EX)
1431       check_c_source_compiles("
1432         #include <windows.h>
1433         #include <xinput.h>
1434         XINPUT_STATE_EX s1;
1435         int main(int argc, char **argv) { }" HAVE_XINPUT_STATE_EX)
1436     else()
1437       check_include_file(xinput.h HAVE_XINPUT_H)
1438     endif()
1439
1440     check_include_file(d3d9.h HAVE_D3D_H)
1441     check_include_file(d3d11_1.h HAVE_D3D11_H)
1442     check_include_file(ddraw.h HAVE_DDRAW_H)
1443     check_include_file(dsound.h HAVE_DSOUND_H)
1444     check_include_file(dinput.h HAVE_DINPUT_H)
1445     if(WINDOWS_STORE OR VCPKG_TARGET_TRIPLET MATCHES "arm-windows")
1446       set(HAVE_DINPUT_H 0)
1447     endif()
1448     check_include_file(dxgi.h HAVE_DXGI_H)
1449     if(HAVE_D3D_H OR HAVE_D3D11_H OR HAVE_DDRAW_H OR HAVE_DSOUND_H OR HAVE_DINPUT_H)
1450       set(HAVE_DIRECTX TRUE)
1451       if(NOT CMAKE_COMPILER_IS_MINGW AND NOT USE_WINSDK_DIRECTX)
1452       # TODO: change $ENV{DXSDL_DIR} to get the path from the include checks
1453         link_directories($ENV{DXSDK_DIR}\\lib\\${PROCESSOR_ARCH})
1454         include_directories($ENV{DXSDK_DIR}\\Include)
1455       endif()
1456     endif()
1457     set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS})
1458   endif()
1459
1460   # headers needed elsewhere
1461   check_include_file(mmdeviceapi.h HAVE_MMDEVICEAPI_H)
1462   check_include_file(audioclient.h HAVE_AUDIOCLIENT_H)
1463   check_include_file(sensorsapi.h HAVE_SENSORSAPI_H)
1464
1465   if(SDL_AUDIO)
1466     if(NOT WINDOWS_STORE)
1467     set(SDL_AUDIO_DRIVER_WINMM 1)
1468     file(GLOB WINMM_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/winmm/*.c)
1469     set(SOURCE_FILES ${SOURCE_FILES} ${WINMM_AUDIO_SOURCES})
1470     endif()
1471     set(HAVE_SDL_AUDIO TRUE)
1472
1473     if(HAVE_DSOUND_H AND NOT WINDOWS_STORE)
1474       set(SDL_AUDIO_DRIVER_DSOUND 1)
1475       file(GLOB DSOUND_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/directsound/*.c)
1476       set(SOURCE_FILES ${SOURCE_FILES} ${DSOUND_AUDIO_SOURCES})
1477     endif()
1478
1479     if(WASAPI AND HAVE_AUDIOCLIENT_H AND HAVE_MMDEVICEAPI_H AND NOT WINDOWS_STORE)
1480       set(SDL_AUDIO_DRIVER_WASAPI 1)
1481       file(GLOB WASAPI_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/wasapi/*.c)
1482       set(SOURCE_FILES ${SOURCE_FILES} ${WASAPI_AUDIO_SOURCES})
1483     endif()
1484   endif()
1485
1486   if(SDL_VIDEO)
1487     # requires SDL_LOADSO on Windows (IME, DX, etc.)
1488     if(NOT SDL_LOADSO)
1489       message_error("SDL_VIDEO requires SDL_LOADSO, which is not enabled")
1490     endif()
1491     if(WINDOWS_STORE)
1492       set(SDL_VIDEO_DRIVER_WINRT 1)
1493       file(GLOB WIN_VIDEO_SOURCES
1494         ${SDL2_SOURCE_DIR}/src/video/winrt/*.c 
1495         ${SDL2_SOURCE_DIR}/src/video/winrt/*.cpp
1496         ${SDL2_SOURCE_DIR}/src/render/direct3d11/*.cpp
1497         )
1498     else()
1499     set(SDL_VIDEO_DRIVER_WINDOWS 1)
1500     file(GLOB WIN_VIDEO_SOURCES ${SDL2_SOURCE_DIR}/src/video/windows/*.c)
1501     endif()
1502     set(SOURCE_FILES ${SOURCE_FILES} ${WIN_VIDEO_SOURCES})
1503
1504     if(RENDER_D3D AND HAVE_D3D_H AND NOT WINDOWS_STORE)
1505       set(SDL_VIDEO_RENDER_D3D 1)
1506       set(HAVE_RENDER_D3D TRUE)
1507     endif()
1508     if(RENDER_D3D AND HAVE_D3D11_H)
1509       set(SDL_VIDEO_RENDER_D3D11 1)
1510       set(HAVE_RENDER_D3D TRUE)
1511     endif()
1512     set(HAVE_SDL_VIDEO TRUE)
1513   endif()
1514
1515   if(SDL_THREADS)
1516     set(SDL_THREAD_WINDOWS 1)
1517     set(SOURCE_FILES ${SOURCE_FILES}
1518       ${SDL2_SOURCE_DIR}/src/thread/windows/SDL_sysmutex.c
1519       ${SDL2_SOURCE_DIR}/src/thread/windows/SDL_syssem.c
1520       ${SDL2_SOURCE_DIR}/src/thread/windows/SDL_systhread.c
1521       ${SDL2_SOURCE_DIR}/src/thread/windows/SDL_systls.c
1522       ${SDL2_SOURCE_DIR}/src/thread/generic/SDL_syscond.c)
1523     set(HAVE_SDL_THREADS TRUE)
1524   endif()
1525
1526   if(SDL_SENSOR AND HAVE_SENSORSAPI_H)
1527     set(SDL_SENSOR_WINDOWS 1)
1528     set(HAVE_SDL_SENSORS TRUE)
1529     file(GLOB WINDOWS_SENSOR_SOURCES ${SDL2_SOURCE_DIR}/src/sensor/windows/*.c)
1530     set(SOURCE_FILES ${SOURCE_FILES} ${WINDOWS_SENSOR_SOURCES})
1531   endif()
1532
1533   if(SDL_POWER)
1534     if(WINDOWS_STORE)
1535       set(SDL_POWER_WINRT 1)
1536       set(SOURCE_FILES ${SOURCE_FILES} ${SDL2_SOURCE_DIR}/src/power/winrt/SDL_syspower.cpp)
1537     else()
1538       set(SDL_POWER_WINDOWS 1)
1539       set(SOURCE_FILES ${SOURCE_FILES} ${SDL2_SOURCE_DIR}/src/power/windows/SDL_syspower.c)
1540       set(HAVE_SDL_POWER TRUE)
1541     endif()
1542   endif()
1543
1544   if(SDL_LOCALE)
1545     file(GLOB LOCALE_SOURCES ${SDL2_SOURCE_DIR}/src/locale/windows/*.c)
1546     set(SOURCE_FILES ${SOURCE_FILES} ${LOCALE_SOURCES})
1547     set(HAVE_SDL_LOCALE TRUE)
1548   endif()
1549
1550   if(SDL_FILESYSTEM)
1551     set(SDL_FILESYSTEM_WINDOWS 1)
1552     if(WINDOWS_STORE)
1553       file(GLOB FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/winrt/*.cpp)
1554     else()
1555       file(GLOB FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/windows/*.c)
1556     endif()
1557     set(SOURCE_FILES ${SOURCE_FILES} ${FILESYSTEM_SOURCES})
1558     set(HAVE_SDL_FILESYSTEM TRUE)
1559   endif()
1560
1561   # Libraries for Win32 native and MinGW
1562   if(NOT WINDOWS_STORE)
1563     list(APPEND EXTRA_LIBS user32 gdi32 winmm imm32 ole32 oleaut32 version uuid advapi32 setupapi shell32)
1564   endif()
1565
1566   # TODO: in configure.ac the check for timers is set on
1567   # cygwin | mingw32* - does this include mingw32CE?
1568   if(SDL_TIMERS)
1569     set(SDL_TIMER_WINDOWS 1)
1570     file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/windows/*.c)
1571     set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES})
1572     set(HAVE_SDL_TIMERS TRUE)
1573   endif()
1574
1575   if(SDL_LOADSO)
1576     set(SDL_LOADSO_WINDOWS 1)
1577     file(GLOB LOADSO_SOURCES ${SDL2_SOURCE_DIR}/src/loadso/windows/*.c)
1578     set(SOURCE_FILES ${SOURCE_FILES} ${LOADSO_SOURCES})
1579     set(HAVE_SDL_LOADSO TRUE)
1580   endif()
1581
1582   file(GLOB CORE_SOURCES ${SDL2_SOURCE_DIR}/src/core/windows/*.c)
1583   set(SOURCE_FILES ${SOURCE_FILES} ${CORE_SOURCES})
1584
1585   if(SDL_VIDEO)
1586     if(VIDEO_OPENGL AND NOT WINDOWS_STORE)
1587       set(SDL_VIDEO_OPENGL 1)
1588       set(SDL_VIDEO_OPENGL_WGL 1)
1589       set(SDL_VIDEO_RENDER_OGL 1)
1590       set(HAVE_VIDEO_OPENGL TRUE)
1591     endif()
1592
1593     if(VIDEO_OPENGLES)
1594       set(SDL_VIDEO_OPENGL_EGL 1)
1595       set(SDL_VIDEO_OPENGL_ES2 1)
1596       set(SDL_VIDEO_RENDER_OGL_ES2 1)
1597       set(HAVE_VIDEO_OPENGLES TRUE)
1598     endif()
1599   endif()
1600
1601   if(SDL_JOYSTICK)
1602     CheckHIDAPI()
1603     # TODO: Remove this hid.c block when SDL_hidapi.c is supported on Windows!
1604     if(HAVE_HIDAPI)
1605       set(SOURCE_FILES ${SOURCE_FILES} ${SDL2_SOURCE_DIR}/src/hidapi/windows/hid.c)
1606     endif()
1607     file(GLOB JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/windows/*.c)
1608     set(SOURCE_FILES ${SOURCE_FILES} ${JOYSTICK_SOURCES})
1609     if(HAVE_DINPUT_H)
1610       set(SDL_JOYSTICK_DINPUT 1)
1611       list(APPEND EXTRA_LIBS dinput8)
1612     endif()
1613     if(HAVE_XINPUT_H)
1614       set(SDL_JOYSTICK_XINPUT 1)
1615     endif()
1616     if(NOT HAVE_DINPUT_H AND NOT HAVE_XINPUT_H)
1617       set(SDL_JOYSTICK_WINMM 1)
1618     endif()
1619     set(HAVE_SDL_JOYSTICK TRUE)
1620
1621     if(SDL_HAPTIC)
1622       if(HAVE_DINPUT_H OR HAVE_XINPUT_H)
1623         file(GLOB HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/windows/*.c)
1624         if(HAVE_DINPUT_H)
1625           set(SDL_HAPTIC_DINPUT 1)
1626         endif()
1627         if(HAVE_XINPUT_H)
1628           set(SDL_HAPTIC_XINPUT 1)
1629         endif()
1630       else()
1631         file(GLOB HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/dummy/*.c)
1632         set(SDL_HAPTIC_DUMMY 1)
1633       endif()
1634       set(SOURCE_FILES ${SOURCE_FILES} ${HAPTIC_SOURCES})
1635       set(HAVE_SDL_HAPTIC TRUE)
1636     endif()
1637   endif()
1638
1639   file(GLOB VERSION_SOURCES ${SDL2_SOURCE_DIR}/src/main/windows/*.rc)
1640   file(GLOB SDLMAIN_SOURCES ${SDL2_SOURCE_DIR}/src/main/windows/*.c)
1641   if(MINGW OR CYGWIN)
1642     list(APPEND EXTRA_LIBS mingw32)
1643     list(APPEND EXTRA_LDFLAGS "-mwindows")
1644     set(SDL_CFLAGS "${SDL_CFLAGS} -Dmain=SDL_main")
1645     list(APPEND SDL_LIBS "-lmingw32" "-lSDL2main" "-mwindows")
1646   endif()
1647
1648 elseif(APPLE)
1649   # TODO: rework this all for proper MacOS X, iOS and Darwin support
1650
1651   # We always need these libs on macOS at the moment.
1652   # !!! FIXME: we need Carbon for some very old API calls in
1653   # !!! FIXME:  src/video/cocoa/SDL_cocoakeyboard.c, but we should figure out
1654   # !!! FIXME:  how to dump those.
1655   if(DARWIN OR MACOSX)
1656     set(SDL_FRAMEWORK_COCOA 1)
1657     set(SDL_FRAMEWORK_CARBON 1)
1658   endif()
1659   set(SDL_FRAMEWORK_FOUNDATION 1)
1660
1661   # Requires the darwin file implementation
1662   if(SDL_FILE)
1663     file(GLOB EXTRA_SOURCES ${SDL2_SOURCE_DIR}/src/file/cocoa/*.m)
1664     set(SOURCE_FILES ${EXTRA_SOURCES} ${SOURCE_FILES})
1665     # !!! FIXME: modern CMake doesn't need "LANGUAGE C" for Objective-C.
1666     set_source_files_properties(${EXTRA_SOURCES} PROPERTIES LANGUAGE C)
1667     set(HAVE_SDL_FILE TRUE)
1668     # !!! FIXME: why is COREVIDEO inside this if() block?
1669     set(SDL_FRAMEWORK_COREVIDEO 1)
1670   else()
1671     message_error("SDL_FILE must be enabled to build on MacOS X")
1672   endif()
1673
1674   file(GLOB MISC_SOURCES ${SDL2_SOURCE_DIR}/src/misc/macosx/*.m)
1675   set(SOURCE_FILES ${SOURCE_FILES} ${MISC_SOURCES})
1676   set(HAVE_SDL_MISC TRUE)
1677
1678   if(SDL_AUDIO)
1679     set(SDL_AUDIO_DRIVER_COREAUDIO 1)
1680     file(GLOB AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/coreaudio/*.m)
1681     # !!! FIXME: modern CMake doesn't need "LANGUAGE C" for Objective-C.
1682     set_source_files_properties(${AUDIO_SOURCES} PROPERTIES LANGUAGE C)
1683     set(SOURCE_FILES ${SOURCE_FILES} ${AUDIO_SOURCES})
1684     set(HAVE_SDL_AUDIO TRUE)
1685     set(SDL_FRAMEWORK_COREAUDIO 1)
1686     set(SDL_FRAMEWORK_AUDIOTOOLBOX 1)
1687     set(SDL_FRAMEWORK_AVFOUNDATION 1)
1688   endif()
1689
1690   if(SDL_JOYSTICK)
1691     CheckHIDAPI()
1692     if(HAVE_HIDAPI)
1693       if(IOS OR TVOS)
1694         set(SOURCE_FILES ${SOURCE_FILES} ${SDL2_SOURCE_DIR}/src/hidapi/ios/hid.m)
1695         set(SDL_FRAMEWORK_COREBLUETOOTH 1)
1696       endif()
1697     endif()
1698     if(IOS OR TVOS)
1699       file(GLOB JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/iphoneos/*.m ${SDL2_SOURCE_DIR}/src/joystick/steam/*.c)
1700       set(SDL_JOYSTICK_MFI 1)
1701       if(IOS)
1702         set(SDL_FRAMEWORK_COREMOTION 1)
1703       endif()
1704       set(SDL_FRAMEWORK_GAMECONTROLLER 1)
1705       set(HAVE_SDL_SENSORS 1)
1706     else()
1707       file(GLOB JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/darwin/*.c ${SDL2_SOURCE_DIR}/src/joystick/iphoneos/*.m)
1708       # FIXME: add checks for SDL_JOYSTICK_MFI???
1709       set(SDL_JOYSTICK_IOKIT 1)
1710       set(SDL_FRAMEWORK_IOKIT 1)
1711       set(SDL_FRAMEWORK_FF 1)
1712     endif()
1713     set(SOURCE_FILES ${SOURCE_FILES} ${JOYSTICK_SOURCES})
1714     set(HAVE_SDL_JOYSTICK TRUE)
1715   endif()
1716
1717   if(SDL_HAPTIC)
1718     if (IOS OR TVOS)
1719       file(GLOB HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/dummy/*.c)
1720       set(SDL_HAPTIC_DUMMY 1)
1721     else()
1722       file(GLOB HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/darwin/*.c)
1723       set(SDL_HAPTIC_IOKIT 1)
1724       set(SDL_FRAMEWORK_IOKIT 1)
1725       set(SDL_FRAMEWORK_FF 1)
1726     endif()
1727     set(SOURCE_FILES ${SOURCE_FILES} ${HAPTIC_SOURCES})
1728     set(HAVE_SDL_HAPTIC TRUE)
1729     if(NOT SDL_JOYSTICK)
1730       message(FATAL_ERROR "SDL_HAPTIC requires SDL_JOYSTICK to be enabled")
1731     endif()
1732   endif()
1733
1734   if(SDL_POWER)
1735     if (IOS OR TVOS)
1736       file(GLOB POWER_SOURCES ${SDL2_SOURCE_DIR}/src/power/uikit/*.m)
1737       set(SDL_POWER_UIKIT 1)
1738     else()
1739       file(GLOB POWER_SOURCES ${SDL2_SOURCE_DIR}/src/power/macosx/*.c)
1740       set(SDL_POWER_MACOSX 1)
1741       set(SDL_FRAMEWORK_IOKIT 1)
1742     endif()
1743     set(SOURCE_FILES ${SOURCE_FILES} ${POWER_SOURCES})
1744     set(HAVE_SDL_POWER TRUE)
1745   endif()
1746
1747   if(SDL_LOCALE)
1748     file(GLOB LOCALE_SOURCES ${SDL2_SOURCE_DIR}/src/locale/macosx/*.m)
1749     set(SOURCE_FILES ${SOURCE_FILES} ${LOCALE_SOURCES})
1750     set(HAVE_SDL_LOCALE TRUE)
1751   endif()
1752
1753   if(SDL_TIMERS)
1754     set(SDL_TIMER_UNIX 1)
1755     file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/unix/*.c)
1756     set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES})
1757     set(HAVE_SDL_TIMERS TRUE)
1758   endif(SDL_TIMERS)
1759
1760   if(SDL_FILESYSTEM)
1761     set(SDL_FILESYSTEM_COCOA 1)
1762     file(GLOB FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/cocoa/*.m)
1763     # !!! FIXME: modern CMake doesn't need "LANGUAGE C" for Objective-C.
1764     set_source_files_properties(${FILESYSTEM_SOURCES} PROPERTIES LANGUAGE C)
1765     set(SOURCE_FILES ${SOURCE_FILES} ${FILESYSTEM_SOURCES})
1766     set(HAVE_SDL_FILESYSTEM TRUE)
1767   endif()
1768
1769   if(SDL_SENSOR)
1770     if(IOS)
1771       set(SDL_SENSOR_COREMOTION 1)
1772       set(HAVE_SDL_SENSORS TRUE)
1773       file(GLOB SENSOR_SOURCES ${SDL2_SOURCE_DIR}/src/sensor/coremotion/*.m)
1774       set(SOURCE_FILES ${SOURCE_FILES} ${SENSOR_SOURCES})
1775     endif()
1776   endif()
1777
1778   # iOS hack needed - http://code.google.com/p/ios-cmake/ ?
1779   if(SDL_VIDEO)
1780     if (IOS OR TVOS)
1781       set(SDL_VIDEO_DRIVER_UIKIT 1)
1782       set(SDL_FRAMEWORK_COREGRAPHICS 1)
1783       set(SDL_FRAMEWORK_QUARTZCORE 1)
1784       set(SDL_FRAMEWORK_UIKIT 1)
1785       set(SDL_IPHONE_KEYBOARD 1)
1786       set(SDL_IPHONE_LAUNCHSCREEN 1)
1787       file(GLOB UIKITVIDEO_SOURCES ${SDL2_SOURCE_DIR}/src/video/uikit/*.m)
1788       set(SOURCE_FILES ${SOURCE_FILES} ${UIKITVIDEO_SOURCES})
1789     else()
1790       CheckCOCOA()
1791       if(VIDEO_OPENGL)
1792         set(SDL_VIDEO_OPENGL 1)
1793         set(SDL_VIDEO_OPENGL_CGL 1)
1794         set(SDL_VIDEO_RENDER_OGL 1)
1795         set(HAVE_VIDEO_OPENGL TRUE)
1796       endif()
1797     endif()
1798
1799     if(VIDEO_OPENGLES)
1800       if(IOS OR TVOS)
1801         set(SDL_FRAMEWORK_OPENGLES 1)
1802         set(SDL_VIDEO_OPENGL_ES 1)
1803         set(SDL_VIDEO_RENDER_OGL_ES 1)
1804       else()
1805         set(SDL_VIDEO_OPENGL_EGL 1)
1806       endif()
1807       set(SDL_VIDEO_OPENGL_ES2 1)
1808       set(SDL_VIDEO_RENDER_OGL_ES2 1)
1809       set(HAVE_VIDEO_OPENGLES TRUE)
1810     endif()
1811
1812     if(VIDEO_VULKAN OR VIDEO_METAL OR RENDER_METAL)
1813       set(ORIG_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
1814       set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -ObjC")
1815       check_c_source_compiles("
1816         #include <AvailabilityMacros.h>
1817         #import <Metal/Metal.h>
1818         #import <QuartzCore/CAMetalLayer.h>
1819
1820         #if TARGET_OS_SIMULATOR || (!TARGET_CPU_X86_64 && !TARGET_CPU_ARM64)
1821         #error Metal doesn't work on this configuration
1822         #endif
1823         int main()
1824         {
1825             return 0;
1826         }
1827         " HAVE_FRAMEWORK_METAL)
1828       set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS})
1829       if(HAVE_FRAMEWORK_METAL)
1830         set(SDL_FRAMEWORK_METAL 1)
1831         set(SDL_FRAMEWORK_QUARTZCORE 1)
1832       else()
1833         set(VIDEO_VULKAN 0)
1834         set(VIDEO_METAL 0)
1835         set(RENDER_METAL 0)
1836       endif()
1837     endif()
1838
1839     if(VIDEO_METAL)
1840       set(SDL_VIDEO_METAL 1)
1841       set(HAVE_VIDEO_METAL TRUE)
1842     endif()
1843
1844     if(RENDER_METAL)
1845       file(GLOB RENDER_METAL_SOURCES ${SDL2_SOURCE_DIR}/src/render/metal/*.m)
1846       set(SOURCE_FILES ${SOURCE_FILES} ${RENDER_METAL_SOURCES})
1847       set(SDL_VIDEO_RENDER_METAL 1)
1848       set(HAVE_RENDER_METAL TRUE)
1849     endif()
1850   endif()
1851
1852   # Actually load the frameworks at the end so we don't duplicate include.
1853   if(SDL_FRAMEWORK_COREVIDEO)
1854     find_library(COREVIDEO CoreVideo)
1855     list(APPEND EXTRA_LIBS ${COREVIDEO})
1856   endif()
1857   if(SDL_FRAMEWORK_COCOA)
1858     find_library(COCOA_LIBRARY Cocoa)
1859     list(APPEND EXTRA_LIBS ${COCOA_LIBRARY})
1860   endif()
1861   if(SDL_FRAMEWORK_IOKIT)
1862     find_library(IOKIT IOKit)
1863     list(APPEND EXTRA_LIBS ${IOKIT})
1864   endif()
1865   if(SDL_FRAMEWORK_FF)
1866     find_library(FORCEFEEDBACK ForceFeedback)
1867     list(APPEND EXTRA_LIBS ${FORCEFEEDBACK})
1868   endif()
1869   if(SDL_FRAMEWORK_CARBON)
1870     find_library(CARBON_LIBRARY Carbon)
1871     list(APPEND EXTRA_LIBS ${CARBON_LIBRARY})
1872   endif()
1873   if(SDL_FRAMEWORK_COREAUDIO)
1874     find_library(COREAUDIO CoreAudio)
1875     list(APPEND EXTRA_LIBS ${COREAUDIO})
1876   endif()
1877   if(SDL_FRAMEWORK_AUDIOTOOLBOX)
1878     find_library(AUDIOTOOLBOX AudioToolbox)
1879     list(APPEND EXTRA_LIBS ${AUDIOTOOLBOX})
1880   endif()
1881   if(SDL_FRAMEWORK_AVFOUNDATION)
1882     find_library(AVFOUNDATION AVFoundation)
1883     list(APPEND EXTRA_LIBS ${AVFOUNDATION})
1884   endif()
1885   if(SDL_FRAMEWORK_COREBLUETOOTH)
1886     find_library(COREBLUETOOTH CoreBluetooth)
1887     list(APPEND EXTRA_LIBS ${COREBLUETOOTH})
1888   endif()
1889   if(SDL_FRAMEWORK_COREGRAPHICS)
1890     find_library(COREGRAPHICS CoreGraphics)
1891     list(APPEND EXTRA_LIBS ${COREGRAPHICS})
1892   endif()
1893   if(SDL_FRAMEWORK_COREMOTION)
1894     find_library(COREMOTION CoreMotion)
1895     list(APPEND EXTRA_LIBS ${COREMOTION})
1896   endif()
1897   if(SDL_FRAMEWORK_FOUNDATION)
1898     find_library(FOUNDATION Foundation)
1899     list(APPEND EXTRA_LIBS ${FOUNDATION})
1900   endif()
1901   if(SDL_FRAMEWORK_GAMECONTROLLER)
1902     find_library(GAMECONTROLLER GameController)
1903     list(APPEND EXTRA_LIBS ${GAMECONTROLLER})
1904   endif()
1905   if(SDL_FRAMEWORK_METAL)
1906     if(IOS OR TVOS)
1907       find_library(METAL Metal)
1908       list(APPEND EXTRA_LIBS ${METAL})
1909     else()
1910       list(APPEND EXTRA_LDFLAGS "-Wl,-weak_framework,Metal")
1911     endif()
1912   endif()
1913   if(SDL_FRAMEWORK_OPENGLES)
1914     find_library(OPENGLES OpenGLES)
1915     list(APPEND EXTRA_LIBS ${OPENGLES})
1916   endif()
1917   if(SDL_FRAMEWORK_QUARTZCORE)
1918     if(IOS OR TVOS)
1919       find_library(QUARTZCORE QuartzCore)
1920       list(APPEND EXTRA_LIBS ${QUARTZCORE})
1921     else()
1922       list(APPEND EXTRA_LDFLAGS "-Wl,-weak_framework,QuartzCore")
1923     endif()
1924   endif()
1925   if(SDL_FRAMEWORK_UIKIT)
1926     find_library(UIKIT UIKit)
1927     list(APPEND EXTRA_LIBS ${UIKIT})
1928   endif()
1929
1930   CheckPTHREAD()
1931
1932 elseif(HAIKU)
1933   file(GLOB MISC_SOURCES ${SDL2_SOURCE_DIR}/src/misc/haiku/*.cc)
1934   set(SOURCE_FILES ${SOURCE_FILES} ${MISC_SOURCES})
1935   set(HAVE_SDL_MISC TRUE)
1936
1937   if(SDL_VIDEO)
1938     set(SDL_VIDEO_DRIVER_HAIKU 1)
1939     file(GLOB HAIKUVIDEO_SOURCES ${SDL2_SOURCE_DIR}/src/video/haiku/*.c)
1940     set(SOURCE_FILES ${SOURCE_FILES} ${HAIKUVIDEO_SOURCES})
1941     set(HAVE_SDL_VIDEO TRUE)
1942
1943     if(VIDEO_OPENGL)
1944       # TODO: Use FIND_PACKAGE(OpenGL) instead
1945       set(SDL_VIDEO_OPENGL 1)
1946       set(SDL_VIDEO_OPENGL_BGL 1)
1947       set(SDL_VIDEO_RENDER_OGL 1)
1948       list(APPEND EXTRA_LIBS GL)
1949       set(HAVE_VIDEO_OPENGL TRUE)
1950     endif()
1951   endif()
1952
1953   set(SDL_FILESYSTEM_HAIKU 1)
1954   file(GLOB FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/haiku/*.cc)
1955   set(SOURCE_FILES ${SOURCE_FILES} ${FILESYSTEM_SOURCES})
1956   set(HAVE_SDL_FILESYSTEM TRUE)
1957
1958   if(SDL_TIMERS)
1959     set(SDL_TIMER_HAIKU 1)
1960     file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/haiku/*.c)
1961     set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES})
1962     set(HAVE_SDL_TIMERS TRUE)
1963   endif()
1964
1965   if(SDL_LOCALE)
1966     file(GLOB LOCALE_SOURCES ${SDL2_SOURCE_DIR}/src/locale/haiku/*.cc)
1967     set(SOURCE_FILES ${SOURCE_FILES} ${LOCALE_SOURCES})
1968     set(HAVE_SDL_LOCALE TRUE)
1969   endif()
1970
1971   CheckPTHREAD()
1972
1973 elseif(RISCOS)
1974   file(GLOB MISC_SOURCES ${SDL2_SOURCE_DIR}/src/misc/riscos/*.c)
1975   set(SOURCE_FILES ${SOURCE_FILES} ${MISC_SOURCES})
1976   set(HAVE_SDL_MISC TRUE)
1977
1978   if(SDL_TIMERS)
1979     set(SDL_TIMER_UNIX 1)
1980     file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/unix/*.c)
1981     set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES})
1982     set(HAVE_SDL_TIMERS TRUE)
1983
1984     if(CLOCK_GETTIME)
1985       set(HAVE_CLOCK_GETTIME 1)
1986     endif()
1987   endif()
1988
1989   CheckPTHREAD()
1990 elseif(TIZEN)
1991   if(SDL_VIDEO)
1992     add_definitions(-D_EFL_BETA_API_SUPPORT)
1993     if(VIDEO_VULKAN)
1994       set(SDL_VIDEO_VULKAN 1)
1995       set(HAVE_VIDEO_VULKAN TRUE)
1996       set(SDL_CFLAGS "${SDL_CFLAGS} -I/usr/include")
1997     endif()
1998   endif()
1999 endif()
2000
2001 if(VIDEO_VULKAN)
2002   set(SDL_VIDEO_VULKAN 1)
2003   set(HAVE_VIDEO_VULKAN TRUE)
2004 endif()
2005
2006 # Dummies
2007 # configure.ac does it differently:
2008 # if not have X
2009 #   if enable_X {  SDL_X_DISABLED = 1 }
2010 #   [add dummy sources]
2011 # so it always adds a dummy, without checking, if it was actually requested.
2012 # This leads to missing internal references on building, since the
2013 # src/X/*.c does not get included.
2014 if(NOT HAVE_SDL_JOYSTICK)
2015   set(SDL_JOYSTICK_DUMMY 1)
2016   if(SDL_JOYSTICK AND NOT APPLE) # results in unresolved symbols on OSX
2017     file(GLOB JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/dummy/*.c)
2018     set(SOURCE_FILES ${SOURCE_FILES} ${JOYSTICK_SOURCES})
2019   endif()
2020 endif()
2021 if(NOT HAVE_SDL_HAPTIC)
2022   set(SDL_HAPTIC_DUMMY 1)
2023   file(GLOB HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/dummy/*.c)
2024   set(SOURCE_FILES ${SOURCE_FILES} ${HAPTIC_SOURCES})
2025 endif()
2026 if(NOT HAVE_SDL_SENSORS)
2027   set(SDL_SENSOR_DUMMY 1)
2028   file(GLOB SENSORS_SOURCES ${SDL2_SOURCE_DIR}/src/sensor/dummy/*.c)
2029   set(SOURCE_FILES ${SOURCE_FILES} ${SENSORS_SOURCES})
2030 endif()
2031 if(NOT HAVE_SDL_LOADSO)
2032   set(SDL_LOADSO_DISABLED 1)
2033   file(GLOB LOADSO_SOURCES ${SDL2_SOURCE_DIR}/src/loadso/dummy/*.c)
2034   set(SOURCE_FILES ${SOURCE_FILES} ${LOADSO_SOURCES})
2035 endif()
2036 if(NOT HAVE_SDL_FILESYSTEM)
2037   set(SDL_FILESYSTEM_DISABLED 1)
2038   file(GLOB FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/dummy/*.c)
2039   set(SOURCE_FILES ${SOURCE_FILES} ${FILESYSTEM_SOURCES})
2040 endif()
2041 if(NOT HAVE_SDL_LOCALE)
2042   set(SDL_LOCALE_DISABLED 1)
2043   file(GLOB LOCALE_SOURCES ${SDL2_SOURCE_DIR}/src/locale/dummy/*.c)
2044   set(SOURCE_FILES ${SOURCE_FILES} ${LOCALE_SOURCES})
2045 endif()
2046 if(NOT HAVE_SDL_MISC)
2047   set(SDL_MISC_DISABLED 1)
2048   file(GLOB LOCALE_SOURCES ${SDL2_SOURCE_DIR}/src/misc/dummy/*.c)
2049   set(SOURCE_FILES ${SOURCE_FILES} ${LOCALE_SOURCES})
2050 endif()
2051
2052 # We always need to have threads and timers around
2053 if(NOT HAVE_SDL_THREADS)
2054   set(SDL_THREADS_DISABLED 1)
2055   file(GLOB THREADS_SOURCES ${SDL2_SOURCE_DIR}/src/thread/generic/*.c)
2056   set(SOURCE_FILES ${SOURCE_FILES} ${THREADS_SOURCES})
2057 endif()
2058 if(NOT HAVE_SDL_TIMERS)
2059   set(SDL_TIMERS_DISABLED 1)
2060   file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/dummy/*.c)
2061   set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES})
2062 endif()
2063
2064 if(NOT SDLMAIN_SOURCES)
2065   file(GLOB SDLMAIN_SOURCES ${SDL2_SOURCE_DIR}/src/main/dummy/*.c)
2066 endif()
2067
2068 # Append the -MMD -MT flags
2069 # if(DEPENDENCY_TRACKING)
2070 #   if(COMPILER_IS_GNUCC)
2071 #     set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -MMD -MT \$@")
2072 #   endif()
2073 # endif()
2074
2075 configure_file("${SDL2_SOURCE_DIR}/include/SDL_config.h.cmake"
2076   "${SDL2_BINARY_DIR}/include/SDL_config.h")
2077
2078 # Prepare the flags and remove duplicates
2079 if(EXTRA_LDFLAGS)
2080   list(REMOVE_DUPLICATES EXTRA_LDFLAGS)
2081 endif()
2082 if(EXTRA_LIBS)
2083   list(REMOVE_DUPLICATES EXTRA_LIBS)
2084 endif()
2085 if(EXTRA_CFLAGS)
2086   list(REMOVE_DUPLICATES EXTRA_CFLAGS)
2087 endif()
2088 listtostr(EXTRA_CFLAGS _EXTRA_CFLAGS)
2089 set(EXTRA_CFLAGS ${_EXTRA_CFLAGS})
2090
2091 # Compat helpers for the configuration files
2092 if(NOT CMAKE_HOST_WIN32)
2093   # TODO: we need a Windows script, too
2094   execute_process(COMMAND sh ${SDL2_SOURCE_DIR}/build-scripts/updaterev.sh
2095     WORKING_DIRECTORY ${SDL2_BINARY_DIR})
2096 endif()
2097 if(NOT WINDOWS OR CYGWIN)
2098   set(prefix ${CMAKE_INSTALL_PREFIX})
2099   set(exec_prefix "\${prefix}")
2100   set(libdir "\${exec_prefix}/lib${LIB_SUFFIX}")
2101   set(bindir "\${exec_prefix}/bin")
2102   set(includedir "\${prefix}/include")
2103   if(SDL_STATIC)
2104     set(ENABLE_STATIC_TRUE "")
2105     set(ENABLE_STATIC_FALSE "#")
2106   else()
2107     set(ENABLE_STATIC_TRUE "#")
2108     set(ENABLE_STATIC_FALSE "")
2109   endif()
2110   if(SDL_SHARED)
2111     set(PKG_CONFIG_LIBS_PRIV "
2112 Libs.private:")
2113     set(ENABLE_SHARED_TRUE "")
2114     set(ENABLE_SHARED_FALSE "#")
2115   else()
2116     set(PKG_CONFIG_LIBS_PRIV "")
2117     set(ENABLE_SHARED_TRUE "#")
2118     set(ENABLE_SHARED_FALSE "")
2119   endif()
2120
2121   # Clean up the different lists
2122   listtostr(EXTRA_LIBS _EXTRA_LIBS "-l")
2123   set(SDL_STATIC_LIBS ${EXTRA_LDFLAGS} ${_EXTRA_LIBS})
2124   list(REMOVE_DUPLICATES SDL_STATIC_LIBS)
2125   listtostr(SDL_STATIC_LIBS _SDL_STATIC_LIBS)
2126   set(SDL_STATIC_LIBS ${_SDL_STATIC_LIBS})
2127   listtostr(SDL_LIBS _SDL_LIBS)
2128   set(SDL_LIBS ${_SDL_LIBS})
2129
2130   # MESSAGE(STATUS "SDL_LIBS: ${SDL_LIBS}")
2131   # MESSAGE(STATUS "SDL_STATIC_LIBS: ${SDL_STATIC_LIBS}")
2132
2133   configure_file("${SDL2_SOURCE_DIR}/sdl2.pc.in"
2134     "${SDL2_BINARY_DIR}/sdl2.pc" @ONLY)
2135   configure_file("${SDL2_SOURCE_DIR}/sdl2-config.in"
2136     "${SDL2_BINARY_DIR}/sdl2-config")
2137   configure_file("${SDL2_SOURCE_DIR}/sdl2-config.in"
2138     "${SDL2_BINARY_DIR}/sdl2-config" @ONLY)
2139   configure_file("${SDL2_SOURCE_DIR}/SDL2.spec.in"
2140     "${SDL2_BINARY_DIR}/SDL2.spec" @ONLY)
2141 endif()
2142
2143 ##### Info output #####
2144 message(STATUS "")
2145 message(STATUS "SDL2 was configured with the following options:")
2146 message(STATUS "")
2147 message(STATUS "Platform: ${CMAKE_SYSTEM}")
2148 message(STATUS "64-bit:   ${ARCH_64}")
2149 message(STATUS "Compiler: ${CMAKE_C_COMPILER}")
2150 message(STATUS "")
2151 message(STATUS "Subsystems:")
2152 foreach(_SUB ${SDL_SUBSYSTEMS})
2153   string(TOUPPER ${_SUB} _OPT)
2154   message_bool_option(${_SUB} SDL_${_OPT})
2155 endforeach()
2156 message(STATUS "")
2157 message(STATUS "Options:")
2158 list(SORT ALLOPTIONS)
2159 foreach(_OPT ${ALLOPTIONS})
2160   # Longest option is VIDEO_X11_XSCREENSAVER = 22 characters
2161   # Get the padding
2162   string(LENGTH ${_OPT} _OPTLEN)
2163   math(EXPR _PADLEN "23 - ${_OPTLEN}")
2164   string(RANDOM LENGTH ${_PADLEN} ALPHABET " " _PADDING)
2165   message_tested_option(${_OPT} ${_PADDING})
2166 endforeach()
2167 message(STATUS "")
2168 message(STATUS " CFLAGS:        ${CMAKE_C_FLAGS}")
2169 message(STATUS " EXTRA_CFLAGS:  ${EXTRA_CFLAGS}")
2170 message(STATUS " EXTRA_LDFLAGS: ${EXTRA_LDFLAGS}")
2171 message(STATUS " EXTRA_LIBS:    ${EXTRA_LIBS}")
2172 message(STATUS "")
2173 message(STATUS " Build Shared Library: ${SDL_SHARED}")
2174 message(STATUS " Build Static Library: ${SDL_STATIC}")
2175 if(SDL_STATIC)
2176     message(STATUS " Build Static Library with Position Independent Code: ${SDL_STATIC_PIC}")
2177 endif()
2178 message(STATUS "")
2179 if(UNIX)
2180   message(STATUS "If something was not detected, although the libraries")
2181   message(STATUS "were installed, then make sure you have set the")
2182   message(STATUS "CFLAGS and LDFLAGS environment variables correctly.")
2183   message(STATUS "")
2184 endif()
2185
2186 if(WARN_ABOUT_ARM_SIMD_ASM_MIT)
2187   message(STATUS "")
2188   message(STATUS "SDL is being built with ARM SIMD optimizations, which")
2189   message(STATUS "uses code licensed under the MIT license. If this is a")
2190   message(STATUS "problem, please disable that code by rerunning CMake with:")
2191   message(STATUS "")
2192   message(STATUS "    -DARMSIMD=OFF")
2193 endif()
2194
2195 if(WARN_ABOUT_ARM_NEON_ASM_MIT)
2196   message(STATUS "")
2197   message(STATUS "SDL is being built with ARM NEON optimizations, which")
2198   message(STATUS "uses code licensed under the MIT license. If this is a")
2199   message(STATUS "problem, please disable that code by rerunning CMake with:")
2200   message(STATUS "")
2201   message(STATUS "    -DARMNEON=OFF")
2202 endif()
2203
2204 # Ensure that the extra cflags are used at compile time
2205 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS}")
2206
2207 # Always build SDLmain
2208 if(NOT WINDOWS_STORE)
2209 add_library(SDL2main STATIC ${SDLMAIN_SOURCES})
2210 target_include_directories(SDL2main PUBLIC "$<BUILD_INTERFACE:${SDL2_SOURCE_DIR}/include>" $<INSTALL_INTERFACE:include> $<INSTALL_INTERFACE:include/SDL2>)
2211 set(_INSTALL_LIBS "SDL2main")
2212 if (NOT ANDROID)
2213   set_target_properties(SDL2main PROPERTIES DEBUG_POSTFIX "${SDL_CMAKE_DEBUG_POSTFIX}")
2214 endif()
2215 endif()
2216
2217 if (ANDROID AND HAVE_HIDAPI)
2218   set(_INSTALL_LIBS ${_INSTALL_LIBS} "hidapi")
2219 endif()
2220
2221 if(SDL_SHARED)
2222   add_library(SDL2 SHARED ${SOURCE_FILES} ${VERSION_SOURCES})
2223   if(APPLE)
2224     set_target_properties(SDL2 PROPERTIES
2225       MACOSX_RPATH 1
2226       OUTPUT_NAME "SDL2-${LT_RELEASE}")
2227   elseif(UNIX AND NOT ANDROID)
2228     set_target_properties(SDL2 PROPERTIES
2229       VERSION ${LT_VERSION}
2230       SOVERSION ${LT_REVISION}
2231       OUTPUT_NAME "SDL2-${LT_RELEASE}")
2232   else()
2233     if(WINDOWS OR CYGWIN)
2234       set_target_properties(SDL2 PROPERTIES
2235         DEFINE_SYMBOL DLL_EXPORT)
2236     endif()
2237     set_target_properties(SDL2 PROPERTIES
2238       VERSION ${SDL_VERSION}
2239       SOVERSION ${LT_REVISION}
2240       OUTPUT_NAME "SDL2")
2241   endif()
2242   if(MSVC AND NOT LIBC)
2243     # Don't try to link with the default set of libraries.
2244     set_target_properties(SDL2 PROPERTIES LINK_FLAGS_RELEASE "/NODEFAULTLIB")
2245     set_target_properties(SDL2 PROPERTIES LINK_FLAGS_DEBUG "/NODEFAULTLIB")
2246     set_target_properties(SDL2 PROPERTIES STATIC_LIBRARY_FLAGS "/NODEFAULTLIB")
2247   endif()
2248   set(_INSTALL_LIBS "SDL2" ${_INSTALL_LIBS})
2249   target_link_libraries(SDL2 PRIVATE ${EXTRA_LIBS} ${EXTRA_LDFLAGS})
2250   target_include_directories(SDL2 PUBLIC "$<BUILD_INTERFACE:${SDL2_SOURCE_DIR}/include>" $<INSTALL_INTERFACE:include> $<INSTALL_INTERFACE:include/SDL2>)
2251   if(ANDROID)
2252     target_include_directories(SDL2 PRIVATE ${ANDROID_NDK}/sources/android/cpufeatures)
2253   else()
2254     set_target_properties(SDL2 PROPERTIES DEBUG_POSTFIX "${SDL_CMAKE_DEBUG_POSTFIX}")
2255   endif()
2256   if(IOS OR TVOS)
2257     set_property(TARGET SDL2 APPEND_STRING PROPERTY COMPILE_FLAGS "-fobjc-arc")
2258     target_compile_definitions(SDL2 PRIVATE IOS_DYLIB=1)
2259   endif()
2260 endif()
2261
2262 if(ANDROID)
2263   if(HAVE_HIDAPI)
2264     add_library(hidapi SHARED ${SDL2_SOURCE_DIR}/src/hidapi/android/hid.cpp)
2265   endif()
2266
2267   if(MSVC AND NOT LIBC)
2268     # Don't try to link with the default set of libraries.
2269     set_target_properties(hidapi PROPERTIES LINK_FLAGS_RELEASE "/NODEFAULTLIB")
2270     set_target_properties(hidapi PROPERTIES LINK_FLAGS_DEBUG "/NODEFAULTLIB")
2271     set_target_properties(hidapi PROPERTIES STATIC_LIBRARY_FLAGS "/NODEFAULTLIB")
2272   endif()
2273   if(HAVE_HIDAPI)
2274     target_link_libraries(hidapi log)
2275   endif()
2276 endif()
2277
2278 if(SDL_STATIC)
2279   set (BUILD_SHARED_LIBS FALSE)
2280   add_library(SDL2-static STATIC ${SOURCE_FILES})
2281   if (NOT SDL_SHARED OR NOT WIN32)
2282     set_target_properties(SDL2-static PROPERTIES OUTPUT_NAME "SDL2")
2283     # Note: Apparently, OUTPUT_NAME must really be unique; even when
2284     # CMAKE_IMPORT_LIBRARY_SUFFIX or the like are given. Otherwise
2285     # the static build may race with the import lib and one will get
2286     # clobbered, when the suffix is realized via subsequent rename.
2287   endif()
2288   set_target_properties(SDL2-static PROPERTIES POSITION_INDEPENDENT_CODE ${SDL_STATIC_PIC})
2289   if(MSVC AND NOT LIBC)
2290     set_target_properties(SDL2-static PROPERTIES LINK_FLAGS_RELEASE "/NODEFAULTLIB")
2291     set_target_properties(SDL2-static PROPERTIES LINK_FLAGS_DEBUG "/NODEFAULTLIB")
2292     set_target_properties(SDL2-static PROPERTIES STATIC_LIBRARY_FLAGS "/NODEFAULTLIB")
2293   endif()
2294   # TODO: Win32 platforms keep the same suffix .lib for import and static
2295   # libraries - do we need to consider this?
2296   set(_INSTALL_LIBS "SDL2-static" ${_INSTALL_LIBS})
2297   target_link_libraries(SDL2-static ${EXTRA_LIBS} ${EXTRA_LDFLAGS})
2298   target_include_directories(SDL2-static PUBLIC "$<BUILD_INTERFACE:${SDL2_SOURCE_DIR}/include>" $<INSTALL_INTERFACE:include> $<INSTALL_INTERFACE:include/SDL2>)
2299   if(ANDROID)
2300     target_include_directories(SDL2-static PRIVATE ${ANDROID_NDK}/sources/android/cpufeatures)
2301   else()
2302     set_target_properties(SDL2-static PROPERTIES DEBUG_POSTFIX "${SDL_CMAKE_DEBUG_POSTFIX}")
2303   endif()
2304   if(IOS OR TVOS)
2305     set_property(TARGET SDL2-static APPEND_STRING PROPERTY COMPILE_FLAGS "-fobjc-arc")
2306   endif()
2307 endif()
2308
2309 ##### Tests #####
2310
2311 if(SDL_TEST)
2312   file(GLOB TEST_SOURCES ${SDL2_SOURCE_DIR}/src/test/*.c)
2313   add_library(SDL2_test STATIC ${TEST_SOURCES})
2314
2315   add_subdirectory(test)
2316 endif()
2317
2318 ##### Installation targets #####
2319 install(TARGETS ${_INSTALL_LIBS} EXPORT SDL2Targets
2320   LIBRARY DESTINATION "lib${LIB_SUFFIX}"
2321   ARCHIVE DESTINATION "lib${LIB_SUFFIX}"
2322   RUNTIME DESTINATION bin)
2323
2324 ##### Export files #####
2325 if (WINDOWS)
2326   set(PKG_PREFIX "cmake")
2327 else ()
2328   set(PKG_PREFIX "lib${LIB_SUFFIX}/cmake/SDL2")
2329 endif ()
2330
2331 include(CMakePackageConfigHelpers)
2332 write_basic_package_version_file("${CMAKE_BINARY_DIR}/SDL2ConfigVersion.cmake"
2333   VERSION ${SDL_VERSION}
2334   COMPATIBILITY AnyNewerVersion
2335 )
2336
2337 install(EXPORT SDL2Targets
2338   FILE SDL2Targets.cmake
2339   NAMESPACE SDL2::
2340   DESTINATION ${PKG_PREFIX}
2341 )
2342 install(
2343   FILES
2344     ${CMAKE_CURRENT_SOURCE_DIR}/SDL2Config.cmake
2345     ${CMAKE_BINARY_DIR}/SDL2ConfigVersion.cmake
2346   DESTINATION ${PKG_PREFIX}
2347   COMPONENT Devel
2348 )
2349
2350 file(GLOB INCLUDE_FILES ${SDL2_SOURCE_DIR}/include/*.h)
2351 file(GLOB BIN_INCLUDE_FILES ${SDL2_BINARY_DIR}/include/*.h)
2352 foreach(_FNAME ${BIN_INCLUDE_FILES})
2353   get_filename_component(_INCNAME ${_FNAME} NAME)
2354   list(REMOVE_ITEM INCLUDE_FILES ${SDL2_SOURCE_DIR}/include/${_INCNAME})
2355 endforeach()
2356 list(APPEND INCLUDE_FILES ${BIN_INCLUDE_FILES})
2357 install(FILES ${INCLUDE_FILES} DESTINATION include/SDL2)
2358
2359 string(TOUPPER "${CMAKE_BUILD_TYPE}" UPPER_BUILD_TYPE)
2360 if (UPPER_BUILD_TYPE MATCHES DEBUG)
2361   set(SOPOSTFIX "${SDL_CMAKE_DEBUG_POSTFIX}")
2362 else()
2363   set(SOPOSTFIX "")
2364 endif()
2365
2366 if(NOT (WINDOWS OR CYGWIN))
2367   if(SDL_SHARED)
2368     set(SOEXT ${CMAKE_SHARED_LIBRARY_SUFFIX}) # ".so", ".dylib", etc.
2369     get_target_property(SONAME SDL2 OUTPUT_NAME)
2370     if(NOT ANDROID)
2371         install(CODE "
2372           execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink
2373             \"lib${SONAME}${SOPOSTFIX}${SOEXT}\" \"libSDL2${SOPOSTFIX}${SOEXT}\"
2374             WORKING_DIRECTORY \"${SDL2_BINARY_DIR}\")")
2375         install(FILES ${SDL2_BINARY_DIR}/libSDL2${SOPOSTFIX}${SOEXT} DESTINATION "lib${LIB_SUFFIX}")
2376     endif()
2377   endif()
2378   if(FREEBSD)
2379     # FreeBSD uses ${PREFIX}/libdata/pkgconfig
2380     install(FILES ${SDL2_BINARY_DIR}/sdl2.pc DESTINATION "libdata/pkgconfig")
2381   else()
2382     install(FILES ${SDL2_BINARY_DIR}/sdl2.pc
2383       DESTINATION "lib${LIB_SUFFIX}/pkgconfig")
2384   endif()
2385   install(PROGRAMS ${SDL2_BINARY_DIR}/sdl2-config DESTINATION bin)
2386   # TODO: what about the .spec file? Is it only needed for RPM creation?
2387   install(FILES "${SDL2_SOURCE_DIR}/sdl2.m4" DESTINATION "${CMAKE_INSTALL_FULL_DATAROOTDIR}/aclocal")
2388 endif()
2389
2390 ##### Uninstall target #####
2391
2392 if(NOT TARGET uninstall)
2393   configure_file(
2394       "${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake.in"
2395       "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
2396       IMMEDIATE @ONLY)
2397
2398   add_custom_target(uninstall
2399       COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake)
2400 endif()