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