CMakeLists.txt
author David Ludwig
Tue, 27 Aug 2019 11:07:43 -0400
changeset 13083 6d31d5218c2c
parent 13079 82de37dd809d
child 13084 c3880ebab198
permissions -rw-r--r--
CMake: iOS support added

When using a recent version of CMake (3.14+), this should make it possible to:
- build SDL for iOS, both static and dynamic
- build SDL test apps (as iOS .app bundles)
- generate a working SDL_config.h for iOS (using SDL_config.h.cmake as a basis)

To use, set the following CMake variables when running CMake's configuration stage:
- CMAKE_SYSTEM_NAME=iOS
- CMAKE_OSX_SYSROOT=<SDK> (examples: iphoneos, iphonesimulator, iphoneos12.4, /full/path/to/iPhoneOS.sdk, etc.)
- CMAKE_OSX_ARCHITECTURES=<semicolon-separated list of CPU architectures> (example: "arm64;armv7s")

Examples:
- for Simulator, using the latest, installed SDK:
cmake path/to/SDL -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_SYSROOT=iphonesimulator -DCMAKE_OSX_ARCHITECTURES=x86_64

- for Device, using the latest, installed SDK, 64-bit only
cmake path/to/SDL -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_SYSROOT=iphoneos -DCMAKE_OSX_ARCHITECTURES=arm64

- for Device, using the latest, installed SDK, mixed 32/64 bit
cmake path/to/SDL -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_SYSROOT=iphoneos -DCMAKE_OSX_ARCHITECTURES="arm64;armv7s"

- for Device, using a specific SDK revision (iOS 12.4, in this example):
cmake path/to/SDL -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_SYSROOT=iphoneos12.4 -DCMAKE_OSX_ARCHITECTURES=arm64

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