Non-cross-compiled DLLs shouldn't have lib prefixed
[openal-soft.git] / CMakeLists.txt
blob44970e7af4a88f68dbe925f7fdfae5aa73fddb6c
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 "5")
48 SET(LIB_BUILD_VERSION "304")
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()
70 IF(MSVC)
71     # ???
72     SET(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -D_DEBUG")
73     SET(CMAKE_C_FLAGS_MINSIZEREL "${CMAKE_C_FLAGS_MINSIZEREL} -DNDEBUG")
74     SET(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -DNDEBUG")
75     SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -D_DEBUG")
76 ELSE()
77     ADD_DEFINITIONS(-Wall)
78     CHECK_C_COMPILER_FLAG(-Wextra HAVE_W_EXTRA)
79     IF("${HAVE_W_EXTRA}")
80         ADD_DEFINITIONS(-Wextra)
81     ENDIF()
83     IF(WERROR)
84         ADD_DEFINITIONS(-Werror)
85     ENDIF()
87     SET(CMAKE_C_FLAGS_RELWITHDEBINFO "-g -O2 -funroll-loops -D_DEBUG" CACHE STRING
88         "Flags used by the compiler during Release with Debug Info builds."
89         FORCE)
90     SET(CMAKE_C_FLAGS_MINSIZEREL "-Os -DNDEBUG" CACHE STRING
91         "Flags used by the compiler during release minsize builds."
92         FORCE)
93     SET(CMAKE_C_FLAGS_RELEASE "-O2 -funroll-loops -fomit-frame-pointer -DNDEBUG" CACHE STRING
94         "Flags used by the compiler during release builds"
95         FORCE)
96     SET(CMAKE_C_FLAGS_DEBUG "-g3 -D_DEBUG" CACHE STRING
97         "Flags used by the compiler during debug builds."
98         FORCE)
100     # Set visibility options if available
101     IF(NOT WIN32 AND NOT XCOMPILEWIN32)
102         CHECK_C_SOURCE_COMPILES("int foo() __attribute__((destructor));
103                                  int main() {return 0;}" HAVE_GCC_DESTRUCTOR)
105         CHECK_C_COMPILER_FLAG(-fvisibility=hidden HAVE_VISIBILITY_SWITCH)
106         IF("${HAVE_VISIBILITY_SWITCH}")
107             CHECK_C_SOURCE_COMPILES("int foo() __attribute__((visibility(\"default\")));
108                                      int main() {return 0;}" HAVE_GCC_VISIBILITY)
109             IF("${HAVE_GCC_VISIBILITY}")
110                 ADD_DEFINITIONS(-fvisibility=hidden -DHAVE_GCC_VISIBILITY)
111             ENDIF()
112         ENDIF()
113     ENDIF()
114 ENDIF()
116 CHECK_INCLUDE_FILE(fenv.h HAVE_FENV_H)
117 CHECK_INCLUDE_FILE(float.h HAVE_FLOAT_H)
119 CHECK_LIBRARY_EXISTS(m  sqrtf  "" HAVE_SQRTF)
120 CHECK_LIBRARY_EXISTS(m  acosf  "" HAVE_ACOSF)
121 IF(HAVE_FENV_H)
122     CHECK_LIBRARY_EXISTS(m  fesetround  "" HAVE_FESETROUND)
123 ENDIF()
124 IF(HAVE_SQRTF OR HAVE_ACOSF OR HAVE_FESETROUND)
125     SET(EXTRA_LIBS m ${EXTRA_LIBS})
126 ENDIF()
127 CHECK_FUNCTION_EXISTS(strtof HAVE_STRTOF)
128 CHECK_FUNCTION_EXISTS(_controlfp HAVE__CONTROLFP)
130 CHECK_FUNCTION_EXISTS(strcasecmp HAVE_STRCASECMP)
131 IF(NOT HAVE_STRCASECMP)
132     CHECK_FUNCTION_EXISTS(_stricmp HAVE__STRICMP)
133     IF(NOT HAVE__STRICMP)
134         MESSAGE(FATAL_ERROR "No case-insensitive compare function found, please report!")
135     ENDIF()
137     ADD_DEFINITIONS(-Dstrcasecmp=_stricmp)
138 ENDIF()
140 CHECK_FUNCTION_EXISTS(strncasecmp HAVE_STRNCASECMP)
141 IF(NOT HAVE_STRNCASECMP)
142     CHECK_FUNCTION_EXISTS(_strnicmp HAVE__STRNICMP)
143     IF(NOT HAVE__STRNICMP)
144         MESSAGE(FATAL_ERROR "No case-insensitive size-limitted compare function found, please report!")
145     ENDIF()
147     ADD_DEFINITIONS(-Dstrncasecmp=_strnicmp)
148 ENDIF()
150 CHECK_FUNCTION_EXISTS(snprintf HAVE_SNPRINTF)
151 IF(NOT HAVE_SNPRINTF)
152     CHECK_FUNCTION_EXISTS(_snprintf HAVE__SNPRINTF)
153     IF(NOT HAVE__SNPRINTF)
154         MESSAGE(FATAL_ERROR "No snprintf function found, please report!")
155     ENDIF()
157     ADD_DEFINITIONS(-Dsnprintf=_snprintf)
158 ENDIF()
160 # Check for the dlopen API (for dynamicly loading backend libs)
161 IF(DLOPEN)
162     CHECK_INCLUDE_FILE(dlfcn.h HAVE_DLFCN_H)
163     IF(HAVE_DLFCN_H)
164         CHECK_LIBRARY_EXISTS(dl dlopen "" HAVE_LIBDL)
165         IF(HAVE_LIBDL)
166             SET(EXTRA_LIBS dl ${EXTRA_LIBS})
167         ENDIF()
168     ENDIF()
169 ENDIF()
171 # Check if we have Windows headers
172 CHECK_INCLUDE_FILE(windows.h HAVE_WINDOWS_H -D_WIN32_WINNT=0x0500)
173 IF(NOT HAVE_WINDOWS_H)
174     CHECK_FUNCTION_EXISTS(gettimeofday HAVE_GETTIMEOFDAY)
175     IF(NOT HAVE_GETTIMEOFDAY)
176         MESSAGE(FATAL_ERROR "No timing function found!")
177     ENDIF()
179     CHECK_FUNCTION_EXISTS(nanosleep HAVE_NANOSLEEP)
180     IF(NOT HAVE_NANOSLEEP)
181         MESSAGE(FATAL_ERROR "No sleep function found!")
182     ENDIF()
184     # We need pthreads outside of Windows
185     CHECK_INCLUDE_FILE(pthread.h HAVE_PTHREAD_H)
186     IF(NOT HAVE_PTHREAD_H)
187         MESSAGE(FATAL_ERROR "PThreads is required for non-Windows builds!")
188     ENDIF()
190     # Some systems need pthread_np.h to get recursive mutexes
191     CHECK_INCLUDE_FILES("pthread.h;pthread_np.h" HAVE_PTHREAD_NP_H)
193     # _GNU_SOURCE is needed on some systems for extra attributes, and
194     # _REENTRANT is needed for libc thread-safety
195     ADD_DEFINITIONS(-D_GNU_SOURCE=1 -D_REENTRANT)
196     CHECK_LIBRARY_EXISTS(pthread pthread_create "" HAVE_LIBPTHREAD)
197     IF(HAVE_LIBPTHREAD)
198         SET(EXTRA_LIBS pthread ${EXTRA_LIBS})
199     ENDIF()
200 ENDIF()
202 # Check for a 64-bit type
203 CHECK_INCLUDE_FILE(stdint.h HAVE_STDINT_H)
204 IF(NOT HAVE_STDINT_H)
205     IF(HAVE_WINDOWS_H)
206         CHECK_C_SOURCE_COMPILES("\#define _WIN32_WINNT 0x0500
207                                  \#include <windows.h>
208                                  __int64 foo;
209                                  int main() {return 0;}" HAVE___INT64)
210     ENDIF()
211     IF(NOT HAVE___INT64)
212         IF(NOT SIZEOF_LONG MATCHES "8")
213             IF(NOT SIZEOF_LONG_LONG MATCHES "8")
214                 MESSAGE(FATAL_ERROR "No 64-bit types found, please report!")
215             ENDIF()
216         ENDIF()
217     ENDIF()
218 ENDIF()
221 SET(OPENAL_OBJS  OpenAL32/alAuxEffectSlot.c
222                  OpenAL32/alBuffer.c
223                  OpenAL32/alEffect.c
224                  OpenAL32/alError.c
225                  OpenAL32/alExtension.c
226                  OpenAL32/alFilter.c
227                  OpenAL32/alListener.c
228                  OpenAL32/alSource.c
229                  OpenAL32/alState.c
230                  OpenAL32/alThunk.c
232 SET(ALC_OBJS  Alc/ALc.c
233               Alc/ALu.c
234               Alc/alcConfig.c
235               Alc/alcReverb.c
236               Alc/alcRing.c
237               Alc/alcThread.c
238               Alc/bs2b.c
239               Alc/wave.c
242 SET(BACKENDS "")
244 # Check ALSA backend
245 IF(ALSA)
246     CHECK_INCLUDE_FILE(alsa/asoundlib.h HAVE_ALSA_ASOUNDLIB_H)
247     IF(HAVE_ALSA_ASOUNDLIB_H)
248         CHECK_LIBRARY_EXISTS(asound snd_pcm_open "" HAVE_LIBASOUND)
249         IF(HAVE_DLFCN_H OR HAVE_LIBASOUND)
250             SET(HAVE_ALSA 1)
251             SET(ALC_OBJS  ${ALC_OBJS} Alc/alsa.c)
252             IF(HAVE_DLFCN_H)
253                 SET(BACKENDS  "${BACKENDS} ALSA,")
254             ELSE()
255                 SET(BACKENDS  "${BACKENDS} ALSA \(linked\),")
256                 SET(EXTRA_LIBS asound ${EXTRA_LIBS})
257             ENDIF()
258         ENDIF()
259     ENDIF()
260 ENDIF()
262 # Check OSS backend
263 IF(OSS)
264     CHECK_INCLUDE_FILE(sys/soundcard.h HAVE_SYS_SOUNDCARD_H)
265     IF(HAVE_SYS_SOUNDCARD_H)
266         SET(HAVE_OSS 1)
267         SET(ALC_OBJS  ${ALC_OBJS} Alc/oss.c)
268         SET(BACKENDS  "${BACKENDS} OSS,")
269     ENDIF()
270 ENDIF()
272 # Check Solaris backend
273 IF(SOLARIS)
274     CHECK_INCLUDE_FILE(sys/audioio.h HAVE_SYS_AUDIOIO_H)
275     IF(HAVE_SYS_AUDIOIO_H)
276         SET(HAVE_SOLARIS 1)
277         SET(ALC_OBJS  ${ALC_OBJS} Alc/solaris.c)
278         SET(BACKENDS  "${BACKENDS} Solaris,")
279     ENDIF()
280 ENDIF()
282 # Check DSound/MMSystem backend
283 IF(DSOUND)
284     CHECK_INCLUDE_FILE(dsound.h HAVE_DSOUND_H)
285     IF(HAVE_DSOUND_H)
286         SET(HAVE_DSOUND 1)
287         SET(ALC_OBJS  ${ALC_OBJS} Alc/dsound.c)
288         SET(BACKENDS  "${BACKENDS} DirectSound,")
290         SET(CMAKE_REQUIRED_LIBRARIES dsound)
291         CHECK_C_SOURCE_COMPILES("int main() {return 0;}" HAVE_LIBDSOUND)
292         SET(CMAKE_REQUIRED_LIBRARIES "")
293 #        CHECK_LIBRARY_EXISTS(dsound DirectSoundCreate "" HAVE_LIBDSOUND)
294         IF(HAVE_LIBDSOUND)
295             SET(EXTRA_LIBS dsound ${EXTRA_LIBS})
296         ENDIF()
297     ENDIF()
298 ENDIF()
299 IF(HAVE_WINDOWS_H)
300     IF(WINMM)
301         CHECK_INCLUDE_FILES("windows.h;mmsystem.h" HAVE_MMSYSTEM_H -D_WIN32_WINNT=0x0500)
302         IF(HAVE_MMSYSTEM_H)
303             SET(HAVE_WINMM 1)
304             SET(ALC_OBJS  ${ALC_OBJS} Alc/winmm.c)
305             SET(BACKENDS  "${BACKENDS} WinMM,")
307             SET(CMAKE_REQUIRED_LIBRARIES winmm)
308             CHECK_C_SOURCE_COMPILES("int main() {return 0;}" HAVE_LIBWINMM)
309             SET(CMAKE_REQUIRED_LIBRARIES "")
310 #            CHECK_LIBRARY_EXISTS(winmm waveInOpen "" HAVE_LIBWINMM)
311             IF(HAVE_LIBWINMM)
312                 SET(EXTRA_LIBS winmm ${EXTRA_LIBS})
313             ENDIF()
314         ENDIF()
315     ENDIF()
316 ENDIF()
318 # This is always available
319 SET(BACKENDS  "${BACKENDS} WaveFile")
321 # Needed for openal.pc.in
322 SET(prefix ${CMAKE_INSTALL_PREFIX})
323 SET(exec_prefix "\${prefix}")
324 SET(libdir "\${exec_prefix}/${LIB_INSTALL_DIR}")
325 SET(bindir "\${exec_prefix}/bin")
326 SET(includedir "\${prefix}/include")
327 SET(PACKAGE_VERSION "${LIB_VERSION}")
329 # End configuration
330 CONFIGURE_FILE(
331     "${OpenAL_SOURCE_DIR}/config.h.in"
332     "${OpenAL_BINARY_DIR}/config.h")
333 CONFIGURE_FILE(
334     "${OpenAL_SOURCE_DIR}/admin/pkgconfig/openal.pc.in"
335     "${OpenAL_BINARY_DIR}/admin/pkgconfig/openal.pc"
336     @ONLY)
338 ADD_DEFINITIONS(-DAL_BUILD_LIBRARY)
340 # Build a library
341 IF(NOT LIBTYPE)
342     SET(LIBTYPE SHARED)
343 ENDIF()
344 ADD_LIBRARY(${LIBNAME} ${LIBTYPE} ${OPENAL_OBJS} ${ALC_OBJS})
345 SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES VERSION ${LIB_VERSION}
346                                             SOVERSION ${LIB_MAJOR_VERSION})
347 IF(WIN32)
348     SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES PREFIX "")
349 ENDIF()
350 IF(XCOMPILEWIN32)
351     SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES PREFIX "" SUFFIX .dll)
352     IF(EXAMPLES)
353         SET(EXAMPLES OFF)
354         MESSAGE(STATUS "")
355         MESSAGE(STATUS "Building examples disabled when cross-compiling")
356     ENDIF()
357 ENDIF()
358 SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES OUTPUT_NAME ${LIBNAME})
360 TARGET_LINK_LIBRARIES(${LIBNAME} ${EXTRA_LIBS})
362 # Add an install target here
363 INSTALL(TARGETS ${LIBNAME}
364         RUNTIME DESTINATION bin
365         LIBRARY DESTINATION ${LIB_INSTALL_DIR}
366         ARCHIVE DESTINATION ${LIB_INSTALL_DIR}
368 INSTALL(FILES include/AL/al.h
369               include/AL/alc.h
370               include/AL/alext.h
371         DESTINATION include/AL
373 INSTALL(FILES "${OpenAL_BINARY_DIR}/admin/pkgconfig/openal.pc"
374         DESTINATION lib/pkgconfig)
376 IF(EXAMPLES)
377     ADD_EXECUTABLE(openal-info examples/openal-info.c)
378     TARGET_LINK_LIBRARIES(openal-info ${LIBNAME})
379     INSTALL(TARGETS openal-info
380             RUNTIME DESTINATION bin
381             LIBRARY DESTINATION ${LIB_INSTALL_DIR}
382             ARCHIVE DESTINATION ${LIB_INSTALL_DIR}
383     )
384 ENDIF()
386 MESSAGE(STATUS "")
387 MESSAGE(STATUS "Building OpenAL with support for the following backends:")
388 MESSAGE(STATUS "    ${BACKENDS}")
389 MESSAGE(STATUS "")
391 IF(WIN32 OR XCOMPILEWIN32)
392     IF(NOT HAVE_DSOUND)
393         MESSAGE(STATUS "WARNING: Building the Windows version without DirectSound output")
394         MESSAGE(STATUS "         This is probably NOT what you want!")
395         MESSAGE(STATUS "")
396     ENDIF()
397 ENDIF()