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