Check the correct macro for ARM Neon support
[openal-soft/openal-hmr.git] / CMakeLists.txt
blobd9eb08268e13771a86346f82683a37dfae8a7f17
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(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)
72 IF(WIN32)
73     SET(LIBNAME OpenAL32)
74     ADD_DEFINITIONS("-D_WIN32 -D_WIN32_WINNT=0x0501")
75 ELSE()
76     SET(LIBNAME openal)
77 ENDIF()
79 IF(NOT LIBTYPE)
80     SET(LIBTYPE SHARED)
81 ENDIF()
83 SET(LIB_MAJOR_VERSION "1")
84 SET(LIB_MINOR_VERSION "14")
85 SET(LIB_VERSION "${LIB_MAJOR_VERSION}.${LIB_MINOR_VERSION}")
87 SET(EXPORT_DECL "")
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."
106         FORCE)
107 ENDIF()
108 IF(NOT CMAKE_DEBUG_POSTFIX)
109     SET(CMAKE_DEBUG_POSTFIX "" CACHE STRING
110         "Library postfix for debug builds. Normally left blank."
111         FORCE)
112 ENDIF()
114 IF(MSVC)
115     # ???
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)
123     IF(NOT DXSDK_DIR)
124         STRING(REGEX REPLACE "\\\\" "/" DXSDK_DIR "$ENV{DXSDK_DIR}")
125     ELSE()
126         STRING(REGEX REPLACE "\\\\" "/" DXSDK_DIR "${DXSDK_DIR}")
127     ENDIF()
128     IF(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")
133     ENDIF()
135     OPTION(FORCE_STATIC_VCRT "Force /MT for static VC runtimes" OFF)
136     IF(FORCE_STATIC_VCRT)
137         FOREACH(flag_var
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}}")
142             ENDIF()
143         ENDFOREACH(flag_var)
144     ENDIF()
145 ELSE()
146     ADD_DEFINITIONS(-Winline -Wall)
147     CHECK_C_COMPILER_FLAG(-Wextra HAVE_W_EXTRA)
148     IF(HAVE_W_EXTRA)
149         ADD_DEFINITIONS(-Wextra)
150     ENDIF()
152     IF(WERROR)
153         ADD_DEFINITIONS(-Werror)
154     ENDIF()
156     SET(CMAKE_C_FLAGS_RELWITHDEBINFO "-g -O2 -D_DEBUG" CACHE STRING
157         "Flags used by the compiler during Release with Debug Info builds."
158         FORCE)
159     SET(CMAKE_C_FLAGS_MINSIZEREL "-Os -DNDEBUG" CACHE STRING
160         "Flags used by the compiler during release minsize builds."
161         FORCE)
162     SET(CMAKE_C_FLAGS_RELEASE "-O2 -fomit-frame-pointer -DNDEBUG" CACHE STRING
163         "Flags used by the compiler during release builds"
164         FORCE)
165     SET(CMAKE_C_FLAGS_DEBUG "-g3 -D_DEBUG" CACHE STRING
166         "Flags used by the compiler during debug builds."
167         FORCE)
169     CHECK_C_SOURCE_COMPILES("int foo() __attribute__((destructor));
170                              int main() {return 0;}" HAVE_GCC_DESTRUCTOR)
171 ENDIF()
173 # Set visibility/export options if available
174 IF(WIN32)
175     SET(EXPORT_DECL "__declspec(dllexport)")
177     OPTION(WINE "Enable use of Wine headers when compiling" OFF)
178     IF(WINE)
179         FIND_PATH(WINE_INCLUDE_DIR library.h
180                   PATHS
181                   /usr/include/wine
182                   /usr/local/include/wine
183                   CMAKE_FIND_ROOT_PATH_BOTH)
184         IF(WINE_INCLUDE_DIR)
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")
188         ELSE()
189             MESSAGE(STATUS "Could not find Wine header files" )
190         ENDIF()
191     ENDIF()
192 ELSE()
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\")))")
201     ELSE()
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\")))")
206         ENDIF()
207     ENDIF()
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)
213         ELSE()
214             CHECK_C_COMPILER_FLAG(-fvisibility=hidden HAVE_VISIBILITY_HIDDEN_SWITCH)
215             IF(HAVE_VISIBILITY_HIDDEN_SWITCH)
216                 ADD_DEFINITIONS(-fvisibility=hidden)
217             ENDIF()
218         ENDIF()
219     ENDIF()
221     SET(CMAKE_REQUIRED_FLAGS "${OLD_REQUIRED_FLAGS}")
222 ENDIF()
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)
235 ENDIF()
237 # Some systems need libm for some of the following math functions to work
238 CHECK_LIBRARY_EXISTS(m pow "" HAVE_LIBM)
239 IF(HAVE_LIBM)
240     SET(EXTRA_LIBS m ${EXTRA_LIBS})
241     SET(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} m)
242 ENDIF()
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)
257 IF(HAVE_FENV_H)
258     CHECK_SYMBOL_EXISTS(fesetround fenv.h HAVE_FESETROUND)
259 ENDIF()
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!")
270     ENDIF()
272     ADD_DEFINITIONS(-Dstrcasecmp=_stricmp)
273 ENDIF()
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!")
280     ENDIF()
282     ADD_DEFINITIONS(-Dstrncasecmp=_strnicmp)
283 ENDIF()
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!")
290     ENDIF()
292     ADD_DEFINITIONS(-Dsnprintf=_snprintf)
293 ENDIF()
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!")
300     ENDIF()
302     ADD_DEFINITIONS(-Dvsnprintf=_vsnprintf)
303 ENDIF()
305 CHECK_SYMBOL_EXISTS(isfinite math.h HAVE_ISFINITE)
306 IF(NOT HAVE_ISFINITE)
307     CHECK_FUNCTION_EXISTS(finite HAVE_FINITE)
308     IF(NOT HAVE_FINITE)
309         CHECK_FUNCTION_EXISTS(_finite HAVE__FINITE)
310         IF(NOT HAVE__FINITE)
311             MESSAGE(FATAL_ERROR "No isfinite function found, please report!")
312         ENDIF()
313         ADD_DEFINITIONS(-Disfinite=_finite)
314     ELSE()
315         ADD_DEFINITIONS(-Disfinite=finite)
316     ENDIF()
317 ENDIF()
319 CHECK_SYMBOL_EXISTS(isnan math.h HAVE_ISNAN)
320 IF(NOT HAVE_ISNAN)
321     CHECK_FUNCTION_EXISTS(_isnan HAVE__ISNAN)
322     IF(NOT HAVE__ISNAN)
323         MESSAGE(FATAL_ERROR "No isnan function found, please report!")
324     ENDIF()
326     ADD_DEFINITIONS(-Disnan=_isnan)
327 ENDIF()
330 # Check for the dlopen API (for dynamicly loading backend libs)
331 IF(DLOPEN)
332     CHECK_INCLUDE_FILE(dlfcn.h HAVE_DLFCN_H)
333     IF(HAVE_DLFCN_H)
334         CHECK_LIBRARY_EXISTS(dl dlopen "" HAVE_LIBDL)
335         IF(HAVE_LIBDL)
336             SET(EXTRA_LIBS dl ${EXTRA_LIBS})
337         ENDIF()
338     ENDIF()
339 ENDIF()
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!")
347     ENDIF()
349     CHECK_FUNCTION_EXISTS(nanosleep HAVE_NANOSLEEP)
350     IF(NOT HAVE_NANOSLEEP)
351         MESSAGE(FATAL_ERROR "No sleep function found!")
352     ENDIF()
354     CHECK_C_COMPILER_FLAG(-pthread HAVE_PTHREAD)
355     IF(HAVE_PTHREAD)
356         ADD_DEFINITIONS(-pthread)
357         SET(EXTRA_LIBS ${EXTRA_LIBS} -pthread)
358     ENDIF()
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!")
364     ENDIF()
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)
371     IF(HAVE_LIBPTHREAD)
372         SET(EXTRA_LIBS pthread ${EXTRA_LIBS})
373     ENDIF()
375     CHECK_LIBRARY_EXISTS(pthread pthread_setschedparam "" HAVE_PTHREAD_SETSCHEDPARAM)
377     CHECK_LIBRARY_EXISTS(rt clock_gettime "" HAVE_LIBRT)
378     IF(HAVE_LIBRT)
379         SET(EXTRA_LIBS rt ${EXTRA_LIBS})
380     ENDIF()
381 ENDIF()
383 # Check for a 64-bit type
384 CHECK_INCLUDE_FILE(stdint.h HAVE_STDINT_H)
385 IF(NOT HAVE_STDINT_H)
386     IF(HAVE_WINDOWS_H)
387         CHECK_C_SOURCE_COMPILES("\#define _WIN32_WINNT 0x0501
388                                  \#include <windows.h>
389                                  __int64 foo;
390                                  int main() {return 0;}" HAVE___INT64)
391     ENDIF()
392     IF(NOT 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!")
396             ENDIF()
397         ENDIF()
398     ENDIF()
399 ENDIF()
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)
403 IF(HAVE_LIBWINMM)
404     SET(EXTRA_LIBS winmm ${EXTRA_LIBS})
405     SET(PKG_CONFIG_LIBS ${PKG_CONFIG_LIBS} -lwinmm)
406 ENDIF()
409 SET(OPENAL_OBJS  OpenAL32/alAuxEffectSlot.c
410                  OpenAL32/alBuffer.c
411                  OpenAL32/alEffect.c
412                  OpenAL32/alError.c
413                  OpenAL32/alExtension.c
414                  OpenAL32/alFilter.c
415                  OpenAL32/alListener.c
416                  OpenAL32/alSource.c
417                  OpenAL32/alState.c
418                  OpenAL32/alThunk.c
420 SET(ALC_OBJS  Alc/ALc.c
421               Alc/ALu.c
422               Alc/alcConfig.c
423               Alc/alcDedicated.c
424               Alc/alcEcho.c
425               Alc/alcModulator.c
426               Alc/alcReverb.c
427               Alc/alcRing.c
428               Alc/alcThread.c
429               Alc/bs2b.c
430               Alc/helpers.c
431               Alc/panning.c
432               Alc/hrtf.c
433               Alc/mixer.c
434               Alc/mixer_c.c
438 SET(CPU_EXTS "Default")
439 SET(HAVE_SSE  0)
440 SET(HAVE_NEON 0)
442 # Check for SSE support
443 IF(SSE)
444     CHECK_INCLUDE_FILE(xmmintrin.h HAVE_XMMINTRIN_H)
445     IF(HAVE_XMMINTRIN_H)
446         SET(HAVE_SSE 1)
447         SET(ALC_OBJS  ${ALC_OBJS} Alc/mixer_sse.c)
448         SET(CPU_EXTS "${CPU_EXTS}, SSE")
449     ENDIF()
450 ENDIF()
451 IF(REQUIRE_SSE AND NOT HAVE_SSE)
452     MESSAGE(FATAL_ERROR "Failed to enabled required SSE CPU extensions")
453 ENDIF()
455 # Check for ARM Neon support
456 IF(NEON)
457     CHECK_INCLUDE_FILE(arm_neon.h HAVE_ARM_NEON_H)
458     IF(HAVE_ARM_NEON_H)
459         SET(HAVE_NEON 1)
460         SET(ALC_OBJS  ${ALC_OBJS} Alc/mixer_neon.c)
461         SET(CPU_EXTS "${CPU_EXTS}, Neon")
462     ENDIF()
463 ENDIF()
464 IF(REQUIRE_NEON AND NOT HAVE_NEON)
465     MESSAGE(FATAL_ERROR "Failed to enabled required ARM Neon CPU extensions")
466 ENDIF()
469 SET(ALC_OBJS  ${ALC_OBJS}
470               # Default backends, always available
471               Alc/backends/loopback.c
472               Alc/backends/null.c
475 SET(BACKENDS "")
476 SET(HAVE_ALSA       0)
477 SET(HAVE_OSS        0)
478 SET(HAVE_SOLARIS    0)
479 SET(HAVE_SNDIO      0)
480 SET(HAVE_DSOUND     0)
481 SET(HAVE_MMDEVAPI   0)
482 SET(HAVE_WINMM      0)
483 SET(HAVE_PORTAUDIO  0)
484 SET(HAVE_PULSEAUDIO 0)
485 SET(HAVE_COREAUDIO  0)
486 SET(HAVE_OPENSL     0)
487 SET(HAVE_WAVE       0)
489 # Check ALSA backend
490 IF(ALSA)
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)
495             SET(HAVE_ALSA 1)
496             SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/alsa.c)
497             IF(HAVE_DLFCN_H OR WIN32)
498                 SET(BACKENDS  "${BACKENDS} ALSA,")
499             ELSE()
500                 SET(BACKENDS  "${BACKENDS} ALSA \(linked\),")
501                 SET(EXTRA_LIBS asound ${EXTRA_LIBS})
502             ENDIF()
503         ENDIF()
504     ENDIF()
505 ENDIF()
506 IF(REQUIRE_ALSA AND NOT HAVE_ALSA)
507     MESSAGE(FATAL_ERROR "Failed to enabled required ALSA backend")
508 ENDIF()
510 # Check OSS backend
511 IF(OSS)
512     CHECK_INCLUDE_FILE(sys/soundcard.h HAVE_SYS_SOUNDCARD_H)
513     IF(HAVE_SYS_SOUNDCARD_H)
514         SET(HAVE_OSS 1)
515         SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/oss.c)
516         SET(BACKENDS  "${BACKENDS} OSS,")
517     ENDIF()
518 ENDIF()
519 IF(REQUIRE_OSS AND NOT HAVE_OSS)
520     MESSAGE(FATAL_ERROR "Failed to enabled required OSS backend")
521 ENDIF()
523 # Check Solaris backend
524 IF(SOLARIS)
525     CHECK_INCLUDE_FILE(sys/audioio.h HAVE_SYS_AUDIOIO_H)
526     IF(HAVE_SYS_AUDIOIO_H)
527         SET(HAVE_SOLARIS 1)
528         SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/solaris.c)
529         SET(BACKENDS  "${BACKENDS} Solaris,")
530     ENDIF()
531 ENDIF()
532 IF(REQUIRE_SOLARIS AND NOT HAVE_SOLARIS)
533     MESSAGE(FATAL_ERROR "Failed to enabled required Solaris backend")
534 ENDIF()
536 # Check SndIO backend
537 IF(SNDIO)
538     CHECK_INCLUDE_FILE(sndio.h HAVE_SNDIO_H)
539     IF(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)
542             SET(HAVE_SNDIO 1)
543             SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/sndio.c)
544             IF(HAVE_DLFCN_H OR WIN32)
545                 SET(BACKENDS  "${BACKENDS} SndIO,")
546             ELSE()
547                 SET(BACKENDS  "${BACKENDS} SndIO \(linked\),")
548                 SET(EXTRA_LIBS sndio ${EXTRA_LIBS})
549             ENDIF()
550         ENDIF()
551     ENDIF()
552 ENDIF()
553 IF(REQUIRE_SNDIO AND NOT HAVE_SNDIO)
554     MESSAGE(FATAL_ERROR "Failed to enabled required SndIO backend")
555 ENDIF()
557 # Check for MMDevApi backend
558 IF(HAVE_WINDOWS_H)
559     IF(MMDEVAPI)
560         CHECK_INCLUDE_FILE(mmdeviceapi.h HAVE_MMDEVICEAPI_H)
561         IF(HAVE_MMDEVICEAPI_H)
562             SET(HAVE_MMDEVAPI 1)
563             SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/mmdevapi.c)
565             SET(BACKENDS  "${BACKENDS} MMDevApi,")
566         ENDIF()
567     ENDIF()
568 ENDIF()
569 IF(REQUIRE_MMDEVAPI AND NOT HAVE_MMDEVAPI)
570     MESSAGE(FATAL_ERROR "Failed to enabled required MMDevApi backend")
571 ENDIF()
573 # Check DSound/MMSystem backend
574 IF(DSOUND)
575     CHECK_INCLUDE_FILE(dsound.h HAVE_DSOUND_H)
576     IF(HAVE_DSOUND_H)
577         CHECK_SHARED_FUNCTION_EXISTS(DirectSoundCreate "dsound.h" dsound "" HAVE_LIBDSOUND)
578         IF(HAVE_LIBDSOUND OR HAVE_DLFCN_H OR WIN32)
579             SET(HAVE_DSOUND 1)
580             SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/dsound.c)
582             IF(HAVE_DLFCN_H OR WIN32)
583                 SET(BACKENDS  "${BACKENDS} DirectSound,")
584             ELSE()
585                 SET(BACKENDS  "${BACKENDS} DirectSound \(linked\),")
586                 SET(EXTRA_LIBS dsound ${EXTRA_LIBS})
587             ENDIF()
588         ENDIF()
589     ENDIF()
590 ENDIF()
591 IF(REQUIRE_DSOUND AND NOT HAVE_DSOUND)
592     MESSAGE(FATAL_ERROR "Failed to enabled required DSound backend")
593 ENDIF()
595 IF(HAVE_WINDOWS_H)
596     IF(WINMM)
597         CHECK_INCLUDE_FILES("windows.h;mmsystem.h" HAVE_MMSYSTEM_H -D_WIN32_WINNT=0x0501)
598         IF(HAVE_MMSYSTEM_H AND HAVE_LIBWINMM)
599             SET(HAVE_WINMM 1)
600             SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/winmm.c)
601             SET(BACKENDS  "${BACKENDS} WinMM,")
602         ENDIF()
603     ENDIF()
604 ENDIF()
605 IF(REQUIRE_WINMM AND NOT HAVE_WINMM)
606     MESSAGE(FATAL_ERROR "Failed to enabled required WinMM backend")
607 ENDIF()
609 # Check PortAudio backend
610 IF(PORTAUDIO)
611     CHECK_INCLUDE_FILE(portaudio.h HAVE_PORTAUDIO_H)
612     IF(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,")
619             ELSE()
620                 SET(BACKENDS  "${BACKENDS} PortAudio \(linked\),")
621                 SET(EXTRA_LIBS portaudio ${EXTRA_LIBS})
622             ENDIF()
623         ENDIF()
624     ENDIF()
625 ENDIF()
626 IF(REQUIRE_PORTAUDIO AND NOT HAVE_PORTAUDIO)
627     MESSAGE(FATAL_ERROR "Failed to enabled required PortAudio backend")
628 ENDIF()
630 # Check PulseAudio backend
631 IF(PULSEAUDIO)
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,")
640             ELSE()
641                 SET(BACKENDS  "${BACKENDS} PulseAudio \(linked\),")
642                 SET(EXTRA_LIBS pulse ${EXTRA_LIBS})
643             ENDIF()
644         ENDIF()
645     ENDIF()
646 ENDIF()
647 IF(REQUIRE_PULSEAUDIO AND NOT HAVE_PULSEAUDIO)
648     MESSAGE(FATAL_ERROR "Failed to enabled required PulseAudio backend")
649 ENDIF()
651 # Check CoreAudio backend
652 IF(COREAUDIO)
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
663         # it's found.
664         FIND_LIBRARY(AUDIOTOOLBOX_LIBRARY
665                      NAMES AudioToolbox
666                      PATHS ~/Library/Frameworks
667                            /Library/Frameworks
668                            /System/Library/Frameworks
669                     )
670         IF(AUDIOTOOLBOX_LIBRARY)
671             SET(EXTRA_LIBS ${AUDIOTOOLBOX_LIBRARY} ${EXTRA_LIBS})
672         ENDIF()
673     ENDIF()
674 ENDIF()
675 IF(REQUIRE_COREAUDIO AND NOT HAVE_COREAUDIO)
676     MESSAGE(FATAL_ERROR "Failed to enabled required CoreAudio backend")
677 ENDIF()
679 # Check for OpenSL (Android) backend
680 IF(OPENSL)
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)
684         IF(HAVE_LIBOPENSLES)
685             SET(HAVE_OPENSL 1)
686             SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/opensl.c)
687             SET(BACKENDS  "${BACKENDS} OpenSL,")
688             SET(EXTRA_LIBS OpenSLES ${EXTRA_LIBS})
689         ENDIF()
690     ENDIF()
691 ENDIF()
692 IF(REQUIRE_OPENSL AND NOT HAVE_OPENSL)
693     MESSAGE(FATAL_ERROR "Failed to enabled required OpenSL backend")
694 ENDIF()
696 # Optionally enable the Wave Writer backend
697 IF(WAVE)
698     SET(HAVE_WAVE 1)
699     SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/wave.c)
700     SET(BACKENDS  "${BACKENDS} WaveFile,")
701 ENDIF()
703 # This is always available
704 SET(BACKENDS  "${BACKENDS} Null")
706 IF(EXAMPLES)
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)
709 ENDIF()
711 IF(LIBTYPE STREQUAL "STATIC")
712     ADD_DEFINITIONS(-DAL_LIBTYPE_STATIC)
713     SET(PKG_CONFIG_CFLAGS -DAL_LIBTYPE_STATIC ${PKG_CONFIG_CFLAGS})
714 ENDIF()
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}")
724 # End configuration
725 CONFIGURE_FILE(
726     "${OpenAL_SOURCE_DIR}/config.h.in"
727     "${OpenAL_BINARY_DIR}/config.h")
728 CONFIGURE_FILE(
729     "${OpenAL_SOURCE_DIR}/openal.pc.in"
730     "${OpenAL_BINARY_DIR}/openal.pc"
731     @ONLY)
733 # Build a library
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 "")
741 ENDIF()
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
752               include/AL/alc.h
753               include/AL/alext.h
754               include/AL/efx.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")
763 MESSAGE(STATUS "")
764 MESSAGE(STATUS "Building OpenAL with support for the following backends:")
765 MESSAGE(STATUS "    ${BACKENDS}")
766 MESSAGE(STATUS "")
767 MESSAGE(STATUS "Building with support for CPU extensions:")
768 MESSAGE(STATUS "    ${CPU_EXTS}")
769 MESSAGE(STATUS "")
771 IF(WIN32)
772     IF(NOT HAVE_DSOUND)
773         MESSAGE(STATUS "WARNING: Building the Windows version without DirectSound output")
774         MESSAGE(STATUS "         This is probably NOT what you want!")
775         MESSAGE(STATUS "")
776     ENDIF()
777 ENDIF()
779 # Install alsoft.conf configuration file
780 IF(ALSOFT_CONFIG)
781     INSTALL(FILES alsoftrc.sample
782             DESTINATION /etc/openal
783             RENAME alsoft.conf
784     )
785     MESSAGE(STATUS "Installing sample alsoft.conf")
786     MESSAGE(STATUS "")
787 ENDIF()
789 IF(UTILS)
790     ADD_EXECUTABLE(openal-info utils/openal-info.c)
791     TARGET_LINK_LIBRARIES(openal-info ${LIBNAME})
793     ADD_EXECUTABLE(makehrtf utils/makehrtf.c)
794     IF(HAVE_LIBM)
795         TARGET_LINK_LIBRARIES(makehrtf m)
796     ENDIF()
798     INSTALL(TARGETS openal-info makehrtf
799             RUNTIME DESTINATION bin
800             LIBRARY DESTINATION "lib${LIB_SUFFIX}"
801             ARCHIVE DESTINATION "lib${LIB_SUFFIX}"
802     )
803     MESSAGE(STATUS "Building utility programs")
804     MESSAGE(STATUS "")
805 ENDIF()
807 IF(EXAMPLES)
808     IF(FFMPEG_FOUND)
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}"
816         )
818         MESSAGE(STATUS "Building ffmpeg example programs")
819         MESSAGE(STATUS "")
820     ENDIF()
821 ENDIF()