Check for strncasecmp or _strnicmp
[openal-soft.git] / CMakeLists.txt
blob0520e240105bb4065f13a214947c1d863bc98288
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(strncasecmp HAVE_STRNCASECMP)
112 IF(NOT "${HAVE_STRNCASECMP}")
113     CHECK_FUNCTION_EXISTS(_strnicmp HAVE__STRNICMP)
114     IF(NOT "${HAVE__STRNICMP}")
115         MESSAGE(FATAL_ERROR "No case-insensitive size-limitted compare function found, please report!")
116     ENDIF()
118     ADD_DEFINITIONS(-Dstrncasecmp=_strnicmp)
119 ENDIF()
121 CHECK_FUNCTION_EXISTS(snprintf HAVE_SNPRINTF)
122 IF(NOT "${HAVE_SNPRINTF}")
123     CHECK_FUNCTION_EXISTS(_snprintf HAVE__SNPRINTF)
124     IF(NOT "${HAVE__SNPRINTF}")
125         MESSAGE(FATAL_ERROR "No snprintf function found, please report!")
126     ENDIF()
128     ADD_DEFINITIONS(-Dsnprintf=_snprintf)
129 ENDIF()
131 # Check for the dlopen API (for dynamicly loading backend libs)
132 IF(DLOPEN)
133     CHECK_INCLUDE_FILE(dlfcn.h HAVE_DLFCN_H)
134     IF("${HAVE_DLFCN_H}")
135         CHECK_LIBRARY_EXISTS(dl dlopen "" HAVE_LIBDL)
136         IF("${HAVE_LIBDL}")
137             SET(EXTRA_LIBS dl ${EXTRA_LIBS})
138         ENDIF()
139     ENDIF()
140 ENDIF()
142 # Check if we have Windows headers
143 CHECK_INCLUDE_FILE(windows.h HAVE_WINDOWS_H)
144 IF(NOT "${HAVE_WINDOWS_H}")
145     CHECK_FUNCTION_EXISTS(gettimeofday HAVE_GETTIMEOFDAY)
146     IF(NOT "${HAVE_GETTIMEOFDAY}")
147         MESSAGE(FATAL_ERROR "No timing function found!")
148     ENDIF()
150     CHECK_FUNCTION_EXISTS(nanosleep HAVE_NANOSLEEP)
151     IF(NOT "${HAVE_NANOSLEEP}")
152         MESSAGE(FATAL_ERROR "No sleep function found!")
153     ENDIF()
155     # We need pthreads outside of Windows
156     CHECK_INCLUDE_FILE(pthread.h HAVE_PTHREAD_H)
157     IF(NOT "${HAVE_PTHREAD_H}")
158         MESSAGE(FATAL_ERROR "PThreads is required for non-Windows builds!")
159     ENDIF()
161     # _GNU_SOURCE is needed on some systems for extra attributes, and
162     # _REENTRANT is needed for libc thread-safety
163     ADD_DEFINITIONS(-D_GNU_SOURCE=1 -D_REENTRANT)
164     CHECK_LIBRARY_EXISTS(pthread pthread_create "" HAVE_LIBPTHREAD)
165     IF("${HAVE_LIBPTHREAD}")
166         SET(EXTRA_LIBS pthread ${EXTRA_LIBS})
167     ENDIF()
168 ENDIF()
170 # Check for a 64-bit type
171 CHECK_INCLUDE_FILE(stdint.h HAVE_STDINT_H)
172 IF(NOT "${HAVE_STDINT_H}")
173     IF("${HAVE_WINDOWS_H}")
174         CHECK_C_SOURCE_COMPILES("\#include <windows.h>
175                                  __int64 foo;
176                                  int main() {return 0;}" HAVE___INT64)
177     ENDIF()
178     IF(NOT "${HAVE___INT64}")
179         IF(NOT "${SIZEOF_LONG}" MATCHES "8")
180             IF(NOT "${SIZEOF_LONG_LONG}" MATCHES "8")
181                 MESSAGE(FATAL_ERROR "No 64-bit types found, please report!")
182             ENDIF()
183         ENDIF()
184     ENDIF()
185 ENDIF()
188 SET(OPENAL_OBJS  OpenAL32/alAuxEffectSlot.c
189                  OpenAL32/alBuffer.c
190                  OpenAL32/alEffect.c
191                  OpenAL32/alError.c
192                  OpenAL32/alExtension.c
193                  OpenAL32/alFilter.c
194                  OpenAL32/alListener.c
195                  OpenAL32/alSource.c
196                  OpenAL32/alState.c
197                  OpenAL32/alThunk.c
198                  OpenAL32/OpenAL32.c
200 SET(ALC_OBJS  Alc/ALc.c
201               Alc/ALu.c
202               Alc/alcConfig.c
203               Alc/alcRing.c
204               Alc/alcThread.c
205               Alc/bs2b.c
206               Alc/wave.c
209 SET(BACKENDS "")
211 # Check ALSA backend
212 IF(ALSA)
213     CHECK_INCLUDE_FILE(alsa/asoundlib.h HAVE_ALSA_ASOUNDLIB_H)
214     IF("${HAVE_ALSA_ASOUNDLIB_H}")
215         CHECK_LIBRARY_EXISTS(asound snd_pcm_open "" HAVE_LIBASOUND)
216         IF("${HAVE_DLFCN_H}" OR "${HAVE_LIBASOUND}")
217             SET(HAVE_ALSA 1)
218             SET(ALC_OBJS  ${ALC_OBJS} Alc/alsa.c)
219             IF("${HAVE_DLFCN_H}")
220                 SET(BACKENDS  ${BACKENDS} ALSA)
221             ELSE()
222                 SET(BACKENDS  ${BACKENDS} ALSA\(linked\))
223                 SET(EXTRA_LIBS asound ${EXTRA_LIBS})
224             ENDIF()
225         ENDIF()
226     ENDIF()
227 ENDIF()
229 # Check OSS backend
230 IF(OSS)
231     CHECK_INCLUDE_FILE(sys/soundcard.h HAVE_SYS_SOUNDCARD_H)
232     IF("${HAVE_SYS_SOUNDCARD_H}")
233         SET(HAVE_OSS 1)
234         SET(ALC_OBJS  ${ALC_OBJS} Alc/oss.c)
235         SET(BACKENDS  ${BACKENDS} OSS)
236     ENDIF()
237 ENDIF()
239 # Check DSound/MMSystem backend
240 IF("${HAVE_WINDOWS_H}")
241     SET(CMAKE_REQUIRED_LIBRARIES ole32)
242     CHECK_C_SOURCE_COMPILES("int main() {return 0;}" HAVE_LIBOLE32)
243     SET(CMAKE_REQUIRED_LIBRARIES "")
244 #    CHECK_LIBRARY_EXISTS(ole32 CoInitialize "" HAVE_LIBOLE32)
245     IF("${HAVE_LIBOLE32}")
246         SET(EXTRA_LIBS ole32 ${EXTRA_LIBS})
247     ENDIF()
249     IF(DSOUND)
250         CHECK_INCLUDE_FILE(dsound.h HAVE_DSOUND_H)
251         IF("${HAVE_DSOUND_H}")
252             SET(HAVE_DSOUND 1)
253             SET(ALC_OBJS  ${ALC_OBJS} Alc/dsound.c)
254             SET(BACKENDS  ${BACKENDS} DirectSound)
256             CHECK_LIBRARY_EXISTS(dxguid IID_IDirectSound "" HAVE_LIBDXGUID)
257             IF("${HAVE_LIBDXGUID}")
258                 SET(EXTRA_LIBS dxguid ${EXTRA_LIBS})
259             ENDIF()
260         ENDIF()
261     ENDIF()
262     IF(WINMM)
263         CHECK_INCLUDE_FILES("windows.h;mmsystem.h" HAVE_MMSYSTEM_H)
264         IF("${HAVE_MMSYSTEM_H}")
265             SET(HAVE_WINMM 1)
266             SET(ALC_OBJS  ${ALC_OBJS} Alc/winmm.c)
267             SET(BACKENDS  ${BACKENDS} WinMM)
269             SET(CMAKE_REQUIRED_LIBRARIES winmm)
270             CHECK_C_SOURCE_COMPILES("int main() {return 0;}" HAVE_LIBWINMM)
271             SET(CMAKE_REQUIRED_LIBRARIES "")
272 #            CHECK_LIBRARY_EXISTS(winmm waveInOpen "" HAVE_LIBWINMM)
273             IF("${HAVE_LIBWINMM}")
274                 SET(EXTRA_LIBS winmm ${EXTRA_LIBS})
275             ENDIF()
276         ENDIF()
277     ENDIF()
278 ENDIF()
280 # This is always available
281 SET(BACKENDS  ${BACKENDS} WaveFile)
283 # End configuration
284 CONFIGURE_FILE(
285     "${OpenAL_SOURCE_DIR}/config.h.in"
286     "${OpenAL_BINARY_DIR}/config.h")
288 ADD_DEFINITIONS(-DAL_BUILD_LIBRARY)
290 # Build a shared library
291 IF("${WIN32}")
292     SET(LIBNAME openal32)
293 ELSE()
294     SET(LIBNAME openal)
295 ENDIF()
297 ADD_LIBRARY(${LIBNAME} SHARED ${OPENAL_OBJS} ${ALC_OBJS})
298 SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES VERSION ${LIB_VERSION}
299                                             SOVERSION ${LIB_MAJOR_VERSION})
300 IF("${WIN32}")
301     SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES PREFIX "")
302 ENDIF()
304 TARGET_LINK_LIBRARIES(${LIBNAME} ${EXTRA_LIBS})
306 # Add an install target here
307 INSTALL(TARGETS ${LIBNAME}
308         RUNTIME DESTINATION bin
309         LIBRARY DESTINATION lib
310         ARCHIVE DESTINATION lib
312 INSTALL(FILES include/AL/al.h
313               include/AL/alc.h
314         DESTINATION include/AL
317 MESSAGE(STATUS "")
318 MESSAGE(STATUS "Building OpenAL with support for the following backends:")
319 MESSAGE(STATUS "    ${BACKENDS}")
320 MESSAGE(STATUS "")