CMakeLists.txt
author Sam Lantinga <slouken@libsdl.org>
Sat, 26 Aug 2017 21:17:12 -0700
changeset 11353 598839965877
parent 11337 d9f24e95e8ba
child 11365 a9bd2625fa01
permissions -rw-r--r--
Fixed bug 3774 - Cmake build fails for Android

sfalexrog

Android haptic code was not added to CMakeLists.txt, leading to build failures when targeting Android platform.

Attached patch adds Android haptic driver to source sets and adds configuration parameter to SDL_config.h.cmake.
     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 6)
    45 set(SDL_INTERFACE_AGE 0)
    46 set(SDL_BINARY_AGE 6)
    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 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_HAPTIC)
   805     set(SDL_HAPTIC_ANDROID 1)
   806     file(GLOB ANDROID_HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/android/*.c)
   807     set(SOURCE_FILES ${SOURCE_FILES} ${ANDROID_HAPTIC_SOURCES})
   808     set(HAVE_SDL_HAPTIC TRUE)
   809   endif()
   810   if(SDL_JOYSTICK)
   811     set(SDL_JOYSTICK_ANDROID 1)
   812     file(GLOB ANDROID_JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/android/*.c)
   813     set(SOURCE_FILES ${SOURCE_FILES} ${ANDROID_JOYSTICK_SOURCES})
   814     set(HAVE_SDL_JOYSTICK TRUE)
   815   endif()
   816   if(SDL_LOADSO)
   817     set(SDL_LOADSO_DLOPEN 1)
   818     file(GLOB LOADSO_SOURCES ${SDL2_SOURCE_DIR}/src/loadso/dlopen/*.c)
   819     set(SOURCE_FILES ${SOURCE_FILES} ${LOADSO_SOURCES})
   820     set(HAVE_SDL_LOADSO TRUE)
   821   endif()
   822   if(SDL_POWER)
   823     set(SDL_POWER_ANDROID 1)
   824     file(GLOB ANDROID_POWER_SOURCES ${SDL2_SOURCE_DIR}/src/power/android/*.c)
   825     set(SOURCE_FILES ${SOURCE_FILES} ${ANDROID_POWER_SOURCES})
   826     set(HAVE_SDL_POWER TRUE)
   827   endif()
   828   if(SDL_TIMERS)
   829     set(SDL_TIMER_UNIX 1)
   830     file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/unix/*.c)
   831     set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES})
   832     set(HAVE_SDL_TIMERS TRUE)
   833   endif()
   834   if(SDL_VIDEO)
   835     set(SDL_VIDEO_DRIVER_ANDROID 1)
   836     file(GLOB ANDROID_VIDEO_SOURCES ${SDL2_SOURCE_DIR}/src/video/android/*.c)
   837     set(SOURCE_FILES ${SOURCE_FILES} ${ANDROID_VIDEO_SOURCES})
   838     set(HAVE_SDL_VIDEO TRUE)
   839 
   840     # Core stuff
   841     find_library(ANDROID_DL_LIBRARY dl)
   842     find_library(ANDROID_LOG_LIBRARY log)
   843     find_library(ANDROID_LIBRARY_LIBRARY android)
   844     list(APPEND EXTRA_LIBS ${ANDROID_DL_LIBRARY} ${ANDROID_LOG_LIBRARY} ${ANDROID_LIBRARY_LIBRARY})
   845     add_definitions(-DGL_GLEXT_PROTOTYPES)
   846 
   847     #enable gles
   848     if(VIDEO_OPENGLES)
   849       set(SDL_VIDEO_OPENGL_EGL 1)
   850       set(HAVE_VIDEO_OPENGLES TRUE)
   851       set(SDL_VIDEO_OPENGL_ES2 1)
   852       set(SDL_VIDEO_RENDER_OGL_ES2 1)
   853 
   854       find_library(OpenGLES1_LIBRARY GLESv1_CM)
   855       find_library(OpenGLES2_LIBRARY GLESv2)
   856       list(APPEND EXTRA_LIBS ${OpenGLES1_LIBRARY} ${OpenGLES2_LIBRARY})
   857     endif()
   858   endif()
   859 
   860   CheckPTHREAD()
   861 
   862   list(APPEND EXTRA_LDFLAGS "-Wl,--undefined=Java_org_libsdl_app_SDLActivity_nativeInit")
   863 endif()
   864 
   865 # Platform-specific options and settings
   866 if(EMSCRIPTEN)
   867   # Hide noisy warnings that intend to aid mostly during initial stages of porting a new
   868   # project. Uncomment at will for verbose cross-compiling -I/../ path info.
   869   add_definitions(-Wno-warn-absolute-paths)
   870   if(SDL_AUDIO)
   871     set(SDL_AUDIO_DRIVER_EMSCRIPTEN 1)
   872     file(GLOB EM_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/emscripten/*.c)
   873     set(SOURCE_FILES ${SOURCE_FILES} ${EM_AUDIO_SOURCES})
   874     set(HAVE_SDL_AUDIO TRUE)
   875   endif()
   876   if(SDL_FILESYSTEM)
   877     set(SDL_FILESYSTEM_EMSCRIPTEN 1)
   878     file(GLOB EM_FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/emscripten/*.c)
   879     set(SOURCE_FILES ${SOURCE_FILES} ${EM_FILESYSTEM_SOURCES})
   880     set(HAVE_SDL_FILESYSTEM TRUE)
   881   endif()
   882   if(SDL_JOYSTICK)
   883     set(SDL_JOYSTICK_EMSCRIPTEN 1)
   884     file(GLOB EM_JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/emscripten/*.c)
   885     set(SOURCE_FILES ${SOURCE_FILES} ${EM_JOYSTICK_SOURCES})
   886     set(HAVE_SDL_JOYSTICK TRUE)
   887   endif()
   888   if(SDL_POWER)
   889     set(SDL_POWER_EMSCRIPTEN 1)
   890     file(GLOB EM_POWER_SOURCES ${SDL2_SOURCE_DIR}/src/power/emscripten/*.c)
   891     set(SOURCE_FILES ${SOURCE_FILES} ${EM_POWER_SOURCES})
   892     set(HAVE_SDL_POWER TRUE)
   893   endif()
   894   if(SDL_TIMERS)
   895     set(SDL_TIMER_UNIX 1)
   896     file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/unix/*.c)
   897     set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES})
   898     set(HAVE_SDL_TIMERS TRUE)
   899 
   900     if(CLOCK_GETTIME)
   901       set(HAVE_CLOCK_GETTIME 1)
   902     endif()
   903   endif()
   904   if(SDL_VIDEO)
   905     set(SDL_VIDEO_DRIVER_EMSCRIPTEN 1)
   906     file(GLOB EM_VIDEO_SOURCES ${SDL2_SOURCE_DIR}/src/video/emscripten/*.c)
   907     set(SOURCE_FILES ${SOURCE_FILES} ${EM_VIDEO_SOURCES})
   908     set(HAVE_SDL_VIDEO TRUE)
   909 
   910     #enable gles
   911     if(VIDEO_OPENGLES)
   912       set(SDL_VIDEO_OPENGL_EGL 1)
   913       set(HAVE_VIDEO_OPENGLES TRUE)
   914       set(SDL_VIDEO_OPENGL_ES2 1)
   915       set(SDL_VIDEO_RENDER_OGL_ES2 1)
   916     endif()
   917   endif()
   918 elseif(UNIX AND NOT APPLE AND NOT ANDROID)
   919   if(SDL_AUDIO)
   920     if(SYSV5 OR SOLARIS OR HPUX)
   921         set(SDL_AUDIO_DRIVER_SUNAUDIO 1)
   922         file(GLOB SUN_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/sun/*.c)
   923         set(SOURCE_FILES ${SOURCE_FILES} ${SUN_AUDIO_SOURCES})
   924         set(HAVE_SDL_AUDIO TRUE)
   925     elseif(NETBSD)
   926         set(SDL_AUDIO_DRIVER_NETBSD 1)
   927         file(GLOB NETBSD_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/netbsd/*.c)
   928         set(SOURCE_FILES ${SOURCE_FILES} ${NETBSD_AUDIO_SOURCES})
   929         set(HAVE_SDL_AUDIO TRUE)
   930     elseif(AIX)
   931         set(SDL_AUDIO_DRIVER_PAUDIO 1)
   932         file(GLOB AIX_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/paudio/*.c)
   933         set(SOURCE_FILES ${SOURCE_FILES} ${AIX_AUDIO_SOURCES})
   934         set(HAVE_SDL_AUDIO TRUE)
   935     endif()
   936     CheckOSS()
   937     CheckALSA()
   938     CheckJACK()
   939     CheckPulseAudio()
   940     CheckESD()
   941     CheckARTS()
   942     CheckNAS()
   943     CheckSNDIO()
   944     CheckFusionSound()
   945     CheckLibSampleRate()
   946   endif()
   947 
   948   if(SDL_VIDEO)
   949     # Need to check for Raspberry PI first and add platform specific compiler flags, otherwise the test for GLES fails!
   950     CheckRPI()
   951     CheckX11()
   952     CheckMir()
   953     CheckDirectFB()
   954     CheckOpenGLX11()
   955     CheckOpenGLESX11()
   956     CheckWayland()
   957     CheckVivante()
   958     CheckKMSDRM()
   959   endif()
   960 
   961   if(UNIX)
   962     file(GLOB CORE_UNIX_SOURCES ${SDL2_SOURCE_DIR}/src/core/unix/*.c)
   963     set(SOURCE_FILES ${SOURCE_FILES} ${CORE_UNIX_SOURCES})
   964   endif()
   965 
   966   if(LINUX)
   967     check_c_source_compiles("
   968         #include <linux/input.h>
   969         #ifndef EVIOCGNAME
   970         #error EVIOCGNAME() ioctl not available
   971         #endif
   972         int main(int argc, char** argv) {}" HAVE_INPUT_EVENTS)
   973 
   974     check_c_source_compiles("
   975         #include <linux/kd.h>
   976         #include <linux/keyboard.h>
   977 
   978         int main(int argc, char **argv) 
   979         {
   980             struct kbentry kbe;
   981             kbe.kb_table = KG_CTRL;
   982             ioctl(0, KDGKBENT, &kbe);
   983         }" HAVE_INPUT_KD)
   984 
   985     file(GLOB CORE_LINUX_SOURCES ${SDL2_SOURCE_DIR}/src/core/linux/*.c)
   986     set(SOURCE_FILES ${SOURCE_FILES} ${CORE_LINUX_SOURCES})
   987 
   988     if(HAVE_INPUT_EVENTS)
   989       set(SDL_INPUT_LINUXEV 1)
   990     endif()
   991 
   992     if(SDL_HAPTIC AND HAVE_INPUT_EVENTS)
   993       set(SDL_HAPTIC_LINUX 1)
   994       file(GLOB HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/linux/*.c)
   995       set(SOURCE_FILES ${SOURCE_FILES} ${HAPTIC_SOURCES})
   996       set(HAVE_SDL_HAPTIC TRUE)
   997     endif()
   998 
   999     if(HAVE_INPUT_KD)
  1000       set(SDL_INPUT_LINUXKD 1)
  1001     endif()
  1002 
  1003     check_include_file("libudev.h" HAVE_LIBUDEV_H)
  1004 
  1005     if(PKG_CONFIG_FOUND)
  1006       pkg_search_module(DBUS dbus-1 dbus)
  1007       if(DBUS_FOUND)
  1008         set(HAVE_DBUS_DBUS_H TRUE)
  1009         include_directories(${DBUS_INCLUDE_DIRS})
  1010         list(APPEND EXTRA_LIBS ${DBUS_LIBRARIES})
  1011       endif()
  1012 
  1013       pkg_search_module(IBUS ibus-1.0 ibus)
  1014       if(IBUS_FOUND)
  1015         set(HAVE_IBUS_IBUS_H TRUE)
  1016         include_directories(${IBUS_INCLUDE_DIRS})
  1017         list(APPEND EXTRA_LIBS ${IBUS_LIBRARIES})
  1018       endif()
  1019     endif()
  1020 
  1021     check_include_file("fcitx/frontend.h" HAVE_FCITX_FRONTEND_H)
  1022 
  1023   endif()
  1024 
  1025   if(INPUT_TSLIB)
  1026     check_c_source_compiles("
  1027         #include \"tslib.h\"
  1028         int main(int argc, char** argv) { }" HAVE_INPUT_TSLIB)
  1029     if(HAVE_INPUT_TSLIB)
  1030       set(SDL_INPUT_TSLIB 1)
  1031       list(APPEND EXTRA_LIBS ts)
  1032     endif()
  1033   endif()
  1034 
  1035   if(SDL_JOYSTICK)
  1036     CheckUSBHID()   # seems to be BSD specific - limit the test to BSD only?
  1037     if(LINUX AND NOT ANDROID)
  1038       set(SDL_JOYSTICK_LINUX 1)
  1039       file(GLOB JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/linux/*.c)
  1040       set(SOURCE_FILES ${SOURCE_FILES} ${JOYSTICK_SOURCES})
  1041       set(HAVE_SDL_JOYSTICK TRUE)
  1042     endif()
  1043   endif()
  1044 
  1045   CheckPTHREAD()
  1046 
  1047   if(CLOCK_GETTIME)
  1048     check_library_exists(rt clock_gettime "" FOUND_CLOCK_GETTIME)
  1049     if(FOUND_CLOCK_GETTIME)
  1050       list(APPEND EXTRA_LIBS rt)
  1051       set(HAVE_CLOCK_GETTIME 1)
  1052     else()
  1053       check_library_exists(c clock_gettime "" FOUND_CLOCK_GETTIME)
  1054       if(FOUND_CLOCK_GETTIME)
  1055         set(HAVE_CLOCK_GETTIME 1)
  1056       endif()
  1057     endif()
  1058   endif()
  1059 
  1060   check_include_file(linux/version.h HAVE_LINUX_VERSION_H)
  1061   if(HAVE_LINUX_VERSION_H)
  1062     set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DHAVE_LINUX_VERSION_H")
  1063   endif()
  1064 
  1065   if(SDL_POWER)
  1066     if(LINUX)
  1067       set(SDL_POWER_LINUX 1)
  1068       file(GLOB POWER_SOURCES ${SDL2_SOURCE_DIR}/src/power/linux/*.c)
  1069       set(SOURCE_FILES ${SOURCE_FILES} ${POWER_SOURCES})
  1070       set(HAVE_SDL_POWER TRUE)
  1071     endif()
  1072   endif()
  1073 
  1074   if(SDL_FILESYSTEM)
  1075     set(SDL_FILESYSTEM_UNIX 1)
  1076     file(GLOB FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/unix/*.c)
  1077     set(SOURCE_FILES ${SOURCE_FILES} ${FILESYSTEM_SOURCES})
  1078     set(HAVE_SDL_FILESYSTEM TRUE)
  1079   endif()
  1080 
  1081   if(SDL_TIMERS)
  1082     set(SDL_TIMER_UNIX 1)
  1083     file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/unix/*.c)
  1084     set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES})
  1085     set(HAVE_SDL_TIMERS TRUE)
  1086   endif()
  1087 
  1088   if(RPATH)
  1089     set(SDL_RLD_FLAGS "")
  1090     if(BSDI OR FREEBSD OR LINUX OR NETBSD)
  1091       set(CMAKE_REQUIRED_FLAGS "-Wl,--enable-new-dtags")
  1092       check_c_compiler_flag("" HAVE_ENABLE_NEW_DTAGS)
  1093       set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS})
  1094       if(HAVE_ENABLE_NEW_DTAGS)
  1095         set(SDL_RLD_FLAGS "-Wl,-rpath,\${libdir} -Wl,--enable-new-dtags")
  1096       else()
  1097         set(SDL_RLD_FLAGS "-Wl,-rpath,\${libdir}")
  1098       endif()
  1099     elseif(SOLARIS)
  1100       set(SDL_RLD_FLAGS "-R\${libdir}")
  1101     endif()
  1102     set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)
  1103     set(HAVE_RPATH TRUE)
  1104   endif()
  1105 
  1106 elseif(WINDOWS)
  1107   find_program(WINDRES windres)
  1108 
  1109   check_c_source_compiles("
  1110     #include <windows.h>
  1111     int main(int argc, char **argv) { }" HAVE_WIN32_CC)
  1112 
  1113   file(GLOB CORE_SOURCES ${SDL2_SOURCE_DIR}/src/core/windows/*.c)
  1114   set(SOURCE_FILES ${SOURCE_FILES} ${CORE_SOURCES})
  1115 
  1116   if(MSVC)
  1117     # Prevent codegen that would use the VC runtime libraries.
  1118     set_property(DIRECTORY . APPEND PROPERTY COMPILE_OPTIONS "/GS-")
  1119     if(NOT ARCH_64)
  1120       set_property(DIRECTORY . APPEND PROPERTY COMPILE_OPTIONS "/arch:SSE")
  1121     endif()
  1122   endif()
  1123 
  1124   # Check for DirectX
  1125   if(DIRECTX)
  1126     if(DEFINED MSVC_VERSION AND NOT ${MSVC_VERSION} LESS 1700)
  1127         set(USE_WINSDK_DIRECTX TRUE)
  1128     endif()
  1129     if(NOT CMAKE_COMPILER_IS_MINGW AND NOT USE_WINSDK_DIRECTX)
  1130       if("$ENV{DXSDK_DIR}" STREQUAL "")
  1131         message_error("DIRECTX requires the \$DXSDK_DIR environment variable to be set")
  1132       endif()
  1133       set(CMAKE_REQUIRED_FLAGS "/I\"$ENV{DXSDK_DIR}\\Include\"")
  1134     endif()
  1135 
  1136     if(HAVE_WIN32_CC)
  1137       # xinput.h may need windows.h, but doesn't include it itself.
  1138       check_c_source_compiles("
  1139         #include <windows.h>
  1140         #include <xinput.h>
  1141         int main(int argc, char **argv) { }" HAVE_XINPUT_H)
  1142       check_c_source_compiles("
  1143         #include <windows.h>
  1144         #include <xinput.h>
  1145         XINPUT_GAMEPAD_EX x1;
  1146         int main(int argc, char **argv) { }" HAVE_XINPUT_GAMEPAD_EX)
  1147       check_c_source_compiles("
  1148         #include <windows.h>
  1149         #include <xinput.h>
  1150         XINPUT_STATE_EX s1;
  1151         int main(int argc, char **argv) { }" HAVE_XINPUT_STATE_EX)
  1152     else()
  1153       check_include_file(xinput.h HAVE_XINPUT_H)
  1154     endif()
  1155 
  1156     check_include_file(d3d9.h HAVE_D3D_H)
  1157     check_include_file(d3d11_1.h HAVE_D3D11_H)
  1158     check_include_file(ddraw.h HAVE_DDRAW_H)
  1159     check_include_file(dsound.h HAVE_DSOUND_H)
  1160     check_include_file(dinput.h HAVE_DINPUT_H)
  1161     check_include_file(xaudio2.h HAVE_XAUDIO2_H)
  1162     check_include_file(mmdeviceapi.h HAVE_MMDEVICEAPI_H)
  1163     check_include_file(audioclient.h HAVE_AUDIOCLIENT_H)
  1164     check_include_file(dxgi.h HAVE_DXGI_H)
  1165     if(HAVE_D3D_H OR HAVE_D3D11_H OR HAVE_DDRAW_H OR HAVE_DSOUND_H OR HAVE_DINPUT_H OR HAVE_XAUDIO2_H)
  1166       set(HAVE_DIRECTX TRUE)
  1167       if(NOT CMAKE_COMPILER_IS_MINGW AND NOT USE_WINSDK_DIRECTX)
  1168       # TODO: change $ENV{DXSDL_DIR} to get the path from the include checks
  1169         link_directories($ENV{DXSDK_DIR}\\lib\\${PROCESSOR_ARCH})
  1170         include_directories($ENV{DXSDK_DIR}\\Include)
  1171       endif()
  1172     endif()
  1173     set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS})
  1174   endif()
  1175 
  1176   if(SDL_AUDIO)
  1177     set(SDL_AUDIO_DRIVER_WINMM 1)
  1178     file(GLOB WINMM_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/winmm/*.c)
  1179     set(SOURCE_FILES ${SOURCE_FILES} ${WINMM_AUDIO_SOURCES})
  1180     set(HAVE_SDL_AUDIO TRUE)
  1181 
  1182     if(HAVE_DSOUND_H)
  1183       set(SDL_AUDIO_DRIVER_DSOUND 1)
  1184       file(GLOB DSOUND_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/directsound/*.c)
  1185       set(SOURCE_FILES ${SOURCE_FILES} ${DSOUND_AUDIO_SOURCES})
  1186     endif()
  1187 
  1188     if(HAVE_XAUDIO2_H)
  1189       set(SDL_AUDIO_DRIVER_XAUDIO2 1)
  1190       file(GLOB XAUDIO2_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/xaudio2/*.c)
  1191       set(SOURCE_FILES ${SOURCE_FILES} ${XAUDIO2_AUDIO_SOURCES})
  1192     endif()
  1193 
  1194     if(HAVE_AUDIOCLIENT_H AND HAVE_MMDEVICEAPI_H)
  1195       set(SDL_AUDIO_DRIVER_WASAPI 1)
  1196       file(GLOB WASAPI_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/wasapi/*.c)
  1197       set(SOURCE_FILES ${SOURCE_FILES} ${WASAPI_AUDIO_SOURCES})
  1198     endif()
  1199   endif()
  1200 
  1201   if(SDL_VIDEO)
  1202     # requires SDL_LOADSO on Windows (IME, DX, etc.)
  1203     if(NOT SDL_LOADSO)
  1204       message_error("SDL_VIDEO requires SDL_LOADSO, which is not enabled")
  1205     endif()
  1206     set(SDL_VIDEO_DRIVER_WINDOWS 1)
  1207     file(GLOB WIN_VIDEO_SOURCES ${SDL2_SOURCE_DIR}/src/video/windows/*.c)
  1208     set(SOURCE_FILES ${SOURCE_FILES} ${WIN_VIDEO_SOURCES})
  1209 
  1210     if(RENDER_D3D AND HAVE_D3D_H)
  1211       set(SDL_VIDEO_RENDER_D3D 1)
  1212       set(HAVE_RENDER_D3D TRUE)
  1213     endif()
  1214     if(RENDER_D3D AND HAVE_D3D11_H)
  1215       set(SDL_VIDEO_RENDER_D3D11 1)
  1216       set(HAVE_RENDER_D3D TRUE)
  1217     endif()
  1218     set(HAVE_SDL_VIDEO TRUE)
  1219   endif()
  1220 
  1221   if(SDL_THREADS)
  1222     set(SDL_THREAD_WINDOWS 1)
  1223     set(SOURCE_FILES ${SOURCE_FILES}
  1224       ${SDL2_SOURCE_DIR}/src/thread/windows/SDL_sysmutex.c
  1225       ${SDL2_SOURCE_DIR}/src/thread/windows/SDL_syssem.c
  1226       ${SDL2_SOURCE_DIR}/src/thread/windows/SDL_systhread.c
  1227       ${SDL2_SOURCE_DIR}/src/thread/windows/SDL_systls.c
  1228       ${SDL2_SOURCE_DIR}/src/thread/generic/SDL_syscond.c)
  1229     set(HAVE_SDL_THREADS TRUE)
  1230   endif()
  1231 
  1232   if(SDL_POWER)
  1233     set(SDL_POWER_WINDOWS 1)
  1234     set(SOURCE_FILES ${SOURCE_FILES} ${SDL2_SOURCE_DIR}/src/power/windows/SDL_syspower.c)
  1235     set(HAVE_SDL_POWER TRUE)
  1236   endif()
  1237 
  1238   if(SDL_FILESYSTEM)
  1239     set(SDL_FILESYSTEM_WINDOWS 1)
  1240     file(GLOB FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/windows/*.c)
  1241     set(SOURCE_FILES ${SOURCE_FILES} ${FILESYSTEM_SOURCES})
  1242     set(HAVE_SDL_FILESYSTEM TRUE)
  1243   endif()
  1244 
  1245   # Libraries for Win32 native and MinGW
  1246   list(APPEND EXTRA_LIBS user32 gdi32 winmm imm32 ole32 oleaut32 version uuid)
  1247 
  1248   # TODO: in configure.in the check for timers is set on
  1249   # cygwin | mingw32* - does this include mingw32CE?
  1250   if(SDL_TIMERS)
  1251     set(SDL_TIMER_WINDOWS 1)
  1252     file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/windows/*.c)
  1253     set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES})
  1254     set(HAVE_SDL_TIMERS TRUE)
  1255   endif()
  1256 
  1257   if(SDL_LOADSO)
  1258     set(SDL_LOADSO_WINDOWS 1)
  1259     file(GLOB LOADSO_SOURCES ${SDL2_SOURCE_DIR}/src/loadso/windows/*.c)
  1260     set(SOURCE_FILES ${SOURCE_FILES} ${LOADSO_SOURCES})
  1261     set(HAVE_SDL_LOADSO TRUE)
  1262   endif()
  1263 
  1264   file(GLOB CORE_SOURCES ${SDL2_SOURCE_DIR}/src/core/windows/*.c)
  1265   set(SOURCE_FILES ${SOURCE_FILES} ${CORE_SOURCES})
  1266 
  1267   if(SDL_VIDEO)
  1268     if(VIDEO_OPENGL)
  1269       set(SDL_VIDEO_OPENGL 1)
  1270       set(SDL_VIDEO_OPENGL_WGL 1)
  1271       set(SDL_VIDEO_RENDER_OGL 1)
  1272       set(HAVE_VIDEO_OPENGL TRUE)
  1273     endif()
  1274 
  1275     if(VIDEO_OPENGLES)
  1276       set(SDL_VIDEO_OPENGL_EGL 1)
  1277       set(SDL_VIDEO_OPENGL_ES2 1)
  1278       set(SDL_VIDEO_RENDER_OGL_ES2 1)
  1279       set(HAVE_VIDEO_OPENGLES TRUE)
  1280     endif()
  1281   endif()
  1282 
  1283   if(SDL_JOYSTICK)
  1284     file(GLOB JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/windows/*.c)
  1285     set(SOURCE_FILES ${SOURCE_FILES} ${JOYSTICK_SOURCES})
  1286     if(HAVE_DINPUT_H)
  1287       set(SDL_JOYSTICK_DINPUT 1)
  1288       list(APPEND EXTRA_LIBS dinput8)
  1289       if(CMAKE_COMPILER_IS_MINGW)
  1290         list(APPEND EXTRA_LIBS dxerr8)
  1291       elseif (NOT USE_WINSDK_DIRECTX)
  1292         list(APPEND EXTRA_LIBS dxerr)
  1293       endif()
  1294     endif()
  1295     if(HAVE_XINPUT_H)
  1296       set(SDL_JOYSTICK_XINPUT 1)
  1297     endif()
  1298     if(NOT HAVE_DINPUT_H AND NOT HAVE_XINPUT_H)
  1299       set(SDL_JOYSTICK_WINMM 1)
  1300     endif()
  1301     set(HAVE_SDL_JOYSTICK TRUE)
  1302 
  1303     if(SDL_HAPTIC)
  1304       if(HAVE_DINPUT_H OR HAVE_XINPUT_H)
  1305         file(GLOB HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/windows/*.c)
  1306         if(HAVE_DINPUT_H)
  1307           set(SDL_HAPTIC_DINPUT 1)
  1308         endif()
  1309         if(HAVE_XINPUT_H)
  1310           set(SDL_HAPTIC_XINPUT 1)
  1311         endif()
  1312       else()
  1313         file(GLOB HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/dummy/*.c)
  1314         set(SDL_HAPTIC_DUMMY 1)
  1315       endif()
  1316       set(SOURCE_FILES ${SOURCE_FILES} ${HAPTIC_SOURCES})
  1317       set(HAVE_SDL_HAPTIC TRUE)
  1318     endif()
  1319   endif()
  1320 
  1321   file(GLOB VERSION_SOURCES ${SDL2_SOURCE_DIR}/src/main/windows/*.rc)
  1322   file(GLOB SDLMAIN_SOURCES ${SDL2_SOURCE_DIR}/src/main/windows/*.c)
  1323   if(MINGW OR CYGWIN)
  1324     list(APPEND EXTRA_LIBS mingw32)
  1325     list(APPEND EXTRA_LDFLAGS "-mwindows")
  1326     set(SDL_CFLAGS "${SDL_CFLAGS} -Dmain=SDL_main")
  1327     list(APPEND SDL_LIBS "-lmingw32" "-lSDL2main" "-mwindows")
  1328   endif()
  1329 elseif(APPLE)
  1330   # TODO: rework this all for proper MacOS X, iOS and Darwin support
  1331 
  1332   # We always need these libs on macOS at the moment.
  1333   # !!! FIXME: we need Carbon for some very old API calls in
  1334   # !!! FIXME:  src/video/cocoa/SDL_cocoakeyboard.c, but we should figure out
  1335   # !!! FIXME:  how to dump those.
  1336   if (APPLE AND NOT IOS)
  1337     set(SDL_FRAMEWORK_COCOA 1)
  1338     set(SDL_FRAMEWORK_CARBON 1)
  1339   endif()
  1340 
  1341   # Requires the darwin file implementation
  1342   if(SDL_FILE)
  1343     file(GLOB EXTRA_SOURCES ${SDL2_SOURCE_DIR}/src/file/cocoa/*.m)
  1344     set(SOURCE_FILES ${EXTRA_SOURCES} ${SOURCE_FILES})
  1345     # !!! FIXME: modern CMake doesn't need "LANGUAGE C" for Objective-C.
  1346     set_source_files_properties(${EXTRA_SOURCES} PROPERTIES LANGUAGE C)
  1347     set(HAVE_SDL_FILE TRUE)
  1348     # !!! FIXME: why is COREVIDEO inside this if() block?
  1349     set(SDL_FRAMEWORK_COREVIDEO 1)
  1350   else()
  1351     message_error("SDL_FILE must be enabled to build on MacOS X")
  1352   endif()
  1353 
  1354   if(SDL_AUDIO)
  1355     set(SDL_AUDIO_DRIVER_COREAUDIO 1)
  1356     file(GLOB AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/coreaudio/*.m)
  1357     set(SOURCE_FILES ${SOURCE_FILES} ${AUDIO_SOURCES})
  1358     set(HAVE_SDL_AUDIO TRUE)
  1359     set(SDL_FRAMEWORK_COREAUDIO 1)
  1360     set(SDL_FRAMEWORK_AUDIOTOOLBOX 1)
  1361   endif()
  1362 
  1363   if(SDL_JOYSTICK)
  1364     set(SDL_JOYSTICK_IOKIT 1)
  1365     if (IOS)
  1366       file(GLOB JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/iphoneos/*.m)
  1367     else()
  1368       file(GLOB JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/darwin/*.c)
  1369     endif()
  1370     set(SOURCE_FILES ${SOURCE_FILES} ${JOYSTICK_SOURCES})
  1371     set(HAVE_SDL_JOYSTICK TRUE)
  1372     set(SDL_FRAMEWORK_IOKIT 1)
  1373     set(SDL_FRAMEWORK_FF 1)
  1374   endif()
  1375 
  1376   if(SDL_HAPTIC)
  1377     set(SDL_HAPTIC_IOKIT 1)
  1378     if (IOS)
  1379       file(GLOB HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/dummy/*.c)
  1380       set(SDL_HAPTIC_DUMMY 1)
  1381     else()
  1382       file(GLOB HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/darwin/*.c)
  1383     endif()
  1384     set(SOURCE_FILES ${SOURCE_FILES} ${HAPTIC_SOURCES})
  1385     set(HAVE_SDL_HAPTIC TRUE)
  1386     set(SDL_FRAMEWORK_IOKIT 1)
  1387     set(SDL_FRAMEWORK_FF 1)
  1388     if(NOT SDL_JOYSTICK)
  1389       message(FATAL_ERROR "SDL_HAPTIC requires SDL_JOYSTICK to be enabled")
  1390     endif()
  1391   endif()
  1392 
  1393   if(SDL_POWER)
  1394     set(SDL_POWER_MACOSX 1)
  1395     if (IOS)
  1396       file(GLOB POWER_SOURCES ${SDL2_SOURCE_DIR}/src/power/uikit/*.m)
  1397     else()
  1398       file(GLOB POWER_SOURCES ${SDL2_SOURCE_DIR}/src/power/macosx/*.c)
  1399     endif()
  1400     set(SOURCE_FILES ${SOURCE_FILES} ${POWER_SOURCES})
  1401     set(HAVE_SDL_POWER TRUE)
  1402     set(SDL_FRAMEWORK_IOKIT 1)
  1403   endif()
  1404 
  1405   if(SDL_TIMERS)
  1406     set(SDL_TIMER_UNIX 1)
  1407     file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/unix/*.c)
  1408     set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES})
  1409     set(HAVE_SDL_TIMERS TRUE)
  1410   endif(SDL_TIMERS)
  1411 
  1412   if(SDL_FILESYSTEM)
  1413     set(SDL_FILESYSTEM_COCOA 1)
  1414     file(GLOB FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/cocoa/*.m)
  1415     # !!! FIXME: modern CMake doesn't need "LANGUAGE C" for Objective-C.
  1416     set_source_files_properties(${FILESYSTEM_SOURCES} PROPERTIES LANGUAGE C)
  1417     set(SOURCE_FILES ${SOURCE_FILES} ${FILESYSTEM_SOURCES})
  1418     set(HAVE_SDL_FILESYSTEM TRUE)
  1419   endif()
  1420 
  1421   # Actually load the frameworks at the end so we don't duplicate include.
  1422   if(SDL_FRAMEWORK_COREVIDEO)
  1423     find_library(COREVIDEO CoreVideo)
  1424     list(APPEND EXTRA_LIBS ${COREVIDEO})
  1425   endif()
  1426   if(SDL_FRAMEWORK_COCOA)
  1427     find_library(COCOA_LIBRARY Cocoa)
  1428     list(APPEND EXTRA_LIBS ${COCOA_LIBRARY})
  1429   endif()
  1430   if(SDL_FRAMEWORK_IOKIT)
  1431     find_library(IOKIT IOKit)
  1432     list(APPEND EXTRA_LIBS ${IOKIT})
  1433   endif()
  1434   if(SDL_FRAMEWORK_FF)
  1435     find_library(FORCEFEEDBACK ForceFeedback)
  1436     list(APPEND EXTRA_LIBS ${FORCEFEEDBACK})
  1437   endif()
  1438   if(SDL_FRAMEWORK_CARBON)
  1439     find_library(CARBON_LIBRARY Carbon)
  1440     list(APPEND EXTRA_LIBS ${CARBON_LIBRARY})
  1441   endif()
  1442   if(SDL_FRAMEWORK_COREAUDIO)
  1443     find_library(COREAUDIO CoreAudio)
  1444     list(APPEND EXTRA_LIBS ${COREAUDIO})
  1445   endif()
  1446   if(SDL_FRAMEWORK_AUDIOTOOLBOX)
  1447     find_library(AUDIOTOOLBOX AudioToolbox)
  1448     list(APPEND EXTRA_LIBS ${AUDIOTOOLBOX})
  1449   endif()
  1450 
  1451   # iOS hack needed - http://code.google.com/p/ios-cmake/ ?
  1452   if(SDL_VIDEO)
  1453     if (IOS)
  1454       set(SDL_VIDEO_DRIVER_UIKIT 1)
  1455       file(GLOB UIKITVIDEO_SOURCES ${SDL2_SOURCE_DIR}/src/video/uikit/*.m)
  1456       set(SOURCE_FILES ${SOURCE_FILES} ${UIKITVIDEO_SOURCES})
  1457     else()
  1458       CheckCOCOA()
  1459       if(VIDEO_OPENGL)
  1460         set(SDL_VIDEO_OPENGL 1)
  1461         set(SDL_VIDEO_OPENGL_CGL 1)
  1462         set(SDL_VIDEO_RENDER_OGL 1)
  1463         set(HAVE_VIDEO_OPENGL TRUE)
  1464       endif()
  1465     endif()
  1466   endif()
  1467 
  1468   CheckPTHREAD()
  1469 elseif(HAIKU)
  1470   if(SDL_VIDEO)
  1471     set(SDL_VIDEO_DRIVER_HAIKU 1)
  1472     file(GLOB HAIKUVIDEO_SOURCES ${SDL2_SOURCE_DIR}/src/video/haiku/*.c)
  1473     set(SOURCE_FILES ${SOURCE_FILES} ${HAIKUVIDEO_SOURCES})
  1474     set(HAVE_SDL_VIDEO TRUE)
  1475 
  1476     set(SDL_FILESYSTEM_HAIKU 1)
  1477     file(GLOB FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/haiku/*.cc)
  1478     set(SOURCE_FILES ${SOURCE_FILES} ${FILESYSTEM_SOURCES})
  1479     set(HAVE_SDL_FILESYSTEM TRUE)
  1480 
  1481     if(SDL_TIMERS)
  1482       set(SDL_TIMER_HAIKU 1)
  1483       file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/haiku/*.c)
  1484       set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES})
  1485       set(HAVE_SDL_TIMERS TRUE)
  1486     endif(SDL_TIMERS)
  1487 
  1488     if(VIDEO_OPENGL)
  1489       # TODO: Use FIND_PACKAGE(OpenGL) instead
  1490       set(SDL_VIDEO_OPENGL 1)
  1491       set(SDL_VIDEO_OPENGL_BGL 1)
  1492       set(SDL_VIDEO_RENDER_OGL 1)
  1493       list(APPEND EXTRA_LIBS GL)
  1494       set(HAVE_VIDEO_OPENGL TRUE)
  1495     endif()
  1496   endif()
  1497 
  1498   CheckPTHREAD()
  1499 endif()
  1500 
  1501 # Dummies
  1502 # configure.in does it differently:
  1503 # if not have X
  1504 #   if enable_X {  SDL_X_DISABLED = 1 }
  1505 #   [add dummy sources]
  1506 # so it always adds a dummy, without checking, if it was actually requested.
  1507 # This leads to missing internal references on building, since the
  1508 # src/X/*.c does not get included.
  1509 if(NOT HAVE_SDL_JOYSTICK)
  1510   set(SDL_JOYSTICK_DISABLED 1)
  1511   if(SDL_JOYSTICK AND NOT APPLE) # results in unresolved symbols on OSX
  1512 
  1513     file(GLOB JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/dummy/*.c)
  1514     set(SOURCE_FILES ${SOURCE_FILES} ${JOYSTICK_SOURCES})
  1515   endif()
  1516 endif()
  1517 if(NOT HAVE_SDL_HAPTIC)
  1518   set(SDL_HAPTIC_DISABLED 1)
  1519   file(GLOB HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/dummy/*.c)
  1520   set(SOURCE_FILES ${SOURCE_FILES} ${HAPTIC_SOURCES})
  1521 endif()
  1522 if(NOT HAVE_SDL_LOADSO)
  1523   set(SDL_LOADSO_DISABLED 1)
  1524   file(GLOB LOADSO_SOURCES ${SDL2_SOURCE_DIR}/src/loadso/dummy/*.c)
  1525   set(SOURCE_FILES ${SOURCE_FILES} ${LOADSO_SOURCES})
  1526 endif()
  1527 if(NOT HAVE_SDL_FILESYSTEM)
  1528   set(SDL_FILESYSTEM_DISABLED 1)
  1529   file(GLOB FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/dummy/*.c)
  1530   set(SOURCE_FILES ${SOURCE_FILES} ${FILESYSTEM_SOURCES})
  1531 endif()
  1532 
  1533 # We always need to have threads and timers around
  1534 if(NOT HAVE_SDL_THREADS)
  1535   set(SDL_THREADS_DISABLED 1)
  1536   file(GLOB THREADS_SOURCES ${SDL2_SOURCE_DIR}/src/thread/generic/*.c)
  1537   set(SOURCE_FILES ${SOURCE_FILES} ${THREADS_SOURCES})
  1538 endif()
  1539 if(NOT HAVE_SDL_TIMERS)
  1540   set(SDL_TIMERS_DISABLED 1)
  1541   file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/dummy/*.c)
  1542   set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES})
  1543 endif()
  1544 
  1545 if(NOT SDLMAIN_SOURCES)
  1546   file(GLOB SDLMAIN_SOURCES ${SDL2_SOURCE_DIR}/src/main/dummy/*.c)
  1547 endif()
  1548 
  1549 # Append the -MMD -MT flags
  1550 # if(DEPENDENCY_TRACKING)
  1551 #   if(COMPILER_IS_GNUCC)
  1552 #     set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -MMD -MT \$@")
  1553 #   endif()
  1554 # endif()
  1555 
  1556 configure_file("${SDL2_SOURCE_DIR}/include/SDL_config.h.cmake"
  1557   "${SDL2_BINARY_DIR}/include/SDL_config.h")
  1558 
  1559 # Prepare the flags and remove duplicates
  1560 if(EXTRA_LDFLAGS)
  1561   list(REMOVE_DUPLICATES EXTRA_LDFLAGS)
  1562 endif()
  1563 if(EXTRA_LIBS)
  1564   list(REMOVE_DUPLICATES EXTRA_LIBS)
  1565 endif()
  1566 if(EXTRA_CFLAGS)
  1567   list(REMOVE_DUPLICATES EXTRA_CFLAGS)
  1568 endif()
  1569 listtostr(EXTRA_CFLAGS _EXTRA_CFLAGS)
  1570 set(EXTRA_CFLAGS ${_EXTRA_CFLAGS})
  1571 
  1572 # Compat helpers for the configuration files
  1573 if(NOT WINDOWS OR CYGWIN)
  1574   # TODO: we need a Windows script, too
  1575   execute_process(COMMAND sh ${SDL2_SOURCE_DIR}/build-scripts/updaterev.sh)
  1576 
  1577   set(prefix ${CMAKE_INSTALL_PREFIX})
  1578   set(exec_prefix "\${prefix}")
  1579   set(libdir "\${exec_prefix}/lib${LIB_SUFFIX}")
  1580   set(bindir "\${exec_prefix}/bin")
  1581   set(includedir "\${prefix}/include")
  1582   if(SDL_STATIC)
  1583     set(ENABLE_STATIC_TRUE "")
  1584     set(ENABLE_STATIC_FALSE "#")
  1585   else()
  1586     set(ENABLE_STATIC_TRUE "#")
  1587     set(ENABLE_STATIC_FALSE "")
  1588   endif()
  1589   if(SDL_SHARED)
  1590     set(ENABLE_SHARED_TRUE "")
  1591     set(ENABLE_SHARED_FALSE "#")
  1592   else()
  1593     set(ENABLE_SHARED_TRUE "#")
  1594     set(ENABLE_SHARED_FALSE "")
  1595   endif()
  1596 
  1597   # Clean up the different lists
  1598   listtostr(EXTRA_LIBS _EXTRA_LIBS "-l")
  1599   set(SDL_STATIC_LIBS ${SDL_LIBS} ${EXTRA_LDFLAGS} ${_EXTRA_LIBS})
  1600   list(REMOVE_DUPLICATES SDL_STATIC_LIBS)
  1601   listtostr(SDL_STATIC_LIBS _SDL_STATIC_LIBS)
  1602   set(SDL_STATIC_LIBS ${_SDL_STATIC_LIBS})
  1603   listtostr(SDL_LIBS _SDL_LIBS)
  1604   set(SDL_LIBS ${_SDL_LIBS})
  1605 
  1606   # MESSAGE(STATUS "SDL_LIBS: ${SDL_LIBS}")
  1607   # MESSAGE(STATUS "SDL_STATIC_LIBS: ${SDL_STATIC_LIBS}")
  1608 
  1609   configure_file("${SDL2_SOURCE_DIR}/sdl2.pc.in"
  1610     "${SDL2_BINARY_DIR}/sdl2.pc" @ONLY)
  1611   configure_file("${SDL2_SOURCE_DIR}/sdl2-config.in"
  1612     "${SDL2_BINARY_DIR}/sdl2-config")
  1613   configure_file("${SDL2_SOURCE_DIR}/sdl2-config.in"
  1614     "${SDL2_BINARY_DIR}/sdl2-config" @ONLY)
  1615   configure_file("${SDL2_SOURCE_DIR}/SDL2.spec.in"
  1616     "${SDL2_BINARY_DIR}/SDL2.spec" @ONLY)
  1617 endif()
  1618 
  1619 ##### Info output #####
  1620 message(STATUS "")
  1621 message(STATUS "SDL2 was configured with the following options:")
  1622 message(STATUS "")
  1623 message(STATUS "Platform: ${CMAKE_SYSTEM}")
  1624 message(STATUS "64-bit:   ${ARCH_64}")
  1625 message(STATUS "Compiler: ${CMAKE_C_COMPILER}")
  1626 message(STATUS "")
  1627 message(STATUS "Subsystems:")
  1628 foreach(_SUB ${SDL_SUBSYSTEMS})
  1629   string(TOUPPER ${_SUB} _OPT)
  1630   message_bool_option(${_SUB} SDL_${_OPT})
  1631 endforeach()
  1632 message(STATUS "")
  1633 message(STATUS "Options:")
  1634 list(SORT ALLOPTIONS)
  1635 foreach(_OPT ${ALLOPTIONS})
  1636   # Longest option is VIDEO_X11_XSCREENSAVER = 22 characters
  1637   # Get the padding
  1638   string(LENGTH ${_OPT} _OPTLEN)
  1639   math(EXPR _PADLEN "23 - ${_OPTLEN}")
  1640   string(RANDOM LENGTH ${_PADLEN} ALPHABET " " _PADDING)
  1641   message_tested_option(${_OPT} ${_PADDING})
  1642 endforeach()
  1643 message(STATUS "")
  1644 message(STATUS " CFLAGS:        ${CMAKE_C_FLAGS}")
  1645 message(STATUS " EXTRA_CFLAGS:  ${EXTRA_CFLAGS}")
  1646 message(STATUS " EXTRA_LDFLAGS: ${EXTRA_LDFLAGS}")
  1647 message(STATUS " EXTRA_LIBS:    ${EXTRA_LIBS}")
  1648 message(STATUS "")
  1649 message(STATUS " Build Shared Library: ${SDL_SHARED}")
  1650 message(STATUS " Build Static Library: ${SDL_STATIC}")
  1651 if(SDL_STATIC)
  1652     message(STATUS " Build Static Library with Position Independent Code: ${SDL_STATIC_PIC}")
  1653 endif()
  1654 message(STATUS "")
  1655 if(UNIX)
  1656   message(STATUS "If something was not detected, although the libraries")
  1657   message(STATUS "were installed, then make sure you have set the")
  1658   message(STATUS "CFLAGS and LDFLAGS environment variables correctly.")
  1659   message(STATUS "")
  1660 endif()
  1661 
  1662 # Ensure that the extra cflags are used at compile time
  1663 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS}")
  1664 
  1665 # Always build SDLmain
  1666 add_library(SDL2main STATIC ${SDLMAIN_SOURCES})
  1667 target_include_directories(SDL2main PUBLIC $<INSTALL_INTERFACE:include>)
  1668 set(_INSTALL_LIBS "SDL2main")
  1669 
  1670 if(SDL_SHARED)
  1671   add_library(SDL2 SHARED ${SOURCE_FILES} ${VERSION_SOURCES})
  1672   if(APPLE)
  1673     set_target_properties(SDL2 PROPERTIES MACOSX_RPATH 1)
  1674   elseif(UNIX AND NOT ANDROID)
  1675     set_target_properties(SDL2 PROPERTIES
  1676       VERSION ${LT_VERSION}
  1677       SOVERSION ${LT_REVISION}
  1678       OUTPUT_NAME "SDL2-${LT_RELEASE}")
  1679   else()
  1680     set_target_properties(SDL2 PROPERTIES
  1681       VERSION ${SDL_VERSION}
  1682       SOVERSION ${LT_REVISION}
  1683       OUTPUT_NAME "SDL2")
  1684   endif()
  1685   if(MSVC AND NOT LIBC)
  1686     # Don't try to link with the default set of libraries.
  1687     set_target_properties(SDL2 PROPERTIES LINK_FLAGS_RELEASE "/NODEFAULTLIB")
  1688     set_target_properties(SDL2 PROPERTIES LINK_FLAGS_DEBUG "/NODEFAULTLIB")
  1689     set_target_properties(SDL2 PROPERTIES STATIC_LIBRARY_FLAGS "/NODEFAULTLIB")
  1690   endif()
  1691   set(_INSTALL_LIBS "SDL2" ${_INSTALL_LIBS})
  1692   target_link_libraries(SDL2 ${EXTRA_LIBS} ${EXTRA_LDFLAGS})
  1693   target_include_directories(SDL2 PUBLIC $<INSTALL_INTERFACE:include>)
  1694 endif()
  1695 
  1696 if(SDL_STATIC)
  1697   set (BUILD_SHARED_LIBS FALSE)
  1698   add_library(SDL2-static STATIC ${SOURCE_FILES})
  1699   if (NOT SDL_SHARED OR NOT WIN32)
  1700     set_target_properties(SDL2-static PROPERTIES OUTPUT_NAME "SDL2")
  1701     # Note: Apparently, OUTPUT_NAME must really be unique; even when
  1702     # CMAKE_IMPORT_LIBRARY_SUFFIX or the like are given. Otherwise
  1703     # the static build may race with the import lib and one will get
  1704     # clobbered, when the suffix is realized via subsequent rename.
  1705   endif()
  1706   set_target_properties(SDL2-static PROPERTIES POSITION_INDEPENDENT_CODE ${SDL_STATIC_PIC})
  1707   if(MSVC AND NOT LIBC)
  1708     set_target_properties(SDL2-static PROPERTIES LINK_FLAGS_RELEASE "/NODEFAULTLIB")
  1709     set_target_properties(SDL2-static PROPERTIES LINK_FLAGS_DEBUG "/NODEFAULTLIB")
  1710     set_target_properties(SDL2-static PROPERTIES STATIC_LIBRARY_FLAGS "/NODEFAULTLIB")
  1711   endif()
  1712   # TODO: Win32 platforms keep the same suffix .lib for import and static
  1713   # libraries - do we need to consider this?
  1714   set(_INSTALL_LIBS "SDL2-static" ${_INSTALL_LIBS})
  1715   target_link_libraries(SDL2-static ${EXTRA_LIBS} ${EXTRA_LDFLAGS})
  1716   target_include_directories(SDL2-static PUBLIC $<INSTALL_INTERFACE:include>)
  1717 endif()
  1718 
  1719 ##### Installation targets #####
  1720 install(TARGETS ${_INSTALL_LIBS} EXPORT SDL2Targets
  1721   LIBRARY DESTINATION "lib${LIB_SUFFIX}"
  1722   ARCHIVE DESTINATION "lib${LIB_SUFFIX}"
  1723   RUNTIME DESTINATION bin)
  1724 
  1725 ##### Export files #####
  1726 if (APPLE)
  1727   set(PKG_PREFIX "SDL2.framework/Resources")
  1728 elseif (WINDOWS)
  1729   set(PKG_PREFIX "cmake")
  1730 else ()
  1731   set(PKG_PREFIX "lib/cmake/SDL2")
  1732 endif ()
  1733 
  1734 include(CMakePackageConfigHelpers)
  1735 write_basic_package_version_file("${CMAKE_BINARY_DIR}/SDL2ConfigVersion.cmake"
  1736   VERSION ${SDL_VERSION}
  1737   COMPATIBILITY AnyNewerVersion
  1738 )
  1739 
  1740 install(EXPORT SDL2Targets
  1741   FILE SDL2Targets.cmake
  1742   NAMESPACE SDL2::
  1743   DESTINATION ${PKG_PREFIX}
  1744 )
  1745 install(
  1746   FILES
  1747     ${CMAKE_SOURCE_DIR}/SDL2Config.cmake
  1748     ${CMAKE_BINARY_DIR}/SDL2ConfigVersion.cmake
  1749   DESTINATION ${PKG_PREFIX}
  1750   COMPONENT Devel
  1751 )
  1752 
  1753 file(GLOB INCLUDE_FILES ${SDL2_SOURCE_DIR}/include/*.h)
  1754 file(GLOB BIN_INCLUDE_FILES ${SDL2_BINARY_DIR}/include/*.h)
  1755 foreach(_FNAME ${BIN_INCLUDE_FILES})
  1756   get_filename_component(_INCNAME ${_FNAME} NAME)
  1757   list(REMOVE_ITEM INCLUDE_FILES ${SDL2_SOURCE_DIR}/include/${_INCNAME})
  1758 endforeach()
  1759 list(APPEND INCLUDE_FILES ${BIN_INCLUDE_FILES})
  1760 install(FILES ${INCLUDE_FILES} DESTINATION include/SDL2)
  1761 
  1762 if(NOT (WINDOWS OR CYGWIN))
  1763   if(SDL_SHARED)
  1764     if (APPLE)
  1765         set(SOEXT "dylib")
  1766     else()
  1767         set(SOEXT "so")
  1768     endif()
  1769     install(CODE "
  1770       execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink
  1771       \"libSDL2-2.0.${SOEXT}\" \"libSDL2.${SOEXT}\")")
  1772     install(FILES ${SDL2_BINARY_DIR}/libSDL2.${SOEXT} DESTINATION "lib${LIB_SUFFIX}")
  1773   endif()
  1774   if(FREEBSD)
  1775     # FreeBSD uses ${PREFIX}/libdata/pkgconfig
  1776     install(FILES ${SDL2_BINARY_DIR}/sdl2.pc DESTINATION "libdata/pkgconfig")
  1777   else()
  1778     install(FILES ${SDL2_BINARY_DIR}/sdl2.pc
  1779       DESTINATION "lib${LIB_SUFFIX}/pkgconfig")
  1780   endif()
  1781   install(PROGRAMS ${SDL2_BINARY_DIR}/sdl2-config DESTINATION bin)
  1782   # TODO: what about the .spec file? Is it only needed for RPM creation?
  1783   install(FILES "${SDL2_SOURCE_DIR}/sdl2.m4" DESTINATION "${CMAKE_INSTALL_FULL_DATAROOTDIR}/aclocal")
  1784 endif()
  1785 
  1786 ##### Uninstall target #####
  1787 
  1788 configure_file(
  1789     "${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake.in"
  1790     "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
  1791     IMMEDIATE @ONLY)
  1792 
  1793 add_custom_target(uninstall
  1794     COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake)