Remove XCOMPILEWIN32 option in favor of CMake 2.6's cross-compiling caps
[openal-soft.git] / CMakeLists.txt
blob7dbe2f936796ebf04a3a61dcc018381786493ff7
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)
29 OPTION(SDL     "Check for SDL backend"                 ON)
31 OPTION(DLOPEN  "Check for the dlopen API for loading optional libs"  ON)
33 OPTION(WERROR  "Treat compile warnings as errors"      OFF)
35 OPTION(EXAMPLES  "Build example programs"              ON)
38 IF(WIN32)
39     SET(LIBNAME openal32)
40     ADD_DEFINITIONS("-D_WIN32")
41 ELSE()
42     SET(LIBNAME openal)
43 ENDIF()
45 SET(LIB_MAJOR_VERSION "1")
46 SET(LIB_MINOR_VERSION "6")
47 SET(LIB_BUILD_VERSION "372")
48 SET(LIB_VERSION "${LIB_MAJOR_VERSION}.${LIB_MINOR_VERSION}.${LIB_BUILD_VERSION}")
49 IF(NOT DEFINED LIB_INSTALL_DIR)
50   SET(LIB_INSTALL_DIR "lib")
51 ENDIF(NOT DEFINED LIB_INSTALL_DIR)
54 CHECK_TYPE_SIZE("long" SIZEOF_LONG)
55 CHECK_TYPE_SIZE("long long" SIZEOF_LONG_LONG)
56 CHECK_TYPE_SIZE("unsigned int" SIZEOF_UINT)
57 CHECK_TYPE_SIZE("void*" SIZEOF_VOIDP)
60 # Add definitions, compiler switches, etc.
61 INCLUDE_DIRECTORIES(OpenAL32/Include include "${OpenAL_BINARY_DIR}")
63 IF(NOT CMAKE_BUILD_TYPE)
64     SET(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING
65         "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel."
66         FORCE)
67 ENDIF()
68 IF(NOT CMAKE_DEBUG_POSTFIX)
69     SET(CMAKE_DEBUG_POSTFIX "" CACHE STRING
70         "Library postfix for debug builds. Normally left blank."
71         FORCE)
72 ENDIF()
74 IF(MSVC)
75     # ???
76     SET(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -D_DEBUG")
77     SET(CMAKE_C_FLAGS_MINSIZEREL "${CMAKE_C_FLAGS_MINSIZEREL} -DNDEBUG")
78     SET(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -DNDEBUG")
79     SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -D_DEBUG")
80 ELSE()
81     ADD_DEFINITIONS(-Wall)
82     CHECK_C_COMPILER_FLAG(-Wextra HAVE_W_EXTRA)
83     IF(HAVE_W_EXTRA)
84         ADD_DEFINITIONS(-Wextra)
85     ENDIF()
87     IF(WERROR)
88         ADD_DEFINITIONS(-Werror)
89     ENDIF()
91     SET(CMAKE_C_FLAGS_RELWITHDEBINFO "-g -O2 -funroll-loops -D_DEBUG" CACHE STRING
92         "Flags used by the compiler during Release with Debug Info builds."
93         FORCE)
94     SET(CMAKE_C_FLAGS_MINSIZEREL "-Os -DNDEBUG" CACHE STRING
95         "Flags used by the compiler during release minsize builds."
96         FORCE)
97     SET(CMAKE_C_FLAGS_RELEASE "-O2 -funroll-loops -fomit-frame-pointer -DNDEBUG" CACHE STRING
98         "Flags used by the compiler during release builds"
99         FORCE)
100     SET(CMAKE_C_FLAGS_DEBUG "-g3 -D_DEBUG" CACHE STRING
101         "Flags used by the compiler during debug builds."
102         FORCE)
104     # Set visibility options if available
105     IF(NOT WIN32)
106         CHECK_C_SOURCE_COMPILES("int foo() __attribute__((destructor));
107                                  int main() {return 0;}" HAVE_GCC_DESTRUCTOR)
109         CHECK_C_COMPILER_FLAG(-fvisibility=hidden HAVE_VISIBILITY_SWITCH)
110         IF(HAVE_VISIBILITY_SWITCH)
111             CHECK_C_SOURCE_COMPILES("int foo() __attribute__((visibility(\"default\")));
112                                      int main() {return 0;}" HAVE_GCC_VISIBILITY)
113             IF(HAVE_GCC_VISIBILITY)
114                 ADD_DEFINITIONS(-fvisibility=hidden -DHAVE_GCC_VISIBILITY)
115             ENDIF()
116         ENDIF()
117     ENDIF()
118 ENDIF()
120 CHECK_INCLUDE_FILE(fenv.h HAVE_FENV_H)
121 CHECK_INCLUDE_FILE(float.h HAVE_FLOAT_H)
123 CHECK_LIBRARY_EXISTS(m  sqrtf  "" HAVE_SQRTF)
124 CHECK_LIBRARY_EXISTS(m  acosf  "" HAVE_ACOSF)
125 IF(HAVE_FENV_H)
126     CHECK_LIBRARY_EXISTS(m  fesetround  "" HAVE_FESETROUND)
127 ENDIF()
128 IF(HAVE_SQRTF OR HAVE_ACOSF OR HAVE_FESETROUND)
129     SET(EXTRA_LIBS m ${EXTRA_LIBS})
130 ENDIF()
131 CHECK_FUNCTION_EXISTS(strtof HAVE_STRTOF)
132 CHECK_FUNCTION_EXISTS(_controlfp HAVE__CONTROLFP)
134 CHECK_FUNCTION_EXISTS(strcasecmp HAVE_STRCASECMP)
135 IF(NOT HAVE_STRCASECMP)
136     CHECK_FUNCTION_EXISTS(_stricmp HAVE__STRICMP)
137     IF(NOT HAVE__STRICMP)
138         MESSAGE(FATAL_ERROR "No case-insensitive compare function found, please report!")
139     ENDIF()
141     ADD_DEFINITIONS(-Dstrcasecmp=_stricmp)
142 ENDIF()
144 CHECK_FUNCTION_EXISTS(strncasecmp HAVE_STRNCASECMP)
145 IF(NOT HAVE_STRNCASECMP)
146     CHECK_FUNCTION_EXISTS(_strnicmp HAVE__STRNICMP)
147     IF(NOT HAVE__STRNICMP)
148         MESSAGE(FATAL_ERROR "No case-insensitive size-limitted compare function found, please report!")
149     ENDIF()
151     ADD_DEFINITIONS(-Dstrncasecmp=_strnicmp)
152 ENDIF()
154 CHECK_FUNCTION_EXISTS(snprintf HAVE_SNPRINTF)
155 IF(NOT HAVE_SNPRINTF)
156     CHECK_FUNCTION_EXISTS(_snprintf HAVE__SNPRINTF)
157     IF(NOT HAVE__SNPRINTF)
158         MESSAGE(FATAL_ERROR "No snprintf function found, please report!")
159     ENDIF()
161     ADD_DEFINITIONS(-Dsnprintf=_snprintf)
162 ENDIF()
164 # Check for the dlopen API (for dynamicly loading backend libs)
165 IF(DLOPEN)
166     CHECK_INCLUDE_FILE(dlfcn.h HAVE_DLFCN_H)
167     IF(HAVE_DLFCN_H)
168         CHECK_LIBRARY_EXISTS(dl dlopen "" HAVE_LIBDL)
169         IF(HAVE_LIBDL)
170             SET(EXTRA_LIBS dl ${EXTRA_LIBS})
171         ENDIF()
172     ENDIF()
173 ENDIF()
175 # Check if we have Windows headers
176 CHECK_INCLUDE_FILE(windows.h HAVE_WINDOWS_H -D_WIN32_WINNT=0x0500)
177 IF(NOT HAVE_WINDOWS_H)
178     CHECK_FUNCTION_EXISTS(gettimeofday HAVE_GETTIMEOFDAY)
179     IF(NOT HAVE_GETTIMEOFDAY)
180         MESSAGE(FATAL_ERROR "No timing function found!")
181     ENDIF()
183     CHECK_FUNCTION_EXISTS(nanosleep HAVE_NANOSLEEP)
184     IF(NOT HAVE_NANOSLEEP)
185         MESSAGE(FATAL_ERROR "No sleep function found!")
186     ENDIF()
188     # We need pthreads outside of Windows
189     CHECK_INCLUDE_FILE(pthread.h HAVE_PTHREAD_H)
190     IF(NOT HAVE_PTHREAD_H)
191         MESSAGE(FATAL_ERROR "PThreads is required for non-Windows builds!")
192     ENDIF()
194     # Some systems need pthread_np.h to get recursive mutexes
195     CHECK_INCLUDE_FILES("pthread.h;pthread_np.h" HAVE_PTHREAD_NP_H)
197     # _GNU_SOURCE is needed on some systems for extra attributes, and
198     # _REENTRANT is needed for libc thread-safety
199     ADD_DEFINITIONS(-D_GNU_SOURCE=1 -D_REENTRANT)
200     CHECK_LIBRARY_EXISTS(pthread pthread_create "" HAVE_LIBPTHREAD)
201     IF(HAVE_LIBPTHREAD)
202         SET(EXTRA_LIBS pthread ${EXTRA_LIBS})
203     ENDIF()
204 ENDIF()
206 # Check for a 64-bit type
207 CHECK_INCLUDE_FILE(stdint.h HAVE_STDINT_H)
208 IF(NOT HAVE_STDINT_H)
209     IF(HAVE_WINDOWS_H)
210         CHECK_C_SOURCE_COMPILES("\#define _WIN32_WINNT 0x0500
211                                  \#include <windows.h>
212                                  __int64 foo;
213                                  int main() {return 0;}" HAVE___INT64)
214     ENDIF()
215     IF(NOT HAVE___INT64)
216         IF(NOT SIZEOF_LONG MATCHES "8")
217             IF(NOT SIZEOF_LONG_LONG MATCHES "8")
218                 MESSAGE(FATAL_ERROR "No 64-bit types found, please report!")
219             ENDIF()
220         ENDIF()
221     ENDIF()
222 ENDIF()
225 SET(OPENAL_OBJS  OpenAL32/alAuxEffectSlot.c
226                  OpenAL32/alBuffer.c
227                  OpenAL32/alEffect.c
228                  OpenAL32/alError.c
229                  OpenAL32/alExtension.c
230                  OpenAL32/alFilter.c
231                  OpenAL32/alListener.c
232                  OpenAL32/alSource.c
233                  OpenAL32/alState.c
234                  OpenAL32/alThunk.c
236 SET(ALC_OBJS  Alc/ALc.c
237               Alc/ALu.c
238               Alc/alcConfig.c
239               Alc/alcReverb.c
240               Alc/alcRing.c
241               Alc/alcThread.c
242               Alc/bs2b.c
243               Alc/wave.c
246 SET(BACKENDS "")
248 # Check ALSA backend
249 IF(ALSA)
250     CHECK_INCLUDE_FILE(alsa/asoundlib.h HAVE_ALSA_ASOUNDLIB_H)
251     IF(HAVE_ALSA_ASOUNDLIB_H)
252         CHECK_LIBRARY_EXISTS(asound snd_pcm_open "" HAVE_LIBASOUND)
253         IF(HAVE_DLFCN_H OR HAVE_LIBASOUND)
254             SET(HAVE_ALSA 1)
255             SET(ALC_OBJS  ${ALC_OBJS} Alc/alsa.c)
256             IF(HAVE_DLFCN_H)
257                 SET(BACKENDS  "${BACKENDS} ALSA,")
258             ELSE()
259                 SET(BACKENDS  "${BACKENDS} ALSA \(linked\),")
260                 SET(EXTRA_LIBS asound ${EXTRA_LIBS})
261             ENDIF()
262         ENDIF()
263     ENDIF()
264 ENDIF()
266 # Check OSS backend
267 IF(OSS)
268     CHECK_INCLUDE_FILE(sys/soundcard.h HAVE_SYS_SOUNDCARD_H)
269     IF(HAVE_SYS_SOUNDCARD_H)
270         SET(HAVE_OSS 1)
271         SET(ALC_OBJS  ${ALC_OBJS} Alc/oss.c)
272         SET(BACKENDS  "${BACKENDS} OSS,")
273     ENDIF()
274 ENDIF()
276 # Check Solaris backend
277 IF(SOLARIS)
278     CHECK_INCLUDE_FILE(sys/audioio.h HAVE_SYS_AUDIOIO_H)
279     IF(HAVE_SYS_AUDIOIO_H)
280         SET(HAVE_SOLARIS 1)
281         SET(ALC_OBJS  ${ALC_OBJS} Alc/solaris.c)
282         SET(BACKENDS  "${BACKENDS} Solaris,")
283     ENDIF()
284 ENDIF()
286 # Check DSound/MMSystem backend
287 IF(DSOUND)
288     CHECK_INCLUDE_FILE(dsound.h HAVE_DSOUND_H)
289     IF(HAVE_DSOUND_H)
290         SET(HAVE_DSOUND 1)
291         SET(ALC_OBJS  ${ALC_OBJS} Alc/dsound.c)
292         SET(BACKENDS  "${BACKENDS} DirectSound,")
294         SET(CMAKE_REQUIRED_LIBRARIES dsound)
295         CHECK_C_SOURCE_COMPILES("int main() {return 0;}" HAVE_LIBDSOUND)
296         SET(CMAKE_REQUIRED_LIBRARIES "")
297 #        CHECK_LIBRARY_EXISTS(dsound DirectSoundCreate "" HAVE_LIBDSOUND)
298         IF(HAVE_LIBDSOUND)
299             SET(EXTRA_LIBS dsound ${EXTRA_LIBS})
300         ENDIF()
301     ENDIF()
302 ENDIF()
303 IF(HAVE_WINDOWS_H)
304     IF(WINMM)
305         CHECK_INCLUDE_FILES("windows.h;mmsystem.h" HAVE_MMSYSTEM_H -D_WIN32_WINNT=0x0500)
306         IF(HAVE_MMSYSTEM_H)
307             SET(HAVE_WINMM 1)
308             SET(ALC_OBJS  ${ALC_OBJS} Alc/winmm.c)
309             SET(BACKENDS  "${BACKENDS} WinMM,")
311             SET(CMAKE_REQUIRED_LIBRARIES winmm)
312             CHECK_C_SOURCE_COMPILES("int main() {return 0;}" HAVE_LIBWINMM)
313             SET(CMAKE_REQUIRED_LIBRARIES "")
314 #            CHECK_LIBRARY_EXISTS(winmm waveInOpen "" HAVE_LIBWINMM)
315             IF(HAVE_LIBWINMM)
316                 SET(EXTRA_LIBS winmm ${EXTRA_LIBS})
317             ENDIF()
318         ENDIF()
319     ENDIF()
320 ENDIF()
322 # Check SDL backend
323 IF(SDL)
324     CHECK_INCLUDE_FILE(SDL.h HAVE_SDL_H)
325     IF(NOT HAVE_SDL_H)
326         CHECK_INCLUDE_FILE(SDL/SDL.h HAVE_SDL_SDL_H)
327     ENDIF()
328     IF(HAVE_SDL_H OR HAVE_SDL_SDL_H)
329         CHECK_LIBRARY_EXISTS(SDL SDL_Init "" HAVE_LIBSDL)
330         IF(HAVE_DLFCN_H OR HAVE_LIBSDL)
331             SET(HAVE_SDL 1)
332             SET(ALC_OBJS  ${ALC_OBJS} Alc/sdl.c)
333             IF(HAVE_DLFCN_H)
334                 SET(BACKENDS  "${BACKENDS} SDL,")
335             ELSE()
336                 SET(BACKENDS  "${BACKENDS} SDL \(linked\),")
337                 SET(EXTRA_LIBS SDL ${EXTRA_LIBS})
338             ENDIF()
339         ENDIF()
340     ENDIF()
341 ENDIF()
343 # This is always available
344 SET(BACKENDS  "${BACKENDS} WaveFile")
346 # Needed for openal.pc.in
347 SET(prefix ${CMAKE_INSTALL_PREFIX})
348 SET(exec_prefix "\${prefix}")
349 SET(libdir "\${exec_prefix}/${LIB_INSTALL_DIR}")
350 SET(bindir "\${exec_prefix}/bin")
351 SET(includedir "\${prefix}/include")
352 SET(PACKAGE_VERSION "${LIB_VERSION}")
354 # End configuration
355 CONFIGURE_FILE(
356     "${OpenAL_SOURCE_DIR}/config.h.in"
357     "${OpenAL_BINARY_DIR}/config.h")
358 CONFIGURE_FILE(
359     "${OpenAL_SOURCE_DIR}/admin/pkgconfig/openal.pc.in"
360     "${OpenAL_BINARY_DIR}/admin/pkgconfig/openal.pc"
361     @ONLY)
363 ADD_DEFINITIONS(-DAL_BUILD_LIBRARY)
365 # Build a library
366 IF(NOT LIBTYPE)
367     SET(LIBTYPE SHARED)
368 ENDIF()
369 ADD_LIBRARY(${LIBNAME} ${LIBTYPE} ${OPENAL_OBJS} ${ALC_OBJS})
370 SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES VERSION ${LIB_VERSION}
371                                             SOVERSION ${LIB_MAJOR_VERSION})
372 IF(WIN32)
373     SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES PREFIX "")
374 ENDIF()
376 TARGET_LINK_LIBRARIES(${LIBNAME} ${EXTRA_LIBS})
378 # Add an install target here
379 INSTALL(TARGETS ${LIBNAME}
380         RUNTIME DESTINATION bin
381         LIBRARY DESTINATION ${LIB_INSTALL_DIR}
382         ARCHIVE DESTINATION ${LIB_INSTALL_DIR}
384 INSTALL(FILES include/AL/al.h
385               include/AL/alc.h
386               include/AL/alext.h
387         DESTINATION include/AL
389 INSTALL(FILES "${OpenAL_BINARY_DIR}/admin/pkgconfig/openal.pc"
390         DESTINATION lib/pkgconfig)
392 IF(EXAMPLES)
393     ADD_EXECUTABLE(openal-info examples/openal-info.c)
394     TARGET_LINK_LIBRARIES(openal-info ${LIBNAME})
395     INSTALL(TARGETS openal-info
396             RUNTIME DESTINATION bin
397             LIBRARY DESTINATION ${LIB_INSTALL_DIR}
398             ARCHIVE DESTINATION ${LIB_INSTALL_DIR}
399     )
400 ENDIF()
402 MESSAGE(STATUS "")
403 MESSAGE(STATUS "Building OpenAL with support for the following backends:")
404 MESSAGE(STATUS "    ${BACKENDS}")
405 MESSAGE(STATUS "")
407 IF(WIN32)
408     IF(NOT HAVE_DSOUND)
409         MESSAGE(STATUS "WARNING: Building the Windows version without DirectSound output")
410         MESSAGE(STATUS "         This is probably NOT what you want!")
411         MESSAGE(STATUS "")
412     ENDIF()
413 ENDIF()