1 project('pulseaudio', 'c', 'cpp',
2 version : run_command(find_program('git-version-gen'), join_paths(meson.current_source_dir(), '.tarball-version')).stdout().strip(),
3 meson_version : '>= 0.47.0',
4 default_options : [ 'c_std=gnu11', 'cpp_std=c++11' ]
7 pa_version_str = meson.project_version()
8 # For tarballs, the first split will do nothing, but for builds in git, we
9 # split out suffixes when there are commits since the last tag
10 # (e.g.: v11.99.1-3-gad14bdb24 -> v11.99.1)
11 version_split = pa_version_str.split('-')[0].split('.')
12 pa_version_major = version_split[0].split('v')[0]
13 pa_version_minor = version_split[1]
14 if version_split.length() > 2
15 pa_version_micro = version_split[2]
17 pa_version_micro = '0'
19 pa_version_major_minor = pa_version_major + '.' + pa_version_minor
22 pa_protocol_version = 33
26 # FIXME: this doesn't actually do what we want it to
27 # maintaining compatibility with the previous libtool versioning
28 # current = minor * 100 + micro
29 libversion = '@0@.@1@.0'.format(soversion, pa_version_minor.to_int() * 100 + pa_version_micro.to_int())
31 # The ABI-stable GLib adapter for client applications.
32 # For the version x:y:z always will hold y=z.
33 libpulse_mainloop_glib_version = '0.5.0'
37 prefix = get_option('prefix')
38 assert(prefix.startswith('/'), 'Prefix is not absolute: "@0@"'.format(prefix))
40 bindir = join_paths(prefix, get_option('bindir'))
41 libdir = join_paths(prefix, get_option('libdir'))
42 libexecdir = join_paths(prefix, get_option('libexecdir'))
43 datadir = join_paths(prefix, get_option('datadir'))
44 localstatedir = join_paths(prefix, get_option('localstatedir'))
45 sysconfdir = join_paths(prefix, get_option('sysconfdir'))
47 pulselibexecdir = join_paths(libexecdir, 'pulse')
49 pulsedspdir = get_option('pulsedspdir')
51 join_paths(libdir, 'pulseaudio')
56 cc = meson.get_compiler('c')
58 cdata = configuration_data()
59 cdata.set_quoted('PACKAGE', 'pulseaudio')
60 cdata.set_quoted('PACKAGE_NAME', 'pulseaudio')
61 cdata.set_quoted('PACKAGE_VERSION', pa_version_str)
62 cdata.set_quoted('CANONICAL_HOST', host_machine.cpu())
63 cdata.set('PA_MAJOR', pa_version_major)
64 cdata.set('PA_MINOR', pa_version_minor)
65 cdata.set('PA_API_VERSION', pa_api_version)
66 cdata.set('PA_PROTOCOL_VERSION', pa_protocol_version)
67 cdata.set_quoted('PA_MACHINE_ID', join_paths(sysconfdir, 'machine-id'))
68 cdata.set_quoted('PA_MACHINE_ID_FALLBACK', join_paths(localstatedir, 'lib', 'dbus', 'machine-id'))
69 cdata.set_quoted('PA_SRCDIR', join_paths(meson.current_source_dir(), 'src'))
70 cdata.set_quoted('PA_BUILDDIR', meson.current_build_dir())
71 cdata.set_quoted('PA_SOEXT', '.so')
72 cdata.set_quoted('PA_DEFAULT_CONFIG_DIR', join_paths(sysconfdir, 'pulse'))
73 cdata.set_quoted('PA_BINARY', join_paths(bindir, 'pulseaudio'))
74 cdata.set_quoted('PA_SYSTEM_RUNTIME_PATH', join_paths(localstatedir, 'run', 'pulse'))
75 cdata.set_quoted('PA_SYSTEM_CONFIG_PATH', join_paths(localstatedir, 'lib', 'pulse'))
76 cdata.set_quoted('PA_SYSTEM_STATE_PATH', join_paths(localstatedir, 'lib', 'pulse'))
77 cdata.set_quoted('PA_DLSEARCHPATH', join_paths(libdir, 'pulse-' + pa_version_major_minor, 'modules'))
78 cdata.set_quoted('PA_SYSTEM_USER', get_option('system_user'))
79 cdata.set_quoted('PA_SYSTEM_GROUP', get_option('system_group'))
80 cdata.set_quoted('PA_ACCESS_GROUP', get_option('access_group'))
81 cdata.set_quoted('PA_CFLAGS', 'Not yet supported on meson')
82 cdata.set_quoted('PA_ALSA_PATHS_DIR', join_paths(datadir, 'pulseaudio', 'alsa-mixer', 'paths'))
83 cdata.set_quoted('PA_ALSA_PROFILE_SETS_DIR', join_paths(datadir, 'pulseaudio', 'alsa-mixer', 'profile-sets'))
84 cdata.set_quoted('DESKTOPFILEDIR', join_paths(datadir, 'applications'))
114 'valgrind/memcheck.h',
118 foreach h : check_headers
120 define = 'HAVE_' + h.underscorify().to_upper()
125 # FIXME: move this to the above set
126 if cc.has_header('pthread.h')
127 cdata.set('HAVE_PTHREAD', 1)
168 foreach f : check_functions
169 if cc.has_function(f)
170 define = 'HAVE_' + f.underscorify().to_upper()
175 shm_dep = cc.find_library('rt', required : false)
177 cdata.set('HAVE_SHM_OPEN', 1)
180 if cc.has_function('SYS_memfd_create', prefix : '#include <sys/syscall.h>')
181 cdata.set('HAVE_MEMFD', 1)
186 # FIXME: do we ever care about gid_t not being defined / smaller than an int?
187 cdata.set('GETGROUPS_T', 'gid_t')
191 configinc = include_directories('.')
192 topinc = include_directories('src')
196 pa_c_args = ['-DHAVE_CONFIG_H', '-D_GNU_SOURCE']
197 server_c_args = ['-D__INCLUDED_FROM_PULSE_AUDIO']
198 cdata.set('MESON_BUILD', 1)
202 libm_dep = cc.find_library('m', required : true)
203 thread_dep = dependency('threads')
204 cap_dep = cc.find_library('cap', required : false)
206 if get_option('database') == 'tdb'
207 database_dep = dependency('tdb')
208 elif get_option('database') == 'gdbm'
209 database_dep = cc.find_library('gdbm', required : true)
212 atomictest = '''void func() {
213 volatile int atomic = 2;
214 __sync_bool_compare_and_swap (&atomic, 2, 3);
217 if cc.compiles(atomictest)
218 cdata.set('HAVE_ATOMIC_BUILTINS', true)
220 # FIXME: check if we need libatomic_ops
223 # FIXME: make sure it's >= 2.2
224 ltdl_dep = cc.find_library('ltdl', required : true)
225 # FIXME: can meson support libtool -dlopen/-dlpreopen things?
226 # and do we still want to support this at all?
227 cdata.set('DISABLE_LIBTOOL_PRELOAD', 1)
229 sndfile_dep = dependency('sndfile', version : '>= 1.0.20')
231 dbus_dep = dependency('dbus-1', version : '>= 1.4.12', required : get_option('dbus'))
233 cdata.set('HAVE_DBUS', 1)
236 gio_dep = dependency('gio-2.0', version : '>= 2.26.0', required : get_option('gsettings'))
238 cdata.set('HAVE_GSETTINGS', 1)
241 glib_dep = dependency('glib-2.0', version : '>= 2.4.0', required: get_option('glib'))
243 cdata.set('HAVE_GLIB', 1)
246 gtk_dep = dependency('gtk+-3.0', required : get_option('gtk'))
248 cdata.set('HAVE_GTK', 1)
251 x11_dep = dependency('x11-xcb', required : get_option('x11'))
253 xcb_dep = dependency('xcb', required : true, version : '>= 1.6')
254 ice_dep = dependency('ice', required : true)
255 sm_dep = dependency('sm', required : true)
256 xtst_dep = dependency('xtst', required : true)
257 cdata.set('HAVE_X11', 1)
260 alsa_dep = dependency('alsa', version : '>= 1.0.24', required : get_option('alsa'))
262 cdata.set('HAVE_ALSA', 1)
263 cdata.set('HAVE_ALSA_UCM', 1)
266 systemd_dep = dependency('libsystemd', required : get_option('systemd'))
267 if systemd_dep.found()
268 cdata.set('HAVE_SYSTEMD_DAEMON', 1)
269 cdata.set('HAVE_SYSTEMD_LOGIN', 1)
270 cdata.set('HAVE_SYSTEMD_JOURNAL', 1)
274 cdata.set('DISABLE_ORC', 1)
276 # Module dependencies
278 if cc.has_header('sys/soundcard.h')
279 cdata.set('HAVE_OSS_OUTPUT', 1)
280 cdata.set('HAVE_OSS_WRAPPER', 1)
281 cdata.set_quoted('PULSEDSP_LOCATION', pulsedspdir)
284 if get_option('hal-compat')
285 cdata.set('HAVE_HAL_COMPAT', 1)
288 avahi_dep = dependency('avahi-client', version : '>= 0.6.0', required : get_option('avahi'))
290 cdata.set('HAVE_AVAHI', 1)
293 bluez_dep = dependency('bluez', version : '>= 5.0', required : get_option('bluez5'))
294 sbc_dep = dependency('sbc', version : '>= 1.0', required : false)
296 assert(dbus_dep.found(), 'BlueZ requires D-Bus support')
297 assert(sbc_dep.found(), 'BlueZ requires SBC support')
298 cdata.set('HAVE_SBC', 1)
299 cdata.set('HAVE_BLUEZ', 1)
300 cdata.set('HAVE_BLUEZ_5', 1)
301 if get_option('bluez5-native-headset')
302 cdata.set('HAVE_BLUEZ_5_NATIVE_HEADSET', 1)
304 if get_option('bluez5-ofono-headset')
305 cdata.set('HAVE_BLUEZ_5_OFONO_HEADSET', 1)
309 fftw_dep = dependency('fftw3f', required : get_option('fftw'))
311 cdata.set('HAVE_FFTW', 1)
314 jack_dep = dependency('jack', version : '>= 0.117.0', required : get_option('jack'))
316 cdata.set('HAVE_JACK', 1)
319 lirc_dep = dependency('lirc', required : get_option('lirc'))
321 cdata.set('HAVE_LIRC', 1)
324 openssl_dep = dependency('openssl', version : '>= 0.9', required : get_option('openssl'))
325 if openssl_dep.found()
326 cdata.set('HAVE_OPENSSL', 1)
329 speex_dep = dependency('speexdsp', version : '>= 1.2', required : get_option('speex'))
331 cdata.set('HAVE_SPEEX', 1)
334 udev_dep = dependency('libudev', version : '>= 143', required : get_option('udev'))
336 cdata.set('HAVE_UDEV', 1)
339 webrtc_dep = dependency('webrtc-audio-processing', version : '>= 0.2', required : get_option('webrtc-aec'))
340 if webrtc_dep.found()
341 cdata.set('HAVE_WEBRTC', 1)
346 if not speex_dep.found() and not webrtc_dep.found() and not get_option('adrian-aec')
347 error('At least one echo canceller implementation must be available!')
350 # Now generate config.h from everything above
351 configure_file(output : 'config.h', configuration : cdata)