CMakeLists.txt
author Sam Lantinga <slouken@libsdl.org>
Sun, 12 Nov 2017 22:51:12 -0800
changeset 11702 cf166abbde4a
parent 11687 e968d755a760
child 11707 7960a740a126
permissions -rw-r--r--
Updated SDL's YUV support, many thanks to Adrien Descamps

New functions get and set the YUV colorspace conversion mode:
SDL_SetYUVConversionMode()
SDL_GetYUVConversionMode()
SDL_GetYUVConversionModeForResolution()

SDL_ConvertPixels() converts between all supported RGB and YUV formats, with SSE acceleration for converting from planar YUV formats (YV12, NV12, etc) to common RGB/RGBA formats.

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