Remove -fno-strict-aliasing as the code should be safe, now
[openal-soft.git] / CMakeLists.txt
blob363c7974cf4c11fda6a36fe8888b70f05690769c
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    "Check for ALSA backend"                ON)
19 OPTION(OSS     "Check for OSS backend"                 ON)
20 OPTION(DSOUND  "Check for DirectSound backend"         ON)
21 OPTION(WINMM   "Check for Windows Multimedia backend"  ON)
23 OPTION(DLOPEN  "Check for the dlopen API for loading optional libs"  ON)
25 OPTION(WERROR   "Treat compile warnings as errors"          OFF)
28 SET(LIB_MAJOR_VERSION "1")
29 SET(LIB_MINOR_VERSION "3")
30 SET(LIB_BUILD_VERSION "253")
31 SET(LIB_VERSION "${LIB_MAJOR_VERSION}.${LIB_MINOR_VERSION}.${LIB_BUILD_VERSION}")
34 CHECK_TYPE_SIZE("long" SIZEOF_LONG)
35 CHECK_TYPE_SIZE("long long" SIZEOF_LONG_LONG)
36 CHECK_TYPE_SIZE("unsigned int" SIZEOF_UINT)
37 CHECK_TYPE_SIZE("void*" SIZEOF_VOIDP)
40 # Add definitions, compiler switches, etc.
41 INCLUDE_DIRECTORIES(OpenAL32/Include include "${OpenAL_BINARY_DIR}")
43 IF(NOT CMAKE_BUILD_TYPE)
44     SET(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING
45         "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel."
46         FORCE)
47 ENDIF()
49 IF(MSVC)
50     # ???
51     SET(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -D_DEBUG")
52     SET(CMAKE_C_FLAGS_MINSIZEREL "${CMAKE_C_FLAGS_MINSIZEREL} -DNDEBUG")
53     SET(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -DNDEBUG")
54     SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -D_DEBUG")
55 ELSE()
56     ADD_DEFINITIONS(-Wall)
57     CHECK_C_COMPILER_FLAG(-Wextra HAVE_W_EXTRA)
58     IF("${HAVE_W_EXTRA}")
59         ADD_DEFINITIONS(-Wextra)
60     ENDIF()
62     IF(WERROR)
63         ADD_DEFINITIONS(-Werror)
64     ENDIF()
66     SET(CMAKE_C_FLAGS_RELWITHDEBINFO "-g -O2 -funroll-loops -D_DEBUG" CACHE STRING
67         "Flags used by the compiler during Release with Debug Info builds."
68         FORCE)
69     SET(CMAKE_C_FLAGS_MINSIZEREL "-Os -DNDEBUG" CACHE STRING
70         "Flags used by the compiler during release minsize builds."
71         FORCE)
72     SET(CMAKE_C_FLAGS_RELEASE "-O2 -funroll-loops -fomit-frame-pointer -DNDEBUG" CACHE STRING
73         "Flags used by the compiler during release builds"
74         FORCE)
75     SET(CMAKE_C_FLAGS_DEBUG "-g3 -D_DEBUG" CACHE STRING
76         "Flags used by the compiler during debug builds."
77         FORCE)
79     # Set visibility options if available
80     IF(NOT WIN32)
81         CHECK_C_SOURCE_COMPILES("int foo() __attribute__((destructor));
82                                  int main() {return 0;}" HAVE_GCC_DESTRUCTOR)
84         CHECK_C_COMPILER_FLAG(-fvisibility=hidden HAVE_VISIBILITY_SWITCH)
85         IF("${HAVE_VISIBILITY_SWITCH}")
86             CHECK_C_SOURCE_COMPILES("int foo() __attribute__((visibility(\"default\")));
87                                      int main() {return 0;}" HAVE_GCC_VISIBILITY)
88             IF("${HAVE_GCC_VISIBILITY}")
89                 ADD_DEFINITIONS(-fvisibility=hidden -DHAVE_GCC_VISIBILITY)
90             ENDIF()
91         ENDIF()
92     ENDIF()
93 ENDIF()
96 CHECK_LIBRARY_EXISTS(m  sqrtf  "" HAVE_SQRTF)
97 CHECK_LIBRARY_EXISTS(m  acosf  "" HAVE_ACOSF)
98 IF(HAVE_SQRTF OR HAVE_ACOSF)
99     SET(EXTRA_LIBS m ${EXTRA_LIBS})
100 ENDIF()
101 CHECK_FUNCTION_EXISTS(strtof HAVE_STRTOF)
103 CHECK_FUNCTION_EXISTS(strcasecmp HAVE_STRCASECMP)
104 IF(NOT HAVE_STRCASECMP)
105     CHECK_FUNCTION_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_FUNCTION_EXISTS(strncasecmp HAVE_STRNCASECMP)
114 IF(NOT HAVE_STRNCASECMP)
115     CHECK_FUNCTION_EXISTS(_strnicmp HAVE__STRNICMP)
116     IF(NOT HAVE__STRNICMP)
117         MESSAGE(FATAL_ERROR "No case-insensitive size-limitted compare function found, please report!")
118     ENDIF()
120     ADD_DEFINITIONS(-Dstrncasecmp=_strnicmp)
121 ENDIF()
123 CHECK_FUNCTION_EXISTS(snprintf HAVE_SNPRINTF)
124 IF(NOT HAVE_SNPRINTF)
125     CHECK_FUNCTION_EXISTS(_snprintf HAVE__SNPRINTF)
126     IF(NOT HAVE__SNPRINTF)
127         MESSAGE(FATAL_ERROR "No snprintf function found, please report!")
128     ENDIF()
130     ADD_DEFINITIONS(-Dsnprintf=_snprintf)
131 ENDIF()
133 # Check for the dlopen API (for dynamicly loading backend libs)
134 IF(DLOPEN)
135     CHECK_INCLUDE_FILE(dlfcn.h HAVE_DLFCN_H)
136     IF(HAVE_DLFCN_H)
137         CHECK_LIBRARY_EXISTS(dl dlopen "" HAVE_LIBDL)
138         IF(HAVE_LIBDL)
139             SET(EXTRA_LIBS dl ${EXTRA_LIBS})
140         ENDIF()
141     ENDIF()
142 ENDIF()
144 # Check if we have Windows headers
145 CHECK_INCLUDE_FILE(windows.h HAVE_WINDOWS_H -D_WIN32_WINNT=0x0500)
146 IF(NOT HAVE_WINDOWS_H)
147     CHECK_FUNCTION_EXISTS(gettimeofday HAVE_GETTIMEOFDAY)
148     IF(NOT HAVE_GETTIMEOFDAY)
149         MESSAGE(FATAL_ERROR "No timing function found!")
150     ENDIF()
152     CHECK_FUNCTION_EXISTS(nanosleep HAVE_NANOSLEEP)
153     IF(NOT HAVE_NANOSLEEP)
154         MESSAGE(FATAL_ERROR "No sleep function found!")
155     ENDIF()
157     # We need pthreads outside of Windows
158     CHECK_INCLUDE_FILE(pthread.h HAVE_PTHREAD_H)
159     IF(NOT HAVE_PTHREAD_H)
160         MESSAGE(FATAL_ERROR "PThreads is required for non-Windows builds!")
161     ENDIF()
163     # Some systems need pthread_np.h to get recursive mutexes
164     CHECK_INCLUDE_FILES("pthread.h;pthread_np.h" HAVE_PTHREAD_NP_H)
166     # _GNU_SOURCE is needed on some systems for extra attributes, and
167     # _REENTRANT is needed for libc thread-safety
168     ADD_DEFINITIONS(-D_GNU_SOURCE=1 -D_REENTRANT)
169     CHECK_LIBRARY_EXISTS(pthread pthread_create "" HAVE_LIBPTHREAD)
170     IF(HAVE_LIBPTHREAD)
171         SET(EXTRA_LIBS pthread ${EXTRA_LIBS})
172     ENDIF()
173 ENDIF()
175 # Check for a 64-bit type
176 CHECK_INCLUDE_FILE(stdint.h HAVE_STDINT_H)
177 IF(NOT HAVE_STDINT_H)
178     IF(HAVE_WINDOWS_H)
179         CHECK_C_SOURCE_COMPILES("\#define _WIN32_WINNT 0x0500
180                                  \#include <windows.h>
181                                  __int64 foo;
182                                  int main() {return 0;}" HAVE___INT64)
183     ENDIF()
184     IF(NOT HAVE___INT64)
185         IF(NOT SIZEOF_LONG MATCHES "8")
186             IF(NOT SIZEOF_LONG_LONG MATCHES "8")
187                 MESSAGE(FATAL_ERROR "No 64-bit types found, please report!")
188             ENDIF()
189         ENDIF()
190     ENDIF()
191 ENDIF()
194 SET(OPENAL_OBJS  OpenAL32/alAuxEffectSlot.c
195                  OpenAL32/alBuffer.c
196                  OpenAL32/alEffect.c
197                  OpenAL32/alError.c
198                  OpenAL32/alExtension.c
199                  OpenAL32/alFilter.c
200                  OpenAL32/alListener.c
201                  OpenAL32/alSource.c
202                  OpenAL32/alState.c
203                  OpenAL32/alThunk.c
204                  OpenAL32/OpenAL32.c
206 SET(ALC_OBJS  Alc/ALc.c
207               Alc/ALu.c
208               Alc/alcConfig.c
209               Alc/alcRing.c
210               Alc/alcThread.c
211               Alc/bs2b.c
212               Alc/wave.c
215 SET(BACKENDS "")
217 # Check ALSA backend
218 IF(ALSA)
219     CHECK_INCLUDE_FILE(alsa/asoundlib.h HAVE_ALSA_ASOUNDLIB_H)
220     IF(HAVE_ALSA_ASOUNDLIB_H)
221         CHECK_LIBRARY_EXISTS(asound snd_pcm_open "" HAVE_LIBASOUND)
222         IF(HAVE_DLFCN_H OR HAVE_LIBASOUND)
223             SET(HAVE_ALSA 1)
224             SET(ALC_OBJS  ${ALC_OBJS} Alc/alsa.c)
225             IF(HAVE_DLFCN_H)
226                 SET(BACKENDS  "${BACKENDS} ALSA,")
227             ELSE()
228                 SET(BACKENDS  "${BACKENDS} ALSA \(linked\),")
229                 SET(EXTRA_LIBS asound ${EXTRA_LIBS})
230             ENDIF()
231         ENDIF()
232     ENDIF()
233 ENDIF()
235 # Check OSS backend
236 IF(OSS)
237     CHECK_INCLUDE_FILE(sys/soundcard.h HAVE_SYS_SOUNDCARD_H)
238     IF(HAVE_SYS_SOUNDCARD_H)
239         SET(HAVE_OSS 1)
240         SET(ALC_OBJS  ${ALC_OBJS} Alc/oss.c)
241         SET(BACKENDS  "${BACKENDS} OSS,")
242     ENDIF()
243 ENDIF()
245 # Check DSound/MMSystem backend
246 IF(HAVE_WINDOWS_H)
247     IF(DSOUND)
248         CHECK_INCLUDE_FILE(dsound.h HAVE_DSOUND_H)
249         IF(HAVE_DSOUND_H)
250             SET(HAVE_DSOUND 1)
251             SET(ALC_OBJS  ${ALC_OBJS} Alc/dsound.c)
252             SET(BACKENDS  "${BACKENDS} DirectSound,")
254             SET(CMAKE_REQUIRED_LIBRARIES dsound)
255             CHECK_C_SOURCE_COMPILES("int main() {return 0;}" HAVE_LIBDSOUND)
256             SET(CMAKE_REQUIRED_LIBRARIES "")
257 #            CHECK_LIBRARY_EXISTS(dsound DirectSoundCreate "" HAVE_LIBDSOUND)
258             IF(HAVE_LIBDSOUND)
259                 SET(EXTRA_LIBS dsound ${EXTRA_LIBS})
260             ENDIF()
261         ENDIF()
262     ENDIF()
263     IF(WINMM)
264         CHECK_INCLUDE_FILES("windows.h;mmsystem.h" HAVE_MMSYSTEM_H -D_WIN32_WINNT=0x0500)
265         IF(HAVE_MMSYSTEM_H)
266             SET(HAVE_WINMM 1)
267             SET(ALC_OBJS  ${ALC_OBJS} Alc/winmm.c)
268             SET(BACKENDS  "${BACKENDS} WinMM,")
270             SET(CMAKE_REQUIRED_LIBRARIES winmm)
271             CHECK_C_SOURCE_COMPILES("int main() {return 0;}" HAVE_LIBWINMM)
272             SET(CMAKE_REQUIRED_LIBRARIES "")
273 #            CHECK_LIBRARY_EXISTS(winmm waveInOpen "" HAVE_LIBWINMM)
274             IF(HAVE_LIBWINMM)
275                 SET(EXTRA_LIBS winmm ${EXTRA_LIBS})
276             ENDIF()
277         ENDIF()
278     ENDIF()
279 ENDIF()
281 # This is always available
282 SET(BACKENDS  "${BACKENDS} WaveFile")
284 # End configuration
285 CONFIGURE_FILE(
286     "${OpenAL_SOURCE_DIR}/config.h.in"
287     "${OpenAL_BINARY_DIR}/config.h")
289 ADD_DEFINITIONS(-DAL_BUILD_LIBRARY)
291 # Build a shared library
292 IF(WIN32)
293     SET(LIBNAME openal32)
294 ELSE()
295     SET(LIBNAME openal)
296 ENDIF()
298 ADD_LIBRARY(${LIBNAME} SHARED ${OPENAL_OBJS} ${ALC_OBJS})
299 SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES VERSION ${LIB_VERSION}
300                                             SOVERSION ${LIB_MAJOR_VERSION})
301 IF(WIN32)
302     SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES PREFIX "")
303 ENDIF()
305 TARGET_LINK_LIBRARIES(${LIBNAME} ${EXTRA_LIBS})
307 # Add an install target here
308 INSTALL(TARGETS ${LIBNAME}
309         RUNTIME DESTINATION bin
310         LIBRARY DESTINATION lib
311         ARCHIVE DESTINATION lib
313 INSTALL(FILES include/AL/al.h
314               include/AL/alc.h
315               include/AL/alext.h
316         DESTINATION include/AL
319 MESSAGE(STATUS "")
320 MESSAGE(STATUS "Building OpenAL with support for the following backends:")
321 MESSAGE(STATUS "    ${BACKENDS}")
322 MESSAGE(STATUS "")