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)
29 OPTION(SDL "Check for SDL backend" ON)
31 OPTION(DLOPEN "Check for the dlopen API for loading optional libs" ON)
33 OPTION(WERROR "Treat compile warnings as errors" OFF)
35 OPTION(EXAMPLES "Build example programs" ON)
40 ADD_DEFINITIONS("-D_WIN32")
45 SET(LIB_MAJOR_VERSION "1")
46 SET(LIB_MINOR_VERSION "6")
47 SET(LIB_BUILD_VERSION "372")
48 SET(LIB_VERSION "${LIB_MAJOR_VERSION}.${LIB_MINOR_VERSION}.${LIB_BUILD_VERSION}")
49 IF(NOT DEFINED LIB_INSTALL_DIR)
50 SET(LIB_INSTALL_DIR "lib")
51 ENDIF(NOT DEFINED LIB_INSTALL_DIR)
54 CHECK_TYPE_SIZE("long" SIZEOF_LONG)
55 CHECK_TYPE_SIZE("long long" SIZEOF_LONG_LONG)
56 CHECK_TYPE_SIZE("unsigned int" SIZEOF_UINT)
57 CHECK_TYPE_SIZE("void*" SIZEOF_VOIDP)
60 # Add definitions, compiler switches, etc.
61 INCLUDE_DIRECTORIES(OpenAL32/Include include "${OpenAL_BINARY_DIR}")
63 IF(NOT CMAKE_BUILD_TYPE)
64 SET(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING
65 "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel."
68 IF(NOT CMAKE_DEBUG_POSTFIX)
69 SET(CMAKE_DEBUG_POSTFIX "" CACHE STRING
70 "Library postfix for debug builds. Normally left blank."
76 SET(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -D_DEBUG")
77 SET(CMAKE_C_FLAGS_MINSIZEREL "${CMAKE_C_FLAGS_MINSIZEREL} -DNDEBUG")
78 SET(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -DNDEBUG")
79 SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -D_DEBUG")
81 ADD_DEFINITIONS(-Wall)
82 CHECK_C_COMPILER_FLAG(-Wextra HAVE_W_EXTRA)
84 ADD_DEFINITIONS(-Wextra)
88 ADD_DEFINITIONS(-Werror)
91 SET(CMAKE_C_FLAGS_RELWITHDEBINFO "-g -O2 -funroll-loops -D_DEBUG" CACHE STRING
92 "Flags used by the compiler during Release with Debug Info builds."
94 SET(CMAKE_C_FLAGS_MINSIZEREL "-Os -DNDEBUG" CACHE STRING
95 "Flags used by the compiler during release minsize builds."
97 SET(CMAKE_C_FLAGS_RELEASE "-O2 -funroll-loops -fomit-frame-pointer -DNDEBUG" CACHE STRING
98 "Flags used by the compiler during release builds"
100 SET(CMAKE_C_FLAGS_DEBUG "-g3 -D_DEBUG" CACHE STRING
101 "Flags used by the compiler during debug builds."
104 # Set visibility options if available
106 CHECK_C_SOURCE_COMPILES("int foo() __attribute__((destructor));
107 int main() {return 0;}" HAVE_GCC_DESTRUCTOR)
109 CHECK_C_COMPILER_FLAG(-fvisibility=hidden HAVE_VISIBILITY_SWITCH)
110 IF(HAVE_VISIBILITY_SWITCH)
111 CHECK_C_SOURCE_COMPILES("int foo() __attribute__((visibility(\"default\")));
112 int main() {return 0;}" HAVE_GCC_VISIBILITY)
113 IF(HAVE_GCC_VISIBILITY)
114 ADD_DEFINITIONS(-fvisibility=hidden -DHAVE_GCC_VISIBILITY)
120 CHECK_INCLUDE_FILE(fenv.h HAVE_FENV_H)
121 CHECK_INCLUDE_FILE(float.h HAVE_FLOAT_H)
123 CHECK_LIBRARY_EXISTS(m sqrtf "" HAVE_SQRTF)
124 CHECK_LIBRARY_EXISTS(m acosf "" HAVE_ACOSF)
126 CHECK_LIBRARY_EXISTS(m fesetround "" HAVE_FESETROUND)
128 IF(HAVE_SQRTF OR HAVE_ACOSF OR HAVE_FESETROUND)
129 SET(EXTRA_LIBS m ${EXTRA_LIBS})
131 CHECK_FUNCTION_EXISTS(strtof HAVE_STRTOF)
132 CHECK_FUNCTION_EXISTS(_controlfp HAVE__CONTROLFP)
134 CHECK_FUNCTION_EXISTS(strcasecmp HAVE_STRCASECMP)
135 IF(NOT HAVE_STRCASECMP)
136 CHECK_FUNCTION_EXISTS(_stricmp HAVE__STRICMP)
137 IF(NOT HAVE__STRICMP)
138 MESSAGE(FATAL_ERROR "No case-insensitive compare function found, please report!")
141 ADD_DEFINITIONS(-Dstrcasecmp=_stricmp)
144 CHECK_FUNCTION_EXISTS(strncasecmp HAVE_STRNCASECMP)
145 IF(NOT HAVE_STRNCASECMP)
146 CHECK_FUNCTION_EXISTS(_strnicmp HAVE__STRNICMP)
147 IF(NOT HAVE__STRNICMP)
148 MESSAGE(FATAL_ERROR "No case-insensitive size-limitted compare function found, please report!")
151 ADD_DEFINITIONS(-Dstrncasecmp=_strnicmp)
154 CHECK_FUNCTION_EXISTS(snprintf HAVE_SNPRINTF)
155 IF(NOT HAVE_SNPRINTF)
156 CHECK_FUNCTION_EXISTS(_snprintf HAVE__SNPRINTF)
157 IF(NOT HAVE__SNPRINTF)
158 MESSAGE(FATAL_ERROR "No snprintf function found, please report!")
161 ADD_DEFINITIONS(-Dsnprintf=_snprintf)
164 # Check for the dlopen API (for dynamicly loading backend libs)
166 CHECK_INCLUDE_FILE(dlfcn.h HAVE_DLFCN_H)
168 CHECK_LIBRARY_EXISTS(dl dlopen "" HAVE_LIBDL)
170 SET(EXTRA_LIBS dl ${EXTRA_LIBS})
175 # Check if we have Windows headers
176 CHECK_INCLUDE_FILE(windows.h HAVE_WINDOWS_H -D_WIN32_WINNT=0x0500)
177 IF(NOT HAVE_WINDOWS_H)
178 CHECK_FUNCTION_EXISTS(gettimeofday HAVE_GETTIMEOFDAY)
179 IF(NOT HAVE_GETTIMEOFDAY)
180 MESSAGE(FATAL_ERROR "No timing function found!")
183 CHECK_FUNCTION_EXISTS(nanosleep HAVE_NANOSLEEP)
184 IF(NOT HAVE_NANOSLEEP)
185 MESSAGE(FATAL_ERROR "No sleep function found!")
188 # We need pthreads outside of Windows
189 CHECK_INCLUDE_FILE(pthread.h HAVE_PTHREAD_H)
190 IF(NOT HAVE_PTHREAD_H)
191 MESSAGE(FATAL_ERROR "PThreads is required for non-Windows builds!")
194 # Some systems need pthread_np.h to get recursive mutexes
195 CHECK_INCLUDE_FILES("pthread.h;pthread_np.h" HAVE_PTHREAD_NP_H)
197 # _GNU_SOURCE is needed on some systems for extra attributes, and
198 # _REENTRANT is needed for libc thread-safety
199 ADD_DEFINITIONS(-D_GNU_SOURCE=1 -D_REENTRANT)
200 CHECK_LIBRARY_EXISTS(pthread pthread_create "" HAVE_LIBPTHREAD)
202 SET(EXTRA_LIBS pthread ${EXTRA_LIBS})
206 # Check for a 64-bit type
207 CHECK_INCLUDE_FILE(stdint.h HAVE_STDINT_H)
208 IF(NOT HAVE_STDINT_H)
210 CHECK_C_SOURCE_COMPILES("\#define _WIN32_WINNT 0x0500
211 \#include <windows.h>
213 int main() {return 0;}" HAVE___INT64)
216 IF(NOT SIZEOF_LONG MATCHES "8")
217 IF(NOT SIZEOF_LONG_LONG MATCHES "8")
218 MESSAGE(FATAL_ERROR "No 64-bit types found, please report!")
225 SET(OPENAL_OBJS OpenAL32/alAuxEffectSlot.c
229 OpenAL32/alExtension.c
231 OpenAL32/alListener.c
236 SET(ALC_OBJS Alc/ALc.c
250 CHECK_INCLUDE_FILE(alsa/asoundlib.h HAVE_ALSA_ASOUNDLIB_H)
251 IF(HAVE_ALSA_ASOUNDLIB_H)
252 CHECK_LIBRARY_EXISTS(asound snd_pcm_open "" HAVE_LIBASOUND)
253 IF(HAVE_DLFCN_H OR HAVE_LIBASOUND)
255 SET(ALC_OBJS ${ALC_OBJS} Alc/alsa.c)
257 SET(BACKENDS "${BACKENDS} ALSA,")
259 SET(BACKENDS "${BACKENDS} ALSA \(linked\),")
260 SET(EXTRA_LIBS asound ${EXTRA_LIBS})
268 CHECK_INCLUDE_FILE(sys/soundcard.h HAVE_SYS_SOUNDCARD_H)
269 IF(HAVE_SYS_SOUNDCARD_H)
271 SET(ALC_OBJS ${ALC_OBJS} Alc/oss.c)
272 SET(BACKENDS "${BACKENDS} OSS,")
276 # Check Solaris backend
278 CHECK_INCLUDE_FILE(sys/audioio.h HAVE_SYS_AUDIOIO_H)
279 IF(HAVE_SYS_AUDIOIO_H)
281 SET(ALC_OBJS ${ALC_OBJS} Alc/solaris.c)
282 SET(BACKENDS "${BACKENDS} Solaris,")
286 # Check DSound/MMSystem backend
288 CHECK_INCLUDE_FILE(dsound.h HAVE_DSOUND_H)
291 SET(ALC_OBJS ${ALC_OBJS} Alc/dsound.c)
292 SET(BACKENDS "${BACKENDS} DirectSound,")
294 SET(CMAKE_REQUIRED_LIBRARIES dsound)
295 CHECK_C_SOURCE_COMPILES("int main() {return 0;}" HAVE_LIBDSOUND)
296 SET(CMAKE_REQUIRED_LIBRARIES "")
297 # CHECK_LIBRARY_EXISTS(dsound DirectSoundCreate "" HAVE_LIBDSOUND)
299 SET(EXTRA_LIBS dsound ${EXTRA_LIBS})
305 CHECK_INCLUDE_FILES("windows.h;mmsystem.h" HAVE_MMSYSTEM_H -D_WIN32_WINNT=0x0500)
308 SET(ALC_OBJS ${ALC_OBJS} Alc/winmm.c)
309 SET(BACKENDS "${BACKENDS} WinMM,")
311 SET(CMAKE_REQUIRED_LIBRARIES winmm)
312 CHECK_C_SOURCE_COMPILES("int main() {return 0;}" HAVE_LIBWINMM)
313 SET(CMAKE_REQUIRED_LIBRARIES "")
314 # CHECK_LIBRARY_EXISTS(winmm waveInOpen "" HAVE_LIBWINMM)
316 SET(EXTRA_LIBS winmm ${EXTRA_LIBS})
324 CHECK_INCLUDE_FILE(SDL.h HAVE_SDL_H)
326 CHECK_INCLUDE_FILE(SDL/SDL.h HAVE_SDL_SDL_H)
328 IF(HAVE_SDL_H OR HAVE_SDL_SDL_H)
329 CHECK_LIBRARY_EXISTS(SDL SDL_Init "" HAVE_LIBSDL)
330 IF(HAVE_DLFCN_H OR HAVE_LIBSDL)
332 SET(ALC_OBJS ${ALC_OBJS} Alc/sdl.c)
334 SET(BACKENDS "${BACKENDS} SDL,")
336 SET(BACKENDS "${BACKENDS} SDL \(linked\),")
337 SET(EXTRA_LIBS SDL ${EXTRA_LIBS})
343 # This is always available
344 SET(BACKENDS "${BACKENDS} WaveFile")
346 # Needed for openal.pc.in
347 SET(prefix ${CMAKE_INSTALL_PREFIX})
348 SET(exec_prefix "\${prefix}")
349 SET(libdir "\${exec_prefix}/${LIB_INSTALL_DIR}")
350 SET(bindir "\${exec_prefix}/bin")
351 SET(includedir "\${prefix}/include")
352 SET(PACKAGE_VERSION "${LIB_VERSION}")
356 "${OpenAL_SOURCE_DIR}/config.h.in"
357 "${OpenAL_BINARY_DIR}/config.h")
359 "${OpenAL_SOURCE_DIR}/admin/pkgconfig/openal.pc.in"
360 "${OpenAL_BINARY_DIR}/admin/pkgconfig/openal.pc"
363 ADD_DEFINITIONS(-DAL_BUILD_LIBRARY)
369 ADD_LIBRARY(${LIBNAME} ${LIBTYPE} ${OPENAL_OBJS} ${ALC_OBJS})
370 SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES VERSION ${LIB_VERSION}
371 SOVERSION ${LIB_MAJOR_VERSION})
373 SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES PREFIX "")
376 TARGET_LINK_LIBRARIES(${LIBNAME} ${EXTRA_LIBS})
378 # Add an install target here
379 INSTALL(TARGETS ${LIBNAME}
380 RUNTIME DESTINATION bin
381 LIBRARY DESTINATION ${LIB_INSTALL_DIR}
382 ARCHIVE DESTINATION ${LIB_INSTALL_DIR}
384 INSTALL(FILES include/AL/al.h
387 DESTINATION include/AL
389 INSTALL(FILES "${OpenAL_BINARY_DIR}/admin/pkgconfig/openal.pc"
390 DESTINATION lib/pkgconfig)
393 ADD_EXECUTABLE(openal-info examples/openal-info.c)
394 TARGET_LINK_LIBRARIES(openal-info ${LIBNAME})
395 INSTALL(TARGETS openal-info
396 RUNTIME DESTINATION bin
397 LIBRARY DESTINATION ${LIB_INSTALL_DIR}
398 ARCHIVE DESTINATION ${LIB_INSTALL_DIR}
403 MESSAGE(STATUS "Building OpenAL with support for the following backends:")
404 MESSAGE(STATUS " ${BACKENDS}")
409 MESSAGE(STATUS "WARNING: Building the Windows version without DirectSound output")
410 MESSAGE(STATUS " This is probably NOT what you want!")