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