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