CMakeLists.txt
author Sam Lantinga <slouken@libsdl.org>
Thu, 12 Oct 2017 08:47:02 -0700
changeset 11606 a54e7ade4382
parent 11600 03f7e24556ab
child 11610 6dea196ecbcb
permissions -rw-r--r--
Fixed bug 3866 - CMake error when trying to make the 'uninstall' target when it already exists

Steve Robinson

In my project, the 'uninstall' target is already created by the glew library. I get this error when SDL2 tries to create it:

CMake Error at _build/3rdparty/SDL2/SDL2-2.0.6/CMakeLists.txt:1816 (add_custom_target):
add_custom_target cannot create target "uninstall" because another target
with the same name already exists. The existing target is a custom target
created in source directory
"D:/Code/sdl2-tutorial/_build/3rdparty/glew/glew-2.1.0/build/cmake". See
documentation for policy CMP0002 for more details.

To fix it, go to the bottom of the SDL2 CMakeLists.txt file. Add an if statement to check for the existence of the target before creating it. The end result looks like this:

if(NOT TARGET uninstall)
configure_file(
"${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake.in"
"${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
IMMEDIATE @ONLY)

add_custom_target(uninstall
COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake)
endif()

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