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(stat HAVE_STAT)
156 CHECK_FUNCTION_EXISTS(strcasecmp HAVE_STRCASECMP)
157 IF(NOT HAVE_STRCASECMP)
158 CHECK_FUNCTION_EXISTS(_stricmp HAVE__STRICMP)
159 IF(NOT HAVE__STRICMP)
160 MESSAGE(FATAL_ERROR "No case-insensitive compare function found, please report!")
163 ADD_DEFINITIONS(-Dstrcasecmp=_stricmp)
166 CHECK_FUNCTION_EXISTS(strncasecmp HAVE_STRNCASECMP)
167 IF(NOT HAVE_STRNCASECMP)
168 CHECK_FUNCTION_EXISTS(_strnicmp HAVE__STRNICMP)
169 IF(NOT HAVE__STRNICMP)
170 MESSAGE(FATAL_ERROR "No case-insensitive size-limitted compare function found, please report!")
173 ADD_DEFINITIONS(-Dstrncasecmp=_strnicmp)
176 CHECK_FUNCTION_EXISTS(snprintf HAVE_SNPRINTF)
177 IF(NOT HAVE_SNPRINTF)
178 CHECK_FUNCTION_EXISTS(_snprintf HAVE__SNPRINTF)
179 IF(NOT HAVE__SNPRINTF)
180 MESSAGE(FATAL_ERROR "No snprintf function found, please report!")
183 ADD_DEFINITIONS(-Dsnprintf=_snprintf)
186 CHECK_FUNCTION_EXISTS(vsnprintf HAVE_VSNPRINTF)
187 IF(NOT HAVE_VSNPRINTF)
188 CHECK_FUNCTION_EXISTS(_vsnprintf HAVE__VSNPRINTF)
189 IF(NOT HAVE__VSNPRINTF)
190 MESSAGE(FATAL_ERROR "No vsnprintf function found, please report!")
193 ADD_DEFINITIONS(-Dvsnprintf=_vsnprintf)
196 CHECK_SYMBOL_EXISTS(isnan math.h HAVE_ISNAN)
198 CHECK_FUNCTION_EXISTS(_isnan HAVE__ISNAN)
200 MESSAGE(FATAL_ERROR "No isnan function found, please report!")
203 ADD_DEFINITIONS(-Disnan=_isnan)
207 # Check for the dlopen API (for dynamicly loading backend libs)
209 CHECK_INCLUDE_FILE(dlfcn.h HAVE_DLFCN_H)
211 CHECK_LIBRARY_EXISTS(dl dlopen "" HAVE_LIBDL)
213 SET(EXTRA_LIBS dl ${EXTRA_LIBS})
218 # Check if we have Windows headers
219 CHECK_INCLUDE_FILE(windows.h HAVE_WINDOWS_H -D_WIN32_WINNT=0x0500)
220 IF(NOT HAVE_WINDOWS_H)
221 CHECK_FUNCTION_EXISTS(gettimeofday HAVE_GETTIMEOFDAY)
222 IF(NOT HAVE_GETTIMEOFDAY)
223 MESSAGE(FATAL_ERROR "No timing function found!")
226 CHECK_FUNCTION_EXISTS(nanosleep HAVE_NANOSLEEP)
227 IF(NOT HAVE_NANOSLEEP)
228 MESSAGE(FATAL_ERROR "No sleep function found!")
231 CHECK_C_COMPILER_FLAG(-pthread HAVE_PTHREAD)
233 ADD_DEFINITIONS(-pthread)
234 SET(EXTRA_LIBS ${EXTRA_LIBS} -pthread)
237 # We need pthreads outside of Windows
238 CHECK_INCLUDE_FILE(pthread.h HAVE_PTHREAD_H)
239 IF(NOT HAVE_PTHREAD_H)
240 MESSAGE(FATAL_ERROR "PThreads is required for non-Windows builds!")
242 # Some systems need pthread_np.h to get recursive mutexes
243 CHECK_INCLUDE_FILES("pthread.h;pthread_np.h" HAVE_PTHREAD_NP_H)
245 # _GNU_SOURCE is needed on some systems for extra attributes, and
246 # _REENTRANT is needed for libc thread-safety
247 ADD_DEFINITIONS(-D_GNU_SOURCE=1)
248 CHECK_LIBRARY_EXISTS(pthread pthread_create "" HAVE_LIBPTHREAD)
250 SET(EXTRA_LIBS pthread ${EXTRA_LIBS})
253 CHECK_LIBRARY_EXISTS(pthread pthread_setschedparam "" HAVE_PTHREAD_SETSCHEDPARAM)
255 CHECK_LIBRARY_EXISTS(rt clock_gettime "" HAVE_LIBRT)
257 SET(EXTRA_LIBS rt ${EXTRA_LIBS})
261 # Check for a 64-bit type
262 CHECK_INCLUDE_FILE(stdint.h HAVE_STDINT_H)
263 IF(NOT HAVE_STDINT_H)
265 CHECK_C_SOURCE_COMPILES("\#define _WIN32_WINNT 0x0500
266 \#include <windows.h>
268 int main() {return 0;}" HAVE___INT64)
271 IF(NOT SIZEOF_LONG MATCHES "8")
272 IF(NOT SIZEOF_LONG_LONG MATCHES "8")
273 MESSAGE(FATAL_ERROR "No 64-bit types found, please report!")
280 SET(OPENAL_OBJS OpenAL32/alAuxEffectSlot.c
282 OpenAL32/alDatabuffer.c
285 OpenAL32/alExtension.c
287 OpenAL32/alListener.c
292 SET(ALC_OBJS Alc/ALc.c
307 CHECK_INCLUDE_FILE(alsa/asoundlib.h HAVE_ALSA_ASOUNDLIB_H)
308 IF(HAVE_ALSA_ASOUNDLIB_H)
309 CHECK_LIBRARY_EXISTS(asound snd_pcm_open "" HAVE_LIBASOUND)
310 IF(HAVE_DLFCN_H OR HAVE_LIBASOUND)
312 SET(ALC_OBJS ${ALC_OBJS} Alc/alsa.c)
314 SET(BACKENDS "${BACKENDS} ALSA,")
316 SET(BACKENDS "${BACKENDS} ALSA \(linked\),")
317 SET(EXTRA_LIBS asound ${EXTRA_LIBS})
325 CHECK_INCLUDE_FILE(sys/soundcard.h HAVE_SYS_SOUNDCARD_H)
326 IF(HAVE_SYS_SOUNDCARD_H)
328 SET(ALC_OBJS ${ALC_OBJS} Alc/oss.c)
329 SET(BACKENDS "${BACKENDS} OSS,")
333 # Check Solaris backend
335 CHECK_INCLUDE_FILE(sys/audioio.h HAVE_SYS_AUDIOIO_H)
336 IF(HAVE_SYS_AUDIOIO_H)
338 SET(ALC_OBJS ${ALC_OBJS} Alc/solaris.c)
339 SET(BACKENDS "${BACKENDS} Solaris,")
343 # Check DSound/MMSystem backend
345 CHECK_INCLUDE_FILE(dsound.h HAVE_DSOUND_H)
347 CHECK_LIBRARY_EXISTS(dsound DirectSoundCreate "" HAVE_LIBDSOUND)
348 IF(HAVE_LIBDSOUND OR WIN32)
350 SET(ALC_OBJS ${ALC_OBJS} Alc/dsound.c)
353 SET(BACKENDS "${BACKENDS} DirectSound,")
355 SET(BACKENDS "${BACKENDS} DirectSound \(linked\),")
356 SET(EXTRA_LIBS dsound ${EXTRA_LIBS})
363 CHECK_INCLUDE_FILES("windows.h;mmsystem.h" HAVE_MMSYSTEM_H -D_WIN32_WINNT=0x0500)
366 SET(ALC_OBJS ${ALC_OBJS} Alc/winmm.c)
367 SET(BACKENDS "${BACKENDS} WinMM,")
369 SET(CMAKE_REQUIRED_LIBRARIES winmm)
370 CHECK_C_SOURCE_COMPILES("int main() {return 0;}" HAVE_LIBWINMM)
371 SET(CMAKE_REQUIRED_LIBRARIES "")
372 # CHECK_LIBRARY_EXISTS(winmm waveInOpen "" HAVE_LIBWINMM)
374 SET(EXTRA_LIBS winmm ${EXTRA_LIBS})
380 # Check PortAudio backend
382 CHECK_INCLUDE_FILE(portaudio.h HAVE_PORTAUDIO_H)
384 CHECK_LIBRARY_EXISTS(portaudio Pa_Initialize "" HAVE_LIBPORTAUDIO)
385 IF(HAVE_LIBPORTAUDIO)
386 SET(HAVE_PORTAUDIO 1)
387 SET(ALC_OBJS ${ALC_OBJS} Alc/portaudio.c)
389 SET(BACKENDS "${BACKENDS} PortAudio,")
391 SET(BACKENDS "${BACKENDS} PortAudio \(linked\),")
392 SET(EXTRA_LIBS portaudio ${EXTRA_LIBS})
398 # Check PortAudio backend
400 CHECK_INCLUDE_FILE(pulse/pulseaudio.h HAVE_PULSE_PULSEAUDIO_H)
401 IF(HAVE_PULSE_PULSEAUDIO_H)
402 CHECK_LIBRARY_EXISTS(pulse pa_context_new "" HAVE_LIBPULSE)
404 SET(HAVE_PULSEAUDIO 1)
405 SET(ALC_OBJS ${ALC_OBJS} Alc/pulseaudio.c)
407 SET(BACKENDS "${BACKENDS} PulseAudio,")
409 SET(BACKENDS "${BACKENDS} PulseAudio \(linked\),")
410 SET(EXTRA_LIBS pulse ${EXTRA_LIBS})
416 # This is always available
417 SET(BACKENDS "${BACKENDS} WaveFile")
419 # Needed for openal.pc.in
420 SET(prefix ${CMAKE_INSTALL_PREFIX})
421 SET(exec_prefix "\${prefix}")
422 SET(libdir "\${exec_prefix}/${LIB_INSTALL_DIR}")
423 SET(bindir "\${exec_prefix}/bin")
424 SET(includedir "\${prefix}/include")
425 SET(PACKAGE_VERSION "${LIB_VERSION}")
429 "${OpenAL_SOURCE_DIR}/config.h.in"
430 "${OpenAL_BINARY_DIR}/config.h")
432 "${OpenAL_SOURCE_DIR}/openal.pc.in"
433 "${OpenAL_BINARY_DIR}/openal.pc"
436 ADD_DEFINITIONS(-DAL_BUILD_LIBRARY)
442 ADD_LIBRARY(${LIBNAME} ${LIBTYPE} ${OPENAL_OBJS} ${ALC_OBJS})
443 SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES VERSION ${LIB_VERSION}
444 SOVERSION ${LIB_MAJOR_VERSION})
446 SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES PREFIX "")
449 TARGET_LINK_LIBRARIES(${LIBNAME} ${EXTRA_LIBS})
451 # Add an install target here
452 INSTALL(TARGETS ${LIBNAME}
453 RUNTIME DESTINATION bin
454 LIBRARY DESTINATION ${LIB_INSTALL_DIR}
455 ARCHIVE DESTINATION ${LIB_INSTALL_DIR}
457 INSTALL(FILES include/AL/al.h
460 DESTINATION include/AL
462 INSTALL(FILES "${OpenAL_BINARY_DIR}/openal.pc"
463 DESTINATION "${LIB_INSTALL_DIR}/pkgconfig")
465 # Install alsoft.conf configuration file
467 INSTALL(FILES alsoftrc.sample
468 DESTINATION /etc/openal
474 ADD_EXECUTABLE(openal-info examples/openal-info.c)
475 TARGET_LINK_LIBRARIES(openal-info ${LIBNAME})
476 INSTALL(TARGETS openal-info
477 RUNTIME DESTINATION bin
478 LIBRARY DESTINATION ${LIB_INSTALL_DIR}
479 ARCHIVE DESTINATION ${LIB_INSTALL_DIR}
484 MESSAGE(STATUS "Building OpenAL with support for the following backends:")
485 MESSAGE(STATUS " ${BACKENDS}")
490 MESSAGE(STATUS "WARNING: Building the Windows version without DirectSound output")
491 MESSAGE(STATUS " This is probably NOT what you want!")