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)
38 OPTION(ALSOFT_CONFIG "Install alsoft.conf configuration file" OFF)
43 ADD_DEFINITIONS("-D_WIN32")
48 SET(LIB_MAJOR_VERSION "1")
49 SET(LIB_MINOR_VERSION "7")
50 SET(LIB_BUILD_VERSION "411")
51 SET(LIB_VERSION "${LIB_MAJOR_VERSION}.${LIB_MINOR_VERSION}.${LIB_BUILD_VERSION}")
52 IF(NOT DEFINED LIB_INSTALL_DIR)
53 SET(LIB_INSTALL_DIR "lib${LIB_SUFFIX}")
54 ENDIF(NOT DEFINED LIB_INSTALL_DIR)
57 CHECK_TYPE_SIZE("long" SIZEOF_LONG)
58 CHECK_TYPE_SIZE("long long" SIZEOF_LONG_LONG)
59 CHECK_TYPE_SIZE("unsigned int" SIZEOF_UINT)
60 CHECK_TYPE_SIZE("void*" SIZEOF_VOIDP)
63 # Add definitions, compiler switches, etc.
64 INCLUDE_DIRECTORIES(OpenAL32/Include include "${OpenAL_BINARY_DIR}")
66 IF(NOT CMAKE_BUILD_TYPE)
67 SET(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING
68 "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel."
71 IF(NOT CMAKE_DEBUG_POSTFIX)
72 SET(CMAKE_DEBUG_POSTFIX "" CACHE STRING
73 "Library postfix for debug builds. Normally left blank."
79 SET(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -D_DEBUG")
80 SET(CMAKE_C_FLAGS_MINSIZEREL "${CMAKE_C_FLAGS_MINSIZEREL} -DNDEBUG")
81 SET(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -DNDEBUG")
82 SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -D_DEBUG")
84 ADD_DEFINITIONS(-Wall)
85 CHECK_C_COMPILER_FLAG(-Wextra HAVE_W_EXTRA)
87 ADD_DEFINITIONS(-Wextra)
91 ADD_DEFINITIONS(-Werror)
94 SET(CMAKE_C_FLAGS_RELWITHDEBINFO "-g -O2 -funroll-loops -D_DEBUG" CACHE STRING
95 "Flags used by the compiler during Release with Debug Info builds."
97 SET(CMAKE_C_FLAGS_MINSIZEREL "-Os -DNDEBUG" CACHE STRING
98 "Flags used by the compiler during release minsize builds."
100 SET(CMAKE_C_FLAGS_RELEASE "-O2 -funroll-loops -fomit-frame-pointer -DNDEBUG" CACHE STRING
101 "Flags used by the compiler during release builds"
103 SET(CMAKE_C_FLAGS_DEBUG "-g3 -D_DEBUG" CACHE STRING
104 "Flags used by the compiler during debug builds."
107 # Set visibility options if available
109 CHECK_C_SOURCE_COMPILES("int foo() __attribute__((destructor));
110 int main() {return 0;}" HAVE_GCC_DESTRUCTOR)
112 CHECK_C_COMPILER_FLAG(-fvisibility=hidden HAVE_VISIBILITY_SWITCH)
113 IF(HAVE_VISIBILITY_SWITCH)
114 CHECK_C_SOURCE_COMPILES("int foo() __attribute__((visibility(\"default\")));
115 int main() {return 0;}" HAVE_GCC_VISIBILITY)
116 IF(HAVE_GCC_VISIBILITY)
117 ADD_DEFINITIONS(-fvisibility=hidden -DHAVE_GCC_VISIBILITY)
123 CHECK_INCLUDE_FILE(fenv.h HAVE_FENV_H)
124 CHECK_INCLUDE_FILE(float.h HAVE_FLOAT_H)
126 CHECK_LIBRARY_EXISTS(m sqrtf "" HAVE_SQRTF)
127 CHECK_LIBRARY_EXISTS(m acosf "" HAVE_ACOSF)
128 CHECK_LIBRARY_EXISTS(m atanf "" HAVE_ATANF)
129 CHECK_LIBRARY_EXISTS(m fabsf "" HAVE_FABSF)
131 CHECK_LIBRARY_EXISTS(m fesetround "" HAVE_FESETROUND)
133 IF(HAVE_SQRTF OR HAVE_ACOSF OR HAVE_ATANF OR HAVE_FABSF OR HAVE_FESETROUND)
134 SET(EXTRA_LIBS m ${EXTRA_LIBS})
136 CHECK_FUNCTION_EXISTS(strtof HAVE_STRTOF)
137 CHECK_FUNCTION_EXISTS(_controlfp HAVE__CONTROLFP)
139 CHECK_FUNCTION_EXISTS(strcasecmp HAVE_STRCASECMP)
140 IF(NOT HAVE_STRCASECMP)
141 CHECK_FUNCTION_EXISTS(_stricmp HAVE__STRICMP)
142 IF(NOT HAVE__STRICMP)
143 MESSAGE(FATAL_ERROR "No case-insensitive compare function found, please report!")
146 ADD_DEFINITIONS(-Dstrcasecmp=_stricmp)
149 CHECK_FUNCTION_EXISTS(strncasecmp HAVE_STRNCASECMP)
150 IF(NOT HAVE_STRNCASECMP)
151 CHECK_FUNCTION_EXISTS(_strnicmp HAVE__STRNICMP)
152 IF(NOT HAVE__STRNICMP)
153 MESSAGE(FATAL_ERROR "No case-insensitive size-limitted compare function found, please report!")
156 ADD_DEFINITIONS(-Dstrncasecmp=_strnicmp)
159 CHECK_FUNCTION_EXISTS(snprintf HAVE_SNPRINTF)
160 IF(NOT HAVE_SNPRINTF)
161 CHECK_FUNCTION_EXISTS(_snprintf HAVE__SNPRINTF)
162 IF(NOT HAVE__SNPRINTF)
163 MESSAGE(FATAL_ERROR "No snprintf function found, please report!")
166 ADD_DEFINITIONS(-Dsnprintf=_snprintf)
169 # Check for the dlopen API (for dynamicly loading backend libs)
171 CHECK_INCLUDE_FILE(dlfcn.h HAVE_DLFCN_H)
173 CHECK_LIBRARY_EXISTS(dl dlopen "" HAVE_LIBDL)
175 SET(EXTRA_LIBS dl ${EXTRA_LIBS})
180 # Check if we have Windows headers
181 CHECK_INCLUDE_FILE(windows.h HAVE_WINDOWS_H -D_WIN32_WINNT=0x0500)
182 IF(NOT HAVE_WINDOWS_H)
183 CHECK_FUNCTION_EXISTS(gettimeofday HAVE_GETTIMEOFDAY)
184 IF(NOT HAVE_GETTIMEOFDAY)
185 MESSAGE(FATAL_ERROR "No timing function found!")
188 CHECK_FUNCTION_EXISTS(nanosleep HAVE_NANOSLEEP)
189 IF(NOT HAVE_NANOSLEEP)
190 MESSAGE(FATAL_ERROR "No sleep function found!")
193 # We need pthreads outside of Windows
194 CHECK_INCLUDE_FILE(pthread.h HAVE_PTHREAD_H)
195 IF(NOT HAVE_PTHREAD_H)
196 MESSAGE(FATAL_ERROR "PThreads is required for non-Windows builds!")
199 # Some systems need pthread_np.h to get recursive mutexes
200 CHECK_INCLUDE_FILES("pthread.h;pthread_np.h" HAVE_PTHREAD_NP_H)
202 # _GNU_SOURCE is needed on some systems for extra attributes, and
203 # _REENTRANT is needed for libc thread-safety
204 ADD_DEFINITIONS(-D_GNU_SOURCE=1 -D_REENTRANT)
205 CHECK_LIBRARY_EXISTS(pthread pthread_create "" HAVE_LIBPTHREAD)
207 SET(EXTRA_LIBS pthread ${EXTRA_LIBS})
211 # Check for a 64-bit type
212 CHECK_INCLUDE_FILE(stdint.h HAVE_STDINT_H)
213 IF(NOT HAVE_STDINT_H)
215 CHECK_C_SOURCE_COMPILES("\#define _WIN32_WINNT 0x0500
216 \#include <windows.h>
218 int main() {return 0;}" HAVE___INT64)
221 IF(NOT SIZEOF_LONG MATCHES "8")
222 IF(NOT SIZEOF_LONG_LONG MATCHES "8")
223 MESSAGE(FATAL_ERROR "No 64-bit types found, please report!")
230 SET(OPENAL_OBJS OpenAL32/alAuxEffectSlot.c
234 OpenAL32/alExtension.c
236 OpenAL32/alListener.c
241 SET(ALC_OBJS Alc/ALc.c
256 CHECK_INCLUDE_FILE(alsa/asoundlib.h HAVE_ALSA_ASOUNDLIB_H)
257 IF(HAVE_ALSA_ASOUNDLIB_H)
258 CHECK_LIBRARY_EXISTS(asound snd_pcm_open "" HAVE_LIBASOUND)
259 IF(HAVE_DLFCN_H OR HAVE_LIBASOUND)
261 SET(ALC_OBJS ${ALC_OBJS} Alc/alsa.c)
263 SET(BACKENDS "${BACKENDS} ALSA,")
265 SET(BACKENDS "${BACKENDS} ALSA \(linked\),")
266 SET(EXTRA_LIBS asound ${EXTRA_LIBS})
274 CHECK_INCLUDE_FILE(sys/soundcard.h HAVE_SYS_SOUNDCARD_H)
275 IF(HAVE_SYS_SOUNDCARD_H)
277 SET(ALC_OBJS ${ALC_OBJS} Alc/oss.c)
278 SET(BACKENDS "${BACKENDS} OSS,")
282 # Check Solaris backend
284 CHECK_INCLUDE_FILE(sys/audioio.h HAVE_SYS_AUDIOIO_H)
285 IF(HAVE_SYS_AUDIOIO_H)
287 SET(ALC_OBJS ${ALC_OBJS} Alc/solaris.c)
288 SET(BACKENDS "${BACKENDS} Solaris,")
292 # Check DSound/MMSystem backend
294 CHECK_INCLUDE_FILE(dsound.h HAVE_DSOUND_H)
296 CHECK_LIBRARY_EXISTS(dsound DirectSoundCreate "" HAVE_LIBDSOUND)
297 IF(HAVE_LIBDSOUND OR WIN32)
299 SET(ALC_OBJS ${ALC_OBJS} Alc/dsound.c)
302 SET(BACKENDS "${BACKENDS} DirectSound,")
304 SET(BACKENDS "${BACKENDS} DirectSound \(linked\),")
305 SET(EXTRA_LIBS dsound ${EXTRA_LIBS})
312 CHECK_INCLUDE_FILES("windows.h;mmsystem.h" HAVE_MMSYSTEM_H -D_WIN32_WINNT=0x0500)
315 SET(ALC_OBJS ${ALC_OBJS} Alc/winmm.c)
316 SET(BACKENDS "${BACKENDS} WinMM,")
318 SET(CMAKE_REQUIRED_LIBRARIES winmm)
319 CHECK_C_SOURCE_COMPILES("int main() {return 0;}" HAVE_LIBWINMM)
320 SET(CMAKE_REQUIRED_LIBRARIES "")
321 # CHECK_LIBRARY_EXISTS(winmm waveInOpen "" HAVE_LIBWINMM)
323 SET(EXTRA_LIBS winmm ${EXTRA_LIBS})
329 # Check PortAudio backend
331 CHECK_INCLUDE_FILE(portaudio.h HAVE_PORTAUDIO_H)
333 CHECK_LIBRARY_EXISTS(portaudio Pa_Initialize "" HAVE_LIBPORTAUDIO)
334 IF(HAVE_LIBPORTAUDIO)
335 SET(HAVE_PORTAUDIO 1)
336 SET(ALC_OBJS ${ALC_OBJS} Alc/portaudio.c)
338 SET(BACKENDS "${BACKENDS} PortAudio,")
340 SET(BACKENDS "${BACKENDS} PortAudio \(linked\),")
341 SET(EXTRA_LIBS portaudio ${EXTRA_LIBS})
347 # Check PortAudio backend
349 CHECK_INCLUDE_FILE(pulse/pulseaudio.h HAVE_PULSE_PULSEAUDIO_H)
350 IF(HAVE_PULSE_PULSEAUDIO_H)
351 CHECK_LIBRARY_EXISTS(pulse pa_context_new "" HAVE_LIBPULSE)
353 SET(HAVE_PULSEAUDIO 1)
354 SET(ALC_OBJS ${ALC_OBJS} Alc/pulseaudio.c)
356 SET(BACKENDS "${BACKENDS} PulseAudio,")
358 SET(BACKENDS "${BACKENDS} PulseAudio \(linked\),")
359 SET(EXTRA_LIBS pulse ${EXTRA_LIBS})
365 # This is always available
366 SET(BACKENDS "${BACKENDS} WaveFile")
368 # Needed for openal.pc.in
369 SET(prefix ${CMAKE_INSTALL_PREFIX})
370 SET(exec_prefix "\${prefix}")
371 SET(libdir "\${exec_prefix}/${LIB_INSTALL_DIR}")
372 SET(bindir "\${exec_prefix}/bin")
373 SET(includedir "\${prefix}/include")
374 SET(PACKAGE_VERSION "${LIB_VERSION}")
378 "${OpenAL_SOURCE_DIR}/config.h.in"
379 "${OpenAL_BINARY_DIR}/config.h")
381 "${OpenAL_SOURCE_DIR}/admin/pkgconfig/openal.pc.in"
382 "${OpenAL_BINARY_DIR}/admin/pkgconfig/openal.pc"
385 ADD_DEFINITIONS(-DAL_BUILD_LIBRARY)
391 ADD_LIBRARY(${LIBNAME} ${LIBTYPE} ${OPENAL_OBJS} ${ALC_OBJS})
392 SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES VERSION ${LIB_VERSION}
393 SOVERSION ${LIB_MAJOR_VERSION})
395 SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES PREFIX "")
398 TARGET_LINK_LIBRARIES(${LIBNAME} ${EXTRA_LIBS})
400 # Add an install target here
401 INSTALL(TARGETS ${LIBNAME}
402 RUNTIME DESTINATION bin
403 LIBRARY DESTINATION ${LIB_INSTALL_DIR}
404 ARCHIVE DESTINATION ${LIB_INSTALL_DIR}
406 INSTALL(FILES include/AL/al.h
409 DESTINATION include/AL
411 INSTALL(FILES "${OpenAL_BINARY_DIR}/admin/pkgconfig/openal.pc"
412 DESTINATION "${LIB_INSTALL_DIR}/pkgconfig")
414 # Install alsoft.conf configuration file
416 INSTALL(FILES alsoftrc.sample
417 DESTINATION /etc/openal
423 ADD_EXECUTABLE(openal-info examples/openal-info.c)
424 TARGET_LINK_LIBRARIES(openal-info ${LIBNAME})
425 INSTALL(TARGETS openal-info
426 RUNTIME DESTINATION bin
427 LIBRARY DESTINATION ${LIB_INSTALL_DIR}
428 ARCHIVE DESTINATION ${LIB_INSTALL_DIR}
433 MESSAGE(STATUS "Building OpenAL with support for the following backends:")
434 MESSAGE(STATUS " ${BACKENDS}")
439 MESSAGE(STATUS "WARNING: Building the Windows version without DirectSound output")
440 MESSAGE(STATUS " This is probably NOT what you want!")