More detailed error message.
[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 if(MINGW)
32   set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)
33 endif()
34
35 # Build Options
36 option(RTAUDIO_BUILD_SHARED_LIBS "Compile library shared lib." TRUE)
37 option(RTAUDIO_BUILD_STATIC_LIBS "Compile library static lib." TRUE)
38 option(RTAUDIO_BUILD_TESTING "Compile test programs." TRUE)
39 option(RTAUDIO_BUILD_PYTHON "Build PyRtAudio python bindings" OFF)
40 set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Build type (Release,Debug)")
41 set(RTAUDIO_TARGETNAME_UNINSTALL "uninstall" CACHE STRING "Name of 'uninstall' build target")
42
43 # API Options
44 option(RTAUDIO_API_DS "Build DirectSound API" OFF)
45 option(RTAUDIO_API_ASIO "Build ASIO API" OFF)
46 option(RTAUDIO_API_WASAPI "Build WASAPI API" ${WIN32})
47 option(RTAUDIO_API_OSS "Build OSS4 API" ${xBSD})
48 option(RTAUDIO_API_ALSA "Build ALSA API" ${LINUX})
49 option(RTAUDIO_API_PULSE "Build PulseAudio API" ${pulse_FOUND})
50 option(RTAUDIO_API_JACK "Build JACK audio server API" ${HAVE_JACK})
51 option(RTAUDIO_API_CORE "Build CoreAudio API" ${APPLE})
52
53 # Check for functions
54 include(CheckFunctionExists)
55 check_function_exists(gettimeofday HAVE_GETTIMEOFDAY)
56 if (HAVE_GETTIMEOFDAY)
57     add_definitions(-DHAVE_GETTIMEOFDAY)
58 endif ()
59
60 # Add -Wall if possible
61 if (CMAKE_COMPILER_IS_GNUCXX)
62   set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall")
63 endif (CMAKE_COMPILER_IS_GNUCXX)
64
65 # Add debug flags
66 if (CMAKE_BUILD_TYPE STREQUAL "Debug")
67   add_definitions(-D__RTAUDIO_DEBUG__)
68   if (CMAKE_COMPILER_IS_GNUCXX)
69     set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror")
70   endif (CMAKE_COMPILER_IS_GNUCXX)
71 endif ()
72
73 # Read libtool version info from configure.ac
74 set(R "m4_define\\(\\[lt_([a-z]+)\\], ([0-9]+)\\)")
75 file(STRINGS "${CMAKE_CURRENT_SOURCE_DIR}/configure.ac" CONFIGAC
76   REGEX ${R})
77 foreach(_S ${CONFIGAC})
78   string(REGEX REPLACE ${R} "\\1" k ${_S})
79   string(REGEX REPLACE ${R} "\\2" v ${_S})
80   set(SO_${k} ${v})
81 endforeach()
82 math(EXPR SO_current_minus_age "${SO_current} - ${SO_age}")
83 set(SO_VER "${SO_current_minus_age}")
84 set(FULL_VER "${SO_current_minus_age}.${SO_revision}.${SO_age}")
85
86 # Read package version info from configure.ac
87 set(R "AC_INIT\\(RtAudio, ([0-9\\.]+),.*\\)")
88 file(STRINGS "${CMAKE_CURRENT_SOURCE_DIR}/configure.ac" CONFIGAC
89   REGEX ${R})
90 string(REGEX REPLACE ${R} "\\1" PACKAGE_VERSION ${CONFIGAC})
91
92 # Init variables
93 set(rtaudio_SOURCES RtAudio.cpp RtAudio.h rtaudio_c.cpp rtaudio_c.h)
94 set(LINKLIBS)
95 set(PKGCONFIG_REQUIRES)
96 set(API_DEFS)
97 set(API_LIST)
98
99 # Tweak API-specific configuration.
100
101 # Jack
102 if (RTAUDIO_API_JACK AND jack_FOUND)
103   set(NEED_PTHREAD ON)
104   list(APPEND PKGCONFIG_REQUIRES "jack")
105   list(APPEND API_DEFS "-D__UNIX_JACK__")
106   list(APPEND API_LIST "jack")
107   if(jack_FOUND)
108     list(APPEND LINKLIBS ${jack_LIBRARIES})
109     list(APPEND INCDIRS ${jack_INCLUDEDIR})
110   else()
111     list(APPEND LINKLIBS ${JACK_LIB})
112   endif()
113 endif()
114
115 # ALSA
116 if (RTAUDIO_API_ALSA)
117   set(NEED_PTHREAD ON)
118   find_package(ALSA)
119   if (NOT ALSA_FOUND)
120     message(FATAL_ERROR "ALSA API requested but no ALSA dev libraries found")
121   endif()
122   list(APPEND INCDIRS ${ALSA_INCLUDE_DIR})
123   list(APPEND LINKLIBS ${ALSA_LIBRARY})
124   list(APPEND PKGCONFIG_REQUIRES "alsa")
125   list(APPEND API_DEFS "-D__LINUX_ALSA__")
126   list(APPEND API_LIST "alsa")
127 endif()
128
129 # OSS
130 if (RTAUDIO_OSS)
131   set(NEED_PTHREAD ON)
132   find_library(OSSAUDIO_LIB ossaudio)
133   if (OSSAUDIO_LIB)
134     list(APPEND LINKLIBS ossaudio)
135     # Note: not an error on some systems
136   endif()
137   list(APPEND API_DEFS "-D__LINUX_OSS__")
138   list(APPEND API_LIST "oss")
139 endif()
140
141 # Pulse
142 if (RTAUDIO_API_PULSE)
143   set(NEED_PTHREAD ON)
144   find_library(PULSE_LIB pulse)
145   find_library(PULSESIMPLE_LIB pulse-simple)
146   list(APPEND LINKLIBS ${PULSE_LIB} ${PULSESIMPLE_LIB})
147   list(APPEND PKGCONFIG_REQUIRES "libpulse-simple")
148   list(APPEND API_DEFS "-D__LINUX_PULSE__")
149   list(APPEND API_LIST "pulse")
150 endif()
151
152 # CoreAudio
153 if (RTAUDIO_API_CORE)
154   find_library(COREAUDIO_LIB CoreAudio)
155   find_library(COREFOUNDATION_LIB CoreFoundation)
156   list(APPEND LINKLIBS ${COREAUDIO_LIB} ${COREFOUNDATION_LIB})
157   list(APPEND API_DEFS "-D__MACOSX_CORE__")
158   list(APPEND API_LIST "core")
159 endif()
160
161 # ASIO
162 if (RTAUDIO_API_ASIO)
163   set(NEED_WIN32LIBS ON)
164   include_directories(include)
165   list(APPEND rtaudio_SOURCES
166     include/asio.cpp
167     include/asiodrivers.cpp
168     include/asiolist.cpp
169     include/iasiothiscallresolver.cpp)
170   list(APPEND API_DEFS "-D__WINDOWS_ASIO__")
171   list(APPEND API_LIST "asio")
172 endif()
173
174 # DSound
175 if (RTAUDIO_API_DS)
176   set(NEED_WIN32LIBS ON)
177   list(APPEND LINKLIBS dsound)
178   list(APPEND API_DEFS "-D__WINDOWS_DS__")
179   list(APPEND API_LIST "ds")
180 endif()
181
182 # WASAPI
183 if (RTAUDIO_API_WASAPI)
184   include_directories(include)
185   set(NEED_WIN32LIBS ON)
186   list(APPEND LINKLIBS ksuser mfplat mfuuid wmcodecdspuuid)
187   list(APPEND API_DEFS "-D__WINDOWS_WASAPI__")
188   list(APPEND API_LIST "wasapi")
189 endif()
190
191 # Windows libs
192 if (NEED_WIN32LIBS)
193   list(APPEND LINKLIBS winmm ole32)
194 endif()
195
196 # pthread
197 if (NEED_PTHREAD)
198   find_package(Threads REQUIRED
199     CMAKE_THREAD_PREFER_PTHREAD
200     THREADS_PREFER_PTHREAD_FLAG)
201   list(APPEND LINKLIBS Threads::Threads)
202 endif()
203
204 # Create library targets.
205 cmake_policy(SET CMP0042 OLD)
206 set(LIB_TARGETS)
207 if(RTAUDIO_BUILD_SHARED_LIBS)
208   add_library(rtaudio SHARED ${rtaudio_SOURCES})
209   list(APPEND LIB_TARGETS rtaudio)
210
211   # Add headers destination for install rule.
212   set_target_properties(rtaudio PROPERTIES PUBLIC_HEADER RtAudio.h
213     SOVERSION ${SO_VER}
214     VERSION ${FULL_VER})
215
216   # Set include paths, populate target interface.
217   target_include_directories(rtaudio PRIVATE
218     $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
219     $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
220     ${INCDIRS})
221
222   # Set compile-time definitions
223   target_compile_definitions(rtaudio PRIVATE ${API_DEFS})
224   target_compile_definitions(rtaudio PRIVATE RTAUDIO_EXPORT)
225
226   target_link_libraries(rtaudio ${LINKLIBS})
227 endif()
228
229 if(RTAUDIO_BUILD_STATIC_LIBS)
230   add_library(rtaudio_static STATIC ${rtaudio_SOURCES})
231   list(APPEND LIB_TARGETS rtaudio_static)
232
233   # Add headers destination for install rule.
234   set_target_properties(rtaudio_static PROPERTIES PUBLIC_HEADER RtAudio.h
235     SOVERSION ${SO_VER}
236     VERSION ${FULL_VER})
237
238   # Set include paths, populate target interface.
239   target_include_directories(rtaudio_static PRIVATE
240     $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
241     $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
242     ${INCDIRS})
243
244   # Set compile-time definitions
245   target_compile_definitions(rtaudio_static PRIVATE ${API_DEFS})
246
247   target_link_libraries(rtaudio_static ${LINKLIBS})
248 endif()
249
250 # Set standard installation directories.
251 include(GNUInstallDirs)
252
253 # Subdirs
254 if (RTAUDIO_BUILD_TESTING)
255   include(CTest)
256   add_subdirectory(tests)
257 endif (RTAUDIO_BUILD_TESTING)
258
259 # Message
260 string(REPLACE ";" " " apilist "${API_LIST}")
261 message(STATUS "Compiling with support for: ${apilist}")
262
263 # PkgConfig file
264 string(REPLACE ";" " " req "${PKGCONFIG_REQUIRES}")
265 string(REPLACE ";" " " api "${API_DEFS}")
266 set(prefix ${CMAKE_INSTALL_PREFIX})
267 configure_file("${CMAKE_CURRENT_SOURCE_DIR}/rtaudio.pc.in" "rtaudio.pc" @ONLY)
268
269 # Add install rule.
270 install(TARGETS ${LIB_TARGETS}
271         EXPORT RtAudioTargets
272         LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
273         ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
274         RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
275         PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
276
277 # Store the package in the user registry.
278 export(PACKAGE RtAudio)
279
280 # Set installation path for CMake files.
281 if(WIN32)
282     set(RTAUDIO_CMAKE_DESTINATION cmake)
283 else()
284     set(RTAUDIO_CMAKE_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/RtAudio)
285 endif()
286
287 # Create CMake configuration export file.
288 file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/RtAudioConfig.cmake "include(\${CMAKE_CURRENT_LIST_DIR}/RtAudioTargets.cmake)")
289
290 # Install CMake configuration export file.
291 install(FILES ${CMAKE_CURRENT_BINARY_DIR}/RtAudioConfig.cmake
292         DESTINATION ${RTAUDIO_CMAKE_DESTINATION})
293
294 # Export library target (build-tree).
295 export(EXPORT RtAudioTargets
296        NAMESPACE RtAudio::)
297
298 # Export library target (install-tree).
299 install(EXPORT RtAudioTargets
300         DESTINATION ${RTAUDIO_CMAKE_DESTINATION}
301         NAMESPACE RtAudio::)
302
303 # Configure uninstall target.
304 configure_file(
305     "${CMAKE_CURRENT_SOURCE_DIR}/cmake/RtAudioConfigUninstall.cmake.in"
306     "${CMAKE_CURRENT_BINARY_DIR}/RtAudioConfigUninstall.cmake" @ONLY)
307
308 # Create uninstall target.
309 add_custom_target(${RTAUDIO_TARGETNAME_UNINSTALL}
310     COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/RtAudioConfigUninstall.cmake)
311
312 install(
313     FILES ${CMAKE_CURRENT_BINARY_DIR}/rtaudio.pc
314     DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)