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