CMakeLists.txt
author Sam Lantinga <slouken@libsdl.org>
Fri, 21 Jun 2019 22:01:27 -0700
changeset 12901 5cbf6472a916
parent 12869 2b56cef46971
child 12932 800524378309
permissions -rw-r--r--
Fixed bug 4684 - GLES1 variables missing under Android with CMake

Braden Obrzut

https://hg.libsdl.org/SDL/file/9d3f245739f8/CMakeLists.txt#l911

I believe the following should also be specified there:

set(SDL_VIDEO_OPENGL_ES 1)
set(SDL_VIDEO_RENDER_OGL_ES 1)

As it is now GLES1 support is missing when building for Android despite it linking to the library.
     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 10)
    46 set(SDL_INTERFACE_AGE 0)
    47 set(SDL_BINARY_AGE 10)
    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(-fno-strict-aliasing HAVE_GCC_NO_STRICT_ALIASING)
   422   if(HAVE_GCC_NO_STRICT_ALIASING)
   423     list(APPEND EXTRA_CFLAGS "-fno-strict-aliasing")
   424   endif()
   425 
   426   check_c_compiler_flag(-Wdeclaration-after-statement HAVE_GCC_WDECLARATION_AFTER_STATEMENT)
   427   if(HAVE_GCC_WDECLARATION_AFTER_STATEMENT)
   428     check_c_compiler_flag(-Werror=declaration-after-statement HAVE_GCC_WERROR_DECLARATION_AFTER_STATEMENT)
   429     if(HAVE_GCC_WERROR_DECLARATION_AFTER_STATEMENT)
   430       list(APPEND EXTRA_CFLAGS "-Werror=declaration-after-statement")
   431     endif()
   432     list(APPEND EXTRA_CFLAGS "-Wdeclaration-after-statement")
   433   endif()
   434 
   435   if(DEPENDENCY_TRACKING)
   436     check_c_source_compiles("
   437         #if !defined(__GNUC__) || __GNUC__ < 3
   438         #error Dependency tracking requires GCC 3.0 or newer
   439         #endif
   440         int main(int argc, char **argv) { }" HAVE_DEPENDENCY_TRACKING)
   441   endif()
   442 
   443   if(GCC_ATOMICS)
   444     check_c_source_compiles("int main(int argc, char **argv) {
   445         int a;
   446         void *x, *y, *z;
   447         __sync_lock_test_and_set(&a, 4);
   448         __sync_lock_test_and_set(&x, y);
   449         __sync_fetch_and_add(&a, 1);
   450         __sync_bool_compare_and_swap(&a, 5, 10);
   451         __sync_bool_compare_and_swap(&x, y, z); }" HAVE_GCC_ATOMICS)
   452     if(NOT HAVE_GCC_ATOMICS)
   453       check_c_source_compiles("int main(int argc, char **argv) {
   454           int a;
   455           __sync_lock_test_and_set(&a, 1);
   456           __sync_lock_release(&a); }" HAVE_GCC_SYNC_LOCK_TEST_AND_SET)
   457     endif()
   458   endif()
   459 
   460   set(CMAKE_REQUIRED_FLAGS "-mpreferred-stack-boundary=2")
   461   check_c_source_compiles("int x = 0; int main(int argc, char **argv) {}"
   462     HAVE_GCC_PREFERRED_STACK_BOUNDARY)
   463   set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS})
   464 
   465   set(CMAKE_REQUIRED_FLAGS "-fvisibility=hidden -Werror")
   466   check_c_source_compiles("
   467       #if !defined(__GNUC__) || __GNUC__ < 4
   468       #error SDL only uses visibility attributes in GCC 4 or newer
   469       #endif
   470       int main(int argc, char **argv) {}" HAVE_GCC_FVISIBILITY)
   471   if(HAVE_GCC_FVISIBILITY)
   472     list(APPEND EXTRA_CFLAGS "-fvisibility=hidden")
   473   endif()
   474   set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS})
   475 
   476   check_c_compiler_flag(-Wshadow HAVE_GCC_WSHADOW)
   477   if(HAVE_GCC_WSHADOW)
   478     list(APPEND EXTRA_CFLAGS "-Wshadow")
   479   endif()
   480 
   481   if(APPLE)
   482     list(APPEND EXTRA_LDFLAGS "-Wl,-undefined,error")
   483     list(APPEND EXTRA_LDFLAGS "-Wl,-compatibility_version,${DYLIB_COMPATIBILITY_VERSION}")
   484     list(APPEND EXTRA_LDFLAGS "-Wl,-current_version,${DYLIB_CURRENT_VERSION}")
   485   else()
   486     set(CMAKE_REQUIRED_FLAGS "-Wl,--no-undefined")
   487     check_c_compiler_flag("" HAVE_NO_UNDEFINED)
   488     set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS})
   489     if(HAVE_NO_UNDEFINED)
   490       list(APPEND EXTRA_LDFLAGS "-Wl,--no-undefined")
   491     endif()
   492   endif()
   493 endif()
   494 
   495 if(ASSEMBLY)
   496   if(USE_GCC OR USE_CLANG)
   497     set(SDL_ASSEMBLY_ROUTINES 1)
   498     # TODO: Those all seem to be quite GCC specific - needs to be
   499     # reworked for better compiler support
   500     set(HAVE_ASSEMBLY TRUE)
   501     if(MMX)
   502       set(CMAKE_REQUIRED_FLAGS "-mmmx")
   503       check_c_source_compiles("
   504           #ifdef __MINGW32__
   505           #include <_mingw.h>
   506           #ifdef __MINGW64_VERSION_MAJOR
   507           #include <intrin.h>
   508           #else
   509           #include <mmintrin.h>
   510           #endif
   511           #else
   512           #include <mmintrin.h>
   513           #endif
   514           #ifndef __MMX__
   515           #error Assembler CPP flag not enabled
   516           #endif
   517           int main(int argc, char **argv) { }" HAVE_MMX)
   518       if(HAVE_MMX)
   519         list(APPEND EXTRA_CFLAGS "-mmmx")
   520       endif()
   521       set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS})
   522     endif()
   523 
   524     if(3DNOW)
   525       set(CMAKE_REQUIRED_FLAGS "-m3dnow")
   526       check_c_source_compiles("
   527           #include <mm3dnow.h>
   528           #ifndef __3dNOW__
   529           #error Assembler CPP flag not enabled
   530           #endif
   531           int main(int argc, char **argv) {
   532             void *p = 0;
   533             _m_prefetch(p);
   534           }" HAVE_3DNOW)
   535       if(HAVE_3DNOW)
   536         list(APPEND EXTRA_CFLAGS "-m3dnow")
   537       endif()
   538       set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS})
   539     endif()
   540 
   541     if(SSE)
   542       set(CMAKE_REQUIRED_FLAGS "-msse")
   543       check_c_source_compiles("
   544           #ifdef __MINGW32__
   545           #include <_mingw.h>
   546           #ifdef __MINGW64_VERSION_MAJOR
   547           #include <intrin.h>
   548           #else
   549           #include <xmmintrin.h>
   550           #endif
   551           #else
   552           #include <xmmintrin.h>
   553           #endif
   554           #ifndef __SSE__
   555           #error Assembler CPP flag not enabled
   556           #endif
   557           int main(int argc, char **argv) { }" HAVE_SSE)
   558       if(HAVE_SSE)
   559         list(APPEND EXTRA_CFLAGS "-msse")
   560       endif()
   561       set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS})
   562     endif()
   563 
   564     if(SSE2)
   565       set(CMAKE_REQUIRED_FLAGS "-msse2")
   566       check_c_source_compiles("
   567           #ifdef __MINGW32__
   568           #include <_mingw.h>
   569           #ifdef __MINGW64_VERSION_MAJOR
   570           #include <intrin.h>
   571           #else
   572           #include <emmintrin.h>
   573           #endif
   574           #else
   575           #include <emmintrin.h>
   576           #endif
   577           #ifndef __SSE2__
   578           #error Assembler CPP flag not enabled
   579           #endif
   580           int main(int argc, char **argv) { }" HAVE_SSE2)
   581       if(HAVE_SSE2)
   582         list(APPEND EXTRA_CFLAGS "-msse2")
   583       endif()
   584       set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS})
   585     endif()
   586 
   587     if(SSE3)
   588       set(CMAKE_REQUIRED_FLAGS "-msse3")
   589       check_c_source_compiles("
   590           #ifdef __MINGW32__
   591           #include <_mingw.h>
   592           #ifdef __MINGW64_VERSION_MAJOR
   593           #include <intrin.h>
   594           #else
   595           #include <pmmintrin.h>
   596           #endif
   597           #else
   598           #include <pmmintrin.h>
   599           #endif
   600           #ifndef __SSE3__
   601           #error Assembler CPP flag not enabled
   602           #endif
   603           int main(int argc, char **argv) { }" HAVE_SSE3)
   604       if(HAVE_SSE3)
   605         list(APPEND EXTRA_CFLAGS "-msse3")
   606       endif()
   607       set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS})
   608     endif()
   609 
   610     if(NOT SSEMATH)
   611       if(SSE OR SSE2 OR SSE3)
   612         if(USE_GCC)
   613           check_c_compiler_flag(-mfpmath=387 HAVE_FP_387)
   614           if(HAVE_FP_387)
   615             list(APPEND EXTRA_CFLAGS "-mfpmath=387")
   616           endif()
   617         endif()
   618         set(HAVE_SSEMATH TRUE)
   619       endif()
   620     endif()
   621 
   622     check_include_file("immintrin.h" HAVE_IMMINTRIN_H)
   623 
   624     if(ALTIVEC)
   625       set(CMAKE_REQUIRED_FLAGS "-maltivec")
   626       check_c_source_compiles("
   627           #include <altivec.h>
   628           vector unsigned int vzero() {
   629               return vec_splat_u32(0);
   630           }
   631           int main(int argc, char **argv) { }" HAVE_ALTIVEC_H_HDR)
   632       check_c_source_compiles("
   633           vector unsigned int vzero() {
   634               return vec_splat_u32(0);
   635           }
   636           int main(int argc, char **argv) { }" HAVE_ALTIVEC)
   637       set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS})
   638       if(HAVE_ALTIVEC OR HAVE_ALTIVEC_H_HDR)
   639         set(HAVE_ALTIVEC TRUE) # if only HAVE_ALTIVEC_H_HDR is set
   640         list(APPEND EXTRA_CFLAGS "-maltivec")
   641         set(SDL_ALTIVEC_BLITTERS 1)
   642         if(HAVE_ALTIVEC_H_HDR)
   643           set(HAVE_ALTIVEC_H 1)
   644         endif()
   645       endif()
   646     endif()
   647   elseif(MSVC_VERSION GREATER 1500)
   648     # TODO: SDL_cpuinfo.h needs to support the user's configuration wish
   649     # for MSVC - right now it is always activated
   650     if(NOT ARCH_64)
   651       set(HAVE_MMX TRUE)
   652       set(HAVE_3DNOW TRUE)
   653     endif()
   654     set(HAVE_SSE TRUE)
   655     set(HAVE_SSE2 TRUE)
   656     set(HAVE_SSE3 TRUE)
   657     set(SDL_ASSEMBLY_ROUTINES 1)
   658   endif()
   659 # TODO:
   660 #else()
   661 #  if(USE_GCC OR USE_CLANG)
   662 #    list(APPEND EXTRA_CFLAGS "-mno-sse" "-mno-sse2" "-mno-sse3" "-mno-mmx")
   663 #  endif()
   664 endif()
   665 
   666 # TODO: Can't deactivate on FreeBSD? w/o LIBC, SDL_stdinc.h can't define
   667 # anything.
   668 if(LIBC)
   669   if(WINDOWS AND NOT MINGW)
   670     set(HAVE_LIBC TRUE)
   671     foreach(_HEADER stdio.h string.h wchar.h ctype.h math.h limits.h)
   672       string(TOUPPER "HAVE_${_HEADER}" _UPPER)
   673       string(REPLACE "." "_" _HAVE_H ${_UPPER})
   674       set(${_HAVE_H} 1)
   675     endforeach()
   676     set(HAVE_SIGNAL_H 1)
   677     foreach(_FN
   678             malloc calloc realloc free qsort abs memset memcpy memmove memcmp
   679             wcslen wcscmp
   680             strlen _strrev _strupr _strlwr strchr strrchr strstr itoa _ltoa
   681             _ultoa strtol strtoul strtoll strtod atoi atof strcmp strncmp
   682             _stricmp _strnicmp sscanf
   683             acos acosf asin asinf atan atanf atan2 atan2f ceil ceilf
   684             copysign copysignf cos cosf exp expf fabs fabsf floor floorf fmod fmodf
   685             log logf log10 log10f pow powf scalbn scalbnf sin sinf sqrt sqrtf tan tanf)
   686       string(TOUPPER ${_FN} _UPPER)
   687       set(HAVE_${_UPPER} 1)
   688     endforeach()
   689     if(NOT CYGWIN AND NOT MINGW)
   690       set(HAVE_ALLOCA 1)
   691     endif()
   692     set(HAVE_M_PI 1)
   693     add_definitions(-D_USE_MATH_DEFINES) # needed for M_PI
   694     set(STDC_HEADERS 1)
   695   else()
   696     set(HAVE_LIBC TRUE)
   697     check_include_file(sys/types.h HAVE_SYS_TYPES_H)
   698     foreach(_HEADER
   699             stdio.h stdlib.h stddef.h stdarg.h malloc.h memory.h string.h limits.h
   700             strings.h wchar.h inttypes.h stdint.h ctype.h math.h iconv.h signal.h libunwind.h)
   701       string(TOUPPER "HAVE_${_HEADER}" _UPPER)
   702       string(REPLACE "." "_" _HAVE_H ${_UPPER})
   703       check_include_file("${_HEADER}" ${_HAVE_H})
   704     endforeach()
   705 
   706     check_include_files("dlfcn.h;stdint.h;stddef.h;inttypes.h;stdlib.h;strings.h;string.h;float.h" STDC_HEADERS)
   707     check_type_size("size_t" SIZEOF_SIZE_T)
   708     check_symbol_exists(M_PI math.h HAVE_M_PI)
   709     # TODO: refine the mprotect check
   710     check_c_source_compiles("#include <sys/types.h>
   711                              #include <sys/mman.h>
   712                              int main() { }" HAVE_MPROTECT)
   713     foreach(_FN
   714             strtod malloc calloc realloc free getenv setenv putenv unsetenv
   715             qsort abs bcopy memset memcpy memmove memcmp strlen strlcpy strlcat
   716             _strrev _strupr _strlwr strchr strrchr strstr itoa _ltoa
   717             _uitoa _ultoa strtol strtoul _i64toa _ui64toa strtoll strtoull
   718             atoi atof strcmp strncmp _stricmp strcasecmp _strnicmp strncasecmp
   719             vsscanf vsnprintf fopen64 fseeko fseeko64 sigaction setjmp
   720             nanosleep sysconf sysctlbyname getauxval poll _Exit
   721             )
   722       string(TOUPPER ${_FN} _UPPER)
   723       set(_HAVEVAR "HAVE_${_UPPER}")
   724       check_function_exists("${_FN}" ${_HAVEVAR})
   725     endforeach()
   726 
   727     check_library_exists(m pow "" HAVE_LIBM)
   728     if(HAVE_LIBM)
   729       set(CMAKE_REQUIRED_LIBRARIES m)
   730       foreach(_FN
   731               atan atan2 ceil copysign cos cosf fabs floor log pow scalbn sin
   732               sinf sqrt sqrtf tan tanf acos asin)
   733         string(TOUPPER ${_FN} _UPPER)
   734         set(_HAVEVAR "HAVE_${_UPPER}")
   735         check_function_exists("${_FN}" ${_HAVEVAR})
   736       endforeach()
   737       set(CMAKE_REQUIRED_LIBRARIES)
   738       list(APPEND EXTRA_LIBS m)
   739     endif()
   740 
   741     check_library_exists(iconv iconv_open "" HAVE_LIBICONV)
   742     if(HAVE_LIBICONV)
   743       list(APPEND EXTRA_LIBS iconv)
   744       set(HAVE_ICONV 1)
   745     endif()
   746 
   747     if(NOT APPLE)
   748       check_include_file(alloca.h HAVE_ALLOCA_H)
   749       check_function_exists(alloca HAVE_ALLOCA)
   750     else()
   751       set(HAVE_ALLOCA_H 1)
   752       set(HAVE_ALLOCA 1)
   753     endif()
   754 
   755     check_struct_has_member("struct sigaction" "sa_sigaction" "signal.h" HAVE_SA_SIGACTION)
   756   endif()
   757 else()
   758   if(WINDOWS)
   759     set(HAVE_STDARG_H 1)
   760     set(HAVE_STDDEF_H 1)
   761   endif()
   762 endif()
   763 
   764 
   765 # Enable/disable various subsystems of the SDL library
   766 foreach(_SUB ${SDL_SUBSYSTEMS})
   767   string(TOUPPER ${_SUB} _OPT)
   768   if(NOT SDL_${_OPT})
   769     set(SDL_${_OPT}_DISABLED 1)
   770   endif()
   771 endforeach()
   772 if(SDL_JOYSTICK)
   773   file(GLOB JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/*.c)
   774   set(SOURCE_FILES ${SOURCE_FILES} ${JOYSTICK_SOURCES})
   775 endif()
   776 if(SDL_HAPTIC)
   777   if(NOT SDL_JOYSTICK)
   778     # Haptic requires some private functions from the joystick subsystem.
   779     message_error("SDL_HAPTIC requires SDL_JOYSTICK, which is not enabled")
   780   endif()
   781   file(GLOB HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/*.c)
   782   set(SOURCE_FILES ${SOURCE_FILES} ${HAPTIC_SOURCES})
   783 endif()
   784 if(SDL_SENSOR)
   785   file(GLOB SENSOR_SOURCES ${SDL2_SOURCE_DIR}/src/sensor/*.c)
   786   set(SOURCE_FILES ${SOURCE_FILES} ${SENSOR_SOURCES})
   787 endif()
   788 if(SDL_POWER)
   789   file(GLOB POWER_SOURCES ${SDL2_SOURCE_DIR}/src/power/*.c)
   790   set(SOURCE_FILES ${SOURCE_FILES} ${POWER_SOURCES})
   791 endif()
   792 # TODO: in configure.ac, the test for LOADSO and SDL_DLOPEN is a bit weird:
   793 # if LOADSO is not wanted, SDL_LOADSO_DISABLED is set
   794 # If however on Unix or APPLE dlopen() is detected via CheckDLOPEN(),
   795 # SDL_LOADSO_DISABLED will not be set, regardless of the LOADSO settings
   796 
   797 # General SDL subsystem options, valid for all platforms
   798 if(SDL_AUDIO)
   799   # CheckDummyAudio/CheckDiskAudio - valid for all platforms
   800   if(DUMMYAUDIO)
   801     set(SDL_AUDIO_DRIVER_DUMMY 1)
   802     file(GLOB DUMMYAUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/dummy/*.c)
   803     set(SOURCE_FILES ${SOURCE_FILES} ${DUMMYAUDIO_SOURCES})
   804     set(HAVE_DUMMYAUDIO TRUE)
   805   endif()
   806   if(DISKAUDIO)
   807     set(SDL_AUDIO_DRIVER_DISK 1)
   808     file(GLOB DISKAUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/disk/*.c)
   809     set(SOURCE_FILES ${SOURCE_FILES} ${DISKAUDIO_SOURCES})
   810     set(HAVE_DISKAUDIO TRUE)
   811   endif()
   812 endif()
   813 
   814 if(SDL_DLOPEN)
   815   # Relevant for Unix/Darwin only
   816   if(UNIX OR APPLE)
   817     CheckDLOPEN()
   818   endif()
   819 endif()
   820 
   821 if(SDL_VIDEO)
   822   if(VIDEO_DUMMY)
   823     set(SDL_VIDEO_DRIVER_DUMMY 1)
   824     file(GLOB VIDEO_DUMMY_SOURCES ${SDL2_SOURCE_DIR}/src/video/dummy/*.c)
   825     set(SOURCE_FILES ${SOURCE_FILES} ${VIDEO_DUMMY_SOURCES})
   826     set(HAVE_VIDEO_DUMMY TRUE)
   827     set(HAVE_SDL_VIDEO TRUE)
   828   endif()
   829 endif()
   830 
   831 if(ANDROID)
   832   file(GLOB ANDROID_CORE_SOURCES ${SDL2_SOURCE_DIR}/src/core/android/*.c)
   833   set(SOURCE_FILES ${SOURCE_FILES} ${ANDROID_CORE_SOURCES})
   834 
   835   # SDL_spinlock.c Needs to be compiled in ARM mode.
   836   # There seems to be no better way currently to set the ARM mode.
   837   # see: https://issuetracker.google.com/issues/62264618
   838   # Another option would be to set ARM mode to all compiled files
   839   check_c_compiler_flag(-marm HAVE_ARM_MODE)
   840   if(HAVE_ARM_MODE)
   841     set_source_files_properties(${SDL2_SOURCE_DIR}/src/atomic/SDL_spinlock.c PROPERTIES COMPILE_FLAGS -marm)
   842   endif()
   843 
   844   file(GLOB ANDROID_MAIN_SOURCES ${SDL2_SOURCE_DIR}/src/main/android/*.c)
   845   set(SDLMAIN_SOURCES ${SDLMAIN_SOURCES} ${ANDROID_MAIN_SOURCES})
   846 
   847   if(SDL_AUDIO)
   848     set(SDL_AUDIO_DRIVER_ANDROID 1)
   849     file(GLOB ANDROID_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/android/*.c)
   850     set(SOURCE_FILES ${SOURCE_FILES} ${ANDROID_AUDIO_SOURCES})
   851     set(HAVE_SDL_AUDIO TRUE)
   852   endif()
   853   if(SDL_FILESYSTEM)
   854     set(SDL_FILESYSTEM_ANDROID 1)
   855     file(GLOB ANDROID_FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/android/*.c)
   856     set(SOURCE_FILES ${SOURCE_FILES} ${ANDROID_FILESYSTEM_SOURCES})
   857     set(HAVE_SDL_FILESYSTEM TRUE)
   858   endif()
   859   if(SDL_HAPTIC)
   860     set(SDL_HAPTIC_ANDROID 1)
   861     file(GLOB ANDROID_HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/android/*.c)
   862     set(SOURCE_FILES ${SOURCE_FILES} ${ANDROID_HAPTIC_SOURCES})
   863     set(HAVE_SDL_HAPTIC TRUE)
   864   endif()
   865   if(SDL_JOYSTICK)
   866     set(SDL_JOYSTICK_ANDROID 1)
   867     file(GLOB ANDROID_JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/android/*.c ${SDL2_SOURCE_DIR}/src/joystick/steam/*.c)
   868     set(SOURCE_FILES ${SOURCE_FILES} ${ANDROID_JOYSTICK_SOURCES})
   869     set(HAVE_SDL_JOYSTICK TRUE)
   870   endif()
   871   if(SDL_LOADSO)
   872     set(SDL_LOADSO_DLOPEN 1)
   873     file(GLOB LOADSO_SOURCES ${SDL2_SOURCE_DIR}/src/loadso/dlopen/*.c)
   874     set(SOURCE_FILES ${SOURCE_FILES} ${LOADSO_SOURCES})
   875     set(HAVE_SDL_LOADSO TRUE)
   876   endif()
   877   if(SDL_POWER)
   878     set(SDL_POWER_ANDROID 1)
   879     file(GLOB ANDROID_POWER_SOURCES ${SDL2_SOURCE_DIR}/src/power/android/*.c)
   880     set(SOURCE_FILES ${SOURCE_FILES} ${ANDROID_POWER_SOURCES})
   881     set(HAVE_SDL_POWER TRUE)
   882   endif()
   883   if(SDL_TIMERS)
   884     set(SDL_TIMER_UNIX 1)
   885     file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/unix/*.c)
   886     set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES})
   887     set(HAVE_SDL_TIMERS TRUE)
   888   endif()
   889   if(SDL_SENSOR)
   890     set(SDL_SENSOR_ANDROID 1)
   891     set(HAVE_SDL_SENSORS TRUE)
   892     file(GLOB ANDROID_SENSOR_SOURCES ${SDL2_SOURCE_DIR}/src/sensor/android/*.c)
   893     set(SOURCE_FILES ${SOURCE_FILES} ${ANDROID_SENSOR_SOURCES})
   894   endif()
   895   if(SDL_VIDEO)
   896     set(SDL_VIDEO_DRIVER_ANDROID 1)
   897     file(GLOB ANDROID_VIDEO_SOURCES ${SDL2_SOURCE_DIR}/src/video/android/*.c)
   898     set(SOURCE_FILES ${SOURCE_FILES} ${ANDROID_VIDEO_SOURCES})
   899     set(HAVE_SDL_VIDEO TRUE)
   900 
   901     # Core stuff
   902     find_library(ANDROID_DL_LIBRARY dl)
   903     find_library(ANDROID_LOG_LIBRARY log)
   904     find_library(ANDROID_LIBRARY_LIBRARY android)
   905     list(APPEND EXTRA_LIBS ${ANDROID_DL_LIBRARY} ${ANDROID_LOG_LIBRARY} ${ANDROID_LIBRARY_LIBRARY})
   906     add_definitions(-DGL_GLEXT_PROTOTYPES)
   907 
   908     #enable gles
   909     if(VIDEO_OPENGLES)
   910       set(SDL_VIDEO_OPENGL_EGL 1)
   911       set(HAVE_VIDEO_OPENGLES TRUE)
   912       set(SDL_VIDEO_OPENGL_ES 1)
   913       set(SDL_VIDEO_RENDER_OGL_ES 1)
   914       set(SDL_VIDEO_OPENGL_ES2 1)
   915       set(SDL_VIDEO_RENDER_OGL_ES2 1)
   916 
   917       find_library(OpenGLES1_LIBRARY GLESv1_CM)
   918       find_library(OpenGLES2_LIBRARY GLESv2)
   919       list(APPEND EXTRA_LIBS ${OpenGLES1_LIBRARY} ${OpenGLES2_LIBRARY})
   920     endif()
   921 
   922     CHECK_C_SOURCE_COMPILES("
   923     #if defined(__ARM_ARCH) && __ARM_ARCH < 7
   924     #error Vulkan doesn't work on this configuration
   925     #endif
   926     int main()
   927     {
   928         return 0;
   929     }
   930     " VULKAN_PASSED_ANDROID_CHECKS)
   931     if(NOT VULKAN_PASSED_ANDROID_CHECKS)
   932       set(VIDEO_VULKAN OFF)
   933       message(STATUS "Vulkan doesn't work on this configuration")
   934     endif()
   935   endif()
   936 
   937   file(GLOB ANDROID_HIDAPI_SOURCES ${SDL2_SOURCE_DIR}/src/hidapi/android/*.cpp)
   938 
   939   CheckPTHREAD()
   940 
   941 endif()
   942 
   943 # Platform-specific options and settings
   944 if(EMSCRIPTEN)
   945   # Hide noisy warnings that intend to aid mostly during initial stages of porting a new
   946   # project. Uncomment at will for verbose cross-compiling -I/../ path info.
   947   add_definitions(-Wno-warn-absolute-paths)
   948   if(SDL_AUDIO)
   949     set(SDL_AUDIO_DRIVER_EMSCRIPTEN 1)
   950     file(GLOB EM_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/emscripten/*.c)
   951     set(SOURCE_FILES ${SOURCE_FILES} ${EM_AUDIO_SOURCES})
   952     set(HAVE_SDL_AUDIO TRUE)
   953   endif()
   954   if(SDL_FILESYSTEM)
   955     set(SDL_FILESYSTEM_EMSCRIPTEN 1)
   956     file(GLOB EM_FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/emscripten/*.c)
   957     set(SOURCE_FILES ${SOURCE_FILES} ${EM_FILESYSTEM_SOURCES})
   958     set(HAVE_SDL_FILESYSTEM TRUE)
   959   endif()
   960   if(SDL_JOYSTICK)
   961     set(SDL_JOYSTICK_EMSCRIPTEN 1)
   962     file(GLOB EM_JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/emscripten/*.c)
   963     set(SOURCE_FILES ${SOURCE_FILES} ${EM_JOYSTICK_SOURCES})
   964     set(HAVE_SDL_JOYSTICK TRUE)
   965   endif()
   966   if(SDL_POWER)
   967     set(SDL_POWER_EMSCRIPTEN 1)
   968     file(GLOB EM_POWER_SOURCES ${SDL2_SOURCE_DIR}/src/power/emscripten/*.c)
   969     set(SOURCE_FILES ${SOURCE_FILES} ${EM_POWER_SOURCES})
   970     set(HAVE_SDL_POWER TRUE)
   971   endif()
   972   if(SDL_TIMERS)
   973     set(SDL_TIMER_UNIX 1)
   974     file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/unix/*.c)
   975     set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES})
   976     set(HAVE_SDL_TIMERS TRUE)
   977 
   978     if(CLOCK_GETTIME)
   979       set(HAVE_CLOCK_GETTIME 1)
   980     endif()
   981   endif()
   982   if(SDL_VIDEO)
   983     set(SDL_VIDEO_DRIVER_EMSCRIPTEN 1)
   984     file(GLOB EM_VIDEO_SOURCES ${SDL2_SOURCE_DIR}/src/video/emscripten/*.c)
   985     set(SOURCE_FILES ${SOURCE_FILES} ${EM_VIDEO_SOURCES})
   986     set(HAVE_SDL_VIDEO TRUE)
   987 
   988     #enable gles
   989     if(VIDEO_OPENGLES)
   990       set(SDL_VIDEO_OPENGL_EGL 1)
   991       set(HAVE_VIDEO_OPENGLES TRUE)
   992       set(SDL_VIDEO_OPENGL_ES2 1)
   993       set(SDL_VIDEO_RENDER_OGL_ES2 1)
   994     endif()
   995   endif()
   996 elseif(UNIX AND NOT APPLE AND NOT ANDROID)
   997   if(SDL_AUDIO)
   998     if(SYSV5 OR SOLARIS OR HPUX)
   999         set(SDL_AUDIO_DRIVER_SUNAUDIO 1)
  1000         file(GLOB SUN_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/sun/*.c)
  1001         set(SOURCE_FILES ${SOURCE_FILES} ${SUN_AUDIO_SOURCES})
  1002         set(HAVE_SDL_AUDIO TRUE)
  1003     elseif(NETBSD)
  1004         set(SDL_AUDIO_DRIVER_NETBSD 1)
  1005         file(GLOB NETBSD_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/netbsd/*.c)
  1006         set(SOURCE_FILES ${SOURCE_FILES} ${NETBSD_AUDIO_SOURCES})
  1007         set(HAVE_SDL_AUDIO TRUE)
  1008     elseif(AIX)
  1009         set(SDL_AUDIO_DRIVER_PAUDIO 1)
  1010         file(GLOB AIX_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/paudio/*.c)
  1011         set(SOURCE_FILES ${SOURCE_FILES} ${AIX_AUDIO_SOURCES})
  1012         set(HAVE_SDL_AUDIO TRUE)
  1013     endif()
  1014     CheckOSS()
  1015     CheckALSA()
  1016     CheckJACK()
  1017     CheckPulseAudio()
  1018     CheckESD()
  1019     CheckARTS()
  1020     CheckNAS()
  1021     CheckSNDIO()
  1022     CheckFusionSound()
  1023     CheckLibSampleRate()
  1024   endif()
  1025 
  1026   if(SDL_VIDEO)
  1027     # Need to check for Raspberry PI first and add platform specific compiler flags, otherwise the test for GLES fails!
  1028     CheckRPI()
  1029     CheckX11()
  1030     CheckDirectFB()
  1031     CheckOpenGLX11()
  1032     CheckOpenGLESX11()
  1033     CheckWayland()
  1034     CheckVivante()
  1035     CheckKMSDRM()
  1036   endif()
  1037 
  1038   if(UNIX)
  1039     file(GLOB CORE_UNIX_SOURCES ${SDL2_SOURCE_DIR}/src/core/unix/*.c)
  1040     set(SOURCE_FILES ${SOURCE_FILES} ${CORE_UNIX_SOURCES})
  1041   endif()
  1042 
  1043   if(LINUX)
  1044     check_c_source_compiles("
  1045         #include <linux/input.h>
  1046         #ifndef EVIOCGNAME
  1047         #error EVIOCGNAME() ioctl not available
  1048         #endif
  1049         int main(int argc, char** argv) {}" HAVE_INPUT_EVENTS)
  1050 
  1051     check_c_source_compiles("
  1052         #include <linux/kd.h>
  1053         #include <linux/keyboard.h>
  1054 
  1055         int main(int argc, char **argv)
  1056         {
  1057             struct kbentry kbe;
  1058             kbe.kb_table = KG_CTRL;
  1059             ioctl(0, KDGKBENT, &kbe);
  1060         }" HAVE_INPUT_KD)
  1061 
  1062     file(GLOB CORE_LINUX_SOURCES ${SDL2_SOURCE_DIR}/src/core/linux/*.c)
  1063     set(SOURCE_FILES ${SOURCE_FILES} ${CORE_LINUX_SOURCES})
  1064 
  1065     if(HAVE_INPUT_EVENTS)
  1066       set(SDL_INPUT_LINUXEV 1)
  1067     endif()
  1068 
  1069     if(SDL_HAPTIC AND HAVE_INPUT_EVENTS)
  1070       set(SDL_HAPTIC_LINUX 1)
  1071       file(GLOB HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/linux/*.c)
  1072       set(SOURCE_FILES ${SOURCE_FILES} ${HAPTIC_SOURCES})
  1073       set(HAVE_SDL_HAPTIC TRUE)
  1074     endif()
  1075 
  1076     if(HAVE_INPUT_KD)
  1077       set(SDL_INPUT_LINUXKD 1)
  1078     endif()
  1079 
  1080     check_include_file("libudev.h" HAVE_LIBUDEV_H)
  1081 
  1082     if(PKG_CONFIG_FOUND)
  1083       pkg_search_module(DBUS dbus-1 dbus)
  1084       if(DBUS_FOUND)
  1085         set(HAVE_DBUS_DBUS_H TRUE)
  1086         include_directories(${DBUS_INCLUDE_DIRS})
  1087         list(APPEND EXTRA_LIBS ${DBUS_LIBRARIES})
  1088       endif()
  1089 
  1090       pkg_search_module(IBUS ibus-1.0 ibus)
  1091       if(IBUS_FOUND)
  1092         set(HAVE_IBUS_IBUS_H TRUE)
  1093         include_directories(${IBUS_INCLUDE_DIRS})
  1094         list(APPEND EXTRA_LIBS ${IBUS_LIBRARIES})
  1095       endif()
  1096       if(HAVE_LIBUNWIND_H)
  1097         # We've already found the header, so REQUIRE the lib to be present
  1098         pkg_search_module(UNWIND REQUIRED libunwind)
  1099         pkg_search_module(UNWIND_GENERIC REQUIRED libunwind-generic)
  1100         list(APPEND EXTRA_LIBS ${UNWIND_LIBRARIES} ${UNWIND_GENERIC_LIBRARIES})
  1101       endif()
  1102     endif()
  1103 
  1104     check_include_file("fcitx/frontend.h" HAVE_FCITX_FRONTEND_H)
  1105   endif()
  1106 
  1107   if(INPUT_TSLIB)
  1108     check_c_source_compiles("
  1109         #include \"tslib.h\"
  1110         int main(int argc, char** argv) { }" HAVE_INPUT_TSLIB)
  1111     if(HAVE_INPUT_TSLIB)
  1112       set(SDL_INPUT_TSLIB 1)
  1113       list(APPEND EXTRA_LIBS ts)
  1114     endif()
  1115   endif()
  1116 
  1117   if(SDL_JOYSTICK)
  1118     CheckUSBHID()   # seems to be BSD specific - limit the test to BSD only?
  1119     if(LINUX AND NOT ANDROID)
  1120       set(SDL_JOYSTICK_LINUX 1)
  1121       file(GLOB JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/linux/*.c ${SDL2_SOURCE_DIR}/src/joystick/steam/*.c)
  1122       set(SOURCE_FILES ${SOURCE_FILES} ${JOYSTICK_SOURCES})
  1123       set(HAVE_SDL_JOYSTICK TRUE)
  1124     endif()
  1125   endif()
  1126 
  1127   CheckPTHREAD()
  1128 
  1129   if(CLOCK_GETTIME)
  1130     check_library_exists(rt clock_gettime "" FOUND_CLOCK_GETTIME)
  1131     if(FOUND_CLOCK_GETTIME)
  1132       list(APPEND EXTRA_LIBS rt)
  1133       set(HAVE_CLOCK_GETTIME 1)
  1134     else()
  1135       check_library_exists(c clock_gettime "" FOUND_CLOCK_GETTIME)
  1136       if(FOUND_CLOCK_GETTIME)
  1137         set(HAVE_CLOCK_GETTIME 1)
  1138       endif()
  1139     endif()
  1140   endif()
  1141 
  1142   check_include_file(linux/version.h HAVE_LINUX_VERSION_H)
  1143   if(HAVE_LINUX_VERSION_H)
  1144     set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DHAVE_LINUX_VERSION_H")
  1145   endif()
  1146 
  1147   if(SDL_POWER)
  1148     if(LINUX)
  1149       set(SDL_POWER_LINUX 1)
  1150       file(GLOB POWER_SOURCES ${SDL2_SOURCE_DIR}/src/power/linux/*.c)
  1151       set(SOURCE_FILES ${SOURCE_FILES} ${POWER_SOURCES})
  1152       set(HAVE_SDL_POWER TRUE)
  1153     endif()
  1154   endif()
  1155 
  1156   if(SDL_FILESYSTEM)
  1157     set(SDL_FILESYSTEM_UNIX 1)
  1158     file(GLOB FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/unix/*.c)
  1159     set(SOURCE_FILES ${SOURCE_FILES} ${FILESYSTEM_SOURCES})
  1160     set(HAVE_SDL_FILESYSTEM TRUE)
  1161   endif()
  1162 
  1163   if(SDL_TIMERS)
  1164     set(SDL_TIMER_UNIX 1)
  1165     file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/unix/*.c)
  1166     set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES})
  1167     set(HAVE_SDL_TIMERS TRUE)
  1168   endif()
  1169 
  1170   if(RPATH)
  1171     set(SDL_RLD_FLAGS "")
  1172     if(BSDI OR FREEBSD OR LINUX OR NETBSD)
  1173       set(CMAKE_REQUIRED_FLAGS "-Wl,--enable-new-dtags")
  1174       check_c_compiler_flag("" HAVE_ENABLE_NEW_DTAGS)
  1175       set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS})
  1176       if(HAVE_ENABLE_NEW_DTAGS)
  1177         set(SDL_RLD_FLAGS "-Wl,-rpath,\${libdir} -Wl,--enable-new-dtags")
  1178       else()
  1179         set(SDL_RLD_FLAGS "-Wl,-rpath,\${libdir}")
  1180       endif()
  1181     elseif(SOLARIS)
  1182       set(SDL_RLD_FLAGS "-R\${libdir}")
  1183     endif()
  1184     set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)
  1185     set(HAVE_RPATH TRUE)
  1186   endif()
  1187 
  1188 elseif(WINDOWS)
  1189   find_program(WINDRES windres)
  1190 
  1191   check_c_source_compiles("
  1192     #include <windows.h>
  1193     int main(int argc, char **argv) { }" HAVE_WIN32_CC)
  1194 
  1195   file(GLOB CORE_SOURCES ${SDL2_SOURCE_DIR}/src/core/windows/*.c)
  1196   set(SOURCE_FILES ${SOURCE_FILES} ${CORE_SOURCES})
  1197 
  1198   if(MSVC)
  1199     # Prevent codegen that would use the VC runtime libraries.
  1200     set_property(DIRECTORY . APPEND PROPERTY COMPILE_OPTIONS "/GS-")
  1201     if(NOT ARCH_64)
  1202       set_property(DIRECTORY . APPEND PROPERTY COMPILE_OPTIONS "/arch:SSE")
  1203     endif()
  1204   endif()
  1205 
  1206   # Check for DirectX
  1207   if(DIRECTX)
  1208     if(DEFINED MSVC_VERSION AND NOT ${MSVC_VERSION} LESS 1700)
  1209         set(USE_WINSDK_DIRECTX TRUE)
  1210     endif()
  1211     if(NOT CMAKE_COMPILER_IS_MINGW AND NOT USE_WINSDK_DIRECTX)
  1212       if("$ENV{DXSDK_DIR}" STREQUAL "")
  1213         message_error("DIRECTX requires the \$DXSDK_DIR environment variable to be set")
  1214       endif()
  1215       set(CMAKE_REQUIRED_FLAGS "/I\"$ENV{DXSDK_DIR}\\Include\"")
  1216     endif()
  1217 
  1218     if(HAVE_WIN32_CC)
  1219       # xinput.h may need windows.h, but doesn't include it itself.
  1220       check_c_source_compiles("
  1221         #include <windows.h>
  1222         #include <xinput.h>
  1223         int main(int argc, char **argv) { }" HAVE_XINPUT_H)
  1224       check_c_source_compiles("
  1225         #include <windows.h>
  1226         #include <xinput.h>
  1227         XINPUT_GAMEPAD_EX x1;
  1228         int main(int argc, char **argv) { }" HAVE_XINPUT_GAMEPAD_EX)
  1229       check_c_source_compiles("
  1230         #include <windows.h>
  1231         #include <xinput.h>
  1232         XINPUT_STATE_EX s1;
  1233         int main(int argc, char **argv) { }" HAVE_XINPUT_STATE_EX)
  1234     else()
  1235       check_include_file(xinput.h HAVE_XINPUT_H)
  1236     endif()
  1237 
  1238     check_include_file(d3d9.h HAVE_D3D_H)
  1239     check_include_file(d3d11_1.h HAVE_D3D11_H)
  1240     check_include_file(ddraw.h HAVE_DDRAW_H)
  1241     check_include_file(dsound.h HAVE_DSOUND_H)
  1242     check_include_file(dinput.h HAVE_DINPUT_H)
  1243     check_include_file(dxgi.h HAVE_DXGI_H)
  1244     if(HAVE_D3D_H OR HAVE_D3D11_H OR HAVE_DDRAW_H OR HAVE_DSOUND_H OR HAVE_DINPUT_H)
  1245       set(HAVE_DIRECTX TRUE)
  1246       if(NOT CMAKE_COMPILER_IS_MINGW AND NOT USE_WINSDK_DIRECTX)
  1247       # TODO: change $ENV{DXSDL_DIR} to get the path from the include checks
  1248         link_directories($ENV{DXSDK_DIR}\\lib\\${PROCESSOR_ARCH})
  1249         include_directories($ENV{DXSDK_DIR}\\Include)
  1250       endif()
  1251     endif()
  1252     set(CMAKE_REQUIRED_FLAGS ${ORIG_CMAKE_REQUIRED_FLAGS})
  1253   endif()
  1254 
  1255   # headers needed elsewhere ...
  1256   check_include_file(mmdeviceapi.h HAVE_MMDEVICEAPI_H)
  1257   check_include_file(audioclient.h HAVE_AUDIOCLIENT_H)
  1258   check_include_file(endpointvolume.h HAVE_ENDPOINTVOLUME_H)
  1259 
  1260   if(SDL_AUDIO)
  1261     set(SDL_AUDIO_DRIVER_WINMM 1)
  1262     file(GLOB WINMM_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/winmm/*.c)
  1263     set(SOURCE_FILES ${SOURCE_FILES} ${WINMM_AUDIO_SOURCES})
  1264     set(HAVE_SDL_AUDIO TRUE)
  1265 
  1266     if(HAVE_DSOUND_H)
  1267       set(SDL_AUDIO_DRIVER_DSOUND 1)
  1268       file(GLOB DSOUND_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/directsound/*.c)
  1269       set(SOURCE_FILES ${SOURCE_FILES} ${DSOUND_AUDIO_SOURCES})
  1270     endif()
  1271 
  1272     if(WASAPI AND HAVE_AUDIOCLIENT_H AND HAVE_MMDEVICEAPI_H)
  1273       set(SDL_AUDIO_DRIVER_WASAPI 1)
  1274       file(GLOB WASAPI_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/wasapi/*.c)
  1275       set(SOURCE_FILES ${SOURCE_FILES} ${WASAPI_AUDIO_SOURCES})
  1276     endif()
  1277   endif()
  1278 
  1279   if(SDL_VIDEO)
  1280     # requires SDL_LOADSO on Windows (IME, DX, etc.)
  1281     if(NOT SDL_LOADSO)
  1282       message_error("SDL_VIDEO requires SDL_LOADSO, which is not enabled")
  1283     endif()
  1284     set(SDL_VIDEO_DRIVER_WINDOWS 1)
  1285     file(GLOB WIN_VIDEO_SOURCES ${SDL2_SOURCE_DIR}/src/video/windows/*.c)
  1286     set(SOURCE_FILES ${SOURCE_FILES} ${WIN_VIDEO_SOURCES})
  1287 
  1288     if(RENDER_D3D AND HAVE_D3D_H)
  1289       set(SDL_VIDEO_RENDER_D3D 1)
  1290       set(HAVE_RENDER_D3D TRUE)
  1291     endif()
  1292     if(RENDER_D3D AND HAVE_D3D11_H)
  1293       set(SDL_VIDEO_RENDER_D3D11 1)
  1294       set(HAVE_RENDER_D3D TRUE)
  1295     endif()
  1296     set(HAVE_SDL_VIDEO TRUE)
  1297   endif()
  1298 
  1299   if(SDL_THREADS)
  1300     set(SDL_THREAD_WINDOWS 1)
  1301     set(SOURCE_FILES ${SOURCE_FILES}
  1302       ${SDL2_SOURCE_DIR}/src/thread/windows/SDL_sysmutex.c
  1303       ${SDL2_SOURCE_DIR}/src/thread/windows/SDL_syssem.c
  1304       ${SDL2_SOURCE_DIR}/src/thread/windows/SDL_systhread.c
  1305       ${SDL2_SOURCE_DIR}/src/thread/windows/SDL_systls.c
  1306       ${SDL2_SOURCE_DIR}/src/thread/generic/SDL_syscond.c)
  1307     set(HAVE_SDL_THREADS TRUE)
  1308   endif()
  1309 
  1310   if(SDL_POWER)
  1311     set(SDL_POWER_WINDOWS 1)
  1312     set(SOURCE_FILES ${SOURCE_FILES} ${SDL2_SOURCE_DIR}/src/power/windows/SDL_syspower.c)
  1313     set(HAVE_SDL_POWER TRUE)
  1314   endif()
  1315 
  1316   if(SDL_FILESYSTEM)
  1317     set(SDL_FILESYSTEM_WINDOWS 1)
  1318     file(GLOB FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/windows/*.c)
  1319     set(SOURCE_FILES ${SOURCE_FILES} ${FILESYSTEM_SOURCES})
  1320     set(HAVE_SDL_FILESYSTEM TRUE)
  1321   endif()
  1322 
  1323   # Libraries for Win32 native and MinGW
  1324   list(APPEND EXTRA_LIBS user32 gdi32 winmm imm32 ole32 oleaut32 version uuid advapi32 shell32)
  1325 
  1326   # TODO: in configure.ac the check for timers is set on
  1327   # cygwin | mingw32* - does this include mingw32CE?
  1328   if(SDL_TIMERS)
  1329     set(SDL_TIMER_WINDOWS 1)
  1330     file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/windows/*.c)
  1331     set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES})
  1332     set(HAVE_SDL_TIMERS TRUE)
  1333   endif()
  1334 
  1335   if(SDL_LOADSO)
  1336     set(SDL_LOADSO_WINDOWS 1)
  1337     file(GLOB LOADSO_SOURCES ${SDL2_SOURCE_DIR}/src/loadso/windows/*.c)
  1338     set(SOURCE_FILES ${SOURCE_FILES} ${LOADSO_SOURCES})
  1339     set(HAVE_SDL_LOADSO TRUE)
  1340   endif()
  1341 
  1342   file(GLOB CORE_SOURCES ${SDL2_SOURCE_DIR}/src/core/windows/*.c)
  1343   set(SOURCE_FILES ${SOURCE_FILES} ${CORE_SOURCES})
  1344 
  1345   if(SDL_VIDEO)
  1346     if(VIDEO_OPENGL)
  1347       set(SDL_VIDEO_OPENGL 1)
  1348       set(SDL_VIDEO_OPENGL_WGL 1)
  1349       set(SDL_VIDEO_RENDER_OGL 1)
  1350       set(HAVE_VIDEO_OPENGL TRUE)
  1351     endif()
  1352 
  1353     if(VIDEO_OPENGLES)
  1354       set(SDL_VIDEO_OPENGL_EGL 1)
  1355       set(SDL_VIDEO_OPENGL_ES2 1)
  1356       set(SDL_VIDEO_RENDER_OGL_ES2 1)
  1357       set(HAVE_VIDEO_OPENGLES TRUE)
  1358     endif()
  1359   endif()
  1360 
  1361   if(SDL_JOYSTICK)
  1362     file(GLOB JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/windows/*.c)
  1363     set(SOURCE_FILES ${SOURCE_FILES} ${JOYSTICK_SOURCES})
  1364     if(HAVE_DINPUT_H)
  1365       set(SDL_JOYSTICK_DINPUT 1)
  1366       list(APPEND EXTRA_LIBS dinput8)
  1367       if(CMAKE_COMPILER_IS_MINGW)
  1368         list(APPEND EXTRA_LIBS dxerr8)
  1369       elseif (NOT USE_WINSDK_DIRECTX)
  1370         list(APPEND EXTRA_LIBS dxerr)
  1371       endif()
  1372     endif()
  1373     if(HAVE_XINPUT_H)
  1374       set(SDL_JOYSTICK_XINPUT 1)
  1375     endif()
  1376     if(NOT HAVE_DINPUT_H AND NOT HAVE_XINPUT_H)
  1377       set(SDL_JOYSTICK_WINMM 1)
  1378     endif()
  1379     set(HAVE_SDL_JOYSTICK TRUE)
  1380 
  1381     if(SDL_HAPTIC)
  1382       if(HAVE_DINPUT_H OR HAVE_XINPUT_H)
  1383         file(GLOB HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/windows/*.c)
  1384         if(HAVE_DINPUT_H)
  1385           set(SDL_HAPTIC_DINPUT 1)
  1386         endif()
  1387         if(HAVE_XINPUT_H)
  1388           set(SDL_HAPTIC_XINPUT 1)
  1389         endif()
  1390       else()
  1391         file(GLOB HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/dummy/*.c)
  1392         set(SDL_HAPTIC_DUMMY 1)
  1393       endif()
  1394       set(SOURCE_FILES ${SOURCE_FILES} ${HAPTIC_SOURCES})
  1395       set(HAVE_SDL_HAPTIC TRUE)
  1396     endif()
  1397   endif()
  1398 
  1399   file(GLOB VERSION_SOURCES ${SDL2_SOURCE_DIR}/src/main/windows/*.rc)
  1400   file(GLOB SDLMAIN_SOURCES ${SDL2_SOURCE_DIR}/src/main/windows/*.c)
  1401   if(MINGW OR CYGWIN)
  1402     list(APPEND EXTRA_LIBS mingw32)
  1403     list(APPEND EXTRA_LDFLAGS "-mwindows")
  1404     set(SDL_CFLAGS "${SDL_CFLAGS} -Dmain=SDL_main")
  1405     list(APPEND SDL_LIBS "-lmingw32" "-lSDL2main" "-mwindows")
  1406   endif()
  1407 elseif(APPLE)
  1408   # TODO: rework this all for proper MacOS X, iOS and Darwin support
  1409 
  1410   # We always need these libs on macOS at the moment.
  1411   # !!! FIXME: we need Carbon for some very old API calls in
  1412   # !!! FIXME:  src/video/cocoa/SDL_cocoakeyboard.c, but we should figure out
  1413   # !!! FIXME:  how to dump those.
  1414   if(NOT IOS)
  1415     set(SDL_FRAMEWORK_COCOA 1)
  1416     set(SDL_FRAMEWORK_CARBON 1)
  1417   endif()
  1418 
  1419   # Requires the darwin file implementation
  1420   if(SDL_FILE)
  1421     file(GLOB EXTRA_SOURCES ${SDL2_SOURCE_DIR}/src/file/cocoa/*.m)
  1422     set(SOURCE_FILES ${EXTRA_SOURCES} ${SOURCE_FILES})
  1423     # !!! FIXME: modern CMake doesn't need "LANGUAGE C" for Objective-C.
  1424     set_source_files_properties(${EXTRA_SOURCES} PROPERTIES LANGUAGE C)
  1425     set(HAVE_SDL_FILE TRUE)
  1426     # !!! FIXME: why is COREVIDEO inside this if() block?
  1427     set(SDL_FRAMEWORK_COREVIDEO 1)
  1428   else()
  1429     message_error("SDL_FILE must be enabled to build on MacOS X")
  1430   endif()
  1431 
  1432   if(SDL_AUDIO)
  1433     set(SDL_AUDIO_DRIVER_COREAUDIO 1)
  1434     file(GLOB AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/coreaudio/*.m)
  1435     # !!! FIXME: modern CMake doesn't need "LANGUAGE C" for Objective-C.
  1436     set_source_files_properties(${AUDIO_SOURCES} PROPERTIES LANGUAGE C)
  1437     set(SOURCE_FILES ${SOURCE_FILES} ${AUDIO_SOURCES})
  1438     set(HAVE_SDL_AUDIO TRUE)
  1439     set(SDL_FRAMEWORK_COREAUDIO 1)
  1440     set(SDL_FRAMEWORK_AUDIOTOOLBOX 1)
  1441   endif()
  1442 
  1443   if(SDL_JOYSTICK)
  1444     set(SDL_JOYSTICK_IOKIT 1)
  1445     if (IOS)
  1446       file(GLOB JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/iphoneos/*.m ${SDL2_SOURCE_DIR}/src/joystick/steam/*.c)
  1447     else()
  1448       file(GLOB JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/darwin/*.c)
  1449     endif()
  1450     set(SOURCE_FILES ${SOURCE_FILES} ${JOYSTICK_SOURCES})
  1451     set(HAVE_SDL_JOYSTICK TRUE)
  1452     set(SDL_FRAMEWORK_IOKIT 1)
  1453     set(SDL_FRAMEWORK_FF 1)
  1454   endif()
  1455 
  1456   if(SDL_HAPTIC)
  1457     set(SDL_HAPTIC_IOKIT 1)
  1458     if (IOS)
  1459       file(GLOB HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/dummy/*.c)
  1460       set(SDL_HAPTIC_DUMMY 1)
  1461     else()
  1462       file(GLOB HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/darwin/*.c)
  1463     endif()
  1464     set(SOURCE_FILES ${SOURCE_FILES} ${HAPTIC_SOURCES})
  1465     set(HAVE_SDL_HAPTIC TRUE)
  1466     set(SDL_FRAMEWORK_IOKIT 1)
  1467     set(SDL_FRAMEWORK_FF 1)
  1468     if(NOT SDL_JOYSTICK)
  1469       message(FATAL_ERROR "SDL_HAPTIC requires SDL_JOYSTICK to be enabled")
  1470     endif()
  1471   endif()
  1472 
  1473   if(SDL_POWER)
  1474     set(SDL_POWER_MACOSX 1)
  1475     if (IOS)
  1476       file(GLOB POWER_SOURCES ${SDL2_SOURCE_DIR}/src/power/uikit/*.m)
  1477     else()
  1478       file(GLOB POWER_SOURCES ${SDL2_SOURCE_DIR}/src/power/macosx/*.c)
  1479     endif()
  1480     set(SOURCE_FILES ${SOURCE_FILES} ${POWER_SOURCES})
  1481     set(HAVE_SDL_POWER TRUE)
  1482     set(SDL_FRAMEWORK_IOKIT 1)
  1483   endif()
  1484 
  1485   if(SDL_TIMERS)
  1486     set(SDL_TIMER_UNIX 1)
  1487     file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/unix/*.c)
  1488     set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES})
  1489     set(HAVE_SDL_TIMERS TRUE)
  1490   endif(SDL_TIMERS)
  1491 
  1492   if(SDL_FILESYSTEM)
  1493     set(SDL_FILESYSTEM_COCOA 1)
  1494     file(GLOB FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/cocoa/*.m)
  1495     # !!! FIXME: modern CMake doesn't need "LANGUAGE C" for Objective-C.
  1496     set_source_files_properties(${FILESYSTEM_SOURCES} PROPERTIES LANGUAGE C)
  1497     set(SOURCE_FILES ${SOURCE_FILES} ${FILESYSTEM_SOURCES})
  1498     set(HAVE_SDL_FILESYSTEM TRUE)
  1499   endif()
  1500 
  1501   # Actually load the frameworks at the end so we don't duplicate include.
  1502   if(SDL_FRAMEWORK_COREVIDEO)
  1503     find_library(COREVIDEO CoreVideo)
  1504     list(APPEND EXTRA_LIBS ${COREVIDEO})
  1505   endif()
  1506   if(SDL_FRAMEWORK_COCOA)
  1507     find_library(COCOA_LIBRARY Cocoa)
  1508     list(APPEND EXTRA_LIBS ${COCOA_LIBRARY})
  1509   endif()
  1510   if(SDL_FRAMEWORK_IOKIT)
  1511     find_library(IOKIT IOKit)
  1512     list(APPEND EXTRA_LIBS ${IOKIT})
  1513   endif()
  1514   if(SDL_FRAMEWORK_FF)
  1515     find_library(FORCEFEEDBACK ForceFeedback)
  1516     list(APPEND EXTRA_LIBS ${FORCEFEEDBACK})
  1517   endif()
  1518   if(SDL_FRAMEWORK_CARBON)
  1519     find_library(CARBON_LIBRARY Carbon)
  1520     list(APPEND EXTRA_LIBS ${CARBON_LIBRARY})
  1521   endif()
  1522   if(SDL_FRAMEWORK_COREAUDIO)
  1523     find_library(COREAUDIO CoreAudio)
  1524     list(APPEND EXTRA_LIBS ${COREAUDIO})
  1525   endif()
  1526   if(SDL_FRAMEWORK_AUDIOTOOLBOX)
  1527     find_library(AUDIOTOOLBOX AudioToolbox)
  1528     list(APPEND EXTRA_LIBS ${AUDIOTOOLBOX})
  1529   endif()
  1530 
  1531   # iOS hack needed - http://code.google.com/p/ios-cmake/ ?
  1532   if(SDL_VIDEO)
  1533     if (IOS)
  1534       set(SDL_VIDEO_DRIVER_UIKIT 1)
  1535       file(GLOB UIKITVIDEO_SOURCES ${SDL2_SOURCE_DIR}/src/video/uikit/*.m)
  1536       set(SOURCE_FILES ${SOURCE_FILES} ${UIKITVIDEO_SOURCES})
  1537     else()
  1538       CheckCOCOA()
  1539       if(VIDEO_OPENGL)
  1540         set(SDL_VIDEO_OPENGL 1)
  1541         set(SDL_VIDEO_OPENGL_CGL 1)
  1542         set(SDL_VIDEO_RENDER_OGL 1)
  1543         set(HAVE_VIDEO_OPENGL TRUE)
  1544       endif()
  1545 
  1546       if(VIDEO_OPENGLES)
  1547         set(SDL_VIDEO_OPENGL_EGL 1)
  1548         set(SDL_VIDEO_OPENGL_ES2 1)
  1549         set(SDL_VIDEO_RENDER_OGL_ES2 1)
  1550         set(HAVE_VIDEO_OPENGLES TRUE)
  1551       endif()
  1552     endif()
  1553   endif()
  1554 
  1555   CheckPTHREAD()
  1556 elseif(HAIKU)
  1557   if(SDL_VIDEO)
  1558     set(SDL_VIDEO_DRIVER_HAIKU 1)
  1559     file(GLOB HAIKUVIDEO_SOURCES ${SDL2_SOURCE_DIR}/src/video/haiku/*.c)
  1560     set(SOURCE_FILES ${SOURCE_FILES} ${HAIKUVIDEO_SOURCES})
  1561     set(HAVE_SDL_VIDEO TRUE)
  1562 
  1563     set(SDL_FILESYSTEM_HAIKU 1)
  1564     file(GLOB FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/haiku/*.cc)
  1565     set(SOURCE_FILES ${SOURCE_FILES} ${FILESYSTEM_SOURCES})
  1566     set(HAVE_SDL_FILESYSTEM TRUE)
  1567 
  1568     if(SDL_TIMERS)
  1569       set(SDL_TIMER_HAIKU 1)
  1570       file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/haiku/*.c)
  1571       set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES})
  1572       set(HAVE_SDL_TIMERS TRUE)
  1573     endif(SDL_TIMERS)
  1574 
  1575     if(VIDEO_OPENGL)
  1576       # TODO: Use FIND_PACKAGE(OpenGL) instead
  1577       set(SDL_VIDEO_OPENGL 1)
  1578       set(SDL_VIDEO_OPENGL_BGL 1)
  1579       set(SDL_VIDEO_RENDER_OGL 1)
  1580       list(APPEND EXTRA_LIBS GL)
  1581       set(HAVE_VIDEO_OPENGL TRUE)
  1582     endif()
  1583   endif()
  1584 
  1585   CheckPTHREAD()
  1586 endif()
  1587 
  1588 if(VIDEO_VULKAN)
  1589   set(SDL_VIDEO_VULKAN 1)
  1590   set(HAVE_VIDEO_VULKAN TRUE)
  1591 endif()
  1592 
  1593 # Dummies
  1594 # configure.ac does it differently:
  1595 # if not have X
  1596 #   if enable_X {  SDL_X_DISABLED = 1 }
  1597 #   [add dummy sources]
  1598 # so it always adds a dummy, without checking, if it was actually requested.
  1599 # This leads to missing internal references on building, since the
  1600 # src/X/*.c does not get included.
  1601 if(NOT HAVE_SDL_JOYSTICK)
  1602   set(SDL_JOYSTICK_DUMMY 1)
  1603   if(SDL_JOYSTICK AND NOT APPLE) # results in unresolved symbols on OSX
  1604 
  1605     file(GLOB JOYSTICK_SOURCES ${SDL2_SOURCE_DIR}/src/joystick/dummy/*.c)
  1606     set(SOURCE_FILES ${SOURCE_FILES} ${JOYSTICK_SOURCES})
  1607   endif()
  1608 endif()
  1609 if(NOT HAVE_SDL_HAPTIC)
  1610   set(SDL_HAPTIC_DUMMY 1)
  1611   file(GLOB HAPTIC_SOURCES ${SDL2_SOURCE_DIR}/src/haptic/dummy/*.c)
  1612   set(SOURCE_FILES ${SOURCE_FILES} ${HAPTIC_SOURCES})
  1613 endif()
  1614 if(NOT HAVE_SDL_SENSORS)
  1615   set(SDL_SENSOR_DUMMY 1)
  1616   file(GLOB SENSORS_SOURCES ${SDL2_SOURCE_DIR}/src/sensor/dummy/*.c)
  1617   set(SOURCE_FILES ${SOURCE_FILES} ${SENSORS_SOURCES})
  1618 endif()
  1619 if(NOT HAVE_SDL_LOADSO)
  1620   set(SDL_LOADSO_DISABLED 1)
  1621   file(GLOB LOADSO_SOURCES ${SDL2_SOURCE_DIR}/src/loadso/dummy/*.c)
  1622   set(SOURCE_FILES ${SOURCE_FILES} ${LOADSO_SOURCES})
  1623 endif()
  1624 if(NOT HAVE_SDL_FILESYSTEM)
  1625   set(SDL_FILESYSTEM_DISABLED 1)
  1626   file(GLOB FILESYSTEM_SOURCES ${SDL2_SOURCE_DIR}/src/filesystem/dummy/*.c)
  1627   set(SOURCE_FILES ${SOURCE_FILES} ${FILESYSTEM_SOURCES})
  1628 endif()
  1629 
  1630 # We always need to have threads and timers around
  1631 if(NOT HAVE_SDL_THREADS)
  1632   set(SDL_THREADS_DISABLED 1)
  1633   file(GLOB THREADS_SOURCES ${SDL2_SOURCE_DIR}/src/thread/generic/*.c)
  1634   set(SOURCE_FILES ${SOURCE_FILES} ${THREADS_SOURCES})
  1635 endif()
  1636 if(NOT HAVE_SDL_TIMERS)
  1637   set(SDL_TIMERS_DISABLED 1)
  1638   file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/dummy/*.c)
  1639   set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES})
  1640 endif()
  1641 
  1642 if(NOT SDLMAIN_SOURCES)
  1643   file(GLOB SDLMAIN_SOURCES ${SDL2_SOURCE_DIR}/src/main/dummy/*.c)
  1644 endif()
  1645 
  1646 # Append the -MMD -MT flags
  1647 # if(DEPENDENCY_TRACKING)
  1648 #   if(COMPILER_IS_GNUCC)
  1649 #     set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -MMD -MT \$@")
  1650 #   endif()
  1651 # endif()
  1652 
  1653 configure_file("${SDL2_SOURCE_DIR}/include/SDL_config.h.cmake"
  1654   "${SDL2_BINARY_DIR}/include/SDL_config.h")
  1655 
  1656 # Prepare the flags and remove duplicates
  1657 if(EXTRA_LDFLAGS)
  1658   list(REMOVE_DUPLICATES EXTRA_LDFLAGS)
  1659 endif()
  1660 if(EXTRA_LIBS)
  1661   list(REMOVE_DUPLICATES EXTRA_LIBS)
  1662 endif()
  1663 if(EXTRA_CFLAGS)
  1664   list(REMOVE_DUPLICATES EXTRA_CFLAGS)
  1665 endif()
  1666 listtostr(EXTRA_CFLAGS _EXTRA_CFLAGS)
  1667 set(EXTRA_CFLAGS ${_EXTRA_CFLAGS})
  1668 
  1669 # Compat helpers for the configuration files
  1670 if(NOT WINDOWS OR CYGWIN)
  1671   # TODO: we need a Windows script, too
  1672   execute_process(COMMAND sh ${SDL2_SOURCE_DIR}/build-scripts/updaterev.sh)
  1673 
  1674   set(prefix ${CMAKE_INSTALL_PREFIX})
  1675   set(exec_prefix "\${prefix}")
  1676   set(libdir "\${exec_prefix}/lib${LIB_SUFFIX}")
  1677   set(bindir "\${exec_prefix}/bin")
  1678   set(includedir "\${prefix}/include")
  1679   if(SDL_STATIC)
  1680     set(ENABLE_STATIC_TRUE "")
  1681     set(ENABLE_STATIC_FALSE "#")
  1682   else()
  1683     set(ENABLE_STATIC_TRUE "#")
  1684     set(ENABLE_STATIC_FALSE "")
  1685   endif()
  1686   if(SDL_SHARED)
  1687     set(ENABLE_SHARED_TRUE "")
  1688     set(ENABLE_SHARED_FALSE "#")
  1689   else()
  1690     set(ENABLE_SHARED_TRUE "#")
  1691     set(ENABLE_SHARED_FALSE "")
  1692   endif()
  1693 
  1694   # Clean up the different lists
  1695   listtostr(EXTRA_LIBS _EXTRA_LIBS "-l")
  1696   set(SDL_STATIC_LIBS ${SDL_LIBS} ${EXTRA_LDFLAGS} ${_EXTRA_LIBS})
  1697   list(REMOVE_DUPLICATES SDL_STATIC_LIBS)
  1698   listtostr(SDL_STATIC_LIBS _SDL_STATIC_LIBS)
  1699   set(SDL_STATIC_LIBS ${_SDL_STATIC_LIBS})
  1700   listtostr(SDL_LIBS _SDL_LIBS)
  1701   set(SDL_LIBS ${_SDL_LIBS})
  1702 
  1703   # MESSAGE(STATUS "SDL_LIBS: ${SDL_LIBS}")
  1704   # MESSAGE(STATUS "SDL_STATIC_LIBS: ${SDL_STATIC_LIBS}")
  1705 
  1706   configure_file("${SDL2_SOURCE_DIR}/sdl2.pc.in"
  1707     "${SDL2_BINARY_DIR}/sdl2.pc" @ONLY)
  1708   configure_file("${SDL2_SOURCE_DIR}/sdl2-config.in"
  1709     "${SDL2_BINARY_DIR}/sdl2-config")
  1710   configure_file("${SDL2_SOURCE_DIR}/sdl2-config.in"
  1711     "${SDL2_BINARY_DIR}/sdl2-config" @ONLY)
  1712   configure_file("${SDL2_SOURCE_DIR}/SDL2.spec.in"
  1713     "${SDL2_BINARY_DIR}/SDL2.spec" @ONLY)
  1714 endif()
  1715 
  1716 ##### Info output #####
  1717 message(STATUS "")
  1718 message(STATUS "SDL2 was configured with the following options:")
  1719 message(STATUS "")
  1720 message(STATUS "Platform: ${CMAKE_SYSTEM}")
  1721 message(STATUS "64-bit:   ${ARCH_64}")
  1722 message(STATUS "Compiler: ${CMAKE_C_COMPILER}")
  1723 message(STATUS "")
  1724 message(STATUS "Subsystems:")
  1725 foreach(_SUB ${SDL_SUBSYSTEMS})
  1726   string(TOUPPER ${_SUB} _OPT)
  1727   message_bool_option(${_SUB} SDL_${_OPT})
  1728 endforeach()
  1729 message(STATUS "")
  1730 message(STATUS "Options:")
  1731 list(SORT ALLOPTIONS)
  1732 foreach(_OPT ${ALLOPTIONS})
  1733   # Longest option is VIDEO_X11_XSCREENSAVER = 22 characters
  1734   # Get the padding
  1735   string(LENGTH ${_OPT} _OPTLEN)
  1736   math(EXPR _PADLEN "23 - ${_OPTLEN}")
  1737   string(RANDOM LENGTH ${_PADLEN} ALPHABET " " _PADDING)
  1738   message_tested_option(${_OPT} ${_PADDING})
  1739 endforeach()
  1740 message(STATUS "")
  1741 message(STATUS " CFLAGS:        ${CMAKE_C_FLAGS}")
  1742 message(STATUS " EXTRA_CFLAGS:  ${EXTRA_CFLAGS}")
  1743 message(STATUS " EXTRA_LDFLAGS: ${EXTRA_LDFLAGS}")
  1744 message(STATUS " EXTRA_LIBS:    ${EXTRA_LIBS}")
  1745 message(STATUS "")
  1746 message(STATUS " Build Shared Library: ${SDL_SHARED}")
  1747 message(STATUS " Build Static Library: ${SDL_STATIC}")
  1748 if(SDL_STATIC)
  1749     message(STATUS " Build Static Library with Position Independent Code: ${SDL_STATIC_PIC}")
  1750 endif()
  1751 message(STATUS "")
  1752 if(UNIX)
  1753   message(STATUS "If something was not detected, although the libraries")
  1754   message(STATUS "were installed, then make sure you have set the")
  1755   message(STATUS "CFLAGS and LDFLAGS environment variables correctly.")
  1756   message(STATUS "")
  1757 endif()
  1758 
  1759 # Ensure that the extra cflags are used at compile time
  1760 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS}")
  1761 
  1762 # Always build SDLmain
  1763 add_library(SDL2main STATIC ${SDLMAIN_SOURCES})
  1764 target_include_directories(SDL2main PUBLIC "$<BUILD_INTERFACE:${SDL2_SOURCE_DIR}/include>" $<INSTALL_INTERFACE:include/SDL2>)
  1765 set(_INSTALL_LIBS "SDL2main")
  1766 if (NOT ANDROID)
  1767   set_target_properties(SDL2main PROPERTIES DEBUG_POSTFIX ${SDL_CMAKE_DEBUG_POSTFIX})
  1768 endif()
  1769 
  1770 if(SDL_SHARED)
  1771   add_library(SDL2 SHARED ${SOURCE_FILES} ${VERSION_SOURCES})
  1772   if(APPLE)
  1773     set_target_properties(SDL2 PROPERTIES
  1774       MACOSX_RPATH 1
  1775       OUTPUT_NAME "SDL2-${LT_RELEASE}")
  1776   elseif(UNIX AND NOT ANDROID)
  1777     set_target_properties(SDL2 PROPERTIES
  1778       VERSION ${LT_VERSION}
  1779       SOVERSION ${LT_REVISION}
  1780       OUTPUT_NAME "SDL2-${LT_RELEASE}")
  1781   else()
  1782     set_target_properties(SDL2 PROPERTIES
  1783       VERSION ${SDL_VERSION}
  1784       SOVERSION ${LT_REVISION}
  1785       OUTPUT_NAME "SDL2")
  1786   endif()
  1787   if(MSVC AND NOT LIBC)
  1788     # Don't try to link with the default set of libraries.
  1789     set_target_properties(SDL2 PROPERTIES LINK_FLAGS_RELEASE "/NODEFAULTLIB")
  1790     set_target_properties(SDL2 PROPERTIES LINK_FLAGS_DEBUG "/NODEFAULTLIB")
  1791     set_target_properties(SDL2 PROPERTIES STATIC_LIBRARY_FLAGS "/NODEFAULTLIB")
  1792   endif()
  1793   set(_INSTALL_LIBS "SDL2" ${_INSTALL_LIBS})
  1794   target_link_libraries(SDL2 ${EXTRA_LIBS} ${EXTRA_LDFLAGS})
  1795   target_include_directories(SDL2 PUBLIC "$<BUILD_INTERFACE:${SDL2_SOURCE_DIR}/include>" $<INSTALL_INTERFACE:include/SDL2>)
  1796   if (NOT ANDROID)
  1797     set_target_properties(SDL2 PROPERTIES DEBUG_POSTFIX ${SDL_CMAKE_DEBUG_POSTFIX})
  1798   endif()
  1799 endif()
  1800 
  1801 if(ANDROID)
  1802   add_library(hidapi SHARED ${ANDROID_HIDAPI_SOURCES})
  1803   if(MSVC AND NOT LIBC)
  1804     # Don't try to link with the default set of libraries.
  1805     set_target_properties(hidapi PROPERTIES LINK_FLAGS_RELEASE "/NODEFAULTLIB")
  1806     set_target_properties(hidapi PROPERTIES LINK_FLAGS_DEBUG "/NODEFAULTLIB")
  1807     set_target_properties(hidapi PROPERTIES STATIC_LIBRARY_FLAGS "/NODEFAULTLIB")
  1808   endif()
  1809   target_link_libraries(hidapi log)
  1810 endif()
  1811 
  1812 if(SDL_STATIC)
  1813   set (BUILD_SHARED_LIBS FALSE)
  1814   add_library(SDL2-static STATIC ${SOURCE_FILES})
  1815   if (NOT SDL_SHARED OR NOT WIN32)
  1816     set_target_properties(SDL2-static PROPERTIES OUTPUT_NAME "SDL2")
  1817     # Note: Apparently, OUTPUT_NAME must really be unique; even when
  1818     # CMAKE_IMPORT_LIBRARY_SUFFIX or the like are given. Otherwise
  1819     # the static build may race with the import lib and one will get
  1820     # clobbered, when the suffix is realized via subsequent rename.
  1821   endif()
  1822   set_target_properties(SDL2-static PROPERTIES POSITION_INDEPENDENT_CODE ${SDL_STATIC_PIC})
  1823   if(MSVC AND NOT LIBC)
  1824     set_target_properties(SDL2-static PROPERTIES LINK_FLAGS_RELEASE "/NODEFAULTLIB")
  1825     set_target_properties(SDL2-static PROPERTIES LINK_FLAGS_DEBUG "/NODEFAULTLIB")
  1826     set_target_properties(SDL2-static PROPERTIES STATIC_LIBRARY_FLAGS "/NODEFAULTLIB")
  1827   endif()
  1828   # TODO: Win32 platforms keep the same suffix .lib for import and static
  1829   # libraries - do we need to consider this?
  1830   set(_INSTALL_LIBS "SDL2-static" ${_INSTALL_LIBS})
  1831   target_link_libraries(SDL2-static ${EXTRA_LIBS} ${EXTRA_LDFLAGS})
  1832   target_include_directories(SDL2-static PUBLIC "$<BUILD_INTERFACE:${SDL2_SOURCE_DIR}/include>" $<INSTALL_INTERFACE:include/SDL2>)
  1833   if (NOT ANDROID)
  1834     set_target_properties(SDL2-static PROPERTIES DEBUG_POSTFIX ${SDL_CMAKE_DEBUG_POSTFIX})
  1835   endif()
  1836 endif()
  1837 
  1838 ##### Tests #####
  1839 
  1840 if(SDL_TEST)
  1841   file(GLOB TEST_SOURCES ${SDL2_SOURCE_DIR}/src/test/*.c)
  1842   add_library(SDL2_test STATIC ${TEST_SOURCES})
  1843 
  1844   add_subdirectory(test)
  1845 endif()
  1846 
  1847 ##### Installation targets #####
  1848 install(TARGETS ${_INSTALL_LIBS} EXPORT SDL2Targets
  1849   LIBRARY DESTINATION "lib${LIB_SUFFIX}"
  1850   ARCHIVE DESTINATION "lib${LIB_SUFFIX}"
  1851   RUNTIME DESTINATION bin)
  1852 
  1853 ##### Export files #####
  1854 if (WINDOWS)
  1855   set(PKG_PREFIX "cmake")
  1856 else ()
  1857   set(PKG_PREFIX "lib/cmake/SDL2")
  1858 endif ()
  1859 
  1860 include(CMakePackageConfigHelpers)
  1861 write_basic_package_version_file("${CMAKE_BINARY_DIR}/SDL2ConfigVersion.cmake"
  1862   VERSION ${SDL_VERSION}
  1863   COMPATIBILITY AnyNewerVersion
  1864 )
  1865 
  1866 install(EXPORT SDL2Targets
  1867   FILE SDL2Targets.cmake
  1868   NAMESPACE SDL2::
  1869   DESTINATION ${PKG_PREFIX}
  1870 )
  1871 install(
  1872   FILES
  1873     ${CMAKE_CURRENT_SOURCE_DIR}/SDL2Config.cmake
  1874     ${CMAKE_BINARY_DIR}/SDL2ConfigVersion.cmake
  1875   DESTINATION ${PKG_PREFIX}
  1876   COMPONENT Devel
  1877 )
  1878 
  1879 file(GLOB INCLUDE_FILES ${SDL2_SOURCE_DIR}/include/*.h)
  1880 file(GLOB BIN_INCLUDE_FILES ${SDL2_BINARY_DIR}/include/*.h)
  1881 foreach(_FNAME ${BIN_INCLUDE_FILES})
  1882   get_filename_component(_INCNAME ${_FNAME} NAME)
  1883   list(REMOVE_ITEM INCLUDE_FILES ${SDL2_SOURCE_DIR}/include/${_INCNAME})
  1884 endforeach()
  1885 list(APPEND INCLUDE_FILES ${BIN_INCLUDE_FILES})
  1886 install(FILES ${INCLUDE_FILES} DESTINATION include/SDL2)
  1887 
  1888 string(TOUPPER "${CMAKE_BUILD_TYPE}" UPPER_BUILD_TYPE)
  1889 if (UPPER_BUILD_TYPE MATCHES DEBUG)
  1890   set(SOPOSTFIX "${SDL_CMAKE_DEBUG_POSTFIX}")
  1891 else()
  1892   set(SOPOSTFIX "")
  1893 endif()
  1894 
  1895 if(NOT (WINDOWS OR CYGWIN))
  1896   if(SDL_SHARED)
  1897     set(SOEXT ${CMAKE_SHARED_LIBRARY_SUFFIX}) # ".so", ".dylib", etc.
  1898     get_target_property(SONAME SDL2 OUTPUT_NAME)
  1899     if(NOT ANDROID)
  1900         install(CODE "
  1901           execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink
  1902             \"lib${SONAME}${SOPOSTFIX}${SOEXT}\" \"libSDL2${SOPOSTFIX}${SOEXT}\"
  1903             WORKING_DIRECTORY \"${SDL2_BINARY_DIR}\")")
  1904         install(FILES ${SDL2_BINARY_DIR}/libSDL2${SOPOSTFIX}${SOEXT} DESTINATION "lib${LIB_SUFFIX}")
  1905     endif()
  1906   endif()
  1907   if(FREEBSD)
  1908     # FreeBSD uses ${PREFIX}/libdata/pkgconfig
  1909     install(FILES ${SDL2_BINARY_DIR}/sdl2.pc DESTINATION "libdata/pkgconfig")
  1910   else()
  1911     install(FILES ${SDL2_BINARY_DIR}/sdl2.pc
  1912       DESTINATION "lib${LIB_SUFFIX}/pkgconfig")
  1913   endif()
  1914   install(PROGRAMS ${SDL2_BINARY_DIR}/sdl2-config DESTINATION bin)
  1915   # TODO: what about the .spec file? Is it only needed for RPM creation?
  1916   install(FILES "${SDL2_SOURCE_DIR}/sdl2.m4" DESTINATION "${CMAKE_INSTALL_FULL_DATAROOTDIR}/aclocal")
  1917 endif()
  1918 
  1919 ##### Uninstall target #####
  1920 
  1921 if(NOT TARGET uninstall)
  1922   configure_file(
  1923       "${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake.in"
  1924       "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
  1925       IMMEDIATE @ONLY)
  1926 
  1927   add_custom_target(uninstall
  1928       COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake)
  1929 endif()