Release 1.4.272
[openal-soft.git] / CMakeLists.txt
blob57a0e95fa9487e1870a235399527823492c58e9c
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)
27 OPTION(EXAMPLES  "Build example programs"              ON)
30 SET(LIB_MAJOR_VERSION "1")
31 SET(LIB_MINOR_VERSION "4")
32 SET(LIB_BUILD_VERSION "272")
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(NOT CMAKE_BUILD_TYPE)
46     SET(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING
47         "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel."
48         FORCE)
49 ENDIF()
51 IF(MSVC)
52     # ???
53     SET(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -D_DEBUG")
54     SET(CMAKE_C_FLAGS_MINSIZEREL "${CMAKE_C_FLAGS_MINSIZEREL} -DNDEBUG")
55     SET(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -DNDEBUG")
56     SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -D_DEBUG")
57 ELSE()
58     ADD_DEFINITIONS(-Wall)
59     CHECK_C_COMPILER_FLAG(-Wextra HAVE_W_EXTRA)
60     IF("${HAVE_W_EXTRA}")
61         ADD_DEFINITIONS(-Wextra)
62     ENDIF()
64     IF(WERROR)
65         ADD_DEFINITIONS(-Werror)
66     ENDIF()
68     SET(CMAKE_C_FLAGS_RELWITHDEBINFO "-g -O2 -funroll-loops -D_DEBUG" CACHE STRING
69         "Flags used by the compiler during Release with Debug Info builds."
70         FORCE)
71     SET(CMAKE_C_FLAGS_MINSIZEREL "-Os -DNDEBUG" CACHE STRING
72         "Flags used by the compiler during release minsize builds."
73         FORCE)
74     SET(CMAKE_C_FLAGS_RELEASE "-O2 -funroll-loops -fomit-frame-pointer -DNDEBUG" CACHE STRING
75         "Flags used by the compiler during release builds"
76         FORCE)
77     SET(CMAKE_C_FLAGS_DEBUG "-g3 -D_DEBUG" CACHE STRING
78         "Flags used by the compiler during debug builds."
79         FORCE)
81     # Set visibility options if available
82     IF(NOT WIN32)
83         CHECK_C_SOURCE_COMPILES("int foo() __attribute__((destructor));
84                                  int main() {return 0;}" HAVE_GCC_DESTRUCTOR)
86         CHECK_C_COMPILER_FLAG(-fvisibility=hidden HAVE_VISIBILITY_SWITCH)
87         IF("${HAVE_VISIBILITY_SWITCH}")
88             CHECK_C_SOURCE_COMPILES("int foo() __attribute__((visibility(\"default\")));
89                                      int main() {return 0;}" HAVE_GCC_VISIBILITY)
90             IF("${HAVE_GCC_VISIBILITY}")
91                 ADD_DEFINITIONS(-fvisibility=hidden -DHAVE_GCC_VISIBILITY)
92             ENDIF()
93         ENDIF()
94     ENDIF()
95 ENDIF()
98 CHECK_LIBRARY_EXISTS(m  sqrtf  "" HAVE_SQRTF)
99 CHECK_LIBRARY_EXISTS(m  acosf  "" HAVE_ACOSF)
100 IF(HAVE_SQRTF OR HAVE_ACOSF)
101     SET(EXTRA_LIBS m ${EXTRA_LIBS})
102 ENDIF()
103 CHECK_FUNCTION_EXISTS(strtof HAVE_STRTOF)
105 CHECK_FUNCTION_EXISTS(strcasecmp HAVE_STRCASECMP)
106 IF(NOT HAVE_STRCASECMP)
107     CHECK_FUNCTION_EXISTS(_stricmp HAVE__STRICMP)
108     IF(NOT HAVE__STRICMP)
109         MESSAGE(FATAL_ERROR "No case-insensitive compare function found, please report!")
110     ENDIF()
112     ADD_DEFINITIONS(-Dstrcasecmp=_stricmp)
113 ENDIF()
115 CHECK_FUNCTION_EXISTS(strncasecmp HAVE_STRNCASECMP)
116 IF(NOT HAVE_STRNCASECMP)
117     CHECK_FUNCTION_EXISTS(_strnicmp HAVE__STRNICMP)
118     IF(NOT HAVE__STRNICMP)
119         MESSAGE(FATAL_ERROR "No case-insensitive size-limitted compare function found, please report!")
120     ENDIF()
122     ADD_DEFINITIONS(-Dstrncasecmp=_strnicmp)
123 ENDIF()
125 CHECK_FUNCTION_EXISTS(snprintf HAVE_SNPRINTF)
126 IF(NOT HAVE_SNPRINTF)
127     CHECK_FUNCTION_EXISTS(_snprintf HAVE__SNPRINTF)
128     IF(NOT HAVE__SNPRINTF)
129         MESSAGE(FATAL_ERROR "No snprintf function found, please report!")
130     ENDIF()
132     ADD_DEFINITIONS(-Dsnprintf=_snprintf)
133 ENDIF()
135 # Check for the dlopen API (for dynamicly loading backend libs)
136 IF(DLOPEN)
137     CHECK_INCLUDE_FILE(dlfcn.h HAVE_DLFCN_H)
138     IF(HAVE_DLFCN_H)
139         CHECK_LIBRARY_EXISTS(dl dlopen "" HAVE_LIBDL)
140         IF(HAVE_LIBDL)
141             SET(EXTRA_LIBS dl ${EXTRA_LIBS})
142         ENDIF()
143     ENDIF()
144 ENDIF()
146 # Check if we have Windows headers
147 CHECK_INCLUDE_FILE(windows.h HAVE_WINDOWS_H -D_WIN32_WINNT=0x0500)
148 IF(NOT HAVE_WINDOWS_H)
149     CHECK_FUNCTION_EXISTS(gettimeofday HAVE_GETTIMEOFDAY)
150     IF(NOT HAVE_GETTIMEOFDAY)
151         MESSAGE(FATAL_ERROR "No timing function found!")
152     ENDIF()
154     CHECK_FUNCTION_EXISTS(nanosleep HAVE_NANOSLEEP)
155     IF(NOT HAVE_NANOSLEEP)
156         MESSAGE(FATAL_ERROR "No sleep function found!")
157     ENDIF()
159     # We need pthreads outside of Windows
160     CHECK_INCLUDE_FILE(pthread.h HAVE_PTHREAD_H)
161     IF(NOT HAVE_PTHREAD_H)
162         MESSAGE(FATAL_ERROR "PThreads is required for non-Windows builds!")
163     ENDIF()
165     # Some systems need pthread_np.h to get recursive mutexes
166     CHECK_INCLUDE_FILES("pthread.h;pthread_np.h" HAVE_PTHREAD_NP_H)
168     # _GNU_SOURCE is needed on some systems for extra attributes, and
169     # _REENTRANT is needed for libc thread-safety
170     ADD_DEFINITIONS(-D_GNU_SOURCE=1 -D_REENTRANT)
171     CHECK_LIBRARY_EXISTS(pthread pthread_create "" HAVE_LIBPTHREAD)
172     IF(HAVE_LIBPTHREAD)
173         SET(EXTRA_LIBS pthread ${EXTRA_LIBS})
174     ENDIF()
175 ENDIF()
177 # Check for a 64-bit type
178 CHECK_INCLUDE_FILE(stdint.h HAVE_STDINT_H)
179 IF(NOT HAVE_STDINT_H)
180     IF(HAVE_WINDOWS_H)
181         CHECK_C_SOURCE_COMPILES("\#define _WIN32_WINNT 0x0500
182                                  \#include <windows.h>
183                                  __int64 foo;
184                                  int main() {return 0;}" HAVE___INT64)
185     ENDIF()
186     IF(NOT HAVE___INT64)
187         IF(NOT SIZEOF_LONG MATCHES "8")
188             IF(NOT SIZEOF_LONG_LONG MATCHES "8")
189                 MESSAGE(FATAL_ERROR "No 64-bit types found, please report!")
190             ENDIF()
191         ENDIF()
192     ENDIF()
193 ENDIF()
196 SET(OPENAL_OBJS  OpenAL32/alAuxEffectSlot.c
197                  OpenAL32/alBuffer.c
198                  OpenAL32/alEffect.c
199                  OpenAL32/alError.c
200                  OpenAL32/alExtension.c
201                  OpenAL32/alFilter.c
202                  OpenAL32/alListener.c
203                  OpenAL32/alSource.c
204                  OpenAL32/alState.c
205                  OpenAL32/alThunk.c
206                  OpenAL32/OpenAL32.c
208 SET(ALC_OBJS  Alc/ALc.c
209               Alc/ALu.c
210               Alc/alcConfig.c
211               Alc/alcRing.c
212               Alc/alcThread.c
213               Alc/bs2b.c
214               Alc/wave.c
217 SET(BACKENDS "")
219 # Check ALSA backend
220 IF(ALSA)
221     CHECK_INCLUDE_FILE(alsa/asoundlib.h HAVE_ALSA_ASOUNDLIB_H)
222     IF(HAVE_ALSA_ASOUNDLIB_H)
223         CHECK_LIBRARY_EXISTS(asound snd_pcm_open "" HAVE_LIBASOUND)
224         IF(HAVE_DLFCN_H OR HAVE_LIBASOUND)
225             SET(HAVE_ALSA 1)
226             SET(ALC_OBJS  ${ALC_OBJS} Alc/alsa.c)
227             IF(HAVE_DLFCN_H)
228                 SET(BACKENDS  "${BACKENDS} ALSA,")
229             ELSE()
230                 SET(BACKENDS  "${BACKENDS} ALSA \(linked\),")
231                 SET(EXTRA_LIBS asound ${EXTRA_LIBS})
232             ENDIF()
233         ENDIF()
234     ENDIF()
235 ENDIF()
237 # Check OSS backend
238 IF(OSS)
239     CHECK_INCLUDE_FILE(sys/soundcard.h HAVE_SYS_SOUNDCARD_H)
240     IF(HAVE_SYS_SOUNDCARD_H)
241         SET(HAVE_OSS 1)
242         SET(ALC_OBJS  ${ALC_OBJS} Alc/oss.c)
243         SET(BACKENDS  "${BACKENDS} OSS,")
244     ENDIF()
245 ENDIF()
247 # Check DSound/MMSystem backend
248 IF(HAVE_WINDOWS_H)
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             SET(CMAKE_REQUIRED_LIBRARIES dsound)
257             CHECK_C_SOURCE_COMPILES("int main() {return 0;}" HAVE_LIBDSOUND)
258             SET(CMAKE_REQUIRED_LIBRARIES "")
259 #            CHECK_LIBRARY_EXISTS(dsound DirectSoundCreate "" HAVE_LIBDSOUND)
260             IF(HAVE_LIBDSOUND)
261                 SET(EXTRA_LIBS dsound ${EXTRA_LIBS})
262             ENDIF()
263         ENDIF()
264     ENDIF()
265     IF(WINMM)
266         CHECK_INCLUDE_FILES("windows.h;mmsystem.h" HAVE_MMSYSTEM_H -D_WIN32_WINNT=0x0500)
267         IF(HAVE_MMSYSTEM_H)
268             SET(HAVE_WINMM 1)
269             SET(ALC_OBJS  ${ALC_OBJS} Alc/winmm.c)
270             SET(BACKENDS  "${BACKENDS} WinMM,")
272             SET(CMAKE_REQUIRED_LIBRARIES winmm)
273             CHECK_C_SOURCE_COMPILES("int main() {return 0;}" HAVE_LIBWINMM)
274             SET(CMAKE_REQUIRED_LIBRARIES "")
275 #            CHECK_LIBRARY_EXISTS(winmm waveInOpen "" HAVE_LIBWINMM)
276             IF(HAVE_LIBWINMM)
277                 SET(EXTRA_LIBS winmm ${EXTRA_LIBS})
278             ENDIF()
279         ENDIF()
280     ENDIF()
281 ENDIF()
283 # This is always available
284 SET(BACKENDS  "${BACKENDS} WaveFile")
286 # End configuration
287 CONFIGURE_FILE(
288     "${OpenAL_SOURCE_DIR}/config.h.in"
289     "${OpenAL_BINARY_DIR}/config.h")
291 ADD_DEFINITIONS(-DAL_BUILD_LIBRARY)
293 # Build a shared library
294 IF(WIN32)
295     SET(LIBNAME openal32)
296 ELSE()
297     SET(LIBNAME openal)
298 ENDIF()
300 ADD_LIBRARY(${LIBNAME} SHARED ${OPENAL_OBJS} ${ALC_OBJS})
301 SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES VERSION ${LIB_VERSION}
302                                             SOVERSION ${LIB_MAJOR_VERSION})
303 IF(WIN32)
304     SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES PREFIX "")
305 ENDIF()
307 TARGET_LINK_LIBRARIES(${LIBNAME} ${EXTRA_LIBS})
309 # Add an install target here
310 INSTALL(TARGETS ${LIBNAME}
311         RUNTIME DESTINATION bin
312         LIBRARY DESTINATION lib
313         ARCHIVE DESTINATION lib
315 INSTALL(FILES include/AL/al.h
316               include/AL/alc.h
317               include/AL/alext.h
318         DESTINATION include/AL
321 IF(EXAMPLES)
322     ADD_EXECUTABLE(openal-info examples/openal-info.c)
323     TARGET_LINK_LIBRARIES(openal-info ${LIBNAME})
324     INSTALL(TARGETS openal-info
325             RUNTIME DESTINATION bin
326             LIBRARY DESTINATION lib
327             ARCHIVE DESTINATION lib
328     )
329 ENDIF()
331 MESSAGE(STATUS "")
332 MESSAGE(STATUS "Building OpenAL with support for the following backends:")
333 MESSAGE(STATUS "    ${BACKENDS}")
334 MESSAGE(STATUS "")