CMakeLists.txt
author Ryan C. Gordon <icculus@icculus.org>
Fri, 18 Aug 2017 20:25:14 -0400
changeset 11324 670978408a10
parent 11323 46861f3fc187
child 11326 ba4fe3686323
permissions -rw-r--r--
cmake: some iOS fixes (don't link to Cocoa or Carbon frameworks).

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