1
# CMake build file list for OpenAL
3
CMAKE_MINIMUM_REQUIRED(VERSION 2.4)
5
IF(COMMAND CMAKE_POLICY)
6
CMAKE_POLICY(SET CMP0003 NEW)
7
ENDIF(COMMAND CMAKE_POLICY)
9
SET(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake")
11
INCLUDE(CheckFunctionExists)
12
INCLUDE(CheckLibraryExists)
13
INCLUDE(CheckSharedLibraryExists)
14
INCLUDE(CheckIncludeFile)
15
INCLUDE(CheckIncludeFiles)
16
INCLUDE(CheckSymbolExists)
17
INCLUDE(CheckCCompilerFlag)
18
INCLUDE(CheckCSourceCompiles)
19
INCLUDE(CheckTypeSize)
25
SET(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS TRUE)
28
OPTION(ALSA "Check for ALSA backend" ON)
29
OPTION(OSS "Check for OSS backend" ON)
30
OPTION(SOLARIS "Check for Solaris backend" ON)
31
OPTION(DSOUND "Check for DirectSound backend" ON)
32
OPTION(WINMM "Check for Windows Multimedia backend" ON)
33
OPTION(PORTAUDIO "Check for PortAudio backend" ON)
34
OPTION(PULSEAUDIO "Check for PulseAudio backend" ON)
35
OPTION(WAVE "Enable Wave Writer backend" ON)
37
OPTION(DLOPEN "Check for the dlopen API for loading optional libs" ON)
39
OPTION(WERROR "Treat compile warnings as errors" OFF)
41
OPTION(UTILS "Build and install utility programs" ON)
43
OPTION(ALSOFT_CONFIG "Install alsoft.conf configuration file" OFF)
48
ADD_DEFINITIONS("-D_WIN32")
57
SET(LIB_MAJOR_VERSION "1")
58
SET(LIB_MINOR_VERSION "13")
59
SET(LIB_VERSION "${LIB_MAJOR_VERSION}.${LIB_MINOR_VERSION}")
62
CHECK_TYPE_SIZE("long" SIZEOF_LONG)
63
CHECK_TYPE_SIZE("long long" SIZEOF_LONG_LONG)
64
CHECK_TYPE_SIZE("unsigned int" SIZEOF_UINT)
65
CHECK_TYPE_SIZE("void*" SIZEOF_VOIDP)
68
# Add definitions, compiler switches, etc.
69
INCLUDE_DIRECTORIES(OpenAL32/Include include "${OpenAL_BINARY_DIR}")
71
IF(NOT CMAKE_BUILD_TYPE)
72
SET(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING
73
"Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel."
76
IF(NOT CMAKE_DEBUG_POSTFIX)
77
SET(CMAKE_DEBUG_POSTFIX "" CACHE STRING
78
"Library postfix for debug builds. Normally left blank."
84
SET(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -D_DEBUG")
85
SET(CMAKE_C_FLAGS_MINSIZEREL "${CMAKE_C_FLAGS_MINSIZEREL} -DNDEBUG")
86
SET(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -DNDEBUG")
87
SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -D_DEBUG")
88
ADD_DEFINITIONS(-D_CRT_SECURE_NO_WARNINGS)
89
ADD_DEFINITIONS(-D_CRT_NONSTDC_NO_DEPRECATE)
92
STRING(REGEX REPLACE "\\\\" "/" DXSDK_DIR "$ENV{DXSDK_DIR}")
94
STRING(REGEX REPLACE "\\\\" "/" DXSDK_DIR "${DXSDK_DIR}")
97
MESSAGE(STATUS "Using DirectX SDK directory: ${DXSDK_DIR}")
98
SET(CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES} "${DXSDK_DIR}/Include")
99
INCLUDE_DIRECTORIES("${DXSDK_DIR}/Include")
100
LINK_DIRECTORIES("${DXSDK_DIR}/Lib")
103
OPTION(FORCE_STATIC_VCRT "Force /MT for static VC runtimes" OFF)
104
IF(FORCE_STATIC_VCRT)
106
CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE
107
CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO)
108
IF(${flag_var} MATCHES "/MD")
109
STRING(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}")
114
ADD_DEFINITIONS(-Winline -Wall)
115
CHECK_C_COMPILER_FLAG(-Wextra HAVE_W_EXTRA)
117
ADD_DEFINITIONS(-Wextra)
121
ADD_DEFINITIONS(-Werror)
124
SET(CMAKE_C_FLAGS_RELWITHDEBINFO "-g -O2 -D_DEBUG" CACHE STRING
125
"Flags used by the compiler during Release with Debug Info builds."
127
SET(CMAKE_C_FLAGS_MINSIZEREL "-Os -DNDEBUG" CACHE STRING
128
"Flags used by the compiler during release minsize builds."
130
SET(CMAKE_C_FLAGS_RELEASE "-O2 -fomit-frame-pointer -DNDEBUG" CACHE STRING
131
"Flags used by the compiler during release builds"
133
SET(CMAKE_C_FLAGS_DEBUG "-g3 -D_DEBUG" CACHE STRING
134
"Flags used by the compiler during debug builds."
137
CHECK_C_SOURCE_COMPILES("int foo() __attribute__((destructor));
138
int main() {return 0;}" HAVE_GCC_DESTRUCTOR)
140
# Set visibility options if available
142
CHECK_C_COMPILER_FLAG(-fvisibility=internal HAVE_VISIBILITY_SWITCH)
143
IF(HAVE_VISIBILITY_SWITCH)
144
CHECK_C_SOURCE_COMPILES("int foo() __attribute__((visibility(\"default\")));
145
int main() {return 0;}" HAVE_GCC_VISIBILITY)
146
IF(HAVE_GCC_VISIBILITY)
147
ADD_DEFINITIONS(-fvisibility=internal -DHAVE_GCC_VISIBILITY)
153
CHECK_C_SOURCE_COMPILES("int foo(const char *str, ...) __attribute__((format(printf, 1, 2)));
154
int main() {return 0;}" HAVE_GCC_FORMAT)
156
CHECK_INCLUDE_FILE(fenv.h HAVE_FENV_H)
157
CHECK_INCLUDE_FILE(float.h HAVE_FLOAT_H)
159
CHECK_LIBRARY_EXISTS(m powf "" HAVE_POWF)
160
CHECK_LIBRARY_EXISTS(m sqrtf "" HAVE_SQRTF)
161
CHECK_LIBRARY_EXISTS(m acosf "" HAVE_ACOSF)
162
CHECK_LIBRARY_EXISTS(m atanf "" HAVE_ATANF)
163
CHECK_LIBRARY_EXISTS(m fabsf "" HAVE_FABSF)
165
CHECK_LIBRARY_EXISTS(m fesetround "" HAVE_FESETROUND)
167
IF(HAVE_SQRTF OR HAVE_ACOSF OR HAVE_ATANF OR HAVE_FABSF OR HAVE_FESETROUND)
168
SET(EXTRA_LIBS m ${EXTRA_LIBS})
170
CHECK_FUNCTION_EXISTS(strtof HAVE_STRTOF)
171
CHECK_FUNCTION_EXISTS(_controlfp HAVE__CONTROLFP)
173
CHECK_FUNCTION_EXISTS(stat HAVE_STAT)
174
CHECK_FUNCTION_EXISTS(strcasecmp HAVE_STRCASECMP)
175
IF(NOT HAVE_STRCASECMP)
176
CHECK_FUNCTION_EXISTS(_stricmp HAVE__STRICMP)
177
IF(NOT HAVE__STRICMP)
178
MESSAGE(FATAL_ERROR "No case-insensitive compare function found, please report!")
181
ADD_DEFINITIONS(-Dstrcasecmp=_stricmp)
184
CHECK_FUNCTION_EXISTS(strncasecmp HAVE_STRNCASECMP)
185
IF(NOT HAVE_STRNCASECMP)
186
CHECK_FUNCTION_EXISTS(_strnicmp HAVE__STRNICMP)
187
IF(NOT HAVE__STRNICMP)
188
MESSAGE(FATAL_ERROR "No case-insensitive size-limitted compare function found, please report!")
191
ADD_DEFINITIONS(-Dstrncasecmp=_strnicmp)
194
CHECK_FUNCTION_EXISTS(snprintf HAVE_SNPRINTF)
195
IF(NOT HAVE_SNPRINTF)
196
CHECK_FUNCTION_EXISTS(_snprintf HAVE__SNPRINTF)
197
IF(NOT HAVE__SNPRINTF)
198
MESSAGE(FATAL_ERROR "No snprintf function found, please report!")
201
ADD_DEFINITIONS(-Dsnprintf=_snprintf)
204
CHECK_FUNCTION_EXISTS(vsnprintf HAVE_VSNPRINTF)
205
IF(NOT HAVE_VSNPRINTF)
206
CHECK_FUNCTION_EXISTS(_vsnprintf HAVE__VSNPRINTF)
207
IF(NOT HAVE__VSNPRINTF)
208
MESSAGE(FATAL_ERROR "No vsnprintf function found, please report!")
211
ADD_DEFINITIONS(-Dvsnprintf=_vsnprintf)
214
CHECK_SYMBOL_EXISTS(isnan math.h HAVE_ISNAN)
216
CHECK_FUNCTION_EXISTS(_isnan HAVE__ISNAN)
218
MESSAGE(FATAL_ERROR "No isnan function found, please report!")
221
ADD_DEFINITIONS(-Disnan=_isnan)
225
# Check for the dlopen API (for dynamicly loading backend libs)
227
CHECK_INCLUDE_FILE(dlfcn.h HAVE_DLFCN_H)
229
CHECK_LIBRARY_EXISTS(dl dlopen "" HAVE_LIBDL)
231
SET(EXTRA_LIBS dl ${EXTRA_LIBS})
236
# Check if we have Windows headers
237
CHECK_INCLUDE_FILE(windows.h HAVE_WINDOWS_H -D_WIN32_WINNT=0x0500)
238
IF(NOT HAVE_WINDOWS_H)
239
CHECK_FUNCTION_EXISTS(gettimeofday HAVE_GETTIMEOFDAY)
240
IF(NOT HAVE_GETTIMEOFDAY)
241
MESSAGE(FATAL_ERROR "No timing function found!")
244
CHECK_FUNCTION_EXISTS(nanosleep HAVE_NANOSLEEP)
245
IF(NOT HAVE_NANOSLEEP)
246
MESSAGE(FATAL_ERROR "No sleep function found!")
249
CHECK_C_COMPILER_FLAG(-pthread HAVE_PTHREAD)
251
ADD_DEFINITIONS(-pthread)
252
SET(EXTRA_LIBS ${EXTRA_LIBS} -pthread)
255
# We need pthreads outside of Windows
256
CHECK_INCLUDE_FILE(pthread.h HAVE_PTHREAD_H)
257
IF(NOT HAVE_PTHREAD_H)
258
MESSAGE(FATAL_ERROR "PThreads is required for non-Windows builds!")
260
# Some systems need pthread_np.h to get recursive mutexes
261
CHECK_INCLUDE_FILES("pthread.h;pthread_np.h" HAVE_PTHREAD_NP_H)
263
# _GNU_SOURCE is needed on some systems for extra attributes, and
264
# _REENTRANT is needed for libc thread-safety
265
ADD_DEFINITIONS(-D_GNU_SOURCE=1)
266
CHECK_LIBRARY_EXISTS(pthread pthread_create "" HAVE_LIBPTHREAD)
268
SET(EXTRA_LIBS pthread ${EXTRA_LIBS})
271
CHECK_LIBRARY_EXISTS(pthread pthread_setschedparam "" HAVE_PTHREAD_SETSCHEDPARAM)
273
CHECK_LIBRARY_EXISTS(rt clock_gettime "" HAVE_LIBRT)
275
SET(EXTRA_LIBS rt ${EXTRA_LIBS})
279
# Check for a 64-bit type
280
CHECK_INCLUDE_FILE(stdint.h HAVE_STDINT_H)
281
IF(NOT HAVE_STDINT_H)
283
CHECK_C_SOURCE_COMPILES("\#define _WIN32_WINNT 0x0500
284
\#include <windows.h>
286
int main() {return 0;}" HAVE___INT64)
289
IF(NOT SIZEOF_LONG MATCHES "8")
290
IF(NOT SIZEOF_LONG_LONG MATCHES "8")
291
MESSAGE(FATAL_ERROR "No 64-bit types found, please report!")
298
# Windows needs winmm for timeGetTime, even if the backend is disabled
299
CHECK_SHARED_LIBRARY_EXISTS(winmm timeGetTime 0 "" HAVE_LIBWINMM)
301
SET(EXTRA_LIBS winmm ${EXTRA_LIBS})
302
SET(PKG_CONFIG_LIBS ${PKG_CONFIG_LIBS} -lwinmm)
307
SET(OPENAL_OBJS OpenAL32/alAuxEffectSlot.c
309
OpenAL32/alDatabuffer.c
312
OpenAL32/alExtension.c
314
OpenAL32/alListener.c
319
SET(ALC_OBJS Alc/ALc.c
339
SET(HAVE_PORTAUDIO 0)
340
SET(HAVE_PULSEAUDIO 0)
345
CHECK_INCLUDE_FILE(alsa/asoundlib.h HAVE_ALSA_ASOUNDLIB_H)
346
IF(HAVE_ALSA_ASOUNDLIB_H)
347
CHECK_SHARED_LIBRARY_EXISTS(asound snd_pcm_open 4 "" HAVE_LIBASOUND)
348
IF(HAVE_LIBASOUND OR HAVE_DLFCN_H OR WIN32)
350
SET(ALC_OBJS ${ALC_OBJS} Alc/alsa.c)
351
IF(HAVE_DLFCN_H OR WIN32)
352
SET(BACKENDS "${BACKENDS} ALSA,")
354
SET(BACKENDS "${BACKENDS} ALSA \(linked\),")
355
SET(EXTRA_LIBS asound ${EXTRA_LIBS})
363
CHECK_INCLUDE_FILE(sys/soundcard.h HAVE_SYS_SOUNDCARD_H)
364
IF(HAVE_SYS_SOUNDCARD_H)
366
SET(ALC_OBJS ${ALC_OBJS} Alc/oss.c)
367
SET(BACKENDS "${BACKENDS} OSS,")
371
# Check Solaris backend
373
CHECK_INCLUDE_FILE(sys/audioio.h HAVE_SYS_AUDIOIO_H)
374
IF(HAVE_SYS_AUDIOIO_H)
376
SET(ALC_OBJS ${ALC_OBJS} Alc/solaris.c)
377
SET(BACKENDS "${BACKENDS} Solaris,")
381
# Check DSound/MMSystem backend
383
CHECK_INCLUDE_FILE(dsound.h HAVE_DSOUND_H)
385
CHECK_SHARED_LIBRARY_EXISTS(dsound DirectSoundCreate 3 "" HAVE_LIBDSOUND)
386
IF(HAVE_LIBDSOUND OR HAVE_DLFCN_H OR WIN32)
388
SET(ALC_OBJS ${ALC_OBJS} Alc/dsound.c)
390
IF(HAVE_DLFCN_H OR WIN32)
391
SET(BACKENDS "${BACKENDS} DirectSound,")
393
SET(BACKENDS "${BACKENDS} DirectSound \(linked\),")
394
SET(EXTRA_LIBS dsound ${EXTRA_LIBS})
402
CHECK_INCLUDE_FILES("windows.h;mmsystem.h" HAVE_MMSYSTEM_H -D_WIN32_WINNT=0x0500)
403
IF(HAVE_MMSYSTEM_H AND HAVE_LIBWINMM)
405
SET(ALC_OBJS ${ALC_OBJS} Alc/winmm.c)
406
SET(BACKENDS "${BACKENDS} WinMM,")
411
# Check PortAudio backend
413
CHECK_INCLUDE_FILE(portaudio.h HAVE_PORTAUDIO_H)
415
CHECK_SHARED_LIBRARY_EXISTS(portaudio Pa_Initialize 0 "" HAVE_LIBPORTAUDIO)
416
IF(HAVE_LIBPORTAUDIO OR HAVE_DLFCN_H OR WIN32)
417
SET(HAVE_PORTAUDIO 1)
418
SET(ALC_OBJS ${ALC_OBJS} Alc/portaudio.c)
419
IF(HAVE_DLFCN_H OR WIN32)
420
SET(BACKENDS "${BACKENDS} PortAudio,")
422
SET(BACKENDS "${BACKENDS} PortAudio \(linked\),")
423
SET(EXTRA_LIBS portaudio ${EXTRA_LIBS})
429
# Check PortAudio backend
431
CHECK_INCLUDE_FILE(pulse/pulseaudio.h HAVE_PULSE_PULSEAUDIO_H)
432
IF(HAVE_PULSE_PULSEAUDIO_H)
433
CHECK_SHARED_LIBRARY_EXISTS(pulse pa_context_new 2 "" HAVE_LIBPULSE)
434
IF(HAVE_LIBPULSE OR HAVE_DLFCN_H OR WIN32)
435
SET(HAVE_PULSEAUDIO 1)
436
SET(ALC_OBJS ${ALC_OBJS} Alc/pulseaudio.c)
437
IF(HAVE_DLFCN_H OR WIN32)
438
SET(BACKENDS "${BACKENDS} PulseAudio,")
440
SET(BACKENDS "${BACKENDS} PulseAudio \(linked\),")
441
SET(EXTRA_LIBS pulse ${EXTRA_LIBS})
447
# Optionally enable the Wave Writer backend
450
SET(ALC_OBJS ${ALC_OBJS} Alc/wave.c)
451
SET(BACKENDS "${BACKENDS} WaveFile,")
454
# This is always available
455
SET(BACKENDS "${BACKENDS} Null")
457
IF(LIBTYPE STREQUAL "STATIC")
458
ADD_DEFINITIONS(-DAL_LIBTYPE_STATIC)
459
SET(PKG_CONFIG_CFLAGS -DAL_LIBTYPE_STATIC ${PKG_CONFIG_CFLAGS})
462
# Needed for openal.pc.in
463
SET(prefix ${CMAKE_INSTALL_PREFIX})
464
SET(exec_prefix "\${prefix}")
465
SET(libdir "\${exec_prefix}/lib${LIB_SUFFIX}")
466
SET(bindir "\${exec_prefix}/bin")
467
SET(includedir "\${prefix}/include")
468
SET(PACKAGE_VERSION "${LIB_VERSION}")
472
"${OpenAL_SOURCE_DIR}/config.h.in"
473
"${OpenAL_BINARY_DIR}/config.h")
475
"${OpenAL_SOURCE_DIR}/openal.pc.in"
476
"${OpenAL_BINARY_DIR}/openal.pc"
480
ADD_LIBRARY(${LIBNAME} ${LIBTYPE} ${OPENAL_OBJS} ${ALC_OBJS})
481
SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES DEFINE_SYMBOL AL_BUILD_LIBRARY
482
COMPILE_FLAGS -DAL_ALEXT_PROTOTYPES
483
VERSION ${LIB_VERSION}.0
484
SOVERSION ${LIB_MAJOR_VERSION})
485
IF(WIN32 AND NOT LIBTYPE STREQUAL "STATIC")
486
SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES PREFIX "")
489
TARGET_LINK_LIBRARIES(${LIBNAME} ${EXTRA_LIBS})
491
# Add an install target here
492
INSTALL(TARGETS ${LIBNAME}
493
RUNTIME DESTINATION bin
494
LIBRARY DESTINATION "lib${LIB_SUFFIX}"
495
ARCHIVE DESTINATION "lib${LIB_SUFFIX}"
497
INSTALL(FILES include/AL/al.h
501
include/AL/efx-creative.h
502
DESTINATION include/AL
504
INSTALL(FILES "${OpenAL_BINARY_DIR}/openal.pc"
505
DESTINATION "lib${LIB_SUFFIX}/pkgconfig")
509
MESSAGE(STATUS "Building OpenAL with support for the following backends:")
510
MESSAGE(STATUS " ${BACKENDS}")
515
MESSAGE(STATUS "WARNING: Building the Windows version without DirectSound output")
516
MESSAGE(STATUS " This is probably NOT what you want!")
521
# Install alsoft.conf configuration file
523
INSTALL(FILES alsoftrc.sample
524
DESTINATION /etc/openal
527
MESSAGE(STATUS "Installing sample alsoft.conf")
532
ADD_EXECUTABLE(openal-info utils/openal-info.c)
533
TARGET_LINK_LIBRARIES(openal-info ${LIBNAME})
534
INSTALL(TARGETS openal-info
535
RUNTIME DESTINATION bin
536
LIBRARY DESTINATION "lib${LIB_SUFFIX}"
537
ARCHIVE DESTINATION "lib${LIB_SUFFIX}"
539
MESSAGE(STATUS "Building utility programs")