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