CMakeLists.txt
author Sam Lantinga
Sat, 08 Jun 2019 14:34:38 -0700
changeset 12791 74a69d4d9e9a
parent 12747 cdf53e16feb7
child 12792 4063a5ebe39b
permissions -rw-r--r--
Fixed bug 4594 - Fix install location of CMake targets on Apple platforms

tschwinger

Followup to #3651

As already noted by Ryan, no framework is being built, so we better install to lib/cmake.

That code was originally part of a patch submitted by David Demelier, whose credit BTW got lost (I combined his patch for #3572 with fixes for #2576 and #3613 resulting in #3651 because things started to depend on another).

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