1 # Set minimum CMake required version for this project.
2 cmake_minimum_required(VERSION 3.10 FATAL_ERROR)
4 # Define a C++ project.
5 project(RtAudio LANGUAGES CXX)
7 # Check for Jack (any OS)
8 find_library(JACK_LIB jack)
9 find_package(PkgConfig)
10 pkg_check_modules(jack jack)
11 if(JACK_LIB OR jack_FOUND)
15 # Check for Pulse (any OS)
16 pkg_check_modules(pulse libpulse-simple)
18 # Check for known non-Linux unix-likes
19 if (CMAKE_SYSTEM_NAME MATCHES "kNetBSD.*|NetBSD.*")
20 message(STATUS "NetBSD detected, using OSS")
22 elseif(UNIX AND NOT APPLE)
26 # Necessary for Windows
28 set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)
32 option(RTAUDIO_BUILD_PYTHON "Build PyRtAudio python bindings" OFF)
33 set(RTAUDIO_TARGETNAME_UNINSTALL "uninstall" CACHE STRING "Name of 'uninstall' build target")
36 option(RTAUDIO_API_DS "Build DirectSound API" OFF)
37 option(RTAUDIO_API_ASIO "Build ASIO API" OFF)
38 option(RTAUDIO_API_WASAPI "Build WASAPI API" ${WIN32})
39 option(RTAUDIO_API_OSS "Build OSS4 API" ${xBSD})
40 option(RTAUDIO_API_ALSA "Build ALSA API" ${LINUX})
41 option(RTAUDIO_API_PULSE "Build PulseAudio API" ${pulse_FOUND})
42 option(RTAUDIO_API_JACK "Build JACK audio server API" ${HAVE_JACK})
43 option(RTAUDIO_API_CORE "Build CoreAudio API" ${APPLE})
46 include(CheckFunctionExists)
47 check_function_exists(gettimeofday HAVE_GETTIMEOFDAY)
48 if (HAVE_GETTIMEOFDAY)
49 add_definitions(-DHAVE_GETTIMEOFDAY)
52 # Add -Wall if possible
53 if (CMAKE_COMPILER_IS_GNUCXX)
54 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall")
55 endif (CMAKE_COMPILER_IS_GNUCXX)
58 if (CMAKE_BUILD_TYPE STREQUAL "Debug")
59 add_definitions(-D__RTAUDIO_DEBUG__)
60 if (CMAKE_COMPILER_IS_GNUCXX)
61 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror")
62 endif (CMAKE_COMPILER_IS_GNUCXX)
65 # Read libtool version info from configure.ac
66 set(R "m4_define\\(\\[lt_([a-z]+)\\], ([0-9]+)\\)")
67 file(STRINGS "${CMAKE_CURRENT_SOURCE_DIR}/configure.ac" CONFIGAC
69 foreach(_S ${CONFIGAC})
70 string(REGEX REPLACE ${R} "\\1" k ${_S})
71 string(REGEX REPLACE ${R} "\\2" v ${_S})
74 math(EXPR SO_current_minus_age "${SO_current} - ${SO_age}")
75 set(SO_VER "${SO_current_minus_age}")
76 set(FULL_VER "${SO_current_minus_age}.${SO_revision}.${SO_age}")
78 # Read package version info from configure.ac
79 set(R "AC_INIT\\(RtAudio, ([0-9\\.]+),.*\\)")
80 file(STRINGS "${CMAKE_CURRENT_SOURCE_DIR}/configure.ac" CONFIGAC
82 string(REGEX REPLACE ${R} "\\1" PACKAGE_VERSION ${CONFIGAC})
85 set(rtaudio_SOURCES RtAudio.cpp RtAudio.h rtaudio_c.cpp rtaudio_c.h)
87 set(PKGCONFIG_REQUIRES)
91 # Tweak API-specific configuration.
94 if (RTAUDIO_API_JACK AND jack_FOUND)
96 list(APPEND PKGCONFIG_REQUIRES "jack")
97 list(APPEND API_DEFS "-D__UNIX_JACK__")
98 list(APPEND API_LIST "jack")
100 list(APPEND LINKLIBS ${jack_LIBRARIES})
101 list(APPEND INCDIRS ${jack_INCLUDEDIR})
103 list(APPEND LINKLIBS ${JACK_LIB})
108 if (RTAUDIO_API_ALSA)
112 message(FATAL_ERROR "ALSA API requested but no ALSA dev libraries found")
114 list(APPEND INCDIRS ${ALSA_INCLUDE_DIR})
115 list(APPEND LINKLIBS ${ALSA_LIBRARY})
116 list(APPEND PKGCONFIG_REQUIRES "alsa")
117 list(APPEND API_DEFS "-D__LINUX_ALSA__")
118 list(APPEND API_LIST "alsa")
124 find_library(OSSAUDIO_LIB ossaudio)
126 list(APPEND LINKLIBS ossaudio)
127 # Note: not an error on some systems
129 list(APPEND API_DEFS "-D__LINUX_OSS__")
130 list(APPEND API_LIST "oss")
134 if (RTAUDIO_API_PULSE)
136 find_library(PULSE_LIB pulse)
137 find_library(PULSESIMPLE_LIB pulse-simple)
138 list(APPEND LINKLIBS ${PULSE_LIB} ${PULSESIMPLE_LIB})
139 list(APPEND PKGCONFIG_REQUIRES "libpulse-simple")
140 list(APPEND API_DEFS "-D__LINUX_PULSE__")
141 list(APPEND API_LIST "pulse")
145 if (RTAUDIO_API_CORE)
146 find_library(COREAUDIO_LIB CoreAudio)
147 find_library(COREFOUNDATION_LIB CoreFoundation)
148 list(APPEND LINKLIBS ${COREAUDIO_LIB} ${COREFOUNDATION_LIB})
149 list(APPEND API_DEFS "-D__MACOSX_CORE__")
150 list(APPEND API_LIST "core")
154 if (RTAUDIO_API_ASIO)
155 set(NEED_WIN32LIBS ON)
156 include_directories(include)
157 list(APPEND rtaudio_SOURCES
159 include/asiodrivers.cpp
161 include/iasiothiscallresolver.cpp)
162 list(APPEND API_DEFS "-D__WINDOWS_ASIO__")
163 list(APPEND API_LIST "asio")
168 set(NEED_WIN32LIBS ON)
169 list(APPEND LINKLIBS dsound)
170 list(APPEND API_DEFS "-D__WINDOWS_DS__")
171 list(APPEND API_LIST "ds")
175 if (RTAUDIO_API_WASAPI)
176 include_directories(include)
177 set(NEED_WIN32LIBS ON)
178 list(APPEND LINKLIBS ksuser mfplat mfuuid wmcodecdspuuid)
179 list(APPEND API_DEFS "-D__WINDOWS_WASAPI__")
180 list(APPEND API_LIST "wasapi")
185 list(APPEND LINKLIBS winmm ole32)
190 find_package(Threads REQUIRED
191 CMAKE_THREAD_PREFER_PTHREAD
192 THREADS_PREFER_PTHREAD_FLAG)
193 list(APPEND LINKLIBS Threads::Threads)
196 # Create library targets.
197 cmake_policy(SET CMP0042 OLD)
200 add_library(rtaudio ${rtaudio_SOURCES})
201 list(APPEND LIB_TARGETS rtaudio)
202 # Add headers destination for install rule.
203 set_target_properties(rtaudio PROPERTIES PUBLIC_HEADER RtAudio.h
206 # Set include paths, populate target interface.
207 target_include_directories(rtaudio PRIVATE
208 $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
209 $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
211 # Set compile-time definitions
212 target_compile_definitions(rtaudio PRIVATE ${API_DEFS})
213 target_compile_definitions(rtaudio PRIVATE RTAUDIO_EXPORT)
214 target_link_libraries(rtaudio ${LINKLIBS})
217 # Set standard installation directories.
218 include(GNUInstallDirs)
224 add_subdirectory(tests)
228 string(REPLACE ";" " " apilist "${API_LIST}")
229 message(STATUS "Compiling with support for: ${apilist}")
232 string(REPLACE ";" " " req "${PKGCONFIG_REQUIRES}")
233 string(REPLACE ";" " " api "${API_DEFS}")
234 set(prefix ${CMAKE_INSTALL_PREFIX})
235 configure_file("${CMAKE_CURRENT_SOURCE_DIR}/rtaudio.pc.in" "rtaudio.pc" @ONLY)
238 install(TARGETS ${LIB_TARGETS}
239 EXPORT RtAudioTargets
240 LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
241 ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
242 RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
243 PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
245 # Store the package in the user registry.
246 export(PACKAGE RtAudio)
248 # Set installation path for CMake files.
249 set(RTAUDIO_CMAKE_DESTINATION share/rtaudio)
251 # Create CMake configuration export file.
253 file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/RtAudioConfig.cmake "find_package(Threads REQUIRED)\n")
256 file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/RtAudioConfig.cmake "include(\${CMAKE_CURRENT_LIST_DIR}/RtAudioTargets.cmake)")
258 # Install CMake configuration export file.
259 install(FILES ${CMAKE_CURRENT_BINARY_DIR}/RtAudioConfig.cmake
260 DESTINATION ${RTAUDIO_CMAKE_DESTINATION})
262 # Export library target (build-tree).
263 export(EXPORT RtAudioTargets
266 # Export library target (install-tree).
267 install(EXPORT RtAudioTargets
268 DESTINATION ${RTAUDIO_CMAKE_DESTINATION}
271 # Configure uninstall target.
273 "${CMAKE_CURRENT_SOURCE_DIR}/cmake/RtAudioConfigUninstall.cmake.in"
274 "${CMAKE_CURRENT_BINARY_DIR}/RtAudioConfigUninstall.cmake" @ONLY)
276 # Create uninstall target.
277 add_custom_target(${RTAUDIO_TARGETNAME_UNINSTALL}
278 COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/RtAudioConfigUninstall.cmake)
281 FILES ${CMAKE_CURRENT_BINARY_DIR}/rtaudio.pc
282 DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)