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