CMakeLists.txt
author Sam Lantinga
Sun, 05 Apr 2020 08:58:47 -0700
changeset 13689 c3055b205671
parent 13621 958bd91f4f4c
child 13710 a1a6885cff94
permissions -rw-r--r--
Fixed bug 5015 - SDL_RenderReadPixels on DirectX 11.1 backend seems to be broken

Konrad

It appears that I cannot use SDL_RenderReadPixels on a bound framebuffer (SDL_Texture set as render target) as it simply results in gibberish data. However, drawing that framebuffer into the default target (window surface) does render it correctly. Other backends (OpenGL, software, Direct3D) do work fine.

It looks to me like D3D11_RenderReadPixels just gets the general backbuffer and not the current render target and its backbuffer.

Here is the patch which actually fetches the current render target and its underlying ID3D11Resource which is ID3D11Texture2D.
     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 CXX)
     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 13)
    46 set(SDL_INTERFACE_AGE 1)
    47 set(SDL_BINARY_AGE 13)
    48 set(SDL_VERSION "${SDL_MAJOR_VERSION}.${SDL_MINOR_VERSION}.${SDL_MICRO_VERSION}")
    49 # the following should match the versions in Xcode project file:
    50 set(DYLIB_CURRENT_VERSION 12.0.0)
    51 set(DYLIB_COMPATIBILITY_VERSION 1.0.0)
    52 
    53 # Set defaults preventing destination file conflicts
    54 set(SDL_CMAKE_DEBUG_POSTFIX "d"
    55     CACHE STRING "Name suffix for debug builds")
    56 
    57 mark_as_advanced(CMAKE_IMPORT_LIBRARY_SUFFIX SDL_CMAKE_DEBUG_POSTFIX)
    58 
    59 # Calculate a libtool-like version number
    60 math(EXPR LT_CURRENT "${SDL_MICRO_VERSION} - ${SDL_INTERFACE_AGE}")
    61 math(EXPR LT_AGE "${SDL_BINARY_AGE} - ${SDL_INTERFACE_AGE}")
    62 math(EXPR LT_MAJOR "${LT_CURRENT}- ${LT_AGE}")
    63 set(LT_REVISION "${SDL_INTERFACE_AGE}")
    64 set(LT_RELEASE "${SDL_MAJOR_VERSION}.${SDL_MINOR_VERSION}")
    65 set(LT_VERSION "${LT_MAJOR}.${LT_AGE}.${LT_REVISION}")
    66 
    67 #message(STATUS "${LT_VERSION} :: ${LT_AGE} :: ${LT_REVISION} :: ${LT_CURRENT} :: ${LT_RELEASE}")
    68 
    69 # General settings & flags
    70 set(LIBRARY_OUTPUT_DIRECTORY "build")
    71 # Check for 64 or 32 bit
    72 set(SIZEOF_VOIDP ${CMAKE_SIZEOF_VOID_P})
    73 if(CMAKE_SIZEOF_VOID_P EQUAL 8)
    74   set(ARCH_64 TRUE)
    75   set(PROCESSOR_ARCH "x64")
    76 else()
    77   set(ARCH_64 FALSE)
    78   set(PROCESSOR_ARCH "x86")
    79 endif()
    80 set(LIBNAME SDL2)
    81 if(NOT LIBTYPE)
    82   set(LIBTYPE SHARED)
    83 endif()
    84 
    85 # Get the platform
    86 if(WIN32)
    87   if(NOT WINDOWS)
    88     set(WINDOWS TRUE)
    89   endif()
    90 elseif(UNIX AND NOT APPLE)
    91   if(CMAKE_SYSTEM_NAME MATCHES ".*Linux")
    92     set(LINUX TRUE)
    93   elseif(CMAKE_SYSTEM_NAME MATCHES "kFreeBSD.*")
    94     set(FREEBSD TRUE)
    95   elseif(CMAKE_SYSTEM_NAME MATCHES "kNetBSD.*|NetBSD.*")
    96     set(NETBSD TRUE)
    97   elseif(CMAKE_SYSTEM_NAME MATCHES "kOpenBSD.*|OpenBSD.*")
    98     set(OPENBSD TRUE)
    99   elseif(CMAKE_SYSTEM_NAME MATCHES ".*GNU.*")
   100     set(GNU TRUE)
   101   elseif(CMAKE_SYSTEM_NAME MATCHES ".*BSDI.*")
   102     set(BSDI TRUE)
   103   elseif(CMAKE_SYSTEM_NAME MATCHES "DragonFly.*|FreeBSD")
   104     set(FREEBSD TRUE)
   105   elseif(CMAKE_SYSTEM_NAME MATCHES "SYSV5.*")
   106     set(SYSV5 TRUE)
   107   elseif(CMAKE_SYSTEM_NAME MATCHES "Solaris.*")
   108     set(SOLARIS TRUE)
   109   elseif(CMAKE_SYSTEM_NAME MATCHES "HP-UX.*")
   110     set(HPUX TRUE)
   111   elseif(CMAKE_SYSTEM_NAME MATCHES "AIX.*")
   112     set(AIX TRUE)
   113   elseif(CMAKE_SYSTEM_NAME MATCHES "Minix.*")
   114     set(MINIX TRUE)
   115   endif()
   116 elseif(APPLE)
   117   if(CMAKE_SYSTEM_NAME MATCHES ".*Darwin.*")
   118     set(DARWIN TRUE)
   119   elseif(CMAKE_SYSTEM_NAME MATCHES ".*MacOS.*")
   120     set(MACOSX TRUE)
   121   elseif(CMAKE_SYSTEM_NAME MATCHES ".*tvOS.*")
   122     set(TVOS TRUE)
   123   endif()
   124   # TODO: iOS?
   125 elseif(CMAKE_SYSTEM_NAME MATCHES "BeOS.*")
   126   message_error("BeOS support has been removed as of SDL 2.0.2.")
   127 elseif(CMAKE_SYSTEM_NAME MATCHES "Haiku.*")
   128   set(HAIKU TRUE)
   129 endif()
   130 
   131 # Don't mistake osx for unix
   132 if(UNIX AND NOT APPLE AND NOT RISCOS)
   133   set(UNIX_SYS ON)
   134 else()
   135   set(UNIX_SYS OFF)
   136 endif()
   137 
   138 if(UNIX OR APPLE)
   139   set(UNIX_OR_MAC_SYS ON)
   140 else()
   141   set(UNIX_OR_MAC_SYS OFF)
   142 endif()
   143 
   144 if (UNIX_OR_MAC_SYS AND NOT EMSCRIPTEN) # JavaScript does not yet have threading support, so disable pthreads when building for Emscripten.
   145   set(SDL_PTHREADS_ENABLED_BY_DEFAULT ON)
   146 else()
   147   set(SDL_PTHREADS_ENABLED_BY_DEFAULT OFF)
   148 endif()
   149 
   150 # Default option knobs
   151 if(APPLE OR ARCH_64)
   152   if(NOT "${CMAKE_OSX_ARCHITECTURES}" MATCHES "arm")
   153     set(OPT_DEF_SSEMATH ON)
   154   endif()
   155 endif()
   156 if(UNIX OR MINGW OR MSYS)
   157   set(OPT_DEF_LIBC ON)
   158 endif()
   159 
   160 # The hidraw support doesn't catch Xbox, PS4 and Nintendo controllers,
   161 #  so we'll just use libusb when it's available. libusb does not support iOS,
   162 #  so we default to yes on iOS.
   163 #  TODO: Windows can support libusb, the hid.c file just depends on Unix APIs
   164 if(WINDOWS OR IOS OR TVOS OR ANDROID)
   165   set(HIDAPI_SKIP_LIBUSB TRUE)
   166 else()
   167   set(HIDAPI_SKIP_LIBUSB FALSE)
   168 endif()
   169 if (HIDAPI_SKIP_LIBUSB)
   170   set(OPT_DEF_HIDAPI ON)
   171 endif()
   172 
   173 # On the other hand, *BSD specifically uses libusb only, so we make a special
   174 #  case just for them.
   175 if(FREEBSD OR NETBSD OR OPENBSD OR BSDI)
   176   set(HIDAPI_ONLY_LIBUSB TRUE)
   177 else()
   178   set(HIDAPI_ONLY_LIBUSB FALSE)
   179 endif()
   180 
   181 # Compiler info
   182 if(CMAKE_COMPILER_IS_GNUCC)
   183   set(USE_GCC TRUE)
   184   set(OPT_DEF_ASM TRUE)
   185 elseif(CMAKE_C_COMPILER_ID MATCHES "Clang")
   186   set(USE_CLANG TRUE)
   187   set(OPT_DEF_ASM TRUE)
   188 elseif(MSVC_VERSION GREATER 1400) # VisualStudio 8.0+
   189   set(OPT_DEF_ASM TRUE)
   190   #set(CMAKE_C_FLAGS "/ZI /WX- /
   191 else()
   192   set(OPT_DEF_ASM FALSE)
   193 endif()
   194 
   195 if(USE_GCC OR USE_CLANG)
   196   set(OPT_DEF_GCC_ATOMICS ON)
   197 endif()
   198 
   199 # Default flags, if not set otherwise
   200 if("$ENV{CFLAGS}" STREQUAL "")
   201   if(CMAKE_BUILD_TYPE STREQUAL "")
   202     if(USE_GCC OR USE_CLANG)
   203       set(CMAKE_C_FLAGS "-g -O3")
   204     endif()
   205   endif()
   206 else()
   207   set(CMAKE_C_FLAGS "$ENV{CFLAGS}")
   208   list(APPEND EXTRA_CFLAGS "$ENV{CFLAGS}")
   209 endif()
   210 if(NOT ("$ENV{CFLAGS}" STREQUAL "")) # Hackish, but does the trick on Win32
   211   list(APPEND EXTRA_LDFLAGS "$ENV{LDFLAGS}")
   212 endif()
   213 
   214 if(MSVC)
   215   option(FORCE_STATIC_VCRT "Force /MT for static VC runtimes" OFF)
   216   if(FORCE_STATIC_VCRT)
   217     foreach(flag_var
   218         CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE
   219         CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO)
   220       if(${flag_var} MATCHES "/MD")
   221         string(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}")
   222       endif()
   223     endforeach()
   224   endif()
   225 
   226   # Make sure /RTC1 is disabled, otherwise it will use functions from the CRT
   227   foreach(flag_var
   228       CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE
   229       CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO)
   230     string(REGEX REPLACE "/RTC(su|[1su])" "" ${flag_var} "${${flag_var}}")
   231   endforeach(flag_var)
   232 endif()
   233 
   234 # Those are used for pkg-config and friends, so that the SDL2.pc, sdl2-config,
   235 # etc. are created correctly.
   236 set(SDL_LIBS "-lSDL2")
   237 set(SDL_CFLAGS "")
   238 
   239 # When building shared lib for Windows with MinGW,
   240 # avoid the DLL having a "lib" prefix
   241 if(WINDOWS)
   242   set(CMAKE_SHARED_LIBRARY_PREFIX "")
   243 endif()
   244 
   245 # Emscripten toolchain has a nonempty default value for this, and the checks
   246 # in this file need to change that, so remember the original value, and
   247 # restore back to that afterwards. For check_function_exists() to work in
   248 # Emscripten, this value must be at its default value.
   249 set(ORIG_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
   250 
   251 if(CYGWIN)
   252   # We build SDL on cygwin without the UNIX emulation layer
   253   include_directories("-I/usr/include/mingw")
   254   set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -mno-cygwin")
   255   check_c_source_compiles("int main(int argc, char **argv) {}"
   256     HAVE_GCC_NO_CYGWIN)
   257   set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS})
   258   if(HAVE_GCC_NO_CYGWIN)
   259     list(APPEND EXTRA_LDFLAGS "-mno-cygwin")
   260     list(APPEND SDL_LIBS "-mno-cygwin")
   261   endif()
   262   set(SDL_CFLAGS "${SDL_CFLAGS} -I/usr/include/mingw")
   263 endif()
   264 
   265 add_definitions(-DUSING_GENERATED_CONFIG_H)
   266 # General includes
   267 include_directories(${SDL2_BINARY_DIR}/include ${SDL2_SOURCE_DIR}/include)
   268 if(USE_GCC OR USE_CLANG)
   269   set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -idirafter ${SDL2_SOURCE_DIR}/src/video/khronos")
   270 else()
   271   include_directories(${SDL2_SOURCE_DIR}/src/video/khronos)
   272 endif()
   273 
   274 # All these ENABLED_BY_DEFAULT vars will default to ON if not specified, so
   275 #  you only need to have a platform override them if they are disabling.
   276 set(OPT_DEF_ASM TRUE)
   277 if(EMSCRIPTEN)
   278   # Set up default values for the currently supported set of subsystems:
   279   # Emscripten/Javascript does not have assembly support, a dynamic library
   280   # loading architecture, low-level CPU inspection or multithreading.
   281   set(OPT_DEF_ASM FALSE)
   282   set(SDL_SHARED_ENABLED_BY_DEFAULT OFF)
   283   set(SDL_ATOMIC_ENABLED_BY_DEFAULT OFF)
   284   set(SDL_THREADS_ENABLED_BY_DEFAULT OFF)
   285   set(SDL_LOADSO_ENABLED_BY_DEFAULT OFF)
   286   set(SDL_CPUINFO_ENABLED_BY_DEFAULT OFF)
   287   set(SDL_DLOPEN_ENABLED_BY_DEFAULT OFF)
   288 endif()
   289 
   290 # When defined, respect CMake's BUILD_SHARED_LIBS setting:
   291 set(SDL_STATIC_ENABLED_BY_DEFAULT ON)
   292 if (NOT DEFINED SDL_SHARED_ENABLED_BY_DEFAULT)
   293   # ...unless decided already (as for EMSCRIPTEN)
   294 
   295   set(SDL_SHARED_ENABLED_BY_DEFAULT OFF)
   296 
   297   if (NOT DEFINED BUILD_SHARED_LIBS)
   298     # No preference? Build both, just like the AC/AM configure
   299     set(SDL_SHARED_ENABLED_BY_DEFAULT ON)
   300 
   301   elseif (BUILD_SHARED_LIBS)
   302     # In this case, we assume the user wants a shared lib and don't build
   303     # the static one
   304     set(SDL_SHARED_ENABLED_BY_DEFAULT ON)
   305     set(SDL_STATIC_ENABLED_BY_DEFAULT OFF)
   306   endif()
   307 endif()
   308 
   309 set(SDL_SUBSYSTEMS
   310     Atomic Audio Video Render Events Joystick Haptic Power Threads Timers
   311     File Loadso CPUinfo Filesystem Dlopen Sensor)
   312 foreach(_SUB ${SDL_SUBSYSTEMS})
   313   string(TOUPPER ${_SUB} _OPT)
   314   if (NOT DEFINED SDL_${_OPT}_ENABLED_BY_DEFAULT)
   315     set(SDL_${_OPT}_ENABLED_BY_DEFAULT ON)
   316   endif()
   317   option(SDL_${_OPT} "Enable the ${_SUB} subsystem" ${SDL_${_OPT}_ENABLED_BY_DEFAULT})
   318 endforeach()
   319 
   320 option_string(ASSERTIONS "Enable internal sanity checks (auto/disabled/release/enabled/paranoid)" "auto")
   321 #set_option(DEPENDENCY_TRACKING "Use gcc -MMD -MT dependency tracking" ON)
   322 set_option(LIBC                "Use the system C library" ${OPT_DEF_LIBC})
   323 set_option(GCC_ATOMICS         "Use gcc builtin atomics" ${OPT_DEF_GCC_ATOMICS})
   324 set_option(ASSEMBLY            "Enable assembly routines" ${OPT_DEF_ASM})
   325 set_option(SSEMATH             "Allow GCC to use SSE floating point math" ${OPT_DEF_SSEMATH})
   326 set_option(MMX                 "Use MMX assembly routines" ${OPT_DEF_ASM})
   327 set_option(3DNOW               "Use 3Dnow! MMX assembly routines" ${OPT_DEF_ASM})
   328 set_option(SSE                 "Use SSE assembly routines" ${OPT_DEF_ASM})
   329 set_option(SSE2                "Use SSE2 assembly routines" ${OPT_DEF_SSEMATH})
   330 set_option(SSE3                "Use SSE3 assembly routines" ${OPT_DEF_SSEMATH})
   331 set_option(ALTIVEC             "Use Altivec assembly routines" ${OPT_DEF_ASM})
   332 set_option(ARMSIMD             "use SIMD assembly blitters on ARM" ON)
   333 set_option(ARMNEON             "use NEON assembly blitters on ARM" ON)
   334 set_option(DISKAUDIO           "Support the disk writer audio driver" ON)
   335 set_option(DUMMYAUDIO          "Support the dummy audio driver" ON)
   336 set_option(VIDEO_DIRECTFB      "Use DirectFB video driver" OFF)
   337 dep_option(DIRECTFB_SHARED     "Dynamically load directfb support" ON "VIDEO_DIRECTFB" OFF)
   338 set_option(VIDEO_DUMMY         "Use dummy video driver" ON)
   339 set_option(VIDEO_OPENGL        "Include OpenGL support" ON)
   340 set_option(VIDEO_OPENGLES      "Include OpenGL ES support" ON)
   341 set_option(PTHREADS            "Use POSIX threads for multi-threading" ${SDL_PTHREADS_ENABLED_BY_DEFAULT})
   342 dep_option(PTHREADS_SEM        "Use pthread semaphores" ON "PTHREADS" OFF)
   343 set_option(SDL_DLOPEN          "Use dlopen for shared object loading" ${SDL_DLOPEN_ENABLED_BY_DEFAULT})
   344 dep_option(OSS                 "Support the OSS audio API" ON "UNIX_SYS OR RISCOS" OFF)
   345 set_option(ALSA                "Support the ALSA audio API" ${UNIX_SYS})
   346 dep_option(ALSA_SHARED         "Dynamically load ALSA audio support" ON "ALSA" OFF)
   347 set_option(JACK                "Support the JACK audio API" ${UNIX_SYS})
   348 dep_option(JACK_SHARED         "Dynamically load JACK audio support" ON "JACK" OFF)
   349 set_option(ESD                 "Support the Enlightened Sound Daemon" ${UNIX_SYS})
   350 dep_option(ESD_SHARED          "Dynamically load ESD audio support" ON "ESD" OFF)
   351 set_option(PULSEAUDIO          "Use PulseAudio" ${UNIX_SYS})
   352 dep_option(PULSEAUDIO_SHARED   "Dynamically load PulseAudio support" ON "PULSEAUDIO" OFF)
   353 set_option(ARTS                "Support the Analog Real Time Synthesizer" ${UNIX_SYS})
   354 dep_option(ARTS_SHARED         "Dynamically load aRts audio support" ON "ARTS" OFF)
   355 set_option(NAS                 "Support the NAS audio API" ${UNIX_SYS})
   356 set_option(NAS_SHARED          "Dynamically load NAS audio API" ${UNIX_SYS})
   357 set_option(SNDIO               "Support the sndio audio API" ${UNIX_SYS})
   358 set_option(FUSIONSOUND         "Use FusionSound audio driver" OFF)
   359 dep_option(FUSIONSOUND_SHARED  "Dynamically load fusionsound audio support" ON "FUSIONSOUND" OFF)
   360 set_option(LIBSAMPLERATE       "Use libsamplerate for audio rate conversion" ${UNIX_SYS})
   361 dep_option(LIBSAMPLERATE_SHARED "Dynamically load libsamplerate" ON "LIBSAMPLERATE" OFF)
   362 set_option(RPATH               "Use an rpath when linking SDL" ${UNIX_SYS})
   363 set_option(CLOCK_GETTIME       "Use clock_gettime() instead of gettimeofday()" OFF)
   364 set_option(INPUT_TSLIB         "Use the Touchscreen library for input" ${UNIX_SYS})
   365 set_option(VIDEO_X11           "Use X11 video driver" ${UNIX_SYS})
   366 set_option(VIDEO_WAYLAND       "Use Wayland video driver" ${UNIX_SYS})
   367 dep_option(WAYLAND_SHARED      "Dynamically load Wayland support" ON "VIDEO_WAYLAND" OFF)
   368 dep_option(VIDEO_WAYLAND_QT_TOUCH  "QtWayland server support for Wayland video driver" ON "VIDEO_WAYLAND" OFF)
   369 set_option(VIDEO_RPI           "Use Raspberry Pi video driver" ${UNIX_SYS})
   370 dep_option(X11_SHARED          "Dynamically load X11 support" ON "VIDEO_X11" OFF)
   371 set(SDL_X11_OPTIONS Xcursor Xinerama XInput Xrandr Xscrnsaver XShape Xvm)
   372 foreach(_SUB ${SDL_X11_OPTIONS})
   373   string(TOUPPER "VIDEO_X11_${_SUB}" _OPT)
   374   dep_option(${_OPT}           "Enable ${_SUB} support" ON "VIDEO_X11" OFF)
   375 endforeach()
   376 set_option(VIDEO_COCOA         "Use Cocoa video driver" ${APPLE})
   377 set_option(DIRECTX             "Use DirectX for Windows audio/video" ${WINDOWS})
   378 set_option(WASAPI              "Use the Windows WASAPI audio driver" ${WINDOWS})
   379 set_option(RENDER_D3D          "Enable the Direct3D render driver" ${WINDOWS})
   380 set_option(RENDER_METAL        "Enable the Metal render driver" ${APPLE})
   381 set_option(VIDEO_VIVANTE       "Use Vivante EGL video driver" ${UNIX_SYS})
   382 dep_option(VIDEO_VULKAN        "Enable Vulkan support" ON "ANDROID OR APPLE OR LINUX OR WINDOWS" OFF)
   383 set_option(VIDEO_METAL         "Enable Metal support" ${APPLE})
   384 set_option(VIDEO_KMSDRM        "Use KMS DRM video driver" ${UNIX_SYS})
   385 dep_option(KMSDRM_SHARED       "Dynamically load KMS DRM support" ON "VIDEO_KMSDRM" OFF)
   386 set_option(VIDEO_OFFSCREEN     "Use offscreen video driver" OFF)
   387 option_string(BACKGROUNDING_SIGNAL "number to use for magic backgrounding signal or 'OFF'" "OFF")
   388 option_string(FOREGROUNDING_SIGNAL "number to use for magic foregrounding signal or 'OFF'" "OFF")
   389 set_option(HIDAPI              "Use HIDAPI for low level joystick drivers" ${OPT_DEF_HIDAPI})
   390 set_option(JOYSTICK_VIRTUAL    "Enable the virtual-joystick driver" ON)
   391 
   392 set(SDL_SHARED ${SDL_SHARED_ENABLED_BY_DEFAULT} CACHE BOOL "Build a shared version of the library")
   393 set(SDL_STATIC ${SDL_STATIC_ENABLED_BY_DEFAULT} CACHE BOOL "Build a static version of the library")
   394 
   395 dep_option(SDL_STATIC_PIC      "Static version of the library should be built with Position Independent Code" OFF "SDL_STATIC" OFF)
   396 set_option(SDL_TEST            "Build the test directory" OFF)
   397 
   398 # General source files
   399 file(GLOB SOURCE_FILES
   400   ${SDL2_SOURCE_DIR}/src/*.c
   401   ${SDL2_SOURCE_DIR}/src/atomic/*.c
   402   ${SDL2_SOURCE_DIR}/src/audio/*.c
   403   ${SDL2_SOURCE_DIR}/src/cpuinfo/*.c
   404   ${SDL2_SOURCE_DIR}/src/dynapi/*.c
   405   ${SDL2_SOURCE_DIR}/src/events/*.c
   406   ${SDL2_SOURCE_DIR}/src/file/*.c
   407   ${SDL2_SOURCE_DIR}/src/libm/*.c
   408   ${SDL2_SOURCE_DIR}/src/render/*.c
   409   ${SDL2_SOURCE_DIR}/src/render/*/*.c
   410   ${SDL2_SOURCE_DIR}/src/stdlib/*.c
   411   ${SDL2_SOURCE_DIR}/src/thread/*.c
   412   ${SDL2_SOURCE_DIR}/src/timer/*.c
   413   ${SDL2_SOURCE_DIR}/src/video/*.c
   414   ${SDL2_SOURCE_DIR}/src/video/yuv2rgb/*.c)
   415 
   416 
   417 if(ASSERTIONS STREQUAL "auto")
   418   # Do nada - use optimization settings to determine the assertion level
   419 elseif(ASSERTIONS STREQUAL "disabled")
   420   set(SDL_DEFAULT_ASSERT_LEVEL 0)
   421 elseif(ASSERTIONS STREQUAL "release")
   422   set(SDL_DEFAULT_ASSERT_LEVEL 1)
   423 elseif(ASSERTIONS STREQUAL "enabled")
   424   set(SDL_DEFAULT_ASSERT_LEVEL 2)
   425 elseif(ASSERTIONS STREQUAL "paranoid")
   426   set(SDL_DEFAULT_ASSERT_LEVEL 3)
   427 else()
   428   message_error("unknown assertion level")
   429 endif()
   430 set(HAVE_ASSERTIONS ${ASSERTIONS})
   431 
   432 if(NOT BACKGROUNDING_SIGNAL STREQUAL "OFF")
   433   add_definitions("-DSDL_BACKGROUNDING_SIGNAL=${BACKGROUNDING_SIGNAL}")
   434 endif()
   435 
   436 if(NOT FOREGROUNDING_SIGNAL STREQUAL "OFF")
   437   add_definitions("-DSDL_FOREGROUNDING_SIGNAL=${FOREGROUNDING_SIGNAL}")
   438 endif()
   439 
   440 # Compiler option evaluation
   441 if(USE_GCC OR USE_CLANG)
   442   # Check for -Wall first, so later things can override pieces of it.
   443   check_c_compiler_flag(-Wall HAVE_GCC_WALL)
   444   if(HAVE_GCC_WALL)
   445     list(APPEND EXTRA_CFLAGS "-Wall")
   446     if(HAIKU)
   447       set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-multichar")
   448     endif()
   449   endif()
   450 
   451   check_c_compiler_flag(-fno-strict-aliasing HAVE_GCC_NO_STRICT_ALIASING)
   452   if(HAVE_GCC_NO_STRICT_ALIASING)
   453     list(APPEND EXTRA_CFLAGS "-fno-strict-aliasing")
   454   endif()
   455 
   456   check_c_compiler_flag(-Wdeclaration-after-statement HAVE_GCC_WDECLARATION_AFTER_STATEMENT)
   457   if(HAVE_GCC_WDECLARATION_AFTER_STATEMENT)
   458     check_c_compiler_flag(-Werror=declaration-after-statement HAVE_GCC_WERROR_DECLARATION_AFTER_STATEMENT)
   459     if(HAVE_GCC_WERROR_DECLARATION_AFTER_STATEMENT)
   460       list(APPEND EXTRA_CFLAGS "-Werror=declaration-after-statement")
   461     endif()
   462     list(APPEND EXTRA_CFLAGS "-Wdeclaration-after-statement")
   463   endif()
   464 
   465   if(DEPENDENCY_TRACKING)
   466     check_c_source_compiles("
   467         #if !defined(__GNUC__) || __GNUC__ < 3
   468         #error Dependency tracking requires GCC 3.0 or newer
   469         #endif
   470         int main(int argc, char **argv) { }" HAVE_DEPENDENCY_TRACKING)
   471   endif()
   472 
   473   if(GCC_ATOMICS)
   474     check_c_source_compiles("int main(int argc, char **argv) {
   475         int a;
   476         void *x, *y, *z;
   477         __sync_lock_test_and_set(&a, 4);
   478         __sync_lock_test_and_set(&x, y);
   479         __sync_fetch_and_add(&a, 1);
   480         __sync_bool_compare_and_swap(&a, 5, 10);
   481         __sync_bool_compare_and_swap(&x, y, z); }" HAVE_GCC_ATOMICS)
   482     if(NOT HAVE_GCC_ATOMICS)
   483       check_c_source_compiles("int main(int argc, char **argv) {
   484           int a;
   485           __sync_lock_test_and_set(&a, 1);
   486           __sync_lock_release(&a); }" HAVE_GCC_SYNC_LOCK_TEST_AND_SET)
   487     endif()
   488   endif()
   489 
   490   set(CMAKE_REQUIRED_FLAGS "-mpreferred-stack-boundary=2")
   491   check_c_source_compiles("int x = 0; int main(int argc, char **argv) {}"
   492     HAVE_GCC_PREFERRED_STACK_BOUNDARY)
   493   set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS})
   494 
   495   set(CMAKE_REQUIRED_FLAGS "-fvisibility=hidden -Werror")
   496   check_c_source_compiles("
   497       #if !defined(__GNUC__) || __GNUC__ < 4
   498       #error SDL only uses visibility attributes in GCC 4 or newer
   499       #endif
   500       int main(int argc, char **argv) {}" HAVE_GCC_FVISIBILITY)
   501   if(HAVE_GCC_FVISIBILITY)
   502     list(APPEND EXTRA_CFLAGS "-fvisibility=hidden")
   503   endif()
   504   set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS})
   505 
   506   check_c_compiler_flag(-Wshadow HAVE_GCC_WSHADOW)
   507   if(HAVE_GCC_WSHADOW)
   508     list(APPEND EXTRA_CFLAGS "-Wshadow")
   509   endif()
   510 
   511   if(APPLE)
   512     list(APPEND EXTRA_LDFLAGS "-Wl,-undefined,error")
   513     list(APPEND EXTRA_LDFLAGS "-Wl,-compatibility_version,${DYLIB_COMPATIBILITY_VERSION}")
   514     list(APPEND EXTRA_LDFLAGS "-Wl,-current_version,${DYLIB_CURRENT_VERSION}")
   515   else()
   516     set(CMAKE_REQUIRED_FLAGS "-Wl,--no-undefined")
   517     check_c_compiler_flag("" HAVE_NO_UNDEFINED)
   518     set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS})
   519     if(HAVE_NO_UNDEFINED)
   520       list(APPEND EXTRA_LDFLAGS "-Wl,--no-undefined")
   521     endif()
   522   endif()
   523 endif()
   524 
   525 if(ASSEMBLY)
   526   if(USE_GCC OR USE_CLANG)
   527     set(SDL_ASSEMBLY_ROUTINES 1)
   528     # TODO: Those all seem to be quite GCC specific - needs to be
   529     # reworked for better compiler support
   530     set(HAVE_ASSEMBLY TRUE)
   531     if(MMX)
   532       set(CMAKE_REQUIRED_FLAGS "-mmmx")
   533       check_c_source_compiles("
   534           #ifdef __MINGW32__
   535           #include <_mingw.h>
   536           #ifdef __MINGW64_VERSION_MAJOR
   537           #include <intrin.h>
   538           #else
   539           #include <mmintrin.h>
   540           #endif
   541           #else
   542           #include <mmintrin.h>
   543           #endif
   544           #ifndef __MMX__
   545           #error Assembler CPP flag not enabled
   546           #endif
   547           int main(int argc, char **argv) { }" HAVE_MMX)
   548       if(HAVE_MMX)
   549         list(APPEND EXTRA_CFLAGS "-mmmx")
   550       endif()
   551       set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS})
   552     endif()
   553 
   554     if(3DNOW)
   555       set(CMAKE_REQUIRED_FLAGS "-m3dnow")
   556       check_c_source_compiles("
   557           #include <mm3dnow.h>
   558           #ifndef __3dNOW__
   559           #error Assembler CPP flag not enabled
   560           #endif
   561           int main(int argc, char **argv) {
   562             void *p = 0;
   563             _m_prefetch(p);
   564           }" HAVE_3DNOW)
   565       if(HAVE_3DNOW)
   566         list(APPEND EXTRA_CFLAGS "-m3dnow")
   567       endif()
   568       set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS})
   569     endif()
   570 
   571     if(SSE)
   572       set(CMAKE_REQUIRED_FLAGS "-msse")
   573       check_c_source_compiles("
   574           #ifdef __MINGW32__
   575           #include <_mingw.h>
   576           #ifdef __MINGW64_VERSION_MAJOR
   577           #include <intrin.h>
   578           #else
   579           #include <xmmintrin.h>
   580           #endif
   581           #else
   582           #include <xmmintrin.h>
   583           #endif
   584           #ifndef __SSE__
   585           #error Assembler CPP flag not enabled
   586           #endif
   587           int main(int argc, char **argv) { }" HAVE_SSE)
   588       if(HAVE_SSE)
   589         list(APPEND EXTRA_CFLAGS "-msse")
   590       endif()
   591       set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS})
   592     endif()
   593 
   594     if(SSE2)
   595       set(CMAKE_REQUIRED_FLAGS "-msse2")
   596       check_c_source_compiles("
   597           #ifdef __MINGW32__
   598           #include <_mingw.h>
   599           #ifdef __MINGW64_VERSION_MAJOR
   600           #include <intrin.h>
   601           #else
   602           #include <emmintrin.h>
   603           #endif
   604           #else
   605           #include <emmintrin.h>
   606           #endif
   607           #ifndef __SSE2__
   608           #error Assembler CPP flag not enabled
   609           #endif
   610           int main(int argc, char **argv) { }" HAVE_SSE2)
   611       if(HAVE_SSE2)
   612         list(APPEND EXTRA_CFLAGS "-msse2")
   613       endif()
   614       set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS})
   615     endif()
   616 
   617     if(SSE3)
   618       set(CMAKE_REQUIRED_FLAGS "-msse3")
   619       check_c_source_compiles("
   620           #ifdef __MINGW32__
   621           #include <_mingw.h>
   622           #ifdef __MINGW64_VERSION_MAJOR
   623           #include <intrin.h>
   624           #else
   625           #include <pmmintrin.h>
   626           #endif
   627           #else
   628           #include <pmmintrin.h>
   629           #endif
   630           #ifndef __SSE3__
   631           #error Assembler CPP flag not enabled
   632           #endif
   633           int main(int argc, char **argv) { }" HAVE_SSE3)
   634       if(HAVE_SSE3)
   635         list(APPEND EXTRA_CFLAGS "-msse3")
   636       endif()
   637       set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS})
   638     endif()
   639 
   640     if(NOT SSEMATH)
   641       if(SSE OR SSE2 OR SSE3)
   642         if(USE_GCC)
   643           check_c_compiler_flag(-mfpmath=387 HAVE_FP_387)
   644           if(HAVE_FP_387)
   645             list(APPEND EXTRA_CFLAGS "-mfpmath=387")
   646           endif()
   647         endif()
   648         set(HAVE_SSEMATH TRUE)
   649       endif()
   650     endif()
   651 
   652     check_include_file("immintrin.h" HAVE_IMMINTRIN_H)
   653 
   654     if(ALTIVEC)
   655       set(CMAKE_REQUIRED_FLAGS "-maltivec")
   656       check_c_source_compiles("
   657           #include <altivec.h>
   658           vector unsigned int vzero() {
   659               return vec_splat_u32(0);
   660           }
   661           int main(int argc, char **argv) { }" HAVE_ALTIVEC_H_HDR)
   662       check_c_source_compiles("
   663           vector unsigned int vzero() {
   664               return vec_splat_u32(0);
   665           }
   666           int main(int argc, char **argv) { }" HAVE_ALTIVEC)
   667       set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS})
   668       if(HAVE_ALTIVEC OR HAVE_ALTIVEC_H_HDR)
   669         set(HAVE_ALTIVEC TRUE) # if only HAVE_ALTIVEC_H_HDR is set
   670         list(APPEND EXTRA_CFLAGS "-maltivec")
   671         set(SDL_ALTIVEC_BLITTERS 1)
   672         if(HAVE_ALTIVEC_H_HDR)
   673           set(HAVE_ALTIVEC_H 1)
   674         endif()
   675       endif()
   676     endif()
   677 
   678     if(ARMSIMD)
   679       set(ORIG_CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}")
   680       set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -x assembler-with-cpp")
   681       check_c_source_compiles("
   682         .text
   683         .arch armv6
   684         .object_arch armv4
   685         .arm
   686         .altmacro
   687         #ifndef __ARM_EABI__
   688         #error EABI is required (to be sure that calling conventions are compatible)
   689         #endif
   690         pld [r0]
   691         uqadd8 r0, r0, r0
   692       " ARMSIMD_FOUND)
   693       set(CMAKE_REQUIRED_FLAGS "${ORIG_CMAKE_REQUIRED_FLAGS}")
   694 
   695       if(ARMSIMD_FOUND)
   696         set(HAVE_ARMSIMD TRUE)
   697         set(SDL_ARM_SIMD_BLITTERS 1)
   698         file(GLOB ARMSIMD_SOURCES ${SDL2_SOURCE_DIR}/src/video/arm/pixman-arm-simd*.S)
   699         set(SOURCE_FILES ${SOURCE_FILES} ${ARMSIMD_SOURCES})
   700         set(WARN_ABOUT_ARM_SIMD_ASM_MIT TRUE)
   701       endif()
   702     endif()
   703 
   704     if(ARMNEON)
   705       set(ORIG_CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}")
   706       set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -x assembler-with-cpp")
   707       check_c_source_compiles("
   708         .text
   709         .fpu neon
   710         .arch armv7a
   711         .object_arch armv4
   712         .eabi_attribute 10, 0
   713         .arm
   714         .altmacro
   715         #ifndef __ARM_EABI__
   716         #error EABI is required (to be sure that calling conventions are compatible)
   717         #endif
   718         pld [r0]
   719         vmovn.u16 d0, q0
   720       " ARMNEON_FOUND)
   721       set(CMAKE_REQUIRED_FLAGS "${ORIG_CMAKE_REQUIRED_FLAGS}")
   722 
   723       if(ARMNEON_FOUND)
   724         set(HAVE_ARMNEON TRUE)
   725         set(SDL_ARM_NEON_BLITTERS 1)
   726         file(GLOB ARMNEON_SOURCES ${SDL2_SOURCE_DIR}/src/video/arm/pixman-arm-neon*.S)
   727         set(SOURCE_FILES ${SOURCE_FILES} ${ARMNEON_SOURCES})
   728         set(WARN_ABOUT_ARM_NEON_ASM_MIT TRUE)
   729       endif()
   730     endif()
   731 
   732   elseif(MSVC_VERSION GREATER 1500)
   733     # TODO: SDL_cpuinfo.h needs to support the user's configuration wish
   734     # for MSVC - right now it is always activated
   735     if(NOT ARCH_64)
   736       set(HAVE_MMX TRUE)
   737       set(HAVE_3DNOW TRUE)
   738     endif()
   739     set(HAVE_SSE TRUE)
   740     set(HAVE_SSE2 TRUE)
   741     set(HAVE_SSE3 TRUE)
   742     set(SDL_ASSEMBLY_ROUTINES 1)
   743   endif()
   744 # TODO:
   745 #else()
   746 #  if(USE_GCC OR USE_CLANG)
   747 #    list(APPEND EXTRA_CFLAGS "-mno-sse" "-mno-sse2" "-mno-sse3" "-mno-mmx")
   748 #  endif()
   749 endif()
   750 
   751 # TODO: Can't deactivate on FreeBSD? w/o LIBC, SDL_stdinc.h can't define
   752 # anything.
   753 if(LIBC)
   754   if(WINDOWS AND NOT MINGW)
   755     set(HAVE_LIBC TRUE)
   756     foreach(_HEADER stdio.h string.h wchar.h ctype.h math.h limits.h)
   757       string(TOUPPER "HAVE_${_HEADER}" _UPPER)
   758       string(REPLACE "." "_" _HAVE_H ${_UPPER})
   759       set(${_HAVE_H} 1)
   760     endforeach()
   761     set(HAVE_SIGNAL_H 1)
   762     foreach(_FN
   763             malloc calloc realloc free qsort abs memset memcpy memmove memcmp
   764             wcslen wcslcpy wcslcat wcsdup wcsstr wcscmp wcsncmp
   765             strlen _strrev _strupr _strlwr strchr strrchr strstr itoa _ltoa
   766             _ultoa strtol strtoul strtoll strtod atoi atof strcmp strncmp
   767             _stricmp _strnicmp strtok_s sscanf
   768             acos acosf asin asinf atan atanf atan2 atan2f ceil ceilf
   769             copysign copysignf cos cosf exp expf fabs fabsf floor floorf fmod fmodf
   770             log logf log10 log10f pow powf scalbn scalbnf sin sinf sqrt sqrtf tan tanf)
   771       string(TOUPPER ${_FN} _UPPER)
   772       set(HAVE_${_UPPER} 1)
   773     endforeach()
   774     if(NOT CYGWIN AND NOT MINGW)
   775       set(HAVE_ALLOCA 1)
   776     endif()
   777     set(HAVE_M_PI 1)
   778     add_definitions(-D_USE_MATH_DEFINES) # needed for M_PI
   779     set(STDC_HEADERS 1)
   780   else()
   781     set(HAVE_LIBC TRUE)
   782     check_include_file(sys/types.h HAVE_SYS_TYPES_H)
   783     foreach(_HEADER
   784             stdio.h stdlib.h stddef.h stdarg.h malloc.h memory.h string.h limits.h
   785             strings.h wchar.h inttypes.h stdint.h ctype.h math.h iconv.h signal.h libunwind.h)
   786       string(TOUPPER "HAVE_${_HEADER}" _UPPER)
   787       string(REPLACE "." "_" _HAVE_H ${_UPPER})
   788       check_include_file("${_HEADER}" ${_HAVE_H})
   789     endforeach()
   790 
   791     check_include_files("dlfcn.h;stdint.h;stddef.h;inttypes.h;stdlib.h;strings.h;string.h;float.h" STDC_HEADERS)
   792     check_type_size("size_t" SIZEOF_SIZE_T)
   793     check_symbol_exists(M_PI math.h HAVE_M_PI)
   794     # TODO: refine the mprotect check
   795     check_c_source_compiles("#include <sys/types.h>
   796                              #include <sys/mman.h>
   797                              int main() { }" HAVE_MPROTECT)
   798     foreach(_FN
   799             strtod malloc calloc realloc free getenv setenv putenv unsetenv
   800             qsort abs bcopy memset memcpy memmove memcmp strlen strlcpy strlcat
   801             _strrev _strupr _strlwr strchr strrchr strstr strtok_r itoa _ltoa
   802             _uitoa _ultoa strtol strtoul _i64toa _ui64toa strtoll strtoull
   803             atoi atof strcmp strncmp _stricmp strcasecmp _strnicmp strncasecmp
   804             wcscmp wcsdup wcslcat wcslcpy wcslen wcsncmp wcsstr
   805             sscanf vsscanf vsnprintf fopen64 fseeko fseeko64 sigaction setjmp
   806             nanosleep sysconf sysctlbyname getauxval poll _Exit
   807             )
   808       string(TOUPPER ${_FN} _UPPER)
   809       set(_HAVEVAR "HAVE_${_UPPER}")
   810       check_function_exists("${_FN}" ${_HAVEVAR})
   811     endforeach()
   812 
   813     check_library_exists(m pow "" HAVE_LIBM)
   814     if(HAVE_LIBM)
   815       set(CMAKE_REQUIRED_LIBRARIES m)
   816       foreach(_FN
   817               atan atan2 atanf atan2f ceil ceilf copysign copysignf cos cosf
   818               exp expf fabs fabsf floor floorf fmod fmodf log logf log10 log10f
   819               pow powf scalbn scalbnf sin sinf sqrt sqrtf tan tanf acos acosf
   820               asin asinf)
   821         string(TOUPPER ${_FN} _UPPER)
   822         set(_HAVEVAR "HAVE_${_UPPER}")
   823         check_function_exists("${_FN}" ${_HAVEVAR})
   824       endforeach()
   825       set(CMAKE_REQUIRED_LIBRARIES)
   826       list(APPEND EXTRA_LIBS m)
   827     endif()
   828 
   829     check_library_exists(iconv iconv_open "" HAVE_LIBICONV)
   830     if(HAVE_LIBICONV)
   831       list(APPEND EXTRA_LIBS iconv)
   832       set(HAVE_ICONV 1)
   833     endif()
   834 
   835     if(NOT APPLE)
   836       check_include_file(alloca.h HAVE_ALLOCA_H)
   837       check_function_exists(alloca HAVE_ALLOCA)
   838     else()
   839       set(HAVE_ALLOCA_H 1)
   840       set(HAVE_ALLOCA 1)
   841     endif()
   842 
   843     check_struct_has_member("struct sigaction" "sa_sigaction" "signal.h" HAVE_SA_SIGACTION)
   844   endif()
   845 else()
   846   if(WINDOWS)
   847     set(HAVE_STDARG_H 1)
   848     set(HAVE_STDDEF_H 1)
   849   endif()
   850 endif()
   851 
   852 
   853 # Enable/disable various subsystems of the SDL library
   854 foreach(_SUB ${SDL_SUBSYSTEMS})
   855   string(TOUPPER ${_SUB} _OPT)
   856   if(NOT SDL_${_OPT})
   857     set(SDL_${_OPT}_DISABLED 1)
   858   endif()
   859 endforeach()
   860 if(SDL_JOYSTICK)
   861   file(GLOB JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/*.c)
   862   set(SOURCE_FILES ${SOURCE_FILES} ${JOYSTICK_SOURCES})
   863 endif()
   864 if(SDL_HAPTIC)
   865   if(NOT SDL_JOYSTICK)
   866     # Haptic requires some private functions from the joystick subsystem.
   867     message_error("SDL_HAPTIC requires SDL_JOYSTICK, which is not enabled")
   868   endif()
   869   file(GLOB HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/*.c)
   870   set(SOURCE_FILES ${SOURCE_FILES} ${HAPTIC_SOURCES})
   871 endif()
   872 if(SDL_SENSOR)
   873   file(GLOB SENSOR_SOURCES ${SDL2_SOURCE_DIR}/src/sensor/*.c)
   874   set(SOURCE_FILES ${SOURCE_FILES} ${SENSOR_SOURCES})
   875 endif()
   876 if(SDL_POWER)
   877   file(GLOB POWER_SOURCES ${SDL2_SOURCE_DIR}/src/power/*.c)
   878   set(SOURCE_FILES ${SOURCE_FILES} ${POWER_SOURCES})
   879 endif()
   880 # TODO: in configure.ac, the test for LOADSO and SDL_DLOPEN is a bit weird:
   881 # if LOADSO is not wanted, SDL_LOADSO_DISABLED is set
   882 # If however on Unix or APPLE dlopen() is detected via CheckDLOPEN(),
   883 # SDL_LOADSO_DISABLED will not be set, regardless of the LOADSO settings
   884 
   885 # General SDL subsystem options, valid for all platforms
   886 if(SDL_AUDIO)
   887   # CheckDummyAudio/CheckDiskAudio - valid for all platforms
   888   if(DUMMYAUDIO)
   889     set(SDL_AUDIO_DRIVER_DUMMY 1)
   890     file(GLOB DUMMYAUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/dummy/*.c)
   891     set(SOURCE_FILES ${SOURCE_FILES} ${DUMMYAUDIO_SOURCES})
   892     set(HAVE_DUMMYAUDIO TRUE)
   893   endif()
   894   if(DISKAUDIO)
   895     set(SDL_AUDIO_DRIVER_DISK 1)
   896     file(GLOB DISKAUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/disk/*.c)
   897     set(SOURCE_FILES ${SOURCE_FILES} ${DISKAUDIO_SOURCES})
   898     set(HAVE_DISKAUDIO TRUE)
   899   endif()
   900 endif()
   901 
   902 if(SDL_DLOPEN)
   903   # Relevant for Unix/Darwin only
   904   if(UNIX OR APPLE)
   905     CheckDLOPEN()
   906   endif()
   907 endif()
   908 
   909 if(SDL_JOYSTICK)
   910   if(JOYSTICK_VIRTUAL)
   911     set(SDL_JOYSTICK_VIRTUAL 1)
   912     file(GLOB JOYSTICK_VIRTUAL_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/virtual/*.c)
   913     set(SOURCE_FILES ${SOURCE_FILES} ${JOYSTICK_VIRTUAL_SOURCES})
   914   endif()
   915 endif()
   916 
   917 if(SDL_VIDEO)
   918   if(VIDEO_DUMMY)
   919     set(SDL_VIDEO_DRIVER_DUMMY 1)
   920     file(GLOB VIDEO_DUMMY_SOURCES ${SDL2_SOURCE_DIR}/src/video/dummy/*.c)
   921     set(SOURCE_FILES ${SOURCE_FILES} ${VIDEO_DUMMY_SOURCES})
   922     set(HAVE_VIDEO_DUMMY TRUE)
   923     set(HAVE_SDL_VIDEO TRUE)
   924   endif()
   925   if(VIDEO_OFFSCREEN)
   926     set(SDL_VIDEO_DRIVER_OFFSCREEN 1)
   927     file(GLOB VIDEO_OFFSCREEN_SOURCES ${SDL2_SOURCE_DIR}/src/video/offscreen/*.c)
   928     set(SOURCE_FILES ${SOURCE_FILES} ${VIDEO_OFFSCREEN_SOURCES})
   929     set(HAVE_VIDEO_OFFSCREEN TRUE)
   930     set(HAVE_SDL_VIDEO TRUE)
   931   endif()
   932 endif()
   933 
   934 # Platform-specific options and settings
   935 if(ANDROID)
   936   file(GLOB ANDROID_CORE_SOURCES ${SDL2_SOURCE_DIR}/src/core/android/*.c)
   937   set(SOURCE_FILES ${SOURCE_FILES} ${ANDROID_CORE_SOURCES})
   938 
   939   # SDL_spinlock.c Needs to be compiled in ARM mode.
   940   # There seems to be no better way currently to set the ARM mode.
   941   # see: https://issuetracker.google.com/issues/62264618
   942   # Another option would be to set ARM mode to all compiled files
   943   check_c_compiler_flag(-marm HAVE_ARM_MODE)
   944   if(HAVE_ARM_MODE)
   945     set_source_files_properties(${SDL2_SOURCE_DIR}/src/atomic/SDL_spinlock.c PROPERTIES COMPILE_FLAGS -marm)
   946   endif()
   947 
   948   file(GLOB ANDROID_MAIN_SOURCES ${SDL2_SOURCE_DIR}/src/main/android/*.c)
   949   set(SDLMAIN_SOURCES ${SDLMAIN_SOURCES} ${ANDROID_MAIN_SOURCES})
   950 
   951   if(SDL_AUDIO)
   952     set(SDL_AUDIO_DRIVER_ANDROID 1)
   953     file(GLOB ANDROID_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/android/*.c)
   954     set(SOURCE_FILES ${SOURCE_FILES} ${ANDROID_AUDIO_SOURCES})
   955     set(HAVE_SDL_AUDIO TRUE)
   956   endif()
   957   if(SDL_FILESYSTEM)
   958     set(SDL_FILESYSTEM_ANDROID 1)
   959     file(GLOB ANDROID_FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/android/*.c)
   960     set(SOURCE_FILES ${SOURCE_FILES} ${ANDROID_FILESYSTEM_SOURCES})
   961     set(HAVE_SDL_FILESYSTEM TRUE)
   962   endif()
   963   if(SDL_HAPTIC)
   964     set(SDL_HAPTIC_ANDROID 1)
   965     file(GLOB ANDROID_HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/android/*.c)
   966     set(SOURCE_FILES ${SOURCE_FILES} ${ANDROID_HAPTIC_SOURCES})
   967     set(HAVE_SDL_HAPTIC TRUE)
   968   endif()
   969   if(SDL_JOYSTICK)
   970     CheckHIDAPI()
   971     set(SDL_JOYSTICK_ANDROID 1)
   972     file(GLOB ANDROID_JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/android/*.c ${SDL2_SOURCE_DIR}/src/joystick/steam/*.c)
   973     set(SOURCE_FILES ${SOURCE_FILES} ${ANDROID_JOYSTICK_SOURCES})
   974     set(HAVE_SDL_JOYSTICK TRUE)
   975   endif()
   976   if(SDL_LOADSO)
   977     set(SDL_LOADSO_DLOPEN 1)
   978     file(GLOB LOADSO_SOURCES ${SDL2_SOURCE_DIR}/src/loadso/dlopen/*.c)
   979     set(SOURCE_FILES ${SOURCE_FILES} ${LOADSO_SOURCES})
   980     set(HAVE_SDL_LOADSO TRUE)
   981   endif()
   982   if(SDL_POWER)
   983     set(SDL_POWER_ANDROID 1)
   984     file(GLOB ANDROID_POWER_SOURCES ${SDL2_SOURCE_DIR}/src/power/android/*.c)
   985     set(SOURCE_FILES ${SOURCE_FILES} ${ANDROID_POWER_SOURCES})
   986     set(HAVE_SDL_POWER TRUE)
   987   endif()
   988   if(SDL_TIMERS)
   989     set(SDL_TIMER_UNIX 1)
   990     file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/unix/*.c)
   991     set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES})
   992     set(HAVE_SDL_TIMERS TRUE)
   993   endif()
   994   if(SDL_SENSOR)
   995     set(SDL_SENSOR_ANDROID 1)
   996     set(HAVE_SDL_SENSORS TRUE)
   997     file(GLOB ANDROID_SENSOR_SOURCES ${SDL2_SOURCE_DIR}/src/sensor/android/*.c)
   998     set(SOURCE_FILES ${SOURCE_FILES} ${ANDROID_SENSOR_SOURCES})
   999   endif()
  1000   if(SDL_VIDEO)
  1001     set(SDL_VIDEO_DRIVER_ANDROID 1)
  1002     file(GLOB ANDROID_VIDEO_SOURCES ${SDL2_SOURCE_DIR}/src/video/android/*.c)
  1003     set(SOURCE_FILES ${SOURCE_FILES} ${ANDROID_VIDEO_SOURCES})
  1004     set(HAVE_SDL_VIDEO TRUE)
  1005 
  1006     # Core stuff
  1007     # find_library(ANDROID_DL_LIBRARY dl)
  1008     # FIXME failing dlopen https://github.com/android-ndk/ndk/issues/929
  1009     find_library(ANDROID_DL_LIBRARY NAMES libdl.so dl)
  1010     find_library(ANDROID_LOG_LIBRARY log)
  1011     find_library(ANDROID_LIBRARY_LIBRARY android)
  1012     list(APPEND EXTRA_LIBS ${ANDROID_DL_LIBRARY} ${ANDROID_LOG_LIBRARY} ${ANDROID_LIBRARY_LIBRARY})
  1013     add_definitions(-DGL_GLEXT_PROTOTYPES)
  1014 
  1015     if (HAVE_HIDAPI)
  1016         list(APPEND EXTRA_LIBS hidapi)
  1017     endif()
  1018 
  1019     #enable gles
  1020     if(VIDEO_OPENGLES)
  1021       set(SDL_VIDEO_OPENGL_EGL 1)
  1022       set(HAVE_VIDEO_OPENGLES TRUE)
  1023       set(SDL_VIDEO_OPENGL_ES 1)
  1024       set(SDL_VIDEO_RENDER_OGL_ES 1)
  1025       set(SDL_VIDEO_OPENGL_ES2 1)
  1026       set(SDL_VIDEO_RENDER_OGL_ES2 1)
  1027 
  1028       find_library(OpenGLES1_LIBRARY GLESv1_CM)
  1029       find_library(OpenGLES2_LIBRARY GLESv2)
  1030       list(APPEND EXTRA_LIBS ${OpenGLES1_LIBRARY} ${OpenGLES2_LIBRARY})
  1031     endif()
  1032 
  1033     CHECK_C_SOURCE_COMPILES("
  1034     #if defined(__ARM_ARCH) && __ARM_ARCH < 7
  1035     #error Vulkan doesn't work on this configuration
  1036     #endif
  1037     int main()
  1038     {
  1039         return 0;
  1040     }
  1041     " VULKAN_PASSED_ANDROID_CHECKS)
  1042     if(NOT VULKAN_PASSED_ANDROID_CHECKS)
  1043       set(VIDEO_VULKAN OFF)
  1044       message(STATUS "Vulkan doesn't work on this configuration")
  1045     endif()
  1046   endif()
  1047 
  1048   CheckPTHREAD()
  1049 
  1050 elseif(EMSCRIPTEN)
  1051   # Hide noisy warnings that intend to aid mostly during initial stages of porting a new
  1052   # project. Uncomment at will for verbose cross-compiling -I/../ path info.
  1053   add_definitions(-Wno-warn-absolute-paths)
  1054   if(SDL_AUDIO)
  1055     set(SDL_AUDIO_DRIVER_EMSCRIPTEN 1)
  1056     file(GLOB EM_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/emscripten/*.c)
  1057     set(SOURCE_FILES ${SOURCE_FILES} ${EM_AUDIO_SOURCES})
  1058     set(HAVE_SDL_AUDIO TRUE)
  1059   endif()
  1060   if(SDL_FILESYSTEM)
  1061     set(SDL_FILESYSTEM_EMSCRIPTEN 1)
  1062     file(GLOB EM_FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/emscripten/*.c)
  1063     set(SOURCE_FILES ${SOURCE_FILES} ${EM_FILESYSTEM_SOURCES})
  1064     set(HAVE_SDL_FILESYSTEM TRUE)
  1065   endif()
  1066   if(SDL_JOYSTICK)
  1067     set(SDL_JOYSTICK_EMSCRIPTEN 1)
  1068     file(GLOB EM_JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/emscripten/*.c)
  1069     set(SOURCE_FILES ${SOURCE_FILES} ${EM_JOYSTICK_SOURCES})
  1070     set(HAVE_SDL_JOYSTICK TRUE)
  1071   endif()
  1072   if(SDL_POWER)
  1073     set(SDL_POWER_EMSCRIPTEN 1)
  1074     file(GLOB EM_POWER_SOURCES ${SDL2_SOURCE_DIR}/src/power/emscripten/*.c)
  1075     set(SOURCE_FILES ${SOURCE_FILES} ${EM_POWER_SOURCES})
  1076     set(HAVE_SDL_POWER TRUE)
  1077   endif()
  1078   if(SDL_TIMERS)
  1079     set(SDL_TIMER_UNIX 1)
  1080     file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/unix/*.c)
  1081     set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES})
  1082     set(HAVE_SDL_TIMERS TRUE)
  1083 
  1084     if(CLOCK_GETTIME)
  1085       set(HAVE_CLOCK_GETTIME 1)
  1086     endif()
  1087   endif()
  1088   if(SDL_VIDEO)
  1089     set(SDL_VIDEO_DRIVER_EMSCRIPTEN 1)
  1090     file(GLOB EM_VIDEO_SOURCES ${SDL2_SOURCE_DIR}/src/video/emscripten/*.c)
  1091     set(SOURCE_FILES ${SOURCE_FILES} ${EM_VIDEO_SOURCES})
  1092     set(HAVE_SDL_VIDEO TRUE)
  1093 
  1094     #enable gles
  1095     if(VIDEO_OPENGLES)
  1096       set(SDL_VIDEO_OPENGL_EGL 1)
  1097       set(HAVE_VIDEO_OPENGLES TRUE)
  1098       set(SDL_VIDEO_OPENGL_ES2 1)
  1099       set(SDL_VIDEO_RENDER_OGL_ES2 1)
  1100     endif()
  1101   endif()
  1102 
  1103 elseif(UNIX AND NOT APPLE AND NOT ANDROID AND NOT RISCOS)
  1104   if(SDL_AUDIO)
  1105     if(SYSV5 OR SOLARIS OR HPUX)
  1106         set(SDL_AUDIO_DRIVER_SUNAUDIO 1)
  1107         file(GLOB SUN_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/sun/*.c)
  1108         set(SOURCE_FILES ${SOURCE_FILES} ${SUN_AUDIO_SOURCES})
  1109         set(HAVE_SDL_AUDIO TRUE)
  1110     elseif(NETBSD)
  1111         set(SDL_AUDIO_DRIVER_NETBSD 1)
  1112         file(GLOB NETBSD_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/netbsd/*.c)
  1113         set(SOURCE_FILES ${SOURCE_FILES} ${NETBSD_AUDIO_SOURCES})
  1114         set(HAVE_SDL_AUDIO TRUE)
  1115     elseif(AIX)
  1116         set(SDL_AUDIO_DRIVER_PAUDIO 1)
  1117         file(GLOB AIX_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/paudio/*.c)
  1118         set(SOURCE_FILES ${SOURCE_FILES} ${AIX_AUDIO_SOURCES})
  1119         set(HAVE_SDL_AUDIO TRUE)
  1120     endif()
  1121     CheckOSS()
  1122     CheckALSA()
  1123     CheckJACK()
  1124     CheckPulseAudio()
  1125     CheckESD()
  1126     CheckARTS()
  1127     CheckNAS()
  1128     CheckSNDIO()
  1129     CheckFusionSound()
  1130     CheckLibSampleRate()
  1131   endif()
  1132 
  1133   if(SDL_VIDEO)
  1134     # Need to check for Raspberry PI first and add platform specific compiler flags, otherwise the test for GLES fails!
  1135     CheckRPI()
  1136     CheckX11()
  1137     CheckDirectFB()
  1138     CheckOpenGLX11()
  1139     CheckOpenGLESX11()
  1140     CheckWayland()
  1141     CheckVivante()
  1142     CheckKMSDRM()
  1143   endif()
  1144 
  1145   if(UNIX)
  1146     file(GLOB CORE_UNIX_SOURCES ${SDL2_SOURCE_DIR}/src/core/unix/*.c)
  1147     set(SOURCE_FILES ${SOURCE_FILES} ${CORE_UNIX_SOURCES})
  1148   endif()
  1149 
  1150   if(LINUX)
  1151     check_c_source_compiles("
  1152         #include <linux/input.h>
  1153         #ifndef EVIOCGNAME
  1154         #error EVIOCGNAME() ioctl not available
  1155         #endif
  1156         int main(int argc, char** argv) {}" HAVE_INPUT_EVENTS)
  1157 
  1158     check_c_source_compiles("
  1159         #include <linux/kd.h>
  1160         #include <linux/keyboard.h>
  1161 
  1162         int main(int argc, char **argv)
  1163         {
  1164             struct kbentry kbe;
  1165             kbe.kb_table = KG_CTRL;
  1166             ioctl(0, KDGKBENT, &kbe);
  1167         }" HAVE_INPUT_KD)
  1168 
  1169     file(GLOB CORE_LINUX_SOURCES ${SDL2_SOURCE_DIR}/src/core/linux/*.c)
  1170     set(SOURCE_FILES ${SOURCE_FILES} ${CORE_LINUX_SOURCES})
  1171 
  1172     if(HAVE_INPUT_EVENTS)
  1173       set(SDL_INPUT_LINUXEV 1)
  1174     endif()
  1175 
  1176     if(SDL_HAPTIC AND HAVE_INPUT_EVENTS)
  1177       set(SDL_HAPTIC_LINUX 1)
  1178       file(GLOB HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/linux/*.c)
  1179       set(SOURCE_FILES ${SOURCE_FILES} ${HAPTIC_SOURCES})
  1180       set(HAVE_SDL_HAPTIC TRUE)
  1181     endif()
  1182 
  1183     if(HAVE_INPUT_KD)
  1184       set(SDL_INPUT_LINUXKD 1)
  1185     endif()
  1186 
  1187     check_include_file("libudev.h" HAVE_LIBUDEV_H)
  1188 
  1189     if(PKG_CONFIG_FOUND)
  1190       pkg_search_module(DBUS dbus-1 dbus)
  1191       if(DBUS_FOUND)
  1192         set(HAVE_DBUS_DBUS_H TRUE)
  1193         include_directories(${DBUS_INCLUDE_DIRS})
  1194         list(APPEND EXTRA_LIBS ${DBUS_LIBRARIES})
  1195       endif()
  1196 
  1197       pkg_search_module(IBUS ibus-1.0 ibus)
  1198       if(IBUS_FOUND)
  1199         set(HAVE_IBUS_IBUS_H TRUE)
  1200         include_directories(${IBUS_INCLUDE_DIRS})
  1201         list(APPEND EXTRA_LIBS ${IBUS_LIBRARIES})
  1202         add_definitions(-DSDL_USE_IME)
  1203       endif()
  1204       if(HAVE_LIBUNWIND_H)
  1205         # We've already found the header, so REQUIRE the lib to be present
  1206         pkg_search_module(UNWIND REQUIRED libunwind)
  1207         pkg_search_module(UNWIND_GENERIC REQUIRED libunwind-generic)
  1208         list(APPEND EXTRA_LIBS ${UNWIND_LIBRARIES} ${UNWIND_GENERIC_LIBRARIES})
  1209       endif()
  1210     endif()
  1211 
  1212     check_include_file("fcitx/frontend.h" HAVE_FCITX_FRONTEND_H)
  1213   endif()
  1214 
  1215   if(INPUT_TSLIB)
  1216     check_c_source_compiles("
  1217         #include \"tslib.h\"
  1218         int main(int argc, char** argv) { }" HAVE_INPUT_TSLIB)
  1219     if(HAVE_INPUT_TSLIB)
  1220       set(SDL_INPUT_TSLIB 1)
  1221       list(APPEND EXTRA_LIBS ts)
  1222     endif()
  1223   endif()
  1224 
  1225   if(SDL_JOYSTICK)
  1226     if(FREEBSD OR NETBSD OR OPENBSD OR BSDI)
  1227       CheckUSBHID()
  1228     endif()
  1229     CheckHIDAPI()
  1230     if(LINUX AND NOT ANDROID)
  1231       set(SDL_JOYSTICK_LINUX 1)
  1232       file(GLOB JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/linux/*.c ${SDL2_SOURCE_DIR}/src/joystick/steam/*.c)
  1233       set(SOURCE_FILES ${SOURCE_FILES} ${JOYSTICK_SOURCES})
  1234       set(HAVE_SDL_JOYSTICK TRUE)
  1235     endif()
  1236   endif()
  1237 
  1238   CheckPTHREAD()
  1239 
  1240   if(CLOCK_GETTIME)
  1241     check_library_exists(rt clock_gettime "" FOUND_CLOCK_GETTIME)
  1242     if(FOUND_CLOCK_GETTIME)
  1243       list(APPEND EXTRA_LIBS rt)
  1244       set(HAVE_CLOCK_GETTIME 1)
  1245     else()
  1246       check_library_exists(c clock_gettime "" FOUND_CLOCK_GETTIME)
  1247       if(FOUND_CLOCK_GETTIME)
  1248         set(HAVE_CLOCK_GETTIME 1)
  1249       endif()
  1250     endif()
  1251   endif()
  1252 
  1253   check_include_file(linux/version.h HAVE_LINUX_VERSION_H)
  1254   if(HAVE_LINUX_VERSION_H)
  1255     set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DHAVE_LINUX_VERSION_H")
  1256   endif()
  1257 
  1258   if(SDL_POWER)
  1259     if(LINUX)
  1260       set(SDL_POWER_LINUX 1)
  1261       file(GLOB POWER_SOURCES ${SDL2_SOURCE_DIR}/src/power/linux/*.c)
  1262       set(SOURCE_FILES ${SOURCE_FILES} ${POWER_SOURCES})
  1263       set(HAVE_SDL_POWER TRUE)
  1264     endif()
  1265   endif()
  1266 
  1267   if(SDL_FILESYSTEM)
  1268     set(SDL_FILESYSTEM_UNIX 1)
  1269     file(GLOB FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/unix/*.c)
  1270     set(SOURCE_FILES ${SOURCE_FILES} ${FILESYSTEM_SOURCES})
  1271     set(HAVE_SDL_FILESYSTEM TRUE)
  1272   endif()
  1273 
  1274   if(SDL_TIMERS)
  1275     set(SDL_TIMER_UNIX 1)
  1276     file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/unix/*.c)
  1277     set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES})
  1278     set(HAVE_SDL_TIMERS TRUE)
  1279   endif()
  1280 
  1281   if(RPATH)
  1282     set(SDL_RLD_FLAGS "")
  1283     if(BSDI OR FREEBSD OR LINUX OR NETBSD)
  1284       set(CMAKE_REQUIRED_FLAGS "-Wl,--enable-new-dtags")
  1285       check_c_compiler_flag("" HAVE_ENABLE_NEW_DTAGS)
  1286       set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS})
  1287       if(HAVE_ENABLE_NEW_DTAGS)
  1288         set(SDL_RLD_FLAGS "-Wl,-rpath,\${libdir} -Wl,--enable-new-dtags")
  1289       else()
  1290         set(SDL_RLD_FLAGS "-Wl,-rpath,\${libdir}")
  1291       endif()
  1292     elseif(SOLARIS)
  1293       set(SDL_RLD_FLAGS "-R\${libdir}")
  1294     endif()
  1295     set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)
  1296     set(HAVE_RPATH TRUE)
  1297   endif()
  1298 
  1299 elseif(WINDOWS)
  1300   find_program(WINDRES windres)
  1301 
  1302   check_c_source_compiles("
  1303     #include <windows.h>
  1304     int main(int argc, char **argv) { }" HAVE_WIN32_CC)
  1305 
  1306   file(GLOB CORE_SOURCES ${SDL2_SOURCE_DIR}/src/core/windows/*.c)
  1307   set(SOURCE_FILES ${SOURCE_FILES} ${CORE_SOURCES})
  1308 
  1309   if(MSVC)
  1310     # Prevent codegen that would use the VC runtime libraries.
  1311     set_property(DIRECTORY . APPEND PROPERTY COMPILE_OPTIONS "/GS-")
  1312     if(NOT ARCH_64)
  1313       set_property(DIRECTORY . APPEND PROPERTY COMPILE_OPTIONS "/arch:SSE")
  1314     endif()
  1315   endif()
  1316 
  1317   # Check for DirectX
  1318   if(DIRECTX)
  1319     if(DEFINED MSVC_VERSION AND NOT ${MSVC_VERSION} LESS 1700)
  1320         set(USE_WINSDK_DIRECTX TRUE)
  1321     endif()
  1322     if(NOT CMAKE_COMPILER_IS_MINGW AND NOT USE_WINSDK_DIRECTX)
  1323       if("$ENV{DXSDK_DIR}" STREQUAL "")
  1324         message_error("DIRECTX requires the \$DXSDK_DIR environment variable to be set")
  1325       endif()
  1326       set(CMAKE_REQUIRED_FLAGS "/I\"$ENV{DXSDK_DIR}\\Include\"")
  1327     endif()
  1328 
  1329     if(HAVE_WIN32_CC)
  1330       # xinput.h may need windows.h, but doesn't include it itself.
  1331       check_c_source_compiles("
  1332         #include <windows.h>
  1333         #include <xinput.h>
  1334         int main(int argc, char **argv) { }" HAVE_XINPUT_H)
  1335       check_c_source_compiles("
  1336         #include <windows.h>
  1337         #include <xinput.h>
  1338         XINPUT_GAMEPAD_EX x1;
  1339         int main(int argc, char **argv) { }" HAVE_XINPUT_GAMEPAD_EX)
  1340       check_c_source_compiles("
  1341         #include <windows.h>
  1342         #include <xinput.h>
  1343         XINPUT_STATE_EX s1;
  1344         int main(int argc, char **argv) { }" HAVE_XINPUT_STATE_EX)
  1345     else()
  1346       check_include_file(xinput.h HAVE_XINPUT_H)
  1347     endif()
  1348 
  1349     check_include_file(d3d9.h HAVE_D3D_H)
  1350     check_include_file(d3d11_1.h HAVE_D3D11_H)
  1351     check_include_file(ddraw.h HAVE_DDRAW_H)
  1352     check_include_file(dsound.h HAVE_DSOUND_H)
  1353     check_include_file(dinput.h HAVE_DINPUT_H)
  1354     check_include_file(dxgi.h HAVE_DXGI_H)
  1355     if(HAVE_D3D_H OR HAVE_D3D11_H OR HAVE_DDRAW_H OR HAVE_DSOUND_H OR HAVE_DINPUT_H)
  1356       set(HAVE_DIRECTX TRUE)
  1357       if(NOT CMAKE_COMPILER_IS_MINGW AND NOT USE_WINSDK_DIRECTX)
  1358       # TODO: change $ENV{DXSDL_DIR} to get the path from the include checks
  1359         link_directories($ENV{DXSDK_DIR}\\lib\\${PROCESSOR_ARCH})
  1360         include_directories($ENV{DXSDK_DIR}\\Include)
  1361       endif()
  1362     endif()
  1363     set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS})
  1364   endif()
  1365 
  1366   # headers needed elsewhere
  1367   check_include_file(mmdeviceapi.h HAVE_MMDEVICEAPI_H)
  1368   check_include_file(audioclient.h HAVE_AUDIOCLIENT_H)
  1369 
  1370   if(SDL_AUDIO)
  1371     set(SDL_AUDIO_DRIVER_WINMM 1)
  1372     file(GLOB WINMM_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/winmm/*.c)
  1373     set(SOURCE_FILES ${SOURCE_FILES} ${WINMM_AUDIO_SOURCES})
  1374     set(HAVE_SDL_AUDIO TRUE)
  1375 
  1376     if(HAVE_DSOUND_H)
  1377       set(SDL_AUDIO_DRIVER_DSOUND 1)
  1378       file(GLOB DSOUND_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/directsound/*.c)
  1379       set(SOURCE_FILES ${SOURCE_FILES} ${DSOUND_AUDIO_SOURCES})
  1380     endif()
  1381 
  1382     if(WASAPI AND HAVE_AUDIOCLIENT_H AND HAVE_MMDEVICEAPI_H)
  1383       set(SDL_AUDIO_DRIVER_WASAPI 1)
  1384       file(GLOB WASAPI_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/wasapi/*.c)
  1385       set(SOURCE_FILES ${SOURCE_FILES} ${WASAPI_AUDIO_SOURCES})
  1386     endif()
  1387   endif()
  1388 
  1389   if(SDL_VIDEO)
  1390     # requires SDL_LOADSO on Windows (IME, DX, etc.)
  1391     if(NOT SDL_LOADSO)
  1392       message_error("SDL_VIDEO requires SDL_LOADSO, which is not enabled")
  1393     endif()
  1394     set(SDL_VIDEO_DRIVER_WINDOWS 1)
  1395     file(GLOB WIN_VIDEO_SOURCES ${SDL2_SOURCE_DIR}/src/video/windows/*.c)
  1396     set(SOURCE_FILES ${SOURCE_FILES} ${WIN_VIDEO_SOURCES})
  1397 
  1398     if(RENDER_D3D AND HAVE_D3D_H)
  1399       set(SDL_VIDEO_RENDER_D3D 1)
  1400       set(HAVE_RENDER_D3D TRUE)
  1401     endif()
  1402     if(RENDER_D3D AND HAVE_D3D11_H)
  1403       set(SDL_VIDEO_RENDER_D3D11 1)
  1404       set(HAVE_RENDER_D3D TRUE)
  1405     endif()
  1406     set(HAVE_SDL_VIDEO TRUE)
  1407   endif()
  1408 
  1409   if(SDL_THREADS)
  1410     set(SDL_THREAD_WINDOWS 1)
  1411     set(SOURCE_FILES ${SOURCE_FILES}
  1412       ${SDL2_SOURCE_DIR}/src/thread/windows/SDL_sysmutex.c
  1413       ${SDL2_SOURCE_DIR}/src/thread/windows/SDL_syssem.c
  1414       ${SDL2_SOURCE_DIR}/src/thread/windows/SDL_systhread.c
  1415       ${SDL2_SOURCE_DIR}/src/thread/windows/SDL_systls.c
  1416       ${SDL2_SOURCE_DIR}/src/thread/generic/SDL_syscond.c)
  1417     set(HAVE_SDL_THREADS TRUE)
  1418   endif()
  1419 
  1420   if(SDL_POWER)
  1421     set(SDL_POWER_WINDOWS 1)
  1422     set(SOURCE_FILES ${SOURCE_FILES} ${SDL2_SOURCE_DIR}/src/power/windows/SDL_syspower.c)
  1423     set(HAVE_SDL_POWER TRUE)
  1424   endif()
  1425 
  1426   if(SDL_FILESYSTEM)
  1427     set(SDL_FILESYSTEM_WINDOWS 1)
  1428     file(GLOB FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/windows/*.c)
  1429     set(SOURCE_FILES ${SOURCE_FILES} ${FILESYSTEM_SOURCES})
  1430     set(HAVE_SDL_FILESYSTEM TRUE)
  1431   endif()
  1432 
  1433   # Libraries for Win32 native and MinGW
  1434   list(APPEND EXTRA_LIBS user32 gdi32 winmm imm32 ole32 oleaut32 version uuid advapi32 setupapi shell32)
  1435 
  1436   # TODO: in configure.ac the check for timers is set on
  1437   # cygwin | mingw32* - does this include mingw32CE?
  1438   if(SDL_TIMERS)
  1439     set(SDL_TIMER_WINDOWS 1)
  1440     file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/windows/*.c)
  1441     set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES})
  1442     set(HAVE_SDL_TIMERS TRUE)
  1443   endif()
  1444 
  1445   if(SDL_LOADSO)
  1446     set(SDL_LOADSO_WINDOWS 1)
  1447     file(GLOB LOADSO_SOURCES ${SDL2_SOURCE_DIR}/src/loadso/windows/*.c)
  1448     set(SOURCE_FILES ${SOURCE_FILES} ${LOADSO_SOURCES})
  1449     set(HAVE_SDL_LOADSO TRUE)
  1450   endif()
  1451 
  1452   file(GLOB CORE_SOURCES ${SDL2_SOURCE_DIR}/src/core/windows/*.c)
  1453   set(SOURCE_FILES ${SOURCE_FILES} ${CORE_SOURCES})
  1454 
  1455   if(SDL_VIDEO)
  1456     if(VIDEO_OPENGL)
  1457       set(SDL_VIDEO_OPENGL 1)
  1458       set(SDL_VIDEO_OPENGL_WGL 1)
  1459       set(SDL_VIDEO_RENDER_OGL 1)
  1460       set(HAVE_VIDEO_OPENGL TRUE)
  1461     endif()
  1462 
  1463     if(VIDEO_OPENGLES)
  1464       set(SDL_VIDEO_OPENGL_EGL 1)
  1465       set(SDL_VIDEO_OPENGL_ES2 1)
  1466       set(SDL_VIDEO_RENDER_OGL_ES2 1)
  1467       set(HAVE_VIDEO_OPENGLES TRUE)
  1468     endif()
  1469   endif()
  1470 
  1471   if(SDL_JOYSTICK)
  1472     CheckHIDAPI()
  1473     # TODO: Remove this hid.c block when SDL_hidapi.c is supported on Windows!
  1474     if(HAVE_HIDAPI)
  1475       set(SOURCE_FILES ${SOURCE_FILES} ${SDL2_SOURCE_DIR}/src/hidapi/windows/hid.c)
  1476     endif()
  1477     file(GLOB JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/windows/*.c)
  1478     set(SOURCE_FILES ${SOURCE_FILES} ${JOYSTICK_SOURCES})
  1479     if(HAVE_DINPUT_H)
  1480       set(SDL_JOYSTICK_DINPUT 1)
  1481       list(APPEND EXTRA_LIBS dinput8)
  1482       if(CMAKE_COMPILER_IS_MINGW)
  1483         list(APPEND EXTRA_LIBS dxerr8)
  1484       elseif (NOT USE_WINSDK_DIRECTX)
  1485         list(APPEND EXTRA_LIBS dxerr)
  1486       endif()
  1487     endif()
  1488     if(HAVE_XINPUT_H)
  1489       set(SDL_JOYSTICK_XINPUT 1)
  1490     endif()
  1491     if(NOT HAVE_DINPUT_H AND NOT HAVE_XINPUT_H)
  1492       set(SDL_JOYSTICK_WINMM 1)
  1493     endif()
  1494     set(HAVE_SDL_JOYSTICK TRUE)
  1495 
  1496     if(SDL_HAPTIC)
  1497       if(HAVE_DINPUT_H OR HAVE_XINPUT_H)
  1498         file(GLOB HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/windows/*.c)
  1499         if(HAVE_DINPUT_H)
  1500           set(SDL_HAPTIC_DINPUT 1)
  1501         endif()
  1502         if(HAVE_XINPUT_H)
  1503           set(SDL_HAPTIC_XINPUT 1)
  1504         endif()
  1505       else()
  1506         file(GLOB HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/dummy/*.c)
  1507         set(SDL_HAPTIC_DUMMY 1)
  1508       endif()
  1509       set(SOURCE_FILES ${SOURCE_FILES} ${HAPTIC_SOURCES})
  1510       set(HAVE_SDL_HAPTIC TRUE)
  1511     endif()
  1512   endif()
  1513 
  1514   file(GLOB VERSION_SOURCES ${SDL2_SOURCE_DIR}/src/main/windows/*.rc)
  1515   file(GLOB SDLMAIN_SOURCES ${SDL2_SOURCE_DIR}/src/main/windows/*.c)
  1516   if(MINGW OR CYGWIN)
  1517     list(APPEND EXTRA_LIBS mingw32)
  1518     list(APPEND EXTRA_LDFLAGS "-mwindows")
  1519     set(SDL_CFLAGS "${SDL_CFLAGS} -Dmain=SDL_main")
  1520     list(APPEND SDL_LIBS "-lmingw32" "-lSDL2main" "-mwindows")
  1521   endif()
  1522 
  1523 elseif(APPLE)
  1524   # TODO: rework this all for proper MacOS X, iOS and Darwin support
  1525 
  1526   # We always need these libs on macOS at the moment.
  1527   # !!! FIXME: we need Carbon for some very old API calls in
  1528   # !!! FIXME:  src/video/cocoa/SDL_cocoakeyboard.c, but we should figure out
  1529   # !!! FIXME:  how to dump those.
  1530   if(DARWIN OR MACOSX)
  1531     set(SDL_FRAMEWORK_COCOA 1)
  1532     set(SDL_FRAMEWORK_CARBON 1)
  1533   endif()
  1534   set(SDL_FRAMEWORK_FOUNDATION 1)
  1535 
  1536   # Requires the darwin file implementation
  1537   if(SDL_FILE)
  1538     file(GLOB EXTRA_SOURCES ${SDL2_SOURCE_DIR}/src/file/cocoa/*.m)
  1539     set(SOURCE_FILES ${EXTRA_SOURCES} ${SOURCE_FILES})
  1540     # !!! FIXME: modern CMake doesn't need "LANGUAGE C" for Objective-C.
  1541     set_source_files_properties(${EXTRA_SOURCES} PROPERTIES LANGUAGE C)
  1542     set(HAVE_SDL_FILE TRUE)
  1543     # !!! FIXME: why is COREVIDEO inside this if() block?
  1544     set(SDL_FRAMEWORK_COREVIDEO 1)
  1545   else()
  1546     message_error("SDL_FILE must be enabled to build on MacOS X")
  1547   endif()
  1548 
  1549   if(SDL_AUDIO)
  1550     set(SDL_AUDIO_DRIVER_COREAUDIO 1)
  1551     file(GLOB AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/coreaudio/*.m)
  1552     # !!! FIXME: modern CMake doesn't need "LANGUAGE C" for Objective-C.
  1553     set_source_files_properties(${AUDIO_SOURCES} PROPERTIES LANGUAGE C)
  1554     set(SOURCE_FILES ${SOURCE_FILES} ${AUDIO_SOURCES})
  1555     set(HAVE_SDL_AUDIO TRUE)
  1556     set(SDL_FRAMEWORK_COREAUDIO 1)
  1557     set(SDL_FRAMEWORK_AUDIOTOOLBOX 1)
  1558     set(SDL_FRAMEWORK_AVFOUNDATION 1)
  1559   endif()
  1560 
  1561   if(SDL_JOYSTICK)
  1562     CheckHIDAPI()
  1563     if(HAVE_HIDAPI)
  1564       if(IOS OR TVOS)
  1565         set(SOURCE_FILES ${SOURCE_FILES} ${SDL2_SOURCE_DIR}/src/hidapi/ios/hid.m)
  1566         set(SDL_FRAMEWORK_COREBLUETOOTH 1)
  1567       endif()
  1568     endif()
  1569     if(IOS OR TVOS)
  1570       file(GLOB JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/iphoneos/*.m ${SDL2_SOURCE_DIR}/src/joystick/steam/*.c)
  1571       set(SDL_JOYSTICK_MFI 1)
  1572       if(IOS)
  1573         set(SDL_FRAMEWORK_COREMOTION 1)
  1574       endif()
  1575       set(SDL_FRAMEWORK_GAMECONTROLLER 1)
  1576       set(HAVE_SDL_SENSORS 1)
  1577     else()
  1578       file(GLOB JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/darwin/*.c)
  1579       set(SDL_JOYSTICK_IOKIT 1)
  1580       set(SDL_FRAMEWORK_IOKIT 1)
  1581       set(SDL_FRAMEWORK_FF 1)
  1582     endif()
  1583     set(SOURCE_FILES ${SOURCE_FILES} ${JOYSTICK_SOURCES})
  1584     set(HAVE_SDL_JOYSTICK TRUE)
  1585   endif()
  1586 
  1587   if(SDL_HAPTIC)
  1588     if (IOS OR TVOS)
  1589       file(GLOB HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/dummy/*.c)
  1590       set(SDL_HAPTIC_DUMMY 1)
  1591     else()
  1592       file(GLOB HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/darwin/*.c)
  1593       set(SDL_HAPTIC_IOKIT 1)
  1594       set(SDL_FRAMEWORK_IOKIT 1)
  1595       set(SDL_FRAMEWORK_FF 1)
  1596     endif()
  1597     set(SOURCE_FILES ${SOURCE_FILES} ${HAPTIC_SOURCES})
  1598     set(HAVE_SDL_HAPTIC TRUE)
  1599     if(NOT SDL_JOYSTICK)
  1600       message(FATAL_ERROR "SDL_HAPTIC requires SDL_JOYSTICK to be enabled")
  1601     endif()
  1602   endif()
  1603 
  1604   if(SDL_POWER)
  1605     if (IOS OR TVOS)
  1606       file(GLOB POWER_SOURCES ${SDL2_SOURCE_DIR}/src/power/uikit/*.m)
  1607       set(SDL_POWER_UIKIT 1)
  1608     else()
  1609       file(GLOB POWER_SOURCES ${SDL2_SOURCE_DIR}/src/power/macosx/*.c)
  1610       set(SDL_POWER_MACOSX 1)
  1611       set(SDL_FRAMEWORK_IOKIT 1)
  1612     endif()
  1613     set(SOURCE_FILES ${SOURCE_FILES} ${POWER_SOURCES})
  1614     set(HAVE_SDL_POWER TRUE)
  1615   endif()
  1616 
  1617   if(SDL_TIMERS)
  1618     set(SDL_TIMER_UNIX 1)
  1619     file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/unix/*.c)
  1620     set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES})
  1621     set(HAVE_SDL_TIMERS TRUE)
  1622   endif(SDL_TIMERS)
  1623 
  1624   if(SDL_FILESYSTEM)
  1625     set(SDL_FILESYSTEM_COCOA 1)
  1626     file(GLOB FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/cocoa/*.m)
  1627     # !!! FIXME: modern CMake doesn't need "LANGUAGE C" for Objective-C.
  1628     set_source_files_properties(${FILESYSTEM_SOURCES} PROPERTIES LANGUAGE C)
  1629     set(SOURCE_FILES ${SOURCE_FILES} ${FILESYSTEM_SOURCES})
  1630     set(HAVE_SDL_FILESYSTEM TRUE)
  1631   endif()
  1632 
  1633   if(SDL_SENSOR)
  1634     if(IOS)
  1635       set(SDL_SENSOR_COREMOTION 1)
  1636       set(HAVE_SDL_SENSORS TRUE)
  1637       file(GLOB SENSOR_SOURCES ${SDL2_SOURCE_DIR}/src/sensor/coremotion/*.m)
  1638       set(SOURCE_FILES ${SOURCE_FILES} ${SENSOR_SOURCES})
  1639     endif()
  1640   endif()
  1641 
  1642   # iOS hack needed - http://code.google.com/p/ios-cmake/ ?
  1643   if(SDL_VIDEO)
  1644     if (IOS OR TVOS)
  1645       set(SDL_VIDEO_DRIVER_UIKIT 1)
  1646       set(SDL_FRAMEWORK_COREGRAPHICS 1)
  1647       set(SDL_FRAMEWORK_QUARTZCORE 1)
  1648       set(SDL_FRAMEWORK_UIKIT 1)
  1649       set(SDL_IPHONE_KEYBOARD 1)
  1650       set(SDL_IPHONE_LAUNCHSCREEN 1)
  1651       file(GLOB UIKITVIDEO_SOURCES ${SDL2_SOURCE_DIR}/src/video/uikit/*.m)
  1652       set(SOURCE_FILES ${SOURCE_FILES} ${UIKITVIDEO_SOURCES})
  1653     else()
  1654       CheckCOCOA()
  1655       if(VIDEO_OPENGL)
  1656         set(SDL_VIDEO_OPENGL 1)
  1657         set(SDL_VIDEO_OPENGL_CGL 1)
  1658         set(SDL_VIDEO_RENDER_OGL 1)
  1659         set(HAVE_VIDEO_OPENGL TRUE)
  1660       endif()
  1661     endif()
  1662 
  1663     if(VIDEO_OPENGLES)
  1664       if(IOS OR TVOS)
  1665         set(SDL_FRAMEWORK_OPENGLES 1)
  1666         set(SDL_VIDEO_OPENGL_ES 1)
  1667         set(SDL_VIDEO_RENDER_OGL_ES 1)
  1668       else()
  1669         set(SDL_VIDEO_OPENGL_EGL 1)
  1670       endif()
  1671       set(SDL_VIDEO_OPENGL_ES2 1)
  1672       set(SDL_VIDEO_RENDER_OGL_ES2 1)
  1673       set(HAVE_VIDEO_OPENGLES TRUE)
  1674     endif()
  1675 
  1676     if(VIDEO_VULKAN OR VIDEO_METAL OR RENDER_METAL)
  1677       set(ORIG_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
  1678       set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -x objective-c")
  1679       check_c_source_compiles("
  1680         #include <AvailabilityMacros.h>
  1681         #import <Metal/Metal.h>
  1682         #import <QuartzCore/CAMetalLayer.h>
  1683 
  1684         #if TARGET_OS_SIMULATOR || (!TARGET_CPU_X86_64 && !TARGET_CPU_ARM64)
  1685         #error Metal doesn't work on this configuration
  1686         #endif
  1687         int main()
  1688         {
  1689             return 0;
  1690         }
  1691         " HAVE_FRAMEWORK_METAL)
  1692       set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS})
  1693       if(HAVE_FRAMEWORK_METAL)
  1694         set(SDL_FRAMEWORK_METAL 1)
  1695         set(SDL_FRAMEWORK_QUARTZCORE 1)
  1696       else()
  1697         set(VIDEO_VULKAN 0)
  1698         set(VIDEO_METAL 0)
  1699         set(RENDER_METAL 0)
  1700       endif()
  1701     endif()
  1702 
  1703     if(VIDEO_METAL)
  1704       set(SDL_VIDEO_METAL 1)
  1705       set(HAVE_VIDEO_METAL TRUE)
  1706     endif()
  1707 
  1708     if(RENDER_METAL)
  1709       file(GLOB RENDER_METAL_SOURCES ${SDL2_SOURCE_DIR}/src/render/metal/*.m)
  1710       set(SOURCE_FILES ${SOURCE_FILES} ${RENDER_METAL_SOURCES})
  1711       set(SDL_VIDEO_RENDER_METAL 1)
  1712       set(HAVE_RENDER_METAL TRUE)
  1713     endif()
  1714   endif()
  1715 
  1716   # Actually load the frameworks at the end so we don't duplicate include.
  1717   if(SDL_FRAMEWORK_COREVIDEO)
  1718     find_library(COREVIDEO CoreVideo)
  1719     list(APPEND EXTRA_LIBS ${COREVIDEO})
  1720   endif()
  1721   if(SDL_FRAMEWORK_COCOA)
  1722     find_library(COCOA_LIBRARY Cocoa)
  1723     list(APPEND EXTRA_LIBS ${COCOA_LIBRARY})
  1724   endif()
  1725   if(SDL_FRAMEWORK_IOKIT)
  1726     find_library(IOKIT IOKit)
  1727     list(APPEND EXTRA_LIBS ${IOKIT})
  1728   endif()
  1729   if(SDL_FRAMEWORK_FF)
  1730     find_library(FORCEFEEDBACK ForceFeedback)
  1731     list(APPEND EXTRA_LIBS ${FORCEFEEDBACK})
  1732   endif()
  1733   if(SDL_FRAMEWORK_CARBON)
  1734     find_library(CARBON_LIBRARY Carbon)
  1735     list(APPEND EXTRA_LIBS ${CARBON_LIBRARY})
  1736   endif()
  1737   if(SDL_FRAMEWORK_COREAUDIO)
  1738     find_library(COREAUDIO CoreAudio)
  1739     list(APPEND EXTRA_LIBS ${COREAUDIO})
  1740   endif()
  1741   if(SDL_FRAMEWORK_AUDIOTOOLBOX)
  1742     find_library(AUDIOTOOLBOX AudioToolbox)
  1743     list(APPEND EXTRA_LIBS ${AUDIOTOOLBOX})
  1744   endif()
  1745   if(SDL_FRAMEWORK_AVFOUNDATION)
  1746     find_library(AVFOUNDATION AVFoundation)
  1747     list(APPEND EXTRA_LIBS ${AVFOUNDATION})
  1748   endif()
  1749   if(SDL_FRAMEWORK_COREBLUETOOTH)
  1750     find_library(COREBLUETOOTH CoreBluetooth)
  1751     list(APPEND EXTRA_LIBS ${COREBLUETOOTH})
  1752   endif()
  1753   if(SDL_FRAMEWORK_COREGRAPHICS)
  1754     find_library(COREGRAPHICS CoreGraphics)
  1755     list(APPEND EXTRA_LIBS ${COREGRAPHICS})
  1756   endif()
  1757   if(SDL_FRAMEWORK_COREMOTION)
  1758     find_library(COREMOTION CoreMotion)
  1759     list(APPEND EXTRA_LIBS ${COREMOTION})
  1760   endif()
  1761   if(SDL_FRAMEWORK_FOUNDATION)
  1762     find_library(FOUNDATION Foundation)
  1763     list(APPEND EXTRA_LIBS ${FOUNDATION})
  1764   endif()
  1765   if(SDL_FRAMEWORK_GAMECONTROLLER)
  1766     find_library(GAMECONTROLLER GameController)
  1767     list(APPEND EXTRA_LIBS ${GAMECONTROLLER})
  1768   endif()
  1769   if(SDL_FRAMEWORK_METAL)
  1770     if(IOS OR TVOS)
  1771       find_library(METAL Metal)
  1772       list(APPEND EXTRA_LIBS ${METAL})
  1773     else()
  1774       list(APPEND EXTRA_LDFLAGS "-Wl,-weak_framework,Metal")
  1775     endif()
  1776   endif()
  1777   if(SDL_FRAMEWORK_OPENGLES)
  1778     find_library(OPENGLES OpenGLES)
  1779     list(APPEND EXTRA_LIBS ${OPENGLES})
  1780   endif()
  1781   if(SDL_FRAMEWORK_QUARTZCORE)
  1782     if(IOS OR TVOS)
  1783       find_library(QUARTZCORE QuartzCore)
  1784       list(APPEND EXTRA_LIBS ${QUARTZCORE})
  1785     else()
  1786       list(APPEND EXTRA_LDFLAGS "-Wl,-weak_framework,QuartzCore")
  1787     endif()
  1788   endif()
  1789   if(SDL_FRAMEWORK_UIKIT)
  1790     find_library(UIKIT UIKit)
  1791     list(APPEND EXTRA_LIBS ${UIKIT})
  1792   endif()
  1793 
  1794   CheckPTHREAD()
  1795 
  1796 elseif(HAIKU)
  1797   if(SDL_VIDEO)
  1798     set(SDL_VIDEO_DRIVER_HAIKU 1)
  1799     file(GLOB HAIKUVIDEO_SOURCES ${SDL2_SOURCE_DIR}/src/video/haiku/*.c)
  1800     set(SOURCE_FILES ${SOURCE_FILES} ${HAIKUVIDEO_SOURCES})
  1801     set(HAVE_SDL_VIDEO TRUE)
  1802 
  1803     set(SDL_FILESYSTEM_HAIKU 1)
  1804     file(GLOB FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/haiku/*.cc)
  1805     set(SOURCE_FILES ${SOURCE_FILES} ${FILESYSTEM_SOURCES})
  1806     set(HAVE_SDL_FILESYSTEM TRUE)
  1807 
  1808     if(SDL_TIMERS)
  1809       set(SDL_TIMER_HAIKU 1)
  1810       file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/haiku/*.c)
  1811       set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES})
  1812       set(HAVE_SDL_TIMERS TRUE)
  1813     endif(SDL_TIMERS)
  1814 
  1815     if(VIDEO_OPENGL)
  1816       # TODO: Use FIND_PACKAGE(OpenGL) instead
  1817       set(SDL_VIDEO_OPENGL 1)
  1818       set(SDL_VIDEO_OPENGL_BGL 1)
  1819       set(SDL_VIDEO_RENDER_OGL 1)
  1820       list(APPEND EXTRA_LIBS GL)
  1821       set(HAVE_VIDEO_OPENGL TRUE)
  1822     endif()
  1823   endif()
  1824 
  1825   CheckPTHREAD()
  1826 
  1827 elseif(RISCOS)
  1828   if(SDL_TIMERS)
  1829     set(SDL_TIMER_UNIX 1)
  1830     file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/unix/*.c)
  1831     set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES})
  1832     set(HAVE_SDL_TIMERS TRUE)
  1833 
  1834     if(CLOCK_GETTIME)
  1835       set(HAVE_CLOCK_GETTIME 1)
  1836     endif()
  1837   endif()
  1838 
  1839   CheckPTHREAD()
  1840 
  1841   if(SDL_AUDIO)
  1842     CheckOSS()
  1843   endif()
  1844 endif()
  1845 
  1846 if(VIDEO_VULKAN)
  1847   set(SDL_VIDEO_VULKAN 1)
  1848   set(HAVE_VIDEO_VULKAN TRUE)
  1849 endif()
  1850 
  1851 # Dummies
  1852 # configure.ac does it differently:
  1853 # if not have X
  1854 #   if enable_X {  SDL_X_DISABLED = 1 }
  1855 #   [add dummy sources]
  1856 # so it always adds a dummy, without checking, if it was actually requested.
  1857 # This leads to missing internal references on building, since the
  1858 # src/X/*.c does not get included.
  1859 if(NOT HAVE_SDL_JOYSTICK)
  1860   set(SDL_JOYSTICK_DUMMY 1)
  1861   if(SDL_JOYSTICK AND NOT APPLE) # results in unresolved symbols on OSX
  1862 
  1863     file(GLOB JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/dummy/*.c)
  1864     set(SOURCE_FILES ${SOURCE_FILES} ${JOYSTICK_SOURCES})
  1865   endif()
  1866 endif()
  1867 if(NOT HAVE_SDL_HAPTIC)
  1868   set(SDL_HAPTIC_DUMMY 1)
  1869   file(GLOB HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/dummy/*.c)
  1870   set(SOURCE_FILES ${SOURCE_FILES} ${HAPTIC_SOURCES})
  1871 endif()
  1872 if(NOT HAVE_SDL_SENSORS)
  1873   set(SDL_SENSOR_DUMMY 1)
  1874   file(GLOB SENSORS_SOURCES ${SDL2_SOURCE_DIR}/src/sensor/dummy/*.c)
  1875   set(SOURCE_FILES ${SOURCE_FILES} ${SENSORS_SOURCES})
  1876 endif()
  1877 if(NOT HAVE_SDL_LOADSO)
  1878   set(SDL_LOADSO_DISABLED 1)
  1879   file(GLOB LOADSO_SOURCES ${SDL2_SOURCE_DIR}/src/loadso/dummy/*.c)
  1880   set(SOURCE_FILES ${SOURCE_FILES} ${LOADSO_SOURCES})
  1881 endif()
  1882 if(NOT HAVE_SDL_FILESYSTEM)
  1883   set(SDL_FILESYSTEM_DISABLED 1)
  1884   file(GLOB FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/dummy/*.c)
  1885   set(SOURCE_FILES ${SOURCE_FILES} ${FILESYSTEM_SOURCES})
  1886 endif()
  1887 
  1888 # We always need to have threads and timers around
  1889 if(NOT HAVE_SDL_THREADS)
  1890   set(SDL_THREADS_DISABLED 1)
  1891   file(GLOB THREADS_SOURCES ${SDL2_SOURCE_DIR}/src/thread/generic/*.c)
  1892   set(SOURCE_FILES ${SOURCE_FILES} ${THREADS_SOURCES})
  1893 endif()
  1894 if(NOT HAVE_SDL_TIMERS)
  1895   set(SDL_TIMERS_DISABLED 1)
  1896   file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/dummy/*.c)
  1897   set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES})
  1898 endif()
  1899 
  1900 if(NOT SDLMAIN_SOURCES)
  1901   file(GLOB SDLMAIN_SOURCES ${SDL2_SOURCE_DIR}/src/main/dummy/*.c)
  1902 endif()
  1903 
  1904 # Append the -MMD -MT flags
  1905 # if(DEPENDENCY_TRACKING)
  1906 #   if(COMPILER_IS_GNUCC)
  1907 #     set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -MMD -MT \$@")
  1908 #   endif()
  1909 # endif()
  1910 
  1911 configure_file("${SDL2_SOURCE_DIR}/include/SDL_config.h.cmake"
  1912   "${SDL2_BINARY_DIR}/include/SDL_config.h")
  1913 
  1914 # Prepare the flags and remove duplicates
  1915 if(EXTRA_LDFLAGS)
  1916   list(REMOVE_DUPLICATES EXTRA_LDFLAGS)
  1917 endif()
  1918 if(EXTRA_LIBS)
  1919   list(REMOVE_DUPLICATES EXTRA_LIBS)
  1920 endif()
  1921 if(EXTRA_CFLAGS)
  1922   list(REMOVE_DUPLICATES EXTRA_CFLAGS)
  1923 endif()
  1924 listtostr(EXTRA_CFLAGS _EXTRA_CFLAGS)
  1925 set(EXTRA_CFLAGS ${_EXTRA_CFLAGS})
  1926 
  1927 # Compat helpers for the configuration files
  1928 if(NOT WINDOWS OR CYGWIN)
  1929   # TODO: we need a Windows script, too
  1930   execute_process(COMMAND sh ${SDL2_SOURCE_DIR}/build-scripts/updaterev.sh)
  1931 
  1932   set(prefix ${CMAKE_INSTALL_PREFIX})
  1933   set(exec_prefix "\${prefix}")
  1934   set(libdir "\${exec_prefix}/lib${LIB_SUFFIX}")
  1935   set(bindir "\${exec_prefix}/bin")
  1936   set(includedir "\${prefix}/include")
  1937   if(SDL_STATIC)
  1938     set(ENABLE_STATIC_TRUE "")
  1939     set(ENABLE_STATIC_FALSE "#")
  1940   else()
  1941     set(ENABLE_STATIC_TRUE "#")
  1942     set(ENABLE_STATIC_FALSE "")
  1943   endif()
  1944   if(SDL_SHARED)
  1945     set(ENABLE_SHARED_TRUE "")
  1946     set(ENABLE_SHARED_FALSE "#")
  1947   else()
  1948     set(ENABLE_SHARED_TRUE "#")
  1949     set(ENABLE_SHARED_FALSE "")
  1950   endif()
  1951 
  1952   # Clean up the different lists
  1953   listtostr(EXTRA_LIBS _EXTRA_LIBS "-l")
  1954   set(SDL_STATIC_LIBS ${SDL_LIBS} ${EXTRA_LDFLAGS} ${_EXTRA_LIBS})
  1955   list(REMOVE_DUPLICATES SDL_STATIC_LIBS)
  1956   listtostr(SDL_STATIC_LIBS _SDL_STATIC_LIBS)
  1957   set(SDL_STATIC_LIBS ${_SDL_STATIC_LIBS})
  1958   listtostr(SDL_LIBS _SDL_LIBS)
  1959   set(SDL_LIBS ${_SDL_LIBS})
  1960 
  1961   # MESSAGE(STATUS "SDL_LIBS: ${SDL_LIBS}")
  1962   # MESSAGE(STATUS "SDL_STATIC_LIBS: ${SDL_STATIC_LIBS}")
  1963 
  1964   configure_file("${SDL2_SOURCE_DIR}/sdl2.pc.in"
  1965     "${SDL2_BINARY_DIR}/sdl2.pc" @ONLY)
  1966   configure_file("${SDL2_SOURCE_DIR}/sdl2-config.in"
  1967     "${SDL2_BINARY_DIR}/sdl2-config")
  1968   configure_file("${SDL2_SOURCE_DIR}/sdl2-config.in"
  1969     "${SDL2_BINARY_DIR}/sdl2-config" @ONLY)
  1970   configure_file("${SDL2_SOURCE_DIR}/SDL2.spec.in"
  1971     "${SDL2_BINARY_DIR}/SDL2.spec" @ONLY)
  1972 endif()
  1973 
  1974 ##### Info output #####
  1975 message(STATUS "")
  1976 message(STATUS "SDL2 was configured with the following options:")
  1977 message(STATUS "")
  1978 message(STATUS "Platform: ${CMAKE_SYSTEM}")
  1979 message(STATUS "64-bit:   ${ARCH_64}")
  1980 message(STATUS "Compiler: ${CMAKE_C_COMPILER}")
  1981 message(STATUS "")
  1982 message(STATUS "Subsystems:")
  1983 foreach(_SUB ${SDL_SUBSYSTEMS})
  1984   string(TOUPPER ${_SUB} _OPT)
  1985   message_bool_option(${_SUB} SDL_${_OPT})
  1986 endforeach()
  1987 message(STATUS "")
  1988 message(STATUS "Options:")
  1989 list(SORT ALLOPTIONS)
  1990 foreach(_OPT ${ALLOPTIONS})
  1991   # Longest option is VIDEO_X11_XSCREENSAVER = 22 characters
  1992   # Get the padding
  1993   string(LENGTH ${_OPT} _OPTLEN)
  1994   math(EXPR _PADLEN "23 - ${_OPTLEN}")
  1995   string(RANDOM LENGTH ${_PADLEN} ALPHABET " " _PADDING)
  1996   message_tested_option(${_OPT} ${_PADDING})
  1997 endforeach()
  1998 message(STATUS "")
  1999 message(STATUS " CFLAGS:        ${CMAKE_C_FLAGS}")
  2000 message(STATUS " EXTRA_CFLAGS:  ${EXTRA_CFLAGS}")
  2001 message(STATUS " EXTRA_LDFLAGS: ${EXTRA_LDFLAGS}")
  2002 message(STATUS " EXTRA_LIBS:    ${EXTRA_LIBS}")
  2003 message(STATUS "")
  2004 message(STATUS " Build Shared Library: ${SDL_SHARED}")
  2005 message(STATUS " Build Static Library: ${SDL_STATIC}")
  2006 if(SDL_STATIC)
  2007     message(STATUS " Build Static Library with Position Independent Code: ${SDL_STATIC_PIC}")
  2008 endif()
  2009 message(STATUS "")
  2010 if(UNIX)
  2011   message(STATUS "If something was not detected, although the libraries")
  2012   message(STATUS "were installed, then make sure you have set the")
  2013   message(STATUS "CFLAGS and LDFLAGS environment variables correctly.")
  2014   message(STATUS "")
  2015 endif()
  2016 
  2017 if(WARN_ABOUT_ARM_SIMD_ASM_MIT)
  2018   message(STATUS "")
  2019   message(STATUS "SDL is being built with ARM SIMD optimizations, which")
  2020   message(STATUS "uses code licensed under the MIT license. If this is a")
  2021   message(STATUS "problem, please disable that code by rerunning CMake with:")
  2022   message(STATUS "")
  2023   message(STATUS "    -DARMSIMD=OFF")
  2024 endif()
  2025 
  2026 if(WARN_ABOUT_ARM_NEON_ASM_MIT)
  2027   message(STATUS "")
  2028   message(STATUS "SDL is being built with ARM NEON optimizations, which")
  2029   message(STATUS "uses code licensed under the MIT license. If this is a")
  2030   message(STATUS "problem, please disable that code by rerunning CMake with:")
  2031   message(STATUS "")
  2032   message(STATUS "    -DARMNEON=OFF")
  2033 endif()
  2034 
  2035 # Ensure that the extra cflags are used at compile time
  2036 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS}")
  2037 
  2038 # Always build SDLmain
  2039 add_library(SDL2main STATIC ${SDLMAIN_SOURCES})
  2040 target_include_directories(SDL2main PUBLIC "$<BUILD_INTERFACE:${SDL2_SOURCE_DIR}/include>" $<INSTALL_INTERFACE:include> $<INSTALL_INTERFACE:include/SDL2>)
  2041 set(_INSTALL_LIBS "SDL2main")
  2042 if (NOT ANDROID)
  2043   set_target_properties(SDL2main PROPERTIES DEBUG_POSTFIX "${SDL_CMAKE_DEBUG_POSTFIX}")
  2044 endif()
  2045 
  2046 if (ANDROID AND HAVE_HIDAPI)
  2047   set(_INSTALL_LIBS ${_INSTALL_LIBS} "hidapi")
  2048 endif()
  2049 
  2050 if(SDL_SHARED)
  2051   add_library(SDL2 SHARED ${SOURCE_FILES} ${VERSION_SOURCES})
  2052   if(APPLE)
  2053     set_target_properties(SDL2 PROPERTIES
  2054       MACOSX_RPATH 1
  2055       OUTPUT_NAME "SDL2-${LT_RELEASE}")
  2056   elseif(UNIX AND NOT ANDROID)
  2057     set_target_properties(SDL2 PROPERTIES
  2058       VERSION ${LT_VERSION}
  2059       SOVERSION ${LT_REVISION}
  2060       OUTPUT_NAME "SDL2-${LT_RELEASE}")
  2061   else()
  2062     set_target_properties(SDL2 PROPERTIES
  2063       VERSION ${SDL_VERSION}
  2064       SOVERSION ${LT_REVISION}
  2065       OUTPUT_NAME "SDL2")
  2066   endif()
  2067   if(MSVC AND NOT LIBC)
  2068     # Don't try to link with the default set of libraries.
  2069     set_target_properties(SDL2 PROPERTIES LINK_FLAGS_RELEASE "/NODEFAULTLIB")
  2070     set_target_properties(SDL2 PROPERTIES LINK_FLAGS_DEBUG "/NODEFAULTLIB")
  2071     set_target_properties(SDL2 PROPERTIES STATIC_LIBRARY_FLAGS "/NODEFAULTLIB")
  2072   endif()
  2073   set(_INSTALL_LIBS "SDL2" ${_INSTALL_LIBS})
  2074   target_link_libraries(SDL2 ${EXTRA_LIBS} ${EXTRA_LDFLAGS})
  2075   target_include_directories(SDL2 PUBLIC "$<BUILD_INTERFACE:${SDL2_SOURCE_DIR}/include>" $<INSTALL_INTERFACE:include> $<INSTALL_INTERFACE:include/SDL2>)
  2076   if (NOT ANDROID)
  2077     set_target_properties(SDL2 PROPERTIES DEBUG_POSTFIX "${SDL_CMAKE_DEBUG_POSTFIX}")
  2078   endif()
  2079   if(IOS OR TVOS)
  2080     set_property(TARGET SDL2 APPEND_STRING PROPERTY COMPILE_FLAGS "-fobjc-arc")
  2081     target_compile_definitions(SDL2 PRIVATE IOS_DYLIB=1)
  2082   endif()
  2083 endif()
  2084 
  2085 if(ANDROID)
  2086   if(HAVE_HIDAPI)
  2087     add_library(hidapi SHARED ${SDL2_SOURCE_DIR}/src/hidapi/android/hid.cpp)
  2088   endif()
  2089 
  2090   if(MSVC AND NOT LIBC)
  2091     # Don't try to link with the default set of libraries.
  2092     set_target_properties(hidapi PROPERTIES LINK_FLAGS_RELEASE "/NODEFAULTLIB")
  2093     set_target_properties(hidapi PROPERTIES LINK_FLAGS_DEBUG "/NODEFAULTLIB")
  2094     set_target_properties(hidapi PROPERTIES STATIC_LIBRARY_FLAGS "/NODEFAULTLIB")
  2095   endif()
  2096   if(HAVE_HIDAPI)
  2097     target_link_libraries(hidapi log)
  2098   endif()
  2099 endif()
  2100 
  2101 if(SDL_STATIC)
  2102   set (BUILD_SHARED_LIBS FALSE)
  2103   add_library(SDL2-static STATIC ${SOURCE_FILES})
  2104   if (NOT SDL_SHARED OR NOT WIN32)
  2105     set_target_properties(SDL2-static PROPERTIES OUTPUT_NAME "SDL2")
  2106     # Note: Apparently, OUTPUT_NAME must really be unique; even when
  2107     # CMAKE_IMPORT_LIBRARY_SUFFIX or the like are given. Otherwise
  2108     # the static build may race with the import lib and one will get
  2109     # clobbered, when the suffix is realized via subsequent rename.
  2110   endif()
  2111   set_target_properties(SDL2-static PROPERTIES POSITION_INDEPENDENT_CODE ${SDL_STATIC_PIC})
  2112   if(MSVC AND NOT LIBC)
  2113     set_target_properties(SDL2-static PROPERTIES LINK_FLAGS_RELEASE "/NODEFAULTLIB")
  2114     set_target_properties(SDL2-static PROPERTIES LINK_FLAGS_DEBUG "/NODEFAULTLIB")
  2115     set_target_properties(SDL2-static PROPERTIES STATIC_LIBRARY_FLAGS "/NODEFAULTLIB")
  2116   endif()
  2117   # TODO: Win32 platforms keep the same suffix .lib for import and static
  2118   # libraries - do we need to consider this?
  2119   set(_INSTALL_LIBS "SDL2-static" ${_INSTALL_LIBS})
  2120   target_link_libraries(SDL2-static ${EXTRA_LIBS} ${EXTRA_LDFLAGS})
  2121   target_include_directories(SDL2-static PUBLIC "$<BUILD_INTERFACE:${SDL2_SOURCE_DIR}/include>" $<INSTALL_INTERFACE:include> $<INSTALL_INTERFACE:include/SDL2>)
  2122   if (NOT ANDROID)
  2123     set_target_properties(SDL2-static PROPERTIES DEBUG_POSTFIX "${SDL_CMAKE_DEBUG_POSTFIX}")
  2124   endif()
  2125   if(IOS OR TVOS)
  2126     set_property(TARGET SDL2-static APPEND_STRING PROPERTY COMPILE_FLAGS "-fobjc-arc")
  2127   endif()
  2128 endif()
  2129 
  2130 ##### Tests #####
  2131 
  2132 if(SDL_TEST)
  2133   file(GLOB TEST_SOURCES ${SDL2_SOURCE_DIR}/src/test/*.c)
  2134   add_library(SDL2_test STATIC ${TEST_SOURCES})
  2135 
  2136   add_subdirectory(test)
  2137 endif()
  2138 
  2139 ##### Installation targets #####
  2140 install(TARGETS ${_INSTALL_LIBS} EXPORT SDL2Targets
  2141   LIBRARY DESTINATION "lib${LIB_SUFFIX}"
  2142   ARCHIVE DESTINATION "lib${LIB_SUFFIX}"
  2143   RUNTIME DESTINATION bin)
  2144 
  2145 ##### Export files #####
  2146 if (WINDOWS)
  2147   set(PKG_PREFIX "cmake")
  2148 else ()
  2149   set(PKG_PREFIX "lib${LIB_SUFFIX}/cmake/SDL2")
  2150 endif ()
  2151 
  2152 include(CMakePackageConfigHelpers)
  2153 write_basic_package_version_file("${CMAKE_BINARY_DIR}/SDL2ConfigVersion.cmake"
  2154   VERSION ${SDL_VERSION}
  2155   COMPATIBILITY AnyNewerVersion
  2156 )
  2157 
  2158 install(EXPORT SDL2Targets
  2159   FILE SDL2Targets.cmake
  2160   NAMESPACE SDL2::
  2161   DESTINATION ${PKG_PREFIX}
  2162 )
  2163 install(
  2164   FILES
  2165     ${CMAKE_CURRENT_SOURCE_DIR}/SDL2Config.cmake
  2166     ${CMAKE_BINARY_DIR}/SDL2ConfigVersion.cmake
  2167   DESTINATION ${PKG_PREFIX}
  2168   COMPONENT Devel
  2169 )
  2170 
  2171 file(GLOB INCLUDE_FILES ${SDL2_SOURCE_DIR}/include/*.h)
  2172 file(GLOB BIN_INCLUDE_FILES ${SDL2_BINARY_DIR}/include/*.h)
  2173 foreach(_FNAME ${BIN_INCLUDE_FILES})
  2174   get_filename_component(_INCNAME ${_FNAME} NAME)
  2175   list(REMOVE_ITEM INCLUDE_FILES ${SDL2_SOURCE_DIR}/include/${_INCNAME})
  2176 endforeach()
  2177 list(APPEND INCLUDE_FILES ${BIN_INCLUDE_FILES})
  2178 install(FILES ${INCLUDE_FILES} DESTINATION include/SDL2)
  2179 
  2180 string(TOUPPER "${CMAKE_BUILD_TYPE}" UPPER_BUILD_TYPE)
  2181 if (UPPER_BUILD_TYPE MATCHES DEBUG)
  2182   set(SOPOSTFIX "${SDL_CMAKE_DEBUG_POSTFIX}")
  2183 else()
  2184   set(SOPOSTFIX "")
  2185 endif()
  2186 
  2187 if(NOT (WINDOWS OR CYGWIN))
  2188   if(SDL_SHARED)
  2189     set(SOEXT ${CMAKE_SHARED_LIBRARY_SUFFIX}) # ".so", ".dylib", etc.
  2190     get_target_property(SONAME SDL2 OUTPUT_NAME)
  2191     if(NOT ANDROID)
  2192         install(CODE "
  2193           execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink
  2194             \"lib${SONAME}${SOPOSTFIX}${SOEXT}\" \"libSDL2${SOPOSTFIX}${SOEXT}\"
  2195             WORKING_DIRECTORY \"${SDL2_BINARY_DIR}\")")
  2196         install(FILES ${SDL2_BINARY_DIR}/libSDL2${SOPOSTFIX}${SOEXT} DESTINATION "lib${LIB_SUFFIX}")
  2197     endif()
  2198   endif()
  2199   if(FREEBSD)
  2200     # FreeBSD uses ${PREFIX}/libdata/pkgconfig
  2201     install(FILES ${SDL2_BINARY_DIR}/sdl2.pc DESTINATION "libdata/pkgconfig")
  2202   else()
  2203     install(FILES ${SDL2_BINARY_DIR}/sdl2.pc
  2204       DESTINATION "lib${LIB_SUFFIX}/pkgconfig")
  2205   endif()
  2206   install(PROGRAMS ${SDL2_BINARY_DIR}/sdl2-config DESTINATION bin)
  2207   # TODO: what about the .spec file? Is it only needed for RPM creation?
  2208   install(FILES "${SDL2_SOURCE_DIR}/sdl2.m4" DESTINATION "${CMAKE_INSTALL_FULL_DATAROOTDIR}/aclocal")
  2209 endif()
  2210 
  2211 ##### Uninstall target #####
  2212 
  2213 if(NOT TARGET uninstall)
  2214   configure_file(
  2215       "${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake.in"
  2216       "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
  2217       IMMEDIATE @ONLY)
  2218 
  2219   add_custom_target(uninstall
  2220       COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake)
  2221 endif()