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 CHECK_SHARED_LIBRARY_EXISTS(stdc++ memset "" HAS_STDCXX)
59 SET(EXTRA_LIBS stdc++ ${EXTRA_LIBS})
62 CHECK_SHARED_LIBRARY_EXISTS(m pow "" HAS_LIBM)
64 SET(EXTRA_LIBS m ${EXTRA_LIBS})
67 CHECK_FILE_OFFSET_BITS()
69 ADD_DEFINITIONS(-D_FILE_OFFSET_BITS=${_FILE_OFFSET_BITS})
70 SET(CMAKE_REQUIRED_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS} -D_FILE_OFFSET_BITS=${_FILE_OFFSET_BITS})
71 ENDIF(_FILE_OFFSET_BITS)
73 CHECK_FUNCTION_EXISTS(fseeko HAVE_FSEEKO)
79 CHECK_C_SOURCE_COMPILES("int foo() __attribute__((constructor));
80 int main() {return 0;}" HAVE_GCC_CONSTRUCTOR)
82 CHECK_C_COMPILER_FLAG(-fvisibility=hidden HAVE_GCC_VISIBILITY)
83 IF(HAVE_GCC_VISIBILITY)
84 ADD_DEFINITIONS(-fvisibility=hidden)
85 ENDIF(HAVE_GCC_VISIBILITY)
88 CHECK_C_COMPILER_FLAG(-Wextra HAVE_WEXTRA)
90 ADD_DEFINITIONS(-Wextra)
92 ADD_DEFINITIONS(-Wall)
94 CHECK_C_COMPILER_FLAG(-funswitch-loops HAVE_FUNSWITCH_LOOPS)
95 IF(HAVE_FUNSWITCH_LOOPS)
96 ADD_DEFINITIONS(-funswitch-loops)
97 ENDIF(HAVE_FUNSWITCH_LOOPS)
101 CHECK_INCLUDE_FILE(windows.h HAVE_WINDOWS_H -D_WIN32_WINNT=0x0500)
102 IF(NOT HAVE_WINDOWS_H)
103 CHECK_C_COMPILER_FLAG(-pthread HAVE_PTHREAD)
105 ADD_DEFINITIONS(-pthread)
106 SET(EXTRA_LIBS ${EXTRA_LIBS} -pthread)
109 # We need pthreads outside of Windows
110 CHECK_INCLUDE_FILE(pthread.h HAVE_PTHREAD_H)
111 IF(NOT HAVE_PTHREAD_H)
112 MESSAGE(FATAL_ERROR "PThreads is required for non-Windows builds!")
114 # Some systems need pthread_np.h to get recursive mutexes
115 CHECK_INCLUDE_FILES("pthread.h;pthread_np.h" HAVE_PTHREAD_NP_H)
117 # _GNU_SOURCE is needed on some systems for extra attributes, and
118 # _REENTRANT is needed for libc thread-safety
119 ADD_DEFINITIONS(-D_GNU_SOURCE=1)
120 CHECK_FUNCTION_EXISTS(pthread_create HAS_PTHREAD_CREATE)
121 IF(NOT HAS_PTHREAD_CREATE)
122 CHECK_SHARED_LIBRARY_EXISTS(pthread pthread_create "" HAVE_LIBPTHREAD)
123 IF(NOT HAVE_LIBPTHREAD)
124 MESSAGE(FATAL_ERROR "pthread_create not found on non-Windows target!")
125 ENDIF(NOT HAVE_LIBPTHREAD)
126 SET(EXTRA_LIBS pthread ${EXTRA_LIBS})
127 ENDIF(NOT HAS_PTHREAD_CREATE)
129 CHECK_FUNCTION_EXISTS(nanosleep HAVE_NANOSLEEP)
130 IF(NOT HAVE_NANOSLEEP)
131 MESSAGE(FATAL_ERROR "No sleep function found!")
132 ENDIF(NOT HAVE_NANOSLEEP)
133 ENDIF(NOT HAVE_WINDOWS_H)
135 CHECK_INCLUDE_FILE(sys/types.h HAVE_SYS_TYPES_H)
136 CHECK_INCLUDE_FILE(sys/wait.h HAVE_SYS_WAIT_H)
137 CHECK_INCLUDE_FILE(signal.h HAVE_SIGNAL_H)
138 CHECK_INCLUDE_FILE(dlfcn.h HAVE_DLFCN_H)
141 CHECK_SHARED_LIBRARY_EXISTS(dl dlopen "" HAVE_LIBDL)
143 SET(EXTRA_LIBS dl ${EXTRA_LIBS})
147 OPTION(DYNLOAD "Dynamically load support libs at run-time" ON)
148 OPTION(SNDFILE "SoundFile support (for various formats)" ON)
149 OPTION(VORBIS "VorbisFile support (for Ogg Vorbis)" ON)
150 OPTION(FLAC "FLAC support (for FLAC and Ogg FLAC)" ON)
151 OPTION(MPG123 "MPG123 support (for MP1/MP2/MP3)" ON)
152 OPTION(DUMB "DUMB support (for IT/XM/S3M/MOD)" ON)
153 OPTION(FLUIDSYNTH "FluidSynth support (for MID)" ON)
156 ADD_DEFINITIONS(-D_WIN32)
158 IF(CMAKE_SIZEOF_VOID_P MATCHES "8")
161 ELSE(CMAKE_SIZEOF_VOID_P MATCHES "8")
164 ENDIF(CMAKE_SIZEOF_VOID_P MATCHES "8")
166 SET(OPENAL_SEARCH_PATHS
169 "C:/Program Files/OpenAL 1.1 SDK"
170 "C:/Program Files (x86)/OpenAL 1.1 SDK"
171 "E:/Programs/Dev/OpenAL"
172 "E:/Program Files (x86)/OpenAL 1.1 SDK" )
174 FIND_PATH(OPENAL_INCLUDE_DIR al.h
175 PATHS ${OPENAL_SEARCH_PATHS}
176 PATH_SUFFIXES include include/AL )
177 IF(OPENAL_INCLUDE_DIR)
178 INCLUDE_DIRECTORIES(${OPENAL_INCLUDE_DIR})
179 FIND_LIBRARY(OPENAL_LIBRARIES OpenAL32
180 PATHS ${OPENAL_SEARCH_PATHS}
181 PATH_SUFFIXES lib libs/${WIN_TYPE} )
182 ENDIF(OPENAL_INCLUDE_DIR)
184 IF(NOT OPENAL_LIBRARIES)
185 MESSAGE(FATAL_ERROR "OpenAL not found!\nPlease try setting the ALSDK_DIR environment variable and try again.")
186 ENDIF(NOT OPENAL_LIBRARIES)
188 MESSAGE(STATUS "OpenAL include: ${OPENAL_INCLUDE_DIR}")
189 MESSAGE(STATUS "OpenAL lib: ${OPENAL_LIBRARIES}")
191 IF(NOT HAVE_DLFCN_H OR NOT HAVE_LIBDL)
193 ENDIF(NOT HAVE_DLFCN_H OR NOT HAVE_LIBDL)
195 PKG_CHECK_MODULES(OPENAL openal)
198 CHECK_INCLUDE_FILE(OpenAL/al.h HAVE_OPENAL_AL_H)
200 SET(OPENAL_LIBRARIES "-framework OpenAL")
202 ENDIF(HAVE_OPENAL_AL_H)
204 CHECK_INCLUDE_FILE(AL/al.h HAVE_AL_AL_H)
206 CHECK_SHARED_LIBRARY_EXISTS(openal alcOpenDevice "" HAS_OPENAL)
208 SET(OPENAL_LIBRARIES openal)
213 MESSAGE(FATAL_ERROR "OpenAL not found!")
214 ENDIF(NOT HAS_OPENAL)
215 ELSE(NOT OPENAL_FOUND)
216 INCLUDE_DIRECTORIES(${OPENAL_INCLUDE_DIRS})
217 LINK_DIRECTORIES(${OPENAL_LIBRARY_DIRS})
218 ENDIF(NOT OPENAL_FOUND)
223 PKG_CHECK_MODULES(SNDFILE sndfile)
224 IF(NOT SNDFILE_FOUND)
225 CHECK_INCLUDE_FILE(sndfile.h HAVE_SNDFILE_H)
227 CHECK_SHARED_LIBRARY_EXISTS(sndfile sf_open "" HAVE_LIBSNDFILE)
228 CHECK_SHARED_LIBRARY_EXISTS(libsndfile-1 sf_open "" HAVE_LIBSNDFILE1)
229 IF(DYNLOAD OR HAVE_LIBSNDFILE OR HAVE_LIBSNDFILE1)
232 SET(SNDFILE_LIBRARIES "sndfile")
233 ELSEIF(HAVE_LIBSNDFILE1)
234 SET(SNDFILE_LIBRARIES "libsndfile-1")
235 ENDIF(HAVE_LIBSNDFILE)
236 ENDIF(DYNLOAD OR HAVE_LIBSNDFILE OR HAVE_LIBSNDFILE1)
237 ENDIF(HAVE_SNDFILE_H)
238 ELSE(NOT SNDFILE_FOUND)
240 INCLUDE_DIRECTORIES(${SNDFILE_INCLUDE_DIRS})
241 LINK_DIRECTORIES(${SNDFILE_LIBRARY_DIRS})
242 ENDIF(NOT SNDFILE_FOUND)
244 SET(SNDFILE_LIBRARIES "")
249 PKG_CHECK_MODULES(VORBISFILE vorbisfile)
250 IF(NOT VORBISFILE_FOUND)
251 CHECK_INCLUDE_FILE(vorbis/vorbisfile.h HAVE_VORBIS_VORBISFILE_H)
252 IF(HAVE_VORBIS_VORBISFILE_H)
253 CHECK_SHARED_LIBRARY_EXISTS(vorbisfile ov_open "" HAVE_LIBVORBISFILE)
254 IF(DYNLOAD OR HAVE_LIBVORBISFILE)
255 SET(HAS_VORBISFILE 1)
256 IF(HAVE_LIBVORBISFILE)
257 SET(VORBISFILE_LIBRARIES "vorbisfile")
258 ENDIF(HAVE_LIBVORBISFILE)
259 ENDIF(DYNLOAD OR HAVE_LIBVORBISFILE)
260 ENDIF(HAVE_VORBIS_VORBISFILE_H)
261 ELSE(NOT VORBISFILE_FOUND)
262 SET(HAS_VORBISFILE 1)
263 INCLUDE_DIRECTORIES(${VORBISFILE_INCLUDE_DIRS})
264 LINK_DIRECTORIES(${VORBISFILE_LIBRARY_DIRS})
265 ENDIF(NOT VORBISFILE_FOUND)
267 SET(VORBISFILE_LIBRARIES "")
272 #PKG_CHECK_MODULES(LIBFLAC flac)
273 #IF(NOT LIBFLAC_FOUND)
274 CHECK_INCLUDE_FILE(FLAC/all.h HAVE_FLAC_ALL_H)
276 CHECK_SHARED_LIBRARY_EXISTS(FLAC FLAC__stream_decoder_new "" HAVE_LIBFLAC)
277 IF(DYNLOAD OR HAVE_LIBFLAC)
280 SET(LIBFLAC_LIBRARIES "FLAC")
282 ENDIF(DYNLOAD OR HAVE_LIBFLAC)
283 ENDIF(HAVE_FLAC_ALL_H)
286 # INCLUDE_DIRECTORIES(${LIBFLAC_INCLUDE_DIRS})
287 # LINK_DIRECTORIES(${LIBFLAC_LIBRARY_DIRS})
288 #ENDIF(NOT LIBFLAC_FOUND)
290 SET(LIBFLAC_LIBRARIES "")
295 PKG_CHECK_MODULES(MPG123 libmpg123)
297 CHECK_INCLUDE_FILE(mpg123.h HAVE_MPG123_H)
299 CHECK_SHARED_LIBRARY_EXISTS(mpg123 mpg123_init "" HAVE_LIBMPG123)
300 IF(DYNLOAD OR HAVE_LIBMPG123)
303 SET(MPG123_LIBRARIES "mpg123")
304 ENDIF(HAVE_LIBMPG123)
305 ENDIF(DYNLOAD OR HAVE_LIBMPG123)
307 ELSE(NOT MPG123_FOUND)
309 INCLUDE_DIRECTORIES(${MPG123_INCLUDE_DIRS})
310 LINK_DIRECTORIES(${MPG123_LIBRARY_DIRS})
311 ENDIF(NOT MPG123_FOUND)
313 SET(MPG123_LIBRARIES "")
318 CHECK_INCLUDE_FILE(dumb.h HAVE_DUMB_H)
321 CHECK_LIBRARY_EXISTS("dumb;m" dumbfile_open_ex "" HAVE_LIBDUMB)
323 CHECK_LIBRARY_EXISTS(dumb dumbfile_open_ex "" HAVE_LIBDUMB)
325 IF(DYNLOAD OR HAVE_LIBDUMB)
328 SET(DUMB_LIBRARIES dumb)
330 ENDIF(DYNLOAD OR HAVE_LIBDUMB)
333 SET(DUMB_LIBRARIES "")
338 PKG_CHECK_MODULES(FLUIDSYNTH fluidsynth>=1.1.1)
339 IF(NOT FLUIDSYNTH_FOUND)
340 CHECK_INCLUDE_FILE(fluidsynth.h HAVE_FLUIDSYNTH_H)
341 IF(HAVE_FLUIDSYNTH_H)
342 CHECK_SHARED_LIBRARY_EXISTS(fluidsynth new_fluid_synth "" HAVE_LIBFLUIDSYNTH)
343 IF(DYNLOAD OR HAVE_LIBFLUIDSYNTH)
344 SET(HAS_FLUIDSYNTH 1)
345 IF(HAVE_LIBFLUIDSYNTH)
346 SET(FLUIDSYNTH_LIBRARIES "fluidsynth")
347 ENDIF(HAVE_LIBFLUIDSYNTH)
348 ENDIF(DYNLOAD OR HAVE_LIBFLUIDSYNTH)
349 ENDIF(HAVE_FLUIDSYNTH_H)
350 ELSE(NOT FLUIDSYNTH_FOUND)
351 SET(HAS_FLUIDSYNTH 1)
352 INCLUDE_DIRECTORIES(${FLUIDSYNTH_INCLUDE_DIRS})
353 LINK_DIRECTORIES(${FLUIDSYNTH_LIBRARY_DIRS})
354 ENDIF(NOT FLUIDSYNTH_FOUND)
356 SET(FLUIDSYNTH_LIBRARIES "")
361 SET(EXTRA_LIBS ${SNDFILE_LIBRARIES} ${VORBISFILE_LIBRARIES} ${LIBFLAC_LIBRARIES} ${MPG123_LIBRARIES} ${DUMB_LIBRARIES} ${FLUIDSYNTH_LIBRARIES} ${EXTRA_LIBS})
363 ADD_DEFINITIONS(-DDYNLOAD=1)
367 SET(prefix ${CMAKE_INSTALL_PREFIX})
368 SET(exec_prefix "\${prefix}")
369 SET(libdir "\${exec_prefix}/lib${LIB_SUFFIX}")
370 SET(bindir "\${exec_prefix}/bin")
371 SET(includedir "\${prefix}/include")
372 SET(PKG_CONFIG_REQUIRES openal)
373 SET(PACKAGE_VERSION "${LIB_VERSION}")
377 "${ALURE_SOURCE_DIR}/config.h.in"
378 "${ALURE_BINARY_DIR}/config.h")
380 "${ALURE_SOURCE_DIR}/alure.pc.in"
381 "${ALURE_BINARY_DIR}/alure.pc"
384 ADD_DEFINITIONS(-DHAVE_CONFIG_H)
387 SET(ALURE_OBJS src/alure.cpp
396 #build a shared library
397 ADD_LIBRARY(${LIBNAME} SHARED ${ALURE_OBJS})
398 SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES DEFINE_SYMBOL ALURE_BUILD_LIBRARY
399 VERSION ${LIB_VERSION}
400 SOVERSION ${LIB_MAJOR_VERSION})
402 SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES PREFIX "")
404 TARGET_LINK_LIBRARIES(${LIBNAME} ${OPENAL_LIBRARIES} ${EXTRA_LIBS})
406 INSTALL(TARGETS ${LIBNAME}
407 RUNTIME DESTINATION bin
408 LIBRARY DESTINATION lib${LIB_SUFFIX}
409 ARCHIVE DESTINATION lib${LIB_SUFFIX}
413 #build a static library
414 ADD_LIBRARY(${LIBNAME}-static STATIC ${ALURE_OBJS})
415 SET_TARGET_PROPERTIES(${LIBNAME}-static PROPERTIES DEFINE_SYMBOL ALURE_BUILD_LIBRARY
416 COMPILE_FLAGS -DALURE_STATIC_LIBRARY
417 VERSION ${LIB_VERSION})
418 INSTALL(TARGETS ${LIBNAME}-static
419 RUNTIME DESTINATION bin
420 LIBRARY DESTINATION lib${LIB_SUFFIX}
421 ARCHIVE DESTINATION lib${LIB_SUFFIX}
426 ADD_EXECUTABLE(alureplay examples/alureplay.c)
427 ADD_EXECUTABLE(alurestream examples/alurestream.c)
429 TARGET_LINK_LIBRARIES(alureplay ${LIBNAME} ${OPENAL_LIBRARIES} ${EXTRA_LIBS})
430 TARGET_LINK_LIBRARIES(alurestream ${LIBNAME} ${OPENAL_LIBRARIES} ${EXTRA_LIBS})
432 TARGET_LINK_LIBRARIES(alureplay ${LIBNAME}-static ${OPENAL_LIBRARIES} ${EXTRA_LIBS})
433 TARGET_LINK_LIBRARIES(alurestream ${LIBNAME}-static ${OPENAL_LIBRARIES} ${EXTRA_LIBS})
437 FIND_PROGRAM(NATDOCS_BIN NaturalDocs)
439 ADD_CUSTOM_TARGET(docs
440 "${NATDOCS_BIN}" -i "${ALURE_SOURCE_DIR}/src" -o HTML "${ALURE_SOURCE_DIR}/docs/html" -p "${ALURE_SOURCE_DIR}/docs/naturaldocs" -s Default CustomStyle
441 COMMENT "Building NaturalDocs documentation..." VERBATIM)
443 MESSAGE(STATUS "\nNaturalDocs not found; building documentation is disabled")
447 #add an install target here
454 INSTALL(DIRECTORY "${ALURE_SOURCE_DIR}/docs/html"
455 DESTINATION share/doc/alure
457 INSTALL(FILES include/AL/alure.h
458 DESTINATION "include/${INCPATH}"
460 INSTALL(FILES "${ALURE_BINARY_DIR}/alure.pc"
461 DESTINATION "lib${LIB_SUFFIX}/pkgconfig"
465 MESSAGE(STATUS "\n********************** Configured options **********************")
466 IF(BUILD_SHARED AND BUILD_STATIC)
467 MESSAGE(STATUS "Building shared, static library")
469 MESSAGE(STATUS "Building shared library")
470 ELSE(BUILD_SHARED AND BUILD_STATIC)
471 MESSAGE(STATUS "Building static library")
472 ENDIF(BUILD_SHARED AND BUILD_STATIC)
475 MESSAGE(STATUS "SndFile support: enabled")
477 MESSAGE(STATUS "SndFile support: disabled")
480 MESSAGE(STATUS "VorbisFile support: enabled")
482 MESSAGE(STATUS "VorbisFile support: disabled")
483 ENDIF(HAS_VORBISFILE)
485 MESSAGE(STATUS "FLAC support: enabled")
487 MESSAGE(STATUS "FLAC support: disabled")
490 MESSAGE(STATUS "MPG123 support: enabled")
492 MESSAGE(STATUS "MPG123 support: disabled")
495 MESSAGE(STATUS "DUMB support: enabled")
497 MESSAGE(STATUS "DUMB support: disabled")
500 MESSAGE(STATUS "FluidSynth support: enabled")
502 MESSAGE(STATUS "FluidSynth support: disabled")
503 ENDIF(HAS_FLUIDSYNTH)