Consolidate some source offset handling code
[openal-soft.git] / CMakeLists.txt
blob8c60a11e94b7f6317fda8d201f469ab7a152a098
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 SET(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake")
11 INCLUDE(CheckFunctionExists)
12 INCLUDE(CheckLibraryExists)
13 INCLUDE(CheckIncludeFile)
14 INCLUDE(CheckIncludeFiles)
15 INCLUDE(CheckSymbolExists)
16 INCLUDE(CheckCCompilerFlag)
17 INCLUDE(CheckCSourceCompiles)
18 INCLUDE(CheckTypeSize)
21 PROJECT(OpenAL C)
24 SET(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS TRUE)
27 OPTION(ALSA    "Check for ALSA backend"                ON)
28 OPTION(OSS     "Check for OSS backend"                 ON)
29 OPTION(SOLARIS "Check for Solaris backend"             ON)
30 OPTION(DSOUND  "Check for DirectSound backend"         ON)
31 OPTION(WINMM   "Check for Windows Multimedia backend"  ON)
32 OPTION(PORTAUDIO  "Check for PortAudio backend"        ON)
33 OPTION(PULSEAUDIO "Check for PulseAudio backend"       ON)
35 OPTION(DLOPEN  "Check for the dlopen API for loading optional libs"  ON)
37 OPTION(WERROR  "Treat compile warnings as errors"      OFF)
39 OPTION(EXAMPLES  "Build example programs"              ON)
41 OPTION(ALSOFT_CONFIG "Install alsoft.conf configuration file" OFF)
44 IF(WIN32)
45     SET(LIBNAME OpenAL32)
46     ADD_DEFINITIONS("-D_WIN32")
47 ELSE()
48     SET(LIBNAME openal)
49 ENDIF()
51 SET(LIB_MAJOR_VERSION "1")
52 SET(LIB_MINOR_VERSION "10")
53 SET(LIB_BUILD_VERSION "622")
54 SET(LIB_VERSION "${LIB_MAJOR_VERSION}.${LIB_MINOR_VERSION}.${LIB_BUILD_VERSION}")
55 IF(NOT DEFINED LIB_INSTALL_DIR)
56   SET(LIB_INSTALL_DIR "lib${LIB_SUFFIX}")
57 ENDIF(NOT DEFINED LIB_INSTALL_DIR)
60 CHECK_TYPE_SIZE("long" SIZEOF_LONG)
61 CHECK_TYPE_SIZE("long long" SIZEOF_LONG_LONG)
62 CHECK_TYPE_SIZE("unsigned int" SIZEOF_UINT)
63 CHECK_TYPE_SIZE("void*" SIZEOF_VOIDP)
66 # Add definitions, compiler switches, etc.
67 INCLUDE_DIRECTORIES(OpenAL32/Include include "${OpenAL_BINARY_DIR}")
69 IF(NOT CMAKE_BUILD_TYPE)
70     SET(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING
71         "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel."
72         FORCE)
73 ENDIF()
74 IF(NOT CMAKE_DEBUG_POSTFIX)
75     SET(CMAKE_DEBUG_POSTFIX "" CACHE STRING
76         "Library postfix for debug builds. Normally left blank."
77         FORCE)
78 ENDIF()
80 IF(NOT DXSDK_DIR)
81     STRING(REGEX REPLACE "\\\\" "/" DXSDK_DIR "$ENV{DXSDK_DIR}")
82 ELSE()
83     STRING(REGEX REPLACE "\\\\" "/" DXSDK_DIR "${DXSDK_DIR}")
84 ENDIF()
85 IF(DXSDK_DIR)
86     MESSAGE(STATUS "Using DirectX SDK directory: ${DXSDK_DIR}")
87     SET(CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES} "${DXSDK_DIR}/Include")
88     INCLUDE_DIRECTORIES("${DXSDK_DIR}/Include")
89     LINK_DIRECTORIES("${DXSDK_DIR}/Lib")
90 ENDIF()
92 IF(MSVC)
93     # ???
94     SET(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -D_DEBUG")
95     SET(CMAKE_C_FLAGS_MINSIZEREL "${CMAKE_C_FLAGS_MINSIZEREL} -DNDEBUG")
96     SET(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -DNDEBUG")
97     SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -D_DEBUG")
98     ADD_DEFINITIONS(-D_CRT_SECURE_NO_WARNINGS)
99 ELSE()
100     ADD_DEFINITIONS(-Wall)
101     CHECK_C_COMPILER_FLAG(-Wextra HAVE_W_EXTRA)
102     IF(HAVE_W_EXTRA)
103         ADD_DEFINITIONS(-Wextra)
104     ENDIF()
106     IF(WERROR)
107         ADD_DEFINITIONS(-Werror)
108     ENDIF()
110     SET(CMAKE_C_FLAGS_RELWITHDEBINFO "-g -O2 -funroll-loops -D_DEBUG" CACHE STRING
111         "Flags used by the compiler during Release with Debug Info builds."
112         FORCE)
113     SET(CMAKE_C_FLAGS_MINSIZEREL "-Os -DNDEBUG" CACHE STRING
114         "Flags used by the compiler during release minsize builds."
115         FORCE)
116     SET(CMAKE_C_FLAGS_RELEASE "-O2 -funroll-loops -fomit-frame-pointer -DNDEBUG" CACHE STRING
117         "Flags used by the compiler during release builds"
118         FORCE)
119     SET(CMAKE_C_FLAGS_DEBUG "-g3 -D_DEBUG" CACHE STRING
120         "Flags used by the compiler during debug builds."
121         FORCE)
123     # Set visibility options if available
124     IF(NOT WIN32)
125         CHECK_C_SOURCE_COMPILES("int foo() __attribute__((destructor));
126                                  int main() {return 0;}" HAVE_GCC_DESTRUCTOR)
128         CHECK_C_COMPILER_FLAG(-fvisibility=hidden HAVE_VISIBILITY_SWITCH)
129         IF(HAVE_VISIBILITY_SWITCH)
130             CHECK_C_SOURCE_COMPILES("int foo() __attribute__((visibility(\"default\")));
131                                      int main() {return 0;}" HAVE_GCC_VISIBILITY)
132             IF(HAVE_GCC_VISIBILITY)
133                 ADD_DEFINITIONS(-fvisibility=hidden -DHAVE_GCC_VISIBILITY)
134             ENDIF()
135         ENDIF()
136     ENDIF()
137 ENDIF()
139 CHECK_INCLUDE_FILE(fenv.h HAVE_FENV_H)
140 CHECK_INCLUDE_FILE(float.h HAVE_FLOAT_H)
142 CHECK_LIBRARY_EXISTS(m  sqrtf  "" HAVE_SQRTF)
143 CHECK_LIBRARY_EXISTS(m  acosf  "" HAVE_ACOSF)
144 CHECK_LIBRARY_EXISTS(m  atanf  "" HAVE_ATANF)
145 CHECK_LIBRARY_EXISTS(m  fabsf  "" HAVE_FABSF)
146 IF(HAVE_FENV_H)
147     CHECK_LIBRARY_EXISTS(m  fesetround  "" HAVE_FESETROUND)
148 ENDIF()
149 IF(HAVE_SQRTF OR HAVE_ACOSF OR HAVE_ATANF OR HAVE_FABSF OR HAVE_FESETROUND)
150     SET(EXTRA_LIBS m ${EXTRA_LIBS})
151 ENDIF()
152 CHECK_FUNCTION_EXISTS(strtof HAVE_STRTOF)
153 CHECK_FUNCTION_EXISTS(_controlfp HAVE__CONTROLFP)
155 CHECK_FUNCTION_EXISTS(stat HAVE_STAT)
156 CHECK_FUNCTION_EXISTS(strcasecmp HAVE_STRCASECMP)
157 IF(NOT HAVE_STRCASECMP)
158     CHECK_FUNCTION_EXISTS(_stricmp HAVE__STRICMP)
159     IF(NOT HAVE__STRICMP)
160         MESSAGE(FATAL_ERROR "No case-insensitive compare function found, please report!")
161     ENDIF()
163     ADD_DEFINITIONS(-Dstrcasecmp=_stricmp)
164 ENDIF()
166 CHECK_FUNCTION_EXISTS(strncasecmp HAVE_STRNCASECMP)
167 IF(NOT HAVE_STRNCASECMP)
168     CHECK_FUNCTION_EXISTS(_strnicmp HAVE__STRNICMP)
169     IF(NOT HAVE__STRNICMP)
170         MESSAGE(FATAL_ERROR "No case-insensitive size-limitted compare function found, please report!")
171     ENDIF()
173     ADD_DEFINITIONS(-Dstrncasecmp=_strnicmp)
174 ENDIF()
176 CHECK_FUNCTION_EXISTS(snprintf HAVE_SNPRINTF)
177 IF(NOT HAVE_SNPRINTF)
178     CHECK_FUNCTION_EXISTS(_snprintf HAVE__SNPRINTF)
179     IF(NOT HAVE__SNPRINTF)
180         MESSAGE(FATAL_ERROR "No snprintf function found, please report!")
181     ENDIF()
183     ADD_DEFINITIONS(-Dsnprintf=_snprintf)
184 ENDIF()
186 CHECK_FUNCTION_EXISTS(vsnprintf HAVE_VSNPRINTF)
187 IF(NOT HAVE_VSNPRINTF)
188     CHECK_FUNCTION_EXISTS(_vsnprintf HAVE__VSNPRINTF)
189     IF(NOT HAVE__VSNPRINTF)
190         MESSAGE(FATAL_ERROR "No vsnprintf function found, please report!")
191     ENDIF()
193     ADD_DEFINITIONS(-Dvsnprintf=_vsnprintf)
194 ENDIF()
196 CHECK_SYMBOL_EXISTS(isnan math.h HAVE_ISNAN)
197 IF(NOT HAVE_ISNAN)
198     CHECK_FUNCTION_EXISTS(_isnan HAVE__ISNAN)
199     IF(NOT HAVE__ISNAN)
200         MESSAGE(FATAL_ERROR "No isnan function found, please report!")
201     ENDIF()
203     ADD_DEFINITIONS(-Disnan=_isnan)
204 ENDIF()
207 # Check for the dlopen API (for dynamicly loading backend libs)
208 IF(DLOPEN)
209     CHECK_INCLUDE_FILE(dlfcn.h HAVE_DLFCN_H)
210     IF(HAVE_DLFCN_H)
211         CHECK_LIBRARY_EXISTS(dl dlopen "" HAVE_LIBDL)
212         IF(HAVE_LIBDL)
213             SET(EXTRA_LIBS dl ${EXTRA_LIBS})
214         ENDIF()
215     ENDIF()
216 ENDIF()
218 # Check if we have Windows headers
219 CHECK_INCLUDE_FILE(windows.h HAVE_WINDOWS_H -D_WIN32_WINNT=0x0500)
220 IF(NOT HAVE_WINDOWS_H)
221     CHECK_FUNCTION_EXISTS(gettimeofday HAVE_GETTIMEOFDAY)
222     IF(NOT HAVE_GETTIMEOFDAY)
223         MESSAGE(FATAL_ERROR "No timing function found!")
224     ENDIF()
226     CHECK_FUNCTION_EXISTS(nanosleep HAVE_NANOSLEEP)
227     IF(NOT HAVE_NANOSLEEP)
228         MESSAGE(FATAL_ERROR "No sleep function found!")
229     ENDIF()
231     CHECK_C_COMPILER_FLAG(-pthread HAVE_PTHREAD)
232     IF(HAVE_PTHREAD)
233         ADD_DEFINITIONS(-pthread)
234         SET(EXTRA_LIBS ${EXTRA_LIBS} -pthread)
235     ENDIF()
237     # We need pthreads outside of Windows
238     CHECK_INCLUDE_FILE(pthread.h HAVE_PTHREAD_H)
239     IF(NOT HAVE_PTHREAD_H)
240         MESSAGE(FATAL_ERROR "PThreads is required for non-Windows builds!")
241     ENDIF()
242     # Some systems need pthread_np.h to get recursive mutexes
243     CHECK_INCLUDE_FILES("pthread.h;pthread_np.h" HAVE_PTHREAD_NP_H)
245     # _GNU_SOURCE is needed on some systems for extra attributes, and
246     # _REENTRANT is needed for libc thread-safety
247     ADD_DEFINITIONS(-D_GNU_SOURCE=1)
248     CHECK_LIBRARY_EXISTS(pthread pthread_create "" HAVE_LIBPTHREAD)
249     IF(HAVE_LIBPTHREAD)
250         SET(EXTRA_LIBS pthread ${EXTRA_LIBS})
251     ENDIF()
253     CHECK_LIBRARY_EXISTS(pthread pthread_setschedparam "" HAVE_PTHREAD_SETSCHEDPARAM)
255     CHECK_LIBRARY_EXISTS(rt clock_gettime "" HAVE_LIBRT)
256     IF(HAVE_LIBRT)
257         SET(EXTRA_LIBS rt ${EXTRA_LIBS})
258     ENDIF()
259 ENDIF()
261 # Check for a 64-bit type
262 CHECK_INCLUDE_FILE(stdint.h HAVE_STDINT_H)
263 IF(NOT HAVE_STDINT_H)
264     IF(HAVE_WINDOWS_H)
265         CHECK_C_SOURCE_COMPILES("\#define _WIN32_WINNT 0x0500
266                                  \#include <windows.h>
267                                  __int64 foo;
268                                  int main() {return 0;}" HAVE___INT64)
269     ENDIF()
270     IF(NOT HAVE___INT64)
271         IF(NOT SIZEOF_LONG MATCHES "8")
272             IF(NOT SIZEOF_LONG_LONG MATCHES "8")
273                 MESSAGE(FATAL_ERROR "No 64-bit types found, please report!")
274             ENDIF()
275         ENDIF()
276     ENDIF()
277 ENDIF()
280 SET(OPENAL_OBJS  OpenAL32/alAuxEffectSlot.c
281                  OpenAL32/alBuffer.c
282                  OpenAL32/alDatabuffer.c
283                  OpenAL32/alEffect.c
284                  OpenAL32/alError.c
285                  OpenAL32/alExtension.c
286                  OpenAL32/alFilter.c
287                  OpenAL32/alListener.c
288                  OpenAL32/alSource.c
289                  OpenAL32/alState.c
290                  OpenAL32/alThunk.c
292 SET(ALC_OBJS  Alc/ALc.c
293               Alc/ALu.c
294               Alc/alcConfig.c
295               Alc/alcEcho.c
296               Alc/alcReverb.c
297               Alc/alcRing.c
298               Alc/alcThread.c
299               Alc/bs2b.c
300               Alc/wave.c
303 SET(BACKENDS "")
305 # Check ALSA backend
306 IF(ALSA)
307     CHECK_INCLUDE_FILE(alsa/asoundlib.h HAVE_ALSA_ASOUNDLIB_H)
308     IF(HAVE_ALSA_ASOUNDLIB_H)
309         CHECK_LIBRARY_EXISTS(asound snd_pcm_open "" HAVE_LIBASOUND)
310         IF(HAVE_DLFCN_H OR HAVE_LIBASOUND)
311             SET(HAVE_ALSA 1)
312             SET(ALC_OBJS  ${ALC_OBJS} Alc/alsa.c)
313             IF(HAVE_DLFCN_H)
314                 SET(BACKENDS  "${BACKENDS} ALSA,")
315             ELSE()
316                 SET(BACKENDS  "${BACKENDS} ALSA \(linked\),")
317                 SET(EXTRA_LIBS asound ${EXTRA_LIBS})
318             ENDIF()
319         ENDIF()
320     ENDIF()
321 ENDIF()
323 # Check OSS backend
324 IF(OSS)
325     CHECK_INCLUDE_FILE(sys/soundcard.h HAVE_SYS_SOUNDCARD_H)
326     IF(HAVE_SYS_SOUNDCARD_H)
327         SET(HAVE_OSS 1)
328         SET(ALC_OBJS  ${ALC_OBJS} Alc/oss.c)
329         SET(BACKENDS  "${BACKENDS} OSS,")
330     ENDIF()
331 ENDIF()
333 # Check Solaris backend
334 IF(SOLARIS)
335     CHECK_INCLUDE_FILE(sys/audioio.h HAVE_SYS_AUDIOIO_H)
336     IF(HAVE_SYS_AUDIOIO_H)
337         SET(HAVE_SOLARIS 1)
338         SET(ALC_OBJS  ${ALC_OBJS} Alc/solaris.c)
339         SET(BACKENDS  "${BACKENDS} Solaris,")
340     ENDIF()
341 ENDIF()
343 # Check DSound/MMSystem backend
344 IF(DSOUND)
345     CHECK_INCLUDE_FILE(dsound.h HAVE_DSOUND_H)
346     IF(HAVE_DSOUND_H)
347         CHECK_LIBRARY_EXISTS(dsound DirectSoundCreate "" HAVE_LIBDSOUND)
348         IF(HAVE_LIBDSOUND OR WIN32)
349             SET(HAVE_DSOUND 1)
350             SET(ALC_OBJS  ${ALC_OBJS} Alc/dsound.c)
352             IF(WIN32)
353                 SET(BACKENDS  "${BACKENDS} DirectSound,")
354             ELSE()
355                 SET(BACKENDS  "${BACKENDS} DirectSound \(linked\),")
356                 SET(EXTRA_LIBS dsound ${EXTRA_LIBS})
357             ENDIF()
358         ENDIF()
359     ENDIF()
360 ENDIF()
361 IF(HAVE_WINDOWS_H)
362     IF(WINMM)
363         CHECK_INCLUDE_FILES("windows.h;mmsystem.h" HAVE_MMSYSTEM_H -D_WIN32_WINNT=0x0500)
364         IF(HAVE_MMSYSTEM_H)
365             SET(HAVE_WINMM 1)
366             SET(ALC_OBJS  ${ALC_OBJS} Alc/winmm.c)
367             SET(BACKENDS  "${BACKENDS} WinMM,")
369             SET(CMAKE_REQUIRED_LIBRARIES winmm)
370             CHECK_C_SOURCE_COMPILES("int main() {return 0;}" HAVE_LIBWINMM)
371             SET(CMAKE_REQUIRED_LIBRARIES "")
372 #            CHECK_LIBRARY_EXISTS(winmm waveInOpen "" HAVE_LIBWINMM)
373             IF(HAVE_LIBWINMM)
374                 SET(EXTRA_LIBS winmm ${EXTRA_LIBS})
375             ENDIF()
376         ENDIF()
377     ENDIF()
378 ENDIF()
380 # Check PortAudio backend
381 IF(PORTAUDIO)
382     CHECK_INCLUDE_FILE(portaudio.h HAVE_PORTAUDIO_H)
383     IF(HAVE_PORTAUDIO_H)
384         CHECK_LIBRARY_EXISTS(portaudio Pa_Initialize "" HAVE_LIBPORTAUDIO)
385         IF(HAVE_LIBPORTAUDIO)
386             SET(HAVE_PORTAUDIO 1)
387             SET(ALC_OBJS  ${ALC_OBJS} Alc/portaudio.c)
388             IF(HAVE_DLFCN_H)
389                 SET(BACKENDS  "${BACKENDS} PortAudio,")
390             ELSE()
391                 SET(BACKENDS  "${BACKENDS} PortAudio \(linked\),")
392                 SET(EXTRA_LIBS portaudio ${EXTRA_LIBS})
393             ENDIF()
394         ENDIF()
395     ENDIF()
396 ENDIF()
398 # Check PortAudio backend
399 IF(PULSEAUDIO)
400     CHECK_INCLUDE_FILE(pulse/pulseaudio.h HAVE_PULSE_PULSEAUDIO_H)
401     IF(HAVE_PULSE_PULSEAUDIO_H)
402         CHECK_LIBRARY_EXISTS(pulse pa_context_new "" HAVE_LIBPULSE)
403         IF(HAVE_LIBPULSE)
404             SET(HAVE_PULSEAUDIO 1)
405             SET(ALC_OBJS  ${ALC_OBJS} Alc/pulseaudio.c)
406             IF(HAVE_DLFCN_H)
407                 SET(BACKENDS  "${BACKENDS} PulseAudio,")
408             ELSE()
409                 SET(BACKENDS  "${BACKENDS} PulseAudio \(linked\),")
410                 SET(EXTRA_LIBS pulse ${EXTRA_LIBS})
411             ENDIF()
412         ENDIF()
413     ENDIF()
414 ENDIF()
416 # This is always available
417 SET(BACKENDS  "${BACKENDS} WaveFile")
419 # Needed for openal.pc.in
420 SET(prefix ${CMAKE_INSTALL_PREFIX})
421 SET(exec_prefix "\${prefix}")
422 SET(libdir "\${exec_prefix}/${LIB_INSTALL_DIR}")
423 SET(bindir "\${exec_prefix}/bin")
424 SET(includedir "\${prefix}/include")
425 SET(PACKAGE_VERSION "${LIB_VERSION}")
427 # End configuration
428 CONFIGURE_FILE(
429     "${OpenAL_SOURCE_DIR}/config.h.in"
430     "${OpenAL_BINARY_DIR}/config.h")
431 CONFIGURE_FILE(
432     "${OpenAL_SOURCE_DIR}/openal.pc.in"
433     "${OpenAL_BINARY_DIR}/openal.pc"
434     @ONLY)
436 ADD_DEFINITIONS(-DAL_BUILD_LIBRARY)
438 # Build a library
439 IF(NOT LIBTYPE)
440     SET(LIBTYPE SHARED)
441 ENDIF()
442 ADD_LIBRARY(${LIBNAME} ${LIBTYPE} ${OPENAL_OBJS} ${ALC_OBJS})
443 SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES VERSION ${LIB_VERSION}
444                                             SOVERSION ${LIB_MAJOR_VERSION})
445 IF(WIN32)
446     SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES PREFIX "")
447 ENDIF()
449 TARGET_LINK_LIBRARIES(${LIBNAME} ${EXTRA_LIBS})
451 # Add an install target here
452 INSTALL(TARGETS ${LIBNAME}
453         RUNTIME DESTINATION bin
454         LIBRARY DESTINATION ${LIB_INSTALL_DIR}
455         ARCHIVE DESTINATION ${LIB_INSTALL_DIR}
457 INSTALL(FILES include/AL/al.h
458               include/AL/alc.h
459               include/AL/alext.h
460         DESTINATION include/AL
462 INSTALL(FILES "${OpenAL_BINARY_DIR}/openal.pc"
463         DESTINATION "${LIB_INSTALL_DIR}/pkgconfig")
465 # Install alsoft.conf configuration file
466 IF(ALSOFT_CONFIG)
467     INSTALL(FILES alsoftrc.sample
468             DESTINATION /etc/openal
469             RENAME alsoft.conf
470     )
471 ENDIF()
473 IF(EXAMPLES)
474     ADD_EXECUTABLE(openal-info examples/openal-info.c)
475     TARGET_LINK_LIBRARIES(openal-info ${LIBNAME})
476     INSTALL(TARGETS openal-info
477             RUNTIME DESTINATION bin
478             LIBRARY DESTINATION ${LIB_INSTALL_DIR}
479             ARCHIVE DESTINATION ${LIB_INSTALL_DIR}
480     )
481 ENDIF()
483 MESSAGE(STATUS "")
484 MESSAGE(STATUS "Building OpenAL with support for the following backends:")
485 MESSAGE(STATUS "    ${BACKENDS}")
486 MESSAGE(STATUS "")
488 IF(WIN32)
489     IF(NOT HAVE_DSOUND)
490         MESSAGE(STATUS "WARNING: Building the Windows version without DirectSound output")
491         MESSAGE(STATUS "         This is probably NOT what you want!")
492         MESSAGE(STATUS "")
493     ENDIF()
494 ENDIF()