CMakeLists.txt 59 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770
  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 "19")
  82. SET(LIB_REVISION "0")
  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. SET(FPMATH_SET "0")
  371. IF(CMAKE_SIZEOF_VOID_P MATCHES "4")
  372. IF(SSE_SWITCH OR MSVC)
  373. OPTION(ALSOFT_ENABLE_SSE_CODEGEN "Enable SSE code generation instead of x87 for 32-bit targets." TRUE)
  374. ENDIF()
  375. IF(SSE2_SWITCH OR MSVC)
  376. OPTION(ALSOFT_ENABLE_SSE2_CODEGEN "Enable SSE2 code generation instead of x87 for 32-bit targets." TRUE)
  377. ENDIF()
  378. IF(ALSOFT_ENABLE_SSE2_CODEGEN)
  379. IF(SSE2_SWITCH)
  380. CHECK_C_COMPILER_FLAG("${SSE2_SWITCH} -mfpmath=sse" HAVE_MFPMATH_SSE_2)
  381. IF(HAVE_MFPMATH_SSE_2)
  382. SET(C_FLAGS ${C_FLAGS} ${SSE2_SWITCH} -mfpmath=sse)
  383. SET(FPMATH_SET 2)
  384. ENDIF()
  385. ELSEIF(MSVC)
  386. CHECK_C_COMPILER_FLAG("/arch:SSE2" HAVE_ARCH_SSE2)
  387. IF(HAVE_ARCH_SSE2)
  388. SET(C_FLAGS ${C_FLAGS} "/arch:SSE2")
  389. SET(FPMATH_SET 2)
  390. ENDIF()
  391. ENDIF()
  392. ENDIF()
  393. IF(ALSOFT_ENABLE_SSE_CODEGEN AND NOT FPMATH_SET)
  394. IF(SSE_SWITCH)
  395. CHECK_C_COMPILER_FLAG("${SSE_SWITCH} -mfpmath=sse" HAVE_MFPMATH_SSE)
  396. IF(HAVE_MFPMATH_SSE)
  397. SET(C_FLAGS ${C_FLAGS} ${SSE_SWITCH} -mfpmath=sse)
  398. SET(FPMATH_SET 1)
  399. ENDIF()
  400. ELSEIF(MSVC)
  401. CHECK_C_COMPILER_FLAG("/arch:SSE" HAVE_ARCH_SSE)
  402. IF(HAVE_ARCH_SSE)
  403. SET(C_FLAGS ${C_FLAGS} "/arch:SSE")
  404. SET(FPMATH_SET 1)
  405. ENDIF()
  406. ENDIF()
  407. ENDIF()
  408. ENDIF()
  409. CHECK_C_SOURCE_COMPILES("int foo(const char *str, ...) __attribute__((format(printf, 1, 2)));
  410. int main() {return 0;}" HAVE_GCC_FORMAT)
  411. CHECK_INCLUDE_FILE(stdbool.h HAVE_STDBOOL_H)
  412. CHECK_INCLUDE_FILE(stdalign.h HAVE_STDALIGN_H)
  413. CHECK_INCLUDE_FILE(malloc.h HAVE_MALLOC_H)
  414. CHECK_INCLUDE_FILE(dirent.h HAVE_DIRENT_H)
  415. CHECK_INCLUDE_FILE(strings.h HAVE_STRINGS_H)
  416. CHECK_INCLUDE_FILE(cpuid.h HAVE_CPUID_H)
  417. CHECK_INCLUDE_FILE(intrin.h HAVE_INTRIN_H)
  418. CHECK_INCLUDE_FILE(sys/sysconf.h HAVE_SYS_SYSCONF_H)
  419. CHECK_INCLUDE_FILE(fenv.h HAVE_FENV_H)
  420. CHECK_INCLUDE_FILE(float.h HAVE_FLOAT_H)
  421. CHECK_INCLUDE_FILE(ieeefp.h HAVE_IEEEFP_H)
  422. CHECK_INCLUDE_FILE(guiddef.h HAVE_GUIDDEF_H)
  423. IF(NOT HAVE_GUIDDEF_H)
  424. CHECK_INCLUDE_FILE(initguid.h HAVE_INITGUID_H)
  425. ENDIF()
  426. # Some systems need libm for some of the following math functions to work
  427. SET(MATH_LIB )
  428. CHECK_LIBRARY_EXISTS(m pow "" HAVE_LIBM)
  429. IF(HAVE_LIBM)
  430. SET(MATH_LIB ${MATH_LIB} m)
  431. SET(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} m)
  432. ENDIF()
  433. # Check for the dlopen API (for dynamicly loading backend libs)
  434. IF(ALSOFT_DLOPEN)
  435. CHECK_LIBRARY_EXISTS(dl dlopen "" HAVE_LIBDL)
  436. IF(HAVE_LIBDL)
  437. SET(EXTRA_LIBS dl ${EXTRA_LIBS})
  438. SET(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} dl)
  439. ENDIF()
  440. CHECK_INCLUDE_FILE(dlfcn.h HAVE_DLFCN_H)
  441. ENDIF()
  442. # Check for a cpuid intrinsic
  443. IF(HAVE_CPUID_H)
  444. CHECK_C_SOURCE_COMPILES("#include <cpuid.h>
  445. int main()
  446. {
  447. unsigned int eax, ebx, ecx, edx;
  448. return __get_cpuid(0, &eax, &ebx, &ecx, &edx);
  449. }" HAVE_GCC_GET_CPUID)
  450. ENDIF()
  451. IF(HAVE_INTRIN_H)
  452. CHECK_C_SOURCE_COMPILES("#include <intrin.h>
  453. int main()
  454. {
  455. int regs[4];
  456. __cpuid(regs, 0);
  457. return regs[0];
  458. }" HAVE_CPUID_INTRINSIC)
  459. CHECK_C_SOURCE_COMPILES("#include <intrin.h>
  460. int main()
  461. {
  462. unsigned long idx = 0;
  463. _BitScanForward64(&idx, 1);
  464. return idx;
  465. }" HAVE_BITSCANFORWARD64_INTRINSIC)
  466. CHECK_C_SOURCE_COMPILES("#include <intrin.h>
  467. int main()
  468. {
  469. unsigned long idx = 0;
  470. _BitScanForward(&idx, 1);
  471. return idx;
  472. }" HAVE_BITSCANFORWARD_INTRINSIC)
  473. ENDIF()
  474. CHECK_SYMBOL_EXISTS(sysconf unistd.h HAVE_SYSCONF)
  475. CHECK_SYMBOL_EXISTS(aligned_alloc stdlib.h HAVE_ALIGNED_ALLOC)
  476. CHECK_SYMBOL_EXISTS(posix_memalign stdlib.h HAVE_POSIX_MEMALIGN)
  477. CHECK_SYMBOL_EXISTS(_aligned_malloc malloc.h HAVE__ALIGNED_MALLOC)
  478. CHECK_SYMBOL_EXISTS(proc_pidpath libproc.h HAVE_PROC_PIDPATH)
  479. CHECK_SYMBOL_EXISTS(lrintf math.h HAVE_LRINTF)
  480. CHECK_SYMBOL_EXISTS(modff math.h HAVE_MODFF)
  481. CHECK_SYMBOL_EXISTS(log2f math.h HAVE_LOG2F)
  482. CHECK_SYMBOL_EXISTS(cbrtf math.h HAVE_CBRTF)
  483. CHECK_SYMBOL_EXISTS(copysignf math.h HAVE_COPYSIGNF)
  484. IF(HAVE_FLOAT_H)
  485. CHECK_SYMBOL_EXISTS(_controlfp float.h HAVE__CONTROLFP)
  486. CHECK_SYMBOL_EXISTS(__control87_2 float.h HAVE___CONTROL87_2)
  487. ENDIF()
  488. CHECK_FUNCTION_EXISTS(stat HAVE_STAT)
  489. CHECK_FUNCTION_EXISTS(strtof HAVE_STRTOF)
  490. CHECK_FUNCTION_EXISTS(strcasecmp HAVE_STRCASECMP)
  491. IF(NOT HAVE_STRCASECMP)
  492. CHECK_FUNCTION_EXISTS(_stricmp HAVE__STRICMP)
  493. IF(NOT HAVE__STRICMP)
  494. MESSAGE(FATAL_ERROR "No case-insensitive compare function found, please report!")
  495. ENDIF()
  496. SET(CPP_DEFS ${CPP_DEFS} strcasecmp=_stricmp)
  497. ENDIF()
  498. CHECK_FUNCTION_EXISTS(strncasecmp HAVE_STRNCASECMP)
  499. IF(NOT HAVE_STRNCASECMP)
  500. CHECK_FUNCTION_EXISTS(_strnicmp HAVE__STRNICMP)
  501. IF(NOT HAVE__STRNICMP)
  502. MESSAGE(FATAL_ERROR "No case-insensitive size-limitted compare function found, please report!")
  503. ENDIF()
  504. SET(CPP_DEFS ${CPP_DEFS} strncasecmp=_strnicmp)
  505. ENDIF()
  506. CHECK_SYMBOL_EXISTS(strnlen string.h HAVE_STRNLEN)
  507. CHECK_SYMBOL_EXISTS(snprintf stdio.h HAVE_SNPRINTF)
  508. IF(NOT HAVE_SNPRINTF)
  509. CHECK_FUNCTION_EXISTS(_snprintf HAVE__SNPRINTF)
  510. IF(NOT HAVE__SNPRINTF)
  511. MESSAGE(FATAL_ERROR "No snprintf function found, please report!")
  512. ENDIF()
  513. SET(CPP_DEFS ${CPP_DEFS} snprintf=_snprintf)
  514. ENDIF()
  515. CHECK_SYMBOL_EXISTS(isfinite math.h HAVE_ISFINITE)
  516. IF(NOT HAVE_ISFINITE)
  517. CHECK_FUNCTION_EXISTS(finite HAVE_FINITE)
  518. IF(NOT HAVE_FINITE)
  519. CHECK_FUNCTION_EXISTS(_finite HAVE__FINITE)
  520. IF(NOT HAVE__FINITE)
  521. MESSAGE(FATAL_ERROR "No isfinite function found, please report!")
  522. ENDIF()
  523. SET(CPP_DEFS ${CPP_DEFS} isfinite=_finite)
  524. ELSE()
  525. SET(CPP_DEFS ${CPP_DEFS} isfinite=finite)
  526. ENDIF()
  527. ENDIF()
  528. CHECK_SYMBOL_EXISTS(isnan math.h HAVE_ISNAN)
  529. IF(NOT HAVE_ISNAN)
  530. CHECK_FUNCTION_EXISTS(_isnan HAVE__ISNAN)
  531. IF(NOT HAVE__ISNAN)
  532. MESSAGE(FATAL_ERROR "No isnan function found, please report!")
  533. ENDIF()
  534. SET(CPP_DEFS ${CPP_DEFS} isnan=_isnan)
  535. ENDIF()
  536. # Check if we have Windows headers
  537. SET(OLD_REQUIRED_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS})
  538. SET(CMAKE_REQUIRED_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS} -D_WIN32_WINNT=0x0502)
  539. CHECK_INCLUDE_FILE(windows.h HAVE_WINDOWS_H)
  540. SET(CMAKE_REQUIRED_DEFINITIONS ${OLD_REQUIRED_DEFINITIONS})
  541. UNSET(OLD_REQUIRED_DEFINITIONS)
  542. IF(NOT HAVE_WINDOWS_H)
  543. CHECK_SYMBOL_EXISTS(gettimeofday sys/time.h HAVE_GETTIMEOFDAY)
  544. IF(NOT HAVE_GETTIMEOFDAY)
  545. MESSAGE(FATAL_ERROR "No timing function found!")
  546. ENDIF()
  547. CHECK_SYMBOL_EXISTS(nanosleep time.h HAVE_NANOSLEEP)
  548. IF(NOT HAVE_NANOSLEEP)
  549. MESSAGE(FATAL_ERROR "No sleep function found!")
  550. ENDIF()
  551. # We need pthreads outside of Windows
  552. CHECK_INCLUDE_FILE(pthread.h HAVE_PTHREAD_H)
  553. IF(NOT HAVE_PTHREAD_H)
  554. MESSAGE(FATAL_ERROR "PThreads is required for non-Windows builds!")
  555. ENDIF()
  556. # Some systems need pthread_np.h to get recursive mutexes
  557. CHECK_INCLUDE_FILES("pthread.h;pthread_np.h" HAVE_PTHREAD_NP_H)
  558. CHECK_C_COMPILER_FLAG(-pthread HAVE_PTHREAD)
  559. IF(HAVE_PTHREAD)
  560. SET(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -pthread")
  561. SET(C_FLAGS ${C_FLAGS} -pthread)
  562. SET(LINKER_FLAGS ${LINKER_FLAGS} -pthread)
  563. ENDIF()
  564. CHECK_LIBRARY_EXISTS(pthread pthread_create "" HAVE_LIBPTHREAD)
  565. IF(HAVE_LIBPTHREAD)
  566. SET(EXTRA_LIBS pthread ${EXTRA_LIBS})
  567. ENDIF()
  568. CHECK_SYMBOL_EXISTS(pthread_setschedparam pthread.h HAVE_PTHREAD_SETSCHEDPARAM)
  569. IF(HAVE_PTHREAD_NP_H)
  570. CHECK_SYMBOL_EXISTS(pthread_setname_np "pthread.h;pthread_np.h" HAVE_PTHREAD_SETNAME_NP)
  571. IF(NOT HAVE_PTHREAD_SETNAME_NP)
  572. CHECK_SYMBOL_EXISTS(pthread_set_name_np "pthread.h;pthread_np.h" HAVE_PTHREAD_SET_NAME_NP)
  573. ELSE()
  574. CHECK_C_SOURCE_COMPILES("
  575. #include <pthread.h>
  576. #include <pthread_np.h>
  577. int main()
  578. {
  579. pthread_setname_np(\"testname\");
  580. return 0;
  581. }"
  582. PTHREAD_SETNAME_NP_ONE_PARAM
  583. )
  584. CHECK_C_SOURCE_COMPILES("
  585. #include <pthread.h>
  586. #include <pthread_np.h>
  587. int main()
  588. {
  589. pthread_setname_np(pthread_self(), \"%s\", \"testname\");
  590. return 0;
  591. }"
  592. PTHREAD_SETNAME_NP_THREE_PARAMS
  593. )
  594. ENDIF()
  595. CHECK_SYMBOL_EXISTS(pthread_mutexattr_setkind_np "pthread.h;pthread_np.h" HAVE_PTHREAD_MUTEXATTR_SETKIND_NP)
  596. ELSE()
  597. CHECK_SYMBOL_EXISTS(pthread_setname_np pthread.h HAVE_PTHREAD_SETNAME_NP)
  598. IF(NOT HAVE_PTHREAD_SETNAME_NP)
  599. CHECK_SYMBOL_EXISTS(pthread_set_name_np pthread.h HAVE_PTHREAD_SET_NAME_NP)
  600. ELSE()
  601. CHECK_C_SOURCE_COMPILES("
  602. #include <pthread.h>
  603. int main()
  604. {
  605. pthread_setname_np(\"testname\");
  606. return 0;
  607. }"
  608. PTHREAD_SETNAME_NP_ONE_PARAM
  609. )
  610. CHECK_C_SOURCE_COMPILES("
  611. #include <pthread.h>
  612. int main()
  613. {
  614. pthread_setname_np(pthread_self(), \"%s\", \"testname\");
  615. return 0;
  616. }"
  617. PTHREAD_SETNAME_NP_THREE_PARAMS
  618. )
  619. ENDIF()
  620. CHECK_SYMBOL_EXISTS(pthread_mutexattr_setkind_np pthread.h HAVE_PTHREAD_MUTEXATTR_SETKIND_NP)
  621. ENDIF()
  622. CHECK_SYMBOL_EXISTS(pthread_mutex_timedlock pthread.h HAVE_PTHREAD_MUTEX_TIMEDLOCK)
  623. CHECK_LIBRARY_EXISTS(rt clock_gettime "" HAVE_LIBRT)
  624. IF(HAVE_LIBRT)
  625. SET(EXTRA_LIBS rt ${EXTRA_LIBS})
  626. ENDIF()
  627. ENDIF()
  628. CHECK_SYMBOL_EXISTS(getopt unistd.h HAVE_GETOPT)
  629. # Check for a 64-bit type
  630. CHECK_INCLUDE_FILE(stdint.h HAVE_STDINT_H)
  631. IF(NOT HAVE_STDINT_H)
  632. IF(HAVE_WINDOWS_H)
  633. CHECK_C_SOURCE_COMPILES("#define _WIN32_WINNT 0x0502
  634. #include <windows.h>
  635. __int64 foo;
  636. int main() {return 0;}" HAVE___INT64)
  637. ENDIF()
  638. IF(NOT HAVE___INT64)
  639. IF(NOT SIZEOF_LONG MATCHES "8")
  640. IF(NOT SIZEOF_LONG_LONG MATCHES "8")
  641. MESSAGE(FATAL_ERROR "No 64-bit types found, please report!")
  642. ENDIF()
  643. ENDIF()
  644. ENDIF()
  645. ENDIF()
  646. SET(COMMON_OBJS
  647. common/alcomplex.c
  648. common/alcomplex.h
  649. common/align.h
  650. common/almalloc.c
  651. common/almalloc.h
  652. common/atomic.c
  653. common/atomic.h
  654. common/bool.h
  655. common/math_defs.h
  656. common/rwlock.c
  657. common/rwlock.h
  658. common/static_assert.h
  659. common/threads.c
  660. common/threads.h
  661. common/uintmap.c
  662. common/uintmap.h
  663. )
  664. SET(OPENAL_OBJS
  665. OpenAL32/Include/bs2b.h
  666. OpenAL32/Include/alMain.h
  667. OpenAL32/Include/alu.h
  668. OpenAL32/Include/alAuxEffectSlot.h
  669. OpenAL32/alAuxEffectSlot.c
  670. OpenAL32/Include/alBuffer.h
  671. OpenAL32/alBuffer.c
  672. OpenAL32/Include/alEffect.h
  673. OpenAL32/alEffect.c
  674. OpenAL32/Include/alError.h
  675. OpenAL32/alError.c
  676. OpenAL32/alExtension.c
  677. OpenAL32/Include/alFilter.h
  678. OpenAL32/alFilter.c
  679. OpenAL32/Include/alListener.h
  680. OpenAL32/alListener.c
  681. OpenAL32/Include/alSource.h
  682. OpenAL32/alSource.c
  683. OpenAL32/alState.c
  684. OpenAL32/event.c
  685. OpenAL32/Include/sample_cvt.h
  686. OpenAL32/sample_cvt.c
  687. )
  688. SET(ALC_OBJS
  689. Alc/ALc.c
  690. Alc/ALu.c
  691. Alc/alconfig.c
  692. Alc/alconfig.h
  693. Alc/bs2b.c
  694. Alc/converter.c
  695. Alc/converter.h
  696. Alc/inprogext.h
  697. Alc/mastering.c
  698. Alc/mastering.h
  699. Alc/ringbuffer.c
  700. Alc/ringbuffer.h
  701. Alc/effects/autowah.c
  702. Alc/effects/chorus.c
  703. Alc/effects/compressor.c
  704. Alc/effects/dedicated.c
  705. Alc/effects/distortion.c
  706. Alc/effects/echo.c
  707. Alc/effects/equalizer.c
  708. Alc/effects/fshifter.c
  709. Alc/effects/modulator.c
  710. Alc/effects/null.c
  711. Alc/effects/pshifter.c
  712. Alc/effects/reverb.c
  713. Alc/filters/defs.h
  714. Alc/filters/filter.c
  715. Alc/filters/nfc.c
  716. Alc/filters/nfc.h
  717. Alc/filters/splitter.c
  718. Alc/filters/splitter.h
  719. Alc/helpers.c
  720. Alc/alstring.h
  721. Alc/compat.h
  722. Alc/cpu_caps.h
  723. Alc/fpu_modes.h
  724. Alc/logging.h
  725. Alc/vector.h
  726. Alc/hrtf.c
  727. Alc/hrtf.h
  728. Alc/uhjfilter.c
  729. Alc/uhjfilter.h
  730. Alc/ambdec.c
  731. Alc/ambdec.h
  732. Alc/bformatdec.c
  733. Alc/bformatdec.h
  734. Alc/panning.c
  735. Alc/polymorphism.h
  736. Alc/mixvoice.c
  737. Alc/mixer/defs.h
  738. Alc/mixer/mixer_c.c
  739. )
  740. SET(CPU_EXTS "Default")
  741. SET(HAVE_SSE 0)
  742. SET(HAVE_SSE2 0)
  743. SET(HAVE_SSE3 0)
  744. SET(HAVE_SSE4_1 0)
  745. SET(HAVE_NEON 0)
  746. SET(HAVE_ALSA 0)
  747. SET(HAVE_OSS 0)
  748. SET(HAVE_SOLARIS 0)
  749. SET(HAVE_SNDIO 0)
  750. SET(HAVE_QSA 0)
  751. SET(HAVE_DSOUND 0)
  752. SET(HAVE_WASAPI 0)
  753. SET(HAVE_WINMM 0)
  754. SET(HAVE_PORTAUDIO 0)
  755. SET(HAVE_PULSEAUDIO 0)
  756. SET(HAVE_COREAUDIO 0)
  757. SET(HAVE_OPENSL 0)
  758. SET(HAVE_WAVE 0)
  759. SET(HAVE_SDL2 0)
  760. # Check for SSE support
  761. OPTION(ALSOFT_REQUIRE_SSE "Require SSE support" OFF)
  762. CHECK_INCLUDE_FILE(xmmintrin.h HAVE_XMMINTRIN_H "${SSE_SWITCH}")
  763. IF(HAVE_XMMINTRIN_H)
  764. OPTION(ALSOFT_CPUEXT_SSE "Enable SSE support" ON)
  765. IF(ALSOFT_CPUEXT_SSE)
  766. IF(ALIGN_DECL OR HAVE_C11_ALIGNAS)
  767. SET(HAVE_SSE 1)
  768. SET(ALC_OBJS ${ALC_OBJS} Alc/mixer/mixer_sse.c)
  769. IF(SSE_SWITCH)
  770. SET_SOURCE_FILES_PROPERTIES(Alc/mixer/mixer_sse.c PROPERTIES
  771. COMPILE_FLAGS "${SSE_SWITCH}")
  772. ENDIF()
  773. SET(CPU_EXTS "${CPU_EXTS}, SSE")
  774. ENDIF()
  775. ENDIF()
  776. ENDIF()
  777. IF(ALSOFT_REQUIRE_SSE AND NOT HAVE_SSE)
  778. MESSAGE(FATAL_ERROR "Failed to enabled required SSE CPU extensions")
  779. ENDIF()
  780. OPTION(ALSOFT_REQUIRE_SSE2 "Require SSE2 support" OFF)
  781. CHECK_INCLUDE_FILE(emmintrin.h HAVE_EMMINTRIN_H "${SSE2_SWITCH}")
  782. IF(HAVE_EMMINTRIN_H)
  783. OPTION(ALSOFT_CPUEXT_SSE2 "Enable SSE2 support" ON)
  784. IF(HAVE_SSE AND ALSOFT_CPUEXT_SSE2)
  785. IF(ALIGN_DECL OR HAVE_C11_ALIGNAS)
  786. SET(HAVE_SSE2 1)
  787. SET(ALC_OBJS ${ALC_OBJS} Alc/mixer/mixer_sse2.c)
  788. IF(SSE2_SWITCH)
  789. SET_SOURCE_FILES_PROPERTIES(Alc/mixer/mixer_sse2.c PROPERTIES
  790. COMPILE_FLAGS "${SSE2_SWITCH}")
  791. ENDIF()
  792. SET(CPU_EXTS "${CPU_EXTS}, SSE2")
  793. ENDIF()
  794. ENDIF()
  795. ENDIF()
  796. IF(ALSOFT_REQUIRE_SSE2 AND NOT HAVE_SSE2)
  797. MESSAGE(FATAL_ERROR "Failed to enable required SSE2 CPU extensions")
  798. ENDIF()
  799. OPTION(ALSOFT_REQUIRE_SSE3 "Require SSE3 support" OFF)
  800. CHECK_INCLUDE_FILE(pmmintrin.h HAVE_PMMINTRIN_H "${SSE3_SWITCH}")
  801. IF(HAVE_EMMINTRIN_H)
  802. OPTION(ALSOFT_CPUEXT_SSE3 "Enable SSE3 support" ON)
  803. IF(HAVE_SSE2 AND ALSOFT_CPUEXT_SSE3)
  804. IF(ALIGN_DECL OR HAVE_C11_ALIGNAS)
  805. SET(HAVE_SSE3 1)
  806. SET(ALC_OBJS ${ALC_OBJS} Alc/mixer/mixer_sse3.c)
  807. IF(SSE2_SWITCH)
  808. SET_SOURCE_FILES_PROPERTIES(Alc/mixer/mixer_sse3.c PROPERTIES
  809. COMPILE_FLAGS "${SSE3_SWITCH}")
  810. ENDIF()
  811. SET(CPU_EXTS "${CPU_EXTS}, SSE3")
  812. ENDIF()
  813. ENDIF()
  814. ENDIF()
  815. IF(ALSOFT_REQUIRE_SSE3 AND NOT HAVE_SSE3)
  816. MESSAGE(FATAL_ERROR "Failed to enable required SSE3 CPU extensions")
  817. ENDIF()
  818. OPTION(ALSOFT_REQUIRE_SSE4_1 "Require SSE4.1 support" OFF)
  819. CHECK_INCLUDE_FILE(smmintrin.h HAVE_SMMINTRIN_H "${SSE4_1_SWITCH}")
  820. IF(HAVE_SMMINTRIN_H)
  821. OPTION(ALSOFT_CPUEXT_SSE4_1 "Enable SSE4.1 support" ON)
  822. IF(HAVE_SSE2 AND ALSOFT_CPUEXT_SSE4_1)
  823. IF(ALIGN_DECL OR HAVE_C11_ALIGNAS)
  824. SET(HAVE_SSE4_1 1)
  825. SET(ALC_OBJS ${ALC_OBJS} Alc/mixer/mixer_sse41.c)
  826. IF(SSE4_1_SWITCH)
  827. SET_SOURCE_FILES_PROPERTIES(Alc/mixer/mixer_sse41.c PROPERTIES
  828. COMPILE_FLAGS "${SSE4_1_SWITCH}")
  829. ENDIF()
  830. SET(CPU_EXTS "${CPU_EXTS}, SSE4.1")
  831. ENDIF()
  832. ENDIF()
  833. ENDIF()
  834. IF(ALSOFT_REQUIRE_SSE4_1 AND NOT HAVE_SSE4_1)
  835. MESSAGE(FATAL_ERROR "Failed to enable required SSE4.1 CPU extensions")
  836. ENDIF()
  837. # Check for ARM Neon support
  838. OPTION(ALSOFT_REQUIRE_NEON "Require ARM Neon support" OFF)
  839. CHECK_INCLUDE_FILE(arm_neon.h HAVE_ARM_NEON_H ${FPU_NEON_SWITCH})
  840. IF(HAVE_ARM_NEON_H)
  841. OPTION(ALSOFT_CPUEXT_NEON "Enable ARM Neon support" ON)
  842. IF(ALSOFT_CPUEXT_NEON)
  843. SET(HAVE_NEON 1)
  844. SET(ALC_OBJS ${ALC_OBJS} Alc/mixer/mixer_neon.c)
  845. IF(FPU_NEON_SWITCH)
  846. SET_SOURCE_FILES_PROPERTIES(Alc/mixer/mixer_neon.c PROPERTIES
  847. COMPILE_FLAGS "${FPU_NEON_SWITCH}")
  848. ENDIF()
  849. SET(CPU_EXTS "${CPU_EXTS}, Neon")
  850. ENDIF()
  851. ENDIF()
  852. IF(ALSOFT_REQUIRE_NEON AND NOT HAVE_NEON)
  853. MESSAGE(FATAL_ERROR "Failed to enabled required ARM Neon CPU extensions")
  854. ENDIF()
  855. IF(WIN32 OR HAVE_DLFCN_H)
  856. SET(IS_LINKED "")
  857. MACRO(ADD_BACKEND_LIBS _LIBS)
  858. ENDMACRO()
  859. ELSE()
  860. SET(IS_LINKED " (linked)")
  861. MACRO(ADD_BACKEND_LIBS _LIBS)
  862. SET(EXTRA_LIBS ${_LIBS} ${EXTRA_LIBS})
  863. ENDMACRO()
  864. ENDIF()
  865. SET(BACKENDS "")
  866. SET(ALC_OBJS ${ALC_OBJS}
  867. Alc/backends/base.c
  868. Alc/backends/base.h
  869. # Default backends, always available
  870. Alc/backends/loopback.c
  871. Alc/backends/null.c
  872. )
  873. # Check ALSA backend
  874. OPTION(ALSOFT_REQUIRE_ALSA "Require ALSA backend" OFF)
  875. FIND_PACKAGE(ALSA)
  876. IF(ALSA_FOUND)
  877. OPTION(ALSOFT_BACKEND_ALSA "Enable ALSA backend" ON)
  878. IF(ALSOFT_BACKEND_ALSA)
  879. SET(HAVE_ALSA 1)
  880. SET(BACKENDS "${BACKENDS} ALSA${IS_LINKED},")
  881. SET(ALC_OBJS ${ALC_OBJS} Alc/backends/alsa.c)
  882. ADD_BACKEND_LIBS(${ALSA_LIBRARIES})
  883. SET(INC_PATHS ${INC_PATHS} ${ALSA_INCLUDE_DIRS})
  884. ENDIF()
  885. ENDIF()
  886. IF(ALSOFT_REQUIRE_ALSA AND NOT HAVE_ALSA)
  887. MESSAGE(FATAL_ERROR "Failed to enabled required ALSA backend")
  888. ENDIF()
  889. # Check OSS backend
  890. OPTION(ALSOFT_REQUIRE_OSS "Require OSS backend" OFF)
  891. FIND_PACKAGE(OSS)
  892. IF(OSS_FOUND)
  893. OPTION(ALSOFT_BACKEND_OSS "Enable OSS backend" ON)
  894. IF(ALSOFT_BACKEND_OSS)
  895. SET(HAVE_OSS 1)
  896. SET(BACKENDS "${BACKENDS} OSS,")
  897. SET(ALC_OBJS ${ALC_OBJS} Alc/backends/oss.c)
  898. IF(OSS_LIBRARIES)
  899. SET(EXTRA_LIBS ${OSS_LIBRARIES} ${EXTRA_LIBS})
  900. ENDIF()
  901. SET(INC_PATHS ${INC_PATHS} ${OSS_INCLUDE_DIRS})
  902. ENDIF()
  903. ENDIF()
  904. IF(ALSOFT_REQUIRE_OSS AND NOT HAVE_OSS)
  905. MESSAGE(FATAL_ERROR "Failed to enabled required OSS backend")
  906. ENDIF()
  907. # Check Solaris backend
  908. OPTION(ALSOFT_REQUIRE_SOLARIS "Require Solaris backend" OFF)
  909. FIND_PACKAGE(AudioIO)
  910. IF(AUDIOIO_FOUND)
  911. OPTION(ALSOFT_BACKEND_SOLARIS "Enable Solaris backend" ON)
  912. IF(ALSOFT_BACKEND_SOLARIS)
  913. SET(HAVE_SOLARIS 1)
  914. SET(BACKENDS "${BACKENDS} Solaris,")
  915. SET(ALC_OBJS ${ALC_OBJS} Alc/backends/solaris.c)
  916. SET(INC_PATHS ${INC_PATHS} ${AUDIOIO_INCLUDE_DIRS})
  917. ENDIF()
  918. ENDIF()
  919. IF(ALSOFT_REQUIRE_SOLARIS AND NOT HAVE_SOLARIS)
  920. MESSAGE(FATAL_ERROR "Failed to enabled required Solaris backend")
  921. ENDIF()
  922. # Check SndIO backend
  923. OPTION(ALSOFT_REQUIRE_SNDIO "Require SndIO backend" OFF)
  924. FIND_PACKAGE(SoundIO)
  925. IF(SOUNDIO_FOUND)
  926. OPTION(ALSOFT_BACKEND_SNDIO "Enable SndIO backend" ON)
  927. IF(ALSOFT_BACKEND_SNDIO)
  928. SET(HAVE_SNDIO 1)
  929. SET(BACKENDS "${BACKENDS} SndIO (linked),")
  930. SET(ALC_OBJS ${ALC_OBJS} Alc/backends/sndio.c)
  931. SET(EXTRA_LIBS ${SOUNDIO_LIBRARIES} ${EXTRA_LIBS})
  932. SET(INC_PATHS ${INC_PATHS} ${SOUNDIO_INCLUDE_DIRS})
  933. ENDIF()
  934. ENDIF()
  935. IF(ALSOFT_REQUIRE_SNDIO AND NOT HAVE_SNDIO)
  936. MESSAGE(FATAL_ERROR "Failed to enabled required SndIO backend")
  937. ENDIF()
  938. # Check QSA backend
  939. OPTION(ALSOFT_REQUIRE_QSA "Require QSA backend" OFF)
  940. FIND_PACKAGE(QSA)
  941. IF(QSA_FOUND)
  942. OPTION(ALSOFT_BACKEND_QSA "Enable QSA backend" ON)
  943. IF(ALSOFT_BACKEND_QSA)
  944. SET(HAVE_QSA 1)
  945. SET(BACKENDS "${BACKENDS} QSA (linked),")
  946. SET(ALC_OBJS ${ALC_OBJS} Alc/backends/qsa.c)
  947. SET(EXTRA_LIBS ${QSA_LIBRARIES} ${EXTRA_LIBS})
  948. SET(INC_PATHS ${INC_PATHS} ${QSA_INCLUDE_DIRS})
  949. ENDIF()
  950. ENDIF()
  951. IF(ALSOFT_REQUIRE_QSA AND NOT HAVE_QSA)
  952. MESSAGE(FATAL_ERROR "Failed to enabled required QSA backend")
  953. ENDIF()
  954. # Check Windows-only backends
  955. OPTION(ALSOFT_REQUIRE_WINMM "Require Windows Multimedia backend" OFF)
  956. OPTION(ALSOFT_REQUIRE_DSOUND "Require DirectSound backend" OFF)
  957. OPTION(ALSOFT_REQUIRE_WASAPI "Require WASAPI backend" OFF)
  958. IF(HAVE_WINDOWS_H)
  959. SET(OLD_REQUIRED_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS})
  960. SET(CMAKE_REQUIRED_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS} -D_WIN32_WINNT=0x0502)
  961. # Check MMSystem backend
  962. CHECK_INCLUDE_FILES("windows.h;mmsystem.h" HAVE_MMSYSTEM_H)
  963. IF(HAVE_MMSYSTEM_H)
  964. CHECK_SHARED_FUNCTION_EXISTS(waveOutOpen "windows.h;mmsystem.h" winmm "" HAVE_LIBWINMM)
  965. IF(HAVE_LIBWINMM)
  966. OPTION(ALSOFT_BACKEND_WINMM "Enable Windows Multimedia backend" ON)
  967. IF(ALSOFT_BACKEND_WINMM)
  968. SET(HAVE_WINMM 1)
  969. SET(BACKENDS "${BACKENDS} WinMM,")
  970. SET(ALC_OBJS ${ALC_OBJS} Alc/backends/winmm.c)
  971. SET(EXTRA_LIBS winmm ${EXTRA_LIBS})
  972. ENDIF()
  973. ENDIF()
  974. ENDIF()
  975. # Check DSound backend
  976. FIND_PACKAGE(DSound)
  977. IF(DSOUND_FOUND)
  978. OPTION(ALSOFT_BACKEND_DSOUND "Enable DirectSound backend" ON)
  979. IF(ALSOFT_BACKEND_DSOUND)
  980. SET(HAVE_DSOUND 1)
  981. SET(BACKENDS "${BACKENDS} DirectSound${IS_LINKED},")
  982. SET(ALC_OBJS ${ALC_OBJS} Alc/backends/dsound.c)
  983. ADD_BACKEND_LIBS(${DSOUND_LIBRARIES})
  984. SET(INC_PATHS ${INC_PATHS} ${DSOUND_INCLUDE_DIRS})
  985. ENDIF()
  986. ENDIF()
  987. # Check for WASAPI backend
  988. CHECK_INCLUDE_FILE(mmdeviceapi.h HAVE_MMDEVICEAPI_H)
  989. IF(HAVE_MMDEVICEAPI_H)
  990. OPTION(ALSOFT_BACKEND_WASAPI "Enable WASAPI backend" ON)
  991. IF(ALSOFT_BACKEND_WASAPI)
  992. SET(HAVE_WASAPI 1)
  993. SET(BACKENDS "${BACKENDS} WASAPI,")
  994. SET(ALC_OBJS ${ALC_OBJS} Alc/backends/wasapi.c)
  995. ENDIF()
  996. ENDIF()
  997. SET(CMAKE_REQUIRED_DEFINITIONS ${OLD_REQUIRED_DEFINITIONS})
  998. UNSET(OLD_REQUIRED_DEFINITIONS)
  999. ENDIF()
  1000. IF(ALSOFT_REQUIRE_WINMM AND NOT HAVE_WINMM)
  1001. MESSAGE(FATAL_ERROR "Failed to enabled required WinMM backend")
  1002. ENDIF()
  1003. IF(ALSOFT_REQUIRE_DSOUND AND NOT HAVE_DSOUND)
  1004. MESSAGE(FATAL_ERROR "Failed to enabled required DSound backend")
  1005. ENDIF()
  1006. IF(ALSOFT_REQUIRE_WASAPI AND NOT HAVE_WASAPI)
  1007. MESSAGE(FATAL_ERROR "Failed to enabled required WASAPI backend")
  1008. ENDIF()
  1009. # Check PortAudio backend
  1010. OPTION(ALSOFT_REQUIRE_PORTAUDIO "Require PortAudio backend" OFF)
  1011. FIND_PACKAGE(PortAudio)
  1012. IF(PORTAUDIO_FOUND)
  1013. OPTION(ALSOFT_BACKEND_PORTAUDIO "Enable PortAudio backend" ON)
  1014. IF(ALSOFT_BACKEND_PORTAUDIO)
  1015. SET(HAVE_PORTAUDIO 1)
  1016. SET(BACKENDS "${BACKENDS} PortAudio${IS_LINKED},")
  1017. SET(ALC_OBJS ${ALC_OBJS} Alc/backends/portaudio.c)
  1018. ADD_BACKEND_LIBS(${PORTAUDIO_LIBRARIES})
  1019. SET(INC_PATHS ${INC_PATHS} ${PORTAUDIO_INCLUDE_DIRS})
  1020. ENDIF()
  1021. ENDIF()
  1022. IF(ALSOFT_REQUIRE_PORTAUDIO AND NOT HAVE_PORTAUDIO)
  1023. MESSAGE(FATAL_ERROR "Failed to enabled required PortAudio backend")
  1024. ENDIF()
  1025. # Check PulseAudio backend
  1026. OPTION(ALSOFT_REQUIRE_PULSEAUDIO "Require PulseAudio backend" OFF)
  1027. FIND_PACKAGE(PulseAudio)
  1028. IF(PULSEAUDIO_FOUND)
  1029. OPTION(ALSOFT_BACKEND_PULSEAUDIO "Enable PulseAudio backend" ON)
  1030. IF(ALSOFT_BACKEND_PULSEAUDIO)
  1031. SET(HAVE_PULSEAUDIO 1)
  1032. SET(BACKENDS "${BACKENDS} PulseAudio${IS_LINKED},")
  1033. SET(ALC_OBJS ${ALC_OBJS} Alc/backends/pulseaudio.c)
  1034. ADD_BACKEND_LIBS(${PULSEAUDIO_LIBRARIES})
  1035. SET(INC_PATHS ${INC_PATHS} ${PULSEAUDIO_INCLUDE_DIRS})
  1036. ENDIF()
  1037. ENDIF()
  1038. IF(ALSOFT_REQUIRE_PULSEAUDIO AND NOT HAVE_PULSEAUDIO)
  1039. MESSAGE(FATAL_ERROR "Failed to enabled required PulseAudio backend")
  1040. ENDIF()
  1041. # Check JACK backend
  1042. OPTION(ALSOFT_REQUIRE_JACK "Require JACK backend" OFF)
  1043. FIND_PACKAGE(JACK)
  1044. IF(JACK_FOUND)
  1045. OPTION(ALSOFT_BACKEND_JACK "Enable JACK backend" ON)
  1046. IF(ALSOFT_BACKEND_JACK)
  1047. SET(HAVE_JACK 1)
  1048. SET(BACKENDS "${BACKENDS} JACK${IS_LINKED},")
  1049. SET(ALC_OBJS ${ALC_OBJS} Alc/backends/jack.c)
  1050. ADD_BACKEND_LIBS(${JACK_LIBRARIES})
  1051. SET(INC_PATHS ${INC_PATHS} ${JACK_INCLUDE_DIRS})
  1052. ENDIF()
  1053. ENDIF()
  1054. IF(ALSOFT_REQUIRE_JACK AND NOT HAVE_JACK)
  1055. MESSAGE(FATAL_ERROR "Failed to enabled required JACK backend")
  1056. ENDIF()
  1057. # Check CoreAudio backend
  1058. OPTION(ALSOFT_REQUIRE_COREAUDIO "Require CoreAudio backend" OFF)
  1059. FIND_LIBRARY(COREAUDIO_FRAMEWORK
  1060. NAMES CoreAudio
  1061. PATHS /System/Library/Frameworks
  1062. )
  1063. IF(COREAUDIO_FRAMEWORK)
  1064. OPTION(ALSOFT_BACKEND_COREAUDIO "Enable CoreAudio backend" ON)
  1065. IF(ALSOFT_BACKEND_COREAUDIO)
  1066. SET(HAVE_COREAUDIO 1)
  1067. SET(ALC_OBJS ${ALC_OBJS} Alc/backends/coreaudio.c)
  1068. SET(BACKENDS "${BACKENDS} CoreAudio,")
  1069. SET(EXTRA_LIBS ${COREAUDIO_FRAMEWORK} ${EXTRA_LIBS})
  1070. SET(EXTRA_LIBS /System/Library/Frameworks/AudioUnit.framework ${EXTRA_LIBS})
  1071. SET(EXTRA_LIBS /System/Library/Frameworks/ApplicationServices.framework ${EXTRA_LIBS})
  1072. # Some versions of OSX may need the AudioToolbox framework. Add it if
  1073. # it's found.
  1074. FIND_LIBRARY(AUDIOTOOLBOX_LIBRARY
  1075. NAMES AudioToolbox
  1076. PATHS ~/Library/Frameworks
  1077. /Library/Frameworks
  1078. /System/Library/Frameworks
  1079. )
  1080. IF(AUDIOTOOLBOX_LIBRARY)
  1081. SET(EXTRA_LIBS ${AUDIOTOOLBOX_LIBRARY} ${EXTRA_LIBS})
  1082. ENDIF()
  1083. ENDIF()
  1084. ENDIF()
  1085. IF(ALSOFT_REQUIRE_COREAUDIO AND NOT HAVE_COREAUDIO)
  1086. MESSAGE(FATAL_ERROR "Failed to enabled required CoreAudio backend")
  1087. ENDIF()
  1088. # Check for OpenSL (Android) backend
  1089. OPTION(ALSOFT_REQUIRE_OPENSL "Require OpenSL backend" OFF)
  1090. CHECK_INCLUDE_FILES("SLES/OpenSLES.h;SLES/OpenSLES_Android.h" HAVE_SLES_OPENSLES_ANDROID_H)
  1091. IF(HAVE_SLES_OPENSLES_ANDROID_H)
  1092. CHECK_SHARED_FUNCTION_EXISTS(slCreateEngine "SLES/OpenSLES.h" OpenSLES "" HAVE_LIBOPENSLES)
  1093. IF(HAVE_LIBOPENSLES)
  1094. OPTION(ALSOFT_BACKEND_OPENSL "Enable OpenSL backend" ON)
  1095. IF(ALSOFT_BACKEND_OPENSL)
  1096. SET(HAVE_OPENSL 1)
  1097. SET(ALC_OBJS ${ALC_OBJS} Alc/backends/opensl.c)
  1098. SET(BACKENDS "${BACKENDS} OpenSL,")
  1099. SET(EXTRA_LIBS OpenSLES ${EXTRA_LIBS})
  1100. ENDIF()
  1101. ENDIF()
  1102. ENDIF()
  1103. IF(ALSOFT_REQUIRE_OPENSL AND NOT HAVE_OPENSL)
  1104. MESSAGE(FATAL_ERROR "Failed to enabled required OpenSL backend")
  1105. ENDIF()
  1106. # Check for SDL2 backend
  1107. OPTION(ALSOFT_REQUIRE_SDL2 "Require SDL2 backend" OFF)
  1108. FIND_PACKAGE(SDL2)
  1109. IF(SDL2_FOUND)
  1110. # Off by default, since it adds a runtime dependency
  1111. OPTION(ALSOFT_BACKEND_SDL2 "Enable SDL2 backend" OFF)
  1112. IF(ALSOFT_BACKEND_SDL2)
  1113. SET(HAVE_SDL2 1)
  1114. SET(ALC_OBJS ${ALC_OBJS} Alc/backends/sdl2.c)
  1115. SET(BACKENDS "${BACKENDS} SDL2,")
  1116. SET(EXTRA_LIBS ${SDL2_LIBRARY} ${EXTRA_LIBS})
  1117. SET(INC_PATHS ${INC_PATHS} ${SDL2_INCLUDE_DIR})
  1118. ENDIF()
  1119. ENDIF()
  1120. IF(ALSOFT_REQUIRE_SDL2 AND NOT SDL2_FOUND)
  1121. MESSAGE(FATAL_ERROR "Failed to enabled required SDL2 backend")
  1122. ENDIF()
  1123. # Optionally enable the Wave Writer backend
  1124. OPTION(ALSOFT_BACKEND_WAVE "Enable Wave Writer backend" ON)
  1125. IF(ALSOFT_BACKEND_WAVE)
  1126. SET(HAVE_WAVE 1)
  1127. SET(ALC_OBJS ${ALC_OBJS} Alc/backends/wave.c)
  1128. SET(BACKENDS "${BACKENDS} WaveFile,")
  1129. ENDIF()
  1130. # This is always available
  1131. SET(BACKENDS "${BACKENDS} Null")
  1132. FIND_PACKAGE(Git)
  1133. IF(GIT_FOUND AND EXISTS "${OpenAL_SOURCE_DIR}/.git")
  1134. # Get the current working branch and its latest abbreviated commit hash
  1135. ADD_CUSTOM_TARGET(build_version
  1136. ${CMAKE_COMMAND} -D GIT_EXECUTABLE=${GIT_EXECUTABLE}
  1137. -D LIB_VERSION=${LIB_VERSION}
  1138. -D SRC=${OpenAL_SOURCE_DIR}/version.h.in
  1139. -D DST=${OpenAL_BINARY_DIR}/version.h
  1140. -P ${OpenAL_SOURCE_DIR}/version.cmake
  1141. WORKING_DIRECTORY "${OpenAL_SOURCE_DIR}"
  1142. VERBATIM
  1143. )
  1144. ELSE()
  1145. SET(GIT_BRANCH "UNKNOWN")
  1146. SET(GIT_COMMIT_HASH "unknown")
  1147. CONFIGURE_FILE(
  1148. "${OpenAL_SOURCE_DIR}/version.h.in"
  1149. "${OpenAL_BINARY_DIR}/version.h")
  1150. ENDIF()
  1151. SET(NATIVE_SRC_DIR "${OpenAL_SOURCE_DIR}/native-tools/")
  1152. SET(NATIVE_BIN_DIR "${OpenAL_BINARY_DIR}/native-tools/")
  1153. FILE(MAKE_DIRECTORY "${NATIVE_BIN_DIR}")
  1154. SET(BIN2H_COMMAND "${NATIVE_BIN_DIR}bin2h")
  1155. SET(BSINCGEN_COMMAND "${NATIVE_BIN_DIR}bsincgen")
  1156. #[[
  1157. ADD_CUSTOM_COMMAND(OUTPUT "${BIN2H_COMMAND}" "${BSINCGEN_COMMAND}"
  1158. COMMAND ${CMAKE_COMMAND} -G "${CMAKE_GENERATOR}" "${NATIVE_SRC_DIR}"
  1159. COMMAND ${CMAKE_COMMAND} -E remove "${BIN2H_COMMAND}" "${BSINCGEN_COMMAND}"
  1160. COMMAND ${CMAKE_COMMAND} --build . --config "Release"
  1161. WORKING_DIRECTORY "${NATIVE_BIN_DIR}"
  1162. DEPENDS "${NATIVE_SRC_DIR}CMakeLists.txt"
  1163. IMPLICIT_DEPENDS C "${NATIVE_SRC_DIR}bin2h.c"
  1164. C "${NATIVE_SRC_DIR}bsincgen.c"
  1165. VERBATIM
  1166. )
  1167. ADD_CUSTOM_TARGET(native-tools
  1168. DEPENDS "${BIN2H_COMMAND}" "${BSINCGEN_COMMAND}"
  1169. VERBATIM
  1170. )
  1171. ]]
  1172. file(COPY ${OpenAL_SOURCE_DIR}/../openal-nativetools/bin2h.exe DESTINATION ${NATIVE_BIN_DIR})
  1173. file(COPY ${OpenAL_SOURCE_DIR}/../openal-nativetools/bsincgen.exe DESTINATION ${NATIVE_BIN_DIR})
  1174. option(ALSOFT_EMBED_HRTF_DATA "Embed the HRTF data files (increases library footprint)" ON)
  1175. if(ALSOFT_EMBED_HRTF_DATA)
  1176. MACRO(make_hrtf_header FILENAME VARNAME)
  1177. SET(infile "${OpenAL_SOURCE_DIR}/hrtf/${FILENAME}")
  1178. SET(outfile "${OpenAL_BINARY_DIR}/${FILENAME}.h")
  1179. ADD_CUSTOM_COMMAND(OUTPUT "${outfile}"
  1180. COMMAND "${BIN2H_COMMAND}" "${infile}" "${outfile}" ${VARNAME}
  1181. DEPENDS native-tools "${infile}"
  1182. VERBATIM
  1183. )
  1184. SET(ALC_OBJS ${ALC_OBJS} "${outfile}")
  1185. ENDMACRO()
  1186. make_hrtf_header(default-44100.mhr "hrtf_default_44100")
  1187. make_hrtf_header(default-48000.mhr "hrtf_default_48000")
  1188. endif()
  1189. ADD_CUSTOM_COMMAND(OUTPUT "${OpenAL_BINARY_DIR}/bsinc_inc.h"
  1190. COMMAND "${BSINCGEN_COMMAND}" "${OpenAL_BINARY_DIR}/bsinc_inc.h"
  1191. DEPENDS native-tools "${NATIVE_SRC_DIR}bsincgen.c"
  1192. VERBATIM
  1193. )
  1194. SET(ALC_OBJS ${ALC_OBJS} "${OpenAL_BINARY_DIR}/bsinc_inc.h")
  1195. IF(ALSOFT_UTILS AND NOT ALSOFT_NO_CONFIG_UTIL)
  1196. add_subdirectory(utils/alsoft-config)
  1197. ENDIF()
  1198. IF(ALSOFT_EXAMPLES)
  1199. IF(NOT SDL2_FOUND)
  1200. FIND_PACKAGE(SDL2)
  1201. ENDIF()
  1202. IF(SDL2_FOUND)
  1203. FIND_PACKAGE(SDL_sound)
  1204. FIND_PACKAGE(FFmpeg COMPONENTS AVFORMAT AVCODEC AVUTIL SWSCALE SWRESAMPLE)
  1205. ENDIF()
  1206. ENDIF()
  1207. IF(NOT WIN32)
  1208. SET(LIBNAME "openal")
  1209. ELSE()
  1210. SET(LIBNAME "OpenAL32")
  1211. ENDIF()
  1212. # Needed for openal.pc.in
  1213. SET(prefix ${CMAKE_INSTALL_PREFIX})
  1214. SET(exec_prefix "\${prefix}")
  1215. SET(libdir "\${exec_prefix}/${CMAKE_INSTALL_LIBDIR}")
  1216. SET(bindir "\${exec_prefix}/${CMAKE_INSTALL_BINDIR}")
  1217. SET(includedir "\${prefix}/${CMAKE_INSTALL_INCLUDEDIR}")
  1218. SET(PACKAGE_VERSION "${LIB_VERSION}")
  1219. SET(PKG_CONFIG_CFLAGS )
  1220. SET(PKG_CONFIG_PRIVATE_LIBS )
  1221. IF(LIBTYPE STREQUAL "STATIC")
  1222. SET(PKG_CONFIG_CFLAGS -DAL_LIBTYPE_STATIC)
  1223. FOREACH(FLAG ${LINKER_FLAGS} ${EXTRA_LIBS} ${MATH_LIB})
  1224. # If this is already a linker flag, or is a full path+file, add it
  1225. # as-is. Otherwise, it's a name intended to be dressed as -lname.
  1226. IF(FLAG MATCHES "^-.*" OR EXISTS "${FLAG}")
  1227. SET(PKG_CONFIG_PRIVATE_LIBS "${PKG_CONFIG_PRIVATE_LIBS} ${FLAG}")
  1228. ELSE()
  1229. SET(PKG_CONFIG_PRIVATE_LIBS "${PKG_CONFIG_PRIVATE_LIBS} -l${FLAG}")
  1230. ENDIF()
  1231. ENDFOREACH()
  1232. ENDIF()
  1233. # End configuration
  1234. CONFIGURE_FILE(
  1235. "${OpenAL_SOURCE_DIR}/config.h.in"
  1236. "${OpenAL_BINARY_DIR}/config.h")
  1237. CONFIGURE_FILE(
  1238. "${OpenAL_SOURCE_DIR}/openal.pc.in"
  1239. "${OpenAL_BINARY_DIR}/openal.pc"
  1240. @ONLY)
  1241. # Add a static library with common functions used by multiple targets
  1242. ADD_LIBRARY(common STATIC ${COMMON_OBJS})
  1243. TARGET_COMPILE_DEFINITIONS(common PRIVATE ${CPP_DEFS})
  1244. TARGET_COMPILE_OPTIONS(common PRIVATE ${C_FLAGS})
  1245. UNSET(HAS_ROUTER)
  1246. SET(IMPL_TARGET OpenAL)
  1247. SET(COMMON_LIB )
  1248. SET(SUBSYS_FLAG )
  1249. # Build main library
  1250. IF(LIBTYPE STREQUAL "STATIC")
  1251. SET(CPP_DEFS ${CPP_DEFS} AL_LIBTYPE_STATIC)
  1252. IF(WIN32 AND ALSOFT_NO_UID_DEFS)
  1253. SET(CPP_DEFS ${CPP_DEFS} AL_NO_UID_DEFS)
  1254. ENDIF()
  1255. ADD_LIBRARY(OpenAL STATIC ${COMMON_OBJS} ${OPENAL_OBJS} ${ALC_OBJS})
  1256. ELSE()
  1257. # Make sure to compile the common code with PIC, since it'll be linked into
  1258. # shared libs that needs it.
  1259. SET_PROPERTY(TARGET common PROPERTY POSITION_INDEPENDENT_CODE TRUE)
  1260. SET(COMMON_LIB common)
  1261. IF(WIN32)
  1262. IF(MSVC)
  1263. SET(SUBSYS_FLAG ${SUBSYS_FLAG} "/SUBSYSTEM:WINDOWS")
  1264. ELSEIF(CMAKE_COMPILER_IS_GNUCC)
  1265. SET(SUBSYS_FLAG ${SUBSYS_FLAG} "-mwindows")
  1266. ENDIF()
  1267. ENDIF()
  1268. IF(WIN32 AND ALSOFT_BUILD_ROUTER)
  1269. ADD_LIBRARY(OpenAL SHARED router/router.c router/router.h router/alc.c router/al.c)
  1270. TARGET_COMPILE_DEFINITIONS(OpenAL
  1271. PRIVATE AL_BUILD_LIBRARY AL_ALEXT_PROTOTYPES ${CPP_DEFS})
  1272. TARGET_COMPILE_OPTIONS(OpenAL PRIVATE ${C_FLAGS})
  1273. TARGET_LINK_LIBRARIES(OpenAL PRIVATE ${LINKER_FLAGS} ${COMMON_LIB})
  1274. SET_TARGET_PROPERTIES(OpenAL PROPERTIES PREFIX "")
  1275. SET_TARGET_PROPERTIES(OpenAL PROPERTIES OUTPUT_NAME ${LIBNAME})
  1276. IF(TARGET build_version)
  1277. ADD_DEPENDENCIES(OpenAL build_version)
  1278. ENDIF()
  1279. SET(HAS_ROUTER 1)
  1280. SET(LIBNAME "soft_oal")
  1281. SET(IMPL_TARGET soft_oal)
  1282. ENDIF()
  1283. ADD_LIBRARY(${IMPL_TARGET} SHARED ${OPENAL_OBJS} ${ALC_OBJS})
  1284. IF(WIN32)
  1285. SET_TARGET_PROPERTIES(${IMPL_TARGET} PROPERTIES PREFIX "")
  1286. ENDIF()
  1287. ENDIF()
  1288. SET_TARGET_PROPERTIES(${IMPL_TARGET} PROPERTIES OUTPUT_NAME ${LIBNAME}
  1289. VERSION ${LIB_VERSION}
  1290. SOVERSION ${LIB_MAJOR_VERSION}
  1291. )
  1292. TARGET_COMPILE_DEFINITIONS(${IMPL_TARGET}
  1293. PRIVATE AL_BUILD_LIBRARY AL_ALEXT_PROTOTYPES ${CPP_DEFS})
  1294. TARGET_INCLUDE_DIRECTORIES(${IMPL_TARGET}
  1295. PRIVATE "${OpenAL_SOURCE_DIR}/OpenAL32/Include" "${OpenAL_SOURCE_DIR}/Alc" ${INC_PATHS})
  1296. TARGET_COMPILE_OPTIONS(${IMPL_TARGET} PRIVATE ${C_FLAGS})
  1297. TARGET_LINK_LIBRARIES(${IMPL_TARGET}
  1298. PRIVATE ${LINKER_FLAGS} ${COMMON_LIB} ${EXTRA_LIBS} ${MATH_LIB})
  1299. IF(TARGET build_version)
  1300. ADD_DEPENDENCIES(${IMPL_TARGET} build_version)
  1301. ENDIF()
  1302. IF(WIN32 AND MINGW AND ALSOFT_BUILD_IMPORT_LIB AND NOT LIBTYPE STREQUAL "STATIC")
  1303. FIND_PROGRAM(SED_EXECUTABLE NAMES sed DOC "sed executable")
  1304. FIND_PROGRAM(DLLTOOL_EXECUTABLE NAMES "${DLLTOOL}" DOC "dlltool executable")
  1305. IF(NOT SED_EXECUTABLE OR NOT DLLTOOL_EXECUTABLE)
  1306. MESSAGE(STATUS "")
  1307. IF(NOT SED_EXECUTABLE)
  1308. MESSAGE(STATUS "WARNING: Cannot find sed, disabling .def/.lib generation")
  1309. ENDIF()
  1310. IF(NOT DLLTOOL_EXECUTABLE)
  1311. MESSAGE(STATUS "WARNING: Cannot find dlltool, disabling .def/.lib generation")
  1312. ENDIF()
  1313. ELSE()
  1314. SET_PROPERTY(TARGET OpenAL APPEND_STRING PROPERTY LINK_FLAGS
  1315. " -Wl,--output-def,OpenAL32.def")
  1316. ADD_CUSTOM_COMMAND(TARGET OpenAL POST_BUILD
  1317. COMMAND "${SED_EXECUTABLE}" -i -e "s/ @[^ ]*//" OpenAL32.def
  1318. COMMAND "${DLLTOOL_EXECUTABLE}" -d OpenAL32.def -l OpenAL32.lib -D OpenAL32.dll
  1319. COMMENT "Stripping ordinals from OpenAL32.def and generating OpenAL32.lib..."
  1320. VERBATIM
  1321. )
  1322. ENDIF()
  1323. ENDIF()
  1324. IF(ALSOFT_INSTALL)
  1325. INSTALL(TARGETS OpenAL EXPORT OpenAL
  1326. RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
  1327. LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
  1328. ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
  1329. INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} ${CMAKE_INSTALL_INCLUDEDIR}/AL
  1330. )
  1331. EXPORT(TARGETS OpenAL
  1332. NAMESPACE OpenAL::
  1333. FILE OpenALConfig.cmake)
  1334. INSTALL(EXPORT OpenAL
  1335. DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/OpenAL
  1336. NAMESPACE OpenAL::
  1337. FILE OpenALConfig.cmake)
  1338. INSTALL(FILES include/AL/al.h
  1339. include/AL/alc.h
  1340. include/AL/alext.h
  1341. include/AL/efx.h
  1342. include/AL/efx-creative.h
  1343. include/AL/efx-presets.h
  1344. DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/AL
  1345. )
  1346. INSTALL(FILES "${OpenAL_BINARY_DIR}/openal.pc"
  1347. DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig")
  1348. IF(TARGET soft_oal)
  1349. INSTALL(TARGETS soft_oal
  1350. RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
  1351. )
  1352. ENDIF()
  1353. ENDIF()
  1354. if(HAS_ROUTER)
  1355. message(STATUS "")
  1356. message(STATUS "Building DLL router")
  1357. endif()
  1358. MESSAGE(STATUS "")
  1359. MESSAGE(STATUS "Building OpenAL with support for the following backends:")
  1360. MESSAGE(STATUS " ${BACKENDS}")
  1361. MESSAGE(STATUS "")
  1362. MESSAGE(STATUS "Building with support for CPU extensions:")
  1363. MESSAGE(STATUS " ${CPU_EXTS}")
  1364. MESSAGE(STATUS "")
  1365. IF(FPMATH_SET)
  1366. MESSAGE(STATUS "Building with SSE${FPMATH_SET} codegen")
  1367. MESSAGE(STATUS "")
  1368. ENDIF()
  1369. IF(WIN32)
  1370. IF(NOT HAVE_DSOUND)
  1371. MESSAGE(STATUS "WARNING: Building the Windows version without DirectSound output")
  1372. MESSAGE(STATUS " This is probably NOT what you want!")
  1373. MESSAGE(STATUS "")
  1374. ENDIF()
  1375. ENDIF()
  1376. if(ALSOFT_EMBED_HRTF_DATA)
  1377. message(STATUS "Embedding HRTF datasets")
  1378. message(STATUS "")
  1379. endif()
  1380. # Install alsoft.conf configuration file
  1381. IF(ALSOFT_CONFIG)
  1382. INSTALL(FILES alsoftrc.sample
  1383. DESTINATION ${CMAKE_INSTALL_DATADIR}/openal
  1384. )
  1385. MESSAGE(STATUS "Installing sample configuration")
  1386. MESSAGE(STATUS "")
  1387. ENDIF()
  1388. # Install HRTF definitions
  1389. IF(ALSOFT_HRTF_DEFS)
  1390. INSTALL(FILES hrtf/default-44100.mhr
  1391. hrtf/default-48000.mhr
  1392. DESTINATION ${CMAKE_INSTALL_DATADIR}/openal/hrtf
  1393. )
  1394. MESSAGE(STATUS "Installing HRTF definitions")
  1395. MESSAGE(STATUS "")
  1396. ENDIF()
  1397. # Install AmbDec presets
  1398. IF(ALSOFT_AMBDEC_PRESETS)
  1399. INSTALL(FILES presets/3D7.1.ambdec
  1400. presets/hexagon.ambdec
  1401. presets/itu5.1.ambdec
  1402. presets/itu5.1-nocenter.ambdec
  1403. presets/rectangle.ambdec
  1404. presets/square.ambdec
  1405. presets/presets.txt
  1406. DESTINATION ${CMAKE_INSTALL_DATADIR}/openal/presets
  1407. )
  1408. MESSAGE(STATUS "Installing AmbDec presets")
  1409. MESSAGE(STATUS "")
  1410. ENDIF()
  1411. IF(ALSOFT_UTILS)
  1412. ADD_EXECUTABLE(openal-info utils/openal-info.c)
  1413. TARGET_COMPILE_OPTIONS(openal-info PRIVATE ${C_FLAGS})
  1414. TARGET_LINK_LIBRARIES(openal-info PRIVATE ${LINKER_FLAGS} OpenAL)
  1415. SET(MAKEHRTF_SRCS utils/makehrtf.c)
  1416. IF(NOT HAVE_GETOPT)
  1417. SET(MAKEHRTF_SRCS ${MAKEHRTF_SRCS} utils/getopt.c utils/getopt.h)
  1418. ENDIF()
  1419. ADD_EXECUTABLE(makehrtf ${MAKEHRTF_SRCS})
  1420. TARGET_COMPILE_DEFINITIONS(makehrtf PRIVATE ${CPP_DEFS})
  1421. TARGET_COMPILE_OPTIONS(makehrtf PRIVATE ${C_FLAGS})
  1422. IF(HAVE_LIBM)
  1423. TARGET_LINK_LIBRARIES(makehrtf PRIVATE ${LINKER_FLAGS} m)
  1424. ENDIF()
  1425. IF(ALSOFT_INSTALL)
  1426. INSTALL(TARGETS openal-info makehrtf
  1427. RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
  1428. LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
  1429. ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
  1430. )
  1431. ENDIF()
  1432. MESSAGE(STATUS "Building utility programs")
  1433. IF(TARGET alsoft-config)
  1434. MESSAGE(STATUS "Building configuration program")
  1435. ENDIF()
  1436. MESSAGE(STATUS "")
  1437. ENDIF()
  1438. IF(ALSOFT_TESTS)
  1439. SET(TEST_COMMON_OBJS examples/common/alhelpers.c)
  1440. ADD_EXECUTABLE(altonegen examples/altonegen.c ${TEST_COMMON_OBJS})
  1441. TARGET_COMPILE_DEFINITIONS(altonegen PRIVATE ${CPP_DEFS})
  1442. TARGET_COMPILE_OPTIONS(altonegen PRIVATE ${C_FLAGS})
  1443. TARGET_LINK_LIBRARIES(altonegen PRIVATE ${LINKER_FLAGS} common OpenAL ${MATH_LIB})
  1444. IF(ALSOFT_INSTALL)
  1445. INSTALL(TARGETS altonegen
  1446. RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
  1447. LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
  1448. ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
  1449. )
  1450. ENDIF()
  1451. MESSAGE(STATUS "Building test programs")
  1452. MESSAGE(STATUS "")
  1453. ENDIF()
  1454. IF(ALSOFT_EXAMPLES)
  1455. ADD_EXECUTABLE(alrecord examples/alrecord.c)
  1456. TARGET_COMPILE_DEFINITIONS(alrecord PRIVATE ${CPP_DEFS})
  1457. TARGET_COMPILE_OPTIONS(alrecord PRIVATE ${C_FLAGS})
  1458. TARGET_LINK_LIBRARIES(alrecord PRIVATE ${LINKER_FLAGS} common OpenAL)
  1459. IF(ALSOFT_INSTALL)
  1460. INSTALL(TARGETS alrecord
  1461. RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
  1462. LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
  1463. ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
  1464. )
  1465. ENDIF()
  1466. MESSAGE(STATUS "Building example programs")
  1467. IF(SDL2_FOUND)
  1468. IF(SDL_SOUND_FOUND)
  1469. # Add a static library with common functions used by multiple targets
  1470. ADD_LIBRARY(ex-common STATIC examples/common/alhelpers.c)
  1471. TARGET_COMPILE_DEFINITIONS(ex-common PRIVATE ${CPP_DEFS})
  1472. TARGET_COMPILE_OPTIONS(ex-common PRIVATE ${C_FLAGS})
  1473. ADD_EXECUTABLE(alplay examples/alplay.c)
  1474. TARGET_COMPILE_DEFINITIONS(alplay PRIVATE ${CPP_DEFS})
  1475. TARGET_INCLUDE_DIRECTORIES(alplay
  1476. PRIVATE ${SDL2_INCLUDE_DIR} ${SDL_SOUND_INCLUDE_DIR})
  1477. TARGET_COMPILE_OPTIONS(alplay PRIVATE ${C_FLAGS})
  1478. TARGET_LINK_LIBRARIES(alplay
  1479. PRIVATE ${LINKER_FLAGS} ${SDL_SOUND_LIBRARIES} ${SDL2_LIBRARY} ex-common common
  1480. OpenAL)
  1481. ADD_EXECUTABLE(alstream examples/alstream.c)
  1482. TARGET_COMPILE_DEFINITIONS(alstream PRIVATE ${CPP_DEFS})
  1483. TARGET_INCLUDE_DIRECTORIES(alstream
  1484. PRIVATE ${SDL2_INCLUDE_DIR} ${SDL_SOUND_INCLUDE_DIR})
  1485. TARGET_COMPILE_OPTIONS(alstream PRIVATE ${C_FLAGS})
  1486. TARGET_LINK_LIBRARIES(alstream
  1487. PRIVATE ${LINKER_FLAGS} ${SDL_SOUND_LIBRARIES} ${SDL2_LIBRARY} ex-common common
  1488. OpenAL)
  1489. ADD_EXECUTABLE(alreverb examples/alreverb.c)
  1490. TARGET_COMPILE_DEFINITIONS(alreverb PRIVATE ${CPP_DEFS})
  1491. TARGET_INCLUDE_DIRECTORIES(alreverb
  1492. PRIVATE ${SDL2_INCLUDE_DIR} ${SDL_SOUND_INCLUDE_DIR})
  1493. TARGET_COMPILE_OPTIONS(alreverb PRIVATE ${C_FLAGS})
  1494. TARGET_LINK_LIBRARIES(alreverb
  1495. PRIVATE ${LINKER_FLAGS} ${SDL_SOUND_LIBRARIES} ${SDL2_LIBRARY} ex-common common
  1496. OpenAL)
  1497. ADD_EXECUTABLE(almultireverb examples/almultireverb.c)
  1498. TARGET_COMPILE_DEFINITIONS(almultireverb PRIVATE ${CPP_DEFS})
  1499. TARGET_INCLUDE_DIRECTORIES(almultireverb
  1500. PRIVATE ${SDL2_INCLUDE_DIR} ${SDL_SOUND_INCLUDE_DIR})
  1501. TARGET_COMPILE_OPTIONS(almultireverb PRIVATE ${C_FLAGS})
  1502. TARGET_LINK_LIBRARIES(almultireverb
  1503. PRIVATE ${LINKER_FLAGS} ${SDL_SOUND_LIBRARIES} ${SDL2_LIBRARY} ex-common common
  1504. OpenAL ${MATH_LIB})
  1505. ADD_EXECUTABLE(allatency examples/allatency.c)
  1506. TARGET_COMPILE_DEFINITIONS(allatency PRIVATE ${CPP_DEFS})
  1507. TARGET_INCLUDE_DIRECTORIES(allatency
  1508. PRIVATE ${SDL2_INCLUDE_DIR} ${SDL_SOUND_INCLUDE_DIR})
  1509. TARGET_COMPILE_OPTIONS(allatency PRIVATE ${C_FLAGS})
  1510. TARGET_LINK_LIBRARIES(allatency
  1511. PRIVATE ${LINKER_FLAGS} ${SDL_SOUND_LIBRARIES} ${SDL2_LIBRARY} ex-common common
  1512. OpenAL)
  1513. ADD_EXECUTABLE(alloopback examples/alloopback.c)
  1514. TARGET_COMPILE_DEFINITIONS(alloopback PRIVATE ${CPP_DEFS})
  1515. TARGET_INCLUDE_DIRECTORIES(alloopback
  1516. PRIVATE ${SDL2_INCLUDE_DIR} ${SDL_SOUND_INCLUDE_DIR})
  1517. TARGET_COMPILE_OPTIONS(alloopback PRIVATE ${C_FLAGS})
  1518. TARGET_LINK_LIBRARIES(alloopback
  1519. PRIVATE ${LINKER_FLAGS} ${SDL_SOUND_LIBRARIES} ${SDL2_LIBRARY} ex-common common
  1520. OpenAL ${MATH_LIB})
  1521. ADD_EXECUTABLE(alhrtf examples/alhrtf.c)
  1522. TARGET_COMPILE_DEFINITIONS(alhrtf PRIVATE ${CPP_DEFS})
  1523. TARGET_INCLUDE_DIRECTORIES(alhrtf
  1524. PRIVATE ${SDL2_INCLUDE_DIR} ${SDL_SOUND_INCLUDE_DIR})
  1525. TARGET_COMPILE_OPTIONS(alhrtf PRIVATE ${C_FLAGS})
  1526. TARGET_LINK_LIBRARIES(alhrtf
  1527. PRIVATE ${LINKER_FLAGS} ${SDL_SOUND_LIBRARIES} ${SDL2_LIBRARY} ex-common common
  1528. OpenAL ${MATH_LIB})
  1529. IF(ALSOFT_INSTALL)
  1530. INSTALL(TARGETS alplay alstream alreverb almultireverb allatency alloopback alhrtf
  1531. RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
  1532. LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
  1533. ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
  1534. )
  1535. ENDIF()
  1536. MESSAGE(STATUS "Building SDL_sound example programs")
  1537. ENDIF()
  1538. SET(FFVER_OK FALSE)
  1539. IF(FFMPEG_FOUND)
  1540. SET(FFVER_OK TRUE)
  1541. IF(AVFORMAT_VERSION VERSION_LESS "57.56.101")
  1542. MESSAGE(STATUS "libavformat is too old! (${AVFORMAT_VERSION}, wanted 57.56.101)")
  1543. SET(FFVER_OK FALSE)
  1544. ENDIF()
  1545. IF(AVCODEC_VERSION VERSION_LESS "57.64.101")
  1546. MESSAGE(STATUS "libavcodec is too old! (${AVCODEC_VERSION}, wanted 57.64.101)")
  1547. SET(FFVER_OK FALSE)
  1548. ENDIF()
  1549. IF(AVUTIL_VERSION VERSION_LESS "55.34.101")
  1550. MESSAGE(STATUS "libavutil is too old! (${AVUTIL_VERSION}, wanted 55.34.101)")
  1551. SET(FFVER_OK FALSE)
  1552. ENDIF()
  1553. IF(SWSCALE_VERSION VERSION_LESS "4.2.100")
  1554. MESSAGE(STATUS "libswscale is too old! (${SWSCALE_VERSION}, wanted 4.2.100)")
  1555. SET(FFVER_OK FALSE)
  1556. ENDIF()
  1557. IF(SWRESAMPLE_VERSION VERSION_LESS "2.3.100")
  1558. MESSAGE(STATUS "libswresample is too old! (${SWRESAMPLE_VERSION}, wanted 2.3.100)")
  1559. SET(FFVER_OK FALSE)
  1560. ENDIF()
  1561. ENDIF()
  1562. IF(FFVER_OK)
  1563. ADD_EXECUTABLE(alffplay examples/alffplay.cpp)
  1564. TARGET_COMPILE_DEFINITIONS(alffplay PRIVATE ${CPP_DEFS})
  1565. TARGET_INCLUDE_DIRECTORIES(alffplay
  1566. PRIVATE ${SDL2_INCLUDE_DIR} ${FFMPEG_INCLUDE_DIRS})
  1567. TARGET_COMPILE_OPTIONS(alffplay PRIVATE ${C_FLAGS})
  1568. TARGET_LINK_LIBRARIES(alffplay
  1569. PRIVATE ${LINKER_FLAGS} ${SDL2_LIBRARY} ${FFMPEG_LIBRARIES} common OpenAL)
  1570. IF(ALSOFT_INSTALL)
  1571. INSTALL(TARGETS alffplay
  1572. RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
  1573. LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
  1574. ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
  1575. )
  1576. ENDIF()
  1577. MESSAGE(STATUS "Building SDL+FFmpeg example programs")
  1578. ENDIF()
  1579. MESSAGE(STATUS "")
  1580. ENDIF()
  1581. ENDIF()