build-sys: meson: Process subdirectories before generating configuration
[platform/upstream/pulseaudio.git] / meson.build
1 project('pulseaudio', 'c', 'cpp',
2         version : run_command(find_program('git-version-gen'), join_paths(meson.current_source_dir(), '.tarball-version')).stdout().strip(),
3         meson_version : '>= 0.50.0',
4         default_options : [ 'c_std=gnu11', 'cpp_std=c++11' ]
5         )
6
7 pa_version_str = meson.project_version()
8 # For tarballs, the first split will do nothing, but for builds in git, we
9 # split out suffixes when there are commits since the last tag
10 # (e.g.: v11.99.1-3-gad14bdb24 -> v11.99.1)
11 version_split = pa_version_str.split('-')[0].split('.')
12 pa_version_major = version_split[0].split('v')[0]
13 pa_version_minor = version_split[1]
14 if version_split.length() > 2
15   pa_version_micro = version_split[2]
16 else
17   pa_version_micro = '0'
18 endif
19 pa_version_major_minor = pa_version_major + '.' + pa_version_minor
20
21 pa_api_version = 12
22 pa_protocol_version = 33
23
24 # The stable ABI for client applications, for the version info x:y:z
25 # always will hold y=z
26 libpulse_version_info = [21, 0, 21]
27
28 # A simplified, synchronous, ABI-stable interface for client
29 # applications, for the version info x:y:z always will hold y=z
30 libpulse_simple_version_info = [1, 1, 1]
31
32 # The ABI-stable GLib adapter for client applications, for the version
33 # info x:y:z always will hold y=z
34 libpulse_mainloop_glib_version_info = [0, 5, 0]
35
36 libpulse_version = '@0@.@1@.@2@'.format(
37   libpulse_version_info[0] - libpulse_version_info[2],
38   libpulse_version_info[0],
39   libpulse_version_info[1],
40 )
41
42 libpulse_simple_version = '@0@.@1@.@2@'.format(
43   libpulse_simple_version_info[0] - libpulse_simple_version_info[2],
44   libpulse_simple_version_info[0],
45   libpulse_simple_version_info[1],
46 )
47
48 libpulse_mainloop_glib_version = '@0@.@1@.@2@'.format(
49   libpulse_mainloop_glib_version_info[0] - libpulse_mainloop_glib_version_info[2],
50   libpulse_mainloop_glib_version_info[0],
51   libpulse_mainloop_glib_version_info[1],
52 )
53
54 # Paths
55
56 prefix = get_option('prefix')
57 assert(prefix.startswith('/'), 'Prefix is not absolute: "@0@"'.format(prefix))
58
59 bindir = join_paths(prefix, get_option('bindir'))
60 includedir = join_paths(prefix, get_option('includedir'))
61 libdir = join_paths(prefix, get_option('libdir'))
62 libexecdir = join_paths(prefix, get_option('libexecdir'))
63 mandir = join_paths(prefix, get_option('mandir'))
64 datadir = join_paths(prefix, get_option('datadir'))
65 localedir = join_paths(prefix, get_option('localedir'))
66 localstatedir = join_paths(prefix, get_option('localstatedir'))
67 sysconfdir = join_paths(prefix, get_option('sysconfdir'))
68 privlibdir = join_paths(libdir, 'pulseaudio')
69 alsadatadir = join_paths(datadir, 'pulseaudio', 'alsa-mixer')
70
71 pkgconfigdir = join_paths(libdir, 'pkgconfig')
72 pulselibexecdir = join_paths(libexecdir, 'pulse')
73 pulsesysconfdir = join_paths(sysconfdir, 'pulse')
74
75 modlibexecdir = get_option('modlibexecdir')
76 if modlibexecdir == ''
77   modlibexecdir = join_paths(libdir, 'pulse-' + pa_version_major_minor, 'modules')
78 endif
79
80 padsplibdir = get_option('padsplibdir')
81 if padsplibdir == ''
82   padsplibdir = privlibdir
83 endif
84
85 pulsedsp_location = get_option('pulsedsp-location')
86 if pulsedsp_location == ''
87   pulsedsp_location = join_paths(prefix, padsplibdir)
88 endif
89
90 systemduserunitdir = get_option('systemduserunitdir')
91 # the default value is set below
92
93 udevrulesdir = get_option('udevrulesdir')
94 if udevrulesdir == ''
95   # absolute path, otherwise meson prepends the prefix
96   udevrulesdir = '/lib/udev/rules.d'
97 endif
98
99 vapidir = join_paths(datadir, 'vala', 'vapi')
100
101 bashcompletiondir = get_option('bashcompletiondir')
102 if bashcompletiondir == ''
103   bash_completion_dep = dependency('bash-completion', required : false)
104   if bash_completion_dep.found()
105     bashcompletiondir = bash_completion_dep.get_pkgconfig_variable('completionsdir')
106   else
107     bashcompletiondir = join_paths(datadir, 'bash-completion', 'completions')
108   endif
109 endif
110
111 zshcompletiondir = get_option('zshcompletiondir')
112 if zshcompletiondir == ''
113   zshcompletiondir = join_paths(datadir, 'zsh', 'site-functions')
114 endif
115
116 # Configuration data
117
118 cc = meson.get_compiler('c')
119
120 cdata = configuration_data()
121 cdata.set_quoted('PACKAGE', 'pulseaudio')
122 cdata.set_quoted('PACKAGE_NAME', 'pulseaudio')
123 cdata.set_quoted('PACKAGE_VERSION', pa_version_str)
124 cdata.set_quoted('CANONICAL_HOST', host_machine.cpu())
125 cdata.set('PA_MAJOR', pa_version_major)
126 cdata.set('PA_MINOR', pa_version_minor)
127 cdata.set('PA_API_VERSION', pa_api_version)
128 cdata.set('PA_PROTOCOL_VERSION', pa_protocol_version)
129 cdata.set_quoted('PA_MACHINE_ID', join_paths(sysconfdir, 'machine-id'))
130 cdata.set_quoted('PA_MACHINE_ID_FALLBACK', join_paths(localstatedir, 'lib', 'dbus', 'machine-id'))
131 cdata.set_quoted('PA_SRCDIR', join_paths(meson.current_source_dir(), 'src'))
132 cdata.set_quoted('PA_BUILDDIR', meson.current_build_dir())
133 cdata.set_quoted('PA_SOEXT', '.so')
134 cdata.set_quoted('PA_DEFAULT_CONFIG_DIR', pulsesysconfdir)
135 cdata.set_quoted('PA_BINARY', join_paths(bindir, 'pulseaudio'))
136 cdata.set_quoted('PA_SYSTEM_RUNTIME_PATH', join_paths(localstatedir, 'run', 'pulse'))
137 cdata.set_quoted('PA_SYSTEM_CONFIG_PATH', join_paths(localstatedir, 'lib', 'pulse'))
138 cdata.set_quoted('PA_SYSTEM_STATE_PATH', join_paths(localstatedir, 'lib', 'pulse'))
139 cdata.set_quoted('PA_DLSEARCHPATH', modlibexecdir)
140 cdata.set_quoted('PA_SYSTEM_USER', get_option('system_user'))
141 cdata.set_quoted('PA_SYSTEM_GROUP', get_option('system_group'))
142 cdata.set_quoted('PA_ACCESS_GROUP', get_option('access_group'))
143 cdata.set_quoted('PA_CFLAGS', 'Not yet supported on meson')
144 cdata.set_quoted('PA_ALSA_PATHS_DIR', join_paths(alsadatadir, 'paths'))
145 cdata.set_quoted('PA_ALSA_PROFILE_SETS_DIR', join_paths(alsadatadir, 'profile-sets'))
146 cdata.set_quoted('DESKTOPFILEDIR', join_paths(datadir, 'applications'))
147 cdata.set_quoted('PULSE_LOCALEDIR', localedir)
148 cdata.set_quoted('GETTEXT_PACKAGE', 'pulseaudio')
149 cdata.set('ENABLE_NLS', 1)
150
151 # Platform specifics
152 # First some defaults to keep config file generation happy
153 cdata.set('HAVE_COREAUDIO', 0)
154 cdata.set('HAVE_WAVEOUT', 0)
155 # FIXME: This was not tested. Maybe some flags should better be CFLAGS,
156 # rather than ending up in the config.h file?
157 if host_machine.system() == 'darwin'
158   cdata.set('OS_IS_DARWIN', 1)
159   cdata.set('_DARWIN_C_SOURCE', '200112L') # Needed to get NSIG on Mac OS
160 elif host_machine.system() == 'windows'
161   cdata.set('OS_IS_WIN32', 1)
162   cdata.set('WIN32_LEAN_AND_MEAN', 1) # Needed to avoid including unnecessary headers on Windows
163 #elif host_machine.system() == 'solaris'
164 #  # Apparently meson has no solaris support?
165 #  # Needed to get declarations for msg_control and msg_controllen on Solaris
166 #  cdata.set('_XOPEN_SOURCE', 600)
167 #  cdata.set('__EXTENSIONS__', 1)
168 endif
169
170 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 # Symbols
300
301 if cc.has_header_symbol('signal.h', 'SIGXCPU')
302   cdata.set('HAVE_SIGXCPU', 1)
303 endif
304
305 if not cc.has_header_symbol('netinet/in.h', 'INADDR_NONE')
306   if not cc.has_header_symbol('winsock2.h', 'INADDR_NONE')
307     # Define INADDR_NONE if not found (Solaris)
308     cdata.set('INADDR_NONE', '0xffffffff')
309   endif
310 endif
311
312 check_decls = [
313   [ 'environ', 'unistd.h', '#define _GNU_SOURCE' ],
314   [ 'SOUND_PCM_READ_RATE', 'sys/soundcard.h', '' ],
315   [ 'SOUND_PCM_READ_CHANNELS', 'sys/soundcard.h', '' ],
316   [ 'SOUND_PCM_READ_BITS', 'sys/soundcard.h', '' ],
317 ]
318
319 foreach s : check_decls
320   if cc.has_header_symbol(s[1], s[0], prefix : s[2])
321     define = 'HAVE_DECL_' + s[0].to_upper()
322     cdata.set(define, 1)
323   endif
324 endforeach
325
326 # Types
327
328 # FIXME: do we ever care about gid_t not being defined / smaller than an int?
329 cdata.set('GETGROUPS_T', 'gid_t')
330
331 # Include paths
332
333 configinc = include_directories('.')
334 topinc = include_directories('src')
335
336 # CFLAGS/LDFLAGS
337
338 pa_c_args = ['-DHAVE_CONFIG_H', '-D_GNU_SOURCE']
339 server_c_args = ['-D__INCLUDED_FROM_PULSE_AUDIO']
340 cdata.set('MESON_BUILD', 1)
341
342 # On ELF systems we don't want the libraries to be unloaded since we don't clean them up properly,
343 # so we request the nodelete flag to be enabled.
344 # On other systems, we don't really know how to do that, but it's welcome if somebody can tell.
345 nodelete_link_args = ['-Wl,-z,nodelete']
346
347 # Code coverage
348
349 if get_option('gcov')
350   add_project_arguments('--coverage', language: ['c', 'cpp'])
351   add_project_link_arguments('--coverage', language: ['c', 'cpp'])
352 endif
353
354 # Core Dependencies
355
356 libm_dep = cc.find_library('m', required : true)
357
358 thread_dep = dependency('threads')
359 foreach f : [
360   'pthread_getname_np',
361   'pthread_setaffinity_np',
362   'pthread_setname_np',
363 ]
364   if cc.has_function(f, dependencies : thread_dep)
365     define = 'HAVE_' + f.underscorify().to_upper()
366     cdata.set(define, 1)
367   endif
368 endforeach
369
370 cap_dep = cc.find_library('cap', required : false)
371
372 shm_dep = cc.find_library('rt', required : false)
373 if shm_dep.found()
374   cdata.set('HAVE_SHM_OPEN', 1)
375 endif
376
377 dl_dep = cc.find_library('dl', required : false)
378 if dl_dep.found()
379   cdata.set('HAVE_DLADDR', 1)
380 endif
381
382 have_iconv = false
383 if cc.has_function('iconv_open')
384   iconv_dep = dependency('', required : false)
385   have_iconv = true
386 else
387   iconv_dep = cc.find_library('iconv', required : false)
388   have_iconv = iconv_dep.found()
389 endif
390 if have_iconv
391   cdata.set('HAVE_ICONV', 1)
392   iconvconsttest = '''#include <iconv.h>
393 size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);
394 '''
395   if cc.compiles(iconvconsttest, dependencies : iconv_dep)
396     cdata.set('ICONV_CONST', '')
397   else
398     cdata.set('ICONV_CONST', 'const')
399   endif
400 endif
401
402 # Atomic operations
403
404 if get_option('atomic-arm-memory-barrier')
405     cdata.set('ATOMIC_ARM_MEMORY_BARRIER_ENABLED', 1)
406 endif
407
408 need_libatomic_ops = false
409
410 atomictest = '''void func() {
411   volatile int atomic = 2;
412   __sync_bool_compare_and_swap (&atomic, 2, 3);
413 }
414 '''
415
416 if cc.compiles(atomictest)
417   cdata.set('HAVE_ATOMIC_BUILTINS', 1)
418
419   newatomictest = '''void func() {
420     int c = 0;
421     __atomic_store_n(&c, 4, __ATOMIC_SEQ_CST);
422   }
423   '''
424
425   if(cc.compiles(newatomictest))
426     cdata.set('HAVE_ATOMIC_BUILTINS_MEMORY_MODEL', 1)
427   endif
428
429 elif host_machine.cpu_family() == 'arm'
430   if host_machine.system() == 'linux' and get_option('atomic-arm-linux-helpers')
431     cdata.set('ATOMIC_ARM_LINUX_HELPERS', 1)
432   else
433     armatomictest = '''int func() {
434       volatile int a=0;
435       int o=0, n=1, r;
436       asm volatile (
437               "ldrex    %0, [%1]\n"
438               "subs  %0, %0, %2\n"
439               "strexeq %0, %3, [%1]\n"
440               : "=&r" (r)
441               : "r" (&a), "Ir" (o), "r" (n)
442       : "cc");
443       return (a==1 ? 0 : -1);
444     }
445     '''
446
447     if cc.compiles(armatomictest)
448       cdata.set('ATOMIC_ARM_INLINE_ASM', 1)
449     else
450       need_libatomic_ops = true
451     endif
452   endif # arm && !linux
453
454 elif not ['freebsd', 'netbsd'].contains(host_machine.system())
455   need_libatomic_ops = true
456 endif # !atomic helpers && !arm
457
458 if need_libatomic_ops
459   assert(cc.has_header('atomic_ops.h'), 'Need libatomic_ops')
460
461   cdata.set('AO_REQUIRE_CAS', 1)
462
463   if host_machine.system() != 'windows'
464     libatomic_ops_dep = cc.find_library('atomic_ops', required : true)
465   else
466     libatomic_ops_dep = dependency('', required: false)
467   endif
468 else
469   libatomic_ops_dep = dependency('', required: false)
470 endif
471
472 # ARM checks
473 # ARMV6 instructions we need
474 if host_machine.cpu_family() == 'arm'
475   armv6test = '''int func() {
476     volatile int a = -60000, b = 0xaaaabbbb, c = 0xccccdddd;
477     asm volatile ("ldr r0, %2 \n"
478                   "ldr r2, %3 \n"
479                   "ldr r3, %4 \n"
480                   "ssat r1, #8, r0 \n"
481                   "str r1, %0 \n"
482                   "pkhbt r1, r3, r2, LSL #8 \n"
483                   "str r1, %1 \n"
484                   : "=m" (a), "=m" (b)
485                   : "m" (a), "m" (b), "m" (c)
486                   : "r0", "r1", "r2", "r3", "cc");
487     return (a == -128 && b == 0xaabbdddd) ? 0 : -1;
488   }
489   '''
490
491   if cc.compiles(armv6test)
492     cdata.set('HAVE_ARMV6', 1)
493   endif
494 endif
495 # NEON checks are automatically done by the unstable-simd module
496
497 # FIXME: make sure it's >= 2.2
498 ltdl_dep = cc.find_library('ltdl', required : true)
499 # FIXME: can meson support libtool -dlopen/-dlpreopen things?
500 #        and do we still want to support this at all?
501 cdata.set('DISABLE_LIBTOOL_PRELOAD', 1)
502
503 if get_option('database') == 'tdb'
504   database_dep = dependency('tdb')
505 elif get_option('database') == 'gdbm'
506   database_dep = cc.find_library('gdbm', required : true)
507 else
508   database_dep = dependency('', required: false)
509 endif
510
511 if get_option('ipv6')
512   cdata.set('HAVE_IPV6', 1)
513 endif
514
515 if get_option('legacy-database-entry-format')
516   cdata.set('ENABLE_LEGACY_DATABASE_ENTRY_FORMAT', 1)
517 endif
518
519 if get_option('running-from-build-tree')
520   cdata.set('HAVE_RUNNING_FROM_BUILD_TREE', 1)
521 endif
522
523 alsa_dep = dependency('alsa', version : '>= 1.0.24', required : get_option('alsa'))
524 if alsa_dep.found()
525   cdata.set('HAVE_ALSA', 1)
526   cdata.set('HAVE_ALSA_UCM', 1)
527 endif
528
529 asyncns_dep = dependency('libasyncns', version : '>= 0.1', required : get_option('asyncns'))
530 if asyncns_dep.found()
531   cdata.set('HAVE_LIBASYNCNS', 1)
532 endif
533
534 dbus_dep = dependency('dbus-1', version : '>= 1.4.12', required : get_option('dbus'))
535 if dbus_dep.found()
536   cdata.set('HAVE_DBUS', 1)
537 endif
538
539 gio_dep = dependency('gio-2.0', version : '>= 2.26.0', required : get_option('gsettings'))
540 if gio_dep.found()
541   cdata.set('HAVE_GSETTINGS', 1)
542 endif
543
544 glib_dep = dependency('glib-2.0', version : '>= 2.4.0', required: get_option('glib'))
545 if glib_dep.found()
546   cdata.set('HAVE_GLIB', 1)
547 endif
548
549 gtk_dep = dependency('gtk+-3.0', required : get_option('gtk'))
550 if gtk_dep.found()
551   cdata.set('HAVE_GTK', 1)
552 endif
553
554 have_orcc = false
555 orcc_args = []
556 orc_dep = dependency('orc-0.4', version : '>= 0.4.11', required : get_option('orc'))
557 orcc = find_program('orcc', required : get_option('orc'))
558 if orc_dep.found() and orcc.found()
559   have_orcc = true
560   orcc_args = [orcc]
561   #orcc_args = [orcc, '--include', 'glib.h']
562   cdata.set('HAVE_ORC', 1)
563 else
564   cdata.set('DISABLE_ORC', 1)
565 endif
566
567 samplerate_dep = dependency('samplerate', version : '>= 0.1.0', required : get_option('samplerate'))
568 if samplerate_dep.found()
569   cdata.set('HAVE_LIBSAMPLERATE', 1)
570 endif
571
572 sndfile_dep = dependency('sndfile', version : '>= 1.0.20')
573
574 soxr_dep = dependency('soxr', version : '>= 0.1.1', required : get_option('soxr'))
575 if soxr_dep.found()
576   cdata.set('HAVE_SOXR', 1)
577 endif
578
579 libsystemd_dep = dependency('libsystemd', required : get_option('systemd'))
580 if libsystemd_dep.found()
581   cdata.set('HAVE_SYSTEMD_DAEMON', 1)
582   cdata.set('HAVE_SYSTEMD_LOGIN', 1)
583   cdata.set('HAVE_SYSTEMD_JOURNAL', 1)
584 endif
585 systemd_dep = dependency('systemd', required : get_option('systemd'))
586 if systemd_dep.found() and systemduserunitdir == ''
587   systemduserunitdir = systemd_dep.get_pkgconfig_variable('systemduserunitdir')
588 endif
589
590 x11_dep = dependency('x11-xcb', required : get_option('x11'))
591 if x11_dep.found()
592   xcb_dep  = dependency('xcb',  required : true, version : '>= 1.6')
593   ice_dep  = dependency('ice',  required : true)
594   sm_dep   = dependency('sm',   required : true)
595   xtst_dep = dependency('xtst', required : true)
596   cdata.set('HAVE_X11', 1)
597 endif
598
599 # Module dependencies
600
601 if cc.has_header('sys/soundcard.h')
602   cdata.set('HAVE_OSS_OUTPUT', 1)
603   cdata.set('HAVE_OSS_WRAPPER', 1)
604   cdata.set('PULSEDSP_LOCATION', pulsedsp_location)
605 endif
606
607 if get_option('hal-compat')
608   cdata.set('HAVE_HAL_COMPAT', 1)
609 endif
610
611 avahi_dep = dependency('avahi-client', version : '>= 0.6.0', required : get_option('avahi'), disabler : true)
612 if avahi_dep.found()
613   cdata.set('HAVE_AVAHI', 1)
614 endif
615
616 sbc_dep = dependency('sbc', version : '>= 1.0', required : false)
617 if get_option('bluez5')
618   assert(dbus_dep.found(), 'BlueZ requires D-Bus support')
619   assert(sbc_dep.found(), 'BlueZ requires SBC support')
620   cdata.set('HAVE_SBC', 1)
621   cdata.set('HAVE_BLUEZ', 1)
622   cdata.set('HAVE_BLUEZ_5', 1)
623   if get_option('bluez5-native-headset')
624     cdata.set('HAVE_BLUEZ_5_NATIVE_HEADSET', 1)
625   endif
626   if get_option('bluez5-ofono-headset')
627     cdata.set('HAVE_BLUEZ_5_OFONO_HEADSET', 1)
628   endif
629 endif
630
631 fftw_dep = dependency('fftw3f', required : get_option('fftw'))
632 if fftw_dep.found()
633   cdata.set('HAVE_FFTW', 1)
634 endif
635
636 jack_dep = dependency('jack', version : '>= 0.117.0', required : get_option('jack'))
637 if jack_dep.found()
638   cdata.set('HAVE_JACK', 1)
639 endif
640
641 lirc_dep = dependency('lirc', required : get_option('lirc'))
642 if lirc_dep.found()
643   cdata.set('HAVE_LIRC', 1)
644 endif
645
646 openssl_dep = dependency('openssl', version : '>= 0.9', required : get_option('openssl'))
647 if openssl_dep.found()
648   cdata.set('HAVE_OPENSSL', 1)
649 endif
650
651 speex_dep = dependency('speexdsp', version : '>= 1.2', required : get_option('speex'))
652 if speex_dep.found()
653   cdata.set('HAVE_SPEEX', 1)
654 endif
655
656 udev_dep = dependency('libudev', version : '>= 143', required : get_option('udev'))
657 if udev_dep.found()
658   cdata.set('HAVE_UDEV', 1)
659 endif
660
661 webrtc_dep = dependency('webrtc-audio-processing', version : '>= 0.2', required : get_option('webrtc-aec'))
662 if webrtc_dep.found()
663   cdata.set('HAVE_WEBRTC', 1)
664 endif
665
666 # These are required for the CMake file generation
667 cdata.set('PA_LIBDIR', libdir)
668 cdata.set('PA_INCDIR', includedir)
669 if glib_dep.found()
670   cdata.set('HAVE_GLIB20', 1) # to match the AM_CONDITIONAL for CMake file generation
671 endif
672
673 # Test dependencies
674
675 check_dep = dependency('check', version : '>= 0.9.10', required : get_option('tests'))
676
677 # Subdirs
678
679 subdir('po')
680 if get_option('man')
681   subdir('man')
682 endif
683 subdir('shell-completion/bash')
684 subdir('shell-completion/zsh')
685 subdir('src')
686 subdir('vala')
687
688 # Now generate config.h from everything above
689 configure_file(output : 'config.h', configuration : cdata)
690
691 # pkg-config files
692
693 pc_cdata = configuration_data()
694
695 pc_cdata.set('prefix', prefix)
696 pc_cdata.set('exec_prefix', prefix)
697 pc_cdata.set('libdir', libdir)
698 pc_cdata.set('includedir', includedir)
699 pc_cdata.set('modlibexecdir', modlibexecdir)
700 pc_cdata.set('PACKAGE_VERSION', pa_version_str)
701 pc_cdata.set('PA_MAJORMINOR', pa_version_major_minor)
702 # FIXME: the line below is wrong. Currently the meson thread dep lacks documentation,
703 # and doesn't allow introspection, ie. none of get_pkgconfig_variable() or
704 # get_configtool_variable() work with it, so we have no way to get this flag right,
705 # unless we do all the work ourselves. See current work in glib, also meson #553.
706 pc_cdata.set('PTHREAD_LIBS', '-pthread')
707
708 pc_files = [
709   'libpulse.pc',
710   'libpulse-simple.pc',
711 ]
712
713 if glib_dep.found()
714   pc_files += 'libpulse-mainloop-glib.pc'
715 endif
716
717 foreach file : pc_files
718   configure_file(
719     input : file + '.in',
720     output : file,
721     configuration : pc_cdata,
722     install_dir : pkgconfigdir)
723 endforeach
724
725 # CMake files
726
727 m4 = find_program('m4', required: true)
728
729 cmakedir = join_paths(libdir, 'cmake', 'PulseAudio')
730
731 cmake_template_file = configure_file(
732   input : 'PulseAudioConfig.cmake.in',
733   output : 'PulseAudioConfig.cmake.tmp',
734   configuration: cdata,
735 )
736
737 custom_target('PulseAudioConfig.cmake',
738   input : cmake_template_file,
739   output : 'PulseAudioConfig.cmake',
740   capture : true,
741   command : [m4, '@INPUT@'],
742   build_by_default : true,
743   install : true,
744   install_dir : cmakedir,
745 )
746
747 configure_file(
748   input : 'PulseAudioConfigVersion.cmake.in',
749   output : 'PulseAudioConfigVersion.cmake',
750   configuration: cdata,
751   install : true,
752   install_dir : cmakedir,
753 )
754
755 ############################################################
756
757 # Final summary
758
759 summary = [
760   '',
761   '---{ @0@ @1@ }---'.format(meson.project_name(), meson.project_version()),
762   '',
763   'prefix:                        @0@'.format(prefix),
764   'bindir:                        @0@'.format(bindir),
765   'libdir:                        @0@'.format(libdir),
766   'libexecdir:                    @0@'.format(libexecdir),
767   'mandir:                        @0@'.format(mandir),
768   'datadir:                       @0@'.format(datadir),
769   'sysconfdir:                    @0@'.format(sysconfdir),
770   'localstatedir:                 @0@'.format(localstatedir),
771   'modlibexecdir:                 @0@'.format(modlibexecdir),
772   'System Runtime Path:           @0@'.format(cdata.get_unquoted('PA_SYSTEM_RUNTIME_PATH')),
773   'System State Path:             @0@'.format(cdata.get_unquoted('PA_SYSTEM_STATE_PATH')),
774   'System Config Path:            @0@'.format(cdata.get_unquoted('PA_SYSTEM_CONFIG_PATH')),
775   'Bash completions directory:    @0@'.format(bashcompletiondir),
776   'Zsh completions directory:     @0@'.format(zshcompletiondir),
777   'Compiler:                      @0@ @1@'.format(cc.get_id(), cc.version()),
778 #  'CFLAGS:                        @0@'.format(${CFLAGS}),
779 #  'CPPFLAGS:                      @0@'.format(${CPPFLAGS}),
780 #  'LIBS:                          @0@'.format(${LIBS}),
781   '',
782   'Enable memfd shared memory:    @0@'.format(cdata.has('HAVE_MEMFD')),
783   'Enable X11:                    @0@'.format(x11_dep.found()),
784 #  'Enable OSS Output:             @0@'.format(${ENABLE_OSS_OUTPUT}),
785 #  'Enable OSS Wrapper:            @0@'.format(${ENABLE_OSS_WRAPPER}),
786 #  'Enable EsounD:                 @0@'.format(${ENABLE_ESOUND}),
787   'Enable Alsa:                   @0@'.format(alsa_dep.found()),
788 #  'Enable CoreAudio:              @0@'.format(${ENABLE_COREAUDIO}),
789 #  'Enable Solaris:                @0@'.format(${ENABLE_SOLARIS}),
790 #  'Enable WaveOut:                @0@'.format(${ENABLE_WAVEOUT}),
791   'Enable GLib 2:                 @0@'.format(glib_dep.found()),
792 #  'Enable GConf:                  @0@'.format(${ENABLE_GCONF}),
793   'Enable GSettings:              @0@'.format(gio_dep.found()),
794   'Enable Gtk+ 3:                 @0@'.format(gtk_dep.found()),
795   'Enable Avahi:                  @0@'.format(avahi_dep.found()),
796   'Enable Jack:                   @0@'.format(jack_dep.found()),
797   'Enable Async DNS:              @0@'.format(asyncns_dep.found()),
798   'Enable LIRC:                   @0@'.format(lirc_dep.found()),
799   'Enable D-Bus:                  @0@'.format(dbus_dep.found()),
800   '  Enable BlueZ 5:              @0@'.format(get_option('bluez5')),
801   '    Enable native headsets:    @0@'.format(get_option('bluez5-native-headset')),
802   '    Enable  ofono headsets:    @0@'.format(get_option('bluez5-ofono-headset')),
803   'Enable udev:                   @0@'.format(udev_dep.found()),
804   '  Enable HAL->udev compat:     @0@'.format(get_option('hal-compat')),
805   'Enable systemd:                @0@'.format(libsystemd_dep.found()),
806 #  'Enable TCP Wrappers:           @0@'.format(${ENABLE_TCPWRAP}),
807   'Enable libsamplerate:          @0@'.format(samplerate_dep.found()),
808   'Enable IPv6:                   @0@'.format(get_option('ipv6')),
809   'Enable OpenSSL (for Airtunes): @0@'.format(openssl_dep.found()),
810   'Enable FFTW:                   @0@'.format(fftw_dep.found()),
811   'Enable ORC:                    @0@'.format(have_orcc),
812   'Enable Adrian echo canceller:  @0@'.format(get_option('adrian-aec')),
813   'Enable Speex (resampler, AEC): @0@'.format(speex_dep.found()),
814   'Enable SoXR (resampler):       @0@'.format(soxr_dep.found()),
815   'Enable WebRTC echo canceller:  @0@'.format(webrtc_dep.found()),
816   'Enable Gcov coverage:          @0@'.format(get_option('gcov')),
817   'Enable man pages:              @0@'.format(get_option('man')),
818   'Enable unit tests:             @0@'.format(get_option('tests')),
819   '',
820   'Database:                      @0@'.format(get_option('database')),
821   'Legacy Database Entry Support: @0@'.format(get_option('legacy-database-entry-format')),
822   'Running from build tree:       @0@'.format(get_option('running-from-build-tree')),
823   'System User:                   @0@'.format(cdata.get_unquoted('PA_SYSTEM_USER')),
824   'System Group:                  @0@'.format(cdata.get_unquoted('PA_SYSTEM_GROUP')),
825   'Access Group:                  @0@'.format(cdata.get_unquoted('PA_ACCESS_GROUP')),
826 #  'Enable per-user EsounD socket: @0@'.format(${ENABLE_PER_USER_ESOUND_SOCKET}),
827 #  'Force preopen:                 @0@'.format(${FORCE_PREOPEN}),
828 #  'Preopened modules:             @0@'.format(${PREOPEN_MODS}),
829 ]
830
831 message('\n    '.join(summary))
832
833 # Sanity checks
834
835 if not speex_dep.found() and not webrtc_dep.found() and not get_option('adrian-aec')
836   error('At least one echo canceller implementation must be available!')
837 endif
838
839 if samplerate_dep.found()
840   warning('Support for libsamplerate is DEPRECATED')
841 endif
842
843 if host_machine.system() != 'windows'
844   if not dbus_dep.found()
845     message = [
846       'You do not have D-Bus support enabled. It is strongly recommended',
847       'that you enable D-Bus support if your platform supports it.',
848       'Many parts of PulseAudio use D-Bus, from ConsoleKit interaction',
849       'to the Device Reservation Protocol to speak to JACK, Bluetooth',
850       'support and even a native control protocol for communicating and',
851       'controlling the PulseAudio daemon itself.',
852     ]
853     warning('\n' + '\n'.join(message))
854   endif
855   if not udev_dep.found()
856     message = [
857       'You do not have udev support enabled. It is strongly recommended',
858       'that you enable udev support if your platform supports it as it is',
859       'the primary method used to detect hardware audio devices (on Linux)',
860       'and is thus a critical part of PulseAudio on that platform.',
861     ]
862     warning('\n' + '\n'.join(message))
863   endif
864   if not speex_dep.found()
865     message = [
866       'You do not have speex support enabled. It is strongly recommended',
867       'that you enable speex support if your platform supports it as it is',
868       'the primary method used for audio resampling and is thus a critical',
869       'part of PulseAudio on that platform.',
870     ]
871     warning('\n' + '\n'.join(message))
872   endif
873 endif