1 # Set minimum CMake required version for this project.
2 cmake_minimum_required(VERSION 3.0 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_DEBUG_POSTFIX "d")
32 set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)
36 option(RTAUDIO_BUILD_SHARED_LIBS "Compile library shared lib." TRUE)
37 option(RTAUDIO_BUILD_STATIC_LIBS "Compile library static lib." TRUE)
38 option(RTAUDIO_BUILD_TESTING "Compile test programs." TRUE)
39 option(RTAUDIO_BUILD_PYTHON "Build PyRtAudio python bindings" OFF)
40 set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Build type (Release,Debug)")
41 set(RTAUDIO_TARGETNAME_UNINSTALL "uninstall" CACHE STRING "Name of 'uninstall' build target")
44 option(RTAUDIO_API_DS "Build DirectSound API" OFF)
45 option(RTAUDIO_API_ASIO "Build ASIO API" OFF)
46 option(RTAUDIO_API_WASAPI "Build WASAPI API" ${WIN32})
47 option(RTAUDIO_API_OSS "Build OSS4 API" ${xBSD})
48 option(RTAUDIO_API_ALSA "Build ALSA API" ${LINUX})
49 option(RTAUDIO_API_PULSE "Build PulseAudio API" ${pulse_FOUND})
50 option(RTAUDIO_API_JACK "Build JACK audio server API" ${HAVE_JACK})
51 option(RTAUDIO_API_CORE "Build CoreAudio API" ${APPLE})
54 include(CheckFunctionExists)
55 check_function_exists(gettimeofday HAVE_GETTIMEOFDAY)
56 if (HAVE_GETTIMEOFDAY)
57 add_definitions(-DHAVE_GETTIMEOFDAY)
60 # Add -Wall if possible
61 if (CMAKE_COMPILER_IS_GNUCXX)
62 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall")
63 endif (CMAKE_COMPILER_IS_GNUCXX)
66 if (CMAKE_BUILD_TYPE STREQUAL "Debug")
67 add_definitions(-D__RTAUDIO_DEBUG__)
68 if (CMAKE_COMPILER_IS_GNUCXX)
69 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror")
70 endif (CMAKE_COMPILER_IS_GNUCXX)
73 # Read libtool version info from configure.ac
74 set(R "m4_define\\(\\[lt_([a-z]+)\\], ([0-9]+)\\)")
75 file(STRINGS "${CMAKE_CURRENT_SOURCE_DIR}/configure.ac" CONFIGAC
77 foreach(_S ${CONFIGAC})
78 string(REGEX REPLACE ${R} "\\1" k ${_S})
79 string(REGEX REPLACE ${R} "\\2" v ${_S})
82 math(EXPR SO_current_minus_age "${SO_current} - ${SO_age}")
83 set(SO_VER "${SO_current_minus_age}")
84 set(FULL_VER "${SO_current_minus_age}.${SO_revision}.${SO_age}")
86 # Read package version info from configure.ac
87 set(R "AC_INIT\\(RtAudio, ([0-9\\.]+),.*\\)")
88 file(STRINGS "${CMAKE_CURRENT_SOURCE_DIR}/configure.ac" CONFIGAC
90 string(REGEX REPLACE ${R} "\\1" PACKAGE_VERSION ${CONFIGAC})
93 set(rtaudio_SOURCES RtAudio.cpp RtAudio.h rtaudio_c.cpp rtaudio_c.h)
95 set(PKGCONFIG_REQUIRES)
99 # Tweak API-specific configuration.
102 if (RTAUDIO_API_JACK AND jack_FOUND)
104 list(APPEND PKGCONFIG_REQUIRES "jack")
105 list(APPEND API_DEFS "-D__UNIX_JACK__")
106 list(APPEND API_LIST "jack")
108 list(APPEND LINKLIBS ${jack_LIBRARIES})
109 list(APPEND INCDIRS ${jack_INCLUDEDIR})
111 list(APPEND LINKLIBS ${JACK_LIB})
116 if (RTAUDIO_API_ALSA)
120 message(FATAL_ERROR "ALSA API requested but no ALSA dev libraries found")
122 list(APPEND INCDIRS ${ALSA_INCLUDE_DIR})
123 list(APPEND LINKLIBS ${ALSA_LIBRARY})
124 list(APPEND PKGCONFIG_REQUIRES "alsa")
125 list(APPEND API_DEFS "-D__LINUX_ALSA__")
126 list(APPEND API_LIST "alsa")
132 find_library(OSSAUDIO_LIB ossaudio)
134 list(APPEND LINKLIBS ossaudio)
135 # Note: not an error on some systems
137 list(APPEND API_DEFS "-D__LINUX_OSS__")
138 list(APPEND API_LIST "oss")
142 if (RTAUDIO_API_PULSE)
144 find_library(PULSE_LIB pulse)
145 find_library(PULSESIMPLE_LIB pulse-simple)
146 list(APPEND LINKLIBS ${PULSE_LIB} ${PULSESIMPLE_LIB})
147 list(APPEND PKGCONFIG_REQUIRES "libpulse-simple")
148 list(APPEND API_DEFS "-D__LINUX_PULSE__")
149 list(APPEND API_LIST "pulse")
153 if (RTAUDIO_API_CORE)
154 find_library(COREAUDIO_LIB CoreAudio)
155 find_library(COREFOUNDATION_LIB CoreFoundation)
156 list(APPEND LINKLIBS ${COREAUDIO_LIB} ${COREFOUNDATION_LIB})
157 list(APPEND API_DEFS "-D__MACOSX_CORE__")
158 list(APPEND API_LIST "core")
162 if (RTAUDIO_API_ASIO)
163 set(NEED_WIN32LIBS ON)
164 include_directories(include)
165 list(APPEND rtaudio_SOURCES
167 include/asiodrivers.cpp
169 include/iasiothiscallresolver.cpp)
170 list(APPEND API_DEFS "-D__WINDOWS_ASIO__")
171 list(APPEND API_LIST "asio")
176 set(NEED_WIN32LIBS ON)
177 list(APPEND LINKLIBS dsound)
178 list(APPEND API_DEFS "-D__WINDOWS_DS__")
179 list(APPEND API_LIST "ds")
183 if (RTAUDIO_API_WASAPI)
184 include_directories(include)
185 set(NEED_WIN32LIBS ON)
186 list(APPEND LINKLIBS ksuser mfplat mfuuid wmcodecdspuuid)
187 list(APPEND API_DEFS "-D__WINDOWS_WASAPI__")
188 list(APPEND API_LIST "wasapi")
193 list(APPEND LINKLIBS winmm ole32)
198 find_package(Threads REQUIRED
199 CMAKE_THREAD_PREFER_PTHREAD
200 THREADS_PREFER_PTHREAD_FLAG)
201 list(APPEND LINKLIBS Threads::Threads)
204 # Create library targets.
205 cmake_policy(SET CMP0042 OLD)
207 if(RTAUDIO_BUILD_SHARED_LIBS)
208 add_library(rtaudio SHARED ${rtaudio_SOURCES})
209 list(APPEND LIB_TARGETS rtaudio)
211 # Add headers destination for install rule.
212 set_target_properties(rtaudio PROPERTIES PUBLIC_HEADER RtAudio.h
216 # Set include paths, populate target interface.
217 target_include_directories(rtaudio PRIVATE
218 $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
219 $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
222 # Set compile-time definitions
223 target_compile_definitions(rtaudio PRIVATE ${API_DEFS})
224 target_compile_definitions(rtaudio PRIVATE RTAUDIO_EXPORT)
226 target_link_libraries(rtaudio ${LINKLIBS})
229 if(RTAUDIO_BUILD_STATIC_LIBS)
230 add_library(rtaudio_static STATIC ${rtaudio_SOURCES})
231 list(APPEND LIB_TARGETS rtaudio_static)
233 # Add headers destination for install rule.
234 set_target_properties(rtaudio_static PROPERTIES PUBLIC_HEADER RtAudio.h
238 # Set include paths, populate target interface.
239 target_include_directories(rtaudio_static PRIVATE
240 $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
241 $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
244 # Set compile-time definitions
245 target_compile_definitions(rtaudio_static PRIVATE ${API_DEFS})
247 target_link_libraries(rtaudio_static ${LINKLIBS})
250 # Set standard installation directories.
251 include(GNUInstallDirs)
254 if (RTAUDIO_BUILD_TESTING)
256 add_subdirectory(tests)
257 endif (RTAUDIO_BUILD_TESTING)
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.
282 set(RTAUDIO_CMAKE_DESTINATION cmake)
284 set(RTAUDIO_CMAKE_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/RtAudio)
287 # Create CMake configuration export file.
288 file(WRITE ${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)