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(CheckIncludeFile)
14 INCLUDE(CheckIncludeFiles)
15 INCLUDE(CheckSymbolExists)
16 INCLUDE(CheckCCompilerFlag)
17 INCLUDE(CheckCSourceCompiles)
18 INCLUDE(CheckTypeSize)
24 SET(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS TRUE)
27 OPTION(ALSA "Check for ALSA backend" ON)
28 OPTION(OSS "Check for OSS backend" ON)
29 OPTION(SOLARIS "Check for Solaris backend" ON)
30 OPTION(DSOUND "Check for DirectSound backend" ON)
31 OPTION(WINMM "Check for Windows Multimedia backend" ON)
32 OPTION(PORTAUDIO "Check for PortAudio backend" ON)
33 OPTION(PULSEAUDIO "Check for PulseAudio backend" ON)
35 OPTION(DLOPEN "Check for the dlopen API for loading optional libs" ON)
37 OPTION(WERROR "Treat compile warnings as errors" OFF)
39 OPTION(EXAMPLES "Build example programs" ON)
41 OPTION(ALSOFT_CONFIG "Install alsoft.conf configuration file" OFF)
46 ADD_DEFINITIONS("-D_WIN32")
51 SET(LIB_MAJOR_VERSION "1")
52 SET(LIB_MINOR_VERSION "10")
53 SET(LIB_BUILD_VERSION "622")
54 SET(LIB_VERSION "${LIB_MAJOR_VERSION}.${LIB_MINOR_VERSION}.${LIB_BUILD_VERSION}")
55 IF(NOT DEFINED LIB_INSTALL_DIR)
56 SET(LIB_INSTALL_DIR "lib${LIB_SUFFIX}")
57 ENDIF(NOT DEFINED LIB_INSTALL_DIR)
60 CHECK_TYPE_SIZE("long" SIZEOF_LONG)
61 CHECK_TYPE_SIZE("long long" SIZEOF_LONG_LONG)
62 CHECK_TYPE_SIZE("unsigned int" SIZEOF_UINT)
63 CHECK_TYPE_SIZE("void*" SIZEOF_VOIDP)
66 # Add definitions, compiler switches, etc.
67 INCLUDE_DIRECTORIES(OpenAL32/Include include "${OpenAL_BINARY_DIR}")
69 IF(NOT CMAKE_BUILD_TYPE)
70 SET(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING
71 "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel."
74 IF(NOT CMAKE_DEBUG_POSTFIX)
75 SET(CMAKE_DEBUG_POSTFIX "" CACHE STRING
76 "Library postfix for debug builds. Normally left blank."
81 STRING(REGEX REPLACE "\\\\" "/" DXSDK_DIR "$ENV{DXSDK_DIR}")
83 STRING(REGEX REPLACE "\\\\" "/" DXSDK_DIR "${DXSDK_DIR}")
86 MESSAGE(STATUS "Using DirectX SDK directory: ${DXSDK_DIR}")
87 SET(CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES} "${DXSDK_DIR}/Include")
88 INCLUDE_DIRECTORIES("${DXSDK_DIR}/Include")
89 LINK_DIRECTORIES("${DXSDK_DIR}/Lib")
94 SET(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -D_DEBUG")
95 SET(CMAKE_C_FLAGS_MINSIZEREL "${CMAKE_C_FLAGS_MINSIZEREL} -DNDEBUG")
96 SET(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -DNDEBUG")
97 SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -D_DEBUG")
98 ADD_DEFINITIONS(-D_CRT_SECURE_NO_WARNINGS)
100 ADD_DEFINITIONS(-Wall)
101 CHECK_C_COMPILER_FLAG(-Wextra HAVE_W_EXTRA)
103 ADD_DEFINITIONS(-Wextra)
107 ADD_DEFINITIONS(-Werror)
110 SET(CMAKE_C_FLAGS_RELWITHDEBINFO "-g -O2 -funroll-loops -D_DEBUG" CACHE STRING
111 "Flags used by the compiler during Release with Debug Info builds."
113 SET(CMAKE_C_FLAGS_MINSIZEREL "-Os -DNDEBUG" CACHE STRING
114 "Flags used by the compiler during release minsize builds."
116 SET(CMAKE_C_FLAGS_RELEASE "-O2 -funroll-loops -fomit-frame-pointer -DNDEBUG" CACHE STRING
117 "Flags used by the compiler during release builds"
119 SET(CMAKE_C_FLAGS_DEBUG "-g3 -D_DEBUG" CACHE STRING
120 "Flags used by the compiler during debug builds."
123 # Set visibility options if available
125 CHECK_C_SOURCE_COMPILES("int foo() __attribute__((destructor));
126 int main() {return 0;}" HAVE_GCC_DESTRUCTOR)
128 CHECK_C_COMPILER_FLAG(-fvisibility=hidden HAVE_VISIBILITY_SWITCH)
129 IF(HAVE_VISIBILITY_SWITCH)
130 CHECK_C_SOURCE_COMPILES("int foo() __attribute__((visibility(\"default\")));
131 int main() {return 0;}" HAVE_GCC_VISIBILITY)
132 IF(HAVE_GCC_VISIBILITY)
133 ADD_DEFINITIONS(-fvisibility=hidden -DHAVE_GCC_VISIBILITY)
139 CHECK_INCLUDE_FILE(fenv.h HAVE_FENV_H)
140 CHECK_INCLUDE_FILE(float.h HAVE_FLOAT_H)
142 CHECK_LIBRARY_EXISTS(m sqrtf "" HAVE_SQRTF)
143 CHECK_LIBRARY_EXISTS(m acosf "" HAVE_ACOSF)
144 CHECK_LIBRARY_EXISTS(m atanf "" HAVE_ATANF)
145 CHECK_LIBRARY_EXISTS(m fabsf "" HAVE_FABSF)
147 CHECK_LIBRARY_EXISTS(m fesetround "" HAVE_FESETROUND)
149 IF(HAVE_SQRTF OR HAVE_ACOSF OR HAVE_ATANF OR HAVE_FABSF OR HAVE_FESETROUND)
150 SET(EXTRA_LIBS m ${EXTRA_LIBS})
152 CHECK_FUNCTION_EXISTS(strtof HAVE_STRTOF)
153 CHECK_FUNCTION_EXISTS(_controlfp HAVE__CONTROLFP)
155 CHECK_FUNCTION_EXISTS(strcasecmp HAVE_STRCASECMP)
156 IF(NOT HAVE_STRCASECMP)
157 CHECK_FUNCTION_EXISTS(_stricmp HAVE__STRICMP)
158 IF(NOT HAVE__STRICMP)
159 MESSAGE(FATAL_ERROR "No case-insensitive compare function found, please report!")
162 ADD_DEFINITIONS(-Dstrcasecmp=_stricmp)
165 CHECK_FUNCTION_EXISTS(strncasecmp HAVE_STRNCASECMP)
166 IF(NOT HAVE_STRNCASECMP)
167 CHECK_FUNCTION_EXISTS(_strnicmp HAVE__STRNICMP)
168 IF(NOT HAVE__STRNICMP)
169 MESSAGE(FATAL_ERROR "No case-insensitive size-limitted compare function found, please report!")
172 ADD_DEFINITIONS(-Dstrncasecmp=_strnicmp)
175 CHECK_FUNCTION_EXISTS(snprintf HAVE_SNPRINTF)
176 IF(NOT HAVE_SNPRINTF)
177 CHECK_FUNCTION_EXISTS(_snprintf HAVE__SNPRINTF)
178 IF(NOT HAVE__SNPRINTF)
179 MESSAGE(FATAL_ERROR "No snprintf function found, please report!")
182 ADD_DEFINITIONS(-Dsnprintf=_snprintf)
185 CHECK_FUNCTION_EXISTS(vsnprintf HAVE_VSNPRINTF)
186 IF(NOT HAVE_VSNPRINTF)
187 CHECK_FUNCTION_EXISTS(_vsnprintf HAVE__VSNPRINTF)
188 IF(NOT HAVE__VSNPRINTF)
189 MESSAGE(FATAL_ERROR "No vsnprintf function found, please report!")
192 ADD_DEFINITIONS(-Dvsnprintf=_vsnprintf)
195 CHECK_SYMBOL_EXISTS(isnan math.h HAVE_ISNAN)
197 CHECK_FUNCTION_EXISTS(_isnan HAVE__ISNAN)
199 MESSAGE(FATAL_ERROR "No isnan function found, please report!")
202 ADD_DEFINITIONS(-Disnan=_isnan)
206 # Check for the dlopen API (for dynamicly loading backend libs)
208 CHECK_INCLUDE_FILE(dlfcn.h HAVE_DLFCN_H)
210 CHECK_LIBRARY_EXISTS(dl dlopen "" HAVE_LIBDL)
212 SET(EXTRA_LIBS dl ${EXTRA_LIBS})
217 # Check if we have Windows headers
218 CHECK_INCLUDE_FILE(windows.h HAVE_WINDOWS_H -D_WIN32_WINNT=0x0500)
219 IF(NOT HAVE_WINDOWS_H)
220 CHECK_FUNCTION_EXISTS(gettimeofday HAVE_GETTIMEOFDAY)
221 IF(NOT HAVE_GETTIMEOFDAY)
222 MESSAGE(FATAL_ERROR "No timing function found!")
225 CHECK_FUNCTION_EXISTS(nanosleep HAVE_NANOSLEEP)
226 IF(NOT HAVE_NANOSLEEP)
227 MESSAGE(FATAL_ERROR "No sleep function found!")
230 CHECK_C_COMPILER_FLAG(-pthread HAVE_PTHREAD)
232 ADD_DEFINITIONS(-pthread)
233 SET(EXTRA_LIBS ${EXTRA_LIBS} -pthread)
236 # We need pthreads outside of Windows
237 CHECK_INCLUDE_FILE(pthread.h HAVE_PTHREAD_H)
238 IF(NOT HAVE_PTHREAD_H)
239 MESSAGE(FATAL_ERROR "PThreads is required for non-Windows builds!")
241 # Some systems need pthread_np.h to get recursive mutexes
242 CHECK_INCLUDE_FILES("pthread.h;pthread_np.h" HAVE_PTHREAD_NP_H)
244 # _GNU_SOURCE is needed on some systems for extra attributes, and
245 # _REENTRANT is needed for libc thread-safety
246 ADD_DEFINITIONS(-D_GNU_SOURCE=1)
247 CHECK_LIBRARY_EXISTS(pthread pthread_create "" HAVE_LIBPTHREAD)
249 SET(EXTRA_LIBS pthread ${EXTRA_LIBS})
252 CHECK_LIBRARY_EXISTS(pthread pthread_setschedparam "" HAVE_PTHREAD_SETSCHEDPARAM)
254 CHECK_LIBRARY_EXISTS(rt clock_gettime "" HAVE_LIBRT)
256 SET(EXTRA_LIBS rt ${EXTRA_LIBS})
260 # Check for a 64-bit type
261 CHECK_INCLUDE_FILE(stdint.h HAVE_STDINT_H)
262 IF(NOT HAVE_STDINT_H)
264 CHECK_C_SOURCE_COMPILES("\#define _WIN32_WINNT 0x0500
265 \#include <windows.h>
267 int main() {return 0;}" HAVE___INT64)
270 IF(NOT SIZEOF_LONG MATCHES "8")
271 IF(NOT SIZEOF_LONG_LONG MATCHES "8")
272 MESSAGE(FATAL_ERROR "No 64-bit types found, please report!")
279 SET(OPENAL_OBJS OpenAL32/alAuxEffectSlot.c
281 OpenAL32/alDatabuffer.c
284 OpenAL32/alExtension.c
286 OpenAL32/alListener.c
291 SET(ALC_OBJS Alc/ALc.c
306 CHECK_INCLUDE_FILE(alsa/asoundlib.h HAVE_ALSA_ASOUNDLIB_H)
307 IF(HAVE_ALSA_ASOUNDLIB_H)
308 CHECK_LIBRARY_EXISTS(asound snd_pcm_open "" HAVE_LIBASOUND)
309 IF(HAVE_DLFCN_H OR HAVE_LIBASOUND)
311 SET(ALC_OBJS ${ALC_OBJS} Alc/alsa.c)
313 SET(BACKENDS "${BACKENDS} ALSA,")
315 SET(BACKENDS "${BACKENDS} ALSA \(linked\),")
316 SET(EXTRA_LIBS asound ${EXTRA_LIBS})
324 CHECK_INCLUDE_FILE(sys/soundcard.h HAVE_SYS_SOUNDCARD_H)
325 IF(HAVE_SYS_SOUNDCARD_H)
327 SET(ALC_OBJS ${ALC_OBJS} Alc/oss.c)
328 SET(BACKENDS "${BACKENDS} OSS,")
332 # Check Solaris backend
334 CHECK_INCLUDE_FILE(sys/audioio.h HAVE_SYS_AUDIOIO_H)
335 IF(HAVE_SYS_AUDIOIO_H)
337 SET(ALC_OBJS ${ALC_OBJS} Alc/solaris.c)
338 SET(BACKENDS "${BACKENDS} Solaris,")
342 # Check DSound/MMSystem backend
344 CHECK_INCLUDE_FILE(dsound.h HAVE_DSOUND_H)
346 CHECK_LIBRARY_EXISTS(dsound DirectSoundCreate "" HAVE_LIBDSOUND)
347 IF(HAVE_LIBDSOUND OR WIN32)
349 SET(ALC_OBJS ${ALC_OBJS} Alc/dsound.c)
352 SET(BACKENDS "${BACKENDS} DirectSound,")
354 SET(BACKENDS "${BACKENDS} DirectSound \(linked\),")
355 SET(EXTRA_LIBS dsound ${EXTRA_LIBS})
362 CHECK_INCLUDE_FILES("windows.h;mmsystem.h" HAVE_MMSYSTEM_H -D_WIN32_WINNT=0x0500)
365 SET(ALC_OBJS ${ALC_OBJS} Alc/winmm.c)
366 SET(BACKENDS "${BACKENDS} WinMM,")
368 SET(CMAKE_REQUIRED_LIBRARIES winmm)
369 CHECK_C_SOURCE_COMPILES("int main() {return 0;}" HAVE_LIBWINMM)
370 SET(CMAKE_REQUIRED_LIBRARIES "")
371 # CHECK_LIBRARY_EXISTS(winmm waveInOpen "" HAVE_LIBWINMM)
373 SET(EXTRA_LIBS winmm ${EXTRA_LIBS})
379 # Check PortAudio backend
381 CHECK_INCLUDE_FILE(portaudio.h HAVE_PORTAUDIO_H)
383 CHECK_LIBRARY_EXISTS(portaudio Pa_Initialize "" HAVE_LIBPORTAUDIO)
384 IF(HAVE_LIBPORTAUDIO)
385 SET(HAVE_PORTAUDIO 1)
386 SET(ALC_OBJS ${ALC_OBJS} Alc/portaudio.c)
388 SET(BACKENDS "${BACKENDS} PortAudio,")
390 SET(BACKENDS "${BACKENDS} PortAudio \(linked\),")
391 SET(EXTRA_LIBS portaudio ${EXTRA_LIBS})
397 # Check PortAudio backend
399 CHECK_INCLUDE_FILE(pulse/pulseaudio.h HAVE_PULSE_PULSEAUDIO_H)
400 IF(HAVE_PULSE_PULSEAUDIO_H)
401 CHECK_LIBRARY_EXISTS(pulse pa_context_new "" HAVE_LIBPULSE)
403 SET(HAVE_PULSEAUDIO 1)
404 SET(ALC_OBJS ${ALC_OBJS} Alc/pulseaudio.c)
406 SET(BACKENDS "${BACKENDS} PulseAudio,")
408 SET(BACKENDS "${BACKENDS} PulseAudio \(linked\),")
409 SET(EXTRA_LIBS pulse ${EXTRA_LIBS})
415 # This is always available
416 SET(BACKENDS "${BACKENDS} WaveFile")
418 # Needed for openal.pc.in
419 SET(prefix ${CMAKE_INSTALL_PREFIX})
420 SET(exec_prefix "\${prefix}")
421 SET(libdir "\${exec_prefix}/${LIB_INSTALL_DIR}")
422 SET(bindir "\${exec_prefix}/bin")
423 SET(includedir "\${prefix}/include")
424 SET(PACKAGE_VERSION "${LIB_VERSION}")
428 "${OpenAL_SOURCE_DIR}/config.h.in"
429 "${OpenAL_BINARY_DIR}/config.h")
431 "${OpenAL_SOURCE_DIR}/openal.pc.in"
432 "${OpenAL_BINARY_DIR}/openal.pc"
435 ADD_DEFINITIONS(-DAL_BUILD_LIBRARY)
441 ADD_LIBRARY(${LIBNAME} ${LIBTYPE} ${OPENAL_OBJS} ${ALC_OBJS})
442 SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES VERSION ${LIB_VERSION}
443 SOVERSION ${LIB_MAJOR_VERSION})
445 SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES PREFIX "")
448 TARGET_LINK_LIBRARIES(${LIBNAME} ${EXTRA_LIBS})
450 # Add an install target here
451 INSTALL(TARGETS ${LIBNAME}
452 RUNTIME DESTINATION bin
453 LIBRARY DESTINATION ${LIB_INSTALL_DIR}
454 ARCHIVE DESTINATION ${LIB_INSTALL_DIR}
456 INSTALL(FILES include/AL/al.h
459 DESTINATION include/AL
461 INSTALL(FILES "${OpenAL_BINARY_DIR}/openal.pc"
462 DESTINATION "${LIB_INSTALL_DIR}/pkgconfig")
464 # Install alsoft.conf configuration file
466 INSTALL(FILES alsoftrc.sample
467 DESTINATION /etc/openal
473 ADD_EXECUTABLE(openal-info examples/openal-info.c)
474 TARGET_LINK_LIBRARIES(openal-info ${LIBNAME})
475 INSTALL(TARGETS openal-info
476 RUNTIME DESTINATION bin
477 LIBRARY DESTINATION ${LIB_INSTALL_DIR}
478 ARCHIVE DESTINATION ${LIB_INSTALL_DIR}
483 MESSAGE(STATUS "Building OpenAL with support for the following backends:")
484 MESSAGE(STATUS " ${BACKENDS}")
489 MESSAGE(STATUS "WARNING: Building the Windows version without DirectSound output")
490 MESSAGE(STATUS " This is probably NOT what you want!")