CMakeLists.txt
author Ryan C. Gordon <icculus@icculus.org>
Thu, 17 Aug 2017 15:44:47 -0400
changeset 11312 ee47dce3b10c
parent 11296 44853f387017
child 11320 6b36980ae340
permissions -rw-r--r--
cmake: add core/unix sources to the build.

Fixes Bugzilla #3757.
     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 wchar.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             wcslen wcslcpy wcslcat wcscmp
   627             strlen _strrev _strupr _strlwr strchr strrchr strstr itoa _ltoa
   628             _ultoa strtol strtoul strtoll strtod atoi atof strcmp strncmp
   629             _stricmp _strnicmp sscanf atan atan2 acos asin ceil copysign cos
   630             cosf fabs floor log pow scalbn sin sinf sqrt sqrtf tan tanf)
   631       string(TOUPPER ${_FN} _UPPER)
   632       set(HAVE_${_UPPER} 1)
   633     endforeach()
   634     if(NOT CYGWIN AND NOT MINGW)
   635       set(HAVE_ALLOCA 1)
   636     endif()
   637     set(HAVE_M_PI 1)
   638     add_definitions(-D_USE_MATH_DEFINES) # needed for M_PI
   639     set(STDC_HEADERS 1)
   640   else()
   641     set(HAVE_LIBC TRUE)
   642     check_include_file(sys/types.h HAVE_SYS_TYPES_H)
   643     foreach(_HEADER
   644             stdio.h stdlib.h stddef.h stdarg.h malloc.h memory.h string.h
   645             strings.h wchar.h inttypes.h stdint.h ctype.h math.h iconv.h signal.h)
   646       string(TOUPPER "HAVE_${_HEADER}" _UPPER)
   647       string(REPLACE "." "_" _HAVE_H ${_UPPER})
   648       check_include_file("${_HEADER}" ${_HAVE_H})
   649     endforeach()
   650 
   651     check_include_files("dlfcn.h;stdint.h;stddef.h;inttypes.h;stdlib.h;strings.h;string.h;float.h" STDC_HEADERS)
   652     check_type_size("size_t" SIZEOF_SIZE_T)
   653     check_symbol_exists(M_PI math.h HAVE_M_PI)
   654     # TODO: refine the mprotect check
   655     check_c_source_compiles("#include <sys/types.h>
   656                              #include <sys/mman.h>
   657                              int main() { }" HAVE_MPROTECT)
   658     foreach(_FN
   659             strtod malloc calloc realloc free getenv setenv putenv unsetenv
   660             qsort abs bcopy memset memcpy memmove memcmp strlen strlcpy strlcat
   661             strdup _strrev _strupr _strlwr strchr strrchr strstr itoa _ltoa
   662             _uitoa _ultoa strtol strtoul _i64toa _ui64toa strtoll strtoull
   663             atoi atof strcmp strncmp _stricmp strcasecmp _strnicmp strncasecmp
   664             vsscanf vsnprintf fopen64 fseeko fseeko64 sigaction setjmp
   665             nanosleep sysconf sysctlbyname getauxval poll
   666             )
   667       string(TOUPPER ${_FN} _UPPER)
   668       set(_HAVEVAR "HAVE_${_UPPER}")
   669       check_function_exists("${_FN}" ${_HAVEVAR})
   670     endforeach()
   671 
   672     check_library_exists(m pow "" HAVE_LIBM)
   673     if(HAVE_LIBM)
   674       set(CMAKE_REQUIRED_LIBRARIES m)
   675       foreach(_FN
   676               atan atan2 ceil copysign cos cosf fabs floor log pow scalbn sin
   677               sinf sqrt sqrtf tan tanf acos asin)
   678         string(TOUPPER ${_FN} _UPPER)
   679         set(_HAVEVAR "HAVE_${_UPPER}")
   680         check_function_exists("${_FN}" ${_HAVEVAR})
   681       endforeach()
   682       set(CMAKE_REQUIRED_LIBRARIES)
   683       list(APPEND EXTRA_LIBS m)
   684     endif()
   685 
   686     check_library_exists(iconv iconv_open "" HAVE_LIBICONV)
   687     if(HAVE_LIBICONV)
   688       list(APPEND EXTRA_LIBS iconv)
   689       set(HAVE_ICONV 1)
   690     endif()
   691 
   692     if(NOT APPLE)
   693       check_include_file(alloca.h HAVE_ALLOCA_H)
   694       check_function_exists(alloca HAVE_ALLOCA)
   695     else()
   696       set(HAVE_ALLOCA_H 1)
   697       set(HAVE_ALLOCA 1)
   698     endif()
   699 
   700     check_struct_has_member("struct sigaction" "sa_sigaction" "signal.h" HAVE_SA_SIGACTION)
   701   endif()
   702 else()
   703   if(WINDOWS)
   704     set(HAVE_STDARG_H 1)
   705     set(HAVE_STDDEF_H 1)
   706   endif()
   707 endif()
   708 
   709 
   710 # Enable/disable various subsystems of the SDL library
   711 foreach(_SUB ${SDL_SUBSYSTEMS})
   712   string(TOUPPER ${_SUB} _OPT)
   713   if(NOT SDL_${_OPT})
   714     set(SDL_${_OPT}_DISABLED 1)
   715   endif()
   716 endforeach()
   717 if(SDL_JOYSTICK)
   718   file(GLOB JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/*.c)
   719   set(SOURCE_FILES ${SOURCE_FILES} ${JOYSTICK_SOURCES})
   720 endif()
   721 if(SDL_HAPTIC)
   722   if(NOT SDL_JOYSTICK)
   723     # Haptic requires some private functions from the joystick subsystem.
   724     message_error("SDL_HAPTIC requires SDL_JOYSTICK, which is not enabled")
   725   endif()
   726   file(GLOB HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/*.c)
   727   set(SOURCE_FILES ${SOURCE_FILES} ${HAPTIC_SOURCES})
   728 endif()
   729 if(SDL_POWER)
   730   file(GLOB POWER_SOURCES ${SDL2_SOURCE_DIR}/src/power/*.c)
   731   set(SOURCE_FILES ${SOURCE_FILES} ${POWER_SOURCES})
   732 endif()
   733 # TODO: in configure.in, the test for LOADSO and SDL_DLOPEN is a bit weird:
   734 # if LOADSO is not wanted, SDL_LOADSO_DISABLED is set
   735 # If however on Unix or APPLE dlopen() is detected via CheckDLOPEN(),
   736 # SDL_LOADSO_DISABLED will not be set, regardless of the LOADSO settings
   737 
   738 # General SDL subsystem options, valid for all platforms
   739 if(SDL_AUDIO)
   740   # CheckDummyAudio/CheckDiskAudio - valid for all platforms
   741   if(DUMMYAUDIO)
   742     set(SDL_AUDIO_DRIVER_DUMMY 1)
   743     file(GLOB DUMMYAUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/dummy/*.c)
   744     set(SOURCE_FILES ${SOURCE_FILES} ${DUMMYAUDIO_SOURCES})
   745     set(HAVE_DUMMYAUDIO TRUE)
   746   endif()
   747   if(DISKAUDIO)
   748     set(SDL_AUDIO_DRIVER_DISK 1)
   749     file(GLOB DISKAUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/disk/*.c)
   750     set(SOURCE_FILES ${SOURCE_FILES} ${DISKAUDIO_SOURCES})
   751     set(HAVE_DISKAUDIO TRUE)
   752   endif()
   753 endif()
   754 
   755 if(SDL_DLOPEN)
   756   # Relevant for Unix/Darwin only
   757   if(UNIX OR APPLE)
   758     CheckDLOPEN()
   759   endif()
   760 endif()
   761 
   762 if(SDL_VIDEO)
   763   if(VIDEO_DUMMY)
   764     set(SDL_VIDEO_DRIVER_DUMMY 1)
   765     file(GLOB VIDEO_DUMMY_SOURCES ${SDL2_SOURCE_DIR}/src/video/dummy/*.c)
   766     set(SOURCE_FILES ${SOURCE_FILES} ${VIDEO_DUMMY_SOURCES})
   767     set(HAVE_VIDEO_DUMMY TRUE)
   768     set(HAVE_SDL_VIDEO TRUE)
   769   endif()
   770 endif()
   771 
   772 if(ANDROID)
   773   file(GLOB ANDROID_CORE_SOURCES ${SDL2_SOURCE_DIR}/src/core/android/*.c)
   774   set(SOURCE_FILES ${SOURCE_FILES} ${ANDROID_CORE_SOURCES})
   775 
   776   # SDL_spinlock.c Needs to be compiled in ARM mode.
   777   # There seems to be no better way currently to set the ARM mode.
   778   # see: https://issuetracker.google.com/issues/62264618
   779   # Another option would be to set ARM mode to all compiled files
   780   check_c_compiler_flag(-marm HAVE_ARM_MODE)
   781   if(HAVE_ARM_MODE)
   782     set_source_files_properties(${SDL2_SOURCE_DIR}/src/atomic/SDL_spinlock.c PROPERTIES COMPILE_FLAGS -marm)
   783   endif()
   784 
   785   file(GLOB ANDROID_MAIN_SOURCES ${SDL2_SOURCE_DIR}/src/main/android/*.c)
   786   set(SDLMAIN_SOURCES ${SDLMAIN_SOURCES} ${ANDROID_MAIN_SOURCES})
   787 
   788   if(SDL_AUDIO)
   789     set(SDL_AUDIO_DRIVER_ANDROID 1)
   790     file(GLOB ANDROID_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/android/*.c)
   791     set(SOURCE_FILES ${SOURCE_FILES} ${ANDROID_AUDIO_SOURCES})
   792     set(HAVE_SDL_AUDIO TRUE)
   793   endif()
   794   if(SDL_FILESYSTEM)
   795     set(SDL_FILESYSTEM_ANDROID 1)
   796     file(GLOB ANDROID_FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/android/*.c)
   797     set(SOURCE_FILES ${SOURCE_FILES} ${ANDROID_FILESYSTEM_SOURCES})
   798     set(HAVE_SDL_FILESYSTEM TRUE)
   799   endif()
   800   if(SDL_JOYSTICK)
   801     set(SDL_JOYSTICK_ANDROID 1)
   802     file(GLOB ANDROID_JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/android/*.c)
   803     set(SOURCE_FILES ${SOURCE_FILES} ${ANDROID_JOYSTICK_SOURCES})
   804     set(HAVE_SDL_JOYSTICK TRUE)
   805   endif()
   806   if(SDL_LOADSO)
   807     set(SDL_LOADSO_DLOPEN 1)
   808     file(GLOB LOADSO_SOURCES ${SDL2_SOURCE_DIR}/src/loadso/dlopen/*.c)
   809     set(SOURCE_FILES ${SOURCE_FILES} ${LOADSO_SOURCES})
   810     set(HAVE_SDL_LOADSO TRUE)
   811   endif()
   812   if(SDL_POWER)
   813     set(SDL_POWER_ANDROID 1)
   814     file(GLOB ANDROID_POWER_SOURCES ${SDL2_SOURCE_DIR}/src/power/android/*.c)
   815     set(SOURCE_FILES ${SOURCE_FILES} ${ANDROID_POWER_SOURCES})
   816     set(HAVE_SDL_POWER TRUE)
   817   endif()
   818   if(SDL_TIMERS)
   819     set(SDL_TIMER_UNIX 1)
   820     file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/unix/*.c)
   821     set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES})
   822     set(HAVE_SDL_TIMERS TRUE)
   823   endif()
   824   if(SDL_VIDEO)
   825     set(SDL_VIDEO_DRIVER_ANDROID 1)
   826     file(GLOB ANDROID_VIDEO_SOURCES ${SDL2_SOURCE_DIR}/src/video/android/*.c)
   827     set(SOURCE_FILES ${SOURCE_FILES} ${ANDROID_VIDEO_SOURCES})
   828     set(HAVE_SDL_VIDEO TRUE)
   829 
   830     # Core stuff
   831     find_library(ANDROID_DL_LIBRARY dl)
   832     find_library(ANDROID_LOG_LIBRARY log)
   833     find_library(ANDROID_LIBRARY_LIBRARY android)
   834     list(APPEND EXTRA_LIBS ${ANDROID_DL_LIBRARY} ${ANDROID_LOG_LIBRARY} ${ANDROID_LIBRARY_LIBRARY})
   835     add_definitions(-DGL_GLEXT_PROTOTYPES)
   836 
   837     #enable gles
   838     if(VIDEO_OPENGLES)
   839       set(SDL_VIDEO_OPENGL_EGL 1)
   840       set(HAVE_VIDEO_OPENGLES TRUE)
   841       set(SDL_VIDEO_OPENGL_ES2 1)
   842       set(SDL_VIDEO_RENDER_OGL_ES2 1)
   843 
   844       find_library(OpenGLES1_LIBRARY GLESv1_CM)
   845       find_library(OpenGLES2_LIBRARY GLESv2)
   846       list(APPEND EXTRA_LIBS ${OpenGLES1_LIBRARY} ${OpenGLES2_LIBRARY})
   847     endif()
   848   endif()
   849 
   850   CheckPTHREAD()
   851 
   852   list(APPEND EXTRA_LDFLAGS "-Wl,--undefined=Java_org_libsdl_app_SDLActivity_nativeInit")
   853 endif()
   854 
   855 # Platform-specific options and settings
   856 if(EMSCRIPTEN)
   857   # Hide noisy warnings that intend to aid mostly during initial stages of porting a new
   858   # project. Uncomment at will for verbose cross-compiling -I/../ path info.
   859   add_definitions(-Wno-warn-absolute-paths)
   860   if(SDL_AUDIO)
   861     set(SDL_AUDIO_DRIVER_EMSCRIPTEN 1)
   862     file(GLOB EM_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/emscripten/*.c)
   863     set(SOURCE_FILES ${SOURCE_FILES} ${EM_AUDIO_SOURCES})
   864     set(HAVE_SDL_AUDIO TRUE)
   865   endif()
   866   if(SDL_FILESYSTEM)
   867     set(SDL_FILESYSTEM_EMSCRIPTEN 1)
   868     file(GLOB EM_FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/emscripten/*.c)
   869     set(SOURCE_FILES ${SOURCE_FILES} ${EM_FILESYSTEM_SOURCES})
   870     set(HAVE_SDL_FILESYSTEM TRUE)
   871   endif()
   872   if(SDL_JOYSTICK)
   873     set(SDL_JOYSTICK_EMSCRIPTEN 1)
   874     file(GLOB EM_JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/emscripten/*.c)
   875     set(SOURCE_FILES ${SOURCE_FILES} ${EM_JOYSTICK_SOURCES})
   876     set(HAVE_SDL_JOYSTICK TRUE)
   877   endif()
   878   if(SDL_POWER)
   879     set(SDL_POWER_EMSCRIPTEN 1)
   880     file(GLOB EM_POWER_SOURCES ${SDL2_SOURCE_DIR}/src/power/emscripten/*.c)
   881     set(SOURCE_FILES ${SOURCE_FILES} ${EM_POWER_SOURCES})
   882     set(HAVE_SDL_POWER TRUE)
   883   endif()
   884   if(SDL_TIMERS)
   885     set(SDL_TIMER_UNIX 1)
   886     file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/unix/*.c)
   887     set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES})
   888     set(HAVE_SDL_TIMERS TRUE)
   889 
   890     if(CLOCK_GETTIME)
   891       set(HAVE_CLOCK_GETTIME 1)
   892     endif()
   893   endif()
   894   if(SDL_VIDEO)
   895     set(SDL_VIDEO_DRIVER_EMSCRIPTEN 1)
   896     file(GLOB EM_VIDEO_SOURCES ${SDL2_SOURCE_DIR}/src/video/emscripten/*.c)
   897     set(SOURCE_FILES ${SOURCE_FILES} ${EM_VIDEO_SOURCES})
   898     set(HAVE_SDL_VIDEO TRUE)
   899 
   900     #enable gles
   901     if(VIDEO_OPENGLES)
   902       set(SDL_VIDEO_OPENGL_EGL 1)
   903       set(HAVE_VIDEO_OPENGLES TRUE)
   904       set(SDL_VIDEO_OPENGL_ES2 1)
   905       set(SDL_VIDEO_RENDER_OGL_ES2 1)
   906     endif()
   907   endif()
   908 elseif(UNIX AND NOT APPLE AND NOT ANDROID)
   909   if(SDL_AUDIO)
   910     if(SYSV5 OR SOLARIS OR HPUX)
   911         set(SDL_AUDIO_DRIVER_SUNAUDIO 1)
   912         file(GLOB SUN_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/sun/*.c)
   913         set(SOURCE_FILES ${SOURCE_FILES} ${SUN_AUDIO_SOURCES})
   914         set(HAVE_SDL_AUDIO TRUE)
   915     elseif(NETBSD)
   916         set(SDL_AUDIO_DRIVER_NETBSD 1)
   917         file(GLOB NETBSD_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/netbsd/*.c)
   918         set(SOURCE_FILES ${SOURCE_FILES} ${NETBSD_AUDIO_SOURCES})
   919         set(HAVE_SDL_AUDIO TRUE)
   920     elseif(AIX)
   921         set(SDL_AUDIO_DRIVER_PAUDIO 1)
   922         file(GLOB AIX_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/paudio/*.c)
   923         set(SOURCE_FILES ${SOURCE_FILES} ${AIX_AUDIO_SOURCES})
   924         set(HAVE_SDL_AUDIO TRUE)
   925     endif()
   926     CheckOSS()
   927     CheckALSA()
   928     CheckJACK()
   929     CheckPulseAudio()
   930     CheckESD()
   931     CheckARTS()
   932     CheckNAS()
   933     CheckSNDIO()
   934     CheckFusionSound()
   935     CheckLibSampleRate()
   936   endif()
   937 
   938   if(SDL_VIDEO)
   939     # Need to check for Raspberry PI first and add platform specific compiler flags, otherwise the test for GLES fails!
   940     CheckRPI()
   941     CheckX11()
   942     CheckMir()
   943     CheckDirectFB()
   944     CheckOpenGLX11()
   945     CheckOpenGLESX11()
   946     CheckWayland()
   947     CheckVivante()
   948     CheckKMSDRM()
   949   endif()
   950 
   951   if(UNIX)
   952     file(GLOB CORE_UNIX_SOURCES ${SDL2_SOURCE_DIR}/src/core/unix/*.c)
   953     set(SOURCE_FILES ${SOURCE_FILES} ${CORE_UNIX_SOURCES})
   954   endif()
   955 
   956   if(LINUX)
   957     check_c_source_compiles("
   958         #include <linux/input.h>
   959         #ifndef EVIOCGNAME
   960         #error EVIOCGNAME() ioctl not available
   961         #endif
   962         int main(int argc, char** argv) {}" HAVE_INPUT_EVENTS)
   963 
   964     check_c_source_compiles("
   965         #include <linux/kd.h>
   966         #include <linux/keyboard.h>
   967 
   968         int main(int argc, char **argv) 
   969         {
   970             struct kbentry kbe;
   971             kbe.kb_table = KG_CTRL;
   972             ioctl(0, KDGKBENT, &kbe);
   973         }" HAVE_INPUT_KD)
   974 
   975     file(GLOB CORE_LINUX_SOURCES ${SDL2_SOURCE_DIR}/src/core/linux/*.c)
   976     set(SOURCE_FILES ${SOURCE_FILES} ${CORE_LINUX_SOURCES})
   977 
   978     if(HAVE_INPUT_EVENTS)
   979       set(SDL_INPUT_LINUXEV 1)
   980     endif()
   981 
   982     if(SDL_HAPTIC AND HAVE_INPUT_EVENTS)
   983       set(SDL_HAPTIC_LINUX 1)
   984       file(GLOB HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/linux/*.c)
   985       set(SOURCE_FILES ${SOURCE_FILES} ${HAPTIC_SOURCES})
   986       set(HAVE_SDL_HAPTIC TRUE)
   987     endif()
   988 
   989     if(HAVE_INPUT_KD)
   990       set(SDL_INPUT_LINUXKD 1)
   991     endif()
   992 
   993     check_include_file("libudev.h" HAVE_LIBUDEV_H)
   994 
   995     if(PKG_CONFIG_FOUND)
   996       pkg_search_module(DBUS dbus-1 dbus)
   997       if(DBUS_FOUND)
   998         set(HAVE_DBUS_DBUS_H TRUE)
   999         include_directories(${DBUS_INCLUDE_DIRS})
  1000         list(APPEND EXTRA_LIBS ${DBUS_LIBRARIES})
  1001       endif()
  1002 
  1003       pkg_search_module(IBUS ibus-1.0 ibus)
  1004       if(IBUS_FOUND)
  1005         set(HAVE_IBUS_IBUS_H TRUE)
  1006         include_directories(${IBUS_INCLUDE_DIRS})
  1007         list(APPEND EXTRA_LIBS ${IBUS_LIBRARIES})
  1008       endif()
  1009     endif()
  1010 
  1011     check_include_file("fcitx/frontend.h" HAVE_FCITX_FRONTEND_H)
  1012 
  1013   endif()
  1014 
  1015   if(INPUT_TSLIB)
  1016     check_c_source_compiles("
  1017         #include \"tslib.h\"
  1018         int main(int argc, char** argv) { }" HAVE_INPUT_TSLIB)
  1019     if(HAVE_INPUT_TSLIB)
  1020       set(SDL_INPUT_TSLIB 1)
  1021       list(APPEND EXTRA_LIBS ts)
  1022     endif()
  1023   endif()
  1024 
  1025   if(SDL_JOYSTICK)
  1026     CheckUSBHID()   # seems to be BSD specific - limit the test to BSD only?
  1027     if(LINUX AND NOT ANDROID)
  1028       set(SDL_JOYSTICK_LINUX 1)
  1029       file(GLOB JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/linux/*.c)
  1030       set(SOURCE_FILES ${SOURCE_FILES} ${JOYSTICK_SOURCES})
  1031       set(HAVE_SDL_JOYSTICK TRUE)
  1032     endif()
  1033   endif()
  1034 
  1035   CheckPTHREAD()
  1036 
  1037   if(CLOCK_GETTIME)
  1038     check_library_exists(rt clock_gettime "" FOUND_CLOCK_GETTIME)
  1039     if(FOUND_CLOCK_GETTIME)
  1040       list(APPEND EXTRA_LIBS rt)
  1041       set(HAVE_CLOCK_GETTIME 1)
  1042     else()
  1043       check_library_exists(c clock_gettime "" FOUND_CLOCK_GETTIME)
  1044       if(FOUND_CLOCK_GETTIME)
  1045         set(HAVE_CLOCK_GETTIME 1)
  1046       endif()
  1047     endif()
  1048   endif()
  1049 
  1050   check_include_file(linux/version.h HAVE_LINUX_VERSION_H)
  1051   if(HAVE_LINUX_VERSION_H)
  1052     set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DHAVE_LINUX_VERSION_H")
  1053   endif()
  1054 
  1055   if(SDL_POWER)
  1056     if(LINUX)
  1057       set(SDL_POWER_LINUX 1)
  1058       file(GLOB POWER_SOURCES ${SDL2_SOURCE_DIR}/src/power/linux/*.c)
  1059       set(SOURCE_FILES ${SOURCE_FILES} ${POWER_SOURCES})
  1060       set(HAVE_SDL_POWER TRUE)
  1061     endif()
  1062   endif()
  1063 
  1064   if(SDL_FILESYSTEM)
  1065     set(SDL_FILESYSTEM_UNIX 1)
  1066     file(GLOB FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/unix/*.c)
  1067     set(SOURCE_FILES ${SOURCE_FILES} ${FILESYSTEM_SOURCES})
  1068     set(HAVE_SDL_FILESYSTEM TRUE)
  1069   endif()
  1070 
  1071   if(SDL_TIMERS)
  1072     set(SDL_TIMER_UNIX 1)
  1073     file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/unix/*.c)
  1074     set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES})
  1075     set(HAVE_SDL_TIMERS TRUE)
  1076   endif()
  1077 
  1078   if(RPATH)
  1079     set(SDL_RLD_FLAGS "")
  1080     if(BSDI OR FREEBSD OR LINUX OR NETBSD)
  1081       set(CMAKE_REQUIRED_FLAGS "-Wl,--enable-new-dtags")
  1082       check_c_compiler_flag("" HAVE_ENABLE_NEW_DTAGS)
  1083       set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS})
  1084       if(HAVE_ENABLE_NEW_DTAGS)
  1085         set(SDL_RLD_FLAGS "-Wl,-rpath,\${libdir} -Wl,--enable-new-dtags")
  1086       else()
  1087         set(SDL_RLD_FLAGS "-Wl,-rpath,\${libdir}")
  1088       endif()
  1089     elseif(SOLARIS)
  1090       set(SDL_RLD_FLAGS "-R\${libdir}")
  1091     endif()
  1092     set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)
  1093     set(HAVE_RPATH TRUE)
  1094   endif()
  1095 
  1096 elseif(WINDOWS)
  1097   find_program(WINDRES windres)
  1098 
  1099   check_c_source_compiles("
  1100     #include <windows.h>
  1101     int main(int argc, char **argv) { }" HAVE_WIN32_CC)
  1102 
  1103   file(GLOB CORE_SOURCES ${SDL2_SOURCE_DIR}/src/core/windows/*.c)
  1104   set(SOURCE_FILES ${SOURCE_FILES} ${CORE_SOURCES})
  1105 
  1106   if(MSVC)
  1107     # Prevent codegen that would use the VC runtime libraries.
  1108     set_property(DIRECTORY . APPEND PROPERTY COMPILE_OPTIONS "/GS-")
  1109     if(NOT ARCH_64)
  1110       set_property(DIRECTORY . APPEND PROPERTY COMPILE_OPTIONS "/arch:SSE")
  1111     endif()
  1112   endif()
  1113 
  1114   # Check for DirectX
  1115   if(DIRECTX)
  1116     if(DEFINED MSVC_VERSION AND NOT ${MSVC_VERSION} LESS 1700)
  1117         set(USE_WINSDK_DIRECTX TRUE)
  1118     endif()
  1119     if(NOT CMAKE_COMPILER_IS_MINGW AND NOT USE_WINSDK_DIRECTX)
  1120       if("$ENV{DXSDK_DIR}" STREQUAL "")
  1121         message_error("DIRECTX requires the \$DXSDK_DIR environment variable to be set")
  1122       endif()
  1123       set(CMAKE_REQUIRED_FLAGS "/I\"$ENV{DXSDK_DIR}\\Include\"")
  1124     endif()
  1125 
  1126     if(HAVE_WIN32_CC)
  1127       # xinput.h may need windows.h, but doesn't include it itself.
  1128       check_c_source_compiles("
  1129         #include <windows.h>
  1130         #include <xinput.h>
  1131         int main(int argc, char **argv) { }" HAVE_XINPUT_H)
  1132       check_c_source_compiles("
  1133         #include <windows.h>
  1134         #include <xinput.h>
  1135         XINPUT_GAMEPAD_EX x1;
  1136         int main(int argc, char **argv) { }" HAVE_XINPUT_GAMEPAD_EX)
  1137       check_c_source_compiles("
  1138         #include <windows.h>
  1139         #include <xinput.h>
  1140         XINPUT_STATE_EX s1;
  1141         int main(int argc, char **argv) { }" HAVE_XINPUT_STATE_EX)
  1142     else()
  1143       check_include_file(xinput.h HAVE_XINPUT_H)
  1144     endif()
  1145 
  1146     check_include_file(d3d9.h HAVE_D3D_H)
  1147     check_include_file(d3d11_1.h HAVE_D3D11_H)
  1148     check_include_file(ddraw.h HAVE_DDRAW_H)
  1149     check_include_file(dsound.h HAVE_DSOUND_H)
  1150     check_include_file(dinput.h HAVE_DINPUT_H)
  1151     check_include_file(xaudio2.h HAVE_XAUDIO2_H)
  1152     check_include_file(audioclient.h HAVE_AUDIOCLIENT_H)
  1153     check_include_file(dxgi.h HAVE_DXGI_H)
  1154     if(HAVE_D3D_H OR HAVE_D3D11_H OR HAVE_DDRAW_H OR HAVE_DSOUND_H OR HAVE_DINPUT_H OR HAVE_XAUDIO2_H)
  1155       set(HAVE_DIRECTX TRUE)
  1156       if(NOT CMAKE_COMPILER_IS_MINGW AND NOT USE_WINSDK_DIRECTX)
  1157       # TODO: change $ENV{DXSDL_DIR} to get the path from the include checks
  1158         link_directories($ENV{DXSDK_DIR}\\lib\\${PROCESSOR_ARCH})
  1159         include_directories($ENV{DXSDK_DIR}\\Include)
  1160       endif()
  1161     endif()
  1162     set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS})
  1163   endif()
  1164 
  1165   if(SDL_AUDIO)
  1166     set(SDL_AUDIO_DRIVER_WINMM 1)
  1167     file(GLOB WINMM_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/winmm/*.c)
  1168     set(SOURCE_FILES ${SOURCE_FILES} ${WINMM_AUDIO_SOURCES})
  1169     set(HAVE_SDL_AUDIO TRUE)
  1170 
  1171     if(HAVE_DSOUND_H)
  1172       set(SDL_AUDIO_DRIVER_DSOUND 1)
  1173       file(GLOB DSOUND_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/directsound/*.c)
  1174       set(SOURCE_FILES ${SOURCE_FILES} ${DSOUND_AUDIO_SOURCES})
  1175     endif()
  1176 
  1177     if(HAVE_XAUDIO2_H)
  1178       set(SDL_AUDIO_DRIVER_XAUDIO2 1)
  1179       file(GLOB XAUDIO2_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/xaudio2/*.c)
  1180       set(SOURCE_FILES ${SOURCE_FILES} ${XAUDIO2_AUDIO_SOURCES})
  1181     endif()
  1182 
  1183     if(HAVE_AUDIOCLIENT_H)
  1184       set(SDL_AUDIO_DRIVER_WASAPI 1)
  1185       file(GLOB WASAPI_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/wasapi/*.c)
  1186       set(SOURCE_FILES ${SOURCE_FILES} ${WASAPI_AUDIO_SOURCES})
  1187     endif()
  1188   endif()
  1189 
  1190   if(SDL_VIDEO)
  1191     # requires SDL_LOADSO on Windows (IME, DX, etc.)
  1192     if(NOT SDL_LOADSO)
  1193       message_error("SDL_VIDEO requires SDL_LOADSO, which is not enabled")
  1194     endif()
  1195     set(SDL_VIDEO_DRIVER_WINDOWS 1)
  1196     file(GLOB WIN_VIDEO_SOURCES ${SDL2_SOURCE_DIR}/src/video/windows/*.c)
  1197     set(SOURCE_FILES ${SOURCE_FILES} ${WIN_VIDEO_SOURCES})
  1198 
  1199     if(RENDER_D3D AND HAVE_D3D_H)
  1200       set(SDL_VIDEO_RENDER_D3D 1)
  1201       set(HAVE_RENDER_D3D TRUE)
  1202     endif()
  1203     if(RENDER_D3D AND HAVE_D3D11_H)
  1204       set(SDL_VIDEO_RENDER_D3D11 1)
  1205       set(HAVE_RENDER_D3D TRUE)
  1206     endif()
  1207     set(HAVE_SDL_VIDEO TRUE)
  1208   endif()
  1209 
  1210   if(SDL_THREADS)
  1211     set(SDL_THREAD_WINDOWS 1)
  1212     set(SOURCE_FILES ${SOURCE_FILES}
  1213       ${SDL2_SOURCE_DIR}/src/thread/windows/SDL_sysmutex.c
  1214       ${SDL2_SOURCE_DIR}/src/thread/windows/SDL_syssem.c
  1215       ${SDL2_SOURCE_DIR}/src/thread/windows/SDL_systhread.c
  1216       ${SDL2_SOURCE_DIR}/src/thread/windows/SDL_systls.c
  1217       ${SDL2_SOURCE_DIR}/src/thread/generic/SDL_syscond.c)
  1218     set(HAVE_SDL_THREADS TRUE)
  1219   endif()
  1220 
  1221   if(SDL_POWER)
  1222     set(SDL_POWER_WINDOWS 1)
  1223     set(SOURCE_FILES ${SOURCE_FILES} ${SDL2_SOURCE_DIR}/src/power/windows/SDL_syspower.c)
  1224     set(HAVE_SDL_POWER TRUE)
  1225   endif()
  1226 
  1227   if(SDL_FILESYSTEM)
  1228     set(SDL_FILESYSTEM_WINDOWS 1)
  1229     file(GLOB FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/windows/*.c)
  1230     set(SOURCE_FILES ${SOURCE_FILES} ${FILESYSTEM_SOURCES})
  1231     set(HAVE_SDL_FILESYSTEM TRUE)
  1232   endif()
  1233 
  1234   # Libraries for Win32 native and MinGW
  1235   list(APPEND EXTRA_LIBS user32 gdi32 winmm imm32 ole32 oleaut32 version uuid)
  1236 
  1237   # TODO: in configure.in the check for timers is set on
  1238   # cygwin | mingw32* - does this include mingw32CE?
  1239   if(SDL_TIMERS)
  1240     set(SDL_TIMER_WINDOWS 1)
  1241     file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/windows/*.c)
  1242     set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES})
  1243     set(HAVE_SDL_TIMERS TRUE)
  1244   endif()
  1245 
  1246   if(SDL_LOADSO)
  1247     set(SDL_LOADSO_WINDOWS 1)
  1248     file(GLOB LOADSO_SOURCES ${SDL2_SOURCE_DIR}/src/loadso/windows/*.c)
  1249     set(SOURCE_FILES ${SOURCE_FILES} ${LOADSO_SOURCES})
  1250     set(HAVE_SDL_LOADSO TRUE)
  1251   endif()
  1252 
  1253   file(GLOB CORE_SOURCES ${SDL2_SOURCE_DIR}/src/core/windows/*.c)
  1254   set(SOURCE_FILES ${SOURCE_FILES} ${CORE_SOURCES})
  1255 
  1256   if(SDL_VIDEO)
  1257     if(VIDEO_OPENGL)
  1258       set(SDL_VIDEO_OPENGL 1)
  1259       set(SDL_VIDEO_OPENGL_WGL 1)
  1260       set(SDL_VIDEO_RENDER_OGL 1)
  1261       set(HAVE_VIDEO_OPENGL TRUE)
  1262     endif()
  1263 
  1264     if(VIDEO_OPENGLES)
  1265       set(SDL_VIDEO_OPENGL_EGL 1)
  1266       set(SDL_VIDEO_OPENGL_ES2 1)
  1267       set(SDL_VIDEO_RENDER_OGL_ES2 1)
  1268       set(HAVE_VIDEO_OPENGLES TRUE)
  1269     endif()
  1270   endif()
  1271 
  1272   if(SDL_JOYSTICK)
  1273     file(GLOB JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/windows/*.c)
  1274     set(SOURCE_FILES ${SOURCE_FILES} ${JOYSTICK_SOURCES})
  1275     if(HAVE_DINPUT_H)
  1276       set(SDL_JOYSTICK_DINPUT 1)
  1277       list(APPEND EXTRA_LIBS dinput8)
  1278       if(CMAKE_COMPILER_IS_MINGW)
  1279         list(APPEND EXTRA_LIBS dxerr8)
  1280       elseif (NOT USE_WINSDK_DIRECTX)
  1281         list(APPEND EXTRA_LIBS dxerr)
  1282       endif()
  1283     endif()
  1284     if(HAVE_XINPUT_H)
  1285       set(SDL_JOYSTICK_XINPUT 1)
  1286     endif()
  1287     if(NOT HAVE_DINPUT_H AND NOT HAVE_XINPUT_H)
  1288       set(SDL_JOYSTICK_WINMM 1)
  1289     endif()
  1290     set(HAVE_SDL_JOYSTICK TRUE)
  1291 
  1292     if(SDL_HAPTIC)
  1293       if(HAVE_DINPUT_H OR HAVE_XINPUT_H)
  1294         file(GLOB HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/windows/*.c)
  1295         if(HAVE_DINPUT_H)
  1296           set(SDL_HAPTIC_DINPUT 1)
  1297         endif()
  1298         if(HAVE_XINPUT_H)
  1299           set(SDL_HAPTIC_XINPUT 1)
  1300         endif()
  1301       else()
  1302         file(GLOB HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/dummy/*.c)
  1303         set(SDL_HAPTIC_DUMMY 1)
  1304       endif()
  1305       set(SOURCE_FILES ${SOURCE_FILES} ${HAPTIC_SOURCES})
  1306       set(HAVE_SDL_HAPTIC TRUE)
  1307     endif()
  1308   endif()
  1309 
  1310   file(GLOB VERSION_SOURCES ${SDL2_SOURCE_DIR}/src/main/windows/*.rc)
  1311   file(GLOB SDLMAIN_SOURCES ${SDL2_SOURCE_DIR}/src/main/windows/*.c)
  1312   if(MINGW OR CYGWIN)
  1313     list(APPEND EXTRA_LIBS mingw32)
  1314     list(APPEND EXTRA_LDFLAGS "-mwindows")
  1315     set(SDL_CFLAGS "${SDL_CFLAGS} -Dmain=SDL_main")
  1316     list(APPEND SDL_LIBS "-lmingw32" "-lSDL2main" "-mwindows")
  1317   endif()
  1318 elseif(APPLE)
  1319   # TODO: rework this for proper MacOS X, iOS and Darwin support
  1320 
  1321   # Requires the darwin file implementation
  1322   if(SDL_FILE)
  1323     file(GLOB EXTRA_SOURCES ${SDL2_SOURCE_DIR}/src/file/cocoa/*.m)
  1324     set(SOURCE_FILES ${EXTRA_SOURCES} ${SOURCE_FILES})
  1325     set_source_files_properties(${EXTRA_SOURCES} PROPERTIES LANGUAGE C)
  1326     set(HAVE_SDL_FILE TRUE)
  1327     set(SDL_FRAMEWORK_COCOA 1)
  1328     set(SDL_FRAMEWORK_COREVIDEO 1)
  1329   else()
  1330     message_error("SDL_FILE must be enabled to build on MacOS X")
  1331   endif()
  1332 
  1333   if(SDL_AUDIO)
  1334     set(SDL_AUDIO_DRIVER_COREAUDIO 1)
  1335     file(GLOB AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/coreaudio/*.m)
  1336     set(SOURCE_FILES ${SOURCE_FILES} ${AUDIO_SOURCES})
  1337     set(HAVE_SDL_AUDIO TRUE)
  1338     set(SDL_FRAMEWORK_COREAUDIO 1)
  1339     set(SDL_FRAMEWORK_AUDIOTOOLBOX 1)
  1340   endif()
  1341 
  1342   if(SDL_JOYSTICK)
  1343     set(SDL_JOYSTICK_IOKIT 1)
  1344     if (IOS)
  1345       file(GLOB JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/iphoneos/*.m)
  1346     else()
  1347       file(GLOB JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/darwin/*.c)
  1348     endif()
  1349     set(SOURCE_FILES ${SOURCE_FILES} ${JOYSTICK_SOURCES})
  1350     set(HAVE_SDL_JOYSTICK TRUE)
  1351     set(SDL_FRAMEWORK_IOKIT 1)
  1352     set(SDL_FRAMEWORK_FF 1)
  1353   endif()
  1354 
  1355   if(SDL_HAPTIC)
  1356     set(SDL_HAPTIC_IOKIT 1)
  1357     if (IOS)
  1358       file(GLOB HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/dummy/*.c)
  1359       set(SDL_HAPTIC_DUMMY 1)
  1360     else()
  1361       file(GLOB HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/darwin/*.c)
  1362     endif()
  1363     set(SOURCE_FILES ${SOURCE_FILES} ${HAPTIC_SOURCES})
  1364     set(HAVE_SDL_HAPTIC TRUE)
  1365     set(SDL_FRAMEWORK_IOKIT 1)
  1366     set(SDL_FRAMEWORK_FF 1)
  1367     if(NOT SDL_JOYSTICK)
  1368       message(FATAL_ERROR "SDL_HAPTIC requires SDL_JOYSTICK to be enabled")
  1369     endif()
  1370   endif()
  1371 
  1372   if(SDL_POWER)
  1373     set(SDL_POWER_MACOSX 1)
  1374     if (IOS)
  1375       file(GLOB POWER_SOURCES ${SDL2_SOURCE_DIR}/src/power/uikit/*.m)
  1376     else()
  1377       file(GLOB POWER_SOURCES ${SDL2_SOURCE_DIR}/src/power/macosx/*.c)
  1378     endif()
  1379     set(SOURCE_FILES ${SOURCE_FILES} ${POWER_SOURCES})
  1380     set(HAVE_SDL_POWER TRUE)
  1381     set(SDL_FRAMEWORK_CARBON 1)
  1382     set(SDL_FRAMEWORK_IOKIT 1)
  1383   endif()
  1384 
  1385   if(SDL_TIMERS)
  1386     set(SDL_TIMER_UNIX 1)
  1387     file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/unix/*.c)
  1388     set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES})
  1389     set(HAVE_SDL_TIMERS TRUE)
  1390   endif(SDL_TIMERS)
  1391 
  1392   if(SDL_FILESYSTEM)
  1393     set(SDL_FILESYSTEM_COCOA 1)
  1394     file(GLOB FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/cocoa/*.m)
  1395     set_source_files_properties(${FILESYSTEM_SOURCES} PROPERTIES LANGUAGE C)
  1396     set(SOURCE_FILES ${SOURCE_FILES} ${FILESYSTEM_SOURCES})
  1397     set(HAVE_SDL_FILESYSTEM TRUE)
  1398   endif()
  1399 
  1400   # Actually load the frameworks at the end so we don't duplicate include.
  1401   if(SDL_FRAMEWORK_COREVIDEO)
  1402     find_library(COREVIDEO CoreVideo)
  1403     list(APPEND EXTRA_LIBS ${COREVIDEO})
  1404   endif()
  1405   if(SDL_FRAMEWORK_COCOA)
  1406     find_library(COCOA_LIBRARY Cocoa)
  1407     list(APPEND EXTRA_LIBS ${COCOA_LIBRARY})
  1408   endif()
  1409   if(SDL_FRAMEWORK_IOKIT)
  1410     find_library(IOKIT IOKit)
  1411     list(APPEND EXTRA_LIBS ${IOKIT})
  1412   endif()
  1413   if(SDL_FRAMEWORK_FF)
  1414     find_library(FORCEFEEDBACK ForceFeedback)
  1415     list(APPEND EXTRA_LIBS ${FORCEFEEDBACK})
  1416   endif()
  1417   if(SDL_FRAMEWORK_CARBON)
  1418     find_library(CARBON_LIBRARY Carbon)
  1419     list(APPEND EXTRA_LIBS ${CARBON_LIBRARY})
  1420   endif()
  1421   if(SDL_FRAMEWORK_COREAUDIO)
  1422     find_library(COREAUDIO CoreAudio)
  1423     list(APPEND EXTRA_LIBS ${COREAUDIO})
  1424   endif()
  1425   if(SDL_FRAMEWORK_AUDIOTOOLBOX)
  1426     find_library(AUDIOTOOLBOX AudioToolbox)
  1427     list(APPEND EXTRA_LIBS ${AUDIOTOOLBOX})
  1428   endif()
  1429 
  1430   # iOS hack needed - http://code.google.com/p/ios-cmake/ ?
  1431   if(SDL_VIDEO)
  1432     if (IOS)
  1433       set(SDL_VIDEO_DRIVER_UIKIT 1)
  1434       file(GLOB UIKITVIDEO_SOURCES ${SDL2_SOURCE_DIR}/src/video/uikit/*.m)
  1435       set(SOURCE_FILES ${SOURCE_FILES} ${UIKITVIDEO_SOURCES})
  1436     else()
  1437       CheckCOCOA()
  1438       if(VIDEO_OPENGL)
  1439         set(SDL_VIDEO_OPENGL 1)
  1440         set(SDL_VIDEO_OPENGL_CGL 1)
  1441         set(SDL_VIDEO_RENDER_OGL 1)
  1442         set(HAVE_VIDEO_OPENGL TRUE)
  1443       endif()
  1444     endif()
  1445   endif()
  1446 
  1447   CheckPTHREAD()
  1448 elseif(HAIKU)
  1449   if(SDL_VIDEO)
  1450     set(SDL_VIDEO_DRIVER_HAIKU 1)
  1451     file(GLOB HAIKUVIDEO_SOURCES ${SDL2_SOURCE_DIR}/src/video/haiku/*.c)
  1452     set(SOURCE_FILES ${SOURCE_FILES} ${HAIKUVIDEO_SOURCES})
  1453     set(HAVE_SDL_VIDEO TRUE)
  1454 
  1455     set(SDL_FILESYSTEM_HAIKU 1)
  1456     file(GLOB FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/haiku/*.cc)
  1457     set(SOURCE_FILES ${SOURCE_FILES} ${FILESYSTEM_SOURCES})
  1458     set(HAVE_SDL_FILESYSTEM TRUE)
  1459 
  1460     if(SDL_TIMERS)
  1461       set(SDL_TIMER_HAIKU 1)
  1462       file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/haiku/*.c)
  1463       set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES})
  1464       set(HAVE_SDL_TIMERS TRUE)
  1465     endif(SDL_TIMERS)
  1466 
  1467     if(VIDEO_OPENGL)
  1468       # TODO: Use FIND_PACKAGE(OpenGL) instead
  1469       set(SDL_VIDEO_OPENGL 1)
  1470       set(SDL_VIDEO_OPENGL_BGL 1)
  1471       set(SDL_VIDEO_RENDER_OGL 1)
  1472       list(APPEND EXTRA_LIBS GL)
  1473       set(HAVE_VIDEO_OPENGL TRUE)
  1474     endif()
  1475   endif()
  1476 
  1477   CheckPTHREAD()
  1478 endif()
  1479 
  1480 # Dummies
  1481 # configure.in does it differently:
  1482 # if not have X
  1483 #   if enable_X {  SDL_X_DISABLED = 1 }
  1484 #   [add dummy sources]
  1485 # so it always adds a dummy, without checking, if it was actually requested.
  1486 # This leads to missing internal references on building, since the
  1487 # src/X/*.c does not get included.
  1488 if(NOT HAVE_SDL_JOYSTICK)
  1489   set(SDL_JOYSTICK_DISABLED 1)
  1490   if(SDL_JOYSTICK AND NOT APPLE) # results in unresolved symbols on OSX
  1491 
  1492     file(GLOB JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/dummy/*.c)
  1493     set(SOURCE_FILES ${SOURCE_FILES} ${JOYSTICK_SOURCES})
  1494   endif()
  1495 endif()
  1496 if(NOT HAVE_SDL_HAPTIC)
  1497   set(SDL_HAPTIC_DISABLED 1)
  1498   file(GLOB HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/dummy/*.c)
  1499   set(SOURCE_FILES ${SOURCE_FILES} ${HAPTIC_SOURCES})
  1500 endif()
  1501 if(NOT HAVE_SDL_LOADSO)
  1502   set(SDL_LOADSO_DISABLED 1)
  1503   file(GLOB LOADSO_SOURCES ${SDL2_SOURCE_DIR}/src/loadso/dummy/*.c)
  1504   set(SOURCE_FILES ${SOURCE_FILES} ${LOADSO_SOURCES})
  1505 endif()
  1506 if(NOT HAVE_SDL_FILESYSTEM)
  1507   set(SDL_FILESYSTEM_DISABLED 1)
  1508   file(GLOB FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/dummy/*.c)
  1509   set(SOURCE_FILES ${SOURCE_FILES} ${FILESYSTEM_SOURCES})
  1510 endif()
  1511 
  1512 # We always need to have threads and timers around
  1513 if(NOT HAVE_SDL_THREADS)
  1514   set(SDL_THREADS_DISABLED 1)
  1515   file(GLOB THREADS_SOURCES ${SDL2_SOURCE_DIR}/src/thread/generic/*.c)
  1516   set(SOURCE_FILES ${SOURCE_FILES} ${THREADS_SOURCES})
  1517 endif()
  1518 if(NOT HAVE_SDL_TIMERS)
  1519   set(SDL_TIMERS_DISABLED 1)
  1520   file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/dummy/*.c)
  1521   set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES})
  1522 endif()
  1523 
  1524 if(NOT SDLMAIN_SOURCES)
  1525   file(GLOB SDLMAIN_SOURCES ${SDL2_SOURCE_DIR}/src/main/dummy/*.c)
  1526 endif()
  1527 
  1528 # Append the -MMD -MT flags
  1529 # if(DEPENDENCY_TRACKING)
  1530 #   if(COMPILER_IS_GNUCC)
  1531 #     set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -MMD -MT \$@")
  1532 #   endif()
  1533 # endif()
  1534 
  1535 configure_file("${SDL2_SOURCE_DIR}/include/SDL_config.h.cmake"
  1536   "${SDL2_BINARY_DIR}/include/SDL_config.h")
  1537 
  1538 # Prepare the flags and remove duplicates
  1539 if(EXTRA_LDFLAGS)
  1540   list(REMOVE_DUPLICATES EXTRA_LDFLAGS)
  1541 endif()
  1542 if(EXTRA_LIBS)
  1543   list(REMOVE_DUPLICATES EXTRA_LIBS)
  1544 endif()
  1545 if(EXTRA_CFLAGS)
  1546   list(REMOVE_DUPLICATES EXTRA_CFLAGS)
  1547 endif()
  1548 listtostr(EXTRA_CFLAGS _EXTRA_CFLAGS)
  1549 set(EXTRA_CFLAGS ${_EXTRA_CFLAGS})
  1550 
  1551 # Compat helpers for the configuration files
  1552 if(NOT WINDOWS OR CYGWIN)
  1553   # TODO: we need a Windows script, too
  1554   execute_process(COMMAND sh ${SDL2_SOURCE_DIR}/build-scripts/updaterev.sh)
  1555 
  1556   set(prefix ${CMAKE_INSTALL_PREFIX})
  1557   set(exec_prefix "\${prefix}")
  1558   set(libdir "\${exec_prefix}/lib${LIB_SUFFIX}")
  1559   set(bindir "\${exec_prefix}/bin")
  1560   set(includedir "\${prefix}/include")
  1561   if(SDL_STATIC)
  1562     set(ENABLE_STATIC_TRUE "")
  1563     set(ENABLE_STATIC_FALSE "#")
  1564   else()
  1565     set(ENABLE_STATIC_TRUE "#")
  1566     set(ENABLE_STATIC_FALSE "")
  1567   endif()
  1568   if(SDL_SHARED)
  1569     set(ENABLE_SHARED_TRUE "")
  1570     set(ENABLE_SHARED_FALSE "#")
  1571   else()
  1572     set(ENABLE_SHARED_TRUE "#")
  1573     set(ENABLE_SHARED_FALSE "")
  1574   endif()
  1575 
  1576   # Clean up the different lists
  1577   listtostr(EXTRA_LIBS _EXTRA_LIBS "-l")
  1578   set(SDL_STATIC_LIBS ${SDL_LIBS} ${EXTRA_LDFLAGS} ${_EXTRA_LIBS})
  1579   list(REMOVE_DUPLICATES SDL_STATIC_LIBS)
  1580   listtostr(SDL_STATIC_LIBS _SDL_STATIC_LIBS)
  1581   set(SDL_STATIC_LIBS ${_SDL_STATIC_LIBS})
  1582   listtostr(SDL_LIBS _SDL_LIBS)
  1583   set(SDL_LIBS ${_SDL_LIBS})
  1584 
  1585   # MESSAGE(STATUS "SDL_LIBS: ${SDL_LIBS}")
  1586   # MESSAGE(STATUS "SDL_STATIC_LIBS: ${SDL_STATIC_LIBS}")
  1587 
  1588   configure_file("${SDL2_SOURCE_DIR}/sdl2.pc.in"
  1589     "${SDL2_BINARY_DIR}/sdl2.pc" @ONLY)
  1590   configure_file("${SDL2_SOURCE_DIR}/sdl2-config.in"
  1591     "${SDL2_BINARY_DIR}/sdl2-config")
  1592   configure_file("${SDL2_SOURCE_DIR}/sdl2-config.in"
  1593     "${SDL2_BINARY_DIR}/sdl2-config" @ONLY)
  1594   configure_file("${SDL2_SOURCE_DIR}/SDL2.spec.in"
  1595     "${SDL2_BINARY_DIR}/SDL2.spec" @ONLY)
  1596 endif()
  1597 
  1598 ##### Info output #####
  1599 message(STATUS "")
  1600 message(STATUS "SDL2 was configured with the following options:")
  1601 message(STATUS "")
  1602 message(STATUS "Platform: ${CMAKE_SYSTEM}")
  1603 message(STATUS "64-bit:   ${ARCH_64}")
  1604 message(STATUS "Compiler: ${CMAKE_C_COMPILER}")
  1605 message(STATUS "")
  1606 message(STATUS "Subsystems:")
  1607 foreach(_SUB ${SDL_SUBSYSTEMS})
  1608   string(TOUPPER ${_SUB} _OPT)
  1609   message_bool_option(${_SUB} SDL_${_OPT})
  1610 endforeach()
  1611 message(STATUS "")
  1612 message(STATUS "Options:")
  1613 list(SORT ALLOPTIONS)
  1614 foreach(_OPT ${ALLOPTIONS})
  1615   # Longest option is VIDEO_X11_XSCREENSAVER = 22 characters
  1616   # Get the padding
  1617   string(LENGTH ${_OPT} _OPTLEN)
  1618   math(EXPR _PADLEN "23 - ${_OPTLEN}")
  1619   string(RANDOM LENGTH ${_PADLEN} ALPHABET " " _PADDING)
  1620   message_tested_option(${_OPT} ${_PADDING})
  1621 endforeach()
  1622 message(STATUS "")
  1623 message(STATUS " CFLAGS:        ${CMAKE_C_FLAGS}")
  1624 message(STATUS " EXTRA_CFLAGS:  ${EXTRA_CFLAGS}")
  1625 message(STATUS " EXTRA_LDFLAGS: ${EXTRA_LDFLAGS}")
  1626 message(STATUS " EXTRA_LIBS:    ${EXTRA_LIBS}")
  1627 message(STATUS "")
  1628 message(STATUS " Build Shared Library: ${SDL_SHARED}")
  1629 message(STATUS " Build Static Library: ${SDL_STATIC}")
  1630 if(SDL_STATIC)
  1631     message(STATUS " Build Static Library with Position Independent Code: ${SDL_STATIC_PIC}")
  1632 endif()
  1633 message(STATUS "")
  1634 if(UNIX)
  1635   message(STATUS "If something was not detected, although the libraries")
  1636   message(STATUS "were installed, then make sure you have set the")
  1637   message(STATUS "CFLAGS and LDFLAGS environment variables correctly.")
  1638   message(STATUS "")
  1639 endif()
  1640 
  1641 # Ensure that the extra cflags are used at compile time
  1642 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS}")
  1643 
  1644 # Always build SDLmain
  1645 add_library(SDL2main STATIC ${SDLMAIN_SOURCES})
  1646 target_include_directories(SDL2main PUBLIC $<INSTALL_INTERFACE:include>)
  1647 set(_INSTALL_LIBS "SDL2main")
  1648 
  1649 if(SDL_SHARED)
  1650   add_library(SDL2 SHARED ${SOURCE_FILES} ${VERSION_SOURCES})
  1651   if(APPLE)
  1652     set_target_properties(SDL2 PROPERTIES MACOSX_RPATH 1)
  1653   elseif(UNIX AND NOT ANDROID)
  1654     set_target_properties(SDL2 PROPERTIES
  1655       VERSION ${LT_VERSION}
  1656       SOVERSION ${LT_REVISION}
  1657       OUTPUT_NAME "SDL2-${LT_RELEASE}")
  1658   else()
  1659     set_target_properties(SDL2 PROPERTIES
  1660       VERSION ${SDL_VERSION}
  1661       SOVERSION ${LT_REVISION}
  1662       OUTPUT_NAME "SDL2")
  1663   endif()
  1664   if(MSVC AND NOT LIBC)
  1665     # Don't try to link with the default set of libraries.
  1666     set_target_properties(SDL2 PROPERTIES LINK_FLAGS_RELEASE "/NODEFAULTLIB")
  1667     set_target_properties(SDL2 PROPERTIES LINK_FLAGS_DEBUG "/NODEFAULTLIB")
  1668     set_target_properties(SDL2 PROPERTIES STATIC_LIBRARY_FLAGS "/NODEFAULTLIB")
  1669   endif()
  1670   set(_INSTALL_LIBS "SDL2" ${_INSTALL_LIBS})
  1671   target_link_libraries(SDL2 ${EXTRA_LIBS} ${EXTRA_LDFLAGS})
  1672   target_include_directories(SDL2 PUBLIC $<INSTALL_INTERFACE:include>)
  1673 endif()
  1674 
  1675 if(SDL_STATIC)
  1676   set (BUILD_SHARED_LIBS FALSE)
  1677   add_library(SDL2-static STATIC ${SOURCE_FILES})
  1678   if (NOT SDL_SHARED OR NOT WIN32)
  1679     set_target_properties(SDL2-static PROPERTIES OUTPUT_NAME "SDL2")
  1680     # Note: Apparently, OUTPUT_NAME must really be unique; even when
  1681     # CMAKE_IMPORT_LIBRARY_SUFFIX or the like are given. Otherwise
  1682     # the static build may race with the import lib and one will get
  1683     # clobbered, when the suffix is realized via subsequent rename.
  1684   endif()
  1685   set_target_properties(SDL2-static PROPERTIES POSITION_INDEPENDENT_CODE ${SDL_STATIC_PIC})
  1686   if(MSVC AND NOT LIBC)
  1687     set_target_properties(SDL2-static PROPERTIES LINK_FLAGS_RELEASE "/NODEFAULTLIB")
  1688     set_target_properties(SDL2-static PROPERTIES LINK_FLAGS_DEBUG "/NODEFAULTLIB")
  1689     set_target_properties(SDL2-static PROPERTIES STATIC_LIBRARY_FLAGS "/NODEFAULTLIB")
  1690   endif()
  1691   # TODO: Win32 platforms keep the same suffix .lib for import and static
  1692   # libraries - do we need to consider this?
  1693   set(_INSTALL_LIBS "SDL2-static" ${_INSTALL_LIBS})
  1694   target_link_libraries(SDL2-static ${EXTRA_LIBS} ${EXTRA_LDFLAGS})
  1695   target_include_directories(SDL2-static PUBLIC $<INSTALL_INTERFACE:include>)
  1696 endif()
  1697 
  1698 ##### Installation targets #####
  1699 install(TARGETS ${_INSTALL_LIBS} EXPORT SDL2Targets
  1700   LIBRARY DESTINATION "lib${LIB_SUFFIX}"
  1701   ARCHIVE DESTINATION "lib${LIB_SUFFIX}"
  1702   RUNTIME DESTINATION bin)
  1703 
  1704 ##### Export files #####
  1705 if (APPLE)
  1706   set(PKG_PREFIX "SDL2.framework/Resources")
  1707 elseif (WINDOWS)
  1708   set(PKG_PREFIX "cmake")
  1709 else ()
  1710   set(PKG_PREFIX "lib/cmake/SDL2")
  1711 endif ()
  1712 
  1713 include(CMakePackageConfigHelpers)
  1714 write_basic_package_version_file("${CMAKE_BINARY_DIR}/SDL2ConfigVersion.cmake"
  1715   VERSION ${SDL_VERSION}
  1716   COMPATIBILITY AnyNewerVersion
  1717 )
  1718 
  1719 install(EXPORT SDL2Targets
  1720   FILE SDL2Targets.cmake
  1721   NAMESPACE SDL2::
  1722   DESTINATION ${PKG_PREFIX}
  1723 )
  1724 install(
  1725   FILES
  1726     ${CMAKE_SOURCE_DIR}/SDL2Config.cmake
  1727     ${CMAKE_BINARY_DIR}/SDL2ConfigVersion.cmake
  1728   DESTINATION ${PKG_PREFIX}
  1729   COMPONENT Devel
  1730 )
  1731 
  1732 file(GLOB INCLUDE_FILES ${SDL2_SOURCE_DIR}/include/*.h)
  1733 file(GLOB BIN_INCLUDE_FILES ${SDL2_BINARY_DIR}/include/*.h)
  1734 foreach(_FNAME ${BIN_INCLUDE_FILES})
  1735   get_filename_component(_INCNAME ${_FNAME} NAME)
  1736   list(REMOVE_ITEM INCLUDE_FILES ${SDL2_SOURCE_DIR}/include/${_INCNAME})
  1737 endforeach()
  1738 list(APPEND INCLUDE_FILES ${BIN_INCLUDE_FILES})
  1739 install(FILES ${INCLUDE_FILES} DESTINATION include/SDL2)
  1740 
  1741 if(NOT (WINDOWS OR CYGWIN))
  1742   if(SDL_SHARED)
  1743     if (APPLE)
  1744         set(SOEXT "dylib")
  1745     else()
  1746         set(SOEXT "so")
  1747     endif()
  1748     install(CODE "
  1749       execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink
  1750       \"libSDL2-2.0.${SOEXT}\" \"libSDL2.${SOEXT}\")")
  1751     install(FILES ${SDL2_BINARY_DIR}/libSDL2.${SOEXT} DESTINATION "lib${LIB_SUFFIX}")
  1752   endif()
  1753   if(FREEBSD)
  1754     # FreeBSD uses ${PREFIX}/libdata/pkgconfig
  1755     install(FILES ${SDL2_BINARY_DIR}/sdl2.pc DESTINATION "libdata/pkgconfig")
  1756   else()
  1757     install(FILES ${SDL2_BINARY_DIR}/sdl2.pc
  1758       DESTINATION "lib${LIB_SUFFIX}/pkgconfig")
  1759   endif()
  1760   install(PROGRAMS ${SDL2_BINARY_DIR}/sdl2-config DESTINATION bin)
  1761   # TODO: what about the .spec file? Is it only needed for RPM creation?
  1762   install(FILES "${SDL2_SOURCE_DIR}/sdl2.m4" DESTINATION "${CMAKE_INSTALL_FULL_DATAROOTDIR}/aclocal")
  1763 endif()
  1764 
  1765 ##### Uninstall target #####
  1766 
  1767 configure_file(
  1768     "${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake.in"
  1769     "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
  1770     IMMEDIATE @ONLY)
  1771 
  1772 add_custom_target(uninstall
  1773     COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake)