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