Add AL_LOKI_WAVE_format tokens to alext.h
[openal-soft/openal-hmr.git] / CMakeLists.txt
blob7a43b25087d85f72aa81e4483668c46119cab915
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)
18 PROJECT(OpenAL C)
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(DSOUND  "Check for DirectSound backend"         ON)
27 OPTION(WINMM   "Check for Windows Multimedia backend"  ON)
29 OPTION(DLOPEN  "Check for the dlopen API for loading optional libs"  ON)
31 OPTION(WERROR  "Treat compile warnings as errors"      OFF)
33 OPTION(EXAMPLES  "Build example programs"              ON)
36 SET(LIB_MAJOR_VERSION "1")
37 SET(LIB_MINOR_VERSION "4")
38 SET(LIB_BUILD_VERSION "272")
39 SET(LIB_VERSION "${LIB_MAJOR_VERSION}.${LIB_MINOR_VERSION}.${LIB_BUILD_VERSION}")
40 IF(NOT DEFINED LIB_INSTALL_DIR)
41   SET(LIB_INSTALL_DIR "lib")
42 ENDIF(NOT DEFINED LIB_INSTALL_DIR)
45 CHECK_TYPE_SIZE("long" SIZEOF_LONG)
46 CHECK_TYPE_SIZE("long long" SIZEOF_LONG_LONG)
47 CHECK_TYPE_SIZE("unsigned int" SIZEOF_UINT)
48 CHECK_TYPE_SIZE("void*" SIZEOF_VOIDP)
51 # Add definitions, compiler switches, etc.
52 INCLUDE_DIRECTORIES(OpenAL32/Include include "${OpenAL_BINARY_DIR}")
54 IF(NOT CMAKE_BUILD_TYPE)
55     SET(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING
56         "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel."
57         FORCE)
58 ENDIF()
60 IF(MSVC)
61     # ???
62     SET(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -D_DEBUG")
63     SET(CMAKE_C_FLAGS_MINSIZEREL "${CMAKE_C_FLAGS_MINSIZEREL} -DNDEBUG")
64     SET(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -DNDEBUG")
65     SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -D_DEBUG")
66 ELSE()
67     ADD_DEFINITIONS(-Wall)
68     CHECK_C_COMPILER_FLAG(-Wextra HAVE_W_EXTRA)
69     IF("${HAVE_W_EXTRA}")
70         ADD_DEFINITIONS(-Wextra)
71     ENDIF()
73     IF(WERROR)
74         ADD_DEFINITIONS(-Werror)
75     ENDIF()
77     SET(CMAKE_C_FLAGS_RELWITHDEBINFO "-g -O2 -funroll-loops -D_DEBUG" CACHE STRING
78         "Flags used by the compiler during Release with Debug Info builds."
79         FORCE)
80     SET(CMAKE_C_FLAGS_MINSIZEREL "-Os -DNDEBUG" CACHE STRING
81         "Flags used by the compiler during release minsize builds."
82         FORCE)
83     SET(CMAKE_C_FLAGS_RELEASE "-O2 -funroll-loops -fomit-frame-pointer -DNDEBUG" CACHE STRING
84         "Flags used by the compiler during release builds"
85         FORCE)
86     SET(CMAKE_C_FLAGS_DEBUG "-g3 -D_DEBUG" CACHE STRING
87         "Flags used by the compiler during debug builds."
88         FORCE)
90     # Set visibility options if available
91     IF(NOT WIN32)
92         CHECK_C_SOURCE_COMPILES("int foo() __attribute__((destructor));
93                                  int main() {return 0;}" HAVE_GCC_DESTRUCTOR)
95         CHECK_C_COMPILER_FLAG(-fvisibility=hidden HAVE_VISIBILITY_SWITCH)
96         IF("${HAVE_VISIBILITY_SWITCH}")
97             CHECK_C_SOURCE_COMPILES("int foo() __attribute__((visibility(\"default\")));
98                                      int main() {return 0;}" HAVE_GCC_VISIBILITY)
99             IF("${HAVE_GCC_VISIBILITY}")
100                 ADD_DEFINITIONS(-fvisibility=hidden -DHAVE_GCC_VISIBILITY)
101             ENDIF()
102         ENDIF()
103     ENDIF()
104 ENDIF()
107 CHECK_LIBRARY_EXISTS(m  sqrtf  "" HAVE_SQRTF)
108 CHECK_LIBRARY_EXISTS(m  acosf  "" HAVE_ACOSF)
109 IF(HAVE_SQRTF OR HAVE_ACOSF)
110     SET(EXTRA_LIBS m ${EXTRA_LIBS})
111 ENDIF()
112 CHECK_FUNCTION_EXISTS(strtof HAVE_STRTOF)
114 CHECK_FUNCTION_EXISTS(strcasecmp HAVE_STRCASECMP)
115 IF(NOT HAVE_STRCASECMP)
116     CHECK_FUNCTION_EXISTS(_stricmp HAVE__STRICMP)
117     IF(NOT HAVE__STRICMP)
118         MESSAGE(FATAL_ERROR "No case-insensitive compare function found, please report!")
119     ENDIF()
121     ADD_DEFINITIONS(-Dstrcasecmp=_stricmp)
122 ENDIF()
124 CHECK_FUNCTION_EXISTS(strncasecmp HAVE_STRNCASECMP)
125 IF(NOT HAVE_STRNCASECMP)
126     CHECK_FUNCTION_EXISTS(_strnicmp HAVE__STRNICMP)
127     IF(NOT HAVE__STRNICMP)
128         MESSAGE(FATAL_ERROR "No case-insensitive size-limitted compare function found, please report!")
129     ENDIF()
131     ADD_DEFINITIONS(-Dstrncasecmp=_strnicmp)
132 ENDIF()
134 CHECK_FUNCTION_EXISTS(snprintf HAVE_SNPRINTF)
135 IF(NOT HAVE_SNPRINTF)
136     CHECK_FUNCTION_EXISTS(_snprintf HAVE__SNPRINTF)
137     IF(NOT HAVE__SNPRINTF)
138         MESSAGE(FATAL_ERROR "No snprintf function found, please report!")
139     ENDIF()
141     ADD_DEFINITIONS(-Dsnprintf=_snprintf)
142 ENDIF()
144 # Check for the dlopen API (for dynamicly loading backend libs)
145 IF(DLOPEN)
146     CHECK_INCLUDE_FILE(dlfcn.h HAVE_DLFCN_H)
147     IF(HAVE_DLFCN_H)
148         CHECK_LIBRARY_EXISTS(dl dlopen "" HAVE_LIBDL)
149         IF(HAVE_LIBDL)
150             SET(EXTRA_LIBS dl ${EXTRA_LIBS})
151         ENDIF()
152     ENDIF()
153 ENDIF()
155 # Check if we have Windows headers
156 CHECK_INCLUDE_FILE(windows.h HAVE_WINDOWS_H -D_WIN32_WINNT=0x0500)
157 IF(NOT HAVE_WINDOWS_H)
158     CHECK_FUNCTION_EXISTS(gettimeofday HAVE_GETTIMEOFDAY)
159     IF(NOT HAVE_GETTIMEOFDAY)
160         MESSAGE(FATAL_ERROR "No timing function found!")
161     ENDIF()
163     CHECK_FUNCTION_EXISTS(nanosleep HAVE_NANOSLEEP)
164     IF(NOT HAVE_NANOSLEEP)
165         MESSAGE(FATAL_ERROR "No sleep function found!")
166     ENDIF()
168     # We need pthreads outside of Windows
169     CHECK_INCLUDE_FILE(pthread.h HAVE_PTHREAD_H)
170     IF(NOT HAVE_PTHREAD_H)
171         MESSAGE(FATAL_ERROR "PThreads is required for non-Windows builds!")
172     ENDIF()
174     # Some systems need pthread_np.h to get recursive mutexes
175     CHECK_INCLUDE_FILES("pthread.h;pthread_np.h" HAVE_PTHREAD_NP_H)
177     # _GNU_SOURCE is needed on some systems for extra attributes, and
178     # _REENTRANT is needed for libc thread-safety
179     ADD_DEFINITIONS(-D_GNU_SOURCE=1 -D_REENTRANT)
180     CHECK_LIBRARY_EXISTS(pthread pthread_create "" HAVE_LIBPTHREAD)
181     IF(HAVE_LIBPTHREAD)
182         SET(EXTRA_LIBS pthread ${EXTRA_LIBS})
183     ENDIF()
184 ENDIF()
186 # Check for a 64-bit type
187 CHECK_INCLUDE_FILE(stdint.h HAVE_STDINT_H)
188 IF(NOT HAVE_STDINT_H)
189     IF(HAVE_WINDOWS_H)
190         CHECK_C_SOURCE_COMPILES("\#define _WIN32_WINNT 0x0500
191                                  \#include <windows.h>
192                                  __int64 foo;
193                                  int main() {return 0;}" HAVE___INT64)
194     ENDIF()
195     IF(NOT HAVE___INT64)
196         IF(NOT SIZEOF_LONG MATCHES "8")
197             IF(NOT SIZEOF_LONG_LONG MATCHES "8")
198                 MESSAGE(FATAL_ERROR "No 64-bit types found, please report!")
199             ENDIF()
200         ENDIF()
201     ENDIF()
202 ENDIF()
205 SET(OPENAL_OBJS  OpenAL32/alAuxEffectSlot.c
206                  OpenAL32/alBuffer.c
207                  OpenAL32/alEffect.c
208                  OpenAL32/alError.c
209                  OpenAL32/alExtension.c
210                  OpenAL32/alFilter.c
211                  OpenAL32/alListener.c
212                  OpenAL32/alSource.c
213                  OpenAL32/alState.c
214                  OpenAL32/alThunk.c
216 SET(ALC_OBJS  Alc/ALc.c
217               Alc/ALu.c
218               Alc/alcConfig.c
219               Alc/alcRing.c
220               Alc/alcThread.c
221               Alc/bs2b.c
222               Alc/wave.c
225 SET(BACKENDS "")
227 # Check ALSA backend
228 IF(ALSA)
229     CHECK_INCLUDE_FILE(alsa/asoundlib.h HAVE_ALSA_ASOUNDLIB_H)
230     IF(HAVE_ALSA_ASOUNDLIB_H)
231         CHECK_LIBRARY_EXISTS(asound snd_pcm_open "" HAVE_LIBASOUND)
232         IF(HAVE_DLFCN_H OR HAVE_LIBASOUND)
233             SET(HAVE_ALSA 1)
234             SET(ALC_OBJS  ${ALC_OBJS} Alc/alsa.c)
235             IF(HAVE_DLFCN_H)
236                 SET(BACKENDS  "${BACKENDS} ALSA,")
237             ELSE()
238                 SET(BACKENDS  "${BACKENDS} ALSA \(linked\),")
239                 SET(EXTRA_LIBS asound ${EXTRA_LIBS})
240             ENDIF()
241         ENDIF()
242     ENDIF()
243 ENDIF()
245 # Check OSS backend
246 IF(OSS)
247     CHECK_INCLUDE_FILE(sys/soundcard.h HAVE_SYS_SOUNDCARD_H)
248     IF(HAVE_SYS_SOUNDCARD_H)
249         SET(HAVE_OSS 1)
250         SET(ALC_OBJS  ${ALC_OBJS} Alc/oss.c)
251         SET(BACKENDS  "${BACKENDS} OSS,")
252     ENDIF()
253 ENDIF()
255 # Check DSound/MMSystem backend
256 IF(HAVE_WINDOWS_H)
257     IF(DSOUND)
258         CHECK_INCLUDE_FILE(dsound.h HAVE_DSOUND_H)
259         IF(HAVE_DSOUND_H)
260             SET(HAVE_DSOUND 1)
261             SET(ALC_OBJS  ${ALC_OBJS} Alc/dsound.c)
262             SET(BACKENDS  "${BACKENDS} DirectSound,")
264             SET(CMAKE_REQUIRED_LIBRARIES dsound)
265             CHECK_C_SOURCE_COMPILES("int main() {return 0;}" HAVE_LIBDSOUND)
266             SET(CMAKE_REQUIRED_LIBRARIES "")
267 #            CHECK_LIBRARY_EXISTS(dsound DirectSoundCreate "" HAVE_LIBDSOUND)
268             IF(HAVE_LIBDSOUND)
269                 SET(EXTRA_LIBS dsound ${EXTRA_LIBS})
270             ENDIF()
271         ENDIF()
272     ENDIF()
273     IF(WINMM)
274         CHECK_INCLUDE_FILES("windows.h;mmsystem.h" HAVE_MMSYSTEM_H -D_WIN32_WINNT=0x0500)
275         IF(HAVE_MMSYSTEM_H)
276             SET(HAVE_WINMM 1)
277             SET(ALC_OBJS  ${ALC_OBJS} Alc/winmm.c)
278             SET(BACKENDS  "${BACKENDS} WinMM,")
280             SET(CMAKE_REQUIRED_LIBRARIES winmm)
281             CHECK_C_SOURCE_COMPILES("int main() {return 0;}" HAVE_LIBWINMM)
282             SET(CMAKE_REQUIRED_LIBRARIES "")
283 #            CHECK_LIBRARY_EXISTS(winmm waveInOpen "" HAVE_LIBWINMM)
284             IF(HAVE_LIBWINMM)
285                 SET(EXTRA_LIBS winmm ${EXTRA_LIBS})
286             ENDIF()
287         ENDIF()
288     ENDIF()
289 ENDIF()
291 # This is always available
292 SET(BACKENDS  "${BACKENDS} WaveFile")
294 # End configuration
295 CONFIGURE_FILE(
296     "${OpenAL_SOURCE_DIR}/config.h.in"
297     "${OpenAL_BINARY_DIR}/config.h")
299 ADD_DEFINITIONS(-DAL_BUILD_LIBRARY)
301 # Build a shared library
302 IF(WIN32)
303     SET(LIBNAME openal32)
304 ELSE()
305     SET(LIBNAME openal)
306 ENDIF()
308 ADD_LIBRARY(${LIBNAME} SHARED ${OPENAL_OBJS} ${ALC_OBJS})
309 SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES VERSION ${LIB_VERSION}
310                                             SOVERSION ${LIB_MAJOR_VERSION})
311 IF(WIN32)
312     SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES PREFIX "")
313 ENDIF()
315 TARGET_LINK_LIBRARIES(${LIBNAME} ${EXTRA_LIBS})
317 # Add an install target here
318 INSTALL(TARGETS ${LIBNAME}
319         RUNTIME DESTINATION bin
320         LIBRARY DESTINATION ${LIB_INSTALL_DIR}
321         ARCHIVE DESTINATION ${LIB_INSTALL_DIR}
323 INSTALL(FILES include/AL/al.h
324               include/AL/alc.h
325               include/AL/alext.h
326         DESTINATION include/AL
329 IF(EXAMPLES)
330     ADD_EXECUTABLE(openal-info examples/openal-info.c)
331     TARGET_LINK_LIBRARIES(openal-info ${LIBNAME})
332     INSTALL(TARGETS openal-info
333             RUNTIME DESTINATION bin
334             LIBRARY DESTINATION ${LIB_INSTALL_DIR}
335             ARCHIVE DESTINATION ${LIB_INSTALL_DIR}
336     )
337 ENDIF()
339 MESSAGE(STATUS "")
340 MESSAGE(STATUS "Building OpenAL with support for the following backends:")
341 MESSAGE(STATUS "    ${BACKENDS}")
342 MESSAGE(STATUS "")