Add a timing wrapper, using gettimeofday
[openal-soft.git] / CMakeLists.txt
blob86fc4fd1f670859e90bdbcd176357bde29679d42
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     # We need pthreads outside of Windows
141     CHECK_INCLUDE_FILE(pthread.h HAVE_PTHREAD_H)
142     IF(NOT "${HAVE_PTHREAD_H}")
143         MESSAGE(FATAL_ERROR "PThreads is required for non-Windows builds!")
144     ENDIF()
146     # _GNU_SOURCE is needed on some systems for extra attributes, and
147     # _REENTRANT is needed for libc thread-safety
148     ADD_DEFINITIONS(-D_GNU_SOURCE=1 -D_REENTRANT)
149     CHECK_LIBRARY_EXISTS(pthread pthread_create "" HAVE_LIBPTHREAD)
150     IF("${HAVE_LIBPTHREAD}")
151         SET(EXTRA_LIBS pthread ${EXTRA_LIBS})
152     ENDIF()
153 ENDIF()
155 # Check for a 64-bit type
156 CHECK_INCLUDE_FILE(stdint.h HAVE_STDINT_H)
157 IF(NOT "${HAVE_STDINT_H}")
158     IF("${HAVE_WINDOWS_H}")
159         CHECK_C_SOURCE_COMPILES("\#include <windows.h>
160                                  __int64 foo;
161                                  int main() {return 0;}" HAVE___INT64)
162     ENDIF()
163     IF(NOT "${HAVE___INT64}")
164         IF(NOT "${SIZEOF_LONG}" MATCHES "8")
165             IF(NOT "${SIZEOF_LONG_LONG}" MATCHES "8")
166                 MESSAGE(FATAL_ERROR "No 64-bit types found, please report!")
167             ENDIF()
168         ENDIF()
169     ENDIF()
170 ENDIF()
173 SET(OPENAL_OBJS  OpenAL32/alBuffer.c
174                  OpenAL32/alError.c
175                  OpenAL32/alExtension.c
176                  OpenAL32/alListener.c
177                  OpenAL32/alSource.c
178                  OpenAL32/alState.c
179                  OpenAL32/alThunk.c
180                  OpenAL32/OpenAL32.c
182 SET(ALC_OBJS  Alc/ALc.c
183               Alc/ALu.c
184               Alc/alcConfig.c
185               Alc/alcRing.c
186               Alc/alcThread.c
187               Alc/bs2b.c
190 SET(BACKENDS "")
192 # Check ALSA backend
193 IF(ALSA)
194     CHECK_INCLUDE_FILE(alsa/asoundlib.h HAVE_ALSA_ASOUNDLIB_H)
195     IF("${HAVE_ALSA_ASOUNDLIB_H}")
196         CHECK_LIBRARY_EXISTS(asound snd_pcm_open "" HAVE_LIBASOUND)
197         IF("${HAVE_DLFCN_H}" OR "${HAVE_LIBASOUND}")
198             SET(HAVE_ALSA 1)
199             SET(ALC_OBJS  ${ALC_OBJS} Alc/alsa.c)
200             IF("${HAVE_DLFCN_H}")
201                 SET(BACKENDS  ${BACKENDS} ALSA)
202             ELSE()
203                 SET(BACKENDS  ${BACKENDS} ALSA\(linked\))
204                 SET(EXTRA_LIBS asound ${EXTRA_LIBS})
205             ENDIF()
206         ENDIF()
207     ENDIF()
208 ENDIF()
210 # Check OSS backend
211 IF(OSS)
212     CHECK_INCLUDE_FILE(sys/soundcard.h HAVE_SYS_SOUNDCARD_H)
213     IF("${HAVE_SYS_SOUNDCARD_H}")
214         SET(HAVE_OSS 1)
215         SET(ALC_OBJS  ${ALC_OBJS} Alc/oss.c)
216         SET(BACKENDS  ${BACKENDS} OSS)
217     ENDIF()
218 ENDIF()
220 # Check DSound/MMSystem backend
221 IF("${HAVE_WINDOWS_H}")
222     SET(CMAKE_REQUIRED_LIBRARIES ole32)
223     CHECK_C_SOURCE_COMPILES("int main() {return 0;}" HAVE_LIBOLE32)
224     SET(CMAKE_REQUIRED_LIBRARIES "")
225 #    CHECK_LIBRARY_EXISTS(ole32 CoInitialize "" HAVE_LIBOLE32)
226     IF("${HAVE_LIBOLE32}")
227         SET(EXTRA_LIBS ole32 ${EXTRA_LIBS})
228     ENDIF()
230     IF(DSOUND)
231         CHECK_INCLUDE_FILE(dsound.h HAVE_DSOUND_H)
232         IF("${HAVE_DSOUND_H}")
233             SET(HAVE_DSOUND 1)
234             SET(ALC_OBJS  ${ALC_OBJS} Alc/dsound.c)
235             SET(BACKENDS  ${BACKENDS} DirectSound)
237             CHECK_LIBRARY_EXISTS(dxguid IID_IDirectSound "" HAVE_LIBDXGUID)
238             IF("${HAVE_LIBDXGUID}")
239                 SET(EXTRA_LIBS dxguid ${EXTRA_LIBS})
240             ENDIF()
241         ENDIF()
242     ENDIF()
243     IF(WINMM)
244         CHECK_INCLUDE_FILES("windows.h;mmsystem.h" HAVE_MMSYSTEM_H)
245         IF("${HAVE_MMSYSTEM_H}")
246             SET(HAVE_WINMM 1)
247             SET(ALC_OBJS  ${ALC_OBJS} Alc/winmm.c)
248             SET(BACKENDS  ${BACKENDS} WinMM)
250             SET(CMAKE_REQUIRED_LIBRARIES winmm)
251             CHECK_C_SOURCE_COMPILES("int main() {return 0;}" HAVE_LIBWINMM)
252             SET(CMAKE_REQUIRED_LIBRARIES "")
253 #            CHECK_LIBRARY_EXISTS(winmm waveInOpen "" HAVE_LIBWINMM)
254             IF("${HAVE_LIBWINMM}")
255                 SET(EXTRA_LIBS winmm ${EXTRA_LIBS})
256             ENDIF()
257         ENDIF()
258     ENDIF()
259 ENDIF()
261 # End configuration
262 CONFIGURE_FILE(
263     "${OpenAL_SOURCE_DIR}/config.h.in"
264     "${OpenAL_BINARY_DIR}/config.h")
266 ADD_DEFINITIONS(-DAL_BUILD_LIBRARY)
268 # Build a shared library
269 IF("${WIN32}")
270     SET(LIBNAME openal32)
271 ELSE()
272     SET(LIBNAME openal)
273 ENDIF()
275 ADD_LIBRARY(${LIBNAME} SHARED ${OPENAL_OBJS} ${ALC_OBJS})
276 SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES VERSION ${LIB_VERSION}
277                                             SOVERSION ${LIB_MAJOR_VERSION})
278 IF("${WIN32}")
279     SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES PREFIX "")
280 ENDIF()
282 TARGET_LINK_LIBRARIES(${LIBNAME} ${EXTRA_LIBS})
284 # Add an install target here
285 INSTALL(TARGETS ${LIBNAME}
286         RUNTIME DESTINATION bin
287         LIBRARY DESTINATION lib
288         ARCHIVE DESTINATION lib
290 INSTALL(FILES include/AL/al.h
291               include/AL/alc.h
292         DESTINATION include/AL
295 MESSAGE(STATUS "")
296 MESSAGE(STATUS "Building OpenAL with support for the following backends:")
297 MESSAGE(STATUS "    ${BACKENDS}")
298 MESSAGE(STATUS "")