CMakeLists.txt
author Andrew Eikum <aeikum@codeweavers.com>
Wed, 31 Jul 2019 11:34:00 -0500
changeset 12971 2fbd3d8432ab
parent 12938 165d577cdc63
child 12974 0fef4b21fa1d
permissions -rw-r--r--
cmake: Fix locating libusb header at configure-time

Removing the CheckUSBHID call is necessary to avoid caching the failed header
check result before we find libusb via pkg-config.
     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     if(FREEBSD OR NETBSD OR OPENBSD OR BSDI)
  1132       CheckUSBHID()
  1133     endif()
  1134     CheckHIDAPI()
  1135     if(LINUX AND NOT ANDROID)
  1136       set(SDL_JOYSTICK_LINUX 1)
  1137       file(GLOB JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/linux/*.c ${SDL2_SOURCE_DIR}/src/joystick/steam/*.c)
  1138       set(SOURCE_FILES ${SOURCE_FILES} ${JOYSTICK_SOURCES})
  1139       set(HAVE_SDL_JOYSTICK TRUE)
  1140     endif()
  1141   endif()
  1142 
  1143   CheckPTHREAD()
  1144 
  1145   if(CLOCK_GETTIME)
  1146     check_library_exists(rt clock_gettime "" FOUND_CLOCK_GETTIME)
  1147     if(FOUND_CLOCK_GETTIME)
  1148       list(APPEND EXTRA_LIBS rt)
  1149       set(HAVE_CLOCK_GETTIME 1)
  1150     else()
  1151       check_library_exists(c clock_gettime "" FOUND_CLOCK_GETTIME)
  1152       if(FOUND_CLOCK_GETTIME)
  1153         set(HAVE_CLOCK_GETTIME 1)
  1154       endif()
  1155     endif()
  1156   endif()
  1157 
  1158   check_include_file(linux/version.h HAVE_LINUX_VERSION_H)
  1159   if(HAVE_LINUX_VERSION_H)
  1160     set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DHAVE_LINUX_VERSION_H")
  1161   endif()
  1162 
  1163   if(SDL_POWER)
  1164     if(LINUX)
  1165       set(SDL_POWER_LINUX 1)
  1166       file(GLOB POWER_SOURCES ${SDL2_SOURCE_DIR}/src/power/linux/*.c)
  1167       set(SOURCE_FILES ${SOURCE_FILES} ${POWER_SOURCES})
  1168       set(HAVE_SDL_POWER TRUE)
  1169     endif()
  1170   endif()
  1171 
  1172   if(SDL_FILESYSTEM)
  1173     set(SDL_FILESYSTEM_UNIX 1)
  1174     file(GLOB FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/unix/*.c)
  1175     set(SOURCE_FILES ${SOURCE_FILES} ${FILESYSTEM_SOURCES})
  1176     set(HAVE_SDL_FILESYSTEM TRUE)
  1177   endif()
  1178 
  1179   if(SDL_TIMERS)
  1180     set(SDL_TIMER_UNIX 1)
  1181     file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/unix/*.c)
  1182     set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES})
  1183     set(HAVE_SDL_TIMERS TRUE)
  1184   endif()
  1185 
  1186   if(RPATH)
  1187     set(SDL_RLD_FLAGS "")
  1188     if(BSDI OR FREEBSD OR LINUX OR NETBSD)
  1189       set(CMAKE_REQUIRED_FLAGS "-Wl,--enable-new-dtags")
  1190       check_c_compiler_flag("" HAVE_ENABLE_NEW_DTAGS)
  1191       set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS})
  1192       if(HAVE_ENABLE_NEW_DTAGS)
  1193         set(SDL_RLD_FLAGS "-Wl,-rpath,\${libdir} -Wl,--enable-new-dtags")
  1194       else()
  1195         set(SDL_RLD_FLAGS "-Wl,-rpath,\${libdir}")
  1196       endif()
  1197     elseif(SOLARIS)
  1198       set(SDL_RLD_FLAGS "-R\${libdir}")
  1199     endif()
  1200     set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)
  1201     set(HAVE_RPATH TRUE)
  1202   endif()
  1203 
  1204 elseif(WINDOWS)
  1205   find_program(WINDRES windres)
  1206 
  1207   check_c_source_compiles("
  1208     #include <windows.h>
  1209     int main(int argc, char **argv) { }" HAVE_WIN32_CC)
  1210 
  1211   file(GLOB CORE_SOURCES ${SDL2_SOURCE_DIR}/src/core/windows/*.c)
  1212   set(SOURCE_FILES ${SOURCE_FILES} ${CORE_SOURCES})
  1213 
  1214   if(MSVC)
  1215     # Prevent codegen that would use the VC runtime libraries.
  1216     set_property(DIRECTORY . APPEND PROPERTY COMPILE_OPTIONS "/GS-")
  1217     if(NOT ARCH_64)
  1218       set_property(DIRECTORY . APPEND PROPERTY COMPILE_OPTIONS "/arch:SSE")
  1219     endif()
  1220   endif()
  1221 
  1222   # Check for DirectX
  1223   if(DIRECTX)
  1224     if(DEFINED MSVC_VERSION AND NOT ${MSVC_VERSION} LESS 1700)
  1225         set(USE_WINSDK_DIRECTX TRUE)
  1226     endif()
  1227     if(NOT CMAKE_COMPILER_IS_MINGW AND NOT USE_WINSDK_DIRECTX)
  1228       if("$ENV{DXSDK_DIR}" STREQUAL "")
  1229         message_error("DIRECTX requires the \$DXSDK_DIR environment variable to be set")
  1230       endif()
  1231       set(CMAKE_REQUIRED_FLAGS "/I\"$ENV{DXSDK_DIR}\\Include\"")
  1232     endif()
  1233 
  1234     if(HAVE_WIN32_CC)
  1235       # xinput.h may need windows.h, but doesn't include it itself.
  1236       check_c_source_compiles("
  1237         #include <windows.h>
  1238         #include <xinput.h>
  1239         int main(int argc, char **argv) { }" HAVE_XINPUT_H)
  1240       check_c_source_compiles("
  1241         #include <windows.h>
  1242         #include <xinput.h>
  1243         XINPUT_GAMEPAD_EX x1;
  1244         int main(int argc, char **argv) { }" HAVE_XINPUT_GAMEPAD_EX)
  1245       check_c_source_compiles("
  1246         #include <windows.h>
  1247         #include <xinput.h>
  1248         XINPUT_STATE_EX s1;
  1249         int main(int argc, char **argv) { }" HAVE_XINPUT_STATE_EX)
  1250     else()
  1251       check_include_file(xinput.h HAVE_XINPUT_H)
  1252     endif()
  1253 
  1254     check_include_file(d3d9.h HAVE_D3D_H)
  1255     check_include_file(d3d11_1.h HAVE_D3D11_H)
  1256     check_include_file(ddraw.h HAVE_DDRAW_H)
  1257     check_include_file(dsound.h HAVE_DSOUND_H)
  1258     check_include_file(dinput.h HAVE_DINPUT_H)
  1259     check_include_file(dxgi.h HAVE_DXGI_H)
  1260     if(HAVE_D3D_H OR HAVE_D3D11_H OR HAVE_DDRAW_H OR HAVE_DSOUND_H OR HAVE_DINPUT_H)
  1261       set(HAVE_DIRECTX TRUE)
  1262       if(NOT CMAKE_COMPILER_IS_MINGW AND NOT USE_WINSDK_DIRECTX)
  1263       # TODO: change $ENV{DXSDL_DIR} to get the path from the include checks
  1264         link_directories($ENV{DXSDK_DIR}\\lib\\${PROCESSOR_ARCH})
  1265         include_directories($ENV{DXSDK_DIR}\\Include)
  1266       endif()
  1267     endif()
  1268     set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS})
  1269   endif()
  1270 
  1271   # headers needed elsewhere ...
  1272   check_include_file(mmdeviceapi.h HAVE_MMDEVICEAPI_H)
  1273   check_include_file(audioclient.h HAVE_AUDIOCLIENT_H)
  1274   check_include_file(endpointvolume.h HAVE_ENDPOINTVOLUME_H)
  1275 
  1276   if(SDL_AUDIO)
  1277     set(SDL_AUDIO_DRIVER_WINMM 1)
  1278     file(GLOB WINMM_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/winmm/*.c)
  1279     set(SOURCE_FILES ${SOURCE_FILES} ${WINMM_AUDIO_SOURCES})
  1280     set(HAVE_SDL_AUDIO TRUE)
  1281 
  1282     if(HAVE_DSOUND_H)
  1283       set(SDL_AUDIO_DRIVER_DSOUND 1)
  1284       file(GLOB DSOUND_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/directsound/*.c)
  1285       set(SOURCE_FILES ${SOURCE_FILES} ${DSOUND_AUDIO_SOURCES})
  1286     endif()
  1287 
  1288     if(WASAPI AND HAVE_AUDIOCLIENT_H AND HAVE_MMDEVICEAPI_H)
  1289       set(SDL_AUDIO_DRIVER_WASAPI 1)
  1290       file(GLOB WASAPI_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/wasapi/*.c)
  1291       set(SOURCE_FILES ${SOURCE_FILES} ${WASAPI_AUDIO_SOURCES})
  1292     endif()
  1293   endif()
  1294 
  1295   if(SDL_VIDEO)
  1296     # requires SDL_LOADSO on Windows (IME, DX, etc.)
  1297     if(NOT SDL_LOADSO)
  1298       message_error("SDL_VIDEO requires SDL_LOADSO, which is not enabled")
  1299     endif()
  1300     set(SDL_VIDEO_DRIVER_WINDOWS 1)
  1301     file(GLOB WIN_VIDEO_SOURCES ${SDL2_SOURCE_DIR}/src/video/windows/*.c)
  1302     set(SOURCE_FILES ${SOURCE_FILES} ${WIN_VIDEO_SOURCES})
  1303 
  1304     if(RENDER_D3D AND HAVE_D3D_H)
  1305       set(SDL_VIDEO_RENDER_D3D 1)
  1306       set(HAVE_RENDER_D3D TRUE)
  1307     endif()
  1308     if(RENDER_D3D AND HAVE_D3D11_H)
  1309       set(SDL_VIDEO_RENDER_D3D11 1)
  1310       set(HAVE_RENDER_D3D TRUE)
  1311     endif()
  1312     set(HAVE_SDL_VIDEO TRUE)
  1313   endif()
  1314 
  1315   if(SDL_THREADS)
  1316     set(SDL_THREAD_WINDOWS 1)
  1317     set(SOURCE_FILES ${SOURCE_FILES}
  1318       ${SDL2_SOURCE_DIR}/src/thread/windows/SDL_sysmutex.c
  1319       ${SDL2_SOURCE_DIR}/src/thread/windows/SDL_syssem.c
  1320       ${SDL2_SOURCE_DIR}/src/thread/windows/SDL_systhread.c
  1321       ${SDL2_SOURCE_DIR}/src/thread/windows/SDL_systls.c
  1322       ${SDL2_SOURCE_DIR}/src/thread/generic/SDL_syscond.c)
  1323     set(HAVE_SDL_THREADS TRUE)
  1324   endif()
  1325 
  1326   if(SDL_POWER)
  1327     set(SDL_POWER_WINDOWS 1)
  1328     set(SOURCE_FILES ${SOURCE_FILES} ${SDL2_SOURCE_DIR}/src/power/windows/SDL_syspower.c)
  1329     set(HAVE_SDL_POWER TRUE)
  1330   endif()
  1331 
  1332   if(SDL_FILESYSTEM)
  1333     set(SDL_FILESYSTEM_WINDOWS 1)
  1334     file(GLOB FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/windows/*.c)
  1335     set(SOURCE_FILES ${SOURCE_FILES} ${FILESYSTEM_SOURCES})
  1336     set(HAVE_SDL_FILESYSTEM TRUE)
  1337   endif()
  1338 
  1339   # Libraries for Win32 native and MinGW
  1340   list(APPEND EXTRA_LIBS user32 gdi32 winmm imm32 ole32 oleaut32 version uuid advapi32 setupapi shell32)
  1341 
  1342   # TODO: in configure.ac the check for timers is set on
  1343   # cygwin | mingw32* - does this include mingw32CE?
  1344   if(SDL_TIMERS)
  1345     set(SDL_TIMER_WINDOWS 1)
  1346     file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/windows/*.c)
  1347     set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES})
  1348     set(HAVE_SDL_TIMERS TRUE)
  1349   endif()
  1350 
  1351   if(SDL_LOADSO)
  1352     set(SDL_LOADSO_WINDOWS 1)
  1353     file(GLOB LOADSO_SOURCES ${SDL2_SOURCE_DIR}/src/loadso/windows/*.c)
  1354     set(SOURCE_FILES ${SOURCE_FILES} ${LOADSO_SOURCES})
  1355     set(HAVE_SDL_LOADSO TRUE)
  1356   endif()
  1357 
  1358   file(GLOB CORE_SOURCES ${SDL2_SOURCE_DIR}/src/core/windows/*.c)
  1359   set(SOURCE_FILES ${SOURCE_FILES} ${CORE_SOURCES})
  1360 
  1361   if(SDL_VIDEO)
  1362     if(VIDEO_OPENGL)
  1363       set(SDL_VIDEO_OPENGL 1)
  1364       set(SDL_VIDEO_OPENGL_WGL 1)
  1365       set(SDL_VIDEO_RENDER_OGL 1)
  1366       set(HAVE_VIDEO_OPENGL TRUE)
  1367     endif()
  1368 
  1369     if(VIDEO_OPENGLES)
  1370       set(SDL_VIDEO_OPENGL_EGL 1)
  1371       set(SDL_VIDEO_OPENGL_ES2 1)
  1372       set(SDL_VIDEO_RENDER_OGL_ES2 1)
  1373       set(HAVE_VIDEO_OPENGLES TRUE)
  1374     endif()
  1375   endif()
  1376 
  1377   if(SDL_JOYSTICK)
  1378     CheckHIDAPI()
  1379     if(HAVE_HIDAPI)
  1380       set(SOURCE_FILES ${SOURCE_FILES} ${SDL2_SOURCE_DIR}/src/hidapi/windows/hid.c)
  1381     endif()
  1382     file(GLOB JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/windows/*.c)
  1383     set(SOURCE_FILES ${SOURCE_FILES} ${JOYSTICK_SOURCES})
  1384     if(HAVE_DINPUT_H)
  1385       set(SDL_JOYSTICK_DINPUT 1)
  1386       list(APPEND EXTRA_LIBS dinput8)
  1387       if(CMAKE_COMPILER_IS_MINGW)
  1388         list(APPEND EXTRA_LIBS dxerr8)
  1389       elseif (NOT USE_WINSDK_DIRECTX)
  1390         list(APPEND EXTRA_LIBS dxerr)
  1391       endif()
  1392     endif()
  1393     if(HAVE_XINPUT_H)
  1394       set(SDL_JOYSTICK_XINPUT 1)
  1395     endif()
  1396     if(NOT HAVE_DINPUT_H AND NOT HAVE_XINPUT_H)
  1397       set(SDL_JOYSTICK_WINMM 1)
  1398     endif()
  1399     set(HAVE_SDL_JOYSTICK TRUE)
  1400 
  1401     if(SDL_HAPTIC)
  1402       if(HAVE_DINPUT_H OR HAVE_XINPUT_H)
  1403         file(GLOB HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/windows/*.c)
  1404         if(HAVE_DINPUT_H)
  1405           set(SDL_HAPTIC_DINPUT 1)
  1406         endif()
  1407         if(HAVE_XINPUT_H)
  1408           set(SDL_HAPTIC_XINPUT 1)
  1409         endif()
  1410       else()
  1411         file(GLOB HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/dummy/*.c)
  1412         set(SDL_HAPTIC_DUMMY 1)
  1413       endif()
  1414       set(SOURCE_FILES ${SOURCE_FILES} ${HAPTIC_SOURCES})
  1415       set(HAVE_SDL_HAPTIC TRUE)
  1416     endif()
  1417   endif()
  1418 
  1419   file(GLOB VERSION_SOURCES ${SDL2_SOURCE_DIR}/src/main/windows/*.rc)
  1420   file(GLOB SDLMAIN_SOURCES ${SDL2_SOURCE_DIR}/src/main/windows/*.c)
  1421   if(MINGW OR CYGWIN)
  1422     list(APPEND EXTRA_LIBS mingw32)
  1423     list(APPEND EXTRA_LDFLAGS "-mwindows")
  1424     set(SDL_CFLAGS "${SDL_CFLAGS} -Dmain=SDL_main")
  1425     list(APPEND SDL_LIBS "-lmingw32" "-lSDL2main" "-mwindows")
  1426   endif()
  1427 
  1428 elseif(APPLE)
  1429   # TODO: rework this all for proper MacOS X, iOS and Darwin support
  1430 
  1431   # We always need these libs on macOS at the moment.
  1432   # !!! FIXME: we need Carbon for some very old API calls in
  1433   # !!! FIXME:  src/video/cocoa/SDL_cocoakeyboard.c, but we should figure out
  1434   # !!! FIXME:  how to dump those.
  1435   if(NOT IOS)
  1436     set(SDL_FRAMEWORK_COCOA 1)
  1437     set(SDL_FRAMEWORK_CARBON 1)
  1438   endif()
  1439 
  1440   # Requires the darwin file implementation
  1441   if(SDL_FILE)
  1442     file(GLOB EXTRA_SOURCES ${SDL2_SOURCE_DIR}/src/file/cocoa/*.m)
  1443     set(SOURCE_FILES ${EXTRA_SOURCES} ${SOURCE_FILES})
  1444     # !!! FIXME: modern CMake doesn't need "LANGUAGE C" for Objective-C.
  1445     set_source_files_properties(${EXTRA_SOURCES} PROPERTIES LANGUAGE C)
  1446     set(HAVE_SDL_FILE TRUE)
  1447     # !!! FIXME: why is COREVIDEO inside this if() block?
  1448     set(SDL_FRAMEWORK_COREVIDEO 1)
  1449   else()
  1450     message_error("SDL_FILE must be enabled to build on MacOS X")
  1451   endif()
  1452 
  1453   if(SDL_AUDIO)
  1454     set(SDL_AUDIO_DRIVER_COREAUDIO 1)
  1455     file(GLOB AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/coreaudio/*.m)
  1456     # !!! FIXME: modern CMake doesn't need "LANGUAGE C" for Objective-C.
  1457     set_source_files_properties(${AUDIO_SOURCES} PROPERTIES LANGUAGE C)
  1458     set(SOURCE_FILES ${SOURCE_FILES} ${AUDIO_SOURCES})
  1459     set(HAVE_SDL_AUDIO TRUE)
  1460     set(SDL_FRAMEWORK_COREAUDIO 1)
  1461     set(SDL_FRAMEWORK_AUDIOTOOLBOX 1)
  1462   endif()
  1463 
  1464   if(SDL_JOYSTICK)
  1465     CheckHIDAPI()
  1466     if(HAVE_HIDAPI)
  1467       if(IOS)
  1468         set(SOURCE_FILES ${SOURCE_FILES} ${SDL2_SOURCE_DIR}/src/hidapi/ios/hid.m)
  1469       else()
  1470         set(SOURCE_FILES ${SOURCE_FILES} ${SDL2_SOURCE_DIR}/src/hidapi/mac/hid.c)
  1471       endif()
  1472     endif()
  1473     set(SDL_JOYSTICK_IOKIT 1)
  1474     if (IOS)
  1475       file(GLOB JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/iphoneos/*.m ${SDL2_SOURCE_DIR}/src/joystick/steam/*.c)
  1476     else()
  1477       file(GLOB JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/darwin/*.c)
  1478     endif()
  1479     set(SOURCE_FILES ${SOURCE_FILES} ${JOYSTICK_SOURCES})
  1480     set(HAVE_SDL_JOYSTICK TRUE)
  1481     set(SDL_FRAMEWORK_IOKIT 1)
  1482     set(SDL_FRAMEWORK_FF 1)
  1483   endif()
  1484 
  1485   if(SDL_HAPTIC)
  1486     set(SDL_HAPTIC_IOKIT 1)
  1487     if (IOS)
  1488       file(GLOB HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/dummy/*.c)
  1489       set(SDL_HAPTIC_DUMMY 1)
  1490     else()
  1491       file(GLOB HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/darwin/*.c)
  1492     endif()
  1493     set(SOURCE_FILES ${SOURCE_FILES} ${HAPTIC_SOURCES})
  1494     set(HAVE_SDL_HAPTIC TRUE)
  1495     set(SDL_FRAMEWORK_IOKIT 1)
  1496     set(SDL_FRAMEWORK_FF 1)
  1497     if(NOT SDL_JOYSTICK)
  1498       message(FATAL_ERROR "SDL_HAPTIC requires SDL_JOYSTICK to be enabled")
  1499     endif()
  1500   endif()
  1501 
  1502   if(SDL_POWER)
  1503     set(SDL_POWER_MACOSX 1)
  1504     if (IOS)
  1505       file(GLOB POWER_SOURCES ${SDL2_SOURCE_DIR}/src/power/uikit/*.m)
  1506     else()
  1507       file(GLOB POWER_SOURCES ${SDL2_SOURCE_DIR}/src/power/macosx/*.c)
  1508     endif()
  1509     set(SOURCE_FILES ${SOURCE_FILES} ${POWER_SOURCES})
  1510     set(HAVE_SDL_POWER TRUE)
  1511     set(SDL_FRAMEWORK_IOKIT 1)
  1512   endif()
  1513 
  1514   if(SDL_TIMERS)
  1515     set(SDL_TIMER_UNIX 1)
  1516     file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/unix/*.c)
  1517     set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES})
  1518     set(HAVE_SDL_TIMERS TRUE)
  1519   endif(SDL_TIMERS)
  1520 
  1521   if(SDL_FILESYSTEM)
  1522     set(SDL_FILESYSTEM_COCOA 1)
  1523     file(GLOB FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/cocoa/*.m)
  1524     # !!! FIXME: modern CMake doesn't need "LANGUAGE C" for Objective-C.
  1525     set_source_files_properties(${FILESYSTEM_SOURCES} PROPERTIES LANGUAGE C)
  1526     set(SOURCE_FILES ${SOURCE_FILES} ${FILESYSTEM_SOURCES})
  1527     set(HAVE_SDL_FILESYSTEM TRUE)
  1528   endif()
  1529 
  1530   # Actually load the frameworks at the end so we don't duplicate include.
  1531   if(SDL_FRAMEWORK_COREVIDEO)
  1532     find_library(COREVIDEO CoreVideo)
  1533     list(APPEND EXTRA_LIBS ${COREVIDEO})
  1534   endif()
  1535   if(SDL_FRAMEWORK_COCOA)
  1536     find_library(COCOA_LIBRARY Cocoa)
  1537     list(APPEND EXTRA_LIBS ${COCOA_LIBRARY})
  1538   endif()
  1539   if(SDL_FRAMEWORK_IOKIT)
  1540     find_library(IOKIT IOKit)
  1541     list(APPEND EXTRA_LIBS ${IOKIT})
  1542   endif()
  1543   if(SDL_FRAMEWORK_FF)
  1544     find_library(FORCEFEEDBACK ForceFeedback)
  1545     list(APPEND EXTRA_LIBS ${FORCEFEEDBACK})
  1546   endif()
  1547   if(SDL_FRAMEWORK_CARBON)
  1548     find_library(CARBON_LIBRARY Carbon)
  1549     list(APPEND EXTRA_LIBS ${CARBON_LIBRARY})
  1550   endif()
  1551   if(SDL_FRAMEWORK_COREAUDIO)
  1552     find_library(COREAUDIO CoreAudio)
  1553     list(APPEND EXTRA_LIBS ${COREAUDIO})
  1554   endif()
  1555   if(SDL_FRAMEWORK_AUDIOTOOLBOX)
  1556     find_library(AUDIOTOOLBOX AudioToolbox)
  1557     list(APPEND EXTRA_LIBS ${AUDIOTOOLBOX})
  1558   endif()
  1559 
  1560   # iOS hack needed - http://code.google.com/p/ios-cmake/ ?
  1561   if(SDL_VIDEO)
  1562     if (IOS)
  1563       set(SDL_VIDEO_DRIVER_UIKIT 1)
  1564       file(GLOB UIKITVIDEO_SOURCES ${SDL2_SOURCE_DIR}/src/video/uikit/*.m)
  1565       set(SOURCE_FILES ${SOURCE_FILES} ${UIKITVIDEO_SOURCES})
  1566     else()
  1567       CheckCOCOA()
  1568       if(VIDEO_OPENGL)
  1569         set(SDL_VIDEO_OPENGL 1)
  1570         set(SDL_VIDEO_OPENGL_CGL 1)
  1571         set(SDL_VIDEO_RENDER_OGL 1)
  1572         set(HAVE_VIDEO_OPENGL TRUE)
  1573       endif()
  1574 
  1575       if(VIDEO_OPENGLES)
  1576         set(SDL_VIDEO_OPENGL_EGL 1)
  1577         set(SDL_VIDEO_OPENGL_ES2 1)
  1578         set(SDL_VIDEO_RENDER_OGL_ES2 1)
  1579         set(HAVE_VIDEO_OPENGLES TRUE)
  1580       endif()
  1581     endif()
  1582   endif()
  1583 
  1584   CheckPTHREAD()
  1585 
  1586 elseif(HAIKU)
  1587   if(SDL_VIDEO)
  1588     set(SDL_VIDEO_DRIVER_HAIKU 1)
  1589     file(GLOB HAIKUVIDEO_SOURCES ${SDL2_SOURCE_DIR}/src/video/haiku/*.c)
  1590     set(SOURCE_FILES ${SOURCE_FILES} ${HAIKUVIDEO_SOURCES})
  1591     set(HAVE_SDL_VIDEO TRUE)
  1592 
  1593     set(SDL_FILESYSTEM_HAIKU 1)
  1594     file(GLOB FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/haiku/*.cc)
  1595     set(SOURCE_FILES ${SOURCE_FILES} ${FILESYSTEM_SOURCES})
  1596     set(HAVE_SDL_FILESYSTEM TRUE)
  1597 
  1598     if(SDL_TIMERS)
  1599       set(SDL_TIMER_HAIKU 1)
  1600       file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/haiku/*.c)
  1601       set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES})
  1602       set(HAVE_SDL_TIMERS TRUE)
  1603     endif(SDL_TIMERS)
  1604 
  1605     if(VIDEO_OPENGL)
  1606       # TODO: Use FIND_PACKAGE(OpenGL) instead
  1607       set(SDL_VIDEO_OPENGL 1)
  1608       set(SDL_VIDEO_OPENGL_BGL 1)
  1609       set(SDL_VIDEO_RENDER_OGL 1)
  1610       list(APPEND EXTRA_LIBS GL)
  1611       set(HAVE_VIDEO_OPENGL TRUE)
  1612     endif()
  1613   endif()
  1614 
  1615   CheckPTHREAD()
  1616 endif()
  1617 
  1618 if(VIDEO_VULKAN)
  1619   set(SDL_VIDEO_VULKAN 1)
  1620   set(HAVE_VIDEO_VULKAN TRUE)
  1621 endif()
  1622 
  1623 # Dummies
  1624 # configure.ac does it differently:
  1625 # if not have X
  1626 #   if enable_X {  SDL_X_DISABLED = 1 }
  1627 #   [add dummy sources]
  1628 # so it always adds a dummy, without checking, if it was actually requested.
  1629 # This leads to missing internal references on building, since the
  1630 # src/X/*.c does not get included.
  1631 if(NOT HAVE_SDL_JOYSTICK)
  1632   set(SDL_JOYSTICK_DUMMY 1)
  1633   if(SDL_JOYSTICK AND NOT APPLE) # results in unresolved symbols on OSX
  1634 
  1635     file(GLOB JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/dummy/*.c)
  1636     set(SOURCE_FILES ${SOURCE_FILES} ${JOYSTICK_SOURCES})
  1637   endif()
  1638 endif()
  1639 if(NOT HAVE_SDL_HAPTIC)
  1640   set(SDL_HAPTIC_DUMMY 1)
  1641   file(GLOB HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/dummy/*.c)
  1642   set(SOURCE_FILES ${SOURCE_FILES} ${HAPTIC_SOURCES})
  1643 endif()
  1644 if(NOT HAVE_SDL_SENSORS)
  1645   set(SDL_SENSOR_DUMMY 1)
  1646   file(GLOB SENSORS_SOURCES ${SDL2_SOURCE_DIR}/src/sensor/dummy/*.c)
  1647   set(SOURCE_FILES ${SOURCE_FILES} ${SENSORS_SOURCES})
  1648 endif()
  1649 if(NOT HAVE_SDL_LOADSO)
  1650   set(SDL_LOADSO_DISABLED 1)
  1651   file(GLOB LOADSO_SOURCES ${SDL2_SOURCE_DIR}/src/loadso/dummy/*.c)
  1652   set(SOURCE_FILES ${SOURCE_FILES} ${LOADSO_SOURCES})
  1653 endif()
  1654 if(NOT HAVE_SDL_FILESYSTEM)
  1655   set(SDL_FILESYSTEM_DISABLED 1)
  1656   file(GLOB FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/dummy/*.c)
  1657   set(SOURCE_FILES ${SOURCE_FILES} ${FILESYSTEM_SOURCES})
  1658 endif()
  1659 
  1660 # We always need to have threads and timers around
  1661 if(NOT HAVE_SDL_THREADS)
  1662   set(SDL_THREADS_DISABLED 1)
  1663   file(GLOB THREADS_SOURCES ${SDL2_SOURCE_DIR}/src/thread/generic/*.c)
  1664   set(SOURCE_FILES ${SOURCE_FILES} ${THREADS_SOURCES})
  1665 endif()
  1666 if(NOT HAVE_SDL_TIMERS)
  1667   set(SDL_TIMERS_DISABLED 1)
  1668   file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/dummy/*.c)
  1669   set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES})
  1670 endif()
  1671 
  1672 if(NOT SDLMAIN_SOURCES)
  1673   file(GLOB SDLMAIN_SOURCES ${SDL2_SOURCE_DIR}/src/main/dummy/*.c)
  1674 endif()
  1675 
  1676 # Append the -MMD -MT flags
  1677 # if(DEPENDENCY_TRACKING)
  1678 #   if(COMPILER_IS_GNUCC)
  1679 #     set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -MMD -MT \$@")
  1680 #   endif()
  1681 # endif()
  1682 
  1683 configure_file("${SDL2_SOURCE_DIR}/include/SDL_config.h.cmake"
  1684   "${SDL2_BINARY_DIR}/include/SDL_config.h")
  1685 
  1686 # Prepare the flags and remove duplicates
  1687 if(EXTRA_LDFLAGS)
  1688   list(REMOVE_DUPLICATES EXTRA_LDFLAGS)
  1689 endif()
  1690 if(EXTRA_LIBS)
  1691   list(REMOVE_DUPLICATES EXTRA_LIBS)
  1692 endif()
  1693 if(EXTRA_CFLAGS)
  1694   list(REMOVE_DUPLICATES EXTRA_CFLAGS)
  1695 endif()
  1696 listtostr(EXTRA_CFLAGS _EXTRA_CFLAGS)
  1697 set(EXTRA_CFLAGS ${_EXTRA_CFLAGS})
  1698 
  1699 # Compat helpers for the configuration files
  1700 if(NOT WINDOWS OR CYGWIN)
  1701   # TODO: we need a Windows script, too
  1702   execute_process(COMMAND sh ${SDL2_SOURCE_DIR}/build-scripts/updaterev.sh)
  1703 
  1704   set(prefix ${CMAKE_INSTALL_PREFIX})
  1705   set(exec_prefix "\${prefix}")
  1706   set(libdir "\${exec_prefix}/lib${LIB_SUFFIX}")
  1707   set(bindir "\${exec_prefix}/bin")
  1708   set(includedir "\${prefix}/include")
  1709   if(SDL_STATIC)
  1710     set(ENABLE_STATIC_TRUE "")
  1711     set(ENABLE_STATIC_FALSE "#")
  1712   else()
  1713     set(ENABLE_STATIC_TRUE "#")
  1714     set(ENABLE_STATIC_FALSE "")
  1715   endif()
  1716   if(SDL_SHARED)
  1717     set(ENABLE_SHARED_TRUE "")
  1718     set(ENABLE_SHARED_FALSE "#")
  1719   else()
  1720     set(ENABLE_SHARED_TRUE "#")
  1721     set(ENABLE_SHARED_FALSE "")
  1722   endif()
  1723 
  1724   # Clean up the different lists
  1725   listtostr(EXTRA_LIBS _EXTRA_LIBS "-l")
  1726   set(SDL_STATIC_LIBS ${SDL_LIBS} ${EXTRA_LDFLAGS} ${_EXTRA_LIBS})
  1727   list(REMOVE_DUPLICATES SDL_STATIC_LIBS)
  1728   listtostr(SDL_STATIC_LIBS _SDL_STATIC_LIBS)
  1729   set(SDL_STATIC_LIBS ${_SDL_STATIC_LIBS})
  1730   listtostr(SDL_LIBS _SDL_LIBS)
  1731   set(SDL_LIBS ${_SDL_LIBS})
  1732 
  1733   # MESSAGE(STATUS "SDL_LIBS: ${SDL_LIBS}")
  1734   # MESSAGE(STATUS "SDL_STATIC_LIBS: ${SDL_STATIC_LIBS}")
  1735 
  1736   configure_file("${SDL2_SOURCE_DIR}/sdl2.pc.in"
  1737     "${SDL2_BINARY_DIR}/sdl2.pc" @ONLY)
  1738   configure_file("${SDL2_SOURCE_DIR}/sdl2-config.in"
  1739     "${SDL2_BINARY_DIR}/sdl2-config")
  1740   configure_file("${SDL2_SOURCE_DIR}/sdl2-config.in"
  1741     "${SDL2_BINARY_DIR}/sdl2-config" @ONLY)
  1742   configure_file("${SDL2_SOURCE_DIR}/SDL2.spec.in"
  1743     "${SDL2_BINARY_DIR}/SDL2.spec" @ONLY)
  1744 endif()
  1745 
  1746 ##### Info output #####
  1747 message(STATUS "")
  1748 message(STATUS "SDL2 was configured with the following options:")
  1749 message(STATUS "")
  1750 message(STATUS "Platform: ${CMAKE_SYSTEM}")
  1751 message(STATUS "64-bit:   ${ARCH_64}")
  1752 message(STATUS "Compiler: ${CMAKE_C_COMPILER}")
  1753 message(STATUS "")
  1754 message(STATUS "Subsystems:")
  1755 foreach(_SUB ${SDL_SUBSYSTEMS})
  1756   string(TOUPPER ${_SUB} _OPT)
  1757   message_bool_option(${_SUB} SDL_${_OPT})
  1758 endforeach()
  1759 message(STATUS "")
  1760 message(STATUS "Options:")
  1761 list(SORT ALLOPTIONS)
  1762 foreach(_OPT ${ALLOPTIONS})
  1763   # Longest option is VIDEO_X11_XSCREENSAVER = 22 characters
  1764   # Get the padding
  1765   string(LENGTH ${_OPT} _OPTLEN)
  1766   math(EXPR _PADLEN "23 - ${_OPTLEN}")
  1767   string(RANDOM LENGTH ${_PADLEN} ALPHABET " " _PADDING)
  1768   message_tested_option(${_OPT} ${_PADDING})
  1769 endforeach()
  1770 message(STATUS "")
  1771 message(STATUS " CFLAGS:        ${CMAKE_C_FLAGS}")
  1772 message(STATUS " EXTRA_CFLAGS:  ${EXTRA_CFLAGS}")
  1773 message(STATUS " EXTRA_LDFLAGS: ${EXTRA_LDFLAGS}")
  1774 message(STATUS " EXTRA_LIBS:    ${EXTRA_LIBS}")
  1775 message(STATUS "")
  1776 message(STATUS " Build Shared Library: ${SDL_SHARED}")
  1777 message(STATUS " Build Static Library: ${SDL_STATIC}")
  1778 if(SDL_STATIC)
  1779     message(STATUS " Build Static Library with Position Independent Code: ${SDL_STATIC_PIC}")
  1780 endif()
  1781 message(STATUS "")
  1782 if(UNIX)
  1783   message(STATUS "If something was not detected, although the libraries")
  1784   message(STATUS "were installed, then make sure you have set the")
  1785   message(STATUS "CFLAGS and LDFLAGS environment variables correctly.")
  1786   message(STATUS "")
  1787 endif()
  1788 
  1789 # Ensure that the extra cflags are used at compile time
  1790 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS}")
  1791 
  1792 # Always build SDLmain
  1793 add_library(SDL2main STATIC ${SDLMAIN_SOURCES})
  1794 target_include_directories(SDL2main PUBLIC "$<BUILD_INTERFACE:${SDL2_SOURCE_DIR}/include>" $<INSTALL_INTERFACE:include/SDL2>)
  1795 set(_INSTALL_LIBS "SDL2main")
  1796 if (NOT ANDROID)
  1797   set_target_properties(SDL2main PROPERTIES DEBUG_POSTFIX ${SDL_CMAKE_DEBUG_POSTFIX})
  1798 endif()
  1799 
  1800 if(SDL_SHARED)
  1801   add_library(SDL2 SHARED ${SOURCE_FILES} ${VERSION_SOURCES})
  1802   if(APPLE)
  1803     set_target_properties(SDL2 PROPERTIES
  1804       MACOSX_RPATH 1
  1805       OUTPUT_NAME "SDL2-${LT_RELEASE}")
  1806   elseif(UNIX AND NOT ANDROID)
  1807     set_target_properties(SDL2 PROPERTIES
  1808       VERSION ${LT_VERSION}
  1809       SOVERSION ${LT_REVISION}
  1810       OUTPUT_NAME "SDL2-${LT_RELEASE}")
  1811   else()
  1812     set_target_properties(SDL2 PROPERTIES
  1813       VERSION ${SDL_VERSION}
  1814       SOVERSION ${LT_REVISION}
  1815       OUTPUT_NAME "SDL2")
  1816   endif()
  1817   if(MSVC AND NOT LIBC)
  1818     # Don't try to link with the default set of libraries.
  1819     set_target_properties(SDL2 PROPERTIES LINK_FLAGS_RELEASE "/NODEFAULTLIB")
  1820     set_target_properties(SDL2 PROPERTIES LINK_FLAGS_DEBUG "/NODEFAULTLIB")
  1821     set_target_properties(SDL2 PROPERTIES STATIC_LIBRARY_FLAGS "/NODEFAULTLIB")
  1822   endif()
  1823   set(_INSTALL_LIBS "SDL2" ${_INSTALL_LIBS})
  1824   target_link_libraries(SDL2 ${EXTRA_LIBS} ${EXTRA_LDFLAGS})
  1825   target_include_directories(SDL2 PUBLIC "$<BUILD_INTERFACE:${SDL2_SOURCE_DIR}/include>" $<INSTALL_INTERFACE:include/SDL2>)
  1826   if (NOT ANDROID)
  1827     set_target_properties(SDL2 PROPERTIES DEBUG_POSTFIX ${SDL_CMAKE_DEBUG_POSTFIX})
  1828   endif()
  1829 endif()
  1830 
  1831 if(ANDROID)
  1832   if(HAVE_HIDAPI)
  1833     add_library(hidapi SHARED ${SDL2_SOURCE_DIR}/src/hidapi/android/hid.cpp)
  1834   endif()
  1835 
  1836   if(MSVC AND NOT LIBC)
  1837     # Don't try to link with the default set of libraries.
  1838     set_target_properties(hidapi PROPERTIES LINK_FLAGS_RELEASE "/NODEFAULTLIB")
  1839     set_target_properties(hidapi PROPERTIES LINK_FLAGS_DEBUG "/NODEFAULTLIB")
  1840     set_target_properties(hidapi PROPERTIES STATIC_LIBRARY_FLAGS "/NODEFAULTLIB")
  1841   endif()
  1842   target_link_libraries(hidapi log)
  1843 endif()
  1844 
  1845 if(SDL_STATIC)
  1846   set (BUILD_SHARED_LIBS FALSE)
  1847   add_library(SDL2-static STATIC ${SOURCE_FILES})
  1848   if (NOT SDL_SHARED OR NOT WIN32)
  1849     set_target_properties(SDL2-static PROPERTIES OUTPUT_NAME "SDL2")
  1850     # Note: Apparently, OUTPUT_NAME must really be unique; even when
  1851     # CMAKE_IMPORT_LIBRARY_SUFFIX or the like are given. Otherwise
  1852     # the static build may race with the import lib and one will get
  1853     # clobbered, when the suffix is realized via subsequent rename.
  1854   endif()
  1855   set_target_properties(SDL2-static PROPERTIES POSITION_INDEPENDENT_CODE ${SDL_STATIC_PIC})
  1856   if(MSVC AND NOT LIBC)
  1857     set_target_properties(SDL2-static PROPERTIES LINK_FLAGS_RELEASE "/NODEFAULTLIB")
  1858     set_target_properties(SDL2-static PROPERTIES LINK_FLAGS_DEBUG "/NODEFAULTLIB")
  1859     set_target_properties(SDL2-static PROPERTIES STATIC_LIBRARY_FLAGS "/NODEFAULTLIB")
  1860   endif()
  1861   # TODO: Win32 platforms keep the same suffix .lib for import and static
  1862   # libraries - do we need to consider this?
  1863   set(_INSTALL_LIBS "SDL2-static" ${_INSTALL_LIBS})
  1864   target_link_libraries(SDL2-static ${EXTRA_LIBS} ${EXTRA_LDFLAGS})
  1865   target_include_directories(SDL2-static PUBLIC "$<BUILD_INTERFACE:${SDL2_SOURCE_DIR}/include>" $<INSTALL_INTERFACE:include/SDL2>)
  1866   if (NOT ANDROID)
  1867     set_target_properties(SDL2-static PROPERTIES DEBUG_POSTFIX ${SDL_CMAKE_DEBUG_POSTFIX})
  1868   endif()
  1869 endif()
  1870 
  1871 ##### Tests #####
  1872 
  1873 if(SDL_TEST)
  1874   file(GLOB TEST_SOURCES ${SDL2_SOURCE_DIR}/src/test/*.c)
  1875   add_library(SDL2_test STATIC ${TEST_SOURCES})
  1876 
  1877   add_subdirectory(test)
  1878 endif()
  1879 
  1880 ##### Installation targets #####
  1881 install(TARGETS ${_INSTALL_LIBS} EXPORT SDL2Targets
  1882   LIBRARY DESTINATION "lib${LIB_SUFFIX}"
  1883   ARCHIVE DESTINATION "lib${LIB_SUFFIX}"
  1884   RUNTIME DESTINATION bin)
  1885 
  1886 ##### Export files #####
  1887 if (WINDOWS)
  1888   set(PKG_PREFIX "cmake")
  1889 else ()
  1890   set(PKG_PREFIX "lib/cmake/SDL2")
  1891 endif ()
  1892 
  1893 include(CMakePackageConfigHelpers)
  1894 write_basic_package_version_file("${CMAKE_BINARY_DIR}/SDL2ConfigVersion.cmake"
  1895   VERSION ${SDL_VERSION}
  1896   COMPATIBILITY AnyNewerVersion
  1897 )
  1898 
  1899 install(EXPORT SDL2Targets
  1900   FILE SDL2Targets.cmake
  1901   NAMESPACE SDL2::
  1902   DESTINATION ${PKG_PREFIX}
  1903 )
  1904 install(
  1905   FILES
  1906     ${CMAKE_CURRENT_SOURCE_DIR}/SDL2Config.cmake
  1907     ${CMAKE_BINARY_DIR}/SDL2ConfigVersion.cmake
  1908   DESTINATION ${PKG_PREFIX}
  1909   COMPONENT Devel
  1910 )
  1911 
  1912 file(GLOB INCLUDE_FILES ${SDL2_SOURCE_DIR}/include/*.h)
  1913 file(GLOB BIN_INCLUDE_FILES ${SDL2_BINARY_DIR}/include/*.h)
  1914 foreach(_FNAME ${BIN_INCLUDE_FILES})
  1915   get_filename_component(_INCNAME ${_FNAME} NAME)
  1916   list(REMOVE_ITEM INCLUDE_FILES ${SDL2_SOURCE_DIR}/include/${_INCNAME})
  1917 endforeach()
  1918 list(APPEND INCLUDE_FILES ${BIN_INCLUDE_FILES})
  1919 install(FILES ${INCLUDE_FILES} DESTINATION include/SDL2)
  1920 
  1921 string(TOUPPER "${CMAKE_BUILD_TYPE}" UPPER_BUILD_TYPE)
  1922 if (UPPER_BUILD_TYPE MATCHES DEBUG)
  1923   set(SOPOSTFIX "${SDL_CMAKE_DEBUG_POSTFIX}")
  1924 else()
  1925   set(SOPOSTFIX "")
  1926 endif()
  1927 
  1928 if(NOT (WINDOWS OR CYGWIN))
  1929   if(SDL_SHARED)
  1930     set(SOEXT ${CMAKE_SHARED_LIBRARY_SUFFIX}) # ".so", ".dylib", etc.
  1931     get_target_property(SONAME SDL2 OUTPUT_NAME)
  1932     if(NOT ANDROID)
  1933         install(CODE "
  1934           execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink
  1935             \"lib${SONAME}${SOPOSTFIX}${SOEXT}\" \"libSDL2${SOPOSTFIX}${SOEXT}\"
  1936             WORKING_DIRECTORY \"${SDL2_BINARY_DIR}\")")
  1937         install(FILES ${SDL2_BINARY_DIR}/libSDL2${SOPOSTFIX}${SOEXT} DESTINATION "lib${LIB_SUFFIX}")
  1938     endif()
  1939   endif()
  1940   if(FREEBSD)
  1941     # FreeBSD uses ${PREFIX}/libdata/pkgconfig
  1942     install(FILES ${SDL2_BINARY_DIR}/sdl2.pc DESTINATION "libdata/pkgconfig")
  1943   else()
  1944     install(FILES ${SDL2_BINARY_DIR}/sdl2.pc
  1945       DESTINATION "lib${LIB_SUFFIX}/pkgconfig")
  1946   endif()
  1947   install(PROGRAMS ${SDL2_BINARY_DIR}/sdl2-config DESTINATION bin)
  1948   # TODO: what about the .spec file? Is it only needed for RPM creation?
  1949   install(FILES "${SDL2_SOURCE_DIR}/sdl2.m4" DESTINATION "${CMAKE_INSTALL_FULL_DATAROOTDIR}/aclocal")
  1950 endif()
  1951 
  1952 ##### Uninstall target #####
  1953 
  1954 if(NOT TARGET uninstall)
  1955   configure_file(
  1956       "${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake.in"
  1957       "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
  1958       IMMEDIATE @ONLY)
  1959 
  1960   add_custom_target(uninstall
  1961       COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake)
  1962 endif()