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')
48 pulsesysconfdir = join_paths(sysconfdir, 'pulse')
50 pulsedspdir = get_option('pulsedspdir')
52 join_paths(libdir, 'pulseaudio')
57 cc = meson.get_compiler('c')
59 cdata = configuration_data()
60 cdata.set_quoted('PACKAGE', 'pulseaudio')
61 cdata.set_quoted('PACKAGE_NAME', 'pulseaudio')
62 cdata.set_quoted('PACKAGE_VERSION', pa_version_str)
63 cdata.set_quoted('CANONICAL_HOST', host_machine.cpu())
64 cdata.set('PA_MAJOR', pa_version_major)
65 cdata.set('PA_MINOR', pa_version_minor)
66 cdata.set('PA_API_VERSION', pa_api_version)
67 cdata.set('PA_PROTOCOL_VERSION', pa_protocol_version)
68 cdata.set_quoted('PA_MACHINE_ID', join_paths(sysconfdir, 'machine-id'))
69 cdata.set_quoted('PA_MACHINE_ID_FALLBACK', join_paths(localstatedir, 'lib', 'dbus', 'machine-id'))
70 cdata.set_quoted('PA_SRCDIR', join_paths(meson.current_source_dir(), 'src'))
71 cdata.set_quoted('PA_BUILDDIR', meson.current_build_dir())
72 cdata.set_quoted('PA_SOEXT', '.so')
73 cdata.set_quoted('PA_DEFAULT_CONFIG_DIR', pulsesysconfdir)
74 cdata.set_quoted('PA_BINARY', join_paths(bindir, 'pulseaudio'))
75 cdata.set_quoted('PA_SYSTEM_RUNTIME_PATH', join_paths(localstatedir, 'run', 'pulse'))
76 cdata.set_quoted('PA_SYSTEM_CONFIG_PATH', join_paths(localstatedir, 'lib', 'pulse'))
77 cdata.set_quoted('PA_SYSTEM_STATE_PATH', join_paths(localstatedir, 'lib', 'pulse'))
78 cdata.set_quoted('PA_DLSEARCHPATH', join_paths(libdir, 'pulse-' + pa_version_major_minor, 'modules'))
79 cdata.set_quoted('PA_SYSTEM_USER', get_option('system_user'))
80 cdata.set_quoted('PA_SYSTEM_GROUP', get_option('system_group'))
81 cdata.set_quoted('PA_ACCESS_GROUP', get_option('access_group'))
82 cdata.set_quoted('PA_CFLAGS', 'Not yet supported on meson')
83 cdata.set_quoted('PA_ALSA_PATHS_DIR', join_paths(datadir, 'pulseaudio', 'alsa-mixer', 'paths'))
84 cdata.set_quoted('PA_ALSA_PROFILE_SETS_DIR', join_paths(datadir, 'pulseaudio', 'alsa-mixer', 'profile-sets'))
85 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)
130 # FIXME: move this to the above set
131 if cc.has_header('sys/un.h')
132 cdata.set('HAVE_AF_UNIX', 1)
174 foreach f : check_functions
175 if cc.has_function(f)
176 define = 'HAVE_' + f.underscorify().to_upper()
181 shm_dep = cc.find_library('rt', required : false)
183 cdata.set('HAVE_SHM_OPEN', 1)
186 if cc.has_function('SYS_memfd_create', prefix : '#include <sys/syscall.h>')
187 cdata.set('HAVE_MEMFD', 1)
192 # FIXME: do we ever care about gid_t not being defined / smaller than an int?
193 cdata.set('GETGROUPS_T', 'gid_t')
197 configinc = include_directories('.')
198 topinc = include_directories('src')
202 pa_c_args = ['-DHAVE_CONFIG_H', '-D_GNU_SOURCE']
203 server_c_args = ['-D__INCLUDED_FROM_PULSE_AUDIO']
204 cdata.set('MESON_BUILD', 1)
208 libm_dep = cc.find_library('m', required : true)
209 thread_dep = dependency('threads')
210 cap_dep = cc.find_library('cap', required : false)
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 if get_option('database') == 'tdb'
230 database_dep = dependency('tdb')
231 elif get_option('database') == 'gdbm'
232 database_dep = cc.find_library('gdbm', required : true)
235 if get_option('ipv6')
236 cdata.set('HAVE_IPV6', 1)
239 if get_option('legacy-database-entry-format')
240 cdata.set('ENABLE_LEGACY_DATABASE_ENTRY_FORMAT', 1)
243 alsa_dep = dependency('alsa', version : '>= 1.0.24', required : get_option('alsa'))
245 cdata.set('HAVE_ALSA', 1)
246 cdata.set('HAVE_ALSA_UCM', 1)
249 asyncns_dep = dependency('libasyncns', version : '>= 0.1', required : get_option('asyncns'))
250 if asyncns_dep.found()
251 cdata.set('HAVE_LIBASYNCNS', 1)
254 dbus_dep = dependency('dbus-1', version : '>= 1.4.12', required : get_option('dbus'))
256 cdata.set('HAVE_DBUS', 1)
259 gio_dep = dependency('gio-2.0', version : '>= 2.26.0', required : get_option('gsettings'))
261 cdata.set('HAVE_GSETTINGS', 1)
264 glib_dep = dependency('glib-2.0', version : '>= 2.4.0', required: get_option('glib'))
266 cdata.set('HAVE_GLIB', 1)
269 gtk_dep = dependency('gtk+-3.0', required : get_option('gtk'))
271 cdata.set('HAVE_GTK', 1)
274 samplerate_dep = dependency('samplerate', version : '>= 0.1.0', required : get_option('samplerate'))
275 if samplerate_dep.found()
276 cdata.set('HAVE_LIBSAMPLERATE', 1)
279 sndfile_dep = dependency('sndfile', version : '>= 1.0.20')
281 soxr_dep = dependency('soxr', version : '>= 0.1.1', required : get_option('soxr'))
283 cdata.set('HAVE_SOXR', 1)
286 systemd_dep = dependency('libsystemd', required : get_option('systemd'))
287 if systemd_dep.found()
288 cdata.set('HAVE_SYSTEMD_DAEMON', 1)
289 cdata.set('HAVE_SYSTEMD_LOGIN', 1)
290 cdata.set('HAVE_SYSTEMD_JOURNAL', 1)
293 x11_dep = dependency('x11-xcb', required : get_option('x11'))
295 xcb_dep = dependency('xcb', required : true, version : '>= 1.6')
296 ice_dep = dependency('ice', required : true)
297 sm_dep = dependency('sm', required : true)
298 xtst_dep = dependency('xtst', required : true)
299 cdata.set('HAVE_X11', 1)
303 cdata.set('DISABLE_ORC', 1)
305 # Module dependencies
307 if cc.has_header('sys/soundcard.h')
308 cdata.set('HAVE_OSS_OUTPUT', 1)
309 cdata.set('HAVE_OSS_WRAPPER', 1)
310 cdata.set_quoted('PULSEDSP_LOCATION', pulsedspdir)
313 if get_option('hal-compat')
314 cdata.set('HAVE_HAL_COMPAT', 1)
317 avahi_dep = dependency('avahi-client', version : '>= 0.6.0', required : get_option('avahi'))
319 cdata.set('HAVE_AVAHI', 1)
322 bluez_dep = dependency('bluez', version : '>= 5.0', required : get_option('bluez5'))
323 sbc_dep = dependency('sbc', version : '>= 1.0', required : false)
325 assert(dbus_dep.found(), 'BlueZ requires D-Bus support')
326 assert(sbc_dep.found(), 'BlueZ requires SBC support')
327 cdata.set('HAVE_SBC', 1)
328 cdata.set('HAVE_BLUEZ', 1)
329 cdata.set('HAVE_BLUEZ_5', 1)
330 if get_option('bluez5-native-headset')
331 cdata.set('HAVE_BLUEZ_5_NATIVE_HEADSET', 1)
333 if get_option('bluez5-ofono-headset')
334 cdata.set('HAVE_BLUEZ_5_OFONO_HEADSET', 1)
338 fftw_dep = dependency('fftw3f', required : get_option('fftw'))
340 cdata.set('HAVE_FFTW', 1)
343 jack_dep = dependency('jack', version : '>= 0.117.0', required : get_option('jack'))
345 cdata.set('HAVE_JACK', 1)
348 lirc_dep = dependency('lirc', required : get_option('lirc'))
350 cdata.set('HAVE_LIRC', 1)
353 openssl_dep = dependency('openssl', version : '>= 0.9', required : get_option('openssl'))
354 if openssl_dep.found()
355 cdata.set('HAVE_OPENSSL', 1)
358 speex_dep = dependency('speexdsp', version : '>= 1.2', required : get_option('speex'))
360 cdata.set('HAVE_SPEEX', 1)
363 udev_dep = dependency('libudev', version : '>= 143', required : get_option('udev'))
365 cdata.set('HAVE_UDEV', 1)
368 webrtc_dep = dependency('webrtc-audio-processing', version : '>= 0.2', required : get_option('webrtc-aec'))
369 if webrtc_dep.found()
370 cdata.set('HAVE_WEBRTC', 1)
373 # Now generate config.h from everything above
374 configure_file(output : 'config.h', configuration : cdata)
379 ############################################################
385 '---{ @0@ @1@ }---'.format(meson.project_name(), meson.project_version()),
387 'prefix: @0@'.format(prefix),
388 'bindir: @0@'.format(bindir),
389 'libdir: @0@'.format(libdir),
390 'libexecdir: @0@'.format(libexecdir),
391 'datadir: @0@'.format(datadir),
392 'sysconfdir: @0@'.format(sysconfdir),
393 'localstatedir: @0@'.format(localstatedir),
394 # 'modlibexecdir: @0@'.format(${modlibexecdir}),
395 'System Runtime Path: @0@'.format(cdata.get_unquoted('PA_SYSTEM_RUNTIME_PATH')),
396 'System State Path: @0@'.format(cdata.get_unquoted('PA_SYSTEM_STATE_PATH')),
397 'System Config Path: @0@'.format(cdata.get_unquoted('PA_SYSTEM_CONFIG_PATH')),
398 # 'Zsh completions directory: @0@'.format(${zshcompletiondir}),
399 # 'Bash completions directory: @0@'.format(${bashcompletiondir}),
400 'Compiler: @0@ @1@'.format(cc.get_id(), cc.version()),
401 # 'CFLAGS: @0@'.format(${CFLAGS}),
402 # 'CPPFLAGS: @0@'.format(${CPPFLAGS}),
403 # 'LIBS: @0@'.format(${LIBS}),
405 'Enable memfd shared memory: @0@'.format(cdata.has('HAVE_MEMFD')),
406 'Enable X11: @0@'.format(x11_dep.found()),
407 # 'Enable OSS Output: @0@'.format(${ENABLE_OSS_OUTPUT}),
408 # 'Enable OSS Wrapper: @0@'.format(${ENABLE_OSS_WRAPPER}),
409 # 'Enable EsounD: @0@'.format(${ENABLE_ESOUND}),
410 'Enable Alsa: @0@'.format(alsa_dep.found()),
411 # 'Enable CoreAudio: @0@'.format(${ENABLE_COREAUDIO}),
412 # 'Enable Solaris: @0@'.format(${ENABLE_SOLARIS}),
413 # 'Enable WaveOut: @0@'.format(${ENABLE_WAVEOUT}),
414 'Enable GLib 2: @0@'.format(glib_dep.found()),
415 # 'Enable GConf: @0@'.format(${ENABLE_GCONF}),
416 'Enable GSettings: @0@'.format(gio_dep.found()),
417 'Enable Gtk+ 3: @0@'.format(gtk_dep.found()),
418 'Enable Avahi: @0@'.format(avahi_dep.found()),
419 'Enable Jack: @0@'.format(jack_dep.found()),
420 'Enable Async DNS: @0@'.format(asyncns_dep.found()),
421 'Enable LIRC: @0@'.format(lirc_dep.found()),
422 'Enable D-Bus: @0@'.format(dbus_dep.found()),
423 ' Enable BlueZ 5: @0@'.format(bluez_dep.found()),
424 ' Enable native headsets: @0@'.format(get_option('bluez5-native-headset')),
425 ' Enable ofono headsets: @0@'.format(get_option('bluez5-ofono-headset')),
426 'Enable udev: @0@'.format(udev_dep.found()),
427 ' Enable HAL->udev compat: @0@'.format(get_option('hal-compat')),
428 'Enable systemd: @0@'.format(systemd_dep.found()),
429 # 'Enable TCP Wrappers: @0@'.format(${ENABLE_TCPWRAP}),
430 'Enable libsamplerate: @0@'.format(samplerate_dep.found()),
431 'Enable IPv6: @0@'.format(get_option('ipv6')),
432 'Enable OpenSSL (for Airtunes): @0@'.format(openssl_dep.found()),
433 'Enable FFTW: @0@'.format(fftw_dep.found()),
434 # 'Enable orc: @0@'.format(${ENABLE_ORC}),
435 'Enable Adrian echo canceller: @0@'.format(get_option('adrian-aec')),
436 'Enable Speex (resampler, AEC): @0@'.format(speex_dep.found()),
437 'Enable SoXR (resampler): @0@'.format(soxr_dep.found()),
438 'Enable WebRTC echo canceller: @0@'.format(webrtc_dep.found()),
439 # 'Enable gcov coverage: @0@'.format(${ENABLE_GCOV}),
440 # 'Enable unit tests: @0@'.format(${ENABLE_TESTS}),
442 'Database: @0@'.format(get_option('database')),
443 'Legacy Database Entry Support: @0@'.format(get_option('legacy-database-entry-format')),
444 'System User: @0@'.format(cdata.get_unquoted('PA_SYSTEM_USER')),
445 'System Group: @0@'.format(cdata.get_unquoted('PA_SYSTEM_GROUP')),
446 'Access Group: @0@'.format(cdata.get_unquoted('PA_ACCESS_GROUP')),
447 # 'Enable per-user EsounD socket: @0@'.format(${ENABLE_PER_USER_ESOUND_SOCKET}),
448 # 'Force preopen: @0@'.format(${FORCE_PREOPEN}),
449 # 'Preopened modules: @0@'.format(${PREOPEN_MODS}),
452 message('\n '.join(summary))
456 if not speex_dep.found() and not webrtc_dep.found() and not get_option('adrian-aec')
457 error('At least one echo canceller implementation must be available!')
460 if samplerate_dep.found()
461 warning('Support for libsamplerate is DEPRECATED')
464 if host_machine.system() != 'windows'
465 if not dbus_dep.found()
467 'You do not have D-Bus support enabled. It is strongly recommended',
468 'that you enable D-Bus support if your platform supports it.',
469 'Many parts of PulseAudio use D-Bus, from ConsoleKit interaction',
470 'to the Device Reservation Protocol to speak to JACK, Bluetooth',
471 'support and even a native control protocol for communicating and',
472 'controlling the PulseAudio daemon itself.',
474 warning('\n' + '\n'.join(message))
476 if not udev_dep.found()
478 'You do not have udev support enabled. It is strongly recommended',
479 'that you enable udev support if your platform supports it as it is',
480 'the primary method used to detect hardware audio devices (on Linux)',
481 'and is thus a critical part of PulseAudio on that platform.',
483 warning('\n' + '\n'.join(message))
485 if not speex_dep.found()
487 'You do not have speex support enabled. It is strongly recommended',
488 'that you enable speex support if your platform supports it as it is',
489 'the primary method used for audio resampling and is thus a critical',
490 'part of PulseAudio on that platform.',
492 warning('\n' + '\n'.join(message))