CMakeLists.txt
author Vitaly Novichkov <admin@wohlnet.ru>
Fri, 29 Jun 2018 18:29:17 +0300
changeset 12065 abc706dbb7af
parent 12054 e604fe493d45
child 12071 1f8341f599c4
permissions -rw-r--r--
Remove "lib" prefix from DLL file on MinGW builds

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