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