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