Remove the float math wrapper functions
[openal-soft.git] / CMakeLists.txt
blob146bc572c08f589bf197ec74922eac73171eb971
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 "")
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(cpuid.h HAVE_CPUID_H)
250 CHECK_INCLUDE_FILE(fenv.h HAVE_FENV_H)
251 CHECK_INCLUDE_FILE(float.h HAVE_FLOAT_H)
252 CHECK_INCLUDE_FILE(ieeefp.h HAVE_IEEEFP_H)
253 CHECK_INCLUDE_FILE(guiddef.h HAVE_GUIDDEF_H)
254 IF(NOT HAVE_GUIDDEF_H)
255     CHECK_INCLUDE_FILE(initguid.h HAVE_INITGUID_H)
256 ENDIF()
258 # Some systems need libm for some of the following math functions to work
259 CHECK_LIBRARY_EXISTS(m pow "" HAVE_LIBM)
260 IF(HAVE_LIBM)
261     SET(EXTRA_LIBS m ${EXTRA_LIBS})
262     SET(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} m)
263 ENDIF()
266 CHECK_SYMBOL_EXISTS(aligned_alloc    stdlib.h HAVE_ALIGNED_ALLOC)
267 CHECK_SYMBOL_EXISTS(posix_memalign   stdlib.h HAVE_POSIX_MEMALIGN)
268 CHECK_SYMBOL_EXISTS(_aligned_malloc  malloc.h HAVE__ALIGNED_MALLOC)
269 CHECK_SYMBOL_EXISTS(lrintf math.h HAVE_LRINTF)
271 IF(HAVE_FENV_H)
272     CHECK_SYMBOL_EXISTS(fesetround fenv.h HAVE_FESETROUND)
273 ENDIF()
274 IF(HAVE_FLOAT_H)
275     CHECK_SYMBOL_EXISTS(_controlfp float.h HAVE__CONTROLFP)
276     CHECK_SYMBOL_EXISTS(__control87_2 float.h HAVE___CONTROL87_2)
277 ENDIF()
279 CHECK_FUNCTION_EXISTS(strtof HAVE_STRTOF)
280 CHECK_FUNCTION_EXISTS(stat HAVE_STAT)
281 CHECK_FUNCTION_EXISTS(strcasecmp HAVE_STRCASECMP)
282 IF(NOT HAVE_STRCASECMP)
283     CHECK_FUNCTION_EXISTS(_stricmp HAVE__STRICMP)
284     IF(NOT HAVE__STRICMP)
285         MESSAGE(FATAL_ERROR "No case-insensitive compare function found, please report!")
286     ENDIF()
288     ADD_DEFINITIONS(-Dstrcasecmp=_stricmp)
289 ENDIF()
291 CHECK_FUNCTION_EXISTS(strncasecmp HAVE_STRNCASECMP)
292 IF(NOT HAVE_STRNCASECMP)
293     CHECK_FUNCTION_EXISTS(_strnicmp HAVE__STRNICMP)
294     IF(NOT HAVE__STRNICMP)
295         MESSAGE(FATAL_ERROR "No case-insensitive size-limitted compare function found, please report!")
296     ENDIF()
298     ADD_DEFINITIONS(-Dstrncasecmp=_strnicmp)
299 ENDIF()
301 CHECK_FUNCTION_EXISTS(snprintf HAVE_SNPRINTF)
302 IF(NOT HAVE_SNPRINTF)
303     CHECK_FUNCTION_EXISTS(_snprintf HAVE__SNPRINTF)
304     IF(NOT HAVE__SNPRINTF)
305         MESSAGE(FATAL_ERROR "No snprintf function found, please report!")
306     ENDIF()
308     ADD_DEFINITIONS(-Dsnprintf=_snprintf)
309 ENDIF()
311 CHECK_FUNCTION_EXISTS(vsnprintf HAVE_VSNPRINTF)
312 IF(NOT HAVE_VSNPRINTF)
313     CHECK_FUNCTION_EXISTS(_vsnprintf HAVE__VSNPRINTF)
314     IF(NOT HAVE__VSNPRINTF)
315         MESSAGE(FATAL_ERROR "No vsnprintf function found, please report!")
316     ENDIF()
318     ADD_DEFINITIONS(-Dvsnprintf=_vsnprintf)
319 ENDIF()
321 CHECK_SYMBOL_EXISTS(isfinite math.h HAVE_ISFINITE)
322 IF(NOT HAVE_ISFINITE)
323     CHECK_FUNCTION_EXISTS(finite HAVE_FINITE)
324     IF(NOT HAVE_FINITE)
325         CHECK_FUNCTION_EXISTS(_finite HAVE__FINITE)
326         IF(NOT HAVE__FINITE)
327             MESSAGE(FATAL_ERROR "No isfinite function found, please report!")
328         ENDIF()
329         ADD_DEFINITIONS(-Disfinite=_finite)
330     ELSE()
331         ADD_DEFINITIONS(-Disfinite=finite)
332     ENDIF()
333 ENDIF()
335 CHECK_SYMBOL_EXISTS(isnan math.h HAVE_ISNAN)
336 IF(NOT HAVE_ISNAN)
337     CHECK_FUNCTION_EXISTS(_isnan HAVE__ISNAN)
338     IF(NOT HAVE__ISNAN)
339         MESSAGE(FATAL_ERROR "No isnan function found, please report!")
340     ENDIF()
342     ADD_DEFINITIONS(-Disnan=_isnan)
343 ENDIF()
346 # Check for the dlopen API (for dynamicly loading backend libs)
347 IF(DLOPEN)
348     CHECK_INCLUDE_FILE(dlfcn.h HAVE_DLFCN_H)
349     IF(HAVE_DLFCN_H)
350         CHECK_LIBRARY_EXISTS(dl dlopen "" HAVE_LIBDL)
351         IF(HAVE_LIBDL)
352             SET(EXTRA_LIBS dl ${EXTRA_LIBS})
353         ENDIF()
354     ENDIF()
355 ENDIF()
357 # Check if we have Windows headers
358 CHECK_INCLUDE_FILE(windows.h HAVE_WINDOWS_H -D_WIN32_WINNT=0x0501)
359 IF(NOT HAVE_WINDOWS_H)
360     CHECK_FUNCTION_EXISTS(gettimeofday HAVE_GETTIMEOFDAY)
361     IF(NOT HAVE_GETTIMEOFDAY)
362         MESSAGE(FATAL_ERROR "No timing function found!")
363     ENDIF()
365     CHECK_FUNCTION_EXISTS(nanosleep HAVE_NANOSLEEP)
366     IF(NOT HAVE_NANOSLEEP)
367         MESSAGE(FATAL_ERROR "No sleep function found!")
368     ENDIF()
370     CHECK_C_COMPILER_FLAG(-pthread HAVE_PTHREAD)
371     IF(HAVE_PTHREAD)
372         ADD_DEFINITIONS(-pthread)
373         SET(EXTRA_LIBS ${EXTRA_LIBS} -pthread)
374     ENDIF()
376     # We need pthreads outside of Windows
377     CHECK_INCLUDE_FILE(pthread.h HAVE_PTHREAD_H)
378     IF(NOT HAVE_PTHREAD_H)
379         MESSAGE(FATAL_ERROR "PThreads is required for non-Windows builds!")
380     ENDIF()
381     # Some systems need pthread_np.h to get recursive mutexes
382     CHECK_INCLUDE_FILES("pthread.h;pthread_np.h" HAVE_PTHREAD_NP_H)
384     # _GNU_SOURCE is needed on some systems for extra attributes
385     ADD_DEFINITIONS(-D_GNU_SOURCE=1)
386     CHECK_LIBRARY_EXISTS(pthread pthread_create "" HAVE_LIBPTHREAD)
387     IF(HAVE_LIBPTHREAD)
388         SET(EXTRA_LIBS pthread ${EXTRA_LIBS})
389     ENDIF()
391     CHECK_LIBRARY_EXISTS(pthread pthread_setschedparam "" HAVE_PTHREAD_SETSCHEDPARAM)
393     CHECK_LIBRARY_EXISTS(rt clock_gettime "" HAVE_LIBRT)
394     IF(HAVE_LIBRT)
395         SET(EXTRA_LIBS rt ${EXTRA_LIBS})
396     ENDIF()
397 ENDIF()
399 # Check for a 64-bit type
400 CHECK_INCLUDE_FILE(stdint.h HAVE_STDINT_H)
401 IF(NOT HAVE_STDINT_H)
402     IF(HAVE_WINDOWS_H)
403         CHECK_C_SOURCE_COMPILES("\#define _WIN32_WINNT 0x0501
404                                  \#include <windows.h>
405                                  __int64 foo;
406                                  int main() {return 0;}" HAVE___INT64)
407     ENDIF()
408     IF(NOT HAVE___INT64)
409         IF(NOT SIZEOF_LONG MATCHES "8")
410             IF(NOT SIZEOF_LONG_LONG MATCHES "8")
411                 MESSAGE(FATAL_ERROR "No 64-bit types found, please report!")
412             ENDIF()
413         ENDIF()
414     ENDIF()
415 ENDIF()
417 # Windows needs winmm for timeGetTime, even if the backend is disabled
418 CHECK_SHARED_FUNCTION_EXISTS(timeGetTime "windows.h;mmsystem.h" winmm "" HAVE_LIBWINMM)
419 IF(HAVE_LIBWINMM)
420     SET(EXTRA_LIBS winmm ${EXTRA_LIBS})
421     SET(PKG_CONFIG_LIBS ${PKG_CONFIG_LIBS} -lwinmm)
422 ENDIF()
425 SET(OPENAL_OBJS  OpenAL32/alAuxEffectSlot.c
426                  OpenAL32/alBuffer.c
427                  OpenAL32/alEffect.c
428                  OpenAL32/alError.c
429                  OpenAL32/alExtension.c
430                  OpenAL32/alFilter.c
431                  OpenAL32/alListener.c
432                  OpenAL32/alSource.c
433                  OpenAL32/alState.c
434                  OpenAL32/alThunk.c
436 SET(ALC_OBJS  Alc/ALc.c
437               Alc/ALu.c
438               Alc/alcConfig.c
439               Alc/alcDedicated.c
440               Alc/alcEcho.c
441               Alc/alcModulator.c
442               Alc/alcReverb.c
443               Alc/alcRing.c
444               Alc/alcThread.c
445               Alc/bs2b.c
446               Alc/helpers.c
447               Alc/panning.c
448               Alc/hrtf.c
449               Alc/mixer.c
450               Alc/mixer_c.c
454 SET(CPU_EXTS "Default")
455 SET(HAVE_SSE  0)
456 SET(HAVE_NEON 0)
458 # Check for SSE support
459 IF(SSE AND ALIGN_DECL)
460     CHECK_INCLUDE_FILE(xmmintrin.h HAVE_XMMINTRIN_H "${SSE_SWITCH}")
461     IF(HAVE_XMMINTRIN_H)
462         SET(HAVE_SSE 1)
463         SET(ALC_OBJS  ${ALC_OBJS} Alc/mixer_sse.c)
464         IF(SSE_SWITCH)
465             SET_SOURCE_FILES_PROPERTIES(Alc/mixer_sse.c PROPERTIES
466                                         COMPILE_FLAGS "${SSE_SWITCH}")
467         ENDIF()
468         SET(CPU_EXTS "${CPU_EXTS}, SSE")
469     ENDIF()
470 ENDIF()
471 IF(REQUIRE_SSE AND NOT HAVE_SSE)
472     MESSAGE(FATAL_ERROR "Failed to enabled required SSE CPU extensions")
473 ENDIF()
475 # Check for ARM Neon support
476 IF(NEON)
477     CHECK_INCLUDE_FILE(arm_neon.h HAVE_ARM_NEON_H)
478     IF(HAVE_ARM_NEON_H)
479         SET(HAVE_NEON 1)
480         SET(ALC_OBJS  ${ALC_OBJS} Alc/mixer_neon.c)
481         SET(CPU_EXTS "${CPU_EXTS}, Neon")
482     ENDIF()
483 ENDIF()
484 IF(REQUIRE_NEON AND NOT HAVE_NEON)
485     MESSAGE(FATAL_ERROR "Failed to enabled required ARM Neon CPU extensions")
486 ENDIF()
489 SET(ALC_OBJS  ${ALC_OBJS}
490               # Default backends, always available
491               Alc/backends/loopback.c
492               Alc/backends/null.c
495 SET(BACKENDS "")
496 SET(HAVE_ALSA       0)
497 SET(HAVE_OSS        0)
498 SET(HAVE_SOLARIS    0)
499 SET(HAVE_SNDIO      0)
500 SET(HAVE_DSOUND     0)
501 SET(HAVE_MMDEVAPI   0)
502 SET(HAVE_WINMM      0)
503 SET(HAVE_PORTAUDIO  0)
504 SET(HAVE_PULSEAUDIO 0)
505 SET(HAVE_COREAUDIO  0)
506 SET(HAVE_OPENSL     0)
507 SET(HAVE_WAVE       0)
509 # Check ALSA backend
510 IF(ALSA)
511     CHECK_INCLUDE_FILE(alsa/asoundlib.h HAVE_ALSA_ASOUNDLIB_H)
512     IF(HAVE_ALSA_ASOUNDLIB_H)
513         CHECK_SHARED_FUNCTION_EXISTS(snd_pcm_open "alsa/asoundlib.h" asound "" HAVE_LIBASOUND)
514         IF(HAVE_LIBASOUND OR HAVE_DLFCN_H OR WIN32)
515             SET(HAVE_ALSA 1)
516             SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/alsa.c)
517             IF(HAVE_DLFCN_H OR WIN32)
518                 SET(BACKENDS  "${BACKENDS} ALSA,")
519             ELSE()
520                 SET(BACKENDS  "${BACKENDS} ALSA \(linked\),")
521                 SET(EXTRA_LIBS asound ${EXTRA_LIBS})
522             ENDIF()
523         ENDIF()
524     ENDIF()
525 ENDIF()
526 IF(REQUIRE_ALSA AND NOT HAVE_ALSA)
527     MESSAGE(FATAL_ERROR "Failed to enabled required ALSA backend")
528 ENDIF()
530 # Check OSS backend
531 IF(OSS)
532     CHECK_INCLUDE_FILE(sys/soundcard.h HAVE_SYS_SOUNDCARD_H)
533     IF(HAVE_SYS_SOUNDCARD_H)
534         SET(HAVE_OSS 1)
535         SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/oss.c)
536         SET(BACKENDS  "${BACKENDS} OSS,")
537     ENDIF()
538 ENDIF()
539 IF(REQUIRE_OSS AND NOT HAVE_OSS)
540     MESSAGE(FATAL_ERROR "Failed to enabled required OSS backend")
541 ENDIF()
543 # Check Solaris backend
544 IF(SOLARIS)
545     CHECK_INCLUDE_FILE(sys/audioio.h HAVE_SYS_AUDIOIO_H)
546     IF(HAVE_SYS_AUDIOIO_H)
547         SET(HAVE_SOLARIS 1)
548         SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/solaris.c)
549         SET(BACKENDS  "${BACKENDS} Solaris,")
550     ENDIF()
551 ENDIF()
552 IF(REQUIRE_SOLARIS AND NOT HAVE_SOLARIS)
553     MESSAGE(FATAL_ERROR "Failed to enabled required Solaris backend")
554 ENDIF()
556 # Check SndIO backend
557 IF(SNDIO)
558     CHECK_INCLUDE_FILE(sndio.h HAVE_SNDIO_H)
559     IF(HAVE_SNDIO_H)
560         CHECK_SHARED_FUNCTION_EXISTS(sio_open "sndio.h" sndio "" HAVE_LIBSNDIO)
561         IF(HAVE_LIBSNDIO)
562             SET(HAVE_SNDIO 1)
563             SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/sndio.c)
564             SET(BACKENDS  "${BACKENDS} SndIO \(linked\),")
565             SET(EXTRA_LIBS sndio ${EXTRA_LIBS})
566         ENDIF()
567     ENDIF()
568 ENDIF()
569 IF(REQUIRE_SNDIO AND NOT HAVE_SNDIO)
570     MESSAGE(FATAL_ERROR "Failed to enabled required SndIO backend")
571 ENDIF()
573 # Check for MMDevApi backend
574 IF(HAVE_WINDOWS_H)
575     IF(MMDEVAPI)
576         CHECK_INCLUDE_FILE(mmdeviceapi.h HAVE_MMDEVICEAPI_H)
577         IF(HAVE_MMDEVICEAPI_H)
578             SET(HAVE_MMDEVAPI 1)
579             SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/mmdevapi.c)
581             SET(BACKENDS  "${BACKENDS} MMDevApi,")
582         ENDIF()
583     ENDIF()
584 ENDIF()
585 IF(REQUIRE_MMDEVAPI AND NOT HAVE_MMDEVAPI)
586     MESSAGE(FATAL_ERROR "Failed to enabled required MMDevApi backend")
587 ENDIF()
589 # Check DSound/MMSystem backend
590 IF(DSOUND)
591     CHECK_INCLUDE_FILE(dsound.h HAVE_DSOUND_H)
592     IF(HAVE_DSOUND_H)
593         CHECK_SHARED_FUNCTION_EXISTS(DirectSoundCreate "dsound.h" dsound "" HAVE_LIBDSOUND)
594         IF(HAVE_LIBDSOUND OR HAVE_DLFCN_H OR WIN32)
595             SET(HAVE_DSOUND 1)
596             SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/dsound.c)
598             IF(HAVE_DLFCN_H OR WIN32)
599                 SET(BACKENDS  "${BACKENDS} DirectSound,")
600             ELSE()
601                 SET(BACKENDS  "${BACKENDS} DirectSound \(linked\),")
602                 SET(EXTRA_LIBS dsound ${EXTRA_LIBS})
603             ENDIF()
604         ENDIF()
605     ENDIF()
606 ENDIF()
607 IF(REQUIRE_DSOUND AND NOT HAVE_DSOUND)
608     MESSAGE(FATAL_ERROR "Failed to enabled required DSound backend")
609 ENDIF()
611 IF(HAVE_WINDOWS_H)
612     IF(WINMM)
613         CHECK_INCLUDE_FILES("windows.h;mmsystem.h" HAVE_MMSYSTEM_H -D_WIN32_WINNT=0x0501)
614         IF(HAVE_MMSYSTEM_H AND HAVE_LIBWINMM)
615             SET(HAVE_WINMM 1)
616             SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/winmm.c)
617             SET(BACKENDS  "${BACKENDS} WinMM,")
618         ENDIF()
619     ENDIF()
620 ENDIF()
621 IF(REQUIRE_WINMM AND NOT HAVE_WINMM)
622     MESSAGE(FATAL_ERROR "Failed to enabled required WinMM backend")
623 ENDIF()
625 # Check PortAudio backend
626 IF(PORTAUDIO)
627     CHECK_INCLUDE_FILE(portaudio.h HAVE_PORTAUDIO_H)
628     IF(HAVE_PORTAUDIO_H)
629         CHECK_SHARED_FUNCTION_EXISTS(Pa_Initialize "portaudio.h" portaudio "" HAVE_LIBPORTAUDIO)
630         IF(HAVE_LIBPORTAUDIO OR HAVE_DLFCN_H OR WIN32)
631             SET(HAVE_PORTAUDIO 1)
632             SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/portaudio.c)
633             IF(HAVE_DLFCN_H OR WIN32)
634                 SET(BACKENDS  "${BACKENDS} PortAudio,")
635             ELSE()
636                 SET(BACKENDS  "${BACKENDS} PortAudio \(linked\),")
637                 SET(EXTRA_LIBS portaudio ${EXTRA_LIBS})
638             ENDIF()
639         ENDIF()
640     ENDIF()
641 ENDIF()
642 IF(REQUIRE_PORTAUDIO AND NOT HAVE_PORTAUDIO)
643     MESSAGE(FATAL_ERROR "Failed to enabled required PortAudio backend")
644 ENDIF()
646 # Check PulseAudio backend
647 IF(PULSEAUDIO)
648     CHECK_INCLUDE_FILE(pulse/pulseaudio.h HAVE_PULSE_PULSEAUDIO_H)
649     IF(HAVE_PULSE_PULSEAUDIO_H)
650         CHECK_SHARED_FUNCTION_EXISTS(pa_context_new "pulse/pulseaudio.h" pulse "" HAVE_LIBPULSE)
651         IF(HAVE_LIBPULSE OR HAVE_DLFCN_H OR WIN32)
652             SET(HAVE_PULSEAUDIO 1)
653             SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/pulseaudio.c)
654             IF(HAVE_DLFCN_H OR WIN32)
655                 SET(BACKENDS  "${BACKENDS} PulseAudio,")
656             ELSE()
657                 SET(BACKENDS  "${BACKENDS} PulseAudio \(linked\),")
658                 SET(EXTRA_LIBS pulse ${EXTRA_LIBS})
659             ENDIF()
660         ENDIF()
661     ENDIF()
662 ENDIF()
663 IF(REQUIRE_PULSEAUDIO AND NOT HAVE_PULSEAUDIO)
664     MESSAGE(FATAL_ERROR "Failed to enabled required PulseAudio backend")
665 ENDIF()
667 # Check CoreAudio backend
668 IF(COREAUDIO)
669     CHECK_INCLUDE_FILE(/System/Library/Frameworks/CoreAudio.framework/Headers/CoreAudio.h HAVE_COREAUDIO_FRAMEWORK)
670     IF(HAVE_COREAUDIO_FRAMEWORK)
671         SET(HAVE_COREAUDIO 1)
672         SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/coreaudio.c)
673         SET(BACKENDS  "${BACKENDS} CoreAudio,")
674         SET(EXTRA_LIBS /System/Library/Frameworks/CoreAudio.framework ${EXTRA_LIBS})
675         SET(EXTRA_LIBS /System/Library/Frameworks/AudioUnit.framework ${EXTRA_LIBS})
676         SET(EXTRA_LIBS /System/Library/Frameworks/ApplicationServices.framework ${EXTRA_LIBS})
678         # Some versions of OSX may need the AudioToolbox framework. Add it if
679         # it's found.
680         FIND_LIBRARY(AUDIOTOOLBOX_LIBRARY
681                      NAMES AudioToolbox
682                      PATHS ~/Library/Frameworks
683                            /Library/Frameworks
684                            /System/Library/Frameworks
685                     )
686         IF(AUDIOTOOLBOX_LIBRARY)
687             SET(EXTRA_LIBS ${AUDIOTOOLBOX_LIBRARY} ${EXTRA_LIBS})
688         ENDIF()
689     ENDIF()
690 ENDIF()
691 IF(REQUIRE_COREAUDIO AND NOT HAVE_COREAUDIO)
692     MESSAGE(FATAL_ERROR "Failed to enabled required CoreAudio backend")
693 ENDIF()
695 # Check for OpenSL (Android) backend
696 IF(OPENSL)
697     CHECK_INCLUDE_FILES("SLES/OpenSLES.h;SLES/OpenSLES_Android.h" HAVE_SLES_OPENSLES_ANDROID_H)
698     IF(HAVE_SLES_OPENSLES_ANDROID_H)
699         CHECK_SHARED_FUNCTION_EXISTS(slCreateEngine "SLES/OpenSLES.h" OpenSLES "" HAVE_LIBOPENSLES)
700         IF(HAVE_LIBOPENSLES)
701             SET(HAVE_OPENSL 1)
702             SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/opensl.c)
703             SET(BACKENDS  "${BACKENDS} OpenSL,")
704             SET(EXTRA_LIBS OpenSLES ${EXTRA_LIBS})
705         ENDIF()
706     ENDIF()
707 ENDIF()
708 IF(REQUIRE_OPENSL AND NOT HAVE_OPENSL)
709     MESSAGE(FATAL_ERROR "Failed to enabled required OpenSL backend")
710 ENDIF()
712 # Optionally enable the Wave Writer backend
713 IF(WAVE)
714     SET(HAVE_WAVE 1)
715     SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/wave.c)
716     SET(BACKENDS  "${BACKENDS} WaveFile,")
717 ENDIF()
719 # This is always available
720 SET(BACKENDS  "${BACKENDS} Null")
722 IF(EXAMPLES)
723     # Might be able to use earlier versions, but these definitely work
724     PKG_CHECK_MODULES(FFMPEG libavcodec>=53.61.100 libavformat>=53.32.100 libavutil>=51.35.100)
725 ENDIF()
727 IF(LIBTYPE STREQUAL "STATIC")
728     ADD_DEFINITIONS(-DAL_LIBTYPE_STATIC)
729     SET(PKG_CONFIG_CFLAGS -DAL_LIBTYPE_STATIC ${PKG_CONFIG_CFLAGS})
730 ENDIF()
732 # Needed for openal.pc.in
733 SET(prefix ${CMAKE_INSTALL_PREFIX})
734 SET(exec_prefix "\${prefix}")
735 SET(libdir "\${exec_prefix}/lib${LIB_SUFFIX}")
736 SET(bindir "\${exec_prefix}/bin")
737 SET(includedir "\${prefix}/include")
738 SET(PACKAGE_VERSION "${LIB_VERSION}")
740 # End configuration
741 CONFIGURE_FILE(
742     "${OpenAL_SOURCE_DIR}/config.h.in"
743     "${OpenAL_BINARY_DIR}/config.h")
744 CONFIGURE_FILE(
745     "${OpenAL_SOURCE_DIR}/openal.pc.in"
746     "${OpenAL_BINARY_DIR}/openal.pc"
747     @ONLY)
749 # Build a library
750 ADD_LIBRARY(${LIBNAME} ${LIBTYPE} ${OPENAL_OBJS} ${ALC_OBJS})
751 SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES DEFINE_SYMBOL AL_BUILD_LIBRARY
752                                             COMPILE_FLAGS -DAL_ALEXT_PROTOTYPES
753                                             VERSION ${LIB_VERSION}.0
754                                             SOVERSION ${LIB_MAJOR_VERSION})
755 IF(WIN32 AND NOT LIBTYPE STREQUAL "STATIC")
756     SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES PREFIX "")
757 ENDIF()
759 TARGET_LINK_LIBRARIES(${LIBNAME} ${EXTRA_LIBS})
761 # Add an install target here
762 INSTALL(TARGETS ${LIBNAME}
763         RUNTIME DESTINATION bin
764         LIBRARY DESTINATION "lib${LIB_SUFFIX}"
765         ARCHIVE DESTINATION "lib${LIB_SUFFIX}"
767 INSTALL(FILES include/AL/al.h
768               include/AL/alc.h
769               include/AL/alext.h
770               include/AL/efx.h
771               include/AL/efx-creative.h
772               include/AL/efx-presets.h
773         DESTINATION include/AL
775 INSTALL(FILES "${OpenAL_BINARY_DIR}/openal.pc"
776         DESTINATION "lib${LIB_SUFFIX}/pkgconfig")
779 MESSAGE(STATUS "")
780 MESSAGE(STATUS "Building OpenAL with support for the following backends:")
781 MESSAGE(STATUS "    ${BACKENDS}")
782 MESSAGE(STATUS "")
783 MESSAGE(STATUS "Building with support for CPU extensions:")
784 MESSAGE(STATUS "    ${CPU_EXTS}")
785 MESSAGE(STATUS "")
787 IF(WIN32)
788     IF(NOT HAVE_DSOUND)
789         MESSAGE(STATUS "WARNING: Building the Windows version without DirectSound output")
790         MESSAGE(STATUS "         This is probably NOT what you want!")
791         MESSAGE(STATUS "")
792     ENDIF()
793 ENDIF()
795 # Install alsoft.conf configuration file
796 IF(ALSOFT_CONFIG)
797     INSTALL(FILES alsoftrc.sample
798             DESTINATION /etc/openal
799             RENAME alsoft.conf
800     )
801     MESSAGE(STATUS "Installing sample alsoft.conf")
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}")
830         INSTALL(TARGETS alstream
831                 RUNTIME DESTINATION bin
832                 LIBRARY DESTINATION "lib${LIB_SUFFIX}"
833                 ARCHIVE DESTINATION "lib${LIB_SUFFIX}"
834         )
836         MESSAGE(STATUS "Building ffmpeg example programs")
837         MESSAGE(STATUS "")
838     ENDIF()
839 ENDIF()