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