mirror of
				https://gitlab.freedesktop.org/pulseaudio/pulseaudio.git
				synced 2025-10-29 05:40:23 -04:00 
			
		
		
		
	
		
			
				
	
	
		
			873 lines
		
	
	
	
		
			27 KiB
		
	
	
	
		
			Meson
		
	
	
	
	
	
			
		
		
	
	
			873 lines
		
	
	
	
		
			27 KiB
		
	
	
	
		
			Meson
		
	
	
	
	
	
| project('pulseaudio', 'c', 'cpp',
 | |
|         version : run_command(find_program('git-version-gen'), join_paths(meson.current_source_dir(), '.tarball-version')).stdout().strip(),
 | |
|         meson_version : '>= 0.50.0',
 | |
|         default_options : [ 'c_std=gnu11', 'cpp_std=c++11' ]
 | |
|         )
 | |
| 
 | |
| pa_version_str = meson.project_version()
 | |
| # For tarballs, the first split will do nothing, but for builds in git, we
 | |
| # split out suffixes when there are commits since the last tag
 | |
| # (e.g.: v11.99.1-3-gad14bdb24 -> v11.99.1)
 | |
| version_split = pa_version_str.split('-')[0].split('.')
 | |
| pa_version_major = version_split[0].split('v')[0]
 | |
| pa_version_minor = version_split[1]
 | |
| if version_split.length() > 2
 | |
|   pa_version_micro = version_split[2]
 | |
| else
 | |
|   pa_version_micro = '0'
 | |
| endif
 | |
| pa_version_major_minor = pa_version_major + '.' + pa_version_minor
 | |
| 
 | |
| pa_api_version = 12
 | |
| pa_protocol_version = 33
 | |
| 
 | |
| # The stable ABI for client applications, for the version info x:y:z
 | |
| # always will hold y=z
 | |
| libpulse_version_info = [21, 0, 21]
 | |
| 
 | |
| # A simplified, synchronous, ABI-stable interface for client
 | |
| # applications, for the version info x:y:z always will hold y=z
 | |
| libpulse_simple_version_info = [1, 1, 1]
 | |
| 
 | |
| # The ABI-stable GLib adapter for client applications, for the version
 | |
| # info x:y:z always will hold y=z
 | |
| libpulse_mainloop_glib_version_info = [0, 5, 0]
 | |
| 
 | |
| libpulse_version = '@0@.@1@.@2@'.format(
 | |
|   libpulse_version_info[0] - libpulse_version_info[2],
 | |
|   libpulse_version_info[0],
 | |
|   libpulse_version_info[1],
 | |
| )
 | |
| 
 | |
| libpulse_simple_version = '@0@.@1@.@2@'.format(
 | |
|   libpulse_simple_version_info[0] - libpulse_simple_version_info[2],
 | |
|   libpulse_simple_version_info[0],
 | |
|   libpulse_simple_version_info[1],
 | |
| )
 | |
| 
 | |
| libpulse_mainloop_glib_version = '@0@.@1@.@2@'.format(
 | |
|   libpulse_mainloop_glib_version_info[0] - libpulse_mainloop_glib_version_info[2],
 | |
|   libpulse_mainloop_glib_version_info[0],
 | |
|   libpulse_mainloop_glib_version_info[1],
 | |
| )
 | |
| 
 | |
| # Paths
 | |
| 
 | |
| prefix = get_option('prefix')
 | |
| assert(prefix.startswith('/'), 'Prefix is not absolute: "@0@"'.format(prefix))
 | |
| 
 | |
| bindir = join_paths(prefix, get_option('bindir'))
 | |
| includedir = join_paths(prefix, get_option('includedir'))
 | |
| libdir = join_paths(prefix, get_option('libdir'))
 | |
| libexecdir = join_paths(prefix, get_option('libexecdir'))
 | |
| mandir = join_paths(prefix, get_option('mandir'))
 | |
| datadir = join_paths(prefix, get_option('datadir'))
 | |
| localedir = join_paths(prefix, get_option('localedir'))
 | |
| localstatedir = join_paths(prefix, get_option('localstatedir'))
 | |
| sysconfdir = join_paths(prefix, get_option('sysconfdir'))
 | |
| privlibdir = join_paths(libdir, 'pulseaudio')
 | |
| alsadatadir = join_paths(datadir, 'pulseaudio', 'alsa-mixer')
 | |
| 
 | |
| pkgconfigdir = join_paths(libdir, 'pkgconfig')
 | |
| pulselibexecdir = join_paths(libexecdir, 'pulse')
 | |
| pulsesysconfdir = join_paths(sysconfdir, 'pulse')
 | |
| 
 | |
| modlibexecdir = get_option('modlibexecdir')
 | |
| if modlibexecdir == ''
 | |
|   modlibexecdir = join_paths(libdir, 'pulse-' + pa_version_major_minor, 'modules')
 | |
| endif
 | |
| 
 | |
| padsplibdir = get_option('padsplibdir')
 | |
| if padsplibdir == ''
 | |
|   padsplibdir = privlibdir
 | |
| endif
 | |
| 
 | |
| pulsedsp_location = get_option('pulsedsp-location')
 | |
| if pulsedsp_location == ''
 | |
|   pulsedsp_location = join_paths(prefix, padsplibdir)
 | |
| endif
 | |
| 
 | |
| systemduserunitdir = get_option('systemduserunitdir')
 | |
| # the default value is set below
 | |
| 
 | |
| udevrulesdir = get_option('udevrulesdir')
 | |
| if udevrulesdir == ''
 | |
|   # absolute path, otherwise meson prepends the prefix
 | |
|   udevrulesdir = '/lib/udev/rules.d'
 | |
| endif
 | |
| 
 | |
| vapidir = join_paths(datadir, 'vala', 'vapi')
 | |
| 
 | |
| bashcompletiondir = get_option('bashcompletiondir')
 | |
| if bashcompletiondir == ''
 | |
|   bash_completion_dep = dependency('bash-completion', required : false)
 | |
|   if bash_completion_dep.found()
 | |
|     bashcompletiondir = bash_completion_dep.get_pkgconfig_variable('completionsdir')
 | |
|   else
 | |
|     bashcompletiondir = join_paths(datadir, 'bash-completion', 'completions')
 | |
|   endif
 | |
| endif
 | |
| 
 | |
| zshcompletiondir = get_option('zshcompletiondir')
 | |
| if zshcompletiondir == ''
 | |
|   zshcompletiondir = join_paths(datadir, 'zsh', 'site-functions')
 | |
| endif
 | |
| 
 | |
| # Configuration data
 | |
| 
 | |
| cc = meson.get_compiler('c')
 | |
| 
 | |
| cdata = configuration_data()
 | |
| cdata.set_quoted('PACKAGE', 'pulseaudio')
 | |
| cdata.set_quoted('PACKAGE_NAME', 'pulseaudio')
 | |
| cdata.set_quoted('PACKAGE_VERSION', pa_version_str)
 | |
| cdata.set_quoted('CANONICAL_HOST', host_machine.cpu())
 | |
| cdata.set('PA_MAJOR', pa_version_major)
 | |
| cdata.set('PA_MINOR', pa_version_minor)
 | |
| cdata.set('PA_API_VERSION', pa_api_version)
 | |
| cdata.set('PA_PROTOCOL_VERSION', pa_protocol_version)
 | |
| cdata.set_quoted('PA_MACHINE_ID', join_paths(sysconfdir, 'machine-id'))
 | |
| cdata.set_quoted('PA_MACHINE_ID_FALLBACK', join_paths(localstatedir, 'lib', 'dbus', 'machine-id'))
 | |
| cdata.set_quoted('PA_SRCDIR', join_paths(meson.current_source_dir(), 'src'))
 | |
| cdata.set_quoted('PA_BUILDDIR', meson.current_build_dir())
 | |
| cdata.set_quoted('PA_SOEXT', '.so')
 | |
| cdata.set_quoted('PA_DEFAULT_CONFIG_DIR', pulsesysconfdir)
 | |
| cdata.set_quoted('PA_BINARY', join_paths(bindir, 'pulseaudio'))
 | |
| cdata.set_quoted('PA_SYSTEM_RUNTIME_PATH', join_paths(localstatedir, 'run', 'pulse'))
 | |
| cdata.set_quoted('PA_SYSTEM_CONFIG_PATH', join_paths(localstatedir, 'lib', 'pulse'))
 | |
| cdata.set_quoted('PA_SYSTEM_STATE_PATH', join_paths(localstatedir, 'lib', 'pulse'))
 | |
| cdata.set_quoted('PA_DLSEARCHPATH', modlibexecdir)
 | |
| cdata.set_quoted('PA_SYSTEM_USER', get_option('system_user'))
 | |
| cdata.set_quoted('PA_SYSTEM_GROUP', get_option('system_group'))
 | |
| cdata.set_quoted('PA_ACCESS_GROUP', get_option('access_group'))
 | |
| cdata.set_quoted('PA_CFLAGS', 'Not yet supported on meson')
 | |
| cdata.set_quoted('PA_ALSA_PATHS_DIR', join_paths(alsadatadir, 'paths'))
 | |
| cdata.set_quoted('PA_ALSA_PROFILE_SETS_DIR', join_paths(alsadatadir, 'profile-sets'))
 | |
| cdata.set_quoted('DESKTOPFILEDIR', join_paths(datadir, 'applications'))
 | |
| cdata.set_quoted('PULSE_LOCALEDIR', localedir)
 | |
| cdata.set_quoted('GETTEXT_PACKAGE', 'pulseaudio')
 | |
| cdata.set('ENABLE_NLS', 1)
 | |
| 
 | |
| # Platform specifics
 | |
| # First some defaults to keep config file generation happy
 | |
| cdata.set('HAVE_COREAUDIO', 0)
 | |
| cdata.set('HAVE_WAVEOUT', 0)
 | |
| # FIXME: This was not tested. Maybe some flags should better be CFLAGS,
 | |
| # rather than ending up in the config.h file?
 | |
| if host_machine.system() == 'darwin'
 | |
|   cdata.set('OS_IS_DARWIN', 1)
 | |
|   cdata.set('_DARWIN_C_SOURCE', '200112L') # Needed to get NSIG on Mac OS
 | |
| elif host_machine.system() == 'windows'
 | |
|   cdata.set('OS_IS_WIN32', 1)
 | |
|   cdata.set('WIN32_LEAN_AND_MEAN', 1) # Needed to avoid including unnecessary headers on Windows
 | |
| #elif host_machine.system() == 'solaris'
 | |
| #  # Apparently meson has no solaris support?
 | |
| #  # Needed to get declarations for msg_control and msg_controllen on Solaris
 | |
| #  cdata.set('_XOPEN_SOURCE', 600)
 | |
| #  cdata.set('__EXTENSIONS__', 1)
 | |
| endif
 | |
| 
 | |
| if cc.has_type('_Bool')
 | |
|   cdata.set('HAVE_STD_BOOL', 1)
 | |
| endif
 | |
| 
 | |
| if host_machine.cpu_family() == 'x86_64' or cc.sizeof('void *') >= 8
 | |
|   cdata.set('HAVE_FAST_64BIT_OPERATIONS', 1)
 | |
| endif
 | |
| 
 | |
| # Headers
 | |
| 
 | |
| check_headers = [
 | |
|   'arpa/inet.h',
 | |
|   'byteswap.h',
 | |
|   'cpuid.h',
 | |
|   'dlfcn.h',
 | |
|   'execinfo.h',
 | |
|   'grp.h',
 | |
|   'langinfo.h',
 | |
|   'linux/sockios.h',
 | |
|   'locale.h',
 | |
|   'netdb.h',
 | |
|   'netinet/in.h',
 | |
|   'netinet/in_systm.h',
 | |
|   'netinet/ip.h',
 | |
|   'netinet/tcp.h',
 | |
|   'pcreposix.h',
 | |
|   'poll.h',
 | |
|   'pwd.h',
 | |
|   'regex.h',
 | |
|   'sched.h',
 | |
|   'stdint.h',
 | |
|   'sys/atomic.h',
 | |
|   'sys/capability.h',
 | |
|   'sys/conf.h',
 | |
|   'sys/dl.h',
 | |
|   'sys/eventfd.h',
 | |
|   'sys/filio.h',
 | |
|   'sys/ioctl.h',
 | |
|   'sys/mman.h',
 | |
|   'sys/prctl.h',
 | |
|   'sys/resource.h',
 | |
|   'sys/select.h',
 | |
|   'sys/socket.h',
 | |
|   'sys/syscall.h',
 | |
|   'sys/uio.h',
 | |
|   'sys/un.h',
 | |
|   'sys/wait.h',
 | |
|   'syslog.h',
 | |
|   'valgrind/memcheck.h',
 | |
|   'xlocale.h',
 | |
| ]
 | |
| 
 | |
| foreach h : check_headers
 | |
|   if cc.has_header(h)
 | |
|     define = 'HAVE_' + h.underscorify().to_upper()
 | |
|     cdata.set(define, 1)
 | |
|   endif
 | |
| endforeach
 | |
| 
 | |
| # FIXME: move this to the above set
 | |
| if cc.has_header('pthread.h')
 | |
|   cdata.set('HAVE_PTHREAD', 1)
 | |
| endif
 | |
| 
 | |
| if cc.has_header_symbol('pthread.h', 'PTHREAD_PRIO_INHERIT')
 | |
|   cdata.set('HAVE_PTHREAD_PRIO_INHERIT', 1)
 | |
| endif
 | |
| 
 | |
| # Functions
 | |
| 
 | |
| check_functions = [
 | |
|   'accept4',
 | |
|   'clock_gettime',
 | |
|   'ctime_r',
 | |
|   'fchmod',
 | |
|   'fchown',
 | |
|   'fork',
 | |
|   'fstat',
 | |
|   'getaddrinfo',
 | |
|   'getgrgid_r',
 | |
|   'getgrnam_r',
 | |
|   'getpwnam_r',
 | |
|   'getpwuid_r',
 | |
|   'gettimeofday',
 | |
|   'getuid',
 | |
|   'lrintf',
 | |
|   'lstat',
 | |
|   'memfd_create',
 | |
|   'mkfifo',
 | |
|   'mlock',
 | |
|   'nanosleep',
 | |
|   'open64',
 | |
|   'paccept',
 | |
|   'pipe',
 | |
|   'pipe2',
 | |
|   'posix_fadvise',
 | |
|   'posix_madvise',
 | |
|   'posix_memalign',
 | |
|   'ppoll',
 | |
|   'readlink',
 | |
|   'setegid',
 | |
|   'seteuid',
 | |
|   'setpgid',
 | |
|   'setregid',
 | |
|   'setresgid',
 | |
|   'setresuid',
 | |
|   'setreuid',
 | |
|   'setsid',
 | |
|   'sig2str',
 | |
|   'sigaction',
 | |
|   'strerror_r',
 | |
|   'strtod_l',
 | |
|   'strtof',
 | |
|   'symlink',
 | |
|   'sysconf',
 | |
|   'uname',
 | |
| ]
 | |
| 
 | |
| foreach f : check_functions
 | |
|   if cc.has_function(f)
 | |
|     define = 'HAVE_' + f.underscorify().to_upper()
 | |
|     cdata.set(define, 1)
 | |
|   endif
 | |
| endforeach
 | |
| 
 | |
| if cc.has_function('SYS_memfd_create', prefix : '#include <sys/syscall.h>')
 | |
|   cdata.set('HAVE_MEMFD', 1)
 | |
| endif
 | |
| 
 | |
| # Symbols
 | |
| 
 | |
| if cc.has_header_symbol('signal.h', 'SIGXCPU')
 | |
|   cdata.set('HAVE_SIGXCPU', 1)
 | |
| endif
 | |
| 
 | |
| if not cc.has_header_symbol('netinet/in.h', 'INADDR_NONE')
 | |
|   if not cc.has_header_symbol('winsock2.h', 'INADDR_NONE')
 | |
|     # Define INADDR_NONE if not found (Solaris)
 | |
|     cdata.set('INADDR_NONE', '0xffffffff')
 | |
|   endif
 | |
| endif
 | |
| 
 | |
| check_decls = [
 | |
|   [ 'environ', 'unistd.h', '#define _GNU_SOURCE' ],
 | |
|   [ 'SOUND_PCM_READ_RATE', 'sys/soundcard.h', '' ],
 | |
|   [ 'SOUND_PCM_READ_CHANNELS', 'sys/soundcard.h', '' ],
 | |
|   [ 'SOUND_PCM_READ_BITS', 'sys/soundcard.h', '' ],
 | |
| ]
 | |
| 
 | |
| foreach s : check_decls
 | |
|   if cc.has_header_symbol(s[1], s[0], prefix : s[2])
 | |
|     define = 'HAVE_DECL_' + s[0].to_upper()
 | |
|     cdata.set(define, 1)
 | |
|   endif
 | |
| endforeach
 | |
| 
 | |
| # Types
 | |
| 
 | |
| # FIXME: do we ever care about gid_t not being defined / smaller than an int?
 | |
| cdata.set('GETGROUPS_T', 'gid_t')
 | |
| 
 | |
| # Include paths
 | |
| 
 | |
| configinc = include_directories('.')
 | |
| topinc = include_directories('src')
 | |
| 
 | |
| # CFLAGS/LDFLAGS
 | |
| 
 | |
| pa_c_args = ['-DHAVE_CONFIG_H', '-D_GNU_SOURCE']
 | |
| server_c_args = ['-D__INCLUDED_FROM_PULSE_AUDIO']
 | |
| cdata.set('MESON_BUILD', 1)
 | |
| 
 | |
| # On ELF systems we don't want the libraries to be unloaded since we don't clean them up properly,
 | |
| # so we request the nodelete flag to be enabled.
 | |
| # On other systems, we don't really know how to do that, but it's welcome if somebody can tell.
 | |
| nodelete_link_args = ['-Wl,-z,nodelete']
 | |
| 
 | |
| # Code coverage
 | |
| 
 | |
| if get_option('gcov')
 | |
|   add_project_arguments('--coverage', language: ['c', 'cpp'])
 | |
|   add_project_link_arguments('--coverage', language: ['c', 'cpp'])
 | |
| endif
 | |
| 
 | |
| # Core Dependencies
 | |
| 
 | |
| libm_dep = cc.find_library('m', required : true)
 | |
| 
 | |
| thread_dep = dependency('threads')
 | |
| foreach f : [
 | |
|   'pthread_getname_np',
 | |
|   'pthread_setaffinity_np',
 | |
|   'pthread_setname_np',
 | |
| ]
 | |
|   if cc.has_function(f, dependencies : thread_dep)
 | |
|     define = 'HAVE_' + f.underscorify().to_upper()
 | |
|     cdata.set(define, 1)
 | |
|   endif
 | |
| endforeach
 | |
| 
 | |
| cap_dep = cc.find_library('cap', required : false)
 | |
| 
 | |
| shm_dep = cc.find_library('rt', required : false)
 | |
| if shm_dep.found()
 | |
|   cdata.set('HAVE_SHM_OPEN', 1)
 | |
| endif
 | |
| 
 | |
| dl_dep = cc.find_library('dl', required : false)
 | |
| if dl_dep.found()
 | |
|   cdata.set('HAVE_DLADDR', 1)
 | |
| endif
 | |
| 
 | |
| have_iconv = false
 | |
| if cc.has_function('iconv_open')
 | |
|   iconv_dep = dependency('', required : false)
 | |
|   have_iconv = true
 | |
| else
 | |
|   iconv_dep = cc.find_library('iconv', required : false)
 | |
|   have_iconv = iconv_dep.found()
 | |
| endif
 | |
| if have_iconv
 | |
|   cdata.set('HAVE_ICONV', 1)
 | |
|   iconvconsttest = '''#include <iconv.h>
 | |
| size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);
 | |
| '''
 | |
|   if cc.compiles(iconvconsttest, dependencies : iconv_dep)
 | |
|     cdata.set('ICONV_CONST', '')
 | |
|   else
 | |
|     cdata.set('ICONV_CONST', 'const')
 | |
|   endif
 | |
| endif
 | |
| 
 | |
| # Atomic operations
 | |
| 
 | |
| if get_option('atomic-arm-memory-barrier')
 | |
|     cdata.set('ATOMIC_ARM_MEMORY_BARRIER_ENABLED', 1)
 | |
| endif
 | |
| 
 | |
| need_libatomic_ops = false
 | |
| 
 | |
| atomictest = '''void func() {
 | |
|   volatile int atomic = 2;
 | |
|   __sync_bool_compare_and_swap (&atomic, 2, 3);
 | |
| }
 | |
| '''
 | |
| 
 | |
| if cc.compiles(atomictest)
 | |
|   cdata.set('HAVE_ATOMIC_BUILTINS', 1)
 | |
| 
 | |
|   newatomictest = '''void func() {
 | |
|     int c = 0;
 | |
|     __atomic_store_n(&c, 4, __ATOMIC_SEQ_CST);
 | |
|   }
 | |
|   '''
 | |
| 
 | |
|   if(cc.compiles(newatomictest))
 | |
|     cdata.set('HAVE_ATOMIC_BUILTINS_MEMORY_MODEL', 1)
 | |
|   endif
 | |
| 
 | |
| elif host_machine.cpu_family() == 'arm'
 | |
|   if host_machine.system() == 'linux' and get_option('atomic-arm-linux-helpers')
 | |
|     cdata.set('ATOMIC_ARM_LINUX_HELPERS', 1)
 | |
|   else
 | |
|     armatomictest = '''int func() {
 | |
|       volatile int a=0;
 | |
|       int o=0, n=1, r;
 | |
|       asm volatile (
 | |
| 	      "ldrex    %0, [%1]\n"
 | |
| 	      "subs  %0, %0, %2\n"
 | |
| 	      "strexeq %0, %3, [%1]\n"
 | |
| 	      : "=&r" (r)
 | |
| 	      : "r" (&a), "Ir" (o), "r" (n)
 | |
|       : "cc");
 | |
|       return (a==1 ? 0 : -1);
 | |
|     }
 | |
|     '''
 | |
| 
 | |
|     if cc.compiles(armatomictest)
 | |
|       cdata.set('ATOMIC_ARM_INLINE_ASM', 1)
 | |
|     else
 | |
|       need_libatomic_ops = true
 | |
|     endif
 | |
|   endif # arm && !linux
 | |
| 
 | |
| elif not ['freebsd', 'netbsd'].contains(host_machine.system())
 | |
|   need_libatomic_ops = true
 | |
| endif # !atomic helpers && !arm
 | |
| 
 | |
| if need_libatomic_ops
 | |
|   assert(cc.has_header('atomic_ops.h'), 'Need libatomic_ops')
 | |
| 
 | |
|   cdata.set('AO_REQUIRE_CAS', 1)
 | |
| 
 | |
|   if host_machine.system() != 'windows'
 | |
|     libatomic_ops_dep = cc.find_library('atomic_ops', required : true)
 | |
|   else
 | |
|     libatomic_ops_dep = dependency('', required: false)
 | |
|   endif
 | |
| else
 | |
|   libatomic_ops_dep = dependency('', required: false)
 | |
| endif
 | |
| 
 | |
| # ARM checks
 | |
| # ARMV6 instructions we need
 | |
| if host_machine.cpu_family() == 'arm'
 | |
|   armv6test = '''int func() {
 | |
|     volatile int a = -60000, b = 0xaaaabbbb, c = 0xccccdddd;
 | |
|     asm volatile ("ldr r0, %2 \n"
 | |
|                   "ldr r2, %3 \n"
 | |
|                   "ldr r3, %4 \n"
 | |
|                   "ssat r1, #8, r0 \n"
 | |
|                   "str r1, %0 \n"
 | |
|                   "pkhbt r1, r3, r2, LSL #8 \n"
 | |
|                   "str r1, %1 \n"
 | |
|                   : "=m" (a), "=m" (b)
 | |
|                   : "m" (a), "m" (b), "m" (c)
 | |
|                   : "r0", "r1", "r2", "r3", "cc");
 | |
|     return (a == -128 && b == 0xaabbdddd) ? 0 : -1;
 | |
|   }
 | |
|   '''
 | |
| 
 | |
|   if cc.compiles(armv6test)
 | |
|     cdata.set('HAVE_ARMV6', 1)
 | |
|   endif
 | |
| endif
 | |
| # NEON checks are automatically done by the unstable-simd module
 | |
| 
 | |
| # FIXME: make sure it's >= 2.2
 | |
| ltdl_dep = cc.find_library('ltdl', required : true)
 | |
| # FIXME: can meson support libtool -dlopen/-dlpreopen things?
 | |
| #        and do we still want to support this at all?
 | |
| cdata.set('DISABLE_LIBTOOL_PRELOAD', 1)
 | |
| 
 | |
| if get_option('database') == 'tdb'
 | |
|   database_dep = dependency('tdb')
 | |
| elif get_option('database') == 'gdbm'
 | |
|   database_dep = cc.find_library('gdbm', required : true)
 | |
| else
 | |
|   database_dep = dependency('', required: false)
 | |
| endif
 | |
| 
 | |
| if get_option('ipv6')
 | |
|   cdata.set('HAVE_IPV6', 1)
 | |
| endif
 | |
| 
 | |
| if get_option('legacy-database-entry-format')
 | |
|   cdata.set('ENABLE_LEGACY_DATABASE_ENTRY_FORMAT', 1)
 | |
| endif
 | |
| 
 | |
| if get_option('running-from-build-tree')
 | |
|   cdata.set('HAVE_RUNNING_FROM_BUILD_TREE', 1)
 | |
| endif
 | |
| 
 | |
| alsa_dep = dependency('alsa', version : '>= 1.0.24', required : get_option('alsa'))
 | |
| if alsa_dep.found()
 | |
|   cdata.set('HAVE_ALSA', 1)
 | |
|   cdata.set('HAVE_ALSA_UCM', 1)
 | |
| endif
 | |
| 
 | |
| asyncns_dep = dependency('libasyncns', version : '>= 0.1', required : get_option('asyncns'))
 | |
| if asyncns_dep.found()
 | |
|   cdata.set('HAVE_LIBASYNCNS', 1)
 | |
| endif
 | |
| 
 | |
| dbus_dep = dependency('dbus-1', version : '>= 1.4.12', required : get_option('dbus'))
 | |
| if dbus_dep.found()
 | |
|   cdata.set('HAVE_DBUS', 1)
 | |
| endif
 | |
| 
 | |
| gio_dep = dependency('gio-2.0', version : '>= 2.26.0', required : get_option('gsettings'))
 | |
| if gio_dep.found()
 | |
|   cdata.set('HAVE_GSETTINGS', 1)
 | |
| endif
 | |
| 
 | |
| glib_dep = dependency('glib-2.0', version : '>= 2.4.0', required: get_option('glib'))
 | |
| if glib_dep.found()
 | |
|   cdata.set('HAVE_GLIB', 1)
 | |
| endif
 | |
| 
 | |
| gtk_dep = dependency('gtk+-3.0', required : get_option('gtk'))
 | |
| if gtk_dep.found()
 | |
|   cdata.set('HAVE_GTK', 1)
 | |
| endif
 | |
| 
 | |
| have_orcc = false
 | |
| orcc_args = []
 | |
| orc_dep = dependency('orc-0.4', version : '>= 0.4.11', required : get_option('orc'))
 | |
| orcc = find_program('orcc', required : get_option('orc'))
 | |
| if orc_dep.found() and orcc.found()
 | |
|   have_orcc = true
 | |
|   orcc_args = [orcc]
 | |
|   #orcc_args = [orcc, '--include', 'glib.h']
 | |
|   cdata.set('HAVE_ORC', 1)
 | |
| else
 | |
|   cdata.set('DISABLE_ORC', 1)
 | |
| endif
 | |
| 
 | |
| samplerate_dep = dependency('samplerate', version : '>= 0.1.0', required : get_option('samplerate'))
 | |
| if samplerate_dep.found()
 | |
|   cdata.set('HAVE_LIBSAMPLERATE', 1)
 | |
| endif
 | |
| 
 | |
| sndfile_dep = dependency('sndfile', version : '>= 1.0.20')
 | |
| 
 | |
| soxr_dep = dependency('soxr', version : '>= 0.1.1', required : get_option('soxr'))
 | |
| if soxr_dep.found()
 | |
|   cdata.set('HAVE_SOXR', 1)
 | |
| endif
 | |
| 
 | |
| libsystemd_dep = dependency('libsystemd', required : get_option('systemd'))
 | |
| if libsystemd_dep.found()
 | |
|   cdata.set('HAVE_SYSTEMD_DAEMON', 1)
 | |
|   cdata.set('HAVE_SYSTEMD_LOGIN', 1)
 | |
|   cdata.set('HAVE_SYSTEMD_JOURNAL', 1)
 | |
| endif
 | |
| systemd_dep = dependency('systemd', required : get_option('systemd'))
 | |
| if systemd_dep.found() and systemduserunitdir == ''
 | |
|   systemduserunitdir = systemd_dep.get_pkgconfig_variable('systemduserunitdir')
 | |
| endif
 | |
| 
 | |
| x11_dep = dependency('x11-xcb', required : get_option('x11'))
 | |
| if x11_dep.found()
 | |
|   xcb_dep  = dependency('xcb',  required : true, version : '>= 1.6')
 | |
|   ice_dep  = dependency('ice',  required : true)
 | |
|   sm_dep   = dependency('sm',   required : true)
 | |
|   xtst_dep = dependency('xtst', required : true)
 | |
|   cdata.set('HAVE_X11', 1)
 | |
| endif
 | |
| 
 | |
| # Module dependencies
 | |
| 
 | |
| if cc.has_header('sys/soundcard.h')
 | |
|   cdata.set('HAVE_OSS_OUTPUT', 1)
 | |
|   cdata.set('HAVE_OSS_WRAPPER', 1)
 | |
|   cdata.set('PULSEDSP_LOCATION', pulsedsp_location)
 | |
| endif
 | |
| 
 | |
| if get_option('hal-compat')
 | |
|   cdata.set('HAVE_HAL_COMPAT', 1)
 | |
| endif
 | |
| 
 | |
| avahi_dep = dependency('avahi-client', version : '>= 0.6.0', required : get_option('avahi'), disabler : true)
 | |
| if avahi_dep.found()
 | |
|   cdata.set('HAVE_AVAHI', 1)
 | |
| endif
 | |
| 
 | |
| sbc_dep = dependency('sbc', version : '>= 1.0', required : false)
 | |
| if get_option('bluez5')
 | |
|   assert(dbus_dep.found(), 'BlueZ requires D-Bus support')
 | |
|   assert(sbc_dep.found(), 'BlueZ requires SBC support')
 | |
|   cdata.set('HAVE_SBC', 1)
 | |
|   cdata.set('HAVE_BLUEZ', 1)
 | |
|   cdata.set('HAVE_BLUEZ_5', 1)
 | |
|   if get_option('bluez5-native-headset')
 | |
|     cdata.set('HAVE_BLUEZ_5_NATIVE_HEADSET', 1)
 | |
|   endif
 | |
|   if get_option('bluez5-ofono-headset')
 | |
|     cdata.set('HAVE_BLUEZ_5_OFONO_HEADSET', 1)
 | |
|   endif
 | |
| endif
 | |
| 
 | |
| fftw_dep = dependency('fftw3f', required : get_option('fftw'))
 | |
| if fftw_dep.found()
 | |
|   cdata.set('HAVE_FFTW', 1)
 | |
| endif
 | |
| 
 | |
| jack_dep = dependency('jack', version : '>= 0.117.0', required : get_option('jack'))
 | |
| if jack_dep.found()
 | |
|   cdata.set('HAVE_JACK', 1)
 | |
| endif
 | |
| 
 | |
| lirc_dep = dependency('lirc', required : get_option('lirc'))
 | |
| if lirc_dep.found()
 | |
|   cdata.set('HAVE_LIRC', 1)
 | |
| endif
 | |
| 
 | |
| openssl_dep = dependency('openssl', version : '>= 0.9', required : get_option('openssl'))
 | |
| if openssl_dep.found()
 | |
|   cdata.set('HAVE_OPENSSL', 1)
 | |
| endif
 | |
| 
 | |
| speex_dep = dependency('speexdsp', version : '>= 1.2', required : get_option('speex'))
 | |
| if speex_dep.found()
 | |
|   cdata.set('HAVE_SPEEX', 1)
 | |
| endif
 | |
| 
 | |
| udev_dep = dependency('libudev', version : '>= 143', required : get_option('udev'))
 | |
| if udev_dep.found()
 | |
|   cdata.set('HAVE_UDEV', 1)
 | |
| endif
 | |
| 
 | |
| webrtc_dep = dependency('webrtc-audio-processing', version : '>= 0.2', required : get_option('webrtc-aec'))
 | |
| if webrtc_dep.found()
 | |
|   cdata.set('HAVE_WEBRTC', 1)
 | |
| endif
 | |
| 
 | |
| # These are required for the CMake file generation
 | |
| cdata.set('PA_LIBDIR', libdir)
 | |
| cdata.set('PA_INCDIR', includedir)
 | |
| if glib_dep.found()
 | |
|   cdata.set('HAVE_GLIB20', 1) # to match the AM_CONDITIONAL for CMake file generation
 | |
| endif
 | |
| 
 | |
| # Test dependencies
 | |
| 
 | |
| check_dep = dependency('check', version : '>= 0.9.10', required : get_option('tests'))
 | |
| 
 | |
| # Now generate config.h from everything above
 | |
| configure_file(output : 'config.h', configuration : cdata)
 | |
| 
 | |
| # pkg-config files
 | |
| 
 | |
| pc_cdata = configuration_data()
 | |
| 
 | |
| pc_cdata.set('prefix', prefix)
 | |
| pc_cdata.set('exec_prefix', prefix)
 | |
| pc_cdata.set('libdir', libdir)
 | |
| pc_cdata.set('includedir', includedir)
 | |
| pc_cdata.set('modlibexecdir', modlibexecdir)
 | |
| pc_cdata.set('PACKAGE_VERSION', pa_version_str)
 | |
| pc_cdata.set('PA_MAJORMINOR', pa_version_major_minor)
 | |
| # FIXME: the line below is wrong. Currently the meson thread dep lacks documentation,
 | |
| # and doesn't allow introspection, ie. none of get_pkgconfig_variable() or
 | |
| # get_configtool_variable() work with it, so we have no way to get this flag right,
 | |
| # unless we do all the work ourselves. See current work in glib, also meson #553.
 | |
| pc_cdata.set('PTHREAD_LIBS', '-pthread')
 | |
| 
 | |
| pc_files = [
 | |
|   'libpulse.pc',
 | |
|   'libpulse-simple.pc',
 | |
| ]
 | |
| 
 | |
| if glib_dep.found()
 | |
|   pc_files += 'libpulse-mainloop-glib.pc'
 | |
| endif
 | |
| 
 | |
| foreach file : pc_files
 | |
|   configure_file(
 | |
|     input : file + '.in',
 | |
|     output : file,
 | |
|     configuration : pc_cdata,
 | |
|     install_dir : pkgconfigdir)
 | |
| endforeach
 | |
| 
 | |
| # CMake files
 | |
| 
 | |
| m4 = find_program('m4', required: true)
 | |
| 
 | |
| cmakedir = join_paths(libdir, 'cmake', 'PulseAudio')
 | |
| 
 | |
| cmake_template_file = configure_file(
 | |
|   input : 'PulseAudioConfig.cmake.in',
 | |
|   output : 'PulseAudioConfig.cmake.tmp',
 | |
|   configuration: cdata,
 | |
| )
 | |
| 
 | |
| custom_target('PulseAudioConfig.cmake',
 | |
|   input : cmake_template_file,
 | |
|   output : 'PulseAudioConfig.cmake',
 | |
|   capture : true,
 | |
|   command : [m4, '@INPUT@'],
 | |
|   build_by_default : true,
 | |
|   install : true,
 | |
|   install_dir : cmakedir,
 | |
| )
 | |
| 
 | |
| configure_file(
 | |
|   input : 'PulseAudioConfigVersion.cmake.in',
 | |
|   output : 'PulseAudioConfigVersion.cmake',
 | |
|   configuration: cdata,
 | |
|   install : true,
 | |
|   install_dir : cmakedir,
 | |
| )
 | |
| 
 | |
| # Subdirs
 | |
| 
 | |
| subdir('po')
 | |
| if get_option('man')
 | |
|   subdir('man')
 | |
| endif
 | |
| subdir('shell-completion/bash')
 | |
| subdir('shell-completion/zsh')
 | |
| subdir('src')
 | |
| subdir('vala')
 | |
| 
 | |
| ############################################################
 | |
| 
 | |
| # Final summary
 | |
| 
 | |
| summary = [
 | |
|   '',
 | |
|   '---{ @0@ @1@ }---'.format(meson.project_name(), meson.project_version()),
 | |
|   '',
 | |
|   'prefix:                        @0@'.format(prefix),
 | |
|   'bindir:                        @0@'.format(bindir),
 | |
|   'libdir:                        @0@'.format(libdir),
 | |
|   'libexecdir:                    @0@'.format(libexecdir),
 | |
|   'mandir:                        @0@'.format(mandir),
 | |
|   'datadir:                       @0@'.format(datadir),
 | |
|   'sysconfdir:                    @0@'.format(sysconfdir),
 | |
|   'localstatedir:                 @0@'.format(localstatedir),
 | |
|   'modlibexecdir:                 @0@'.format(modlibexecdir),
 | |
|   'System Runtime Path:           @0@'.format(cdata.get_unquoted('PA_SYSTEM_RUNTIME_PATH')),
 | |
|   'System State Path:             @0@'.format(cdata.get_unquoted('PA_SYSTEM_STATE_PATH')),
 | |
|   'System Config Path:            @0@'.format(cdata.get_unquoted('PA_SYSTEM_CONFIG_PATH')),
 | |
|   'Bash completions directory:    @0@'.format(bashcompletiondir),
 | |
|   'Zsh completions directory:     @0@'.format(zshcompletiondir),
 | |
|   'Compiler:                      @0@ @1@'.format(cc.get_id(), cc.version()),
 | |
| #  'CFLAGS:                        @0@'.format(${CFLAGS}),
 | |
| #  'CPPFLAGS:                      @0@'.format(${CPPFLAGS}),
 | |
| #  'LIBS:                          @0@'.format(${LIBS}),
 | |
|   '',
 | |
|   'Enable memfd shared memory:    @0@'.format(cdata.has('HAVE_MEMFD')),
 | |
|   'Enable X11:                    @0@'.format(x11_dep.found()),
 | |
| #  'Enable OSS Output:             @0@'.format(${ENABLE_OSS_OUTPUT}),
 | |
| #  'Enable OSS Wrapper:            @0@'.format(${ENABLE_OSS_WRAPPER}),
 | |
| #  'Enable EsounD:                 @0@'.format(${ENABLE_ESOUND}),
 | |
|   'Enable Alsa:                   @0@'.format(alsa_dep.found()),
 | |
| #  'Enable CoreAudio:              @0@'.format(${ENABLE_COREAUDIO}),
 | |
| #  'Enable Solaris:                @0@'.format(${ENABLE_SOLARIS}),
 | |
| #  'Enable WaveOut:                @0@'.format(${ENABLE_WAVEOUT}),
 | |
|   'Enable GLib 2:                 @0@'.format(glib_dep.found()),
 | |
| #  'Enable GConf:                  @0@'.format(${ENABLE_GCONF}),
 | |
|   'Enable GSettings:              @0@'.format(gio_dep.found()),
 | |
|   'Enable Gtk+ 3:                 @0@'.format(gtk_dep.found()),
 | |
|   'Enable Avahi:                  @0@'.format(avahi_dep.found()),
 | |
|   'Enable Jack:                   @0@'.format(jack_dep.found()),
 | |
|   'Enable Async DNS:              @0@'.format(asyncns_dep.found()),
 | |
|   'Enable LIRC:                   @0@'.format(lirc_dep.found()),
 | |
|   'Enable D-Bus:                  @0@'.format(dbus_dep.found()),
 | |
|   '  Enable BlueZ 5:              @0@'.format(get_option('bluez5')),
 | |
|   '    Enable native headsets:    @0@'.format(get_option('bluez5-native-headset')),
 | |
|   '    Enable  ofono headsets:    @0@'.format(get_option('bluez5-ofono-headset')),
 | |
|   'Enable udev:                   @0@'.format(udev_dep.found()),
 | |
|   '  Enable HAL->udev compat:     @0@'.format(get_option('hal-compat')),
 | |
|   'Enable systemd:                @0@'.format(libsystemd_dep.found()),
 | |
| #  'Enable TCP Wrappers:           @0@'.format(${ENABLE_TCPWRAP}),
 | |
|   'Enable libsamplerate:          @0@'.format(samplerate_dep.found()),
 | |
|   'Enable IPv6:                   @0@'.format(get_option('ipv6')),
 | |
|   'Enable OpenSSL (for Airtunes): @0@'.format(openssl_dep.found()),
 | |
|   'Enable FFTW:                   @0@'.format(fftw_dep.found()),
 | |
|   'Enable ORC:                    @0@'.format(have_orcc),
 | |
|   'Enable Adrian echo canceller:  @0@'.format(get_option('adrian-aec')),
 | |
|   'Enable Speex (resampler, AEC): @0@'.format(speex_dep.found()),
 | |
|   'Enable SoXR (resampler):       @0@'.format(soxr_dep.found()),
 | |
|   'Enable WebRTC echo canceller:  @0@'.format(webrtc_dep.found()),
 | |
|   'Enable Gcov coverage:          @0@'.format(get_option('gcov')),
 | |
|   'Enable man pages:              @0@'.format(get_option('man')),
 | |
|   'Enable unit tests:             @0@'.format(get_option('tests')),
 | |
|   '',
 | |
|   'Database:                      @0@'.format(get_option('database')),
 | |
|   'Legacy Database Entry Support: @0@'.format(get_option('legacy-database-entry-format')),
 | |
|   'Running from build tree:       @0@'.format(get_option('running-from-build-tree')),
 | |
|   'System User:                   @0@'.format(cdata.get_unquoted('PA_SYSTEM_USER')),
 | |
|   'System Group:                  @0@'.format(cdata.get_unquoted('PA_SYSTEM_GROUP')),
 | |
|   'Access Group:                  @0@'.format(cdata.get_unquoted('PA_ACCESS_GROUP')),
 | |
| #  'Enable per-user EsounD socket: @0@'.format(${ENABLE_PER_USER_ESOUND_SOCKET}),
 | |
| #  'Force preopen:                 @0@'.format(${FORCE_PREOPEN}),
 | |
| #  'Preopened modules:             @0@'.format(${PREOPEN_MODS}),
 | |
| ]
 | |
| 
 | |
| message('\n    '.join(summary))
 | |
| 
 | |
| # Sanity checks
 | |
| 
 | |
| if not speex_dep.found() and not webrtc_dep.found() and not get_option('adrian-aec')
 | |
|   error('At least one echo canceller implementation must be available!')
 | |
| endif
 | |
| 
 | |
| if samplerate_dep.found()
 | |
|   warning('Support for libsamplerate is DEPRECATED')
 | |
| endif
 | |
| 
 | |
| if host_machine.system() != 'windows'
 | |
|   if not dbus_dep.found()
 | |
|     message = [
 | |
|       'You do not have D-Bus support enabled. It is strongly recommended',
 | |
|       'that you enable D-Bus support if your platform supports it.',
 | |
|       'Many parts of PulseAudio use D-Bus, from ConsoleKit interaction',
 | |
|       'to the Device Reservation Protocol to speak to JACK, Bluetooth',
 | |
|       'support and even a native control protocol for communicating and',
 | |
|       'controlling the PulseAudio daemon itself.',
 | |
|     ]
 | |
|     warning('\n' + '\n'.join(message))
 | |
|   endif
 | |
|   if not udev_dep.found()
 | |
|     message = [
 | |
|       'You do not have udev support enabled. It is strongly recommended',
 | |
|       'that you enable udev support if your platform supports it as it is',
 | |
|       'the primary method used to detect hardware audio devices (on Linux)',
 | |
|       'and is thus a critical part of PulseAudio on that platform.',
 | |
|     ]
 | |
|     warning('\n' + '\n'.join(message))
 | |
|   endif
 | |
|   if not speex_dep.found()
 | |
|     message = [
 | |
|       'You do not have speex support enabled. It is strongly recommended',
 | |
|       'that you enable speex support if your platform supports it as it is',
 | |
|       'the primary method used for audio resampling and is thus a critical',
 | |
|       'part of PulseAudio on that platform.',
 | |
|     ]
 | |
|     warning('\n' + '\n'.join(message))
 | |
|   endif
 | |
| endif
 | 
