19d2c544f563e1fc04df3e38bc1b8cc64ac1b2de
[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_DEBUG_POSTFIX "d")
29 endif()
30
31 # Build Options
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)")
37
38 # API Options
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})
47
48 # Check for functions
49 include(CheckFunctionExists)
50 check_function_exists(gettimeofday HAVE_GETTIMEOFDAY)
51 if (HAVE_GETTIMEOFDAY)
52     add_definitions(-DHAVE_GETTIMEOFDAY)
53 endif ()
54
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)
59
60 # Add debug flags
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)
66 endif ()
67
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
71   REGEX ${R})
72 foreach(_S ${CONFIGAC})
73   string(REGEX REPLACE ${R} "\\1" k ${_S})
74   string(REGEX REPLACE ${R} "\\2" v ${_S})
75   set(SO_${k} ${v})
76 endforeach()
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}")
80
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
84   REGEX ${R})
85 string(REGEX REPLACE ${R} "\\1" PACKAGE_VERSION ${CONFIGAC})
86
87 # Init variables
88 set(rtaudio_SOURCES RtAudio.cpp RtAudio.h rtaudio_c.cpp rtaudio_c.h)
89 set(LINKLIBS)
90 set(PKGCONFIG_REQUIRES)
91 set(API_DEFS)
92 set(API_LIST)
93
94 # Tweak API-specific configuration.
95
96 # Jack
97 if (RTAUDIO_API_JACK AND jack_FOUND)
98   set(NEED_PTHREAD ON)
99   list(APPEND PKGCONFIG_REQUIRES "jack")
100   list(APPEND API_DEFS "-D__UNIX_JACK__")
101   list(APPEND API_LIST "jack")
102   if(jack_FOUND)
103     list(APPEND LINKLIBS ${jack_LIBRARIES})
104     list(APPEND INCDIRS ${jack_INCLUDEDIR})
105   else()
106     list(APPEND LINKLIBS ${JACK_LIB})
107   endif()
108 endif()
109
110 # ALSA
111 if (RTAUDIO_API_ALSA)
112   set(NEED_PTHREAD ON)
113   find_package(ALSA)
114   if (NOT ALSA_FOUND)
115     message(FATAL_ERROR "ALSA API requested but no ALSA dev libraries found")
116   endif()
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")
122 endif()
123
124 # OSS
125 if (RTAUDIO_OSS)
126   set(NEED_PTHREAD ON)
127   find_library(OSSAUDIO_LIB ossaudio)
128   if (OSSAUDIO_LIB)
129     list(APPEND LINKLIBS ossaudio)
130     # Note: not an error on some systems
131   endif()
132   list(APPEND API_DEFS "-D__LINUX_OSS__")
133   list(APPEND API_LIST "oss")
134 endif()
135
136 # Pulse
137 if (RTAUDIO_API_PULSE)
138   set(NEED_PTHREAD ON)
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")
145 endif()
146
147 # CoreAudio
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")
154 endif()
155
156 # ASIO
157 if (RTAUDIO_API_ASIO)
158   set(NEED_WIN32LIBS ON)
159   include_directories(include)
160   list(APPEND rtaudio_SOURCES
161     include/asio.cpp
162     include/asiodrivers.cpp
163     include/asiolist.cpp
164     include/iasiothiscallresolver.cpp)
165   list(APPEND API_DEFS "-D__WINDOWS_ASIO__")
166   list(APPEND API_LIST "asio")
167 endif()
168
169 # DSound
170 if (RTAUDIO_API_DS)
171   set(NEED_WIN32LIBS ON)
172   list(APPEND LINKLIBS dsound)
173   list(APPEND API_DEFS "-D__WINDOWS_DS__")
174   list(APPEND API_LIST "ds")
175 endif()
176
177 # WASAPI
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")
184 endif()
185
186 # Windows libs
187 if (NEED_WIN32LIBS)
188   list(APPEND LINKLIBS winmm ole32)
189 endif()
190
191 # pthread
192 if (NEED_PTHREAD)
193   find_package(Threads REQUIRED
194     CMAKE_THREAD_PREFER_PTHREAD
195     THREADS_PREFER_PTHREAD_FLAG)
196   list(APPEND LINKLIBS Threads::Threads)
197 endif()
198
199 # Set compile-time definitions
200 add_definitions(${API_DEFS})
201
202 # Create library targets.
203 cmake_policy(SET CMP0042 OLD)
204 set(LIB_TARGETS)
205 if(BUILD_SHARED_LIBS)
206   add_library(rtaudio SHARED ${rtaudio_SOURCES})
207   list(APPEND LIB_TARGETS rtaudio)
208
209   # Add headers destination for install rule.
210   set_target_properties(rtaudio PROPERTIES PUBLIC_HEADER RtAudio.h
211     SOVERSION ${SO_VER}
212     VERSION ${FULL_VER})
213
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}>
218     ${INCDIRS})
219
220   # Set compile-time definitions
221   target_compile_definitions(rtaudio PRIVATE RTAUDIO_EXPORT)
222
223   target_link_libraries(rtaudio ${LINKLIBS})
224 endif()
225
226 if(BUILD_STATIC_LIBS)
227   add_library(rtaudio_static STATIC ${rtaudio_SOURCES})
228   list(APPEND LIB_TARGETS rtaudio_static)
229
230   # Add headers destination for install rule.
231   set_target_properties(rtaudio_static PROPERTIES PUBLIC_HEADER RtAudio.h
232     SOVERSION ${SO_VER}
233     VERSION ${FULL_VER})
234
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}>
239     ${INCDIRS})
240
241   target_link_libraries(rtaudio_static ${LINKLIBS})
242 endif()
243
244 # Set standard installation directories.
245 include(GNUInstallDirs)
246
247 # Subdirs
248 if (BUILD_TESTING)
249   include(CTest)
250   add_subdirectory(tests)
251 endif (BUILD_TESTING)
252
253 # Message
254 string(REPLACE ";" " " apilist "${API_LIST}")
255 message(STATUS "Compiling with support for: ${apilist}")
256
257 # PkgConfig file
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)
262
263 # Add install rule.
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})
270
271 # Store the package in the user registry.
272 export(PACKAGE RtAudio)
273
274 # Set installation path for CMake files.
275 if(WIN32)
276     set(RTAUDIO_CMAKE_DESTINATION cmake)
277 else()
278     set(RTAUDIO_CMAKE_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/RtAudio)
279 endif()
280
281 # Create CMake configuration export file.
282 file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/RtAudioConfig.cmake "include(\${CMAKE_CURRENT_LIST_DIR}/RtAudioTargets.cmake)")
283
284 # Install CMake configuration export file.
285 install(FILES ${CMAKE_CURRENT_BINARY_DIR}/RtAudioConfig.cmake
286         DESTINATION ${RTAUDIO_CMAKE_DESTINATION})
287
288 # Export library target (build-tree).
289 export(EXPORT RtAudioTargets
290        NAMESPACE RtAudio::)
291
292 # Export library target (install-tree).
293 install(EXPORT RtAudioTargets
294         DESTINATION ${RTAUDIO_CMAKE_DESTINATION}
295         NAMESPACE RtAudio::)
296
297 # Configure uninstall target.
298 configure_file(
299     "${CMAKE_CURRENT_SOURCE_DIR}/cmake/RtAudioConfigUninstall.cmake.in"
300     "${CMAKE_CURRENT_BINARY_DIR}/RtAudioConfigUninstall.cmake" @ONLY)
301
302 # Create uninstall target.
303 add_custom_target(uninstall
304     COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/RtAudioConfigUninstall.cmake)
305
306 install(
307     FILES ${CMAKE_CURRENT_BINARY_DIR}/rtaudio.pc
308     DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)