Let CMAKE_DEBUG_POSTFIX be exposed for graphical CMake front-ends
[openal-soft.git] / CMakeLists.txt
blobd418b4289ad1114c12621654429200d3db811e69
1 # CMake build file list for OpenAL
3 CMAKE_MINIMUM_REQUIRED(VERSION 2.4)
5 IF(COMMAND CMAKE_POLICY)
6   CMAKE_POLICY(SET CMP0003 NEW)
7 ENDIF(COMMAND CMAKE_POLICY)
9 INCLUDE(CheckFunctionExists)
10 INCLUDE(CheckLibraryExists)
11 INCLUDE(CheckIncludeFile)
12 INCLUDE(CheckIncludeFiles)
13 INCLUDE(CheckCCompilerFlag)
14 INCLUDE(CheckCSourceCompiles)
15 INCLUDE(CheckTypeSize)
18 PROJECT(OpenAL C)
21 SET(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS TRUE)
24 OPTION(ALSA    "Check for ALSA backend"                ON)
25 OPTION(OSS     "Check for OSS backend"                 ON)
26 OPTION(SOLARIS "Check for Solaris backend"             ON)
27 OPTION(DSOUND  "Check for DirectSound backend"         ON)
28 OPTION(WINMM   "Check for Windows Multimedia backend"  ON)
30 OPTION(DLOPEN  "Check for the dlopen API for loading optional libs"  ON)
32 OPTION(WERROR  "Treat compile warnings as errors"      OFF)
34 OPTION(EXAMPLES  "Build example programs"              ON)
36 OPTION(XCOMPILEWIN32  "Cross-compile to Win32" OFF)
39 IF(WIN32 OR XCOMPILEWIN32)
40     SET(LIBNAME openal32)
41     ADD_DEFINITIONS("-D_WIN32")
42 ELSE()
43     SET(LIBNAME openal)
44 ENDIF()
46 SET(LIB_MAJOR_VERSION "1")
47 SET(LIB_MINOR_VERSION "6")
48 SET(LIB_BUILD_VERSION "372")
49 SET(LIB_VERSION "${LIB_MAJOR_VERSION}.${LIB_MINOR_VERSION}.${LIB_BUILD_VERSION}")
50 IF(NOT DEFINED LIB_INSTALL_DIR)
51   SET(LIB_INSTALL_DIR "lib")
52 ENDIF(NOT DEFINED LIB_INSTALL_DIR)
55 CHECK_TYPE_SIZE("long" SIZEOF_LONG)
56 CHECK_TYPE_SIZE("long long" SIZEOF_LONG_LONG)
57 CHECK_TYPE_SIZE("unsigned int" SIZEOF_UINT)
58 CHECK_TYPE_SIZE("void*" SIZEOF_VOIDP)
61 # Add definitions, compiler switches, etc.
62 INCLUDE_DIRECTORIES(OpenAL32/Include include "${OpenAL_BINARY_DIR}")
64 IF(NOT CMAKE_BUILD_TYPE)
65     SET(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING
66         "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel."
67         FORCE)
68 ENDIF()
69 IF(NOT CMAKE_DEBUG_POSTFIX)
70     SET(CMAKE_DEBUG_POSTFIX "" CACHE STRING
71         "Library postfix for debug builds. Normally left blank."
72         FORCE)
73 ENDIF()
75 IF(MSVC)
76     # ???
77     SET(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -D_DEBUG")
78     SET(CMAKE_C_FLAGS_MINSIZEREL "${CMAKE_C_FLAGS_MINSIZEREL} -DNDEBUG")
79     SET(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -DNDEBUG")
80     SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -D_DEBUG")
81 ELSE()
82     ADD_DEFINITIONS(-Wall)
83     CHECK_C_COMPILER_FLAG(-Wextra HAVE_W_EXTRA)
84     IF("${HAVE_W_EXTRA}")
85         ADD_DEFINITIONS(-Wextra)
86     ENDIF()
88     IF(WERROR)
89         ADD_DEFINITIONS(-Werror)
90     ENDIF()
92     SET(CMAKE_C_FLAGS_RELWITHDEBINFO "-g -O2 -funroll-loops -D_DEBUG" CACHE STRING
93         "Flags used by the compiler during Release with Debug Info builds."
94         FORCE)
95     SET(CMAKE_C_FLAGS_MINSIZEREL "-Os -DNDEBUG" CACHE STRING
96         "Flags used by the compiler during release minsize builds."
97         FORCE)
98     SET(CMAKE_C_FLAGS_RELEASE "-O2 -funroll-loops -fomit-frame-pointer -DNDEBUG" CACHE STRING
99         "Flags used by the compiler during release builds"
100         FORCE)
101     SET(CMAKE_C_FLAGS_DEBUG "-g3 -D_DEBUG" CACHE STRING
102         "Flags used by the compiler during debug builds."
103         FORCE)
105     # Set visibility options if available
106     IF(NOT WIN32 AND NOT XCOMPILEWIN32)
107         CHECK_C_SOURCE_COMPILES("int foo() __attribute__((destructor));
108                                  int main() {return 0;}" HAVE_GCC_DESTRUCTOR)
110         CHECK_C_COMPILER_FLAG(-fvisibility=hidden HAVE_VISIBILITY_SWITCH)
111         IF("${HAVE_VISIBILITY_SWITCH}")
112             CHECK_C_SOURCE_COMPILES("int foo() __attribute__((visibility(\"default\")));
113                                      int main() {return 0;}" HAVE_GCC_VISIBILITY)
114             IF("${HAVE_GCC_VISIBILITY}")
115                 ADD_DEFINITIONS(-fvisibility=hidden -DHAVE_GCC_VISIBILITY)
116             ENDIF()
117         ENDIF()
118     ENDIF()
119 ENDIF()
121 CHECK_INCLUDE_FILE(fenv.h HAVE_FENV_H)
122 CHECK_INCLUDE_FILE(float.h HAVE_FLOAT_H)
124 CHECK_LIBRARY_EXISTS(m  sqrtf  "" HAVE_SQRTF)
125 CHECK_LIBRARY_EXISTS(m  acosf  "" HAVE_ACOSF)
126 IF(HAVE_FENV_H)
127     CHECK_LIBRARY_EXISTS(m  fesetround  "" HAVE_FESETROUND)
128 ENDIF()
129 IF(HAVE_SQRTF OR HAVE_ACOSF OR HAVE_FESETROUND)
130     SET(EXTRA_LIBS m ${EXTRA_LIBS})
131 ENDIF()
132 CHECK_FUNCTION_EXISTS(strtof HAVE_STRTOF)
133 CHECK_FUNCTION_EXISTS(_controlfp HAVE__CONTROLFP)
135 CHECK_FUNCTION_EXISTS(strcasecmp HAVE_STRCASECMP)
136 IF(NOT HAVE_STRCASECMP)
137     CHECK_FUNCTION_EXISTS(_stricmp HAVE__STRICMP)
138     IF(NOT HAVE__STRICMP)
139         MESSAGE(FATAL_ERROR "No case-insensitive compare function found, please report!")
140     ENDIF()
142     ADD_DEFINITIONS(-Dstrcasecmp=_stricmp)
143 ENDIF()
145 CHECK_FUNCTION_EXISTS(strncasecmp HAVE_STRNCASECMP)
146 IF(NOT HAVE_STRNCASECMP)
147     CHECK_FUNCTION_EXISTS(_strnicmp HAVE__STRNICMP)
148     IF(NOT HAVE__STRNICMP)
149         MESSAGE(FATAL_ERROR "No case-insensitive size-limitted compare function found, please report!")
150     ENDIF()
152     ADD_DEFINITIONS(-Dstrncasecmp=_strnicmp)
153 ENDIF()
155 CHECK_FUNCTION_EXISTS(snprintf HAVE_SNPRINTF)
156 IF(NOT HAVE_SNPRINTF)
157     CHECK_FUNCTION_EXISTS(_snprintf HAVE__SNPRINTF)
158     IF(NOT HAVE__SNPRINTF)
159         MESSAGE(FATAL_ERROR "No snprintf function found, please report!")
160     ENDIF()
162     ADD_DEFINITIONS(-Dsnprintf=_snprintf)
163 ENDIF()
165 # Check for the dlopen API (for dynamicly loading backend libs)
166 IF(DLOPEN)
167     CHECK_INCLUDE_FILE(dlfcn.h HAVE_DLFCN_H)
168     IF(HAVE_DLFCN_H)
169         CHECK_LIBRARY_EXISTS(dl dlopen "" HAVE_LIBDL)
170         IF(HAVE_LIBDL)
171             SET(EXTRA_LIBS dl ${EXTRA_LIBS})
172         ENDIF()
173     ENDIF()
174 ENDIF()
176 # Check if we have Windows headers
177 CHECK_INCLUDE_FILE(windows.h HAVE_WINDOWS_H -D_WIN32_WINNT=0x0500)
178 IF(NOT HAVE_WINDOWS_H)
179     CHECK_FUNCTION_EXISTS(gettimeofday HAVE_GETTIMEOFDAY)
180     IF(NOT HAVE_GETTIMEOFDAY)
181         MESSAGE(FATAL_ERROR "No timing function found!")
182     ENDIF()
184     CHECK_FUNCTION_EXISTS(nanosleep HAVE_NANOSLEEP)
185     IF(NOT HAVE_NANOSLEEP)
186         MESSAGE(FATAL_ERROR "No sleep function found!")
187     ENDIF()
189     # We need pthreads outside of Windows
190     CHECK_INCLUDE_FILE(pthread.h HAVE_PTHREAD_H)
191     IF(NOT HAVE_PTHREAD_H)
192         MESSAGE(FATAL_ERROR "PThreads is required for non-Windows builds!")
193     ENDIF()
195     # Some systems need pthread_np.h to get recursive mutexes
196     CHECK_INCLUDE_FILES("pthread.h;pthread_np.h" HAVE_PTHREAD_NP_H)
198     # _GNU_SOURCE is needed on some systems for extra attributes, and
199     # _REENTRANT is needed for libc thread-safety
200     ADD_DEFINITIONS(-D_GNU_SOURCE=1 -D_REENTRANT)
201     CHECK_LIBRARY_EXISTS(pthread pthread_create "" HAVE_LIBPTHREAD)
202     IF(HAVE_LIBPTHREAD)
203         SET(EXTRA_LIBS pthread ${EXTRA_LIBS})
204     ENDIF()
205 ENDIF()
207 # Check for a 64-bit type
208 CHECK_INCLUDE_FILE(stdint.h HAVE_STDINT_H)
209 IF(NOT HAVE_STDINT_H)
210     IF(HAVE_WINDOWS_H)
211         CHECK_C_SOURCE_COMPILES("\#define _WIN32_WINNT 0x0500
212                                  \#include <windows.h>
213                                  __int64 foo;
214                                  int main() {return 0;}" HAVE___INT64)
215     ENDIF()
216     IF(NOT HAVE___INT64)
217         IF(NOT SIZEOF_LONG MATCHES "8")
218             IF(NOT SIZEOF_LONG_LONG MATCHES "8")
219                 MESSAGE(FATAL_ERROR "No 64-bit types found, please report!")
220             ENDIF()
221         ENDIF()
222     ENDIF()
223 ENDIF()
226 SET(OPENAL_OBJS  OpenAL32/alAuxEffectSlot.c
227                  OpenAL32/alBuffer.c
228                  OpenAL32/alEffect.c
229                  OpenAL32/alError.c
230                  OpenAL32/alExtension.c
231                  OpenAL32/alFilter.c
232                  OpenAL32/alListener.c
233                  OpenAL32/alSource.c
234                  OpenAL32/alState.c
235                  OpenAL32/alThunk.c
237 SET(ALC_OBJS  Alc/ALc.c
238               Alc/ALu.c
239               Alc/alcConfig.c
240               Alc/alcReverb.c
241               Alc/alcRing.c
242               Alc/alcThread.c
243               Alc/bs2b.c
244               Alc/wave.c
247 SET(BACKENDS "")
249 # Check ALSA backend
250 IF(ALSA)
251     CHECK_INCLUDE_FILE(alsa/asoundlib.h HAVE_ALSA_ASOUNDLIB_H)
252     IF(HAVE_ALSA_ASOUNDLIB_H)
253         CHECK_LIBRARY_EXISTS(asound snd_pcm_open "" HAVE_LIBASOUND)
254         IF(HAVE_DLFCN_H OR HAVE_LIBASOUND)
255             SET(HAVE_ALSA 1)
256             SET(ALC_OBJS  ${ALC_OBJS} Alc/alsa.c)
257             IF(HAVE_DLFCN_H)
258                 SET(BACKENDS  "${BACKENDS} ALSA,")
259             ELSE()
260                 SET(BACKENDS  "${BACKENDS} ALSA \(linked\),")
261                 SET(EXTRA_LIBS asound ${EXTRA_LIBS})
262             ENDIF()
263         ENDIF()
264     ENDIF()
265 ENDIF()
267 # Check OSS backend
268 IF(OSS)
269     CHECK_INCLUDE_FILE(sys/soundcard.h HAVE_SYS_SOUNDCARD_H)
270     IF(HAVE_SYS_SOUNDCARD_H)
271         SET(HAVE_OSS 1)
272         SET(ALC_OBJS  ${ALC_OBJS} Alc/oss.c)
273         SET(BACKENDS  "${BACKENDS} OSS,")
274     ENDIF()
275 ENDIF()
277 # Check Solaris backend
278 IF(SOLARIS)
279     CHECK_INCLUDE_FILE(sys/audioio.h HAVE_SYS_AUDIOIO_H)
280     IF(HAVE_SYS_AUDIOIO_H)
281         SET(HAVE_SOLARIS 1)
282         SET(ALC_OBJS  ${ALC_OBJS} Alc/solaris.c)
283         SET(BACKENDS  "${BACKENDS} Solaris,")
284     ENDIF()
285 ENDIF()
287 # Check DSound/MMSystem backend
288 IF(DSOUND)
289     CHECK_INCLUDE_FILE(dsound.h HAVE_DSOUND_H)
290     IF(HAVE_DSOUND_H)
291         SET(HAVE_DSOUND 1)
292         SET(ALC_OBJS  ${ALC_OBJS} Alc/dsound.c)
293         SET(BACKENDS  "${BACKENDS} DirectSound,")
295         SET(CMAKE_REQUIRED_LIBRARIES dsound)
296         CHECK_C_SOURCE_COMPILES("int main() {return 0;}" HAVE_LIBDSOUND)
297         SET(CMAKE_REQUIRED_LIBRARIES "")
298 #        CHECK_LIBRARY_EXISTS(dsound DirectSoundCreate "" HAVE_LIBDSOUND)
299         IF(HAVE_LIBDSOUND)
300             SET(EXTRA_LIBS dsound ${EXTRA_LIBS})
301         ENDIF()
302     ENDIF()
303 ENDIF()
304 IF(HAVE_WINDOWS_H)
305     IF(WINMM)
306         CHECK_INCLUDE_FILES("windows.h;mmsystem.h" HAVE_MMSYSTEM_H -D_WIN32_WINNT=0x0500)
307         IF(HAVE_MMSYSTEM_H)
308             SET(HAVE_WINMM 1)
309             SET(ALC_OBJS  ${ALC_OBJS} Alc/winmm.c)
310             SET(BACKENDS  "${BACKENDS} WinMM,")
312             SET(CMAKE_REQUIRED_LIBRARIES winmm)
313             CHECK_C_SOURCE_COMPILES("int main() {return 0;}" HAVE_LIBWINMM)
314             SET(CMAKE_REQUIRED_LIBRARIES "")
315 #            CHECK_LIBRARY_EXISTS(winmm waveInOpen "" HAVE_LIBWINMM)
316             IF(HAVE_LIBWINMM)
317                 SET(EXTRA_LIBS winmm ${EXTRA_LIBS})
318             ENDIF()
319         ENDIF()
320     ENDIF()
321 ENDIF()
323 # This is always available
324 SET(BACKENDS  "${BACKENDS} WaveFile")
326 # Needed for openal.pc.in
327 SET(prefix ${CMAKE_INSTALL_PREFIX})
328 SET(exec_prefix "\${prefix}")
329 SET(libdir "\${exec_prefix}/${LIB_INSTALL_DIR}")
330 SET(bindir "\${exec_prefix}/bin")
331 SET(includedir "\${prefix}/include")
332 SET(PACKAGE_VERSION "${LIB_VERSION}")
334 # End configuration
335 CONFIGURE_FILE(
336     "${OpenAL_SOURCE_DIR}/config.h.in"
337     "${OpenAL_BINARY_DIR}/config.h")
338 CONFIGURE_FILE(
339     "${OpenAL_SOURCE_DIR}/admin/pkgconfig/openal.pc.in"
340     "${OpenAL_BINARY_DIR}/admin/pkgconfig/openal.pc"
341     @ONLY)
343 ADD_DEFINITIONS(-DAL_BUILD_LIBRARY)
345 # Build a library
346 IF(NOT LIBTYPE)
347     SET(LIBTYPE SHARED)
348 ENDIF()
349 ADD_LIBRARY(${LIBNAME} ${LIBTYPE} ${OPENAL_OBJS} ${ALC_OBJS})
350 SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES VERSION ${LIB_VERSION}
351                                             SOVERSION ${LIB_MAJOR_VERSION})
352 IF(WIN32)
353     SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES PREFIX "")
354 ENDIF()
355 IF(XCOMPILEWIN32)
356     SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES PREFIX "" SUFFIX .dll)
357     IF(EXAMPLES)
358         SET(EXAMPLES OFF)
359         MESSAGE(STATUS "")
360         MESSAGE(STATUS "Building examples disabled when cross-compiling")
361     ENDIF()
362 ENDIF()
363 SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES OUTPUT_NAME ${LIBNAME})
365 TARGET_LINK_LIBRARIES(${LIBNAME} ${EXTRA_LIBS})
367 # Add an install target here
368 INSTALL(TARGETS ${LIBNAME}
369         RUNTIME DESTINATION bin
370         LIBRARY DESTINATION ${LIB_INSTALL_DIR}
371         ARCHIVE DESTINATION ${LIB_INSTALL_DIR}
373 INSTALL(FILES include/AL/al.h
374               include/AL/alc.h
375               include/AL/alext.h
376         DESTINATION include/AL
378 INSTALL(FILES "${OpenAL_BINARY_DIR}/admin/pkgconfig/openal.pc"
379         DESTINATION lib/pkgconfig)
381 IF(EXAMPLES)
382     ADD_EXECUTABLE(openal-info examples/openal-info.c)
383     TARGET_LINK_LIBRARIES(openal-info ${LIBNAME})
384     INSTALL(TARGETS openal-info
385             RUNTIME DESTINATION bin
386             LIBRARY DESTINATION ${LIB_INSTALL_DIR}
387             ARCHIVE DESTINATION ${LIB_INSTALL_DIR}
388     )
389 ENDIF()
391 MESSAGE(STATUS "")
392 MESSAGE(STATUS "Building OpenAL with support for the following backends:")
393 MESSAGE(STATUS "    ${BACKENDS}")
394 MESSAGE(STATUS "")
396 IF(WIN32 OR XCOMPILEWIN32)
397     IF(NOT HAVE_DSOUND)
398         MESSAGE(STATUS "WARNING: Building the Windows version without DirectSound output")
399         MESSAGE(STATUS "         This is probably NOT what you want!")
400         MESSAGE(STATUS "")
401     ENDIF()
402 ENDIF()