Fix cmake check
[openal-soft/android.git] / CMakeLists.txt
blobfa6ecb2bdc7dbb3cd55568ebf5c403fb0b90d17e
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)
22 PROJECT(OpenAL C)
25 SET(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS TRUE)
28 OPTION(ALSA    "Check for ALSA backend"                ON)
29 OPTION(OSS     "Check for OSS backend"                 ON)
30 OPTION(SOLARIS "Check for Solaris backend"             ON)
31 OPTION(SNDIO   "Check for SndIO backend"               ON)
32 OPTION(MMDEVAPI "Check for MMDevApi"                   ON)
33 OPTION(DSOUND  "Check for DirectSound backend"         ON)
34 OPTION(WINMM   "Check for Windows Multimedia backend"  ON)
35 OPTION(PORTAUDIO  "Check for PortAudio backend"        ON)
36 OPTION(PULSEAUDIO "Check for PulseAudio backend"       ON)
37 OPTION(COREAUDIO  "Check for CoreAudio backend"        ON)
38 OPTION(OPENSL     "Check for OpenSL backend"           ON)
39 OPTION(WAVE    "Enable Wave Writer backend"            ON)
41 OPTION(REQUIRE_ALSA       "Require ALSA backend"               OFF)
42 OPTION(REQUIRE_OSS        "Require OSS backend"                OFF)
43 OPTION(REQUIRE_SOLARIS    "Require Solaris backend"            OFF)
44 OPTION(REQUIRE_SNDIO      "Require SndIO backend"              OFF)
45 OPTION(REQUIRE_MMDEVAPI   "Require MMDevApi"                   OFF)
46 OPTION(REQUIRE_DSOUND     "Require DirectSound backend"        OFF)
47 OPTION(REQUIRE_WINMM      "Require Windows Multimedia backend" OFF)
48 OPTION(REQUIRE_PORTAUDIO  "Require PortAudio backend"          OFF)
49 OPTION(REQUIRE_PULSEAUDIO "Require PulseAudio backend"         OFF)
50 OPTION(REQUIRE_COREAUDIO  "Require CoreAudio backend"          OFF)
51 OPTION(REQUIRE_OPENSL     "Require OpenSL backend"             OFF)
53 OPTION(DLOPEN  "Check for the dlopen API for loading optional libs"  ON)
55 OPTION(WERROR  "Treat compile warnings as errors"      OFF)
57 OPTION(UTILS  "Build and install utility programs"  ON)
59 OPTION(ALSOFT_CONFIG "Install alsoft.conf configuration file" OFF)
62 IF(WIN32)
63     SET(LIBNAME OpenAL32)
64     ADD_DEFINITIONS("-D_WIN32")
65 ELSE()
66     SET(LIBNAME openal)
67 ENDIF()
69 IF(NOT LIBTYPE)
70     SET(LIBTYPE SHARED)
71 ENDIF()
73 SET(LIB_MAJOR_VERSION "1")
74 SET(LIB_MINOR_VERSION "13")
75 SET(LIB_VERSION "${LIB_MAJOR_VERSION}.${LIB_MINOR_VERSION}")
77 SET(EXPORT_DECL "")
80 CHECK_TYPE_SIZE("long" SIZEOF_LONG)
81 CHECK_TYPE_SIZE("long long" SIZEOF_LONG_LONG)
82 CHECK_TYPE_SIZE("unsigned int" SIZEOF_UINT)
83 CHECK_TYPE_SIZE("void*" SIZEOF_VOIDP)
86 CHECK_C_SOURCE_COMPILES("int *restrict foo;
87                          int main() {return 0;}" HAVE_RESTRICT)
88 CHECK_C_SOURCE_COMPILES("int *__restrict foo;
89                          int main() {return 0;}" HAVE___RESTRICT)
92 # Add definitions, compiler switches, etc.
93 INCLUDE_DIRECTORIES(OpenAL32/Include include "${OpenAL_BINARY_DIR}")
95 IF(NOT CMAKE_BUILD_TYPE)
96     SET(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING
97         "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel."
98         FORCE)
99 ENDIF()
100 IF(NOT CMAKE_DEBUG_POSTFIX)
101     SET(CMAKE_DEBUG_POSTFIX "" CACHE STRING
102         "Library postfix for debug builds. Normally left blank."
103         FORCE)
104 ENDIF()
106 IF(MSVC)
107     # ???
108     SET(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -D_DEBUG")
109     SET(CMAKE_C_FLAGS_MINSIZEREL "${CMAKE_C_FLAGS_MINSIZEREL} -DNDEBUG")
110     SET(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -DNDEBUG")
111     SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -D_DEBUG")
112     ADD_DEFINITIONS(-D_CRT_SECURE_NO_WARNINGS)
113     ADD_DEFINITIONS(-D_CRT_NONSTDC_NO_DEPRECATE)
115     IF(NOT DXSDK_DIR)
116         STRING(REGEX REPLACE "\\\\" "/" DXSDK_DIR "$ENV{DXSDK_DIR}")
117     ELSE()
118         STRING(REGEX REPLACE "\\\\" "/" DXSDK_DIR "${DXSDK_DIR}")
119     ENDIF()
120     IF(DXSDK_DIR)
121         MESSAGE(STATUS "Using DirectX SDK directory: ${DXSDK_DIR}")
122         SET(CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES} "${DXSDK_DIR}/Include")
123         INCLUDE_DIRECTORIES("${DXSDK_DIR}/Include")
124         LINK_DIRECTORIES("${DXSDK_DIR}/Lib")
125     ENDIF()
127     OPTION(FORCE_STATIC_VCRT "Force /MT for static VC runtimes" OFF)
128     IF(FORCE_STATIC_VCRT)
129         FOREACH(flag_var
130                 CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE
131                 CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO)
132             IF(${flag_var} MATCHES "/MD")
133                 STRING(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}")
134             ENDIF()
135         ENDFOREACH(flag_var)
136     ENDIF()
137 ELSE()
138     ADD_DEFINITIONS(-Winline -Wall)
139     CHECK_C_COMPILER_FLAG(-Wextra HAVE_W_EXTRA)
140     IF(HAVE_W_EXTRA)
141         ADD_DEFINITIONS(-Wextra)
142     ENDIF()
144     IF(WERROR)
145         ADD_DEFINITIONS(-Werror)
146     ENDIF()
148     SET(CMAKE_C_FLAGS_RELWITHDEBINFO "-g -O2 -D_DEBUG" CACHE STRING
149         "Flags used by the compiler during Release with Debug Info builds."
150         FORCE)
151     SET(CMAKE_C_FLAGS_MINSIZEREL "-Os -DNDEBUG" CACHE STRING
152         "Flags used by the compiler during release minsize builds."
153         FORCE)
154     SET(CMAKE_C_FLAGS_RELEASE "-O2 -fomit-frame-pointer -DNDEBUG" CACHE STRING
155         "Flags used by the compiler during release builds"
156         FORCE)
157     SET(CMAKE_C_FLAGS_DEBUG "-g3 -D_DEBUG" CACHE STRING
158         "Flags used by the compiler during debug builds."
159         FORCE)
161     CHECK_C_SOURCE_COMPILES("int foo() __attribute__((destructor));
162                              int main() {return 0;}" HAVE_GCC_DESTRUCTOR)
163 ENDIF()
165 # Set visibility/export options if available
166 IF(WIN32)
167     SET(EXPORT_DECL "__declspec(dllexport)")
169     OPTION(WINE "Enable use of Wine headers when compiling" OFF)
170     IF(WINE)
171         FIND_PATH(WINE_INCLUDE_DIR library.h
172                   PATHS
173                   /usr/include/wine
174                   /usr/local/include/wine
175                   CMAKE_FIND_ROOT_PATH_BOTH)
176         IF(WINE_INCLUDE_DIR)
177             MESSAGE(STATUS "Found Wine header files - ${WINE_INCLUDE_DIR}" )
178             INCLUDE_DIRECTORIES("${WINE_INCLUDE_DIR}/windows")
179             SET(CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES} "${WINE_INCLUDE_DIR}/windows")
180         ELSE()
181             MESSAGE(STATUS "Could not find Wine header files" )
182         ENDIF()
183     ENDIF()
184 ELSE()
185     CHECK_C_COMPILER_FLAG(-fvisibility=internal HAVE_VISIBILITY_SWITCH)
186     CHECK_C_SOURCE_COMPILES("int foo() __attribute__((visibility(\"protected\")));
187                              int main() {return 0;}" HAVE_GCC_VISIBILITY)
188     IF(HAVE_VISIBILITY_SWITCH AND HAVE_GCC_VISIBILITY)
189         ADD_DEFINITIONS(-fvisibility=internal)
190         SET(EXPORT_DECL "__attribute__((visibility(\"protected\")))")
191     ENDIF()
192 ENDIF()
194 CHECK_C_SOURCE_COMPILES("int foo(const char *str, ...) __attribute__((format(printf, 1, 2)));
195                          int main() {return 0;}" HAVE_GCC_FORMAT)
197 CHECK_INCLUDE_FILE(fenv.h HAVE_FENV_H)
198 CHECK_INCLUDE_FILE(float.h HAVE_FLOAT_H)
199 CHECK_INCLUDE_FILE(ieeefp.h HAVE_IEEEFP_H)
200 CHECK_INCLUDE_FILE(guiddef.h HAVE_GUIDDEF_H)
201 IF(NOT HAVE_GUIDDEF_H)
202     CHECK_INCLUDE_FILE(initguid.h HAVE_INITGUID_H)
203 ENDIF()
205 CHECK_LIBRARY_EXISTS(m  powf   "" HAVE_POWF)
206 CHECK_LIBRARY_EXISTS(m  sqrtf  "" HAVE_SQRTF)
207 CHECK_LIBRARY_EXISTS(m  acosf  "" HAVE_ACOSF)
208 CHECK_LIBRARY_EXISTS(m  atanf  "" HAVE_ATANF)
209 CHECK_LIBRARY_EXISTS(m  fabsf  "" HAVE_FABSF)
210 IF(HAVE_FENV_H)
211     CHECK_LIBRARY_EXISTS(m  fesetround  "" HAVE_FESETROUND)
212 ENDIF()
213 IF(HAVE_SQRTF OR HAVE_ACOSF OR HAVE_ATANF OR HAVE_FABSF OR HAVE_FESETROUND)
214     SET(EXTRA_LIBS m ${EXTRA_LIBS})
215 ENDIF()
216 CHECK_FUNCTION_EXISTS(strtof HAVE_STRTOF)
217 CHECK_FUNCTION_EXISTS(_controlfp HAVE__CONTROLFP)
219 CHECK_FUNCTION_EXISTS(stat HAVE_STAT)
220 CHECK_FUNCTION_EXISTS(strcasecmp HAVE_STRCASECMP)
221 IF(NOT HAVE_STRCASECMP)
222     CHECK_FUNCTION_EXISTS(_stricmp HAVE__STRICMP)
223     IF(NOT HAVE__STRICMP)
224         MESSAGE(FATAL_ERROR "No case-insensitive compare function found, please report!")
225     ENDIF()
227     ADD_DEFINITIONS(-Dstrcasecmp=_stricmp)
228 ENDIF()
230 CHECK_FUNCTION_EXISTS(strncasecmp HAVE_STRNCASECMP)
231 IF(NOT HAVE_STRNCASECMP)
232     CHECK_FUNCTION_EXISTS(_strnicmp HAVE__STRNICMP)
233     IF(NOT HAVE__STRNICMP)
234         MESSAGE(FATAL_ERROR "No case-insensitive size-limitted compare function found, please report!")
235     ENDIF()
237     ADD_DEFINITIONS(-Dstrncasecmp=_strnicmp)
238 ENDIF()
240 CHECK_FUNCTION_EXISTS(snprintf HAVE_SNPRINTF)
241 IF(NOT HAVE_SNPRINTF)
242     CHECK_FUNCTION_EXISTS(_snprintf HAVE__SNPRINTF)
243     IF(NOT HAVE__SNPRINTF)
244         MESSAGE(FATAL_ERROR "No snprintf function found, please report!")
245     ENDIF()
247     ADD_DEFINITIONS(-Dsnprintf=_snprintf)
248 ENDIF()
250 CHECK_FUNCTION_EXISTS(vsnprintf HAVE_VSNPRINTF)
251 IF(NOT HAVE_VSNPRINTF)
252     CHECK_FUNCTION_EXISTS(_vsnprintf HAVE__VSNPRINTF)
253     IF(NOT HAVE__VSNPRINTF)
254         MESSAGE(FATAL_ERROR "No vsnprintf function found, please report!")
255     ENDIF()
257     ADD_DEFINITIONS(-Dvsnprintf=_vsnprintf)
258 ENDIF()
260 CHECK_SYMBOL_EXISTS(isfinite math.h HAVE_ISFINITE)
261 IF(NOT HAVE_ISFINITE)
262     CHECK_FUNCTION_EXISTS(finite HAVE_FINITE)
263     IF(NOT HAVE_FINITE)
264         CHECK_FUNCTION_EXISTS(_finite HAVE__FINITE)
265         IF(NOT HAVE__FINITE)
266             MESSAGE(FATAL_ERROR "No isfinite function found, please report!")
267         ENDIF()
268         ADD_DEFINITIONS(-Disfinite=_finite)
269     ELSE()
270         ADD_DEFINITIONS(-Disfinite=finite)
271     ENDIF()
272 ENDIF()
274 CHECK_SYMBOL_EXISTS(isnan math.h HAVE_ISNAN)
275 IF(NOT HAVE_ISNAN)
276     CHECK_FUNCTION_EXISTS(_isnan HAVE__ISNAN)
277     IF(NOT HAVE__ISNAN)
278         MESSAGE(FATAL_ERROR "No isnan function found, please report!")
279     ENDIF()
281     ADD_DEFINITIONS(-Disnan=_isnan)
282 ENDIF()
285 # Check for the dlopen API (for dynamicly loading backend libs)
286 IF(DLOPEN)
287     CHECK_INCLUDE_FILE(dlfcn.h HAVE_DLFCN_H)
288     IF(HAVE_DLFCN_H)
289         CHECK_LIBRARY_EXISTS(dl dlopen "" HAVE_LIBDL)
290         IF(HAVE_LIBDL)
291             SET(EXTRA_LIBS dl ${EXTRA_LIBS})
292         ENDIF()
293     ENDIF()
294 ENDIF()
296 # Check if we have Windows headers
297 CHECK_INCLUDE_FILE(windows.h HAVE_WINDOWS_H -D_WIN32_WINNT=0x0500)
298 IF(NOT HAVE_WINDOWS_H)
299     CHECK_FUNCTION_EXISTS(gettimeofday HAVE_GETTIMEOFDAY)
300     IF(NOT HAVE_GETTIMEOFDAY)
301         MESSAGE(FATAL_ERROR "No timing function found!")
302     ENDIF()
304     CHECK_FUNCTION_EXISTS(nanosleep HAVE_NANOSLEEP)
305     IF(NOT HAVE_NANOSLEEP)
306         MESSAGE(FATAL_ERROR "No sleep function found!")
307     ENDIF()
309     CHECK_C_COMPILER_FLAG(-pthread HAVE_PTHREAD)
310     IF(HAVE_PTHREAD)
311         ADD_DEFINITIONS(-pthread)
312         SET(EXTRA_LIBS ${EXTRA_LIBS} -pthread)
313     ENDIF()
315     # We need pthreads outside of Windows
316     CHECK_INCLUDE_FILE(pthread.h HAVE_PTHREAD_H)
317     IF(NOT HAVE_PTHREAD_H)
318         MESSAGE(FATAL_ERROR "PThreads is required for non-Windows builds!")
319     ENDIF()
320     # Some systems need pthread_np.h to get recursive mutexes
321     CHECK_INCLUDE_FILES("pthread.h;pthread_np.h" HAVE_PTHREAD_NP_H)
323     # _GNU_SOURCE is needed on some systems for extra attributes, and
324     # _REENTRANT is needed for libc thread-safety
325     ADD_DEFINITIONS(-D_GNU_SOURCE=1)
326     CHECK_LIBRARY_EXISTS(pthread pthread_create "" HAVE_LIBPTHREAD)
327     IF(HAVE_LIBPTHREAD)
328         SET(EXTRA_LIBS pthread ${EXTRA_LIBS})
329     ENDIF()
331     CHECK_LIBRARY_EXISTS(pthread pthread_setschedparam "" HAVE_PTHREAD_SETSCHEDPARAM)
333     CHECK_LIBRARY_EXISTS(rt clock_gettime "" HAVE_LIBRT)
334     IF(HAVE_LIBRT)
335         SET(EXTRA_LIBS rt ${EXTRA_LIBS})
336     ENDIF()
337 ENDIF()
339 # Check for a 64-bit type
340 CHECK_INCLUDE_FILE(stdint.h HAVE_STDINT_H)
341 IF(NOT HAVE_STDINT_H)
342     IF(HAVE_WINDOWS_H)
343         CHECK_C_SOURCE_COMPILES("\#define _WIN32_WINNT 0x0500
344                                  \#include <windows.h>
345                                  __int64 foo;
346                                  int main() {return 0;}" HAVE___INT64)
347     ENDIF()
348     IF(NOT HAVE___INT64)
349         IF(NOT SIZEOF_LONG MATCHES "8")
350             IF(NOT SIZEOF_LONG_LONG MATCHES "8")
351                 MESSAGE(FATAL_ERROR "No 64-bit types found, please report!")
352             ENDIF()
353         ENDIF()
354     ENDIF()
355 ENDIF()
357 # Windows needs winmm for timeGetTime, even if the backend is disabled
358 CHECK_SHARED_FUNCTION_EXISTS(timeGetTime "windows.h;mmsystem.h" winmm "" HAVE_LIBWINMM)
359 IF(HAVE_LIBWINMM)
360     SET(EXTRA_LIBS winmm ${EXTRA_LIBS})
361     SET(PKG_CONFIG_LIBS ${PKG_CONFIG_LIBS} -lwinmm)
362 ENDIF()
365 SET(OPENAL_OBJS  OpenAL32/alAuxEffectSlot.c
366                  OpenAL32/alBuffer.c
367                  OpenAL32/alEffect.c
368                  OpenAL32/alError.c
369                  OpenAL32/alExtension.c
370                  OpenAL32/alFilter.c
371                  OpenAL32/alListener.c
372                  OpenAL32/alSource.c
373                  OpenAL32/alState.c
374                  OpenAL32/alThunk.c
376 SET(ALC_OBJS  Alc/ALc.c
377               Alc/ALu.c
378               Alc/alcConfig.c
379               Alc/alcDedicated.c
380               Alc/alcEcho.c
381               Alc/alcModulator.c
382               Alc/alcReverb.c
383               Alc/alcRing.c
384               Alc/alcThread.c
385               Alc/bs2b.c
386               Alc/hrtf.c
387               Alc/mixer.c
388               Alc/panning.c
389               Alc/loopback.c
390               Alc/null.c
393 SET(BACKENDS "")
394 SET(HAVE_ALSA       0)
395 SET(HAVE_OSS        0)
396 SET(HAVE_SOLARIS    0)
397 SET(HAVE_SNDIO      0)
398 SET(HAVE_DSOUND     0)
399 SET(HAVE_WINMM      0)
400 SET(HAVE_PORTAUDIO  0)
401 SET(HAVE_PULSEAUDIO 0)
402 SET(HAVE_COREAUDIO  0)
403 SET(HAVE_OPENSL     0)
404 SET(HAVE_WAVE       0)
406 # Check ALSA backend
407 IF(ALSA)
408     CHECK_INCLUDE_FILE(alsa/asoundlib.h HAVE_ALSA_ASOUNDLIB_H)
409     IF(HAVE_ALSA_ASOUNDLIB_H)
410         CHECK_SHARED_FUNCTION_EXISTS(snd_pcm_open "alsa/asoundlib.h" asound "" HAVE_LIBASOUND)
411         IF(HAVE_LIBASOUND OR HAVE_DLFCN_H OR WIN32)
412             SET(HAVE_ALSA 1)
413             SET(ALC_OBJS  ${ALC_OBJS} Alc/alsa.c)
414             IF(HAVE_DLFCN_H OR WIN32)
415                 SET(BACKENDS  "${BACKENDS} ALSA,")
416             ELSE()
417                 SET(BACKENDS  "${BACKENDS} ALSA \(linked\),")
418                 SET(EXTRA_LIBS asound ${EXTRA_LIBS})
419             ENDIF()
420         ENDIF()
421     ENDIF()
422 ENDIF()
423 IF(REQUIRE_ALSA AND NOT HAVE_ALSA)
424     MESSAGE(FATAL_ERROR "Failed to enabled required ALSA backend")
425 ENDIF()
427 # Check OSS backend
428 IF(OSS)
429     CHECK_INCLUDE_FILE(sys/soundcard.h HAVE_SYS_SOUNDCARD_H)
430     IF(HAVE_SYS_SOUNDCARD_H)
431         SET(HAVE_OSS 1)
432         SET(ALC_OBJS  ${ALC_OBJS} Alc/oss.c)
433         SET(BACKENDS  "${BACKENDS} OSS,")
434     ENDIF()
435 ENDIF()
436 IF(REQUIRE_OSS AND NOT HAVE_OSS)
437     MESSAGE(FATAL_ERROR "Failed to enabled required OSS backend")
438 ENDIF()
440 # Check Solaris backend
441 IF(SOLARIS)
442     CHECK_INCLUDE_FILE(sys/audioio.h HAVE_SYS_AUDIOIO_H)
443     IF(HAVE_SYS_AUDIOIO_H)
444         SET(HAVE_SOLARIS 1)
445         SET(ALC_OBJS  ${ALC_OBJS} Alc/solaris.c)
446         SET(BACKENDS  "${BACKENDS} Solaris,")
447     ENDIF()
448 ENDIF()
449 IF(REQUIRE_SOLARIS AND NOT HAVE_SOLARIS)
450     MESSAGE(FATAL_ERROR "Failed to enabled required Solaris backend")
451 ENDIF()
453 # Check SndIO backend
454 IF(SNDIO)
455     CHECK_INCLUDE_FILE(sndio.h HAVE_SNDIO_H)
456     IF(HAVE_SNDIO_H)
457         CHECK_SHARED_FUNCTION_EXISTS(sio_open "sndio.h" sndio "" HAVE_LIBSNDIO)
458         IF(HAVE_LIBSNDIO OR HAVE_DLFCN_H OR WIN32)
459             SET(HAVE_SNDIO 1)
460             SET(ALC_OBJS  ${ALC_OBJS} Alc/sndio.c)
461             IF(HAVE_DLFCN_H OR WIN32)
462                 SET(BACKENDS  "${BACKENDS} SndIO,")
463             ELSE()
464                 SET(BACKENDS  "${BACKENDS} SndIO \(linked\),")
465                 SET(EXTRA_LIBS sndio ${EXTRA_LIBS})
466             ENDIF()
467         ENDIF()
468     ENDIF()
469 ENDIF()
470 IF(REQUIRE_SNDIO AND NOT HAVE_SNDIO)
471     MESSAGE(FATAL_ERROR "Failed to enabled required SndIO backend")
472 ENDIF()
474 # Check for MMDevApi backend
475 IF(HAVE_WINDOWS_H)
476     IF(MMDEVAPI)
477         CHECK_INCLUDE_FILE(mmdeviceapi.h HAVE_MMDEVICEAPI_H)
478         IF(HAVE_MMDEVICEAPI_H)
479             SET(HAVE_MMDEVAPI 1)
480             SET(ALC_OBJS  ${ALC_OBJS} Alc/mmdevapi.c)
482             SET(BACKENDS  "${BACKENDS} MMDevApi,")
483         ENDIF()
484     ENDIF()
485 ENDIF()
486 IF(REQUIRE_MMDEVAPI AND NOT HAVE_MMDEVAPI)
487     MESSAGE(FATAL_ERROR "Failed to enabled required MMDevApi backend")
488 ENDIF()
490 # Check DSound/MMSystem backend
491 IF(DSOUND)
492     CHECK_INCLUDE_FILE(dsound.h HAVE_DSOUND_H)
493     IF(HAVE_DSOUND_H)
494         CHECK_SHARED_FUNCTION_EXISTS(DirectSoundCreate "dsound.h" dsound "" HAVE_LIBDSOUND)
495         IF(HAVE_LIBDSOUND OR HAVE_DLFCN_H OR WIN32)
496             SET(HAVE_DSOUND 1)
497             SET(ALC_OBJS  ${ALC_OBJS} Alc/dsound.c)
499             IF(HAVE_DLFCN_H OR WIN32)
500                 SET(BACKENDS  "${BACKENDS} DirectSound,")
501             ELSE()
502                 SET(BACKENDS  "${BACKENDS} DirectSound \(linked\),")
503                 SET(EXTRA_LIBS dsound ${EXTRA_LIBS})
504             ENDIF()
505         ENDIF()
506     ENDIF()
507 ENDIF()
508 IF(REQUIRE_DSOUND AND NOT HAVE_DSOUND)
509     MESSAGE(FATAL_ERROR "Failed to enabled required DSound backend")
510 ENDIF()
512 IF(HAVE_WINDOWS_H)
513     IF(WINMM)
514         CHECK_INCLUDE_FILES("windows.h;mmsystem.h" HAVE_MMSYSTEM_H -D_WIN32_WINNT=0x0500)
515         IF(HAVE_MMSYSTEM_H AND HAVE_LIBWINMM)
516             SET(HAVE_WINMM 1)
517             SET(ALC_OBJS  ${ALC_OBJS} Alc/winmm.c)
518             SET(BACKENDS  "${BACKENDS} WinMM,")
519         ENDIF()
520     ENDIF()
521 ENDIF()
522 IF(REQUIRE_WINMM AND NOT HAVE_WINMM)
523     MESSAGE(FATAL_ERROR "Failed to enabled required WinMM backend")
524 ENDIF()
526 # Check PortAudio backend
527 IF(PORTAUDIO)
528     CHECK_INCLUDE_FILE(portaudio.h HAVE_PORTAUDIO_H)
529     IF(HAVE_PORTAUDIO_H)
530         CHECK_SHARED_FUNCTION_EXISTS(Pa_Initialize "portaudio.h" portaudio "" HAVE_LIBPORTAUDIO)
531         IF(HAVE_LIBPORTAUDIO OR HAVE_DLFCN_H OR WIN32)
532             SET(HAVE_PORTAUDIO 1)
533             SET(ALC_OBJS  ${ALC_OBJS} Alc/portaudio.c)
534             IF(HAVE_DLFCN_H OR WIN32)
535                 SET(BACKENDS  "${BACKENDS} PortAudio,")
536             ELSE()
537                 SET(BACKENDS  "${BACKENDS} PortAudio \(linked\),")
538                 SET(EXTRA_LIBS portaudio ${EXTRA_LIBS})
539             ENDIF()
540         ENDIF()
541     ENDIF()
542 ENDIF()
543 IF(REQUIRE_PORTAUDIO AND NOT HAVE_PORTAUDIO)
544     MESSAGE(FATAL_ERROR "Failed to enabled required PortAudio backend")
545 ENDIF()
547 # Check PulseAudio backend
548 IF(PULSEAUDIO)
549     CHECK_INCLUDE_FILE(pulse/pulseaudio.h HAVE_PULSE_PULSEAUDIO_H)
550     IF(HAVE_PULSE_PULSEAUDIO_H)
551         CHECK_SHARED_FUNCTION_EXISTS(pa_context_new "pulse/pulseaudio.h" pulse "" HAVE_LIBPULSE)
552         IF(HAVE_LIBPULSE OR HAVE_DLFCN_H OR WIN32)
553             SET(HAVE_PULSEAUDIO 1)
554             SET(ALC_OBJS  ${ALC_OBJS} Alc/pulseaudio.c)
555             IF(HAVE_DLFCN_H OR WIN32)
556                 SET(BACKENDS  "${BACKENDS} PulseAudio,")
557             ELSE()
558                 SET(BACKENDS  "${BACKENDS} PulseAudio \(linked\),")
559                 SET(EXTRA_LIBS pulse ${EXTRA_LIBS})
560             ENDIF()
561         ENDIF()
562     ENDIF()
563 ENDIF()
564 IF(REQUIRE_PULSEAUDIO AND NOT HAVE_PULSEAUDIO)
565     MESSAGE(FATAL_ERROR "Failed to enabled required PulseAudio backend")
566 ENDIF()
568 # Check CoreAudio backend
569 IF(COREAUDIO)
570     CHECK_INCLUDE_FILE(/System/Library/Frameworks/CoreAudio.framework/Headers/CoreAudio.h HAVE_COREAUDIO_FRAMEWORK)
571     IF(HAVE_COREAUDIO_FRAMEWORK)
572         SET(HAVE_COREAUDIO 1)
573         SET(ALC_OBJS  ${ALC_OBJS} Alc/coreaudio.c)
574         SET(BACKENDS  "${BACKENDS} CoreAudio,")
575         SET(EXTRA_LIBS /System/Library/Frameworks/CoreAudio.framework ${EXTRA_LIBS})
576         SET(EXTRA_LIBS /System/Library/Frameworks/AudioUnit.framework ${EXTRA_LIBS})
577         SET(EXTRA_LIBS /System/Library/Frameworks/ApplicationServices.framework ${EXTRA_LIBS})
578     ENDIF()
579 ENDIF()
580 IF(REQUIRE_COREAUDIO AND NOT HAVE_COREAUDIO)
581     MESSAGE(FATAL_ERROR "Failed to enabled required CoreAudio backend")
582 ENDIF()
584 # Check for OpenSL (Android) backend
585 IF(OPENSL)
586     CHECK_INCLUDE_FILE(SLES/OpenSLES_Android.h HAVE_SLES_OPENSLES_ANDROID_H)
587     IF(HAVE_SLES_OPENSLES_ANDROID_H)
588         CHECK_SHARED_FUNCTION_EXISTS(slCreateEngine "SLES/OpenSLES.h" OpenSLES "" HAVE_LIBOPENSLES)
589         IF(HAVE_LIBOPENSLES)
590             SET(HAVE_OPENSL 1)
591             SET(ALC_OBJS  ${ALC_OBJS} Alc/opensl.c)
592             SET(BACKENDS  "${BACKENDS} OpenSL,")
593             SET(EXTRA_LIBS OpenSLES ${EXTRA_LIBS})
594         ENDIF()
595     ENDIF()
596 ENDIF()
597 IF(REQUIRE_OPENSL AND NOT HAVE_OPENSL)
598     MESSAGE(FATAL_ERROR "Failed to enabled required OpenSL backend")
599 ENDIF()
601 # Optionally enable the Wave Writer backend
602 IF(WAVE)
603     SET(HAVE_WAVE 1)
604     SET(ALC_OBJS  ${ALC_OBJS} Alc/wave.c)
605     SET(BACKENDS  "${BACKENDS} WaveFile,")
606 ENDIF()
608 # This is always available
609 SET(BACKENDS  "${BACKENDS} Null")
611 IF(LIBTYPE STREQUAL "STATIC")
612     ADD_DEFINITIONS(-DAL_LIBTYPE_STATIC)
613     SET(PKG_CONFIG_CFLAGS -DAL_LIBTYPE_STATIC ${PKG_CONFIG_CFLAGS})
614 ENDIF()
616 # Needed for openal.pc.in
617 SET(prefix ${CMAKE_INSTALL_PREFIX})
618 SET(exec_prefix "\${prefix}")
619 SET(libdir "\${exec_prefix}/lib${LIB_SUFFIX}")
620 SET(bindir "\${exec_prefix}/bin")
621 SET(includedir "\${prefix}/include")
622 SET(PACKAGE_VERSION "${LIB_VERSION}")
624 # End configuration
625 CONFIGURE_FILE(
626     "${OpenAL_SOURCE_DIR}/config.h.in"
627     "${OpenAL_BINARY_DIR}/config.h")
628 CONFIGURE_FILE(
629     "${OpenAL_SOURCE_DIR}/openal.pc.in"
630     "${OpenAL_BINARY_DIR}/openal.pc"
631     @ONLY)
633 # Build a library
634 ADD_LIBRARY(${LIBNAME} ${LIBTYPE} ${OPENAL_OBJS} ${ALC_OBJS})
635 SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES DEFINE_SYMBOL AL_BUILD_LIBRARY
636                                             COMPILE_FLAGS -DAL_ALEXT_PROTOTYPES
637                                             VERSION ${LIB_VERSION}.0
638                                             SOVERSION ${LIB_MAJOR_VERSION})
639 IF(WIN32 AND NOT LIBTYPE STREQUAL "STATIC")
640     SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES PREFIX "")
641 ENDIF()
643 TARGET_LINK_LIBRARIES(${LIBNAME} ${EXTRA_LIBS})
645 # Add an install target here
646 INSTALL(TARGETS ${LIBNAME}
647         RUNTIME DESTINATION bin
648         LIBRARY DESTINATION "lib${LIB_SUFFIX}"
649         ARCHIVE DESTINATION "lib${LIB_SUFFIX}"
651 INSTALL(FILES include/AL/al.h
652               include/AL/alc.h
653               include/AL/alext.h
654               include/AL/efx.h
655               include/AL/efx-creative.h
656         DESTINATION include/AL
658 INSTALL(FILES "${OpenAL_BINARY_DIR}/openal.pc"
659         DESTINATION "lib${LIB_SUFFIX}/pkgconfig")
662 MESSAGE(STATUS "")
663 MESSAGE(STATUS "Building OpenAL with support for the following backends:")
664 MESSAGE(STATUS "    ${BACKENDS}")
665 MESSAGE(STATUS "")
667 IF(WIN32)
668     IF(NOT HAVE_DSOUND)
669         MESSAGE(STATUS "WARNING: Building the Windows version without DirectSound output")
670         MESSAGE(STATUS "         This is probably NOT what you want!")
671         MESSAGE(STATUS "")
672     ENDIF()
673 ENDIF()
675 # Install alsoft.conf configuration file
676 IF(ALSOFT_CONFIG)
677     INSTALL(FILES alsoftrc.sample
678             DESTINATION /etc/openal
679             RENAME alsoft.conf
680     )
681     MESSAGE(STATUS "Installing sample alsoft.conf")
682     MESSAGE(STATUS "")
683 ENDIF()
685 IF(UTILS)
686     ADD_EXECUTABLE(openal-info utils/openal-info.c)
687     TARGET_LINK_LIBRARIES(openal-info ${LIBNAME})
688     INSTALL(TARGETS openal-info
689             RUNTIME DESTINATION bin
690             LIBRARY DESTINATION "lib${LIB_SUFFIX}"
691             ARCHIVE DESTINATION "lib${LIB_SUFFIX}"
692     )
693     MESSAGE(STATUS "Building utility programs")
694     MESSAGE(STATUS "")
695 ENDIF()