Set an error if effect creation fails
[openal-soft.git] / CMakeLists.txt
blobaf68accb6925a6f5465c93d2f5ce767ab4943870
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 "7")
51 SET(LIB_BUILD_VERSION "411")
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(MSVC)
79     # ???
80     SET(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -D_DEBUG")
81     SET(CMAKE_C_FLAGS_MINSIZEREL "${CMAKE_C_FLAGS_MINSIZEREL} -DNDEBUG")
82     SET(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -DNDEBUG")
83     SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -D_DEBUG")
84     ADD_DEFINITIONS(-D_CRT_SECURE_NO_WARNINGS)
85 ELSE()
86     ADD_DEFINITIONS(-Wall)
87     CHECK_C_COMPILER_FLAG(-Wextra HAVE_W_EXTRA)
88     IF(HAVE_W_EXTRA)
89         ADD_DEFINITIONS(-Wextra)
90     ENDIF()
92     IF(WERROR)
93         ADD_DEFINITIONS(-Werror)
94     ENDIF()
96     SET(CMAKE_C_FLAGS_RELWITHDEBINFO "-g -O2 -funroll-loops -D_DEBUG" CACHE STRING
97         "Flags used by the compiler during Release with Debug Info builds."
98         FORCE)
99     SET(CMAKE_C_FLAGS_MINSIZEREL "-Os -DNDEBUG" CACHE STRING
100         "Flags used by the compiler during release minsize builds."
101         FORCE)
102     SET(CMAKE_C_FLAGS_RELEASE "-O2 -funroll-loops -fomit-frame-pointer -DNDEBUG" CACHE STRING
103         "Flags used by the compiler during release builds"
104         FORCE)
105     SET(CMAKE_C_FLAGS_DEBUG "-g3 -D_DEBUG" CACHE STRING
106         "Flags used by the compiler during debug builds."
107         FORCE)
109     # Set visibility options if available
110     IF(NOT WIN32)
111         CHECK_C_SOURCE_COMPILES("int foo() __attribute__((destructor));
112                                  int main() {return 0;}" HAVE_GCC_DESTRUCTOR)
114         CHECK_C_COMPILER_FLAG(-fvisibility=hidden HAVE_VISIBILITY_SWITCH)
115         IF(HAVE_VISIBILITY_SWITCH)
116             CHECK_C_SOURCE_COMPILES("int foo() __attribute__((visibility(\"default\")));
117                                      int main() {return 0;}" HAVE_GCC_VISIBILITY)
118             IF(HAVE_GCC_VISIBILITY)
119                 ADD_DEFINITIONS(-fvisibility=hidden -DHAVE_GCC_VISIBILITY)
120             ENDIF()
121         ENDIF()
122     ENDIF()
123 ENDIF()
125 CHECK_INCLUDE_FILE(fenv.h HAVE_FENV_H)
126 CHECK_INCLUDE_FILE(float.h HAVE_FLOAT_H)
128 CHECK_LIBRARY_EXISTS(m  sqrtf  "" HAVE_SQRTF)
129 CHECK_LIBRARY_EXISTS(m  acosf  "" HAVE_ACOSF)
130 CHECK_LIBRARY_EXISTS(m  atanf  "" HAVE_ATANF)
131 CHECK_LIBRARY_EXISTS(m  fabsf  "" HAVE_FABSF)
132 IF(HAVE_FENV_H)
133     CHECK_LIBRARY_EXISTS(m  fesetround  "" HAVE_FESETROUND)
134 ENDIF()
135 IF(HAVE_SQRTF OR HAVE_ACOSF OR HAVE_ATANF OR HAVE_FABSF OR HAVE_FESETROUND)
136     SET(EXTRA_LIBS m ${EXTRA_LIBS})
137 ENDIF()
138 CHECK_FUNCTION_EXISTS(strtof HAVE_STRTOF)
139 CHECK_FUNCTION_EXISTS(_controlfp HAVE__CONTROLFP)
141 CHECK_FUNCTION_EXISTS(strcasecmp HAVE_STRCASECMP)
142 IF(NOT HAVE_STRCASECMP)
143     CHECK_FUNCTION_EXISTS(_stricmp HAVE__STRICMP)
144     IF(NOT HAVE__STRICMP)
145         MESSAGE(FATAL_ERROR "No case-insensitive compare function found, please report!")
146     ENDIF()
148     ADD_DEFINITIONS(-Dstrcasecmp=_stricmp)
149 ENDIF()
151 CHECK_FUNCTION_EXISTS(strncasecmp HAVE_STRNCASECMP)
152 IF(NOT HAVE_STRNCASECMP)
153     CHECK_FUNCTION_EXISTS(_strnicmp HAVE__STRNICMP)
154     IF(NOT HAVE__STRNICMP)
155         MESSAGE(FATAL_ERROR "No case-insensitive size-limitted compare function found, please report!")
156     ENDIF()
158     ADD_DEFINITIONS(-Dstrncasecmp=_strnicmp)
159 ENDIF()
161 CHECK_FUNCTION_EXISTS(snprintf HAVE_SNPRINTF)
162 IF(NOT HAVE_SNPRINTF)
163     CHECK_FUNCTION_EXISTS(_snprintf HAVE__SNPRINTF)
164     IF(NOT HAVE__SNPRINTF)
165         MESSAGE(FATAL_ERROR "No snprintf function found, please report!")
166     ENDIF()
168     ADD_DEFINITIONS(-Dsnprintf=_snprintf)
169 ENDIF()
171 CHECK_SYMBOL_EXISTS(isnan math.h HAVE_ISNAN)
172 IF(NOT HAVE_ISNAN)
173     CHECK_FUNCTION_EXISTS(_isnan HAVE__ISNAN)
174     IF(NOT HAVE__ISNAN)
175         MESSAGE(FATAL_ERROR "No isnan function found, please report!")
176     ENDIF()
178     ADD_DEFINITIONS(-Disnan=_isnan)
179 ENDIF()
182 # Check for the dlopen API (for dynamicly loading backend libs)
183 IF(DLOPEN)
184     CHECK_INCLUDE_FILE(dlfcn.h HAVE_DLFCN_H)
185     IF(HAVE_DLFCN_H)
186         CHECK_LIBRARY_EXISTS(dl dlopen "" HAVE_LIBDL)
187         IF(HAVE_LIBDL)
188             SET(EXTRA_LIBS dl ${EXTRA_LIBS})
189         ENDIF()
190     ENDIF()
191 ENDIF()
193 # Check if we have Windows headers
194 CHECK_INCLUDE_FILE(windows.h HAVE_WINDOWS_H -D_WIN32_WINNT=0x0500)
195 IF(NOT HAVE_WINDOWS_H)
196     CHECK_FUNCTION_EXISTS(gettimeofday HAVE_GETTIMEOFDAY)
197     IF(NOT HAVE_GETTIMEOFDAY)
198         MESSAGE(FATAL_ERROR "No timing function found!")
199     ENDIF()
201     CHECK_FUNCTION_EXISTS(nanosleep HAVE_NANOSLEEP)
202     IF(NOT HAVE_NANOSLEEP)
203         MESSAGE(FATAL_ERROR "No sleep function found!")
204     ENDIF()
206     # We need pthreads outside of Windows
207     CHECK_INCLUDE_FILE(pthread.h HAVE_PTHREAD_H)
208     IF(NOT HAVE_PTHREAD_H)
209         MESSAGE(FATAL_ERROR "PThreads is required for non-Windows builds!")
210     ENDIF()
212     # Some systems need pthread_np.h to get recursive mutexes
213     CHECK_INCLUDE_FILES("pthread.h;pthread_np.h" HAVE_PTHREAD_NP_H)
215     # _GNU_SOURCE is needed on some systems for extra attributes, and
216     # _REENTRANT is needed for libc thread-safety
217     ADD_DEFINITIONS(-D_GNU_SOURCE=1 -D_REENTRANT)
218     CHECK_LIBRARY_EXISTS(pthread pthread_create "" HAVE_LIBPTHREAD)
219     IF(HAVE_LIBPTHREAD)
220         SET(EXTRA_LIBS pthread ${EXTRA_LIBS})
221     ENDIF()
222 ENDIF()
224 # Check for a 64-bit type
225 CHECK_INCLUDE_FILE(stdint.h HAVE_STDINT_H)
226 IF(NOT HAVE_STDINT_H)
227     IF(HAVE_WINDOWS_H)
228         CHECK_C_SOURCE_COMPILES("\#define _WIN32_WINNT 0x0500
229                                  \#include <windows.h>
230                                  __int64 foo;
231                                  int main() {return 0;}" HAVE___INT64)
232     ENDIF()
233     IF(NOT HAVE___INT64)
234         IF(NOT SIZEOF_LONG MATCHES "8")
235             IF(NOT SIZEOF_LONG_LONG MATCHES "8")
236                 MESSAGE(FATAL_ERROR "No 64-bit types found, please report!")
237             ENDIF()
238         ENDIF()
239     ENDIF()
240 ENDIF()
243 SET(OPENAL_OBJS  OpenAL32/alAuxEffectSlot.c
244                  OpenAL32/alBuffer.c
245                  OpenAL32/alEffect.c
246                  OpenAL32/alError.c
247                  OpenAL32/alExtension.c
248                  OpenAL32/alFilter.c
249                  OpenAL32/alListener.c
250                  OpenAL32/alSource.c
251                  OpenAL32/alState.c
252                  OpenAL32/alThunk.c
254 SET(ALC_OBJS  Alc/ALc.c
255               Alc/ALu.c
256               Alc/alcConfig.c
257               Alc/alcEcho.c
258               Alc/alcReverb.c
259               Alc/alcRing.c
260               Alc/alcThread.c
261               Alc/bs2b.c
262               Alc/wave.c
265 SET(BACKENDS "")
267 # Check ALSA backend
268 IF(ALSA)
269     CHECK_INCLUDE_FILE(alsa/asoundlib.h HAVE_ALSA_ASOUNDLIB_H)
270     IF(HAVE_ALSA_ASOUNDLIB_H)
271         CHECK_LIBRARY_EXISTS(asound snd_pcm_open "" HAVE_LIBASOUND)
272         IF(HAVE_DLFCN_H OR HAVE_LIBASOUND)
273             SET(HAVE_ALSA 1)
274             SET(ALC_OBJS  ${ALC_OBJS} Alc/alsa.c)
275             IF(HAVE_DLFCN_H)
276                 SET(BACKENDS  "${BACKENDS} ALSA,")
277             ELSE()
278                 SET(BACKENDS  "${BACKENDS} ALSA \(linked\),")
279                 SET(EXTRA_LIBS asound ${EXTRA_LIBS})
280             ENDIF()
281         ENDIF()
282     ENDIF()
283 ENDIF()
285 # Check OSS backend
286 IF(OSS)
287     CHECK_INCLUDE_FILE(sys/soundcard.h HAVE_SYS_SOUNDCARD_H)
288     IF(HAVE_SYS_SOUNDCARD_H)
289         SET(HAVE_OSS 1)
290         SET(ALC_OBJS  ${ALC_OBJS} Alc/oss.c)
291         SET(BACKENDS  "${BACKENDS} OSS,")
292     ENDIF()
293 ENDIF()
295 # Check Solaris backend
296 IF(SOLARIS)
297     CHECK_INCLUDE_FILE(sys/audioio.h HAVE_SYS_AUDIOIO_H)
298     IF(HAVE_SYS_AUDIOIO_H)
299         SET(HAVE_SOLARIS 1)
300         SET(ALC_OBJS  ${ALC_OBJS} Alc/solaris.c)
301         SET(BACKENDS  "${BACKENDS} Solaris,")
302     ENDIF()
303 ENDIF()
305 # Check DSound/MMSystem backend
306 IF(DSOUND)
307     CHECK_INCLUDE_FILE(dsound.h HAVE_DSOUND_H)
308     IF(HAVE_DSOUND_H)
309         CHECK_LIBRARY_EXISTS(dsound DirectSoundCreate "" HAVE_LIBDSOUND)
310         IF(HAVE_LIBDSOUND OR WIN32)
311             SET(HAVE_DSOUND 1)
312             SET(ALC_OBJS  ${ALC_OBJS} Alc/dsound.c)
314             IF(WIN32)
315                 SET(BACKENDS  "${BACKENDS} DirectSound,")
316             ELSE()
317                 SET(BACKENDS  "${BACKENDS} DirectSound \(linked\),")
318                 SET(EXTRA_LIBS dsound ${EXTRA_LIBS})
319             ENDIF()
320         ENDIF()
321     ENDIF()
322 ENDIF()
323 IF(HAVE_WINDOWS_H)
324     IF(WINMM)
325         CHECK_INCLUDE_FILES("windows.h;mmsystem.h" HAVE_MMSYSTEM_H -D_WIN32_WINNT=0x0500)
326         IF(HAVE_MMSYSTEM_H)
327             SET(HAVE_WINMM 1)
328             SET(ALC_OBJS  ${ALC_OBJS} Alc/winmm.c)
329             SET(BACKENDS  "${BACKENDS} WinMM,")
331             SET(CMAKE_REQUIRED_LIBRARIES winmm)
332             CHECK_C_SOURCE_COMPILES("int main() {return 0;}" HAVE_LIBWINMM)
333             SET(CMAKE_REQUIRED_LIBRARIES "")
334 #            CHECK_LIBRARY_EXISTS(winmm waveInOpen "" HAVE_LIBWINMM)
335             IF(HAVE_LIBWINMM)
336                 SET(EXTRA_LIBS winmm ${EXTRA_LIBS})
337             ENDIF()
338         ENDIF()
339     ENDIF()
340 ENDIF()
342 # Check PortAudio backend
343 IF(PORTAUDIO)
344     CHECK_INCLUDE_FILE(portaudio.h HAVE_PORTAUDIO_H)
345     IF(HAVE_PORTAUDIO_H)
346         CHECK_LIBRARY_EXISTS(portaudio Pa_Initialize "" HAVE_LIBPORTAUDIO)
347         IF(HAVE_LIBPORTAUDIO)
348             SET(HAVE_PORTAUDIO 1)
349             SET(ALC_OBJS  ${ALC_OBJS} Alc/portaudio.c)
350             IF(HAVE_DLFCN_H)
351                 SET(BACKENDS  "${BACKENDS} PortAudio,")
352             ELSE()
353                 SET(BACKENDS  "${BACKENDS} PortAudio \(linked\),")
354                 SET(EXTRA_LIBS portaudio ${EXTRA_LIBS})
355             ENDIF()
356         ENDIF()
357     ENDIF()
358 ENDIF()
360 # Check PortAudio backend
361 IF(PULSEAUDIO)
362     CHECK_INCLUDE_FILE(pulse/pulseaudio.h HAVE_PULSE_PULSEAUDIO_H)
363     IF(HAVE_PULSE_PULSEAUDIO_H)
364         CHECK_LIBRARY_EXISTS(pulse pa_context_new "" HAVE_LIBPULSE)
365         IF(HAVE_LIBPULSE)
366             SET(HAVE_PULSEAUDIO 1)
367             SET(ALC_OBJS  ${ALC_OBJS} Alc/pulseaudio.c)
368             IF(HAVE_DLFCN_H)
369                 SET(BACKENDS  "${BACKENDS} PulseAudio,")
370             ELSE()
371                 SET(BACKENDS  "${BACKENDS} PulseAudio \(linked\),")
372                 SET(EXTRA_LIBS pulse ${EXTRA_LIBS})
373             ENDIF()
374         ENDIF()
375     ENDIF()
376 ENDIF()
378 # This is always available
379 SET(BACKENDS  "${BACKENDS} WaveFile")
381 # Needed for openal.pc.in
382 SET(prefix ${CMAKE_INSTALL_PREFIX})
383 SET(exec_prefix "\${prefix}")
384 SET(libdir "\${exec_prefix}/${LIB_INSTALL_DIR}")
385 SET(bindir "\${exec_prefix}/bin")
386 SET(includedir "\${prefix}/include")
387 SET(PACKAGE_VERSION "${LIB_VERSION}")
389 # End configuration
390 CONFIGURE_FILE(
391     "${OpenAL_SOURCE_DIR}/config.h.in"
392     "${OpenAL_BINARY_DIR}/config.h")
393 CONFIGURE_FILE(
394     "${OpenAL_SOURCE_DIR}/admin/pkgconfig/openal.pc.in"
395     "${OpenAL_BINARY_DIR}/admin/pkgconfig/openal.pc"
396     @ONLY)
398 ADD_DEFINITIONS(-DAL_BUILD_LIBRARY)
400 # Build a library
401 IF(NOT LIBTYPE)
402     SET(LIBTYPE SHARED)
403 ENDIF()
404 ADD_LIBRARY(${LIBNAME} ${LIBTYPE} ${OPENAL_OBJS} ${ALC_OBJS})
405 SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES VERSION ${LIB_VERSION}
406                                             SOVERSION ${LIB_MAJOR_VERSION})
407 IF(WIN32)
408     SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES PREFIX "")
409 ENDIF()
411 TARGET_LINK_LIBRARIES(${LIBNAME} ${EXTRA_LIBS})
413 # Add an install target here
414 INSTALL(TARGETS ${LIBNAME}
415         RUNTIME DESTINATION bin
416         LIBRARY DESTINATION ${LIB_INSTALL_DIR}
417         ARCHIVE DESTINATION ${LIB_INSTALL_DIR}
419 INSTALL(FILES include/AL/al.h
420               include/AL/alc.h
421               include/AL/alext.h
422         DESTINATION include/AL
424 INSTALL(FILES "${OpenAL_BINARY_DIR}/admin/pkgconfig/openal.pc"
425         DESTINATION "${LIB_INSTALL_DIR}/pkgconfig")
427 # Install alsoft.conf configuration file
428 IF(ALSOFT_CONFIG)
429     INSTALL(FILES alsoftrc.sample
430             DESTINATION /etc/openal
431             RENAME alsoft.conf
432     )
433 ENDIF()
435 IF(EXAMPLES)
436     ADD_EXECUTABLE(openal-info examples/openal-info.c)
437     TARGET_LINK_LIBRARIES(openal-info ${LIBNAME})
438     INSTALL(TARGETS openal-info
439             RUNTIME DESTINATION bin
440             LIBRARY DESTINATION ${LIB_INSTALL_DIR}
441             ARCHIVE DESTINATION ${LIB_INSTALL_DIR}
442     )
443 ENDIF()
445 MESSAGE(STATUS "")
446 MESSAGE(STATUS "Building OpenAL with support for the following backends:")
447 MESSAGE(STATUS "    ${BACKENDS}")
448 MESSAGE(STATUS "")
450 IF(WIN32)
451     IF(NOT HAVE_DSOUND)
452         MESSAGE(STATUS "WARNING: Building the Windows version without DirectSound output")
453         MESSAGE(STATUS "         This is probably NOT what you want!")
454         MESSAGE(STATUS "")
455     ENDIF()
456 ENDIF()