Don't force specific compile flags for the different build types
[openal-soft.git] / CMakeLists.txt
blob408ba3640caca8903976811884af28b3ba4ec5ba
1 # CMake build file list for OpenAL
3 CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
5 PROJECT(OpenAL)
7 IF(COMMAND CMAKE_POLICY)
8   CMAKE_POLICY(SET CMP0003 NEW)
9   CMAKE_POLICY(SET CMP0005 NEW)
10 ENDIF(COMMAND CMAKE_POLICY)
12 SET(CMAKE_MODULE_PATH "${OpenAL_SOURCE_DIR}/cmake")
14 INCLUDE(CheckFunctionExists)
15 INCLUDE(CheckLibraryExists)
16 INCLUDE(CheckSharedFunctionExists)
17 INCLUDE(CheckIncludeFile)
18 INCLUDE(CheckIncludeFiles)
19 INCLUDE(CheckSymbolExists)
20 INCLUDE(CheckCCompilerFlag)
21 INCLUDE(CheckCSourceCompiles)
22 INCLUDE(CheckTypeSize)
23 include(CheckFileOffsetBits)
26 SET(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS TRUE)
29 OPTION(ALSOFT_DLOPEN  "Check for the dlopen API for loading optional libs"  ON)
31 OPTION(ALSOFT_WERROR  "Treat compile warnings as errors"      OFF)
33 OPTION(ALSOFT_UTILS          "Build and install utility programs"         ON)
34 OPTION(ALSOFT_NO_CONFIG_UTIL "Disable building the alsoft-config utility" OFF)
36 OPTION(ALSOFT_EXAMPLES  "Build and install example programs"  ON)
38 OPTION(ALSOFT_CONFIG "Install alsoft.conf sample configuration file" ON)
39 OPTION(ALSOFT_HRTF_DEFS "Install HRTF definition files" ON)
42 IF(WIN32)
43     SET(LIBNAME OpenAL32)
44     ADD_DEFINITIONS("-D_WIN32 -D_WIN32_WINNT=0x0502")
46     # This option is mainly for static linking OpenAL Soft into another project
47     # that already defines the IDs. It is up to that project to ensure all
48     # required IDs are defined.
49     OPTION(ALSOFT_NO_UID_DEFS "Do not define GUIDs, IIDs, CLSIDs, or PropertyKeys" OFF)
51     IF(MINGW)
52         OPTION(ALSOFT_BUILD_IMPORT_LIB "Build an import .lib using dlltool (requires sed)" ON)
53         IF(NOT DLLTOOL)
54             IF(HOST)
55                 SET(DLLTOOL "${HOST}-dlltool")
56             ELSE()
57                 SET(DLLTOOL "dlltool")
58             ENDIF()
59         ENDIF()
60     ENDIF()
61 ELSE()
62     SET(LIBNAME openal)
64     # These are needed on non-Windows systems for extra features
65     ADD_DEFINITIONS(-D_GNU_SOURCE=1 -D_POSIX_C_SOURCE=200809L -D_XOPEN_SOURCE=700)
66     SET(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -D_GNU_SOURCE=1 -D_POSIX_C_SOURCE=200809L -D_XOPEN_SOURCE=700")
67 ENDIF()
69 # Set defines for large file support
70 CHECK_FILE_OFFSET_BITS()
71 IF(_FILE_OFFSET_BITS)
72     ADD_DEFINITIONS(-D_FILE_OFFSET_BITS=${_FILE_OFFSET_BITS})
73     SET(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -D_FILE_OFFSET_BITS=${_FILE_OFFSET_BITS}")
74 ENDIF()
75 ADD_DEFINITIONS(-D_LARGEFILE_SOURCE -D_LARGE_FILES)
76 SET(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -D_LARGEFILE_SOURCE -D_LARGE_FILES")
79 # QNX's gcc do not uses /usr/include and /usr/lib pathes by default
80 IF ("${CMAKE_C_PLATFORM_ID}" STREQUAL "QNX")
81     ADD_DEFINITIONS("-I/usr/include")
82     SET(EXTRA_LIBS ${EXTRA_LIBS} -L/usr/lib)
83 ENDIF()
85 IF(NOT LIBTYPE)
86     SET(LIBTYPE SHARED)
87 ENDIF()
89 SET(LIB_MAJOR_VERSION "1")
90 SET(LIB_MINOR_VERSION "16")
91 SET(LIB_REVISION "0")
92 SET(LIB_VERSION "${LIB_MAJOR_VERSION}.${LIB_MINOR_VERSION}.${LIB_REVISION}")
94 SET(EXPORT_DECL "")
95 SET(ALIGN_DECL "")
98 CHECK_TYPE_SIZE("long" SIZEOF_LONG)
99 CHECK_TYPE_SIZE("long long" SIZEOF_LONG_LONG)
102 CHECK_C_COMPILER_FLAG(-std=c99 HAVE_STD_C99)
103 IF(HAVE_STD_C99)
104     SET(CMAKE_C_FLAGS "-std=c99 ${CMAKE_C_FLAGS}")
105 ENDIF()
107 # MSVC may need workarounds for C99 restrict and inline
108 IF(MSVC)
109     # TODO: Once we truly require C99, these restrict and inline checks should go
110     # away.
111     CHECK_C_SOURCE_COMPILES("int *restrict foo;
112                              int main() {return 0;}" HAVE_RESTRICT)
113     IF(NOT HAVE_RESTRICT)
114         ADD_DEFINITIONS("-Drestrict=")
115         SET(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -Drestrict=")
116     ENDIF()
118     CHECK_C_SOURCE_COMPILES("inline void foo(void) { }
119                              int main() {return 0;}" HAVE_INLINE)
120     IF(NOT HAVE_INLINE)
121         CHECK_C_SOURCE_COMPILES("__inline void foo(void) { }
122                                  int main() {return 0;}" HAVE___INLINE)
123         IF(NOT HAVE___INLINE)
124             MESSAGE(FATAL_ERROR "No inline keyword found, please report!")
125         ENDIF()
127         ADD_DEFINITIONS(-Dinline=__inline)
128         SET(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -Dinline=__inline")
129     ENDIF()
130 ENDIF()
132 # Make sure we have C99-style inline semantics with GCC (4.3 or newer).
133 IF(CMAKE_COMPILER_IS_GNUCC)
134     SET(OLD_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}")
135     # Force no inlining for the next test.
136     SET(CMAKE_REQUIRED_FLAGS "${OLD_REQUIRED_FLAGS} -fno-inline")
138     CHECK_C_SOURCE_COMPILES("extern inline int foo() { return 0; }
139                              int main() {return foo();}" INLINE_IS_C99)
140     IF(NOT INLINE_IS_C99)
141         MESSAGE(FATAL_ERROR "Your compiler does not seem to have C99 inline semantics!
142                              Please update your compiler for better C99 compliance.")
143     ENDIF()
145     SET(CMAKE_REQUIRED_FLAGS "${OLD_REQUIRED_FLAGS}")
146 ENDIF()
148 # Check if we have C99 variable length arrays
149 CHECK_C_SOURCE_COMPILES(
150 "int main(int argc, char *argv[])
152      volatile int tmp[argc];
153      tmp[0] = argv[0][0];
154      return tmp[0];
155  }"
156 HAVE_C99_VLA)
158 # Check if we have C99 bool
159 CHECK_C_SOURCE_COMPILES(
160 "int main(int argc, char *argv[])
162      volatile _Bool ret;
163      ret = (argc > 1) ? 1 : 0;
164      return ret ? -1 : 0;
165  }"
166 HAVE_C99_BOOL)
168 # Check if we have C11 static_assert
169 CHECK_C_SOURCE_COMPILES(
170 "int main()
172      _Static_assert(sizeof(int) == sizeof(int), \"What\");
173      return 0;
174  }"
175 HAVE_C11_STATIC_ASSERT)
177 # Check if we have C11 alignas
178 CHECK_C_SOURCE_COMPILES(
179 "_Alignas(16) int foo;
180  int main()
182      return 0;
183  }"
184 HAVE_C11_ALIGNAS)
186 # Check if we have C11 _Atomic
187 CHECK_C_SOURCE_COMPILES(
188 "#include <stdatomic.h>
189  int _Atomic foo;
190  int main()
192      return atomic_load(&foo);
193  }"
194 HAVE_C11_ATOMIC)
196 # Add definitions, compiler switches, etc.
197 INCLUDE_DIRECTORIES("${OpenAL_SOURCE_DIR}/include" "${OpenAL_BINARY_DIR}")
198 IF(CMAKE_VERSION VERSION_LESS "2.8.8")
199     INCLUDE_DIRECTORIES("${OpenAL_SOURCE_DIR}/OpenAL32/Include" "${OpenAL_SOURCE_DIR}/Alc")
200     IF(WIN32 AND ALSOFT_NO_UID_DEFS)
201         ADD_DEFINITIONS("-DAL_NO_UID_DEFS")
202     ENDIF()
203 ENDIF()
205 IF(NOT CMAKE_BUILD_TYPE)
206     SET(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING
207         "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel."
208         FORCE)
209 ENDIF()
210 IF(NOT CMAKE_DEBUG_POSTFIX)
211     SET(CMAKE_DEBUG_POSTFIX "" CACHE STRING
212         "Library postfix for debug builds. Normally left blank."
213         FORCE)
214 ENDIF()
216 IF(MSVC)
217     ADD_DEFINITIONS(-D_CRT_SECURE_NO_WARNINGS)
218     ADD_DEFINITIONS(-D_CRT_NONSTDC_NO_DEPRECATE)
219     ADD_DEFINITIONS("/wd4098")
221     IF(NOT DXSDK_DIR)
222         STRING(REGEX REPLACE "\\\\" "/" DXSDK_DIR "$ENV{DXSDK_DIR}")
223     ELSE()
224         STRING(REGEX REPLACE "\\\\" "/" DXSDK_DIR "${DXSDK_DIR}")
225     ENDIF()
226     IF(DXSDK_DIR)
227         MESSAGE(STATUS "Using DirectX SDK directory: ${DXSDK_DIR}")
228     ENDIF()
230     OPTION(FORCE_STATIC_VCRT "Force /MT for static VC runtimes" OFF)
231     IF(FORCE_STATIC_VCRT)
232         FOREACH(flag_var
233                 CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE
234                 CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO)
235             IF(${flag_var} MATCHES "/MD")
236                 STRING(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}")
237             ENDIF()
238         ENDFOREACH(flag_var)
239     ENDIF()
240 ELSE()
241     ADD_DEFINITIONS(-Winline -Wall)
242     CHECK_C_COMPILER_FLAG(-Wextra HAVE_W_EXTRA)
243     IF(HAVE_W_EXTRA)
244         ADD_DEFINITIONS(-Wextra)
245     ENDIF()
247     IF(ALSOFT_WERROR)
248         ADD_DEFINITIONS(-Werror)
249     ENDIF()
251     # Force enable PIC if available. The static common library will be linked
252     # into the dynamic openal library, which requires all its code to be
253     # position-independent, and CMake doesn't automatically enable PIC for
254     # static library targets (Windows code is always position-independent).
255     CHECK_C_COMPILER_FLAG(-fPIC HAVE_FPIC_SWITCH)
256     IF(HAVE_FPIC_SWITCH AND NOT WIN32)
257         ADD_DEFINITIONS(-fPIC)
258     ENDIF()
260     # We want RelWithDebInfo to actually include debug stuff (define _DEBUG
261     # instead of NDEBUG)
262     FOREACH(flag_var  CMAKE_C_FLAGS_RELWITHDEBINFO CMAKE_CXX_FLAGS_RELWITHDEBINFO)
263         IF(${flag_var} MATCHES "-DNDEBUG")
264             STRING(REGEX REPLACE "-DNDEBUG" "-D_DEBUG" ${flag_var} "${${flag_var}}")
265         ENDIF()
266     ENDFOREACH()
268     CHECK_C_SOURCE_COMPILES("int foo() __attribute__((destructor));
269                              int main() {return 0;}" HAVE_GCC_DESTRUCTOR)
270 ENDIF()
272 # Set visibility/export options if available
273 IF(WIN32)
274     SET(EXPORT_DECL "__declspec(dllexport)")
275     IF(NOT MINGW)
276         SET(ALIGN_DECL "__declspec(align(x))")
277     ELSE()
278         SET(ALIGN_DECL "__declspec(aligned(x))")
279     ENDIF()
280 ELSE()
281     SET(OLD_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}")
282     # Yes GCC, really don't accept visibility modes you don't support
283     SET(CMAKE_REQUIRED_FLAGS "${OLD_REQUIRED_FLAGS} -Wattributes -Werror")
285     CHECK_C_SOURCE_COMPILES("int foo() __attribute__((visibility(\"protected\")));
286                              int main() {return 0;}" HAVE_GCC_PROTECTED_VISIBILITY)
287     IF(HAVE_GCC_PROTECTED_VISIBILITY)
288         SET(EXPORT_DECL "__attribute__((visibility(\"protected\")))")
289     ELSE()
290         CHECK_C_SOURCE_COMPILES("int foo() __attribute__((visibility(\"default\")));
291                                  int main() {return 0;}" HAVE_GCC_DEFAULT_VISIBILITY)
292         IF(HAVE_GCC_DEFAULT_VISIBILITY)
293             SET(EXPORT_DECL "__attribute__((visibility(\"default\")))")
294         ENDIF()
295     ENDIF()
297     IF(HAVE_GCC_PROTECTED_VISIBILITY OR HAVE_GCC_DEFAULT_VISIBILITY)
298         CHECK_C_COMPILER_FLAG(-fvisibility=hidden HAVE_VISIBILITY_HIDDEN_SWITCH)
299         IF(HAVE_VISIBILITY_HIDDEN_SWITCH)
300             ADD_DEFINITIONS(-fvisibility=hidden)
301         ENDIF()
302     ENDIF()
304     CHECK_C_SOURCE_COMPILES("int foo __attribute__((aligned(16)));
305                              int main() {return 0;}" HAVE_ATTRIBUTE_ALIGNED)
306     IF(HAVE_ATTRIBUTE_ALIGNED)
307         SET(ALIGN_DECL "__attribute__((aligned(x)))")
308     ENDIF()
310     SET(CMAKE_REQUIRED_FLAGS "${OLD_REQUIRED_FLAGS}")
311 ENDIF()
313 SET(SSE_SWITCH "")
314 SET(SSE2_SWITCH "")
315 SET(SSE4_1_SWITCH "")
316 IF(NOT MSVC)
317     CHECK_C_COMPILER_FLAG(-msse HAVE_MSSE_SWITCH)
318     IF(HAVE_MSSE_SWITCH)
319         SET(SSE_SWITCH "-msse")
320     ENDIF()
321     CHECK_C_COMPILER_FLAG(-msse2 HAVE_MSSE2_SWITCH)
322     IF(HAVE_MSSE2_SWITCH)
323         SET(SSE2_SWITCH "-msse2")
324     ENDIF()
325     CHECK_C_COMPILER_FLAG(-msse4.1 HAVE_MSSE4_1_SWITCH)
326     IF(HAVE_MSSE4_1_SWITCH)
327         SET(SSE4_1_SWITCH "-msse4.1")
328     ENDIF()
329 ENDIF()
331 CHECK_C_SOURCE_COMPILES("int foo(const char *str, ...) __attribute__((format(printf, 1, 2)));
332                          int main() {return 0;}" HAVE_GCC_FORMAT)
334 CHECK_INCLUDE_FILE(stdbool.h HAVE_STDBOOL_H)
335 CHECK_INCLUDE_FILE(stdalign.h HAVE_STDALIGN_H)
336 CHECK_INCLUDE_FILE(malloc.h HAVE_MALLOC_H)
337 CHECK_INCLUDE_FILE(ftw.h HAVE_FTW_H)
338 CHECK_INCLUDE_FILE(io.h HAVE_IO_H)
339 CHECK_INCLUDE_FILE(strings.h HAVE_STRINGS_H)
340 CHECK_INCLUDE_FILE(cpuid.h HAVE_CPUID_H)
341 CHECK_INCLUDE_FILE(intrin.h HAVE_INTRIN_H)
342 CHECK_INCLUDE_FILE(sys/sysconf.h HAVE_SYS_SYSCONF_H)
343 CHECK_INCLUDE_FILE(fenv.h HAVE_FENV_H)
344 CHECK_INCLUDE_FILE(float.h HAVE_FLOAT_H)
345 CHECK_INCLUDE_FILE(ieeefp.h HAVE_IEEEFP_H)
346 CHECK_INCLUDE_FILE(guiddef.h HAVE_GUIDDEF_H)
347 IF(NOT HAVE_GUIDDEF_H)
348     CHECK_INCLUDE_FILE(initguid.h HAVE_INITGUID_H)
349 ENDIF()
351 IF(HAVE_CPUID_H)
352     CHECK_C_SOURCE_COMPILES("#include <cpuid.h>
353         int main()
354         {
355             unsigned int eax, ebx, ecx, edx;
356             return __get_cpuid(0, eax, ebx, ecx, edx);
357         }" HAVE_GCC_GET_CPUID)
358 ENDIF()
360 IF(HAVE_INTRIN_H)
361     CHECK_C_SOURCE_COMPILES("#include <intrin.h>
362         int main()
363         {
364             int regs[4];
365             __cpuid(regs, 0);
366             return regs[0];
367         }" HAVE_CPUID_INTRINSIC)
368 ENDIF()
370 # Some systems need libm for some of the following math functions to work
371 CHECK_LIBRARY_EXISTS(m pow "" HAVE_LIBM)
372 IF(HAVE_LIBM)
373     SET(EXTRA_LIBS m ${EXTRA_LIBS})
374     SET(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} m)
375 ENDIF()
378 CHECK_SYMBOL_EXISTS(aligned_alloc    stdlib.h HAVE_ALIGNED_ALLOC)
379 CHECK_SYMBOL_EXISTS(posix_memalign   stdlib.h HAVE_POSIX_MEMALIGN)
380 CHECK_SYMBOL_EXISTS(_aligned_malloc  malloc.h HAVE__ALIGNED_MALLOC)
381 CHECK_SYMBOL_EXISTS(lrintf math.h HAVE_LRINTF)
382 IF(NOT HAVE_C99_VLA)
383     CHECK_SYMBOL_EXISTS(alloca malloc.h HAVE_ALLOCA)
384     IF(NOT HAVE_ALLOCA)
385         MESSAGE(FATAL_ERROR "No alloca function found, please report!")
386     ENDIF()
387 ENDIF()
389 IF(HAVE_FLOAT_H)
390     CHECK_SYMBOL_EXISTS(_controlfp float.h HAVE__CONTROLFP)
391     CHECK_SYMBOL_EXISTS(__control87_2 float.h HAVE___CONTROL87_2)
392 ENDIF()
393 IF(HAVE_FTW_H)
394     CHECK_SYMBOL_EXISTS(ftw ftw.h HAVE_FTW)
395 ENDIF()
396 IF(HAVE_IO_H)
397     CHECK_SYMBOL_EXISTS(_wfindfirst io.h HAVE__WFINDFIRST)
398 ENDIF()
400 CHECK_FUNCTION_EXISTS(strtof HAVE_STRTOF)
401 CHECK_FUNCTION_EXISTS(stat HAVE_STAT)
402 CHECK_FUNCTION_EXISTS(strcasecmp HAVE_STRCASECMP)
403 IF(NOT HAVE_STRCASECMP)
404     CHECK_FUNCTION_EXISTS(_stricmp HAVE__STRICMP)
405     IF(NOT HAVE__STRICMP)
406         MESSAGE(FATAL_ERROR "No case-insensitive compare function found, please report!")
407     ENDIF()
409     ADD_DEFINITIONS(-Dstrcasecmp=_stricmp)
410 ENDIF()
412 CHECK_FUNCTION_EXISTS(strncasecmp HAVE_STRNCASECMP)
413 IF(NOT HAVE_STRNCASECMP)
414     CHECK_FUNCTION_EXISTS(_strnicmp HAVE__STRNICMP)
415     IF(NOT HAVE__STRNICMP)
416         MESSAGE(FATAL_ERROR "No case-insensitive size-limitted compare function found, please report!")
417     ENDIF()
419     ADD_DEFINITIONS(-Dstrncasecmp=_strnicmp)
420 ENDIF()
422 CHECK_FUNCTION_EXISTS(snprintf HAVE_SNPRINTF)
423 IF(NOT HAVE_SNPRINTF)
424     CHECK_FUNCTION_EXISTS(_snprintf HAVE__SNPRINTF)
425     IF(NOT HAVE__SNPRINTF)
426         MESSAGE(FATAL_ERROR "No snprintf function found, please report!")
427     ENDIF()
429     ADD_DEFINITIONS(-Dsnprintf=_snprintf)
430 ENDIF()
432 CHECK_SYMBOL_EXISTS(isfinite math.h HAVE_ISFINITE)
433 IF(NOT HAVE_ISFINITE)
434     CHECK_FUNCTION_EXISTS(finite HAVE_FINITE)
435     IF(NOT HAVE_FINITE)
436         CHECK_FUNCTION_EXISTS(_finite HAVE__FINITE)
437         IF(NOT HAVE__FINITE)
438             MESSAGE(FATAL_ERROR "No isfinite function found, please report!")
439         ENDIF()
440         ADD_DEFINITIONS(-Disfinite=_finite)
441     ELSE()
442         ADD_DEFINITIONS(-Disfinite=finite)
443     ENDIF()
444 ENDIF()
446 CHECK_SYMBOL_EXISTS(isnan math.h HAVE_ISNAN)
447 IF(NOT HAVE_ISNAN)
448     CHECK_FUNCTION_EXISTS(_isnan HAVE__ISNAN)
449     IF(NOT HAVE__ISNAN)
450         MESSAGE(FATAL_ERROR "No isnan function found, please report!")
451     ENDIF()
453     ADD_DEFINITIONS(-Disnan=_isnan)
454 ENDIF()
457 # Check for the dlopen API (for dynamicly loading backend libs)
458 IF(ALSOFT_DLOPEN)
459     CHECK_INCLUDE_FILE(dlfcn.h HAVE_DLFCN_H)
460     IF(HAVE_DLFCN_H)
461         CHECK_LIBRARY_EXISTS(dl dlopen "" HAVE_LIBDL)
462         IF(HAVE_LIBDL)
463             SET(EXTRA_LIBS dl ${EXTRA_LIBS})
464         ENDIF()
465     ENDIF()
466 ENDIF()
468 # Check if we have Windows headers
469 CHECK_INCLUDE_FILE(windows.h HAVE_WINDOWS_H -D_WIN32_WINNT=0x0502)
470 IF(NOT HAVE_WINDOWS_H)
471     CHECK_FUNCTION_EXISTS(gettimeofday HAVE_GETTIMEOFDAY)
472     IF(NOT HAVE_GETTIMEOFDAY)
473         MESSAGE(FATAL_ERROR "No timing function found!")
474     ENDIF()
476     CHECK_FUNCTION_EXISTS(nanosleep HAVE_NANOSLEEP)
477     IF(NOT HAVE_NANOSLEEP)
478         MESSAGE(FATAL_ERROR "No sleep function found!")
479     ENDIF()
481     # We need pthreads outside of Windows
482     CHECK_INCLUDE_FILE(pthread.h HAVE_PTHREAD_H)
483     IF(NOT HAVE_PTHREAD_H)
484         MESSAGE(FATAL_ERROR "PThreads is required for non-Windows builds!")
485     ENDIF()
486     # Some systems need pthread_np.h to get recursive mutexes
487     CHECK_INCLUDE_FILES("pthread.h;pthread_np.h" HAVE_PTHREAD_NP_H)
489     CHECK_C_COMPILER_FLAG(-pthread HAVE_PTHREAD)
490     IF(HAVE_PTHREAD)
491         ADD_DEFINITIONS(-pthread)
492         SET(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -pthread")
493         SET(EXTRA_LIBS ${EXTRA_LIBS} -pthread)
494     ENDIF()
496     CHECK_LIBRARY_EXISTS(pthread pthread_create "" HAVE_LIBPTHREAD)
497     IF(HAVE_LIBPTHREAD)
498         SET(EXTRA_LIBS pthread ${EXTRA_LIBS})
499     ENDIF()
501     CHECK_SYMBOL_EXISTS(pthread_setschedparam pthread.h HAVE_PTHREAD_SETSCHEDPARAM)
503     CHECK_SYMBOL_EXISTS(pthread_setname_np pthread.h HAVE_PTHREAD_SETNAME_NP)
504     IF(NOT HAVE_PTHREAD_SETNAME_NP)
505         CHECK_SYMBOL_EXISTS(pthread_set_name_np pthread.h HAVE_PTHREAD_SET_NAME_NP)
506     ENDIF()
507     IF(HAVE_PTHREAD_NP_H)
508         CHECK_SYMBOL_EXISTS(pthread_mutexattr_setkind_np "pthread.h;pthread_np.h" HAVE_PTHREAD_MUTEXATTR_SETKIND_NP)
509     ENDIF()
511     CHECK_SYMBOL_EXISTS(pthread_mutex_timedlock pthread.h HAVE_PTHREAD_MUTEX_TIMEDLOCK)
513     CHECK_LIBRARY_EXISTS(rt clock_gettime "" HAVE_LIBRT)
514     IF(HAVE_LIBRT)
515         SET(EXTRA_LIBS rt ${EXTRA_LIBS})
516     ENDIF()
517 ENDIF()
519 # Check for a 64-bit type
520 CHECK_INCLUDE_FILE(stdint.h HAVE_STDINT_H)
521 IF(NOT HAVE_STDINT_H)
522     IF(HAVE_WINDOWS_H)
523         CHECK_C_SOURCE_COMPILES("#define _WIN32_WINNT 0x0502
524                                  #include <windows.h>
525                                  __int64 foo;
526                                  int main() {return 0;}" HAVE___INT64)
527     ENDIF()
528     IF(NOT HAVE___INT64)
529         IF(NOT SIZEOF_LONG MATCHES "8")
530             IF(NOT SIZEOF_LONG_LONG MATCHES "8")
531                 MESSAGE(FATAL_ERROR "No 64-bit types found, please report!")
532             ENDIF()
533         ENDIF()
534     ENDIF()
535 ENDIF()
538 SET(COMMON_OBJS  common/atomic.c
539                  common/rwlock.c
540                  common/threads.c
541                  common/uintmap.c
543 SET(OPENAL_OBJS  OpenAL32/alAuxEffectSlot.c
544                  OpenAL32/alBuffer.c
545                  OpenAL32/alEffect.c
546                  OpenAL32/alError.c
547                  OpenAL32/alExtension.c
548                  OpenAL32/alFilter.c
549                  OpenAL32/alFontsound.c
550                  OpenAL32/alListener.c
551                  OpenAL32/alMidi.c
552                  OpenAL32/alPreset.c
553                  OpenAL32/alSoundfont.c
554                  OpenAL32/alSource.c
555                  OpenAL32/alState.c
556                  OpenAL32/alThunk.c
557                  OpenAL32/sample_cvt.c
559 SET(ALC_OBJS  Alc/ALc.c
560               Alc/ALu.c
561               Alc/alcConfig.c
562               Alc/alcRing.c
563               Alc/bs2b.c
564               Alc/effects/autowah.c
565               Alc/effects/chorus.c
566               Alc/effects/compressor.c
567               Alc/effects/dedicated.c
568               Alc/effects/distortion.c
569               Alc/effects/echo.c
570               Alc/effects/equalizer.c
571               Alc/effects/flanger.c
572               Alc/effects/modulator.c
573               Alc/effects/null.c
574               Alc/effects/reverb.c
575               Alc/helpers.c
576               Alc/hrtf.c
577               Alc/panning.c
578               Alc/mixer.c
579               Alc/mixer_c.c
583 SET(CPU_EXTS "Default")
584 SET(HAVE_SSE        0)
585 SET(HAVE_SSE2       0)
586 SET(HAVE_SSE4_1     0)
587 SET(HAVE_NEON       0)
589 SET(HAVE_FLUIDSYNTH 0)
591 SET(HAVE_ALSA       0)
592 SET(HAVE_OSS        0)
593 SET(HAVE_SOLARIS    0)
594 SET(HAVE_SNDIO      0)
595 SET(HAVE_QSA        0)
596 SET(HAVE_DSOUND     0)
597 SET(HAVE_MMDEVAPI   0)
598 SET(HAVE_WINMM      0)
599 SET(HAVE_PORTAUDIO  0)
600 SET(HAVE_PULSEAUDIO 0)
601 SET(HAVE_COREAUDIO  0)
602 SET(HAVE_OPENSL     0)
603 SET(HAVE_WAVE       0)
605 # Check for SSE support
606 OPTION(ALSOFT_REQUIRE_SSE "Require SSE support" OFF)
607 CHECK_INCLUDE_FILE(xmmintrin.h HAVE_XMMINTRIN_H "${SSE_SWITCH}")
608 IF(HAVE_XMMINTRIN_H)
609     OPTION(ALSOFT_CPUEXT_SSE "Enable SSE support" ON)
610     IF(ALSOFT_CPUEXT_SSE)
611         IF(ALIGN_DECL OR HAVE_C11_ALIGNAS)
612             SET(HAVE_SSE 1)
613             SET(ALC_OBJS  ${ALC_OBJS} Alc/mixer_sse.c)
614             IF(SSE_SWITCH)
615                 SET_SOURCE_FILES_PROPERTIES(Alc/mixer_sse.c PROPERTIES
616                                             COMPILE_FLAGS "${SSE_SWITCH}")
617             ENDIF()
618             SET(CPU_EXTS "${CPU_EXTS}, SSE")
619         ENDIF()
620     ENDIF()
621 ENDIF()
622 IF(ALSOFT_REQUIRE_SSE AND NOT HAVE_SSE)
623     MESSAGE(FATAL_ERROR "Failed to enabled required SSE CPU extensions")
624 ENDIF()
626 OPTION(ALSOFT_REQUIRE_SSE2 "Require SSE2 support" OFF)
627 CHECK_INCLUDE_FILE(emmintrin.h HAVE_EMMINTRIN_H "${SSE2_SWITCH}")
628 IF(HAVE_EMMINTRIN_H)
629     OPTION(ALSOFT_CPUEXT_SSE2 "Enable SSE2 support" ON)
630     IF(HAVE_SSE AND ALSOFT_CPUEXT_SSE2)
631         IF(ALIGN_DECL OR HAVE_C11_ALIGNAS)
632             SET(HAVE_SSE2 1)
633             SET(ALC_OBJS  ${ALC_OBJS} Alc/mixer_sse2.c)
634             IF(SSE2_SWITCH)
635                 SET_SOURCE_FILES_PROPERTIES(Alc/mixer_sse2.c PROPERTIES
636                                             COMPILE_FLAGS "${SSE2_SWITCH}")
637             ENDIF()
638             SET(CPU_EXTS "${CPU_EXTS}, SSE2")
639         ENDIF()
640     ENDIF()
641 ENDIF()
642 IF(ALSOFT_REQUIRE_SSE2 AND NOT HAVE_SSE2)
643     MESSAGE(FATAL_ERROR "Failed to enable required SSE2 CPU extensions")
644 ENDIF()
646 OPTION(ALSOFT_REQUIRE_SSE4_1 "Require SSE4.1 support" OFF)
647 CHECK_INCLUDE_FILE(smmintrin.h HAVE_SMMINTRIN_H "${SSE4_1_SWITCH}")
648 IF(HAVE_SMMINTRIN_H)
649     OPTION(ALSOFT_CPUEXT_SSE4_1 "Enable SSE4.1 support" ON)
650     IF(HAVE_SSE2 AND ALSOFT_CPUEXT_SSE4_1)
651         IF(ALIGN_DECL OR HAVE_C11_ALIGNAS)
652             SET(HAVE_SSE4_1 1)
653             SET(ALC_OBJS  ${ALC_OBJS} Alc/mixer_sse41.c)
654             IF(SSE4_1_SWITCH)
655                 SET_SOURCE_FILES_PROPERTIES(Alc/mixer_sse41.c PROPERTIES
656                                             COMPILE_FLAGS "${SSE4_1_SWITCH}")
657             ENDIF()
658             SET(CPU_EXTS "${CPU_EXTS}, SSE4.1")
659         ENDIF()
660     ENDIF()
661 ENDIF()
662 IF(ALSOFT_REQUIRE_SSE4_1 AND NOT HAVE_SSE4_1)
663     MESSAGE(FATAL_ERROR "Failed to enable required SSE4.1 CPU extensions")
664 ENDIF()
666 # Check for ARM Neon support
667 OPTION(ALSOFT_REQUIRE_NEON "Require ARM Neon support" OFF)
668 CHECK_INCLUDE_FILE(arm_neon.h HAVE_ARM_NEON_H)
669 IF(HAVE_ARM_NEON_H)
670     OPTION(ALSOFT_CPUEXT_NEON "Enable ARM Neon support" ON)
671     IF(ALSOFT_CPUEXT_NEON)
672         SET(HAVE_NEON 1)
673         SET(ALC_OBJS  ${ALC_OBJS} Alc/mixer_neon.c)
674         SET(CPU_EXTS "${CPU_EXTS}, Neon")
675     ENDIF()
676 ENDIF()
677 IF(ALSOFT_REQUIRE_NEON AND NOT HAVE_NEON)
678     MESSAGE(FATAL_ERROR "Failed to enabled required ARM Neon CPU extensions")
679 ENDIF()
682 IF(WIN32 OR HAVE_DLFCN_H)
683     SET(IS_LINKED "")
684     MACRO(ADD_BACKEND_LIBS _LIBS)
685     ENDMACRO()
686 ELSE()
687     SET(IS_LINKED " (linked)")
688     MACRO(ADD_BACKEND_LIBS _LIBS)
689         SET(EXTRA_LIBS ${_LIBS} ${EXTRA_LIBS})
690     ENDMACRO()
691 ENDIF()
693 SET(ALC_OBJS  ${ALC_OBJS}
694               Alc/midi/base.c
695               Alc/midi/sf2load.c
696               Alc/midi/dummy.c
697               Alc/midi/fluidsynth.c
698               Alc/midi/soft.c
701 # Check for FluidSynth support
702 OPTION(ALSOFT_REQUIRE_FLUIDSYNTH "Require FluidSynth MIDI" OFF)
703 FIND_PACKAGE(FluidSynth)
704 IF(FLUIDSYNTH_FOUND)
705     OPTION(ALSOFT_MIDI_FLUIDSYNTH "Enable FluidSynth MIDI" ON)
706     IF(ALSOFT_MIDI_FLUIDSYNTH)
707         SET(HAVE_FLUIDSYNTH 1)
708         ADD_BACKEND_LIBS(${FLUIDSYNTH_LIBRARIES})
709         IF(CMAKE_VERSION VERSION_LESS "2.8.8")
710             INCLUDE_DIRECTORIES(${FLUIDSYNTH_INCLUDE_DIR})
711         ENDIF()
712     ENDIF()
713 ENDIF()
714 IF(ALSOFT_REQUIRE_FLUIDSYNTH AND NOT HAVE_FLUIDSYNTH)
715     MESSAGE(FATAL_ERROR "Failed to enabled required FluidSynth support")
716 ENDIF()
719 SET(BACKENDS "")
720 SET(ALC_OBJS  ${ALC_OBJS}
721               Alc/backends/base.c
722               # Default backends, always available
723               Alc/backends/loopback.c
724               Alc/backends/null.c
727 # Check ALSA backend
728 OPTION(ALSOFT_REQUIRE_ALSA "Require ALSA backend" OFF)
729 FIND_PACKAGE(ALSA)
730 IF(ALSA_FOUND)
731     OPTION(ALSOFT_BACKEND_ALSA "Enable ALSA backend" ON)
732     IF(ALSOFT_BACKEND_ALSA)
733         SET(HAVE_ALSA 1)
734         SET(BACKENDS  "${BACKENDS} ALSA${IS_LINKED},")
735         SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/alsa.c)
736         ADD_BACKEND_LIBS(${ALSA_LIBRARIES})
737         IF(CMAKE_VERSION VERSION_LESS "2.8.8")
738             INCLUDE_DIRECTORIES(${ALSA_INCLUDE_DIRS})
739         ENDIF()
740     ENDIF()
741 ENDIF()
742 IF(ALSOFT_REQUIRE_ALSA AND NOT HAVE_ALSA)
743     MESSAGE(FATAL_ERROR "Failed to enabled required ALSA backend")
744 ENDIF()
746 # Check OSS backend
747 OPTION(ALSOFT_REQUIRE_OSS "Require OSS backend" OFF)
748 FIND_PACKAGE(OSS)
749 IF(OSS_FOUND)
750     OPTION(ALSOFT_BACKEND_OSS "Enable OSS backend" ON)
751     IF(ALSOFT_BACKEND_OSS)
752         SET(HAVE_OSS 1)
753         SET(BACKENDS  "${BACKENDS} OSS,")
754         SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/oss.c)
755         IF(CMAKE_VERSION VERSION_LESS "2.8.8")
756             INCLUDE_DIRECTORIES(${OSS_INCLUDE_DIRS})
757         ENDIF()
758     ENDIF()
759 ENDIF()
760 IF(ALSOFT_REQUIRE_OSS AND NOT HAVE_OSS)
761     MESSAGE(FATAL_ERROR "Failed to enabled required OSS backend")
762 ENDIF()
764 # Check Solaris backend
765 OPTION(ALSOFT_REQUIRE_SOLARIS "Require Solaris backend" OFF)
766 FIND_PACKAGE(AudioIO)
767 IF(AUDIOIO_FOUND)
768     OPTION(ALSOFT_BACKEND_SOLARIS "Enable Solaris backend" ON)
769     IF(ALSOFT_BACKEND_SOLARIS)
770         SET(HAVE_SOLARIS 1)
771         SET(BACKENDS  "${BACKENDS} Solaris,")
772         SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/solaris.c)
773         IF(CMAKE_VERSION VERSION_LESS "2.8.8")
774             INCLUDE_DIRECTORIES(${AUDIOIO_INCLUDE_DIRS})
775         ENDIF()
776     ENDIF()
777 ENDIF()
778 IF(ALSOFT_REQUIRE_SOLARIS AND NOT HAVE_SOLARIS)
779     MESSAGE(FATAL_ERROR "Failed to enabled required Solaris backend")
780 ENDIF()
782 # Check SndIO backend
783 OPTION(ALSOFT_REQUIRE_SNDIO "Require SndIO backend" OFF)
784 FIND_PACKAGE(SoundIO)
785 IF(SOUNDIO_FOUND)
786     OPTION(ALSOFT_BACKEND_SNDIO "Enable SndIO backend" ON)
787     IF(ALSOFT_BACKEND_SNDIO)
788         SET(HAVE_SNDIO 1)
789         SET(BACKENDS  "${BACKENDS} SndIO (linked),")
790         SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/sndio.c)
791         SET(EXTRA_LIBS ${SOUNDIO_LIBRARIES} ${EXTRA_LIBS})
792         IF(CMAKE_VERSION VERSION_LESS "2.8.8")
793             INCLUDE_DIRECTORIES(${SOUNDIO_INCLUDE_DIRS})
794         ENDIF()
795     ENDIF()
796 ENDIF()
797 IF(ALSOFT_REQUIRE_SNDIO AND NOT HAVE_SNDIO)
798     MESSAGE(FATAL_ERROR "Failed to enabled required SndIO backend")
799 ENDIF()
801 # Check QSA backend
802 OPTION(ALSOFT_REQUIRE_QSA "Require QSA backend" OFF)
803 FIND_PACKAGE(QSA)
804 IF(QSA_FOUND)
805     OPTION(ALSOFT_BACKEND_QSA "Enable QSA backend" ON)
806     IF(ALSOFT_BACKEND_QSA)
807         SET(HAVE_QSA 1)
808         SET(BACKENDS  "${BACKENDS} QSA (linked),")
809         SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/qsa.c)
810         SET(EXTRA_LIBS ${QSA_LIBRARIES} ${EXTRA_LIBS})
811         IF(CMAKE_VERSION VERSION_LESS "2.8.8")
812             INCLUDE_DIRECTORIES(${QSA_INCLUDE_DIRS})
813         ENDIF()
814     ENDIF()
815 ENDIF()
816 IF(ALSOFT_REQUIRE_QSA AND NOT HAVE_QSA)
817     MESSAGE(FATAL_ERROR "Failed to enabled required QSA backend")
818 ENDIF()
820 # Check Windows-only backends
821 OPTION(ALSOFT_REQUIRE_WINMM "Require Windows Multimedia backend" OFF)
822 OPTION(ALSOFT_REQUIRE_DSOUND "Require DirectSound backend" OFF)
823 OPTION(ALSOFT_REQUIRE_MMDEVAPI "Require MMDevApi backend" OFF)
824 IF(HAVE_WINDOWS_H)
825     # Check MMSystem backend
826     CHECK_INCLUDE_FILES("windows.h;mmsystem.h" HAVE_MMSYSTEM_H -D_WIN32_WINNT=0x0502)
827     IF(HAVE_MMSYSTEM_H)
828         CHECK_SHARED_FUNCTION_EXISTS(waveOutOpen "windows.h;mmsystem.h" winmm "" HAVE_LIBWINMM)
829         IF(HAVE_LIBWINMM)
830             OPTION(ALSOFT_BACKEND_WINMM "Enable Windows Multimedia backend" ON)
831             IF(ALSOFT_BACKEND_WINMM)
832                 SET(HAVE_WINMM 1)
833                 SET(BACKENDS  "${BACKENDS} WinMM,")
834                 SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/winmm.c)
835                 SET(EXTRA_LIBS winmm ${EXTRA_LIBS})
836             ENDIF()
837         ENDIF()
838     ENDIF()
840     # Check DSound backend
841     FIND_PACKAGE(DSound)
842     IF(DSOUND_FOUND)
843         OPTION(ALSOFT_BACKEND_DSOUND "Enable DirectSound backend" ON)
844         IF(ALSOFT_BACKEND_DSOUND)
845             SET(HAVE_DSOUND 1)
846             SET(BACKENDS  "${BACKENDS} DirectSound${IS_LINKED},")
847             SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/dsound.c)
848             ADD_BACKEND_LIBS(${DSOUND_LIBRARIES})
849             IF(CMAKE_VERSION VERSION_LESS "2.8.8")
850                 INCLUDE_DIRECTORIES(${DSOUND_INCLUDE_DIRS})
851             ENDIF()
852         ENDIF()
853     ENDIF()
855     # Check for MMDevApi backend
856     CHECK_INCLUDE_FILE(mmdeviceapi.h HAVE_MMDEVICEAPI_H)
857     IF(HAVE_MMDEVICEAPI_H)
858         OPTION(ALSOFT_BACKEND_MMDEVAPI "Enable MMDevApi backend" ON)
859         IF(ALSOFT_BACKEND_MMDEVAPI)
860             SET(HAVE_MMDEVAPI 1)
861             SET(BACKENDS  "${BACKENDS} MMDevApi,")
862             SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/mmdevapi.c)
863         ENDIF()
864     ENDIF()
865 ENDIF()
866 IF(ALSOFT_REQUIRE_WINMM AND NOT HAVE_WINMM)
867     MESSAGE(FATAL_ERROR "Failed to enabled required WinMM backend")
868 ENDIF()
869 IF(ALSOFT_REQUIRE_DSOUND AND NOT HAVE_DSOUND)
870     MESSAGE(FATAL_ERROR "Failed to enabled required DSound backend")
871 ENDIF()
872 IF(ALSOFT_REQUIRE_MMDEVAPI AND NOT HAVE_MMDEVAPI)
873     MESSAGE(FATAL_ERROR "Failed to enabled required MMDevApi backend")
874 ENDIF()
876 # Check PortAudio backend
877 OPTION(ALSOFT_REQUIRE_PORTAUDIO "Require PortAudio backend" OFF)
878 FIND_PACKAGE(PortAudio)
879 IF(PORTAUDIO_FOUND)
880     OPTION(ALSOFT_BACKEND_PORTAUDIO "Enable PortAudio backend" ON)
881     IF(ALSOFT_BACKEND_PORTAUDIO)
882         SET(HAVE_PORTAUDIO 1)
883         SET(BACKENDS  "${BACKENDS} PortAudio${IS_LINKED},")
884         SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/portaudio.c)
885         ADD_BACKEND_LIBS(${PORTAUDIO_LIBRARIES})
886         IF(CMAKE_VERSION VERSION_LESS "2.8.8")
887             INCLUDE_DIRECTORIES(${PORTAUDIO_INCLUDE_DIRS})
888         ENDIF()
889     ENDIF()
890 ENDIF()
891 IF(ALSOFT_REQUIRE_PORTAUDIO AND NOT HAVE_PORTAUDIO)
892     MESSAGE(FATAL_ERROR "Failed to enabled required PortAudio backend")
893 ENDIF()
895 # Check PulseAudio backend
896 OPTION(ALSOFT_REQUIRE_PULSEAUDIO "Require PulseAudio backend" OFF)
897 FIND_PACKAGE(PulseAudio)
898 IF(PULSEAUDIO_FOUND)
899     OPTION(ALSOFT_BACKEND_PULSEAUDIO "Enable PulseAudio backend" ON)
900     IF(ALSOFT_BACKEND_PULSEAUDIO)
901         SET(HAVE_PULSEAUDIO 1)
902         SET(BACKENDS  "${BACKENDS} PulseAudio${IS_LINKED},")
903         SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/pulseaudio.c)
904         ADD_BACKEND_LIBS(${PULSEAUDIO_LIBRARIES})
905         IF(CMAKE_VERSION VERSION_LESS "2.8.8")
906             INCLUDE_DIRECTORIES(${PULSEAUDIO_INCLUDE_DIRS})
907         ENDIF()
908     ENDIF()
909 ENDIF()
910 IF(ALSOFT_REQUIRE_PULSEAUDIO AND NOT HAVE_PULSEAUDIO)
911     MESSAGE(FATAL_ERROR "Failed to enabled required PulseAudio backend")
912 ENDIF()
914 # Check CoreAudio backend
915 OPTION(ALSOFT_REQUIRE_COREAUDIO "Require CoreAudio backend" OFF)
916 FIND_LIBRARY(COREAUDIO_FRAMEWORK
917              NAMES CoreAudio
918              PATHS /System/Library/Frameworks
920 IF(COREAUDIO_FRAMEWORK)
921     OPTION(ALSOFT_BACKEND_COREAUDIO "Enable CoreAudio backend" ON)
922     IF(ALSOFT_BACKEND_COREAUDIO)
923         SET(HAVE_COREAUDIO 1)
924         SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/coreaudio.c)
925         SET(BACKENDS  "${BACKENDS} CoreAudio,")
926         SET(EXTRA_LIBS ${COREAUDIO_FRAMEWORK} ${EXTRA_LIBS})
927         SET(EXTRA_LIBS /System/Library/Frameworks/AudioUnit.framework ${EXTRA_LIBS})
928         SET(EXTRA_LIBS /System/Library/Frameworks/ApplicationServices.framework ${EXTRA_LIBS})
930         # Some versions of OSX may need the AudioToolbox framework. Add it if
931         # it's found.
932         FIND_LIBRARY(AUDIOTOOLBOX_LIBRARY
933                      NAMES AudioToolbox
934                      PATHS ~/Library/Frameworks
935                            /Library/Frameworks
936                            /System/Library/Frameworks
937                     )
938         IF(AUDIOTOOLBOX_LIBRARY)
939             SET(EXTRA_LIBS ${AUDIOTOOLBOX_LIBRARY} ${EXTRA_LIBS})
940         ENDIF()
941     ENDIF()
942 ENDIF()
943 IF(ALSOFT_REQUIRE_COREAUDIO AND NOT HAVE_COREAUDIO)
944     MESSAGE(FATAL_ERROR "Failed to enabled required CoreAudio backend")
945 ENDIF()
947 # Check for OpenSL (Android) backend
948 OPTION(ALSOFT_REQUIRE_OPENSL "Require OpenSL backend" OFF)
949 CHECK_INCLUDE_FILES("SLES/OpenSLES.h;SLES/OpenSLES_Android.h" HAVE_SLES_OPENSLES_ANDROID_H)
950 IF(HAVE_SLES_OPENSLES_ANDROID_H)
951     CHECK_SHARED_FUNCTION_EXISTS(slCreateEngine "SLES/OpenSLES.h" OpenSLES "" HAVE_LIBOPENSLES)
952     IF(HAVE_LIBOPENSLES)
953         OPTION(ALSOFT_BACKEND_OPENSL "Enable OpenSL backend" ON)
954         IF(ALSOFT_BACKEND_OPENSL)
955             SET(HAVE_OPENSL 1)
956             SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/opensl.c)
957             SET(BACKENDS  "${BACKENDS} OpenSL,")
958             SET(EXTRA_LIBS OpenSLES ${EXTRA_LIBS})
959         ENDIF()
960     ENDIF()
961 ENDIF()
962 IF(ALSOFT_REQUIRE_OPENSL AND NOT HAVE_OPENSL)
963     MESSAGE(FATAL_ERROR "Failed to enabled required OpenSL backend")
964 ENDIF()
966 # Optionally enable the Wave Writer backend
967 OPTION(ALSOFT_BACKEND_WAVE "Enable Wave Writer backend" ON)
968 IF(ALSOFT_BACKEND_WAVE)
969     SET(HAVE_WAVE 1)
970     SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/wave.c)
971     SET(BACKENDS  "${BACKENDS} WaveFile,")
972 ENDIF()
974 # This is always available
975 SET(BACKENDS  "${BACKENDS} Null")
977 IF(ALSOFT_UTILS AND NOT ALSOFT_NO_CONFIG_UTIL)
978     add_subdirectory(utils/alsoft-config)
979 ENDIF()
980 IF(ALSOFT_EXAMPLES)
981     FIND_PACKAGE(SDL2)
982     IF(SDL2_FOUND)
983         FIND_PACKAGE(SDL_sound)
984         IF(SDL_SOUND_FOUND AND CMAKE_VERSION VERSION_LESS "2.8.8")
985             INCLUDE_DIRECTORIES(${SDL2_INCLUDE_DIR} ${SDL_SOUND_INCLUDE_DIR})
986         ENDIF()
987         FIND_PACKAGE(FFmpeg COMPONENTS AVFORMAT AVCODEC AVUTIL SWSCALE SWRESAMPLE)
988         IF(FFMPEG_FOUND AND CMAKE_VERSION VERSION_LESS "2.8.8")
989             INCLUDE_DIRECTORIES(${FFMPEG_INCLUDE_DIRS})
990         ENDIF()
991     ENDIF()
992 ENDIF()
994 IF(LIBTYPE STREQUAL "STATIC")
995     ADD_DEFINITIONS(-DAL_LIBTYPE_STATIC)
996     SET(PKG_CONFIG_CFLAGS -DAL_LIBTYPE_STATIC ${PKG_CONFIG_CFLAGS})
997 ENDIF()
999 # Needed for openal.pc.in
1000 SET(prefix ${CMAKE_INSTALL_PREFIX})
1001 SET(exec_prefix "\${prefix}")
1002 SET(libdir "\${exec_prefix}/lib${LIB_SUFFIX}")
1003 SET(bindir "\${exec_prefix}/bin")
1004 SET(includedir "\${prefix}/include")
1005 SET(PACKAGE_VERSION "${LIB_VERSION}")
1007 # End configuration
1008 CONFIGURE_FILE(
1009     "${OpenAL_SOURCE_DIR}/config.h.in"
1010     "${OpenAL_BINARY_DIR}/config.h")
1011 CONFIGURE_FILE(
1012     "${OpenAL_SOURCE_DIR}/openal.pc.in"
1013     "${OpenAL_BINARY_DIR}/openal.pc"
1014     @ONLY)
1016 # Build a common library with reusable helpers
1017 ADD_LIBRARY(common STATIC ${COMMON_OBJS})
1019 # Build main library
1020 ADD_LIBRARY(${LIBNAME} ${LIBTYPE} ${OPENAL_OBJS} ${ALC_OBJS})
1021 SET_PROPERTY(TARGET ${LIBNAME} APPEND PROPERTY COMPILE_DEFINITIONS AL_BUILD_LIBRARY AL_ALEXT_PROTOTYPES)
1022 IF(WIN32 AND ALSOFT_NO_UID_DEFS)
1023     SET_PROPERTY(TARGET ${LIBNAME} APPEND PROPERTY COMPILE_DEFINITIONS AL_NO_UID_DEFS)
1024 ENDIF()
1025 SET_PROPERTY(TARGET ${LIBNAME} APPEND PROPERTY INCLUDE_DIRECTORIES "${OpenAL_SOURCE_DIR}/OpenAL32/Include" "${OpenAL_SOURCE_DIR}/Alc")
1026 IF(FLUIDSYNTH_FOUND)
1027     SET_PROPERTY(TARGET ${LIBNAME} APPEND PROPERTY INCLUDE_DIRECTORIES ${FLUIDSYNTH_INCLUDE_DIR})
1028 ENDIF()
1029 IF(HAVE_ALSA)
1030     SET_PROPERTY(TARGET ${LIBNAME} APPEND PROPERTY INCLUDE_DIRECTORIES ${ALSA_INCLUDE_DIRS})
1031 ENDIF()
1032 IF(HAVE_OSS)
1033     SET_PROPERTY(TARGET ${LIBNAME} APPEND PROPERTY INCLUDE_DIRECTORIES ${OSS_INCLUDE_DIRS})
1034 ENDIF()
1035 IF(HAVE_SOLARIS)
1036     SET_PROPERTY(TARGET ${LIBNAME} APPEND PROPERTY INCLUDE_DIRECTORIES ${AUDIOIO_INCLUDE_DIRS})
1037 ENDIF()
1038 IF(HAVE_SNDIO)
1039     SET_PROPERTY(TARGET ${LIBNAME} APPEND PROPERTY INCLUDE_DIRECTORIES ${SOUNDIO_INCLUDE_DIRS})
1040 ENDIF()
1041 IF(HAVE_QSA)
1042     SET_PROPERTY(TARGET ${LIBNAME} APPEND PROPERTY INCLUDE_DIRECTORIES ${QSA_INCLUDE_DIRS})
1043 ENDIF()
1044 IF(HAVE_DSOUND)
1045     SET_PROPERTY(TARGET ${LIBNAME} APPEND PROPERTY INCLUDE_DIRECTORIES ${DSOUND_INCLUDE_DIRS})
1046 ENDIF()
1047 IF(HAVE_PORTAUDIO)
1048     SET_PROPERTY(TARGET ${LIBNAME} APPEND PROPERTY INCLUDE_DIRECTORIES ${PORTAUDIO_INCLUDE_DIRS})
1049 ENDIF()
1050 IF(HAVE_PULSEAUDIO)
1051     SET_PROPERTY(TARGET ${LIBNAME} APPEND PROPERTY INCLUDE_DIRECTORIES ${PULSEAUDIO_INCLUDE_DIRS})
1052 ENDIF()
1053 SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES VERSION ${LIB_VERSION}
1054                                             SOVERSION ${LIB_MAJOR_VERSION})
1055 IF(WIN32 AND NOT LIBTYPE STREQUAL "STATIC")
1056     SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES PREFIX "")
1058     IF(MINGW AND ALSOFT_BUILD_IMPORT_LIB)
1059         FIND_PROGRAM(SED_EXECUTABLE NAMES sed DOC "sed executable")
1060         FIND_PROGRAM(DLLTOOL_EXECUTABLE NAMES "${DLLTOOL}" DOC "dlltool executable")
1061         IF(NOT SED_EXECUTABLE OR NOT DLLTOOL_EXECUTABLE)
1062             MESSAGE(STATUS "")
1063             IF(NOT SED_EXECUTABLE)
1064                 MESSAGE(STATUS "WARNING: Cannot find sed, disabling .def/.lib generation")
1065             ENDIF()
1066             IF(NOT DLLTOOL_EXECUTABLE)
1067                 MESSAGE(STATUS "WARNING: Cannot find dlltool, disabling .def/.lib generation")
1068             ENDIF()
1069         ELSE()
1070             SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES LINK_FLAGS "-Wl,--output-def,${LIBNAME}.def")
1071             ADD_CUSTOM_COMMAND(TARGET ${LIBNAME} POST_BUILD
1072                 COMMAND "${SED_EXECUTABLE}" -i -e "s/ @[^ ]*//" ${LIBNAME}.def
1073                 COMMAND "${DLLTOOL_EXECUTABLE}" -d ${LIBNAME}.def -l ${LIBNAME}.lib -D ${LIBNAME}.dll
1074                 COMMENT "Stripping ordinals from ${LIBNAME}.def and generating ${LIBNAME}.lib..."
1075                 VERBATIM
1076             )
1077         ENDIF()
1078     ENDIF()
1079 ENDIF()
1081 TARGET_LINK_LIBRARIES(${LIBNAME} common ${EXTRA_LIBS})
1083 # Add an install target here
1084 INSTALL(TARGETS ${LIBNAME}
1085         RUNTIME DESTINATION bin
1086         LIBRARY DESTINATION "lib${LIB_SUFFIX}"
1087         ARCHIVE DESTINATION "lib${LIB_SUFFIX}"
1089 INSTALL(FILES include/AL/al.h
1090               include/AL/alc.h
1091               include/AL/alext.h
1092               include/AL/efx.h
1093               include/AL/efx-creative.h
1094               include/AL/efx-presets.h
1095         DESTINATION include/AL
1097 INSTALL(FILES "${OpenAL_BINARY_DIR}/openal.pc"
1098         DESTINATION "lib${LIB_SUFFIX}/pkgconfig")
1101 MESSAGE(STATUS "")
1102 MESSAGE(STATUS "Building OpenAL with support for the following backends:")
1103 MESSAGE(STATUS "    ${BACKENDS}")
1104 MESSAGE(STATUS "")
1105 MESSAGE(STATUS "Building with support for CPU extensions:")
1106 MESSAGE(STATUS "    ${CPU_EXTS}")
1107 MESSAGE(STATUS "")
1108 IF(HAVE_FLUIDSYNTH)
1109     MESSAGE(STATUS "FluidSynth support for ALC_SOFT_midi_interface enabled")
1110     MESSAGE(STATUS "")
1111 ENDIF()
1113 IF(WIN32)
1114     IF(NOT HAVE_DSOUND)
1115         MESSAGE(STATUS "WARNING: Building the Windows version without DirectSound output")
1116         MESSAGE(STATUS "         This is probably NOT what you want!")
1117         MESSAGE(STATUS "")
1118     ENDIF()
1119 ENDIF()
1121 # Install alsoft.conf configuration file
1122 IF(ALSOFT_CONFIG)
1123     INSTALL(FILES alsoftrc.sample
1124             DESTINATION share/openal
1125     )
1126     MESSAGE(STATUS "Installing sample configuration")
1127     MESSAGE(STATUS "")
1128 ENDIF()
1130 # Install HRTF definitions
1131 IF(ALSOFT_HRTF_DEFS)
1132     INSTALL(FILES hrtf/default-44100.mhr
1133                   hrtf/default-48000.mhr
1134             DESTINATION share/openal/hrtf
1135     )
1136     MESSAGE(STATUS "Installing HRTF definitions")
1137     MESSAGE(STATUS "")
1138 ENDIF()
1140 IF(ALSOFT_UTILS)
1141     ADD_EXECUTABLE(openal-info utils/openal-info.c)
1142     TARGET_LINK_LIBRARIES(openal-info ${LIBNAME})
1144     ADD_EXECUTABLE(makehrtf utils/makehrtf.c)
1145     IF(HAVE_LIBM)
1146         TARGET_LINK_LIBRARIES(makehrtf m)
1147     ENDIF()
1149     INSTALL(TARGETS openal-info makehrtf
1150             RUNTIME DESTINATION bin
1151             LIBRARY DESTINATION "lib${LIB_SUFFIX}"
1152             ARCHIVE DESTINATION "lib${LIB_SUFFIX}"
1153     )
1155     MESSAGE(STATUS "Building utility programs")
1156     IF(TARGET alsoft-config)
1157         MESSAGE(STATUS "Building configuration program")
1158     ENDIF()
1159     MESSAGE(STATUS "")
1160 ENDIF()
1162 IF(ALSOFT_EXAMPLES)
1163     IF(SDL2_FOUND AND SDL_SOUND_FOUND)
1164         ADD_LIBRARY(ex-common STATIC examples/common/alhelpers.c
1165                                      examples/common/sdl_sound.c)
1166         SET_PROPERTY(TARGET ex-common APPEND PROPERTY INCLUDE_DIRECTORIES ${SDL2_INCLUDE_DIR}
1167                                                                           ${SDL_SOUND_INCLUDE_DIR})
1169         ADD_EXECUTABLE(alstream examples/alstream.c)
1170         TARGET_LINK_LIBRARIES(alstream ex-common ${SDL_SOUND_LIBRARIES} ${SDL2_LIBRARY} ${LIBNAME})
1171         SET_PROPERTY(TARGET alstream APPEND PROPERTY INCLUDE_DIRECTORIES ${SDL2_INCLUDE_DIR}
1172                                                                          ${SDL_SOUND_INCLUDE_DIR})
1174         ADD_EXECUTABLE(alreverb examples/alreverb.c)
1175         TARGET_LINK_LIBRARIES(alreverb ex-common ${SDL_SOUND_LIBRARIES} ${SDL2_LIBRARY} ${LIBNAME})
1176         SET_PROPERTY(TARGET alreverb APPEND PROPERTY INCLUDE_DIRECTORIES ${SDL2_INCLUDE_DIR}
1177                                                                          ${SDL_SOUND_INCLUDE_DIR})
1179         ADD_EXECUTABLE(allatency examples/allatency.c)
1180         TARGET_LINK_LIBRARIES(allatency ex-common ${SDL_SOUND_LIBRARIES} ${SDL2_LIBRARY} ${LIBNAME})
1181         SET_PROPERTY(TARGET allatency APPEND PROPERTY INCLUDE_DIRECTORIES ${SDL2_INCLUDE_DIR}
1182                                                                           ${SDL_SOUND_INCLUDE_DIR})
1184         ADD_EXECUTABLE(alloopback examples/alloopback.c)
1185         TARGET_LINK_LIBRARIES(alloopback ex-common ${SDL_SOUND_LIBRARIES} ${SDL2_LIBRARY} ${LIBNAME})
1186         SET_PROPERTY(TARGET alloopback APPEND PROPERTY INCLUDE_DIRECTORIES ${SDL2_INCLUDE_DIR}
1187                                                                            ${SDL_SOUND_INCLUDE_DIR})
1189         INSTALL(TARGETS alstream alreverb allatency alloopback
1190                 RUNTIME DESTINATION bin
1191                 LIBRARY DESTINATION "lib${LIB_SUFFIX}"
1192                 ARCHIVE DESTINATION "lib${LIB_SUFFIX}"
1193         )
1195         SET(FFVER_OK FALSE)
1196         IF(FFMPEG_FOUND)
1197             SET(FFVER_OK TRUE)
1198             IF(AVFORMAT_VERSION VERSION_LESS "55.33.100")
1199                 MESSAGE(STATUS "libavformat is too old! (${AVFORMAT_VERSION}, wanted 55.33.100)")
1200                 SET(FFVER_OK FALSE)
1201             ENDIF()
1202             IF(AVCODEC_VERSION VERSION_LESS "55.52.102")
1203                 MESSAGE(STATUS "libavcodec is too old! (${AVCODEC_VERSION}, wanted 55.52.102)")
1204                 SET(FFVER_OK FALSE)
1205             ENDIF()
1206             IF(AVUTIL_VERSION VERSION_LESS "52.66.100")
1207                 MESSAGE(STATUS "libavutil is too old! (${AVUTIL_VERSION}, wanted 52.66.100)")
1208                 SET(FFVER_OK FALSE)
1209             ENDIF()
1210             IF(SWSCALE_VERSION VERSION_LESS "2.5.102")
1211                 MESSAGE(STATUS "libswscale is too old! (${SWSCALE_VERSION}, wanted 2.5.102)")
1212                 SET(FFVER_OK FALSE)
1213             ENDIF()
1214             IF(SWRESAMPLE_VERSION VERSION_LESS "0.18.100")
1215                 MESSAGE(STATUS "libswresample is too old! (${SWRESAMPLE_VERSION}, wanted 0.18.100)")
1216                 SET(FFVER_OK FALSE)
1217             ENDIF()
1218         ENDIF()
1219         IF(FFVER_OK AND NOT MSVC)
1220             ADD_EXECUTABLE(alffplay examples/alffplay.c)
1221             TARGET_LINK_LIBRARIES(alffplay common ex-common ${SDL2_LIBRARY} ${LIBNAME} ${FFMPEG_LIBRARIES})
1222             SET_PROPERTY(TARGET alffplay APPEND PROPERTY INCLUDE_DIRECTORIES ${SDL2_INCLUDE_DIR}
1223                                                                              ${FFMPEG_INCLUDE_DIRS})
1225             INSTALL(TARGETS alffplay
1226                     RUNTIME DESTINATION bin
1227                     LIBRARY DESTINATION "lib${LIB_SUFFIX}"
1228                     ARCHIVE DESTINATION "lib${LIB_SUFFIX}"
1229             )
1230             MESSAGE(STATUS "Building SDL and FFmpeg example programs")
1231         ELSE()
1232             MESSAGE(STATUS "Building SDL example programs")
1233         ENDIF()
1234         MESSAGE(STATUS "")
1235     ENDIF()
1236 ENDIF()