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