CMakeLists.txt
author Sylvain Becker <sylvain.becker@gmail.com>
Thu, 03 Jan 2019 23:22:50 +0100
changeset 12499 e6130a4cca7a
parent 12443 0e07e768840f
child 12631 779b63fc4acb
permissions -rw-r--r--
Android: concurrency issue with egl_surface EGL_BAD_SURFACE - (bug 4142)

Occurs when application goes to background:
- Java activity is destroying SurfaceView holder and "egl_surface" (in onNativeSurfaceDestroyed())
- While native thread is in Android_GLES_SwapWindow(), prepared to call SDL_EGL_SwapBuffers()

The error is "call to eglSwapBuffers failed, reporting an error of EGL_BAD_SURFACE"

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