forked from stepmania/stepmania
-
Notifications
You must be signed in to change notification settings - Fork 0
/
StepmaniaCore.cmake
456 lines (383 loc) · 13.3 KB
/
StepmaniaCore.cmake
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
# Include the macros and functions.
include(${CMAKE_CURRENT_LIST_DIR}/CMake/CMakeMacros.cmake)
# Set up helper variables for future configuring.
set(SM_CMAKE_DIR "${CMAKE_CURRENT_LIST_DIR}/CMake")
set(SM_EXTERN_DIR "${CMAKE_CURRENT_LIST_DIR}/extern")
set(SM_INSTALLER_DIR "${CMAKE_CURRENT_LIST_DIR}/Installer")
set(SM_XCODE_DIR "${CMAKE_CURRENT_LIST_DIR}/Xcode")
set(SM_PROGRAM_DIR "${CMAKE_CURRENT_LIST_DIR}/Program")
set(SM_BUILD_DIR "${CMAKE_CURRENT_LIST_DIR}/Build")
set(SM_SRC_DIR "${CMAKE_CURRENT_LIST_DIR}/src")
set(SM_DOC_DIR "${CMAKE_CURRENT_LIST_DIR}/Docs")
set(SM_ROOT_DIR "${CMAKE_CURRENT_LIST_DIR}")
# TODO: Reconsile the OS dependent naming scheme.
set(SM_EXE_NAME "StepMania")
# Some OS specific helpers.
if (CMAKE_SYSTEM_NAME MATCHES "Linux")
set(LINUX TRUE)
set(SM_CPP_STANDARD "gnu++11")
else()
set(LINUX FALSE)
endif()
if (CMAKE_SYSTEM_NAME MATCHES "Darwin")
set(MACOSX TRUE)
set(SM_CPP_STANDARD "gnu++14")
else()
set(MACOSX FALSE)
endif()
if (CMAKE_SYSTEM_NAME MATCHES "BSD")
set(BSD TRUE)
set(SM_CPP_STANDARD "gnu++11")
else()
set(BSD FALSE)
endif()
# Allow for finding our libraries in a standard location.
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}" "${SM_CMAKE_DIR}/Modules/")
include("${SM_CMAKE_DIR}/DefineOptions.cmake")
include("${SM_CMAKE_DIR}/SMDefs.cmake")
# Put the predefined targets in separate groups.
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
# Set up the linker flags for MSVC builds.
configure_msvc_runtime()
if(WITH_UNIT_TESTS)
# Determine which projects can be compiled in.
if (${CMAKE_CXX_COMPILER_ID} STREQUAL "GNU")
if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.0)
set(CAN_COMPILE_TESTS OFF)
else()
set(CAN_COMPILE_TESTS ON)
endif()
else()
set(CAN_COMPILE_TESTS ON)
endif()
else()
set(CAN_COMPILE_TESTS OFF)
endif()
# Checks the standard include directories for c-style headers.
# We may use C++ in this project, but the check works better with plain C headers.
include(CheckIncludeFiles)
check_include_files(alloca.h HAVE_ALLOCA_H)
check_include_files(assert.h HAVE_ASSERT_H)
check_include_files(dlfcn.h HAVE_DLFCN_H)
check_include_files(dirent.h HAVE_DIRENT_H)
check_include_files(errno.h HAVE_ERRNO_H)
check_include_files(fcntl.h HAVE_FCNTL_H)
check_include_files(inttypes.h HAVE_INTTYPES_H)
check_include_files(math.h HAVE_MATH_H)
check_include_files(memory.h HAVE_MEMORY_H)
check_include_files(stdarg.h HAVE_STDARG_H)
check_include_files(stddef.h HAVE_STDDEF_H)
check_include_files(stdint.h HAVE_STDINT_H)
check_include_files(stdlib.h HAVE_STDLIB_H)
check_include_files(strings.h HAVE_STRINGS_H)
check_include_files(string.h HAVE_STRING_H)
check_include_files(unistd.h HAVE_UNISTD_H)
check_include_files(sys/param.h HAVE_SYS_PARAM_H)
check_include_files(sys/stat.h HAVE_SYS_STAT_H)
check_include_files(sys/types.h HAVE_SYS_TYPES_H)
check_include_files(sys/utsname.h HAVE_SYS_UTSNAME_H)
check_include_files(sys/wait.h HAVE_SYS_WAIT_H)
check_include_files(endian.h HAVE_ENDIAN_H)
check_include_files(sys/endian.h HAVE_SYS_ENDIAN_H)
check_include_files(machine/endian.h HAVE_MACHINE_ENDIAN_H)
if (HAVE_STDLIB_H AND HAVE_STDARG_H AND HAVE_STRING_H AND HAVE_FLOAT_H)
set(STDC_HEADERS 1)
endif()
include(CheckFunctionExists)
include(CheckSymbolExists)
include(CheckCXXSymbolExists)
# Mostly Windows functions.
check_function_exists(_mkdir HAVE__MKDIR)
check_cxx_symbol_exists(_snprintf cstdio HAVE__SNPRINTF)
# Mostly non-Windows functions.
check_function_exists(fcntl HAVE_FCNTL)
check_function_exists(fork HAVE_FORK)
check_function_exists(mkdir HAVE_MKDIR)
check_cxx_symbol_exists(snprintf cstdio HAVE_SNPRINTF)
check_function_exists(waitpid HAVE_WAITPID)
# Mostly universal symbols.
check_cxx_symbol_exists(strtof cstdlib HAVE_STRTOF)
check_symbol_exists(size_t stddef.h HAVE_SIZE_T_STDDEF)
check_symbol_exists(size_t stdlib.h HAVE_SIZE_T_STDLIB)
check_symbol_exists(size_t stdio.h HAVE_SIZE_T_STDIO)
check_symbol_exists(posix_fadvise fcntl.h HAVE_POSIX_FADVISE)
if (MINGW)
set(NEED_WINDOWS_LOADING_WINDOW TRUE)
check_symbol_exists(PBS_MARQUEE commctrl.h HAVE_PBS_MARQUEE)
check_symbol_exists(PBM_SETMARQUEE commctrl.h HAVE_PBM_SETMARQUEE)
endif()
# Checks to make it easier to work with fixed size types.
include(CheckTypeSize)
check_type_size(int16_t SIZEOF_INT16_T)
check_type_size(uint16_t SIZEOF_UINT16_T)
check_type_size(u_int16_t SIZEOF_U_INT16_T)
check_type_size(int32_t SIZEOF_INT32_T)
check_type_size(uint32_t SIZEOF_UINT32_T)
check_type_size(u_int32_t SIZEOF_U_INT32_T)
check_type_size(int64_t SIZEOF_INT64_T)
check_type_size(char SIZEOF_CHAR)
check_type_size("unsigned char" SIZEOF_UNSIGNED_CHAR)
check_type_size(short SIZEOF_SHORT)
check_type_size("unsigned short" SIZEOF_UNSIGNED_SHORT)
check_type_size(int SIZEOF_INT)
check_type_size("unsigned int" SIZEOF_UNSIGNED_INT)
check_type_size(long SIZEOF_LONG)
check_type_size("unsigned long" SIZEOF_UNSIGNED_LONG)
check_type_size("long long" SIZEOF_LONG_LONG)
check_type_size(float SIZEOF_FLOAT)
check_type_size(double SIZEOF_DOUBLE)
check_type_size(intptr_t SIZEOF_INTPTR_T)
check_type_size(pid_t SIZEOF_PID_T)
check_type_size(size_t SIZEOF_SIZE_T)
check_type_size(ssize_t SIZEOF_SSIZE_T)
include(TestBigEndian)
test_big_endian(BIGENDIAN)
if (${BIGENDIAN})
set(ENDIAN_BIG 1)
else()
set(ENDIAN_LITTLE 1)
endif()
check_compile_features("${SM_CMAKE_DIR}/TestCode" "${SM_CMAKE_DIR}/TestCode/test_prototype.c" "Checking for function prototype capabilities" "found" "not found" SM_IGNORED_PROTOTYPE_CALL FALSE)
if(NOT SM_IGNORED_PROTOTYPE_CALL)
set(HAVE_PROTOTYPES TRUE)
endif()
check_compile_features("${SM_CMAKE_DIR}/TestCode" "${SM_CMAKE_DIR}/TestCode/test_external.c" "Checking for external name shortening requirements" "not needed" "needed" SM_BUILT_LONG_NAME TRUE)
if (NOT SM_BUILT_LONG_NAME)
set(NEED_SHORT_EXTERNAL_NAMES 1)
endif()
check_compile_features("${SM_CMAKE_DIR}/TestCode" "${SM_CMAKE_DIR}/TestCode/test_broken.c" "Checking if incomplete types are broken." "not broken" "broken" SM_BUILT_INCOMPLETE_TYPE FALSE)
if (SM_BUILT_INCOMPLETE_TYPE)
set(INCOMPLETE_TYPES_BROKEN 1)
endif()
# Dependencies go here.
include(ExternalProject)
if(NOT WITH_GPL_LIBS)
message("Disabling GPL exclusive libraries: no MP3 support.")
set(WITH_MP3 OFF)
endif()
if(WITH_WAV)
# TODO: Identify which headers to check for ensuring this will always work.
set(HAS_WAV TRUE)
endif()
if(WITH_MP3)
if(WIN32 OR MACOSX)
set(HAS_MP3 TRUE)
else()
find_package(Mad)
if(NOT LIBMAD_FOUND)
message(FATAL_ERROR "Libmad library not found. If you wish to skip mp3 support, set WITH_MP3 to OFF when configuring.")
else()
set(HAS_MP3 TRUE)
endif()
endif()
endif()
if(WITH_OGG)
if(WIN32 OR MACOSX)
set(HAS_OGG TRUE)
else()
find_package(Ogg)
find_package(Vorbis)
find_package(VorbisFile)
if(NOT (OGG_FOUND AND VORBIS_FOUND AND VORBISFILE_FOUND) )
message(FATAL_ERROR "Not all vorbis libraries were found. If you wish to skip vorbis support, set WITH_OGG to OFF when configuring.")
else()
set(HAS_OGG TRUE)
endif()
endif()
endif()
if(WITH_SDL)
find_package(SDL2)
if(NOT SDL2_FOUND)
message(FATAL_ERROR "SDL2 Library was not found. If you wish to compile without SDL2, set WITH_SDL to OFF when configuring.")
else()
set(HAS_SDL TRUE)
endif()
endif()
find_package(nasm)
find_package(yasm)
find_package(BZip2)
if (NOT ${BZIP2_FOUND} AND NOT MSVC)
message(FATAL_ERROR "Bzip2 support required.")
endif()
find_package(Iconv)
find_package(Threads)
if (${Threads_FOUND})
set(HAS_PTHREAD TRUE)
list(APPEND CMAKE_REQUIRED_LIBRARIES pthread)
check_symbol_exists(pthread_mutex_timedlock pthread.h HAVE_PTHREAD_MUTEX_TIMEDLOCK)
check_symbol_exists(pthread_cond_timedwait pthread.h HAVE_PTHREAD_COND_TIMEDWAIT)
else()
set(HAS_PTHREAD FALSE)
endif()
if(WIN32)
set(SYSTEM_PCRE_FOUND FALSE)
if (MINGW AND WITH_FFMPEG)
include("${SM_CMAKE_DIR}/SetupFfmpeg.cmake")
set(HAS_FFMPEG TRUE)
else()
# FFMPEG...it can be evil.
find_library(LIB_SWSCALE NAMES "swscale"
PATHS "${SM_EXTERN_DIR}/ffmpeg/lib" NO_DEFAULT_PATH
)
get_filename_component(LIB_SWSCALE ${LIB_SWSCALE} NAME)
find_library(LIB_AVCODEC NAMES "avcodec"
PATHS "${SM_EXTERN_DIR}/ffmpeg/lib" NO_DEFAULT_PATH
)
get_filename_component(LIB_AVCODEC ${LIB_AVCODEC} NAME)
find_library(LIB_AVFORMAT NAMES "avformat"
PATHS "${SM_EXTERN_DIR}/ffmpeg/lib" NO_DEFAULT_PATH
)
get_filename_component(LIB_AVFORMAT ${LIB_AVFORMAT} NAME)
find_library(LIB_AVUTIL NAMES "avutil"
PATHS "${SM_EXTERN_DIR}/ffmpeg/lib" NO_DEFAULT_PATH
)
get_filename_component(LIB_AVUTIL ${LIB_AVUTIL} NAME)
endif()
elseif(MACOSX)
# TODO: Better way of determining if OGG is required.
# Also: Keep WITH_OGG checks together.
if (WITH_OGG)
include("${SM_CMAKE_DIR}/SetupOggVorbis.cmake")
endif()
if (WITH_FFMPEG)
include("${SM_CMAKE_DIR}/SetupFfmpeg.cmake")
set(HAS_FFMPEG TRUE)
endif()
set(SYSTEM_PCRE_FOUND FALSE)
set(WITH_CRASH_HANDLER TRUE)
# Apple Archs needs to be 32-bit for now.
# When SDL2 is introduced, this may change.
set(CMAKE_OSX_DEPLOYMENT_TARGET "10.7")
set(CMAKE_OSX_DEPLOYMENT_TARGET_FULL "10.7.0")
find_library(MAC_FRAME_ACCELERATE Accelerate ${CMAKE_SYSTEM_FRAMEWORK_PATH})
find_library(MAC_FRAME_APPKIT AppKit ${CMAKE_SYSTEM_FRAMEWORK_PATH})
find_library(MAC_FRAME_AUDIOTOOLBOX AudioToolbox ${CMAKE_SYSTEM_FRAMEWORK_PATH})
find_library(MAC_FRAME_AUDIOUNIT AudioUnit ${CMAKE_SYSTEM_FRAMEWORK_PATH})
find_library(MAC_FRAME_CARBON Carbon ${CMAKE_SYSTEM_FRAMEWORK_PATH})
find_library(MAC_FRAME_COCOA Cocoa ${CMAKE_SYSTEM_FRAMEWORK_PATH})
find_library(MAC_FRAME_COREAUDIO CoreAudio ${CMAKE_SYSTEM_FRAMEWORK_PATH})
find_library(MAC_FRAME_COREFOUNDATION CoreFoundation ${CMAKE_SYSTEM_FRAMEWORK_PATH})
find_library(MAC_FRAME_CORESERVICES CoreServices ${CMAKE_SYSTEM_FRAMEWORK_PATH})
find_library(MAC_FRAME_FOUNDATION Foundation ${CMAKE_SYSTEM_FRAMEWORK_PATH})
find_library(MAC_FRAME_IOKIT IOKit ${CMAKE_SYSTEM_FRAMEWORK_PATH})
find_library(MAC_FRAME_OPENGL OpenGL ${CMAKE_SYSTEM_FRAMEWORK_PATH})
find_library(MAC_FRAME_QUICKTIME QuickTime ${CMAKE_SYSTEM_FRAMEWORK_PATH})
mark_as_advanced(
MAC_FRAME_ACCELERATE
MAC_FRAME_APPKIT
MAC_FRAME_AUDIOTOOLBOX
MAC_FRAME_AUDIOUNIT
MAC_FRAME_CARBON
MAC_FRAME_COCOA
MAC_FRAME_COREAUDIO
MAC_FRAME_COREFOUNDATION
MAC_FRAME_CORESERVICES
MAC_FRAME_FOUNDATION
MAC_FRAME_IOKIT
MAC_FRAME_OPENGL
MAC_FRAME_QUICKTIME
)
elseif(LINUX)
if(WITH_GTK2)
find_package("GTK2" 2.0)
if (${GTK2_FOUND})
set(HAS_GTK2 TRUE)
else()
set(HAS_GTK2 FALSE)
message("GTK2 was not found on your system. There will be no loading window.")
endif()
else()
set(HAS_GTK2 FALSE)
endif()
find_package(X11)
if(${X11_FOUND})
set(HAS_X11 TRUE)
else()
set(HAS_X11 FALSE)
endif()
find_package(Pcre)
set(SYSTEM_PCRE_FOUND ${PCRE_FOUND})
find_package("ZLIB")
if (NOT(${ZLIB_FOUND}))
message(FATAL_ERROR "zlib support required.")
endif()
find_package("JPEG")
if(NOT(${JPEG_FOUND}))
message(FATAL_ERROR "jpeg support required.")
endif()
find_package(Dl)
find_package(Xrandr REQUIRED)
if (${XRANDR_FOUND})
set(HAS_XRANDR TRUE)
else()
set(HAS_XRANDR FALSE)
endif()
find_package(Xinerama)
if (${XINERAMA_FOUND})
set(HAS_XINERAMA TRUE)
else()
set(HAS_XINERAMA FALSE)
endif()
find_package(PulseAudio)
if (PULSEAUDIO_FOUND)
set(HAS_PULSE TRUE)
else()
set(HAS_PULSE FALSE)
endif()
find_package(ALSA)
if (ALSA_FOUND)
set(HAS_ALSA TRUE)
else()
set(HAS_ALSA FALSE)
endif()
find_package(JACK)
if (JACK_FOUND)
set(HAS_JACK TRUE)
else()
set(HAS_JACK FALSE)
endif()
find_package(OSS)
if (OSS_FOUND)
set(HAS_OSS TRUE)
else()
set(HAS_OSS FALSE)
endif()
if(NOT OSS_FOUND AND NOT JACK_FOUND AND NOT ALSA_FOUND AND NOT PULSE_FOUND)
message(FATAL_ERROR "No sound libraries found. You will require at least one.")
else()
message(STATUS "-- At least one sound library was found. Do not worry if any were not found at this stage.")
endif()
if (WITH_FFMPEG AND NOT YASM_FOUND AND NOT NASM_FOUND)
message("Neither NASM nor YASM were found. Please install at least one of them if you wish for ffmpeg support.")
set(WITH_FFMPEG OFF)
endif()
find_package("Va")
if(WITH_FFMPEG)
if (WITH_SYSTEM_FFMPEG)
find_package("FFMPEG")
if(NOT FFMPEG_FOUND)
message(FATAL_ERROR "System ffmpeg not found! Either install the libraries or remove the argument, then try again.")
else()
message(STATUS "-- Warning! Your version of ffmpeg may be too high! If you want to use the system ffmpeg, clear your cmake cache and do not include the system ffmpeg argument.")
set(HAS_FFMPEG TRUE)
endif()
else()
include("${SM_CMAKE_DIR}/SetupFfmpeg.cmake")
set(HAS_FFMPEG TRUE)
endif()
else()
set(HAS_FFMPEG FALSE)
endif()
find_package(OpenGL REQUIRED)
if (NOT ${OPENGL_FOUND})
message(FATAL_ERROR "OpenGL required to compile StepMania.")
endif()
find_package(GLEW REQUIRED)
if (NOT ${GLEW_FOUND})
message(FATAL_ERROR "GLEW required to compile StepMania.")
endif()
endif()
configure_file("${SM_SRC_DIR}/config.in.hpp" "${SM_SRC_DIR}/generated/config.hpp")
configure_file("${SM_SRC_DIR}/verstub.in.cpp" "${SM_SRC_DIR}/generated/verstub.cpp")
# Define installer based items for cpack.
include("${CMAKE_CURRENT_LIST_DIR}/CMake/CPackSetup.cmake")