stream-restore: Forget pre-14.0 stream routing
[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 x=z
26 libpulse_version_info = [21, 2, 21]
27
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]
31
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]
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 if cc.has_type('_Bool')
171   cdata.set('HAVE_STD_BOOL', 1)
172 endif
173
174 if host_machine.cpu_family() == 'x86_64' or cc.sizeof('void *') >= 8
175   cdata.set('HAVE_FAST_64BIT_OPERATIONS', 1)
176 endif
177
178 # Headers
179
180 check_headers = [
181   'arpa/inet.h',
182   'byteswap.h',
183   'cpuid.h',
184   'dlfcn.h',
185   'execinfo.h',
186   'grp.h',
187   'langinfo.h',
188   'linux/sockios.h',
189   'locale.h',
190   'netdb.h',
191   'netinet/in.h',
192   'netinet/in_systm.h',
193   'netinet/ip.h',
194   'netinet/tcp.h',
195   'pcreposix.h',
196   'poll.h',
197   'pwd.h',
198   'regex.h',
199   'sched.h',
200   'stdint.h',
201   'sys/atomic.h',
202   'sys/capability.h',
203   'sys/conf.h',
204   'sys/dl.h',
205   'sys/eventfd.h',
206   'sys/filio.h',
207   'sys/ioctl.h',
208   'sys/mman.h',
209   'sys/prctl.h',
210   'sys/resource.h',
211   'sys/select.h',
212   'sys/socket.h',
213   'sys/syscall.h',
214   'sys/uio.h',
215   'sys/un.h',
216   'sys/wait.h',
217   'syslog.h',
218   'valgrind/memcheck.h',
219   'xlocale.h',
220 ]
221
222 foreach h : check_headers
223   if cc.has_header(h)
224     define = 'HAVE_' + h.underscorify().to_upper()
225     cdata.set(define, 1)
226   endif
227 endforeach
228
229 # FIXME: move this to the above set
230 if cc.has_header('pthread.h')
231   cdata.set('HAVE_PTHREAD', 1)
232 endif
233
234 if cc.has_header_symbol('pthread.h', 'PTHREAD_PRIO_INHERIT')
235   cdata.set('HAVE_PTHREAD_PRIO_INHERIT', 1)
236 endif
237
238 # Functions
239
240 check_functions = [
241   'accept4',
242   'clock_gettime',
243   'ctime_r',
244   'fchmod',
245   'fchown',
246   'fork',
247   'fstat',
248   'getaddrinfo',
249   'getgrgid_r',
250   'getgrnam_r',
251   'getpwnam_r',
252   'getpwuid_r',
253   'gettimeofday',
254   'getuid',
255   'lrintf',
256   'lstat',
257   'memfd_create',
258   'mkfifo',
259   'mlock',
260   'nanosleep',
261   'open64',
262   'paccept',
263   'pipe',
264   'pipe2',
265   'posix_fadvise',
266   'posix_madvise',
267   'posix_memalign',
268   'ppoll',
269   'readlink',
270   'setegid',
271   'seteuid',
272   'setpgid',
273   'setregid',
274   'setresgid',
275   'setresuid',
276   'setreuid',
277   'setsid',
278   'sig2str',
279   'sigaction',
280   'strerror_r',
281   'strtod_l',
282   'strtof',
283   'symlink',
284   'sysconf',
285   'uname',
286 ]
287
288 foreach f : check_functions
289   if cc.has_function(f)
290     define = 'HAVE_' + f.underscorify().to_upper()
291     cdata.set(define, 1)
292   endif
293 endforeach
294
295 if cc.has_function('SYS_memfd_create', prefix : '#include <sys/syscall.h>')
296   cdata.set('HAVE_MEMFD', 1)
297 endif
298
299 if cc.has_function('dgettext')
300   libintl_dep = []
301 else
302   libintl_dep = cc.find_library('intl')
303 endif
304
305 # Symbols
306
307 if cc.has_header_symbol('signal.h', 'SIGXCPU')
308   cdata.set('HAVE_SIGXCPU', 1)
309 endif
310
311 if not cc.has_header_symbol('netinet/in.h', 'INADDR_NONE')
312   if not cc.has_header_symbol('winsock2.h', 'INADDR_NONE')
313     # Define INADDR_NONE if not found (Solaris)
314     cdata.set('INADDR_NONE', '0xffffffff')
315   endif
316 endif
317
318 check_decls = [
319   [ 'environ', 'unistd.h', '#define _GNU_SOURCE' ],
320   [ 'SOUND_PCM_READ_RATE', 'sys/soundcard.h', '' ],
321   [ 'SOUND_PCM_READ_CHANNELS', 'sys/soundcard.h', '' ],
322   [ 'SOUND_PCM_READ_BITS', 'sys/soundcard.h', '' ],
323 ]
324
325 foreach s : check_decls
326   if cc.has_header_symbol(s[1], s[0], prefix : s[2])
327     define = 'HAVE_DECL_' + s[0].to_upper()
328     cdata.set(define, 1)
329   endif
330 endforeach
331
332 # Types
333
334 # FIXME: do we ever care about gid_t not being defined / smaller than an int?
335 cdata.set('GETGROUPS_T', 'gid_t')
336
337 # Include paths
338
339 configinc = include_directories('.')
340 topinc = include_directories('src')
341
342 # CFLAGS/LDFLAGS
343
344 pa_c_args = ['-DHAVE_CONFIG_H', '-D_GNU_SOURCE']
345 server_c_args = ['-D__INCLUDED_FROM_PULSE_AUDIO']
346 cdata.set('MESON_BUILD', 1)
347
348 # On ELF systems we don't want the libraries to be unloaded since we don't clean them up properly,
349 # so we request the nodelete flag to be enabled.
350 # On other systems, we don't really know how to do that, but it's welcome if somebody can tell.
351 nodelete_link_args = ['-Wl,-z,nodelete']
352
353 # Code coverage
354
355 if get_option('gcov')
356   add_project_arguments('--coverage', language: ['c', 'cpp'])
357   add_project_link_arguments('--coverage', language: ['c', 'cpp'])
358 endif
359
360 # Core Dependencies
361
362 libm_dep = cc.find_library('m', required : true)
363
364 thread_dep = dependency('threads')
365 foreach f : [
366   'pthread_getname_np',
367   'pthread_setaffinity_np',
368   'pthread_setname_np',
369 ]
370   if cc.has_function(f, dependencies : thread_dep)
371     define = 'HAVE_' + f.underscorify().to_upper()
372     cdata.set(define, 1)
373   endif
374 endforeach
375
376 cap_dep = cc.find_library('cap', required : false)
377
378 shm_dep = cc.find_library('rt', required : false)
379 if shm_dep.found()
380   cdata.set('HAVE_SHM_OPEN', 1)
381 endif
382
383 dl_dep = cc.find_library('dl', required : false)
384 if dl_dep.found()
385   cdata.set('HAVE_DLADDR', 1)
386 endif
387
388 have_iconv = false
389 if cc.has_function('iconv_open')
390   iconv_dep = dependency('', required : false)
391   have_iconv = true
392 else
393   iconv_dep = cc.find_library('iconv', required : false)
394   have_iconv = iconv_dep.found()
395 endif
396 if have_iconv
397   cdata.set('HAVE_ICONV', 1)
398   iconvconsttest = '''#include <iconv.h>
399 size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);
400 '''
401   if cc.compiles(iconvconsttest, dependencies : iconv_dep)
402     cdata.set('ICONV_CONST', '')
403   else
404     cdata.set('ICONV_CONST', 'const')
405   endif
406 endif
407
408 # Atomic operations
409
410 if get_option('atomic-arm-memory-barrier')
411     cdata.set('ATOMIC_ARM_MEMORY_BARRIER_ENABLED', 1)
412 endif
413
414 need_libatomic_ops = false
415
416 atomictest = '''void func() {
417   volatile int atomic = 2;
418   __sync_bool_compare_and_swap (&atomic, 2, 3);
419 }
420 '''
421
422 if cc.compiles(atomictest)
423   cdata.set('HAVE_ATOMIC_BUILTINS', 1)
424
425   newatomictest = '''void func() {
426     int c = 0;
427     __atomic_store_n(&c, 4, __ATOMIC_SEQ_CST);
428   }
429   '''
430
431   if(cc.compiles(newatomictest))
432     cdata.set('HAVE_ATOMIC_BUILTINS_MEMORY_MODEL', 1)
433   endif
434
435 elif host_machine.cpu_family() == 'arm'
436   if host_machine.system() == 'linux' and get_option('atomic-arm-linux-helpers')
437     cdata.set('ATOMIC_ARM_LINUX_HELPERS', 1)
438   else
439     armatomictest = '''int func() {
440       volatile int a=0;
441       int o=0, n=1, r;
442       asm volatile (
443               "ldrex    %0, [%1]\n"
444               "subs  %0, %0, %2\n"
445               "strexeq %0, %3, [%1]\n"
446               : "=&r" (r)
447               : "r" (&a), "Ir" (o), "r" (n)
448       : "cc");
449       return (a==1 ? 0 : -1);
450     }
451     '''
452
453     if cc.compiles(armatomictest)
454       cdata.set('ATOMIC_ARM_INLINE_ASM', 1)
455     else
456       need_libatomic_ops = true
457     endif
458   endif # arm && !linux
459
460 elif not ['freebsd', 'netbsd'].contains(host_machine.system())
461   need_libatomic_ops = true
462 endif # !atomic helpers && !arm
463
464 if need_libatomic_ops
465   assert(cc.has_header('atomic_ops.h'), 'Need libatomic_ops')
466
467   cdata.set('AO_REQUIRE_CAS', 1)
468
469   if host_machine.system() != 'windows'
470     libatomic_ops_dep = cc.find_library('atomic_ops', required : true)
471   else
472     libatomic_ops_dep = dependency('', required: false)
473   endif
474 else
475   libatomic_ops_dep = dependency('', required: false)
476 endif
477
478 # ARM checks
479 # ARMV6 instructions we need
480 if host_machine.cpu_family() == 'arm'
481   armv6test = '''int func() {
482     volatile int a = -60000, b = 0xaaaabbbb, c = 0xccccdddd;
483     asm volatile ("ldr r0, %2 \n"
484                   "ldr r2, %3 \n"
485                   "ldr r3, %4 \n"
486                   "ssat r1, #8, r0 \n"
487                   "str r1, %0 \n"
488                   "pkhbt r1, r3, r2, LSL #8 \n"
489                   "str r1, %1 \n"
490                   : "=m" (a), "=m" (b)
491                   : "m" (a), "m" (b), "m" (c)
492                   : "r0", "r1", "r2", "r3", "cc");
493     return (a == -128 && b == 0xaabbdddd) ? 0 : -1;
494   }
495   '''
496
497   if cc.compiles(armv6test)
498     cdata.set('HAVE_ARMV6', 1)
499   endif
500 endif
501 # NEON checks are automatically done by the unstable-simd module
502
503 # FIXME: make sure it's >= 2.2
504 ltdl_dep = cc.find_library('ltdl', required : true)
505 # FIXME: can meson support libtool -dlopen/-dlpreopen things?
506 #        and do we still want to support this at all?
507 cdata.set('DISABLE_LIBTOOL_PRELOAD', 1)
508
509 if get_option('database') == 'tdb'
510   database_dep = dependency('tdb')
511 elif get_option('database') == 'gdbm'
512   database_dep = cc.find_library('gdbm', required : true)
513 else
514   database_dep = dependency('', required: false)
515 endif
516
517 if get_option('ipv6')
518   cdata.set('HAVE_IPV6', 1)
519 endif
520
521 if get_option('legacy-database-entry-format')
522   cdata.set('ENABLE_LEGACY_DATABASE_ENTRY_FORMAT', 1)
523 endif
524
525 if get_option('stream-restore-clear-old-devices')
526   cdata.set('STREAM_RESTORE_CLEAR_OLD_DEVICES', 1)
527 endif
528
529 if get_option('running-from-build-tree')
530   cdata.set('HAVE_RUNNING_FROM_BUILD_TREE', 1)
531 endif
532
533 alsa_dep = dependency('alsa', version : '>= 1.0.24', required : get_option('alsa'))
534 if alsa_dep.found()
535   cdata.set('HAVE_ALSA', 1)
536   cdata.set('HAVE_ALSA_UCM', 1)
537 endif
538
539 asyncns_dep = dependency('libasyncns', version : '>= 0.1', required : get_option('asyncns'))
540 if asyncns_dep.found()
541   cdata.set('HAVE_LIBASYNCNS', 1)
542 endif
543
544 dbus_dep = dependency('dbus-1', version : '>= 1.4.12', required : get_option('dbus'))
545 if dbus_dep.found()
546   cdata.set('HAVE_DBUS', 1)
547 endif
548
549 gio_dep = dependency('gio-2.0', version : '>= 2.26.0', required : get_option('gsettings'))
550 if gio_dep.found()
551   cdata.set('HAVE_GSETTINGS', 1)
552 endif
553
554 glib_dep = dependency('glib-2.0', version : '>= 2.4.0', required: get_option('glib'))
555 if glib_dep.found()
556   cdata.set('HAVE_GLIB', 1)
557 endif
558
559 gtk_dep = dependency('gtk+-3.0', required : get_option('gtk'))
560 if gtk_dep.found()
561   cdata.set('HAVE_GTK', 1)
562 endif
563
564 have_orcc = false
565 orcc_args = []
566 orc_dep = dependency('orc-0.4', version : '>= 0.4.11', required : get_option('orc'))
567 orcc = find_program('orcc', required : get_option('orc'))
568 if orc_dep.found() and orcc.found()
569   have_orcc = true
570   orcc_args = [orcc]
571   #orcc_args = [orcc, '--include', 'glib.h']
572   cdata.set('HAVE_ORC', 1)
573 else
574   cdata.set('DISABLE_ORC', 1)
575 endif
576
577 samplerate_dep = dependency('samplerate', version : '>= 0.1.0', required : get_option('samplerate'))
578 if samplerate_dep.found()
579   cdata.set('HAVE_LIBSAMPLERATE', 1)
580 endif
581
582 sndfile_dep = dependency('sndfile', version : '>= 1.0.20')
583
584 soxr_dep = dependency('soxr', version : '>= 0.1.1', required : get_option('soxr'))
585 if soxr_dep.found()
586   cdata.set('HAVE_SOXR', 1)
587 endif
588
589 libsystemd_dep = dependency('libsystemd', required : get_option('systemd'))
590 if libsystemd_dep.found()
591   cdata.set('HAVE_SYSTEMD_DAEMON', 1)
592   cdata.set('HAVE_SYSTEMD_LOGIN', 1)
593   cdata.set('HAVE_SYSTEMD_JOURNAL', 1)
594 endif
595 systemd_dep = dependency('systemd', required : get_option('systemd'))
596 if systemd_dep.found() and systemduserunitdir == ''
597   systemduserunitdir = systemd_dep.get_pkgconfig_variable('systemduserunitdir')
598 endif
599
600 x11_dep = dependency('x11-xcb', required : get_option('x11'))
601 if x11_dep.found()
602   xcb_dep  = dependency('xcb',  required : true, version : '>= 1.6')
603   ice_dep  = dependency('ice',  required : true)
604   sm_dep   = dependency('sm',   required : true)
605   xtst_dep = dependency('xtst', required : true)
606   cdata.set('HAVE_X11', 1)
607 endif
608
609 # Module dependencies
610
611 if cc.has_header('sys/soundcard.h')
612   cdata.set('HAVE_OSS_OUTPUT', 1)
613   cdata.set('HAVE_OSS_WRAPPER', 1)
614   cdata.set('PULSEDSP_LOCATION', pulsedsp_location)
615 endif
616
617 if get_option('hal-compat')
618   cdata.set('HAVE_HAL_COMPAT', 1)
619 endif
620
621 avahi_dep = dependency('avahi-client', version : '>= 0.6.0', required : get_option('avahi'), disabler : true)
622 if avahi_dep.found()
623   cdata.set('HAVE_AVAHI', 1)
624 endif
625
626 sbc_dep = dependency('sbc', version : '>= 1.0', required : false)
627 if get_option('bluez5')
628   assert(dbus_dep.found(), 'BlueZ requires D-Bus support')
629   assert(sbc_dep.found(), 'BlueZ requires SBC support')
630   cdata.set('HAVE_SBC', 1)
631   cdata.set('HAVE_BLUEZ', 1)
632   cdata.set('HAVE_BLUEZ_5', 1)
633   if get_option('bluez5-native-headset')
634     cdata.set('HAVE_BLUEZ_5_NATIVE_HEADSET', 1)
635   endif
636   if get_option('bluez5-ofono-headset')
637     cdata.set('HAVE_BLUEZ_5_OFONO_HEADSET', 1)
638   endif
639 endif
640
641 fftw_dep = dependency('fftw3f', required : get_option('fftw'))
642 if fftw_dep.found()
643   cdata.set('HAVE_FFTW', 1)
644 endif
645
646 jack_dep = dependency('jack', version : '>= 0.117.0', required : get_option('jack'))
647 if jack_dep.found()
648   cdata.set('HAVE_JACK', 1)
649 endif
650
651 lirc_dep = dependency('lirc', required : get_option('lirc'))
652 if lirc_dep.found()
653   cdata.set('HAVE_LIRC', 1)
654 endif
655
656 openssl_dep = dependency('openssl', version : '>= 0.9', required : get_option('openssl'))
657 if openssl_dep.found()
658   cdata.set('HAVE_OPENSSL', 1)
659 endif
660
661 speex_dep = dependency('speexdsp', version : '>= 1.2', required : get_option('speex'))
662 if speex_dep.found()
663   cdata.set('HAVE_SPEEX', 1)
664 endif
665
666 udev_dep = dependency('libudev', version : '>= 143', required : get_option('udev'))
667 if udev_dep.found()
668   cdata.set('HAVE_UDEV', 1)
669 endif
670
671 webrtc_dep = dependency('webrtc-audio-processing', version : '>= 0.2', required : get_option('webrtc-aec'))
672 if webrtc_dep.found()
673   cdata.set('HAVE_WEBRTC', 1)
674 endif
675
676 gst_dep = dependency('gstreamer-1.0', required : get_option('gstreamer'))
677 gstapp_dep = dependency('gstreamer-app-1.0', required : get_option('gstreamer'))
678 gstrtp_dep = dependency('gstreamer-rtp-1.0', required : get_option('gstreamer'))
679
680 have_gstreamer = false
681 if gst_dep.found() and gstapp_dep.found() and gstrtp_dep.found()
682   have_gstreamer = true
683 endif
684
685 # These are required for the CMake file generation
686 cdata.set('PA_LIBDIR', libdir)
687 cdata.set('PA_INCDIR', includedir)
688 if glib_dep.found()
689   cdata.set('HAVE_GLIB20', 1) # to match the AM_CONDITIONAL for CMake file generation
690 endif
691
692 # Test dependencies
693
694 check_dep = dependency('check', version : '>= 0.9.10', required : get_option('tests'))
695
696 # Subdirs
697
698 subdir('po')
699 if get_option('man')
700   subdir('man')
701 endif
702 subdir('shell-completion/bash')
703 subdir('shell-completion/zsh')
704 subdir('src')
705 subdir('vala')
706
707 # Now generate config.h from everything above
708 configure_file(output : 'config.h', configuration : cdata)
709
710 # pkg-config files
711
712 pc_cdata = configuration_data()
713
714 pc_cdata.set('prefix', prefix)
715 pc_cdata.set('exec_prefix', prefix)
716 pc_cdata.set('libdir', libdir)
717 pc_cdata.set('includedir', includedir)
718 pc_cdata.set('modlibexecdir', modlibexecdir)
719 pc_cdata.set('PACKAGE_VERSION', pa_version_str)
720 pc_cdata.set('PA_MAJORMINOR', pa_version_major_minor)
721 # FIXME: the line below is wrong. Currently the meson thread dep lacks documentation,
722 # and doesn't allow introspection, ie. none of get_pkgconfig_variable() or
723 # get_configtool_variable() work with it, so we have no way to get this flag right,
724 # unless we do all the work ourselves. See current work in glib, also meson #553.
725 pc_cdata.set('PTHREAD_LIBS', '-pthread')
726
727 pc_files = [
728   'libpulse.pc',
729   'libpulse-simple.pc',
730 ]
731
732 if glib_dep.found()
733   pc_files += 'libpulse-mainloop-glib.pc'
734 endif
735
736 foreach file : pc_files
737   configure_file(
738     input : file + '.in',
739     output : file,
740     configuration : pc_cdata,
741     install_dir : pkgconfigdir)
742 endforeach
743
744 # CMake files
745
746 m4 = find_program('m4', required: true)
747
748 cmakedir = join_paths(libdir, 'cmake', 'PulseAudio')
749
750 cmake_template_file = configure_file(
751   input : 'PulseAudioConfig.cmake.in',
752   output : 'PulseAudioConfig.cmake.tmp',
753   configuration: cdata,
754 )
755
756 custom_target('PulseAudioConfig.cmake',
757   input : cmake_template_file,
758   output : 'PulseAudioConfig.cmake',
759   capture : true,
760   command : [m4, '@INPUT@'],
761   build_by_default : true,
762   install : true,
763   install_dir : cmakedir,
764 )
765
766 configure_file(
767   input : 'PulseAudioConfigVersion.cmake.in',
768   output : 'PulseAudioConfigVersion.cmake',
769   configuration: cdata,
770   install : true,
771   install_dir : cmakedir,
772 )
773
774 ############################################################
775
776 # Final summary
777
778 summary = [
779   '',
780   '---{ @0@ @1@ }---'.format(meson.project_name(), meson.project_version()),
781   '',
782   'prefix:                        @0@'.format(prefix),
783   'bindir:                        @0@'.format(bindir),
784   'libdir:                        @0@'.format(libdir),
785   'libexecdir:                    @0@'.format(libexecdir),
786   'mandir:                        @0@'.format(mandir),
787   'datadir:                       @0@'.format(datadir),
788   'sysconfdir:                    @0@'.format(sysconfdir),
789   'localstatedir:                 @0@'.format(localstatedir),
790   'modlibexecdir:                 @0@'.format(modlibexecdir),
791   'System Runtime Path:           @0@'.format(cdata.get_unquoted('PA_SYSTEM_RUNTIME_PATH')),
792   'System State Path:             @0@'.format(cdata.get_unquoted('PA_SYSTEM_STATE_PATH')),
793   'System Config Path:            @0@'.format(cdata.get_unquoted('PA_SYSTEM_CONFIG_PATH')),
794   'Bash completions directory:    @0@'.format(bashcompletiondir),
795   'Zsh completions directory:     @0@'.format(zshcompletiondir),
796   'Compiler:                      @0@ @1@'.format(cc.get_id(), cc.version()),
797 #  'CFLAGS:                        @0@'.format(${CFLAGS}),
798 #  'CPPFLAGS:                      @0@'.format(${CPPFLAGS}),
799 #  'LIBS:                          @0@'.format(${LIBS}),
800   '',
801   'Enable memfd shared memory:    @0@'.format(cdata.has('HAVE_MEMFD')),
802   'Enable X11:                    @0@'.format(x11_dep.found()),
803 #  'Enable OSS Output:             @0@'.format(${ENABLE_OSS_OUTPUT}),
804 #  'Enable OSS Wrapper:            @0@'.format(${ENABLE_OSS_WRAPPER}),
805 #  'Enable EsounD:                 @0@'.format(${ENABLE_ESOUND}),
806   'Enable Alsa:                   @0@'.format(alsa_dep.found()),
807 #  'Enable CoreAudio:              @0@'.format(${ENABLE_COREAUDIO}),
808 #  'Enable Solaris:                @0@'.format(${ENABLE_SOLARIS}),
809 #  'Enable WaveOut:                @0@'.format(${ENABLE_WAVEOUT}),
810   'Enable GLib 2:                 @0@'.format(glib_dep.found()),
811 #  'Enable GConf:                  @0@'.format(${ENABLE_GCONF}),
812   'Enable GSettings:              @0@'.format(gio_dep.found()),
813   'Enable Gtk+ 3:                 @0@'.format(gtk_dep.found()),
814   'Enable Avahi:                  @0@'.format(avahi_dep.found()),
815   'Enable Jack:                   @0@'.format(jack_dep.found()),
816   'Enable Async DNS:              @0@'.format(asyncns_dep.found()),
817   'Enable LIRC:                   @0@'.format(lirc_dep.found()),
818   'Enable D-Bus:                  @0@'.format(dbus_dep.found()),
819   '  Enable BlueZ 5:              @0@'.format(get_option('bluez5')),
820   '    Enable native headsets:    @0@'.format(get_option('bluez5-native-headset')),
821   '    Enable  ofono headsets:    @0@'.format(get_option('bluez5-ofono-headset')),
822   'Enable udev:                   @0@'.format(udev_dep.found()),
823   '  Enable HAL->udev compat:     @0@'.format(get_option('hal-compat')),
824   'Enable systemd:                @0@'.format(libsystemd_dep.found()),
825 #  'Enable TCP Wrappers:           @0@'.format(${ENABLE_TCPWRAP}),
826   'Enable libsamplerate:          @0@'.format(samplerate_dep.found()),
827   'Enable IPv6:                   @0@'.format(get_option('ipv6')),
828   'Enable OpenSSL (for Airtunes): @0@'.format(openssl_dep.found()),
829   'Enable FFTW:                   @0@'.format(fftw_dep.found()),
830   'Enable ORC:                    @0@'.format(have_orcc),
831   'Enable GStreamer:              @0@'.format(have_gstreamer),
832   'Enable Adrian echo canceller:  @0@'.format(get_option('adrian-aec')),
833   'Enable Speex (resampler, AEC): @0@'.format(speex_dep.found()),
834   'Enable SoXR (resampler):       @0@'.format(soxr_dep.found()),
835   'Enable WebRTC echo canceller:  @0@'.format(webrtc_dep.found()),
836   'Enable Gcov coverage:          @0@'.format(get_option('gcov')),
837   'Enable man pages:              @0@'.format(get_option('man')),
838   'Enable unit tests:             @0@'.format(get_option('tests')),
839   '',
840   'Database:                      @0@'.format(get_option('database')),
841   'Legacy Database Entry Support: @0@'.format(get_option('legacy-database-entry-format')),
842   'module-stream-restore:',
843   '  Clear old devices:           @0@'.format(get_option('stream-restore-clear-old-devices')),
844   'Running from build tree:       @0@'.format(get_option('running-from-build-tree')),
845   'System User:                   @0@'.format(cdata.get_unquoted('PA_SYSTEM_USER')),
846   'System Group:                  @0@'.format(cdata.get_unquoted('PA_SYSTEM_GROUP')),
847   'Access Group:                  @0@'.format(cdata.get_unquoted('PA_ACCESS_GROUP')),
848 #  'Enable per-user EsounD socket: @0@'.format(${ENABLE_PER_USER_ESOUND_SOCKET}),
849 #  'Force preopen:                 @0@'.format(${FORCE_PREOPEN}),
850 #  'Preopened modules:             @0@'.format(${PREOPEN_MODS}),
851 ]
852
853 message('\n    '.join(summary))
854
855 # Sanity checks
856
857 if not speex_dep.found() and not webrtc_dep.found() and not get_option('adrian-aec')
858   error('At least one echo canceller implementation must be available!')
859 endif
860
861 if samplerate_dep.found()
862   warning('Support for libsamplerate is DEPRECATED')
863 endif
864
865 if host_machine.system() != 'windows'
866   if not dbus_dep.found()
867     message = [
868       'You do not have D-Bus support enabled. It is strongly recommended',
869       'that you enable D-Bus support if your platform supports it.',
870       'Many parts of PulseAudio use D-Bus, from ConsoleKit interaction',
871       'to the Device Reservation Protocol to speak to JACK, Bluetooth',
872       'support and even a native control protocol for communicating and',
873       'controlling the PulseAudio daemon itself.',
874     ]
875     warning('\n' + '\n'.join(message))
876   endif
877   if not udev_dep.found()
878     message = [
879       'You do not have udev support enabled. It is strongly recommended',
880       'that you enable udev support if your platform supports it as it is',
881       'the primary method used to detect hardware audio devices (on Linux)',
882       'and is thus a critical part of PulseAudio on that platform.',
883     ]
884     warning('\n' + '\n'.join(message))
885   endif
886   if not speex_dep.found()
887     message = [
888       'You do not have speex support enabled. It is strongly recommended',
889       'that you enable speex support if your platform supports it as it is',
890       'the primary method used for audio resampling and is thus a critical',
891       'part of PulseAudio on that platform.',
892     ]
893     warning('\n' + '\n'.join(message))
894   endif
895 endif