Test for -W switch
[openal-soft.git] / CMakeLists.txt
blobb5721a0e48e9b28df1f513d1173dbe3cf6085243
1 # CMake build file list for OpenAL
3 INCLUDE(CheckLibraryExists)
4 INCLUDE(CheckIncludeFile)
5 INCLUDE(CheckCCompilerFlag)
6 INCLUDE(CheckCSourceCompiles)
7 INCLUDE(CheckTypeSize)
10 PROJECT(OpenAL)
13 SET(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS TRUE)
16 OPTION(ALSA    "ALSA backend"                ON)
17 OPTION(OSS     "OSS backend"                 ON)
18 OPTION(DSOUND  "DirectSound backend"         ON)
19 OPTION(WINMM   "Windows Multimedia backend"  ON)
21 OPTION(DLOPEN  "Use the dlopen API for loading optional libs"  ON)
23 OPTION(DEBUG    "Build lib in debug mode"                   OFF)
24 OPTION(NODEBUG  "Disable all debug info for optimizations"  OFF)
25 OPTION(WERROR   "Treat compile warnings as errors"          OFF)
28 SET(LIB_MAJOR_VERSION "1")
29 SET(LIB_MINOR_VERSION "0")
30 SET(LIB_BUILD_VERSION "0")
31 SET(LIB_VERSION "${LIB_MAJOR_VERSION}.${LIB_MINOR_VERSION}.${LIB_BUILD_VERSION}")
34 IF("${WIN32}")
35     SET(LIBNAME openal32)
36 ELSE()
37     SET(LIBNAME openal)
38 ENDIF()
41 CHECK_TYPE_SIZE("long" SIZEOF_LONG)
42 CHECK_TYPE_SIZE("long long" SIZEOF_LONG_LONG)
43 CHECK_TYPE_SIZE("unsigned int" SIZEOF_UINT)
44 CHECK_TYPE_SIZE("void*" SIZEOF_VOIDP)
47 # Add definitions, compiler switches, etc.
48 INCLUDE_DIRECTORIES(OpenAL32/Include include "${OpenAL_BINARY_DIR}")
49 SET(EXTRA_LIBS m ${EXTRA_LIBS})
51 IF("${MSVC}")
52     # ???
53 ELSE()
54     CHECK_C_COMPILER_FLAG(-W HAVE_W_SWITCH)
55     IF("${HAVE_W_SWITCH}")
56         ADD_DEFINITIONS(-W)
57     ENDIF()
59     ADD_DEFINITIONS(-Wall)
60     IF(WERROR)
61         ADD_DEFINITIONS(-Werror)
62     ENDIF()
63     IF(DEBUG)
64         ADD_DEFINITIONS(-g3)
65     ELSEIF(NODEBUG)
66         ADD_DEFINITIONS(-O2 -funroll-loops -fomit-frame-pointer)
67     ELSE()
68         ADD_DEFINITIONS(-g -O2 -funroll-loops)
69     ENDIF()
71     # The mixer doesn't like GCC's strict aliasing optimizations. Make sure
72     # it's turned off
73     CHECK_C_COMPILER_FLAG(-fstrict-aliasing HAVE_STRICT_ALIASING)
74     IF("${HAVE_STRICT_ALIASING}")
75         ADD_DEFINITIONS(-fno-strict-aliasing)
76     ENDIF()
78     # Set visibility options if available
79     IF(NOT "${WIN32}")
80         CHECK_C_SOURCE_COMPILES("int foo() __attribute__((destructor));
81                                  int main() {return 0;}" HAVE_GCC_DESTRUCTOR)
83         CHECK_C_COMPILER_FLAG(-fvisibility=hidden HAVE_VISIBILITY_SWITCH)
84         IF("${HAVE_VISIBILITY_SWITCH}")
85             CHECK_C_SOURCE_COMPILES("int foo() __attribute__((visibility(\"default\")));
86                                      int main() {return 0;}" HAVE_GCC_VISIBILITY)
87             IF("${HAVE_GCC_VISIBILITY}")
88                 ADD_DEFINITIONS(-fvisibility=hidden -DHAVE_GCC_VISIBILITY)
89             ENDIF()
90         ENDIF()
91     ENDIF()
92 ENDIF()
94 IF(DEBUG)
95     ADD_DEFINITIONS(-D_DEBUG)
96 ELSEIF(NODEBUG)
97     ADD_DEFINITIONS(-DNDEBUG)
98 ENDIF()
100 CHECK_LIBRARY_EXISTS(m  sqrtf  "" HAVE_SQRTF)
101 CHECK_LIBRARY_EXISTS("" strtof "" HAVE_STRTOF)
103 CHECK_LIBRARY_EXISTS("" strcasecmp "" HAVE_STRCASECMP)
104 IF(NOT "${HAVE_STRCASECMP}")
105     CHECK_LIBRARY_EXISTS("" _stricmp "" HAVE__STRICMP)
106     IF(NOT "${HAVE__STRICMP}")
107         MESSAGE(FATAL_ERROR "No case-insensitive compare function found, please report!")
108     ENDIF()
110     ADD_DEFINITIONS(-Dstrcasecmp=_stricmp)
111 ENDIF()
113 # Check for the dlopen API (for dynamicly loading backend libs)
114 IF(DLOPEN)
115     CHECK_INCLUDE_FILE(dlfcn.h HAVE_DLFCN_H)
116     IF("${HAVE_DLFCN_H}")
117         CHECK_LIBRARY_EXISTS(dl dlopen "" HAVE_LIBDL)
118         IF("${HAVE_LIBDL}")
119             SET(EXTRA_LIBS dl ${EXTRA_LIBS})
120         ENDIF()
121     ENDIF()
122 ENDIF()
124 # Check if we have Windows headers
125 CHECK_INCLUDE_FILE(windows.h HAVE_WINDOWS_H)
126 IF(NOT "${HAVE_WINDOWS_H}")
127     # We need pthreads outside of Windows
128     CHECK_INCLUDE_FILE(pthread.h HAVE_PTHREAD_H)
129     IF(NOT "${HAVE_PTHREAD_H}")
130         MESSAGE(FATAL_ERROR "PThreads is required for non-Windows builds!")
131     ENDIF()
133     # _GNU_SOURCE is needed on some systems for extra attributes, and
134     # _REENTRANT is needed for libc thread-safety
135     ADD_DEFINITIONS(-D_GNU_SOURCE=1 -D_REENTRANT)
136     CHECK_LIBRARY_EXISTS(pthread pthread_create "" HAVE_LIBPTHREAD)
137     IF("${HAVE_LIBPTHREAD}")
138         SET(EXTRA_LIBS pthread ${EXTRA_LIBS})
139     ENDIF()
140 ENDIF()
142 # Check for a 64-bit type
143 CHECK_INCLUDE_FILE(stdint.h HAVE_STDINT_H)
144 IF(NOT "${HAVE_STDINT_H}")
145     IF("${HAVE_WINDOWS_H}")
146         CHECK_C_SOURCE_COMPILES("\#include <windows.h>
147                                  __int64 foo;
148                                  int main() {return 0;}" HAVE___INT64)
149     ENDIF()
150     IF(NOT "${HAVE___INT64}")
151         IF(NOT "${SIZEOF_LONG}" MATCHES "8")
152             IF(NOT "${SIZEOF_LONG_LONG}" MATCHES "8")
153                 MESSAGE(FATAL_ERROR "No 64-bit types found, please report!")
154             ENDIF()
155         ENDIF()
156     ENDIF()
157 ENDIF()
160 SET(OPENAL_OBJS  OpenAL32/alBuffer.c
161                  OpenAL32/alError.c
162                  OpenAL32/alExtension.c
163                  OpenAL32/alListener.c
164                  OpenAL32/alSource.c
165                  OpenAL32/alState.c
166                  OpenAL32/alThunk.c
167                  OpenAL32/OpenAL32.c
169 SET(ALC_OBJS  Alc/ALc.c
170               Alc/ALu.c
171               Alc/alcConfig.c
172               Alc/alcThread.c
175 SET(BACKENDS "")
177 # Check ALSA backend
178 IF(ALSA)
179     CHECK_INCLUDE_FILE(alsa/asoundlib.h HAVE_ALSA_ASOUNDLIB_H)
180     IF("${HAVE_ALSA_ASOUNDLIB_H}")
181         CHECK_LIBRARY_EXISTS(asound snd_pcm_open "" HAVE_LIBASOUND)
182         IF("${HAVE_DLFCN_H}" OR "${HAVE_LIBASOUND}")
183             SET(HAVE_ALSA 1)
184             SET(ALC_OBJS  ${ALC_OBJS} Alc/alsa.c)
185             IF("${HAVE_DLFCN_H}")
186                 SET(BACKENDS  ${BACKENDS} ALSA)
187             ELSE()
188                 SET(BACKENDS  ${BACKENDS} ALSA\(linked\))
189                 SET(EXTRA_LIBS asound ${EXTRA_LIBS})
190             ENDIF()
191         ENDIF()
192     ENDIF()
193 ENDIF()
195 # Check OSS backend
196 IF(OSS)
197     CHECK_INCLUDE_FILE(sys/soundcard.h HAVE_SYS_SOUNDCARD_H)
198     IF("${HAVE_SYS_SOUNDCARD_H}")
199         SET(HAVE_OSS 1)
200         SET(ALC_OBJS  ${ALC_OBJS} Alc/oss.c)
201         SET(BACKENDS  ${BACKENDS} OSS)
202     ENDIF()
203 ENDIF()
205 # Check DSound/MMSystem backend
206 IF("${HAVE_WINDOWS_H}")
207     SET(CMAKE_REQUIRED_LIBRARIES ole32)
208     CHECK_C_SOURCE_COMPILES("int main() {return 0;}" HAVE_LIBOLE32)
209     SET(CMAKE_REQUIRED_LIBRARIES "")
210 #    CHECK_LIBRARY_EXISTS(ole32 CoInitialize "" HAVE_LIBOLE32)
211     IF("${HAVE_LIBOLE32}")
212         SET(EXTRA_LIBS ole32 ${EXTRA_LIBS})
213     ENDIF()
215     IF(DSOUND)
216         CHECK_INCLUDE_FILE(dsound.h HAVE_DSOUND_H)
217         IF("${HAVE_DSOUND_H}")
218             SET(HAVE_DSOUND 1)
219             SET(ALC_OBJS  ${ALC_OBJS} Alc/dsound.c)
220             SET(BACKENDS  ${BACKENDS} DirectSound)
222             CHECK_LIBRARY_EXISTS(dxguid IID_IDirectSound "" HAVE_LIBDXGUID)
223             IF("${HAVE_LIBDXGUID}")
224                 SET(EXTRA_LIBS dxguid ${EXTRA_LIBS})
225             ENDIF()
226         ENDIF()
227     ENDIF()
228     IF(WINMM)
229         CHECK_C_SOURCE_COMPILES("\#include <windows.h>
230                                  \#include <mmsystem.h>
231                                  int main() {return 0;}" HAVE_MMSYSTEM_H)
232         IF("${HAVE_MMSYSTEM_H}")
233             SET(HAVE_WINMM 1)
234             SET(ALC_OBJS  ${ALC_OBJS} Alc/winmm.c)
235             SET(BACKENDS  ${BACKENDS} WinMM)
237             SET(CMAKE_REQUIRED_LIBRARIES winmm)
238             CHECK_C_SOURCE_COMPILES("int main() {return 0;}" HAVE_LIBWINMM)
239             SET(CMAKE_REQUIRED_LIBRARIES "")
240 #            CHECK_LIBRARY_EXISTS(winmm waveInOpen "" HAVE_LIBWINMM)
241             IF("${HAVE_LIBWINMM}")
242                 SET(EXTRA_LIBS winmm ${EXTRA_LIBS})
243             ENDIF()
244         ENDIF()
245     ENDIF()
246 ENDIF()
248 # End configuration
249 CONFIGURE_FILE(
250     "${OpenAL_SOURCE_DIR}/config.h.in"
251     "${OpenAL_BINARY_DIR}/config.h")
253 ADD_DEFINITIONS(-DAL_BUILD_LIBRARY)
255 # Build a shared library
256 ADD_LIBRARY(${LIBNAME} SHARED ${OPENAL_OBJS} ${ALC_OBJS})
257 SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES VERSION ${LIB_VERSION} SOVERSION ${LIB_MAJOR_VERSION})
259 TARGET_LINK_LIBRARIES(${LIBNAME} ${EXTRA_LIBS})
261 # Add an install target here
262 INSTALL(TARGETS ${LIBNAME}
263         RUNTIME DESTINATION bin
264         LIBRARY DESTINATION lib
265         ARCHIVE DESTINATION lib
267 INSTALL(FILES include/AL/al.h
268               include/AL/alc.h
269         DESTINATION include/AL
272 MESSAGE(STATUS "")
273 MESSAGE(STATUS "Building OpenAL with support for the following backends:")
274 MESSAGE(STATUS "    ${BACKENDS}")
275 MESSAGE(STATUS "")