You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

283 lines
8.0KB

  1. # Set minimum CMake required version for this project.
  2. cmake_minimum_required(VERSION 3.10 FATAL_ERROR)
  3. # Define a C++ project.
  4. project(RtAudio LANGUAGES CXX)
  5. # Check for Jack (any OS)
  6. find_library(JACK_LIB jack)
  7. find_package(PkgConfig)
  8. pkg_check_modules(jack jack)
  9. if(JACK_LIB OR jack_FOUND)
  10. set(HAVE_JACK TRUE)
  11. endif()
  12. # Check for Pulse (any OS)
  13. pkg_check_modules(pulse libpulse-simple)
  14. # Check for known non-Linux unix-likes
  15. if (CMAKE_SYSTEM_NAME MATCHES "kNetBSD.*|NetBSD.*")
  16. message(STATUS "NetBSD detected, using OSS")
  17. set(xBSD ON)
  18. elseif(UNIX AND NOT APPLE)
  19. set(LINUX ON)
  20. endif()
  21. # Necessary for Windows
  22. if(MINGW)
  23. set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)
  24. endif()
  25. # Build Options
  26. option(RTAUDIO_BUILD_PYTHON "Build PyRtAudio python bindings" OFF)
  27. set(RTAUDIO_TARGETNAME_UNINSTALL "uninstall" CACHE STRING "Name of 'uninstall' build target")
  28. # API Options
  29. option(RTAUDIO_API_DS "Build DirectSound API" OFF)
  30. option(RTAUDIO_API_ASIO "Build ASIO API" OFF)
  31. option(RTAUDIO_API_WASAPI "Build WASAPI API" ${WIN32})
  32. option(RTAUDIO_API_OSS "Build OSS4 API" ${xBSD})
  33. option(RTAUDIO_API_ALSA "Build ALSA API" ${LINUX})
  34. option(RTAUDIO_API_PULSE "Build PulseAudio API" ${pulse_FOUND})
  35. option(RTAUDIO_API_JACK "Build JACK audio server API" ${HAVE_JACK})
  36. option(RTAUDIO_API_CORE "Build CoreAudio API" ${APPLE})
  37. # Check for functions
  38. include(CheckFunctionExists)
  39. check_function_exists(gettimeofday HAVE_GETTIMEOFDAY)
  40. if (HAVE_GETTIMEOFDAY)
  41. add_definitions(-DHAVE_GETTIMEOFDAY)
  42. endif ()
  43. # Add -Wall if possible
  44. if (CMAKE_COMPILER_IS_GNUCXX)
  45. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall")
  46. endif (CMAKE_COMPILER_IS_GNUCXX)
  47. # Add debug flags
  48. if (CMAKE_BUILD_TYPE STREQUAL "Debug")
  49. add_definitions(-D__RTAUDIO_DEBUG__)
  50. if (CMAKE_COMPILER_IS_GNUCXX)
  51. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror")
  52. endif (CMAKE_COMPILER_IS_GNUCXX)
  53. endif ()
  54. # Read libtool version info from configure.ac
  55. set(R "m4_define\\(\\[lt_([a-z]+)\\], ([0-9]+)\\)")
  56. file(STRINGS "${CMAKE_CURRENT_SOURCE_DIR}/configure.ac" CONFIGAC
  57. REGEX ${R})
  58. foreach(_S ${CONFIGAC})
  59. string(REGEX REPLACE ${R} "\\1" k ${_S})
  60. string(REGEX REPLACE ${R} "\\2" v ${_S})
  61. set(SO_${k} ${v})
  62. endforeach()
  63. math(EXPR SO_current_minus_age "${SO_current} - ${SO_age}")
  64. set(SO_VER "${SO_current_minus_age}")
  65. set(FULL_VER "${SO_current_minus_age}.${SO_revision}.${SO_age}")
  66. # Read package version info from configure.ac
  67. set(R "AC_INIT\\(RtAudio, ([0-9\\.]+),.*\\)")
  68. file(STRINGS "${CMAKE_CURRENT_SOURCE_DIR}/configure.ac" CONFIGAC
  69. REGEX ${R})
  70. string(REGEX REPLACE ${R} "\\1" PACKAGE_VERSION ${CONFIGAC})
  71. # Init variables
  72. set(rtaudio_SOURCES RtAudio.cpp RtAudio.h rtaudio_c.cpp rtaudio_c.h)
  73. set(LINKLIBS)
  74. set(PKGCONFIG_REQUIRES)
  75. set(API_DEFS)
  76. set(API_LIST)
  77. # Tweak API-specific configuration.
  78. # Jack
  79. if (RTAUDIO_API_JACK AND jack_FOUND)
  80. set(NEED_PTHREAD ON)
  81. list(APPEND PKGCONFIG_REQUIRES "jack")
  82. list(APPEND API_DEFS "-D__UNIX_JACK__")
  83. list(APPEND API_LIST "jack")
  84. if(jack_FOUND)
  85. list(APPEND LINKLIBS ${jack_LIBRARIES})
  86. list(APPEND INCDIRS ${jack_INCLUDEDIR})
  87. else()
  88. list(APPEND LINKLIBS ${JACK_LIB})
  89. endif()
  90. endif()
  91. # ALSA
  92. if (RTAUDIO_API_ALSA)
  93. set(NEED_PTHREAD ON)
  94. find_package(ALSA)
  95. if (NOT ALSA_FOUND)
  96. message(FATAL_ERROR "ALSA API requested but no ALSA dev libraries found")
  97. endif()
  98. list(APPEND INCDIRS ${ALSA_INCLUDE_DIR})
  99. list(APPEND LINKLIBS ${ALSA_LIBRARY})
  100. list(APPEND PKGCONFIG_REQUIRES "alsa")
  101. list(APPEND API_DEFS "-D__LINUX_ALSA__")
  102. list(APPEND API_LIST "alsa")
  103. endif()
  104. # OSS
  105. if (RTAUDIO_OSS)
  106. set(NEED_PTHREAD ON)
  107. find_library(OSSAUDIO_LIB ossaudio)
  108. if (OSSAUDIO_LIB)
  109. list(APPEND LINKLIBS ossaudio)
  110. # Note: not an error on some systems
  111. endif()
  112. list(APPEND API_DEFS "-D__LINUX_OSS__")
  113. list(APPEND API_LIST "oss")
  114. endif()
  115. # Pulse
  116. if (RTAUDIO_API_PULSE)
  117. set(NEED_PTHREAD ON)
  118. find_library(PULSE_LIB pulse)
  119. find_library(PULSESIMPLE_LIB pulse-simple)
  120. list(APPEND LINKLIBS ${PULSE_LIB} ${PULSESIMPLE_LIB})
  121. list(APPEND PKGCONFIG_REQUIRES "libpulse-simple")
  122. list(APPEND API_DEFS "-D__LINUX_PULSE__")
  123. list(APPEND API_LIST "pulse")
  124. endif()
  125. # CoreAudio
  126. if (RTAUDIO_API_CORE)
  127. find_library(COREAUDIO_LIB CoreAudio)
  128. find_library(COREFOUNDATION_LIB CoreFoundation)
  129. list(APPEND LINKLIBS ${COREAUDIO_LIB} ${COREFOUNDATION_LIB})
  130. list(APPEND API_DEFS "-D__MACOSX_CORE__")
  131. list(APPEND API_LIST "core")
  132. endif()
  133. # ASIO
  134. if (RTAUDIO_API_ASIO)
  135. set(NEED_WIN32LIBS ON)
  136. include_directories(include)
  137. list(APPEND rtaudio_SOURCES
  138. include/asio.cpp
  139. include/asiodrivers.cpp
  140. include/asiolist.cpp
  141. include/iasiothiscallresolver.cpp)
  142. list(APPEND API_DEFS "-D__WINDOWS_ASIO__")
  143. list(APPEND API_LIST "asio")
  144. endif()
  145. # DSound
  146. if (RTAUDIO_API_DS)
  147. set(NEED_WIN32LIBS ON)
  148. list(APPEND LINKLIBS dsound)
  149. list(APPEND API_DEFS "-D__WINDOWS_DS__")
  150. list(APPEND API_LIST "ds")
  151. endif()
  152. # WASAPI
  153. if (RTAUDIO_API_WASAPI)
  154. include_directories(include)
  155. set(NEED_WIN32LIBS ON)
  156. list(APPEND LINKLIBS ksuser mfplat mfuuid wmcodecdspuuid)
  157. list(APPEND API_DEFS "-D__WINDOWS_WASAPI__")
  158. list(APPEND API_LIST "wasapi")
  159. endif()
  160. # Windows libs
  161. if (NEED_WIN32LIBS)
  162. list(APPEND LINKLIBS winmm ole32)
  163. endif()
  164. # pthread
  165. if (NEED_PTHREAD)
  166. find_package(Threads REQUIRED
  167. CMAKE_THREAD_PREFER_PTHREAD
  168. THREADS_PREFER_PTHREAD_FLAG)
  169. list(APPEND LINKLIBS Threads::Threads)
  170. endif()
  171. # Create library targets.
  172. cmake_policy(SET CMP0042 OLD)
  173. set(LIB_TARGETS)
  174. add_library(rtaudio ${rtaudio_SOURCES})
  175. list(APPEND LIB_TARGETS rtaudio)
  176. # Add headers destination for install rule.
  177. set_target_properties(rtaudio PROPERTIES PUBLIC_HEADER RtAudio.h
  178. SOVERSION ${SO_VER}
  179. VERSION ${FULL_VER})
  180. # Set include paths, populate target interface.
  181. target_include_directories(rtaudio PRIVATE
  182. $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
  183. $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
  184. ${INCDIRS})
  185. # Set compile-time definitions
  186. target_compile_definitions(rtaudio PRIVATE ${API_DEFS})
  187. target_compile_definitions(rtaudio PRIVATE RTAUDIO_EXPORT)
  188. target_link_libraries(rtaudio ${LINKLIBS})
  189. # Set standard installation directories.
  190. include(GNUInstallDirs)
  191. # Subdirs
  192. include(CTest)
  193. if (BUILD_TESTING)
  194. add_subdirectory(tests)
  195. endif()
  196. # Message
  197. string(REPLACE ";" " " apilist "${API_LIST}")
  198. message(STATUS "Compiling with support for: ${apilist}")
  199. # PkgConfig file
  200. string(REPLACE ";" " " req "${PKGCONFIG_REQUIRES}")
  201. string(REPLACE ";" " " api "${API_DEFS}")
  202. set(prefix ${CMAKE_INSTALL_PREFIX})
  203. configure_file("${CMAKE_CURRENT_SOURCE_DIR}/rtaudio.pc.in" "rtaudio.pc" @ONLY)
  204. # Add install rule.
  205. install(TARGETS ${LIB_TARGETS}
  206. EXPORT RtAudioTargets
  207. LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
  208. ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
  209. RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
  210. PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
  211. # Store the package in the user registry.
  212. export(PACKAGE RtAudio)
  213. # Set installation path for CMake files.
  214. set(RTAUDIO_CMAKE_DESTINATION share/rtaudio)
  215. # Create CMake configuration export file.
  216. if(NEED_PTHREAD)
  217. file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/RtAudioConfig.cmake "find_package(Threads REQUIRED)\n")
  218. endif()
  219. file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/RtAudioConfig.cmake "include(\${CMAKE_CURRENT_LIST_DIR}/RtAudioTargets.cmake)")
  220. # Install CMake configuration export file.
  221. install(FILES ${CMAKE_CURRENT_BINARY_DIR}/RtAudioConfig.cmake
  222. DESTINATION ${RTAUDIO_CMAKE_DESTINATION})
  223. # Export library target (build-tree).
  224. export(EXPORT RtAudioTargets
  225. NAMESPACE RtAudio::)
  226. # Export library target (install-tree).
  227. install(EXPORT RtAudioTargets
  228. DESTINATION ${RTAUDIO_CMAKE_DESTINATION}
  229. NAMESPACE RtAudio::)
  230. # Configure uninstall target.
  231. configure_file(
  232. "${CMAKE_CURRENT_SOURCE_DIR}/cmake/RtAudioConfigUninstall.cmake.in"
  233. "${CMAKE_CURRENT_BINARY_DIR}/RtAudioConfigUninstall.cmake" @ONLY)
  234. # Create uninstall target.
  235. add_custom_target(${RTAUDIO_TARGETNAME_UNINSTALL}
  236. COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/RtAudioConfigUninstall.cmake)
  237. install(
  238. FILES ${CMAKE_CURRENT_BINARY_DIR}/rtaudio.pc
  239. DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)