FindSDL_sound.cmake 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382
  1. # - Locates the SDL_sound library
  2. #
  3. # This module depends on SDL being found and
  4. # must be called AFTER FindSDL.cmake is called.
  5. #
  6. # This module defines
  7. # SDL_SOUND_INCLUDE_DIR, where to find SDL_sound.h
  8. # SDL_SOUND_FOUND, if false, do not try to link to SDL_sound
  9. # SDL_SOUND_LIBRARIES, this contains the list of libraries that you need
  10. # to link against. This is a read-only variable and is marked INTERNAL.
  11. # SDL_SOUND_EXTRAS, this is an optional variable for you to add your own
  12. # flags to SDL_SOUND_LIBRARIES. This is prepended to SDL_SOUND_LIBRARIES.
  13. # This is available mostly for cases this module failed to anticipate for
  14. # and you must add additional flags. This is marked as ADVANCED.
  15. # SDL_SOUND_VERSION_STRING, human-readable string containing the version of SDL_sound
  16. #
  17. # This module also defines (but you shouldn't need to use directly)
  18. # SDL_SOUND_LIBRARY, the name of just the SDL_sound library you would link
  19. # against. Use SDL_SOUND_LIBRARIES for you link instructions and not this one.
  20. # And might define the following as needed
  21. # MIKMOD_LIBRARY
  22. # MODPLUG_LIBRARY
  23. # OGG_LIBRARY
  24. # VORBIS_LIBRARY
  25. # SMPEG_LIBRARY
  26. # FLAC_LIBRARY
  27. # SPEEX_LIBRARY
  28. #
  29. # Typically, you should not use these variables directly, and you should use
  30. # SDL_SOUND_LIBRARIES which contains SDL_SOUND_LIBRARY and the other audio libraries
  31. # (if needed) to successfully compile on your system.
  32. #
  33. # Created by Eric Wing.
  34. # This module is a bit more complicated than the other FindSDL* family modules.
  35. # The reason is that SDL_sound can be compiled in a large variety of different ways
  36. # which are independent of platform. SDL_sound may dynamically link against other 3rd
  37. # party libraries to get additional codec support, such as Ogg Vorbis, SMPEG, ModPlug,
  38. # MikMod, FLAC, Speex, and potentially others.
  39. # Under some circumstances which I don't fully understand,
  40. # there seems to be a requirement
  41. # that dependent libraries of libraries you use must also be explicitly
  42. # linked against in order to successfully compile. SDL_sound does not currently
  43. # have any system in place to know how it was compiled.
  44. # So this CMake module does the hard work in trying to discover which 3rd party
  45. # libraries are required for building (if any).
  46. # This module uses a brute force approach to create a test program that uses SDL_sound,
  47. # and then tries to build it. If the build fails, it parses the error output for
  48. # known symbol names to figure out which libraries are needed.
  49. #
  50. # Responds to the $SDLDIR and $SDLSOUNDDIR environmental variable that would
  51. # correspond to the ./configure --prefix=$SDLDIR used in building SDL.
  52. #
  53. # On OSX, this will prefer the Framework version (if found) over others.
  54. # People will have to manually change the cache values of
  55. # SDL_LIBRARY to override this selectionor set the CMake environment
  56. # CMAKE_INCLUDE_PATH to modify the search paths.
  57. #=============================================================================
  58. # Copyright 2005-2009 Kitware, Inc.
  59. # Copyright 2012 Benjamin Eikel
  60. #
  61. # Distributed under the OSI-approved BSD License (the "License");
  62. # see accompanying file Copyright.txt for details.
  63. #
  64. # This software is distributed WITHOUT ANY WARRANTY; without even the
  65. # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  66. # See the License for more information.
  67. #=============================================================================
  68. # (To distribute this file outside of CMake, substitute the full
  69. # License text for the above reference.)
  70. set(SDL_SOUND_EXTRAS "" CACHE STRING "SDL_sound extra flags")
  71. mark_as_advanced(SDL_SOUND_EXTRAS)
  72. # Find SDL_sound.h
  73. find_path(SDL_SOUND_INCLUDE_DIR SDL_sound.h
  74. HINTS
  75. ENV SDLSOUNDDIR
  76. ENV SDLDIR
  77. PATH_SUFFIXES SDL SDL12 SDL11
  78. )
  79. find_library(SDL_SOUND_LIBRARY
  80. NAMES SDL_sound
  81. HINTS
  82. ENV SDLSOUNDDIR
  83. ENV SDLDIR
  84. )
  85. if(SDL_FOUND AND SDL_SOUND_INCLUDE_DIR AND SDL_SOUND_LIBRARY)
  86. # CMake is giving me problems using TRY_COMPILE with the CMAKE_FLAGS
  87. # for the :STRING syntax if I have multiple values contained in a
  88. # single variable. This is a problem for the SDL_LIBRARY variable
  89. # because it does just that. When I feed this variable to the command,
  90. # only the first value gets the appropriate modifier (e.g. -I) and
  91. # the rest get dropped.
  92. # To get multiple single variables to work, I must separate them with a "\;"
  93. # I could go back and modify the FindSDL.cmake module, but that's kind of painful.
  94. # The solution would be to try something like:
  95. # set(SDL_TRY_COMPILE_LIBRARY_LIST "${SDL_TRY_COMPILE_LIBRARY_LIST}\;${CMAKE_THREAD_LIBS_INIT}")
  96. # Instead, it was suggested on the mailing list to write a temporary CMakeLists.txt
  97. # with a temporary test project and invoke that with TRY_COMPILE.
  98. # See message thread "Figuring out dependencies for a library in order to build"
  99. # 2005-07-16
  100. # try_compile(
  101. # MY_RESULT
  102. # ${CMAKE_BINARY_DIR}
  103. # ${PROJECT_SOURCE_DIR}/DetermineSoundLibs.c
  104. # CMAKE_FLAGS
  105. # -DINCLUDE_DIRECTORIES:STRING=${SDL_INCLUDE_DIR}\;${SDL_SOUND_INCLUDE_DIR}
  106. # -DLINK_LIBRARIES:STRING=${SDL_SOUND_LIBRARY}\;${SDL_LIBRARY}
  107. # OUTPUT_VARIABLE MY_OUTPUT
  108. # )
  109. # To minimize external dependencies, create a sdlsound test program
  110. # which will be used to figure out if additional link dependencies are
  111. # required for the link phase.
  112. file(WRITE ${PROJECT_BINARY_DIR}/CMakeTmp/DetermineSoundLibs.c
  113. "#include \"SDL_sound.h\"
  114. #include \"SDL.h\"
  115. int main(int argc, char* argv[])
  116. {
  117. Sound_AudioInfo desired;
  118. Sound_Sample* sample;
  119. SDL_Init(0);
  120. Sound_Init();
  121. /* This doesn't actually have to work, but Init() is a no-op
  122. * for some of the decoders, so this should force more symbols
  123. * to be pulled in.
  124. */
  125. sample = Sound_NewSampleFromFile(argv[1], &desired, 4096);
  126. Sound_Quit();
  127. SDL_Quit();
  128. return 0;
  129. }"
  130. )
  131. # Calling
  132. # target_link_libraries(DetermineSoundLibs "${SDL_SOUND_LIBRARY} ${SDL_LIBRARY})
  133. # causes problems when SDL_LIBRARY looks like
  134. # /Library/Frameworks/SDL.framework;-framework Cocoa
  135. # The ;-framework Cocoa seems to be confusing CMake once the OS X
  136. # framework support was added. I was told that breaking up the list
  137. # would fix the problem.
  138. set(TMP_TRY_LIBS)
  139. foreach(lib ${SDL_SOUND_LIBRARY} ${SDL_LIBRARY})
  140. set(TMP_TRY_LIBS "${TMP_TRY_LIBS} \"${lib}\"")
  141. endforeach()
  142. # message("TMP_TRY_LIBS ${TMP_TRY_LIBS}")
  143. # Write the CMakeLists.txt and test project
  144. # Weird, this is still sketchy. If I don't quote the variables
  145. # in the TARGET_LINK_LIBRARIES, I seem to loose everything
  146. # in the SDL_LIBRARY string after the "-framework".
  147. # But if I quote the stuff in INCLUDE_DIRECTORIES, it doesn't work.
  148. file(WRITE ${PROJECT_BINARY_DIR}/CMakeTmp/CMakeLists.txt
  149. "cmake_minimum_required(VERSION 2.8)
  150. project(DetermineSoundLibs C)
  151. include_directories(${SDL_INCLUDE_DIR} ${SDL_SOUND_INCLUDE_DIR})
  152. add_executable(DetermineSoundLibs DetermineSoundLibs.c)
  153. target_link_libraries(DetermineSoundLibs ${TMP_TRY_LIBS})"
  154. )
  155. try_compile(
  156. MY_RESULT
  157. ${PROJECT_BINARY_DIR}/CMakeTmp
  158. ${PROJECT_BINARY_DIR}/CMakeTmp
  159. DetermineSoundLibs
  160. OUTPUT_VARIABLE MY_OUTPUT
  161. )
  162. # message("${MY_RESULT}")
  163. # message(${MY_OUTPUT})
  164. if(NOT MY_RESULT)
  165. # I expect that MPGLIB, VOC, WAV, AIFF, and SHN are compiled in statically.
  166. # I think Timidity is also compiled in statically.
  167. # I've never had to explcitly link against Quicktime, so I'll skip that for now.
  168. set(SDL_SOUND_LIBRARIES_TMP ${SDL_SOUND_LIBRARY})
  169. # Find MikMod
  170. if("${MY_OUTPUT}" MATCHES "MikMod_")
  171. find_library(MIKMOD_LIBRARY
  172. NAMES libmikmod-coreaudio mikmod
  173. PATHS
  174. ENV MIKMODDIR
  175. ENV SDLSOUNDDIR
  176. ENV SDLDIR
  177. /sw
  178. /opt/local
  179. /opt/csw
  180. /opt
  181. PATH_SUFFIXES
  182. lib
  183. )
  184. if(MIKMOD_LIBRARY)
  185. set(SDL_SOUND_LIBRARIES_TMP ${SDL_SOUND_LIBRARIES_TMP} ${MIKMOD_LIBRARY})
  186. endif(MIKMOD_LIBRARY)
  187. endif("${MY_OUTPUT}" MATCHES "MikMod_")
  188. # Find ModPlug
  189. if("${MY_OUTPUT}" MATCHES "MODPLUG_")
  190. find_library(MODPLUG_LIBRARY
  191. NAMES modplug
  192. PATHS
  193. ENV MODPLUGDIR
  194. ENV SDLSOUNDDIR
  195. ENV SDLDIR
  196. /sw
  197. /opt/local
  198. /opt/csw
  199. /opt
  200. PATH_SUFFIXES
  201. lib
  202. )
  203. if(MODPLUG_LIBRARY)
  204. set(SDL_SOUND_LIBRARIES_TMP ${SDL_SOUND_LIBRARIES_TMP} ${MODPLUG_LIBRARY})
  205. endif()
  206. endif()
  207. # Find Ogg and Vorbis
  208. if("${MY_OUTPUT}" MATCHES "ov_")
  209. find_library(VORBIS_LIBRARY
  210. NAMES vorbis Vorbis VORBIS
  211. PATHS
  212. ENV VORBISDIR
  213. ENV OGGDIR
  214. ENV SDLSOUNDDIR
  215. ENV SDLDIR
  216. /sw
  217. /opt/local
  218. /opt/csw
  219. /opt
  220. PATH_SUFFIXES
  221. lib
  222. )
  223. if(VORBIS_LIBRARY)
  224. set(SDL_SOUND_LIBRARIES_TMP ${SDL_SOUND_LIBRARIES_TMP} ${VORBIS_LIBRARY})
  225. endif()
  226. find_library(OGG_LIBRARY
  227. NAMES ogg Ogg OGG
  228. PATHS
  229. ENV OGGDIR
  230. ENV VORBISDIR
  231. ENV SDLSOUNDDIR
  232. ENV SDLDIR
  233. /sw
  234. /opt/local
  235. /opt/csw
  236. /opt
  237. PATH_SUFFIXES
  238. lib
  239. )
  240. if(OGG_LIBRARY)
  241. set(SDL_SOUND_LIBRARIES_TMP ${SDL_SOUND_LIBRARIES_TMP} ${OGG_LIBRARY})
  242. endif()
  243. endif()
  244. # Find SMPEG
  245. if("${MY_OUTPUT}" MATCHES "SMPEG_")
  246. find_library(SMPEG_LIBRARY
  247. NAMES smpeg SMPEG Smpeg SMpeg
  248. PATHS
  249. ENV SMPEGDIR
  250. ENV SDLSOUNDDIR
  251. ENV SDLDIR
  252. /sw
  253. /opt/local
  254. /opt/csw
  255. /opt
  256. PATH_SUFFIXES
  257. lib
  258. )
  259. if(SMPEG_LIBRARY)
  260. set(SDL_SOUND_LIBRARIES_TMP ${SDL_SOUND_LIBRARIES_TMP} ${SMPEG_LIBRARY})
  261. endif()
  262. endif()
  263. # Find FLAC
  264. if("${MY_OUTPUT}" MATCHES "FLAC_")
  265. find_library(FLAC_LIBRARY
  266. NAMES flac FLAC
  267. PATHS
  268. ENV FLACDIR
  269. ENV SDLSOUNDDIR
  270. ENV SDLDIR
  271. /sw
  272. /opt/local
  273. /opt/csw
  274. /opt
  275. PATH_SUFFIXES
  276. lib
  277. )
  278. if(FLAC_LIBRARY)
  279. set(SDL_SOUND_LIBRARIES_TMP ${SDL_SOUND_LIBRARIES_TMP} ${FLAC_LIBRARY})
  280. endif()
  281. endif()
  282. # Hmmm...Speex seems to depend on Ogg. This might be a problem if
  283. # the TRY_COMPILE attempt gets blocked at SPEEX before it can pull
  284. # in the Ogg symbols. I'm not sure if I should duplicate the ogg stuff
  285. # above for here or if two ogg entries will screw up things.
  286. if("${MY_OUTPUT}" MATCHES "speex_")
  287. find_library(SPEEX_LIBRARY
  288. NAMES speex SPEEX
  289. PATHS
  290. ENV SPEEXDIR
  291. ENV SDLSOUNDDIR
  292. ENV SDLDIR
  293. /sw
  294. /opt/local
  295. /opt/csw
  296. /opt
  297. PATH_SUFFIXES
  298. lib
  299. )
  300. if(SPEEX_LIBRARY)
  301. set(SDL_SOUND_LIBRARIES_TMP ${SDL_SOUND_LIBRARIES_TMP} ${SPEEX_LIBRARY})
  302. endif()
  303. # Find OGG (needed for Speex)
  304. # We might have already found Ogg for Vorbis, so skip it if so.
  305. if(NOT OGG_LIBRARY)
  306. find_library(OGG_LIBRARY
  307. NAMES ogg Ogg OGG
  308. PATHS
  309. ENV OGGDIR
  310. ENV VORBISDIR
  311. ENV SPEEXDIR
  312. ENV SDLSOUNDDIR
  313. ENV SDLDIR
  314. /sw
  315. /opt/local
  316. /opt/csw
  317. /opt
  318. PATH_SUFFIXES lib
  319. )
  320. if(OGG_LIBRARY)
  321. set(SDL_SOUND_LIBRARIES_TMP ${SDL_SOUND_LIBRARIES_TMP} ${OGG_LIBRARY})
  322. endif()
  323. endif()
  324. endif()
  325. set(SDL_SOUND_LIBRARIES ${SDL_SOUND_EXTRAS} ${SDL_SOUND_LIBRARIES_TMP} CACHE INTERNAL "SDL_sound and dependent libraries")
  326. else()
  327. set(SDL_SOUND_LIBRARIES ${SDL_SOUND_EXTRAS} ${SDL_SOUND_LIBRARY} CACHE INTERNAL "SDL_sound and dependent libraries")
  328. endif()
  329. endif()
  330. if(SDL_SOUND_INCLUDE_DIR AND EXISTS "${SDL_SOUND_INCLUDE_DIR}/SDL_sound.h")
  331. file(STRINGS "${SDL_SOUND_INCLUDE_DIR}/SDL_sound.h" SDL_SOUND_VERSION_MAJOR_LINE REGEX "^#define[ \t]+SOUND_VER_MAJOR[ \t]+[0-9]+$")
  332. file(STRINGS "${SDL_SOUND_INCLUDE_DIR}/SDL_sound.h" SDL_SOUND_VERSION_MINOR_LINE REGEX "^#define[ \t]+SOUND_VER_MINOR[ \t]+[0-9]+$")
  333. file(STRINGS "${SDL_SOUND_INCLUDE_DIR}/SDL_sound.h" SDL_SOUND_VERSION_PATCH_LINE REGEX "^#define[ \t]+SOUND_VER_PATCH[ \t]+[0-9]+$")
  334. string(REGEX REPLACE "^#define[ \t]+SOUND_VER_MAJOR[ \t]+([0-9]+)$" "\\1" SDL_SOUND_VERSION_MAJOR "${SDL_SOUND_VERSION_MAJOR_LINE}")
  335. string(REGEX REPLACE "^#define[ \t]+SOUND_VER_MINOR[ \t]+([0-9]+)$" "\\1" SDL_SOUND_VERSION_MINOR "${SDL_SOUND_VERSION_MINOR_LINE}")
  336. string(REGEX REPLACE "^#define[ \t]+SOUND_VER_PATCH[ \t]+([0-9]+)$" "\\1" SDL_SOUND_VERSION_PATCH "${SDL_SOUND_VERSION_PATCH_LINE}")
  337. set(SDL_SOUND_VERSION_STRING ${SDL_SOUND_VERSION_MAJOR}.${SDL_SOUND_VERSION_MINOR}.${SDL_SOUND_VERSION_PATCH})
  338. unset(SDL_SOUND_VERSION_MAJOR_LINE)
  339. unset(SDL_SOUND_VERSION_MINOR_LINE)
  340. unset(SDL_SOUND_VERSION_PATCH_LINE)
  341. unset(SDL_SOUND_VERSION_MAJOR)
  342. unset(SDL_SOUND_VERSION_MINOR)
  343. unset(SDL_SOUND_VERSION_PATCH)
  344. endif()
  345. include(FindPackageHandleStandardArgs)
  346. FIND_PACKAGE_HANDLE_STANDARD_ARGS(SDL_sound
  347. REQUIRED_VARS SDL_SOUND_LIBRARY SDL_SOUND_INCLUDE_DIR
  348. VERSION_VAR SDL_SOUND_VERSION_STRING)