Optionally install the sample configuration file
[openal-soft.git] / CMakeLists.txt
blob509b55914c6252dc32e150df6e48e3fe78f62045
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             SET(BACKENDS  "${BACKENDS} PulseAudio \(linked\),")
357             SET(EXTRA_LIBS pulse ${EXTRA_LIBS})
358         ENDIF()
359     ENDIF()
360 ENDIF()
362 # This is always available
363 SET(BACKENDS  "${BACKENDS} WaveFile")
365 # Needed for openal.pc.in
366 SET(prefix ${CMAKE_INSTALL_PREFIX})
367 SET(exec_prefix "\${prefix}")
368 SET(libdir "\${exec_prefix}/${LIB_INSTALL_DIR}")
369 SET(bindir "\${exec_prefix}/bin")
370 SET(includedir "\${prefix}/include")
371 SET(PACKAGE_VERSION "${LIB_VERSION}")
373 # End configuration
374 CONFIGURE_FILE(
375     "${OpenAL_SOURCE_DIR}/config.h.in"
376     "${OpenAL_BINARY_DIR}/config.h")
377 CONFIGURE_FILE(
378     "${OpenAL_SOURCE_DIR}/admin/pkgconfig/openal.pc.in"
379     "${OpenAL_BINARY_DIR}/admin/pkgconfig/openal.pc"
380     @ONLY)
382 ADD_DEFINITIONS(-DAL_BUILD_LIBRARY)
384 # Build a library
385 IF(NOT LIBTYPE)
386     SET(LIBTYPE SHARED)
387 ENDIF()
388 ADD_LIBRARY(${LIBNAME} ${LIBTYPE} ${OPENAL_OBJS} ${ALC_OBJS})
389 SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES VERSION ${LIB_VERSION}
390                                             SOVERSION ${LIB_MAJOR_VERSION})
391 IF(WIN32)
392     SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES PREFIX "")
393 ENDIF()
395 TARGET_LINK_LIBRARIES(${LIBNAME} ${EXTRA_LIBS})
397 # Add an install target here
398 INSTALL(TARGETS ${LIBNAME}
399         RUNTIME DESTINATION bin
400         LIBRARY DESTINATION ${LIB_INSTALL_DIR}
401         ARCHIVE DESTINATION ${LIB_INSTALL_DIR}
403 INSTALL(FILES include/AL/al.h
404               include/AL/alc.h
405               include/AL/alext.h
406         DESTINATION include/AL
408 INSTALL(FILES "${OpenAL_BINARY_DIR}/admin/pkgconfig/openal.pc"
409         DESTINATION "${LIB_INSTALL_DIR}/pkgconfig")
411 # Install alsoft.conf configuration file
412 IF(ALSOFT_CONFIG)
413     INSTALL(FILES alsoftrc.sample
414             DESTINATION /etc/openal
415             RENAME alsoft.conf
416     )
417 ENDIF()
419 IF(EXAMPLES)
420     ADD_EXECUTABLE(openal-info examples/openal-info.c)
421     TARGET_LINK_LIBRARIES(openal-info ${LIBNAME})
422     INSTALL(TARGETS openal-info
423             RUNTIME DESTINATION bin
424             LIBRARY DESTINATION ${LIB_INSTALL_DIR}
425             ARCHIVE DESTINATION ${LIB_INSTALL_DIR}
426     )
427 ENDIF()
429 MESSAGE(STATUS "")
430 MESSAGE(STATUS "Building OpenAL with support for the following backends:")
431 MESSAGE(STATUS "    ${BACKENDS}")
432 MESSAGE(STATUS "")
434 IF(WIN32)
435     IF(NOT HAVE_DSOUND)
436         MESSAGE(STATUS "WARNING: Building the Windows version without DirectSound output")
437         MESSAGE(STATUS "         This is probably NOT what you want!")
438         MESSAGE(STATUS "")
439     ENDIF()
440 ENDIF()