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