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