meson: Add support for gcov
[platform/upstream/pulseaudio.git] / meson.build
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' ]
5         )
6
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]
16 else
17   pa_version_micro = '0'
18 endif
19 pa_version_major_minor = pa_version_major + '.' + pa_version_minor
20
21 pa_api_version = 12
22 pa_protocol_version = 33
23
24 apiversion = '1.0'
25 soversion = 0
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())
30
31 # A simplified, synchronous, ABI-stable interface for client applications.
32 # For the version x:y:z always will hold y=z.
33 libpulse_simple_version = '1.1.1'
34
35 # The ABI-stable GLib adapter for client applications.
36 # For the version x:y:z always will hold y=z.
37 libpulse_mainloop_glib_version = '0.5.0'
38
39 # Paths
40
41 prefix = get_option('prefix')
42 assert(prefix.startswith('/'), 'Prefix is not absolute: "@0@"'.format(prefix))
43
44 bindir = join_paths(prefix, get_option('bindir'))
45 includedir = join_paths(prefix, get_option('includedir'))
46 libdir = join_paths(prefix, get_option('libdir'))
47 libexecdir = join_paths(prefix, get_option('libexecdir'))
48 mandir = join_paths(prefix, get_option('mandir'))
49 datadir = join_paths(prefix, get_option('datadir'))
50 localstatedir = join_paths(prefix, get_option('localstatedir'))
51 sysconfdir = join_paths(prefix, get_option('sysconfdir'))
52 privlibdir = join_paths(get_option('libdir'), 'pulseaudio')
53 alsadatadir = join_paths(datadir, 'pulseaudio', 'alsa-mixer')
54
55 pkgconfigdir = join_paths(libdir, 'pkgconfig')
56 pulselibexecdir = join_paths(libexecdir, 'pulse')
57 pulsesysconfdir = join_paths(sysconfdir, 'pulse')
58
59 modlibexecdir = get_option('modlibexecdir')
60 if modlibexecdir == ''
61   modlibexecdir = join_paths(libdir, 'pulse-' + pa_version_major_minor, 'modules')
62 endif
63
64 pulsedspdir = get_option('pulsedspdir')
65 if pulsedspdir == ''
66   pulsedspdir = join_paths(libdir, 'pulseaudio')
67 endif
68
69 systemduserunitdir = get_option('systemduserunitdir')
70 # the default value is set below
71
72 udevrulesdir = get_option('udevrulesdir')
73 if udevrulesdir == ''
74   # absolute path, otherwise meson prepends the prefix
75   udevrulesdir = '/lib/udev/rules.d'
76 endif
77
78 vapidir = join_paths(datadir, 'vala', 'vapi')
79
80 bashcompletiondir = get_option('bashcompletiondir')
81 if bashcompletiondir == ''
82   bash_completion_dep = dependency('bash-completion', required : false)
83   if bash_completion_dep.found()
84     bashcompletiondir = bash_completion_dep.get_pkgconfig_variable('completionsdir')
85   else
86     bashcompletiondir = join_paths(datadir, 'bash-completion', 'completions')
87   endif
88 endif
89
90 zshcompletiondir = get_option('zshcompletiondir')
91 if zshcompletiondir == ''
92   zshcompletiondir = join_paths(datadir, 'zsh', 'site-functions')
93 endif
94
95 # Configuration data
96
97 cc = meson.get_compiler('c')
98
99 cdata = configuration_data()
100 cdata.set_quoted('PACKAGE', 'pulseaudio')
101 cdata.set_quoted('PACKAGE_NAME', 'pulseaudio')
102 cdata.set_quoted('PACKAGE_VERSION', pa_version_str)
103 cdata.set_quoted('CANONICAL_HOST', host_machine.cpu())
104 cdata.set('PA_MAJOR', pa_version_major)
105 cdata.set('PA_MINOR', pa_version_minor)
106 cdata.set('PA_API_VERSION', pa_api_version)
107 cdata.set('PA_PROTOCOL_VERSION', pa_protocol_version)
108 cdata.set_quoted('PA_MACHINE_ID', join_paths(sysconfdir, 'machine-id'))
109 cdata.set_quoted('PA_MACHINE_ID_FALLBACK', join_paths(localstatedir, 'lib', 'dbus', 'machine-id'))
110 cdata.set_quoted('PA_SRCDIR', join_paths(meson.current_source_dir(), 'src'))
111 cdata.set_quoted('PA_BUILDDIR', meson.current_build_dir())
112 cdata.set_quoted('PA_SOEXT', '.so')
113 cdata.set_quoted('PA_DEFAULT_CONFIG_DIR', pulsesysconfdir)
114 cdata.set_quoted('PA_BINARY', join_paths(bindir, 'pulseaudio'))
115 cdata.set_quoted('PA_SYSTEM_RUNTIME_PATH', join_paths(localstatedir, 'run', 'pulse'))
116 cdata.set_quoted('PA_SYSTEM_CONFIG_PATH', join_paths(localstatedir, 'lib', 'pulse'))
117 cdata.set_quoted('PA_SYSTEM_STATE_PATH', join_paths(localstatedir, 'lib', 'pulse'))
118 cdata.set_quoted('PA_DLSEARCHPATH', modlibexecdir)
119 cdata.set_quoted('PA_SYSTEM_USER', get_option('system_user'))
120 cdata.set_quoted('PA_SYSTEM_GROUP', get_option('system_group'))
121 cdata.set_quoted('PA_ACCESS_GROUP', get_option('access_group'))
122 cdata.set_quoted('PA_CFLAGS', 'Not yet supported on meson')
123 cdata.set_quoted('PA_ALSA_PATHS_DIR', join_paths(alsadatadir, 'paths'))
124 cdata.set_quoted('PA_ALSA_PROFILE_SETS_DIR', join_paths(alsadatadir, 'profile-sets'))
125 cdata.set_quoted('DESKTOPFILEDIR', join_paths(datadir, 'applications'))
126
127 # Platform specifics
128 # First some defaults to keep config file generation happy
129 cdata.set('HAVE_COREAUDIO', 0)
130 cdata.set('HAVE_WAVEOUT', 0)
131 # FIXME: This was not tested. Maybe some flags should better be CFLAGS,
132 # rather than ending up in the config.h file?
133 if host_machine.system() == 'darwin'
134   cdata.set('OS_IS_DARWIN', 1)
135   cdata.set('_DARWIN_C_SOURCE', '200112L') # Needed to get NSIG on Mac OS
136 elif host_machine.system() == 'windows'
137   cdata.set('OS_IS_WIN32', 1)
138   cdata.set('WIN32_LEAN_AND_MEAN', 1) # Needed to avoid including unnecessary headers on Windows
139 #elif host_machine.system() == 'solaris'
140 #  # Apparently meson has no solaris support?
141 #  # Needed to get declarations for msg_control and msg_controllen on Solaris
142 #  cdata.set('_XOPEN_SOURCE', 600)
143 #  cdata.set('__EXTENSIONS__', 1)
144 endif
145
146 # Headers
147
148 check_headers = [
149   'arpa/inet.h',
150   'cpuid.h',
151   'execinfo.h',
152   'grp.h',
153   'langinfo.h',
154   'locale.h',
155   'netdb.h',
156   'netinet/in.h',
157   'netinet/in_systm.h',
158   'netinet/ip.h',
159   'netinet/tcp.h',
160   'pcreposix.h',
161   'poll.h',
162   'pwd.h',
163   'regex.h',
164   'sched.h',
165   'sys/capability.h',
166   'sys/eventfd.h',
167   'sys/ioctl.h',
168   'sys/mman.h',
169   'sys/prctl.h',
170   'sys/resource.h',
171   'sys/select.h',
172   'sys/socket.h',
173   'sys/un.h',
174   'sys/wait.h',
175   'valgrind/memcheck.h',
176   'xlocale.h',
177 ]
178
179 foreach h : check_headers
180   if cc.has_header(h)
181     define = 'HAVE_' + h.underscorify().to_upper()
182     cdata.set(define, 1)
183   endif
184 endforeach
185
186 # FIXME: move this to the above set
187 if cc.has_header('pthread.h')
188   cdata.set('HAVE_PTHREAD', 1)
189 endif
190
191 # Functions
192
193 check_functions = [
194   'accept4',
195   'clock_gettime',
196   'fchmod',
197   'fchown',
198   'fork',
199   'fstat',
200   'getaddrinfo',
201   'getgrgid_r',
202   'getpwnam_r',
203   'gettimeofday',
204   'getuid',
205   'lstat',
206   'memfd_create',
207   'mkfifo',
208   'mlock',
209   'nanosleep',
210   'paccept',
211   'pipe',
212   'pipe2',
213   'posix_madvise',
214   'readlink',
215   'setegid',
216   'seteuid',
217   'setregid',
218   'setreuid',
219   'setresgid',
220   'setresuid',
221   'setsid',
222   'sig2str',
223   'sigaction',
224   'strtod_l',
225   'symlink',
226   'sysconf',
227   'uname',
228 ]
229
230 foreach f : check_functions
231   if cc.has_function(f)
232     define = 'HAVE_' + f.underscorify().to_upper()
233     cdata.set(define, 1)
234   endif
235 endforeach
236
237 if cc.has_function('SYS_memfd_create', prefix : '#include <sys/syscall.h>')
238   cdata.set('HAVE_MEMFD', 1)
239 endif
240
241 # Symbols
242
243 if cc.has_header_symbol('signal.h', 'SIGXCPU')
244   cdata.set('HAVE_SIGXCPU', 1)
245 endif
246
247 if not cc.has_header_symbol('netinet/in.h', 'INADDR_NONE')
248   if not cc.has_header_symbol('winsock2.h', 'INADDR_NONE')
249     # Define INADDR_NONE if not found (Solaris)
250     cdata.set('INADDR_NONE', '0xffffffff')
251   endif
252 endif
253
254 # Types
255
256 # FIXME: do we ever care about gid_t not being defined / smaller than an int?
257 cdata.set('GETGROUPS_T', 'gid_t')
258
259 # Include paths
260
261 configinc = include_directories('.')
262 topinc = include_directories('src')
263
264 # CFLAGS
265
266 pa_c_args = ['-DHAVE_CONFIG_H', '-D_GNU_SOURCE']
267 server_c_args = ['-D__INCLUDED_FROM_PULSE_AUDIO']
268 cdata.set('MESON_BUILD', 1)
269
270 # Code coverage
271
272 if get_option('gcov')
273   add_project_arguments('--coverage', language: ['c', 'cpp'])
274   add_project_link_arguments('--coverage', language: ['c', 'cpp'])
275 endif
276
277 # Core Dependencies
278
279 libm_dep = cc.find_library('m', required : true)
280 thread_dep = dependency('threads')
281 cap_dep = cc.find_library('cap', required : false)
282
283 shm_dep = cc.find_library('rt', required : false)
284 if shm_dep.found()
285   cdata.set('HAVE_SHM_OPEN', 1)
286 endif
287
288 atomictest = '''void func() {
289   volatile int atomic = 2;
290   __sync_bool_compare_and_swap (&atomic, 2, 3);
291 }
292 '''
293 if cc.compiles(atomictest)
294   cdata.set('HAVE_ATOMIC_BUILTINS', true)
295 else
296   # FIXME: check if we need libatomic_ops
297 endif
298
299 # FIXME: make sure it's >= 2.2
300 ltdl_dep = cc.find_library('ltdl', required : true)
301 # FIXME: can meson support libtool -dlopen/-dlpreopen things?
302 #        and do we still want to support this at all?
303 cdata.set('DISABLE_LIBTOOL_PRELOAD', 1)
304
305 if get_option('database') == 'tdb'
306   database_dep = dependency('tdb')
307 elif get_option('database') == 'gdbm'
308   database_dep = cc.find_library('gdbm', required : true)
309 else
310   database_dep = dependency('', required: false)
311 endif
312
313 if get_option('ipv6')
314   cdata.set('HAVE_IPV6', 1)
315 endif
316
317 if get_option('legacy-database-entry-format')
318   cdata.set('ENABLE_LEGACY_DATABASE_ENTRY_FORMAT', 1)
319 endif
320
321 alsa_dep = dependency('alsa', version : '>= 1.0.24', required : get_option('alsa'))
322 if alsa_dep.found()
323   cdata.set('HAVE_ALSA', 1)
324   cdata.set('HAVE_ALSA_UCM', 1)
325 endif
326
327 asyncns_dep = dependency('libasyncns', version : '>= 0.1', required : get_option('asyncns'))
328 if asyncns_dep.found()
329   cdata.set('HAVE_LIBASYNCNS', 1)
330 endif
331
332 dbus_dep = dependency('dbus-1', version : '>= 1.4.12', required : get_option('dbus'))
333 if dbus_dep.found()
334   cdata.set('HAVE_DBUS', 1)
335 endif
336
337 gio_dep = dependency('gio-2.0', version : '>= 2.26.0', required : get_option('gsettings'))
338 if gio_dep.found()
339   cdata.set('HAVE_GSETTINGS', 1)
340 endif
341
342 glib_dep = dependency('glib-2.0', version : '>= 2.4.0', required: get_option('glib'))
343 if glib_dep.found()
344   cdata.set('HAVE_GLIB', 1)
345 endif
346
347 gtk_dep = dependency('gtk+-3.0', required : get_option('gtk'))
348 if gtk_dep.found()
349   cdata.set('HAVE_GTK', 1)
350 endif
351
352 have_orcc = false
353 orcc_args = []
354 orc_dep = dependency('orc-0.4', version : '>= 0.4.11', required : get_option('orc'))
355 orcc = find_program('orcc', required : get_option('orc'))
356 if orc_dep.found() and orcc.found()
357   have_orcc = true
358   orcc_args = [orcc]
359   #orcc_args = [orcc, '--include', 'glib.h']
360   cdata.set('HAVE_ORC', 1)
361 else
362   cdata.set('DISABLE_ORC', 1)
363 endif
364
365 samplerate_dep = dependency('samplerate', version : '>= 0.1.0', required : get_option('samplerate'))
366 if samplerate_dep.found()
367   cdata.set('HAVE_LIBSAMPLERATE', 1)
368 endif
369
370 sndfile_dep = dependency('sndfile', version : '>= 1.0.20')
371
372 soxr_dep = dependency('soxr', version : '>= 0.1.1', required : get_option('soxr'))
373 if soxr_dep.found()
374   cdata.set('HAVE_SOXR', 1)
375 endif
376
377 libsystemd_dep = dependency('libsystemd', required : get_option('systemd'))
378 if libsystemd_dep.found()
379   cdata.set('HAVE_SYSTEMD_DAEMON', 1)
380   cdata.set('HAVE_SYSTEMD_LOGIN', 1)
381   cdata.set('HAVE_SYSTEMD_JOURNAL', 1)
382   systemd_dep = dependency('systemd', required : get_option('systemd'))
383   if systemd_dep.found() and systemduserunitdir == ''
384     systemduserunitdir = systemd_dep.get_pkgconfig_variable('systemduserunitdir')
385   endif
386 endif
387
388 x11_dep = dependency('x11-xcb', required : get_option('x11'))
389 if x11_dep.found()
390   xcb_dep  = dependency('xcb',  required : true, version : '>= 1.6')
391   ice_dep  = dependency('ice',  required : true)
392   sm_dep   = dependency('sm',   required : true)
393   xtst_dep = dependency('xtst', required : true)
394   cdata.set('HAVE_X11', 1)
395 endif
396
397 # Module dependencies
398
399 if cc.has_header('sys/soundcard.h')
400   cdata.set('HAVE_OSS_OUTPUT', 1)
401   cdata.set('HAVE_OSS_WRAPPER', 1)
402   cdata.set_quoted('PULSEDSP_LOCATION', pulsedspdir)
403 endif
404
405 if get_option('hal-compat')
406   cdata.set('HAVE_HAL_COMPAT', 1)
407 endif
408
409 avahi_dep = dependency('avahi-client', version : '>= 0.6.0', required : get_option('avahi'), disabler : true)
410 if avahi_dep.found()
411   cdata.set('HAVE_AVAHI', 1)
412 endif
413
414 bluez_dep = dependency('bluez', version : '>= 5.0', required : get_option('bluez5'))
415 sbc_dep = dependency('sbc', version : '>= 1.0', required : false)
416 if bluez_dep.found()
417   assert(dbus_dep.found(), 'BlueZ requires D-Bus support')
418   assert(sbc_dep.found(), 'BlueZ requires SBC support')
419   cdata.set('HAVE_SBC', 1)
420   cdata.set('HAVE_BLUEZ', 1)
421   cdata.set('HAVE_BLUEZ_5', 1)
422   if get_option('bluez5-native-headset')
423     cdata.set('HAVE_BLUEZ_5_NATIVE_HEADSET', 1)
424   endif
425   if get_option('bluez5-ofono-headset')
426     cdata.set('HAVE_BLUEZ_5_OFONO_HEADSET', 1)
427   endif
428 endif
429
430 fftw_dep = dependency('fftw3f', required : get_option('fftw'))
431 if fftw_dep.found()
432   cdata.set('HAVE_FFTW', 1)
433 endif
434
435 jack_dep = dependency('jack', version : '>= 0.117.0', required : get_option('jack'))
436 if jack_dep.found()
437   cdata.set('HAVE_JACK', 1)
438 endif
439
440 lirc_dep = dependency('lirc', required : get_option('lirc'))
441 if lirc_dep.found()
442   cdata.set('HAVE_LIRC', 1)
443 endif
444
445 openssl_dep = dependency('openssl', version : '>= 0.9', required : get_option('openssl'))
446 if openssl_dep.found()
447   cdata.set('HAVE_OPENSSL', 1)
448 endif
449
450 speex_dep = dependency('speexdsp', version : '>= 1.2', required : get_option('speex'))
451 if speex_dep.found()
452   cdata.set('HAVE_SPEEX', 1)
453 endif
454
455 udev_dep = dependency('libudev', version : '>= 143', required : get_option('udev'))
456 if udev_dep.found()
457   cdata.set('HAVE_UDEV', 1)
458 endif
459
460 webrtc_dep = dependency('webrtc-audio-processing', version : '>= 0.2', required : get_option('webrtc-aec'))
461 if webrtc_dep.found()
462   cdata.set('HAVE_WEBRTC', 1)
463 endif
464
465 # These are required for the CMake file generation
466 cdata.set('PA_LIBDIR', libdir)
467 cdata.set('PA_INCDIR', includedir)
468 if glib_dep.found()
469   cdata.set('HAVE_GLIB20', 1) # to match the AM_CONDITIONAL for CMake file generation
470 endif
471
472 # Test dependencies
473
474 check_dep = dependency('check', version : '>= 0.9.10', required : get_option('tests'))
475
476 # Now generate config.h from everything above
477 configure_file(output : 'config.h', configuration : cdata)
478
479 # pkg-config files
480
481 pc_cdata = configuration_data()
482
483 pc_cdata.set('prefix', prefix)
484 pc_cdata.set('exec_prefix', prefix)
485 pc_cdata.set('libdir', libdir)
486 pc_cdata.set('includedir', includedir)
487 pc_cdata.set('modlibexecdir', modlibexecdir)
488 pc_cdata.set('PACKAGE_VERSION', pa_version_str)
489 pc_cdata.set('PA_MAJORMINOR', pa_version_major_minor)
490 # FIXME: the line below is wrong. Currently the meson thread dep lacks documentation,
491 # and doesn't allow introspection, ie. none of get_pkgconfig_variable() or
492 # get_configtool_variable() work with it, so we have no way to get this flag right,
493 # unless we do all the work ourselves. See current work in glib, also meson #553.
494 pc_cdata.set('PTHREAD_LIBS', '-pthread')
495
496 pc_files = [
497   'libpulse.pc',
498   'libpulse-simple.pc',
499 ]
500
501 if glib_dep.found()
502   pc_files += 'libpulse-mainloop-glib.pc'
503 endif
504
505 foreach file : pc_files
506   configure_file(
507     input : file + '.in',
508     output : file,
509     configuration : pc_cdata,
510     install_dir : pkgconfigdir)
511 endforeach
512
513 # CMake files
514
515 m4 = find_program('m4', required: true)
516
517 cmakedir = join_paths(libdir, 'cmake', 'PulseAudio')
518
519 cmake_template_file = configure_file(
520   input : 'PulseAudioConfig.cmake.in',
521   output : 'PulseAudioConfig.cmake.tmp',
522   configuration: cdata,
523 )
524
525 custom_target('PulseAudioConfig.cmake',
526   input : cmake_template_file,
527   output : 'PulseAudioConfig.cmake',
528   capture : true,
529   command : [m4, '@INPUT@'],
530   build_by_default : true,
531   install : true,
532   install_dir : cmakedir,
533 )
534
535 configure_file(
536   input : 'PulseAudioConfigVersion.cmake.in',
537   output : 'PulseAudioConfigVersion.cmake',
538   configuration: cdata,
539   install : true,
540   install_dir : cmakedir,
541 )
542
543 # Subdirs
544
545 subdir('po')
546 if get_option('man')
547   subdir('man')
548 endif
549 subdir('shell-completion/bash')
550 subdir('shell-completion/zsh')
551 subdir('src')
552 subdir('vala')
553
554 ############################################################
555
556 # Final summary
557
558 summary = [
559   '',
560   '---{ @0@ @1@ }---'.format(meson.project_name(), meson.project_version()),
561   '',
562   'prefix:                        @0@'.format(prefix),
563   'bindir:                        @0@'.format(bindir),
564   'libdir:                        @0@'.format(libdir),
565   'libexecdir:                    @0@'.format(libexecdir),
566   'mandir:                        @0@'.format(mandir),
567   'datadir:                       @0@'.format(datadir),
568   'sysconfdir:                    @0@'.format(sysconfdir),
569   'localstatedir:                 @0@'.format(localstatedir),
570   'modlibexecdir:                 @0@'.format(modlibexecdir),
571   'System Runtime Path:           @0@'.format(cdata.get_unquoted('PA_SYSTEM_RUNTIME_PATH')),
572   'System State Path:             @0@'.format(cdata.get_unquoted('PA_SYSTEM_STATE_PATH')),
573   'System Config Path:            @0@'.format(cdata.get_unquoted('PA_SYSTEM_CONFIG_PATH')),
574   'Bash completions directory:    @0@'.format(bashcompletiondir),
575   'Zsh completions directory:     @0@'.format(zshcompletiondir),
576   'Compiler:                      @0@ @1@'.format(cc.get_id(), cc.version()),
577 #  'CFLAGS:                        @0@'.format(${CFLAGS}),
578 #  'CPPFLAGS:                      @0@'.format(${CPPFLAGS}),
579 #  'LIBS:                          @0@'.format(${LIBS}),
580   '',
581   'Enable memfd shared memory:    @0@'.format(cdata.has('HAVE_MEMFD')),
582   'Enable X11:                    @0@'.format(x11_dep.found()),
583 #  'Enable OSS Output:             @0@'.format(${ENABLE_OSS_OUTPUT}),
584 #  'Enable OSS Wrapper:            @0@'.format(${ENABLE_OSS_WRAPPER}),
585 #  'Enable EsounD:                 @0@'.format(${ENABLE_ESOUND}),
586   'Enable Alsa:                   @0@'.format(alsa_dep.found()),
587 #  'Enable CoreAudio:              @0@'.format(${ENABLE_COREAUDIO}),
588 #  'Enable Solaris:                @0@'.format(${ENABLE_SOLARIS}),
589 #  'Enable WaveOut:                @0@'.format(${ENABLE_WAVEOUT}),
590   'Enable GLib 2:                 @0@'.format(glib_dep.found()),
591 #  'Enable GConf:                  @0@'.format(${ENABLE_GCONF}),
592   'Enable GSettings:              @0@'.format(gio_dep.found()),
593   'Enable Gtk+ 3:                 @0@'.format(gtk_dep.found()),
594   'Enable Avahi:                  @0@'.format(avahi_dep.found()),
595   'Enable Jack:                   @0@'.format(jack_dep.found()),
596   'Enable Async DNS:              @0@'.format(asyncns_dep.found()),
597   'Enable LIRC:                   @0@'.format(lirc_dep.found()),
598   'Enable D-Bus:                  @0@'.format(dbus_dep.found()),
599   '  Enable BlueZ 5:              @0@'.format(bluez_dep.found()),
600   '    Enable native headsets:    @0@'.format(get_option('bluez5-native-headset')),
601   '    Enable  ofono headsets:    @0@'.format(get_option('bluez5-ofono-headset')),
602   'Enable udev:                   @0@'.format(udev_dep.found()),
603   '  Enable HAL->udev compat:     @0@'.format(get_option('hal-compat')),
604   'Enable systemd:                @0@'.format(libsystemd_dep.found()),
605 #  'Enable TCP Wrappers:           @0@'.format(${ENABLE_TCPWRAP}),
606   'Enable libsamplerate:          @0@'.format(samplerate_dep.found()),
607   'Enable IPv6:                   @0@'.format(get_option('ipv6')),
608   'Enable OpenSSL (for Airtunes): @0@'.format(openssl_dep.found()),
609   'Enable FFTW:                   @0@'.format(fftw_dep.found()),
610   'Enable ORC:                    @0@'.format(have_orcc),
611   'Enable Adrian echo canceller:  @0@'.format(get_option('adrian-aec')),
612   'Enable Speex (resampler, AEC): @0@'.format(speex_dep.found()),
613   'Enable SoXR (resampler):       @0@'.format(soxr_dep.found()),
614   'Enable WebRTC echo canceller:  @0@'.format(webrtc_dep.found()),
615   'Enable Gcov coverage:          @0@'.format(get_option('gcov')),
616   'Enable man pages:              @0@'.format(get_option('man')),
617   'Enable unit tests:             @0@'.format(get_option('tests')),
618   '',
619   'Database:                      @0@'.format(get_option('database')),
620   'Legacy Database Entry Support: @0@'.format(get_option('legacy-database-entry-format')),
621   'System User:                   @0@'.format(cdata.get_unquoted('PA_SYSTEM_USER')),
622   'System Group:                  @0@'.format(cdata.get_unquoted('PA_SYSTEM_GROUP')),
623   'Access Group:                  @0@'.format(cdata.get_unquoted('PA_ACCESS_GROUP')),
624 #  'Enable per-user EsounD socket: @0@'.format(${ENABLE_PER_USER_ESOUND_SOCKET}),
625 #  'Force preopen:                 @0@'.format(${FORCE_PREOPEN}),
626 #  'Preopened modules:             @0@'.format(${PREOPEN_MODS}),
627 ]
628
629 message('\n    '.join(summary))
630
631 # Sanity checks
632
633 if not speex_dep.found() and not webrtc_dep.found() and not get_option('adrian-aec')
634   error('At least one echo canceller implementation must be available!')
635 endif
636
637 if samplerate_dep.found()
638   warning('Support for libsamplerate is DEPRECATED')
639 endif
640
641 if host_machine.system() != 'windows'
642   if not dbus_dep.found()
643     message = [
644       'You do not have D-Bus support enabled. It is strongly recommended',
645       'that you enable D-Bus support if your platform supports it.',
646       'Many parts of PulseAudio use D-Bus, from ConsoleKit interaction',
647       'to the Device Reservation Protocol to speak to JACK, Bluetooth',
648       'support and even a native control protocol for communicating and',
649       'controlling the PulseAudio daemon itself.',
650     ]
651     warning('\n' + '\n'.join(message))
652   endif
653   if not udev_dep.found()
654     message = [
655       'You do not have udev support enabled. It is strongly recommended',
656       'that you enable udev support if your platform supports it as it is',
657       'the primary method used to detect hardware audio devices (on Linux)',
658       'and is thus a critical part of PulseAudio on that platform.',
659     ]
660     warning('\n' + '\n'.join(message))
661   endif
662   if not speex_dep.found()
663     message = [
664       'You do not have speex support enabled. It is strongly recommended',
665       'that you enable speex support if your platform supports it as it is',
666       'the primary method used for audio resampling and is thus a critical',
667       'part of PulseAudio on that platform.',
668     ]
669     warning('\n' + '\n'.join(message))
670   endif
671 endif