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