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 "6")
48 SET(LIB_BUILD_VERSION "372")
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."
69 IF(NOT CMAKE_DEBUG_POSTFIX)
70 SET(CMAKE_DEBUG_POSTFIX "" CACHE STRING
71 "Library postfix for debug builds. Normally left blank."
77 SET(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -D_DEBUG")
78 SET(CMAKE_C_FLAGS_MINSIZEREL "${CMAKE_C_FLAGS_MINSIZEREL} -DNDEBUG")
79 SET(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -DNDEBUG")
80 SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -D_DEBUG")
82 ADD_DEFINITIONS(-Wall)
83 CHECK_C_COMPILER_FLAG(-Wextra HAVE_W_EXTRA)
85 ADD_DEFINITIONS(-Wextra)
89 ADD_DEFINITIONS(-Werror)
92 SET(CMAKE_C_FLAGS_RELWITHDEBINFO "-g -O2 -funroll-loops -D_DEBUG" CACHE STRING
93 "Flags used by the compiler during Release with Debug Info builds."
95 SET(CMAKE_C_FLAGS_MINSIZEREL "-Os -DNDEBUG" CACHE STRING
96 "Flags used by the compiler during release minsize builds."
98 SET(CMAKE_C_FLAGS_RELEASE "-O2 -funroll-loops -fomit-frame-pointer -DNDEBUG" CACHE STRING
99 "Flags used by the compiler during release builds"
101 SET(CMAKE_C_FLAGS_DEBUG "-g3 -D_DEBUG" CACHE STRING
102 "Flags used by the compiler during debug builds."
105 # Set visibility options if available
106 IF(NOT WIN32 AND NOT XCOMPILEWIN32)
107 CHECK_C_SOURCE_COMPILES("int foo() __attribute__((destructor));
108 int main() {return 0;}" HAVE_GCC_DESTRUCTOR)
110 CHECK_C_COMPILER_FLAG(-fvisibility=hidden HAVE_VISIBILITY_SWITCH)
111 IF("${HAVE_VISIBILITY_SWITCH}")
112 CHECK_C_SOURCE_COMPILES("int foo() __attribute__((visibility(\"default\")));
113 int main() {return 0;}" HAVE_GCC_VISIBILITY)
114 IF("${HAVE_GCC_VISIBILITY}")
115 ADD_DEFINITIONS(-fvisibility=hidden -DHAVE_GCC_VISIBILITY)
121 CHECK_INCLUDE_FILE(fenv.h HAVE_FENV_H)
122 CHECK_INCLUDE_FILE(float.h HAVE_FLOAT_H)
124 CHECK_LIBRARY_EXISTS(m sqrtf "" HAVE_SQRTF)
125 CHECK_LIBRARY_EXISTS(m acosf "" HAVE_ACOSF)
127 CHECK_LIBRARY_EXISTS(m fesetround "" HAVE_FESETROUND)
129 IF(HAVE_SQRTF OR HAVE_ACOSF OR HAVE_FESETROUND)
130 SET(EXTRA_LIBS m ${EXTRA_LIBS})
132 CHECK_FUNCTION_EXISTS(strtof HAVE_STRTOF)
133 CHECK_FUNCTION_EXISTS(_controlfp HAVE__CONTROLFP)
135 CHECK_FUNCTION_EXISTS(strcasecmp HAVE_STRCASECMP)
136 IF(NOT HAVE_STRCASECMP)
137 CHECK_FUNCTION_EXISTS(_stricmp HAVE__STRICMP)
138 IF(NOT HAVE__STRICMP)
139 MESSAGE(FATAL_ERROR "No case-insensitive compare function found, please report!")
142 ADD_DEFINITIONS(-Dstrcasecmp=_stricmp)
145 CHECK_FUNCTION_EXISTS(strncasecmp HAVE_STRNCASECMP)
146 IF(NOT HAVE_STRNCASECMP)
147 CHECK_FUNCTION_EXISTS(_strnicmp HAVE__STRNICMP)
148 IF(NOT HAVE__STRNICMP)
149 MESSAGE(FATAL_ERROR "No case-insensitive size-limitted compare function found, please report!")
152 ADD_DEFINITIONS(-Dstrncasecmp=_strnicmp)
155 CHECK_FUNCTION_EXISTS(snprintf HAVE_SNPRINTF)
156 IF(NOT HAVE_SNPRINTF)
157 CHECK_FUNCTION_EXISTS(_snprintf HAVE__SNPRINTF)
158 IF(NOT HAVE__SNPRINTF)
159 MESSAGE(FATAL_ERROR "No snprintf function found, please report!")
162 ADD_DEFINITIONS(-Dsnprintf=_snprintf)
165 # Check for the dlopen API (for dynamicly loading backend libs)
167 CHECK_INCLUDE_FILE(dlfcn.h HAVE_DLFCN_H)
169 CHECK_LIBRARY_EXISTS(dl dlopen "" HAVE_LIBDL)
171 SET(EXTRA_LIBS dl ${EXTRA_LIBS})
176 # Check if we have Windows headers
177 CHECK_INCLUDE_FILE(windows.h HAVE_WINDOWS_H -D_WIN32_WINNT=0x0500)
178 IF(NOT HAVE_WINDOWS_H)
179 CHECK_FUNCTION_EXISTS(gettimeofday HAVE_GETTIMEOFDAY)
180 IF(NOT HAVE_GETTIMEOFDAY)
181 MESSAGE(FATAL_ERROR "No timing function found!")
184 CHECK_FUNCTION_EXISTS(nanosleep HAVE_NANOSLEEP)
185 IF(NOT HAVE_NANOSLEEP)
186 MESSAGE(FATAL_ERROR "No sleep function found!")
189 # We need pthreads outside of Windows
190 CHECK_INCLUDE_FILE(pthread.h HAVE_PTHREAD_H)
191 IF(NOT HAVE_PTHREAD_H)
192 MESSAGE(FATAL_ERROR "PThreads is required for non-Windows builds!")
195 # Some systems need pthread_np.h to get recursive mutexes
196 CHECK_INCLUDE_FILES("pthread.h;pthread_np.h" HAVE_PTHREAD_NP_H)
198 # _GNU_SOURCE is needed on some systems for extra attributes, and
199 # _REENTRANT is needed for libc thread-safety
200 ADD_DEFINITIONS(-D_GNU_SOURCE=1 -D_REENTRANT)
201 CHECK_LIBRARY_EXISTS(pthread pthread_create "" HAVE_LIBPTHREAD)
203 SET(EXTRA_LIBS pthread ${EXTRA_LIBS})
207 # Check for a 64-bit type
208 CHECK_INCLUDE_FILE(stdint.h HAVE_STDINT_H)
209 IF(NOT HAVE_STDINT_H)
211 CHECK_C_SOURCE_COMPILES("\#define _WIN32_WINNT 0x0500
212 \#include <windows.h>
214 int main() {return 0;}" HAVE___INT64)
217 IF(NOT SIZEOF_LONG MATCHES "8")
218 IF(NOT SIZEOF_LONG_LONG MATCHES "8")
219 MESSAGE(FATAL_ERROR "No 64-bit types found, please report!")
226 SET(OPENAL_OBJS OpenAL32/alAuxEffectSlot.c
230 OpenAL32/alExtension.c
232 OpenAL32/alListener.c
237 SET(ALC_OBJS Alc/ALc.c
251 CHECK_INCLUDE_FILE(alsa/asoundlib.h HAVE_ALSA_ASOUNDLIB_H)
252 IF(HAVE_ALSA_ASOUNDLIB_H)
253 CHECK_LIBRARY_EXISTS(asound snd_pcm_open "" HAVE_LIBASOUND)
254 IF(HAVE_DLFCN_H OR HAVE_LIBASOUND)
256 SET(ALC_OBJS ${ALC_OBJS} Alc/alsa.c)
258 SET(BACKENDS "${BACKENDS} ALSA,")
260 SET(BACKENDS "${BACKENDS} ALSA \(linked\),")
261 SET(EXTRA_LIBS asound ${EXTRA_LIBS})
269 CHECK_INCLUDE_FILE(sys/soundcard.h HAVE_SYS_SOUNDCARD_H)
270 IF(HAVE_SYS_SOUNDCARD_H)
272 SET(ALC_OBJS ${ALC_OBJS} Alc/oss.c)
273 SET(BACKENDS "${BACKENDS} OSS,")
277 # Check Solaris backend
279 CHECK_INCLUDE_FILE(sys/audioio.h HAVE_SYS_AUDIOIO_H)
280 IF(HAVE_SYS_AUDIOIO_H)
282 SET(ALC_OBJS ${ALC_OBJS} Alc/solaris.c)
283 SET(BACKENDS "${BACKENDS} Solaris,")
287 # Check DSound/MMSystem backend
289 CHECK_INCLUDE_FILE(dsound.h HAVE_DSOUND_H)
292 SET(ALC_OBJS ${ALC_OBJS} Alc/dsound.c)
293 SET(BACKENDS "${BACKENDS} DirectSound,")
295 SET(CMAKE_REQUIRED_LIBRARIES dsound)
296 CHECK_C_SOURCE_COMPILES("int main() {return 0;}" HAVE_LIBDSOUND)
297 SET(CMAKE_REQUIRED_LIBRARIES "")
298 # CHECK_LIBRARY_EXISTS(dsound DirectSoundCreate "" HAVE_LIBDSOUND)
300 SET(EXTRA_LIBS dsound ${EXTRA_LIBS})
306 CHECK_INCLUDE_FILES("windows.h;mmsystem.h" HAVE_MMSYSTEM_H -D_WIN32_WINNT=0x0500)
309 SET(ALC_OBJS ${ALC_OBJS} Alc/winmm.c)
310 SET(BACKENDS "${BACKENDS} WinMM,")
312 SET(CMAKE_REQUIRED_LIBRARIES winmm)
313 CHECK_C_SOURCE_COMPILES("int main() {return 0;}" HAVE_LIBWINMM)
314 SET(CMAKE_REQUIRED_LIBRARIES "")
315 # CHECK_LIBRARY_EXISTS(winmm waveInOpen "" HAVE_LIBWINMM)
317 SET(EXTRA_LIBS winmm ${EXTRA_LIBS})
323 # This is always available
324 SET(BACKENDS "${BACKENDS} WaveFile")
326 # Needed for openal.pc.in
327 SET(prefix ${CMAKE_INSTALL_PREFIX})
328 SET(exec_prefix "\${prefix}")
329 SET(libdir "\${exec_prefix}/${LIB_INSTALL_DIR}")
330 SET(bindir "\${exec_prefix}/bin")
331 SET(includedir "\${prefix}/include")
332 SET(PACKAGE_VERSION "${LIB_VERSION}")
336 "${OpenAL_SOURCE_DIR}/config.h.in"
337 "${OpenAL_BINARY_DIR}/config.h")
339 "${OpenAL_SOURCE_DIR}/admin/pkgconfig/openal.pc.in"
340 "${OpenAL_BINARY_DIR}/admin/pkgconfig/openal.pc"
343 ADD_DEFINITIONS(-DAL_BUILD_LIBRARY)
349 ADD_LIBRARY(${LIBNAME} ${LIBTYPE} ${OPENAL_OBJS} ${ALC_OBJS})
350 SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES VERSION ${LIB_VERSION}
351 SOVERSION ${LIB_MAJOR_VERSION})
353 SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES PREFIX "")
356 SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES PREFIX "" SUFFIX .dll)
360 MESSAGE(STATUS "Building examples disabled when cross-compiling")
363 SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES OUTPUT_NAME ${LIBNAME})
365 TARGET_LINK_LIBRARIES(${LIBNAME} ${EXTRA_LIBS})
367 # Add an install target here
368 INSTALL(TARGETS ${LIBNAME}
369 RUNTIME DESTINATION bin
370 LIBRARY DESTINATION ${LIB_INSTALL_DIR}
371 ARCHIVE DESTINATION ${LIB_INSTALL_DIR}
373 INSTALL(FILES include/AL/al.h
376 DESTINATION include/AL
378 INSTALL(FILES "${OpenAL_BINARY_DIR}/admin/pkgconfig/openal.pc"
379 DESTINATION lib/pkgconfig)
382 ADD_EXECUTABLE(openal-info examples/openal-info.c)
383 TARGET_LINK_LIBRARIES(openal-info ${LIBNAME})
384 INSTALL(TARGETS openal-info
385 RUNTIME DESTINATION bin
386 LIBRARY DESTINATION ${LIB_INSTALL_DIR}
387 ARCHIVE DESTINATION ${LIB_INSTALL_DIR}
392 MESSAGE(STATUS "Building OpenAL with support for the following backends:")
393 MESSAGE(STATUS " ${BACKENDS}")
396 IF(WIN32 OR XCOMPILEWIN32)
398 MESSAGE(STATUS "WARNING: Building the Windows version without DirectSound output")
399 MESSAGE(STATUS " This is probably NOT what you want!")