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