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")
57 SET(LIB_MAJOR_VERSION "1")
58 SET(LIB_MINOR_VERSION "13")
59 SET(LIB_VERSION "${LIB_MAJOR_VERSION}.${LIB_MINOR_VERSION}")
62 CHECK_TYPE_SIZE("long" SIZEOF_LONG)
63 CHECK_TYPE_SIZE("long long" SIZEOF_LONG_LONG)
64 CHECK_TYPE_SIZE("unsigned int" SIZEOF_UINT)
65 CHECK_TYPE_SIZE("void*" SIZEOF_VOIDP)
68 # Add definitions, compiler switches, etc.
69 INCLUDE_DIRECTORIES(OpenAL32/Include include "${OpenAL_BINARY_DIR}")
71 IF(NOT CMAKE_BUILD_TYPE)
72 SET(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING
73 "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel."
76 IF(NOT CMAKE_DEBUG_POSTFIX)
77 SET(CMAKE_DEBUG_POSTFIX "" CACHE STRING
78 "Library postfix for debug builds. Normally left blank."
84 SET(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -D_DEBUG")
85 SET(CMAKE_C_FLAGS_MINSIZEREL "${CMAKE_C_FLAGS_MINSIZEREL} -DNDEBUG")
86 SET(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -DNDEBUG")
87 SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -D_DEBUG")
88 ADD_DEFINITIONS(-D_CRT_SECURE_NO_WARNINGS)
89 ADD_DEFINITIONS(-D_CRT_NONSTDC_NO_DEPRECATE)
92 STRING(REGEX REPLACE "\\\\" "/" DXSDK_DIR "$ENV{DXSDK_DIR}")
94 STRING(REGEX REPLACE "\\\\" "/" DXSDK_DIR "${DXSDK_DIR}")
97 MESSAGE(STATUS "Using DirectX SDK directory: ${DXSDK_DIR}")
98 SET(CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES} "${DXSDK_DIR}/Include")
99 INCLUDE_DIRECTORIES("${DXSDK_DIR}/Include")
100 LINK_DIRECTORIES("${DXSDK_DIR}/Lib")
103 OPTION(FORCE_STATIC_VCRT "Force /MT for static VC runtimes" OFF)
104 IF(FORCE_STATIC_VCRT)
106 CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE
107 CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO)
108 IF(${flag_var} MATCHES "/MD")
109 STRING(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}")
114 ADD_DEFINITIONS(-Winline -Wall)
115 CHECK_C_COMPILER_FLAG(-Wextra HAVE_W_EXTRA)
117 ADD_DEFINITIONS(-Wextra)
121 ADD_DEFINITIONS(-Werror)
124 SET(CMAKE_C_FLAGS_RELWITHDEBINFO "-g -O2 -D_DEBUG" CACHE STRING
125 "Flags used by the compiler during Release with Debug Info builds."
127 SET(CMAKE_C_FLAGS_MINSIZEREL "-Os -DNDEBUG" CACHE STRING
128 "Flags used by the compiler during release minsize builds."
130 SET(CMAKE_C_FLAGS_RELEASE "-O2 -fomit-frame-pointer -DNDEBUG" CACHE STRING
131 "Flags used by the compiler during release builds"
133 SET(CMAKE_C_FLAGS_DEBUG "-g3 -D_DEBUG" CACHE STRING
134 "Flags used by the compiler during debug builds."
137 CHECK_C_SOURCE_COMPILES("int foo() __attribute__((destructor));
138 int main() {return 0;}" HAVE_GCC_DESTRUCTOR)
140 # Set visibility options if available
142 CHECK_C_COMPILER_FLAG(-fvisibility=internal HAVE_VISIBILITY_SWITCH)
143 IF(HAVE_VISIBILITY_SWITCH)
144 CHECK_C_SOURCE_COMPILES("int foo() __attribute__((visibility(\"default\")));
145 int main() {return 0;}" HAVE_GCC_VISIBILITY)
146 IF(HAVE_GCC_VISIBILITY)
147 ADD_DEFINITIONS(-fvisibility=internal -DHAVE_GCC_VISIBILITY)
153 CHECK_C_SOURCE_COMPILES("int foo(const char *str, ...) __attribute__((format(printf, 1, 2)));
154 int main() {return 0;}" HAVE_GCC_FORMAT)
156 CHECK_INCLUDE_FILE(fenv.h HAVE_FENV_H)
157 CHECK_INCLUDE_FILE(float.h HAVE_FLOAT_H)
159 CHECK_LIBRARY_EXISTS(m powf "" HAVE_POWF)
160 CHECK_LIBRARY_EXISTS(m sqrtf "" HAVE_SQRTF)
161 CHECK_LIBRARY_EXISTS(m acosf "" HAVE_ACOSF)
162 CHECK_LIBRARY_EXISTS(m atanf "" HAVE_ATANF)
163 CHECK_LIBRARY_EXISTS(m fabsf "" HAVE_FABSF)
165 CHECK_LIBRARY_EXISTS(m fesetround "" HAVE_FESETROUND)
167 IF(HAVE_SQRTF OR HAVE_ACOSF OR HAVE_ATANF OR HAVE_FABSF OR HAVE_FESETROUND)
168 SET(EXTRA_LIBS m ${EXTRA_LIBS})
170 CHECK_FUNCTION_EXISTS(strtof HAVE_STRTOF)
171 CHECK_FUNCTION_EXISTS(_controlfp HAVE__CONTROLFP)
173 CHECK_FUNCTION_EXISTS(stat HAVE_STAT)
174 CHECK_FUNCTION_EXISTS(strcasecmp HAVE_STRCASECMP)
175 IF(NOT HAVE_STRCASECMP)
176 CHECK_FUNCTION_EXISTS(_stricmp HAVE__STRICMP)
177 IF(NOT HAVE__STRICMP)
178 MESSAGE(FATAL_ERROR "No case-insensitive compare function found, please report!")
181 ADD_DEFINITIONS(-Dstrcasecmp=_stricmp)
184 CHECK_FUNCTION_EXISTS(strncasecmp HAVE_STRNCASECMP)
185 IF(NOT HAVE_STRNCASECMP)
186 CHECK_FUNCTION_EXISTS(_strnicmp HAVE__STRNICMP)
187 IF(NOT HAVE__STRNICMP)
188 MESSAGE(FATAL_ERROR "No case-insensitive size-limitted compare function found, please report!")
191 ADD_DEFINITIONS(-Dstrncasecmp=_strnicmp)
194 CHECK_FUNCTION_EXISTS(snprintf HAVE_SNPRINTF)
195 IF(NOT HAVE_SNPRINTF)
196 CHECK_FUNCTION_EXISTS(_snprintf HAVE__SNPRINTF)
197 IF(NOT HAVE__SNPRINTF)
198 MESSAGE(FATAL_ERROR "No snprintf function found, please report!")
201 ADD_DEFINITIONS(-Dsnprintf=_snprintf)
204 CHECK_FUNCTION_EXISTS(vsnprintf HAVE_VSNPRINTF)
205 IF(NOT HAVE_VSNPRINTF)
206 CHECK_FUNCTION_EXISTS(_vsnprintf HAVE__VSNPRINTF)
207 IF(NOT HAVE__VSNPRINTF)
208 MESSAGE(FATAL_ERROR "No vsnprintf function found, please report!")
211 ADD_DEFINITIONS(-Dvsnprintf=_vsnprintf)
214 CHECK_SYMBOL_EXISTS(isnan math.h HAVE_ISNAN)
216 CHECK_FUNCTION_EXISTS(_isnan HAVE__ISNAN)
218 MESSAGE(FATAL_ERROR "No isnan function found, please report!")
221 ADD_DEFINITIONS(-Disnan=_isnan)
225 # Check for the dlopen API (for dynamicly loading backend libs)
227 CHECK_INCLUDE_FILE(dlfcn.h HAVE_DLFCN_H)
229 CHECK_LIBRARY_EXISTS(dl dlopen "" HAVE_LIBDL)
231 SET(EXTRA_LIBS dl ${EXTRA_LIBS})
236 # Check if we have Windows headers
237 CHECK_INCLUDE_FILE(windows.h HAVE_WINDOWS_H -D_WIN32_WINNT=0x0500)
238 IF(NOT HAVE_WINDOWS_H)
239 CHECK_FUNCTION_EXISTS(gettimeofday HAVE_GETTIMEOFDAY)
240 IF(NOT HAVE_GETTIMEOFDAY)
241 MESSAGE(FATAL_ERROR "No timing function found!")
244 CHECK_FUNCTION_EXISTS(nanosleep HAVE_NANOSLEEP)
245 IF(NOT HAVE_NANOSLEEP)
246 MESSAGE(FATAL_ERROR "No sleep function found!")
249 CHECK_C_COMPILER_FLAG(-pthread HAVE_PTHREAD)
251 ADD_DEFINITIONS(-pthread)
252 SET(EXTRA_LIBS ${EXTRA_LIBS} -pthread)
255 # We need pthreads outside of Windows
256 CHECK_INCLUDE_FILE(pthread.h HAVE_PTHREAD_H)
257 IF(NOT HAVE_PTHREAD_H)
258 MESSAGE(FATAL_ERROR "PThreads is required for non-Windows builds!")
260 # Some systems need pthread_np.h to get recursive mutexes
261 CHECK_INCLUDE_FILES("pthread.h;pthread_np.h" HAVE_PTHREAD_NP_H)
263 # _GNU_SOURCE is needed on some systems for extra attributes, and
264 # _REENTRANT is needed for libc thread-safety
265 ADD_DEFINITIONS(-D_GNU_SOURCE=1)
266 CHECK_LIBRARY_EXISTS(pthread pthread_create "" HAVE_LIBPTHREAD)
268 SET(EXTRA_LIBS pthread ${EXTRA_LIBS})
271 CHECK_LIBRARY_EXISTS(pthread pthread_setschedparam "" HAVE_PTHREAD_SETSCHEDPARAM)
273 CHECK_LIBRARY_EXISTS(rt clock_gettime "" HAVE_LIBRT)
275 SET(EXTRA_LIBS rt ${EXTRA_LIBS})
279 # Check for a 64-bit type
280 CHECK_INCLUDE_FILE(stdint.h HAVE_STDINT_H)
281 IF(NOT HAVE_STDINT_H)
283 CHECK_C_SOURCE_COMPILES("\#define _WIN32_WINNT 0x0500
284 \#include <windows.h>
286 int main() {return 0;}" HAVE___INT64)
289 IF(NOT SIZEOF_LONG MATCHES "8")
290 IF(NOT SIZEOF_LONG_LONG MATCHES "8")
291 MESSAGE(FATAL_ERROR "No 64-bit types found, please report!")
298 # Windows needs winmm for timeGetTime, even if the backend is disabled
299 CHECK_SHARED_LIBRARY_EXISTS(winmm timeGetTime 0 "" HAVE_LIBWINMM)
301 SET(EXTRA_LIBS winmm ${EXTRA_LIBS})
302 SET(PKG_CONFIG_LIBS ${PKG_CONFIG_LIBS} -lwinmm)
307 SET(OPENAL_OBJS OpenAL32/alAuxEffectSlot.c
309 OpenAL32/alDatabuffer.c
312 OpenAL32/alExtension.c
314 OpenAL32/alListener.c
319 SET(ALC_OBJS Alc/ALc.c
339 SET(HAVE_PORTAUDIO 0)
340 SET(HAVE_PULSEAUDIO 0)
345 CHECK_INCLUDE_FILE(alsa/asoundlib.h HAVE_ALSA_ASOUNDLIB_H)
346 IF(HAVE_ALSA_ASOUNDLIB_H)
347 CHECK_SHARED_LIBRARY_EXISTS(asound snd_pcm_open 4 "" HAVE_LIBASOUND)
348 IF(HAVE_LIBASOUND OR HAVE_DLFCN_H OR WIN32)
350 SET(ALC_OBJS ${ALC_OBJS} Alc/alsa.c)
351 IF(HAVE_DLFCN_H OR WIN32)
352 SET(BACKENDS "${BACKENDS} ALSA,")
354 SET(BACKENDS "${BACKENDS} ALSA \(linked\),")
355 SET(EXTRA_LIBS asound ${EXTRA_LIBS})
363 CHECK_INCLUDE_FILE(sys/soundcard.h HAVE_SYS_SOUNDCARD_H)
364 IF(HAVE_SYS_SOUNDCARD_H)
366 SET(ALC_OBJS ${ALC_OBJS} Alc/oss.c)
367 SET(BACKENDS "${BACKENDS} OSS,")
371 # Check Solaris backend
373 CHECK_INCLUDE_FILE(sys/audioio.h HAVE_SYS_AUDIOIO_H)
374 IF(HAVE_SYS_AUDIOIO_H)
376 SET(ALC_OBJS ${ALC_OBJS} Alc/solaris.c)
377 SET(BACKENDS "${BACKENDS} Solaris,")
381 # Check DSound/MMSystem backend
383 CHECK_INCLUDE_FILE(dsound.h HAVE_DSOUND_H)
385 CHECK_SHARED_LIBRARY_EXISTS(dsound DirectSoundCreate 3 "" HAVE_LIBDSOUND)
386 IF(HAVE_LIBDSOUND OR HAVE_DLFCN_H OR WIN32)
388 SET(ALC_OBJS ${ALC_OBJS} Alc/dsound.c)
390 IF(HAVE_DLFCN_H OR WIN32)
391 SET(BACKENDS "${BACKENDS} DirectSound,")
393 SET(BACKENDS "${BACKENDS} DirectSound \(linked\),")
394 SET(EXTRA_LIBS dsound ${EXTRA_LIBS})
402 CHECK_INCLUDE_FILES("windows.h;mmsystem.h" HAVE_MMSYSTEM_H -D_WIN32_WINNT=0x0500)
403 IF(HAVE_MMSYSTEM_H AND HAVE_LIBWINMM)
405 SET(ALC_OBJS ${ALC_OBJS} Alc/winmm.c)
406 SET(BACKENDS "${BACKENDS} WinMM,")
411 # Check PortAudio backend
413 CHECK_INCLUDE_FILE(portaudio.h HAVE_PORTAUDIO_H)
415 CHECK_SHARED_LIBRARY_EXISTS(portaudio Pa_Initialize 0 "" HAVE_LIBPORTAUDIO)
416 IF(HAVE_LIBPORTAUDIO OR HAVE_DLFCN_H OR WIN32)
417 SET(HAVE_PORTAUDIO 1)
418 SET(ALC_OBJS ${ALC_OBJS} Alc/portaudio.c)
419 IF(HAVE_DLFCN_H OR WIN32)
420 SET(BACKENDS "${BACKENDS} PortAudio,")
422 SET(BACKENDS "${BACKENDS} PortAudio \(linked\),")
423 SET(EXTRA_LIBS portaudio ${EXTRA_LIBS})
429 # Check PortAudio backend
431 CHECK_INCLUDE_FILE(pulse/pulseaudio.h HAVE_PULSE_PULSEAUDIO_H)
432 IF(HAVE_PULSE_PULSEAUDIO_H)
433 CHECK_SHARED_LIBRARY_EXISTS(pulse pa_context_new 2 "" HAVE_LIBPULSE)
434 IF(HAVE_LIBPULSE OR HAVE_DLFCN_H OR WIN32)
435 SET(HAVE_PULSEAUDIO 1)
436 SET(ALC_OBJS ${ALC_OBJS} Alc/pulseaudio.c)
437 IF(HAVE_DLFCN_H OR WIN32)
438 SET(BACKENDS "${BACKENDS} PulseAudio,")
440 SET(BACKENDS "${BACKENDS} PulseAudio \(linked\),")
441 SET(EXTRA_LIBS pulse ${EXTRA_LIBS})
447 # Optionally enable the Wave Writer backend
450 SET(ALC_OBJS ${ALC_OBJS} Alc/wave.c)
451 SET(BACKENDS "${BACKENDS} WaveFile,")
454 # This is always available
455 SET(BACKENDS "${BACKENDS} Null")
457 IF(LIBTYPE STREQUAL "STATIC")
458 ADD_DEFINITIONS(-DAL_LIBTYPE_STATIC)
459 SET(PKG_CONFIG_CFLAGS -DAL_LIBTYPE_STATIC ${PKG_CONFIG_CFLAGS})
462 # Needed for openal.pc.in
463 SET(prefix ${CMAKE_INSTALL_PREFIX})
464 SET(exec_prefix "\${prefix}")
465 SET(libdir "\${exec_prefix}/lib${LIB_SUFFIX}")
466 SET(bindir "\${exec_prefix}/bin")
467 SET(includedir "\${prefix}/include")
468 SET(PACKAGE_VERSION "${LIB_VERSION}")
472 "${OpenAL_SOURCE_DIR}/config.h.in"
473 "${OpenAL_BINARY_DIR}/config.h")
475 "${OpenAL_SOURCE_DIR}/openal.pc.in"
476 "${OpenAL_BINARY_DIR}/openal.pc"
480 ADD_LIBRARY(${LIBNAME} ${LIBTYPE} ${OPENAL_OBJS} ${ALC_OBJS})
481 SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES DEFINE_SYMBOL AL_BUILD_LIBRARY
482 COMPILE_FLAGS -DAL_ALEXT_PROTOTYPES
483 VERSION ${LIB_VERSION}.0
484 SOVERSION ${LIB_MAJOR_VERSION})
485 IF(WIN32 AND NOT LIBTYPE STREQUAL "STATIC")
486 SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES PREFIX "")
489 TARGET_LINK_LIBRARIES(${LIBNAME} ${EXTRA_LIBS})
491 # Add an install target here
492 INSTALL(TARGETS ${LIBNAME}
493 RUNTIME DESTINATION bin
494 LIBRARY DESTINATION "lib${LIB_SUFFIX}"
495 ARCHIVE DESTINATION "lib${LIB_SUFFIX}"
497 INSTALL(FILES include/AL/al.h
501 include/AL/efx-creative.h
502 DESTINATION include/AL
504 INSTALL(FILES "${OpenAL_BINARY_DIR}/openal.pc"
505 DESTINATION "lib${LIB_SUFFIX}/pkgconfig")
509 MESSAGE(STATUS "Building OpenAL with support for the following backends:")
510 MESSAGE(STATUS " ${BACKENDS}")
515 MESSAGE(STATUS "WARNING: Building the Windows version without DirectSound output")
516 MESSAGE(STATUS " This is probably NOT what you want!")
521 # Install alsoft.conf configuration file
523 INSTALL(FILES alsoftrc.sample
524 DESTINATION /etc/openal
527 MESSAGE(STATUS "Installing sample alsoft.conf")
532 ADD_EXECUTABLE(openal-info utils/openal-info.c)
533 TARGET_LINK_LIBRARIES(openal-info ${LIBNAME})
534 INSTALL(TARGETS openal-info
535 RUNTIME DESTINATION bin
536 LIBRARY DESTINATION "lib${LIB_SUFFIX}"
537 ARCHIVE DESTINATION "lib${LIB_SUFFIX}"
539 MESSAGE(STATUS "Building utility programs")