Use nanosleep instead of usleep
[openal-soft/openbsd.git] / CMakeLists.txt
blob4955d250746f948360ac24ef6d74264037ea3b94
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
195 SET(BACKENDS "")
197 # Check ALSA backend
198 IF(ALSA)
199     CHECK_INCLUDE_FILE(alsa/asoundlib.h HAVE_ALSA_ASOUNDLIB_H)
200     IF("${HAVE_ALSA_ASOUNDLIB_H}")
201         CHECK_LIBRARY_EXISTS(asound snd_pcm_open "" HAVE_LIBASOUND)
202         IF("${HAVE_DLFCN_H}" OR "${HAVE_LIBASOUND}")
203             SET(HAVE_ALSA 1)
204             SET(ALC_OBJS  ${ALC_OBJS} Alc/alsa.c)
205             IF("${HAVE_DLFCN_H}")
206                 SET(BACKENDS  ${BACKENDS} ALSA)
207             ELSE()
208                 SET(BACKENDS  ${BACKENDS} ALSA\(linked\))
209                 SET(EXTRA_LIBS asound ${EXTRA_LIBS})
210             ENDIF()
211         ENDIF()
212     ENDIF()
213 ENDIF()
215 # Check OSS backend
216 IF(OSS)
217     CHECK_INCLUDE_FILE(sys/soundcard.h HAVE_SYS_SOUNDCARD_H)
218     IF("${HAVE_SYS_SOUNDCARD_H}")
219         SET(HAVE_OSS 1)
220         SET(ALC_OBJS  ${ALC_OBJS} Alc/oss.c)
221         SET(BACKENDS  ${BACKENDS} OSS)
222     ENDIF()
223 ENDIF()
225 # Check DSound/MMSystem backend
226 IF("${HAVE_WINDOWS_H}")
227     SET(CMAKE_REQUIRED_LIBRARIES ole32)
228     CHECK_C_SOURCE_COMPILES("int main() {return 0;}" HAVE_LIBOLE32)
229     SET(CMAKE_REQUIRED_LIBRARIES "")
230 #    CHECK_LIBRARY_EXISTS(ole32 CoInitialize "" HAVE_LIBOLE32)
231     IF("${HAVE_LIBOLE32}")
232         SET(EXTRA_LIBS ole32 ${EXTRA_LIBS})
233     ENDIF()
235     IF(DSOUND)
236         CHECK_INCLUDE_FILE(dsound.h HAVE_DSOUND_H)
237         IF("${HAVE_DSOUND_H}")
238             SET(HAVE_DSOUND 1)
239             SET(ALC_OBJS  ${ALC_OBJS} Alc/dsound.c)
240             SET(BACKENDS  ${BACKENDS} DirectSound)
242             CHECK_LIBRARY_EXISTS(dxguid IID_IDirectSound "" HAVE_LIBDXGUID)
243             IF("${HAVE_LIBDXGUID}")
244                 SET(EXTRA_LIBS dxguid ${EXTRA_LIBS})
245             ENDIF()
246         ENDIF()
247     ENDIF()
248     IF(WINMM)
249         CHECK_INCLUDE_FILES("windows.h;mmsystem.h" HAVE_MMSYSTEM_H)
250         IF("${HAVE_MMSYSTEM_H}")
251             SET(HAVE_WINMM 1)
252             SET(ALC_OBJS  ${ALC_OBJS} Alc/winmm.c)
253             SET(BACKENDS  ${BACKENDS} WinMM)
255             SET(CMAKE_REQUIRED_LIBRARIES winmm)
256             CHECK_C_SOURCE_COMPILES("int main() {return 0;}" HAVE_LIBWINMM)
257             SET(CMAKE_REQUIRED_LIBRARIES "")
258 #            CHECK_LIBRARY_EXISTS(winmm waveInOpen "" HAVE_LIBWINMM)
259             IF("${HAVE_LIBWINMM}")
260                 SET(EXTRA_LIBS winmm ${EXTRA_LIBS})
261             ENDIF()
262         ENDIF()
263     ENDIF()
264 ENDIF()
266 # End configuration
267 CONFIGURE_FILE(
268     "${OpenAL_SOURCE_DIR}/config.h.in"
269     "${OpenAL_BINARY_DIR}/config.h")
271 ADD_DEFINITIONS(-DAL_BUILD_LIBRARY)
273 # Build a shared library
274 IF("${WIN32}")
275     SET(LIBNAME openal32)
276 ELSE()
277     SET(LIBNAME openal)
278 ENDIF()
280 ADD_LIBRARY(${LIBNAME} SHARED ${OPENAL_OBJS} ${ALC_OBJS})
281 SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES VERSION ${LIB_VERSION}
282                                             SOVERSION ${LIB_MAJOR_VERSION})
283 IF("${WIN32}")
284     SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES PREFIX "")
285 ENDIF()
287 TARGET_LINK_LIBRARIES(${LIBNAME} ${EXTRA_LIBS})
289 # Add an install target here
290 INSTALL(TARGETS ${LIBNAME}
291         RUNTIME DESTINATION bin
292         LIBRARY DESTINATION lib
293         ARCHIVE DESTINATION lib
295 INSTALL(FILES include/AL/al.h
296               include/AL/alc.h
297         DESTINATION include/AL
300 MESSAGE(STATUS "")
301 MESSAGE(STATUS "Building OpenAL with support for the following backends:")
302 MESSAGE(STATUS "    ${BACKENDS}")
303 MESSAGE(STATUS "")