Add _DEBUG/NDEBUG defines when DEBUG/NODEBUG options are used, respectively
[openal-soft.git] / CMakeLists.txt
blobc6caaa77aa58e6f69044c80107210ef2041c2f1b
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     ADD_DEFINITIONS(-W -Wall)
55     IF(WERROR)
56         ADD_DEFINITIONS(-Werror)
57     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_SOURCE_COMPILES("int foo() __attribute__((visibility(\"default\")));
79                                  int main() {return 0;}" HAVE_GCC_VISIBILITY)
80         IF("${HAVE_GCC_VISIBILITY}")
81             ADD_DEFINITIONS(-fvisibility=hidden -DHAVE_GCC_VISIBILITY)
82         ENDIF()
83     ENDIF()
84 ENDIF()
86 IF(DEBUG)
87     ADD_DEFINITIONS(-D_DEBUG)
88 ELSEIF(NODEBUG)
89     ADD_DEFINITIONS(-DNDEBUG)
90 ENDIF()
92 CHECK_LIBRARY_EXISTS(m  sqrtf  "" HAVE_SQRTF)
93 CHECK_LIBRARY_EXISTS("" strtof "" HAVE_STRTOF)
95 CHECK_LIBRARY_EXISTS("" strcasecmp "" HAVE_STRCASECMP)
96 IF(NOT "${HAVE_STRCASECMP}")
97     CHECK_LIBRARY_EXISTS("" _stricmp "" HAVE__STRICMP)
98     IF(NOT "${HAVE__STRICMP}")
99         MESSAGE(FATAL_ERROR "No case-insensitive compare function found, please report!")
100     ENDIF()
102     ADD_DEFINITIONS(-Dstrcasecmp=_stricmp)
103 ENDIF()
105 # Check for the dlopen API (for dynamicly loading backend libs)
106 IF(DLOPEN)
107     CHECK_INCLUDE_FILE(dlfcn.h HAVE_DLFCN_H)
108     IF("${HAVE_DLFCN_H}")
109         CHECK_LIBRARY_EXISTS(dl dlopen "" HAVE_LIBDL)
110         IF("${HAVE_LIBDL}")
111             SET(EXTRA_LIBS dl ${EXTRA_LIBS})
112         ENDIF()
113     ENDIF()
114 ENDIF()
116 # Check if we have Windows headers
117 CHECK_INCLUDE_FILE(windows.h HAVE_WINDOWS_H)
118 IF(NOT "${HAVE_WINDOWS_H}")
119     # We need pthreads outside of Windows
120     CHECK_INCLUDE_FILE(pthread.h HAVE_PTHREAD_H)
121     IF(NOT "${HAVE_PTHREAD_H}")
122         MESSAGE(FATAL_ERROR "PThreads is required for non-Windows builds!")
123     ENDIF()
125     # _GNU_SOURCE is needed on some systems for extra attributes, and
126     # _REENTRANT is needed for libc thread-safety
127     ADD_DEFINITIONS(-D_GNU_SOURCE=1 -D_REENTRANT)
128     CHECK_LIBRARY_EXISTS(pthread pthread_create "" HAVE_LIBPTHREAD)
129     IF("${HAVE_LIBPTHREAD}")
130         SET(EXTRA_LIBS pthread ${EXTRA_LIBS})
131     ENDIF()
132 ENDIF()
134 # Check for a 64-bit type
135 CHECK_INCLUDE_FILE(stdint.h HAVE_STDINT_H)
136 IF(NOT "${HAVE_STDINT_H}")
137     IF("${HAVE_WINDOWS_H}")
138         CHECK_C_SOURCE_COMPILES("\#include <windows.h>
139                                  __int64 foo;
140                                  int main() {return 0;}" HAVE___INT64)
141     ENDIF()
142     IF(NOT "${HAVE___INT64}")
143         IF(NOT "${SIZEOF_LONG}" MATCHES "8")
144             IF(NOT "${SIZEOF_LONG_LONG}" MATCHES "8")
145                 MESSAGE(FATAL_ERROR "No 64-bit types found, please report!")
146             ENDIF()
147         ENDIF()
148     ENDIF()
149 ENDIF()
152 SET(OPENAL_OBJS  OpenAL32/alBuffer.c
153                  OpenAL32/alError.c
154                  OpenAL32/alExtension.c
155                  OpenAL32/alListener.c
156                  OpenAL32/alSource.c
157                  OpenAL32/alState.c
158                  OpenAL32/alThunk.c
159                  OpenAL32/OpenAL32.c
161 SET(ALC_OBJS  Alc/ALc.c
162               Alc/ALu.c
163               Alc/alcConfig.c
164               Alc/alcThread.c
167 SET(BACKENDS "")
169 # Check ALSA backend
170 IF(ALSA)
171     CHECK_INCLUDE_FILE(alsa/asoundlib.h HAVE_ALSA_ASOUNDLIB_H)
172     IF("${HAVE_ALSA_ASOUNDLIB_H}")
173         CHECK_LIBRARY_EXISTS(asound snd_pcm_open "" HAVE_LIBASOUND)
174         IF("${HAVE_DLFCN_H}" OR "${HAVE_LIBASOUND}")
175             SET(HAVE_ALSA 1)
176             SET(ALC_OBJS  ${ALC_OBJS} Alc/alsa.c)
177             IF("${HAVE_DLFCN_H}")
178                 SET(BACKENDS  ${BACKENDS} ALSA)
179             ELSE()
180                 SET(BACKENDS  ${BACKENDS} ALSA\(linked\))
181                 SET(EXTRA_LIBS asound ${EXTRA_LIBS})
182             ENDIF()
183         ENDIF()
184     ENDIF()
185 ENDIF()
187 # Check OSS backend
188 IF(OSS)
189     CHECK_INCLUDE_FILE(sys/soundcard.h HAVE_SYS_SOUNDCARD_H)
190     IF("${HAVE_SYS_SOUNDCARD_H}")
191         SET(HAVE_OSS 1)
192         SET(ALC_OBJS  ${ALC_OBJS} Alc/oss.c)
193         SET(BACKENDS  ${BACKENDS} OSS)
194     ENDIF()
195 ENDIF()
197 # Check DSound/MMSystem backend
198 IF("${HAVE_WINDOWS_H}")
199     SET(CMAKE_REQUIRED_LIBRARIES ole32)
200     CHECK_C_SOURCE_COMPILES("int main() {return 0;}" HAVE_LIBOLE32)
201     SET(CMAKE_REQUIRED_LIBRARIES "")
202 #    CHECK_LIBRARY_EXISTS(ole32 CoInitialize "" HAVE_LIBOLE32)
203     IF("${HAVE_LIBOLE32}")
204         SET(EXTRA_LIBS ole32 ${EXTRA_LIBS})
205     ENDIF()
207     IF(DSOUND)
208         CHECK_INCLUDE_FILE(dsound.h HAVE_DSOUND_H)
209         IF("${HAVE_DSOUND_H}")
210             SET(HAVE_DSOUND 1)
211             SET(ALC_OBJS  ${ALC_OBJS} Alc/dsound.c)
212             SET(BACKENDS  ${BACKENDS} DirectSound)
214             CHECK_LIBRARY_EXISTS(dxguid IID_IDirectSound "" HAVE_LIBDXGUID)
215             IF("${HAVE_LIBDXGUID}")
216                 SET(EXTRA_LIBS dxguid ${EXTRA_LIBS})
217             ENDIF()
218         ENDIF()
219     ENDIF()
220     IF(WINMM)
221         CHECK_C_SOURCE_COMPILES("\#include <windows.h>
222                                  \#include <mmsystem.h>
223                                  int main() {return 0;}" HAVE_MMSYSTEM_H)
224         IF("${HAVE_MMSYSTEM_H}")
225             SET(HAVE_WINMM 1)
226             SET(ALC_OBJS  ${ALC_OBJS} Alc/winmm.c)
227             SET(BACKENDS  ${BACKENDS} WinMM)
229             SET(CMAKE_REQUIRED_LIBRARIES winmm)
230             CHECK_C_SOURCE_COMPILES("int main() {return 0;}" HAVE_LIBWINMM)
231             SET(CMAKE_REQUIRED_LIBRARIES "")
232 #            CHECK_LIBRARY_EXISTS(winmm waveInOpen "" HAVE_LIBWINMM)
233             IF("${HAVE_LIBWINMM}")
234                 SET(EXTRA_LIBS winmm ${EXTRA_LIBS})
235             ENDIF()
236         ENDIF()
237     ENDIF()
238 ENDIF()
240 # End configuration
241 CONFIGURE_FILE(
242     "${OpenAL_SOURCE_DIR}/config.h.in"
243     "${OpenAL_BINARY_DIR}/config.h")
245 ADD_DEFINITIONS(-DAL_BUILD_LIBRARY)
247 # Build a shared library
248 ADD_LIBRARY(${LIBNAME} SHARED ${OPENAL_OBJS} ${ALC_OBJS})
249 SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES VERSION ${LIB_VERSION} SOVERSION ${LIB_MAJOR_VERSION})
251 TARGET_LINK_LIBRARIES(${LIBNAME} ${EXTRA_LIBS})
253 # Add an install target here
254 INSTALL(TARGETS ${LIBNAME}
255         RUNTIME DESTINATION bin
256         LIBRARY DESTINATION lib
257         ARCHIVE DESTINATION lib
259 INSTALL(FILES include/AL/al.h
260               include/AL/alc.h
261         DESTINATION include/AL
264 MESSAGE(STATUS "")
265 MESSAGE(STATUS "Building OpenAL with support for the following backends:")
266 MESSAGE(STATUS "    ${BACKENDS}")
267 MESSAGE(STATUS "")