CMakeLists.txt
author Sam Lantinga
Mon, 18 Nov 2019 11:44:51 -0800
changeset 13255 3ea086e43015
parent 13186 9bf7f9ba2bf4
child 13262 d6decc5d2464
permissions -rw-r--r--
Added identifiers for the Xbox One Elite Series 2 controller
     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 wcscmp
   764             strlen _strrev _strupr _strlwr strchr strrchr strstr itoa _ltoa
   765             _ultoa strtol strtoul strtoll strtod atoi atof strcmp strncmp
   766             _stricmp _strnicmp 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 itoa _ltoa
   801             _uitoa _ultoa strtol strtoul _i64toa _ui64toa strtoll strtoull
   802             atoi atof strcmp strncmp _stricmp strcasecmp _strnicmp strncasecmp
   803             vsscanf vsnprintf fopen64 fseeko fseeko64 sigaction setjmp
   804             nanosleep sysconf sysctlbyname getauxval poll _Exit
   805             )
   806       string(TOUPPER ${_FN} _UPPER)
   807       set(_HAVEVAR "HAVE_${_UPPER}")
   808       check_function_exists("${_FN}" ${_HAVEVAR})
   809     endforeach()
   810 
   811     check_library_exists(m pow "" HAVE_LIBM)
   812     if(HAVE_LIBM)
   813       set(CMAKE_REQUIRED_LIBRARIES m)
   814       foreach(_FN
   815               atan atan2 ceil copysign cos cosf fabs floor log pow scalbn sin
   816               sinf sqrt sqrtf tan tanf acos asin)
   817         string(TOUPPER ${_FN} _UPPER)
   818         set(_HAVEVAR "HAVE_${_UPPER}")
   819         check_function_exists("${_FN}" ${_HAVEVAR})
   820       endforeach()
   821       set(CMAKE_REQUIRED_LIBRARIES)
   822       list(APPEND EXTRA_LIBS m)
   823     endif()
   824 
   825     check_library_exists(iconv iconv_open "" HAVE_LIBICONV)
   826     if(HAVE_LIBICONV)
   827       list(APPEND EXTRA_LIBS iconv)
   828       set(HAVE_ICONV 1)
   829     endif()
   830 
   831     if(NOT APPLE)
   832       check_include_file(alloca.h HAVE_ALLOCA_H)
   833       check_function_exists(alloca HAVE_ALLOCA)
   834     else()
   835       set(HAVE_ALLOCA_H 1)
   836       set(HAVE_ALLOCA 1)
   837     endif()
   838 
   839     check_struct_has_member("struct sigaction" "sa_sigaction" "signal.h" HAVE_SA_SIGACTION)
   840   endif()
   841 else()
   842   if(WINDOWS)
   843     set(HAVE_STDARG_H 1)
   844     set(HAVE_STDDEF_H 1)
   845   endif()
   846 endif()
   847 
   848 
   849 # Enable/disable various subsystems of the SDL library
   850 foreach(_SUB ${SDL_SUBSYSTEMS})
   851   string(TOUPPER ${_SUB} _OPT)
   852   if(NOT SDL_${_OPT})
   853     set(SDL_${_OPT}_DISABLED 1)
   854   endif()
   855 endforeach()
   856 if(SDL_JOYSTICK)
   857   file(GLOB JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/*.c)
   858   set(SOURCE_FILES ${SOURCE_FILES} ${JOYSTICK_SOURCES})
   859 endif()
   860 if(SDL_HAPTIC)
   861   if(NOT SDL_JOYSTICK)
   862     # Haptic requires some private functions from the joystick subsystem.
   863     message_error("SDL_HAPTIC requires SDL_JOYSTICK, which is not enabled")
   864   endif()
   865   file(GLOB HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/*.c)
   866   set(SOURCE_FILES ${SOURCE_FILES} ${HAPTIC_SOURCES})
   867 endif()
   868 if(SDL_SENSOR)
   869   file(GLOB SENSOR_SOURCES ${SDL2_SOURCE_DIR}/src/sensor/*.c)
   870   set(SOURCE_FILES ${SOURCE_FILES} ${SENSOR_SOURCES})
   871 endif()
   872 if(SDL_POWER)
   873   file(GLOB POWER_SOURCES ${SDL2_SOURCE_DIR}/src/power/*.c)
   874   set(SOURCE_FILES ${SOURCE_FILES} ${POWER_SOURCES})
   875 endif()
   876 # TODO: in configure.ac, the test for LOADSO and SDL_DLOPEN is a bit weird:
   877 # if LOADSO is not wanted, SDL_LOADSO_DISABLED is set
   878 # If however on Unix or APPLE dlopen() is detected via CheckDLOPEN(),
   879 # SDL_LOADSO_DISABLED will not be set, regardless of the LOADSO settings
   880 
   881 # General SDL subsystem options, valid for all platforms
   882 if(SDL_AUDIO)
   883   # CheckDummyAudio/CheckDiskAudio - valid for all platforms
   884   if(DUMMYAUDIO)
   885     set(SDL_AUDIO_DRIVER_DUMMY 1)
   886     file(GLOB DUMMYAUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/dummy/*.c)
   887     set(SOURCE_FILES ${SOURCE_FILES} ${DUMMYAUDIO_SOURCES})
   888     set(HAVE_DUMMYAUDIO TRUE)
   889   endif()
   890   if(DISKAUDIO)
   891     set(SDL_AUDIO_DRIVER_DISK 1)
   892     file(GLOB DISKAUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/disk/*.c)
   893     set(SOURCE_FILES ${SOURCE_FILES} ${DISKAUDIO_SOURCES})
   894     set(HAVE_DISKAUDIO TRUE)
   895   endif()
   896 endif()
   897 
   898 if(SDL_DLOPEN)
   899   # Relevant for Unix/Darwin only
   900   if(UNIX OR APPLE)
   901     CheckDLOPEN()
   902   endif()
   903 endif()
   904 
   905 if(SDL_VIDEO)
   906   if(VIDEO_DUMMY)
   907     set(SDL_VIDEO_DRIVER_DUMMY 1)
   908     file(GLOB VIDEO_DUMMY_SOURCES ${SDL2_SOURCE_DIR}/src/video/dummy/*.c)
   909     set(SOURCE_FILES ${SOURCE_FILES} ${VIDEO_DUMMY_SOURCES})
   910     set(HAVE_VIDEO_DUMMY TRUE)
   911     set(HAVE_SDL_VIDEO TRUE)
   912   endif()
   913   if(VIDEO_OFFSCREEN)
   914     set(SDL_VIDEO_DRIVER_OFFSCREEN 1)
   915     file(GLOB VIDEO_OFFSCREEN_SOURCES ${SDL2_SOURCE_DIR}/src/video/offscreen/*.c)
   916     set(SOURCE_FILES ${SOURCE_FILES} ${VIDEO_OFFSCREEN_SOURCES})
   917     set(HAVE_VIDEO_OFFSCREEN TRUE)
   918     set(HAVE_SDL_VIDEO TRUE)
   919   endif()
   920 endif()
   921 
   922 # Platform-specific options and settings
   923 if(ANDROID)
   924   file(GLOB ANDROID_CORE_SOURCES ${SDL2_SOURCE_DIR}/src/core/android/*.c)
   925   set(SOURCE_FILES ${SOURCE_FILES} ${ANDROID_CORE_SOURCES})
   926 
   927   # SDL_spinlock.c Needs to be compiled in ARM mode.
   928   # There seems to be no better way currently to set the ARM mode.
   929   # see: https://issuetracker.google.com/issues/62264618
   930   # Another option would be to set ARM mode to all compiled files
   931   check_c_compiler_flag(-marm HAVE_ARM_MODE)
   932   if(HAVE_ARM_MODE)
   933     set_source_files_properties(${SDL2_SOURCE_DIR}/src/atomic/SDL_spinlock.c PROPERTIES COMPILE_FLAGS -marm)
   934   endif()
   935 
   936   file(GLOB ANDROID_MAIN_SOURCES ${SDL2_SOURCE_DIR}/src/main/android/*.c)
   937   set(SDLMAIN_SOURCES ${SDLMAIN_SOURCES} ${ANDROID_MAIN_SOURCES})
   938 
   939   if(SDL_AUDIO)
   940     set(SDL_AUDIO_DRIVER_ANDROID 1)
   941     file(GLOB ANDROID_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/android/*.c)
   942     set(SOURCE_FILES ${SOURCE_FILES} ${ANDROID_AUDIO_SOURCES})
   943     set(HAVE_SDL_AUDIO TRUE)
   944   endif()
   945   if(SDL_FILESYSTEM)
   946     set(SDL_FILESYSTEM_ANDROID 1)
   947     file(GLOB ANDROID_FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/android/*.c)
   948     set(SOURCE_FILES ${SOURCE_FILES} ${ANDROID_FILESYSTEM_SOURCES})
   949     set(HAVE_SDL_FILESYSTEM TRUE)
   950   endif()
   951   if(SDL_HAPTIC)
   952     set(SDL_HAPTIC_ANDROID 1)
   953     file(GLOB ANDROID_HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/android/*.c)
   954     set(SOURCE_FILES ${SOURCE_FILES} ${ANDROID_HAPTIC_SOURCES})
   955     set(HAVE_SDL_HAPTIC TRUE)
   956   endif()
   957   if(SDL_JOYSTICK)
   958     CheckHIDAPI()
   959     set(SDL_JOYSTICK_ANDROID 1)
   960     file(GLOB ANDROID_JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/android/*.c ${SDL2_SOURCE_DIR}/src/joystick/steam/*.c)
   961     set(SOURCE_FILES ${SOURCE_FILES} ${ANDROID_JOYSTICK_SOURCES})
   962     set(HAVE_SDL_JOYSTICK TRUE)
   963   endif()
   964   if(SDL_LOADSO)
   965     set(SDL_LOADSO_DLOPEN 1)
   966     file(GLOB LOADSO_SOURCES ${SDL2_SOURCE_DIR}/src/loadso/dlopen/*.c)
   967     set(SOURCE_FILES ${SOURCE_FILES} ${LOADSO_SOURCES})
   968     set(HAVE_SDL_LOADSO TRUE)
   969   endif()
   970   if(SDL_POWER)
   971     set(SDL_POWER_ANDROID 1)
   972     file(GLOB ANDROID_POWER_SOURCES ${SDL2_SOURCE_DIR}/src/power/android/*.c)
   973     set(SOURCE_FILES ${SOURCE_FILES} ${ANDROID_POWER_SOURCES})
   974     set(HAVE_SDL_POWER TRUE)
   975   endif()
   976   if(SDL_TIMERS)
   977     set(SDL_TIMER_UNIX 1)
   978     file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/unix/*.c)
   979     set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES})
   980     set(HAVE_SDL_TIMERS TRUE)
   981   endif()
   982   if(SDL_SENSOR)
   983     set(SDL_SENSOR_ANDROID 1)
   984     set(HAVE_SDL_SENSORS TRUE)
   985     file(GLOB ANDROID_SENSOR_SOURCES ${SDL2_SOURCE_DIR}/src/sensor/android/*.c)
   986     set(SOURCE_FILES ${SOURCE_FILES} ${ANDROID_SENSOR_SOURCES})
   987   endif()
   988   if(SDL_VIDEO)
   989     set(SDL_VIDEO_DRIVER_ANDROID 1)
   990     file(GLOB ANDROID_VIDEO_SOURCES ${SDL2_SOURCE_DIR}/src/video/android/*.c)
   991     set(SOURCE_FILES ${SOURCE_FILES} ${ANDROID_VIDEO_SOURCES})
   992     set(HAVE_SDL_VIDEO TRUE)
   993 
   994     # Core stuff
   995     # find_library(ANDROID_DL_LIBRARY dl)
   996     # FIXME failing dlopen https://github.com/android-ndk/ndk/issues/929
   997     find_library(ANDROID_DL_LIBRARY NAMES libdl.so dl)
   998     find_library(ANDROID_LOG_LIBRARY log)
   999     find_library(ANDROID_LIBRARY_LIBRARY android)
  1000     list(APPEND EXTRA_LIBS ${ANDROID_DL_LIBRARY} ${ANDROID_LOG_LIBRARY} ${ANDROID_LIBRARY_LIBRARY})
  1001     add_definitions(-DGL_GLEXT_PROTOTYPES)
  1002 
  1003     if (HAVE_HIDAPI)
  1004         list(APPEND EXTRA_LIBS hidapi)
  1005     endif()
  1006 
  1007     #enable gles
  1008     if(VIDEO_OPENGLES)
  1009       set(SDL_VIDEO_OPENGL_EGL 1)
  1010       set(HAVE_VIDEO_OPENGLES TRUE)
  1011       set(SDL_VIDEO_OPENGL_ES 1)
  1012       set(SDL_VIDEO_RENDER_OGL_ES 1)
  1013       set(SDL_VIDEO_OPENGL_ES2 1)
  1014       set(SDL_VIDEO_RENDER_OGL_ES2 1)
  1015 
  1016       find_library(OpenGLES1_LIBRARY GLESv1_CM)
  1017       find_library(OpenGLES2_LIBRARY GLESv2)
  1018       list(APPEND EXTRA_LIBS ${OpenGLES1_LIBRARY} ${OpenGLES2_LIBRARY})
  1019     endif()
  1020 
  1021     CHECK_C_SOURCE_COMPILES("
  1022     #if defined(__ARM_ARCH) && __ARM_ARCH < 7
  1023     #error Vulkan doesn't work on this configuration
  1024     #endif
  1025     int main()
  1026     {
  1027         return 0;
  1028     }
  1029     " VULKAN_PASSED_ANDROID_CHECKS)
  1030     if(NOT VULKAN_PASSED_ANDROID_CHECKS)
  1031       set(VIDEO_VULKAN OFF)
  1032       message(STATUS "Vulkan doesn't work on this configuration")
  1033     endif()
  1034   endif()
  1035 
  1036   CheckPTHREAD()
  1037 
  1038 elseif(EMSCRIPTEN)
  1039   # Hide noisy warnings that intend to aid mostly during initial stages of porting a new
  1040   # project. Uncomment at will for verbose cross-compiling -I/../ path info.
  1041   add_definitions(-Wno-warn-absolute-paths)
  1042   if(SDL_AUDIO)
  1043     set(SDL_AUDIO_DRIVER_EMSCRIPTEN 1)
  1044     file(GLOB EM_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/emscripten/*.c)
  1045     set(SOURCE_FILES ${SOURCE_FILES} ${EM_AUDIO_SOURCES})
  1046     set(HAVE_SDL_AUDIO TRUE)
  1047   endif()
  1048   if(SDL_FILESYSTEM)
  1049     set(SDL_FILESYSTEM_EMSCRIPTEN 1)
  1050     file(GLOB EM_FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/emscripten/*.c)
  1051     set(SOURCE_FILES ${SOURCE_FILES} ${EM_FILESYSTEM_SOURCES})
  1052     set(HAVE_SDL_FILESYSTEM TRUE)
  1053   endif()
  1054   if(SDL_JOYSTICK)
  1055     set(SDL_JOYSTICK_EMSCRIPTEN 1)
  1056     file(GLOB EM_JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/emscripten/*.c)
  1057     set(SOURCE_FILES ${SOURCE_FILES} ${EM_JOYSTICK_SOURCES})
  1058     set(HAVE_SDL_JOYSTICK TRUE)
  1059   endif()
  1060   if(SDL_POWER)
  1061     set(SDL_POWER_EMSCRIPTEN 1)
  1062     file(GLOB EM_POWER_SOURCES ${SDL2_SOURCE_DIR}/src/power/emscripten/*.c)
  1063     set(SOURCE_FILES ${SOURCE_FILES} ${EM_POWER_SOURCES})
  1064     set(HAVE_SDL_POWER TRUE)
  1065   endif()
  1066   if(SDL_TIMERS)
  1067     set(SDL_TIMER_UNIX 1)
  1068     file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/unix/*.c)
  1069     set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES})
  1070     set(HAVE_SDL_TIMERS TRUE)
  1071 
  1072     if(CLOCK_GETTIME)
  1073       set(HAVE_CLOCK_GETTIME 1)
  1074     endif()
  1075   endif()
  1076   if(SDL_VIDEO)
  1077     set(SDL_VIDEO_DRIVER_EMSCRIPTEN 1)
  1078     file(GLOB EM_VIDEO_SOURCES ${SDL2_SOURCE_DIR}/src/video/emscripten/*.c)
  1079     set(SOURCE_FILES ${SOURCE_FILES} ${EM_VIDEO_SOURCES})
  1080     set(HAVE_SDL_VIDEO TRUE)
  1081 
  1082     #enable gles
  1083     if(VIDEO_OPENGLES)
  1084       set(SDL_VIDEO_OPENGL_EGL 1)
  1085       set(HAVE_VIDEO_OPENGLES TRUE)
  1086       set(SDL_VIDEO_OPENGL_ES2 1)
  1087       set(SDL_VIDEO_RENDER_OGL_ES2 1)
  1088     endif()
  1089   endif()
  1090 
  1091 elseif(UNIX AND NOT APPLE AND NOT ANDROID)
  1092   if(SDL_AUDIO)
  1093     if(SYSV5 OR SOLARIS OR HPUX)
  1094         set(SDL_AUDIO_DRIVER_SUNAUDIO 1)
  1095         file(GLOB SUN_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/sun/*.c)
  1096         set(SOURCE_FILES ${SOURCE_FILES} ${SUN_AUDIO_SOURCES})
  1097         set(HAVE_SDL_AUDIO TRUE)
  1098     elseif(NETBSD)
  1099         set(SDL_AUDIO_DRIVER_NETBSD 1)
  1100         file(GLOB NETBSD_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/netbsd/*.c)
  1101         set(SOURCE_FILES ${SOURCE_FILES} ${NETBSD_AUDIO_SOURCES})
  1102         set(HAVE_SDL_AUDIO TRUE)
  1103     elseif(AIX)
  1104         set(SDL_AUDIO_DRIVER_PAUDIO 1)
  1105         file(GLOB AIX_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/paudio/*.c)
  1106         set(SOURCE_FILES ${SOURCE_FILES} ${AIX_AUDIO_SOURCES})
  1107         set(HAVE_SDL_AUDIO TRUE)
  1108     endif()
  1109     CheckOSS()
  1110     CheckALSA()
  1111     CheckJACK()
  1112     CheckPulseAudio()
  1113     CheckESD()
  1114     CheckARTS()
  1115     CheckNAS()
  1116     CheckSNDIO()
  1117     CheckFusionSound()
  1118     CheckLibSampleRate()
  1119   endif()
  1120 
  1121   if(SDL_VIDEO)
  1122     # Need to check for Raspberry PI first and add platform specific compiler flags, otherwise the test for GLES fails!
  1123     CheckRPI()
  1124     CheckX11()
  1125     CheckDirectFB()
  1126     CheckOpenGLX11()
  1127     CheckOpenGLESX11()
  1128     CheckWayland()
  1129     CheckVivante()
  1130     CheckKMSDRM()
  1131   endif()
  1132 
  1133   if(UNIX)
  1134     file(GLOB CORE_UNIX_SOURCES ${SDL2_SOURCE_DIR}/src/core/unix/*.c)
  1135     set(SOURCE_FILES ${SOURCE_FILES} ${CORE_UNIX_SOURCES})
  1136   endif()
  1137 
  1138   if(LINUX)
  1139     check_c_source_compiles("
  1140         #include <linux/input.h>
  1141         #ifndef EVIOCGNAME
  1142         #error EVIOCGNAME() ioctl not available
  1143         #endif
  1144         int main(int argc, char** argv) {}" HAVE_INPUT_EVENTS)
  1145 
  1146     check_c_source_compiles("
  1147         #include <linux/kd.h>
  1148         #include <linux/keyboard.h>
  1149 
  1150         int main(int argc, char **argv)
  1151         {
  1152             struct kbentry kbe;
  1153             kbe.kb_table = KG_CTRL;
  1154             ioctl(0, KDGKBENT, &kbe);
  1155         }" HAVE_INPUT_KD)
  1156 
  1157     file(GLOB CORE_LINUX_SOURCES ${SDL2_SOURCE_DIR}/src/core/linux/*.c)
  1158     set(SOURCE_FILES ${SOURCE_FILES} ${CORE_LINUX_SOURCES})
  1159 
  1160     if(HAVE_INPUT_EVENTS)
  1161       set(SDL_INPUT_LINUXEV 1)
  1162     endif()
  1163 
  1164     if(SDL_HAPTIC AND HAVE_INPUT_EVENTS)
  1165       set(SDL_HAPTIC_LINUX 1)
  1166       file(GLOB HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/linux/*.c)
  1167       set(SOURCE_FILES ${SOURCE_FILES} ${HAPTIC_SOURCES})
  1168       set(HAVE_SDL_HAPTIC TRUE)
  1169     endif()
  1170 
  1171     if(HAVE_INPUT_KD)
  1172       set(SDL_INPUT_LINUXKD 1)
  1173     endif()
  1174 
  1175     check_include_file("libudev.h" HAVE_LIBUDEV_H)
  1176 
  1177     if(PKG_CONFIG_FOUND)
  1178       pkg_search_module(DBUS dbus-1 dbus)
  1179       if(DBUS_FOUND)
  1180         set(HAVE_DBUS_DBUS_H TRUE)
  1181         include_directories(${DBUS_INCLUDE_DIRS})
  1182         list(APPEND EXTRA_LIBS ${DBUS_LIBRARIES})
  1183       endif()
  1184 
  1185       pkg_search_module(IBUS ibus-1.0 ibus)
  1186       if(IBUS_FOUND)
  1187         set(HAVE_IBUS_IBUS_H TRUE)
  1188         include_directories(${IBUS_INCLUDE_DIRS})
  1189         list(APPEND EXTRA_LIBS ${IBUS_LIBRARIES})
  1190         add_definitions(-DSDL_USE_IME)
  1191       endif()
  1192       if(HAVE_LIBUNWIND_H)
  1193         # We've already found the header, so REQUIRE the lib to be present
  1194         pkg_search_module(UNWIND REQUIRED libunwind)
  1195         pkg_search_module(UNWIND_GENERIC REQUIRED libunwind-generic)
  1196         list(APPEND EXTRA_LIBS ${UNWIND_LIBRARIES} ${UNWIND_GENERIC_LIBRARIES})
  1197       endif()
  1198     endif()
  1199 
  1200     check_include_file("fcitx/frontend.h" HAVE_FCITX_FRONTEND_H)
  1201   endif()
  1202 
  1203   if(INPUT_TSLIB)
  1204     check_c_source_compiles("
  1205         #include \"tslib.h\"
  1206         int main(int argc, char** argv) { }" HAVE_INPUT_TSLIB)
  1207     if(HAVE_INPUT_TSLIB)
  1208       set(SDL_INPUT_TSLIB 1)
  1209       list(APPEND EXTRA_LIBS ts)
  1210     endif()
  1211   endif()
  1212 
  1213   if(SDL_JOYSTICK)
  1214     if(FREEBSD OR NETBSD OR OPENBSD OR BSDI)
  1215       CheckUSBHID()
  1216     endif()
  1217     CheckHIDAPI()
  1218     if(LINUX AND NOT ANDROID)
  1219       set(SDL_JOYSTICK_LINUX 1)
  1220       file(GLOB JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/linux/*.c ${SDL2_SOURCE_DIR}/src/joystick/steam/*.c)
  1221       set(SOURCE_FILES ${SOURCE_FILES} ${JOYSTICK_SOURCES})
  1222       set(HAVE_SDL_JOYSTICK TRUE)
  1223     endif()
  1224   endif()
  1225 
  1226   CheckPTHREAD()
  1227 
  1228   if(CLOCK_GETTIME)
  1229     check_library_exists(rt clock_gettime "" FOUND_CLOCK_GETTIME)
  1230     if(FOUND_CLOCK_GETTIME)
  1231       list(APPEND EXTRA_LIBS rt)
  1232       set(HAVE_CLOCK_GETTIME 1)
  1233     else()
  1234       check_library_exists(c clock_gettime "" FOUND_CLOCK_GETTIME)
  1235       if(FOUND_CLOCK_GETTIME)
  1236         set(HAVE_CLOCK_GETTIME 1)
  1237       endif()
  1238     endif()
  1239   endif()
  1240 
  1241   check_include_file(linux/version.h HAVE_LINUX_VERSION_H)
  1242   if(HAVE_LINUX_VERSION_H)
  1243     set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DHAVE_LINUX_VERSION_H")
  1244   endif()
  1245 
  1246   if(SDL_POWER)
  1247     if(LINUX)
  1248       set(SDL_POWER_LINUX 1)
  1249       file(GLOB POWER_SOURCES ${SDL2_SOURCE_DIR}/src/power/linux/*.c)
  1250       set(SOURCE_FILES ${SOURCE_FILES} ${POWER_SOURCES})
  1251       set(HAVE_SDL_POWER TRUE)
  1252     endif()
  1253   endif()
  1254 
  1255   if(SDL_FILESYSTEM)
  1256     set(SDL_FILESYSTEM_UNIX 1)
  1257     file(GLOB FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/unix/*.c)
  1258     set(SOURCE_FILES ${SOURCE_FILES} ${FILESYSTEM_SOURCES})
  1259     set(HAVE_SDL_FILESYSTEM TRUE)
  1260   endif()
  1261 
  1262   if(SDL_TIMERS)
  1263     set(SDL_TIMER_UNIX 1)
  1264     file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/unix/*.c)
  1265     set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES})
  1266     set(HAVE_SDL_TIMERS TRUE)
  1267   endif()
  1268 
  1269   if(RPATH)
  1270     set(SDL_RLD_FLAGS "")
  1271     if(BSDI OR FREEBSD OR LINUX OR NETBSD)
  1272       set(CMAKE_REQUIRED_FLAGS "-Wl,--enable-new-dtags")
  1273       check_c_compiler_flag("" HAVE_ENABLE_NEW_DTAGS)
  1274       set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS})
  1275       if(HAVE_ENABLE_NEW_DTAGS)
  1276         set(SDL_RLD_FLAGS "-Wl,-rpath,\${libdir} -Wl,--enable-new-dtags")
  1277       else()
  1278         set(SDL_RLD_FLAGS "-Wl,-rpath,\${libdir}")
  1279       endif()
  1280     elseif(SOLARIS)
  1281       set(SDL_RLD_FLAGS "-R\${libdir}")
  1282     endif()
  1283     set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)
  1284     set(HAVE_RPATH TRUE)
  1285   endif()
  1286 
  1287 elseif(WINDOWS)
  1288   find_program(WINDRES windres)
  1289 
  1290   check_c_source_compiles("
  1291     #include <windows.h>
  1292     int main(int argc, char **argv) { }" HAVE_WIN32_CC)
  1293 
  1294   file(GLOB CORE_SOURCES ${SDL2_SOURCE_DIR}/src/core/windows/*.c)
  1295   set(SOURCE_FILES ${SOURCE_FILES} ${CORE_SOURCES})
  1296 
  1297   if(MSVC)
  1298     # Prevent codegen that would use the VC runtime libraries.
  1299     set_property(DIRECTORY . APPEND PROPERTY COMPILE_OPTIONS "/GS-")
  1300     if(NOT ARCH_64)
  1301       set_property(DIRECTORY . APPEND PROPERTY COMPILE_OPTIONS "/arch:SSE")
  1302     endif()
  1303   endif()
  1304 
  1305   # Check for DirectX
  1306   if(DIRECTX)
  1307     if(DEFINED MSVC_VERSION AND NOT ${MSVC_VERSION} LESS 1700)
  1308         set(USE_WINSDK_DIRECTX TRUE)
  1309     endif()
  1310     if(NOT CMAKE_COMPILER_IS_MINGW AND NOT USE_WINSDK_DIRECTX)
  1311       if("$ENV{DXSDK_DIR}" STREQUAL "")
  1312         message_error("DIRECTX requires the \$DXSDK_DIR environment variable to be set")
  1313       endif()
  1314       set(CMAKE_REQUIRED_FLAGS "/I\"$ENV{DXSDK_DIR}\\Include\"")
  1315     endif()
  1316 
  1317     if(HAVE_WIN32_CC)
  1318       # xinput.h may need windows.h, but doesn't include it itself.
  1319       check_c_source_compiles("
  1320         #include <windows.h>
  1321         #include <xinput.h>
  1322         int main(int argc, char **argv) { }" HAVE_XINPUT_H)
  1323       check_c_source_compiles("
  1324         #include <windows.h>
  1325         #include <xinput.h>
  1326         XINPUT_GAMEPAD_EX x1;
  1327         int main(int argc, char **argv) { }" HAVE_XINPUT_GAMEPAD_EX)
  1328       check_c_source_compiles("
  1329         #include <windows.h>
  1330         #include <xinput.h>
  1331         XINPUT_STATE_EX s1;
  1332         int main(int argc, char **argv) { }" HAVE_XINPUT_STATE_EX)
  1333     else()
  1334       check_include_file(xinput.h HAVE_XINPUT_H)
  1335     endif()
  1336 
  1337     check_include_file(d3d9.h HAVE_D3D_H)
  1338     check_include_file(d3d11_1.h HAVE_D3D11_H)
  1339     check_include_file(ddraw.h HAVE_DDRAW_H)
  1340     check_include_file(dsound.h HAVE_DSOUND_H)
  1341     check_include_file(dinput.h HAVE_DINPUT_H)
  1342     check_include_file(dxgi.h HAVE_DXGI_H)
  1343     if(HAVE_D3D_H OR HAVE_D3D11_H OR HAVE_DDRAW_H OR HAVE_DSOUND_H OR HAVE_DINPUT_H)
  1344       set(HAVE_DIRECTX TRUE)
  1345       if(NOT CMAKE_COMPILER_IS_MINGW AND NOT USE_WINSDK_DIRECTX)
  1346       # TODO: change $ENV{DXSDL_DIR} to get the path from the include checks
  1347         link_directories($ENV{DXSDK_DIR}\\lib\\${PROCESSOR_ARCH})
  1348         include_directories($ENV{DXSDK_DIR}\\Include)
  1349       endif()
  1350     endif()
  1351     set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS})
  1352   endif()
  1353 
  1354   # headers needed elsewhere
  1355   check_include_file(mmdeviceapi.h HAVE_MMDEVICEAPI_H)
  1356   check_include_file(audioclient.h HAVE_AUDIOCLIENT_H)
  1357 
  1358   if(SDL_AUDIO)
  1359     set(SDL_AUDIO_DRIVER_WINMM 1)
  1360     file(GLOB WINMM_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/winmm/*.c)
  1361     set(SOURCE_FILES ${SOURCE_FILES} ${WINMM_AUDIO_SOURCES})
  1362     set(HAVE_SDL_AUDIO TRUE)
  1363 
  1364     if(HAVE_DSOUND_H)
  1365       set(SDL_AUDIO_DRIVER_DSOUND 1)
  1366       file(GLOB DSOUND_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/directsound/*.c)
  1367       set(SOURCE_FILES ${SOURCE_FILES} ${DSOUND_AUDIO_SOURCES})
  1368     endif()
  1369 
  1370     if(WASAPI AND HAVE_AUDIOCLIENT_H AND HAVE_MMDEVICEAPI_H)
  1371       set(SDL_AUDIO_DRIVER_WASAPI 1)
  1372       file(GLOB WASAPI_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/wasapi/*.c)
  1373       set(SOURCE_FILES ${SOURCE_FILES} ${WASAPI_AUDIO_SOURCES})
  1374     endif()
  1375   endif()
  1376 
  1377   if(SDL_VIDEO)
  1378     # requires SDL_LOADSO on Windows (IME, DX, etc.)
  1379     if(NOT SDL_LOADSO)
  1380       message_error("SDL_VIDEO requires SDL_LOADSO, which is not enabled")
  1381     endif()
  1382     set(SDL_VIDEO_DRIVER_WINDOWS 1)
  1383     file(GLOB WIN_VIDEO_SOURCES ${SDL2_SOURCE_DIR}/src/video/windows/*.c)
  1384     set(SOURCE_FILES ${SOURCE_FILES} ${WIN_VIDEO_SOURCES})
  1385 
  1386     if(RENDER_D3D AND HAVE_D3D_H)
  1387       set(SDL_VIDEO_RENDER_D3D 1)
  1388       set(HAVE_RENDER_D3D TRUE)
  1389     endif()
  1390     if(RENDER_D3D AND HAVE_D3D11_H)
  1391       set(SDL_VIDEO_RENDER_D3D11 1)
  1392       set(HAVE_RENDER_D3D TRUE)
  1393     endif()
  1394     set(HAVE_SDL_VIDEO TRUE)
  1395   endif()
  1396 
  1397   if(SDL_THREADS)
  1398     set(SDL_THREAD_WINDOWS 1)
  1399     set(SOURCE_FILES ${SOURCE_FILES}
  1400       ${SDL2_SOURCE_DIR}/src/thread/windows/SDL_sysmutex.c
  1401       ${SDL2_SOURCE_DIR}/src/thread/windows/SDL_syssem.c
  1402       ${SDL2_SOURCE_DIR}/src/thread/windows/SDL_systhread.c
  1403       ${SDL2_SOURCE_DIR}/src/thread/windows/SDL_systls.c
  1404       ${SDL2_SOURCE_DIR}/src/thread/generic/SDL_syscond.c)
  1405     set(HAVE_SDL_THREADS TRUE)
  1406   endif()
  1407 
  1408   if(SDL_POWER)
  1409     set(SDL_POWER_WINDOWS 1)
  1410     set(SOURCE_FILES ${SOURCE_FILES} ${SDL2_SOURCE_DIR}/src/power/windows/SDL_syspower.c)
  1411     set(HAVE_SDL_POWER TRUE)
  1412   endif()
  1413 
  1414   if(SDL_FILESYSTEM)
  1415     set(SDL_FILESYSTEM_WINDOWS 1)
  1416     file(GLOB FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/windows/*.c)
  1417     set(SOURCE_FILES ${SOURCE_FILES} ${FILESYSTEM_SOURCES})
  1418     set(HAVE_SDL_FILESYSTEM TRUE)
  1419   endif()
  1420 
  1421   # Libraries for Win32 native and MinGW
  1422   list(APPEND EXTRA_LIBS user32 gdi32 winmm imm32 ole32 oleaut32 version uuid advapi32 setupapi shell32)
  1423 
  1424   # TODO: in configure.ac the check for timers is set on
  1425   # cygwin | mingw32* - does this include mingw32CE?
  1426   if(SDL_TIMERS)
  1427     set(SDL_TIMER_WINDOWS 1)
  1428     file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/windows/*.c)
  1429     set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES})
  1430     set(HAVE_SDL_TIMERS TRUE)
  1431   endif()
  1432 
  1433   if(SDL_LOADSO)
  1434     set(SDL_LOADSO_WINDOWS 1)
  1435     file(GLOB LOADSO_SOURCES ${SDL2_SOURCE_DIR}/src/loadso/windows/*.c)
  1436     set(SOURCE_FILES ${SOURCE_FILES} ${LOADSO_SOURCES})
  1437     set(HAVE_SDL_LOADSO TRUE)
  1438   endif()
  1439 
  1440   file(GLOB CORE_SOURCES ${SDL2_SOURCE_DIR}/src/core/windows/*.c)
  1441   set(SOURCE_FILES ${SOURCE_FILES} ${CORE_SOURCES})
  1442 
  1443   if(SDL_VIDEO)
  1444     if(VIDEO_OPENGL)
  1445       set(SDL_VIDEO_OPENGL 1)
  1446       set(SDL_VIDEO_OPENGL_WGL 1)
  1447       set(SDL_VIDEO_RENDER_OGL 1)
  1448       set(HAVE_VIDEO_OPENGL TRUE)
  1449     endif()
  1450 
  1451     if(VIDEO_OPENGLES)
  1452       set(SDL_VIDEO_OPENGL_EGL 1)
  1453       set(SDL_VIDEO_OPENGL_ES2 1)
  1454       set(SDL_VIDEO_RENDER_OGL_ES2 1)
  1455       set(HAVE_VIDEO_OPENGLES TRUE)
  1456     endif()
  1457   endif()
  1458 
  1459   if(SDL_JOYSTICK)
  1460     CheckHIDAPI()
  1461     # TODO: Remove this hid.c block when SDL_hidapi.c is supported on Windows!
  1462     if(HAVE_HIDAPI)
  1463       set(SOURCE_FILES ${SOURCE_FILES} ${SDL2_SOURCE_DIR}/src/hidapi/windows/hid.c)
  1464     endif()
  1465     file(GLOB JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/windows/*.c)
  1466     set(SOURCE_FILES ${SOURCE_FILES} ${JOYSTICK_SOURCES})
  1467     if(HAVE_DINPUT_H)
  1468       set(SDL_JOYSTICK_DINPUT 1)
  1469       list(APPEND EXTRA_LIBS dinput8)
  1470       if(CMAKE_COMPILER_IS_MINGW)
  1471         list(APPEND EXTRA_LIBS dxerr8)
  1472       elseif (NOT USE_WINSDK_DIRECTX)
  1473         list(APPEND EXTRA_LIBS dxerr)
  1474       endif()
  1475     endif()
  1476     if(HAVE_XINPUT_H)
  1477       set(SDL_JOYSTICK_XINPUT 1)
  1478     endif()
  1479     if(NOT HAVE_DINPUT_H AND NOT HAVE_XINPUT_H)
  1480       set(SDL_JOYSTICK_WINMM 1)
  1481     endif()
  1482     set(HAVE_SDL_JOYSTICK TRUE)
  1483 
  1484     if(SDL_HAPTIC)
  1485       if(HAVE_DINPUT_H OR HAVE_XINPUT_H)
  1486         file(GLOB HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/windows/*.c)
  1487         if(HAVE_DINPUT_H)
  1488           set(SDL_HAPTIC_DINPUT 1)
  1489         endif()
  1490         if(HAVE_XINPUT_H)
  1491           set(SDL_HAPTIC_XINPUT 1)
  1492         endif()
  1493       else()
  1494         file(GLOB HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/dummy/*.c)
  1495         set(SDL_HAPTIC_DUMMY 1)
  1496       endif()
  1497       set(SOURCE_FILES ${SOURCE_FILES} ${HAPTIC_SOURCES})
  1498       set(HAVE_SDL_HAPTIC TRUE)
  1499     endif()
  1500   endif()
  1501 
  1502   file(GLOB VERSION_SOURCES ${SDL2_SOURCE_DIR}/src/main/windows/*.rc)
  1503   file(GLOB SDLMAIN_SOURCES ${SDL2_SOURCE_DIR}/src/main/windows/*.c)
  1504   if(MINGW OR CYGWIN)
  1505     list(APPEND EXTRA_LIBS mingw32)
  1506     list(APPEND EXTRA_LDFLAGS "-mwindows")
  1507     set(SDL_CFLAGS "${SDL_CFLAGS} -Dmain=SDL_main")
  1508     list(APPEND SDL_LIBS "-lmingw32" "-lSDL2main" "-mwindows")
  1509   endif()
  1510 
  1511 elseif(APPLE)
  1512   # TODO: rework this all for proper MacOS X, iOS and Darwin support
  1513 
  1514   # We always need these libs on macOS at the moment.
  1515   # !!! FIXME: we need Carbon for some very old API calls in
  1516   # !!! FIXME:  src/video/cocoa/SDL_cocoakeyboard.c, but we should figure out
  1517   # !!! FIXME:  how to dump those.
  1518   if(DARWIN OR MACOSX)
  1519     set(SDL_FRAMEWORK_COCOA 1)
  1520     set(SDL_FRAMEWORK_CARBON 1)
  1521   endif()
  1522   set(SDL_FRAMEWORK_FOUNDATION 1)
  1523 
  1524   # Requires the darwin file implementation
  1525   if(SDL_FILE)
  1526     file(GLOB EXTRA_SOURCES ${SDL2_SOURCE_DIR}/src/file/cocoa/*.m)
  1527     set(SOURCE_FILES ${EXTRA_SOURCES} ${SOURCE_FILES})
  1528     # !!! FIXME: modern CMake doesn't need "LANGUAGE C" for Objective-C.
  1529     set_source_files_properties(${EXTRA_SOURCES} PROPERTIES LANGUAGE C)
  1530     set(HAVE_SDL_FILE TRUE)
  1531     # !!! FIXME: why is COREVIDEO inside this if() block?
  1532     set(SDL_FRAMEWORK_COREVIDEO 1)
  1533   else()
  1534     message_error("SDL_FILE must be enabled to build on MacOS X")
  1535   endif()
  1536 
  1537   if(SDL_AUDIO)
  1538     set(SDL_AUDIO_DRIVER_COREAUDIO 1)
  1539     file(GLOB AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/coreaudio/*.m)
  1540     # !!! FIXME: modern CMake doesn't need "LANGUAGE C" for Objective-C.
  1541     set_source_files_properties(${AUDIO_SOURCES} PROPERTIES LANGUAGE C)
  1542     set(SOURCE_FILES ${SOURCE_FILES} ${AUDIO_SOURCES})
  1543     set(HAVE_SDL_AUDIO TRUE)
  1544     set(SDL_FRAMEWORK_COREAUDIO 1)
  1545     set(SDL_FRAMEWORK_AUDIOTOOLBOX 1)
  1546     set(SDL_FRAMEWORK_AVFOUNDATION 1)
  1547   endif()
  1548 
  1549   if(SDL_JOYSTICK)
  1550     CheckHIDAPI()
  1551     if(HAVE_HIDAPI)
  1552       if(IOS OR TVOS)
  1553         set(SOURCE_FILES ${SOURCE_FILES} ${SDL2_SOURCE_DIR}/src/hidapi/ios/hid.m)
  1554         set(SDL_FRAMEWORK_COREBLUETOOTH 1)
  1555       endif()
  1556     endif()
  1557     if(IOS OR TVOS)
  1558       file(GLOB JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/iphoneos/*.m ${SDL2_SOURCE_DIR}/src/joystick/steam/*.c)
  1559       set(SDL_JOYSTICK_MFI 1)
  1560       if(IOS)
  1561         set(SDL_FRAMEWORK_COREMOTION 1)
  1562       endif()
  1563       set(SDL_FRAMEWORK_GAMECONTROLLER 1)
  1564       set(HAVE_SDL_SENSORS 1)
  1565     else()
  1566       file(GLOB JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/darwin/*.c)
  1567       set(SDL_JOYSTICK_IOKIT 1)
  1568       set(SDL_FRAMEWORK_IOKIT 1)
  1569       set(SDL_FRAMEWORK_FF 1)
  1570     endif()
  1571     set(SOURCE_FILES ${SOURCE_FILES} ${JOYSTICK_SOURCES})
  1572     set(HAVE_SDL_JOYSTICK TRUE)
  1573   endif()
  1574 
  1575   if(SDL_HAPTIC)
  1576     if (IOS OR TVOS)
  1577       file(GLOB HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/dummy/*.c)
  1578       set(SDL_HAPTIC_DUMMY 1)
  1579     else()
  1580       file(GLOB HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/darwin/*.c)
  1581       set(SDL_HAPTIC_IOKIT 1)
  1582       set(SDL_FRAMEWORK_IOKIT 1)
  1583       set(SDL_FRAMEWORK_FF 1)
  1584     endif()
  1585     set(SOURCE_FILES ${SOURCE_FILES} ${HAPTIC_SOURCES})
  1586     set(HAVE_SDL_HAPTIC TRUE)
  1587     if(NOT SDL_JOYSTICK)
  1588       message(FATAL_ERROR "SDL_HAPTIC requires SDL_JOYSTICK to be enabled")
  1589     endif()
  1590   endif()
  1591 
  1592   if(SDL_POWER)
  1593     if (IOS OR TVOS)
  1594       file(GLOB POWER_SOURCES ${SDL2_SOURCE_DIR}/src/power/uikit/*.m)
  1595       set(SDL_POWER_UIKIT 1)
  1596     else()
  1597       file(GLOB POWER_SOURCES ${SDL2_SOURCE_DIR}/src/power/macosx/*.c)
  1598       set(SDL_POWER_MACOSX 1)
  1599       set(SDL_FRAMEWORK_IOKIT 1)
  1600     endif()
  1601     set(SOURCE_FILES ${SOURCE_FILES} ${POWER_SOURCES})
  1602     set(HAVE_SDL_POWER TRUE)
  1603   endif()
  1604 
  1605   if(SDL_TIMERS)
  1606     set(SDL_TIMER_UNIX 1)
  1607     file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/unix/*.c)
  1608     set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES})
  1609     set(HAVE_SDL_TIMERS TRUE)
  1610   endif(SDL_TIMERS)
  1611 
  1612   if(SDL_FILESYSTEM)
  1613     set(SDL_FILESYSTEM_COCOA 1)
  1614     file(GLOB FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/cocoa/*.m)
  1615     # !!! FIXME: modern CMake doesn't need "LANGUAGE C" for Objective-C.
  1616     set_source_files_properties(${FILESYSTEM_SOURCES} PROPERTIES LANGUAGE C)
  1617     set(SOURCE_FILES ${SOURCE_FILES} ${FILESYSTEM_SOURCES})
  1618     set(HAVE_SDL_FILESYSTEM TRUE)
  1619   endif()
  1620 
  1621   if(SDL_SENSOR)
  1622     if(IOS)
  1623       set(SDL_SENSOR_COREMOTION 1)
  1624       set(HAVE_SDL_SENSORS TRUE)
  1625       file(GLOB SENSOR_SOURCES ${SDL2_SOURCE_DIR}/src/sensor/coremotion/*.m)
  1626       set(SOURCE_FILES ${SOURCE_FILES} ${SENSOR_SOURCES})
  1627     endif()
  1628   endif()
  1629 
  1630   # iOS hack needed - http://code.google.com/p/ios-cmake/ ?
  1631   if(SDL_VIDEO)
  1632     if (IOS OR TVOS)
  1633       set(SDL_VIDEO_DRIVER_UIKIT 1)
  1634       set(SDL_FRAMEWORK_COREGRAPHICS 1)
  1635       set(SDL_FRAMEWORK_QUARTZCORE 1)
  1636       set(SDL_FRAMEWORK_UIKIT 1)
  1637       set(SDL_IPHONE_KEYBOARD 1)
  1638       set(SDL_IPHONE_LAUNCHSCREEN 1)
  1639       file(GLOB UIKITVIDEO_SOURCES ${SDL2_SOURCE_DIR}/src/video/uikit/*.m)
  1640       set(SOURCE_FILES ${SOURCE_FILES} ${UIKITVIDEO_SOURCES})
  1641     else()
  1642       CheckCOCOA()
  1643       if(VIDEO_OPENGL)
  1644         set(SDL_VIDEO_OPENGL 1)
  1645         set(SDL_VIDEO_OPENGL_CGL 1)
  1646         set(SDL_VIDEO_RENDER_OGL 1)
  1647         set(HAVE_VIDEO_OPENGL TRUE)
  1648       endif()
  1649     endif()
  1650 
  1651     if(VIDEO_OPENGLES)
  1652       if(IOS OR TVOS)
  1653         set(SDL_FRAMEWORK_OPENGLES 1)
  1654         set(SDL_VIDEO_OPENGL_ES 1)
  1655         set(SDL_VIDEO_RENDER_OGL_ES 1)
  1656       else()
  1657         set(SDL_VIDEO_OPENGL_EGL 1)
  1658       endif()
  1659       set(SDL_VIDEO_OPENGL_ES2 1)
  1660       set(SDL_VIDEO_RENDER_OGL_ES2 1)
  1661       set(HAVE_VIDEO_OPENGLES TRUE)
  1662     endif()
  1663 
  1664     if(VIDEO_VULKAN OR VIDEO_METAL OR RENDER_METAL)
  1665       set(ORIG_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
  1666       set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -x objective-c")
  1667       check_c_source_compiles("
  1668         #include <AvailabilityMacros.h>
  1669         #import <Metal/Metal.h>
  1670         #import <QuartzCore/CAMetalLayer.h>
  1671 
  1672         #if TARGET_OS_SIMULATOR || (!TARGET_CPU_X86_64 && !TARGET_CPU_ARM64)
  1673         #error Metal doesn't work on this configuration
  1674         #endif
  1675         int main()
  1676         {
  1677             return 0;
  1678         }
  1679         " HAVE_FRAMEWORK_METAL)
  1680       set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS})
  1681       if(HAVE_FRAMEWORK_METAL)
  1682         set(SDL_FRAMEWORK_METAL 1)
  1683         set(SDL_FRAMEWORK_QUARTZCORE 1)
  1684       else()
  1685         set(VIDEO_VULKAN 0)
  1686         set(VIDEO_METAL 0)
  1687         set(RENDER_METAL 0)
  1688       endif()
  1689     endif()
  1690 
  1691     if(VIDEO_METAL)
  1692       set(SDL_VIDEO_METAL 1)
  1693       set(HAVE_VIDEO_METAL TRUE)
  1694     endif()
  1695 
  1696     if(RENDER_METAL)
  1697       file(GLOB RENDER_METAL_SOURCES ${SDL2_SOURCE_DIR}/src/render/metal/*.m)
  1698       set(SOURCE_FILES ${SOURCE_FILES} ${RENDER_METAL_SOURCES})
  1699       set(SDL_VIDEO_RENDER_METAL 1)
  1700       set(HAVE_RENDER_METAL TRUE)
  1701     endif()
  1702   endif()
  1703 
  1704   # Actually load the frameworks at the end so we don't duplicate include.
  1705   if(SDL_FRAMEWORK_COREVIDEO)
  1706     find_library(COREVIDEO CoreVideo)
  1707     list(APPEND EXTRA_LIBS ${COREVIDEO})
  1708   endif()
  1709   if(SDL_FRAMEWORK_COCOA)
  1710     find_library(COCOA_LIBRARY Cocoa)
  1711     list(APPEND EXTRA_LIBS ${COCOA_LIBRARY})
  1712   endif()
  1713   if(SDL_FRAMEWORK_IOKIT)
  1714     find_library(IOKIT IOKit)
  1715     list(APPEND EXTRA_LIBS ${IOKIT})
  1716   endif()
  1717   if(SDL_FRAMEWORK_FF)
  1718     find_library(FORCEFEEDBACK ForceFeedback)
  1719     list(APPEND EXTRA_LIBS ${FORCEFEEDBACK})
  1720   endif()
  1721   if(SDL_FRAMEWORK_CARBON)
  1722     find_library(CARBON_LIBRARY Carbon)
  1723     list(APPEND EXTRA_LIBS ${CARBON_LIBRARY})
  1724   endif()
  1725   if(SDL_FRAMEWORK_COREAUDIO)
  1726     find_library(COREAUDIO CoreAudio)
  1727     list(APPEND EXTRA_LIBS ${COREAUDIO})
  1728   endif()
  1729   if(SDL_FRAMEWORK_AUDIOTOOLBOX)
  1730     find_library(AUDIOTOOLBOX AudioToolbox)
  1731     list(APPEND EXTRA_LIBS ${AUDIOTOOLBOX})
  1732   endif()
  1733   if(SDL_FRAMEWORK_AVFOUNDATION)
  1734     find_library(AVFOUNDATION AVFoundation)
  1735     list(APPEND EXTRA_LIBS ${AVFOUNDATION})
  1736   endif()
  1737   if(SDL_FRAMEWORK_COREBLUETOOTH)
  1738     find_library(COREBLUETOOTH CoreBluetooth)
  1739     list(APPEND EXTRA_LIBS ${COREBLUETOOTH})
  1740   endif()
  1741   if(SDL_FRAMEWORK_COREGRAPHICS)
  1742     find_library(COREGRAPHICS CoreGraphics)
  1743     list(APPEND EXTRA_LIBS ${COREGRAPHICS})
  1744   endif()
  1745   if(SDL_FRAMEWORK_COREMOTION)
  1746     find_library(COREMOTION CoreMotion)
  1747     list(APPEND EXTRA_LIBS ${COREMOTION})
  1748   endif()
  1749   if(SDL_FRAMEWORK_FOUNDATION)
  1750     find_library(FOUNDATION Foundation)
  1751     list(APPEND EXTRA_LIBS ${FOUNDATION})
  1752   endif()
  1753   if(SDL_FRAMEWORK_GAMECONTROLLER)
  1754     find_library(GAMECONTROLLER GameController)
  1755     list(APPEND EXTRA_LIBS ${GAMECONTROLLER})
  1756   endif()
  1757   if(SDL_FRAMEWORK_METAL)
  1758     if(IOS OR TVOS)
  1759       find_library(METAL Metal)
  1760       list(APPEND EXTRA_LIBS ${METAL})
  1761     else()
  1762       list(APPEND EXTRA_LDFLAGS "-Wl,-weak_framework,Metal")
  1763     endif()
  1764   endif()
  1765   if(SDL_FRAMEWORK_OPENGLES)
  1766     find_library(OPENGLES OpenGLES)
  1767     list(APPEND EXTRA_LIBS ${OPENGLES})
  1768   endif()
  1769   if(SDL_FRAMEWORK_QUARTZCORE)
  1770     if(IOS OR TVOS)
  1771       find_library(QUARTZCORE QuartzCore)
  1772       list(APPEND EXTRA_LIBS ${QUARTZCORE})
  1773     else()
  1774       list(APPEND EXTRA_LDFLAGS "-Wl,-weak_framework,QuartzCore")
  1775     endif()
  1776   endif()
  1777   if(SDL_FRAMEWORK_UIKIT)
  1778     find_library(UIKIT UIKit)
  1779     list(APPEND EXTRA_LIBS ${UIKIT})
  1780   endif()
  1781 
  1782   CheckPTHREAD()
  1783 
  1784 elseif(HAIKU)
  1785   if(SDL_VIDEO)
  1786     set(SDL_VIDEO_DRIVER_HAIKU 1)
  1787     file(GLOB HAIKUVIDEO_SOURCES ${SDL2_SOURCE_DIR}/src/video/haiku/*.c)
  1788     set(SOURCE_FILES ${SOURCE_FILES} ${HAIKUVIDEO_SOURCES})
  1789     set(HAVE_SDL_VIDEO TRUE)
  1790 
  1791     set(SDL_FILESYSTEM_HAIKU 1)
  1792     file(GLOB FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/haiku/*.cc)
  1793     set(SOURCE_FILES ${SOURCE_FILES} ${FILESYSTEM_SOURCES})
  1794     set(HAVE_SDL_FILESYSTEM TRUE)
  1795 
  1796     if(SDL_TIMERS)
  1797       set(SDL_TIMER_HAIKU 1)
  1798       file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/haiku/*.c)
  1799       set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES})
  1800       set(HAVE_SDL_TIMERS TRUE)
  1801     endif(SDL_TIMERS)
  1802 
  1803     if(VIDEO_OPENGL)
  1804       # TODO: Use FIND_PACKAGE(OpenGL) instead
  1805       set(SDL_VIDEO_OPENGL 1)
  1806       set(SDL_VIDEO_OPENGL_BGL 1)
  1807       set(SDL_VIDEO_RENDER_OGL 1)
  1808       list(APPEND EXTRA_LIBS GL)
  1809       set(HAVE_VIDEO_OPENGL TRUE)
  1810     endif()
  1811   endif()
  1812 
  1813   CheckPTHREAD()
  1814 endif()
  1815 
  1816 if(VIDEO_VULKAN)
  1817   set(SDL_VIDEO_VULKAN 1)
  1818   set(HAVE_VIDEO_VULKAN TRUE)
  1819 endif()
  1820 
  1821 # Dummies
  1822 # configure.ac does it differently:
  1823 # if not have X
  1824 #   if enable_X {  SDL_X_DISABLED = 1 }
  1825 #   [add dummy sources]
  1826 # so it always adds a dummy, without checking, if it was actually requested.
  1827 # This leads to missing internal references on building, since the
  1828 # src/X/*.c does not get included.
  1829 if(NOT HAVE_SDL_JOYSTICK)
  1830   set(SDL_JOYSTICK_DUMMY 1)
  1831   if(SDL_JOYSTICK AND NOT APPLE) # results in unresolved symbols on OSX
  1832 
  1833     file(GLOB JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/dummy/*.c)
  1834     set(SOURCE_FILES ${SOURCE_FILES} ${JOYSTICK_SOURCES})
  1835   endif()
  1836 endif()
  1837 if(NOT HAVE_SDL_HAPTIC)
  1838   set(SDL_HAPTIC_DUMMY 1)
  1839   file(GLOB HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/dummy/*.c)
  1840   set(SOURCE_FILES ${SOURCE_FILES} ${HAPTIC_SOURCES})
  1841 endif()
  1842 if(NOT HAVE_SDL_SENSORS)
  1843   set(SDL_SENSOR_DUMMY 1)
  1844   file(GLOB SENSORS_SOURCES ${SDL2_SOURCE_DIR}/src/sensor/dummy/*.c)
  1845   set(SOURCE_FILES ${SOURCE_FILES} ${SENSORS_SOURCES})
  1846 endif()
  1847 if(NOT HAVE_SDL_LOADSO)
  1848   set(SDL_LOADSO_DISABLED 1)
  1849   file(GLOB LOADSO_SOURCES ${SDL2_SOURCE_DIR}/src/loadso/dummy/*.c)
  1850   set(SOURCE_FILES ${SOURCE_FILES} ${LOADSO_SOURCES})
  1851 endif()
  1852 if(NOT HAVE_SDL_FILESYSTEM)
  1853   set(SDL_FILESYSTEM_DISABLED 1)
  1854   file(GLOB FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/dummy/*.c)
  1855   set(SOURCE_FILES ${SOURCE_FILES} ${FILESYSTEM_SOURCES})
  1856 endif()
  1857 
  1858 # We always need to have threads and timers around
  1859 if(NOT HAVE_SDL_THREADS)
  1860   set(SDL_THREADS_DISABLED 1)
  1861   file(GLOB THREADS_SOURCES ${SDL2_SOURCE_DIR}/src/thread/generic/*.c)
  1862   set(SOURCE_FILES ${SOURCE_FILES} ${THREADS_SOURCES})
  1863 endif()
  1864 if(NOT HAVE_SDL_TIMERS)
  1865   set(SDL_TIMERS_DISABLED 1)
  1866   file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/dummy/*.c)
  1867   set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES})
  1868 endif()
  1869 
  1870 if(NOT SDLMAIN_SOURCES)
  1871   file(GLOB SDLMAIN_SOURCES ${SDL2_SOURCE_DIR}/src/main/dummy/*.c)
  1872 endif()
  1873 
  1874 # Append the -MMD -MT flags
  1875 # if(DEPENDENCY_TRACKING)
  1876 #   if(COMPILER_IS_GNUCC)
  1877 #     set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -MMD -MT \$@")
  1878 #   endif()
  1879 # endif()
  1880 
  1881 configure_file("${SDL2_SOURCE_DIR}/include/SDL_config.h.cmake"
  1882   "${SDL2_BINARY_DIR}/include/SDL_config.h")
  1883 
  1884 # Prepare the flags and remove duplicates
  1885 if(EXTRA_LDFLAGS)
  1886   list(REMOVE_DUPLICATES EXTRA_LDFLAGS)
  1887 endif()
  1888 if(EXTRA_LIBS)
  1889   list(REMOVE_DUPLICATES EXTRA_LIBS)
  1890 endif()
  1891 if(EXTRA_CFLAGS)
  1892   list(REMOVE_DUPLICATES EXTRA_CFLAGS)
  1893 endif()
  1894 listtostr(EXTRA_CFLAGS _EXTRA_CFLAGS)
  1895 set(EXTRA_CFLAGS ${_EXTRA_CFLAGS})
  1896 
  1897 # Compat helpers for the configuration files
  1898 if(NOT WINDOWS OR CYGWIN)
  1899   # TODO: we need a Windows script, too
  1900   execute_process(COMMAND sh ${SDL2_SOURCE_DIR}/build-scripts/updaterev.sh)
  1901 
  1902   set(prefix ${CMAKE_INSTALL_PREFIX})
  1903   set(exec_prefix "\${prefix}")
  1904   set(libdir "\${exec_prefix}/lib${LIB_SUFFIX}")
  1905   set(bindir "\${exec_prefix}/bin")
  1906   set(includedir "\${prefix}/include")
  1907   if(SDL_STATIC)
  1908     set(ENABLE_STATIC_TRUE "")
  1909     set(ENABLE_STATIC_FALSE "#")
  1910   else()
  1911     set(ENABLE_STATIC_TRUE "#")
  1912     set(ENABLE_STATIC_FALSE "")
  1913   endif()
  1914   if(SDL_SHARED)
  1915     set(ENABLE_SHARED_TRUE "")
  1916     set(ENABLE_SHARED_FALSE "#")
  1917   else()
  1918     set(ENABLE_SHARED_TRUE "#")
  1919     set(ENABLE_SHARED_FALSE "")
  1920   endif()
  1921 
  1922   # Clean up the different lists
  1923   listtostr(EXTRA_LIBS _EXTRA_LIBS "-l")
  1924   set(SDL_STATIC_LIBS ${SDL_LIBS} ${EXTRA_LDFLAGS} ${_EXTRA_LIBS})
  1925   list(REMOVE_DUPLICATES SDL_STATIC_LIBS)
  1926   listtostr(SDL_STATIC_LIBS _SDL_STATIC_LIBS)
  1927   set(SDL_STATIC_LIBS ${_SDL_STATIC_LIBS})
  1928   listtostr(SDL_LIBS _SDL_LIBS)
  1929   set(SDL_LIBS ${_SDL_LIBS})
  1930 
  1931   # MESSAGE(STATUS "SDL_LIBS: ${SDL_LIBS}")
  1932   # MESSAGE(STATUS "SDL_STATIC_LIBS: ${SDL_STATIC_LIBS}")
  1933 
  1934   configure_file("${SDL2_SOURCE_DIR}/sdl2.pc.in"
  1935     "${SDL2_BINARY_DIR}/sdl2.pc" @ONLY)
  1936   configure_file("${SDL2_SOURCE_DIR}/sdl2-config.in"
  1937     "${SDL2_BINARY_DIR}/sdl2-config")
  1938   configure_file("${SDL2_SOURCE_DIR}/sdl2-config.in"
  1939     "${SDL2_BINARY_DIR}/sdl2-config" @ONLY)
  1940   configure_file("${SDL2_SOURCE_DIR}/SDL2.spec.in"
  1941     "${SDL2_BINARY_DIR}/SDL2.spec" @ONLY)
  1942 endif()
  1943 
  1944 ##### Info output #####
  1945 message(STATUS "")
  1946 message(STATUS "SDL2 was configured with the following options:")
  1947 message(STATUS "")
  1948 message(STATUS "Platform: ${CMAKE_SYSTEM}")
  1949 message(STATUS "64-bit:   ${ARCH_64}")
  1950 message(STATUS "Compiler: ${CMAKE_C_COMPILER}")
  1951 message(STATUS "")
  1952 message(STATUS "Subsystems:")
  1953 foreach(_SUB ${SDL_SUBSYSTEMS})
  1954   string(TOUPPER ${_SUB} _OPT)
  1955   message_bool_option(${_SUB} SDL_${_OPT})
  1956 endforeach()
  1957 message(STATUS "")
  1958 message(STATUS "Options:")
  1959 list(SORT ALLOPTIONS)
  1960 foreach(_OPT ${ALLOPTIONS})
  1961   # Longest option is VIDEO_X11_XSCREENSAVER = 22 characters
  1962   # Get the padding
  1963   string(LENGTH ${_OPT} _OPTLEN)
  1964   math(EXPR _PADLEN "23 - ${_OPTLEN}")
  1965   string(RANDOM LENGTH ${_PADLEN} ALPHABET " " _PADDING)
  1966   message_tested_option(${_OPT} ${_PADDING})
  1967 endforeach()
  1968 message(STATUS "")
  1969 message(STATUS " CFLAGS:        ${CMAKE_C_FLAGS}")
  1970 message(STATUS " EXTRA_CFLAGS:  ${EXTRA_CFLAGS}")
  1971 message(STATUS " EXTRA_LDFLAGS: ${EXTRA_LDFLAGS}")
  1972 message(STATUS " EXTRA_LIBS:    ${EXTRA_LIBS}")
  1973 message(STATUS "")
  1974 message(STATUS " Build Shared Library: ${SDL_SHARED}")
  1975 message(STATUS " Build Static Library: ${SDL_STATIC}")
  1976 if(SDL_STATIC)
  1977     message(STATUS " Build Static Library with Position Independent Code: ${SDL_STATIC_PIC}")
  1978 endif()
  1979 message(STATUS "")
  1980 if(UNIX)
  1981   message(STATUS "If something was not detected, although the libraries")
  1982   message(STATUS "were installed, then make sure you have set the")
  1983   message(STATUS "CFLAGS and LDFLAGS environment variables correctly.")
  1984   message(STATUS "")
  1985 endif()
  1986 
  1987 if(WARN_ABOUT_ARM_SIMD_ASM_MIT)
  1988   message(STATUS "")
  1989   message(STATUS "SDL is being built with ARM SIMD optimizations, which")
  1990   message(STATUS "uses code licensed under the MIT license. If this is a")
  1991   message(STATUS "problem, please disable that code by rerunning CMake with:")
  1992   message(STATUS "")
  1993   message(STATUS "    -DARMSIMD=OFF")
  1994 endif()
  1995 
  1996 if(WARN_ABOUT_ARM_NEON_ASM_MIT)
  1997   message(STATUS "")
  1998   message(STATUS "SDL is being built with ARM NEON optimizations, which")
  1999   message(STATUS "uses code licensed under the MIT license. If this is a")
  2000   message(STATUS "problem, please disable that code by rerunning CMake with:")
  2001   message(STATUS "")
  2002   message(STATUS "    -DARMNEON=OFF")
  2003 endif()
  2004 
  2005 # Ensure that the extra cflags are used at compile time
  2006 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS}")
  2007 
  2008 # Always build SDLmain
  2009 add_library(SDL2main STATIC ${SDLMAIN_SOURCES})
  2010 target_include_directories(SDL2main PUBLIC "$<BUILD_INTERFACE:${SDL2_SOURCE_DIR}/include>" $<INSTALL_INTERFACE:include/SDL2>)
  2011 set(_INSTALL_LIBS "SDL2main")
  2012 if (NOT ANDROID)
  2013   set_target_properties(SDL2main PROPERTIES DEBUG_POSTFIX ${SDL_CMAKE_DEBUG_POSTFIX})
  2014 endif()
  2015 
  2016 if (ANDROID AND HAVE_HIDAPI)
  2017   set(_INSTALL_LIBS ${_INSTALL_LIBS} "hidapi")
  2018 endif()
  2019 
  2020 if(SDL_SHARED)
  2021   add_library(SDL2 SHARED ${SOURCE_FILES} ${VERSION_SOURCES})
  2022   if(APPLE)
  2023     set_target_properties(SDL2 PROPERTIES
  2024       MACOSX_RPATH 1
  2025       OUTPUT_NAME "SDL2-${LT_RELEASE}")
  2026   elseif(UNIX AND NOT ANDROID)
  2027     set_target_properties(SDL2 PROPERTIES
  2028       VERSION ${LT_VERSION}
  2029       SOVERSION ${LT_REVISION}
  2030       OUTPUT_NAME "SDL2-${LT_RELEASE}")
  2031   else()
  2032     set_target_properties(SDL2 PROPERTIES
  2033       VERSION ${SDL_VERSION}
  2034       SOVERSION ${LT_REVISION}
  2035       OUTPUT_NAME "SDL2")
  2036   endif()
  2037   if(MSVC AND NOT LIBC)
  2038     # Don't try to link with the default set of libraries.
  2039     set_target_properties(SDL2 PROPERTIES LINK_FLAGS_RELEASE "/NODEFAULTLIB")
  2040     set_target_properties(SDL2 PROPERTIES LINK_FLAGS_DEBUG "/NODEFAULTLIB")
  2041     set_target_properties(SDL2 PROPERTIES STATIC_LIBRARY_FLAGS "/NODEFAULTLIB")
  2042   endif()
  2043   set(_INSTALL_LIBS "SDL2" ${_INSTALL_LIBS})
  2044   target_link_libraries(SDL2 ${EXTRA_LIBS} ${EXTRA_LDFLAGS})
  2045   target_include_directories(SDL2 PUBLIC "$<BUILD_INTERFACE:${SDL2_SOURCE_DIR}/include>" $<INSTALL_INTERFACE:include/SDL2>)
  2046   if (NOT ANDROID)
  2047     set_target_properties(SDL2 PROPERTIES DEBUG_POSTFIX ${SDL_CMAKE_DEBUG_POSTFIX})
  2048   endif()
  2049   if(IOS OR TVOS)
  2050     set_property(TARGET SDL2 APPEND_STRING PROPERTY COMPILE_FLAGS "-fobjc-arc")
  2051     target_compile_definitions(SDL2 PRIVATE IOS_DYLIB=1)
  2052   endif()
  2053 endif()
  2054 
  2055 if(ANDROID)
  2056   if(HAVE_HIDAPI)
  2057     add_library(hidapi SHARED ${SDL2_SOURCE_DIR}/src/hidapi/android/hid.cpp)
  2058   endif()
  2059 
  2060   if(MSVC AND NOT LIBC)
  2061     # Don't try to link with the default set of libraries.
  2062     set_target_properties(hidapi PROPERTIES LINK_FLAGS_RELEASE "/NODEFAULTLIB")
  2063     set_target_properties(hidapi PROPERTIES LINK_FLAGS_DEBUG "/NODEFAULTLIB")
  2064     set_target_properties(hidapi PROPERTIES STATIC_LIBRARY_FLAGS "/NODEFAULTLIB")
  2065   endif()
  2066   if(HAVE_HIDAPI)
  2067     target_link_libraries(hidapi log)
  2068   endif()
  2069 endif()
  2070 
  2071 if(SDL_STATIC)
  2072   set (BUILD_SHARED_LIBS FALSE)
  2073   add_library(SDL2-static STATIC ${SOURCE_FILES})
  2074   if (NOT SDL_SHARED OR NOT WIN32)
  2075     set_target_properties(SDL2-static PROPERTIES OUTPUT_NAME "SDL2")
  2076     # Note: Apparently, OUTPUT_NAME must really be unique; even when
  2077     # CMAKE_IMPORT_LIBRARY_SUFFIX or the like are given. Otherwise
  2078     # the static build may race with the import lib and one will get
  2079     # clobbered, when the suffix is realized via subsequent rename.
  2080   endif()
  2081   set_target_properties(SDL2-static PROPERTIES POSITION_INDEPENDENT_CODE ${SDL_STATIC_PIC})
  2082   if(MSVC AND NOT LIBC)
  2083     set_target_properties(SDL2-static PROPERTIES LINK_FLAGS_RELEASE "/NODEFAULTLIB")
  2084     set_target_properties(SDL2-static PROPERTIES LINK_FLAGS_DEBUG "/NODEFAULTLIB")
  2085     set_target_properties(SDL2-static PROPERTIES STATIC_LIBRARY_FLAGS "/NODEFAULTLIB")
  2086   endif()
  2087   # TODO: Win32 platforms keep the same suffix .lib for import and static
  2088   # libraries - do we need to consider this?
  2089   set(_INSTALL_LIBS "SDL2-static" ${_INSTALL_LIBS})
  2090   target_link_libraries(SDL2-static ${EXTRA_LIBS} ${EXTRA_LDFLAGS})
  2091   target_include_directories(SDL2-static PUBLIC "$<BUILD_INTERFACE:${SDL2_SOURCE_DIR}/include>" $<INSTALL_INTERFACE:include/SDL2>)
  2092   if (NOT ANDROID)
  2093     set_target_properties(SDL2-static PROPERTIES DEBUG_POSTFIX ${SDL_CMAKE_DEBUG_POSTFIX})
  2094   endif()
  2095   if(IOS OR TVOS)
  2096     set_property(TARGET SDL2-static APPEND_STRING PROPERTY COMPILE_FLAGS "-fobjc-arc")
  2097   endif()
  2098 endif()
  2099 
  2100 ##### Tests #####
  2101 
  2102 if(SDL_TEST)
  2103   file(GLOB TEST_SOURCES ${SDL2_SOURCE_DIR}/src/test/*.c)
  2104   add_library(SDL2_test STATIC ${TEST_SOURCES})
  2105 
  2106   add_subdirectory(test)
  2107 endif()
  2108 
  2109 ##### Installation targets #####
  2110 install(TARGETS ${_INSTALL_LIBS} EXPORT SDL2Targets
  2111   LIBRARY DESTINATION "lib${LIB_SUFFIX}"
  2112   ARCHIVE DESTINATION "lib${LIB_SUFFIX}"
  2113   RUNTIME DESTINATION bin)
  2114 
  2115 ##### Export files #####
  2116 if (WINDOWS)
  2117   set(PKG_PREFIX "cmake")
  2118 else ()
  2119   set(PKG_PREFIX "lib/cmake/SDL2")
  2120 endif ()
  2121 
  2122 include(CMakePackageConfigHelpers)
  2123 write_basic_package_version_file("${CMAKE_BINARY_DIR}/SDL2ConfigVersion.cmake"
  2124   VERSION ${SDL_VERSION}
  2125   COMPATIBILITY AnyNewerVersion
  2126 )
  2127 
  2128 install(EXPORT SDL2Targets
  2129   FILE SDL2Targets.cmake
  2130   NAMESPACE SDL2::
  2131   DESTINATION ${PKG_PREFIX}
  2132 )
  2133 install(
  2134   FILES
  2135     ${CMAKE_CURRENT_SOURCE_DIR}/SDL2Config.cmake
  2136     ${CMAKE_BINARY_DIR}/SDL2ConfigVersion.cmake
  2137   DESTINATION ${PKG_PREFIX}
  2138   COMPONENT Devel
  2139 )
  2140 
  2141 file(GLOB INCLUDE_FILES ${SDL2_SOURCE_DIR}/include/*.h)
  2142 file(GLOB BIN_INCLUDE_FILES ${SDL2_BINARY_DIR}/include/*.h)
  2143 foreach(_FNAME ${BIN_INCLUDE_FILES})
  2144   get_filename_component(_INCNAME ${_FNAME} NAME)
  2145   list(REMOVE_ITEM INCLUDE_FILES ${SDL2_SOURCE_DIR}/include/${_INCNAME})
  2146 endforeach()
  2147 list(APPEND INCLUDE_FILES ${BIN_INCLUDE_FILES})
  2148 install(FILES ${INCLUDE_FILES} DESTINATION include/SDL2)
  2149 
  2150 string(TOUPPER "${CMAKE_BUILD_TYPE}" UPPER_BUILD_TYPE)
  2151 if (UPPER_BUILD_TYPE MATCHES DEBUG)
  2152   set(SOPOSTFIX "${SDL_CMAKE_DEBUG_POSTFIX}")
  2153 else()
  2154   set(SOPOSTFIX "")
  2155 endif()
  2156 
  2157 if(NOT (WINDOWS OR CYGWIN))
  2158   if(SDL_SHARED)
  2159     set(SOEXT ${CMAKE_SHARED_LIBRARY_SUFFIX}) # ".so", ".dylib", etc.
  2160     get_target_property(SONAME SDL2 OUTPUT_NAME)
  2161     if(NOT ANDROID)
  2162         install(CODE "
  2163           execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink
  2164             \"lib${SONAME}${SOPOSTFIX}${SOEXT}\" \"libSDL2${SOPOSTFIX}${SOEXT}\"
  2165             WORKING_DIRECTORY \"${SDL2_BINARY_DIR}\")")
  2166         install(FILES ${SDL2_BINARY_DIR}/libSDL2${SOPOSTFIX}${SOEXT} DESTINATION "lib${LIB_SUFFIX}")
  2167     endif()
  2168   endif()
  2169   if(FREEBSD)
  2170     # FreeBSD uses ${PREFIX}/libdata/pkgconfig
  2171     install(FILES ${SDL2_BINARY_DIR}/sdl2.pc DESTINATION "libdata/pkgconfig")
  2172   else()
  2173     install(FILES ${SDL2_BINARY_DIR}/sdl2.pc
  2174       DESTINATION "lib${LIB_SUFFIX}/pkgconfig")
  2175   endif()
  2176   install(PROGRAMS ${SDL2_BINARY_DIR}/sdl2-config DESTINATION bin)
  2177   # TODO: what about the .spec file? Is it only needed for RPM creation?
  2178   install(FILES "${SDL2_SOURCE_DIR}/sdl2.m4" DESTINATION "${CMAKE_INSTALL_FULL_DATAROOTDIR}/aclocal")
  2179 endif()
  2180 
  2181 ##### Uninstall target #####
  2182 
  2183 if(NOT TARGET uninstall)
  2184   configure_file(
  2185       "${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake.in"
  2186       "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
  2187       IMMEDIATE @ONLY)
  2188 
  2189   add_custom_target(uninstall
  2190       COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake)
  2191 endif()