Don't double-close a handle on error
[openal-soft.git] / CMakeLists.txt
blobee2cc94edafe6a697585407ecd9bc795ce33c34e
1 # CMake build file list for OpenAL
3 INCLUDE(CheckFunctionExists)
4 INCLUDE(CheckLibraryExists)
5 INCLUDE(CheckIncludeFile)
6 INCLUDE(CheckIncludeFiles)
7 INCLUDE(CheckCCompilerFlag)
8 INCLUDE(CheckCSourceCompiles)
9 INCLUDE(CheckTypeSize)
12 PROJECT(OpenAL)
15 SET(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS TRUE)
18 OPTION(ALSA    "ALSA backend"                ON)
19 OPTION(OSS     "OSS backend"                 ON)
20 OPTION(DSOUND  "DirectSound backend"         ON)
21 OPTION(WINMM   "Windows Multimedia backend"  ON)
23 OPTION(DLOPEN  "Use the dlopen API for loading optional libs"  ON)
25 OPTION(DEBUG    "Build lib in debug mode"                   OFF)
26 OPTION(NODEBUG  "Disable all debug info for optimizations"  OFF)
27 OPTION(WERROR   "Treat compile warnings as errors"          OFF)
30 SET(LIB_MAJOR_VERSION "1")
31 SET(LIB_MINOR_VERSION "1")
32 SET(LIB_BUILD_VERSION "93")
33 SET(LIB_VERSION "${LIB_MAJOR_VERSION}.${LIB_MINOR_VERSION}.${LIB_BUILD_VERSION}")
36 CHECK_TYPE_SIZE("long" SIZEOF_LONG)
37 CHECK_TYPE_SIZE("long long" SIZEOF_LONG_LONG)
38 CHECK_TYPE_SIZE("unsigned int" SIZEOF_UINT)
39 CHECK_TYPE_SIZE("void*" SIZEOF_VOIDP)
42 # Add definitions, compiler switches, etc.
43 INCLUDE_DIRECTORIES(OpenAL32/Include include "${OpenAL_BINARY_DIR}")
45 IF("${MSVC}")
46     # ???
47 ELSE()
48     ADD_DEFINITIONS(-Wall)
49     CHECK_C_COMPILER_FLAG(-Wextra HAVE_W_EXTRA)
50     IF("${HAVE_W_EXTRA}")
51         ADD_DEFINITIONS(-Wextra)
52     ENDIF()
54     IF(WERROR)
55         ADD_DEFINITIONS(-Werror)
56     ENDIF()
58     IF(DEBUG)
59         ADD_DEFINITIONS(-g3)
60     ELSEIF(NODEBUG)
61         ADD_DEFINITIONS(-O2 -funroll-loops -fomit-frame-pointer)
62     ELSE()
63         ADD_DEFINITIONS(-g -O2 -funroll-loops)
64     ENDIF()
66     # The mixer doesn't like GCC's strict aliasing optimizations. Make sure
67     # it's turned off
68     CHECK_C_COMPILER_FLAG(-fstrict-aliasing HAVE_STRICT_ALIASING)
69     IF("${HAVE_STRICT_ALIASING}")
70         ADD_DEFINITIONS(-fno-strict-aliasing)
71     ENDIF()
73     # Set visibility options if available
74     IF(NOT "${WIN32}")
75         CHECK_C_SOURCE_COMPILES("int foo() __attribute__((destructor));
76                                  int main() {return 0;}" HAVE_GCC_DESTRUCTOR)
78         CHECK_C_COMPILER_FLAG(-fvisibility=hidden HAVE_VISIBILITY_SWITCH)
79         IF("${HAVE_VISIBILITY_SWITCH}")
80             CHECK_C_SOURCE_COMPILES("int foo() __attribute__((visibility(\"default\")));
81                                      int main() {return 0;}" HAVE_GCC_VISIBILITY)
82             IF("${HAVE_GCC_VISIBILITY}")
83                 ADD_DEFINITIONS(-fvisibility=hidden -DHAVE_GCC_VISIBILITY)
84             ENDIF()
85         ENDIF()
86     ENDIF()
87 ENDIF()
89 IF(DEBUG)
90     ADD_DEFINITIONS(-D_DEBUG)
91 ELSEIF(NODEBUG)
92     ADD_DEFINITIONS(-DNDEBUG)
93 ENDIF()
95 CHECK_LIBRARY_EXISTS(m  sqrtf  "" HAVE_SQRTF)
96 IF("${HAVE_SQRTF}")
97     SET(EXTRA_LIBS m ${EXTRA_LIBS})
98 ENDIF()
99 CHECK_FUNCTION_EXISTS(strtof HAVE_STRTOF)
101 CHECK_FUNCTION_EXISTS(strcasecmp HAVE_STRCASECMP)
102 IF(NOT "${HAVE_STRCASECMP}")
103     CHECK_FUNCTION_EXISTS(_stricmp HAVE__STRICMP)
104     IF(NOT "${HAVE__STRICMP}")
105         MESSAGE(FATAL_ERROR "No case-insensitive compare function found, please report!")
106     ENDIF()
108     ADD_DEFINITIONS(-Dstrcasecmp=_stricmp)
109 ENDIF()
111 CHECK_FUNCTION_EXISTS(snprintf HAVE_SNPRINTF)
112 IF(NOT "${HAVE_SNPRINTF}")
113     CHECK_FUNCTION_EXISTS(_snprintf HAVE__SNPRINTF)
114     IF(NOT "${HAVE__SNPRINTF}")
115         MESSAGE(FATAL_ERROR "No snprintf function found, please report!")
116     ENDIF()
118     ADD_DEFINITIONS(-Dsnprintf=_snprintf)
119 ENDIF()
121 # Check for the dlopen API (for dynamicly loading backend libs)
122 IF(DLOPEN)
123     CHECK_INCLUDE_FILE(dlfcn.h HAVE_DLFCN_H)
124     IF("${HAVE_DLFCN_H}")
125         CHECK_LIBRARY_EXISTS(dl dlopen "" HAVE_LIBDL)
126         IF("${HAVE_LIBDL}")
127             SET(EXTRA_LIBS dl ${EXTRA_LIBS})
128         ENDIF()
129     ENDIF()
130 ENDIF()
132 # Check if we have Windows headers
133 CHECK_INCLUDE_FILE(windows.h HAVE_WINDOWS_H)
134 IF(NOT "${HAVE_WINDOWS_H}")
135     CHECK_FUNCTION_EXISTS(gettimeofday HAVE_GETTIMEOFDAY)
136     IF(NOT "${HAVE_GETTIMEOFDAY}")
137         MESSAGE(FATAL_ERROR "No timing function found!")
138     ENDIF()
140     CHECK_FUNCTION_EXISTS(nanosleep HAVE_NANOSLEEP)
141     IF(NOT "${HAVE_NANOSLEEP}")
142         MESSAGE(FATAL_ERROR "No sleep function found!")
143     ENDIF()
145     # We need pthreads outside of Windows
146     CHECK_INCLUDE_FILE(pthread.h HAVE_PTHREAD_H)
147     IF(NOT "${HAVE_PTHREAD_H}")
148         MESSAGE(FATAL_ERROR "PThreads is required for non-Windows builds!")
149     ENDIF()
151     # _GNU_SOURCE is needed on some systems for extra attributes, and
152     # _REENTRANT is needed for libc thread-safety
153     ADD_DEFINITIONS(-D_GNU_SOURCE=1 -D_REENTRANT)
154     CHECK_LIBRARY_EXISTS(pthread pthread_create "" HAVE_LIBPTHREAD)
155     IF("${HAVE_LIBPTHREAD}")
156         SET(EXTRA_LIBS pthread ${EXTRA_LIBS})
157     ENDIF()
158 ENDIF()
160 # Check for a 64-bit type
161 CHECK_INCLUDE_FILE(stdint.h HAVE_STDINT_H)
162 IF(NOT "${HAVE_STDINT_H}")
163     IF("${HAVE_WINDOWS_H}")
164         CHECK_C_SOURCE_COMPILES("\#include <windows.h>
165                                  __int64 foo;
166                                  int main() {return 0;}" HAVE___INT64)
167     ENDIF()
168     IF(NOT "${HAVE___INT64}")
169         IF(NOT "${SIZEOF_LONG}" MATCHES "8")
170             IF(NOT "${SIZEOF_LONG_LONG}" MATCHES "8")
171                 MESSAGE(FATAL_ERROR "No 64-bit types found, please report!")
172             ENDIF()
173         ENDIF()
174     ENDIF()
175 ENDIF()
178 SET(OPENAL_OBJS  OpenAL32/alBuffer.c
179                  OpenAL32/alError.c
180                  OpenAL32/alExtension.c
181                  OpenAL32/alListener.c
182                  OpenAL32/alSource.c
183                  OpenAL32/alState.c
184                  OpenAL32/alThunk.c
185                  OpenAL32/OpenAL32.c
187 SET(ALC_OBJS  Alc/ALc.c
188               Alc/ALu.c
189               Alc/alcConfig.c
190               Alc/alcRing.c
191               Alc/alcThread.c
192               Alc/bs2b.c
193               Alc/wave.c
196 SET(BACKENDS "")
198 # Check ALSA backend
199 IF(ALSA)
200     CHECK_INCLUDE_FILE(alsa/asoundlib.h HAVE_ALSA_ASOUNDLIB_H)
201     IF("${HAVE_ALSA_ASOUNDLIB_H}")
202         CHECK_LIBRARY_EXISTS(asound snd_pcm_open "" HAVE_LIBASOUND)
203         IF("${HAVE_DLFCN_H}" OR "${HAVE_LIBASOUND}")
204             SET(HAVE_ALSA 1)
205             SET(ALC_OBJS  ${ALC_OBJS} Alc/alsa.c)
206             IF("${HAVE_DLFCN_H}")
207                 SET(BACKENDS  ${BACKENDS} ALSA)
208             ELSE()
209                 SET(BACKENDS  ${BACKENDS} ALSA\(linked\))
210                 SET(EXTRA_LIBS asound ${EXTRA_LIBS})
211             ENDIF()
212         ENDIF()
213     ENDIF()
214 ENDIF()
216 # Check OSS backend
217 IF(OSS)
218     CHECK_INCLUDE_FILE(sys/soundcard.h HAVE_SYS_SOUNDCARD_H)
219     IF("${HAVE_SYS_SOUNDCARD_H}")
220         SET(HAVE_OSS 1)
221         SET(ALC_OBJS  ${ALC_OBJS} Alc/oss.c)
222         SET(BACKENDS  ${BACKENDS} OSS)
223     ENDIF()
224 ENDIF()
226 # Check DSound/MMSystem backend
227 IF("${HAVE_WINDOWS_H}")
228     SET(CMAKE_REQUIRED_LIBRARIES ole32)
229     CHECK_C_SOURCE_COMPILES("int main() {return 0;}" HAVE_LIBOLE32)
230     SET(CMAKE_REQUIRED_LIBRARIES "")
231 #    CHECK_LIBRARY_EXISTS(ole32 CoInitialize "" HAVE_LIBOLE32)
232     IF("${HAVE_LIBOLE32}")
233         SET(EXTRA_LIBS ole32 ${EXTRA_LIBS})
234     ENDIF()
236     IF(DSOUND)
237         CHECK_INCLUDE_FILE(dsound.h HAVE_DSOUND_H)
238         IF("${HAVE_DSOUND_H}")
239             SET(HAVE_DSOUND 1)
240             SET(ALC_OBJS  ${ALC_OBJS} Alc/dsound.c)
241             SET(BACKENDS  ${BACKENDS} DirectSound)
243             CHECK_LIBRARY_EXISTS(dxguid IID_IDirectSound "" HAVE_LIBDXGUID)
244             IF("${HAVE_LIBDXGUID}")
245                 SET(EXTRA_LIBS dxguid ${EXTRA_LIBS})
246             ENDIF()
247         ENDIF()
248     ENDIF()
249     IF(WINMM)
250         CHECK_INCLUDE_FILES("windows.h;mmsystem.h" HAVE_MMSYSTEM_H)
251         IF("${HAVE_MMSYSTEM_H}")
252             SET(HAVE_WINMM 1)
253             SET(ALC_OBJS  ${ALC_OBJS} Alc/winmm.c)
254             SET(BACKENDS  ${BACKENDS} WinMM)
256             SET(CMAKE_REQUIRED_LIBRARIES winmm)
257             CHECK_C_SOURCE_COMPILES("int main() {return 0;}" HAVE_LIBWINMM)
258             SET(CMAKE_REQUIRED_LIBRARIES "")
259 #            CHECK_LIBRARY_EXISTS(winmm waveInOpen "" HAVE_LIBWINMM)
260             IF("${HAVE_LIBWINMM}")
261                 SET(EXTRA_LIBS winmm ${EXTRA_LIBS})
262             ENDIF()
263         ENDIF()
264     ENDIF()
265 ENDIF()
267 # This is always available
268 SET(BACKENDS  ${BACKENDS} WaveFile)
270 # End configuration
271 CONFIGURE_FILE(
272     "${OpenAL_SOURCE_DIR}/config.h.in"
273     "${OpenAL_BINARY_DIR}/config.h")
275 ADD_DEFINITIONS(-DAL_BUILD_LIBRARY)
277 # Build a shared library
278 IF("${WIN32}")
279     SET(LIBNAME openal32)
280 ELSE()
281     SET(LIBNAME openal)
282 ENDIF()
284 ADD_LIBRARY(${LIBNAME} SHARED ${OPENAL_OBJS} ${ALC_OBJS})
285 SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES VERSION ${LIB_VERSION}
286                                             SOVERSION ${LIB_MAJOR_VERSION})
287 IF("${WIN32}")
288     SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES PREFIX "")
289 ENDIF()
291 TARGET_LINK_LIBRARIES(${LIBNAME} ${EXTRA_LIBS})
293 # Add an install target here
294 INSTALL(TARGETS ${LIBNAME}
295         RUNTIME DESTINATION bin
296         LIBRARY DESTINATION lib
297         ARCHIVE DESTINATION lib
299 INSTALL(FILES include/AL/al.h
300               include/AL/alc.h
301         DESTINATION include/AL
304 MESSAGE(STATUS "")
305 MESSAGE(STATUS "Building OpenAL with support for the following backends:")
306 MESSAGE(STATUS "    ${BACKENDS}")
307 MESSAGE(STATUS "")