1 # CMake build file list for OpenAL
3 CMAKE_MINIMUM_REQUIRED(VERSION 2.4)
5 IF(COMMAND CMAKE_POLICY)
6 CMAKE_POLICY(SET CMP0003 NEW)
7 ENDIF(COMMAND CMAKE_POLICY)
9 INCLUDE(CheckFunctionExists)
10 INCLUDE(CheckLibraryExists)
11 INCLUDE(CheckIncludeFile)
12 INCLUDE(CheckIncludeFiles)
13 INCLUDE(CheckCCompilerFlag)
14 INCLUDE(CheckCSourceCompiles)
15 INCLUDE(CheckTypeSize)
21 SET(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS TRUE)
24 OPTION(ALSA "Check for ALSA backend" ON)
25 OPTION(OSS "Check for OSS backend" ON)
26 OPTION(DSOUND "Check for DirectSound backend" ON)
27 OPTION(WINMM "Check for Windows Multimedia backend" ON)
29 OPTION(DLOPEN "Check for the dlopen API for loading optional libs" ON)
31 OPTION(WERROR "Treat compile warnings as errors" OFF)
33 OPTION(EXAMPLES "Build example programs" ON)
36 SET(LIB_MAJOR_VERSION "1")
37 SET(LIB_MINOR_VERSION "4")
38 SET(LIB_BUILD_VERSION "272")
39 SET(LIB_VERSION "${LIB_MAJOR_VERSION}.${LIB_MINOR_VERSION}.${LIB_BUILD_VERSION}")
40 IF(NOT DEFINED LIB_INSTALL_DIR)
41 SET(LIB_INSTALL_DIR "lib")
42 ENDIF(NOT DEFINED LIB_INSTALL_DIR)
45 CHECK_TYPE_SIZE("long" SIZEOF_LONG)
46 CHECK_TYPE_SIZE("long long" SIZEOF_LONG_LONG)
47 CHECK_TYPE_SIZE("unsigned int" SIZEOF_UINT)
48 CHECK_TYPE_SIZE("void*" SIZEOF_VOIDP)
51 # Add definitions, compiler switches, etc.
52 INCLUDE_DIRECTORIES(OpenAL32/Include include "${OpenAL_BINARY_DIR}")
54 IF(NOT CMAKE_BUILD_TYPE)
55 SET(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING
56 "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel."
62 SET(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -D_DEBUG")
63 SET(CMAKE_C_FLAGS_MINSIZEREL "${CMAKE_C_FLAGS_MINSIZEREL} -DNDEBUG")
64 SET(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -DNDEBUG")
65 SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -D_DEBUG")
67 ADD_DEFINITIONS(-Wall)
68 CHECK_C_COMPILER_FLAG(-Wextra HAVE_W_EXTRA)
70 ADD_DEFINITIONS(-Wextra)
74 ADD_DEFINITIONS(-Werror)
77 SET(CMAKE_C_FLAGS_RELWITHDEBINFO "-g -O2 -funroll-loops -D_DEBUG" CACHE STRING
78 "Flags used by the compiler during Release with Debug Info builds."
80 SET(CMAKE_C_FLAGS_MINSIZEREL "-Os -DNDEBUG" CACHE STRING
81 "Flags used by the compiler during release minsize builds."
83 SET(CMAKE_C_FLAGS_RELEASE "-O2 -funroll-loops -fomit-frame-pointer -DNDEBUG" CACHE STRING
84 "Flags used by the compiler during release builds"
86 SET(CMAKE_C_FLAGS_DEBUG "-g3 -D_DEBUG" CACHE STRING
87 "Flags used by the compiler during debug builds."
90 # Set visibility options if available
92 CHECK_C_SOURCE_COMPILES("int foo() __attribute__((destructor));
93 int main() {return 0;}" HAVE_GCC_DESTRUCTOR)
95 CHECK_C_COMPILER_FLAG(-fvisibility=hidden HAVE_VISIBILITY_SWITCH)
96 IF("${HAVE_VISIBILITY_SWITCH}")
97 CHECK_C_SOURCE_COMPILES("int foo() __attribute__((visibility(\"default\")));
98 int main() {return 0;}" HAVE_GCC_VISIBILITY)
99 IF("${HAVE_GCC_VISIBILITY}")
100 ADD_DEFINITIONS(-fvisibility=hidden -DHAVE_GCC_VISIBILITY)
107 CHECK_LIBRARY_EXISTS(m sqrtf "" HAVE_SQRTF)
108 CHECK_LIBRARY_EXISTS(m acosf "" HAVE_ACOSF)
109 IF(HAVE_SQRTF OR HAVE_ACOSF)
110 SET(EXTRA_LIBS m ${EXTRA_LIBS})
112 CHECK_FUNCTION_EXISTS(strtof HAVE_STRTOF)
114 CHECK_FUNCTION_EXISTS(strcasecmp HAVE_STRCASECMP)
115 IF(NOT HAVE_STRCASECMP)
116 CHECK_FUNCTION_EXISTS(_stricmp HAVE__STRICMP)
117 IF(NOT HAVE__STRICMP)
118 MESSAGE(FATAL_ERROR "No case-insensitive compare function found, please report!")
121 ADD_DEFINITIONS(-Dstrcasecmp=_stricmp)
124 CHECK_FUNCTION_EXISTS(strncasecmp HAVE_STRNCASECMP)
125 IF(NOT HAVE_STRNCASECMP)
126 CHECK_FUNCTION_EXISTS(_strnicmp HAVE__STRNICMP)
127 IF(NOT HAVE__STRNICMP)
128 MESSAGE(FATAL_ERROR "No case-insensitive size-limitted compare function found, please report!")
131 ADD_DEFINITIONS(-Dstrncasecmp=_strnicmp)
134 CHECK_FUNCTION_EXISTS(snprintf HAVE_SNPRINTF)
135 IF(NOT HAVE_SNPRINTF)
136 CHECK_FUNCTION_EXISTS(_snprintf HAVE__SNPRINTF)
137 IF(NOT HAVE__SNPRINTF)
138 MESSAGE(FATAL_ERROR "No snprintf function found, please report!")
141 ADD_DEFINITIONS(-Dsnprintf=_snprintf)
144 # Check for the dlopen API (for dynamicly loading backend libs)
146 CHECK_INCLUDE_FILE(dlfcn.h HAVE_DLFCN_H)
148 CHECK_LIBRARY_EXISTS(dl dlopen "" HAVE_LIBDL)
150 SET(EXTRA_LIBS dl ${EXTRA_LIBS})
155 # Check if we have Windows headers
156 CHECK_INCLUDE_FILE(windows.h HAVE_WINDOWS_H -D_WIN32_WINNT=0x0500)
157 IF(NOT HAVE_WINDOWS_H)
158 CHECK_FUNCTION_EXISTS(gettimeofday HAVE_GETTIMEOFDAY)
159 IF(NOT HAVE_GETTIMEOFDAY)
160 MESSAGE(FATAL_ERROR "No timing function found!")
163 CHECK_FUNCTION_EXISTS(nanosleep HAVE_NANOSLEEP)
164 IF(NOT HAVE_NANOSLEEP)
165 MESSAGE(FATAL_ERROR "No sleep function found!")
168 # We need pthreads outside of Windows
169 CHECK_INCLUDE_FILE(pthread.h HAVE_PTHREAD_H)
170 IF(NOT HAVE_PTHREAD_H)
171 MESSAGE(FATAL_ERROR "PThreads is required for non-Windows builds!")
174 # Some systems need pthread_np.h to get recursive mutexes
175 CHECK_INCLUDE_FILES("pthread.h;pthread_np.h" HAVE_PTHREAD_NP_H)
177 # _GNU_SOURCE is needed on some systems for extra attributes, and
178 # _REENTRANT is needed for libc thread-safety
179 ADD_DEFINITIONS(-D_GNU_SOURCE=1 -D_REENTRANT)
180 CHECK_LIBRARY_EXISTS(pthread pthread_create "" HAVE_LIBPTHREAD)
182 SET(EXTRA_LIBS pthread ${EXTRA_LIBS})
186 # Check for a 64-bit type
187 CHECK_INCLUDE_FILE(stdint.h HAVE_STDINT_H)
188 IF(NOT HAVE_STDINT_H)
190 CHECK_C_SOURCE_COMPILES("\#define _WIN32_WINNT 0x0500
191 \#include <windows.h>
193 int main() {return 0;}" HAVE___INT64)
196 IF(NOT SIZEOF_LONG MATCHES "8")
197 IF(NOT SIZEOF_LONG_LONG MATCHES "8")
198 MESSAGE(FATAL_ERROR "No 64-bit types found, please report!")
205 SET(OPENAL_OBJS OpenAL32/alAuxEffectSlot.c
209 OpenAL32/alExtension.c
211 OpenAL32/alListener.c
216 SET(ALC_OBJS Alc/ALc.c
229 CHECK_INCLUDE_FILE(alsa/asoundlib.h HAVE_ALSA_ASOUNDLIB_H)
230 IF(HAVE_ALSA_ASOUNDLIB_H)
231 CHECK_LIBRARY_EXISTS(asound snd_pcm_open "" HAVE_LIBASOUND)
232 IF(HAVE_DLFCN_H OR HAVE_LIBASOUND)
234 SET(ALC_OBJS ${ALC_OBJS} Alc/alsa.c)
236 SET(BACKENDS "${BACKENDS} ALSA,")
238 SET(BACKENDS "${BACKENDS} ALSA \(linked\),")
239 SET(EXTRA_LIBS asound ${EXTRA_LIBS})
247 CHECK_INCLUDE_FILE(sys/soundcard.h HAVE_SYS_SOUNDCARD_H)
248 IF(HAVE_SYS_SOUNDCARD_H)
250 SET(ALC_OBJS ${ALC_OBJS} Alc/oss.c)
251 SET(BACKENDS "${BACKENDS} OSS,")
255 # Check DSound/MMSystem backend
258 CHECK_INCLUDE_FILE(dsound.h HAVE_DSOUND_H)
261 SET(ALC_OBJS ${ALC_OBJS} Alc/dsound.c)
262 SET(BACKENDS "${BACKENDS} DirectSound,")
264 SET(CMAKE_REQUIRED_LIBRARIES dsound)
265 CHECK_C_SOURCE_COMPILES("int main() {return 0;}" HAVE_LIBDSOUND)
266 SET(CMAKE_REQUIRED_LIBRARIES "")
267 # CHECK_LIBRARY_EXISTS(dsound DirectSoundCreate "" HAVE_LIBDSOUND)
269 SET(EXTRA_LIBS dsound ${EXTRA_LIBS})
274 CHECK_INCLUDE_FILES("windows.h;mmsystem.h" HAVE_MMSYSTEM_H -D_WIN32_WINNT=0x0500)
277 SET(ALC_OBJS ${ALC_OBJS} Alc/winmm.c)
278 SET(BACKENDS "${BACKENDS} WinMM,")
280 SET(CMAKE_REQUIRED_LIBRARIES winmm)
281 CHECK_C_SOURCE_COMPILES("int main() {return 0;}" HAVE_LIBWINMM)
282 SET(CMAKE_REQUIRED_LIBRARIES "")
283 # CHECK_LIBRARY_EXISTS(winmm waveInOpen "" HAVE_LIBWINMM)
285 SET(EXTRA_LIBS winmm ${EXTRA_LIBS})
291 # This is always available
292 SET(BACKENDS "${BACKENDS} WaveFile")
296 "${OpenAL_SOURCE_DIR}/config.h.in"
297 "${OpenAL_BINARY_DIR}/config.h")
299 ADD_DEFINITIONS(-DAL_BUILD_LIBRARY)
301 # Build a shared library
303 SET(LIBNAME openal32)
308 ADD_LIBRARY(${LIBNAME} SHARED ${OPENAL_OBJS} ${ALC_OBJS})
309 SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES VERSION ${LIB_VERSION}
310 SOVERSION ${LIB_MAJOR_VERSION})
312 SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES PREFIX "")
315 TARGET_LINK_LIBRARIES(${LIBNAME} ${EXTRA_LIBS})
317 # Add an install target here
318 INSTALL(TARGETS ${LIBNAME}
319 RUNTIME DESTINATION bin
320 LIBRARY DESTINATION ${LIB_INSTALL_DIR}
321 ARCHIVE DESTINATION ${LIB_INSTALL_DIR}
323 INSTALL(FILES include/AL/al.h
326 DESTINATION include/AL
330 ADD_EXECUTABLE(openal-info examples/openal-info.c)
331 TARGET_LINK_LIBRARIES(openal-info ${LIBNAME})
332 INSTALL(TARGETS openal-info
333 RUNTIME DESTINATION bin
334 LIBRARY DESTINATION ${LIB_INSTALL_DIR}
335 ARCHIVE DESTINATION ${LIB_INSTALL_DIR}
340 MESSAGE(STATUS "Building OpenAL with support for the following backends:")
341 MESSAGE(STATUS " ${BACKENDS}")