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