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