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 INCLUDE(CheckFunctionExists)
10 INCLUDE(CheckLibraryExists)
11 INCLUDE(CheckIncludeFile)
12 INCLUDE(CheckIncludeFiles)
13 INCLUDE(CheckCCompilerFlag)
14 INCLUDE(CheckCSourceCompiles)
15 INCLUDE(CheckTypeSize)
21 SET(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS TRUE)
24 OPTION(ALSA "Check for ALSA backend" ON)
25 OPTION(OSS "Check for OSS backend" ON)
26 OPTION(SOLARIS "Check for Solaris backend" ON)
27 OPTION(DSOUND "Check for DirectSound backend" ON)
28 OPTION(WINMM "Check for Windows Multimedia backend" ON)
29 OPTION(PORTAUDIO "Check for PortAudio backend" ON)
30 OPTION(PULSEAUDIO "Check for PulseAudio backend" ON)
32 OPTION(DLOPEN "Check for the dlopen API for loading optional libs" ON)
34 OPTION(WERROR "Treat compile warnings as errors" OFF)
36 OPTION(EXAMPLES "Build example programs" ON)
41 ADD_DEFINITIONS("-D_WIN32")
46 SET(LIB_MAJOR_VERSION "1")
47 SET(LIB_MINOR_VERSION "7")
48 SET(LIB_BUILD_VERSION "411")
49 SET(LIB_VERSION "${LIB_MAJOR_VERSION}.${LIB_MINOR_VERSION}.${LIB_BUILD_VERSION}")
50 IF(NOT DEFINED LIB_INSTALL_DIR)
51 SET(LIB_INSTALL_DIR "lib${LIB_SUFFIX}")
52 ENDIF(NOT DEFINED LIB_INSTALL_DIR)
55 CHECK_TYPE_SIZE("long" SIZEOF_LONG)
56 CHECK_TYPE_SIZE("long long" SIZEOF_LONG_LONG)
57 CHECK_TYPE_SIZE("unsigned int" SIZEOF_UINT)
58 CHECK_TYPE_SIZE("void*" SIZEOF_VOIDP)
61 # Add definitions, compiler switches, etc.
62 INCLUDE_DIRECTORIES(OpenAL32/Include include "${OpenAL_BINARY_DIR}")
64 IF(NOT CMAKE_BUILD_TYPE)
65 SET(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING
66 "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel."
69 IF(NOT CMAKE_DEBUG_POSTFIX)
70 SET(CMAKE_DEBUG_POSTFIX "" CACHE STRING
71 "Library postfix for debug builds. Normally left blank."
77 SET(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -D_DEBUG")
78 SET(CMAKE_C_FLAGS_MINSIZEREL "${CMAKE_C_FLAGS_MINSIZEREL} -DNDEBUG")
79 SET(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -DNDEBUG")
80 SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -D_DEBUG")
82 ADD_DEFINITIONS(-Wall)
83 CHECK_C_COMPILER_FLAG(-Wextra HAVE_W_EXTRA)
85 ADD_DEFINITIONS(-Wextra)
89 ADD_DEFINITIONS(-Werror)
92 SET(CMAKE_C_FLAGS_RELWITHDEBINFO "-g -O2 -funroll-loops -D_DEBUG" CACHE STRING
93 "Flags used by the compiler during Release with Debug Info builds."
95 SET(CMAKE_C_FLAGS_MINSIZEREL "-Os -DNDEBUG" CACHE STRING
96 "Flags used by the compiler during release minsize builds."
98 SET(CMAKE_C_FLAGS_RELEASE "-O2 -funroll-loops -fomit-frame-pointer -DNDEBUG" CACHE STRING
99 "Flags used by the compiler during release builds"
101 SET(CMAKE_C_FLAGS_DEBUG "-g3 -D_DEBUG" CACHE STRING
102 "Flags used by the compiler during debug builds."
105 # Set visibility options if available
107 CHECK_C_SOURCE_COMPILES("int foo() __attribute__((destructor));
108 int main() {return 0;}" HAVE_GCC_DESTRUCTOR)
110 CHECK_C_COMPILER_FLAG(-fvisibility=hidden HAVE_VISIBILITY_SWITCH)
111 IF(HAVE_VISIBILITY_SWITCH)
112 CHECK_C_SOURCE_COMPILES("int foo() __attribute__((visibility(\"default\")));
113 int main() {return 0;}" HAVE_GCC_VISIBILITY)
114 IF(HAVE_GCC_VISIBILITY)
115 ADD_DEFINITIONS(-fvisibility=hidden -DHAVE_GCC_VISIBILITY)
121 CHECK_INCLUDE_FILE(fenv.h HAVE_FENV_H)
122 CHECK_INCLUDE_FILE(float.h HAVE_FLOAT_H)
124 CHECK_LIBRARY_EXISTS(m sqrtf "" HAVE_SQRTF)
125 CHECK_LIBRARY_EXISTS(m acosf "" HAVE_ACOSF)
126 CHECK_LIBRARY_EXISTS(m atanf "" HAVE_ATANF)
127 CHECK_LIBRARY_EXISTS(m fabsf "" HAVE_FABSF)
129 CHECK_LIBRARY_EXISTS(m fesetround "" HAVE_FESETROUND)
131 IF(HAVE_SQRTF OR HAVE_ACOSF OR HAVE_ATANF OR HAVE_FABSF OR HAVE_FESETROUND)
132 SET(EXTRA_LIBS m ${EXTRA_LIBS})
134 CHECK_FUNCTION_EXISTS(strtof HAVE_STRTOF)
135 CHECK_FUNCTION_EXISTS(_controlfp HAVE__CONTROLFP)
137 CHECK_FUNCTION_EXISTS(strcasecmp HAVE_STRCASECMP)
138 IF(NOT HAVE_STRCASECMP)
139 CHECK_FUNCTION_EXISTS(_stricmp HAVE__STRICMP)
140 IF(NOT HAVE__STRICMP)
141 MESSAGE(FATAL_ERROR "No case-insensitive compare function found, please report!")
144 ADD_DEFINITIONS(-Dstrcasecmp=_stricmp)
147 CHECK_FUNCTION_EXISTS(strncasecmp HAVE_STRNCASECMP)
148 IF(NOT HAVE_STRNCASECMP)
149 CHECK_FUNCTION_EXISTS(_strnicmp HAVE__STRNICMP)
150 IF(NOT HAVE__STRNICMP)
151 MESSAGE(FATAL_ERROR "No case-insensitive size-limitted compare function found, please report!")
154 ADD_DEFINITIONS(-Dstrncasecmp=_strnicmp)
157 CHECK_FUNCTION_EXISTS(snprintf HAVE_SNPRINTF)
158 IF(NOT HAVE_SNPRINTF)
159 CHECK_FUNCTION_EXISTS(_snprintf HAVE__SNPRINTF)
160 IF(NOT HAVE__SNPRINTF)
161 MESSAGE(FATAL_ERROR "No snprintf function found, please report!")
164 ADD_DEFINITIONS(-Dsnprintf=_snprintf)
167 # Check for the dlopen API (for dynamicly loading backend libs)
169 CHECK_INCLUDE_FILE(dlfcn.h HAVE_DLFCN_H)
171 CHECK_LIBRARY_EXISTS(dl dlopen "" HAVE_LIBDL)
173 SET(EXTRA_LIBS dl ${EXTRA_LIBS})
178 # Check if we have Windows headers
179 CHECK_INCLUDE_FILE(windows.h HAVE_WINDOWS_H -D_WIN32_WINNT=0x0500)
180 IF(NOT HAVE_WINDOWS_H)
181 CHECK_FUNCTION_EXISTS(gettimeofday HAVE_GETTIMEOFDAY)
182 IF(NOT HAVE_GETTIMEOFDAY)
183 MESSAGE(FATAL_ERROR "No timing function found!")
186 CHECK_FUNCTION_EXISTS(nanosleep HAVE_NANOSLEEP)
187 IF(NOT HAVE_NANOSLEEP)
188 MESSAGE(FATAL_ERROR "No sleep function found!")
191 # We need pthreads outside of Windows
192 CHECK_INCLUDE_FILE(pthread.h HAVE_PTHREAD_H)
193 IF(NOT HAVE_PTHREAD_H)
194 MESSAGE(FATAL_ERROR "PThreads is required for non-Windows builds!")
197 # Some systems need pthread_np.h to get recursive mutexes
198 CHECK_INCLUDE_FILES("pthread.h;pthread_np.h" HAVE_PTHREAD_NP_H)
200 # _GNU_SOURCE is needed on some systems for extra attributes, and
201 # _REENTRANT is needed for libc thread-safety
202 ADD_DEFINITIONS(-D_GNU_SOURCE=1 -D_REENTRANT)
203 CHECK_LIBRARY_EXISTS(pthread pthread_create "" HAVE_LIBPTHREAD)
205 SET(EXTRA_LIBS pthread ${EXTRA_LIBS})
209 # Check for a 64-bit type
210 CHECK_INCLUDE_FILE(stdint.h HAVE_STDINT_H)
211 IF(NOT HAVE_STDINT_H)
213 CHECK_C_SOURCE_COMPILES("\#define _WIN32_WINNT 0x0500
214 \#include <windows.h>
216 int main() {return 0;}" HAVE___INT64)
219 IF(NOT SIZEOF_LONG MATCHES "8")
220 IF(NOT SIZEOF_LONG_LONG MATCHES "8")
221 MESSAGE(FATAL_ERROR "No 64-bit types found, please report!")
228 SET(OPENAL_OBJS OpenAL32/alAuxEffectSlot.c
232 OpenAL32/alExtension.c
234 OpenAL32/alListener.c
239 SET(ALC_OBJS Alc/ALc.c
254 CHECK_INCLUDE_FILE(alsa/asoundlib.h HAVE_ALSA_ASOUNDLIB_H)
255 IF(HAVE_ALSA_ASOUNDLIB_H)
256 CHECK_LIBRARY_EXISTS(asound snd_pcm_open "" HAVE_LIBASOUND)
257 IF(HAVE_DLFCN_H OR HAVE_LIBASOUND)
259 SET(ALC_OBJS ${ALC_OBJS} Alc/alsa.c)
261 SET(BACKENDS "${BACKENDS} ALSA,")
263 SET(BACKENDS "${BACKENDS} ALSA \(linked\),")
264 SET(EXTRA_LIBS asound ${EXTRA_LIBS})
272 CHECK_INCLUDE_FILE(sys/soundcard.h HAVE_SYS_SOUNDCARD_H)
273 IF(HAVE_SYS_SOUNDCARD_H)
275 SET(ALC_OBJS ${ALC_OBJS} Alc/oss.c)
276 SET(BACKENDS "${BACKENDS} OSS,")
280 # Check Solaris backend
282 CHECK_INCLUDE_FILE(sys/audioio.h HAVE_SYS_AUDIOIO_H)
283 IF(HAVE_SYS_AUDIOIO_H)
285 SET(ALC_OBJS ${ALC_OBJS} Alc/solaris.c)
286 SET(BACKENDS "${BACKENDS} Solaris,")
290 # Check DSound/MMSystem backend
292 CHECK_INCLUDE_FILE(dsound.h HAVE_DSOUND_H)
294 CHECK_LIBRARY_EXISTS(dsound DirectSoundCreate "" HAVE_LIBDSOUND)
295 IF(HAVE_LIBDSOUND OR WIN32)
297 SET(ALC_OBJS ${ALC_OBJS} Alc/dsound.c)
300 SET(BACKENDS "${BACKENDS} DirectSound,")
302 SET(BACKENDS "${BACKENDS} DirectSound \(linked\),")
303 SET(EXTRA_LIBS dsound ${EXTRA_LIBS})
310 CHECK_INCLUDE_FILES("windows.h;mmsystem.h" HAVE_MMSYSTEM_H -D_WIN32_WINNT=0x0500)
313 SET(ALC_OBJS ${ALC_OBJS} Alc/winmm.c)
314 SET(BACKENDS "${BACKENDS} WinMM,")
316 SET(CMAKE_REQUIRED_LIBRARIES winmm)
317 CHECK_C_SOURCE_COMPILES("int main() {return 0;}" HAVE_LIBWINMM)
318 SET(CMAKE_REQUIRED_LIBRARIES "")
319 # CHECK_LIBRARY_EXISTS(winmm waveInOpen "" HAVE_LIBWINMM)
321 SET(EXTRA_LIBS winmm ${EXTRA_LIBS})
327 # Check PortAudio backend
329 CHECK_INCLUDE_FILE(portaudio.h HAVE_PORTAUDIO_H)
331 CHECK_LIBRARY_EXISTS(portaudio Pa_Initialize "" HAVE_LIBPORTAUDIO)
332 IF(HAVE_LIBPORTAUDIO)
333 SET(HAVE_PORTAUDIO 1)
334 SET(ALC_OBJS ${ALC_OBJS} Alc/portaudio.c)
336 SET(BACKENDS "${BACKENDS} PortAudio,")
338 SET(BACKENDS "${BACKENDS} PortAudio \(linked\),")
339 SET(EXTRA_LIBS portaudio ${EXTRA_LIBS})
345 # Check PortAudio backend
347 CHECK_INCLUDE_FILE(pulse/pulseaudio.h HAVE_PULSE_PULSEAUDIO_H)
348 IF(HAVE_PULSE_PULSEAUDIO_H)
349 CHECK_LIBRARY_EXISTS(pulse pa_context_new "" HAVE_LIBPULSE)
351 SET(HAVE_PULSEAUDIO 1)
352 SET(ALC_OBJS ${ALC_OBJS} Alc/pulseaudio.c)
353 SET(BACKENDS "${BACKENDS} PulseAudio \(linked\),")
355 SET(EXTRA_LIBS pulse ${EXTRA_LIBS})
360 # This is always available
361 SET(BACKENDS "${BACKENDS} WaveFile")
363 # Needed for openal.pc.in
364 SET(prefix ${CMAKE_INSTALL_PREFIX})
365 SET(exec_prefix "\${prefix}")
366 SET(libdir "\${exec_prefix}/${LIB_INSTALL_DIR}")
367 SET(bindir "\${exec_prefix}/bin")
368 SET(includedir "\${prefix}/include")
369 SET(PACKAGE_VERSION "${LIB_VERSION}")
373 "${OpenAL_SOURCE_DIR}/config.h.in"
374 "${OpenAL_BINARY_DIR}/config.h")
376 "${OpenAL_SOURCE_DIR}/admin/pkgconfig/openal.pc.in"
377 "${OpenAL_BINARY_DIR}/admin/pkgconfig/openal.pc"
380 ADD_DEFINITIONS(-DAL_BUILD_LIBRARY)
386 ADD_LIBRARY(${LIBNAME} ${LIBTYPE} ${OPENAL_OBJS} ${ALC_OBJS})
387 SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES VERSION ${LIB_VERSION}
388 SOVERSION ${LIB_MAJOR_VERSION})
390 SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES PREFIX "")
393 TARGET_LINK_LIBRARIES(${LIBNAME} ${EXTRA_LIBS})
395 # Add an install target here
396 INSTALL(TARGETS ${LIBNAME}
397 RUNTIME DESTINATION bin
398 LIBRARY DESTINATION ${LIB_INSTALL_DIR}
399 ARCHIVE DESTINATION ${LIB_INSTALL_DIR}
401 INSTALL(FILES include/AL/al.h
404 DESTINATION include/AL
406 INSTALL(FILES "${OpenAL_BINARY_DIR}/admin/pkgconfig/openal.pc"
407 DESTINATION "${LIB_INSTALL_DIR}/pkgconfig")
410 ADD_EXECUTABLE(openal-info examples/openal-info.c)
411 TARGET_LINK_LIBRARIES(openal-info ${LIBNAME})
412 INSTALL(TARGETS openal-info
413 RUNTIME DESTINATION bin
414 LIBRARY DESTINATION ${LIB_INSTALL_DIR}
415 ARCHIVE DESTINATION ${LIB_INSTALL_DIR}
420 MESSAGE(STATUS "Building OpenAL with support for the following backends:")
421 MESSAGE(STATUS " ${BACKENDS}")
426 MESSAGE(STATUS "WARNING: Building the Windows version without DirectSound output")
427 MESSAGE(STATUS " This is probably NOT what you want!")