Make sure DSSPEAKER_5POINT1 is defined
[openal-soft.git] / CMakeLists.txt
blob749e01229fe4734bf06d4220dce67c1d0d72385f
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)
29 OPTION(PORTAUDIO  "Check for PortAudio backend"        ON)
30 OPTION(PULSEAUDIO "Check for PulseAudio backend"       ON)
32 OPTION(DLOPEN  "Check for the dlopen API for loading optional libs"  ON)
34 OPTION(WERROR  "Treat compile warnings as errors"      OFF)
36 OPTION(EXAMPLES  "Build example programs"              ON)
39 IF(WIN32)
40     SET(LIBNAME OpenAL32)
41     ADD_DEFINITIONS("-D_WIN32")
42 ELSE()
43     SET(LIBNAME openal)
44 ENDIF()
46 SET(LIB_MAJOR_VERSION "1")
47 SET(LIB_MINOR_VERSION "7")
48 SET(LIB_BUILD_VERSION "411")
49 SET(LIB_VERSION "${LIB_MAJOR_VERSION}.${LIB_MINOR_VERSION}.${LIB_BUILD_VERSION}")
50 IF(NOT DEFINED LIB_INSTALL_DIR)
51   SET(LIB_INSTALL_DIR "lib${LIB_SUFFIX}")
52 ENDIF(NOT DEFINED LIB_INSTALL_DIR)
55 CHECK_TYPE_SIZE("long" SIZEOF_LONG)
56 CHECK_TYPE_SIZE("long long" SIZEOF_LONG_LONG)
57 CHECK_TYPE_SIZE("unsigned int" SIZEOF_UINT)
58 CHECK_TYPE_SIZE("void*" SIZEOF_VOIDP)
61 # Add definitions, compiler switches, etc.
62 INCLUDE_DIRECTORIES(OpenAL32/Include include "${OpenAL_BINARY_DIR}")
64 IF(NOT CMAKE_BUILD_TYPE)
65     SET(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING
66         "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel."
67         FORCE)
68 ENDIF()
69 IF(NOT CMAKE_DEBUG_POSTFIX)
70     SET(CMAKE_DEBUG_POSTFIX "" CACHE STRING
71         "Library postfix for debug builds. Normally left blank."
72         FORCE)
73 ENDIF()
75 IF(MSVC)
76     # ???
77     SET(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -D_DEBUG")
78     SET(CMAKE_C_FLAGS_MINSIZEREL "${CMAKE_C_FLAGS_MINSIZEREL} -DNDEBUG")
79     SET(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -DNDEBUG")
80     SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -D_DEBUG")
81 ELSE()
82     ADD_DEFINITIONS(-Wall)
83     CHECK_C_COMPILER_FLAG(-Wextra HAVE_W_EXTRA)
84     IF(HAVE_W_EXTRA)
85         ADD_DEFINITIONS(-Wextra)
86     ENDIF()
88     IF(WERROR)
89         ADD_DEFINITIONS(-Werror)
90     ENDIF()
92     SET(CMAKE_C_FLAGS_RELWITHDEBINFO "-g -O2 -funroll-loops -D_DEBUG" CACHE STRING
93         "Flags used by the compiler during Release with Debug Info builds."
94         FORCE)
95     SET(CMAKE_C_FLAGS_MINSIZEREL "-Os -DNDEBUG" CACHE STRING
96         "Flags used by the compiler during release minsize builds."
97         FORCE)
98     SET(CMAKE_C_FLAGS_RELEASE "-O2 -funroll-loops -fomit-frame-pointer -DNDEBUG" CACHE STRING
99         "Flags used by the compiler during release builds"
100         FORCE)
101     SET(CMAKE_C_FLAGS_DEBUG "-g3 -D_DEBUG" CACHE STRING
102         "Flags used by the compiler during debug builds."
103         FORCE)
105     # Set visibility options if available
106     IF(NOT WIN32)
107         CHECK_C_SOURCE_COMPILES("int foo() __attribute__((destructor));
108                                  int main() {return 0;}" HAVE_GCC_DESTRUCTOR)
110         CHECK_C_COMPILER_FLAG(-fvisibility=hidden HAVE_VISIBILITY_SWITCH)
111         IF(HAVE_VISIBILITY_SWITCH)
112             CHECK_C_SOURCE_COMPILES("int foo() __attribute__((visibility(\"default\")));
113                                      int main() {return 0;}" HAVE_GCC_VISIBILITY)
114             IF(HAVE_GCC_VISIBILITY)
115                 ADD_DEFINITIONS(-fvisibility=hidden -DHAVE_GCC_VISIBILITY)
116             ENDIF()
117         ENDIF()
118     ENDIF()
119 ENDIF()
121 CHECK_INCLUDE_FILE(fenv.h HAVE_FENV_H)
122 CHECK_INCLUDE_FILE(float.h HAVE_FLOAT_H)
124 CHECK_LIBRARY_EXISTS(m  sqrtf  "" HAVE_SQRTF)
125 CHECK_LIBRARY_EXISTS(m  acosf  "" HAVE_ACOSF)
126 CHECK_LIBRARY_EXISTS(m  atanf  "" HAVE_ATANF)
127 CHECK_LIBRARY_EXISTS(m  fabsf  "" HAVE_FABSF)
128 IF(HAVE_FENV_H)
129     CHECK_LIBRARY_EXISTS(m  fesetround  "" HAVE_FESETROUND)
130 ENDIF()
131 IF(HAVE_SQRTF OR HAVE_ACOSF OR HAVE_ATANF OR HAVE_FABSF OR HAVE_FESETROUND)
132     SET(EXTRA_LIBS m ${EXTRA_LIBS})
133 ENDIF()
134 CHECK_FUNCTION_EXISTS(strtof HAVE_STRTOF)
135 CHECK_FUNCTION_EXISTS(_controlfp HAVE__CONTROLFP)
137 CHECK_FUNCTION_EXISTS(strcasecmp HAVE_STRCASECMP)
138 IF(NOT HAVE_STRCASECMP)
139     CHECK_FUNCTION_EXISTS(_stricmp HAVE__STRICMP)
140     IF(NOT HAVE__STRICMP)
141         MESSAGE(FATAL_ERROR "No case-insensitive compare function found, please report!")
142     ENDIF()
144     ADD_DEFINITIONS(-Dstrcasecmp=_stricmp)
145 ENDIF()
147 CHECK_FUNCTION_EXISTS(strncasecmp HAVE_STRNCASECMP)
148 IF(NOT HAVE_STRNCASECMP)
149     CHECK_FUNCTION_EXISTS(_strnicmp HAVE__STRNICMP)
150     IF(NOT HAVE__STRNICMP)
151         MESSAGE(FATAL_ERROR "No case-insensitive size-limitted compare function found, please report!")
152     ENDIF()
154     ADD_DEFINITIONS(-Dstrncasecmp=_strnicmp)
155 ENDIF()
157 CHECK_FUNCTION_EXISTS(snprintf HAVE_SNPRINTF)
158 IF(NOT HAVE_SNPRINTF)
159     CHECK_FUNCTION_EXISTS(_snprintf HAVE__SNPRINTF)
160     IF(NOT HAVE__SNPRINTF)
161         MESSAGE(FATAL_ERROR "No snprintf function found, please report!")
162     ENDIF()
164     ADD_DEFINITIONS(-Dsnprintf=_snprintf)
165 ENDIF()
167 # Check for the dlopen API (for dynamicly loading backend libs)
168 IF(DLOPEN)
169     CHECK_INCLUDE_FILE(dlfcn.h HAVE_DLFCN_H)
170     IF(HAVE_DLFCN_H)
171         CHECK_LIBRARY_EXISTS(dl dlopen "" HAVE_LIBDL)
172         IF(HAVE_LIBDL)
173             SET(EXTRA_LIBS dl ${EXTRA_LIBS})
174         ENDIF()
175     ENDIF()
176 ENDIF()
178 # Check if we have Windows headers
179 CHECK_INCLUDE_FILE(windows.h HAVE_WINDOWS_H -D_WIN32_WINNT=0x0500)
180 IF(NOT HAVE_WINDOWS_H)
181     CHECK_FUNCTION_EXISTS(gettimeofday HAVE_GETTIMEOFDAY)
182     IF(NOT HAVE_GETTIMEOFDAY)
183         MESSAGE(FATAL_ERROR "No timing function found!")
184     ENDIF()
186     CHECK_FUNCTION_EXISTS(nanosleep HAVE_NANOSLEEP)
187     IF(NOT HAVE_NANOSLEEP)
188         MESSAGE(FATAL_ERROR "No sleep function found!")
189     ENDIF()
191     # We need pthreads outside of Windows
192     CHECK_INCLUDE_FILE(pthread.h HAVE_PTHREAD_H)
193     IF(NOT HAVE_PTHREAD_H)
194         MESSAGE(FATAL_ERROR "PThreads is required for non-Windows builds!")
195     ENDIF()
197     # Some systems need pthread_np.h to get recursive mutexes
198     CHECK_INCLUDE_FILES("pthread.h;pthread_np.h" HAVE_PTHREAD_NP_H)
200     # _GNU_SOURCE is needed on some systems for extra attributes, and
201     # _REENTRANT is needed for libc thread-safety
202     ADD_DEFINITIONS(-D_GNU_SOURCE=1 -D_REENTRANT)
203     CHECK_LIBRARY_EXISTS(pthread pthread_create "" HAVE_LIBPTHREAD)
204     IF(HAVE_LIBPTHREAD)
205         SET(EXTRA_LIBS pthread ${EXTRA_LIBS})
206     ENDIF()
207 ENDIF()
209 # Check for a 64-bit type
210 CHECK_INCLUDE_FILE(stdint.h HAVE_STDINT_H)
211 IF(NOT HAVE_STDINT_H)
212     IF(HAVE_WINDOWS_H)
213         CHECK_C_SOURCE_COMPILES("\#define _WIN32_WINNT 0x0500
214                                  \#include <windows.h>
215                                  __int64 foo;
216                                  int main() {return 0;}" HAVE___INT64)
217     ENDIF()
218     IF(NOT HAVE___INT64)
219         IF(NOT SIZEOF_LONG MATCHES "8")
220             IF(NOT SIZEOF_LONG_LONG MATCHES "8")
221                 MESSAGE(FATAL_ERROR "No 64-bit types found, please report!")
222             ENDIF()
223         ENDIF()
224     ENDIF()
225 ENDIF()
228 SET(OPENAL_OBJS  OpenAL32/alAuxEffectSlot.c
229                  OpenAL32/alBuffer.c
230                  OpenAL32/alEffect.c
231                  OpenAL32/alError.c
232                  OpenAL32/alExtension.c
233                  OpenAL32/alFilter.c
234                  OpenAL32/alListener.c
235                  OpenAL32/alSource.c
236                  OpenAL32/alState.c
237                  OpenAL32/alThunk.c
239 SET(ALC_OBJS  Alc/ALc.c
240               Alc/ALu.c
241               Alc/alcConfig.c
242               Alc/alcEcho.c
243               Alc/alcReverb.c
244               Alc/alcRing.c
245               Alc/alcThread.c
246               Alc/bs2b.c
247               Alc/wave.c
250 SET(BACKENDS "")
252 # Check ALSA backend
253 IF(ALSA)
254     CHECK_INCLUDE_FILE(alsa/asoundlib.h HAVE_ALSA_ASOUNDLIB_H)
255     IF(HAVE_ALSA_ASOUNDLIB_H)
256         CHECK_LIBRARY_EXISTS(asound snd_pcm_open "" HAVE_LIBASOUND)
257         IF(HAVE_DLFCN_H OR HAVE_LIBASOUND)
258             SET(HAVE_ALSA 1)
259             SET(ALC_OBJS  ${ALC_OBJS} Alc/alsa.c)
260             IF(HAVE_DLFCN_H)
261                 SET(BACKENDS  "${BACKENDS} ALSA,")
262             ELSE()
263                 SET(BACKENDS  "${BACKENDS} ALSA \(linked\),")
264                 SET(EXTRA_LIBS asound ${EXTRA_LIBS})
265             ENDIF()
266         ENDIF()
267     ENDIF()
268 ENDIF()
270 # Check OSS backend
271 IF(OSS)
272     CHECK_INCLUDE_FILE(sys/soundcard.h HAVE_SYS_SOUNDCARD_H)
273     IF(HAVE_SYS_SOUNDCARD_H)
274         SET(HAVE_OSS 1)
275         SET(ALC_OBJS  ${ALC_OBJS} Alc/oss.c)
276         SET(BACKENDS  "${BACKENDS} OSS,")
277     ENDIF()
278 ENDIF()
280 # Check Solaris backend
281 IF(SOLARIS)
282     CHECK_INCLUDE_FILE(sys/audioio.h HAVE_SYS_AUDIOIO_H)
283     IF(HAVE_SYS_AUDIOIO_H)
284         SET(HAVE_SOLARIS 1)
285         SET(ALC_OBJS  ${ALC_OBJS} Alc/solaris.c)
286         SET(BACKENDS  "${BACKENDS} Solaris,")
287     ENDIF()
288 ENDIF()
290 # Check DSound/MMSystem backend
291 IF(DSOUND)
292     CHECK_INCLUDE_FILE(dsound.h HAVE_DSOUND_H)
293     IF(HAVE_DSOUND_H)
294         CHECK_LIBRARY_EXISTS(dsound DirectSoundCreate "" HAVE_LIBDSOUND)
295         IF(HAVE_LIBDSOUND OR WIN32)
296             SET(HAVE_DSOUND 1)
297             SET(ALC_OBJS  ${ALC_OBJS} Alc/dsound.c)
299             IF(WIN32)
300                 SET(BACKENDS  "${BACKENDS} DirectSound,")
301             ELSE()
302                 SET(BACKENDS  "${BACKENDS} DirectSound \(linked\),")
303                 SET(EXTRA_LIBS dsound ${EXTRA_LIBS})
304             ENDIF()
305         ENDIF()
306     ENDIF()
307 ENDIF()
308 IF(HAVE_WINDOWS_H)
309     IF(WINMM)
310         CHECK_INCLUDE_FILES("windows.h;mmsystem.h" HAVE_MMSYSTEM_H -D_WIN32_WINNT=0x0500)
311         IF(HAVE_MMSYSTEM_H)
312             SET(HAVE_WINMM 1)
313             SET(ALC_OBJS  ${ALC_OBJS} Alc/winmm.c)
314             SET(BACKENDS  "${BACKENDS} WinMM,")
316             SET(CMAKE_REQUIRED_LIBRARIES winmm)
317             CHECK_C_SOURCE_COMPILES("int main() {return 0;}" HAVE_LIBWINMM)
318             SET(CMAKE_REQUIRED_LIBRARIES "")
319 #            CHECK_LIBRARY_EXISTS(winmm waveInOpen "" HAVE_LIBWINMM)
320             IF(HAVE_LIBWINMM)
321                 SET(EXTRA_LIBS winmm ${EXTRA_LIBS})
322             ENDIF()
323         ENDIF()
324     ENDIF()
325 ENDIF()
327 # Check PortAudio backend
328 IF(PORTAUDIO)
329     CHECK_INCLUDE_FILE(portaudio.h HAVE_PORTAUDIO_H)
330     IF(HAVE_PORTAUDIO_H)
331         CHECK_LIBRARY_EXISTS(portaudio Pa_Initialize "" HAVE_LIBPORTAUDIO)
332         IF(HAVE_LIBPORTAUDIO)
333             SET(HAVE_PORTAUDIO 1)
334             SET(ALC_OBJS  ${ALC_OBJS} Alc/portaudio.c)
335             IF(HAVE_DLFCN_H)
336                 SET(BACKENDS  "${BACKENDS} PortAudio,")
337             ELSE()
338                 SET(BACKENDS  "${BACKENDS} PortAudio \(linked\),")
339                 SET(EXTRA_LIBS portaudio ${EXTRA_LIBS})
340             ENDIF()
341         ENDIF()
342     ENDIF()
343 ENDIF()
345 # Check PortAudio backend
346 IF(PULSEAUDIO)
347     CHECK_INCLUDE_FILE(pulse/pulseaudio.h HAVE_PULSE_PULSEAUDIO_H)
348     IF(HAVE_PULSE_PULSEAUDIO_H)
349         CHECK_LIBRARY_EXISTS(pulse pa_context_new "" HAVE_LIBPULSE)
350         IF(HAVE_LIBPULSE)
351             SET(HAVE_PULSEAUDIO 1)
352             SET(ALC_OBJS  ${ALC_OBJS} Alc/pulseaudio.c)
353             SET(BACKENDS  "${BACKENDS} PulseAudio \(linked\),")
355             SET(EXTRA_LIBS pulse ${EXTRA_LIBS})
356         ENDIF()
357     ENDIF()
358 ENDIF()
360 # This is always available
361 SET(BACKENDS  "${BACKENDS} WaveFile")
363 # Needed for openal.pc.in
364 SET(prefix ${CMAKE_INSTALL_PREFIX})
365 SET(exec_prefix "\${prefix}")
366 SET(libdir "\${exec_prefix}/${LIB_INSTALL_DIR}")
367 SET(bindir "\${exec_prefix}/bin")
368 SET(includedir "\${prefix}/include")
369 SET(PACKAGE_VERSION "${LIB_VERSION}")
371 # End configuration
372 CONFIGURE_FILE(
373     "${OpenAL_SOURCE_DIR}/config.h.in"
374     "${OpenAL_BINARY_DIR}/config.h")
375 CONFIGURE_FILE(
376     "${OpenAL_SOURCE_DIR}/admin/pkgconfig/openal.pc.in"
377     "${OpenAL_BINARY_DIR}/admin/pkgconfig/openal.pc"
378     @ONLY)
380 ADD_DEFINITIONS(-DAL_BUILD_LIBRARY)
382 # Build a library
383 IF(NOT LIBTYPE)
384     SET(LIBTYPE SHARED)
385 ENDIF()
386 ADD_LIBRARY(${LIBNAME} ${LIBTYPE} ${OPENAL_OBJS} ${ALC_OBJS})
387 SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES VERSION ${LIB_VERSION}
388                                             SOVERSION ${LIB_MAJOR_VERSION})
389 IF(WIN32)
390     SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES PREFIX "")
391 ENDIF()
393 TARGET_LINK_LIBRARIES(${LIBNAME} ${EXTRA_LIBS})
395 # Add an install target here
396 INSTALL(TARGETS ${LIBNAME}
397         RUNTIME DESTINATION bin
398         LIBRARY DESTINATION ${LIB_INSTALL_DIR}
399         ARCHIVE DESTINATION ${LIB_INSTALL_DIR}
401 INSTALL(FILES include/AL/al.h
402               include/AL/alc.h
403               include/AL/alext.h
404         DESTINATION include/AL
406 INSTALL(FILES "${OpenAL_BINARY_DIR}/admin/pkgconfig/openal.pc"
407         DESTINATION "${LIB_INSTALL_DIR}/pkgconfig")
409 IF(EXAMPLES)
410     ADD_EXECUTABLE(openal-info examples/openal-info.c)
411     TARGET_LINK_LIBRARIES(openal-info ${LIBNAME})
412     INSTALL(TARGETS openal-info
413             RUNTIME DESTINATION bin
414             LIBRARY DESTINATION ${LIB_INSTALL_DIR}
415             ARCHIVE DESTINATION ${LIB_INSTALL_DIR}
416     )
417 ENDIF()
419 MESSAGE(STATUS "")
420 MESSAGE(STATUS "Building OpenAL with support for the following backends:")
421 MESSAGE(STATUS "    ${BACKENDS}")
422 MESSAGE(STATUS "")
424 IF(WIN32)
425     IF(NOT HAVE_DSOUND)
426         MESSAGE(STATUS "WARNING: Building the Windows version without DirectSound output")
427         MESSAGE(STATUS "         This is probably NOT what you want!")
428         MESSAGE(STATUS "")
429     ENDIF()
430 ENDIF()