CMakeLists.txt
author Sam Lantinga <slouken@libsdl.org>
Tue, 29 Aug 2017 22:04:43 -0700
changeset 11422 243b1a53ad89
parent 11409 3a5c77515d55
child 11427 381449ca1cd2
permissions -rw-r--r--
Fixed bug 3616 - SDL_GL_CreateContext fails with SDL_GL_CONTEXT_DEBUG_FLAG and ANGLE/GLES 2.0

Colin Barrett

Using the pre-built x86 devel libs from here:
https://www.libsdl.org/release/SDL2-devel-2.0.5-VC.zip

If I have:

SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_ES);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_FLAGS, SDL_GL_CONTEXT_DEBUG_FLAG);

and I'm using ANGLE/(a GL driver that doesn't provide an ES2 context) such that SDL_EGL_CreateContext is called by SDL_GL_CreateContext, I get the error "Could not create EGL context (context attributes are not supported)" and no context is created.

Looking at the code in SDL_EGL_CreateContext - if gl_config.flags is non-zero, it looks like the code in the section guarded with "#ifdef EGL_KHR_create_context" should be executed - but it apparently isn't.

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