Add new functions to load files into existing buffers
[alure.git] / CMakeLists.txt
blob5fa4beece91d7961c57041811026a20a4401a08d
1 # CMakeLists.txt for ALURE
2 CMAKE_MINIMUM_REQUIRED(VERSION 2.4)
4 IF(COMMAND CMAKE_POLICY)
5     CMAKE_POLICY(SET CMP0003 NEW)
6 ENDIF(COMMAND CMAKE_POLICY)
9 INCLUDE(CheckCCompilerFlag)
10 INCLUDE(CheckFunctionExists)
11 INCLUDE(CheckIncludeFile)
12 INCLUDE(CheckIncludeFiles)
13 INCLUDE(CheckLibraryExists)
14 INCLUDE(FindPkgConfig)
15 INCLUDE(UsePkgConfig)
17 PROJECT(ALURE)
19 IF(WIN32)
20     SET(LIBNAME ALURE32)
21 ELSE(WIN32)
22     SET(LIBNAME alure)
23 ENDIF(WIN32)
25 SET(LIB_MAJOR_VERSION "0")
26 SET(LIB_MINOR_VERSION "0")
27 SET(LIB_BUILD_VERSION "0")
28 SET(LIB_VERSION "${LIB_MAJOR_VERSION}.${LIB_MINOR_VERSION}.${LIB_BUILD_VERSION}")
29 IF(NOT DEFINED LIB_INSTALL_DIR)
30   SET(LIB_INSTALL_DIR "lib")
31 ENDIF(NOT DEFINED LIB_INSTALL_DIR)
34 INCLUDE_DIRECTORIES(include "${ALURE_BINARY_DIR}")
37 OPTION(NO_SHARED "Build a static library instead of shared" OFF)
39 IF(NOT CMAKE_BUILD_TYPE)
40     SET(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING
41         "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel."
42         FORCE)
43 ENDIF(NOT CMAKE_BUILD_TYPE)
44 IF(NOT CMAKE_DEBUG_POSTFIX)
45     SET(CMAKE_DEBUG_POSTFIX "" CACHE STRING
46         "Library postfix for debug builds. Normally left blank."
47         FORCE)
48 ENDIF(NOT CMAKE_DEBUG_POSTFIX)
51 ADD_DEFINITIONS(-DALURE_BUILD_LIBRARY -DHAVE_CONFIG_H)
53 IF(MSVC)
54     # ???
55 ELSE(MSVC)
56     IF(NOT WIN32)
57         CHECK_C_COMPILER_FLAG(-fvisibility=hidden HAVE_GCC_VISIBILITY)
58         IF(HAVE_GCC_VISIBILITY)
59             ADD_DEFINITIONS(-fvisibility=hidden)
60         ENDIF(HAVE_GCC_VISIBILITY)
61     ENDIF(NOT WIN32)
63     CHECK_C_COMPILER_FLAG(-Wextra HAVE_WEXTRA)
64     IF(HAVE_WEXTRA)
65         ADD_DEFINITIONS(-Wextra)
66     ENDIF(HAVE_WEXTRA)
67     ADD_DEFINITIONS(-Wall)
68 ENDIF(MSVC)
71 OPTION(DYNLOAD "Enable dynamic run-time loading of libraries" ON)
73 CHECK_INCLUDE_FILE(windows.h HAVE_WINDOWS_H -D_WIN32_WINNT=0x0500)
74 IF(NOT HAVE_WINDOWS_H)
75     CHECK_FUNCTION_EXISTS(nanosleep HAVE_NANOSLEEP)
76     IF(NOT HAVE_NANOSLEEP)
77         MESSAGE(FATAL_ERROR "No sleep function found!")
78     ENDIF(NOT HAVE_NANOSLEEP)
80     IF(DYNLOAD)
81         CHECK_INCLUDE_FILE(dlfcn.h HAVE_DLFCN_H)
82         IF(HAVE_DLFCN_H)
83             CHECK_LIBRARY_EXISTS(dl dlopen "" HAVE_LIBDL)
84             IF(HAVE_LIBDL)
85                 SET(HAS_DLOPEN 1)
86                 SET(EXTRA_LIBS dl ${EXTRA_LIBS})
87             ENDIF(HAVE_LIBDL)
88         ENDIF(HAVE_DLFCN_H)
89     ENDIF(DYNLOAD)
90 ELSE(NOT HAVE_WINDOWS_H)
91     IF(DYNLOAD)
92         SET(HAS_LOADLIBRARY 1)
93     ENDIF(DYNLOAD)
94 ENDIF(NOT HAVE_WINDOWS_H)
97 OPTION(SNDFILE "SoundFile support (for Wave, FLAC, and various others)" ON)
98 OPTION(VORBIS  "VorbisFile support (for Ogg Vorbis)"  ON)
99 OPTION(MPG123  "MPG123 support (for MP3, MP2, and MP1)"  ON)
101 OPTION(LARGEFILES "Large (>4GB) file support" ON)
103 IF(WIN32)
104     ADD_DEFINITIONS(-D_WIN32)
106     IF(CMAKE_SIZEOF_VOID_P MATCHES "8")
107         SET(WIN_TYPE Win64)
108         SET(XBITS x64)
109     ELSE(CMAKE_SIZEOF_VOID_P MATCHES "8")
110         SET(WIN_TYPE Win32)
111         SET(XBITS x86)
112     ENDIF(CMAKE_SIZEOF_VOID_P MATCHES "8")
114     SET(OPENAL_SEARCH_PATHS
115         ENV MINGDIR
116         ENV ALSDK_DIR
117         "C:/Program Files/OpenAL 1.1 SDK"
118         "C:/Program Files (x86)/OpenAL 1.1 SDK"
119         "E:/Programs/Dev/OpenAL"
120         "E:/Program Files (x86)/OpenAL 1.1 SDK" )
122     FIND_PATH(OPENAL_INCLUDE_DIR al.h
123               PATHS ${OPENAL_SEARCH_PATHS}
124               PATH_SUFFIXES include include/AL )
125     IF(OPENAL_INCLUDE_DIR)
126         INCLUDE_DIRECTORIES(${OPENAL_INCLUDE_DIR})
127         FIND_LIBRARY(OPENAL_LIBRARIES OpenAL32
128                      PATHS ${OPENAL_SEARCH_PATHS}
129                      PATH_SUFFIXES lib libs/${WIN_TYPE} )
130     ENDIF(OPENAL_INCLUDE_DIR)
132     IF(NOT OPENAL_LIBRARIES)
133         MESSAGE(FATAL_ERROR "OpenAL not found!\nPlease try setting the ALSDK_DIR environment variable and try again.")
134     ENDIF(NOT OPENAL_LIBRARIES)
136     MESSAGE(STATUS "OpenAL include: ${OPENAL_INCLUDE_DIR}")
137     MESSAGE(STATUS "OpenAL lib: ${OPENAL_LIBRARIES}")
138 ELSE(WIN32)
139     PKG_CHECK_MODULES(OPENAL openal)
140     IF(NOT OPENAL_FOUND)
141         IF(APPLE)
142             CHECK_INCLUDE_FILE(OpenAL/al.h HAVE_OPENAL_AL_H)
143             IF(HAVE_OPENAL_AL_H)
144                 SET(OPENAL_LIBRARIES "-framework OpenAL")
145                 SET(HAS_OPENAL 1)
146             ENDIF(HAVE_OPENAL_AL_H)
147         ELSE(APPLE)
148             CHECK_INCLUDE_FILE(AL/al.h HAVE_AL_AL_H)
149             IF(HAVE_AL_AL_H)
150                 CHECK_LIBRARY_EXISTS(openal alcOpenDevice "" HAS_OPENAL)
151             ENDIF(HAVE_AL_AL_H)
152             IF(NOT HAS_OPENAL)
153                 MESSAGE(FATAL_ERROR "OpenAL not found!")
154             ENDIF(NOT HAS_OPENAL)
155             SET(OPENAL_LIBRARIES openal)
156         ENDIF(APPLE)
157     ELSE(NOT OPENAL_FOUND)
158         INCLUDE_DIRECTORIES(${OPENAL_INCLUDE_DIRS})
159         LINK_DIRECTORIES(${OPENAL_LIBRARY_DIRS})
160     ENDIF(NOT OPENAL_FOUND)
161 ENDIF(WIN32)
163 # SndFile support
164 IF(SNDFILE)
165     PKG_CHECK_MODULES(SNDFILE sndfile)
166     IF(NOT SNDFILE_FOUND)
167         CHECK_INCLUDE_FILE(sndfile.h HAVE_SNDFILE_H)
168         IF(HAVE_SNDFILE_H)
169             # Libraries will be loaded dynamicly at runtime if possible; don't
170             # link them here
171             IF(HAS_DLOPEN OR HAS_LOADLIBRARY)
172                 SET(HAS_SNDFILE 1)
173             ELSE(HAS_DLOPEN OR HAS_LOADLIBRARY)
174                 CHECK_LIBRARY_EXISTS(sndfile sf_open "" HAS_SNDFILE)
175                 IF(HAS_SNDFILE)
176                     SET(SNDFILE_LIBRARIES "sndfile")
177                 ENDIF(HAS_SNDFILE)
178             ENDIF(HAS_DLOPEN OR HAS_LOADLIBRARY)
179         ENDIF(HAVE_SNDFILE_H)
180     ELSE(NOT SNDFILE_FOUND)
181         SET(HAS_SNDFILE 1)
182         INCLUDE_DIRECTORIES(${SNDFILE_INCLUDE_DIRS})
183         IF(HAS_DLOPEN OR HAS_LOADLIBRARY)
184             SET(SNDFILE_LIBRARIES "")
185         ELSE(HAS_DLOPEN OR HAS_LOADLIBRARY)
186             LINK_DIRECTORIES(${SNDFILE_LIBRARY_DIRS})
187         ENDIF(HAS_DLOPEN OR HAS_LOADLIBRARY)
188     ENDIF(NOT SNDFILE_FOUND)
189 ELSE(SNDFILE)
190     SET(SNDFILE_LIBRARIES "")
191 ENDIF(SNDFILE)
193 # Vorbis support
194 IF(VORBIS)
195     PKG_CHECK_MODULES(VORBISFILE vorbisfile)
196     IF(NOT VORBISFILE_FOUND)
197         CHECK_INCLUDE_FILE(vorbis/vorbisfile.h HAVE_VORBIS_VORBISFILE_H)
198         IF(HAVE_VORBIS_VORBISFILE_H)
199             IF(HAS_DLOPEN OR HAS_LOADLIBRARY)
200                 SET(HAS_VORBISFILE 1)
201             ELSE(HAS_DLOPEN OR HAS_LOADLIBRARY)
202                 CHECK_LIBRARY_EXISTS(vorbisfile ov_open "" HAS_VORBISFILE)
203                 IF(HAS_VORBISFILE)
204                     SET(VORBISFILE_LIBRARIES "vorbisfile")
205                 ENDIF(HAS_VORBISFILE)
206             ENDIF(HAS_DLOPEN OR HAS_LOADLIBRARY)
207         ENDIF(HAVE_VORBIS_VORBISFILE_H)
208     ELSE(NOT VORBISFILE_FOUND)
209         SET(HAS_VORBISFILE 1)
210         INCLUDE_DIRECTORIES(${VORBISFILE_INCLUDE_DIRS})
211         IF(HAS_DLOPEN OR HAS_LOADLIBRARY)
212             SET(VORBISFILE_LIBRARIES "")
213         ELSE(HAS_DLOPEN OR HAS_LOADLIBRARY)
214             LINK_DIRECTORIES(${VORBISFILE_LIBRARY_DIRS})
215         ENDIF(HAS_DLOPEN OR HAS_LOADLIBRARY)
216     ENDIF(NOT VORBISFILE_FOUND)
217 ELSE(VORBISFILE)
218     SET(VORBISFILE_LIBRARIES "")
219 ENDIF(VORBIS)
221 # MP3 support
222 IF(MPG123)
223     PKG_CHECK_MODULES(MPG123 libmpg123)
224     IF(NOT MPG123_FOUND)
225         CHECK_INCLUDE_FILE(mpg123.h HAVE_MPG123_H)
226         IF(HAVE_MPG123_H)
227             IF(HAS_DLOPEN OR HAS_LOADLIBRARY)
228                 SET(HAS_MPG123 1)
229             ELSE(HAS_DLOPEN OR HAS_LOADLIBRARY)
230                 CHECK_LIBRARY_EXISTS(mpg123 mpg123_init "" HAS_MPG123)
231                 IF(HAS_MPG123)
232                     SET(MPG123_LIBRARIES "mpg123")
233                 ENDIF(HAS_MPG123)
234             ENDIF(HAS_DLOPEN OR HAS_LOADLIBRARY)
235         ENDIF(HAVE_MPG123_H)
236     ELSE(NOT MPG123_FOUND)
237         SET(HAS_MPG123 1)
238         INCLUDE_DIRECTORIES(${MPG123_INCLUDE_DIRS})
239         IF(HAS_DLOPEN OR HAS_LOADLIBRARY)
240             SET(MPG123_LIBRARIES "")
241         ELSE(HAS_DLOPEN OR HAS_LOADLIBRARY)
242             LINK_DIRECTORIES(${MPG123_LIBRARY_DIRS})
243         ENDIF(HAS_DLOPEN OR HAS_LOADLIBRARY)
244     ENDIF(NOT MPG123_FOUND)
245 ELSE(MPG123)
246     SET(MPG123_LIBRARIES "")
247 ENDIF(MPG123)
250 IF(LARGEFILES)
251     ADD_DEFINITIONS(-D_FILE_OFFSET_BITS=64)
252 ENDIF(LARGEFILES)
255 # For alure.pc.in
256 SET(prefix ${CMAKE_INSTALL_PREFIX})
257 SET(exec_prefix "\${prefix}")
258 SET(libdir "\${exec_prefix}/${LIB_INSTALL_DIR}")
259 SET(bindir "\${exec_prefix}/bin")
260 SET(includedir "\${prefix}/include")
261 SET(PKG_CONFIG_REQUIRES openal)
262 SET(PACKAGE_VERSION "${LIB_VERSION}")
264 # End configuration
265 CONFIGURE_FILE(
266     "${ALURE_SOURCE_DIR}/config.h.in"
267     "${ALURE_BINARY_DIR}/config.h")
268 CONFIGURE_FILE(
269     "${ALURE_SOURCE_DIR}/alure.pc.in"
270     "${ALURE_BINARY_DIR}/alure.pc"
271     @ONLY)
274 SET(ALURE_OBJS  src/alure.cpp
275                 src/buffer.cpp
276                 src/stream.cpp
279 IF(NOT NO_SHARED)
280     #build a shared library
281     ADD_LIBRARY(${LIBNAME} SHARED ${ALURE_OBJS})
282     SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES VERSION ${LIB_VERSION}
283                                                 SOVERSION ${LIB_MAJOR_VERSION})
284     TARGET_LINK_LIBRARIES(${LIBNAME} ${OPENAL_LIBRARIES} ${SNDFILE_LIBRARIES} ${VORBISFILE_LIBRARIES} ${MPG123_LIBRARIES} ${EXTRA_LIBS})
285 ELSE(NOT NO_SHARED)
286     #build a static library
287     ADD_LIBRARY(${LIBNAME} STATIC ${ALURE_OBJS})
288     SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES VERSION ${LIB_VERSION})
289 ENDIF(NOT NO_SHARED)
292 ADD_EXECUTABLE(alureplay examples/alureplay.c)
293 TARGET_LINK_LIBRARIES(alureplay ${LIBNAME} ${OPENAL_LIBRARIES} stdc++)
295 ADD_EXECUTABLE(alurestream examples/alurestream.c)
296 TARGET_LINK_LIBRARIES(alurestream ${LIBNAME} ${OPENAL_LIBRARIES} stdc++)
299 FIND_PROGRAM(NATDOCS_BIN NaturalDocs)
300 IF(NATDOCS_BIN)
301     ADD_CUSTOM_TARGET(docs
302                       "${NATDOCS_BIN}" -i "${ALURE_SOURCE_DIR}/src" -o HTML "${ALURE_SOURCE_DIR}/docs/html" -p "${ALURE_SOURCE_DIR}/docs/naturaldocs"
303                       COMMENT "Building NaturalDocs documentation..." VERBATIM)
304 ELSE(NATDOCS_BIN)
305     MESSAGE(STATUS "\nNaturalDocs not found; building documentation is disabled")
306 ENDIF(NATDOCS_BIN)
309 #add an install target here
310 IF(APPLE)
311     SET(INCPATH OpenAL)
312 ELSE(APPLE)
313     SET(INCPATH AL)
314 ENDIF(APPLE)
316 INSTALL(DIRECTORY "${ALURE_SOURCE_DIR}/docs/html"
317         DESTINATION share/doc/alure
319 INSTALL(TARGETS ${LIBNAME}
320         RUNTIME DESTINATION bin
321         LIBRARY DESTINATION ${LIB_INSTALL_DIR}
322         ARCHIVE DESTINATION ${LIB_INSTALL_DIR}
324 INSTALL(FILES include/AL/alure.h
325         DESTINATION "include/${INCPATH}"
327 INSTALL(FILES "${ALURE_BINARY_DIR}/alure.pc"
328         DESTINATION lib/pkgconfig
332 MESSAGE(STATUS "\n********************** Configured options **********************")
333 IF(NO_SHARED)
334     MESSAGE(STATUS "Building static library")
335 ELSE(NO_SHARED)
336     MESSAGE(STATUS "Building shared library")
337 ENDIF(NO_SHARED)
338 MESSAGE(STATUS "")
339 IF(HAS_DLOPEN OR HAS_LOADLIBRARY)
340     MESSAGE(STATUS "Dynamic loading of support libs: enabled")
341 ELSE(HAS_DLOPEN OR HAS_LOADLIBRARY)
342     MESSAGE(STATUS "Dynamic loading of support libs: disabled")
343 ENDIF(HAS_DLOPEN OR HAS_LOADLIBRARY)
344 MESSAGE(STATUS "")
345 IF(HAS_SNDFILE)
346     MESSAGE(STATUS "SndFile support: enabled")
347 ELSE(HAS_SNDFILE)
348     MESSAGE(STATUS "SndFile support: disabled")
349 ENDIF(HAS_SNDFILE)
350 IF(HAS_VORBISFILE)
351     MESSAGE(STATUS "VorbisFile support: enabled")
352 ELSE(HAS_VORBISFILE)
353     MESSAGE(STATUS "VorbisFile support: disabled")
354 ENDIF(HAS_VORBISFILE)
355 IF(HAS_MPG123)
356     MESSAGE(STATUS "MPG123 support: enabled")
357 ELSE(HAS_MPG123)
358     MESSAGE(STATUS "MPG123 support: disabled")
359 ENDIF(HAS_MPG123)
360 MESSAGE(STATUS "")