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