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