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