Release 1.5.304
[openal-soft.git] / CMakeLists.txt
blob870edb0b573bda6db55449aa83fa8bfbef9d477b
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 IF(WIN32)
37     SET(LIBNAME openal32)
38 ELSE()
39     SET(LIBNAME openal)
40 ENDIF()
42 SET(LIB_MAJOR_VERSION "1")
43 SET(LIB_MINOR_VERSION "5")
44 SET(LIB_BUILD_VERSION "304")
45 SET(LIB_VERSION "${LIB_MAJOR_VERSION}.${LIB_MINOR_VERSION}.${LIB_BUILD_VERSION}")
46 IF(NOT DEFINED LIB_INSTALL_DIR)
47   SET(LIB_INSTALL_DIR "lib")
48 ENDIF(NOT DEFINED LIB_INSTALL_DIR)
51 CHECK_TYPE_SIZE("long" SIZEOF_LONG)
52 CHECK_TYPE_SIZE("long long" SIZEOF_LONG_LONG)
53 CHECK_TYPE_SIZE("unsigned int" SIZEOF_UINT)
54 CHECK_TYPE_SIZE("void*" SIZEOF_VOIDP)
57 # Add definitions, compiler switches, etc.
58 INCLUDE_DIRECTORIES(OpenAL32/Include include "${OpenAL_BINARY_DIR}")
60 IF(NOT CMAKE_BUILD_TYPE)
61     SET(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING
62         "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel."
63         FORCE)
64 ENDIF()
66 IF(MSVC)
67     # ???
68     SET(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -D_DEBUG")
69     SET(CMAKE_C_FLAGS_MINSIZEREL "${CMAKE_C_FLAGS_MINSIZEREL} -DNDEBUG")
70     SET(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -DNDEBUG")
71     SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -D_DEBUG")
72 ELSE()
73     ADD_DEFINITIONS(-Wall)
74     CHECK_C_COMPILER_FLAG(-Wextra HAVE_W_EXTRA)
75     IF("${HAVE_W_EXTRA}")
76         ADD_DEFINITIONS(-Wextra)
77     ENDIF()
79     IF(WERROR)
80         ADD_DEFINITIONS(-Werror)
81     ENDIF()
83     SET(CMAKE_C_FLAGS_RELWITHDEBINFO "-g -O2 -funroll-loops -D_DEBUG" CACHE STRING
84         "Flags used by the compiler during Release with Debug Info builds."
85         FORCE)
86     SET(CMAKE_C_FLAGS_MINSIZEREL "-Os -DNDEBUG" CACHE STRING
87         "Flags used by the compiler during release minsize builds."
88         FORCE)
89     SET(CMAKE_C_FLAGS_RELEASE "-O2 -funroll-loops -fomit-frame-pointer -DNDEBUG" CACHE STRING
90         "Flags used by the compiler during release builds"
91         FORCE)
92     SET(CMAKE_C_FLAGS_DEBUG "-g3 -D_DEBUG" CACHE STRING
93         "Flags used by the compiler during debug builds."
94         FORCE)
96     # Set visibility options if available
97     IF(NOT WIN32)
98         CHECK_C_SOURCE_COMPILES("int foo() __attribute__((destructor));
99                                  int main() {return 0;}" HAVE_GCC_DESTRUCTOR)
101         CHECK_C_COMPILER_FLAG(-fvisibility=hidden HAVE_VISIBILITY_SWITCH)
102         IF("${HAVE_VISIBILITY_SWITCH}")
103             CHECK_C_SOURCE_COMPILES("int foo() __attribute__((visibility(\"default\")));
104                                      int main() {return 0;}" HAVE_GCC_VISIBILITY)
105             IF("${HAVE_GCC_VISIBILITY}")
106                 ADD_DEFINITIONS(-fvisibility=hidden -DHAVE_GCC_VISIBILITY)
107             ENDIF()
108         ENDIF()
109     ENDIF()
110 ENDIF()
113 CHECK_LIBRARY_EXISTS(m  sqrtf  "" HAVE_SQRTF)
114 CHECK_LIBRARY_EXISTS(m  acosf  "" HAVE_ACOSF)
115 IF(HAVE_SQRTF OR HAVE_ACOSF)
116     SET(EXTRA_LIBS m ${EXTRA_LIBS})
117 ENDIF()
118 CHECK_FUNCTION_EXISTS(strtof HAVE_STRTOF)
120 CHECK_FUNCTION_EXISTS(strcasecmp HAVE_STRCASECMP)
121 IF(NOT HAVE_STRCASECMP)
122     CHECK_FUNCTION_EXISTS(_stricmp HAVE__STRICMP)
123     IF(NOT HAVE__STRICMP)
124         MESSAGE(FATAL_ERROR "No case-insensitive compare function found, please report!")
125     ENDIF()
127     ADD_DEFINITIONS(-Dstrcasecmp=_stricmp)
128 ENDIF()
130 CHECK_FUNCTION_EXISTS(strncasecmp HAVE_STRNCASECMP)
131 IF(NOT HAVE_STRNCASECMP)
132     CHECK_FUNCTION_EXISTS(_strnicmp HAVE__STRNICMP)
133     IF(NOT HAVE__STRNICMP)
134         MESSAGE(FATAL_ERROR "No case-insensitive size-limitted compare function found, please report!")
135     ENDIF()
137     ADD_DEFINITIONS(-Dstrncasecmp=_strnicmp)
138 ENDIF()
140 CHECK_FUNCTION_EXISTS(snprintf HAVE_SNPRINTF)
141 IF(NOT HAVE_SNPRINTF)
142     CHECK_FUNCTION_EXISTS(_snprintf HAVE__SNPRINTF)
143     IF(NOT HAVE__SNPRINTF)
144         MESSAGE(FATAL_ERROR "No snprintf function found, please report!")
145     ENDIF()
147     ADD_DEFINITIONS(-Dsnprintf=_snprintf)
148 ENDIF()
150 # Check for the dlopen API (for dynamicly loading backend libs)
151 IF(DLOPEN)
152     CHECK_INCLUDE_FILE(dlfcn.h HAVE_DLFCN_H)
153     IF(HAVE_DLFCN_H)
154         CHECK_LIBRARY_EXISTS(dl dlopen "" HAVE_LIBDL)
155         IF(HAVE_LIBDL)
156             SET(EXTRA_LIBS dl ${EXTRA_LIBS})
157         ENDIF()
158     ENDIF()
159 ENDIF()
161 # Check if we have Windows headers
162 CHECK_INCLUDE_FILE(windows.h HAVE_WINDOWS_H -D_WIN32_WINNT=0x0500)
163 IF(NOT HAVE_WINDOWS_H)
164     CHECK_FUNCTION_EXISTS(gettimeofday HAVE_GETTIMEOFDAY)
165     IF(NOT HAVE_GETTIMEOFDAY)
166         MESSAGE(FATAL_ERROR "No timing function found!")
167     ENDIF()
169     CHECK_FUNCTION_EXISTS(nanosleep HAVE_NANOSLEEP)
170     IF(NOT HAVE_NANOSLEEP)
171         MESSAGE(FATAL_ERROR "No sleep function found!")
172     ENDIF()
174     # We need pthreads outside of Windows
175     CHECK_INCLUDE_FILE(pthread.h HAVE_PTHREAD_H)
176     IF(NOT HAVE_PTHREAD_H)
177         MESSAGE(FATAL_ERROR "PThreads is required for non-Windows builds!")
178     ENDIF()
180     # Some systems need pthread_np.h to get recursive mutexes
181     CHECK_INCLUDE_FILES("pthread.h;pthread_np.h" HAVE_PTHREAD_NP_H)
183     # _GNU_SOURCE is needed on some systems for extra attributes, and
184     # _REENTRANT is needed for libc thread-safety
185     ADD_DEFINITIONS(-D_GNU_SOURCE=1 -D_REENTRANT)
186     CHECK_LIBRARY_EXISTS(pthread pthread_create "" HAVE_LIBPTHREAD)
187     IF(HAVE_LIBPTHREAD)
188         SET(EXTRA_LIBS pthread ${EXTRA_LIBS})
189     ENDIF()
190 ENDIF()
192 # Check for a 64-bit type
193 CHECK_INCLUDE_FILE(stdint.h HAVE_STDINT_H)
194 IF(NOT HAVE_STDINT_H)
195     IF(HAVE_WINDOWS_H)
196         CHECK_C_SOURCE_COMPILES("\#define _WIN32_WINNT 0x0500
197                                  \#include <windows.h>
198                                  __int64 foo;
199                                  int main() {return 0;}" HAVE___INT64)
200     ENDIF()
201     IF(NOT HAVE___INT64)
202         IF(NOT SIZEOF_LONG MATCHES "8")
203             IF(NOT SIZEOF_LONG_LONG MATCHES "8")
204                 MESSAGE(FATAL_ERROR "No 64-bit types found, please report!")
205             ENDIF()
206         ENDIF()
207     ENDIF()
208 ENDIF()
211 SET(OPENAL_OBJS  OpenAL32/alAuxEffectSlot.c
212                  OpenAL32/alBuffer.c
213                  OpenAL32/alEffect.c
214                  OpenAL32/alError.c
215                  OpenAL32/alExtension.c
216                  OpenAL32/alFilter.c
217                  OpenAL32/alListener.c
218                  OpenAL32/alSource.c
219                  OpenAL32/alState.c
220                  OpenAL32/alThunk.c
222 SET(ALC_OBJS  Alc/ALc.c
223               Alc/ALu.c
224               Alc/alcConfig.c
225               Alc/alcRing.c
226               Alc/alcThread.c
227               Alc/bs2b.c
228               Alc/lpfilter.c
229               Alc/wave.c
232 SET(BACKENDS "")
234 # Check ALSA backend
235 IF(ALSA)
236     CHECK_INCLUDE_FILE(alsa/asoundlib.h HAVE_ALSA_ASOUNDLIB_H)
237     IF(HAVE_ALSA_ASOUNDLIB_H)
238         CHECK_LIBRARY_EXISTS(asound snd_pcm_open "" HAVE_LIBASOUND)
239         IF(HAVE_DLFCN_H OR HAVE_LIBASOUND)
240             SET(HAVE_ALSA 1)
241             SET(ALC_OBJS  ${ALC_OBJS} Alc/alsa.c)
242             IF(HAVE_DLFCN_H)
243                 SET(BACKENDS  "${BACKENDS} ALSA,")
244             ELSE()
245                 SET(BACKENDS  "${BACKENDS} ALSA \(linked\),")
246                 SET(EXTRA_LIBS asound ${EXTRA_LIBS})
247             ENDIF()
248         ENDIF()
249     ENDIF()
250 ENDIF()
252 # Check OSS backend
253 IF(OSS)
254     CHECK_INCLUDE_FILE(sys/soundcard.h HAVE_SYS_SOUNDCARD_H)
255     IF(HAVE_SYS_SOUNDCARD_H)
256         SET(HAVE_OSS 1)
257         SET(ALC_OBJS  ${ALC_OBJS} Alc/oss.c)
258         SET(BACKENDS  "${BACKENDS} OSS,")
259     ENDIF()
260 ENDIF()
262 # Check DSound/MMSystem backend
263 IF(HAVE_WINDOWS_H)
264     IF(DSOUND)
265         CHECK_INCLUDE_FILE(dsound.h HAVE_DSOUND_H)
266         IF(HAVE_DSOUND_H)
267             SET(HAVE_DSOUND 1)
268             SET(ALC_OBJS  ${ALC_OBJS} Alc/dsound.c)
269             SET(BACKENDS  "${BACKENDS} DirectSound,")
271             SET(CMAKE_REQUIRED_LIBRARIES dsound)
272             CHECK_C_SOURCE_COMPILES("int main() {return 0;}" HAVE_LIBDSOUND)
273             SET(CMAKE_REQUIRED_LIBRARIES "")
274 #            CHECK_LIBRARY_EXISTS(dsound DirectSoundCreate "" HAVE_LIBDSOUND)
275             IF(HAVE_LIBDSOUND)
276                 SET(EXTRA_LIBS dsound ${EXTRA_LIBS})
277             ENDIF()
278         ENDIF()
279     ENDIF()
280     IF(WINMM)
281         CHECK_INCLUDE_FILES("windows.h;mmsystem.h" HAVE_MMSYSTEM_H -D_WIN32_WINNT=0x0500)
282         IF(HAVE_MMSYSTEM_H)
283             SET(HAVE_WINMM 1)
284             SET(ALC_OBJS  ${ALC_OBJS} Alc/winmm.c)
285             SET(BACKENDS  "${BACKENDS} WinMM,")
287             SET(CMAKE_REQUIRED_LIBRARIES winmm)
288             CHECK_C_SOURCE_COMPILES("int main() {return 0;}" HAVE_LIBWINMM)
289             SET(CMAKE_REQUIRED_LIBRARIES "")
290 #            CHECK_LIBRARY_EXISTS(winmm waveInOpen "" HAVE_LIBWINMM)
291             IF(HAVE_LIBWINMM)
292                 SET(EXTRA_LIBS winmm ${EXTRA_LIBS})
293             ENDIF()
294         ENDIF()
295     ENDIF()
296 ENDIF()
298 # This is always available
299 SET(BACKENDS  "${BACKENDS} WaveFile")
301 # Needed for openal.pc.in
302 SET(prefix ${CMAKE_INSTALL_PREFIX})
303 SET(exec_prefix "\${prefix}")
304 SET(libdir "\${exec_prefix}/${LIB_INSTALL_DIR}")
305 SET(bindir "\${exec_prefix}/bin")
306 SET(includedir "\${prefix}/include")
307 SET(PACKAGE_VERSION "${LIB_VERSION}")
309 # End configuration
310 CONFIGURE_FILE(
311     "${OpenAL_SOURCE_DIR}/config.h.in"
312     "${OpenAL_BINARY_DIR}/config.h")
313 CONFIGURE_FILE(
314     "${OpenAL_SOURCE_DIR}/admin/pkgconfig/openal.pc.in"
315     "${OpenAL_BINARY_DIR}/admin/pkgconfig/openal.pc"
316     @ONLY)
318 ADD_DEFINITIONS(-DAL_BUILD_LIBRARY)
320 # Build a shared library
321 ADD_LIBRARY(${LIBNAME} SHARED ${OPENAL_OBJS} ${ALC_OBJS})
322 SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES VERSION ${LIB_VERSION}
323                                             SOVERSION ${LIB_MAJOR_VERSION})
324 IF(WIN32)
325     SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES PREFIX "")
326 ENDIF()
328 TARGET_LINK_LIBRARIES(${LIBNAME} ${EXTRA_LIBS})
330 # Add an install target here
331 INSTALL(TARGETS ${LIBNAME}
332         RUNTIME DESTINATION bin
333         LIBRARY DESTINATION ${LIB_INSTALL_DIR}
334         ARCHIVE DESTINATION ${LIB_INSTALL_DIR}
336 INSTALL(FILES include/AL/al.h
337               include/AL/alc.h
338               include/AL/alext.h
339         DESTINATION include/AL
341 INSTALL(FILES "${OpenAL_BINARY_DIR}/admin/pkgconfig/openal.pc"
342         DESTINATION lib/pkgconfig)
344 IF(EXAMPLES)
345     ADD_EXECUTABLE(openal-info examples/openal-info.c)
346     TARGET_LINK_LIBRARIES(openal-info ${LIBNAME})
347     INSTALL(TARGETS openal-info
348             RUNTIME DESTINATION bin
349             LIBRARY DESTINATION ${LIB_INSTALL_DIR}
350             ARCHIVE DESTINATION ${LIB_INSTALL_DIR}
351     )
352 ENDIF()
354 MESSAGE(STATUS "")
355 MESSAGE(STATUS "Building OpenAL with support for the following backends:")
356 MESSAGE(STATUS "    ${BACKENDS}")
357 MESSAGE(STATUS "")
359 IF(WIN32 AND NOT HAVE_DSOUND)
360     MESSAGE(STATUS "WARNING: Building the Windows version without DirectSound output")
361     MESSAGE(STATUS "         This is probably NOT what you want!")
362     MESSAGE(STATUS "")
363 ENDIF()