meson: link libintl if it's not provided by libc
[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, 1, 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('running-from-build-tree')
526   cdata.set('HAVE_RUNNING_FROM_BUILD_TREE', 1)
527 endif
528
529 alsa_dep = dependency('alsa', version : '>= 1.0.24', required : get_option('alsa'))
530 if alsa_dep.found()
531   cdata.set('HAVE_ALSA', 1)
532   cdata.set('HAVE_ALSA_UCM', 1)
533 endif
534
535 asyncns_dep = dependency('libasyncns', version : '>= 0.1', required : get_option('asyncns'))
536 if asyncns_dep.found()
537   cdata.set('HAVE_LIBASYNCNS', 1)
538 endif
539
540 dbus_dep = dependency('dbus-1', version : '>= 1.4.12', required : get_option('dbus'))
541 if dbus_dep.found()
542   cdata.set('HAVE_DBUS', 1)
543 endif
544
545 gio_dep = dependency('gio-2.0', version : '>= 2.26.0', required : get_option('gsettings'))
546 if gio_dep.found()
547   cdata.set('HAVE_GSETTINGS', 1)
548 endif
549
550 glib_dep = dependency('glib-2.0', version : '>= 2.4.0', required: get_option('glib'))
551 if glib_dep.found()
552   cdata.set('HAVE_GLIB', 1)
553 endif
554
555 gtk_dep = dependency('gtk+-3.0', required : get_option('gtk'))
556 if gtk_dep.found()
557   cdata.set('HAVE_GTK', 1)
558 endif
559
560 have_orcc = false
561 orcc_args = []
562 orc_dep = dependency('orc-0.4', version : '>= 0.4.11', required : get_option('orc'))
563 orcc = find_program('orcc', required : get_option('orc'))
564 if orc_dep.found() and orcc.found()
565   have_orcc = true
566   orcc_args = [orcc]
567   #orcc_args = [orcc, '--include', 'glib.h']
568   cdata.set('HAVE_ORC', 1)
569 else
570   cdata.set('DISABLE_ORC', 1)
571 endif
572
573 samplerate_dep = dependency('samplerate', version : '>= 0.1.0', required : get_option('samplerate'))
574 if samplerate_dep.found()
575   cdata.set('HAVE_LIBSAMPLERATE', 1)
576 endif
577
578 sndfile_dep = dependency('sndfile', version : '>= 1.0.20')
579
580 soxr_dep = dependency('soxr', version : '>= 0.1.1', required : get_option('soxr'))
581 if soxr_dep.found()
582   cdata.set('HAVE_SOXR', 1)
583 endif
584
585 libsystemd_dep = dependency('libsystemd', required : get_option('systemd'))
586 if libsystemd_dep.found()
587   cdata.set('HAVE_SYSTEMD_DAEMON', 1)
588   cdata.set('HAVE_SYSTEMD_LOGIN', 1)
589   cdata.set('HAVE_SYSTEMD_JOURNAL', 1)
590 endif
591 systemd_dep = dependency('systemd', required : get_option('systemd'))
592 if systemd_dep.found() and systemduserunitdir == ''
593   systemduserunitdir = systemd_dep.get_pkgconfig_variable('systemduserunitdir')
594 endif
595
596 x11_dep = dependency('x11-xcb', required : get_option('x11'))
597 if x11_dep.found()
598   xcb_dep  = dependency('xcb',  required : true, version : '>= 1.6')
599   ice_dep  = dependency('ice',  required : true)
600   sm_dep   = dependency('sm',   required : true)
601   xtst_dep = dependency('xtst', required : true)
602   cdata.set('HAVE_X11', 1)
603 endif
604
605 # Module dependencies
606
607 if cc.has_header('sys/soundcard.h')
608   cdata.set('HAVE_OSS_OUTPUT', 1)
609   cdata.set('HAVE_OSS_WRAPPER', 1)
610   cdata.set('PULSEDSP_LOCATION', pulsedsp_location)
611 endif
612
613 if get_option('hal-compat')
614   cdata.set('HAVE_HAL_COMPAT', 1)
615 endif
616
617 avahi_dep = dependency('avahi-client', version : '>= 0.6.0', required : get_option('avahi'), disabler : true)
618 if avahi_dep.found()
619   cdata.set('HAVE_AVAHI', 1)
620 endif
621
622 sbc_dep = dependency('sbc', version : '>= 1.0', required : false)
623 if get_option('bluez5')
624   assert(dbus_dep.found(), 'BlueZ requires D-Bus support')
625   assert(sbc_dep.found(), 'BlueZ requires SBC support')
626   cdata.set('HAVE_SBC', 1)
627   cdata.set('HAVE_BLUEZ', 1)
628   cdata.set('HAVE_BLUEZ_5', 1)
629   if get_option('bluez5-native-headset')
630     cdata.set('HAVE_BLUEZ_5_NATIVE_HEADSET', 1)
631   endif
632   if get_option('bluez5-ofono-headset')
633     cdata.set('HAVE_BLUEZ_5_OFONO_HEADSET', 1)
634   endif
635 endif
636
637 fftw_dep = dependency('fftw3f', required : get_option('fftw'))
638 if fftw_dep.found()
639   cdata.set('HAVE_FFTW', 1)
640 endif
641
642 jack_dep = dependency('jack', version : '>= 0.117.0', required : get_option('jack'))
643 if jack_dep.found()
644   cdata.set('HAVE_JACK', 1)
645 endif
646
647 lirc_dep = dependency('lirc', required : get_option('lirc'))
648 if lirc_dep.found()
649   cdata.set('HAVE_LIRC', 1)
650 endif
651
652 openssl_dep = dependency('openssl', version : '>= 0.9', required : get_option('openssl'))
653 if openssl_dep.found()
654   cdata.set('HAVE_OPENSSL', 1)
655 endif
656
657 speex_dep = dependency('speexdsp', version : '>= 1.2', required : get_option('speex'))
658 if speex_dep.found()
659   cdata.set('HAVE_SPEEX', 1)
660 endif
661
662 udev_dep = dependency('libudev', version : '>= 143', required : get_option('udev'))
663 if udev_dep.found()
664   cdata.set('HAVE_UDEV', 1)
665 endif
666
667 webrtc_dep = dependency('webrtc-audio-processing', version : '>= 0.2', required : get_option('webrtc-aec'))
668 if webrtc_dep.found()
669   cdata.set('HAVE_WEBRTC', 1)
670 endif
671
672 # These are required for the CMake file generation
673 cdata.set('PA_LIBDIR', libdir)
674 cdata.set('PA_INCDIR', includedir)
675 if glib_dep.found()
676   cdata.set('HAVE_GLIB20', 1) # to match the AM_CONDITIONAL for CMake file generation
677 endif
678
679 # Test dependencies
680
681 check_dep = dependency('check', version : '>= 0.9.10', required : get_option('tests'))
682
683 # Subdirs
684
685 subdir('po')
686 if get_option('man')
687   subdir('man')
688 endif
689 subdir('shell-completion/bash')
690 subdir('shell-completion/zsh')
691 subdir('src')
692 subdir('vala')
693
694 # Now generate config.h from everything above
695 configure_file(output : 'config.h', configuration : cdata)
696
697 # pkg-config files
698
699 pc_cdata = configuration_data()
700
701 pc_cdata.set('prefix', prefix)
702 pc_cdata.set('exec_prefix', prefix)
703 pc_cdata.set('libdir', libdir)
704 pc_cdata.set('includedir', includedir)
705 pc_cdata.set('modlibexecdir', modlibexecdir)
706 pc_cdata.set('PACKAGE_VERSION', pa_version_str)
707 pc_cdata.set('PA_MAJORMINOR', pa_version_major_minor)
708 # FIXME: the line below is wrong. Currently the meson thread dep lacks documentation,
709 # and doesn't allow introspection, ie. none of get_pkgconfig_variable() or
710 # get_configtool_variable() work with it, so we have no way to get this flag right,
711 # unless we do all the work ourselves. See current work in glib, also meson #553.
712 pc_cdata.set('PTHREAD_LIBS', '-pthread')
713
714 pc_files = [
715   'libpulse.pc',
716   'libpulse-simple.pc',
717 ]
718
719 if glib_dep.found()
720   pc_files += 'libpulse-mainloop-glib.pc'
721 endif
722
723 foreach file : pc_files
724   configure_file(
725     input : file + '.in',
726     output : file,
727     configuration : pc_cdata,
728     install_dir : pkgconfigdir)
729 endforeach
730
731 # CMake files
732
733 m4 = find_program('m4', required: true)
734
735 cmakedir = join_paths(libdir, 'cmake', 'PulseAudio')
736
737 cmake_template_file = configure_file(
738   input : 'PulseAudioConfig.cmake.in',
739   output : 'PulseAudioConfig.cmake.tmp',
740   configuration: cdata,
741 )
742
743 custom_target('PulseAudioConfig.cmake',
744   input : cmake_template_file,
745   output : 'PulseAudioConfig.cmake',
746   capture : true,
747   command : [m4, '@INPUT@'],
748   build_by_default : true,
749   install : true,
750   install_dir : cmakedir,
751 )
752
753 configure_file(
754   input : 'PulseAudioConfigVersion.cmake.in',
755   output : 'PulseAudioConfigVersion.cmake',
756   configuration: cdata,
757   install : true,
758   install_dir : cmakedir,
759 )
760
761 ############################################################
762
763 # Final summary
764
765 summary = [
766   '',
767   '---{ @0@ @1@ }---'.format(meson.project_name(), meson.project_version()),
768   '',
769   'prefix:                        @0@'.format(prefix),
770   'bindir:                        @0@'.format(bindir),
771   'libdir:                        @0@'.format(libdir),
772   'libexecdir:                    @0@'.format(libexecdir),
773   'mandir:                        @0@'.format(mandir),
774   'datadir:                       @0@'.format(datadir),
775   'sysconfdir:                    @0@'.format(sysconfdir),
776   'localstatedir:                 @0@'.format(localstatedir),
777   'modlibexecdir:                 @0@'.format(modlibexecdir),
778   'System Runtime Path:           @0@'.format(cdata.get_unquoted('PA_SYSTEM_RUNTIME_PATH')),
779   'System State Path:             @0@'.format(cdata.get_unquoted('PA_SYSTEM_STATE_PATH')),
780   'System Config Path:            @0@'.format(cdata.get_unquoted('PA_SYSTEM_CONFIG_PATH')),
781   'Bash completions directory:    @0@'.format(bashcompletiondir),
782   'Zsh completions directory:     @0@'.format(zshcompletiondir),
783   'Compiler:                      @0@ @1@'.format(cc.get_id(), cc.version()),
784 #  'CFLAGS:                        @0@'.format(${CFLAGS}),
785 #  'CPPFLAGS:                      @0@'.format(${CPPFLAGS}),
786 #  'LIBS:                          @0@'.format(${LIBS}),
787   '',
788   'Enable memfd shared memory:    @0@'.format(cdata.has('HAVE_MEMFD')),
789   'Enable X11:                    @0@'.format(x11_dep.found()),
790 #  'Enable OSS Output:             @0@'.format(${ENABLE_OSS_OUTPUT}),
791 #  'Enable OSS Wrapper:            @0@'.format(${ENABLE_OSS_WRAPPER}),
792 #  'Enable EsounD:                 @0@'.format(${ENABLE_ESOUND}),
793   'Enable Alsa:                   @0@'.format(alsa_dep.found()),
794 #  'Enable CoreAudio:              @0@'.format(${ENABLE_COREAUDIO}),
795 #  'Enable Solaris:                @0@'.format(${ENABLE_SOLARIS}),
796 #  'Enable WaveOut:                @0@'.format(${ENABLE_WAVEOUT}),
797   'Enable GLib 2:                 @0@'.format(glib_dep.found()),
798 #  'Enable GConf:                  @0@'.format(${ENABLE_GCONF}),
799   'Enable GSettings:              @0@'.format(gio_dep.found()),
800   'Enable Gtk+ 3:                 @0@'.format(gtk_dep.found()),
801   'Enable Avahi:                  @0@'.format(avahi_dep.found()),
802   'Enable Jack:                   @0@'.format(jack_dep.found()),
803   'Enable Async DNS:              @0@'.format(asyncns_dep.found()),
804   'Enable LIRC:                   @0@'.format(lirc_dep.found()),
805   'Enable D-Bus:                  @0@'.format(dbus_dep.found()),
806   '  Enable BlueZ 5:              @0@'.format(get_option('bluez5')),
807   '    Enable native headsets:    @0@'.format(get_option('bluez5-native-headset')),
808   '    Enable  ofono headsets:    @0@'.format(get_option('bluez5-ofono-headset')),
809   'Enable udev:                   @0@'.format(udev_dep.found()),
810   '  Enable HAL->udev compat:     @0@'.format(get_option('hal-compat')),
811   'Enable systemd:                @0@'.format(libsystemd_dep.found()),
812 #  'Enable TCP Wrappers:           @0@'.format(${ENABLE_TCPWRAP}),
813   'Enable libsamplerate:          @0@'.format(samplerate_dep.found()),
814   'Enable IPv6:                   @0@'.format(get_option('ipv6')),
815   'Enable OpenSSL (for Airtunes): @0@'.format(openssl_dep.found()),
816   'Enable FFTW:                   @0@'.format(fftw_dep.found()),
817   'Enable ORC:                    @0@'.format(have_orcc),
818   'Enable Adrian echo canceller:  @0@'.format(get_option('adrian-aec')),
819   'Enable Speex (resampler, AEC): @0@'.format(speex_dep.found()),
820   'Enable SoXR (resampler):       @0@'.format(soxr_dep.found()),
821   'Enable WebRTC echo canceller:  @0@'.format(webrtc_dep.found()),
822   'Enable Gcov coverage:          @0@'.format(get_option('gcov')),
823   'Enable man pages:              @0@'.format(get_option('man')),
824   'Enable unit tests:             @0@'.format(get_option('tests')),
825   '',
826   'Database:                      @0@'.format(get_option('database')),
827   'Legacy Database Entry Support: @0@'.format(get_option('legacy-database-entry-format')),
828   'Running from build tree:       @0@'.format(get_option('running-from-build-tree')),
829   'System User:                   @0@'.format(cdata.get_unquoted('PA_SYSTEM_USER')),
830   'System Group:                  @0@'.format(cdata.get_unquoted('PA_SYSTEM_GROUP')),
831   'Access Group:                  @0@'.format(cdata.get_unquoted('PA_ACCESS_GROUP')),
832 #  'Enable per-user EsounD socket: @0@'.format(${ENABLE_PER_USER_ESOUND_SOCKET}),
833 #  'Force preopen:                 @0@'.format(${FORCE_PREOPEN}),
834 #  'Preopened modules:             @0@'.format(${PREOPEN_MODS}),
835 ]
836
837 message('\n    '.join(summary))
838
839 # Sanity checks
840
841 if not speex_dep.found() and not webrtc_dep.found() and not get_option('adrian-aec')
842   error('At least one echo canceller implementation must be available!')
843 endif
844
845 if samplerate_dep.found()
846   warning('Support for libsamplerate is DEPRECATED')
847 endif
848
849 if host_machine.system() != 'windows'
850   if not dbus_dep.found()
851     message = [
852       'You do not have D-Bus support enabled. It is strongly recommended',
853       'that you enable D-Bus support if your platform supports it.',
854       'Many parts of PulseAudio use D-Bus, from ConsoleKit interaction',
855       'to the Device Reservation Protocol to speak to JACK, Bluetooth',
856       'support and even a native control protocol for communicating and',
857       'controlling the PulseAudio daemon itself.',
858     ]
859     warning('\n' + '\n'.join(message))
860   endif
861   if not udev_dep.found()
862     message = [
863       'You do not have udev support enabled. It is strongly recommended',
864       'that you enable udev support if your platform supports it as it is',
865       'the primary method used to detect hardware audio devices (on Linux)',
866       'and is thus a critical part of PulseAudio on that platform.',
867     ]
868     warning('\n' + '\n'.join(message))
869   endif
870   if not speex_dep.found()
871     message = [
872       'You do not have speex support enabled. It is strongly recommended',
873       'that you enable speex support if your platform supports it as it is',
874       'the primary method used for audio resampling and is thus a critical',
875       'part of PulseAudio on that platform.',
876     ]
877     warning('\n' + '\n'.join(message))
878   endif
879 endif