rlm@0: # CMake build file list for OpenAL rlm@0: rlm@0: CMAKE_MINIMUM_REQUIRED(VERSION 2.4) rlm@0: rlm@0: IF(COMMAND CMAKE_POLICY) rlm@0: CMAKE_POLICY(SET CMP0003 NEW) rlm@0: ENDIF(COMMAND CMAKE_POLICY) rlm@0: rlm@0: SET(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake") rlm@0: rlm@0: INCLUDE(CheckFunctionExists) rlm@0: INCLUDE(CheckLibraryExists) rlm@0: INCLUDE(CheckSharedFunctionExists) rlm@0: INCLUDE(CheckIncludeFile) rlm@0: INCLUDE(CheckIncludeFiles) rlm@0: INCLUDE(CheckSymbolExists) rlm@0: INCLUDE(CheckCCompilerFlag) rlm@0: INCLUDE(CheckCSourceCompiles) rlm@0: INCLUDE(CheckTypeSize) rlm@0: rlm@0: rlm@0: PROJECT(OpenAL C) rlm@0: rlm@0: rlm@0: SET(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS TRUE) rlm@0: rlm@0: rlm@0: OPTION(ALSA "Check for ALSA backend" ON) rlm@0: OPTION(OSS "Check for OSS backend" ON) rlm@0: OPTION(SOLARIS "Check for Solaris backend" ON) rlm@0: OPTION(SNDIO "Check for SndIO backend" ON) rlm@0: OPTION(MMDEVAPI "Check for MMDevApi" ON) rlm@0: OPTION(DSOUND "Check for DirectSound backend" ON) rlm@0: OPTION(WINMM "Check for Windows Multimedia backend" ON) rlm@0: OPTION(PORTAUDIO "Check for PortAudio backend" ON) rlm@0: OPTION(PULSEAUDIO "Check for PulseAudio backend" ON) rlm@0: OPTION(COREAUDIO "Check for CoreAudio backend" ON) rlm@0: OPTION(OPENSL "Check for OpenSL backend" ON) rlm@0: OPTION(WAVE "Enable Wave Writer backend" ON) rlm@0: OPTION(RECORD "Enable Recorder Backend" ON) rlm@0: rlm@0: OPTION(REQUIRE_ALSA "Require ALSA backend" OFF) rlm@0: OPTION(REQUIRE_OSS "Require OSS backend" OFF) rlm@0: OPTION(REQUIRE_SOLARIS "Require Solaris backend" OFF) rlm@0: OPTION(REQUIRE_SNDIO "Require SndIO backend" OFF) rlm@0: OPTION(REQUIRE_MMDEVAPI "Require MMDevApi" OFF) rlm@0: OPTION(REQUIRE_DSOUND "Require DirectSound backend" OFF) rlm@0: OPTION(REQUIRE_WINMM "Require Windows Multimedia backend" OFF) rlm@0: OPTION(REQUIRE_PORTAUDIO "Require PortAudio backend" OFF) rlm@0: OPTION(REQUIRE_PULSEAUDIO "Require PulseAudio backend" OFF) rlm@0: OPTION(REQUIRE_COREAUDIO "Require CoreAudio backend" OFF) rlm@0: OPTION(REQUIRE_OPENSL "Require OpenSL backend" OFF) rlm@0: rlm@0: OPTION(DLOPEN "Check for the dlopen API for loading optional libs" ON) rlm@0: rlm@0: OPTION(WERROR "Treat compile warnings as errors" OFF) rlm@0: rlm@0: OPTION(UTILS "Build and install utility programs" ON) rlm@0: rlm@0: OPTION(ALSOFT_CONFIG "Install alsoft.conf configuration file" OFF) rlm@0: rlm@0: rlm@0: SET(LIBNAME openal) rlm@0: rlm@0: SET(LIBTYPE SHARED) rlm@0: rlm@0: SET(LIB_MAJOR_VERSION "1") rlm@0: SET(LIB_MINOR_VERSION "13") rlm@0: SET(LIB_VERSION "${LIB_MAJOR_VERSION}.${LIB_MINOR_VERSION}") rlm@0: rlm@0: SET(EXPORT_DECL "") rlm@0: rlm@0: rlm@0: # Add definitions, compiler switches, etc. rlm@0: INCLUDE_DIRECTORIES(OpenAL32/Include include "${OpenAL_BINARY_DIR}") rlm@0: rlm@0: ADD_DEFINITIONS(-Winline -Wall) rlm@0: CHECK_C_COMPILER_FLAG(-Wextra HAVE_W_EXTRA) rlm@0: IF(HAVE_W_EXTRA) rlm@0: ADD_DEFINITIONS(-Wextra) rlm@0: ENDIF() rlm@0: rlm@0: IF(WERROR) rlm@0: ADD_DEFINITIONS(-Werror) rlm@0: ENDIF() rlm@0: rlm@0: SET(CMAKE_C_FLAGS_RELWITHDEBINFO "-g -O2 -D_DEBUG" CACHE STRING rlm@0: "Flags used by the compiler during Release with Debug Info builds." rlm@0: FORCE) rlm@0: SET(CMAKE_C_FLAGS_MINSIZEREL "-Os -DNDEBUG" CACHE STRING rlm@0: "Flags used by the compiler during release minsize builds." rlm@0: FORCE) rlm@0: SET(CMAKE_C_FLAGS_RELEASE "-O2 -fomit-frame-pointer -DNDEBUG" CACHE STRING rlm@0: "Flags used by the compiler during release builds" rlm@0: FORCE) rlm@0: SET(CMAKE_C_FLAGS_DEBUG "-g3 -D_DEBUG" CACHE STRING rlm@0: "Flags used by the compiler during debug builds." rlm@0: FORCE) rlm@0: rlm@0: CHECK_INCLUDE_FILE(fenv.h HAVE_FENV_H) rlm@0: CHECK_INCLUDE_FILE(float.h HAVE_FLOAT_H) rlm@0: CHECK_INCLUDE_FILE(ieeefp.h HAVE_IEEEFP_H) rlm@0: CHECK_INCLUDE_FILE(guiddef.h HAVE_GUIDDEF_H) rlm@0: IF(NOT HAVE_GUIDDEF_H) rlm@0: CHECK_INCLUDE_FILE(initguid.h HAVE_INITGUID_H) rlm@0: ENDIF() rlm@0: CHECK_INCLUDE_FILE(arm_neon.h HAVE_ARM_NEON_H) rlm@0: rlm@0: CHECK_LIBRARY_EXISTS(m powf "" HAVE_POWF) rlm@0: CHECK_LIBRARY_EXISTS(m sqrtf "" HAVE_SQRTF) rlm@0: CHECK_LIBRARY_EXISTS(m acosf "" HAVE_ACOSF) rlm@0: CHECK_LIBRARY_EXISTS(m atanf "" HAVE_ATANF) rlm@0: CHECK_LIBRARY_EXISTS(m fabsf "" HAVE_FABSF) rlm@0: IF(HAVE_FENV_H) rlm@0: CHECK_LIBRARY_EXISTS(m fesetround "" HAVE_FESETROUND) rlm@0: ENDIF() rlm@0: IF(HAVE_SQRTF OR HAVE_ACOSF OR HAVE_ATANF OR HAVE_FABSF OR HAVE_FESETROUND) rlm@0: SET(EXTRA_LIBS m ${EXTRA_LIBS}) rlm@0: ENDIF() rlm@0: CHECK_FUNCTION_EXISTS(strtof HAVE_STRTOF) rlm@0: CHECK_FUNCTION_EXISTS(_controlfp HAVE__CONTROLFP) rlm@0: rlm@0: CHECK_FUNCTION_EXISTS(stat HAVE_STAT) rlm@0: CHECK_FUNCTION_EXISTS(strcasecmp HAVE_STRCASECMP) rlm@0: IF(NOT HAVE_STRCASECMP) rlm@0: CHECK_FUNCTION_EXISTS(_stricmp HAVE__STRICMP) rlm@0: IF(NOT HAVE__STRICMP) rlm@0: MESSAGE(FATAL_ERROR "No case-insensitive compare function found, please report!") rlm@0: ENDIF() rlm@0: rlm@0: ADD_DEFINITIONS(-Dstrcasecmp=_stricmp) rlm@0: ENDIF() rlm@0: rlm@0: CHECK_FUNCTION_EXISTS(strncasecmp HAVE_STRNCASECMP) rlm@0: IF(NOT HAVE_STRNCASECMP) rlm@0: CHECK_FUNCTION_EXISTS(_strnicmp HAVE__STRNICMP) rlm@0: IF(NOT HAVE__STRNICMP) rlm@0: MESSAGE(FATAL_ERROR "No case-insensitive size-limitted compare function found, please report!") rlm@0: ENDIF() rlm@0: rlm@0: ADD_DEFINITIONS(-Dstrncasecmp=_strnicmp) rlm@0: ENDIF() rlm@0: rlm@0: CHECK_FUNCTION_EXISTS(snprintf HAVE_SNPRINTF) rlm@0: IF(NOT HAVE_SNPRINTF) rlm@0: CHECK_FUNCTION_EXISTS(_snprintf HAVE__SNPRINTF) rlm@0: IF(NOT HAVE__SNPRINTF) rlm@0: MESSAGE(FATAL_ERROR "No snprintf function found, please report!") rlm@0: ENDIF() rlm@0: rlm@0: ADD_DEFINITIONS(-Dsnprintf=_snprintf) rlm@0: ENDIF() rlm@0: rlm@0: CHECK_FUNCTION_EXISTS(vsnprintf HAVE_VSNPRINTF) rlm@0: IF(NOT HAVE_VSNPRINTF) rlm@0: CHECK_FUNCTION_EXISTS(_vsnprintf HAVE__VSNPRINTF) rlm@0: IF(NOT HAVE__VSNPRINTF) rlm@0: MESSAGE(FATAL_ERROR "No vsnprintf function found, please report!") rlm@0: ENDIF() rlm@0: rlm@0: ADD_DEFINITIONS(-Dvsnprintf=_vsnprintf) rlm@0: ENDIF() rlm@0: rlm@0: CHECK_SYMBOL_EXISTS(isfinite math.h HAVE_ISFINITE) rlm@0: IF(NOT HAVE_ISFINITE) rlm@0: CHECK_FUNCTION_EXISTS(finite HAVE_FINITE) rlm@0: IF(NOT HAVE_FINITE) rlm@0: CHECK_FUNCTION_EXISTS(_finite HAVE__FINITE) rlm@0: IF(NOT HAVE__FINITE) rlm@0: MESSAGE(FATAL_ERROR "No isfinite function found, please report!") rlm@0: ENDIF() rlm@0: ADD_DEFINITIONS(-Disfinite=_finite) rlm@0: ELSE() rlm@0: ADD_DEFINITIONS(-Disfinite=finite) rlm@0: ENDIF() rlm@0: ENDIF() rlm@0: rlm@0: CHECK_SYMBOL_EXISTS(isnan math.h HAVE_ISNAN) rlm@0: IF(NOT HAVE_ISNAN) rlm@0: CHECK_FUNCTION_EXISTS(_isnan HAVE__ISNAN) rlm@0: IF(NOT HAVE__ISNAN) rlm@0: MESSAGE(FATAL_ERROR "No isnan function found, please report!") rlm@0: ENDIF() rlm@0: rlm@0: ADD_DEFINITIONS(-Disnan=_isnan) rlm@0: ENDIF() rlm@0: rlm@0: rlm@0: # Check for the dlopen API (for dynamicly loading backend libs) rlm@0: IF(DLOPEN) rlm@0: CHECK_INCLUDE_FILE(dlfcn.h HAVE_DLFCN_H) rlm@0: IF(HAVE_DLFCN_H) rlm@0: CHECK_LIBRARY_EXISTS(dl dlopen "" HAVE_LIBDL) rlm@0: IF(HAVE_LIBDL) rlm@0: SET(EXTRA_LIBS dl ${EXTRA_LIBS}) rlm@0: ENDIF() rlm@0: ENDIF() rlm@0: ENDIF() rlm@0: rlm@0: # Check if we have Windows headers rlm@0: CHECK_INCLUDE_FILE(windows.h HAVE_WINDOWS_H -D_WIN32_WINNT=0x0500) rlm@0: IF(NOT HAVE_WINDOWS_H) rlm@0: CHECK_FUNCTION_EXISTS(gettimeofday HAVE_GETTIMEOFDAY) rlm@0: IF(NOT HAVE_GETTIMEOFDAY) rlm@0: MESSAGE(FATAL_ERROR "No timing function found!") rlm@0: ENDIF() rlm@0: rlm@0: CHECK_FUNCTION_EXISTS(nanosleep HAVE_NANOSLEEP) rlm@0: IF(NOT HAVE_NANOSLEEP) rlm@0: MESSAGE(FATAL_ERROR "No sleep function found!") rlm@0: ENDIF() rlm@0: rlm@0: CHECK_C_COMPILER_FLAG(-pthread HAVE_PTHREAD) rlm@0: IF(HAVE_PTHREAD) rlm@0: ADD_DEFINITIONS(-pthread) rlm@0: SET(EXTRA_LIBS ${EXTRA_LIBS} -pthread) rlm@0: ENDIF() rlm@0: rlm@0: # We need pthreads outside of Windows rlm@0: CHECK_INCLUDE_FILE(pthread.h HAVE_PTHREAD_H) rlm@0: IF(NOT HAVE_PTHREAD_H) rlm@0: MESSAGE(FATAL_ERROR "PThreads is required for non-Windows builds!") rlm@0: ENDIF() rlm@0: # Some systems need pthread_np.h to get recursive mutexes rlm@0: CHECK_INCLUDE_FILES("pthread.h;pthread_np.h" HAVE_PTHREAD_NP_H) rlm@0: rlm@0: # _GNU_SOURCE is needed on some systems for extra attributes, and rlm@0: # _REENTRANT is needed for libc thread-safety rlm@0: ADD_DEFINITIONS(-D_GNU_SOURCE=1) rlm@0: CHECK_LIBRARY_EXISTS(pthread pthread_create "" HAVE_LIBPTHREAD) rlm@0: IF(HAVE_LIBPTHREAD) rlm@0: SET(EXTRA_LIBS pthread ${EXTRA_LIBS}) rlm@0: ENDIF() rlm@0: rlm@0: CHECK_LIBRARY_EXISTS(pthread pthread_setschedparam "" HAVE_PTHREAD_SETSCHEDPARAM) rlm@0: rlm@0: CHECK_LIBRARY_EXISTS(rt clock_gettime "" HAVE_LIBRT) rlm@0: IF(HAVE_LIBRT) rlm@0: SET(EXTRA_LIBS rt ${EXTRA_LIBS}) rlm@0: ENDIF() rlm@0: ENDIF() rlm@0: rlm@0: # Check for a 64-bit type rlm@0: CHECK_INCLUDE_FILE(stdint.h HAVE_STDINT_H) rlm@0: IF(NOT HAVE_STDINT_H) rlm@0: IF(HAVE_WINDOWS_H) rlm@0: CHECK_C_SOURCE_COMPILES("\#define _WIN32_WINNT 0x0500 rlm@0: \#include rlm@0: __int64 foo; rlm@0: int main() {return 0;}" HAVE___INT64) rlm@0: ENDIF() rlm@0: IF(NOT HAVE___INT64) rlm@0: IF(NOT SIZEOF_LONG MATCHES "8") rlm@0: IF(NOT SIZEOF_LONG_LONG MATCHES "8") rlm@0: MESSAGE(FATAL_ERROR "No 64-bit types found, please report!") rlm@0: ENDIF() rlm@0: ENDIF() rlm@0: ENDIF() rlm@0: ENDIF() rlm@0: rlm@0: # Windows needs winmm for timeGetTime, even if the backend is disabled rlm@0: CHECK_SHARED_FUNCTION_EXISTS(timeGetTime "windows.h;mmsystem.h" winmm "" HAVE_LIBWINMM) rlm@0: IF(HAVE_LIBWINMM) rlm@0: SET(EXTRA_LIBS winmm ${EXTRA_LIBS}) rlm@0: SET(PKG_CONFIG_LIBS ${PKG_CONFIG_LIBS} -lwinmm) rlm@0: ENDIF() rlm@0: rlm@0: rlm@0: SET(OPENAL_OBJS OpenAL32/alAuxEffectSlot.c rlm@0: OpenAL32/alBuffer.c rlm@0: OpenAL32/alEffect.c rlm@0: OpenAL32/alError.c rlm@0: OpenAL32/alExtension.c rlm@0: OpenAL32/alFilter.c rlm@0: OpenAL32/alListener.c rlm@0: OpenAL32/alSource.c rlm@0: OpenAL32/alState.c rlm@0: OpenAL32/alThunk.c rlm@0: ) rlm@0: SET(ALC_OBJS Alc/ALc.c rlm@0: Alc/ALu.c rlm@0: Alc/alcConfig.c rlm@0: Alc/alcDedicated.c rlm@0: Alc/alcEcho.c rlm@0: Alc/alcModulator.c rlm@0: Alc/alcReverb.c rlm@0: Alc/alcRing.c rlm@0: Alc/alcThread.c rlm@0: Alc/bs2b.c rlm@0: Alc/helpers.c rlm@0: Alc/hrtf.c rlm@0: Alc/mixer.c rlm@0: Alc/panning.c rlm@0: # Default backends, always available rlm@0: Alc/backends/loopback.c rlm@0: Alc/backends/null.c rlm@0: # RLM: add record device rlm@0: Alc/backends/record.c rlm@0: ) rlm@0: rlm@0: SET(BACKENDS "") rlm@0: SET(HAVE_ALSA 0) rlm@0: SET(HAVE_OSS 0) rlm@0: SET(HAVE_SOLARIS 0) rlm@0: SET(HAVE_SNDIO 0) rlm@0: SET(HAVE_DSOUND 0) rlm@0: SET(HAVE_WINMM 0) rlm@0: SET(HAVE_PORTAUDIO 0) rlm@0: SET(HAVE_PULSEAUDIO 0) rlm@0: SET(HAVE_COREAUDIO 0) rlm@0: SET(HAVE_OPENSL 0) rlm@0: SET(HAVE_WAVE 0) rlm@0: rlm@0: rlm@0: # Check for MMDevApi backend rlm@0: IF(HAVE_WINDOWS_H) rlm@0: IF(MMDEVAPI) rlm@0: CHECK_INCLUDE_FILE(mmdeviceapi.h HAVE_MMDEVICEAPI_H) rlm@0: IF(HAVE_MMDEVICEAPI_H) rlm@0: SET(HAVE_MMDEVAPI 1) rlm@0: SET(ALC_OBJS ${ALC_OBJS} Alc/backends/mmdevapi.c) rlm@0: rlm@0: SET(BACKENDS "${BACKENDS} MMDevApi,") rlm@0: ENDIF() rlm@0: ENDIF() rlm@0: ENDIF() rlm@0: IF(REQUIRE_MMDEVAPI AND NOT HAVE_MMDEVAPI) rlm@0: MESSAGE(FATAL_ERROR "Failed to enabled required MMDevApi backend") rlm@0: ENDIF() rlm@0: rlm@0: rlm@0: IF(HAVE_WINDOWS_H) rlm@0: IF(WINMM) rlm@0: CHECK_INCLUDE_FILES("windows.h;mmsystem.h" HAVE_MMSYSTEM_H -D_WIN32_WINNT=0x0500) rlm@0: IF(HAVE_MMSYSTEM_H AND HAVE_LIBWINMM) rlm@0: SET(HAVE_WINMM 1) rlm@0: SET(ALC_OBJS ${ALC_OBJS} Alc/backends/winmm.c) rlm@0: SET(BACKENDS "${BACKENDS} WinMM,") rlm@0: ENDIF() rlm@0: ENDIF() rlm@0: ENDIF() rlm@0: IF(REQUIRE_WINMM AND NOT HAVE_WINMM) rlm@0: MESSAGE(FATAL_ERROR "Failed to enable required WinMM backend") rlm@0: ENDIF() rlm@0: rlm@0: # Optionally enable the Wave Writer backend rlm@0: IF(WAVE) rlm@0: SET(HAVE_WAVE 1) rlm@0: SET(ALC_OBJS ${ALC_OBJS} Alc/backends/wave.c) rlm@0: SET(BACKENDS "${BACKENDS} WaveFile,") rlm@0: ENDIF() rlm@0: rlm@0: rlm@0: # RLM: enable the record backend rlm@0: SET(ALC_OBJS ${ALC_OBJS} Alc/backends/record.c) rlm@0: SET(BACKENDS "${BACKENDS} Record,") rlm@0: rlm@0: rlm@0: # This is always available rlm@0: SET(BACKENDS "${BACKENDS} Null") rlm@0: rlm@0: # Needed for openal.pc.in rlm@0: SET(prefix ${CMAKE_INSTALL_PREFIX}) rlm@0: SET(exec_prefix "\${prefix}") rlm@0: SET(libdir "\${exec_prefix}/lib${LIB_SUFFIX}") rlm@0: SET(bindir "\${exec_prefix}/bin") rlm@0: SET(includedir "\${prefix}/include") rlm@0: SET(PACKAGE_VERSION "${LIB_VERSION}") rlm@0: rlm@0: # End configuration rlm@0: CONFIGURE_FILE( rlm@0: "${OpenAL_SOURCE_DIR}/config.h.in" rlm@0: "${OpenAL_BINARY_DIR}/config.h") rlm@0: CONFIGURE_FILE( rlm@0: "${OpenAL_SOURCE_DIR}/openal.pc.in" rlm@0: "${OpenAL_BINARY_DIR}/openal.pc" rlm@0: @ONLY) rlm@0: rlm@0: rlm@0: # RLM link jni the dumb way for now: rlm@0: INCLUDE_DIRECTORIES("/usr/lib/jvm/java-6-sun-1.6.0.20/include/") rlm@0: INCLUDE_DIRECTORIES("/usr/lib/jvm/java-6-sun-1.6.0.20/include/linux") rlm@0: rlm@0: rlm@0: # Build a library rlm@0: ADD_LIBRARY(${LIBNAME} SHARED ${OPENAL_OBJS} ${ALC_OBJS}) rlm@0: SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES DEFINE_SYMBOL AL_BUILD_LIBRARY rlm@0: COMPILE_FLAGS -DAL_ALEXT_PROTOTYPES rlm@0: VERSION ${LIB_VERSION}.0 rlm@0: SOVERSION ${LIB_MAJOR_VERSION}) rlm@0: rlm@0: rlm@0: TARGET_LINK_LIBRARIES(${LIBNAME} ${EXTRA_LIBS}) rlm@0: rlm@0: # Add an install target here rlm@0: INSTALL(TARGETS ${LIBNAME} rlm@0: RUNTIME DESTINATION bin rlm@0: LIBRARY DESTINATION "lib${LIB_SUFFIX}" rlm@0: ARCHIVE DESTINATION "lib${LIB_SUFFIX}" rlm@0: ) rlm@0: INSTALL(FILES include/AL/al.h rlm@0: include/AL/alc.h rlm@0: include/AL/alext.h rlm@0: include/AL/efx.h rlm@0: include/AL/efx-creative.h rlm@0: DESTINATION include/AL rlm@0: ) rlm@0: INSTALL(FILES "${OpenAL_BINARY_DIR}/openal.pc" rlm@0: DESTINATION "lib${LIB_SUFFIX}/pkgconfig") rlm@0: rlm@0: rlm@0: MESSAGE(STATUS "") rlm@0: MESSAGE(STATUS "Building OpenAL with support for the following backends:") rlm@0: MESSAGE(STATUS " ${BACKENDS}") rlm@0: MESSAGE(STATUS "") rlm@0: rlm@0: # Install alsoft.conf configuration file rlm@0: rlm@0: IF(UTILS) rlm@0: ADD_EXECUTABLE(openal-info utils/openal-info.c) rlm@0: TARGET_LINK_LIBRARIES(openal-info ${LIBNAME}) rlm@0: INSTALL(TARGETS openal-info rlm@0: RUNTIME DESTINATION bin rlm@0: LIBRARY DESTINATION "lib${LIB_SUFFIX}" rlm@0: ARCHIVE DESTINATION "lib${LIB_SUFFIX}" rlm@0: ) rlm@0: MESSAGE(STATUS "Building utility programs") rlm@0: MESSAGE(STATUS "") rlm@0: ENDIF() rlm@0: rlm@0: