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)
31 # Standard CMake options
32 option(BUILD_SHARED_LIBS "Build as shared library" ON)
34 if (NOT CMAKE_CONFIGURATION_TYPES AND NOT CMAKE_BUILD_TYPE)
35 set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug;Release;RelWithDebInfo;MinSizeRel")
38 set(CMAKE_DEBUG_POSTFIX d CACHE STRING "Postfix for debug version of library")
42 option(RTAUDIO_BUILD_PYTHON "Build PyRtAudio python bindings" OFF)
43 set(RTAUDIO_TARGETNAME_UNINSTALL "uninstall" CACHE STRING "Name of 'uninstall' build target")
46 option(RTAUDIO_API_DS "Build DirectSound API" OFF)
47 option(RTAUDIO_API_ASIO "Build ASIO API" OFF)
48 option(RTAUDIO_API_WASAPI "Build WASAPI API" ${WIN32})
49 option(RTAUDIO_API_OSS "Build OSS4 API" ${xBSD})
50 option(RTAUDIO_API_ALSA "Build ALSA API" ${LINUX})
51 option(RTAUDIO_API_PULSE "Build PulseAudio API" ${pulse_FOUND})
52 option(RTAUDIO_API_JACK "Build JACK audio server API" ${HAVE_JACK})
53 option(RTAUDIO_API_CORE "Build CoreAudio API" ${APPLE})
56 include(CheckFunctionExists)
57 check_function_exists(gettimeofday HAVE_GETTIMEOFDAY)
58 if (HAVE_GETTIMEOFDAY)
59 add_definitions(-DHAVE_GETTIMEOFDAY)
62 # Add -Wall if possible
63 if (CMAKE_COMPILER_IS_GNUCXX)
64 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall")
65 endif (CMAKE_COMPILER_IS_GNUCXX)
68 if (CMAKE_BUILD_TYPE STREQUAL "Debug")
69 add_definitions(-D__RTAUDIO_DEBUG__)
70 if (CMAKE_COMPILER_IS_GNUCXX)
71 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror")
72 endif (CMAKE_COMPILER_IS_GNUCXX)
75 # Read libtool version info from configure.ac
76 set(R "m4_define\\(\\[lt_([a-z]+)\\], ([0-9]+)\\)")
77 file(STRINGS "${CMAKE_CURRENT_SOURCE_DIR}/configure.ac" CONFIGAC
79 foreach(_S ${CONFIGAC})
80 string(REGEX REPLACE ${R} "\\1" k ${_S})
81 string(REGEX REPLACE ${R} "\\2" v ${_S})
84 math(EXPR SO_current_minus_age "${SO_current} - ${SO_age}")
85 set(SO_VER "${SO_current_minus_age}")
86 set(FULL_VER "${SO_current_minus_age}.${SO_revision}.${SO_age}")
88 # Read package version info from configure.ac
89 set(R "AC_INIT\\(RtAudio, ([0-9\\.]+),.*\\)")
90 file(STRINGS "${CMAKE_CURRENT_SOURCE_DIR}/configure.ac" CONFIGAC
92 string(REGEX REPLACE ${R} "\\1" PACKAGE_VERSION ${CONFIGAC})
95 set(rtaudio_SOURCES RtAudio.cpp RtAudio.h rtaudio_c.cpp rtaudio_c.h)
97 set(PKGCONFIG_REQUIRES)
101 # Tweak API-specific configuration.
104 if (RTAUDIO_API_JACK AND jack_FOUND)
106 list(APPEND PKGCONFIG_REQUIRES "jack")
107 list(APPEND API_DEFS "-D__UNIX_JACK__")
108 list(APPEND API_LIST "jack")
110 list(APPEND LINKLIBS ${jack_LIBRARIES})
111 list(APPEND INCDIRS ${jack_INCLUDEDIR})
113 list(APPEND LINKLIBS ${JACK_LIB})
118 if (RTAUDIO_API_ALSA)
122 message(FATAL_ERROR "ALSA API requested but no ALSA dev libraries found")
124 list(APPEND INCDIRS ${ALSA_INCLUDE_DIR})
125 list(APPEND LINKLIBS ${ALSA_LIBRARY})
126 list(APPEND PKGCONFIG_REQUIRES "alsa")
127 list(APPEND API_DEFS "-D__LINUX_ALSA__")
128 list(APPEND API_LIST "alsa")
134 find_library(OSSAUDIO_LIB ossaudio)
136 list(APPEND LINKLIBS ossaudio)
137 # Note: not an error on some systems
139 list(APPEND API_DEFS "-D__LINUX_OSS__")
140 list(APPEND API_LIST "oss")
144 if (RTAUDIO_API_PULSE)
146 find_library(PULSE_LIB pulse)
147 find_library(PULSESIMPLE_LIB pulse-simple)
148 list(APPEND LINKLIBS ${PULSE_LIB} ${PULSESIMPLE_LIB})
149 list(APPEND PKGCONFIG_REQUIRES "libpulse-simple")
150 list(APPEND API_DEFS "-D__LINUX_PULSE__")
151 list(APPEND API_LIST "pulse")
155 if (RTAUDIO_API_CORE)
156 find_library(COREAUDIO_LIB CoreAudio)
157 find_library(COREFOUNDATION_LIB CoreFoundation)
158 list(APPEND LINKLIBS ${COREAUDIO_LIB} ${COREFOUNDATION_LIB})
159 list(APPEND API_DEFS "-D__MACOSX_CORE__")
160 list(APPEND API_LIST "core")
164 if (RTAUDIO_API_ASIO)
165 set(NEED_WIN32LIBS ON)
166 include_directories(include)
167 list(APPEND rtaudio_SOURCES
169 include/asiodrivers.cpp
171 include/iasiothiscallresolver.cpp)
172 list(APPEND API_DEFS "-D__WINDOWS_ASIO__")
173 list(APPEND API_LIST "asio")
178 set(NEED_WIN32LIBS ON)
179 list(APPEND LINKLIBS dsound)
180 list(APPEND API_DEFS "-D__WINDOWS_DS__")
181 list(APPEND API_LIST "ds")
185 if (RTAUDIO_API_WASAPI)
186 include_directories(include)
187 set(NEED_WIN32LIBS ON)
188 list(APPEND LINKLIBS ksuser mfplat mfuuid wmcodecdspuuid)
189 list(APPEND API_DEFS "-D__WINDOWS_WASAPI__")
190 list(APPEND API_LIST "wasapi")
195 list(APPEND LINKLIBS winmm ole32)
200 find_package(Threads REQUIRED
201 CMAKE_THREAD_PREFER_PTHREAD
202 THREADS_PREFER_PTHREAD_FLAG)
203 list(APPEND LINKLIBS Threads::Threads)
206 # Create library targets.
207 cmake_policy(SET CMP0042 OLD)
210 # Use RTAUDIO_BUILD_SHARED_LIBS / RTAUDIO_BUILD_STATIC_LIBS if they
211 # are defined, otherwise default to standard BUILD_SHARED_LIBS.
212 if (DEFINED RTAUDIO_BUILD_SHARED_LIBS)
213 if (RTAUDIO_BUILD_SHARED_LIBS)
214 add_library(rtaudio SHARED ${rtaudio_SOURCES})
216 add_library(rtaudio STATIC ${rtaudio_SOURCES})
218 elseif (DEFINED RTAUDIO_BUILD_STATIC_LIBS)
219 if (RTAUDIO_BUILD_STATIC_LIBS)
220 add_library(rtaudio STATIC ${rtaudio_SOURCES})
222 add_library(rtaudio SHARED ${rtaudio_SOURCES})
225 add_library(rtaudio ${rtaudio_SOURCES})
227 list(APPEND LIB_TARGETS rtaudio)
229 # Add headers destination for install rule.
230 set_target_properties(rtaudio PROPERTIES PUBLIC_HEADER RtAudio.h
234 # Set include paths, populate target interface.
235 target_include_directories(rtaudio PRIVATE
236 $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
237 $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
240 # Set compile-time definitions
241 target_compile_definitions(rtaudio PRIVATE ${API_DEFS})
242 target_compile_definitions(rtaudio PRIVATE RTAUDIO_EXPORT)
243 target_link_libraries(rtaudio ${LINKLIBS})
246 # Set standard installation directories.
247 include(GNUInstallDirs)
252 if (NOT DEFINED RTAUDIO_BUILD_TESTING OR RTAUDIO_BUILD_TESTING STREQUAL "")
253 set(RTAUDIO_BUILD_TESTING ${BUILD_TESTING})
255 if (RTAUDIO_BUILD_TESTING)
256 add_subdirectory(tests)
260 string(REPLACE ";" " " apilist "${API_LIST}")
261 message(STATUS "Compiling with support for: ${apilist}")
264 string(REPLACE ";" " " req "${PKGCONFIG_REQUIRES}")
265 string(REPLACE ";" " " api "${API_DEFS}")
266 set(prefix ${CMAKE_INSTALL_PREFIX})
267 configure_file("${CMAKE_CURRENT_SOURCE_DIR}/rtaudio.pc.in" "rtaudio.pc" @ONLY)
270 install(TARGETS ${LIB_TARGETS}
271 EXPORT RtAudioTargets
272 LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
273 ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
274 RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
275 PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
277 # Store the package in the user registry.
278 export(PACKAGE RtAudio)
280 # Set installation path for CMake files.
281 set(RTAUDIO_CMAKE_DESTINATION share/rtaudio)
283 # Create CMake configuration export file.
285 file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/RtAudioConfig.cmake "find_package(Threads REQUIRED)\n")
288 file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/RtAudioConfig.cmake "include(\${CMAKE_CURRENT_LIST_DIR}/RtAudioTargets.cmake)")
290 # Install CMake configuration export file.
291 install(FILES ${CMAKE_CURRENT_BINARY_DIR}/RtAudioConfig.cmake
292 DESTINATION ${RTAUDIO_CMAKE_DESTINATION})
294 # Export library target (build-tree).
295 export(EXPORT RtAudioTargets
298 # Export library target (install-tree).
299 install(EXPORT RtAudioTargets
300 DESTINATION ${RTAUDIO_CMAKE_DESTINATION}
303 # Configure uninstall target.
305 "${CMAKE_CURRENT_SOURCE_DIR}/cmake/RtAudioConfigUninstall.cmake.in"
306 "${CMAKE_CURRENT_BINARY_DIR}/RtAudioConfigUninstall.cmake" @ONLY)
308 # Create uninstall target.
309 add_custom_target(${RTAUDIO_TARGETNAME_UNINSTALL}
310 COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/RtAudioConfigUninstall.cmake)
313 FILES ${CMAKE_CURRENT_BINARY_DIR}/rtaudio.pc
314 DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)