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