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(EXAMPLES "Build example programs" ON)
43 OPTION(ALSOFT_CONFIG "Install alsoft.conf configuration file" OFF)
48 ADD_DEFINITIONS("-D_WIN32")
53 SET(LIB_MAJOR_VERSION "1")
54 SET(LIB_MINOR_VERSION "12")
55 SET(LIB_BUILD_VERSION "854")
56 SET(LIB_VERSION "${LIB_MAJOR_VERSION}.${LIB_MINOR_VERSION}.${LIB_BUILD_VERSION}")
59 CHECK_TYPE_SIZE("long" SIZEOF_LONG)
60 CHECK_TYPE_SIZE("long long" SIZEOF_LONG_LONG)
61 CHECK_TYPE_SIZE("unsigned int" SIZEOF_UINT)
62 CHECK_TYPE_SIZE("void*" SIZEOF_VOIDP)
65 # Add definitions, compiler switches, etc.
66 INCLUDE_DIRECTORIES(OpenAL32/Include include "${OpenAL_BINARY_DIR}")
68 IF(NOT CMAKE_BUILD_TYPE)
69 SET(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING
70 "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel."
73 IF(NOT CMAKE_DEBUG_POSTFIX)
74 SET(CMAKE_DEBUG_POSTFIX "" CACHE STRING
75 "Library postfix for debug builds. Normally left blank."
81 SET(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -D_DEBUG")
82 SET(CMAKE_C_FLAGS_MINSIZEREL "${CMAKE_C_FLAGS_MINSIZEREL} -DNDEBUG")
83 SET(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -DNDEBUG")
84 SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -D_DEBUG")
85 ADD_DEFINITIONS(-D_CRT_SECURE_NO_WARNINGS)
86 ADD_DEFINITIONS(-D_CRT_NONSTDC_NO_DEPRECATE)
89 STRING(REGEX REPLACE "\\\\" "/" DXSDK_DIR "$ENV{DXSDK_DIR}")
91 STRING(REGEX REPLACE "\\\\" "/" DXSDK_DIR "${DXSDK_DIR}")
94 MESSAGE(STATUS "Using DirectX SDK directory: ${DXSDK_DIR}")
95 SET(CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES} "${DXSDK_DIR}/Include")
96 INCLUDE_DIRECTORIES("${DXSDK_DIR}/Include")
97 LINK_DIRECTORIES("${DXSDK_DIR}/Lib")
101 ADD_DEFINITIONS(-Wall)
102 CHECK_C_COMPILER_FLAG(-Wextra HAVE_W_EXTRA)
104 ADD_DEFINITIONS(-Wextra)
108 ADD_DEFINITIONS(-Werror)
111 SET(CMAKE_C_FLAGS_RELWITHDEBINFO "-g -O2 -funroll-loops -D_DEBUG" CACHE STRING
112 "Flags used by the compiler during Release with Debug Info builds."
114 SET(CMAKE_C_FLAGS_MINSIZEREL "-Os -DNDEBUG" CACHE STRING
115 "Flags used by the compiler during release minsize builds."
117 SET(CMAKE_C_FLAGS_RELEASE "-O2 -funroll-loops -fomit-frame-pointer -DNDEBUG" CACHE STRING
118 "Flags used by the compiler during release builds"
120 SET(CMAKE_C_FLAGS_DEBUG "-g3 -D_DEBUG" CACHE STRING
121 "Flags used by the compiler during debug builds."
124 # Set visibility options if available
126 CHECK_C_SOURCE_COMPILES("int foo() __attribute__((destructor));
127 int main() {return 0;}" HAVE_GCC_DESTRUCTOR)
129 CHECK_C_COMPILER_FLAG(-fvisibility=hidden HAVE_VISIBILITY_SWITCH)
130 IF(HAVE_VISIBILITY_SWITCH)
131 CHECK_C_SOURCE_COMPILES("int foo() __attribute__((visibility(\"default\")));
132 int main() {return 0;}" HAVE_GCC_VISIBILITY)
133 IF(HAVE_GCC_VISIBILITY)
134 ADD_DEFINITIONS(-fvisibility=hidden -DHAVE_GCC_VISIBILITY)
140 CHECK_C_SOURCE_COMPILES("int foo(const char *str, ...) __attribute__((format(printf, 1, 2)));
141 int main() {return 0;}" HAVE_GCC_FORMAT)
143 CHECK_INCLUDE_FILE(fenv.h HAVE_FENV_H)
144 CHECK_INCLUDE_FILE(float.h HAVE_FLOAT_H)
146 CHECK_LIBRARY_EXISTS(m powf "" HAVE_POWF)
147 CHECK_LIBRARY_EXISTS(m sqrtf "" HAVE_SQRTF)
148 CHECK_LIBRARY_EXISTS(m acosf "" HAVE_ACOSF)
149 CHECK_LIBRARY_EXISTS(m atanf "" HAVE_ATANF)
150 CHECK_LIBRARY_EXISTS(m fabsf "" HAVE_FABSF)
152 CHECK_LIBRARY_EXISTS(m fesetround "" HAVE_FESETROUND)
154 IF(HAVE_SQRTF OR HAVE_ACOSF OR HAVE_ATANF OR HAVE_FABSF OR HAVE_FESETROUND)
155 SET(EXTRA_LIBS m ${EXTRA_LIBS})
157 CHECK_FUNCTION_EXISTS(strtof HAVE_STRTOF)
158 CHECK_FUNCTION_EXISTS(_controlfp HAVE__CONTROLFP)
160 CHECK_FUNCTION_EXISTS(stat HAVE_STAT)
161 CHECK_FUNCTION_EXISTS(strcasecmp HAVE_STRCASECMP)
162 IF(NOT HAVE_STRCASECMP)
163 CHECK_FUNCTION_EXISTS(_stricmp HAVE__STRICMP)
164 IF(NOT HAVE__STRICMP)
165 MESSAGE(FATAL_ERROR "No case-insensitive compare function found, please report!")
168 ADD_DEFINITIONS(-Dstrcasecmp=_stricmp)
171 CHECK_FUNCTION_EXISTS(strncasecmp HAVE_STRNCASECMP)
172 IF(NOT HAVE_STRNCASECMP)
173 CHECK_FUNCTION_EXISTS(_strnicmp HAVE__STRNICMP)
174 IF(NOT HAVE__STRNICMP)
175 MESSAGE(FATAL_ERROR "No case-insensitive size-limitted compare function found, please report!")
178 ADD_DEFINITIONS(-Dstrncasecmp=_strnicmp)
181 CHECK_FUNCTION_EXISTS(snprintf HAVE_SNPRINTF)
182 IF(NOT HAVE_SNPRINTF)
183 CHECK_FUNCTION_EXISTS(_snprintf HAVE__SNPRINTF)
184 IF(NOT HAVE__SNPRINTF)
185 MESSAGE(FATAL_ERROR "No snprintf function found, please report!")
188 ADD_DEFINITIONS(-Dsnprintf=_snprintf)
191 CHECK_FUNCTION_EXISTS(vsnprintf HAVE_VSNPRINTF)
192 IF(NOT HAVE_VSNPRINTF)
193 CHECK_FUNCTION_EXISTS(_vsnprintf HAVE__VSNPRINTF)
194 IF(NOT HAVE__VSNPRINTF)
195 MESSAGE(FATAL_ERROR "No vsnprintf function found, please report!")
198 ADD_DEFINITIONS(-Dvsnprintf=_vsnprintf)
201 CHECK_SYMBOL_EXISTS(isnan math.h HAVE_ISNAN)
203 CHECK_FUNCTION_EXISTS(_isnan HAVE__ISNAN)
205 MESSAGE(FATAL_ERROR "No isnan function found, please report!")
208 ADD_DEFINITIONS(-Disnan=_isnan)
212 # Check for the dlopen API (for dynamicly loading backend libs)
214 CHECK_INCLUDE_FILE(dlfcn.h HAVE_DLFCN_H)
216 CHECK_LIBRARY_EXISTS(dl dlopen "" HAVE_LIBDL)
218 SET(EXTRA_LIBS dl ${EXTRA_LIBS})
223 # Check if we have Windows headers
224 CHECK_INCLUDE_FILE(windows.h HAVE_WINDOWS_H -D_WIN32_WINNT=0x0500)
225 IF(NOT HAVE_WINDOWS_H)
226 CHECK_FUNCTION_EXISTS(gettimeofday HAVE_GETTIMEOFDAY)
227 IF(NOT HAVE_GETTIMEOFDAY)
228 MESSAGE(FATAL_ERROR "No timing function found!")
231 CHECK_FUNCTION_EXISTS(nanosleep HAVE_NANOSLEEP)
232 IF(NOT HAVE_NANOSLEEP)
233 MESSAGE(FATAL_ERROR "No sleep function found!")
236 CHECK_C_COMPILER_FLAG(-pthread HAVE_PTHREAD)
238 ADD_DEFINITIONS(-pthread)
239 SET(EXTRA_LIBS ${EXTRA_LIBS} -pthread)
242 # We need pthreads outside of Windows
243 CHECK_INCLUDE_FILE(pthread.h HAVE_PTHREAD_H)
244 IF(NOT HAVE_PTHREAD_H)
245 MESSAGE(FATAL_ERROR "PThreads is required for non-Windows builds!")
247 # Some systems need pthread_np.h to get recursive mutexes
248 CHECK_INCLUDE_FILES("pthread.h;pthread_np.h" HAVE_PTHREAD_NP_H)
250 # _GNU_SOURCE is needed on some systems for extra attributes, and
251 # _REENTRANT is needed for libc thread-safety
252 ADD_DEFINITIONS(-D_GNU_SOURCE=1)
253 CHECK_LIBRARY_EXISTS(pthread pthread_create "" HAVE_LIBPTHREAD)
255 SET(EXTRA_LIBS pthread ${EXTRA_LIBS})
258 CHECK_LIBRARY_EXISTS(pthread pthread_setschedparam "" HAVE_PTHREAD_SETSCHEDPARAM)
260 CHECK_LIBRARY_EXISTS(rt clock_gettime "" HAVE_LIBRT)
262 SET(EXTRA_LIBS rt ${EXTRA_LIBS})
266 # Check for a 64-bit type
267 CHECK_INCLUDE_FILE(stdint.h HAVE_STDINT_H)
268 IF(NOT HAVE_STDINT_H)
270 CHECK_C_SOURCE_COMPILES("\#define _WIN32_WINNT 0x0500
271 \#include <windows.h>
273 int main() {return 0;}" HAVE___INT64)
276 IF(NOT SIZEOF_LONG MATCHES "8")
277 IF(NOT SIZEOF_LONG_LONG MATCHES "8")
278 MESSAGE(FATAL_ERROR "No 64-bit types found, please report!")
285 # Windows needs winmm for timeGetTime, even if the backend is disabled
286 CHECK_SHARED_LIBRARY_EXISTS(winmm timeGetTime 0 "" HAVE_LIBWINMM)
288 SET(EXTRA_LIBS winmm ${EXTRA_LIBS})
293 SET(OPENAL_OBJS OpenAL32/alAuxEffectSlot.c
295 OpenAL32/alDatabuffer.c
298 OpenAL32/alExtension.c
300 OpenAL32/alListener.c
305 SET(ALC_OBJS Alc/ALc.c
321 CHECK_INCLUDE_FILE(alsa/asoundlib.h HAVE_ALSA_ASOUNDLIB_H)
322 IF(HAVE_ALSA_ASOUNDLIB_H)
323 CHECK_SHARED_LIBRARY_EXISTS(asound snd_pcm_open 4 "" HAVE_LIBASOUND)
324 IF(HAVE_LIBASOUND OR HAVE_DLFCN_H OR WIN32)
326 SET(ALC_OBJS ${ALC_OBJS} Alc/alsa.c)
327 IF(HAVE_DLFCN_H OR WIN32)
328 SET(BACKENDS "${BACKENDS} ALSA,")
330 SET(BACKENDS "${BACKENDS} ALSA \(linked\),")
331 SET(EXTRA_LIBS asound ${EXTRA_LIBS})
339 CHECK_INCLUDE_FILE(sys/soundcard.h HAVE_SYS_SOUNDCARD_H)
340 IF(HAVE_SYS_SOUNDCARD_H)
342 SET(ALC_OBJS ${ALC_OBJS} Alc/oss.c)
343 SET(BACKENDS "${BACKENDS} OSS,")
347 # Check Solaris backend
349 CHECK_INCLUDE_FILE(sys/audioio.h HAVE_SYS_AUDIOIO_H)
350 IF(HAVE_SYS_AUDIOIO_H)
352 SET(ALC_OBJS ${ALC_OBJS} Alc/solaris.c)
353 SET(BACKENDS "${BACKENDS} Solaris,")
357 # Check DSound/MMSystem backend
359 CHECK_INCLUDE_FILE(dsound.h HAVE_DSOUND_H)
361 CHECK_SHARED_LIBRARY_EXISTS(dsound DirectSoundCreate 3 "" HAVE_LIBDSOUND)
362 IF(HAVE_LIBDSOUND OR HAVE_DLFCN_H OR WIN32)
364 SET(ALC_OBJS ${ALC_OBJS} Alc/dsound.c)
366 IF(HAVE_DLFCN_H OR WIN32)
367 SET(BACKENDS "${BACKENDS} DirectSound,")
369 SET(BACKENDS "${BACKENDS} DirectSound \(linked\),")
370 SET(EXTRA_LIBS dsound ${EXTRA_LIBS})
377 CHECK_INCLUDE_FILES("windows.h;mmsystem.h" HAVE_MMSYSTEM_H -D_WIN32_WINNT=0x0500)
379 CHECK_SHARED_LIBRARY_EXISTS(winmm waveInOpen 6 "" HAVE_LIBWINMM)
382 SET(ALC_OBJS ${ALC_OBJS} Alc/winmm.c)
383 SET(BACKENDS "${BACKENDS} WinMM,")
385 SET(EXTRA_LIBS winmm ${EXTRA_LIBS})
391 # Check PortAudio backend
393 CHECK_INCLUDE_FILE(portaudio.h HAVE_PORTAUDIO_H)
395 CHECK_SHARED_LIBRARY_EXISTS(portaudio Pa_Initialize 0 "" HAVE_LIBPORTAUDIO)
396 IF(HAVE_LIBPORTAUDIO OR HAVE_DLFCN_H OR WIN32)
397 SET(HAVE_PORTAUDIO 1)
398 SET(ALC_OBJS ${ALC_OBJS} Alc/portaudio.c)
399 IF(HAVE_DLFCN_H OR WIN32)
400 SET(BACKENDS "${BACKENDS} PortAudio,")
402 SET(BACKENDS "${BACKENDS} PortAudio \(linked\),")
403 SET(EXTRA_LIBS portaudio ${EXTRA_LIBS})
409 # Check PortAudio backend
411 CHECK_INCLUDE_FILE(pulse/pulseaudio.h HAVE_PULSE_PULSEAUDIO_H)
412 IF(HAVE_PULSE_PULSEAUDIO_H)
413 CHECK_SHARED_LIBRARY_EXISTS(pulse pa_context_new 2 "" HAVE_LIBPULSE)
414 IF(HAVE_LIBPULSE OR HAVE_DLFCN_H OR WIN32)
415 SET(HAVE_PULSEAUDIO 1)
416 SET(ALC_OBJS ${ALC_OBJS} Alc/pulseaudio.c)
417 IF(HAVE_DLFCN_H OR WIN32)
418 SET(BACKENDS "${BACKENDS} PulseAudio,")
420 SET(BACKENDS "${BACKENDS} PulseAudio \(linked\),")
421 SET(EXTRA_LIBS pulse ${EXTRA_LIBS})
427 # Optionally enable the Wave Writer backend
430 SET(ALC_OBJS ${ALC_OBJS} Alc/wave.c)
431 SET(BACKENDS "${BACKENDS} WaveFile,")
434 # This is always available
435 SET(BACKENDS "${BACKENDS} Null")
437 # Needed for openal.pc.in
438 SET(prefix ${CMAKE_INSTALL_PREFIX})
439 SET(exec_prefix "\${prefix}")
440 SET(libdir "\${exec_prefix}/lib${LIB_SUFFIX}")
441 SET(bindir "\${exec_prefix}/bin")
442 SET(includedir "\${prefix}/include")
443 SET(PACKAGE_VERSION "${LIB_VERSION}")
447 "${OpenAL_SOURCE_DIR}/config.h.in"
448 "${OpenAL_BINARY_DIR}/config.h")
450 "${OpenAL_SOURCE_DIR}/openal.pc.in"
451 "${OpenAL_BINARY_DIR}/openal.pc"
458 ADD_LIBRARY(${LIBNAME} ${LIBTYPE} ${OPENAL_OBJS} ${ALC_OBJS})
459 SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES DEFINE_SYMBOL AL_BUILD_LIBRARY
460 COMPILE_FLAGS -DAL_ALEXT_PROTOTYPES
461 VERSION ${LIB_VERSION}
462 SOVERSION ${LIB_MAJOR_VERSION})
464 SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES PREFIX "")
467 TARGET_LINK_LIBRARIES(${LIBNAME} ${EXTRA_LIBS})
469 # Add an install target here
470 INSTALL(TARGETS ${LIBNAME}
471 RUNTIME DESTINATION bin
472 LIBRARY DESTINATION "lib${LIB_SUFFIX}"
473 ARCHIVE DESTINATION "lib${LIB_SUFFIX}"
475 INSTALL(FILES include/AL/al.h
479 include/AL/efx-creative.h
480 DESTINATION include/AL
482 INSTALL(FILES "${OpenAL_BINARY_DIR}/openal.pc"
483 DESTINATION "lib${LIB_SUFFIX}/pkgconfig")
485 # Install alsoft.conf configuration file
487 INSTALL(FILES alsoftrc.sample
488 DESTINATION /etc/openal
494 ADD_EXECUTABLE(openal-info examples/openal-info.c)
495 TARGET_LINK_LIBRARIES(openal-info ${LIBNAME})
496 INSTALL(TARGETS openal-info
497 RUNTIME DESTINATION bin
498 LIBRARY DESTINATION "lib${LIB_SUFFIX}"
499 ARCHIVE DESTINATION "lib${LIB_SUFFIX}"
504 MESSAGE(STATUS "Building OpenAL with support for the following backends:")
505 MESSAGE(STATUS " ${BACKENDS}")
510 MESSAGE(STATUS "WARNING: Building the Windows version without DirectSound output")
511 MESSAGE(STATUS " This is probably NOT what you want!")