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")
5 cmake_minimum_required(VERSION 3.0.0)
10 cmake_minimum_required(VERSION 3.11)
11 add_definitions(-DSDL_BUILDING_WINRT=1 -ZW)
13 -nodefaultlib:vccorlib$<$<CONFIG:Debug>:d>
14 -nodefaultlib:msvcrt$<$<CONFIG:Debug>:d>
15 vccorlib$<$<CONFIG:Debug>:d>.lib
16 msvcrt$<$<CONFIG:Debug>:d>.lib
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)
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)
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)
64 # Set defaults preventing destination file conflicts
65 set(SDL_CMAKE_DEBUG_POSTFIX "d"
66 CACHE STRING "Name suffix for debug builds")
68 mark_as_advanced(CMAKE_IMPORT_LIBRARY_SUFFIX SDL_CMAKE_DEBUG_POSTFIX)
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}")
78 #message(STATUS "${LT_VERSION} :: ${LT_AGE} :: ${LT_REVISION} :: ${LT_CURRENT} :: ${LT_RELEASE}")
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)
86 set(PROCESSOR_ARCH "x64")
89 set(PROCESSOR_ARCH "x86")
101 elseif(UNIX AND NOT APPLE)
102 if(CMAKE_SYSTEM_NAME MATCHES ".*Linux")
104 elseif(CMAKE_SYSTEM_NAME MATCHES "kFreeBSD.*")
106 elseif(CMAKE_SYSTEM_NAME MATCHES "kNetBSD.*|NetBSD.*")
108 elseif(CMAKE_SYSTEM_NAME MATCHES "kOpenBSD.*|OpenBSD.*")
110 elseif(CMAKE_SYSTEM_NAME MATCHES ".*GNU.*")
112 elseif(CMAKE_SYSTEM_NAME MATCHES ".*BSDI.*")
114 elseif(CMAKE_SYSTEM_NAME MATCHES "DragonFly.*|FreeBSD")
116 elseif(CMAKE_SYSTEM_NAME MATCHES "SYSV5.*")
118 elseif(CMAKE_SYSTEM_NAME MATCHES "Solaris.*")
120 elseif(CMAKE_SYSTEM_NAME MATCHES "HP-UX.*")
122 elseif(CMAKE_SYSTEM_NAME MATCHES "AIX.*")
124 elseif(CMAKE_SYSTEM_NAME MATCHES "Minix.*")
128 if(CMAKE_SYSTEM_NAME MATCHES ".*Darwin.*")
130 elseif(CMAKE_SYSTEM_NAME MATCHES ".*MacOS.*")
132 elseif(CMAKE_SYSTEM_NAME MATCHES ".*tvOS.*")
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.*")
142 # Don't mistake osx for unix
143 if(UNIX AND NOT APPLE AND NOT RISCOS)
150 set(UNIX_OR_MAC_SYS ON)
152 set(UNIX_OR_MAC_SYS OFF)
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)
158 set(SDL_PTHREADS_ENABLED_BY_DEFAULT OFF)
161 # Default option knobs
163 if(NOT "${CMAKE_OSX_ARCHITECTURES}" MATCHES "arm")
164 set(OPT_DEF_SSEMATH ON)
167 if(UNIX OR MINGW OR MSYS)
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)
178 set(HIDAPI_SKIP_LIBUSB FALSE)
180 if (HIDAPI_SKIP_LIBUSB)
181 set(OPT_DEF_HIDAPI ON)
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)
189 set(HIDAPI_ONLY_LIBUSB FALSE)
193 if(CMAKE_COMPILER_IS_GNUCC)
195 set(OPT_DEF_ASM TRUE)
196 elseif(CMAKE_C_COMPILER_ID MATCHES "Clang")
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- /
203 set(OPT_DEF_ASM FALSE)
206 if(USE_GCC OR USE_CLANG)
207 set(OPT_DEF_GCC_ATOMICS ON)
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")
218 set(CMAKE_C_FLAGS "$ENV{CFLAGS}")
219 list(APPEND EXTRA_CFLAGS "$ENV{CFLAGS}")
221 if(NOT ("$ENV{CFLAGS}" STREQUAL "")) # Hackish, but does the trick on Win32
222 list(APPEND EXTRA_LDFLAGS "$ENV{LDFLAGS}")
226 option(FORCE_STATIC_VCRT "Force /MT for static VC runtimes" OFF)
227 if(FORCE_STATIC_VCRT)
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}}")
237 # Make sure /RTC1 is disabled, otherwise it will use functions from the CRT
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}}")
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")
250 # When building shared lib for Windows with MinGW,
251 # avoid the DLL having a "lib" prefix
253 set(CMAKE_SHARED_LIBRARY_PREFIX "")
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})
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) {}"
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")
273 set(SDL_CFLAGS "${SDL_CFLAGS} -I/usr/include/mingw")
276 add_definitions(-DUSING_GENERATED_CONFIG_H)
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\"")
282 include_directories(${SDL2_SOURCE_DIR}/src/video/khronos)
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)
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)
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)
306 set(SDL_SHARED_ENABLED_BY_DEFAULT OFF)
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)
312 elseif (BUILD_SHARED_LIBS)
313 # In this case, we assume the user wants a shared lib and don't build
315 set(SDL_SHARED_ENABLED_BY_DEFAULT ON)
316 set(SDL_STATIC_ENABLED_BY_DEFAULT OFF)
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)
328 option(SDL_${_OPT} "Enable the ${_SUB} subsystem" ${SDL_${_OPT}_ENABLED_BY_DEFAULT})
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)
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)
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")
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)
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)
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)
444 message_error("unknown assertion level")
446 set(HAVE_ASSERTIONS ${ASSERTIONS})
448 if(NOT BACKGROUNDING_SIGNAL STREQUAL "OFF")
449 add_definitions("-DSDL_BACKGROUNDING_SIGNAL=${BACKGROUNDING_SIGNAL}")
452 if(NOT FOREGROUNDING_SIGNAL STREQUAL "OFF")
453 add_definitions("-DSDL_FOREGROUNDING_SIGNAL=${FOREGROUNDING_SIGNAL}")
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)
461 list(APPEND EXTRA_CFLAGS "-Wall")
463 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-multichar")
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")
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")
478 list(APPEND EXTRA_CFLAGS "-Wdeclaration-after-statement")
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
486 int main(int argc, char **argv) { }" HAVE_DEPENDENCY_TRACKING)
490 check_c_source_compiles("int main(int argc, char **argv) {
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) {
501 __sync_lock_test_and_set(&a, 1);
502 __sync_lock_release(&a); }" HAVE_GCC_SYNC_LOCK_TEST_AND_SET)
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})
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
516 int main(int argc, char **argv) {}" HAVE_GCC_FVISIBILITY)
517 if(HAVE_GCC_FVISIBILITY)
518 list(APPEND EXTRA_CFLAGS "-fvisibility=hidden")
520 set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS})
522 check_c_compiler_flag(-Wshadow HAVE_GCC_WSHADOW)
524 list(APPEND EXTRA_CFLAGS "-Wshadow")
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}")
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")
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)
548 set(CMAKE_REQUIRED_FLAGS "-mmmx")
549 check_c_source_compiles("
552 #ifdef __MINGW64_VERSION_MAJOR
555 #include <mmintrin.h>
558 #include <mmintrin.h>
561 #error Assembler CPP flag not enabled
563 int main(int argc, char **argv) { }" HAVE_MMX)
565 list(APPEND EXTRA_CFLAGS "-mmmx")
567 set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS})
571 set(CMAKE_REQUIRED_FLAGS "-m3dnow")
572 check_c_source_compiles("
575 #error Assembler CPP flag not enabled
577 int main(int argc, char **argv) {
582 list(APPEND EXTRA_CFLAGS "-m3dnow")
584 set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS})
588 set(CMAKE_REQUIRED_FLAGS "-msse")
589 check_c_source_compiles("
592 #ifdef __MINGW64_VERSION_MAJOR
595 #include <xmmintrin.h>
598 #include <xmmintrin.h>
601 #error Assembler CPP flag not enabled
603 int main(int argc, char **argv) { }" HAVE_SSE)
605 list(APPEND EXTRA_CFLAGS "-msse")
607 set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS})
611 set(CMAKE_REQUIRED_FLAGS "-msse2")
612 check_c_source_compiles("
615 #ifdef __MINGW64_VERSION_MAJOR
618 #include <emmintrin.h>
621 #include <emmintrin.h>
624 #error Assembler CPP flag not enabled
626 int main(int argc, char **argv) { }" HAVE_SSE2)
628 list(APPEND EXTRA_CFLAGS "-msse2")
630 set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS})
634 set(CMAKE_REQUIRED_FLAGS "-msse3")
635 check_c_source_compiles("
638 #ifdef __MINGW64_VERSION_MAJOR
641 #include <pmmintrin.h>
644 #include <pmmintrin.h>
647 #error Assembler CPP flag not enabled
649 int main(int argc, char **argv) { }" HAVE_SSE3)
651 list(APPEND EXTRA_CFLAGS "-msse3")
653 set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS})
657 if(SSE OR SSE2 OR SSE3)
659 check_c_compiler_flag(-mfpmath=387 HAVE_FP_387)
661 list(APPEND EXTRA_CFLAGS "-mfpmath=387")
664 set(HAVE_SSEMATH TRUE)
668 check_include_file("immintrin.h" HAVE_IMMINTRIN_H)
671 set(CMAKE_REQUIRED_FLAGS "-maltivec")
672 check_c_source_compiles("
674 vector unsigned int vzero() {
675 return vec_splat_u32(0);
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);
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)
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("
704 #error EABI is required (to be sure that calling conventions are compatible)
709 set(CMAKE_REQUIRED_FLAGS "${ORIG_CMAKE_REQUIRED_FLAGS}")
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)
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("
728 .eabi_attribute 10, 0
732 #error EABI is required (to be sure that calling conventions are compatible)
737 set(CMAKE_REQUIRED_FLAGS "${ORIG_CMAKE_REQUIRED_FLAGS}")
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)
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
758 set(SDL_ASSEMBLY_ROUTINES 1)
762 # if(USE_GCC OR USE_CLANG)
763 # list(APPEND EXTRA_CFLAGS "-mno-sse" "-mno-sse2" "-mno-sse3" "-mno-mmx")
767 # TODO: Can't deactivate on FreeBSD? w/o LIBC, SDL_stdinc.h can't define
770 if(WINDOWS AND NOT MINGW)
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})
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
788 string(TOUPPER ${_FN} _UPPER)
789 set(HAVE_${_UPPER} 1)
791 if(NOT CYGWIN AND NOT MINGW)
795 add_definitions(-D_USE_MATH_DEFINES) # needed for M_PI
799 check_include_file(sys/types.h HAVE_SYS_TYPES_H)
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})
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)
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
826 string(TOUPPER ${_FN} _UPPER)
827 set(_HAVEVAR "HAVE_${_UPPER}")
828 check_symbol_exists("${_FN}" "${STDC_HEADER_NAMES}" ${_HAVEVAR})
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)
840 check_library_exists(m pow "" HAVE_LIBM)
842 set(CMAKE_REQUIRED_LIBRARIES m)
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})
852 set(CMAKE_REQUIRED_LIBRARIES)
853 list(APPEND EXTRA_LIBS m)
856 check_library_exists(iconv iconv_open "" HAVE_LIBICONV)
857 check_library_exists(c iconv_open "" HAVE_BUILTIN_ICONV)
858 if(HAVE_BUILTIN_ICONV)
860 elseif(HAVE_LIBICONV)
861 list(APPEND EXTRA_LIBS iconv)
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)
878 check_struct_has_member("struct sigaction" "sa_sigaction" "signal.h" HAVE_SA_SIGACTION)
888 # Enable/disable various subsystems of the SDL library
889 foreach(_SUB ${SDL_SUBSYSTEMS})
890 string(TOUPPER ${_SUB} _OPT)
892 set(SDL_${_OPT}_DISABLED 1)
896 file(GLOB JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/*.c)
897 set(SOURCE_FILES ${SOURCE_FILES} ${JOYSTICK_SOURCES})
901 # Haptic requires some private functions from the joystick subsystem.
902 message_error("SDL_HAPTIC requires SDL_JOYSTICK, which is not enabled")
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
912 # General SDL subsystem options, valid for all platforms
914 # CheckDummyAudio/CheckDiskAudio - valid for all platforms
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)
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)
930 # Relevant for Unix/Darwin only
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})
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)
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)
961 # Platform-specific options and settings
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)
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)
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)
976 set_source_files_properties(${SDL2_SOURCE_DIR}/src/atomic/SDL_spinlock.c PROPERTIES COMPILE_FLAGS -marm)
979 file(GLOB ANDROID_MAIN_SOURCES ${SDL2_SOURCE_DIR}/src/main/android/*.c)
980 set(SDLMAIN_SOURCES ${SDLMAIN_SOURCES} ${ANDROID_MAIN_SOURCES})
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)
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)
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)
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)
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)
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)
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)
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)
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})
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)
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)
1052 list(APPEND EXTRA_LIBS hidapi)
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)
1064 find_library(OpenGLES1_LIBRARY GLESv1_CM)
1065 find_library(OpenGLES2_LIBRARY GLESv2)
1066 list(APPEND EXTRA_LIBS ${OpenGLES1_LIBRARY} ${OpenGLES2_LIBRARY})
1069 CHECK_C_SOURCE_COMPILES("
1070 #if defined(__ARM_ARCH) && __ARM_ARCH < 7
1071 #error Vulkan doesn't work on this configuration
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")
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)
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)
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)
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)
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)
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)
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)
1126 set(HAVE_CLOCK_GETTIME 1)
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)
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)
1144 elseif(UNIX AND NOT APPLE AND NOT ANDROID AND NOT RISCOS)
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)
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)
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)
1171 CheckLibSampleRate()
1175 # Need to check for Raspberry PI first and add platform specific compiler flags, otherwise the test for GLES fails!
1187 file(GLOB CORE_UNIX_SOURCES ${SDL2_SOURCE_DIR}/src/core/unix/*.c)
1188 set(SOURCE_FILES ${SOURCE_FILES} ${CORE_UNIX_SOURCES})
1192 check_c_source_compiles("
1193 #include <linux/input.h>
1195 #error EVIOCGNAME() ioctl not available
1197 int main(int argc, char** argv) {}" HAVE_INPUT_EVENTS)
1199 check_c_source_compiles("
1200 #include <linux/kd.h>
1201 #include <linux/keyboard.h>
1203 int main(int argc, char **argv)
1206 kbe.kb_table = KG_CTRL;
1207 ioctl(0, KDGKBENT, &kbe);
1210 if(HAVE_INPUT_EVENTS)
1211 set(SDL_INPUT_LINUXEV 1)
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)
1222 set(SDL_INPUT_LINUXKD 1)
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)
1233 if(PKG_CONFIG_FOUND)
1234 pkg_search_module(DBUS dbus-1 dbus)
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)
1243 pkg_search_module(IBUS ibus-1.0 ibus)
1245 set(HAVE_IBUS_IBUS_H TRUE)
1246 include_directories(${IBUS_INCLUDE_DIRS})
1247 list(APPEND EXTRA_LIBS ${IBUS_LIBRARIES})
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?
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})
1262 if(HAVE_DBUS_DBUS_H)
1263 set(SOURCE_FILES ${SOURCE_FILES} "${SDL2_SOURCE_DIR}/src/core/linux/SDL_dbus.c")
1267 set(SOURCE_FILES ${SOURCE_FILES} "${SDL2_SOURCE_DIR}/src/core/linux/SDL_ime.c")
1270 if(HAVE_IBUS_IBUS_H)
1271 set(SOURCE_FILES ${SOURCE_FILES} "${SDL2_SOURCE_DIR}/src/core/linux/SDL_ibus.c")
1275 set(SOURCE_FILES ${SOURCE_FILES} "${SDL2_SOURCE_DIR}/src/core/linux/SDL_fcitx.c")
1279 set(SOURCE_FILES ${SOURCE_FILES} "${SDL2_SOURCE_DIR}/src/core/linux/SDL_udev.c")
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")
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")
1291 # src/core/unix/*.c is included in a generic if(UNIX) section, elsewhere.
1295 if(FREEBSD OR NETBSD OR OPENBSD OR BSDI)
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)
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)
1315 check_library_exists(c clock_gettime "" FOUND_CLOCK_GETTIME)
1316 if(FOUND_CLOCK_GETTIME)
1317 set(HAVE_CLOCK_GETTIME 1)
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")
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)
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)
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)
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)
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)
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")
1369 set(SDL_RLD_FLAGS "-Wl,-rpath,\${libdir}")
1372 set(SDL_RLD_FLAGS "-R\${libdir}")
1374 set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)
1375 set(HAVE_RPATH TRUE)
1379 find_program(WINDRES windres)
1381 check_c_source_compiles("
1382 #include <windows.h>
1383 int main(int argc, char **argv) { }" HAVE_WIN32_CC)
1385 file(GLOB CORE_SOURCES ${SDL2_SOURCE_DIR}/src/core/windows/*.c)
1386 set(SOURCE_FILES ${SOURCE_FILES} ${CORE_SOURCES})
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})
1394 # Prevent codegen that would use the VC runtime libraries.
1395 set_property(DIRECTORY . APPEND PROPERTY COMPILE_OPTIONS "/GS-")
1397 set_property(DIRECTORY . APPEND PROPERTY COMPILE_OPTIONS "/arch:SSE")
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)
1407 if(DEFINED MSVC_VERSION AND NOT ${MSVC_VERSION} LESS 1700)
1408 set(USE_WINSDK_DIRECTX TRUE)
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")
1414 set(CMAKE_REQUIRED_FLAGS "/I\"$ENV{DXSDK_DIR}\\Include\"")
1418 # xinput.h may need windows.h, but doesn't include it itself.
1419 check_c_source_compiles("
1420 #include <windows.h>
1422 int main(int argc, char **argv) { }" HAVE_XINPUT_H)
1423 check_c_source_compiles("
1424 #include <windows.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>
1432 int main(int argc, char **argv) { }" HAVE_XINPUT_STATE_EX)
1434 check_include_file(xinput.h HAVE_XINPUT_H)
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)
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)
1454 set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS})
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)
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})
1468 set(HAVE_SDL_AUDIO TRUE)
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})
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})
1484 # requires SDL_LOADSO on Windows (IME, DX, etc.)
1486 message_error("SDL_VIDEO requires SDL_LOADSO, which is not enabled")
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
1496 set(SDL_VIDEO_DRIVER_WINDOWS 1)
1497 file(GLOB WIN_VIDEO_SOURCES ${SDL2_SOURCE_DIR}/src/video/windows/*.c)
1499 set(SOURCE_FILES ${SOURCE_FILES} ${WIN_VIDEO_SOURCES})
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)
1505 if(RENDER_D3D AND HAVE_D3D11_H)
1506 set(SDL_VIDEO_RENDER_D3D11 1)
1507 set(HAVE_RENDER_D3D TRUE)
1509 set(HAVE_SDL_VIDEO TRUE)
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)
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})
1532 set(SDL_POWER_WINRT 1)
1533 set(SOURCE_FILES ${SOURCE_FILES} ${SDL2_SOURCE_DIR}/src/power/winrt/SDL_syspower.cpp)
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)
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)
1548 set(SDL_FILESYSTEM_WINDOWS 1)
1550 file(GLOB FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/winrt/*.cpp)
1552 file(GLOB FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/windows/*.c)
1554 set(SOURCE_FILES ${SOURCE_FILES} ${FILESYSTEM_SOURCES})
1555 set(HAVE_SDL_FILESYSTEM TRUE)
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)
1563 # TODO: in configure.ac the check for timers is set on
1564 # cygwin | mingw32* - does this include mingw32CE?
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)
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)
1579 file(GLOB CORE_SOURCES ${SDL2_SOURCE_DIR}/src/core/windows/*.c)
1580 set(SOURCE_FILES ${SOURCE_FILES} ${CORE_SOURCES})
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)
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)
1600 # TODO: Remove this hid.c block when SDL_hidapi.c is supported on Windows!
1602 set(SOURCE_FILES ${SOURCE_FILES} ${SDL2_SOURCE_DIR}/src/hidapi/windows/hid.c)
1604 file(GLOB JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/windows/*.c)
1605 set(SOURCE_FILES ${SOURCE_FILES} ${JOYSTICK_SOURCES})
1607 set(SDL_JOYSTICK_DINPUT 1)
1608 list(APPEND EXTRA_LIBS dinput8)
1611 set(SDL_JOYSTICK_XINPUT 1)
1613 if(NOT HAVE_DINPUT_H AND NOT HAVE_XINPUT_H)
1614 set(SDL_JOYSTICK_WINMM 1)
1616 set(HAVE_SDL_JOYSTICK TRUE)
1619 if(HAVE_DINPUT_H OR HAVE_XINPUT_H)
1620 file(GLOB HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/windows/*.c)
1622 set(SDL_HAPTIC_DINPUT 1)
1625 set(SDL_HAPTIC_XINPUT 1)
1628 file(GLOB HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/dummy/*.c)
1629 set(SDL_HAPTIC_DUMMY 1)
1631 set(SOURCE_FILES ${SOURCE_FILES} ${HAPTIC_SOURCES})
1632 set(HAVE_SDL_HAPTIC TRUE)
1636 file(GLOB VERSION_SOURCES ${SDL2_SOURCE_DIR}/src/main/windows/*.rc)
1637 file(GLOB SDLMAIN_SOURCES ${SDL2_SOURCE_DIR}/src/main/windows/*.c)
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")
1646 # TODO: rework this all for proper MacOS X, iOS and Darwin support
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)
1656 set(SDL_FRAMEWORK_FOUNDATION 1)
1658 # Requires the darwin file implementation
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)
1668 message_error("SDL_FILE must be enabled to build on MacOS X")
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)
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)
1691 set(SOURCE_FILES ${SOURCE_FILES} ${SDL2_SOURCE_DIR}/src/hidapi/ios/hid.m)
1692 set(SDL_FRAMEWORK_COREBLUETOOTH 1)
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)
1699 set(SDL_FRAMEWORK_COREMOTION 1)
1701 set(SDL_FRAMEWORK_GAMECONTROLLER 1)
1702 set(HAVE_SDL_SENSORS 1)
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)
1710 set(SOURCE_FILES ${SOURCE_FILES} ${JOYSTICK_SOURCES})
1711 set(HAVE_SDL_JOYSTICK TRUE)
1716 file(GLOB HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/dummy/*.c)
1717 set(SDL_HAPTIC_DUMMY 1)
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)
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")
1733 file(GLOB POWER_SOURCES ${SDL2_SOURCE_DIR}/src/power/uikit/*.m)
1734 set(SDL_POWER_UIKIT 1)
1736 file(GLOB POWER_SOURCES ${SDL2_SOURCE_DIR}/src/power/macosx/*.c)
1737 set(SDL_POWER_MACOSX 1)
1738 set(SDL_FRAMEWORK_IOKIT 1)
1740 set(SOURCE_FILES ${SOURCE_FILES} ${POWER_SOURCES})
1741 set(HAVE_SDL_POWER TRUE)
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)
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)
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)
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})
1775 # iOS hack needed - http://code.google.com/p/ios-cmake/ ?
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})
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)
1798 set(SDL_FRAMEWORK_OPENGLES 1)
1799 set(SDL_VIDEO_OPENGL_ES 1)
1800 set(SDL_VIDEO_RENDER_OGL_ES 1)
1802 set(SDL_VIDEO_OPENGL_EGL 1)
1804 set(SDL_VIDEO_OPENGL_ES2 1)
1805 set(SDL_VIDEO_RENDER_OGL_ES2 1)
1806 set(HAVE_VIDEO_OPENGLES TRUE)
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>
1817 #if TARGET_OS_SIMULATOR || (!TARGET_CPU_X86_64 && !TARGET_CPU_ARM64)
1818 #error Metal doesn't work on this configuration
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)
1837 set(SDL_VIDEO_METAL 1)
1838 set(HAVE_VIDEO_METAL TRUE)
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)
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})
1854 if(SDL_FRAMEWORK_COCOA)
1855 find_library(COCOA_LIBRARY Cocoa)
1856 list(APPEND EXTRA_LIBS ${COCOA_LIBRARY})
1858 if(SDL_FRAMEWORK_IOKIT)
1859 find_library(IOKIT IOKit)
1860 list(APPEND EXTRA_LIBS ${IOKIT})
1862 if(SDL_FRAMEWORK_FF)
1863 find_library(FORCEFEEDBACK ForceFeedback)
1864 list(APPEND EXTRA_LIBS ${FORCEFEEDBACK})
1866 if(SDL_FRAMEWORK_CARBON)
1867 find_library(CARBON_LIBRARY Carbon)
1868 list(APPEND EXTRA_LIBS ${CARBON_LIBRARY})
1870 if(SDL_FRAMEWORK_COREAUDIO)
1871 find_library(COREAUDIO CoreAudio)
1872 list(APPEND EXTRA_LIBS ${COREAUDIO})
1874 if(SDL_FRAMEWORK_AUDIOTOOLBOX)
1875 find_library(AUDIOTOOLBOX AudioToolbox)
1876 list(APPEND EXTRA_LIBS ${AUDIOTOOLBOX})
1878 if(SDL_FRAMEWORK_AVFOUNDATION)
1879 find_library(AVFOUNDATION AVFoundation)
1880 list(APPEND EXTRA_LIBS ${AVFOUNDATION})
1882 if(SDL_FRAMEWORK_COREBLUETOOTH)
1883 find_library(COREBLUETOOTH CoreBluetooth)
1884 list(APPEND EXTRA_LIBS ${COREBLUETOOTH})
1886 if(SDL_FRAMEWORK_COREGRAPHICS)
1887 find_library(COREGRAPHICS CoreGraphics)
1888 list(APPEND EXTRA_LIBS ${COREGRAPHICS})
1890 if(SDL_FRAMEWORK_COREMOTION)
1891 find_library(COREMOTION CoreMotion)
1892 list(APPEND EXTRA_LIBS ${COREMOTION})
1894 if(SDL_FRAMEWORK_FOUNDATION)
1895 find_library(FOUNDATION Foundation)
1896 list(APPEND EXTRA_LIBS ${FOUNDATION})
1898 if(SDL_FRAMEWORK_GAMECONTROLLER)
1899 find_library(GAMECONTROLLER GameController)
1900 list(APPEND EXTRA_LIBS ${GAMECONTROLLER})
1902 if(SDL_FRAMEWORK_METAL)
1904 find_library(METAL Metal)
1905 list(APPEND EXTRA_LIBS ${METAL})
1907 list(APPEND EXTRA_LDFLAGS "-Wl,-weak_framework,Metal")
1910 if(SDL_FRAMEWORK_OPENGLES)
1911 find_library(OPENGLES OpenGLES)
1912 list(APPEND EXTRA_LIBS ${OPENGLES})
1914 if(SDL_FRAMEWORK_QUARTZCORE)
1916 find_library(QUARTZCORE QuartzCore)
1917 list(APPEND EXTRA_LIBS ${QUARTZCORE})
1919 list(APPEND EXTRA_LDFLAGS "-Wl,-weak_framework,QuartzCore")
1922 if(SDL_FRAMEWORK_UIKIT)
1923 find_library(UIKIT UIKit)
1924 list(APPEND EXTRA_LIBS ${UIKIT})
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)
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)
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)
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)
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)
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)
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)
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)
1982 set(HAVE_CLOCK_GETTIME 1)
1994 set(SDL_VIDEO_VULKAN 1)
1995 set(HAVE_VIDEO_VULKAN TRUE)
1999 # configure.ac does it differently:
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})
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})
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})
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})
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})
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})
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})
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})
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})
2056 if(NOT SDLMAIN_SOURCES)
2057 file(GLOB SDLMAIN_SOURCES ${SDL2_SOURCE_DIR}/src/main/dummy/*.c)
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 \$@")
2067 configure_file("${SDL2_SOURCE_DIR}/include/SDL_config.h.cmake"
2068 "${SDL2_BINARY_DIR}/include/SDL_config.h")
2070 # Prepare the flags and remove duplicates
2072 list(REMOVE_DUPLICATES EXTRA_LDFLAGS)
2075 list(REMOVE_DUPLICATES EXTRA_LIBS)
2078 list(REMOVE_DUPLICATES EXTRA_CFLAGS)
2080 listtostr(EXTRA_CFLAGS _EXTRA_CFLAGS)
2081 set(EXTRA_CFLAGS ${_EXTRA_CFLAGS})
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})
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")
2096 set(ENABLE_STATIC_TRUE "")
2097 set(ENABLE_STATIC_FALSE "#")
2099 set(ENABLE_STATIC_TRUE "#")
2100 set(ENABLE_STATIC_FALSE "")
2103 set(PKG_CONFIG_LIBS_PRIV "
2105 set(ENABLE_SHARED_TRUE "")
2106 set(ENABLE_SHARED_FALSE "#")
2108 set(PKG_CONFIG_LIBS_PRIV "")
2109 set(ENABLE_SHARED_TRUE "#")
2110 set(ENABLE_SHARED_FALSE "")
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})
2122 # MESSAGE(STATUS "SDL_LIBS: ${SDL_LIBS}")
2123 # MESSAGE(STATUS "SDL_STATIC_LIBS: ${SDL_STATIC_LIBS}")
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)
2135 ##### Info output #####
2137 message(STATUS "SDL2 was configured with the following options:")
2139 message(STATUS "Platform: ${CMAKE_SYSTEM}")
2140 message(STATUS "64-bit: ${ARCH_64}")
2141 message(STATUS "Compiler: ${CMAKE_C_COMPILER}")
2143 message(STATUS "Subsystems:")
2144 foreach(_SUB ${SDL_SUBSYSTEMS})
2145 string(TOUPPER ${_SUB} _OPT)
2146 message_bool_option(${_SUB} SDL_${_OPT})
2149 message(STATUS "Options:")
2150 list(SORT ALLOPTIONS)
2151 foreach(_OPT ${ALLOPTIONS})
2152 # Longest option is VIDEO_X11_XSCREENSAVER = 22 characters
2154 string(LENGTH ${_OPT} _OPTLEN)
2155 math(EXPR _PADLEN "23 - ${_OPTLEN}")
2156 string(RANDOM LENGTH ${_PADLEN} ALPHABET " " _PADDING)
2157 message_tested_option(${_OPT} ${_PADDING})
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}")
2165 message(STATUS " Build Shared Library: ${SDL_SHARED}")
2166 message(STATUS " Build Static Library: ${SDL_STATIC}")
2168 message(STATUS " Build Static Library with Position Independent Code: ${SDL_STATIC_PIC}")
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.")
2178 if(WARN_ABOUT_ARM_SIMD_ASM_MIT)
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:")
2184 message(STATUS " -DARMSIMD=OFF")
2187 if(WARN_ABOUT_ARM_NEON_ASM_MIT)
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:")
2193 message(STATUS " -DARMNEON=OFF")
2196 # Ensure that the extra cflags are used at compile time
2197 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS}")
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")
2205 set_target_properties(SDL2main PROPERTIES DEBUG_POSTFIX "${SDL_CMAKE_DEBUG_POSTFIX}")
2209 if (ANDROID AND HAVE_HIDAPI)
2210 set(_INSTALL_LIBS ${_INSTALL_LIBS} "hidapi")
2214 add_library(SDL2 SHARED ${SOURCE_FILES} ${VERSION_SOURCES})
2216 set_target_properties(SDL2 PROPERTIES
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}")
2225 if(WINDOWS OR CYGWIN)
2226 set_target_properties(SDL2 PROPERTIES
2227 DEFINE_SYMBOL DLL_EXPORT)
2229 set_target_properties(SDL2 PROPERTIES
2230 VERSION ${SDL_VERSION}
2231 SOVERSION ${LT_REVISION}
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")
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>)
2244 target_include_directories(SDL2 PRIVATE ${ANDROID_NDK}/sources/android/cpufeatures)
2246 set_target_properties(SDL2 PROPERTIES DEBUG_POSTFIX "${SDL_CMAKE_DEBUG_POSTFIX}")
2249 set_property(TARGET SDL2 APPEND_STRING PROPERTY COMPILE_FLAGS "-fobjc-arc")
2250 target_compile_definitions(SDL2 PRIVATE IOS_DYLIB=1)
2256 add_library(hidapi SHARED ${SDL2_SOURCE_DIR}/src/hidapi/android/hid.cpp)
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")
2266 target_link_libraries(hidapi log)
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.
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")
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>)
2292 target_include_directories(SDL2-static PRIVATE ${ANDROID_NDK}/sources/android/cpufeatures)
2294 set_target_properties(SDL2-static PROPERTIES DEBUG_POSTFIX "${SDL_CMAKE_DEBUG_POSTFIX}")
2297 set_property(TARGET SDL2-static APPEND_STRING PROPERTY COMPILE_FLAGS "-fobjc-arc")
2304 file(GLOB TEST_SOURCES ${SDL2_SOURCE_DIR}/src/test/*.c)
2305 add_library(SDL2_test STATIC ${TEST_SOURCES})
2307 add_subdirectory(test)
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)
2316 ##### Export files #####
2318 set(PKG_PREFIX "cmake")
2320 set(PKG_PREFIX "lib${LIB_SUFFIX}/cmake/SDL2")
2323 include(CMakePackageConfigHelpers)
2324 write_basic_package_version_file("${CMAKE_BINARY_DIR}/SDL2ConfigVersion.cmake"
2325 VERSION ${SDL_VERSION}
2326 COMPATIBILITY AnyNewerVersion
2329 install(EXPORT SDL2Targets
2330 FILE SDL2Targets.cmake
2332 DESTINATION ${PKG_PREFIX}
2336 ${CMAKE_CURRENT_SOURCE_DIR}/SDL2Config.cmake
2337 ${CMAKE_BINARY_DIR}/SDL2ConfigVersion.cmake
2338 DESTINATION ${PKG_PREFIX}
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})
2348 list(APPEND INCLUDE_FILES ${BIN_INCLUDE_FILES})
2349 install(FILES ${INCLUDE_FILES} DESTINATION include/SDL2)
2351 string(TOUPPER "${CMAKE_BUILD_TYPE}" UPPER_BUILD_TYPE)
2352 if (UPPER_BUILD_TYPE MATCHES DEBUG)
2353 set(SOPOSTFIX "${SDL_CMAKE_DEBUG_POSTFIX}")
2358 if(NOT (WINDOWS OR CYGWIN))
2360 set(SOEXT ${CMAKE_SHARED_LIBRARY_SUFFIX}) # ".so", ".dylib", etc.
2361 get_target_property(SONAME SDL2 OUTPUT_NAME)
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}")
2371 # FreeBSD uses ${PREFIX}/libdata/pkgconfig
2372 install(FILES ${SDL2_BINARY_DIR}/sdl2.pc DESTINATION "libdata/pkgconfig")
2374 install(FILES ${SDL2_BINARY_DIR}/sdl2.pc
2375 DESTINATION "lib${LIB_SUFFIX}/pkgconfig")
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")
2382 ##### Uninstall target #####
2384 if(NOT TARGET uninstall)
2386 "${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake.in"
2387 "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
2390 add_custom_target(uninstall
2391 COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake)