CMakeLists.txt
author Sam Lantinga
Mon, 05 Aug 2019 23:46:09 -0700
changeset 13001 1353fb9be62b
parent 12998 b87ba0fad17e
child 13006 4a410f099040
permissions -rw-r--r--
Fixed bug 4354 - CMake builds do not correctly enable IME on Linux

Callum McGing

While the CMake build checks for ibus and does enable the ibus backend with set(HAVE_IBUS_IBUS_H TRUE), this does not define SDL_USE_IME, thus CMake built SDL2 (as in Arch Linux) cannot use IME at all.

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