Add cross-compiling option
[openal-soft.git] / CMakeLists.txt
blob28cce9465e41b4d7678ffb969656556a17453ff3
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/alcRing.c
236               Alc/alcThread.c
237               Alc/bs2b.c
238               Alc/wave.c
241 SET(BACKENDS "")
243 # Check ALSA backend
244 IF(ALSA)
245     CHECK_INCLUDE_FILE(alsa/asoundlib.h HAVE_ALSA_ASOUNDLIB_H)
246     IF(HAVE_ALSA_ASOUNDLIB_H)
247         CHECK_LIBRARY_EXISTS(asound snd_pcm_open "" HAVE_LIBASOUND)
248         IF(HAVE_DLFCN_H OR HAVE_LIBASOUND)
249             SET(HAVE_ALSA 1)
250             SET(ALC_OBJS  ${ALC_OBJS} Alc/alsa.c)
251             IF(HAVE_DLFCN_H)
252                 SET(BACKENDS  "${BACKENDS} ALSA,")
253             ELSE()
254                 SET(BACKENDS  "${BACKENDS} ALSA \(linked\),")
255                 SET(EXTRA_LIBS asound ${EXTRA_LIBS})
256             ENDIF()
257         ENDIF()
258     ENDIF()
259 ENDIF()
261 # Check OSS backend
262 IF(OSS)
263     CHECK_INCLUDE_FILE(sys/soundcard.h HAVE_SYS_SOUNDCARD_H)
264     IF(HAVE_SYS_SOUNDCARD_H)
265         SET(HAVE_OSS 1)
266         SET(ALC_OBJS  ${ALC_OBJS} Alc/oss.c)
267         SET(BACKENDS  "${BACKENDS} OSS,")
268     ENDIF()
269 ENDIF()
271 # Check Solaris backend
272 IF(SOLARIS)
273     CHECK_INCLUDE_FILE(sys/audioio.h HAVE_SYS_AUDIOIO_H)
274     IF(HAVE_SYS_AUDIOIO_H)
275         SET(HAVE_SOLARIS 1)
276         SET(ALC_OBJS  ${ALC_OBJS} Alc/solaris.c)
277         SET(BACKENDS  "${BACKENDS} Solaris,")
278     ENDIF()
279 ENDIF()
281 # Check DSound/MMSystem backend
282 IF(HAVE_WINDOWS_H)
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(WINMM)
300         CHECK_INCLUDE_FILES("windows.h;mmsystem.h" HAVE_MMSYSTEM_H -D_WIN32_WINNT=0x0500)
301         IF(HAVE_MMSYSTEM_H)
302             SET(HAVE_WINMM 1)
303             SET(ALC_OBJS  ${ALC_OBJS} Alc/winmm.c)
304             SET(BACKENDS  "${BACKENDS} WinMM,")
306             SET(CMAKE_REQUIRED_LIBRARIES winmm)
307             CHECK_C_SOURCE_COMPILES("int main() {return 0;}" HAVE_LIBWINMM)
308             SET(CMAKE_REQUIRED_LIBRARIES "")
309 #            CHECK_LIBRARY_EXISTS(winmm waveInOpen "" HAVE_LIBWINMM)
310             IF(HAVE_LIBWINMM)
311                 SET(EXTRA_LIBS winmm ${EXTRA_LIBS})
312             ENDIF()
313         ENDIF()
314     ENDIF()
315 ENDIF()
317 # This is always available
318 SET(BACKENDS  "${BACKENDS} WaveFile")
320 # Needed for openal.pc.in
321 SET(prefix ${CMAKE_INSTALL_PREFIX})
322 SET(exec_prefix "\${prefix}")
323 SET(libdir "\${exec_prefix}/${LIB_INSTALL_DIR}")
324 SET(bindir "\${exec_prefix}/bin")
325 SET(includedir "\${prefix}/include")
326 SET(PACKAGE_VERSION "${LIB_VERSION}")
328 # End configuration
329 CONFIGURE_FILE(
330     "${OpenAL_SOURCE_DIR}/config.h.in"
331     "${OpenAL_BINARY_DIR}/config.h")
332 CONFIGURE_FILE(
333     "${OpenAL_SOURCE_DIR}/admin/pkgconfig/openal.pc.in"
334     "${OpenAL_BINARY_DIR}/admin/pkgconfig/openal.pc"
335     @ONLY)
337 ADD_DEFINITIONS(-DAL_BUILD_LIBRARY)
339 # Build a library
340 IF(NOT LIBTYPE)
341     SET(LIBTYPE SHARED)
342 ENDIF()
343 ADD_LIBRARY(${LIBNAME} ${LIBTYPE} ${OPENAL_OBJS} ${ALC_OBJS})
344 SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES VERSION ${LIB_VERSION}
345                                             SOVERSION ${LIB_MAJOR_VERSION})
346 IF(XCOMPILEWIN32)
347     SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES PREFIX "" SUFFIX .dll)
348     IF(EXAMPLES)
349         SET(EXAMPLES OFF)
350         MESSAGE(STATUS "")
351         MESSAGE(STATUS "Building examples disabled when cross-compiling")
352     ENDIF()
353 ENDIF()
354 SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES OUTPUT_NAME ${LIBNAME})
356 TARGET_LINK_LIBRARIES(${LIBNAME} ${EXTRA_LIBS})
358 # Add an install target here
359 INSTALL(TARGETS ${LIBNAME}
360         RUNTIME DESTINATION bin
361         LIBRARY DESTINATION ${LIB_INSTALL_DIR}
362         ARCHIVE DESTINATION ${LIB_INSTALL_DIR}
364 INSTALL(FILES include/AL/al.h
365               include/AL/alc.h
366               include/AL/alext.h
367         DESTINATION include/AL
369 INSTALL(FILES "${OpenAL_BINARY_DIR}/admin/pkgconfig/openal.pc"
370         DESTINATION lib/pkgconfig)
372 IF(EXAMPLES)
373     ADD_EXECUTABLE(openal-info examples/openal-info.c)
374     TARGET_LINK_LIBRARIES(openal-info ${LIBNAME})
375     INSTALL(TARGETS openal-info
376             RUNTIME DESTINATION bin
377             LIBRARY DESTINATION ${LIB_INSTALL_DIR}
378             ARCHIVE DESTINATION ${LIB_INSTALL_DIR}
379     )
380 ENDIF()
382 MESSAGE(STATUS "")
383 MESSAGE(STATUS "Building OpenAL with support for the following backends:")
384 MESSAGE(STATUS "    ${BACKENDS}")
385 MESSAGE(STATUS "")
387 IF(WIN32 OR XCOMPILEWIN32)
388     IF(NOT HAVE_DSOUND)
389         MESSAGE(STATUS "WARNING: Building the Windows version without DirectSound output")
390         MESSAGE(STATUS "         This is probably NOT what you want!")
391         MESSAGE(STATUS "")
392     ENDIF()
393 ENDIF()