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