CMakeLists.txt 57 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711
  1. # CMake build file list for OpenAL
  2. CMAKE_MINIMUM_REQUIRED(VERSION 3.0.2)
  3. PROJECT(OpenAL)
  4. IF(COMMAND CMAKE_POLICY)
  5. CMAKE_POLICY(SET CMP0003 NEW)
  6. CMAKE_POLICY(SET CMP0005 NEW)
  7. IF(POLICY CMP0020)
  8. CMAKE_POLICY(SET CMP0020 NEW)
  9. ENDIF(POLICY CMP0020)
  10. IF(POLICY CMP0042)
  11. CMAKE_POLICY(SET CMP0042 NEW)
  12. ENDIF(POLICY CMP0042)
  13. IF(POLICY CMP0054)
  14. CMAKE_POLICY(SET CMP0054 NEW)
  15. ENDIF(POLICY CMP0054)
  16. ENDIF(COMMAND CMAKE_POLICY)
  17. SET(CMAKE_MODULE_PATH "${OpenAL_SOURCE_DIR}/cmake")
  18. INCLUDE(CheckFunctionExists)
  19. INCLUDE(CheckLibraryExists)
  20. INCLUDE(CheckSharedFunctionExists)
  21. INCLUDE(CheckIncludeFile)
  22. INCLUDE(CheckIncludeFiles)
  23. INCLUDE(CheckSymbolExists)
  24. INCLUDE(CheckCCompilerFlag)
  25. INCLUDE(CheckCXXCompilerFlag)
  26. INCLUDE(CheckCSourceCompiles)
  27. INCLUDE(CheckTypeSize)
  28. include(CheckStructHasMember)
  29. include(CheckFileOffsetBits)
  30. include(GNUInstallDirs)
  31. SET(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS TRUE)
  32. OPTION(ALSOFT_DLOPEN "Check for the dlopen API for loading optional libs" ON)
  33. OPTION(ALSOFT_WERROR "Treat compile warnings as errors" OFF)
  34. OPTION(ALSOFT_UTILS "Build and install utility programs" ON)
  35. OPTION(ALSOFT_NO_CONFIG_UTIL "Disable building the alsoft-config utility" OFF)
  36. OPTION(ALSOFT_EXAMPLES "Build and install example programs" ON)
  37. OPTION(ALSOFT_TESTS "Build and install test programs" ON)
  38. OPTION(ALSOFT_CONFIG "Install alsoft.conf sample configuration file" ON)
  39. OPTION(ALSOFT_HRTF_DEFS "Install HRTF definition files" ON)
  40. OPTION(ALSOFT_AMBDEC_PRESETS "Install AmbDec preset files" ON)
  41. OPTION(ALSOFT_INSTALL "Install headers and libraries" ON)
  42. if(DEFINED SHARE_INSTALL_DIR)
  43. message(WARNING "SHARE_INSTALL_DIR is deprecated. Use the variables provided by the GNUInstallDirs module instead")
  44. set(CMAKE_INSTALL_DATADIR "${SHARE_INSTALL_DIR}")
  45. endif()
  46. if(DEFINED LIB_SUFFIX)
  47. message(WARNING "LIB_SUFFIX is deprecated. Use the variables provided by the GNUInstallDirs module instead")
  48. endif()
  49. SET(CPP_DEFS ) # C pre-process, not C++
  50. SET(INC_PATHS )
  51. SET(C_FLAGS )
  52. SET(LINKER_FLAGS )
  53. SET(EXTRA_LIBS )
  54. IF(WIN32)
  55. SET(CPP_DEFS ${CPP_DEFS} _WIN32 _WIN32_WINNT=0x0502)
  56. OPTION(ALSOFT_BUILD_ROUTER "Build the router (EXPERIMENTAL; creates OpenAL32.dll and soft_oal.dll)" OFF)
  57. # This option is mainly for static linking OpenAL Soft into another project
  58. # that already defines the IDs. It is up to that project to ensure all
  59. # required IDs are defined.
  60. OPTION(ALSOFT_NO_UID_DEFS "Do not define GUIDs, IIDs, CLSIDs, or PropertyKeys" OFF)
  61. IF(MINGW)
  62. OPTION(ALSOFT_BUILD_IMPORT_LIB "Build an import .lib using dlltool (requires sed)" ON)
  63. IF(NOT DLLTOOL)
  64. IF(HOST)
  65. SET(DLLTOOL "${HOST}-dlltool")
  66. ELSE()
  67. SET(DLLTOOL "dlltool")
  68. ENDIF()
  69. ENDIF()
  70. ENDIF()
  71. ENDIF()
  72. # QNX's gcc do not uses /usr/include and /usr/lib pathes by default
  73. IF ("${CMAKE_C_PLATFORM_ID}" STREQUAL "QNX")
  74. SET(INC_PATHS ${INC_PATHS} /usr/include)
  75. SET(LINKER_FLAGS ${LINKER_FLAGS} -L/usr/lib)
  76. ENDIF()
  77. IF(NOT LIBTYPE)
  78. SET(LIBTYPE SHARED)
  79. ENDIF()
  80. SET(LIB_MAJOR_VERSION "1")
  81. SET(LIB_MINOR_VERSION "18")
  82. SET(LIB_REVISION "2")
  83. SET(LIB_VERSION "${LIB_MAJOR_VERSION}.${LIB_MINOR_VERSION}.${LIB_REVISION}")
  84. SET(EXPORT_DECL "")
  85. SET(ALIGN_DECL "")
  86. CHECK_TYPE_SIZE("long" SIZEOF_LONG)
  87. CHECK_TYPE_SIZE("long long" SIZEOF_LONG_LONG)
  88. CHECK_C_COMPILER_FLAG(-std=c11 HAVE_STD_C11)
  89. IF(HAVE_STD_C11)
  90. SET(CMAKE_C_FLAGS "-std=c11 ${CMAKE_C_FLAGS}")
  91. ELSE()
  92. CHECK_C_COMPILER_FLAG(-std=c99 HAVE_STD_C99)
  93. IF(HAVE_STD_C99)
  94. SET(CMAKE_C_FLAGS "-std=c99 ${CMAKE_C_FLAGS}")
  95. ENDIF()
  96. ENDIF()
  97. CHECK_CXX_COMPILER_FLAG(-std=c++11 HAVE_STD_CXX11)
  98. IF(HAVE_STD_CXX11)
  99. SET(CMAKE_CXX_FLAGS "-std=c++11 ${CMAKE_CXX_FLAGS}")
  100. ENDIF()
  101. if(NOT WIN32)
  102. # Check if _POSIX_C_SOURCE and _XOPEN_SOURCE needs to be set for POSIX functions
  103. CHECK_SYMBOL_EXISTS(posix_memalign stdlib.h HAVE_POSIX_MEMALIGN_DEFAULT)
  104. IF(NOT HAVE_POSIX_MEMALIGN_DEFAULT)
  105. SET(OLD_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
  106. SET(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -D_POSIX_C_SOURCE=200112L -D_XOPEN_SOURCE=600")
  107. CHECK_SYMBOL_EXISTS(posix_memalign stdlib.h HAVE_POSIX_MEMALIGN_POSIX)
  108. IF(NOT HAVE_POSIX_MEMALIGN_POSIX)
  109. SET(CMAKE_REQUIRED_FLAGS ${OLD_REQUIRED_FLAGS})
  110. ELSE()
  111. SET(CPP_DEFS ${CPP_DEFS} _POSIX_C_SOURCE=200112L _XOPEN_SOURCE=600)
  112. ENDIF()
  113. ENDIF()
  114. UNSET(OLD_REQUIRED_FLAGS)
  115. ENDIF()
  116. # Set defines for large file support
  117. CHECK_FILE_OFFSET_BITS()
  118. IF(_FILE_OFFSET_BITS)
  119. SET(CPP_DEFS ${CPP_DEFS} "_FILE_OFFSET_BITS=${_FILE_OFFSET_BITS}")
  120. SET(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -D_FILE_OFFSET_BITS=${_FILE_OFFSET_BITS}")
  121. ENDIF()
  122. SET(CPP_DEFS ${CPP_DEFS} _LARGEFILE_SOURCE _LARGE_FILES)
  123. SET(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -D_LARGEFILE_SOURCE -D_LARGE_FILES")
  124. # MSVC may need workarounds for C99 restrict and inline
  125. IF(MSVC)
  126. # TODO: Once we truly require C99, these restrict and inline checks should go
  127. # away.
  128. CHECK_C_SOURCE_COMPILES("int *restrict foo;
  129. int main() {return 0;}" HAVE_RESTRICT)
  130. IF(NOT HAVE_RESTRICT)
  131. SET(CPP_DEFS ${CPP_DEFS} "restrict=")
  132. SET(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -Drestrict=")
  133. ENDIF()
  134. CHECK_C_SOURCE_COMPILES("inline void foo(void) { }
  135. int main() {return 0;}" HAVE_INLINE)
  136. IF(NOT HAVE_INLINE)
  137. CHECK_C_SOURCE_COMPILES("__inline void foo(void) { }
  138. int main() {return 0;}" HAVE___INLINE)
  139. IF(NOT HAVE___INLINE)
  140. MESSAGE(FATAL_ERROR "No inline keyword found, please report!")
  141. ENDIF()
  142. SET(CPP_DEFS ${CPP_DEFS} inline=__inline)
  143. SET(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -Dinline=__inline")
  144. ENDIF()
  145. ENDIF()
  146. # Make sure we have C99-style inline semantics with GCC (4.3 or newer).
  147. IF(CMAKE_COMPILER_IS_GNUCC)
  148. SET(CMAKE_C_FLAGS "-fno-gnu89-inline ${CMAKE_C_FLAGS}")
  149. SET(OLD_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}")
  150. # Force no inlining for the next test.
  151. SET(CMAKE_REQUIRED_FLAGS "${OLD_REQUIRED_FLAGS} -fno-inline")
  152. CHECK_C_SOURCE_COMPILES("extern inline int foo() { return 0; }
  153. int main() {return foo();}" INLINE_IS_C99)
  154. IF(NOT INLINE_IS_C99)
  155. MESSAGE(FATAL_ERROR "Your compiler does not seem to have C99 inline semantics!
  156. Please update your compiler for better C99 compliance.")
  157. ENDIF()
  158. SET(CMAKE_REQUIRED_FLAGS "${OLD_REQUIRED_FLAGS}")
  159. ENDIF()
  160. # Check if we have a proper timespec declaration
  161. CHECK_STRUCT_HAS_MEMBER("struct timespec" tv_sec time.h HAVE_STRUCT_TIMESPEC)
  162. IF(HAVE_STRUCT_TIMESPEC)
  163. # Define it here so we don't have to include config.h for it
  164. SET(CPP_DEFS ${CPP_DEFS} HAVE_STRUCT_TIMESPEC)
  165. ENDIF()
  166. # Some systems may need libatomic for C11 atomic functions to work
  167. SET(OLD_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES})
  168. SET(CMAKE_REQUIRED_LIBRARIES ${OLD_REQUIRED_LIBRARIES} atomic)
  169. CHECK_C_SOURCE_COMPILES("#include <stdatomic.h>
  170. int _Atomic foo = ATOMIC_VAR_INIT(0);
  171. int main()
  172. {
  173. return atomic_fetch_add(&foo, 2);
  174. }"
  175. HAVE_LIBATOMIC)
  176. IF(NOT HAVE_LIBATOMIC)
  177. SET(CMAKE_REQUIRED_LIBRARIES "${OLD_REQUIRED_LIBRARIES}")
  178. ELSE()
  179. SET(EXTRA_LIBS atomic ${EXTRA_LIBS})
  180. ENDIF()
  181. UNSET(OLD_REQUIRED_LIBRARIES)
  182. # Include liblog for Android logging
  183. CHECK_LIBRARY_EXISTS(log __android_log_print "" HAVE_LIBLOG)
  184. IF(HAVE_LIBLOG)
  185. SET(EXTRA_LIBS log ${EXTRA_LIBS})
  186. SET(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} log)
  187. ENDIF()
  188. # Check if we have C99 bool
  189. CHECK_C_SOURCE_COMPILES(
  190. "int main(int argc, char *argv[])
  191. {
  192. volatile _Bool ret;
  193. ret = (argc > 1) ? 1 : 0;
  194. return ret ? -1 : 0;
  195. }"
  196. HAVE_C99_BOOL)
  197. # Check if we have C11 static_assert
  198. CHECK_C_SOURCE_COMPILES(
  199. "int main()
  200. {
  201. _Static_assert(sizeof(int) == sizeof(int), \"What\");
  202. return 0;
  203. }"
  204. HAVE_C11_STATIC_ASSERT)
  205. # Check if we have C11 alignas
  206. CHECK_C_SOURCE_COMPILES(
  207. "_Alignas(16) int foo;
  208. int main()
  209. {
  210. return 0;
  211. }"
  212. HAVE_C11_ALIGNAS)
  213. # Check if we have C11 _Atomic
  214. CHECK_C_SOURCE_COMPILES(
  215. "#include <stdatomic.h>
  216. int _Atomic foo = ATOMIC_VAR_INIT(0);
  217. int main()
  218. {
  219. atomic_fetch_add(&foo, 2);
  220. return 0;
  221. }"
  222. HAVE_C11_ATOMIC)
  223. # Add definitions, compiler switches, etc.
  224. INCLUDE_DIRECTORIES("${OpenAL_SOURCE_DIR}/include" "${OpenAL_SOURCE_DIR}/common" "${OpenAL_BINARY_DIR}")
  225. IF(NOT CMAKE_BUILD_TYPE)
  226. SET(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING
  227. "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel."
  228. FORCE)
  229. ENDIF()
  230. IF(NOT CMAKE_DEBUG_POSTFIX)
  231. SET(CMAKE_DEBUG_POSTFIX "" CACHE STRING
  232. "Library postfix for debug builds. Normally left blank."
  233. FORCE)
  234. ENDIF()
  235. IF(MSVC)
  236. SET(CPP_DEFS ${CPP_DEFS} _CRT_SECURE_NO_WARNINGS _CRT_NONSTDC_NO_DEPRECATE)
  237. SET(C_FLAGS ${C_FLAGS} /wd4098)
  238. IF(NOT DXSDK_DIR)
  239. STRING(REGEX REPLACE "\\\\" "/" DXSDK_DIR "$ENV{DXSDK_DIR}")
  240. ELSE()
  241. STRING(REGEX REPLACE "\\\\" "/" DXSDK_DIR "${DXSDK_DIR}")
  242. ENDIF()
  243. IF(DXSDK_DIR)
  244. MESSAGE(STATUS "Using DirectX SDK directory: ${DXSDK_DIR}")
  245. ENDIF()
  246. OPTION(FORCE_STATIC_VCRT "Force /MT for static VC runtimes" OFF)
  247. IF(FORCE_STATIC_VCRT)
  248. FOREACH(flag_var
  249. CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE
  250. CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO)
  251. IF(${flag_var} MATCHES "/MD")
  252. STRING(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}")
  253. ENDIF()
  254. ENDFOREACH(flag_var)
  255. ENDIF()
  256. ELSE()
  257. SET(C_FLAGS ${C_FLAGS} -Winline -Wall)
  258. CHECK_C_COMPILER_FLAG(-Wextra HAVE_W_EXTRA)
  259. IF(HAVE_W_EXTRA)
  260. SET(C_FLAGS ${C_FLAGS} -Wextra)
  261. ENDIF()
  262. IF(ALSOFT_WERROR)
  263. SET(C_FLAGS ${C_FLAGS} -Werror)
  264. ENDIF()
  265. # We want RelWithDebInfo to actually include debug stuff (define _DEBUG
  266. # instead of NDEBUG)
  267. FOREACH(flag_var CMAKE_C_FLAGS_RELWITHDEBINFO CMAKE_CXX_FLAGS_RELWITHDEBINFO)
  268. IF(${flag_var} MATCHES "-DNDEBUG")
  269. STRING(REGEX REPLACE "-DNDEBUG" "-D_DEBUG" ${flag_var} "${${flag_var}}")
  270. ENDIF()
  271. ENDFOREACH()
  272. CHECK_C_COMPILER_FLAG(-fno-math-errno HAVE_FNO_MATH_ERRNO)
  273. IF(HAVE_FNO_MATH_ERRNO)
  274. SET(C_FLAGS ${C_FLAGS} -fno-math-errno)
  275. ENDIF()
  276. CHECK_C_SOURCE_COMPILES("int foo() __attribute__((destructor));
  277. int main() {return 0;}" HAVE_GCC_DESTRUCTOR)
  278. option(ALSOFT_STATIC_LIBGCC "Force -static-libgcc for static GCC runtimes" OFF)
  279. if(ALSOFT_STATIC_LIBGCC)
  280. set(OLD_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES})
  281. set(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} -static-libgcc)
  282. check_c_source_compiles(
  283. "#include <stdlib.h>
  284. int main()
  285. {
  286. return 0;
  287. }"
  288. HAVE_STATIC_LIBGCC_SWITCH
  289. )
  290. if(HAVE_STATIC_LIBGCC_SWITCH)
  291. SET(LINKER_FLAGS ${LINKER_FLAGS} -static-libgcc)
  292. endif()
  293. set(CMAKE_REQUIRED_LIBRARIES ${OLD_REQUIRED_LIBRARIES})
  294. unset(OLD_REQUIRED_LIBRARIES)
  295. endif()
  296. ENDIF()
  297. # Set visibility/export options if available
  298. IF(WIN32)
  299. SET(EXPORT_DECL "__declspec(dllexport)")
  300. IF(NOT MINGW)
  301. SET(ALIGN_DECL "__declspec(align(x))")
  302. ELSE()
  303. SET(ALIGN_DECL "__declspec(aligned(x))")
  304. ENDIF()
  305. ELSE()
  306. SET(OLD_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}")
  307. # Yes GCC, really don't accept visibility modes you don't support
  308. SET(CMAKE_REQUIRED_FLAGS "${OLD_REQUIRED_FLAGS} -Wattributes -Werror")
  309. CHECK_C_SOURCE_COMPILES("int foo() __attribute__((visibility(\"protected\")));
  310. int main() {return 0;}" HAVE_GCC_PROTECTED_VISIBILITY)
  311. IF(HAVE_GCC_PROTECTED_VISIBILITY)
  312. SET(EXPORT_DECL "__attribute__((visibility(\"protected\")))")
  313. ELSE()
  314. CHECK_C_SOURCE_COMPILES("int foo() __attribute__((visibility(\"default\")));
  315. int main() {return 0;}" HAVE_GCC_DEFAULT_VISIBILITY)
  316. IF(HAVE_GCC_DEFAULT_VISIBILITY)
  317. SET(EXPORT_DECL "__attribute__((visibility(\"default\")))")
  318. ENDIF()
  319. ENDIF()
  320. IF(HAVE_GCC_PROTECTED_VISIBILITY OR HAVE_GCC_DEFAULT_VISIBILITY)
  321. CHECK_C_COMPILER_FLAG(-fvisibility=hidden HAVE_VISIBILITY_HIDDEN_SWITCH)
  322. IF(HAVE_VISIBILITY_HIDDEN_SWITCH)
  323. SET(C_FLAGS ${C_FLAGS} -fvisibility=hidden)
  324. ENDIF()
  325. ENDIF()
  326. CHECK_C_SOURCE_COMPILES("int foo __attribute__((aligned(16)));
  327. int main() {return 0;}" HAVE_ATTRIBUTE_ALIGNED)
  328. IF(HAVE_ATTRIBUTE_ALIGNED)
  329. SET(ALIGN_DECL "__attribute__((aligned(x)))")
  330. ENDIF()
  331. SET(CMAKE_REQUIRED_FLAGS "${OLD_REQUIRED_FLAGS}")
  332. ENDIF()
  333. CHECK_C_SOURCE_COMPILES("
  334. int main()
  335. {
  336. float *ptr;
  337. ptr = __builtin_assume_aligned(ptr, 16);
  338. return 0;
  339. }" HAVE___BUILTIN_ASSUME_ALIGNED)
  340. IF(HAVE___BUILTIN_ASSUME_ALIGNED)
  341. SET(ASSUME_ALIGNED_DECL "__builtin_assume_aligned(x, y)")
  342. ELSE()
  343. SET(ASSUME_ALIGNED_DECL "x")
  344. ENDIF()
  345. SET(SSE_SWITCH "")
  346. SET(SSE2_SWITCH "")
  347. SET(SSE3_SWITCH "")
  348. SET(SSE4_1_SWITCH "")
  349. SET(FPU_NEON_SWITCH "")
  350. CHECK_C_COMPILER_FLAG(-msse HAVE_MSSE_SWITCH)
  351. IF(HAVE_MSSE_SWITCH)
  352. SET(SSE_SWITCH "-msse")
  353. ENDIF()
  354. CHECK_C_COMPILER_FLAG(-msse2 HAVE_MSSE2_SWITCH)
  355. IF(HAVE_MSSE2_SWITCH)
  356. SET(SSE2_SWITCH "-msse2")
  357. ENDIF()
  358. CHECK_C_COMPILER_FLAG(-msse3 HAVE_MSSE3_SWITCH)
  359. IF(HAVE_MSSE3_SWITCH)
  360. SET(SSE3_SWITCH "-msse3")
  361. ENDIF()
  362. CHECK_C_COMPILER_FLAG(-msse4.1 HAVE_MSSE4_1_SWITCH)
  363. IF(HAVE_MSSE4_1_SWITCH)
  364. SET(SSE4_1_SWITCH "-msse4.1")
  365. ENDIF()
  366. CHECK_C_COMPILER_FLAG(-mfpu=neon HAVE_MFPU_NEON_SWITCH)
  367. IF(HAVE_MFPU_NEON_SWITCH)
  368. SET(FPU_NEON_SWITCH "-mfpu=neon")
  369. ENDIF()
  370. CHECK_C_SOURCE_COMPILES("int foo(const char *str, ...) __attribute__((format(printf, 1, 2)));
  371. int main() {return 0;}" HAVE_GCC_FORMAT)
  372. CHECK_INCLUDE_FILE(stdbool.h HAVE_STDBOOL_H)
  373. CHECK_INCLUDE_FILE(stdalign.h HAVE_STDALIGN_H)
  374. CHECK_INCLUDE_FILE(malloc.h HAVE_MALLOC_H)
  375. CHECK_INCLUDE_FILE(dirent.h HAVE_DIRENT_H)
  376. CHECK_INCLUDE_FILE(strings.h HAVE_STRINGS_H)
  377. CHECK_INCLUDE_FILE(cpuid.h HAVE_CPUID_H)
  378. CHECK_INCLUDE_FILE(intrin.h HAVE_INTRIN_H)
  379. CHECK_INCLUDE_FILE(sys/sysconf.h HAVE_SYS_SYSCONF_H)
  380. CHECK_INCLUDE_FILE(fenv.h HAVE_FENV_H)
  381. CHECK_INCLUDE_FILE(float.h HAVE_FLOAT_H)
  382. CHECK_INCLUDE_FILE(ieeefp.h HAVE_IEEEFP_H)
  383. CHECK_INCLUDE_FILE(guiddef.h HAVE_GUIDDEF_H)
  384. IF(NOT HAVE_GUIDDEF_H)
  385. CHECK_INCLUDE_FILE(initguid.h HAVE_INITGUID_H)
  386. ENDIF()
  387. # Some systems need libm for some of the following math functions to work
  388. SET(MATH_LIB )
  389. CHECK_LIBRARY_EXISTS(m pow "" HAVE_LIBM)
  390. IF(HAVE_LIBM)
  391. SET(MATH_LIB ${MATH_LIB} m)
  392. SET(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} m)
  393. ENDIF()
  394. # Check for the dlopen API (for dynamicly loading backend libs)
  395. IF(ALSOFT_DLOPEN)
  396. CHECK_LIBRARY_EXISTS(dl dlopen "" HAVE_LIBDL)
  397. IF(HAVE_LIBDL)
  398. SET(EXTRA_LIBS dl ${EXTRA_LIBS})
  399. SET(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} dl)
  400. ENDIF()
  401. CHECK_INCLUDE_FILE(dlfcn.h HAVE_DLFCN_H)
  402. ENDIF()
  403. # Check for a cpuid intrinsic
  404. IF(HAVE_CPUID_H)
  405. CHECK_C_SOURCE_COMPILES("#include <cpuid.h>
  406. int main()
  407. {
  408. unsigned int eax, ebx, ecx, edx;
  409. return __get_cpuid(0, &eax, &ebx, &ecx, &edx);
  410. }" HAVE_GCC_GET_CPUID)
  411. ENDIF()
  412. IF(HAVE_INTRIN_H)
  413. CHECK_C_SOURCE_COMPILES("#include <intrin.h>
  414. int main()
  415. {
  416. int regs[4];
  417. __cpuid(regs, 0);
  418. return regs[0];
  419. }" HAVE_CPUID_INTRINSIC)
  420. CHECK_C_SOURCE_COMPILES("#include <intrin.h>
  421. int main()
  422. {
  423. unsigned long idx = 0;
  424. _BitScanForward64(&idx, 1);
  425. return idx;
  426. }" HAVE_BITSCANFORWARD64_INTRINSIC)
  427. CHECK_C_SOURCE_COMPILES("#include <intrin.h>
  428. int main()
  429. {
  430. unsigned long idx = 0;
  431. _BitScanForward(&idx, 1);
  432. return idx;
  433. }" HAVE_BITSCANFORWARD_INTRINSIC)
  434. ENDIF()
  435. CHECK_SYMBOL_EXISTS(sysconf unistd.h HAVE_SYSCONF)
  436. CHECK_SYMBOL_EXISTS(aligned_alloc stdlib.h HAVE_ALIGNED_ALLOC)
  437. CHECK_SYMBOL_EXISTS(posix_memalign stdlib.h HAVE_POSIX_MEMALIGN)
  438. CHECK_SYMBOL_EXISTS(_aligned_malloc malloc.h HAVE__ALIGNED_MALLOC)
  439. CHECK_SYMBOL_EXISTS(proc_pidpath libproc.h HAVE_PROC_PIDPATH)
  440. CHECK_SYMBOL_EXISTS(lrintf math.h HAVE_LRINTF)
  441. CHECK_SYMBOL_EXISTS(modff math.h HAVE_MODFF)
  442. CHECK_SYMBOL_EXISTS(log2f math.h HAVE_LOG2F)
  443. CHECK_SYMBOL_EXISTS(cbrtf math.h HAVE_CBRTF)
  444. IF(HAVE_FLOAT_H)
  445. CHECK_SYMBOL_EXISTS(_controlfp float.h HAVE__CONTROLFP)
  446. CHECK_SYMBOL_EXISTS(__control87_2 float.h HAVE___CONTROL87_2)
  447. ENDIF()
  448. CHECK_FUNCTION_EXISTS(stat HAVE_STAT)
  449. CHECK_FUNCTION_EXISTS(strtof HAVE_STRTOF)
  450. CHECK_FUNCTION_EXISTS(strcasecmp HAVE_STRCASECMP)
  451. IF(NOT HAVE_STRCASECMP)
  452. CHECK_FUNCTION_EXISTS(_stricmp HAVE__STRICMP)
  453. IF(NOT HAVE__STRICMP)
  454. MESSAGE(FATAL_ERROR "No case-insensitive compare function found, please report!")
  455. ENDIF()
  456. SET(CPP_DEFS ${CPP_DEFS} strcasecmp=_stricmp)
  457. ENDIF()
  458. CHECK_FUNCTION_EXISTS(strncasecmp HAVE_STRNCASECMP)
  459. IF(NOT HAVE_STRNCASECMP)
  460. CHECK_FUNCTION_EXISTS(_strnicmp HAVE__STRNICMP)
  461. IF(NOT HAVE__STRNICMP)
  462. MESSAGE(FATAL_ERROR "No case-insensitive size-limitted compare function found, please report!")
  463. ENDIF()
  464. SET(CPP_DEFS ${CPP_DEFS} strncasecmp=_strnicmp)
  465. ENDIF()
  466. CHECK_SYMBOL_EXISTS(strnlen string.h HAVE_STRNLEN)
  467. CHECK_SYMBOL_EXISTS(snprintf stdio.h HAVE_SNPRINTF)
  468. IF(NOT HAVE_SNPRINTF)
  469. CHECK_FUNCTION_EXISTS(_snprintf HAVE__SNPRINTF)
  470. IF(NOT HAVE__SNPRINTF)
  471. MESSAGE(FATAL_ERROR "No snprintf function found, please report!")
  472. ENDIF()
  473. SET(CPP_DEFS ${CPP_DEFS} snprintf=_snprintf)
  474. ENDIF()
  475. CHECK_SYMBOL_EXISTS(isfinite math.h HAVE_ISFINITE)
  476. IF(NOT HAVE_ISFINITE)
  477. CHECK_FUNCTION_EXISTS(finite HAVE_FINITE)
  478. IF(NOT HAVE_FINITE)
  479. CHECK_FUNCTION_EXISTS(_finite HAVE__FINITE)
  480. IF(NOT HAVE__FINITE)
  481. MESSAGE(FATAL_ERROR "No isfinite function found, please report!")
  482. ENDIF()
  483. SET(CPP_DEFS ${CPP_DEFS} isfinite=_finite)
  484. ELSE()
  485. SET(CPP_DEFS ${CPP_DEFS} isfinite=finite)
  486. ENDIF()
  487. ENDIF()
  488. CHECK_SYMBOL_EXISTS(isnan math.h HAVE_ISNAN)
  489. IF(NOT HAVE_ISNAN)
  490. CHECK_FUNCTION_EXISTS(_isnan HAVE__ISNAN)
  491. IF(NOT HAVE__ISNAN)
  492. MESSAGE(FATAL_ERROR "No isnan function found, please report!")
  493. ENDIF()
  494. SET(CPP_DEFS ${CPP_DEFS} isnan=_isnan)
  495. ENDIF()
  496. # Check if we have Windows headers
  497. SET(OLD_REQUIRED_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS})
  498. SET(CMAKE_REQUIRED_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS} -D_WIN32_WINNT=0x0502)
  499. CHECK_INCLUDE_FILE(windows.h HAVE_WINDOWS_H)
  500. SET(CMAKE_REQUIRED_DEFINITIONS ${OLD_REQUIRED_DEFINITIONS})
  501. UNSET(OLD_REQUIRED_DEFINITIONS)
  502. IF(NOT HAVE_WINDOWS_H)
  503. CHECK_SYMBOL_EXISTS(gettimeofday sys/time.h HAVE_GETTIMEOFDAY)
  504. IF(NOT HAVE_GETTIMEOFDAY)
  505. MESSAGE(FATAL_ERROR "No timing function found!")
  506. ENDIF()
  507. CHECK_SYMBOL_EXISTS(nanosleep time.h HAVE_NANOSLEEP)
  508. IF(NOT HAVE_NANOSLEEP)
  509. MESSAGE(FATAL_ERROR "No sleep function found!")
  510. ENDIF()
  511. # We need pthreads outside of Windows
  512. CHECK_INCLUDE_FILE(pthread.h HAVE_PTHREAD_H)
  513. IF(NOT HAVE_PTHREAD_H)
  514. MESSAGE(FATAL_ERROR "PThreads is required for non-Windows builds!")
  515. ENDIF()
  516. # Some systems need pthread_np.h to get recursive mutexes
  517. CHECK_INCLUDE_FILES("pthread.h;pthread_np.h" HAVE_PTHREAD_NP_H)
  518. CHECK_C_COMPILER_FLAG(-pthread HAVE_PTHREAD)
  519. IF(HAVE_PTHREAD)
  520. SET(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -pthread")
  521. SET(C_FLAGS ${C_FLAGS} -pthread)
  522. SET(LINKER_FLAGS ${LINKER_FLAGS} -pthread)
  523. ENDIF()
  524. CHECK_LIBRARY_EXISTS(pthread pthread_create "" HAVE_LIBPTHREAD)
  525. IF(HAVE_LIBPTHREAD)
  526. SET(EXTRA_LIBS pthread ${EXTRA_LIBS})
  527. ENDIF()
  528. CHECK_SYMBOL_EXISTS(pthread_setschedparam pthread.h HAVE_PTHREAD_SETSCHEDPARAM)
  529. IF(HAVE_PTHREAD_NP_H)
  530. CHECK_SYMBOL_EXISTS(pthread_setname_np "pthread.h;pthread_np.h" HAVE_PTHREAD_SETNAME_NP)
  531. IF(NOT HAVE_PTHREAD_SETNAME_NP)
  532. CHECK_SYMBOL_EXISTS(pthread_set_name_np "pthread.h;pthread_np.h" HAVE_PTHREAD_SET_NAME_NP)
  533. ELSE()
  534. CHECK_C_SOURCE_COMPILES("
  535. #include <pthread.h>
  536. #include <pthread_np.h>
  537. int main()
  538. {
  539. pthread_setname_np(\"testname\");
  540. return 0;
  541. }"
  542. PTHREAD_SETNAME_NP_ONE_PARAM
  543. )
  544. CHECK_C_SOURCE_COMPILES("
  545. #include <pthread.h>
  546. #include <pthread_np.h>
  547. int main()
  548. {
  549. pthread_setname_np(pthread_self(), \"%s\", \"testname\");
  550. return 0;
  551. }"
  552. PTHREAD_SETNAME_NP_THREE_PARAMS
  553. )
  554. ENDIF()
  555. CHECK_SYMBOL_EXISTS(pthread_mutexattr_setkind_np "pthread.h;pthread_np.h" HAVE_PTHREAD_MUTEXATTR_SETKIND_NP)
  556. ELSE()
  557. CHECK_SYMBOL_EXISTS(pthread_setname_np pthread.h HAVE_PTHREAD_SETNAME_NP)
  558. IF(NOT HAVE_PTHREAD_SETNAME_NP)
  559. CHECK_SYMBOL_EXISTS(pthread_set_name_np pthread.h HAVE_PTHREAD_SET_NAME_NP)
  560. ELSE()
  561. CHECK_C_SOURCE_COMPILES("
  562. #include <pthread.h>
  563. int main()
  564. {
  565. pthread_setname_np(\"testname\");
  566. return 0;
  567. }"
  568. PTHREAD_SETNAME_NP_ONE_PARAM
  569. )
  570. CHECK_C_SOURCE_COMPILES("
  571. #include <pthread.h>
  572. int main()
  573. {
  574. pthread_setname_np(pthread_self(), \"%s\", \"testname\");
  575. return 0;
  576. }"
  577. PTHREAD_SETNAME_NP_THREE_PARAMS
  578. )
  579. ENDIF()
  580. CHECK_SYMBOL_EXISTS(pthread_mutexattr_setkind_np pthread.h HAVE_PTHREAD_MUTEXATTR_SETKIND_NP)
  581. ENDIF()
  582. CHECK_SYMBOL_EXISTS(pthread_mutex_timedlock pthread.h HAVE_PTHREAD_MUTEX_TIMEDLOCK)
  583. CHECK_LIBRARY_EXISTS(rt clock_gettime "" HAVE_LIBRT)
  584. IF(HAVE_LIBRT)
  585. SET(EXTRA_LIBS rt ${EXTRA_LIBS})
  586. ENDIF()
  587. ENDIF()
  588. CHECK_SYMBOL_EXISTS(getopt unistd.h HAVE_GETOPT)
  589. # Check for a 64-bit type
  590. CHECK_INCLUDE_FILE(stdint.h HAVE_STDINT_H)
  591. IF(NOT HAVE_STDINT_H)
  592. IF(HAVE_WINDOWS_H)
  593. CHECK_C_SOURCE_COMPILES("#define _WIN32_WINNT 0x0502
  594. #include <windows.h>
  595. __int64 foo;
  596. int main() {return 0;}" HAVE___INT64)
  597. ENDIF()
  598. IF(NOT HAVE___INT64)
  599. IF(NOT SIZEOF_LONG MATCHES "8")
  600. IF(NOT SIZEOF_LONG_LONG MATCHES "8")
  601. MESSAGE(FATAL_ERROR "No 64-bit types found, please report!")
  602. ENDIF()
  603. ENDIF()
  604. ENDIF()
  605. ENDIF()
  606. SET(COMMON_OBJS
  607. common/align.h
  608. common/almalloc.c
  609. common/almalloc.h
  610. common/atomic.c
  611. common/atomic.h
  612. common/bool.h
  613. common/math_defs.h
  614. common/rwlock.c
  615. common/rwlock.h
  616. common/static_assert.h
  617. common/threads.c
  618. common/threads.h
  619. common/uintmap.c
  620. common/uintmap.h
  621. )
  622. SET(OPENAL_OBJS
  623. OpenAL32/Include/bs2b.h
  624. OpenAL32/Include/alMain.h
  625. OpenAL32/Include/alu.h
  626. OpenAL32/Include/alAuxEffectSlot.h
  627. OpenAL32/alAuxEffectSlot.c
  628. OpenAL32/Include/alBuffer.h
  629. OpenAL32/alBuffer.c
  630. OpenAL32/Include/alEffect.h
  631. OpenAL32/alEffect.c
  632. OpenAL32/Include/alError.h
  633. OpenAL32/alError.c
  634. OpenAL32/alExtension.c
  635. OpenAL32/Include/alFilter.h
  636. OpenAL32/alFilter.c
  637. OpenAL32/Include/alListener.h
  638. OpenAL32/alListener.c
  639. OpenAL32/Include/alSource.h
  640. OpenAL32/alSource.c
  641. OpenAL32/alState.c
  642. OpenAL32/event.c
  643. OpenAL32/Include/sample_cvt.h
  644. OpenAL32/sample_cvt.c
  645. )
  646. SET(ALC_OBJS
  647. Alc/ALc.c
  648. Alc/ALu.c
  649. Alc/alconfig.c
  650. Alc/alconfig.h
  651. Alc/bs2b.c
  652. Alc/converter.c
  653. Alc/converter.h
  654. Alc/inprogext.h
  655. Alc/mastering.c
  656. Alc/mastering.h
  657. Alc/ringbuffer.c
  658. Alc/ringbuffer.h
  659. Alc/effects/chorus.c
  660. Alc/effects/compressor.c
  661. Alc/effects/dedicated.c
  662. Alc/effects/distortion.c
  663. Alc/effects/echo.c
  664. Alc/effects/equalizer.c
  665. Alc/effects/modulator.c
  666. Alc/effects/null.c
  667. Alc/effects/pshifter.c
  668. Alc/effects/reverb.c
  669. Alc/filters/defs.h
  670. Alc/filters/filter.c
  671. Alc/filters/nfc.c
  672. Alc/filters/nfc.h
  673. Alc/filters/splitter.c
  674. Alc/filters/splitter.h
  675. Alc/helpers.c
  676. Alc/alstring.h
  677. Alc/compat.h
  678. Alc/cpu_caps.h
  679. Alc/fpu_modes.h
  680. Alc/logging.h
  681. Alc/vector.h
  682. Alc/hrtf.c
  683. Alc/hrtf.h
  684. Alc/uhjfilter.c
  685. Alc/uhjfilter.h
  686. Alc/ambdec.c
  687. Alc/ambdec.h
  688. Alc/bformatdec.c
  689. Alc/bformatdec.h
  690. Alc/panning.c
  691. Alc/polymorphism.h
  692. Alc/mixvoice.c
  693. Alc/mixer/defs.h
  694. Alc/mixer/mixer_c.c
  695. )
  696. SET(CPU_EXTS "Default")
  697. SET(HAVE_SSE 0)
  698. SET(HAVE_SSE2 0)
  699. SET(HAVE_SSE3 0)
  700. SET(HAVE_SSE4_1 0)
  701. SET(HAVE_NEON 0)
  702. SET(HAVE_ALSA 0)
  703. SET(HAVE_OSS 0)
  704. SET(HAVE_SOLARIS 0)
  705. SET(HAVE_SNDIO 0)
  706. SET(HAVE_QSA 0)
  707. SET(HAVE_DSOUND 0)
  708. SET(HAVE_WASAPI 0)
  709. SET(HAVE_WINMM 0)
  710. SET(HAVE_PORTAUDIO 0)
  711. SET(HAVE_PULSEAUDIO 0)
  712. SET(HAVE_COREAUDIO 0)
  713. SET(HAVE_OPENSL 0)
  714. SET(HAVE_WAVE 0)
  715. SET(HAVE_SDL2 0)
  716. # Check for SSE support
  717. OPTION(ALSOFT_REQUIRE_SSE "Require SSE support" OFF)
  718. CHECK_INCLUDE_FILE(xmmintrin.h HAVE_XMMINTRIN_H "${SSE_SWITCH}")
  719. IF(HAVE_XMMINTRIN_H)
  720. OPTION(ALSOFT_CPUEXT_SSE "Enable SSE support" ON)
  721. IF(ALSOFT_CPUEXT_SSE)
  722. IF(ALIGN_DECL OR HAVE_C11_ALIGNAS)
  723. SET(HAVE_SSE 1)
  724. SET(ALC_OBJS ${ALC_OBJS} Alc/mixer/mixer_sse.c)
  725. IF(SSE_SWITCH)
  726. SET_SOURCE_FILES_PROPERTIES(Alc/mixer/mixer_sse.c PROPERTIES
  727. COMPILE_FLAGS "${SSE_SWITCH}")
  728. ENDIF()
  729. SET(CPU_EXTS "${CPU_EXTS}, SSE")
  730. ENDIF()
  731. ENDIF()
  732. ENDIF()
  733. IF(ALSOFT_REQUIRE_SSE AND NOT HAVE_SSE)
  734. MESSAGE(FATAL_ERROR "Failed to enabled required SSE CPU extensions")
  735. ENDIF()
  736. OPTION(ALSOFT_REQUIRE_SSE2 "Require SSE2 support" OFF)
  737. CHECK_INCLUDE_FILE(emmintrin.h HAVE_EMMINTRIN_H "${SSE2_SWITCH}")
  738. IF(HAVE_EMMINTRIN_H)
  739. OPTION(ALSOFT_CPUEXT_SSE2 "Enable SSE2 support" ON)
  740. IF(HAVE_SSE AND ALSOFT_CPUEXT_SSE2)
  741. IF(ALIGN_DECL OR HAVE_C11_ALIGNAS)
  742. SET(HAVE_SSE2 1)
  743. SET(ALC_OBJS ${ALC_OBJS} Alc/mixer/mixer_sse2.c)
  744. IF(SSE2_SWITCH)
  745. SET_SOURCE_FILES_PROPERTIES(Alc/mixer/mixer_sse2.c PROPERTIES
  746. COMPILE_FLAGS "${SSE2_SWITCH}")
  747. ENDIF()
  748. SET(CPU_EXTS "${CPU_EXTS}, SSE2")
  749. ENDIF()
  750. ENDIF()
  751. ENDIF()
  752. IF(ALSOFT_REQUIRE_SSE2 AND NOT HAVE_SSE2)
  753. MESSAGE(FATAL_ERROR "Failed to enable required SSE2 CPU extensions")
  754. ENDIF()
  755. OPTION(ALSOFT_REQUIRE_SSE2 "Require SSE3 support" OFF)
  756. CHECK_INCLUDE_FILE(pmmintrin.h HAVE_PMMINTRIN_H "${SSE3_SWITCH}")
  757. IF(HAVE_EMMINTRIN_H)
  758. OPTION(ALSOFT_CPUEXT_SSE3 "Enable SSE3 support" ON)
  759. IF(HAVE_SSE2 AND ALSOFT_CPUEXT_SSE3)
  760. IF(ALIGN_DECL OR HAVE_C11_ALIGNAS)
  761. SET(HAVE_SSE3 1)
  762. SET(ALC_OBJS ${ALC_OBJS} Alc/mixer/mixer_sse3.c)
  763. IF(SSE2_SWITCH)
  764. SET_SOURCE_FILES_PROPERTIES(Alc/mixer/mixer_sse3.c PROPERTIES
  765. COMPILE_FLAGS "${SSE3_SWITCH}")
  766. ENDIF()
  767. SET(CPU_EXTS "${CPU_EXTS}, SSE3")
  768. ENDIF()
  769. ENDIF()
  770. ENDIF()
  771. IF(ALSOFT_REQUIRE_SSE3 AND NOT HAVE_SSE3)
  772. MESSAGE(FATAL_ERROR "Failed to enable required SSE3 CPU extensions")
  773. ENDIF()
  774. OPTION(ALSOFT_REQUIRE_SSE4_1 "Require SSE4.1 support" OFF)
  775. CHECK_INCLUDE_FILE(smmintrin.h HAVE_SMMINTRIN_H "${SSE4_1_SWITCH}")
  776. IF(HAVE_SMMINTRIN_H)
  777. OPTION(ALSOFT_CPUEXT_SSE4_1 "Enable SSE4.1 support" ON)
  778. IF(HAVE_SSE2 AND ALSOFT_CPUEXT_SSE4_1)
  779. IF(ALIGN_DECL OR HAVE_C11_ALIGNAS)
  780. SET(HAVE_SSE4_1 1)
  781. SET(ALC_OBJS ${ALC_OBJS} Alc/mixer/mixer_sse41.c)
  782. IF(SSE4_1_SWITCH)
  783. SET_SOURCE_FILES_PROPERTIES(Alc/mixer/mixer_sse41.c PROPERTIES
  784. COMPILE_FLAGS "${SSE4_1_SWITCH}")
  785. ENDIF()
  786. SET(CPU_EXTS "${CPU_EXTS}, SSE4.1")
  787. ENDIF()
  788. ENDIF()
  789. ENDIF()
  790. IF(ALSOFT_REQUIRE_SSE4_1 AND NOT HAVE_SSE4_1)
  791. MESSAGE(FATAL_ERROR "Failed to enable required SSE4.1 CPU extensions")
  792. ENDIF()
  793. # Check for ARM Neon support
  794. OPTION(ALSOFT_REQUIRE_NEON "Require ARM Neon support" OFF)
  795. CHECK_INCLUDE_FILE(arm_neon.h HAVE_ARM_NEON_H ${FPU_NEON_SWITCH})
  796. IF(HAVE_ARM_NEON_H)
  797. OPTION(ALSOFT_CPUEXT_NEON "Enable ARM Neon support" ON)
  798. IF(ALSOFT_CPUEXT_NEON)
  799. SET(HAVE_NEON 1)
  800. SET(ALC_OBJS ${ALC_OBJS} Alc/mixer/mixer_neon.c)
  801. IF(FPU_NEON_SWITCH)
  802. SET_SOURCE_FILES_PROPERTIES(Alc/mixer/mixer_neon.c PROPERTIES
  803. COMPILE_FLAGS "${FPU_NEON_SWITCH}")
  804. ENDIF()
  805. SET(CPU_EXTS "${CPU_EXTS}, Neon")
  806. ENDIF()
  807. ENDIF()
  808. IF(ALSOFT_REQUIRE_NEON AND NOT HAVE_NEON)
  809. MESSAGE(FATAL_ERROR "Failed to enabled required ARM Neon CPU extensions")
  810. ENDIF()
  811. IF(WIN32 OR HAVE_DLFCN_H)
  812. SET(IS_LINKED "")
  813. MACRO(ADD_BACKEND_LIBS _LIBS)
  814. ENDMACRO()
  815. ELSE()
  816. SET(IS_LINKED " (linked)")
  817. MACRO(ADD_BACKEND_LIBS _LIBS)
  818. SET(EXTRA_LIBS ${_LIBS} ${EXTRA_LIBS})
  819. ENDMACRO()
  820. ENDIF()
  821. SET(BACKENDS "")
  822. SET(ALC_OBJS ${ALC_OBJS}
  823. Alc/backends/base.c
  824. Alc/backends/base.h
  825. # Default backends, always available
  826. Alc/backends/loopback.c
  827. Alc/backends/null.c
  828. )
  829. # Check ALSA backend
  830. OPTION(ALSOFT_REQUIRE_ALSA "Require ALSA backend" OFF)
  831. FIND_PACKAGE(ALSA)
  832. IF(ALSA_FOUND)
  833. OPTION(ALSOFT_BACKEND_ALSA "Enable ALSA backend" ON)
  834. IF(ALSOFT_BACKEND_ALSA)
  835. SET(HAVE_ALSA 1)
  836. SET(BACKENDS "${BACKENDS} ALSA${IS_LINKED},")
  837. SET(ALC_OBJS ${ALC_OBJS} Alc/backends/alsa.c)
  838. ADD_BACKEND_LIBS(${ALSA_LIBRARIES})
  839. SET(INC_PATHS ${INC_PATHS} ${ALSA_INCLUDE_DIRS})
  840. ENDIF()
  841. ENDIF()
  842. IF(ALSOFT_REQUIRE_ALSA AND NOT HAVE_ALSA)
  843. MESSAGE(FATAL_ERROR "Failed to enabled required ALSA backend")
  844. ENDIF()
  845. # Check OSS backend
  846. OPTION(ALSOFT_REQUIRE_OSS "Require OSS backend" OFF)
  847. FIND_PACKAGE(OSS)
  848. IF(OSS_FOUND)
  849. OPTION(ALSOFT_BACKEND_OSS "Enable OSS backend" ON)
  850. IF(ALSOFT_BACKEND_OSS)
  851. SET(HAVE_OSS 1)
  852. SET(BACKENDS "${BACKENDS} OSS,")
  853. SET(ALC_OBJS ${ALC_OBJS} Alc/backends/oss.c)
  854. IF(OSS_LIBRARIES)
  855. SET(EXTRA_LIBS ${OSS_LIBRARIES} ${EXTRA_LIBS})
  856. ENDIF()
  857. SET(INC_PATHS ${INC_PATHS} ${OSS_INCLUDE_DIRS})
  858. ENDIF()
  859. ENDIF()
  860. IF(ALSOFT_REQUIRE_OSS AND NOT HAVE_OSS)
  861. MESSAGE(FATAL_ERROR "Failed to enabled required OSS backend")
  862. ENDIF()
  863. # Check Solaris backend
  864. OPTION(ALSOFT_REQUIRE_SOLARIS "Require Solaris backend" OFF)
  865. FIND_PACKAGE(AudioIO)
  866. IF(AUDIOIO_FOUND)
  867. OPTION(ALSOFT_BACKEND_SOLARIS "Enable Solaris backend" ON)
  868. IF(ALSOFT_BACKEND_SOLARIS)
  869. SET(HAVE_SOLARIS 1)
  870. SET(BACKENDS "${BACKENDS} Solaris,")
  871. SET(ALC_OBJS ${ALC_OBJS} Alc/backends/solaris.c)
  872. SET(INC_PATHS ${INC_PATHS} ${AUDIOIO_INCLUDE_DIRS})
  873. ENDIF()
  874. ENDIF()
  875. IF(ALSOFT_REQUIRE_SOLARIS AND NOT HAVE_SOLARIS)
  876. MESSAGE(FATAL_ERROR "Failed to enabled required Solaris backend")
  877. ENDIF()
  878. # Check SndIO backend
  879. OPTION(ALSOFT_REQUIRE_SNDIO "Require SndIO backend" OFF)
  880. FIND_PACKAGE(SoundIO)
  881. IF(SOUNDIO_FOUND)
  882. OPTION(ALSOFT_BACKEND_SNDIO "Enable SndIO backend" ON)
  883. IF(ALSOFT_BACKEND_SNDIO)
  884. SET(HAVE_SNDIO 1)
  885. SET(BACKENDS "${BACKENDS} SndIO (linked),")
  886. SET(ALC_OBJS ${ALC_OBJS} Alc/backends/sndio.c)
  887. SET(EXTRA_LIBS ${SOUNDIO_LIBRARIES} ${EXTRA_LIBS})
  888. SET(INC_PATHS ${INC_PATHS} ${SOUNDIO_INCLUDE_DIRS})
  889. ENDIF()
  890. ENDIF()
  891. IF(ALSOFT_REQUIRE_SNDIO AND NOT HAVE_SNDIO)
  892. MESSAGE(FATAL_ERROR "Failed to enabled required SndIO backend")
  893. ENDIF()
  894. # Check QSA backend
  895. OPTION(ALSOFT_REQUIRE_QSA "Require QSA backend" OFF)
  896. FIND_PACKAGE(QSA)
  897. IF(QSA_FOUND)
  898. OPTION(ALSOFT_BACKEND_QSA "Enable QSA backend" ON)
  899. IF(ALSOFT_BACKEND_QSA)
  900. SET(HAVE_QSA 1)
  901. SET(BACKENDS "${BACKENDS} QSA (linked),")
  902. SET(ALC_OBJS ${ALC_OBJS} Alc/backends/qsa.c)
  903. SET(EXTRA_LIBS ${QSA_LIBRARIES} ${EXTRA_LIBS})
  904. SET(INC_PATHS ${INC_PATHS} ${QSA_INCLUDE_DIRS})
  905. ENDIF()
  906. ENDIF()
  907. IF(ALSOFT_REQUIRE_QSA AND NOT HAVE_QSA)
  908. MESSAGE(FATAL_ERROR "Failed to enabled required QSA backend")
  909. ENDIF()
  910. # Check Windows-only backends
  911. OPTION(ALSOFT_REQUIRE_WINMM "Require Windows Multimedia backend" OFF)
  912. OPTION(ALSOFT_REQUIRE_DSOUND "Require DirectSound backend" OFF)
  913. OPTION(ALSOFT_REQUIRE_WASAPI "Require WASAPI backend" OFF)
  914. IF(HAVE_WINDOWS_H)
  915. SET(OLD_REQUIRED_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS})
  916. SET(CMAKE_REQUIRED_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS} -D_WIN32_WINNT=0x0502)
  917. # Check MMSystem backend
  918. CHECK_INCLUDE_FILES("windows.h;mmsystem.h" HAVE_MMSYSTEM_H)
  919. IF(HAVE_MMSYSTEM_H)
  920. CHECK_SHARED_FUNCTION_EXISTS(waveOutOpen "windows.h;mmsystem.h" winmm "" HAVE_LIBWINMM)
  921. IF(HAVE_LIBWINMM)
  922. OPTION(ALSOFT_BACKEND_WINMM "Enable Windows Multimedia backend" ON)
  923. IF(ALSOFT_BACKEND_WINMM)
  924. SET(HAVE_WINMM 1)
  925. SET(BACKENDS "${BACKENDS} WinMM,")
  926. SET(ALC_OBJS ${ALC_OBJS} Alc/backends/winmm.c)
  927. SET(EXTRA_LIBS winmm ${EXTRA_LIBS})
  928. ENDIF()
  929. ENDIF()
  930. ENDIF()
  931. # Check DSound backend
  932. FIND_PACKAGE(DSound)
  933. IF(DSOUND_FOUND)
  934. OPTION(ALSOFT_BACKEND_DSOUND "Enable DirectSound backend" ON)
  935. IF(ALSOFT_BACKEND_DSOUND)
  936. SET(HAVE_DSOUND 1)
  937. SET(BACKENDS "${BACKENDS} DirectSound${IS_LINKED},")
  938. SET(ALC_OBJS ${ALC_OBJS} Alc/backends/dsound.c)
  939. ADD_BACKEND_LIBS(${DSOUND_LIBRARIES})
  940. SET(INC_PATHS ${INC_PATHS} ${DSOUND_INCLUDE_DIRS})
  941. ENDIF()
  942. ENDIF()
  943. # Check for WASAPI backend
  944. CHECK_INCLUDE_FILE(mmdeviceapi.h HAVE_MMDEVICEAPI_H)
  945. IF(HAVE_MMDEVICEAPI_H)
  946. OPTION(ALSOFT_BACKEND_WASAPI "Enable WASAPI backend" ON)
  947. IF(ALSOFT_BACKEND_WASAPI)
  948. SET(HAVE_WASAPI 1)
  949. SET(BACKENDS "${BACKENDS} WASAPI,")
  950. SET(ALC_OBJS ${ALC_OBJS} Alc/backends/wasapi.c)
  951. ENDIF()
  952. ENDIF()
  953. SET(CMAKE_REQUIRED_DEFINITIONS ${OLD_REQUIRED_DEFINITIONS})
  954. UNSET(OLD_REQUIRED_DEFINITIONS)
  955. ENDIF()
  956. IF(ALSOFT_REQUIRE_WINMM AND NOT HAVE_WINMM)
  957. MESSAGE(FATAL_ERROR "Failed to enabled required WinMM backend")
  958. ENDIF()
  959. IF(ALSOFT_REQUIRE_DSOUND AND NOT HAVE_DSOUND)
  960. MESSAGE(FATAL_ERROR "Failed to enabled required DSound backend")
  961. ENDIF()
  962. IF(ALSOFT_REQUIRE_WASAPI AND NOT HAVE_WASAPI)
  963. MESSAGE(FATAL_ERROR "Failed to enabled required WASAPI backend")
  964. ENDIF()
  965. # Check PortAudio backend
  966. OPTION(ALSOFT_REQUIRE_PORTAUDIO "Require PortAudio backend" OFF)
  967. FIND_PACKAGE(PortAudio)
  968. IF(PORTAUDIO_FOUND)
  969. OPTION(ALSOFT_BACKEND_PORTAUDIO "Enable PortAudio backend" ON)
  970. IF(ALSOFT_BACKEND_PORTAUDIO)
  971. SET(HAVE_PORTAUDIO 1)
  972. SET(BACKENDS "${BACKENDS} PortAudio${IS_LINKED},")
  973. SET(ALC_OBJS ${ALC_OBJS} Alc/backends/portaudio.c)
  974. ADD_BACKEND_LIBS(${PORTAUDIO_LIBRARIES})
  975. SET(INC_PATHS ${INC_PATHS} ${PORTAUDIO_INCLUDE_DIRS})
  976. ENDIF()
  977. ENDIF()
  978. IF(ALSOFT_REQUIRE_PORTAUDIO AND NOT HAVE_PORTAUDIO)
  979. MESSAGE(FATAL_ERROR "Failed to enabled required PortAudio backend")
  980. ENDIF()
  981. # Check PulseAudio backend
  982. OPTION(ALSOFT_REQUIRE_PULSEAUDIO "Require PulseAudio backend" OFF)
  983. FIND_PACKAGE(PulseAudio)
  984. IF(PULSEAUDIO_FOUND)
  985. OPTION(ALSOFT_BACKEND_PULSEAUDIO "Enable PulseAudio backend" ON)
  986. IF(ALSOFT_BACKEND_PULSEAUDIO)
  987. SET(HAVE_PULSEAUDIO 1)
  988. SET(BACKENDS "${BACKENDS} PulseAudio${IS_LINKED},")
  989. SET(ALC_OBJS ${ALC_OBJS} Alc/backends/pulseaudio.c)
  990. ADD_BACKEND_LIBS(${PULSEAUDIO_LIBRARIES})
  991. SET(INC_PATHS ${INC_PATHS} ${PULSEAUDIO_INCLUDE_DIRS})
  992. ENDIF()
  993. ENDIF()
  994. IF(ALSOFT_REQUIRE_PULSEAUDIO AND NOT HAVE_PULSEAUDIO)
  995. MESSAGE(FATAL_ERROR "Failed to enabled required PulseAudio backend")
  996. ENDIF()
  997. # Check JACK backend
  998. OPTION(ALSOFT_REQUIRE_JACK "Require JACK backend" OFF)
  999. FIND_PACKAGE(JACK)
  1000. IF(JACK_FOUND)
  1001. OPTION(ALSOFT_BACKEND_JACK "Enable JACK backend" ON)
  1002. IF(ALSOFT_BACKEND_JACK)
  1003. SET(HAVE_JACK 1)
  1004. SET(BACKENDS "${BACKENDS} JACK${IS_LINKED},")
  1005. SET(ALC_OBJS ${ALC_OBJS} Alc/backends/jack.c)
  1006. ADD_BACKEND_LIBS(${JACK_LIBRARIES})
  1007. SET(INC_PATHS ${INC_PATHS} ${JACK_INCLUDE_DIRS})
  1008. ENDIF()
  1009. ENDIF()
  1010. IF(ALSOFT_REQUIRE_JACK AND NOT HAVE_JACK)
  1011. MESSAGE(FATAL_ERROR "Failed to enabled required JACK backend")
  1012. ENDIF()
  1013. # Check CoreAudio backend
  1014. OPTION(ALSOFT_REQUIRE_COREAUDIO "Require CoreAudio backend" OFF)
  1015. FIND_LIBRARY(COREAUDIO_FRAMEWORK
  1016. NAMES CoreAudio
  1017. PATHS /System/Library/Frameworks
  1018. )
  1019. IF(COREAUDIO_FRAMEWORK)
  1020. OPTION(ALSOFT_BACKEND_COREAUDIO "Enable CoreAudio backend" ON)
  1021. IF(ALSOFT_BACKEND_COREAUDIO)
  1022. SET(HAVE_COREAUDIO 1)
  1023. SET(ALC_OBJS ${ALC_OBJS} Alc/backends/coreaudio.c)
  1024. SET(BACKENDS "${BACKENDS} CoreAudio,")
  1025. SET(EXTRA_LIBS ${COREAUDIO_FRAMEWORK} ${EXTRA_LIBS})
  1026. SET(EXTRA_LIBS /System/Library/Frameworks/AudioUnit.framework ${EXTRA_LIBS})
  1027. SET(EXTRA_LIBS /System/Library/Frameworks/ApplicationServices.framework ${EXTRA_LIBS})
  1028. # Some versions of OSX may need the AudioToolbox framework. Add it if
  1029. # it's found.
  1030. FIND_LIBRARY(AUDIOTOOLBOX_LIBRARY
  1031. NAMES AudioToolbox
  1032. PATHS ~/Library/Frameworks
  1033. /Library/Frameworks
  1034. /System/Library/Frameworks
  1035. )
  1036. IF(AUDIOTOOLBOX_LIBRARY)
  1037. SET(EXTRA_LIBS ${AUDIOTOOLBOX_LIBRARY} ${EXTRA_LIBS})
  1038. ENDIF()
  1039. ENDIF()
  1040. ENDIF()
  1041. IF(ALSOFT_REQUIRE_COREAUDIO AND NOT HAVE_COREAUDIO)
  1042. MESSAGE(FATAL_ERROR "Failed to enabled required CoreAudio backend")
  1043. ENDIF()
  1044. # Check for OpenSL (Android) backend
  1045. OPTION(ALSOFT_REQUIRE_OPENSL "Require OpenSL backend" OFF)
  1046. CHECK_INCLUDE_FILES("SLES/OpenSLES.h;SLES/OpenSLES_Android.h" HAVE_SLES_OPENSLES_ANDROID_H)
  1047. IF(HAVE_SLES_OPENSLES_ANDROID_H)
  1048. CHECK_SHARED_FUNCTION_EXISTS(slCreateEngine "SLES/OpenSLES.h" OpenSLES "" HAVE_LIBOPENSLES)
  1049. IF(HAVE_LIBOPENSLES)
  1050. OPTION(ALSOFT_BACKEND_OPENSL "Enable OpenSL backend" ON)
  1051. IF(ALSOFT_BACKEND_OPENSL)
  1052. SET(HAVE_OPENSL 1)
  1053. SET(ALC_OBJS ${ALC_OBJS} Alc/backends/opensl.c)
  1054. SET(BACKENDS "${BACKENDS} OpenSL,")
  1055. SET(EXTRA_LIBS OpenSLES ${EXTRA_LIBS})
  1056. ENDIF()
  1057. ENDIF()
  1058. ENDIF()
  1059. IF(ALSOFT_REQUIRE_OPENSL AND NOT HAVE_OPENSL)
  1060. MESSAGE(FATAL_ERROR "Failed to enabled required OpenSL backend")
  1061. ENDIF()
  1062. # Check for SDL2 backend
  1063. OPTION(ALSOFT_REQUIRE_SDL2 "Require SDL2 backend" OFF)
  1064. FIND_PACKAGE(SDL2)
  1065. IF(SDL2_FOUND)
  1066. # Off by default, since it adds a runtime dependency
  1067. OPTION(ALSOFT_BACKEND_SDL2 "Enable SDL2 backend" OFF)
  1068. IF(ALSOFT_BACKEND_SDL2)
  1069. SET(HAVE_SDL2 1)
  1070. SET(ALC_OBJS ${ALC_OBJS} Alc/backends/sdl2.c)
  1071. SET(BACKENDS "${BACKENDS} SDL2,")
  1072. SET(EXTRA_LIBS ${SDL2_LIBRARY} ${EXTRA_LIBS})
  1073. SET(INC_PATHS ${INC_PATHS} ${SDL2_INCLUDE_DIR})
  1074. ENDIF()
  1075. ENDIF()
  1076. IF(ALSOFT_REQUIRE_SDL2 AND NOT SDL2_FOUND)
  1077. MESSAGE(FATAL_ERROR "Failed to enabled required SDL2 backend")
  1078. ENDIF()
  1079. # Optionally enable the Wave Writer backend
  1080. OPTION(ALSOFT_BACKEND_WAVE "Enable Wave Writer backend" ON)
  1081. IF(ALSOFT_BACKEND_WAVE)
  1082. SET(HAVE_WAVE 1)
  1083. SET(ALC_OBJS ${ALC_OBJS} Alc/backends/wave.c)
  1084. SET(BACKENDS "${BACKENDS} WaveFile,")
  1085. ENDIF()
  1086. # This is always available
  1087. SET(BACKENDS "${BACKENDS} Null")
  1088. FIND_PACKAGE(Git)
  1089. IF(GIT_FOUND AND EXISTS "${OpenAL_SOURCE_DIR}/.git")
  1090. # Get the current working branch and its latest abbreviated commit hash
  1091. ADD_CUSTOM_TARGET(build_version
  1092. ${CMAKE_COMMAND} -D GIT_EXECUTABLE=${GIT_EXECUTABLE}
  1093. -D LIB_VERSION=${LIB_VERSION}
  1094. -D SRC=${OpenAL_SOURCE_DIR}/version.h.in
  1095. -D DST=${OpenAL_BINARY_DIR}/version.h
  1096. -P ${OpenAL_SOURCE_DIR}/version.cmake
  1097. WORKING_DIRECTORY "${OpenAL_SOURCE_DIR}"
  1098. VERBATIM
  1099. )
  1100. ELSE()
  1101. SET(GIT_BRANCH "UNKNOWN")
  1102. SET(GIT_COMMIT_HASH "unknown")
  1103. CONFIGURE_FILE(
  1104. "${OpenAL_SOURCE_DIR}/version.h.in"
  1105. "${OpenAL_BINARY_DIR}/version.h")
  1106. ENDIF()
  1107. SET(NATIVE_SRC_DIR "${OpenAL_SOURCE_DIR}/native-tools/")
  1108. SET(NATIVE_BIN_DIR "${OpenAL_BINARY_DIR}/native-tools/")
  1109. FILE(MAKE_DIRECTORY "${NATIVE_BIN_DIR}")
  1110. SET(BIN2H_COMMAND "${NATIVE_BIN_DIR}bin2h")
  1111. SET(BSINCGEN_COMMAND "${NATIVE_BIN_DIR}bsincgen")
  1112. ADD_CUSTOM_COMMAND(OUTPUT "${BIN2H_COMMAND}" "${BSINCGEN_COMMAND}"
  1113. COMMAND ${CMAKE_COMMAND} -G "${CMAKE_GENERATOR}" "${NATIVE_SRC_DIR}"
  1114. COMMAND ${CMAKE_COMMAND} -E remove "${BIN2H_COMMAND}" "${BSINCGEN_COMMAND}"
  1115. COMMAND ${CMAKE_COMMAND} --build . --config "Release"
  1116. WORKING_DIRECTORY "${NATIVE_BIN_DIR}"
  1117. DEPENDS "${NATIVE_SRC_DIR}CMakeLists.txt"
  1118. IMPLICIT_DEPENDS C "${NATIVE_SRC_DIR}bin2h.c"
  1119. C "${NATIVE_SRC_DIR}bsincgen.c"
  1120. VERBATIM
  1121. )
  1122. ADD_CUSTOM_TARGET(native-tools
  1123. DEPENDS "${BIN2H_COMMAND}" "${BSINCGEN_COMMAND}"
  1124. VERBATIM
  1125. )
  1126. option(ALSOFT_EMBED_HRTF_DATA "Embed the HRTF data files (increases library footprint)" OFF)
  1127. if(ALSOFT_EMBED_HRTF_DATA)
  1128. MACRO(make_hrtf_header FILENAME VARNAME)
  1129. SET(infile "${OpenAL_SOURCE_DIR}/hrtf/${FILENAME}")
  1130. SET(outfile "${OpenAL_BINARY_DIR}/${FILENAME}.h")
  1131. ADD_CUSTOM_COMMAND(OUTPUT "${outfile}"
  1132. COMMAND "${BIN2H_COMMAND}" "${infile}" "${outfile}" ${VARNAME}
  1133. DEPENDS native-tools "${infile}"
  1134. VERBATIM
  1135. )
  1136. SET(ALC_OBJS ${ALC_OBJS} "${outfile}")
  1137. ENDMACRO()
  1138. make_hrtf_header(default-44100.mhr "hrtf_default_44100")
  1139. make_hrtf_header(default-48000.mhr "hrtf_default_48000")
  1140. endif()
  1141. ADD_CUSTOM_COMMAND(OUTPUT "${OpenAL_BINARY_DIR}/bsinc_inc.h"
  1142. COMMAND "${BSINCGEN_COMMAND}" "${OpenAL_BINARY_DIR}/bsinc_inc.h"
  1143. DEPENDS native-tools "${NATIVE_SRC_DIR}bsincgen.c"
  1144. VERBATIM
  1145. )
  1146. SET(ALC_OBJS ${ALC_OBJS} "${OpenAL_BINARY_DIR}/bsinc_inc.h")
  1147. IF(ALSOFT_UTILS AND NOT ALSOFT_NO_CONFIG_UTIL)
  1148. add_subdirectory(utils/alsoft-config)
  1149. ENDIF()
  1150. IF(ALSOFT_EXAMPLES)
  1151. IF(NOT SDL2_FOUND)
  1152. FIND_PACKAGE(SDL2)
  1153. ENDIF()
  1154. IF(SDL2_FOUND)
  1155. FIND_PACKAGE(SDL_sound)
  1156. FIND_PACKAGE(FFmpeg COMPONENTS AVFORMAT AVCODEC AVUTIL SWSCALE SWRESAMPLE)
  1157. ENDIF()
  1158. ENDIF()
  1159. IF(NOT WIN32)
  1160. SET(LIBNAME "openal")
  1161. ELSE()
  1162. SET(LIBNAME "OpenAL32")
  1163. ENDIF()
  1164. # Needed for openal.pc.in
  1165. SET(prefix ${CMAKE_INSTALL_PREFIX})
  1166. SET(exec_prefix "\${prefix}")
  1167. SET(libdir "\${exec_prefix}/${CMAKE_INSTALL_LIBDIR}")
  1168. SET(bindir "\${exec_prefix}/${CMAKE_INSTALL_BINDIR}")
  1169. SET(includedir "\${prefix}/${CMAKE_INSTALL_INCLUDEDIR}")
  1170. SET(PACKAGE_VERSION "${LIB_VERSION}")
  1171. SET(PKG_CONFIG_CFLAGS )
  1172. SET(PKG_CONFIG_PRIVATE_LIBS )
  1173. IF(LIBTYPE STREQUAL "STATIC")
  1174. SET(PKG_CONFIG_CFLAGS -DAL_LIBTYPE_STATIC)
  1175. FOREACH(FLAG ${LINKER_FLAGS} ${EXTRA_LIBS} ${MATH_LIB})
  1176. # If this is already a linker flag, or is a full path+file, add it
  1177. # as-is. Otherwise, it's a name intended to be dressed as -lname.
  1178. IF(FLAG MATCHES "^-.*" OR EXISTS "${FLAG}")
  1179. SET(PKG_CONFIG_PRIVATE_LIBS "${PKG_CONFIG_PRIVATE_LIBS} ${FLAG}")
  1180. ELSE()
  1181. SET(PKG_CONFIG_PRIVATE_LIBS "${PKG_CONFIG_PRIVATE_LIBS} -l${FLAG}")
  1182. ENDIF()
  1183. ENDFOREACH()
  1184. ENDIF()
  1185. # End configuration
  1186. CONFIGURE_FILE(
  1187. "${OpenAL_SOURCE_DIR}/config.h.in"
  1188. "${OpenAL_BINARY_DIR}/config.h")
  1189. CONFIGURE_FILE(
  1190. "${OpenAL_SOURCE_DIR}/openal.pc.in"
  1191. "${OpenAL_BINARY_DIR}/openal.pc"
  1192. @ONLY)
  1193. # Add a static library with common functions used by multiple targets
  1194. ADD_LIBRARY(common STATIC ${COMMON_OBJS})
  1195. TARGET_COMPILE_DEFINITIONS(common PRIVATE ${CPP_DEFS})
  1196. TARGET_COMPILE_OPTIONS(common PRIVATE ${C_FLAGS})
  1197. UNSET(HAS_ROUTER)
  1198. SET(IMPL_TARGET OpenAL)
  1199. SET(COMMON_LIB )
  1200. SET(SUBSYS_FLAG )
  1201. # Build main library
  1202. IF(LIBTYPE STREQUAL "STATIC")
  1203. SET(CPP_DEFS ${CPP_DEFS} AL_LIBTYPE_STATIC)
  1204. IF(WIN32 AND ALSOFT_NO_UID_DEFS)
  1205. SET(CPP_DEFS ${CPP_DEFS} AL_NO_UID_DEFS)
  1206. ENDIF()
  1207. ADD_LIBRARY(OpenAL STATIC ${COMMON_OBJS} ${OPENAL_OBJS} ${ALC_OBJS})
  1208. ELSE()
  1209. # Make sure to compile the common code with PIC, since it'll be linked into
  1210. # shared libs that needs it.
  1211. SET_PROPERTY(TARGET common PROPERTY POSITION_INDEPENDENT_CODE TRUE)
  1212. SET(COMMON_LIB common)
  1213. IF(WIN32)
  1214. IF(MSVC)
  1215. SET(SUBSYS_FLAG ${SUBSYS_FLAG} "/SUBSYSTEM:WINDOWS")
  1216. ELSEIF(CMAKE_COMPILER_IS_GNUCC)
  1217. SET(SUBSYS_FLAG ${SUBSYS_FLAG} "-mwindows")
  1218. ENDIF()
  1219. ENDIF()
  1220. IF(WIN32 AND ALSOFT_BUILD_ROUTER)
  1221. ADD_LIBRARY(OpenAL SHARED router/router.c router/router.h router/alc.c router/al.c)
  1222. TARGET_COMPILE_DEFINITIONS(OpenAL
  1223. PRIVATE AL_BUILD_LIBRARY AL_ALEXT_PROTOTYPES ${CPP_DEFS})
  1224. TARGET_COMPILE_OPTIONS(OpenAL PRIVATE ${C_FLAGS})
  1225. TARGET_LINK_LIBRARIES(OpenAL PRIVATE ${LINKER_FLAGS} ${COMMON_LIB})
  1226. SET_TARGET_PROPERTIES(OpenAL PROPERTIES PREFIX "")
  1227. SET_TARGET_PROPERTIES(OpenAL PROPERTIES OUTPUT_NAME ${LIBNAME})
  1228. IF(TARGET build_version)
  1229. ADD_DEPENDENCIES(OpenAL build_version)
  1230. ENDIF()
  1231. SET(HAS_ROUTER 1)
  1232. SET(LIBNAME "soft_oal")
  1233. SET(IMPL_TARGET soft_oal)
  1234. ENDIF()
  1235. ADD_LIBRARY(${IMPL_TARGET} SHARED ${OPENAL_OBJS} ${ALC_OBJS})
  1236. IF(WIN32)
  1237. SET_TARGET_PROPERTIES(${IMPL_TARGET} PROPERTIES PREFIX "")
  1238. ENDIF()
  1239. ENDIF()
  1240. SET_TARGET_PROPERTIES(${IMPL_TARGET} PROPERTIES OUTPUT_NAME ${LIBNAME}
  1241. VERSION ${LIB_VERSION}
  1242. SOVERSION ${LIB_MAJOR_VERSION}
  1243. )
  1244. TARGET_COMPILE_DEFINITIONS(${IMPL_TARGET}
  1245. PRIVATE AL_BUILD_LIBRARY AL_ALEXT_PROTOTYPES ${CPP_DEFS})
  1246. TARGET_INCLUDE_DIRECTORIES(${IMPL_TARGET}
  1247. PRIVATE "${OpenAL_SOURCE_DIR}/OpenAL32/Include" "${OpenAL_SOURCE_DIR}/Alc" ${INC_PATHS})
  1248. TARGET_COMPILE_OPTIONS(${IMPL_TARGET} PRIVATE ${C_FLAGS})
  1249. TARGET_LINK_LIBRARIES(${IMPL_TARGET}
  1250. PRIVATE ${LINKER_FLAGS} ${COMMON_LIB} ${EXTRA_LIBS} ${MATH_LIB})
  1251. IF(TARGET build_version)
  1252. ADD_DEPENDENCIES(${IMPL_TARGET} build_version)
  1253. ENDIF()
  1254. IF(WIN32 AND MINGW AND ALSOFT_BUILD_IMPORT_LIB AND NOT LIBTYPE STREQUAL "STATIC")
  1255. FIND_PROGRAM(SED_EXECUTABLE NAMES sed DOC "sed executable")
  1256. FIND_PROGRAM(DLLTOOL_EXECUTABLE NAMES "${DLLTOOL}" DOC "dlltool executable")
  1257. IF(NOT SED_EXECUTABLE OR NOT DLLTOOL_EXECUTABLE)
  1258. MESSAGE(STATUS "")
  1259. IF(NOT SED_EXECUTABLE)
  1260. MESSAGE(STATUS "WARNING: Cannot find sed, disabling .def/.lib generation")
  1261. ENDIF()
  1262. IF(NOT DLLTOOL_EXECUTABLE)
  1263. MESSAGE(STATUS "WARNING: Cannot find dlltool, disabling .def/.lib generation")
  1264. ENDIF()
  1265. ELSE()
  1266. SET_PROPERTY(TARGET OpenAL APPEND_STRING PROPERTY LINK_FLAGS
  1267. " -Wl,--output-def,OpenAL32.def")
  1268. ADD_CUSTOM_COMMAND(TARGET OpenAL POST_BUILD
  1269. COMMAND "${SED_EXECUTABLE}" -i -e "s/ @[^ ]*//" OpenAL32.def
  1270. COMMAND "${DLLTOOL_EXECUTABLE}" -d OpenAL32.def -l OpenAL32.lib -D OpenAL32.dll
  1271. COMMENT "Stripping ordinals from OpenAL32.def and generating OpenAL32.lib..."
  1272. VERBATIM
  1273. )
  1274. ENDIF()
  1275. ENDIF()
  1276. IF(ALSOFT_INSTALL)
  1277. INSTALL(TARGETS OpenAL EXPORT OpenAL
  1278. RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
  1279. LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
  1280. ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
  1281. INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} ${CMAKE_INSTALL_INCLUDEDIR}/AL
  1282. )
  1283. EXPORT(TARGETS OpenAL
  1284. NAMESPACE OpenAL::
  1285. FILE OpenALConfig.cmake)
  1286. INSTALL(EXPORT OpenAL
  1287. DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/OpenAL
  1288. NAMESPACE OpenAL::
  1289. FILE OpenALConfig.cmake)
  1290. INSTALL(FILES include/AL/al.h
  1291. include/AL/alc.h
  1292. include/AL/alext.h
  1293. include/AL/efx.h
  1294. include/AL/efx-creative.h
  1295. include/AL/efx-presets.h
  1296. DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/AL
  1297. )
  1298. INSTALL(FILES "${OpenAL_BINARY_DIR}/openal.pc"
  1299. DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig")
  1300. IF(TARGET soft_oal)
  1301. INSTALL(TARGETS soft_oal
  1302. RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
  1303. )
  1304. ENDIF()
  1305. ENDIF()
  1306. if(HAS_ROUTER)
  1307. message(STATUS "")
  1308. message(STATUS "Building DLL router")
  1309. endif()
  1310. MESSAGE(STATUS "")
  1311. MESSAGE(STATUS "Building OpenAL with support for the following backends:")
  1312. MESSAGE(STATUS " ${BACKENDS}")
  1313. MESSAGE(STATUS "")
  1314. MESSAGE(STATUS "Building with support for CPU extensions:")
  1315. MESSAGE(STATUS " ${CPU_EXTS}")
  1316. MESSAGE(STATUS "")
  1317. IF(WIN32)
  1318. IF(NOT HAVE_DSOUND)
  1319. MESSAGE(STATUS "WARNING: Building the Windows version without DirectSound output")
  1320. MESSAGE(STATUS " This is probably NOT what you want!")
  1321. MESSAGE(STATUS "")
  1322. ENDIF()
  1323. ENDIF()
  1324. if(ALSOFT_EMBED_HRTF_DATA)
  1325. message(STATUS "Embedding HRTF datasets")
  1326. message(STATUS "")
  1327. endif()
  1328. # Install alsoft.conf configuration file
  1329. IF(ALSOFT_CONFIG)
  1330. INSTALL(FILES alsoftrc.sample
  1331. DESTINATION ${CMAKE_INSTALL_DATADIR}/openal
  1332. )
  1333. MESSAGE(STATUS "Installing sample configuration")
  1334. MESSAGE(STATUS "")
  1335. ENDIF()
  1336. # Install HRTF definitions
  1337. IF(ALSOFT_HRTF_DEFS)
  1338. INSTALL(FILES hrtf/default-44100.mhr
  1339. hrtf/default-48000.mhr
  1340. DESTINATION ${CMAKE_INSTALL_DATADIR}/openal/hrtf
  1341. )
  1342. MESSAGE(STATUS "Installing HRTF definitions")
  1343. MESSAGE(STATUS "")
  1344. ENDIF()
  1345. # Install AmbDec presets
  1346. IF(ALSOFT_AMBDEC_PRESETS)
  1347. INSTALL(FILES presets/3D7.1.ambdec
  1348. presets/hexagon.ambdec
  1349. presets/itu5.1.ambdec
  1350. presets/itu5.1-nocenter.ambdec
  1351. presets/rectangle.ambdec
  1352. presets/square.ambdec
  1353. presets/presets.txt
  1354. DESTINATION ${CMAKE_INSTALL_DATADIR}/openal/presets
  1355. )
  1356. MESSAGE(STATUS "Installing AmbDec presets")
  1357. MESSAGE(STATUS "")
  1358. ENDIF()
  1359. IF(ALSOFT_UTILS)
  1360. ADD_EXECUTABLE(openal-info utils/openal-info.c)
  1361. TARGET_COMPILE_OPTIONS(openal-info PRIVATE ${C_FLAGS})
  1362. TARGET_LINK_LIBRARIES(openal-info PRIVATE ${LINKER_FLAGS} OpenAL)
  1363. SET(MAKEHRTF_SRCS utils/makehrtf.c)
  1364. IF(NOT HAVE_GETOPT)
  1365. SET(MAKEHRTF_SRCS ${MAKEHRTF_SRCS} utils/getopt.c utils/getopt.h)
  1366. ENDIF()
  1367. ADD_EXECUTABLE(makehrtf ${MAKEHRTF_SRCS})
  1368. TARGET_COMPILE_DEFINITIONS(makehrtf PRIVATE ${CPP_DEFS})
  1369. TARGET_COMPILE_OPTIONS(makehrtf PRIVATE ${C_FLAGS})
  1370. IF(HAVE_LIBM)
  1371. TARGET_LINK_LIBRARIES(makehrtf PRIVATE ${LINKER_FLAGS} m)
  1372. ENDIF()
  1373. IF(ALSOFT_INSTALL)
  1374. INSTALL(TARGETS openal-info makehrtf
  1375. RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
  1376. LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
  1377. ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
  1378. )
  1379. ENDIF()
  1380. MESSAGE(STATUS "Building utility programs")
  1381. IF(TARGET alsoft-config)
  1382. MESSAGE(STATUS "Building configuration program")
  1383. ENDIF()
  1384. MESSAGE(STATUS "")
  1385. ENDIF()
  1386. IF(ALSOFT_TESTS)
  1387. SET(TEST_COMMON_OBJS examples/common/alhelpers.c)
  1388. ADD_EXECUTABLE(altonegen examples/altonegen.c ${TEST_COMMON_OBJS})
  1389. TARGET_COMPILE_DEFINITIONS(altonegen PRIVATE ${CPP_DEFS})
  1390. TARGET_COMPILE_OPTIONS(altonegen PRIVATE ${C_FLAGS})
  1391. TARGET_LINK_LIBRARIES(altonegen PRIVATE ${LINKER_FLAGS} common OpenAL ${MATH_LIB})
  1392. IF(ALSOFT_INSTALL)
  1393. INSTALL(TARGETS altonegen
  1394. RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
  1395. LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
  1396. ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
  1397. )
  1398. ENDIF()
  1399. MESSAGE(STATUS "Building test programs")
  1400. MESSAGE(STATUS "")
  1401. ENDIF()
  1402. IF(ALSOFT_EXAMPLES)
  1403. ADD_EXECUTABLE(alrecord examples/alrecord.c)
  1404. TARGET_COMPILE_DEFINITIONS(alrecord PRIVATE ${CPP_DEFS})
  1405. TARGET_COMPILE_OPTIONS(alrecord PRIVATE ${C_FLAGS})
  1406. TARGET_LINK_LIBRARIES(alrecord PRIVATE ${LINKER_FLAGS} common OpenAL)
  1407. IF(ALSOFT_INSTALL)
  1408. INSTALL(TARGETS alrecord
  1409. RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
  1410. LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
  1411. ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
  1412. )
  1413. ENDIF()
  1414. MESSAGE(STATUS "Building example programs")
  1415. IF(SDL2_FOUND)
  1416. IF(SDL_SOUND_FOUND)
  1417. # Add a static library with common functions used by multiple targets
  1418. ADD_LIBRARY(ex-common STATIC examples/common/alhelpers.c)
  1419. TARGET_COMPILE_DEFINITIONS(ex-common PRIVATE ${CPP_DEFS})
  1420. TARGET_COMPILE_OPTIONS(ex-common PRIVATE ${C_FLAGS})
  1421. ADD_EXECUTABLE(alplay examples/alplay.c)
  1422. TARGET_COMPILE_DEFINITIONS(alplay PRIVATE ${CPP_DEFS})
  1423. TARGET_INCLUDE_DIRECTORIES(alplay
  1424. PRIVATE ${SDL2_INCLUDE_DIR} ${SDL_SOUND_INCLUDE_DIR})
  1425. TARGET_COMPILE_OPTIONS(alplay PRIVATE ${C_FLAGS})
  1426. TARGET_LINK_LIBRARIES(alplay
  1427. PRIVATE ${LINKER_FLAGS} ${SDL_SOUND_LIBRARIES} ${SDL2_LIBRARY} ex-common common
  1428. OpenAL)
  1429. ADD_EXECUTABLE(alstream examples/alstream.c)
  1430. TARGET_COMPILE_DEFINITIONS(alstream PRIVATE ${CPP_DEFS})
  1431. TARGET_INCLUDE_DIRECTORIES(alstream
  1432. PRIVATE ${SDL2_INCLUDE_DIR} ${SDL_SOUND_INCLUDE_DIR})
  1433. TARGET_COMPILE_OPTIONS(alstream PRIVATE ${C_FLAGS})
  1434. TARGET_LINK_LIBRARIES(alstream
  1435. PRIVATE ${LINKER_FLAGS} ${SDL_SOUND_LIBRARIES} ${SDL2_LIBRARY} ex-common common
  1436. OpenAL)
  1437. ADD_EXECUTABLE(alreverb examples/alreverb.c)
  1438. TARGET_COMPILE_DEFINITIONS(alreverb PRIVATE ${CPP_DEFS})
  1439. TARGET_INCLUDE_DIRECTORIES(alreverb
  1440. PRIVATE ${SDL2_INCLUDE_DIR} ${SDL_SOUND_INCLUDE_DIR})
  1441. TARGET_COMPILE_OPTIONS(alreverb PRIVATE ${C_FLAGS})
  1442. TARGET_LINK_LIBRARIES(alreverb
  1443. PRIVATE ${LINKER_FLAGS} ${SDL_SOUND_LIBRARIES} ${SDL2_LIBRARY} ex-common common
  1444. OpenAL)
  1445. ADD_EXECUTABLE(almultireverb examples/almultireverb.c)
  1446. TARGET_COMPILE_DEFINITIONS(almultireverb PRIVATE ${CPP_DEFS})
  1447. TARGET_INCLUDE_DIRECTORIES(almultireverb
  1448. PRIVATE ${SDL2_INCLUDE_DIR} ${SDL_SOUND_INCLUDE_DIR})
  1449. TARGET_COMPILE_OPTIONS(almultireverb PRIVATE ${C_FLAGS})
  1450. TARGET_LINK_LIBRARIES(almultireverb
  1451. PRIVATE ${LINKER_FLAGS} ${SDL_SOUND_LIBRARIES} ${SDL2_LIBRARY} ex-common common
  1452. OpenAL ${MATH_LIB})
  1453. ADD_EXECUTABLE(allatency examples/allatency.c)
  1454. TARGET_COMPILE_DEFINITIONS(allatency PRIVATE ${CPP_DEFS})
  1455. TARGET_INCLUDE_DIRECTORIES(allatency
  1456. PRIVATE ${SDL2_INCLUDE_DIR} ${SDL_SOUND_INCLUDE_DIR})
  1457. TARGET_COMPILE_OPTIONS(allatency PRIVATE ${C_FLAGS})
  1458. TARGET_LINK_LIBRARIES(allatency
  1459. PRIVATE ${LINKER_FLAGS} ${SDL_SOUND_LIBRARIES} ${SDL2_LIBRARY} ex-common common
  1460. OpenAL)
  1461. ADD_EXECUTABLE(alloopback examples/alloopback.c)
  1462. TARGET_COMPILE_DEFINITIONS(alloopback PRIVATE ${CPP_DEFS})
  1463. TARGET_INCLUDE_DIRECTORIES(alloopback
  1464. PRIVATE ${SDL2_INCLUDE_DIR} ${SDL_SOUND_INCLUDE_DIR})
  1465. TARGET_COMPILE_OPTIONS(alloopback PRIVATE ${C_FLAGS})
  1466. TARGET_LINK_LIBRARIES(alloopback
  1467. PRIVATE ${LINKER_FLAGS} ${SDL_SOUND_LIBRARIES} ${SDL2_LIBRARY} ex-common common
  1468. OpenAL ${MATH_LIB})
  1469. ADD_EXECUTABLE(alhrtf examples/alhrtf.c)
  1470. TARGET_COMPILE_DEFINITIONS(alhrtf PRIVATE ${CPP_DEFS})
  1471. TARGET_INCLUDE_DIRECTORIES(alhrtf
  1472. PRIVATE ${SDL2_INCLUDE_DIR} ${SDL_SOUND_INCLUDE_DIR})
  1473. TARGET_COMPILE_OPTIONS(alhrtf PRIVATE ${C_FLAGS})
  1474. TARGET_LINK_LIBRARIES(alhrtf
  1475. PRIVATE ${LINKER_FLAGS} ${SDL_SOUND_LIBRARIES} ${SDL2_LIBRARY} ex-common common
  1476. OpenAL ${MATH_LIB})
  1477. IF(ALSOFT_INSTALL)
  1478. INSTALL(TARGETS alplay alstream alreverb almultireverb allatency alloopback alhrtf
  1479. RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
  1480. LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
  1481. ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
  1482. )
  1483. ENDIF()
  1484. MESSAGE(STATUS "Building SDL_sound example programs")
  1485. ENDIF()
  1486. SET(FFVER_OK FALSE)
  1487. IF(FFMPEG_FOUND)
  1488. SET(FFVER_OK TRUE)
  1489. IF(AVFORMAT_VERSION VERSION_LESS "57.56.101")
  1490. MESSAGE(STATUS "libavformat is too old! (${AVFORMAT_VERSION}, wanted 57.56.101)")
  1491. SET(FFVER_OK FALSE)
  1492. ENDIF()
  1493. IF(AVCODEC_VERSION VERSION_LESS "57.64.101")
  1494. MESSAGE(STATUS "libavcodec is too old! (${AVCODEC_VERSION}, wanted 57.64.101)")
  1495. SET(FFVER_OK FALSE)
  1496. ENDIF()
  1497. IF(AVUTIL_VERSION VERSION_LESS "55.34.101")
  1498. MESSAGE(STATUS "libavutil is too old! (${AVUTIL_VERSION}, wanted 55.34.101)")
  1499. SET(FFVER_OK FALSE)
  1500. ENDIF()
  1501. IF(SWSCALE_VERSION VERSION_LESS "4.2.100")
  1502. MESSAGE(STATUS "libswscale is too old! (${SWSCALE_VERSION}, wanted 4.2.100)")
  1503. SET(FFVER_OK FALSE)
  1504. ENDIF()
  1505. IF(SWRESAMPLE_VERSION VERSION_LESS "2.3.100")
  1506. MESSAGE(STATUS "libswresample is too old! (${SWRESAMPLE_VERSION}, wanted 2.3.100)")
  1507. SET(FFVER_OK FALSE)
  1508. ENDIF()
  1509. ENDIF()
  1510. IF(FFVER_OK)
  1511. ADD_EXECUTABLE(alffplay examples/alffplay.cpp)
  1512. TARGET_COMPILE_DEFINITIONS(alffplay PRIVATE ${CPP_DEFS})
  1513. TARGET_INCLUDE_DIRECTORIES(alffplay
  1514. PRIVATE ${SDL2_INCLUDE_DIR} ${FFMPEG_INCLUDE_DIRS})
  1515. TARGET_COMPILE_OPTIONS(alffplay PRIVATE ${C_FLAGS})
  1516. TARGET_LINK_LIBRARIES(alffplay
  1517. PRIVATE ${LINKER_FLAGS} ${SDL2_LIBRARY} ${FFMPEG_LIBRARIES} common OpenAL)
  1518. IF(ALSOFT_INSTALL)
  1519. INSTALL(TARGETS alffplay
  1520. RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
  1521. LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
  1522. ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
  1523. )
  1524. ENDIF()
  1525. MESSAGE(STATUS "Building SDL+FFmpeg example programs")
  1526. ENDIF()
  1527. MESSAGE(STATUS "")
  1528. ENDIF()
  1529. ENDIF()