Do not open pulseaudio if it didn't load
[openal-soft.git] / CMakeLists.txt
blob780875b07304bc39dbc6d5c74c5f6e98a579f298
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)
30 OPTION(PULSEAUDIO "Check for PulseAudio backend"       ON)
32 OPTION(DLOPEN  "Check for the dlopen API for loading optional libs"  ON)
34 OPTION(WERROR  "Treat compile warnings as errors"      OFF)
36 OPTION(EXAMPLES  "Build example programs"              ON)
38 OPTION(ALSOFT_CONFIG "Install alsoft.conf configuration file" OFF)
41 IF(WIN32)
42     SET(LIBNAME OpenAL32)
43     ADD_DEFINITIONS("-D_WIN32")
44 ELSE()
45     SET(LIBNAME openal)
46 ENDIF()
48 SET(LIB_MAJOR_VERSION "1")
49 SET(LIB_MINOR_VERSION "7")
50 SET(LIB_BUILD_VERSION "411")
51 SET(LIB_VERSION "${LIB_MAJOR_VERSION}.${LIB_MINOR_VERSION}.${LIB_BUILD_VERSION}")
52 IF(NOT DEFINED LIB_INSTALL_DIR)
53   SET(LIB_INSTALL_DIR "lib${LIB_SUFFIX}")
54 ENDIF(NOT DEFINED LIB_INSTALL_DIR)
57 CHECK_TYPE_SIZE("long" SIZEOF_LONG)
58 CHECK_TYPE_SIZE("long long" SIZEOF_LONG_LONG)
59 CHECK_TYPE_SIZE("unsigned int" SIZEOF_UINT)
60 CHECK_TYPE_SIZE("void*" SIZEOF_VOIDP)
63 # Add definitions, compiler switches, etc.
64 INCLUDE_DIRECTORIES(OpenAL32/Include include "${OpenAL_BINARY_DIR}")
66 IF(NOT CMAKE_BUILD_TYPE)
67     SET(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING
68         "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel."
69         FORCE)
70 ENDIF()
71 IF(NOT CMAKE_DEBUG_POSTFIX)
72     SET(CMAKE_DEBUG_POSTFIX "" CACHE STRING
73         "Library postfix for debug builds. Normally left blank."
74         FORCE)
75 ENDIF()
77 IF(MSVC)
78     # ???
79     SET(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -D_DEBUG")
80     SET(CMAKE_C_FLAGS_MINSIZEREL "${CMAKE_C_FLAGS_MINSIZEREL} -DNDEBUG")
81     SET(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -DNDEBUG")
82     SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -D_DEBUG")
83 ELSE()
84     ADD_DEFINITIONS(-Wall)
85     CHECK_C_COMPILER_FLAG(-Wextra HAVE_W_EXTRA)
86     IF(HAVE_W_EXTRA)
87         ADD_DEFINITIONS(-Wextra)
88     ENDIF()
90     IF(WERROR)
91         ADD_DEFINITIONS(-Werror)
92     ENDIF()
94     SET(CMAKE_C_FLAGS_RELWITHDEBINFO "-g -O2 -funroll-loops -D_DEBUG" CACHE STRING
95         "Flags used by the compiler during Release with Debug Info builds."
96         FORCE)
97     SET(CMAKE_C_FLAGS_MINSIZEREL "-Os -DNDEBUG" CACHE STRING
98         "Flags used by the compiler during release minsize builds."
99         FORCE)
100     SET(CMAKE_C_FLAGS_RELEASE "-O2 -funroll-loops -fomit-frame-pointer -DNDEBUG" CACHE STRING
101         "Flags used by the compiler during release builds"
102         FORCE)
103     SET(CMAKE_C_FLAGS_DEBUG "-g3 -D_DEBUG" CACHE STRING
104         "Flags used by the compiler during debug builds."
105         FORCE)
107     # Set visibility options if available
108     IF(NOT WIN32)
109         CHECK_C_SOURCE_COMPILES("int foo() __attribute__((destructor));
110                                  int main() {return 0;}" HAVE_GCC_DESTRUCTOR)
112         CHECK_C_COMPILER_FLAG(-fvisibility=hidden HAVE_VISIBILITY_SWITCH)
113         IF(HAVE_VISIBILITY_SWITCH)
114             CHECK_C_SOURCE_COMPILES("int foo() __attribute__((visibility(\"default\")));
115                                      int main() {return 0;}" HAVE_GCC_VISIBILITY)
116             IF(HAVE_GCC_VISIBILITY)
117                 ADD_DEFINITIONS(-fvisibility=hidden -DHAVE_GCC_VISIBILITY)
118             ENDIF()
119         ENDIF()
120     ENDIF()
121 ENDIF()
123 CHECK_INCLUDE_FILE(fenv.h HAVE_FENV_H)
124 CHECK_INCLUDE_FILE(float.h HAVE_FLOAT_H)
126 CHECK_LIBRARY_EXISTS(m  sqrtf  "" HAVE_SQRTF)
127 CHECK_LIBRARY_EXISTS(m  acosf  "" HAVE_ACOSF)
128 CHECK_LIBRARY_EXISTS(m  atanf  "" HAVE_ATANF)
129 CHECK_LIBRARY_EXISTS(m  fabsf  "" HAVE_FABSF)
130 IF(HAVE_FENV_H)
131     CHECK_LIBRARY_EXISTS(m  fesetround  "" HAVE_FESETROUND)
132 ENDIF()
133 IF(HAVE_SQRTF OR HAVE_ACOSF OR HAVE_ATANF OR HAVE_FABSF OR HAVE_FESETROUND)
134     SET(EXTRA_LIBS m ${EXTRA_LIBS})
135 ENDIF()
136 CHECK_FUNCTION_EXISTS(strtof HAVE_STRTOF)
137 CHECK_FUNCTION_EXISTS(_controlfp HAVE__CONTROLFP)
139 CHECK_FUNCTION_EXISTS(strcasecmp HAVE_STRCASECMP)
140 IF(NOT HAVE_STRCASECMP)
141     CHECK_FUNCTION_EXISTS(_stricmp HAVE__STRICMP)
142     IF(NOT HAVE__STRICMP)
143         MESSAGE(FATAL_ERROR "No case-insensitive compare function found, please report!")
144     ENDIF()
146     ADD_DEFINITIONS(-Dstrcasecmp=_stricmp)
147 ENDIF()
149 CHECK_FUNCTION_EXISTS(strncasecmp HAVE_STRNCASECMP)
150 IF(NOT HAVE_STRNCASECMP)
151     CHECK_FUNCTION_EXISTS(_strnicmp HAVE__STRNICMP)
152     IF(NOT HAVE__STRNICMP)
153         MESSAGE(FATAL_ERROR "No case-insensitive size-limitted compare function found, please report!")
154     ENDIF()
156     ADD_DEFINITIONS(-Dstrncasecmp=_strnicmp)
157 ENDIF()
159 CHECK_FUNCTION_EXISTS(snprintf HAVE_SNPRINTF)
160 IF(NOT HAVE_SNPRINTF)
161     CHECK_FUNCTION_EXISTS(_snprintf HAVE__SNPRINTF)
162     IF(NOT HAVE__SNPRINTF)
163         MESSAGE(FATAL_ERROR "No snprintf function found, please report!")
164     ENDIF()
166     ADD_DEFINITIONS(-Dsnprintf=_snprintf)
167 ENDIF()
169 # Check for the dlopen API (for dynamicly loading backend libs)
170 IF(DLOPEN)
171     CHECK_INCLUDE_FILE(dlfcn.h HAVE_DLFCN_H)
172     IF(HAVE_DLFCN_H)
173         CHECK_LIBRARY_EXISTS(dl dlopen "" HAVE_LIBDL)
174         IF(HAVE_LIBDL)
175             SET(EXTRA_LIBS dl ${EXTRA_LIBS})
176         ENDIF()
177     ENDIF()
178 ENDIF()
180 # Check if we have Windows headers
181 CHECK_INCLUDE_FILE(windows.h HAVE_WINDOWS_H -D_WIN32_WINNT=0x0500)
182 IF(NOT HAVE_WINDOWS_H)
183     CHECK_FUNCTION_EXISTS(gettimeofday HAVE_GETTIMEOFDAY)
184     IF(NOT HAVE_GETTIMEOFDAY)
185         MESSAGE(FATAL_ERROR "No timing function found!")
186     ENDIF()
188     CHECK_FUNCTION_EXISTS(nanosleep HAVE_NANOSLEEP)
189     IF(NOT HAVE_NANOSLEEP)
190         MESSAGE(FATAL_ERROR "No sleep function found!")
191     ENDIF()
193     # We need pthreads outside of Windows
194     CHECK_INCLUDE_FILE(pthread.h HAVE_PTHREAD_H)
195     IF(NOT HAVE_PTHREAD_H)
196         MESSAGE(FATAL_ERROR "PThreads is required for non-Windows builds!")
197     ENDIF()
199     # Some systems need pthread_np.h to get recursive mutexes
200     CHECK_INCLUDE_FILES("pthread.h;pthread_np.h" HAVE_PTHREAD_NP_H)
202     # _GNU_SOURCE is needed on some systems for extra attributes, and
203     # _REENTRANT is needed for libc thread-safety
204     ADD_DEFINITIONS(-D_GNU_SOURCE=1 -D_REENTRANT)
205     CHECK_LIBRARY_EXISTS(pthread pthread_create "" HAVE_LIBPTHREAD)
206     IF(HAVE_LIBPTHREAD)
207         SET(EXTRA_LIBS pthread ${EXTRA_LIBS})
208     ENDIF()
209 ENDIF()
211 # Check for a 64-bit type
212 CHECK_INCLUDE_FILE(stdint.h HAVE_STDINT_H)
213 IF(NOT HAVE_STDINT_H)
214     IF(HAVE_WINDOWS_H)
215         CHECK_C_SOURCE_COMPILES("\#define _WIN32_WINNT 0x0500
216                                  \#include <windows.h>
217                                  __int64 foo;
218                                  int main() {return 0;}" HAVE___INT64)
219     ENDIF()
220     IF(NOT HAVE___INT64)
221         IF(NOT SIZEOF_LONG MATCHES "8")
222             IF(NOT SIZEOF_LONG_LONG MATCHES "8")
223                 MESSAGE(FATAL_ERROR "No 64-bit types found, please report!")
224             ENDIF()
225         ENDIF()
226     ENDIF()
227 ENDIF()
230 SET(OPENAL_OBJS  OpenAL32/alAuxEffectSlot.c
231                  OpenAL32/alBuffer.c
232                  OpenAL32/alEffect.c
233                  OpenAL32/alError.c
234                  OpenAL32/alExtension.c
235                  OpenAL32/alFilter.c
236                  OpenAL32/alListener.c
237                  OpenAL32/alSource.c
238                  OpenAL32/alState.c
239                  OpenAL32/alThunk.c
241 SET(ALC_OBJS  Alc/ALc.c
242               Alc/ALu.c
243               Alc/alcConfig.c
244               Alc/alcEcho.c
245               Alc/alcReverb.c
246               Alc/alcRing.c
247               Alc/alcThread.c
248               Alc/bs2b.c
249               Alc/wave.c
252 SET(BACKENDS "")
254 # Check ALSA backend
255 IF(ALSA)
256     CHECK_INCLUDE_FILE(alsa/asoundlib.h HAVE_ALSA_ASOUNDLIB_H)
257     IF(HAVE_ALSA_ASOUNDLIB_H)
258         CHECK_LIBRARY_EXISTS(asound snd_pcm_open "" HAVE_LIBASOUND)
259         IF(HAVE_DLFCN_H OR HAVE_LIBASOUND)
260             SET(HAVE_ALSA 1)
261             SET(ALC_OBJS  ${ALC_OBJS} Alc/alsa.c)
262             IF(HAVE_DLFCN_H)
263                 SET(BACKENDS  "${BACKENDS} ALSA,")
264             ELSE()
265                 SET(BACKENDS  "${BACKENDS} ALSA \(linked\),")
266                 SET(EXTRA_LIBS asound ${EXTRA_LIBS})
267             ENDIF()
268         ENDIF()
269     ENDIF()
270 ENDIF()
272 # Check OSS backend
273 IF(OSS)
274     CHECK_INCLUDE_FILE(sys/soundcard.h HAVE_SYS_SOUNDCARD_H)
275     IF(HAVE_SYS_SOUNDCARD_H)
276         SET(HAVE_OSS 1)
277         SET(ALC_OBJS  ${ALC_OBJS} Alc/oss.c)
278         SET(BACKENDS  "${BACKENDS} OSS,")
279     ENDIF()
280 ENDIF()
282 # Check Solaris backend
283 IF(SOLARIS)
284     CHECK_INCLUDE_FILE(sys/audioio.h HAVE_SYS_AUDIOIO_H)
285     IF(HAVE_SYS_AUDIOIO_H)
286         SET(HAVE_SOLARIS 1)
287         SET(ALC_OBJS  ${ALC_OBJS} Alc/solaris.c)
288         SET(BACKENDS  "${BACKENDS} Solaris,")
289     ENDIF()
290 ENDIF()
292 # Check DSound/MMSystem backend
293 IF(DSOUND)
294     CHECK_INCLUDE_FILE(dsound.h HAVE_DSOUND_H)
295     IF(HAVE_DSOUND_H)
296         CHECK_LIBRARY_EXISTS(dsound DirectSoundCreate "" HAVE_LIBDSOUND)
297         IF(HAVE_LIBDSOUND OR WIN32)
298             SET(HAVE_DSOUND 1)
299             SET(ALC_OBJS  ${ALC_OBJS} Alc/dsound.c)
301             IF(WIN32)
302                 SET(BACKENDS  "${BACKENDS} DirectSound,")
303             ELSE()
304                 SET(BACKENDS  "${BACKENDS} DirectSound \(linked\),")
305                 SET(EXTRA_LIBS dsound ${EXTRA_LIBS})
306             ENDIF()
307         ENDIF()
308     ENDIF()
309 ENDIF()
310 IF(HAVE_WINDOWS_H)
311     IF(WINMM)
312         CHECK_INCLUDE_FILES("windows.h;mmsystem.h" HAVE_MMSYSTEM_H -D_WIN32_WINNT=0x0500)
313         IF(HAVE_MMSYSTEM_H)
314             SET(HAVE_WINMM 1)
315             SET(ALC_OBJS  ${ALC_OBJS} Alc/winmm.c)
316             SET(BACKENDS  "${BACKENDS} WinMM,")
318             SET(CMAKE_REQUIRED_LIBRARIES winmm)
319             CHECK_C_SOURCE_COMPILES("int main() {return 0;}" HAVE_LIBWINMM)
320             SET(CMAKE_REQUIRED_LIBRARIES "")
321 #            CHECK_LIBRARY_EXISTS(winmm waveInOpen "" HAVE_LIBWINMM)
322             IF(HAVE_LIBWINMM)
323                 SET(EXTRA_LIBS winmm ${EXTRA_LIBS})
324             ENDIF()
325         ENDIF()
326     ENDIF()
327 ENDIF()
329 # Check PortAudio backend
330 IF(PORTAUDIO)
331     CHECK_INCLUDE_FILE(portaudio.h HAVE_PORTAUDIO_H)
332     IF(HAVE_PORTAUDIO_H)
333         CHECK_LIBRARY_EXISTS(portaudio Pa_Initialize "" HAVE_LIBPORTAUDIO)
334         IF(HAVE_LIBPORTAUDIO)
335             SET(HAVE_PORTAUDIO 1)
336             SET(ALC_OBJS  ${ALC_OBJS} Alc/portaudio.c)
337             IF(HAVE_DLFCN_H)
338                 SET(BACKENDS  "${BACKENDS} PortAudio,")
339             ELSE()
340                 SET(BACKENDS  "${BACKENDS} PortAudio \(linked\),")
341                 SET(EXTRA_LIBS portaudio ${EXTRA_LIBS})
342             ENDIF()
343         ENDIF()
344     ENDIF()
345 ENDIF()
347 # Check PortAudio backend
348 IF(PULSEAUDIO)
349     CHECK_INCLUDE_FILE(pulse/pulseaudio.h HAVE_PULSE_PULSEAUDIO_H)
350     IF(HAVE_PULSE_PULSEAUDIO_H)
351         CHECK_LIBRARY_EXISTS(pulse pa_context_new "" HAVE_LIBPULSE)
352         IF(HAVE_LIBPULSE)
353             SET(HAVE_PULSEAUDIO 1)
354             SET(ALC_OBJS  ${ALC_OBJS} Alc/pulseaudio.c)
355             IF(HAVE_DLFCN_H)
356                 SET(BACKENDS  "${BACKENDS} PulseAudio,")
357             ELSE()
358                 SET(BACKENDS  "${BACKENDS} PulseAudio \(linked\),")
359                 SET(EXTRA_LIBS pulse ${EXTRA_LIBS})
360             ENDIF()
361         ENDIF()
362     ENDIF()
363 ENDIF()
365 # This is always available
366 SET(BACKENDS  "${BACKENDS} WaveFile")
368 # Needed for openal.pc.in
369 SET(prefix ${CMAKE_INSTALL_PREFIX})
370 SET(exec_prefix "\${prefix}")
371 SET(libdir "\${exec_prefix}/${LIB_INSTALL_DIR}")
372 SET(bindir "\${exec_prefix}/bin")
373 SET(includedir "\${prefix}/include")
374 SET(PACKAGE_VERSION "${LIB_VERSION}")
376 # End configuration
377 CONFIGURE_FILE(
378     "${OpenAL_SOURCE_DIR}/config.h.in"
379     "${OpenAL_BINARY_DIR}/config.h")
380 CONFIGURE_FILE(
381     "${OpenAL_SOURCE_DIR}/admin/pkgconfig/openal.pc.in"
382     "${OpenAL_BINARY_DIR}/admin/pkgconfig/openal.pc"
383     @ONLY)
385 ADD_DEFINITIONS(-DAL_BUILD_LIBRARY)
387 # Build a library
388 IF(NOT LIBTYPE)
389     SET(LIBTYPE SHARED)
390 ENDIF()
391 ADD_LIBRARY(${LIBNAME} ${LIBTYPE} ${OPENAL_OBJS} ${ALC_OBJS})
392 SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES VERSION ${LIB_VERSION}
393                                             SOVERSION ${LIB_MAJOR_VERSION})
394 IF(WIN32)
395     SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES PREFIX "")
396 ENDIF()
398 TARGET_LINK_LIBRARIES(${LIBNAME} ${EXTRA_LIBS})
400 # Add an install target here
401 INSTALL(TARGETS ${LIBNAME}
402         RUNTIME DESTINATION bin
403         LIBRARY DESTINATION ${LIB_INSTALL_DIR}
404         ARCHIVE DESTINATION ${LIB_INSTALL_DIR}
406 INSTALL(FILES include/AL/al.h
407               include/AL/alc.h
408               include/AL/alext.h
409         DESTINATION include/AL
411 INSTALL(FILES "${OpenAL_BINARY_DIR}/admin/pkgconfig/openal.pc"
412         DESTINATION "${LIB_INSTALL_DIR}/pkgconfig")
414 # Install alsoft.conf configuration file
415 IF(ALSOFT_CONFIG)
416     INSTALL(FILES alsoftrc.sample
417             DESTINATION /etc/openal
418             RENAME alsoft.conf
419     )
420 ENDIF()
422 IF(EXAMPLES)
423     ADD_EXECUTABLE(openal-info examples/openal-info.c)
424     TARGET_LINK_LIBRARIES(openal-info ${LIBNAME})
425     INSTALL(TARGETS openal-info
426             RUNTIME DESTINATION bin
427             LIBRARY DESTINATION ${LIB_INSTALL_DIR}
428             ARCHIVE DESTINATION ${LIB_INSTALL_DIR}
429     )
430 ENDIF()
432 MESSAGE(STATUS "")
433 MESSAGE(STATUS "Building OpenAL with support for the following backends:")
434 MESSAGE(STATUS "    ${BACKENDS}")
435 MESSAGE(STATUS "")
437 IF(WIN32)
438     IF(NOT HAVE_DSOUND)
439         MESSAGE(STATUS "WARNING: Building the Windows version without DirectSound output")
440         MESSAGE(STATUS "         This is probably NOT what you want!")
441         MESSAGE(STATUS "")
442     ENDIF()
443 ENDIF()