CMakeLists.txt
author Felix H. Dahlke
Sat, 17 Jan 2015 04:36:15 +0100
changeset 9312 705bdbbb1f37
parent 9279 e1d1b6479a14
child 9313 6f04557c6e1f
permissions -rw-r--r--
Fixed bug 2807 - Not using CoreAudio on OS X when built via CMake
     1 if(${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_BINARY_DIR})
     2   message(FATAL_ERROR "Prevented in-tree built. Please create a build directory outside of the SDL source code and call cmake from there")
     3 endif()
     4 
     5 cmake_minimum_required(VERSION 2.8)
     6 project(SDL2 C)
     7 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(SDL_AUDIO_DRIVER_COREAUDIO 1)
  1054     set(MACOSX_COREAUDIO 1)
  1055     file(GLOB AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/coreaudio/*.c)
  1056     set(SOURCE_FILES ${SOURCE_FILES} ${AUDIO_SOURCES})
  1057     set(HAVE_SDL_AUDIO TRUE)
  1058     set(SDL_FRAMEWORK_COREAUDIO 1)
  1059     set(SDL_FRAMEWORK_AUDIOUNIT 1)
  1060   endif()
  1061 
  1062   if(SDL_JOYSTICK)
  1063     set(SDL_JOYSTICK_IOKIT 1)
  1064     file(GLOB JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/darwin/*.c)
  1065     set(SOURCE_FILES ${SOURCE_FILES} ${JOYSTICK_SOURCES})
  1066     set(HAVE_SDL_JOYSTICK TRUE)
  1067     set(SDL_FRAMEWORK_IOKIT 1)
  1068     set(SDL_FRAMEWORK_FF 1)
  1069   endif()
  1070 
  1071   if(SDL_HAPTIC)
  1072     set(SDL_HAPTIC_IOKIT 1)
  1073     file(GLOB HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/darwin/*.c)
  1074     set(SOURCE_FILES ${SOURCE_FILES} ${HAPTIC_SOURCES})
  1075     set(HAVE_SDL_HAPTIC TRUE)
  1076     set(SDL_FRAMEWORK_IOKIT 1)
  1077     set(SDL_FRAMEWORK_FF 1)
  1078     if(NOT SDL_JOYSTICK)
  1079       message(FATAL_ERROR "SDL_HAPTIC requires SDL_JOYSTICK to be enabled")
  1080     endif()
  1081   endif()
  1082 
  1083   if(SDL_POWER)
  1084     set(SDL_POWER_MACOSX 1)
  1085     file(GLOB POWER_SOURCES ${SDL2_SOURCE_DIR}/src/power/macosx/*.c)
  1086     set(SOURCE_FILES ${SOURCE_FILES} ${POWER_SOURCES})
  1087     set(HAVE_SDL_POWER TRUE)
  1088     set(SDL_FRAMEWORK_CARBON 1)
  1089     set(SDL_FRAMEWORK_IOKIT 1)
  1090   endif()
  1091 
  1092   if(SDL_TIMERS)
  1093     set(SDL_TIMER_UNIX 1)
  1094     file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/unix/*.c)
  1095     set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES})
  1096     set(HAVE_SDL_TIMERS TRUE)
  1097   endif(SDL_TIMERS)
  1098 
  1099   if(SDL_FILESYSTEM)
  1100     set(SDL_FILESYSTEM_COCOA 1)
  1101     file(GLOB FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/cocoa/*.m)
  1102     set_source_files_properties(${FILESYSTEM_SOURCES} PROPERTIES LANGUAGE C)
  1103     set(SOURCE_FILES ${SOURCE_FILES} ${FILESYSTEM_SOURCES})
  1104     set(HAVE_SDL_FILESYSTEM TRUE)
  1105   endif()
  1106 
  1107   # Actually load the frameworks at the end so we don't duplicate include.
  1108   if(SDL_FRAMEWORK_COREVIDEO)
  1109     find_library(COREVIDEO CoreVideo)
  1110     list(APPEND EXTRA_LIBS ${COREVIDEO})
  1111   endif()
  1112   if(SDL_FRAMEWORK_COCOA)
  1113     find_library(COCOA_LIBRARY Cocoa)
  1114     list(APPEND EXTRA_LIBS ${COCOA_LIBRARY})
  1115   endif()
  1116   if(SDL_FRAMEWORK_IOKIT)
  1117     find_library(IOKIT IOKit)
  1118     list(APPEND EXTRA_LIBS ${IOKIT})
  1119   endif()
  1120   if(SDL_FRAMEWORK_FF)
  1121     find_library(FORCEFEEDBACK ForceFeedback)
  1122     list(APPEND EXTRA_LIBS ${FORCEFEEDBACK})
  1123   endif()
  1124   if(SDL_FRAMEWORK_CARBON)
  1125     find_library(CARBON_LIBRARY Carbon)
  1126     list(APPEND EXTRA_LIBS ${CARBON_LIBRARY})
  1127   endif()
  1128   if(SDL_FRAMEWORK_COREAUDIO)
  1129     find_library(COREAUDIO CoreAudio)
  1130     list(APPEND EXTRA_LIBS ${COREAUDIO})
  1131   endif()
  1132   if(SDL_FRAMEWORK_AUDIOUNIT)
  1133     find_library(AUDIOUNIT AudioUnit)
  1134     list(APPEND EXTRA_LIBS ${AUDIOUNIT})
  1135   endif()
  1136 
  1137   # iOS hack needed - http://code.google.com/p/ios-cmake/ ?
  1138   if(SDL_VIDEO)
  1139     CheckCOCOA()
  1140     if(VIDEO_OPENGL)
  1141       set(SDL_VIDEO_OPENGL 1)
  1142       set(SDL_VIDEO_OPENGL_CGL 1)
  1143       set(SDL_VIDEO_RENDER_OGL 1)
  1144       if(DARWIN)
  1145         find_library(OpenGL_LIBRARY OpenGL)
  1146         list(APPEND EXTRA_LIBRARIES ${OpenGL_LIBRARY})
  1147       endif()
  1148       set(HAVE_VIDEO_OPENGL TRUE)
  1149     endif()
  1150   endif()
  1151 
  1152   CheckPTHREAD()
  1153 elseif(HAIKU)
  1154   if(SDL_VIDEO)
  1155     set(SDL_VIDEO_DRIVER_HAIKU 1)
  1156     file(GLOB HAIKUVIDEO_SOURCES ${SDL2_SOURCE_DIR}/src/video/haiku/*.c)
  1157     set(SOURCE_FILES ${SOURCE_FILES} ${HAIKUVIDEO_SOURCES})
  1158     set(HAVE_SDL_VIDEO TRUE)
  1159 
  1160     set(SDL_FILESYSTEM_HAIKU 1)
  1161     file(GLOB FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/haiku/*.cc)
  1162     set(SOURCE_FILES ${SOURCE_FILES} ${FILESYSTEM_SOURCES})
  1163     set(HAVE_SDL_FILESYSTEM TRUE)
  1164 
  1165     if(SDL_TIMERS)
  1166       set(SDL_TIMER_HAIKU 1)
  1167       file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/haiku/*.c)
  1168       set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES})
  1169       set(HAVE_SDL_TIMERS TRUE)
  1170     endif(SDL_TIMERS)
  1171 
  1172     if(VIDEO_OPENGL)
  1173       # TODO: Use FIND_PACKAGE(OpenGL) instead
  1174       set(SDL_VIDEO_OPENGL 1)
  1175       set(SDL_VIDEO_OPENGL_BGL 1)
  1176       set(SDL_VIDEO_RENDER_OGL 1)
  1177       list(APPEND EXTRA_LIBS GL)
  1178       set(HAVE_VIDEO_OPENGL TRUE)
  1179     endif()
  1180   endif()
  1181 
  1182   CheckPTHREAD()
  1183 endif()
  1184 
  1185 # Dummies
  1186 # configure.in does it differently:
  1187 # if not have X
  1188 #   if enable_X {  SDL_X_DISABLED = 1 }
  1189 #   [add dummy sources]
  1190 # so it always adds a dummy, without checking, if it was actually requested.
  1191 # This leads to missing internal references on building, since the
  1192 # src/X/*.c does not get included.
  1193 if(NOT HAVE_SDL_JOYSTICK)
  1194   set(SDL_JOYSTICK_DISABLED 1)
  1195   if(SDL_JOYSTICK AND NOT APPLE) # results in unresolved symbols on OSX
  1196 
  1197     file(GLOB JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/dummy/*.c)
  1198     set(SOURCE_FILES ${SOURCE_FILES} ${JOYSTICK_SOURCES})
  1199   endif()
  1200 endif()
  1201 if(NOT HAVE_SDL_HAPTIC)
  1202   set(SDL_HAPTIC_DISABLED 1)
  1203   file(GLOB HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/dummy/*.c)
  1204   set(SOURCE_FILES ${SOURCE_FILES} ${HAPTIC_SOURCES})
  1205 endif()
  1206 if(NOT HAVE_SDL_LOADSO)
  1207   set(SDL_LOADSO_DISABLED 1)
  1208   file(GLOB LOADSO_SOURCES ${SDL2_SOURCE_DIR}/src/loadso/dummy/*.c)
  1209   set(SOURCE_FILES ${SOURCE_FILES} ${LOADSO_SOURCES})
  1210 endif()
  1211 if(NOT HAVE_SDL_FILESYSTEM)
  1212   set(SDL_FILESYSTEM_DISABLED 1)
  1213   file(GLOB FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/dummy/*.c)
  1214   set(SOURCE_FILES ${SOURCE_FILES} ${FILESYSTEM_SOURCES})
  1215 endif()
  1216 
  1217 # We always need to have threads and timers around
  1218 if(NOT HAVE_SDL_THREADS)
  1219   set(SDL_THREADS_DISABLED 1)
  1220   file(GLOB THREADS_SOURCES ${SDL2_SOURCE_DIR}/src/thread/generic/*.c)
  1221   set(SOURCE_FILES ${SOURCE_FILES} ${THREADS_SOURCES})
  1222 endif()
  1223 if(NOT HAVE_SDL_TIMERS)
  1224   set(SDL_TIMERS_DISABLED 1)
  1225   file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/dummy/*.c)
  1226   set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES})
  1227 endif()
  1228 
  1229 if(NOT SDLMAIN_SOURCES)
  1230   file(GLOB SDLMAIN_SOURCES ${SDL2_SOURCE_DIR}/src/main/dummy/*.c)
  1231 endif()
  1232 
  1233 # Append the -MMD -MT flags
  1234 # if(DEPENDENCY_TRACKING)
  1235 #   if(COMPILER_IS_GNUCC)
  1236 #     set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -MMD -MT \$@")
  1237 #   endif()
  1238 # endif()
  1239 
  1240 configure_file("${SDL2_SOURCE_DIR}/include/SDL_config.h.cmake"
  1241   "${SDL2_BINARY_DIR}/include/SDL_config.h")
  1242 
  1243 # Prepare the flags and remove duplicates
  1244 if(EXTRA_LDFLAGS)
  1245   list(REMOVE_DUPLICATES EXTRA_LDFLAGS)
  1246 endif()
  1247 if(EXTRA_LIBS)
  1248   list(REMOVE_DUPLICATES EXTRA_LIBS)
  1249 endif()
  1250 if(EXTRA_CFLAGS)
  1251   list(REMOVE_DUPLICATES EXTRA_CFLAGS)
  1252 endif()
  1253 listtostr(EXTRA_CFLAGS _EXTRA_CFLAGS)
  1254 set(EXTRA_CFLAGS ${_EXTRA_CFLAGS})
  1255 
  1256 # Compat helpers for the configuration files
  1257 if(NOT WINDOWS OR CYGWIN)
  1258   # TODO: we need a Windows script, too
  1259   execute_process(COMMAND sh ${SDL2_SOURCE_DIR}/build-scripts/updaterev.sh)
  1260 
  1261   set(prefix ${CMAKE_INSTALL_PREFIX})
  1262   set(exec_prefix "\${prefix}")
  1263   set(libdir "\${exec_prefix}/lib${LIB_SUFFIX}")
  1264   set(bindir "\${exec_prefix}/bin")
  1265   set(includedir "\${prefix}/include")
  1266   if(SDL_STATIC)
  1267     set(ENABLE_STATIC_TRUE "")
  1268     set(ENABLE_STATIC_FALSE "#")
  1269   else()
  1270     set(ENABLE_STATIC_TRUE "#")
  1271     set(ENABLE_STATIC_FALSE "")
  1272   endif()
  1273   if(SDL_SHARED)
  1274     set(ENABLE_SHARED_TRUE "")
  1275     set(ENABLE_SHARED_FALSE "#")
  1276   else()
  1277     set(ENABLE_SHARED_TRUE "#")
  1278     set(ENABLE_SHARED_FALSE "")
  1279   endif()
  1280 
  1281   # Clean up the different lists
  1282   listtostr(EXTRA_LIBS _EXTRA_LIBS "-l")
  1283   set(SDL_STATIC_LIBS ${SDL_LIBS} ${EXTRA_LDFLAGS} ${_EXTRA_LIBS})
  1284   list(REMOVE_DUPLICATES SDL_STATIC_LIBS)
  1285   listtostr(SDL_STATIC_LIBS _SDL_STATIC_LIBS)
  1286   set(SDL_STATIC_LIBS ${_SDL_STATIC_LIBS})
  1287   listtostr(SDL_LIBS _SDL_LIBS)
  1288   set(SDL_LIBS ${_SDL_LIBS})
  1289 
  1290   # MESSAGE(STATUS "SDL_LIBS: ${SDL_LIBS}")
  1291   # MESSAGE(STATUS "SDL_STATIC_LIBS: ${SDL_STATIC_LIBS}")
  1292 
  1293   configure_file("${SDL2_SOURCE_DIR}/sdl2.pc.in"
  1294     "${SDL2_BINARY_DIR}/sdl2.pc" @ONLY)
  1295   configure_file("${SDL2_SOURCE_DIR}/sdl2-config.in"
  1296     "${SDL2_BINARY_DIR}/sdl2-config")
  1297   configure_file("${SDL2_SOURCE_DIR}/sdl2-config.in"
  1298     "${SDL2_BINARY_DIR}/sdl2-config" @ONLY)
  1299   configure_file("${SDL2_SOURCE_DIR}/SDL2.spec.in"
  1300     "${SDL2_BINARY_DIR}/SDL2.spec" @ONLY)
  1301 endif()
  1302 
  1303 ##### Info output #####
  1304 message(STATUS "")
  1305 message(STATUS "SDL2 was configured with the following options:")
  1306 message(STATUS "")
  1307 message(STATUS "Platform: ${CMAKE_SYSTEM}")
  1308 message(STATUS "64-bit:   ${ARCH_64}")
  1309 message(STATUS "Compiler: ${CMAKE_C_COMPILER}")
  1310 message(STATUS "")
  1311 message(STATUS "Subsystems:")
  1312 foreach(_SUB ${SDL_SUBSYSTEMS})
  1313   string(TOUPPER ${_SUB} _OPT)
  1314   message_bool_option(${_SUB} SDL_${_OPT})
  1315 endforeach()
  1316 message(STATUS "")
  1317 message(STATUS "Options:")
  1318 list(SORT ALLOPTIONS)
  1319 foreach(_OPT ${ALLOPTIONS})
  1320   # Longest option is VIDEO_X11_XSCREENSAVER = 22 characters
  1321   # Get the padding
  1322   string(LENGTH ${_OPT} _OPTLEN)
  1323   math(EXPR _PADLEN "23 - ${_OPTLEN}")
  1324   string(RANDOM LENGTH ${_PADLEN} ALPHABET " " _PADDING)
  1325   message_tested_option(${_OPT} ${_PADDING})
  1326 endforeach()
  1327 message(STATUS "")
  1328 message(STATUS " CFLAGS:        ${CMAKE_C_FLAGS}")
  1329 message(STATUS " EXTRA_CFLAGS:  ${EXTRA_CFLAGS}")
  1330 message(STATUS " EXTRA_LDFLAGS: ${EXTRA_LDFLAGS}")
  1331 message(STATUS " EXTRA_LIBS:    ${EXTRA_LIBS}")
  1332 message(STATUS "")
  1333 message(STATUS " Build Shared Library: ${SDL_SHARED}")
  1334 message(STATUS " Build Static Library: ${SDL_STATIC}")
  1335 message(STATUS "")
  1336 if(UNIX)
  1337   message(STATUS "If something was not detected, although the libraries")
  1338   message(STATUS "were installed, then make sure you have set the")
  1339   message(STATUS "CFLAGS and LDFLAGS environment variables correctly.")
  1340   message(STATUS "")
  1341 endif()
  1342 
  1343 # Ensure that the extra cflags are used at compile time
  1344 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS}")
  1345 
  1346 # Always build SDLmain
  1347 add_library(SDL2main STATIC ${SDLMAIN_SOURCES})
  1348 set(_INSTALL_LIBS "SDL2main")
  1349 
  1350 if(SDL_SHARED)
  1351   add_library(SDL2 SHARED ${SOURCE_FILES})
  1352   if(UNIX)
  1353     set_target_properties(SDL2 PROPERTIES
  1354       VERSION ${LT_VERSION}
  1355       SOVERSION ${LT_REVISION}
  1356       OUTPUT_NAME "SDL2-${LT_RELEASE}")
  1357   else()
  1358     set_target_properties(SDL2 PROPERTIES
  1359       VERSION ${SDL_VERSION}
  1360       SOVERSION ${LT_REVISION}
  1361       OUTPUT_NAME "SDL2")
  1362   endif()
  1363  set(_INSTALL_LIBS "SDL2" ${_INSTALL_LIBS})
  1364  target_link_libraries(SDL2 ${EXTRA_LIBS} ${EXTRA_LDFLAGS})
  1365 endif()
  1366 
  1367 if(SDL_STATIC)
  1368   set (BUILD_SHARED_LIBS FALSE)
  1369   add_library(SDL2-static STATIC ${SOURCE_FILES})
  1370   set_target_properties(SDL2-static PROPERTIES OUTPUT_NAME "SDL2")
  1371   if(MSVC)
  1372     set_target_properties(SDL2-static PROPERTIES LINK_FLAGS_RELEASE "/NODEFAULTLIB")
  1373     set_target_properties(SDL2-static PROPERTIES LINK_FLAGS_DEBUG "/NODEFAULTLIB")
  1374     set_target_properties(SDL2-static PROPERTIES STATIC_LIBRARY_FLAGS "/NODEFAULTLIB")
  1375   endif()
  1376   # TODO: Win32 platforms keep the same suffix .lib for import and static
  1377   # libraries - do we need to consider this?
  1378   set(_INSTALL_LIBS "SDL2-static" ${_INSTALL_LIBS})
  1379   target_link_libraries(SDL2-static ${EXTRA_LIBS} ${EXTRA_LDFLAGS})
  1380 endif()
  1381 
  1382 ##### Installation targets #####
  1383 install(TARGETS ${_INSTALL_LIBS}
  1384   LIBRARY DESTINATION "lib${LIB_SUFFIX}"
  1385   ARCHIVE DESTINATION "lib${LIB_SUFFIX}")
  1386 
  1387 file(GLOB INCLUDE_FILES ${SDL2_SOURCE_DIR}/include/*.h)
  1388 file(GLOB BIN_INCLUDE_FILES ${SDL2_BINARY_DIR}/include/*.h)
  1389 foreach(_FNAME ${BIN_INCLUDE_FILES})
  1390   get_filename_component(_INCNAME ${_FNAME} NAME)
  1391   list(REMOVE_ITEM INCLUDE_FILES ${SDL2_SOURCE_DIR}/include/${_INCNAME})
  1392 endforeach()
  1393 list(APPEND INCLUDE_FILES ${BIN_INCLUDE_FILES})
  1394 install(FILES ${INCLUDE_FILES} DESTINATION include/SDL2)
  1395 
  1396 if(NOT WINDOWS OR CYGWIN)
  1397   if(SDL_SHARED)
  1398     install(CODE "
  1399       execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink
  1400       \"libSDL2-2.0.so\" \"libSDL2.so\")")
  1401     install(FILES ${SDL2_BINARY_DIR}/libSDL2.so DESTINATION "lib${LIB_SUFFIX}")
  1402   endif()
  1403   if(FREEBSD)
  1404     # FreeBSD uses ${PREFIX}/libdata/pkgconfig
  1405     install(FILES ${SDL2_BINARY_DIR}/sdl2.pc DESTINATION "libdata/pkgconfig")
  1406   else()
  1407     install(FILES ${SDL2_BINARY_DIR}/sdl2.pc
  1408       DESTINATION "lib${LIB_SUFFIX}/pkgconfig")
  1409   endif()
  1410   install(PROGRAMS ${SDL2_BINARY_DIR}/sdl2-config DESTINATION bin)
  1411   # TODO: what about the .spec file? Is it only needed for RPM creation?
  1412   install(FILES "${SDL2_SOURCE_DIR}/sdl2.m4" DESTINATION "share/aclocal")
  1413 else()
  1414   if(SDL_SHARED)
  1415     install(TARGETS SDL2 RUNTIME DESTINATION bin)
  1416   endif()
  1417 endif()
  1418 
  1419 ##### Uninstall target #####
  1420 
  1421 configure_file(
  1422     "${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake.in"
  1423     "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
  1424     IMMEDIATE @ONLY)
  1425 
  1426 add_custom_target(uninstall
  1427     COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake)