CMakeLists.txt
author Sam Lantinga
Sat, 08 Jun 2019 14:36:03 -0700
changeset 12792 4063a5ebe39b
parent 12791 74a69d4d9e9a
child 12804 1a330416800d
permissions -rw-r--r--
Fixed bug 4593 - Respect CMake's BUILD_SHARED_LIBS default behavior

tschwinger

Respect the BUILD_SHARED_LIBS variable when defined, and build either shared or static libs, which is CMake's default behavior (See https://cmake.org/cmake/help/latest/variable/BUILD_SHARED_LIBS.html).

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