Fix target opts to remove prefix on the win32 dll
[openal-soft.git] / CMakeLists.txt
blob5f107e5d4397ed84e24a415c697812cbe831e670
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    "ALSA backend"                ON)
19 OPTION(OSS     "OSS backend"                 ON)
20 OPTION(DSOUND  "DirectSound backend"         ON)
21 OPTION(WINMM   "Windows Multimedia backend"  ON)
23 OPTION(DLOPEN  "Use the dlopen API for loading optional libs"  ON)
25 OPTION(DEBUG    "Build lib in debug mode"                   OFF)
26 OPTION(NODEBUG  "Disable all debug info for optimizations"  OFF)
27 OPTION(WERROR   "Treat compile warnings as errors"          OFF)
30 SET(LIB_MAJOR_VERSION "1")
31 SET(LIB_MINOR_VERSION "0")
32 SET(LIB_BUILD_VERSION "38")
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}")
44 SET(EXTRA_LIBS m ${EXTRA_LIBS})
46 IF("${MSVC}")
47     # ???
48 ELSE()
49     ADD_DEFINITIONS(-Wall)
50     CHECK_C_COMPILER_FLAG(-Wextra HAVE_W_EXTRA)
51     IF("${HAVE_W_EXTRA}")
52         ADD_DEFINITIONS(-Wextra)
53     ENDIF()
55     IF(WERROR)
56         ADD_DEFINITIONS(-Werror)
57     ENDIF()
59     IF(DEBUG)
60         ADD_DEFINITIONS(-g3)
61     ELSEIF(NODEBUG)
62         ADD_DEFINITIONS(-O2 -funroll-loops -fomit-frame-pointer)
63     ELSE()
64         ADD_DEFINITIONS(-g -O2 -funroll-loops)
65     ENDIF()
67     # The mixer doesn't like GCC's strict aliasing optimizations. Make sure
68     # it's turned off
69     CHECK_C_COMPILER_FLAG(-fstrict-aliasing HAVE_STRICT_ALIASING)
70     IF("${HAVE_STRICT_ALIASING}")
71         ADD_DEFINITIONS(-fno-strict-aliasing)
72     ENDIF()
74     # Set visibility options if available
75     IF(NOT "${WIN32}")
76         CHECK_C_SOURCE_COMPILES("int foo() __attribute__((destructor));
77                                  int main() {return 0;}" HAVE_GCC_DESTRUCTOR)
79         CHECK_C_COMPILER_FLAG(-fvisibility=hidden HAVE_VISIBILITY_SWITCH)
80         IF("${HAVE_VISIBILITY_SWITCH}")
81             CHECK_C_SOURCE_COMPILES("int foo() __attribute__((visibility(\"default\")));
82                                      int main() {return 0;}" HAVE_GCC_VISIBILITY)
83             IF("${HAVE_GCC_VISIBILITY}")
84                 ADD_DEFINITIONS(-fvisibility=hidden -DHAVE_GCC_VISIBILITY)
85             ENDIF()
86         ENDIF()
87     ENDIF()
88 ENDIF()
90 IF(DEBUG)
91     ADD_DEFINITIONS(-D_DEBUG)
92 ELSEIF(NODEBUG)
93     ADD_DEFINITIONS(-DNDEBUG)
94 ENDIF()
96 CHECK_LIBRARY_EXISTS(m  sqrtf  "" HAVE_SQRTF)
97 CHECK_FUNCTION_EXISTS(strtof HAVE_STRTOF)
99 CHECK_FUNCTION_EXISTS(strcasecmp HAVE_STRCASECMP)
100 IF(NOT "${HAVE_STRCASECMP}")
101     CHECK_FUNCTION_EXISTS(_stricmp HAVE__STRICMP)
102     IF(NOT "${HAVE__STRICMP}")
103         MESSAGE(FATAL_ERROR "No case-insensitive compare function found, please report!")
104     ENDIF()
106     ADD_DEFINITIONS(-Dstrcasecmp=_stricmp)
107 ENDIF()
109 CHECK_FUNCTION_EXISTS(snprintf HAVE_SNPRINTF)
110 IF(NOT "${HAVE_SNPRINTF}")
111     CHECK_FUNCTION_EXISTS(_snprintf HAVE__SNPRINTF)
112     IF(NOT "${HAVE__SNPRINTF}")
113         MESSAGE(FATAL_ERROR "No snprintf function found, please report!")
114     ENDIF()
116     ADD_DEFINITIONS(-Dsnprintf=_snprintf)
117 ENDIF()
119 # Check for the dlopen API (for dynamicly loading backend libs)
120 IF(DLOPEN)
121     CHECK_INCLUDE_FILE(dlfcn.h HAVE_DLFCN_H)
122     IF("${HAVE_DLFCN_H}")
123         CHECK_LIBRARY_EXISTS(dl dlopen "" HAVE_LIBDL)
124         IF("${HAVE_LIBDL}")
125             SET(EXTRA_LIBS dl ${EXTRA_LIBS})
126         ENDIF()
127     ENDIF()
128 ENDIF()
130 # Check if we have Windows headers
131 CHECK_INCLUDE_FILE(windows.h HAVE_WINDOWS_H)
132 IF(NOT "${HAVE_WINDOWS_H}")
133     # We need pthreads outside of Windows
134     CHECK_INCLUDE_FILE(pthread.h HAVE_PTHREAD_H)
135     IF(NOT "${HAVE_PTHREAD_H}")
136         MESSAGE(FATAL_ERROR "PThreads is required for non-Windows builds!")
137     ENDIF()
139     # _GNU_SOURCE is needed on some systems for extra attributes, and
140     # _REENTRANT is needed for libc thread-safety
141     ADD_DEFINITIONS(-D_GNU_SOURCE=1 -D_REENTRANT)
142     CHECK_LIBRARY_EXISTS(pthread pthread_create "" HAVE_LIBPTHREAD)
143     IF("${HAVE_LIBPTHREAD}")
144         SET(EXTRA_LIBS pthread ${EXTRA_LIBS})
145     ENDIF()
146 ENDIF()
148 # Check for a 64-bit type
149 CHECK_INCLUDE_FILE(stdint.h HAVE_STDINT_H)
150 IF(NOT "${HAVE_STDINT_H}")
151     IF("${HAVE_WINDOWS_H}")
152         CHECK_C_SOURCE_COMPILES("\#include <windows.h>
153                                  __int64 foo;
154                                  int main() {return 0;}" HAVE___INT64)
155     ENDIF()
156     IF(NOT "${HAVE___INT64}")
157         IF(NOT "${SIZEOF_LONG}" MATCHES "8")
158             IF(NOT "${SIZEOF_LONG_LONG}" MATCHES "8")
159                 MESSAGE(FATAL_ERROR "No 64-bit types found, please report!")
160             ENDIF()
161         ENDIF()
162     ENDIF()
163 ENDIF()
166 SET(OPENAL_OBJS  OpenAL32/alBuffer.c
167                  OpenAL32/alError.c
168                  OpenAL32/alExtension.c
169                  OpenAL32/alListener.c
170                  OpenAL32/alSource.c
171                  OpenAL32/alState.c
172                  OpenAL32/alThunk.c
173                  OpenAL32/OpenAL32.c
175 SET(ALC_OBJS  Alc/ALc.c
176               Alc/ALu.c
177               Alc/alcConfig.c
178               Alc/alcRing.c
179               Alc/alcThread.c
182 SET(BACKENDS "")
184 # Check ALSA backend
185 IF(ALSA)
186     CHECK_INCLUDE_FILE(alsa/asoundlib.h HAVE_ALSA_ASOUNDLIB_H)
187     IF("${HAVE_ALSA_ASOUNDLIB_H}")
188         CHECK_LIBRARY_EXISTS(asound snd_pcm_open "" HAVE_LIBASOUND)
189         IF("${HAVE_DLFCN_H}" OR "${HAVE_LIBASOUND}")
190             SET(HAVE_ALSA 1)
191             SET(ALC_OBJS  ${ALC_OBJS} Alc/alsa.c)
192             IF("${HAVE_DLFCN_H}")
193                 SET(BACKENDS  ${BACKENDS} ALSA)
194             ELSE()
195                 SET(BACKENDS  ${BACKENDS} ALSA\(linked\))
196                 SET(EXTRA_LIBS asound ${EXTRA_LIBS})
197             ENDIF()
198         ENDIF()
199     ENDIF()
200 ENDIF()
202 # Check OSS backend
203 IF(OSS)
204     CHECK_INCLUDE_FILE(sys/soundcard.h HAVE_SYS_SOUNDCARD_H)
205     IF("${HAVE_SYS_SOUNDCARD_H}")
206         SET(HAVE_OSS 1)
207         SET(ALC_OBJS  ${ALC_OBJS} Alc/oss.c)
208         SET(BACKENDS  ${BACKENDS} OSS)
209     ENDIF()
210 ENDIF()
212 # Check DSound/MMSystem backend
213 IF("${HAVE_WINDOWS_H}")
214     SET(CMAKE_REQUIRED_LIBRARIES ole32)
215     CHECK_C_SOURCE_COMPILES("int main() {return 0;}" HAVE_LIBOLE32)
216     SET(CMAKE_REQUIRED_LIBRARIES "")
217 #    CHECK_LIBRARY_EXISTS(ole32 CoInitialize "" HAVE_LIBOLE32)
218     IF("${HAVE_LIBOLE32}")
219         SET(EXTRA_LIBS ole32 ${EXTRA_LIBS})
220     ENDIF()
222     IF(DSOUND)
223         CHECK_INCLUDE_FILE(dsound.h HAVE_DSOUND_H)
224         IF("${HAVE_DSOUND_H}")
225             SET(HAVE_DSOUND 1)
226             SET(ALC_OBJS  ${ALC_OBJS} Alc/dsound.c)
227             SET(BACKENDS  ${BACKENDS} DirectSound)
229             CHECK_LIBRARY_EXISTS(dxguid IID_IDirectSound "" HAVE_LIBDXGUID)
230             IF("${HAVE_LIBDXGUID}")
231                 SET(EXTRA_LIBS dxguid ${EXTRA_LIBS})
232             ENDIF()
233         ENDIF()
234     ENDIF()
235     IF(WINMM)
236         CHECK_INCLUDE_FILES("windows.h;mmsystem.h" HAVE_MMSYSTEM_H)
237         IF("${HAVE_MMSYSTEM_H}")
238             SET(HAVE_WINMM 1)
239             SET(ALC_OBJS  ${ALC_OBJS} Alc/winmm.c)
240             SET(BACKENDS  ${BACKENDS} WinMM)
242             SET(CMAKE_REQUIRED_LIBRARIES winmm)
243             CHECK_C_SOURCE_COMPILES("int main() {return 0;}" HAVE_LIBWINMM)
244             SET(CMAKE_REQUIRED_LIBRARIES "")
245 #            CHECK_LIBRARY_EXISTS(winmm waveInOpen "" HAVE_LIBWINMM)
246             IF("${HAVE_LIBWINMM}")
247                 SET(EXTRA_LIBS winmm ${EXTRA_LIBS})
248             ENDIF()
249         ENDIF()
250     ENDIF()
251 ENDIF()
253 # End configuration
254 CONFIGURE_FILE(
255     "${OpenAL_SOURCE_DIR}/config.h.in"
256     "${OpenAL_BINARY_DIR}/config.h")
258 ADD_DEFINITIONS(-DAL_BUILD_LIBRARY)
260 # Build a shared library
261 IF("${WIN32}")
262     SET(LIBNAME openal32)
263 ELSE()
264     SET(LIBNAME openal)
265 ENDIF()
267 ADD_LIBRARY(${LIBNAME} SHARED ${OPENAL_OBJS} ${ALC_OBJS})
268 SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES VERSION ${LIB_VERSION}
269                                             SOVERSION ${LIB_MAJOR_VERSION})
270 IF("${WIN32}")
271     SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES PREFIX "")
272 ENDIF()
274 TARGET_LINK_LIBRARIES(${LIBNAME} ${EXTRA_LIBS})
276 # Add an install target here
277 INSTALL(TARGETS ${LIBNAME}
278         RUNTIME DESTINATION bin
279         LIBRARY DESTINATION lib
280         ARCHIVE DESTINATION lib
282 INSTALL(FILES include/AL/al.h
283               include/AL/alc.h
284         DESTINATION include/AL
287 MESSAGE(STATUS "")
288 MESSAGE(STATUS "Building OpenAL with support for the following backends:")
289 MESSAGE(STATUS "    ${BACKENDS}")
290 MESSAGE(STATUS "")