view CMakeLists.txt @ 2:82b9267a3e19

removed all backends except for the send backend
author Robert McIntyre <rlm@mit.edu>
date Tue, 25 Oct 2011 13:11:31 -0700
parents f9476ff7637e
children 99df34265b40
line wrap: on
line source
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 SET(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake")
11 INCLUDE(CheckFunctionExists)
12 INCLUDE(CheckLibraryExists)
13 INCLUDE(CheckSharedFunctionExists)
14 INCLUDE(CheckIncludeFile)
15 INCLUDE(CheckIncludeFiles)
16 INCLUDE(CheckSymbolExists)
17 INCLUDE(CheckCCompilerFlag)
18 INCLUDE(CheckCSourceCompiles)
19 INCLUDE(CheckTypeSize)
22 PROJECT(OpenAL C)
25 SET(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS TRUE)
28 OPTION(SEND "Enable Send 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(UTILS "Build and install utility programs" ON)
36 OPTION(ALSOFT_CONFIG "Install alsoft.conf configuration file" OFF)
39 IF(WIN32)
40 SET(LIBNAME OpenAL32)
41 ADD_DEFINITIONS("-D_WIN32")
42 ELSE()
43 SET(LIBNAME openal)
44 ENDIF()
46 IF(NOT LIBTYPE)
47 SET(LIBTYPE SHARED)
48 ENDIF()
50 SET(LIB_MAJOR_VERSION "1")
51 SET(LIB_MINOR_VERSION "13")
52 SET(LIB_VERSION "${LIB_MAJOR_VERSION}.${LIB_MINOR_VERSION}")
54 SET(EXPORT_DECL "")
57 CHECK_TYPE_SIZE("long" SIZEOF_LONG)
58 CHECK_TYPE_SIZE("long long" SIZEOF_LONG_LONG)
59 CHECK_TYPE_SIZE("unsigned int" SIZEOF_UINT)
60 CHECK_TYPE_SIZE("void*" SIZEOF_VOIDP)
63 CHECK_C_SOURCE_COMPILES("int *restrict foo;
64 int main() {return 0;}" HAVE_RESTRICT)
65 CHECK_C_SOURCE_COMPILES("int *__restrict foo;
66 int main() {return 0;}" HAVE___RESTRICT)
69 # Add definitions, compiler switches, etc.
70 INCLUDE_DIRECTORIES(OpenAL32/Include include "${OpenAL_BINARY_DIR}")
72 IF(NOT CMAKE_BUILD_TYPE)
73 SET(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING
74 "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel."
75 FORCE)
76 ENDIF()
77 IF(NOT CMAKE_DEBUG_POSTFIX)
78 SET(CMAKE_DEBUG_POSTFIX "" CACHE STRING
79 "Library postfix for debug builds. Normally left blank."
80 FORCE)
81 ENDIF()
85 IF(MSVC)
86 # ???
87 SET(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -D_DEBUG")
88 SET(CMAKE_C_FLAGS_MINSIZEREL "${CMAKE_C_FLAGS_MINSIZEREL} -DNDEBUG")
89 SET(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -DNDEBUG")
90 SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -D_DEBUG")
91 ADD_DEFINITIONS(-D_CRT_SECURE_NO_WARNINGS)
92 ADD_DEFINITIONS(-D_CRT_NONSTDC_NO_DEPRECATE)
94 IF(NOT DXSDK_DIR)
95 STRING(REGEX REPLACE "\\\\" "/" DXSDK_DIR "$ENV{DXSDK_DIR}")
96 ELSE()
97 STRING(REGEX REPLACE "\\\\" "/" DXSDK_DIR "${DXSDK_DIR}")
98 ENDIF()
99 IF(DXSDK_DIR)
100 MESSAGE(STATUS "Using DirectX SDK directory: ${DXSDK_DIR}")
101 SET(CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES} "${DXSDK_DIR}/Include")
102 INCLUDE_DIRECTORIES("${DXSDK_DIR}/Include")
103 LINK_DIRECTORIES("${DXSDK_DIR}/Lib")
104 ENDIF()
106 OPTION(FORCE_STATIC_VCRT "Force /MT for static VC runtimes" OFF)
107 IF(FORCE_STATIC_VCRT)
108 FOREACH(flag_var
109 CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE
110 CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO)
111 IF(${flag_var} MATCHES "/MD")
112 STRING(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}")
113 ENDIF()
114 ENDFOREACH(flag_var)
115 ENDIF()
116 ELSE()
117 ADD_DEFINITIONS(-Winline -Wall)
118 CHECK_C_COMPILER_FLAG(-Wextra HAVE_W_EXTRA)
119 IF(HAVE_W_EXTRA)
120 ADD_DEFINITIONS(-Wextra)
121 ENDIF()
123 IF(WERROR)
124 ADD_DEFINITIONS(-Werror)
125 ENDIF()
127 SET(CMAKE_C_FLAGS_RELWITHDEBINFO "-g -O2 -D_DEBUG" CACHE STRING
128 "Flags used by the compiler during Release with Debug Info builds."
129 FORCE)
130 SET(CMAKE_C_FLAGS_MINSIZEREL "-Os -DNDEBUG" CACHE STRING
131 "Flags used by the compiler during release minsize builds."
132 FORCE)
133 SET(CMAKE_C_FLAGS_RELEASE "-O2 -fomit-frame-pointer -DNDEBUG" CACHE STRING
134 "Flags used by the compiler during release builds"
135 FORCE)
136 SET(CMAKE_C_FLAGS_DEBUG "-g3 -D_DEBUG" CACHE STRING
137 "Flags used by the compiler during debug builds."
138 FORCE)
140 CHECK_C_SOURCE_COMPILES("int foo() __attribute__((destructor));
141 int main() {return 0;}" HAVE_GCC_DESTRUCTOR)
142 ENDIF()
144 # Set visibility/export options if available
145 IF(WIN32)
146 SET(EXPORT_DECL "__declspec(dllexport)")
148 OPTION(WINE "Enable use of Wine headers when compiling" OFF)
149 IF(WINE)
150 FIND_PATH(WINE_INCLUDE_DIR library.h
151 PATHS
152 /usr/include/wine
153 /usr/local/include/wine
154 CMAKE_FIND_ROOT_PATH_BOTH)
155 IF(WINE_INCLUDE_DIR)
156 MESSAGE(STATUS "Found Wine header files - ${WINE_INCLUDE_DIR}" )
157 INCLUDE_DIRECTORIES("${WINE_INCLUDE_DIR}/windows")
158 SET(CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES} "${WINE_INCLUDE_DIR}/windows")
159 ELSE()
160 MESSAGE(STATUS "Could not find Wine header files" )
161 ENDIF()
162 ENDIF()
163 ELSE()
164 CHECK_C_COMPILER_FLAG(-fvisibility=internal HAVE_VISIBILITY_SWITCH)
165 CHECK_C_SOURCE_COMPILES("int foo() __attribute__((visibility(\"protected\")));
166 int main() {return 0;}" HAVE_GCC_VISIBILITY)
167 IF(HAVE_VISIBILITY_SWITCH AND HAVE_GCC_VISIBILITY)
168 #ADD_DEFINITIONS(-fvisibility=internal)
169 #SET(EXPORT_DECL "__attribute__((visibility(\"protected\")))")
170 ENDIF()
171 ENDIF()
173 CHECK_C_SOURCE_COMPILES("int foo(const char *str, ...) __attribute__((format(printf, 1, 2)));
174 int main() {return 0;}" HAVE_GCC_FORMAT)
176 CHECK_INCLUDE_FILE(fenv.h HAVE_FENV_H)
177 CHECK_INCLUDE_FILE(float.h HAVE_FLOAT_H)
178 CHECK_INCLUDE_FILE(ieeefp.h HAVE_IEEEFP_H)
179 CHECK_INCLUDE_FILE(guiddef.h HAVE_GUIDDEF_H)
180 IF(NOT HAVE_GUIDDEF_H)
181 CHECK_INCLUDE_FILE(initguid.h HAVE_INITGUID_H)
182 ENDIF()
183 CHECK_INCLUDE_FILE(arm_neon.h HAVE_ARM_NEON_H)
185 CHECK_LIBRARY_EXISTS(m powf "" HAVE_POWF)
186 CHECK_LIBRARY_EXISTS(m sqrtf "" HAVE_SQRTF)
187 CHECK_LIBRARY_EXISTS(m acosf "" HAVE_ACOSF)
188 CHECK_LIBRARY_EXISTS(m atanf "" HAVE_ATANF)
189 CHECK_LIBRARY_EXISTS(m fabsf "" HAVE_FABSF)
190 IF(HAVE_FENV_H)
191 CHECK_LIBRARY_EXISTS(m fesetround "" HAVE_FESETROUND)
192 ENDIF()
193 IF(HAVE_SQRTF OR HAVE_ACOSF OR HAVE_ATANF OR HAVE_FABSF OR HAVE_FESETROUND)
194 SET(EXTRA_LIBS m ${EXTRA_LIBS})
195 ENDIF()
196 CHECK_FUNCTION_EXISTS(strtof HAVE_STRTOF)
197 CHECK_FUNCTION_EXISTS(_controlfp HAVE__CONTROLFP)
199 CHECK_FUNCTION_EXISTS(stat HAVE_STAT)
200 CHECK_FUNCTION_EXISTS(strcasecmp HAVE_STRCASECMP)
201 IF(NOT HAVE_STRCASECMP)
202 CHECK_FUNCTION_EXISTS(_stricmp HAVE__STRICMP)
203 IF(NOT HAVE__STRICMP)
204 MESSAGE(FATAL_ERROR "No case-insensitive compare function found, please report!")
205 ENDIF()
207 ADD_DEFINITIONS(-Dstrcasecmp=_stricmp)
208 ENDIF()
210 CHECK_FUNCTION_EXISTS(strncasecmp HAVE_STRNCASECMP)
211 IF(NOT HAVE_STRNCASECMP)
212 CHECK_FUNCTION_EXISTS(_strnicmp HAVE__STRNICMP)
213 IF(NOT HAVE__STRNICMP)
214 MESSAGE(FATAL_ERROR "No case-insensitive size-limitted compare function found, please report!")
215 ENDIF()
217 ADD_DEFINITIONS(-Dstrncasecmp=_strnicmp)
218 ENDIF()
220 CHECK_FUNCTION_EXISTS(snprintf HAVE_SNPRINTF)
221 IF(NOT HAVE_SNPRINTF)
222 CHECK_FUNCTION_EXISTS(_snprintf HAVE__SNPRINTF)
223 IF(NOT HAVE__SNPRINTF)
224 MESSAGE(FATAL_ERROR "No snprintf function found, please report!")
225 ENDIF()
227 ADD_DEFINITIONS(-Dsnprintf=_snprintf)
228 ENDIF()
230 CHECK_FUNCTION_EXISTS(vsnprintf HAVE_VSNPRINTF)
231 IF(NOT HAVE_VSNPRINTF)
232 CHECK_FUNCTION_EXISTS(_vsnprintf HAVE__VSNPRINTF)
233 IF(NOT HAVE__VSNPRINTF)
234 MESSAGE(FATAL_ERROR "No vsnprintf function found, please report!")
235 ENDIF()
237 ADD_DEFINITIONS(-Dvsnprintf=_vsnprintf)
238 ENDIF()
240 CHECK_SYMBOL_EXISTS(isfinite math.h HAVE_ISFINITE)
241 IF(NOT HAVE_ISFINITE)
242 CHECK_FUNCTION_EXISTS(finite HAVE_FINITE)
243 IF(NOT HAVE_FINITE)
244 CHECK_FUNCTION_EXISTS(_finite HAVE__FINITE)
245 IF(NOT HAVE__FINITE)
246 MESSAGE(FATAL_ERROR "No isfinite function found, please report!")
247 ENDIF()
248 ADD_DEFINITIONS(-Disfinite=_finite)
249 ELSE()
250 ADD_DEFINITIONS(-Disfinite=finite)
251 ENDIF()
252 ENDIF()
254 CHECK_SYMBOL_EXISTS(isnan math.h HAVE_ISNAN)
255 IF(NOT HAVE_ISNAN)
256 CHECK_FUNCTION_EXISTS(_isnan HAVE__ISNAN)
257 IF(NOT HAVE__ISNAN)
258 MESSAGE(FATAL_ERROR "No isnan function found, please report!")
259 ENDIF()
261 ADD_DEFINITIONS(-Disnan=_isnan)
262 ENDIF()
265 # Check for the dlopen API (for dynamicly loading backend libs)
266 IF(DLOPEN)
267 CHECK_INCLUDE_FILE(dlfcn.h HAVE_DLFCN_H)
268 IF(HAVE_DLFCN_H)
269 CHECK_LIBRARY_EXISTS(dl dlopen "" HAVE_LIBDL)
270 IF(HAVE_LIBDL)
271 SET(EXTRA_LIBS dl ${EXTRA_LIBS})
272 ENDIF()
273 ENDIF()
274 ENDIF()
276 # Check if we have Windows headers
277 CHECK_INCLUDE_FILE(windows.h HAVE_WINDOWS_H -D_WIN32_WINNT=0x0500)
278 IF(NOT HAVE_WINDOWS_H)
279 CHECK_FUNCTION_EXISTS(gettimeofday HAVE_GETTIMEOFDAY)
280 IF(NOT HAVE_GETTIMEOFDAY)
281 MESSAGE(FATAL_ERROR "No timing function found!")
282 ENDIF()
284 CHECK_FUNCTION_EXISTS(nanosleep HAVE_NANOSLEEP)
285 IF(NOT HAVE_NANOSLEEP)
286 MESSAGE(FATAL_ERROR "No sleep function found!")
287 ENDIF()
289 CHECK_C_COMPILER_FLAG(-pthread HAVE_PTHREAD)
290 IF(HAVE_PTHREAD)
291 ADD_DEFINITIONS(-pthread)
292 SET(EXTRA_LIBS ${EXTRA_LIBS} -pthread)
293 ENDIF()
295 # We need pthreads outside of Windows
296 CHECK_INCLUDE_FILE(pthread.h HAVE_PTHREAD_H)
297 IF(NOT HAVE_PTHREAD_H)
298 MESSAGE(FATAL_ERROR "PThreads is required for non-Windows builds!")
299 ENDIF()
300 # Some systems need pthread_np.h to get recursive mutexes
301 CHECK_INCLUDE_FILES("pthread.h;pthread_np.h" HAVE_PTHREAD_NP_H)
303 # _GNU_SOURCE is needed on some systems for extra attributes, and
304 # _REENTRANT is needed for libc thread-safety
305 ADD_DEFINITIONS(-D_GNU_SOURCE=1)
306 CHECK_LIBRARY_EXISTS(pthread pthread_create "" HAVE_LIBPTHREAD)
307 IF(HAVE_LIBPTHREAD)
308 SET(EXTRA_LIBS pthread ${EXTRA_LIBS})
309 ENDIF()
311 CHECK_LIBRARY_EXISTS(pthread pthread_setschedparam "" HAVE_PTHREAD_SETSCHEDPARAM)
313 CHECK_LIBRARY_EXISTS(rt clock_gettime "" HAVE_LIBRT)
314 IF(HAVE_LIBRT)
315 SET(EXTRA_LIBS rt ${EXTRA_LIBS})
316 ENDIF()
317 ENDIF()
319 # Check for a 64-bit type
320 CHECK_INCLUDE_FILE(stdint.h HAVE_STDINT_H)
321 IF(NOT HAVE_STDINT_H)
322 IF(HAVE_WINDOWS_H)
323 CHECK_C_SOURCE_COMPILES("\#define _WIN32_WINNT 0x0500
324 \#include <windows.h>
325 __int64 foo;
326 int main() {return 0;}" HAVE___INT64)
327 ENDIF()
328 IF(NOT HAVE___INT64)
329 IF(NOT SIZEOF_LONG MATCHES "8")
330 IF(NOT SIZEOF_LONG_LONG MATCHES "8")
331 MESSAGE(FATAL_ERROR "No 64-bit types found, please report!")
332 ENDIF()
333 ENDIF()
334 ENDIF()
335 ENDIF()
337 # Windows needs winmm for timeGetTime, even if the backend is disabled
338 CHECK_SHARED_FUNCTION_EXISTS(timeGetTime "windows.h;mmsystem.h" winmm "" HAVE_LIBWINMM)
339 IF(HAVE_LIBWINMM)
340 SET(EXTRA_LIBS winmm ${EXTRA_LIBS})
341 SET(PKG_CONFIG_LIBS ${PKG_CONFIG_LIBS} -lwinmm)
342 ENDIF()
345 SET(OPENAL_OBJS OpenAL32/alAuxEffectSlot.c
346 OpenAL32/alBuffer.c
347 OpenAL32/alEffect.c
348 OpenAL32/alError.c
349 OpenAL32/alExtension.c
350 OpenAL32/alFilter.c
351 OpenAL32/alListener.c
352 OpenAL32/alSource.c
353 OpenAL32/alState.c
354 OpenAL32/alThunk.c
355 )
356 SET(ALC_OBJS Alc/ALc.c
357 Alc/ALu.c
358 Alc/alcConfig.c
359 Alc/alcDedicated.c
360 Alc/alcEcho.c
361 Alc/alcModulator.c
362 Alc/alcReverb.c
363 Alc/alcRing.c
364 Alc/alcThread.c
365 Alc/bs2b.c
366 Alc/helpers.c
367 Alc/hrtf.c
368 Alc/mixer.c
369 Alc/panning.c
370 # Default backends, always available
371 Alc/backends/loopback.c
372 Alc/backends/null.c
373 # RLM: add send device
374 Alc/backends/send.c
375 )
377 SET(BACKENDS "")
381 SET(ALC_OBJS ${ALC_OBJS} Alc/backends/send.c)
382 SET(BACKENDS "${BACKENDS} Send,")
385 # This is always available
386 SET(BACKENDS "${BACKENDS} Null")
388 IF(LIBTYPE STREQUAL "STATIC")
389 ADD_DEFINITIONS(-DAL_LIBTYPE_STATIC)
390 SET(PKG_CONFIG_CFLAGS -DAL_LIBTYPE_STATIC ${PKG_CONFIG_CFLAGS})
391 ENDIF()
393 # Needed for openal.pc.in
394 SET(prefix ${CMAKE_INSTALL_PREFIX})
395 SET(exec_prefix "\${prefix}")
396 SET(libdir "\${exec_prefix}/lib${LIB_SUFFIX}")
397 SET(bindir "\${exec_prefix}/bin")
398 SET(includedir "\${prefix}/include")
399 SET(PACKAGE_VERSION "${LIB_VERSION}")
401 # End configuration
402 CONFIGURE_FILE(
403 "${OpenAL_SOURCE_DIR}/config.h.in"
404 "${OpenAL_BINARY_DIR}/config.h")
405 CONFIGURE_FILE(
406 "${OpenAL_SOURCE_DIR}/openal.pc.in"
407 "${OpenAL_BINARY_DIR}/openal.pc"
408 @ONLY)
410 # Build a library
411 ADD_LIBRARY(${LIBNAME} ${LIBTYPE} ${OPENAL_OBJS} ${ALC_OBJS})
412 SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES DEFINE_SYMBOL AL_BUILD_LIBRARY
413 COMPILE_FLAGS -DAL_ALEXT_PROTOTYPES
414 VERSION ${LIB_VERSION}.0
415 SOVERSION ${LIB_MAJOR_VERSION})
416 IF(WIN32 AND NOT LIBTYPE STREQUAL "STATIC")
417 SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES PREFIX "")
418 ENDIF()
420 # RLM link jni the dumb way for now:
422 INCLUDE_DIRECTORIES("/opt/jdk/include/")
423 INCLUDE_DIRECTORIES("/opt/jdk/include/linux")
424 TARGET_LINK_LIBRARIES(${LIBNAME} ${EXTRA_LIBS})
426 # Add an install target here
427 INSTALL(TARGETS ${LIBNAME}
428 RUNTIME DESTINATION bin
429 LIBRARY DESTINATION "lib${LIB_SUFFIX}"
430 ARCHIVE DESTINATION "lib${LIB_SUFFIX}"
431 )
432 INSTALL(FILES include/AL/al.h
433 include/AL/alc.h
434 include/AL/alext.h
435 include/AL/efx.h
436 include/AL/efx-creative.h
437 DESTINATION include/AL
438 )
439 INSTALL(FILES "${OpenAL_BINARY_DIR}/openal.pc"
440 DESTINATION "lib${LIB_SUFFIX}/pkgconfig")
443 MESSAGE(STATUS "")
444 MESSAGE(STATUS "Building OpenAL with support for the following backends:")
445 MESSAGE(STATUS " ${BACKENDS}")
446 MESSAGE(STATUS "")
448 # Install alsoft.conf configuration file
449 IF(ALSOFT_CONFIG)
450 INSTALL(FILES alsoftrc.sample
451 DESTINATION /etc/openal
452 RENAME alsoft.conf
453 )
454 MESSAGE(STATUS "Installing sample alsoft.conf")
455 MESSAGE(STATUS "")
456 ENDIF()
458 IF(UTILS)
459 ADD_EXECUTABLE(openal-info utils/openal-info.c)
460 TARGET_LINK_LIBRARIES(openal-info ${LIBNAME})
461 INSTALL(TARGETS openal-info
462 RUNTIME DESTINATION bin
463 LIBRARY DESTINATION "lib${LIB_SUFFIX}"
464 ARCHIVE DESTINATION "lib${LIB_SUFFIX}"
465 )
466 MESSAGE(STATUS "Building utility programs")
467 MESSAGE(STATUS "")
468 ENDIF()