CMakeLists.txt
author Ryan C. Gordon <icculus@icculus.org>
Tue, 05 Jan 2016 05:44:32 -0500
changeset 10034 8764bcc13666
parent 10013 9f758c4d746a
child 10043 24e8d042e532
permissions -rwxr-xr-x
CMake: Turned off Mac OS X rpath warning kludge.

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