view CMakeLists.txt @ 6:99df34265b40

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