cmake: Flatten API config logic, complete missing rtaudio.pc fields
[rtaudio-cdist.git] / CMakeLists.txt
1 cmake_minimum_required(VERSION 2.8.10)
2 project(RtAudio)
3
4 include(CTest)
5 include(CheckFunctionExists)
6
7 # Check for Jack (any OS)
8 find_package(PkgConfig)
9 pkg_check_modules(jack jack)
10
11 # Check for Pulse (any OS)
12 pkg_check_modules(pulse libpulse-simple)
13
14 # Check for known non-Linux unix-likes
15 if (CMAKE_SYSTEM_NAME MATCHES "kNetBSD.*|NetBSD.*")
16   message(STATUS "NetBSD detected, using OSS")
17   set(xBSD ON)
18 elseif(UNIX AND NOT APPLE)
19   set(LINUX ON)
20 endif()
21
22 option(BUILD_PYTHON "Build PyRtAudio python bindings" OFF)
23 option(RTAUDIO_DS "Build DirectSound API" OFF)
24 option(RTAUDIO_ASIO "Build ASIO API" OFF)
25 option(RTAUDIO_WASAPI "Build WASAPI API" ${WIN32})
26 option(RTAUDIO_OSS "Build OSS4 API" ${xBSD})
27 option(RTAUDIO_ALSA "Build ALSA API" ${LINUX})
28 option(RTAUDIO_PULSE "Build PulseAudio API" ${pulse_FOUND})
29 option(RTAUDIO_JACK "Build JACK audio server API" ${jack_FOUND})
30 option(RTAUDIO_CORE "Build CoreAudio API" ${APPLE})
31
32 if (CMAKE_BUILD_TYPE STREQUAL "Debug")
33     add_definitions(-D__RTAUDIO_DEBUG__)
34 endif ()
35
36 check_function_exists(gettimeofday HAVE_GETTIMEOFDAY)
37
38 if (HAVE_GETTIMEOFDAY)
39     add_definitions(-DHAVE_GETTIMEOFDAY)
40 endif ()
41
42 if (CMAKE_COMPILER_IS_GNUCXX)
43     set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall")
44 endif (CMAKE_COMPILER_IS_GNUCXX)
45
46 set(rtaudio_SOURCES RtAudio.cpp rtaudio_c.cpp)
47
48 set(LINKLIBS)
49 set(PKGCONFIG_REQUIRES)
50 set(PKGCONFIG_APIS)
51
52 # OSS
53 if (RTAUDIO_OSS)
54   set(NEED_PTHREAD ON)
55   find_library(OSSAUDIO_LIB ossaudio)
56   if (OSSAUDIO_LIB)
57     list(APPEND LINKLIBS ossaudio)
58     # Note: not an error on some systems
59   endif()
60   add_definitions(-D__LINUX_OSS__)
61 endif()
62
63 # Pulse
64 if (RTAUDIO_PULSE)
65   set(NEED_PTHREAD ON)
66   find_library(PULSE_LIB pulse)
67   find_library(PULSESIMPLE_LIB pulse-simple)
68   list(APPEND LINKLIBS ${PULSE_LIB} ${PULSESIMPLE_LIB})
69   list(APPEND PKGCONFIG_REQUIRES "libpulse-simple")
70   list(APPEND PKGCONFIG_APIS "__LINUX_PULSE__")
71   add_definitions(-D__LINUX_PULSE__)
72 endif()
73
74 # ALSA
75 if (RTAUDIO_ALSA)
76   set(NEED_PTHREAD ON)
77   find_package(ALSA)
78   if (NOT ALSA_FOUND)
79     message(FATAL_ERROR "ALSA API requested but no ALSA dev libraries found")
80   endif()
81   include_directories(${ALSA_INCLUDE_DIR})
82   list(APPEND LINKLIBS ${ALSA_LIBRARY})
83   list(APPEND PKGCONFIG_REQUIRES "alsa")
84   list(APPEND PKGCONFIG_APIS "__LINUX_ALSA__")
85   add_definitions(-D__LINUX_ALSA__)
86 endif()
87
88 # JACK
89 if (RTAUDIO_JACK)
90   set(NEED_PTHREAD ON)
91   find_library(JACK_LIB jack)
92   list(APPEND LINKLIBS ${JACK_LIB})
93   list(APPEND PKGCONFIG_REQUIRES "jack")
94   list(APPEND PKGCONFIG_APIS "__UNIX_JACK__")
95   add_definitions(-D__UNIX_JACK__)
96 endif()
97
98 # CoreAudio
99 if (RTAUDIO_CORE)
100   find_library(COREAUDIO_LIB CoreAudio)
101   find_library(COREFOUNDATION_LIB CoreFoundation)
102   list(APPEND LINKLIBS ${COREAUDIO_LIB} ${COREFOUNDATION_LIB})
103   list(APPEND PKGCONFIG_APIS "__MACOSX_CORE__")
104   add_definitions(-D__MACOSX_CORE__)
105 endif()
106
107 # ASIO
108 if (RTAUDIO_ASIO)
109   set(NEED_WIN32LIBS ON)
110   include_directories(include)
111   list(APPEND rtaudio_SOURCES
112     include/asio.cpp
113     include/asiodrivers.cpp
114     include/asiolist.cpp
115     include/iasiothiscallresolver.cpp)
116   add_definitions(-D__WINDOWS_ASIO__)
117   list(APPEND PKGCONFIG_APIS "__WINDOWS_ASIO__")
118 endif()
119
120 # DSound
121 if (RTAUDIO_DS)
122   set(NEED_WIN32LIBS ON)
123   add_definitions(-D__WINDOWS_DS__)
124   message(STATUS "Using Windows DirectSound")
125   list(APPEND LINKLIBS dsound)
126   list(APPEND PKGCONFIG_APIS "__WINDOWS_DS__")
127 endif()
128
129 # WASAPI
130 if (RTAUDIO_WASAPI)
131   set(NEED_WIN32LIBS ON)
132   add_definitions(-D__WINDOWS_WASAPI__)
133   message(STATUS "Using Windows WASAPI")
134   list(APPEND LINKLIBS uuid ksuser)
135   list(APPEND PKGCONFIG_APIS "__WINDOWS_WASAPI__")
136 endif()
137
138 cmake_policy(SET CMP0042 OLD)
139 set(PACKAGE_VERSION 5.0.0)
140 add_library(rtaudio SHARED ${rtaudio_SOURCES})
141 add_library(rtaudio_static STATIC ${rtaudio_SOURCES})
142
143 # Windows libs
144 if (NEED_WIN32LIBS)
145   list(APPEND LINKLIBS winmm ole32)
146 endif()
147
148 # pthread
149 if (NEED_PTHREAD)
150   find_package(Threads REQUIRED
151     CMAKE_THREAD_PREFER_PTHREAD
152     THREADS_PREFER_PTHREAD_FLAG)
153   list(APPEND LINKLIBS Threads::Threads)
154 endif()
155
156 target_link_libraries(rtaudio ${LINKLIBS})
157
158 if (BUILD_TESTING)
159     add_subdirectory(tests)
160 endif (BUILD_TESTING)
161
162 string(REPLACE ";" " " req "${PKGCONFIG_REQUIRES}")
163 string(REPLACE ";" " -D" api "${PKGCONFIG_APIS}")
164 string(PREPEND api "-D")
165 configure_file("rtaudio.pc.in" "rtaudio.pc" @ONLY)
166
167 install(TARGETS rtaudio
168       LIBRARY DESTINATION lib
169       ARCHIVE DESTINATION lib
170       RUNTIME DESTINATION bin)
171
172 install(TARGETS rtaudio_static
173       ARCHIVE DESTINATION lib)
174
175 install(
176     FILES RtAudio.h
177     DESTINATION include)
178
179 install(
180     FILES ${CMAKE_CURRENT_BINARY_DIR}/rtaudio.pc
181     DESTINATION lib/pkgconfig)