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