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.47.0',
4 default_options : [ 'c_std=gnu11', 'cpp_std=c++11' ]
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]
17 pa_version_micro = '0'
19 pa_version_major_minor = pa_version_major + '.' + pa_version_minor
22 pa_protocol_version = 33
26 # FIXME: this doesn't actually do what we want it to
27 # maintaining compatibility with the previous libtool versioning
28 # current = minor * 100 + micro
29 libversion = '@0@.@1@.0'.format(soversion, pa_version_minor.to_int() * 100 + pa_version_micro.to_int())
31 # The ABI-stable GLib adapter for client applications.
32 # For the version x:y:z always will hold y=z.
33 libpulse_mainloop_glib_version = '0.5.0'
37 prefix = get_option('prefix')
38 assert(prefix.startswith('/'), 'Prefix is not absolute: "@0@"'.format(prefix))
40 bindir = join_paths(prefix, get_option('bindir'))
41 libdir = join_paths(prefix, get_option('libdir'))
42 libexecdir = join_paths(prefix, get_option('libexecdir'))
43 datadir = join_paths(prefix, get_option('datadir'))
44 localstatedir = join_paths(prefix, get_option('localstatedir'))
45 sysconfdir = join_paths(prefix, get_option('sysconfdir'))
47 pulselibexecdir = join_paths(libexecdir, 'pulse')
48 pulsesysconfdir = join_paths(sysconfdir, 'pulse')
50 pulsedspdir = get_option('pulsedspdir')
52 join_paths(libdir, 'pulseaudio')
57 cc = meson.get_compiler('c')
59 cdata = configuration_data()
60 cdata.set_quoted('PACKAGE', 'pulseaudio')
61 cdata.set_quoted('PACKAGE_NAME', 'pulseaudio')
62 cdata.set_quoted('PACKAGE_VERSION', pa_version_str)
63 cdata.set_quoted('CANONICAL_HOST', host_machine.cpu())
64 cdata.set('PA_MAJOR', pa_version_major)
65 cdata.set('PA_MINOR', pa_version_minor)
66 cdata.set('PA_API_VERSION', pa_api_version)
67 cdata.set('PA_PROTOCOL_VERSION', pa_protocol_version)
68 cdata.set_quoted('PA_MACHINE_ID', join_paths(sysconfdir, 'machine-id'))
69 cdata.set_quoted('PA_MACHINE_ID_FALLBACK', join_paths(localstatedir, 'lib', 'dbus', 'machine-id'))
70 cdata.set_quoted('PA_SRCDIR', join_paths(meson.current_source_dir(), 'src'))
71 cdata.set_quoted('PA_BUILDDIR', meson.current_build_dir())
72 cdata.set_quoted('PA_SOEXT', '.so')
73 cdata.set_quoted('PA_DEFAULT_CONFIG_DIR', pulsesysconfdir)
74 cdata.set_quoted('PA_BINARY', join_paths(bindir, 'pulseaudio'))
75 cdata.set_quoted('PA_SYSTEM_RUNTIME_PATH', join_paths(localstatedir, 'run', 'pulse'))
76 cdata.set_quoted('PA_SYSTEM_CONFIG_PATH', join_paths(localstatedir, 'lib', 'pulse'))
77 cdata.set_quoted('PA_SYSTEM_STATE_PATH', join_paths(localstatedir, 'lib', 'pulse'))
78 cdata.set_quoted('PA_DLSEARCHPATH', join_paths(libdir, 'pulse-' + pa_version_major_minor, 'modules'))
79 cdata.set_quoted('PA_SYSTEM_USER', get_option('system_user'))
80 cdata.set_quoted('PA_SYSTEM_GROUP', get_option('system_group'))
81 cdata.set_quoted('PA_ACCESS_GROUP', get_option('access_group'))
82 cdata.set_quoted('PA_CFLAGS', 'Not yet supported on meson')
83 cdata.set_quoted('PA_ALSA_PATHS_DIR', join_paths(datadir, 'pulseaudio', 'alsa-mixer', 'paths'))
84 cdata.set_quoted('PA_ALSA_PROFILE_SETS_DIR', join_paths(datadir, 'pulseaudio', 'alsa-mixer', 'profile-sets'))
85 cdata.set_quoted('DESKTOPFILEDIR', join_paths(datadir, 'applications'))
88 # First some defaults to keep config file generation happy
89 cdata.set('HAVE_COREAUDIO', 0)
90 cdata.set('HAVE_WAVEOUT', 0)
91 # FIXME: This was not tested. Maybe some flags should better be CFLAGS,
92 # rather than ending up in the config.h file?
93 if host_machine.system() == 'darwin'
94 cdata.set('OS_IS_DARWIN', 1)
95 cdata.set('_DARWIN_C_SOURCE', '200112L') # Needed to get NSIG on Mac OS
96 elif host_machine.system() == 'windows'
97 cdata.set('OS_IS_WIN32', 1)
98 cdata.set('WIN32_LEAN_AND_MEAN', 1) # Needed to avoid including unnecessary headers on Windows
99 #elif host_machine.system() == 'solaris'
100 # # Apparently meson has no solaris support?
101 # # Needed to get declarations for msg_control and msg_controllen on Solaris
102 # cdata.set('_XOPEN_SOURCE', 600)
103 # cdata.set('__EXTENSIONS__', 1)
117 'netinet/in_systm.h',
133 'valgrind/memcheck.h',
137 foreach h : check_headers
139 define = 'HAVE_' + h.underscorify().to_upper()
144 # FIXME: move this to the above set
145 if cc.has_header('pthread.h')
146 cdata.set('HAVE_PTHREAD', 1)
149 # FIXME: move this to the above set
150 if cc.has_header('sys/un.h')
151 cdata.set('HAVE_AF_UNIX', 1)
193 foreach f : check_functions
194 if cc.has_function(f)
195 define = 'HAVE_' + f.underscorify().to_upper()
200 shm_dep = cc.find_library('rt', required : false)
202 cdata.set('HAVE_SHM_OPEN', 1)
205 if cc.has_function('SYS_memfd_create', prefix : '#include <sys/syscall.h>')
206 cdata.set('HAVE_MEMFD', 1)
211 # FIXME: do we ever care about gid_t not being defined / smaller than an int?
212 cdata.set('GETGROUPS_T', 'gid_t')
216 configinc = include_directories('.')
217 topinc = include_directories('src')
221 pa_c_args = ['-DHAVE_CONFIG_H', '-D_GNU_SOURCE']
222 server_c_args = ['-D__INCLUDED_FROM_PULSE_AUDIO']
223 cdata.set('MESON_BUILD', 1)
227 libm_dep = cc.find_library('m', required : true)
228 thread_dep = dependency('threads')
229 cap_dep = cc.find_library('cap', required : false)
231 atomictest = '''void func() {
232 volatile int atomic = 2;
233 __sync_bool_compare_and_swap (&atomic, 2, 3);
236 if cc.compiles(atomictest)
237 cdata.set('HAVE_ATOMIC_BUILTINS', true)
239 # FIXME: check if we need libatomic_ops
242 # FIXME: make sure it's >= 2.2
243 ltdl_dep = cc.find_library('ltdl', required : true)
244 # FIXME: can meson support libtool -dlopen/-dlpreopen things?
245 # and do we still want to support this at all?
246 cdata.set('DISABLE_LIBTOOL_PRELOAD', 1)
248 if get_option('database') == 'tdb'
249 database_dep = dependency('tdb')
250 elif get_option('database') == 'gdbm'
251 database_dep = cc.find_library('gdbm', required : true)
253 database_dep = dependency('', required:false)
256 if get_option('ipv6')
257 cdata.set('HAVE_IPV6', 1)
260 if get_option('legacy-database-entry-format')
261 cdata.set('ENABLE_LEGACY_DATABASE_ENTRY_FORMAT', 1)
264 alsa_dep = dependency('alsa', version : '>= 1.0.24', required : get_option('alsa'))
266 cdata.set('HAVE_ALSA', 1)
267 cdata.set('HAVE_ALSA_UCM', 1)
270 asyncns_dep = dependency('libasyncns', version : '>= 0.1', required : get_option('asyncns'))
271 if asyncns_dep.found()
272 cdata.set('HAVE_LIBASYNCNS', 1)
275 dbus_dep = dependency('dbus-1', version : '>= 1.4.12', required : get_option('dbus'))
277 cdata.set('HAVE_DBUS', 1)
280 gio_dep = dependency('gio-2.0', version : '>= 2.26.0', required : get_option('gsettings'))
282 cdata.set('HAVE_GSETTINGS', 1)
285 glib_dep = dependency('glib-2.0', version : '>= 2.4.0', required: get_option('glib'))
287 cdata.set('HAVE_GLIB', 1)
290 gtk_dep = dependency('gtk+-3.0', required : get_option('gtk'))
292 cdata.set('HAVE_GTK', 1)
295 samplerate_dep = dependency('samplerate', version : '>= 0.1.0', required : get_option('samplerate'))
296 if samplerate_dep.found()
297 cdata.set('HAVE_LIBSAMPLERATE', 1)
300 sndfile_dep = dependency('sndfile', version : '>= 1.0.20')
302 soxr_dep = dependency('soxr', version : '>= 0.1.1', required : get_option('soxr'))
304 cdata.set('HAVE_SOXR', 1)
307 systemd_dep = dependency('libsystemd', required : get_option('systemd'))
308 if systemd_dep.found()
309 cdata.set('HAVE_SYSTEMD_DAEMON', 1)
310 cdata.set('HAVE_SYSTEMD_LOGIN', 1)
311 cdata.set('HAVE_SYSTEMD_JOURNAL', 1)
314 x11_dep = dependency('x11-xcb', required : get_option('x11'))
316 xcb_dep = dependency('xcb', required : true, version : '>= 1.6')
317 ice_dep = dependency('ice', required : true)
318 sm_dep = dependency('sm', required : true)
319 xtst_dep = dependency('xtst', required : true)
320 cdata.set('HAVE_X11', 1)
324 cdata.set('DISABLE_ORC', 1)
326 # Module dependencies
328 if cc.has_header('sys/soundcard.h')
329 cdata.set('HAVE_OSS_OUTPUT', 1)
330 cdata.set('HAVE_OSS_WRAPPER', 1)
331 cdata.set_quoted('PULSEDSP_LOCATION', pulsedspdir)
334 if get_option('hal-compat')
335 cdata.set('HAVE_HAL_COMPAT', 1)
338 avahi_dep = dependency('avahi-client', version : '>= 0.6.0', required : get_option('avahi'), disabler : true)
340 cdata.set('HAVE_AVAHI', 1)
343 bluez_dep = dependency('bluez', version : '>= 5.0', required : get_option('bluez5'))
344 sbc_dep = dependency('sbc', version : '>= 1.0', required : false)
346 assert(dbus_dep.found(), 'BlueZ requires D-Bus support')
347 assert(sbc_dep.found(), 'BlueZ requires SBC support')
348 cdata.set('HAVE_SBC', 1)
349 cdata.set('HAVE_BLUEZ', 1)
350 cdata.set('HAVE_BLUEZ_5', 1)
351 if get_option('bluez5-native-headset')
352 cdata.set('HAVE_BLUEZ_5_NATIVE_HEADSET', 1)
354 if get_option('bluez5-ofono-headset')
355 cdata.set('HAVE_BLUEZ_5_OFONO_HEADSET', 1)
359 fftw_dep = dependency('fftw3f', required : get_option('fftw'))
361 cdata.set('HAVE_FFTW', 1)
364 jack_dep = dependency('jack', version : '>= 0.117.0', required : get_option('jack'))
366 cdata.set('HAVE_JACK', 1)
369 lirc_dep = dependency('lirc', required : get_option('lirc'))
371 cdata.set('HAVE_LIRC', 1)
374 openssl_dep = dependency('openssl', version : '>= 0.9', required : get_option('openssl'))
375 if openssl_dep.found()
376 cdata.set('HAVE_OPENSSL', 1)
379 speex_dep = dependency('speexdsp', version : '>= 1.2', required : get_option('speex'))
381 cdata.set('HAVE_SPEEX', 1)
384 udev_dep = dependency('libudev', version : '>= 143', required : get_option('udev'))
386 cdata.set('HAVE_UDEV', 1)
389 webrtc_dep = dependency('webrtc-audio-processing', version : '>= 0.2', required : get_option('webrtc-aec'))
390 if webrtc_dep.found()
391 cdata.set('HAVE_WEBRTC', 1)
394 # Now generate config.h from everything above
395 configure_file(output : 'config.h', configuration : cdata)
400 ############################################################
406 '---{ @0@ @1@ }---'.format(meson.project_name(), meson.project_version()),
408 'prefix: @0@'.format(prefix),
409 'bindir: @0@'.format(bindir),
410 'libdir: @0@'.format(libdir),
411 'libexecdir: @0@'.format(libexecdir),
412 'datadir: @0@'.format(datadir),
413 'sysconfdir: @0@'.format(sysconfdir),
414 'localstatedir: @0@'.format(localstatedir),
415 # 'modlibexecdir: @0@'.format(${modlibexecdir}),
416 'System Runtime Path: @0@'.format(cdata.get_unquoted('PA_SYSTEM_RUNTIME_PATH')),
417 'System State Path: @0@'.format(cdata.get_unquoted('PA_SYSTEM_STATE_PATH')),
418 'System Config Path: @0@'.format(cdata.get_unquoted('PA_SYSTEM_CONFIG_PATH')),
419 # 'Zsh completions directory: @0@'.format(${zshcompletiondir}),
420 # 'Bash completions directory: @0@'.format(${bashcompletiondir}),
421 'Compiler: @0@ @1@'.format(cc.get_id(), cc.version()),
422 # 'CFLAGS: @0@'.format(${CFLAGS}),
423 # 'CPPFLAGS: @0@'.format(${CPPFLAGS}),
424 # 'LIBS: @0@'.format(${LIBS}),
426 'Enable memfd shared memory: @0@'.format(cdata.has('HAVE_MEMFD')),
427 'Enable X11: @0@'.format(x11_dep.found()),
428 # 'Enable OSS Output: @0@'.format(${ENABLE_OSS_OUTPUT}),
429 # 'Enable OSS Wrapper: @0@'.format(${ENABLE_OSS_WRAPPER}),
430 # 'Enable EsounD: @0@'.format(${ENABLE_ESOUND}),
431 'Enable Alsa: @0@'.format(alsa_dep.found()),
432 # 'Enable CoreAudio: @0@'.format(${ENABLE_COREAUDIO}),
433 # 'Enable Solaris: @0@'.format(${ENABLE_SOLARIS}),
434 # 'Enable WaveOut: @0@'.format(${ENABLE_WAVEOUT}),
435 'Enable GLib 2: @0@'.format(glib_dep.found()),
436 # 'Enable GConf: @0@'.format(${ENABLE_GCONF}),
437 'Enable GSettings: @0@'.format(gio_dep.found()),
438 'Enable Gtk+ 3: @0@'.format(gtk_dep.found()),
439 'Enable Avahi: @0@'.format(avahi_dep.found()),
440 'Enable Jack: @0@'.format(jack_dep.found()),
441 'Enable Async DNS: @0@'.format(asyncns_dep.found()),
442 'Enable LIRC: @0@'.format(lirc_dep.found()),
443 'Enable D-Bus: @0@'.format(dbus_dep.found()),
444 ' Enable BlueZ 5: @0@'.format(bluez_dep.found()),
445 ' Enable native headsets: @0@'.format(get_option('bluez5-native-headset')),
446 ' Enable ofono headsets: @0@'.format(get_option('bluez5-ofono-headset')),
447 'Enable udev: @0@'.format(udev_dep.found()),
448 ' Enable HAL->udev compat: @0@'.format(get_option('hal-compat')),
449 'Enable systemd: @0@'.format(systemd_dep.found()),
450 # 'Enable TCP Wrappers: @0@'.format(${ENABLE_TCPWRAP}),
451 'Enable libsamplerate: @0@'.format(samplerate_dep.found()),
452 'Enable IPv6: @0@'.format(get_option('ipv6')),
453 'Enable OpenSSL (for Airtunes): @0@'.format(openssl_dep.found()),
454 'Enable FFTW: @0@'.format(fftw_dep.found()),
455 # 'Enable orc: @0@'.format(${ENABLE_ORC}),
456 'Enable Adrian echo canceller: @0@'.format(get_option('adrian-aec')),
457 'Enable Speex (resampler, AEC): @0@'.format(speex_dep.found()),
458 'Enable SoXR (resampler): @0@'.format(soxr_dep.found()),
459 'Enable WebRTC echo canceller: @0@'.format(webrtc_dep.found()),
460 # 'Enable gcov coverage: @0@'.format(${ENABLE_GCOV}),
461 # 'Enable unit tests: @0@'.format(${ENABLE_TESTS}),
463 'Database: @0@'.format(get_option('database')),
464 'Legacy Database Entry Support: @0@'.format(get_option('legacy-database-entry-format')),
465 'System User: @0@'.format(cdata.get_unquoted('PA_SYSTEM_USER')),
466 'System Group: @0@'.format(cdata.get_unquoted('PA_SYSTEM_GROUP')),
467 'Access Group: @0@'.format(cdata.get_unquoted('PA_ACCESS_GROUP')),
468 # 'Enable per-user EsounD socket: @0@'.format(${ENABLE_PER_USER_ESOUND_SOCKET}),
469 # 'Force preopen: @0@'.format(${FORCE_PREOPEN}),
470 # 'Preopened modules: @0@'.format(${PREOPEN_MODS}),
473 message('\n '.join(summary))
477 if not speex_dep.found() and not webrtc_dep.found() and not get_option('adrian-aec')
478 error('At least one echo canceller implementation must be available!')
481 if samplerate_dep.found()
482 warning('Support for libsamplerate is DEPRECATED')
485 if host_machine.system() != 'windows'
486 if not dbus_dep.found()
488 'You do not have D-Bus support enabled. It is strongly recommended',
489 'that you enable D-Bus support if your platform supports it.',
490 'Many parts of PulseAudio use D-Bus, from ConsoleKit interaction',
491 'to the Device Reservation Protocol to speak to JACK, Bluetooth',
492 'support and even a native control protocol for communicating and',
493 'controlling the PulseAudio daemon itself.',
495 warning('\n' + '\n'.join(message))
497 if not udev_dep.found()
499 'You do not have udev support enabled. It is strongly recommended',
500 'that you enable udev support if your platform supports it as it is',
501 'the primary method used to detect hardware audio devices (on Linux)',
502 'and is thus a critical part of PulseAudio on that platform.',
504 warning('\n' + '\n'.join(message))
506 if not speex_dep.found()
508 'You do not have speex support enabled. It is strongly recommended',
509 'that you enable speex support if your platform supports it as it is',
510 'the primary method used for audio resampling and is thus a critical',
511 'part of PulseAudio on that platform.',
513 warning('\n' + '\n'.join(message))