CMakeLists.txt
author Ryan C. Gordon <icculus@icculus.org>
Fri, 20 Mar 2015 10:02:45 -0400
changeset 9408 93ba64cb5e16
parent 9313 6f04557c6e1f
child 9409 9df20f292907
permissions -rw-r--r--
Fixed some defaults in CMake project file.

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