CMakeLists.txt
author Sam Lantinga <slouken@libsdl.org>
Wed, 18 Oct 2017 08:52:04 -0700
changeset 11630 ad4b5d85edee
parent 11625 6a676d8b788f
child 11682 b26412a89fbb
permissions -rw-r--r--
Fixed bug 3821 - Allow SDL_CreateWindow and SDL_CreateRenderer with OpenGL ES 3.0 (GLES3) for Angle (Windows)

Carlos

Angle supports GLES3 but when using these functions (SDL_CreateWindow and SDL_CreateRenderer), defaults again to GLES2.0.

A current workaround (hack) to retrieve a GLES3.0 context with Angle is:

1) set

SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0);

after InitSDL AND after calling SDL_CreateWindow (before SDL_CreateRenderer)

2) Comment lines 2032-2044 in SDL_render_gles2.c, funtion GLES2_CreateRenderer

window_flags = SDL_GetWindowFlags(window);
if (!(window_flags & SDL_WINDOW_OPENGL) ||
profile_mask != SDL_GL_CONTEXT_PROFILE_ES || major != RENDERER_CONTEXT_MAJOR || minor != RENDERER_CONTEXT_MINOR) {

changed_window = SDL_TRUE;
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_ES);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, RENDERER_CONTEXT_MAJOR);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, RENDERER_CONTEXT_MINOR);

if (SDL_RecreateWindow(window, window_flags | SDL_WINDOW_OPENGL) < 0) {
goto error;
}
}

This retrives a GLES3 context as confirmed using glGetString(GL_VERSION). This should be fixed by modifying a few if's.
     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(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     # !!! FIXME: modern CMake doesn't need "LANGUAGE C" for Objective-C.
  1377     set_source_files_properties(${AUDIO_SOURCES} PROPERTIES LANGUAGE C)
  1378     set(SOURCE_FILES ${SOURCE_FILES} ${AUDIO_SOURCES})
  1379     set(HAVE_SDL_AUDIO TRUE)
  1380     set(SDL_FRAMEWORK_COREAUDIO 1)
  1381     set(SDL_FRAMEWORK_AUDIOTOOLBOX 1)
  1382   endif()
  1383 
  1384   if(SDL_JOYSTICK)
  1385     set(SDL_JOYSTICK_IOKIT 1)
  1386     if (IOS)
  1387       file(GLOB JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/iphoneos/*.m ${SDL2_SOURCE_DIR}/src/joystick/steam/*.c)
  1388     else()
  1389       file(GLOB JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/darwin/*.c)
  1390     endif()
  1391     set(SOURCE_FILES ${SOURCE_FILES} ${JOYSTICK_SOURCES})
  1392     set(HAVE_SDL_JOYSTICK TRUE)
  1393     set(SDL_FRAMEWORK_IOKIT 1)
  1394     set(SDL_FRAMEWORK_FF 1)
  1395   endif()
  1396 
  1397   if(SDL_HAPTIC)
  1398     set(SDL_HAPTIC_IOKIT 1)
  1399     if (IOS)
  1400       file(GLOB HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/dummy/*.c)
  1401       set(SDL_HAPTIC_DUMMY 1)
  1402     else()
  1403       file(GLOB HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/darwin/*.c)
  1404     endif()
  1405     set(SOURCE_FILES ${SOURCE_FILES} ${HAPTIC_SOURCES})
  1406     set(HAVE_SDL_HAPTIC TRUE)
  1407     set(SDL_FRAMEWORK_IOKIT 1)
  1408     set(SDL_FRAMEWORK_FF 1)
  1409     if(NOT SDL_JOYSTICK)
  1410       message(FATAL_ERROR "SDL_HAPTIC requires SDL_JOYSTICK to be enabled")
  1411     endif()
  1412   endif()
  1413 
  1414   if(SDL_POWER)
  1415     set(SDL_POWER_MACOSX 1)
  1416     if (IOS)
  1417       file(GLOB POWER_SOURCES ${SDL2_SOURCE_DIR}/src/power/uikit/*.m)
  1418     else()
  1419       file(GLOB POWER_SOURCES ${SDL2_SOURCE_DIR}/src/power/macosx/*.c)
  1420     endif()
  1421     set(SOURCE_FILES ${SOURCE_FILES} ${POWER_SOURCES})
  1422     set(HAVE_SDL_POWER TRUE)
  1423     set(SDL_FRAMEWORK_IOKIT 1)
  1424   endif()
  1425 
  1426   if(SDL_TIMERS)
  1427     set(SDL_TIMER_UNIX 1)
  1428     file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/unix/*.c)
  1429     set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES})
  1430     set(HAVE_SDL_TIMERS TRUE)
  1431   endif(SDL_TIMERS)
  1432 
  1433   if(SDL_FILESYSTEM)
  1434     set(SDL_FILESYSTEM_COCOA 1)
  1435     file(GLOB FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/cocoa/*.m)
  1436     # !!! FIXME: modern CMake doesn't need "LANGUAGE C" for Objective-C.
  1437     set_source_files_properties(${FILESYSTEM_SOURCES} PROPERTIES LANGUAGE C)
  1438     set(SOURCE_FILES ${SOURCE_FILES} ${FILESYSTEM_SOURCES})
  1439     set(HAVE_SDL_FILESYSTEM TRUE)
  1440   endif()
  1441 
  1442   # Actually load the frameworks at the end so we don't duplicate include.
  1443   if(SDL_FRAMEWORK_COREVIDEO)
  1444     find_library(COREVIDEO CoreVideo)
  1445     list(APPEND EXTRA_LIBS ${COREVIDEO})
  1446   endif()
  1447   if(SDL_FRAMEWORK_COCOA)
  1448     find_library(COCOA_LIBRARY Cocoa)
  1449     list(APPEND EXTRA_LIBS ${COCOA_LIBRARY})
  1450   endif()
  1451   if(SDL_FRAMEWORK_IOKIT)
  1452     find_library(IOKIT IOKit)
  1453     list(APPEND EXTRA_LIBS ${IOKIT})
  1454   endif()
  1455   if(SDL_FRAMEWORK_FF)
  1456     find_library(FORCEFEEDBACK ForceFeedback)
  1457     list(APPEND EXTRA_LIBS ${FORCEFEEDBACK})
  1458   endif()
  1459   if(SDL_FRAMEWORK_CARBON)
  1460     find_library(CARBON_LIBRARY Carbon)
  1461     list(APPEND EXTRA_LIBS ${CARBON_LIBRARY})
  1462   endif()
  1463   if(SDL_FRAMEWORK_COREAUDIO)
  1464     find_library(COREAUDIO CoreAudio)
  1465     list(APPEND EXTRA_LIBS ${COREAUDIO})
  1466   endif()
  1467   if(SDL_FRAMEWORK_AUDIOTOOLBOX)
  1468     find_library(AUDIOTOOLBOX AudioToolbox)
  1469     list(APPEND EXTRA_LIBS ${AUDIOTOOLBOX})
  1470   endif()
  1471 
  1472   # iOS hack needed - http://code.google.com/p/ios-cmake/ ?
  1473   if(SDL_VIDEO)
  1474     if (IOS)
  1475       set(SDL_VIDEO_DRIVER_UIKIT 1)
  1476       file(GLOB UIKITVIDEO_SOURCES ${SDL2_SOURCE_DIR}/src/video/uikit/*.m)
  1477       set(SOURCE_FILES ${SOURCE_FILES} ${UIKITVIDEO_SOURCES})
  1478     else()
  1479       CheckCOCOA()
  1480       if(VIDEO_OPENGL)
  1481         set(SDL_VIDEO_OPENGL 1)
  1482         set(SDL_VIDEO_OPENGL_CGL 1)
  1483         set(SDL_VIDEO_RENDER_OGL 1)
  1484         set(HAVE_VIDEO_OPENGL TRUE)
  1485       endif()
  1486     endif()
  1487   endif()
  1488 
  1489   CheckPTHREAD()
  1490 elseif(HAIKU)
  1491   if(SDL_VIDEO)
  1492     set(SDL_VIDEO_DRIVER_HAIKU 1)
  1493     file(GLOB HAIKUVIDEO_SOURCES ${SDL2_SOURCE_DIR}/src/video/haiku/*.c)
  1494     set(SOURCE_FILES ${SOURCE_FILES} ${HAIKUVIDEO_SOURCES})
  1495     set(HAVE_SDL_VIDEO TRUE)
  1496 
  1497     set(SDL_FILESYSTEM_HAIKU 1)
  1498     file(GLOB FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/haiku/*.cc)
  1499     set(SOURCE_FILES ${SOURCE_FILES} ${FILESYSTEM_SOURCES})
  1500     set(HAVE_SDL_FILESYSTEM TRUE)
  1501 
  1502     if(SDL_TIMERS)
  1503       set(SDL_TIMER_HAIKU 1)
  1504       file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/haiku/*.c)
  1505       set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES})
  1506       set(HAVE_SDL_TIMERS TRUE)
  1507     endif(SDL_TIMERS)
  1508 
  1509     if(VIDEO_OPENGL)
  1510       # TODO: Use FIND_PACKAGE(OpenGL) instead
  1511       set(SDL_VIDEO_OPENGL 1)
  1512       set(SDL_VIDEO_OPENGL_BGL 1)
  1513       set(SDL_VIDEO_RENDER_OGL 1)
  1514       list(APPEND EXTRA_LIBS GL)
  1515       set(HAVE_VIDEO_OPENGL TRUE)
  1516     endif()
  1517   endif()
  1518 
  1519   CheckPTHREAD()
  1520 endif()
  1521 
  1522 if(VIDEO_VULKAN)
  1523   set(SDL_VIDEO_VULKAN 1)
  1524 endif()
  1525 
  1526 # Dummies
  1527 # configure.in does it differently:
  1528 # if not have X
  1529 #   if enable_X {  SDL_X_DISABLED = 1 }
  1530 #   [add dummy sources]
  1531 # so it always adds a dummy, without checking, if it was actually requested.
  1532 # This leads to missing internal references on building, since the
  1533 # src/X/*.c does not get included.
  1534 if(NOT HAVE_SDL_JOYSTICK)
  1535   set(SDL_JOYSTICK_DISABLED 1)
  1536   if(SDL_JOYSTICK AND NOT APPLE) # results in unresolved symbols on OSX
  1537 
  1538     file(GLOB JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/dummy/*.c)
  1539     set(SOURCE_FILES ${SOURCE_FILES} ${JOYSTICK_SOURCES})
  1540   endif()
  1541 endif()
  1542 if(NOT HAVE_SDL_HAPTIC)
  1543   set(SDL_HAPTIC_DISABLED 1)
  1544   file(GLOB HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/dummy/*.c)
  1545   set(SOURCE_FILES ${SOURCE_FILES} ${HAPTIC_SOURCES})
  1546 endif()
  1547 if(NOT HAVE_SDL_LOADSO)
  1548   set(SDL_LOADSO_DISABLED 1)
  1549   file(GLOB LOADSO_SOURCES ${SDL2_SOURCE_DIR}/src/loadso/dummy/*.c)
  1550   set(SOURCE_FILES ${SOURCE_FILES} ${LOADSO_SOURCES})
  1551 endif()
  1552 if(NOT HAVE_SDL_FILESYSTEM)
  1553   set(SDL_FILESYSTEM_DISABLED 1)
  1554   file(GLOB FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/dummy/*.c)
  1555   set(SOURCE_FILES ${SOURCE_FILES} ${FILESYSTEM_SOURCES})
  1556 endif()
  1557 
  1558 # We always need to have threads and timers around
  1559 if(NOT HAVE_SDL_THREADS)
  1560   set(SDL_THREADS_DISABLED 1)
  1561   file(GLOB THREADS_SOURCES ${SDL2_SOURCE_DIR}/src/thread/generic/*.c)
  1562   set(SOURCE_FILES ${SOURCE_FILES} ${THREADS_SOURCES})
  1563 endif()
  1564 if(NOT HAVE_SDL_TIMERS)
  1565   set(SDL_TIMERS_DISABLED 1)
  1566   file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/dummy/*.c)
  1567   set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES})
  1568 endif()
  1569 
  1570 if(NOT SDLMAIN_SOURCES)
  1571   file(GLOB SDLMAIN_SOURCES ${SDL2_SOURCE_DIR}/src/main/dummy/*.c)
  1572 endif()
  1573 
  1574 # Append the -MMD -MT flags
  1575 # if(DEPENDENCY_TRACKING)
  1576 #   if(COMPILER_IS_GNUCC)
  1577 #     set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -MMD -MT \$@")
  1578 #   endif()
  1579 # endif()
  1580 
  1581 configure_file("${SDL2_SOURCE_DIR}/include/SDL_config.h.cmake"
  1582   "${SDL2_BINARY_DIR}/include/SDL_config.h")
  1583 
  1584 # Prepare the flags and remove duplicates
  1585 if(EXTRA_LDFLAGS)
  1586   list(REMOVE_DUPLICATES EXTRA_LDFLAGS)
  1587 endif()
  1588 if(EXTRA_LIBS)
  1589   list(REMOVE_DUPLICATES EXTRA_LIBS)
  1590 endif()
  1591 if(EXTRA_CFLAGS)
  1592   list(REMOVE_DUPLICATES EXTRA_CFLAGS)
  1593 endif()
  1594 listtostr(EXTRA_CFLAGS _EXTRA_CFLAGS)
  1595 set(EXTRA_CFLAGS ${_EXTRA_CFLAGS})
  1596 
  1597 # Compat helpers for the configuration files
  1598 if(NOT WINDOWS OR CYGWIN)
  1599   # TODO: we need a Windows script, too
  1600   execute_process(COMMAND sh ${SDL2_SOURCE_DIR}/build-scripts/updaterev.sh)
  1601 
  1602   set(prefix ${CMAKE_INSTALL_PREFIX})
  1603   set(exec_prefix "\${prefix}")
  1604   set(libdir "\${exec_prefix}/lib${LIB_SUFFIX}")
  1605   set(bindir "\${exec_prefix}/bin")
  1606   set(includedir "\${prefix}/include")
  1607   if(SDL_STATIC)
  1608     set(ENABLE_STATIC_TRUE "")
  1609     set(ENABLE_STATIC_FALSE "#")
  1610   else()
  1611     set(ENABLE_STATIC_TRUE "#")
  1612     set(ENABLE_STATIC_FALSE "")
  1613   endif()
  1614   if(SDL_SHARED)
  1615     set(ENABLE_SHARED_TRUE "")
  1616     set(ENABLE_SHARED_FALSE "#")
  1617   else()
  1618     set(ENABLE_SHARED_TRUE "#")
  1619     set(ENABLE_SHARED_FALSE "")
  1620   endif()
  1621 
  1622   # Clean up the different lists
  1623   listtostr(EXTRA_LIBS _EXTRA_LIBS "-l")
  1624   set(SDL_STATIC_LIBS ${SDL_LIBS} ${EXTRA_LDFLAGS} ${_EXTRA_LIBS})
  1625   list(REMOVE_DUPLICATES SDL_STATIC_LIBS)
  1626   listtostr(SDL_STATIC_LIBS _SDL_STATIC_LIBS)
  1627   set(SDL_STATIC_LIBS ${_SDL_STATIC_LIBS})
  1628   listtostr(SDL_LIBS _SDL_LIBS)
  1629   set(SDL_LIBS ${_SDL_LIBS})
  1630 
  1631   # MESSAGE(STATUS "SDL_LIBS: ${SDL_LIBS}")
  1632   # MESSAGE(STATUS "SDL_STATIC_LIBS: ${SDL_STATIC_LIBS}")
  1633 
  1634   configure_file("${SDL2_SOURCE_DIR}/sdl2.pc.in"
  1635     "${SDL2_BINARY_DIR}/sdl2.pc" @ONLY)
  1636   configure_file("${SDL2_SOURCE_DIR}/sdl2-config.in"
  1637     "${SDL2_BINARY_DIR}/sdl2-config")
  1638   configure_file("${SDL2_SOURCE_DIR}/sdl2-config.in"
  1639     "${SDL2_BINARY_DIR}/sdl2-config" @ONLY)
  1640   configure_file("${SDL2_SOURCE_DIR}/SDL2.spec.in"
  1641     "${SDL2_BINARY_DIR}/SDL2.spec" @ONLY)
  1642 endif()
  1643 
  1644 ##### Info output #####
  1645 message(STATUS "")
  1646 message(STATUS "SDL2 was configured with the following options:")
  1647 message(STATUS "")
  1648 message(STATUS "Platform: ${CMAKE_SYSTEM}")
  1649 message(STATUS "64-bit:   ${ARCH_64}")
  1650 message(STATUS "Compiler: ${CMAKE_C_COMPILER}")
  1651 message(STATUS "")
  1652 message(STATUS "Subsystems:")
  1653 foreach(_SUB ${SDL_SUBSYSTEMS})
  1654   string(TOUPPER ${_SUB} _OPT)
  1655   message_bool_option(${_SUB} SDL_${_OPT})
  1656 endforeach()
  1657 message(STATUS "")
  1658 message(STATUS "Options:")
  1659 list(SORT ALLOPTIONS)
  1660 foreach(_OPT ${ALLOPTIONS})
  1661   # Longest option is VIDEO_X11_XSCREENSAVER = 22 characters
  1662   # Get the padding
  1663   string(LENGTH ${_OPT} _OPTLEN)
  1664   math(EXPR _PADLEN "23 - ${_OPTLEN}")
  1665   string(RANDOM LENGTH ${_PADLEN} ALPHABET " " _PADDING)
  1666   message_tested_option(${_OPT} ${_PADDING})
  1667 endforeach()
  1668 message(STATUS "")
  1669 message(STATUS " CFLAGS:        ${CMAKE_C_FLAGS}")
  1670 message(STATUS " EXTRA_CFLAGS:  ${EXTRA_CFLAGS}")
  1671 message(STATUS " EXTRA_LDFLAGS: ${EXTRA_LDFLAGS}")
  1672 message(STATUS " EXTRA_LIBS:    ${EXTRA_LIBS}")
  1673 message(STATUS "")
  1674 message(STATUS " Build Shared Library: ${SDL_SHARED}")
  1675 message(STATUS " Build Static Library: ${SDL_STATIC}")
  1676 if(SDL_STATIC)
  1677     message(STATUS " Build Static Library with Position Independent Code: ${SDL_STATIC_PIC}")
  1678 endif()
  1679 message(STATUS "")
  1680 if(UNIX)
  1681   message(STATUS "If something was not detected, although the libraries")
  1682   message(STATUS "were installed, then make sure you have set the")
  1683   message(STATUS "CFLAGS and LDFLAGS environment variables correctly.")
  1684   message(STATUS "")
  1685 endif()
  1686 
  1687 # Ensure that the extra cflags are used at compile time
  1688 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS}")
  1689 
  1690 # Always build SDLmain
  1691 add_library(SDL2main STATIC ${SDLMAIN_SOURCES})
  1692 target_include_directories(SDL2main PUBLIC $<INSTALL_INTERFACE:include>)
  1693 set(_INSTALL_LIBS "SDL2main")
  1694 
  1695 if(SDL_SHARED)
  1696   add_library(SDL2 SHARED ${SOURCE_FILES} ${VERSION_SOURCES})
  1697   if(APPLE)
  1698     set_target_properties(SDL2 PROPERTIES MACOSX_RPATH 1)
  1699   elseif(UNIX AND NOT ANDROID)
  1700     set_target_properties(SDL2 PROPERTIES
  1701       VERSION ${LT_VERSION}
  1702       SOVERSION ${LT_REVISION}
  1703       OUTPUT_NAME "SDL2-${LT_RELEASE}")
  1704   else()
  1705     set_target_properties(SDL2 PROPERTIES
  1706       VERSION ${SDL_VERSION}
  1707       SOVERSION ${LT_REVISION}
  1708       OUTPUT_NAME "SDL2")
  1709   endif()
  1710   if(MSVC AND NOT LIBC)
  1711     # Don't try to link with the default set of libraries.
  1712     set_target_properties(SDL2 PROPERTIES LINK_FLAGS_RELEASE "/NODEFAULTLIB")
  1713     set_target_properties(SDL2 PROPERTIES LINK_FLAGS_DEBUG "/NODEFAULTLIB")
  1714     set_target_properties(SDL2 PROPERTIES STATIC_LIBRARY_FLAGS "/NODEFAULTLIB")
  1715   endif()
  1716   set(_INSTALL_LIBS "SDL2" ${_INSTALL_LIBS})
  1717   target_link_libraries(SDL2 ${EXTRA_LIBS} ${EXTRA_LDFLAGS})
  1718   target_include_directories(SDL2 PUBLIC $<INSTALL_INTERFACE:include>)
  1719 endif()
  1720 
  1721 if(SDL_STATIC)
  1722   set (BUILD_SHARED_LIBS FALSE)
  1723   add_library(SDL2-static STATIC ${SOURCE_FILES})
  1724   if (NOT SDL_SHARED OR NOT WIN32)
  1725     set_target_properties(SDL2-static PROPERTIES OUTPUT_NAME "SDL2")
  1726     # Note: Apparently, OUTPUT_NAME must really be unique; even when
  1727     # CMAKE_IMPORT_LIBRARY_SUFFIX or the like are given. Otherwise
  1728     # the static build may race with the import lib and one will get
  1729     # clobbered, when the suffix is realized via subsequent rename.
  1730   endif()
  1731   set_target_properties(SDL2-static PROPERTIES POSITION_INDEPENDENT_CODE ${SDL_STATIC_PIC})
  1732   if(MSVC AND NOT LIBC)
  1733     set_target_properties(SDL2-static PROPERTIES LINK_FLAGS_RELEASE "/NODEFAULTLIB")
  1734     set_target_properties(SDL2-static PROPERTIES LINK_FLAGS_DEBUG "/NODEFAULTLIB")
  1735     set_target_properties(SDL2-static PROPERTIES STATIC_LIBRARY_FLAGS "/NODEFAULTLIB")
  1736   endif()
  1737   # TODO: Win32 platforms keep the same suffix .lib for import and static
  1738   # libraries - do we need to consider this?
  1739   set(_INSTALL_LIBS "SDL2-static" ${_INSTALL_LIBS})
  1740   target_link_libraries(SDL2-static ${EXTRA_LIBS} ${EXTRA_LDFLAGS})
  1741   target_include_directories(SDL2-static PUBLIC $<INSTALL_INTERFACE:include>)
  1742 endif()
  1743 
  1744 ##### Installation targets #####
  1745 install(TARGETS ${_INSTALL_LIBS} EXPORT SDL2Targets
  1746   LIBRARY DESTINATION "lib${LIB_SUFFIX}"
  1747   ARCHIVE DESTINATION "lib${LIB_SUFFIX}"
  1748   RUNTIME DESTINATION bin)
  1749 
  1750 ##### Export files #####
  1751 if (APPLE)
  1752   set(PKG_PREFIX "SDL2.framework/Resources")
  1753 elseif (WINDOWS)
  1754   set(PKG_PREFIX "cmake")
  1755 else ()
  1756   set(PKG_PREFIX "lib/cmake/SDL2")
  1757 endif ()
  1758 
  1759 include(CMakePackageConfigHelpers)
  1760 write_basic_package_version_file("${CMAKE_BINARY_DIR}/SDL2ConfigVersion.cmake"
  1761   VERSION ${SDL_VERSION}
  1762   COMPATIBILITY AnyNewerVersion
  1763 )
  1764 
  1765 install(EXPORT SDL2Targets
  1766   FILE SDL2Targets.cmake
  1767   NAMESPACE SDL2::
  1768   DESTINATION ${PKG_PREFIX}
  1769 )
  1770 install(
  1771   FILES
  1772     ${CMAKE_CURRENT_SOURCE_DIR}/SDL2Config.cmake
  1773     ${CMAKE_BINARY_DIR}/SDL2ConfigVersion.cmake
  1774   DESTINATION ${PKG_PREFIX}
  1775   COMPONENT Devel
  1776 )
  1777 
  1778 file(GLOB INCLUDE_FILES ${SDL2_SOURCE_DIR}/include/*.h)
  1779 file(GLOB BIN_INCLUDE_FILES ${SDL2_BINARY_DIR}/include/*.h)
  1780 foreach(_FNAME ${BIN_INCLUDE_FILES})
  1781   get_filename_component(_INCNAME ${_FNAME} NAME)
  1782   list(REMOVE_ITEM INCLUDE_FILES ${SDL2_SOURCE_DIR}/include/${_INCNAME})
  1783 endforeach()
  1784 list(APPEND INCLUDE_FILES ${BIN_INCLUDE_FILES})
  1785 install(FILES ${INCLUDE_FILES} DESTINATION include/SDL2)
  1786 
  1787 if(NOT (WINDOWS OR CYGWIN))
  1788   if(SDL_SHARED)
  1789     if (APPLE)
  1790         set(SOEXT "dylib")
  1791     else()
  1792         set(SOEXT "so")
  1793     endif()
  1794     install(CODE "
  1795       execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink
  1796       \"libSDL2-2.0.${SOEXT}\" \"libSDL2.${SOEXT}\")")
  1797     install(FILES ${SDL2_BINARY_DIR}/libSDL2.${SOEXT} DESTINATION "lib${LIB_SUFFIX}")
  1798   endif()
  1799   if(FREEBSD)
  1800     # FreeBSD uses ${PREFIX}/libdata/pkgconfig
  1801     install(FILES ${SDL2_BINARY_DIR}/sdl2.pc DESTINATION "libdata/pkgconfig")
  1802   else()
  1803     install(FILES ${SDL2_BINARY_DIR}/sdl2.pc
  1804       DESTINATION "lib${LIB_SUFFIX}/pkgconfig")
  1805   endif()
  1806   install(PROGRAMS ${SDL2_BINARY_DIR}/sdl2-config DESTINATION bin)
  1807   # TODO: what about the .spec file? Is it only needed for RPM creation?
  1808   install(FILES "${SDL2_SOURCE_DIR}/sdl2.m4" DESTINATION "${CMAKE_INSTALL_FULL_DATAROOTDIR}/aclocal")
  1809 endif()
  1810 
  1811 ##### Uninstall target #####
  1812 
  1813 if(NOT TARGET uninstall)
  1814   configure_file(
  1815       "${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake.in"
  1816       "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
  1817       IMMEDIATE @ONLY)
  1818 
  1819   add_custom_target(uninstall
  1820       COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake)
  1821 endif()