Rename althread_key_ wrappers to altss_ and move it to threads.h/c
[openal-soft.git] / CMakeLists.txt
blob827565312bc563fdbfae136ec57fa74086852b44
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)
25 SET(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS TRUE)
28 OPTION(ALSOFT_CPUEXT_SSE  "Check for SSE/SSE2 support" ON)
29 OPTION(ALSOFT_CPUEXT_NEON "Check for ARM Neon support" ON)
31 OPTION(ALSOFT_REQUIRE_SSE  "Require SSE/SSE2 support" OFF)
32 OPTION(ALSOFT_REQUIRE_NEON "Require ARM Neon support" OFF)
34 IF(WIN32)
35     # This option is mainly for static linking OpenAL Soft into another project
36     # that already defines the IDs. It is up to that project to ensure all
37     # required IDs are defined.
38     OPTION(ALSOFT_NO_UID_DEFS "Do not define GUIDs, IIDs, CLSIDs, or PropertyKeys" OFF)
39 ENDIF()
42 OPTION(ALSOFT_BACKEND_ALSA    "Check for ALSA backend"                ON)
43 OPTION(ALSOFT_BACKEND_OSS     "Check for OSS backend"                 ON)
44 OPTION(ALSOFT_BACKEND_SOLARIS "Check for Solaris backend"             ON)
45 OPTION(ALSOFT_BACKEND_SNDIO   "Check for SndIO backend"               ON)
46 OPTION(ALSOFT_BACKEND_QSA     "Check for QSA backend"                 ON)
47 OPTION(ALSOFT_BACKEND_MMDEVAPI "Check for MMDevApi backend"           ON)
48 OPTION(ALSOFT_BACKEND_DSOUND   "Check for DirectSound backend"        ON)
49 OPTION(ALSOFT_BACKEND_WINMM    "Check for Windows Multimedia backend" ON)
50 OPTION(ALSOFT_BACKEND_PORTAUDIO  "Check for PortAudio backend"        ON)
51 OPTION(ALSOFT_BACKEND_PULSEAUDIO "Check for PulseAudio backend"       ON)
52 OPTION(ALSOFT_BACKEND_COREAUDIO  "Check for CoreAudio backend"        ON)
53 OPTION(ALSOFT_BACKEND_OPENSL     "Check for OpenSL backend"           ON)
54 OPTION(ALSOFT_BACKEND_WAVE "Enable Wave Writer backend"               ON)
56 OPTION(ALSOFT_MIDI_FLUIDSYNTH "Check for FluidSynth MIDI"             ON)
58 OPTION(ALSOFT_REQUIRE_ALSA       "Require ALSA backend"               OFF)
59 OPTION(ALSOFT_REQUIRE_OSS        "Require OSS backend"                OFF)
60 OPTION(ALSOFT_REQUIRE_SOLARIS    "Require Solaris backend"            OFF)
61 OPTION(ALSOFT_REQUIRE_SNDIO      "Require SndIO backend"              OFF)
62 OPTION(ALSOFT_REQUIRE_QSA        "Require QSA backend"                OFF)
63 OPTION(ALSOFT_REQUIRE_MMDEVAPI   "Require MMDevApi"                   OFF)
64 OPTION(ALSOFT_REQUIRE_DSOUND     "Require DirectSound backend"        OFF)
65 OPTION(ALSOFT_REQUIRE_WINMM      "Require Windows Multimedia backend" OFF)
66 OPTION(ALSOFT_REQUIRE_PORTAUDIO  "Require PortAudio backend"          OFF)
67 OPTION(ALSOFT_REQUIRE_PULSEAUDIO "Require PulseAudio backend"         OFF)
68 OPTION(ALSOFT_REQUIRE_COREAUDIO  "Require CoreAudio backend"          OFF)
69 OPTION(ALSOFT_REQUIRE_OPENSL     "Require OpenSL backend"             OFF)
71 OPTION(ALSOFT_REQUIRE_FLUIDSYNTH "Require FluidSynth MIDI"            OFF)
73 OPTION(ALSOFT_DLOPEN  "Check for the dlopen API for loading optional libs"  ON)
75 OPTION(ALSOFT_WERROR  "Treat compile warnings as errors"      OFF)
77 OPTION(ALSOFT_UTILS          "Build and install utility programs"         ON)
78 OPTION(ALSOFT_NO_CONFIG_UTIL "Disable building the alsoft-config utility" OFF)
80 OPTION(ALSOFT_EXAMPLES  "Build and install example programs"  ON)
82 OPTION(ALSOFT_CONFIG "Install alsoft.conf sample configuration file" ON)
83 OPTION(ALSOFT_HRTF_DEFS "Install HRTF definition files" ON)
86 IF(WIN32)
87     SET(LIBNAME OpenAL32)
88     ADD_DEFINITIONS("-D_WIN32 -D_WIN32_WINNT=0x0502")
89 ELSE()
90     SET(LIBNAME openal)
91 ENDIF()
93 # QNX's gcc do not uses /usr/include and /usr/lib pathes by default
94 IF ("${CMAKE_C_PLATFORM_ID}" STREQUAL "QNX")
95     ADD_DEFINITIONS("-I/usr/include")
96     SET(EXTRA_LIBS ${EXTRA_LIBS} -L/usr/lib)
97 ENDIF()
99 IF(NOT LIBTYPE)
100     SET(LIBTYPE SHARED)
101 ENDIF()
103 SET(LIB_MAJOR_VERSION "1")
104 SET(LIB_MINOR_VERSION "15")
105 SET(LIB_REVISION "1")
106 SET(LIB_VERSION "${LIB_MAJOR_VERSION}.${LIB_MINOR_VERSION}.${LIB_REVISION}")
108 SET(EXPORT_DECL "")
109 SET(ALIGN_DECL "")
112 CHECK_TYPE_SIZE("long" SIZEOF_LONG)
113 CHECK_TYPE_SIZE("long long" SIZEOF_LONG_LONG)
116 CHECK_C_COMPILER_FLAG(-std=c99 HAVE_STD_C99)
117 IF(HAVE_STD_C99)
118     SET(CMAKE_C_FLAGS "-std=c99 ${CMAKE_C_FLAGS}")
119 ENDIF()
121 # MSVC may need workarounds for C99 restrict and inline
122 IF(MSVC)
123     # TODO: Once we truly require C99, these restrict and inline checks should go
124     # away.
125     CHECK_C_SOURCE_COMPILES("int *restrict foo;
126                              int main() {return 0;}" HAVE_RESTRICT)
127     IF(NOT HAVE_RESTRICT)
128         ADD_DEFINITIONS("-Drestrict=")
129         SET(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -Drestrict=")
130     ENDIF()
132     CHECK_C_SOURCE_COMPILES("inline void foo(void) { }
133                              int main() {return 0;}" HAVE_INLINE)
134     IF(NOT HAVE_INLINE)
135         CHECK_C_SOURCE_COMPILES("__inline void foo(void) { }
136                                  int main() {return 0;}" HAVE___INLINE)
137         IF(NOT HAVE___INLINE)
138             MESSAGE(FATAL_ERROR "No inline keyword found, please report!")
139         ENDIF()
141         ADD_DEFINITIONS(-Dinline=__inline)
142         SET(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -Dinline=__inline")
143     ENDIF()
144 ENDIF()
146 # Make sure we have C99-style inline semantics with GCC (4.3 or newer).
147 IF(CMAKE_COMPILER_IS_GNUCC)
148     SET(OLD_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}")
149     # Force no inlining for the next test.
150     SET(CMAKE_REQUIRED_FLAGS "${OLD_REQUIRED_FLAGS} -fno-inline")
152     CHECK_C_SOURCE_COMPILES("extern inline int foo() { return 0; }
153                              int main() {return foo();}" INLINE_IS_C99)
154     IF(NOT INLINE_IS_C99)
155         MESSAGE(FATAL_ERROR "Your compiler does not seem to have C99 inline semantics!
156                              Please update your compiler for better C99 compliance.")
157     ENDIF()
159     SET(CMAKE_REQUIRED_FLAGS "${OLD_REQUIRED_FLAGS}")
160 ENDIF()
162 # Check if we have C99 variable length arrays
163 CHECK_C_SOURCE_COMPILES(
164 "int main(int argc, char *argv[])
166      volatile int tmp[argc];
167      tmp[0] = argv[0][0];
168      return tmp[0];
169  }"
170 HAVE_C99_VLA)
172 # Check if we have C11 static_assert
173 CHECK_C_SOURCE_COMPILES(
174 "int main()
176      _Static_assert(sizeof(int) == sizeof(int), \"What\");
177      return 0;
178  }"
179 HAVE_C11_STATIC_ASSERT)
181 # Add definitions, compiler switches, etc.
182 INCLUDE_DIRECTORIES("${OpenAL_SOURCE_DIR}/include" "${OpenAL_BINARY_DIR}")
183 IF(CMAKE_VERSION VERSION_LESS "2.8.8")
184     INCLUDE_DIRECTORIES("${OpenAL_SOURCE_DIR}/OpenAL32/Include" "${OpenAL_SOURCE_DIR}/Alc")
185     IF(WIN32 AND ALSOFT_NO_UID_DEFS)
186         ADD_DEFINITIONS("-DAL_NO_UID_DEFS")
187     ENDIF()
188 ENDIF()
190 IF(NOT CMAKE_BUILD_TYPE)
191     SET(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING
192         "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel."
193         FORCE)
194 ENDIF()
195 IF(NOT CMAKE_DEBUG_POSTFIX)
196     SET(CMAKE_DEBUG_POSTFIX "" CACHE STRING
197         "Library postfix for debug builds. Normally left blank."
198         FORCE)
199 ENDIF()
201 IF(MSVC)
202     # ???
203     SET(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -D_DEBUG")
204     SET(CMAKE_C_FLAGS_MINSIZEREL "${CMAKE_C_FLAGS_MINSIZEREL} -DNDEBUG")
205     SET(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -DNDEBUG")
206     SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -D_DEBUG")
207     ADD_DEFINITIONS(-D_CRT_SECURE_NO_WARNINGS)
208     ADD_DEFINITIONS(-D_CRT_NONSTDC_NO_DEPRECATE)
209     ADD_DEFINITIONS("/wd4098")
211     IF(NOT DXSDK_DIR)
212         STRING(REGEX REPLACE "\\\\" "/" DXSDK_DIR "$ENV{DXSDK_DIR}")
213     ELSE()
214         STRING(REGEX REPLACE "\\\\" "/" DXSDK_DIR "${DXSDK_DIR}")
215     ENDIF()
216     IF(DXSDK_DIR)
217         MESSAGE(STATUS "Using DirectX SDK directory: ${DXSDK_DIR}")
218         SET(CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES} "${DXSDK_DIR}/Include")
219         INCLUDE_DIRECTORIES("${DXSDK_DIR}/Include")
220         LINK_DIRECTORIES("${DXSDK_DIR}/Lib")
221     ENDIF()
223     OPTION(FORCE_STATIC_VCRT "Force /MT for static VC runtimes" OFF)
224     IF(FORCE_STATIC_VCRT)
225         FOREACH(flag_var
226                 CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE
227                 CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO)
228             IF(${flag_var} MATCHES "/MD")
229                 STRING(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}")
230             ENDIF()
231         ENDFOREACH(flag_var)
232     ENDIF()
233 ELSE()
234     ADD_DEFINITIONS(-Winline -Wall)
235     CHECK_C_COMPILER_FLAG(-Wextra HAVE_W_EXTRA)
236     IF(HAVE_W_EXTRA)
237         ADD_DEFINITIONS(-Wextra)
238     ENDIF()
240     IF(ALSOFT_WERROR)
241         ADD_DEFINITIONS(-Werror)
242     ENDIF()
244     SET(CMAKE_C_FLAGS_RELWITHDEBINFO "-g -O2 -D_DEBUG" CACHE STRING
245         "Flags used by the compiler during Release with Debug Info builds."
246         FORCE)
247     SET(CMAKE_C_FLAGS_MINSIZEREL "-Os -DNDEBUG" CACHE STRING
248         "Flags used by the compiler during release minsize builds."
249         FORCE)
250     SET(CMAKE_C_FLAGS_RELEASE "-O2 -fomit-frame-pointer -DNDEBUG" CACHE STRING
251         "Flags used by the compiler during release builds"
252         FORCE)
253     SET(CMAKE_C_FLAGS_DEBUG "-g3 -D_DEBUG" CACHE STRING
254         "Flags used by the compiler during debug builds."
255         FORCE)
257     CHECK_C_SOURCE_COMPILES("int foo() __attribute__((destructor));
258                              int main() {return 0;}" HAVE_GCC_DESTRUCTOR)
259 ENDIF()
261 # Set visibility/export options if available
262 IF(WIN32)
263     SET(EXPORT_DECL "__declspec(dllexport)")
264     IF(NOT MINGW)
265         SET(ALIGN_DECL "__declspec(align(x))")
266     ELSE()
267         SET(ALIGN_DECL "__declspec(aligned(x))")
268     ENDIF()
269 ELSE()
270     SET(OLD_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}")
271     # Yes GCC, really don't accept visibility modes you don't support
272     SET(CMAKE_REQUIRED_FLAGS "${OLD_REQUIRED_FLAGS} -Wattributes -Werror")
274     CHECK_C_SOURCE_COMPILES("int foo() __attribute__((visibility(\"protected\")));
275                              int main() {return 0;}" HAVE_GCC_PROTECTED_VISIBILITY)
276     IF(HAVE_GCC_PROTECTED_VISIBILITY)
277         SET(EXPORT_DECL "__attribute__((visibility(\"protected\")))")
278     ELSE()
279         CHECK_C_SOURCE_COMPILES("int foo() __attribute__((visibility(\"default\")));
280                                  int main() {return 0;}" HAVE_GCC_DEFAULT_VISIBILITY)
281         IF(HAVE_GCC_DEFAULT_VISIBILITY)
282             SET(EXPORT_DECL "__attribute__((visibility(\"default\")))")
283         ENDIF()
284     ENDIF()
286     IF(HAVE_GCC_PROTECTED_VISIBILITY OR HAVE_GCC_DEFAULT_VISIBILITY)
287         CHECK_C_COMPILER_FLAG(-fvisibility=internal HAVE_VISIBILITY_INTERNAL_SWITCH)
288         IF(HAVE_VISIBILITY_INTERNAL_SWITCH)
289             ADD_DEFINITIONS(-fvisibility=internal)
290         ELSE()
291             CHECK_C_COMPILER_FLAG(-fvisibility=hidden HAVE_VISIBILITY_HIDDEN_SWITCH)
292             IF(HAVE_VISIBILITY_HIDDEN_SWITCH)
293                 ADD_DEFINITIONS(-fvisibility=hidden)
294             ENDIF()
295         ENDIF()
296     ENDIF()
298     CHECK_C_SOURCE_COMPILES("int foo __attribute__((aligned(16)));
299                              int main() {return 0;}" HAVE_ATTRIBUTE_ALIGNED)
300     IF(HAVE_ATTRIBUTE_ALIGNED)
301         SET(ALIGN_DECL "__attribute__((aligned(x)))")
302     ENDIF()
304     SET(CMAKE_REQUIRED_FLAGS "${OLD_REQUIRED_FLAGS}")
305 ENDIF()
307 SET(SSE_SWITCH "")
308 IF(MSVC)
309     CHECK_C_COMPILER_FLAG(/arch:SSE HAVE_ARCHSSE_SWITCH)
310     IF(HAVE_ARCHSSE_SWITCH)
311         SET(SSE_SWITCH "/arch:SSE")
312     ENDIF()
313 ENDIF()
314 IF(NOT SSE_SWITCH)
315     CHECK_C_COMPILER_FLAG(-msse HAVE_MSSE_SWITCH)
316     IF(HAVE_MSSE_SWITCH)
317         SET(SSE_SWITCH "-msse")
318     ENDIF()
319 ENDIF()
321 CHECK_C_SOURCE_COMPILES("int foo(const char *str, ...) __attribute__((format(printf, 1, 2)));
322                          int main() {return 0;}" HAVE_GCC_FORMAT)
324 IF(NOT HAVE_C99_VLA)
325     CHECK_INCLUDE_FILE(alloca.h HAVE_ALLOCA_H)
326 ENDIF()
327 CHECK_INCLUDE_FILE(malloc.h HAVE_MALLOC_H)
328 CHECK_INCLUDE_FILE(ftw.h HAVE_FTW_H)
329 CHECK_INCLUDE_FILE(io.h HAVE_IO_H)
330 CHECK_INCLUDE_FILE(strings.h HAVE_STRINGS_H)
331 CHECK_INCLUDE_FILE(cpuid.h HAVE_CPUID_H)
332 CHECK_INCLUDE_FILE(sys/sysconf.h HAVE_SYS_SYSCONF_H)
333 CHECK_INCLUDE_FILE(fenv.h HAVE_FENV_H)
334 CHECK_INCLUDE_FILE(float.h HAVE_FLOAT_H)
335 CHECK_INCLUDE_FILE(ieeefp.h HAVE_IEEEFP_H)
336 CHECK_INCLUDE_FILE(guiddef.h HAVE_GUIDDEF_H)
337 IF(NOT HAVE_GUIDDEF_H)
338     CHECK_INCLUDE_FILE(initguid.h HAVE_INITGUID_H)
339 ENDIF()
341 # Some systems need libm for some of the following math functions to work
342 CHECK_LIBRARY_EXISTS(m pow "" HAVE_LIBM)
343 IF(HAVE_LIBM)
344     SET(EXTRA_LIBS m ${EXTRA_LIBS})
345     SET(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} m)
346 ENDIF()
349 CHECK_SYMBOL_EXISTS(aligned_alloc    stdlib.h HAVE_ALIGNED_ALLOC)
350 CHECK_SYMBOL_EXISTS(posix_memalign   stdlib.h HAVE_POSIX_MEMALIGN)
351 CHECK_SYMBOL_EXISTS(_aligned_malloc  malloc.h HAVE__ALIGNED_MALLOC)
352 CHECK_SYMBOL_EXISTS(lrintf math.h HAVE_LRINTF)
353 IF(NOT HAVE_C99_VLA)
354     IF(HAVE_ALLOCA_H)
355         CHECK_SYMBOL_EXISTS(alloca alloca.h HAVE_ALLOCA)
356     ELSEIF(HAVE_MALLOC_H)
357         CHECK_SYMBOL_EXISTS(alloca malloc.h HAVE_ALLOCA)
358     ENDIF()
359     IF(NOT HAVE_ALLOCA)
360         CHECK_SYMBOL_EXISTS(_alloca malloc.h HAVE__ALLOCA)
361         IF(NOT HAVE__ALLOCA)
362             MESSAGE(FATAL_ERROR "No alloca function found, please report!")
363         ENDIF()
365         ADD_DEFINITIONS(-Dalloca=_alloca)
366     ENDIF()
367 ENDIF()
369 IF(HAVE_FLOAT_H)
370     CHECK_SYMBOL_EXISTS(_controlfp float.h HAVE__CONTROLFP)
371     CHECK_SYMBOL_EXISTS(__control87_2 float.h HAVE___CONTROL87_2)
372 ENDIF()
373 IF(HAVE_FTW_H)
374     CHECK_SYMBOL_EXISTS(ftw ftw.h HAVE_FTW)
375 ENDIF()
376 IF(HAVE_IO_H)
377     CHECK_SYMBOL_EXISTS(_wfindfirst io.h HAVE__WFINDFIRST)
378 ENDIF()
380 CHECK_FUNCTION_EXISTS(strtof HAVE_STRTOF)
381 CHECK_FUNCTION_EXISTS(stat HAVE_STAT)
382 CHECK_FUNCTION_EXISTS(strcasecmp HAVE_STRCASECMP)
383 IF(NOT HAVE_STRCASECMP)
384     CHECK_FUNCTION_EXISTS(_stricmp HAVE__STRICMP)
385     IF(NOT HAVE__STRICMP)
386         MESSAGE(FATAL_ERROR "No case-insensitive compare function found, please report!")
387     ENDIF()
389     ADD_DEFINITIONS(-Dstrcasecmp=_stricmp)
390 ENDIF()
392 CHECK_FUNCTION_EXISTS(strncasecmp HAVE_STRNCASECMP)
393 IF(NOT HAVE_STRNCASECMP)
394     CHECK_FUNCTION_EXISTS(_strnicmp HAVE__STRNICMP)
395     IF(NOT HAVE__STRNICMP)
396         MESSAGE(FATAL_ERROR "No case-insensitive size-limitted compare function found, please report!")
397     ENDIF()
399     ADD_DEFINITIONS(-Dstrncasecmp=_strnicmp)
400 ENDIF()
402 CHECK_FUNCTION_EXISTS(snprintf HAVE_SNPRINTF)
403 IF(NOT HAVE_SNPRINTF)
404     CHECK_FUNCTION_EXISTS(_snprintf HAVE__SNPRINTF)
405     IF(NOT HAVE__SNPRINTF)
406         MESSAGE(FATAL_ERROR "No snprintf function found, please report!")
407     ENDIF()
409     ADD_DEFINITIONS(-Dsnprintf=_snprintf)
410 ENDIF()
412 CHECK_SYMBOL_EXISTS(isfinite math.h HAVE_ISFINITE)
413 IF(NOT HAVE_ISFINITE)
414     CHECK_FUNCTION_EXISTS(finite HAVE_FINITE)
415     IF(NOT HAVE_FINITE)
416         CHECK_FUNCTION_EXISTS(_finite HAVE__FINITE)
417         IF(NOT HAVE__FINITE)
418             MESSAGE(FATAL_ERROR "No isfinite function found, please report!")
419         ENDIF()
420         ADD_DEFINITIONS(-Disfinite=_finite)
421     ELSE()
422         ADD_DEFINITIONS(-Disfinite=finite)
423     ENDIF()
424 ENDIF()
426 CHECK_SYMBOL_EXISTS(isnan math.h HAVE_ISNAN)
427 IF(NOT HAVE_ISNAN)
428     CHECK_FUNCTION_EXISTS(_isnan HAVE__ISNAN)
429     IF(NOT HAVE__ISNAN)
430         MESSAGE(FATAL_ERROR "No isnan function found, please report!")
431     ENDIF()
433     ADD_DEFINITIONS(-Disnan=_isnan)
434 ENDIF()
437 # Check for the dlopen API (for dynamicly loading backend libs)
438 IF(ALSOFT_DLOPEN)
439     CHECK_INCLUDE_FILE(dlfcn.h HAVE_DLFCN_H)
440     IF(HAVE_DLFCN_H)
441         CHECK_LIBRARY_EXISTS(dl dlopen "" HAVE_LIBDL)
442         IF(HAVE_LIBDL)
443             SET(EXTRA_LIBS dl ${EXTRA_LIBS})
444         ENDIF()
445     ENDIF()
446 ENDIF()
448 # Check if we have Windows headers
449 CHECK_INCLUDE_FILE(windows.h HAVE_WINDOWS_H -D_WIN32_WINNT=0x0502)
450 IF(NOT HAVE_WINDOWS_H)
451     # These are needed on some systems for extra features
452     ADD_DEFINITIONS(-D_GNU_SOURCE=1 -D_POSIX_C_SOURCE=200809L -D_XOPEN_SOURCE=700)
453     SET(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -D_GNU_SOURCE=1 -D_POSIX_C_SOURCE=200809L -D_XOPEN_SOURCE=700")
455     CHECK_FUNCTION_EXISTS(gettimeofday HAVE_GETTIMEOFDAY)
456     IF(NOT HAVE_GETTIMEOFDAY)
457         MESSAGE(FATAL_ERROR "No timing function found!")
458     ENDIF()
460     CHECK_FUNCTION_EXISTS(nanosleep HAVE_NANOSLEEP)
461     IF(NOT HAVE_NANOSLEEP)
462         MESSAGE(FATAL_ERROR "No sleep function found!")
463     ENDIF()
465     # We need pthreads outside of Windows
466     CHECK_INCLUDE_FILE(pthread.h HAVE_PTHREAD_H)
467     IF(NOT HAVE_PTHREAD_H)
468         MESSAGE(FATAL_ERROR "PThreads is required for non-Windows builds!")
469     ENDIF()
470     # Some systems need pthread_np.h to get recursive mutexes
471     CHECK_INCLUDE_FILES("pthread.h;pthread_np.h" HAVE_PTHREAD_NP_H)
473     CHECK_C_COMPILER_FLAG(-pthread HAVE_PTHREAD)
474     IF(HAVE_PTHREAD)
475         ADD_DEFINITIONS(-pthread)
476         SET(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -pthread")
477         SET(EXTRA_LIBS ${EXTRA_LIBS} -pthread)
478     ENDIF()
480     CHECK_LIBRARY_EXISTS(pthread pthread_create "" HAVE_LIBPTHREAD)
481     IF(HAVE_LIBPTHREAD)
482         SET(EXTRA_LIBS pthread ${EXTRA_LIBS})
483     ENDIF()
485     CHECK_SYMBOL_EXISTS(pthread_setschedparam pthread.h HAVE_PTHREAD_SETSCHEDPARAM)
487     CHECK_SYMBOL_EXISTS(pthread_setname_np pthread.h HAVE_PTHREAD_SETNAME_NP)
488     IF(NOT HAVE_PTHREAD_SETNAME_NP)
489         CHECK_SYMBOL_EXISTS(pthread_set_name_np pthread.h HAVE_PTHREAD_SET_NAME_NP)
490     ENDIF()
492     CHECK_LIBRARY_EXISTS(rt clock_gettime "" HAVE_LIBRT)
493     IF(HAVE_LIBRT)
494         SET(EXTRA_LIBS rt ${EXTRA_LIBS})
495     ENDIF()
496 ENDIF()
498 # Check for a 64-bit type
499 CHECK_INCLUDE_FILE(stdint.h HAVE_STDINT_H)
500 IF(NOT HAVE_STDINT_H)
501     IF(HAVE_WINDOWS_H)
502         CHECK_C_SOURCE_COMPILES("#define _WIN32_WINNT 0x0502
503                                  #include <windows.h>
504                                  __int64 foo;
505                                  int main() {return 0;}" HAVE___INT64)
506     ENDIF()
507     IF(NOT HAVE___INT64)
508         IF(NOT SIZEOF_LONG MATCHES "8")
509             IF(NOT SIZEOF_LONG_LONG MATCHES "8")
510                 MESSAGE(FATAL_ERROR "No 64-bit types found, please report!")
511             ENDIF()
512         ENDIF()
513     ENDIF()
514 ENDIF()
516 # Windows needs winmm for timeGetTime, even if the backend is disabled
517 CHECK_SHARED_FUNCTION_EXISTS(timeGetTime "windows.h;mmsystem.h" winmm "" HAVE_LIBWINMM)
518 IF(HAVE_LIBWINMM)
519     SET(EXTRA_LIBS winmm ${EXTRA_LIBS})
520     SET(PKG_CONFIG_LIBS ${PKG_CONFIG_LIBS} -lwinmm)
521 ENDIF()
524 SET(OPENAL_OBJS  OpenAL32/alAuxEffectSlot.c
525                  OpenAL32/alBuffer.c
526                  OpenAL32/alEffect.c
527                  OpenAL32/alError.c
528                  OpenAL32/alExtension.c
529                  OpenAL32/alFilter.c
530                  OpenAL32/alFontsound.c
531                  OpenAL32/alListener.c
532                  OpenAL32/alMidi.c
533                  OpenAL32/alPreset.c
534                  OpenAL32/alSoundfont.c
535                  OpenAL32/alSource.c
536                  OpenAL32/alState.c
537                  OpenAL32/alThunk.c
538                  OpenAL32/sample_cvt.c
540 SET(ALC_OBJS  Alc/ALc.c
541               Alc/ALu.c
542               Alc/alcConfig.c
543               Alc/alcRing.c
544               Alc/bs2b.c
545               Alc/effects/autowah.c
546               Alc/effects/chorus.c
547               Alc/effects/compressor.c
548               Alc/effects/dedicated.c
549               Alc/effects/distortion.c
550               Alc/effects/echo.c
551               Alc/effects/equalizer.c
552               Alc/effects/flanger.c
553               Alc/effects/modulator.c
554               Alc/effects/null.c
555               Alc/effects/reverb.c
556               Alc/helpers.c
557               Alc/hrtf.c
558               Alc/panning.c
559               Alc/threads.c
560               Alc/mixer.c
561               Alc/mixer_c.c
565 SET(CPU_EXTS "Default")
566 SET(HAVE_SSE  0)
567 SET(HAVE_NEON 0)
569 # Check for SSE support
570 IF(ALSOFT_CPUEXT_SSE AND ALIGN_DECL)
571     CHECK_INCLUDE_FILE(xmmintrin.h HAVE_XMMINTRIN_H "${SSE_SWITCH}")
572     IF(HAVE_XMMINTRIN_H)
573         SET(HAVE_SSE 1)
574         SET(ALC_OBJS  ${ALC_OBJS} Alc/mixer_sse.c)
575         IF(SSE_SWITCH)
576             SET_SOURCE_FILES_PROPERTIES(Alc/mixer_sse.c PROPERTIES
577                                         COMPILE_FLAGS "${SSE_SWITCH}")
578         ENDIF()
579         SET(CPU_EXTS "${CPU_EXTS}, SSE")
580     ENDIF()
581 ENDIF()
582 IF(ALSOFT_REQUIRE_SSE AND NOT HAVE_SSE)
583     MESSAGE(FATAL_ERROR "Failed to enabled required SSE CPU extensions")
584 ENDIF()
586 # Check for ARM Neon support
587 IF(ALSOFT_CPUEXT_NEON)
588     CHECK_INCLUDE_FILE(arm_neon.h HAVE_ARM_NEON_H)
589     IF(HAVE_ARM_NEON_H)
590         SET(HAVE_NEON 1)
591         SET(ALC_OBJS  ${ALC_OBJS} Alc/mixer_neon.c)
592         SET(CPU_EXTS "${CPU_EXTS}, Neon")
593     ENDIF()
594 ENDIF()
595 IF(ALSOFT_REQUIRE_NEON AND NOT HAVE_NEON)
596     MESSAGE(FATAL_ERROR "Failed to enabled required ARM Neon CPU extensions")
597 ENDIF()
600 SET(ALC_OBJS  ${ALC_OBJS}
601               Alc/midi/base.c
602               Alc/midi/sf2load.c
603               Alc/midi/dummy.c
604               Alc/midi/fluidsynth.c
605               Alc/midi/soft.c
608 SET(HAVE_FLUIDSYNTH  0)
610 # Check for FluidSynth support
611 IF(ALSOFT_MIDI_FLUIDSYNTH)
612     FIND_PACKAGE(FluidSynth)
613     IF(FLUIDSYNTH_FOUND)
614         SET(HAVE_FLUIDSYNTH 1)
615         IF(CMAKE_VERSION VERSION_LESS "2.8.8")
616             INCLUDE_DIRECTORIES(${FLUIDSYNTH_INCLUDE_DIR})
617         ENDIF()
618         SET(EXTRA_LIBS ${FLUIDSYNTH_LIBRARIES} ${EXTRA_LIBS})
619     ENDIF()
620 ENDIF()
621 IF(ALSOFT_REQUIRE_FLUIDSYNTH AND NOT HAVE_FLUIDSYNTH)
622     MESSAGE(FATAL_ERROR "Failed to enabled required FluidSynth support")
623 ENDIF()
626 SET(ALC_OBJS  ${ALC_OBJS}
627               Alc/backends/base.c
628               # Default backends, always available
629               Alc/backends/loopback.c
630               Alc/backends/null.c
633 SET(BACKENDS "")
634 SET(HAVE_ALSA       0)
635 SET(HAVE_OSS        0)
636 SET(HAVE_SOLARIS    0)
637 SET(HAVE_SNDIO      0)
638 SET(HAVE_QSA        0)
639 SET(HAVE_DSOUND     0)
640 SET(HAVE_MMDEVAPI   0)
641 SET(HAVE_WINMM      0)
642 SET(HAVE_PORTAUDIO  0)
643 SET(HAVE_PULSEAUDIO 0)
644 SET(HAVE_COREAUDIO  0)
645 SET(HAVE_OPENSL     0)
646 SET(HAVE_WAVE       0)
648 # Check ALSA backend
649 IF(ALSOFT_BACKEND_ALSA)
650     CHECK_INCLUDE_FILE(alsa/asoundlib.h HAVE_ALSA_ASOUNDLIB_H)
651     IF(HAVE_ALSA_ASOUNDLIB_H)
652         CHECK_SHARED_FUNCTION_EXISTS(snd_pcm_open "alsa/asoundlib.h" asound "" HAVE_LIBASOUND)
653         IF(HAVE_LIBASOUND OR HAVE_DLFCN_H OR WIN32)
654             SET(HAVE_ALSA 1)
655             SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/alsa.c)
656             IF(HAVE_DLFCN_H OR WIN32)
657                 SET(BACKENDS  "${BACKENDS} ALSA,")
658             ELSE()
659                 SET(BACKENDS  "${BACKENDS} ALSA \(linked\),")
660                 SET(EXTRA_LIBS asound ${EXTRA_LIBS})
661             ENDIF()
662         ENDIF()
663     ENDIF()
664 ENDIF()
665 IF(ALSOFT_REQUIRE_ALSA AND NOT HAVE_ALSA)
666     MESSAGE(FATAL_ERROR "Failed to enabled required ALSA backend")
667 ENDIF()
669 # Check OSS backend
670 IF(ALSOFT_BACKEND_OSS)
671     CHECK_INCLUDE_FILE(sys/soundcard.h HAVE_SYS_SOUNDCARD_H)
672     IF(HAVE_SYS_SOUNDCARD_H)
673         SET(HAVE_OSS 1)
674         SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/oss.c)
675         SET(BACKENDS  "${BACKENDS} OSS,")
676     ENDIF()
677 ENDIF()
678 IF(ALSOFT_REQUIRE_OSS AND NOT HAVE_OSS)
679     MESSAGE(FATAL_ERROR "Failed to enabled required OSS backend")
680 ENDIF()
682 # Check Solaris backend
683 IF(ALSOFT_BACKEND_SOLARIS)
684     CHECK_INCLUDE_FILE(sys/audioio.h HAVE_SYS_AUDIOIO_H)
685     IF(HAVE_SYS_AUDIOIO_H)
686         SET(HAVE_SOLARIS 1)
687         SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/solaris.c)
688         SET(BACKENDS  "${BACKENDS} Solaris,")
689     ENDIF()
690 ENDIF()
691 IF(ALSOFT_REQUIRE_SOLARIS AND NOT HAVE_SOLARIS)
692     MESSAGE(FATAL_ERROR "Failed to enabled required Solaris backend")
693 ENDIF()
695 # Check SndIO backend
696 IF(ALSOFT_BACKEND_SNDIO)
697     CHECK_INCLUDE_FILE(sndio.h HAVE_SNDIO_H)
698     IF(HAVE_SNDIO_H)
699         CHECK_SHARED_FUNCTION_EXISTS(sio_open "sndio.h" sndio "" HAVE_LIBSNDIO)
700         IF(HAVE_LIBSNDIO)
701             SET(HAVE_SNDIO 1)
702             SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/sndio.c)
703             SET(BACKENDS  "${BACKENDS} SndIO \(linked\),")
704             SET(EXTRA_LIBS sndio ${EXTRA_LIBS})
705         ENDIF()
706     ENDIF()
707 ENDIF()
708 IF(ALSOFT_REQUIRE_SNDIO AND NOT HAVE_SNDIO)
709     MESSAGE(FATAL_ERROR "Failed to enabled required SndIO backend")
710 ENDIF()
712 # Check QSA backend
713 IF (ALSOFT_BACKEND_QSA AND "${CMAKE_C_PLATFORM_ID}" STREQUAL "QNX")
714     CHECK_INCLUDE_FILE(sys/asoundlib.h HAVE_SYS_ASOUNDLIB_H)
715     IF(HAVE_SYS_ASOUNDLIB_H)
716         CHECK_SHARED_FUNCTION_EXISTS(snd_pcm_open "sys/asoundlib.h" asound "" HAVE_LIBASOUND)
717         IF(HAVE_LIBASOUND)
718             SET(HAVE_QSA 1)
719             SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/qsa.c)
720             SET(EXTRA_LIBS asound ${EXTRA_LIBS})
721             SET(BACKENDS  "${BACKENDS} QSA \(linked\),")
722         ENDIF()
723     ENDIF()
724 ENDIF()
725 IF(ALSOFT_REQUIRE_QSA AND NOT HAVE_QSA)
726     MESSAGE(FATAL_ERROR "Failed to enabled required QSA backend")
727 ENDIF()
729 # Check for MMDevApi backend
730 IF(HAVE_WINDOWS_H)
731     IF(ALSOFT_BACKEND_MMDEVAPI)
732         CHECK_INCLUDE_FILE(mmdeviceapi.h HAVE_MMDEVICEAPI_H)
733         IF(HAVE_MMDEVICEAPI_H)
734             SET(HAVE_MMDEVAPI 1)
735             SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/mmdevapi.c)
737             SET(BACKENDS  "${BACKENDS} MMDevApi,")
738         ENDIF()
739     ENDIF()
740 ENDIF()
741 IF(ALSOFT_REQUIRE_MMDEVAPI AND NOT HAVE_MMDEVAPI)
742     MESSAGE(FATAL_ERROR "Failed to enabled required MMDevApi backend")
743 ENDIF()
745 # Check DSound/MMSystem backend
746 IF(ALSOFT_BACKEND_DSOUND)
747     CHECK_INCLUDE_FILE(dsound.h HAVE_DSOUND_H)
748     IF(HAVE_DSOUND_H)
749         CHECK_SHARED_FUNCTION_EXISTS(DirectSoundCreate "dsound.h" dsound "" HAVE_LIBDSOUND)
750         IF(HAVE_LIBDSOUND OR HAVE_DLFCN_H OR WIN32)
751             SET(HAVE_DSOUND 1)
752             SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/dsound.c)
754             IF(HAVE_DLFCN_H OR WIN32)
755                 SET(BACKENDS  "${BACKENDS} DirectSound,")
756             ELSE()
757                 SET(BACKENDS  "${BACKENDS} DirectSound \(linked\),")
758                 SET(EXTRA_LIBS dsound ${EXTRA_LIBS})
759             ENDIF()
760         ENDIF()
761     ENDIF()
762 ENDIF()
763 IF(ALSOFT_REQUIRE_DSOUND AND NOT HAVE_DSOUND)
764     MESSAGE(FATAL_ERROR "Failed to enabled required DSound backend")
765 ENDIF()
767 IF(HAVE_WINDOWS_H)
768     IF(ALSOFT_BACKEND_WINMM)
769         CHECK_INCLUDE_FILES("windows.h;mmsystem.h" HAVE_MMSYSTEM_H -D_WIN32_WINNT=0x0502)
770         IF(HAVE_MMSYSTEM_H AND HAVE_LIBWINMM)
771             SET(HAVE_WINMM 1)
772             SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/winmm.c)
773             SET(BACKENDS  "${BACKENDS} WinMM,")
774         ENDIF()
775     ENDIF()
776 ENDIF()
777 IF(ALSOFT_REQUIRE_WINMM AND NOT HAVE_WINMM)
778     MESSAGE(FATAL_ERROR "Failed to enabled required WinMM backend")
779 ENDIF()
781 # Check PortAudio backend
782 IF(ALSOFT_BACKEND_PORTAUDIO)
783     CHECK_INCLUDE_FILE(portaudio.h HAVE_PORTAUDIO_H)
784     IF(HAVE_PORTAUDIO_H)
785         CHECK_SHARED_FUNCTION_EXISTS(Pa_Initialize "portaudio.h" portaudio "" HAVE_LIBPORTAUDIO)
786         IF(HAVE_LIBPORTAUDIO OR HAVE_DLFCN_H OR WIN32)
787             SET(HAVE_PORTAUDIO 1)
788             SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/portaudio.c)
789             IF(HAVE_DLFCN_H OR WIN32)
790                 SET(BACKENDS  "${BACKENDS} PortAudio,")
791             ELSE()
792                 SET(BACKENDS  "${BACKENDS} PortAudio \(linked\),")
793                 SET(EXTRA_LIBS portaudio ${EXTRA_LIBS})
794             ENDIF()
795         ENDIF()
796     ENDIF()
797 ENDIF()
798 IF(ALSOFT_REQUIRE_PORTAUDIO AND NOT HAVE_PORTAUDIO)
799     MESSAGE(FATAL_ERROR "Failed to enabled required PortAudio backend")
800 ENDIF()
802 # Check PulseAudio backend
803 IF(ALSOFT_BACKEND_PULSEAUDIO)
804     CHECK_INCLUDE_FILE(pulse/pulseaudio.h HAVE_PULSE_PULSEAUDIO_H)
805     IF(HAVE_PULSE_PULSEAUDIO_H)
806         CHECK_SHARED_FUNCTION_EXISTS(pa_context_new "pulse/pulseaudio.h" pulse "" HAVE_LIBPULSE)
807         IF(HAVE_LIBPULSE OR HAVE_DLFCN_H OR WIN32)
808             SET(HAVE_PULSEAUDIO 1)
809             SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/pulseaudio.c)
810             IF(HAVE_DLFCN_H OR WIN32)
811                 SET(BACKENDS  "${BACKENDS} PulseAudio,")
812             ELSE()
813                 SET(BACKENDS  "${BACKENDS} PulseAudio \(linked\),")
814                 SET(EXTRA_LIBS pulse ${EXTRA_LIBS})
815             ENDIF()
816         ENDIF()
817     ENDIF()
818 ENDIF()
819 IF(ALSOFT_REQUIRE_PULSEAUDIO AND NOT HAVE_PULSEAUDIO)
820     MESSAGE(FATAL_ERROR "Failed to enabled required PulseAudio backend")
821 ENDIF()
823 # Check CoreAudio backend
824 IF(ALSOFT_BACKEND_COREAUDIO)
825     FIND_LIBRARY(COREAUDIO_FRAMEWORK
826                  NAMES CoreAudio
827                  PATHS /System/Library/Frameworks
828                 )
829     IF(COREAUDIO_FRAMEWORK)
830         SET(HAVE_COREAUDIO 1)
831         SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/coreaudio.c)
832         SET(BACKENDS  "${BACKENDS} CoreAudio,")
833         SET(EXTRA_LIBS ${COREAUDIO_FRAMEWORK} ${EXTRA_LIBS})
834         SET(EXTRA_LIBS /System/Library/Frameworks/AudioUnit.framework ${EXTRA_LIBS})
835         SET(EXTRA_LIBS /System/Library/Frameworks/ApplicationServices.framework ${EXTRA_LIBS})
837         # Some versions of OSX may need the AudioToolbox framework. Add it if
838         # it's found.
839         FIND_LIBRARY(AUDIOTOOLBOX_LIBRARY
840                      NAMES AudioToolbox
841                      PATHS ~/Library/Frameworks
842                            /Library/Frameworks
843                            /System/Library/Frameworks
844                     )
845         IF(AUDIOTOOLBOX_LIBRARY)
846             SET(EXTRA_LIBS ${AUDIOTOOLBOX_LIBRARY} ${EXTRA_LIBS})
847         ENDIF()
848     ENDIF()
849 ENDIF()
850 IF(ALSOFT_REQUIRE_COREAUDIO AND NOT HAVE_COREAUDIO)
851     MESSAGE(FATAL_ERROR "Failed to enabled required CoreAudio backend")
852 ENDIF()
854 # Check for OpenSL (Android) backend
855 IF(ALSOFT_BACKEND_OPENSL)
856     CHECK_INCLUDE_FILES("SLES/OpenSLES.h;SLES/OpenSLES_Android.h" HAVE_SLES_OPENSLES_ANDROID_H)
857     IF(HAVE_SLES_OPENSLES_ANDROID_H)
858         CHECK_SHARED_FUNCTION_EXISTS(slCreateEngine "SLES/OpenSLES.h" OpenSLES "" HAVE_LIBOPENSLES)
859         IF(HAVE_LIBOPENSLES)
860             SET(HAVE_OPENSL 1)
861             SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/opensl.c)
862             SET(BACKENDS  "${BACKENDS} OpenSL,")
863             SET(EXTRA_LIBS OpenSLES ${EXTRA_LIBS})
864         ENDIF()
865     ENDIF()
866 ENDIF()
867 IF(ALSOFT_REQUIRE_OPENSL AND NOT HAVE_OPENSL)
868     MESSAGE(FATAL_ERROR "Failed to enabled required OpenSL backend")
869 ENDIF()
871 # Optionally enable the Wave Writer backend
872 IF(ALSOFT_BACKEND_WAVE)
873     SET(HAVE_WAVE 1)
874     SET(ALC_OBJS  ${ALC_OBJS} Alc/backends/wave.c)
875     SET(BACKENDS  "${BACKENDS} WaveFile,")
876 ENDIF()
878 # This is always available
879 SET(BACKENDS  "${BACKENDS} Null")
881 IF(ALSOFT_UTILS AND NOT ALSOFT_NO_CONFIG_UTIL)
882     add_subdirectory(utils/alsoft-config)
883 ENDIF()
884 IF(ALSOFT_EXAMPLES)
885     FIND_PACKAGE(SDL)
886     IF(SDL_FOUND)
887         FIND_PACKAGE(SDL_sound)
888         IF(SDL_SOUND_FOUND AND CMAKE_VERSION VERSION_LESS "2.8.8")
889             INCLUDE_DIRECTORIES(${SDL_INCLUDE_DIR} ${SDL_SOUND_INCLUDE_DIR})
890         ENDIF()
891     ENDIF()
892 ENDIF()
894 IF(LIBTYPE STREQUAL "STATIC")
895     ADD_DEFINITIONS(-DAL_LIBTYPE_STATIC)
896     SET(PKG_CONFIG_CFLAGS -DAL_LIBTYPE_STATIC ${PKG_CONFIG_CFLAGS})
897 ENDIF()
899 # Needed for openal.pc.in
900 SET(prefix ${CMAKE_INSTALL_PREFIX})
901 SET(exec_prefix "\${prefix}")
902 SET(libdir "\${exec_prefix}/lib${LIB_SUFFIX}")
903 SET(bindir "\${exec_prefix}/bin")
904 SET(includedir "\${prefix}/include")
905 SET(PACKAGE_VERSION "${LIB_VERSION}")
907 # End configuration
908 CONFIGURE_FILE(
909     "${OpenAL_SOURCE_DIR}/config.h.in"
910     "${OpenAL_BINARY_DIR}/config.h")
911 CONFIGURE_FILE(
912     "${OpenAL_SOURCE_DIR}/openal.pc.in"
913     "${OpenAL_BINARY_DIR}/openal.pc"
914     @ONLY)
916 # Build a library
917 ADD_LIBRARY(${LIBNAME} ${LIBTYPE} ${OPENAL_OBJS} ${ALC_OBJS})
918 SET_PROPERTY(TARGET ${LIBNAME} APPEND PROPERTY COMPILE_DEFINITIONS AL_BUILD_LIBRARY AL_ALEXT_PROTOTYPES)
919 IF(WIN32 AND ALSOFT_NO_UID_DEFS)
920     SET_PROPERTY(TARGET ${LIBNAME} APPEND PROPERTY COMPILE_DEFINITIONS AL_NO_UID_DEFS)
921 ENDIF()
922 SET_PROPERTY(TARGET ${LIBNAME} APPEND PROPERTY INCLUDE_DIRECTORIES "${OpenAL_SOURCE_DIR}/OpenAL32/Include" "${OpenAL_SOURCE_DIR}/Alc")
923 IF(FLUIDSYNTH_FOUND)
924     SET_PROPERTY(TARGET ${LIBNAME} APPEND PROPERTY INCLUDE_DIRECTORIES ${FLUIDSYNTH_INCLUDE_DIR})
925 ENDIF()
926 SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES VERSION ${LIB_VERSION}
927                                             SOVERSION ${LIB_MAJOR_VERSION})
928 IF(WIN32 AND NOT LIBTYPE STREQUAL "STATIC")
929     SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES PREFIX "")
930 ENDIF()
932 TARGET_LINK_LIBRARIES(${LIBNAME} ${EXTRA_LIBS})
934 # Add an install target here
935 INSTALL(TARGETS ${LIBNAME}
936         RUNTIME DESTINATION bin
937         LIBRARY DESTINATION "lib${LIB_SUFFIX}"
938         ARCHIVE DESTINATION "lib${LIB_SUFFIX}"
940 INSTALL(FILES include/AL/al.h
941               include/AL/alc.h
942               include/AL/alext.h
943               include/AL/efx.h
944               include/AL/efx-creative.h
945               include/AL/efx-presets.h
946         DESTINATION include/AL
948 INSTALL(FILES "${OpenAL_BINARY_DIR}/openal.pc"
949         DESTINATION "lib${LIB_SUFFIX}/pkgconfig")
952 MESSAGE(STATUS "")
953 MESSAGE(STATUS "Building OpenAL with support for the following backends:")
954 MESSAGE(STATUS "    ${BACKENDS}")
955 MESSAGE(STATUS "")
956 MESSAGE(STATUS "Building with support for CPU extensions:")
957 MESSAGE(STATUS "    ${CPU_EXTS}")
958 MESSAGE(STATUS "")
959 IF(HAVE_FLUIDSYNTH)
960     MESSAGE(STATUS "FluidSynth support for ALC_SOFT_midi_interface enabled")
961     MESSAGE(STATUS "")
962 ENDIF()
964 IF(WIN32)
965     IF(NOT HAVE_DSOUND)
966         MESSAGE(STATUS "WARNING: Building the Windows version without DirectSound output")
967         MESSAGE(STATUS "         This is probably NOT what you want!")
968         MESSAGE(STATUS "")
969     ENDIF()
970 ENDIF()
972 # Install alsoft.conf configuration file
973 IF(ALSOFT_CONFIG)
974     INSTALL(FILES alsoftrc.sample
975             DESTINATION share/openal
976     )
977     MESSAGE(STATUS "Installing sample configuration")
978     MESSAGE(STATUS "")
979 ENDIF()
981 # Install HRTF definitions
982 IF(ALSOFT_HRTF_DEFS)
983     INSTALL(FILES hrtf/default-44100.mhr
984             DESTINATION share/openal/hrtf
985     )
986     MESSAGE(STATUS "Installing HRTF definitions")
987     MESSAGE(STATUS "")
988 ENDIF()
990 IF(ALSOFT_UTILS)
991     ADD_EXECUTABLE(openal-info utils/openal-info.c)
992     TARGET_LINK_LIBRARIES(openal-info ${LIBNAME})
994     ADD_EXECUTABLE(makehrtf utils/makehrtf.c)
995     IF(HAVE_LIBM)
996         TARGET_LINK_LIBRARIES(makehrtf m)
997     ENDIF()
999     INSTALL(TARGETS openal-info makehrtf
1000             RUNTIME DESTINATION bin
1001             LIBRARY DESTINATION "lib${LIB_SUFFIX}"
1002             ARCHIVE DESTINATION "lib${LIB_SUFFIX}"
1003     )
1005     MESSAGE(STATUS "Building utility programs")
1006     IF(TARGET alsoft-config)
1007         MESSAGE(STATUS "Building configuration program")
1008     ENDIF()
1009     MESSAGE(STATUS "")
1010 ENDIF()
1012 IF(ALSOFT_EXAMPLES)
1013     IF(SDL_FOUND AND SDL_SOUND_FOUND)
1014         ADD_LIBRARY(ex-common STATIC examples/common/alhelpers.c
1015                                      examples/common/sdl_sound.c)
1016         SET_PROPERTY(TARGET ex-common APPEND PROPERTY INCLUDE_DIRECTORIES ${SDL_SOUND_INCLUDE_DIR})
1018         ADD_EXECUTABLE(alstream examples/alstream.c)
1019         TARGET_LINK_LIBRARIES(alstream ex-common ${SDL_SOUND_LIBRARIES} ${LIBNAME})
1020         SET_PROPERTY(TARGET alstream APPEND PROPERTY INCLUDE_DIRECTORIES ${SDL_SOUND_INCLUDE_DIR})
1022         ADD_EXECUTABLE(alreverb examples/alreverb.c)
1023         TARGET_LINK_LIBRARIES(alreverb ex-common ${SDL_SOUND_LIBRARIES} ${LIBNAME})
1024         SET_PROPERTY(TARGET alreverb APPEND PROPERTY INCLUDE_DIRECTORIES ${SDL_SOUND_INCLUDE_DIR})
1026         ADD_EXECUTABLE(allatency examples/allatency.c)
1027         TARGET_LINK_LIBRARIES(allatency ex-common ${SDL_SOUND_LIBRARIES} ${LIBNAME})
1028         SET_PROPERTY(TARGET allatency APPEND PROPERTY INCLUDE_DIRECTORIES ${SDL_SOUND_INCLUDE_DIR})
1030         ADD_EXECUTABLE(alloopback examples/alloopback.c)
1031         TARGET_LINK_LIBRARIES(alloopback ex-common ${SDL_SOUND_LIBRARIES} ${SDL_LIBRARY} ${LIBNAME})
1032         SET_PROPERTY(TARGET alloopback APPEND PROPERTY INCLUDE_DIRECTORIES ${SDL_INCLUDE_DIR}
1033                                                                            ${SDL_SOUND_INCLUDE_DIR})
1035         INSTALL(TARGETS alstream alreverb allatency alloopback
1036                 RUNTIME DESTINATION bin
1037                 LIBRARY DESTINATION "lib${LIB_SUFFIX}"
1038                 ARCHIVE DESTINATION "lib${LIB_SUFFIX}"
1039         )
1041         MESSAGE(STATUS "Building example programs")
1042         MESSAGE(STATUS "")
1043     ENDIF()
1044 ENDIF()