CMakeLists.txt
author Ryan C. Gordon <icculus@icculus.org>
Tue, 29 Dec 2015 00:57:24 -0500
changeset 9982 9145e51b15bb
parent 9981 a443c97eb294
child 9994 d3e4f7b44d4d
permissions -rw-r--r--
CMake: Changes to get CMake project to work with Android (thanks, Martin!).

Fixes Bugzilla #3194.

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