The wet path should be silent if no effect is set on the slot
[openal-soft/openal-hmr.git] / CMakeLists.txt
blob1883ee81761e1c660ca1e32627ddffc2161a6c66
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)
18 PROJECT(OpenAL C)
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)
30 OPTION(DLOPEN  "Check for the dlopen API for loading optional libs"  ON)
32 OPTION(WERROR  "Treat compile warnings as errors"      OFF)
34 OPTION(EXAMPLES  "Build example programs"              ON)
37 IF(WIN32)
38     SET(LIBNAME openal32)
39 ELSE()
40     SET(LIBNAME openal)
41 ENDIF()
43 SET(LIB_MAJOR_VERSION "1")
44 SET(LIB_MINOR_VERSION "5")
45 SET(LIB_BUILD_VERSION "304")
46 SET(LIB_VERSION "${LIB_MAJOR_VERSION}.${LIB_MINOR_VERSION}.${LIB_BUILD_VERSION}")
47 IF(NOT DEFINED LIB_INSTALL_DIR)
48   SET(LIB_INSTALL_DIR "lib")
49 ENDIF(NOT DEFINED LIB_INSTALL_DIR)
52 CHECK_TYPE_SIZE("long" SIZEOF_LONG)
53 CHECK_TYPE_SIZE("long long" SIZEOF_LONG_LONG)
54 CHECK_TYPE_SIZE("unsigned int" SIZEOF_UINT)
55 CHECK_TYPE_SIZE("void*" SIZEOF_VOIDP)
58 # Add definitions, compiler switches, etc.
59 INCLUDE_DIRECTORIES(OpenAL32/Include include "${OpenAL_BINARY_DIR}")
61 IF(NOT CMAKE_BUILD_TYPE)
62     SET(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING
63         "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel."
64         FORCE)
65 ENDIF()
67 IF(MSVC)
68     # ???
69     SET(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -D_DEBUG")
70     SET(CMAKE_C_FLAGS_MINSIZEREL "${CMAKE_C_FLAGS_MINSIZEREL} -DNDEBUG")
71     SET(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -DNDEBUG")
72     SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -D_DEBUG")
73 ELSE()
74     ADD_DEFINITIONS(-Wall)
75     CHECK_C_COMPILER_FLAG(-Wextra HAVE_W_EXTRA)
76     IF("${HAVE_W_EXTRA}")
77         ADD_DEFINITIONS(-Wextra)
78     ENDIF()
80     IF(WERROR)
81         ADD_DEFINITIONS(-Werror)
82     ENDIF()
84     SET(CMAKE_C_FLAGS_RELWITHDEBINFO "-g -O2 -funroll-loops -D_DEBUG" CACHE STRING
85         "Flags used by the compiler during Release with Debug Info builds."
86         FORCE)
87     SET(CMAKE_C_FLAGS_MINSIZEREL "-Os -DNDEBUG" CACHE STRING
88         "Flags used by the compiler during release minsize builds."
89         FORCE)
90     SET(CMAKE_C_FLAGS_RELEASE "-O2 -funroll-loops -fomit-frame-pointer -DNDEBUG" CACHE STRING
91         "Flags used by the compiler during release builds"
92         FORCE)
93     SET(CMAKE_C_FLAGS_DEBUG "-g3 -D_DEBUG" CACHE STRING
94         "Flags used by the compiler during debug builds."
95         FORCE)
97     # Set visibility options if available
98     IF(NOT WIN32)
99         CHECK_C_SOURCE_COMPILES("int foo() __attribute__((destructor));
100                                  int main() {return 0;}" HAVE_GCC_DESTRUCTOR)
102         CHECK_C_COMPILER_FLAG(-fvisibility=hidden HAVE_VISIBILITY_SWITCH)
103         IF("${HAVE_VISIBILITY_SWITCH}")
104             CHECK_C_SOURCE_COMPILES("int foo() __attribute__((visibility(\"default\")));
105                                      int main() {return 0;}" HAVE_GCC_VISIBILITY)
106             IF("${HAVE_GCC_VISIBILITY}")
107                 ADD_DEFINITIONS(-fvisibility=hidden -DHAVE_GCC_VISIBILITY)
108             ENDIF()
109         ENDIF()
110     ENDIF()
111 ENDIF()
113 CHECK_INCLUDE_FILE(fenv.h HAVE_FENV_H)
115 CHECK_LIBRARY_EXISTS(m  sqrtf  "" HAVE_SQRTF)
116 CHECK_LIBRARY_EXISTS(m  acosf  "" HAVE_ACOSF)
117 IF(HAVE_FENV_H)
118     CHECK_LIBRARY_EXISTS(m  fesetround  "" HAVE_FESETROUND)
119 ENDIF()
120 IF(HAVE_SQRTF OR HAVE_ACOSF OR HAVE_FESETROUND)
121     SET(EXTRA_LIBS m ${EXTRA_LIBS})
122 ENDIF()
123 CHECK_FUNCTION_EXISTS(strtof HAVE_STRTOF)
124 CHECK_FUNCTION_EXISTS(_controlfp HAVE__CONTROLFP)
126 CHECK_FUNCTION_EXISTS(strcasecmp HAVE_STRCASECMP)
127 IF(NOT HAVE_STRCASECMP)
128     CHECK_FUNCTION_EXISTS(_stricmp HAVE__STRICMP)
129     IF(NOT HAVE__STRICMP)
130         MESSAGE(FATAL_ERROR "No case-insensitive compare function found, please report!")
131     ENDIF()
133     ADD_DEFINITIONS(-Dstrcasecmp=_stricmp)
134 ENDIF()
136 CHECK_FUNCTION_EXISTS(strncasecmp HAVE_STRNCASECMP)
137 IF(NOT HAVE_STRNCASECMP)
138     CHECK_FUNCTION_EXISTS(_strnicmp HAVE__STRNICMP)
139     IF(NOT HAVE__STRNICMP)
140         MESSAGE(FATAL_ERROR "No case-insensitive size-limitted compare function found, please report!")
141     ENDIF()
143     ADD_DEFINITIONS(-Dstrncasecmp=_strnicmp)
144 ENDIF()
146 CHECK_FUNCTION_EXISTS(snprintf HAVE_SNPRINTF)
147 IF(NOT HAVE_SNPRINTF)
148     CHECK_FUNCTION_EXISTS(_snprintf HAVE__SNPRINTF)
149     IF(NOT HAVE__SNPRINTF)
150         MESSAGE(FATAL_ERROR "No snprintf function found, please report!")
151     ENDIF()
153     ADD_DEFINITIONS(-Dsnprintf=_snprintf)
154 ENDIF()
156 # Check for the dlopen API (for dynamicly loading backend libs)
157 IF(DLOPEN)
158     CHECK_INCLUDE_FILE(dlfcn.h HAVE_DLFCN_H)
159     IF(HAVE_DLFCN_H)
160         CHECK_LIBRARY_EXISTS(dl dlopen "" HAVE_LIBDL)
161         IF(HAVE_LIBDL)
162             SET(EXTRA_LIBS dl ${EXTRA_LIBS})
163         ENDIF()
164     ENDIF()
165 ENDIF()
167 # Check if we have Windows headers
168 CHECK_INCLUDE_FILE(windows.h HAVE_WINDOWS_H -D_WIN32_WINNT=0x0500)
169 IF(NOT HAVE_WINDOWS_H)
170     CHECK_FUNCTION_EXISTS(gettimeofday HAVE_GETTIMEOFDAY)
171     IF(NOT HAVE_GETTIMEOFDAY)
172         MESSAGE(FATAL_ERROR "No timing function found!")
173     ENDIF()
175     CHECK_FUNCTION_EXISTS(nanosleep HAVE_NANOSLEEP)
176     IF(NOT HAVE_NANOSLEEP)
177         MESSAGE(FATAL_ERROR "No sleep function found!")
178     ENDIF()
180     # We need pthreads outside of Windows
181     CHECK_INCLUDE_FILE(pthread.h HAVE_PTHREAD_H)
182     IF(NOT HAVE_PTHREAD_H)
183         MESSAGE(FATAL_ERROR "PThreads is required for non-Windows builds!")
184     ENDIF()
186     # Some systems need pthread_np.h to get recursive mutexes
187     CHECK_INCLUDE_FILES("pthread.h;pthread_np.h" HAVE_PTHREAD_NP_H)
189     # _GNU_SOURCE is needed on some systems for extra attributes, and
190     # _REENTRANT is needed for libc thread-safety
191     ADD_DEFINITIONS(-D_GNU_SOURCE=1 -D_REENTRANT)
192     CHECK_LIBRARY_EXISTS(pthread pthread_create "" HAVE_LIBPTHREAD)
193     IF(HAVE_LIBPTHREAD)
194         SET(EXTRA_LIBS pthread ${EXTRA_LIBS})
195     ENDIF()
196 ENDIF()
198 # Check for a 64-bit type
199 CHECK_INCLUDE_FILE(stdint.h HAVE_STDINT_H)
200 IF(NOT HAVE_STDINT_H)
201     IF(HAVE_WINDOWS_H)
202         CHECK_C_SOURCE_COMPILES("\#define _WIN32_WINNT 0x0500
203                                  \#include <windows.h>
204                                  __int64 foo;
205                                  int main() {return 0;}" HAVE___INT64)
206     ENDIF()
207     IF(NOT HAVE___INT64)
208         IF(NOT SIZEOF_LONG MATCHES "8")
209             IF(NOT SIZEOF_LONG_LONG MATCHES "8")
210                 MESSAGE(FATAL_ERROR "No 64-bit types found, please report!")
211             ENDIF()
212         ENDIF()
213     ENDIF()
214 ENDIF()
217 SET(OPENAL_OBJS  OpenAL32/alAuxEffectSlot.c
218                  OpenAL32/alBuffer.c
219                  OpenAL32/alEffect.c
220                  OpenAL32/alError.c
221                  OpenAL32/alExtension.c
222                  OpenAL32/alFilter.c
223                  OpenAL32/alListener.c
224                  OpenAL32/alSource.c
225                  OpenAL32/alState.c
226                  OpenAL32/alThunk.c
228 SET(ALC_OBJS  Alc/ALc.c
229               Alc/ALu.c
230               Alc/alcConfig.c
231               Alc/alcRing.c
232               Alc/alcThread.c
233               Alc/bs2b.c
234               Alc/wave.c
237 SET(BACKENDS "")
239 # Check ALSA backend
240 IF(ALSA)
241     CHECK_INCLUDE_FILE(alsa/asoundlib.h HAVE_ALSA_ASOUNDLIB_H)
242     IF(HAVE_ALSA_ASOUNDLIB_H)
243         CHECK_LIBRARY_EXISTS(asound snd_pcm_open "" HAVE_LIBASOUND)
244         IF(HAVE_DLFCN_H OR HAVE_LIBASOUND)
245             SET(HAVE_ALSA 1)
246             SET(ALC_OBJS  ${ALC_OBJS} Alc/alsa.c)
247             IF(HAVE_DLFCN_H)
248                 SET(BACKENDS  "${BACKENDS} ALSA,")
249             ELSE()
250                 SET(BACKENDS  "${BACKENDS} ALSA \(linked\),")
251                 SET(EXTRA_LIBS asound ${EXTRA_LIBS})
252             ENDIF()
253         ENDIF()
254     ENDIF()
255 ENDIF()
257 # Check OSS backend
258 IF(OSS)
259     CHECK_INCLUDE_FILE(sys/soundcard.h HAVE_SYS_SOUNDCARD_H)
260     IF(HAVE_SYS_SOUNDCARD_H)
261         SET(HAVE_OSS 1)
262         SET(ALC_OBJS  ${ALC_OBJS} Alc/oss.c)
263         SET(BACKENDS  "${BACKENDS} OSS,")
264     ENDIF()
265 ENDIF()
267 # Check Solaris backend
268 IF(SOLARIS)
269     CHECK_INCLUDE_FILE(sys/audioio.h HAVE_SYS_AUDIOIO_H)
270     IF(HAVE_SYS_AUDIOIO_H)
271         SET(HAVE_SOLARIS 1)
272         SET(ALC_OBJS  ${ALC_OBJS} Alc/solaris.c)
273         SET(BACKENDS  "${BACKENDS} Solaris,")
274     ENDIF()
275 ENDIF()
277 # Check DSound/MMSystem backend
278 IF(HAVE_WINDOWS_H)
279     IF(DSOUND)
280         CHECK_INCLUDE_FILE(dsound.h HAVE_DSOUND_H)
281         IF(HAVE_DSOUND_H)
282             SET(HAVE_DSOUND 1)
283             SET(ALC_OBJS  ${ALC_OBJS} Alc/dsound.c)
284             SET(BACKENDS  "${BACKENDS} DirectSound,")
286             SET(CMAKE_REQUIRED_LIBRARIES dsound)
287             CHECK_C_SOURCE_COMPILES("int main() {return 0;}" HAVE_LIBDSOUND)
288             SET(CMAKE_REQUIRED_LIBRARIES "")
289 #            CHECK_LIBRARY_EXISTS(dsound DirectSoundCreate "" HAVE_LIBDSOUND)
290             IF(HAVE_LIBDSOUND)
291                 SET(EXTRA_LIBS dsound ${EXTRA_LIBS})
292             ENDIF()
293         ENDIF()
294     ENDIF()
295     IF(WINMM)
296         CHECK_INCLUDE_FILES("windows.h;mmsystem.h" HAVE_MMSYSTEM_H -D_WIN32_WINNT=0x0500)
297         IF(HAVE_MMSYSTEM_H)
298             SET(HAVE_WINMM 1)
299             SET(ALC_OBJS  ${ALC_OBJS} Alc/winmm.c)
300             SET(BACKENDS  "${BACKENDS} WinMM,")
302             SET(CMAKE_REQUIRED_LIBRARIES winmm)
303             CHECK_C_SOURCE_COMPILES("int main() {return 0;}" HAVE_LIBWINMM)
304             SET(CMAKE_REQUIRED_LIBRARIES "")
305 #            CHECK_LIBRARY_EXISTS(winmm waveInOpen "" HAVE_LIBWINMM)
306             IF(HAVE_LIBWINMM)
307                 SET(EXTRA_LIBS winmm ${EXTRA_LIBS})
308             ENDIF()
309         ENDIF()
310     ENDIF()
311 ENDIF()
313 # This is always available
314 SET(BACKENDS  "${BACKENDS} WaveFile")
316 # Needed for openal.pc.in
317 SET(prefix ${CMAKE_INSTALL_PREFIX})
318 SET(exec_prefix "\${prefix}")
319 SET(libdir "\${exec_prefix}/${LIB_INSTALL_DIR}")
320 SET(bindir "\${exec_prefix}/bin")
321 SET(includedir "\${prefix}/include")
322 SET(PACKAGE_VERSION "${LIB_VERSION}")
324 # End configuration
325 CONFIGURE_FILE(
326     "${OpenAL_SOURCE_DIR}/config.h.in"
327     "${OpenAL_BINARY_DIR}/config.h")
328 CONFIGURE_FILE(
329     "${OpenAL_SOURCE_DIR}/admin/pkgconfig/openal.pc.in"
330     "${OpenAL_BINARY_DIR}/admin/pkgconfig/openal.pc"
331     @ONLY)
333 ADD_DEFINITIONS(-DAL_BUILD_LIBRARY)
335 # Build a library
336 IF(NOT LIBTYPE)
337     SET(LIBTYPE SHARED)
338 ENDIF()
339 ADD_LIBRARY(${LIBNAME} ${LIBTYPE} ${OPENAL_OBJS} ${ALC_OBJS})
340 SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES VERSION ${LIB_VERSION}
341                                             SOVERSION ${LIB_MAJOR_VERSION})
342 IF(WIN32)
343     SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES PREFIX "")
344 ENDIF()
346 TARGET_LINK_LIBRARIES(${LIBNAME} ${EXTRA_LIBS})
348 # Add an install target here
349 INSTALL(TARGETS ${LIBNAME}
350         RUNTIME DESTINATION bin
351         LIBRARY DESTINATION ${LIB_INSTALL_DIR}
352         ARCHIVE DESTINATION ${LIB_INSTALL_DIR}
354 INSTALL(FILES include/AL/al.h
355               include/AL/alc.h
356               include/AL/alext.h
357         DESTINATION include/AL
359 INSTALL(FILES "${OpenAL_BINARY_DIR}/admin/pkgconfig/openal.pc"
360         DESTINATION lib/pkgconfig)
362 IF(EXAMPLES)
363     ADD_EXECUTABLE(openal-info examples/openal-info.c)
364     TARGET_LINK_LIBRARIES(openal-info ${LIBNAME})
365     INSTALL(TARGETS openal-info
366             RUNTIME DESTINATION bin
367             LIBRARY DESTINATION ${LIB_INSTALL_DIR}
368             ARCHIVE DESTINATION ${LIB_INSTALL_DIR}
369     )
370 ENDIF()
372 MESSAGE(STATUS "")
373 MESSAGE(STATUS "Building OpenAL with support for the following backends:")
374 MESSAGE(STATUS "    ${BACKENDS}")
375 MESSAGE(STATUS "")
377 IF(WIN32 AND NOT HAVE_DSOUND)
378     MESSAGE(STATUS "WARNING: Building the Windows version without DirectSound output")
379     MESSAGE(STATUS "         This is probably NOT what you want!")
380     MESSAGE(STATUS "")
381 ENDIF()