Use a 12dB/oct rolloff instead of 24 for the lowpass filter
[openal-soft.git] / CMakeLists.txt
bloba2afea99a090280a50edb4b7cacaecd4ae820305
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/lpfilter.c
235               Alc/wave.c
238 SET(BACKENDS "")
240 # Check ALSA backend
241 IF(ALSA)
242     CHECK_INCLUDE_FILE(alsa/asoundlib.h HAVE_ALSA_ASOUNDLIB_H)
243     IF(HAVE_ALSA_ASOUNDLIB_H)
244         CHECK_LIBRARY_EXISTS(asound snd_pcm_open "" HAVE_LIBASOUND)
245         IF(HAVE_DLFCN_H OR HAVE_LIBASOUND)
246             SET(HAVE_ALSA 1)
247             SET(ALC_OBJS  ${ALC_OBJS} Alc/alsa.c)
248             IF(HAVE_DLFCN_H)
249                 SET(BACKENDS  "${BACKENDS} ALSA,")
250             ELSE()
251                 SET(BACKENDS  "${BACKENDS} ALSA \(linked\),")
252                 SET(EXTRA_LIBS asound ${EXTRA_LIBS})
253             ENDIF()
254         ENDIF()
255     ENDIF()
256 ENDIF()
258 # Check OSS backend
259 IF(OSS)
260     CHECK_INCLUDE_FILE(sys/soundcard.h HAVE_SYS_SOUNDCARD_H)
261     IF(HAVE_SYS_SOUNDCARD_H)
262         SET(HAVE_OSS 1)
263         SET(ALC_OBJS  ${ALC_OBJS} Alc/oss.c)
264         SET(BACKENDS  "${BACKENDS} OSS,")
265     ENDIF()
266 ENDIF()
268 # Check Solaris backend
269 IF(SOLARIS)
270     CHECK_INCLUDE_FILE(sys/audioio.h HAVE_SYS_AUDIOIO_H)
271     IF(HAVE_SYS_AUDIOIO_H)
272         SET(HAVE_SOLARIS 1)
273         SET(ALC_OBJS  ${ALC_OBJS} Alc/solaris.c)
274         SET(BACKENDS  "${BACKENDS} Solaris,")
275     ENDIF()
276 ENDIF()
278 # Check DSound/MMSystem backend
279 IF(HAVE_WINDOWS_H)
280     IF(DSOUND)
281         CHECK_INCLUDE_FILE(dsound.h HAVE_DSOUND_H)
282         IF(HAVE_DSOUND_H)
283             SET(HAVE_DSOUND 1)
284             SET(ALC_OBJS  ${ALC_OBJS} Alc/dsound.c)
285             SET(BACKENDS  "${BACKENDS} DirectSound,")
287             SET(CMAKE_REQUIRED_LIBRARIES dsound)
288             CHECK_C_SOURCE_COMPILES("int main() {return 0;}" HAVE_LIBDSOUND)
289             SET(CMAKE_REQUIRED_LIBRARIES "")
290 #            CHECK_LIBRARY_EXISTS(dsound DirectSoundCreate "" HAVE_LIBDSOUND)
291             IF(HAVE_LIBDSOUND)
292                 SET(EXTRA_LIBS dsound ${EXTRA_LIBS})
293             ENDIF()
294         ENDIF()
295     ENDIF()
296     IF(WINMM)
297         CHECK_INCLUDE_FILES("windows.h;mmsystem.h" HAVE_MMSYSTEM_H -D_WIN32_WINNT=0x0500)
298         IF(HAVE_MMSYSTEM_H)
299             SET(HAVE_WINMM 1)
300             SET(ALC_OBJS  ${ALC_OBJS} Alc/winmm.c)
301             SET(BACKENDS  "${BACKENDS} WinMM,")
303             SET(CMAKE_REQUIRED_LIBRARIES winmm)
304             CHECK_C_SOURCE_COMPILES("int main() {return 0;}" HAVE_LIBWINMM)
305             SET(CMAKE_REQUIRED_LIBRARIES "")
306 #            CHECK_LIBRARY_EXISTS(winmm waveInOpen "" HAVE_LIBWINMM)
307             IF(HAVE_LIBWINMM)
308                 SET(EXTRA_LIBS winmm ${EXTRA_LIBS})
309             ENDIF()
310         ENDIF()
311     ENDIF()
312 ENDIF()
314 # This is always available
315 SET(BACKENDS  "${BACKENDS} WaveFile")
317 # Needed for openal.pc.in
318 SET(prefix ${CMAKE_INSTALL_PREFIX})
319 SET(exec_prefix "\${prefix}")
320 SET(libdir "\${exec_prefix}/${LIB_INSTALL_DIR}")
321 SET(bindir "\${exec_prefix}/bin")
322 SET(includedir "\${prefix}/include")
323 SET(PACKAGE_VERSION "${LIB_VERSION}")
325 # End configuration
326 CONFIGURE_FILE(
327     "${OpenAL_SOURCE_DIR}/config.h.in"
328     "${OpenAL_BINARY_DIR}/config.h")
329 CONFIGURE_FILE(
330     "${OpenAL_SOURCE_DIR}/admin/pkgconfig/openal.pc.in"
331     "${OpenAL_BINARY_DIR}/admin/pkgconfig/openal.pc"
332     @ONLY)
334 ADD_DEFINITIONS(-DAL_BUILD_LIBRARY)
336 # Build a shared library
337 ADD_LIBRARY(${LIBNAME} SHARED ${OPENAL_OBJS} ${ALC_OBJS})
338 SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES VERSION ${LIB_VERSION}
339                                             SOVERSION ${LIB_MAJOR_VERSION})
340 IF(WIN32)
341     SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES PREFIX "")
342 ENDIF()
344 TARGET_LINK_LIBRARIES(${LIBNAME} ${EXTRA_LIBS})
346 # Add an install target here
347 INSTALL(TARGETS ${LIBNAME}
348         RUNTIME DESTINATION bin
349         LIBRARY DESTINATION ${LIB_INSTALL_DIR}
350         ARCHIVE DESTINATION ${LIB_INSTALL_DIR}
352 INSTALL(FILES include/AL/al.h
353               include/AL/alc.h
354               include/AL/alext.h
355         DESTINATION include/AL
357 INSTALL(FILES "${OpenAL_BINARY_DIR}/admin/pkgconfig/openal.pc"
358         DESTINATION lib/pkgconfig)
360 IF(EXAMPLES)
361     ADD_EXECUTABLE(openal-info examples/openal-info.c)
362     TARGET_LINK_LIBRARIES(openal-info ${LIBNAME})
363     INSTALL(TARGETS openal-info
364             RUNTIME DESTINATION bin
365             LIBRARY DESTINATION ${LIB_INSTALL_DIR}
366             ARCHIVE DESTINATION ${LIB_INSTALL_DIR}
367     )
368 ENDIF()
370 MESSAGE(STATUS "")
371 MESSAGE(STATUS "Building OpenAL with support for the following backends:")
372 MESSAGE(STATUS "    ${BACKENDS}")
373 MESSAGE(STATUS "")
375 IF(WIN32 AND NOT HAVE_DSOUND)
376     MESSAGE(STATUS "WARNING: Building the Windows version without DirectSound output")
377     MESSAGE(STATUS "         This is probably NOT what you want!")
378     MESSAGE(STATUS "")
379 ENDIF()