1 # CMake build file list for OpenAL
3 CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
7 IF(COMMAND CMAKE_POLICY)
8 CMAKE_POLICY(SET CMP0003 NEW)
9 CMAKE_POLICY(SET CMP0005 NEW)
10 ENDIF(COMMAND CMAKE_POLICY)
12 SET(CMAKE_MODULE_PATH "${OpenAL_SOURCE_DIR}/cmake")
14 INCLUDE(CheckFunctionExists)
15 INCLUDE(CheckLibraryExists)
16 INCLUDE(CheckSharedFunctionExists)
17 INCLUDE(CheckIncludeFile)
18 INCLUDE(CheckIncludeFiles)
19 INCLUDE(CheckSymbolExists)
20 INCLUDE(CheckCCompilerFlag)
21 INCLUDE(CheckCSourceCompiles)
22 INCLUDE(CheckTypeSize)
25 SET(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS TRUE)
29 # This option is mainly for static linking OpenAL Soft into another project
30 # that already defines the IDs. It is up to that project to ensure all
31 # required IDs are defined.
32 OPTION(ALSOFT_NO_UID_DEFS "Do not define GUIDs, IIDs, CLSIDs, or PropertyKeys" OFF)
34 # These are needed on non-Windows systems for extra features
35 ADD_DEFINITIONS(-D_GNU_SOURCE=1 -D_POSIX_C_SOURCE=200809L -D_XOPEN_SOURCE=700)
36 SET(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -D_GNU_SOURCE=1 -D_POSIX_C_SOURCE=200809L -D_XOPEN_SOURCE=700")
40 OPTION(ALSOFT_BACKEND_MMDEVAPI "Check for MMDevApi backend" ON)
41 OPTION(ALSOFT_BACKEND_WINMM "Check for Windows Multimedia backend" ON)
42 OPTION(ALSOFT_BACKEND_OPENSL "Check for OpenSL backend" ON)
44 OPTION(ALSOFT_REQUIRE_MMDEVAPI "Require MMDevApi" OFF)
45 OPTION(ALSOFT_REQUIRE_WINMM "Require Windows Multimedia backend" OFF)
46 OPTION(ALSOFT_REQUIRE_OPENSL "Require OpenSL backend" OFF)
48 OPTION(ALSOFT_DLOPEN "Check for the dlopen API for loading optional libs" ON)
50 OPTION(ALSOFT_WERROR "Treat compile warnings as errors" OFF)
52 OPTION(ALSOFT_UTILS "Build and install utility programs" ON)
53 OPTION(ALSOFT_NO_CONFIG_UTIL "Disable building the alsoft-config utility" OFF)
55 OPTION(ALSOFT_EXAMPLES "Build and install example programs" ON)
57 OPTION(ALSOFT_CONFIG "Install alsoft.conf sample configuration file" ON)
58 OPTION(ALSOFT_HRTF_DEFS "Install HRTF definition files" ON)
63 ADD_DEFINITIONS("-D_WIN32 -D_WIN32_WINNT=0x0502")
68 # QNX's gcc do not uses /usr/include and /usr/lib pathes by default
69 IF ("${CMAKE_C_PLATFORM_ID}" STREQUAL "QNX")
70 ADD_DEFINITIONS("-I/usr/include")
71 SET(EXTRA_LIBS ${EXTRA_LIBS} -L/usr/lib)
78 SET(LIB_MAJOR_VERSION "1")
79 SET(LIB_MINOR_VERSION "15")
81 SET(LIB_VERSION "${LIB_MAJOR_VERSION}.${LIB_MINOR_VERSION}.${LIB_REVISION}")
87 CHECK_TYPE_SIZE("long" SIZEOF_LONG)
88 CHECK_TYPE_SIZE("long long" SIZEOF_LONG_LONG)
91 CHECK_C_COMPILER_FLAG(-std=c99 HAVE_STD_C99)
93 SET(CMAKE_C_FLAGS "-std=c99 ${CMAKE_C_FLAGS}")
96 # MSVC may need workarounds for C99 restrict and inline
98 # TODO: Once we truly require C99, these restrict and inline checks should go
100 CHECK_C_SOURCE_COMPILES("int *restrict foo;
101 int main() {return 0;}" HAVE_RESTRICT)
102 IF(NOT HAVE_RESTRICT)
103 ADD_DEFINITIONS("-Drestrict=")
104 SET(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -Drestrict=")
107 CHECK_C_SOURCE_COMPILES("inline void foo(void) { }
108 int main() {return 0;}" HAVE_INLINE)
110 CHECK_C_SOURCE_COMPILES("__inline void foo(void) { }
111 int main() {return 0;}" HAVE___INLINE)
112 IF(NOT HAVE___INLINE)
113 MESSAGE(FATAL_ERROR "No inline keyword found, please report!")
116 ADD_DEFINITIONS(-Dinline=__inline)
117 SET(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -Dinline=__inline")
121 # Make sure we have C99-style inline semantics with GCC (4.3 or newer).
122 IF(CMAKE_COMPILER_IS_GNUCC)
123 SET(OLD_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}")
124 # Force no inlining for the next test.
125 SET(CMAKE_REQUIRED_FLAGS "${OLD_REQUIRED_FLAGS} -fno-inline")
127 CHECK_C_SOURCE_COMPILES("extern inline int foo() { return 0; }
128 int main() {return foo();}" INLINE_IS_C99)
129 IF(NOT INLINE_IS_C99)
130 MESSAGE(FATAL_ERROR "Your compiler does not seem to have C99 inline semantics!
131 Please update your compiler for better C99 compliance.")
134 SET(CMAKE_REQUIRED_FLAGS "${OLD_REQUIRED_FLAGS}")
137 # Check if we have C99 variable length arrays
138 CHECK_C_SOURCE_COMPILES(
139 "int main(int argc, char *argv[])
141 volatile int tmp[argc];
147 # Check if we have C11 static_assert
148 CHECK_C_SOURCE_COMPILES(
151 _Static_assert(sizeof(int) == sizeof(int), \"What\");
154 HAVE_C11_STATIC_ASSERT)
156 # Check if we have C11 alignas
157 CHECK_C_SOURCE_COMPILES(
158 "_Alignas(4) int foo;
165 # Add definitions, compiler switches, etc.
166 INCLUDE_DIRECTORIES("${OpenAL_SOURCE_DIR}/include" "${OpenAL_BINARY_DIR}")
167 IF(CMAKE_VERSION VERSION_LESS "2.8.8")
168 INCLUDE_DIRECTORIES("${OpenAL_SOURCE_DIR}/OpenAL32/Include" "${OpenAL_SOURCE_DIR}/Alc")
169 IF(WIN32 AND ALSOFT_NO_UID_DEFS)
170 ADD_DEFINITIONS("-DAL_NO_UID_DEFS")
174 IF(NOT CMAKE_BUILD_TYPE)
175 SET(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING
176 "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel."
179 IF(NOT CMAKE_DEBUG_POSTFIX)
180 SET(CMAKE_DEBUG_POSTFIX "" CACHE STRING
181 "Library postfix for debug builds. Normally left blank."
187 SET(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -D_DEBUG")
188 SET(CMAKE_C_FLAGS_MINSIZEREL "${CMAKE_C_FLAGS_MINSIZEREL} -DNDEBUG")
189 SET(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -DNDEBUG")
190 SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -D_DEBUG")
191 ADD_DEFINITIONS(-D_CRT_SECURE_NO_WARNINGS)
192 ADD_DEFINITIONS(-D_CRT_NONSTDC_NO_DEPRECATE)
193 ADD_DEFINITIONS("/wd4098")
196 STRING(REGEX REPLACE "\\\\" "/" DXSDK_DIR "$ENV{DXSDK_DIR}")
198 STRING(REGEX REPLACE "\\\\" "/" DXSDK_DIR "${DXSDK_DIR}")
201 MESSAGE(STATUS "Using DirectX SDK directory: ${DXSDK_DIR}")
202 SET(CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES} "${DXSDK_DIR}/Include")
203 INCLUDE_DIRECTORIES("${DXSDK_DIR}/Include")
204 LINK_DIRECTORIES("${DXSDK_DIR}/Lib")
207 OPTION(FORCE_STATIC_VCRT "Force /MT for static VC runtimes" OFF)
208 IF(FORCE_STATIC_VCRT)
210 CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE
211 CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO)
212 IF(${flag_var} MATCHES "/MD")
213 STRING(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}")
218 ADD_DEFINITIONS(-Winline -Wall)
219 CHECK_C_COMPILER_FLAG(-Wextra HAVE_W_EXTRA)
221 ADD_DEFINITIONS(-Wextra)
225 ADD_DEFINITIONS(-Werror)
228 SET(CMAKE_C_FLAGS_RELWITHDEBINFO "-g -O2 -D_DEBUG" CACHE STRING
229 "Flags used by the compiler during Release with Debug Info builds."
231 SET(CMAKE_C_FLAGS_MINSIZEREL "-Os -DNDEBUG" CACHE STRING
232 "Flags used by the compiler during release minsize builds."
234 SET(CMAKE_C_FLAGS_RELEASE "-O2 -fomit-frame-pointer -DNDEBUG" CACHE STRING
235 "Flags used by the compiler during release builds"
237 SET(CMAKE_C_FLAGS_DEBUG "-g3 -D_DEBUG" CACHE STRING
238 "Flags used by the compiler during debug builds."
241 CHECK_C_SOURCE_COMPILES("int foo() __attribute__((destructor));
242 int main() {return 0;}" HAVE_GCC_DESTRUCTOR)
245 # Set visibility/export options if available
247 SET(EXPORT_DECL "__declspec(dllexport)")
249 SET(ALIGN_DECL "__declspec(align(x))")
251 SET(ALIGN_DECL "__declspec(aligned(x))")
254 SET(OLD_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}")
255 # Yes GCC, really don't accept visibility modes you don't support
256 SET(CMAKE_REQUIRED_FLAGS "${OLD_REQUIRED_FLAGS} -Wattributes -Werror")
258 CHECK_C_SOURCE_COMPILES("int foo() __attribute__((visibility(\"protected\")));
259 int main() {return 0;}" HAVE_GCC_PROTECTED_VISIBILITY)
260 IF(HAVE_GCC_PROTECTED_VISIBILITY)
261 SET(EXPORT_DECL "__attribute__((visibility(\"protected\")))")
263 CHECK_C_SOURCE_COMPILES("int foo() __attribute__((visibility(\"default\")));
264 int main() {return 0;}" HAVE_GCC_DEFAULT_VISIBILITY)
265 IF(HAVE_GCC_DEFAULT_VISIBILITY)
266 SET(EXPORT_DECL "__attribute__((visibility(\"default\")))")
270 IF(HAVE_GCC_PROTECTED_VISIBILITY OR HAVE_GCC_DEFAULT_VISIBILITY)
271 CHECK_C_COMPILER_FLAG(-fvisibility=internal HAVE_VISIBILITY_INTERNAL_SWITCH)
272 IF(HAVE_VISIBILITY_INTERNAL_SWITCH)
273 ADD_DEFINITIONS(-fvisibility=internal)
275 CHECK_C_COMPILER_FLAG(-fvisibility=hidden HAVE_VISIBILITY_HIDDEN_SWITCH)
276 IF(HAVE_VISIBILITY_HIDDEN_SWITCH)
277 ADD_DEFINITIONS(-fvisibility=hidden)
282 CHECK_C_SOURCE_COMPILES("int foo __attribute__((aligned(16)));
283 int main() {return 0;}" HAVE_ATTRIBUTE_ALIGNED)
284 IF(HAVE_ATTRIBUTE_ALIGNED)
285 SET(ALIGN_DECL "__attribute__((aligned(x)))")
288 SET(CMAKE_REQUIRED_FLAGS "${OLD_REQUIRED_FLAGS}")
293 CHECK_C_COMPILER_FLAG(/arch:SSE HAVE_ARCHSSE_SWITCH)
294 IF(HAVE_ARCHSSE_SWITCH)
295 SET(SSE_SWITCH "/arch:SSE")
299 CHECK_C_COMPILER_FLAG(-msse HAVE_MSSE_SWITCH)
301 SET(SSE_SWITCH "-msse")
305 CHECK_C_SOURCE_COMPILES("int foo(const char *str, ...) __attribute__((format(printf, 1, 2)));
306 int main() {return 0;}" HAVE_GCC_FORMAT)
308 CHECK_INCLUDE_FILE(stdalign.h HAVE_STDALIGN_H)
310 CHECK_INCLUDE_FILE(alloca.h HAVE_ALLOCA_H)
312 CHECK_INCLUDE_FILE(malloc.h HAVE_MALLOC_H)
313 CHECK_INCLUDE_FILE(ftw.h HAVE_FTW_H)
314 CHECK_INCLUDE_FILE(io.h HAVE_IO_H)
315 CHECK_INCLUDE_FILE(strings.h HAVE_STRINGS_H)
316 CHECK_INCLUDE_FILE(cpuid.h HAVE_CPUID_H)
317 CHECK_INCLUDE_FILE(sys/sysconf.h HAVE_SYS_SYSCONF_H)
318 CHECK_INCLUDE_FILE(fenv.h HAVE_FENV_H)
319 CHECK_INCLUDE_FILE(float.h HAVE_FLOAT_H)
320 CHECK_INCLUDE_FILE(ieeefp.h HAVE_IEEEFP_H)
321 CHECK_INCLUDE_FILE(guiddef.h HAVE_GUIDDEF_H)
322 IF(NOT HAVE_GUIDDEF_H)
323 CHECK_INCLUDE_FILE(initguid.h HAVE_INITGUID_H)
326 # Some systems need libm for some of the following math functions to work
327 CHECK_LIBRARY_EXISTS(m pow "" HAVE_LIBM)
329 SET(EXTRA_LIBS m ${EXTRA_LIBS})
330 SET(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} m)
334 CHECK_SYMBOL_EXISTS(aligned_alloc stdlib.h HAVE_ALIGNED_ALLOC)
335 CHECK_SYMBOL_EXISTS(posix_memalign stdlib.h HAVE_POSIX_MEMALIGN)
336 CHECK_SYMBOL_EXISTS(_aligned_malloc malloc.h HAVE__ALIGNED_MALLOC)
337 CHECK_SYMBOL_EXISTS(lrintf math.h HAVE_LRINTF)
340 CHECK_SYMBOL_EXISTS(alloca alloca.h HAVE_ALLOCA)
341 ELSEIF(HAVE_MALLOC_H)
342 CHECK_SYMBOL_EXISTS(alloca malloc.h HAVE_ALLOCA)
345 MESSAGE(FATAL_ERROR "No alloca function found, please report!")
350 CHECK_SYMBOL_EXISTS(_controlfp float.h HAVE__CONTROLFP)
351 CHECK_SYMBOL_EXISTS(__control87_2 float.h HAVE___CONTROL87_2)
354 CHECK_SYMBOL_EXISTS(ftw ftw.h HAVE_FTW)
357 CHECK_SYMBOL_EXISTS(_wfindfirst io.h HAVE__WFINDFIRST)
360 CHECK_FUNCTION_EXISTS(strtof HAVE_STRTOF)
361 CHECK_FUNCTION_EXISTS(stat HAVE_STAT)
362 CHECK_FUNCTION_EXISTS(strcasecmp HAVE_STRCASECMP)
363 IF(NOT HAVE_STRCASECMP)
364 CHECK_FUNCTION_EXISTS(_stricmp HAVE__STRICMP)
365 IF(NOT HAVE__STRICMP)
366 MESSAGE(FATAL_ERROR "No case-insensitive compare function found, please report!")
369 ADD_DEFINITIONS(-Dstrcasecmp=_stricmp)
372 CHECK_FUNCTION_EXISTS(strncasecmp HAVE_STRNCASECMP)
373 IF(NOT HAVE_STRNCASECMP)
374 CHECK_FUNCTION_EXISTS(_strnicmp HAVE__STRNICMP)
375 IF(NOT HAVE__STRNICMP)
376 MESSAGE(FATAL_ERROR "No case-insensitive size-limitted compare function found, please report!")
379 ADD_DEFINITIONS(-Dstrncasecmp=_strnicmp)
382 CHECK_FUNCTION_EXISTS(snprintf HAVE_SNPRINTF)
383 IF(NOT HAVE_SNPRINTF)
384 CHECK_FUNCTION_EXISTS(_snprintf HAVE__SNPRINTF)
385 IF(NOT HAVE__SNPRINTF)
386 MESSAGE(FATAL_ERROR "No snprintf function found, please report!")
389 ADD_DEFINITIONS(-Dsnprintf=_snprintf)
392 CHECK_SYMBOL_EXISTS(isfinite math.h HAVE_ISFINITE)
393 IF(NOT HAVE_ISFINITE)
394 CHECK_FUNCTION_EXISTS(finite HAVE_FINITE)
396 CHECK_FUNCTION_EXISTS(_finite HAVE__FINITE)
398 MESSAGE(FATAL_ERROR "No isfinite function found, please report!")
400 ADD_DEFINITIONS(-Disfinite=_finite)
402 ADD_DEFINITIONS(-Disfinite=finite)
406 CHECK_SYMBOL_EXISTS(isnan math.h HAVE_ISNAN)
408 CHECK_FUNCTION_EXISTS(_isnan HAVE__ISNAN)
410 MESSAGE(FATAL_ERROR "No isnan function found, please report!")
413 ADD_DEFINITIONS(-Disnan=_isnan)
417 # Check for the dlopen API (for dynamicly loading backend libs)
419 CHECK_INCLUDE_FILE(dlfcn.h HAVE_DLFCN_H)
421 CHECK_LIBRARY_EXISTS(dl dlopen "" HAVE_LIBDL)
423 SET(EXTRA_LIBS dl ${EXTRA_LIBS})
428 # Check if we have Windows headers
429 CHECK_INCLUDE_FILE(windows.h HAVE_WINDOWS_H -D_WIN32_WINNT=0x0502)
430 IF(NOT HAVE_WINDOWS_H)
431 CHECK_FUNCTION_EXISTS(gettimeofday HAVE_GETTIMEOFDAY)
432 IF(NOT HAVE_GETTIMEOFDAY)
433 MESSAGE(FATAL_ERROR "No timing function found!")
436 CHECK_FUNCTION_EXISTS(nanosleep HAVE_NANOSLEEP)
437 IF(NOT HAVE_NANOSLEEP)
438 MESSAGE(FATAL_ERROR "No sleep function found!")
441 # We need pthreads outside of Windows
442 CHECK_INCLUDE_FILE(pthread.h HAVE_PTHREAD_H)
443 IF(NOT HAVE_PTHREAD_H)
444 MESSAGE(FATAL_ERROR "PThreads is required for non-Windows builds!")
446 # Some systems need pthread_np.h to get recursive mutexes
447 CHECK_INCLUDE_FILES("pthread.h;pthread_np.h" HAVE_PTHREAD_NP_H)
449 CHECK_C_COMPILER_FLAG(-pthread HAVE_PTHREAD)
451 ADD_DEFINITIONS(-pthread)
452 SET(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -pthread")
453 SET(EXTRA_LIBS ${EXTRA_LIBS} -pthread)
456 CHECK_LIBRARY_EXISTS(pthread pthread_create "" HAVE_LIBPTHREAD)
458 SET(EXTRA_LIBS pthread ${EXTRA_LIBS})
461 CHECK_SYMBOL_EXISTS(pthread_setschedparam pthread.h HAVE_PTHREAD_SETSCHEDPARAM)
463 CHECK_SYMBOL_EXISTS(pthread_setname_np pthread.h HAVE_PTHREAD_SETNAME_NP)
464 IF(NOT HAVE_PTHREAD_SETNAME_NP)
465 CHECK_SYMBOL_EXISTS(pthread_set_name_np pthread.h HAVE_PTHREAD_SET_NAME_NP)
467 IF(HAVE_PTHREAD_NP_H)
468 CHECK_SYMBOL_EXISTS(pthread_mutexattr_setkind_np "pthread.h;pthread_np.h" HAVE_PTHREAD_MUTEXATTR_SETKIND_NP)
471 CHECK_LIBRARY_EXISTS(rt clock_gettime "" HAVE_LIBRT)
473 SET(EXTRA_LIBS rt ${EXTRA_LIBS})
477 # Check for a 64-bit type
478 CHECK_INCLUDE_FILE(stdint.h HAVE_STDINT_H)
479 IF(NOT HAVE_STDINT_H)
481 CHECK_C_SOURCE_COMPILES("#define _WIN32_WINNT 0x0502
484 int main() {return 0;}" HAVE___INT64)
487 IF(NOT SIZEOF_LONG MATCHES "8")
488 IF(NOT SIZEOF_LONG_LONG MATCHES "8")
489 MESSAGE(FATAL_ERROR "No 64-bit types found, please report!")
496 SET(OPENAL_OBJS OpenAL32/alAuxEffectSlot.c
500 OpenAL32/alExtension.c
502 OpenAL32/alFontsound.c
503 OpenAL32/alListener.c
506 OpenAL32/alSoundfont.c
510 OpenAL32/sample_cvt.c
512 SET(ALC_OBJS Alc/ALc.c
517 Alc/effects/autowah.c
519 Alc/effects/compressor.c
520 Alc/effects/dedicated.c
521 Alc/effects/distortion.c
523 Alc/effects/equalizer.c
524 Alc/effects/flanger.c
525 Alc/effects/modulator.c
537 SET(CPU_EXTS "Default")
541 # Check for SSE support
542 OPTION(ALSOFT_REQUIRE_SSE "Require SSE/SSE2 support" OFF)
543 CHECK_INCLUDE_FILE(xmmintrin.h HAVE_XMMINTRIN_H "${SSE_SWITCH}")
545 OPTION(ALSOFT_CPUEXT_SSE "Enable SSE/SSE2 support" ON)
546 IF(ALSOFT_CPUEXT_SSE AND ALIGN_DECL)
548 SET(ALC_OBJS ${ALC_OBJS} Alc/mixer_sse.c)
550 SET_SOURCE_FILES_PROPERTIES(Alc/mixer_sse.c PROPERTIES
551 COMPILE_FLAGS "${SSE_SWITCH}")
553 SET(CPU_EXTS "${CPU_EXTS}, SSE")
556 IF(ALSOFT_REQUIRE_SSE AND NOT HAVE_SSE)
557 MESSAGE(FATAL_ERROR "Failed to enabled required SSE CPU extensions")
560 # Check for ARM Neon support
561 OPTION(ALSOFT_REQUIRE_NEON "Require ARM Neon support" OFF)
562 CHECK_INCLUDE_FILE(arm_neon.h HAVE_ARM_NEON_H)
564 OPTION(ALSOFT_CPUEXT_NEON "Enable ARM Neon support" ON)
565 IF(ALSOFT_CPUEXT_NEON)
567 SET(ALC_OBJS ${ALC_OBJS} Alc/mixer_neon.c)
568 SET(CPU_EXTS "${CPU_EXTS}, Neon")
571 IF(ALSOFT_REQUIRE_NEON AND NOT HAVE_NEON)
572 MESSAGE(FATAL_ERROR "Failed to enabled required ARM Neon CPU extensions")
576 SET(ALC_OBJS ${ALC_OBJS}
580 Alc/midi/fluidsynth.c
584 SET(HAVE_FLUIDSYNTH 0)
586 # Check for FluidSynth support
587 OPTION(ALSOFT_REQUIRE_FLUIDSYNTH "Require FluidSynth MIDI" OFF)
588 FIND_PACKAGE(FluidSynth)
590 OPTION(ALSOFT_MIDI_FLUIDSYNTH "Enable FluidSynth MIDI" ON)
591 IF(ALSOFT_MIDI_FLUIDSYNTH)
592 SET(HAVE_FLUIDSYNTH 1)
593 IF(CMAKE_VERSION VERSION_LESS "2.8.8")
594 INCLUDE_DIRECTORIES(${FLUIDSYNTH_INCLUDE_DIR})
596 SET(EXTRA_LIBS ${FLUIDSYNTH_LIBRARIES} ${EXTRA_LIBS})
599 IF(ALSOFT_REQUIRE_FLUIDSYNTH AND NOT HAVE_FLUIDSYNTH)
600 MESSAGE(FATAL_ERROR "Failed to enabled required FluidSynth support")
604 SET(ALC_OBJS ${ALC_OBJS}
606 # Default backends, always available
607 Alc/backends/loopback.c
620 SET(HAVE_PORTAUDIO 0)
621 SET(HAVE_PULSEAUDIO 0)
622 SET(HAVE_COREAUDIO 0)
627 OPTION(ALSOFT_REQUIRE_ALSA "Require ALSA backend" OFF)
630 OPTION(ALSOFT_BACKEND_ALSA "Enable ALSA backend" ON)
631 IF(ALSOFT_BACKEND_ALSA)
633 SET_SOURCE_FILES_PROPERTIES(Alc/backends/alsa.c PROPERTIES
634 INCLUDE_DIRECTORIES "${ALSA_INCLUDE_DIRS}")
635 SET(ALC_OBJS ${ALC_OBJS} Alc/backends/alsa.c)
636 IF(HAVE_DLFCN_H OR WIN32)
637 SET(BACKENDS "${BACKENDS} ALSA,")
639 SET(BACKENDS "${BACKENDS} ALSA \(linked\),")
640 SET(EXTRA_LIBS ${ALSA_LIBRARIES} ${EXTRA_LIBS})
644 IF(ALSOFT_REQUIRE_ALSA AND NOT HAVE_ALSA)
645 MESSAGE(FATAL_ERROR "Failed to enabled required ALSA backend")
649 OPTION(ALSOFT_REQUIRE_OSS "Require OSS backend" OFF)
652 OPTION(ALSOFT_BACKEND_OSS "Enable OSS backend" ON)
653 IF(ALSOFT_BACKEND_OSS)
655 SET_SOURCE_FILES_PROPERTIES(Alc/backends/oss.c PROPERTIES
656 INCLUDE_DIRECTORIES "${OSS_INCLUDE_DIRS}")
657 SET(ALC_OBJS ${ALC_OBJS} Alc/backends/oss.c)
658 SET(BACKENDS "${BACKENDS} OSS,")
661 IF(ALSOFT_REQUIRE_OSS AND NOT HAVE_OSS)
662 MESSAGE(FATAL_ERROR "Failed to enabled required OSS backend")
665 # Check Solaris backend
666 OPTION(ALSOFT_REQUIRE_SOLARIS "Require Solaris backend" OFF)
667 FIND_PACKAGE(AudioIO)
669 OPTION(ALSOFT_BACKEND_SOLARIS "Enable Solaris backend" ON)
670 IF(ALSOFT_BACKEND_SOLARIS)
672 SET_SOURCE_FILES_PROPERTIES(Alc/backends/solaris.c PROPERTIES
673 INCLUDE_DIRECTORIES "${AUDIOIO_INCLUDE_DIRS}")
674 SET(ALC_OBJS ${ALC_OBJS} Alc/backends/solaris.c)
675 SET(BACKENDS "${BACKENDS} Solaris,")
678 IF(ALSOFT_REQUIRE_SOLARIS AND NOT HAVE_SOLARIS)
679 MESSAGE(FATAL_ERROR "Failed to enabled required Solaris backend")
682 # Check SndIO backend
683 OPTION(ALSOFT_REQUIRE_SNDIO "Require SndIO backend" OFF)
684 FIND_PACKAGE(SoundIO)
686 OPTION(ALSOFT_BACKEND_SNDIO "Enable SndIO backend" ON)
687 IF(ALSOFT_BACKEND_SNDIO)
689 SET_SOURCE_FILES_PROPERTIES(Alc/backends/sndio.c PROPERTIES
690 INCLUDE_DIRECTORIES "${SOUNDIO_INCLUDE_DIRS}")
691 SET(ALC_OBJS ${ALC_OBJS} Alc/backends/sndio.c)
692 SET(BACKENDS "${BACKENDS} SndIO \(linked\),")
693 SET(EXTRA_LIBS ${SOUNDIO_LIBRARIES} ${EXTRA_LIBS})
696 IF(ALSOFT_REQUIRE_SNDIO AND NOT HAVE_SNDIO)
697 MESSAGE(FATAL_ERROR "Failed to enabled required SndIO backend")
701 OPTION(ALSOFT_REQUIRE_QSA "Require QSA backend" OFF)
704 OPTION(ALSOFT_BACKEND_QSA "Enable QSA backend" ON)
705 IF(ALSOFT_BACKEND_QSA)
707 SET_SOURCE_FILES_PROPERTIES(Alc/backends/qsa.c PROPERTIES
708 INCLUDE_DIRECTORIES "${QSA_INCLUDE_DIRS}")
709 SET(ALC_OBJS ${ALC_OBJS} Alc/backends/qsa.c)
710 SET(EXTRA_LIBS ${QSA_LIBRARIES} ${EXTRA_LIBS})
711 SET(BACKENDS "${BACKENDS} QSA \(linked\),")
714 IF(ALSOFT_REQUIRE_QSA AND NOT HAVE_QSA)
715 MESSAGE(FATAL_ERROR "Failed to enabled required QSA backend")
718 # Check DSound backend
719 OPTION(ALSOFT_REQUIRE_DSOUND "Require DirectSound backend" OFF)
722 OPTION(ALSOFT_BACKEND_DSOUND "Enable DirectSound backend" ON)
723 IF(ALSOFT_BACKEND_DSOUND)
725 SET_SOURCE_FILES_PROPERTIES(Alc/backends/dsound.c PROPERTIES
726 INCLUDE_DIRECTORIES "${DSOUND_INCLUDE_DIRS}")
727 SET(ALC_OBJS ${ALC_OBJS} Alc/backends/dsound.c)
728 IF(HAVE_DLFCN_H OR WIN32)
729 SET(BACKENDS "${BACKENDS} DirectSound,")
731 SET(BACKENDS "${BACKENDS} DirectSound \(linked\),")
732 SET(EXTRA_LIBS ${DSOUND_LIBRARIES} ${EXTRA_LIBS})
736 IF(ALSOFT_REQUIRE_DSOUND AND NOT HAVE_DSOUND)
737 MESSAGE(FATAL_ERROR "Failed to enabled required DSound backend")
740 # Check for MMDevApi backend
742 IF(ALSOFT_BACKEND_MMDEVAPI)
743 CHECK_INCLUDE_FILE(mmdeviceapi.h HAVE_MMDEVICEAPI_H)
744 IF(HAVE_MMDEVICEAPI_H)
746 SET(ALC_OBJS ${ALC_OBJS} Alc/backends/mmdevapi.c)
748 SET(BACKENDS "${BACKENDS} MMDevApi,")
752 IF(ALSOFT_REQUIRE_MMDEVAPI AND NOT HAVE_MMDEVAPI)
753 MESSAGE(FATAL_ERROR "Failed to enabled required MMDevApi backend")
756 # Check MMSystem backend
758 IF(ALSOFT_BACKEND_WINMM)
759 CHECK_INCLUDE_FILES("windows.h;mmsystem.h" HAVE_MMSYSTEM_H -D_WIN32_WINNT=0x0502)
761 CHECK_SHARED_FUNCTION_EXISTS(waveOutOpen "windows.h;mmsystem.h" winmm "" HAVE_LIBWINMM)
764 SET(ALC_OBJS ${ALC_OBJS} Alc/backends/winmm.c)
765 SET(BACKENDS "${BACKENDS} WinMM,")
766 SET(EXTRA_LIBS winmm ${EXTRA_LIBS})
771 IF(ALSOFT_REQUIRE_WINMM AND NOT HAVE_WINMM)
772 MESSAGE(FATAL_ERROR "Failed to enabled required WinMM backend")
775 # Check PortAudio backend
776 OPTION(ALSOFT_REQUIRE_PORTAUDIO "Require PortAudio backend" OFF)
777 FIND_PACKAGE(PortAudio)
779 OPTION(ALSOFT_BACKEND_PORTAUDIO "Enable PortAudio backend" ON)
780 IF(ALSOFT_BACKEND_PORTAUDIO)
781 SET(HAVE_PORTAUDIO 1)
782 SET_SOURCE_FILES_PROPERTIES(Alc/backends/portaudio.c PROPERTIES
783 INCLUDE_DIRECTORIES "${PORTAUDIO_INCLUDE_DIRS}")
784 SET(ALC_OBJS ${ALC_OBJS} Alc/backends/portaudio.c)
785 IF(HAVE_DLFCN_H OR WIN32)
786 SET(BACKENDS "${BACKENDS} PortAudio,")
788 SET(BACKENDS "${BACKENDS} PortAudio \(linked\),")
789 SET(EXTRA_LIBS ${PORTAUDIO_LIBRARIES} ${EXTRA_LIBS})
793 IF(ALSOFT_REQUIRE_PORTAUDIO AND NOT HAVE_PORTAUDIO)
794 MESSAGE(FATAL_ERROR "Failed to enabled required PortAudio backend")
797 # Check PulseAudio backend
798 OPTION(ALSOFT_REQUIRE_PULSEAUDIO "Require PulseAudio backend" OFF)
799 FIND_PACKAGE(PulseAudio)
801 OPTION(ALSOFT_BACKEND_PULSEAUDIO "Enable PulseAudio backend" ON)
802 IF(ALSOFT_BACKEND_PULSEAUDIO)
803 SET(HAVE_PULSEAUDIO 1)
804 SET_SOURCE_FILES_PROPERTIES(Alc/backends/pulseaudio.c PROPERTIES
805 INCLUDE_DIRECTORIES "${PULSEAUDIO_INCLUDE_DIRS}")
806 SET(ALC_OBJS ${ALC_OBJS} Alc/backends/pulseaudio.c)
807 IF(HAVE_DLFCN_H OR WIN32)
808 SET(BACKENDS "${BACKENDS} PulseAudio,")
810 SET(BACKENDS "${BACKENDS} PulseAudio \(linked\),")
811 SET(EXTRA_LIBS ${PULSEAUDIO_LIBRARIES} ${EXTRA_LIBS})
815 IF(ALSOFT_REQUIRE_PULSEAUDIO AND NOT HAVE_PULSEAUDIO)
816 MESSAGE(FATAL_ERROR "Failed to enabled required PulseAudio backend")
819 # Check CoreAudio backend
820 OPTION(ALSOFT_REQUIRE_COREAUDIO "Require CoreAudio backend" OFF)
821 FIND_LIBRARY(COREAUDIO_FRAMEWORK
823 PATHS /System/Library/Frameworks
825 IF(COREAUDIO_FRAMEWORK)
826 OPTION(ALSOFT_BACKEND_COREAUDIO "Check for CoreAudio backend" ON)
827 IF(ALSOFT_BACKEND_COREAUDIO)
828 SET(HAVE_COREAUDIO 1)
829 SET(ALC_OBJS ${ALC_OBJS} Alc/backends/coreaudio.c)
830 SET(BACKENDS "${BACKENDS} CoreAudio,")
831 SET(EXTRA_LIBS ${COREAUDIO_FRAMEWORK} ${EXTRA_LIBS})
832 SET(EXTRA_LIBS /System/Library/Frameworks/AudioUnit.framework ${EXTRA_LIBS})
833 SET(EXTRA_LIBS /System/Library/Frameworks/ApplicationServices.framework ${EXTRA_LIBS})
835 # Some versions of OSX may need the AudioToolbox framework. Add it if
837 FIND_LIBRARY(AUDIOTOOLBOX_LIBRARY
839 PATHS ~/Library/Frameworks
841 /System/Library/Frameworks
843 IF(AUDIOTOOLBOX_LIBRARY)
844 SET(EXTRA_LIBS ${AUDIOTOOLBOX_LIBRARY} ${EXTRA_LIBS})
848 IF(ALSOFT_REQUIRE_COREAUDIO AND NOT HAVE_COREAUDIO)
849 MESSAGE(FATAL_ERROR "Failed to enabled required CoreAudio backend")
852 # Check for OpenSL (Android) backend
853 IF(ALSOFT_BACKEND_OPENSL)
854 CHECK_INCLUDE_FILES("SLES/OpenSLES.h;SLES/OpenSLES_Android.h" HAVE_SLES_OPENSLES_ANDROID_H)
855 IF(HAVE_SLES_OPENSLES_ANDROID_H)
856 CHECK_SHARED_FUNCTION_EXISTS(slCreateEngine "SLES/OpenSLES.h" OpenSLES "" HAVE_LIBOPENSLES)
859 SET(ALC_OBJS ${ALC_OBJS} Alc/backends/opensl.c)
860 SET(BACKENDS "${BACKENDS} OpenSL,")
861 SET(EXTRA_LIBS OpenSLES ${EXTRA_LIBS})
865 IF(ALSOFT_REQUIRE_OPENSL AND NOT HAVE_OPENSL)
866 MESSAGE(FATAL_ERROR "Failed to enabled required OpenSL backend")
869 # Optionally enable the Wave Writer backend
870 OPTION(ALSOFT_BACKEND_WAVE "Enable Wave Writer backend" ON)
871 IF(ALSOFT_BACKEND_WAVE)
873 SET(ALC_OBJS ${ALC_OBJS} Alc/backends/wave.c)
874 SET(BACKENDS "${BACKENDS} WaveFile,")
877 # This is always available
878 SET(BACKENDS "${BACKENDS} Null")
880 IF(ALSOFT_UTILS AND NOT ALSOFT_NO_CONFIG_UTIL)
881 add_subdirectory(utils/alsoft-config)
886 FIND_PACKAGE(SDL_sound)
887 IF(SDL_SOUND_FOUND AND CMAKE_VERSION VERSION_LESS "2.8.8")
888 INCLUDE_DIRECTORIES(${SDL_INCLUDE_DIR} ${SDL_SOUND_INCLUDE_DIR})
893 IF(LIBTYPE STREQUAL "STATIC")
894 ADD_DEFINITIONS(-DAL_LIBTYPE_STATIC)
895 SET(PKG_CONFIG_CFLAGS -DAL_LIBTYPE_STATIC ${PKG_CONFIG_CFLAGS})
898 # Needed for openal.pc.in
899 SET(prefix ${CMAKE_INSTALL_PREFIX})
900 SET(exec_prefix "\${prefix}")
901 SET(libdir "\${exec_prefix}/lib${LIB_SUFFIX}")
902 SET(bindir "\${exec_prefix}/bin")
903 SET(includedir "\${prefix}/include")
904 SET(PACKAGE_VERSION "${LIB_VERSION}")
908 "${OpenAL_SOURCE_DIR}/config.h.in"
909 "${OpenAL_BINARY_DIR}/config.h")
911 "${OpenAL_SOURCE_DIR}/openal.pc.in"
912 "${OpenAL_BINARY_DIR}/openal.pc"
916 ADD_LIBRARY(${LIBNAME} ${LIBTYPE} ${OPENAL_OBJS} ${ALC_OBJS})
917 SET_PROPERTY(TARGET ${LIBNAME} APPEND PROPERTY COMPILE_DEFINITIONS AL_BUILD_LIBRARY AL_ALEXT_PROTOTYPES)
918 IF(WIN32 AND ALSOFT_NO_UID_DEFS)
919 SET_PROPERTY(TARGET ${LIBNAME} APPEND PROPERTY COMPILE_DEFINITIONS AL_NO_UID_DEFS)
921 SET_PROPERTY(TARGET ${LIBNAME} APPEND PROPERTY INCLUDE_DIRECTORIES "${OpenAL_SOURCE_DIR}/OpenAL32/Include" "${OpenAL_SOURCE_DIR}/Alc")
923 SET_PROPERTY(TARGET ${LIBNAME} APPEND PROPERTY INCLUDE_DIRECTORIES ${FLUIDSYNTH_INCLUDE_DIR})
925 SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES VERSION ${LIB_VERSION}
926 SOVERSION ${LIB_MAJOR_VERSION})
927 IF(WIN32 AND NOT LIBTYPE STREQUAL "STATIC")
928 SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES PREFIX "")
931 TARGET_LINK_LIBRARIES(${LIBNAME} ${EXTRA_LIBS})
933 # Add an install target here
934 INSTALL(TARGETS ${LIBNAME}
935 RUNTIME DESTINATION bin
936 LIBRARY DESTINATION "lib${LIB_SUFFIX}"
937 ARCHIVE DESTINATION "lib${LIB_SUFFIX}"
939 INSTALL(FILES include/AL/al.h
943 include/AL/efx-creative.h
944 include/AL/efx-presets.h
945 DESTINATION include/AL
947 INSTALL(FILES "${OpenAL_BINARY_DIR}/openal.pc"
948 DESTINATION "lib${LIB_SUFFIX}/pkgconfig")
952 MESSAGE(STATUS "Building OpenAL with support for the following backends:")
953 MESSAGE(STATUS " ${BACKENDS}")
955 MESSAGE(STATUS "Building with support for CPU extensions:")
956 MESSAGE(STATUS " ${CPU_EXTS}")
959 MESSAGE(STATUS "FluidSynth support for ALC_SOFT_midi_interface enabled")
965 MESSAGE(STATUS "WARNING: Building the Windows version without DirectSound output")
966 MESSAGE(STATUS " This is probably NOT what you want!")
971 # Install alsoft.conf configuration file
973 INSTALL(FILES alsoftrc.sample
974 DESTINATION share/openal
976 MESSAGE(STATUS "Installing sample configuration")
980 # Install HRTF definitions
982 INSTALL(FILES hrtf/default-44100.mhr
983 DESTINATION share/openal/hrtf
985 MESSAGE(STATUS "Installing HRTF definitions")
990 ADD_EXECUTABLE(openal-info utils/openal-info.c)
991 TARGET_LINK_LIBRARIES(openal-info ${LIBNAME})
993 ADD_EXECUTABLE(makehrtf utils/makehrtf.c)
995 TARGET_LINK_LIBRARIES(makehrtf m)
998 INSTALL(TARGETS openal-info makehrtf
999 RUNTIME DESTINATION bin
1000 LIBRARY DESTINATION "lib${LIB_SUFFIX}"
1001 ARCHIVE DESTINATION "lib${LIB_SUFFIX}"
1004 MESSAGE(STATUS "Building utility programs")
1005 IF(TARGET alsoft-config)
1006 MESSAGE(STATUS "Building configuration program")
1012 IF(SDL_FOUND AND SDL_SOUND_FOUND)
1013 ADD_LIBRARY(ex-common STATIC examples/common/alhelpers.c
1014 examples/common/sdl_sound.c)
1015 SET_PROPERTY(TARGET ex-common APPEND PROPERTY INCLUDE_DIRECTORIES ${SDL_SOUND_INCLUDE_DIR})
1017 ADD_EXECUTABLE(alstream examples/alstream.c)
1018 TARGET_LINK_LIBRARIES(alstream ex-common ${SDL_SOUND_LIBRARIES} ${LIBNAME})
1019 SET_PROPERTY(TARGET alstream APPEND PROPERTY INCLUDE_DIRECTORIES ${SDL_SOUND_INCLUDE_DIR})
1021 ADD_EXECUTABLE(alreverb examples/alreverb.c)
1022 TARGET_LINK_LIBRARIES(alreverb ex-common ${SDL_SOUND_LIBRARIES} ${LIBNAME})
1023 SET_PROPERTY(TARGET alreverb APPEND PROPERTY INCLUDE_DIRECTORIES ${SDL_SOUND_INCLUDE_DIR})
1025 ADD_EXECUTABLE(allatency examples/allatency.c)
1026 TARGET_LINK_LIBRARIES(allatency ex-common ${SDL_SOUND_LIBRARIES} ${LIBNAME})
1027 SET_PROPERTY(TARGET allatency APPEND PROPERTY INCLUDE_DIRECTORIES ${SDL_SOUND_INCLUDE_DIR})
1029 ADD_EXECUTABLE(alloopback examples/alloopback.c)
1030 TARGET_LINK_LIBRARIES(alloopback ex-common ${SDL_SOUND_LIBRARIES} ${SDL_LIBRARY} ${LIBNAME})
1031 SET_PROPERTY(TARGET alloopback APPEND PROPERTY INCLUDE_DIRECTORIES ${SDL_INCLUDE_DIR}
1032 ${SDL_SOUND_INCLUDE_DIR})
1034 INSTALL(TARGETS alstream alreverb allatency alloopback
1035 RUNTIME DESTINATION bin
1036 LIBRARY DESTINATION "lib${LIB_SUFFIX}"
1037 ARCHIVE DESTINATION "lib${LIB_SUFFIX}"
1040 MESSAGE(STATUS "Building example programs")