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 "1")
30 SET(LIB_BUILD_VERSION "93")
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
250 SET(CMAKE_REQUIRED_LIBRARIES ole32)
251 CHECK_C_SOURCE_COMPILES("int main() {return 0;}" HAVE_LIBOLE32)
252 SET(CMAKE_REQUIRED_LIBRARIES "")
253 # CHECK_LIBRARY_EXISTS(ole32 CoInitialize "" HAVE_LIBOLE32)
255 SET(EXTRA_LIBS ole32 ${EXTRA_LIBS})
259 CHECK_INCLUDE_FILE(dsound.h HAVE_DSOUND_H)
262 SET(ALC_OBJS ${ALC_OBJS} Alc/dsound.c)
263 SET(BACKENDS "${BACKENDS} DirectSound,")
265 CHECK_LIBRARY_EXISTS(dxguid IID_IDirectSound "" HAVE_LIBDXGUID)
267 SET(EXTRA_LIBS dxguid ${EXTRA_LIBS})
272 CHECK_INCLUDE_FILES("windows.h;mmsystem.h" HAVE_MMSYSTEM_H)
275 SET(ALC_OBJS ${ALC_OBJS} Alc/winmm.c)
276 SET(BACKENDS "${BACKENDS} WinMM,")
278 SET(CMAKE_REQUIRED_LIBRARIES winmm)
279 CHECK_C_SOURCE_COMPILES("int main() {return 0;}" HAVE_LIBWINMM)
280 SET(CMAKE_REQUIRED_LIBRARIES "")
281 # CHECK_LIBRARY_EXISTS(winmm waveInOpen "" HAVE_LIBWINMM)
283 SET(EXTRA_LIBS winmm ${EXTRA_LIBS})
289 # This is always available
290 SET(BACKENDS "${BACKENDS} WaveFile")
294 "${OpenAL_SOURCE_DIR}/config.h.in"
295 "${OpenAL_BINARY_DIR}/config.h")
297 ADD_DEFINITIONS(-DAL_BUILD_LIBRARY)
299 # Build a shared library
301 SET(LIBNAME openal32)
306 ADD_LIBRARY(${LIBNAME} SHARED ${OPENAL_OBJS} ${ALC_OBJS})
307 SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES VERSION ${LIB_VERSION}
308 SOVERSION ${LIB_MAJOR_VERSION})
310 SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES PREFIX "")
313 TARGET_LINK_LIBRARIES(${LIBNAME} ${EXTRA_LIBS})
315 # Add an install target here
316 INSTALL(TARGETS ${LIBNAME}
317 RUNTIME DESTINATION bin
318 LIBRARY DESTINATION lib
319 ARCHIVE DESTINATION lib
321 INSTALL(FILES include/AL/al.h
323 DESTINATION include/AL
327 MESSAGE(STATUS "Building OpenAL with support for the following backends:")
328 MESSAGE(STATUS " ${BACKENDS}")