CMakeLists.txt
author Olli Kallioinen <olli.kallioinen@iki.fi>
Sun, 04 Jun 2017 21:25:57 +0300
changeset 11071 a4c90708251c
parent 11070 61401688628e
child 11081 eea7f98a37e4
permissions -rw-r--r--
Android cmake build fixed to work with the official android gradle plugin
     1 if(${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_BINARY_DIR})
     2   message(FATAL_ERROR "Prevented in-tree built. Please create a build directory outside of the SDL source code and call cmake from there")
     3 endif()
     4 
     5 cmake_minimum_required(VERSION 2.8.5)
     6 project(SDL2 C)
     7 
     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)
    17 
    18 include(CheckFunctionExists)
    19 include(CheckLibraryExists)
    20 include(CheckIncludeFiles)
    21 include(CheckIncludeFile)
    22 include(CheckSymbolExists)
    23 include(CheckCSourceRuns)
    24 include(CheckCCompilerFlag)
    25 include(CheckTypeSize)
    26 include(CheckStructHasMember)
    27 include(CMakeDependentOption)
    28 include(FindPkgConfig)
    29 include(GNUInstallDirs)
    30 set(CMAKE_MODULE_PATH "${SDL2_SOURCE_DIR}/cmake")
    31 include(${SDL2_SOURCE_DIR}/cmake/macros.cmake)
    32 include(${SDL2_SOURCE_DIR}/cmake/sdlchecks.cmake)
    33 
    34 # General settings
    35 # Edit include/SDL_version.h and change the version, then:
    36 #   SDL_MICRO_VERSION += 1;
    37 #   SDL_INTERFACE_AGE += 1;
    38 #   SDL_BINARY_AGE += 1;
    39 # if any functions have been added, set SDL_INTERFACE_AGE to 0.
    40 # if backwards compatibility has been broken,
    41 # set SDL_BINARY_AGE and SDL_INTERFACE_AGE to 0.
    42 set(SDL_MAJOR_VERSION 2)
    43 set(SDL_MINOR_VERSION 0)
    44 set(SDL_MICRO_VERSION 5)
    45 set(SDL_INTERFACE_AGE 1)
    46 set(SDL_BINARY_AGE 5)
    47 set(SDL_VERSION "${SDL_MAJOR_VERSION}.${SDL_MINOR_VERSION}.${SDL_MICRO_VERSION}")
    48 
    49 # Calculate a libtool-like version number
    50 math(EXPR LT_CURRENT "${SDL_MICRO_VERSION} - ${SDL_INTERFACE_AGE}")
    51 math(EXPR LT_AGE "${SDL_BINARY_AGE} - ${SDL_INTERFACE_AGE}")
    52 math(EXPR LT_MAJOR "${LT_CURRENT}- ${LT_AGE}")
    53 set(LT_REVISION "${SDL_INTERFACE_AGE}")
    54 set(LT_RELEASE "${SDL_MAJOR_VERSION}.${SDL_MINOR_VERSION}")
    55 set(LT_VERSION "${LT_MAJOR}.${LT_AGE}.${LT_REVISION}")
    56 
    57 message(STATUS "${LT_VERSION} :: ${LT_AGE} :: ${LT_REVISION} :: ${LT_CURRENT} :: ${LT_RELEASE}")
    58 
    59 # General settings & flags
    60 set(LIBRARY_OUTPUT_DIRECTORY "build")
    61 # Check for 64 or 32 bit
    62 set(SIZEOF_VOIDP ${CMAKE_SIZEOF_VOID_P})
    63 if(CMAKE_SIZEOF_VOID_P EQUAL 8)
    64   set(ARCH_64 TRUE)
    65   set(PROCESSOR_ARCH "x64")
    66 else()
    67   set(ARCH_64 FALSE)
    68   set(PROCESSOR_ARCH "x86")
    69 endif()
    70 set(LIBNAME SDL2)
    71 if(NOT LIBTYPE)
    72   set(LIBTYPE SHARED)
    73 endif()
    74 
    75 # Get the platform
    76 if(WIN32)
    77   if(NOT WINDOWS)
    78     set(WINDOWS TRUE)
    79   endif()
    80 elseif(UNIX AND NOT APPLE)
    81   if(CMAKE_SYSTEM_NAME MATCHES ".*Linux")
    82     set(LINUX TRUE)
    83   elseif(CMAKE_SYSTEM_NAME MATCHES "kFreeBSD.*")
    84     set(FREEBSD TRUE)
    85   elseif(CMAKE_SYSTEM_NAME MATCHES "kNetBSD.*|NetBSD.*")
    86     set(NETBSD TRUE)
    87   elseif(CMAKE_SYSTEM_NAME MATCHES "kOpenBSD.*|OpenBSD.*")
    88     set(OPENBSD TRUE)
    89   elseif(CMAKE_SYSTEM_NAME MATCHES ".*GNU.*")
    90     set(GNU TRUE)
    91   elseif(CMAKE_SYSTEM_NAME MATCHES ".*BSDI.*")
    92     set(BSDI TRUE)
    93   elseif(CMAKE_SYSTEM_NAME MATCHES "DragonFly.*|FreeBSD")
    94     set(FREEBSD TRUE)
    95   elseif(CMAKE_SYSTEM_NAME MATCHES "SYSV5.*")
    96     set(SYSV5 TRUE)
    97   elseif(CMAKE_SYSTEM_NAME MATCHES "Solaris.*")
    98     set(SOLARIS TRUE)
    99   elseif(CMAKE_SYSTEM_NAME MATCHES "HP-UX.*")
   100     set(HPUX TRUE)
   101   elseif(CMAKE_SYSTEM_NAME MATCHES "AIX.*")
   102     set(AIX TRUE)
   103   elseif(CMAKE_SYSTEM_NAME MATCHES "Minix.*")
   104     set(MINIX TRUE)
   105   endif()
   106 elseif(APPLE)
   107   if(CMAKE_SYSTEM_NAME MATCHES ".*Darwin.*")
   108     set(DARWIN TRUE)
   109   elseif(CMAKE_SYSTEM_NAME MATCHES ".*MacOS.*")
   110     set(MACOSX TRUE)
   111   endif()
   112   # TODO: iOS?
   113 elseif(CMAKE_SYSTEM_NAME MATCHES "BeOS.*")
   114   message_error("BeOS support has been removed as of SDL 2.0.2.")
   115 elseif(CMAKE_SYSTEM_NAME MATCHES "Haiku.*")
   116   set(HAIKU TRUE)
   117 endif()
   118 
   119 # Don't mistake osx for unix
   120 if(UNIX AND NOT APPLE)
   121   set(UNIX_SYS ON)
   122 else()
   123   set(UNIX_SYS OFF)
   124 endif()
   125 
   126 if(UNIX OR APPLE)
   127   set(UNIX_OR_MAC_SYS ON)
   128 else()
   129   set(UNIX_OR_MAC_SYS OFF)
   130 endif()
   131 
   132 if (UNIX_OR_MAC_SYS AND NOT EMSCRIPTEN) # JavaScript does not yet have threading support, so disable pthreads when building for Emscripten.
   133   set(SDL_PTHREADS_ENABLED_BY_DEFAULT ON)
   134 else()
   135   set(SDL_PTHREADS_ENABLED_BY_DEFAULT OFF)
   136 endif()
   137 
   138 # Default option knobs
   139 if(APPLE OR ARCH_64)
   140   if(NOT "${CMAKE_OSX_ARCHITECTURES}" MATCHES "arm")
   141     set(OPT_DEF_SSEMATH ON)
   142   endif()
   143 endif()
   144 if(UNIX OR MINGW OR MSYS)
   145   set(OPT_DEF_LIBC ON)
   146 endif()
   147 
   148 # Compiler info
   149 if(CMAKE_COMPILER_IS_GNUCC)
   150   set(USE_GCC TRUE)
   151   set(OPT_DEF_ASM TRUE)
   152 elseif(CMAKE_C_COMPILER_ID MATCHES "Clang")
   153   set(USE_CLANG TRUE)
   154   set(OPT_DEF_ASM TRUE)
   155 elseif(MSVC_VERSION GREATER 1400) # VisualStudio 8.0+
   156   set(OPT_DEF_ASM TRUE)
   157   #set(CMAKE_C_FLAGS "/ZI /WX- /
   158 else()
   159   set(OPT_DEF_ASM FALSE)
   160 endif()
   161 
   162 # Default flags, if not set otherwise
   163 if("$ENV{CFLAGS}" STREQUAL "")
   164   if(CMAKE_BUILD_TYPE STREQUAL "")
   165     if(USE_GCC OR USE_CLANG)
   166       set(CMAKE_C_FLAGS "-g -O3")
   167     endif()
   168   endif()
   169 else()
   170   set(CMAKE_C_FLAGS "$ENV{CFLAGS}")
   171   list(APPEND EXTRA_CFLAGS "$ENV{CFLAGS}")
   172 endif()
   173 if(NOT ("$ENV{CFLAGS}" STREQUAL "")) # Hackish, but does the trick on Win32
   174   list(APPEND EXTRA_LDFLAGS "$ENV{LDFLAGS}")
   175 endif()
   176 
   177 if(MSVC)
   178   option(FORCE_STATIC_VCRT "Force /MT for static VC runtimes" OFF)
   179   if(FORCE_STATIC_VCRT)
   180     foreach(flag_var
   181         CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE
   182         CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO)
   183       if(${flag_var} MATCHES "/MD")
   184         string(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}")
   185       endif()
   186     endforeach()
   187   endif()
   188 
   189   # Make sure /RTC1 is disabled, otherwise it will use functions from the CRT
   190   foreach(flag_var
   191       CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE
   192       CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO)
   193     string(REGEX REPLACE "/RTC(su|[1su])" "" ${flag_var} "${${flag_var}}")
   194   endforeach(flag_var)
   195 endif()
   196 
   197 # Those are used for pkg-config and friends, so that the SDL2.pc, sdl2-config,
   198 # etc. are created correctly.
   199 set(SDL_LIBS "-lSDL2")
   200 set(SDL_CFLAGS "")
   201 
   202 # Emscripten toolchain has a nonempty default value for this, and the checks 
   203 # in this file need to change that, so remember the original value, and 
   204 # restore back to that afterwards. For check_function_exists() to work in
   205 # Emscripten, this value must be at its default value.
   206 set(ORIG_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
   207 
   208 if(CYGWIN)
   209   # We build SDL on cygwin without the UNIX emulation layer
   210   include_directories("-I/usr/include/mingw")
   211   set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -mno-cygwin")
   212   check_c_source_compiles("int main(int argc, char **argv) {}"
   213     HAVE_GCC_NO_CYGWIN)
   214   set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS})
   215   if(HAVE_GCC_NO_CYGWIN)
   216     list(APPEND EXTRA_LDFLAGS "-mno-cygwin")
   217     list(APPEND SDL_LIBS "-mno-cygwin")
   218   endif()
   219   set(SDL_CFLAGS "${SDL_CFLAGS} -I/usr/include/mingw")
   220 endif()
   221 
   222 add_definitions(-DUSING_GENERATED_CONFIG_H)
   223 # General includes
   224 include_directories(${SDL2_BINARY_DIR}/include ${SDL2_SOURCE_DIR}/include)
   225 
   226 # All these ENABLED_BY_DEFAULT vars will default to ON if not specified, so
   227 #  you only need to have a platform override them if they are disabling.
   228 set(OPT_DEF_ASM TRUE)
   229 if(EMSCRIPTEN)
   230   # Set up default values for the currently supported set of subsystems:
   231   # Emscripten/Javascript does not have assembly support, a dynamic library 
   232   # loading architecture, low-level CPU inspection or multithreading.
   233   set(OPT_DEF_ASM FALSE)
   234   set(SDL_SHARED_ENABLED_BY_DEFAULT OFF)
   235   set(SDL_ATOMIC_ENABLED_BY_DEFAULT OFF)
   236   set(SDL_THREADS_ENABLED_BY_DEFAULT OFF)
   237   set(SDL_LOADSO_ENABLED_BY_DEFAULT OFF)
   238   set(SDL_CPUINFO_ENABLED_BY_DEFAULT OFF)
   239   set(SDL_DLOPEN_ENABLED_BY_DEFAULT OFF)
   240 endif()
   241 
   242 if (NOT DEFINED SDL_SHARED_ENABLED_BY_DEFAULT)
   243     set(SDL_SHARED_ENABLED_BY_DEFAULT ON)
   244 endif()
   245 
   246 set(SDL_SUBSYSTEMS
   247     Atomic Audio Video Render Events Joystick Haptic Power Threads Timers
   248     File Loadso CPUinfo Filesystem Dlopen)
   249 foreach(_SUB ${SDL_SUBSYSTEMS})
   250   string(TOUPPER ${_SUB} _OPT)
   251   if (NOT DEFINED SDL_${_OPT}_ENABLED_BY_DEFAULT)
   252     set(SDL_${_OPT}_ENABLED_BY_DEFAULT ON)
   253   endif()
   254   option(SDL_${_OPT} "Enable the ${_SUB} subsystem" ${SDL_${_OPT}_ENABLED_BY_DEFAULT})
   255 endforeach()
   256 
   257 option_string(ASSERTIONS "Enable internal sanity checks (auto/disabled/release/enabled/paranoid)" "auto")
   258 #set_option(DEPENDENCY_TRACKING "Use gcc -MMD -MT dependency tracking" ON)
   259 set_option(LIBC                "Use the system C library" ${OPT_DEF_LIBC})
   260 set_option(GCC_ATOMICS         "Use gcc builtin atomics" ${USE_GCC})
   261 set_option(ASSEMBLY            "Enable assembly routines" ${OPT_DEF_ASM})
   262 set_option(SSEMATH             "Allow GCC to use SSE floating point math" ${OPT_DEF_SSEMATH})
   263 set_option(MMX                 "Use MMX assembly routines" ${OPT_DEF_ASM})
   264 set_option(3DNOW               "Use 3Dnow! MMX assembly routines" ${OPT_DEF_ASM})
   265 set_option(SSE                 "Use SSE assembly routines" ${OPT_DEF_ASM})
   266 set_option(SSE2                "Use SSE2 assembly routines" ${OPT_DEF_SSEMATH})
   267 set_option(SSE3                "Use SSE3 assembly routines" ${OPT_DEF_SSEMATH})
   268 set_option(ALTIVEC             "Use Altivec assembly routines" ${OPT_DEF_ASM})
   269 set_option(DISKAUDIO           "Support the disk writer audio driver" ON)
   270 set_option(DUMMYAUDIO          "Support the dummy audio driver" ON)
   271 set_option(VIDEO_DIRECTFB      "Use DirectFB video driver" OFF)
   272 dep_option(DIRECTFB_SHARED     "Dynamically load directfb support" ON "VIDEO_DIRECTFB" OFF)
   273 set_option(VIDEO_DUMMY         "Use dummy video driver" ON)
   274 set_option(VIDEO_OPENGL        "Include OpenGL support" ON)
   275 set_option(VIDEO_OPENGLES      "Include OpenGL ES support" ON)
   276 set_option(PTHREADS            "Use POSIX threads for multi-threading" ${SDL_PTHREADS_ENABLED_BY_DEFAULT})
   277 dep_option(PTHREADS_SEM        "Use pthread semaphores" ON "PTHREADS" OFF)
   278 set_option(SDL_DLOPEN          "Use dlopen for shared object loading" ${SDL_DLOPEN_ENABLED_BY_DEFAULT})
   279 set_option(OSS                 "Support the OSS audio API" ${UNIX_SYS})
   280 set_option(ALSA                "Support the ALSA audio API" ${UNIX_SYS})
   281 dep_option(ALSA_SHARED         "Dynamically load ALSA audio support" ON "ALSA" OFF)
   282 set_option(ESD                 "Support the Enlightened Sound Daemon" ${UNIX_SYS})
   283 dep_option(ESD_SHARED          "Dynamically load ESD audio support" ON "ESD" OFF)
   284 set_option(PULSEAUDIO          "Use PulseAudio" ${UNIX_SYS})
   285 dep_option(PULSEAUDIO_SHARED   "Dynamically load PulseAudio support" ON "PULSEAUDIO" OFF)
   286 set_option(ARTS                "Support the Analog Real Time Synthesizer" ${UNIX_SYS})
   287 dep_option(ARTS_SHARED         "Dynamically load aRts audio support" ON "ARTS" OFF)
   288 set_option(NAS                 "Support the NAS audio API" ${UNIX_SYS})
   289 set_option(NAS_SHARED          "Dynamically load NAS audio API" ${UNIX_SYS})
   290 set_option(SNDIO               "Support the sndio audio API" ${UNIX_SYS})
   291 set_option(FUSIONSOUND         "Use FusionSound audio driver" OFF)
   292 dep_option(FUSIONSOUND_SHARED  "Dynamically load fusionsound audio support" ON "FUSIONSOUND" OFF)
   293 set_option(LIBSAMPLERATE       "Use libsamplerate for audio rate conversion" ${UNIX_SYS})
   294 dep_option(LIBSAMPLERATE_SHARED "Dynamically load libsamplerate" ON "LIBSAMPLERATE" OFF)
   295 set_option(RPATH               "Use an rpath when linking SDL" ${UNIX_SYS})
   296 set_option(CLOCK_GETTIME       "Use clock_gettime() instead of gettimeofday()" OFF)
   297 set_option(INPUT_TSLIB         "Use the Touchscreen library for input" ${UNIX_SYS})
   298 set_option(VIDEO_X11           "Use X11 video driver" ${UNIX_SYS})
   299 set_option(VIDEO_WAYLAND       "Use Wayland video driver" ${UNIX_SYS})
   300 dep_option(WAYLAND_SHARED      "Dynamically load Wayland support" ON "VIDEO_WAYLAND" OFF)
   301 dep_option(VIDEO_WAYLAND_QT_TOUCH  "QtWayland server support for Wayland video driver" ON "VIDEO_WAYLAND" OFF)
   302 set_option(VIDEO_MIR           "Use Mir video driver" ${UNIX_SYS})
   303 dep_option(MIR_SHARED          "Dynamically load Mir support" ON "VIDEO_MIR" OFF)
   304 set_option(VIDEO_RPI           "Use Raspberry Pi video driver" ${UNIX_SYS})
   305 dep_option(X11_SHARED          "Dynamically load X11 support" ON "VIDEO_X11" OFF)
   306 set(SDL_X11_OPTIONS Xcursor Xinerama XInput Xrandr Xscrnsaver XShape Xvm)
   307 foreach(_SUB ${SDL_X11_OPTIONS})
   308   string(TOUPPER "VIDEO_X11_${_SUB}" _OPT)
   309   dep_option(${_OPT}           "Enable ${_SUB} support" ON "VIDEO_X11" OFF)
   310 endforeach()
   311 set_option(VIDEO_COCOA         "Use Cocoa video driver" ${APPLE})
   312 set_option(DIRECTX             "Use DirectX for Windows audio/video" ${WINDOWS})
   313 set_option(RENDER_D3D          "Enable the Direct3D render driver" ${WINDOWS})
   314 set_option(VIDEO_VIVANTE       "Use Vivante EGL video driver" ${UNIX_SYS})
   315 
   316 # TODO: We should (should we?) respect cmake's ${BUILD_SHARED_LIBS} flag here
   317 # The options below are for compatibility to configure's default behaviour.
   318 set(SDL_SHARED ${SDL_SHARED_ENABLED_BY_DEFAULT} CACHE BOOL "Build a shared version of the library")
   319 set(SDL_STATIC ON CACHE BOOL "Build a static version of the library")
   320 
   321 dep_option(SDL_STATIC_PIC      "Static version of the library should be built with Position Independent Code" OFF "SDL_STATIC" OFF)
   322 
   323 # General source files
   324 file(GLOB SOURCE_FILES
   325   ${SDL2_SOURCE_DIR}/src/*.c
   326   ${SDL2_SOURCE_DIR}/src/atomic/*.c
   327   ${SDL2_SOURCE_DIR}/src/audio/*.c
   328   ${SDL2_SOURCE_DIR}/src/cpuinfo/*.c
   329   ${SDL2_SOURCE_DIR}/src/dynapi/*.c
   330   ${SDL2_SOURCE_DIR}/src/events/*.c
   331   ${SDL2_SOURCE_DIR}/src/file/*.c
   332   ${SDL2_SOURCE_DIR}/src/libm/*.c
   333   ${SDL2_SOURCE_DIR}/src/render/*.c
   334   ${SDL2_SOURCE_DIR}/src/render/*/*.c
   335   ${SDL2_SOURCE_DIR}/src/stdlib/*.c
   336   ${SDL2_SOURCE_DIR}/src/thread/*.c
   337   ${SDL2_SOURCE_DIR}/src/timer/*.c
   338   ${SDL2_SOURCE_DIR}/src/video/*.c)
   339 
   340 
   341 if(ASSERTIONS STREQUAL "auto")
   342   # Do nada - use optimization settings to determine the assertion level
   343 elseif(ASSERTIONS STREQUAL "disabled")
   344   set(SDL_DEFAULT_ASSERT_LEVEL 0)
   345 elseif(ASSERTIONS STREQUAL "release")
   346   set(SDL_DEFAULT_ASSERT_LEVEL 1)
   347 elseif(ASSERTIONS STREQUAL "enabled")
   348   set(SDL_DEFAULT_ASSERT_LEVEL 2)
   349 elseif(ASSERTIONS STREQUAL "paranoid")
   350   set(SDL_DEFAULT_ASSERT_LEVEL 3)
   351 else()
   352   message_error("unknown assertion level")
   353 endif()
   354 set(HAVE_ASSERTIONS ${ASSERTIONS})
   355 
   356 # Compiler option evaluation
   357 if(USE_GCC OR USE_CLANG)
   358   # Check for -Wall first, so later things can override pieces of it.
   359   check_c_compiler_flag(-Wall HAVE_GCC_WALL)
   360   if(HAVE_GCC_WALL)
   361     list(APPEND EXTRA_CFLAGS "-Wall")
   362     if(HAIKU)
   363       set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-multichar")
   364     endif()
   365   endif()
   366 
   367   check_c_compiler_flag(-Wdeclaration-after-statement HAVE_GCC_WDECLARATION_AFTER_STATEMENT)
   368   if(HAVE_GCC_WDECLARATION_AFTER_STATEMENT)
   369     check_c_compiler_flag(-Werror=declaration-after-statement HAVE_GCC_WERROR_DECLARATION_AFTER_STATEMENT)
   370     if(HAVE_GCC_WERROR_DECLARATION_AFTER_STATEMENT)
   371       list(APPEND EXTRA_CFLAGS "-Werror=declaration-after-statement")
   372     endif()
   373     list(APPEND EXTRA_CFLAGS "-Wdeclaration-after-statement")
   374   endif()
   375 
   376   if(DEPENDENCY_TRACKING)
   377     check_c_source_compiles("
   378         #if !defined(__GNUC__) || __GNUC__ < 3
   379         #error Dependency tracking requires GCC 3.0 or newer
   380         #endif
   381         int main(int argc, char **argv) { }" HAVE_DEPENDENCY_TRACKING)
   382   endif()
   383 
   384   if(GCC_ATOMICS)
   385     check_c_source_compiles("int main(int argc, char **argv) {
   386         int a;
   387         void *x, *y, *z;
   388         __sync_lock_test_and_set(&a, 4);
   389         __sync_lock_test_and_set(&x, y);
   390         __sync_fetch_and_add(&a, 1);
   391         __sync_bool_compare_and_swap(&a, 5, 10);
   392         __sync_bool_compare_and_swap(&x, y, z); }" HAVE_GCC_ATOMICS)
   393     if(NOT HAVE_GCC_ATOMICS)
   394       check_c_source_compiles("int main(int argc, char **argv) {
   395           int a;
   396           __sync_lock_test_and_set(&a, 1);
   397           __sync_lock_release(&a); }" HAVE_GCC_SYNC_LOCK_TEST_AND_SET)
   398     endif()
   399   endif()
   400 
   401   set(CMAKE_REQUIRED_FLAGS "-mpreferred-stack-boundary=2")
   402   check_c_source_compiles("int x = 0; int main(int argc, char **argv) {}"
   403     HAVE_GCC_PREFERRED_STACK_BOUNDARY)
   404   set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS})
   405 
   406   set(CMAKE_REQUIRED_FLAGS "-fvisibility=hidden -Werror")
   407   check_c_source_compiles("
   408       #if !defined(__GNUC__) || __GNUC__ < 4
   409       #error SDL only uses visibility attributes in GCC 4 or newer
   410       #endif
   411       int main(int argc, char **argv) {}" HAVE_GCC_FVISIBILITY)
   412   if(HAVE_GCC_FVISIBILITY)
   413     list(APPEND EXTRA_CFLAGS "-fvisibility=hidden")
   414   endif()
   415   set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS})
   416 
   417   check_c_compiler_flag(-Wshadow HAVE_GCC_WSHADOW)
   418   if(HAVE_GCC_WSHADOW)
   419     list(APPEND EXTRA_CFLAGS "-Wshadow")
   420   endif()
   421 
   422   set(CMAKE_REQUIRED_FLAGS "-Wl,--no-undefined")
   423   check_c_compiler_flag("" HAVE_NO_UNDEFINED)
   424   set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS})
   425   if(HAVE_NO_UNDEFINED)
   426     list(APPEND EXTRA_LDFLAGS "-Wl,--no-undefined")
   427   endif()
   428 endif()
   429 
   430 if(ASSEMBLY)
   431   if(USE_GCC OR USE_CLANG)
   432     set(SDL_ASSEMBLY_ROUTINES 1)
   433     # TODO: Those all seem to be quite GCC specific - needs to be
   434     # reworked for better compiler support
   435     set(HAVE_ASSEMBLY TRUE)
   436     if(MMX)
   437       set(CMAKE_REQUIRED_FLAGS "-mmmx")
   438       check_c_source_compiles("
   439           #ifdef __MINGW32__
   440           #include <_mingw.h>
   441           #ifdef __MINGW64_VERSION_MAJOR
   442           #include <intrin.h>
   443           #else
   444           #include <mmintrin.h>
   445           #endif
   446           #else
   447           #include <mmintrin.h>
   448           #endif
   449           #ifndef __MMX__
   450           #error Assembler CPP flag not enabled
   451           #endif
   452           int main(int argc, char **argv) { }" HAVE_MMX)
   453       if(HAVE_MMX)
   454         list(APPEND EXTRA_CFLAGS "-mmmx")
   455       endif()
   456       set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS})
   457     endif()
   458 
   459     if(3DNOW)
   460       set(CMAKE_REQUIRED_FLAGS "-m3dnow")
   461       check_c_source_compiles("
   462           #include <mm3dnow.h>
   463           #ifndef __3dNOW__
   464           #error Assembler CPP flag not enabled
   465           #endif
   466           int main(int argc, char **argv) {
   467             void *p = 0;
   468             _m_prefetch(p);
   469           }" HAVE_3DNOW)
   470       if(HAVE_3DNOW)
   471         list(APPEND EXTRA_CFLAGS "-m3dnow")
   472       endif()
   473       set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS})
   474     endif()
   475 
   476     if(SSE)
   477       set(CMAKE_REQUIRED_FLAGS "-msse")
   478       check_c_source_compiles("
   479           #ifdef __MINGW32__
   480           #include <_mingw.h>
   481           #ifdef __MINGW64_VERSION_MAJOR
   482           #include <intrin.h>
   483           #else
   484           #include <xmmintrin.h>
   485           #endif
   486           #else
   487           #include <xmmintrin.h>
   488           #endif
   489           #ifndef __SSE__
   490           #error Assembler CPP flag not enabled
   491           #endif
   492           int main(int argc, char **argv) { }" HAVE_SSE)
   493       if(HAVE_SSE)
   494         list(APPEND EXTRA_CFLAGS "-msse")
   495       endif()
   496       set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS})
   497     endif()
   498 
   499     if(SSE2)
   500       set(CMAKE_REQUIRED_FLAGS "-msse2")
   501       check_c_source_compiles("
   502           #ifdef __MINGW32__
   503           #include <_mingw.h>
   504           #ifdef __MINGW64_VERSION_MAJOR
   505           #include <intrin.h>
   506           #else
   507           #include <emmintrin.h>
   508           #endif
   509           #else
   510           #include <emmintrin.h>
   511           #endif
   512           #ifndef __SSE2__
   513           #error Assembler CPP flag not enabled
   514           #endif
   515           int main(int argc, char **argv) { }" HAVE_SSE2)
   516       if(HAVE_SSE2)
   517         list(APPEND EXTRA_CFLAGS "-msse2")
   518       endif()
   519       set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS})
   520     endif()
   521 
   522     if(SSE3)
   523       set(CMAKE_REQUIRED_FLAGS "-msse3")
   524       check_c_source_compiles("
   525           #ifdef __MINGW32__
   526           #include <_mingw.h>
   527           #ifdef __MINGW64_VERSION_MAJOR
   528           #include <intrin.h>
   529           #else
   530           #include <pmmintrin.h>
   531           #endif
   532           #else
   533           #include <pmmintrin.h>
   534           #endif
   535           #ifndef __SSE3__
   536           #error Assembler CPP flag not enabled
   537           #endif
   538           int main(int argc, char **argv) { }" HAVE_SSE3)
   539       if(HAVE_SSE3)
   540         list(APPEND EXTRA_CFLAGS "-msse3")
   541       endif()
   542       set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS})
   543     endif()
   544 
   545     if(NOT SSEMATH)
   546       if(SSE OR SSE2 OR SSE3)
   547         if(USE_GCC)
   548           check_c_compiler_flag(-mfpmath=387 HAVE_FP_387)
   549           if(HAVE_FP_387)
   550             list(APPEND EXTRA_CFLAGS "-mfpmath=387")
   551           endif()
   552         endif()
   553         set(HAVE_SSEMATH TRUE)
   554       endif()
   555     endif()
   556 
   557     if(ALTIVEC)
   558       set(CMAKE_REQUIRED_FLAGS "-maltivec")
   559       check_c_source_compiles("
   560           #include <altivec.h>
   561           vector unsigned int vzero() {
   562               return vec_splat_u32(0);
   563           }
   564           int main(int argc, char **argv) { }" HAVE_ALTIVEC_H_HDR)
   565       check_c_source_compiles("
   566           vector unsigned int vzero() {
   567               return vec_splat_u32(0);
   568           }
   569           int main(int argc, char **argv) { }" HAVE_ALTIVEC)
   570       set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS})
   571       if(HAVE_ALTIVEC OR HAVE_ALTIVEC_H_HDR)
   572         set(HAVE_ALTIVEC TRUE) # if only HAVE_ALTIVEC_H_HDR is set
   573         list(APPEND EXTRA_CFLAGS "-maltivec")
   574         set(SDL_ALTIVEC_BLITTERS 1)
   575         if(HAVE_ALTIVEC_H_HDR)
   576           set(HAVE_ALTIVEC_H 1)
   577         endif()
   578       endif()
   579     endif()
   580   elseif(MSVC_VERSION GREATER 1500)
   581     # TODO: SDL_cpuinfo.h needs to support the user's configuration wish
   582     # for MSVC - right now it is always activated
   583     if(NOT ARCH_64)
   584       set(HAVE_MMX TRUE)
   585       set(HAVE_3DNOW TRUE)
   586     endif()
   587     set(HAVE_SSE TRUE)
   588     set(HAVE_SSE2 TRUE)
   589     set(HAVE_SSE3 TRUE)
   590     set(SDL_ASSEMBLY_ROUTINES 1)
   591   endif()
   592 # TODO:
   593 #else()
   594 #  if(USE_GCC OR USE_CLANG)
   595 #    list(APPEND EXTRA_CFLAGS "-mno-sse" "-mno-sse2" "-mno-sse3" "-mno-mmx")
   596 #  endif()
   597 endif()
   598 
   599 # TODO: Can't deactivate on FreeBSD? w/o LIBC, SDL_stdinc.h can't define
   600 # anything.
   601 if(LIBC)
   602   if(WINDOWS AND NOT MINGW)
   603     set(HAVE_LIBC TRUE)
   604     foreach(_HEADER stdio.h string.h ctype.h math.h)
   605       string(TOUPPER "HAVE_${_HEADER}" _UPPER)
   606       string(REPLACE "." "_" _HAVE_H ${_UPPER})
   607       set(${_HAVE_H} 1)
   608     endforeach()
   609     set(HAVE_SIGNAL_H 1)
   610     foreach(_FN
   611             malloc calloc realloc free qsort abs memset memcpy memmove memcmp
   612             strlen _strrev _strupr _strlwr strchr strrchr strstr itoa _ltoa
   613             _ultoa strtol strtoul strtoll strtod atoi atof strcmp strncmp
   614             _stricmp _strnicmp sscanf atan atan2 acos asin ceil copysign cos
   615             cosf fabs floor log pow scalbn sin sinf sqrt sqrtf tan tanf)
   616       string(TOUPPER ${_FN} _UPPER)
   617       set(HAVE_${_UPPER} 1)
   618     endforeach()
   619     if(NOT CYGWIN AND NOT MINGW)
   620       set(HAVE_ALLOCA 1)
   621     endif()
   622     set(HAVE_M_PI 1)
   623     add_definitions(-D_USE_MATH_DEFINES) # needed for M_PI
   624     set(STDC_HEADERS 1)
   625   else()
   626     set(HAVE_LIBC TRUE)
   627     check_include_file(sys/types.h HAVE_SYS_TYPES_H)
   628     foreach(_HEADER
   629             stdio.h stdlib.h stddef.h stdarg.h malloc.h memory.h string.h
   630             strings.h inttypes.h stdint.h ctype.h math.h iconv.h signal.h)
   631       string(TOUPPER "HAVE_${_HEADER}" _UPPER)
   632       string(REPLACE "." "_" _HAVE_H ${_UPPER})
   633       check_include_file("${_HEADER}" ${_HAVE_H})
   634     endforeach()
   635 
   636     check_include_files("dlfcn.h;stdint.h;stddef.h;inttypes.h;stdlib.h;strings.h;string.h;float.h" STDC_HEADERS)
   637     check_type_size("size_t" SIZEOF_SIZE_T)
   638     check_symbol_exists(M_PI math.h HAVE_M_PI)
   639     # TODO: refine the mprotect check
   640     check_c_source_compiles("#include <sys/types.h>
   641                              #include <sys/mman.h>
   642                              int main() { }" HAVE_MPROTECT)
   643     foreach(_FN
   644             strtod malloc calloc realloc free getenv setenv putenv unsetenv
   645             qsort abs bcopy memset memcpy memmove memcmp strlen strlcpy strlcat
   646             strdup _strrev _strupr _strlwr strchr strrchr strstr itoa _ltoa
   647             _uitoa _ultoa strtol strtoul _i64toa _ui64toa strtoll strtoull
   648             atoi atof strcmp strncmp _stricmp strcasecmp _strnicmp strncasecmp
   649             vsscanf vsnprintf fseeko fseeko64 sigaction setjmp
   650             nanosleep sysconf sysctlbyname getauxval
   651             )
   652       string(TOUPPER ${_FN} _UPPER)
   653       set(_HAVEVAR "HAVE_${_UPPER}")
   654       check_function_exists("${_FN}" ${_HAVEVAR})
   655     endforeach()
   656 
   657     check_library_exists(m pow "" HAVE_LIBM)
   658     if(HAVE_LIBM)
   659       set(CMAKE_REQUIRED_LIBRARIES m)
   660       foreach(_FN
   661               atan atan2 ceil copysign cos cosf fabs floor log pow scalbn sin
   662               sinf sqrt sqrtf tan tanf acos asin)
   663         string(TOUPPER ${_FN} _UPPER)
   664         set(_HAVEVAR "HAVE_${_UPPER}")
   665         check_function_exists("${_FN}" ${_HAVEVAR})
   666       endforeach()
   667       set(CMAKE_REQUIRED_LIBRARIES)
   668       list(APPEND EXTRA_LIBS m)
   669     endif()
   670 
   671     check_library_exists(iconv iconv_open "" HAVE_LIBICONV)
   672     if(HAVE_LIBICONV)
   673       list(APPEND EXTRA_LIBS iconv)
   674       set(HAVE_ICONV 1)
   675     endif()
   676 
   677     if(NOT APPLE)
   678       check_include_file(alloca.h HAVE_ALLOCA_H)
   679       check_function_exists(alloca HAVE_ALLOCA)
   680     else()
   681       set(HAVE_ALLOCA_H 1)
   682       set(HAVE_ALLOCA 1)
   683     endif()
   684 
   685     check_struct_has_member("struct sigaction" "sa_sigaction" "signal.h" HAVE_SA_SIGACTION)
   686   endif()
   687 else()
   688   if(WINDOWS)
   689     set(HAVE_STDARG_H 1)
   690     set(HAVE_STDDEF_H 1)
   691   endif()
   692 endif()
   693 
   694 
   695 # Enable/disable various subsystems of the SDL library
   696 foreach(_SUB ${SDL_SUBSYSTEMS})
   697   string(TOUPPER ${_SUB} _OPT)
   698   if(NOT SDL_${_OPT})
   699     set(SDL_${_OPT}_DISABLED 1)
   700   endif()
   701 endforeach()
   702 if(SDL_JOYSTICK)
   703   file(GLOB JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/*.c)
   704   set(SOURCE_FILES ${SOURCE_FILES} ${JOYSTICK_SOURCES})
   705 endif()
   706 if(SDL_HAPTIC)
   707   if(NOT SDL_JOYSTICK)
   708     # Haptic requires some private functions from the joystick subsystem.
   709     message_error("SDL_HAPTIC requires SDL_JOYSTICK, which is not enabled")
   710   endif()
   711   file(GLOB HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/*.c)
   712   set(SOURCE_FILES ${SOURCE_FILES} ${HAPTIC_SOURCES})
   713 endif()
   714 if(SDL_POWER)
   715   file(GLOB POWER_SOURCES ${SDL2_SOURCE_DIR}/src/power/*.c)
   716   set(SOURCE_FILES ${SOURCE_FILES} ${POWER_SOURCES})
   717 endif()
   718 # TODO: in configure.in, the test for LOADSO and SDL_DLOPEN is a bit weird:
   719 # if LOADSO is not wanted, SDL_LOADSO_DISABLED is set
   720 # If however on Unix or APPLE dlopen() is detected via CheckDLOPEN(),
   721 # SDL_LOADSO_DISABLED will not be set, regardless of the LOADSO settings
   722 
   723 # General SDL subsystem options, valid for all platforms
   724 if(SDL_AUDIO)
   725   # CheckDummyAudio/CheckDiskAudio - valid for all platforms
   726   if(DUMMYAUDIO)
   727     set(SDL_AUDIO_DRIVER_DUMMY 1)
   728     file(GLOB DUMMYAUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/dummy/*.c)
   729     set(SOURCE_FILES ${SOURCE_FILES} ${DUMMYAUDIO_SOURCES})
   730     set(HAVE_DUMMYAUDIO TRUE)
   731   endif()
   732   if(DISKAUDIO)
   733     set(SDL_AUDIO_DRIVER_DISK 1)
   734     file(GLOB DISKAUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/disk/*.c)
   735     set(SOURCE_FILES ${SOURCE_FILES} ${DISKAUDIO_SOURCES})
   736     set(HAVE_DISKAUDIO TRUE)
   737   endif()
   738 endif()
   739 
   740 if(SDL_DLOPEN)
   741   # Relevant for Unix/Darwin only
   742   if(UNIX OR APPLE)
   743     CheckDLOPEN()
   744   endif()
   745 endif()
   746 
   747 if(SDL_VIDEO)
   748   if(VIDEO_DUMMY)
   749     set(SDL_VIDEO_DRIVER_DUMMY 1)
   750     file(GLOB VIDEO_DUMMY_SOURCES ${SDL2_SOURCE_DIR}/src/video/dummy/*.c)
   751     set(SOURCE_FILES ${SOURCE_FILES} ${VIDEO_DUMMY_SOURCES})
   752     set(HAVE_VIDEO_DUMMY TRUE)
   753     set(HAVE_SDL_VIDEO TRUE)
   754   endif()
   755 endif()
   756 
   757 if(ANDROID)
   758   file(GLOB ANDROID_CORE_SOURCES ${SDL2_SOURCE_DIR}/src/core/android/*.c)
   759   set(SOURCE_FILES ${SOURCE_FILES} ${ANDROID_CORE_SOURCES})
   760 
   761   # SDL_spinlock.c Needs to be compiled in ARM mode.
   762   # There seems to be no better way currently to set the ARM mode.
   763   # see: https://issuetracker.google.com/issues/62264618
   764   # Another option would be to set ARM mode to all compiled files
   765   check_c_compiler_flag(-marm HAVE_ARM_MODE)
   766   if(HAVE_ARM_MODE)
   767     set_source_files_properties(${SDL2_SOURCE_DIR}/src/atomic/SDL_spinlock.c PROPERTIES COMPILE_FLAGS -marm)
   768   endif()
   769 
   770   file(GLOB ANDROID_MAIN_SOURCES ${SDL2_SOURCE_DIR}/src/main/android/*.c)
   771   set(SDLMAIN_SOURCES ${SDLMAIN_SOURCES} ${ANDROID_MAIN_SOURCES})
   772 
   773   if(SDL_AUDIO)
   774     set(SDL_AUDIO_DRIVER_ANDROID 1)
   775     file(GLOB ANDROID_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/android/*.c)
   776     set(SOURCE_FILES ${SOURCE_FILES} ${ANDROID_AUDIO_SOURCES})
   777     set(HAVE_SDL_AUDIO TRUE)
   778   endif()
   779   if(SDL_FILESYSTEM)
   780     set(SDL_FILESYSTEM_ANDROID 1)
   781     file(GLOB ANDROID_FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/android/*.c)
   782     set(SOURCE_FILES ${SOURCE_FILES} ${ANDROID_FILESYSTEM_SOURCES})
   783     set(HAVE_SDL_FILESYSTEM TRUE)
   784   endif()
   785   if(SDL_JOYSTICK)
   786     set(SDL_JOYSTICK_ANDROID 1)
   787     file(GLOB ANDROID_JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/android/*.c)
   788     set(SOURCE_FILES ${SOURCE_FILES} ${ANDROID_JOYSTICK_SOURCES})
   789     set(HAVE_SDL_JOYSTICK TRUE)
   790   endif()
   791   if(SDL_POWER)
   792     set(SDL_POWER_ANDROID 1)
   793     file(GLOB ANDROID_POWER_SOURCES ${SDL2_SOURCE_DIR}/src/power/android/*.c)
   794     set(SOURCE_FILES ${SOURCE_FILES} ${ANDROID_POWER_SOURCES})
   795     set(HAVE_SDL_POWER TRUE)
   796   endif()
   797   if(SDL_VIDEO)
   798     set(SDL_VIDEO_DRIVER_ANDROID 1)
   799     file(GLOB ANDROID_VIDEO_SOURCES ${SDL2_SOURCE_DIR}/src/video/android/*.c)
   800     set(SOURCE_FILES ${SOURCE_FILES} ${ANDROID_VIDEO_SOURCES})
   801     set(HAVE_SDL_VIDEO TRUE)
   802 
   803     # Core stuff
   804     find_library(ANDROID_DL_LIBRARY dl)
   805     find_library(ANDROID_LOG_LIBRARY log)
   806     find_library(ANDROID_LIBRARY_LIBRARY android)
   807     list(APPEND EXTRA_LIBS ${ANDROID_DL_LIBRARY} ${ANDROID_LOG_LIBRARY} ${ANDROID_LIBRARY_LIBRARY})
   808     add_definitions(-DGL_GLEXT_PROTOTYPES)
   809 
   810     #enable gles
   811     if(VIDEO_OPENGLES)
   812       set(SDL_VIDEO_OPENGL_EGL 1)
   813       set(HAVE_VIDEO_OPENGLES TRUE)
   814       set(SDL_VIDEO_OPENGL_ES2 1)
   815       set(SDL_VIDEO_RENDER_OGL_ES2 1)
   816 
   817       find_library(OpenGLES1_LIBRARY GLESv1_CM)
   818       find_library(OpenGLES2_LIBRARY GLESv2)
   819       list(APPEND EXTRA_LIBS ${OpenGLES1_LIBRARY} ${OpenGLES2_LIBRARY})
   820     endif()
   821   endif()
   822   list(APPEND EXTRA_LDFLAGS "-Wl,--undefined=Java_org_libsdl_app_SDLActivity_nativeInit")
   823 endif()
   824 
   825 # Platform-specific options and settings
   826 if(EMSCRIPTEN)
   827   # Hide noisy warnings that intend to aid mostly during initial stages of porting a new
   828   # project. Uncomment at will for verbose cross-compiling -I/../ path info.
   829   add_definitions(-Wno-warn-absolute-paths)
   830   if(SDL_AUDIO)
   831     set(SDL_AUDIO_DRIVER_EMSCRIPTEN 1)
   832     file(GLOB EM_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/emscripten/*.c)
   833     set(SOURCE_FILES ${SOURCE_FILES} ${EM_AUDIO_SOURCES})
   834     set(HAVE_SDL_AUDIO TRUE)
   835   endif()
   836   if(SDL_FILESYSTEM)
   837     set(SDL_FILESYSTEM_EMSCRIPTEN 1)
   838     file(GLOB EM_FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/emscripten/*.c)
   839     set(SOURCE_FILES ${SOURCE_FILES} ${EM_FILESYSTEM_SOURCES})
   840     set(HAVE_SDL_FILESYSTEM TRUE)
   841   endif()
   842   if(SDL_JOYSTICK)
   843     set(SDL_JOYSTICK_EMSCRIPTEN 1)
   844     file(GLOB EM_JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/emscripten/*.c)
   845     set(SOURCE_FILES ${SOURCE_FILES} ${EM_JOYSTICK_SOURCES})
   846     set(HAVE_SDL_JOYSTICK TRUE)
   847   endif()
   848   if(SDL_POWER)
   849     set(SDL_POWER_EMSCRIPTEN 1)
   850     file(GLOB EM_POWER_SOURCES ${SDL2_SOURCE_DIR}/src/power/emscripten/*.c)
   851     set(SOURCE_FILES ${SOURCE_FILES} ${EM_POWER_SOURCES})
   852     set(HAVE_SDL_POWER TRUE)
   853   endif()
   854   if(SDL_TIMERS)
   855     set(SDL_TIMER_UNIX 1)
   856     file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/unix/*.c)
   857     set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES})
   858     set(HAVE_SDL_TIMERS TRUE)
   859 
   860     if(CLOCK_GETTIME)
   861       set(HAVE_CLOCK_GETTIME 1)
   862     endif()
   863   endif()
   864   if(SDL_VIDEO)
   865     set(SDL_VIDEO_DRIVER_EMSCRIPTEN 1)
   866     file(GLOB EM_VIDEO_SOURCES ${SDL2_SOURCE_DIR}/src/video/emscripten/*.c)
   867     set(SOURCE_FILES ${SOURCE_FILES} ${EM_VIDEO_SOURCES})
   868     set(HAVE_SDL_VIDEO TRUE)
   869 
   870     #enable gles
   871     if(VIDEO_OPENGLES)
   872       set(SDL_VIDEO_OPENGL_EGL 1)
   873       set(HAVE_VIDEO_OPENGLES TRUE)
   874       set(SDL_VIDEO_OPENGL_ES2 1)
   875       set(SDL_VIDEO_RENDER_OGL_ES2 1)
   876     endif()
   877   endif()
   878 elseif(UNIX AND NOT APPLE AND NOT ANDROID)
   879   if(SDL_AUDIO)
   880     if(SYSV5 OR SOLARIS OR HPUX)
   881         set(SDL_AUDIO_DRIVER_SUNAUDIO 1)
   882         file(GLOB SUN_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/sun/*.c)
   883         set(SOURCE_FILES ${SOURCE_FILES} ${SUN_AUDIO_SOURCES})
   884         set(HAVE_SDL_AUDIO TRUE)
   885     elseif(NETBSD)
   886         set(SDL_AUDIO_DRIVER_NETBSD 1)
   887         file(GLOB NETBSD_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/netbsd/*.c)
   888         set(SOURCE_FILES ${SOURCE_FILES} ${NETBSD_AUDIO_SOURCES})
   889         set(HAVE_SDL_AUDIO TRUE)
   890     elseif(AIX)
   891         set(SDL_AUDIO_DRIVER_PAUDIO 1)
   892         file(GLOB AIX_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/paudio/*.c)
   893         set(SOURCE_FILES ${SOURCE_FILES} ${AIX_AUDIO_SOURCES})
   894         set(HAVE_SDL_AUDIO TRUE)
   895     endif()
   896     CheckOSS()
   897     CheckALSA()
   898     CheckPulseAudio()
   899     CheckESD()
   900     CheckARTS()
   901     CheckNAS()
   902     CheckSNDIO()
   903     CheckFusionSound()
   904     CheckLibSampleRate()
   905   endif()
   906 
   907   if(SDL_VIDEO)
   908     # Need to check for Raspberry PI first and add platform specific compiler flags, otherwise the test for GLES fails!
   909     CheckRPI()
   910     CheckX11()
   911     CheckMir()
   912     CheckDirectFB()
   913     CheckOpenGLX11()
   914     CheckOpenGLESX11()
   915     CheckWayland()
   916     CheckVivante()
   917   endif()
   918 
   919   if(LINUX)
   920     check_c_source_compiles("
   921         #include <linux/input.h>
   922         #ifndef EVIOCGNAME
   923         #error EVIOCGNAME() ioctl not available
   924         #endif
   925         int main(int argc, char** argv) {}" HAVE_INPUT_EVENTS)
   926 
   927     check_c_source_compiles("
   928         #include <linux/kd.h>
   929         #include <linux/keyboard.h>
   930 
   931         int main(int argc, char **argv) 
   932         {
   933             struct kbentry kbe;
   934             kbe.kb_table = KG_CTRL;
   935             ioctl(0, KDGKBENT, &kbe);
   936         }" HAVE_INPUT_KD)
   937 
   938     file(GLOB CORE_SOURCES ${SDL2_SOURCE_DIR}/src/core/linux/*.c)
   939     set(SOURCE_FILES ${SOURCE_FILES} ${CORE_SOURCES})
   940 
   941     if(HAVE_INPUT_EVENTS)
   942       set(SDL_INPUT_LINUXEV 1)
   943     endif()
   944 
   945     if(SDL_HAPTIC AND HAVE_INPUT_EVENTS)
   946       set(SDL_HAPTIC_LINUX 1)
   947       file(GLOB HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/linux/*.c)
   948       set(SOURCE_FILES ${SOURCE_FILES} ${HAPTIC_SOURCES})
   949       set(HAVE_SDL_HAPTIC TRUE)
   950     endif()
   951 
   952     if(HAVE_INPUT_KD)
   953       set(SDL_INPUT_LINUXKD 1)
   954     endif()
   955 
   956     check_include_file("libudev.h" HAVE_LIBUDEV_H)
   957 
   958     if(PKG_CONFIG_FOUND)
   959       pkg_search_module(DBUS dbus-1 dbus)
   960       if(DBUS_FOUND)
   961         set(HAVE_DBUS_DBUS_H TRUE)
   962         include_directories(${DBUS_INCLUDE_DIRS})
   963         list(APPEND EXTRA_LIBS ${DBUS_LIBRARIES})
   964       endif()
   965 
   966       pkg_search_module(IBUS ibus-1.0 ibus)
   967       if(IBUS_FOUND)
   968         set(HAVE_IBUS_IBUS_H TRUE)
   969         include_directories(${IBUS_INCLUDE_DIRS})
   970         list(APPEND EXTRA_LIBS ${IBUS_LIBRARIES})
   971       endif()
   972     endif()
   973 
   974     check_include_file("fcitx/frontend.h" HAVE_FCITX_FRONTEND_H)
   975 
   976   endif()
   977 
   978   if(INPUT_TSLIB)
   979     check_c_source_compiles("
   980         #include \"tslib.h\"
   981         int main(int argc, char** argv) { }" HAVE_INPUT_TSLIB)
   982     if(HAVE_INPUT_TSLIB)
   983       set(SDL_INPUT_TSLIB 1)
   984       list(APPEND EXTRA_LIBS ts)
   985     endif()
   986   endif()
   987 
   988   if(SDL_JOYSTICK)
   989     CheckUSBHID()   # seems to be BSD specific - limit the test to BSD only?
   990     if(LINUX AND NOT ANDROID)
   991       set(SDL_JOYSTICK_LINUX 1)
   992       file(GLOB JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/linux/*.c)
   993       set(SOURCE_FILES ${SOURCE_FILES} ${JOYSTICK_SOURCES})
   994       set(HAVE_SDL_JOYSTICK TRUE)
   995     endif()
   996   endif()
   997 
   998   CheckPTHREAD()
   999 
  1000   if(CLOCK_GETTIME)
  1001     check_library_exists(rt clock_gettime "" FOUND_CLOCK_GETTIME)
  1002     if(FOUND_CLOCK_GETTIME)
  1003       list(APPEND EXTRA_LIBS rt)
  1004       set(HAVE_CLOCK_GETTIME 1)
  1005     else()
  1006       check_library_exists(c clock_gettime "" FOUND_CLOCK_GETTIME)
  1007       if(FOUND_CLOCK_GETTIME)
  1008         set(HAVE_CLOCK_GETTIME 1)
  1009       endif()
  1010     endif()
  1011   endif()
  1012 
  1013   check_include_file(linux/version.h HAVE_LINUX_VERSION_H)
  1014   if(HAVE_LINUX_VERSION_H)
  1015     set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DHAVE_LINUX_VERSION_H")
  1016   endif()
  1017 
  1018   if(SDL_POWER)
  1019     if(LINUX)
  1020       set(SDL_POWER_LINUX 1)
  1021       file(GLOB POWER_SOURCES ${SDL2_SOURCE_DIR}/src/power/linux/*.c)
  1022       set(SOURCE_FILES ${SOURCE_FILES} ${POWER_SOURCES})
  1023       set(HAVE_SDL_POWER TRUE)
  1024     endif()
  1025   endif()
  1026 
  1027   if(SDL_FILESYSTEM)
  1028     set(SDL_FILESYSTEM_UNIX 1)
  1029     file(GLOB FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/unix/*.c)
  1030     set(SOURCE_FILES ${SOURCE_FILES} ${FILESYSTEM_SOURCES})
  1031     set(HAVE_SDL_FILESYSTEM TRUE)
  1032   endif()
  1033 
  1034   if(SDL_TIMERS)
  1035     set(SDL_TIMER_UNIX 1)
  1036     file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/unix/*.c)
  1037     set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES})
  1038     set(HAVE_SDL_TIMERS TRUE)
  1039   endif()
  1040 
  1041   if(RPATH)
  1042     set(SDL_RLD_FLAGS "")
  1043     if(BSDI OR FREEBSD OR LINUX OR NETBSD)
  1044       set(CMAKE_REQUIRED_FLAGS "-Wl,--enable-new-dtags")
  1045       check_c_compiler_flag("" HAVE_ENABLE_NEW_DTAGS)
  1046       set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS})
  1047       if(HAVE_ENABLE_NEW_DTAGS)
  1048         set(SDL_RLD_FLAGS "-Wl,-rpath,\${libdir} -Wl,--enable-new-dtags")
  1049       else()
  1050         set(SDL_RLD_FLAGS "-Wl,-rpath,\${libdir}")
  1051       endif()
  1052     elseif(SOLARIS)
  1053       set(SDL_RLD_FLAGS "-R\${libdir}")
  1054     endif()
  1055     set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)
  1056     set(HAVE_RPATH TRUE)
  1057   endif()
  1058 
  1059 elseif(WINDOWS)
  1060   find_program(WINDRES windres)
  1061 
  1062   check_c_source_compiles("
  1063     #include <windows.h>
  1064     int main(int argc, char **argv) { }" HAVE_WIN32_CC)
  1065 
  1066   file(GLOB CORE_SOURCES ${SDL2_SOURCE_DIR}/src/core/windows/*.c)
  1067   set(SOURCE_FILES ${SOURCE_FILES} ${CORE_SOURCES})
  1068 
  1069   if(MSVC)
  1070     # Prevent codegen that would use the VC runtime libraries.
  1071     add_definitions(/GS-)
  1072     if(NOT ARCH_64)
  1073       add_definitions(/arch:SSE)
  1074     endif()
  1075   endif()
  1076 
  1077   # Check for DirectX
  1078   if(DIRECTX)
  1079     if(DEFINED MSVC_VERSION AND NOT ${MSVC_VERSION} LESS 1700)
  1080         set(USE_WINSDK_DIRECTX TRUE)
  1081     endif()
  1082     if(NOT CMAKE_COMPILER_IS_MINGW AND NOT USE_WINSDK_DIRECTX)
  1083       if("$ENV{DXSDK_DIR}" STREQUAL "")
  1084         message_error("DIRECTX requires the \$DXSDK_DIR environment variable to be set")
  1085       endif()
  1086       set(CMAKE_REQUIRED_FLAGS "/I\"$ENV{DXSDK_DIR}\\Include\"")
  1087     endif()
  1088 
  1089     if(HAVE_WIN32_CC)
  1090       # xinput.h may need windows.h, but doesn't include it itself.
  1091       check_c_source_compiles("
  1092         #include <windows.h>
  1093         #include <xinput.h>
  1094         int main(int argc, char **argv) { }" HAVE_XINPUT_H)
  1095     else()
  1096       check_include_file(xinput.h HAVE_XINPUT_H)
  1097     endif()
  1098 
  1099     check_include_file(d3d9.h HAVE_D3D_H)
  1100     check_include_file(d3d11_1.h HAVE_D3D11_H)
  1101     check_include_file(ddraw.h HAVE_DDRAW_H)
  1102     check_include_file(dsound.h HAVE_DSOUND_H)
  1103     check_include_file(dinput.h HAVE_DINPUT_H)
  1104     check_include_file(xaudio2.h HAVE_XAUDIO2_H)
  1105     check_include_file(audioclient.h HAVE_AUDIOCLIENT_H)
  1106     check_include_file(dxgi.h HAVE_DXGI_H)
  1107     if(HAVE_D3D_H OR HAVE_D3D11_H OR HAVE_DDRAW_H OR HAVE_DSOUND_H OR HAVE_DINPUT_H OR HAVE_XAUDIO2_H)
  1108       set(HAVE_DIRECTX TRUE)
  1109       if(NOT CMAKE_COMPILER_IS_MINGW AND NOT USE_WINSDK_DIRECTX)
  1110       # TODO: change $ENV{DXSDL_DIR} to get the path from the include checks
  1111         link_directories($ENV{DXSDK_DIR}\\lib\\${PROCESSOR_ARCH})
  1112         include_directories($ENV{DXSDK_DIR}\\Include)
  1113       endif()
  1114     endif()
  1115     set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS})
  1116   endif()
  1117 
  1118   if(SDL_AUDIO)
  1119     set(SDL_AUDIO_DRIVER_WINMM 1)
  1120     file(GLOB WINMM_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/winmm/*.c)
  1121     set(SOURCE_FILES ${SOURCE_FILES} ${WINMM_AUDIO_SOURCES})
  1122     set(HAVE_SDL_AUDIO TRUE)
  1123 
  1124     if(HAVE_DSOUND_H)
  1125       set(SDL_AUDIO_DRIVER_DSOUND 1)
  1126       file(GLOB DSOUND_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/directsound/*.c)
  1127       set(SOURCE_FILES ${SOURCE_FILES} ${DSOUND_AUDIO_SOURCES})
  1128     endif()
  1129 
  1130     if(HAVE_XAUDIO2_H)
  1131       set(SDL_AUDIO_DRIVER_XAUDIO2 1)
  1132       file(GLOB XAUDIO2_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/xaudio2/*.c)
  1133       set(SOURCE_FILES ${SOURCE_FILES} ${XAUDIO2_AUDIO_SOURCES})
  1134     endif()
  1135 
  1136     if(HAVE_AUDIOCLIENT_H)
  1137       set(SDL_AUDIO_DRIVER_WASAPI 1)
  1138       file(GLOB WASAPI_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/wasapi/*.c)
  1139       set(SOURCE_FILES ${SOURCE_FILES} ${WASAPI_AUDIO_SOURCES})
  1140     endif()
  1141   endif()
  1142 
  1143   if(SDL_VIDEO)
  1144     # requires SDL_LOADSO on Windows (IME, DX, etc.)
  1145     if(NOT SDL_LOADSO)
  1146       message_error("SDL_VIDEO requires SDL_LOADSO, which is not enabled")
  1147     endif()
  1148     set(SDL_VIDEO_DRIVER_WINDOWS 1)
  1149     file(GLOB WIN_VIDEO_SOURCES ${SDL2_SOURCE_DIR}/src/video/windows/*.c)
  1150     set(SOURCE_FILES ${SOURCE_FILES} ${WIN_VIDEO_SOURCES})
  1151 
  1152     if(RENDER_D3D AND HAVE_D3D_H)
  1153       set(SDL_VIDEO_RENDER_D3D 1)
  1154       set(HAVE_RENDER_D3D TRUE)
  1155     endif()
  1156     if(RENDER_D3D AND HAVE_D3D11_H)
  1157       set(SDL_VIDEO_RENDER_D3D11 1)
  1158       set(HAVE_RENDER_D3D TRUE)
  1159     endif()
  1160     set(HAVE_SDL_VIDEO TRUE)
  1161   endif()
  1162 
  1163   if(SDL_THREADS)
  1164     set(SDL_THREAD_WINDOWS 1)
  1165     set(SOURCE_FILES ${SOURCE_FILES}
  1166       ${SDL2_SOURCE_DIR}/src/thread/windows/SDL_sysmutex.c
  1167       ${SDL2_SOURCE_DIR}/src/thread/windows/SDL_syssem.c
  1168       ${SDL2_SOURCE_DIR}/src/thread/windows/SDL_systhread.c
  1169       ${SDL2_SOURCE_DIR}/src/thread/windows/SDL_systls.c
  1170       ${SDL2_SOURCE_DIR}/src/thread/generic/SDL_syscond.c)
  1171     set(HAVE_SDL_THREADS TRUE)
  1172   endif()
  1173 
  1174   if(SDL_POWER)
  1175     set(SDL_POWER_WINDOWS 1)
  1176     set(SOURCE_FILES ${SOURCE_FILES} ${SDL2_SOURCE_DIR}/src/power/windows/SDL_syspower.c)
  1177     set(HAVE_SDL_POWER TRUE)
  1178   endif()
  1179 
  1180   if(SDL_FILESYSTEM)
  1181     set(SDL_FILESYSTEM_WINDOWS 1)
  1182     file(GLOB FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/windows/*.c)
  1183     set(SOURCE_FILES ${SOURCE_FILES} ${FILESYSTEM_SOURCES})
  1184     set(HAVE_SDL_FILESYSTEM TRUE)
  1185   endif()
  1186 
  1187   # Libraries for Win32 native and MinGW
  1188   list(APPEND EXTRA_LIBS user32 gdi32 winmm imm32 ole32 oleaut32 version uuid)
  1189 
  1190   # TODO: in configure.in the check for timers is set on
  1191   # cygwin | mingw32* - does this include mingw32CE?
  1192   if(SDL_TIMERS)
  1193     set(SDL_TIMER_WINDOWS 1)
  1194     file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/windows/*.c)
  1195     set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES})
  1196     set(HAVE_SDL_TIMERS TRUE)
  1197   endif()
  1198 
  1199   if(SDL_LOADSO)
  1200     set(SDL_LOADSO_WINDOWS 1)
  1201     file(GLOB LOADSO_SOURCES ${SDL2_SOURCE_DIR}/src/loadso/windows/*.c)
  1202     set(SOURCE_FILES ${SOURCE_FILES} ${LOADSO_SOURCES})
  1203     set(HAVE_SDL_LOADSO TRUE)
  1204   endif()
  1205 
  1206   file(GLOB CORE_SOURCES ${SDL2_SOURCE_DIR}/src/core/windows/*.c)
  1207   set(SOURCE_FILES ${SOURCE_FILES} ${CORE_SOURCES})
  1208 
  1209   if(SDL_VIDEO)
  1210     if(VIDEO_OPENGL)
  1211       set(SDL_VIDEO_OPENGL 1)
  1212       set(SDL_VIDEO_OPENGL_WGL 1)
  1213       set(SDL_VIDEO_RENDER_OGL 1)
  1214       set(HAVE_VIDEO_OPENGL TRUE)
  1215     endif()
  1216 
  1217     if(VIDEO_OPENGLES)
  1218       set(SDL_VIDEO_OPENGL_EGL 1)
  1219       set(SDL_VIDEO_OPENGL_ES2 1)
  1220       set(SDL_VIDEO_RENDER_OGL_ES2 1)
  1221       set(HAVE_VIDEO_OPENGLES TRUE)
  1222     endif()
  1223   endif()
  1224 
  1225   if(SDL_JOYSTICK)
  1226     file(GLOB JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/windows/*.c)
  1227     set(SOURCE_FILES ${SOURCE_FILES} ${JOYSTICK_SOURCES})
  1228     if(HAVE_DINPUT_H)
  1229       set(SDL_JOYSTICK_DINPUT 1)
  1230       list(APPEND EXTRA_LIBS dinput8)
  1231       if(CMAKE_COMPILER_IS_MINGW)
  1232         list(APPEND EXTRA_LIBS dxerr8)
  1233       elseif (NOT USE_WINSDK_DIRECTX)
  1234         list(APPEND EXTRA_LIBS dxerr)
  1235       endif()
  1236     endif()
  1237     if(HAVE_XINPUT_H)
  1238       set(SDL_JOYSTICK_XINPUT 1)
  1239     endif()
  1240     if(NOT HAVE_DINPUT_H AND NOT HAVE_XINPUT_H)
  1241       set(SDL_JOYSTICK_WINMM 1)
  1242     endif()
  1243     set(HAVE_SDL_JOYSTICK TRUE)
  1244 
  1245     if(SDL_HAPTIC)
  1246       if(HAVE_DINPUT_H OR HAVE_XINPUT_H)
  1247         file(GLOB HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/windows/*.c)
  1248         if(HAVE_DINPUT_H)
  1249           set(SDL_HAPTIC_DINPUT 1)
  1250         endif()
  1251         if(HAVE_XINPUT_H)
  1252           set(SDL_HAPTIC_XINPUT 1)
  1253         endif()
  1254       else()
  1255         file(GLOB HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/dummy/*.c)
  1256         set(SDL_HAPTIC_DUMMY 1)
  1257       endif()
  1258       set(SOURCE_FILES ${SOURCE_FILES} ${HAPTIC_SOURCES})
  1259       set(HAVE_SDL_HAPTIC TRUE)
  1260     endif()
  1261   endif()
  1262 
  1263   file(GLOB VERSION_SOURCES ${SDL2_SOURCE_DIR}/src/main/windows/*.rc)
  1264   file(GLOB SDLMAIN_SOURCES ${SDL2_SOURCE_DIR}/src/main/windows/*.c)
  1265   if(MINGW OR CYGWIN)
  1266     list(APPEND EXTRA_LIBS mingw32)
  1267     list(APPEND EXTRA_LDFLAGS "-mwindows")
  1268     set(SDL_CFLAGS "${SDL_CFLAGS} -Dmain=SDL_main")
  1269     list(APPEND SDL_LIBS "-lmingw32" "-lSDL2main" "-mwindows")
  1270   endif()
  1271 elseif(APPLE)
  1272   # TODO: rework this for proper MacOS X, iOS and Darwin support
  1273 
  1274   # Requires the darwin file implementation
  1275   if(SDL_FILE)
  1276     file(GLOB EXTRA_SOURCES ${SDL2_SOURCE_DIR}/src/file/cocoa/*.m)
  1277     set(SOURCE_FILES ${EXTRA_SOURCES} ${SOURCE_FILES})
  1278     set_source_files_properties(${EXTRA_SOURCES} PROPERTIES LANGUAGE C)
  1279     set(HAVE_SDL_FILE TRUE)
  1280     set(SDL_FRAMEWORK_COCOA 1)
  1281     set(SDL_FRAMEWORK_COREVIDEO 1)
  1282   else()
  1283     message_error("SDL_FILE must be enabled to build on MacOS X")
  1284   endif()
  1285 
  1286   if(SDL_AUDIO)
  1287     set(SDL_AUDIO_DRIVER_COREAUDIO 1)
  1288     file(GLOB AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/coreaudio/*.m)
  1289     set(SOURCE_FILES ${SOURCE_FILES} ${AUDIO_SOURCES})
  1290     set(HAVE_SDL_AUDIO TRUE)
  1291     set(SDL_FRAMEWORK_COREAUDIO 1)
  1292     set(SDL_FRAMEWORK_AUDIOTOOLBOX 1)
  1293   endif()
  1294 
  1295   if(SDL_JOYSTICK)
  1296     set(SDL_JOYSTICK_IOKIT 1)
  1297     if (IOS)
  1298       file(GLOB JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/iphoneos/*.m)
  1299     else()
  1300       file(GLOB JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/darwin/*.c)
  1301     endif()
  1302     set(SOURCE_FILES ${SOURCE_FILES} ${JOYSTICK_SOURCES})
  1303     set(HAVE_SDL_JOYSTICK TRUE)
  1304     set(SDL_FRAMEWORK_IOKIT 1)
  1305     set(SDL_FRAMEWORK_FF 1)
  1306   endif()
  1307 
  1308   if(SDL_HAPTIC)
  1309     set(SDL_HAPTIC_IOKIT 1)
  1310     if (IOS)
  1311       file(GLOB POWER_SOURCES ${SDL2_SOURCE_DIR}/src/power/dummy/*.c)
  1312       set(SDL_HAPTIC_DUMMY 1)
  1313     else()
  1314       file(GLOB HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/darwin/*.c)
  1315     endif()
  1316     set(SOURCE_FILES ${SOURCE_FILES} ${HAPTIC_SOURCES})
  1317     set(HAVE_SDL_HAPTIC TRUE)
  1318     set(SDL_FRAMEWORK_IOKIT 1)
  1319     set(SDL_FRAMEWORK_FF 1)
  1320     if(NOT SDL_JOYSTICK)
  1321       message(FATAL_ERROR "SDL_HAPTIC requires SDL_JOYSTICK to be enabled")
  1322     endif()
  1323   endif()
  1324 
  1325   if(SDL_POWER)
  1326     set(SDL_POWER_MACOSX 1)
  1327     if (IOS)
  1328       file(GLOB POWER_SOURCES ${SDL2_SOURCE_DIR}/src/power/uikit/*.m)
  1329     else()
  1330       file(GLOB POWER_SOURCES ${SDL2_SOURCE_DIR}/src/power/macosx/*.c)
  1331     endif()
  1332     set(SOURCE_FILES ${SOURCE_FILES} ${POWER_SOURCES})
  1333     set(HAVE_SDL_POWER TRUE)
  1334     set(SDL_FRAMEWORK_CARBON 1)
  1335     set(SDL_FRAMEWORK_IOKIT 1)
  1336   endif()
  1337 
  1338   if(SDL_TIMERS)
  1339     set(SDL_TIMER_UNIX 1)
  1340     file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/unix/*.c)
  1341     set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES})
  1342     set(HAVE_SDL_TIMERS TRUE)
  1343   endif(SDL_TIMERS)
  1344 
  1345   if(SDL_FILESYSTEM)
  1346     set(SDL_FILESYSTEM_COCOA 1)
  1347     file(GLOB FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/cocoa/*.m)
  1348     set_source_files_properties(${FILESYSTEM_SOURCES} PROPERTIES LANGUAGE C)
  1349     set(SOURCE_FILES ${SOURCE_FILES} ${FILESYSTEM_SOURCES})
  1350     set(HAVE_SDL_FILESYSTEM TRUE)
  1351   endif()
  1352 
  1353   # Actually load the frameworks at the end so we don't duplicate include.
  1354   if(SDL_FRAMEWORK_COREVIDEO)
  1355     find_library(COREVIDEO CoreVideo)
  1356     list(APPEND EXTRA_LIBS ${COREVIDEO})
  1357   endif()
  1358   if(SDL_FRAMEWORK_COCOA)
  1359     find_library(COCOA_LIBRARY Cocoa)
  1360     list(APPEND EXTRA_LIBS ${COCOA_LIBRARY})
  1361   endif()
  1362   if(SDL_FRAMEWORK_IOKIT)
  1363     find_library(IOKIT IOKit)
  1364     list(APPEND EXTRA_LIBS ${IOKIT})
  1365   endif()
  1366   if(SDL_FRAMEWORK_FF)
  1367     find_library(FORCEFEEDBACK ForceFeedback)
  1368     list(APPEND EXTRA_LIBS ${FORCEFEEDBACK})
  1369   endif()
  1370   if(SDL_FRAMEWORK_CARBON)
  1371     find_library(CARBON_LIBRARY Carbon)
  1372     list(APPEND EXTRA_LIBS ${CARBON_LIBRARY})
  1373   endif()
  1374   if(SDL_FRAMEWORK_COREAUDIO)
  1375     find_library(COREAUDIO CoreAudio)
  1376     list(APPEND EXTRA_LIBS ${COREAUDIO})
  1377   endif()
  1378   if(SDL_FRAMEWORK_AUDIOTOOLBOX)
  1379     find_library(AUDIOTOOLBOX AudioToolbox)
  1380     list(APPEND EXTRA_LIBS ${AUDIOTOOLBOX})
  1381   endif()
  1382 
  1383   # iOS hack needed - http://code.google.com/p/ios-cmake/ ?
  1384   if(SDL_VIDEO)
  1385     if (IOS)
  1386       set(SDL_VIDEO_DRIVER_UIKIT 1)
  1387       file(GLOB UIKITVIDEO_SOURCES ${SDL2_SOURCE_DIR}/src/video/uikit/*.m)
  1388       set(SOURCE_FILES ${SOURCE_FILES} ${UIKITVIDEO_SOURCES})
  1389     else()
  1390       CheckCOCOA()
  1391       if(VIDEO_OPENGL)
  1392         set(SDL_VIDEO_OPENGL 1)
  1393         set(SDL_VIDEO_OPENGL_CGL 1)
  1394         set(SDL_VIDEO_RENDER_OGL 1)
  1395         set(HAVE_VIDEO_OPENGL TRUE)
  1396       endif()
  1397     endif()
  1398   endif()
  1399 
  1400   CheckPTHREAD()
  1401 elseif(HAIKU)
  1402   if(SDL_VIDEO)
  1403     set(SDL_VIDEO_DRIVER_HAIKU 1)
  1404     file(GLOB HAIKUVIDEO_SOURCES ${SDL2_SOURCE_DIR}/src/video/haiku/*.c)
  1405     set(SOURCE_FILES ${SOURCE_FILES} ${HAIKUVIDEO_SOURCES})
  1406     set(HAVE_SDL_VIDEO TRUE)
  1407 
  1408     set(SDL_FILESYSTEM_HAIKU 1)
  1409     file(GLOB FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/haiku/*.cc)
  1410     set(SOURCE_FILES ${SOURCE_FILES} ${FILESYSTEM_SOURCES})
  1411     set(HAVE_SDL_FILESYSTEM TRUE)
  1412 
  1413     if(SDL_TIMERS)
  1414       set(SDL_TIMER_HAIKU 1)
  1415       file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/haiku/*.c)
  1416       set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES})
  1417       set(HAVE_SDL_TIMERS TRUE)
  1418     endif(SDL_TIMERS)
  1419 
  1420     if(VIDEO_OPENGL)
  1421       # TODO: Use FIND_PACKAGE(OpenGL) instead
  1422       set(SDL_VIDEO_OPENGL 1)
  1423       set(SDL_VIDEO_OPENGL_BGL 1)
  1424       set(SDL_VIDEO_RENDER_OGL 1)
  1425       list(APPEND EXTRA_LIBS GL)
  1426       set(HAVE_VIDEO_OPENGL TRUE)
  1427     endif()
  1428   endif()
  1429 
  1430   CheckPTHREAD()
  1431 endif()
  1432 
  1433 # Dummies
  1434 # configure.in does it differently:
  1435 # if not have X
  1436 #   if enable_X {  SDL_X_DISABLED = 1 }
  1437 #   [add dummy sources]
  1438 # so it always adds a dummy, without checking, if it was actually requested.
  1439 # This leads to missing internal references on building, since the
  1440 # src/X/*.c does not get included.
  1441 if(NOT HAVE_SDL_JOYSTICK)
  1442   set(SDL_JOYSTICK_DISABLED 1)
  1443   if(SDL_JOYSTICK AND NOT APPLE) # results in unresolved symbols on OSX
  1444 
  1445     file(GLOB JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/dummy/*.c)
  1446     set(SOURCE_FILES ${SOURCE_FILES} ${JOYSTICK_SOURCES})
  1447   endif()
  1448 endif()
  1449 if(NOT HAVE_SDL_HAPTIC)
  1450   set(SDL_HAPTIC_DISABLED 1)
  1451   file(GLOB HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/dummy/*.c)
  1452   set(SOURCE_FILES ${SOURCE_FILES} ${HAPTIC_SOURCES})
  1453 endif()
  1454 if(NOT HAVE_SDL_LOADSO)
  1455   set(SDL_LOADSO_DISABLED 1)
  1456   file(GLOB LOADSO_SOURCES ${SDL2_SOURCE_DIR}/src/loadso/dummy/*.c)
  1457   set(SOURCE_FILES ${SOURCE_FILES} ${LOADSO_SOURCES})
  1458 endif()
  1459 if(NOT HAVE_SDL_FILESYSTEM)
  1460   set(SDL_FILESYSTEM_DISABLED 1)
  1461   file(GLOB FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/dummy/*.c)
  1462   set(SOURCE_FILES ${SOURCE_FILES} ${FILESYSTEM_SOURCES})
  1463 endif()
  1464 
  1465 # We always need to have threads and timers around
  1466 if(NOT HAVE_SDL_THREADS)
  1467   set(SDL_THREADS_DISABLED 1)
  1468   file(GLOB THREADS_SOURCES ${SDL2_SOURCE_DIR}/src/thread/generic/*.c)
  1469   set(SOURCE_FILES ${SOURCE_FILES} ${THREADS_SOURCES})
  1470 endif()
  1471 if(NOT HAVE_SDL_TIMERS)
  1472   set(SDL_TIMERS_DISABLED 1)
  1473   file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/dummy/*.c)
  1474   set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES})
  1475 endif()
  1476 
  1477 if(NOT SDLMAIN_SOURCES)
  1478   file(GLOB SDLMAIN_SOURCES ${SDL2_SOURCE_DIR}/src/main/dummy/*.c)
  1479 endif()
  1480 
  1481 # Append the -MMD -MT flags
  1482 # if(DEPENDENCY_TRACKING)
  1483 #   if(COMPILER_IS_GNUCC)
  1484 #     set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -MMD -MT \$@")
  1485 #   endif()
  1486 # endif()
  1487 
  1488 configure_file("${SDL2_SOURCE_DIR}/include/SDL_config.h.cmake"
  1489   "${SDL2_BINARY_DIR}/include/SDL_config.h")
  1490 
  1491 # Prepare the flags and remove duplicates
  1492 if(EXTRA_LDFLAGS)
  1493   list(REMOVE_DUPLICATES EXTRA_LDFLAGS)
  1494 endif()
  1495 if(EXTRA_LIBS)
  1496   list(REMOVE_DUPLICATES EXTRA_LIBS)
  1497 endif()
  1498 if(EXTRA_CFLAGS)
  1499   list(REMOVE_DUPLICATES EXTRA_CFLAGS)
  1500 endif()
  1501 listtostr(EXTRA_CFLAGS _EXTRA_CFLAGS)
  1502 set(EXTRA_CFLAGS ${_EXTRA_CFLAGS})
  1503 
  1504 # Compat helpers for the configuration files
  1505 if(NOT WINDOWS OR CYGWIN)
  1506   # TODO: we need a Windows script, too
  1507   execute_process(COMMAND sh ${SDL2_SOURCE_DIR}/build-scripts/updaterev.sh)
  1508 
  1509   set(prefix ${CMAKE_INSTALL_PREFIX})
  1510   set(exec_prefix "\${prefix}")
  1511   set(libdir "\${exec_prefix}/lib${LIB_SUFFIX}")
  1512   set(bindir "\${exec_prefix}/bin")
  1513   set(includedir "\${prefix}/include")
  1514   if(SDL_STATIC)
  1515     set(ENABLE_STATIC_TRUE "")
  1516     set(ENABLE_STATIC_FALSE "#")
  1517   else()
  1518     set(ENABLE_STATIC_TRUE "#")
  1519     set(ENABLE_STATIC_FALSE "")
  1520   endif()
  1521   if(SDL_SHARED)
  1522     set(ENABLE_SHARED_TRUE "")
  1523     set(ENABLE_SHARED_FALSE "#")
  1524   else()
  1525     set(ENABLE_SHARED_TRUE "#")
  1526     set(ENABLE_SHARED_FALSE "")
  1527   endif()
  1528 
  1529   # Clean up the different lists
  1530   listtostr(EXTRA_LIBS _EXTRA_LIBS "-l")
  1531   set(SDL_STATIC_LIBS ${SDL_LIBS} ${EXTRA_LDFLAGS} ${_EXTRA_LIBS})
  1532   list(REMOVE_DUPLICATES SDL_STATIC_LIBS)
  1533   listtostr(SDL_STATIC_LIBS _SDL_STATIC_LIBS)
  1534   set(SDL_STATIC_LIBS ${_SDL_STATIC_LIBS})
  1535   listtostr(SDL_LIBS _SDL_LIBS)
  1536   set(SDL_LIBS ${_SDL_LIBS})
  1537 
  1538   # MESSAGE(STATUS "SDL_LIBS: ${SDL_LIBS}")
  1539   # MESSAGE(STATUS "SDL_STATIC_LIBS: ${SDL_STATIC_LIBS}")
  1540 
  1541   configure_file("${SDL2_SOURCE_DIR}/sdl2.pc.in"
  1542     "${SDL2_BINARY_DIR}/sdl2.pc" @ONLY)
  1543   configure_file("${SDL2_SOURCE_DIR}/sdl2-config.in"
  1544     "${SDL2_BINARY_DIR}/sdl2-config")
  1545   configure_file("${SDL2_SOURCE_DIR}/sdl2-config.in"
  1546     "${SDL2_BINARY_DIR}/sdl2-config" @ONLY)
  1547   configure_file("${SDL2_SOURCE_DIR}/SDL2.spec.in"
  1548     "${SDL2_BINARY_DIR}/SDL2.spec" @ONLY)
  1549 endif()
  1550 
  1551 ##### Info output #####
  1552 message(STATUS "")
  1553 message(STATUS "SDL2 was configured with the following options:")
  1554 message(STATUS "")
  1555 message(STATUS "Platform: ${CMAKE_SYSTEM}")
  1556 message(STATUS "64-bit:   ${ARCH_64}")
  1557 message(STATUS "Compiler: ${CMAKE_C_COMPILER}")
  1558 message(STATUS "")
  1559 message(STATUS "Subsystems:")
  1560 foreach(_SUB ${SDL_SUBSYSTEMS})
  1561   string(TOUPPER ${_SUB} _OPT)
  1562   message_bool_option(${_SUB} SDL_${_OPT})
  1563 endforeach()
  1564 message(STATUS "")
  1565 message(STATUS "Options:")
  1566 list(SORT ALLOPTIONS)
  1567 foreach(_OPT ${ALLOPTIONS})
  1568   # Longest option is VIDEO_X11_XSCREENSAVER = 22 characters
  1569   # Get the padding
  1570   string(LENGTH ${_OPT} _OPTLEN)
  1571   math(EXPR _PADLEN "23 - ${_OPTLEN}")
  1572   string(RANDOM LENGTH ${_PADLEN} ALPHABET " " _PADDING)
  1573   message_tested_option(${_OPT} ${_PADDING})
  1574 endforeach()
  1575 message(STATUS "")
  1576 message(STATUS " CFLAGS:        ${CMAKE_C_FLAGS}")
  1577 message(STATUS " EXTRA_CFLAGS:  ${EXTRA_CFLAGS}")
  1578 message(STATUS " EXTRA_LDFLAGS: ${EXTRA_LDFLAGS}")
  1579 message(STATUS " EXTRA_LIBS:    ${EXTRA_LIBS}")
  1580 message(STATUS "")
  1581 message(STATUS " Build Shared Library: ${SDL_SHARED}")
  1582 message(STATUS " Build Static Library: ${SDL_STATIC}")
  1583 if(SDL_STATIC)
  1584     message(STATUS " Build Static Library with Position Independent Code: ${SDL_STATIC_PIC}")
  1585 endif()
  1586 message(STATUS "")
  1587 if(UNIX)
  1588   message(STATUS "If something was not detected, although the libraries")
  1589   message(STATUS "were installed, then make sure you have set the")
  1590   message(STATUS "CFLAGS and LDFLAGS environment variables correctly.")
  1591   message(STATUS "")
  1592 endif()
  1593 
  1594 # Ensure that the extra cflags are used at compile time
  1595 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS}")
  1596 
  1597 # Always build SDLmain
  1598 add_library(SDL2main STATIC ${SDLMAIN_SOURCES})
  1599 set(_INSTALL_LIBS "SDL2main")
  1600 
  1601 if(SDL_SHARED)
  1602   add_library(SDL2 SHARED ${SOURCE_FILES} ${VERSION_SOURCES})
  1603   if(UNIX AND NOT ANDROID)
  1604     set_target_properties(SDL2 PROPERTIES
  1605       VERSION ${LT_VERSION}
  1606       SOVERSION ${LT_REVISION}
  1607       OUTPUT_NAME "SDL2-${LT_RELEASE}")
  1608   else()
  1609     set_target_properties(SDL2 PROPERTIES
  1610       VERSION ${SDL_VERSION}
  1611       SOVERSION ${LT_REVISION}
  1612       OUTPUT_NAME "SDL2")
  1613   endif()
  1614   if(MSVC AND NOT LIBC)
  1615     # Don't try to link with the default set of libraries.
  1616     set_target_properties(SDL2 PROPERTIES LINK_FLAGS_RELEASE "/NODEFAULTLIB")
  1617     set_target_properties(SDL2 PROPERTIES LINK_FLAGS_DEBUG "/NODEFAULTLIB")
  1618     set_target_properties(SDL2 PROPERTIES STATIC_LIBRARY_FLAGS "/NODEFAULTLIB")
  1619   endif()
  1620   set(_INSTALL_LIBS "SDL2" ${_INSTALL_LIBS})
  1621   target_link_libraries(SDL2 ${EXTRA_LIBS} ${EXTRA_LDFLAGS})
  1622 endif()
  1623 
  1624 if(SDL_STATIC)
  1625   set (BUILD_SHARED_LIBS FALSE)
  1626   add_library(SDL2-static STATIC ${SOURCE_FILES})
  1627   set_target_properties(SDL2-static PROPERTIES OUTPUT_NAME "SDL2")
  1628   set_target_properties(SDL2-static PROPERTIES POSITION_INDEPENDENT_CODE ${SDL_STATIC_PIC})
  1629   if(MSVC AND NOT LIBC)
  1630     set_target_properties(SDL2-static PROPERTIES LINK_FLAGS_RELEASE "/NODEFAULTLIB")
  1631     set_target_properties(SDL2-static PROPERTIES LINK_FLAGS_DEBUG "/NODEFAULTLIB")
  1632     set_target_properties(SDL2-static PROPERTIES STATIC_LIBRARY_FLAGS "/NODEFAULTLIB")
  1633   endif()
  1634   # TODO: Win32 platforms keep the same suffix .lib for import and static
  1635   # libraries - do we need to consider this?
  1636   set(_INSTALL_LIBS "SDL2-static" ${_INSTALL_LIBS})
  1637   target_link_libraries(SDL2-static ${EXTRA_LIBS} ${EXTRA_LDFLAGS})
  1638 endif()
  1639 
  1640 ##### Installation targets #####
  1641 install(TARGETS ${_INSTALL_LIBS}
  1642   LIBRARY DESTINATION "lib${LIB_SUFFIX}"
  1643   ARCHIVE DESTINATION "lib${LIB_SUFFIX}"
  1644   RUNTIME DESTINATION bin)
  1645 
  1646 file(GLOB INCLUDE_FILES ${SDL2_SOURCE_DIR}/include/*.h)
  1647 file(GLOB BIN_INCLUDE_FILES ${SDL2_BINARY_DIR}/include/*.h)
  1648 foreach(_FNAME ${BIN_INCLUDE_FILES})
  1649   get_filename_component(_INCNAME ${_FNAME} NAME)
  1650   list(REMOVE_ITEM INCLUDE_FILES ${SDL2_SOURCE_DIR}/include/${_INCNAME})
  1651 endforeach()
  1652 list(APPEND INCLUDE_FILES ${BIN_INCLUDE_FILES})
  1653 install(FILES ${INCLUDE_FILES} DESTINATION include/SDL2)
  1654 
  1655 if(NOT (WINDOWS OR CYGWIN))
  1656   if(SDL_SHARED)
  1657     if (APPLE)
  1658         set(SOEXT "dylib")
  1659     else()
  1660         set(SOEXT "so")
  1661     endif()
  1662     install(CODE "
  1663       execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink
  1664       \"libSDL2-2.0.${SOEXT}\" \"libSDL2.${SOEXT}\")")
  1665     install(FILES ${SDL2_BINARY_DIR}/libSDL2.${SOEXT} DESTINATION "lib${LIB_SUFFIX}")
  1666   endif()
  1667   if(FREEBSD)
  1668     # FreeBSD uses ${PREFIX}/libdata/pkgconfig
  1669     install(FILES ${SDL2_BINARY_DIR}/sdl2.pc DESTINATION "libdata/pkgconfig")
  1670   else()
  1671     install(FILES ${SDL2_BINARY_DIR}/sdl2.pc
  1672       DESTINATION "lib${LIB_SUFFIX}/pkgconfig")
  1673   endif()
  1674   install(PROGRAMS ${SDL2_BINARY_DIR}/sdl2-config DESTINATION bin)
  1675   # TODO: what about the .spec file? Is it only needed for RPM creation?
  1676   install(FILES "${SDL2_SOURCE_DIR}/sdl2.m4" DESTINATION "${CMAKE_INSTALL_FULL_DATAROOTDIR}/aclocal")
  1677 endif()
  1678 
  1679 ##### Uninstall target #####
  1680 
  1681 configure_file(
  1682     "${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake.in"
  1683     "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
  1684     IMMEDIATE @ONLY)
  1685 
  1686 add_custom_target(uninstall
  1687     COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake)