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)
27 OPTION(EXAMPLES "Build example programs" ON)
30 SET(LIB_MAJOR_VERSION "1")
31 SET(LIB_MINOR_VERSION "3")
32 SET(LIB_BUILD_VERSION "253")
33 SET(LIB_VERSION "${LIB_MAJOR_VERSION}.${LIB_MINOR_VERSION}.${LIB_BUILD_VERSION}")
36 CHECK_TYPE_SIZE("long" SIZEOF_LONG)
37 CHECK_TYPE_SIZE("long long" SIZEOF_LONG_LONG)
38 CHECK_TYPE_SIZE("unsigned int" SIZEOF_UINT)
39 CHECK_TYPE_SIZE("void*" SIZEOF_VOIDP)
42 # Add definitions, compiler switches, etc.
43 INCLUDE_DIRECTORIES(OpenAL32/Include include "${OpenAL_BINARY_DIR}")
45 IF(NOT CMAKE_BUILD_TYPE)
46 SET(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING
47 "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel."
53 SET(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -D_DEBUG")
54 SET(CMAKE_C_FLAGS_MINSIZEREL "${CMAKE_C_FLAGS_MINSIZEREL} -DNDEBUG")
55 SET(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -DNDEBUG")
56 SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -D_DEBUG")
58 ADD_DEFINITIONS(-Wall)
59 CHECK_C_COMPILER_FLAG(-Wextra HAVE_W_EXTRA)
61 ADD_DEFINITIONS(-Wextra)
65 ADD_DEFINITIONS(-Werror)
68 SET(CMAKE_C_FLAGS_RELWITHDEBINFO "-g -O2 -funroll-loops -D_DEBUG" CACHE STRING
69 "Flags used by the compiler during Release with Debug Info builds."
71 SET(CMAKE_C_FLAGS_MINSIZEREL "-Os -DNDEBUG" CACHE STRING
72 "Flags used by the compiler during release minsize builds."
74 SET(CMAKE_C_FLAGS_RELEASE "-O2 -funroll-loops -fomit-frame-pointer -DNDEBUG" CACHE STRING
75 "Flags used by the compiler during release builds"
77 SET(CMAKE_C_FLAGS_DEBUG "-g3 -D_DEBUG" CACHE STRING
78 "Flags used by the compiler during debug builds."
81 # Set visibility options if available
83 CHECK_C_SOURCE_COMPILES("int foo() __attribute__((destructor));
84 int main() {return 0;}" HAVE_GCC_DESTRUCTOR)
86 CHECK_C_COMPILER_FLAG(-fvisibility=hidden HAVE_VISIBILITY_SWITCH)
87 IF("${HAVE_VISIBILITY_SWITCH}")
88 CHECK_C_SOURCE_COMPILES("int foo() __attribute__((visibility(\"default\")));
89 int main() {return 0;}" HAVE_GCC_VISIBILITY)
90 IF("${HAVE_GCC_VISIBILITY}")
91 ADD_DEFINITIONS(-fvisibility=hidden -DHAVE_GCC_VISIBILITY)
98 CHECK_LIBRARY_EXISTS(m sqrtf "" HAVE_SQRTF)
99 CHECK_LIBRARY_EXISTS(m acosf "" HAVE_ACOSF)
100 IF(HAVE_SQRTF OR HAVE_ACOSF)
101 SET(EXTRA_LIBS m ${EXTRA_LIBS})
103 CHECK_FUNCTION_EXISTS(strtof HAVE_STRTOF)
105 CHECK_FUNCTION_EXISTS(strcasecmp HAVE_STRCASECMP)
106 IF(NOT HAVE_STRCASECMP)
107 CHECK_FUNCTION_EXISTS(_stricmp HAVE__STRICMP)
108 IF(NOT HAVE__STRICMP)
109 MESSAGE(FATAL_ERROR "No case-insensitive compare function found, please report!")
112 ADD_DEFINITIONS(-Dstrcasecmp=_stricmp)
115 CHECK_FUNCTION_EXISTS(strncasecmp HAVE_STRNCASECMP)
116 IF(NOT HAVE_STRNCASECMP)
117 CHECK_FUNCTION_EXISTS(_strnicmp HAVE__STRNICMP)
118 IF(NOT HAVE__STRNICMP)
119 MESSAGE(FATAL_ERROR "No case-insensitive size-limitted compare function found, please report!")
122 ADD_DEFINITIONS(-Dstrncasecmp=_strnicmp)
125 CHECK_FUNCTION_EXISTS(snprintf HAVE_SNPRINTF)
126 IF(NOT HAVE_SNPRINTF)
127 CHECK_FUNCTION_EXISTS(_snprintf HAVE__SNPRINTF)
128 IF(NOT HAVE__SNPRINTF)
129 MESSAGE(FATAL_ERROR "No snprintf function found, please report!")
132 ADD_DEFINITIONS(-Dsnprintf=_snprintf)
135 # Check for the dlopen API (for dynamicly loading backend libs)
137 CHECK_INCLUDE_FILE(dlfcn.h HAVE_DLFCN_H)
139 CHECK_LIBRARY_EXISTS(dl dlopen "" HAVE_LIBDL)
141 SET(EXTRA_LIBS dl ${EXTRA_LIBS})
146 # Check if we have Windows headers
147 CHECK_INCLUDE_FILE(windows.h HAVE_WINDOWS_H -D_WIN32_WINNT=0x0500)
148 IF(NOT HAVE_WINDOWS_H)
149 CHECK_FUNCTION_EXISTS(gettimeofday HAVE_GETTIMEOFDAY)
150 IF(NOT HAVE_GETTIMEOFDAY)
151 MESSAGE(FATAL_ERROR "No timing function found!")
154 CHECK_FUNCTION_EXISTS(nanosleep HAVE_NANOSLEEP)
155 IF(NOT HAVE_NANOSLEEP)
156 MESSAGE(FATAL_ERROR "No sleep function found!")
159 # We need pthreads outside of Windows
160 CHECK_INCLUDE_FILE(pthread.h HAVE_PTHREAD_H)
161 IF(NOT HAVE_PTHREAD_H)
162 MESSAGE(FATAL_ERROR "PThreads is required for non-Windows builds!")
165 # Some systems need pthread_np.h to get recursive mutexes
166 CHECK_INCLUDE_FILES("pthread.h;pthread_np.h" HAVE_PTHREAD_NP_H)
168 # _GNU_SOURCE is needed on some systems for extra attributes, and
169 # _REENTRANT is needed for libc thread-safety
170 ADD_DEFINITIONS(-D_GNU_SOURCE=1 -D_REENTRANT)
171 CHECK_LIBRARY_EXISTS(pthread pthread_create "" HAVE_LIBPTHREAD)
173 SET(EXTRA_LIBS pthread ${EXTRA_LIBS})
177 # Check for a 64-bit type
178 CHECK_INCLUDE_FILE(stdint.h HAVE_STDINT_H)
179 IF(NOT HAVE_STDINT_H)
181 CHECK_C_SOURCE_COMPILES("\#define _WIN32_WINNT 0x0500
182 \#include <windows.h>
184 int main() {return 0;}" HAVE___INT64)
187 IF(NOT SIZEOF_LONG MATCHES "8")
188 IF(NOT SIZEOF_LONG_LONG MATCHES "8")
189 MESSAGE(FATAL_ERROR "No 64-bit types found, please report!")
196 SET(OPENAL_OBJS OpenAL32/alAuxEffectSlot.c
200 OpenAL32/alExtension.c
202 OpenAL32/alListener.c
208 SET(ALC_OBJS Alc/ALc.c
221 CHECK_INCLUDE_FILE(alsa/asoundlib.h HAVE_ALSA_ASOUNDLIB_H)
222 IF(HAVE_ALSA_ASOUNDLIB_H)
223 CHECK_LIBRARY_EXISTS(asound snd_pcm_open "" HAVE_LIBASOUND)
224 IF(HAVE_DLFCN_H OR HAVE_LIBASOUND)
226 SET(ALC_OBJS ${ALC_OBJS} Alc/alsa.c)
228 SET(BACKENDS "${BACKENDS} ALSA,")
230 SET(BACKENDS "${BACKENDS} ALSA \(linked\),")
231 SET(EXTRA_LIBS asound ${EXTRA_LIBS})
239 CHECK_INCLUDE_FILE(sys/soundcard.h HAVE_SYS_SOUNDCARD_H)
240 IF(HAVE_SYS_SOUNDCARD_H)
242 SET(ALC_OBJS ${ALC_OBJS} Alc/oss.c)
243 SET(BACKENDS "${BACKENDS} OSS,")
247 # Check DSound/MMSystem backend
250 CHECK_INCLUDE_FILE(dsound.h HAVE_DSOUND_H)
253 SET(ALC_OBJS ${ALC_OBJS} Alc/dsound.c)
254 SET(BACKENDS "${BACKENDS} DirectSound,")
256 SET(CMAKE_REQUIRED_LIBRARIES dsound)
257 CHECK_C_SOURCE_COMPILES("int main() {return 0;}" HAVE_LIBDSOUND)
258 SET(CMAKE_REQUIRED_LIBRARIES "")
259 # CHECK_LIBRARY_EXISTS(dsound DirectSoundCreate "" HAVE_LIBDSOUND)
261 SET(EXTRA_LIBS dsound ${EXTRA_LIBS})
266 CHECK_INCLUDE_FILES("windows.h;mmsystem.h" HAVE_MMSYSTEM_H -D_WIN32_WINNT=0x0500)
269 SET(ALC_OBJS ${ALC_OBJS} Alc/winmm.c)
270 SET(BACKENDS "${BACKENDS} WinMM,")
272 SET(CMAKE_REQUIRED_LIBRARIES winmm)
273 CHECK_C_SOURCE_COMPILES("int main() {return 0;}" HAVE_LIBWINMM)
274 SET(CMAKE_REQUIRED_LIBRARIES "")
275 # CHECK_LIBRARY_EXISTS(winmm waveInOpen "" HAVE_LIBWINMM)
277 SET(EXTRA_LIBS winmm ${EXTRA_LIBS})
283 # This is always available
284 SET(BACKENDS "${BACKENDS} WaveFile")
288 "${OpenAL_SOURCE_DIR}/config.h.in"
289 "${OpenAL_BINARY_DIR}/config.h")
291 ADD_DEFINITIONS(-DAL_BUILD_LIBRARY)
293 # Build a shared library
295 SET(LIBNAME openal32)
300 ADD_LIBRARY(${LIBNAME} SHARED ${OPENAL_OBJS} ${ALC_OBJS})
301 SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES VERSION ${LIB_VERSION}
302 SOVERSION ${LIB_MAJOR_VERSION})
304 SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES PREFIX "")
307 TARGET_LINK_LIBRARIES(${LIBNAME} ${EXTRA_LIBS})
309 # Add an install target here
310 INSTALL(TARGETS ${LIBNAME}
311 RUNTIME DESTINATION bin
312 LIBRARY DESTINATION lib
313 ARCHIVE DESTINATION lib
315 INSTALL(FILES include/AL/al.h
318 DESTINATION include/AL
322 ADD_EXECUTABLE(openal-info examples/openal-info.c)
323 TARGET_LINK_LIBRARIES(openal-info ${LIBNAME})
327 MESSAGE(STATUS "Building OpenAL with support for the following backends:")
328 MESSAGE(STATUS " ${BACKENDS}")