rtaudio_c: add rtaudio_num_compiled_api()
[rtaudio-cdist.git] / CMakeLists.txt
1 # Set minimum CMake required version for this project.
2 cmake_minimum_required(VERSION 3.0 FATAL_ERROR)
3
4 # Define a C++ project.
5 project(RtAudio LANGUAGES CXX)
6
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)
12   set(HAVE_JACK TRUE)
13 endif()
14
15 # Check for Pulse (any OS)
16 pkg_check_modules(pulse libpulse-simple)
17
18 # Check for known non-Linux unix-likes
19 if (CMAKE_SYSTEM_NAME MATCHES "kNetBSD.*|NetBSD.*")
20   message(STATUS "NetBSD detected, using OSS")
21   set(xBSD ON)
22 elseif(UNIX AND NOT APPLE)
23   set(LINUX ON)
24 endif()
25
26 # Necessary for Windows
27 if(WIN32)
28   set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)
29   set(CMAKE_DEBUG_POSTFIX "d")
30 endif()
31
32 # Build Options
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)")
38
39 # API Options
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})
48
49 # Check for functions
50 include(CheckFunctionExists)
51 check_function_exists(gettimeofday HAVE_GETTIMEOFDAY)
52 if (HAVE_GETTIMEOFDAY)
53     add_definitions(-DHAVE_GETTIMEOFDAY)
54 endif ()
55
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)
60
61 # Add debug flags
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)
67 endif ()
68
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
72   REGEX ${R})
73 foreach(_S ${CONFIGAC})
74   string(REGEX REPLACE ${R} "\\1" k ${_S})
75   string(REGEX REPLACE ${R} "\\2" v ${_S})
76   set(SO_${k} ${v})
77 endforeach()
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}")
81
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
85   REGEX ${R})
86 string(REGEX REPLACE ${R} "\\1" PACKAGE_VERSION ${CONFIGAC})
87
88 # Init variables
89 set(rtaudio_SOURCES RtAudio.cpp RtAudio.h rtaudio_c.cpp rtaudio_c.h)
90 set(LINKLIBS)
91 set(PKGCONFIG_REQUIRES)
92 set(API_DEFS)
93 set(API_LIST)
94
95 # Tweak API-specific configuration.
96
97 # Jack
98 if (RTAUDIO_API_JACK AND jack_FOUND)
99   set(NEED_PTHREAD ON)
100   list(APPEND PKGCONFIG_REQUIRES "jack")
101   list(APPEND API_DEFS "-D__UNIX_JACK__")
102   list(APPEND API_LIST "jack")
103   if(jack_FOUND)
104     list(APPEND LINKLIBS ${jack_LIBRARIES})
105     list(APPEND INCDIRS ${jack_INCLUDEDIR})
106   else()
107     list(APPEND LINKLIBS ${JACK_LIB})
108   endif()
109 endif()
110
111 # ALSA
112 if (RTAUDIO_API_ALSA)
113   set(NEED_PTHREAD ON)
114   find_package(ALSA)
115   if (NOT ALSA_FOUND)
116     message(FATAL_ERROR "ALSA API requested but no ALSA dev libraries found")
117   endif()
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")
123 endif()
124
125 # OSS
126 if (RTAUDIO_OSS)
127   set(NEED_PTHREAD ON)
128   find_library(OSSAUDIO_LIB ossaudio)
129   if (OSSAUDIO_LIB)
130     list(APPEND LINKLIBS ossaudio)
131     # Note: not an error on some systems
132   endif()
133   list(APPEND API_DEFS "-D__LINUX_OSS__")
134   list(APPEND API_LIST "oss")
135 endif()
136
137 # Pulse
138 if (RTAUDIO_API_PULSE)
139   set(NEED_PTHREAD ON)
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")
146 endif()
147
148 # CoreAudio
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")
155 endif()
156
157 # ASIO
158 if (RTAUDIO_API_ASIO)
159   set(NEED_WIN32LIBS ON)
160   include_directories(include)
161   list(APPEND rtaudio_SOURCES
162     include/asio.cpp
163     include/asiodrivers.cpp
164     include/asiolist.cpp
165     include/iasiothiscallresolver.cpp)
166   list(APPEND API_DEFS "-D__WINDOWS_ASIO__")
167   list(APPEND API_LIST "asio")
168 endif()
169
170 # DSound
171 if (RTAUDIO_API_DS)
172   set(NEED_WIN32LIBS ON)
173   list(APPEND LINKLIBS dsound)
174   list(APPEND API_DEFS "-D__WINDOWS_DS__")
175   list(APPEND API_LIST "ds")
176 endif()
177
178 # WASAPI
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")
185 endif()
186
187 # Windows libs
188 if (NEED_WIN32LIBS)
189   list(APPEND LINKLIBS winmm ole32)
190 endif()
191
192 # pthread
193 if (NEED_PTHREAD)
194   find_package(Threads REQUIRED
195     CMAKE_THREAD_PREFER_PTHREAD
196     THREADS_PREFER_PTHREAD_FLAG)
197   list(APPEND LINKLIBS Threads::Threads)
198 endif()
199
200 # Create library targets.
201 cmake_policy(SET CMP0042 OLD)
202 set(LIB_TARGETS)
203 if(BUILD_SHARED_LIBS)
204   add_library(rtaudio SHARED ${rtaudio_SOURCES})
205   list(APPEND LIB_TARGETS rtaudio)
206
207   # Add headers destination for install rule.
208   set_target_properties(rtaudio PROPERTIES PUBLIC_HEADER RtAudio.h
209     SOVERSION ${SO_VER}
210     VERSION ${FULL_VER})
211
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}>
216     ${INCDIRS})
217
218   # Set compile-time definitions
219   target_compile_definitions(rtaudio PRIVATE ${API_DEFS})
220   target_compile_definitions(rtaudio PRIVATE RTAUDIO_EXPORT)
221
222   target_link_libraries(rtaudio ${LINKLIBS})
223 endif()
224
225 if(BUILD_STATIC_LIBS)
226   add_library(rtaudio_static STATIC ${rtaudio_SOURCES})
227   list(APPEND LIB_TARGETS rtaudio_static)
228
229   # Add headers destination for install rule.
230   set_target_properties(rtaudio_static PROPERTIES PUBLIC_HEADER RtAudio.h
231     SOVERSION ${SO_VER}
232     VERSION ${FULL_VER})
233
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}>
238     ${INCDIRS})
239
240   # Set compile-time definitions
241   target_compile_definitions(rtaudio_static PRIVATE ${API_DEFS})
242
243   target_link_libraries(rtaudio_static ${LINKLIBS})
244 endif()
245
246 # Set standard installation directories.
247 include(GNUInstallDirs)
248
249 # Subdirs
250 if (BUILD_TESTING)
251   include(CTest)
252   add_subdirectory(tests)
253 endif (BUILD_TESTING)
254
255 # Message
256 string(REPLACE ";" " " apilist "${API_LIST}")
257 message(STATUS "Compiling with support for: ${apilist}")
258
259 # PkgConfig file
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)
264
265 # Add install rule.
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})
272
273 # Store the package in the user registry.
274 export(PACKAGE RtAudio)
275
276 # Set installation path for CMake files.
277 if(WIN32)
278     set(RTAUDIO_CMAKE_DESTINATION cmake)
279 else()
280     set(RTAUDIO_CMAKE_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/RtAudio)
281 endif()
282
283 # Create CMake configuration export file.
284 file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/RtAudioConfig.cmake "include(\${CMAKE_CURRENT_LIST_DIR}/RtAudioTargets.cmake)")
285
286 # Install CMake configuration export file.
287 install(FILES ${CMAKE_CURRENT_BINARY_DIR}/RtAudioConfig.cmake
288         DESTINATION ${RTAUDIO_CMAKE_DESTINATION})
289
290 # Export library target (build-tree).
291 export(EXPORT RtAudioTargets
292        NAMESPACE RtAudio::)
293
294 # Export library target (install-tree).
295 install(EXPORT RtAudioTargets
296         DESTINATION ${RTAUDIO_CMAKE_DESTINATION}
297         NAMESPACE RtAudio::)
298
299 # Configure uninstall target.
300 configure_file(
301     "${CMAKE_CURRENT_SOURCE_DIR}/cmake/RtAudioConfigUninstall.cmake.in"
302     "${CMAKE_CURRENT_BINARY_DIR}/RtAudioConfigUninstall.cmake" @ONLY)
303
304 # Create uninstall target.
305 add_custom_target(uninstall
306     COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/RtAudioConfigUninstall.cmake)
307
308 install(
309     FILES ${CMAKE_CURRENT_BINARY_DIR}/rtaudio.pc
310     DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)