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 # _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("\#define _WIN32_WINNT 0x0500
184 \#include <windows.h>
186 int main() {return 0;}" HAVE___INT64)
189 IF(NOT SIZEOF_LONG MATCHES "8")
190 IF(NOT SIZEOF_LONG_LONG MATCHES "8")
191 MESSAGE(FATAL_ERROR "No 64-bit types found, please report!")
198 SET(OPENAL_OBJS OpenAL32/alAuxEffectSlot.c
202 OpenAL32/alExtension.c
204 OpenAL32/alListener.c
210 SET(ALC_OBJS Alc/ALc.c
223 CHECK_INCLUDE_FILE(alsa/asoundlib.h HAVE_ALSA_ASOUNDLIB_H)
224 IF(HAVE_ALSA_ASOUNDLIB_H)
225 CHECK_LIBRARY_EXISTS(asound snd_pcm_open "" HAVE_LIBASOUND)
226 IF(HAVE_DLFCN_H OR HAVE_LIBASOUND)
228 SET(ALC_OBJS ${ALC_OBJS} Alc/alsa.c)
230 SET(BACKENDS "${BACKENDS} ALSA,")
232 SET(BACKENDS "${BACKENDS} ALSA \(linked\),")
233 SET(EXTRA_LIBS asound ${EXTRA_LIBS})
241 CHECK_INCLUDE_FILE(sys/soundcard.h HAVE_SYS_SOUNDCARD_H)
242 IF(HAVE_SYS_SOUNDCARD_H)
244 SET(ALC_OBJS ${ALC_OBJS} Alc/oss.c)
245 SET(BACKENDS "${BACKENDS} OSS,")
249 # Check DSound/MMSystem backend
252 CHECK_INCLUDE_FILE(dsound.h HAVE_DSOUND_H)
255 SET(ALC_OBJS ${ALC_OBJS} Alc/dsound.c)
256 SET(BACKENDS "${BACKENDS} DirectSound,")
258 SET(CMAKE_REQUIRED_LIBRARIES dsound)
259 CHECK_C_SOURCE_COMPILES("int main() {return 0;}" HAVE_LIBDSOUND)
260 SET(CMAKE_REQUIRED_LIBRARIES "")
261 # CHECK_LIBRARY_EXISTS(dsound DirectSoundCreate "" HAVE_LIBDSOUND)
263 SET(EXTRA_LIBS dsound ${EXTRA_LIBS})
268 CHECK_INCLUDE_FILES("windows.h;mmsystem.h" HAVE_MMSYSTEM_H -D_WIN32_WINNT=0x0500)
271 SET(ALC_OBJS ${ALC_OBJS} Alc/winmm.c)
272 SET(BACKENDS "${BACKENDS} WinMM,")
274 SET(CMAKE_REQUIRED_LIBRARIES winmm)
275 CHECK_C_SOURCE_COMPILES("int main() {return 0;}" HAVE_LIBWINMM)
276 SET(CMAKE_REQUIRED_LIBRARIES "")
277 # CHECK_LIBRARY_EXISTS(winmm waveInOpen "" HAVE_LIBWINMM)
279 SET(EXTRA_LIBS winmm ${EXTRA_LIBS})
285 # This is always available
286 SET(BACKENDS "${BACKENDS} WaveFile")
290 "${OpenAL_SOURCE_DIR}/config.h.in"
291 "${OpenAL_BINARY_DIR}/config.h")
293 ADD_DEFINITIONS(-DAL_BUILD_LIBRARY)
295 # Build a shared library
297 SET(LIBNAME openal32)
302 ADD_LIBRARY(${LIBNAME} SHARED ${OPENAL_OBJS} ${ALC_OBJS})
303 SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES VERSION ${LIB_VERSION}
304 SOVERSION ${LIB_MAJOR_VERSION})
306 SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES PREFIX "")
309 TARGET_LINK_LIBRARIES(${LIBNAME} ${EXTRA_LIBS})
311 # Add an install target here
312 INSTALL(TARGETS ${LIBNAME}
313 RUNTIME DESTINATION bin
314 LIBRARY DESTINATION lib
315 ARCHIVE DESTINATION lib
317 INSTALL(FILES include/AL/al.h
320 DESTINATION include/AL
324 MESSAGE(STATUS "Building OpenAL with support for the following backends:")
325 MESSAGE(STATUS " ${BACKENDS}")