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(CheckSharedFunctionExists)
14 INCLUDE(CheckIncludeFile)
15 INCLUDE(CheckIncludeFiles)
16 INCLUDE(CheckSymbolExists)
17 INCLUDE(CheckCCompilerFlag)
18 INCLUDE(CheckCSourceCompiles)
19 INCLUDE(CheckTypeSize)
20 INCLUDE(FindPkgConfig)
26 SET(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS TRUE)
29 OPTION(SSE "Check for SSE CPU extensions" ON)
30 OPTION(NEON "Check for ARM Neon CPU extensions" ON)
32 OPTION(REQUIRE_SSE "Require SSE CPU extensions" OFF)
33 OPTION(REQUIRE_NEON "Require ARM Neon CPU extensions" OFF)
36 OPTION(ALSA "Check for ALSA backend" ON)
37 OPTION(OSS "Check for OSS backend" ON)
38 OPTION(SOLARIS "Check for Solaris backend" ON)
39 OPTION(SNDIO "Check for SndIO backend" ON)
40 OPTION(MMDEVAPI "Check for MMDevApi" ON)
41 OPTION(DSOUND "Check for DirectSound backend" ON)
42 OPTION(WINMM "Check for Windows Multimedia backend" ON)
43 OPTION(PORTAUDIO "Check for PortAudio backend" ON)
44 OPTION(PULSEAUDIO "Check for PulseAudio backend" ON)
45 OPTION(COREAUDIO "Check for CoreAudio backend" ON)
46 OPTION(OPENSL "Check for OpenSL backend" ON)
47 OPTION(WAVE "Enable Wave Writer backend" ON)
49 OPTION(REQUIRE_ALSA "Require ALSA backend" OFF)
50 OPTION(REQUIRE_OSS "Require OSS backend" OFF)
51 OPTION(REQUIRE_SOLARIS "Require Solaris backend" OFF)
52 OPTION(REQUIRE_SNDIO "Require SndIO backend" OFF)
53 OPTION(REQUIRE_MMDEVAPI "Require MMDevApi" OFF)
54 OPTION(REQUIRE_DSOUND "Require DirectSound backend" OFF)
55 OPTION(REQUIRE_WINMM "Require Windows Multimedia backend" OFF)
56 OPTION(REQUIRE_PORTAUDIO "Require PortAudio backend" OFF)
57 OPTION(REQUIRE_PULSEAUDIO "Require PulseAudio backend" OFF)
58 OPTION(REQUIRE_COREAUDIO "Require CoreAudio backend" OFF)
59 OPTION(REQUIRE_OPENSL "Require OpenSL backend" OFF)
61 OPTION(DLOPEN "Check for the dlopen API for loading optional libs" ON)
63 OPTION(WERROR "Treat compile warnings as errors" OFF)
65 OPTION(UTILS "Build and install utility programs" ON)
67 OPTION(EXAMPLES "Build and install example programs" ON)
69 OPTION(ALSOFT_CONFIG "Install alsoft.conf configuration file" OFF)
74 ADD_DEFINITIONS("-D_WIN32 -D_WIN32_WINNT=0x0501")
83 SET(LIB_MAJOR_VERSION "1")
84 SET(LIB_MINOR_VERSION "14")
85 SET(LIB_VERSION "${LIB_MAJOR_VERSION}.${LIB_MINOR_VERSION}")
90 CHECK_TYPE_SIZE("long" SIZEOF_LONG)
91 CHECK_TYPE_SIZE("long long" SIZEOF_LONG_LONG)
94 CHECK_C_SOURCE_COMPILES("int *restrict foo;
95 int main() {return 0;}" HAVE_RESTRICT)
96 CHECK_C_SOURCE_COMPILES("int *__restrict foo;
97 int main() {return 0;}" HAVE___RESTRICT)
100 # Add definitions, compiler switches, etc.
101 INCLUDE_DIRECTORIES(OpenAL32/Include include "${OpenAL_BINARY_DIR}")
103 IF(NOT CMAKE_BUILD_TYPE)
104 SET(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING
105 "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel."
108 IF(NOT CMAKE_DEBUG_POSTFIX)
109 SET(CMAKE_DEBUG_POSTFIX "" CACHE STRING
110 "Library postfix for debug builds. Normally left blank."
116 SET(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -D_DEBUG")
117 SET(CMAKE_C_FLAGS_MINSIZEREL "${CMAKE_C_FLAGS_MINSIZEREL} -DNDEBUG")
118 SET(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -DNDEBUG")
119 SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -D_DEBUG")
120 ADD_DEFINITIONS(-D_CRT_SECURE_NO_WARNINGS)
121 ADD_DEFINITIONS(-D_CRT_NONSTDC_NO_DEPRECATE)
124 STRING(REGEX REPLACE "\\\\" "/" DXSDK_DIR "$ENV{DXSDK_DIR}")
126 STRING(REGEX REPLACE "\\\\" "/" DXSDK_DIR "${DXSDK_DIR}")
129 MESSAGE(STATUS "Using DirectX SDK directory: ${DXSDK_DIR}")
130 SET(CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES} "${DXSDK_DIR}/Include")
131 INCLUDE_DIRECTORIES("${DXSDK_DIR}/Include")
132 LINK_DIRECTORIES("${DXSDK_DIR}/Lib")
135 OPTION(FORCE_STATIC_VCRT "Force /MT for static VC runtimes" OFF)
136 IF(FORCE_STATIC_VCRT)
138 CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE
139 CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO)
140 IF(${flag_var} MATCHES "/MD")
141 STRING(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}")
146 ADD_DEFINITIONS(-Winline -Wall)
147 CHECK_C_COMPILER_FLAG(-Wextra HAVE_W_EXTRA)
149 ADD_DEFINITIONS(-Wextra)
153 ADD_DEFINITIONS(-Werror)
156 SET(CMAKE_C_FLAGS_RELWITHDEBINFO "-g -O2 -D_DEBUG" CACHE STRING
157 "Flags used by the compiler during Release with Debug Info builds."
159 SET(CMAKE_C_FLAGS_MINSIZEREL "-Os -DNDEBUG" CACHE STRING
160 "Flags used by the compiler during release minsize builds."
162 SET(CMAKE_C_FLAGS_RELEASE "-O2 -fomit-frame-pointer -DNDEBUG" CACHE STRING
163 "Flags used by the compiler during release builds"
165 SET(CMAKE_C_FLAGS_DEBUG "-g3 -D_DEBUG" CACHE STRING
166 "Flags used by the compiler during debug builds."
169 CHECK_C_SOURCE_COMPILES("int foo() __attribute__((destructor));
170 int main() {return 0;}" HAVE_GCC_DESTRUCTOR)
173 # Set visibility/export options if available
175 SET(EXPORT_DECL "__declspec(dllexport)")
177 OPTION(WINE "Enable use of Wine headers when compiling" OFF)
179 FIND_PATH(WINE_INCLUDE_DIR library.h
182 /usr/local/include/wine
183 CMAKE_FIND_ROOT_PATH_BOTH)
185 MESSAGE(STATUS "Found Wine header files - ${WINE_INCLUDE_DIR}" )
186 INCLUDE_DIRECTORIES("${WINE_INCLUDE_DIR}/windows")
187 SET(CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES} "${WINE_INCLUDE_DIR}/windows")
189 MESSAGE(STATUS "Could not find Wine header files" )
193 SET(OLD_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}")
194 # Yes GCC, really don't accept visibility modes you don't support
195 SET(CMAKE_REQUIRED_FLAGS "${OLD_REQUIRED_FLAGS} -Wattributes -Werror")
197 CHECK_C_SOURCE_COMPILES("int foo() __attribute__((visibility(\"protected\")));
198 int main() {return 0;}" HAVE_GCC_PROTECTED_VISIBILITY)
199 IF(HAVE_GCC_PROTECTED_VISIBILITY)
200 SET(EXPORT_DECL "__attribute__((visibility(\"protected\")))")
202 CHECK_C_SOURCE_COMPILES("int foo() __attribute__((visibility(\"default\")));
203 int main() {return 0;}" HAVE_GCC_DEFAULT_VISIBILITY)
204 IF(HAVE_GCC_DEFAULT_VISIBILITY)
205 SET(EXPORT_DECL "__attribute__((visibility(\"default\")))")
209 IF(HAVE_GCC_PROTECTED_VISIBILITY OR HAVE_GCC_DEFAULT_VISIBILITY)
210 CHECK_C_COMPILER_FLAG(-fvisibility=internal HAVE_VISIBILITY_INTERNAL_SWITCH)
211 IF(HAVE_VISIBILITY_INTERNAL_SWITCH)
212 ADD_DEFINITIONS(-fvisibility=internal)
214 CHECK_C_COMPILER_FLAG(-fvisibility=hidden HAVE_VISIBILITY_HIDDEN_SWITCH)
215 IF(HAVE_VISIBILITY_HIDDEN_SWITCH)
216 ADD_DEFINITIONS(-fvisibility=hidden)
221 SET(CMAKE_REQUIRED_FLAGS "${OLD_REQUIRED_FLAGS}")
224 CHECK_C_SOURCE_COMPILES("int foo(const char *str, ...) __attribute__((format(printf, 1, 2)));
225 int main() {return 0;}" HAVE_GCC_FORMAT)
227 CHECK_INCLUDE_FILE(cpuid.h HAVE_CPUID_H)
228 CHECK_INCLUDE_FILE(fenv.h HAVE_FENV_H)
229 CHECK_INCLUDE_FILE(fpu_control.h HAVE_FPU_CONTROL_H)
230 CHECK_INCLUDE_FILE(float.h HAVE_FLOAT_H)
231 CHECK_INCLUDE_FILE(ieeefp.h HAVE_IEEEFP_H)
232 CHECK_INCLUDE_FILE(guiddef.h HAVE_GUIDDEF_H)
233 IF(NOT HAVE_GUIDDEF_H)
234 CHECK_INCLUDE_FILE(initguid.h HAVE_INITGUID_H)
237 # Some systems need libm for some of the following math functions to work
238 CHECK_LIBRARY_EXISTS(m pow "" HAVE_LIBM)
240 SET(EXTRA_LIBS m ${EXTRA_LIBS})
241 SET(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} m)
245 CHECK_SYMBOL_EXISTS(powf math.h HAVE_POWF)
246 CHECK_SYMBOL_EXISTS(sqrtf math.h HAVE_SQRTF)
247 CHECK_SYMBOL_EXISTS(cosf math.h HAVE_COSF)
248 CHECK_SYMBOL_EXISTS(sinf math.h HAVE_SINF)
249 CHECK_SYMBOL_EXISTS(acosf math.h HAVE_ACOSF)
250 CHECK_SYMBOL_EXISTS(asinf math.h HAVE_ASINF)
251 CHECK_SYMBOL_EXISTS(atanf math.h HAVE_ATANF)
252 CHECK_SYMBOL_EXISTS(atan2f math.h HAVE_ATAN2F)
253 CHECK_SYMBOL_EXISTS(fabsf math.h HAVE_FABSF)
254 CHECK_SYMBOL_EXISTS(log10f math.h HAVE_LOG10F)
255 CHECK_SYMBOL_EXISTS(floorf math.h HAVE_FLOORF)
258 CHECK_SYMBOL_EXISTS(fesetround fenv.h HAVE_FESETROUND)
261 CHECK_FUNCTION_EXISTS(strtof HAVE_STRTOF)
262 CHECK_FUNCTION_EXISTS(_controlfp HAVE__CONTROLFP)
264 CHECK_FUNCTION_EXISTS(stat HAVE_STAT)
265 CHECK_FUNCTION_EXISTS(strcasecmp HAVE_STRCASECMP)
266 IF(NOT HAVE_STRCASECMP)
267 CHECK_FUNCTION_EXISTS(_stricmp HAVE__STRICMP)
268 IF(NOT HAVE__STRICMP)
269 MESSAGE(FATAL_ERROR "No case-insensitive compare function found, please report!")
272 ADD_DEFINITIONS(-Dstrcasecmp=_stricmp)
275 CHECK_FUNCTION_EXISTS(strncasecmp HAVE_STRNCASECMP)
276 IF(NOT HAVE_STRNCASECMP)
277 CHECK_FUNCTION_EXISTS(_strnicmp HAVE__STRNICMP)
278 IF(NOT HAVE__STRNICMP)
279 MESSAGE(FATAL_ERROR "No case-insensitive size-limitted compare function found, please report!")
282 ADD_DEFINITIONS(-Dstrncasecmp=_strnicmp)
285 CHECK_FUNCTION_EXISTS(snprintf HAVE_SNPRINTF)
286 IF(NOT HAVE_SNPRINTF)
287 CHECK_FUNCTION_EXISTS(_snprintf HAVE__SNPRINTF)
288 IF(NOT HAVE__SNPRINTF)
289 MESSAGE(FATAL_ERROR "No snprintf function found, please report!")
292 ADD_DEFINITIONS(-Dsnprintf=_snprintf)
295 CHECK_FUNCTION_EXISTS(vsnprintf HAVE_VSNPRINTF)
296 IF(NOT HAVE_VSNPRINTF)
297 CHECK_FUNCTION_EXISTS(_vsnprintf HAVE__VSNPRINTF)
298 IF(NOT HAVE__VSNPRINTF)
299 MESSAGE(FATAL_ERROR "No vsnprintf function found, please report!")
302 ADD_DEFINITIONS(-Dvsnprintf=_vsnprintf)
305 CHECK_SYMBOL_EXISTS(isfinite math.h HAVE_ISFINITE)
306 IF(NOT HAVE_ISFINITE)
307 CHECK_FUNCTION_EXISTS(finite HAVE_FINITE)
309 CHECK_FUNCTION_EXISTS(_finite HAVE__FINITE)
311 MESSAGE(FATAL_ERROR "No isfinite function found, please report!")
313 ADD_DEFINITIONS(-Disfinite=_finite)
315 ADD_DEFINITIONS(-Disfinite=finite)
319 CHECK_SYMBOL_EXISTS(isnan math.h HAVE_ISNAN)
321 CHECK_FUNCTION_EXISTS(_isnan HAVE__ISNAN)
323 MESSAGE(FATAL_ERROR "No isnan function found, please report!")
326 ADD_DEFINITIONS(-Disnan=_isnan)
330 # Check for the dlopen API (for dynamicly loading backend libs)
332 CHECK_INCLUDE_FILE(dlfcn.h HAVE_DLFCN_H)
334 CHECK_LIBRARY_EXISTS(dl dlopen "" HAVE_LIBDL)
336 SET(EXTRA_LIBS dl ${EXTRA_LIBS})
341 # Check if we have Windows headers
342 CHECK_INCLUDE_FILE(windows.h HAVE_WINDOWS_H -D_WIN32_WINNT=0x0501)
343 IF(NOT HAVE_WINDOWS_H)
344 CHECK_FUNCTION_EXISTS(gettimeofday HAVE_GETTIMEOFDAY)
345 IF(NOT HAVE_GETTIMEOFDAY)
346 MESSAGE(FATAL_ERROR "No timing function found!")
349 CHECK_FUNCTION_EXISTS(nanosleep HAVE_NANOSLEEP)
350 IF(NOT HAVE_NANOSLEEP)
351 MESSAGE(FATAL_ERROR "No sleep function found!")
354 CHECK_C_COMPILER_FLAG(-pthread HAVE_PTHREAD)
356 ADD_DEFINITIONS(-pthread)
357 SET(EXTRA_LIBS ${EXTRA_LIBS} -pthread)
360 # We need pthreads outside of Windows
361 CHECK_INCLUDE_FILE(pthread.h HAVE_PTHREAD_H)
362 IF(NOT HAVE_PTHREAD_H)
363 MESSAGE(FATAL_ERROR "PThreads is required for non-Windows builds!")
365 # Some systems need pthread_np.h to get recursive mutexes
366 CHECK_INCLUDE_FILES("pthread.h;pthread_np.h" HAVE_PTHREAD_NP_H)
368 # _GNU_SOURCE is needed on some systems for extra attributes
369 ADD_DEFINITIONS(-D_GNU_SOURCE=1)
370 CHECK_LIBRARY_EXISTS(pthread pthread_create "" HAVE_LIBPTHREAD)
372 SET(EXTRA_LIBS pthread ${EXTRA_LIBS})
375 CHECK_LIBRARY_EXISTS(pthread pthread_setschedparam "" HAVE_PTHREAD_SETSCHEDPARAM)
377 CHECK_LIBRARY_EXISTS(rt clock_gettime "" HAVE_LIBRT)
379 SET(EXTRA_LIBS rt ${EXTRA_LIBS})
383 # Check for a 64-bit type
384 CHECK_INCLUDE_FILE(stdint.h HAVE_STDINT_H)
385 IF(NOT HAVE_STDINT_H)
387 CHECK_C_SOURCE_COMPILES("\#define _WIN32_WINNT 0x0501
388 \#include <windows.h>
390 int main() {return 0;}" HAVE___INT64)
393 IF(NOT SIZEOF_LONG MATCHES "8")
394 IF(NOT SIZEOF_LONG_LONG MATCHES "8")
395 MESSAGE(FATAL_ERROR "No 64-bit types found, please report!")
401 # Windows needs winmm for timeGetTime, even if the backend is disabled
402 CHECK_SHARED_FUNCTION_EXISTS(timeGetTime "windows.h;mmsystem.h" winmm "" HAVE_LIBWINMM)
404 SET(EXTRA_LIBS winmm ${EXTRA_LIBS})
405 SET(PKG_CONFIG_LIBS ${PKG_CONFIG_LIBS} -lwinmm)
409 SET(OPENAL_OBJS OpenAL32/alAuxEffectSlot.c
413 OpenAL32/alExtension.c
415 OpenAL32/alListener.c
420 SET(ALC_OBJS Alc/ALc.c
438 SET(CPU_EXTS "Default")
442 # Check for SSE support
444 CHECK_INCLUDE_FILE(xmmintrin.h HAVE_XMMINTRIN_H)
447 SET(ALC_OBJS ${ALC_OBJS} Alc/mixer_sse.c)
448 SET(CPU_EXTS "${CPU_EXTS}, SSE")
451 IF(REQUIRE_SSE AND NOT HAVE_SSE)
452 MESSAGE(FATAL_ERROR "Failed to enabled required SSE CPU extensions")
455 # Check for ARM Neon support
457 CHECK_INCLUDE_FILE(arm_neon.h HAVE_ARM_NEON_H)
460 SET(ALC_OBJS ${ALC_OBJS} Alc/mixer_neon.c)
461 SET(CPU_EXTS "${CPU_EXTS}, Neon")
464 IF(REQUIRE_NEON AND NOT HAVE_NEON)
465 MESSAGE(FATAL_ERROR "Failed to enabled required ARM Neon CPU extensions")
469 SET(ALC_OBJS ${ALC_OBJS}
470 # Default backends, always available
471 Alc/backends/loopback.c
483 SET(HAVE_PORTAUDIO 0)
484 SET(HAVE_PULSEAUDIO 0)
485 SET(HAVE_COREAUDIO 0)
491 CHECK_INCLUDE_FILE(alsa/asoundlib.h HAVE_ALSA_ASOUNDLIB_H)
492 IF(HAVE_ALSA_ASOUNDLIB_H)
493 CHECK_SHARED_FUNCTION_EXISTS(snd_pcm_open "alsa/asoundlib.h" asound "" HAVE_LIBASOUND)
494 IF(HAVE_LIBASOUND OR HAVE_DLFCN_H OR WIN32)
496 SET(ALC_OBJS ${ALC_OBJS} Alc/backends/alsa.c)
497 IF(HAVE_DLFCN_H OR WIN32)
498 SET(BACKENDS "${BACKENDS} ALSA,")
500 SET(BACKENDS "${BACKENDS} ALSA \(linked\),")
501 SET(EXTRA_LIBS asound ${EXTRA_LIBS})
506 IF(REQUIRE_ALSA AND NOT HAVE_ALSA)
507 MESSAGE(FATAL_ERROR "Failed to enabled required ALSA backend")
512 CHECK_INCLUDE_FILE(sys/soundcard.h HAVE_SYS_SOUNDCARD_H)
513 IF(HAVE_SYS_SOUNDCARD_H)
515 SET(ALC_OBJS ${ALC_OBJS} Alc/backends/oss.c)
516 SET(BACKENDS "${BACKENDS} OSS,")
519 IF(REQUIRE_OSS AND NOT HAVE_OSS)
520 MESSAGE(FATAL_ERROR "Failed to enabled required OSS backend")
523 # Check Solaris backend
525 CHECK_INCLUDE_FILE(sys/audioio.h HAVE_SYS_AUDIOIO_H)
526 IF(HAVE_SYS_AUDIOIO_H)
528 SET(ALC_OBJS ${ALC_OBJS} Alc/backends/solaris.c)
529 SET(BACKENDS "${BACKENDS} Solaris,")
532 IF(REQUIRE_SOLARIS AND NOT HAVE_SOLARIS)
533 MESSAGE(FATAL_ERROR "Failed to enabled required Solaris backend")
536 # Check SndIO backend
538 CHECK_INCLUDE_FILE(sndio.h HAVE_SNDIO_H)
540 CHECK_SHARED_FUNCTION_EXISTS(sio_open "sndio.h" sndio "" HAVE_LIBSNDIO)
541 IF(HAVE_LIBSNDIO OR HAVE_DLFCN_H OR WIN32)
543 SET(ALC_OBJS ${ALC_OBJS} Alc/backends/sndio.c)
544 IF(HAVE_DLFCN_H OR WIN32)
545 SET(BACKENDS "${BACKENDS} SndIO,")
547 SET(BACKENDS "${BACKENDS} SndIO \(linked\),")
548 SET(EXTRA_LIBS sndio ${EXTRA_LIBS})
553 IF(REQUIRE_SNDIO AND NOT HAVE_SNDIO)
554 MESSAGE(FATAL_ERROR "Failed to enabled required SndIO backend")
557 # Check for MMDevApi backend
560 CHECK_INCLUDE_FILE(mmdeviceapi.h HAVE_MMDEVICEAPI_H)
561 IF(HAVE_MMDEVICEAPI_H)
563 SET(ALC_OBJS ${ALC_OBJS} Alc/backends/mmdevapi.c)
565 SET(BACKENDS "${BACKENDS} MMDevApi,")
569 IF(REQUIRE_MMDEVAPI AND NOT HAVE_MMDEVAPI)
570 MESSAGE(FATAL_ERROR "Failed to enabled required MMDevApi backend")
573 # Check DSound/MMSystem backend
575 CHECK_INCLUDE_FILE(dsound.h HAVE_DSOUND_H)
577 CHECK_SHARED_FUNCTION_EXISTS(DirectSoundCreate "dsound.h" dsound "" HAVE_LIBDSOUND)
578 IF(HAVE_LIBDSOUND OR HAVE_DLFCN_H OR WIN32)
580 SET(ALC_OBJS ${ALC_OBJS} Alc/backends/dsound.c)
582 IF(HAVE_DLFCN_H OR WIN32)
583 SET(BACKENDS "${BACKENDS} DirectSound,")
585 SET(BACKENDS "${BACKENDS} DirectSound \(linked\),")
586 SET(EXTRA_LIBS dsound ${EXTRA_LIBS})
591 IF(REQUIRE_DSOUND AND NOT HAVE_DSOUND)
592 MESSAGE(FATAL_ERROR "Failed to enabled required DSound backend")
597 CHECK_INCLUDE_FILES("windows.h;mmsystem.h" HAVE_MMSYSTEM_H -D_WIN32_WINNT=0x0501)
598 IF(HAVE_MMSYSTEM_H AND HAVE_LIBWINMM)
600 SET(ALC_OBJS ${ALC_OBJS} Alc/backends/winmm.c)
601 SET(BACKENDS "${BACKENDS} WinMM,")
605 IF(REQUIRE_WINMM AND NOT HAVE_WINMM)
606 MESSAGE(FATAL_ERROR "Failed to enabled required WinMM backend")
609 # Check PortAudio backend
611 CHECK_INCLUDE_FILE(portaudio.h HAVE_PORTAUDIO_H)
613 CHECK_SHARED_FUNCTION_EXISTS(Pa_Initialize "portaudio.h" portaudio "" HAVE_LIBPORTAUDIO)
614 IF(HAVE_LIBPORTAUDIO OR HAVE_DLFCN_H OR WIN32)
615 SET(HAVE_PORTAUDIO 1)
616 SET(ALC_OBJS ${ALC_OBJS} Alc/backends/portaudio.c)
617 IF(HAVE_DLFCN_H OR WIN32)
618 SET(BACKENDS "${BACKENDS} PortAudio,")
620 SET(BACKENDS "${BACKENDS} PortAudio \(linked\),")
621 SET(EXTRA_LIBS portaudio ${EXTRA_LIBS})
626 IF(REQUIRE_PORTAUDIO AND NOT HAVE_PORTAUDIO)
627 MESSAGE(FATAL_ERROR "Failed to enabled required PortAudio backend")
630 # Check PulseAudio backend
632 CHECK_INCLUDE_FILE(pulse/pulseaudio.h HAVE_PULSE_PULSEAUDIO_H)
633 IF(HAVE_PULSE_PULSEAUDIO_H)
634 CHECK_SHARED_FUNCTION_EXISTS(pa_context_new "pulse/pulseaudio.h" pulse "" HAVE_LIBPULSE)
635 IF(HAVE_LIBPULSE OR HAVE_DLFCN_H OR WIN32)
636 SET(HAVE_PULSEAUDIO 1)
637 SET(ALC_OBJS ${ALC_OBJS} Alc/backends/pulseaudio.c)
638 IF(HAVE_DLFCN_H OR WIN32)
639 SET(BACKENDS "${BACKENDS} PulseAudio,")
641 SET(BACKENDS "${BACKENDS} PulseAudio \(linked\),")
642 SET(EXTRA_LIBS pulse ${EXTRA_LIBS})
647 IF(REQUIRE_PULSEAUDIO AND NOT HAVE_PULSEAUDIO)
648 MESSAGE(FATAL_ERROR "Failed to enabled required PulseAudio backend")
651 # Check CoreAudio backend
653 CHECK_INCLUDE_FILE(/System/Library/Frameworks/CoreAudio.framework/Headers/CoreAudio.h HAVE_COREAUDIO_FRAMEWORK)
654 IF(HAVE_COREAUDIO_FRAMEWORK)
655 SET(HAVE_COREAUDIO 1)
656 SET(ALC_OBJS ${ALC_OBJS} Alc/backends/coreaudio.c)
657 SET(BACKENDS "${BACKENDS} CoreAudio,")
658 SET(EXTRA_LIBS /System/Library/Frameworks/CoreAudio.framework ${EXTRA_LIBS})
659 SET(EXTRA_LIBS /System/Library/Frameworks/AudioUnit.framework ${EXTRA_LIBS})
660 SET(EXTRA_LIBS /System/Library/Frameworks/ApplicationServices.framework ${EXTRA_LIBS})
662 # Some versions of OSX may need the AudioToolbox framework. Add it if
664 FIND_LIBRARY(AUDIOTOOLBOX_LIBRARY
666 PATHS ~/Library/Frameworks
668 /System/Library/Frameworks
670 IF(AUDIOTOOLBOX_LIBRARY)
671 SET(EXTRA_LIBS ${AUDIOTOOLBOX_LIBRARY} ${EXTRA_LIBS})
675 IF(REQUIRE_COREAUDIO AND NOT HAVE_COREAUDIO)
676 MESSAGE(FATAL_ERROR "Failed to enabled required CoreAudio backend")
679 # Check for OpenSL (Android) backend
681 CHECK_INCLUDE_FILES("SLES/OpenSLES.h;SLES/OpenSLES_Android.h" HAVE_SLES_OPENSLES_ANDROID_H)
682 IF(HAVE_SLES_OPENSLES_ANDROID_H)
683 CHECK_SHARED_FUNCTION_EXISTS(slCreateEngine "SLES/OpenSLES.h" OpenSLES "" HAVE_LIBOPENSLES)
686 SET(ALC_OBJS ${ALC_OBJS} Alc/backends/opensl.c)
687 SET(BACKENDS "${BACKENDS} OpenSL,")
688 SET(EXTRA_LIBS OpenSLES ${EXTRA_LIBS})
692 IF(REQUIRE_OPENSL AND NOT HAVE_OPENSL)
693 MESSAGE(FATAL_ERROR "Failed to enabled required OpenSL backend")
696 # Optionally enable the Wave Writer backend
699 SET(ALC_OBJS ${ALC_OBJS} Alc/backends/wave.c)
700 SET(BACKENDS "${BACKENDS} WaveFile,")
703 # This is always available
704 SET(BACKENDS "${BACKENDS} Null")
707 # Might be able to use earlier versions, but these definitely work
708 PKG_CHECK_MODULES(FFMPEG libavcodec>=52.123.0 libavformat>=52.111.0 libavutil>=51.9.1)
711 IF(LIBTYPE STREQUAL "STATIC")
712 ADD_DEFINITIONS(-DAL_LIBTYPE_STATIC)
713 SET(PKG_CONFIG_CFLAGS -DAL_LIBTYPE_STATIC ${PKG_CONFIG_CFLAGS})
716 # Needed for openal.pc.in
717 SET(prefix ${CMAKE_INSTALL_PREFIX})
718 SET(exec_prefix "\${prefix}")
719 SET(libdir "\${exec_prefix}/lib${LIB_SUFFIX}")
720 SET(bindir "\${exec_prefix}/bin")
721 SET(includedir "\${prefix}/include")
722 SET(PACKAGE_VERSION "${LIB_VERSION}")
726 "${OpenAL_SOURCE_DIR}/config.h.in"
727 "${OpenAL_BINARY_DIR}/config.h")
729 "${OpenAL_SOURCE_DIR}/openal.pc.in"
730 "${OpenAL_BINARY_DIR}/openal.pc"
734 ADD_LIBRARY(${LIBNAME} ${LIBTYPE} ${OPENAL_OBJS} ${ALC_OBJS})
735 SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES DEFINE_SYMBOL AL_BUILD_LIBRARY
736 COMPILE_FLAGS -DAL_ALEXT_PROTOTYPES
737 VERSION ${LIB_VERSION}.0
738 SOVERSION ${LIB_MAJOR_VERSION})
739 IF(WIN32 AND NOT LIBTYPE STREQUAL "STATIC")
740 SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES PREFIX "")
743 TARGET_LINK_LIBRARIES(${LIBNAME} ${EXTRA_LIBS})
745 # Add an install target here
746 INSTALL(TARGETS ${LIBNAME}
747 RUNTIME DESTINATION bin
748 LIBRARY DESTINATION "lib${LIB_SUFFIX}"
749 ARCHIVE DESTINATION "lib${LIB_SUFFIX}"
751 INSTALL(FILES include/AL/al.h
755 include/AL/efx-creative.h
756 include/AL/efx-presets.h
757 DESTINATION include/AL
759 INSTALL(FILES "${OpenAL_BINARY_DIR}/openal.pc"
760 DESTINATION "lib${LIB_SUFFIX}/pkgconfig")
764 MESSAGE(STATUS "Building OpenAL with support for the following backends:")
765 MESSAGE(STATUS " ${BACKENDS}")
767 MESSAGE(STATUS "Building with support for CPU extensions:")
768 MESSAGE(STATUS " ${CPU_EXTS}")
773 MESSAGE(STATUS "WARNING: Building the Windows version without DirectSound output")
774 MESSAGE(STATUS " This is probably NOT what you want!")
779 # Install alsoft.conf configuration file
781 INSTALL(FILES alsoftrc.sample
782 DESTINATION /etc/openal
785 MESSAGE(STATUS "Installing sample alsoft.conf")
790 ADD_EXECUTABLE(openal-info utils/openal-info.c)
791 TARGET_LINK_LIBRARIES(openal-info ${LIBNAME})
793 ADD_EXECUTABLE(makehrtf utils/makehrtf.c)
795 TARGET_LINK_LIBRARIES(makehrtf m)
798 INSTALL(TARGETS openal-info makehrtf
799 RUNTIME DESTINATION bin
800 LIBRARY DESTINATION "lib${LIB_SUFFIX}"
801 ARCHIVE DESTINATION "lib${LIB_SUFFIX}"
803 MESSAGE(STATUS "Building utility programs")
809 ADD_EXECUTABLE(alstream examples/alhelpers.c examples/alffmpeg.c examples/alstream.c)
810 TARGET_LINK_LIBRARIES(alstream ${FFMPEG_LIBRARIES} ${LIBNAME})
811 SET_TARGET_PROPERTIES(alstream PROPERTIES COMPILE_FLAGS "${FFMPEG_CFLAGS}")
812 INSTALL(TARGETS alstream
813 RUNTIME DESTINATION bin
814 LIBRARY DESTINATION "lib${LIB_SUFFIX}"
815 ARCHIVE DESTINATION "lib${LIB_SUFFIX}"
818 MESSAGE(STATUS "Building ffmpeg example programs")