CMakeLists.txt
author Ryan C. Gordon <icculus@icculus.org>
Sun, 27 Aug 2017 22:15:57 -0400
changeset 11365 a9bd2625fa01
parent 11353 598839965877
child 11367 e8fc755a89e8
permissions -rw-r--r--
vulkan: Initial Vulkan support!

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