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)
15 SET(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS TRUE)
18 OPTION(ALSA "Check for ALSA backend" ON)
19 OPTION(OSS "Check for OSS backend" ON)
20 OPTION(DSOUND "Check for DirectSound backend" ON)
21 OPTION(WINMM "Check for Windows Multimedia backend" ON)
23 OPTION(DLOPEN "Check for the dlopen API for loading optional libs" ON)
25 OPTION(WERROR "Treat compile warnings as errors" OFF)
28 SET(LIB_MAJOR_VERSION "1")
29 SET(LIB_MINOR_VERSION "2")
30 SET(LIB_BUILD_VERSION "218")
31 SET(LIB_VERSION "${LIB_MAJOR_VERSION}.${LIB_MINOR_VERSION}.${LIB_BUILD_VERSION}")
34 CHECK_TYPE_SIZE("long" SIZEOF_LONG)
35 CHECK_TYPE_SIZE("long long" SIZEOF_LONG_LONG)
36 CHECK_TYPE_SIZE("unsigned int" SIZEOF_UINT)
37 CHECK_TYPE_SIZE("void*" SIZEOF_VOIDP)
40 # Add definitions, compiler switches, etc.
41 INCLUDE_DIRECTORIES(OpenAL32/Include include "${OpenAL_BINARY_DIR}")
43 IF(NOT CMAKE_BUILD_TYPE)
44 SET(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING
45 "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel."
51 SET(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -D_DEBUG")
52 SET(CMAKE_C_FLAGS_MINSIZEREL "${CMAKE_C_FLAGS_MINSIZEREL} -DNDEBUG")
53 SET(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -DNDEBUG")
54 SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -D_DEBUG")
56 ADD_DEFINITIONS(-Wall)
57 CHECK_C_COMPILER_FLAG(-Wextra HAVE_W_EXTRA)
59 ADD_DEFINITIONS(-Wextra)
63 ADD_DEFINITIONS(-Werror)
66 SET(CMAKE_C_FLAGS_RELWITHDEBINFO "-g -O2 -funroll-loops -D_DEBUG" CACHE STRING
67 "Flags used by the compiler during Release with Debug Info builds."
69 SET(CMAKE_C_FLAGS_MINSIZEREL "-Os -DNDEBUG" CACHE STRING
70 "Flags used by the compiler during release minsize builds."
72 SET(CMAKE_C_FLAGS_RELEASE "-O2 -funroll-loops -fomit-frame-pointer -DNDEBUG" CACHE STRING
73 "Flags used by the compiler during release builds"
75 SET(CMAKE_C_FLAGS_DEBUG "-g3 -D_DEBUG" CACHE STRING
76 "Flags used by the compiler during debug builds."
79 # The mixer doesn't like GCC's strict aliasing optimizations. Make sure
81 CHECK_C_COMPILER_FLAG(-fstrict-aliasing HAVE_STRICT_ALIASING)
82 IF("${HAVE_STRICT_ALIASING}")
83 ADD_DEFINITIONS(-fno-strict-aliasing)
86 # Set visibility options if available
88 CHECK_C_SOURCE_COMPILES("int foo() __attribute__((destructor));
89 int main() {return 0;}" HAVE_GCC_DESTRUCTOR)
91 CHECK_C_COMPILER_FLAG(-fvisibility=hidden HAVE_VISIBILITY_SWITCH)
92 IF("${HAVE_VISIBILITY_SWITCH}")
93 CHECK_C_SOURCE_COMPILES("int foo() __attribute__((visibility(\"default\")));
94 int main() {return 0;}" HAVE_GCC_VISIBILITY)
95 IF("${HAVE_GCC_VISIBILITY}")
96 ADD_DEFINITIONS(-fvisibility=hidden -DHAVE_GCC_VISIBILITY)
103 CHECK_LIBRARY_EXISTS(m sqrtf "" HAVE_SQRTF)
104 CHECK_LIBRARY_EXISTS(m acosf "" HAVE_ACOSF)
105 IF(HAVE_SQRTF OR HAVE_ACOSF)
106 SET(EXTRA_LIBS m ${EXTRA_LIBS})
108 CHECK_FUNCTION_EXISTS(strtof HAVE_STRTOF)
110 CHECK_FUNCTION_EXISTS(strcasecmp HAVE_STRCASECMP)
111 IF(NOT HAVE_STRCASECMP)
112 CHECK_FUNCTION_EXISTS(_stricmp HAVE__STRICMP)
113 IF(NOT HAVE__STRICMP)
114 MESSAGE(FATAL_ERROR "No case-insensitive compare function found, please report!")
117 ADD_DEFINITIONS(-Dstrcasecmp=_stricmp)
120 CHECK_FUNCTION_EXISTS(strncasecmp HAVE_STRNCASECMP)
121 IF(NOT HAVE_STRNCASECMP)
122 CHECK_FUNCTION_EXISTS(_strnicmp HAVE__STRNICMP)
123 IF(NOT HAVE__STRNICMP)
124 MESSAGE(FATAL_ERROR "No case-insensitive size-limitted compare function found, please report!")
127 ADD_DEFINITIONS(-Dstrncasecmp=_strnicmp)
130 CHECK_FUNCTION_EXISTS(snprintf HAVE_SNPRINTF)
131 IF(NOT HAVE_SNPRINTF)
132 CHECK_FUNCTION_EXISTS(_snprintf HAVE__SNPRINTF)
133 IF(NOT HAVE__SNPRINTF)
134 MESSAGE(FATAL_ERROR "No snprintf function found, please report!")
137 ADD_DEFINITIONS(-Dsnprintf=_snprintf)
140 # Check for the dlopen API (for dynamicly loading backend libs)
142 CHECK_INCLUDE_FILE(dlfcn.h HAVE_DLFCN_H)
144 CHECK_LIBRARY_EXISTS(dl dlopen "" HAVE_LIBDL)
146 SET(EXTRA_LIBS dl ${EXTRA_LIBS})
151 # Check if we have Windows headers
152 CHECK_INCLUDE_FILE(windows.h HAVE_WINDOWS_H)
153 IF(NOT HAVE_WINDOWS_H)
154 CHECK_FUNCTION_EXISTS(gettimeofday HAVE_GETTIMEOFDAY)
155 IF(NOT HAVE_GETTIMEOFDAY)
156 MESSAGE(FATAL_ERROR "No timing function found!")
159 CHECK_FUNCTION_EXISTS(nanosleep HAVE_NANOSLEEP)
160 IF(NOT HAVE_NANOSLEEP)
161 MESSAGE(FATAL_ERROR "No sleep function found!")
164 # We need pthreads outside of Windows
165 CHECK_INCLUDE_FILE(pthread.h HAVE_PTHREAD_H)
166 IF(NOT HAVE_PTHREAD_H)
167 MESSAGE(FATAL_ERROR "PThreads is required for non-Windows builds!")
170 # _GNU_SOURCE is needed on some systems for extra attributes, and
171 # _REENTRANT is needed for libc thread-safety
172 ADD_DEFINITIONS(-D_GNU_SOURCE=1 -D_REENTRANT)
173 CHECK_LIBRARY_EXISTS(pthread pthread_create "" HAVE_LIBPTHREAD)
175 SET(EXTRA_LIBS pthread ${EXTRA_LIBS})
179 # Check for a 64-bit type
180 CHECK_INCLUDE_FILE(stdint.h HAVE_STDINT_H)
181 IF(NOT HAVE_STDINT_H)
183 CHECK_C_SOURCE_COMPILES("\#include <windows.h>
185 int main() {return 0;}" HAVE___INT64)
188 IF(NOT SIZEOF_LONG MATCHES "8")
189 IF(NOT SIZEOF_LONG_LONG MATCHES "8")
190 MESSAGE(FATAL_ERROR "No 64-bit types found, please report!")
197 SET(OPENAL_OBJS OpenAL32/alAuxEffectSlot.c
201 OpenAL32/alExtension.c
203 OpenAL32/alListener.c
209 SET(ALC_OBJS Alc/ALc.c
222 CHECK_INCLUDE_FILE(alsa/asoundlib.h HAVE_ALSA_ASOUNDLIB_H)
223 IF(HAVE_ALSA_ASOUNDLIB_H)
224 CHECK_LIBRARY_EXISTS(asound snd_pcm_open "" HAVE_LIBASOUND)
225 IF(HAVE_DLFCN_H OR HAVE_LIBASOUND)
227 SET(ALC_OBJS ${ALC_OBJS} Alc/alsa.c)
229 SET(BACKENDS "${BACKENDS} ALSA,")
231 SET(BACKENDS "${BACKENDS} ALSA \(linked\),")
232 SET(EXTRA_LIBS asound ${EXTRA_LIBS})
240 CHECK_INCLUDE_FILE(sys/soundcard.h HAVE_SYS_SOUNDCARD_H)
241 IF(HAVE_SYS_SOUNDCARD_H)
243 SET(ALC_OBJS ${ALC_OBJS} Alc/oss.c)
244 SET(BACKENDS "${BACKENDS} OSS,")
248 # Check DSound/MMSystem backend
251 CHECK_INCLUDE_FILE(dsound.h HAVE_DSOUND_H)
254 SET(ALC_OBJS ${ALC_OBJS} Alc/dsound.c)
255 SET(BACKENDS "${BACKENDS} DirectSound,")
257 SET(CMAKE_REQUIRED_LIBRARIES dsound)
258 CHECK_C_SOURCE_COMPILES("int main() {return 0;}" HAVE_LIBDSOUND)
259 SET(CMAKE_REQUIRED_LIBRARIES "")
260 # CHECK_LIBRARY_EXISTS(dsound DirectSoundCreate "" HAVE_LIBDSOUND)
262 SET(EXTRA_LIBS dsound ${EXTRA_LIBS})
267 CHECK_INCLUDE_FILES("windows.h;mmsystem.h" HAVE_MMSYSTEM_H)
270 SET(ALC_OBJS ${ALC_OBJS} Alc/winmm.c)
271 SET(BACKENDS "${BACKENDS} WinMM,")
273 SET(CMAKE_REQUIRED_LIBRARIES winmm)
274 CHECK_C_SOURCE_COMPILES("int main() {return 0;}" HAVE_LIBWINMM)
275 SET(CMAKE_REQUIRED_LIBRARIES "")
276 # CHECK_LIBRARY_EXISTS(winmm waveInOpen "" HAVE_LIBWINMM)
278 SET(EXTRA_LIBS winmm ${EXTRA_LIBS})
284 # This is always available
285 SET(BACKENDS "${BACKENDS} WaveFile")
289 "${OpenAL_SOURCE_DIR}/config.h.in"
290 "${OpenAL_BINARY_DIR}/config.h")
292 ADD_DEFINITIONS(-DAL_BUILD_LIBRARY)
294 # Build a shared library
296 SET(LIBNAME openal32)
301 ADD_LIBRARY(${LIBNAME} SHARED ${OPENAL_OBJS} ${ALC_OBJS})
302 SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES VERSION ${LIB_VERSION}
303 SOVERSION ${LIB_MAJOR_VERSION})
305 SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES PREFIX "")
308 TARGET_LINK_LIBRARIES(${LIBNAME} ${EXTRA_LIBS})
310 # Add an install target here
311 INSTALL(TARGETS ${LIBNAME}
312 RUNTIME DESTINATION bin
313 LIBRARY DESTINATION lib
314 ARCHIVE DESTINATION lib
316 INSTALL(FILES include/AL/al.h
319 DESTINATION include/AL
323 MESSAGE(STATUS "Building OpenAL with support for the following backends:")
324 MESSAGE(STATUS " ${BACKENDS}")