CMakeLists.txt
author Sam Lantinga <slouken@libsdl.org>
Sat, 04 Nov 2017 21:58:48 -0700
changeset 11687 e968d755a760
parent 11684 eccdf37f8996
child 11702 cf166abbde4a
permissions -rw-r--r--
Updated version to 2.0.8 since SDL_image depends on it
     1 if(${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_BINARY_DIR})
     2   message(FATAL_ERROR "Prevented in-tree built. Please create a build directory outside of the SDL source code and call cmake from there")
     3 endif()
     4 
     5 cmake_minimum_required(VERSION 2.8.11)
     6 project(SDL2 C)
     7 
     8 # !!! FIXME: this should probably do "MACOSX_RPATH ON" as a target property
     9 # !!! FIXME:  for the SDL2 shared library (so you get an
    10 # !!! FIXME:  install_name ("soname") of "@rpath/libSDL-whatever.dylib"
    11 # !!! FIXME:  instead of "/usr/local/lib/libSDL-whatever.dylib"), but I'm
    12 # !!! FIXME:  punting for now and leaving the existing behavior. Until this
    13 # !!! FIXME:  properly resolved, this line silences a warning in CMake 3.0+.
    14 # !!! FIXME:  remove it and this comment entirely once the problem is
    15 # !!! FIXME:  properly resolved.
    16 #cmake_policy(SET CMP0042 OLD)
    17 
    18 include(CheckFunctionExists)
    19 include(CheckLibraryExists)
    20 include(CheckIncludeFiles)
    21 include(CheckIncludeFile)
    22 include(CheckSymbolExists)
    23 include(CheckCSourceCompiles)
    24 include(CheckCSourceRuns)
    25 include(CheckCCompilerFlag)
    26 include(CheckTypeSize)
    27 include(CheckStructHasMember)
    28 include(CMakeDependentOption)
    29 include(FindPkgConfig)
    30 include(GNUInstallDirs)
    31 set(CMAKE_MODULE_PATH "${SDL2_SOURCE_DIR}/cmake")
    32 include(${SDL2_SOURCE_DIR}/cmake/macros.cmake)
    33 include(${SDL2_SOURCE_DIR}/cmake/sdlchecks.cmake)
    34 
    35 # General settings
    36 # Edit include/SDL_version.h and change the version, then:
    37 #   SDL_MICRO_VERSION += 1;
    38 #   SDL_INTERFACE_AGE += 1;
    39 #   SDL_BINARY_AGE += 1;
    40 # if any functions have been added, set SDL_INTERFACE_AGE to 0.
    41 # if backwards compatibility has been broken,
    42 # set SDL_BINARY_AGE and SDL_INTERFACE_AGE to 0.
    43 set(SDL_MAJOR_VERSION 2)
    44 set(SDL_MINOR_VERSION 0)
    45 set(SDL_MICRO_VERSION 8)
    46 set(SDL_INTERFACE_AGE 0)
    47 set(SDL_BINARY_AGE 8)
    48 set(SDL_VERSION "${SDL_MAJOR_VERSION}.${SDL_MINOR_VERSION}.${SDL_MICRO_VERSION}")
    49 
    50 # Set defaults preventing destination file conflicts
    51 set(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
   641             acos acosf asin asinf atan atanf atan2 atan2f ceil ceilf
   642             copysign copysignf cos cosf fabs fabsf floor floorf fmod fmodf
   643             log logf pow powf scalbn scalbnf sin sinf sqrt sqrtf tan tanf)
   644       string(TOUPPER ${_FN} _UPPER)
   645       set(HAVE_${_UPPER} 1)
   646     endforeach()
   647     if(NOT CYGWIN AND NOT MINGW)
   648       set(HAVE_ALLOCA 1)
   649     endif()
   650     set(HAVE_M_PI 1)
   651     add_definitions(-D_USE_MATH_DEFINES) # needed for M_PI
   652     set(STDC_HEADERS 1)
   653   else()
   654     set(HAVE_LIBC TRUE)
   655     check_include_file(sys/types.h HAVE_SYS_TYPES_H)
   656     foreach(_HEADER
   657             stdio.h stdlib.h stddef.h stdarg.h malloc.h memory.h string.h limits.h
   658             strings.h wchar.h inttypes.h stdint.h ctype.h math.h iconv.h signal.h libunwind.h)
   659       string(TOUPPER "HAVE_${_HEADER}" _UPPER)
   660       string(REPLACE "." "_" _HAVE_H ${_UPPER})
   661       check_include_file("${_HEADER}" ${_HAVE_H})
   662     endforeach()
   663 
   664     check_include_files("dlfcn.h;stdint.h;stddef.h;inttypes.h;stdlib.h;strings.h;string.h;float.h" STDC_HEADERS)
   665     check_type_size("size_t" SIZEOF_SIZE_T)
   666     check_symbol_exists(M_PI math.h HAVE_M_PI)
   667     # TODO: refine the mprotect check
   668     check_c_source_compiles("#include <sys/types.h>
   669                              #include <sys/mman.h>
   670                              int main() { }" HAVE_MPROTECT)
   671     foreach(_FN
   672             strtod malloc calloc realloc free getenv setenv putenv unsetenv
   673             qsort abs bcopy memset memcpy memmove memcmp strlen strlcpy strlcat
   674             _strrev _strupr _strlwr strchr strrchr strstr itoa _ltoa
   675             _uitoa _ultoa strtol strtoul _i64toa _ui64toa strtoll strtoull
   676             atoi atof strcmp strncmp _stricmp strcasecmp _strnicmp strncasecmp
   677             vsscanf vsnprintf fopen64 fseeko fseeko64 sigaction setjmp
   678             nanosleep sysconf sysctlbyname getauxval poll
   679             )
   680       string(TOUPPER ${_FN} _UPPER)
   681       set(_HAVEVAR "HAVE_${_UPPER}")
   682       check_function_exists("${_FN}" ${_HAVEVAR})
   683     endforeach()
   684 
   685     check_library_exists(m pow "" HAVE_LIBM)
   686     if(HAVE_LIBM)
   687       set(CMAKE_REQUIRED_LIBRARIES m)
   688       foreach(_FN
   689               atan atan2 ceil copysign cos cosf fabs floor log pow scalbn sin
   690               sinf sqrt sqrtf tan tanf acos asin)
   691         string(TOUPPER ${_FN} _UPPER)
   692         set(_HAVEVAR "HAVE_${_UPPER}")
   693         check_function_exists("${_FN}" ${_HAVEVAR})
   694       endforeach()
   695       set(CMAKE_REQUIRED_LIBRARIES)
   696       list(APPEND EXTRA_LIBS m)
   697     endif()
   698 
   699     check_library_exists(iconv iconv_open "" HAVE_LIBICONV)
   700     if(HAVE_LIBICONV)
   701       list(APPEND EXTRA_LIBS iconv)
   702       set(HAVE_ICONV 1)
   703     endif()
   704 
   705     if(NOT APPLE)
   706       check_include_file(alloca.h HAVE_ALLOCA_H)
   707       check_function_exists(alloca HAVE_ALLOCA)
   708     else()
   709       set(HAVE_ALLOCA_H 1)
   710       set(HAVE_ALLOCA 1)
   711     endif()
   712 
   713     check_struct_has_member("struct sigaction" "sa_sigaction" "signal.h" HAVE_SA_SIGACTION)
   714   endif()
   715 else()
   716   if(WINDOWS)
   717     set(HAVE_STDARG_H 1)
   718     set(HAVE_STDDEF_H 1)
   719   endif()
   720 endif()
   721 
   722 
   723 # Enable/disable various subsystems of the SDL library
   724 foreach(_SUB ${SDL_SUBSYSTEMS})
   725   string(TOUPPER ${_SUB} _OPT)
   726   if(NOT SDL_${_OPT})
   727     set(SDL_${_OPT}_DISABLED 1)
   728   endif()
   729 endforeach()
   730 if(SDL_JOYSTICK)
   731   file(GLOB JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/*.c)
   732   set(SOURCE_FILES ${SOURCE_FILES} ${JOYSTICK_SOURCES})
   733 endif()
   734 if(SDL_HAPTIC)
   735   if(NOT SDL_JOYSTICK)
   736     # Haptic requires some private functions from the joystick subsystem.
   737     message_error("SDL_HAPTIC requires SDL_JOYSTICK, which is not enabled")
   738   endif()
   739   file(GLOB HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/*.c)
   740   set(SOURCE_FILES ${SOURCE_FILES} ${HAPTIC_SOURCES})
   741 endif()
   742 if(SDL_POWER)
   743   file(GLOB POWER_SOURCES ${SDL2_SOURCE_DIR}/src/power/*.c)
   744   set(SOURCE_FILES ${SOURCE_FILES} ${POWER_SOURCES})
   745 endif()
   746 # TODO: in configure.in, the test for LOADSO and SDL_DLOPEN is a bit weird:
   747 # if LOADSO is not wanted, SDL_LOADSO_DISABLED is set
   748 # If however on Unix or APPLE dlopen() is detected via CheckDLOPEN(),
   749 # SDL_LOADSO_DISABLED will not be set, regardless of the LOADSO settings
   750 
   751 # General SDL subsystem options, valid for all platforms
   752 if(SDL_AUDIO)
   753   # CheckDummyAudio/CheckDiskAudio - valid for all platforms
   754   if(DUMMYAUDIO)
   755     set(SDL_AUDIO_DRIVER_DUMMY 1)
   756     file(GLOB DUMMYAUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/dummy/*.c)
   757     set(SOURCE_FILES ${SOURCE_FILES} ${DUMMYAUDIO_SOURCES})
   758     set(HAVE_DUMMYAUDIO TRUE)
   759   endif()
   760   if(DISKAUDIO)
   761     set(SDL_AUDIO_DRIVER_DISK 1)
   762     file(GLOB DISKAUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/disk/*.c)
   763     set(SOURCE_FILES ${SOURCE_FILES} ${DISKAUDIO_SOURCES})
   764     set(HAVE_DISKAUDIO TRUE)
   765   endif()
   766 endif()
   767 
   768 if(SDL_DLOPEN)
   769   # Relevant for Unix/Darwin only
   770   if(UNIX OR APPLE)
   771     CheckDLOPEN()
   772   endif()
   773 endif()
   774 
   775 if(SDL_VIDEO)
   776   if(VIDEO_DUMMY)
   777     set(SDL_VIDEO_DRIVER_DUMMY 1)
   778     file(GLOB VIDEO_DUMMY_SOURCES ${SDL2_SOURCE_DIR}/src/video/dummy/*.c)
   779     set(SOURCE_FILES ${SOURCE_FILES} ${VIDEO_DUMMY_SOURCES})
   780     set(HAVE_VIDEO_DUMMY TRUE)
   781     set(HAVE_SDL_VIDEO TRUE)
   782   endif()
   783 endif()
   784 
   785 if(ANDROID)
   786   file(GLOB ANDROID_CORE_SOURCES ${SDL2_SOURCE_DIR}/src/core/android/*.c)
   787   set(SOURCE_FILES ${SOURCE_FILES} ${ANDROID_CORE_SOURCES})
   788 
   789   # SDL_spinlock.c Needs to be compiled in ARM mode.
   790   # There seems to be no better way currently to set the ARM mode.
   791   # see: https://issuetracker.google.com/issues/62264618
   792   # Another option would be to set ARM mode to all compiled files
   793   check_c_compiler_flag(-marm HAVE_ARM_MODE)
   794   if(HAVE_ARM_MODE)
   795     set_source_files_properties(${SDL2_SOURCE_DIR}/src/atomic/SDL_spinlock.c PROPERTIES COMPILE_FLAGS -marm)
   796   endif()
   797 
   798   file(GLOB ANDROID_MAIN_SOURCES ${SDL2_SOURCE_DIR}/src/main/android/*.c)
   799   set(SDLMAIN_SOURCES ${SDLMAIN_SOURCES} ${ANDROID_MAIN_SOURCES})
   800 
   801   if(SDL_AUDIO)
   802     set(SDL_AUDIO_DRIVER_ANDROID 1)
   803     file(GLOB ANDROID_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/android/*.c)
   804     set(SOURCE_FILES ${SOURCE_FILES} ${ANDROID_AUDIO_SOURCES})
   805     set(HAVE_SDL_AUDIO TRUE)
   806   endif()
   807   if(SDL_FILESYSTEM)
   808     set(SDL_FILESYSTEM_ANDROID 1)
   809     file(GLOB ANDROID_FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/android/*.c)
   810     set(SOURCE_FILES ${SOURCE_FILES} ${ANDROID_FILESYSTEM_SOURCES})
   811     set(HAVE_SDL_FILESYSTEM TRUE)
   812   endif()
   813   if(SDL_HAPTIC)
   814     set(SDL_HAPTIC_ANDROID 1)
   815     file(GLOB ANDROID_HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/android/*.c)
   816     set(SOURCE_FILES ${SOURCE_FILES} ${ANDROID_HAPTIC_SOURCES})
   817     set(HAVE_SDL_HAPTIC TRUE)
   818   endif()
   819   if(SDL_JOYSTICK)
   820     set(SDL_JOYSTICK_ANDROID 1)
   821     file(GLOB ANDROID_JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/android/*.c ${SDL2_SOURCE_DIR}/src/joystick/steam/*.c)
   822     set(SOURCE_FILES ${SOURCE_FILES} ${ANDROID_JOYSTICK_SOURCES})
   823     set(HAVE_SDL_JOYSTICK TRUE)
   824   endif()
   825   if(SDL_LOADSO)
   826     set(SDL_LOADSO_DLOPEN 1)
   827     file(GLOB LOADSO_SOURCES ${SDL2_SOURCE_DIR}/src/loadso/dlopen/*.c)
   828     set(SOURCE_FILES ${SOURCE_FILES} ${LOADSO_SOURCES})
   829     set(HAVE_SDL_LOADSO TRUE)
   830   endif()
   831   if(SDL_POWER)
   832     set(SDL_POWER_ANDROID 1)
   833     file(GLOB ANDROID_POWER_SOURCES ${SDL2_SOURCE_DIR}/src/power/android/*.c)
   834     set(SOURCE_FILES ${SOURCE_FILES} ${ANDROID_POWER_SOURCES})
   835     set(HAVE_SDL_POWER TRUE)
   836   endif()
   837   if(SDL_TIMERS)
   838     set(SDL_TIMER_UNIX 1)
   839     file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/unix/*.c)
   840     set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES})
   841     set(HAVE_SDL_TIMERS TRUE)
   842   endif()
   843   if(SDL_VIDEO)
   844     set(SDL_VIDEO_DRIVER_ANDROID 1)
   845     file(GLOB ANDROID_VIDEO_SOURCES ${SDL2_SOURCE_DIR}/src/video/android/*.c)
   846     set(SOURCE_FILES ${SOURCE_FILES} ${ANDROID_VIDEO_SOURCES})
   847     set(HAVE_SDL_VIDEO TRUE)
   848 
   849     # Core stuff
   850     find_library(ANDROID_DL_LIBRARY dl)
   851     find_library(ANDROID_LOG_LIBRARY log)
   852     find_library(ANDROID_LIBRARY_LIBRARY android)
   853     list(APPEND EXTRA_LIBS ${ANDROID_DL_LIBRARY} ${ANDROID_LOG_LIBRARY} ${ANDROID_LIBRARY_LIBRARY})
   854     add_definitions(-DGL_GLEXT_PROTOTYPES)
   855 
   856     #enable gles
   857     if(VIDEO_OPENGLES)
   858       set(SDL_VIDEO_OPENGL_EGL 1)
   859       set(HAVE_VIDEO_OPENGLES TRUE)
   860       set(SDL_VIDEO_OPENGL_ES2 1)
   861       set(SDL_VIDEO_RENDER_OGL_ES2 1)
   862 
   863       find_library(OpenGLES1_LIBRARY GLESv1_CM)
   864       find_library(OpenGLES2_LIBRARY GLESv2)
   865       list(APPEND EXTRA_LIBS ${OpenGLES1_LIBRARY} ${OpenGLES2_LIBRARY})
   866     endif()
   867 
   868     CHECK_C_SOURCE_COMPILES("
   869     #if defined(__ARM_ARCH) && __ARM_ARCH < 7
   870     #error Vulkan doesn't work on this configuration
   871     #endif
   872     int main()
   873     {
   874         return 0;
   875     }
   876     " VULKAN_PASSED_ANDROID_CHECKS)
   877     if(NOT VULKAN_PASSED_ANDROID_CHECKS)
   878       set(VIDEO_VULKAN OFF)
   879       message(STATUS "Vulkan doesn't work on this configuration")
   880     endif()
   881   endif()
   882 
   883   CheckPTHREAD()
   884 
   885 endif()
   886 
   887 # Platform-specific options and settings
   888 if(EMSCRIPTEN)
   889   # Hide noisy warnings that intend to aid mostly during initial stages of porting a new
   890   # project. Uncomment at will for verbose cross-compiling -I/../ path info.
   891   add_definitions(-Wno-warn-absolute-paths)
   892   if(SDL_AUDIO)
   893     set(SDL_AUDIO_DRIVER_EMSCRIPTEN 1)
   894     file(GLOB EM_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/emscripten/*.c)
   895     set(SOURCE_FILES ${SOURCE_FILES} ${EM_AUDIO_SOURCES})
   896     set(HAVE_SDL_AUDIO TRUE)
   897   endif()
   898   if(SDL_FILESYSTEM)
   899     set(SDL_FILESYSTEM_EMSCRIPTEN 1)
   900     file(GLOB EM_FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/emscripten/*.c)
   901     set(SOURCE_FILES ${SOURCE_FILES} ${EM_FILESYSTEM_SOURCES})
   902     set(HAVE_SDL_FILESYSTEM TRUE)
   903   endif()
   904   if(SDL_JOYSTICK)
   905     set(SDL_JOYSTICK_EMSCRIPTEN 1)
   906     file(GLOB EM_JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/emscripten/*.c)
   907     set(SOURCE_FILES ${SOURCE_FILES} ${EM_JOYSTICK_SOURCES})
   908     set(HAVE_SDL_JOYSTICK TRUE)
   909   endif()
   910   if(SDL_POWER)
   911     set(SDL_POWER_EMSCRIPTEN 1)
   912     file(GLOB EM_POWER_SOURCES ${SDL2_SOURCE_DIR}/src/power/emscripten/*.c)
   913     set(SOURCE_FILES ${SOURCE_FILES} ${EM_POWER_SOURCES})
   914     set(HAVE_SDL_POWER TRUE)
   915   endif()
   916   if(SDL_TIMERS)
   917     set(SDL_TIMER_UNIX 1)
   918     file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/unix/*.c)
   919     set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES})
   920     set(HAVE_SDL_TIMERS TRUE)
   921 
   922     if(CLOCK_GETTIME)
   923       set(HAVE_CLOCK_GETTIME 1)
   924     endif()
   925   endif()
   926   if(SDL_VIDEO)
   927     set(SDL_VIDEO_DRIVER_EMSCRIPTEN 1)
   928     file(GLOB EM_VIDEO_SOURCES ${SDL2_SOURCE_DIR}/src/video/emscripten/*.c)
   929     set(SOURCE_FILES ${SOURCE_FILES} ${EM_VIDEO_SOURCES})
   930     set(HAVE_SDL_VIDEO TRUE)
   931 
   932     #enable gles
   933     if(VIDEO_OPENGLES)
   934       set(SDL_VIDEO_OPENGL_EGL 1)
   935       set(HAVE_VIDEO_OPENGLES TRUE)
   936       set(SDL_VIDEO_OPENGL_ES2 1)
   937       set(SDL_VIDEO_RENDER_OGL_ES2 1)
   938     endif()
   939   endif()
   940 elseif(UNIX AND NOT APPLE AND NOT ANDROID)
   941   if(SDL_AUDIO)
   942     if(SYSV5 OR SOLARIS OR HPUX)
   943         set(SDL_AUDIO_DRIVER_SUNAUDIO 1)
   944         file(GLOB SUN_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/sun/*.c)
   945         set(SOURCE_FILES ${SOURCE_FILES} ${SUN_AUDIO_SOURCES})
   946         set(HAVE_SDL_AUDIO TRUE)
   947     elseif(NETBSD)
   948         set(SDL_AUDIO_DRIVER_NETBSD 1)
   949         file(GLOB NETBSD_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/netbsd/*.c)
   950         set(SOURCE_FILES ${SOURCE_FILES} ${NETBSD_AUDIO_SOURCES})
   951         set(HAVE_SDL_AUDIO TRUE)
   952     elseif(AIX)
   953         set(SDL_AUDIO_DRIVER_PAUDIO 1)
   954         file(GLOB AIX_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/paudio/*.c)
   955         set(SOURCE_FILES ${SOURCE_FILES} ${AIX_AUDIO_SOURCES})
   956         set(HAVE_SDL_AUDIO TRUE)
   957     endif()
   958     CheckOSS()
   959     CheckALSA()
   960     CheckJACK()
   961     CheckPulseAudio()
   962     CheckESD()
   963     CheckARTS()
   964     CheckNAS()
   965     CheckSNDIO()
   966     CheckFusionSound()
   967     CheckLibSampleRate()
   968   endif()
   969 
   970   if(SDL_VIDEO)
   971     # Need to check for Raspberry PI first and add platform specific compiler flags, otherwise the test for GLES fails!
   972     CheckRPI()
   973     CheckX11()
   974     CheckMir()
   975     CheckDirectFB()
   976     CheckOpenGLX11()
   977     CheckOpenGLESX11()
   978     CheckWayland()
   979     CheckVivante()
   980     CheckKMSDRM()
   981   endif()
   982 
   983   if(UNIX)
   984     file(GLOB CORE_UNIX_SOURCES ${SDL2_SOURCE_DIR}/src/core/unix/*.c)
   985     set(SOURCE_FILES ${SOURCE_FILES} ${CORE_UNIX_SOURCES})
   986   endif()
   987 
   988   if(LINUX)
   989     check_c_source_compiles("
   990         #include <linux/input.h>
   991         #ifndef EVIOCGNAME
   992         #error EVIOCGNAME() ioctl not available
   993         #endif
   994         int main(int argc, char** argv) {}" HAVE_INPUT_EVENTS)
   995 
   996     check_c_source_compiles("
   997         #include <linux/kd.h>
   998         #include <linux/keyboard.h>
   999 
  1000         int main(int argc, char **argv) 
  1001         {
  1002             struct kbentry kbe;
  1003             kbe.kb_table = KG_CTRL;
  1004             ioctl(0, KDGKBENT, &kbe);
  1005         }" HAVE_INPUT_KD)
  1006 
  1007     file(GLOB CORE_LINUX_SOURCES ${SDL2_SOURCE_DIR}/src/core/linux/*.c)
  1008     set(SOURCE_FILES ${SOURCE_FILES} ${CORE_LINUX_SOURCES})
  1009 
  1010     if(HAVE_INPUT_EVENTS)
  1011       set(SDL_INPUT_LINUXEV 1)
  1012     endif()
  1013 
  1014     if(SDL_HAPTIC AND HAVE_INPUT_EVENTS)
  1015       set(SDL_HAPTIC_LINUX 1)
  1016       file(GLOB HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/linux/*.c)
  1017       set(SOURCE_FILES ${SOURCE_FILES} ${HAPTIC_SOURCES})
  1018       set(HAVE_SDL_HAPTIC TRUE)
  1019     endif()
  1020 
  1021     if(HAVE_INPUT_KD)
  1022       set(SDL_INPUT_LINUXKD 1)
  1023     endif()
  1024 
  1025     check_include_file("libudev.h" HAVE_LIBUDEV_H)
  1026 
  1027     if(PKG_CONFIG_FOUND)
  1028       pkg_search_module(DBUS dbus-1 dbus)
  1029       if(DBUS_FOUND)
  1030         set(HAVE_DBUS_DBUS_H TRUE)
  1031         include_directories(${DBUS_INCLUDE_DIRS})
  1032         list(APPEND EXTRA_LIBS ${DBUS_LIBRARIES})
  1033       endif()
  1034 
  1035       pkg_search_module(IBUS ibus-1.0 ibus)
  1036       if(IBUS_FOUND)
  1037         set(HAVE_IBUS_IBUS_H TRUE)
  1038         include_directories(${IBUS_INCLUDE_DIRS})
  1039         list(APPEND EXTRA_LIBS ${IBUS_LIBRARIES})
  1040       endif()
  1041     endif()
  1042 
  1043     check_include_file("fcitx/frontend.h" HAVE_FCITX_FRONTEND_H)
  1044   endif()
  1045 
  1046   if(INPUT_TSLIB)
  1047     check_c_source_compiles("
  1048         #include \"tslib.h\"
  1049         int main(int argc, char** argv) { }" HAVE_INPUT_TSLIB)
  1050     if(HAVE_INPUT_TSLIB)
  1051       set(SDL_INPUT_TSLIB 1)
  1052       list(APPEND EXTRA_LIBS ts)
  1053     endif()
  1054   endif()
  1055 
  1056   if(SDL_JOYSTICK)
  1057     CheckUSBHID()   # seems to be BSD specific - limit the test to BSD only?
  1058     if(LINUX AND NOT ANDROID)
  1059       set(SDL_JOYSTICK_LINUX 1)
  1060       file(GLOB JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/linux/*.c ${SDL2_SOURCE_DIR}/src/joystick/steam/*.c)
  1061       set(SOURCE_FILES ${SOURCE_FILES} ${JOYSTICK_SOURCES})
  1062       set(HAVE_SDL_JOYSTICK TRUE)
  1063     endif()
  1064   endif()
  1065 
  1066   CheckPTHREAD()
  1067 
  1068   if(CLOCK_GETTIME)
  1069     check_library_exists(rt clock_gettime "" FOUND_CLOCK_GETTIME)
  1070     if(FOUND_CLOCK_GETTIME)
  1071       list(APPEND EXTRA_LIBS rt)
  1072       set(HAVE_CLOCK_GETTIME 1)
  1073     else()
  1074       check_library_exists(c clock_gettime "" FOUND_CLOCK_GETTIME)
  1075       if(FOUND_CLOCK_GETTIME)
  1076         set(HAVE_CLOCK_GETTIME 1)
  1077       endif()
  1078     endif()
  1079   endif()
  1080 
  1081   check_include_file(linux/version.h HAVE_LINUX_VERSION_H)
  1082   if(HAVE_LINUX_VERSION_H)
  1083     set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DHAVE_LINUX_VERSION_H")
  1084   endif()
  1085 
  1086   if(SDL_POWER)
  1087     if(LINUX)
  1088       set(SDL_POWER_LINUX 1)
  1089       file(GLOB POWER_SOURCES ${SDL2_SOURCE_DIR}/src/power/linux/*.c)
  1090       set(SOURCE_FILES ${SOURCE_FILES} ${POWER_SOURCES})
  1091       set(HAVE_SDL_POWER TRUE)
  1092     endif()
  1093   endif()
  1094 
  1095   if(SDL_FILESYSTEM)
  1096     set(SDL_FILESYSTEM_UNIX 1)
  1097     file(GLOB FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/unix/*.c)
  1098     set(SOURCE_FILES ${SOURCE_FILES} ${FILESYSTEM_SOURCES})
  1099     set(HAVE_SDL_FILESYSTEM TRUE)
  1100   endif()
  1101 
  1102   if(SDL_TIMERS)
  1103     set(SDL_TIMER_UNIX 1)
  1104     file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/unix/*.c)
  1105     set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES})
  1106     set(HAVE_SDL_TIMERS TRUE)
  1107   endif()
  1108 
  1109   if(RPATH)
  1110     set(SDL_RLD_FLAGS "")
  1111     if(BSDI OR FREEBSD OR LINUX OR NETBSD)
  1112       set(CMAKE_REQUIRED_FLAGS "-Wl,--enable-new-dtags")
  1113       check_c_compiler_flag("" HAVE_ENABLE_NEW_DTAGS)
  1114       set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS})
  1115       if(HAVE_ENABLE_NEW_DTAGS)
  1116         set(SDL_RLD_FLAGS "-Wl,-rpath,\${libdir} -Wl,--enable-new-dtags")
  1117       else()
  1118         set(SDL_RLD_FLAGS "-Wl,-rpath,\${libdir}")
  1119       endif()
  1120     elseif(SOLARIS)
  1121       set(SDL_RLD_FLAGS "-R\${libdir}")
  1122     endif()
  1123     set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)
  1124     set(HAVE_RPATH TRUE)
  1125   endif()
  1126 
  1127 elseif(WINDOWS)
  1128   find_program(WINDRES windres)
  1129 
  1130   check_c_source_compiles("
  1131     #include <windows.h>
  1132     int main(int argc, char **argv) { }" HAVE_WIN32_CC)
  1133 
  1134   file(GLOB CORE_SOURCES ${SDL2_SOURCE_DIR}/src/core/windows/*.c)
  1135   set(SOURCE_FILES ${SOURCE_FILES} ${CORE_SOURCES})
  1136 
  1137   if(MSVC)
  1138     # Prevent codegen that would use the VC runtime libraries.
  1139     set_property(DIRECTORY . APPEND PROPERTY COMPILE_OPTIONS "/GS-")
  1140     if(NOT ARCH_64)
  1141       set_property(DIRECTORY . APPEND PROPERTY COMPILE_OPTIONS "/arch:SSE")
  1142     endif()
  1143   endif()
  1144 
  1145   # Check for DirectX
  1146   if(DIRECTX)
  1147     if(DEFINED MSVC_VERSION AND NOT ${MSVC_VERSION} LESS 1700)
  1148         set(USE_WINSDK_DIRECTX TRUE)
  1149     endif()
  1150     if(NOT CMAKE_COMPILER_IS_MINGW AND NOT USE_WINSDK_DIRECTX)
  1151       if("$ENV{DXSDK_DIR}" STREQUAL "")
  1152         message_error("DIRECTX requires the \$DXSDK_DIR environment variable to be set")
  1153       endif()
  1154       set(CMAKE_REQUIRED_FLAGS "/I\"$ENV{DXSDK_DIR}\\Include\"")
  1155     endif()
  1156 
  1157     if(HAVE_WIN32_CC)
  1158       # xinput.h may need windows.h, but doesn't include it itself.
  1159       check_c_source_compiles("
  1160         #include <windows.h>
  1161         #include <xinput.h>
  1162         int main(int argc, char **argv) { }" HAVE_XINPUT_H)
  1163       check_c_source_compiles("
  1164         #include <windows.h>
  1165         #include <xinput.h>
  1166         XINPUT_GAMEPAD_EX x1;
  1167         int main(int argc, char **argv) { }" HAVE_XINPUT_GAMEPAD_EX)
  1168       check_c_source_compiles("
  1169         #include <windows.h>
  1170         #include <xinput.h>
  1171         XINPUT_STATE_EX s1;
  1172         int main(int argc, char **argv) { }" HAVE_XINPUT_STATE_EX)
  1173     else()
  1174       check_include_file(xinput.h HAVE_XINPUT_H)
  1175     endif()
  1176 
  1177     check_include_file(d3d9.h HAVE_D3D_H)
  1178     check_include_file(d3d11_1.h HAVE_D3D11_H)
  1179     check_include_file(ddraw.h HAVE_DDRAW_H)
  1180     check_include_file(dsound.h HAVE_DSOUND_H)
  1181     check_include_file(dinput.h HAVE_DINPUT_H)
  1182     check_include_file(xaudio2.h HAVE_XAUDIO2_H)
  1183     check_include_file(mmdeviceapi.h HAVE_MMDEVICEAPI_H)
  1184     check_include_file(audioclient.h HAVE_AUDIOCLIENT_H)
  1185     check_include_file(dxgi.h HAVE_DXGI_H)
  1186     if(HAVE_D3D_H OR HAVE_D3D11_H OR HAVE_DDRAW_H OR HAVE_DSOUND_H OR HAVE_DINPUT_H OR HAVE_XAUDIO2_H)
  1187       set(HAVE_DIRECTX TRUE)
  1188       if(NOT CMAKE_COMPILER_IS_MINGW AND NOT USE_WINSDK_DIRECTX)
  1189       # TODO: change $ENV{DXSDL_DIR} to get the path from the include checks
  1190         link_directories($ENV{DXSDK_DIR}\\lib\\${PROCESSOR_ARCH})
  1191         include_directories($ENV{DXSDK_DIR}\\Include)
  1192       endif()
  1193     endif()
  1194     set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS})
  1195   endif()
  1196 
  1197   if(SDL_AUDIO)
  1198     set(SDL_AUDIO_DRIVER_WINMM 1)
  1199     file(GLOB WINMM_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/winmm/*.c)
  1200     set(SOURCE_FILES ${SOURCE_FILES} ${WINMM_AUDIO_SOURCES})
  1201     set(HAVE_SDL_AUDIO TRUE)
  1202 
  1203     if(HAVE_DSOUND_H)
  1204       set(SDL_AUDIO_DRIVER_DSOUND 1)
  1205       file(GLOB DSOUND_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/directsound/*.c)
  1206       set(SOURCE_FILES ${SOURCE_FILES} ${DSOUND_AUDIO_SOURCES})
  1207     endif()
  1208 
  1209     if(HAVE_XAUDIO2_H)
  1210       set(SDL_AUDIO_DRIVER_XAUDIO2 1)
  1211       file(GLOB XAUDIO2_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/xaudio2/*.c)
  1212       set(SOURCE_FILES ${SOURCE_FILES} ${XAUDIO2_AUDIO_SOURCES})
  1213     endif()
  1214 
  1215     if(HAVE_AUDIOCLIENT_H AND HAVE_MMDEVICEAPI_H)
  1216       set(SDL_AUDIO_DRIVER_WASAPI 1)
  1217       file(GLOB WASAPI_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/wasapi/*.c)
  1218       set(SOURCE_FILES ${SOURCE_FILES} ${WASAPI_AUDIO_SOURCES})
  1219     endif()
  1220   endif()
  1221 
  1222   if(SDL_VIDEO)
  1223     # requires SDL_LOADSO on Windows (IME, DX, etc.)
  1224     if(NOT SDL_LOADSO)
  1225       message_error("SDL_VIDEO requires SDL_LOADSO, which is not enabled")
  1226     endif()
  1227     set(SDL_VIDEO_DRIVER_WINDOWS 1)
  1228     file(GLOB WIN_VIDEO_SOURCES ${SDL2_SOURCE_DIR}/src/video/windows/*.c)
  1229     set(SOURCE_FILES ${SOURCE_FILES} ${WIN_VIDEO_SOURCES})
  1230 
  1231     if(RENDER_D3D AND HAVE_D3D_H)
  1232       set(SDL_VIDEO_RENDER_D3D 1)
  1233       set(HAVE_RENDER_D3D TRUE)
  1234     endif()
  1235     if(RENDER_D3D AND HAVE_D3D11_H)
  1236       set(SDL_VIDEO_RENDER_D3D11 1)
  1237       set(HAVE_RENDER_D3D TRUE)
  1238     endif()
  1239     set(HAVE_SDL_VIDEO TRUE)
  1240   endif()
  1241 
  1242   if(SDL_THREADS)
  1243     set(SDL_THREAD_WINDOWS 1)
  1244     set(SOURCE_FILES ${SOURCE_FILES}
  1245       ${SDL2_SOURCE_DIR}/src/thread/windows/SDL_sysmutex.c
  1246       ${SDL2_SOURCE_DIR}/src/thread/windows/SDL_syssem.c
  1247       ${SDL2_SOURCE_DIR}/src/thread/windows/SDL_systhread.c
  1248       ${SDL2_SOURCE_DIR}/src/thread/windows/SDL_systls.c
  1249       ${SDL2_SOURCE_DIR}/src/thread/generic/SDL_syscond.c)
  1250     set(HAVE_SDL_THREADS TRUE)
  1251   endif()
  1252 
  1253   if(SDL_POWER)
  1254     set(SDL_POWER_WINDOWS 1)
  1255     set(SOURCE_FILES ${SOURCE_FILES} ${SDL2_SOURCE_DIR}/src/power/windows/SDL_syspower.c)
  1256     set(HAVE_SDL_POWER TRUE)
  1257   endif()
  1258 
  1259   if(SDL_FILESYSTEM)
  1260     set(SDL_FILESYSTEM_WINDOWS 1)
  1261     file(GLOB FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/windows/*.c)
  1262     set(SOURCE_FILES ${SOURCE_FILES} ${FILESYSTEM_SOURCES})
  1263     set(HAVE_SDL_FILESYSTEM TRUE)
  1264   endif()
  1265 
  1266   # Libraries for Win32 native and MinGW
  1267   list(APPEND EXTRA_LIBS user32 gdi32 winmm imm32 ole32 oleaut32 version uuid)
  1268 
  1269   # TODO: in configure.in the check for timers is set on
  1270   # cygwin | mingw32* - does this include mingw32CE?
  1271   if(SDL_TIMERS)
  1272     set(SDL_TIMER_WINDOWS 1)
  1273     file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/windows/*.c)
  1274     set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES})
  1275     set(HAVE_SDL_TIMERS TRUE)
  1276   endif()
  1277 
  1278   if(SDL_LOADSO)
  1279     set(SDL_LOADSO_WINDOWS 1)
  1280     file(GLOB LOADSO_SOURCES ${SDL2_SOURCE_DIR}/src/loadso/windows/*.c)
  1281     set(SOURCE_FILES ${SOURCE_FILES} ${LOADSO_SOURCES})
  1282     set(HAVE_SDL_LOADSO TRUE)
  1283   endif()
  1284 
  1285   file(GLOB CORE_SOURCES ${SDL2_SOURCE_DIR}/src/core/windows/*.c)
  1286   set(SOURCE_FILES ${SOURCE_FILES} ${CORE_SOURCES})
  1287 
  1288   if(SDL_VIDEO)
  1289     if(VIDEO_OPENGL)
  1290       set(SDL_VIDEO_OPENGL 1)
  1291       set(SDL_VIDEO_OPENGL_WGL 1)
  1292       set(SDL_VIDEO_RENDER_OGL 1)
  1293       set(HAVE_VIDEO_OPENGL TRUE)
  1294     endif()
  1295 
  1296     if(VIDEO_OPENGLES)
  1297       set(SDL_VIDEO_OPENGL_EGL 1)
  1298       set(SDL_VIDEO_OPENGL_ES2 1)
  1299       set(SDL_VIDEO_RENDER_OGL_ES2 1)
  1300       set(HAVE_VIDEO_OPENGLES TRUE)
  1301     endif()
  1302   endif()
  1303 
  1304   if(SDL_JOYSTICK)
  1305     file(GLOB JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/windows/*.c)
  1306     set(SOURCE_FILES ${SOURCE_FILES} ${JOYSTICK_SOURCES})
  1307     if(HAVE_DINPUT_H)
  1308       set(SDL_JOYSTICK_DINPUT 1)
  1309       list(APPEND EXTRA_LIBS dinput8)
  1310       if(CMAKE_COMPILER_IS_MINGW)
  1311         list(APPEND EXTRA_LIBS dxerr8)
  1312       elseif (NOT USE_WINSDK_DIRECTX)
  1313         list(APPEND EXTRA_LIBS dxerr)
  1314       endif()
  1315     endif()
  1316     if(HAVE_XINPUT_H)
  1317       set(SDL_JOYSTICK_XINPUT 1)
  1318     endif()
  1319     if(NOT HAVE_DINPUT_H AND NOT HAVE_XINPUT_H)
  1320       set(SDL_JOYSTICK_WINMM 1)
  1321     endif()
  1322     set(HAVE_SDL_JOYSTICK TRUE)
  1323 
  1324     if(SDL_HAPTIC)
  1325       if(HAVE_DINPUT_H OR HAVE_XINPUT_H)
  1326         file(GLOB HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/windows/*.c)
  1327         if(HAVE_DINPUT_H)
  1328           set(SDL_HAPTIC_DINPUT 1)
  1329         endif()
  1330         if(HAVE_XINPUT_H)
  1331           set(SDL_HAPTIC_XINPUT 1)
  1332         endif()
  1333       else()
  1334         file(GLOB HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/dummy/*.c)
  1335         set(SDL_HAPTIC_DUMMY 1)
  1336       endif()
  1337       set(SOURCE_FILES ${SOURCE_FILES} ${HAPTIC_SOURCES})
  1338       set(HAVE_SDL_HAPTIC TRUE)
  1339     endif()
  1340   endif()
  1341 
  1342   file(GLOB VERSION_SOURCES ${SDL2_SOURCE_DIR}/src/main/windows/*.rc)
  1343   file(GLOB SDLMAIN_SOURCES ${SDL2_SOURCE_DIR}/src/main/windows/*.c)
  1344   if(MINGW OR CYGWIN)
  1345     list(APPEND EXTRA_LIBS mingw32)
  1346     list(APPEND EXTRA_LDFLAGS "-mwindows")
  1347     set(SDL_CFLAGS "${SDL_CFLAGS} -Dmain=SDL_main")
  1348     list(APPEND SDL_LIBS "-lmingw32" "-lSDL2main" "-mwindows")
  1349   endif()
  1350 elseif(APPLE)
  1351   # TODO: rework this all for proper MacOS X, iOS and Darwin support
  1352 
  1353   # We always need these libs on macOS at the moment.
  1354   # !!! FIXME: we need Carbon for some very old API calls in
  1355   # !!! FIXME:  src/video/cocoa/SDL_cocoakeyboard.c, but we should figure out
  1356   # !!! FIXME:  how to dump those.
  1357   if(NOT IOS)
  1358     set(SDL_FRAMEWORK_COCOA 1)
  1359     set(SDL_FRAMEWORK_CARBON 1)
  1360   endif()
  1361 
  1362   # Requires the darwin file implementation
  1363   if(SDL_FILE)
  1364     file(GLOB EXTRA_SOURCES ${SDL2_SOURCE_DIR}/src/file/cocoa/*.m)
  1365     set(SOURCE_FILES ${EXTRA_SOURCES} ${SOURCE_FILES})
  1366     # !!! FIXME: modern CMake doesn't need "LANGUAGE C" for Objective-C.
  1367     set_source_files_properties(${EXTRA_SOURCES} PROPERTIES LANGUAGE C)
  1368     set(HAVE_SDL_FILE TRUE)
  1369     # !!! FIXME: why is COREVIDEO inside this if() block?
  1370     set(SDL_FRAMEWORK_COREVIDEO 1)
  1371   else()
  1372     message_error("SDL_FILE must be enabled to build on MacOS X")
  1373   endif()
  1374 
  1375   if(SDL_AUDIO)
  1376     set(SDL_AUDIO_DRIVER_COREAUDIO 1)
  1377     file(GLOB AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/coreaudio/*.m)
  1378     # !!! FIXME: modern CMake doesn't need "LANGUAGE C" for Objective-C.
  1379     set_source_files_properties(${AUDIO_SOURCES} PROPERTIES LANGUAGE C)
  1380     set(SOURCE_FILES ${SOURCE_FILES} ${AUDIO_SOURCES})
  1381     set(HAVE_SDL_AUDIO TRUE)
  1382     set(SDL_FRAMEWORK_COREAUDIO 1)
  1383     set(SDL_FRAMEWORK_AUDIOTOOLBOX 1)
  1384   endif()
  1385 
  1386   if(SDL_JOYSTICK)
  1387     set(SDL_JOYSTICK_IOKIT 1)
  1388     if (IOS)
  1389       file(GLOB JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/iphoneos/*.m ${SDL2_SOURCE_DIR}/src/joystick/steam/*.c)
  1390     else()
  1391       file(GLOB JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/darwin/*.c)
  1392     endif()
  1393     set(SOURCE_FILES ${SOURCE_FILES} ${JOYSTICK_SOURCES})
  1394     set(HAVE_SDL_JOYSTICK TRUE)
  1395     set(SDL_FRAMEWORK_IOKIT 1)
  1396     set(SDL_FRAMEWORK_FF 1)
  1397   endif()
  1398 
  1399   if(SDL_HAPTIC)
  1400     set(SDL_HAPTIC_IOKIT 1)
  1401     if (IOS)
  1402       file(GLOB HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/dummy/*.c)
  1403       set(SDL_HAPTIC_DUMMY 1)
  1404     else()
  1405       file(GLOB HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/darwin/*.c)
  1406     endif()
  1407     set(SOURCE_FILES ${SOURCE_FILES} ${HAPTIC_SOURCES})
  1408     set(HAVE_SDL_HAPTIC TRUE)
  1409     set(SDL_FRAMEWORK_IOKIT 1)
  1410     set(SDL_FRAMEWORK_FF 1)
  1411     if(NOT SDL_JOYSTICK)
  1412       message(FATAL_ERROR "SDL_HAPTIC requires SDL_JOYSTICK to be enabled")
  1413     endif()
  1414   endif()
  1415 
  1416   if(SDL_POWER)
  1417     set(SDL_POWER_MACOSX 1)
  1418     if (IOS)
  1419       file(GLOB POWER_SOURCES ${SDL2_SOURCE_DIR}/src/power/uikit/*.m)
  1420     else()
  1421       file(GLOB POWER_SOURCES ${SDL2_SOURCE_DIR}/src/power/macosx/*.c)
  1422     endif()
  1423     set(SOURCE_FILES ${SOURCE_FILES} ${POWER_SOURCES})
  1424     set(HAVE_SDL_POWER TRUE)
  1425     set(SDL_FRAMEWORK_IOKIT 1)
  1426   endif()
  1427 
  1428   if(SDL_TIMERS)
  1429     set(SDL_TIMER_UNIX 1)
  1430     file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/unix/*.c)
  1431     set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES})
  1432     set(HAVE_SDL_TIMERS TRUE)
  1433   endif(SDL_TIMERS)
  1434 
  1435   if(SDL_FILESYSTEM)
  1436     set(SDL_FILESYSTEM_COCOA 1)
  1437     file(GLOB FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/cocoa/*.m)
  1438     # !!! FIXME: modern CMake doesn't need "LANGUAGE C" for Objective-C.
  1439     set_source_files_properties(${FILESYSTEM_SOURCES} PROPERTIES LANGUAGE C)
  1440     set(SOURCE_FILES ${SOURCE_FILES} ${FILESYSTEM_SOURCES})
  1441     set(HAVE_SDL_FILESYSTEM TRUE)
  1442   endif()
  1443 
  1444   # Actually load the frameworks at the end so we don't duplicate include.
  1445   if(SDL_FRAMEWORK_COREVIDEO)
  1446     find_library(COREVIDEO CoreVideo)
  1447     list(APPEND EXTRA_LIBS ${COREVIDEO})
  1448   endif()
  1449   if(SDL_FRAMEWORK_COCOA)
  1450     find_library(COCOA_LIBRARY Cocoa)
  1451     list(APPEND EXTRA_LIBS ${COCOA_LIBRARY})
  1452   endif()
  1453   if(SDL_FRAMEWORK_IOKIT)
  1454     find_library(IOKIT IOKit)
  1455     list(APPEND EXTRA_LIBS ${IOKIT})
  1456   endif()
  1457   if(SDL_FRAMEWORK_FF)
  1458     find_library(FORCEFEEDBACK ForceFeedback)
  1459     list(APPEND EXTRA_LIBS ${FORCEFEEDBACK})
  1460   endif()
  1461   if(SDL_FRAMEWORK_CARBON)
  1462     find_library(CARBON_LIBRARY Carbon)
  1463     list(APPEND EXTRA_LIBS ${CARBON_LIBRARY})
  1464   endif()
  1465   if(SDL_FRAMEWORK_COREAUDIO)
  1466     find_library(COREAUDIO CoreAudio)
  1467     list(APPEND EXTRA_LIBS ${COREAUDIO})
  1468   endif()
  1469   if(SDL_FRAMEWORK_AUDIOTOOLBOX)
  1470     find_library(AUDIOTOOLBOX AudioToolbox)
  1471     list(APPEND EXTRA_LIBS ${AUDIOTOOLBOX})
  1472   endif()
  1473 
  1474   # iOS hack needed - http://code.google.com/p/ios-cmake/ ?
  1475   if(SDL_VIDEO)
  1476     if (IOS)
  1477       set(SDL_VIDEO_DRIVER_UIKIT 1)
  1478       file(GLOB UIKITVIDEO_SOURCES ${SDL2_SOURCE_DIR}/src/video/uikit/*.m)
  1479       set(SOURCE_FILES ${SOURCE_FILES} ${UIKITVIDEO_SOURCES})
  1480     else()
  1481       CheckCOCOA()
  1482       if(VIDEO_OPENGL)
  1483         set(SDL_VIDEO_OPENGL 1)
  1484         set(SDL_VIDEO_OPENGL_CGL 1)
  1485         set(SDL_VIDEO_RENDER_OGL 1)
  1486         set(HAVE_VIDEO_OPENGL TRUE)
  1487       endif()
  1488     endif()
  1489   endif()
  1490 
  1491   CheckPTHREAD()
  1492 elseif(HAIKU)
  1493   if(SDL_VIDEO)
  1494     set(SDL_VIDEO_DRIVER_HAIKU 1)
  1495     file(GLOB HAIKUVIDEO_SOURCES ${SDL2_SOURCE_DIR}/src/video/haiku/*.c)
  1496     set(SOURCE_FILES ${SOURCE_FILES} ${HAIKUVIDEO_SOURCES})
  1497     set(HAVE_SDL_VIDEO TRUE)
  1498 
  1499     set(SDL_FILESYSTEM_HAIKU 1)
  1500     file(GLOB FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/haiku/*.cc)
  1501     set(SOURCE_FILES ${SOURCE_FILES} ${FILESYSTEM_SOURCES})
  1502     set(HAVE_SDL_FILESYSTEM TRUE)
  1503 
  1504     if(SDL_TIMERS)
  1505       set(SDL_TIMER_HAIKU 1)
  1506       file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/haiku/*.c)
  1507       set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES})
  1508       set(HAVE_SDL_TIMERS TRUE)
  1509     endif(SDL_TIMERS)
  1510 
  1511     if(VIDEO_OPENGL)
  1512       # TODO: Use FIND_PACKAGE(OpenGL) instead
  1513       set(SDL_VIDEO_OPENGL 1)
  1514       set(SDL_VIDEO_OPENGL_BGL 1)
  1515       set(SDL_VIDEO_RENDER_OGL 1)
  1516       list(APPEND EXTRA_LIBS GL)
  1517       set(HAVE_VIDEO_OPENGL TRUE)
  1518     endif()
  1519   endif()
  1520 
  1521   CheckPTHREAD()
  1522 endif()
  1523 
  1524 if(VIDEO_VULKAN)
  1525   set(SDL_VIDEO_VULKAN 1)
  1526 endif()
  1527 
  1528 # Dummies
  1529 # configure.in does it differently:
  1530 # if not have X
  1531 #   if enable_X {  SDL_X_DISABLED = 1 }
  1532 #   [add dummy sources]
  1533 # so it always adds a dummy, without checking, if it was actually requested.
  1534 # This leads to missing internal references on building, since the
  1535 # src/X/*.c does not get included.
  1536 if(NOT HAVE_SDL_JOYSTICK)
  1537   set(SDL_JOYSTICK_DISABLED 1)
  1538   if(SDL_JOYSTICK AND NOT APPLE) # results in unresolved symbols on OSX
  1539 
  1540     file(GLOB JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/dummy/*.c)
  1541     set(SOURCE_FILES ${SOURCE_FILES} ${JOYSTICK_SOURCES})
  1542   endif()
  1543 endif()
  1544 if(NOT HAVE_SDL_HAPTIC)
  1545   set(SDL_HAPTIC_DISABLED 1)
  1546   file(GLOB HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/dummy/*.c)
  1547   set(SOURCE_FILES ${SOURCE_FILES} ${HAPTIC_SOURCES})
  1548 endif()
  1549 if(NOT HAVE_SDL_LOADSO)
  1550   set(SDL_LOADSO_DISABLED 1)
  1551   file(GLOB LOADSO_SOURCES ${SDL2_SOURCE_DIR}/src/loadso/dummy/*.c)
  1552   set(SOURCE_FILES ${SOURCE_FILES} ${LOADSO_SOURCES})
  1553 endif()
  1554 if(NOT HAVE_SDL_FILESYSTEM)
  1555   set(SDL_FILESYSTEM_DISABLED 1)
  1556   file(GLOB FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/dummy/*.c)
  1557   set(SOURCE_FILES ${SOURCE_FILES} ${FILESYSTEM_SOURCES})
  1558 endif()
  1559 
  1560 # We always need to have threads and timers around
  1561 if(NOT HAVE_SDL_THREADS)
  1562   set(SDL_THREADS_DISABLED 1)
  1563   file(GLOB THREADS_SOURCES ${SDL2_SOURCE_DIR}/src/thread/generic/*.c)
  1564   set(SOURCE_FILES ${SOURCE_FILES} ${THREADS_SOURCES})
  1565 endif()
  1566 if(NOT HAVE_SDL_TIMERS)
  1567   set(SDL_TIMERS_DISABLED 1)
  1568   file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/dummy/*.c)
  1569   set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES})
  1570 endif()
  1571 
  1572 if(NOT SDLMAIN_SOURCES)
  1573   file(GLOB SDLMAIN_SOURCES ${SDL2_SOURCE_DIR}/src/main/dummy/*.c)
  1574 endif()
  1575 
  1576 # Append the -MMD -MT flags
  1577 # if(DEPENDENCY_TRACKING)
  1578 #   if(COMPILER_IS_GNUCC)
  1579 #     set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -MMD -MT \$@")
  1580 #   endif()
  1581 # endif()
  1582 
  1583 configure_file("${SDL2_SOURCE_DIR}/include/SDL_config.h.cmake"
  1584   "${SDL2_BINARY_DIR}/include/SDL_config.h")
  1585 
  1586 # Prepare the flags and remove duplicates
  1587 if(EXTRA_LDFLAGS)
  1588   list(REMOVE_DUPLICATES EXTRA_LDFLAGS)
  1589 endif()
  1590 if(EXTRA_LIBS)
  1591   list(REMOVE_DUPLICATES EXTRA_LIBS)
  1592 endif()
  1593 if(EXTRA_CFLAGS)
  1594   list(REMOVE_DUPLICATES EXTRA_CFLAGS)
  1595 endif()
  1596 listtostr(EXTRA_CFLAGS _EXTRA_CFLAGS)
  1597 set(EXTRA_CFLAGS ${_EXTRA_CFLAGS})
  1598 
  1599 # Compat helpers for the configuration files
  1600 if(NOT WINDOWS OR CYGWIN)
  1601   # TODO: we need a Windows script, too
  1602   execute_process(COMMAND sh ${SDL2_SOURCE_DIR}/build-scripts/updaterev.sh)
  1603 
  1604   set(prefix ${CMAKE_INSTALL_PREFIX})
  1605   set(exec_prefix "\${prefix}")
  1606   set(libdir "\${exec_prefix}/lib${LIB_SUFFIX}")
  1607   set(bindir "\${exec_prefix}/bin")
  1608   set(includedir "\${prefix}/include")
  1609   if(SDL_STATIC)
  1610     set(ENABLE_STATIC_TRUE "")
  1611     set(ENABLE_STATIC_FALSE "#")
  1612   else()
  1613     set(ENABLE_STATIC_TRUE "#")
  1614     set(ENABLE_STATIC_FALSE "")
  1615   endif()
  1616   if(SDL_SHARED)
  1617     set(ENABLE_SHARED_TRUE "")
  1618     set(ENABLE_SHARED_FALSE "#")
  1619   else()
  1620     set(ENABLE_SHARED_TRUE "#")
  1621     set(ENABLE_SHARED_FALSE "")
  1622   endif()
  1623 
  1624   # Clean up the different lists
  1625   listtostr(EXTRA_LIBS _EXTRA_LIBS "-l")
  1626   set(SDL_STATIC_LIBS ${SDL_LIBS} ${EXTRA_LDFLAGS} ${_EXTRA_LIBS})
  1627   list(REMOVE_DUPLICATES SDL_STATIC_LIBS)
  1628   listtostr(SDL_STATIC_LIBS _SDL_STATIC_LIBS)
  1629   set(SDL_STATIC_LIBS ${_SDL_STATIC_LIBS})
  1630   listtostr(SDL_LIBS _SDL_LIBS)
  1631   set(SDL_LIBS ${_SDL_LIBS})
  1632 
  1633   # MESSAGE(STATUS "SDL_LIBS: ${SDL_LIBS}")
  1634   # MESSAGE(STATUS "SDL_STATIC_LIBS: ${SDL_STATIC_LIBS}")
  1635 
  1636   configure_file("${SDL2_SOURCE_DIR}/sdl2.pc.in"
  1637     "${SDL2_BINARY_DIR}/sdl2.pc" @ONLY)
  1638   configure_file("${SDL2_SOURCE_DIR}/sdl2-config.in"
  1639     "${SDL2_BINARY_DIR}/sdl2-config")
  1640   configure_file("${SDL2_SOURCE_DIR}/sdl2-config.in"
  1641     "${SDL2_BINARY_DIR}/sdl2-config" @ONLY)
  1642   configure_file("${SDL2_SOURCE_DIR}/SDL2.spec.in"
  1643     "${SDL2_BINARY_DIR}/SDL2.spec" @ONLY)
  1644 endif()
  1645 
  1646 ##### Info output #####
  1647 message(STATUS "")
  1648 message(STATUS "SDL2 was configured with the following options:")
  1649 message(STATUS "")
  1650 message(STATUS "Platform: ${CMAKE_SYSTEM}")
  1651 message(STATUS "64-bit:   ${ARCH_64}")
  1652 message(STATUS "Compiler: ${CMAKE_C_COMPILER}")
  1653 message(STATUS "")
  1654 message(STATUS "Subsystems:")
  1655 foreach(_SUB ${SDL_SUBSYSTEMS})
  1656   string(TOUPPER ${_SUB} _OPT)
  1657   message_bool_option(${_SUB} SDL_${_OPT})
  1658 endforeach()
  1659 message(STATUS "")
  1660 message(STATUS "Options:")
  1661 list(SORT ALLOPTIONS)
  1662 foreach(_OPT ${ALLOPTIONS})
  1663   # Longest option is VIDEO_X11_XSCREENSAVER = 22 characters
  1664   # Get the padding
  1665   string(LENGTH ${_OPT} _OPTLEN)
  1666   math(EXPR _PADLEN "23 - ${_OPTLEN}")
  1667   string(RANDOM LENGTH ${_PADLEN} ALPHABET " " _PADDING)
  1668   message_tested_option(${_OPT} ${_PADDING})
  1669 endforeach()
  1670 message(STATUS "")
  1671 message(STATUS " CFLAGS:        ${CMAKE_C_FLAGS}")
  1672 message(STATUS " EXTRA_CFLAGS:  ${EXTRA_CFLAGS}")
  1673 message(STATUS " EXTRA_LDFLAGS: ${EXTRA_LDFLAGS}")
  1674 message(STATUS " EXTRA_LIBS:    ${EXTRA_LIBS}")
  1675 message(STATUS "")
  1676 message(STATUS " Build Shared Library: ${SDL_SHARED}")
  1677 message(STATUS " Build Static Library: ${SDL_STATIC}")
  1678 if(SDL_STATIC)
  1679     message(STATUS " Build Static Library with Position Independent Code: ${SDL_STATIC_PIC}")
  1680 endif()
  1681 message(STATUS "")
  1682 if(UNIX)
  1683   message(STATUS "If something was not detected, although the libraries")
  1684   message(STATUS "were installed, then make sure you have set the")
  1685   message(STATUS "CFLAGS and LDFLAGS environment variables correctly.")
  1686   message(STATUS "")
  1687 endif()
  1688 
  1689 # Ensure that the extra cflags are used at compile time
  1690 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS}")
  1691 
  1692 # Always build SDLmain
  1693 add_library(SDL2main STATIC ${SDLMAIN_SOURCES})
  1694 target_include_directories(SDL2main PUBLIC $<INSTALL_INTERFACE:include>)
  1695 set(_INSTALL_LIBS "SDL2main")
  1696 
  1697 if(SDL_SHARED)
  1698   add_library(SDL2 SHARED ${SOURCE_FILES} ${VERSION_SOURCES})
  1699   if(APPLE)
  1700     set_target_properties(SDL2 PROPERTIES MACOSX_RPATH 1)
  1701   elseif(UNIX AND NOT ANDROID)
  1702     set_target_properties(SDL2 PROPERTIES
  1703       VERSION ${LT_VERSION}
  1704       SOVERSION ${LT_REVISION}
  1705       OUTPUT_NAME "SDL2-${LT_RELEASE}")
  1706   else()
  1707     set_target_properties(SDL2 PROPERTIES
  1708       VERSION ${SDL_VERSION}
  1709       SOVERSION ${LT_REVISION}
  1710       OUTPUT_NAME "SDL2")
  1711   endif()
  1712   if(MSVC AND NOT LIBC)
  1713     # Don't try to link with the default set of libraries.
  1714     set_target_properties(SDL2 PROPERTIES LINK_FLAGS_RELEASE "/NODEFAULTLIB")
  1715     set_target_properties(SDL2 PROPERTIES LINK_FLAGS_DEBUG "/NODEFAULTLIB")
  1716     set_target_properties(SDL2 PROPERTIES STATIC_LIBRARY_FLAGS "/NODEFAULTLIB")
  1717   endif()
  1718   set(_INSTALL_LIBS "SDL2" ${_INSTALL_LIBS})
  1719   target_link_libraries(SDL2 ${EXTRA_LIBS} ${EXTRA_LDFLAGS})
  1720   target_include_directories(SDL2 PUBLIC $<INSTALL_INTERFACE:include>)
  1721 endif()
  1722 
  1723 if(SDL_STATIC)
  1724   set (BUILD_SHARED_LIBS FALSE)
  1725   add_library(SDL2-static STATIC ${SOURCE_FILES})
  1726   if (NOT SDL_SHARED OR NOT WIN32)
  1727     set_target_properties(SDL2-static PROPERTIES OUTPUT_NAME "SDL2")
  1728     # Note: Apparently, OUTPUT_NAME must really be unique; even when
  1729     # CMAKE_IMPORT_LIBRARY_SUFFIX or the like are given. Otherwise
  1730     # the static build may race with the import lib and one will get
  1731     # clobbered, when the suffix is realized via subsequent rename.
  1732   endif()
  1733   set_target_properties(SDL2-static PROPERTIES POSITION_INDEPENDENT_CODE ${SDL_STATIC_PIC})
  1734   if(MSVC AND NOT LIBC)
  1735     set_target_properties(SDL2-static PROPERTIES LINK_FLAGS_RELEASE "/NODEFAULTLIB")
  1736     set_target_properties(SDL2-static PROPERTIES LINK_FLAGS_DEBUG "/NODEFAULTLIB")
  1737     set_target_properties(SDL2-static PROPERTIES STATIC_LIBRARY_FLAGS "/NODEFAULTLIB")
  1738   endif()
  1739   # TODO: Win32 platforms keep the same suffix .lib for import and static
  1740   # libraries - do we need to consider this?
  1741   set(_INSTALL_LIBS "SDL2-static" ${_INSTALL_LIBS})
  1742   target_link_libraries(SDL2-static ${EXTRA_LIBS} ${EXTRA_LDFLAGS})
  1743   target_include_directories(SDL2-static PUBLIC $<INSTALL_INTERFACE:include>)
  1744 endif()
  1745 
  1746 ##### Installation targets #####
  1747 install(TARGETS ${_INSTALL_LIBS} EXPORT SDL2Targets
  1748   LIBRARY DESTINATION "lib${LIB_SUFFIX}"
  1749   ARCHIVE DESTINATION "lib${LIB_SUFFIX}"
  1750   RUNTIME DESTINATION bin)
  1751 
  1752 ##### Export files #####
  1753 if (APPLE)
  1754   set(PKG_PREFIX "SDL2.framework/Resources")
  1755 elseif (WINDOWS)
  1756   set(PKG_PREFIX "cmake")
  1757 else ()
  1758   set(PKG_PREFIX "lib/cmake/SDL2")
  1759 endif ()
  1760 
  1761 include(CMakePackageConfigHelpers)
  1762 write_basic_package_version_file("${CMAKE_BINARY_DIR}/SDL2ConfigVersion.cmake"
  1763   VERSION ${SDL_VERSION}
  1764   COMPATIBILITY AnyNewerVersion
  1765 )
  1766 
  1767 install(EXPORT SDL2Targets
  1768   FILE SDL2Targets.cmake
  1769   NAMESPACE SDL2::
  1770   DESTINATION ${PKG_PREFIX}
  1771 )
  1772 install(
  1773   FILES
  1774     ${CMAKE_CURRENT_SOURCE_DIR}/SDL2Config.cmake
  1775     ${CMAKE_BINARY_DIR}/SDL2ConfigVersion.cmake
  1776   DESTINATION ${PKG_PREFIX}
  1777   COMPONENT Devel
  1778 )
  1779 
  1780 file(GLOB INCLUDE_FILES ${SDL2_SOURCE_DIR}/include/*.h)
  1781 file(GLOB BIN_INCLUDE_FILES ${SDL2_BINARY_DIR}/include/*.h)
  1782 foreach(_FNAME ${BIN_INCLUDE_FILES})
  1783   get_filename_component(_INCNAME ${_FNAME} NAME)
  1784   list(REMOVE_ITEM INCLUDE_FILES ${SDL2_SOURCE_DIR}/include/${_INCNAME})
  1785 endforeach()
  1786 list(APPEND INCLUDE_FILES ${BIN_INCLUDE_FILES})
  1787 install(FILES ${INCLUDE_FILES} DESTINATION include/SDL2)
  1788 
  1789 if(NOT (WINDOWS OR CYGWIN))
  1790   if(SDL_SHARED)
  1791     if (APPLE)
  1792         set(SOEXT "dylib")
  1793     else()
  1794         set(SOEXT "so")
  1795     endif()
  1796     install(CODE "
  1797       execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink
  1798       \"libSDL2-2.0.${SOEXT}\" \"libSDL2.${SOEXT}\")")
  1799     install(FILES ${SDL2_BINARY_DIR}/libSDL2.${SOEXT} DESTINATION "lib${LIB_SUFFIX}")
  1800   endif()
  1801   if(FREEBSD)
  1802     # FreeBSD uses ${PREFIX}/libdata/pkgconfig
  1803     install(FILES ${SDL2_BINARY_DIR}/sdl2.pc DESTINATION "libdata/pkgconfig")
  1804   else()
  1805     install(FILES ${SDL2_BINARY_DIR}/sdl2.pc
  1806       DESTINATION "lib${LIB_SUFFIX}/pkgconfig")
  1807   endif()
  1808   install(PROGRAMS ${SDL2_BINARY_DIR}/sdl2-config DESTINATION bin)
  1809   # TODO: what about the .spec file? Is it only needed for RPM creation?
  1810   install(FILES "${SDL2_SOURCE_DIR}/sdl2.m4" DESTINATION "${CMAKE_INSTALL_FULL_DATAROOTDIR}/aclocal")
  1811 endif()
  1812 
  1813 ##### Uninstall target #####
  1814 
  1815 if(NOT TARGET uninstall)
  1816   configure_file(
  1817       "${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake.in"
  1818       "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
  1819       IMMEDIATE @ONLY)
  1820 
  1821   add_custom_target(uninstall
  1822       COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake)
  1823 endif()