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 option(BUILD_SHARED_LIBS "Compile library shared lib." TRUE)
33 option(BUILD_STATIC_LIBS "Compile library static lib." TRUE)
34 option(BUILD_TESTING "Compile test programs." TRUE)
35 option(BUILD_PYTHON "Build PyRtAudio python bindings" OFF)
36 set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Build type (Release,Debug)")
39 option(RTAUDIO_API_DS "Build DirectSound API" OFF)
40 option(RTAUDIO_API_ASIO "Build ASIO API" OFF)
41 option(RTAUDIO_API_WASAPI "Build WASAPI API" ${WIN32})
42 option(RTAUDIO_API_OSS "Build OSS4 API" ${xBSD})
43 option(RTAUDIO_API_ALSA "Build ALSA API" ${LINUX})
44 option(RTAUDIO_API_PULSE "Build PulseAudio API" ${pulse_FOUND})
45 option(RTAUDIO_API_JACK "Build JACK audio server API" ${HAVE_JACK})
46 option(RTAUDIO_API_CORE "Build CoreAudio API" ${APPLE})
49 include(CheckFunctionExists)
50 check_function_exists(gettimeofday HAVE_GETTIMEOFDAY)
51 if (HAVE_GETTIMEOFDAY)
52 add_definitions(-DHAVE_GETTIMEOFDAY)
55 # Add -Wall if possible
56 if (CMAKE_COMPILER_IS_GNUCXX)
57 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall")
58 endif (CMAKE_COMPILER_IS_GNUCXX)
61 if (CMAKE_BUILD_TYPE STREQUAL "Debug")
62 add_definitions(-D__RTAUDIO_DEBUG__)
63 if (CMAKE_COMPILER_IS_GNUCXX)
64 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror")
65 endif (CMAKE_COMPILER_IS_GNUCXX)
68 # Read libtool version info from configure.ac
69 set(R "m4_define\\(\\[lt_([a-z]+)\\], ([0-9]+)\\)")
70 file(STRINGS "${CMAKE_CURRENT_SOURCE_DIR}/configure.ac" CONFIGAC
72 foreach(_S ${CONFIGAC})
73 string(REGEX REPLACE ${R} "\\1" k ${_S})
74 string(REGEX REPLACE ${R} "\\2" v ${_S})
77 math(EXPR SO_current_minus_age "${SO_current} - ${SO_age}")
78 set(SO_VER "${SO_current_minus_age}")
79 set(FULL_VER "${SO_current_minus_age}.${SO_revision}.${SO_age}")
81 # Read package version info from configure.ac
82 set(R "AC_INIT\\(RtAudio, ([0-9\\.]+),.*\\)")
83 file(STRINGS "${CMAKE_CURRENT_SOURCE_DIR}/configure.ac" CONFIGAC
85 string(REGEX REPLACE ${R} "\\1" PACKAGE_VERSION ${CONFIGAC})
88 set(rtaudio_SOURCES RtAudio.cpp RtAudio.h rtaudio_c.cpp rtaudio_c.h)
90 set(PKGCONFIG_REQUIRES)
94 # Tweak API-specific configuration.
97 if (RTAUDIO_API_JACK AND jack_FOUND)
99 list(APPEND PKGCONFIG_REQUIRES "jack")
100 list(APPEND API_DEFS "-D__UNIX_JACK__")
101 list(APPEND API_LIST "jack")
103 list(APPEND LINKLIBS ${jack_LIBRARIES})
104 list(APPEND INCDIRS ${jack_INCLUDEDIR})
106 list(APPEND LINKLIBS ${JACK_LIB})
111 if (RTAUDIO_API_ALSA)
115 message(FATAL_ERROR "ALSA API requested but no ALSA dev libraries found")
117 list(APPEND INCDIRS ${ALSA_INCLUDE_DIR})
118 list(APPEND LINKLIBS ${ALSA_LIBRARY})
119 list(APPEND PKGCONFIG_REQUIRES "alsa")
120 list(APPEND API_DEFS "-D__LINUX_ALSA__")
121 list(APPEND API_LIST "alsa")
127 find_library(OSSAUDIO_LIB ossaudio)
129 list(APPEND LINKLIBS ossaudio)
130 # Note: not an error on some systems
132 list(APPEND API_DEFS "-D__LINUX_OSS__")
133 list(APPEND API_LIST "oss")
137 if (RTAUDIO_API_PULSE)
139 find_library(PULSE_LIB pulse)
140 find_library(PULSESIMPLE_LIB pulse-simple)
141 list(APPEND LINKLIBS ${PULSE_LIB} ${PULSESIMPLE_LIB})
142 list(APPEND PKGCONFIG_REQUIRES "libpulse-simple")
143 list(APPEND API_DEFS "-D__LINUX_PULSE__")
144 list(APPEND API_LIST "pulse")
148 if (RTAUDIO_API_CORE)
149 find_library(COREAUDIO_LIB CoreAudio)
150 find_library(COREFOUNDATION_LIB CoreFoundation)
151 list(APPEND LINKLIBS ${COREAUDIO_LIB} ${COREFOUNDATION_LIB})
152 list(APPEND API_DEFS "-D__MACOSX_CORE__")
153 list(APPEND API_LIST "core")
157 if (RTAUDIO_API_ASIO)
158 set(NEED_WIN32LIBS ON)
159 include_directories(include)
160 list(APPEND rtaudio_SOURCES
162 include/asiodrivers.cpp
164 include/iasiothiscallresolver.cpp)
165 list(APPEND API_DEFS "-D__WINDOWS_ASIO__")
166 list(APPEND API_LIST "asio")
171 set(NEED_WIN32LIBS ON)
172 list(APPEND LINKLIBS dsound)
173 list(APPEND API_DEFS "-D__WINDOWS_DS__")
174 list(APPEND API_LIST "ds")
178 if (RTAUDIO_API_WASAPI)
179 include_directories(include)
180 set(NEED_WIN32LIBS ON)
181 list(APPEND LINKLIBS ksuser mfplat mfuuid wmcodecdspuuid)
182 list(APPEND API_DEFS "-D__WINDOWS_WASAPI__")
183 list(APPEND API_LIST "wasapi")
188 list(APPEND LINKLIBS winmm ole32)
193 find_package(Threads REQUIRED
194 CMAKE_THREAD_PREFER_PTHREAD
195 THREADS_PREFER_PTHREAD_FLAG)
196 list(APPEND LINKLIBS Threads::Threads)
199 # Set compile-time definitions
200 add_definitions(${API_DEFS})
202 # Create library targets.
203 cmake_policy(SET CMP0042 OLD)
205 if(BUILD_SHARED_LIBS)
206 add_library(rtaudio SHARED ${rtaudio_SOURCES})
207 list(APPEND LIB_TARGETS rtaudio)
209 # Add headers destination for install rule.
210 set_target_properties(rtaudio PROPERTIES PUBLIC_HEADER RtAudio.h
214 # Set include paths, populate target interface.
215 target_include_directories(rtaudio PRIVATE
216 $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
217 $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
220 # Set compile-time definitions
221 target_compile_definitions(rtaudio PRIVATE RTAUDIO_EXPORT)
223 target_link_libraries(rtaudio ${LINKLIBS})
226 if(BUILD_STATIC_LIBS)
227 add_library(rtaudio_static STATIC ${rtaudio_SOURCES})
228 list(APPEND LIB_TARGETS rtaudio_static)
230 # Add headers destination for install rule.
231 set_target_properties(rtaudio_static PROPERTIES PUBLIC_HEADER RtAudio.h
235 # Set include paths, populate target interface.
236 target_include_directories(rtaudio_static PRIVATE
237 $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
238 $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
241 target_link_libraries(rtaudio_static ${LINKLIBS})
244 # Set standard installation directories.
245 include(GNUInstallDirs)
250 add_subdirectory(tests)
251 endif (BUILD_TESTING)
254 string(REPLACE ";" " " apilist "${API_LIST}")
255 message(STATUS "Compiling with support for: ${apilist}")
258 string(REPLACE ";" " " req "${PKGCONFIG_REQUIRES}")
259 string(REPLACE ";" " " api "${API_DEFS}")
260 set(prefix ${CMAKE_INSTALL_PREFIX})
261 configure_file("rtaudio.pc.in" "rtaudio.pc" @ONLY)
264 install(TARGETS ${LIB_TARGETS}
265 EXPORT RtAudioTargets
266 LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
267 ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
268 RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
269 PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
271 # Store the package in the user registry.
272 export(PACKAGE RtAudio)
274 # Set installation path for CMake files.
276 set(RTAUDIO_CMAKE_DESTINATION cmake)
278 set(RTAUDIO_CMAKE_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/RtAudio)
281 # Create CMake configuration export file.
282 file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/RtAudioConfig.cmake "include(\${CMAKE_CURRENT_LIST_DIR}/RtAudioTargets.cmake)")
284 # Install CMake configuration export file.
285 install(FILES ${CMAKE_CURRENT_BINARY_DIR}/RtAudioConfig.cmake
286 DESTINATION ${RTAUDIO_CMAKE_DESTINATION})
288 # Export library target (build-tree).
289 export(EXPORT RtAudioTargets
292 # Export library target (install-tree).
293 install(EXPORT RtAudioTargets
294 DESTINATION ${RTAUDIO_CMAKE_DESTINATION}
297 # Configure uninstall target.
299 "${CMAKE_CURRENT_SOURCE_DIR}/cmake/RtAudioConfigUninstall.cmake.in"
300 "${CMAKE_CURRENT_BINARY_DIR}/RtAudioConfigUninstall.cmake" @ONLY)
302 # Create uninstall target.
303 add_custom_target(uninstall
304 COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/RtAudioConfigUninstall.cmake)
307 FILES ${CMAKE_CURRENT_BINARY_DIR}/rtaudio.pc
308 DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)