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