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.50.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 = 34
24 # The stable ABI for client applications, for the version info x:y:z
25 # always will hold x=z
26 libpulse_version_info = [21, 2, 21]
28 # A simplified, synchronous, ABI-stable interface for client
29 # applications, for the version info x:y:z always will hold x=z
30 libpulse_simple_version_info = [1, 1, 1]
32 # The ABI-stable GLib adapter for client applications, for the version
33 # info x:y:z always will hold x=z
34 libpulse_mainloop_glib_version_info = [0, 5, 0]
36 libpulse_version = '@0@.@1@.@2@'.format(
37 libpulse_version_info[0] - libpulse_version_info[2],
38 libpulse_version_info[0],
39 libpulse_version_info[1],
42 libpulse_simple_version = '@0@.@1@.@2@'.format(
43 libpulse_simple_version_info[0] - libpulse_simple_version_info[2],
44 libpulse_simple_version_info[0],
45 libpulse_simple_version_info[1],
48 libpulse_mainloop_glib_version = '@0@.@1@.@2@'.format(
49 libpulse_mainloop_glib_version_info[0] - libpulse_mainloop_glib_version_info[2],
50 libpulse_mainloop_glib_version_info[0],
51 libpulse_mainloop_glib_version_info[1],
56 prefix = get_option('prefix')
57 assert(prefix.startswith('/'), 'Prefix is not absolute: "@0@"'.format(prefix))
59 bindir = join_paths(prefix, get_option('bindir'))
60 includedir = join_paths(prefix, get_option('includedir'))
61 libdir = join_paths(prefix, get_option('libdir'))
62 libexecdir = join_paths(prefix, get_option('libexecdir'))
63 mandir = join_paths(prefix, get_option('mandir'))
64 datadir = join_paths(prefix, get_option('datadir'))
65 localedir = join_paths(prefix, get_option('localedir'))
66 localstatedir = join_paths(prefix, get_option('localstatedir'))
67 sysconfdir = join_paths(prefix, get_option('sysconfdir'))
68 privlibdir = join_paths(libdir, 'pulseaudio')
70 alsadatadir = get_option('alsadatadir')
72 alsadatadir = join_paths(datadir, 'pulseaudio', 'alsa-mixer')
75 pkgconfigdir = join_paths(libdir, 'pkgconfig')
76 pulselibexecdir = join_paths(libexecdir, 'pulse')
77 pulsesysconfdir = join_paths(sysconfdir, 'pulse')
79 modlibexecdir = get_option('modlibexecdir')
80 if modlibexecdir == ''
81 modlibexecdir = join_paths(libdir, 'pulse-' + pa_version_major_minor, 'modules')
84 padsplibdir = get_option('padsplibdir')
86 padsplibdir = privlibdir
89 pulsedsp_location = get_option('pulsedsp-location')
90 if pulsedsp_location == ''
91 pulsedsp_location = join_paths(prefix, padsplibdir)
94 systemduserunitdir = get_option('systemduserunitdir')
95 # the default value is set below
97 udevrulesdir = get_option('udevrulesdir')
99 # absolute path, otherwise meson prepends the prefix
100 udevrulesdir = '/lib/udev/rules.d'
103 vapidir = join_paths(datadir, 'vala', 'vapi')
105 bashcompletiondir = get_option('bashcompletiondir')
106 if bashcompletiondir == ''
107 bash_completion_dep = dependency('bash-completion', required : false)
108 if bash_completion_dep.found()
109 bashcompletiondir = bash_completion_dep.get_pkgconfig_variable('completionsdir')
111 bashcompletiondir = join_paths(datadir, 'bash-completion', 'completions')
115 zshcompletiondir = get_option('zshcompletiondir')
116 if zshcompletiondir == ''
117 zshcompletiondir = join_paths(datadir, 'zsh', 'site-functions')
122 cc = meson.get_compiler('c')
124 cdata = configuration_data()
125 cdata.set_quoted('PACKAGE', 'pulseaudio')
126 cdata.set_quoted('PACKAGE_NAME', 'pulseaudio')
127 cdata.set_quoted('PACKAGE_VERSION', pa_version_str)
128 cdata.set_quoted('CANONICAL_HOST', host_machine.cpu())
129 cdata.set('PA_MAJOR', pa_version_major)
130 cdata.set('PA_MINOR', pa_version_minor)
131 cdata.set('PA_API_VERSION', pa_api_version)
132 cdata.set('PA_PROTOCOL_VERSION', pa_protocol_version)
133 cdata.set_quoted('PA_MACHINE_ID', join_paths(sysconfdir, 'machine-id'))
134 cdata.set_quoted('PA_MACHINE_ID_FALLBACK', join_paths(localstatedir, 'lib', 'dbus', 'machine-id'))
135 cdata.set_quoted('PA_SRCDIR', join_paths(meson.current_source_dir(), 'src'))
136 cdata.set_quoted('PA_BUILDDIR', meson.current_build_dir())
137 cdata.set_quoted('PA_SOEXT', '.so')
138 cdata.set_quoted('PA_DEFAULT_CONFIG_DIR', pulsesysconfdir)
139 cdata.set_quoted('PA_BINARY', join_paths(bindir, 'pulseaudio'))
140 cdata.set_quoted('PA_SYSTEM_RUNTIME_PATH', join_paths(localstatedir, 'run', 'pulse'))
141 cdata.set_quoted('PA_SYSTEM_CONFIG_PATH', join_paths(localstatedir, 'lib', 'pulse'))
142 cdata.set_quoted('PA_SYSTEM_STATE_PATH', join_paths(localstatedir, 'lib', 'pulse'))
143 cdata.set_quoted('PA_DLSEARCHPATH', modlibexecdir)
144 cdata.set_quoted('PA_SYSTEM_USER', get_option('system_user'))
145 cdata.set_quoted('PA_SYSTEM_GROUP', get_option('system_group'))
146 cdata.set_quoted('PA_ACCESS_GROUP', get_option('access_group'))
147 cdata.set_quoted('PA_CFLAGS', 'Not yet supported on meson')
148 cdata.set_quoted('PA_ALSA_PATHS_DIR', join_paths(alsadatadir, 'paths'))
149 cdata.set_quoted('PA_ALSA_PROFILE_SETS_DIR', join_paths(alsadatadir, 'profile-sets'))
150 cdata.set_quoted('DESKTOPFILEDIR', join_paths(datadir, 'applications'))
151 cdata.set_quoted('PULSE_LOCALEDIR', localedir)
152 cdata.set_quoted('GETTEXT_PACKAGE', 'pulseaudio')
153 cdata.set('ENABLE_NLS', 1)
156 # First some defaults to keep config file generation happy
157 cdata.set('HAVE_COREAUDIO', 0)
158 cdata.set('HAVE_WAVEOUT', 0)
159 # FIXME: This was not tested. Maybe some flags should better be CFLAGS,
160 # rather than ending up in the config.h file?
161 if host_machine.system() == 'darwin'
162 cdata.set('OS_IS_DARWIN', 1)
163 cdata.set('_DARWIN_C_SOURCE', '200112L') # Needed to get NSIG on Mac OS
164 elif host_machine.system() == 'windows'
165 cdata.set('OS_IS_WIN32', 1)
166 cdata.set('WIN32_LEAN_AND_MEAN', 1) # Needed to avoid including unnecessary headers on Windows
167 #elif host_machine.system() == 'solaris'
168 # # Apparently meson has no solaris support?
169 # # Needed to get declarations for msg_control and msg_controllen on Solaris
170 # cdata.set('_XOPEN_SOURCE', 600)
171 # cdata.set('__EXTENSIONS__', 1)
174 if cc.has_type('_Bool')
175 cdata.set('HAVE_STD_BOOL', 1)
178 if host_machine.cpu_family() == 'x86_64' or cc.sizeof('void *') >= 8
179 cdata.set('HAVE_FAST_64BIT_OPERATIONS', 1)
196 'netinet/in_systm.h',
222 'valgrind/memcheck.h',
226 foreach h : check_headers
228 define = 'HAVE_' + h.underscorify().to_upper()
233 # FIXME: move this to the above set
234 if cc.has_header('pthread.h')
235 cdata.set('HAVE_PTHREAD', 1)
238 if cc.has_header_symbol('pthread.h', 'PTHREAD_PRIO_INHERIT')
239 cdata.set('HAVE_PTHREAD_PRIO_INHERIT', 1)
292 foreach f : check_functions
293 if cc.has_function(f)
294 define = 'HAVE_' + f.underscorify().to_upper()
299 if cc.has_header_symbol('sys/syscall.h', 'SYS_memfd_create')
300 cdata.set('HAVE_MEMFD', 1)
303 if cc.has_function('dgettext')
306 libintl_dep = cc.find_library('intl')
311 if cc.has_header_symbol('signal.h', 'SIGXCPU')
312 cdata.set('HAVE_SIGXCPU', 1)
315 if not cc.has_header_symbol('netinet/in.h', 'INADDR_NONE')
316 if not cc.has_header_symbol('winsock2.h', 'INADDR_NONE')
317 # Define INADDR_NONE if not found (Solaris)
318 cdata.set('INADDR_NONE', '0xffffffff')
323 [ 'environ', 'unistd.h', '#define _GNU_SOURCE' ],
324 [ 'SOUND_PCM_READ_RATE', 'sys/soundcard.h', '' ],
325 [ 'SOUND_PCM_READ_CHANNELS', 'sys/soundcard.h', '' ],
326 [ 'SOUND_PCM_READ_BITS', 'sys/soundcard.h', '' ],
329 foreach s : check_decls
330 if cc.has_header_symbol(s[1], s[0], prefix : s[2])
331 define = 'HAVE_DECL_' + s[0].to_upper()
338 # FIXME: do we ever care about gid_t not being defined / smaller than an int?
339 cdata.set('GETGROUPS_T', 'gid_t')
343 configinc = include_directories('.')
344 topinc = include_directories('src')
348 pa_c_args = ['-DHAVE_CONFIG_H', '-D_GNU_SOURCE']
349 server_c_args = ['-D__INCLUDED_FROM_PULSE_AUDIO']
350 cdata.set('MESON_BUILD', 1)
352 # On ELF systems we don't want the libraries to be unloaded since we don't clean them up properly,
353 # so we request the nodelete flag to be enabled.
354 # On other systems, we don't really know how to do that, but it's welcome if somebody can tell.
355 nodelete_link_args = ['-Wl,-z,nodelete']
359 if get_option('gcov')
360 add_project_arguments('--coverage', language: ['c', 'cpp'])
361 add_project_link_arguments('--coverage', language: ['c', 'cpp'])
366 libm_dep = cc.find_library('m', required : true)
368 thread_dep = dependency('threads')
370 'pthread_getname_np',
371 'pthread_setaffinity_np',
372 'pthread_setname_np',
374 if cc.has_function(f, dependencies : thread_dep)
375 define = 'HAVE_' + f.underscorify().to_upper()
380 cap_dep = cc.find_library('cap', required : false)
382 shm_dep = cc.find_library('rt', required : false)
384 cdata.set('HAVE_SHM_OPEN', 1)
387 dl_dep = cc.find_library('dl', required : false)
389 cdata.set('HAVE_DLADDR', 1)
393 if cc.has_function('iconv_open')
394 iconv_dep = dependency('', required : false)
397 iconv_dep = cc.find_library('iconv', required : false)
398 have_iconv = iconv_dep.found()
401 cdata.set('HAVE_ICONV', 1)
402 iconvconsttest = '''#include <iconv.h>
403 size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);
405 if cc.compiles(iconvconsttest, dependencies : iconv_dep)
406 cdata.set('ICONV_CONST', '')
408 cdata.set('ICONV_CONST', 'const')
414 if get_option('atomic-arm-memory-barrier')
415 cdata.set('ATOMIC_ARM_MEMORY_BARRIER_ENABLED', 1)
418 need_libatomic_ops = false
420 atomictest = '''void func() {
421 volatile int atomic = 2;
422 __sync_bool_compare_and_swap (&atomic, 2, 3);
426 if cc.compiles(atomictest)
427 cdata.set('HAVE_ATOMIC_BUILTINS', 1)
429 newatomictest = '''void func() {
431 __atomic_store_n(&c, 4, __ATOMIC_SEQ_CST);
435 if(cc.compiles(newatomictest))
436 cdata.set('HAVE_ATOMIC_BUILTINS_MEMORY_MODEL', 1)
439 elif host_machine.cpu_family() == 'arm'
440 if host_machine.system() == 'linux' and get_option('atomic-arm-linux-helpers')
441 cdata.set('ATOMIC_ARM_LINUX_HELPERS', 1)
443 armatomictest = '''int func() {
449 "strexeq %0, %3, [%1]\n"
451 : "r" (&a), "Ir" (o), "r" (n)
453 return (a==1 ? 0 : -1);
457 if cc.compiles(armatomictest)
458 cdata.set('ATOMIC_ARM_INLINE_ASM', 1)
460 need_libatomic_ops = true
462 endif # arm && !linux
464 elif not ['freebsd', 'netbsd'].contains(host_machine.system())
465 need_libatomic_ops = true
466 endif # !atomic helpers && !arm
468 if need_libatomic_ops
469 assert(cc.has_header('atomic_ops.h'), 'Need libatomic_ops')
471 cdata.set('AO_REQUIRE_CAS', 1)
473 if host_machine.system() != 'windows'
474 libatomic_ops_dep = cc.find_library('atomic_ops', required : true)
476 libatomic_ops_dep = dependency('', required: false)
479 libatomic_ops_dep = dependency('', required: false)
483 # ARMV6 instructions we need
484 if host_machine.cpu_family() == 'arm'
485 armv6test = '''int func() {
486 volatile int a = -60000, b = 0xaaaabbbb, c = 0xccccdddd;
487 asm volatile ("ldr r0, %2 \n"
492 "pkhbt r1, r3, r2, LSL #8 \n"
495 : "m" (a), "m" (b), "m" (c)
496 : "r0", "r1", "r2", "r3", "cc");
497 return (a == -128 && b == 0xaabbdddd) ? 0 : -1;
501 if cc.compiles(armv6test)
502 cdata.set('HAVE_ARMV6', 1)
505 # NEON checks are automatically done by the unstable-simd module
507 # FIXME: make sure it's >= 2.2
508 ltdl_dep = cc.find_library('ltdl', required : true)
509 # FIXME: can meson support libtool -dlopen/-dlpreopen things?
510 # and do we still want to support this at all?
511 cdata.set('DISABLE_LIBTOOL_PRELOAD', 1)
513 if get_option('database') == 'tdb'
514 database_dep = dependency('tdb')
515 elif get_option('database') == 'gdbm'
516 database_dep = cc.find_library('gdbm', required : true)
518 database_dep = dependency('', required: false)
521 if get_option('ipv6')
522 cdata.set('HAVE_IPV6', 1)
525 if get_option('legacy-database-entry-format')
526 cdata.set('ENABLE_LEGACY_DATABASE_ENTRY_FORMAT', 1)
529 if get_option('stream-restore-clear-old-devices')
530 cdata.set('STREAM_RESTORE_CLEAR_OLD_DEVICES', 1)
533 if get_option('running-from-build-tree')
534 cdata.set('HAVE_RUNNING_FROM_BUILD_TREE', 1)
537 alsa_dep = dependency('alsa', version : '>= 1.0.24', required : get_option('alsa'))
539 cdata.set('HAVE_ALSA', 1)
540 cdata.set('HAVE_ALSA_UCM', 1)
543 asyncns_dep = dependency('libasyncns', version : '>= 0.1', required : get_option('asyncns'))
544 if asyncns_dep.found()
545 cdata.set('HAVE_LIBASYNCNS', 1)
548 dbus_dep = dependency('dbus-1', version : '>= 1.4.12', required : get_option('dbus'))
550 cdata.set('HAVE_DBUS', 1)
553 gio_dep = dependency('gio-2.0', version : '>= 2.26.0', required : get_option('gsettings'))
555 cdata.set('HAVE_GSETTINGS', 1)
558 glib_dep = dependency('glib-2.0', version : '>= 2.4.0', required: get_option('glib'))
560 cdata.set('HAVE_GLIB', 1)
563 gtk_dep = dependency('gtk+-3.0', required : get_option('gtk'))
565 cdata.set('HAVE_GTK', 1)
570 orc_dep = dependency('orc-0.4', version : '>= 0.4.11', required : get_option('orc'))
571 orcc = find_program('orcc', required : get_option('orc'))
572 if orc_dep.found() and orcc.found()
575 #orcc_args = [orcc, '--include', 'glib.h']
576 cdata.set('HAVE_ORC', 1)
578 cdata.set('DISABLE_ORC', 1)
581 samplerate_dep = dependency('samplerate', version : '>= 0.1.0', required : get_option('samplerate'))
582 if samplerate_dep.found()
583 cdata.set('HAVE_LIBSAMPLERATE', 1)
586 sndfile_dep = dependency('sndfile', version : '>= 1.0.20')
588 soxr_dep = dependency('soxr', version : '>= 0.1.1', required : get_option('soxr'))
590 cdata.set('HAVE_SOXR', 1)
593 libsystemd_dep = dependency('libsystemd', required : get_option('systemd'))
594 if libsystemd_dep.found()
595 cdata.set('HAVE_SYSTEMD_DAEMON', 1)
596 cdata.set('HAVE_SYSTEMD_LOGIN', 1)
597 cdata.set('HAVE_SYSTEMD_JOURNAL', 1)
599 systemd_dep = dependency('systemd', required : get_option('systemd'))
600 if systemd_dep.found() and systemduserunitdir == ''
601 systemduserunitdir = systemd_dep.get_pkgconfig_variable('systemduserunitdir')
604 x11_dep = dependency('x11-xcb', required : get_option('x11'))
606 xcb_dep = dependency('xcb', required : true, version : '>= 1.6')
607 ice_dep = dependency('ice', required : true)
608 sm_dep = dependency('sm', required : true)
609 xtst_dep = dependency('xtst', required : true)
610 cdata.set('HAVE_X11', 1)
613 # Module dependencies
615 if cc.has_header('sys/soundcard.h')
616 cdata.set('HAVE_OSS_OUTPUT', 1)
617 cdata.set('HAVE_OSS_WRAPPER', 1)
618 cdata.set('PULSEDSP_LOCATION', pulsedsp_location)
621 if get_option('hal-compat')
622 cdata.set('HAVE_HAL_COMPAT', 1)
625 avahi_dep = dependency('avahi-client', version : '>= 0.6.0', required : get_option('avahi'), disabler : true)
627 cdata.set('HAVE_AVAHI', 1)
630 sbc_dep = dependency('sbc', version : '>= 1.0', required : false)
631 if get_option('bluez5')
632 assert(dbus_dep.found(), 'BlueZ requires D-Bus support')
633 assert(sbc_dep.found(), 'BlueZ requires SBC support')
634 cdata.set('HAVE_SBC', 1)
635 cdata.set('HAVE_BLUEZ', 1)
636 cdata.set('HAVE_BLUEZ_5', 1)
637 if get_option('bluez5-native-headset')
638 cdata.set('HAVE_BLUEZ_5_NATIVE_HEADSET', 1)
640 if get_option('bluez5-ofono-headset')
641 cdata.set('HAVE_BLUEZ_5_OFONO_HEADSET', 1)
645 fftw_dep = dependency('fftw3f', required : get_option('fftw'))
647 cdata.set('HAVE_FFTW', 1)
650 jack_dep = dependency('jack', version : '>= 0.117.0', required : get_option('jack'))
652 cdata.set('HAVE_JACK', 1)
655 lirc_dep = dependency('lirc', required : get_option('lirc'))
657 cdata.set('HAVE_LIRC', 1)
660 openssl_dep = dependency('openssl', version : '>= 0.9', required : get_option('openssl'))
661 if openssl_dep.found()
662 cdata.set('HAVE_OPENSSL', 1)
665 speex_dep = dependency('speexdsp', version : '>= 1.2', required : get_option('speex'))
667 cdata.set('HAVE_SPEEX', 1)
670 udev_dep = dependency('libudev', version : '>= 143', required : get_option('udev'))
672 cdata.set('HAVE_UDEV', 1)
675 webrtc_dep = dependency('webrtc-audio-processing', version : '>= 0.2', required : get_option('webrtc-aec'))
676 if webrtc_dep.found()
677 cdata.set('HAVE_WEBRTC', 1)
680 gst_dep = dependency('gstreamer-1.0', required : get_option('gstreamer'))
681 gstapp_dep = dependency('gstreamer-app-1.0', required : get_option('gstreamer'))
682 gstrtp_dep = dependency('gstreamer-rtp-1.0', required : get_option('gstreamer'))
684 have_gstreamer = false
685 if gst_dep.found() and gstapp_dep.found() and gstrtp_dep.found()
686 have_gstreamer = true
689 # These are required for the CMake file generation
690 cdata.set('PA_LIBDIR', libdir)
691 cdata.set('PA_INCDIR', includedir)
693 cdata.set('HAVE_GLIB20', 1) # to match the AM_CONDITIONAL for CMake file generation
698 check_dep = dependency('check', version : '>= 0.9.10', required : get_option('tests'))
706 subdir('shell-completion/bash')
707 subdir('shell-completion/zsh')
711 # Now generate config.h from everything above
712 configure_file(output : 'config.h', configuration : cdata)
716 pc_cdata = configuration_data()
718 pc_cdata.set('prefix', prefix)
719 pc_cdata.set('exec_prefix', prefix)
720 pc_cdata.set('libdir', libdir)
721 pc_cdata.set('includedir', includedir)
722 pc_cdata.set('modlibexecdir', modlibexecdir)
723 pc_cdata.set('PACKAGE_VERSION', pa_version_str)
724 pc_cdata.set('PA_MAJORMINOR', pa_version_major_minor)
725 # FIXME: the line below is wrong. Currently the meson thread dep lacks documentation,
726 # and doesn't allow introspection, ie. none of get_pkgconfig_variable() or
727 # get_configtool_variable() work with it, so we have no way to get this flag right,
728 # unless we do all the work ourselves. See current work in glib, also meson #553.
729 pc_cdata.set('PTHREAD_LIBS', '-pthread')
733 'libpulse-simple.pc',
737 pc_files += 'libpulse-mainloop-glib.pc'
740 foreach file : pc_files
742 input : file + '.in',
744 configuration : pc_cdata,
745 install_dir : pkgconfigdir)
750 m4 = find_program('m4', required: true)
752 cmakedir = join_paths(libdir, 'cmake', 'PulseAudio')
754 cmake_template_file = configure_file(
755 input : 'PulseAudioConfig.cmake.in',
756 output : 'PulseAudioConfig.cmake.tmp',
757 configuration: cdata,
760 custom_target('PulseAudioConfig.cmake',
761 input : cmake_template_file,
762 output : 'PulseAudioConfig.cmake',
764 command : [m4, '@INPUT@'],
765 build_by_default : true,
767 install_dir : cmakedir,
771 input : 'PulseAudioConfigVersion.cmake.in',
772 output : 'PulseAudioConfigVersion.cmake',
773 configuration: cdata,
775 install_dir : cmakedir,
778 ############################################################
784 '---{ @0@ @1@ }---'.format(meson.project_name(), meson.project_version()),
786 'prefix: @0@'.format(prefix),
787 'bindir: @0@'.format(bindir),
788 'libdir: @0@'.format(libdir),
789 'libexecdir: @0@'.format(libexecdir),
790 'mandir: @0@'.format(mandir),
791 'datadir: @0@'.format(datadir),
792 'sysconfdir: @0@'.format(sysconfdir),
793 'localstatedir: @0@'.format(localstatedir),
794 'modlibexecdir: @0@'.format(modlibexecdir),
795 'alsadatadir: @0@'.format(alsadatadir),
796 'System Runtime Path: @0@'.format(cdata.get_unquoted('PA_SYSTEM_RUNTIME_PATH')),
797 'System State Path: @0@'.format(cdata.get_unquoted('PA_SYSTEM_STATE_PATH')),
798 'System Config Path: @0@'.format(cdata.get_unquoted('PA_SYSTEM_CONFIG_PATH')),
799 'Bash completions directory: @0@'.format(bashcompletiondir),
800 'Zsh completions directory: @0@'.format(zshcompletiondir),
801 'Compiler: @0@ @1@'.format(cc.get_id(), cc.version()),
802 # 'CFLAGS: @0@'.format(${CFLAGS}),
803 # 'CPPFLAGS: @0@'.format(${CPPFLAGS}),
804 # 'LIBS: @0@'.format(${LIBS}),
806 'Enable memfd shared memory: @0@'.format(cdata.has('HAVE_MEMFD')),
807 'Enable X11: @0@'.format(x11_dep.found()),
808 # 'Enable OSS Output: @0@'.format(${ENABLE_OSS_OUTPUT}),
809 # 'Enable OSS Wrapper: @0@'.format(${ENABLE_OSS_WRAPPER}),
810 # 'Enable EsounD: @0@'.format(${ENABLE_ESOUND}),
811 'Enable Alsa: @0@'.format(alsa_dep.found()),
812 # 'Enable CoreAudio: @0@'.format(${ENABLE_COREAUDIO}),
813 # 'Enable Solaris: @0@'.format(${ENABLE_SOLARIS}),
814 # 'Enable WaveOut: @0@'.format(${ENABLE_WAVEOUT}),
815 'Enable GLib 2: @0@'.format(glib_dep.found()),
816 # 'Enable GConf: @0@'.format(${ENABLE_GCONF}),
817 'Enable GSettings: @0@'.format(gio_dep.found()),
818 'Enable Gtk+ 3: @0@'.format(gtk_dep.found()),
819 'Enable Avahi: @0@'.format(avahi_dep.found()),
820 'Enable Jack: @0@'.format(jack_dep.found()),
821 'Enable Async DNS: @0@'.format(asyncns_dep.found()),
822 'Enable LIRC: @0@'.format(lirc_dep.found()),
823 'Enable D-Bus: @0@'.format(dbus_dep.found()),
824 ' Enable BlueZ 5: @0@'.format(get_option('bluez5')),
825 ' Enable native headsets: @0@'.format(get_option('bluez5-native-headset')),
826 ' Enable ofono headsets: @0@'.format(get_option('bluez5-ofono-headset')),
827 'Enable udev: @0@'.format(udev_dep.found()),
828 ' Enable HAL->udev compat: @0@'.format(get_option('hal-compat')),
829 'Enable systemd: @0@'.format(libsystemd_dep.found()),
830 # 'Enable TCP Wrappers: @0@'.format(${ENABLE_TCPWRAP}),
831 'Enable libsamplerate: @0@'.format(samplerate_dep.found()),
832 'Enable IPv6: @0@'.format(get_option('ipv6')),
833 'Enable OpenSSL (for Airtunes): @0@'.format(openssl_dep.found()),
834 'Enable FFTW: @0@'.format(fftw_dep.found()),
835 'Enable ORC: @0@'.format(have_orcc),
836 'Enable GStreamer: @0@'.format(have_gstreamer),
837 'Enable Adrian echo canceller: @0@'.format(get_option('adrian-aec')),
838 'Enable Speex (resampler, AEC): @0@'.format(speex_dep.found()),
839 'Enable SoXR (resampler): @0@'.format(soxr_dep.found()),
840 'Enable WebRTC echo canceller: @0@'.format(webrtc_dep.found()),
841 'Enable Gcov coverage: @0@'.format(get_option('gcov')),
842 'Enable man pages: @0@'.format(get_option('man')),
843 'Enable unit tests: @0@'.format(get_option('tests')),
845 'Database: @0@'.format(get_option('database')),
846 'Legacy Database Entry Support: @0@'.format(get_option('legacy-database-entry-format')),
847 'module-stream-restore:',
848 ' Clear old devices: @0@'.format(get_option('stream-restore-clear-old-devices')),
849 'Running from build tree: @0@'.format(get_option('running-from-build-tree')),
850 'System User: @0@'.format(cdata.get_unquoted('PA_SYSTEM_USER')),
851 'System Group: @0@'.format(cdata.get_unquoted('PA_SYSTEM_GROUP')),
852 'Access Group: @0@'.format(cdata.get_unquoted('PA_ACCESS_GROUP')),
853 # 'Enable per-user EsounD socket: @0@'.format(${ENABLE_PER_USER_ESOUND_SOCKET}),
854 # 'Force preopen: @0@'.format(${FORCE_PREOPEN}),
855 # 'Preopened modules: @0@'.format(${PREOPEN_MODS}),
858 message('\n '.join(summary))
862 if not speex_dep.found() and not webrtc_dep.found() and not get_option('adrian-aec')
863 error('At least one echo canceller implementation must be available!')
866 if samplerate_dep.found()
867 warning('Support for libsamplerate is DEPRECATED')
870 if host_machine.system() != 'windows'
871 if not dbus_dep.found()
873 'You do not have D-Bus support enabled. It is strongly recommended',
874 'that you enable D-Bus support if your platform supports it.',
875 'Many parts of PulseAudio use D-Bus, from ConsoleKit interaction',
876 'to the Device Reservation Protocol to speak to JACK, Bluetooth',
877 'support and even a native control protocol for communicating and',
878 'controlling the PulseAudio daemon itself.',
880 warning('\n' + '\n'.join(message))
882 if not udev_dep.found()
884 'You do not have udev support enabled. It is strongly recommended',
885 'that you enable udev support if your platform supports it as it is',
886 'the primary method used to detect hardware audio devices (on Linux)',
887 'and is thus a critical part of PulseAudio on that platform.',
889 warning('\n' + '\n'.join(message))
891 if not speex_dep.found()
893 'You do not have speex support enabled. It is strongly recommended',
894 'that you enable speex support if your platform supports it as it is',
895 'the primary method used for audio resampling and is thus a critical',
896 'part of PulseAudio on that platform.',
898 warning('\n' + '\n'.join(message))