CMakeLists.txt
author Sam Lantinga <slouken@libsdl.org>
Wed, 30 Aug 2017 14:25:01 -0700
changeset 11429 424d7476f72d
parent 11427 381449ca1cd2
child 11480 e7a79b236dc0
permissions -rw-r--r--
Fixed bug 3789 - Android : small clean up

Sylvain

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