Add an SSE-enhanced HRTF mixer using intrinsics
[openal-soft/openal-hmr.git] / CMakeLists.txt
blobf4a0d1f7912f4be17ddcc93c80fefc0a8f480f6e
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)
23 PROJECT(OpenAL C)
26 SET(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS TRUE)
29 OPTION(ALSA    "Check for ALSA backend"                ON)
30 OPTION(OSS     "Check for OSS backend"                 ON)
31 OPTION(SOLARIS "Check for Solaris backend"             ON)
32 OPTION(SNDIO   "Check for SndIO backend"               ON)
33 OPTION(MMDEVAPI "Check for MMDevApi"                   ON)
34 OPTION(DSOUND  "Check for DirectSound backend"         ON)
35 OPTION(WINMM   "Check for Windows Multimedia backend"  ON)
36 OPTION(PORTAUDIO  "Check for PortAudio backend"        ON)
37 OPTION(PULSEAUDIO "Check for PulseAudio backend"       ON)
38 OPTION(COREAUDIO  "Check for CoreAudio backend"        ON)
39 OPTION(OPENSL     "Check for OpenSL backend"           ON)
40 OPTION(WAVE    "Enable Wave Writer backend"            ON)
42 OPTION(REQUIRE_ALSA       "Require ALSA backend"               OFF)
43 OPTION(REQUIRE_OSS        "Require OSS backend"                OFF)
44 OPTION(REQUIRE_SOLARIS    "Require Solaris backend"            OFF)
45 OPTION(REQUIRE_SNDIO      "Require SndIO backend"              OFF)
46 OPTION(REQUIRE_MMDEVAPI   "Require MMDevApi"                   OFF)
47 OPTION(REQUIRE_DSOUND     "Require DirectSound backend"        OFF)
48 OPTION(REQUIRE_WINMM      "Require Windows Multimedia backend" OFF)
49 OPTION(REQUIRE_PORTAUDIO  "Require PortAudio backend"          OFF)
50 OPTION(REQUIRE_PULSEAUDIO "Require PulseAudio backend"         OFF)
51 OPTION(REQUIRE_COREAUDIO  "Require CoreAudio backend"          OFF)
52 OPTION(REQUIRE_OPENSL     "Require OpenSL backend"             OFF)
54 OPTION(DLOPEN  "Check for the dlopen API for loading optional libs"  ON)
56 OPTION(WERROR  "Treat compile warnings as errors"      OFF)
58 OPTION(UTILS  "Build and install utility programs"  ON)
60 OPTION(EXAMPLES  "Build and install example programs"  ON)
62 OPTION(ALSOFT_CONFIG "Install alsoft.conf configuration file" OFF)
65 IF(WIN32)
66     SET(LIBNAME OpenAL32)
67     ADD_DEFINITIONS("-D_WIN32 -D_WIN32_WINNT=0x0501")
68 ELSE()
69     SET(LIBNAME openal)
70 ENDIF()
72 IF(NOT LIBTYPE)
73     SET(LIBTYPE SHARED)
74 ENDIF()
76 SET(LIB_MAJOR_VERSION "1")
77 SET(LIB_MINOR_VERSION "14")
78 SET(LIB_VERSION "${LIB_MAJOR_VERSION}.${LIB_MINOR_VERSION}")
80 SET(EXPORT_DECL "")
83 CHECK_TYPE_SIZE("long" SIZEOF_LONG)
84 CHECK_TYPE_SIZE("long long" SIZEOF_LONG_LONG)
87 CHECK_C_SOURCE_COMPILES("int *restrict foo;
88                          int main() {return 0;}" HAVE_RESTRICT)
89 CHECK_C_SOURCE_COMPILES("int *__restrict foo;
90                          int main() {return 0;}" HAVE___RESTRICT)
93 # Add definitions, compiler switches, etc.
94 INCLUDE_DIRECTORIES(OpenAL32/Include include "${OpenAL_BINARY_DIR}")
96 IF(NOT CMAKE_BUILD_TYPE)
97     SET(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING
98         "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel."
99         FORCE)
100 ENDIF()
101 IF(NOT CMAKE_DEBUG_POSTFIX)
102     SET(CMAKE_DEBUG_POSTFIX "" CACHE STRING
103         "Library postfix for debug builds. Normally left blank."
104         FORCE)
105 ENDIF()
107 IF(MSVC)
108     # ???
109     SET(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -D_DEBUG")
110     SET(CMAKE_C_FLAGS_MINSIZEREL "${CMAKE_C_FLAGS_MINSIZEREL} -DNDEBUG")
111     SET(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -DNDEBUG")
112     SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -D_DEBUG")
113     ADD_DEFINITIONS(-D_CRT_SECURE_NO_WARNINGS)
114     ADD_DEFINITIONS(-D_CRT_NONSTDC_NO_DEPRECATE)
116     IF(NOT DXSDK_DIR)
117         STRING(REGEX REPLACE "\\\\" "/" DXSDK_DIR "$ENV{DXSDK_DIR}")
118     ELSE()
119         STRING(REGEX REPLACE "\\\\" "/" DXSDK_DIR "${DXSDK_DIR}")
120     ENDIF()
121     IF(DXSDK_DIR)
122         MESSAGE(STATUS "Using DirectX SDK directory: ${DXSDK_DIR}")
123         SET(CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES} "${DXSDK_DIR}/Include")
124         INCLUDE_DIRECTORIES("${DXSDK_DIR}/Include")
125         LINK_DIRECTORIES("${DXSDK_DIR}/Lib")
126     ENDIF()
128     OPTION(FORCE_STATIC_VCRT "Force /MT for static VC runtimes" OFF)
129     IF(FORCE_STATIC_VCRT)
130         FOREACH(flag_var
131                 CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE
132                 CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO)
133             IF(${flag_var} MATCHES "/MD")
134                 STRING(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}")
135             ENDIF()
136         ENDFOREACH(flag_var)
137     ENDIF()
138 ELSE()
139     ADD_DEFINITIONS(-Winline -Wall)
140     CHECK_C_COMPILER_FLAG(-Wextra HAVE_W_EXTRA)
141     IF(HAVE_W_EXTRA)
142         ADD_DEFINITIONS(-Wextra)
143     ENDIF()
145     IF(WERROR)
146         ADD_DEFINITIONS(-Werror)
147     ENDIF()
149     SET(CMAKE_C_FLAGS_RELWITHDEBINFO "-g -O2 -D_DEBUG" CACHE STRING
150         "Flags used by the compiler during Release with Debug Info builds."
151         FORCE)
152     SET(CMAKE_C_FLAGS_MINSIZEREL "-Os -DNDEBUG" CACHE STRING
153         "Flags used by the compiler during release minsize builds."
154         FORCE)
155     SET(CMAKE_C_FLAGS_RELEASE "-O2 -fomit-frame-pointer -DNDEBUG" CACHE STRING
156         "Flags used by the compiler during release builds"
157         FORCE)
158     SET(CMAKE_C_FLAGS_DEBUG "-g3 -D_DEBUG" CACHE STRING
159         "Flags used by the compiler during debug builds."
160         FORCE)
162     CHECK_C_SOURCE_COMPILES("int foo() __attribute__((destructor));
163                              int main() {return 0;}" HAVE_GCC_DESTRUCTOR)
164 ENDIF()
166 # Set visibility/export options if available
167 IF(WIN32)
168     SET(EXPORT_DECL "__declspec(dllexport)")
170     OPTION(WINE "Enable use of Wine headers when compiling" OFF)
171     IF(WINE)
172         FIND_PATH(WINE_INCLUDE_DIR library.h
173                   PATHS
174                   /usr/include/wine
175                   /usr/local/include/wine
176                   CMAKE_FIND_ROOT_PATH_BOTH)
177         IF(WINE_INCLUDE_DIR)
178             MESSAGE(STATUS "Found Wine header files - ${WINE_INCLUDE_DIR}" )
179             INCLUDE_DIRECTORIES("${WINE_INCLUDE_DIR}/windows")
180             SET(CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES} "${WINE_INCLUDE_DIR}/windows")
181         ELSE()
182             MESSAGE(STATUS "Could not find Wine header files" )
183         ENDIF()
184     ENDIF()
185 ELSE()
186     SET(OLD_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}")
187     # Yes GCC, really don't accept visibility modes you don't support
188     SET(CMAKE_REQUIRED_FLAGS "${OLD_REQUIRED_FLAGS} -Wattributes -Werror")
190     CHECK_C_SOURCE_COMPILES("int foo() __attribute__((visibility(\"protected\")));
191                              int main() {return 0;}" HAVE_GCC_PROTECTED_VISIBILITY)
192     IF(HAVE_GCC_PROTECTED_VISIBILITY)
193         SET(EXPORT_DECL "__attribute__((visibility(\"protected\")))")
194     ELSE()
195         CHECK_C_SOURCE_COMPILES("int foo() __attribute__((visibility(\"default\")));
196                                  int main() {return 0;}" HAVE_GCC_DEFAULT_VISIBILITY)
197         IF(HAVE_GCC_DEFAULT_VISIBILITY)
198             SET(EXPORT_DECL "__attribute__((visibility(\"default\")))")
199         ENDIF()
200     ENDIF()
202     IF(HAVE_GCC_PROTECTED_VISIBILITY OR HAVE_GCC_DEFAULT_VISIBILITY)
203         CHECK_C_COMPILER_FLAG(-fvisibility=internal HAVE_VISIBILITY_INTERNAL_SWITCH)
204         IF(HAVE_VISIBILITY_INTERNAL_SWITCH)
205             ADD_DEFINITIONS(-fvisibility=internal)
206         ELSE()
207             CHECK_C_COMPILER_FLAG(-fvisibility=hidden HAVE_VISIBILITY_HIDDEN_SWITCH)
208             IF(HAVE_VISIBILITY_HIDDEN_SWITCH)
209                 ADD_DEFINITIONS(-fvisibility=hidden)
210             ENDIF()
211         ENDIF()
212     ENDIF()
214     SET(CMAKE_REQUIRED_FLAGS "${OLD_REQUIRED_FLAGS}")
215 ENDIF()
217 CHECK_C_SOURCE_COMPILES("int foo(const char *str, ...) __attribute__((format(printf, 1, 2)));
218                          int main() {return 0;}" HAVE_GCC_FORMAT)
220 CHECK_INCLUDE_FILE(fenv.h HAVE_FENV_H)
221 CHECK_INCLUDE_FILE(fpu_control.h HAVE_FPU_CONTROL_H)
222 CHECK_INCLUDE_FILE(float.h HAVE_FLOAT_H)
223 CHECK_INCLUDE_FILE(ieeefp.h HAVE_IEEEFP_H)
224 CHECK_INCLUDE_FILE(guiddef.h HAVE_GUIDDEF_H)
225 IF(NOT HAVE_GUIDDEF_H)
226     CHECK_INCLUDE_FILE(initguid.h HAVE_INITGUID_H)
227 ENDIF()
228 CHECK_INCLUDE_FILE(xmmintrin.h HAVE_XMMINTRIN_H)
229 CHECK_INCLUDE_FILE(arm_neon.h HAVE_ARM_NEON_H)
230 CHECK_INCLUDE_FILE(cpuid.h HAVE_CPUID_H)
232 # Some systems need libm for some of the following math functions to work
233 CHECK_LIBRARY_EXISTS(m pow "" HAVE_LIBM)
234 IF(HAVE_LIBM)
235     SET(EXTRA_LIBS m ${EXTRA_LIBS})
236     SET(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} m)
237 ENDIF()
240 CHECK_SYMBOL_EXISTS(powf   math.h HAVE_POWF)
241 CHECK_SYMBOL_EXISTS(sqrtf  math.h HAVE_SQRTF)
242 CHECK_SYMBOL_EXISTS(cosf   math.h HAVE_COSF)
243 CHECK_SYMBOL_EXISTS(sinf   math.h HAVE_SINF)
244 CHECK_SYMBOL_EXISTS(acosf  math.h HAVE_ACOSF)
245 CHECK_SYMBOL_EXISTS(asinf  math.h HAVE_ASINF)
246 CHECK_SYMBOL_EXISTS(atanf  math.h HAVE_ATANF)
247 CHECK_SYMBOL_EXISTS(atan2f math.h HAVE_ATAN2F)
248 CHECK_SYMBOL_EXISTS(fabsf  math.h HAVE_FABSF)
249 CHECK_SYMBOL_EXISTS(log10f math.h HAVE_LOG10F)
250 CHECK_SYMBOL_EXISTS(floorf math.h HAVE_FLOORF)
252 IF(HAVE_FENV_H)
253     CHECK_SYMBOL_EXISTS(fesetround fenv.h HAVE_FESETROUND)
254 ENDIF()
256 CHECK_FUNCTION_EXISTS(strtof HAVE_STRTOF)
257 CHECK_FUNCTION_EXISTS(_controlfp HAVE__CONTROLFP)
259 CHECK_FUNCTION_EXISTS(stat HAVE_STAT)
260 CHECK_FUNCTION_EXISTS(strcasecmp HAVE_STRCASECMP)
261 IF(NOT HAVE_STRCASECMP)
262     CHECK_FUNCTION_EXISTS(_stricmp HAVE__STRICMP)
263     IF(NOT HAVE__STRICMP)
264         MESSAGE(FATAL_ERROR "No case-insensitive compare function found, please report!")
265     ENDIF()
267     ADD_DEFINITIONS(-Dstrcasecmp=_stricmp)
268 ENDIF()
270 CHECK_FUNCTION_EXISTS(strncasecmp HAVE_STRNCASECMP)
271 IF(NOT HAVE_STRNCASECMP)
272     CHECK_FUNCTION_EXISTS(_strnicmp HAVE__STRNICMP)
273     IF(NOT HAVE__STRNICMP)
274         MESSAGE(FATAL_ERROR "No case-insensitive size-limitted compare function found, please report!")
275     ENDIF()
277     ADD_DEFINITIONS(-Dstrncasecmp=_strnicmp)
278 ENDIF()
280 CHECK_FUNCTION_EXISTS(snprintf HAVE_SNPRINTF)
281 IF(NOT HAVE_SNPRINTF)
282     CHECK_FUNCTION_EXISTS(_snprintf HAVE__SNPRINTF)
283     IF(NOT HAVE__SNPRINTF)
284         MESSAGE(FATAL_ERROR "No snprintf function found, please report!")
285     ENDIF()
287     ADD_DEFINITIONS(-Dsnprintf=_snprintf)
288 ENDIF()
290 CHECK_FUNCTION_EXISTS(vsnprintf HAVE_VSNPRINTF)
291 IF(NOT HAVE_VSNPRINTF)
292     CHECK_FUNCTION_EXISTS(_vsnprintf HAVE__VSNPRINTF)
293     IF(NOT HAVE__VSNPRINTF)
294         MESSAGE(FATAL_ERROR "No vsnprintf function found, please report!")
295     ENDIF()
297     ADD_DEFINITIONS(-Dvsnprintf=_vsnprintf)
298 ENDIF()
300 CHECK_SYMBOL_EXISTS(isfinite math.h HAVE_ISFINITE)
301 IF(NOT HAVE_ISFINITE)
302     CHECK_FUNCTION_EXISTS(finite HAVE_FINITE)
303     IF(NOT HAVE_FINITE)
304         CHECK_FUNCTION_EXISTS(_finite HAVE__FINITE)
305         IF(NOT HAVE__FINITE)
306             MESSAGE(FATAL_ERROR "No isfinite function found, please report!")
307         ENDIF()
308         ADD_DEFINITIONS(-Disfinite=_finite)
309     ELSE()
310         ADD_DEFINITIONS(-Disfinite=finite)
311     ENDIF()
312 ENDIF()
314 CHECK_SYMBOL_EXISTS(isnan math.h HAVE_ISNAN)
315 IF(NOT HAVE_ISNAN)
316     CHECK_FUNCTION_EXISTS(_isnan HAVE__ISNAN)
317     IF(NOT HAVE__ISNAN)
318         MESSAGE(FATAL_ERROR "No isnan function found, please report!")
319     ENDIF()
321     ADD_DEFINITIONS(-Disnan=_isnan)
322 ENDIF()
325 # Check for the dlopen API (for dynamicly loading backend libs)
326 IF(DLOPEN)
327     CHECK_INCLUDE_FILE(dlfcn.h HAVE_DLFCN_H)
328     IF(HAVE_DLFCN_H)
329         CHECK_LIBRARY_EXISTS(dl dlopen "" HAVE_LIBDL)
330         IF(HAVE_LIBDL)
331             SET(EXTRA_LIBS dl ${EXTRA_LIBS})
332         ENDIF()
333     ENDIF()
334 ENDIF()
336 # Check if we have Windows headers
337 CHECK_INCLUDE_FILE(windows.h HAVE_WINDOWS_H -D_WIN32_WINNT=0x0501)
338 IF(NOT HAVE_WINDOWS_H)
339     CHECK_FUNCTION_EXISTS(gettimeofday HAVE_GETTIMEOFDAY)
340     IF(NOT HAVE_GETTIMEOFDAY)
341         MESSAGE(FATAL_ERROR "No timing function found!")
342     ENDIF()
344     CHECK_FUNCTION_EXISTS(nanosleep HAVE_NANOSLEEP)
345     IF(NOT HAVE_NANOSLEEP)
346         MESSAGE(FATAL_ERROR "No sleep function found!")
347     ENDIF()
349     CHECK_C_COMPILER_FLAG(-pthread HAVE_PTHREAD)
350     IF(HAVE_PTHREAD)
351         ADD_DEFINITIONS(-pthread)
352         SET(EXTRA_LIBS ${EXTRA_LIBS} -pthread)
353     ENDIF()
355     # We need pthreads outside of Windows
356     CHECK_INCLUDE_FILE(pthread.h HAVE_PTHREAD_H)
357     IF(NOT HAVE_PTHREAD_H)
358         MESSAGE(FATAL_ERROR "PThreads is required for non-Windows builds!")
359     ENDIF()
360     # Some systems need pthread_np.h to get recursive mutexes
361     CHECK_INCLUDE_FILES("pthread.h;pthread_np.h" HAVE_PTHREAD_NP_H)
363     # _GNU_SOURCE is needed on some systems for extra attributes
364     ADD_DEFINITIONS(-D_GNU_SOURCE=1)
365     CHECK_LIBRARY_EXISTS(pthread pthread_create "" HAVE_LIBPTHREAD)
366     IF(HAVE_LIBPTHREAD)
367         SET(EXTRA_LIBS pthread ${EXTRA_LIBS})
368     ENDIF()
370     CHECK_LIBRARY_EXISTS(pthread pthread_setschedparam "" HAVE_PTHREAD_SETSCHEDPARAM)
372     CHECK_LIBRARY_EXISTS(rt clock_gettime "" HAVE_LIBRT)
373     IF(HAVE_LIBRT)
374         SET(EXTRA_LIBS rt ${EXTRA_LIBS})
375     ENDIF()
376 ENDIF()
378 # Check for a 64-bit type
379 CHECK_INCLUDE_FILE(stdint.h HAVE_STDINT_H)
380 IF(NOT HAVE_STDINT_H)
381     IF(HAVE_WINDOWS_H)
382         CHECK_C_SOURCE_COMPILES("\#define _WIN32_WINNT 0x0501
383                                  \#include <windows.h>
384                                  __int64 foo;
385                                  int main() {return 0;}" HAVE___INT64)
386     ENDIF()
387     IF(NOT HAVE___INT64)
388         IF(NOT SIZEOF_LONG MATCHES "8")
389             IF(NOT SIZEOF_LONG_LONG MATCHES "8")
390                 MESSAGE(FATAL_ERROR "No 64-bit types found, please report!")
391             ENDIF()
392         ENDIF()
393     ENDIF()
394 ENDIF()
396 # Windows needs winmm for timeGetTime, even if the backend is disabled
397 CHECK_SHARED_FUNCTION_EXISTS(timeGetTime "windows.h;mmsystem.h" winmm "" HAVE_LIBWINMM)
398 IF(HAVE_LIBWINMM)
399     SET(EXTRA_LIBS winmm ${EXTRA_LIBS})
400     SET(PKG_CONFIG_LIBS ${PKG_CONFIG_LIBS} -lwinmm)
401 ENDIF()
404 SET(OPENAL_OBJS  OpenAL32/alAuxEffectSlot.c
405                  OpenAL32/alBuffer.c
406                  OpenAL32/alEffect.c
407                  OpenAL32/alError.c
408                  OpenAL32/alExtension.c
409                  OpenAL32/alFilter.c
410                  OpenAL32/alListener.c
411                  OpenAL32/alSource.c
412                  OpenAL32/alState.c
413                  OpenAL32/alThunk.c
415 SET(ALC_OBJS  Alc/ALc.c
416               Alc/ALu.c
417               Alc/alcConfig.c
418               Alc/alcDedicated.c
419               Alc/alcEcho.c
420               Alc/alcModulator.c
421               Alc/alcReverb.c
422               Alc/alcRing.c
423               Alc/alcThread.c
424               Alc/bs2b.c
425               Alc/helpers.c
426               Alc/hrtf.c
427               Alc/mixer.c
428               Alc/panning.c
429               # Default backends, always available
430               Alc/backends/loopback.c
431               Alc/backends/null.c
434 SET(BACKENDS "")
435 SET(HAVE_ALSA       0)
436 SET(HAVE_OSS        0)
437 SET(HAVE_SOLARIS    0)
438 SET(HAVE_SNDIO      0)
439 SET(HAVE_DSOUND     0)
440 SET(HAVE_MMDEVAPI   0)
441 SET(HAVE_WINMM      0)
442 SET(HAVE_PORTAUDIO  0)
443 SET(HAVE_PULSEAUDIO 0)
444 SET(HAVE_COREAUDIO  0)
445 SET(HAVE_OPENSL     0)
446 SET(HAVE_WAVE       0)
448 # Check ALSA backend
449 IF(ALSA)
450     CHECK_INCLUDE_FILE(alsa/asoundlib.h HAVE_ALSA_ASOUNDLIB_H)
451     IF(HAVE_ALSA_ASOUNDLIB_H)
452         CHECK_SHARED_FUNCTION_EXISTS(snd_pcm_open "alsa/asoundlib.h" asound "" HAVE_LIBASOUND)
453         IF(HAVE_LIBASOUND OR HAVE_DLFCN_H OR WIN32)
454             SET(HAVE_ALSA 1)
455             SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/alsa.c)
456             IF(HAVE_DLFCN_H OR WIN32)
457                 SET(BACKENDS  "${BACKENDS} ALSA,")
458             ELSE()
459                 SET(BACKENDS  "${BACKENDS} ALSA \(linked\),")
460                 SET(EXTRA_LIBS asound ${EXTRA_LIBS})
461             ENDIF()
462         ENDIF()
463     ENDIF()
464 ENDIF()
465 IF(REQUIRE_ALSA AND NOT HAVE_ALSA)
466     MESSAGE(FATAL_ERROR "Failed to enabled required ALSA backend")
467 ENDIF()
469 # Check OSS backend
470 IF(OSS)
471     CHECK_INCLUDE_FILE(sys/soundcard.h HAVE_SYS_SOUNDCARD_H)
472     IF(HAVE_SYS_SOUNDCARD_H)
473         SET(HAVE_OSS 1)
474         SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/oss.c)
475         SET(BACKENDS  "${BACKENDS} OSS,")
476     ENDIF()
477 ENDIF()
478 IF(REQUIRE_OSS AND NOT HAVE_OSS)
479     MESSAGE(FATAL_ERROR "Failed to enabled required OSS backend")
480 ENDIF()
482 # Check Solaris backend
483 IF(SOLARIS)
484     CHECK_INCLUDE_FILE(sys/audioio.h HAVE_SYS_AUDIOIO_H)
485     IF(HAVE_SYS_AUDIOIO_H)
486         SET(HAVE_SOLARIS 1)
487         SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/solaris.c)
488         SET(BACKENDS  "${BACKENDS} Solaris,")
489     ENDIF()
490 ENDIF()
491 IF(REQUIRE_SOLARIS AND NOT HAVE_SOLARIS)
492     MESSAGE(FATAL_ERROR "Failed to enabled required Solaris backend")
493 ENDIF()
495 # Check SndIO backend
496 IF(SNDIO)
497     CHECK_INCLUDE_FILE(sndio.h HAVE_SNDIO_H)
498     IF(HAVE_SNDIO_H)
499         CHECK_SHARED_FUNCTION_EXISTS(sio_open "sndio.h" sndio "" HAVE_LIBSNDIO)
500         IF(HAVE_LIBSNDIO OR HAVE_DLFCN_H OR WIN32)
501             SET(HAVE_SNDIO 1)
502             SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/sndio.c)
503             IF(HAVE_DLFCN_H OR WIN32)
504                 SET(BACKENDS  "${BACKENDS} SndIO,")
505             ELSE()
506                 SET(BACKENDS  "${BACKENDS} SndIO \(linked\),")
507                 SET(EXTRA_LIBS sndio ${EXTRA_LIBS})
508             ENDIF()
509         ENDIF()
510     ENDIF()
511 ENDIF()
512 IF(REQUIRE_SNDIO AND NOT HAVE_SNDIO)
513     MESSAGE(FATAL_ERROR "Failed to enabled required SndIO backend")
514 ENDIF()
516 # Check for MMDevApi backend
517 IF(HAVE_WINDOWS_H)
518     IF(MMDEVAPI)
519         CHECK_INCLUDE_FILE(mmdeviceapi.h HAVE_MMDEVICEAPI_H)
520         IF(HAVE_MMDEVICEAPI_H)
521             SET(HAVE_MMDEVAPI 1)
522             SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/mmdevapi.c)
524             SET(BACKENDS  "${BACKENDS} MMDevApi,")
525         ENDIF()
526     ENDIF()
527 ENDIF()
528 IF(REQUIRE_MMDEVAPI AND NOT HAVE_MMDEVAPI)
529     MESSAGE(FATAL_ERROR "Failed to enabled required MMDevApi backend")
530 ENDIF()
532 # Check DSound/MMSystem backend
533 IF(DSOUND)
534     CHECK_INCLUDE_FILE(dsound.h HAVE_DSOUND_H)
535     IF(HAVE_DSOUND_H)
536         CHECK_SHARED_FUNCTION_EXISTS(DirectSoundCreate "dsound.h" dsound "" HAVE_LIBDSOUND)
537         IF(HAVE_LIBDSOUND OR HAVE_DLFCN_H OR WIN32)
538             SET(HAVE_DSOUND 1)
539             SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/dsound.c)
541             IF(HAVE_DLFCN_H OR WIN32)
542                 SET(BACKENDS  "${BACKENDS} DirectSound,")
543             ELSE()
544                 SET(BACKENDS  "${BACKENDS} DirectSound \(linked\),")
545                 SET(EXTRA_LIBS dsound ${EXTRA_LIBS})
546             ENDIF()
547         ENDIF()
548     ENDIF()
549 ENDIF()
550 IF(REQUIRE_DSOUND AND NOT HAVE_DSOUND)
551     MESSAGE(FATAL_ERROR "Failed to enabled required DSound backend")
552 ENDIF()
554 IF(HAVE_WINDOWS_H)
555     IF(WINMM)
556         CHECK_INCLUDE_FILES("windows.h;mmsystem.h" HAVE_MMSYSTEM_H -D_WIN32_WINNT=0x0501)
557         IF(HAVE_MMSYSTEM_H AND HAVE_LIBWINMM)
558             SET(HAVE_WINMM 1)
559             SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/winmm.c)
560             SET(BACKENDS  "${BACKENDS} WinMM,")
561         ENDIF()
562     ENDIF()
563 ENDIF()
564 IF(REQUIRE_WINMM AND NOT HAVE_WINMM)
565     MESSAGE(FATAL_ERROR "Failed to enabled required WinMM backend")
566 ENDIF()
568 # Check PortAudio backend
569 IF(PORTAUDIO)
570     CHECK_INCLUDE_FILE(portaudio.h HAVE_PORTAUDIO_H)
571     IF(HAVE_PORTAUDIO_H)
572         CHECK_SHARED_FUNCTION_EXISTS(Pa_Initialize "portaudio.h" portaudio "" HAVE_LIBPORTAUDIO)
573         IF(HAVE_LIBPORTAUDIO OR HAVE_DLFCN_H OR WIN32)
574             SET(HAVE_PORTAUDIO 1)
575             SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/portaudio.c)
576             IF(HAVE_DLFCN_H OR WIN32)
577                 SET(BACKENDS  "${BACKENDS} PortAudio,")
578             ELSE()
579                 SET(BACKENDS  "${BACKENDS} PortAudio \(linked\),")
580                 SET(EXTRA_LIBS portaudio ${EXTRA_LIBS})
581             ENDIF()
582         ENDIF()
583     ENDIF()
584 ENDIF()
585 IF(REQUIRE_PORTAUDIO AND NOT HAVE_PORTAUDIO)
586     MESSAGE(FATAL_ERROR "Failed to enabled required PortAudio backend")
587 ENDIF()
589 # Check PulseAudio backend
590 IF(PULSEAUDIO)
591     CHECK_INCLUDE_FILE(pulse/pulseaudio.h HAVE_PULSE_PULSEAUDIO_H)
592     IF(HAVE_PULSE_PULSEAUDIO_H)
593         CHECK_SHARED_FUNCTION_EXISTS(pa_context_new "pulse/pulseaudio.h" pulse "" HAVE_LIBPULSE)
594         IF(HAVE_LIBPULSE OR HAVE_DLFCN_H OR WIN32)
595             SET(HAVE_PULSEAUDIO 1)
596             SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/pulseaudio.c)
597             IF(HAVE_DLFCN_H OR WIN32)
598                 SET(BACKENDS  "${BACKENDS} PulseAudio,")
599             ELSE()
600                 SET(BACKENDS  "${BACKENDS} PulseAudio \(linked\),")
601                 SET(EXTRA_LIBS pulse ${EXTRA_LIBS})
602             ENDIF()
603         ENDIF()
604     ENDIF()
605 ENDIF()
606 IF(REQUIRE_PULSEAUDIO AND NOT HAVE_PULSEAUDIO)
607     MESSAGE(FATAL_ERROR "Failed to enabled required PulseAudio backend")
608 ENDIF()
610 # Check CoreAudio backend
611 IF(COREAUDIO)
612     CHECK_INCLUDE_FILE(/System/Library/Frameworks/CoreAudio.framework/Headers/CoreAudio.h HAVE_COREAUDIO_FRAMEWORK)
613     IF(HAVE_COREAUDIO_FRAMEWORK)
614         SET(HAVE_COREAUDIO 1)
615         SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/coreaudio.c)
616         SET(BACKENDS  "${BACKENDS} CoreAudio,")
617         SET(EXTRA_LIBS /System/Library/Frameworks/CoreAudio.framework ${EXTRA_LIBS})
618         SET(EXTRA_LIBS /System/Library/Frameworks/AudioUnit.framework ${EXTRA_LIBS})
619         SET(EXTRA_LIBS /System/Library/Frameworks/ApplicationServices.framework ${EXTRA_LIBS})
621         # Some versions of OSX may need the AudioToolbox framework. Add it if
622         # it's found.
623         FIND_LIBRARY(AUDIOTOOLBOX_LIBRARY
624                      NAMES AudioToolbox
625                      PATHS ~/Library/Frameworks
626                            /Library/Frameworks
627                            /System/Library/Frameworks
628                     )
629         IF(AUDIOTOOLBOX_LIBRARY)
630             SET(EXTRA_LIBS ${AUDIOTOOLBOX_LIBRARY} ${EXTRA_LIBS})
631         ENDIF()
632     ENDIF()
633 ENDIF()
634 IF(REQUIRE_COREAUDIO AND NOT HAVE_COREAUDIO)
635     MESSAGE(FATAL_ERROR "Failed to enabled required CoreAudio backend")
636 ENDIF()
638 # Check for OpenSL (Android) backend
639 IF(OPENSL)
640     CHECK_INCLUDE_FILES("SLES/OpenSLES.h;SLES/OpenSLES_Android.h" HAVE_SLES_OPENSLES_ANDROID_H)
641     IF(HAVE_SLES_OPENSLES_ANDROID_H)
642         CHECK_SHARED_FUNCTION_EXISTS(slCreateEngine "SLES/OpenSLES.h" OpenSLES "" HAVE_LIBOPENSLES)
643         IF(HAVE_LIBOPENSLES)
644             SET(HAVE_OPENSL 1)
645             SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/opensl.c)
646             SET(BACKENDS  "${BACKENDS} OpenSL,")
647             SET(EXTRA_LIBS OpenSLES ${EXTRA_LIBS})
648         ENDIF()
649     ENDIF()
650 ENDIF()
651 IF(REQUIRE_OPENSL AND NOT HAVE_OPENSL)
652     MESSAGE(FATAL_ERROR "Failed to enabled required OpenSL backend")
653 ENDIF()
655 # Optionally enable the Wave Writer backend
656 IF(WAVE)
657     SET(HAVE_WAVE 1)
658     SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/wave.c)
659     SET(BACKENDS  "${BACKENDS} WaveFile,")
660 ENDIF()
662 # This is always available
663 SET(BACKENDS  "${BACKENDS} Null")
665 IF(EXAMPLES)
666     # Might be able to use earlier versions, but these definitely work
667     PKG_CHECK_MODULES(FFMPEG libavcodec>=52.123.0 libavformat>=52.111.0 libavutil>=51.9.1)
668 ENDIF()
670 IF(LIBTYPE STREQUAL "STATIC")
671     ADD_DEFINITIONS(-DAL_LIBTYPE_STATIC)
672     SET(PKG_CONFIG_CFLAGS -DAL_LIBTYPE_STATIC ${PKG_CONFIG_CFLAGS})
673 ENDIF()
675 # Needed for openal.pc.in
676 SET(prefix ${CMAKE_INSTALL_PREFIX})
677 SET(exec_prefix "\${prefix}")
678 SET(libdir "\${exec_prefix}/lib${LIB_SUFFIX}")
679 SET(bindir "\${exec_prefix}/bin")
680 SET(includedir "\${prefix}/include")
681 SET(PACKAGE_VERSION "${LIB_VERSION}")
683 # End configuration
684 CONFIGURE_FILE(
685     "${OpenAL_SOURCE_DIR}/config.h.in"
686     "${OpenAL_BINARY_DIR}/config.h")
687 CONFIGURE_FILE(
688     "${OpenAL_SOURCE_DIR}/openal.pc.in"
689     "${OpenAL_BINARY_DIR}/openal.pc"
690     @ONLY)
692 # Build a library
693 ADD_LIBRARY(${LIBNAME} ${LIBTYPE} ${OPENAL_OBJS} ${ALC_OBJS})
694 SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES DEFINE_SYMBOL AL_BUILD_LIBRARY
695                                             COMPILE_FLAGS -DAL_ALEXT_PROTOTYPES
696                                             VERSION ${LIB_VERSION}.0
697                                             SOVERSION ${LIB_MAJOR_VERSION})
698 IF(WIN32 AND NOT LIBTYPE STREQUAL "STATIC")
699     SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES PREFIX "")
700 ENDIF()
702 TARGET_LINK_LIBRARIES(${LIBNAME} ${EXTRA_LIBS})
704 # Add an install target here
705 INSTALL(TARGETS ${LIBNAME}
706         RUNTIME DESTINATION bin
707         LIBRARY DESTINATION "lib${LIB_SUFFIX}"
708         ARCHIVE DESTINATION "lib${LIB_SUFFIX}"
710 INSTALL(FILES include/AL/al.h
711               include/AL/alc.h
712               include/AL/alext.h
713               include/AL/efx.h
714               include/AL/efx-creative.h
715               include/AL/efx-presets.h
716         DESTINATION include/AL
718 INSTALL(FILES "${OpenAL_BINARY_DIR}/openal.pc"
719         DESTINATION "lib${LIB_SUFFIX}/pkgconfig")
722 MESSAGE(STATUS "")
723 MESSAGE(STATUS "Building OpenAL with support for the following backends:")
724 MESSAGE(STATUS "    ${BACKENDS}")
725 MESSAGE(STATUS "")
727 IF(WIN32)
728     IF(NOT HAVE_DSOUND)
729         MESSAGE(STATUS "WARNING: Building the Windows version without DirectSound output")
730         MESSAGE(STATUS "         This is probably NOT what you want!")
731         MESSAGE(STATUS "")
732     ENDIF()
733 ENDIF()
735 # Install alsoft.conf configuration file
736 IF(ALSOFT_CONFIG)
737     INSTALL(FILES alsoftrc.sample
738             DESTINATION /etc/openal
739             RENAME alsoft.conf
740     )
741     MESSAGE(STATUS "Installing sample alsoft.conf")
742     MESSAGE(STATUS "")
743 ENDIF()
745 IF(UTILS)
746     ADD_EXECUTABLE(openal-info utils/openal-info.c)
747     TARGET_LINK_LIBRARIES(openal-info ${LIBNAME})
749     ADD_EXECUTABLE(makehrtf utils/makehrtf.c)
750     IF(HAVE_LIBM)
751         TARGET_LINK_LIBRARIES(makehrtf m)
752     ENDIF()
754     INSTALL(TARGETS openal-info makehrtf
755             RUNTIME DESTINATION bin
756             LIBRARY DESTINATION "lib${LIB_SUFFIX}"
757             ARCHIVE DESTINATION "lib${LIB_SUFFIX}"
758     )
759     MESSAGE(STATUS "Building utility programs")
760     MESSAGE(STATUS "")
761 ENDIF()
763 IF(EXAMPLES)
764     IF(FFMPEG_FOUND)
765         ADD_EXECUTABLE(alstream examples/alhelpers.c examples/alffmpeg.c examples/alstream.c)
766         TARGET_LINK_LIBRARIES(alstream ${FFMPEG_LIBRARIES} ${LIBNAME})
767         SET_TARGET_PROPERTIES(alstream PROPERTIES COMPILE_FLAGS "${FFMPEG_CFLAGS}")
768         INSTALL(TARGETS alstream
769                 RUNTIME DESTINATION bin
770                 LIBRARY DESTINATION "lib${LIB_SUFFIX}"
771                 ARCHIVE DESTINATION "lib${LIB_SUFFIX}"
772         )
774         MESSAGE(STATUS "Building ffmpeg example programs")
775         MESSAGE(STATUS "")
776     ENDIF()
777 ENDIF()