CMakeLists.txt 53 KB

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