Print an error if trying to handle a missed source property
[openal-soft.git] / CMakeLists.txt
blobed25e3348758f4a67be77330930bb2eba35ba332
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 sample configuration file" ON)
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 "15")
85 SET(LIB_VERSION "${LIB_MAJOR_VERSION}.${LIB_MINOR_VERSION}")
87 SET(EXPORT_DECL "")
88 SET(ALIGN_DECL "")
89 SET(RESTRICT_DECL "")
92 CHECK_TYPE_SIZE("long" SIZEOF_LONG)
93 CHECK_TYPE_SIZE("long long" SIZEOF_LONG_LONG)
96 CHECK_C_SOURCE_COMPILES("int *restrict foo;
97                          int main() {return 0;}" HAVE_RESTRICT)
98 IF(HAVE_RESTRICT)
99     SET(RESTRICT_DECL "restrict")
100 ELSE()
101     CHECK_C_SOURCE_COMPILES("int *__restrict foo;
102                              int main() {return 0;}" HAVE___RESTRICT)
103     IF(HAVE___RESTRICT)
104         SET(RESTRICT_DECL "__restrict")
105     ENDIF()
106 ENDIF()
109 # Add definitions, compiler switches, etc.
110 INCLUDE_DIRECTORIES(OpenAL32/Include include "${OpenAL_BINARY_DIR}")
112 IF(NOT CMAKE_BUILD_TYPE)
113     SET(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING
114         "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel."
115         FORCE)
116 ENDIF()
117 IF(NOT CMAKE_DEBUG_POSTFIX)
118     SET(CMAKE_DEBUG_POSTFIX "" CACHE STRING
119         "Library postfix for debug builds. Normally left blank."
120         FORCE)
121 ENDIF()
123 IF(MSVC)
124     # ???
125     SET(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -D_DEBUG")
126     SET(CMAKE_C_FLAGS_MINSIZEREL "${CMAKE_C_FLAGS_MINSIZEREL} -DNDEBUG")
127     SET(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -DNDEBUG")
128     SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -D_DEBUG")
129     ADD_DEFINITIONS(-D_CRT_SECURE_NO_WARNINGS)
130     ADD_DEFINITIONS(-D_CRT_NONSTDC_NO_DEPRECATE)
132     IF(NOT DXSDK_DIR)
133         STRING(REGEX REPLACE "\\\\" "/" DXSDK_DIR "$ENV{DXSDK_DIR}")
134     ELSE()
135         STRING(REGEX REPLACE "\\\\" "/" DXSDK_DIR "${DXSDK_DIR}")
136     ENDIF()
137     IF(DXSDK_DIR)
138         MESSAGE(STATUS "Using DirectX SDK directory: ${DXSDK_DIR}")
139         SET(CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES} "${DXSDK_DIR}/Include")
140         INCLUDE_DIRECTORIES("${DXSDK_DIR}/Include")
141         LINK_DIRECTORIES("${DXSDK_DIR}/Lib")
142     ENDIF()
144     OPTION(FORCE_STATIC_VCRT "Force /MT for static VC runtimes" OFF)
145     IF(FORCE_STATIC_VCRT)
146         FOREACH(flag_var
147                 CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE
148                 CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO)
149             IF(${flag_var} MATCHES "/MD")
150                 STRING(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}")
151             ENDIF()
152         ENDFOREACH(flag_var)
153     ENDIF()
154 ELSE()
155     ADD_DEFINITIONS(-Winline -Wall)
156     CHECK_C_COMPILER_FLAG(-Wextra HAVE_W_EXTRA)
157     IF(HAVE_W_EXTRA)
158         ADD_DEFINITIONS(-Wextra)
159     ENDIF()
161     IF(WERROR)
162         ADD_DEFINITIONS(-Werror)
163     ENDIF()
165     SET(CMAKE_C_FLAGS_RELWITHDEBINFO "-g -O2 -D_DEBUG" CACHE STRING
166         "Flags used by the compiler during Release with Debug Info builds."
167         FORCE)
168     SET(CMAKE_C_FLAGS_MINSIZEREL "-Os -DNDEBUG" CACHE STRING
169         "Flags used by the compiler during release minsize builds."
170         FORCE)
171     SET(CMAKE_C_FLAGS_RELEASE "-O2 -fomit-frame-pointer -DNDEBUG" CACHE STRING
172         "Flags used by the compiler during release builds"
173         FORCE)
174     SET(CMAKE_C_FLAGS_DEBUG "-g3 -D_DEBUG" CACHE STRING
175         "Flags used by the compiler during debug builds."
176         FORCE)
178     CHECK_C_SOURCE_COMPILES("int foo() __attribute__((destructor));
179                              int main() {return 0;}" HAVE_GCC_DESTRUCTOR)
180 ENDIF()
182 # Set visibility/export options if available
183 IF(WIN32)
184     SET(EXPORT_DECL "__declspec(dllexport)")
185     SET(ALIGN_DECL "__declspec(align(x))")
187     OPTION(WINE "Enable use of Wine headers when compiling" OFF)
188     IF(WINE)
189         FIND_PATH(WINE_INCLUDE_DIR library.h
190                   PATHS
191                   /usr/include/wine
192                   /usr/local/include/wine
193                   CMAKE_FIND_ROOT_PATH_BOTH)
194         IF(WINE_INCLUDE_DIR)
195             MESSAGE(STATUS "Found Wine header files - ${WINE_INCLUDE_DIR}" )
196             INCLUDE_DIRECTORIES("${WINE_INCLUDE_DIR}/windows")
197             SET(CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES} "${WINE_INCLUDE_DIR}/windows")
198         ELSE()
199             MESSAGE(STATUS "Could not find Wine header files" )
200         ENDIF()
201     ENDIF()
202 ELSE()
203     SET(OLD_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}")
204     # Yes GCC, really don't accept visibility modes you don't support
205     SET(CMAKE_REQUIRED_FLAGS "${OLD_REQUIRED_FLAGS} -Wattributes -Werror")
207     CHECK_C_SOURCE_COMPILES("int foo() __attribute__((visibility(\"protected\")));
208                              int main() {return 0;}" HAVE_GCC_PROTECTED_VISIBILITY)
209     IF(HAVE_GCC_PROTECTED_VISIBILITY)
210         SET(EXPORT_DECL "__attribute__((visibility(\"protected\")))")
211     ELSE()
212         CHECK_C_SOURCE_COMPILES("int foo() __attribute__((visibility(\"default\")));
213                                  int main() {return 0;}" HAVE_GCC_DEFAULT_VISIBILITY)
214         IF(HAVE_GCC_DEFAULT_VISIBILITY)
215             SET(EXPORT_DECL "__attribute__((visibility(\"default\")))")
216         ENDIF()
217     ENDIF()
219     IF(HAVE_GCC_PROTECTED_VISIBILITY OR HAVE_GCC_DEFAULT_VISIBILITY)
220         CHECK_C_COMPILER_FLAG(-fvisibility=internal HAVE_VISIBILITY_INTERNAL_SWITCH)
221         IF(HAVE_VISIBILITY_INTERNAL_SWITCH)
222             ADD_DEFINITIONS(-fvisibility=internal)
223         ELSE()
224             CHECK_C_COMPILER_FLAG(-fvisibility=hidden HAVE_VISIBILITY_HIDDEN_SWITCH)
225             IF(HAVE_VISIBILITY_HIDDEN_SWITCH)
226                 ADD_DEFINITIONS(-fvisibility=hidden)
227             ENDIF()
228         ENDIF()
229     ENDIF()
231     CHECK_C_SOURCE_COMPILES("int foo __attribute__((aligned(16)));
232                              int main() {return 0;}" HAVE_ATTRIBUTE_ALIGNED)
233     IF(HAVE_ATTRIBUTE_ALIGNED)
234         SET(ALIGN_DECL "__attribute__((aligned(x)))")
235     ENDIF()
237     SET(CMAKE_REQUIRED_FLAGS "${OLD_REQUIRED_FLAGS}")
238 ENDIF()
240 SET(SSE_SWITCH "")
241 CHECK_C_COMPILER_FLAG(-msse HAVE_MSSE_SWITCH)
242 IF(HAVE_MSSE_SWITCH)
243     SET(SSE_SWITCH "-msse")
244 ENDIF()
246 CHECK_C_SOURCE_COMPILES("int foo(const char *str, ...) __attribute__((format(printf, 1, 2)));
247                          int main() {return 0;}" HAVE_GCC_FORMAT)
249 CHECK_INCLUDE_FILE(malloc.h HAVE_MALLOC_H)
250 CHECK_INCLUDE_FILE(cpuid.h HAVE_CPUID_H)
251 CHECK_INCLUDE_FILE(fenv.h HAVE_FENV_H)
252 CHECK_INCLUDE_FILE(float.h HAVE_FLOAT_H)
253 CHECK_INCLUDE_FILE(ieeefp.h HAVE_IEEEFP_H)
254 CHECK_INCLUDE_FILE(guiddef.h HAVE_GUIDDEF_H)
255 IF(NOT HAVE_GUIDDEF_H)
256     CHECK_INCLUDE_FILE(initguid.h HAVE_INITGUID_H)
257 ENDIF()
259 # Some systems need libm for some of the following math functions to work
260 CHECK_LIBRARY_EXISTS(m pow "" HAVE_LIBM)
261 IF(HAVE_LIBM)
262     SET(EXTRA_LIBS m ${EXTRA_LIBS})
263     SET(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} m)
264 ENDIF()
267 CHECK_SYMBOL_EXISTS(aligned_alloc    stdlib.h HAVE_ALIGNED_ALLOC)
268 CHECK_SYMBOL_EXISTS(posix_memalign   stdlib.h HAVE_POSIX_MEMALIGN)
269 CHECK_SYMBOL_EXISTS(_aligned_malloc  malloc.h HAVE__ALIGNED_MALLOC)
270 CHECK_SYMBOL_EXISTS(lrintf math.h HAVE_LRINTF)
272 IF(HAVE_FENV_H)
273     CHECK_SYMBOL_EXISTS(fesetround fenv.h HAVE_FESETROUND)
274 ENDIF()
275 IF(HAVE_FLOAT_H)
276     CHECK_SYMBOL_EXISTS(_controlfp float.h HAVE__CONTROLFP)
277     CHECK_SYMBOL_EXISTS(__control87_2 float.h HAVE___CONTROL87_2)
278 ENDIF()
280 CHECK_FUNCTION_EXISTS(strtof HAVE_STRTOF)
281 CHECK_FUNCTION_EXISTS(stat HAVE_STAT)
282 CHECK_FUNCTION_EXISTS(strcasecmp HAVE_STRCASECMP)
283 IF(NOT HAVE_STRCASECMP)
284     CHECK_FUNCTION_EXISTS(_stricmp HAVE__STRICMP)
285     IF(NOT HAVE__STRICMP)
286         MESSAGE(FATAL_ERROR "No case-insensitive compare function found, please report!")
287     ENDIF()
289     ADD_DEFINITIONS(-Dstrcasecmp=_stricmp)
290 ENDIF()
292 CHECK_FUNCTION_EXISTS(strncasecmp HAVE_STRNCASECMP)
293 IF(NOT HAVE_STRNCASECMP)
294     CHECK_FUNCTION_EXISTS(_strnicmp HAVE__STRNICMP)
295     IF(NOT HAVE__STRNICMP)
296         MESSAGE(FATAL_ERROR "No case-insensitive size-limitted compare function found, please report!")
297     ENDIF()
299     ADD_DEFINITIONS(-Dstrncasecmp=_strnicmp)
300 ENDIF()
302 CHECK_FUNCTION_EXISTS(snprintf HAVE_SNPRINTF)
303 IF(NOT HAVE_SNPRINTF)
304     CHECK_FUNCTION_EXISTS(_snprintf HAVE__SNPRINTF)
305     IF(NOT HAVE__SNPRINTF)
306         MESSAGE(FATAL_ERROR "No snprintf function found, please report!")
307     ENDIF()
309     ADD_DEFINITIONS(-Dsnprintf=_snprintf)
310 ENDIF()
312 CHECK_FUNCTION_EXISTS(vsnprintf HAVE_VSNPRINTF)
313 IF(NOT HAVE_VSNPRINTF)
314     CHECK_FUNCTION_EXISTS(_vsnprintf HAVE__VSNPRINTF)
315     IF(NOT HAVE__VSNPRINTF)
316         MESSAGE(FATAL_ERROR "No vsnprintf function found, please report!")
317     ENDIF()
319     ADD_DEFINITIONS(-Dvsnprintf=_vsnprintf)
320 ENDIF()
322 CHECK_SYMBOL_EXISTS(isfinite math.h HAVE_ISFINITE)
323 IF(NOT HAVE_ISFINITE)
324     CHECK_FUNCTION_EXISTS(finite HAVE_FINITE)
325     IF(NOT HAVE_FINITE)
326         CHECK_FUNCTION_EXISTS(_finite HAVE__FINITE)
327         IF(NOT HAVE__FINITE)
328             MESSAGE(FATAL_ERROR "No isfinite function found, please report!")
329         ENDIF()
330         ADD_DEFINITIONS(-Disfinite=_finite)
331     ELSE()
332         ADD_DEFINITIONS(-Disfinite=finite)
333     ENDIF()
334 ENDIF()
336 CHECK_SYMBOL_EXISTS(isnan math.h HAVE_ISNAN)
337 IF(NOT HAVE_ISNAN)
338     CHECK_FUNCTION_EXISTS(_isnan HAVE__ISNAN)
339     IF(NOT HAVE__ISNAN)
340         MESSAGE(FATAL_ERROR "No isnan function found, please report!")
341     ENDIF()
343     ADD_DEFINITIONS(-Disnan=_isnan)
344 ENDIF()
347 # Check for the dlopen API (for dynamicly loading backend libs)
348 IF(DLOPEN)
349     CHECK_INCLUDE_FILE(dlfcn.h HAVE_DLFCN_H)
350     IF(HAVE_DLFCN_H)
351         CHECK_LIBRARY_EXISTS(dl dlopen "" HAVE_LIBDL)
352         IF(HAVE_LIBDL)
353             SET(EXTRA_LIBS dl ${EXTRA_LIBS})
354         ENDIF()
355     ENDIF()
356 ENDIF()
358 # Check if we have Windows headers
359 CHECK_INCLUDE_FILE(windows.h HAVE_WINDOWS_H -D_WIN32_WINNT=0x0501)
360 IF(NOT HAVE_WINDOWS_H)
361     CHECK_FUNCTION_EXISTS(gettimeofday HAVE_GETTIMEOFDAY)
362     IF(NOT HAVE_GETTIMEOFDAY)
363         MESSAGE(FATAL_ERROR "No timing function found!")
364     ENDIF()
366     CHECK_FUNCTION_EXISTS(nanosleep HAVE_NANOSLEEP)
367     IF(NOT HAVE_NANOSLEEP)
368         MESSAGE(FATAL_ERROR "No sleep function found!")
369     ENDIF()
371     CHECK_C_COMPILER_FLAG(-pthread HAVE_PTHREAD)
372     IF(HAVE_PTHREAD)
373         ADD_DEFINITIONS(-pthread)
374         SET(EXTRA_LIBS ${EXTRA_LIBS} -pthread)
375     ENDIF()
377     # We need pthreads outside of Windows
378     CHECK_INCLUDE_FILE(pthread.h HAVE_PTHREAD_H)
379     IF(NOT HAVE_PTHREAD_H)
380         MESSAGE(FATAL_ERROR "PThreads is required for non-Windows builds!")
381     ENDIF()
382     # Some systems need pthread_np.h to get recursive mutexes
383     CHECK_INCLUDE_FILES("pthread.h;pthread_np.h" HAVE_PTHREAD_NP_H)
385     # _GNU_SOURCE is needed on some systems for extra attributes
386     ADD_DEFINITIONS(-D_GNU_SOURCE=1)
387     CHECK_LIBRARY_EXISTS(pthread pthread_create "" HAVE_LIBPTHREAD)
388     IF(HAVE_LIBPTHREAD)
389         SET(EXTRA_LIBS pthread ${EXTRA_LIBS})
390     ENDIF()
392     CHECK_LIBRARY_EXISTS(pthread pthread_setschedparam "" HAVE_PTHREAD_SETSCHEDPARAM)
394     CHECK_LIBRARY_EXISTS(rt clock_gettime "" HAVE_LIBRT)
395     IF(HAVE_LIBRT)
396         SET(EXTRA_LIBS rt ${EXTRA_LIBS})
397     ENDIF()
398 ENDIF()
400 # Check for a 64-bit type
401 CHECK_INCLUDE_FILE(stdint.h HAVE_STDINT_H)
402 IF(NOT HAVE_STDINT_H)
403     IF(HAVE_WINDOWS_H)
404         CHECK_C_SOURCE_COMPILES("\#define _WIN32_WINNT 0x0501
405                                  \#include <windows.h>
406                                  __int64 foo;
407                                  int main() {return 0;}" HAVE___INT64)
408     ENDIF()
409     IF(NOT HAVE___INT64)
410         IF(NOT SIZEOF_LONG MATCHES "8")
411             IF(NOT SIZEOF_LONG_LONG MATCHES "8")
412                 MESSAGE(FATAL_ERROR "No 64-bit types found, please report!")
413             ENDIF()
414         ENDIF()
415     ENDIF()
416 ENDIF()
418 # Windows needs winmm for timeGetTime, even if the backend is disabled
419 CHECK_SHARED_FUNCTION_EXISTS(timeGetTime "windows.h;mmsystem.h" winmm "" HAVE_LIBWINMM)
420 IF(HAVE_LIBWINMM)
421     SET(EXTRA_LIBS winmm ${EXTRA_LIBS})
422     SET(PKG_CONFIG_LIBS ${PKG_CONFIG_LIBS} -lwinmm)
423 ENDIF()
426 SET(OPENAL_OBJS  OpenAL32/alAuxEffectSlot.c
427                  OpenAL32/alBuffer.c
428                  OpenAL32/alEffect.c
429                  OpenAL32/alError.c
430                  OpenAL32/alExtension.c
431                  OpenAL32/alFilter.c
432                  OpenAL32/alListener.c
433                  OpenAL32/alSource.c
434                  OpenAL32/alState.c
435                  OpenAL32/alThunk.c
437 SET(ALC_OBJS  Alc/ALc.c
438               Alc/ALu.c
439               Alc/alcConfig.c
440               Alc/alcDedicated.c
441               Alc/alcEcho.c
442               Alc/alcModulator.c
443               Alc/alcReverb.c
444               Alc/alcRing.c
445               Alc/alcThread.c
446               Alc/bs2b.c
447               Alc/helpers.c
448               Alc/panning.c
449               Alc/hrtf.c
450               Alc/mixer.c
451               Alc/mixer_c.c
455 SET(CPU_EXTS "Default")
456 SET(HAVE_SSE  0)
457 SET(HAVE_NEON 0)
459 # Check for SSE support
460 IF(SSE AND ALIGN_DECL)
461     CHECK_INCLUDE_FILE(xmmintrin.h HAVE_XMMINTRIN_H "${SSE_SWITCH}")
462     IF(HAVE_XMMINTRIN_H)
463         SET(HAVE_SSE 1)
464         SET(ALC_OBJS  ${ALC_OBJS} Alc/mixer_sse.c)
465         IF(SSE_SWITCH)
466             SET_SOURCE_FILES_PROPERTIES(Alc/mixer_sse.c PROPERTIES
467                                         COMPILE_FLAGS "${SSE_SWITCH}")
468         ENDIF()
469         SET(CPU_EXTS "${CPU_EXTS}, SSE")
470     ENDIF()
471 ENDIF()
472 IF(REQUIRE_SSE AND NOT HAVE_SSE)
473     MESSAGE(FATAL_ERROR "Failed to enabled required SSE CPU extensions")
474 ENDIF()
476 # Check for ARM Neon support
477 IF(NEON)
478     CHECK_INCLUDE_FILE(arm_neon.h HAVE_ARM_NEON_H)
479     IF(HAVE_ARM_NEON_H)
480         SET(HAVE_NEON 1)
481         SET(ALC_OBJS  ${ALC_OBJS} Alc/mixer_neon.c)
482         SET(CPU_EXTS "${CPU_EXTS}, Neon")
483     ENDIF()
484 ENDIF()
485 IF(REQUIRE_NEON AND NOT HAVE_NEON)
486     MESSAGE(FATAL_ERROR "Failed to enabled required ARM Neon CPU extensions")
487 ENDIF()
490 SET(ALC_OBJS  ${ALC_OBJS}
491               # Default backends, always available
492               Alc/backends/loopback.c
493               Alc/backends/null.c
496 SET(BACKENDS "")
497 SET(HAVE_ALSA       0)
498 SET(HAVE_OSS        0)
499 SET(HAVE_SOLARIS    0)
500 SET(HAVE_SNDIO      0)
501 SET(HAVE_DSOUND     0)
502 SET(HAVE_MMDEVAPI   0)
503 SET(HAVE_WINMM      0)
504 SET(HAVE_PORTAUDIO  0)
505 SET(HAVE_PULSEAUDIO 0)
506 SET(HAVE_COREAUDIO  0)
507 SET(HAVE_OPENSL     0)
508 SET(HAVE_WAVE       0)
510 # Check ALSA backend
511 IF(ALSA)
512     CHECK_INCLUDE_FILE(alsa/asoundlib.h HAVE_ALSA_ASOUNDLIB_H)
513     IF(HAVE_ALSA_ASOUNDLIB_H)
514         CHECK_SHARED_FUNCTION_EXISTS(snd_pcm_open "alsa/asoundlib.h" asound "" HAVE_LIBASOUND)
515         IF(HAVE_LIBASOUND OR HAVE_DLFCN_H OR WIN32)
516             SET(HAVE_ALSA 1)
517             SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/alsa.c)
518             IF(HAVE_DLFCN_H OR WIN32)
519                 SET(BACKENDS  "${BACKENDS} ALSA,")
520             ELSE()
521                 SET(BACKENDS  "${BACKENDS} ALSA \(linked\),")
522                 SET(EXTRA_LIBS asound ${EXTRA_LIBS})
523             ENDIF()
524         ENDIF()
525     ENDIF()
526 ENDIF()
527 IF(REQUIRE_ALSA AND NOT HAVE_ALSA)
528     MESSAGE(FATAL_ERROR "Failed to enabled required ALSA backend")
529 ENDIF()
531 # Check OSS backend
532 IF(OSS)
533     CHECK_INCLUDE_FILE(sys/soundcard.h HAVE_SYS_SOUNDCARD_H)
534     IF(HAVE_SYS_SOUNDCARD_H)
535         SET(HAVE_OSS 1)
536         SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/oss.c)
537         SET(BACKENDS  "${BACKENDS} OSS,")
538     ENDIF()
539 ENDIF()
540 IF(REQUIRE_OSS AND NOT HAVE_OSS)
541     MESSAGE(FATAL_ERROR "Failed to enabled required OSS backend")
542 ENDIF()
544 # Check Solaris backend
545 IF(SOLARIS)
546     CHECK_INCLUDE_FILE(sys/audioio.h HAVE_SYS_AUDIOIO_H)
547     IF(HAVE_SYS_AUDIOIO_H)
548         SET(HAVE_SOLARIS 1)
549         SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/solaris.c)
550         SET(BACKENDS  "${BACKENDS} Solaris,")
551     ENDIF()
552 ENDIF()
553 IF(REQUIRE_SOLARIS AND NOT HAVE_SOLARIS)
554     MESSAGE(FATAL_ERROR "Failed to enabled required Solaris backend")
555 ENDIF()
557 # Check SndIO backend
558 IF(SNDIO)
559     CHECK_INCLUDE_FILE(sndio.h HAVE_SNDIO_H)
560     IF(HAVE_SNDIO_H)
561         CHECK_SHARED_FUNCTION_EXISTS(sio_open "sndio.h" sndio "" HAVE_LIBSNDIO)
562         IF(HAVE_LIBSNDIO)
563             SET(HAVE_SNDIO 1)
564             SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/sndio.c)
565             SET(BACKENDS  "${BACKENDS} SndIO \(linked\),")
566             SET(EXTRA_LIBS sndio ${EXTRA_LIBS})
567         ENDIF()
568     ENDIF()
569 ENDIF()
570 IF(REQUIRE_SNDIO AND NOT HAVE_SNDIO)
571     MESSAGE(FATAL_ERROR "Failed to enabled required SndIO backend")
572 ENDIF()
574 # Check for MMDevApi backend
575 IF(HAVE_WINDOWS_H)
576     IF(MMDEVAPI)
577         CHECK_INCLUDE_FILE(mmdeviceapi.h HAVE_MMDEVICEAPI_H)
578         IF(HAVE_MMDEVICEAPI_H)
579             SET(HAVE_MMDEVAPI 1)
580             SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/mmdevapi.c)
582             SET(BACKENDS  "${BACKENDS} MMDevApi,")
583         ENDIF()
584     ENDIF()
585 ENDIF()
586 IF(REQUIRE_MMDEVAPI AND NOT HAVE_MMDEVAPI)
587     MESSAGE(FATAL_ERROR "Failed to enabled required MMDevApi backend")
588 ENDIF()
590 # Check DSound/MMSystem backend
591 IF(DSOUND)
592     CHECK_INCLUDE_FILE(dsound.h HAVE_DSOUND_H)
593     IF(HAVE_DSOUND_H)
594         CHECK_SHARED_FUNCTION_EXISTS(DirectSoundCreate "dsound.h" dsound "" HAVE_LIBDSOUND)
595         IF(HAVE_LIBDSOUND OR HAVE_DLFCN_H OR WIN32)
596             SET(HAVE_DSOUND 1)
597             SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/dsound.c)
599             IF(HAVE_DLFCN_H OR WIN32)
600                 SET(BACKENDS  "${BACKENDS} DirectSound,")
601             ELSE()
602                 SET(BACKENDS  "${BACKENDS} DirectSound \(linked\),")
603                 SET(EXTRA_LIBS dsound ${EXTRA_LIBS})
604             ENDIF()
605         ENDIF()
606     ENDIF()
607 ENDIF()
608 IF(REQUIRE_DSOUND AND NOT HAVE_DSOUND)
609     MESSAGE(FATAL_ERROR "Failed to enabled required DSound backend")
610 ENDIF()
612 IF(HAVE_WINDOWS_H)
613     IF(WINMM)
614         CHECK_INCLUDE_FILES("windows.h;mmsystem.h" HAVE_MMSYSTEM_H -D_WIN32_WINNT=0x0501)
615         IF(HAVE_MMSYSTEM_H AND HAVE_LIBWINMM)
616             SET(HAVE_WINMM 1)
617             SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/winmm.c)
618             SET(BACKENDS  "${BACKENDS} WinMM,")
619         ENDIF()
620     ENDIF()
621 ENDIF()
622 IF(REQUIRE_WINMM AND NOT HAVE_WINMM)
623     MESSAGE(FATAL_ERROR "Failed to enabled required WinMM backend")
624 ENDIF()
626 # Check PortAudio backend
627 IF(PORTAUDIO)
628     CHECK_INCLUDE_FILE(portaudio.h HAVE_PORTAUDIO_H)
629     IF(HAVE_PORTAUDIO_H)
630         CHECK_SHARED_FUNCTION_EXISTS(Pa_Initialize "portaudio.h" portaudio "" HAVE_LIBPORTAUDIO)
631         IF(HAVE_LIBPORTAUDIO OR HAVE_DLFCN_H OR WIN32)
632             SET(HAVE_PORTAUDIO 1)
633             SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/portaudio.c)
634             IF(HAVE_DLFCN_H OR WIN32)
635                 SET(BACKENDS  "${BACKENDS} PortAudio,")
636             ELSE()
637                 SET(BACKENDS  "${BACKENDS} PortAudio \(linked\),")
638                 SET(EXTRA_LIBS portaudio ${EXTRA_LIBS})
639             ENDIF()
640         ENDIF()
641     ENDIF()
642 ENDIF()
643 IF(REQUIRE_PORTAUDIO AND NOT HAVE_PORTAUDIO)
644     MESSAGE(FATAL_ERROR "Failed to enabled required PortAudio backend")
645 ENDIF()
647 # Check PulseAudio backend
648 IF(PULSEAUDIO)
649     CHECK_INCLUDE_FILE(pulse/pulseaudio.h HAVE_PULSE_PULSEAUDIO_H)
650     IF(HAVE_PULSE_PULSEAUDIO_H)
651         CHECK_SHARED_FUNCTION_EXISTS(pa_context_new "pulse/pulseaudio.h" pulse "" HAVE_LIBPULSE)
652         IF(HAVE_LIBPULSE OR HAVE_DLFCN_H OR WIN32)
653             SET(HAVE_PULSEAUDIO 1)
654             SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/pulseaudio.c)
655             IF(HAVE_DLFCN_H OR WIN32)
656                 SET(BACKENDS  "${BACKENDS} PulseAudio,")
657             ELSE()
658                 SET(BACKENDS  "${BACKENDS} PulseAudio \(linked\),")
659                 SET(EXTRA_LIBS pulse ${EXTRA_LIBS})
660             ENDIF()
661         ENDIF()
662     ENDIF()
663 ENDIF()
664 IF(REQUIRE_PULSEAUDIO AND NOT HAVE_PULSEAUDIO)
665     MESSAGE(FATAL_ERROR "Failed to enabled required PulseAudio backend")
666 ENDIF()
668 # Check CoreAudio backend
669 IF(COREAUDIO)
670     CHECK_INCLUDE_FILE(/System/Library/Frameworks/CoreAudio.framework/Headers/CoreAudio.h HAVE_COREAUDIO_FRAMEWORK)
671     IF(HAVE_COREAUDIO_FRAMEWORK)
672         SET(HAVE_COREAUDIO 1)
673         SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/coreaudio.c)
674         SET(BACKENDS  "${BACKENDS} CoreAudio,")
675         SET(EXTRA_LIBS /System/Library/Frameworks/CoreAudio.framework ${EXTRA_LIBS})
676         SET(EXTRA_LIBS /System/Library/Frameworks/AudioUnit.framework ${EXTRA_LIBS})
677         SET(EXTRA_LIBS /System/Library/Frameworks/ApplicationServices.framework ${EXTRA_LIBS})
679         # Some versions of OSX may need the AudioToolbox framework. Add it if
680         # it's found.
681         FIND_LIBRARY(AUDIOTOOLBOX_LIBRARY
682                      NAMES AudioToolbox
683                      PATHS ~/Library/Frameworks
684                            /Library/Frameworks
685                            /System/Library/Frameworks
686                     )
687         IF(AUDIOTOOLBOX_LIBRARY)
688             SET(EXTRA_LIBS ${AUDIOTOOLBOX_LIBRARY} ${EXTRA_LIBS})
689         ENDIF()
690     ENDIF()
691 ENDIF()
692 IF(REQUIRE_COREAUDIO AND NOT HAVE_COREAUDIO)
693     MESSAGE(FATAL_ERROR "Failed to enabled required CoreAudio backend")
694 ENDIF()
696 # Check for OpenSL (Android) backend
697 IF(OPENSL)
698     CHECK_INCLUDE_FILES("SLES/OpenSLES.h;SLES/OpenSLES_Android.h" HAVE_SLES_OPENSLES_ANDROID_H)
699     IF(HAVE_SLES_OPENSLES_ANDROID_H)
700         CHECK_SHARED_FUNCTION_EXISTS(slCreateEngine "SLES/OpenSLES.h" OpenSLES "" HAVE_LIBOPENSLES)
701         IF(HAVE_LIBOPENSLES)
702             SET(HAVE_OPENSL 1)
703             SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/opensl.c)
704             SET(BACKENDS  "${BACKENDS} OpenSL,")
705             SET(EXTRA_LIBS OpenSLES ${EXTRA_LIBS})
706         ENDIF()
707     ENDIF()
708 ENDIF()
709 IF(REQUIRE_OPENSL AND NOT HAVE_OPENSL)
710     MESSAGE(FATAL_ERROR "Failed to enabled required OpenSL backend")
711 ENDIF()
713 # Optionally enable the Wave Writer backend
714 IF(WAVE)
715     SET(HAVE_WAVE 1)
716     SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/wave.c)
717     SET(BACKENDS  "${BACKENDS} WaveFile,")
718 ENDIF()
720 # This is always available
721 SET(BACKENDS  "${BACKENDS} Null")
723 IF(EXAMPLES)
724     # Might be able to use earlier versions, but these definitely work
725     PKG_CHECK_MODULES(FFMPEG libavcodec>=53.61.100 libavformat>=53.32.100 libavutil>=51.35.100)
726 ENDIF()
728 IF(LIBTYPE STREQUAL "STATIC")
729     ADD_DEFINITIONS(-DAL_LIBTYPE_STATIC)
730     SET(PKG_CONFIG_CFLAGS -DAL_LIBTYPE_STATIC ${PKG_CONFIG_CFLAGS})
731 ENDIF()
733 # Needed for openal.pc.in
734 SET(prefix ${CMAKE_INSTALL_PREFIX})
735 SET(exec_prefix "\${prefix}")
736 SET(libdir "\${exec_prefix}/lib${LIB_SUFFIX}")
737 SET(bindir "\${exec_prefix}/bin")
738 SET(includedir "\${prefix}/include")
739 SET(PACKAGE_VERSION "${LIB_VERSION}")
741 # End configuration
742 CONFIGURE_FILE(
743     "${OpenAL_SOURCE_DIR}/config.h.in"
744     "${OpenAL_BINARY_DIR}/config.h")
745 CONFIGURE_FILE(
746     "${OpenAL_SOURCE_DIR}/openal.pc.in"
747     "${OpenAL_BINARY_DIR}/openal.pc"
748     @ONLY)
750 # Build a library
751 ADD_LIBRARY(${LIBNAME} ${LIBTYPE} ${OPENAL_OBJS} ${ALC_OBJS})
752 SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES DEFINE_SYMBOL AL_BUILD_LIBRARY
753                                             COMPILE_FLAGS -DAL_ALEXT_PROTOTYPES
754                                             VERSION ${LIB_VERSION}.0
755                                             SOVERSION ${LIB_MAJOR_VERSION})
756 IF(WIN32 AND NOT LIBTYPE STREQUAL "STATIC")
757     SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES PREFIX "")
758 ENDIF()
760 TARGET_LINK_LIBRARIES(${LIBNAME} ${EXTRA_LIBS})
762 # Add an install target here
763 INSTALL(TARGETS ${LIBNAME}
764         RUNTIME DESTINATION bin
765         LIBRARY DESTINATION "lib${LIB_SUFFIX}"
766         ARCHIVE DESTINATION "lib${LIB_SUFFIX}"
768 INSTALL(FILES include/AL/al.h
769               include/AL/alc.h
770               include/AL/alext.h
771               include/AL/efx.h
772               include/AL/efx-creative.h
773               include/AL/efx-presets.h
774         DESTINATION include/AL
776 INSTALL(FILES "${OpenAL_BINARY_DIR}/openal.pc"
777         DESTINATION "lib${LIB_SUFFIX}/pkgconfig")
780 MESSAGE(STATUS "")
781 MESSAGE(STATUS "Building OpenAL with support for the following backends:")
782 MESSAGE(STATUS "    ${BACKENDS}")
783 MESSAGE(STATUS "")
784 MESSAGE(STATUS "Building with support for CPU extensions:")
785 MESSAGE(STATUS "    ${CPU_EXTS}")
786 MESSAGE(STATUS "")
788 IF(WIN32)
789     IF(NOT HAVE_DSOUND)
790         MESSAGE(STATUS "WARNING: Building the Windows version without DirectSound output")
791         MESSAGE(STATUS "         This is probably NOT what you want!")
792         MESSAGE(STATUS "")
793     ENDIF()
794 ENDIF()
796 # Install alsoft.conf configuration file
797 IF(ALSOFT_CONFIG)
798     INSTALL(FILES alsoftrc.sample
799             DESTINATION share/openal
800     )
801     MESSAGE(STATUS "Installing sample configuration")
802     MESSAGE(STATUS "")
803 ENDIF()
805 IF(UTILS)
806     ADD_EXECUTABLE(openal-info utils/openal-info.c)
807     TARGET_LINK_LIBRARIES(openal-info ${LIBNAME})
809     ADD_EXECUTABLE(makehrtf utils/makehrtf.c)
810     IF(HAVE_LIBM)
811         TARGET_LINK_LIBRARIES(makehrtf m)
812     ENDIF()
814     INSTALL(TARGETS openal-info makehrtf
815             RUNTIME DESTINATION bin
816             LIBRARY DESTINATION "lib${LIB_SUFFIX}"
817             ARCHIVE DESTINATION "lib${LIB_SUFFIX}"
818     )
819     MESSAGE(STATUS "Building utility programs")
820     MESSAGE(STATUS "")
821 ENDIF()
823 IF(EXAMPLES)
824     IF(FFMPEG_FOUND)
825         ADD_EXECUTABLE(alstream examples/common/alhelpers.c
826                                 examples/common/alffmpeg.c
827                                 examples/alstream.c)
828         TARGET_LINK_LIBRARIES(alstream ${FFMPEG_LIBRARIES} ${LIBNAME})
829         SET_TARGET_PROPERTIES(alstream PROPERTIES COMPILE_FLAGS "${FFMPEG_CFLAGS}")
831         ADD_EXECUTABLE(alreverb examples/common/alhelpers.c
832                                 examples/common/alffmpeg.c
833                                 examples/alreverb.c)
834         TARGET_LINK_LIBRARIES(alreverb ${FFMPEG_LIBRARIES} ${LIBNAME})
835         SET_TARGET_PROPERTIES(alreverb PROPERTIES COMPILE_FLAGS "${FFMPEG_CFLAGS}")
837         ADD_EXECUTABLE(allatency examples/common/alhelpers.c
838                                  examples/common/alffmpeg.c
839                                  examples/allatency.c)
840         TARGET_LINK_LIBRARIES(allatency ${FFMPEG_LIBRARIES} ${LIBNAME})
841         SET_TARGET_PROPERTIES(allatency PROPERTIES COMPILE_FLAGS "${FFMPEG_CFLAGS}")
843         INSTALL(TARGETS alstream alreverb allatency
844                 RUNTIME DESTINATION bin
845                 LIBRARY DESTINATION "lib${LIB_SUFFIX}"
846                 ARCHIVE DESTINATION "lib${LIB_SUFFIX}"
847         )
849         MESSAGE(STATUS "Building ffmpeg example programs")
850         MESSAGE(STATUS "")
851     ENDIF()
852 ENDIF()