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 set(NEED_WIN32LIBS ON)
181 list(APPEND LINKLIBS uuid ksuser)
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 # Create library targets.
200 cmake_policy(SET CMP0042 OLD)
202 if(BUILD_SHARED_LIBS)
203 add_library(rtaudio SHARED ${rtaudio_SOURCES})
204 list(APPEND LIB_TARGETS rtaudio)
206 # Add headers destination for install rule.
207 set_target_properties(rtaudio PROPERTIES PUBLIC_HEADER RtAudio.h
211 # Set include paths, populate target interface.
212 target_include_directories(rtaudio PRIVATE
213 $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
214 $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
217 # Set compile-time definitions
218 target_compile_definitions(rtaudio PRIVATE ${API_DEFS})
220 target_link_libraries(rtaudio ${LINKLIBS})
223 if(BUILD_STATIC_LIBS)
224 add_library(rtaudio_static STATIC ${rtaudio_SOURCES})
225 list(APPEND LIB_TARGETS rtaudio_static)
227 # Add headers destination for install rule.
228 set_target_properties(rtaudio_static PROPERTIES PUBLIC_HEADER RtAudio.h
232 # Set include paths, populate target interface.
233 target_include_directories(rtaudio_static PRIVATE
234 $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
235 $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
238 # Set compile-time definitions
239 target_compile_definitions(rtaudio_static PRIVATE ${API_DEFS})
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 configure_file("rtaudio.pc.in" "rtaudio.pc" @ONLY)
263 install(TARGETS ${LIB_TARGETS}
264 EXPORT RtAudioTargets
265 LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
266 ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
267 RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
268 PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
270 # Store the package in the user registry.
271 export(PACKAGE RtAudio)
273 # Set installation path for CMake files.
275 set(RTAUDIO_CMAKE_DESTINATION cmake)
277 set(RTAUDIO_CMAKE_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/RtAudio)
280 # Create CMake configuration export file.
281 file(WRITE ${CMAKE_BINARY_DIR}/RtAudioConfig.cmake "include(\${CMAKE_CURRENT_LIST_DIR}/RtAudioTargets.cmake)")
283 # Install CMake configuration export file.
284 install(FILES ${CMAKE_BINARY_DIR}/RtAudioConfig.cmake
285 DESTINATION ${RTAUDIO_CMAKE_DESTINATION})
287 # Export library target (build-tree).
288 export(EXPORT RtAudioTargets
291 # Export library target (install-tree).
292 install(EXPORT RtAudioTargets
293 DESTINATION ${RTAUDIO_CMAKE_DESTINATION}
296 # Configure uninstall target.
298 "${CMAKE_SOURCE_DIR}/cmake/RtAudioConfigUninstall.cmake.in"
299 "${CMAKE_BINARY_DIR}/RtAudioConfigUninstall.cmake" @ONLY)
301 # Create uninstall target.
302 add_custom_target(uninstall
303 COMMAND ${CMAKE_COMMAND} -P ${CMAKE_BINARY_DIR}/RtAudioConfigUninstall.cmake)
306 FILES ${CMAKE_CURRENT_BINARY_DIR}/rtaudio.pc
307 DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)