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