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 "3")
30 SET(LIB_BUILD_VERSION "253")
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 -D_WIN32_WINNT=0x0500)
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 # Some systems need pthread_np.h to get recursive mutexes
171 CHECK_INCLUDE_FILES("pthread.h;pthread_np.h" HAVE_PTHREAD_NP_H)
173 # _GNU_SOURCE is needed on some systems for extra attributes, and
174 # _REENTRANT is needed for libc thread-safety
175 ADD_DEFINITIONS(-D_GNU_SOURCE=1 -D_REENTRANT)
176 CHECK_LIBRARY_EXISTS(pthread pthread_create "" HAVE_LIBPTHREAD)
178 SET(EXTRA_LIBS pthread ${EXTRA_LIBS})
182 # Check for a 64-bit type
183 CHECK_INCLUDE_FILE(stdint.h HAVE_STDINT_H)
184 IF(NOT HAVE_STDINT_H)
186 CHECK_C_SOURCE_COMPILES("\#define _WIN32_WINNT 0x0500
187 \#include <windows.h>
189 int main() {return 0;}" HAVE___INT64)
192 IF(NOT SIZEOF_LONG MATCHES "8")
193 IF(NOT SIZEOF_LONG_LONG MATCHES "8")
194 MESSAGE(FATAL_ERROR "No 64-bit types found, please report!")
201 SET(OPENAL_OBJS OpenAL32/alAuxEffectSlot.c
205 OpenAL32/alExtension.c
207 OpenAL32/alListener.c
213 SET(ALC_OBJS Alc/ALc.c
226 CHECK_INCLUDE_FILE(alsa/asoundlib.h HAVE_ALSA_ASOUNDLIB_H)
227 IF(HAVE_ALSA_ASOUNDLIB_H)
228 CHECK_LIBRARY_EXISTS(asound snd_pcm_open "" HAVE_LIBASOUND)
229 IF(HAVE_DLFCN_H OR HAVE_LIBASOUND)
231 SET(ALC_OBJS ${ALC_OBJS} Alc/alsa.c)
233 SET(BACKENDS "${BACKENDS} ALSA,")
235 SET(BACKENDS "${BACKENDS} ALSA \(linked\),")
236 SET(EXTRA_LIBS asound ${EXTRA_LIBS})
244 CHECK_INCLUDE_FILE(sys/soundcard.h HAVE_SYS_SOUNDCARD_H)
245 IF(HAVE_SYS_SOUNDCARD_H)
247 SET(ALC_OBJS ${ALC_OBJS} Alc/oss.c)
248 SET(BACKENDS "${BACKENDS} OSS,")
252 # Check DSound/MMSystem backend
255 CHECK_INCLUDE_FILE(dsound.h HAVE_DSOUND_H)
258 SET(ALC_OBJS ${ALC_OBJS} Alc/dsound.c)
259 SET(BACKENDS "${BACKENDS} DirectSound,")
261 SET(CMAKE_REQUIRED_LIBRARIES dsound)
262 CHECK_C_SOURCE_COMPILES("int main() {return 0;}" HAVE_LIBDSOUND)
263 SET(CMAKE_REQUIRED_LIBRARIES "")
264 # CHECK_LIBRARY_EXISTS(dsound DirectSoundCreate "" HAVE_LIBDSOUND)
266 SET(EXTRA_LIBS dsound ${EXTRA_LIBS})
271 CHECK_INCLUDE_FILES("windows.h;mmsystem.h" HAVE_MMSYSTEM_H -D_WIN32_WINNT=0x0500)
274 SET(ALC_OBJS ${ALC_OBJS} Alc/winmm.c)
275 SET(BACKENDS "${BACKENDS} WinMM,")
277 SET(CMAKE_REQUIRED_LIBRARIES winmm)
278 CHECK_C_SOURCE_COMPILES("int main() {return 0;}" HAVE_LIBWINMM)
279 SET(CMAKE_REQUIRED_LIBRARIES "")
280 # CHECK_LIBRARY_EXISTS(winmm waveInOpen "" HAVE_LIBWINMM)
282 SET(EXTRA_LIBS winmm ${EXTRA_LIBS})
288 # This is always available
289 SET(BACKENDS "${BACKENDS} WaveFile")
293 "${OpenAL_SOURCE_DIR}/config.h.in"
294 "${OpenAL_BINARY_DIR}/config.h")
296 ADD_DEFINITIONS(-DAL_BUILD_LIBRARY)
298 # Build a shared library
300 SET(LIBNAME openal32)
305 ADD_LIBRARY(${LIBNAME} SHARED ${OPENAL_OBJS} ${ALC_OBJS})
306 SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES VERSION ${LIB_VERSION}
307 SOVERSION ${LIB_MAJOR_VERSION})
309 SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES PREFIX "")
312 TARGET_LINK_LIBRARIES(${LIBNAME} ${EXTRA_LIBS})
314 # Add an install target here
315 INSTALL(TARGETS ${LIBNAME}
316 RUNTIME DESTINATION bin
317 LIBRARY DESTINATION lib
318 ARCHIVE DESTINATION lib
320 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}")