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