CMakeLists.txt
author Sam Lantinga <slouken@libsdl.org>
Sat, 01 Oct 2016 12:48:08 -0700
changeset 10419 efb26f3918c4
parent 10375 9cf405a99347
child 10421 55fd4e519a58
permissions -rw-r--r--
Fixed bug 3301 - IBus support on Linux with CMake


joe.gsoc16

I recently looked into Unicode support in SDL2 and realized that
SDL_TEXTEDITING doesn't get triggered at all (Japanese IME).
According to others on IRC it works fine on Windows/Mac but not
for me on (arch)Linux.
When compiling SDL with autotools, IBus support is enabled by
default but not so with CMake.
I never used CMake before but got it working and also included
that pkg-config determines flags for dbus (FIXME in CMakeLists).
     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     file(GLOB JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/darwin/*.c)
  1233     set(SOURCE_FILES ${SOURCE_FILES} ${JOYSTICK_SOURCES})
  1234     set(HAVE_SDL_JOYSTICK TRUE)
  1235     set(SDL_FRAMEWORK_IOKIT 1)
  1236     set(SDL_FRAMEWORK_FF 1)
  1237   endif()
  1238 
  1239   if(SDL_HAPTIC)
  1240     set(SDL_HAPTIC_IOKIT 1)
  1241     file(GLOB HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/darwin/*.c)
  1242     set(SOURCE_FILES ${SOURCE_FILES} ${HAPTIC_SOURCES})
  1243     set(HAVE_SDL_HAPTIC TRUE)
  1244     set(SDL_FRAMEWORK_IOKIT 1)
  1245     set(SDL_FRAMEWORK_FF 1)
  1246     if(NOT SDL_JOYSTICK)
  1247       message(FATAL_ERROR "SDL_HAPTIC requires SDL_JOYSTICK to be enabled")
  1248     endif()
  1249   endif()
  1250 
  1251   if(SDL_POWER)
  1252     set(SDL_POWER_MACOSX 1)
  1253     file(GLOB POWER_SOURCES ${SDL2_SOURCE_DIR}/src/power/macosx/*.c)
  1254     set(SOURCE_FILES ${SOURCE_FILES} ${POWER_SOURCES})
  1255     set(HAVE_SDL_POWER TRUE)
  1256     set(SDL_FRAMEWORK_CARBON 1)
  1257     set(SDL_FRAMEWORK_IOKIT 1)
  1258   endif()
  1259 
  1260   if(SDL_TIMERS)
  1261     set(SDL_TIMER_UNIX 1)
  1262     file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/unix/*.c)
  1263     set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES})
  1264     set(HAVE_SDL_TIMERS TRUE)
  1265   endif(SDL_TIMERS)
  1266 
  1267   if(SDL_FILESYSTEM)
  1268     set(SDL_FILESYSTEM_COCOA 1)
  1269     file(GLOB FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/cocoa/*.m)
  1270     set_source_files_properties(${FILESYSTEM_SOURCES} PROPERTIES LANGUAGE C)
  1271     set(SOURCE_FILES ${SOURCE_FILES} ${FILESYSTEM_SOURCES})
  1272     set(HAVE_SDL_FILESYSTEM TRUE)
  1273   endif()
  1274 
  1275   # Actually load the frameworks at the end so we don't duplicate include.
  1276   if(SDL_FRAMEWORK_COREVIDEO)
  1277     find_library(COREVIDEO CoreVideo)
  1278     list(APPEND EXTRA_LIBS ${COREVIDEO})
  1279   endif()
  1280   if(SDL_FRAMEWORK_COCOA)
  1281     find_library(COCOA_LIBRARY Cocoa)
  1282     list(APPEND EXTRA_LIBS ${COCOA_LIBRARY})
  1283   endif()
  1284   if(SDL_FRAMEWORK_IOKIT)
  1285     find_library(IOKIT IOKit)
  1286     list(APPEND EXTRA_LIBS ${IOKIT})
  1287   endif()
  1288   if(SDL_FRAMEWORK_FF)
  1289     find_library(FORCEFEEDBACK ForceFeedback)
  1290     list(APPEND EXTRA_LIBS ${FORCEFEEDBACK})
  1291   endif()
  1292   if(SDL_FRAMEWORK_CARBON)
  1293     find_library(CARBON_LIBRARY Carbon)
  1294     list(APPEND EXTRA_LIBS ${CARBON_LIBRARY})
  1295   endif()
  1296   if(SDL_FRAMEWORK_COREAUDIO)
  1297     find_library(COREAUDIO CoreAudio)
  1298     list(APPEND EXTRA_LIBS ${COREAUDIO})
  1299   endif()
  1300   if(SDL_FRAMEWORK_AUDIOTOOLBOX)
  1301     find_library(AUDIOTOOLBOX AudioToolbox)
  1302     list(APPEND EXTRA_LIBS ${AUDIOTOOLBOX})
  1303   endif()
  1304 
  1305   # iOS hack needed - http://code.google.com/p/ios-cmake/ ?
  1306   if(SDL_VIDEO)
  1307     CheckCOCOA()
  1308     if(VIDEO_OPENGL)
  1309       set(SDL_VIDEO_OPENGL 1)
  1310       set(SDL_VIDEO_OPENGL_CGL 1)
  1311       set(SDL_VIDEO_RENDER_OGL 1)
  1312       set(HAVE_VIDEO_OPENGL TRUE)
  1313     endif()
  1314   endif()
  1315 
  1316   CheckPTHREAD()
  1317 elseif(HAIKU)
  1318   if(SDL_VIDEO)
  1319     set(SDL_VIDEO_DRIVER_HAIKU 1)
  1320     file(GLOB HAIKUVIDEO_SOURCES ${SDL2_SOURCE_DIR}/src/video/haiku/*.c)
  1321     set(SOURCE_FILES ${SOURCE_FILES} ${HAIKUVIDEO_SOURCES})
  1322     set(HAVE_SDL_VIDEO TRUE)
  1323 
  1324     set(SDL_FILESYSTEM_HAIKU 1)
  1325     file(GLOB FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/haiku/*.cc)
  1326     set(SOURCE_FILES ${SOURCE_FILES} ${FILESYSTEM_SOURCES})
  1327     set(HAVE_SDL_FILESYSTEM TRUE)
  1328 
  1329     if(SDL_TIMERS)
  1330       set(SDL_TIMER_HAIKU 1)
  1331       file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/haiku/*.c)
  1332       set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES})
  1333       set(HAVE_SDL_TIMERS TRUE)
  1334     endif(SDL_TIMERS)
  1335 
  1336     if(VIDEO_OPENGL)
  1337       # TODO: Use FIND_PACKAGE(OpenGL) instead
  1338       set(SDL_VIDEO_OPENGL 1)
  1339       set(SDL_VIDEO_OPENGL_BGL 1)
  1340       set(SDL_VIDEO_RENDER_OGL 1)
  1341       list(APPEND EXTRA_LIBS GL)
  1342       set(HAVE_VIDEO_OPENGL TRUE)
  1343     endif()
  1344   endif()
  1345 
  1346   CheckPTHREAD()
  1347 endif()
  1348 
  1349 # Dummies
  1350 # configure.in does it differently:
  1351 # if not have X
  1352 #   if enable_X {  SDL_X_DISABLED = 1 }
  1353 #   [add dummy sources]
  1354 # so it always adds a dummy, without checking, if it was actually requested.
  1355 # This leads to missing internal references on building, since the
  1356 # src/X/*.c does not get included.
  1357 if(NOT HAVE_SDL_JOYSTICK)
  1358   set(SDL_JOYSTICK_DISABLED 1)
  1359   if(SDL_JOYSTICK AND NOT APPLE) # results in unresolved symbols on OSX
  1360 
  1361     file(GLOB JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/dummy/*.c)
  1362     set(SOURCE_FILES ${SOURCE_FILES} ${JOYSTICK_SOURCES})
  1363   endif()
  1364 endif()
  1365 if(NOT HAVE_SDL_HAPTIC)
  1366   set(SDL_HAPTIC_DISABLED 1)
  1367   file(GLOB HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/dummy/*.c)
  1368   set(SOURCE_FILES ${SOURCE_FILES} ${HAPTIC_SOURCES})
  1369 endif()
  1370 if(NOT HAVE_SDL_LOADSO)
  1371   set(SDL_LOADSO_DISABLED 1)
  1372   file(GLOB LOADSO_SOURCES ${SDL2_SOURCE_DIR}/src/loadso/dummy/*.c)
  1373   set(SOURCE_FILES ${SOURCE_FILES} ${LOADSO_SOURCES})
  1374 endif()
  1375 if(NOT HAVE_SDL_FILESYSTEM)
  1376   set(SDL_FILESYSTEM_DISABLED 1)
  1377   file(GLOB FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/dummy/*.c)
  1378   set(SOURCE_FILES ${SOURCE_FILES} ${FILESYSTEM_SOURCES})
  1379 endif()
  1380 
  1381 # We always need to have threads and timers around
  1382 if(NOT HAVE_SDL_THREADS)
  1383   set(SDL_THREADS_DISABLED 1)
  1384   file(GLOB THREADS_SOURCES ${SDL2_SOURCE_DIR}/src/thread/generic/*.c)
  1385   set(SOURCE_FILES ${SOURCE_FILES} ${THREADS_SOURCES})
  1386 endif()
  1387 if(NOT HAVE_SDL_TIMERS)
  1388   set(SDL_TIMERS_DISABLED 1)
  1389   file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/dummy/*.c)
  1390   set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES})
  1391 endif()
  1392 
  1393 if(NOT SDLMAIN_SOURCES)
  1394   file(GLOB SDLMAIN_SOURCES ${SDL2_SOURCE_DIR}/src/main/dummy/*.c)
  1395 endif()
  1396 
  1397 # Append the -MMD -MT flags
  1398 # if(DEPENDENCY_TRACKING)
  1399 #   if(COMPILER_IS_GNUCC)
  1400 #     set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -MMD -MT \$@")
  1401 #   endif()
  1402 # endif()
  1403 
  1404 configure_file("${SDL2_SOURCE_DIR}/include/SDL_config.h.cmake"
  1405   "${SDL2_BINARY_DIR}/include/SDL_config.h")
  1406 
  1407 # Prepare the flags and remove duplicates
  1408 if(EXTRA_LDFLAGS)
  1409   list(REMOVE_DUPLICATES EXTRA_LDFLAGS)
  1410 endif()
  1411 if(EXTRA_LIBS)
  1412   list(REMOVE_DUPLICATES EXTRA_LIBS)
  1413 endif()
  1414 if(EXTRA_CFLAGS)
  1415   list(REMOVE_DUPLICATES EXTRA_CFLAGS)
  1416 endif()
  1417 listtostr(EXTRA_CFLAGS _EXTRA_CFLAGS)
  1418 set(EXTRA_CFLAGS ${_EXTRA_CFLAGS})
  1419 
  1420 # Compat helpers for the configuration files
  1421 if(NOT WINDOWS OR CYGWIN)
  1422   # TODO: we need a Windows script, too
  1423   execute_process(COMMAND sh ${SDL2_SOURCE_DIR}/build-scripts/updaterev.sh)
  1424 
  1425   set(prefix ${CMAKE_INSTALL_PREFIX})
  1426   set(exec_prefix "\${prefix}")
  1427   set(libdir "\${exec_prefix}/lib${LIB_SUFFIX}")
  1428   set(bindir "\${exec_prefix}/bin")
  1429   set(includedir "\${prefix}/include")
  1430   if(SDL_STATIC)
  1431     set(ENABLE_STATIC_TRUE "")
  1432     set(ENABLE_STATIC_FALSE "#")
  1433   else()
  1434     set(ENABLE_STATIC_TRUE "#")
  1435     set(ENABLE_STATIC_FALSE "")
  1436   endif()
  1437   if(SDL_SHARED)
  1438     set(ENABLE_SHARED_TRUE "")
  1439     set(ENABLE_SHARED_FALSE "#")
  1440   else()
  1441     set(ENABLE_SHARED_TRUE "#")
  1442     set(ENABLE_SHARED_FALSE "")
  1443   endif()
  1444 
  1445   # Clean up the different lists
  1446   listtostr(EXTRA_LIBS _EXTRA_LIBS "-l")
  1447   set(SDL_STATIC_LIBS ${SDL_LIBS} ${EXTRA_LDFLAGS} ${_EXTRA_LIBS})
  1448   list(REMOVE_DUPLICATES SDL_STATIC_LIBS)
  1449   listtostr(SDL_STATIC_LIBS _SDL_STATIC_LIBS)
  1450   set(SDL_STATIC_LIBS ${_SDL_STATIC_LIBS})
  1451   listtostr(SDL_LIBS _SDL_LIBS)
  1452   set(SDL_LIBS ${_SDL_LIBS})
  1453 
  1454   # MESSAGE(STATUS "SDL_LIBS: ${SDL_LIBS}")
  1455   # MESSAGE(STATUS "SDL_STATIC_LIBS: ${SDL_STATIC_LIBS}")
  1456 
  1457   configure_file("${SDL2_SOURCE_DIR}/sdl2.pc.in"
  1458     "${SDL2_BINARY_DIR}/sdl2.pc" @ONLY)
  1459   configure_file("${SDL2_SOURCE_DIR}/sdl2-config.in"
  1460     "${SDL2_BINARY_DIR}/sdl2-config")
  1461   configure_file("${SDL2_SOURCE_DIR}/sdl2-config.in"
  1462     "${SDL2_BINARY_DIR}/sdl2-config" @ONLY)
  1463   configure_file("${SDL2_SOURCE_DIR}/SDL2.spec.in"
  1464     "${SDL2_BINARY_DIR}/SDL2.spec" @ONLY)
  1465 endif()
  1466 
  1467 ##### Info output #####
  1468 message(STATUS "")
  1469 message(STATUS "SDL2 was configured with the following options:")
  1470 message(STATUS "")
  1471 message(STATUS "Platform: ${CMAKE_SYSTEM}")
  1472 message(STATUS "64-bit:   ${ARCH_64}")
  1473 message(STATUS "Compiler: ${CMAKE_C_COMPILER}")
  1474 message(STATUS "")
  1475 message(STATUS "Subsystems:")
  1476 foreach(_SUB ${SDL_SUBSYSTEMS})
  1477   string(TOUPPER ${_SUB} _OPT)
  1478   message_bool_option(${_SUB} SDL_${_OPT})
  1479 endforeach()
  1480 message(STATUS "")
  1481 message(STATUS "Options:")
  1482 list(SORT ALLOPTIONS)
  1483 foreach(_OPT ${ALLOPTIONS})
  1484   # Longest option is VIDEO_X11_XSCREENSAVER = 22 characters
  1485   # Get the padding
  1486   string(LENGTH ${_OPT} _OPTLEN)
  1487   math(EXPR _PADLEN "23 - ${_OPTLEN}")
  1488   string(RANDOM LENGTH ${_PADLEN} ALPHABET " " _PADDING)
  1489   message_tested_option(${_OPT} ${_PADDING})
  1490 endforeach()
  1491 message(STATUS "")
  1492 message(STATUS " CFLAGS:        ${CMAKE_C_FLAGS}")
  1493 message(STATUS " EXTRA_CFLAGS:  ${EXTRA_CFLAGS}")
  1494 message(STATUS " EXTRA_LDFLAGS: ${EXTRA_LDFLAGS}")
  1495 message(STATUS " EXTRA_LIBS:    ${EXTRA_LIBS}")
  1496 message(STATUS "")
  1497 message(STATUS " Build Shared Library: ${SDL_SHARED}")
  1498 message(STATUS " Build Static Library: ${SDL_STATIC}")
  1499 if(SDL_STATIC)
  1500     message(STATUS " Build Static Library with Position Independent Code: ${SDL_STATIC_PIC}")
  1501 endif()
  1502 message(STATUS "")
  1503 if(UNIX)
  1504   message(STATUS "If something was not detected, although the libraries")
  1505   message(STATUS "were installed, then make sure you have set the")
  1506   message(STATUS "CFLAGS and LDFLAGS environment variables correctly.")
  1507   message(STATUS "")
  1508 endif()
  1509 
  1510 # Ensure that the extra cflags are used at compile time
  1511 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS}")
  1512 
  1513 # Always build SDLmain
  1514 add_library(SDL2main STATIC ${SDLMAIN_SOURCES})
  1515 set(_INSTALL_LIBS "SDL2main")
  1516 
  1517 if(SDL_SHARED)
  1518   add_library(SDL2 SHARED ${SOURCE_FILES})
  1519   if(UNIX)
  1520     set_target_properties(SDL2 PROPERTIES
  1521       VERSION ${LT_VERSION}
  1522       SOVERSION ${LT_REVISION}
  1523       OUTPUT_NAME "SDL2-${LT_RELEASE}")
  1524   else()
  1525     set_target_properties(SDL2 PROPERTIES
  1526       VERSION ${SDL_VERSION}
  1527       SOVERSION ${LT_REVISION}
  1528       OUTPUT_NAME "SDL2")
  1529   endif()
  1530   if(MSVC)
  1531     # Don't try to link with the default set of libraries.
  1532     set_target_properties(SDL2 PROPERTIES LINK_FLAGS_RELEASE "/NODEFAULTLIB")
  1533     set_target_properties(SDL2 PROPERTIES LINK_FLAGS_DEBUG "/NODEFAULTLIB")
  1534     set_target_properties(SDL2 PROPERTIES STATIC_LIBRARY_FLAGS "/NODEFAULTLIB")
  1535   endif()
  1536   set(_INSTALL_LIBS "SDL2" ${_INSTALL_LIBS})
  1537   target_link_libraries(SDL2 ${EXTRA_LIBS} ${EXTRA_LDFLAGS})
  1538 endif()
  1539 
  1540 if(SDL_STATIC)
  1541   set (BUILD_SHARED_LIBS FALSE)
  1542   add_library(SDL2-static STATIC ${SOURCE_FILES})
  1543   set_target_properties(SDL2-static PROPERTIES OUTPUT_NAME "SDL2")
  1544   set_target_properties(SDL2-static PROPERTIES POSITION_INDEPENDENT_CODE ${SDL_STATIC_PIC})
  1545   if(MSVC)
  1546     set_target_properties(SDL2-static PROPERTIES LINK_FLAGS_RELEASE "/NODEFAULTLIB")
  1547     set_target_properties(SDL2-static PROPERTIES LINK_FLAGS_DEBUG "/NODEFAULTLIB")
  1548     set_target_properties(SDL2-static PROPERTIES STATIC_LIBRARY_FLAGS "/NODEFAULTLIB")
  1549   endif()
  1550   # TODO: Win32 platforms keep the same suffix .lib for import and static
  1551   # libraries - do we need to consider this?
  1552   set(_INSTALL_LIBS "SDL2-static" ${_INSTALL_LIBS})
  1553   target_link_libraries(SDL2-static ${EXTRA_LIBS} ${EXTRA_LDFLAGS})
  1554 endif()
  1555 
  1556 ##### Installation targets #####
  1557 install(TARGETS ${_INSTALL_LIBS}
  1558   LIBRARY DESTINATION "lib${LIB_SUFFIX}"
  1559   ARCHIVE DESTINATION "lib${LIB_SUFFIX}"
  1560   RUNTIME DESTINATION bin)
  1561 
  1562 file(GLOB INCLUDE_FILES ${SDL2_SOURCE_DIR}/include/*.h)
  1563 file(GLOB BIN_INCLUDE_FILES ${SDL2_BINARY_DIR}/include/*.h)
  1564 foreach(_FNAME ${BIN_INCLUDE_FILES})
  1565   get_filename_component(_INCNAME ${_FNAME} NAME)
  1566   list(REMOVE_ITEM INCLUDE_FILES ${SDL2_SOURCE_DIR}/include/${_INCNAME})
  1567 endforeach()
  1568 list(APPEND INCLUDE_FILES ${BIN_INCLUDE_FILES})
  1569 install(FILES ${INCLUDE_FILES} DESTINATION include/SDL2)
  1570 
  1571 if(NOT (WINDOWS OR CYGWIN))
  1572   if(SDL_SHARED)
  1573     if (APPLE)
  1574         set(SOEXT "dylib")
  1575     else()
  1576         set(SOEXT "so")
  1577     endif()
  1578     install(CODE "
  1579       execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink
  1580       \"libSDL2-2.0.${SOEXT}\" \"libSDL2.${SOEXT}\")")
  1581     install(FILES ${SDL2_BINARY_DIR}/libSDL2.${SOEXT} DESTINATION "lib${LIB_SUFFIX}")
  1582   endif()
  1583   if(FREEBSD)
  1584     # FreeBSD uses ${PREFIX}/libdata/pkgconfig
  1585     install(FILES ${SDL2_BINARY_DIR}/sdl2.pc DESTINATION "libdata/pkgconfig")
  1586   else()
  1587     install(FILES ${SDL2_BINARY_DIR}/sdl2.pc
  1588       DESTINATION "lib${LIB_SUFFIX}/pkgconfig")
  1589   endif()
  1590   install(PROGRAMS ${SDL2_BINARY_DIR}/sdl2-config DESTINATION bin)
  1591   # TODO: what about the .spec file? Is it only needed for RPM creation?
  1592   install(FILES "${SDL2_SOURCE_DIR}/sdl2.m4" DESTINATION "share/aclocal")
  1593 endif()
  1594 
  1595 ##### Uninstall target #####
  1596 
  1597 configure_file(
  1598     "${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake.in"
  1599     "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
  1600     IMMEDIATE @ONLY)
  1601 
  1602 add_custom_target(uninstall
  1603     COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake)