Restrict setting some wet path values to active sends only
[openal-soft.git] / CMakeLists.txt
blob512bb95aa98c453dd01c5fe2a156572dde770a6b
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(CheckSymbolExists)
14 INCLUDE(CheckCCompilerFlag)
15 INCLUDE(CheckCSourceCompiles)
16 INCLUDE(CheckTypeSize)
19 PROJECT(OpenAL C)
22 SET(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS TRUE)
25 OPTION(ALSA    "Check for ALSA backend"                ON)
26 OPTION(OSS     "Check for OSS backend"                 ON)
27 OPTION(SOLARIS "Check for Solaris backend"             ON)
28 OPTION(DSOUND  "Check for DirectSound backend"         ON)
29 OPTION(WINMM   "Check for Windows Multimedia backend"  ON)
30 OPTION(PORTAUDIO  "Check for PortAudio backend"        ON)
31 OPTION(PULSEAUDIO "Check for PulseAudio backend"       ON)
33 OPTION(DLOPEN  "Check for the dlopen API for loading optional libs"  ON)
35 OPTION(WERROR  "Treat compile warnings as errors"      OFF)
37 OPTION(EXAMPLES  "Build example programs"              ON)
39 OPTION(ALSOFT_CONFIG "Install alsoft.conf configuration file" OFF)
42 IF(WIN32)
43     SET(LIBNAME OpenAL32)
44     ADD_DEFINITIONS("-D_WIN32")
45 ELSE()
46     SET(LIBNAME openal)
47 ENDIF()
49 SET(LIB_MAJOR_VERSION "1")
50 SET(LIB_MINOR_VERSION "10")
51 SET(LIB_BUILD_VERSION "622")
52 SET(LIB_VERSION "${LIB_MAJOR_VERSION}.${LIB_MINOR_VERSION}.${LIB_BUILD_VERSION}")
53 IF(NOT DEFINED LIB_INSTALL_DIR)
54   SET(LIB_INSTALL_DIR "lib${LIB_SUFFIX}")
55 ENDIF(NOT DEFINED LIB_INSTALL_DIR)
58 CHECK_TYPE_SIZE("long" SIZEOF_LONG)
59 CHECK_TYPE_SIZE("long long" SIZEOF_LONG_LONG)
60 CHECK_TYPE_SIZE("unsigned int" SIZEOF_UINT)
61 CHECK_TYPE_SIZE("void*" SIZEOF_VOIDP)
64 # Add definitions, compiler switches, etc.
65 INCLUDE_DIRECTORIES(OpenAL32/Include include "${OpenAL_BINARY_DIR}")
67 IF(NOT CMAKE_BUILD_TYPE)
68     SET(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING
69         "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel."
70         FORCE)
71 ENDIF()
72 IF(NOT CMAKE_DEBUG_POSTFIX)
73     SET(CMAKE_DEBUG_POSTFIX "" CACHE STRING
74         "Library postfix for debug builds. Normally left blank."
75         FORCE)
76 ENDIF()
78 IF(NOT DXSDK_DIR)
79     STRING(REGEX REPLACE "\\\\" "/" DXSDK_DIR "$ENV{DXSDK_DIR}")
80 ELSE()
81     STRING(REGEX REPLACE "\\\\" "/" DXSDK_DIR "${DXSDK_DIR}")
82 ENDIF()
83 IF(DXSDK_DIR)
84     MESSAGE(STATUS "Using DirectX SDK directory: ${DXSDK_DIR}")
85     SET(CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES} "${DXSDK_DIR}/Include")
86     INCLUDE_DIRECTORIES("${DXSDK_DIR}/Include")
87     LINK_DIRECTORIES("${DXSDK_DIR}/Lib")
88 ENDIF()
90 IF(MSVC)
91     # ???
92     SET(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -D_DEBUG")
93     SET(CMAKE_C_FLAGS_MINSIZEREL "${CMAKE_C_FLAGS_MINSIZEREL} -DNDEBUG")
94     SET(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -DNDEBUG")
95     SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -D_DEBUG")
96     ADD_DEFINITIONS(-D_CRT_SECURE_NO_WARNINGS)
97 ELSE()
98     ADD_DEFINITIONS(-Wall)
99     CHECK_C_COMPILER_FLAG(-Wextra HAVE_W_EXTRA)
100     IF(HAVE_W_EXTRA)
101         ADD_DEFINITIONS(-Wextra)
102     ENDIF()
104     IF(WERROR)
105         ADD_DEFINITIONS(-Werror)
106     ENDIF()
108     SET(CMAKE_C_FLAGS_RELWITHDEBINFO "-g -O2 -funroll-loops -D_DEBUG" CACHE STRING
109         "Flags used by the compiler during Release with Debug Info builds."
110         FORCE)
111     SET(CMAKE_C_FLAGS_MINSIZEREL "-Os -DNDEBUG" CACHE STRING
112         "Flags used by the compiler during release minsize builds."
113         FORCE)
114     SET(CMAKE_C_FLAGS_RELEASE "-O2 -funroll-loops -fomit-frame-pointer -DNDEBUG" CACHE STRING
115         "Flags used by the compiler during release builds"
116         FORCE)
117     SET(CMAKE_C_FLAGS_DEBUG "-g3 -D_DEBUG" CACHE STRING
118         "Flags used by the compiler during debug builds."
119         FORCE)
121     # Set visibility options if available
122     IF(NOT WIN32)
123         CHECK_C_SOURCE_COMPILES("int foo() __attribute__((destructor));
124                                  int main() {return 0;}" HAVE_GCC_DESTRUCTOR)
126         CHECK_C_COMPILER_FLAG(-fvisibility=hidden HAVE_VISIBILITY_SWITCH)
127         IF(HAVE_VISIBILITY_SWITCH)
128             CHECK_C_SOURCE_COMPILES("int foo() __attribute__((visibility(\"default\")));
129                                      int main() {return 0;}" HAVE_GCC_VISIBILITY)
130             IF(HAVE_GCC_VISIBILITY)
131                 ADD_DEFINITIONS(-fvisibility=hidden -DHAVE_GCC_VISIBILITY)
132             ENDIF()
133         ENDIF()
134     ENDIF()
135 ENDIF()
137 CHECK_INCLUDE_FILE(fenv.h HAVE_FENV_H)
138 CHECK_INCLUDE_FILE(float.h HAVE_FLOAT_H)
140 CHECK_LIBRARY_EXISTS(m  sqrtf  "" HAVE_SQRTF)
141 CHECK_LIBRARY_EXISTS(m  acosf  "" HAVE_ACOSF)
142 CHECK_LIBRARY_EXISTS(m  atanf  "" HAVE_ATANF)
143 CHECK_LIBRARY_EXISTS(m  fabsf  "" HAVE_FABSF)
144 IF(HAVE_FENV_H)
145     CHECK_LIBRARY_EXISTS(m  fesetround  "" HAVE_FESETROUND)
146 ENDIF()
147 IF(HAVE_SQRTF OR HAVE_ACOSF OR HAVE_ATANF OR HAVE_FABSF OR HAVE_FESETROUND)
148     SET(EXTRA_LIBS m ${EXTRA_LIBS})
149 ENDIF()
150 CHECK_FUNCTION_EXISTS(strtof HAVE_STRTOF)
151 CHECK_FUNCTION_EXISTS(_controlfp HAVE__CONTROLFP)
153 CHECK_FUNCTION_EXISTS(strcasecmp HAVE_STRCASECMP)
154 IF(NOT HAVE_STRCASECMP)
155     CHECK_FUNCTION_EXISTS(_stricmp HAVE__STRICMP)
156     IF(NOT HAVE__STRICMP)
157         MESSAGE(FATAL_ERROR "No case-insensitive compare function found, please report!")
158     ENDIF()
160     ADD_DEFINITIONS(-Dstrcasecmp=_stricmp)
161 ENDIF()
163 CHECK_FUNCTION_EXISTS(strncasecmp HAVE_STRNCASECMP)
164 IF(NOT HAVE_STRNCASECMP)
165     CHECK_FUNCTION_EXISTS(_strnicmp HAVE__STRNICMP)
166     IF(NOT HAVE__STRNICMP)
167         MESSAGE(FATAL_ERROR "No case-insensitive size-limitted compare function found, please report!")
168     ENDIF()
170     ADD_DEFINITIONS(-Dstrncasecmp=_strnicmp)
171 ENDIF()
173 CHECK_FUNCTION_EXISTS(snprintf HAVE_SNPRINTF)
174 IF(NOT HAVE_SNPRINTF)
175     CHECK_FUNCTION_EXISTS(_snprintf HAVE__SNPRINTF)
176     IF(NOT HAVE__SNPRINTF)
177         MESSAGE(FATAL_ERROR "No snprintf function found, please report!")
178     ENDIF()
180     ADD_DEFINITIONS(-Dsnprintf=_snprintf)
181 ENDIF()
183 CHECK_FUNCTION_EXISTS(vsnprintf HAVE_VSNPRINTF)
184 IF(NOT HAVE_VSNPRINTF)
185     CHECK_FUNCTION_EXISTS(_vsnprintf HAVE__VSNPRINTF)
186     IF(NOT HAVE__VSNPRINTF)
187         MESSAGE(FATAL_ERROR "No vsnprintf function found, please report!")
188     ENDIF()
190     ADD_DEFINITIONS(-Dvsnprintf=_vsnprintf)
191 ENDIF()
193 CHECK_SYMBOL_EXISTS(isnan math.h HAVE_ISNAN)
194 IF(NOT HAVE_ISNAN)
195     CHECK_FUNCTION_EXISTS(_isnan HAVE__ISNAN)
196     IF(NOT HAVE__ISNAN)
197         MESSAGE(FATAL_ERROR "No isnan function found, please report!")
198     ENDIF()
200     ADD_DEFINITIONS(-Disnan=_isnan)
201 ENDIF()
204 # Check for the dlopen API (for dynamicly loading backend libs)
205 IF(DLOPEN)
206     CHECK_INCLUDE_FILE(dlfcn.h HAVE_DLFCN_H)
207     IF(HAVE_DLFCN_H)
208         CHECK_LIBRARY_EXISTS(dl dlopen "" HAVE_LIBDL)
209         IF(HAVE_LIBDL)
210             SET(EXTRA_LIBS dl ${EXTRA_LIBS})
211         ENDIF()
212     ENDIF()
213 ENDIF()
215 # Check if we have Windows headers
216 CHECK_INCLUDE_FILE(windows.h HAVE_WINDOWS_H -D_WIN32_WINNT=0x0500)
217 IF(NOT HAVE_WINDOWS_H)
218     CHECK_FUNCTION_EXISTS(gettimeofday HAVE_GETTIMEOFDAY)
219     IF(NOT HAVE_GETTIMEOFDAY)
220         MESSAGE(FATAL_ERROR "No timing function found!")
221     ENDIF()
223     CHECK_FUNCTION_EXISTS(nanosleep HAVE_NANOSLEEP)
224     IF(NOT HAVE_NANOSLEEP)
225         MESSAGE(FATAL_ERROR "No sleep function found!")
226     ENDIF()
228     CHECK_C_COMPILER_FLAG(-pthread HAVE_PTHREAD)
229     IF(HAVE_PTHREAD)
230         ADD_DEFINITIONS(-pthread)
231         SET(EXTRA_LIBS ${EXTRA_LIBS} -pthread)
232     ENDIF()
234     # We need pthreads outside of Windows
235     CHECK_INCLUDE_FILE(pthread.h HAVE_PTHREAD_H)
236     IF(NOT HAVE_PTHREAD_H)
237         MESSAGE(FATAL_ERROR "PThreads is required for non-Windows builds!")
238     ENDIF()
239     # Some systems need pthread_np.h to get recursive mutexes
240     CHECK_INCLUDE_FILES("pthread.h;pthread_np.h" HAVE_PTHREAD_NP_H)
242     # _GNU_SOURCE is needed on some systems for extra attributes, and
243     # _REENTRANT is needed for libc thread-safety
244     ADD_DEFINITIONS(-D_GNU_SOURCE=1)
245     CHECK_LIBRARY_EXISTS(pthread pthread_create "" HAVE_LIBPTHREAD)
246     IF(HAVE_LIBPTHREAD)
247         SET(EXTRA_LIBS pthread ${EXTRA_LIBS})
248     ENDIF()
250     CHECK_LIBRARY_EXISTS(pthread pthread_setschedparam "" HAVE_PTHREAD_SETSCHEDPARAM)
252     CHECK_LIBRARY_EXISTS(rt clock_gettime "" HAVE_LIBRT)
253     IF(HAVE_LIBRT)
254         SET(EXTRA_LIBS rt ${EXTRA_LIBS})
255     ENDIF()
256 ENDIF()
258 # Check for a 64-bit type
259 CHECK_INCLUDE_FILE(stdint.h HAVE_STDINT_H)
260 IF(NOT HAVE_STDINT_H)
261     IF(HAVE_WINDOWS_H)
262         CHECK_C_SOURCE_COMPILES("\#define _WIN32_WINNT 0x0500
263                                  \#include <windows.h>
264                                  __int64 foo;
265                                  int main() {return 0;}" HAVE___INT64)
266     ENDIF()
267     IF(NOT HAVE___INT64)
268         IF(NOT SIZEOF_LONG MATCHES "8")
269             IF(NOT SIZEOF_LONG_LONG MATCHES "8")
270                 MESSAGE(FATAL_ERROR "No 64-bit types found, please report!")
271             ENDIF()
272         ENDIF()
273     ENDIF()
274 ENDIF()
277 SET(OPENAL_OBJS  OpenAL32/alAuxEffectSlot.c
278                  OpenAL32/alBuffer.c
279                  OpenAL32/alDatabuffer.c
280                  OpenAL32/alEffect.c
281                  OpenAL32/alError.c
282                  OpenAL32/alExtension.c
283                  OpenAL32/alFilter.c
284                  OpenAL32/alListener.c
285                  OpenAL32/alSource.c
286                  OpenAL32/alState.c
287                  OpenAL32/alThunk.c
289 SET(ALC_OBJS  Alc/ALc.c
290               Alc/ALu.c
291               Alc/alcConfig.c
292               Alc/alcEcho.c
293               Alc/alcReverb.c
294               Alc/alcRing.c
295               Alc/alcThread.c
296               Alc/bs2b.c
297               Alc/wave.c
300 SET(BACKENDS "")
302 # Check ALSA backend
303 IF(ALSA)
304     CHECK_INCLUDE_FILE(alsa/asoundlib.h HAVE_ALSA_ASOUNDLIB_H)
305     IF(HAVE_ALSA_ASOUNDLIB_H)
306         CHECK_LIBRARY_EXISTS(asound snd_pcm_open "" HAVE_LIBASOUND)
307         IF(HAVE_DLFCN_H OR HAVE_LIBASOUND)
308             SET(HAVE_ALSA 1)
309             SET(ALC_OBJS  ${ALC_OBJS} Alc/alsa.c)
310             IF(HAVE_DLFCN_H)
311                 SET(BACKENDS  "${BACKENDS} ALSA,")
312             ELSE()
313                 SET(BACKENDS  "${BACKENDS} ALSA \(linked\),")
314                 SET(EXTRA_LIBS asound ${EXTRA_LIBS})
315             ENDIF()
316         ENDIF()
317     ENDIF()
318 ENDIF()
320 # Check OSS backend
321 IF(OSS)
322     CHECK_INCLUDE_FILE(sys/soundcard.h HAVE_SYS_SOUNDCARD_H)
323     IF(HAVE_SYS_SOUNDCARD_H)
324         SET(HAVE_OSS 1)
325         SET(ALC_OBJS  ${ALC_OBJS} Alc/oss.c)
326         SET(BACKENDS  "${BACKENDS} OSS,")
327     ENDIF()
328 ENDIF()
330 # Check Solaris backend
331 IF(SOLARIS)
332     CHECK_INCLUDE_FILE(sys/audioio.h HAVE_SYS_AUDIOIO_H)
333     IF(HAVE_SYS_AUDIOIO_H)
334         SET(HAVE_SOLARIS 1)
335         SET(ALC_OBJS  ${ALC_OBJS} Alc/solaris.c)
336         SET(BACKENDS  "${BACKENDS} Solaris,")
337     ENDIF()
338 ENDIF()
340 # Check DSound/MMSystem backend
341 IF(DSOUND)
342     CHECK_INCLUDE_FILE(dsound.h HAVE_DSOUND_H)
343     IF(HAVE_DSOUND_H)
344         CHECK_LIBRARY_EXISTS(dsound DirectSoundCreate "" HAVE_LIBDSOUND)
345         IF(HAVE_LIBDSOUND OR WIN32)
346             SET(HAVE_DSOUND 1)
347             SET(ALC_OBJS  ${ALC_OBJS} Alc/dsound.c)
349             IF(WIN32)
350                 SET(BACKENDS  "${BACKENDS} DirectSound,")
351             ELSE()
352                 SET(BACKENDS  "${BACKENDS} DirectSound \(linked\),")
353                 SET(EXTRA_LIBS dsound ${EXTRA_LIBS})
354             ENDIF()
355         ENDIF()
356     ENDIF()
357 ENDIF()
358 IF(HAVE_WINDOWS_H)
359     IF(WINMM)
360         CHECK_INCLUDE_FILES("windows.h;mmsystem.h" HAVE_MMSYSTEM_H -D_WIN32_WINNT=0x0500)
361         IF(HAVE_MMSYSTEM_H)
362             SET(HAVE_WINMM 1)
363             SET(ALC_OBJS  ${ALC_OBJS} Alc/winmm.c)
364             SET(BACKENDS  "${BACKENDS} WinMM,")
366             SET(CMAKE_REQUIRED_LIBRARIES winmm)
367             CHECK_C_SOURCE_COMPILES("int main() {return 0;}" HAVE_LIBWINMM)
368             SET(CMAKE_REQUIRED_LIBRARIES "")
369 #            CHECK_LIBRARY_EXISTS(winmm waveInOpen "" HAVE_LIBWINMM)
370             IF(HAVE_LIBWINMM)
371                 SET(EXTRA_LIBS winmm ${EXTRA_LIBS})
372             ENDIF()
373         ENDIF()
374     ENDIF()
375 ENDIF()
377 # Check PortAudio backend
378 IF(PORTAUDIO)
379     CHECK_INCLUDE_FILE(portaudio.h HAVE_PORTAUDIO_H)
380     IF(HAVE_PORTAUDIO_H)
381         CHECK_LIBRARY_EXISTS(portaudio Pa_Initialize "" HAVE_LIBPORTAUDIO)
382         IF(HAVE_LIBPORTAUDIO)
383             SET(HAVE_PORTAUDIO 1)
384             SET(ALC_OBJS  ${ALC_OBJS} Alc/portaudio.c)
385             IF(HAVE_DLFCN_H)
386                 SET(BACKENDS  "${BACKENDS} PortAudio,")
387             ELSE()
388                 SET(BACKENDS  "${BACKENDS} PortAudio \(linked\),")
389                 SET(EXTRA_LIBS portaudio ${EXTRA_LIBS})
390             ENDIF()
391         ENDIF()
392     ENDIF()
393 ENDIF()
395 # Check PortAudio backend
396 IF(PULSEAUDIO)
397     CHECK_INCLUDE_FILE(pulse/pulseaudio.h HAVE_PULSE_PULSEAUDIO_H)
398     IF(HAVE_PULSE_PULSEAUDIO_H)
399         CHECK_LIBRARY_EXISTS(pulse pa_context_new "" HAVE_LIBPULSE)
400         IF(HAVE_LIBPULSE)
401             SET(HAVE_PULSEAUDIO 1)
402             SET(ALC_OBJS  ${ALC_OBJS} Alc/pulseaudio.c)
403             IF(HAVE_DLFCN_H)
404                 SET(BACKENDS  "${BACKENDS} PulseAudio,")
405             ELSE()
406                 SET(BACKENDS  "${BACKENDS} PulseAudio \(linked\),")
407                 SET(EXTRA_LIBS pulse ${EXTRA_LIBS})
408             ENDIF()
409         ENDIF()
410     ENDIF()
411 ENDIF()
413 # This is always available
414 SET(BACKENDS  "${BACKENDS} WaveFile")
416 # Needed for openal.pc.in
417 SET(prefix ${CMAKE_INSTALL_PREFIX})
418 SET(exec_prefix "\${prefix}")
419 SET(libdir "\${exec_prefix}/${LIB_INSTALL_DIR}")
420 SET(bindir "\${exec_prefix}/bin")
421 SET(includedir "\${prefix}/include")
422 SET(PACKAGE_VERSION "${LIB_VERSION}")
424 # End configuration
425 CONFIGURE_FILE(
426     "${OpenAL_SOURCE_DIR}/config.h.in"
427     "${OpenAL_BINARY_DIR}/config.h")
428 CONFIGURE_FILE(
429     "${OpenAL_SOURCE_DIR}/admin/pkgconfig/openal.pc.in"
430     "${OpenAL_BINARY_DIR}/admin/pkgconfig/openal.pc"
431     @ONLY)
433 ADD_DEFINITIONS(-DAL_BUILD_LIBRARY)
435 # Build a library
436 IF(NOT LIBTYPE)
437     SET(LIBTYPE SHARED)
438 ENDIF()
439 ADD_LIBRARY(${LIBNAME} ${LIBTYPE} ${OPENAL_OBJS} ${ALC_OBJS})
440 SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES VERSION ${LIB_VERSION}
441                                             SOVERSION ${LIB_MAJOR_VERSION})
442 IF(WIN32)
443     SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES PREFIX "")
444 ENDIF()
446 TARGET_LINK_LIBRARIES(${LIBNAME} ${EXTRA_LIBS})
448 # Add an install target here
449 INSTALL(TARGETS ${LIBNAME}
450         RUNTIME DESTINATION bin
451         LIBRARY DESTINATION ${LIB_INSTALL_DIR}
452         ARCHIVE DESTINATION ${LIB_INSTALL_DIR}
454 INSTALL(FILES include/AL/al.h
455               include/AL/alc.h
456               include/AL/alext.h
457         DESTINATION include/AL
459 INSTALL(FILES "${OpenAL_BINARY_DIR}/admin/pkgconfig/openal.pc"
460         DESTINATION "${LIB_INSTALL_DIR}/pkgconfig")
462 # Install alsoft.conf configuration file
463 IF(ALSOFT_CONFIG)
464     INSTALL(FILES alsoftrc.sample
465             DESTINATION /etc/openal
466             RENAME alsoft.conf
467     )
468 ENDIF()
470 IF(EXAMPLES)
471     ADD_EXECUTABLE(openal-info examples/openal-info.c)
472     TARGET_LINK_LIBRARIES(openal-info ${LIBNAME})
473     INSTALL(TARGETS openal-info
474             RUNTIME DESTINATION bin
475             LIBRARY DESTINATION ${LIB_INSTALL_DIR}
476             ARCHIVE DESTINATION ${LIB_INSTALL_DIR}
477     )
478 ENDIF()
480 MESSAGE(STATUS "")
481 MESSAGE(STATUS "Building OpenAL with support for the following backends:")
482 MESSAGE(STATUS "    ${BACKENDS}")
483 MESSAGE(STATUS "")
485 IF(WIN32)
486     IF(NOT HAVE_DSOUND)
487         MESSAGE(STATUS "WARNING: Building the Windows version without DirectSound output")
488         MESSAGE(STATUS "         This is probably NOT what you want!")
489         MESSAGE(STATUS "")
490     ENDIF()
491 ENDIF()