CMakeLists.txt
author Sam Lantinga <slouken@libsdl.org>
Fri, 28 Sep 2018 21:19:27 -0700
changeset 12258 231245d461a2
parent 12257 d7a3aac08fc1
child 12355 a46837d71c0a
permissions -rw-r--r--
Mark a subsystem as dummy, not disabled, if it was intended to be compiled in.

From Tom Black:

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