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