CMakeLists.txt
author Alex Szpakowski <slime73@gmail.com>
Sat, 01 Oct 2016 17:05:29 -0300
changeset 10424 543367861d69
parent 10421 55fd4e519a58
child 10447 2e197b249d68
permissions -rw-r--r--
Fix CMake setting an incorrect video backend on iOS
     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 5)
    44 set(SDL_INTERFACE_AGE 1)
    45 set(SDL_BINARY_AGE 5)
    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 "${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     if(PKG_CONFIG_FOUND)
   903       pkg_search_module(DBUS dbus-1 dbus)
   904       if(DBUS_FOUND)
   905         set(HAVE_DBUS_DBUS_H TRUE)
   906         include_directories(${DBUS_INCLUDE_DIRS})
   907         list(APPEND EXTRA_LIBS ${DBUS_LIBRARIES})
   908       endif()
   909 
   910       pkg_search_module(IBUS ibus-1.0 ibus)
   911       if(IBUS_FOUND)
   912         set(HAVE_IBUS_IBUS_H TRUE)
   913         include_directories(${IBUS_INCLUDE_DIRS})
   914         list(APPEND EXTRA_LIBS ${IBUS_LIBRARIES})
   915       endif()
   916     endif()
   917 
   918   endif()
   919 
   920   if(INPUT_TSLIB)
   921     check_c_source_compiles("
   922         #include \"tslib.h\"
   923         int main(int argc, char** argv) { }" HAVE_INPUT_TSLIB)
   924     if(HAVE_INPUT_TSLIB)
   925       set(SDL_INPUT_TSLIB 1)
   926       list(APPEND EXTRA_LIBS ts)
   927     endif()
   928   endif()
   929 
   930   if(SDL_JOYSTICK)
   931     CheckUSBHID()   # seems to be BSD specific - limit the test to BSD only?
   932     if(LINUX AND NOT ANDROID)
   933       set(SDL_JOYSTICK_LINUX 1)
   934       file(GLOB JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/linux/*.c)
   935       set(SOURCE_FILES ${SOURCE_FILES} ${JOYSTICK_SOURCES})
   936       set(HAVE_SDL_JOYSTICK TRUE)
   937     endif()
   938   endif()
   939 
   940   CheckPTHREAD()
   941 
   942   if(CLOCK_GETTIME)
   943     check_library_exists(rt clock_gettime "" FOUND_CLOCK_GETTIME)
   944     if(FOUND_CLOCK_GETTIME)
   945       list(APPEND EXTRA_LIBS rt)
   946       set(HAVE_CLOCK_GETTIME 1)
   947     else()
   948       check_library_exists(c clock_gettime "" FOUND_CLOCK_GETTIME)
   949       if(FOUND_CLOCK_GETTIME)
   950         set(HAVE_CLOCK_GETTIME 1)
   951       endif()
   952     endif()
   953   endif()
   954 
   955   check_include_file(linux/version.h HAVE_LINUX_VERSION_H)
   956   if(HAVE_LINUX_VERSION_H)
   957     set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DHAVE_LINUX_VERSION_H")
   958   endif()
   959 
   960   if(SDL_POWER)
   961     if(LINUX)
   962       set(SDL_POWER_LINUX 1)
   963       file(GLOB POWER_SOURCES ${SDL2_SOURCE_DIR}/src/power/linux/*.c)
   964       set(SOURCE_FILES ${SOURCE_FILES} ${POWER_SOURCES})
   965       set(HAVE_SDL_POWER TRUE)
   966     endif()
   967   endif()
   968 
   969   if(SDL_FILESYSTEM)
   970     set(SDL_FILESYSTEM_UNIX 1)
   971     file(GLOB FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/unix/*.c)
   972     set(SOURCE_FILES ${SOURCE_FILES} ${FILESYSTEM_SOURCES})
   973     set(HAVE_SDL_FILESYSTEM TRUE)
   974   endif()
   975 
   976   if(SDL_TIMERS)
   977     set(SDL_TIMER_UNIX 1)
   978     file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/unix/*.c)
   979     set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES})
   980     set(HAVE_SDL_TIMERS TRUE)
   981   endif()
   982 
   983   if(RPATH)
   984     set(SDL_RLD_FLAGS "")
   985     if(BSDI OR FREEBSD OR LINUX OR NETBSD)
   986       set(CMAKE_REQUIRED_FLAGS "-Wl,--enable-new-dtags")
   987       check_c_compiler_flag("" HAVE_ENABLE_NEW_DTAGS)
   988       set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS})
   989       if(HAVE_ENABLE_NEW_DTAGS)
   990         set(SDL_RLD_FLAGS "-Wl,-rpath,\${libdir} -Wl,--enable-new-dtags")
   991       else()
   992         set(SDL_RLD_FLAGS "-Wl,-rpath,\${libdir}")
   993       endif()
   994     elseif(SOLARIS)
   995       set(SDL_RLD_FLAGS "-R\${libdir}")
   996     endif()
   997     set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)
   998     set(HAVE_RPATH TRUE)
   999   endif()
  1000 
  1001 elseif(WINDOWS)
  1002   find_program(WINDRES windres)
  1003 
  1004   check_c_source_compiles("
  1005     #include <windows.h>
  1006     int main(int argc, char **argv) { }" HAVE_WIN32_CC)
  1007 
  1008   file(GLOB CORE_SOURCES ${SDL2_SOURCE_DIR}/src/core/windows/*.c)
  1009   set(SOURCE_FILES ${SOURCE_FILES} ${CORE_SOURCES})
  1010 
  1011   if(MSVC)
  1012     # Prevent codegen that would use the VC runtime libraries.
  1013     add_definitions(/GS-)
  1014     if(NOT ARCH_64)
  1015       add_definitions(/arch:SSE)
  1016     endif()
  1017   endif()
  1018 
  1019   # Check for DirectX
  1020   if(DIRECTX)
  1021     if(DEFINED MSVC_VERSION AND NOT ${MSVC_VERSION} LESS 1700)
  1022         set(USE_WINSDK_DIRECTX TRUE)
  1023     endif()
  1024     if(NOT CMAKE_COMPILER_IS_MINGW AND NOT USE_WINSDK_DIRECTX)
  1025       if("$ENV{DXSDK_DIR}" STREQUAL "")
  1026         message_error("DIRECTX requires the \$DXSDK_DIR environment variable to be set")
  1027       endif()
  1028       set(CMAKE_REQUIRED_FLAGS "/I\"$ENV{DXSDK_DIR}\\Include\"")
  1029     endif()
  1030 
  1031     if(HAVE_WIN32_CC)
  1032       # xinput.h may need windows.h, but doesn't include it itself.
  1033       check_c_source_compiles("
  1034         #include <windows.h>
  1035         #include <xinput.h>
  1036         int main(int argc, char **argv) { }" HAVE_XINPUT_H)
  1037     else()
  1038       check_include_file(xinput.h HAVE_XINPUT_H)
  1039     endif()
  1040 
  1041     check_include_file(d3d9.h HAVE_D3D_H)
  1042     check_include_file(d3d11_1.h HAVE_D3D11_H)
  1043     check_include_file(ddraw.h HAVE_DDRAW_H)
  1044     check_include_file(dsound.h HAVE_DSOUND_H)
  1045     check_include_file(dinput.h HAVE_DINPUT_H)
  1046     check_include_file(xaudio2.h HAVE_XAUDIO2_H)
  1047     check_include_file(dxgi.h HAVE_DXGI_H)
  1048     if(HAVE_D3D_H OR HAVE_D3D11_H OR HAVE_DDRAW_H OR HAVE_DSOUND_H OR HAVE_DINPUT_H OR HAVE_XAUDIO2_H)
  1049       set(HAVE_DIRECTX TRUE)
  1050       if(NOT CMAKE_COMPILER_IS_MINGW AND NOT USE_WINSDK_DIRECTX)
  1051       # TODO: change $ENV{DXSDL_DIR} to get the path from the include checks
  1052         link_directories($ENV{DXSDK_DIR}\\lib\\${PROCESSOR_ARCH})
  1053         include_directories($ENV{DXSDK_DIR}\\Include)
  1054       endif()
  1055     endif()
  1056     set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS})
  1057   endif()
  1058 
  1059   if(SDL_AUDIO)
  1060     set(SDL_AUDIO_DRIVER_WINMM 1)
  1061     file(GLOB WINMM_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/winmm/*.c)
  1062     set(SOURCE_FILES ${SOURCE_FILES} ${WINMM_AUDIO_SOURCES})
  1063     set(HAVE_SDL_AUDIO TRUE)
  1064 
  1065     if(HAVE_DSOUND_H)
  1066       set(SDL_AUDIO_DRIVER_DSOUND 1)
  1067       file(GLOB DSOUND_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/directsound/*.c)
  1068       set(SOURCE_FILES ${SOURCE_FILES} ${DSOUND_AUDIO_SOURCES})
  1069     endif()
  1070 
  1071     if(HAVE_XAUDIO2_H)
  1072       set(SDL_AUDIO_DRIVER_XAUDIO2 1)
  1073       file(GLOB XAUDIO2_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/xaudio2/*.c)
  1074       set(SOURCE_FILES ${SOURCE_FILES} ${XAUDIO2_AUDIO_SOURCES})
  1075     endif()
  1076   endif()
  1077 
  1078   if(SDL_VIDEO)
  1079     # requires SDL_LOADSO on Windows (IME, DX, etc.)
  1080     if(NOT SDL_LOADSO)
  1081       message_error("SDL_VIDEO requires SDL_LOADSO, which is not enabled")
  1082     endif()
  1083     set(SDL_VIDEO_DRIVER_WINDOWS 1)
  1084     file(GLOB WIN_VIDEO_SOURCES ${SDL2_SOURCE_DIR}/src/video/windows/*.c)
  1085     set(SOURCE_FILES ${SOURCE_FILES} ${WIN_VIDEO_SOURCES})
  1086 
  1087     if(RENDER_D3D AND HAVE_D3D_H)
  1088       set(SDL_VIDEO_RENDER_D3D 1)
  1089       set(HAVE_RENDER_D3D TRUE)
  1090     endif()
  1091     if(RENDER_D3D AND HAVE_D3D11_H)
  1092       set(SDL_VIDEO_RENDER_D3D11 1)
  1093       set(HAVE_RENDER_D3D TRUE)
  1094     endif()
  1095     set(HAVE_SDL_VIDEO TRUE)
  1096   endif()
  1097 
  1098   if(SDL_THREADS)
  1099     set(SDL_THREAD_WINDOWS 1)
  1100     set(SOURCE_FILES ${SOURCE_FILES}
  1101       ${SDL2_SOURCE_DIR}/src/thread/windows/SDL_sysmutex.c
  1102       ${SDL2_SOURCE_DIR}/src/thread/windows/SDL_syssem.c
  1103       ${SDL2_SOURCE_DIR}/src/thread/windows/SDL_systhread.c
  1104       ${SDL2_SOURCE_DIR}/src/thread/windows/SDL_systls.c
  1105       ${SDL2_SOURCE_DIR}/src/thread/generic/SDL_syscond.c)
  1106     set(HAVE_SDL_THREADS TRUE)
  1107   endif()
  1108 
  1109   if(SDL_POWER)
  1110     set(SDL_POWER_WINDOWS 1)
  1111     set(SOURCE_FILES ${SOURCE_FILES} ${SDL2_SOURCE_DIR}/src/power/windows/SDL_syspower.c)
  1112     set(HAVE_SDL_POWER TRUE)
  1113   endif()
  1114 
  1115   if(SDL_FILESYSTEM)
  1116     set(SDL_FILESYSTEM_WINDOWS 1)
  1117     file(GLOB FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/windows/*.c)
  1118     set(SOURCE_FILES ${SOURCE_FILES} ${FILESYSTEM_SOURCES})
  1119     set(HAVE_SDL_FILESYSTEM TRUE)
  1120   endif()
  1121 
  1122   # Libraries for Win32 native and MinGW
  1123   list(APPEND EXTRA_LIBS user32 gdi32 winmm imm32 ole32 oleaut32 version uuid)
  1124 
  1125   # TODO: in configure.in the check for timers is set on
  1126   # cygwin | mingw32* - does this include mingw32CE?
  1127   if(SDL_TIMERS)
  1128     set(SDL_TIMER_WINDOWS 1)
  1129     file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/windows/*.c)
  1130     set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES})
  1131     set(HAVE_SDL_TIMERS TRUE)
  1132   endif()
  1133 
  1134   if(SDL_LOADSO)
  1135     set(SDL_LOADSO_WINDOWS 1)
  1136     file(GLOB LOADSO_SOURCES ${SDL2_SOURCE_DIR}/src/loadso/windows/*.c)
  1137     set(SOURCE_FILES ${SOURCE_FILES} ${LOADSO_SOURCES})
  1138     set(HAVE_SDL_LOADSO TRUE)
  1139   endif()
  1140 
  1141   file(GLOB CORE_SOURCES ${SDL2_SOURCE_DIR}/src/core/windows/*.c)
  1142   set(SOURCE_FILES ${SOURCE_FILES} ${CORE_SOURCES})
  1143 
  1144   if(SDL_VIDEO)
  1145     if(VIDEO_OPENGL)
  1146       set(SDL_VIDEO_OPENGL 1)
  1147       set(SDL_VIDEO_OPENGL_WGL 1)
  1148       set(SDL_VIDEO_RENDER_OGL 1)
  1149       set(HAVE_VIDEO_OPENGL TRUE)
  1150     endif()
  1151 
  1152     if(VIDEO_OPENGLES)
  1153       set(SDL_VIDEO_OPENGL_EGL 1)
  1154       set(SDL_VIDEO_OPENGL_ES2 1)
  1155       set(SDL_VIDEO_RENDER_OGL_ES2 1)
  1156       set(HAVE_VIDEO_OPENGLES TRUE)
  1157     endif()
  1158   endif()
  1159 
  1160   if(SDL_JOYSTICK)
  1161     file(GLOB JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/windows/*.c)
  1162     set(SOURCE_FILES ${SOURCE_FILES} ${JOYSTICK_SOURCES})
  1163     if(HAVE_DINPUT_H)
  1164       set(SDL_JOYSTICK_DINPUT 1)
  1165       list(APPEND EXTRA_LIBS dinput8)
  1166       if(CMAKE_COMPILER_IS_MINGW)
  1167         list(APPEND EXTRA_LIBS dxerr8)
  1168       elseif (NOT USE_WINSDK_DIRECTX)
  1169         list(APPEND EXTRA_LIBS dxerr)
  1170       endif()
  1171     endif()
  1172     if(HAVE_XINPUT_H)
  1173       set(SDL_JOYSTICK_XINPUT 1)
  1174     endif()
  1175     if(NOT HAVE_DINPUT_H AND NOT HAVE_XINPUT_H)
  1176       set(SDL_JOYSTICK_WINMM 1)
  1177     endif()
  1178     set(HAVE_SDL_JOYSTICK TRUE)
  1179 
  1180     if(SDL_HAPTIC)
  1181       if(HAVE_DINPUT_H OR HAVE_XINPUT_H)
  1182         file(GLOB HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/windows/*.c)
  1183         if(HAVE_DINPUT_H)
  1184           set(SDL_HAPTIC_DINPUT 1)
  1185         endif()
  1186         if(HAVE_XINPUT_H)
  1187           set(SDL_HAPTIC_XINPUT 1)
  1188         endif()
  1189       else()
  1190         file(GLOB HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/dummy/*.c)
  1191         set(SDL_HAPTIC_DUMMY 1)
  1192       endif()
  1193       set(SOURCE_FILES ${SOURCE_FILES} ${HAPTIC_SOURCES})
  1194       set(HAVE_SDL_HAPTIC TRUE)
  1195     endif()
  1196   endif()
  1197 
  1198   file(GLOB VERSION_SOURCES ${SDL2_SOURCE_DIR}/src/main/windows/*.rc)
  1199   file(GLOB SDLMAIN_SOURCES ${SDL2_SOURCE_DIR}/src/main/windows/*.c)
  1200   if(MINGW OR CYGWIN)
  1201     list(APPEND EXTRA_LIBS mingw32)
  1202     list(APPEND EXTRA_LDFLAGS "-mwindows")
  1203     set(SDL_CFLAGS "${SDL_CFLAGS} -Dmain=SDL_main")
  1204     list(APPEND SDL_LIBS "-lmingw32" "-lSDL2main" "-mwindows")
  1205   endif()
  1206 elseif(APPLE)
  1207   # TODO: rework this for proper MacOS X, iOS and Darwin support
  1208 
  1209   # Requires the darwin file implementation
  1210   if(SDL_FILE)
  1211     file(GLOB EXTRA_SOURCES ${SDL2_SOURCE_DIR}/src/file/cocoa/*.m)
  1212     set(SOURCE_FILES ${EXTRA_SOURCES} ${SOURCE_FILES})
  1213     set_source_files_properties(${EXTRA_SOURCES} PROPERTIES LANGUAGE C)
  1214     set(HAVE_SDL_FILE TRUE)
  1215     set(SDL_FRAMEWORK_COCOA 1)
  1216     set(SDL_FRAMEWORK_COREVIDEO 1)
  1217   else()
  1218     message_error("SDL_FILE must be enabled to build on MacOS X")
  1219   endif()
  1220 
  1221   if(SDL_AUDIO)
  1222     set(SDL_AUDIO_DRIVER_COREAUDIO 1)
  1223     file(GLOB AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/coreaudio/*.m)
  1224     set(SOURCE_FILES ${SOURCE_FILES} ${AUDIO_SOURCES})
  1225     set(HAVE_SDL_AUDIO TRUE)
  1226     set(SDL_FRAMEWORK_COREAUDIO 1)
  1227     set(SDL_FRAMEWORK_AUDIOTOOLBOX 1)
  1228   endif()
  1229 
  1230   if(SDL_JOYSTICK)
  1231     set(SDL_JOYSTICK_IOKIT 1)
  1232     if (IOS)
  1233       file(GLOB JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/iphoneos/*.m)
  1234     else()
  1235       file(GLOB JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/darwin/*.c)
  1236     endif()
  1237     set(SOURCE_FILES ${SOURCE_FILES} ${JOYSTICK_SOURCES})
  1238     set(HAVE_SDL_JOYSTICK TRUE)
  1239     set(SDL_FRAMEWORK_IOKIT 1)
  1240     set(SDL_FRAMEWORK_FF 1)
  1241   endif()
  1242 
  1243   if(SDL_HAPTIC)
  1244     set(SDL_HAPTIC_IOKIT 1)
  1245     if (IOS)
  1246       file(GLOB POWER_SOURCES ${SDL2_SOURCE_DIR}/src/power/dummy/*.c)
  1247       set(SDL_HAPTIC_DUMMY 1)
  1248     else()
  1249       file(GLOB HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/darwin/*.c)
  1250     endif()
  1251     set(SOURCE_FILES ${SOURCE_FILES} ${HAPTIC_SOURCES})
  1252     set(HAVE_SDL_HAPTIC TRUE)
  1253     set(SDL_FRAMEWORK_IOKIT 1)
  1254     set(SDL_FRAMEWORK_FF 1)
  1255     if(NOT SDL_JOYSTICK)
  1256       message(FATAL_ERROR "SDL_HAPTIC requires SDL_JOYSTICK to be enabled")
  1257     endif()
  1258   endif()
  1259 
  1260   if(SDL_POWER)
  1261     set(SDL_POWER_MACOSX 1)
  1262     if (IOS)
  1263       file(GLOB POWER_SOURCES ${SDL2_SOURCE_DIR}/src/power/uikit/*.m)
  1264     else()
  1265       file(GLOB POWER_SOURCES ${SDL2_SOURCE_DIR}/src/power/macosx/*.c)
  1266     endif()
  1267     set(SOURCE_FILES ${SOURCE_FILES} ${POWER_SOURCES})
  1268     set(HAVE_SDL_POWER TRUE)
  1269     set(SDL_FRAMEWORK_CARBON 1)
  1270     set(SDL_FRAMEWORK_IOKIT 1)
  1271   endif()
  1272 
  1273   if(SDL_TIMERS)
  1274     set(SDL_TIMER_UNIX 1)
  1275     file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/unix/*.c)
  1276     set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES})
  1277     set(HAVE_SDL_TIMERS TRUE)
  1278   endif(SDL_TIMERS)
  1279 
  1280   if(SDL_FILESYSTEM)
  1281     set(SDL_FILESYSTEM_COCOA 1)
  1282     file(GLOB FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/cocoa/*.m)
  1283     set_source_files_properties(${FILESYSTEM_SOURCES} PROPERTIES LANGUAGE C)
  1284     set(SOURCE_FILES ${SOURCE_FILES} ${FILESYSTEM_SOURCES})
  1285     set(HAVE_SDL_FILESYSTEM TRUE)
  1286   endif()
  1287 
  1288   # Actually load the frameworks at the end so we don't duplicate include.
  1289   if(SDL_FRAMEWORK_COREVIDEO)
  1290     find_library(COREVIDEO CoreVideo)
  1291     list(APPEND EXTRA_LIBS ${COREVIDEO})
  1292   endif()
  1293   if(SDL_FRAMEWORK_COCOA)
  1294     find_library(COCOA_LIBRARY Cocoa)
  1295     list(APPEND EXTRA_LIBS ${COCOA_LIBRARY})
  1296   endif()
  1297   if(SDL_FRAMEWORK_IOKIT)
  1298     find_library(IOKIT IOKit)
  1299     list(APPEND EXTRA_LIBS ${IOKIT})
  1300   endif()
  1301   if(SDL_FRAMEWORK_FF)
  1302     find_library(FORCEFEEDBACK ForceFeedback)
  1303     list(APPEND EXTRA_LIBS ${FORCEFEEDBACK})
  1304   endif()
  1305   if(SDL_FRAMEWORK_CARBON)
  1306     find_library(CARBON_LIBRARY Carbon)
  1307     list(APPEND EXTRA_LIBS ${CARBON_LIBRARY})
  1308   endif()
  1309   if(SDL_FRAMEWORK_COREAUDIO)
  1310     find_library(COREAUDIO CoreAudio)
  1311     list(APPEND EXTRA_LIBS ${COREAUDIO})
  1312   endif()
  1313   if(SDL_FRAMEWORK_AUDIOTOOLBOX)
  1314     find_library(AUDIOTOOLBOX AudioToolbox)
  1315     list(APPEND EXTRA_LIBS ${AUDIOTOOLBOX})
  1316   endif()
  1317 
  1318   # iOS hack needed - http://code.google.com/p/ios-cmake/ ?
  1319   if(SDL_VIDEO)
  1320     if (IOS)
  1321       set(SDL_VIDEO_DRIVER_UIKIT 1)
  1322       file(GLOB UIKITVIDEO_SOURCES ${SDL2_SOURCE_DIR}/src/video/uikit/*.m)
  1323       set(SOURCE_FILES ${SOURCE_FILES} ${UIKITVIDEO_SOURCES})
  1324     else()
  1325       CheckCOCOA()
  1326       if(VIDEO_OPENGL)
  1327         set(SDL_VIDEO_OPENGL 1)
  1328         set(SDL_VIDEO_OPENGL_CGL 1)
  1329         set(SDL_VIDEO_RENDER_OGL 1)
  1330         set(HAVE_VIDEO_OPENGL TRUE)
  1331       endif()
  1332     endif()
  1333   endif()
  1334 
  1335   CheckPTHREAD()
  1336 elseif(HAIKU)
  1337   if(SDL_VIDEO)
  1338     set(SDL_VIDEO_DRIVER_HAIKU 1)
  1339     file(GLOB HAIKUVIDEO_SOURCES ${SDL2_SOURCE_DIR}/src/video/haiku/*.c)
  1340     set(SOURCE_FILES ${SOURCE_FILES} ${HAIKUVIDEO_SOURCES})
  1341     set(HAVE_SDL_VIDEO TRUE)
  1342 
  1343     set(SDL_FILESYSTEM_HAIKU 1)
  1344     file(GLOB FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/haiku/*.cc)
  1345     set(SOURCE_FILES ${SOURCE_FILES} ${FILESYSTEM_SOURCES})
  1346     set(HAVE_SDL_FILESYSTEM TRUE)
  1347 
  1348     if(SDL_TIMERS)
  1349       set(SDL_TIMER_HAIKU 1)
  1350       file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/haiku/*.c)
  1351       set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES})
  1352       set(HAVE_SDL_TIMERS TRUE)
  1353     endif(SDL_TIMERS)
  1354 
  1355     if(VIDEO_OPENGL)
  1356       # TODO: Use FIND_PACKAGE(OpenGL) instead
  1357       set(SDL_VIDEO_OPENGL 1)
  1358       set(SDL_VIDEO_OPENGL_BGL 1)
  1359       set(SDL_VIDEO_RENDER_OGL 1)
  1360       list(APPEND EXTRA_LIBS GL)
  1361       set(HAVE_VIDEO_OPENGL TRUE)
  1362     endif()
  1363   endif()
  1364 
  1365   CheckPTHREAD()
  1366 endif()
  1367 
  1368 # Dummies
  1369 # configure.in does it differently:
  1370 # if not have X
  1371 #   if enable_X {  SDL_X_DISABLED = 1 }
  1372 #   [add dummy sources]
  1373 # so it always adds a dummy, without checking, if it was actually requested.
  1374 # This leads to missing internal references on building, since the
  1375 # src/X/*.c does not get included.
  1376 if(NOT HAVE_SDL_JOYSTICK)
  1377   set(SDL_JOYSTICK_DISABLED 1)
  1378   if(SDL_JOYSTICK AND NOT APPLE) # results in unresolved symbols on OSX
  1379 
  1380     file(GLOB JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/dummy/*.c)
  1381     set(SOURCE_FILES ${SOURCE_FILES} ${JOYSTICK_SOURCES})
  1382   endif()
  1383 endif()
  1384 if(NOT HAVE_SDL_HAPTIC)
  1385   set(SDL_HAPTIC_DISABLED 1)
  1386   file(GLOB HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/dummy/*.c)
  1387   set(SOURCE_FILES ${SOURCE_FILES} ${HAPTIC_SOURCES})
  1388 endif()
  1389 if(NOT HAVE_SDL_LOADSO)
  1390   set(SDL_LOADSO_DISABLED 1)
  1391   file(GLOB LOADSO_SOURCES ${SDL2_SOURCE_DIR}/src/loadso/dummy/*.c)
  1392   set(SOURCE_FILES ${SOURCE_FILES} ${LOADSO_SOURCES})
  1393 endif()
  1394 if(NOT HAVE_SDL_FILESYSTEM)
  1395   set(SDL_FILESYSTEM_DISABLED 1)
  1396   file(GLOB FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/dummy/*.c)
  1397   set(SOURCE_FILES ${SOURCE_FILES} ${FILESYSTEM_SOURCES})
  1398 endif()
  1399 
  1400 # We always need to have threads and timers around
  1401 if(NOT HAVE_SDL_THREADS)
  1402   set(SDL_THREADS_DISABLED 1)
  1403   file(GLOB THREADS_SOURCES ${SDL2_SOURCE_DIR}/src/thread/generic/*.c)
  1404   set(SOURCE_FILES ${SOURCE_FILES} ${THREADS_SOURCES})
  1405 endif()
  1406 if(NOT HAVE_SDL_TIMERS)
  1407   set(SDL_TIMERS_DISABLED 1)
  1408   file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/dummy/*.c)
  1409   set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES})
  1410 endif()
  1411 
  1412 if(NOT SDLMAIN_SOURCES)
  1413   file(GLOB SDLMAIN_SOURCES ${SDL2_SOURCE_DIR}/src/main/dummy/*.c)
  1414 endif()
  1415 
  1416 # Append the -MMD -MT flags
  1417 # if(DEPENDENCY_TRACKING)
  1418 #   if(COMPILER_IS_GNUCC)
  1419 #     set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -MMD -MT \$@")
  1420 #   endif()
  1421 # endif()
  1422 
  1423 configure_file("${SDL2_SOURCE_DIR}/include/SDL_config.h.cmake"
  1424   "${SDL2_BINARY_DIR}/include/SDL_config.h")
  1425 
  1426 # Prepare the flags and remove duplicates
  1427 if(EXTRA_LDFLAGS)
  1428   list(REMOVE_DUPLICATES EXTRA_LDFLAGS)
  1429 endif()
  1430 if(EXTRA_LIBS)
  1431   list(REMOVE_DUPLICATES EXTRA_LIBS)
  1432 endif()
  1433 if(EXTRA_CFLAGS)
  1434   list(REMOVE_DUPLICATES EXTRA_CFLAGS)
  1435 endif()
  1436 listtostr(EXTRA_CFLAGS _EXTRA_CFLAGS)
  1437 set(EXTRA_CFLAGS ${_EXTRA_CFLAGS})
  1438 
  1439 # Compat helpers for the configuration files
  1440 if(NOT WINDOWS OR CYGWIN)
  1441   # TODO: we need a Windows script, too
  1442   execute_process(COMMAND sh ${SDL2_SOURCE_DIR}/build-scripts/updaterev.sh)
  1443 
  1444   set(prefix ${CMAKE_INSTALL_PREFIX})
  1445   set(exec_prefix "\${prefix}")
  1446   set(libdir "\${exec_prefix}/lib${LIB_SUFFIX}")
  1447   set(bindir "\${exec_prefix}/bin")
  1448   set(includedir "\${prefix}/include")
  1449   if(SDL_STATIC)
  1450     set(ENABLE_STATIC_TRUE "")
  1451     set(ENABLE_STATIC_FALSE "#")
  1452   else()
  1453     set(ENABLE_STATIC_TRUE "#")
  1454     set(ENABLE_STATIC_FALSE "")
  1455   endif()
  1456   if(SDL_SHARED)
  1457     set(ENABLE_SHARED_TRUE "")
  1458     set(ENABLE_SHARED_FALSE "#")
  1459   else()
  1460     set(ENABLE_SHARED_TRUE "#")
  1461     set(ENABLE_SHARED_FALSE "")
  1462   endif()
  1463 
  1464   # Clean up the different lists
  1465   listtostr(EXTRA_LIBS _EXTRA_LIBS "-l")
  1466   set(SDL_STATIC_LIBS ${SDL_LIBS} ${EXTRA_LDFLAGS} ${_EXTRA_LIBS})
  1467   list(REMOVE_DUPLICATES SDL_STATIC_LIBS)
  1468   listtostr(SDL_STATIC_LIBS _SDL_STATIC_LIBS)
  1469   set(SDL_STATIC_LIBS ${_SDL_STATIC_LIBS})
  1470   listtostr(SDL_LIBS _SDL_LIBS)
  1471   set(SDL_LIBS ${_SDL_LIBS})
  1472 
  1473   # MESSAGE(STATUS "SDL_LIBS: ${SDL_LIBS}")
  1474   # MESSAGE(STATUS "SDL_STATIC_LIBS: ${SDL_STATIC_LIBS}")
  1475 
  1476   configure_file("${SDL2_SOURCE_DIR}/sdl2.pc.in"
  1477     "${SDL2_BINARY_DIR}/sdl2.pc" @ONLY)
  1478   configure_file("${SDL2_SOURCE_DIR}/sdl2-config.in"
  1479     "${SDL2_BINARY_DIR}/sdl2-config")
  1480   configure_file("${SDL2_SOURCE_DIR}/sdl2-config.in"
  1481     "${SDL2_BINARY_DIR}/sdl2-config" @ONLY)
  1482   configure_file("${SDL2_SOURCE_DIR}/SDL2.spec.in"
  1483     "${SDL2_BINARY_DIR}/SDL2.spec" @ONLY)
  1484 endif()
  1485 
  1486 ##### Info output #####
  1487 message(STATUS "")
  1488 message(STATUS "SDL2 was configured with the following options:")
  1489 message(STATUS "")
  1490 message(STATUS "Platform: ${CMAKE_SYSTEM}")
  1491 message(STATUS "64-bit:   ${ARCH_64}")
  1492 message(STATUS "Compiler: ${CMAKE_C_COMPILER}")
  1493 message(STATUS "")
  1494 message(STATUS "Subsystems:")
  1495 foreach(_SUB ${SDL_SUBSYSTEMS})
  1496   string(TOUPPER ${_SUB} _OPT)
  1497   message_bool_option(${_SUB} SDL_${_OPT})
  1498 endforeach()
  1499 message(STATUS "")
  1500 message(STATUS "Options:")
  1501 list(SORT ALLOPTIONS)
  1502 foreach(_OPT ${ALLOPTIONS})
  1503   # Longest option is VIDEO_X11_XSCREENSAVER = 22 characters
  1504   # Get the padding
  1505   string(LENGTH ${_OPT} _OPTLEN)
  1506   math(EXPR _PADLEN "23 - ${_OPTLEN}")
  1507   string(RANDOM LENGTH ${_PADLEN} ALPHABET " " _PADDING)
  1508   message_tested_option(${_OPT} ${_PADDING})
  1509 endforeach()
  1510 message(STATUS "")
  1511 message(STATUS " CFLAGS:        ${CMAKE_C_FLAGS}")
  1512 message(STATUS " EXTRA_CFLAGS:  ${EXTRA_CFLAGS}")
  1513 message(STATUS " EXTRA_LDFLAGS: ${EXTRA_LDFLAGS}")
  1514 message(STATUS " EXTRA_LIBS:    ${EXTRA_LIBS}")
  1515 message(STATUS "")
  1516 message(STATUS " Build Shared Library: ${SDL_SHARED}")
  1517 message(STATUS " Build Static Library: ${SDL_STATIC}")
  1518 if(SDL_STATIC)
  1519     message(STATUS " Build Static Library with Position Independent Code: ${SDL_STATIC_PIC}")
  1520 endif()
  1521 message(STATUS "")
  1522 if(UNIX)
  1523   message(STATUS "If something was not detected, although the libraries")
  1524   message(STATUS "were installed, then make sure you have set the")
  1525   message(STATUS "CFLAGS and LDFLAGS environment variables correctly.")
  1526   message(STATUS "")
  1527 endif()
  1528 
  1529 # Ensure that the extra cflags are used at compile time
  1530 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS}")
  1531 
  1532 # Always build SDLmain
  1533 add_library(SDL2main STATIC ${SDLMAIN_SOURCES})
  1534 set(_INSTALL_LIBS "SDL2main")
  1535 
  1536 if(SDL_SHARED)
  1537   add_library(SDL2 SHARED ${SOURCE_FILES})
  1538   if(UNIX)
  1539     set_target_properties(SDL2 PROPERTIES
  1540       VERSION ${LT_VERSION}
  1541       SOVERSION ${LT_REVISION}
  1542       OUTPUT_NAME "SDL2-${LT_RELEASE}")
  1543   else()
  1544     set_target_properties(SDL2 PROPERTIES
  1545       VERSION ${SDL_VERSION}
  1546       SOVERSION ${LT_REVISION}
  1547       OUTPUT_NAME "SDL2")
  1548   endif()
  1549   if(MSVC)
  1550     # Don't try to link with the default set of libraries.
  1551     set_target_properties(SDL2 PROPERTIES LINK_FLAGS_RELEASE "/NODEFAULTLIB")
  1552     set_target_properties(SDL2 PROPERTIES LINK_FLAGS_DEBUG "/NODEFAULTLIB")
  1553     set_target_properties(SDL2 PROPERTIES STATIC_LIBRARY_FLAGS "/NODEFAULTLIB")
  1554   endif()
  1555   set(_INSTALL_LIBS "SDL2" ${_INSTALL_LIBS})
  1556   target_link_libraries(SDL2 ${EXTRA_LIBS} ${EXTRA_LDFLAGS})
  1557 endif()
  1558 
  1559 if(SDL_STATIC)
  1560   set (BUILD_SHARED_LIBS FALSE)
  1561   add_library(SDL2-static STATIC ${SOURCE_FILES})
  1562   set_target_properties(SDL2-static PROPERTIES OUTPUT_NAME "SDL2")
  1563   set_target_properties(SDL2-static PROPERTIES POSITION_INDEPENDENT_CODE ${SDL_STATIC_PIC})
  1564   if(MSVC)
  1565     set_target_properties(SDL2-static PROPERTIES LINK_FLAGS_RELEASE "/NODEFAULTLIB")
  1566     set_target_properties(SDL2-static PROPERTIES LINK_FLAGS_DEBUG "/NODEFAULTLIB")
  1567     set_target_properties(SDL2-static PROPERTIES STATIC_LIBRARY_FLAGS "/NODEFAULTLIB")
  1568   endif()
  1569   # TODO: Win32 platforms keep the same suffix .lib for import and static
  1570   # libraries - do we need to consider this?
  1571   set(_INSTALL_LIBS "SDL2-static" ${_INSTALL_LIBS})
  1572   target_link_libraries(SDL2-static ${EXTRA_LIBS} ${EXTRA_LDFLAGS})
  1573 endif()
  1574 
  1575 ##### Installation targets #####
  1576 install(TARGETS ${_INSTALL_LIBS}
  1577   LIBRARY DESTINATION "lib${LIB_SUFFIX}"
  1578   ARCHIVE DESTINATION "lib${LIB_SUFFIX}"
  1579   RUNTIME DESTINATION bin)
  1580 
  1581 file(GLOB INCLUDE_FILES ${SDL2_SOURCE_DIR}/include/*.h)
  1582 file(GLOB BIN_INCLUDE_FILES ${SDL2_BINARY_DIR}/include/*.h)
  1583 foreach(_FNAME ${BIN_INCLUDE_FILES})
  1584   get_filename_component(_INCNAME ${_FNAME} NAME)
  1585   list(REMOVE_ITEM INCLUDE_FILES ${SDL2_SOURCE_DIR}/include/${_INCNAME})
  1586 endforeach()
  1587 list(APPEND INCLUDE_FILES ${BIN_INCLUDE_FILES})
  1588 install(FILES ${INCLUDE_FILES} DESTINATION include/SDL2)
  1589 
  1590 if(NOT (WINDOWS OR CYGWIN))
  1591   if(SDL_SHARED)
  1592     if (APPLE)
  1593         set(SOEXT "dylib")
  1594     else()
  1595         set(SOEXT "so")
  1596     endif()
  1597     install(CODE "
  1598       execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink
  1599       \"libSDL2-2.0.${SOEXT}\" \"libSDL2.${SOEXT}\")")
  1600     install(FILES ${SDL2_BINARY_DIR}/libSDL2.${SOEXT} DESTINATION "lib${LIB_SUFFIX}")
  1601   endif()
  1602   if(FREEBSD)
  1603     # FreeBSD uses ${PREFIX}/libdata/pkgconfig
  1604     install(FILES ${SDL2_BINARY_DIR}/sdl2.pc DESTINATION "libdata/pkgconfig")
  1605   else()
  1606     install(FILES ${SDL2_BINARY_DIR}/sdl2.pc
  1607       DESTINATION "lib${LIB_SUFFIX}/pkgconfig")
  1608   endif()
  1609   install(PROGRAMS ${SDL2_BINARY_DIR}/sdl2-config DESTINATION bin)
  1610   # TODO: what about the .spec file? Is it only needed for RPM creation?
  1611   install(FILES "${SDL2_SOURCE_DIR}/sdl2.m4" DESTINATION "share/aclocal")
  1612 endif()
  1613 
  1614 ##### Uninstall target #####
  1615 
  1616 configure_file(
  1617     "${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake.in"
  1618     "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
  1619     IMMEDIATE @ONLY)
  1620 
  1621 add_custom_target(uninstall
  1622     COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake)