Don't force latency adjustment with PulseAudio
[openal-soft.git] / CMakeLists.txt
blob317a51298a19d60f7d1d7516ee6ee4d56b2ff533
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)
21 PROJECT(OpenAL C)
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)
44 IF(WIN32)
45     SET(LIBNAME OpenAL32)
46     ADD_DEFINITIONS("-D_WIN32")
47 ELSE()
48     SET(LIBNAME openal)
49 ENDIF()
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."
72         FORCE)
73 ENDIF()
74 IF(NOT CMAKE_DEBUG_POSTFIX)
75     SET(CMAKE_DEBUG_POSTFIX "" CACHE STRING
76         "Library postfix for debug builds. Normally left blank."
77         FORCE)
78 ENDIF()
80 IF(NOT DXSDK_DIR)
81     STRING(REGEX REPLACE "\\\\" "/" DXSDK_DIR "$ENV{DXSDK_DIR}")
82 ELSE()
83     STRING(REGEX REPLACE "\\\\" "/" DXSDK_DIR "${DXSDK_DIR}")
84 ENDIF()
85 IF(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")
90 ENDIF()
92 IF(MSVC)
93     # ???
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)
99 ELSE()
100     ADD_DEFINITIONS(-Wall)
101     CHECK_C_COMPILER_FLAG(-Wextra HAVE_W_EXTRA)
102     IF(HAVE_W_EXTRA)
103         ADD_DEFINITIONS(-Wextra)
104     ENDIF()
106     IF(WERROR)
107         ADD_DEFINITIONS(-Werror)
108     ENDIF()
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."
112         FORCE)
113     SET(CMAKE_C_FLAGS_MINSIZEREL "-Os -DNDEBUG" CACHE STRING
114         "Flags used by the compiler during release minsize builds."
115         FORCE)
116     SET(CMAKE_C_FLAGS_RELEASE "-O2 -funroll-loops -fomit-frame-pointer -DNDEBUG" CACHE STRING
117         "Flags used by the compiler during release builds"
118         FORCE)
119     SET(CMAKE_C_FLAGS_DEBUG "-g3 -D_DEBUG" CACHE STRING
120         "Flags used by the compiler during debug builds."
121         FORCE)
123     # Set visibility options if available
124     IF(NOT WIN32)
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)
134             ENDIF()
135         ENDIF()
136     ENDIF()
137 ENDIF()
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)
146 IF(HAVE_FENV_H)
147     CHECK_LIBRARY_EXISTS(m  fesetround  "" HAVE_FESETROUND)
148 ENDIF()
149 IF(HAVE_SQRTF OR HAVE_ACOSF OR HAVE_ATANF OR HAVE_FABSF OR HAVE_FESETROUND)
150     SET(EXTRA_LIBS m ${EXTRA_LIBS})
151 ENDIF()
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!")
160     ENDIF()
162     ADD_DEFINITIONS(-Dstrcasecmp=_stricmp)
163 ENDIF()
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!")
170     ENDIF()
172     ADD_DEFINITIONS(-Dstrncasecmp=_strnicmp)
173 ENDIF()
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!")
180     ENDIF()
182     ADD_DEFINITIONS(-Dsnprintf=_snprintf)
183 ENDIF()
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!")
190     ENDIF()
192     ADD_DEFINITIONS(-Dvsnprintf=_vsnprintf)
193 ENDIF()
195 CHECK_SYMBOL_EXISTS(isnan math.h HAVE_ISNAN)
196 IF(NOT HAVE_ISNAN)
197     CHECK_FUNCTION_EXISTS(_isnan HAVE__ISNAN)
198     IF(NOT HAVE__ISNAN)
199         MESSAGE(FATAL_ERROR "No isnan function found, please report!")
200     ENDIF()
202     ADD_DEFINITIONS(-Disnan=_isnan)
203 ENDIF()
206 # Check for the dlopen API (for dynamicly loading backend libs)
207 IF(DLOPEN)
208     CHECK_INCLUDE_FILE(dlfcn.h HAVE_DLFCN_H)
209     IF(HAVE_DLFCN_H)
210         CHECK_LIBRARY_EXISTS(dl dlopen "" HAVE_LIBDL)
211         IF(HAVE_LIBDL)
212             SET(EXTRA_LIBS dl ${EXTRA_LIBS})
213         ENDIF()
214     ENDIF()
215 ENDIF()
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!")
223     ENDIF()
225     CHECK_FUNCTION_EXISTS(nanosleep HAVE_NANOSLEEP)
226     IF(NOT HAVE_NANOSLEEP)
227         MESSAGE(FATAL_ERROR "No sleep function found!")
228     ENDIF()
230     CHECK_C_COMPILER_FLAG(-pthread HAVE_PTHREAD)
231     IF(HAVE_PTHREAD)
232         ADD_DEFINITIONS(-pthread)
233         SET(EXTRA_LIBS ${EXTRA_LIBS} -pthread)
234     ENDIF()
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!")
240     ENDIF()
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)
248     IF(HAVE_LIBPTHREAD)
249         SET(EXTRA_LIBS pthread ${EXTRA_LIBS})
250     ENDIF()
252     CHECK_LIBRARY_EXISTS(pthread pthread_setschedparam "" HAVE_PTHREAD_SETSCHEDPARAM)
254     CHECK_LIBRARY_EXISTS(rt clock_gettime "" HAVE_LIBRT)
255     IF(HAVE_LIBRT)
256         SET(EXTRA_LIBS rt ${EXTRA_LIBS})
257     ENDIF()
258 ENDIF()
260 # Check for a 64-bit type
261 CHECK_INCLUDE_FILE(stdint.h HAVE_STDINT_H)
262 IF(NOT HAVE_STDINT_H)
263     IF(HAVE_WINDOWS_H)
264         CHECK_C_SOURCE_COMPILES("\#define _WIN32_WINNT 0x0500
265                                  \#include <windows.h>
266                                  __int64 foo;
267                                  int main() {return 0;}" HAVE___INT64)
268     ENDIF()
269     IF(NOT 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!")
273             ENDIF()
274         ENDIF()
275     ENDIF()
276 ENDIF()
279 SET(OPENAL_OBJS  OpenAL32/alAuxEffectSlot.c
280                  OpenAL32/alBuffer.c
281                  OpenAL32/alDatabuffer.c
282                  OpenAL32/alEffect.c
283                  OpenAL32/alError.c
284                  OpenAL32/alExtension.c
285                  OpenAL32/alFilter.c
286                  OpenAL32/alListener.c
287                  OpenAL32/alSource.c
288                  OpenAL32/alState.c
289                  OpenAL32/alThunk.c
291 SET(ALC_OBJS  Alc/ALc.c
292               Alc/ALu.c
293               Alc/alcConfig.c
294               Alc/alcEcho.c
295               Alc/alcReverb.c
296               Alc/alcRing.c
297               Alc/alcThread.c
298               Alc/bs2b.c
299               Alc/wave.c
302 SET(BACKENDS "")
304 # Check ALSA backend
305 IF(ALSA)
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)
310             SET(HAVE_ALSA 1)
311             SET(ALC_OBJS  ${ALC_OBJS} Alc/alsa.c)
312             IF(HAVE_DLFCN_H)
313                 SET(BACKENDS  "${BACKENDS} ALSA,")
314             ELSE()
315                 SET(BACKENDS  "${BACKENDS} ALSA \(linked\),")
316                 SET(EXTRA_LIBS asound ${EXTRA_LIBS})
317             ENDIF()
318         ENDIF()
319     ENDIF()
320 ENDIF()
322 # Check OSS backend
323 IF(OSS)
324     CHECK_INCLUDE_FILE(sys/soundcard.h HAVE_SYS_SOUNDCARD_H)
325     IF(HAVE_SYS_SOUNDCARD_H)
326         SET(HAVE_OSS 1)
327         SET(ALC_OBJS  ${ALC_OBJS} Alc/oss.c)
328         SET(BACKENDS  "${BACKENDS} OSS,")
329     ENDIF()
330 ENDIF()
332 # Check Solaris backend
333 IF(SOLARIS)
334     CHECK_INCLUDE_FILE(sys/audioio.h HAVE_SYS_AUDIOIO_H)
335     IF(HAVE_SYS_AUDIOIO_H)
336         SET(HAVE_SOLARIS 1)
337         SET(ALC_OBJS  ${ALC_OBJS} Alc/solaris.c)
338         SET(BACKENDS  "${BACKENDS} Solaris,")
339     ENDIF()
340 ENDIF()
342 # Check DSound/MMSystem backend
343 IF(DSOUND)
344     CHECK_INCLUDE_FILE(dsound.h HAVE_DSOUND_H)
345     IF(HAVE_DSOUND_H)
346         CHECK_LIBRARY_EXISTS(dsound DirectSoundCreate "" HAVE_LIBDSOUND)
347         IF(HAVE_LIBDSOUND OR WIN32)
348             SET(HAVE_DSOUND 1)
349             SET(ALC_OBJS  ${ALC_OBJS} Alc/dsound.c)
351             IF(WIN32)
352                 SET(BACKENDS  "${BACKENDS} DirectSound,")
353             ELSE()
354                 SET(BACKENDS  "${BACKENDS} DirectSound \(linked\),")
355                 SET(EXTRA_LIBS dsound ${EXTRA_LIBS})
356             ENDIF()
357         ENDIF()
358     ENDIF()
359 ENDIF()
360 IF(HAVE_WINDOWS_H)
361     IF(WINMM)
362         CHECK_INCLUDE_FILES("windows.h;mmsystem.h" HAVE_MMSYSTEM_H -D_WIN32_WINNT=0x0500)
363         IF(HAVE_MMSYSTEM_H)
364             SET(HAVE_WINMM 1)
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)
372             IF(HAVE_LIBWINMM)
373                 SET(EXTRA_LIBS winmm ${EXTRA_LIBS})
374             ENDIF()
375         ENDIF()
376     ENDIF()
377 ENDIF()
379 # Check PortAudio backend
380 IF(PORTAUDIO)
381     CHECK_INCLUDE_FILE(portaudio.h HAVE_PORTAUDIO_H)
382     IF(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)
387             IF(HAVE_DLFCN_H)
388                 SET(BACKENDS  "${BACKENDS} PortAudio,")
389             ELSE()
390                 SET(BACKENDS  "${BACKENDS} PortAudio \(linked\),")
391                 SET(EXTRA_LIBS portaudio ${EXTRA_LIBS})
392             ENDIF()
393         ENDIF()
394     ENDIF()
395 ENDIF()
397 # Check PortAudio backend
398 IF(PULSEAUDIO)
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)
402         IF(HAVE_LIBPULSE)
403             SET(HAVE_PULSEAUDIO 1)
404             SET(ALC_OBJS  ${ALC_OBJS} Alc/pulseaudio.c)
405             IF(HAVE_DLFCN_H)
406                 SET(BACKENDS  "${BACKENDS} PulseAudio,")
407             ELSE()
408                 SET(BACKENDS  "${BACKENDS} PulseAudio \(linked\),")
409                 SET(EXTRA_LIBS pulse ${EXTRA_LIBS})
410             ENDIF()
411         ENDIF()
412     ENDIF()
413 ENDIF()
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}")
426 # End configuration
427 CONFIGURE_FILE(
428     "${OpenAL_SOURCE_DIR}/config.h.in"
429     "${OpenAL_BINARY_DIR}/config.h")
430 CONFIGURE_FILE(
431     "${OpenAL_SOURCE_DIR}/openal.pc.in"
432     "${OpenAL_BINARY_DIR}/openal.pc"
433     @ONLY)
435 ADD_DEFINITIONS(-DAL_BUILD_LIBRARY)
437 # Build a library
438 IF(NOT LIBTYPE)
439     SET(LIBTYPE SHARED)
440 ENDIF()
441 ADD_LIBRARY(${LIBNAME} ${LIBTYPE} ${OPENAL_OBJS} ${ALC_OBJS})
442 SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES VERSION ${LIB_VERSION}
443                                             SOVERSION ${LIB_MAJOR_VERSION})
444 IF(WIN32)
445     SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES PREFIX "")
446 ENDIF()
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
457               include/AL/alc.h
458               include/AL/alext.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
465 IF(ALSOFT_CONFIG)
466     INSTALL(FILES alsoftrc.sample
467             DESTINATION /etc/openal
468             RENAME alsoft.conf
469     )
470 ENDIF()
472 IF(EXAMPLES)
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}
479     )
480 ENDIF()
482 MESSAGE(STATUS "")
483 MESSAGE(STATUS "Building OpenAL with support for the following backends:")
484 MESSAGE(STATUS "    ${BACKENDS}")
485 MESSAGE(STATUS "")
487 IF(WIN32)
488     IF(NOT HAVE_DSOUND)
489         MESSAGE(STATUS "WARNING: Building the Windows version without DirectSound output")
490         MESSAGE(STATUS "         This is probably NOT what you want!")
491         MESSAGE(STATUS "")
492     ENDIF()
493 ENDIF()