CMakeLists.txt
author Ozkan Sezer <sezeroz@gmail.com>
Sun, 01 Jul 2018 17:01:04 +0300
changeset 12054 e604fe493d45
parent 11943 fb7758471f13
child 12065 abc706dbb7af
permissions -rw-r--r--
make WASAPI configurable in autofoo and cmake (default is on.)

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