Rename cmake options so GUIs order them better
[openal-soft.git] / CMakeLists.txt
blob94f7c8445860ef097538e0c0522954bdaa5eb48e
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 CHECK_C_COMPILER_FLAG(-msse HAVE_MSSE_SWITCH)
243 IF(HAVE_MSSE_SWITCH)
244     SET(SSE_SWITCH "-msse")
245 ENDIF()
247 CHECK_C_SOURCE_COMPILES("int foo(const char *str, ...) __attribute__((format(printf, 1, 2)));
248                          int main() {return 0;}" HAVE_GCC_FORMAT)
250 CHECK_INCLUDE_FILE(malloc.h HAVE_MALLOC_H)
251 CHECK_INCLUDE_FILE(cpuid.h HAVE_CPUID_H)
252 CHECK_INCLUDE_FILE(fenv.h HAVE_FENV_H)
253 CHECK_INCLUDE_FILE(float.h HAVE_FLOAT_H)
254 CHECK_INCLUDE_FILE(ieeefp.h HAVE_IEEEFP_H)
255 CHECK_INCLUDE_FILE(guiddef.h HAVE_GUIDDEF_H)
256 IF(NOT HAVE_GUIDDEF_H)
257     CHECK_INCLUDE_FILE(initguid.h HAVE_INITGUID_H)
258 ENDIF()
260 # Some systems need libm for some of the following math functions to work
261 CHECK_LIBRARY_EXISTS(m pow "" HAVE_LIBM)
262 IF(HAVE_LIBM)
263     SET(EXTRA_LIBS m ${EXTRA_LIBS})
264     SET(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} m)
265 ENDIF()
268 CHECK_SYMBOL_EXISTS(aligned_alloc    stdlib.h HAVE_ALIGNED_ALLOC)
269 CHECK_SYMBOL_EXISTS(posix_memalign   stdlib.h HAVE_POSIX_MEMALIGN)
270 CHECK_SYMBOL_EXISTS(_aligned_malloc  malloc.h HAVE__ALIGNED_MALLOC)
271 CHECK_SYMBOL_EXISTS(lrintf math.h HAVE_LRINTF)
273 IF(HAVE_FENV_H)
274     CHECK_SYMBOL_EXISTS(fesetround fenv.h HAVE_FESETROUND)
275 ENDIF()
276 IF(HAVE_FLOAT_H)
277     CHECK_SYMBOL_EXISTS(_controlfp float.h HAVE__CONTROLFP)
278     CHECK_SYMBOL_EXISTS(__control87_2 float.h HAVE___CONTROL87_2)
279 ENDIF()
281 CHECK_FUNCTION_EXISTS(strtof HAVE_STRTOF)
282 CHECK_FUNCTION_EXISTS(stat HAVE_STAT)
283 CHECK_FUNCTION_EXISTS(strcasecmp HAVE_STRCASECMP)
284 IF(NOT HAVE_STRCASECMP)
285     CHECK_FUNCTION_EXISTS(_stricmp HAVE__STRICMP)
286     IF(NOT HAVE__STRICMP)
287         MESSAGE(FATAL_ERROR "No case-insensitive compare function found, please report!")
288     ENDIF()
290     ADD_DEFINITIONS(-Dstrcasecmp=_stricmp)
291 ENDIF()
293 CHECK_FUNCTION_EXISTS(strncasecmp HAVE_STRNCASECMP)
294 IF(NOT HAVE_STRNCASECMP)
295     CHECK_FUNCTION_EXISTS(_strnicmp HAVE__STRNICMP)
296     IF(NOT HAVE__STRNICMP)
297         MESSAGE(FATAL_ERROR "No case-insensitive size-limitted compare function found, please report!")
298     ENDIF()
300     ADD_DEFINITIONS(-Dstrncasecmp=_strnicmp)
301 ENDIF()
303 CHECK_FUNCTION_EXISTS(snprintf HAVE_SNPRINTF)
304 IF(NOT HAVE_SNPRINTF)
305     CHECK_FUNCTION_EXISTS(_snprintf HAVE__SNPRINTF)
306     IF(NOT HAVE__SNPRINTF)
307         MESSAGE(FATAL_ERROR "No snprintf function found, please report!")
308     ENDIF()
310     ADD_DEFINITIONS(-Dsnprintf=_snprintf)
311 ENDIF()
313 CHECK_FUNCTION_EXISTS(vsnprintf HAVE_VSNPRINTF)
314 IF(NOT HAVE_VSNPRINTF)
315     CHECK_FUNCTION_EXISTS(_vsnprintf HAVE__VSNPRINTF)
316     IF(NOT HAVE__VSNPRINTF)
317         MESSAGE(FATAL_ERROR "No vsnprintf function found, please report!")
318     ENDIF()
320     ADD_DEFINITIONS(-Dvsnprintf=_vsnprintf)
321 ENDIF()
323 CHECK_SYMBOL_EXISTS(isfinite math.h HAVE_ISFINITE)
324 IF(NOT HAVE_ISFINITE)
325     CHECK_FUNCTION_EXISTS(finite HAVE_FINITE)
326     IF(NOT HAVE_FINITE)
327         CHECK_FUNCTION_EXISTS(_finite HAVE__FINITE)
328         IF(NOT HAVE__FINITE)
329             MESSAGE(FATAL_ERROR "No isfinite function found, please report!")
330         ENDIF()
331         ADD_DEFINITIONS(-Disfinite=_finite)
332     ELSE()
333         ADD_DEFINITIONS(-Disfinite=finite)
334     ENDIF()
335 ENDIF()
337 CHECK_SYMBOL_EXISTS(isnan math.h HAVE_ISNAN)
338 IF(NOT HAVE_ISNAN)
339     CHECK_FUNCTION_EXISTS(_isnan HAVE__ISNAN)
340     IF(NOT HAVE__ISNAN)
341         MESSAGE(FATAL_ERROR "No isnan function found, please report!")
342     ENDIF()
344     ADD_DEFINITIONS(-Disnan=_isnan)
345 ENDIF()
348 # Check for the dlopen API (for dynamicly loading backend libs)
349 IF(ALSOFT_DLOPEN)
350     CHECK_INCLUDE_FILE(dlfcn.h HAVE_DLFCN_H)
351     IF(HAVE_DLFCN_H)
352         CHECK_LIBRARY_EXISTS(dl dlopen "" HAVE_LIBDL)
353         IF(HAVE_LIBDL)
354             SET(EXTRA_LIBS dl ${EXTRA_LIBS})
355         ENDIF()
356     ENDIF()
357 ENDIF()
359 # Check if we have Windows headers
360 CHECK_INCLUDE_FILE(windows.h HAVE_WINDOWS_H -D_WIN32_WINNT=0x0501)
361 IF(NOT HAVE_WINDOWS_H)
362     CHECK_FUNCTION_EXISTS(gettimeofday HAVE_GETTIMEOFDAY)
363     IF(NOT HAVE_GETTIMEOFDAY)
364         MESSAGE(FATAL_ERROR "No timing function found!")
365     ENDIF()
367     CHECK_FUNCTION_EXISTS(nanosleep HAVE_NANOSLEEP)
368     IF(NOT HAVE_NANOSLEEP)
369         MESSAGE(FATAL_ERROR "No sleep function found!")
370     ENDIF()
372     CHECK_C_COMPILER_FLAG(-pthread HAVE_PTHREAD)
373     IF(HAVE_PTHREAD)
374         ADD_DEFINITIONS(-pthread)
375         SET(EXTRA_LIBS ${EXTRA_LIBS} -pthread)
376     ENDIF()
378     # We need pthreads outside of Windows
379     CHECK_INCLUDE_FILE(pthread.h HAVE_PTHREAD_H)
380     IF(NOT HAVE_PTHREAD_H)
381         MESSAGE(FATAL_ERROR "PThreads is required for non-Windows builds!")
382     ENDIF()
383     # Some systems need pthread_np.h to get recursive mutexes
384     CHECK_INCLUDE_FILES("pthread.h;pthread_np.h" HAVE_PTHREAD_NP_H)
386     # _GNU_SOURCE is needed on some systems for extra attributes
387     ADD_DEFINITIONS(-D_GNU_SOURCE=1)
388     CHECK_LIBRARY_EXISTS(pthread pthread_create "" HAVE_LIBPTHREAD)
389     IF(HAVE_LIBPTHREAD)
390         SET(EXTRA_LIBS pthread ${EXTRA_LIBS})
391     ENDIF()
393     CHECK_LIBRARY_EXISTS(pthread pthread_setschedparam "" HAVE_PTHREAD_SETSCHEDPARAM)
395     CHECK_LIBRARY_EXISTS(rt clock_gettime "" HAVE_LIBRT)
396     IF(HAVE_LIBRT)
397         SET(EXTRA_LIBS rt ${EXTRA_LIBS})
398     ENDIF()
399 ENDIF()
401 # Check for a 64-bit type
402 CHECK_INCLUDE_FILE(stdint.h HAVE_STDINT_H)
403 IF(NOT HAVE_STDINT_H)
404     IF(HAVE_WINDOWS_H)
405         CHECK_C_SOURCE_COMPILES("\#define _WIN32_WINNT 0x0501
406                                  \#include <windows.h>
407                                  __int64 foo;
408                                  int main() {return 0;}" HAVE___INT64)
409     ENDIF()
410     IF(NOT HAVE___INT64)
411         IF(NOT SIZEOF_LONG MATCHES "8")
412             IF(NOT SIZEOF_LONG_LONG MATCHES "8")
413                 MESSAGE(FATAL_ERROR "No 64-bit types found, please report!")
414             ENDIF()
415         ENDIF()
416     ENDIF()
417 ENDIF()
419 # Windows needs winmm for timeGetTime, even if the backend is disabled
420 CHECK_SHARED_FUNCTION_EXISTS(timeGetTime "windows.h;mmsystem.h" winmm "" HAVE_LIBWINMM)
421 IF(HAVE_LIBWINMM)
422     SET(EXTRA_LIBS winmm ${EXTRA_LIBS})
423     SET(PKG_CONFIG_LIBS ${PKG_CONFIG_LIBS} -lwinmm)
424 ENDIF()
427 SET(OPENAL_OBJS  OpenAL32/alAuxEffectSlot.c
428                  OpenAL32/alBuffer.c
429                  OpenAL32/alEffect.c
430                  OpenAL32/alError.c
431                  OpenAL32/alExtension.c
432                  OpenAL32/alFilter.c
433                  OpenAL32/alListener.c
434                  OpenAL32/alSource.c
435                  OpenAL32/alState.c
436                  OpenAL32/alThunk.c
438 SET(ALC_OBJS  Alc/ALc.c
439               Alc/ALu.c
440               Alc/alcConfig.c
441               Alc/alcDedicated.c
442               Alc/alcEcho.c
443               Alc/alcModulator.c
444               Alc/alcReverb.c
445               Alc/alcRing.c
446               Alc/alcThread.c
447               Alc/bs2b.c
448               Alc/helpers.c
449               Alc/panning.c
450               Alc/hrtf.c
451               Alc/mixer.c
452               Alc/mixer_c.c
456 SET(CPU_EXTS "Default")
457 SET(HAVE_SSE  0)
458 SET(HAVE_NEON 0)
460 # Check for SSE support
461 IF(ALSOFT_CPUEXT_SSE AND ALIGN_DECL)
462     CHECK_INCLUDE_FILE(xmmintrin.h HAVE_XMMINTRIN_H "${SSE_SWITCH}")
463     IF(HAVE_XMMINTRIN_H)
464         SET(HAVE_SSE 1)
465         SET(ALC_OBJS  ${ALC_OBJS} Alc/mixer_sse.c)
466         IF(SSE_SWITCH)
467             SET_SOURCE_FILES_PROPERTIES(Alc/mixer_sse.c PROPERTIES
468                                         COMPILE_FLAGS "${SSE_SWITCH}")
469         ENDIF()
470         SET(CPU_EXTS "${CPU_EXTS}, SSE")
471     ENDIF()
472 ENDIF()
473 IF(ALSOFT_REQUIRE_SSE AND NOT HAVE_SSE)
474     MESSAGE(FATAL_ERROR "Failed to enabled required SSE CPU extensions")
475 ENDIF()
477 # Check for ARM Neon support
478 IF(ALSOFT_CPUEXT_NEON)
479     CHECK_INCLUDE_FILE(arm_neon.h HAVE_ARM_NEON_H)
480     IF(HAVE_ARM_NEON_H)
481         SET(HAVE_NEON 1)
482         SET(ALC_OBJS  ${ALC_OBJS} Alc/mixer_neon.c)
483         SET(CPU_EXTS "${CPU_EXTS}, Neon")
484     ENDIF()
485 ENDIF()
486 IF(ALSOFT_REQUIRE_NEON AND NOT HAVE_NEON)
487     MESSAGE(FATAL_ERROR "Failed to enabled required ARM Neon CPU extensions")
488 ENDIF()
491 SET(ALC_OBJS  ${ALC_OBJS}
492               # Default backends, always available
493               Alc/backends/loopback.c
494               Alc/backends/null.c
497 SET(BACKENDS "")
498 SET(HAVE_ALSA       0)
499 SET(HAVE_OSS        0)
500 SET(HAVE_SOLARIS    0)
501 SET(HAVE_SNDIO      0)
502 SET(HAVE_DSOUND     0)
503 SET(HAVE_MMDEVAPI   0)
504 SET(HAVE_WINMM      0)
505 SET(HAVE_PORTAUDIO  0)
506 SET(HAVE_PULSEAUDIO 0)
507 SET(HAVE_COREAUDIO  0)
508 SET(HAVE_OPENSL     0)
509 SET(HAVE_WAVE       0)
511 # Check ALSA backend
512 IF(ALSOFT_BACKEND_ALSA)
513     CHECK_INCLUDE_FILE(alsa/asoundlib.h HAVE_ALSA_ASOUNDLIB_H)
514     IF(HAVE_ALSA_ASOUNDLIB_H)
515         CHECK_SHARED_FUNCTION_EXISTS(snd_pcm_open "alsa/asoundlib.h" asound "" HAVE_LIBASOUND)
516         IF(HAVE_LIBASOUND OR HAVE_DLFCN_H OR WIN32)
517             SET(HAVE_ALSA 1)
518             SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/alsa.c)
519             IF(HAVE_DLFCN_H OR WIN32)
520                 SET(BACKENDS  "${BACKENDS} ALSA,")
521             ELSE()
522                 SET(BACKENDS  "${BACKENDS} ALSA \(linked\),")
523                 SET(EXTRA_LIBS asound ${EXTRA_LIBS})
524             ENDIF()
525         ENDIF()
526     ENDIF()
527 ENDIF()
528 IF(ALSOFT_REQUIRE_ALSA AND NOT HAVE_ALSA)
529     MESSAGE(FATAL_ERROR "Failed to enabled required ALSA backend")
530 ENDIF()
532 # Check OSS backend
533 IF(ALSOFT_BACKEND_OSS)
534     CHECK_INCLUDE_FILE(sys/soundcard.h HAVE_SYS_SOUNDCARD_H)
535     IF(HAVE_SYS_SOUNDCARD_H)
536         SET(HAVE_OSS 1)
537         SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/oss.c)
538         SET(BACKENDS  "${BACKENDS} OSS,")
539     ENDIF()
540 ENDIF()
541 IF(ALSOFT_REQUIRE_OSS AND NOT HAVE_OSS)
542     MESSAGE(FATAL_ERROR "Failed to enabled required OSS backend")
543 ENDIF()
545 # Check Solaris backend
546 IF(ALSOFT_BACKEND_SOLARIS)
547     CHECK_INCLUDE_FILE(sys/audioio.h HAVE_SYS_AUDIOIO_H)
548     IF(HAVE_SYS_AUDIOIO_H)
549         SET(HAVE_SOLARIS 1)
550         SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/solaris.c)
551         SET(BACKENDS  "${BACKENDS} Solaris,")
552     ENDIF()
553 ENDIF()
554 IF(ALSOFT_REQUIRE_SOLARIS AND NOT HAVE_SOLARIS)
555     MESSAGE(FATAL_ERROR "Failed to enabled required Solaris backend")
556 ENDIF()
558 # Check SndIO backend
559 IF(ALSOFT_BACKEND_SNDIO)
560     CHECK_INCLUDE_FILE(sndio.h HAVE_SNDIO_H)
561     IF(HAVE_SNDIO_H)
562         CHECK_SHARED_FUNCTION_EXISTS(sio_open "sndio.h" sndio "" HAVE_LIBSNDIO)
563         IF(HAVE_LIBSNDIO)
564             SET(HAVE_SNDIO 1)
565             SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/sndio.c)
566             SET(BACKENDS  "${BACKENDS} SndIO \(linked\),")
567             SET(EXTRA_LIBS sndio ${EXTRA_LIBS})
568         ENDIF()
569     ENDIF()
570 ENDIF()
571 IF(ALSOFT_REQUIRE_SNDIO AND NOT HAVE_SNDIO)
572     MESSAGE(FATAL_ERROR "Failed to enabled required SndIO backend")
573 ENDIF()
575 # Check for MMDevApi backend
576 IF(HAVE_WINDOWS_H)
577     IF(ALSOFT_BACKEND_MMDEVAPI)
578         CHECK_INCLUDE_FILE(mmdeviceapi.h HAVE_MMDEVICEAPI_H)
579         IF(HAVE_MMDEVICEAPI_H)
580             SET(HAVE_MMDEVAPI 1)
581             SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/mmdevapi.c)
583             SET(BACKENDS  "${BACKENDS} MMDevApi,")
584         ENDIF()
585     ENDIF()
586 ENDIF()
587 IF(ALSOFT_REQUIRE_MMDEVAPI AND NOT HAVE_MMDEVAPI)
588     MESSAGE(FATAL_ERROR "Failed to enabled required MMDevApi backend")
589 ENDIF()
591 # Check DSound/MMSystem backend
592 IF(ALSOFT_BACKEND_DSOUND)
593     CHECK_INCLUDE_FILE(dsound.h HAVE_DSOUND_H)
594     IF(HAVE_DSOUND_H)
595         CHECK_SHARED_FUNCTION_EXISTS(DirectSoundCreate "dsound.h" dsound "" HAVE_LIBDSOUND)
596         IF(HAVE_LIBDSOUND OR HAVE_DLFCN_H OR WIN32)
597             SET(HAVE_DSOUND 1)
598             SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/dsound.c)
600             IF(HAVE_DLFCN_H OR WIN32)
601                 SET(BACKENDS  "${BACKENDS} DirectSound,")
602             ELSE()
603                 SET(BACKENDS  "${BACKENDS} DirectSound \(linked\),")
604                 SET(EXTRA_LIBS dsound ${EXTRA_LIBS})
605             ENDIF()
606         ENDIF()
607     ENDIF()
608 ENDIF()
609 IF(ALSOFT_REQUIRE_DSOUND AND NOT HAVE_DSOUND)
610     MESSAGE(FATAL_ERROR "Failed to enabled required DSound backend")
611 ENDIF()
613 IF(HAVE_WINDOWS_H)
614     IF(ALSOFT_BACKEND_WINMM)
615         CHECK_INCLUDE_FILES("windows.h;mmsystem.h" HAVE_MMSYSTEM_H -D_WIN32_WINNT=0x0501)
616         IF(HAVE_MMSYSTEM_H AND HAVE_LIBWINMM)
617             SET(HAVE_WINMM 1)
618             SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/winmm.c)
619             SET(BACKENDS  "${BACKENDS} WinMM,")
620         ENDIF()
621     ENDIF()
622 ENDIF()
623 IF(ALSOFT_REQUIRE_WINMM AND NOT HAVE_WINMM)
624     MESSAGE(FATAL_ERROR "Failed to enabled required WinMM backend")
625 ENDIF()
627 # Check PortAudio backend
628 IF(ALSOFT_BACKEND_PORTAUDIO)
629     CHECK_INCLUDE_FILE(portaudio.h HAVE_PORTAUDIO_H)
630     IF(HAVE_PORTAUDIO_H)
631         CHECK_SHARED_FUNCTION_EXISTS(Pa_Initialize "portaudio.h" portaudio "" HAVE_LIBPORTAUDIO)
632         IF(HAVE_LIBPORTAUDIO OR HAVE_DLFCN_H OR WIN32)
633             SET(HAVE_PORTAUDIO 1)
634             SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/portaudio.c)
635             IF(HAVE_DLFCN_H OR WIN32)
636                 SET(BACKENDS  "${BACKENDS} PortAudio,")
637             ELSE()
638                 SET(BACKENDS  "${BACKENDS} PortAudio \(linked\),")
639                 SET(EXTRA_LIBS portaudio ${EXTRA_LIBS})
640             ENDIF()
641         ENDIF()
642     ENDIF()
643 ENDIF()
644 IF(ALSOFT_REQUIRE_PORTAUDIO AND NOT HAVE_PORTAUDIO)
645     MESSAGE(FATAL_ERROR "Failed to enabled required PortAudio backend")
646 ENDIF()
648 # Check PulseAudio backend
649 IF(ALSOFT_BACKEND_PULSEAUDIO)
650     CHECK_INCLUDE_FILE(pulse/pulseaudio.h HAVE_PULSE_PULSEAUDIO_H)
651     IF(HAVE_PULSE_PULSEAUDIO_H)
652         CHECK_SHARED_FUNCTION_EXISTS(pa_context_new "pulse/pulseaudio.h" pulse "" HAVE_LIBPULSE)
653         IF(HAVE_LIBPULSE OR HAVE_DLFCN_H OR WIN32)
654             SET(HAVE_PULSEAUDIO 1)
655             SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/pulseaudio.c)
656             IF(HAVE_DLFCN_H OR WIN32)
657                 SET(BACKENDS  "${BACKENDS} PulseAudio,")
658             ELSE()
659                 SET(BACKENDS  "${BACKENDS} PulseAudio \(linked\),")
660                 SET(EXTRA_LIBS pulse ${EXTRA_LIBS})
661             ENDIF()
662         ENDIF()
663     ENDIF()
664 ENDIF()
665 IF(ALSOFT_REQUIRE_PULSEAUDIO AND NOT HAVE_PULSEAUDIO)
666     MESSAGE(FATAL_ERROR "Failed to enabled required PulseAudio backend")
667 ENDIF()
669 # Check CoreAudio backend
670 IF(COREAUDIO)
671     CHECK_INCLUDE_FILE(/System/Library/Frameworks/CoreAudio.framework/Headers/CoreAudio.h HAVE_COREAUDIO_FRAMEWORK)
672     IF(HAVE_COREAUDIO_FRAMEWORK)
673         SET(HAVE_COREAUDIO 1)
674         SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/coreaudio.c)
675         SET(BACKENDS  "${BACKENDS} CoreAudio,")
676         SET(EXTRA_LIBS /System/Library/Frameworks/CoreAudio.framework ${EXTRA_LIBS})
677         SET(EXTRA_LIBS /System/Library/Frameworks/AudioUnit.framework ${EXTRA_LIBS})
678         SET(EXTRA_LIBS /System/Library/Frameworks/ApplicationServices.framework ${EXTRA_LIBS})
680         # Some versions of OSX may need the AudioToolbox framework. Add it if
681         # it's found.
682         FIND_LIBRARY(AUDIOTOOLBOX_LIBRARY
683                      NAMES AudioToolbox
684                      PATHS ~/Library/Frameworks
685                            /Library/Frameworks
686                            /System/Library/Frameworks
687                     )
688         IF(AUDIOTOOLBOX_LIBRARY)
689             SET(EXTRA_LIBS ${AUDIOTOOLBOX_LIBRARY} ${EXTRA_LIBS})
690         ENDIF()
691     ENDIF()
692 ENDIF()
693 IF(ALSOFT_REQUIRE_COREAUDIO AND NOT HAVE_COREAUDIO)
694     MESSAGE(FATAL_ERROR "Failed to enabled required CoreAudio backend")
695 ENDIF()
697 # Check for OpenSL (Android) backend
698 IF(ALSOFT_BACKEND_OPENSL)
699     CHECK_INCLUDE_FILES("SLES/OpenSLES.h;SLES/OpenSLES_Android.h" HAVE_SLES_OPENSLES_ANDROID_H)
700     IF(HAVE_SLES_OPENSLES_ANDROID_H)
701         CHECK_SHARED_FUNCTION_EXISTS(slCreateEngine "SLES/OpenSLES.h" OpenSLES "" HAVE_LIBOPENSLES)
702         IF(HAVE_LIBOPENSLES)
703             SET(HAVE_OPENSL 1)
704             SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/opensl.c)
705             SET(BACKENDS  "${BACKENDS} OpenSL,")
706             SET(EXTRA_LIBS OpenSLES ${EXTRA_LIBS})
707         ENDIF()
708     ENDIF()
709 ENDIF()
710 IF(ALSOFT_REQUIRE_OPENSL AND NOT HAVE_OPENSL)
711     MESSAGE(FATAL_ERROR "Failed to enabled required OpenSL backend")
712 ENDIF()
714 # Optionally enable the Wave Writer backend
715 IF(ALSOFT_BACKEND_WAVE)
716     SET(HAVE_WAVE 1)
717     SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/wave.c)
718     SET(BACKENDS  "${BACKENDS} WaveFile,")
719 ENDIF()
721 # This is always available
722 SET(BACKENDS  "${BACKENDS} Null")
724 IF(ALSOFT_EXAMPLES)
725     # Might be able to use earlier versions, but these definitely work
726     PKG_CHECK_MODULES(FFMPEG libavcodec>=53.61.100 libavformat>=53.32.100 libavutil>=51.35.100)
727 ENDIF()
729 IF(LIBTYPE STREQUAL "STATIC")
730     ADD_DEFINITIONS(-DAL_LIBTYPE_STATIC)
731     SET(PKG_CONFIG_CFLAGS -DAL_LIBTYPE_STATIC ${PKG_CONFIG_CFLAGS})
732 ENDIF()
734 # Needed for openal.pc.in
735 SET(prefix ${CMAKE_INSTALL_PREFIX})
736 SET(exec_prefix "\${prefix}")
737 SET(libdir "\${exec_prefix}/lib${LIB_SUFFIX}")
738 SET(bindir "\${exec_prefix}/bin")
739 SET(includedir "\${prefix}/include")
740 SET(PACKAGE_VERSION "${LIB_VERSION}")
742 # End configuration
743 CONFIGURE_FILE(
744     "${OpenAL_SOURCE_DIR}/config.h.in"
745     "${OpenAL_BINARY_DIR}/config.h")
746 CONFIGURE_FILE(
747     "${OpenAL_SOURCE_DIR}/openal.pc.in"
748     "${OpenAL_BINARY_DIR}/openal.pc"
749     @ONLY)
751 # Build a library
752 ADD_LIBRARY(${LIBNAME} ${LIBTYPE} ${OPENAL_OBJS} ${ALC_OBJS})
753 SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES DEFINE_SYMBOL AL_BUILD_LIBRARY
754                                             COMPILE_FLAGS -DAL_ALEXT_PROTOTYPES
755                                             VERSION ${LIB_VERSION}
756                                             SOVERSION ${LIB_MAJOR_VERSION})
757 IF(WIN32 AND NOT LIBTYPE STREQUAL "STATIC")
758     SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES PREFIX "")
759 ENDIF()
761 TARGET_LINK_LIBRARIES(${LIBNAME} ${EXTRA_LIBS})
763 # Add an install target here
764 INSTALL(TARGETS ${LIBNAME}
765         RUNTIME DESTINATION bin
766         LIBRARY DESTINATION "lib${LIB_SUFFIX}"
767         ARCHIVE DESTINATION "lib${LIB_SUFFIX}"
769 INSTALL(FILES include/AL/al.h
770               include/AL/alc.h
771               include/AL/alext.h
772               include/AL/efx.h
773               include/AL/efx-creative.h
774               include/AL/efx-presets.h
775         DESTINATION include/AL
777 INSTALL(FILES "${OpenAL_BINARY_DIR}/openal.pc"
778         DESTINATION "lib${LIB_SUFFIX}/pkgconfig")
781 MESSAGE(STATUS "")
782 MESSAGE(STATUS "Building OpenAL with support for the following backends:")
783 MESSAGE(STATUS "    ${BACKENDS}")
784 MESSAGE(STATUS "")
785 MESSAGE(STATUS "Building with support for CPU extensions:")
786 MESSAGE(STATUS "    ${CPU_EXTS}")
787 MESSAGE(STATUS "")
789 IF(WIN32)
790     IF(NOT HAVE_DSOUND)
791         MESSAGE(STATUS "WARNING: Building the Windows version without DirectSound output")
792         MESSAGE(STATUS "         This is probably NOT what you want!")
793         MESSAGE(STATUS "")
794     ENDIF()
795 ENDIF()
797 # Install alsoft.conf configuration file
798 IF(ALSOFT_CONFIG)
799     INSTALL(FILES alsoftrc.sample
800             DESTINATION share/openal
801     )
802     MESSAGE(STATUS "Installing sample configuration")
803     MESSAGE(STATUS "")
804 ENDIF()
806 IF(ALSOFT_UTILS)
807     ADD_EXECUTABLE(openal-info utils/openal-info.c)
808     TARGET_LINK_LIBRARIES(openal-info ${LIBNAME})
810     ADD_EXECUTABLE(makehrtf utils/makehrtf.c)
811     IF(HAVE_LIBM)
812         TARGET_LINK_LIBRARIES(makehrtf m)
813     ENDIF()
815     INSTALL(TARGETS openal-info makehrtf
816             RUNTIME DESTINATION bin
817             LIBRARY DESTINATION "lib${LIB_SUFFIX}"
818             ARCHIVE DESTINATION "lib${LIB_SUFFIX}"
819     )
820     MESSAGE(STATUS "Building utility programs")
821     MESSAGE(STATUS "")
822 ENDIF()
824 IF(ALSOFT_EXAMPLES)
825     IF(FFMPEG_FOUND)
826         ADD_EXECUTABLE(alstream examples/common/alhelpers.c
827                                 examples/common/alffmpeg.c
828                                 examples/alstream.c)
829         TARGET_LINK_LIBRARIES(alstream ${FFMPEG_LIBRARIES} ${LIBNAME})
830         SET_TARGET_PROPERTIES(alstream PROPERTIES COMPILE_FLAGS "${FFMPEG_CFLAGS}")
832         ADD_EXECUTABLE(alreverb examples/common/alhelpers.c
833                                 examples/common/alffmpeg.c
834                                 examples/alreverb.c)
835         TARGET_LINK_LIBRARIES(alreverb ${FFMPEG_LIBRARIES} ${LIBNAME})
836         SET_TARGET_PROPERTIES(alreverb PROPERTIES COMPILE_FLAGS "${FFMPEG_CFLAGS}")
838         ADD_EXECUTABLE(allatency examples/common/alhelpers.c
839                                  examples/common/alffmpeg.c
840                                  examples/allatency.c)
841         TARGET_LINK_LIBRARIES(allatency ${FFMPEG_LIBRARIES} ${LIBNAME})
842         SET_TARGET_PROPERTIES(allatency PROPERTIES COMPILE_FLAGS "${FFMPEG_CFLAGS}")
844         INSTALL(TARGETS alstream alreverb allatency
845                 RUNTIME DESTINATION bin
846                 LIBRARY DESTINATION "lib${LIB_SUFFIX}"
847                 ARCHIVE DESTINATION "lib${LIB_SUFFIX}"
848         )
850         MESSAGE(STATUS "Building ffmpeg example programs")
851         MESSAGE(STATUS "")
852     ENDIF()
853 ENDIF()