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_option(VIDEO_TIZEN "Use Tizen video driver" ${UNIX_SYS})
383 dep_option(TIZEN_SHARED "Dynamically load Tizen support" ON "VIDEO_TIZEN" OFF)
384 set(SDL_X11_OPTIONS Xcursor Xinerama XInput Xrandr Xscrnsaver XShape Xvm)
385 foreach(_SUB ${SDL_X11_OPTIONS})
386 string(TOUPPER "VIDEO_X11_${_SUB}" _OPT)
387 dep_option(${_OPT} "Enable ${_SUB} support" ON "VIDEO_X11" OFF)
389 set_option(VIDEO_COCOA "Use Cocoa video driver" ${APPLE})
390 set_option(DIRECTX "Use DirectX for Windows audio/video" ${WINDOWS})
391 set_option(WASAPI "Use the Windows WASAPI audio driver" ${WINDOWS})
392 set_option(RENDER_D3D "Enable the Direct3D render driver" ${WINDOWS})
393 set_option(RENDER_METAL "Enable the Metal render driver" ${APPLE})
394 set_option(VIDEO_VIVANTE "Use Vivante EGL video driver" ${UNIX_SYS})
395 dep_option(VIDEO_VULKAN "Enable Vulkan support" ON "ANDROID OR APPLE OR LINUX OR WINDOWS" OFF)
396 set_option(VIDEO_METAL "Enable Metal support" ${APPLE})
397 set_option(VIDEO_KMSDRM "Use KMS DRM video driver" ${UNIX_SYS})
398 dep_option(KMSDRM_SHARED "Dynamically load KMS DRM support" ON "VIDEO_KMSDRM" OFF)
399 set_option(VIDEO_OFFSCREEN "Use offscreen video driver" OFF)
400 option_string(BACKGROUNDING_SIGNAL "number to use for magic backgrounding signal or 'OFF'" "OFF")
401 option_string(FOREGROUNDING_SIGNAL "number to use for magic foregrounding signal or 'OFF'" "OFF")
402 set_option(HIDAPI "Use HIDAPI for low level joystick drivers" ${OPT_DEF_HIDAPI})
403 set_option(JOYSTICK_VIRTUAL "Enable the virtual-joystick driver" ON)
405 set(SDL_SHARED ${SDL_SHARED_ENABLED_BY_DEFAULT} CACHE BOOL "Build a shared version of the library")
406 set(SDL_STATIC ${SDL_STATIC_ENABLED_BY_DEFAULT} CACHE BOOL "Build a static version of the library")
408 dep_option(SDL_STATIC_PIC "Static version of the library should be built with Position Independent Code" OFF "SDL_STATIC" OFF)
409 set_option(SDL_TEST "Build the test directory" OFF)
411 # General source files
412 file(GLOB SOURCE_FILES
413 ${SDL2_SOURCE_DIR}/src/*.c
414 ${SDL2_SOURCE_DIR}/src/atomic/*.c
415 ${SDL2_SOURCE_DIR}/src/audio/*.c
416 ${SDL2_SOURCE_DIR}/src/cpuinfo/*.c
417 ${SDL2_SOURCE_DIR}/src/dynapi/*.c
418 ${SDL2_SOURCE_DIR}/src/events/*.c
419 ${SDL2_SOURCE_DIR}/src/file/*.c
420 ${SDL2_SOURCE_DIR}/src/haptic/*.c
421 ${SDL2_SOURCE_DIR}/src/libm/*.c
422 ${SDL2_SOURCE_DIR}/src/locale/*.c
423 ${SDL2_SOURCE_DIR}/src/misc/*.c
424 ${SDL2_SOURCE_DIR}/src/power/*.c
425 ${SDL2_SOURCE_DIR}/src/render/*.c
426 ${SDL2_SOURCE_DIR}/src/render/*/*.c
427 ${SDL2_SOURCE_DIR}/src/sensor/*.c
428 ${SDL2_SOURCE_DIR}/src/stdlib/*.c
429 ${SDL2_SOURCE_DIR}/src/thread/*.c
430 ${SDL2_SOURCE_DIR}/src/timer/*.c
431 ${SDL2_SOURCE_DIR}/src/video/*.c
432 ${SDL2_SOURCE_DIR}/src/video/yuv2rgb/*.c)
435 if(ASSERTIONS STREQUAL "auto")
436 # Do nada - use optimization settings to determine the assertion level
437 elseif(ASSERTIONS STREQUAL "disabled")
438 set(SDL_DEFAULT_ASSERT_LEVEL 0)
439 elseif(ASSERTIONS STREQUAL "release")
440 set(SDL_DEFAULT_ASSERT_LEVEL 1)
441 elseif(ASSERTIONS STREQUAL "enabled")
442 set(SDL_DEFAULT_ASSERT_LEVEL 2)
443 elseif(ASSERTIONS STREQUAL "paranoid")
444 set(SDL_DEFAULT_ASSERT_LEVEL 3)
446 message_error("unknown assertion level")
448 set(HAVE_ASSERTIONS ${ASSERTIONS})
450 if(NOT BACKGROUNDING_SIGNAL STREQUAL "OFF")
451 add_definitions("-DSDL_BACKGROUNDING_SIGNAL=${BACKGROUNDING_SIGNAL}")
454 if(NOT FOREGROUNDING_SIGNAL STREQUAL "OFF")
455 add_definitions("-DSDL_FOREGROUNDING_SIGNAL=${FOREGROUNDING_SIGNAL}")
458 # Compiler option evaluation
459 if(USE_GCC OR USE_CLANG)
460 # Check for -Wall first, so later things can override pieces of it.
461 check_c_compiler_flag(-Wall HAVE_GCC_WALL)
463 list(APPEND EXTRA_CFLAGS "-Wall")
465 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-multichar")
469 check_c_compiler_flag(-fno-strict-aliasing HAVE_GCC_NO_STRICT_ALIASING)
470 if(HAVE_GCC_NO_STRICT_ALIASING)
471 list(APPEND EXTRA_CFLAGS "-fno-strict-aliasing")
474 check_c_compiler_flag(-Wdeclaration-after-statement HAVE_GCC_WDECLARATION_AFTER_STATEMENT)
475 if(HAVE_GCC_WDECLARATION_AFTER_STATEMENT)
476 check_c_compiler_flag(-Werror=declaration-after-statement HAVE_GCC_WERROR_DECLARATION_AFTER_STATEMENT)
477 if(HAVE_GCC_WERROR_DECLARATION_AFTER_STATEMENT)
478 list(APPEND EXTRA_CFLAGS "-Werror=declaration-after-statement")
480 list(APPEND EXTRA_CFLAGS "-Wdeclaration-after-statement")
483 if(DEPENDENCY_TRACKING)
484 check_c_source_compiles("
485 #if !defined(__GNUC__) || __GNUC__ < 3
486 #error Dependency tracking requires GCC 3.0 or newer
488 int main(int argc, char **argv) { }" HAVE_DEPENDENCY_TRACKING)
492 check_c_source_compiles("int main(int argc, char **argv) {
495 __sync_lock_test_and_set(&a, 4);
496 __sync_lock_test_and_set(&x, y);
497 __sync_fetch_and_add(&a, 1);
498 __sync_bool_compare_and_swap(&a, 5, 10);
499 __sync_bool_compare_and_swap(&x, y, z); }" HAVE_GCC_ATOMICS)
500 if(NOT HAVE_GCC_ATOMICS)
501 check_c_source_compiles("int main(int argc, char **argv) {
503 __sync_lock_test_and_set(&a, 1);
504 __sync_lock_release(&a); }" HAVE_GCC_SYNC_LOCK_TEST_AND_SET)
508 set(CMAKE_REQUIRED_FLAGS "-mpreferred-stack-boundary=2")
509 check_c_source_compiles("int x = 0; int main(int argc, char **argv) {}"
510 HAVE_GCC_PREFERRED_STACK_BOUNDARY)
511 set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS})
513 set(CMAKE_REQUIRED_FLAGS "-fvisibility=hidden -Werror")
514 check_c_source_compiles("
515 #if !defined(__GNUC__) || __GNUC__ < 4
516 #error SDL only uses visibility attributes in GCC 4 or newer
518 int main(int argc, char **argv) {}" HAVE_GCC_FVISIBILITY)
519 if(HAVE_GCC_FVISIBILITY)
520 list(APPEND EXTRA_CFLAGS "-fvisibility=hidden")
522 set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS})
524 check_c_compiler_flag(-Wshadow HAVE_GCC_WSHADOW)
526 list(APPEND EXTRA_CFLAGS "-Wshadow")
530 list(APPEND EXTRA_LDFLAGS "-Wl,-undefined,error")
531 list(APPEND EXTRA_LDFLAGS "-Wl,-compatibility_version,${DYLIB_COMPATIBILITY_VERSION}")
532 list(APPEND EXTRA_LDFLAGS "-Wl,-current_version,${DYLIB_CURRENT_VERSION}")
534 set(CMAKE_REQUIRED_FLAGS "-Wl,--no-undefined")
535 check_c_compiler_flag("" HAVE_NO_UNDEFINED)
536 set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS})
537 if(HAVE_NO_UNDEFINED)
538 list(APPEND EXTRA_LDFLAGS "-Wl,--no-undefined")
544 if(USE_GCC OR USE_CLANG)
545 set(SDL_ASSEMBLY_ROUTINES 1)
546 # TODO: Those all seem to be quite GCC specific - needs to be
547 # reworked for better compiler support
548 set(HAVE_ASSEMBLY TRUE)
550 set(CMAKE_REQUIRED_FLAGS "-mmmx")
551 check_c_source_compiles("
554 #ifdef __MINGW64_VERSION_MAJOR
557 #include <mmintrin.h>
560 #include <mmintrin.h>
563 #error Assembler CPP flag not enabled
565 int main(int argc, char **argv) { }" HAVE_MMX)
567 list(APPEND EXTRA_CFLAGS "-mmmx")
569 set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS})
573 set(CMAKE_REQUIRED_FLAGS "-m3dnow")
574 check_c_source_compiles("
577 #error Assembler CPP flag not enabled
579 int main(int argc, char **argv) {
584 list(APPEND EXTRA_CFLAGS "-m3dnow")
586 set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS})
590 set(CMAKE_REQUIRED_FLAGS "-msse")
591 check_c_source_compiles("
594 #ifdef __MINGW64_VERSION_MAJOR
597 #include <xmmintrin.h>
600 #include <xmmintrin.h>
603 #error Assembler CPP flag not enabled
605 int main(int argc, char **argv) { }" HAVE_SSE)
607 list(APPEND EXTRA_CFLAGS "-msse")
609 set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS})
613 set(CMAKE_REQUIRED_FLAGS "-msse2")
614 check_c_source_compiles("
617 #ifdef __MINGW64_VERSION_MAJOR
620 #include <emmintrin.h>
623 #include <emmintrin.h>
626 #error Assembler CPP flag not enabled
628 int main(int argc, char **argv) { }" HAVE_SSE2)
630 list(APPEND EXTRA_CFLAGS "-msse2")
632 set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS})
636 set(CMAKE_REQUIRED_FLAGS "-msse3")
637 check_c_source_compiles("
640 #ifdef __MINGW64_VERSION_MAJOR
643 #include <pmmintrin.h>
646 #include <pmmintrin.h>
649 #error Assembler CPP flag not enabled
651 int main(int argc, char **argv) { }" HAVE_SSE3)
653 list(APPEND EXTRA_CFLAGS "-msse3")
655 set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS})
659 if(SSE OR SSE2 OR SSE3)
661 check_c_compiler_flag(-mfpmath=387 HAVE_FP_387)
663 list(APPEND EXTRA_CFLAGS "-mfpmath=387")
666 set(HAVE_SSEMATH TRUE)
670 check_include_file("immintrin.h" HAVE_IMMINTRIN_H)
673 set(CMAKE_REQUIRED_FLAGS "-maltivec")
674 check_c_source_compiles("
676 vector unsigned int vzero() {
677 return vec_splat_u32(0);
679 int main(int argc, char **argv) { }" HAVE_ALTIVEC_H_HDR)
680 check_c_source_compiles("
681 vector unsigned int vzero() {
682 return vec_splat_u32(0);
684 int main(int argc, char **argv) { }" HAVE_ALTIVEC)
685 set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS})
686 if(HAVE_ALTIVEC OR HAVE_ALTIVEC_H_HDR)
687 set(HAVE_ALTIVEC TRUE) # if only HAVE_ALTIVEC_H_HDR is set
688 list(APPEND EXTRA_CFLAGS "-maltivec")
689 set(SDL_ALTIVEC_BLITTERS 1)
690 if(HAVE_ALTIVEC_H_HDR)
691 set(HAVE_ALTIVEC_H 1)
697 set(ORIG_CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}")
698 set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -x assembler-with-cpp")
699 check_c_source_compiles("
706 #error EABI is required (to be sure that calling conventions are compatible)
711 set(CMAKE_REQUIRED_FLAGS "${ORIG_CMAKE_REQUIRED_FLAGS}")
714 set(HAVE_ARMSIMD TRUE)
715 set(SDL_ARM_SIMD_BLITTERS 1)
716 file(GLOB ARMSIMD_SOURCES ${SDL2_SOURCE_DIR}/src/video/arm/pixman-arm-simd*.S)
717 set(SOURCE_FILES ${SOURCE_FILES} ${ARMSIMD_SOURCES})
718 set(WARN_ABOUT_ARM_SIMD_ASM_MIT TRUE)
723 set(ORIG_CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}")
724 set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -x assembler-with-cpp")
725 check_c_source_compiles("
730 .eabi_attribute 10, 0
734 #error EABI is required (to be sure that calling conventions are compatible)
739 set(CMAKE_REQUIRED_FLAGS "${ORIG_CMAKE_REQUIRED_FLAGS}")
742 set(HAVE_ARMNEON TRUE)
743 set(SDL_ARM_NEON_BLITTERS 1)
744 file(GLOB ARMNEON_SOURCES ${SDL2_SOURCE_DIR}/src/video/arm/pixman-arm-neon*.S)
745 set(SOURCE_FILES ${SOURCE_FILES} ${ARMNEON_SOURCES})
746 set(WARN_ABOUT_ARM_NEON_ASM_MIT TRUE)
750 elseif(MSVC_VERSION GREATER 1500)
751 # TODO: SDL_cpuinfo.h needs to support the user's configuration wish
752 # for MSVC - right now it is always activated
760 set(SDL_ASSEMBLY_ROUTINES 1)
764 # if(USE_GCC OR USE_CLANG)
765 # list(APPEND EXTRA_CFLAGS "-mno-sse" "-mno-sse2" "-mno-sse3" "-mno-mmx")
769 # TODO: Can't deactivate on FreeBSD? w/o LIBC, SDL_stdinc.h can't define
772 if(WINDOWS AND NOT MINGW)
774 foreach(_HEADER stdio.h string.h wchar.h ctype.h math.h limits.h)
775 string(TOUPPER "HAVE_${_HEADER}" _UPPER)
776 string(REPLACE "." "_" _HAVE_H ${_UPPER})
781 malloc calloc realloc free qsort abs memset memcpy memmove memcmp
782 wcslen wcsdup wcsstr wcscmp wcsncmp _wcsicmp _wcsnicmp
783 strlen _strrev _strupr _strlwr strchr strrchr strstr itoa _ltoa
784 _ultoa strtol strtoul strtoll strtod atoi atof strcmp strncmp
785 _stricmp _strnicmp strtok_s sscanf
786 acos acosf asin asinf atan atanf atan2 atan2f ceil ceilf
787 copysign copysignf cos cosf exp expf fabs fabsf floor floorf fmod fmodf
788 log logf log10 log10f pow powf scalbn scalbnf sin sinf sqrt sqrtf tan tanf
790 string(TOUPPER ${_FN} _UPPER)
791 set(HAVE_${_UPPER} 1)
793 if(NOT CYGWIN AND NOT MINGW)
797 add_definitions(-D_USE_MATH_DEFINES) # needed for M_PI
801 check_include_file(sys/types.h HAVE_SYS_TYPES_H)
803 stdio.h stdlib.h stddef.h stdarg.h malloc.h memory.h string.h limits.h
804 strings.h wchar.h inttypes.h stdint.h ctype.h math.h iconv.h signal.h libunwind.h)
805 string(TOUPPER "HAVE_${_HEADER}" _UPPER)
806 string(REPLACE "." "_" _HAVE_H ${_UPPER})
807 check_include_file("${_HEADER}" ${_HAVE_H})
810 set(STDC_HEADER_NAMES "stddef.h;stdarg.h;stdlib.h;string.h;stdio.h;wchar.h;float.h")
811 check_include_files("${STDC_HEADER_NAMES}" STDC_HEADERS)
812 check_type_size("size_t" SIZEOF_SIZE_T)
813 check_symbol_exists(M_PI math.h HAVE_M_PI)
814 # TODO: refine the mprotect check
815 check_c_source_compiles("#include <sys/types.h>
816 #include <sys/mman.h>
817 int main() { }" HAVE_MPROTECT)
819 strtod malloc calloc realloc free getenv setenv putenv unsetenv
820 qsort abs bcopy memset memcpy memmove memcmp strlen strlcpy strlcat
821 _strrev _strupr _strlwr strchr strrchr strstr strtok_r itoa _ltoa
822 _uitoa _ultoa strtol strtoul _i64toa _ui64toa strtoll strtoull
823 atoi atof strcmp strncmp _stricmp strcasecmp _strnicmp strncasecmp
824 wcscmp wcsdup wcslcat wcslcpy wcslen wcsncmp wcsstr
825 wcscasecmp _wcsicmp wcsncasecmp _wcsnicmp
826 sscanf vsscanf vsnprintf fopen64 fseeko fseeko64 _Exit
828 string(TOUPPER ${_FN} _UPPER)
829 set(_HAVEVAR "HAVE_${_UPPER}")
830 check_symbol_exists("${_FN}" "${STDC_HEADER_NAMES}" ${_HAVEVAR})
833 check_symbol_exists(sigaction "signal.h" HAVE_SIGACTION)
834 check_symbol_exists(setjmp "setjmp.h" HAVE_SETJMP)
835 check_symbol_exists(nanosleep "time.h" HAVE_NANOSLEEP)
836 check_symbol_exists(sysconf "unistd.h" HAVE_SYSCONF)
837 check_symbol_exists(sysctlbyname "sys/types.h;sys/sysctl.h" HAVE_SYSCTLBYNAME)
838 check_symbol_exists(getauxval "sys/auxv.h" HAVE_GETAUXVAL)
839 check_symbol_exists(elf_aux_info "sys/auxv.h" HAVE_ELF_AUX_INFO)
840 check_symbol_exists(poll "poll.h" HAVE_POLL)
842 check_library_exists(m pow "" HAVE_LIBM)
844 set(CMAKE_REQUIRED_LIBRARIES m)
846 atan atan2 atanf atan2f ceil ceilf copysign copysignf cos cosf
847 exp expf fabs fabsf floor floorf fmod fmodf log logf log10 log10f
848 pow powf scalbn scalbnf sin sinf sqrt sqrtf tan tanf acos acosf
849 asin asinf trunc truncf)
850 string(TOUPPER ${_FN} _UPPER)
851 set(_HAVEVAR "HAVE_${_UPPER}")
852 check_symbol_exists("${_FN}" "math.h" ${_HAVEVAR})
854 set(CMAKE_REQUIRED_LIBRARIES)
855 list(APPEND EXTRA_LIBS m)
858 check_library_exists(iconv iconv_open "" HAVE_LIBICONV)
859 check_library_exists(c iconv_open "" HAVE_BUILTIN_ICONV)
860 if(HAVE_BUILTIN_ICONV)
862 elseif(HAVE_LIBICONV)
863 list(APPEND EXTRA_LIBS iconv)
868 check_include_file(alloca.h HAVE_ALLOCA_H)
869 check_symbol_exists(alloca "alloca.h" HAVE_ALLOCA1)
870 check_symbol_exists(alloca "stdlib.h" HAVE_ALLOCA2)
871 check_symbol_exists(alloca "malloc.h" HAVE_ALLOCA3)
872 if(HAVE_ALLOCA1 OR HAVE_ALLOCA2 OR HAVE_ALLOCA3)
880 check_struct_has_member("struct sigaction" "sa_sigaction" "signal.h" HAVE_SA_SIGACTION)
890 # Enable/disable various subsystems of the SDL library
891 foreach(_SUB ${SDL_SUBSYSTEMS})
892 string(TOUPPER ${_SUB} _OPT)
894 set(SDL_${_OPT}_DISABLED 1)
898 file(GLOB JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/*.c)
899 set(SOURCE_FILES ${SOURCE_FILES} ${JOYSTICK_SOURCES})
903 # Haptic requires some private functions from the joystick subsystem.
904 message_error("SDL_HAPTIC requires SDL_JOYSTICK, which is not enabled")
909 # TODO: in configure.ac, the test for LOADSO and SDL_DLOPEN is a bit weird:
910 # if LOADSO is not wanted, SDL_LOADSO_DISABLED is set
911 # If however on Unix or APPLE dlopen() is detected via CheckDLOPEN(),
912 # SDL_LOADSO_DISABLED will not be set, regardless of the LOADSO settings
914 # General SDL subsystem options, valid for all platforms
916 # CheckDummyAudio/CheckDiskAudio - valid for all platforms
918 set(SDL_AUDIO_DRIVER_DUMMY 1)
919 file(GLOB DUMMYAUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/dummy/*.c)
920 set(SOURCE_FILES ${SOURCE_FILES} ${DUMMYAUDIO_SOURCES})
921 set(HAVE_DUMMYAUDIO TRUE)
924 set(SDL_AUDIO_DRIVER_DISK 1)
925 file(GLOB DISKAUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/disk/*.c)
926 set(SOURCE_FILES ${SOURCE_FILES} ${DISKAUDIO_SOURCES})
927 set(HAVE_DISKAUDIO TRUE)
932 # Relevant for Unix/Darwin only
940 set(SDL_JOYSTICK_VIRTUAL 1)
941 file(GLOB JOYSTICK_VIRTUAL_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/virtual/*.c)
942 set(SOURCE_FILES ${SOURCE_FILES} ${JOYSTICK_VIRTUAL_SOURCES})
948 set(SDL_VIDEO_DRIVER_DUMMY 1)
949 file(GLOB VIDEO_DUMMY_SOURCES ${SDL2_SOURCE_DIR}/src/video/dummy/*.c)
950 set(SOURCE_FILES ${SOURCE_FILES} ${VIDEO_DUMMY_SOURCES})
951 set(HAVE_VIDEO_DUMMY TRUE)
952 set(HAVE_SDL_VIDEO TRUE)
955 set(SDL_VIDEO_DRIVER_OFFSCREEN 1)
956 file(GLOB VIDEO_OFFSCREEN_SOURCES ${SDL2_SOURCE_DIR}/src/video/offscreen/*.c)
957 set(SOURCE_FILES ${SOURCE_FILES} ${VIDEO_OFFSCREEN_SOURCES})
958 set(HAVE_VIDEO_OFFSCREEN TRUE)
959 set(HAVE_SDL_VIDEO TRUE)
963 # Platform-specific options and settings
965 file(GLOB ANDROID_CORE_SOURCES ${SDL2_SOURCE_DIR}/src/core/android/*.c)
966 set(SOURCE_FILES ${SOURCE_FILES} ${ANDROID_CORE_SOURCES} ${ANDROID_NDK}/sources/android/cpufeatures/cpu-features.c)
968 file(GLOB ANDROID_MISC_SOURCES ${SDL2_SOURCE_DIR}/src/misc/android/*.c)
969 set(SOURCE_FILES ${SOURCE_FILES} ${ANDROID_MISC_SOURCES})
970 set(HAVE_SDL_MISC TRUE)
972 # SDL_spinlock.c Needs to be compiled in ARM mode.
973 # There seems to be no better way currently to set the ARM mode.
974 # see: https://issuetracker.google.com/issues/62264618
975 # Another option would be to set ARM mode to all compiled files
976 check_c_compiler_flag(-marm HAVE_ARM_MODE)
978 set_source_files_properties(${SDL2_SOURCE_DIR}/src/atomic/SDL_spinlock.c PROPERTIES COMPILE_FLAGS -marm)
981 file(GLOB ANDROID_MAIN_SOURCES ${SDL2_SOURCE_DIR}/src/main/android/*.c)
982 set(SDLMAIN_SOURCES ${SDLMAIN_SOURCES} ${ANDROID_MAIN_SOURCES})
985 set(SDL_AUDIO_DRIVER_ANDROID 1)
986 file(GLOB ANDROID_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/android/*.c)
987 set(SOURCE_FILES ${SOURCE_FILES} ${ANDROID_AUDIO_SOURCES})
988 set(HAVE_SDL_AUDIO TRUE)
991 set(SDL_FILESYSTEM_ANDROID 1)
992 file(GLOB ANDROID_FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/android/*.c)
993 set(SOURCE_FILES ${SOURCE_FILES} ${ANDROID_FILESYSTEM_SOURCES})
994 set(HAVE_SDL_FILESYSTEM TRUE)
997 set(SDL_HAPTIC_ANDROID 1)
998 file(GLOB ANDROID_HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/android/*.c)
999 set(SOURCE_FILES ${SOURCE_FILES} ${ANDROID_HAPTIC_SOURCES})
1000 set(HAVE_SDL_HAPTIC TRUE)
1004 set(SDL_JOYSTICK_ANDROID 1)
1005 file(GLOB ANDROID_JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/android/*.c ${SDL2_SOURCE_DIR}/src/joystick/steam/*.c)
1006 set(SOURCE_FILES ${SOURCE_FILES} ${ANDROID_JOYSTICK_SOURCES})
1007 set(HAVE_SDL_JOYSTICK TRUE)
1010 set(SDL_LOADSO_DLOPEN 1)
1011 file(GLOB LOADSO_SOURCES ${SDL2_SOURCE_DIR}/src/loadso/dlopen/*.c)
1012 set(SOURCE_FILES ${SOURCE_FILES} ${LOADSO_SOURCES})
1013 set(HAVE_SDL_LOADSO TRUE)
1016 set(SDL_POWER_ANDROID 1)
1017 file(GLOB ANDROID_POWER_SOURCES ${SDL2_SOURCE_DIR}/src/power/android/*.c)
1018 set(SOURCE_FILES ${SOURCE_FILES} ${ANDROID_POWER_SOURCES})
1019 set(HAVE_SDL_POWER TRUE)
1022 file(GLOB ANDROID_LOCALE_SOURCES ${SDL2_SOURCE_DIR}/src/locale/android/*.c)
1023 set(SOURCE_FILES ${SOURCE_FILES} ${ANDROID_LOCALE_SOURCES})
1024 set(HAVE_SDL_LOCALE TRUE)
1027 set(SDL_TIMER_UNIX 1)
1028 file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/unix/*.c)
1029 set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES})
1030 set(HAVE_SDL_TIMERS TRUE)
1033 set(SDL_SENSOR_ANDROID 1)
1034 set(HAVE_SDL_SENSORS TRUE)
1035 file(GLOB ANDROID_SENSOR_SOURCES ${SDL2_SOURCE_DIR}/src/sensor/android/*.c)
1036 set(SOURCE_FILES ${SOURCE_FILES} ${ANDROID_SENSOR_SOURCES})
1039 set(SDL_VIDEO_DRIVER_ANDROID 1)
1040 file(GLOB ANDROID_VIDEO_SOURCES ${SDL2_SOURCE_DIR}/src/video/android/*.c)
1041 set(SOURCE_FILES ${SOURCE_FILES} ${ANDROID_VIDEO_SOURCES})
1042 set(HAVE_SDL_VIDEO TRUE)
1045 # find_library(ANDROID_DL_LIBRARY dl)
1046 # FIXME failing dlopen https://github.com/android-ndk/ndk/issues/929
1047 find_library(ANDROID_DL_LIBRARY NAMES libdl.so dl)
1048 find_library(ANDROID_LOG_LIBRARY log)
1049 find_library(ANDROID_LIBRARY_LIBRARY android)
1050 list(APPEND EXTRA_LIBS ${ANDROID_DL_LIBRARY} ${ANDROID_LOG_LIBRARY} ${ANDROID_LIBRARY_LIBRARY})
1051 add_definitions(-DGL_GLEXT_PROTOTYPES)
1054 list(APPEND EXTRA_LIBS hidapi)
1059 set(SDL_VIDEO_OPENGL_EGL 1)
1060 set(HAVE_VIDEO_OPENGLES TRUE)
1061 set(SDL_VIDEO_OPENGL_ES 1)
1062 set(SDL_VIDEO_RENDER_OGL_ES 1)
1063 set(SDL_VIDEO_OPENGL_ES2 1)
1064 set(SDL_VIDEO_RENDER_OGL_ES2 1)
1066 find_library(OpenGLES1_LIBRARY GLESv1_CM)
1067 find_library(OpenGLES2_LIBRARY GLESv2)
1068 list(APPEND EXTRA_LIBS ${OpenGLES1_LIBRARY} ${OpenGLES2_LIBRARY})
1071 CHECK_C_SOURCE_COMPILES("
1072 #if defined(__ARM_ARCH) && __ARM_ARCH < 7
1073 #error Vulkan doesn't work on this configuration
1079 " VULKAN_PASSED_ANDROID_CHECKS)
1080 if(NOT VULKAN_PASSED_ANDROID_CHECKS)
1081 set(VIDEO_VULKAN OFF)
1082 message(STATUS "Vulkan doesn't work on this configuration")
1089 # Hide noisy warnings that intend to aid mostly during initial stages of porting a new
1090 # project. Uncomment at will for verbose cross-compiling -I/../ path info.
1091 add_definitions(-Wno-warn-absolute-paths)
1093 set(SDL_AUDIO_DRIVER_EMSCRIPTEN 1)
1094 file(GLOB EM_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/emscripten/*.c)
1095 set(SOURCE_FILES ${SOURCE_FILES} ${EM_AUDIO_SOURCES})
1096 set(HAVE_SDL_AUDIO TRUE)
1099 set(SDL_FILESYSTEM_EMSCRIPTEN 1)
1100 file(GLOB EM_FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/emscripten/*.c)
1101 set(SOURCE_FILES ${SOURCE_FILES} ${EM_FILESYSTEM_SOURCES})
1102 set(HAVE_SDL_FILESYSTEM TRUE)
1105 set(SDL_JOYSTICK_EMSCRIPTEN 1)
1106 file(GLOB EM_JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/emscripten/*.c)
1107 set(SOURCE_FILES ${SOURCE_FILES} ${EM_JOYSTICK_SOURCES})
1108 set(HAVE_SDL_JOYSTICK TRUE)
1111 set(SDL_POWER_EMSCRIPTEN 1)
1112 file(GLOB EM_POWER_SOURCES ${SDL2_SOURCE_DIR}/src/power/emscripten/*.c)
1113 set(SOURCE_FILES ${SOURCE_FILES} ${EM_POWER_SOURCES})
1114 set(HAVE_SDL_POWER TRUE)
1117 file(GLOB LOCALE_SOURCES ${SDL2_SOURCE_DIR}/src/locale/emscripten/*.c)
1118 set(SOURCE_FILES ${SOURCE_FILES} ${LOCALE_SOURCES})
1119 set(HAVE_SDL_LOCALE TRUE)
1122 set(SDL_TIMER_UNIX 1)
1123 file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/unix/*.c)
1124 set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES})
1125 set(HAVE_SDL_TIMERS TRUE)
1128 set(HAVE_CLOCK_GETTIME 1)
1132 set(SDL_VIDEO_DRIVER_EMSCRIPTEN 1)
1133 file(GLOB EM_VIDEO_SOURCES ${SDL2_SOURCE_DIR}/src/video/emscripten/*.c)
1134 set(SOURCE_FILES ${SOURCE_FILES} ${EM_VIDEO_SOURCES})
1135 set(HAVE_SDL_VIDEO TRUE)
1139 set(SDL_VIDEO_OPENGL_EGL 1)
1140 set(HAVE_VIDEO_OPENGLES TRUE)
1141 set(SDL_VIDEO_OPENGL_ES2 1)
1142 set(SDL_VIDEO_RENDER_OGL_ES2 1)
1146 elseif(UNIX AND NOT APPLE AND NOT ANDROID AND NOT RISCOS)
1148 if(SYSV5 OR SOLARIS OR HPUX)
1149 set(SDL_AUDIO_DRIVER_SUNAUDIO 1)
1150 file(GLOB SUN_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/sun/*.c)
1151 set(SOURCE_FILES ${SOURCE_FILES} ${SUN_AUDIO_SOURCES})
1152 set(HAVE_SDL_AUDIO TRUE)
1154 set(SDL_AUDIO_DRIVER_NETBSD 1)
1155 file(GLOB NETBSD_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/netbsd/*.c)
1156 set(SOURCE_FILES ${SOURCE_FILES} ${NETBSD_AUDIO_SOURCES})
1157 set(HAVE_SDL_AUDIO TRUE)
1159 set(SDL_AUDIO_DRIVER_PAUDIO 1)
1160 file(GLOB AIX_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/paudio/*.c)
1161 set(SOURCE_FILES ${SOURCE_FILES} ${AIX_AUDIO_SOURCES})
1162 set(HAVE_SDL_AUDIO TRUE)
1173 CheckLibSampleRate()
1177 # Need to check for Raspberry PI first and add platform specific compiler flags, otherwise the test for GLES fails!
1190 file(GLOB CORE_UNIX_SOURCES ${SDL2_SOURCE_DIR}/src/core/unix/*.c)
1191 set(SOURCE_FILES ${SOURCE_FILES} ${CORE_UNIX_SOURCES})
1195 check_c_source_compiles("
1196 #include <linux/input.h>
1198 #error EVIOCGNAME() ioctl not available
1200 int main(int argc, char** argv) {}" HAVE_INPUT_EVENTS)
1202 check_c_source_compiles("
1203 #include <linux/kd.h>
1204 #include <linux/keyboard.h>
1206 int main(int argc, char **argv)
1209 kbe.kb_table = KG_CTRL;
1210 ioctl(0, KDGKBENT, &kbe);
1213 if(HAVE_INPUT_EVENTS)
1214 set(SDL_INPUT_LINUXEV 1)
1217 if(SDL_HAPTIC AND HAVE_INPUT_EVENTS)
1218 set(SDL_HAPTIC_LINUX 1)
1219 file(GLOB HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/linux/*.c)
1220 set(SOURCE_FILES ${SOURCE_FILES} ${HAPTIC_SOURCES})
1221 set(HAVE_SDL_HAPTIC TRUE)
1225 set(SDL_INPUT_LINUXKD 1)
1228 check_include_file("libudev.h" HAVE_LIBUDEV_H)
1229 check_include_file("sys/inotify.h" HAVE_SYS_INOTIFY_H)
1230 check_symbol_exists(inotify_init "sys/inotify.h" HAVE_INOTIFY_INIT)
1231 check_symbol_exists(inotify_init1 "sys/inotify.h" HAVE_INOTIFY_INIT1)
1232 if(HAVE_SYS_INOTIFY_H AND HAVE_INOTIFY_INIT)
1236 if(PKG_CONFIG_FOUND)
1237 pkg_search_module(DBUS dbus-1 dbus)
1239 set(HAVE_DBUS_DBUS_H TRUE)
1240 include_directories(${DBUS_INCLUDE_DIRS})
1241 list(APPEND EXTRA_LIBS ${DBUS_LIBRARIES})
1242 # Fcitx need only dbus.
1243 set(HAVE_FCITX TRUE)
1246 pkg_search_module(IBUS ibus-1.0 ibus)
1248 set(HAVE_IBUS_IBUS_H TRUE)
1249 include_directories(${IBUS_INCLUDE_DIRS})
1250 list(APPEND EXTRA_LIBS ${IBUS_LIBRARIES})
1253 if (HAVE_IBUS_IBUS_H OR HAVE_FCITX)
1254 set(SDL_USE_IME TRUE)
1255 add_definitions(-DSDL_USE_IME) # !!! FIXME: why isn't this a definition and not in SDL_config.h.cmake?
1257 if(HAVE_LIBUNWIND_H)
1258 # We've already found the header, so REQUIRE the lib to be present
1259 pkg_search_module(UNWIND REQUIRED libunwind)
1260 pkg_search_module(UNWIND_GENERIC REQUIRED libunwind-generic)
1261 list(APPEND EXTRA_LIBS ${UNWIND_LIBRARIES} ${UNWIND_GENERIC_LIBRARIES})
1265 if(HAVE_DBUS_DBUS_H)
1266 set(SOURCE_FILES ${SOURCE_FILES} "${SDL2_SOURCE_DIR}/src/core/linux/SDL_dbus.c")
1270 set(SOURCE_FILES ${SOURCE_FILES} "${SDL2_SOURCE_DIR}/src/core/linux/SDL_ime.c")
1273 if(HAVE_IBUS_IBUS_H)
1274 set(SOURCE_FILES ${SOURCE_FILES} "${SDL2_SOURCE_DIR}/src/core/linux/SDL_ibus.c")
1278 set(SOURCE_FILES ${SOURCE_FILES} "${SDL2_SOURCE_DIR}/src/core/linux/SDL_fcitx.c")
1282 set(SOURCE_FILES ${SOURCE_FILES} "${SDL2_SOURCE_DIR}/src/core/linux/SDL_udev.c")
1285 if(HAVE_INPUT_EVENTS)
1286 set(SOURCE_FILES ${SOURCE_FILES} "${SDL2_SOURCE_DIR}/src/core/linux/SDL_evdev.c")
1287 set(SOURCE_FILES ${SOURCE_FILES} "${SDL2_SOURCE_DIR}/src/core/linux/SDL_evdev_kbd.c")
1290 # Always compiled for Linux, unconditionally:
1291 set(SOURCE_FILES ${SOURCE_FILES} "${SDL2_SOURCE_DIR}/src/core/linux/SDL_evdev_capabilities.c")
1292 set(SOURCE_FILES ${SOURCE_FILES} "${SDL2_SOURCE_DIR}/src/core/linux/SDL_threadprio.c")
1294 # src/core/unix/*.c is included in a generic if(UNIX) section, elsewhere.
1298 if(FREEBSD OR NETBSD OR OPENBSD OR BSDI)
1302 if(LINUX AND NOT ANDROID)
1303 set(SDL_JOYSTICK_LINUX 1)
1304 file(GLOB JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/linux/*.c ${SDL2_SOURCE_DIR}/src/joystick/steam/*.c)
1305 set(SOURCE_FILES ${SOURCE_FILES} ${JOYSTICK_SOURCES})
1306 set(HAVE_SDL_JOYSTICK TRUE)
1313 check_library_exists(rt clock_gettime "" FOUND_CLOCK_GETTIME)
1314 if(FOUND_CLOCK_GETTIME)
1315 list(APPEND EXTRA_LIBS rt)
1316 set(HAVE_CLOCK_GETTIME 1)
1318 check_library_exists(c clock_gettime "" FOUND_CLOCK_GETTIME)
1319 if(FOUND_CLOCK_GETTIME)
1320 set(HAVE_CLOCK_GETTIME 1)
1325 check_include_file(linux/version.h HAVE_LINUX_VERSION_H)
1326 if(HAVE_LINUX_VERSION_H)
1327 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DHAVE_LINUX_VERSION_H")
1330 file(GLOB MISC_SOURCES ${SDL2_SOURCE_DIR}/src/misc/unix/*.c)
1331 set(SOURCE_FILES ${SOURCE_FILES} ${MISC_SOURCES})
1332 set(HAVE_SDL_MISC TRUE)
1336 set(SDL_POWER_LINUX 1)
1337 file(GLOB POWER_SOURCES ${SDL2_SOURCE_DIR}/src/power/linux/*.c)
1338 set(SOURCE_FILES ${SOURCE_FILES} ${POWER_SOURCES})
1339 set(HAVE_SDL_POWER TRUE)
1344 file(GLOB LOCALE_SOURCES ${SDL2_SOURCE_DIR}/src/locale/unix/*.c)
1345 set(SOURCE_FILES ${SOURCE_FILES} ${LOCALE_SOURCES})
1346 set(HAVE_SDL_LOCALE TRUE)
1350 set(SDL_FILESYSTEM_UNIX 1)
1351 file(GLOB FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/unix/*.c)
1352 set(SOURCE_FILES ${SOURCE_FILES} ${FILESYSTEM_SOURCES})
1353 set(HAVE_SDL_FILESYSTEM TRUE)
1357 set(SDL_TIMER_UNIX 1)
1358 file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/unix/*.c)
1359 set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES})
1360 set(HAVE_SDL_TIMERS TRUE)
1363 set(SDL_RLD_FLAGS "")
1364 if(RPATH AND SDL_SHARED)
1365 if(BSDI OR FREEBSD OR LINUX OR NETBSD)
1366 set(CMAKE_REQUIRED_FLAGS "-Wl,--enable-new-dtags")
1367 check_c_compiler_flag("" HAVE_ENABLE_NEW_DTAGS)
1368 set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS})
1369 if(HAVE_ENABLE_NEW_DTAGS)
1370 set(SDL_RLD_FLAGS "-Wl,-rpath,\${libdir} -Wl,--enable-new-dtags")
1372 set(SDL_RLD_FLAGS "-Wl,-rpath,\${libdir}")
1375 set(SDL_RLD_FLAGS "-R\${libdir}")
1377 set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)
1378 set(HAVE_RPATH TRUE)
1382 find_program(WINDRES windres)
1384 check_c_source_compiles("
1385 #include <windows.h>
1386 int main(int argc, char **argv) { }" HAVE_WIN32_CC)
1388 file(GLOB CORE_SOURCES ${SDL2_SOURCE_DIR}/src/core/windows/*.c)
1389 set(SOURCE_FILES ${SOURCE_FILES} ${CORE_SOURCES})
1392 file(GLOB WINRT_SOURCE_FILES ${SDL2_SOURCE_DIR}/src/core/winrt/*.c ${SDL2_SOURCE_DIR}/src/core/winrt/*.cpp)
1393 list(APPEND SOURCE_FILES ${WINRT_SOURCE_FILES})
1397 # Prevent codegen that would use the VC runtime libraries.
1398 set_property(DIRECTORY . APPEND PROPERTY COMPILE_OPTIONS "/GS-")
1400 set_property(DIRECTORY . APPEND PROPERTY COMPILE_OPTIONS "/arch:SSE")
1404 file(GLOB MISC_SOURCES ${SDL2_SOURCE_DIR}/src/misc/windows/*.c)
1405 set(SOURCE_FILES ${SOURCE_FILES} ${MISC_SOURCES})
1406 set(HAVE_SDL_MISC TRUE)
1410 if(DEFINED MSVC_VERSION AND NOT ${MSVC_VERSION} LESS 1700)
1411 set(USE_WINSDK_DIRECTX TRUE)
1413 if(NOT CMAKE_COMPILER_IS_MINGW AND NOT USE_WINSDK_DIRECTX)
1414 if("$ENV{DXSDK_DIR}" STREQUAL "")
1415 message_error("DIRECTX requires the \$DXSDK_DIR environment variable to be set")
1417 set(CMAKE_REQUIRED_FLAGS "/I\"$ENV{DXSDK_DIR}\\Include\"")
1421 # xinput.h may need windows.h, but doesn't include it itself.
1422 check_c_source_compiles("
1423 #include <windows.h>
1425 int main(int argc, char **argv) { }" HAVE_XINPUT_H)
1426 check_c_source_compiles("
1427 #include <windows.h>
1429 XINPUT_GAMEPAD_EX x1;
1430 int main(int argc, char **argv) { }" HAVE_XINPUT_GAMEPAD_EX)
1431 check_c_source_compiles("
1432 #include <windows.h>
1435 int main(int argc, char **argv) { }" HAVE_XINPUT_STATE_EX)
1437 check_include_file(xinput.h HAVE_XINPUT_H)
1440 check_include_file(d3d9.h HAVE_D3D_H)
1441 check_include_file(d3d11_1.h HAVE_D3D11_H)
1442 check_include_file(ddraw.h HAVE_DDRAW_H)
1443 check_include_file(dsound.h HAVE_DSOUND_H)
1444 check_include_file(dinput.h HAVE_DINPUT_H)
1445 if(WINDOWS_STORE OR VCPKG_TARGET_TRIPLET MATCHES "arm-windows")
1446 set(HAVE_DINPUT_H 0)
1448 check_include_file(dxgi.h HAVE_DXGI_H)
1449 if(HAVE_D3D_H OR HAVE_D3D11_H OR HAVE_DDRAW_H OR HAVE_DSOUND_H OR HAVE_DINPUT_H)
1450 set(HAVE_DIRECTX TRUE)
1451 if(NOT CMAKE_COMPILER_IS_MINGW AND NOT USE_WINSDK_DIRECTX)
1452 # TODO: change $ENV{DXSDL_DIR} to get the path from the include checks
1453 link_directories($ENV{DXSDK_DIR}\\lib\\${PROCESSOR_ARCH})
1454 include_directories($ENV{DXSDK_DIR}\\Include)
1457 set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS})
1460 # headers needed elsewhere
1461 check_include_file(mmdeviceapi.h HAVE_MMDEVICEAPI_H)
1462 check_include_file(audioclient.h HAVE_AUDIOCLIENT_H)
1463 check_include_file(sensorsapi.h HAVE_SENSORSAPI_H)
1466 if(NOT WINDOWS_STORE)
1467 set(SDL_AUDIO_DRIVER_WINMM 1)
1468 file(GLOB WINMM_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/winmm/*.c)
1469 set(SOURCE_FILES ${SOURCE_FILES} ${WINMM_AUDIO_SOURCES})
1471 set(HAVE_SDL_AUDIO TRUE)
1473 if(HAVE_DSOUND_H AND NOT WINDOWS_STORE)
1474 set(SDL_AUDIO_DRIVER_DSOUND 1)
1475 file(GLOB DSOUND_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/directsound/*.c)
1476 set(SOURCE_FILES ${SOURCE_FILES} ${DSOUND_AUDIO_SOURCES})
1479 if(WASAPI AND HAVE_AUDIOCLIENT_H AND HAVE_MMDEVICEAPI_H AND NOT WINDOWS_STORE)
1480 set(SDL_AUDIO_DRIVER_WASAPI 1)
1481 file(GLOB WASAPI_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/wasapi/*.c)
1482 set(SOURCE_FILES ${SOURCE_FILES} ${WASAPI_AUDIO_SOURCES})
1487 # requires SDL_LOADSO on Windows (IME, DX, etc.)
1489 message_error("SDL_VIDEO requires SDL_LOADSO, which is not enabled")
1492 set(SDL_VIDEO_DRIVER_WINRT 1)
1493 file(GLOB WIN_VIDEO_SOURCES
1494 ${SDL2_SOURCE_DIR}/src/video/winrt/*.c
1495 ${SDL2_SOURCE_DIR}/src/video/winrt/*.cpp
1496 ${SDL2_SOURCE_DIR}/src/render/direct3d11/*.cpp
1499 set(SDL_VIDEO_DRIVER_WINDOWS 1)
1500 file(GLOB WIN_VIDEO_SOURCES ${SDL2_SOURCE_DIR}/src/video/windows/*.c)
1502 set(SOURCE_FILES ${SOURCE_FILES} ${WIN_VIDEO_SOURCES})
1504 if(RENDER_D3D AND HAVE_D3D_H AND NOT WINDOWS_STORE)
1505 set(SDL_VIDEO_RENDER_D3D 1)
1506 set(HAVE_RENDER_D3D TRUE)
1508 if(RENDER_D3D AND HAVE_D3D11_H)
1509 set(SDL_VIDEO_RENDER_D3D11 1)
1510 set(HAVE_RENDER_D3D TRUE)
1512 set(HAVE_SDL_VIDEO TRUE)
1516 set(SDL_THREAD_WINDOWS 1)
1517 set(SOURCE_FILES ${SOURCE_FILES}
1518 ${SDL2_SOURCE_DIR}/src/thread/windows/SDL_sysmutex.c
1519 ${SDL2_SOURCE_DIR}/src/thread/windows/SDL_syssem.c
1520 ${SDL2_SOURCE_DIR}/src/thread/windows/SDL_systhread.c
1521 ${SDL2_SOURCE_DIR}/src/thread/windows/SDL_systls.c
1522 ${SDL2_SOURCE_DIR}/src/thread/generic/SDL_syscond.c)
1523 set(HAVE_SDL_THREADS TRUE)
1526 if(SDL_SENSOR AND HAVE_SENSORSAPI_H)
1527 set(SDL_SENSOR_WINDOWS 1)
1528 set(HAVE_SDL_SENSORS TRUE)
1529 file(GLOB WINDOWS_SENSOR_SOURCES ${SDL2_SOURCE_DIR}/src/sensor/windows/*.c)
1530 set(SOURCE_FILES ${SOURCE_FILES} ${WINDOWS_SENSOR_SOURCES})
1535 set(SDL_POWER_WINRT 1)
1536 set(SOURCE_FILES ${SOURCE_FILES} ${SDL2_SOURCE_DIR}/src/power/winrt/SDL_syspower.cpp)
1538 set(SDL_POWER_WINDOWS 1)
1539 set(SOURCE_FILES ${SOURCE_FILES} ${SDL2_SOURCE_DIR}/src/power/windows/SDL_syspower.c)
1540 set(HAVE_SDL_POWER TRUE)
1545 file(GLOB LOCALE_SOURCES ${SDL2_SOURCE_DIR}/src/locale/windows/*.c)
1546 set(SOURCE_FILES ${SOURCE_FILES} ${LOCALE_SOURCES})
1547 set(HAVE_SDL_LOCALE TRUE)
1551 set(SDL_FILESYSTEM_WINDOWS 1)
1553 file(GLOB FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/winrt/*.cpp)
1555 file(GLOB FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/windows/*.c)
1557 set(SOURCE_FILES ${SOURCE_FILES} ${FILESYSTEM_SOURCES})
1558 set(HAVE_SDL_FILESYSTEM TRUE)
1561 # Libraries for Win32 native and MinGW
1562 if(NOT WINDOWS_STORE)
1563 list(APPEND EXTRA_LIBS user32 gdi32 winmm imm32 ole32 oleaut32 version uuid advapi32 setupapi shell32)
1566 # TODO: in configure.ac the check for timers is set on
1567 # cygwin | mingw32* - does this include mingw32CE?
1569 set(SDL_TIMER_WINDOWS 1)
1570 file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/windows/*.c)
1571 set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES})
1572 set(HAVE_SDL_TIMERS TRUE)
1576 set(SDL_LOADSO_WINDOWS 1)
1577 file(GLOB LOADSO_SOURCES ${SDL2_SOURCE_DIR}/src/loadso/windows/*.c)
1578 set(SOURCE_FILES ${SOURCE_FILES} ${LOADSO_SOURCES})
1579 set(HAVE_SDL_LOADSO TRUE)
1582 file(GLOB CORE_SOURCES ${SDL2_SOURCE_DIR}/src/core/windows/*.c)
1583 set(SOURCE_FILES ${SOURCE_FILES} ${CORE_SOURCES})
1586 if(VIDEO_OPENGL AND NOT WINDOWS_STORE)
1587 set(SDL_VIDEO_OPENGL 1)
1588 set(SDL_VIDEO_OPENGL_WGL 1)
1589 set(SDL_VIDEO_RENDER_OGL 1)
1590 set(HAVE_VIDEO_OPENGL TRUE)
1594 set(SDL_VIDEO_OPENGL_EGL 1)
1595 set(SDL_VIDEO_OPENGL_ES2 1)
1596 set(SDL_VIDEO_RENDER_OGL_ES2 1)
1597 set(HAVE_VIDEO_OPENGLES TRUE)
1603 # TODO: Remove this hid.c block when SDL_hidapi.c is supported on Windows!
1605 set(SOURCE_FILES ${SOURCE_FILES} ${SDL2_SOURCE_DIR}/src/hidapi/windows/hid.c)
1607 file(GLOB JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/windows/*.c)
1608 set(SOURCE_FILES ${SOURCE_FILES} ${JOYSTICK_SOURCES})
1610 set(SDL_JOYSTICK_DINPUT 1)
1611 list(APPEND EXTRA_LIBS dinput8)
1614 set(SDL_JOYSTICK_XINPUT 1)
1616 if(NOT HAVE_DINPUT_H AND NOT HAVE_XINPUT_H)
1617 set(SDL_JOYSTICK_WINMM 1)
1619 set(HAVE_SDL_JOYSTICK TRUE)
1622 if(HAVE_DINPUT_H OR HAVE_XINPUT_H)
1623 file(GLOB HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/windows/*.c)
1625 set(SDL_HAPTIC_DINPUT 1)
1628 set(SDL_HAPTIC_XINPUT 1)
1631 file(GLOB HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/dummy/*.c)
1632 set(SDL_HAPTIC_DUMMY 1)
1634 set(SOURCE_FILES ${SOURCE_FILES} ${HAPTIC_SOURCES})
1635 set(HAVE_SDL_HAPTIC TRUE)
1639 file(GLOB VERSION_SOURCES ${SDL2_SOURCE_DIR}/src/main/windows/*.rc)
1640 file(GLOB SDLMAIN_SOURCES ${SDL2_SOURCE_DIR}/src/main/windows/*.c)
1642 list(APPEND EXTRA_LIBS mingw32)
1643 list(APPEND EXTRA_LDFLAGS "-mwindows")
1644 set(SDL_CFLAGS "${SDL_CFLAGS} -Dmain=SDL_main")
1645 list(APPEND SDL_LIBS "-lmingw32" "-lSDL2main" "-mwindows")
1649 # TODO: rework this all for proper MacOS X, iOS and Darwin support
1651 # We always need these libs on macOS at the moment.
1652 # !!! FIXME: we need Carbon for some very old API calls in
1653 # !!! FIXME: src/video/cocoa/SDL_cocoakeyboard.c, but we should figure out
1654 # !!! FIXME: how to dump those.
1655 if(DARWIN OR MACOSX)
1656 set(SDL_FRAMEWORK_COCOA 1)
1657 set(SDL_FRAMEWORK_CARBON 1)
1659 set(SDL_FRAMEWORK_FOUNDATION 1)
1661 # Requires the darwin file implementation
1663 file(GLOB EXTRA_SOURCES ${SDL2_SOURCE_DIR}/src/file/cocoa/*.m)
1664 set(SOURCE_FILES ${EXTRA_SOURCES} ${SOURCE_FILES})
1665 # !!! FIXME: modern CMake doesn't need "LANGUAGE C" for Objective-C.
1666 set_source_files_properties(${EXTRA_SOURCES} PROPERTIES LANGUAGE C)
1667 set(HAVE_SDL_FILE TRUE)
1668 # !!! FIXME: why is COREVIDEO inside this if() block?
1669 set(SDL_FRAMEWORK_COREVIDEO 1)
1671 message_error("SDL_FILE must be enabled to build on MacOS X")
1674 file(GLOB MISC_SOURCES ${SDL2_SOURCE_DIR}/src/misc/macosx/*.m)
1675 set(SOURCE_FILES ${SOURCE_FILES} ${MISC_SOURCES})
1676 set(HAVE_SDL_MISC TRUE)
1679 set(SDL_AUDIO_DRIVER_COREAUDIO 1)
1680 file(GLOB AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/coreaudio/*.m)
1681 # !!! FIXME: modern CMake doesn't need "LANGUAGE C" for Objective-C.
1682 set_source_files_properties(${AUDIO_SOURCES} PROPERTIES LANGUAGE C)
1683 set(SOURCE_FILES ${SOURCE_FILES} ${AUDIO_SOURCES})
1684 set(HAVE_SDL_AUDIO TRUE)
1685 set(SDL_FRAMEWORK_COREAUDIO 1)
1686 set(SDL_FRAMEWORK_AUDIOTOOLBOX 1)
1687 set(SDL_FRAMEWORK_AVFOUNDATION 1)
1694 set(SOURCE_FILES ${SOURCE_FILES} ${SDL2_SOURCE_DIR}/src/hidapi/ios/hid.m)
1695 set(SDL_FRAMEWORK_COREBLUETOOTH 1)
1699 file(GLOB JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/iphoneos/*.m ${SDL2_SOURCE_DIR}/src/joystick/steam/*.c)
1700 set(SDL_JOYSTICK_MFI 1)
1702 set(SDL_FRAMEWORK_COREMOTION 1)
1704 set(SDL_FRAMEWORK_GAMECONTROLLER 1)
1705 set(HAVE_SDL_SENSORS 1)
1707 file(GLOB JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/darwin/*.c ${SDL2_SOURCE_DIR}/src/joystick/iphoneos/*.m)
1708 # FIXME: add checks for SDL_JOYSTICK_MFI???
1709 set(SDL_JOYSTICK_IOKIT 1)
1710 set(SDL_FRAMEWORK_IOKIT 1)
1711 set(SDL_FRAMEWORK_FF 1)
1713 set(SOURCE_FILES ${SOURCE_FILES} ${JOYSTICK_SOURCES})
1714 set(HAVE_SDL_JOYSTICK TRUE)
1719 file(GLOB HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/dummy/*.c)
1720 set(SDL_HAPTIC_DUMMY 1)
1722 file(GLOB HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/darwin/*.c)
1723 set(SDL_HAPTIC_IOKIT 1)
1724 set(SDL_FRAMEWORK_IOKIT 1)
1725 set(SDL_FRAMEWORK_FF 1)
1727 set(SOURCE_FILES ${SOURCE_FILES} ${HAPTIC_SOURCES})
1728 set(HAVE_SDL_HAPTIC TRUE)
1729 if(NOT SDL_JOYSTICK)
1730 message(FATAL_ERROR "SDL_HAPTIC requires SDL_JOYSTICK to be enabled")
1736 file(GLOB POWER_SOURCES ${SDL2_SOURCE_DIR}/src/power/uikit/*.m)
1737 set(SDL_POWER_UIKIT 1)
1739 file(GLOB POWER_SOURCES ${SDL2_SOURCE_DIR}/src/power/macosx/*.c)
1740 set(SDL_POWER_MACOSX 1)
1741 set(SDL_FRAMEWORK_IOKIT 1)
1743 set(SOURCE_FILES ${SOURCE_FILES} ${POWER_SOURCES})
1744 set(HAVE_SDL_POWER TRUE)
1748 file(GLOB LOCALE_SOURCES ${SDL2_SOURCE_DIR}/src/locale/macosx/*.m)
1749 set(SOURCE_FILES ${SOURCE_FILES} ${LOCALE_SOURCES})
1750 set(HAVE_SDL_LOCALE TRUE)
1754 set(SDL_TIMER_UNIX 1)
1755 file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/unix/*.c)
1756 set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES})
1757 set(HAVE_SDL_TIMERS TRUE)
1761 set(SDL_FILESYSTEM_COCOA 1)
1762 file(GLOB FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/cocoa/*.m)
1763 # !!! FIXME: modern CMake doesn't need "LANGUAGE C" for Objective-C.
1764 set_source_files_properties(${FILESYSTEM_SOURCES} PROPERTIES LANGUAGE C)
1765 set(SOURCE_FILES ${SOURCE_FILES} ${FILESYSTEM_SOURCES})
1766 set(HAVE_SDL_FILESYSTEM TRUE)
1771 set(SDL_SENSOR_COREMOTION 1)
1772 set(HAVE_SDL_SENSORS TRUE)
1773 file(GLOB SENSOR_SOURCES ${SDL2_SOURCE_DIR}/src/sensor/coremotion/*.m)
1774 set(SOURCE_FILES ${SOURCE_FILES} ${SENSOR_SOURCES})
1778 # iOS hack needed - http://code.google.com/p/ios-cmake/ ?
1781 set(SDL_VIDEO_DRIVER_UIKIT 1)
1782 set(SDL_FRAMEWORK_COREGRAPHICS 1)
1783 set(SDL_FRAMEWORK_QUARTZCORE 1)
1784 set(SDL_FRAMEWORK_UIKIT 1)
1785 set(SDL_IPHONE_KEYBOARD 1)
1786 set(SDL_IPHONE_LAUNCHSCREEN 1)
1787 file(GLOB UIKITVIDEO_SOURCES ${SDL2_SOURCE_DIR}/src/video/uikit/*.m)
1788 set(SOURCE_FILES ${SOURCE_FILES} ${UIKITVIDEO_SOURCES})
1792 set(SDL_VIDEO_OPENGL 1)
1793 set(SDL_VIDEO_OPENGL_CGL 1)
1794 set(SDL_VIDEO_RENDER_OGL 1)
1795 set(HAVE_VIDEO_OPENGL TRUE)
1801 set(SDL_FRAMEWORK_OPENGLES 1)
1802 set(SDL_VIDEO_OPENGL_ES 1)
1803 set(SDL_VIDEO_RENDER_OGL_ES 1)
1805 set(SDL_VIDEO_OPENGL_EGL 1)
1807 set(SDL_VIDEO_OPENGL_ES2 1)
1808 set(SDL_VIDEO_RENDER_OGL_ES2 1)
1809 set(HAVE_VIDEO_OPENGLES TRUE)
1812 if(VIDEO_VULKAN OR VIDEO_METAL OR RENDER_METAL)
1813 set(ORIG_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
1814 set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -ObjC")
1815 check_c_source_compiles("
1816 #include <AvailabilityMacros.h>
1817 #import <Metal/Metal.h>
1818 #import <QuartzCore/CAMetalLayer.h>
1820 #if TARGET_OS_SIMULATOR || (!TARGET_CPU_X86_64 && !TARGET_CPU_ARM64)
1821 #error Metal doesn't work on this configuration
1827 " HAVE_FRAMEWORK_METAL)
1828 set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS})
1829 if(HAVE_FRAMEWORK_METAL)
1830 set(SDL_FRAMEWORK_METAL 1)
1831 set(SDL_FRAMEWORK_QUARTZCORE 1)
1840 set(SDL_VIDEO_METAL 1)
1841 set(HAVE_VIDEO_METAL TRUE)
1845 file(GLOB RENDER_METAL_SOURCES ${SDL2_SOURCE_DIR}/src/render/metal/*.m)
1846 set(SOURCE_FILES ${SOURCE_FILES} ${RENDER_METAL_SOURCES})
1847 set(SDL_VIDEO_RENDER_METAL 1)
1848 set(HAVE_RENDER_METAL TRUE)
1852 # Actually load the frameworks at the end so we don't duplicate include.
1853 if(SDL_FRAMEWORK_COREVIDEO)
1854 find_library(COREVIDEO CoreVideo)
1855 list(APPEND EXTRA_LIBS ${COREVIDEO})
1857 if(SDL_FRAMEWORK_COCOA)
1858 find_library(COCOA_LIBRARY Cocoa)
1859 list(APPEND EXTRA_LIBS ${COCOA_LIBRARY})
1861 if(SDL_FRAMEWORK_IOKIT)
1862 find_library(IOKIT IOKit)
1863 list(APPEND EXTRA_LIBS ${IOKIT})
1865 if(SDL_FRAMEWORK_FF)
1866 find_library(FORCEFEEDBACK ForceFeedback)
1867 list(APPEND EXTRA_LIBS ${FORCEFEEDBACK})
1869 if(SDL_FRAMEWORK_CARBON)
1870 find_library(CARBON_LIBRARY Carbon)
1871 list(APPEND EXTRA_LIBS ${CARBON_LIBRARY})
1873 if(SDL_FRAMEWORK_COREAUDIO)
1874 find_library(COREAUDIO CoreAudio)
1875 list(APPEND EXTRA_LIBS ${COREAUDIO})
1877 if(SDL_FRAMEWORK_AUDIOTOOLBOX)
1878 find_library(AUDIOTOOLBOX AudioToolbox)
1879 list(APPEND EXTRA_LIBS ${AUDIOTOOLBOX})
1881 if(SDL_FRAMEWORK_AVFOUNDATION)
1882 find_library(AVFOUNDATION AVFoundation)
1883 list(APPEND EXTRA_LIBS ${AVFOUNDATION})
1885 if(SDL_FRAMEWORK_COREBLUETOOTH)
1886 find_library(COREBLUETOOTH CoreBluetooth)
1887 list(APPEND EXTRA_LIBS ${COREBLUETOOTH})
1889 if(SDL_FRAMEWORK_COREGRAPHICS)
1890 find_library(COREGRAPHICS CoreGraphics)
1891 list(APPEND EXTRA_LIBS ${COREGRAPHICS})
1893 if(SDL_FRAMEWORK_COREMOTION)
1894 find_library(COREMOTION CoreMotion)
1895 list(APPEND EXTRA_LIBS ${COREMOTION})
1897 if(SDL_FRAMEWORK_FOUNDATION)
1898 find_library(FOUNDATION Foundation)
1899 list(APPEND EXTRA_LIBS ${FOUNDATION})
1901 if(SDL_FRAMEWORK_GAMECONTROLLER)
1902 find_library(GAMECONTROLLER GameController)
1903 list(APPEND EXTRA_LIBS ${GAMECONTROLLER})
1905 if(SDL_FRAMEWORK_METAL)
1907 find_library(METAL Metal)
1908 list(APPEND EXTRA_LIBS ${METAL})
1910 list(APPEND EXTRA_LDFLAGS "-Wl,-weak_framework,Metal")
1913 if(SDL_FRAMEWORK_OPENGLES)
1914 find_library(OPENGLES OpenGLES)
1915 list(APPEND EXTRA_LIBS ${OPENGLES})
1917 if(SDL_FRAMEWORK_QUARTZCORE)
1919 find_library(QUARTZCORE QuartzCore)
1920 list(APPEND EXTRA_LIBS ${QUARTZCORE})
1922 list(APPEND EXTRA_LDFLAGS "-Wl,-weak_framework,QuartzCore")
1925 if(SDL_FRAMEWORK_UIKIT)
1926 find_library(UIKIT UIKit)
1927 list(APPEND EXTRA_LIBS ${UIKIT})
1933 file(GLOB MISC_SOURCES ${SDL2_SOURCE_DIR}/src/misc/haiku/*.cc)
1934 set(SOURCE_FILES ${SOURCE_FILES} ${MISC_SOURCES})
1935 set(HAVE_SDL_MISC TRUE)
1938 set(SDL_VIDEO_DRIVER_HAIKU 1)
1939 file(GLOB HAIKUVIDEO_SOURCES ${SDL2_SOURCE_DIR}/src/video/haiku/*.c)
1940 set(SOURCE_FILES ${SOURCE_FILES} ${HAIKUVIDEO_SOURCES})
1941 set(HAVE_SDL_VIDEO TRUE)
1944 # TODO: Use FIND_PACKAGE(OpenGL) instead
1945 set(SDL_VIDEO_OPENGL 1)
1946 set(SDL_VIDEO_OPENGL_BGL 1)
1947 set(SDL_VIDEO_RENDER_OGL 1)
1948 list(APPEND EXTRA_LIBS GL)
1949 set(HAVE_VIDEO_OPENGL TRUE)
1953 set(SDL_FILESYSTEM_HAIKU 1)
1954 file(GLOB FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/haiku/*.cc)
1955 set(SOURCE_FILES ${SOURCE_FILES} ${FILESYSTEM_SOURCES})
1956 set(HAVE_SDL_FILESYSTEM TRUE)
1959 set(SDL_TIMER_HAIKU 1)
1960 file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/haiku/*.c)
1961 set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES})
1962 set(HAVE_SDL_TIMERS TRUE)
1966 file(GLOB LOCALE_SOURCES ${SDL2_SOURCE_DIR}/src/locale/haiku/*.cc)
1967 set(SOURCE_FILES ${SOURCE_FILES} ${LOCALE_SOURCES})
1968 set(HAVE_SDL_LOCALE TRUE)
1974 file(GLOB MISC_SOURCES ${SDL2_SOURCE_DIR}/src/misc/riscos/*.c)
1975 set(SOURCE_FILES ${SOURCE_FILES} ${MISC_SOURCES})
1976 set(HAVE_SDL_MISC TRUE)
1979 set(SDL_TIMER_UNIX 1)
1980 file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/unix/*.c)
1981 set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES})
1982 set(HAVE_SDL_TIMERS TRUE)
1985 set(HAVE_CLOCK_GETTIME 1)
1992 add_definitions(-D_EFL_BETA_API_SUPPORT)
1994 set(SDL_VIDEO_VULKAN 1)
1995 set(HAVE_VIDEO_VULKAN TRUE)
1996 set(SDL_CFLAGS "${SDL_CFLAGS} -I/usr/include")
2002 set(SDL_VIDEO_VULKAN 1)
2003 set(HAVE_VIDEO_VULKAN TRUE)
2007 # configure.ac does it differently:
2009 # if enable_X { SDL_X_DISABLED = 1 }
2010 # [add dummy sources]
2011 # so it always adds a dummy, without checking, if it was actually requested.
2012 # This leads to missing internal references on building, since the
2013 # src/X/*.c does not get included.
2014 if(NOT HAVE_SDL_JOYSTICK)
2015 set(SDL_JOYSTICK_DUMMY 1)
2016 if(SDL_JOYSTICK AND NOT APPLE) # results in unresolved symbols on OSX
2017 file(GLOB JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/dummy/*.c)
2018 set(SOURCE_FILES ${SOURCE_FILES} ${JOYSTICK_SOURCES})
2021 if(NOT HAVE_SDL_HAPTIC)
2022 set(SDL_HAPTIC_DUMMY 1)
2023 file(GLOB HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/dummy/*.c)
2024 set(SOURCE_FILES ${SOURCE_FILES} ${HAPTIC_SOURCES})
2026 if(NOT HAVE_SDL_SENSORS)
2027 set(SDL_SENSOR_DUMMY 1)
2028 file(GLOB SENSORS_SOURCES ${SDL2_SOURCE_DIR}/src/sensor/dummy/*.c)
2029 set(SOURCE_FILES ${SOURCE_FILES} ${SENSORS_SOURCES})
2031 if(NOT HAVE_SDL_LOADSO)
2032 set(SDL_LOADSO_DISABLED 1)
2033 file(GLOB LOADSO_SOURCES ${SDL2_SOURCE_DIR}/src/loadso/dummy/*.c)
2034 set(SOURCE_FILES ${SOURCE_FILES} ${LOADSO_SOURCES})
2036 if(NOT HAVE_SDL_FILESYSTEM)
2037 set(SDL_FILESYSTEM_DISABLED 1)
2038 file(GLOB FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/dummy/*.c)
2039 set(SOURCE_FILES ${SOURCE_FILES} ${FILESYSTEM_SOURCES})
2041 if(NOT HAVE_SDL_LOCALE)
2042 set(SDL_LOCALE_DISABLED 1)
2043 file(GLOB LOCALE_SOURCES ${SDL2_SOURCE_DIR}/src/locale/dummy/*.c)
2044 set(SOURCE_FILES ${SOURCE_FILES} ${LOCALE_SOURCES})
2046 if(NOT HAVE_SDL_MISC)
2047 set(SDL_MISC_DISABLED 1)
2048 file(GLOB LOCALE_SOURCES ${SDL2_SOURCE_DIR}/src/misc/dummy/*.c)
2049 set(SOURCE_FILES ${SOURCE_FILES} ${LOCALE_SOURCES})
2052 # We always need to have threads and timers around
2053 if(NOT HAVE_SDL_THREADS)
2054 set(SDL_THREADS_DISABLED 1)
2055 file(GLOB THREADS_SOURCES ${SDL2_SOURCE_DIR}/src/thread/generic/*.c)
2056 set(SOURCE_FILES ${SOURCE_FILES} ${THREADS_SOURCES})
2058 if(NOT HAVE_SDL_TIMERS)
2059 set(SDL_TIMERS_DISABLED 1)
2060 file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/dummy/*.c)
2061 set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES})
2064 if(NOT SDLMAIN_SOURCES)
2065 file(GLOB SDLMAIN_SOURCES ${SDL2_SOURCE_DIR}/src/main/dummy/*.c)
2068 # Append the -MMD -MT flags
2069 # if(DEPENDENCY_TRACKING)
2070 # if(COMPILER_IS_GNUCC)
2071 # set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -MMD -MT \$@")
2075 configure_file("${SDL2_SOURCE_DIR}/include/SDL_config.h.cmake"
2076 "${SDL2_BINARY_DIR}/include/SDL_config.h")
2078 # Prepare the flags and remove duplicates
2080 list(REMOVE_DUPLICATES EXTRA_LDFLAGS)
2083 list(REMOVE_DUPLICATES EXTRA_LIBS)
2086 list(REMOVE_DUPLICATES EXTRA_CFLAGS)
2088 listtostr(EXTRA_CFLAGS _EXTRA_CFLAGS)
2089 set(EXTRA_CFLAGS ${_EXTRA_CFLAGS})
2091 # Compat helpers for the configuration files
2092 if(NOT CMAKE_HOST_WIN32)
2093 # TODO: we need a Windows script, too
2094 execute_process(COMMAND sh ${SDL2_SOURCE_DIR}/build-scripts/updaterev.sh
2095 WORKING_DIRECTORY ${SDL2_BINARY_DIR})
2097 if(NOT WINDOWS OR CYGWIN)
2098 set(prefix ${CMAKE_INSTALL_PREFIX})
2099 set(exec_prefix "\${prefix}")
2100 set(libdir "\${exec_prefix}/lib${LIB_SUFFIX}")
2101 set(bindir "\${exec_prefix}/bin")
2102 set(includedir "\${prefix}/include")
2104 set(ENABLE_STATIC_TRUE "")
2105 set(ENABLE_STATIC_FALSE "#")
2107 set(ENABLE_STATIC_TRUE "#")
2108 set(ENABLE_STATIC_FALSE "")
2111 set(PKG_CONFIG_LIBS_PRIV "
2113 set(ENABLE_SHARED_TRUE "")
2114 set(ENABLE_SHARED_FALSE "#")
2116 set(PKG_CONFIG_LIBS_PRIV "")
2117 set(ENABLE_SHARED_TRUE "#")
2118 set(ENABLE_SHARED_FALSE "")
2121 # Clean up the different lists
2122 listtostr(EXTRA_LIBS _EXTRA_LIBS "-l")
2123 set(SDL_STATIC_LIBS ${EXTRA_LDFLAGS} ${_EXTRA_LIBS})
2124 list(REMOVE_DUPLICATES SDL_STATIC_LIBS)
2125 listtostr(SDL_STATIC_LIBS _SDL_STATIC_LIBS)
2126 set(SDL_STATIC_LIBS ${_SDL_STATIC_LIBS})
2127 listtostr(SDL_LIBS _SDL_LIBS)
2128 set(SDL_LIBS ${_SDL_LIBS})
2130 # MESSAGE(STATUS "SDL_LIBS: ${SDL_LIBS}")
2131 # MESSAGE(STATUS "SDL_STATIC_LIBS: ${SDL_STATIC_LIBS}")
2133 configure_file("${SDL2_SOURCE_DIR}/sdl2.pc.in"
2134 "${SDL2_BINARY_DIR}/sdl2.pc" @ONLY)
2135 configure_file("${SDL2_SOURCE_DIR}/sdl2-config.in"
2136 "${SDL2_BINARY_DIR}/sdl2-config")
2137 configure_file("${SDL2_SOURCE_DIR}/sdl2-config.in"
2138 "${SDL2_BINARY_DIR}/sdl2-config" @ONLY)
2139 configure_file("${SDL2_SOURCE_DIR}/SDL2.spec.in"
2140 "${SDL2_BINARY_DIR}/SDL2.spec" @ONLY)
2143 ##### Info output #####
2145 message(STATUS "SDL2 was configured with the following options:")
2147 message(STATUS "Platform: ${CMAKE_SYSTEM}")
2148 message(STATUS "64-bit: ${ARCH_64}")
2149 message(STATUS "Compiler: ${CMAKE_C_COMPILER}")
2151 message(STATUS "Subsystems:")
2152 foreach(_SUB ${SDL_SUBSYSTEMS})
2153 string(TOUPPER ${_SUB} _OPT)
2154 message_bool_option(${_SUB} SDL_${_OPT})
2157 message(STATUS "Options:")
2158 list(SORT ALLOPTIONS)
2159 foreach(_OPT ${ALLOPTIONS})
2160 # Longest option is VIDEO_X11_XSCREENSAVER = 22 characters
2162 string(LENGTH ${_OPT} _OPTLEN)
2163 math(EXPR _PADLEN "23 - ${_OPTLEN}")
2164 string(RANDOM LENGTH ${_PADLEN} ALPHABET " " _PADDING)
2165 message_tested_option(${_OPT} ${_PADDING})
2168 message(STATUS " CFLAGS: ${CMAKE_C_FLAGS}")
2169 message(STATUS " EXTRA_CFLAGS: ${EXTRA_CFLAGS}")
2170 message(STATUS " EXTRA_LDFLAGS: ${EXTRA_LDFLAGS}")
2171 message(STATUS " EXTRA_LIBS: ${EXTRA_LIBS}")
2173 message(STATUS " Build Shared Library: ${SDL_SHARED}")
2174 message(STATUS " Build Static Library: ${SDL_STATIC}")
2176 message(STATUS " Build Static Library with Position Independent Code: ${SDL_STATIC_PIC}")
2180 message(STATUS "If something was not detected, although the libraries")
2181 message(STATUS "were installed, then make sure you have set the")
2182 message(STATUS "CFLAGS and LDFLAGS environment variables correctly.")
2186 if(WARN_ABOUT_ARM_SIMD_ASM_MIT)
2188 message(STATUS "SDL is being built with ARM SIMD optimizations, which")
2189 message(STATUS "uses code licensed under the MIT license. If this is a")
2190 message(STATUS "problem, please disable that code by rerunning CMake with:")
2192 message(STATUS " -DARMSIMD=OFF")
2195 if(WARN_ABOUT_ARM_NEON_ASM_MIT)
2197 message(STATUS "SDL is being built with ARM NEON optimizations, which")
2198 message(STATUS "uses code licensed under the MIT license. If this is a")
2199 message(STATUS "problem, please disable that code by rerunning CMake with:")
2201 message(STATUS " -DARMNEON=OFF")
2204 # Ensure that the extra cflags are used at compile time
2205 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS}")
2207 # Always build SDLmain
2208 if(NOT WINDOWS_STORE)
2209 add_library(SDL2main STATIC ${SDLMAIN_SOURCES})
2210 target_include_directories(SDL2main PUBLIC "$<BUILD_INTERFACE:${SDL2_SOURCE_DIR}/include>" $<INSTALL_INTERFACE:include> $<INSTALL_INTERFACE:include/SDL2>)
2211 set(_INSTALL_LIBS "SDL2main")
2213 set_target_properties(SDL2main PROPERTIES DEBUG_POSTFIX "${SDL_CMAKE_DEBUG_POSTFIX}")
2217 if (ANDROID AND HAVE_HIDAPI)
2218 set(_INSTALL_LIBS ${_INSTALL_LIBS} "hidapi")
2222 add_library(SDL2 SHARED ${SOURCE_FILES} ${VERSION_SOURCES})
2224 set_target_properties(SDL2 PROPERTIES
2226 OUTPUT_NAME "SDL2-${LT_RELEASE}")
2227 elseif(UNIX AND NOT ANDROID)
2228 set_target_properties(SDL2 PROPERTIES
2229 VERSION ${LT_VERSION}
2230 SOVERSION ${LT_REVISION}
2231 OUTPUT_NAME "SDL2-${LT_RELEASE}")
2233 if(WINDOWS OR CYGWIN)
2234 set_target_properties(SDL2 PROPERTIES
2235 DEFINE_SYMBOL DLL_EXPORT)
2237 set_target_properties(SDL2 PROPERTIES
2238 VERSION ${SDL_VERSION}
2239 SOVERSION ${LT_REVISION}
2242 if(MSVC AND NOT LIBC)
2243 # Don't try to link with the default set of libraries.
2244 set_target_properties(SDL2 PROPERTIES LINK_FLAGS_RELEASE "/NODEFAULTLIB")
2245 set_target_properties(SDL2 PROPERTIES LINK_FLAGS_DEBUG "/NODEFAULTLIB")
2246 set_target_properties(SDL2 PROPERTIES STATIC_LIBRARY_FLAGS "/NODEFAULTLIB")
2248 set(_INSTALL_LIBS "SDL2" ${_INSTALL_LIBS})
2249 target_link_libraries(SDL2 PRIVATE ${EXTRA_LIBS} ${EXTRA_LDFLAGS})
2250 target_include_directories(SDL2 PUBLIC "$<BUILD_INTERFACE:${SDL2_SOURCE_DIR}/include>" $<INSTALL_INTERFACE:include> $<INSTALL_INTERFACE:include/SDL2>)
2252 target_include_directories(SDL2 PRIVATE ${ANDROID_NDK}/sources/android/cpufeatures)
2254 set_target_properties(SDL2 PROPERTIES DEBUG_POSTFIX "${SDL_CMAKE_DEBUG_POSTFIX}")
2257 set_property(TARGET SDL2 APPEND_STRING PROPERTY COMPILE_FLAGS "-fobjc-arc")
2258 target_compile_definitions(SDL2 PRIVATE IOS_DYLIB=1)
2264 add_library(hidapi SHARED ${SDL2_SOURCE_DIR}/src/hidapi/android/hid.cpp)
2267 if(MSVC AND NOT LIBC)
2268 # Don't try to link with the default set of libraries.
2269 set_target_properties(hidapi PROPERTIES LINK_FLAGS_RELEASE "/NODEFAULTLIB")
2270 set_target_properties(hidapi PROPERTIES LINK_FLAGS_DEBUG "/NODEFAULTLIB")
2271 set_target_properties(hidapi PROPERTIES STATIC_LIBRARY_FLAGS "/NODEFAULTLIB")
2274 target_link_libraries(hidapi log)
2279 set (BUILD_SHARED_LIBS FALSE)
2280 add_library(SDL2-static STATIC ${SOURCE_FILES})
2281 if (NOT SDL_SHARED OR NOT WIN32)
2282 set_target_properties(SDL2-static PROPERTIES OUTPUT_NAME "SDL2")
2283 # Note: Apparently, OUTPUT_NAME must really be unique; even when
2284 # CMAKE_IMPORT_LIBRARY_SUFFIX or the like are given. Otherwise
2285 # the static build may race with the import lib and one will get
2286 # clobbered, when the suffix is realized via subsequent rename.
2288 set_target_properties(SDL2-static PROPERTIES POSITION_INDEPENDENT_CODE ${SDL_STATIC_PIC})
2289 if(MSVC AND NOT LIBC)
2290 set_target_properties(SDL2-static PROPERTIES LINK_FLAGS_RELEASE "/NODEFAULTLIB")
2291 set_target_properties(SDL2-static PROPERTIES LINK_FLAGS_DEBUG "/NODEFAULTLIB")
2292 set_target_properties(SDL2-static PROPERTIES STATIC_LIBRARY_FLAGS "/NODEFAULTLIB")
2294 # TODO: Win32 platforms keep the same suffix .lib for import and static
2295 # libraries - do we need to consider this?
2296 set(_INSTALL_LIBS "SDL2-static" ${_INSTALL_LIBS})
2297 target_link_libraries(SDL2-static ${EXTRA_LIBS} ${EXTRA_LDFLAGS})
2298 target_include_directories(SDL2-static PUBLIC "$<BUILD_INTERFACE:${SDL2_SOURCE_DIR}/include>" $<INSTALL_INTERFACE:include> $<INSTALL_INTERFACE:include/SDL2>)
2300 target_include_directories(SDL2-static PRIVATE ${ANDROID_NDK}/sources/android/cpufeatures)
2302 set_target_properties(SDL2-static PROPERTIES DEBUG_POSTFIX "${SDL_CMAKE_DEBUG_POSTFIX}")
2305 set_property(TARGET SDL2-static APPEND_STRING PROPERTY COMPILE_FLAGS "-fobjc-arc")
2312 file(GLOB TEST_SOURCES ${SDL2_SOURCE_DIR}/src/test/*.c)
2313 add_library(SDL2_test STATIC ${TEST_SOURCES})
2315 add_subdirectory(test)
2318 ##### Installation targets #####
2319 install(TARGETS ${_INSTALL_LIBS} EXPORT SDL2Targets
2320 LIBRARY DESTINATION "lib${LIB_SUFFIX}"
2321 ARCHIVE DESTINATION "lib${LIB_SUFFIX}"
2322 RUNTIME DESTINATION bin)
2324 ##### Export files #####
2326 set(PKG_PREFIX "cmake")
2328 set(PKG_PREFIX "lib${LIB_SUFFIX}/cmake/SDL2")
2331 include(CMakePackageConfigHelpers)
2332 write_basic_package_version_file("${CMAKE_BINARY_DIR}/SDL2ConfigVersion.cmake"
2333 VERSION ${SDL_VERSION}
2334 COMPATIBILITY AnyNewerVersion
2337 install(EXPORT SDL2Targets
2338 FILE SDL2Targets.cmake
2340 DESTINATION ${PKG_PREFIX}
2344 ${CMAKE_CURRENT_SOURCE_DIR}/SDL2Config.cmake
2345 ${CMAKE_BINARY_DIR}/SDL2ConfigVersion.cmake
2346 DESTINATION ${PKG_PREFIX}
2350 file(GLOB INCLUDE_FILES ${SDL2_SOURCE_DIR}/include/*.h)
2351 file(GLOB BIN_INCLUDE_FILES ${SDL2_BINARY_DIR}/include/*.h)
2352 foreach(_FNAME ${BIN_INCLUDE_FILES})
2353 get_filename_component(_INCNAME ${_FNAME} NAME)
2354 list(REMOVE_ITEM INCLUDE_FILES ${SDL2_SOURCE_DIR}/include/${_INCNAME})
2356 list(APPEND INCLUDE_FILES ${BIN_INCLUDE_FILES})
2357 install(FILES ${INCLUDE_FILES} DESTINATION include/SDL2)
2359 string(TOUPPER "${CMAKE_BUILD_TYPE}" UPPER_BUILD_TYPE)
2360 if (UPPER_BUILD_TYPE MATCHES DEBUG)
2361 set(SOPOSTFIX "${SDL_CMAKE_DEBUG_POSTFIX}")
2366 if(NOT (WINDOWS OR CYGWIN))
2368 set(SOEXT ${CMAKE_SHARED_LIBRARY_SUFFIX}) # ".so", ".dylib", etc.
2369 get_target_property(SONAME SDL2 OUTPUT_NAME)
2372 execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink
2373 \"lib${SONAME}${SOPOSTFIX}${SOEXT}\" \"libSDL2${SOPOSTFIX}${SOEXT}\"
2374 WORKING_DIRECTORY \"${SDL2_BINARY_DIR}\")")
2375 install(FILES ${SDL2_BINARY_DIR}/libSDL2${SOPOSTFIX}${SOEXT} DESTINATION "lib${LIB_SUFFIX}")
2379 # FreeBSD uses ${PREFIX}/libdata/pkgconfig
2380 install(FILES ${SDL2_BINARY_DIR}/sdl2.pc DESTINATION "libdata/pkgconfig")
2382 install(FILES ${SDL2_BINARY_DIR}/sdl2.pc
2383 DESTINATION "lib${LIB_SUFFIX}/pkgconfig")
2385 install(PROGRAMS ${SDL2_BINARY_DIR}/sdl2-config DESTINATION bin)
2386 # TODO: what about the .spec file? Is it only needed for RPM creation?
2387 install(FILES "${SDL2_SOURCE_DIR}/sdl2.m4" DESTINATION "${CMAKE_INSTALL_FULL_DATAROOTDIR}/aclocal")
2390 ##### Uninstall target #####
2392 if(NOT TARGET uninstall)
2394 "${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake.in"
2395 "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
2398 add_custom_target(uninstall
2399 COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake)