Define RESTRICT in config.h instead of alMain.h
[openal-soft.git] / CMakeLists.txt
blob2d22077d9f1923d0d7cb3af2f20f83ed6183a9f0
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)
270 CHECK_SYMBOL_EXISTS(powf   math.h HAVE_POWF)
271 CHECK_SYMBOL_EXISTS(sqrtf  math.h HAVE_SQRTF)
272 CHECK_SYMBOL_EXISTS(cosf   math.h HAVE_COSF)
273 CHECK_SYMBOL_EXISTS(sinf   math.h HAVE_SINF)
274 CHECK_SYMBOL_EXISTS(acosf  math.h HAVE_ACOSF)
275 CHECK_SYMBOL_EXISTS(asinf  math.h HAVE_ASINF)
276 CHECK_SYMBOL_EXISTS(atanf  math.h HAVE_ATANF)
277 CHECK_SYMBOL_EXISTS(atan2f math.h HAVE_ATAN2F)
278 CHECK_SYMBOL_EXISTS(fabsf  math.h HAVE_FABSF)
279 CHECK_SYMBOL_EXISTS(log10f math.h HAVE_LOG10F)
280 CHECK_SYMBOL_EXISTS(floorf math.h HAVE_FLOORF)
282 IF(HAVE_FENV_H)
283     CHECK_SYMBOL_EXISTS(fesetround fenv.h HAVE_FESETROUND)
284 ENDIF()
285 IF(HAVE_FLOAT_H)
286     CHECK_SYMBOL_EXISTS(_controlfp float.h HAVE__CONTROLFP)
287     CHECK_SYMBOL_EXISTS(__control87_2 float.h HAVE___CONTROL87_2)
288 ENDIF()
290 CHECK_FUNCTION_EXISTS(strtof HAVE_STRTOF)
291 CHECK_FUNCTION_EXISTS(stat HAVE_STAT)
292 CHECK_FUNCTION_EXISTS(strcasecmp HAVE_STRCASECMP)
293 IF(NOT HAVE_STRCASECMP)
294     CHECK_FUNCTION_EXISTS(_stricmp HAVE__STRICMP)
295     IF(NOT HAVE__STRICMP)
296         MESSAGE(FATAL_ERROR "No case-insensitive compare function found, please report!")
297     ENDIF()
299     ADD_DEFINITIONS(-Dstrcasecmp=_stricmp)
300 ENDIF()
302 CHECK_FUNCTION_EXISTS(strncasecmp HAVE_STRNCASECMP)
303 IF(NOT HAVE_STRNCASECMP)
304     CHECK_FUNCTION_EXISTS(_strnicmp HAVE__STRNICMP)
305     IF(NOT HAVE__STRNICMP)
306         MESSAGE(FATAL_ERROR "No case-insensitive size-limitted compare function found, please report!")
307     ENDIF()
309     ADD_DEFINITIONS(-Dstrncasecmp=_strnicmp)
310 ENDIF()
312 CHECK_FUNCTION_EXISTS(snprintf HAVE_SNPRINTF)
313 IF(NOT HAVE_SNPRINTF)
314     CHECK_FUNCTION_EXISTS(_snprintf HAVE__SNPRINTF)
315     IF(NOT HAVE__SNPRINTF)
316         MESSAGE(FATAL_ERROR "No snprintf function found, please report!")
317     ENDIF()
319     ADD_DEFINITIONS(-Dsnprintf=_snprintf)
320 ENDIF()
322 CHECK_FUNCTION_EXISTS(vsnprintf HAVE_VSNPRINTF)
323 IF(NOT HAVE_VSNPRINTF)
324     CHECK_FUNCTION_EXISTS(_vsnprintf HAVE__VSNPRINTF)
325     IF(NOT HAVE__VSNPRINTF)
326         MESSAGE(FATAL_ERROR "No vsnprintf function found, please report!")
327     ENDIF()
329     ADD_DEFINITIONS(-Dvsnprintf=_vsnprintf)
330 ENDIF()
332 CHECK_SYMBOL_EXISTS(isfinite math.h HAVE_ISFINITE)
333 IF(NOT HAVE_ISFINITE)
334     CHECK_FUNCTION_EXISTS(finite HAVE_FINITE)
335     IF(NOT HAVE_FINITE)
336         CHECK_FUNCTION_EXISTS(_finite HAVE__FINITE)
337         IF(NOT HAVE__FINITE)
338             MESSAGE(FATAL_ERROR "No isfinite function found, please report!")
339         ENDIF()
340         ADD_DEFINITIONS(-Disfinite=_finite)
341     ELSE()
342         ADD_DEFINITIONS(-Disfinite=finite)
343     ENDIF()
344 ENDIF()
346 CHECK_SYMBOL_EXISTS(isnan math.h HAVE_ISNAN)
347 IF(NOT HAVE_ISNAN)
348     CHECK_FUNCTION_EXISTS(_isnan HAVE__ISNAN)
349     IF(NOT HAVE__ISNAN)
350         MESSAGE(FATAL_ERROR "No isnan function found, please report!")
351     ENDIF()
353     ADD_DEFINITIONS(-Disnan=_isnan)
354 ENDIF()
357 # Check for the dlopen API (for dynamicly loading backend libs)
358 IF(DLOPEN)
359     CHECK_INCLUDE_FILE(dlfcn.h HAVE_DLFCN_H)
360     IF(HAVE_DLFCN_H)
361         CHECK_LIBRARY_EXISTS(dl dlopen "" HAVE_LIBDL)
362         IF(HAVE_LIBDL)
363             SET(EXTRA_LIBS dl ${EXTRA_LIBS})
364         ENDIF()
365     ENDIF()
366 ENDIF()
368 # Check if we have Windows headers
369 CHECK_INCLUDE_FILE(windows.h HAVE_WINDOWS_H -D_WIN32_WINNT=0x0501)
370 IF(NOT HAVE_WINDOWS_H)
371     CHECK_FUNCTION_EXISTS(gettimeofday HAVE_GETTIMEOFDAY)
372     IF(NOT HAVE_GETTIMEOFDAY)
373         MESSAGE(FATAL_ERROR "No timing function found!")
374     ENDIF()
376     CHECK_FUNCTION_EXISTS(nanosleep HAVE_NANOSLEEP)
377     IF(NOT HAVE_NANOSLEEP)
378         MESSAGE(FATAL_ERROR "No sleep function found!")
379     ENDIF()
381     CHECK_C_COMPILER_FLAG(-pthread HAVE_PTHREAD)
382     IF(HAVE_PTHREAD)
383         ADD_DEFINITIONS(-pthread)
384         SET(EXTRA_LIBS ${EXTRA_LIBS} -pthread)
385     ENDIF()
387     # We need pthreads outside of Windows
388     CHECK_INCLUDE_FILE(pthread.h HAVE_PTHREAD_H)
389     IF(NOT HAVE_PTHREAD_H)
390         MESSAGE(FATAL_ERROR "PThreads is required for non-Windows builds!")
391     ENDIF()
392     # Some systems need pthread_np.h to get recursive mutexes
393     CHECK_INCLUDE_FILES("pthread.h;pthread_np.h" HAVE_PTHREAD_NP_H)
395     # _GNU_SOURCE is needed on some systems for extra attributes
396     ADD_DEFINITIONS(-D_GNU_SOURCE=1)
397     CHECK_LIBRARY_EXISTS(pthread pthread_create "" HAVE_LIBPTHREAD)
398     IF(HAVE_LIBPTHREAD)
399         SET(EXTRA_LIBS pthread ${EXTRA_LIBS})
400     ENDIF()
402     CHECK_LIBRARY_EXISTS(pthread pthread_setschedparam "" HAVE_PTHREAD_SETSCHEDPARAM)
404     CHECK_LIBRARY_EXISTS(rt clock_gettime "" HAVE_LIBRT)
405     IF(HAVE_LIBRT)
406         SET(EXTRA_LIBS rt ${EXTRA_LIBS})
407     ENDIF()
408 ENDIF()
410 # Check for a 64-bit type
411 CHECK_INCLUDE_FILE(stdint.h HAVE_STDINT_H)
412 IF(NOT HAVE_STDINT_H)
413     IF(HAVE_WINDOWS_H)
414         CHECK_C_SOURCE_COMPILES("\#define _WIN32_WINNT 0x0501
415                                  \#include <windows.h>
416                                  __int64 foo;
417                                  int main() {return 0;}" HAVE___INT64)
418     ENDIF()
419     IF(NOT HAVE___INT64)
420         IF(NOT SIZEOF_LONG MATCHES "8")
421             IF(NOT SIZEOF_LONG_LONG MATCHES "8")
422                 MESSAGE(FATAL_ERROR "No 64-bit types found, please report!")
423             ENDIF()
424         ENDIF()
425     ENDIF()
426 ENDIF()
428 # Windows needs winmm for timeGetTime, even if the backend is disabled
429 CHECK_SHARED_FUNCTION_EXISTS(timeGetTime "windows.h;mmsystem.h" winmm "" HAVE_LIBWINMM)
430 IF(HAVE_LIBWINMM)
431     SET(EXTRA_LIBS winmm ${EXTRA_LIBS})
432     SET(PKG_CONFIG_LIBS ${PKG_CONFIG_LIBS} -lwinmm)
433 ENDIF()
436 SET(OPENAL_OBJS  OpenAL32/alAuxEffectSlot.c
437                  OpenAL32/alBuffer.c
438                  OpenAL32/alEffect.c
439                  OpenAL32/alError.c
440                  OpenAL32/alExtension.c
441                  OpenAL32/alFilter.c
442                  OpenAL32/alListener.c
443                  OpenAL32/alSource.c
444                  OpenAL32/alState.c
445                  OpenAL32/alThunk.c
447 SET(ALC_OBJS  Alc/ALc.c
448               Alc/ALu.c
449               Alc/alcConfig.c
450               Alc/alcDedicated.c
451               Alc/alcEcho.c
452               Alc/alcModulator.c
453               Alc/alcReverb.c
454               Alc/alcRing.c
455               Alc/alcThread.c
456               Alc/bs2b.c
457               Alc/helpers.c
458               Alc/panning.c
459               Alc/hrtf.c
460               Alc/mixer.c
461               Alc/mixer_c.c
465 SET(CPU_EXTS "Default")
466 SET(HAVE_SSE  0)
467 SET(HAVE_NEON 0)
469 # Check for SSE support
470 IF(SSE)
471     CHECK_INCLUDE_FILE(xmmintrin.h HAVE_XMMINTRIN_H "${SSE_SWITCH}")
472     IF(HAVE_XMMINTRIN_H)
473         SET(HAVE_SSE 1)
474         SET(ALC_OBJS  ${ALC_OBJS} Alc/mixer_sse.c)
475         IF(SSE_SWITCH)
476             SET_SOURCE_FILES_PROPERTIES(Alc/mixer_sse.c PROPERTIES
477                                         COMPILE_FLAGS "${SSE_SWITCH}")
478         ENDIF()
479         SET(CPU_EXTS "${CPU_EXTS}, SSE")
480     ENDIF()
481 ENDIF()
482 IF(REQUIRE_SSE AND NOT HAVE_SSE)
483     MESSAGE(FATAL_ERROR "Failed to enabled required SSE CPU extensions")
484 ENDIF()
486 # Check for ARM Neon support
487 IF(NEON)
488     CHECK_INCLUDE_FILE(arm_neon.h HAVE_ARM_NEON_H)
489     IF(HAVE_ARM_NEON_H)
490         SET(HAVE_NEON 1)
491         SET(ALC_OBJS  ${ALC_OBJS} Alc/mixer_neon.c)
492         SET(CPU_EXTS "${CPU_EXTS}, Neon")
493     ENDIF()
494 ENDIF()
495 IF(REQUIRE_NEON AND NOT HAVE_NEON)
496     MESSAGE(FATAL_ERROR "Failed to enabled required ARM Neon CPU extensions")
497 ENDIF()
500 SET(ALC_OBJS  ${ALC_OBJS}
501               # Default backends, always available
502               Alc/backends/loopback.c
503               Alc/backends/null.c
506 SET(BACKENDS "")
507 SET(HAVE_ALSA       0)
508 SET(HAVE_OSS        0)
509 SET(HAVE_SOLARIS    0)
510 SET(HAVE_SNDIO      0)
511 SET(HAVE_DSOUND     0)
512 SET(HAVE_MMDEVAPI   0)
513 SET(HAVE_WINMM      0)
514 SET(HAVE_PORTAUDIO  0)
515 SET(HAVE_PULSEAUDIO 0)
516 SET(HAVE_COREAUDIO  0)
517 SET(HAVE_OPENSL     0)
518 SET(HAVE_WAVE       0)
520 # Check ALSA backend
521 IF(ALSA)
522     CHECK_INCLUDE_FILE(alsa/asoundlib.h HAVE_ALSA_ASOUNDLIB_H)
523     IF(HAVE_ALSA_ASOUNDLIB_H)
524         CHECK_SHARED_FUNCTION_EXISTS(snd_pcm_open "alsa/asoundlib.h" asound "" HAVE_LIBASOUND)
525         IF(HAVE_LIBASOUND OR HAVE_DLFCN_H OR WIN32)
526             SET(HAVE_ALSA 1)
527             SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/alsa.c)
528             IF(HAVE_DLFCN_H OR WIN32)
529                 SET(BACKENDS  "${BACKENDS} ALSA,")
530             ELSE()
531                 SET(BACKENDS  "${BACKENDS} ALSA \(linked\),")
532                 SET(EXTRA_LIBS asound ${EXTRA_LIBS})
533             ENDIF()
534         ENDIF()
535     ENDIF()
536 ENDIF()
537 IF(REQUIRE_ALSA AND NOT HAVE_ALSA)
538     MESSAGE(FATAL_ERROR "Failed to enabled required ALSA backend")
539 ENDIF()
541 # Check OSS backend
542 IF(OSS)
543     CHECK_INCLUDE_FILE(sys/soundcard.h HAVE_SYS_SOUNDCARD_H)
544     IF(HAVE_SYS_SOUNDCARD_H)
545         SET(HAVE_OSS 1)
546         SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/oss.c)
547         SET(BACKENDS  "${BACKENDS} OSS,")
548     ENDIF()
549 ENDIF()
550 IF(REQUIRE_OSS AND NOT HAVE_OSS)
551     MESSAGE(FATAL_ERROR "Failed to enabled required OSS backend")
552 ENDIF()
554 # Check Solaris backend
555 IF(SOLARIS)
556     CHECK_INCLUDE_FILE(sys/audioio.h HAVE_SYS_AUDIOIO_H)
557     IF(HAVE_SYS_AUDIOIO_H)
558         SET(HAVE_SOLARIS 1)
559         SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/solaris.c)
560         SET(BACKENDS  "${BACKENDS} Solaris,")
561     ENDIF()
562 ENDIF()
563 IF(REQUIRE_SOLARIS AND NOT HAVE_SOLARIS)
564     MESSAGE(FATAL_ERROR "Failed to enabled required Solaris backend")
565 ENDIF()
567 # Check SndIO backend
568 IF(SNDIO)
569     CHECK_INCLUDE_FILE(sndio.h HAVE_SNDIO_H)
570     IF(HAVE_SNDIO_H)
571         CHECK_SHARED_FUNCTION_EXISTS(sio_open "sndio.h" sndio "" HAVE_LIBSNDIO)
572         IF(HAVE_LIBSNDIO)
573             SET(HAVE_SNDIO 1)
574             SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/sndio.c)
575             SET(BACKENDS  "${BACKENDS} SndIO \(linked\),")
576             SET(EXTRA_LIBS sndio ${EXTRA_LIBS})
577         ENDIF()
578     ENDIF()
579 ENDIF()
580 IF(REQUIRE_SNDIO AND NOT HAVE_SNDIO)
581     MESSAGE(FATAL_ERROR "Failed to enabled required SndIO backend")
582 ENDIF()
584 # Check for MMDevApi backend
585 IF(HAVE_WINDOWS_H)
586     IF(MMDEVAPI)
587         CHECK_INCLUDE_FILE(mmdeviceapi.h HAVE_MMDEVICEAPI_H)
588         IF(HAVE_MMDEVICEAPI_H)
589             SET(HAVE_MMDEVAPI 1)
590             SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/mmdevapi.c)
592             SET(BACKENDS  "${BACKENDS} MMDevApi,")
593         ENDIF()
594     ENDIF()
595 ENDIF()
596 IF(REQUIRE_MMDEVAPI AND NOT HAVE_MMDEVAPI)
597     MESSAGE(FATAL_ERROR "Failed to enabled required MMDevApi backend")
598 ENDIF()
600 # Check DSound/MMSystem backend
601 IF(DSOUND)
602     CHECK_INCLUDE_FILE(dsound.h HAVE_DSOUND_H)
603     IF(HAVE_DSOUND_H)
604         CHECK_SHARED_FUNCTION_EXISTS(DirectSoundCreate "dsound.h" dsound "" HAVE_LIBDSOUND)
605         IF(HAVE_LIBDSOUND OR HAVE_DLFCN_H OR WIN32)
606             SET(HAVE_DSOUND 1)
607             SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/dsound.c)
609             IF(HAVE_DLFCN_H OR WIN32)
610                 SET(BACKENDS  "${BACKENDS} DirectSound,")
611             ELSE()
612                 SET(BACKENDS  "${BACKENDS} DirectSound \(linked\),")
613                 SET(EXTRA_LIBS dsound ${EXTRA_LIBS})
614             ENDIF()
615         ENDIF()
616     ENDIF()
617 ENDIF()
618 IF(REQUIRE_DSOUND AND NOT HAVE_DSOUND)
619     MESSAGE(FATAL_ERROR "Failed to enabled required DSound backend")
620 ENDIF()
622 IF(HAVE_WINDOWS_H)
623     IF(WINMM)
624         CHECK_INCLUDE_FILES("windows.h;mmsystem.h" HAVE_MMSYSTEM_H -D_WIN32_WINNT=0x0501)
625         IF(HAVE_MMSYSTEM_H AND HAVE_LIBWINMM)
626             SET(HAVE_WINMM 1)
627             SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/winmm.c)
628             SET(BACKENDS  "${BACKENDS} WinMM,")
629         ENDIF()
630     ENDIF()
631 ENDIF()
632 IF(REQUIRE_WINMM AND NOT HAVE_WINMM)
633     MESSAGE(FATAL_ERROR "Failed to enabled required WinMM backend")
634 ENDIF()
636 # Check PortAudio backend
637 IF(PORTAUDIO)
638     CHECK_INCLUDE_FILE(portaudio.h HAVE_PORTAUDIO_H)
639     IF(HAVE_PORTAUDIO_H)
640         CHECK_SHARED_FUNCTION_EXISTS(Pa_Initialize "portaudio.h" portaudio "" HAVE_LIBPORTAUDIO)
641         IF(HAVE_LIBPORTAUDIO OR HAVE_DLFCN_H OR WIN32)
642             SET(HAVE_PORTAUDIO 1)
643             SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/portaudio.c)
644             IF(HAVE_DLFCN_H OR WIN32)
645                 SET(BACKENDS  "${BACKENDS} PortAudio,")
646             ELSE()
647                 SET(BACKENDS  "${BACKENDS} PortAudio \(linked\),")
648                 SET(EXTRA_LIBS portaudio ${EXTRA_LIBS})
649             ENDIF()
650         ENDIF()
651     ENDIF()
652 ENDIF()
653 IF(REQUIRE_PORTAUDIO AND NOT HAVE_PORTAUDIO)
654     MESSAGE(FATAL_ERROR "Failed to enabled required PortAudio backend")
655 ENDIF()
657 # Check PulseAudio backend
658 IF(PULSEAUDIO)
659     CHECK_INCLUDE_FILE(pulse/pulseaudio.h HAVE_PULSE_PULSEAUDIO_H)
660     IF(HAVE_PULSE_PULSEAUDIO_H)
661         CHECK_SHARED_FUNCTION_EXISTS(pa_context_new "pulse/pulseaudio.h" pulse "" HAVE_LIBPULSE)
662         IF(HAVE_LIBPULSE OR HAVE_DLFCN_H OR WIN32)
663             SET(HAVE_PULSEAUDIO 1)
664             SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/pulseaudio.c)
665             IF(HAVE_DLFCN_H OR WIN32)
666                 SET(BACKENDS  "${BACKENDS} PulseAudio,")
667             ELSE()
668                 SET(BACKENDS  "${BACKENDS} PulseAudio \(linked\),")
669                 SET(EXTRA_LIBS pulse ${EXTRA_LIBS})
670             ENDIF()
671         ENDIF()
672     ENDIF()
673 ENDIF()
674 IF(REQUIRE_PULSEAUDIO AND NOT HAVE_PULSEAUDIO)
675     MESSAGE(FATAL_ERROR "Failed to enabled required PulseAudio backend")
676 ENDIF()
678 # Check CoreAudio backend
679 IF(COREAUDIO)
680     CHECK_INCLUDE_FILE(/System/Library/Frameworks/CoreAudio.framework/Headers/CoreAudio.h HAVE_COREAUDIO_FRAMEWORK)
681     IF(HAVE_COREAUDIO_FRAMEWORK)
682         SET(HAVE_COREAUDIO 1)
683         SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/coreaudio.c)
684         SET(BACKENDS  "${BACKENDS} CoreAudio,")
685         SET(EXTRA_LIBS /System/Library/Frameworks/CoreAudio.framework ${EXTRA_LIBS})
686         SET(EXTRA_LIBS /System/Library/Frameworks/AudioUnit.framework ${EXTRA_LIBS})
687         SET(EXTRA_LIBS /System/Library/Frameworks/ApplicationServices.framework ${EXTRA_LIBS})
689         # Some versions of OSX may need the AudioToolbox framework. Add it if
690         # it's found.
691         FIND_LIBRARY(AUDIOTOOLBOX_LIBRARY
692                      NAMES AudioToolbox
693                      PATHS ~/Library/Frameworks
694                            /Library/Frameworks
695                            /System/Library/Frameworks
696                     )
697         IF(AUDIOTOOLBOX_LIBRARY)
698             SET(EXTRA_LIBS ${AUDIOTOOLBOX_LIBRARY} ${EXTRA_LIBS})
699         ENDIF()
700     ENDIF()
701 ENDIF()
702 IF(REQUIRE_COREAUDIO AND NOT HAVE_COREAUDIO)
703     MESSAGE(FATAL_ERROR "Failed to enabled required CoreAudio backend")
704 ENDIF()
706 # Check for OpenSL (Android) backend
707 IF(OPENSL)
708     CHECK_INCLUDE_FILES("SLES/OpenSLES.h;SLES/OpenSLES_Android.h" HAVE_SLES_OPENSLES_ANDROID_H)
709     IF(HAVE_SLES_OPENSLES_ANDROID_H)
710         CHECK_SHARED_FUNCTION_EXISTS(slCreateEngine "SLES/OpenSLES.h" OpenSLES "" HAVE_LIBOPENSLES)
711         IF(HAVE_LIBOPENSLES)
712             SET(HAVE_OPENSL 1)
713             SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/opensl.c)
714             SET(BACKENDS  "${BACKENDS} OpenSL,")
715             SET(EXTRA_LIBS OpenSLES ${EXTRA_LIBS})
716         ENDIF()
717     ENDIF()
718 ENDIF()
719 IF(REQUIRE_OPENSL AND NOT HAVE_OPENSL)
720     MESSAGE(FATAL_ERROR "Failed to enabled required OpenSL backend")
721 ENDIF()
723 # Optionally enable the Wave Writer backend
724 IF(WAVE)
725     SET(HAVE_WAVE 1)
726     SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/wave.c)
727     SET(BACKENDS  "${BACKENDS} WaveFile,")
728 ENDIF()
730 # This is always available
731 SET(BACKENDS  "${BACKENDS} Null")
733 IF(EXAMPLES)
734     # Might be able to use earlier versions, but these definitely work
735     PKG_CHECK_MODULES(FFMPEG libavcodec>=53.61.100 libavformat>=53.32.100 libavutil>=51.35.100)
736 ENDIF()
738 IF(LIBTYPE STREQUAL "STATIC")
739     ADD_DEFINITIONS(-DAL_LIBTYPE_STATIC)
740     SET(PKG_CONFIG_CFLAGS -DAL_LIBTYPE_STATIC ${PKG_CONFIG_CFLAGS})
741 ENDIF()
743 # Needed for openal.pc.in
744 SET(prefix ${CMAKE_INSTALL_PREFIX})
745 SET(exec_prefix "\${prefix}")
746 SET(libdir "\${exec_prefix}/lib${LIB_SUFFIX}")
747 SET(bindir "\${exec_prefix}/bin")
748 SET(includedir "\${prefix}/include")
749 SET(PACKAGE_VERSION "${LIB_VERSION}")
751 # End configuration
752 CONFIGURE_FILE(
753     "${OpenAL_SOURCE_DIR}/config.h.in"
754     "${OpenAL_BINARY_DIR}/config.h")
755 CONFIGURE_FILE(
756     "${OpenAL_SOURCE_DIR}/openal.pc.in"
757     "${OpenAL_BINARY_DIR}/openal.pc"
758     @ONLY)
760 # Build a library
761 ADD_LIBRARY(${LIBNAME} ${LIBTYPE} ${OPENAL_OBJS} ${ALC_OBJS})
762 SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES DEFINE_SYMBOL AL_BUILD_LIBRARY
763                                             COMPILE_FLAGS -DAL_ALEXT_PROTOTYPES
764                                             VERSION ${LIB_VERSION}.0
765                                             SOVERSION ${LIB_MAJOR_VERSION})
766 IF(WIN32 AND NOT LIBTYPE STREQUAL "STATIC")
767     SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES PREFIX "")
768 ENDIF()
770 TARGET_LINK_LIBRARIES(${LIBNAME} ${EXTRA_LIBS})
772 # Add an install target here
773 INSTALL(TARGETS ${LIBNAME}
774         RUNTIME DESTINATION bin
775         LIBRARY DESTINATION "lib${LIB_SUFFIX}"
776         ARCHIVE DESTINATION "lib${LIB_SUFFIX}"
778 INSTALL(FILES include/AL/al.h
779               include/AL/alc.h
780               include/AL/alext.h
781               include/AL/efx.h
782               include/AL/efx-creative.h
783               include/AL/efx-presets.h
784         DESTINATION include/AL
786 INSTALL(FILES "${OpenAL_BINARY_DIR}/openal.pc"
787         DESTINATION "lib${LIB_SUFFIX}/pkgconfig")
790 MESSAGE(STATUS "")
791 MESSAGE(STATUS "Building OpenAL with support for the following backends:")
792 MESSAGE(STATUS "    ${BACKENDS}")
793 MESSAGE(STATUS "")
794 MESSAGE(STATUS "Building with support for CPU extensions:")
795 MESSAGE(STATUS "    ${CPU_EXTS}")
796 MESSAGE(STATUS "")
798 IF(WIN32)
799     IF(NOT HAVE_DSOUND)
800         MESSAGE(STATUS "WARNING: Building the Windows version without DirectSound output")
801         MESSAGE(STATUS "         This is probably NOT what you want!")
802         MESSAGE(STATUS "")
803     ENDIF()
804 ENDIF()
806 # Install alsoft.conf configuration file
807 IF(ALSOFT_CONFIG)
808     INSTALL(FILES alsoftrc.sample
809             DESTINATION /etc/openal
810             RENAME alsoft.conf
811     )
812     MESSAGE(STATUS "Installing sample alsoft.conf")
813     MESSAGE(STATUS "")
814 ENDIF()
816 IF(UTILS)
817     ADD_EXECUTABLE(openal-info utils/openal-info.c)
818     TARGET_LINK_LIBRARIES(openal-info ${LIBNAME})
820     ADD_EXECUTABLE(makehrtf utils/makehrtf.c)
821     IF(HAVE_LIBM)
822         TARGET_LINK_LIBRARIES(makehrtf m)
823     ENDIF()
825     INSTALL(TARGETS openal-info makehrtf
826             RUNTIME DESTINATION bin
827             LIBRARY DESTINATION "lib${LIB_SUFFIX}"
828             ARCHIVE DESTINATION "lib${LIB_SUFFIX}"
829     )
830     MESSAGE(STATUS "Building utility programs")
831     MESSAGE(STATUS "")
832 ENDIF()
834 IF(EXAMPLES)
835     IF(FFMPEG_FOUND)
836         ADD_EXECUTABLE(alstream examples/alhelpers.c examples/alffmpeg.c examples/alstream.c)
837         TARGET_LINK_LIBRARIES(alstream ${FFMPEG_LIBRARIES} ${LIBNAME})
838         SET_TARGET_PROPERTIES(alstream PROPERTIES COMPILE_FLAGS "${FFMPEG_CFLAGS}")
839         INSTALL(TARGETS alstream
840                 RUNTIME DESTINATION bin
841                 LIBRARY DESTINATION "lib${LIB_SUFFIX}"
842                 ARCHIVE DESTINATION "lib${LIB_SUFFIX}"
843         )
845         MESSAGE(STATUS "Building ffmpeg example programs")
846         MESSAGE(STATUS "")
847     ENDIF()
848 ENDIF()