Release 1.8.466
[openal-soft.git] / CMakeLists.txt
blob575f29d3419ca4ae70518cc08a34e56edaad7020
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(CheckSymbolExists)
14 INCLUDE(CheckCCompilerFlag)
15 INCLUDE(CheckCSourceCompiles)
16 INCLUDE(CheckTypeSize)
19 PROJECT(OpenAL C)
22 SET(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS TRUE)
25 OPTION(ALSA    "Check for ALSA backend"                ON)
26 OPTION(OSS     "Check for OSS backend"                 ON)
27 OPTION(SOLARIS "Check for Solaris backend"             ON)
28 OPTION(DSOUND  "Check for DirectSound backend"         ON)
29 OPTION(WINMM   "Check for Windows Multimedia backend"  ON)
30 OPTION(PORTAUDIO  "Check for PortAudio backend"        ON)
31 OPTION(PULSEAUDIO "Check for PulseAudio backend"       ON)
33 OPTION(DLOPEN  "Check for the dlopen API for loading optional libs"  ON)
35 OPTION(WERROR  "Treat compile warnings as errors"      OFF)
37 OPTION(EXAMPLES  "Build example programs"              ON)
39 OPTION(ALSOFT_CONFIG "Install alsoft.conf configuration file" OFF)
42 IF(WIN32)
43     SET(LIBNAME OpenAL32)
44     ADD_DEFINITIONS("-D_WIN32")
45 ELSE()
46     SET(LIBNAME openal)
47 ENDIF()
49 SET(LIB_MAJOR_VERSION "1")
50 SET(LIB_MINOR_VERSION "8")
51 SET(LIB_BUILD_VERSION "466")
52 SET(LIB_VERSION "${LIB_MAJOR_VERSION}.${LIB_MINOR_VERSION}.${LIB_BUILD_VERSION}")
53 IF(NOT DEFINED LIB_INSTALL_DIR)
54   SET(LIB_INSTALL_DIR "lib${LIB_SUFFIX}")
55 ENDIF(NOT DEFINED LIB_INSTALL_DIR)
58 CHECK_TYPE_SIZE("long" SIZEOF_LONG)
59 CHECK_TYPE_SIZE("long long" SIZEOF_LONG_LONG)
60 CHECK_TYPE_SIZE("unsigned int" SIZEOF_UINT)
61 CHECK_TYPE_SIZE("void*" SIZEOF_VOIDP)
64 # Add definitions, compiler switches, etc.
65 INCLUDE_DIRECTORIES(OpenAL32/Include include "${OpenAL_BINARY_DIR}")
67 IF(NOT CMAKE_BUILD_TYPE)
68     SET(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING
69         "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel."
70         FORCE)
71 ENDIF()
72 IF(NOT CMAKE_DEBUG_POSTFIX)
73     SET(CMAKE_DEBUG_POSTFIX "" CACHE STRING
74         "Library postfix for debug builds. Normally left blank."
75         FORCE)
76 ENDIF()
78 IF(MSVC)
79     # ???
80     SET(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -D_DEBUG")
81     SET(CMAKE_C_FLAGS_MINSIZEREL "${CMAKE_C_FLAGS_MINSIZEREL} -DNDEBUG")
82     SET(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -DNDEBUG")
83     SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -D_DEBUG")
84     ADD_DEFINITIONS(-D_CRT_SECURE_NO_WARNINGS)
85 ELSE()
86     ADD_DEFINITIONS(-Wall)
87     CHECK_C_COMPILER_FLAG(-Wextra HAVE_W_EXTRA)
88     IF(HAVE_W_EXTRA)
89         ADD_DEFINITIONS(-Wextra)
90     ENDIF()
92     IF(WERROR)
93         ADD_DEFINITIONS(-Werror)
94     ENDIF()
96     SET(CMAKE_C_FLAGS_RELWITHDEBINFO "-g -O2 -funroll-loops -D_DEBUG" CACHE STRING
97         "Flags used by the compiler during Release with Debug Info builds."
98         FORCE)
99     SET(CMAKE_C_FLAGS_MINSIZEREL "-Os -DNDEBUG" CACHE STRING
100         "Flags used by the compiler during release minsize builds."
101         FORCE)
102     SET(CMAKE_C_FLAGS_RELEASE "-O2 -funroll-loops -fomit-frame-pointer -DNDEBUG" CACHE STRING
103         "Flags used by the compiler during release builds"
104         FORCE)
105     SET(CMAKE_C_FLAGS_DEBUG "-g3 -D_DEBUG" CACHE STRING
106         "Flags used by the compiler during debug builds."
107         FORCE)
109     # Set visibility options if available
110     IF(NOT WIN32)
111         CHECK_C_SOURCE_COMPILES("int foo() __attribute__((destructor));
112                                  int main() {return 0;}" HAVE_GCC_DESTRUCTOR)
114         CHECK_C_COMPILER_FLAG(-fvisibility=hidden HAVE_VISIBILITY_SWITCH)
115         IF(HAVE_VISIBILITY_SWITCH)
116             CHECK_C_SOURCE_COMPILES("int foo() __attribute__((visibility(\"default\")));
117                                      int main() {return 0;}" HAVE_GCC_VISIBILITY)
118             IF(HAVE_GCC_VISIBILITY)
119                 ADD_DEFINITIONS(-fvisibility=hidden -DHAVE_GCC_VISIBILITY)
120             ENDIF()
121         ENDIF()
122     ENDIF()
123 ENDIF()
125 CHECK_INCLUDE_FILE(fenv.h HAVE_FENV_H)
126 CHECK_INCLUDE_FILE(float.h HAVE_FLOAT_H)
128 CHECK_LIBRARY_EXISTS(m  sqrtf  "" HAVE_SQRTF)
129 CHECK_LIBRARY_EXISTS(m  acosf  "" HAVE_ACOSF)
130 CHECK_LIBRARY_EXISTS(m  atanf  "" HAVE_ATANF)
131 CHECK_LIBRARY_EXISTS(m  fabsf  "" HAVE_FABSF)
132 IF(HAVE_FENV_H)
133     CHECK_LIBRARY_EXISTS(m  fesetround  "" HAVE_FESETROUND)
134 ENDIF()
135 IF(HAVE_SQRTF OR HAVE_ACOSF OR HAVE_ATANF OR HAVE_FABSF OR HAVE_FESETROUND)
136     SET(EXTRA_LIBS m ${EXTRA_LIBS})
137 ENDIF()
138 CHECK_FUNCTION_EXISTS(strtof HAVE_STRTOF)
139 CHECK_FUNCTION_EXISTS(_controlfp HAVE__CONTROLFP)
141 CHECK_FUNCTION_EXISTS(strcasecmp HAVE_STRCASECMP)
142 IF(NOT HAVE_STRCASECMP)
143     CHECK_FUNCTION_EXISTS(_stricmp HAVE__STRICMP)
144     IF(NOT HAVE__STRICMP)
145         MESSAGE(FATAL_ERROR "No case-insensitive compare function found, please report!")
146     ENDIF()
148     ADD_DEFINITIONS(-Dstrcasecmp=_stricmp)
149 ENDIF()
151 CHECK_FUNCTION_EXISTS(strncasecmp HAVE_STRNCASECMP)
152 IF(NOT HAVE_STRNCASECMP)
153     CHECK_FUNCTION_EXISTS(_strnicmp HAVE__STRNICMP)
154     IF(NOT HAVE__STRNICMP)
155         MESSAGE(FATAL_ERROR "No case-insensitive size-limitted compare function found, please report!")
156     ENDIF()
158     ADD_DEFINITIONS(-Dstrncasecmp=_strnicmp)
159 ENDIF()
161 CHECK_FUNCTION_EXISTS(snprintf HAVE_SNPRINTF)
162 IF(NOT HAVE_SNPRINTF)
163     CHECK_FUNCTION_EXISTS(_snprintf HAVE__SNPRINTF)
164     IF(NOT HAVE__SNPRINTF)
165         MESSAGE(FATAL_ERROR "No snprintf function found, please report!")
166     ENDIF()
168     ADD_DEFINITIONS(-Dsnprintf=_snprintf)
169 ENDIF()
171 CHECK_FUNCTION_EXISTS(vsnprintf HAVE_VSNPRINTF)
172 IF(NOT HAVE_VSNPRINTF)
173     CHECK_FUNCTION_EXISTS(_vsnprintf HAVE__VSNPRINTF)
174     IF(NOT HAVE__VSNPRINTF)
175         MESSAGE(FATAL_ERROR "No vsnprintf function found, please report!")
176     ENDIF()
178     ADD_DEFINITIONS(-Dvsnprintf=_vsnprintf)
179 ENDIF()
181 CHECK_SYMBOL_EXISTS(isnan math.h HAVE_ISNAN)
182 IF(NOT HAVE_ISNAN)
183     CHECK_FUNCTION_EXISTS(_isnan HAVE__ISNAN)
184     IF(NOT HAVE__ISNAN)
185         MESSAGE(FATAL_ERROR "No isnan function found, please report!")
186     ENDIF()
188     ADD_DEFINITIONS(-Disnan=_isnan)
189 ENDIF()
192 # Check for the dlopen API (for dynamicly loading backend libs)
193 IF(DLOPEN)
194     CHECK_INCLUDE_FILE(dlfcn.h HAVE_DLFCN_H)
195     IF(HAVE_DLFCN_H)
196         CHECK_LIBRARY_EXISTS(dl dlopen "" HAVE_LIBDL)
197         IF(HAVE_LIBDL)
198             SET(EXTRA_LIBS dl ${EXTRA_LIBS})
199         ENDIF()
200     ENDIF()
201 ENDIF()
203 # Check if we have Windows headers
204 CHECK_INCLUDE_FILE(windows.h HAVE_WINDOWS_H -D_WIN32_WINNT=0x0500)
205 IF(NOT HAVE_WINDOWS_H)
206     CHECK_FUNCTION_EXISTS(gettimeofday HAVE_GETTIMEOFDAY)
207     IF(NOT HAVE_GETTIMEOFDAY)
208         MESSAGE(FATAL_ERROR "No timing function found!")
209     ENDIF()
211     CHECK_FUNCTION_EXISTS(nanosleep HAVE_NANOSLEEP)
212     IF(NOT HAVE_NANOSLEEP)
213         MESSAGE(FATAL_ERROR "No sleep function found!")
214     ENDIF()
216     # We need pthreads outside of Windows
217     CHECK_INCLUDE_FILE(pthread.h HAVE_PTHREAD_H)
218     IF(NOT HAVE_PTHREAD_H)
219         MESSAGE(FATAL_ERROR "PThreads is required for non-Windows builds!")
220     ENDIF()
222     # Some systems need pthread_np.h to get recursive mutexes
223     CHECK_INCLUDE_FILES("pthread.h;pthread_np.h" HAVE_PTHREAD_NP_H)
225     # _GNU_SOURCE is needed on some systems for extra attributes, and
226     # _REENTRANT is needed for libc thread-safety
227     ADD_DEFINITIONS(-D_GNU_SOURCE=1 -D_REENTRANT)
228     CHECK_LIBRARY_EXISTS(pthread pthread_create "" HAVE_LIBPTHREAD)
229     IF(HAVE_LIBPTHREAD)
230         SET(EXTRA_LIBS pthread ${EXTRA_LIBS})
231     ENDIF()
232 ENDIF()
234 # Check for a 64-bit type
235 CHECK_INCLUDE_FILE(stdint.h HAVE_STDINT_H)
236 IF(NOT HAVE_STDINT_H)
237     IF(HAVE_WINDOWS_H)
238         CHECK_C_SOURCE_COMPILES("\#define _WIN32_WINNT 0x0500
239                                  \#include <windows.h>
240                                  __int64 foo;
241                                  int main() {return 0;}" HAVE___INT64)
242     ENDIF()
243     IF(NOT HAVE___INT64)
244         IF(NOT SIZEOF_LONG MATCHES "8")
245             IF(NOT SIZEOF_LONG_LONG MATCHES "8")
246                 MESSAGE(FATAL_ERROR "No 64-bit types found, please report!")
247             ENDIF()
248         ENDIF()
249     ENDIF()
250 ENDIF()
253 SET(OPENAL_OBJS  OpenAL32/alAuxEffectSlot.c
254                  OpenAL32/alBuffer.c
255                  OpenAL32/alEffect.c
256                  OpenAL32/alError.c
257                  OpenAL32/alExtension.c
258                  OpenAL32/alFilter.c
259                  OpenAL32/alListener.c
260                  OpenAL32/alSource.c
261                  OpenAL32/alState.c
262                  OpenAL32/alThunk.c
264 SET(ALC_OBJS  Alc/ALc.c
265               Alc/ALu.c
266               Alc/alcConfig.c
267               Alc/alcEcho.c
268               Alc/alcReverb.c
269               Alc/alcRing.c
270               Alc/alcThread.c
271               Alc/bs2b.c
272               Alc/wave.c
275 SET(BACKENDS "")
277 # Check ALSA backend
278 IF(ALSA)
279     CHECK_INCLUDE_FILE(alsa/asoundlib.h HAVE_ALSA_ASOUNDLIB_H)
280     IF(HAVE_ALSA_ASOUNDLIB_H)
281         CHECK_LIBRARY_EXISTS(asound snd_pcm_open "" HAVE_LIBASOUND)
282         IF(HAVE_DLFCN_H OR HAVE_LIBASOUND)
283             SET(HAVE_ALSA 1)
284             SET(ALC_OBJS  ${ALC_OBJS} Alc/alsa.c)
285             IF(HAVE_DLFCN_H)
286                 SET(BACKENDS  "${BACKENDS} ALSA,")
287             ELSE()
288                 SET(BACKENDS  "${BACKENDS} ALSA \(linked\),")
289                 SET(EXTRA_LIBS asound ${EXTRA_LIBS})
290             ENDIF()
291         ENDIF()
292     ENDIF()
293 ENDIF()
295 # Check OSS backend
296 IF(OSS)
297     CHECK_INCLUDE_FILE(sys/soundcard.h HAVE_SYS_SOUNDCARD_H)
298     IF(HAVE_SYS_SOUNDCARD_H)
299         SET(HAVE_OSS 1)
300         SET(ALC_OBJS  ${ALC_OBJS} Alc/oss.c)
301         SET(BACKENDS  "${BACKENDS} OSS,")
302     ENDIF()
303 ENDIF()
305 # Check Solaris backend
306 IF(SOLARIS)
307     CHECK_INCLUDE_FILE(sys/audioio.h HAVE_SYS_AUDIOIO_H)
308     IF(HAVE_SYS_AUDIOIO_H)
309         SET(HAVE_SOLARIS 1)
310         SET(ALC_OBJS  ${ALC_OBJS} Alc/solaris.c)
311         SET(BACKENDS  "${BACKENDS} Solaris,")
312     ENDIF()
313 ENDIF()
315 # Check DSound/MMSystem backend
316 IF(DSOUND)
317     CHECK_INCLUDE_FILE(dsound.h HAVE_DSOUND_H)
318     IF(HAVE_DSOUND_H)
319         CHECK_LIBRARY_EXISTS(dsound DirectSoundCreate "" HAVE_LIBDSOUND)
320         IF(HAVE_LIBDSOUND OR WIN32)
321             SET(HAVE_DSOUND 1)
322             SET(ALC_OBJS  ${ALC_OBJS} Alc/dsound.c)
324             IF(WIN32)
325                 SET(BACKENDS  "${BACKENDS} DirectSound,")
326             ELSE()
327                 SET(BACKENDS  "${BACKENDS} DirectSound \(linked\),")
328                 SET(EXTRA_LIBS dsound ${EXTRA_LIBS})
329             ENDIF()
330         ENDIF()
331     ENDIF()
332 ENDIF()
333 IF(HAVE_WINDOWS_H)
334     IF(WINMM)
335         CHECK_INCLUDE_FILES("windows.h;mmsystem.h" HAVE_MMSYSTEM_H -D_WIN32_WINNT=0x0500)
336         IF(HAVE_MMSYSTEM_H)
337             SET(HAVE_WINMM 1)
338             SET(ALC_OBJS  ${ALC_OBJS} Alc/winmm.c)
339             SET(BACKENDS  "${BACKENDS} WinMM,")
341             SET(CMAKE_REQUIRED_LIBRARIES winmm)
342             CHECK_C_SOURCE_COMPILES("int main() {return 0;}" HAVE_LIBWINMM)
343             SET(CMAKE_REQUIRED_LIBRARIES "")
344 #            CHECK_LIBRARY_EXISTS(winmm waveInOpen "" HAVE_LIBWINMM)
345             IF(HAVE_LIBWINMM)
346                 SET(EXTRA_LIBS winmm ${EXTRA_LIBS})
347             ENDIF()
348         ENDIF()
349     ENDIF()
350 ENDIF()
352 # Check PortAudio backend
353 IF(PORTAUDIO)
354     CHECK_INCLUDE_FILE(portaudio.h HAVE_PORTAUDIO_H)
355     IF(HAVE_PORTAUDIO_H)
356         CHECK_LIBRARY_EXISTS(portaudio Pa_Initialize "" HAVE_LIBPORTAUDIO)
357         IF(HAVE_LIBPORTAUDIO)
358             SET(HAVE_PORTAUDIO 1)
359             SET(ALC_OBJS  ${ALC_OBJS} Alc/portaudio.c)
360             IF(HAVE_DLFCN_H)
361                 SET(BACKENDS  "${BACKENDS} PortAudio,")
362             ELSE()
363                 SET(BACKENDS  "${BACKENDS} PortAudio \(linked\),")
364                 SET(EXTRA_LIBS portaudio ${EXTRA_LIBS})
365             ENDIF()
366         ENDIF()
367     ENDIF()
368 ENDIF()
370 # Check PortAudio backend
371 IF(PULSEAUDIO)
372     CHECK_INCLUDE_FILE(pulse/pulseaudio.h HAVE_PULSE_PULSEAUDIO_H)
373     IF(HAVE_PULSE_PULSEAUDIO_H)
374         CHECK_LIBRARY_EXISTS(pulse pa_context_new "" HAVE_LIBPULSE)
375         IF(HAVE_LIBPULSE)
376             SET(HAVE_PULSEAUDIO 1)
377             SET(ALC_OBJS  ${ALC_OBJS} Alc/pulseaudio.c)
378             IF(HAVE_DLFCN_H)
379                 SET(BACKENDS  "${BACKENDS} PulseAudio,")
380             ELSE()
381                 SET(BACKENDS  "${BACKENDS} PulseAudio \(linked\),")
382                 SET(EXTRA_LIBS pulse ${EXTRA_LIBS})
383             ENDIF()
384         ENDIF()
385     ENDIF()
386 ENDIF()
388 # This is always available
389 SET(BACKENDS  "${BACKENDS} WaveFile")
391 # Needed for openal.pc.in
392 SET(prefix ${CMAKE_INSTALL_PREFIX})
393 SET(exec_prefix "\${prefix}")
394 SET(libdir "\${exec_prefix}/${LIB_INSTALL_DIR}")
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}/admin/pkgconfig/openal.pc.in"
405     "${OpenAL_BINARY_DIR}/admin/pkgconfig/openal.pc"
406     @ONLY)
408 ADD_DEFINITIONS(-DAL_BUILD_LIBRARY)
410 # Build a library
411 IF(NOT LIBTYPE)
412     SET(LIBTYPE SHARED)
413 ENDIF()
414 ADD_LIBRARY(${LIBNAME} ${LIBTYPE} ${OPENAL_OBJS} ${ALC_OBJS})
415 SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES VERSION ${LIB_VERSION}
416                                             SOVERSION ${LIB_MAJOR_VERSION})
417 IF(WIN32)
418     SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES PREFIX "")
419 ENDIF()
421 TARGET_LINK_LIBRARIES(${LIBNAME} ${EXTRA_LIBS})
423 # Add an install target here
424 INSTALL(TARGETS ${LIBNAME}
425         RUNTIME DESTINATION bin
426         LIBRARY DESTINATION ${LIB_INSTALL_DIR}
427         ARCHIVE DESTINATION ${LIB_INSTALL_DIR}
429 INSTALL(FILES include/AL/al.h
430               include/AL/alc.h
431               include/AL/alext.h
432         DESTINATION include/AL
434 INSTALL(FILES "${OpenAL_BINARY_DIR}/admin/pkgconfig/openal.pc"
435         DESTINATION "${LIB_INSTALL_DIR}/pkgconfig")
437 # Install alsoft.conf configuration file
438 IF(ALSOFT_CONFIG)
439     INSTALL(FILES alsoftrc.sample
440             DESTINATION /etc/openal
441             RENAME alsoft.conf
442     )
443 ENDIF()
445 IF(EXAMPLES)
446     ADD_EXECUTABLE(openal-info examples/openal-info.c)
447     TARGET_LINK_LIBRARIES(openal-info ${LIBNAME})
448     INSTALL(TARGETS openal-info
449             RUNTIME DESTINATION bin
450             LIBRARY DESTINATION ${LIB_INSTALL_DIR}
451             ARCHIVE DESTINATION ${LIB_INSTALL_DIR}
452     )
453 ENDIF()
455 MESSAGE(STATUS "")
456 MESSAGE(STATUS "Building OpenAL with support for the following backends:")
457 MESSAGE(STATUS "    ${BACKENDS}")
458 MESSAGE(STATUS "")
460 IF(WIN32)
461     IF(NOT HAVE_DSOUND)
462         MESSAGE(STATUS "WARNING: Building the Windows version without DirectSound output")
463         MESSAGE(STATUS "         This is probably NOT what you want!")
464         MESSAGE(STATUS "")
465     ENDIF()
466 ENDIF()