summaryrefslogtreecommitdiff
path: root/Modules/FindSDL_sound.cmake
diff options
context:
space:
mode:
Diffstat (limited to 'Modules/FindSDL_sound.cmake')
-rw-r--r--Modules/FindSDL_sound.cmake401
1 files changed, 401 insertions, 0 deletions
diff --git a/Modules/FindSDL_sound.cmake b/Modules/FindSDL_sound.cmake
new file mode 100644
index 000000000..35294a5e4
--- /dev/null
+++ b/Modules/FindSDL_sound.cmake
@@ -0,0 +1,401 @@
+# Locates the SDL_sound library
+
+# This module depends on SDL being found and
+# must be called AFTER FindSDL.cmake is called.
+
+# This module defines
+# SDL_SOUND_INCLUDE_DIR, where to find SDL_sound.h
+# SDL_SOUND_FOUND, if false, do not try to link to SDL
+# SDL_SOUND_LIBRARIES, this contains the list of libraries that you need
+# to link against. This is a read-only variable and is marked INTERNAL.
+# SDL_SOUND_EXTRAS, this is an optional variable for you to add your own
+# flags to SDL_SOUND_LIBRARIES. This is prepended to SDL_SOUND_LIBRARIES.
+# This is available mostly for cases this module failed to anticipate for
+# and you must add additional flags. This is marked as ADVANCED.
+
+#
+# This module also defines (but you shouldn't need to use directly)
+# SDL_SOUND_LIBRARY, the name of just the SDL_sound library you would link
+# against. Use SDL_SOUND_LIBRARIES for you link instructions and not this one.
+# And might define the following as needed
+# MIKMOD_LIBRARY
+# MODPLUG_LIBRARY
+# OGG_LIBRARY
+# VORBIS_LIBRARY
+# SMPEG_LIBRARY
+# FLAC_LIBRARY
+# SPEEX_LIBRARY
+#
+# Typically, you should not use these variables directly, and you should use
+# SDL_SOUND_LIBRARIES which contains SDL_SOUND_LIBRARY and the other audio libraries
+# (if needed) to successfully compile on your system .
+#
+# Created by Eric Wing.
+# This module is a bit more complicated than the other FindSDL* family modules.
+# The reason is that SDL_sound can be compiled in a large variety of different ways
+# which are independent of platform. SDL_sound may dynamically link against other 3rd
+# party libraries to get additional codec support, such as Ogg Vorbis, SMPEG, ModPlug,
+# MikMod, FLAC, Speex, and potentially others.
+# Under some circumstances which I don't fully understand,
+# there seems to be a requirement
+# that dependent libraries of libraries you use must also be explicitly
+# linked against in order to successfully compile. SDL_sound does not currently
+# have any system in place to know how it was compiled.
+# So this CMake module does the hard work in trying to discover which 3rd party
+# libraries are required for building (if any).
+# This module uses a brute force approach to create a test program that uses SDL_sound,
+# and then tries to build it. If the build fails, it parses the error output for
+# known symbol names to figure out which libraries are needed.
+#
+# Responds to the $SDLDIR and $SDLSOUNDDIR environmental variable that would
+# correspond to the ./configure --prefix=$SDLDIR used in building SDL.
+#
+# On OSX, this will prefer the Framework version (if found) over others.
+# People will have to manually change the cache values of
+# SDL_LIBRARY to override this selectionor set the CMake environment
+# CMAKE_INCLUDE_PATH to modify the search paths.
+#
+
+#=============================================================================
+# Copyright 2005-2009 Kitware, Inc.
+#
+# Distributed under the OSI-approved BSD License (the "License");
+# see accompanying file Copyright.txt for details.
+#
+# This software is distributed WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the License for more information.
+#=============================================================================
+# (To distribute this file outside of CMake, substitute the full
+# License text for the above reference.)
+
+SET(SDL_SOUND_EXTRAS "" CACHE STRING "SDL_sound extra flags")
+MARK_AS_ADVANCED(SDL_SOUND_EXTRAS)
+
+# Find SDL_sound.h
+FIND_PATH(SDL_SOUND_INCLUDE_DIR SDL_sound.h
+ HINTS
+ $ENV{SDLSOUNDDIR}/include
+ $ENV{SDLSOUNDDIR}
+ $ENV{SDLDIR}/include
+ $ENV{SDLDIR}
+ PATHS
+ /usr/local/include/SDL
+ /usr/include/SDL
+ /usr/local/include/SDL12
+ /usr/local/include/SDL11 # FreeBSD ports
+ /usr/include/SDL12
+ /usr/include/SDL11
+ /sw/include/SDL # Fink
+ /sw/include
+ /opt/local/include/SDL # DarwinPorts
+ /opt/local/include
+ /opt/csw/include/SDL # Blastwave
+ /opt/csw/include
+ /opt/include/SDL
+ /opt/include
+ )
+
+FIND_LIBRARY(SDL_SOUND_LIBRARY
+ NAMES SDL_sound
+ HINTS
+ $ENV{SDLSOUNDDIR}/lib
+ $ENV{SDLSOUNDDIR}
+ $ENV{SDLDIR}/lib
+ $ENV{SDLDIR}
+ PATHS
+ /sw/lib
+ /opt/local/lib
+ /opt/csw/lib
+ /opt/lib
+ )
+
+IF(SDL_FOUND AND SDL_SOUND_INCLUDE_DIR AND SDL_SOUND_LIBRARY)
+
+ # CMake is giving me problems using TRY_COMPILE with the CMAKE_FLAGS
+ # for the :STRING syntax if I have multiple values contained in a
+ # single variable. This is a problem for the SDL_LIBRARY variable
+ # because it does just that. When I feed this variable to the command,
+ # only the first value gets the appropriate modifier (e.g. -I) and
+ # the rest get dropped.
+ # To get multiple single variables to work, I must separate them with a "\;"
+ # I could go back and modify the FindSDL.cmake module, but that's kind of painful.
+ # The solution would be to try something like:
+ # SET(SDL_TRY_COMPILE_LIBRARY_LIST "${SDL_TRY_COMPILE_LIBRARY_LIST}\;${CMAKE_THREAD_LIBS_INIT}")
+ # Instead, it was suggested on the mailing list to write a temporary CMakeLists.txt
+ # with a temporary test project and invoke that with TRY_COMPILE.
+ # See message thread "Figuring out dependencies for a library in order to build"
+ # 2005-07-16
+ # TRY_COMPILE(
+ # MY_RESULT
+ # ${CMAKE_BINARY_DIR}
+ # ${PROJECT_SOURCE_DIR}/DetermineSoundLibs.c
+ # CMAKE_FLAGS
+ # -DINCLUDE_DIRECTORIES:STRING=${SDL_INCLUDE_DIR}\;${SDL_SOUND_INCLUDE_DIR}
+ # -DLINK_LIBRARIES:STRING=${SDL_SOUND_LIBRARY}\;${SDL_LIBRARY}
+ # OUTPUT_VARIABLE MY_OUTPUT
+ # )
+
+ # To minimize external dependencies, create a sdlsound test program
+ # which will be used to figure out if additional link dependencies are
+ # required for the link phase.
+ FILE(WRITE ${PROJECT_BINARY_DIR}/CMakeTmp/DetermineSoundLibs.c
+ "#include \"SDL_sound.h\"
+ #include \"SDL.h\"
+ int main(int argc, char* argv[])
+ {
+ Sound_AudioInfo desired;
+ Sound_Sample* sample;
+
+ SDL_Init(0);
+ Sound_Init();
+
+ /* This doesn't actually have to work, but Init() is a no-op
+ * for some of the decoders, so this should force more symbols
+ * to be pulled in.
+ */
+ sample = Sound_NewSampleFromFile(argv[1], &desired, 4096);
+
+ Sound_Quit();
+ SDL_Quit();
+ return 0;
+ }"
+ )
+
+ # Calling
+ # TARGET_LINK_LIBRARIES(DetermineSoundLibs "${SDL_SOUND_LIBRARY} ${SDL_LIBRARY})
+ # causes problems when SDL_LIBRARY looks like
+ # /Library/Frameworks/SDL.framework;-framework Cocoa
+ # The ;-framework Cocoa seems to be confusing CMake once the OS X
+ # framework support was added. I was told that breaking up the list
+ # would fix the problem.
+ SET(TMP_TRY_LIBS)
+ FOREACH(lib ${SDL_SOUND_LIBRARY} ${SDL_LIBRARY})
+ SET(TMP_TRY_LIBS "${TMP_TRY_LIBS} \"${lib}\"")
+ ENDFOREACH(lib)
+
+ # MESSAGE("TMP_TRY_LIBS ${TMP_TRY_LIBS}")
+
+ # Write the CMakeLists.txt and test project
+ # Weird, this is still sketchy. If I don't quote the variables
+ # in the TARGET_LINK_LIBRARIES, I seem to loose everything
+ # in the SDL_LIBRARY string after the "-framework".
+ # But if I quote the stuff in INCLUDE_DIRECTORIES, it doesn't work.
+ FILE(WRITE ${PROJECT_BINARY_DIR}/CMakeTmp/CMakeLists.txt
+ "PROJECT(DetermineSoundLibs)
+ INCLUDE_DIRECTORIES(${SDL_INCLUDE_DIR} ${SDL_SOUND_INCLUDE_DIR})
+ ADD_EXECUTABLE(DetermineSoundLibs DetermineSoundLibs.c)
+ TARGET_LINK_LIBRARIES(DetermineSoundLibs ${TMP_TRY_LIBS})"
+ )
+
+ TRY_COMPILE(
+ MY_RESULT
+ ${PROJECT_BINARY_DIR}/CMakeTmp
+ ${PROJECT_BINARY_DIR}/CMakeTmp
+ DetermineSoundLibs
+ OUTPUT_VARIABLE MY_OUTPUT
+ )
+
+ # MESSAGE("${MY_RESULT}")
+ # MESSAGE(${MY_OUTPUT})
+
+ IF(NOT MY_RESULT)
+
+ # I expect that MPGLIB, VOC, WAV, AIFF, and SHN are compiled in statically.
+ # I think Timidity is also compiled in statically.
+ # I've never had to explcitly link against Quicktime, so I'll skip that for now.
+
+ SET(SDL_SOUND_LIBRARIES_TMP ${SDL_SOUND_LIBRARY})
+
+ # Find MikMod
+ IF("${MY_OUTPUT}" MATCHES "MikMod_")
+ FIND_LIBRARY(MIKMOD_LIBRARY
+ NAMES libmikmod-coreaudio mikmod
+ PATHS
+ $ENV{MIKMODDIR}/lib
+ $ENV{MIKMODDIR}
+ $ENV{SDLSOUNDDIR}/lib
+ $ENV{SDLSOUNDDIR}
+ $ENV{SDLDIR}/lib
+ $ENV{SDLDIR}
+ /sw/lib
+ /opt/local/lib
+ /opt/csw/lib
+ /opt/lib
+ )
+ IF(MIKMOD_LIBRARY)
+ SET(SDL_SOUND_LIBRARIES_TMP ${SDL_SOUND_LIBRARIES_TMP} ${MIKMOD_LIBRARY})
+ ENDIF(MIKMOD_LIBRARY)
+ ENDIF("${MY_OUTPUT}" MATCHES "MikMod_")
+
+ # Find ModPlug
+ IF("${MY_OUTPUT}" MATCHES "MODPLUG_")
+ FIND_LIBRARY(MODPLUG_LIBRARY
+ NAMES modplug
+ PATHS
+ $ENV{MODPLUGDIR}/lib
+ $ENV{MODPLUGDIR}
+ $ENV{SDLSOUNDDIR}/lib
+ $ENV{SDLSOUNDDIR}
+ $ENV{SDLDIR}/lib
+ $ENV{SDLDIR}
+ /sw/lib
+ /opt/local/lib
+ /opt/csw/lib
+ /opt/lib
+ )
+ IF(MODPLUG_LIBRARY)
+ SET(SDL_SOUND_LIBRARIES_TMP ${SDL_SOUND_LIBRARIES_TMP} ${MODPLUG_LIBRARY})
+ ENDIF(MODPLUG_LIBRARY)
+ ENDIF("${MY_OUTPUT}" MATCHES "MODPLUG_")
+
+
+ # Find Ogg and Vorbis
+ IF("${MY_OUTPUT}" MATCHES "ov_")
+ FIND_LIBRARY(VORBIS_LIBRARY
+ NAMES vorbis Vorbis VORBIS
+ PATHS
+ $ENV{VORBISDIR}/lib
+ $ENV{VORBISDIR}
+ $ENV{OGGDIR}/lib
+ $ENV{OGGDIR}
+ $ENV{SDLSOUNDDIR}/lib
+ $ENV{SDLSOUNDDIR}
+ $ENV{SDLDIR}/lib
+ $ENV{SDLDIR}
+ /sw/lib
+ /opt/local/lib
+ /opt/csw/lib
+ /opt/lib
+ )
+ IF(VORBIS_LIBRARY)
+ SET(SDL_SOUND_LIBRARIES_TMP ${SDL_SOUND_LIBRARIES_TMP} ${VORBIS_LIBRARY})
+ ENDIF(VORBIS_LIBRARY)
+
+ FIND_LIBRARY(OGG_LIBRARY
+ NAMES ogg Ogg OGG
+ PATHS
+ $ENV{OGGDIR}/lib
+ $ENV{OGGDIR}
+ $ENV{VORBISDIR}/lib
+ $ENV{VORBISDIR}
+ $ENV{SDLSOUNDDIR}/lib
+ $ENV{SDLSOUNDDIR}
+ $ENV{SDLDIR}/lib
+ $ENV{SDLDIR}
+ /sw/lib
+ /opt/local/lib
+ /opt/csw/lib
+ /opt/lib
+ )
+ IF(OGG_LIBRARY)
+ SET(SDL_SOUND_LIBRARIES_TMP ${SDL_SOUND_LIBRARIES_TMP} ${OGG_LIBRARY})
+ ENDIF(OGG_LIBRARY)
+ ENDIF("${MY_OUTPUT}" MATCHES "ov_")
+
+
+ # Find SMPEG
+ IF("${MY_OUTPUT}" MATCHES "SMPEG_")
+ FIND_LIBRARY(SMPEG_LIBRARY
+ NAMES smpeg SMPEG Smpeg SMpeg
+ PATHS
+ $ENV{SMPEGDIR}/lib
+ $ENV{SMPEGDIR}
+ $ENV{SDLSOUNDDIR}/lib
+ $ENV{SDLSOUNDDIR}
+ $ENV{SDLDIR}/lib
+ $ENV{SDLDIR}
+ /sw/lib
+ /opt/local/lib
+ /opt/csw/lib
+ /opt/lib
+ )
+ IF(SMPEG_LIBRARY)
+ SET(SDL_SOUND_LIBRARIES_TMP ${SDL_SOUND_LIBRARIES_TMP} ${SMPEG_LIBRARY})
+ ENDIF(SMPEG_LIBRARY)
+ ENDIF("${MY_OUTPUT}" MATCHES "SMPEG_")
+
+
+ # Find FLAC
+ IF("${MY_OUTPUT}" MATCHES "FLAC_")
+ FIND_LIBRARY(FLAC_LIBRARY
+ NAMES flac FLAC
+ PATHS
+ $ENV{FLACDIR}/lib
+ $ENV{FLACDIR}
+ $ENV{SDLSOUNDDIR}/lib
+ $ENV{SDLSOUNDDIR}
+ $ENV{SDLDIR}/lib
+ $ENV{SDLDIR}
+ /sw/lib
+ /opt/local/lib
+ /opt/csw/lib
+ /opt/lib
+ )
+ IF(FLAC_LIBRARY)
+ SET(SDL_SOUND_LIBRARIES_TMP ${SDL_SOUND_LIBRARIES_TMP} ${FLAC_LIBRARY})
+ ENDIF(FLAC_LIBRARY)
+ ENDIF("${MY_OUTPUT}" MATCHES "FLAC_")
+
+
+ # Hmmm...Speex seems to depend on Ogg. This might be a problem if
+ # the TRY_COMPILE attempt gets blocked at SPEEX before it can pull
+ # in the Ogg symbols. I'm not sure if I should duplicate the ogg stuff
+ # above for here or if two ogg entries will screw up things.
+ IF("${MY_OUTPUT}" MATCHES "speex_")
+ FIND_LIBRARY(SPEEX_LIBRARY
+ NAMES speex SPEEX
+ PATHS
+ $ENV{SPEEXDIR}/lib
+ $ENV{SPEEXDIR}
+ $ENV{SDLSOUNDDIR}/lib
+ $ENV{SDLSOUNDDIR}
+ $ENV{SDLDIR}/lib
+ $ENV{SDLDIR}
+ /sw/lib
+ /opt/local/lib
+ /opt/csw/lib
+ /opt/lib
+ )
+ IF(SPEEX_LIBRARY)
+ SET(SDL_SOUND_LIBRARIES_TMP ${SDL_SOUND_LIBRARIES_TMP} ${SPEEX_LIBRARY})
+ ENDIF(SPEEX_LIBRARY)
+
+ # Find OGG (needed for Speex)
+ # We might have already found Ogg for Vorbis, so skip it if so.
+ IF(NOT OGG_LIBRARY)
+ FIND_LIBRARY(OGG_LIBRARY
+ NAMES ogg Ogg OGG
+ PATHS
+ $ENV{OGGDIR}/lib
+ $ENV{OGGDIR}
+ $ENV{VORBISDIR}/lib
+ $ENV{VORBISDIR}
+ $ENV{SPEEXDIR}/lib
+ $ENV{SPEEXDIR}
+ $ENV{SDLSOUNDDIR}/lib
+ $ENV{SDLSOUNDDIR}
+ $ENV{SDLDIR}/lib
+ $ENV{SDLDIR}
+ /sw/lib
+ /opt/local/lib
+ /opt/csw/lib
+ /opt/lib
+ )
+ IF(OGG_LIBRARY)
+ SET(SDL_SOUND_LIBRARIES_TMP ${SDL_SOUND_LIBRARIES_TMP} ${OGG_LIBRARY})
+ ENDIF(OGG_LIBRARY)
+ ENDIF(NOT OGG_LIBRARY)
+ ENDIF("${MY_OUTPUT}" MATCHES "speex_")
+
+ ELSE(NOT MY_RESULT)
+ SET(SDL_SOUND_LIBRARIES "${SDL_SOUND_EXTRAS} ${SDL_SOUND_LIBRARY}" CACHE INTERNAL "SDL_sound and dependent libraries")
+ ENDIF(NOT MY_RESULT)
+
+ SET(SDL_SOUND_LIBRARIES "${SDL_SOUND_EXTRAS} ${SDL_SOUND_LIBRARIES_TMP}" CACHE INTERNAL "SDL_sound and dependent libraries")
+ ENDIF(SDL_FOUND AND SDL_SOUND_INCLUDE_DIR AND SDL_SOUND_LIBRARY)
+
+INCLUDE(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake)
+
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(SDL_SOUND
+ REQUIRED_VARS SDL_SOUND_LIBRARIES SDL_SOUND_INCLUDE_DIR)