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)
8 SET(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake")
10 INCLUDE(CheckCCompilerFlag)
11 INCLUDE(CheckCSourceCompiles)
12 INCLUDE(CheckFunctionExists)
13 INCLUDE(CheckIncludeFile)
14 INCLUDE(CheckIncludeFiles)
15 INCLUDE(CheckLibraryExists)
16 INCLUDE(CheckSharedLibraryExists)
17 INCLUDE(FindPkgConfig)
19 INCLUDE(CheckFileOffsetBits)
29 SET(LIB_MAJOR_VERSION "1")
30 SET(LIB_MINOR_VERSION "0")
31 SET(LIB_BUILD_VERSION "72")
32 SET(LIB_VERSION "${LIB_MAJOR_VERSION}.${LIB_MINOR_VERSION}.${LIB_BUILD_VERSION}")
35 INCLUDE_DIRECTORIES(include "${ALURE_BINARY_DIR}")
38 OPTION(BUILD_SHARED "Build the shared version of the library" ON)
39 OPTION(BUILD_STATIC "Build the static version of the library" ON)
41 IF(NOT BUILD_SHARED AND NOT BUILD_STATIC)
42 MESSAGE(FATAL_ERROR "No libtype being built!")
43 ENDIF(NOT BUILD_SHARED AND NOT BUILD_STATIC)
45 IF(NOT CMAKE_BUILD_TYPE)
46 SET(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING
47 "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel."
49 ENDIF(NOT CMAKE_BUILD_TYPE)
50 IF(NOT DEFINED CMAKE_DEBUG_POSTFIX)
51 SET(CMAKE_DEBUG_POSTFIX "" CACHE STRING
52 "Library postfix for debug builds. Normally left blank."
54 ENDIF(NOT DEFINED CMAKE_DEBUG_POSTFIX)
57 ADD_DEFINITIONS(-DALURE_BUILD_LIBRARY -DHAVE_CONFIG_H)
59 CHECK_SHARED_LIBRARY_EXISTS(stdc++ memset "" HAS_STDCXX)
61 SET(EXTRA_LIBS stdc++ ${EXTRA_LIBS})
64 CHECK_SHARED_LIBRARY_EXISTS(m pow "" HAS_LIBM)
66 SET(EXTRA_LIBS m ${EXTRA_LIBS})
69 CHECK_FILE_OFFSET_BITS()
71 ADD_DEFINITIONS(-D_FILE_OFFSET_BITS=${_FILE_OFFSET_BITS})
72 SET(CMAKE_REQUIRED_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS} -D_FILE_OFFSET_BITS=${_FILE_OFFSET_BITS})
73 ENDIF(_FILE_OFFSET_BITS)
75 CHECK_FUNCTION_EXISTS(fseeko HAVE_FSEEKO)
81 CHECK_C_SOURCE_COMPILES("int foo() __attribute__((constructor));
82 int main() {return 0;}" HAVE_GCC_CONSTRUCTOR)
84 CHECK_C_COMPILER_FLAG(-fvisibility=hidden HAVE_GCC_VISIBILITY)
85 IF(HAVE_GCC_VISIBILITY)
86 ADD_DEFINITIONS(-fvisibility=hidden)
87 ENDIF(HAVE_GCC_VISIBILITY)
90 CHECK_C_COMPILER_FLAG(-Wextra HAVE_WEXTRA)
92 ADD_DEFINITIONS(-Wextra)
94 ADD_DEFINITIONS(-Wall)
96 CHECK_C_COMPILER_FLAG(-funswitch-loops HAVE_FUNSWITCH_LOOPS)
97 IF(HAVE_FUNSWITCH_LOOPS)
98 ADD_DEFINITIONS(-funswitch-loops)
99 ENDIF(HAVE_FUNSWITCH_LOOPS)
103 CHECK_INCLUDE_FILE(windows.h HAVE_WINDOWS_H -D_WIN32_WINNT=0x0500)
104 IF(NOT HAVE_WINDOWS_H)
105 CHECK_C_COMPILER_FLAG(-pthread HAVE_PTHREAD)
107 ADD_DEFINITIONS(-pthread)
108 SET(EXTRA_LIBS ${EXTRA_LIBS} -pthread)
111 # We need pthreads outside of Windows
112 CHECK_INCLUDE_FILE(pthread.h HAVE_PTHREAD_H)
113 IF(NOT HAVE_PTHREAD_H)
114 MESSAGE(FATAL_ERROR "PThreads is required for non-Windows builds!")
116 # Some systems need pthread_np.h to get recursive mutexes
117 CHECK_INCLUDE_FILES("pthread.h;pthread_np.h" HAVE_PTHREAD_NP_H)
119 # _GNU_SOURCE is needed on some systems for extra attributes, and
120 # _REENTRANT is needed for libc thread-safety
121 ADD_DEFINITIONS(-D_GNU_SOURCE=1)
122 CHECK_FUNCTION_EXISTS(pthread_create HAS_PTHREAD_CREATE)
123 IF(NOT HAS_PTHREAD_CREATE)
124 CHECK_SHARED_LIBRARY_EXISTS(pthread pthread_create "" HAVE_LIBPTHREAD)
125 IF(NOT HAVE_LIBPTHREAD)
126 MESSAGE(FATAL_ERROR "pthread_create not found on non-Windows target!")
127 ENDIF(NOT HAVE_LIBPTHREAD)
128 SET(EXTRA_LIBS pthread ${EXTRA_LIBS})
129 ENDIF(NOT HAS_PTHREAD_CREATE)
131 CHECK_FUNCTION_EXISTS(nanosleep HAVE_NANOSLEEP)
132 IF(NOT HAVE_NANOSLEEP)
133 MESSAGE(FATAL_ERROR "No sleep function found!")
134 ENDIF(NOT HAVE_NANOSLEEP)
135 ENDIF(NOT HAVE_WINDOWS_H)
137 CHECK_INCLUDE_FILE(sys/types.h HAVE_SYS_TYPES_H)
138 CHECK_INCLUDE_FILE(sys/wait.h HAVE_SYS_WAIT_H)
139 CHECK_INCLUDE_FILE(signal.h HAVE_SIGNAL_H)
140 CHECK_INCLUDE_FILE(dlfcn.h HAVE_DLFCN_H)
143 CHECK_SHARED_LIBRARY_EXISTS(dl dlopen "" HAVE_LIBDL)
145 SET(EXTRA_LIBS dl ${EXTRA_LIBS})
149 OPTION(DYNLOAD "Dynamically load support libs at run-time" ON)
150 OPTION(SNDFILE "SoundFile support (for various formats)" ON)
151 OPTION(VORBIS "VorbisFile support (for Ogg Vorbis)" ON)
152 OPTION(FLAC "FLAC support (for FLAC and Ogg FLAC)" ON)
153 OPTION(MPG123 "MPG123 support (for MP1/MP2/MP3)" ON)
154 OPTION(DUMB "DUMB support (for IT/XM/S3M/MOD)" ON)
155 OPTION(TIMIDITY "Timidity support (for MIDI/MUS)" OFF)
158 ADD_DEFINITIONS(-D_WIN32)
160 IF(CMAKE_SIZEOF_VOID_P MATCHES "8")
163 ELSE(CMAKE_SIZEOF_VOID_P MATCHES "8")
166 ENDIF(CMAKE_SIZEOF_VOID_P MATCHES "8")
168 SET(OPENAL_SEARCH_PATHS
171 "C:/Program Files/OpenAL 1.1 SDK"
172 "C:/Program Files (x86)/OpenAL 1.1 SDK"
173 "E:/Programs/Dev/OpenAL"
174 "E:/Program Files (x86)/OpenAL 1.1 SDK" )
176 FIND_PATH(OPENAL_INCLUDE_DIR al.h
177 PATHS ${OPENAL_SEARCH_PATHS}
178 PATH_SUFFIXES include include/AL )
179 IF(OPENAL_INCLUDE_DIR)
180 INCLUDE_DIRECTORIES(${OPENAL_INCLUDE_DIR})
181 FIND_LIBRARY(OPENAL_LIBRARIES OpenAL32
182 PATHS ${OPENAL_SEARCH_PATHS}
183 PATH_SUFFIXES lib libs/${WIN_TYPE} )
184 ENDIF(OPENAL_INCLUDE_DIR)
186 IF(NOT OPENAL_LIBRARIES)
187 MESSAGE(FATAL_ERROR "OpenAL not found!\nPlease try setting the ALSDK_DIR environment variable and try again.")
188 ENDIF(NOT OPENAL_LIBRARIES)
190 MESSAGE(STATUS "OpenAL include: ${OPENAL_INCLUDE_DIR}")
191 MESSAGE(STATUS "OpenAL lib: ${OPENAL_LIBRARIES}")
193 IF(NOT HAVE_DLFCN_H OR NOT HAVE_LIBDL)
195 ENDIF(NOT HAVE_DLFCN_H OR NOT HAVE_LIBDL)
197 PKG_CHECK_MODULES(OPENAL openal)
200 CHECK_INCLUDE_FILE(OpenAL/al.h HAVE_OPENAL_AL_H)
202 SET(OPENAL_LIBRARIES "-framework OpenAL")
204 ENDIF(HAVE_OPENAL_AL_H)
206 CHECK_INCLUDE_FILE(AL/al.h HAVE_AL_AL_H)
208 CHECK_SHARED_LIBRARY_EXISTS(openal alcOpenDevice "" HAS_OPENAL)
210 SET(OPENAL_LIBRARIES openal)
215 MESSAGE(FATAL_ERROR "OpenAL not found!")
216 ENDIF(NOT HAS_OPENAL)
217 ELSE(NOT OPENAL_FOUND)
218 INCLUDE_DIRECTORIES(${OPENAL_INCLUDE_DIRS})
219 LINK_DIRECTORIES(${OPENAL_LIBRARY_DIRS})
220 ENDIF(NOT OPENAL_FOUND)
225 PKG_CHECK_MODULES(SNDFILE sndfile)
226 IF(NOT SNDFILE_FOUND)
227 CHECK_INCLUDE_FILE(sndfile.h HAVE_SNDFILE_H)
229 CHECK_SHARED_LIBRARY_EXISTS(sndfile sf_open "" HAVE_LIBSNDFILE)
230 CHECK_SHARED_LIBRARY_EXISTS(libsndfile-1 sf_open "" HAVE_LIBSNDFILE1)
231 IF(DYNLOAD OR HAVE_LIBSNDFILE OR HAVE_LIBSNDFILE1)
234 SET(SNDFILE_LIBRARIES "sndfile")
235 ELSEIF(HAVE_LIBSNDFILE1)
236 SET(SNDFILE_LIBRARIES "libsndfile-1")
237 ENDIF(HAVE_LIBSNDFILE)
238 ENDIF(DYNLOAD OR HAVE_LIBSNDFILE OR HAVE_LIBSNDFILE1)
239 ENDIF(HAVE_SNDFILE_H)
240 ELSE(NOT SNDFILE_FOUND)
242 INCLUDE_DIRECTORIES(${SNDFILE_INCLUDE_DIRS})
243 LINK_DIRECTORIES(${SNDFILE_LIBRARY_DIRS})
244 ENDIF(NOT SNDFILE_FOUND)
246 SET(SNDFILE_LIBRARIES "")
251 PKG_CHECK_MODULES(VORBISFILE vorbisfile)
252 IF(NOT VORBISFILE_FOUND)
253 CHECK_INCLUDE_FILE(vorbis/vorbisfile.h HAVE_VORBIS_VORBISFILE_H)
254 IF(HAVE_VORBIS_VORBISFILE_H)
255 CHECK_SHARED_LIBRARY_EXISTS(vorbisfile ov_open "" HAVE_LIBVORBISFILE)
256 IF(DYNLOAD OR HAVE_LIBVORBISFILE)
257 SET(HAS_VORBISFILE 1)
258 IF(HAVE_LIBVORBISFILE)
259 SET(VORBISFILE_LIBRARIES "vorbisfile")
260 ENDIF(HAVE_LIBVORBISFILE)
261 ENDIF(DYNLOAD OR HAVE_LIBVORBISFILE)
262 ENDIF(HAVE_VORBIS_VORBISFILE_H)
263 ELSE(NOT VORBISFILE_FOUND)
264 SET(HAS_VORBISFILE 1)
265 INCLUDE_DIRECTORIES(${VORBISFILE_INCLUDE_DIRS})
266 LINK_DIRECTORIES(${VORBISFILE_LIBRARY_DIRS})
267 ENDIF(NOT VORBISFILE_FOUND)
269 SET(VORBISFILE_LIBRARIES "")
274 #PKG_CHECK_MODULES(LIBFLAC flac)
275 #IF(NOT LIBFLAC_FOUND)
276 CHECK_INCLUDE_FILE(FLAC/all.h HAVE_FLAC_ALL_H)
278 CHECK_SHARED_LIBRARY_EXISTS(FLAC FLAC__stream_decoder_new "" HAVE_LIBFLAC)
279 IF(DYNLOAD OR HAVE_LIBFLAC)
282 SET(LIBFLAC_LIBRARIES "FLAC")
284 ENDIF(DYNLOAD OR HAVE_LIBFLAC)
285 ENDIF(HAVE_FLAC_ALL_H)
288 # INCLUDE_DIRECTORIES(${LIBFLAC_INCLUDE_DIRS})
289 # LINK_DIRECTORIES(${LIBFLAC_LIBRARY_DIRS})
290 #ENDIF(NOT LIBFLAC_FOUND)
292 SET(LIBFLAC_LIBRARIES "")
297 PKG_CHECK_MODULES(MPG123 libmpg123)
299 CHECK_INCLUDE_FILE(mpg123.h HAVE_MPG123_H)
301 CHECK_SHARED_LIBRARY_EXISTS(mpg123 mpg123_init "" HAVE_LIBMPG123)
302 IF(DYNLOAD OR HAVE_LIBMPG123)
305 SET(MPG123_LIBRARIES "mpg123")
306 ENDIF(HAVE_LIBMPG123)
307 ENDIF(DYNLOAD OR HAVE_LIBMPG123)
309 ELSE(NOT MPG123_FOUND)
311 INCLUDE_DIRECTORIES(${MPG123_INCLUDE_DIRS})
312 LINK_DIRECTORIES(${MPG123_LIBRARY_DIRS})
313 ENDIF(NOT MPG123_FOUND)
315 SET(MPG123_LIBRARIES "")
320 CHECK_INCLUDE_FILE(dumb.h HAVE_DUMB_H)
323 CHECK_SHARED_LIBRARY_EXISTS("dumb;m" dumbfile_open_ex "" HAVE_LIBDUMB)
325 CHECK_SHARED_LIBRARY_EXISTS(dumb dumbfile_open_ex "" HAVE_LIBDUMB)
327 IF(DYNLOAD OR HAVE_LIBDUMB)
330 SET(DUMB_LIBRARIES dumb)
332 ENDIF(DYNLOAD OR HAVE_LIBDUMB)
335 SET(DUMB_LIBRARIES "")
339 CHECK_FUNCTION_EXISTS(fork HAVE_FORK)
340 CHECK_FUNCTION_EXISTS(pipe HAVE_PIPE)
341 CHECK_FUNCTION_EXISTS(kill HAVE_KILL)
342 CHECK_FUNCTION_EXISTS(open HAVE_OPEN)
343 IF(WIN32 OR (HAVE_OPEN AND HAVE_KILL AND HAVE_PIPE AND HAVE_FORK))
345 ELSE(WIN32 OR (HAVE_OPEN AND HAVE_KILL AND HAVE_PIPE AND HAVE_FORK))
347 ENDIF(WIN32 OR (HAVE_OPEN AND HAVE_KILL AND HAVE_PIPE AND HAVE_FORK))
352 SET(EXTRA_LIBS ${SNDFILE_LIBRARIES} ${VORBISFILE_LIBRARIES} ${LIBFLAC_LIBRARIES} ${MPG123_LIBRARIES} ${DUMB_LIBRARIES} ${EXTRA_LIBS})
354 ADD_DEFINITIONS(-DDYNLOAD=1)
358 SET(prefix ${CMAKE_INSTALL_PREFIX})
359 SET(exec_prefix "\${prefix}")
360 SET(libdir "\${exec_prefix}/lib${LIB_SUFFIX}")
361 SET(bindir "\${exec_prefix}/bin")
362 SET(includedir "\${prefix}/include")
363 SET(PKG_CONFIG_REQUIRES openal)
364 SET(PACKAGE_VERSION "${LIB_VERSION}")
368 "${ALURE_SOURCE_DIR}/config.h.in"
369 "${ALURE_BINARY_DIR}/config.h")
371 "${ALURE_SOURCE_DIR}/alure.pc.in"
372 "${ALURE_BINARY_DIR}/alure.pc"
376 SET(ALURE_OBJS src/alure.cpp
385 #build a shared library
386 ADD_LIBRARY(${LIBNAME} SHARED ${ALURE_OBJS})
387 SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES VERSION ${LIB_VERSION}
388 SOVERSION ${LIB_MAJOR_VERSION})
390 SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES PREFIX "")
392 TARGET_LINK_LIBRARIES(${LIBNAME} ${OPENAL_LIBRARIES} ${EXTRA_LIBS})
394 INSTALL(TARGETS ${LIBNAME}
395 RUNTIME DESTINATION bin
396 LIBRARY DESTINATION lib${LIB_SUFFIX}
397 ARCHIVE DESTINATION lib${LIB_SUFFIX}
401 #build a static library
402 ADD_LIBRARY(${LIBNAME}-static STATIC ${ALURE_OBJS})
403 SET_TARGET_PROPERTIES(${LIBNAME}-static PROPERTIES COMPILE_FLAGS -DALURE_STATIC_LIBRARY
404 VERSION ${LIB_VERSION})
405 INSTALL(TARGETS ${LIBNAME}-static
406 RUNTIME DESTINATION bin
407 LIBRARY DESTINATION lib${LIB_SUFFIX}
408 ARCHIVE DESTINATION lib${LIB_SUFFIX}
413 ADD_EXECUTABLE(alureplay examples/alureplay.c)
414 ADD_EXECUTABLE(alurestream examples/alurestream.c)
416 TARGET_LINK_LIBRARIES(alureplay ${LIBNAME} ${OPENAL_LIBRARIES} ${EXTRA_LIBS})
417 TARGET_LINK_LIBRARIES(alurestream ${LIBNAME} ${OPENAL_LIBRARIES} ${EXTRA_LIBS})
419 TARGET_LINK_LIBRARIES(alureplay ${LIBNAME}-static ${OPENAL_LIBRARIES} ${EXTRA_LIBS})
420 TARGET_LINK_LIBRARIES(alurestream ${LIBNAME}-static ${OPENAL_LIBRARIES} ${EXTRA_LIBS})
424 FIND_PROGRAM(NATDOCS_BIN NaturalDocs)
426 ADD_CUSTOM_TARGET(docs
427 "${NATDOCS_BIN}" -i "${ALURE_SOURCE_DIR}/src" -o HTML "${ALURE_SOURCE_DIR}/docs/html" -p "${ALURE_SOURCE_DIR}/docs/naturaldocs" -s Default CustomStyle
428 COMMENT "Building NaturalDocs documentation..." VERBATIM)
430 MESSAGE(STATUS "\nNaturalDocs not found; building documentation is disabled")
434 #add an install target here
441 INSTALL(DIRECTORY "${ALURE_SOURCE_DIR}/docs/html"
442 DESTINATION share/doc/alure
444 INSTALL(FILES include/AL/alure.h
445 DESTINATION "include/${INCPATH}"
447 INSTALL(FILES "${ALURE_BINARY_DIR}/alure.pc"
448 DESTINATION "lib${LIB_SUFFIX}/pkgconfig"
452 MESSAGE(STATUS "\n********************** Configured options **********************")
453 IF(BUILD_SHARED AND BUILD_STATIC)
454 MESSAGE(STATUS "Building shared, static library")
456 MESSAGE(STATUS "Building shared library")
457 ELSE(BUILD_SHARED AND BUILD_STATIC)
458 MESSAGE(STATUS "Building static library")
459 ENDIF(BUILD_SHARED AND BUILD_STATIC)
462 MESSAGE(STATUS "SndFile support: enabled")
464 MESSAGE(STATUS "SndFile support: disabled")
467 MESSAGE(STATUS "VorbisFile support: enabled")
469 MESSAGE(STATUS "VorbisFile support: disabled")
470 ENDIF(HAS_VORBISFILE)
472 MESSAGE(STATUS "FLAC support: enabled")
474 MESSAGE(STATUS "FLAC support: disabled")
477 MESSAGE(STATUS "MPG123 support: enabled")
479 MESSAGE(STATUS "MPG123 support: disabled")
482 MESSAGE(STATUS "DUMB support: enabled")
484 MESSAGE(STATUS "DUMB support: disabled")
487 MESSAGE(STATUS "Timidity support: enabled")
489 MESSAGE(STATUS "Timidity support: disabled")