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(SOLARIS "Check for Solaris backend" ON)
27 OPTION(DSOUND "Check for DirectSound backend" ON)
28 OPTION(WINMM "Check for Windows Multimedia backend" ON)
30 OPTION(DLOPEN "Check for the dlopen API for loading optional libs" ON)
32 OPTION(WERROR "Treat compile warnings as errors" OFF)
34 OPTION(EXAMPLES "Build example programs" ON)
43 SET(LIB_MAJOR_VERSION "1")
44 SET(LIB_MINOR_VERSION "5")
45 SET(LIB_BUILD_VERSION "304")
46 SET(LIB_VERSION "${LIB_MAJOR_VERSION}.${LIB_MINOR_VERSION}.${LIB_BUILD_VERSION}")
47 IF(NOT DEFINED LIB_INSTALL_DIR)
48 SET(LIB_INSTALL_DIR "lib")
49 ENDIF(NOT DEFINED LIB_INSTALL_DIR)
52 CHECK_TYPE_SIZE("long" SIZEOF_LONG)
53 CHECK_TYPE_SIZE("long long" SIZEOF_LONG_LONG)
54 CHECK_TYPE_SIZE("unsigned int" SIZEOF_UINT)
55 CHECK_TYPE_SIZE("void*" SIZEOF_VOIDP)
58 # Add definitions, compiler switches, etc.
59 INCLUDE_DIRECTORIES(OpenAL32/Include include "${OpenAL_BINARY_DIR}")
61 IF(NOT CMAKE_BUILD_TYPE)
62 SET(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING
63 "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel."
69 SET(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -D_DEBUG")
70 SET(CMAKE_C_FLAGS_MINSIZEREL "${CMAKE_C_FLAGS_MINSIZEREL} -DNDEBUG")
71 SET(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -DNDEBUG")
72 SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -D_DEBUG")
74 ADD_DEFINITIONS(-Wall)
75 CHECK_C_COMPILER_FLAG(-Wextra HAVE_W_EXTRA)
77 ADD_DEFINITIONS(-Wextra)
81 ADD_DEFINITIONS(-Werror)
84 SET(CMAKE_C_FLAGS_RELWITHDEBINFO "-g -O2 -funroll-loops -D_DEBUG" CACHE STRING
85 "Flags used by the compiler during Release with Debug Info builds."
87 SET(CMAKE_C_FLAGS_MINSIZEREL "-Os -DNDEBUG" CACHE STRING
88 "Flags used by the compiler during release minsize builds."
90 SET(CMAKE_C_FLAGS_RELEASE "-O2 -funroll-loops -fomit-frame-pointer -DNDEBUG" CACHE STRING
91 "Flags used by the compiler during release builds"
93 SET(CMAKE_C_FLAGS_DEBUG "-g3 -D_DEBUG" CACHE STRING
94 "Flags used by the compiler during debug builds."
97 # Set visibility options if available
99 CHECK_C_SOURCE_COMPILES("int foo() __attribute__((destructor));
100 int main() {return 0;}" HAVE_GCC_DESTRUCTOR)
102 CHECK_C_COMPILER_FLAG(-fvisibility=hidden HAVE_VISIBILITY_SWITCH)
103 IF("${HAVE_VISIBILITY_SWITCH}")
104 CHECK_C_SOURCE_COMPILES("int foo() __attribute__((visibility(\"default\")));
105 int main() {return 0;}" HAVE_GCC_VISIBILITY)
106 IF("${HAVE_GCC_VISIBILITY}")
107 ADD_DEFINITIONS(-fvisibility=hidden -DHAVE_GCC_VISIBILITY)
113 CHECK_INCLUDE_FILE(fenv.h HAVE_FENV_H)
115 CHECK_LIBRARY_EXISTS(m sqrtf "" HAVE_SQRTF)
116 CHECK_LIBRARY_EXISTS(m acosf "" HAVE_ACOSF)
118 CHECK_LIBRARY_EXISTS(m fesetround "" HAVE_FESETROUND)
120 IF(HAVE_SQRTF OR HAVE_ACOSF OR HAVE_FESETROUND)
121 SET(EXTRA_LIBS m ${EXTRA_LIBS})
123 CHECK_FUNCTION_EXISTS(strtof HAVE_STRTOF)
124 CHECK_FUNCTION_EXISTS(_controlfp HAVE__CONTROLFP)
126 CHECK_FUNCTION_EXISTS(strcasecmp HAVE_STRCASECMP)
127 IF(NOT HAVE_STRCASECMP)
128 CHECK_FUNCTION_EXISTS(_stricmp HAVE__STRICMP)
129 IF(NOT HAVE__STRICMP)
130 MESSAGE(FATAL_ERROR "No case-insensitive compare function found, please report!")
133 ADD_DEFINITIONS(-Dstrcasecmp=_stricmp)
136 CHECK_FUNCTION_EXISTS(strncasecmp HAVE_STRNCASECMP)
137 IF(NOT HAVE_STRNCASECMP)
138 CHECK_FUNCTION_EXISTS(_strnicmp HAVE__STRNICMP)
139 IF(NOT HAVE__STRNICMP)
140 MESSAGE(FATAL_ERROR "No case-insensitive size-limitted compare function found, please report!")
143 ADD_DEFINITIONS(-Dstrncasecmp=_strnicmp)
146 CHECK_FUNCTION_EXISTS(snprintf HAVE_SNPRINTF)
147 IF(NOT HAVE_SNPRINTF)
148 CHECK_FUNCTION_EXISTS(_snprintf HAVE__SNPRINTF)
149 IF(NOT HAVE__SNPRINTF)
150 MESSAGE(FATAL_ERROR "No snprintf function found, please report!")
153 ADD_DEFINITIONS(-Dsnprintf=_snprintf)
156 # Check for the dlopen API (for dynamicly loading backend libs)
158 CHECK_INCLUDE_FILE(dlfcn.h HAVE_DLFCN_H)
160 CHECK_LIBRARY_EXISTS(dl dlopen "" HAVE_LIBDL)
162 SET(EXTRA_LIBS dl ${EXTRA_LIBS})
167 # Check if we have Windows headers
168 CHECK_INCLUDE_FILE(windows.h HAVE_WINDOWS_H -D_WIN32_WINNT=0x0500)
169 IF(NOT HAVE_WINDOWS_H)
170 CHECK_FUNCTION_EXISTS(gettimeofday HAVE_GETTIMEOFDAY)
171 IF(NOT HAVE_GETTIMEOFDAY)
172 MESSAGE(FATAL_ERROR "No timing function found!")
175 CHECK_FUNCTION_EXISTS(nanosleep HAVE_NANOSLEEP)
176 IF(NOT HAVE_NANOSLEEP)
177 MESSAGE(FATAL_ERROR "No sleep function found!")
180 # We need pthreads outside of Windows
181 CHECK_INCLUDE_FILE(pthread.h HAVE_PTHREAD_H)
182 IF(NOT HAVE_PTHREAD_H)
183 MESSAGE(FATAL_ERROR "PThreads is required for non-Windows builds!")
186 # Some systems need pthread_np.h to get recursive mutexes
187 CHECK_INCLUDE_FILES("pthread.h;pthread_np.h" HAVE_PTHREAD_NP_H)
189 # _GNU_SOURCE is needed on some systems for extra attributes, and
190 # _REENTRANT is needed for libc thread-safety
191 ADD_DEFINITIONS(-D_GNU_SOURCE=1 -D_REENTRANT)
192 CHECK_LIBRARY_EXISTS(pthread pthread_create "" HAVE_LIBPTHREAD)
194 SET(EXTRA_LIBS pthread ${EXTRA_LIBS})
198 # Check for a 64-bit type
199 CHECK_INCLUDE_FILE(stdint.h HAVE_STDINT_H)
200 IF(NOT HAVE_STDINT_H)
202 CHECK_C_SOURCE_COMPILES("\#define _WIN32_WINNT 0x0500
203 \#include <windows.h>
205 int main() {return 0;}" HAVE___INT64)
208 IF(NOT SIZEOF_LONG MATCHES "8")
209 IF(NOT SIZEOF_LONG_LONG MATCHES "8")
210 MESSAGE(FATAL_ERROR "No 64-bit types found, please report!")
217 SET(OPENAL_OBJS OpenAL32/alAuxEffectSlot.c
221 OpenAL32/alExtension.c
223 OpenAL32/alListener.c
228 SET(ALC_OBJS Alc/ALc.c
241 CHECK_INCLUDE_FILE(alsa/asoundlib.h HAVE_ALSA_ASOUNDLIB_H)
242 IF(HAVE_ALSA_ASOUNDLIB_H)
243 CHECK_LIBRARY_EXISTS(asound snd_pcm_open "" HAVE_LIBASOUND)
244 IF(HAVE_DLFCN_H OR HAVE_LIBASOUND)
246 SET(ALC_OBJS ${ALC_OBJS} Alc/alsa.c)
248 SET(BACKENDS "${BACKENDS} ALSA,")
250 SET(BACKENDS "${BACKENDS} ALSA \(linked\),")
251 SET(EXTRA_LIBS asound ${EXTRA_LIBS})
259 CHECK_INCLUDE_FILE(sys/soundcard.h HAVE_SYS_SOUNDCARD_H)
260 IF(HAVE_SYS_SOUNDCARD_H)
262 SET(ALC_OBJS ${ALC_OBJS} Alc/oss.c)
263 SET(BACKENDS "${BACKENDS} OSS,")
267 # Check Solaris backend
269 CHECK_INCLUDE_FILE(sys/audioio.h HAVE_SYS_AUDIOIO_H)
270 IF(HAVE_SYS_AUDIOIO_H)
272 SET(ALC_OBJS ${ALC_OBJS} Alc/solaris.c)
273 SET(BACKENDS "${BACKENDS} Solaris,")
277 # Check DSound/MMSystem backend
280 CHECK_INCLUDE_FILE(dsound.h HAVE_DSOUND_H)
283 SET(ALC_OBJS ${ALC_OBJS} Alc/dsound.c)
284 SET(BACKENDS "${BACKENDS} DirectSound,")
286 SET(CMAKE_REQUIRED_LIBRARIES dsound)
287 CHECK_C_SOURCE_COMPILES("int main() {return 0;}" HAVE_LIBDSOUND)
288 SET(CMAKE_REQUIRED_LIBRARIES "")
289 # CHECK_LIBRARY_EXISTS(dsound DirectSoundCreate "" HAVE_LIBDSOUND)
291 SET(EXTRA_LIBS dsound ${EXTRA_LIBS})
296 CHECK_INCLUDE_FILES("windows.h;mmsystem.h" HAVE_MMSYSTEM_H -D_WIN32_WINNT=0x0500)
299 SET(ALC_OBJS ${ALC_OBJS} Alc/winmm.c)
300 SET(BACKENDS "${BACKENDS} WinMM,")
302 SET(CMAKE_REQUIRED_LIBRARIES winmm)
303 CHECK_C_SOURCE_COMPILES("int main() {return 0;}" HAVE_LIBWINMM)
304 SET(CMAKE_REQUIRED_LIBRARIES "")
305 # CHECK_LIBRARY_EXISTS(winmm waveInOpen "" HAVE_LIBWINMM)
307 SET(EXTRA_LIBS winmm ${EXTRA_LIBS})
313 # This is always available
314 SET(BACKENDS "${BACKENDS} WaveFile")
316 # Needed for openal.pc.in
317 SET(prefix ${CMAKE_INSTALL_PREFIX})
318 SET(exec_prefix "\${prefix}")
319 SET(libdir "\${exec_prefix}/${LIB_INSTALL_DIR}")
320 SET(bindir "\${exec_prefix}/bin")
321 SET(includedir "\${prefix}/include")
322 SET(PACKAGE_VERSION "${LIB_VERSION}")
326 "${OpenAL_SOURCE_DIR}/config.h.in"
327 "${OpenAL_BINARY_DIR}/config.h")
329 "${OpenAL_SOURCE_DIR}/admin/pkgconfig/openal.pc.in"
330 "${OpenAL_BINARY_DIR}/admin/pkgconfig/openal.pc"
333 ADD_DEFINITIONS(-DAL_BUILD_LIBRARY)
339 ADD_LIBRARY(${LIBNAME} ${LIBTYPE} ${OPENAL_OBJS} ${ALC_OBJS})
340 SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES VERSION ${LIB_VERSION}
341 SOVERSION ${LIB_MAJOR_VERSION})
343 SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES PREFIX "")
346 TARGET_LINK_LIBRARIES(${LIBNAME} ${EXTRA_LIBS})
348 # Add an install target here
349 INSTALL(TARGETS ${LIBNAME}
350 RUNTIME DESTINATION bin
351 LIBRARY DESTINATION ${LIB_INSTALL_DIR}
352 ARCHIVE DESTINATION ${LIB_INSTALL_DIR}
354 INSTALL(FILES include/AL/al.h
357 DESTINATION include/AL
359 INSTALL(FILES "${OpenAL_BINARY_DIR}/admin/pkgconfig/openal.pc"
360 DESTINATION lib/pkgconfig)
363 ADD_EXECUTABLE(openal-info examples/openal-info.c)
364 TARGET_LINK_LIBRARIES(openal-info ${LIBNAME})
365 INSTALL(TARGETS openal-info
366 RUNTIME DESTINATION bin
367 LIBRARY DESTINATION ${LIB_INSTALL_DIR}
368 ARCHIVE DESTINATION ${LIB_INSTALL_DIR}
373 MESSAGE(STATUS "Building OpenAL with support for the following backends:")
374 MESSAGE(STATUS " ${BACKENDS}")
377 IF(WIN32 AND NOT HAVE_DSOUND)
378 MESSAGE(STATUS "WARNING: Building the Windows version without DirectSound output")
379 MESSAGE(STATUS " This is probably NOT what you want!")