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