CMakeLists.txt
author Sam Lantinga <slouken@libsdl.org>
Sat, 24 Feb 2018 08:59:58 -0800
changeset 11901 e4d03d8733f3
parent 11852 c3fc99758ad2
child 11904 43dbca2813e1
permissions -rw-r--r--
Fixed bug 4092 - CMake support for building everything in the "test" directory

Eric Wasylishen

Patch to support building the tests with cmake.
Disabled by default, use: "cmake .. -DSDL_TEST=YES" to enable the tests.

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