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)
36 OPTION(XCOMPILEWIN32 "Cross-compile to Win32" OFF)
39 IF(WIN32 OR XCOMPILEWIN32)
41 ADD_DEFINITIONS("-D_WIN32")
46 SET(LIB_MAJOR_VERSION "1")
47 SET(LIB_MINOR_VERSION "5")
48 SET(LIB_BUILD_VERSION "304")
49 SET(LIB_VERSION "${LIB_MAJOR_VERSION}.${LIB_MINOR_VERSION}.${LIB_BUILD_VERSION}")
50 IF(NOT DEFINED LIB_INSTALL_DIR)
51 SET(LIB_INSTALL_DIR "lib")
52 ENDIF(NOT DEFINED LIB_INSTALL_DIR)
55 CHECK_TYPE_SIZE("long" SIZEOF_LONG)
56 CHECK_TYPE_SIZE("long long" SIZEOF_LONG_LONG)
57 CHECK_TYPE_SIZE("unsigned int" SIZEOF_UINT)
58 CHECK_TYPE_SIZE("void*" SIZEOF_VOIDP)
61 # Add definitions, compiler switches, etc.
62 INCLUDE_DIRECTORIES(OpenAL32/Include include "${OpenAL_BINARY_DIR}")
64 IF(NOT CMAKE_BUILD_TYPE)
65 SET(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING
66 "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel."
72 SET(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -D_DEBUG")
73 SET(CMAKE_C_FLAGS_MINSIZEREL "${CMAKE_C_FLAGS_MINSIZEREL} -DNDEBUG")
74 SET(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -DNDEBUG")
75 SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -D_DEBUG")
77 ADD_DEFINITIONS(-Wall)
78 CHECK_C_COMPILER_FLAG(-Wextra HAVE_W_EXTRA)
80 ADD_DEFINITIONS(-Wextra)
84 ADD_DEFINITIONS(-Werror)
87 SET(CMAKE_C_FLAGS_RELWITHDEBINFO "-g -O2 -funroll-loops -D_DEBUG" CACHE STRING
88 "Flags used by the compiler during Release with Debug Info builds."
90 SET(CMAKE_C_FLAGS_MINSIZEREL "-Os -DNDEBUG" CACHE STRING
91 "Flags used by the compiler during release minsize builds."
93 SET(CMAKE_C_FLAGS_RELEASE "-O2 -funroll-loops -fomit-frame-pointer -DNDEBUG" CACHE STRING
94 "Flags used by the compiler during release builds"
96 SET(CMAKE_C_FLAGS_DEBUG "-g3 -D_DEBUG" CACHE STRING
97 "Flags used by the compiler during debug builds."
100 # Set visibility options if available
101 IF(NOT WIN32 AND NOT XCOMPILEWIN32)
102 CHECK_C_SOURCE_COMPILES("int foo() __attribute__((destructor));
103 int main() {return 0;}" HAVE_GCC_DESTRUCTOR)
105 CHECK_C_COMPILER_FLAG(-fvisibility=hidden HAVE_VISIBILITY_SWITCH)
106 IF("${HAVE_VISIBILITY_SWITCH}")
107 CHECK_C_SOURCE_COMPILES("int foo() __attribute__((visibility(\"default\")));
108 int main() {return 0;}" HAVE_GCC_VISIBILITY)
109 IF("${HAVE_GCC_VISIBILITY}")
110 ADD_DEFINITIONS(-fvisibility=hidden -DHAVE_GCC_VISIBILITY)
116 CHECK_INCLUDE_FILE(fenv.h HAVE_FENV_H)
117 CHECK_INCLUDE_FILE(float.h HAVE_FLOAT_H)
119 CHECK_LIBRARY_EXISTS(m sqrtf "" HAVE_SQRTF)
120 CHECK_LIBRARY_EXISTS(m acosf "" HAVE_ACOSF)
122 CHECK_LIBRARY_EXISTS(m fesetround "" HAVE_FESETROUND)
124 IF(HAVE_SQRTF OR HAVE_ACOSF OR HAVE_FESETROUND)
125 SET(EXTRA_LIBS m ${EXTRA_LIBS})
127 CHECK_FUNCTION_EXISTS(strtof HAVE_STRTOF)
128 CHECK_FUNCTION_EXISTS(_controlfp HAVE__CONTROLFP)
130 CHECK_FUNCTION_EXISTS(strcasecmp HAVE_STRCASECMP)
131 IF(NOT HAVE_STRCASECMP)
132 CHECK_FUNCTION_EXISTS(_stricmp HAVE__STRICMP)
133 IF(NOT HAVE__STRICMP)
134 MESSAGE(FATAL_ERROR "No case-insensitive compare function found, please report!")
137 ADD_DEFINITIONS(-Dstrcasecmp=_stricmp)
140 CHECK_FUNCTION_EXISTS(strncasecmp HAVE_STRNCASECMP)
141 IF(NOT HAVE_STRNCASECMP)
142 CHECK_FUNCTION_EXISTS(_strnicmp HAVE__STRNICMP)
143 IF(NOT HAVE__STRNICMP)
144 MESSAGE(FATAL_ERROR "No case-insensitive size-limitted compare function found, please report!")
147 ADD_DEFINITIONS(-Dstrncasecmp=_strnicmp)
150 CHECK_FUNCTION_EXISTS(snprintf HAVE_SNPRINTF)
151 IF(NOT HAVE_SNPRINTF)
152 CHECK_FUNCTION_EXISTS(_snprintf HAVE__SNPRINTF)
153 IF(NOT HAVE__SNPRINTF)
154 MESSAGE(FATAL_ERROR "No snprintf function found, please report!")
157 ADD_DEFINITIONS(-Dsnprintf=_snprintf)
160 # Check for the dlopen API (for dynamicly loading backend libs)
162 CHECK_INCLUDE_FILE(dlfcn.h HAVE_DLFCN_H)
164 CHECK_LIBRARY_EXISTS(dl dlopen "" HAVE_LIBDL)
166 SET(EXTRA_LIBS dl ${EXTRA_LIBS})
171 # Check if we have Windows headers
172 CHECK_INCLUDE_FILE(windows.h HAVE_WINDOWS_H -D_WIN32_WINNT=0x0500)
173 IF(NOT HAVE_WINDOWS_H)
174 CHECK_FUNCTION_EXISTS(gettimeofday HAVE_GETTIMEOFDAY)
175 IF(NOT HAVE_GETTIMEOFDAY)
176 MESSAGE(FATAL_ERROR "No timing function found!")
179 CHECK_FUNCTION_EXISTS(nanosleep HAVE_NANOSLEEP)
180 IF(NOT HAVE_NANOSLEEP)
181 MESSAGE(FATAL_ERROR "No sleep function found!")
184 # We need pthreads outside of Windows
185 CHECK_INCLUDE_FILE(pthread.h HAVE_PTHREAD_H)
186 IF(NOT HAVE_PTHREAD_H)
187 MESSAGE(FATAL_ERROR "PThreads is required for non-Windows builds!")
190 # Some systems need pthread_np.h to get recursive mutexes
191 CHECK_INCLUDE_FILES("pthread.h;pthread_np.h" HAVE_PTHREAD_NP_H)
193 # _GNU_SOURCE is needed on some systems for extra attributes, and
194 # _REENTRANT is needed for libc thread-safety
195 ADD_DEFINITIONS(-D_GNU_SOURCE=1 -D_REENTRANT)
196 CHECK_LIBRARY_EXISTS(pthread pthread_create "" HAVE_LIBPTHREAD)
198 SET(EXTRA_LIBS pthread ${EXTRA_LIBS})
202 # Check for a 64-bit type
203 CHECK_INCLUDE_FILE(stdint.h HAVE_STDINT_H)
204 IF(NOT HAVE_STDINT_H)
206 CHECK_C_SOURCE_COMPILES("\#define _WIN32_WINNT 0x0500
207 \#include <windows.h>
209 int main() {return 0;}" HAVE___INT64)
212 IF(NOT SIZEOF_LONG MATCHES "8")
213 IF(NOT SIZEOF_LONG_LONG MATCHES "8")
214 MESSAGE(FATAL_ERROR "No 64-bit types found, please report!")
221 SET(OPENAL_OBJS OpenAL32/alAuxEffectSlot.c
225 OpenAL32/alExtension.c
227 OpenAL32/alListener.c
232 SET(ALC_OBJS Alc/ALc.c
245 CHECK_INCLUDE_FILE(alsa/asoundlib.h HAVE_ALSA_ASOUNDLIB_H)
246 IF(HAVE_ALSA_ASOUNDLIB_H)
247 CHECK_LIBRARY_EXISTS(asound snd_pcm_open "" HAVE_LIBASOUND)
248 IF(HAVE_DLFCN_H OR HAVE_LIBASOUND)
250 SET(ALC_OBJS ${ALC_OBJS} Alc/alsa.c)
252 SET(BACKENDS "${BACKENDS} ALSA,")
254 SET(BACKENDS "${BACKENDS} ALSA \(linked\),")
255 SET(EXTRA_LIBS asound ${EXTRA_LIBS})
263 CHECK_INCLUDE_FILE(sys/soundcard.h HAVE_SYS_SOUNDCARD_H)
264 IF(HAVE_SYS_SOUNDCARD_H)
266 SET(ALC_OBJS ${ALC_OBJS} Alc/oss.c)
267 SET(BACKENDS "${BACKENDS} OSS,")
271 # Check Solaris backend
273 CHECK_INCLUDE_FILE(sys/audioio.h HAVE_SYS_AUDIOIO_H)
274 IF(HAVE_SYS_AUDIOIO_H)
276 SET(ALC_OBJS ${ALC_OBJS} Alc/solaris.c)
277 SET(BACKENDS "${BACKENDS} Solaris,")
281 # Check DSound/MMSystem backend
284 CHECK_INCLUDE_FILE(dsound.h HAVE_DSOUND_H)
287 SET(ALC_OBJS ${ALC_OBJS} Alc/dsound.c)
288 SET(BACKENDS "${BACKENDS} DirectSound,")
290 SET(CMAKE_REQUIRED_LIBRARIES dsound)
291 CHECK_C_SOURCE_COMPILES("int main() {return 0;}" HAVE_LIBDSOUND)
292 SET(CMAKE_REQUIRED_LIBRARIES "")
293 # CHECK_LIBRARY_EXISTS(dsound DirectSoundCreate "" HAVE_LIBDSOUND)
295 SET(EXTRA_LIBS dsound ${EXTRA_LIBS})
300 CHECK_INCLUDE_FILES("windows.h;mmsystem.h" HAVE_MMSYSTEM_H -D_WIN32_WINNT=0x0500)
303 SET(ALC_OBJS ${ALC_OBJS} Alc/winmm.c)
304 SET(BACKENDS "${BACKENDS} WinMM,")
306 SET(CMAKE_REQUIRED_LIBRARIES winmm)
307 CHECK_C_SOURCE_COMPILES("int main() {return 0;}" HAVE_LIBWINMM)
308 SET(CMAKE_REQUIRED_LIBRARIES "")
309 # CHECK_LIBRARY_EXISTS(winmm waveInOpen "" HAVE_LIBWINMM)
311 SET(EXTRA_LIBS winmm ${EXTRA_LIBS})
317 # This is always available
318 SET(BACKENDS "${BACKENDS} WaveFile")
320 # Needed for openal.pc.in
321 SET(prefix ${CMAKE_INSTALL_PREFIX})
322 SET(exec_prefix "\${prefix}")
323 SET(libdir "\${exec_prefix}/${LIB_INSTALL_DIR}")
324 SET(bindir "\${exec_prefix}/bin")
325 SET(includedir "\${prefix}/include")
326 SET(PACKAGE_VERSION "${LIB_VERSION}")
330 "${OpenAL_SOURCE_DIR}/config.h.in"
331 "${OpenAL_BINARY_DIR}/config.h")
333 "${OpenAL_SOURCE_DIR}/admin/pkgconfig/openal.pc.in"
334 "${OpenAL_BINARY_DIR}/admin/pkgconfig/openal.pc"
337 ADD_DEFINITIONS(-DAL_BUILD_LIBRARY)
343 ADD_LIBRARY(${LIBNAME} ${LIBTYPE} ${OPENAL_OBJS} ${ALC_OBJS})
344 SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES VERSION ${LIB_VERSION}
345 SOVERSION ${LIB_MAJOR_VERSION})
347 SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES PREFIX "" SUFFIX .dll)
351 MESSAGE(STATUS "Building examples disabled when cross-compiling")
354 SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES OUTPUT_NAME ${LIBNAME})
356 TARGET_LINK_LIBRARIES(${LIBNAME} ${EXTRA_LIBS})
358 # Add an install target here
359 INSTALL(TARGETS ${LIBNAME}
360 RUNTIME DESTINATION bin
361 LIBRARY DESTINATION ${LIB_INSTALL_DIR}
362 ARCHIVE DESTINATION ${LIB_INSTALL_DIR}
364 INSTALL(FILES include/AL/al.h
367 DESTINATION include/AL
369 INSTALL(FILES "${OpenAL_BINARY_DIR}/admin/pkgconfig/openal.pc"
370 DESTINATION lib/pkgconfig)
373 ADD_EXECUTABLE(openal-info examples/openal-info.c)
374 TARGET_LINK_LIBRARIES(openal-info ${LIBNAME})
375 INSTALL(TARGETS openal-info
376 RUNTIME DESTINATION bin
377 LIBRARY DESTINATION ${LIB_INSTALL_DIR}
378 ARCHIVE DESTINATION ${LIB_INSTALL_DIR}
383 MESSAGE(STATUS "Building OpenAL with support for the following backends:")
384 MESSAGE(STATUS " ${BACKENDS}")
387 IF(WIN32 OR XCOMPILEWIN32)
389 MESSAGE(STATUS "WARNING: Building the Windows version without DirectSound output")
390 MESSAGE(STATUS " This is probably NOT what you want!")