CMakeLists.txt
author Sam Lantinga <slouken@libsdl.org>
Mon, 21 Aug 2017 11:25:04 -0700
changeset 11337 d9f24e95e8ba
parent 11335 a9f4f63b5add
child 11353 598839965877
permissions -rw-r--r--
Fixed bug 3761 - Windows non-MinGW cmake build defines HAVE_WCSLCPY and HAVE_WCSLCAT

Tom Seddon

https://github.com/SDL-mirror/SDL/commit/0f0ad62237fabb58d5811fe6fa59e5e5aa0e2fb5 (git head at the time of writing); Visual Studio 2015, toolset v140, Platform 10.0.14393.0, building for x64

Windows non-MinGW cmake build sets defines implying wcslcpy and wcslcat are available, but Windows doesn't have these functions.

Ryan C. Gordon

That's weird, these are the exact two functions that Emscripten incorrectly believed it had until we upgraded the buildbot's emsdk install.

Not sure what's up with this, but it's possibly not a MingW-specific thing!
     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_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(mmdeviceapi.h HAVE_MMDEVICEAPI_H)
  1157     check_include_file(audioclient.h HAVE_AUDIOCLIENT_H)
  1158     check_include_file(dxgi.h HAVE_DXGI_H)
  1159     if(HAVE_D3D_H OR HAVE_D3D11_H OR HAVE_DDRAW_H OR HAVE_DSOUND_H OR HAVE_DINPUT_H OR HAVE_XAUDIO2_H)
  1160       set(HAVE_DIRECTX TRUE)
  1161       if(NOT CMAKE_COMPILER_IS_MINGW AND NOT USE_WINSDK_DIRECTX)
  1162       # TODO: change $ENV{DXSDL_DIR} to get the path from the include checks
  1163         link_directories($ENV{DXSDK_DIR}\\lib\\${PROCESSOR_ARCH})
  1164         include_directories($ENV{DXSDK_DIR}\\Include)
  1165       endif()
  1166     endif()
  1167     set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS})
  1168   endif()
  1169 
  1170   if(SDL_AUDIO)
  1171     set(SDL_AUDIO_DRIVER_WINMM 1)
  1172     file(GLOB WINMM_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/winmm/*.c)
  1173     set(SOURCE_FILES ${SOURCE_FILES} ${WINMM_AUDIO_SOURCES})
  1174     set(HAVE_SDL_AUDIO TRUE)
  1175 
  1176     if(HAVE_DSOUND_H)
  1177       set(SDL_AUDIO_DRIVER_DSOUND 1)
  1178       file(GLOB DSOUND_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/directsound/*.c)
  1179       set(SOURCE_FILES ${SOURCE_FILES} ${DSOUND_AUDIO_SOURCES})
  1180     endif()
  1181 
  1182     if(HAVE_XAUDIO2_H)
  1183       set(SDL_AUDIO_DRIVER_XAUDIO2 1)
  1184       file(GLOB XAUDIO2_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/xaudio2/*.c)
  1185       set(SOURCE_FILES ${SOURCE_FILES} ${XAUDIO2_AUDIO_SOURCES})
  1186     endif()
  1187 
  1188     if(HAVE_AUDIOCLIENT_H AND HAVE_MMDEVICEAPI_H)
  1189       set(SDL_AUDIO_DRIVER_WASAPI 1)
  1190       file(GLOB WASAPI_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/wasapi/*.c)
  1191       set(SOURCE_FILES ${SOURCE_FILES} ${WASAPI_AUDIO_SOURCES})
  1192     endif()
  1193   endif()
  1194 
  1195   if(SDL_VIDEO)
  1196     # requires SDL_LOADSO on Windows (IME, DX, etc.)
  1197     if(NOT SDL_LOADSO)
  1198       message_error("SDL_VIDEO requires SDL_LOADSO, which is not enabled")
  1199     endif()
  1200     set(SDL_VIDEO_DRIVER_WINDOWS 1)
  1201     file(GLOB WIN_VIDEO_SOURCES ${SDL2_SOURCE_DIR}/src/video/windows/*.c)
  1202     set(SOURCE_FILES ${SOURCE_FILES} ${WIN_VIDEO_SOURCES})
  1203 
  1204     if(RENDER_D3D AND HAVE_D3D_H)
  1205       set(SDL_VIDEO_RENDER_D3D 1)
  1206       set(HAVE_RENDER_D3D TRUE)
  1207     endif()
  1208     if(RENDER_D3D AND HAVE_D3D11_H)
  1209       set(SDL_VIDEO_RENDER_D3D11 1)
  1210       set(HAVE_RENDER_D3D TRUE)
  1211     endif()
  1212     set(HAVE_SDL_VIDEO TRUE)
  1213   endif()
  1214 
  1215   if(SDL_THREADS)
  1216     set(SDL_THREAD_WINDOWS 1)
  1217     set(SOURCE_FILES ${SOURCE_FILES}
  1218       ${SDL2_SOURCE_DIR}/src/thread/windows/SDL_sysmutex.c
  1219       ${SDL2_SOURCE_DIR}/src/thread/windows/SDL_syssem.c
  1220       ${SDL2_SOURCE_DIR}/src/thread/windows/SDL_systhread.c
  1221       ${SDL2_SOURCE_DIR}/src/thread/windows/SDL_systls.c
  1222       ${SDL2_SOURCE_DIR}/src/thread/generic/SDL_syscond.c)
  1223     set(HAVE_SDL_THREADS TRUE)
  1224   endif()
  1225 
  1226   if(SDL_POWER)
  1227     set(SDL_POWER_WINDOWS 1)
  1228     set(SOURCE_FILES ${SOURCE_FILES} ${SDL2_SOURCE_DIR}/src/power/windows/SDL_syspower.c)
  1229     set(HAVE_SDL_POWER TRUE)
  1230   endif()
  1231 
  1232   if(SDL_FILESYSTEM)
  1233     set(SDL_FILESYSTEM_WINDOWS 1)
  1234     file(GLOB FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/windows/*.c)
  1235     set(SOURCE_FILES ${SOURCE_FILES} ${FILESYSTEM_SOURCES})
  1236     set(HAVE_SDL_FILESYSTEM TRUE)
  1237   endif()
  1238 
  1239   # Libraries for Win32 native and MinGW
  1240   list(APPEND EXTRA_LIBS user32 gdi32 winmm imm32 ole32 oleaut32 version uuid)
  1241 
  1242   # TODO: in configure.in the check for timers is set on
  1243   # cygwin | mingw32* - does this include mingw32CE?
  1244   if(SDL_TIMERS)
  1245     set(SDL_TIMER_WINDOWS 1)
  1246     file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/windows/*.c)
  1247     set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES})
  1248     set(HAVE_SDL_TIMERS TRUE)
  1249   endif()
  1250 
  1251   if(SDL_LOADSO)
  1252     set(SDL_LOADSO_WINDOWS 1)
  1253     file(GLOB LOADSO_SOURCES ${SDL2_SOURCE_DIR}/src/loadso/windows/*.c)
  1254     set(SOURCE_FILES ${SOURCE_FILES} ${LOADSO_SOURCES})
  1255     set(HAVE_SDL_LOADSO TRUE)
  1256   endif()
  1257 
  1258   file(GLOB CORE_SOURCES ${SDL2_SOURCE_DIR}/src/core/windows/*.c)
  1259   set(SOURCE_FILES ${SOURCE_FILES} ${CORE_SOURCES})
  1260 
  1261   if(SDL_VIDEO)
  1262     if(VIDEO_OPENGL)
  1263       set(SDL_VIDEO_OPENGL 1)
  1264       set(SDL_VIDEO_OPENGL_WGL 1)
  1265       set(SDL_VIDEO_RENDER_OGL 1)
  1266       set(HAVE_VIDEO_OPENGL TRUE)
  1267     endif()
  1268 
  1269     if(VIDEO_OPENGLES)
  1270       set(SDL_VIDEO_OPENGL_EGL 1)
  1271       set(SDL_VIDEO_OPENGL_ES2 1)
  1272       set(SDL_VIDEO_RENDER_OGL_ES2 1)
  1273       set(HAVE_VIDEO_OPENGLES TRUE)
  1274     endif()
  1275   endif()
  1276 
  1277   if(SDL_JOYSTICK)
  1278     file(GLOB JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/windows/*.c)
  1279     set(SOURCE_FILES ${SOURCE_FILES} ${JOYSTICK_SOURCES})
  1280     if(HAVE_DINPUT_H)
  1281       set(SDL_JOYSTICK_DINPUT 1)
  1282       list(APPEND EXTRA_LIBS dinput8)
  1283       if(CMAKE_COMPILER_IS_MINGW)
  1284         list(APPEND EXTRA_LIBS dxerr8)
  1285       elseif (NOT USE_WINSDK_DIRECTX)
  1286         list(APPEND EXTRA_LIBS dxerr)
  1287       endif()
  1288     endif()
  1289     if(HAVE_XINPUT_H)
  1290       set(SDL_JOYSTICK_XINPUT 1)
  1291     endif()
  1292     if(NOT HAVE_DINPUT_H AND NOT HAVE_XINPUT_H)
  1293       set(SDL_JOYSTICK_WINMM 1)
  1294     endif()
  1295     set(HAVE_SDL_JOYSTICK TRUE)
  1296 
  1297     if(SDL_HAPTIC)
  1298       if(HAVE_DINPUT_H OR HAVE_XINPUT_H)
  1299         file(GLOB HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/windows/*.c)
  1300         if(HAVE_DINPUT_H)
  1301           set(SDL_HAPTIC_DINPUT 1)
  1302         endif()
  1303         if(HAVE_XINPUT_H)
  1304           set(SDL_HAPTIC_XINPUT 1)
  1305         endif()
  1306       else()
  1307         file(GLOB HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/dummy/*.c)
  1308         set(SDL_HAPTIC_DUMMY 1)
  1309       endif()
  1310       set(SOURCE_FILES ${SOURCE_FILES} ${HAPTIC_SOURCES})
  1311       set(HAVE_SDL_HAPTIC TRUE)
  1312     endif()
  1313   endif()
  1314 
  1315   file(GLOB VERSION_SOURCES ${SDL2_SOURCE_DIR}/src/main/windows/*.rc)
  1316   file(GLOB SDLMAIN_SOURCES ${SDL2_SOURCE_DIR}/src/main/windows/*.c)
  1317   if(MINGW OR CYGWIN)
  1318     list(APPEND EXTRA_LIBS mingw32)
  1319     list(APPEND EXTRA_LDFLAGS "-mwindows")
  1320     set(SDL_CFLAGS "${SDL_CFLAGS} -Dmain=SDL_main")
  1321     list(APPEND SDL_LIBS "-lmingw32" "-lSDL2main" "-mwindows")
  1322   endif()
  1323 elseif(APPLE)
  1324   # TODO: rework this all for proper MacOS X, iOS and Darwin support
  1325 
  1326   # We always need these libs on macOS at the moment.
  1327   # !!! FIXME: we need Carbon for some very old API calls in
  1328   # !!! FIXME:  src/video/cocoa/SDL_cocoakeyboard.c, but we should figure out
  1329   # !!! FIXME:  how to dump those.
  1330   if (APPLE AND NOT IOS)
  1331     set(SDL_FRAMEWORK_COCOA 1)
  1332     set(SDL_FRAMEWORK_CARBON 1)
  1333   endif()
  1334 
  1335   # Requires the darwin file implementation
  1336   if(SDL_FILE)
  1337     file(GLOB EXTRA_SOURCES ${SDL2_SOURCE_DIR}/src/file/cocoa/*.m)
  1338     set(SOURCE_FILES ${EXTRA_SOURCES} ${SOURCE_FILES})
  1339     # !!! FIXME: modern CMake doesn't need "LANGUAGE C" for Objective-C.
  1340     set_source_files_properties(${EXTRA_SOURCES} PROPERTIES LANGUAGE C)
  1341     set(HAVE_SDL_FILE TRUE)
  1342     # !!! FIXME: why is COREVIDEO inside this if() block?
  1343     set(SDL_FRAMEWORK_COREVIDEO 1)
  1344   else()
  1345     message_error("SDL_FILE must be enabled to build on MacOS X")
  1346   endif()
  1347 
  1348   if(SDL_AUDIO)
  1349     set(SDL_AUDIO_DRIVER_COREAUDIO 1)
  1350     file(GLOB AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/coreaudio/*.m)
  1351     set(SOURCE_FILES ${SOURCE_FILES} ${AUDIO_SOURCES})
  1352     set(HAVE_SDL_AUDIO TRUE)
  1353     set(SDL_FRAMEWORK_COREAUDIO 1)
  1354     set(SDL_FRAMEWORK_AUDIOTOOLBOX 1)
  1355   endif()
  1356 
  1357   if(SDL_JOYSTICK)
  1358     set(SDL_JOYSTICK_IOKIT 1)
  1359     if (IOS)
  1360       file(GLOB JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/iphoneos/*.m)
  1361     else()
  1362       file(GLOB JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/darwin/*.c)
  1363     endif()
  1364     set(SOURCE_FILES ${SOURCE_FILES} ${JOYSTICK_SOURCES})
  1365     set(HAVE_SDL_JOYSTICK TRUE)
  1366     set(SDL_FRAMEWORK_IOKIT 1)
  1367     set(SDL_FRAMEWORK_FF 1)
  1368   endif()
  1369 
  1370   if(SDL_HAPTIC)
  1371     set(SDL_HAPTIC_IOKIT 1)
  1372     if (IOS)
  1373       file(GLOB HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/dummy/*.c)
  1374       set(SDL_HAPTIC_DUMMY 1)
  1375     else()
  1376       file(GLOB HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/darwin/*.c)
  1377     endif()
  1378     set(SOURCE_FILES ${SOURCE_FILES} ${HAPTIC_SOURCES})
  1379     set(HAVE_SDL_HAPTIC TRUE)
  1380     set(SDL_FRAMEWORK_IOKIT 1)
  1381     set(SDL_FRAMEWORK_FF 1)
  1382     if(NOT SDL_JOYSTICK)
  1383       message(FATAL_ERROR "SDL_HAPTIC requires SDL_JOYSTICK to be enabled")
  1384     endif()
  1385   endif()
  1386 
  1387   if(SDL_POWER)
  1388     set(SDL_POWER_MACOSX 1)
  1389     if (IOS)
  1390       file(GLOB POWER_SOURCES ${SDL2_SOURCE_DIR}/src/power/uikit/*.m)
  1391     else()
  1392       file(GLOB POWER_SOURCES ${SDL2_SOURCE_DIR}/src/power/macosx/*.c)
  1393     endif()
  1394     set(SOURCE_FILES ${SOURCE_FILES} ${POWER_SOURCES})
  1395     set(HAVE_SDL_POWER TRUE)
  1396     set(SDL_FRAMEWORK_IOKIT 1)
  1397   endif()
  1398 
  1399   if(SDL_TIMERS)
  1400     set(SDL_TIMER_UNIX 1)
  1401     file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/unix/*.c)
  1402     set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES})
  1403     set(HAVE_SDL_TIMERS TRUE)
  1404   endif(SDL_TIMERS)
  1405 
  1406   if(SDL_FILESYSTEM)
  1407     set(SDL_FILESYSTEM_COCOA 1)
  1408     file(GLOB FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/cocoa/*.m)
  1409     # !!! FIXME: modern CMake doesn't need "LANGUAGE C" for Objective-C.
  1410     set_source_files_properties(${FILESYSTEM_SOURCES} PROPERTIES LANGUAGE C)
  1411     set(SOURCE_FILES ${SOURCE_FILES} ${FILESYSTEM_SOURCES})
  1412     set(HAVE_SDL_FILESYSTEM TRUE)
  1413   endif()
  1414 
  1415   # Actually load the frameworks at the end so we don't duplicate include.
  1416   if(SDL_FRAMEWORK_COREVIDEO)
  1417     find_library(COREVIDEO CoreVideo)
  1418     list(APPEND EXTRA_LIBS ${COREVIDEO})
  1419   endif()
  1420   if(SDL_FRAMEWORK_COCOA)
  1421     find_library(COCOA_LIBRARY Cocoa)
  1422     list(APPEND EXTRA_LIBS ${COCOA_LIBRARY})
  1423   endif()
  1424   if(SDL_FRAMEWORK_IOKIT)
  1425     find_library(IOKIT IOKit)
  1426     list(APPEND EXTRA_LIBS ${IOKIT})
  1427   endif()
  1428   if(SDL_FRAMEWORK_FF)
  1429     find_library(FORCEFEEDBACK ForceFeedback)
  1430     list(APPEND EXTRA_LIBS ${FORCEFEEDBACK})
  1431   endif()
  1432   if(SDL_FRAMEWORK_CARBON)
  1433     find_library(CARBON_LIBRARY Carbon)
  1434     list(APPEND EXTRA_LIBS ${CARBON_LIBRARY})
  1435   endif()
  1436   if(SDL_FRAMEWORK_COREAUDIO)
  1437     find_library(COREAUDIO CoreAudio)
  1438     list(APPEND EXTRA_LIBS ${COREAUDIO})
  1439   endif()
  1440   if(SDL_FRAMEWORK_AUDIOTOOLBOX)
  1441     find_library(AUDIOTOOLBOX AudioToolbox)
  1442     list(APPEND EXTRA_LIBS ${AUDIOTOOLBOX})
  1443   endif()
  1444 
  1445   # iOS hack needed - http://code.google.com/p/ios-cmake/ ?
  1446   if(SDL_VIDEO)
  1447     if (IOS)
  1448       set(SDL_VIDEO_DRIVER_UIKIT 1)
  1449       file(GLOB UIKITVIDEO_SOURCES ${SDL2_SOURCE_DIR}/src/video/uikit/*.m)
  1450       set(SOURCE_FILES ${SOURCE_FILES} ${UIKITVIDEO_SOURCES})
  1451     else()
  1452       CheckCOCOA()
  1453       if(VIDEO_OPENGL)
  1454         set(SDL_VIDEO_OPENGL 1)
  1455         set(SDL_VIDEO_OPENGL_CGL 1)
  1456         set(SDL_VIDEO_RENDER_OGL 1)
  1457         set(HAVE_VIDEO_OPENGL TRUE)
  1458       endif()
  1459     endif()
  1460   endif()
  1461 
  1462   CheckPTHREAD()
  1463 elseif(HAIKU)
  1464   if(SDL_VIDEO)
  1465     set(SDL_VIDEO_DRIVER_HAIKU 1)
  1466     file(GLOB HAIKUVIDEO_SOURCES ${SDL2_SOURCE_DIR}/src/video/haiku/*.c)
  1467     set(SOURCE_FILES ${SOURCE_FILES} ${HAIKUVIDEO_SOURCES})
  1468     set(HAVE_SDL_VIDEO TRUE)
  1469 
  1470     set(SDL_FILESYSTEM_HAIKU 1)
  1471     file(GLOB FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/haiku/*.cc)
  1472     set(SOURCE_FILES ${SOURCE_FILES} ${FILESYSTEM_SOURCES})
  1473     set(HAVE_SDL_FILESYSTEM TRUE)
  1474 
  1475     if(SDL_TIMERS)
  1476       set(SDL_TIMER_HAIKU 1)
  1477       file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/haiku/*.c)
  1478       set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES})
  1479       set(HAVE_SDL_TIMERS TRUE)
  1480     endif(SDL_TIMERS)
  1481 
  1482     if(VIDEO_OPENGL)
  1483       # TODO: Use FIND_PACKAGE(OpenGL) instead
  1484       set(SDL_VIDEO_OPENGL 1)
  1485       set(SDL_VIDEO_OPENGL_BGL 1)
  1486       set(SDL_VIDEO_RENDER_OGL 1)
  1487       list(APPEND EXTRA_LIBS GL)
  1488       set(HAVE_VIDEO_OPENGL TRUE)
  1489     endif()
  1490   endif()
  1491 
  1492   CheckPTHREAD()
  1493 endif()
  1494 
  1495 # Dummies
  1496 # configure.in does it differently:
  1497 # if not have X
  1498 #   if enable_X {  SDL_X_DISABLED = 1 }
  1499 #   [add dummy sources]
  1500 # so it always adds a dummy, without checking, if it was actually requested.
  1501 # This leads to missing internal references on building, since the
  1502 # src/X/*.c does not get included.
  1503 if(NOT HAVE_SDL_JOYSTICK)
  1504   set(SDL_JOYSTICK_DISABLED 1)
  1505   if(SDL_JOYSTICK AND NOT APPLE) # results in unresolved symbols on OSX
  1506 
  1507     file(GLOB JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/dummy/*.c)
  1508     set(SOURCE_FILES ${SOURCE_FILES} ${JOYSTICK_SOURCES})
  1509   endif()
  1510 endif()
  1511 if(NOT HAVE_SDL_HAPTIC)
  1512   set(SDL_HAPTIC_DISABLED 1)
  1513   file(GLOB HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/dummy/*.c)
  1514   set(SOURCE_FILES ${SOURCE_FILES} ${HAPTIC_SOURCES})
  1515 endif()
  1516 if(NOT HAVE_SDL_LOADSO)
  1517   set(SDL_LOADSO_DISABLED 1)
  1518   file(GLOB LOADSO_SOURCES ${SDL2_SOURCE_DIR}/src/loadso/dummy/*.c)
  1519   set(SOURCE_FILES ${SOURCE_FILES} ${LOADSO_SOURCES})
  1520 endif()
  1521 if(NOT HAVE_SDL_FILESYSTEM)
  1522   set(SDL_FILESYSTEM_DISABLED 1)
  1523   file(GLOB FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/dummy/*.c)
  1524   set(SOURCE_FILES ${SOURCE_FILES} ${FILESYSTEM_SOURCES})
  1525 endif()
  1526 
  1527 # We always need to have threads and timers around
  1528 if(NOT HAVE_SDL_THREADS)
  1529   set(SDL_THREADS_DISABLED 1)
  1530   file(GLOB THREADS_SOURCES ${SDL2_SOURCE_DIR}/src/thread/generic/*.c)
  1531   set(SOURCE_FILES ${SOURCE_FILES} ${THREADS_SOURCES})
  1532 endif()
  1533 if(NOT HAVE_SDL_TIMERS)
  1534   set(SDL_TIMERS_DISABLED 1)
  1535   file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/dummy/*.c)
  1536   set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES})
  1537 endif()
  1538 
  1539 if(NOT SDLMAIN_SOURCES)
  1540   file(GLOB SDLMAIN_SOURCES ${SDL2_SOURCE_DIR}/src/main/dummy/*.c)
  1541 endif()
  1542 
  1543 # Append the -MMD -MT flags
  1544 # if(DEPENDENCY_TRACKING)
  1545 #   if(COMPILER_IS_GNUCC)
  1546 #     set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -MMD -MT \$@")
  1547 #   endif()
  1548 # endif()
  1549 
  1550 configure_file("${SDL2_SOURCE_DIR}/include/SDL_config.h.cmake"
  1551   "${SDL2_BINARY_DIR}/include/SDL_config.h")
  1552 
  1553 # Prepare the flags and remove duplicates
  1554 if(EXTRA_LDFLAGS)
  1555   list(REMOVE_DUPLICATES EXTRA_LDFLAGS)
  1556 endif()
  1557 if(EXTRA_LIBS)
  1558   list(REMOVE_DUPLICATES EXTRA_LIBS)
  1559 endif()
  1560 if(EXTRA_CFLAGS)
  1561   list(REMOVE_DUPLICATES EXTRA_CFLAGS)
  1562 endif()
  1563 listtostr(EXTRA_CFLAGS _EXTRA_CFLAGS)
  1564 set(EXTRA_CFLAGS ${_EXTRA_CFLAGS})
  1565 
  1566 # Compat helpers for the configuration files
  1567 if(NOT WINDOWS OR CYGWIN)
  1568   # TODO: we need a Windows script, too
  1569   execute_process(COMMAND sh ${SDL2_SOURCE_DIR}/build-scripts/updaterev.sh)
  1570 
  1571   set(prefix ${CMAKE_INSTALL_PREFIX})
  1572   set(exec_prefix "\${prefix}")
  1573   set(libdir "\${exec_prefix}/lib${LIB_SUFFIX}")
  1574   set(bindir "\${exec_prefix}/bin")
  1575   set(includedir "\${prefix}/include")
  1576   if(SDL_STATIC)
  1577     set(ENABLE_STATIC_TRUE "")
  1578     set(ENABLE_STATIC_FALSE "#")
  1579   else()
  1580     set(ENABLE_STATIC_TRUE "#")
  1581     set(ENABLE_STATIC_FALSE "")
  1582   endif()
  1583   if(SDL_SHARED)
  1584     set(ENABLE_SHARED_TRUE "")
  1585     set(ENABLE_SHARED_FALSE "#")
  1586   else()
  1587     set(ENABLE_SHARED_TRUE "#")
  1588     set(ENABLE_SHARED_FALSE "")
  1589   endif()
  1590 
  1591   # Clean up the different lists
  1592   listtostr(EXTRA_LIBS _EXTRA_LIBS "-l")
  1593   set(SDL_STATIC_LIBS ${SDL_LIBS} ${EXTRA_LDFLAGS} ${_EXTRA_LIBS})
  1594   list(REMOVE_DUPLICATES SDL_STATIC_LIBS)
  1595   listtostr(SDL_STATIC_LIBS _SDL_STATIC_LIBS)
  1596   set(SDL_STATIC_LIBS ${_SDL_STATIC_LIBS})
  1597   listtostr(SDL_LIBS _SDL_LIBS)
  1598   set(SDL_LIBS ${_SDL_LIBS})
  1599 
  1600   # MESSAGE(STATUS "SDL_LIBS: ${SDL_LIBS}")
  1601   # MESSAGE(STATUS "SDL_STATIC_LIBS: ${SDL_STATIC_LIBS}")
  1602 
  1603   configure_file("${SDL2_SOURCE_DIR}/sdl2.pc.in"
  1604     "${SDL2_BINARY_DIR}/sdl2.pc" @ONLY)
  1605   configure_file("${SDL2_SOURCE_DIR}/sdl2-config.in"
  1606     "${SDL2_BINARY_DIR}/sdl2-config")
  1607   configure_file("${SDL2_SOURCE_DIR}/sdl2-config.in"
  1608     "${SDL2_BINARY_DIR}/sdl2-config" @ONLY)
  1609   configure_file("${SDL2_SOURCE_DIR}/SDL2.spec.in"
  1610     "${SDL2_BINARY_DIR}/SDL2.spec" @ONLY)
  1611 endif()
  1612 
  1613 ##### Info output #####
  1614 message(STATUS "")
  1615 message(STATUS "SDL2 was configured with the following options:")
  1616 message(STATUS "")
  1617 message(STATUS "Platform: ${CMAKE_SYSTEM}")
  1618 message(STATUS "64-bit:   ${ARCH_64}")
  1619 message(STATUS "Compiler: ${CMAKE_C_COMPILER}")
  1620 message(STATUS "")
  1621 message(STATUS "Subsystems:")
  1622 foreach(_SUB ${SDL_SUBSYSTEMS})
  1623   string(TOUPPER ${_SUB} _OPT)
  1624   message_bool_option(${_SUB} SDL_${_OPT})
  1625 endforeach()
  1626 message(STATUS "")
  1627 message(STATUS "Options:")
  1628 list(SORT ALLOPTIONS)
  1629 foreach(_OPT ${ALLOPTIONS})
  1630   # Longest option is VIDEO_X11_XSCREENSAVER = 22 characters
  1631   # Get the padding
  1632   string(LENGTH ${_OPT} _OPTLEN)
  1633   math(EXPR _PADLEN "23 - ${_OPTLEN}")
  1634   string(RANDOM LENGTH ${_PADLEN} ALPHABET " " _PADDING)
  1635   message_tested_option(${_OPT} ${_PADDING})
  1636 endforeach()
  1637 message(STATUS "")
  1638 message(STATUS " CFLAGS:        ${CMAKE_C_FLAGS}")
  1639 message(STATUS " EXTRA_CFLAGS:  ${EXTRA_CFLAGS}")
  1640 message(STATUS " EXTRA_LDFLAGS: ${EXTRA_LDFLAGS}")
  1641 message(STATUS " EXTRA_LIBS:    ${EXTRA_LIBS}")
  1642 message(STATUS "")
  1643 message(STATUS " Build Shared Library: ${SDL_SHARED}")
  1644 message(STATUS " Build Static Library: ${SDL_STATIC}")
  1645 if(SDL_STATIC)
  1646     message(STATUS " Build Static Library with Position Independent Code: ${SDL_STATIC_PIC}")
  1647 endif()
  1648 message(STATUS "")
  1649 if(UNIX)
  1650   message(STATUS "If something was not detected, although the libraries")
  1651   message(STATUS "were installed, then make sure you have set the")
  1652   message(STATUS "CFLAGS and LDFLAGS environment variables correctly.")
  1653   message(STATUS "")
  1654 endif()
  1655 
  1656 # Ensure that the extra cflags are used at compile time
  1657 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS}")
  1658 
  1659 # Always build SDLmain
  1660 add_library(SDL2main STATIC ${SDLMAIN_SOURCES})
  1661 target_include_directories(SDL2main PUBLIC $<INSTALL_INTERFACE:include>)
  1662 set(_INSTALL_LIBS "SDL2main")
  1663 
  1664 if(SDL_SHARED)
  1665   add_library(SDL2 SHARED ${SOURCE_FILES} ${VERSION_SOURCES})
  1666   if(APPLE)
  1667     set_target_properties(SDL2 PROPERTIES MACOSX_RPATH 1)
  1668   elseif(UNIX AND NOT ANDROID)
  1669     set_target_properties(SDL2 PROPERTIES
  1670       VERSION ${LT_VERSION}
  1671       SOVERSION ${LT_REVISION}
  1672       OUTPUT_NAME "SDL2-${LT_RELEASE}")
  1673   else()
  1674     set_target_properties(SDL2 PROPERTIES
  1675       VERSION ${SDL_VERSION}
  1676       SOVERSION ${LT_REVISION}
  1677       OUTPUT_NAME "SDL2")
  1678   endif()
  1679   if(MSVC AND NOT LIBC)
  1680     # Don't try to link with the default set of libraries.
  1681     set_target_properties(SDL2 PROPERTIES LINK_FLAGS_RELEASE "/NODEFAULTLIB")
  1682     set_target_properties(SDL2 PROPERTIES LINK_FLAGS_DEBUG "/NODEFAULTLIB")
  1683     set_target_properties(SDL2 PROPERTIES STATIC_LIBRARY_FLAGS "/NODEFAULTLIB")
  1684   endif()
  1685   set(_INSTALL_LIBS "SDL2" ${_INSTALL_LIBS})
  1686   target_link_libraries(SDL2 ${EXTRA_LIBS} ${EXTRA_LDFLAGS})
  1687   target_include_directories(SDL2 PUBLIC $<INSTALL_INTERFACE:include>)
  1688 endif()
  1689 
  1690 if(SDL_STATIC)
  1691   set (BUILD_SHARED_LIBS FALSE)
  1692   add_library(SDL2-static STATIC ${SOURCE_FILES})
  1693   if (NOT SDL_SHARED OR NOT WIN32)
  1694     set_target_properties(SDL2-static PROPERTIES OUTPUT_NAME "SDL2")
  1695     # Note: Apparently, OUTPUT_NAME must really be unique; even when
  1696     # CMAKE_IMPORT_LIBRARY_SUFFIX or the like are given. Otherwise
  1697     # the static build may race with the import lib and one will get
  1698     # clobbered, when the suffix is realized via subsequent rename.
  1699   endif()
  1700   set_target_properties(SDL2-static PROPERTIES POSITION_INDEPENDENT_CODE ${SDL_STATIC_PIC})
  1701   if(MSVC AND NOT LIBC)
  1702     set_target_properties(SDL2-static PROPERTIES LINK_FLAGS_RELEASE "/NODEFAULTLIB")
  1703     set_target_properties(SDL2-static PROPERTIES LINK_FLAGS_DEBUG "/NODEFAULTLIB")
  1704     set_target_properties(SDL2-static PROPERTIES STATIC_LIBRARY_FLAGS "/NODEFAULTLIB")
  1705   endif()
  1706   # TODO: Win32 platforms keep the same suffix .lib for import and static
  1707   # libraries - do we need to consider this?
  1708   set(_INSTALL_LIBS "SDL2-static" ${_INSTALL_LIBS})
  1709   target_link_libraries(SDL2-static ${EXTRA_LIBS} ${EXTRA_LDFLAGS})
  1710   target_include_directories(SDL2-static PUBLIC $<INSTALL_INTERFACE:include>)
  1711 endif()
  1712 
  1713 ##### Installation targets #####
  1714 install(TARGETS ${_INSTALL_LIBS} EXPORT SDL2Targets
  1715   LIBRARY DESTINATION "lib${LIB_SUFFIX}"
  1716   ARCHIVE DESTINATION "lib${LIB_SUFFIX}"
  1717   RUNTIME DESTINATION bin)
  1718 
  1719 ##### Export files #####
  1720 if (APPLE)
  1721   set(PKG_PREFIX "SDL2.framework/Resources")
  1722 elseif (WINDOWS)
  1723   set(PKG_PREFIX "cmake")
  1724 else ()
  1725   set(PKG_PREFIX "lib/cmake/SDL2")
  1726 endif ()
  1727 
  1728 include(CMakePackageConfigHelpers)
  1729 write_basic_package_version_file("${CMAKE_BINARY_DIR}/SDL2ConfigVersion.cmake"
  1730   VERSION ${SDL_VERSION}
  1731   COMPATIBILITY AnyNewerVersion
  1732 )
  1733 
  1734 install(EXPORT SDL2Targets
  1735   FILE SDL2Targets.cmake
  1736   NAMESPACE SDL2::
  1737   DESTINATION ${PKG_PREFIX}
  1738 )
  1739 install(
  1740   FILES
  1741     ${CMAKE_SOURCE_DIR}/SDL2Config.cmake
  1742     ${CMAKE_BINARY_DIR}/SDL2ConfigVersion.cmake
  1743   DESTINATION ${PKG_PREFIX}
  1744   COMPONENT Devel
  1745 )
  1746 
  1747 file(GLOB INCLUDE_FILES ${SDL2_SOURCE_DIR}/include/*.h)
  1748 file(GLOB BIN_INCLUDE_FILES ${SDL2_BINARY_DIR}/include/*.h)
  1749 foreach(_FNAME ${BIN_INCLUDE_FILES})
  1750   get_filename_component(_INCNAME ${_FNAME} NAME)
  1751   list(REMOVE_ITEM INCLUDE_FILES ${SDL2_SOURCE_DIR}/include/${_INCNAME})
  1752 endforeach()
  1753 list(APPEND INCLUDE_FILES ${BIN_INCLUDE_FILES})
  1754 install(FILES ${INCLUDE_FILES} DESTINATION include/SDL2)
  1755 
  1756 if(NOT (WINDOWS OR CYGWIN))
  1757   if(SDL_SHARED)
  1758     if (APPLE)
  1759         set(SOEXT "dylib")
  1760     else()
  1761         set(SOEXT "so")
  1762     endif()
  1763     install(CODE "
  1764       execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink
  1765       \"libSDL2-2.0.${SOEXT}\" \"libSDL2.${SOEXT}\")")
  1766     install(FILES ${SDL2_BINARY_DIR}/libSDL2.${SOEXT} DESTINATION "lib${LIB_SUFFIX}")
  1767   endif()
  1768   if(FREEBSD)
  1769     # FreeBSD uses ${PREFIX}/libdata/pkgconfig
  1770     install(FILES ${SDL2_BINARY_DIR}/sdl2.pc DESTINATION "libdata/pkgconfig")
  1771   else()
  1772     install(FILES ${SDL2_BINARY_DIR}/sdl2.pc
  1773       DESTINATION "lib${LIB_SUFFIX}/pkgconfig")
  1774   endif()
  1775   install(PROGRAMS ${SDL2_BINARY_DIR}/sdl2-config DESTINATION bin)
  1776   # TODO: what about the .spec file? Is it only needed for RPM creation?
  1777   install(FILES "${SDL2_SOURCE_DIR}/sdl2.m4" DESTINATION "${CMAKE_INSTALL_FULL_DATAROOTDIR}/aclocal")
  1778 endif()
  1779 
  1780 ##### Uninstall target #####
  1781 
  1782 configure_file(
  1783     "${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake.in"
  1784     "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
  1785     IMMEDIATE @ONLY)
  1786 
  1787 add_custom_target(uninstall
  1788     COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake)