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(CheckSharedLibraryExists)
14 INCLUDE(CheckIncludeFile)
15 INCLUDE(CheckIncludeFiles)
16 INCLUDE(CheckSymbolExists)
17 INCLUDE(CheckCCompilerFlag)
18 INCLUDE(CheckCSourceCompiles)
19 INCLUDE(CheckTypeSize)
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(DSOUND "Check for DirectSound backend" ON)
32 OPTION(WINMM "Check for Windows Multimedia backend" ON)
33 OPTION(PORTAUDIO "Check for PortAudio backend" ON)
34 OPTION(PULSEAUDIO "Check for PulseAudio backend" ON)
35 OPTION(WAVE "Enable Wave Writer backend" ON)
37 OPTION(DLOPEN "Check for the dlopen API for loading optional libs" ON)
39 OPTION(WERROR "Treat compile warnings as errors" OFF)
41 OPTION(UTILS "Build and install utility programs" ON)
43 OPTION(ALSOFT_CONFIG "Install alsoft.conf configuration file" OFF)
48 ADD_DEFINITIONS("-D_WIN32")
53 SET(LIB_MAJOR_VERSION "1")
54 SET(LIB_MINOR_VERSION "12")
55 SET(LIB_VERSION "${LIB_MAJOR_VERSION}.${LIB_MINOR_VERSION}")
58 CHECK_TYPE_SIZE("long" SIZEOF_LONG)
59 CHECK_TYPE_SIZE("long long" SIZEOF_LONG_LONG)
60 CHECK_TYPE_SIZE("unsigned int" SIZEOF_UINT)
61 CHECK_TYPE_SIZE("void*" SIZEOF_VOIDP)
64 # Add definitions, compiler switches, etc.
65 INCLUDE_DIRECTORIES(OpenAL32/Include include "${OpenAL_BINARY_DIR}")
67 IF(NOT CMAKE_BUILD_TYPE)
68 SET(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING
69 "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel."
72 IF(NOT CMAKE_DEBUG_POSTFIX)
73 SET(CMAKE_DEBUG_POSTFIX "" CACHE STRING
74 "Library postfix for debug builds. Normally left blank."
80 SET(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -D_DEBUG")
81 SET(CMAKE_C_FLAGS_MINSIZEREL "${CMAKE_C_FLAGS_MINSIZEREL} -DNDEBUG")
82 SET(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -DNDEBUG")
83 SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -D_DEBUG")
84 ADD_DEFINITIONS(-D_CRT_SECURE_NO_WARNINGS)
85 ADD_DEFINITIONS(-D_CRT_NONSTDC_NO_DEPRECATE)
88 STRING(REGEX REPLACE "\\\\" "/" DXSDK_DIR "$ENV{DXSDK_DIR}")
90 STRING(REGEX REPLACE "\\\\" "/" DXSDK_DIR "${DXSDK_DIR}")
93 MESSAGE(STATUS "Using DirectX SDK directory: ${DXSDK_DIR}")
94 SET(CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES} "${DXSDK_DIR}/Include")
95 INCLUDE_DIRECTORIES("${DXSDK_DIR}/Include")
96 LINK_DIRECTORIES("${DXSDK_DIR}/Lib")
99 ADD_DEFINITIONS(-Wall)
100 CHECK_C_COMPILER_FLAG(-Wextra HAVE_W_EXTRA)
102 ADD_DEFINITIONS(-Wextra)
106 ADD_DEFINITIONS(-Werror)
109 SET(CMAKE_C_FLAGS_RELWITHDEBINFO "-g -O2 -funroll-loops -D_DEBUG" CACHE STRING
110 "Flags used by the compiler during Release with Debug Info builds."
112 SET(CMAKE_C_FLAGS_MINSIZEREL "-Os -DNDEBUG" CACHE STRING
113 "Flags used by the compiler during release minsize builds."
115 SET(CMAKE_C_FLAGS_RELEASE "-O2 -funroll-loops -fomit-frame-pointer -DNDEBUG" CACHE STRING
116 "Flags used by the compiler during release builds"
118 SET(CMAKE_C_FLAGS_DEBUG "-g3 -D_DEBUG" CACHE STRING
119 "Flags used by the compiler during debug builds."
122 # Set visibility options if available
124 CHECK_C_SOURCE_COMPILES("int foo() __attribute__((destructor));
125 int main() {return 0;}" HAVE_GCC_DESTRUCTOR)
127 CHECK_C_COMPILER_FLAG(-fvisibility=hidden HAVE_VISIBILITY_SWITCH)
128 IF(HAVE_VISIBILITY_SWITCH)
129 CHECK_C_SOURCE_COMPILES("int foo() __attribute__((visibility(\"default\")));
130 int main() {return 0;}" HAVE_GCC_VISIBILITY)
131 IF(HAVE_GCC_VISIBILITY)
132 ADD_DEFINITIONS(-fvisibility=hidden -DHAVE_GCC_VISIBILITY)
138 CHECK_C_SOURCE_COMPILES("int foo(const char *str, ...) __attribute__((format(printf, 1, 2)));
139 int main() {return 0;}" HAVE_GCC_FORMAT)
141 CHECK_INCLUDE_FILE(fenv.h HAVE_FENV_H)
142 CHECK_INCLUDE_FILE(float.h HAVE_FLOAT_H)
144 CHECK_LIBRARY_EXISTS(m powf "" HAVE_POWF)
145 CHECK_LIBRARY_EXISTS(m sqrtf "" HAVE_SQRTF)
146 CHECK_LIBRARY_EXISTS(m acosf "" HAVE_ACOSF)
147 CHECK_LIBRARY_EXISTS(m atanf "" HAVE_ATANF)
148 CHECK_LIBRARY_EXISTS(m fabsf "" HAVE_FABSF)
150 CHECK_LIBRARY_EXISTS(m fesetround "" HAVE_FESETROUND)
152 IF(HAVE_SQRTF OR HAVE_ACOSF OR HAVE_ATANF OR HAVE_FABSF OR HAVE_FESETROUND)
153 SET(EXTRA_LIBS m ${EXTRA_LIBS})
155 CHECK_FUNCTION_EXISTS(strtof HAVE_STRTOF)
156 CHECK_FUNCTION_EXISTS(_controlfp HAVE__CONTROLFP)
158 CHECK_FUNCTION_EXISTS(stat HAVE_STAT)
159 CHECK_FUNCTION_EXISTS(strcasecmp HAVE_STRCASECMP)
160 IF(NOT HAVE_STRCASECMP)
161 CHECK_FUNCTION_EXISTS(_stricmp HAVE__STRICMP)
162 IF(NOT HAVE__STRICMP)
163 MESSAGE(FATAL_ERROR "No case-insensitive compare function found, please report!")
166 ADD_DEFINITIONS(-Dstrcasecmp=_stricmp)
169 CHECK_FUNCTION_EXISTS(strncasecmp HAVE_STRNCASECMP)
170 IF(NOT HAVE_STRNCASECMP)
171 CHECK_FUNCTION_EXISTS(_strnicmp HAVE__STRNICMP)
172 IF(NOT HAVE__STRNICMP)
173 MESSAGE(FATAL_ERROR "No case-insensitive size-limitted compare function found, please report!")
176 ADD_DEFINITIONS(-Dstrncasecmp=_strnicmp)
179 CHECK_FUNCTION_EXISTS(snprintf HAVE_SNPRINTF)
180 IF(NOT HAVE_SNPRINTF)
181 CHECK_FUNCTION_EXISTS(_snprintf HAVE__SNPRINTF)
182 IF(NOT HAVE__SNPRINTF)
183 MESSAGE(FATAL_ERROR "No snprintf function found, please report!")
186 ADD_DEFINITIONS(-Dsnprintf=_snprintf)
189 CHECK_FUNCTION_EXISTS(vsnprintf HAVE_VSNPRINTF)
190 IF(NOT HAVE_VSNPRINTF)
191 CHECK_FUNCTION_EXISTS(_vsnprintf HAVE__VSNPRINTF)
192 IF(NOT HAVE__VSNPRINTF)
193 MESSAGE(FATAL_ERROR "No vsnprintf function found, please report!")
196 ADD_DEFINITIONS(-Dvsnprintf=_vsnprintf)
199 CHECK_SYMBOL_EXISTS(isnan math.h HAVE_ISNAN)
201 CHECK_FUNCTION_EXISTS(_isnan HAVE__ISNAN)
203 MESSAGE(FATAL_ERROR "No isnan function found, please report!")
206 ADD_DEFINITIONS(-Disnan=_isnan)
210 # Check for the dlopen API (for dynamicly loading backend libs)
212 CHECK_INCLUDE_FILE(dlfcn.h HAVE_DLFCN_H)
214 CHECK_LIBRARY_EXISTS(dl dlopen "" HAVE_LIBDL)
216 SET(EXTRA_LIBS dl ${EXTRA_LIBS})
221 # Check if we have Windows headers
222 CHECK_INCLUDE_FILE(windows.h HAVE_WINDOWS_H -D_WIN32_WINNT=0x0500)
223 IF(NOT HAVE_WINDOWS_H)
224 CHECK_FUNCTION_EXISTS(gettimeofday HAVE_GETTIMEOFDAY)
225 IF(NOT HAVE_GETTIMEOFDAY)
226 MESSAGE(FATAL_ERROR "No timing function found!")
229 CHECK_FUNCTION_EXISTS(nanosleep HAVE_NANOSLEEP)
230 IF(NOT HAVE_NANOSLEEP)
231 MESSAGE(FATAL_ERROR "No sleep function found!")
234 CHECK_C_COMPILER_FLAG(-pthread HAVE_PTHREAD)
236 ADD_DEFINITIONS(-pthread)
237 SET(EXTRA_LIBS ${EXTRA_LIBS} -pthread)
240 # We need pthreads outside of Windows
241 CHECK_INCLUDE_FILE(pthread.h HAVE_PTHREAD_H)
242 IF(NOT HAVE_PTHREAD_H)
243 MESSAGE(FATAL_ERROR "PThreads is required for non-Windows builds!")
245 # Some systems need pthread_np.h to get recursive mutexes
246 CHECK_INCLUDE_FILES("pthread.h;pthread_np.h" HAVE_PTHREAD_NP_H)
248 # _GNU_SOURCE is needed on some systems for extra attributes, and
249 # _REENTRANT is needed for libc thread-safety
250 ADD_DEFINITIONS(-D_GNU_SOURCE=1)
251 CHECK_LIBRARY_EXISTS(pthread pthread_create "" HAVE_LIBPTHREAD)
253 SET(EXTRA_LIBS pthread ${EXTRA_LIBS})
256 CHECK_LIBRARY_EXISTS(pthread pthread_setschedparam "" HAVE_PTHREAD_SETSCHEDPARAM)
258 CHECK_LIBRARY_EXISTS(rt clock_gettime "" HAVE_LIBRT)
260 SET(EXTRA_LIBS rt ${EXTRA_LIBS})
264 # Check for a 64-bit type
265 CHECK_INCLUDE_FILE(stdint.h HAVE_STDINT_H)
266 IF(NOT HAVE_STDINT_H)
268 CHECK_C_SOURCE_COMPILES("\#define _WIN32_WINNT 0x0500
269 \#include <windows.h>
271 int main() {return 0;}" HAVE___INT64)
274 IF(NOT SIZEOF_LONG MATCHES "8")
275 IF(NOT SIZEOF_LONG_LONG MATCHES "8")
276 MESSAGE(FATAL_ERROR "No 64-bit types found, please report!")
283 # Windows needs winmm for timeGetTime, even if the backend is disabled
284 CHECK_SHARED_LIBRARY_EXISTS(winmm timeGetTime 0 "" HAVE_LIBWINMM)
286 SET(EXTRA_LIBS winmm ${EXTRA_LIBS})
291 SET(OPENAL_OBJS OpenAL32/alAuxEffectSlot.c
293 OpenAL32/alDatabuffer.c
296 OpenAL32/alExtension.c
298 OpenAL32/alListener.c
303 SET(ALC_OBJS Alc/ALc.c
321 SET(HAVE_PORTAUDIO 0)
322 SET(HAVE_PULSEAUDIO 0)
327 CHECK_INCLUDE_FILE(alsa/asoundlib.h HAVE_ALSA_ASOUNDLIB_H)
328 IF(HAVE_ALSA_ASOUNDLIB_H)
329 CHECK_SHARED_LIBRARY_EXISTS(asound snd_pcm_open 4 "" HAVE_LIBASOUND)
330 IF(HAVE_LIBASOUND OR HAVE_DLFCN_H OR WIN32)
332 SET(ALC_OBJS ${ALC_OBJS} Alc/alsa.c)
333 IF(HAVE_DLFCN_H OR WIN32)
334 SET(BACKENDS "${BACKENDS} ALSA,")
336 SET(BACKENDS "${BACKENDS} ALSA \(linked\),")
337 SET(EXTRA_LIBS asound ${EXTRA_LIBS})
345 CHECK_INCLUDE_FILE(sys/soundcard.h HAVE_SYS_SOUNDCARD_H)
346 IF(HAVE_SYS_SOUNDCARD_H)
348 SET(ALC_OBJS ${ALC_OBJS} Alc/oss.c)
349 SET(BACKENDS "${BACKENDS} OSS,")
353 # Check Solaris backend
355 CHECK_INCLUDE_FILE(sys/audioio.h HAVE_SYS_AUDIOIO_H)
356 IF(HAVE_SYS_AUDIOIO_H)
358 SET(ALC_OBJS ${ALC_OBJS} Alc/solaris.c)
359 SET(BACKENDS "${BACKENDS} Solaris,")
363 # Check DSound/MMSystem backend
365 CHECK_INCLUDE_FILE(dsound.h HAVE_DSOUND_H)
367 CHECK_SHARED_LIBRARY_EXISTS(dsound DirectSoundCreate 3 "" HAVE_LIBDSOUND)
368 IF(HAVE_LIBDSOUND OR HAVE_DLFCN_H OR WIN32)
370 SET(ALC_OBJS ${ALC_OBJS} Alc/dsound.c)
372 IF(HAVE_DLFCN_H OR WIN32)
373 SET(BACKENDS "${BACKENDS} DirectSound,")
375 SET(BACKENDS "${BACKENDS} DirectSound \(linked\),")
376 SET(EXTRA_LIBS dsound ${EXTRA_LIBS})
384 CHECK_INCLUDE_FILES("windows.h;mmsystem.h" HAVE_MMSYSTEM_H -D_WIN32_WINNT=0x0500)
386 CHECK_SHARED_LIBRARY_EXISTS(winmm waveInOpen 6 "" HAVE_LIBWINMM)
389 SET(ALC_OBJS ${ALC_OBJS} Alc/winmm.c)
390 SET(BACKENDS "${BACKENDS} WinMM,")
392 SET(EXTRA_LIBS winmm ${EXTRA_LIBS})
398 # Check PortAudio backend
400 CHECK_INCLUDE_FILE(portaudio.h HAVE_PORTAUDIO_H)
402 CHECK_SHARED_LIBRARY_EXISTS(portaudio Pa_Initialize 0 "" HAVE_LIBPORTAUDIO)
403 IF(HAVE_LIBPORTAUDIO OR HAVE_DLFCN_H OR WIN32)
404 SET(HAVE_PORTAUDIO 1)
405 SET(ALC_OBJS ${ALC_OBJS} Alc/portaudio.c)
406 IF(HAVE_DLFCN_H OR WIN32)
407 SET(BACKENDS "${BACKENDS} PortAudio,")
409 SET(BACKENDS "${BACKENDS} PortAudio \(linked\),")
410 SET(EXTRA_LIBS portaudio ${EXTRA_LIBS})
416 # Check PortAudio backend
418 CHECK_INCLUDE_FILE(pulse/pulseaudio.h HAVE_PULSE_PULSEAUDIO_H)
419 IF(HAVE_PULSE_PULSEAUDIO_H)
420 CHECK_SHARED_LIBRARY_EXISTS(pulse pa_context_new 2 "" HAVE_LIBPULSE)
421 IF(HAVE_LIBPULSE OR HAVE_DLFCN_H OR WIN32)
422 SET(HAVE_PULSEAUDIO 1)
423 SET(ALC_OBJS ${ALC_OBJS} Alc/pulseaudio.c)
424 IF(HAVE_DLFCN_H OR WIN32)
425 SET(BACKENDS "${BACKENDS} PulseAudio,")
427 SET(BACKENDS "${BACKENDS} PulseAudio \(linked\),")
428 SET(EXTRA_LIBS pulse ${EXTRA_LIBS})
434 # Optionally enable the Wave Writer backend
437 SET(ALC_OBJS ${ALC_OBJS} Alc/wave.c)
438 SET(BACKENDS "${BACKENDS} WaveFile,")
441 # This is always available
442 SET(BACKENDS "${BACKENDS} Null")
444 # Needed for openal.pc.in
445 SET(prefix ${CMAKE_INSTALL_PREFIX})
446 SET(exec_prefix "\${prefix}")
447 SET(libdir "\${exec_prefix}/lib${LIB_SUFFIX}")
448 SET(bindir "\${exec_prefix}/bin")
449 SET(includedir "\${prefix}/include")
450 SET(PACKAGE_VERSION "${LIB_VERSION}")
454 "${OpenAL_SOURCE_DIR}/config.h.in"
455 "${OpenAL_BINARY_DIR}/config.h")
457 "${OpenAL_SOURCE_DIR}/openal.pc.in"
458 "${OpenAL_BINARY_DIR}/openal.pc"
465 ADD_LIBRARY(${LIBNAME} ${LIBTYPE} ${OPENAL_OBJS} ${ALC_OBJS})
466 SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES DEFINE_SYMBOL AL_BUILD_LIBRARY
467 COMPILE_FLAGS -DAL_ALEXT_PROTOTYPES
468 VERSION ${LIB_VERSION}
469 SOVERSION ${LIB_MAJOR_VERSION})
471 SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES PREFIX "")
474 TARGET_LINK_LIBRARIES(${LIBNAME} ${EXTRA_LIBS})
476 # Add an install target here
477 INSTALL(TARGETS ${LIBNAME}
478 RUNTIME DESTINATION bin
479 LIBRARY DESTINATION "lib${LIB_SUFFIX}"
480 ARCHIVE DESTINATION "lib${LIB_SUFFIX}"
482 INSTALL(FILES include/AL/al.h
486 include/AL/efx-creative.h
487 DESTINATION include/AL
489 INSTALL(FILES "${OpenAL_BINARY_DIR}/openal.pc"
490 DESTINATION "lib${LIB_SUFFIX}/pkgconfig")
494 MESSAGE(STATUS "Building OpenAL with support for the following backends:")
495 MESSAGE(STATUS " ${BACKENDS}")
500 MESSAGE(STATUS "WARNING: Building the Windows version without DirectSound output")
501 MESSAGE(STATUS " This is probably NOT what you want!")
506 # Install alsoft.conf configuration file
508 INSTALL(FILES alsoftrc.sample
509 DESTINATION /etc/openal
512 MESSAGE(STATUS "Installing sample alsoft.conf")
517 ADD_EXECUTABLE(openal-info utils/openal-info.c)
518 TARGET_LINK_LIBRARIES(openal-info ${LIBNAME})
519 INSTALL(TARGETS openal-info
520 RUNTIME DESTINATION bin
521 LIBRARY DESTINATION "lib${LIB_SUFFIX}"
522 ARCHIVE DESTINATION "lib${LIB_SUFFIX}"
524 MESSAGE(STATUS "Building utility programs")