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 2.8.11)
8 # !!! FIXME: this should probably do "MACOSX_RPATH ON" as a target property
9 # !!! FIXME: for the SDL2 shared library (so you get an
10 # !!! FIXME: install_name ("soname") of "@rpath/libSDL-whatever.dylib"
11 # !!! FIXME: instead of "/usr/local/lib/libSDL-whatever.dylib"), but I'm
12 # !!! FIXME: punting for now and leaving the existing behavior. Until this
13 # !!! FIXME: properly resolved, this line silences a warning in CMake 3.0+.
14 # !!! FIXME: remove it and this comment entirely once the problem is
15 # !!! FIXME: properly resolved.
16 #cmake_policy(SET CMP0042 OLD)
18 include(CheckFunctionExists)
19 include(CheckLibraryExists)
20 include(CheckIncludeFiles)
21 include(CheckIncludeFile)
22 include(CheckSymbolExists)
23 include(CheckCSourceCompiles)
24 include(CheckCSourceRuns)
25 include(CheckCCompilerFlag)
26 include(CheckTypeSize)
27 include(CheckStructHasMember)
28 include(CMakeDependentOption)
29 include(FindPkgConfig)
30 include(GNUInstallDirs)
31 set(CMAKE_MODULE_PATH "${SDL2_SOURCE_DIR}/cmake")
32 include(${SDL2_SOURCE_DIR}/cmake/macros.cmake)
33 include(${SDL2_SOURCE_DIR}/cmake/sdlchecks.cmake)
36 # Edit include/SDL_version.h and change the version, then:
37 # SDL_MICRO_VERSION += 1;
38 # SDL_INTERFACE_AGE += 1;
39 # SDL_BINARY_AGE += 1;
40 # if any functions have been added, set SDL_INTERFACE_AGE to 0.
41 # if backwards compatibility has been broken,
42 # set SDL_BINARY_AGE and SDL_INTERFACE_AGE to 0.
43 set(SDL_MAJOR_VERSION 2)
44 set(SDL_MINOR_VERSION 0)
45 set(SDL_MICRO_VERSION 9)
46 set(SDL_INTERFACE_AGE 0)
48 set(SDL_VERSION "${SDL_MAJOR_VERSION}.${SDL_MINOR_VERSION}.${SDL_MICRO_VERSION}")
49 # the following should match the versions in Xcode project file:
50 set(DYLIB_CURRENT_VERSION 10.0.0)
51 set(DYLIB_COMPATIBILITY_VERSION 1.0.0)
53 # Set defaults preventing destination file conflicts
54 set(SDL_CMAKE_DEBUG_POSTFIX "d"
55 CACHE STRING "Name suffix for debug builds")
57 mark_as_advanced(CMAKE_IMPORT_LIBRARY_SUFFIX SDL_CMAKE_DEBUG_POSTFIX)
59 # Calculate a libtool-like version number
60 math(EXPR LT_CURRENT "${SDL_MICRO_VERSION} - ${SDL_INTERFACE_AGE}")
61 math(EXPR LT_AGE "${SDL_BINARY_AGE} - ${SDL_INTERFACE_AGE}")
62 math(EXPR LT_MAJOR "${LT_CURRENT}- ${LT_AGE}")
63 set(LT_REVISION "${SDL_INTERFACE_AGE}")
64 set(LT_RELEASE "${SDL_MAJOR_VERSION}.${SDL_MINOR_VERSION}")
65 set(LT_VERSION "${LT_MAJOR}.${LT_AGE}.${LT_REVISION}")
67 #message(STATUS "${LT_VERSION} :: ${LT_AGE} :: ${LT_REVISION} :: ${LT_CURRENT} :: ${LT_RELEASE}")
69 # General settings & flags
70 set(LIBRARY_OUTPUT_DIRECTORY "build")
71 # Check for 64 or 32 bit
72 set(SIZEOF_VOIDP ${CMAKE_SIZEOF_VOID_P})
73 if(CMAKE_SIZEOF_VOID_P EQUAL 8)
75 set(PROCESSOR_ARCH "x64")
78 set(PROCESSOR_ARCH "x86")
90 elseif(UNIX AND NOT APPLE)
91 if(CMAKE_SYSTEM_NAME MATCHES ".*Linux")
93 elseif(CMAKE_SYSTEM_NAME MATCHES "kFreeBSD.*")
95 elseif(CMAKE_SYSTEM_NAME MATCHES "kNetBSD.*|NetBSD.*")
97 elseif(CMAKE_SYSTEM_NAME MATCHES "kOpenBSD.*|OpenBSD.*")
99 elseif(CMAKE_SYSTEM_NAME MATCHES ".*GNU.*")
101 elseif(CMAKE_SYSTEM_NAME MATCHES ".*BSDI.*")
103 elseif(CMAKE_SYSTEM_NAME MATCHES "DragonFly.*|FreeBSD")
105 elseif(CMAKE_SYSTEM_NAME MATCHES "SYSV5.*")
107 elseif(CMAKE_SYSTEM_NAME MATCHES "Solaris.*")
109 elseif(CMAKE_SYSTEM_NAME MATCHES "HP-UX.*")
111 elseif(CMAKE_SYSTEM_NAME MATCHES "AIX.*")
113 elseif(CMAKE_SYSTEM_NAME MATCHES "Minix.*")
117 if(CMAKE_SYSTEM_NAME MATCHES ".*Darwin.*")
119 elseif(CMAKE_SYSTEM_NAME MATCHES ".*MacOS.*")
123 elseif(CMAKE_SYSTEM_NAME MATCHES "BeOS.*")
124 message_error("BeOS support has been removed as of SDL 2.0.2.")
125 elseif(CMAKE_SYSTEM_NAME MATCHES "Haiku.*")
129 # Don't mistake osx for unix
130 if(UNIX AND NOT APPLE)
137 set(UNIX_OR_MAC_SYS ON)
139 set(UNIX_OR_MAC_SYS OFF)
142 if (UNIX_OR_MAC_SYS AND NOT EMSCRIPTEN) # JavaScript does not yet have threading support, so disable pthreads when building for Emscripten.
143 set(SDL_PTHREADS_ENABLED_BY_DEFAULT ON)
145 set(SDL_PTHREADS_ENABLED_BY_DEFAULT OFF)
148 # Default option knobs
150 if(NOT "${CMAKE_OSX_ARCHITECTURES}" MATCHES "arm")
151 set(OPT_DEF_SSEMATH ON)
154 if(UNIX OR MINGW OR MSYS)
159 if(CMAKE_COMPILER_IS_GNUCC)
161 set(OPT_DEF_ASM TRUE)
162 elseif(CMAKE_C_COMPILER_ID MATCHES "Clang")
164 set(OPT_DEF_ASM TRUE)
165 elseif(MSVC_VERSION GREATER 1400) # VisualStudio 8.0+
166 set(OPT_DEF_ASM TRUE)
167 #set(CMAKE_C_FLAGS "/ZI /WX- /
169 set(OPT_DEF_ASM FALSE)
172 if(USE_GCC OR USE_CLANG)
173 set(OPT_DEF_GCC_ATOMICS ON)
176 # Default flags, if not set otherwise
177 if("$ENV{CFLAGS}" STREQUAL "")
178 if(CMAKE_BUILD_TYPE STREQUAL "")
179 if(USE_GCC OR USE_CLANG)
180 set(CMAKE_C_FLAGS "-g -O3")
184 set(CMAKE_C_FLAGS "$ENV{CFLAGS}")
185 list(APPEND EXTRA_CFLAGS "$ENV{CFLAGS}")
187 if(NOT ("$ENV{CFLAGS}" STREQUAL "")) # Hackish, but does the trick on Win32
188 list(APPEND EXTRA_LDFLAGS "$ENV{LDFLAGS}")
192 option(FORCE_STATIC_VCRT "Force /MT for static VC runtimes" OFF)
193 if(FORCE_STATIC_VCRT)
195 CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE
196 CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO)
197 if(${flag_var} MATCHES "/MD")
198 string(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}")
203 # Make sure /RTC1 is disabled, otherwise it will use functions from the CRT
205 CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE
206 CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO)
207 string(REGEX REPLACE "/RTC(su|[1su])" "" ${flag_var} "${${flag_var}}")
211 # Those are used for pkg-config and friends, so that the SDL2.pc, sdl2-config,
212 # etc. are created correctly.
213 set(SDL_LIBS "-lSDL2")
216 # When building shared lib for Windows with MinGW,
217 # avoid the DLL having a "lib" prefix
219 set(CMAKE_SHARED_LIBRARY_PREFIX "")
222 # Emscripten toolchain has a nonempty default value for this, and the checks
223 # in this file need to change that, so remember the original value, and
224 # restore back to that afterwards. For check_function_exists() to work in
225 # Emscripten, this value must be at its default value.
226 set(ORIG_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
229 # We build SDL on cygwin without the UNIX emulation layer
230 include_directories("-I/usr/include/mingw")
231 set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -mno-cygwin")
232 check_c_source_compiles("int main(int argc, char **argv) {}"
234 set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS})
235 if(HAVE_GCC_NO_CYGWIN)
236 list(APPEND EXTRA_LDFLAGS "-mno-cygwin")
237 list(APPEND SDL_LIBS "-mno-cygwin")
239 set(SDL_CFLAGS "${SDL_CFLAGS} -I/usr/include/mingw")
242 add_definitions(-DUSING_GENERATED_CONFIG_H)
244 include_directories(${SDL2_BINARY_DIR}/include ${SDL2_SOURCE_DIR}/include)
245 if(USE_GCC OR USE_CLANG)
246 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -idirafter ${SDL2_SOURCE_DIR}/src/video/khronos")
248 include_directories(${SDL2_SOURCE_DIR}/src/video/khronos)
251 # All these ENABLED_BY_DEFAULT vars will default to ON if not specified, so
252 # you only need to have a platform override them if they are disabling.
253 set(OPT_DEF_ASM TRUE)
255 # Set up default values for the currently supported set of subsystems:
256 # Emscripten/Javascript does not have assembly support, a dynamic library
257 # loading architecture, low-level CPU inspection or multithreading.
258 set(OPT_DEF_ASM FALSE)
259 set(SDL_SHARED_ENABLED_BY_DEFAULT OFF)
260 set(SDL_ATOMIC_ENABLED_BY_DEFAULT OFF)
261 set(SDL_THREADS_ENABLED_BY_DEFAULT OFF)
262 set(SDL_LOADSO_ENABLED_BY_DEFAULT OFF)
263 set(SDL_CPUINFO_ENABLED_BY_DEFAULT OFF)
264 set(SDL_DLOPEN_ENABLED_BY_DEFAULT OFF)
267 # When defined, respect CMake's BUILD_SHARED_LIBS setting:
268 set(SDL_STATIC_ENABLED_BY_DEFAULT ON)
269 if (NOT DEFINED SDL_SHARED_ENABLED_BY_DEFAULT)
270 # ...unless decided already (as for EMSCRIPTEN)
272 set(SDL_SHARED_ENABLED_BY_DEFAULT OFF)
274 if (NOT DEFINED BUILD_SHARED_LIBS)
275 # No preference? Build both, just like the AC/AM configure
276 set(SDL_SHARED_ENABLED_BY_DEFAULT ON)
278 elseif (BUILD_SHARED_LIBS)
279 # In this case, we assume the user wants a shared lib and don't build
281 set(SDL_SHARED_ENABLED_BY_DEFAULT ON)
282 set(SDL_STATIC_ENABLED_BY_DEFAULT OFF)
287 Atomic Audio Video Render Events Joystick Haptic Power Threads Timers
288 File Loadso CPUinfo Filesystem Dlopen Sensor)
289 foreach(_SUB ${SDL_SUBSYSTEMS})
290 string(TOUPPER ${_SUB} _OPT)
291 if (NOT DEFINED SDL_${_OPT}_ENABLED_BY_DEFAULT)
292 set(SDL_${_OPT}_ENABLED_BY_DEFAULT ON)
294 option(SDL_${_OPT} "Enable the ${_SUB} subsystem" ${SDL_${_OPT}_ENABLED_BY_DEFAULT})
297 option_string(ASSERTIONS "Enable internal sanity checks (auto/disabled/release/enabled/paranoid)" "auto")
298 #set_option(DEPENDENCY_TRACKING "Use gcc -MMD -MT dependency tracking" ON)
299 set_option(LIBC "Use the system C library" ${OPT_DEF_LIBC})
300 set_option(GCC_ATOMICS "Use gcc builtin atomics" ${OPT_DEF_GCC_ATOMICS})
301 set_option(ASSEMBLY "Enable assembly routines" ${OPT_DEF_ASM})
302 set_option(SSEMATH "Allow GCC to use SSE floating point math" ${OPT_DEF_SSEMATH})
303 set_option(MMX "Use MMX assembly routines" ${OPT_DEF_ASM})
304 set_option(3DNOW "Use 3Dnow! MMX assembly routines" ${OPT_DEF_ASM})
305 set_option(SSE "Use SSE assembly routines" ${OPT_DEF_ASM})
306 set_option(SSE2 "Use SSE2 assembly routines" ${OPT_DEF_SSEMATH})
307 set_option(SSE3 "Use SSE3 assembly routines" ${OPT_DEF_SSEMATH})
308 set_option(ALTIVEC "Use Altivec assembly routines" ${OPT_DEF_ASM})
309 set_option(DISKAUDIO "Support the disk writer audio driver" ON)
310 set_option(DUMMYAUDIO "Support the dummy audio driver" ON)
311 set_option(VIDEO_DIRECTFB "Use DirectFB video driver" OFF)
312 dep_option(DIRECTFB_SHARED "Dynamically load directfb support" ON "VIDEO_DIRECTFB" OFF)
313 set_option(VIDEO_DUMMY "Use dummy video driver" ON)
314 set_option(VIDEO_OPENGL "Include OpenGL support" ON)
315 set_option(VIDEO_OPENGLES "Include OpenGL ES support" ON)
316 set_option(PTHREADS "Use POSIX threads for multi-threading" ${SDL_PTHREADS_ENABLED_BY_DEFAULT})
317 dep_option(PTHREADS_SEM "Use pthread semaphores" ON "PTHREADS" OFF)
318 set_option(SDL_DLOPEN "Use dlopen for shared object loading" ${SDL_DLOPEN_ENABLED_BY_DEFAULT})
319 set_option(OSS "Support the OSS audio API" ${UNIX_SYS})
320 set_option(ALSA "Support the ALSA audio API" ${UNIX_SYS})
321 dep_option(ALSA_SHARED "Dynamically load ALSA audio support" ON "ALSA" OFF)
322 set_option(JACK "Support the JACK audio API" ${UNIX_SYS})
323 dep_option(JACK_SHARED "Dynamically load JACK audio support" ON "JACK" OFF)
324 set_option(ESD "Support the Enlightened Sound Daemon" ${UNIX_SYS})
325 dep_option(ESD_SHARED "Dynamically load ESD audio support" ON "ESD" OFF)
326 set_option(PULSEAUDIO "Use PulseAudio" ${UNIX_SYS})
327 dep_option(PULSEAUDIO_SHARED "Dynamically load PulseAudio support" ON "PULSEAUDIO" OFF)
328 set_option(ARTS "Support the Analog Real Time Synthesizer" ${UNIX_SYS})
329 dep_option(ARTS_SHARED "Dynamically load aRts audio support" ON "ARTS" OFF)
330 set_option(NAS "Support the NAS audio API" ${UNIX_SYS})
331 set_option(NAS_SHARED "Dynamically load NAS audio API" ${UNIX_SYS})
332 set_option(SNDIO "Support the sndio audio API" ${UNIX_SYS})
333 set_option(FUSIONSOUND "Use FusionSound audio driver" OFF)
334 dep_option(FUSIONSOUND_SHARED "Dynamically load fusionsound audio support" ON "FUSIONSOUND" OFF)
335 set_option(LIBSAMPLERATE "Use libsamplerate for audio rate conversion" ${UNIX_SYS})
336 dep_option(LIBSAMPLERATE_SHARED "Dynamically load libsamplerate" ON "LIBSAMPLERATE" OFF)
337 set_option(RPATH "Use an rpath when linking SDL" ${UNIX_SYS})
338 set_option(CLOCK_GETTIME "Use clock_gettime() instead of gettimeofday()" OFF)
339 set_option(INPUT_TSLIB "Use the Touchscreen library for input" ${UNIX_SYS})
340 set_option(VIDEO_X11 "Use X11 video driver" ${UNIX_SYS})
341 set_option(VIDEO_WAYLAND "Use Wayland video driver" ${UNIX_SYS})
342 dep_option(WAYLAND_SHARED "Dynamically load Wayland support" ON "VIDEO_WAYLAND" OFF)
343 dep_option(VIDEO_WAYLAND_QT_TOUCH "QtWayland server support for Wayland video driver" ON "VIDEO_WAYLAND" OFF)
344 set_option(VIDEO_RPI "Use Raspberry Pi video driver" ${UNIX_SYS})
345 dep_option(X11_SHARED "Dynamically load X11 support" ON "VIDEO_X11" OFF)
346 set(SDL_X11_OPTIONS Xcursor Xinerama XInput Xrandr Xscrnsaver XShape Xvm)
347 foreach(_SUB ${SDL_X11_OPTIONS})
348 string(TOUPPER "VIDEO_X11_${_SUB}" _OPT)
349 dep_option(${_OPT} "Enable ${_SUB} support" ON "VIDEO_X11" OFF)
351 set_option(VIDEO_COCOA "Use Cocoa video driver" ${APPLE})
352 set_option(DIRECTX "Use DirectX for Windows audio/video" ${WINDOWS})
353 set_option(WASAPI "Use the Windows WASAPI audio driver" ${WINDOWS})
354 set_option(RENDER_D3D "Enable the Direct3D render driver" ${WINDOWS})
355 set_option(VIDEO_VIVANTE "Use Vivante EGL video driver" ${UNIX_SYS})
356 dep_option(VIDEO_VULKAN "Enable Vulkan support" ON "ANDROID OR APPLE OR LINUX OR WINDOWS" OFF)
357 set_option(VIDEO_KMSDRM "Use KMS DRM video driver" ${UNIX_SYS})
358 dep_option(KMSDRM_SHARED "Dynamically load KMS DRM support" ON "VIDEO_KMSDRM" OFF)
359 option_string(BACKGROUNDING_SIGNAL "number to use for magic backgrounding signal or 'OFF'" "OFF")
360 option_string(FOREGROUNDING_SIGNAL "number to use for magic foregrounding signal or 'OFF'" "OFF")
362 set(SDL_SHARED ${SDL_SHARED_ENABLED_BY_DEFAULT} CACHE BOOL "Build a shared version of the library")
363 set(SDL_STATIC ${SDL_STATIC_ENABLED_BY_DEFAULT} CACHE BOOL "Build a static version of the library")
365 dep_option(SDL_STATIC_PIC "Static version of the library should be built with Position Independent Code" OFF "SDL_STATIC" OFF)
366 set_option(SDL_TEST "Build the test directory" OFF)
368 # General source files
369 file(GLOB SOURCE_FILES
370 ${SDL2_SOURCE_DIR}/src/*.c
371 ${SDL2_SOURCE_DIR}/src/atomic/*.c
372 ${SDL2_SOURCE_DIR}/src/audio/*.c
373 ${SDL2_SOURCE_DIR}/src/cpuinfo/*.c
374 ${SDL2_SOURCE_DIR}/src/dynapi/*.c
375 ${SDL2_SOURCE_DIR}/src/events/*.c
376 ${SDL2_SOURCE_DIR}/src/file/*.c
377 ${SDL2_SOURCE_DIR}/src/libm/*.c
378 ${SDL2_SOURCE_DIR}/src/render/*.c
379 ${SDL2_SOURCE_DIR}/src/render/*/*.c
380 ${SDL2_SOURCE_DIR}/src/stdlib/*.c
381 ${SDL2_SOURCE_DIR}/src/thread/*.c
382 ${SDL2_SOURCE_DIR}/src/timer/*.c
383 ${SDL2_SOURCE_DIR}/src/video/*.c
384 ${SDL2_SOURCE_DIR}/src/video/yuv2rgb/*.c)
387 if(ASSERTIONS STREQUAL "auto")
388 # Do nada - use optimization settings to determine the assertion level
389 elseif(ASSERTIONS STREQUAL "disabled")
390 set(SDL_DEFAULT_ASSERT_LEVEL 0)
391 elseif(ASSERTIONS STREQUAL "release")
392 set(SDL_DEFAULT_ASSERT_LEVEL 1)
393 elseif(ASSERTIONS STREQUAL "enabled")
394 set(SDL_DEFAULT_ASSERT_LEVEL 2)
395 elseif(ASSERTIONS STREQUAL "paranoid")
396 set(SDL_DEFAULT_ASSERT_LEVEL 3)
398 message_error("unknown assertion level")
400 set(HAVE_ASSERTIONS ${ASSERTIONS})
402 if(NOT BACKGROUNDING_SIGNAL STREQUAL "OFF")
403 add_definitions("-DSDL_BACKGROUNDING_SIGNAL=${BACKGROUNDING_SIGNAL}")
406 if(NOT FOREGROUNDING_SIGNAL STREQUAL "OFF")
407 add_definitions("-DSDL_FOREGROUNDING_SIGNAL=${FOREGROUNDING_SIGNAL}")
410 # Compiler option evaluation
411 if(USE_GCC OR USE_CLANG)
412 # Check for -Wall first, so later things can override pieces of it.
413 check_c_compiler_flag(-Wall HAVE_GCC_WALL)
415 list(APPEND EXTRA_CFLAGS "-Wall")
417 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-multichar")
421 check_c_compiler_flag(-Wdeclaration-after-statement HAVE_GCC_WDECLARATION_AFTER_STATEMENT)
422 if(HAVE_GCC_WDECLARATION_AFTER_STATEMENT)
423 check_c_compiler_flag(-Werror=declaration-after-statement HAVE_GCC_WERROR_DECLARATION_AFTER_STATEMENT)
424 if(HAVE_GCC_WERROR_DECLARATION_AFTER_STATEMENT)
425 list(APPEND EXTRA_CFLAGS "-Werror=declaration-after-statement")
427 list(APPEND EXTRA_CFLAGS "-Wdeclaration-after-statement")
430 if(DEPENDENCY_TRACKING)
431 check_c_source_compiles("
432 #if !defined(__GNUC__) || __GNUC__ < 3
433 #error Dependency tracking requires GCC 3.0 or newer
435 int main(int argc, char **argv) { }" HAVE_DEPENDENCY_TRACKING)
439 check_c_source_compiles("int main(int argc, char **argv) {
442 __sync_lock_test_and_set(&a, 4);
443 __sync_lock_test_and_set(&x, y);
444 __sync_fetch_and_add(&a, 1);
445 __sync_bool_compare_and_swap(&a, 5, 10);
446 __sync_bool_compare_and_swap(&x, y, z); }" HAVE_GCC_ATOMICS)
447 if(NOT HAVE_GCC_ATOMICS)
448 check_c_source_compiles("int main(int argc, char **argv) {
450 __sync_lock_test_and_set(&a, 1);
451 __sync_lock_release(&a); }" HAVE_GCC_SYNC_LOCK_TEST_AND_SET)
455 set(CMAKE_REQUIRED_FLAGS "-mpreferred-stack-boundary=2")
456 check_c_source_compiles("int x = 0; int main(int argc, char **argv) {}"
457 HAVE_GCC_PREFERRED_STACK_BOUNDARY)
458 set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS})
460 set(CMAKE_REQUIRED_FLAGS "-fvisibility=hidden -Werror")
461 check_c_source_compiles("
462 #if !defined(__GNUC__) || __GNUC__ < 4
463 #error SDL only uses visibility attributes in GCC 4 or newer
465 int main(int argc, char **argv) {}" HAVE_GCC_FVISIBILITY)
466 if(HAVE_GCC_FVISIBILITY)
467 list(APPEND EXTRA_CFLAGS "-fvisibility=hidden")
469 set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS})
471 check_c_compiler_flag(-Wshadow HAVE_GCC_WSHADOW)
473 list(APPEND EXTRA_CFLAGS "-Wshadow")
477 list(APPEND EXTRA_LDFLAGS "-Wl,-undefined,error")
478 list(APPEND EXTRA_LDFLAGS "-Wl,-compatibility_version,${DYLIB_COMPATIBILITY_VERSION}")
479 list(APPEND EXTRA_LDFLAGS "-Wl,-current_version,${DYLIB_CURRENT_VERSION}")
481 set(CMAKE_REQUIRED_FLAGS "-Wl,--no-undefined")
482 check_c_compiler_flag("" HAVE_NO_UNDEFINED)
483 set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS})
484 if(HAVE_NO_UNDEFINED)
485 list(APPEND EXTRA_LDFLAGS "-Wl,--no-undefined")
491 if(USE_GCC OR USE_CLANG)
492 set(SDL_ASSEMBLY_ROUTINES 1)
493 # TODO: Those all seem to be quite GCC specific - needs to be
494 # reworked for better compiler support
495 set(HAVE_ASSEMBLY TRUE)
497 set(CMAKE_REQUIRED_FLAGS "-mmmx")
498 check_c_source_compiles("
501 #ifdef __MINGW64_VERSION_MAJOR
504 #include <mmintrin.h>
507 #include <mmintrin.h>
510 #error Assembler CPP flag not enabled
512 int main(int argc, char **argv) { }" HAVE_MMX)
514 list(APPEND EXTRA_CFLAGS "-mmmx")
516 set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS})
520 set(CMAKE_REQUIRED_FLAGS "-m3dnow")
521 check_c_source_compiles("
524 #error Assembler CPP flag not enabled
526 int main(int argc, char **argv) {
531 list(APPEND EXTRA_CFLAGS "-m3dnow")
533 set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS})
537 set(CMAKE_REQUIRED_FLAGS "-msse")
538 check_c_source_compiles("
541 #ifdef __MINGW64_VERSION_MAJOR
544 #include <xmmintrin.h>
547 #include <xmmintrin.h>
550 #error Assembler CPP flag not enabled
552 int main(int argc, char **argv) { }" HAVE_SSE)
554 list(APPEND EXTRA_CFLAGS "-msse")
556 set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS})
560 set(CMAKE_REQUIRED_FLAGS "-msse2")
561 check_c_source_compiles("
564 #ifdef __MINGW64_VERSION_MAJOR
567 #include <emmintrin.h>
570 #include <emmintrin.h>
573 #error Assembler CPP flag not enabled
575 int main(int argc, char **argv) { }" HAVE_SSE2)
577 list(APPEND EXTRA_CFLAGS "-msse2")
579 set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS})
583 set(CMAKE_REQUIRED_FLAGS "-msse3")
584 check_c_source_compiles("
587 #ifdef __MINGW64_VERSION_MAJOR
590 #include <pmmintrin.h>
593 #include <pmmintrin.h>
596 #error Assembler CPP flag not enabled
598 int main(int argc, char **argv) { }" HAVE_SSE3)
600 list(APPEND EXTRA_CFLAGS "-msse3")
602 set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS})
606 if(SSE OR SSE2 OR SSE3)
608 check_c_compiler_flag(-mfpmath=387 HAVE_FP_387)
610 list(APPEND EXTRA_CFLAGS "-mfpmath=387")
613 set(HAVE_SSEMATH TRUE)
617 check_include_file("immintrin.h" HAVE_IMMINTRIN_H)
620 set(CMAKE_REQUIRED_FLAGS "-maltivec")
621 check_c_source_compiles("
623 vector unsigned int vzero() {
624 return vec_splat_u32(0);
626 int main(int argc, char **argv) { }" HAVE_ALTIVEC_H_HDR)
627 check_c_source_compiles("
628 vector unsigned int vzero() {
629 return vec_splat_u32(0);
631 int main(int argc, char **argv) { }" HAVE_ALTIVEC)
632 set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS})
633 if(HAVE_ALTIVEC OR HAVE_ALTIVEC_H_HDR)
634 set(HAVE_ALTIVEC TRUE) # if only HAVE_ALTIVEC_H_HDR is set
635 list(APPEND EXTRA_CFLAGS "-maltivec")
636 set(SDL_ALTIVEC_BLITTERS 1)
637 if(HAVE_ALTIVEC_H_HDR)
638 set(HAVE_ALTIVEC_H 1)
642 elseif(MSVC_VERSION GREATER 1500)
643 # TODO: SDL_cpuinfo.h needs to support the user's configuration wish
644 # for MSVC - right now it is always activated
652 set(SDL_ASSEMBLY_ROUTINES 1)
656 # if(USE_GCC OR USE_CLANG)
657 # list(APPEND EXTRA_CFLAGS "-mno-sse" "-mno-sse2" "-mno-sse3" "-mno-mmx")
661 # TODO: Can't deactivate on FreeBSD? w/o LIBC, SDL_stdinc.h can't define
664 if(WINDOWS AND NOT MINGW)
666 foreach(_HEADER stdio.h string.h wchar.h ctype.h math.h limits.h)
667 string(TOUPPER "HAVE_${_HEADER}" _UPPER)
668 string(REPLACE "." "_" _HAVE_H ${_UPPER})
673 malloc calloc realloc free qsort abs memset memcpy memmove memcmp
675 strlen _strrev _strupr _strlwr strchr strrchr strstr itoa _ltoa
676 _ultoa strtol strtoul strtoll strtod atoi atof strcmp strncmp
677 _stricmp _strnicmp sscanf
678 acos acosf asin asinf atan atanf atan2 atan2f ceil ceilf
679 copysign copysignf cos cosf exp expf fabs fabsf floor floorf fmod fmodf
680 log logf log10 log10f pow powf scalbn scalbnf sin sinf sqrt sqrtf tan tanf)
681 string(TOUPPER ${_FN} _UPPER)
682 set(HAVE_${_UPPER} 1)
684 if(NOT CYGWIN AND NOT MINGW)
688 add_definitions(-D_USE_MATH_DEFINES) # needed for M_PI
692 check_include_file(sys/types.h HAVE_SYS_TYPES_H)
694 stdio.h stdlib.h stddef.h stdarg.h malloc.h memory.h string.h limits.h
695 strings.h wchar.h inttypes.h stdint.h ctype.h math.h iconv.h signal.h libunwind.h)
696 string(TOUPPER "HAVE_${_HEADER}" _UPPER)
697 string(REPLACE "." "_" _HAVE_H ${_UPPER})
698 check_include_file("${_HEADER}" ${_HAVE_H})
701 check_include_files("dlfcn.h;stdint.h;stddef.h;inttypes.h;stdlib.h;strings.h;string.h;float.h" STDC_HEADERS)
702 check_type_size("size_t" SIZEOF_SIZE_T)
703 check_symbol_exists(M_PI math.h HAVE_M_PI)
704 # TODO: refine the mprotect check
705 check_c_source_compiles("#include <sys/types.h>
706 #include <sys/mman.h>
707 int main() { }" HAVE_MPROTECT)
709 strtod malloc calloc realloc free getenv setenv putenv unsetenv
710 qsort abs bcopy memset memcpy memmove memcmp strlen strlcpy strlcat
711 _strrev _strupr _strlwr strchr strrchr strstr itoa _ltoa
712 _uitoa _ultoa strtol strtoul _i64toa _ui64toa strtoll strtoull
713 atoi atof strcmp strncmp _stricmp strcasecmp _strnicmp strncasecmp
714 vsscanf vsnprintf fopen64 fseeko fseeko64 sigaction setjmp
715 nanosleep sysconf sysctlbyname getauxval poll _Exit
717 string(TOUPPER ${_FN} _UPPER)
718 set(_HAVEVAR "HAVE_${_UPPER}")
719 check_function_exists("${_FN}" ${_HAVEVAR})
722 check_library_exists(m pow "" HAVE_LIBM)
724 set(CMAKE_REQUIRED_LIBRARIES m)
726 atan atan2 ceil copysign cos cosf fabs floor log pow scalbn sin
727 sinf sqrt sqrtf tan tanf acos asin)
728 string(TOUPPER ${_FN} _UPPER)
729 set(_HAVEVAR "HAVE_${_UPPER}")
730 check_function_exists("${_FN}" ${_HAVEVAR})
732 set(CMAKE_REQUIRED_LIBRARIES)
733 list(APPEND EXTRA_LIBS m)
736 check_library_exists(iconv iconv_open "" HAVE_LIBICONV)
738 list(APPEND EXTRA_LIBS iconv)
743 check_include_file(alloca.h HAVE_ALLOCA_H)
744 check_function_exists(alloca HAVE_ALLOCA)
750 check_struct_has_member("struct sigaction" "sa_sigaction" "signal.h" HAVE_SA_SIGACTION)
760 # Enable/disable various subsystems of the SDL library
761 foreach(_SUB ${SDL_SUBSYSTEMS})
762 string(TOUPPER ${_SUB} _OPT)
764 set(SDL_${_OPT}_DISABLED 1)
768 file(GLOB JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/*.c)
769 set(SOURCE_FILES ${SOURCE_FILES} ${JOYSTICK_SOURCES})
773 # Haptic requires some private functions from the joystick subsystem.
774 message_error("SDL_HAPTIC requires SDL_JOYSTICK, which is not enabled")
776 file(GLOB HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/*.c)
777 set(SOURCE_FILES ${SOURCE_FILES} ${HAPTIC_SOURCES})
780 file(GLOB SENSOR_SOURCES ${SDL2_SOURCE_DIR}/src/sensor/*.c)
781 set(SOURCE_FILES ${SOURCE_FILES} ${SENSOR_SOURCES})
784 file(GLOB POWER_SOURCES ${SDL2_SOURCE_DIR}/src/power/*.c)
785 set(SOURCE_FILES ${SOURCE_FILES} ${POWER_SOURCES})
787 # TODO: in configure.ac, the test for LOADSO and SDL_DLOPEN is a bit weird:
788 # if LOADSO is not wanted, SDL_LOADSO_DISABLED is set
789 # If however on Unix or APPLE dlopen() is detected via CheckDLOPEN(),
790 # SDL_LOADSO_DISABLED will not be set, regardless of the LOADSO settings
792 # General SDL subsystem options, valid for all platforms
794 # CheckDummyAudio/CheckDiskAudio - valid for all platforms
796 set(SDL_AUDIO_DRIVER_DUMMY 1)
797 file(GLOB DUMMYAUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/dummy/*.c)
798 set(SOURCE_FILES ${SOURCE_FILES} ${DUMMYAUDIO_SOURCES})
799 set(HAVE_DUMMYAUDIO TRUE)
802 set(SDL_AUDIO_DRIVER_DISK 1)
803 file(GLOB DISKAUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/disk/*.c)
804 set(SOURCE_FILES ${SOURCE_FILES} ${DISKAUDIO_SOURCES})
805 set(HAVE_DISKAUDIO TRUE)
810 # Relevant for Unix/Darwin only
818 set(SDL_VIDEO_DRIVER_DUMMY 1)
819 file(GLOB VIDEO_DUMMY_SOURCES ${SDL2_SOURCE_DIR}/src/video/dummy/*.c)
820 set(SOURCE_FILES ${SOURCE_FILES} ${VIDEO_DUMMY_SOURCES})
821 set(HAVE_VIDEO_DUMMY TRUE)
822 set(HAVE_SDL_VIDEO TRUE)
827 file(GLOB ANDROID_CORE_SOURCES ${SDL2_SOURCE_DIR}/src/core/android/*.c)
828 set(SOURCE_FILES ${SOURCE_FILES} ${ANDROID_CORE_SOURCES})
830 # SDL_spinlock.c Needs to be compiled in ARM mode.
831 # There seems to be no better way currently to set the ARM mode.
832 # see: https://issuetracker.google.com/issues/62264618
833 # Another option would be to set ARM mode to all compiled files
834 check_c_compiler_flag(-marm HAVE_ARM_MODE)
836 set_source_files_properties(${SDL2_SOURCE_DIR}/src/atomic/SDL_spinlock.c PROPERTIES COMPILE_FLAGS -marm)
839 file(GLOB ANDROID_MAIN_SOURCES ${SDL2_SOURCE_DIR}/src/main/android/*.c)
840 set(SDLMAIN_SOURCES ${SDLMAIN_SOURCES} ${ANDROID_MAIN_SOURCES})
843 set(SDL_AUDIO_DRIVER_ANDROID 1)
844 file(GLOB ANDROID_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/android/*.c)
845 set(SOURCE_FILES ${SOURCE_FILES} ${ANDROID_AUDIO_SOURCES})
846 set(HAVE_SDL_AUDIO TRUE)
849 set(SDL_FILESYSTEM_ANDROID 1)
850 file(GLOB ANDROID_FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/android/*.c)
851 set(SOURCE_FILES ${SOURCE_FILES} ${ANDROID_FILESYSTEM_SOURCES})
852 set(HAVE_SDL_FILESYSTEM TRUE)
855 set(SDL_HAPTIC_ANDROID 1)
856 file(GLOB ANDROID_HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/android/*.c)
857 set(SOURCE_FILES ${SOURCE_FILES} ${ANDROID_HAPTIC_SOURCES})
858 set(HAVE_SDL_HAPTIC TRUE)
861 set(SDL_JOYSTICK_ANDROID 1)
862 file(GLOB ANDROID_JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/android/*.c ${SDL2_SOURCE_DIR}/src/joystick/steam/*.c)
863 set(SOURCE_FILES ${SOURCE_FILES} ${ANDROID_JOYSTICK_SOURCES})
864 set(HAVE_SDL_JOYSTICK TRUE)
867 set(SDL_LOADSO_DLOPEN 1)
868 file(GLOB LOADSO_SOURCES ${SDL2_SOURCE_DIR}/src/loadso/dlopen/*.c)
869 set(SOURCE_FILES ${SOURCE_FILES} ${LOADSO_SOURCES})
870 set(HAVE_SDL_LOADSO TRUE)
873 set(SDL_POWER_ANDROID 1)
874 file(GLOB ANDROID_POWER_SOURCES ${SDL2_SOURCE_DIR}/src/power/android/*.c)
875 set(SOURCE_FILES ${SOURCE_FILES} ${ANDROID_POWER_SOURCES})
876 set(HAVE_SDL_POWER TRUE)
879 set(SDL_TIMER_UNIX 1)
880 file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/unix/*.c)
881 set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES})
882 set(HAVE_SDL_TIMERS TRUE)
885 set(SDL_SENSOR_ANDROID 1)
886 set(HAVE_SDL_SENSORS TRUE)
887 file(GLOB ANDROID_SENSOR_SOURCES ${SDL2_SOURCE_DIR}/src/sensor/android/*.c)
888 set(SOURCE_FILES ${SOURCE_FILES} ${ANDROID_SENSOR_SOURCES})
891 set(SDL_VIDEO_DRIVER_ANDROID 1)
892 file(GLOB ANDROID_VIDEO_SOURCES ${SDL2_SOURCE_DIR}/src/video/android/*.c)
893 set(SOURCE_FILES ${SOURCE_FILES} ${ANDROID_VIDEO_SOURCES})
894 set(HAVE_SDL_VIDEO TRUE)
897 find_library(ANDROID_DL_LIBRARY dl)
898 find_library(ANDROID_LOG_LIBRARY log)
899 find_library(ANDROID_LIBRARY_LIBRARY android)
900 list(APPEND EXTRA_LIBS ${ANDROID_DL_LIBRARY} ${ANDROID_LOG_LIBRARY} ${ANDROID_LIBRARY_LIBRARY})
901 add_definitions(-DGL_GLEXT_PROTOTYPES)
905 set(SDL_VIDEO_OPENGL_EGL 1)
906 set(HAVE_VIDEO_OPENGLES TRUE)
907 set(SDL_VIDEO_OPENGL_ES2 1)
908 set(SDL_VIDEO_RENDER_OGL_ES2 1)
910 find_library(OpenGLES1_LIBRARY GLESv1_CM)
911 find_library(OpenGLES2_LIBRARY GLESv2)
912 list(APPEND EXTRA_LIBS ${OpenGLES1_LIBRARY} ${OpenGLES2_LIBRARY})
915 CHECK_C_SOURCE_COMPILES("
916 #if defined(__ARM_ARCH) && __ARM_ARCH < 7
917 #error Vulkan doesn't work on this configuration
923 " VULKAN_PASSED_ANDROID_CHECKS)
924 if(NOT VULKAN_PASSED_ANDROID_CHECKS)
925 set(VIDEO_VULKAN OFF)
926 message(STATUS "Vulkan doesn't work on this configuration")
930 file(GLOB ANDROID_HIDAPI_SOURCES ${SDL2_SOURCE_DIR}/src/hidapi/android/*.cpp)
936 # Platform-specific options and settings
938 # Hide noisy warnings that intend to aid mostly during initial stages of porting a new
939 # project. Uncomment at will for verbose cross-compiling -I/../ path info.
940 add_definitions(-Wno-warn-absolute-paths)
942 set(SDL_AUDIO_DRIVER_EMSCRIPTEN 1)
943 file(GLOB EM_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/emscripten/*.c)
944 set(SOURCE_FILES ${SOURCE_FILES} ${EM_AUDIO_SOURCES})
945 set(HAVE_SDL_AUDIO TRUE)
948 set(SDL_FILESYSTEM_EMSCRIPTEN 1)
949 file(GLOB EM_FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/emscripten/*.c)
950 set(SOURCE_FILES ${SOURCE_FILES} ${EM_FILESYSTEM_SOURCES})
951 set(HAVE_SDL_FILESYSTEM TRUE)
954 set(SDL_JOYSTICK_EMSCRIPTEN 1)
955 file(GLOB EM_JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/emscripten/*.c)
956 set(SOURCE_FILES ${SOURCE_FILES} ${EM_JOYSTICK_SOURCES})
957 set(HAVE_SDL_JOYSTICK TRUE)
960 set(SDL_POWER_EMSCRIPTEN 1)
961 file(GLOB EM_POWER_SOURCES ${SDL2_SOURCE_DIR}/src/power/emscripten/*.c)
962 set(SOURCE_FILES ${SOURCE_FILES} ${EM_POWER_SOURCES})
963 set(HAVE_SDL_POWER TRUE)
966 set(SDL_TIMER_UNIX 1)
967 file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/unix/*.c)
968 set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES})
969 set(HAVE_SDL_TIMERS TRUE)
972 set(HAVE_CLOCK_GETTIME 1)
976 set(SDL_VIDEO_DRIVER_EMSCRIPTEN 1)
977 file(GLOB EM_VIDEO_SOURCES ${SDL2_SOURCE_DIR}/src/video/emscripten/*.c)
978 set(SOURCE_FILES ${SOURCE_FILES} ${EM_VIDEO_SOURCES})
979 set(HAVE_SDL_VIDEO TRUE)
983 set(SDL_VIDEO_OPENGL_EGL 1)
984 set(HAVE_VIDEO_OPENGLES TRUE)
985 set(SDL_VIDEO_OPENGL_ES2 1)
986 set(SDL_VIDEO_RENDER_OGL_ES2 1)
989 elseif(UNIX AND NOT APPLE AND NOT ANDROID)
991 if(SYSV5 OR SOLARIS OR HPUX)
992 set(SDL_AUDIO_DRIVER_SUNAUDIO 1)
993 file(GLOB SUN_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/sun/*.c)
994 set(SOURCE_FILES ${SOURCE_FILES} ${SUN_AUDIO_SOURCES})
995 set(HAVE_SDL_AUDIO TRUE)
997 set(SDL_AUDIO_DRIVER_NETBSD 1)
998 file(GLOB NETBSD_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/netbsd/*.c)
999 set(SOURCE_FILES ${SOURCE_FILES} ${NETBSD_AUDIO_SOURCES})
1000 set(HAVE_SDL_AUDIO TRUE)
1002 set(SDL_AUDIO_DRIVER_PAUDIO 1)
1003 file(GLOB AIX_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/paudio/*.c)
1004 set(SOURCE_FILES ${SOURCE_FILES} ${AIX_AUDIO_SOURCES})
1005 set(HAVE_SDL_AUDIO TRUE)
1016 CheckLibSampleRate()
1020 # Need to check for Raspberry PI first and add platform specific compiler flags, otherwise the test for GLES fails!
1032 file(GLOB CORE_UNIX_SOURCES ${SDL2_SOURCE_DIR}/src/core/unix/*.c)
1033 set(SOURCE_FILES ${SOURCE_FILES} ${CORE_UNIX_SOURCES})
1037 check_c_source_compiles("
1038 #include <linux/input.h>
1040 #error EVIOCGNAME() ioctl not available
1042 int main(int argc, char** argv) {}" HAVE_INPUT_EVENTS)
1044 check_c_source_compiles("
1045 #include <linux/kd.h>
1046 #include <linux/keyboard.h>
1048 int main(int argc, char **argv)
1051 kbe.kb_table = KG_CTRL;
1052 ioctl(0, KDGKBENT, &kbe);
1055 file(GLOB CORE_LINUX_SOURCES ${SDL2_SOURCE_DIR}/src/core/linux/*.c)
1056 set(SOURCE_FILES ${SOURCE_FILES} ${CORE_LINUX_SOURCES})
1058 if(HAVE_INPUT_EVENTS)
1059 set(SDL_INPUT_LINUXEV 1)
1062 if(SDL_HAPTIC AND HAVE_INPUT_EVENTS)
1063 set(SDL_HAPTIC_LINUX 1)
1064 file(GLOB HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/linux/*.c)
1065 set(SOURCE_FILES ${SOURCE_FILES} ${HAPTIC_SOURCES})
1066 set(HAVE_SDL_HAPTIC TRUE)
1070 set(SDL_INPUT_LINUXKD 1)
1073 check_include_file("libudev.h" HAVE_LIBUDEV_H)
1075 if(PKG_CONFIG_FOUND)
1076 pkg_search_module(DBUS dbus-1 dbus)
1078 set(HAVE_DBUS_DBUS_H TRUE)
1079 include_directories(${DBUS_INCLUDE_DIRS})
1080 list(APPEND EXTRA_LIBS ${DBUS_LIBRARIES})
1083 pkg_search_module(IBUS ibus-1.0 ibus)
1085 set(HAVE_IBUS_IBUS_H TRUE)
1086 include_directories(${IBUS_INCLUDE_DIRS})
1087 list(APPEND EXTRA_LIBS ${IBUS_LIBRARIES})
1089 if(HAVE_LIBUNWIND_H)
1090 # We've already found the header, so REQUIRE the lib to be present
1091 pkg_search_module(UNWIND REQUIRED libunwind)
1092 pkg_search_module(UNWIND_GENERIC REQUIRED libunwind-generic)
1093 list(APPEND EXTRA_LIBS ${UNWIND_LIBRARIES} ${UNWIND_GENERIC_LIBRARIES})
1097 check_include_file("fcitx/frontend.h" HAVE_FCITX_FRONTEND_H)
1101 check_c_source_compiles("
1102 #include \"tslib.h\"
1103 int main(int argc, char** argv) { }" HAVE_INPUT_TSLIB)
1104 if(HAVE_INPUT_TSLIB)
1105 set(SDL_INPUT_TSLIB 1)
1106 list(APPEND EXTRA_LIBS ts)
1111 CheckUSBHID() # seems to be BSD specific - limit the test to BSD only?
1112 if(LINUX AND NOT ANDROID)
1113 set(SDL_JOYSTICK_LINUX 1)
1114 file(GLOB JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/linux/*.c ${SDL2_SOURCE_DIR}/src/joystick/steam/*.c)
1115 set(SOURCE_FILES ${SOURCE_FILES} ${JOYSTICK_SOURCES})
1116 set(HAVE_SDL_JOYSTICK TRUE)
1123 check_library_exists(rt clock_gettime "" FOUND_CLOCK_GETTIME)
1124 if(FOUND_CLOCK_GETTIME)
1125 list(APPEND EXTRA_LIBS rt)
1126 set(HAVE_CLOCK_GETTIME 1)
1128 check_library_exists(c clock_gettime "" FOUND_CLOCK_GETTIME)
1129 if(FOUND_CLOCK_GETTIME)
1130 set(HAVE_CLOCK_GETTIME 1)
1135 check_include_file(linux/version.h HAVE_LINUX_VERSION_H)
1136 if(HAVE_LINUX_VERSION_H)
1137 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DHAVE_LINUX_VERSION_H")
1142 set(SDL_POWER_LINUX 1)
1143 file(GLOB POWER_SOURCES ${SDL2_SOURCE_DIR}/src/power/linux/*.c)
1144 set(SOURCE_FILES ${SOURCE_FILES} ${POWER_SOURCES})
1145 set(HAVE_SDL_POWER TRUE)
1150 set(SDL_FILESYSTEM_UNIX 1)
1151 file(GLOB FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/unix/*.c)
1152 set(SOURCE_FILES ${SOURCE_FILES} ${FILESYSTEM_SOURCES})
1153 set(HAVE_SDL_FILESYSTEM TRUE)
1157 set(SDL_TIMER_UNIX 1)
1158 file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/unix/*.c)
1159 set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES})
1160 set(HAVE_SDL_TIMERS TRUE)
1164 set(SDL_RLD_FLAGS "")
1165 if(BSDI OR FREEBSD OR LINUX OR NETBSD)
1166 set(CMAKE_REQUIRED_FLAGS "-Wl,--enable-new-dtags")
1167 check_c_compiler_flag("" HAVE_ENABLE_NEW_DTAGS)
1168 set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS})
1169 if(HAVE_ENABLE_NEW_DTAGS)
1170 set(SDL_RLD_FLAGS "-Wl,-rpath,\${libdir} -Wl,--enable-new-dtags")
1172 set(SDL_RLD_FLAGS "-Wl,-rpath,\${libdir}")
1175 set(SDL_RLD_FLAGS "-R\${libdir}")
1177 set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)
1178 set(HAVE_RPATH TRUE)
1182 find_program(WINDRES windres)
1184 check_c_source_compiles("
1185 #include <windows.h>
1186 int main(int argc, char **argv) { }" HAVE_WIN32_CC)
1188 file(GLOB CORE_SOURCES ${SDL2_SOURCE_DIR}/src/core/windows/*.c)
1189 set(SOURCE_FILES ${SOURCE_FILES} ${CORE_SOURCES})
1192 # Prevent codegen that would use the VC runtime libraries.
1193 set_property(DIRECTORY . APPEND PROPERTY COMPILE_OPTIONS "/GS-")
1195 set_property(DIRECTORY . APPEND PROPERTY COMPILE_OPTIONS "/arch:SSE")
1201 if(DEFINED MSVC_VERSION AND NOT ${MSVC_VERSION} LESS 1700)
1202 set(USE_WINSDK_DIRECTX TRUE)
1204 if(NOT CMAKE_COMPILER_IS_MINGW AND NOT USE_WINSDK_DIRECTX)
1205 if("$ENV{DXSDK_DIR}" STREQUAL "")
1206 message_error("DIRECTX requires the \$DXSDK_DIR environment variable to be set")
1208 set(CMAKE_REQUIRED_FLAGS "/I\"$ENV{DXSDK_DIR}\\Include\"")
1212 # xinput.h may need windows.h, but doesn't include it itself.
1213 check_c_source_compiles("
1214 #include <windows.h>
1216 int main(int argc, char **argv) { }" HAVE_XINPUT_H)
1217 check_c_source_compiles("
1218 #include <windows.h>
1220 XINPUT_GAMEPAD_EX x1;
1221 int main(int argc, char **argv) { }" HAVE_XINPUT_GAMEPAD_EX)
1222 check_c_source_compiles("
1223 #include <windows.h>
1226 int main(int argc, char **argv) { }" HAVE_XINPUT_STATE_EX)
1228 check_include_file(xinput.h HAVE_XINPUT_H)
1231 check_include_file(d3d9.h HAVE_D3D_H)
1232 check_include_file(d3d11_1.h HAVE_D3D11_H)
1233 check_include_file(ddraw.h HAVE_DDRAW_H)
1234 check_include_file(dsound.h HAVE_DSOUND_H)
1235 check_include_file(dinput.h HAVE_DINPUT_H)
1236 check_include_file(dxgi.h HAVE_DXGI_H)
1237 if(HAVE_D3D_H OR HAVE_D3D11_H OR HAVE_DDRAW_H OR HAVE_DSOUND_H OR HAVE_DINPUT_H)
1238 set(HAVE_DIRECTX TRUE)
1239 if(NOT CMAKE_COMPILER_IS_MINGW AND NOT USE_WINSDK_DIRECTX)
1240 # TODO: change $ENV{DXSDL_DIR} to get the path from the include checks
1241 link_directories($ENV{DXSDK_DIR}\\lib\\${PROCESSOR_ARCH})
1242 include_directories($ENV{DXSDK_DIR}\\Include)
1245 set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS})
1248 # headers needed elsewhere ...
1249 check_include_file(mmdeviceapi.h HAVE_MMDEVICEAPI_H)
1250 check_include_file(audioclient.h HAVE_AUDIOCLIENT_H)
1251 check_include_file(endpointvolume.h HAVE_ENDPOINTVOLUME_H)
1254 set(SDL_AUDIO_DRIVER_WINMM 1)
1255 file(GLOB WINMM_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/winmm/*.c)
1256 set(SOURCE_FILES ${SOURCE_FILES} ${WINMM_AUDIO_SOURCES})
1257 set(HAVE_SDL_AUDIO TRUE)
1260 set(SDL_AUDIO_DRIVER_DSOUND 1)
1261 file(GLOB DSOUND_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/directsound/*.c)
1262 set(SOURCE_FILES ${SOURCE_FILES} ${DSOUND_AUDIO_SOURCES})
1265 if(WASAPI AND HAVE_AUDIOCLIENT_H AND HAVE_MMDEVICEAPI_H)
1266 set(SDL_AUDIO_DRIVER_WASAPI 1)
1267 file(GLOB WASAPI_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/wasapi/*.c)
1268 set(SOURCE_FILES ${SOURCE_FILES} ${WASAPI_AUDIO_SOURCES})
1273 # requires SDL_LOADSO on Windows (IME, DX, etc.)
1275 message_error("SDL_VIDEO requires SDL_LOADSO, which is not enabled")
1277 set(SDL_VIDEO_DRIVER_WINDOWS 1)
1278 file(GLOB WIN_VIDEO_SOURCES ${SDL2_SOURCE_DIR}/src/video/windows/*.c)
1279 set(SOURCE_FILES ${SOURCE_FILES} ${WIN_VIDEO_SOURCES})
1281 if(RENDER_D3D AND HAVE_D3D_H)
1282 set(SDL_VIDEO_RENDER_D3D 1)
1283 set(HAVE_RENDER_D3D TRUE)
1285 if(RENDER_D3D AND HAVE_D3D11_H)
1286 set(SDL_VIDEO_RENDER_D3D11 1)
1287 set(HAVE_RENDER_D3D TRUE)
1289 set(HAVE_SDL_VIDEO TRUE)
1293 set(SDL_THREAD_WINDOWS 1)
1294 set(SOURCE_FILES ${SOURCE_FILES}
1295 ${SDL2_SOURCE_DIR}/src/thread/windows/SDL_sysmutex.c
1296 ${SDL2_SOURCE_DIR}/src/thread/windows/SDL_syssem.c
1297 ${SDL2_SOURCE_DIR}/src/thread/windows/SDL_systhread.c
1298 ${SDL2_SOURCE_DIR}/src/thread/windows/SDL_systls.c
1299 ${SDL2_SOURCE_DIR}/src/thread/generic/SDL_syscond.c)
1300 set(HAVE_SDL_THREADS TRUE)
1304 set(SDL_POWER_WINDOWS 1)
1305 set(SOURCE_FILES ${SOURCE_FILES} ${SDL2_SOURCE_DIR}/src/power/windows/SDL_syspower.c)
1306 set(HAVE_SDL_POWER TRUE)
1310 set(SDL_FILESYSTEM_WINDOWS 1)
1311 file(GLOB FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/windows/*.c)
1312 set(SOURCE_FILES ${SOURCE_FILES} ${FILESYSTEM_SOURCES})
1313 set(HAVE_SDL_FILESYSTEM TRUE)
1316 # Libraries for Win32 native and MinGW
1317 list(APPEND EXTRA_LIBS user32 gdi32 winmm imm32 ole32 oleaut32 version uuid advapi32 shell32)
1319 # TODO: in configure.ac the check for timers is set on
1320 # cygwin | mingw32* - does this include mingw32CE?
1322 set(SDL_TIMER_WINDOWS 1)
1323 file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/windows/*.c)
1324 set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES})
1325 set(HAVE_SDL_TIMERS TRUE)
1329 set(SDL_LOADSO_WINDOWS 1)
1330 file(GLOB LOADSO_SOURCES ${SDL2_SOURCE_DIR}/src/loadso/windows/*.c)
1331 set(SOURCE_FILES ${SOURCE_FILES} ${LOADSO_SOURCES})
1332 set(HAVE_SDL_LOADSO TRUE)
1335 file(GLOB CORE_SOURCES ${SDL2_SOURCE_DIR}/src/core/windows/*.c)
1336 set(SOURCE_FILES ${SOURCE_FILES} ${CORE_SOURCES})
1340 set(SDL_VIDEO_OPENGL 1)
1341 set(SDL_VIDEO_OPENGL_WGL 1)
1342 set(SDL_VIDEO_RENDER_OGL 1)
1343 set(HAVE_VIDEO_OPENGL TRUE)
1347 set(SDL_VIDEO_OPENGL_EGL 1)
1348 set(SDL_VIDEO_OPENGL_ES2 1)
1349 set(SDL_VIDEO_RENDER_OGL_ES2 1)
1350 set(HAVE_VIDEO_OPENGLES TRUE)
1355 file(GLOB JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/windows/*.c)
1356 set(SOURCE_FILES ${SOURCE_FILES} ${JOYSTICK_SOURCES})
1358 set(SDL_JOYSTICK_DINPUT 1)
1359 list(APPEND EXTRA_LIBS dinput8)
1360 if(CMAKE_COMPILER_IS_MINGW)
1361 list(APPEND EXTRA_LIBS dxerr8)
1362 elseif (NOT USE_WINSDK_DIRECTX)
1363 list(APPEND EXTRA_LIBS dxerr)
1367 set(SDL_JOYSTICK_XINPUT 1)
1369 if(NOT HAVE_DINPUT_H AND NOT HAVE_XINPUT_H)
1370 set(SDL_JOYSTICK_WINMM 1)
1372 set(HAVE_SDL_JOYSTICK TRUE)
1375 if(HAVE_DINPUT_H OR HAVE_XINPUT_H)
1376 file(GLOB HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/windows/*.c)
1378 set(SDL_HAPTIC_DINPUT 1)
1381 set(SDL_HAPTIC_XINPUT 1)
1384 file(GLOB HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/dummy/*.c)
1385 set(SDL_HAPTIC_DUMMY 1)
1387 set(SOURCE_FILES ${SOURCE_FILES} ${HAPTIC_SOURCES})
1388 set(HAVE_SDL_HAPTIC TRUE)
1392 file(GLOB VERSION_SOURCES ${SDL2_SOURCE_DIR}/src/main/windows/*.rc)
1393 file(GLOB SDLMAIN_SOURCES ${SDL2_SOURCE_DIR}/src/main/windows/*.c)
1395 list(APPEND EXTRA_LIBS mingw32)
1396 list(APPEND EXTRA_LDFLAGS "-mwindows")
1397 set(SDL_CFLAGS "${SDL_CFLAGS} -Dmain=SDL_main")
1398 list(APPEND SDL_LIBS "-lmingw32" "-lSDL2main" "-mwindows")
1401 # TODO: rework this all for proper MacOS X, iOS and Darwin support
1403 # We always need these libs on macOS at the moment.
1404 # !!! FIXME: we need Carbon for some very old API calls in
1405 # !!! FIXME: src/video/cocoa/SDL_cocoakeyboard.c, but we should figure out
1406 # !!! FIXME: how to dump those.
1408 set(SDL_FRAMEWORK_COCOA 1)
1409 set(SDL_FRAMEWORK_CARBON 1)
1412 # Requires the darwin file implementation
1414 file(GLOB EXTRA_SOURCES ${SDL2_SOURCE_DIR}/src/file/cocoa/*.m)
1415 set(SOURCE_FILES ${EXTRA_SOURCES} ${SOURCE_FILES})
1416 # !!! FIXME: modern CMake doesn't need "LANGUAGE C" for Objective-C.
1417 set_source_files_properties(${EXTRA_SOURCES} PROPERTIES LANGUAGE C)
1418 set(HAVE_SDL_FILE TRUE)
1419 # !!! FIXME: why is COREVIDEO inside this if() block?
1420 set(SDL_FRAMEWORK_COREVIDEO 1)
1422 message_error("SDL_FILE must be enabled to build on MacOS X")
1426 set(SDL_AUDIO_DRIVER_COREAUDIO 1)
1427 file(GLOB AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/coreaudio/*.m)
1428 # !!! FIXME: modern CMake doesn't need "LANGUAGE C" for Objective-C.
1429 set_source_files_properties(${AUDIO_SOURCES} PROPERTIES LANGUAGE C)
1430 set(SOURCE_FILES ${SOURCE_FILES} ${AUDIO_SOURCES})
1431 set(HAVE_SDL_AUDIO TRUE)
1432 set(SDL_FRAMEWORK_COREAUDIO 1)
1433 set(SDL_FRAMEWORK_AUDIOTOOLBOX 1)
1437 set(SDL_JOYSTICK_IOKIT 1)
1439 file(GLOB JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/iphoneos/*.m ${SDL2_SOURCE_DIR}/src/joystick/steam/*.c)
1441 file(GLOB JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/darwin/*.c)
1443 set(SOURCE_FILES ${SOURCE_FILES} ${JOYSTICK_SOURCES})
1444 set(HAVE_SDL_JOYSTICK TRUE)
1445 set(SDL_FRAMEWORK_IOKIT 1)
1446 set(SDL_FRAMEWORK_FF 1)
1450 set(SDL_HAPTIC_IOKIT 1)
1452 file(GLOB HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/dummy/*.c)
1453 set(SDL_HAPTIC_DUMMY 1)
1455 file(GLOB HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/darwin/*.c)
1457 set(SOURCE_FILES ${SOURCE_FILES} ${HAPTIC_SOURCES})
1458 set(HAVE_SDL_HAPTIC TRUE)
1459 set(SDL_FRAMEWORK_IOKIT 1)
1460 set(SDL_FRAMEWORK_FF 1)
1461 if(NOT SDL_JOYSTICK)
1462 message(FATAL_ERROR "SDL_HAPTIC requires SDL_JOYSTICK to be enabled")
1467 set(SDL_POWER_MACOSX 1)
1469 file(GLOB POWER_SOURCES ${SDL2_SOURCE_DIR}/src/power/uikit/*.m)
1471 file(GLOB POWER_SOURCES ${SDL2_SOURCE_DIR}/src/power/macosx/*.c)
1473 set(SOURCE_FILES ${SOURCE_FILES} ${POWER_SOURCES})
1474 set(HAVE_SDL_POWER TRUE)
1475 set(SDL_FRAMEWORK_IOKIT 1)
1479 set(SDL_TIMER_UNIX 1)
1480 file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/unix/*.c)
1481 set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES})
1482 set(HAVE_SDL_TIMERS TRUE)
1486 set(SDL_FILESYSTEM_COCOA 1)
1487 file(GLOB FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/cocoa/*.m)
1488 # !!! FIXME: modern CMake doesn't need "LANGUAGE C" for Objective-C.
1489 set_source_files_properties(${FILESYSTEM_SOURCES} PROPERTIES LANGUAGE C)
1490 set(SOURCE_FILES ${SOURCE_FILES} ${FILESYSTEM_SOURCES})
1491 set(HAVE_SDL_FILESYSTEM TRUE)
1494 # Actually load the frameworks at the end so we don't duplicate include.
1495 if(SDL_FRAMEWORK_COREVIDEO)
1496 find_library(COREVIDEO CoreVideo)
1497 list(APPEND EXTRA_LIBS ${COREVIDEO})
1499 if(SDL_FRAMEWORK_COCOA)
1500 find_library(COCOA_LIBRARY Cocoa)
1501 list(APPEND EXTRA_LIBS ${COCOA_LIBRARY})
1503 if(SDL_FRAMEWORK_IOKIT)
1504 find_library(IOKIT IOKit)
1505 list(APPEND EXTRA_LIBS ${IOKIT})
1507 if(SDL_FRAMEWORK_FF)
1508 find_library(FORCEFEEDBACK ForceFeedback)
1509 list(APPEND EXTRA_LIBS ${FORCEFEEDBACK})
1511 if(SDL_FRAMEWORK_CARBON)
1512 find_library(CARBON_LIBRARY Carbon)
1513 list(APPEND EXTRA_LIBS ${CARBON_LIBRARY})
1515 if(SDL_FRAMEWORK_COREAUDIO)
1516 find_library(COREAUDIO CoreAudio)
1517 list(APPEND EXTRA_LIBS ${COREAUDIO})
1519 if(SDL_FRAMEWORK_AUDIOTOOLBOX)
1520 find_library(AUDIOTOOLBOX AudioToolbox)
1521 list(APPEND EXTRA_LIBS ${AUDIOTOOLBOX})
1524 # iOS hack needed - http://code.google.com/p/ios-cmake/ ?
1527 set(SDL_VIDEO_DRIVER_UIKIT 1)
1528 file(GLOB UIKITVIDEO_SOURCES ${SDL2_SOURCE_DIR}/src/video/uikit/*.m)
1529 set(SOURCE_FILES ${SOURCE_FILES} ${UIKITVIDEO_SOURCES})
1533 set(SDL_VIDEO_OPENGL 1)
1534 set(SDL_VIDEO_OPENGL_CGL 1)
1535 set(SDL_VIDEO_RENDER_OGL 1)
1536 set(HAVE_VIDEO_OPENGL TRUE)
1540 set(SDL_VIDEO_OPENGL_EGL 1)
1541 set(SDL_VIDEO_OPENGL_ES2 1)
1542 set(SDL_VIDEO_RENDER_OGL_ES2 1)
1543 set(HAVE_VIDEO_OPENGLES TRUE)
1551 set(SDL_VIDEO_DRIVER_HAIKU 1)
1552 file(GLOB HAIKUVIDEO_SOURCES ${SDL2_SOURCE_DIR}/src/video/haiku/*.c)
1553 set(SOURCE_FILES ${SOURCE_FILES} ${HAIKUVIDEO_SOURCES})
1554 set(HAVE_SDL_VIDEO TRUE)
1556 set(SDL_FILESYSTEM_HAIKU 1)
1557 file(GLOB FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/haiku/*.cc)
1558 set(SOURCE_FILES ${SOURCE_FILES} ${FILESYSTEM_SOURCES})
1559 set(HAVE_SDL_FILESYSTEM TRUE)
1562 set(SDL_TIMER_HAIKU 1)
1563 file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/haiku/*.c)
1564 set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES})
1565 set(HAVE_SDL_TIMERS TRUE)
1569 # TODO: Use FIND_PACKAGE(OpenGL) instead
1570 set(SDL_VIDEO_OPENGL 1)
1571 set(SDL_VIDEO_OPENGL_BGL 1)
1572 set(SDL_VIDEO_RENDER_OGL 1)
1573 list(APPEND EXTRA_LIBS GL)
1574 set(HAVE_VIDEO_OPENGL TRUE)
1582 set(SDL_VIDEO_VULKAN 1)
1583 set(HAVE_VIDEO_VULKAN TRUE)
1587 # configure.ac does it differently:
1589 # if enable_X { SDL_X_DISABLED = 1 }
1590 # [add dummy sources]
1591 # so it always adds a dummy, without checking, if it was actually requested.
1592 # This leads to missing internal references on building, since the
1593 # src/X/*.c does not get included.
1594 if(NOT HAVE_SDL_JOYSTICK)
1595 set(SDL_JOYSTICK_DUMMY 1)
1596 if(SDL_JOYSTICK AND NOT APPLE) # results in unresolved symbols on OSX
1598 file(GLOB JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/dummy/*.c)
1599 set(SOURCE_FILES ${SOURCE_FILES} ${JOYSTICK_SOURCES})
1602 if(NOT HAVE_SDL_HAPTIC)
1603 set(SDL_HAPTIC_DUMMY 1)
1604 file(GLOB HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/dummy/*.c)
1605 set(SOURCE_FILES ${SOURCE_FILES} ${HAPTIC_SOURCES})
1607 if(NOT HAVE_SDL_SENSORS)
1608 set(SDL_SENSOR_DUMMY 1)
1609 file(GLOB SENSORS_SOURCES ${SDL2_SOURCE_DIR}/src/sensor/dummy/*.c)
1610 set(SOURCE_FILES ${SOURCE_FILES} ${SENSORS_SOURCES})
1612 if(NOT HAVE_SDL_LOADSO)
1613 set(SDL_LOADSO_DISABLED 1)
1614 file(GLOB LOADSO_SOURCES ${SDL2_SOURCE_DIR}/src/loadso/dummy/*.c)
1615 set(SOURCE_FILES ${SOURCE_FILES} ${LOADSO_SOURCES})
1617 if(NOT HAVE_SDL_FILESYSTEM)
1618 set(SDL_FILESYSTEM_DISABLED 1)
1619 file(GLOB FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/dummy/*.c)
1620 set(SOURCE_FILES ${SOURCE_FILES} ${FILESYSTEM_SOURCES})
1623 # We always need to have threads and timers around
1624 if(NOT HAVE_SDL_THREADS)
1625 set(SDL_THREADS_DISABLED 1)
1626 file(GLOB THREADS_SOURCES ${SDL2_SOURCE_DIR}/src/thread/generic/*.c)
1627 set(SOURCE_FILES ${SOURCE_FILES} ${THREADS_SOURCES})
1629 if(NOT HAVE_SDL_TIMERS)
1630 set(SDL_TIMERS_DISABLED 1)
1631 file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/dummy/*.c)
1632 set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES})
1635 if(NOT SDLMAIN_SOURCES)
1636 file(GLOB SDLMAIN_SOURCES ${SDL2_SOURCE_DIR}/src/main/dummy/*.c)
1639 # Append the -MMD -MT flags
1640 # if(DEPENDENCY_TRACKING)
1641 # if(COMPILER_IS_GNUCC)
1642 # set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -MMD -MT \$@")
1646 configure_file("${SDL2_SOURCE_DIR}/include/SDL_config.h.cmake"
1647 "${SDL2_BINARY_DIR}/include/SDL_config.h")
1649 # Prepare the flags and remove duplicates
1651 list(REMOVE_DUPLICATES EXTRA_LDFLAGS)
1654 list(REMOVE_DUPLICATES EXTRA_LIBS)
1657 list(REMOVE_DUPLICATES EXTRA_CFLAGS)
1659 listtostr(EXTRA_CFLAGS _EXTRA_CFLAGS)
1660 set(EXTRA_CFLAGS ${_EXTRA_CFLAGS})
1662 # Compat helpers for the configuration files
1663 if(NOT WINDOWS OR CYGWIN)
1664 # TODO: we need a Windows script, too
1665 execute_process(COMMAND sh ${SDL2_SOURCE_DIR}/build-scripts/updaterev.sh)
1667 set(prefix ${CMAKE_INSTALL_PREFIX})
1668 set(exec_prefix "\${prefix}")
1669 set(libdir "\${exec_prefix}/lib${LIB_SUFFIX}")
1670 set(bindir "\${exec_prefix}/bin")
1671 set(includedir "\${prefix}/include")
1673 set(ENABLE_STATIC_TRUE "")
1674 set(ENABLE_STATIC_FALSE "#")
1676 set(ENABLE_STATIC_TRUE "#")
1677 set(ENABLE_STATIC_FALSE "")
1680 set(ENABLE_SHARED_TRUE "")
1681 set(ENABLE_SHARED_FALSE "#")
1683 set(ENABLE_SHARED_TRUE "#")
1684 set(ENABLE_SHARED_FALSE "")
1687 # Clean up the different lists
1688 listtostr(EXTRA_LIBS _EXTRA_LIBS "-l")
1689 set(SDL_STATIC_LIBS ${SDL_LIBS} ${EXTRA_LDFLAGS} ${_EXTRA_LIBS})
1690 list(REMOVE_DUPLICATES SDL_STATIC_LIBS)
1691 listtostr(SDL_STATIC_LIBS _SDL_STATIC_LIBS)
1692 set(SDL_STATIC_LIBS ${_SDL_STATIC_LIBS})
1693 listtostr(SDL_LIBS _SDL_LIBS)
1694 set(SDL_LIBS ${_SDL_LIBS})
1696 # MESSAGE(STATUS "SDL_LIBS: ${SDL_LIBS}")
1697 # MESSAGE(STATUS "SDL_STATIC_LIBS: ${SDL_STATIC_LIBS}")
1699 configure_file("${SDL2_SOURCE_DIR}/sdl2.pc.in"
1700 "${SDL2_BINARY_DIR}/sdl2.pc" @ONLY)
1701 configure_file("${SDL2_SOURCE_DIR}/sdl2-config.in"
1702 "${SDL2_BINARY_DIR}/sdl2-config")
1703 configure_file("${SDL2_SOURCE_DIR}/sdl2-config.in"
1704 "${SDL2_BINARY_DIR}/sdl2-config" @ONLY)
1705 configure_file("${SDL2_SOURCE_DIR}/SDL2.spec.in"
1706 "${SDL2_BINARY_DIR}/SDL2.spec" @ONLY)
1709 ##### Info output #####
1711 message(STATUS "SDL2 was configured with the following options:")
1713 message(STATUS "Platform: ${CMAKE_SYSTEM}")
1714 message(STATUS "64-bit: ${ARCH_64}")
1715 message(STATUS "Compiler: ${CMAKE_C_COMPILER}")
1717 message(STATUS "Subsystems:")
1718 foreach(_SUB ${SDL_SUBSYSTEMS})
1719 string(TOUPPER ${_SUB} _OPT)
1720 message_bool_option(${_SUB} SDL_${_OPT})
1723 message(STATUS "Options:")
1724 list(SORT ALLOPTIONS)
1725 foreach(_OPT ${ALLOPTIONS})
1726 # Longest option is VIDEO_X11_XSCREENSAVER = 22 characters
1728 string(LENGTH ${_OPT} _OPTLEN)
1729 math(EXPR _PADLEN "23 - ${_OPTLEN}")
1730 string(RANDOM LENGTH ${_PADLEN} ALPHABET " " _PADDING)
1731 message_tested_option(${_OPT} ${_PADDING})
1734 message(STATUS " CFLAGS: ${CMAKE_C_FLAGS}")
1735 message(STATUS " EXTRA_CFLAGS: ${EXTRA_CFLAGS}")
1736 message(STATUS " EXTRA_LDFLAGS: ${EXTRA_LDFLAGS}")
1737 message(STATUS " EXTRA_LIBS: ${EXTRA_LIBS}")
1739 message(STATUS " Build Shared Library: ${SDL_SHARED}")
1740 message(STATUS " Build Static Library: ${SDL_STATIC}")
1742 message(STATUS " Build Static Library with Position Independent Code: ${SDL_STATIC_PIC}")
1746 message(STATUS "If something was not detected, although the libraries")
1747 message(STATUS "were installed, then make sure you have set the")
1748 message(STATUS "CFLAGS and LDFLAGS environment variables correctly.")
1752 # Ensure that the extra cflags are used at compile time
1753 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS}")
1755 # Always build SDLmain
1756 add_library(SDL2main STATIC ${SDLMAIN_SOURCES})
1757 target_include_directories(SDL2main PUBLIC "$<BUILD_INTERFACE:${SDL2_SOURCE_DIR}/include>" $<INSTALL_INTERFACE:include/SDL2>)
1758 set(_INSTALL_LIBS "SDL2main")
1760 set_target_properties(SDL2main PROPERTIES DEBUG_POSTFIX ${SDL_CMAKE_DEBUG_POSTFIX})
1764 add_library(SDL2 SHARED ${SOURCE_FILES} ${VERSION_SOURCES})
1766 set_target_properties(SDL2 PROPERTIES
1768 OUTPUT_NAME "SDL2-${LT_RELEASE}")
1769 elseif(UNIX AND NOT ANDROID)
1770 set_target_properties(SDL2 PROPERTIES
1771 VERSION ${LT_VERSION}
1772 SOVERSION ${LT_REVISION}
1773 OUTPUT_NAME "SDL2-${LT_RELEASE}")
1775 set_target_properties(SDL2 PROPERTIES
1776 VERSION ${SDL_VERSION}
1777 SOVERSION ${LT_REVISION}
1780 if(MSVC AND NOT LIBC)
1781 # Don't try to link with the default set of libraries.
1782 set_target_properties(SDL2 PROPERTIES LINK_FLAGS_RELEASE "/NODEFAULTLIB")
1783 set_target_properties(SDL2 PROPERTIES LINK_FLAGS_DEBUG "/NODEFAULTLIB")
1784 set_target_properties(SDL2 PROPERTIES STATIC_LIBRARY_FLAGS "/NODEFAULTLIB")
1786 set(_INSTALL_LIBS "SDL2" ${_INSTALL_LIBS})
1787 target_link_libraries(SDL2 ${EXTRA_LIBS} ${EXTRA_LDFLAGS})
1788 target_include_directories(SDL2 PUBLIC "$<BUILD_INTERFACE:${SDL2_SOURCE_DIR}/include>" $<INSTALL_INTERFACE:include/SDL2>)
1790 set_target_properties(SDL2 PROPERTIES DEBUG_POSTFIX ${SDL_CMAKE_DEBUG_POSTFIX})
1795 add_library(hidapi SHARED ${ANDROID_HIDAPI_SOURCES})
1796 if(MSVC AND NOT LIBC)
1797 # Don't try to link with the default set of libraries.
1798 set_target_properties(hidapi PROPERTIES LINK_FLAGS_RELEASE "/NODEFAULTLIB")
1799 set_target_properties(hidapi PROPERTIES LINK_FLAGS_DEBUG "/NODEFAULTLIB")
1800 set_target_properties(hidapi PROPERTIES STATIC_LIBRARY_FLAGS "/NODEFAULTLIB")
1802 target_link_libraries(hidapi log)
1806 set (BUILD_SHARED_LIBS FALSE)
1807 add_library(SDL2-static STATIC ${SOURCE_FILES})
1808 if (NOT SDL_SHARED OR NOT WIN32)
1809 set_target_properties(SDL2-static PROPERTIES OUTPUT_NAME "SDL2")
1810 # Note: Apparently, OUTPUT_NAME must really be unique; even when
1811 # CMAKE_IMPORT_LIBRARY_SUFFIX or the like are given. Otherwise
1812 # the static build may race with the import lib and one will get
1813 # clobbered, when the suffix is realized via subsequent rename.
1815 set_target_properties(SDL2-static PROPERTIES POSITION_INDEPENDENT_CODE ${SDL_STATIC_PIC})
1816 if(MSVC AND NOT LIBC)
1817 set_target_properties(SDL2-static PROPERTIES LINK_FLAGS_RELEASE "/NODEFAULTLIB")
1818 set_target_properties(SDL2-static PROPERTIES LINK_FLAGS_DEBUG "/NODEFAULTLIB")
1819 set_target_properties(SDL2-static PROPERTIES STATIC_LIBRARY_FLAGS "/NODEFAULTLIB")
1821 # TODO: Win32 platforms keep the same suffix .lib for import and static
1822 # libraries - do we need to consider this?
1823 set(_INSTALL_LIBS "SDL2-static" ${_INSTALL_LIBS})
1824 target_link_libraries(SDL2-static ${EXTRA_LIBS} ${EXTRA_LDFLAGS})
1825 target_include_directories(SDL2-static PUBLIC "$<BUILD_INTERFACE:${SDL2_SOURCE_DIR}/include>" $<INSTALL_INTERFACE:include/SDL2>)
1827 set_target_properties(SDL2-static PROPERTIES DEBUG_POSTFIX ${SDL_CMAKE_DEBUG_POSTFIX})
1834 file(GLOB TEST_SOURCES ${SDL2_SOURCE_DIR}/src/test/*.c)
1835 add_library(SDL2_test STATIC ${TEST_SOURCES})
1837 add_subdirectory(test)
1840 ##### Installation targets #####
1841 install(TARGETS ${_INSTALL_LIBS} EXPORT SDL2Targets
1842 LIBRARY DESTINATION "lib${LIB_SUFFIX}"
1843 ARCHIVE DESTINATION "lib${LIB_SUFFIX}"
1844 RUNTIME DESTINATION bin)
1846 ##### Export files #####
1848 set(PKG_PREFIX "cmake")
1850 set(PKG_PREFIX "lib/cmake/SDL2")
1853 include(CMakePackageConfigHelpers)
1854 write_basic_package_version_file("${CMAKE_BINARY_DIR}/SDL2ConfigVersion.cmake"
1855 VERSION ${SDL_VERSION}
1856 COMPATIBILITY AnyNewerVersion
1859 install(EXPORT SDL2Targets
1860 FILE SDL2Targets.cmake
1862 DESTINATION ${PKG_PREFIX}
1866 ${CMAKE_CURRENT_SOURCE_DIR}/SDL2Config.cmake
1867 ${CMAKE_BINARY_DIR}/SDL2ConfigVersion.cmake
1868 DESTINATION ${PKG_PREFIX}
1872 file(GLOB INCLUDE_FILES ${SDL2_SOURCE_DIR}/include/*.h)
1873 file(GLOB BIN_INCLUDE_FILES ${SDL2_BINARY_DIR}/include/*.h)
1874 foreach(_FNAME ${BIN_INCLUDE_FILES})
1875 get_filename_component(_INCNAME ${_FNAME} NAME)
1876 list(REMOVE_ITEM INCLUDE_FILES ${SDL2_SOURCE_DIR}/include/${_INCNAME})
1878 list(APPEND INCLUDE_FILES ${BIN_INCLUDE_FILES})
1879 install(FILES ${INCLUDE_FILES} DESTINATION include/SDL2)
1881 string(TOUPPER "${CMAKE_BUILD_TYPE}" UPPER_BUILD_TYPE)
1882 if (UPPER_BUILD_TYPE MATCHES DEBUG)
1883 set(SOPOSTFIX "${SDL_CMAKE_DEBUG_POSTFIX}")
1888 if(NOT (WINDOWS OR CYGWIN))
1890 set(SOEXT ${CMAKE_SHARED_LIBRARY_SUFFIX}) # ".so", ".dylib", etc.
1891 get_target_property(SONAME SDL2 OUTPUT_NAME)
1894 execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink
1895 \"lib${SONAME}${SOPOSTFIX}${SOEXT}\" \"libSDL2${SOPOSTFIX}${SOEXT}\"
1896 WORKING_DIRECTORY \"${SDL2_BINARY_DIR}\")")
1897 install(FILES ${SDL2_BINARY_DIR}/libSDL2${SOPOSTFIX}${SOEXT} DESTINATION "lib${LIB_SUFFIX}")
1901 # FreeBSD uses ${PREFIX}/libdata/pkgconfig
1902 install(FILES ${SDL2_BINARY_DIR}/sdl2.pc DESTINATION "libdata/pkgconfig")
1904 install(FILES ${SDL2_BINARY_DIR}/sdl2.pc
1905 DESTINATION "lib${LIB_SUFFIX}/pkgconfig")
1907 install(PROGRAMS ${SDL2_BINARY_DIR}/sdl2-config DESTINATION bin)
1908 # TODO: what about the .spec file? Is it only needed for RPM creation?
1909 install(FILES "${SDL2_SOURCE_DIR}/sdl2.m4" DESTINATION "${CMAKE_INSTALL_FULL_DATAROOTDIR}/aclocal")
1912 ##### Uninstall target #####
1914 if(NOT TARGET uninstall)
1916 "${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake.in"
1917 "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
1920 add_custom_target(uninstall
1921 COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake)