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