CMakeLists.txt
author Sam Lantinga <slouken@libsdl.org>
Tue, 19 Mar 2019 17:20:54 -0700
changeset 12668 dd6b61160cdc
parent 12631 779b63fc4acb
child 12673 95689b6959db
permissions -rw-r--r--
Hopefully fixed the mingw32 build
     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 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
   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.in, 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   CheckPTHREAD()
   918 
   919 endif()
   920 
   921 # Platform-specific options and settings
   922 if(EMSCRIPTEN)
   923   # Hide noisy warnings that intend to aid mostly during initial stages of porting a new
   924   # project. Uncomment at will for verbose cross-compiling -I/../ path info.
   925   add_definitions(-Wno-warn-absolute-paths)
   926   if(SDL_AUDIO)
   927     set(SDL_AUDIO_DRIVER_EMSCRIPTEN 1)
   928     file(GLOB EM_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/emscripten/*.c)
   929     set(SOURCE_FILES ${SOURCE_FILES} ${EM_AUDIO_SOURCES})
   930     set(HAVE_SDL_AUDIO TRUE)
   931   endif()
   932   if(SDL_FILESYSTEM)
   933     set(SDL_FILESYSTEM_EMSCRIPTEN 1)
   934     file(GLOB EM_FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/emscripten/*.c)
   935     set(SOURCE_FILES ${SOURCE_FILES} ${EM_FILESYSTEM_SOURCES})
   936     set(HAVE_SDL_FILESYSTEM TRUE)
   937   endif()
   938   if(SDL_JOYSTICK)
   939     set(SDL_JOYSTICK_EMSCRIPTEN 1)
   940     file(GLOB EM_JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/emscripten/*.c)
   941     set(SOURCE_FILES ${SOURCE_FILES} ${EM_JOYSTICK_SOURCES})
   942     set(HAVE_SDL_JOYSTICK TRUE)
   943   endif()
   944   if(SDL_POWER)
   945     set(SDL_POWER_EMSCRIPTEN 1)
   946     file(GLOB EM_POWER_SOURCES ${SDL2_SOURCE_DIR}/src/power/emscripten/*.c)
   947     set(SOURCE_FILES ${SOURCE_FILES} ${EM_POWER_SOURCES})
   948     set(HAVE_SDL_POWER TRUE)
   949   endif()
   950   if(SDL_TIMERS)
   951     set(SDL_TIMER_UNIX 1)
   952     file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/unix/*.c)
   953     set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES})
   954     set(HAVE_SDL_TIMERS TRUE)
   955 
   956     if(CLOCK_GETTIME)
   957       set(HAVE_CLOCK_GETTIME 1)
   958     endif()
   959   endif()
   960   if(SDL_VIDEO)
   961     set(SDL_VIDEO_DRIVER_EMSCRIPTEN 1)
   962     file(GLOB EM_VIDEO_SOURCES ${SDL2_SOURCE_DIR}/src/video/emscripten/*.c)
   963     set(SOURCE_FILES ${SOURCE_FILES} ${EM_VIDEO_SOURCES})
   964     set(HAVE_SDL_VIDEO TRUE)
   965 
   966     #enable gles
   967     if(VIDEO_OPENGLES)
   968       set(SDL_VIDEO_OPENGL_EGL 1)
   969       set(HAVE_VIDEO_OPENGLES TRUE)
   970       set(SDL_VIDEO_OPENGL_ES2 1)
   971       set(SDL_VIDEO_RENDER_OGL_ES2 1)
   972     endif()
   973   endif()
   974 elseif(UNIX AND NOT APPLE AND NOT ANDROID)
   975   if(SDL_AUDIO)
   976     if(SYSV5 OR SOLARIS OR HPUX)
   977         set(SDL_AUDIO_DRIVER_SUNAUDIO 1)
   978         file(GLOB SUN_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/sun/*.c)
   979         set(SOURCE_FILES ${SOURCE_FILES} ${SUN_AUDIO_SOURCES})
   980         set(HAVE_SDL_AUDIO TRUE)
   981     elseif(NETBSD)
   982         set(SDL_AUDIO_DRIVER_NETBSD 1)
   983         file(GLOB NETBSD_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/netbsd/*.c)
   984         set(SOURCE_FILES ${SOURCE_FILES} ${NETBSD_AUDIO_SOURCES})
   985         set(HAVE_SDL_AUDIO TRUE)
   986     elseif(AIX)
   987         set(SDL_AUDIO_DRIVER_PAUDIO 1)
   988         file(GLOB AIX_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/paudio/*.c)
   989         set(SOURCE_FILES ${SOURCE_FILES} ${AIX_AUDIO_SOURCES})
   990         set(HAVE_SDL_AUDIO TRUE)
   991     endif()
   992     CheckOSS()
   993     CheckALSA()
   994     CheckJACK()
   995     CheckPulseAudio()
   996     CheckESD()
   997     CheckARTS()
   998     CheckNAS()
   999     CheckSNDIO()
  1000     CheckFusionSound()
  1001     CheckLibSampleRate()
  1002   endif()
  1003 
  1004   if(SDL_VIDEO)
  1005     # Need to check for Raspberry PI first and add platform specific compiler flags, otherwise the test for GLES fails!
  1006     CheckRPI()
  1007     CheckX11()
  1008     CheckDirectFB()
  1009     CheckOpenGLX11()
  1010     CheckOpenGLESX11()
  1011     CheckWayland()
  1012     CheckVivante()
  1013     CheckKMSDRM()
  1014   endif()
  1015 
  1016   if(UNIX)
  1017     file(GLOB CORE_UNIX_SOURCES ${SDL2_SOURCE_DIR}/src/core/unix/*.c)
  1018     set(SOURCE_FILES ${SOURCE_FILES} ${CORE_UNIX_SOURCES})
  1019   endif()
  1020 
  1021   if(LINUX)
  1022     check_c_source_compiles("
  1023         #include <linux/input.h>
  1024         #ifndef EVIOCGNAME
  1025         #error EVIOCGNAME() ioctl not available
  1026         #endif
  1027         int main(int argc, char** argv) {}" HAVE_INPUT_EVENTS)
  1028 
  1029     check_c_source_compiles("
  1030         #include <linux/kd.h>
  1031         #include <linux/keyboard.h>
  1032 
  1033         int main(int argc, char **argv)
  1034         {
  1035             struct kbentry kbe;
  1036             kbe.kb_table = KG_CTRL;
  1037             ioctl(0, KDGKBENT, &kbe);
  1038         }" HAVE_INPUT_KD)
  1039 
  1040     file(GLOB CORE_LINUX_SOURCES ${SDL2_SOURCE_DIR}/src/core/linux/*.c)
  1041     set(SOURCE_FILES ${SOURCE_FILES} ${CORE_LINUX_SOURCES})
  1042 
  1043     if(HAVE_INPUT_EVENTS)
  1044       set(SDL_INPUT_LINUXEV 1)
  1045     endif()
  1046 
  1047     if(SDL_HAPTIC AND HAVE_INPUT_EVENTS)
  1048       set(SDL_HAPTIC_LINUX 1)
  1049       file(GLOB HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/linux/*.c)
  1050       set(SOURCE_FILES ${SOURCE_FILES} ${HAPTIC_SOURCES})
  1051       set(HAVE_SDL_HAPTIC TRUE)
  1052     endif()
  1053 
  1054     if(HAVE_INPUT_KD)
  1055       set(SDL_INPUT_LINUXKD 1)
  1056     endif()
  1057 
  1058     check_include_file("libudev.h" HAVE_LIBUDEV_H)
  1059 
  1060     if(PKG_CONFIG_FOUND)
  1061       pkg_search_module(DBUS dbus-1 dbus)
  1062       if(DBUS_FOUND)
  1063         set(HAVE_DBUS_DBUS_H TRUE)
  1064         include_directories(${DBUS_INCLUDE_DIRS})
  1065         list(APPEND EXTRA_LIBS ${DBUS_LIBRARIES})
  1066       endif()
  1067 
  1068       pkg_search_module(IBUS ibus-1.0 ibus)
  1069       if(IBUS_FOUND)
  1070         set(HAVE_IBUS_IBUS_H TRUE)
  1071         include_directories(${IBUS_INCLUDE_DIRS})
  1072         list(APPEND EXTRA_LIBS ${IBUS_LIBRARIES})
  1073       endif()
  1074       if(HAVE_LIBUNWIND_H)
  1075         # We've already found the header, so REQUIRE the lib to be present
  1076         pkg_search_module(UNWIND REQUIRED libunwind)
  1077         pkg_search_module(UNWIND_GENERIC REQUIRED libunwind-generic)
  1078         list(APPEND EXTRA_LIBS ${UNWIND_LIBRARIES} ${UNWIND_GENERIC_LIBRARIES})
  1079       endif()
  1080     endif()
  1081 
  1082     check_include_file("fcitx/frontend.h" HAVE_FCITX_FRONTEND_H)
  1083   endif()
  1084 
  1085   if(INPUT_TSLIB)
  1086     check_c_source_compiles("
  1087         #include \"tslib.h\"
  1088         int main(int argc, char** argv) { }" HAVE_INPUT_TSLIB)
  1089     if(HAVE_INPUT_TSLIB)
  1090       set(SDL_INPUT_TSLIB 1)
  1091       list(APPEND EXTRA_LIBS ts)
  1092     endif()
  1093   endif()
  1094 
  1095   if(SDL_JOYSTICK)
  1096     CheckUSBHID()   # seems to be BSD specific - limit the test to BSD only?
  1097     if(LINUX AND NOT ANDROID)
  1098       set(SDL_JOYSTICK_LINUX 1)
  1099       file(GLOB JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/linux/*.c ${SDL2_SOURCE_DIR}/src/joystick/steam/*.c)
  1100       set(SOURCE_FILES ${SOURCE_FILES} ${JOYSTICK_SOURCES})
  1101       set(HAVE_SDL_JOYSTICK TRUE)
  1102     endif()
  1103   endif()
  1104 
  1105   CheckPTHREAD()
  1106 
  1107   if(CLOCK_GETTIME)
  1108     check_library_exists(rt clock_gettime "" FOUND_CLOCK_GETTIME)
  1109     if(FOUND_CLOCK_GETTIME)
  1110       list(APPEND EXTRA_LIBS rt)
  1111       set(HAVE_CLOCK_GETTIME 1)
  1112     else()
  1113       check_library_exists(c clock_gettime "" FOUND_CLOCK_GETTIME)
  1114       if(FOUND_CLOCK_GETTIME)
  1115         set(HAVE_CLOCK_GETTIME 1)
  1116       endif()
  1117     endif()
  1118   endif()
  1119 
  1120   check_include_file(linux/version.h HAVE_LINUX_VERSION_H)
  1121   if(HAVE_LINUX_VERSION_H)
  1122     set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DHAVE_LINUX_VERSION_H")
  1123   endif()
  1124 
  1125   if(SDL_POWER)
  1126     if(LINUX)
  1127       set(SDL_POWER_LINUX 1)
  1128       file(GLOB POWER_SOURCES ${SDL2_SOURCE_DIR}/src/power/linux/*.c)
  1129       set(SOURCE_FILES ${SOURCE_FILES} ${POWER_SOURCES})
  1130       set(HAVE_SDL_POWER TRUE)
  1131     endif()
  1132   endif()
  1133 
  1134   if(SDL_FILESYSTEM)
  1135     set(SDL_FILESYSTEM_UNIX 1)
  1136     file(GLOB FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/unix/*.c)
  1137     set(SOURCE_FILES ${SOURCE_FILES} ${FILESYSTEM_SOURCES})
  1138     set(HAVE_SDL_FILESYSTEM TRUE)
  1139   endif()
  1140 
  1141   if(SDL_TIMERS)
  1142     set(SDL_TIMER_UNIX 1)
  1143     file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/unix/*.c)
  1144     set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES})
  1145     set(HAVE_SDL_TIMERS TRUE)
  1146   endif()
  1147 
  1148   if(RPATH)
  1149     set(SDL_RLD_FLAGS "")
  1150     if(BSDI OR FREEBSD OR LINUX OR NETBSD)
  1151       set(CMAKE_REQUIRED_FLAGS "-Wl,--enable-new-dtags")
  1152       check_c_compiler_flag("" HAVE_ENABLE_NEW_DTAGS)
  1153       set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS})
  1154       if(HAVE_ENABLE_NEW_DTAGS)
  1155         set(SDL_RLD_FLAGS "-Wl,-rpath,\${libdir} -Wl,--enable-new-dtags")
  1156       else()
  1157         set(SDL_RLD_FLAGS "-Wl,-rpath,\${libdir}")
  1158       endif()
  1159     elseif(SOLARIS)
  1160       set(SDL_RLD_FLAGS "-R\${libdir}")
  1161     endif()
  1162     set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)
  1163     set(HAVE_RPATH TRUE)
  1164   endif()
  1165 
  1166 elseif(WINDOWS)
  1167   find_program(WINDRES windres)
  1168 
  1169   check_c_source_compiles("
  1170     #include <windows.h>
  1171     int main(int argc, char **argv) { }" HAVE_WIN32_CC)
  1172 
  1173   file(GLOB CORE_SOURCES ${SDL2_SOURCE_DIR}/src/core/windows/*.c)
  1174   set(SOURCE_FILES ${SOURCE_FILES} ${CORE_SOURCES})
  1175 
  1176   if(MSVC)
  1177     # Prevent codegen that would use the VC runtime libraries.
  1178     set_property(DIRECTORY . APPEND PROPERTY COMPILE_OPTIONS "/GS-")
  1179     if(NOT ARCH_64)
  1180       set_property(DIRECTORY . APPEND PROPERTY COMPILE_OPTIONS "/arch:SSE")
  1181     endif()
  1182   endif()
  1183 
  1184   # Check for DirectX
  1185   if(DIRECTX)
  1186     if(DEFINED MSVC_VERSION AND NOT ${MSVC_VERSION} LESS 1700)
  1187         set(USE_WINSDK_DIRECTX TRUE)
  1188     endif()
  1189     if(NOT CMAKE_COMPILER_IS_MINGW AND NOT USE_WINSDK_DIRECTX)
  1190       if("$ENV{DXSDK_DIR}" STREQUAL "")
  1191         message_error("DIRECTX requires the \$DXSDK_DIR environment variable to be set")
  1192       endif()
  1193       set(CMAKE_REQUIRED_FLAGS "/I\"$ENV{DXSDK_DIR}\\Include\"")
  1194     endif()
  1195 
  1196     if(HAVE_WIN32_CC)
  1197       # xinput.h may need windows.h, but doesn't include it itself.
  1198       check_c_source_compiles("
  1199         #include <windows.h>
  1200         #include <xinput.h>
  1201         int main(int argc, char **argv) { }" HAVE_XINPUT_H)
  1202       check_c_source_compiles("
  1203         #include <windows.h>
  1204         #include <xinput.h>
  1205         XINPUT_GAMEPAD_EX x1;
  1206         int main(int argc, char **argv) { }" HAVE_XINPUT_GAMEPAD_EX)
  1207       check_c_source_compiles("
  1208         #include <windows.h>
  1209         #include <xinput.h>
  1210         XINPUT_STATE_EX s1;
  1211         int main(int argc, char **argv) { }" HAVE_XINPUT_STATE_EX)
  1212     else()
  1213       check_include_file(xinput.h HAVE_XINPUT_H)
  1214     endif()
  1215 
  1216     check_include_file(d3d9.h HAVE_D3D_H)
  1217     check_include_file(d3d11_1.h HAVE_D3D11_H)
  1218     check_include_file(ddraw.h HAVE_DDRAW_H)
  1219     check_include_file(dsound.h HAVE_DSOUND_H)
  1220     check_include_file(dinput.h HAVE_DINPUT_H)
  1221     check_include_file(dxgi.h HAVE_DXGI_H)
  1222     if(HAVE_D3D_H OR HAVE_D3D11_H OR HAVE_DDRAW_H OR HAVE_DSOUND_H OR HAVE_DINPUT_H)
  1223       set(HAVE_DIRECTX TRUE)
  1224       if(NOT CMAKE_COMPILER_IS_MINGW AND NOT USE_WINSDK_DIRECTX)
  1225       # TODO: change $ENV{DXSDL_DIR} to get the path from the include checks
  1226         link_directories($ENV{DXSDK_DIR}\\lib\\${PROCESSOR_ARCH})
  1227         include_directories($ENV{DXSDK_DIR}\\Include)
  1228       endif()
  1229     endif()
  1230     set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS})
  1231   endif()
  1232 
  1233   # headers needed elsewhere ...
  1234   check_include_file(mmdeviceapi.h HAVE_MMDEVICEAPI_H)
  1235   check_include_file(audioclient.h HAVE_AUDIOCLIENT_H)
  1236   check_include_file(endpointvolume.h HAVE_ENDPOINTVOLUME_H)
  1237 
  1238   if(SDL_AUDIO)
  1239     set(SDL_AUDIO_DRIVER_WINMM 1)
  1240     file(GLOB WINMM_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/winmm/*.c)
  1241     set(SOURCE_FILES ${SOURCE_FILES} ${WINMM_AUDIO_SOURCES})
  1242     set(HAVE_SDL_AUDIO TRUE)
  1243 
  1244     if(HAVE_DSOUND_H)
  1245       set(SDL_AUDIO_DRIVER_DSOUND 1)
  1246       file(GLOB DSOUND_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/directsound/*.c)
  1247       set(SOURCE_FILES ${SOURCE_FILES} ${DSOUND_AUDIO_SOURCES})
  1248     endif()
  1249 
  1250     if(WASAPI AND HAVE_AUDIOCLIENT_H AND HAVE_MMDEVICEAPI_H)
  1251       set(SDL_AUDIO_DRIVER_WASAPI 1)
  1252       file(GLOB WASAPI_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/wasapi/*.c)
  1253       set(SOURCE_FILES ${SOURCE_FILES} ${WASAPI_AUDIO_SOURCES})
  1254     endif()
  1255   endif()
  1256 
  1257   if(SDL_VIDEO)
  1258     # requires SDL_LOADSO on Windows (IME, DX, etc.)
  1259     if(NOT SDL_LOADSO)
  1260       message_error("SDL_VIDEO requires SDL_LOADSO, which is not enabled")
  1261     endif()
  1262     set(SDL_VIDEO_DRIVER_WINDOWS 1)
  1263     file(GLOB WIN_VIDEO_SOURCES ${SDL2_SOURCE_DIR}/src/video/windows/*.c)
  1264     set(SOURCE_FILES ${SOURCE_FILES} ${WIN_VIDEO_SOURCES})
  1265 
  1266     if(RENDER_D3D AND HAVE_D3D_H)
  1267       set(SDL_VIDEO_RENDER_D3D 1)
  1268       set(HAVE_RENDER_D3D TRUE)
  1269     endif()
  1270     if(RENDER_D3D AND HAVE_D3D11_H)
  1271       set(SDL_VIDEO_RENDER_D3D11 1)
  1272       set(HAVE_RENDER_D3D TRUE)
  1273     endif()
  1274     set(HAVE_SDL_VIDEO TRUE)
  1275   endif()
  1276 
  1277   if(SDL_THREADS)
  1278     set(SDL_THREAD_WINDOWS 1)
  1279     set(SOURCE_FILES ${SOURCE_FILES}
  1280       ${SDL2_SOURCE_DIR}/src/thread/windows/SDL_sysmutex.c
  1281       ${SDL2_SOURCE_DIR}/src/thread/windows/SDL_syssem.c
  1282       ${SDL2_SOURCE_DIR}/src/thread/windows/SDL_systhread.c
  1283       ${SDL2_SOURCE_DIR}/src/thread/windows/SDL_systls.c
  1284       ${SDL2_SOURCE_DIR}/src/thread/generic/SDL_syscond.c)
  1285     set(HAVE_SDL_THREADS TRUE)
  1286   endif()
  1287 
  1288   if(SDL_POWER)
  1289     set(SDL_POWER_WINDOWS 1)
  1290     set(SOURCE_FILES ${SOURCE_FILES} ${SDL2_SOURCE_DIR}/src/power/windows/SDL_syspower.c)
  1291     set(HAVE_SDL_POWER TRUE)
  1292   endif()
  1293 
  1294   if(SDL_FILESYSTEM)
  1295     set(SDL_FILESYSTEM_WINDOWS 1)
  1296     file(GLOB FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/windows/*.c)
  1297     set(SOURCE_FILES ${SOURCE_FILES} ${FILESYSTEM_SOURCES})
  1298     set(HAVE_SDL_FILESYSTEM TRUE)
  1299   endif()
  1300 
  1301   # Libraries for Win32 native and MinGW
  1302   list(APPEND EXTRA_LIBS user32 gdi32 winmm imm32 ole32 oleaut32 version uuid advapi32 shell32)
  1303 
  1304   # TODO: in configure.in the check for timers is set on
  1305   # cygwin | mingw32* - does this include mingw32CE?
  1306   if(SDL_TIMERS)
  1307     set(SDL_TIMER_WINDOWS 1)
  1308     file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/windows/*.c)
  1309     set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES})
  1310     set(HAVE_SDL_TIMERS TRUE)
  1311   endif()
  1312 
  1313   if(SDL_LOADSO)
  1314     set(SDL_LOADSO_WINDOWS 1)
  1315     file(GLOB LOADSO_SOURCES ${SDL2_SOURCE_DIR}/src/loadso/windows/*.c)
  1316     set(SOURCE_FILES ${SOURCE_FILES} ${LOADSO_SOURCES})
  1317     set(HAVE_SDL_LOADSO TRUE)
  1318   endif()
  1319 
  1320   file(GLOB CORE_SOURCES ${SDL2_SOURCE_DIR}/src/core/windows/*.c)
  1321   set(SOURCE_FILES ${SOURCE_FILES} ${CORE_SOURCES})
  1322 
  1323   if(SDL_VIDEO)
  1324     if(VIDEO_OPENGL)
  1325       set(SDL_VIDEO_OPENGL 1)
  1326       set(SDL_VIDEO_OPENGL_WGL 1)
  1327       set(SDL_VIDEO_RENDER_OGL 1)
  1328       set(HAVE_VIDEO_OPENGL TRUE)
  1329     endif()
  1330 
  1331     if(VIDEO_OPENGLES)
  1332       set(SDL_VIDEO_OPENGL_EGL 1)
  1333       set(SDL_VIDEO_OPENGL_ES2 1)
  1334       set(SDL_VIDEO_RENDER_OGL_ES2 1)
  1335       set(HAVE_VIDEO_OPENGLES TRUE)
  1336     endif()
  1337   endif()
  1338 
  1339   if(SDL_JOYSTICK)
  1340     file(GLOB JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/windows/*.c)
  1341     set(SOURCE_FILES ${SOURCE_FILES} ${JOYSTICK_SOURCES})
  1342     if(HAVE_DINPUT_H)
  1343       set(SDL_JOYSTICK_DINPUT 1)
  1344       list(APPEND EXTRA_LIBS dinput8)
  1345       if(CMAKE_COMPILER_IS_MINGW)
  1346         list(APPEND EXTRA_LIBS dxerr8)
  1347       elseif (NOT USE_WINSDK_DIRECTX)
  1348         list(APPEND EXTRA_LIBS dxerr)
  1349       endif()
  1350     endif()
  1351     if(HAVE_XINPUT_H)
  1352       set(SDL_JOYSTICK_XINPUT 1)
  1353     endif()
  1354     if(NOT HAVE_DINPUT_H AND NOT HAVE_XINPUT_H)
  1355       set(SDL_JOYSTICK_WINMM 1)
  1356     endif()
  1357     set(HAVE_SDL_JOYSTICK TRUE)
  1358 
  1359     if(SDL_HAPTIC)
  1360       if(HAVE_DINPUT_H OR HAVE_XINPUT_H)
  1361         file(GLOB HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/windows/*.c)
  1362         if(HAVE_DINPUT_H)
  1363           set(SDL_HAPTIC_DINPUT 1)
  1364         endif()
  1365         if(HAVE_XINPUT_H)
  1366           set(SDL_HAPTIC_XINPUT 1)
  1367         endif()
  1368       else()
  1369         file(GLOB HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/dummy/*.c)
  1370         set(SDL_HAPTIC_DUMMY 1)
  1371       endif()
  1372       set(SOURCE_FILES ${SOURCE_FILES} ${HAPTIC_SOURCES})
  1373       set(HAVE_SDL_HAPTIC TRUE)
  1374     endif()
  1375   endif()
  1376 
  1377   file(GLOB VERSION_SOURCES ${SDL2_SOURCE_DIR}/src/main/windows/*.rc)
  1378   file(GLOB SDLMAIN_SOURCES ${SDL2_SOURCE_DIR}/src/main/windows/*.c)
  1379   if(MINGW OR CYGWIN)
  1380     list(APPEND EXTRA_LIBS mingw32)
  1381     list(APPEND EXTRA_LDFLAGS "-mwindows")
  1382     set(SDL_CFLAGS "${SDL_CFLAGS} -Dmain=SDL_main")
  1383     list(APPEND SDL_LIBS "-lmingw32" "-lSDL2main" "-mwindows")
  1384   endif()
  1385 elseif(APPLE)
  1386   # TODO: rework this all for proper MacOS X, iOS and Darwin support
  1387 
  1388   # We always need these libs on macOS at the moment.
  1389   # !!! FIXME: we need Carbon for some very old API calls in
  1390   # !!! FIXME:  src/video/cocoa/SDL_cocoakeyboard.c, but we should figure out
  1391   # !!! FIXME:  how to dump those.
  1392   if(NOT IOS)
  1393     set(SDL_FRAMEWORK_COCOA 1)
  1394     set(SDL_FRAMEWORK_CARBON 1)
  1395   endif()
  1396 
  1397   # Requires the darwin file implementation
  1398   if(SDL_FILE)
  1399     file(GLOB EXTRA_SOURCES ${SDL2_SOURCE_DIR}/src/file/cocoa/*.m)
  1400     set(SOURCE_FILES ${EXTRA_SOURCES} ${SOURCE_FILES})
  1401     # !!! FIXME: modern CMake doesn't need "LANGUAGE C" for Objective-C.
  1402     set_source_files_properties(${EXTRA_SOURCES} PROPERTIES LANGUAGE C)
  1403     set(HAVE_SDL_FILE TRUE)
  1404     # !!! FIXME: why is COREVIDEO inside this if() block?
  1405     set(SDL_FRAMEWORK_COREVIDEO 1)
  1406   else()
  1407     message_error("SDL_FILE must be enabled to build on MacOS X")
  1408   endif()
  1409 
  1410   if(SDL_AUDIO)
  1411     set(SDL_AUDIO_DRIVER_COREAUDIO 1)
  1412     file(GLOB AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/coreaudio/*.m)
  1413     # !!! FIXME: modern CMake doesn't need "LANGUAGE C" for Objective-C.
  1414     set_source_files_properties(${AUDIO_SOURCES} PROPERTIES LANGUAGE C)
  1415     set(SOURCE_FILES ${SOURCE_FILES} ${AUDIO_SOURCES})
  1416     set(HAVE_SDL_AUDIO TRUE)
  1417     set(SDL_FRAMEWORK_COREAUDIO 1)
  1418     set(SDL_FRAMEWORK_AUDIOTOOLBOX 1)
  1419   endif()
  1420 
  1421   if(SDL_JOYSTICK)
  1422     set(SDL_JOYSTICK_IOKIT 1)
  1423     if (IOS)
  1424       file(GLOB JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/iphoneos/*.m ${SDL2_SOURCE_DIR}/src/joystick/steam/*.c)
  1425     else()
  1426       file(GLOB JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/darwin/*.c)
  1427     endif()
  1428     set(SOURCE_FILES ${SOURCE_FILES} ${JOYSTICK_SOURCES})
  1429     set(HAVE_SDL_JOYSTICK TRUE)
  1430     set(SDL_FRAMEWORK_IOKIT 1)
  1431     set(SDL_FRAMEWORK_FF 1)
  1432   endif()
  1433 
  1434   if(SDL_HAPTIC)
  1435     set(SDL_HAPTIC_IOKIT 1)
  1436     if (IOS)
  1437       file(GLOB HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/dummy/*.c)
  1438       set(SDL_HAPTIC_DUMMY 1)
  1439     else()
  1440       file(GLOB HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/darwin/*.c)
  1441     endif()
  1442     set(SOURCE_FILES ${SOURCE_FILES} ${HAPTIC_SOURCES})
  1443     set(HAVE_SDL_HAPTIC TRUE)
  1444     set(SDL_FRAMEWORK_IOKIT 1)
  1445     set(SDL_FRAMEWORK_FF 1)
  1446     if(NOT SDL_JOYSTICK)
  1447       message(FATAL_ERROR "SDL_HAPTIC requires SDL_JOYSTICK to be enabled")
  1448     endif()
  1449   endif()
  1450 
  1451   if(SDL_POWER)
  1452     set(SDL_POWER_MACOSX 1)
  1453     if (IOS)
  1454       file(GLOB POWER_SOURCES ${SDL2_SOURCE_DIR}/src/power/uikit/*.m)
  1455     else()
  1456       file(GLOB POWER_SOURCES ${SDL2_SOURCE_DIR}/src/power/macosx/*.c)
  1457     endif()
  1458     set(SOURCE_FILES ${SOURCE_FILES} ${POWER_SOURCES})
  1459     set(HAVE_SDL_POWER TRUE)
  1460     set(SDL_FRAMEWORK_IOKIT 1)
  1461   endif()
  1462 
  1463   if(SDL_TIMERS)
  1464     set(SDL_TIMER_UNIX 1)
  1465     file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/unix/*.c)
  1466     set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES})
  1467     set(HAVE_SDL_TIMERS TRUE)
  1468   endif(SDL_TIMERS)
  1469 
  1470   if(SDL_FILESYSTEM)
  1471     set(SDL_FILESYSTEM_COCOA 1)
  1472     file(GLOB FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/cocoa/*.m)
  1473     # !!! FIXME: modern CMake doesn't need "LANGUAGE C" for Objective-C.
  1474     set_source_files_properties(${FILESYSTEM_SOURCES} PROPERTIES LANGUAGE C)
  1475     set(SOURCE_FILES ${SOURCE_FILES} ${FILESYSTEM_SOURCES})
  1476     set(HAVE_SDL_FILESYSTEM TRUE)
  1477   endif()
  1478 
  1479   # Actually load the frameworks at the end so we don't duplicate include.
  1480   if(SDL_FRAMEWORK_COREVIDEO)
  1481     find_library(COREVIDEO CoreVideo)
  1482     list(APPEND EXTRA_LIBS ${COREVIDEO})
  1483   endif()
  1484   if(SDL_FRAMEWORK_COCOA)
  1485     find_library(COCOA_LIBRARY Cocoa)
  1486     list(APPEND EXTRA_LIBS ${COCOA_LIBRARY})
  1487   endif()
  1488   if(SDL_FRAMEWORK_IOKIT)
  1489     find_library(IOKIT IOKit)
  1490     list(APPEND EXTRA_LIBS ${IOKIT})
  1491   endif()
  1492   if(SDL_FRAMEWORK_FF)
  1493     find_library(FORCEFEEDBACK ForceFeedback)
  1494     list(APPEND EXTRA_LIBS ${FORCEFEEDBACK})
  1495   endif()
  1496   if(SDL_FRAMEWORK_CARBON)
  1497     find_library(CARBON_LIBRARY Carbon)
  1498     list(APPEND EXTRA_LIBS ${CARBON_LIBRARY})
  1499   endif()
  1500   if(SDL_FRAMEWORK_COREAUDIO)
  1501     find_library(COREAUDIO CoreAudio)
  1502     list(APPEND EXTRA_LIBS ${COREAUDIO})
  1503   endif()
  1504   if(SDL_FRAMEWORK_AUDIOTOOLBOX)
  1505     find_library(AUDIOTOOLBOX AudioToolbox)
  1506     list(APPEND EXTRA_LIBS ${AUDIOTOOLBOX})
  1507   endif()
  1508 
  1509   # iOS hack needed - http://code.google.com/p/ios-cmake/ ?
  1510   if(SDL_VIDEO)
  1511     if (IOS)
  1512       set(SDL_VIDEO_DRIVER_UIKIT 1)
  1513       file(GLOB UIKITVIDEO_SOURCES ${SDL2_SOURCE_DIR}/src/video/uikit/*.m)
  1514       set(SOURCE_FILES ${SOURCE_FILES} ${UIKITVIDEO_SOURCES})
  1515     else()
  1516       CheckCOCOA()
  1517       if(VIDEO_OPENGL)
  1518         set(SDL_VIDEO_OPENGL 1)
  1519         set(SDL_VIDEO_OPENGL_CGL 1)
  1520         set(SDL_VIDEO_RENDER_OGL 1)
  1521         set(HAVE_VIDEO_OPENGL TRUE)
  1522       endif()
  1523 
  1524       if(VIDEO_OPENGLES)
  1525         set(SDL_VIDEO_OPENGL_EGL 1)
  1526         set(SDL_VIDEO_OPENGL_ES2 1)
  1527         set(SDL_VIDEO_RENDER_OGL_ES2 1)
  1528         set(HAVE_VIDEO_OPENGLES TRUE)
  1529       endif()
  1530     endif()
  1531   endif()
  1532 
  1533   CheckPTHREAD()
  1534 elseif(HAIKU)
  1535   if(SDL_VIDEO)
  1536     set(SDL_VIDEO_DRIVER_HAIKU 1)
  1537     file(GLOB HAIKUVIDEO_SOURCES ${SDL2_SOURCE_DIR}/src/video/haiku/*.c)
  1538     set(SOURCE_FILES ${SOURCE_FILES} ${HAIKUVIDEO_SOURCES})
  1539     set(HAVE_SDL_VIDEO TRUE)
  1540 
  1541     set(SDL_FILESYSTEM_HAIKU 1)
  1542     file(GLOB FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/haiku/*.cc)
  1543     set(SOURCE_FILES ${SOURCE_FILES} ${FILESYSTEM_SOURCES})
  1544     set(HAVE_SDL_FILESYSTEM TRUE)
  1545 
  1546     if(SDL_TIMERS)
  1547       set(SDL_TIMER_HAIKU 1)
  1548       file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/haiku/*.c)
  1549       set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES})
  1550       set(HAVE_SDL_TIMERS TRUE)
  1551     endif(SDL_TIMERS)
  1552 
  1553     if(VIDEO_OPENGL)
  1554       # TODO: Use FIND_PACKAGE(OpenGL) instead
  1555       set(SDL_VIDEO_OPENGL 1)
  1556       set(SDL_VIDEO_OPENGL_BGL 1)
  1557       set(SDL_VIDEO_RENDER_OGL 1)
  1558       list(APPEND EXTRA_LIBS GL)
  1559       set(HAVE_VIDEO_OPENGL TRUE)
  1560     endif()
  1561   endif()
  1562 
  1563   CheckPTHREAD()
  1564 endif()
  1565 
  1566 if(VIDEO_VULKAN)
  1567   set(SDL_VIDEO_VULKAN 1)
  1568   set(HAVE_VIDEO_VULKAN TRUE)
  1569 endif()
  1570 
  1571 # Dummies
  1572 # configure.in does it differently:
  1573 # if not have X
  1574 #   if enable_X {  SDL_X_DISABLED = 1 }
  1575 #   [add dummy sources]
  1576 # so it always adds a dummy, without checking, if it was actually requested.
  1577 # This leads to missing internal references on building, since the
  1578 # src/X/*.c does not get included.
  1579 if(NOT HAVE_SDL_JOYSTICK)
  1580   set(SDL_JOYSTICK_DUMMY 1)
  1581   if(SDL_JOYSTICK AND NOT APPLE) # results in unresolved symbols on OSX
  1582 
  1583     file(GLOB JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/dummy/*.c)
  1584     set(SOURCE_FILES ${SOURCE_FILES} ${JOYSTICK_SOURCES})
  1585   endif()
  1586 endif()
  1587 if(NOT HAVE_SDL_HAPTIC)
  1588   set(SDL_HAPTIC_DUMMY 1)
  1589   file(GLOB HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/dummy/*.c)
  1590   set(SOURCE_FILES ${SOURCE_FILES} ${HAPTIC_SOURCES})
  1591 endif()
  1592 if(NOT HAVE_SDL_SENSORS)
  1593   set(SDL_SENSOR_DUMMY 1)
  1594   file(GLOB SENSORS_SOURCES ${SDL2_SOURCE_DIR}/src/sensor/dummy/*.c)
  1595   set(SOURCE_FILES ${SOURCE_FILES} ${SENSORS_SOURCES})
  1596 endif()
  1597 if(NOT HAVE_SDL_LOADSO)
  1598   set(SDL_LOADSO_DISABLED 1)
  1599   file(GLOB LOADSO_SOURCES ${SDL2_SOURCE_DIR}/src/loadso/dummy/*.c)
  1600   set(SOURCE_FILES ${SOURCE_FILES} ${LOADSO_SOURCES})
  1601 endif()
  1602 if(NOT HAVE_SDL_FILESYSTEM)
  1603   set(SDL_FILESYSTEM_DISABLED 1)
  1604   file(GLOB FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/dummy/*.c)
  1605   set(SOURCE_FILES ${SOURCE_FILES} ${FILESYSTEM_SOURCES})
  1606 endif()
  1607 
  1608 # We always need to have threads and timers around
  1609 if(NOT HAVE_SDL_THREADS)
  1610   set(SDL_THREADS_DISABLED 1)
  1611   file(GLOB THREADS_SOURCES ${SDL2_SOURCE_DIR}/src/thread/generic/*.c)
  1612   set(SOURCE_FILES ${SOURCE_FILES} ${THREADS_SOURCES})
  1613 endif()
  1614 if(NOT HAVE_SDL_TIMERS)
  1615   set(SDL_TIMERS_DISABLED 1)
  1616   file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/dummy/*.c)
  1617   set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES})
  1618 endif()
  1619 
  1620 if(NOT SDLMAIN_SOURCES)
  1621   file(GLOB SDLMAIN_SOURCES ${SDL2_SOURCE_DIR}/src/main/dummy/*.c)
  1622 endif()
  1623 
  1624 # Append the -MMD -MT flags
  1625 # if(DEPENDENCY_TRACKING)
  1626 #   if(COMPILER_IS_GNUCC)
  1627 #     set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -MMD -MT \$@")
  1628 #   endif()
  1629 # endif()
  1630 
  1631 configure_file("${SDL2_SOURCE_DIR}/include/SDL_config.h.cmake"
  1632   "${SDL2_BINARY_DIR}/include/SDL_config.h")
  1633 
  1634 # Prepare the flags and remove duplicates
  1635 if(EXTRA_LDFLAGS)
  1636   list(REMOVE_DUPLICATES EXTRA_LDFLAGS)
  1637 endif()
  1638 if(EXTRA_LIBS)
  1639   list(REMOVE_DUPLICATES EXTRA_LIBS)
  1640 endif()
  1641 if(EXTRA_CFLAGS)
  1642   list(REMOVE_DUPLICATES EXTRA_CFLAGS)
  1643 endif()
  1644 listtostr(EXTRA_CFLAGS _EXTRA_CFLAGS)
  1645 set(EXTRA_CFLAGS ${_EXTRA_CFLAGS})
  1646 
  1647 # Compat helpers for the configuration files
  1648 if(NOT WINDOWS OR CYGWIN)
  1649   # TODO: we need a Windows script, too
  1650   execute_process(COMMAND sh ${SDL2_SOURCE_DIR}/build-scripts/updaterev.sh)
  1651 
  1652   set(prefix ${CMAKE_INSTALL_PREFIX})
  1653   set(exec_prefix "\${prefix}")
  1654   set(libdir "\${exec_prefix}/lib${LIB_SUFFIX}")
  1655   set(bindir "\${exec_prefix}/bin")
  1656   set(includedir "\${prefix}/include")
  1657   if(SDL_STATIC)
  1658     set(ENABLE_STATIC_TRUE "")
  1659     set(ENABLE_STATIC_FALSE "#")
  1660   else()
  1661     set(ENABLE_STATIC_TRUE "#")
  1662     set(ENABLE_STATIC_FALSE "")
  1663   endif()
  1664   if(SDL_SHARED)
  1665     set(ENABLE_SHARED_TRUE "")
  1666     set(ENABLE_SHARED_FALSE "#")
  1667   else()
  1668     set(ENABLE_SHARED_TRUE "#")
  1669     set(ENABLE_SHARED_FALSE "")
  1670   endif()
  1671 
  1672   # Clean up the different lists
  1673   listtostr(EXTRA_LIBS _EXTRA_LIBS "-l")
  1674   set(SDL_STATIC_LIBS ${SDL_LIBS} ${EXTRA_LDFLAGS} ${_EXTRA_LIBS})
  1675   list(REMOVE_DUPLICATES SDL_STATIC_LIBS)
  1676   listtostr(SDL_STATIC_LIBS _SDL_STATIC_LIBS)
  1677   set(SDL_STATIC_LIBS ${_SDL_STATIC_LIBS})
  1678   listtostr(SDL_LIBS _SDL_LIBS)
  1679   set(SDL_LIBS ${_SDL_LIBS})
  1680 
  1681   # MESSAGE(STATUS "SDL_LIBS: ${SDL_LIBS}")
  1682   # MESSAGE(STATUS "SDL_STATIC_LIBS: ${SDL_STATIC_LIBS}")
  1683 
  1684   configure_file("${SDL2_SOURCE_DIR}/sdl2.pc.in"
  1685     "${SDL2_BINARY_DIR}/sdl2.pc" @ONLY)
  1686   configure_file("${SDL2_SOURCE_DIR}/sdl2-config.in"
  1687     "${SDL2_BINARY_DIR}/sdl2-config")
  1688   configure_file("${SDL2_SOURCE_DIR}/sdl2-config.in"
  1689     "${SDL2_BINARY_DIR}/sdl2-config" @ONLY)
  1690   configure_file("${SDL2_SOURCE_DIR}/SDL2.spec.in"
  1691     "${SDL2_BINARY_DIR}/SDL2.spec" @ONLY)
  1692 endif()
  1693 
  1694 ##### Info output #####
  1695 message(STATUS "")
  1696 message(STATUS "SDL2 was configured with the following options:")
  1697 message(STATUS "")
  1698 message(STATUS "Platform: ${CMAKE_SYSTEM}")
  1699 message(STATUS "64-bit:   ${ARCH_64}")
  1700 message(STATUS "Compiler: ${CMAKE_C_COMPILER}")
  1701 message(STATUS "")
  1702 message(STATUS "Subsystems:")
  1703 foreach(_SUB ${SDL_SUBSYSTEMS})
  1704   string(TOUPPER ${_SUB} _OPT)
  1705   message_bool_option(${_SUB} SDL_${_OPT})
  1706 endforeach()
  1707 message(STATUS "")
  1708 message(STATUS "Options:")
  1709 list(SORT ALLOPTIONS)
  1710 foreach(_OPT ${ALLOPTIONS})
  1711   # Longest option is VIDEO_X11_XSCREENSAVER = 22 characters
  1712   # Get the padding
  1713   string(LENGTH ${_OPT} _OPTLEN)
  1714   math(EXPR _PADLEN "23 - ${_OPTLEN}")
  1715   string(RANDOM LENGTH ${_PADLEN} ALPHABET " " _PADDING)
  1716   message_tested_option(${_OPT} ${_PADDING})
  1717 endforeach()
  1718 message(STATUS "")
  1719 message(STATUS " CFLAGS:        ${CMAKE_C_FLAGS}")
  1720 message(STATUS " EXTRA_CFLAGS:  ${EXTRA_CFLAGS}")
  1721 message(STATUS " EXTRA_LDFLAGS: ${EXTRA_LDFLAGS}")
  1722 message(STATUS " EXTRA_LIBS:    ${EXTRA_LIBS}")
  1723 message(STATUS "")
  1724 message(STATUS " Build Shared Library: ${SDL_SHARED}")
  1725 message(STATUS " Build Static Library: ${SDL_STATIC}")
  1726 if(SDL_STATIC)
  1727     message(STATUS " Build Static Library with Position Independent Code: ${SDL_STATIC_PIC}")
  1728 endif()
  1729 message(STATUS "")
  1730 if(UNIX)
  1731   message(STATUS "If something was not detected, although the libraries")
  1732   message(STATUS "were installed, then make sure you have set the")
  1733   message(STATUS "CFLAGS and LDFLAGS environment variables correctly.")
  1734   message(STATUS "")
  1735 endif()
  1736 
  1737 # Ensure that the extra cflags are used at compile time
  1738 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS}")
  1739 
  1740 # Always build SDLmain
  1741 add_library(SDL2main STATIC ${SDLMAIN_SOURCES})
  1742 target_include_directories(SDL2main PUBLIC "$<BUILD_INTERFACE:${SDL2_SOURCE_DIR}/include>" $<INSTALL_INTERFACE:include/SDL2>)
  1743 set(_INSTALL_LIBS "SDL2main")
  1744 if (NOT ANDROID)
  1745   set_target_properties(SDL2main PROPERTIES DEBUG_POSTFIX ${SDL_CMAKE_DEBUG_POSTFIX})
  1746 endif()
  1747 
  1748 if(SDL_SHARED)
  1749   add_library(SDL2 SHARED ${SOURCE_FILES} ${VERSION_SOURCES})
  1750   if(APPLE)
  1751     set_target_properties(SDL2 PROPERTIES
  1752       MACOSX_RPATH 1
  1753       OUTPUT_NAME "SDL2-${LT_RELEASE}")
  1754   elseif(UNIX AND NOT ANDROID)
  1755     set_target_properties(SDL2 PROPERTIES
  1756       VERSION ${LT_VERSION}
  1757       SOVERSION ${LT_REVISION}
  1758       OUTPUT_NAME "SDL2-${LT_RELEASE}")
  1759   else()
  1760     set_target_properties(SDL2 PROPERTIES
  1761       VERSION ${SDL_VERSION}
  1762       SOVERSION ${LT_REVISION}
  1763       OUTPUT_NAME "SDL2")
  1764   endif()
  1765   if(MSVC AND NOT LIBC)
  1766     # Don't try to link with the default set of libraries.
  1767     set_target_properties(SDL2 PROPERTIES LINK_FLAGS_RELEASE "/NODEFAULTLIB")
  1768     set_target_properties(SDL2 PROPERTIES LINK_FLAGS_DEBUG "/NODEFAULTLIB")
  1769     set_target_properties(SDL2 PROPERTIES STATIC_LIBRARY_FLAGS "/NODEFAULTLIB")
  1770   endif()
  1771   set(_INSTALL_LIBS "SDL2" ${_INSTALL_LIBS})
  1772   target_link_libraries(SDL2 ${EXTRA_LIBS} ${EXTRA_LDFLAGS})
  1773   target_include_directories(SDL2 PUBLIC "$<BUILD_INTERFACE:${SDL2_SOURCE_DIR}/include>" $<INSTALL_INTERFACE:include/SDL2>)
  1774   if (NOT ANDROID)
  1775     set_target_properties(SDL2 PROPERTIES DEBUG_POSTFIX ${SDL_CMAKE_DEBUG_POSTFIX})
  1776   endif()
  1777 endif()
  1778 
  1779 if(SDL_STATIC)
  1780   set (BUILD_SHARED_LIBS FALSE)
  1781   add_library(SDL2-static STATIC ${SOURCE_FILES})
  1782   if (NOT SDL_SHARED OR NOT WIN32)
  1783     set_target_properties(SDL2-static PROPERTIES OUTPUT_NAME "SDL2")
  1784     # Note: Apparently, OUTPUT_NAME must really be unique; even when
  1785     # CMAKE_IMPORT_LIBRARY_SUFFIX or the like are given. Otherwise
  1786     # the static build may race with the import lib and one will get
  1787     # clobbered, when the suffix is realized via subsequent rename.
  1788   endif()
  1789   set_target_properties(SDL2-static PROPERTIES POSITION_INDEPENDENT_CODE ${SDL_STATIC_PIC})
  1790   if(MSVC AND NOT LIBC)
  1791     set_target_properties(SDL2-static PROPERTIES LINK_FLAGS_RELEASE "/NODEFAULTLIB")
  1792     set_target_properties(SDL2-static PROPERTIES LINK_FLAGS_DEBUG "/NODEFAULTLIB")
  1793     set_target_properties(SDL2-static PROPERTIES STATIC_LIBRARY_FLAGS "/NODEFAULTLIB")
  1794   endif()
  1795   # TODO: Win32 platforms keep the same suffix .lib for import and static
  1796   # libraries - do we need to consider this?
  1797   set(_INSTALL_LIBS "SDL2-static" ${_INSTALL_LIBS})
  1798   target_link_libraries(SDL2-static ${EXTRA_LIBS} ${EXTRA_LDFLAGS})
  1799   target_include_directories(SDL2-static PUBLIC "$<BUILD_INTERFACE:${SDL2_SOURCE_DIR}/include>" $<INSTALL_INTERFACE:include/SDL2>)
  1800   if (NOT ANDROID)
  1801     set_target_properties(SDL2-static PROPERTIES DEBUG_POSTFIX ${SDL_CMAKE_DEBUG_POSTFIX})
  1802   endif()
  1803 endif()
  1804 
  1805 ##### Tests #####
  1806 
  1807 if(SDL_TEST)
  1808   file(GLOB TEST_SOURCES ${SDL2_SOURCE_DIR}/src/test/*.c)
  1809   add_library(SDL2_test STATIC ${TEST_SOURCES})
  1810 
  1811   add_subdirectory(test)
  1812 endif()
  1813 
  1814 ##### Installation targets #####
  1815 install(TARGETS ${_INSTALL_LIBS} EXPORT SDL2Targets
  1816   LIBRARY DESTINATION "lib${LIB_SUFFIX}"
  1817   ARCHIVE DESTINATION "lib${LIB_SUFFIX}"
  1818   RUNTIME DESTINATION bin)
  1819 
  1820 ##### Export files #####
  1821 if (APPLE)
  1822   set(PKG_PREFIX "SDL2.framework/Resources")
  1823 elseif (WINDOWS)
  1824   set(PKG_PREFIX "cmake")
  1825 else ()
  1826   set(PKG_PREFIX "lib/cmake/SDL2")
  1827 endif ()
  1828 
  1829 include(CMakePackageConfigHelpers)
  1830 write_basic_package_version_file("${CMAKE_BINARY_DIR}/SDL2ConfigVersion.cmake"
  1831   VERSION ${SDL_VERSION}
  1832   COMPATIBILITY AnyNewerVersion
  1833 )
  1834 
  1835 install(EXPORT SDL2Targets
  1836   FILE SDL2Targets.cmake
  1837   NAMESPACE SDL2::
  1838   DESTINATION ${PKG_PREFIX}
  1839 )
  1840 install(
  1841   FILES
  1842     ${CMAKE_CURRENT_SOURCE_DIR}/SDL2Config.cmake
  1843     ${CMAKE_BINARY_DIR}/SDL2ConfigVersion.cmake
  1844   DESTINATION ${PKG_PREFIX}
  1845   COMPONENT Devel
  1846 )
  1847 
  1848 file(GLOB INCLUDE_FILES ${SDL2_SOURCE_DIR}/include/*.h)
  1849 file(GLOB BIN_INCLUDE_FILES ${SDL2_BINARY_DIR}/include/*.h)
  1850 foreach(_FNAME ${BIN_INCLUDE_FILES})
  1851   get_filename_component(_INCNAME ${_FNAME} NAME)
  1852   list(REMOVE_ITEM INCLUDE_FILES ${SDL2_SOURCE_DIR}/include/${_INCNAME})
  1853 endforeach()
  1854 list(APPEND INCLUDE_FILES ${BIN_INCLUDE_FILES})
  1855 install(FILES ${INCLUDE_FILES} DESTINATION include/SDL2)
  1856 
  1857 string(TOUPPER "${CMAKE_BUILD_TYPE}" UPPER_BUILD_TYPE)
  1858 if (UPPER_BUILD_TYPE MATCHES DEBUG)
  1859   set(SOPOSTFIX "${SDL_CMAKE_DEBUG_POSTFIX}")
  1860 else()
  1861   set(SOPOSTFIX "")
  1862 endif()
  1863 
  1864 if(NOT (WINDOWS OR CYGWIN))
  1865   if(SDL_SHARED)
  1866     set(SOEXT ${CMAKE_SHARED_LIBRARY_SUFFIX}) # ".so", ".dylib", etc.
  1867     get_target_property(SONAME SDL2 OUTPUT_NAME)
  1868     if(NOT ANDROID)
  1869         install(CODE "
  1870           execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink
  1871             \"lib${SONAME}${SOPOSTFIX}${SOEXT}\" \"libSDL2${SOPOSTFIX}${SOEXT}\")"
  1872             WORKING_DIR "${SDL2_BINARY_DIR}")
  1873         install(FILES ${SDL2_BINARY_DIR}/libSDL2${SOPOSTFIX}${SOEXT} DESTINATION "lib${LIB_SUFFIX}")
  1874     endif()
  1875   endif()
  1876   if(FREEBSD)
  1877     # FreeBSD uses ${PREFIX}/libdata/pkgconfig
  1878     install(FILES ${SDL2_BINARY_DIR}/sdl2.pc DESTINATION "libdata/pkgconfig")
  1879   else()
  1880     install(FILES ${SDL2_BINARY_DIR}/sdl2.pc
  1881       DESTINATION "lib${LIB_SUFFIX}/pkgconfig")
  1882   endif()
  1883   install(PROGRAMS ${SDL2_BINARY_DIR}/sdl2-config DESTINATION bin)
  1884   # TODO: what about the .spec file? Is it only needed for RPM creation?
  1885   install(FILES "${SDL2_SOURCE_DIR}/sdl2.m4" DESTINATION "${CMAKE_INSTALL_FULL_DATAROOTDIR}/aclocal")
  1886 endif()
  1887 
  1888 ##### Uninstall target #####
  1889 
  1890 if(NOT TARGET uninstall)
  1891   configure_file(
  1892       "${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake.in"
  1893       "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
  1894       IMMEDIATE @ONLY)
  1895 
  1896   add_custom_target(uninstall
  1897       COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake)
  1898 endif()