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(MODPLUG "ModPlug support (for IT/XM/S3M/MOD)" OFF)
154 OPTION(FLUIDSYNTH "FluidSynth support (for MID)" ON)
157 ADD_DEFINITIONS(-D_WIN32)
159 IF(CMAKE_SIZEOF_VOID_P MATCHES "8")
162 ELSE(CMAKE_SIZEOF_VOID_P MATCHES "8")
165 ENDIF(CMAKE_SIZEOF_VOID_P MATCHES "8")
167 SET(OPENAL_SEARCH_PATHS
170 "C:/Program Files/OpenAL 1.1 SDK"
171 "C:/Program Files (x86)/OpenAL 1.1 SDK"
172 "E:/Programs/Dev/OpenAL"
173 "E:/Program Files (x86)/OpenAL 1.1 SDK" )
175 FIND_PATH(OPENAL_INCLUDE_DIR al.h
176 PATHS ${OPENAL_SEARCH_PATHS}
177 PATH_SUFFIXES include include/AL )
178 IF(OPENAL_INCLUDE_DIR)
179 INCLUDE_DIRECTORIES(${OPENAL_INCLUDE_DIR})
180 FIND_LIBRARY(OPENAL_LIBRARIES OpenAL32
181 PATHS ${OPENAL_SEARCH_PATHS}
182 PATH_SUFFIXES lib libs/${WIN_TYPE} )
183 ENDIF(OPENAL_INCLUDE_DIR)
185 IF(NOT OPENAL_LIBRARIES)
186 MESSAGE(FATAL_ERROR "OpenAL not found!\nPlease try setting the ALSDK_DIR environment variable and try again.")
187 ENDIF(NOT OPENAL_LIBRARIES)
189 MESSAGE(STATUS "OpenAL include: ${OPENAL_INCLUDE_DIR}")
190 MESSAGE(STATUS "OpenAL lib: ${OPENAL_LIBRARIES}")
192 IF(NOT HAVE_DLFCN_H OR NOT HAVE_LIBDL)
194 ENDIF(NOT HAVE_DLFCN_H OR NOT HAVE_LIBDL)
196 PKG_CHECK_MODULES(OPENAL openal)
199 CHECK_INCLUDE_FILE(OpenAL/al.h HAVE_OPENAL_AL_H)
201 SET(OPENAL_LIBRARIES "-framework OpenAL")
203 ENDIF(HAVE_OPENAL_AL_H)
205 CHECK_INCLUDE_FILE(AL/al.h HAVE_AL_AL_H)
207 CHECK_SHARED_LIBRARY_EXISTS(openal alcOpenDevice "" HAS_OPENAL)
209 SET(OPENAL_LIBRARIES openal)
214 MESSAGE(FATAL_ERROR "OpenAL not found!")
215 ENDIF(NOT HAS_OPENAL)
216 ELSE(NOT OPENAL_FOUND)
217 INCLUDE_DIRECTORIES(${OPENAL_INCLUDE_DIRS})
218 LINK_DIRECTORIES(${OPENAL_LIBRARY_DIRS})
219 ENDIF(NOT OPENAL_FOUND)
224 PKG_CHECK_MODULES(SNDFILE sndfile)
225 IF(NOT SNDFILE_FOUND)
226 CHECK_INCLUDE_FILE(sndfile.h HAVE_SNDFILE_H)
228 CHECK_SHARED_LIBRARY_EXISTS(sndfile sf_open "" HAVE_LIBSNDFILE)
229 CHECK_SHARED_LIBRARY_EXISTS(libsndfile-1 sf_open "" HAVE_LIBSNDFILE1)
230 IF(DYNLOAD OR HAVE_LIBSNDFILE OR HAVE_LIBSNDFILE1)
233 SET(SNDFILE_LIBRARIES "sndfile")
234 ELSEIF(HAVE_LIBSNDFILE1)
235 SET(SNDFILE_LIBRARIES "libsndfile-1")
236 ENDIF(HAVE_LIBSNDFILE)
237 ENDIF(DYNLOAD OR HAVE_LIBSNDFILE OR HAVE_LIBSNDFILE1)
238 ENDIF(HAVE_SNDFILE_H)
239 ELSE(NOT SNDFILE_FOUND)
241 INCLUDE_DIRECTORIES(${SNDFILE_INCLUDE_DIRS})
242 LINK_DIRECTORIES(${SNDFILE_LIBRARY_DIRS})
243 ENDIF(NOT SNDFILE_FOUND)
245 SET(SNDFILE_LIBRARIES "")
250 PKG_CHECK_MODULES(VORBISFILE vorbisfile)
251 IF(NOT VORBISFILE_FOUND)
252 CHECK_INCLUDE_FILE(vorbis/vorbisfile.h HAVE_VORBIS_VORBISFILE_H)
253 IF(HAVE_VORBIS_VORBISFILE_H)
254 CHECK_SHARED_LIBRARY_EXISTS(vorbisfile ov_open "" HAVE_LIBVORBISFILE)
255 IF(DYNLOAD OR HAVE_LIBVORBISFILE)
256 SET(HAS_VORBISFILE 1)
257 IF(HAVE_LIBVORBISFILE)
258 SET(VORBISFILE_LIBRARIES "vorbisfile")
259 ENDIF(HAVE_LIBVORBISFILE)
260 ENDIF(DYNLOAD OR HAVE_LIBVORBISFILE)
261 ENDIF(HAVE_VORBIS_VORBISFILE_H)
262 ELSE(NOT VORBISFILE_FOUND)
263 SET(HAS_VORBISFILE 1)
264 INCLUDE_DIRECTORIES(${VORBISFILE_INCLUDE_DIRS})
265 LINK_DIRECTORIES(${VORBISFILE_LIBRARY_DIRS})
266 ENDIF(NOT VORBISFILE_FOUND)
268 SET(VORBISFILE_LIBRARIES "")
273 #PKG_CHECK_MODULES(LIBFLAC flac)
274 #IF(NOT LIBFLAC_FOUND)
275 CHECK_INCLUDE_FILE(FLAC/all.h HAVE_FLAC_ALL_H)
277 CHECK_SHARED_LIBRARY_EXISTS(FLAC FLAC__stream_decoder_new "" HAVE_LIBFLAC)
278 IF(DYNLOAD OR HAVE_LIBFLAC)
281 SET(LIBFLAC_LIBRARIES "FLAC")
283 ENDIF(DYNLOAD OR HAVE_LIBFLAC)
284 ENDIF(HAVE_FLAC_ALL_H)
287 # INCLUDE_DIRECTORIES(${LIBFLAC_INCLUDE_DIRS})
288 # LINK_DIRECTORIES(${LIBFLAC_LIBRARY_DIRS})
289 #ENDIF(NOT LIBFLAC_FOUND)
291 SET(LIBFLAC_LIBRARIES "")
296 PKG_CHECK_MODULES(MPG123 libmpg123)
298 CHECK_INCLUDE_FILE(mpg123.h HAVE_MPG123_H)
300 CHECK_SHARED_LIBRARY_EXISTS(mpg123 mpg123_init "" HAVE_LIBMPG123)
301 IF(DYNLOAD OR HAVE_LIBMPG123)
304 SET(MPG123_LIBRARIES "mpg123")
305 ENDIF(HAVE_LIBMPG123)
306 ENDIF(DYNLOAD OR HAVE_LIBMPG123)
308 ELSE(NOT MPG123_FOUND)
310 INCLUDE_DIRECTORIES(${MPG123_INCLUDE_DIRS})
311 LINK_DIRECTORIES(${MPG123_LIBRARY_DIRS})
312 ENDIF(NOT MPG123_FOUND)
314 SET(MPG123_LIBRARIES "")
319 CHECK_INCLUDE_FILE(dumb.h HAVE_DUMB_H)
322 CHECK_LIBRARY_EXISTS("dumb;m" dumbfile_open_ex "" HAVE_LIBDUMB)
324 CHECK_LIBRARY_EXISTS(dumb dumbfile_open_ex "" HAVE_LIBDUMB)
326 IF(DYNLOAD OR HAVE_LIBDUMB)
329 SET(DUMB_LIBRARIES dumb)
331 ENDIF(DYNLOAD OR HAVE_LIBDUMB)
334 SET(DUMB_LIBRARIES "")
339 PKG_CHECK_MODULES(MODPLUG libmodplug)
340 IF(NOT MODPLUG_FOUND)
341 CHECK_INCLUDE_FILE(modplug.h HAVE_MODPLUG_H)
343 CHECK_SHARED_LIBRARY_EXISTS(modplug ModPlug_Load "" HAVE_LIBMODPLUG)
344 IF(DYNLOAD OR HAVE_LIBMODPLUG)
347 SET(MODPLUG_LIBRARIES "modplug")
348 ENDIF(HAVE_LIBMODPLUG)
349 ENDIF(DYNLOAD OR HAVE_LIBMODPLUG)
350 ENDIF(HAVE_MODPLUG_H)
351 ELSE(NOT MODPLUG_FOUND)
353 INCLUDE_DIRECTORIES(${MODPLUG_INCLUDE_DIRS})
354 LINK_DIRECTORIES(${MODPLUG_LIBRARY_DIRS})
355 ENDIF(NOT MODPLUG_FOUND)
357 SET(MODPLUG_LIBRARIES "")
362 PKG_CHECK_MODULES(FLUIDSYNTH fluidsynth>=1.1.1)
363 IF(NOT FLUIDSYNTH_FOUND)
364 CHECK_INCLUDE_FILE(fluidsynth.h HAVE_FLUIDSYNTH_H)
365 IF(HAVE_FLUIDSYNTH_H)
366 CHECK_SHARED_LIBRARY_EXISTS(fluidsynth new_fluid_synth "" HAVE_LIBFLUIDSYNTH)
367 IF(DYNLOAD OR HAVE_LIBFLUIDSYNTH)
368 SET(HAS_FLUIDSYNTH 1)
369 IF(HAVE_LIBFLUIDSYNTH)
370 SET(FLUIDSYNTH_LIBRARIES "fluidsynth")
371 ENDIF(HAVE_LIBFLUIDSYNTH)
372 ENDIF(DYNLOAD OR HAVE_LIBFLUIDSYNTH)
373 ENDIF(HAVE_FLUIDSYNTH_H)
374 ELSE(NOT FLUIDSYNTH_FOUND)
375 SET(HAS_FLUIDSYNTH 1)
376 INCLUDE_DIRECTORIES(${FLUIDSYNTH_INCLUDE_DIRS})
377 LINK_DIRECTORIES(${FLUIDSYNTH_LIBRARY_DIRS})
378 ENDIF(NOT FLUIDSYNTH_FOUND)
380 SET(FLUIDSYNTH_LIBRARIES "")
385 SET(EXTRA_LIBS ${SNDFILE_LIBRARIES} ${VORBISFILE_LIBRARIES} ${LIBFLAC_LIBRARIES} ${MPG123_LIBRARIES} ${DUMB_LIBRARIES} ${MODPLUG_LIBRARIES} ${FLUIDSYNTH_LIBRARIES} ${EXTRA_LIBS})
387 ADD_DEFINITIONS(-DDYNLOAD=1)
391 SET(prefix ${CMAKE_INSTALL_PREFIX})
392 SET(exec_prefix "\${prefix}")
393 SET(libdir "\${exec_prefix}/lib${LIB_SUFFIX}")
394 SET(bindir "\${exec_prefix}/bin")
395 SET(includedir "\${prefix}/include")
396 SET(PKG_CONFIG_REQUIRES openal)
397 SET(PACKAGE_VERSION "${LIB_VERSION}")
401 "${ALURE_SOURCE_DIR}/config.h.in"
402 "${ALURE_BINARY_DIR}/config.h")
405 "${ALURE_SOURCE_DIR}/alure.pc.in"
406 "${ALURE_BINARY_DIR}/alure.pc"
411 "${ALURE_SOURCE_DIR}/alure-static.pc.in"
412 "${ALURE_BINARY_DIR}/alure-static.pc"
416 ADD_DEFINITIONS(-DHAVE_CONFIG_H)
419 SET(ALURE_OBJS src/alure.cpp
428 #build a shared library
429 ADD_LIBRARY(${LIBNAME} SHARED ${ALURE_OBJS})
430 SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES DEFINE_SYMBOL ALURE_BUILD_LIBRARY
431 VERSION ${LIB_VERSION}
432 SOVERSION ${LIB_MAJOR_VERSION})
434 SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES PREFIX "")
436 TARGET_LINK_LIBRARIES(${LIBNAME} ${OPENAL_LIBRARIES} ${EXTRA_LIBS})
438 INSTALL(TARGETS ${LIBNAME}
439 RUNTIME DESTINATION bin
440 LIBRARY DESTINATION lib${LIB_SUFFIX}
441 ARCHIVE DESTINATION lib${LIB_SUFFIX}
445 #build a static library
446 ADD_LIBRARY(${LIBNAME}-static STATIC ${ALURE_OBJS})
447 SET_TARGET_PROPERTIES(${LIBNAME}-static PROPERTIES DEFINE_SYMBOL ALURE_BUILD_LIBRARY
448 COMPILE_FLAGS -DALURE_STATIC_LIBRARY
449 VERSION ${LIB_VERSION})
450 INSTALL(TARGETS ${LIBNAME}-static
451 RUNTIME DESTINATION bin
452 LIBRARY DESTINATION lib${LIB_SUFFIX}
453 ARCHIVE DESTINATION lib${LIB_SUFFIX}
458 ADD_EXECUTABLE(alureplay examples/alureplay.c)
459 ADD_EXECUTABLE(alurestream examples/alurestream.c)
461 TARGET_LINK_LIBRARIES(alureplay ${LIBNAME} ${OPENAL_LIBRARIES} ${EXTRA_LIBS})
462 TARGET_LINK_LIBRARIES(alurestream ${LIBNAME} ${OPENAL_LIBRARIES} ${EXTRA_LIBS})
464 TARGET_LINK_LIBRARIES(alureplay ${LIBNAME}-static ${OPENAL_LIBRARIES} ${EXTRA_LIBS})
465 TARGET_LINK_LIBRARIES(alurestream ${LIBNAME}-static ${OPENAL_LIBRARIES} ${EXTRA_LIBS})
469 FIND_PROGRAM(NATDOCS_BIN NaturalDocs)
471 ADD_CUSTOM_TARGET(docs
472 "${NATDOCS_BIN}" -i "${ALURE_SOURCE_DIR}/src" -o HTML "${ALURE_SOURCE_DIR}/docs/html" -p "${ALURE_SOURCE_DIR}/docs/naturaldocs" -s Default CustomStyle
473 COMMENT "Building NaturalDocs documentation..." VERBATIM)
475 MESSAGE(STATUS "\nNaturalDocs not found; building documentation is disabled")
479 #add an install target here
486 INSTALL(DIRECTORY "${ALURE_SOURCE_DIR}/docs/html"
487 DESTINATION share/doc/alure
489 INSTALL(FILES include/AL/alure.h
490 DESTINATION "include/${INCPATH}"
493 INSTALL(FILES "${ALURE_BINARY_DIR}/alure.pc"
494 DESTINATION "lib${LIB_SUFFIX}/pkgconfig"
498 INSTALL(FILES "${ALURE_BINARY_DIR}/alure-static.pc"
499 DESTINATION "lib${LIB_SUFFIX}/pkgconfig"
504 MESSAGE(STATUS "\n********************** Configured options **********************")
505 IF(BUILD_SHARED AND BUILD_STATIC)
506 MESSAGE(STATUS "Building shared, static library")
508 MESSAGE(STATUS "Building shared library")
509 ELSE(BUILD_SHARED AND BUILD_STATIC)
510 MESSAGE(STATUS "Building static library")
511 ENDIF(BUILD_SHARED AND BUILD_STATIC)
514 MESSAGE(STATUS "SndFile support: enabled")
516 MESSAGE(STATUS "SndFile support: disabled")
519 MESSAGE(STATUS "VorbisFile support: enabled")
521 MESSAGE(STATUS "VorbisFile support: disabled")
522 ENDIF(HAS_VORBISFILE)
524 MESSAGE(STATUS "FLAC support: enabled")
526 MESSAGE(STATUS "FLAC support: disabled")
529 MESSAGE(STATUS "MPG123 support: enabled")
531 MESSAGE(STATUS "MPG123 support: disabled")
534 MESSAGE(STATUS "DUMB support: enabled")
536 MESSAGE(STATUS "DUMB support: disabled")
539 MESSAGE(STATUS "ModPlug support: enabled")
541 MESSAGE(STATUS "ModPlug support: disabled")
544 MESSAGE(STATUS "FluidSynth support: enabled")
546 MESSAGE(STATUS "FluidSynth support: disabled")
547 ENDIF(HAS_FLUIDSYNTH)