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