Remove the SDL backend
[openal-soft.git] / CMakeLists.txt
blob784713d2e339e4ce12df9b5685f387a9ac8add01
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(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(PORTAUDIO "Check for PortAudio 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)
38 IF(WIN32)
39     SET(LIBNAME OpenAL32)
40     ADD_DEFINITIONS("-D_WIN32")
41 ELSE()
42     SET(LIBNAME openal)
43 ENDIF()
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."
66         FORCE)
67 ENDIF()
68 IF(NOT CMAKE_DEBUG_POSTFIX)
69     SET(CMAKE_DEBUG_POSTFIX "" CACHE STRING
70         "Library postfix for debug builds. Normally left blank."
71         FORCE)
72 ENDIF()
74 IF(MSVC)
75     # ???
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")
80 ELSE()
81     ADD_DEFINITIONS(-Wall)
82     CHECK_C_COMPILER_FLAG(-Wextra HAVE_W_EXTRA)
83     IF(HAVE_W_EXTRA)
84         ADD_DEFINITIONS(-Wextra)
85     ENDIF()
87     IF(WERROR)
88         ADD_DEFINITIONS(-Werror)
89     ENDIF()
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."
93         FORCE)
94     SET(CMAKE_C_FLAGS_MINSIZEREL "-Os -DNDEBUG" CACHE STRING
95         "Flags used by the compiler during release minsize builds."
96         FORCE)
97     SET(CMAKE_C_FLAGS_RELEASE "-O2 -funroll-loops -fomit-frame-pointer -DNDEBUG" CACHE STRING
98         "Flags used by the compiler during release builds"
99         FORCE)
100     SET(CMAKE_C_FLAGS_DEBUG "-g3 -D_DEBUG" CACHE STRING
101         "Flags used by the compiler during debug builds."
102         FORCE)
104     # Set visibility options if available
105     IF(NOT WIN32)
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)
115             ENDIF()
116         ENDIF()
117     ENDIF()
118 ENDIF()
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)
125 CHECK_LIBRARY_EXISTS(m  atanf  "" HAVE_ATANF)
126 CHECK_LIBRARY_EXISTS(m  fabsf  "" HAVE_FABSF)
127 IF(HAVE_FENV_H)
128     CHECK_LIBRARY_EXISTS(m  fesetround  "" HAVE_FESETROUND)
129 ENDIF()
130 IF(HAVE_SQRTF OR HAVE_ACOSF OR HAVE_ATANF OR HAVE_FABSF OR HAVE_FESETROUND)
131     SET(EXTRA_LIBS m ${EXTRA_LIBS})
132 ENDIF()
133 CHECK_FUNCTION_EXISTS(strtof HAVE_STRTOF)
134 CHECK_FUNCTION_EXISTS(_controlfp HAVE__CONTROLFP)
136 CHECK_FUNCTION_EXISTS(strcasecmp HAVE_STRCASECMP)
137 IF(NOT HAVE_STRCASECMP)
138     CHECK_FUNCTION_EXISTS(_stricmp HAVE__STRICMP)
139     IF(NOT HAVE__STRICMP)
140         MESSAGE(FATAL_ERROR "No case-insensitive compare function found, please report!")
141     ENDIF()
143     ADD_DEFINITIONS(-Dstrcasecmp=_stricmp)
144 ENDIF()
146 CHECK_FUNCTION_EXISTS(strncasecmp HAVE_STRNCASECMP)
147 IF(NOT HAVE_STRNCASECMP)
148     CHECK_FUNCTION_EXISTS(_strnicmp HAVE__STRNICMP)
149     IF(NOT HAVE__STRNICMP)
150         MESSAGE(FATAL_ERROR "No case-insensitive size-limitted compare function found, please report!")
151     ENDIF()
153     ADD_DEFINITIONS(-Dstrncasecmp=_strnicmp)
154 ENDIF()
156 CHECK_FUNCTION_EXISTS(snprintf HAVE_SNPRINTF)
157 IF(NOT HAVE_SNPRINTF)
158     CHECK_FUNCTION_EXISTS(_snprintf HAVE__SNPRINTF)
159     IF(NOT HAVE__SNPRINTF)
160         MESSAGE(FATAL_ERROR "No snprintf function found, please report!")
161     ENDIF()
163     ADD_DEFINITIONS(-Dsnprintf=_snprintf)
164 ENDIF()
166 # Check for the dlopen API (for dynamicly loading backend libs)
167 IF(DLOPEN)
168     CHECK_INCLUDE_FILE(dlfcn.h HAVE_DLFCN_H)
169     IF(HAVE_DLFCN_H)
170         CHECK_LIBRARY_EXISTS(dl dlopen "" HAVE_LIBDL)
171         IF(HAVE_LIBDL)
172             SET(EXTRA_LIBS dl ${EXTRA_LIBS})
173         ENDIF()
174     ENDIF()
175 ENDIF()
177 # Check if we have Windows headers
178 CHECK_INCLUDE_FILE(windows.h HAVE_WINDOWS_H -D_WIN32_WINNT=0x0500)
179 IF(NOT HAVE_WINDOWS_H)
180     CHECK_FUNCTION_EXISTS(gettimeofday HAVE_GETTIMEOFDAY)
181     IF(NOT HAVE_GETTIMEOFDAY)
182         MESSAGE(FATAL_ERROR "No timing function found!")
183     ENDIF()
185     CHECK_FUNCTION_EXISTS(nanosleep HAVE_NANOSLEEP)
186     IF(NOT HAVE_NANOSLEEP)
187         MESSAGE(FATAL_ERROR "No sleep function found!")
188     ENDIF()
190     # We need pthreads outside of Windows
191     CHECK_INCLUDE_FILE(pthread.h HAVE_PTHREAD_H)
192     IF(NOT HAVE_PTHREAD_H)
193         MESSAGE(FATAL_ERROR "PThreads is required for non-Windows builds!")
194     ENDIF()
196     # Some systems need pthread_np.h to get recursive mutexes
197     CHECK_INCLUDE_FILES("pthread.h;pthread_np.h" HAVE_PTHREAD_NP_H)
199     # _GNU_SOURCE is needed on some systems for extra attributes, and
200     # _REENTRANT is needed for libc thread-safety
201     ADD_DEFINITIONS(-D_GNU_SOURCE=1 -D_REENTRANT)
202     CHECK_LIBRARY_EXISTS(pthread pthread_create "" HAVE_LIBPTHREAD)
203     IF(HAVE_LIBPTHREAD)
204         SET(EXTRA_LIBS pthread ${EXTRA_LIBS})
205     ENDIF()
206 ENDIF()
208 # Check for a 64-bit type
209 CHECK_INCLUDE_FILE(stdint.h HAVE_STDINT_H)
210 IF(NOT HAVE_STDINT_H)
211     IF(HAVE_WINDOWS_H)
212         CHECK_C_SOURCE_COMPILES("\#define _WIN32_WINNT 0x0500
213                                  \#include <windows.h>
214                                  __int64 foo;
215                                  int main() {return 0;}" HAVE___INT64)
216     ENDIF()
217     IF(NOT HAVE___INT64)
218         IF(NOT SIZEOF_LONG MATCHES "8")
219             IF(NOT SIZEOF_LONG_LONG MATCHES "8")
220                 MESSAGE(FATAL_ERROR "No 64-bit types found, please report!")
221             ENDIF()
222         ENDIF()
223     ENDIF()
224 ENDIF()
227 SET(OPENAL_OBJS  OpenAL32/alAuxEffectSlot.c
228                  OpenAL32/alBuffer.c
229                  OpenAL32/alEffect.c
230                  OpenAL32/alError.c
231                  OpenAL32/alExtension.c
232                  OpenAL32/alFilter.c
233                  OpenAL32/alListener.c
234                  OpenAL32/alSource.c
235                  OpenAL32/alState.c
236                  OpenAL32/alThunk.c
238 SET(ALC_OBJS  Alc/ALc.c
239               Alc/ALu.c
240               Alc/alcConfig.c
241               Alc/alcReverb.c
242               Alc/alcRing.c
243               Alc/alcThread.c
244               Alc/bs2b.c
245               Alc/wave.c
248 SET(BACKENDS "")
250 # Check ALSA backend
251 IF(ALSA)
252     CHECK_INCLUDE_FILE(alsa/asoundlib.h HAVE_ALSA_ASOUNDLIB_H)
253     IF(HAVE_ALSA_ASOUNDLIB_H)
254         CHECK_LIBRARY_EXISTS(asound snd_pcm_open "" HAVE_LIBASOUND)
255         IF(HAVE_DLFCN_H OR HAVE_LIBASOUND)
256             SET(HAVE_ALSA 1)
257             SET(ALC_OBJS  ${ALC_OBJS} Alc/alsa.c)
258             IF(HAVE_DLFCN_H)
259                 SET(BACKENDS  "${BACKENDS} ALSA,")
260             ELSE()
261                 SET(BACKENDS  "${BACKENDS} ALSA \(linked\),")
262                 SET(EXTRA_LIBS asound ${EXTRA_LIBS})
263             ENDIF()
264         ENDIF()
265     ENDIF()
266 ENDIF()
268 # Check OSS backend
269 IF(OSS)
270     CHECK_INCLUDE_FILE(sys/soundcard.h HAVE_SYS_SOUNDCARD_H)
271     IF(HAVE_SYS_SOUNDCARD_H)
272         SET(HAVE_OSS 1)
273         SET(ALC_OBJS  ${ALC_OBJS} Alc/oss.c)
274         SET(BACKENDS  "${BACKENDS} OSS,")
275     ENDIF()
276 ENDIF()
278 # Check Solaris backend
279 IF(SOLARIS)
280     CHECK_INCLUDE_FILE(sys/audioio.h HAVE_SYS_AUDIOIO_H)
281     IF(HAVE_SYS_AUDIOIO_H)
282         SET(HAVE_SOLARIS 1)
283         SET(ALC_OBJS  ${ALC_OBJS} Alc/solaris.c)
284         SET(BACKENDS  "${BACKENDS} Solaris,")
285     ENDIF()
286 ENDIF()
288 # Check DSound/MMSystem backend
289 IF(DSOUND)
290     CHECK_INCLUDE_FILE(dsound.h HAVE_DSOUND_H)
291     IF(HAVE_DSOUND_H)
292         SET(HAVE_DSOUND 1)
293         SET(ALC_OBJS  ${ALC_OBJS} Alc/dsound.c)
294         SET(BACKENDS  "${BACKENDS} DirectSound,")
296         SET(CMAKE_REQUIRED_LIBRARIES dsound)
297         CHECK_C_SOURCE_COMPILES("int main() {return 0;}" HAVE_LIBDSOUND)
298         SET(CMAKE_REQUIRED_LIBRARIES "")
299 #        CHECK_LIBRARY_EXISTS(dsound DirectSoundCreate "" HAVE_LIBDSOUND)
300         IF(HAVE_LIBDSOUND)
301             SET(EXTRA_LIBS dsound ${EXTRA_LIBS})
302         ENDIF()
303     ENDIF()
304 ENDIF()
305 IF(HAVE_WINDOWS_H)
306     IF(WINMM)
307         CHECK_INCLUDE_FILES("windows.h;mmsystem.h" HAVE_MMSYSTEM_H -D_WIN32_WINNT=0x0500)
308         IF(HAVE_MMSYSTEM_H)
309             SET(HAVE_WINMM 1)
310             SET(ALC_OBJS  ${ALC_OBJS} Alc/winmm.c)
311             SET(BACKENDS  "${BACKENDS} WinMM,")
313             SET(CMAKE_REQUIRED_LIBRARIES winmm)
314             CHECK_C_SOURCE_COMPILES("int main() {return 0;}" HAVE_LIBWINMM)
315             SET(CMAKE_REQUIRED_LIBRARIES "")
316 #            CHECK_LIBRARY_EXISTS(winmm waveInOpen "" HAVE_LIBWINMM)
317             IF(HAVE_LIBWINMM)
318                 SET(EXTRA_LIBS winmm ${EXTRA_LIBS})
319             ENDIF()
320         ENDIF()
321     ENDIF()
322 ENDIF()
324 # Check PortAudio backend
325 IF(PORTAUDIO)
326     CHECK_INCLUDE_FILE(portaudio.h HAVE_PORTAUDIO_H)
327     IF(HAVE_PORTAUDIO_H)
328         CHECK_LIBRARY_EXISTS(portaudio Pa_Initialize "" HAVE_LIBPORTAUDIO)
329         IF(HAVE_LIBPORTAUDIO)
330             SET(HAVE_PORTAUDIO 1)
331             SET(ALC_OBJS  ${ALC_OBJS} Alc/portaudio.c)
332             IF(HAVE_DLFCN_H)
333                 SET(BACKENDS  "${BACKENDS} PortAudio,")
334             ELSE()
335                 SET(BACKENDS  "${BACKENDS} PortAudio \(linked\),")
336                 SET(EXTRA_LIBS portaudio ${EXTRA_LIBS})
337             ENDIF()
338         ENDIF()
339     ENDIF()
340 ENDIF()
342 # This is always available
343 SET(BACKENDS  "${BACKENDS} WaveFile")
345 # Needed for openal.pc.in
346 SET(prefix ${CMAKE_INSTALL_PREFIX})
347 SET(exec_prefix "\${prefix}")
348 SET(libdir "\${exec_prefix}/${LIB_INSTALL_DIR}")
349 SET(bindir "\${exec_prefix}/bin")
350 SET(includedir "\${prefix}/include")
351 SET(PACKAGE_VERSION "${LIB_VERSION}")
353 # End configuration
354 CONFIGURE_FILE(
355     "${OpenAL_SOURCE_DIR}/config.h.in"
356     "${OpenAL_BINARY_DIR}/config.h")
357 CONFIGURE_FILE(
358     "${OpenAL_SOURCE_DIR}/admin/pkgconfig/openal.pc.in"
359     "${OpenAL_BINARY_DIR}/admin/pkgconfig/openal.pc"
360     @ONLY)
362 ADD_DEFINITIONS(-DAL_BUILD_LIBRARY)
364 # Build a library
365 IF(NOT LIBTYPE)
366     SET(LIBTYPE SHARED)
367 ENDIF()
368 ADD_LIBRARY(${LIBNAME} ${LIBTYPE} ${OPENAL_OBJS} ${ALC_OBJS})
369 SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES VERSION ${LIB_VERSION}
370                                             SOVERSION ${LIB_MAJOR_VERSION})
371 IF(WIN32)
372     SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES PREFIX "")
373 ENDIF()
375 TARGET_LINK_LIBRARIES(${LIBNAME} ${EXTRA_LIBS})
377 # Add an install target here
378 INSTALL(TARGETS ${LIBNAME}
379         RUNTIME DESTINATION bin
380         LIBRARY DESTINATION ${LIB_INSTALL_DIR}
381         ARCHIVE DESTINATION ${LIB_INSTALL_DIR}
383 INSTALL(FILES include/AL/al.h
384               include/AL/alc.h
385               include/AL/alext.h
386         DESTINATION include/AL
388 INSTALL(FILES "${OpenAL_BINARY_DIR}/admin/pkgconfig/openal.pc"
389         DESTINATION "${LIB_INSTALL_DIR}/pkgconfig")
391 IF(EXAMPLES)
392     ADD_EXECUTABLE(openal-info examples/openal-info.c)
393     TARGET_LINK_LIBRARIES(openal-info ${LIBNAME})
394     INSTALL(TARGETS openal-info
395             RUNTIME DESTINATION bin
396             LIBRARY DESTINATION ${LIB_INSTALL_DIR}
397             ARCHIVE DESTINATION ${LIB_INSTALL_DIR}
398     )
399 ENDIF()
401 MESSAGE(STATUS "")
402 MESSAGE(STATUS "Building OpenAL with support for the following backends:")
403 MESSAGE(STATUS "    ${BACKENDS}")
404 MESSAGE(STATUS "")
406 IF(WIN32)
407     IF(NOT HAVE_DSOUND)
408         MESSAGE(STATUS "WARNING: Building the Windows version without DirectSound output")
409         MESSAGE(STATUS "         This is probably NOT what you want!")
410         MESSAGE(STATUS "")
411     ENDIF()
412 ENDIF()