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