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_WINDOWS_EXPORT_ALL_SYMBOLS ON)
29 set(CMAKE_DEBUG_POSTFIX "d")
33 option(BUILD_SHARED_LIBS "Compile library shared lib." TRUE)
34 option(BUILD_STATIC_LIBS "Compile library static lib." TRUE)
35 option(BUILD_TESTING "Compile test programs." TRUE)
36 option(BUILD_PYTHON "Build PyRtAudio python bindings" OFF)
37 set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Build type (Release,Debug)")
40 option(RTAUDIO_API_DS "Build DirectSound API" OFF)
41 option(RTAUDIO_API_ASIO "Build ASIO API" OFF)
42 option(RTAUDIO_API_WASAPI "Build WASAPI API" ${WIN32})
43 option(RTAUDIO_API_OSS "Build OSS4 API" ${xBSD})
44 option(RTAUDIO_API_ALSA "Build ALSA API" ${LINUX})
45 option(RTAUDIO_API_PULSE "Build PulseAudio API" ${pulse_FOUND})
46 option(RTAUDIO_API_JACK "Build JACK audio server API" ${HAVE_JACK})
47 option(RTAUDIO_API_CORE "Build CoreAudio API" ${APPLE})
50 include(CheckFunctionExists)
51 check_function_exists(gettimeofday HAVE_GETTIMEOFDAY)
52 if (HAVE_GETTIMEOFDAY)
53 add_definitions(-DHAVE_GETTIMEOFDAY)
56 # Add -Wall if possible
57 if (CMAKE_COMPILER_IS_GNUCXX)
58 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall")
59 endif (CMAKE_COMPILER_IS_GNUCXX)
62 if (CMAKE_BUILD_TYPE STREQUAL "Debug")
63 add_definitions(-D__RTAUDIO_DEBUG__)
64 if (CMAKE_COMPILER_IS_GNUCXX)
65 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror")
66 endif (CMAKE_COMPILER_IS_GNUCXX)
69 # Read libtool version info from configure.ac
70 set(R "m4_define\\(\\[lt_([a-z]+)\\], ([0-9]+)\\)")
71 file(STRINGS "${CMAKE_CURRENT_SOURCE_DIR}/configure.ac" CONFIGAC
73 foreach(_S ${CONFIGAC})
74 string(REGEX REPLACE ${R} "\\1" k ${_S})
75 string(REGEX REPLACE ${R} "\\2" v ${_S})
78 math(EXPR SO_current_minus_age "${SO_current} - ${SO_age}")
79 set(SO_VER "${SO_current_minus_age}")
80 set(FULL_VER "${SO_current_minus_age}.${SO_revision}.${SO_age}")
82 # Read package version info from configure.ac
83 set(R "AC_INIT\\(RtAudio, ([0-9\\.]+),.*\\)")
84 file(STRINGS "${CMAKE_CURRENT_SOURCE_DIR}/configure.ac" CONFIGAC
86 string(REGEX REPLACE ${R} "\\1" PACKAGE_VERSION ${CONFIGAC})
89 set(rtaudio_SOURCES RtAudio.cpp RtAudio.h rtaudio_c.cpp rtaudio_c.h)
91 set(PKGCONFIG_REQUIRES)
95 # Tweak API-specific configuration.
98 if (RTAUDIO_API_JACK AND jack_FOUND)
100 list(APPEND PKGCONFIG_REQUIRES "jack")
101 list(APPEND API_DEFS "-D__UNIX_JACK__")
102 list(APPEND API_LIST "jack")
104 list(APPEND LINKLIBS ${jack_LIBRARIES})
105 list(APPEND INCDIRS ${jack_INCLUDEDIR})
107 list(APPEND LINKLIBS ${JACK_LIB})
112 if (RTAUDIO_API_ALSA)
116 message(FATAL_ERROR "ALSA API requested but no ALSA dev libraries found")
118 list(APPEND INCDIRS ${ALSA_INCLUDE_DIR})
119 list(APPEND LINKLIBS ${ALSA_LIBRARY})
120 list(APPEND PKGCONFIG_REQUIRES "alsa")
121 list(APPEND API_DEFS "-D__LINUX_ALSA__")
122 list(APPEND API_LIST "alsa")
128 find_library(OSSAUDIO_LIB ossaudio)
130 list(APPEND LINKLIBS ossaudio)
131 # Note: not an error on some systems
133 list(APPEND API_DEFS "-D__LINUX_OSS__")
134 list(APPEND API_LIST "oss")
138 if (RTAUDIO_API_PULSE)
140 find_library(PULSE_LIB pulse)
141 find_library(PULSESIMPLE_LIB pulse-simple)
142 list(APPEND LINKLIBS ${PULSE_LIB} ${PULSESIMPLE_LIB})
143 list(APPEND PKGCONFIG_REQUIRES "libpulse-simple")
144 list(APPEND API_DEFS "-D__LINUX_PULSE__")
145 list(APPEND API_LIST "pulse")
149 if (RTAUDIO_API_CORE)
150 find_library(COREAUDIO_LIB CoreAudio)
151 find_library(COREFOUNDATION_LIB CoreFoundation)
152 list(APPEND LINKLIBS ${COREAUDIO_LIB} ${COREFOUNDATION_LIB})
153 list(APPEND API_DEFS "-D__MACOSX_CORE__")
154 list(APPEND API_LIST "core")
158 if (RTAUDIO_API_ASIO)
159 set(NEED_WIN32LIBS ON)
160 include_directories(include)
161 list(APPEND rtaudio_SOURCES
163 include/asiodrivers.cpp
165 include/iasiothiscallresolver.cpp)
166 list(APPEND API_DEFS "-D__WINDOWS_ASIO__")
167 list(APPEND API_LIST "asio")
172 set(NEED_WIN32LIBS ON)
173 list(APPEND LINKLIBS dsound)
174 list(APPEND API_DEFS "-D__WINDOWS_DS__")
175 list(APPEND API_LIST "ds")
179 if (RTAUDIO_API_WASAPI)
180 include_directories(include)
181 set(NEED_WIN32LIBS ON)
182 list(APPEND LINKLIBS ksuser mfplat mfuuid wmcodecdspuuid)
183 list(APPEND API_DEFS "-D__WINDOWS_WASAPI__")
184 list(APPEND API_LIST "wasapi")
189 list(APPEND LINKLIBS winmm ole32)
194 find_package(Threads REQUIRED
195 CMAKE_THREAD_PREFER_PTHREAD
196 THREADS_PREFER_PTHREAD_FLAG)
197 list(APPEND LINKLIBS Threads::Threads)
200 # Create library targets.
201 cmake_policy(SET CMP0042 OLD)
203 if(BUILD_SHARED_LIBS)
204 add_library(rtaudio SHARED ${rtaudio_SOURCES})
205 list(APPEND LIB_TARGETS rtaudio)
207 # Add headers destination for install rule.
208 set_target_properties(rtaudio PROPERTIES PUBLIC_HEADER RtAudio.h
212 # Set include paths, populate target interface.
213 target_include_directories(rtaudio PRIVATE
214 $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
215 $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
218 # Set compile-time definitions
219 target_compile_definitions(rtaudio PRIVATE ${API_DEFS})
220 target_compile_definitions(rtaudio PRIVATE RTAUDIO_EXPORT)
222 target_link_libraries(rtaudio ${LINKLIBS})
225 if(BUILD_STATIC_LIBS)
226 add_library(rtaudio_static STATIC ${rtaudio_SOURCES})
227 list(APPEND LIB_TARGETS rtaudio_static)
229 # Add headers destination for install rule.
230 set_target_properties(rtaudio_static PROPERTIES PUBLIC_HEADER RtAudio.h
234 # Set include paths, populate target interface.
235 target_include_directories(rtaudio_static PRIVATE
236 $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
237 $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
240 # Set compile-time definitions
241 target_compile_definitions(rtaudio_static PRIVATE ${API_DEFS})
243 target_link_libraries(rtaudio_static ${LINKLIBS})
246 # Set standard installation directories.
247 include(GNUInstallDirs)
252 add_subdirectory(tests)
253 endif (BUILD_TESTING)
256 string(REPLACE ";" " " apilist "${API_LIST}")
257 message(STATUS "Compiling with support for: ${apilist}")
260 string(REPLACE ";" " " req "${PKGCONFIG_REQUIRES}")
261 string(REPLACE ";" " " api "${API_DEFS}")
262 set(prefix ${CMAKE_INSTALL_PREFIX})
263 configure_file("rtaudio.pc.in" "rtaudio.pc" @ONLY)
266 install(TARGETS ${LIB_TARGETS}
267 EXPORT RtAudioTargets
268 LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
269 ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
270 RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
271 PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
273 # Store the package in the user registry.
274 export(PACKAGE RtAudio)
276 # Set installation path for CMake files.
278 set(RTAUDIO_CMAKE_DESTINATION cmake)
280 set(RTAUDIO_CMAKE_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/RtAudio)
283 # Create CMake configuration export file.
284 file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/RtAudioConfig.cmake "include(\${CMAKE_CURRENT_LIST_DIR}/RtAudioTargets.cmake)")
286 # Install CMake configuration export file.
287 install(FILES ${CMAKE_CURRENT_BINARY_DIR}/RtAudioConfig.cmake
288 DESTINATION ${RTAUDIO_CMAKE_DESTINATION})
290 # Export library target (build-tree).
291 export(EXPORT RtAudioTargets
294 # Export library target (install-tree).
295 install(EXPORT RtAudioTargets
296 DESTINATION ${RTAUDIO_CMAKE_DESTINATION}
299 # Configure uninstall target.
301 "${CMAKE_CURRENT_SOURCE_DIR}/cmake/RtAudioConfigUninstall.cmake.in"
302 "${CMAKE_CURRENT_BINARY_DIR}/RtAudioConfigUninstall.cmake" @ONLY)
304 # Create uninstall target.
305 add_custom_target(uninstall
306 COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/RtAudioConfigUninstall.cmake)
309 FILES ${CMAKE_CURRENT_BINARY_DIR}/rtaudio.pc
310 DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)