Make sure the stream is playing when it's full
[openal-soft.git] / CMakeLists.txt
blob18f9a365685e4b00c99c0c5e76ed96a9fad11e3c
1 # CMake build file list for OpenAL
3 INCLUDE(CheckFunctionExists)
4 INCLUDE(CheckLibraryExists)
5 INCLUDE(CheckIncludeFile)
6 INCLUDE(CheckIncludeFiles)
7 INCLUDE(CheckCCompilerFlag)
8 INCLUDE(CheckCSourceCompiles)
9 INCLUDE(CheckTypeSize)
12 PROJECT(OpenAL)
15 SET(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS TRUE)
18 OPTION(ALSA    "ALSA backend"                ON)
19 OPTION(OSS     "OSS backend"                 ON)
20 OPTION(DSOUND  "DirectSound backend"         ON)
21 OPTION(WINMM   "Windows Multimedia backend"  ON)
23 OPTION(DLOPEN  "Use the dlopen API for loading optional libs"  ON)
25 OPTION(DEBUG    "Build lib in debug mode"                   OFF)
26 OPTION(NODEBUG  "Disable all debug info for optimizations"  OFF)
27 OPTION(WERROR   "Treat compile warnings as errors"          OFF)
30 SET(LIB_MAJOR_VERSION "1")
31 SET(LIB_MINOR_VERSION "1")
32 SET(LIB_BUILD_VERSION "93")
33 SET(LIB_VERSION "${LIB_MAJOR_VERSION}.${LIB_MINOR_VERSION}.${LIB_BUILD_VERSION}")
36 CHECK_TYPE_SIZE("long" SIZEOF_LONG)
37 CHECK_TYPE_SIZE("long long" SIZEOF_LONG_LONG)
38 CHECK_TYPE_SIZE("unsigned int" SIZEOF_UINT)
39 CHECK_TYPE_SIZE("void*" SIZEOF_VOIDP)
42 # Add definitions, compiler switches, etc.
43 INCLUDE_DIRECTORIES(OpenAL32/Include include "${OpenAL_BINARY_DIR}")
45 IF("${MSVC}")
46     # ???
47 ELSE()
48     ADD_DEFINITIONS(-Wall)
49     CHECK_C_COMPILER_FLAG(-Wextra HAVE_W_EXTRA)
50     IF("${HAVE_W_EXTRA}")
51         ADD_DEFINITIONS(-Wextra)
52     ENDIF()
54     IF(WERROR)
55         ADD_DEFINITIONS(-Werror)
56     ENDIF()
58     IF(DEBUG)
59         ADD_DEFINITIONS(-g3)
60     ELSEIF(NODEBUG)
61         ADD_DEFINITIONS(-O2 -funroll-loops -fomit-frame-pointer)
62     ELSE()
63         ADD_DEFINITIONS(-g -O2 -funroll-loops)
64     ENDIF()
66     # The mixer doesn't like GCC's strict aliasing optimizations. Make sure
67     # it's turned off
68     CHECK_C_COMPILER_FLAG(-fstrict-aliasing HAVE_STRICT_ALIASING)
69     IF("${HAVE_STRICT_ALIASING}")
70         ADD_DEFINITIONS(-fno-strict-aliasing)
71     ENDIF()
73     # Set visibility options if available
74     IF(NOT "${WIN32}")
75         CHECK_C_SOURCE_COMPILES("int foo() __attribute__((destructor));
76                                  int main() {return 0;}" HAVE_GCC_DESTRUCTOR)
78         CHECK_C_COMPILER_FLAG(-fvisibility=hidden HAVE_VISIBILITY_SWITCH)
79         IF("${HAVE_VISIBILITY_SWITCH}")
80             CHECK_C_SOURCE_COMPILES("int foo() __attribute__((visibility(\"default\")));
81                                      int main() {return 0;}" HAVE_GCC_VISIBILITY)
82             IF("${HAVE_GCC_VISIBILITY}")
83                 ADD_DEFINITIONS(-fvisibility=hidden -DHAVE_GCC_VISIBILITY)
84             ENDIF()
85         ENDIF()
86     ENDIF()
87 ENDIF()
89 IF(DEBUG)
90     ADD_DEFINITIONS(-D_DEBUG)
91 ELSEIF(NODEBUG)
92     ADD_DEFINITIONS(-DNDEBUG)
93 ENDIF()
95 CHECK_LIBRARY_EXISTS(m  sqrtf  "" HAVE_SQRTF)
96 IF("${HAVE_SQRTF}")
97     SET(EXTRA_LIBS m ${EXTRA_LIBS})
98 ENDIF()
99 CHECK_FUNCTION_EXISTS(strtof HAVE_STRTOF)
101 CHECK_FUNCTION_EXISTS(strcasecmp HAVE_STRCASECMP)
102 IF(NOT "${HAVE_STRCASECMP}")
103     CHECK_FUNCTION_EXISTS(_stricmp HAVE__STRICMP)
104     IF(NOT "${HAVE__STRICMP}")
105         MESSAGE(FATAL_ERROR "No case-insensitive compare function found, please report!")
106     ENDIF()
108     ADD_DEFINITIONS(-Dstrcasecmp=_stricmp)
109 ENDIF()
111 CHECK_FUNCTION_EXISTS(snprintf HAVE_SNPRINTF)
112 IF(NOT "${HAVE_SNPRINTF}")
113     CHECK_FUNCTION_EXISTS(_snprintf HAVE__SNPRINTF)
114     IF(NOT "${HAVE__SNPRINTF}")
115         MESSAGE(FATAL_ERROR "No snprintf function found, please report!")
116     ENDIF()
118     ADD_DEFINITIONS(-Dsnprintf=_snprintf)
119 ENDIF()
121 # Check for the dlopen API (for dynamicly loading backend libs)
122 IF(DLOPEN)
123     CHECK_INCLUDE_FILE(dlfcn.h HAVE_DLFCN_H)
124     IF("${HAVE_DLFCN_H}")
125         CHECK_LIBRARY_EXISTS(dl dlopen "" HAVE_LIBDL)
126         IF("${HAVE_LIBDL}")
127             SET(EXTRA_LIBS dl ${EXTRA_LIBS})
128         ENDIF()
129     ENDIF()
130 ENDIF()
132 # Check if we have Windows headers
133 CHECK_INCLUDE_FILE(windows.h HAVE_WINDOWS_H)
134 IF(NOT "${HAVE_WINDOWS_H}")
135     CHECK_FUNCTION_EXISTS(gettimeofday HAVE_GETTIMEOFDAY)
136     IF(NOT "${HAVE_GETTIMEOFDAY}")
137         MESSAGE(FATAL_ERROR "No timing function found!")
138     ENDIF()
140     CHECK_FUNCTION_EXISTS(nanosleep HAVE_NANOSLEEP)
141     IF(NOT "${HAVE_NANOSLEEP}")
142         MESSAGE(FATAL_ERROR "No sleep function found!")
143     ENDIF()
145     # We need pthreads outside of Windows
146     CHECK_INCLUDE_FILE(pthread.h HAVE_PTHREAD_H)
147     IF(NOT "${HAVE_PTHREAD_H}")
148         MESSAGE(FATAL_ERROR "PThreads is required for non-Windows builds!")
149     ENDIF()
151     # _GNU_SOURCE is needed on some systems for extra attributes, and
152     # _REENTRANT is needed for libc thread-safety
153     ADD_DEFINITIONS(-D_GNU_SOURCE=1 -D_REENTRANT)
154     CHECK_LIBRARY_EXISTS(pthread pthread_create "" HAVE_LIBPTHREAD)
155     IF("${HAVE_LIBPTHREAD}")
156         SET(EXTRA_LIBS pthread ${EXTRA_LIBS})
157     ENDIF()
158 ENDIF()
160 # Check for a 64-bit type
161 CHECK_INCLUDE_FILE(stdint.h HAVE_STDINT_H)
162 IF(NOT "${HAVE_STDINT_H}")
163     IF("${HAVE_WINDOWS_H}")
164         CHECK_C_SOURCE_COMPILES("\#include <windows.h>
165                                  __int64 foo;
166                                  int main() {return 0;}" HAVE___INT64)
167     ENDIF()
168     IF(NOT "${HAVE___INT64}")
169         IF(NOT "${SIZEOF_LONG}" MATCHES "8")
170             IF(NOT "${SIZEOF_LONG_LONG}" MATCHES "8")
171                 MESSAGE(FATAL_ERROR "No 64-bit types found, please report!")
172             ENDIF()
173         ENDIF()
174     ENDIF()
175 ENDIF()
178 SET(OPENAL_OBJS  OpenAL32/alAuxEffectSlot.c
179                  OpenAL32/alBuffer.c
180                  OpenAL32/alEffect.c
181                  OpenAL32/alError.c
182                  OpenAL32/alExtension.c
183                  OpenAL32/alFilter.c
184                  OpenAL32/alListener.c
185                  OpenAL32/alSource.c
186                  OpenAL32/alState.c
187                  OpenAL32/alThunk.c
188                  OpenAL32/OpenAL32.c
190 SET(ALC_OBJS  Alc/ALc.c
191               Alc/ALu.c
192               Alc/alcConfig.c
193               Alc/alcRing.c
194               Alc/alcThread.c
195               Alc/bs2b.c
196               Alc/wave.c
199 SET(BACKENDS "")
201 # Check ALSA backend
202 IF(ALSA)
203     CHECK_INCLUDE_FILE(alsa/asoundlib.h HAVE_ALSA_ASOUNDLIB_H)
204     IF("${HAVE_ALSA_ASOUNDLIB_H}")
205         CHECK_LIBRARY_EXISTS(asound snd_pcm_open "" HAVE_LIBASOUND)
206         IF("${HAVE_DLFCN_H}" OR "${HAVE_LIBASOUND}")
207             SET(HAVE_ALSA 1)
208             SET(ALC_OBJS  ${ALC_OBJS} Alc/alsa.c)
209             IF("${HAVE_DLFCN_H}")
210                 SET(BACKENDS  ${BACKENDS} ALSA)
211             ELSE()
212                 SET(BACKENDS  ${BACKENDS} ALSA\(linked\))
213                 SET(EXTRA_LIBS asound ${EXTRA_LIBS})
214             ENDIF()
215         ENDIF()
216     ENDIF()
217 ENDIF()
219 # Check OSS backend
220 IF(OSS)
221     CHECK_INCLUDE_FILE(sys/soundcard.h HAVE_SYS_SOUNDCARD_H)
222     IF("${HAVE_SYS_SOUNDCARD_H}")
223         SET(HAVE_OSS 1)
224         SET(ALC_OBJS  ${ALC_OBJS} Alc/oss.c)
225         SET(BACKENDS  ${BACKENDS} OSS)
226     ENDIF()
227 ENDIF()
229 # Check DSound/MMSystem backend
230 IF("${HAVE_WINDOWS_H}")
231     SET(CMAKE_REQUIRED_LIBRARIES ole32)
232     CHECK_C_SOURCE_COMPILES("int main() {return 0;}" HAVE_LIBOLE32)
233     SET(CMAKE_REQUIRED_LIBRARIES "")
234 #    CHECK_LIBRARY_EXISTS(ole32 CoInitialize "" HAVE_LIBOLE32)
235     IF("${HAVE_LIBOLE32}")
236         SET(EXTRA_LIBS ole32 ${EXTRA_LIBS})
237     ENDIF()
239     IF(DSOUND)
240         CHECK_INCLUDE_FILE(dsound.h HAVE_DSOUND_H)
241         IF("${HAVE_DSOUND_H}")
242             SET(HAVE_DSOUND 1)
243             SET(ALC_OBJS  ${ALC_OBJS} Alc/dsound.c)
244             SET(BACKENDS  ${BACKENDS} DirectSound)
246             CHECK_LIBRARY_EXISTS(dxguid IID_IDirectSound "" HAVE_LIBDXGUID)
247             IF("${HAVE_LIBDXGUID}")
248                 SET(EXTRA_LIBS dxguid ${EXTRA_LIBS})
249             ENDIF()
250         ENDIF()
251     ENDIF()
252     IF(WINMM)
253         CHECK_INCLUDE_FILES("windows.h;mmsystem.h" HAVE_MMSYSTEM_H)
254         IF("${HAVE_MMSYSTEM_H}")
255             SET(HAVE_WINMM 1)
256             SET(ALC_OBJS  ${ALC_OBJS} Alc/winmm.c)
257             SET(BACKENDS  ${BACKENDS} WinMM)
259             SET(CMAKE_REQUIRED_LIBRARIES winmm)
260             CHECK_C_SOURCE_COMPILES("int main() {return 0;}" HAVE_LIBWINMM)
261             SET(CMAKE_REQUIRED_LIBRARIES "")
262 #            CHECK_LIBRARY_EXISTS(winmm waveInOpen "" HAVE_LIBWINMM)
263             IF("${HAVE_LIBWINMM}")
264                 SET(EXTRA_LIBS winmm ${EXTRA_LIBS})
265             ENDIF()
266         ENDIF()
267     ENDIF()
268 ENDIF()
270 # This is always available
271 SET(BACKENDS  ${BACKENDS} WaveFile)
273 # End configuration
274 CONFIGURE_FILE(
275     "${OpenAL_SOURCE_DIR}/config.h.in"
276     "${OpenAL_BINARY_DIR}/config.h")
278 ADD_DEFINITIONS(-DAL_BUILD_LIBRARY)
280 # Build a shared library
281 IF("${WIN32}")
282     SET(LIBNAME openal32)
283 ELSE()
284     SET(LIBNAME openal)
285 ENDIF()
287 ADD_LIBRARY(${LIBNAME} SHARED ${OPENAL_OBJS} ${ALC_OBJS})
288 SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES VERSION ${LIB_VERSION}
289                                             SOVERSION ${LIB_MAJOR_VERSION})
290 IF("${WIN32}")
291     SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES PREFIX "")
292 ENDIF()
294 TARGET_LINK_LIBRARIES(${LIBNAME} ${EXTRA_LIBS})
296 # Add an install target here
297 INSTALL(TARGETS ${LIBNAME}
298         RUNTIME DESTINATION bin
299         LIBRARY DESTINATION lib
300         ARCHIVE DESTINATION lib
302 INSTALL(FILES include/AL/al.h
303               include/AL/alc.h
304         DESTINATION include/AL
307 MESSAGE(STATUS "")
308 MESSAGE(STATUS "Building OpenAL with support for the following backends:")
309 MESSAGE(STATUS "    ${BACKENDS}")
310 MESSAGE(STATUS "")