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 # Set visibility options if available
81 CHECK_C_SOURCE_COMPILES("int foo() __attribute__((destructor));
82 int main() {return 0;}" HAVE_GCC_DESTRUCTOR)
84 CHECK_C_COMPILER_FLAG(-fvisibility=hidden HAVE_VISIBILITY_SWITCH)
85 IF("${HAVE_VISIBILITY_SWITCH}")
86 CHECK_C_SOURCE_COMPILES("int foo() __attribute__((visibility(\"default\")));
87 int main() {return 0;}" HAVE_GCC_VISIBILITY)
88 IF("${HAVE_GCC_VISIBILITY}")
89 ADD_DEFINITIONS(-fvisibility=hidden -DHAVE_GCC_VISIBILITY)
96 CHECK_LIBRARY_EXISTS(m sqrtf "" HAVE_SQRTF)
97 CHECK_LIBRARY_EXISTS(m acosf "" HAVE_ACOSF)
98 IF(HAVE_SQRTF OR HAVE_ACOSF)
99 SET(EXTRA_LIBS m ${EXTRA_LIBS})
101 CHECK_FUNCTION_EXISTS(strtof HAVE_STRTOF)
103 CHECK_FUNCTION_EXISTS(strcasecmp HAVE_STRCASECMP)
104 IF(NOT HAVE_STRCASECMP)
105 CHECK_FUNCTION_EXISTS(_stricmp HAVE__STRICMP)
106 IF(NOT HAVE__STRICMP)
107 MESSAGE(FATAL_ERROR "No case-insensitive compare function found, please report!")
110 ADD_DEFINITIONS(-Dstrcasecmp=_stricmp)
113 CHECK_FUNCTION_EXISTS(strncasecmp HAVE_STRNCASECMP)
114 IF(NOT HAVE_STRNCASECMP)
115 CHECK_FUNCTION_EXISTS(_strnicmp HAVE__STRNICMP)
116 IF(NOT HAVE__STRNICMP)
117 MESSAGE(FATAL_ERROR "No case-insensitive size-limitted compare function found, please report!")
120 ADD_DEFINITIONS(-Dstrncasecmp=_strnicmp)
123 CHECK_FUNCTION_EXISTS(snprintf HAVE_SNPRINTF)
124 IF(NOT HAVE_SNPRINTF)
125 CHECK_FUNCTION_EXISTS(_snprintf HAVE__SNPRINTF)
126 IF(NOT HAVE__SNPRINTF)
127 MESSAGE(FATAL_ERROR "No snprintf function found, please report!")
130 ADD_DEFINITIONS(-Dsnprintf=_snprintf)
133 # Check for the dlopen API (for dynamicly loading backend libs)
135 CHECK_INCLUDE_FILE(dlfcn.h HAVE_DLFCN_H)
137 CHECK_LIBRARY_EXISTS(dl dlopen "" HAVE_LIBDL)
139 SET(EXTRA_LIBS dl ${EXTRA_LIBS})
144 # Check if we have Windows headers
145 CHECK_INCLUDE_FILE(windows.h HAVE_WINDOWS_H -D_WIN32_WINNT=0x0500)
146 IF(NOT HAVE_WINDOWS_H)
147 CHECK_FUNCTION_EXISTS(gettimeofday HAVE_GETTIMEOFDAY)
148 IF(NOT HAVE_GETTIMEOFDAY)
149 MESSAGE(FATAL_ERROR "No timing function found!")
152 CHECK_FUNCTION_EXISTS(nanosleep HAVE_NANOSLEEP)
153 IF(NOT HAVE_NANOSLEEP)
154 MESSAGE(FATAL_ERROR "No sleep function found!")
157 # We need pthreads outside of Windows
158 CHECK_INCLUDE_FILE(pthread.h HAVE_PTHREAD_H)
159 IF(NOT HAVE_PTHREAD_H)
160 MESSAGE(FATAL_ERROR "PThreads is required for non-Windows builds!")
163 # Some systems need pthread_np.h to get recursive mutexes
164 CHECK_INCLUDE_FILES("pthread.h;pthread_np.h" HAVE_PTHREAD_NP_H)
166 # _GNU_SOURCE is needed on some systems for extra attributes, and
167 # _REENTRANT is needed for libc thread-safety
168 ADD_DEFINITIONS(-D_GNU_SOURCE=1 -D_REENTRANT)
169 CHECK_LIBRARY_EXISTS(pthread pthread_create "" HAVE_LIBPTHREAD)
171 SET(EXTRA_LIBS pthread ${EXTRA_LIBS})
175 # Check for a 64-bit type
176 CHECK_INCLUDE_FILE(stdint.h HAVE_STDINT_H)
177 IF(NOT HAVE_STDINT_H)
179 CHECK_C_SOURCE_COMPILES("\#define _WIN32_WINNT 0x0500
180 \#include <windows.h>
182 int main() {return 0;}" HAVE___INT64)
185 IF(NOT SIZEOF_LONG MATCHES "8")
186 IF(NOT SIZEOF_LONG_LONG MATCHES "8")
187 MESSAGE(FATAL_ERROR "No 64-bit types found, please report!")
194 SET(OPENAL_OBJS OpenAL32/alAuxEffectSlot.c
198 OpenAL32/alExtension.c
200 OpenAL32/alListener.c
206 SET(ALC_OBJS Alc/ALc.c
219 CHECK_INCLUDE_FILE(alsa/asoundlib.h HAVE_ALSA_ASOUNDLIB_H)
220 IF(HAVE_ALSA_ASOUNDLIB_H)
221 CHECK_LIBRARY_EXISTS(asound snd_pcm_open "" HAVE_LIBASOUND)
222 IF(HAVE_DLFCN_H OR HAVE_LIBASOUND)
224 SET(ALC_OBJS ${ALC_OBJS} Alc/alsa.c)
226 SET(BACKENDS "${BACKENDS} ALSA,")
228 SET(BACKENDS "${BACKENDS} ALSA \(linked\),")
229 SET(EXTRA_LIBS asound ${EXTRA_LIBS})
237 CHECK_INCLUDE_FILE(sys/soundcard.h HAVE_SYS_SOUNDCARD_H)
238 IF(HAVE_SYS_SOUNDCARD_H)
240 SET(ALC_OBJS ${ALC_OBJS} Alc/oss.c)
241 SET(BACKENDS "${BACKENDS} OSS,")
245 # Check DSound/MMSystem backend
248 CHECK_INCLUDE_FILE(dsound.h HAVE_DSOUND_H)
251 SET(ALC_OBJS ${ALC_OBJS} Alc/dsound.c)
252 SET(BACKENDS "${BACKENDS} DirectSound,")
254 SET(CMAKE_REQUIRED_LIBRARIES dsound)
255 CHECK_C_SOURCE_COMPILES("int main() {return 0;}" HAVE_LIBDSOUND)
256 SET(CMAKE_REQUIRED_LIBRARIES "")
257 # CHECK_LIBRARY_EXISTS(dsound DirectSoundCreate "" HAVE_LIBDSOUND)
259 SET(EXTRA_LIBS dsound ${EXTRA_LIBS})
264 CHECK_INCLUDE_FILES("windows.h;mmsystem.h" HAVE_MMSYSTEM_H -D_WIN32_WINNT=0x0500)
267 SET(ALC_OBJS ${ALC_OBJS} Alc/winmm.c)
268 SET(BACKENDS "${BACKENDS} WinMM,")
270 SET(CMAKE_REQUIRED_LIBRARIES winmm)
271 CHECK_C_SOURCE_COMPILES("int main() {return 0;}" HAVE_LIBWINMM)
272 SET(CMAKE_REQUIRED_LIBRARIES "")
273 # CHECK_LIBRARY_EXISTS(winmm waveInOpen "" HAVE_LIBWINMM)
275 SET(EXTRA_LIBS winmm ${EXTRA_LIBS})
281 # This is always available
282 SET(BACKENDS "${BACKENDS} WaveFile")
286 "${OpenAL_SOURCE_DIR}/config.h.in"
287 "${OpenAL_BINARY_DIR}/config.h")
289 ADD_DEFINITIONS(-DAL_BUILD_LIBRARY)
291 # Build a shared library
293 SET(LIBNAME openal32)
298 ADD_LIBRARY(${LIBNAME} SHARED ${OPENAL_OBJS} ${ALC_OBJS})
299 SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES VERSION ${LIB_VERSION}
300 SOVERSION ${LIB_MAJOR_VERSION})
302 SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES PREFIX "")
305 TARGET_LINK_LIBRARIES(${LIBNAME} ${EXTRA_LIBS})
307 # Add an install target here
308 INSTALL(TARGETS ${LIBNAME}
309 RUNTIME DESTINATION bin
310 LIBRARY DESTINATION lib
311 ARCHIVE DESTINATION lib
313 INSTALL(FILES include/AL/al.h
316 DESTINATION include/AL
320 MESSAGE(STATUS "Building OpenAL with support for the following backends:")
321 MESSAGE(STATUS " ${BACKENDS}")