13b087f79SPaolo Bonziniproject('qemu', ['c'], meson_version: '>=0.63.0', 2654d6b04SPaolo Bonzini default_options: ['warning_level=1', 'c_std=gnu11', 'cpp_std=gnu++11', 'b_colorout=auto', 30a31e3a0SPaolo Bonzini 'b_staticpic=false', 'stdsplit=false', 'optimization=2', 'b_pie=true'], 4654d6b04SPaolo Bonzini version: files('VERSION')) 5a5665051SPaolo Bonzini 6e287072bSThomas Huthadd_test_setup('quick', exclude_suites: ['slow', 'thorough'], is_default: true) 7e287072bSThomas Huthadd_test_setup('slow', exclude_suites: ['thorough'], env: ['G_TEST_SLOW=1', 'SPEED=slow']) 8e287072bSThomas Huthadd_test_setup('thorough', env: ['G_TEST_SLOW=1', 'SPEED=thorough']) 93d2f73efSPaolo Bonzini 10cf60ccc3SAkihiko Odakimeson.add_postconf_script(find_program('scripts/symlink-install-tree.py')) 11cf60ccc3SAkihiko Odaki 12a5665051SPaolo Bonzininot_found = dependency('', required: false) 13b29b40f4SPaolo Bonzinikeyval = import('keyval') 14a81df1b6SPaolo Bonziniss = import('sourceset') 158b18cdbfSRichard Hendersonfs = import('fs') 16a81df1b6SPaolo Bonzini 17e5134024SPaolo Bonzinitargetos = host_machine.system() 18ce1c1e7aSPaolo Bonzinish = find_program('sh') 19a5665051SPaolo Bonziniconfig_host = keyval.load(meson.current_build_dir() / 'config-host.mak') 20d7dedf42SPaolo Bonzini 21e5134024SPaolo Bonzinicc = meson.get_compiler('c') 22e5134024SPaolo Bonziniall_languages = ['c'] 236db77bb2SThomas Huthif targetos == 'windows' and add_languages('cpp', required: false, native: false) 24e5134024SPaolo Bonzini all_languages += ['cpp'] 25e5134024SPaolo Bonzini cxx = meson.get_compiler('cpp') 26e5134024SPaolo Bonziniendif 27e5134024SPaolo Bonziniif targetos == 'darwin' and \ 28e5134024SPaolo Bonzini add_languages('objc', required: get_option('cocoa'), native: false) 29e5134024SPaolo Bonzini all_languages += ['objc'] 30e5134024SPaolo Bonzini objc = meson.get_compiler('objc') 31e5134024SPaolo Bonziniendif 32e5134024SPaolo Bonzini 33e3667660SYonggang Luo# Temporary directory used for files created while 34e3667660SYonggang Luo# configure runs. Since it is in the build directory 35e3667660SYonggang Luo# we can safely blow away any previous version of it 36e3667660SYonggang Luo# (and we need not jump through hoops to try to delete 37e3667660SYonggang Luo# it when configure exits.) 38e3667660SYonggang Luotmpdir = meson.current_build_dir() / 'meson-private/temp' 398fe11232SMarc-André Lureau 408fe11232SMarc-André Lureauif get_option('qemu_suffix').startswith('/') 418fe11232SMarc-André Lureau error('qemu_suffix cannot start with a /') 428fe11232SMarc-André Lureauendif 438fe11232SMarc-André Lureau 4416bf7a33SPaolo Bonziniqemu_confdir = get_option('sysconfdir') / get_option('qemu_suffix') 45ab4c0996SMarc-André Lureauqemu_datadir = get_option('datadir') / get_option('qemu_suffix') 46491e74c1SMarc-André Lureauqemu_docdir = get_option('docdir') / get_option('qemu_suffix') 4716bf7a33SPaolo Bonziniqemu_moddir = get_option('libdir') / get_option('qemu_suffix') 4816bf7a33SPaolo Bonzini 4916bf7a33SPaolo Bonziniqemu_desktopdir = get_option('datadir') / 'applications' 5016bf7a33SPaolo Bonziniqemu_icondir = get_option('datadir') / 'icons' 5116bf7a33SPaolo Bonzini 52859aef02SPaolo Bonziniconfig_host_data = configuration_data() 53859aef02SPaolo Bonzinigenh = [] 54b83a80e8SVladimir Sementsov-Ogievskiyqapi_trace_events = [] 55a5665051SPaolo Bonzini 5620cf5cb4SPaolo Bonzinibsd_oses = ['gnu/kfreebsd', 'freebsd', 'netbsd', 'openbsd', 'dragonfly', 'darwin'] 57201e8ed7SPaolo Bonzinisupported_oses = ['windows', 'freebsd', 'netbsd', 'openbsd', 'darwin', 'sunos', 'linux'] 58278c1bceSPhilippe Mathieu-Daudésupported_cpus = ['ppc', 'ppc64', 's390x', 'riscv32', 'riscv64', 'x86', 'x86_64', 596d0b52edSRichard Henderson 'arm', 'aarch64', 'loongarch64', 'mips', 'mips64', 'sparc64'] 60201e8ed7SPaolo Bonzini 61201e8ed7SPaolo Bonzinicpu = host_machine.cpu_family() 62c94c2394SRichard Henderson 6320cf5cb4SPaolo Bonzinitarget_dirs = config_host['TARGET_DIRS'].split() 6420cf5cb4SPaolo Bonzinihave_linux_user = false 6520cf5cb4SPaolo Bonzinihave_bsd_user = false 6620cf5cb4SPaolo Bonzinihave_system = false 6720cf5cb4SPaolo Bonziniforeach target : target_dirs 6820cf5cb4SPaolo Bonzini have_linux_user = have_linux_user or target.endswith('linux-user') 6920cf5cb4SPaolo Bonzini have_bsd_user = have_bsd_user or target.endswith('bsd-user') 7020cf5cb4SPaolo Bonzini have_system = have_system or target.endswith('-softmmu') 7120cf5cb4SPaolo Bonziniendforeach 7220cf5cb4SPaolo Bonzinihave_user = have_linux_user or have_bsd_user 7320cf5cb4SPaolo Bonzinihave_tools = get_option('tools') \ 7420cf5cb4SPaolo Bonzini .disable_auto_if(not have_system) \ 7520cf5cb4SPaolo Bonzini .allowed() 7620cf5cb4SPaolo Bonzinihave_ga = get_option('guest_agent') \ 7720cf5cb4SPaolo Bonzini .disable_auto_if(not have_system and not have_tools) \ 7828236ad8SBrad Smith .require(targetos in ['sunos', 'linux', 'windows', 'freebsd', 'netbsd', 'openbsd'], 7920cf5cb4SPaolo Bonzini error_message: 'unsupported OS for QEMU guest agent') \ 8020cf5cb4SPaolo Bonzini .allowed() 816002711cSPaolo Bonzinienable_modules = get_option('modules') \ 826002711cSPaolo Bonzini .require(targetos != 'windows', 836002711cSPaolo Bonzini error_message: 'Modules are not available for Windows') \ 846002711cSPaolo Bonzini .require(not get_option('prefer_static'), 856002711cSPaolo Bonzini error_message: 'Modules are incompatible with static linking') \ 866002711cSPaolo Bonzini .allowed() 8720cf5cb4SPaolo Bonzinihave_block = have_system or have_tools 8820cf5cb4SPaolo Bonzini 8920cf5cb4SPaolo Bonzinipython = import('python').find_installation() 9020cf5cb4SPaolo Bonzini 91823eb013SPaolo Bonziniif cpu not in supported_cpus 92823eb013SPaolo Bonzini host_arch = 'unknown' 93823eb013SPaolo Bonzinielif cpu == 'x86' 94823eb013SPaolo Bonzini host_arch = 'i386' 950e3ed77dSRichard Hendersonelif cpu == 'mips64' 960e3ed77dSRichard Henderson host_arch = 'mips' 97278c1bceSPhilippe Mathieu-Daudéelif cpu in ['riscv32', 'riscv64'] 98278c1bceSPhilippe Mathieu-Daudé host_arch = 'riscv' 99823eb013SPaolo Bonzinielse 100823eb013SPaolo Bonzini host_arch = cpu 101823eb013SPaolo Bonziniendif 102823eb013SPaolo Bonzini 1038a19980eSPaolo Bonziniif cpu in ['x86', 'x86_64'] 1048a19980eSPaolo Bonzini kvm_targets = ['i386-softmmu', 'x86_64-softmmu'] 1058a19980eSPaolo Bonzinielif cpu == 'aarch64' 1068a19980eSPaolo Bonzini kvm_targets = ['aarch64-softmmu'] 1078a19980eSPaolo Bonzinielif cpu == 's390x' 1088a19980eSPaolo Bonzini kvm_targets = ['s390x-softmmu'] 1098a19980eSPaolo Bonzinielif cpu in ['ppc', 'ppc64'] 1108a19980eSPaolo Bonzini kvm_targets = ['ppc-softmmu', 'ppc64-softmmu'] 111fbc5884cSHuacai Chenelif cpu in ['mips', 'mips64'] 112fbc5884cSHuacai Chen kvm_targets = ['mips-softmmu', 'mipsel-softmmu', 'mips64-softmmu', 'mips64el-softmmu'] 1134de81093SPhilippe Mathieu-Daudéelif cpu in ['riscv32'] 1144de81093SPhilippe Mathieu-Daudé kvm_targets = ['riscv32-softmmu'] 1154de81093SPhilippe Mathieu-Daudéelif cpu in ['riscv64'] 1164de81093SPhilippe Mathieu-Daudé kvm_targets = ['riscv64-softmmu'] 1178a19980eSPaolo Bonzinielse 1188a19980eSPaolo Bonzini kvm_targets = [] 1198a19980eSPaolo Bonziniendif 1208a19980eSPaolo Bonzini 12144d3d898SIgor Mammedovkvm_targets_c = '""' 12243a363aeSPaolo Bonziniif get_option('kvm').allowed() and targetos == 'linux' 123e741aff0SIgor Mammedov kvm_targets_c = '"' + '" ,"'.join(kvm_targets) + '"' 124e741aff0SIgor Mammedovendif 125e741aff0SIgor Mammedovconfig_host_data.set('CONFIG_KVM_TARGETS', kvm_targets_c) 126e741aff0SIgor Mammedov 1278a19980eSPaolo Bonziniaccelerator_targets = { 'CONFIG_KVM': kvm_targets } 128844a06bbSAlexander Graf 129844a06bbSAlexander Grafif cpu in ['aarch64'] 130844a06bbSAlexander Graf accelerator_targets += { 131844a06bbSAlexander Graf 'CONFIG_HVF': ['aarch64-softmmu'] 132844a06bbSAlexander Graf } 133844a06bbSAlexander Grafendif 134844a06bbSAlexander Graf 1350c3e41d4SAlex Bennéeif cpu in ['x86', 'x86_64', 'arm', 'aarch64'] 1362a2d51bcSMarc-André Lureau # i386 emulator provides xenpv machine type for multiple architectures 1370c3e41d4SAlex Bennée accelerator_targets += { 138aaea616dSVikram Garhwal 'CONFIG_XEN': ['i386-softmmu', 'x86_64-softmmu', 'aarch64-softmmu'], 1390c3e41d4SAlex Bennée } 1400c3e41d4SAlex Bennéeendif 1418a19980eSPaolo Bonziniif cpu in ['x86', 'x86_64'] 1428a19980eSPaolo Bonzini accelerator_targets += { 1438a19980eSPaolo Bonzini 'CONFIG_HAX': ['i386-softmmu', 'x86_64-softmmu'], 1448a19980eSPaolo Bonzini 'CONFIG_HVF': ['x86_64-softmmu'], 14574a414a1SReinoud Zandijk 'CONFIG_NVMM': ['i386-softmmu', 'x86_64-softmmu'], 1468a19980eSPaolo Bonzini 'CONFIG_WHPX': ['i386-softmmu', 'x86_64-softmmu'], 1478a19980eSPaolo Bonzini } 1488a19980eSPaolo Bonziniendif 1498a19980eSPaolo Bonzini 150a1b176f9SPaolo Bonzinimodular_tcg = [] 151a1b176f9SPaolo Bonzini# Darwin does not support references to thread-local variables in modules 152a1b176f9SPaolo Bonziniif targetos != 'darwin' 153dae0ec15SGerd Hoffmann modular_tcg = ['i386-softmmu', 'x86_64-softmmu'] 154a1b176f9SPaolo Bonziniendif 155dae0ec15SGerd Hoffmann 156eae9a1d1SPhilippe Mathieu-Daudéedk2_targets = [ 'arm-softmmu', 'aarch64-softmmu', 'i386-softmmu', 'x86_64-softmmu' ] 157e49c0ef6SPaolo Bonziniunpack_edk2_blobs = false 158e49c0ef6SPaolo Bonziniforeach target : edk2_targets 159e49c0ef6SPaolo Bonzini if target in target_dirs 160e49c0ef6SPaolo Bonzini bzip2 = find_program('bzip2', required: get_option('install_blobs')) 161e49c0ef6SPaolo Bonzini unpack_edk2_blobs = bzip2.found() 162e49c0ef6SPaolo Bonzini break 163eae9a1d1SPhilippe Mathieu-Daudé endif 164e49c0ef6SPaolo Bonziniendforeach 16545b545ddSPhilippe Mathieu-Daudé 1669c29b741SPaolo Bonzinidtrace = not_found 1679c29b741SPaolo Bonzinistap = not_found 1689c29b741SPaolo Bonziniif 'dtrace' in get_option('trace_backends') 1699c29b741SPaolo Bonzini dtrace = find_program('dtrace', required: true) 1709c29b741SPaolo Bonzini stap = find_program('stap', required: false) 1719c29b741SPaolo Bonzini if stap.found() 1729c29b741SPaolo Bonzini # Workaround to avoid dtrace(1) producing a file with 'hidden' symbol 1739c29b741SPaolo Bonzini # visibility. Define STAP_SDT_V2 to produce 'default' symbol visibility 1749c29b741SPaolo Bonzini # instead. QEMU --enable-modules depends on this because the SystemTap 1759c29b741SPaolo Bonzini # semaphores are linked into the main binary and not the module's shared 1769c29b741SPaolo Bonzini # object. 1779c29b741SPaolo Bonzini add_global_arguments('-DSTAP_SDT_V2', 178e5134024SPaolo Bonzini native: false, language: all_languages) 1799c29b741SPaolo Bonzini endif 1809c29b741SPaolo Bonziniendif 1819c29b741SPaolo Bonzini 18240c909f5SPaolo Bonziniif get_option('iasl') == '' 18340c909f5SPaolo Bonzini iasl = find_program('iasl', required: false) 18440c909f5SPaolo Bonzinielse 18540c909f5SPaolo Bonzini iasl = find_program(get_option('iasl'), required: true) 18640c909f5SPaolo Bonziniendif 18740c909f5SPaolo Bonzini 188201e8ed7SPaolo Bonzini################## 189201e8ed7SPaolo Bonzini# Compiler flags # 190201e8ed7SPaolo Bonzini################## 191201e8ed7SPaolo Bonzini 19213f60de8SPaolo Bonziniforeach lang : all_languages 19313f60de8SPaolo Bonzini compiler = meson.get_compiler(lang) 19413f60de8SPaolo Bonzini if compiler.get_id() == 'gcc' and compiler.version().version_compare('>=7.4') 19513f60de8SPaolo Bonzini # ok 19613f60de8SPaolo Bonzini elif compiler.get_id() == 'clang' and compiler.compiles(''' 19713f60de8SPaolo Bonzini #ifdef __apple_build_version__ 19813f60de8SPaolo Bonzini # if __clang_major__ < 12 || (__clang_major__ == 12 && __clang_minor__ < 0) 19913f60de8SPaolo Bonzini # error You need at least XCode Clang v12.0 to compile QEMU 20013f60de8SPaolo Bonzini # endif 20113f60de8SPaolo Bonzini #else 20213f60de8SPaolo Bonzini # if __clang_major__ < 10 || (__clang_major__ == 10 && __clang_minor__ < 0) 20313f60de8SPaolo Bonzini # error You need at least Clang v10.0 to compile QEMU 20413f60de8SPaolo Bonzini # endif 20513f60de8SPaolo Bonzini #endif''') 20613f60de8SPaolo Bonzini # ok 20713f60de8SPaolo Bonzini else 20813f60de8SPaolo Bonzini error('You either need GCC v7.4 or Clang v10.0 (or XCode Clang v12.0) to compile QEMU') 20913f60de8SPaolo Bonzini endif 21013f60de8SPaolo Bonziniendforeach 21113f60de8SPaolo Bonzini 212a988b4c5SPaolo Bonzini# default flags for all hosts 213a988b4c5SPaolo Bonzini# We use -fwrapv to tell the compiler that we require a C dialect where 214a988b4c5SPaolo Bonzini# left shift of signed integers is well defined and has the expected 215a988b4c5SPaolo Bonzini# 2s-complement style results. (Both clang and gcc agree that it 216a988b4c5SPaolo Bonzini# provides these semantics.) 217a988b4c5SPaolo Bonzini 218a988b4c5SPaolo Bonziniqemu_common_flags = [ 219a988b4c5SPaolo Bonzini '-D_GNU_SOURCE', '-D_FILE_OFFSET_BITS=64', '-D_LARGEFILE_SOURCE', 220a988b4c5SPaolo Bonzini '-fno-strict-aliasing', '-fno-common', '-fwrapv' ] 221d67212d4SPaolo Bonziniqemu_cflags = [] 222911d4caaSPaolo Bonziniqemu_ldflags = [] 2238cc2d231SPaolo Bonzini 224a988b4c5SPaolo Bonziniif targetos == 'darwin' 225a988b4c5SPaolo Bonzini # Disable attempts to use ObjectiveC features in os/object.h since they 226a988b4c5SPaolo Bonzini # won't work when we're compiling with gcc as a C compiler. 227a988b4c5SPaolo Bonzini qemu_common_flags += '-DOS_OBJECT_USE_OBJC=0' 228a988b4c5SPaolo Bonzinielif targetos == 'solaris' 229a988b4c5SPaolo Bonzini # needed for CMSG_ macros in sys/socket.h 230a988b4c5SPaolo Bonzini qemu_common_flags += '-D_XOPEN_SOURCE=600' 231a988b4c5SPaolo Bonzini # needed for TIOCWIN* defines in termios.h 232a988b4c5SPaolo Bonzini qemu_common_flags += '-D__EXTENSIONS__' 233a988b4c5SPaolo Bonzinielif targetos == 'haiku' 234a988b4c5SPaolo Bonzini qemu_common_flags += ['-DB_USE_POSITIVE_POSIX_ERRORS', '-D_BSD_SOURCE', '-fPIC'] 235a988b4c5SPaolo Bonziniendif 236a988b4c5SPaolo Bonzini 237a988b4c5SPaolo Bonzini# __sync_fetch_and_and requires at least -march=i486. Many toolchains 238a988b4c5SPaolo Bonzini# use i686 as default anyway, but for those that don't, an explicit 239a988b4c5SPaolo Bonzini# specification is necessary 240a988b4c5SPaolo Bonziniif host_arch == 'i386' and not cc.links(''' 241a988b4c5SPaolo Bonzini static int sfaa(int *ptr) 242a988b4c5SPaolo Bonzini { 243a988b4c5SPaolo Bonzini return __sync_fetch_and_and(ptr, 0); 244a988b4c5SPaolo Bonzini } 245a988b4c5SPaolo Bonzini 246a988b4c5SPaolo Bonzini int main(void) 247a988b4c5SPaolo Bonzini { 248a988b4c5SPaolo Bonzini int val = 42; 249a988b4c5SPaolo Bonzini val = __sync_val_compare_and_swap(&val, 0, 1); 250a988b4c5SPaolo Bonzini sfaa(&val); 251a988b4c5SPaolo Bonzini return val; 252a988b4c5SPaolo Bonzini }''') 253a988b4c5SPaolo Bonzini qemu_common_flags = ['-march=i486'] + qemu_common_flags 254a988b4c5SPaolo Bonziniendif 255a988b4c5SPaolo Bonzini 256d67212d4SPaolo Bonziniif get_option('gprof') 257d67212d4SPaolo Bonzini qemu_common_flags += ['-p'] 258d67212d4SPaolo Bonzini qemu_ldflags += ['-p'] 259d67212d4SPaolo Bonziniendif 260d67212d4SPaolo Bonzini 261a0cbd2e8SPaolo Bonziniif get_option('prefer_static') 262e4333d14SPaolo Bonzini qemu_ldflags += get_option('b_pie') ? '-static-pie' : '-static' 263e4333d14SPaolo Bonziniendif 264e4333d14SPaolo Bonzini 265a988b4c5SPaolo Bonzini# Meson currently only handles pie as a boolean for now, so if the user 266a988b4c5SPaolo Bonzini# has explicitly disabled PIE we need to extend our cflags. 267b03fcd68SPaolo Bonzini# 268b03fcd68SPaolo Bonzini# -no-pie is supposedly a linker flag that has no effect on the compiler 269b03fcd68SPaolo Bonzini# command line, but some distros, that didn't quite know what they were 270b03fcd68SPaolo Bonzini# doing, made local changes to gcc's specs file that turned it into 271b03fcd68SPaolo Bonzini# a compiler command-line flag. 272b03fcd68SPaolo Bonzini# 273b03fcd68SPaolo Bonzini# What about linker flags? For a static build, no PIE is implied by -static 274b03fcd68SPaolo Bonzini# which we added above (and if it's not because of the same specs patching, 275b03fcd68SPaolo Bonzini# there's nothing we can do: compilation will fail, report a bug to your 276b03fcd68SPaolo Bonzini# distro and do not use --disable-pie in the meanwhile). For dynamic linking, 277b03fcd68SPaolo Bonzini# instead, we can't add -no-pie because it overrides -shared: the linker then 278b03fcd68SPaolo Bonzini# tries to build an executable instead of a shared library and fails. So 279b03fcd68SPaolo Bonzini# don't add -no-pie anywhere and cross fingers. :( 280a988b4c5SPaolo Bonziniif not get_option('b_pie') 281b03fcd68SPaolo Bonzini qemu_common_flags += cc.get_supported_arguments('-fno-pie', '-no-pie') 282a988b4c5SPaolo Bonziniendif 283a988b4c5SPaolo Bonzini 284911d4caaSPaolo Bonziniif not get_option('stack_protector').disabled() 285911d4caaSPaolo Bonzini stack_protector_probe = ''' 286911d4caaSPaolo Bonzini int main(int argc, char *argv[]) 287911d4caaSPaolo Bonzini { 288911d4caaSPaolo Bonzini char arr[64], *p = arr, *c = argv[argc - 1]; 289911d4caaSPaolo Bonzini while (*c) { 290911d4caaSPaolo Bonzini *p++ = *c++; 291911d4caaSPaolo Bonzini } 292911d4caaSPaolo Bonzini return 0; 293911d4caaSPaolo Bonzini }''' 294911d4caaSPaolo Bonzini have_stack_protector = false 295911d4caaSPaolo Bonzini foreach arg : ['-fstack-protector-strong', '-fstack-protector-all'] 296911d4caaSPaolo Bonzini # We need to check both a compile and a link, since some compiler 297911d4caaSPaolo Bonzini # setups fail only on a .c->.o compile and some only at link time 298911d4caaSPaolo Bonzini if cc.compiles(stack_protector_probe, args: ['-Werror', arg]) and \ 299911d4caaSPaolo Bonzini cc.links(stack_protector_probe, args: ['-Werror', arg]) 300911d4caaSPaolo Bonzini have_stack_protector = true 301911d4caaSPaolo Bonzini qemu_cflags += arg 302911d4caaSPaolo Bonzini qemu_ldflags += arg 303911d4caaSPaolo Bonzini break 304911d4caaSPaolo Bonzini endif 305911d4caaSPaolo Bonzini endforeach 306911d4caaSPaolo Bonzini get_option('stack_protector') \ 307911d4caaSPaolo Bonzini .require(have_stack_protector, error_message: 'Stack protector not supported') 308911d4caaSPaolo Bonziniendif 309911d4caaSPaolo Bonzini 3106739825aSPaolo Bonzinicoroutine_backend = get_option('coroutine_backend') 3116739825aSPaolo Bonziniucontext_probe = ''' 3126739825aSPaolo Bonzini #include <ucontext.h> 3136739825aSPaolo Bonzini #ifdef __stub_makecontext 3146739825aSPaolo Bonzini #error Ignoring glibc stub makecontext which will always fail 3156739825aSPaolo Bonzini #endif 3166739825aSPaolo Bonzini int main(void) { makecontext(0, 0, 0); return 0; }''' 3176739825aSPaolo Bonzini 3186739825aSPaolo Bonzini# On Windows the only valid backend is the Windows specific one. 3196739825aSPaolo Bonzini# For POSIX prefer ucontext, but it's not always possible. The fallback 3206739825aSPaolo Bonzini# is sigcontext. 3216739825aSPaolo Bonzinisupported_backends = [] 3226739825aSPaolo Bonziniif targetos == 'windows' 3236739825aSPaolo Bonzini supported_backends += ['windows'] 3246739825aSPaolo Bonzinielse 3256739825aSPaolo Bonzini if targetos != 'darwin' and cc.links(ucontext_probe) 3266739825aSPaolo Bonzini supported_backends += ['ucontext'] 3276739825aSPaolo Bonzini endif 3286739825aSPaolo Bonzini supported_backends += ['sigaltstack'] 3296739825aSPaolo Bonziniendif 3306739825aSPaolo Bonzini 3316739825aSPaolo Bonziniif coroutine_backend == 'auto' 3326739825aSPaolo Bonzini coroutine_backend = supported_backends[0] 3336739825aSPaolo Bonzinielif coroutine_backend not in supported_backends 3346739825aSPaolo Bonzini error('"@0@" backend requested but not available. Available backends: @1@' \ 3356739825aSPaolo Bonzini .format(coroutine_backend, ', '.join(supported_backends))) 3366739825aSPaolo Bonziniendif 3376739825aSPaolo Bonzini 338721fa5e5SPaolo Bonzini# Compiles if SafeStack *not* enabled 339721fa5e5SPaolo Bonzinisafe_stack_probe = ''' 340721fa5e5SPaolo Bonzini int main(void) 341721fa5e5SPaolo Bonzini { 342721fa5e5SPaolo Bonzini #if defined(__has_feature) 343721fa5e5SPaolo Bonzini #if __has_feature(safe_stack) 344721fa5e5SPaolo Bonzini #error SafeStack Enabled 345721fa5e5SPaolo Bonzini #endif 346721fa5e5SPaolo Bonzini #endif 347721fa5e5SPaolo Bonzini return 0; 348721fa5e5SPaolo Bonzini }''' 349721fa5e5SPaolo Bonziniif get_option('safe_stack') != not cc.compiles(safe_stack_probe) 350721fa5e5SPaolo Bonzini safe_stack_arg = get_option('safe_stack') ? '-fsanitize=safe-stack' : '-fno-sanitize=safe-stack' 351721fa5e5SPaolo Bonzini if get_option('safe_stack') != not cc.compiles(safe_stack_probe, args: safe_stack_arg) 352721fa5e5SPaolo Bonzini error(get_option('safe_stack') \ 353721fa5e5SPaolo Bonzini ? 'SafeStack not supported by your compiler' \ 354721fa5e5SPaolo Bonzini : 'Cannot disable SafeStack') 355721fa5e5SPaolo Bonzini endif 356721fa5e5SPaolo Bonzini qemu_cflags += safe_stack_arg 357721fa5e5SPaolo Bonzini qemu_ldflags += safe_stack_arg 358721fa5e5SPaolo Bonziniendif 3596739825aSPaolo Bonziniif get_option('safe_stack') and coroutine_backend != 'ucontext' 360721fa5e5SPaolo Bonzini error('SafeStack is only supported with the ucontext coroutine backend') 361721fa5e5SPaolo Bonziniendif 362721fa5e5SPaolo Bonzini 36334f983d8SPaolo Bonziniif get_option('sanitizers') 36434f983d8SPaolo Bonzini if cc.has_argument('-fsanitize=address') 36534f983d8SPaolo Bonzini qemu_cflags = ['-fsanitize=address'] + qemu_cflags 36634f983d8SPaolo Bonzini qemu_ldflags = ['-fsanitize=address'] + qemu_ldflags 36734f983d8SPaolo Bonzini endif 36834f983d8SPaolo Bonzini 36934f983d8SPaolo Bonzini # Detect static linking issue with ubsan - https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84285 37034f983d8SPaolo Bonzini if cc.links('int main(int argc, char **argv) { return argc + 1; }', 37134f983d8SPaolo Bonzini args: [qemu_ldflags, '-fsanitize=undefined']) 37234f983d8SPaolo Bonzini qemu_cflags = ['-fsanitize=undefined'] + qemu_cflags 37334f983d8SPaolo Bonzini qemu_ldflags = ['-fsanitize=undefined'] + qemu_ldflags 37434f983d8SPaolo Bonzini endif 37534f983d8SPaolo Bonziniendif 37634f983d8SPaolo Bonzini 37734f983d8SPaolo Bonzini# Thread sanitizer is, for now, much noisier than the other sanitizers; 37834f983d8SPaolo Bonzini# keep it separate until that is not the case. 37934f983d8SPaolo Bonziniif get_option('tsan') 38034f983d8SPaolo Bonzini if get_option('sanitizers') 38134f983d8SPaolo Bonzini error('TSAN is not supported with other sanitizers') 38234f983d8SPaolo Bonzini endif 38334f983d8SPaolo Bonzini if not cc.has_function('__tsan_create_fiber', 38434f983d8SPaolo Bonzini args: '-fsanitize=thread', 38534f983d8SPaolo Bonzini prefix: '#include <sanitizer/tsan_interface.h>') 38634f983d8SPaolo Bonzini error('Cannot enable TSAN due to missing fiber annotation interface') 38734f983d8SPaolo Bonzini endif 38834f983d8SPaolo Bonzini qemu_cflags = ['-fsanitize=thread'] + qemu_cflags 38934f983d8SPaolo Bonzini qemu_ldflags = ['-fsanitize=thread'] + qemu_ldflags 39034f983d8SPaolo Bonziniendif 39134f983d8SPaolo Bonzini 392e4333d14SPaolo Bonzini# Detect support for PT_GNU_RELRO + DT_BIND_NOW. 393e4333d14SPaolo Bonzini# The combination is known as "full relro", because .got.plt is read-only too. 394e4333d14SPaolo Bonziniqemu_ldflags += cc.get_supported_link_arguments('-Wl,-z,relro', '-Wl,-z,now') 395e4333d14SPaolo Bonzini 396d2147e04SPaolo Bonziniif targetos == 'windows' 397d2147e04SPaolo Bonzini qemu_ldflags += cc.get_supported_link_arguments('-Wl,--no-seh', '-Wl,--nxcompat') 3982d73fa74SPaolo Bonzini qemu_ldflags += cc.get_supported_link_arguments('-Wl,--dynamicbase', '-Wl,--high-entropy-va') 399d2147e04SPaolo Bonziniendif 400d2147e04SPaolo Bonzini 401d67212d4SPaolo Bonzini# Exclude --warn-common with TSan to suppress warnings from the TSan libraries. 40234f983d8SPaolo Bonziniif targetos != 'sunos' and not get_option('tsan') 403d67212d4SPaolo Bonzini qemu_ldflags += cc.get_supported_link_arguments('-Wl,--warn-common') 404c55cf6abSPaolo Bonziniendif 405c55cf6abSPaolo Bonzini 406537b7248SPaolo Bonziniif get_option('fuzzing') 407537b7248SPaolo Bonzini # Specify a filter to only instrument code that is directly related to 408537b7248SPaolo Bonzini # virtual-devices. 409537b7248SPaolo Bonzini configure_file(output: 'instrumentation-filter', 410537b7248SPaolo Bonzini input: 'scripts/oss-fuzz/instrumentation-filter-template', 411537b7248SPaolo Bonzini copy: true) 412aa4f3a3bSAlexander Bulekov 413aa4f3a3bSAlexander Bulekov if cc.compiles('int main () { return 0; }', 414aa4f3a3bSAlexander Bulekov name: '-fsanitize-coverage-allowlist=/dev/null', 415e56d0970SAlexander Bulekov args: ['-fsanitize-coverage-allowlist=/dev/null', 416e56d0970SAlexander Bulekov '-fsanitize-coverage=trace-pc'] ) 417d67212d4SPaolo Bonzini qemu_common_flags += ['-fsanitize-coverage-allowlist=instrumentation-filter'] 418aa4f3a3bSAlexander Bulekov endif 419537b7248SPaolo Bonzini 420537b7248SPaolo Bonzini if get_option('fuzzing_engine') == '' 421537b7248SPaolo Bonzini # Add CFLAGS to tell clang to add fuzzer-related instrumentation to all the 422537b7248SPaolo Bonzini # compiled code. To build non-fuzzer binaries with --enable-fuzzing, link 423537b7248SPaolo Bonzini # everything with fsanitize=fuzzer-no-link. Otherwise, the linker will be 424537b7248SPaolo Bonzini # unable to bind the fuzzer-related callbacks added by instrumentation. 425d67212d4SPaolo Bonzini qemu_common_flags += ['-fsanitize=fuzzer-no-link'] 426d67212d4SPaolo Bonzini qemu_ldflags += ['-fsanitize=fuzzer-no-link'] 427537b7248SPaolo Bonzini # For the actual fuzzer binaries, we need to link against the libfuzzer 428537b7248SPaolo Bonzini # library. They need to be configurable, to support OSS-Fuzz 429537b7248SPaolo Bonzini fuzz_exe_ldflags = ['-fsanitize=fuzzer'] 430537b7248SPaolo Bonzini else 431537b7248SPaolo Bonzini # LIB_FUZZING_ENGINE was set; assume we are running on OSS-Fuzz, and 432537b7248SPaolo Bonzini # the needed CFLAGS have already been provided 433537b7248SPaolo Bonzini fuzz_exe_ldflags = get_option('fuzzing_engine').split() 434537b7248SPaolo Bonzini endif 435ff9ed62bSAlexander Bulekovendif 436ff9ed62bSAlexander Bulekov 437d67212d4SPaolo Bonziniadd_global_arguments(qemu_common_flags, native: false, language: all_languages) 438d67212d4SPaolo Bonziniadd_global_link_arguments(qemu_ldflags, native: false, language: all_languages) 439d67212d4SPaolo Bonzini 44095caf1fbSPaolo Bonzini# Collect warnings that we want to enable 44195caf1fbSPaolo Bonzini 44295caf1fbSPaolo Bonziniwarn_flags = [ 44395caf1fbSPaolo Bonzini '-Wundef', 44495caf1fbSPaolo Bonzini '-Wwrite-strings', 44595caf1fbSPaolo Bonzini '-Wmissing-prototypes', 44695caf1fbSPaolo Bonzini '-Wstrict-prototypes', 44795caf1fbSPaolo Bonzini '-Wredundant-decls', 44895caf1fbSPaolo Bonzini '-Wold-style-declaration', 44995caf1fbSPaolo Bonzini '-Wold-style-definition', 45095caf1fbSPaolo Bonzini '-Wtype-limits', 45195caf1fbSPaolo Bonzini '-Wformat-security', 45295caf1fbSPaolo Bonzini '-Wformat-y2k', 45395caf1fbSPaolo Bonzini '-Winit-self', 45495caf1fbSPaolo Bonzini '-Wignored-qualifiers', 45595caf1fbSPaolo Bonzini '-Wempty-body', 45695caf1fbSPaolo Bonzini '-Wnested-externs', 45795caf1fbSPaolo Bonzini '-Wendif-labels', 45895caf1fbSPaolo Bonzini '-Wexpansion-to-defined', 45995caf1fbSPaolo Bonzini '-Wimplicit-fallthrough=2', 46095caf1fbSPaolo Bonzini '-Wmissing-format-attribute', 46195caf1fbSPaolo Bonzini '-Wno-initializer-overrides', 46295caf1fbSPaolo Bonzini '-Wno-missing-include-dirs', 46395caf1fbSPaolo Bonzini '-Wno-shift-negative-value', 46495caf1fbSPaolo Bonzini '-Wno-string-plus-int', 46595caf1fbSPaolo Bonzini '-Wno-typedef-redefinition', 46695caf1fbSPaolo Bonzini '-Wno-tautological-type-limit-compare', 46795caf1fbSPaolo Bonzini '-Wno-psabi', 46895caf1fbSPaolo Bonzini '-Wno-gnu-variable-sized-type-not-at-end', 46995caf1fbSPaolo Bonzini] 47095caf1fbSPaolo Bonzini 47195caf1fbSPaolo Bonziniif targetos != 'darwin' 47295caf1fbSPaolo Bonzini warn_flags += ['-Wthread-safety'] 47395caf1fbSPaolo Bonziniendif 47495caf1fbSPaolo Bonzini 475785abf0dSThomas Huth# Set up C++ compiler flags 476b485458eSPaolo Bonziniqemu_cxxflags = [] 477e5134024SPaolo Bonziniif 'cpp' in all_languages 47895caf1fbSPaolo Bonzini qemu_cxxflags = ['-D__STDC_LIMIT_MACROS', '-D__STDC_CONSTANT_MACROS', '-D__STDC_FORMAT_MACROS'] + qemu_cflags 479b485458eSPaolo Bonziniendif 480b485458eSPaolo Bonzini 48134f983d8SPaolo Bonzini# clang does not support glibc + FORTIFY_SOURCE (is it still true?) 48234f983d8SPaolo Bonziniif get_option('optimization') != '0' and targetos == 'linux' 48334f983d8SPaolo Bonzini if cc.get_id() == 'gcc' 48434f983d8SPaolo Bonzini qemu_cflags += ['-U_FORTIFY_SOURCE', '-D_FORTIFY_SOURCE=2'] 48534f983d8SPaolo Bonzini endif 48634f983d8SPaolo Bonzini if 'cpp' in all_languages and cxx.get_id() == 'gcc' 48734f983d8SPaolo Bonzini qemu_cxxflags += ['-U_FORTIFY_SOURCE', '-D_FORTIFY_SOURCE=2'] 48834f983d8SPaolo Bonzini endif 48934f983d8SPaolo Bonziniendif 49034f983d8SPaolo Bonzini 491d67212d4SPaolo Bonziniadd_project_arguments(qemu_cflags, native: false, language: 'c') 49295caf1fbSPaolo Bonziniadd_project_arguments(cc.get_supported_arguments(warn_flags), native: false, language: 'c') 49395caf1fbSPaolo Bonziniif 'cpp' in all_languages 494d67212d4SPaolo Bonzini add_project_arguments(qemu_cxxflags, native: false, language: 'cpp') 49595caf1fbSPaolo Bonzini add_project_arguments(cxx.get_supported_arguments(warn_flags), native: false, language: 'cpp') 49695caf1fbSPaolo Bonziniendif 49795caf1fbSPaolo Bonziniif 'objc' in all_languages 49895caf1fbSPaolo Bonzini # Note sanitizer flags are not applied to Objective-C sources! 49995caf1fbSPaolo Bonzini add_project_arguments(objc.get_supported_arguments(warn_flags), native: false, language: 'objc') 50095caf1fbSPaolo Bonziniendif 5011e6e616dSPaolo Bonziniif targetos == 'linux' 5021e6e616dSPaolo Bonzini add_project_arguments('-isystem', meson.current_source_dir() / 'linux-headers', 5031e6e616dSPaolo Bonzini '-isystem', 'linux-headers', 504e5134024SPaolo Bonzini language: all_languages) 5051e6e616dSPaolo Bonziniendif 5061e6e616dSPaolo Bonzini 50723a77b2dSPaolo Bonziniadd_project_arguments('-iquote', '.', 5081e6e616dSPaolo Bonzini '-iquote', meson.current_source_dir(), 5091e6e616dSPaolo Bonzini '-iquote', meson.current_source_dir() / 'include', 510e5134024SPaolo Bonzini language: all_languages) 511a5665051SPaolo Bonzini 51244fc7168SRichard Henderson# If a host-specific include directory exists, list that first... 51344fc7168SRichard Hendersonhost_include = meson.current_source_dir() / 'host/include/' 51444fc7168SRichard Hendersonif fs.is_dir(host_include / host_arch) 51544fc7168SRichard Henderson add_project_arguments('-iquote', host_include / host_arch, 51644fc7168SRichard Henderson language: all_languages) 51744fc7168SRichard Hendersonendif 51844fc7168SRichard Henderson# ... followed by the generic fallback. 51944fc7168SRichard Hendersonadd_project_arguments('-iquote', host_include / 'generic', 52044fc7168SRichard Henderson language: all_languages) 52144fc7168SRichard Henderson 522deb62371SPaolo Bonzinisparse = find_program('cgcc', required: get_option('sparse')) 523deb62371SPaolo Bonziniif sparse.found() 524968b4db3SPaolo Bonzini run_target('sparse', 525968b4db3SPaolo Bonzini command: [find_program('scripts/check_sparse.py'), 526deb62371SPaolo Bonzini 'compile_commands.json', sparse.full_path(), '-Wbitwise', 527deb62371SPaolo Bonzini '-Wno-transparent-union', '-Wno-old-initializer', 528deb62371SPaolo Bonzini '-Wno-non-pointer-null']) 529968b4db3SPaolo Bonziniendif 530968b4db3SPaolo Bonzini 5316ec0e15dSPaolo Bonzini########################################### 5326ec0e15dSPaolo Bonzini# Target-specific checks and dependencies # 5336ec0e15dSPaolo Bonzini########################################### 5346ec0e15dSPaolo Bonzini 535b7a75c8cSPaolo Bonzini# Fuzzing 536537b7248SPaolo Bonziniif get_option('fuzzing') and get_option('fuzzing_engine') == '' and \ 537537b7248SPaolo Bonzini not cc.links(''' 538537b7248SPaolo Bonzini #include <stdint.h> 539537b7248SPaolo Bonzini #include <sys/types.h> 540537b7248SPaolo Bonzini int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size); 541537b7248SPaolo Bonzini int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { return 0; } 542537b7248SPaolo Bonzini ''', 543537b7248SPaolo Bonzini args: ['-Werror', '-fsanitize=fuzzer']) 544537b7248SPaolo Bonzini error('Your compiler does not support -fsanitize=fuzzer') 545537b7248SPaolo Bonziniendif 546537b7248SPaolo Bonzini 547b7a75c8cSPaolo Bonzini# Tracing backends 5489c29b741SPaolo Bonziniif 'ftrace' in get_option('trace_backends') and targetos != 'linux' 5499c29b741SPaolo Bonzini error('ftrace is supported only on Linux') 5509c29b741SPaolo Bonziniendif 5519c29b741SPaolo Bonziniif 'syslog' in get_option('trace_backends') and not cc.compiles(''' 5529c29b741SPaolo Bonzini #include <syslog.h> 5539c29b741SPaolo Bonzini int main(void) { 5549c29b741SPaolo Bonzini openlog("qemu", LOG_PID, LOG_DAEMON); 5559c29b741SPaolo Bonzini syslog(LOG_INFO, "configure"); 5569c29b741SPaolo Bonzini return 0; 5579c29b741SPaolo Bonzini }''') 5589c29b741SPaolo Bonzini error('syslog is not supported on this system') 5599c29b741SPaolo Bonziniendif 5609c29b741SPaolo Bonzini 561b7a75c8cSPaolo Bonzini# Miscellaneous Linux-only features 562a436d6d4SPaolo Bonziniget_option('mpath') \ 563a436d6d4SPaolo Bonzini .require(targetos == 'linux', error_message: 'Multipath is supported only on Linux') 5646ec0e15dSPaolo Bonzini 565a436d6d4SPaolo Bonzinimultiprocess_allowed = get_option('multiprocess') \ 566a436d6d4SPaolo Bonzini .require(targetos == 'linux', error_message: 'Multiprocess QEMU is supported only on Linux') \ 567a436d6d4SPaolo Bonzini .allowed() 568106ad1f9SPaolo Bonzini 56955116968SJagannathan Ramanvfio_user_server_allowed = get_option('vfio_user_server') \ 57055116968SJagannathan Raman .require(targetos == 'linux', error_message: 'vfio-user server is supported only on Linux') \ 57155116968SJagannathan Raman .allowed() 57255116968SJagannathan Raman 5730d04c4c9SPaolo Bonzinihave_tpm = get_option('tpm') \ 5740d04c4c9SPaolo Bonzini .require(targetos != 'windows', error_message: 'TPM emulation only available on POSIX systems') \ 5750d04c4c9SPaolo Bonzini .allowed() 5760d04c4c9SPaolo Bonzini 5772a3129a3SPaolo Bonzini# vhost 5782df89d54SPaolo Bonzinihave_vhost_user = get_option('vhost_user') \ 5792df89d54SPaolo Bonzini .disable_auto_if(targetos != 'linux') \ 5802df89d54SPaolo Bonzini .require(targetos != 'windows', 5812df89d54SPaolo Bonzini error_message: 'vhost-user is not available on Windows').allowed() 5822df89d54SPaolo Bonzinihave_vhost_vdpa = get_option('vhost_vdpa') \ 5832df89d54SPaolo Bonzini .require(targetos == 'linux', 5842df89d54SPaolo Bonzini error_message: 'vhost-vdpa is only available on Linux').allowed() 5852df89d54SPaolo Bonzinihave_vhost_kernel = get_option('vhost_kernel') \ 5862df89d54SPaolo Bonzini .require(targetos == 'linux', 5872df89d54SPaolo Bonzini error_message: 'vhost-kernel is only available on Linux').allowed() 5882df89d54SPaolo Bonzinihave_vhost_user_crypto = get_option('vhost_crypto') \ 5892df89d54SPaolo Bonzini .require(have_vhost_user, 5902df89d54SPaolo Bonzini error_message: 'vhost-crypto requires vhost-user to be enabled').allowed() 5912df89d54SPaolo Bonzini 59243b6d7eeSPaolo Bonzinihave_vhost = have_vhost_user or have_vhost_vdpa or have_vhost_kernel 5932df89d54SPaolo Bonzini 5942df89d54SPaolo Bonzinihave_vhost_net_user = have_vhost_user and get_option('vhost_net').allowed() 5952df89d54SPaolo Bonzinihave_vhost_net_vdpa = have_vhost_vdpa and get_option('vhost_net').allowed() 5962df89d54SPaolo Bonzinihave_vhost_net_kernel = have_vhost_kernel and get_option('vhost_net').allowed() 5972df89d54SPaolo Bonzinihave_vhost_net = have_vhost_net_kernel or have_vhost_net_user or have_vhost_net_vdpa 5982a3129a3SPaolo Bonzini 599b7a75c8cSPaolo Bonzini# Target-specific libraries and flags 6007fa1c635SPaolo Bonzinilibm = cc.find_library('m', required: false) 6016d7c7c2dSPaolo Bonzinithreads = dependency('threads') 602a81df1b6SPaolo Bonziniutil = cc.find_library('util', required: false) 6034a96337dSPaolo Bonziniwinmm = [] 604a81df1b6SPaolo Bonzinisocket = [] 60504c6f1e7SMarc-André Lureauversion_res = [] 606d92989aaSMarc-André Lureaucoref = [] 607d92989aaSMarc-André Lureauiokit = [] 608b6c7cfd4SPaolo Bonziniemulator_link_args = [] 60974a414a1SReinoud Zandijknvmm =not_found 6108a19980eSPaolo Bonzinihvf = not_found 61123011f44SMarc-André Lureaumidl = not_found 61223011f44SMarc-André Lureauwidl = not_found 613cf60ccc3SAkihiko Odakipathcch = not_found 614a6305081SPaolo Bonzinihost_dsosuf = '.so' 615a81df1b6SPaolo Bonziniif targetos == 'windows' 61623011f44SMarc-André Lureau midl = find_program('midl', required: false) 61723011f44SMarc-André Lureau widl = find_program('widl', required: false) 618cf60ccc3SAkihiko Odaki pathcch = cc.find_library('pathcch') 619a81df1b6SPaolo Bonzini socket = cc.find_library('ws2_32') 6204a96337dSPaolo Bonzini winmm = cc.find_library('winmm') 62104c6f1e7SMarc-André Lureau 62204c6f1e7SMarc-André Lureau win = import('windows') 62304c6f1e7SMarc-André Lureau version_res = win.compile_resources('version.rc', 62404c6f1e7SMarc-André Lureau depend_files: files('pc-bios/qemu-nsis.ico'), 62504c6f1e7SMarc-André Lureau include_directories: include_directories('.')) 626a6305081SPaolo Bonzini host_dsosuf = '.dll' 627d92989aaSMarc-André Lureauelif targetos == 'darwin' 628d92989aaSMarc-André Lureau coref = dependency('appleframeworks', modules: 'CoreFoundation') 62914176c8dSJoelle van Dyne iokit = dependency('appleframeworks', modules: 'IOKit', required: false) 630a6305081SPaolo Bonzini host_dsosuf = '.dylib' 631cfad62f1SPaolo Bonzinielif targetos == 'sunos' 632cfad62f1SPaolo Bonzini socket = [cc.find_library('socket'), 633cfad62f1SPaolo Bonzini cc.find_library('nsl'), 634cfad62f1SPaolo Bonzini cc.find_library('resolv')] 635cfad62f1SPaolo Bonzinielif targetos == 'haiku' 636cfad62f1SPaolo Bonzini socket = [cc.find_library('posix_error_mapper'), 637cfad62f1SPaolo Bonzini cc.find_library('network'), 638cfad62f1SPaolo Bonzini cc.find_library('bsd')] 639b6c7cfd4SPaolo Bonzinielif targetos == 'openbsd' 64043a363aeSPaolo Bonzini if get_option('tcg').allowed() and target_dirs.length() > 0 641b6c7cfd4SPaolo Bonzini # Disable OpenBSD W^X if available 642b6c7cfd4SPaolo Bonzini emulator_link_args = cc.get_supported_link_arguments('-Wl,-z,wxneeded') 643b6c7cfd4SPaolo Bonzini endif 644a81df1b6SPaolo Bonziniendif 6456ec0e15dSPaolo Bonzini 646b7a75c8cSPaolo Bonzini# Target-specific configuration of accelerators 6478a19980eSPaolo Bonziniaccelerators = [] 64843a363aeSPaolo Bonziniif get_option('kvm').allowed() and targetos == 'linux' 6498a19980eSPaolo Bonzini accelerators += 'CONFIG_KVM' 6508a19980eSPaolo Bonziniendif 65143a363aeSPaolo Bonziniif get_option('whpx').allowed() and targetos == 'windows' 65257e2a1f8SSunil Muthuswamy if get_option('whpx').enabled() and host_machine.cpu() != 'x86_64' 6538a19980eSPaolo Bonzini error('WHPX requires 64-bit host') 654641b8417SPhilippe Mathieu-Daudé elif cc.has_header('winhvplatform.h', required: get_option('whpx')) and \ 655641b8417SPhilippe Mathieu-Daudé cc.has_header('winhvemulation.h', required: get_option('whpx')) 6568a19980eSPaolo Bonzini accelerators += 'CONFIG_WHPX' 6578a19980eSPaolo Bonzini endif 6588a19980eSPaolo Bonziniendif 65943a363aeSPaolo Bonziniif get_option('hvf').allowed() 6608a19980eSPaolo Bonzini hvf = dependency('appleframeworks', modules: 'Hypervisor', 6618a19980eSPaolo Bonzini required: get_option('hvf')) 6628a19980eSPaolo Bonzini if hvf.found() 6638a19980eSPaolo Bonzini accelerators += 'CONFIG_HVF' 6648a19980eSPaolo Bonzini endif 6658a19980eSPaolo Bonziniendif 66643a363aeSPaolo Bonziniif get_option('hax').allowed() 6678a19980eSPaolo Bonzini if get_option('hax').enabled() or targetos in ['windows', 'darwin', 'netbsd'] 6688a19980eSPaolo Bonzini accelerators += 'CONFIG_HAX' 6698a19980eSPaolo Bonzini endif 6708a19980eSPaolo Bonziniendif 67174a414a1SReinoud Zandijkif targetos == 'netbsd' 67274a414a1SReinoud Zandijk nvmm = cc.find_library('nvmm', required: get_option('nvmm')) 67374a414a1SReinoud Zandijk if nvmm.found() 67474a414a1SReinoud Zandijk accelerators += 'CONFIG_NVMM' 67574a414a1SReinoud Zandijk endif 67674a414a1SReinoud Zandijkendif 67723a77b2dSPaolo Bonzini 678823eb013SPaolo Bonzinitcg_arch = host_arch 67943a363aeSPaolo Bonziniif get_option('tcg').allowed() 680823eb013SPaolo Bonzini if host_arch == 'unknown' 681*a24f15d2SPaolo Bonzini if not get_option('tcg_interpreter') 6828a19980eSPaolo Bonzini error('Unsupported CPU @0@, try --enable-tcg-interpreter'.format(cpu)) 6838a19980eSPaolo Bonzini endif 684fa2f7b0bSPhilippe Mathieu-Daudé elif get_option('tcg_interpreter') 6851c282da3SPhilippe Mathieu-Daudé warning('Use of the TCG interpreter is not recommended on this host') 686fa2f7b0bSPhilippe Mathieu-Daudé warning('architecture. There is a native TCG execution backend available') 687fa2f7b0bSPhilippe Mathieu-Daudé warning('which provides substantially better performance and reliability.') 688fa2f7b0bSPhilippe Mathieu-Daudé warning('It is strongly recommended to remove the --enable-tcg-interpreter') 689fa2f7b0bSPhilippe Mathieu-Daudé warning('configuration option on this architecture to use the native') 690fa2f7b0bSPhilippe Mathieu-Daudé warning('backend.') 6918a19980eSPaolo Bonzini endif 69223a77b2dSPaolo Bonzini if get_option('tcg_interpreter') 69323a77b2dSPaolo Bonzini tcg_arch = 'tci' 694ed145144SRichard Henderson config_host += { 'CONFIG_TCG_INTERPRETER': 'y' } 695823eb013SPaolo Bonzini elif host_arch == 'x86_64' 69623a77b2dSPaolo Bonzini tcg_arch = 'i386' 697823eb013SPaolo Bonzini elif host_arch == 'ppc64' 69823a77b2dSPaolo Bonzini tcg_arch = 'ppc' 69923a77b2dSPaolo Bonzini endif 70023a77b2dSPaolo Bonzini add_project_arguments('-iquote', meson.current_source_dir() / 'tcg' / tcg_arch, 701e5134024SPaolo Bonzini language: all_languages) 70223a77b2dSPaolo Bonzini 7038a19980eSPaolo Bonzini accelerators += 'CONFIG_TCG' 7048a19980eSPaolo Bonzini config_host += { 'CONFIG_TCG': 'y' } 7058a19980eSPaolo Bonziniendif 7068a19980eSPaolo Bonzini 7078a19980eSPaolo Bonziniif 'CONFIG_KVM' not in accelerators and get_option('kvm').enabled() 7088a19980eSPaolo Bonzini error('KVM not available on this platform') 7098a19980eSPaolo Bonziniendif 7108a19980eSPaolo Bonziniif 'CONFIG_HVF' not in accelerators and get_option('hvf').enabled() 7118a19980eSPaolo Bonzini error('HVF not available on this platform') 7128a19980eSPaolo Bonziniendif 71374a414a1SReinoud Zandijkif 'CONFIG_NVMM' not in accelerators and get_option('nvmm').enabled() 71474a414a1SReinoud Zandijk error('NVMM not available on this platform') 71574a414a1SReinoud Zandijkendif 7168a19980eSPaolo Bonziniif 'CONFIG_WHPX' not in accelerators and get_option('whpx').enabled() 7178a19980eSPaolo Bonzini error('WHPX not available on this platform') 7188a19980eSPaolo Bonziniendif 719b4e312e9SPaolo Bonzini 7206ec0e15dSPaolo Bonzini################ 7216ec0e15dSPaolo Bonzini# Dependencies # 7226ec0e15dSPaolo Bonzini################ 7236ec0e15dSPaolo Bonzini 724fc9a809eSPaolo Bonzini# When bumping glib minimum version, please check also whether to increase 725fc9a809eSPaolo Bonzini# the _WIN32_WINNT setting in osdep.h according to the value from glib 726fc9a809eSPaolo Bonziniglib_req_ver = '>=2.56.0' 727fc9a809eSPaolo Bonziniglib_pc = dependency('glib-2.0', version: glib_req_ver, required: true, 728fc9a809eSPaolo Bonzini method: 'pkg-config') 729fc9a809eSPaolo Bonziniglib_cflags = [] 7306002711cSPaolo Bonziniif enable_modules 731fc9a809eSPaolo Bonzini gmodule = dependency('gmodule-export-2.0', version: glib_req_ver, required: true, 732fc9a809eSPaolo Bonzini method: 'pkg-config') 733fc9a809eSPaolo Bonzinielif config_host.has_key('CONFIG_PLUGIN') 734fc9a809eSPaolo Bonzini gmodule = dependency('gmodule-no-export-2.0', version: glib_req_ver, required: true, 735fc9a809eSPaolo Bonzini method: 'pkg-config') 736fc9a809eSPaolo Bonzinielse 737fc9a809eSPaolo Bonzini gmodule = not_found 738e3feb2ccSEmilio Cotaendif 739953d5a9eSMarc-André Lureau 740fc9a809eSPaolo Bonzini# This workaround is required due to a bug in pkg-config file for glib as it 741fc9a809eSPaolo Bonzini# doesn't define GLIB_STATIC_COMPILATION for pkg-config --static 742fc9a809eSPaolo Bonziniif targetos == 'windows' and get_option('prefer_static') 743fc9a809eSPaolo Bonzini glib_cflags += ['-DGLIB_STATIC_COMPILATION'] 744fc9a809eSPaolo Bonziniendif 745fc9a809eSPaolo Bonzini 746fc9a809eSPaolo Bonzini# Sanity check that the current size_t matches the 747fc9a809eSPaolo Bonzini# size that glib thinks it should be. This catches 748fc9a809eSPaolo Bonzini# problems on multi-arch where people try to build 749fc9a809eSPaolo Bonzini# 32-bit QEMU while pointing at 64-bit glib headers 750fc9a809eSPaolo Bonzini 751fc9a809eSPaolo Bonziniif not cc.compiles(''' 752fc9a809eSPaolo Bonzini #include <glib.h> 753fc9a809eSPaolo Bonzini #include <unistd.h> 754fc9a809eSPaolo Bonzini 755fc9a809eSPaolo Bonzini #define QEMU_BUILD_BUG_ON(x) \ 756fc9a809eSPaolo Bonzini typedef char qemu_build_bug_on[(x)?-1:1] __attribute__((unused)); 757fc9a809eSPaolo Bonzini 758fc9a809eSPaolo Bonzini int main(void) { 759fc9a809eSPaolo Bonzini QEMU_BUILD_BUG_ON(sizeof(size_t) != GLIB_SIZEOF_SIZE_T); 760fc9a809eSPaolo Bonzini return 0; 761fc9a809eSPaolo Bonzini }''', dependencies: glib_pc, args: glib_cflags) 762fc9a809eSPaolo Bonzini error('''sizeof(size_t) doesn't match GLIB_SIZEOF_SIZE_T. 763fc9a809eSPaolo Bonzini You probably need to set PKG_CONFIG_LIBDIR" to point 764fc9a809eSPaolo Bonzini to the right pkg-config files for your build target.''') 765fc9a809eSPaolo Bonziniendif 766fc9a809eSPaolo Bonzini 767fc9a809eSPaolo Bonzini# Silence clang warnings triggered by glib < 2.57.2 768fc9a809eSPaolo Bonziniif not cc.compiles(''' 769fc9a809eSPaolo Bonzini #include <glib.h> 770fc9a809eSPaolo Bonzini typedef struct Foo { 771fc9a809eSPaolo Bonzini int i; 772fc9a809eSPaolo Bonzini } Foo; 773fc9a809eSPaolo Bonzini static void foo_free(Foo *f) 774fc9a809eSPaolo Bonzini { 775fc9a809eSPaolo Bonzini g_free(f); 776fc9a809eSPaolo Bonzini } 777fc9a809eSPaolo Bonzini G_DEFINE_AUTOPTR_CLEANUP_FUNC(Foo, foo_free) 778f49d883dSNicolas Saenz Julienne int main(void) { return 0; }''', dependencies: glib_pc, args: ['-Wunused-function', '-Werror']) 779fc9a809eSPaolo Bonzini glib_cflags += cc.get_supported_arguments('-Wno-unused-function') 780fc9a809eSPaolo Bonziniendif 781fc9a809eSPaolo Bonziniglib = declare_dependency(dependencies: [glib_pc, gmodule], 782fc9a809eSPaolo Bonzini compile_args: glib_cflags, 783fc9a809eSPaolo Bonzini version: glib_pc.version()) 784fc9a809eSPaolo Bonzini 785fc9a809eSPaolo Bonzini# Check whether glib has gslice, which we have to avoid for correctness. 786fc9a809eSPaolo Bonzini# TODO: remove this check and the corresponding workaround (qtree) when 787fc9a809eSPaolo Bonzini# the minimum supported glib is >= 2.75.3 788fc9a809eSPaolo Bonziniglib_has_gslice = glib.version().version_compare('<2.75.3') 789fc9a809eSPaolo Bonzini 790fc9a809eSPaolo Bonzini# override glib dep to include the above refinements 791fc9a809eSPaolo Bonzinimeson.override_dependency('glib-2.0', glib) 792fc9a809eSPaolo Bonzini 793fc9a809eSPaolo Bonzini# The path to glib.h is added to all compilation commands. 794fc9a809eSPaolo Bonziniadd_project_dependencies(glib.partial_dependency(compile_args: true, includes: true), 795fc9a809eSPaolo Bonzini native: false, language: all_languages) 796fc9a809eSPaolo Bonzini 797a81df1b6SPaolo Bonzinigio = not_found 7987544060eSPaolo Bonzinigdbus_codegen = not_found 799bb2dc4b7SPaolo Bonzinigdbus_codegen_error = '@0@ requires gdbus-codegen, please install libgio' 8007544060eSPaolo Bonziniif not get_option('gio').auto() or have_system 8017544060eSPaolo Bonzini gio = dependency('gio-2.0', required: get_option('gio'), 802063d5119SPaolo Bonzini method: 'pkg-config') 8037544060eSPaolo Bonzini if gio.found() and not cc.links(''' 8047544060eSPaolo Bonzini #include <gio/gio.h> 8057544060eSPaolo Bonzini int main(void) 8067544060eSPaolo Bonzini { 8077544060eSPaolo Bonzini g_dbus_proxy_new_sync(0, 0, 0, 0, 0, 0, 0, 0); 8087544060eSPaolo Bonzini return 0; 8097544060eSPaolo Bonzini }''', dependencies: [glib, gio]) 8107544060eSPaolo Bonzini if get_option('gio').enabled() 8117544060eSPaolo Bonzini error('The installed libgio is broken for static linking') 812a81df1b6SPaolo Bonzini endif 8137544060eSPaolo Bonzini gio = not_found 8147544060eSPaolo Bonzini endif 8157544060eSPaolo Bonzini if gio.found() 8167544060eSPaolo Bonzini gdbus_codegen = find_program(gio.get_variable('gdbus_codegen'), 8177544060eSPaolo Bonzini required: get_option('gio')) 8187544060eSPaolo Bonzini gio_unix = dependency('gio-unix-2.0', required: get_option('gio'), 819063d5119SPaolo Bonzini method: 'pkg-config') 8207544060eSPaolo Bonzini gio = declare_dependency(dependencies: [gio, gio_unix], 8217544060eSPaolo Bonzini version: gio.version()) 8227544060eSPaolo Bonzini endif 8237544060eSPaolo Bonziniendif 824bb2dc4b7SPaolo Bonziniif gdbus_codegen.found() and get_option('cfi') 825bb2dc4b7SPaolo Bonzini gdbus_codegen = not_found 826bb2dc4b7SPaolo Bonzini gdbus_codegen_error = '@0@ uses gdbus-codegen, which does not support control flow integrity' 827bb2dc4b7SPaolo Bonziniendif 8287544060eSPaolo Bonzini 8296cc5a615SMarc-André Lureauxml_pp = find_program('scripts/xml-preprocess.py') 8306cc5a615SMarc-André Lureau 831a81df1b6SPaolo Bonzinilttng = not_found 8329c29b741SPaolo Bonziniif 'ust' in get_option('trace_backends') 833e32aaa5aSMarc-André Lureau lttng = dependency('lttng-ust', required: true, version: '>= 2.1', 834063d5119SPaolo Bonzini method: 'pkg-config') 835a81df1b6SPaolo Bonziniendif 836b7612f45SPaolo Bonzinipixman = not_found 837b7612f45SPaolo Bonziniif have_system or have_tools 838b7612f45SPaolo Bonzini pixman = dependency('pixman-1', required: have_system, version:'>=0.21.8', 839063d5119SPaolo Bonzini method: 'pkg-config') 840b7612f45SPaolo Bonziniendif 841063d5119SPaolo Bonzinizlib = dependency('zlib', required: true) 84253c22b68SPaolo Bonzini 843ff66f3e5SPaolo Bonzinilibaio = not_found 844ff66f3e5SPaolo Bonziniif not get_option('linux_aio').auto() or have_block 845ff66f3e5SPaolo Bonzini libaio = cc.find_library('aio', has_headers: ['libaio.h'], 846063d5119SPaolo Bonzini required: get_option('linux_aio')) 847ff66f3e5SPaolo Bonziniendif 848354081d4SLeonardo Bras 849354081d4SLeonardo Braslinux_io_uring_test = ''' 850354081d4SLeonardo Bras #include <liburing.h> 851354081d4SLeonardo Bras #include <linux/errqueue.h> 852354081d4SLeonardo Bras 853354081d4SLeonardo Bras int main(void) { return 0; }''' 854354081d4SLeonardo Bras 8555e5733e5SMarc-André Lureaulinux_io_uring = not_found 85653c22b68SPaolo Bonziniif not get_option('linux_io_uring').auto() or have_block 857a41b4fdcSDaniel P. Berrangé linux_io_uring = dependency('liburing', version: '>=0.3', 858a41b4fdcSDaniel P. Berrangé required: get_option('linux_io_uring'), 859063d5119SPaolo Bonzini method: 'pkg-config') 860354081d4SLeonardo Bras if not cc.links(linux_io_uring_test) 861354081d4SLeonardo Bras linux_io_uring = not_found 8625e5733e5SMarc-André Lureau endif 863354081d4SLeonardo Brasendif 864354081d4SLeonardo Bras 8655e5733e5SMarc-André Lureaulibnfs = not_found 86630045c05SPaolo Bonziniif not get_option('libnfs').auto() or have_block 86730045c05SPaolo Bonzini libnfs = dependency('libnfs', version: '>=1.9.3', 86830045c05SPaolo Bonzini required: get_option('libnfs'), 869063d5119SPaolo Bonzini method: 'pkg-config') 8705e5733e5SMarc-André Lureauendif 871f7f2d651SPaolo Bonzini 872f7f2d651SPaolo Bonzinilibattr_test = ''' 873f7f2d651SPaolo Bonzini #include <stddef.h> 874f7f2d651SPaolo Bonzini #include <sys/types.h> 875f7f2d651SPaolo Bonzini #ifdef CONFIG_LIBATTR 876f7f2d651SPaolo Bonzini #include <attr/xattr.h> 877f7f2d651SPaolo Bonzini #else 878f7f2d651SPaolo Bonzini #include <sys/xattr.h> 879f7f2d651SPaolo Bonzini #endif 880f7f2d651SPaolo Bonzini int main(void) { getxattr(NULL, NULL, NULL, 0); setxattr(NULL, NULL, NULL, 0, 0); return 0; }''' 881f7f2d651SPaolo Bonzini 882ec0d5893SMarc-André Lureaulibattr = not_found 883f7f2d651SPaolo Bonzinihave_old_libattr = false 88443a363aeSPaolo Bonziniif get_option('attr').allowed() 885f7f2d651SPaolo Bonzini if cc.links(libattr_test) 886f7f2d651SPaolo Bonzini libattr = declare_dependency() 887f7f2d651SPaolo Bonzini else 888f7f2d651SPaolo Bonzini libattr = cc.find_library('attr', has_headers: ['attr/xattr.h'], 889063d5119SPaolo Bonzini required: get_option('attr')) 890f7f2d651SPaolo Bonzini if libattr.found() and not \ 891f7f2d651SPaolo Bonzini cc.links(libattr_test, dependencies: libattr, args: '-DCONFIG_LIBATTR') 892f7f2d651SPaolo Bonzini libattr = not_found 893f7f2d651SPaolo Bonzini if get_option('attr').enabled() 894f7f2d651SPaolo Bonzini error('could not link libattr') 895f7f2d651SPaolo Bonzini else 896f7f2d651SPaolo Bonzini warning('could not link libattr, disabling') 897ec0d5893SMarc-André Lureau endif 898f7f2d651SPaolo Bonzini else 899f7f2d651SPaolo Bonzini have_old_libattr = libattr.found() 900f7f2d651SPaolo Bonzini endif 901f7f2d651SPaolo Bonzini endif 902f7f2d651SPaolo Bonziniendif 903f7f2d651SPaolo Bonzini 90452eaefd3SAkihiko Odakicocoa = dependency('appleframeworks', modules: ['Cocoa', 'CoreVideo'], 90552eaefd3SAkihiko Odaki required: get_option('cocoa')) 906c1ec4941SPaolo Bonzini 907e2c1d78dSVladislav Yaroshchukvmnet = dependency('appleframeworks', modules: 'vmnet', required: get_option('vmnet')) 908e2c1d78dSVladislav Yaroshchukif vmnet.found() and not cc.has_header_symbol('vmnet/vmnet.h', 909e2c1d78dSVladislav Yaroshchuk 'VMNET_BRIDGED_MODE', 910e2c1d78dSVladislav Yaroshchuk dependencies: vmnet) 911e2c1d78dSVladislav Yaroshchuk vmnet = not_found 912e2c1d78dSVladislav Yaroshchuk if get_option('vmnet').enabled() 913e2c1d78dSVladislav Yaroshchuk error('vmnet.framework API is outdated') 914e2c1d78dSVladislav Yaroshchuk else 915e2c1d78dSVladislav Yaroshchuk warning('vmnet.framework API is outdated, disabling') 916e2c1d78dSVladislav Yaroshchuk endif 917e2c1d78dSVladislav Yaroshchukendif 918e2c1d78dSVladislav Yaroshchuk 9193f99cf57SPaolo Bonziniseccomp = not_found 92073422d95SMichal Privoznikseccomp_has_sysrawrc = false 92190835c2bSPaolo Bonziniif not get_option('seccomp').auto() or have_system or have_tools 92290835c2bSPaolo Bonzini seccomp = dependency('libseccomp', version: '>=2.3.0', 92390835c2bSPaolo Bonzini required: get_option('seccomp'), 924063d5119SPaolo Bonzini method: 'pkg-config') 92573422d95SMichal Privoznik if seccomp.found() 92673422d95SMichal Privoznik seccomp_has_sysrawrc = cc.has_header_symbol('seccomp.h', 92773422d95SMichal Privoznik 'SCMP_FLTATR_API_SYSRAWRC', 92873422d95SMichal Privoznik dependencies: seccomp) 92973422d95SMichal Privoznik endif 9303f99cf57SPaolo Bonziniendif 931727c8bb8SPaolo Bonzini 9323f99cf57SPaolo Bonzinilibcap_ng = not_found 933727c8bb8SPaolo Bonziniif not get_option('cap_ng').auto() or have_system or have_tools 934727c8bb8SPaolo Bonzini libcap_ng = cc.find_library('cap-ng', has_headers: ['cap-ng.h'], 935063d5119SPaolo Bonzini required: get_option('cap_ng')) 9363f99cf57SPaolo Bonziniendif 937727c8bb8SPaolo Bonziniif libcap_ng.found() and not cc.links(''' 938727c8bb8SPaolo Bonzini #include <cap-ng.h> 939727c8bb8SPaolo Bonzini int main(void) 940727c8bb8SPaolo Bonzini { 941727c8bb8SPaolo Bonzini capng_capability_to_name(CAPNG_EFFECTIVE); 942727c8bb8SPaolo Bonzini return 0; 943727c8bb8SPaolo Bonzini }''', dependencies: libcap_ng) 944727c8bb8SPaolo Bonzini libcap_ng = not_found 945727c8bb8SPaolo Bonzini if get_option('cap_ng').enabled() 946727c8bb8SPaolo Bonzini error('could not link libcap-ng') 947727c8bb8SPaolo Bonzini else 948727c8bb8SPaolo Bonzini warning('could not link libcap-ng, disabling') 949727c8bb8SPaolo Bonzini endif 950727c8bb8SPaolo Bonziniendif 951727c8bb8SPaolo Bonzini 9521917ec6dSPaolo Bonziniif get_option('xkbcommon').auto() and not have_system and not have_tools 9531917ec6dSPaolo Bonzini xkbcommon = not_found 9541917ec6dSPaolo Bonzinielse 9551917ec6dSPaolo Bonzini xkbcommon = dependency('xkbcommon', required: get_option('xkbcommon'), 956063d5119SPaolo Bonzini method: 'pkg-config') 957ade60d4fSMarc-André Lureauendif 958e1723999SPaolo Bonzini 9595890258aSThomas Huthslirp = not_found 9605890258aSThomas Huthif not get_option('slirp').auto() or have_system 9615890258aSThomas Huth slirp = dependency('slirp', required: get_option('slirp'), 962063d5119SPaolo Bonzini method: 'pkg-config') 9635890258aSThomas Huth # slirp < 4.7 is incompatible with CFI support in QEMU. This is because 9645890258aSThomas Huth # it passes function pointers within libslirp as callbacks for timers. 9655890258aSThomas Huth # When using a system-wide shared libslirp, the type information for the 9665890258aSThomas Huth # callback is missing and the timer call produces a false positive with CFI. 9675890258aSThomas Huth # Do not use the "version" keyword argument to produce a better error. 9685890258aSThomas Huth # with control-flow integrity. 9695890258aSThomas Huth if get_option('cfi') and slirp.found() and slirp.version().version_compare('<4.7') 9705890258aSThomas Huth if get_option('slirp').enabled() 9715890258aSThomas Huth error('Control-Flow Integrity requires libslirp 4.7.') 9725890258aSThomas Huth else 9735890258aSThomas Huth warning('Cannot use libslirp since Control-Flow Integrity requires libslirp >= 4.7.') 9745890258aSThomas Huth slirp = not_found 9755890258aSThomas Huth endif 9765890258aSThomas Huth endif 9775890258aSThomas Huthendif 9785890258aSThomas Huth 979cdaf0722SMarc-André Lureauvde = not_found 980e1723999SPaolo Bonziniif not get_option('vde').auto() or have_system or have_tools 981e1723999SPaolo Bonzini vde = cc.find_library('vdeplug', has_headers: ['libvdeplug.h'], 982063d5119SPaolo Bonzini required: get_option('vde')) 983e1723999SPaolo Bonziniendif 984e1723999SPaolo Bonziniif vde.found() and not cc.links(''' 985e1723999SPaolo Bonzini #include <libvdeplug.h> 986e1723999SPaolo Bonzini int main(void) 987e1723999SPaolo Bonzini { 988e1723999SPaolo Bonzini struct vde_open_args a = {0, 0, 0}; 989e1723999SPaolo Bonzini char s[] = ""; 990e1723999SPaolo Bonzini vde_open(s, s, &a); 991e1723999SPaolo Bonzini return 0; 992e1723999SPaolo Bonzini }''', dependencies: vde) 993e1723999SPaolo Bonzini vde = not_found 994e1723999SPaolo Bonzini if get_option('cap_ng').enabled() 995e1723999SPaolo Bonzini error('could not link libvdeplug') 996e1723999SPaolo Bonzini else 997e1723999SPaolo Bonzini warning('could not link libvdeplug, disabling') 998e1723999SPaolo Bonzini endif 999cdaf0722SMarc-André Lureauendif 100087430d5bSPaolo Bonzini 1001478e943fSPaolo Bonzinipulse = not_found 100287430d5bSPaolo Bonziniif not get_option('pa').auto() or (targetos == 'linux' and have_system) 100387430d5bSPaolo Bonzini pulse = dependency('libpulse', required: get_option('pa'), 1004063d5119SPaolo Bonzini method: 'pkg-config') 1005478e943fSPaolo Bonziniendif 1006478e943fSPaolo Bonzinialsa = not_found 100787430d5bSPaolo Bonziniif not get_option('alsa').auto() or (targetos == 'linux' and have_system) 100887430d5bSPaolo Bonzini alsa = dependency('alsa', required: get_option('alsa'), 1009063d5119SPaolo Bonzini method: 'pkg-config') 1010478e943fSPaolo Bonziniendif 1011478e943fSPaolo Bonzinijack = not_found 101287430d5bSPaolo Bonziniif not get_option('jack').auto() or have_system 101387430d5bSPaolo Bonzini jack = dependency('jack', required: get_option('jack'), 1014063d5119SPaolo Bonzini method: 'pkg-config') 1015478e943fSPaolo Bonziniendif 1016c2d3d1c2SDorinda Basseypipewire = not_found 1017c2d3d1c2SDorinda Basseyif not get_option('pipewire').auto() or (targetos == 'linux' and have_system) 1018c2d3d1c2SDorinda Bassey pipewire = dependency('libpipewire-0.3', version: '>=0.3.60', 1019c2d3d1c2SDorinda Bassey required: get_option('pipewire'), 1020063d5119SPaolo Bonzini method: 'pkg-config') 1021c2d3d1c2SDorinda Basseyendif 1022663df1ccSAlexandre Ratchovsndio = not_found 1023663df1ccSAlexandre Ratchovif not get_option('sndio').auto() or have_system 1024663df1ccSAlexandre Ratchov sndio = dependency('sndio', required: get_option('sndio'), 1025063d5119SPaolo Bonzini method: 'pkg-config') 1026663df1ccSAlexandre Ratchovendif 102787430d5bSPaolo Bonzini 102858d3f3ffSGerd Hoffmannspice_protocol = not_found 10293f0a5d55SMarc-André Lureauif not get_option('spice_protocol').auto() or have_system 10305c167b53SMarkus Armbruster spice_protocol = dependency('spice-protocol', version: '>=0.14.0', 10313f0a5d55SMarc-André Lureau required: get_option('spice_protocol'), 1032063d5119SPaolo Bonzini method: 'pkg-config') 10332634733cSPaolo Bonziniendif 10343f0a5d55SMarc-André Lureauspice = not_found 10353f0a5d55SMarc-André Lureauif not get_option('spice').auto() or have_system 103634d55725SMarkus Armbruster spice = dependency('spice-server', version: '>=0.14.0', 10373f0a5d55SMarc-André Lureau required: get_option('spice'), 1038063d5119SPaolo Bonzini method: 'pkg-config') 103958d3f3ffSGerd Hoffmannendif 10403f0a5d55SMarc-André Lureauspice_headers = spice.partial_dependency(compile_args: true, includes: true) 10413f0a5d55SMarc-André Lureau 10425ee24e78SMarc-André Lureaurt = cc.find_library('rt', required: false) 1043a399f914SPaolo Bonzini 104499650b62SPaolo Bonzinilibiscsi = not_found 10459db405a3SPaolo Bonziniif not get_option('libiscsi').auto() or have_block 10469db405a3SPaolo Bonzini libiscsi = dependency('libiscsi', version: '>=1.9.0', 10479db405a3SPaolo Bonzini required: get_option('libiscsi'), 1048063d5119SPaolo Bonzini method: 'pkg-config') 104999650b62SPaolo Bonziniendif 10505e5733e5SMarc-André Lureauzstd = not_found 1051b1def33dSPaolo Bonziniif not get_option('zstd').auto() or have_block 1052b1def33dSPaolo Bonzini zstd = dependency('libzstd', version: '>=1.4.0', 1053b1def33dSPaolo Bonzini required: get_option('zstd'), 1054063d5119SPaolo Bonzini method: 'pkg-config') 10555e5733e5SMarc-André Lureauendif 1056ea458960SMarc-André Lureauvirgl = not_found 10570265fe9eSPaolo Bonzini 10580265fe9eSPaolo Bonzinihave_vhost_user_gpu = have_tools and targetos == 'linux' and pixman.found() 10590265fe9eSPaolo Bonziniif not get_option('virglrenderer').auto() or have_system or have_vhost_user_gpu 1060587d59d6SPaolo Bonzini virgl = dependency('virglrenderer', 1061587d59d6SPaolo Bonzini method: 'pkg-config', 1062063d5119SPaolo Bonzini required: get_option('virglrenderer')) 1063c1600f84SMarc-André Lureau if virgl.found() 1064c1600f84SMarc-André Lureau config_host_data.set('HAVE_VIRGL_D3D_INFO_EXT', 1065c1600f84SMarc-André Lureau cc.has_member('struct virgl_renderer_resource_info_ext', 'd3d_tex2d', 1066c1600f84SMarc-André Lureau prefix: '#include <virglrenderer.h>', 1067c1600f84SMarc-André Lureau dependencies: virgl)) 1068c1600f84SMarc-André Lureau endif 1069ea458960SMarc-André Lureauendif 1070fd66dbd4SStefan Hajnocziblkio = not_found 1071fd66dbd4SStefan Hajnocziif not get_option('blkio').auto() or have_block 1072fd66dbd4SStefan Hajnoczi blkio = dependency('blkio', 1073fd66dbd4SStefan Hajnoczi method: 'pkg-config', 1074063d5119SPaolo Bonzini required: get_option('blkio')) 1075fd66dbd4SStefan Hajnocziendif 10761d7bb6abSMarc-André Lureaucurl = not_found 1077f9cd86feSPaolo Bonziniif not get_option('curl').auto() or have_block 1078f9cd86feSPaolo Bonzini curl = dependency('libcurl', version: '>=7.29.0', 1079f9cd86feSPaolo Bonzini method: 'pkg-config', 1080063d5119SPaolo Bonzini required: get_option('curl')) 10811d7bb6abSMarc-André Lureauendif 1082f15bff25SPaolo Bonzinilibudev = not_found 1083f01496a3SPaolo Bonziniif targetos == 'linux' and (have_system or have_tools) 10846ec0e15dSPaolo Bonzini libudev = dependency('libudev', 1085a0fbbb6eSPaolo Bonzini method: 'pkg-config', 1086063d5119SPaolo Bonzini required: get_option('libudev')) 1087f15bff25SPaolo Bonziniendif 10886ec0e15dSPaolo Bonzini 10895c53015aSPaolo Bonzinimpathlibs = [libudev] 10906ec0e15dSPaolo Bonzinimpathpersist = not_found 109143a363aeSPaolo Bonziniif targetos == 'linux' and have_tools and get_option('mpath').allowed() 10926b40847aSPhilippe Mathieu-Daudé mpath_test_source = ''' 10936ec0e15dSPaolo Bonzini #include <libudev.h> 10946ec0e15dSPaolo Bonzini #include <mpath_persist.h> 10956ec0e15dSPaolo Bonzini unsigned mpath_mx_alloc_len = 1024; 10966ec0e15dSPaolo Bonzini int logsink; 10976ec0e15dSPaolo Bonzini static struct config *multipath_conf; 10986ec0e15dSPaolo Bonzini extern struct udev *udev; 10996ec0e15dSPaolo Bonzini extern struct config *get_multipath_config(void); 11006ec0e15dSPaolo Bonzini extern void put_multipath_config(struct config *conf); 11016ec0e15dSPaolo Bonzini struct udev *udev; 11026ec0e15dSPaolo Bonzini struct config *get_multipath_config(void) { return multipath_conf; } 11036ec0e15dSPaolo Bonzini void put_multipath_config(struct config *conf) { } 11046ec0e15dSPaolo Bonzini int main(void) { 11056ec0e15dSPaolo Bonzini udev = udev_new(); 11066ec0e15dSPaolo Bonzini multipath_conf = mpath_lib_init(); 11076ec0e15dSPaolo Bonzini return 0; 11086ec0e15dSPaolo Bonzini }''' 11095c53015aSPaolo Bonzini libmpathpersist = cc.find_library('mpathpersist', 1110063d5119SPaolo Bonzini required: get_option('mpath')) 11115c53015aSPaolo Bonzini if libmpathpersist.found() 11125c53015aSPaolo Bonzini mpathlibs += libmpathpersist 1113a0cbd2e8SPaolo Bonzini if get_option('prefer_static') 111443b43a40SPaolo Bonzini mpathlibs += cc.find_library('devmapper', 1115063d5119SPaolo Bonzini required: get_option('mpath')) 111643b43a40SPaolo Bonzini endif 111743b43a40SPaolo Bonzini mpathlibs += cc.find_library('multipath', 1118063d5119SPaolo Bonzini required: get_option('mpath')) 111943b43a40SPaolo Bonzini foreach lib: mpathlibs 112043b43a40SPaolo Bonzini if not lib.found() 112143b43a40SPaolo Bonzini mpathlibs = [] 112243b43a40SPaolo Bonzini break 112343b43a40SPaolo Bonzini endif 112443b43a40SPaolo Bonzini endforeach 11255c53015aSPaolo Bonzini if mpathlibs.length() == 0 11265c53015aSPaolo Bonzini msg = 'Dependencies missing for libmpathpersist' 11276b40847aSPhilippe Mathieu-Daudé elif cc.links(mpath_test_source, dependencies: mpathlibs) 11286ec0e15dSPaolo Bonzini mpathpersist = declare_dependency(dependencies: mpathlibs) 11296ec0e15dSPaolo Bonzini else 11305c53015aSPaolo Bonzini msg = 'Cannot detect libmpathpersist API' 11315c53015aSPaolo Bonzini endif 11325c53015aSPaolo Bonzini if not mpathpersist.found() 11336ec0e15dSPaolo Bonzini if get_option('mpath').enabled() 11345c53015aSPaolo Bonzini error(msg) 11356ec0e15dSPaolo Bonzini else 11365c53015aSPaolo Bonzini warning(msg + ', disabling') 11376ec0e15dSPaolo Bonzini endif 11386ec0e15dSPaolo Bonzini endif 11396ec0e15dSPaolo Bonzini endif 11406ec0e15dSPaolo Bonziniendif 11416ec0e15dSPaolo Bonzini 11425285e593SYonggang Luoiconv = not_found 114330fe76b1SPaolo Bonzinicurses = not_found 114443a363aeSPaolo Bonziniif have_system and get_option('curses').allowed() 11455285e593SYonggang Luo curses_test = ''' 1146fbab8cc2SStefan Weil #if defined(__APPLE__) || defined(__OpenBSD__) 1147fbab8cc2SStefan Weil #define _XOPEN_SOURCE_EXTENDED 1 1148fbab8cc2SStefan Weil #endif 11495285e593SYonggang Luo #include <locale.h> 11505285e593SYonggang Luo #include <curses.h> 11515285e593SYonggang Luo #include <wchar.h> 11525285e593SYonggang Luo int main(void) { 11535285e593SYonggang Luo wchar_t wch = L'w'; 11545285e593SYonggang Luo setlocale(LC_ALL, ""); 11555285e593SYonggang Luo resize_term(0, 0); 11565285e593SYonggang Luo addwstr(L"wide chars\n"); 11575285e593SYonggang Luo addnwstr(&wch, 1); 11585285e593SYonggang Luo add_wch(WACS_DEGREE); 11595285e593SYonggang Luo return 0; 11605285e593SYonggang Luo }''' 1161925a40dfSPaolo Bonzini 1162ca31e307SYonggang Luo curses_dep_list = targetos == 'windows' ? ['ncurses', 'ncursesw'] : ['ncursesw'] 11636d322635SPaolo Bonzini curses = dependency(curses_dep_list, 11645285e593SYonggang Luo required: false, 1165063d5119SPaolo Bonzini method: 'pkg-config') 1166925a40dfSPaolo Bonzini msg = get_option('curses').enabled() ? 'curses library not found' : '' 1167fbab8cc2SStefan Weil curses_compile_args = ['-DNCURSES_WIDECHAR=1'] 1168925a40dfSPaolo Bonzini if curses.found() 11690dbce6efSPaolo Bonzini if cc.links(curses_test, args: curses_compile_args, dependencies: [curses]) 1170bd3615d6SPaolo Bonzini curses = declare_dependency(compile_args: curses_compile_args, dependencies: [curses], 1171bd3615d6SPaolo Bonzini version: curses.version()) 1172925a40dfSPaolo Bonzini else 1173925a40dfSPaolo Bonzini msg = 'curses package not usable' 1174925a40dfSPaolo Bonzini curses = not_found 11755285e593SYonggang Luo endif 1176925a40dfSPaolo Bonzini endif 1177925a40dfSPaolo Bonzini if not curses.found() 1178925a40dfSPaolo Bonzini has_curses_h = cc.has_header('curses.h', args: curses_compile_args) 1179925a40dfSPaolo Bonzini if targetos != 'windows' and not has_curses_h 1180925a40dfSPaolo Bonzini message('Trying with /usr/include/ncursesw') 1181925a40dfSPaolo Bonzini curses_compile_args += ['-I/usr/include/ncursesw'] 1182925a40dfSPaolo Bonzini has_curses_h = cc.has_header('curses.h', args: curses_compile_args) 1183925a40dfSPaolo Bonzini endif 1184925a40dfSPaolo Bonzini if has_curses_h 1185925a40dfSPaolo Bonzini curses_libname_list = (targetos == 'windows' ? ['pdcurses'] : ['ncursesw', 'cursesw']) 1186925a40dfSPaolo Bonzini foreach curses_libname : curses_libname_list 11875285e593SYonggang Luo libcurses = cc.find_library(curses_libname, 1188063d5119SPaolo Bonzini required: false) 11895285e593SYonggang Luo if libcurses.found() 1190925a40dfSPaolo Bonzini if cc.links(curses_test, args: curses_compile_args, dependencies: libcurses) 1191925a40dfSPaolo Bonzini curses = declare_dependency(compile_args: curses_compile_args, 1192925a40dfSPaolo Bonzini dependencies: [libcurses]) 11935285e593SYonggang Luo break 1194925a40dfSPaolo Bonzini else 1195925a40dfSPaolo Bonzini msg = 'curses library not usable' 11965285e593SYonggang Luo endif 11975285e593SYonggang Luo endif 11985285e593SYonggang Luo endforeach 11995285e593SYonggang Luo endif 120030fe76b1SPaolo Bonzini endif 120143a363aeSPaolo Bonzini if get_option('iconv').allowed() 1202925a40dfSPaolo Bonzini foreach link_args : [ ['-liconv'], [] ] 1203925a40dfSPaolo Bonzini # Programs will be linked with glib and this will bring in libiconv on FreeBSD. 1204925a40dfSPaolo Bonzini # We need to use libiconv if available because mixing libiconv's headers with 1205925a40dfSPaolo Bonzini # the system libc does not work. 1206925a40dfSPaolo Bonzini # However, without adding glib to the dependencies -L/usr/local/lib will not be 1207925a40dfSPaolo Bonzini # included in the command line and libiconv will not be found. 1208925a40dfSPaolo Bonzini if cc.links(''' 1209925a40dfSPaolo Bonzini #include <iconv.h> 1210925a40dfSPaolo Bonzini int main(void) { 1211925a40dfSPaolo Bonzini iconv_t conv = iconv_open("WCHAR_T", "UCS-2"); 1212925a40dfSPaolo Bonzini return conv != (iconv_t) -1; 1213fc9a809eSPaolo Bonzini }''', args: link_args, dependencies: glib) 1214925a40dfSPaolo Bonzini iconv = declare_dependency(link_args: link_args, dependencies: glib) 1215925a40dfSPaolo Bonzini break 1216925a40dfSPaolo Bonzini endif 1217925a40dfSPaolo Bonzini endforeach 1218925a40dfSPaolo Bonzini endif 1219925a40dfSPaolo Bonzini if curses.found() and not iconv.found() 1220925a40dfSPaolo Bonzini if get_option('iconv').enabled() 1221925a40dfSPaolo Bonzini error('iconv not available') 1222925a40dfSPaolo Bonzini endif 1223925a40dfSPaolo Bonzini msg = 'iconv required for curses UI but not available' 1224925a40dfSPaolo Bonzini curses = not_found 1225925a40dfSPaolo Bonzini endif 1226925a40dfSPaolo Bonzini if not curses.found() and msg != '' 1227925a40dfSPaolo Bonzini if get_option('curses').enabled() 1228925a40dfSPaolo Bonzini error(msg) 12295285e593SYonggang Luo else 1230925a40dfSPaolo Bonzini warning(msg + ', disabling') 123130fe76b1SPaolo Bonzini endif 12325285e593SYonggang Luo endif 12335285e593SYonggang Luoendif 12345285e593SYonggang Luo 12352634733cSPaolo Bonzinibrlapi = not_found 12368c6d4ff4SPaolo Bonziniif not get_option('brlapi').auto() or have_system 12378c6d4ff4SPaolo Bonzini brlapi = cc.find_library('brlapi', has_headers: ['brlapi.h'], 1238063d5119SPaolo Bonzini required: get_option('brlapi')) 12398c6d4ff4SPaolo Bonzini if brlapi.found() and not cc.links(''' 12408c6d4ff4SPaolo Bonzini #include <brlapi.h> 12418c6d4ff4SPaolo Bonzini #include <stddef.h> 12428c6d4ff4SPaolo Bonzini int main(void) { return brlapi__openConnection (NULL, NULL, NULL); }''', dependencies: brlapi) 12438c6d4ff4SPaolo Bonzini brlapi = not_found 12448c6d4ff4SPaolo Bonzini if get_option('brlapi').enabled() 12458c6d4ff4SPaolo Bonzini error('could not link brlapi') 12468c6d4ff4SPaolo Bonzini else 12478c6d4ff4SPaolo Bonzini warning('could not link brlapi, disabling') 12488c6d4ff4SPaolo Bonzini endif 12498c6d4ff4SPaolo Bonzini endif 12502634733cSPaolo Bonziniendif 125135be72baSPaolo Bonzini 1252760e4327SPaolo Bonzinisdl = not_found 125364d3fec7SAkihiko Odakiif not get_option('sdl').auto() or have_system 1254063d5119SPaolo Bonzini sdl = dependency('sdl2', required: get_option('sdl')) 125535be72baSPaolo Bonzini sdl_image = not_found 1256760e4327SPaolo Bonziniendif 125735be72baSPaolo Bonziniif sdl.found() 12586da5f22bSThomas Huth # Some versions of SDL have problems with -Wundef 12596da5f22bSThomas Huth if not cc.compiles(''' 12606da5f22bSThomas Huth #include <SDL.h> 12616da5f22bSThomas Huth #include <SDL_syswm.h> 12626da5f22bSThomas Huth int main(int argc, char *argv[]) { return 0; } 12636da5f22bSThomas Huth ''', dependencies: sdl, args: '-Werror=undef') 126435be72baSPaolo Bonzini sdl = declare_dependency(compile_args: '-Wno-undef', 1265bd3615d6SPaolo Bonzini dependencies: sdl, 1266bd3615d6SPaolo Bonzini version: sdl.version()) 12676da5f22bSThomas Huth endif 12687161a433SVolker Rümelin sdl_image = dependency('SDL2_image', required: get_option('sdl_image'), 1269063d5119SPaolo Bonzini method: 'pkg-config') 127035be72baSPaolo Bonzinielse 127135be72baSPaolo Bonzini if get_option('sdl_image').enabled() 1272a8dc2aceSSergei Trofimovich error('sdl-image required, but SDL was @0@'.format( 1273a8dc2aceSSergei Trofimovich get_option('sdl').disabled() ? 'disabled' : 'not found')) 12742634733cSPaolo Bonzini endif 127535be72baSPaolo Bonzini sdl_image = not_found 127635be72baSPaolo Bonziniendif 127735be72baSPaolo Bonzini 12785e5733e5SMarc-André Lureaurbd = not_found 1279fabd1e93SPaolo Bonziniif not get_option('rbd').auto() or have_block 1280063d5119SPaolo Bonzini librados = cc.find_library('rados', required: get_option('rbd')) 1281fabd1e93SPaolo Bonzini librbd = cc.find_library('rbd', has_headers: ['rbd/librbd.h'], 1282063d5119SPaolo Bonzini required: get_option('rbd')) 1283c518d6c2SPaolo Bonzini if librados.found() and librbd.found() 1284c518d6c2SPaolo Bonzini if cc.links(''' 1285fabd1e93SPaolo Bonzini #include <stdio.h> 1286fabd1e93SPaolo Bonzini #include <rbd/librbd.h> 1287fabd1e93SPaolo Bonzini int main(void) { 1288fabd1e93SPaolo Bonzini rados_t cluster; 1289fabd1e93SPaolo Bonzini rados_create(&cluster, NULL); 129048672ac0SPeter Lieven #if LIBRBD_VERSION_CODE < LIBRBD_VERSION(1, 12, 0) 129148672ac0SPeter Lieven #error 129248672ac0SPeter Lieven #endif 1293fabd1e93SPaolo Bonzini return 0; 1294fabd1e93SPaolo Bonzini }''', dependencies: [librbd, librados]) 1295fabd1e93SPaolo Bonzini rbd = declare_dependency(dependencies: [librbd, librados]) 1296c518d6c2SPaolo Bonzini elif get_option('rbd').enabled() 129748672ac0SPeter Lieven error('librbd >= 1.12.0 required') 1298c518d6c2SPaolo Bonzini else 129948672ac0SPeter Lieven warning('librbd >= 1.12.0 not found, disabling') 1300c518d6c2SPaolo Bonzini endif 13015e5733e5SMarc-André Lureau endif 1302fabd1e93SPaolo Bonziniendif 1303fabd1e93SPaolo Bonzini 13045e5733e5SMarc-André Lureauglusterfs = not_found 130508821ca2SPaolo Bonziniglusterfs_ftruncate_has_stat = false 130608821ca2SPaolo Bonziniglusterfs_iocb_has_stat = false 130708821ca2SPaolo Bonziniif not get_option('glusterfs').auto() or have_block 130808821ca2SPaolo Bonzini glusterfs = dependency('glusterfs-api', version: '>=3', 130908821ca2SPaolo Bonzini required: get_option('glusterfs'), 1310063d5119SPaolo Bonzini method: 'pkg-config') 131108821ca2SPaolo Bonzini if glusterfs.found() 131208821ca2SPaolo Bonzini glusterfs_ftruncate_has_stat = cc.links(''' 131308821ca2SPaolo Bonzini #include <glusterfs/api/glfs.h> 131408821ca2SPaolo Bonzini 131508821ca2SPaolo Bonzini int 131608821ca2SPaolo Bonzini main(void) 131708821ca2SPaolo Bonzini { 131808821ca2SPaolo Bonzini /* new glfs_ftruncate() passes two additional args */ 131908821ca2SPaolo Bonzini return glfs_ftruncate(NULL, 0, NULL, NULL); 132008821ca2SPaolo Bonzini } 132108821ca2SPaolo Bonzini ''', dependencies: glusterfs) 132208821ca2SPaolo Bonzini glusterfs_iocb_has_stat = cc.links(''' 132308821ca2SPaolo Bonzini #include <glusterfs/api/glfs.h> 132408821ca2SPaolo Bonzini 132508821ca2SPaolo Bonzini /* new glfs_io_cbk() passes two additional glfs_stat structs */ 132608821ca2SPaolo Bonzini static void 132708821ca2SPaolo Bonzini glusterfs_iocb(glfs_fd_t *fd, ssize_t ret, struct glfs_stat *prestat, struct glfs_stat *poststat, void *data) 132808821ca2SPaolo Bonzini {} 132908821ca2SPaolo Bonzini 133008821ca2SPaolo Bonzini int 133108821ca2SPaolo Bonzini main(void) 133208821ca2SPaolo Bonzini { 133308821ca2SPaolo Bonzini glfs_io_cbk iocb = &glusterfs_iocb; 133408821ca2SPaolo Bonzini iocb(NULL, 0 , NULL, NULL, NULL); 133508821ca2SPaolo Bonzini return 0; 133608821ca2SPaolo Bonzini } 133708821ca2SPaolo Bonzini ''', dependencies: glusterfs) 133808821ca2SPaolo Bonzini endif 13395e5733e5SMarc-André Lureauendif 1340e6a52b36SThomas Huth 13415e5733e5SMarc-André Lureaulibssh = not_found 1342e6a52b36SThomas Huthif not get_option('libssh').auto() or have_block 1343e6a52b36SThomas Huth libssh = dependency('libssh', version: '>=0.8.7', 1344e6a52b36SThomas Huth method: 'pkg-config', 1345063d5119SPaolo Bonzini required: get_option('libssh')) 13465e5733e5SMarc-André Lureauendif 1347e6a52b36SThomas Huth 13485e5733e5SMarc-André Lureaulibbzip2 = not_found 134929ba6116SPaolo Bonziniif not get_option('bzip2').auto() or have_block 135029ba6116SPaolo Bonzini libbzip2 = cc.find_library('bz2', has_headers: ['bzlib.h'], 1351063d5119SPaolo Bonzini required: get_option('bzip2')) 135229ba6116SPaolo Bonzini if libbzip2.found() and not cc.links(''' 135329ba6116SPaolo Bonzini #include <bzlib.h> 135429ba6116SPaolo Bonzini int main(void) { BZ2_bzlibVersion(); return 0; }''', dependencies: libbzip2) 135529ba6116SPaolo Bonzini libbzip2 = not_found 135629ba6116SPaolo Bonzini if get_option('bzip2').enabled() 135729ba6116SPaolo Bonzini error('could not link libbzip2') 135829ba6116SPaolo Bonzini else 135929ba6116SPaolo Bonzini warning('could not link libbzip2, disabling') 13605e5733e5SMarc-André Lureau endif 136129ba6116SPaolo Bonzini endif 13625e5733e5SMarc-André Lureauendif 1363ecea3696SPaolo Bonzini 13645e5733e5SMarc-André Lureauliblzfse = not_found 1365ecea3696SPaolo Bonziniif not get_option('lzfse').auto() or have_block 1366ecea3696SPaolo Bonzini liblzfse = cc.find_library('lzfse', has_headers: ['lzfse.h'], 1367063d5119SPaolo Bonzini required: get_option('lzfse')) 13685e5733e5SMarc-André Lureauendif 1369ecea3696SPaolo Bonziniif liblzfse.found() and not cc.links(''' 1370ecea3696SPaolo Bonzini #include <lzfse.h> 1371ecea3696SPaolo Bonzini int main(void) { lzfse_decode_scratch_size(); return 0; }''', dependencies: liblzfse) 1372ecea3696SPaolo Bonzini liblzfse = not_found 1373ecea3696SPaolo Bonzini if get_option('lzfse').enabled() 1374ecea3696SPaolo Bonzini error('could not link liblzfse') 1375ecea3696SPaolo Bonzini else 1376ecea3696SPaolo Bonzini warning('could not link liblzfse, disabling') 1377ecea3696SPaolo Bonzini endif 1378ecea3696SPaolo Bonziniendif 1379ecea3696SPaolo Bonzini 1380478e943fSPaolo Bonzinioss = not_found 138143a363aeSPaolo Bonziniif get_option('oss').allowed() and have_system 138287430d5bSPaolo Bonzini if not cc.has_header('sys/soundcard.h') 138387430d5bSPaolo Bonzini # not found 138487430d5bSPaolo Bonzini elif targetos == 'netbsd' 1385063d5119SPaolo Bonzini oss = cc.find_library('ossaudio', required: get_option('oss')) 138687430d5bSPaolo Bonzini else 138787430d5bSPaolo Bonzini oss = declare_dependency() 138887430d5bSPaolo Bonzini endif 138987430d5bSPaolo Bonzini 139087430d5bSPaolo Bonzini if not oss.found() 139187430d5bSPaolo Bonzini if get_option('oss').enabled() 139287430d5bSPaolo Bonzini error('OSS not found') 139387430d5bSPaolo Bonzini endif 139487430d5bSPaolo Bonzini endif 1395478e943fSPaolo Bonziniendif 1396478e943fSPaolo Bonzinidsound = not_found 139787430d5bSPaolo Bonziniif not get_option('dsound').auto() or (targetos == 'windows' and have_system) 139887430d5bSPaolo Bonzini if cc.has_header('dsound.h') 139987430d5bSPaolo Bonzini dsound = declare_dependency(link_args: ['-lole32', '-ldxguid']) 1400478e943fSPaolo Bonzini endif 140187430d5bSPaolo Bonzini 140287430d5bSPaolo Bonzini if not dsound.found() 140387430d5bSPaolo Bonzini if get_option('dsound').enabled() 140487430d5bSPaolo Bonzini error('DirectSound not found') 140587430d5bSPaolo Bonzini endif 140687430d5bSPaolo Bonzini endif 140787430d5bSPaolo Bonziniendif 140887430d5bSPaolo Bonzini 1409478e943fSPaolo Bonzinicoreaudio = not_found 141087430d5bSPaolo Bonziniif not get_option('coreaudio').auto() or (targetos == 'darwin' and have_system) 141187430d5bSPaolo Bonzini coreaudio = dependency('appleframeworks', modules: 'CoreAudio', 141287430d5bSPaolo Bonzini required: get_option('coreaudio')) 1413478e943fSPaolo Bonziniendif 14148bc5184dSThomas Huth 14152b1ccdf4SMarc-André Lureauopengl = not_found 141688b6e618SPaolo Bonziniif not get_option('opengl').auto() or have_system or have_vhost_user_gpu 141788b6e618SPaolo Bonzini epoxy = dependency('epoxy', method: 'pkg-config', 1418063d5119SPaolo Bonzini required: get_option('opengl')) 141988b6e618SPaolo Bonzini if cc.has_header('epoxy/egl.h', dependencies: epoxy) 142088b6e618SPaolo Bonzini opengl = epoxy 142188b6e618SPaolo Bonzini elif get_option('opengl').enabled() 142288b6e618SPaolo Bonzini error('epoxy/egl.h not found') 142388b6e618SPaolo Bonzini endif 14242b1ccdf4SMarc-André Lureauendif 14258bc5184dSThomas Huthgbm = not_found 14268bc5184dSThomas Huthif (have_system or have_tools) and (virgl.found() or opengl.found()) 1427063d5119SPaolo Bonzini gbm = dependency('gbm', method: 'pkg-config', required: false) 14288bc5184dSThomas Huthendif 1429f0caba44SMarc-André Lureauhave_vhost_user_gpu = have_vhost_user_gpu and virgl.found() and opengl.found() and gbm.found() 14301b695471SPaolo Bonzini 143157612511SPaolo Bonzinignutls = not_found 1432cc4c7c73SDaniel P. Berrangégnutls_crypto = not_found 1433abc14fd0SAlyssa Rossif get_option('gnutls').enabled() or (get_option('gnutls').auto() and have_system) 1434cc4c7c73SDaniel P. Berrangé # For general TLS support our min gnutls matches 1435cc4c7c73SDaniel P. Berrangé # that implied by our platform support matrix 1436cc4c7c73SDaniel P. Berrangé # 1437cc4c7c73SDaniel P. Berrangé # For the crypto backends, we look for a newer 1438cc4c7c73SDaniel P. Berrangé # gnutls: 1439cc4c7c73SDaniel P. Berrangé # 1440cc4c7c73SDaniel P. Berrangé # Version 3.6.8 is needed to get XTS 1441cc4c7c73SDaniel P. Berrangé # Version 3.6.13 is needed to get PBKDF 1442cc4c7c73SDaniel P. Berrangé # Version 3.6.14 is needed to get HW accelerated XTS 1443cc4c7c73SDaniel P. Berrangé # 1444cc4c7c73SDaniel P. Berrangé # If newer enough gnutls isn't available, we can 1445cc4c7c73SDaniel P. Berrangé # still use a different crypto backend to satisfy 1446cc4c7c73SDaniel P. Berrangé # the platform support requirements 1447cc4c7c73SDaniel P. Berrangé gnutls_crypto = dependency('gnutls', version: '>=3.6.14', 1448cc4c7c73SDaniel P. Berrangé method: 'pkg-config', 1449063d5119SPaolo Bonzini required: false) 1450cc4c7c73SDaniel P. Berrangé if gnutls_crypto.found() 1451cc4c7c73SDaniel P. Berrangé gnutls = gnutls_crypto 1452cc4c7c73SDaniel P. Berrangé else 1453cc4c7c73SDaniel P. Berrangé # Our min version if all we need is TLS 145457612511SPaolo Bonzini gnutls = dependency('gnutls', version: '>=3.5.18', 145557612511SPaolo Bonzini method: 'pkg-config', 1456063d5119SPaolo Bonzini required: get_option('gnutls')) 145757612511SPaolo Bonzini endif 1458cc4c7c73SDaniel P. Berrangéendif 145957612511SPaolo Bonzini 14608bd0931fSDaniel P. Berrangé# We prefer use of gnutls for crypto, unless the options 14618bd0931fSDaniel P. Berrangé# explicitly asked for nettle or gcrypt. 14628bd0931fSDaniel P. Berrangé# 14638bd0931fSDaniel P. Berrangé# If gnutls isn't available for crypto, then we'll prefer 14648bd0931fSDaniel P. Berrangé# gcrypt over nettle for performance reasons. 146557612511SPaolo Bonzinigcrypt = not_found 146657612511SPaolo Bonzininettle = not_found 14674c5e512eSLei Hehogweed = not_found 146868014044SDaniel P. Berrangéxts = 'none' 14698bd0931fSDaniel P. Berrangé 147057612511SPaolo Bonziniif get_option('nettle').enabled() and get_option('gcrypt').enabled() 147157612511SPaolo Bonzini error('Only one of gcrypt & nettle can be enabled') 147257612511SPaolo Bonziniendif 14738bd0931fSDaniel P. Berrangé 14748bd0931fSDaniel P. Berrangé# Explicit nettle/gcrypt request, so ignore gnutls for crypto 14758bd0931fSDaniel P. Berrangéif get_option('nettle').enabled() or get_option('gcrypt').enabled() 14768bd0931fSDaniel P. Berrangé gnutls_crypto = not_found 147757612511SPaolo Bonziniendif 14788bd0931fSDaniel P. Berrangé 14798bd0931fSDaniel P. Berrangéif not gnutls_crypto.found() 14808bd0931fSDaniel P. Berrangé if (not get_option('gcrypt').auto() or have_system) and not get_option('nettle').enabled() 14811741093bSDaniel P. Berrangé gcrypt = dependency('libgcrypt', version: '>=1.8', 148257612511SPaolo Bonzini method: 'config-tool', 1483063d5119SPaolo Bonzini required: get_option('gcrypt')) 148457612511SPaolo Bonzini # Debian has removed -lgpg-error from libgcrypt-config 148557612511SPaolo Bonzini # as it "spreads unnecessary dependencies" which in 148657612511SPaolo Bonzini # turn breaks static builds... 1487a0cbd2e8SPaolo Bonzini if gcrypt.found() and get_option('prefer_static') 1488bd3615d6SPaolo Bonzini gcrypt = declare_dependency(dependencies: 1489bd3615d6SPaolo Bonzini [gcrypt, 1490bd3615d6SPaolo Bonzini cc.find_library('gpg-error', required: true)], 1491bd3615d6SPaolo Bonzini version: gcrypt.version()) 149257612511SPaolo Bonzini endif 149357612511SPaolo Bonzini endif 1494260a13d4SDaniel P. Berrangé if (not get_option('nettle').auto() or have_system) and not gcrypt.found() 1495260a13d4SDaniel P. Berrangé nettle = dependency('nettle', version: '>=3.4', 1496260a13d4SDaniel P. Berrangé method: 'pkg-config', 1497063d5119SPaolo Bonzini required: get_option('nettle')) 1498260a13d4SDaniel P. Berrangé if nettle.found() and not cc.has_header('nettle/xts.h', dependencies: nettle) 1499260a13d4SDaniel P. Berrangé xts = 'private' 1500260a13d4SDaniel P. Berrangé endif 1501260a13d4SDaniel P. Berrangé endif 1502cc4c7c73SDaniel P. Berrangéendif 150357612511SPaolo Bonzini 1504063d5119SPaolo Bonzinigmp = dependency('gmp', required: false, method: 'pkg-config') 15054c5e512eSLei Heif nettle.found() and gmp.found() 15064c5e512eSLei He hogweed = dependency('hogweed', version: '>=3.4', 15074c5e512eSLei He method: 'pkg-config', 1508063d5119SPaolo Bonzini required: get_option('nettle')) 15094c5e512eSLei Heendif 15104c5e512eSLei He 15114c5e512eSLei He 15122b1ccdf4SMarc-André Lureaugtk = not_found 15131b695471SPaolo Bonzinigtkx11 = not_found 1514c23d7b4eSPaolo Bonzinivte = not_found 151529e0bfffSClaudio Fontanahave_gtk_clipboard = get_option('gtk_clipboard').enabled() 151629e0bfffSClaudio Fontana 151764d3fec7SAkihiko Odakiif not get_option('gtk').auto() or have_system 15181b695471SPaolo Bonzini gtk = dependency('gtk+-3.0', version: '>=3.22.0', 15191b695471SPaolo Bonzini method: 'pkg-config', 1520063d5119SPaolo Bonzini required: get_option('gtk')) 15211b695471SPaolo Bonzini if gtk.found() 15221b695471SPaolo Bonzini gtkx11 = dependency('gtk+-x11-3.0', version: '>=3.22.0', 15231b695471SPaolo Bonzini method: 'pkg-config', 1524063d5119SPaolo Bonzini required: false) 1525bd3615d6SPaolo Bonzini gtk = declare_dependency(dependencies: [gtk, gtkx11], 1526bd3615d6SPaolo Bonzini version: gtk.version()) 1527c23d7b4eSPaolo Bonzini 1528c23d7b4eSPaolo Bonzini if not get_option('vte').auto() or have_system 1529c23d7b4eSPaolo Bonzini vte = dependency('vte-2.91', 1530c23d7b4eSPaolo Bonzini method: 'pkg-config', 1531063d5119SPaolo Bonzini required: get_option('vte')) 1532c23d7b4eSPaolo Bonzini endif 153329e0bfffSClaudio Fontana elif have_gtk_clipboard 153429e0bfffSClaudio Fontana error('GTK clipboard requested, but GTK not found') 15352b1ccdf4SMarc-André Lureau endif 15361b695471SPaolo Bonziniendif 15371b695471SPaolo Bonzini 15382b1ccdf4SMarc-André Lureaux11 = not_found 15399d49bcf6SMarkus Armbrusterif gtkx11.found() 1540063d5119SPaolo Bonzini x11 = dependency('x11', method: 'pkg-config', required: gtkx11.found()) 15412b1ccdf4SMarc-André Lureauendif 15422b1ccdf4SMarc-André Lureaupng = not_found 154395f8510eSKshitij Suriif get_option('png').allowed() and have_system 15441ec8c2c0SThomas Huth png = dependency('libpng', version: '>=1.6.34', required: get_option('png'), 1545063d5119SPaolo Bonzini method: 'pkg-config') 154695f8510eSKshitij Suriendif 154795f8510eSKshitij Surivnc = not_found 15482b1ccdf4SMarc-André Lureaujpeg = not_found 15492b1ccdf4SMarc-André Lureausasl = not_found 155043a363aeSPaolo Bonziniif get_option('vnc').allowed() and have_system 1551a0b93237SPaolo Bonzini vnc = declare_dependency() # dummy dependency 15528e242b3cSPaolo Bonzini jpeg = dependency('libjpeg', required: get_option('vnc_jpeg'), 1553063d5119SPaolo Bonzini method: 'pkg-config') 1554a0b93237SPaolo Bonzini sasl = cc.find_library('sasl2', has_headers: ['sasl/sasl.h'], 1555063d5119SPaolo Bonzini required: get_option('vnc_sasl')) 1556a0b93237SPaolo Bonzini if sasl.found() 1557a0b93237SPaolo Bonzini sasl = declare_dependency(dependencies: sasl, 1558a0b93237SPaolo Bonzini compile_args: '-DSTRUCT_IOVEC_DEFINED') 1559a0b93237SPaolo Bonzini endif 15602b1ccdf4SMarc-André Lureauendif 1561241611eaSPaolo Bonzini 156205e391aeSPaolo Bonzinipam = not_found 156305e391aeSPaolo Bonziniif not get_option('auth_pam').auto() or have_system 156405e391aeSPaolo Bonzini pam = cc.find_library('pam', has_headers: ['security/pam_appl.h'], 1565063d5119SPaolo Bonzini required: get_option('auth_pam')) 156605e391aeSPaolo Bonziniendif 156705e391aeSPaolo Bonziniif pam.found() and not cc.links(''' 156805e391aeSPaolo Bonzini #include <stddef.h> 156905e391aeSPaolo Bonzini #include <security/pam_appl.h> 157005e391aeSPaolo Bonzini int main(void) { 157105e391aeSPaolo Bonzini const char *service_name = "qemu"; 157205e391aeSPaolo Bonzini const char *user = "frank"; 157305e391aeSPaolo Bonzini const struct pam_conv pam_conv = { 0 }; 157405e391aeSPaolo Bonzini pam_handle_t *pamh = NULL; 157505e391aeSPaolo Bonzini pam_start(service_name, user, &pam_conv, &pamh); 157605e391aeSPaolo Bonzini return 0; 157705e391aeSPaolo Bonzini }''', dependencies: pam) 157805e391aeSPaolo Bonzini pam = not_found 157905e391aeSPaolo Bonzini if get_option('auth_pam').enabled() 158005e391aeSPaolo Bonzini error('could not link libpam') 158105e391aeSPaolo Bonzini else 158205e391aeSPaolo Bonzini warning('could not link libpam, disabling') 158305e391aeSPaolo Bonzini endif 158405e391aeSPaolo Bonziniendif 158505e391aeSPaolo Bonzini 1586708eab42SMarc-André Lureausnappy = not_found 1587241611eaSPaolo Bonziniif not get_option('snappy').auto() or have_system 1588241611eaSPaolo Bonzini snappy = cc.find_library('snappy', has_headers: ['snappy-c.h'], 1589063d5119SPaolo Bonzini required: get_option('snappy')) 1590708eab42SMarc-André Lureauendif 1591785abf0dSThomas Huthif snappy.found() and not cc.links(''' 1592241611eaSPaolo Bonzini #include <snappy-c.h> 1593241611eaSPaolo Bonzini int main(void) { snappy_max_compressed_length(4096); return 0; }''', dependencies: snappy) 1594241611eaSPaolo Bonzini snappy = not_found 1595241611eaSPaolo Bonzini if get_option('snappy').enabled() 1596241611eaSPaolo Bonzini error('could not link libsnappy') 1597241611eaSPaolo Bonzini else 1598241611eaSPaolo Bonzini warning('could not link libsnappy, disabling') 1599241611eaSPaolo Bonzini endif 1600708eab42SMarc-André Lureauendif 16010c32a0aeSPaolo Bonzini 1602708eab42SMarc-André Lureaulzo = not_found 16030c32a0aeSPaolo Bonziniif not get_option('lzo').auto() or have_system 16040c32a0aeSPaolo Bonzini lzo = cc.find_library('lzo2', has_headers: ['lzo/lzo1x.h'], 1605063d5119SPaolo Bonzini required: get_option('lzo')) 1606708eab42SMarc-André Lureauendif 16070c32a0aeSPaolo Bonziniif lzo.found() and not cc.links(''' 16080c32a0aeSPaolo Bonzini #include <lzo/lzo1x.h> 16090c32a0aeSPaolo Bonzini int main(void) { lzo_version(); return 0; }''', dependencies: lzo) 16100c32a0aeSPaolo Bonzini lzo = not_found 16110c32a0aeSPaolo Bonzini if get_option('lzo').enabled() 16120c32a0aeSPaolo Bonzini error('could not link liblzo2') 16130c32a0aeSPaolo Bonzini else 16140c32a0aeSPaolo Bonzini warning('could not link liblzo2, disabling') 16150c32a0aeSPaolo Bonzini endif 16160c32a0aeSPaolo Bonziniendif 16170c32a0aeSPaolo Bonzini 1618488a8c73SPaolo Bonzininuma = not_found 1619488a8c73SPaolo Bonziniif not get_option('numa').auto() or have_system or have_tools 1620488a8c73SPaolo Bonzini numa = cc.find_library('numa', has_headers: ['numa.h'], 1621063d5119SPaolo Bonzini required: get_option('numa')) 1622488a8c73SPaolo Bonziniendif 1623488a8c73SPaolo Bonziniif numa.found() and not cc.links(''' 1624488a8c73SPaolo Bonzini #include <numa.h> 1625488a8c73SPaolo Bonzini int main(void) { return numa_available(); } 1626488a8c73SPaolo Bonzini ''', dependencies: numa) 1627488a8c73SPaolo Bonzini numa = not_found 1628488a8c73SPaolo Bonzini if get_option('numa').enabled() 1629488a8c73SPaolo Bonzini error('could not link numa') 1630488a8c73SPaolo Bonzini else 1631488a8c73SPaolo Bonzini warning('could not link numa, disabling') 1632488a8c73SPaolo Bonzini endif 1633488a8c73SPaolo Bonziniendif 1634488a8c73SPaolo Bonzini 163555166230SMarc-André Lureaurdma = not_found 16363730a734SPaolo Bonziniif not get_option('rdma').auto() or have_system 16373730a734SPaolo Bonzini libumad = cc.find_library('ibumad', required: get_option('rdma')) 16383730a734SPaolo Bonzini rdma_libs = [cc.find_library('rdmacm', has_headers: ['rdma/rdma_cma.h'], 1639063d5119SPaolo Bonzini required: get_option('rdma')), 1640063d5119SPaolo Bonzini cc.find_library('ibverbs', required: get_option('rdma')), 16413730a734SPaolo Bonzini libumad] 16423730a734SPaolo Bonzini rdma = declare_dependency(dependencies: rdma_libs) 16433730a734SPaolo Bonzini foreach lib: rdma_libs 16443730a734SPaolo Bonzini if not lib.found() 16453730a734SPaolo Bonzini rdma = not_found 164655166230SMarc-André Lureau endif 16473730a734SPaolo Bonzini endforeach 16483730a734SPaolo Bonziniendif 16493730a734SPaolo Bonzini 1650582ea95fSMarc-André Lureauxen = not_found 165114efd8d3SPaolo Bonziniif get_option('xen').enabled() or (get_option('xen').auto() and have_system) 165214efd8d3SPaolo Bonzini xencontrol = dependency('xencontrol', required: false, 1653063d5119SPaolo Bonzini method: 'pkg-config') 165414efd8d3SPaolo Bonzini if xencontrol.found() 165514efd8d3SPaolo Bonzini xen_pc = declare_dependency(version: xencontrol.version(), 165614efd8d3SPaolo Bonzini dependencies: [ 165714efd8d3SPaolo Bonzini xencontrol, 165814efd8d3SPaolo Bonzini # disabler: true makes xen_pc.found() return false if any is not found 165914efd8d3SPaolo Bonzini dependency('xenstore', required: false, 1660063d5119SPaolo Bonzini method: 'pkg-config', 166114efd8d3SPaolo Bonzini disabler: true), 166214efd8d3SPaolo Bonzini dependency('xenforeignmemory', required: false, 1663063d5119SPaolo Bonzini method: 'pkg-config', 166414efd8d3SPaolo Bonzini disabler: true), 166514efd8d3SPaolo Bonzini dependency('xengnttab', required: false, 1666063d5119SPaolo Bonzini method: 'pkg-config', 166714efd8d3SPaolo Bonzini disabler: true), 166814efd8d3SPaolo Bonzini dependency('xenevtchn', required: false, 1669063d5119SPaolo Bonzini method: 'pkg-config', 167014efd8d3SPaolo Bonzini disabler: true), 167114efd8d3SPaolo Bonzini dependency('xendevicemodel', required: false, 1672063d5119SPaolo Bonzini method: 'pkg-config', 167314efd8d3SPaolo Bonzini disabler: true), 167414efd8d3SPaolo Bonzini # optional, no "disabler: true" 167514efd8d3SPaolo Bonzini dependency('xentoolcore', required: false, 1676063d5119SPaolo Bonzini method: 'pkg-config')]) 167714efd8d3SPaolo Bonzini if xen_pc.found() 167814efd8d3SPaolo Bonzini xen = xen_pc 1679582ea95fSMarc-André Lureau endif 168014efd8d3SPaolo Bonzini endif 168114efd8d3SPaolo Bonzini if not xen.found() 16822f20b173SDavid Woodhouse xen_tests = [ '4.11.0', '4.10.0', '4.9.0', '4.8.0', '4.7.1' ] 168314efd8d3SPaolo Bonzini xen_libs = { 168414efd8d3SPaolo Bonzini '4.11.0': [ 'xenstore', 'xenctrl', 'xendevicemodel', 'xenforeignmemory', 'xengnttab', 'xenevtchn', 'xentoolcore' ], 168514efd8d3SPaolo Bonzini '4.10.0': [ 'xenstore', 'xenctrl', 'xendevicemodel', 'xenforeignmemory', 'xengnttab', 'xenevtchn', 'xentoolcore' ], 168614efd8d3SPaolo Bonzini '4.9.0': [ 'xenstore', 'xenctrl', 'xendevicemodel', 'xenforeignmemory', 'xengnttab', 'xenevtchn' ], 168714efd8d3SPaolo Bonzini '4.8.0': [ 'xenstore', 'xenctrl', 'xenforeignmemory', 'xengnttab', 'xenevtchn' ], 168814efd8d3SPaolo Bonzini '4.7.1': [ 'xenstore', 'xenctrl', 'xenforeignmemory', 'xengnttab', 'xenevtchn' ], 168914efd8d3SPaolo Bonzini } 169014efd8d3SPaolo Bonzini xen_deps = {} 169114efd8d3SPaolo Bonzini foreach ver: xen_tests 169214efd8d3SPaolo Bonzini # cache the various library tests to avoid polluting the logs 169314efd8d3SPaolo Bonzini xen_test_deps = [] 169414efd8d3SPaolo Bonzini foreach l: xen_libs[ver] 169514efd8d3SPaolo Bonzini if l not in xen_deps 169614efd8d3SPaolo Bonzini xen_deps += { l: cc.find_library(l, required: false) } 169714efd8d3SPaolo Bonzini endif 169814efd8d3SPaolo Bonzini xen_test_deps += xen_deps[l] 169914efd8d3SPaolo Bonzini endforeach 170014efd8d3SPaolo Bonzini 170114efd8d3SPaolo Bonzini # Use -D to pick just one of the test programs in scripts/xen-detect.c 170214efd8d3SPaolo Bonzini xen_version = ver.split('.') 170314efd8d3SPaolo Bonzini xen_ctrl_version = xen_version[0] + \ 170414efd8d3SPaolo Bonzini ('0' + xen_version[1]).substring(-2) + \ 170514efd8d3SPaolo Bonzini ('0' + xen_version[2]).substring(-2) 170614efd8d3SPaolo Bonzini if cc.links(files('scripts/xen-detect.c'), 170714efd8d3SPaolo Bonzini args: '-DCONFIG_XEN_CTRL_INTERFACE_VERSION=' + xen_ctrl_version, 170814efd8d3SPaolo Bonzini dependencies: xen_test_deps) 170914efd8d3SPaolo Bonzini xen = declare_dependency(version: ver, dependencies: xen_test_deps) 171014efd8d3SPaolo Bonzini break 171114efd8d3SPaolo Bonzini endif 171214efd8d3SPaolo Bonzini endforeach 171314efd8d3SPaolo Bonzini endif 171414efd8d3SPaolo Bonzini if xen.found() 171514efd8d3SPaolo Bonzini accelerators += 'CONFIG_XEN' 171614efd8d3SPaolo Bonzini elif get_option('xen').enabled() 171714efd8d3SPaolo Bonzini error('could not compile and link Xen test program') 171814efd8d3SPaolo Bonzini endif 171914efd8d3SPaolo Bonziniendif 172014efd8d3SPaolo Bonzinihave_xen_pci_passthrough = get_option('xen_pci_passthrough') \ 172114efd8d3SPaolo Bonzini .require(xen.found(), 172214efd8d3SPaolo Bonzini error_message: 'Xen PCI passthrough requested but Xen not enabled') \ 172314efd8d3SPaolo Bonzini .require(targetos == 'linux', 172414efd8d3SPaolo Bonzini error_message: 'Xen PCI passthrough not available on this platform') \ 1725a4b4b40bSStefano Stabellini .require(cpu == 'x86' or cpu == 'x86_64', 1726a4b4b40bSStefano Stabellini error_message: 'Xen PCI passthrough not available on this platform') \ 172714efd8d3SPaolo Bonzini .allowed() 172814efd8d3SPaolo Bonzini 172914efd8d3SPaolo Bonzini 173006677ce1SPaolo Bonzinicacard = not_found 17315f364c57SPaolo Bonziniif not get_option('smartcard').auto() or have_system 17325f364c57SPaolo Bonzini cacard = dependency('libcacard', required: get_option('smartcard'), 1733063d5119SPaolo Bonzini version: '>=2.5.1', method: 'pkg-config') 173406677ce1SPaolo Bonziniendif 17350a40bcb7SCésar Belleyu2f = not_found 17360a40bcb7SCésar Belleyif have_system 17370a40bcb7SCésar Belley u2f = dependency('u2f-emu', required: get_option('u2f'), 1738063d5119SPaolo Bonzini method: 'pkg-config') 17390a40bcb7SCésar Belleyendif 17408caef850SHongren (Zenithal) Zhengcanokey = not_found 17418caef850SHongren (Zenithal) Zhengif have_system 17428caef850SHongren (Zenithal) Zheng canokey = dependency('canokey-qemu', required: get_option('canokey'), 1743063d5119SPaolo Bonzini method: 'pkg-config') 17448caef850SHongren (Zenithal) Zhengendif 174506677ce1SPaolo Bonziniusbredir = not_found 174618f31e60SPaolo Bonziniif not get_option('usb_redir').auto() or have_system 174718f31e60SPaolo Bonzini usbredir = dependency('libusbredirparser-0.5', required: get_option('usb_redir'), 1748063d5119SPaolo Bonzini version: '>=0.6', method: 'pkg-config') 174906677ce1SPaolo Bonziniendif 175006677ce1SPaolo Bonzinilibusb = not_found 175190540f32SPaolo Bonziniif not get_option('libusb').auto() or have_system 175290540f32SPaolo Bonzini libusb = dependency('libusb-1.0', required: get_option('libusb'), 1753063d5119SPaolo Bonzini version: '>=1.0.13', method: 'pkg-config') 175406677ce1SPaolo Bonziniendif 175590540f32SPaolo Bonzini 1756c9322ab5SMarc-André Lureaulibpmem = not_found 1757e36e8c70SPaolo Bonziniif not get_option('libpmem').auto() or have_system 1758e36e8c70SPaolo Bonzini libpmem = dependency('libpmem', required: get_option('libpmem'), 1759063d5119SPaolo Bonzini method: 'pkg-config') 1760c9322ab5SMarc-André Lureauendif 1761c7c91a74SBruce Rogerslibdaxctl = not_found 176283ef1682SPaolo Bonziniif not get_option('libdaxctl').auto() or have_system 176383ef1682SPaolo Bonzini libdaxctl = dependency('libdaxctl', required: get_option('libdaxctl'), 1764063d5119SPaolo Bonzini version: '>=57', method: 'pkg-config') 1765c7c91a74SBruce Rogersendif 17668ce0a45fSMarc-André Lureautasn1 = not_found 1767ba7ed407SPaolo Bonziniif gnutls.found() 1768ba7ed407SPaolo Bonzini tasn1 = dependency('libtasn1', 1769063d5119SPaolo Bonzini method: 'pkg-config') 17708ce0a45fSMarc-André Lureauendif 17710db0fbb5SMax Fritzkeyutils = not_found 17720db0fbb5SMax Fritzif get_option('keyring').enabled() 17730db0fbb5SMax Fritz keyutils = dependency('libkeyutils', required: false, method: 'pkg-config') 17740db0fbb5SMax Fritzendif 1775a81df1b6SPaolo Bonzini 17763909def8SMarc-André Lureauhas_gettid = cc.has_function('gettid') 17773909def8SMarc-André Lureau 17783d212b41SRichard W.M. Jones# libselinux 17793d212b41SRichard W.M. Jonesselinux = dependency('libselinux', 17803d212b41SRichard W.M. Jones required: get_option('selinux'), 1781063d5119SPaolo Bonzini method: 'pkg-config') 17823d212b41SRichard W.M. Jones 1783aa087962SPaolo Bonzini# Malloc tests 1784aa087962SPaolo Bonzini 1785aa087962SPaolo Bonzinimalloc = [] 1786aa087962SPaolo Bonziniif get_option('malloc') == 'system' 1787aa087962SPaolo Bonzini has_malloc_trim = \ 178843a363aeSPaolo Bonzini get_option('malloc_trim').allowed() and \ 178909a49afeSMichal Privoznik cc.has_function('malloc_trim', prefix: '#include <malloc.h>') 1790aa087962SPaolo Bonzinielse 1791aa087962SPaolo Bonzini has_malloc_trim = false 1792aa087962SPaolo Bonzini malloc = cc.find_library(get_option('malloc'), required: true) 1793aa087962SPaolo Bonziniendif 1794aa087962SPaolo Bonziniif not has_malloc_trim and get_option('malloc_trim').enabled() 1795aa087962SPaolo Bonzini if get_option('malloc') == 'system' 1796aa087962SPaolo Bonzini error('malloc_trim not available on this platform.') 1797aa087962SPaolo Bonzini else 1798aa087962SPaolo Bonzini error('malloc_trim not available with non-libc memory allocator') 1799aa087962SPaolo Bonzini endif 1800aa087962SPaolo Bonziniendif 1801aa087962SPaolo Bonzini 1802e66420acSPaolo Bonzinignu_source_prefix = ''' 180384e319a5SMax Reitz #ifndef _GNU_SOURCE 180484e319a5SMax Reitz #define _GNU_SOURCE 180584e319a5SMax Reitz #endif 1806e66420acSPaolo Bonzini''' 180784e319a5SMax Reitz 180809a49afeSMichal Privoznik# Check whether the glibc provides STATX_BASIC_STATS 180909a49afeSMichal Privoznik 181009a49afeSMichal Privoznikhas_statx = cc.has_header_symbol('sys/stat.h', 'STATX_BASIC_STATS', prefix: gnu_source_prefix) 181184e319a5SMax Reitz 18124ce7a08dSHanna Reitz# Check whether statx() provides mount ID information 18134ce7a08dSHanna Reitz 181409a49afeSMichal Privoznikhas_statx_mnt_id = cc.has_header_symbol('sys/stat.h', 'STATX_MNT_ID', prefix: gnu_source_prefix) 18154ce7a08dSHanna Reitz 1816a436d6d4SPaolo Bonzinihave_vhost_user_blk_server = get_option('vhost_user_blk_server') \ 1817a436d6d4SPaolo Bonzini .require(targetos == 'linux', 1818a436d6d4SPaolo Bonzini error_message: 'vhost_user_blk_server requires linux') \ 18192a3129a3SPaolo Bonzini .require(have_vhost_user, 1820a436d6d4SPaolo Bonzini error_message: 'vhost_user_blk_server requires vhost-user support') \ 182126ed501bSAlex Bennée .disable_auto_if(not have_tools and not have_system) \ 1822a436d6d4SPaolo Bonzini .allowed() 18239e62ba48SDaniele Buono 1824df4ea709SMax Reitzif get_option('fuse').disabled() and get_option('fuse_lseek').enabled() 1825df4ea709SMax Reitz error('Cannot enable fuse-lseek while fuse is disabled') 1826df4ea709SMax Reitzendif 1827df4ea709SMax Reitz 1828a484a719SMax Reitzfuse = dependency('fuse3', required: get_option('fuse'), 1829063d5119SPaolo Bonzini version: '>=3.1', method: 'pkg-config') 1830a484a719SMax Reitz 1831df4ea709SMax Reitzfuse_lseek = not_found 183243a363aeSPaolo Bonziniif get_option('fuse_lseek').allowed() 1833df4ea709SMax Reitz if fuse.version().version_compare('>=3.8') 1834df4ea709SMax Reitz # Dummy dependency 1835df4ea709SMax Reitz fuse_lseek = declare_dependency() 1836df4ea709SMax Reitz elif get_option('fuse_lseek').enabled() 1837df4ea709SMax Reitz if fuse.found() 1838df4ea709SMax Reitz error('fuse-lseek requires libfuse >=3.8, found ' + fuse.version()) 1839df4ea709SMax Reitz else 1840df4ea709SMax Reitz error('fuse-lseek requires libfuse, which was not found') 1841df4ea709SMax Reitz endif 1842df4ea709SMax Reitz endif 1843df4ea709SMax Reitzendif 1844df4ea709SMax Reitz 1845a6caeee8SXie Yongjihave_libvduse = (targetos == 'linux') 1846a6caeee8SXie Yongjiif get_option('libvduse').enabled() 1847a6caeee8SXie Yongji if targetos != 'linux' 1848a6caeee8SXie Yongji error('libvduse requires linux') 1849a6caeee8SXie Yongji endif 1850a6caeee8SXie Yongjielif get_option('libvduse').disabled() 1851a6caeee8SXie Yongji have_libvduse = false 1852a6caeee8SXie Yongjiendif 1853a6caeee8SXie Yongji 18542a2359b8SXie Yongjihave_vduse_blk_export = (have_libvduse and targetos == 'linux') 18552a2359b8SXie Yongjiif get_option('vduse_blk_export').enabled() 18562a2359b8SXie Yongji if targetos != 'linux' 18572a2359b8SXie Yongji error('vduse_blk_export requires linux') 18582a2359b8SXie Yongji elif not have_libvduse 18592a2359b8SXie Yongji error('vduse_blk_export requires libvduse support') 18602a2359b8SXie Yongji endif 18612a2359b8SXie Yongjielif get_option('vduse_blk_export').disabled() 18622a2359b8SXie Yongji have_vduse_blk_export = false 18632a2359b8SXie Yongjiendif 18642a2359b8SXie Yongji 186546627f41SAndrew Melnychenko# libbpf 186646627f41SAndrew Melnychenkolibbpf = dependency('libbpf', required: get_option('bpf'), method: 'pkg-config') 186746627f41SAndrew Melnychenkoif libbpf.found() and not cc.links(''' 186846627f41SAndrew Melnychenko #include <bpf/libbpf.h> 186946627f41SAndrew Melnychenko int main(void) 187046627f41SAndrew Melnychenko { 187146627f41SAndrew Melnychenko bpf_object__destroy_skeleton(NULL); 187246627f41SAndrew Melnychenko return 0; 187346627f41SAndrew Melnychenko }''', dependencies: libbpf) 187446627f41SAndrew Melnychenko libbpf = not_found 187546627f41SAndrew Melnychenko if get_option('bpf').enabled() 187646627f41SAndrew Melnychenko error('libbpf skeleton test failed') 187746627f41SAndrew Melnychenko else 187846627f41SAndrew Melnychenko warning('libbpf skeleton test failed, disabling') 187946627f41SAndrew Melnychenko endif 188046627f41SAndrew Melnychenkoendif 188146627f41SAndrew Melnychenko 18827c10cb38SIlya Leoshkevich# libdw 1883bc71d58fSIlya Leoshkevichlibdw = not_found 1884550c6d97SIlya Leoshkevichif not get_option('libdw').auto() or \ 1885a0cbd2e8SPaolo Bonzini (not get_option('prefer_static') and (have_system or have_user)) 18867c10cb38SIlya Leoshkevich libdw = dependency('libdw', 18877c10cb38SIlya Leoshkevich method: 'pkg-config', 1888bc71d58fSIlya Leoshkevich required: get_option('libdw')) 1889bc71d58fSIlya Leoshkevichendif 18907c10cb38SIlya Leoshkevich 189187430d5bSPaolo Bonzini################# 189287430d5bSPaolo Bonzini# config-host.h # 189387430d5bSPaolo Bonzini################# 189487430d5bSPaolo Bonzini 189587430d5bSPaolo Bonziniaudio_drivers_selected = [] 189687430d5bSPaolo Bonziniif have_system 189787430d5bSPaolo Bonzini audio_drivers_available = { 189887430d5bSPaolo Bonzini 'alsa': alsa.found(), 189987430d5bSPaolo Bonzini 'coreaudio': coreaudio.found(), 190087430d5bSPaolo Bonzini 'dsound': dsound.found(), 190187430d5bSPaolo Bonzini 'jack': jack.found(), 190287430d5bSPaolo Bonzini 'oss': oss.found(), 190387430d5bSPaolo Bonzini 'pa': pulse.found(), 1904c2d3d1c2SDorinda Bassey 'pipewire': pipewire.found(), 190587430d5bSPaolo Bonzini 'sdl': sdl.found(), 1906663df1ccSAlexandre Ratchov 'sndio': sndio.found(), 190787430d5bSPaolo Bonzini } 1908e5424a29SPaolo Bonzini foreach k, v: audio_drivers_available 1909e5424a29SPaolo Bonzini config_host_data.set('CONFIG_AUDIO_' + k.to_upper(), v) 1910e5424a29SPaolo Bonzini endforeach 191187430d5bSPaolo Bonzini 191287430d5bSPaolo Bonzini # Default to native drivers first, OSS second, SDL third 191387430d5bSPaolo Bonzini audio_drivers_priority = \ 1914663df1ccSAlexandre Ratchov [ 'pa', 'coreaudio', 'dsound', 'sndio', 'oss' ] + \ 191587430d5bSPaolo Bonzini (targetos == 'linux' ? [] : [ 'sdl' ]) 191687430d5bSPaolo Bonzini audio_drivers_default = [] 191787430d5bSPaolo Bonzini foreach k: audio_drivers_priority 191887430d5bSPaolo Bonzini if audio_drivers_available[k] 191987430d5bSPaolo Bonzini audio_drivers_default += k 192087430d5bSPaolo Bonzini endif 192187430d5bSPaolo Bonzini endforeach 192287430d5bSPaolo Bonzini 192387430d5bSPaolo Bonzini foreach k: get_option('audio_drv_list') 192487430d5bSPaolo Bonzini if k == 'default' 192587430d5bSPaolo Bonzini audio_drivers_selected += audio_drivers_default 192687430d5bSPaolo Bonzini elif not audio_drivers_available[k] 192787430d5bSPaolo Bonzini error('Audio driver "@0@" not available.'.format(k)) 192887430d5bSPaolo Bonzini else 192987430d5bSPaolo Bonzini audio_drivers_selected += k 193087430d5bSPaolo Bonzini endif 193187430d5bSPaolo Bonzini endforeach 193287430d5bSPaolo Bonziniendif 193387430d5bSPaolo Bonziniconfig_host_data.set('CONFIG_AUDIO_DRIVERS', 193487430d5bSPaolo Bonzini '"' + '", "'.join(audio_drivers_selected) + '", ') 193587430d5bSPaolo Bonzini 19369e62ba48SDaniele Buonoif get_option('cfi') 19379e62ba48SDaniele Buono cfi_flags=[] 19389e62ba48SDaniele Buono # Check for dependency on LTO 19399e62ba48SDaniele Buono if not get_option('b_lto') 19409e62ba48SDaniele Buono error('Selected Control-Flow Integrity but LTO is disabled') 19419e62ba48SDaniele Buono endif 19426002711cSPaolo Bonzini if enable_modules 19439e62ba48SDaniele Buono error('Selected Control-Flow Integrity is not compatible with modules') 19449e62ba48SDaniele Buono endif 19459e62ba48SDaniele Buono # Check for cfi flags. CFI requires LTO so we can't use 19469e62ba48SDaniele Buono # get_supported_arguments, but need a more complex "compiles" which allows 19479e62ba48SDaniele Buono # custom arguments 19489e62ba48SDaniele Buono if cc.compiles('int main () { return 0; }', name: '-fsanitize=cfi-icall', 19499e62ba48SDaniele Buono args: ['-flto', '-fsanitize=cfi-icall'] ) 19509e62ba48SDaniele Buono cfi_flags += '-fsanitize=cfi-icall' 19519e62ba48SDaniele Buono else 19529e62ba48SDaniele Buono error('-fsanitize=cfi-icall is not supported by the compiler') 19539e62ba48SDaniele Buono endif 19549e62ba48SDaniele Buono if cc.compiles('int main () { return 0; }', 19559e62ba48SDaniele Buono name: '-fsanitize-cfi-icall-generalize-pointers', 19569e62ba48SDaniele Buono args: ['-flto', '-fsanitize=cfi-icall', 19579e62ba48SDaniele Buono '-fsanitize-cfi-icall-generalize-pointers'] ) 19589e62ba48SDaniele Buono cfi_flags += '-fsanitize-cfi-icall-generalize-pointers' 19599e62ba48SDaniele Buono else 19609e62ba48SDaniele Buono error('-fsanitize-cfi-icall-generalize-pointers is not supported by the compiler') 19619e62ba48SDaniele Buono endif 19629e62ba48SDaniele Buono if get_option('cfi_debug') 19639e62ba48SDaniele Buono if cc.compiles('int main () { return 0; }', 19649e62ba48SDaniele Buono name: '-fno-sanitize-trap=cfi-icall', 19659e62ba48SDaniele Buono args: ['-flto', '-fsanitize=cfi-icall', 19669e62ba48SDaniele Buono '-fno-sanitize-trap=cfi-icall'] ) 19679e62ba48SDaniele Buono cfi_flags += '-fno-sanitize-trap=cfi-icall' 19689e62ba48SDaniele Buono else 19699e62ba48SDaniele Buono error('-fno-sanitize-trap=cfi-icall is not supported by the compiler') 19709e62ba48SDaniele Buono endif 19719e62ba48SDaniele Buono endif 1972e5134024SPaolo Bonzini add_global_arguments(cfi_flags, native: false, language: all_languages) 1973e5134024SPaolo Bonzini add_global_link_arguments(cfi_flags, native: false, language: all_languages) 19749e62ba48SDaniele Buonoendif 19759e62ba48SDaniele Buono 197614176c8dSJoelle van Dynehave_host_block_device = (targetos != 'darwin' or 197714176c8dSJoelle van Dyne cc.has_header('IOKit/storage/IOMedia.h')) 197814176c8dSJoelle van Dyne 1979a436d6d4SPaolo Bonzinidbus_display = get_option('dbus_display') \ 1980a436d6d4SPaolo Bonzini .require(gio.version().version_compare('>=2.64'), 1981a436d6d4SPaolo Bonzini error_message: '-display dbus requires glib>=2.64') \ 19827544060eSPaolo Bonzini .require(gdbus_codegen.found(), 1983bb2dc4b7SPaolo Bonzini error_message: gdbus_codegen_error.format('-display dbus')) \ 1984a436d6d4SPaolo Bonzini .allowed() 1985142ca628SMarc-André Lureau 1986a436d6d4SPaolo Bonzinihave_virtfs = get_option('virtfs') \ 19870fb1e19dSKeno Fischer .require(targetos == 'linux' or targetos == 'darwin', 19880fb1e19dSKeno Fischer error_message: 'virtio-9p (virtfs) requires Linux or macOS') \ 19890fb1e19dSKeno Fischer .require(targetos == 'linux' or cc.has_function('pthread_fchdir_np'), 19900fb1e19dSKeno Fischer error_message: 'virtio-9p (virtfs) on macOS requires the presence of pthread_fchdir_np') \ 19911a67e07fSPeter Foley .require(targetos == 'darwin' or libattr.found(), 19921a67e07fSPeter Foley error_message: 'virtio-9p (virtfs) on Linux requires libattr-devel') \ 1993a436d6d4SPaolo Bonzini .disable_auto_if(not have_tools and not have_system) \ 1994a436d6d4SPaolo Bonzini .allowed() 199569202b40SPaolo Bonzini 19961a67e07fSPeter Foleyhave_virtfs_proxy_helper = get_option('virtfs_proxy_helper') \ 19971a67e07fSPeter Foley .require(targetos != 'darwin', error_message: 'the virtfs proxy helper is incompatible with macOS') \ 19981a67e07fSPeter Foley .require(have_virtfs, error_message: 'the virtfs proxy helper requires that virtfs is enabled') \ 19991a67e07fSPeter Foley .disable_auto_if(not have_tools) \ 20001a67e07fSPeter Foley .require(libcap_ng.found(), error_message: 'the virtfs proxy helper requires libcap-ng') \ 20011a67e07fSPeter Foley .allowed() 20023a489d38SPhilippe Mathieu-Daudé 2003622d64ffSPaolo Bonziniif get_option('block_drv_ro_whitelist') == '' 2004622d64ffSPaolo Bonzini config_host_data.set('CONFIG_BDRV_RO_WHITELIST', '') 2005622d64ffSPaolo Bonzinielse 2006622d64ffSPaolo Bonzini config_host_data.set('CONFIG_BDRV_RO_WHITELIST', 2007622d64ffSPaolo Bonzini '"' + get_option('block_drv_ro_whitelist').replace(',', '", "') + '", ') 2008622d64ffSPaolo Bonziniendif 2009622d64ffSPaolo Bonziniif get_option('block_drv_rw_whitelist') == '' 2010622d64ffSPaolo Bonzini config_host_data.set('CONFIG_BDRV_RW_WHITELIST', '') 2011622d64ffSPaolo Bonzinielse 2012622d64ffSPaolo Bonzini config_host_data.set('CONFIG_BDRV_RW_WHITELIST', 2013622d64ffSPaolo Bonzini '"' + get_option('block_drv_rw_whitelist').replace(',', '", "') + '", ') 2014622d64ffSPaolo Bonziniendif 2015622d64ffSPaolo Bonzini 20169c29b741SPaolo Bonziniforeach k : get_option('trace_backends') 20179c29b741SPaolo Bonzini config_host_data.set('CONFIG_TRACE_' + k.to_upper(), true) 20189c29b741SPaolo Bonziniendforeach 20199c29b741SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_TRACE_FILE', get_option('trace_file')) 202041f2ae28SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_TLS_PRIORITY', get_option('tls_priority')) 202140c909f5SPaolo Bonziniif iasl.found() 202240c909f5SPaolo Bonzini config_host_data.set_quoted('CONFIG_IASL', iasl.full_path()) 20235dc4618eSPaolo Bonziniendif 202416bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_BINDIR', get_option('prefix') / get_option('bindir')) 202516bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_PREFIX', get_option('prefix')) 202616bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_QEMU_CONFDIR', get_option('prefix') / qemu_confdir) 202716bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_QEMU_DATADIR', get_option('prefix') / qemu_datadir) 202816bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_QEMU_DESKTOPDIR', get_option('prefix') / qemu_desktopdir) 20298154f5e6SAkihiko Odaki 20308154f5e6SAkihiko Odakiqemu_firmwarepath = '' 20318154f5e6SAkihiko Odakiforeach k : get_option('qemu_firmwarepath') 20328154f5e6SAkihiko Odaki qemu_firmwarepath += '"' + get_option('prefix') / k + '", ' 20338154f5e6SAkihiko Odakiendforeach 20348154f5e6SAkihiko Odakiconfig_host_data.set('CONFIG_QEMU_FIRMWAREPATH', qemu_firmwarepath) 20358154f5e6SAkihiko Odaki 203616bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_QEMU_HELPERDIR', get_option('prefix') / get_option('libexecdir')) 203716bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_QEMU_ICONDIR', get_option('prefix') / qemu_icondir) 203816bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_QEMU_LOCALEDIR', get_option('prefix') / get_option('localedir')) 203916bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_QEMU_LOCALSTATEDIR', get_option('prefix') / get_option('localstatedir')) 204016bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_QEMU_MODDIR', get_option('prefix') / qemu_moddir) 204116bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_SYSCONFDIR', get_option('prefix') / get_option('sysconfdir')) 204216bf7a33SPaolo Bonzini 20436002711cSPaolo Bonziniif enable_modules 2044b0b4323eSPaolo Bonzini config_host_data.set('CONFIG_STAMP', run_command( 2045b0b4323eSPaolo Bonzini meson.current_source_dir() / 'scripts/qemu-stamp.py', 2046b0b4323eSPaolo Bonzini meson.project_version(), get_option('pkgversion'), '--', 2047b0b4323eSPaolo Bonzini meson.current_source_dir() / 'configure', 2048b0b4323eSPaolo Bonzini capture: true, check: true).stdout().strip()) 2049b0b4323eSPaolo Bonziniendif 2050b0b4323eSPaolo Bonzini 205135acbb30SPaolo Bonzinihave_slirp_smbd = get_option('slirp_smbd') \ 205235acbb30SPaolo Bonzini .require(targetos != 'windows', error_message: 'Host smbd not supported on this platform.') \ 205335acbb30SPaolo Bonzini .allowed() 205435acbb30SPaolo Bonziniif have_slirp_smbd 205535acbb30SPaolo Bonzini smbd_path = get_option('smbd') 205635acbb30SPaolo Bonzini if smbd_path == '' 205735acbb30SPaolo Bonzini smbd_path = (targetos == 'solaris' ? '/usr/sfw/sbin/smbd' : '/usr/sbin/smbd') 205835acbb30SPaolo Bonzini endif 205935acbb30SPaolo Bonzini config_host_data.set_quoted('CONFIG_SMBD_COMMAND', smbd_path) 206035acbb30SPaolo Bonziniendif 206135acbb30SPaolo Bonzini 2062823eb013SPaolo Bonziniconfig_host_data.set('HOST_' + host_arch.to_upper(), 1) 2063823eb013SPaolo Bonzini 20642cb2f580SPaolo Bonziniif get_option('module_upgrades') and not enable_modules 20652cb2f580SPaolo Bonzini error('Cannot enable module-upgrades as modules are not enabled') 20662cb2f580SPaolo Bonziniendif 20672cb2f580SPaolo Bonziniconfig_host_data.set('CONFIG_MODULE_UPGRADES', get_option('module_upgrades')) 20682cb2f580SPaolo Bonzini 2069f7f2d651SPaolo Bonziniconfig_host_data.set('CONFIG_ATTR', libattr.found()) 2070c55cf6abSPaolo Bonziniconfig_host_data.set('CONFIG_BDRV_WHITELIST_TOOLS', get_option('block_drv_whitelist_in_tools')) 20718c6d4ff4SPaolo Bonziniconfig_host_data.set('CONFIG_BRLAPI', brlapi.found()) 2072b4e312e9SPaolo Bonziniconfig_host_data.set('CONFIG_COCOA', cocoa.found()) 2073537b7248SPaolo Bonziniconfig_host_data.set('CONFIG_FUZZ', get_option('fuzzing')) 2074af2bb99bSPaolo Bonziniconfig_host_data.set('CONFIG_GCOV', get_option('b_coverage')) 2075f01496a3SPaolo Bonziniconfig_host_data.set('CONFIG_LIBUDEV', libudev.found()) 20760c32a0aeSPaolo Bonziniconfig_host_data.set('CONFIG_LZO', lzo.found()) 20776ec0e15dSPaolo Bonziniconfig_host_data.set('CONFIG_MPATH', mpathpersist.found()) 2078fd66dbd4SStefan Hajnocziconfig_host_data.set('CONFIG_BLKIO', blkio.found()) 207998b126f5SStefano Garzarellaif blkio.found() 208098b126f5SStefano Garzarella config_host_data.set('CONFIG_BLKIO_VHOST_VDPA_FD', 208198b126f5SStefano Garzarella blkio.version().version_compare('>=1.3.0')) 208298b126f5SStefano Garzarellaendif 2083f9cd86feSPaolo Bonziniconfig_host_data.set('CONFIG_CURL', curl.found()) 20845285e593SYonggang Luoconfig_host_data.set('CONFIG_CURSES', curses.found()) 20858bc5184dSThomas Huthconfig_host_data.set('CONFIG_GBM', gbm.found()) 20867544060eSPaolo Bonziniconfig_host_data.set('CONFIG_GIO', gio.found()) 208708821ca2SPaolo Bonziniconfig_host_data.set('CONFIG_GLUSTERFS', glusterfs.found()) 208808821ca2SPaolo Bonziniif glusterfs.found() 208908821ca2SPaolo Bonzini config_host_data.set('CONFIG_GLUSTERFS_XLATOR_OPT', glusterfs.version().version_compare('>=4')) 209008821ca2SPaolo Bonzini config_host_data.set('CONFIG_GLUSTERFS_DISCARD', glusterfs.version().version_compare('>=5')) 209108821ca2SPaolo Bonzini config_host_data.set('CONFIG_GLUSTERFS_FALLOCATE', glusterfs.version().version_compare('>=6')) 209208821ca2SPaolo Bonzini config_host_data.set('CONFIG_GLUSTERFS_ZEROFILL', glusterfs.version().version_compare('>=6')) 209308821ca2SPaolo Bonzini config_host_data.set('CONFIG_GLUSTERFS_FTRUNCATE_HAS_STAT', glusterfs_ftruncate_has_stat) 209408821ca2SPaolo Bonzini config_host_data.set('CONFIG_GLUSTERFS_IOCB_HAS_STAT', glusterfs_iocb_has_stat) 209508821ca2SPaolo Bonziniendif 20961b695471SPaolo Bonziniconfig_host_data.set('CONFIG_GTK', gtk.found()) 2097c23d7b4eSPaolo Bonziniconfig_host_data.set('CONFIG_VTE', vte.found()) 209829e0bfffSClaudio Fontanaconfig_host_data.set('CONFIG_GTK_CLIPBOARD', have_gtk_clipboard) 209963efb6abSTaylor Simpsonconfig_host_data.set('CONFIG_HEXAGON_IDEF_PARSER', get_option('hexagon_idef_parser')) 2100f7f2d651SPaolo Bonziniconfig_host_data.set('CONFIG_LIBATTR', have_old_libattr) 2101727c8bb8SPaolo Bonziniconfig_host_data.set('CONFIG_LIBCAP_NG', libcap_ng.found()) 210246627f41SAndrew Melnychenkoconfig_host_data.set('CONFIG_EBPF', libbpf.found()) 210363a7f853SPaolo Bonziniconfig_host_data.set('CONFIG_LIBDAXCTL', libdaxctl.found()) 21049db405a3SPaolo Bonziniconfig_host_data.set('CONFIG_LIBISCSI', libiscsi.found()) 210530045c05SPaolo Bonziniconfig_host_data.set('CONFIG_LIBNFS', libnfs.found()) 2106e6a52b36SThomas Huthconfig_host_data.set('CONFIG_LIBSSH', libssh.found()) 2107ff66f3e5SPaolo Bonziniconfig_host_data.set('CONFIG_LINUX_AIO', libaio.found()) 210863a7f853SPaolo Bonziniconfig_host_data.set('CONFIG_LINUX_IO_URING', linux_io_uring.found()) 210963a7f853SPaolo Bonziniconfig_host_data.set('CONFIG_LIBPMEM', libpmem.found()) 21106002711cSPaolo Bonziniconfig_host_data.set('CONFIG_MODULES', enable_modules) 2111488a8c73SPaolo Bonziniconfig_host_data.set('CONFIG_NUMA', numa.found()) 21126bb613f0SMichal Privoznikif numa.found() 21136bb613f0SMichal Privoznik config_host_data.set('HAVE_NUMA_HAS_PREFERRED_MANY', 21146bb613f0SMichal Privoznik cc.has_function('numa_has_preferred_many', 21156bb613f0SMichal Privoznik dependencies: numa)) 21166bb613f0SMichal Privoznikendif 211788b6e618SPaolo Bonziniconfig_host_data.set('CONFIG_OPENGL', opengl.found()) 2118fabd1e93SPaolo Bonziniconfig_host_data.set('CONFIG_RBD', rbd.found()) 21193730a734SPaolo Bonziniconfig_host_data.set('CONFIG_RDMA', rdma.found()) 2120721fa5e5SPaolo Bonziniconfig_host_data.set('CONFIG_SAFESTACK', get_option('safe_stack')) 212135be72baSPaolo Bonziniconfig_host_data.set('CONFIG_SDL', sdl.found()) 212235be72baSPaolo Bonziniconfig_host_data.set('CONFIG_SDL_IMAGE', sdl_image.found()) 212390835c2bSPaolo Bonziniconfig_host_data.set('CONFIG_SECCOMP', seccomp.found()) 212473422d95SMichal Privoznikif seccomp.found() 212573422d95SMichal Privoznik config_host_data.set('CONFIG_SECCOMP_SYSRAWRC', seccomp_has_sysrawrc) 212673422d95SMichal Privoznikendif 2127241611eaSPaolo Bonziniconfig_host_data.set('CONFIG_SNAPPY', snappy.found()) 21280d04c4c9SPaolo Bonziniconfig_host_data.set('CONFIG_TPM', have_tpm) 212934f983d8SPaolo Bonziniconfig_host_data.set('CONFIG_TSAN', get_option('tsan')) 213090540f32SPaolo Bonziniconfig_host_data.set('CONFIG_USB_LIBUSB', libusb.found()) 2131e1723999SPaolo Bonziniconfig_host_data.set('CONFIG_VDE', vde.found()) 21322df89d54SPaolo Bonziniconfig_host_data.set('CONFIG_VHOST_NET', have_vhost_net) 21332df89d54SPaolo Bonziniconfig_host_data.set('CONFIG_VHOST_NET_USER', have_vhost_net_user) 21342df89d54SPaolo Bonziniconfig_host_data.set('CONFIG_VHOST_NET_VDPA', have_vhost_net_vdpa) 21352df89d54SPaolo Bonziniconfig_host_data.set('CONFIG_VHOST_KERNEL', have_vhost_kernel) 21362df89d54SPaolo Bonziniconfig_host_data.set('CONFIG_VHOST_USER', have_vhost_user) 21372df89d54SPaolo Bonziniconfig_host_data.set('CONFIG_VHOST_CRYPTO', have_vhost_user_crypto) 21382df89d54SPaolo Bonziniconfig_host_data.set('CONFIG_VHOST_VDPA', have_vhost_vdpa) 2139e2c1d78dSVladislav Yaroshchukconfig_host_data.set('CONFIG_VMNET', vmnet.found()) 2140e5e856c1SStefan Hajnocziconfig_host_data.set('CONFIG_VHOST_USER_BLK_SERVER', have_vhost_user_blk_server) 21412a2359b8SXie Yongjiconfig_host_data.set('CONFIG_VDUSE_BLK_EXPORT', have_vduse_blk_export) 214295f8510eSKshitij Suriconfig_host_data.set('CONFIG_PNG', png.found()) 2143a0b93237SPaolo Bonziniconfig_host_data.set('CONFIG_VNC', vnc.found()) 2144a0b93237SPaolo Bonziniconfig_host_data.set('CONFIG_VNC_JPEG', jpeg.found()) 2145a0b93237SPaolo Bonziniconfig_host_data.set('CONFIG_VNC_SASL', sasl.found()) 214669202b40SPaolo Bonziniconfig_host_data.set('CONFIG_VIRTFS', have_virtfs) 214763a7f853SPaolo Bonziniconfig_host_data.set('CONFIG_VTE', vte.found()) 21484113f4cfSLaurent Vivierconfig_host_data.set('CONFIG_XKBCOMMON', xkbcommon.found()) 2149af04e89dSMarc-André Lureauconfig_host_data.set('CONFIG_KEYUTILS', keyutils.found()) 21503909def8SMarc-André Lureauconfig_host_data.set('CONFIG_GETTID', has_gettid) 215157612511SPaolo Bonziniconfig_host_data.set('CONFIG_GNUTLS', gnutls.found()) 2152cc4c7c73SDaniel P. Berrangéconfig_host_data.set('CONFIG_GNUTLS_CRYPTO', gnutls_crypto.found()) 2153d47b83b1SDaniel P. Berrangéconfig_host_data.set('CONFIG_TASN1', tasn1.found()) 215457612511SPaolo Bonziniconfig_host_data.set('CONFIG_GCRYPT', gcrypt.found()) 215557612511SPaolo Bonziniconfig_host_data.set('CONFIG_NETTLE', nettle.found()) 21564c5e512eSLei Heconfig_host_data.set('CONFIG_HOGWEED', hogweed.found()) 215757612511SPaolo Bonziniconfig_host_data.set('CONFIG_QEMU_PRIVATE_XTS', xts == 'private') 2158aa087962SPaolo Bonziniconfig_host_data.set('CONFIG_MALLOC_TRIM', has_malloc_trim) 215984e319a5SMax Reitzconfig_host_data.set('CONFIG_STATX', has_statx) 21604ce7a08dSHanna Reitzconfig_host_data.set('CONFIG_STATX_MNT_ID', has_statx_mnt_id) 2161b1def33dSPaolo Bonziniconfig_host_data.set('CONFIG_ZSTD', zstd.found()) 2162a484a719SMax Reitzconfig_host_data.set('CONFIG_FUSE', fuse.found()) 2163df4ea709SMax Reitzconfig_host_data.set('CONFIG_FUSE_LSEEK', fuse_lseek.found()) 21643f0a5d55SMarc-André Lureauconfig_host_data.set('CONFIG_SPICE_PROTOCOL', spice_protocol.found()) 2165ddece465SMarc-André Lureauif spice_protocol.found() 2166ddece465SMarc-André Lureauconfig_host_data.set('CONFIG_SPICE_PROTOCOL_MAJOR', spice_protocol.version().split('.')[0]) 2167ddece465SMarc-André Lureauconfig_host_data.set('CONFIG_SPICE_PROTOCOL_MINOR', spice_protocol.version().split('.')[1]) 2168ddece465SMarc-André Lureauconfig_host_data.set('CONFIG_SPICE_PROTOCOL_MICRO', spice_protocol.version().split('.')[2]) 2169ddece465SMarc-André Lureauendif 21703f0a5d55SMarc-André Lureauconfig_host_data.set('CONFIG_SPICE', spice.found()) 21719d71037fSPaolo Bonziniconfig_host_data.set('CONFIG_X11', x11.found()) 2172142ca628SMarc-André Lureauconfig_host_data.set('CONFIG_DBUS_DISPLAY', dbus_display) 21739e62ba48SDaniele Buonoconfig_host_data.set('CONFIG_CFI', get_option('cfi')) 21743d212b41SRichard W.M. Jonesconfig_host_data.set('CONFIG_SELINUX', selinux.found()) 217514efd8d3SPaolo Bonziniconfig_host_data.set('CONFIG_XEN_BACKEND', xen.found()) 21767c10cb38SIlya Leoshkevichconfig_host_data.set('CONFIG_LIBDW', libdw.found()) 217714efd8d3SPaolo Bonziniif xen.found() 217814efd8d3SPaolo Bonzini # protect from xen.version() having less than three components 217914efd8d3SPaolo Bonzini xen_version = xen.version().split('.') + ['0', '0'] 218014efd8d3SPaolo Bonzini xen_ctrl_version = xen_version[0] + \ 218114efd8d3SPaolo Bonzini ('0' + xen_version[1]).substring(-2) + \ 218214efd8d3SPaolo Bonzini ('0' + xen_version[2]).substring(-2) 218314efd8d3SPaolo Bonzini config_host_data.set('CONFIG_XEN_CTRL_INTERFACE_VERSION', xen_ctrl_version) 218414efd8d3SPaolo Bonziniendif 2185859aef02SPaolo Bonziniconfig_host_data.set('QEMU_VERSION', '"@0@"'.format(meson.project_version())) 2186859aef02SPaolo Bonziniconfig_host_data.set('QEMU_VERSION_MAJOR', meson.project_version().split('.')[0]) 2187859aef02SPaolo Bonziniconfig_host_data.set('QEMU_VERSION_MINOR', meson.project_version().split('.')[1]) 2188859aef02SPaolo Bonziniconfig_host_data.set('QEMU_VERSION_MICRO', meson.project_version().split('.')[2]) 2189859aef02SPaolo Bonzini 2190a6305081SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_HOST_DSOSUF', host_dsosuf) 219169d8de7aSPaolo Bonziniconfig_host_data.set('HAVE_HOST_BLOCK_DEVICE', have_host_block_device) 219269d8de7aSPaolo Bonzini 2193728c0a2fSPaolo Bonzinihave_coroutine_pool = get_option('coroutine_pool') 2194728c0a2fSPaolo Bonziniif get_option('debug_stack_usage') and have_coroutine_pool 2195728c0a2fSPaolo Bonzini message('Disabling coroutine pool to measure stack usage') 2196728c0a2fSPaolo Bonzini have_coroutine_pool = false 2197728c0a2fSPaolo Bonziniendif 2198728c0a2fSPaolo Bonziniconfig_host_data.set10('CONFIG_COROUTINE_POOL', have_coroutine_pool) 219958a2e3f5SStefan Hajnocziconfig_host_data.set('CONFIG_DEBUG_GRAPH_LOCK', get_option('debug_graph_lock')) 2200c55cf6abSPaolo Bonziniconfig_host_data.set('CONFIG_DEBUG_MUTEX', get_option('debug_mutex')) 2201728c0a2fSPaolo Bonziniconfig_host_data.set('CONFIG_DEBUG_STACK_USAGE', get_option('debug_stack_usage')) 2202c55cf6abSPaolo Bonziniconfig_host_data.set('CONFIG_GPROF', get_option('gprof')) 2203406523f6SPaolo Bonziniconfig_host_data.set('CONFIG_LIVE_BLOCK_MIGRATION', get_option('live_block_migration').allowed()) 2204c55cf6abSPaolo Bonziniconfig_host_data.set('CONFIG_QOM_CAST_DEBUG', get_option('qom_cast_debug')) 2205abad185cSJuan Quintelaconfig_host_data.set('CONFIG_REPLICATION', get_option('replication').allowed()) 2206406523f6SPaolo Bonzini 220769d8de7aSPaolo Bonzini# has_header 2208e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_EPOLL', cc.has_header('sys/epoll.h')) 2209d47a8b3bSPaolo Bonziniconfig_host_data.set('CONFIG_LINUX_MAGIC_H', cc.has_header('linux/magic.h')) 2210d47a8b3bSPaolo Bonziniconfig_host_data.set('CONFIG_VALGRIND_H', cc.has_header('valgrind/valgrind.h')) 221148f670ecSThomas Huthconfig_host_data.set('HAVE_BTRFS_H', cc.has_header('linux/btrfs.h')) 22122964be52SThomas Huthconfig_host_data.set('HAVE_DRM_H', cc.has_header('libdrm/drm.h')) 22132802d91dSThomas Huthconfig_host_data.set('HAVE_PTY_H', cc.has_header('pty.h')) 221469d8de7aSPaolo Bonziniconfig_host_data.set('HAVE_SYS_DISK_H', cc.has_header('sys/disk.h')) 2215ded5d78cSThomas Huthconfig_host_data.set('HAVE_SYS_IOCCOM_H', cc.has_header('sys/ioccom.h')) 22164a9d5f89SThomas Huthconfig_host_data.set('HAVE_SYS_KCOV_H', cc.has_header('sys/kcov.h')) 2217d409373bSBin Mengif targetos == 'windows' 2218d409373bSBin Meng config_host_data.set('HAVE_AFUNIX_H', cc.has_header('afunix.h')) 2219d409373bSBin Mengendif 2220ded5d78cSThomas Huth 222169d8de7aSPaolo Bonzini# has_function 2222c891c24bSClaudio Imbrendaconfig_host_data.set('CONFIG_CLOSE_RANGE', cc.has_function('close_range')) 2223a620fbe9SPaolo Bonziniconfig_host_data.set('CONFIG_ACCEPT4', cc.has_function('accept4')) 2224e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_CLOCK_ADJTIME', cc.has_function('clock_adjtime')) 2225e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_DUP3', cc.has_function('dup3')) 2226e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_FALLOCATE', cc.has_function('fallocate')) 2227e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_POSIX_FALLOCATE', cc.has_function('posix_fallocate')) 22286750485bSPaolo Bonziniconfig_host_data.set('CONFIG_GETCPU', cc.has_function('getcpu', prefix: gnu_source_prefix)) 22296750485bSPaolo Bonziniconfig_host_data.set('CONFIG_SCHED_GETCPU', cc.has_function('sched_getcpu', prefix: '#include <sched.h>')) 22308698343bSPeter Maydell# Note that we need to specify prefix: here to avoid incorrectly 22318698343bSPeter Maydell# thinking that Windows has posix_memalign() 22328698343bSPeter Maydellconfig_host_data.set('CONFIG_POSIX_MEMALIGN', cc.has_function('posix_memalign', prefix: '#include <stdlib.h>')) 22335c8c714aSPeter Maydellconfig_host_data.set('CONFIG_ALIGNED_MALLOC', cc.has_function('_aligned_malloc')) 223488454f84SPeter Maydellconfig_host_data.set('CONFIG_VALLOC', cc.has_function('valloc')) 223588454f84SPeter Maydellconfig_host_data.set('CONFIG_MEMALIGN', cc.has_function('memalign')) 2236e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_PPOLL', cc.has_function('ppoll')) 22372b9f74efSPeter Maydellconfig_host_data.set('CONFIG_PREADV', cc.has_function('preadv', prefix: '#include <sys/uio.h>')) 2238029ed1bdSKeno Fischerconfig_host_data.set('CONFIG_PTHREAD_FCHDIR_NP', cc.has_function('pthread_fchdir_np')) 2239e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_SENDFILE', cc.has_function('sendfile')) 2240e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_SETNS', cc.has_function('setns') and cc.has_function('unshare')) 2241e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_SYNCFS', cc.has_function('syncfs')) 2242e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_SYNC_FILE_RANGE', cc.has_function('sync_file_range')) 2243e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_TIMERFD', cc.has_function('timerfd_create')) 2244be7e89f6SPaolo Bonziniconfig_host_data.set('HAVE_COPY_FILE_RANGE', cc.has_function('copy_file_range')) 224559e35c7bSAndrew Deasonconfig_host_data.set('HAVE_GETIFADDRS', cc.has_function('getifaddrs')) 2246fc9a809eSPaolo Bonziniconfig_host_data.set('HAVE_GLIB_WITH_SLICE_ALLOCATOR', glib_has_gslice) 2247e66420acSPaolo Bonziniconfig_host_data.set('HAVE_OPENPTY', cc.has_function('openpty', dependencies: util)) 2248ed3b3f17SPaolo Bonziniconfig_host_data.set('HAVE_STRCHRNUL', cc.has_function('strchrnul')) 224969d8de7aSPaolo Bonziniconfig_host_data.set('HAVE_SYSTEM_FUNCTION', cc.has_function('system', prefix: '#include <stdlib.h>')) 225066dc5f96SStefano Garzarellaif rbd.found() 225166dc5f96SStefano Garzarella config_host_data.set('HAVE_RBD_NAMESPACE_EXISTS', 225266dc5f96SStefano Garzarella cc.has_function('rbd_namespace_exists', 225366dc5f96SStefano Garzarella dependencies: rbd, 225466dc5f96SStefano Garzarella prefix: '#include <rbd/librbd.h>')) 225566dc5f96SStefano Garzarellaendif 2256911965acSLi Zhijianif rdma.found() 2257911965acSLi Zhijian config_host_data.set('HAVE_IBV_ADVISE_MR', 2258911965acSLi Zhijian cc.has_function('ibv_advise_mr', 22593730a734SPaolo Bonzini dependencies: rdma, 2260911965acSLi Zhijian prefix: '#include <infiniband/verbs.h>')) 2261911965acSLi Zhijianendif 22622b9f74efSPeter Maydell 226334f983d8SPaolo Bonzinihave_asan_fiber = false 226434f983d8SPaolo Bonziniif get_option('sanitizers') and \ 226534f983d8SPaolo Bonzini not cc.has_function('__sanitizer_start_switch_fiber', 226634f983d8SPaolo Bonzini args: '-fsanitize=address', 226734f983d8SPaolo Bonzini prefix: '#include <sanitizer/asan_interface.h>') 226834f983d8SPaolo Bonzini warning('Missing ASAN due to missing fiber annotation interface') 226934f983d8SPaolo Bonzini warning('Without code annotation, the report may be inferior.') 227034f983d8SPaolo Bonzinielse 227134f983d8SPaolo Bonzini have_asan_fiber = true 227234f983d8SPaolo Bonziniendif 227334f983d8SPaolo Bonziniconfig_host_data.set('CONFIG_ASAN_IFACE_FIBER', have_asan_fiber) 227434f983d8SPaolo Bonzini 2275e66420acSPaolo Bonzini# has_header_symbol 22766d43eaa3SSam Liconfig_host_data.set('CONFIG_BLKZONED', 22776d43eaa3SSam Li cc.has_header_symbol('linux/blkzoned.h', 'BLKOPENZONE')) 2278e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_EPOLL_CREATE1', 2279e66420acSPaolo Bonzini cc.has_header_symbol('sys/epoll.h', 'epoll_create1')) 2280e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_FALLOCATE_PUNCH_HOLE', 2281e66420acSPaolo Bonzini cc.has_header_symbol('linux/falloc.h', 'FALLOC_FL_PUNCH_HOLE') and 2282e66420acSPaolo Bonzini cc.has_header_symbol('linux/falloc.h', 'FALLOC_FL_KEEP_SIZE')) 2283e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_FALLOCATE_ZERO_RANGE', 2284e66420acSPaolo Bonzini cc.has_header_symbol('linux/falloc.h', 'FALLOC_FL_ZERO_RANGE')) 2285e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_FIEMAP', 2286e66420acSPaolo Bonzini cc.has_header('linux/fiemap.h') and 2287e66420acSPaolo Bonzini cc.has_header_symbol('linux/fs.h', 'FS_IOC_FIEMAP')) 2288be7e89f6SPaolo Bonziniconfig_host_data.set('CONFIG_GETRANDOM', 2289be7e89f6SPaolo Bonzini cc.has_function('getrandom') and 2290be7e89f6SPaolo Bonzini cc.has_header_symbol('sys/random.h', 'GRND_NONBLOCK')) 2291a620fbe9SPaolo Bonziniconfig_host_data.set('CONFIG_INOTIFY', 2292a620fbe9SPaolo Bonzini cc.has_header_symbol('sys/inotify.h', 'inotify_init')) 2293a620fbe9SPaolo Bonziniconfig_host_data.set('CONFIG_INOTIFY1', 2294a620fbe9SPaolo Bonzini cc.has_header_symbol('sys/inotify.h', 'inotify_init1')) 2295e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_PRCTL_PR_SET_TIMERSLACK', 2296e66420acSPaolo Bonzini cc.has_header_symbol('sys/prctl.h', 'PR_SET_TIMERSLACK')) 2297be7e89f6SPaolo Bonziniconfig_host_data.set('CONFIG_RTNETLINK', 2298be7e89f6SPaolo Bonzini cc.has_header_symbol('linux/rtnetlink.h', 'IFLA_PROTO_DOWN')) 2299be7e89f6SPaolo Bonziniconfig_host_data.set('CONFIG_SYSMACROS', 2300be7e89f6SPaolo Bonzini cc.has_header_symbol('sys/sysmacros.h', 'makedev')) 2301e1fbd2c4SPaolo Bonziniconfig_host_data.set('HAVE_OPTRESET', 2302e1fbd2c4SPaolo Bonzini cc.has_header_symbol('getopt.h', 'optreset')) 2303653163fcSMarc-André Lureauconfig_host_data.set('HAVE_IPPROTO_MPTCP', 2304653163fcSMarc-André Lureau cc.has_header_symbol('netinet/in.h', 'IPPROTO_MPTCP')) 2305e66420acSPaolo Bonzini 2306e66420acSPaolo Bonzini# has_member 2307e66420acSPaolo Bonziniconfig_host_data.set('HAVE_SIGEV_NOTIFY_THREAD_ID', 2308e66420acSPaolo Bonzini cc.has_member('struct sigevent', 'sigev_notify_thread_id', 2309e66420acSPaolo Bonzini prefix: '#include <signal.h>')) 2310ed3b3f17SPaolo Bonziniconfig_host_data.set('HAVE_STRUCT_STAT_ST_ATIM', 2311ed3b3f17SPaolo Bonzini cc.has_member('struct stat', 'st_atim', 2312ed3b3f17SPaolo Bonzini prefix: '#include <sys/stat.h>')) 23136d43eaa3SSam Liconfig_host_data.set('HAVE_BLK_ZONE_REP_CAPACITY', 23146d43eaa3SSam Li cc.has_member('struct blk_zone', 'capacity', 23156d43eaa3SSam Li prefix: '#include <linux/blkzoned.h>')) 2316e66420acSPaolo Bonzini 23176a23f819SPaolo Bonzini# has_type 23186a23f819SPaolo Bonziniconfig_host_data.set('CONFIG_IOVEC', 23196a23f819SPaolo Bonzini cc.has_type('struct iovec', 23206a23f819SPaolo Bonzini prefix: '#include <sys/uio.h>')) 23216a23f819SPaolo Bonziniconfig_host_data.set('HAVE_UTMPX', 23226a23f819SPaolo Bonzini cc.has_type('struct utmpx', 23236a23f819SPaolo Bonzini prefix: '#include <utmpx.h>')) 23246a23f819SPaolo Bonzini 2325904ad5ecSPaolo Bonziniconfig_host_data.set('CONFIG_EVENTFD', cc.links(''' 2326e1fbd2c4SPaolo Bonzini #include <sys/eventfd.h> 2327e1fbd2c4SPaolo Bonzini int main(void) { return eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC); }''')) 2328904ad5ecSPaolo Bonziniconfig_host_data.set('CONFIG_FDATASYNC', cc.links(gnu_source_prefix + ''' 2329e1fbd2c4SPaolo Bonzini #include <unistd.h> 2330e1fbd2c4SPaolo Bonzini int main(void) { 2331e1fbd2c4SPaolo Bonzini #if defined(_POSIX_SYNCHRONIZED_IO) && _POSIX_SYNCHRONIZED_IO > 0 2332e1fbd2c4SPaolo Bonzini return fdatasync(0); 2333e1fbd2c4SPaolo Bonzini #else 2334e1fbd2c4SPaolo Bonzini #error Not supported 2335e1fbd2c4SPaolo Bonzini #endif 2336e1fbd2c4SPaolo Bonzini }''')) 23378900c204SAndrew Deason 23388900c204SAndrew Deasonhas_madvise = cc.links(gnu_source_prefix + ''' 2339e1fbd2c4SPaolo Bonzini #include <sys/types.h> 2340e1fbd2c4SPaolo Bonzini #include <sys/mman.h> 2341e1fbd2c4SPaolo Bonzini #include <stddef.h> 23428900c204SAndrew Deason int main(void) { return madvise(NULL, 0, MADV_DONTNEED); }''') 23438900c204SAndrew Deasonmissing_madvise_proto = false 23448900c204SAndrew Deasonif has_madvise 23458900c204SAndrew Deason # Some platforms (illumos and Solaris before Solaris 11) provide madvise() 23468900c204SAndrew Deason # but forget to prototype it. In this case, has_madvise will be true (the 23478900c204SAndrew Deason # test program links despite a compile warning). To detect the 23488900c204SAndrew Deason # missing-prototype case, we try again with a definitely-bogus prototype. 23498900c204SAndrew Deason # This will only compile if the system headers don't provide the prototype; 23508900c204SAndrew Deason # otherwise the conflicting prototypes will cause a compiler error. 23518900c204SAndrew Deason missing_madvise_proto = cc.links(gnu_source_prefix + ''' 23528900c204SAndrew Deason #include <sys/types.h> 23538900c204SAndrew Deason #include <sys/mman.h> 23548900c204SAndrew Deason #include <stddef.h> 23558900c204SAndrew Deason extern int madvise(int); 23568900c204SAndrew Deason int main(void) { return madvise(0); }''') 23578900c204SAndrew Deasonendif 23588900c204SAndrew Deasonconfig_host_data.set('CONFIG_MADVISE', has_madvise) 23598900c204SAndrew Deasonconfig_host_data.set('HAVE_MADVISE_WITHOUT_PROTOTYPE', missing_madvise_proto) 23608900c204SAndrew Deason 2361904ad5ecSPaolo Bonziniconfig_host_data.set('CONFIG_MEMFD', cc.links(gnu_source_prefix + ''' 2362e1fbd2c4SPaolo Bonzini #include <sys/mman.h> 2363e1fbd2c4SPaolo Bonzini int main(void) { return memfd_create("foo", MFD_ALLOW_SEALING); }''')) 2364904ad5ecSPaolo Bonziniconfig_host_data.set('CONFIG_OPEN_BY_HANDLE', cc.links(gnu_source_prefix + ''' 2365d47a8b3bSPaolo Bonzini #include <fcntl.h> 2366d47a8b3bSPaolo Bonzini #if !defined(AT_EMPTY_PATH) 2367d47a8b3bSPaolo Bonzini # error missing definition 2368d47a8b3bSPaolo Bonzini #else 2369d47a8b3bSPaolo Bonzini int main(void) { struct file_handle fh; return open_by_handle_at(0, &fh, 0); } 2370d47a8b3bSPaolo Bonzini #endif''')) 2371904ad5ecSPaolo Bonziniconfig_host_data.set('CONFIG_POSIX_MADVISE', cc.links(gnu_source_prefix + ''' 2372e1fbd2c4SPaolo Bonzini #include <sys/mman.h> 2373e1fbd2c4SPaolo Bonzini #include <stddef.h> 2374e1fbd2c4SPaolo Bonzini int main(void) { return posix_madvise(NULL, 0, POSIX_MADV_DONTNEED); }''')) 237510f6b231SPaolo Bonzini 23766a23f819SPaolo Bonziniconfig_host_data.set('CONFIG_PTHREAD_SETNAME_NP_W_TID', cc.links(gnu_source_prefix + ''' 237710f6b231SPaolo Bonzini #include <pthread.h> 237810f6b231SPaolo Bonzini 237910f6b231SPaolo Bonzini static void *f(void *p) { return NULL; } 238010f6b231SPaolo Bonzini int main(void) 238110f6b231SPaolo Bonzini { 238210f6b231SPaolo Bonzini pthread_t thread; 238310f6b231SPaolo Bonzini pthread_create(&thread, 0, f, 0); 238410f6b231SPaolo Bonzini pthread_setname_np(thread, "QEMU"); 238510f6b231SPaolo Bonzini return 0; 238610f6b231SPaolo Bonzini }''', dependencies: threads)) 23876a23f819SPaolo Bonziniconfig_host_data.set('CONFIG_PTHREAD_SETNAME_NP_WO_TID', cc.links(gnu_source_prefix + ''' 238810f6b231SPaolo Bonzini #include <pthread.h> 238910f6b231SPaolo Bonzini 239010f6b231SPaolo Bonzini static void *f(void *p) { pthread_setname_np("QEMU"); return NULL; } 239110f6b231SPaolo Bonzini int main(void) 239210f6b231SPaolo Bonzini { 239310f6b231SPaolo Bonzini pthread_t thread; 239410f6b231SPaolo Bonzini pthread_create(&thread, 0, f, 0); 239510f6b231SPaolo Bonzini return 0; 239610f6b231SPaolo Bonzini }''', dependencies: threads)) 23973ada67a3SBrad Smithconfig_host_data.set('CONFIG_PTHREAD_SET_NAME_NP', cc.links(gnu_source_prefix + ''' 23983ada67a3SBrad Smith #include <pthread.h> 23993ada67a3SBrad Smith #include <pthread_np.h> 24003ada67a3SBrad Smith 24013ada67a3SBrad Smith static void *f(void *p) { return NULL; } 24023ada67a3SBrad Smith int main(void) 24033ada67a3SBrad Smith { 24043ada67a3SBrad Smith pthread_t thread; 24053ada67a3SBrad Smith pthread_create(&thread, 0, f, 0); 24063ada67a3SBrad Smith pthread_set_name_np(thread, "QEMU"); 24073ada67a3SBrad Smith return 0; 24083ada67a3SBrad Smith }''', dependencies: threads)) 2409657ac98bSLongpeng(Mike)config_host_data.set('CONFIG_PTHREAD_CONDATTR_SETCLOCK', cc.links(gnu_source_prefix + ''' 2410657ac98bSLongpeng(Mike) #include <pthread.h> 2411657ac98bSLongpeng(Mike) #include <time.h> 2412657ac98bSLongpeng(Mike) 2413657ac98bSLongpeng(Mike) int main(void) 2414657ac98bSLongpeng(Mike) { 2415657ac98bSLongpeng(Mike) pthread_condattr_t attr 2416657ac98bSLongpeng(Mike) pthread_condattr_init(&attr); 2417657ac98bSLongpeng(Mike) pthread_condattr_setclock(&attr, CLOCK_MONOTONIC); 2418657ac98bSLongpeng(Mike) return 0; 2419657ac98bSLongpeng(Mike) }''', dependencies: threads)) 24207730f32cSDavid Hildenbrandconfig_host_data.set('CONFIG_PTHREAD_AFFINITY_NP', cc.links(gnu_source_prefix + ''' 24217730f32cSDavid Hildenbrand #include <pthread.h> 242210f6b231SPaolo Bonzini 24237730f32cSDavid Hildenbrand static void *f(void *p) { return NULL; } 24247730f32cSDavid Hildenbrand int main(void) 24257730f32cSDavid Hildenbrand { 24267730f32cSDavid Hildenbrand int setsize = CPU_ALLOC_SIZE(64); 24277730f32cSDavid Hildenbrand pthread_t thread; 24287730f32cSDavid Hildenbrand cpu_set_t *cpuset; 24297730f32cSDavid Hildenbrand pthread_create(&thread, 0, f, 0); 24307730f32cSDavid Hildenbrand cpuset = CPU_ALLOC(64); 24317730f32cSDavid Hildenbrand CPU_ZERO_S(setsize, cpuset); 24327730f32cSDavid Hildenbrand pthread_setaffinity_np(thread, setsize, cpuset); 24337730f32cSDavid Hildenbrand pthread_getaffinity_np(thread, setsize, cpuset); 24347730f32cSDavid Hildenbrand CPU_FREE(cpuset); 24357730f32cSDavid Hildenbrand return 0; 24367730f32cSDavid Hildenbrand }''', dependencies: threads)) 2437904ad5ecSPaolo Bonziniconfig_host_data.set('CONFIG_SIGNALFD', cc.links(gnu_source_prefix + ''' 24386bd17dccSKacper Słomiński #include <sys/signalfd.h> 24396bd17dccSKacper Słomiński #include <stddef.h> 24406bd17dccSKacper Słomiński int main(void) { return signalfd(-1, NULL, SFD_CLOEXEC); }''')) 2441904ad5ecSPaolo Bonziniconfig_host_data.set('CONFIG_SPLICE', cc.links(gnu_source_prefix + ''' 2442a620fbe9SPaolo Bonzini #include <unistd.h> 2443a620fbe9SPaolo Bonzini #include <fcntl.h> 2444a620fbe9SPaolo Bonzini #include <limits.h> 2445a620fbe9SPaolo Bonzini 2446a620fbe9SPaolo Bonzini int main(void) 2447a620fbe9SPaolo Bonzini { 2448a620fbe9SPaolo Bonzini int len, fd = 0; 2449a620fbe9SPaolo Bonzini len = tee(STDIN_FILENO, STDOUT_FILENO, INT_MAX, SPLICE_F_NONBLOCK); 2450a620fbe9SPaolo Bonzini splice(STDIN_FILENO, NULL, fd, NULL, len, SPLICE_F_MOVE); 2451a620fbe9SPaolo Bonzini return 0; 2452a620fbe9SPaolo Bonzini }''')) 2453e1fbd2c4SPaolo Bonzini 245496a63aebSPaolo Bonziniconfig_host_data.set('HAVE_MLOCKALL', cc.links(gnu_source_prefix + ''' 245596a63aebSPaolo Bonzini #include <sys/mman.h> 2456b5d3dac1SPaolo Bonzini int main(void) { 245796a63aebSPaolo Bonzini return mlockall(MCL_FUTURE); 245896a63aebSPaolo Bonzini }''')) 245996a63aebSPaolo Bonzini 2460eea9453aSThomas Huthhave_l2tpv3 = false 246143a363aeSPaolo Bonziniif get_option('l2tpv3').allowed() and have_system 24626a23f819SPaolo Bonzini have_l2tpv3 = cc.has_type('struct mmsghdr', 24636a23f819SPaolo Bonzini prefix: gnu_source_prefix + ''' 24646a23f819SPaolo Bonzini #include <sys/socket.h> 24656a23f819SPaolo Bonzini #include <linux/ip.h>''') 2466eea9453aSThomas Huthendif 2467eea9453aSThomas Huthconfig_host_data.set('CONFIG_L2TPV3', have_l2tpv3) 2468eea9453aSThomas Huth 2469837b84b1SPaolo Bonzinihave_netmap = false 247043a363aeSPaolo Bonziniif get_option('netmap').allowed() and have_system 2471837b84b1SPaolo Bonzini have_netmap = cc.compiles(''' 2472837b84b1SPaolo Bonzini #include <inttypes.h> 2473837b84b1SPaolo Bonzini #include <net/if.h> 2474837b84b1SPaolo Bonzini #include <net/netmap.h> 2475837b84b1SPaolo Bonzini #include <net/netmap_user.h> 2476837b84b1SPaolo Bonzini #if (NETMAP_API < 11) || (NETMAP_API > 15) 2477837b84b1SPaolo Bonzini #error 2478837b84b1SPaolo Bonzini #endif 2479837b84b1SPaolo Bonzini int main(void) { return 0; }''') 2480837b84b1SPaolo Bonzini if not have_netmap and get_option('netmap').enabled() 2481837b84b1SPaolo Bonzini error('Netmap headers not available') 2482837b84b1SPaolo Bonzini endif 2483837b84b1SPaolo Bonziniendif 2484837b84b1SPaolo Bonziniconfig_host_data.set('CONFIG_NETMAP', have_netmap) 2485837b84b1SPaolo Bonzini 248696a63aebSPaolo Bonzini# Work around a system header bug with some kernel/XFS header 248796a63aebSPaolo Bonzini# versions where they both try to define 'struct fsxattr': 248896a63aebSPaolo Bonzini# xfs headers will not try to redefine structs from linux headers 248996a63aebSPaolo Bonzini# if this macro is set. 249096a63aebSPaolo Bonziniconfig_host_data.set('HAVE_FSXATTR', cc.links(''' 24916a23f819SPaolo Bonzini #include <linux/fs.h> 249296a63aebSPaolo Bonzini struct fsxattr foo; 249396a63aebSPaolo Bonzini int main(void) { 249496a63aebSPaolo Bonzini return 0; 249596a63aebSPaolo Bonzini }''')) 249696a63aebSPaolo Bonzini 2497e46bd55dSPaolo Bonzini# Some versions of Mac OS X incorrectly define SIZE_MAX 2498e46bd55dSPaolo Bonziniconfig_host_data.set('HAVE_BROKEN_SIZE_MAX', not cc.compiles(''' 2499e46bd55dSPaolo Bonzini #include <stdint.h> 2500e46bd55dSPaolo Bonzini #include <stdio.h> 2501b5d3dac1SPaolo Bonzini int main(void) { 2502e46bd55dSPaolo Bonzini return printf("%zu", SIZE_MAX); 2503e46bd55dSPaolo Bonzini }''', args: ['-Werror'])) 2504e46bd55dSPaolo Bonzini 2505e61f1efeSRichard Henderson# See if 64-bit atomic operations are supported. 2506e61f1efeSRichard Henderson# Note that without __atomic builtins, we can only 2507e61f1efeSRichard Henderson# assume atomic loads/stores max at pointer size. 2508e61f1efeSRichard Hendersonconfig_host_data.set('CONFIG_ATOMIC64', cc.links(''' 2509bd87a367SPaolo Bonzini #include <stdint.h> 2510bd87a367SPaolo Bonzini int main(void) 2511bd87a367SPaolo Bonzini { 2512e61f1efeSRichard Henderson uint64_t x = 0, y = 0; 2513bd87a367SPaolo Bonzini y = __atomic_load_n(&x, __ATOMIC_RELAXED); 2514bd87a367SPaolo Bonzini __atomic_store_n(&x, y, __ATOMIC_RELAXED); 2515bd87a367SPaolo Bonzini __atomic_compare_exchange_n(&x, &y, x, 0, __ATOMIC_RELAXED, __ATOMIC_RELAXED); 2516bd87a367SPaolo Bonzini __atomic_exchange_n(&x, y, __ATOMIC_RELAXED); 2517bd87a367SPaolo Bonzini __atomic_fetch_add(&x, y, __ATOMIC_RELAXED); 2518bd87a367SPaolo Bonzini return 0; 2519e61f1efeSRichard Henderson }''')) 2520bd87a367SPaolo Bonzini 25216479dd74SRichard Hendersonhas_int128_type = cc.compiles(''' 25226479dd74SRichard Henderson __int128_t a; 25236479dd74SRichard Henderson __uint128_t b; 25246479dd74SRichard Henderson int main(void) { b = a; }''') 25256479dd74SRichard Hendersonconfig_host_data.set('CONFIG_INT128_TYPE', has_int128_type) 25266479dd74SRichard Henderson 25276479dd74SRichard Hendersonhas_int128 = has_int128_type and cc.links(''' 2528848126d1SMarc-André Lureau __int128_t a; 2529848126d1SMarc-André Lureau __uint128_t b; 2530848126d1SMarc-André Lureau int main (void) { 2531848126d1SMarc-André Lureau a = a + b; 2532848126d1SMarc-André Lureau b = a * b; 2533848126d1SMarc-André Lureau a = a * a; 2534848126d1SMarc-André Lureau return 0; 2535848126d1SMarc-André Lureau }''') 2536848126d1SMarc-André Lureauconfig_host_data.set('CONFIG_INT128', has_int128) 2537848126d1SMarc-André Lureau 25386479dd74SRichard Hendersonif has_int128_type 2539d2958fb0SMarc-André Lureau # "do we have 128-bit atomics which are handled inline and specifically not 2540d2958fb0SMarc-André Lureau # via libatomic". The reason we can't use libatomic is documented in the 2541d2958fb0SMarc-André Lureau # comment starting "GCC is a house divided" in include/qemu/atomic128.h. 2542e61f1efeSRichard Henderson # We only care about these operations on 16-byte aligned pointers, so 2543e61f1efeSRichard Henderson # force 16-byte alignment of the pointer, which may be greater than 2544e61f1efeSRichard Henderson # __alignof(unsigned __int128) for the host. 2545e61f1efeSRichard Henderson atomic_test_128 = ''' 2546e61f1efeSRichard Henderson int main(int ac, char **av) { 25476479dd74SRichard Henderson __uint128_t *p = __builtin_assume_aligned(av[ac - 1], 16); 2548e61f1efeSRichard Henderson p[1] = __atomic_load_n(&p[0], __ATOMIC_RELAXED); 2549e61f1efeSRichard Henderson __atomic_store_n(&p[2], p[3], __ATOMIC_RELAXED); 2550e61f1efeSRichard Henderson __atomic_compare_exchange_n(&p[4], &p[5], p[6], 0, __ATOMIC_RELAXED, __ATOMIC_RELAXED); 2551e61f1efeSRichard Henderson return 0; 2552e61f1efeSRichard Henderson }''' 2553e61f1efeSRichard Henderson has_atomic128 = cc.links(atomic_test_128) 2554848126d1SMarc-André Lureau 2555848126d1SMarc-André Lureau config_host_data.set('CONFIG_ATOMIC128', has_atomic128) 2556848126d1SMarc-André Lureau 2557848126d1SMarc-André Lureau if not has_atomic128 2558e61f1efeSRichard Henderson # Even with __builtin_assume_aligned, the above test may have failed 2559e61f1efeSRichard Henderson # without optimization enabled. Try again with optimizations locally 2560e61f1efeSRichard Henderson # enabled for the function. See 2561e61f1efeSRichard Henderson # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107389 2562e61f1efeSRichard Henderson has_atomic128_opt = cc.links('__attribute__((optimize("O1")))' + atomic_test_128) 2563e61f1efeSRichard Henderson config_host_data.set('CONFIG_ATOMIC128_OPT', has_atomic128_opt) 2564e61f1efeSRichard Henderson 2565e61f1efeSRichard Henderson if not has_atomic128_opt 2566e61f1efeSRichard Henderson config_host_data.set('CONFIG_CMPXCHG128', cc.links(''' 2567848126d1SMarc-André Lureau int main(void) 2568848126d1SMarc-André Lureau { 25696479dd74SRichard Henderson __uint128_t x = 0, y = 0; 2570848126d1SMarc-André Lureau __sync_val_compare_and_swap_16(&x, y, x); 2571848126d1SMarc-André Lureau return 0; 2572848126d1SMarc-André Lureau } 2573e61f1efeSRichard Henderson ''')) 2574e61f1efeSRichard Henderson endif 2575848126d1SMarc-André Lureau endif 2576848126d1SMarc-André Lureauendif 2577bd87a367SPaolo Bonzini 2578bd87a367SPaolo Bonziniconfig_host_data.set('CONFIG_GETAUXVAL', cc.links(gnu_source_prefix + ''' 2579bd87a367SPaolo Bonzini #include <sys/auxv.h> 2580bd87a367SPaolo Bonzini int main(void) { 2581bd87a367SPaolo Bonzini return getauxval(AT_HWCAP) == 0; 2582bd87a367SPaolo Bonzini }''')) 2583bd87a367SPaolo Bonzini 25840dae95d4SPaolo Bonziniconfig_host_data.set('CONFIG_USBFS', have_linux_user and cc.compiles(''' 25850dae95d4SPaolo Bonzini #include <linux/usbdevice_fs.h> 25860dae95d4SPaolo Bonzini 25870dae95d4SPaolo Bonzini #ifndef USBDEVFS_GET_CAPABILITIES 25880dae95d4SPaolo Bonzini #error "USBDEVFS_GET_CAPABILITIES undefined" 25890dae95d4SPaolo Bonzini #endif 25900dae95d4SPaolo Bonzini 25910dae95d4SPaolo Bonzini #ifndef USBDEVFS_DISCONNECT_CLAIM 25920dae95d4SPaolo Bonzini #error "USBDEVFS_DISCONNECT_CLAIM undefined" 25930dae95d4SPaolo Bonzini #endif 25940dae95d4SPaolo Bonzini 25950dae95d4SPaolo Bonzini int main(void) { return 0; }''')) 25960dae95d4SPaolo Bonzini 25972edd2c04SPaolo Bonzinihave_keyring = get_option('keyring') \ 25982edd2c04SPaolo Bonzini .require(targetos == 'linux', error_message: 'keyring is only available on Linux') \ 25992edd2c04SPaolo Bonzini .require(cc.compiles(''' 26002edd2c04SPaolo Bonzini #include <errno.h> 26012edd2c04SPaolo Bonzini #include <asm/unistd.h> 26022edd2c04SPaolo Bonzini #include <linux/keyctl.h> 26032edd2c04SPaolo Bonzini #include <sys/syscall.h> 26042edd2c04SPaolo Bonzini #include <unistd.h> 26052edd2c04SPaolo Bonzini int main(void) { 26062edd2c04SPaolo Bonzini return syscall(__NR_keyctl, KEYCTL_READ, 0, NULL, NULL, 0); 26072edd2c04SPaolo Bonzini }'''), error_message: 'keyctl syscall not available on this system').allowed() 26082edd2c04SPaolo Bonziniconfig_host_data.set('CONFIG_SECRET_KEYRING', have_keyring) 26092edd2c04SPaolo Bonzini 2610622753d2SPaolo Bonzinihave_cpuid_h = cc.links(''' 2611622753d2SPaolo Bonzini #include <cpuid.h> 2612622753d2SPaolo Bonzini int main(void) { 2613622753d2SPaolo Bonzini unsigned a, b, c, d; 2614622753d2SPaolo Bonzini unsigned max = __get_cpuid_max(0, 0); 2615622753d2SPaolo Bonzini 2616622753d2SPaolo Bonzini if (max >= 1) { 2617622753d2SPaolo Bonzini __cpuid(1, a, b, c, d); 2618622753d2SPaolo Bonzini } 2619622753d2SPaolo Bonzini 2620622753d2SPaolo Bonzini if (max >= 7) { 2621622753d2SPaolo Bonzini __cpuid_count(7, 0, a, b, c, d); 2622622753d2SPaolo Bonzini } 2623622753d2SPaolo Bonzini 2624622753d2SPaolo Bonzini return 0; 2625622753d2SPaolo Bonzini }''') 2626622753d2SPaolo Bonziniconfig_host_data.set('CONFIG_CPUID_H', have_cpuid_h) 2627622753d2SPaolo Bonzini 2628622753d2SPaolo Bonziniconfig_host_data.set('CONFIG_AVX2_OPT', get_option('avx2') \ 2629622753d2SPaolo Bonzini .require(have_cpuid_h, error_message: 'cpuid.h not available, cannot enable AVX2') \ 2630622753d2SPaolo Bonzini .require(cc.links(''' 2631622753d2SPaolo Bonzini #include <cpuid.h> 2632622753d2SPaolo Bonzini #include <immintrin.h> 2633701ea587SRichard Henderson static int __attribute__((target("avx2"))) bar(void *a) { 2634622753d2SPaolo Bonzini __m256i x = *(__m256i *)a; 2635622753d2SPaolo Bonzini return _mm256_testz_si256(x, x); 2636622753d2SPaolo Bonzini } 2637b5d3dac1SPaolo Bonzini int main(int argc, char *argv[]) { return bar(argv[argc - 1]); } 2638622753d2SPaolo Bonzini '''), error_message: 'AVX2 not available').allowed()) 2639622753d2SPaolo Bonzini 2640622753d2SPaolo Bonziniconfig_host_data.set('CONFIG_AVX512F_OPT', get_option('avx512f') \ 2641622753d2SPaolo Bonzini .require(have_cpuid_h, error_message: 'cpuid.h not available, cannot enable AVX512F') \ 2642622753d2SPaolo Bonzini .require(cc.links(''' 2643622753d2SPaolo Bonzini #include <cpuid.h> 2644622753d2SPaolo Bonzini #include <immintrin.h> 2645701ea587SRichard Henderson static int __attribute__((target("avx512f"))) bar(void *a) { 2646622753d2SPaolo Bonzini __m512i x = *(__m512i *)a; 2647622753d2SPaolo Bonzini return _mm512_test_epi64_mask(x, x); 2648622753d2SPaolo Bonzini } 2649b5d3dac1SPaolo Bonzini int main(int argc, char *argv[]) { return bar(argv[argc - 1]); } 2650622753d2SPaolo Bonzini '''), error_message: 'AVX512F not available').allowed()) 2651622753d2SPaolo Bonzini 265204ffce13Sling xuconfig_host_data.set('CONFIG_AVX512BW_OPT', get_option('avx512bw') \ 265304ffce13Sling xu .require(have_cpuid_h, error_message: 'cpuid.h not available, cannot enable AVX512BW') \ 265404ffce13Sling xu .require(cc.links(''' 265504ffce13Sling xu #include <cpuid.h> 265604ffce13Sling xu #include <immintrin.h> 2657dc165fcdSRichard Henderson static int __attribute__((target("avx512bw"))) bar(void *a) { 265804ffce13Sling xu __m512i *x = a; 265904ffce13Sling xu __m512i res= _mm512_abs_epi8(*x); 266004ffce13Sling xu return res[1]; 266104ffce13Sling xu } 266204ffce13Sling xu int main(int argc, char *argv[]) { return bar(argv[0]); } 266304ffce13Sling xu '''), error_message: 'AVX512BW not available').allowed()) 266404ffce13Sling xu 26658d97f28eSRichard Henderson# For both AArch64 and AArch32, detect if builtins are available. 26668d97f28eSRichard Hendersonconfig_host_data.set('CONFIG_ARM_AES_BUILTIN', cc.compiles(''' 26678d97f28eSRichard Henderson #include <arm_neon.h> 26688d97f28eSRichard Henderson #ifndef __ARM_FEATURE_AES 26698d97f28eSRichard Henderson __attribute__((target("+crypto"))) 26708d97f28eSRichard Henderson #endif 26718d97f28eSRichard Henderson void foo(uint8x16_t *p) { *p = vaesmcq_u8(*p); } 26728d97f28eSRichard Henderson ''')) 26738d97f28eSRichard Henderson 26743730a734SPaolo Bonzinihave_pvrdma = get_option('pvrdma') \ 26753730a734SPaolo Bonzini .require(rdma.found(), error_message: 'PVRDMA requires OpenFabrics libraries') \ 2676354d2d9bSJuan Quintela .require(cc.compiles(gnu_source_prefix + ''' 2677354d2d9bSJuan Quintela #include <sys/mman.h> 26783730a734SPaolo Bonzini int main(void) 26793730a734SPaolo Bonzini { 26803730a734SPaolo Bonzini char buf = 0; 26813730a734SPaolo Bonzini void *addr = &buf; 26823730a734SPaolo Bonzini addr = mremap(addr, 0, 1, MREMAP_MAYMOVE | MREMAP_FIXED); 26833730a734SPaolo Bonzini 26843730a734SPaolo Bonzini return 0; 26853730a734SPaolo Bonzini }'''), error_message: 'PVRDMA requires mremap').allowed() 26863730a734SPaolo Bonzini 26873730a734SPaolo Bonziniif have_pvrdma 2688354d2d9bSJuan Quintela config_host_data.set('LEGACY_RDMA_REG_MR', not cc.links(''' 26893730a734SPaolo Bonzini #include <infiniband/verbs.h> 26903730a734SPaolo Bonzini int main(void) 26913730a734SPaolo Bonzini { 26923730a734SPaolo Bonzini struct ibv_mr *mr; 26933730a734SPaolo Bonzini struct ibv_pd *pd = NULL; 26943730a734SPaolo Bonzini size_t length = 10; 26953730a734SPaolo Bonzini uint64_t iova = 0; 26963730a734SPaolo Bonzini int access = 0; 26973730a734SPaolo Bonzini void *addr = NULL; 26983730a734SPaolo Bonzini 26993730a734SPaolo Bonzini mr = ibv_reg_mr_iova(pd, addr, length, iova, access); 27003730a734SPaolo Bonzini ibv_dereg_mr(mr); 27013730a734SPaolo Bonzini return 0; 27023730a734SPaolo Bonzini }''')) 27033730a734SPaolo Bonziniendif 27043730a734SPaolo Bonzini 2705b87df904SPaolo Bonziniif get_option('membarrier').disabled() 2706b87df904SPaolo Bonzini have_membarrier = false 2707b87df904SPaolo Bonzinielif targetos == 'windows' 2708b87df904SPaolo Bonzini have_membarrier = true 2709b87df904SPaolo Bonzinielif targetos == 'linux' 2710b87df904SPaolo Bonzini have_membarrier = cc.compiles(''' 2711b87df904SPaolo Bonzini #include <linux/membarrier.h> 2712b87df904SPaolo Bonzini #include <sys/syscall.h> 2713b87df904SPaolo Bonzini #include <unistd.h> 2714b87df904SPaolo Bonzini #include <stdlib.h> 2715b87df904SPaolo Bonzini int main(void) { 2716b87df904SPaolo Bonzini syscall(__NR_membarrier, MEMBARRIER_CMD_QUERY, 0); 2717b87df904SPaolo Bonzini syscall(__NR_membarrier, MEMBARRIER_CMD_SHARED, 0); 2718b87df904SPaolo Bonzini exit(0); 2719b87df904SPaolo Bonzini }''') 2720b87df904SPaolo Bonziniendif 2721b87df904SPaolo Bonziniconfig_host_data.set('CONFIG_MEMBARRIER', get_option('membarrier') \ 2722b87df904SPaolo Bonzini .require(have_membarrier, error_message: 'membarrier system call not available') \ 2723b87df904SPaolo Bonzini .allowed()) 2724b87df904SPaolo Bonzini 272534b52615SPaolo Bonzinihave_afalg = get_option('crypto_afalg') \ 272634b52615SPaolo Bonzini .require(cc.compiles(gnu_source_prefix + ''' 272734b52615SPaolo Bonzini #include <errno.h> 272834b52615SPaolo Bonzini #include <sys/types.h> 272934b52615SPaolo Bonzini #include <sys/socket.h> 273034b52615SPaolo Bonzini #include <linux/if_alg.h> 273134b52615SPaolo Bonzini int main(void) { 273234b52615SPaolo Bonzini int sock; 273334b52615SPaolo Bonzini sock = socket(AF_ALG, SOCK_SEQPACKET, 0); 273434b52615SPaolo Bonzini return sock; 273534b52615SPaolo Bonzini } 273634b52615SPaolo Bonzini '''), error_message: 'AF_ALG requested but could not be detected').allowed() 273734b52615SPaolo Bonziniconfig_host_data.set('CONFIG_AF_ALG', have_afalg) 273834b52615SPaolo Bonzini 27399d734b85SMarc-André Lureauconfig_host_data.set('CONFIG_AF_VSOCK', cc.has_header_symbol( 27409d734b85SMarc-André Lureau 'linux/vm_sockets.h', 'AF_VSOCK', 27419d734b85SMarc-André Lureau prefix: '#include <sys/socket.h>', 27429d734b85SMarc-André Lureau)) 2743bd87a367SPaolo Bonzini 27448821a389SMarc-André Lureauhave_vss = false 2745872b69e6SMarc-André Lureauhave_vss_sdk = false # old xp/2003 SDK 2746785abf0dSThomas Huthif targetos == 'windows' and 'cpp' in all_languages 27478821a389SMarc-André Lureau have_vss = cxx.compiles(''' 27488821a389SMarc-André Lureau #define __MIDL_user_allocate_free_DEFINED__ 274932478cb6SMarc-André Lureau #include <vss.h> 27508821a389SMarc-André Lureau int main(void) { return VSS_CTX_BACKUP; }''') 2751872b69e6SMarc-André Lureau have_vss_sdk = cxx.has_header('vscoordint.h') 27528821a389SMarc-André Lureauendif 2753872b69e6SMarc-André Lureauconfig_host_data.set('HAVE_VSS_SDK', have_vss_sdk) 27548821a389SMarc-André Lureau 2755859aef02SPaolo Bonziniforeach k, v: config_host 2756ce6119dcSPaolo Bonzini if k.startswith('CONFIG_') 2757859aef02SPaolo Bonzini config_host_data.set(k, v == 'y' ? 1 : v) 2758859aef02SPaolo Bonzini endif 2759859aef02SPaolo Bonziniendforeach 2760859aef02SPaolo Bonzini 27616391c772SRichard Henderson# Older versions of MinGW do not import _lock_file and _unlock_file properly. 27626391c772SRichard Henderson# This was fixed for v6.0.0 with commit b48e3ac8969d. 27636391c772SRichard Hendersonif targetos == 'windows' 27646391c772SRichard Henderson config_host_data.set('HAVE__LOCK_FILE', cc.links(''' 27656391c772SRichard Henderson #include <stdio.h> 27666391c772SRichard Henderson int main(void) { 27676391c772SRichard Henderson _lock_file(NULL); 27686391c772SRichard Henderson _unlock_file(NULL); 27696391c772SRichard Henderson return 0; 27706391c772SRichard Henderson }''', name: '_lock_file and _unlock_file')) 27716391c772SRichard Hendersonendif 27726391c772SRichard Henderson 2773dbd672c8SPierrick Bouvierif targetos == 'windows' 2774dbd672c8SPierrick Bouvier mingw_has_setjmp_longjmp = cc.links(''' 2775dbd672c8SPierrick Bouvier #include <setjmp.h> 2776dbd672c8SPierrick Bouvier int main(void) { 2777dbd672c8SPierrick Bouvier /* 2778dbd672c8SPierrick Bouvier * These functions are not available in setjmp header, but may be 2779dbd672c8SPierrick Bouvier * available at link time, from libmingwex.a. 2780dbd672c8SPierrick Bouvier */ 2781dbd672c8SPierrick Bouvier extern int __mingw_setjmp(jmp_buf); 2782dbd672c8SPierrick Bouvier extern void __attribute__((noreturn)) __mingw_longjmp(jmp_buf, int); 2783dbd672c8SPierrick Bouvier jmp_buf env; 2784dbd672c8SPierrick Bouvier __mingw_setjmp(env); 2785dbd672c8SPierrick Bouvier __mingw_longjmp(env, 0); 2786dbd672c8SPierrick Bouvier } 2787dbd672c8SPierrick Bouvier ''', name: 'mingw setjmp and longjmp') 2788dbd672c8SPierrick Bouvier 2789dbd672c8SPierrick Bouvier if cpu == 'aarch64' and not mingw_has_setjmp_longjmp 2790dbd672c8SPierrick Bouvier error('mingw must provide setjmp/longjmp for windows-arm64') 2791dbd672c8SPierrick Bouvier endif 2792dbd672c8SPierrick Bouvierendif 2793dbd672c8SPierrick Bouvier 2794a0c9162cSPaolo Bonzini######################## 2795a0c9162cSPaolo Bonzini# Target configuration # 2796a0c9162cSPaolo Bonzini######################## 2797a0c9162cSPaolo Bonzini 27982becc36aSPaolo Bonziniminikconf = find_program('scripts/minikconf.py') 279905512f55SPaolo Bonziniconfig_all = {} 2800a98006bcSPaolo Bonziniconfig_all_devices = {} 2801ca0fc784SPaolo Bonziniconfig_all_disas = {} 28022becc36aSPaolo Bonziniconfig_devices_mak_list = [] 28032becc36aSPaolo Bonziniconfig_devices_h = {} 2804859aef02SPaolo Bonziniconfig_target_h = {} 28052becc36aSPaolo Bonziniconfig_target_mak = {} 2806ca0fc784SPaolo Bonzini 2807ca0fc784SPaolo Bonzinidisassemblers = { 2808ca0fc784SPaolo Bonzini 'alpha' : ['CONFIG_ALPHA_DIS'], 2809ca0fc784SPaolo Bonzini 'avr' : ['CONFIG_AVR_DIS'], 2810ca0fc784SPaolo Bonzini 'cris' : ['CONFIG_CRIS_DIS'], 28113e7a84eeSTaylor Simpson 'hexagon' : ['CONFIG_HEXAGON_DIS'], 2812ca0fc784SPaolo Bonzini 'hppa' : ['CONFIG_HPPA_DIS'], 2813ca0fc784SPaolo Bonzini 'i386' : ['CONFIG_I386_DIS'], 2814ca0fc784SPaolo Bonzini 'x86_64' : ['CONFIG_I386_DIS'], 2815ca0fc784SPaolo Bonzini 'm68k' : ['CONFIG_M68K_DIS'], 2816ca0fc784SPaolo Bonzini 'microblaze' : ['CONFIG_MICROBLAZE_DIS'], 2817ca0fc784SPaolo Bonzini 'mips' : ['CONFIG_MIPS_DIS'], 2818ca0fc784SPaolo Bonzini 'nios2' : ['CONFIG_NIOS2_DIS'], 2819ca0fc784SPaolo Bonzini 'or1k' : ['CONFIG_OPENRISC_DIS'], 2820ca0fc784SPaolo Bonzini 'ppc' : ['CONFIG_PPC_DIS'], 2821ca0fc784SPaolo Bonzini 'riscv' : ['CONFIG_RISCV_DIS'], 2822ca0fc784SPaolo Bonzini 'rx' : ['CONFIG_RX_DIS'], 2823ca0fc784SPaolo Bonzini 's390' : ['CONFIG_S390_DIS'], 2824ca0fc784SPaolo Bonzini 'sh4' : ['CONFIG_SH4_DIS'], 2825ca0fc784SPaolo Bonzini 'sparc' : ['CONFIG_SPARC_DIS'], 2826ca0fc784SPaolo Bonzini 'xtensa' : ['CONFIG_XTENSA_DIS'], 2827aae1746cSSong Gao 'loongarch' : ['CONFIG_LOONGARCH_DIS'], 2828ca0fc784SPaolo Bonzini} 2829ca0fc784SPaolo Bonzini 2830e1fbd2c4SPaolo Bonzinihave_ivshmem = config_host_data.get('CONFIG_EVENTFD') 28310a189110SPaolo Bonzinihost_kconfig = \ 2832537b7248SPaolo Bonzini (get_option('fuzzing') ? ['CONFIG_FUZZ=y'] : []) + \ 28330d04c4c9SPaolo Bonzini (have_tpm ? ['CONFIG_TPM=y'] : []) + \ 28343f0a5d55SMarc-André Lureau (spice.found() ? ['CONFIG_SPICE=y'] : []) + \ 2835ccd250aaSPaolo Bonzini (have_ivshmem ? ['CONFIG_IVSHMEM=y'] : []) + \ 283688b6e618SPaolo Bonzini (opengl.found() ? ['CONFIG_OPENGL=y'] : []) + \ 28379d71037fSPaolo Bonzini (x11.found() ? ['CONFIG_X11=y'] : []) + \ 28382a3129a3SPaolo Bonzini (have_vhost_user ? ['CONFIG_VHOST_USER=y'] : []) + \ 28392a3129a3SPaolo Bonzini (have_vhost_vdpa ? ['CONFIG_VHOST_VDPA=y'] : []) + \ 28402a3129a3SPaolo Bonzini (have_vhost_kernel ? ['CONFIG_VHOST_KERNEL=y'] : []) + \ 284169202b40SPaolo Bonzini (have_virtfs ? ['CONFIG_VIRTFS=y'] : []) + \ 28420a189110SPaolo Bonzini ('CONFIG_LINUX' in config_host ? ['CONFIG_LINUX=y'] : []) + \ 28433730a734SPaolo Bonzini (have_pvrdma ? ['CONFIG_PVRDMA=y'] : []) + \ 284455116968SJagannathan Raman (multiprocess_allowed ? ['CONFIG_MULTIPROCESS_ALLOWED=y'] : []) + \ 284555116968SJagannathan Raman (vfio_user_server_allowed ? ['CONFIG_VFIO_USER_SERVER_ALLOWED=y'] : []) 28460a189110SPaolo Bonzini 2847a9a74907SPaolo Bonziniignored = [ 'TARGET_XML_FILES', 'TARGET_ABI_DIR', 'TARGET_ARCH' ] 2848ca0fc784SPaolo Bonzini 2849fdb75aefSPaolo Bonzinidefault_targets = 'CONFIG_DEFAULT_TARGETS' in config_host 2850fdb75aefSPaolo Bonziniactual_target_dirs = [] 2851fbb4121dSPaolo Bonzinifdt_required = [] 2852a81df1b6SPaolo Bonziniforeach target : target_dirs 2853765686d6SPaolo Bonzini config_target = { 'TARGET_NAME': target.split('-')[0] } 2854765686d6SPaolo Bonzini if target.endswith('linux-user') 2855fdb75aefSPaolo Bonzini if targetos != 'linux' 2856fdb75aefSPaolo Bonzini if default_targets 2857fdb75aefSPaolo Bonzini continue 2858fdb75aefSPaolo Bonzini endif 2859fdb75aefSPaolo Bonzini error('Target @0@ is only available on a Linux host'.format(target)) 2860fdb75aefSPaolo Bonzini endif 2861765686d6SPaolo Bonzini config_target += { 'CONFIG_LINUX_USER': 'y' } 2862765686d6SPaolo Bonzini elif target.endswith('bsd-user') 2863fdb75aefSPaolo Bonzini if 'CONFIG_BSD' not in config_host 2864fdb75aefSPaolo Bonzini if default_targets 2865fdb75aefSPaolo Bonzini continue 2866fdb75aefSPaolo Bonzini endif 2867fdb75aefSPaolo Bonzini error('Target @0@ is only available on a BSD host'.format(target)) 2868fdb75aefSPaolo Bonzini endif 2869765686d6SPaolo Bonzini config_target += { 'CONFIG_BSD_USER': 'y' } 2870765686d6SPaolo Bonzini elif target.endswith('softmmu') 2871bd0c03b2SPhilippe Mathieu-Daudé config_target += { 'CONFIG_SYSTEM_ONLY': 'y' } 2872765686d6SPaolo Bonzini config_target += { 'CONFIG_SOFTMMU': 'y' } 2873765686d6SPaolo Bonzini endif 2874765686d6SPaolo Bonzini if target.endswith('-user') 2875765686d6SPaolo Bonzini config_target += { 2876765686d6SPaolo Bonzini 'CONFIG_USER_ONLY': 'y', 2877765686d6SPaolo Bonzini 'CONFIG_QEMU_INTERP_PREFIX': 2878ce6119dcSPaolo Bonzini get_option('interp_prefix').replace('%M', config_target['TARGET_NAME']) 2879765686d6SPaolo Bonzini } 2880765686d6SPaolo Bonzini endif 2881859aef02SPaolo Bonzini 28820a189110SPaolo Bonzini accel_kconfig = [] 28838a19980eSPaolo Bonzini foreach sym: accelerators 28848a19980eSPaolo Bonzini if sym == 'CONFIG_TCG' or target in accelerator_targets.get(sym, []) 28858a19980eSPaolo Bonzini config_target += { sym: 'y' } 28868a19980eSPaolo Bonzini config_all += { sym: 'y' } 2887dae0ec15SGerd Hoffmann if target in modular_tcg 2888dae0ec15SGerd Hoffmann config_target += { 'CONFIG_TCG_MODULAR': 'y' } 2889dae0ec15SGerd Hoffmann else 2890dae0ec15SGerd Hoffmann config_target += { 'CONFIG_TCG_BUILTIN': 'y' } 2891dae0ec15SGerd Hoffmann endif 28920a189110SPaolo Bonzini accel_kconfig += [ sym + '=y' ] 28938a19980eSPaolo Bonzini endif 28948a19980eSPaolo Bonzini endforeach 28950a189110SPaolo Bonzini if accel_kconfig.length() == 0 2896fdb75aefSPaolo Bonzini if default_targets 2897fdb75aefSPaolo Bonzini continue 2898fdb75aefSPaolo Bonzini endif 2899fdb75aefSPaolo Bonzini error('No accelerator available for target @0@'.format(target)) 2900fdb75aefSPaolo Bonzini endif 29018a19980eSPaolo Bonzini 2902fdb75aefSPaolo Bonzini actual_target_dirs += target 2903812b31d3SAlex Bennée config_target += keyval.load('configs/targets' / target + '.mak') 2904a9a74907SPaolo Bonzini config_target += { 'TARGET_' + config_target['TARGET_ARCH'].to_upper(): 'y' } 2905765686d6SPaolo Bonzini 2906fbb4121dSPaolo Bonzini if 'TARGET_NEED_FDT' in config_target 2907fbb4121dSPaolo Bonzini fdt_required += target 2908fbb4121dSPaolo Bonzini endif 2909fbb4121dSPaolo Bonzini 2910fa73168bSPaolo Bonzini # Add default keys 2911fa73168bSPaolo Bonzini if 'TARGET_BASE_ARCH' not in config_target 2912fa73168bSPaolo Bonzini config_target += {'TARGET_BASE_ARCH': config_target['TARGET_ARCH']} 2913fa73168bSPaolo Bonzini endif 2914fa73168bSPaolo Bonzini if 'TARGET_ABI_DIR' not in config_target 2915fa73168bSPaolo Bonzini config_target += {'TARGET_ABI_DIR': config_target['TARGET_ARCH']} 2916fa73168bSPaolo Bonzini endif 2917ee3eb3a7SMarc-André Lureau if 'TARGET_BIG_ENDIAN' not in config_target 2918ee3eb3a7SMarc-André Lureau config_target += {'TARGET_BIG_ENDIAN': 'n'} 2919ee3eb3a7SMarc-André Lureau endif 2920859aef02SPaolo Bonzini 2921ca0fc784SPaolo Bonzini foreach k, v: disassemblers 2922823eb013SPaolo Bonzini if host_arch.startswith(k) or config_target['TARGET_BASE_ARCH'].startswith(k) 2923ca0fc784SPaolo Bonzini foreach sym: v 2924ca0fc784SPaolo Bonzini config_target += { sym: 'y' } 2925ca0fc784SPaolo Bonzini config_all_disas += { sym: 'y' } 2926ca0fc784SPaolo Bonzini endforeach 2927ca0fc784SPaolo Bonzini endif 2928ca0fc784SPaolo Bonzini endforeach 2929ca0fc784SPaolo Bonzini 2930859aef02SPaolo Bonzini config_target_data = configuration_data() 2931859aef02SPaolo Bonzini foreach k, v: config_target 2932859aef02SPaolo Bonzini if not k.startswith('TARGET_') and not k.startswith('CONFIG_') 2933859aef02SPaolo Bonzini # do nothing 2934859aef02SPaolo Bonzini elif ignored.contains(k) 2935859aef02SPaolo Bonzini # do nothing 2936859aef02SPaolo Bonzini elif k == 'TARGET_BASE_ARCH' 2937a9a74907SPaolo Bonzini # Note that TARGET_BASE_ARCH ends up in config-target.h but it is 2938a9a74907SPaolo Bonzini # not used to select files from sourcesets. 2939859aef02SPaolo Bonzini config_target_data.set('TARGET_' + v.to_upper(), 1) 2940765686d6SPaolo Bonzini elif k == 'TARGET_NAME' or k == 'CONFIG_QEMU_INTERP_PREFIX' 2941859aef02SPaolo Bonzini config_target_data.set_quoted(k, v) 2942859aef02SPaolo Bonzini elif v == 'y' 2943859aef02SPaolo Bonzini config_target_data.set(k, 1) 2944ee3eb3a7SMarc-André Lureau elif v == 'n' 2945ee3eb3a7SMarc-André Lureau config_target_data.set(k, 0) 2946859aef02SPaolo Bonzini else 2947859aef02SPaolo Bonzini config_target_data.set(k, v) 2948859aef02SPaolo Bonzini endif 2949859aef02SPaolo Bonzini endforeach 2950cb2c5531SPeter Maydell config_target_data.set('QEMU_ARCH', 2951cb2c5531SPeter Maydell 'QEMU_ARCH_' + config_target['TARGET_BASE_ARCH'].to_upper()) 2952859aef02SPaolo Bonzini config_target_h += {target: configure_file(output: target + '-config-target.h', 2953859aef02SPaolo Bonzini configuration: config_target_data)} 29542becc36aSPaolo Bonzini 29552becc36aSPaolo Bonzini if target.endswith('-softmmu') 2956d1d5e9eeSAlex Bennée config_input = meson.get_external_property(target, 'default') 29572becc36aSPaolo Bonzini config_devices_mak = target + '-config-devices.mak' 29582becc36aSPaolo Bonzini config_devices_mak = configure_file( 2959d1d5e9eeSAlex Bennée input: ['configs/devices' / target / config_input + '.mak', 'Kconfig'], 29602becc36aSPaolo Bonzini output: config_devices_mak, 29612becc36aSPaolo Bonzini depfile: config_devices_mak + '.d', 29622becc36aSPaolo Bonzini capture: true, 29637bc3ca7fSPaolo Bonzini command: [minikconf, 29647bc3ca7fSPaolo Bonzini get_option('default_devices') ? '--defconfig' : '--allnoconfig', 29652becc36aSPaolo Bonzini config_devices_mak, '@DEPFILE@', '@INPUT@', 2966f4063f9cSPhilippe Mathieu-Daudé host_kconfig, accel_kconfig, 2967f4063f9cSPhilippe Mathieu-Daudé 'CONFIG_' + config_target['TARGET_ARCH'].to_upper() + '=y']) 2968859aef02SPaolo Bonzini 2969859aef02SPaolo Bonzini config_devices_data = configuration_data() 2970859aef02SPaolo Bonzini config_devices = keyval.load(config_devices_mak) 2971859aef02SPaolo Bonzini foreach k, v: config_devices 2972859aef02SPaolo Bonzini config_devices_data.set(k, 1) 2973859aef02SPaolo Bonzini endforeach 29742becc36aSPaolo Bonzini config_devices_mak_list += config_devices_mak 2975859aef02SPaolo Bonzini config_devices_h += {target: configure_file(output: target + '-config-devices.h', 2976859aef02SPaolo Bonzini configuration: config_devices_data)} 2977859aef02SPaolo Bonzini config_target += config_devices 2978a98006bcSPaolo Bonzini config_all_devices += config_devices 29792becc36aSPaolo Bonzini endif 29802becc36aSPaolo Bonzini config_target_mak += {target: config_target} 2981a81df1b6SPaolo Bonziniendforeach 2982fdb75aefSPaolo Bonzinitarget_dirs = actual_target_dirs 2983a81df1b6SPaolo Bonzini 29842becc36aSPaolo Bonzini# This configuration is used to build files that are shared by 29852becc36aSPaolo Bonzini# multiple binaries, and then extracted out of the "common" 29862becc36aSPaolo Bonzini# static_library target. 29872becc36aSPaolo Bonzini# 29882becc36aSPaolo Bonzini# We do not use all_sources()/all_dependencies(), because it would 29892becc36aSPaolo Bonzini# build literally all source files, including devices only used by 29902becc36aSPaolo Bonzini# targets that are not built for this compilation. The CONFIG_ALL 29912becc36aSPaolo Bonzini# pseudo symbol replaces it. 29922becc36aSPaolo Bonzini 299305512f55SPaolo Bonziniconfig_all += config_all_devices 29942becc36aSPaolo Bonziniconfig_all += config_host 29952becc36aSPaolo Bonziniconfig_all += config_all_disas 29962becc36aSPaolo Bonziniconfig_all += { 299714efd8d3SPaolo Bonzini 'CONFIG_XEN': xen.found(), 2998c7b64948SPhilippe Mathieu-Daudé 'CONFIG_SYSTEM_ONLY': have_system, 29992becc36aSPaolo Bonzini 'CONFIG_USER_ONLY': have_user, 30002becc36aSPaolo Bonzini 'CONFIG_ALL': true, 30012becc36aSPaolo Bonzini} 30022becc36aSPaolo Bonzini 3003eed56e9aSPaolo Bonzinitarget_configs_h = [] 3004eed56e9aSPaolo Bonziniforeach target: target_dirs 3005eed56e9aSPaolo Bonzini target_configs_h += config_target_h[target] 3006eed56e9aSPaolo Bonzini target_configs_h += config_devices_h.get(target, []) 3007eed56e9aSPaolo Bonziniendforeach 3008eed56e9aSPaolo Bonzinigenh += custom_target('config-poison.h', 3009eed56e9aSPaolo Bonzini input: [target_configs_h], 3010eed56e9aSPaolo Bonzini output: 'config-poison.h', 3011eed56e9aSPaolo Bonzini capture: true, 3012eed56e9aSPaolo Bonzini command: [find_program('scripts/make-config-poison.sh'), 3013eed56e9aSPaolo Bonzini target_configs_h]) 3014eed56e9aSPaolo Bonzini 3015a0c9162cSPaolo Bonzini############## 3016a0c9162cSPaolo Bonzini# Submodules # 3017a0c9162cSPaolo Bonzini############## 30188b18cdbfSRichard Henderson 30198b18cdbfSRichard Hendersoncapstone = not_found 302083602083SThomas Huthif not get_option('capstone').auto() or have_system or have_user 302143ecd166SThomas Huth capstone = dependency('capstone', version: '>=3.0.5', 3022063d5119SPaolo Bonzini method: 'pkg-config', 302383602083SThomas Huth required: get_option('capstone')) 30248f4aea71SDaniel P. Berrangé 30258f4aea71SDaniel P. Berrangé # Some versions of capstone have broken pkg-config file 30268f4aea71SDaniel P. Berrangé # that reports a wrong -I path, causing the #include to 30278f4aea71SDaniel P. Berrangé # fail later. If the system has such a broken version 30288f4aea71SDaniel P. Berrangé # do not use it. 30298f4aea71SDaniel P. Berrangé if capstone.found() and not cc.compiles('#include <capstone.h>', 30308f4aea71SDaniel P. Berrangé dependencies: [capstone]) 30318f4aea71SDaniel P. Berrangé capstone = not_found 303283602083SThomas Huth if get_option('capstone').enabled() 303383602083SThomas Huth error('capstone requested, but it does not appear to work') 30348f4aea71SDaniel P. Berrangé endif 30358f4aea71SDaniel P. Berrangé endif 30368b18cdbfSRichard Hendersonendif 30374d34a86bSPaolo Bonzini 303855116968SJagannathan Ramanlibvfio_user_dep = not_found 303955116968SJagannathan Ramanif have_system and vfio_user_server_allowed 30402019cabfSPaolo Bonzini libvfio_user_proj = subproject('libvfio-user', required: true) 30415328353cSPaolo Bonzini libvfio_user_dep = libvfio_user_proj.get_variable('libvfio_user_dep') 304255116968SJagannathan Ramanendif 304355116968SJagannathan Raman 3044fbb4121dSPaolo Bonzinifdt = not_found 3045c593d841SPhilippe Mathieu-Daudéfdt_opt = get_option('fdt') 3046577bdbcfSPaolo Bonziniif fdt_required.length() > 0 or fdt_opt == 'enabled' 3047577bdbcfSPaolo Bonzini if fdt_opt == 'disabled' 3048577bdbcfSPaolo Bonzini error('fdt disabled but required by targets ' + ', '.join(fdt_required)) 3049577bdbcfSPaolo Bonzini endif 3050577bdbcfSPaolo Bonzini 3051fbb4121dSPaolo Bonzini if fdt_opt in ['enabled', 'auto', 'system'] 3052577bdbcfSPaolo Bonzini fdt = cc.find_library('fdt', required: fdt_opt == 'system') 3053fbb4121dSPaolo Bonzini if fdt.found() and cc.links(''' 3054fbb4121dSPaolo Bonzini #include <libfdt.h> 3055fbb4121dSPaolo Bonzini #include <libfdt_env.h> 3056de47b0ffSThomas Huth int main(void) { fdt_find_max_phandle(NULL, NULL); return 0; }''', 3057fbb4121dSPaolo Bonzini dependencies: fdt) 3058fbb4121dSPaolo Bonzini fdt_opt = 'system' 30596c22853cSThomas Huth elif fdt_opt == 'system' 30606c22853cSThomas Huth error('system libfdt requested, but it is too old (1.5.1 or newer required)') 3061fbb4121dSPaolo Bonzini else 3062577bdbcfSPaolo Bonzini fdt_opt = 'internal' 306387daf898SThomas Huth fdt = not_found 3064fbb4121dSPaolo Bonzini endif 3065fbb4121dSPaolo Bonzini endif 3066577bdbcfSPaolo Bonzini if not fdt.found() 3067577bdbcfSPaolo Bonzini assert(fdt_opt == 'internal') 306858e48b2eSPaolo Bonzini libfdt_proj = subproject('dtc', required: true, 306958e48b2eSPaolo Bonzini default_options: ['tools=false', 'yaml=disabled', 307058e48b2eSPaolo Bonzini 'python=disabled', 'default_library=static']) 307158e48b2eSPaolo Bonzini fdt = libfdt_proj.get_variable('libfdt_dep') 3072fbb4121dSPaolo Bonzini endif 3073c593d841SPhilippe Mathieu-Daudéelse 3074c593d841SPhilippe Mathieu-Daudé fdt_opt = 'disabled' 3075fbb4121dSPaolo Bonziniendif 3076fbb4121dSPaolo Bonzini 30778b18cdbfSRichard Hendersonconfig_host_data.set('CONFIG_CAPSTONE', capstone.found()) 3078fbb4121dSPaolo Bonziniconfig_host_data.set('CONFIG_FDT', fdt.found()) 30794d34a86bSPaolo Bonziniconfig_host_data.set('CONFIG_SLIRP', slirp.found()) 30808b18cdbfSRichard Henderson 3081a0c9162cSPaolo Bonzini##################### 3082a0c9162cSPaolo Bonzini# Generated sources # 3083a0c9162cSPaolo Bonzini##################### 30848b18cdbfSRichard Henderson 3085a0c9162cSPaolo Bonzinigenh += configure_file(output: 'config-host.h', configuration: config_host_data) 3086a81df1b6SPaolo Bonzini 30873f885659SMarc-André Lureauhxtool = find_program('scripts/hxtool') 3088e2c4012bSMarc-André Lureaushaderinclude = find_program('scripts/shaderinclude.py') 3089a81df1b6SPaolo Bonziniqapi_gen = find_program('scripts/qapi-gen.py') 3090654d6b04SPaolo Bonziniqapi_gen_depends = [ meson.current_source_dir() / 'scripts/qapi/__init__.py', 3091654d6b04SPaolo Bonzini meson.current_source_dir() / 'scripts/qapi/commands.py', 3092654d6b04SPaolo Bonzini meson.current_source_dir() / 'scripts/qapi/common.py', 3093654d6b04SPaolo Bonzini meson.current_source_dir() / 'scripts/qapi/error.py', 3094654d6b04SPaolo Bonzini meson.current_source_dir() / 'scripts/qapi/events.py', 3095654d6b04SPaolo Bonzini meson.current_source_dir() / 'scripts/qapi/expr.py', 3096654d6b04SPaolo Bonzini meson.current_source_dir() / 'scripts/qapi/gen.py', 3097654d6b04SPaolo Bonzini meson.current_source_dir() / 'scripts/qapi/introspect.py', 309888d357d2SMarkus Armbruster meson.current_source_dir() / 'scripts/qapi/main.py', 3099654d6b04SPaolo Bonzini meson.current_source_dir() / 'scripts/qapi/parser.py', 3100654d6b04SPaolo Bonzini meson.current_source_dir() / 'scripts/qapi/schema.py', 3101654d6b04SPaolo Bonzini meson.current_source_dir() / 'scripts/qapi/source.py', 3102654d6b04SPaolo Bonzini meson.current_source_dir() / 'scripts/qapi/types.py', 3103654d6b04SPaolo Bonzini meson.current_source_dir() / 'scripts/qapi/visit.py', 3104654d6b04SPaolo Bonzini meson.current_source_dir() / 'scripts/qapi-gen.py' 3105a81df1b6SPaolo Bonzini] 3106a81df1b6SPaolo Bonzini 3107a81df1b6SPaolo Bonzinitracetool = [ 3108a81df1b6SPaolo Bonzini python, files('scripts/tracetool.py'), 31099c29b741SPaolo Bonzini '--backend=' + ','.join(get_option('trace_backends')) 3110a81df1b6SPaolo Bonzini] 31110572d6cdSStefan Hajnoczitracetool_depends = files( 31120572d6cdSStefan Hajnoczi 'scripts/tracetool/backend/log.py', 31130572d6cdSStefan Hajnoczi 'scripts/tracetool/backend/__init__.py', 31140572d6cdSStefan Hajnoczi 'scripts/tracetool/backend/dtrace.py', 31150572d6cdSStefan Hajnoczi 'scripts/tracetool/backend/ftrace.py', 31160572d6cdSStefan Hajnoczi 'scripts/tracetool/backend/simple.py', 31170572d6cdSStefan Hajnoczi 'scripts/tracetool/backend/syslog.py', 31180572d6cdSStefan Hajnoczi 'scripts/tracetool/backend/ust.py', 31190572d6cdSStefan Hajnoczi 'scripts/tracetool/format/ust_events_c.py', 31200572d6cdSStefan Hajnoczi 'scripts/tracetool/format/ust_events_h.py', 31210572d6cdSStefan Hajnoczi 'scripts/tracetool/format/__init__.py', 31220572d6cdSStefan Hajnoczi 'scripts/tracetool/format/d.py', 31230572d6cdSStefan Hajnoczi 'scripts/tracetool/format/simpletrace_stap.py', 31240572d6cdSStefan Hajnoczi 'scripts/tracetool/format/c.py', 31250572d6cdSStefan Hajnoczi 'scripts/tracetool/format/h.py', 31260572d6cdSStefan Hajnoczi 'scripts/tracetool/format/log_stap.py', 31270572d6cdSStefan Hajnoczi 'scripts/tracetool/format/stap.py', 31280572d6cdSStefan Hajnoczi 'scripts/tracetool/__init__.py', 31290572d6cdSStefan Hajnoczi 'scripts/tracetool/vcpu.py' 31300572d6cdSStefan Hajnoczi) 3131a81df1b6SPaolo Bonzini 31322c273f32SMarc-André Lureauqemu_version_cmd = [find_program('scripts/qemu-version.sh'), 31332c273f32SMarc-André Lureau meson.current_source_dir(), 3134b0b4323eSPaolo Bonzini get_option('pkgversion'), meson.project_version()] 31352c273f32SMarc-André Lureauqemu_version = custom_target('qemu-version.h', 31362c273f32SMarc-André Lureau output: 'qemu-version.h', 31372c273f32SMarc-André Lureau command: qemu_version_cmd, 31382c273f32SMarc-André Lureau capture: true, 31392c273f32SMarc-André Lureau build_by_default: true, 31402c273f32SMarc-André Lureau build_always_stale: true) 31412c273f32SMarc-André Lureaugenh += qemu_version 31422c273f32SMarc-André Lureau 31433f885659SMarc-André Lureauhxdep = [] 31443f885659SMarc-André Lureauhx_headers = [ 31453f885659SMarc-André Lureau ['qemu-options.hx', 'qemu-options.def'], 31463f885659SMarc-André Lureau ['qemu-img-cmds.hx', 'qemu-img-cmds.h'], 31473f885659SMarc-André Lureau] 31483f885659SMarc-André Lureauif have_system 31493f885659SMarc-André Lureau hx_headers += [ 31503f885659SMarc-André Lureau ['hmp-commands.hx', 'hmp-commands.h'], 31513f885659SMarc-André Lureau ['hmp-commands-info.hx', 'hmp-commands-info.h'], 31523f885659SMarc-André Lureau ] 31533f885659SMarc-André Lureauendif 31543f885659SMarc-André Lureauforeach d : hx_headers 3155b7c70bf2SMarc-André Lureau hxdep += custom_target(d[1], 31563f885659SMarc-André Lureau input: files(d[0]), 31573f885659SMarc-André Lureau output: d[1], 31583f885659SMarc-André Lureau capture: true, 31593f885659SMarc-André Lureau build_by_default: true, # to be removed when added to a target 31603f885659SMarc-André Lureau command: [hxtool, '-h', '@INPUT0@']) 31613f885659SMarc-André Lureauendforeach 31623f885659SMarc-André Lureaugenh += hxdep 31633f885659SMarc-André Lureau 3164a0c9162cSPaolo Bonzini################### 3165a0c9162cSPaolo Bonzini# Collect sources # 3166a0c9162cSPaolo Bonzini################### 3167a81df1b6SPaolo Bonzini 316855567891SPhilippe Mathieu-Daudéauthz_ss = ss.source_set() 31697e2b888fSPhilippe Mathieu-Daudéblockdev_ss = ss.source_set() 31707e2b888fSPhilippe Mathieu-Daudéblock_ss = ss.source_set() 3171c2306d71SPhilippe Mathieu-Daudéchardev_ss = ss.source_set() 31727e2b888fSPhilippe Mathieu-Daudécommon_ss = ss.source_set() 31732389304aSPhilippe Mathieu-Daudécrypto_ss = ss.source_set() 3174f73fb063SPhilippe Mathieu-Daudéhwcore_ss = ss.source_set() 3175f78536b1SPhilippe Mathieu-Daudéio_ss = ss.source_set() 31767e2b888fSPhilippe Mathieu-Daudéqmp_ss = ss.source_set() 3177da33fc09SPhilippe Mathieu-Daudéqom_ss = ss.source_set() 3178de6cd759SPhilippe Mathieu-Daudésystem_ss = ss.source_set() 31797e2b888fSPhilippe Mathieu-Daudéspecific_fuzz_ss = ss.source_set() 31807e2b888fSPhilippe Mathieu-Daudéspecific_ss = ss.source_set() 3181a81df1b6SPaolo Bonzinistub_ss = ss.source_set() 3182a81df1b6SPaolo Bonzinitrace_ss = ss.source_set() 31832becc36aSPaolo Bonziniuser_ss = ss.source_set() 31847e2b888fSPhilippe Mathieu-Daudéutil_ss = ss.source_set() 31852becc36aSPaolo Bonzini 3186c94a7b88SGerd Hoffmann# accel modules 3187c94a7b88SGerd Hoffmannqtest_module_ss = ss.source_set() 3188dae0ec15SGerd Hoffmanntcg_module_ss = ss.source_set() 3189c94a7b88SGerd Hoffmann 31903154fee4SMarc-André Lureaumodules = {} 3191db2e89dfSGerd Hoffmanntarget_modules = {} 31922becc36aSPaolo Bonzinihw_arch = {} 31932becc36aSPaolo Bonzinitarget_arch = {} 31942becc36aSPaolo Bonzinitarget_softmmu_arch = {} 319546369b50SPhilippe Mathieu-Daudétarget_user_arch = {} 3196a81df1b6SPaolo Bonzini 3197a81df1b6SPaolo Bonzini############### 3198a81df1b6SPaolo Bonzini# Trace files # 3199a81df1b6SPaolo Bonzini############### 3200a81df1b6SPaolo Bonzini 3201c9322ab5SMarc-André Lureau# TODO: add each directory to the subdirs from its own meson.build, once 3202c9322ab5SMarc-André Lureau# we have those 3203a81df1b6SPaolo Bonzinitrace_events_subdirs = [ 3204a81df1b6SPaolo Bonzini 'crypto', 320569ff4d0aSPhilippe Mathieu-Daudé 'qapi', 320669ff4d0aSPhilippe Mathieu-Daudé 'qom', 3207a81df1b6SPaolo Bonzini 'monitor', 320869ff4d0aSPhilippe Mathieu-Daudé 'util', 3209842b42dfSAlex Bennée 'gdbstub', 3210a81df1b6SPaolo Bonzini] 32116ddc1abeSWarner Loshif have_linux_user 3212a81df1b6SPaolo Bonzini trace_events_subdirs += [ 'linux-user' ] 3213a81df1b6SPaolo Bonziniendif 32146ddc1abeSWarner Loshif have_bsd_user 32156ddc1abeSWarner Losh trace_events_subdirs += [ 'bsd-user' ] 32166ddc1abeSWarner Loshendif 3217a81df1b6SPaolo Bonziniif have_block 3218a81df1b6SPaolo Bonzini trace_events_subdirs += [ 3219a81df1b6SPaolo Bonzini 'authz', 3220a81df1b6SPaolo Bonzini 'block', 3221a81df1b6SPaolo Bonzini 'io', 3222a81df1b6SPaolo Bonzini 'nbd', 3223a81df1b6SPaolo Bonzini 'scsi', 3224a81df1b6SPaolo Bonzini ] 3225a81df1b6SPaolo Bonziniendif 3226a81df1b6SPaolo Bonziniif have_system 3227a81df1b6SPaolo Bonzini trace_events_subdirs += [ 32288985db26SPhilippe Mathieu-Daudé 'accel/kvm', 3229a81df1b6SPaolo Bonzini 'audio', 3230a81df1b6SPaolo Bonzini 'backends', 3231a81df1b6SPaolo Bonzini 'backends/tpm', 3232a81df1b6SPaolo Bonzini 'chardev', 323346627f41SAndrew Melnychenko 'ebpf', 3234a81df1b6SPaolo Bonzini 'hw/9pfs', 3235a81df1b6SPaolo Bonzini 'hw/acpi', 323677c05b0bSHao Wu 'hw/adc', 3237a81df1b6SPaolo Bonzini 'hw/alpha', 3238a81df1b6SPaolo Bonzini 'hw/arm', 3239a81df1b6SPaolo Bonzini 'hw/audio', 3240a81df1b6SPaolo Bonzini 'hw/block', 3241a81df1b6SPaolo Bonzini 'hw/block/dataplane', 3242a81df1b6SPaolo Bonzini 'hw/char', 3243a81df1b6SPaolo Bonzini 'hw/display', 3244a81df1b6SPaolo Bonzini 'hw/dma', 3245a81df1b6SPaolo Bonzini 'hw/hyperv', 3246a81df1b6SPaolo Bonzini 'hw/i2c', 3247a81df1b6SPaolo Bonzini 'hw/i386', 3248a81df1b6SPaolo Bonzini 'hw/i386/xen', 3249aa98ee38SDavid Woodhouse 'hw/i386/kvm', 3250a81df1b6SPaolo Bonzini 'hw/ide', 3251a81df1b6SPaolo Bonzini 'hw/input', 3252a81df1b6SPaolo Bonzini 'hw/intc', 3253a81df1b6SPaolo Bonzini 'hw/isa', 3254a81df1b6SPaolo Bonzini 'hw/mem', 3255a81df1b6SPaolo Bonzini 'hw/mips', 3256a81df1b6SPaolo Bonzini 'hw/misc', 3257a81df1b6SPaolo Bonzini 'hw/misc/macio', 3258a81df1b6SPaolo Bonzini 'hw/net', 325998e5d7a2SVikram Garhwal 'hw/net/can', 3260ce0e6a2cSMark Cave-Ayland 'hw/nubus', 326188eea45cSKlaus Jensen 'hw/nvme', 3262a81df1b6SPaolo Bonzini 'hw/nvram', 3263a81df1b6SPaolo Bonzini 'hw/pci', 3264a81df1b6SPaolo Bonzini 'hw/pci-host', 3265a81df1b6SPaolo Bonzini 'hw/ppc', 3266a81df1b6SPaolo Bonzini 'hw/rdma', 3267a81df1b6SPaolo Bonzini 'hw/rdma/vmw', 3268a81df1b6SPaolo Bonzini 'hw/rtc', 3269a81df1b6SPaolo Bonzini 'hw/s390x', 3270a81df1b6SPaolo Bonzini 'hw/scsi', 3271a81df1b6SPaolo Bonzini 'hw/sd', 3272ad52cfc1SBALATON Zoltan 'hw/sh4', 3273a81df1b6SPaolo Bonzini 'hw/sparc', 3274a81df1b6SPaolo Bonzini 'hw/sparc64', 3275a81df1b6SPaolo Bonzini 'hw/ssi', 3276a81df1b6SPaolo Bonzini 'hw/timer', 3277a81df1b6SPaolo Bonzini 'hw/tpm', 3278a81df1b6SPaolo Bonzini 'hw/usb', 3279a81df1b6SPaolo Bonzini 'hw/vfio', 3280a81df1b6SPaolo Bonzini 'hw/virtio', 3281a81df1b6SPaolo Bonzini 'hw/watchdog', 3282a81df1b6SPaolo Bonzini 'hw/xen', 3283a81df1b6SPaolo Bonzini 'hw/gpio', 3284a81df1b6SPaolo Bonzini 'migration', 3285a81df1b6SPaolo Bonzini 'net', 32868b7a5507SPhilippe Mathieu-Daudé 'softmmu', 3287a81df1b6SPaolo Bonzini 'ui', 3288ad22c308SElena Ufimtseva 'hw/remote', 3289a81df1b6SPaolo Bonzini ] 3290a81df1b6SPaolo Bonziniendif 32918985db26SPhilippe Mathieu-Daudéif have_system or have_user 32928985db26SPhilippe Mathieu-Daudé trace_events_subdirs += [ 32938985db26SPhilippe Mathieu-Daudé 'accel/tcg', 32948985db26SPhilippe Mathieu-Daudé 'hw/core', 32958985db26SPhilippe Mathieu-Daudé 'target/arm', 3296a1477da3SAlexander Graf 'target/arm/hvf', 32978985db26SPhilippe Mathieu-Daudé 'target/hppa', 32988985db26SPhilippe Mathieu-Daudé 'target/i386', 32998985db26SPhilippe Mathieu-Daudé 'target/i386/kvm', 330034b8ff25SPhilippe Mathieu-Daudé 'target/mips/tcg', 33016f83e277SRichard Henderson 'target/nios2', 33028985db26SPhilippe Mathieu-Daudé 'target/ppc', 33038985db26SPhilippe Mathieu-Daudé 'target/riscv', 33048985db26SPhilippe Mathieu-Daudé 'target/s390x', 330567043607SCho, Yu-Chen 'target/s390x/kvm', 33068985db26SPhilippe Mathieu-Daudé 'target/sparc', 33078985db26SPhilippe Mathieu-Daudé ] 33088985db26SPhilippe Mathieu-Daudéendif 3309a81df1b6SPaolo Bonzini 33100df750e9SMarc-André Lureauvhost_user = not_found 33112a3129a3SPaolo Bonziniif targetos == 'linux' and have_vhost_user 33120df750e9SMarc-André Lureau libvhost_user = subproject('libvhost-user') 33130df750e9SMarc-André Lureau vhost_user = libvhost_user.get_variable('vhost_user_dep') 33140df750e9SMarc-André Lureauendif 33150df750e9SMarc-André Lureau 3316a6caeee8SXie Yongjilibvduse = not_found 3317a6caeee8SXie Yongjiif have_libvduse 3318a6caeee8SXie Yongji libvduse_proj = subproject('libvduse') 3319a6caeee8SXie Yongji libvduse = libvduse_proj.get_variable('libvduse_dep') 3320a6caeee8SXie Yongjiendif 3321a6caeee8SXie Yongji 3322b83a80e8SVladimir Sementsov-Ogievskiy# NOTE: the trace/ subdirectory needs the qapi_trace_events variable 3323b83a80e8SVladimir Sementsov-Ogievskiy# that is filled in by qapi/. 3324a81df1b6SPaolo Bonzinisubdir('qapi') 3325a81df1b6SPaolo Bonzinisubdir('qobject') 3326a81df1b6SPaolo Bonzinisubdir('stubs') 3327a81df1b6SPaolo Bonzinisubdir('trace') 3328a81df1b6SPaolo Bonzinisubdir('util') 33295582c58fSMarc-André Lureausubdir('qom') 33305582c58fSMarc-André Lureausubdir('authz') 3331a81df1b6SPaolo Bonzinisubdir('crypto') 33322d78b56eSMarc-André Lureausubdir('ui') 33337d5983e3SNicolas Saenz Juliennesubdir('hw') 3334842b42dfSAlex Bennéesubdir('gdbstub') 3335a81df1b6SPaolo Bonzini 33363154fee4SMarc-André Lureauif enable_modules 33373154fee4SMarc-André Lureau libmodulecommon = static_library('module-common', files('module-common.c') + genh, pic: true, c_args: '-DBUILD_DSO') 33383154fee4SMarc-André Lureau modulecommon = declare_dependency(link_whole: libmodulecommon, compile_args: '-DBUILD_DSO') 33393154fee4SMarc-André Lureauendif 33403154fee4SMarc-André Lureau 33417d5983e3SNicolas Saenz Julienneqom_ss = qom_ss.apply(config_host, strict: false) 33427d5983e3SNicolas Saenz Juliennelibqom = static_library('qom', qom_ss.sources() + genh, 33437d5983e3SNicolas Saenz Julienne dependencies: [qom_ss.dependencies()], 33447d5983e3SNicolas Saenz Julienne name_suffix: 'fa') 33457d5983e3SNicolas Saenz Julienneqom = declare_dependency(link_whole: libqom) 33467d5983e3SNicolas Saenz Julienne 33477d5983e3SNicolas Saenz Julienneevent_loop_base = files('event-loop-base.c') 33487d5983e3SNicolas Saenz Julienneevent_loop_base = static_library('event-loop-base', sources: event_loop_base + genh, 33497d5983e3SNicolas Saenz Julienne build_by_default: true) 33507d5983e3SNicolas Saenz Julienneevent_loop_base = declare_dependency(link_whole: event_loop_base, 33517d5983e3SNicolas Saenz Julienne dependencies: [qom]) 33527d5983e3SNicolas Saenz Julienne 33532becc36aSPaolo Bonzinistub_ss = stub_ss.apply(config_all, strict: false) 3354a81df1b6SPaolo Bonzini 3355a81df1b6SPaolo Bonziniutil_ss.add_all(trace_ss) 33562becc36aSPaolo Bonziniutil_ss = util_ss.apply(config_all, strict: false) 3357a81df1b6SPaolo Bonzinilibqemuutil = static_library('qemuutil', 3358a81df1b6SPaolo Bonzini sources: util_ss.sources() + stub_ss.sources() + genh, 33596d7c7c2dSPaolo Bonzini dependencies: [util_ss.dependencies(), libm, threads, glib, socket, malloc, pixman]) 3360a81df1b6SPaolo Bonziniqemuutil = declare_dependency(link_with: libqemuutil, 336170ac26b9SNicolas Saenz Julienne sources: genh + version_res, 336270ac26b9SNicolas Saenz Julienne dependencies: [event_loop_base]) 3363a81df1b6SPaolo Bonzini 3364957b31f6SPhilippe Mathieu-Daudéif have_system or have_user 3365abff1abfSPaolo Bonzini decodetree = generator(find_program('scripts/decodetree.py'), 3366abff1abfSPaolo Bonzini output: 'decode-@BASENAME@.c.inc', 3367abff1abfSPaolo Bonzini arguments: ['@INPUT@', '@EXTRA_ARGS@', '-o', '@OUTPUT@']) 3368957b31f6SPhilippe Mathieu-Daudé subdir('libdecnumber') 3369957b31f6SPhilippe Mathieu-Daudé subdir('target') 3370957b31f6SPhilippe Mathieu-Daudéendif 3371abff1abfSPaolo Bonzini 3372478e943fSPaolo Bonzinisubdir('audio') 33737fcfd456SMarc-André Lureausubdir('io') 3374848e8ff6SMarc-André Lureausubdir('chardev') 3375ec0d5893SMarc-André Lureausubdir('fsdev') 3376708eab42SMarc-André Lureausubdir('dump') 3377ec0d5893SMarc-André Lureau 3378f285bd3fSPhilippe Mathieu-Daudéif have_block 33795e5733e5SMarc-André Lureau block_ss.add(files( 33805e5733e5SMarc-André Lureau 'block.c', 33815e5733e5SMarc-André Lureau 'blockjob.c', 33825e5733e5SMarc-André Lureau 'job.c', 33835e5733e5SMarc-André Lureau 'qemu-io-cmds.c', 33845e5733e5SMarc-André Lureau )) 3385406523f6SPaolo Bonzini if config_host_data.get('CONFIG_REPLICATION') 3386406523f6SPaolo Bonzini block_ss.add(files('replication.c')) 3387406523f6SPaolo Bonzini endif 33885e5733e5SMarc-André Lureau 33895e5733e5SMarc-André Lureau subdir('nbd') 33905e5733e5SMarc-André Lureau subdir('scsi') 33915e5733e5SMarc-André Lureau subdir('block') 33925e5733e5SMarc-André Lureau 33934a96337dSPaolo Bonzini blockdev_ss.add(files( 33944a96337dSPaolo Bonzini 'blockdev.c', 3395cbc20bfbSStefan Hajnoczi 'blockdev-nbd.c', 33964a96337dSPaolo Bonzini 'iothread.c', 33974a96337dSPaolo Bonzini 'job-qmp.c', 33983eacf70bSRoman Bolshakov ), gnutls) 33994a96337dSPaolo Bonzini 34004a96337dSPaolo Bonzini # os-posix.c contains POSIX-specific functions used by qemu-storage-daemon, 34014a96337dSPaolo Bonzini # os-win32.c does not 34024a96337dSPaolo Bonzini blockdev_ss.add(when: 'CONFIG_POSIX', if_true: files('os-posix.c')) 3403de6cd759SPhilippe Mathieu-Daudé system_ss.add(when: 'CONFIG_WIN32', if_true: [files('os-win32.c')]) 3404f285bd3fSPhilippe Mathieu-Daudéendif 34054a96337dSPaolo Bonzini 34064a96337dSPaolo Bonzinicommon_ss.add(files('cpus-common.c')) 340731ffa2aaSPhilippe Mathieu-Daudéspecific_ss.add(files('cpu.c')) 34084a96337dSPaolo Bonzini 34095d3ea0e1SPaolo Bonzinisubdir('softmmu') 3410c9322ab5SMarc-André Lureau 341144b99a6dSRichard Henderson# Work around a gcc bug/misfeature wherein constant propagation looks 341244b99a6dSRichard Henderson# through an alias: 341344b99a6dSRichard Henderson# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99696 341444b99a6dSRichard Henderson# to guess that a const variable is always zero. Without lto, this is 341544b99a6dSRichard Henderson# impossible, as the alias is restricted to page-vary-common.c. Indeed, 341644b99a6dSRichard Henderson# without lto, not even the alias is required -- we simply use different 341744b99a6dSRichard Henderson# declarations in different compilation units. 341844b99a6dSRichard Hendersonpagevary = files('page-vary-common.c') 341944b99a6dSRichard Hendersonif get_option('b_lto') 342044b99a6dSRichard Henderson pagevary_flags = ['-fno-lto'] 342144b99a6dSRichard Henderson if get_option('cfi') 342244b99a6dSRichard Henderson pagevary_flags += '-fno-sanitize=cfi-icall' 342344b99a6dSRichard Henderson endif 342454c9b194SThomas Huth pagevary = static_library('page-vary-common', sources: pagevary + genh, 342544b99a6dSRichard Henderson c_args: pagevary_flags) 342644b99a6dSRichard Henderson pagevary = declare_dependency(link_with: pagevary) 342744b99a6dSRichard Hendersonendif 342844b99a6dSRichard Hendersoncommon_ss.add(pagevary) 34296670d4d0SRichard Hendersonspecific_ss.add(files('page-vary.c')) 34306670d4d0SRichard Henderson 3431ab318051SMarc-André Lureausubdir('backends') 3432c574e161SMarc-André Lureausubdir('disas') 343355166230SMarc-André Lureausubdir('migration') 3434ff219dcaSPaolo Bonzinisubdir('monitor') 3435cdaf0722SMarc-André Lureausubdir('net') 343617ef2af6SMarc-André Lureausubdir('replay') 34378df9f0c3SPhilippe Mathieu-Daudésubdir('semihosting') 3438aa09b3d5SMarkus Armbrustersubdir('stats') 3439104cc2c0SRichard Hendersonsubdir('tcg') 3440c6347541SRichard Hendersonsubdir('fpu') 34411a82878aSMarc-André Lureausubdir('accel') 3442f556b4a1SPaolo Bonzinisubdir('plugins') 3443bbf15aafSRichard Hendersonsubdir('ebpf') 3444bbf15aafSRichard Henderson 3445bbf15aafSRichard Hendersoncommon_user_inc = [] 3446bbf15aafSRichard Henderson 3447bbf15aafSRichard Hendersonsubdir('common-user') 3448b309c321SMarc-André Lureausubdir('bsd-user') 34493a30446aSMarc-André Lureausubdir('linux-user') 345046627f41SAndrew Melnychenko 3451a2ce7dbdSPaolo Bonzini# needed for fuzzing binaries 3452a2ce7dbdSPaolo Bonzinisubdir('tests/qtest/libqos') 345364ed6f92SPaolo Bonzinisubdir('tests/qtest/fuzz') 3454a2ce7dbdSPaolo Bonzini 3455c94a7b88SGerd Hoffmann# accel modules 3456dae0ec15SGerd Hoffmanntcg_real_module_ss = ss.source_set() 3457dae0ec15SGerd Hoffmanntcg_real_module_ss.add_all(when: 'CONFIG_TCG_MODULAR', if_true: tcg_module_ss) 3458dae0ec15SGerd Hoffmannspecific_ss.add_all(when: 'CONFIG_TCG_BUILTIN', if_true: tcg_module_ss) 3459dae0ec15SGerd Hoffmanntarget_modules += { 'accel' : { 'qtest': qtest_module_ss, 3460dae0ec15SGerd Hoffmann 'tcg': tcg_real_module_ss }} 3461c94a7b88SGerd Hoffmann 3462a0c9162cSPaolo Bonzini######################## 3463a0c9162cSPaolo Bonzini# Library dependencies # 3464a0c9162cSPaolo Bonzini######################## 3465a0c9162cSPaolo Bonzini 3466f5723ab6SGerd Hoffmannmodinfo_collect = find_program('scripts/modinfo-collect.py') 34675ebbfeccSGerd Hoffmannmodinfo_generate = find_program('scripts/modinfo-generate.py') 3468f5723ab6SGerd Hoffmannmodinfo_files = [] 3469f5723ab6SGerd Hoffmann 34703154fee4SMarc-André Lureaublock_mods = [] 34713154fee4SMarc-André Lureausoftmmu_mods = [] 34723154fee4SMarc-André Lureauforeach d, list : modules 3473ef709860SPaolo Bonzini if not (d == 'block' ? have_block : have_system) 3474ef709860SPaolo Bonzini continue 3475ef709860SPaolo Bonzini endif 3476ef709860SPaolo Bonzini 34773154fee4SMarc-André Lureau foreach m, module_ss : list 34786002711cSPaolo Bonzini if enable_modules 34793e292c51SGerd Hoffmann module_ss = module_ss.apply(config_all, strict: false) 34803154fee4SMarc-André Lureau sl = static_library(d + '-' + m, [genh, module_ss.sources()], 34813154fee4SMarc-André Lureau dependencies: [modulecommon, module_ss.dependencies()], pic: true) 34823154fee4SMarc-André Lureau if d == 'block' 34833154fee4SMarc-André Lureau block_mods += sl 34843154fee4SMarc-André Lureau else 34853154fee4SMarc-André Lureau softmmu_mods += sl 34863154fee4SMarc-André Lureau endif 3487f5723ab6SGerd Hoffmann if module_ss.sources() != [] 3488f5723ab6SGerd Hoffmann # FIXME: Should use sl.extract_all_objects(recursive: true) as 3489f5723ab6SGerd Hoffmann # input. Sources can be used multiple times but objects are 3490f5723ab6SGerd Hoffmann # unique when it comes to lookup in compile_commands.json. 3491f5723ab6SGerd Hoffmann # Depnds on a mesion version with 3492f5723ab6SGerd Hoffmann # https://github.com/mesonbuild/meson/pull/8900 3493f5723ab6SGerd Hoffmann modinfo_files += custom_target(d + '-' + m + '.modinfo', 3494f5723ab6SGerd Hoffmann output: d + '-' + m + '.modinfo', 3495ac347111SPaolo Bonzini input: module_ss.sources() + genh, 3496f5723ab6SGerd Hoffmann capture: true, 3497ac347111SPaolo Bonzini command: [modinfo_collect, module_ss.sources()]) 3498f5723ab6SGerd Hoffmann endif 34993154fee4SMarc-André Lureau else 35003154fee4SMarc-André Lureau if d == 'block' 35013154fee4SMarc-André Lureau block_ss.add_all(module_ss) 35023154fee4SMarc-André Lureau else 3503de6cd759SPhilippe Mathieu-Daudé system_ss.add_all(module_ss) 35043154fee4SMarc-André Lureau endif 35053154fee4SMarc-André Lureau endif 35063154fee4SMarc-André Lureau endforeach 35073154fee4SMarc-André Lureauendforeach 35083154fee4SMarc-André Lureau 3509db2e89dfSGerd Hoffmannforeach d, list : target_modules 3510db2e89dfSGerd Hoffmann foreach m, module_ss : list 35116002711cSPaolo Bonzini if enable_modules 3512db2e89dfSGerd Hoffmann foreach target : target_dirs 3513db2e89dfSGerd Hoffmann if target.endswith('-softmmu') 3514db2e89dfSGerd Hoffmann config_target = config_target_mak[target] 3515db2e89dfSGerd Hoffmann config_target += config_host 3516db2e89dfSGerd Hoffmann target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])] 3517db2e89dfSGerd Hoffmann c_args = ['-DNEED_CPU_H', 3518db2e89dfSGerd Hoffmann '-DCONFIG_TARGET="@0@-config-target.h"'.format(target), 3519db2e89dfSGerd Hoffmann '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)] 3520db2e89dfSGerd Hoffmann target_module_ss = module_ss.apply(config_target, strict: false) 3521db2e89dfSGerd Hoffmann if target_module_ss.sources() != [] 3522db2e89dfSGerd Hoffmann module_name = d + '-' + m + '-' + config_target['TARGET_NAME'] 3523db2e89dfSGerd Hoffmann sl = static_library(module_name, 3524db2e89dfSGerd Hoffmann [genh, target_module_ss.sources()], 3525db2e89dfSGerd Hoffmann dependencies: [modulecommon, target_module_ss.dependencies()], 3526db2e89dfSGerd Hoffmann include_directories: target_inc, 3527db2e89dfSGerd Hoffmann c_args: c_args, 3528db2e89dfSGerd Hoffmann pic: true) 3529db2e89dfSGerd Hoffmann softmmu_mods += sl 3530db2e89dfSGerd Hoffmann # FIXME: Should use sl.extract_all_objects(recursive: true) too. 3531db2e89dfSGerd Hoffmann modinfo_files += custom_target(module_name + '.modinfo', 3532db2e89dfSGerd Hoffmann output: module_name + '.modinfo', 3533917ddc27SGerd Hoffmann input: target_module_ss.sources() + genh, 3534db2e89dfSGerd Hoffmann capture: true, 3535917ddc27SGerd Hoffmann command: [modinfo_collect, '--target', target, target_module_ss.sources()]) 3536db2e89dfSGerd Hoffmann endif 3537db2e89dfSGerd Hoffmann endif 3538db2e89dfSGerd Hoffmann endforeach 3539db2e89dfSGerd Hoffmann else 3540db2e89dfSGerd Hoffmann specific_ss.add_all(module_ss) 3541db2e89dfSGerd Hoffmann endif 3542db2e89dfSGerd Hoffmann endforeach 3543db2e89dfSGerd Hoffmannendforeach 3544db2e89dfSGerd Hoffmann 35455ebbfeccSGerd Hoffmannif enable_modules 354605d6814cSJose R. Ziviani foreach target : target_dirs 354705d6814cSJose R. Ziviani if target.endswith('-softmmu') 354805d6814cSJose R. Ziviani config_target = config_target_mak[target] 354905d6814cSJose R. Ziviani config_devices_mak = target + '-config-devices.mak' 355005d6814cSJose R. Ziviani modinfo_src = custom_target('modinfo-' + target + '.c', 355105d6814cSJose R. Ziviani output: 'modinfo-' + target + '.c', 35525ebbfeccSGerd Hoffmann input: modinfo_files, 355305d6814cSJose R. Ziviani command: [modinfo_generate, '--devices', config_devices_mak, '@INPUT@'], 35545ebbfeccSGerd Hoffmann capture: true) 355505d6814cSJose R. Ziviani 355605d6814cSJose R. Ziviani modinfo_lib = static_library('modinfo-' + target + '.c', modinfo_src) 355705d6814cSJose R. Ziviani modinfo_dep = declare_dependency(link_with: modinfo_lib) 355805d6814cSJose R. Ziviani 355905d6814cSJose R. Ziviani arch = config_target['TARGET_NAME'] == 'sparc64' ? 'sparc64' : config_target['TARGET_BASE_ARCH'] 356005d6814cSJose R. Ziviani hw_arch[arch].add(modinfo_dep) 356105d6814cSJose R. Ziviani endif 356205d6814cSJose R. Ziviani endforeach 35635ebbfeccSGerd Hoffmannendif 35645ebbfeccSGerd Hoffmann 35653154fee4SMarc-André Lureaunm = find_program('nm') 3566604f3e4eSYonggang Luoundefsym = find_program('scripts/undefsym.py') 35673154fee4SMarc-André Lureaublock_syms = custom_target('block.syms', output: 'block.syms', 35683154fee4SMarc-André Lureau input: [libqemuutil, block_mods], 35693154fee4SMarc-André Lureau capture: true, 35703154fee4SMarc-André Lureau command: [undefsym, nm, '@INPUT@']) 35713154fee4SMarc-André Lureauqemu_syms = custom_target('qemu.syms', output: 'qemu.syms', 35723154fee4SMarc-André Lureau input: [libqemuutil, softmmu_mods], 35733154fee4SMarc-André Lureau capture: true, 35743154fee4SMarc-André Lureau command: [undefsym, nm, '@INPUT@']) 35753154fee4SMarc-André Lureau 357655567891SPhilippe Mathieu-Daudéauthz_ss = authz_ss.apply(config_host, strict: false) 357755567891SPhilippe Mathieu-Daudélibauthz = static_library('authz', authz_ss.sources() + genh, 357855567891SPhilippe Mathieu-Daudé dependencies: [authz_ss.dependencies()], 357955567891SPhilippe Mathieu-Daudé name_suffix: 'fa', 358055567891SPhilippe Mathieu-Daudé build_by_default: false) 358155567891SPhilippe Mathieu-Daudé 358255567891SPhilippe Mathieu-Daudéauthz = declare_dependency(link_whole: libauthz, 358355567891SPhilippe Mathieu-Daudé dependencies: qom) 358455567891SPhilippe Mathieu-Daudé 35852389304aSPhilippe Mathieu-Daudécrypto_ss = crypto_ss.apply(config_host, strict: false) 35862389304aSPhilippe Mathieu-Daudélibcrypto = static_library('crypto', crypto_ss.sources() + genh, 35872389304aSPhilippe Mathieu-Daudé dependencies: [crypto_ss.dependencies()], 35882389304aSPhilippe Mathieu-Daudé name_suffix: 'fa', 35892389304aSPhilippe Mathieu-Daudé build_by_default: false) 35902389304aSPhilippe Mathieu-Daudé 35912389304aSPhilippe Mathieu-Daudécrypto = declare_dependency(link_whole: libcrypto, 35922389304aSPhilippe Mathieu-Daudé dependencies: [authz, qom]) 35932389304aSPhilippe Mathieu-Daudé 3594f78536b1SPhilippe Mathieu-Daudéio_ss = io_ss.apply(config_host, strict: false) 3595f78536b1SPhilippe Mathieu-Daudélibio = static_library('io', io_ss.sources() + genh, 3596f78536b1SPhilippe Mathieu-Daudé dependencies: [io_ss.dependencies()], 3597f78536b1SPhilippe Mathieu-Daudé link_with: libqemuutil, 3598f78536b1SPhilippe Mathieu-Daudé name_suffix: 'fa', 3599f78536b1SPhilippe Mathieu-Daudé build_by_default: false) 3600f78536b1SPhilippe Mathieu-Daudé 3601f78536b1SPhilippe Mathieu-Daudéio = declare_dependency(link_whole: libio, dependencies: [crypto, qom]) 3602f78536b1SPhilippe Mathieu-Daudé 36037e6edef3SPhilippe Mathieu-Daudélibmigration = static_library('migration', sources: migration_files + genh, 36047e6edef3SPhilippe Mathieu-Daudé name_suffix: 'fa', 36057e6edef3SPhilippe Mathieu-Daudé build_by_default: false) 36067e6edef3SPhilippe Mathieu-Daudémigration = declare_dependency(link_with: libmigration, 36077e6edef3SPhilippe Mathieu-Daudé dependencies: [zlib, qom, io]) 3608de6cd759SPhilippe Mathieu-Daudésystem_ss.add(migration) 36097e6edef3SPhilippe Mathieu-Daudé 36105e5733e5SMarc-André Lureaublock_ss = block_ss.apply(config_host, strict: false) 36115e5733e5SMarc-André Lureaulibblock = static_library('block', block_ss.sources() + genh, 36125e5733e5SMarc-André Lureau dependencies: block_ss.dependencies(), 36135e5733e5SMarc-André Lureau link_depends: block_syms, 36145e5733e5SMarc-André Lureau name_suffix: 'fa', 36155e5733e5SMarc-André Lureau build_by_default: false) 36165e5733e5SMarc-André Lureau 36175e5733e5SMarc-André Lureaublock = declare_dependency(link_whole: [libblock], 3618b7c70bf2SMarc-André Lureau link_args: '@block.syms', 3619b7c70bf2SMarc-André Lureau dependencies: [crypto, io]) 36205e5733e5SMarc-André Lureau 36214fb9071fSStefan Hajnocziblockdev_ss = blockdev_ss.apply(config_host, strict: false) 36224fb9071fSStefan Hajnoczilibblockdev = static_library('blockdev', blockdev_ss.sources() + genh, 36234fb9071fSStefan Hajnoczi dependencies: blockdev_ss.dependencies(), 36244fb9071fSStefan Hajnoczi name_suffix: 'fa', 36254fb9071fSStefan Hajnoczi build_by_default: false) 36264fb9071fSStefan Hajnoczi 36274fb9071fSStefan Hajnocziblockdev = declare_dependency(link_whole: [libblockdev], 36287d5983e3SNicolas Saenz Julienne dependencies: [block, event_loop_base]) 36294fb9071fSStefan Hajnoczi 3630ff219dcaSPaolo Bonziniqmp_ss = qmp_ss.apply(config_host, strict: false) 3631ff219dcaSPaolo Bonzinilibqmp = static_library('qmp', qmp_ss.sources() + genh, 3632ff219dcaSPaolo Bonzini dependencies: qmp_ss.dependencies(), 3633ff219dcaSPaolo Bonzini name_suffix: 'fa', 3634ff219dcaSPaolo Bonzini build_by_default: false) 3635ff219dcaSPaolo Bonzini 3636ff219dcaSPaolo Bonziniqmp = declare_dependency(link_whole: [libqmp]) 3637ff219dcaSPaolo Bonzini 3638c2306d71SPhilippe Mathieu-Daudélibchardev = static_library('chardev', chardev_ss.sources() + genh, 3639c2306d71SPhilippe Mathieu-Daudé name_suffix: 'fa', 364022d1f7a8SMarc-André Lureau dependencies: chardev_ss.dependencies(), 3641c2306d71SPhilippe Mathieu-Daudé build_by_default: false) 3642c2306d71SPhilippe Mathieu-Daudé 3643c2306d71SPhilippe Mathieu-Daudéchardev = declare_dependency(link_whole: libchardev) 3644c2306d71SPhilippe Mathieu-Daudé 3645f73fb063SPhilippe Mathieu-Daudéhwcore_ss = hwcore_ss.apply(config_host, strict: false) 3646f73fb063SPhilippe Mathieu-Daudélibhwcore = static_library('hwcore', sources: hwcore_ss.sources() + genh, 3647e28ab096SPhilippe Mathieu-Daudé name_suffix: 'fa', 3648e28ab096SPhilippe Mathieu-Daudé build_by_default: false) 3649e28ab096SPhilippe Mathieu-Daudéhwcore = declare_dependency(link_whole: libhwcore) 3650e28ab096SPhilippe Mathieu-Daudécommon_ss.add(hwcore) 3651e28ab096SPhilippe Mathieu-Daudé 3652064f8ee7SPhilippe Mathieu-Daudé########### 3653064f8ee7SPhilippe Mathieu-Daudé# Targets # 3654064f8ee7SPhilippe Mathieu-Daudé########### 3655064f8ee7SPhilippe Mathieu-Daudé 3656fb72176bSPaolo Bonziniemulator_modules = [] 36573154fee4SMarc-André Lureauforeach m : block_mods + softmmu_mods 3658fb72176bSPaolo Bonzini emulator_modules += shared_module(m.name(), 3659fb72176bSPaolo Bonzini build_by_default: true, 36603154fee4SMarc-André Lureau name_prefix: '', 36613154fee4SMarc-André Lureau link_whole: m, 36623154fee4SMarc-André Lureau install: true, 366316bf7a33SPaolo Bonzini install_dir: qemu_moddir) 36643154fee4SMarc-André Lureauendforeach 3665d8f3a609SPaolo Bonziniif emulator_modules.length() > 0 3666d8f3a609SPaolo Bonzini alias_target('modules', emulator_modules) 3667d8f3a609SPaolo Bonziniendif 36683154fee4SMarc-André Lureau 3669de6cd759SPhilippe Mathieu-Daudésystem_ss.add(authz, blockdev, chardev, crypto, io, qmp) 367064ed6f92SPaolo Bonzinicommon_ss.add(qom, qemuutil) 367164ed6f92SPaolo Bonzini 3672de6cd759SPhilippe Mathieu-Daudécommon_ss.add_all(when: 'CONFIG_SYSTEM_ONLY', if_true: [system_ss]) 36732becc36aSPaolo Bonzinicommon_ss.add_all(when: 'CONFIG_USER_ONLY', if_true: user_ss) 36742becc36aSPaolo Bonzini 36752becc36aSPaolo Bonzinicommon_all = common_ss.apply(config_all, strict: false) 36762becc36aSPaolo Bonzinicommon_all = static_library('common', 36772becc36aSPaolo Bonzini build_by_default: false, 36782becc36aSPaolo Bonzini sources: common_all.sources() + genh, 36799d24fb73SPaolo Bonzini include_directories: common_user_inc, 368075eebe0bSKatsuhiro Ueno implicit_include_directories: false, 36812becc36aSPaolo Bonzini dependencies: common_all.dependencies(), 36822becc36aSPaolo Bonzini name_suffix: 'fa') 36832becc36aSPaolo Bonzini 3684c9322ab5SMarc-André Lureaufeature_to_c = find_program('scripts/feature_to_c.sh') 3685c9322ab5SMarc-André Lureau 368630cfa50dSPhilippe Mathieu-Daudéif targetos == 'darwin' 368730cfa50dSPhilippe Mathieu-Daudé entitlement = find_program('scripts/entitlement.sh') 368830cfa50dSPhilippe Mathieu-Daudéendif 368930cfa50dSPhilippe Mathieu-Daudé 3690fd5eef85SPaolo Bonziniemulators = {} 36912becc36aSPaolo Bonziniforeach target : target_dirs 36922becc36aSPaolo Bonzini config_target = config_target_mak[target] 36932becc36aSPaolo Bonzini target_name = config_target['TARGET_NAME'] 3694ffb91f68SPaolo Bonzini target_base_arch = config_target['TARGET_BASE_ARCH'] 3695859aef02SPaolo Bonzini arch_srcs = [config_target_h[target]] 369664ed6f92SPaolo Bonzini arch_deps = [] 369764ed6f92SPaolo Bonzini c_args = ['-DNEED_CPU_H', 369864ed6f92SPaolo Bonzini '-DCONFIG_TARGET="@0@-config-target.h"'.format(target), 369964ed6f92SPaolo Bonzini '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)] 3700b6c7cfd4SPaolo Bonzini link_args = emulator_link_args 37012becc36aSPaolo Bonzini 3702859aef02SPaolo Bonzini config_target += config_host 37032becc36aSPaolo Bonzini target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])] 37042becc36aSPaolo Bonzini if targetos == 'linux' 37052becc36aSPaolo Bonzini target_inc += include_directories('linux-headers', is_system: true) 37062becc36aSPaolo Bonzini endif 37072becc36aSPaolo Bonzini if target.endswith('-softmmu') 37082becc36aSPaolo Bonzini target_type='system' 3709ffb91f68SPaolo Bonzini t = target_softmmu_arch[target_base_arch].apply(config_target, strict: false) 3710abff1abfSPaolo Bonzini arch_srcs += t.sources() 371164ed6f92SPaolo Bonzini arch_deps += t.dependencies() 3712abff1abfSPaolo Bonzini 3713ffb91f68SPaolo Bonzini hw_dir = target_name == 'sparc64' ? 'sparc64' : target_base_arch 37142c44220dSMarc-André Lureau hw = hw_arch[hw_dir].apply(config_target, strict: false) 37152c44220dSMarc-André Lureau arch_srcs += hw.sources() 371664ed6f92SPaolo Bonzini arch_deps += hw.dependencies() 37172c44220dSMarc-André Lureau 37182becc36aSPaolo Bonzini arch_srcs += config_devices_h[target] 371964ed6f92SPaolo Bonzini link_args += ['@block.syms', '@qemu.syms'] 37202becc36aSPaolo Bonzini else 37213a30446aSMarc-André Lureau abi = config_target['TARGET_ABI_DIR'] 37222becc36aSPaolo Bonzini target_type='user' 3723a3a576b0SPaolo Bonzini target_inc += common_user_inc 3724ffb91f68SPaolo Bonzini if target_base_arch in target_user_arch 3725ffb91f68SPaolo Bonzini t = target_user_arch[target_base_arch].apply(config_target, strict: false) 372646369b50SPhilippe Mathieu-Daudé arch_srcs += t.sources() 372746369b50SPhilippe Mathieu-Daudé arch_deps += t.dependencies() 372846369b50SPhilippe Mathieu-Daudé endif 37292becc36aSPaolo Bonzini if 'CONFIG_LINUX_USER' in config_target 37302becc36aSPaolo Bonzini base_dir = 'linux-user' 3731e2a74729SWarner Losh endif 3732e2a74729SWarner Losh if 'CONFIG_BSD_USER' in config_target 37332becc36aSPaolo Bonzini base_dir = 'bsd-user' 3734e2a74729SWarner Losh target_inc += include_directories('bsd-user/' / targetos) 373585fc1b5dSWarner Losh target_inc += include_directories('bsd-user/host/' / host_arch) 3736e2a74729SWarner Losh dir = base_dir / abi 373719bf129fSWarner Losh arch_srcs += files(dir / 'signal.c', dir / 'target_arch_cpu.c') 37382becc36aSPaolo Bonzini endif 37392becc36aSPaolo Bonzini target_inc += include_directories( 37402becc36aSPaolo Bonzini base_dir, 37413a30446aSMarc-André Lureau base_dir / abi, 37422becc36aSPaolo Bonzini ) 37433a30446aSMarc-André Lureau if 'CONFIG_LINUX_USER' in config_target 37443a30446aSMarc-André Lureau dir = base_dir / abi 37453a30446aSMarc-André Lureau arch_srcs += files(dir / 'signal.c', dir / 'cpu_loop.c') 37463a30446aSMarc-André Lureau if config_target.has_key('TARGET_SYSTBL_ABI') 37473a30446aSMarc-André Lureau arch_srcs += \ 37483a30446aSMarc-André Lureau syscall_nr_generators[abi].process(base_dir / abi / config_target['TARGET_SYSTBL'], 37493a30446aSMarc-André Lureau extra_args : config_target['TARGET_SYSTBL_ABI']) 37503a30446aSMarc-André Lureau endif 37513a30446aSMarc-André Lureau endif 37522becc36aSPaolo Bonzini endif 37532becc36aSPaolo Bonzini 3754c9322ab5SMarc-André Lureau if 'TARGET_XML_FILES' in config_target 3755c9322ab5SMarc-André Lureau gdbstub_xml = custom_target(target + '-gdbstub-xml.c', 3756c9322ab5SMarc-André Lureau output: target + '-gdbstub-xml.c', 3757c9322ab5SMarc-André Lureau input: files(config_target['TARGET_XML_FILES'].split()), 3758c9322ab5SMarc-André Lureau command: [feature_to_c, '@INPUT@'], 3759c9322ab5SMarc-André Lureau capture: true) 3760c9322ab5SMarc-André Lureau arch_srcs += gdbstub_xml 3761c9322ab5SMarc-André Lureau endif 3762c9322ab5SMarc-André Lureau 3763ffb91f68SPaolo Bonzini t = target_arch[target_base_arch].apply(config_target, strict: false) 3764abff1abfSPaolo Bonzini arch_srcs += t.sources() 376564ed6f92SPaolo Bonzini arch_deps += t.dependencies() 3766abff1abfSPaolo Bonzini 37672becc36aSPaolo Bonzini target_common = common_ss.apply(config_target, strict: false) 37682becc36aSPaolo Bonzini objects = common_all.extract_objects(target_common.sources()) 376964ed6f92SPaolo Bonzini deps = target_common.dependencies() 37702becc36aSPaolo Bonzini 37712becc36aSPaolo Bonzini target_specific = specific_ss.apply(config_target, strict: false) 37722becc36aSPaolo Bonzini arch_srcs += target_specific.sources() 377364ed6f92SPaolo Bonzini arch_deps += target_specific.dependencies() 37742becc36aSPaolo Bonzini 377564ed6f92SPaolo Bonzini lib = static_library('qemu-' + target, 3776859aef02SPaolo Bonzini sources: arch_srcs + genh, 3777b7612f45SPaolo Bonzini dependencies: arch_deps, 37782becc36aSPaolo Bonzini objects: objects, 37792becc36aSPaolo Bonzini include_directories: target_inc, 378064ed6f92SPaolo Bonzini c_args: c_args, 378164ed6f92SPaolo Bonzini build_by_default: false, 37822becc36aSPaolo Bonzini name_suffix: 'fa') 378364ed6f92SPaolo Bonzini 378464ed6f92SPaolo Bonzini if target.endswith('-softmmu') 378564ed6f92SPaolo Bonzini execs = [{ 378664ed6f92SPaolo Bonzini 'name': 'qemu-system-' + target_name, 3787654d6b04SPaolo Bonzini 'win_subsystem': 'console', 378864ed6f92SPaolo Bonzini 'sources': files('softmmu/main.c'), 378964ed6f92SPaolo Bonzini 'dependencies': [] 379064ed6f92SPaolo Bonzini }] 379135be72baSPaolo Bonzini if targetos == 'windows' and (sdl.found() or gtk.found()) 379264ed6f92SPaolo Bonzini execs += [{ 379364ed6f92SPaolo Bonzini 'name': 'qemu-system-' + target_name + 'w', 3794654d6b04SPaolo Bonzini 'win_subsystem': 'windows', 379564ed6f92SPaolo Bonzini 'sources': files('softmmu/main.c'), 379664ed6f92SPaolo Bonzini 'dependencies': [] 379764ed6f92SPaolo Bonzini }] 379864ed6f92SPaolo Bonzini endif 3799537b7248SPaolo Bonzini if get_option('fuzzing') 380064ed6f92SPaolo Bonzini specific_fuzz = specific_fuzz_ss.apply(config_target, strict: false) 380164ed6f92SPaolo Bonzini execs += [{ 380264ed6f92SPaolo Bonzini 'name': 'qemu-fuzz-' + target_name, 3803654d6b04SPaolo Bonzini 'win_subsystem': 'console', 380464ed6f92SPaolo Bonzini 'sources': specific_fuzz.sources(), 380564ed6f92SPaolo Bonzini 'dependencies': specific_fuzz.dependencies(), 380664ed6f92SPaolo Bonzini }] 380764ed6f92SPaolo Bonzini endif 380864ed6f92SPaolo Bonzini else 380964ed6f92SPaolo Bonzini execs = [{ 381064ed6f92SPaolo Bonzini 'name': 'qemu-' + target_name, 3811654d6b04SPaolo Bonzini 'win_subsystem': 'console', 381264ed6f92SPaolo Bonzini 'sources': [], 381364ed6f92SPaolo Bonzini 'dependencies': [] 381464ed6f92SPaolo Bonzini }] 381564ed6f92SPaolo Bonzini endif 381664ed6f92SPaolo Bonzini foreach exe: execs 38178a74ce61SAlexander Graf exe_name = exe['name'] 38183983a767SJohn Arbuckle if targetos == 'darwin' 38198a74ce61SAlexander Graf exe_name += '-unsigned' 38208a74ce61SAlexander Graf endif 38218a74ce61SAlexander Graf 38228a74ce61SAlexander Graf emulator = executable(exe_name, exe['sources'], 3823237377acSAkihiko Odaki install: true, 382464ed6f92SPaolo Bonzini c_args: c_args, 382564ed6f92SPaolo Bonzini dependencies: arch_deps + deps + exe['dependencies'], 382664ed6f92SPaolo Bonzini objects: lib.extract_all_objects(recursive: true), 382764ed6f92SPaolo Bonzini link_depends: [block_syms, qemu_syms] + exe.get('link_depends', []), 382864ed6f92SPaolo Bonzini link_args: link_args, 3829654d6b04SPaolo Bonzini win_subsystem: exe['win_subsystem']) 38308a74ce61SAlexander Graf 38313983a767SJohn Arbuckle if targetos == 'darwin' 3832411ad8ddSAkihiko Odaki icon = 'pc-bios/qemu.rsrc' 3833411ad8ddSAkihiko Odaki build_input = [emulator, files(icon)] 3834411ad8ddSAkihiko Odaki install_input = [ 3835411ad8ddSAkihiko Odaki get_option('bindir') / exe_name, 3836411ad8ddSAkihiko Odaki meson.current_source_dir() / icon 3837411ad8ddSAkihiko Odaki ] 3838411ad8ddSAkihiko Odaki if 'CONFIG_HVF' in config_target 3839411ad8ddSAkihiko Odaki entitlements = 'accel/hvf/entitlements.plist' 3840411ad8ddSAkihiko Odaki build_input += files(entitlements) 3841411ad8ddSAkihiko Odaki install_input += meson.current_source_dir() / entitlements 3842411ad8ddSAkihiko Odaki endif 3843411ad8ddSAkihiko Odaki 38448a74ce61SAlexander Graf emulators += {exe['name'] : custom_target(exe['name'], 3845411ad8ddSAkihiko Odaki input: build_input, 38468a74ce61SAlexander Graf output: exe['name'], 3847235b523dSPhilippe Mathieu-Daudé command: [entitlement, '@OUTPUT@', '@INPUT@']) 3848fd5eef85SPaolo Bonzini } 3849237377acSAkihiko Odaki 3850235b523dSPhilippe Mathieu-Daudé meson.add_install_script(entitlement, '--install', 3851237377acSAkihiko Odaki get_option('bindir') / exe['name'], 3852411ad8ddSAkihiko Odaki install_input) 38538a74ce61SAlexander Graf else 38548a74ce61SAlexander Graf emulators += {exe['name']: emulator} 38558a74ce61SAlexander Graf endif 385610e1d263SMarc-André Lureau 38579c29b741SPaolo Bonzini if stap.found() 385810e1d263SMarc-André Lureau foreach stp: [ 3859bd5f973aSStefan Hajnoczi {'ext': '.stp-build', 'fmt': 'stap', 'bin': meson.current_build_dir() / exe['name'], 'install': false}, 3860bd5f973aSStefan Hajnoczi {'ext': '.stp', 'fmt': 'stap', 'bin': get_option('prefix') / get_option('bindir') / exe['name'], 'install': true}, 386110e1d263SMarc-André Lureau {'ext': '-simpletrace.stp', 'fmt': 'simpletrace-stap', 'bin': '', 'install': true}, 386210e1d263SMarc-André Lureau {'ext': '-log.stp', 'fmt': 'log-stap', 'bin': '', 'install': true}, 386310e1d263SMarc-André Lureau ] 3864bd5f973aSStefan Hajnoczi custom_target(exe['name'] + stp['ext'], 386510e1d263SMarc-André Lureau input: trace_events_all, 3866bd5f973aSStefan Hajnoczi output: exe['name'] + stp['ext'], 386710e1d263SMarc-André Lureau install: stp['install'], 386816bf7a33SPaolo Bonzini install_dir: get_option('datadir') / 'systemtap/tapset', 386910e1d263SMarc-André Lureau command: [ 387010e1d263SMarc-André Lureau tracetool, '--group=all', '--format=' + stp['fmt'], 387110e1d263SMarc-André Lureau '--binary=' + stp['bin'], 387210e1d263SMarc-André Lureau '--target-name=' + target_name, 387310e1d263SMarc-André Lureau '--target-type=' + target_type, 387410e1d263SMarc-André Lureau '--probe-prefix=qemu.' + target_type + '.' + target_name, 3875c05012a3SStefan Hajnoczi '@INPUT@', '@OUTPUT@' 38760572d6cdSStefan Hajnoczi ], 38770572d6cdSStefan Hajnoczi depend_files: tracetool_depends) 387810e1d263SMarc-André Lureau endforeach 387910e1d263SMarc-André Lureau endif 388064ed6f92SPaolo Bonzini endforeach 38812becc36aSPaolo Bonziniendforeach 38822becc36aSPaolo Bonzini 3883931049b4SPaolo Bonzini# Other build targets 3884897b5afaSMarc-André Lureau 3885f556b4a1SPaolo Bonziniif 'CONFIG_PLUGIN' in config_host 3886f556b4a1SPaolo Bonzini install_headers('include/qemu/qemu-plugin.h') 3887f556b4a1SPaolo Bonziniendif 3888f556b4a1SPaolo Bonzini 3889f15bff25SPaolo Bonzinisubdir('qga') 3890f15bff25SPaolo Bonzini 38919755c94aSLaurent Vivier# Don't build qemu-keymap if xkbcommon is not explicitly enabled 38929755c94aSLaurent Vivier# when we don't build tools or system 38934113f4cfSLaurent Vivierif xkbcommon.found() 389428742467SMarc-André Lureau # used for the update-keymaps target, so include rules even if !have_tools 389528742467SMarc-André Lureau qemu_keymap = executable('qemu-keymap', files('qemu-keymap.c', 'ui/input-keymap.c') + genh, 389628742467SMarc-André Lureau dependencies: [qemuutil, xkbcommon], install: have_tools) 389728742467SMarc-André Lureauendif 389828742467SMarc-André Lureau 3899931049b4SPaolo Bonziniif have_tools 3900b7c70bf2SMarc-André Lureau qemu_img = executable('qemu-img', [files('qemu-img.c'), hxdep], 3901b7c70bf2SMarc-André Lureau dependencies: [authz, block, crypto, io, qom, qemuutil], install: true) 3902b7c70bf2SMarc-André Lureau qemu_io = executable('qemu-io', files('qemu-io.c'), 3903b7c70bf2SMarc-André Lureau dependencies: [block, qemuutil], install: true) 3904b7c70bf2SMarc-André Lureau qemu_nbd = executable('qemu-nbd', files('qemu-nbd.c'), 39053d212b41SRichard W.M. Jones dependencies: [blockdev, qemuutil, gnutls, selinux], 39063d212b41SRichard W.M. Jones install: true) 3907b7c70bf2SMarc-André Lureau 39087c58bb76SPaolo Bonzini subdir('storage-daemon') 3909a9c9727cSPaolo Bonzini subdir('contrib/rdmacm-mux') 39101d7bb6abSMarc-André Lureau subdir('contrib/elf2dmp') 3911a9c9727cSPaolo Bonzini 3912157e7b13SMarc-André Lureau executable('qemu-edid', files('qemu-edid.c', 'hw/display/edid-generate.c'), 3913157e7b13SMarc-André Lureau dependencies: qemuutil, 3914157e7b13SMarc-André Lureau install: true) 3915157e7b13SMarc-André Lureau 39162a3129a3SPaolo Bonzini if have_vhost_user 39172d7ac0afSPaolo Bonzini subdir('contrib/vhost-user-blk') 3918ea458960SMarc-André Lureau subdir('contrib/vhost-user-gpu') 391932fcc624SMarc-André Lureau subdir('contrib/vhost-user-input') 392099650b62SPaolo Bonzini subdir('contrib/vhost-user-scsi') 3921931049b4SPaolo Bonzini endif 39228f51e01cSMarc-André Lureau 39238f51e01cSMarc-André Lureau if targetos == 'linux' 39248f51e01cSMarc-André Lureau executable('qemu-bridge-helper', files('qemu-bridge-helper.c'), 39258f51e01cSMarc-André Lureau dependencies: [qemuutil, libcap_ng], 39268f51e01cSMarc-André Lureau install: true, 39278f51e01cSMarc-André Lureau install_dir: get_option('libexecdir')) 3928897b5afaSMarc-André Lureau 3929897b5afaSMarc-André Lureau executable('qemu-pr-helper', files('scsi/qemu-pr-helper.c', 'scsi/utils.c'), 3930897b5afaSMarc-André Lureau dependencies: [authz, crypto, io, qom, qemuutil, 39316ec0e15dSPaolo Bonzini libcap_ng, mpathpersist], 3932897b5afaSMarc-André Lureau install: true) 39338f51e01cSMarc-André Lureau endif 39348f51e01cSMarc-André Lureau 3935ccd250aaSPaolo Bonzini if have_ivshmem 39365ee24e78SMarc-André Lureau subdir('contrib/ivshmem-client') 39375ee24e78SMarc-André Lureau subdir('contrib/ivshmem-server') 39385ee24e78SMarc-André Lureau endif 3939931049b4SPaolo Bonziniendif 3940931049b4SPaolo Bonzini 3941f5aa6320SMarc-André Lureausubdir('scripts') 39423f99cf57SPaolo Bonzinisubdir('tools') 3943bdcbea7aSMarc-André Lureausubdir('pc-bios') 3944f8aa24eaSPaolo Bonzinisubdir('docs') 3945e3667660SYonggang Luosubdir('tests') 39461b695471SPaolo Bonziniif gtk.found() 3947e8f3bd71SMarc-André Lureau subdir('po') 3948e8f3bd71SMarc-André Lureauendif 39493f99cf57SPaolo Bonzini 39508adfeba9SMarc-André Lureauif host_machine.system() == 'windows' 39518adfeba9SMarc-André Lureau nsis_cmd = [ 39528adfeba9SMarc-André Lureau find_program('scripts/nsis.py'), 39538adfeba9SMarc-André Lureau '@OUTPUT@', 39548adfeba9SMarc-André Lureau get_option('prefix'), 39558adfeba9SMarc-André Lureau meson.current_source_dir(), 3956fc9a809eSPaolo Bonzini glib_pc.get_variable('bindir'), 395724bdcc96SStefan Weil host_machine.cpu(), 39588adfeba9SMarc-André Lureau '--', 39598adfeba9SMarc-André Lureau '-DDISPLAYVERSION=' + meson.project_version(), 39608adfeba9SMarc-André Lureau ] 39618adfeba9SMarc-André Lureau if build_docs 39628adfeba9SMarc-André Lureau nsis_cmd += '-DCONFIG_DOCUMENTATION=y' 39638adfeba9SMarc-André Lureau endif 39641b695471SPaolo Bonzini if gtk.found() 39658adfeba9SMarc-André Lureau nsis_cmd += '-DCONFIG_GTK=y' 39668adfeba9SMarc-André Lureau endif 39678adfeba9SMarc-André Lureau 39688adfeba9SMarc-André Lureau nsis = custom_target('nsis', 39698adfeba9SMarc-André Lureau output: 'qemu-setup-' + meson.project_version() + '.exe', 39708adfeba9SMarc-André Lureau input: files('qemu.nsi'), 39718adfeba9SMarc-André Lureau build_always_stale: true, 39728adfeba9SMarc-André Lureau command: nsis_cmd + ['@INPUT@']) 39738adfeba9SMarc-André Lureau alias_target('installer', nsis) 39748adfeba9SMarc-André Lureauendif 39758adfeba9SMarc-André Lureau 3976a0c9162cSPaolo Bonzini######################### 3977a0c9162cSPaolo Bonzini# Configuration summary # 3978a0c9162cSPaolo Bonzini######################### 3979a0c9162cSPaolo Bonzini 3980ac4ccac7SPaolo Bonzini# Build environment 3981f9332757SPaolo Bonzinisummary_info = {} 3982ac4ccac7SPaolo Bonzinisummary_info += {'Build directory': meson.current_build_dir()} 3983ac4ccac7SPaolo Bonzinisummary_info += {'Source path': meson.current_source_dir()} 3984ac4ccac7SPaolo Bonzinisummary_info += {'Download dependencies': get_option('wrap_mode') != 'nodownload'} 3985ac4ccac7SPaolo Bonzinisummary(summary_info, bool_yn: true, section: 'Build environment') 3986ac4ccac7SPaolo Bonzini 3987ac4ccac7SPaolo Bonzini# Directories 398816bf7a33SPaolo Bonzinisummary_info += {'Install prefix': get_option('prefix')} 398916bf7a33SPaolo Bonzinisummary_info += {'BIOS directory': qemu_datadir} 39908154f5e6SAkihiko Odakipathsep = targetos == 'windows' ? ';' : ':' 39918154f5e6SAkihiko Odakisummary_info += {'firmware path': pathsep.join(get_option('qemu_firmwarepath'))} 3992f7fb6c6aSPaolo Bonzinisummary_info += {'binary directory': get_option('prefix') / get_option('bindir')} 3993f7fb6c6aSPaolo Bonzinisummary_info += {'library directory': get_option('prefix') / get_option('libdir')} 399416bf7a33SPaolo Bonzinisummary_info += {'module directory': qemu_moddir} 3995f7fb6c6aSPaolo Bonzinisummary_info += {'libexec directory': get_option('prefix') / get_option('libexecdir')} 3996f7fb6c6aSPaolo Bonzinisummary_info += {'include directory': get_option('prefix') / get_option('includedir')} 3997f7fb6c6aSPaolo Bonzinisummary_info += {'config directory': get_option('prefix') / get_option('sysconfdir')} 3998f9332757SPaolo Bonziniif targetos != 'windows' 3999f7fb6c6aSPaolo Bonzini summary_info += {'local state directory': get_option('prefix') / get_option('localstatedir')} 4000f7fb6c6aSPaolo Bonzini summary_info += {'Manual directory': get_option('prefix') / get_option('mandir')} 4001f9332757SPaolo Bonzinielse 4002f9332757SPaolo Bonzini summary_info += {'local state directory': 'queried at runtime'} 4003f9332757SPaolo Bonziniendif 4004f7fb6c6aSPaolo Bonzinisummary_info += {'Doc directory': get_option('prefix') / get_option('docdir')} 4005983d0a75SPhilippe Mathieu-Daudésummary(summary_info, bool_yn: true, section: 'Directories') 4006983d0a75SPhilippe Mathieu-Daudé 4007e11a0e17SPhilippe Mathieu-Daudé# Host binaries 4008983d0a75SPhilippe Mathieu-Daudésummary_info = {} 4009e11a0e17SPhilippe Mathieu-Daudésummary_info += {'python': '@0@ (version: @1@)'.format(python.full_path(), python.language_version())} 4010bb647c49SPaolo Bonzinisummary_info += {'sphinx-build': sphinx_build} 4011e11a0e17SPhilippe Mathieu-Daudéif config_host.has_key('HAVE_GDB_BIN') 4012e11a0e17SPhilippe Mathieu-Daudé summary_info += {'gdb': config_host['HAVE_GDB_BIN']} 4013e11a0e17SPhilippe Mathieu-Daudéendif 401440c909f5SPaolo Bonzinisummary_info += {'iasl': iasl} 4015e11a0e17SPhilippe Mathieu-Daudésummary_info += {'genisoimage': config_host['GENISOIMAGE']} 401620cf5cb4SPaolo Bonziniif targetos == 'windows' and have_ga 4017bb647c49SPaolo Bonzini summary_info += {'wixl': wixl} 4018e11a0e17SPhilippe Mathieu-Daudéendif 40195890258aSThomas Huthif slirp.found() and have_system 402035acbb30SPaolo Bonzini summary_info += {'smbd': have_slirp_smbd ? smbd_path : false} 4021e11a0e17SPhilippe Mathieu-Daudéendif 4022e11a0e17SPhilippe Mathieu-Daudésummary(summary_info, bool_yn: true, section: 'Host binaries') 4023e11a0e17SPhilippe Mathieu-Daudé 40241d718865SPhilippe Mathieu-Daudé# Configurable features 40251d718865SPhilippe Mathieu-Daudésummary_info = {} 40261d718865SPhilippe Mathieu-Daudésummary_info += {'Documentation': build_docs} 4027aa3ca634SPhilippe Mathieu-Daudésummary_info += {'system-mode emulation': have_system} 4028aa3ca634SPhilippe Mathieu-Daudésummary_info += {'user-mode emulation': have_user} 4029813803aaSPhilippe Mathieu-Daudésummary_info += {'block layer': have_block} 40301d718865SPhilippe Mathieu-Daudésummary_info += {'Install blobs': get_option('install_blobs')} 40316002711cSPaolo Bonzinisummary_info += {'module support': enable_modules} 40326002711cSPaolo Bonziniif enable_modules 40332cb2f580SPaolo Bonzini summary_info += {'alternative module path': get_option('module_upgrades')} 40341d718865SPhilippe Mathieu-Daudéendif 4035537b7248SPaolo Bonzinisummary_info += {'fuzzing support': get_option('fuzzing')} 40361d718865SPhilippe Mathieu-Daudéif have_system 403787430d5bSPaolo Bonzini summary_info += {'Audio drivers': ' '.join(audio_drivers_selected)} 40381d718865SPhilippe Mathieu-Daudéendif 40399c29b741SPaolo Bonzinisummary_info += {'Trace backends': ','.join(get_option('trace_backends'))} 40409c29b741SPaolo Bonziniif 'simple' in get_option('trace_backends') 40419c29b741SPaolo Bonzini summary_info += {'Trace output file': get_option('trace_file') + '-<pid>'} 40421d718865SPhilippe Mathieu-Daudéendif 4043142ca628SMarc-André Lureausummary_info += {'D-Bus display': dbus_display} 4044c55cf6abSPaolo Bonzinisummary_info += {'QOM debugging': get_option('qom_cast_debug')} 40452a3129a3SPaolo Bonzinisummary_info += {'vhost-kernel support': have_vhost_kernel} 40462a3129a3SPaolo Bonzinisummary_info += {'vhost-net support': have_vhost_net} 40472a3129a3SPaolo Bonzinisummary_info += {'vhost-user support': have_vhost_user} 40482a3129a3SPaolo Bonzinisummary_info += {'vhost-user-crypto support': have_vhost_user_crypto} 40491d718865SPhilippe Mathieu-Daudésummary_info += {'vhost-user-blk server support': have_vhost_user_blk_server} 40502a3129a3SPaolo Bonzinisummary_info += {'vhost-vdpa support': have_vhost_vdpa} 405120cf5cb4SPaolo Bonzinisummary_info += {'build guest agent': have_ga} 40521d718865SPhilippe Mathieu-Daudésummary(summary_info, bool_yn: true, section: 'Configurable features') 40531d718865SPhilippe Mathieu-Daudé 40542e864b8bSPhilippe Mathieu-Daudé# Compilation information 4055e11a0e17SPhilippe Mathieu-Daudésummary_info = {} 40562e864b8bSPhilippe Mathieu-Daudésummary_info += {'host CPU': cpu} 40572e864b8bSPhilippe Mathieu-Daudésummary_info += {'host endianness': build_machine.endian()} 405863de9353SAlex Bennéesummary_info += {'C compiler': ' '.join(meson.get_compiler('c').cmd_array())} 405963de9353SAlex Bennéesummary_info += {'Host C compiler': ' '.join(meson.get_compiler('c', native: true).cmd_array())} 4060785abf0dSThomas Huthif 'cpp' in all_languages 406163de9353SAlex Bennée summary_info += {'C++ compiler': ' '.join(meson.get_compiler('cpp').cmd_array())} 4062f9332757SPaolo Bonzinielse 4063f9332757SPaolo Bonzini summary_info += {'C++ compiler': false} 4064f9332757SPaolo Bonziniendif 4065f9332757SPaolo Bonziniif targetos == 'darwin' 406663de9353SAlex Bennée summary_info += {'Objective-C compiler': ' '.join(meson.get_compiler('objc').cmd_array())} 4067f9332757SPaolo Bonziniendif 40686a97f393SPaolo Bonzinioption_cflags = (get_option('debug') ? ['-g'] : []) 40696a97f393SPaolo Bonziniif get_option('optimization') != 'plain' 40706a97f393SPaolo Bonzini option_cflags += ['-O' + get_option('optimization')] 40716a97f393SPaolo Bonziniendif 40726a97f393SPaolo Bonzinisummary_info += {'CFLAGS': ' '.join(get_option('c_args') + option_cflags)} 4073785abf0dSThomas Huthif 'cpp' in all_languages 40746a97f393SPaolo Bonzini summary_info += {'CXXFLAGS': ' '.join(get_option('cpp_args') + option_cflags)} 407547b30835SPaolo Bonziniendif 4076e910c7d9SPhilippe Mathieu-Daudéif targetos == 'darwin' 40776a97f393SPaolo Bonzini summary_info += {'OBJCFLAGS': ' '.join(get_option('objc_args') + option_cflags)} 4078e910c7d9SPhilippe Mathieu-Daudéendif 4079785abf0dSThomas Huthlink_args = get_option('c_link_args') 408047b30835SPaolo Bonziniif link_args.length() > 0 408147b30835SPaolo Bonzini summary_info += {'LDFLAGS': ' '.join(link_args)} 408247b30835SPaolo Bonziniendif 4083d67212d4SPaolo Bonzinisummary_info += {'QEMU_CFLAGS': ' '.join(qemu_common_flags + qemu_cflags)} 4084e5134024SPaolo Bonziniif 'cpp' in all_languages 4085d67212d4SPaolo Bonzini summary_info += {'QEMU_CXXFLAGS': ' '.join(qemu_common_flags + qemu_cxxflags)} 4086e5134024SPaolo Bonziniendif 4087e5134024SPaolo Bonziniif 'objc' in all_languages 408895caf1fbSPaolo Bonzini summary_info += {'QEMU_OBJCFLAGS': ' '.join(qemu_common_flags)} 4089e5134024SPaolo Bonziniendif 4090d065177eSPaolo Bonzinisummary_info += {'QEMU_LDFLAGS': ' '.join(qemu_ldflags)} 4091cdad781dSDaniele Buonosummary_info += {'link-time optimization (LTO)': get_option('b_lto')} 40922e864b8bSPhilippe Mathieu-Daudésummary_info += {'PIE': get_option('b_pie')} 4093e58e55ddSPaolo Bonzinisummary_info += {'static build': get_option('prefer_static')} 40942e864b8bSPhilippe Mathieu-Daudésummary_info += {'malloc trim support': has_malloc_trim} 4095b87df904SPaolo Bonzinisummary_info += {'membarrier': have_membarrier} 409658a2e3f5SStefan Hajnoczisummary_info += {'debug graph lock': get_option('debug_graph_lock')} 4097728c0a2fSPaolo Bonzinisummary_info += {'debug stack usage': get_option('debug_stack_usage')} 4098c55cf6abSPaolo Bonzinisummary_info += {'mutex debugging': get_option('debug_mutex')} 40992e864b8bSPhilippe Mathieu-Daudésummary_info += {'memory allocator': get_option('malloc')} 4100622753d2SPaolo Bonzinisummary_info += {'avx2 optimization': config_host_data.get('CONFIG_AVX2_OPT')} 410104ffce13Sling xusummary_info += {'avx512bw optimization': config_host_data.get('CONFIG_AVX512BW_OPT')} 4102622753d2SPaolo Bonzinisummary_info += {'avx512f optimization': config_host_data.get('CONFIG_AVX512F_OPT')} 4103bb9ecae7SAlex Bennéeif get_option('gprof') 4104bb9ecae7SAlex Bennée gprof_info = 'YES (deprecated)' 4105bb9ecae7SAlex Bennéeelse 4106bb9ecae7SAlex Bennée gprof_info = get_option('gprof') 4107bb9ecae7SAlex Bennéeendif 4108bb9ecae7SAlex Bennéesummary_info += {'gprof': gprof_info} 41092e864b8bSPhilippe Mathieu-Daudésummary_info += {'gcov': get_option('b_coverage')} 411034f983d8SPaolo Bonzinisummary_info += {'thread sanitizer': get_option('tsan')} 41112e864b8bSPhilippe Mathieu-Daudésummary_info += {'CFI support': get_option('cfi')} 41122e864b8bSPhilippe Mathieu-Daudéif get_option('cfi') 41132e864b8bSPhilippe Mathieu-Daudé summary_info += {'CFI debug support': get_option('cfi_debug')} 41142e864b8bSPhilippe Mathieu-Daudéendif 41152e864b8bSPhilippe Mathieu-Daudésummary_info += {'strip binaries': get_option('strip')} 4116bb647c49SPaolo Bonzinisummary_info += {'sparse': sparse} 41172e864b8bSPhilippe Mathieu-Daudésummary_info += {'mingw32 support': targetos == 'windows'} 411812640f05SPaolo Bonzinisummary(summary_info, bool_yn: true, section: 'Compilation') 411949e8565bSAlex Bennée 412049e8565bSAlex Bennée# snarf the cross-compilation information for tests 412112640f05SPaolo Bonzinisummary_info = {} 412212640f05SPaolo Bonzinihave_cross = false 412349e8565bSAlex Bennéeforeach target: target_dirs 4124c7022a70SPaolo Bonzini tcg_mak = meson.current_build_dir() / 'tests/tcg' / target / 'config-target.mak' 412549e8565bSAlex Bennée if fs.exists(tcg_mak) 412649e8565bSAlex Bennée config_cross_tcg = keyval.load(tcg_mak) 412785b141eaSAlex Bennée if 'CC' in config_cross_tcg 412812640f05SPaolo Bonzini summary_info += {config_cross_tcg['TARGET_NAME']: config_cross_tcg['CC']} 412912640f05SPaolo Bonzini have_cross = true 413049e8565bSAlex Bennée endif 413149e8565bSAlex Bennée endif 413249e8565bSAlex Bennéeendforeach 413312640f05SPaolo Bonziniif have_cross 413412640f05SPaolo Bonzini summary(summary_info, bool_yn: true, section: 'Cross compilers') 413512640f05SPaolo Bonziniendif 41362e864b8bSPhilippe Mathieu-Daudé 4137aa3ca634SPhilippe Mathieu-Daudé# Targets and accelerators 41382e864b8bSPhilippe Mathieu-Daudésummary_info = {} 4139aa3ca634SPhilippe Mathieu-Daudéif have_system 4140aa3ca634SPhilippe Mathieu-Daudé summary_info += {'KVM support': config_all.has_key('CONFIG_KVM')} 4141aa3ca634SPhilippe Mathieu-Daudé summary_info += {'HAX support': config_all.has_key('CONFIG_HAX')} 4142aa3ca634SPhilippe Mathieu-Daudé summary_info += {'HVF support': config_all.has_key('CONFIG_HVF')} 4143aa3ca634SPhilippe Mathieu-Daudé summary_info += {'WHPX support': config_all.has_key('CONFIG_WHPX')} 414474a414a1SReinoud Zandijk summary_info += {'NVMM support': config_all.has_key('CONFIG_NVMM')} 414514efd8d3SPaolo Bonzini summary_info += {'Xen support': xen.found()} 414614efd8d3SPaolo Bonzini if xen.found() 414714efd8d3SPaolo Bonzini summary_info += {'xen ctrl version': xen.version()} 4148aa3ca634SPhilippe Mathieu-Daudé endif 4149820c1abaSDavid Woodhouse summary_info += {'Xen emulation': config_all.has_key('CONFIG_XEN_EMU')} 4150aa3ca634SPhilippe Mathieu-Daudéendif 4151aa3ca634SPhilippe Mathieu-Daudésummary_info += {'TCG support': config_all.has_key('CONFIG_TCG')} 4152aa3ca634SPhilippe Mathieu-Daudéif config_all.has_key('CONFIG_TCG') 415339687acaSPhilippe Mathieu-Daudé if get_option('tcg_interpreter') 4154f1f727acSPhilippe Mathieu-Daudé summary_info += {'TCG backend': 'TCI (TCG with bytecode interpreter, slow)'} 415539687acaSPhilippe Mathieu-Daudé else 415639687acaSPhilippe Mathieu-Daudé summary_info += {'TCG backend': 'native (@0@)'.format(cpu)} 415739687acaSPhilippe Mathieu-Daudé endif 4158029aa68fSAlex Bennée summary_info += {'TCG plugins': config_host.has_key('CONFIG_PLUGIN')} 4159aa3ca634SPhilippe Mathieu-Daudé summary_info += {'TCG debug enabled': config_host.has_key('CONFIG_DEBUG_TCG')} 4160aa3ca634SPhilippe Mathieu-Daudéendif 41612e864b8bSPhilippe Mathieu-Daudésummary_info += {'target list': ' '.join(target_dirs)} 4162aa3ca634SPhilippe Mathieu-Daudéif have_system 4163aa3ca634SPhilippe Mathieu-Daudé summary_info += {'default devices': get_option('default_devices')} 4164106ad1f9SPaolo Bonzini summary_info += {'out of process emulation': multiprocess_allowed} 416555116968SJagannathan Raman summary_info += {'vfio-user server': vfio_user_server_allowed} 4166aa3ca634SPhilippe Mathieu-Daudéendif 4167aa3ca634SPhilippe Mathieu-Daudésummary(summary_info, bool_yn: true, section: 'Targets and accelerators') 4168aa3ca634SPhilippe Mathieu-Daudé 4169813803aaSPhilippe Mathieu-Daudé# Block layer 4170813803aaSPhilippe Mathieu-Daudésummary_info = {} 41716739825aSPaolo Bonzinisummary_info += {'coroutine backend': coroutine_backend} 4172728c0a2fSPaolo Bonzinisummary_info += {'coroutine pool': have_coroutine_pool} 4173813803aaSPhilippe Mathieu-Daudéif have_block 4174622d64ffSPaolo Bonzini summary_info += {'Block whitelist (rw)': get_option('block_drv_rw_whitelist')} 4175622d64ffSPaolo Bonzini summary_info += {'Block whitelist (ro)': get_option('block_drv_ro_whitelist')} 4176c55cf6abSPaolo Bonzini summary_info += {'Use block whitelist in tools': get_option('block_drv_whitelist_in_tools')} 41773887702eSChristian Schoenebeck summary_info += {'VirtFS (9P) support': have_virtfs} 417871d72eceSChristian Schoenebeck summary_info += {'VirtFS (9P) Proxy Helper support (deprecated)': have_virtfs_proxy_helper} 4179406523f6SPaolo Bonzini summary_info += {'Live block migration': config_host_data.get('CONFIG_LIVE_BLOCK_MIGRATION')} 4180406523f6SPaolo Bonzini summary_info += {'replication support': config_host_data.get('CONFIG_REPLICATION')} 4181ed793c2cSPaolo Bonzini summary_info += {'bochs support': get_option('bochs').allowed()} 4182ed793c2cSPaolo Bonzini summary_info += {'cloop support': get_option('cloop').allowed()} 4183ed793c2cSPaolo Bonzini summary_info += {'dmg support': get_option('dmg').allowed()} 4184ed793c2cSPaolo Bonzini summary_info += {'qcow v1 support': get_option('qcow1').allowed()} 4185ed793c2cSPaolo Bonzini summary_info += {'vdi support': get_option('vdi').allowed()} 418611cea42eSVladimir Sementsov-Ogievskiy summary_info += {'vhdx support': get_option('vhdx').allowed()} 418711cea42eSVladimir Sementsov-Ogievskiy summary_info += {'vmdk support': get_option('vmdk').allowed()} 418811cea42eSVladimir Sementsov-Ogievskiy summary_info += {'vpc support': get_option('vpc').allowed()} 4189ed793c2cSPaolo Bonzini summary_info += {'vvfat support': get_option('vvfat').allowed()} 4190ed793c2cSPaolo Bonzini summary_info += {'qed support': get_option('qed').allowed()} 4191ed793c2cSPaolo Bonzini summary_info += {'parallels support': get_option('parallels').allowed()} 4192bb647c49SPaolo Bonzini summary_info += {'FUSE exports': fuse} 41932a2359b8SXie Yongji summary_info += {'VDUSE block exports': have_vduse_blk_export} 4194813803aaSPhilippe Mathieu-Daudéendif 4195813803aaSPhilippe Mathieu-Daudésummary(summary_info, bool_yn: true, section: 'Block layer support') 4196813803aaSPhilippe Mathieu-Daudé 4197aa58028aSPhilippe Mathieu-Daudé# Crypto 4198aa3ca634SPhilippe Mathieu-Daudésummary_info = {} 419941f2ae28SPaolo Bonzinisummary_info += {'TLS priority': get_option('tls_priority')} 4200bb647c49SPaolo Bonzinisummary_info += {'GNUTLS support': gnutls} 4201bb647c49SPaolo Bonziniif gnutls.found() 4202cc4c7c73SDaniel P. Berrangé summary_info += {' GNUTLS crypto': gnutls_crypto.found()} 4203bb647c49SPaolo Bonziniendif 4204bb647c49SPaolo Bonzinisummary_info += {'libgcrypt': gcrypt} 4205bb647c49SPaolo Bonzinisummary_info += {'nettle': nettle} 420657612511SPaolo Bonziniif nettle.found() 420757612511SPaolo Bonzini summary_info += {' XTS': xts != 'private'} 4208f9332757SPaolo Bonziniendif 420934b52615SPaolo Bonzinisummary_info += {'AF_ALG support': have_afalg} 4210c55cf6abSPaolo Bonzinisummary_info += {'rng-none': get_option('rng_none')} 42112edd2c04SPaolo Bonzinisummary_info += {'Linux keyring': have_keyring} 4212aa58028aSPhilippe Mathieu-Daudésummary(summary_info, bool_yn: true, section: 'Crypto') 4213aa58028aSPhilippe Mathieu-Daudé 42149e48afa3SThomas Huth# UI 4215aa58028aSPhilippe Mathieu-Daudésummary_info = {} 4216aa58028aSPhilippe Mathieu-Daudéif targetos == 'darwin' 4217bb647c49SPaolo Bonzini summary_info += {'Cocoa support': cocoa} 4218aa58028aSPhilippe Mathieu-Daudéendif 4219bb647c49SPaolo Bonzinisummary_info += {'SDL support': sdl} 4220bb647c49SPaolo Bonzinisummary_info += {'SDL image support': sdl_image} 4221bb647c49SPaolo Bonzinisummary_info += {'GTK support': gtk} 4222bb647c49SPaolo Bonzinisummary_info += {'pixman': pixman} 4223bb647c49SPaolo Bonzinisummary_info += {'VTE support': vte} 422495f8510eSKshitij Surisummary_info += {'PNG support': png} 4225bb647c49SPaolo Bonzinisummary_info += {'VNC support': vnc} 4226a0b93237SPaolo Bonziniif vnc.found() 4227bb647c49SPaolo Bonzini summary_info += {'VNC SASL support': sasl} 4228bb647c49SPaolo Bonzini summary_info += {'VNC JPEG support': jpeg} 4229f9332757SPaolo Bonziniendif 42309e48afa3SThomas Huthsummary_info += {'spice protocol support': spice_protocol} 42319e48afa3SThomas Huthif spice_protocol.found() 42329e48afa3SThomas Huth summary_info += {' spice server support': spice} 42339e48afa3SThomas Huthendif 42349e48afa3SThomas Huthsummary_info += {'curses support': curses} 42359e48afa3SThomas Huthsummary_info += {'brlapi support': brlapi} 42369e48afa3SThomas Huthsummary(summary_info, bool_yn: true, section: 'User interface') 42379e48afa3SThomas Huth 4238aece7238SThomas Huth# Audio backends 4239aece7238SThomas Huthsummary_info = {} 424087430d5bSPaolo Bonziniif targetos not in ['darwin', 'haiku', 'windows'] 424187430d5bSPaolo Bonzini summary_info += {'OSS support': oss} 4242663df1ccSAlexandre Ratchov summary_info += {'sndio support': sndio} 424387430d5bSPaolo Bonzinielif targetos == 'darwin' 424487430d5bSPaolo Bonzini summary_info += {'CoreAudio support': coreaudio} 424587430d5bSPaolo Bonzinielif targetos == 'windows' 424687430d5bSPaolo Bonzini summary_info += {'DirectSound support': dsound} 424787430d5bSPaolo Bonziniendif 424887430d5bSPaolo Bonziniif targetos == 'linux' 424987430d5bSPaolo Bonzini summary_info += {'ALSA support': alsa} 425087430d5bSPaolo Bonzini summary_info += {'PulseAudio support': pulse} 425187430d5bSPaolo Bonziniendif 425220c51248SMarc-André Lureausummary_info += {'PipeWire support': pipewire} 425387430d5bSPaolo Bonzinisummary_info += {'JACK support': jack} 4254aece7238SThomas Huthsummary(summary_info, bool_yn: true, section: 'Audio backends') 4255aece7238SThomas Huth 4256c3527c5eSThomas Huth# Network backends 42579e48afa3SThomas Huthsummary_info = {} 42589e48afa3SThomas Huthif targetos == 'darwin' 42599e48afa3SThomas Huth summary_info += {'vmnet.framework support': vmnet} 42609e48afa3SThomas Huthendif 42619e48afa3SThomas Huthsummary_info += {'slirp support': slirp} 4262e1723999SPaolo Bonzinisummary_info += {'vde support': vde} 4263837b84b1SPaolo Bonzinisummary_info += {'netmap support': have_netmap} 4264eea9453aSThomas Huthsummary_info += {'l2tpv3 support': have_l2tpv3} 4265c3527c5eSThomas Huthsummary(summary_info, bool_yn: true, section: 'Network backends') 4266c3527c5eSThomas Huth 4267c3527c5eSThomas Huth# Libraries 4268c3527c5eSThomas Huthsummary_info = {} 42699e48afa3SThomas Huthsummary_info += {'libtasn1': tasn1} 42709e48afa3SThomas Huthsummary_info += {'PAM': pam} 42719e48afa3SThomas Huthsummary_info += {'iconv support': iconv} 42729e48afa3SThomas Huthsummary_info += {'virgl support': virgl} 42739e48afa3SThomas Huthsummary_info += {'blkio support': blkio} 42749e48afa3SThomas Huthsummary_info += {'curl support': curl} 42759e48afa3SThomas Huthsummary_info += {'Multipath support': mpathpersist} 4276ff66f3e5SPaolo Bonzinisummary_info += {'Linux AIO support': libaio} 4277bb647c49SPaolo Bonzinisummary_info += {'Linux io_uring support': linux_io_uring} 4278bb647c49SPaolo Bonzinisummary_info += {'ATTR/XATTR support': libattr} 42793730a734SPaolo Bonzinisummary_info += {'RDMA support': rdma} 42803730a734SPaolo Bonzinisummary_info += {'PVRDMA support': have_pvrdma} 4281fbb4121dSPaolo Bonzinisummary_info += {'fdt support': fdt_opt == 'disabled' ? false : fdt_opt} 4282bb647c49SPaolo Bonzinisummary_info += {'libcap-ng support': libcap_ng} 4283bb647c49SPaolo Bonzinisummary_info += {'bpf support': libbpf} 4284bb647c49SPaolo Bonzinisummary_info += {'rbd support': rbd} 4285bb647c49SPaolo Bonzinisummary_info += {'smartcard support': cacard} 4286bb647c49SPaolo Bonzinisummary_info += {'U2F support': u2f} 4287bb647c49SPaolo Bonzinisummary_info += {'libusb': libusb} 4288bb647c49SPaolo Bonzinisummary_info += {'usb net redir': usbredir} 428988b6e618SPaolo Bonzinisummary_info += {'OpenGL support (epoxy)': opengl} 4290bb647c49SPaolo Bonzinisummary_info += {'GBM': gbm} 4291bb647c49SPaolo Bonzinisummary_info += {'libiscsi support': libiscsi} 4292bb647c49SPaolo Bonzinisummary_info += {'libnfs support': libnfs} 4293f9332757SPaolo Bonziniif targetos == 'windows' 429420cf5cb4SPaolo Bonzini if have_ga 42958821a389SMarc-André Lureau summary_info += {'QGA VSS support': have_qga_vss} 4296b846ab7cSPaolo Bonzini endif 4297f9332757SPaolo Bonziniendif 4298bb647c49SPaolo Bonzinisummary_info += {'seccomp support': seccomp} 4299bb647c49SPaolo Bonzinisummary_info += {'GlusterFS support': glusterfs} 43000d04c4c9SPaolo Bonzinisummary_info += {'TPM support': have_tpm} 4301e6a52b36SThomas Huthsummary_info += {'libssh support': libssh} 4302bb647c49SPaolo Bonzinisummary_info += {'lzo support': lzo} 4303bb647c49SPaolo Bonzinisummary_info += {'snappy support': snappy} 4304bb647c49SPaolo Bonzinisummary_info += {'bzip2 support': libbzip2} 4305bb647c49SPaolo Bonzinisummary_info += {'lzfse support': liblzfse} 4306bb647c49SPaolo Bonzinisummary_info += {'zstd support': zstd} 4307488a8c73SPaolo Bonzinisummary_info += {'NUMA host support': numa} 430883602083SThomas Huthsummary_info += {'capstone': capstone} 4309bb647c49SPaolo Bonzinisummary_info += {'libpmem support': libpmem} 4310bb647c49SPaolo Bonzinisummary_info += {'libdaxctl support': libdaxctl} 4311bb647c49SPaolo Bonzinisummary_info += {'libudev': libudev} 4312bb647c49SPaolo Bonzini# Dummy dependency, keep .found() 4313df4ea709SMax Reitzsummary_info += {'FUSE lseek': fuse_lseek.found()} 43143d212b41SRichard W.M. Jonessummary_info += {'selinux': selinux} 43157c10cb38SIlya Leoshkevichsummary_info += {'libdw': libdw} 431669a78cceSPhilippe Mathieu-Daudésummary(summary_info, bool_yn: true, section: 'Dependencies') 4317f9332757SPaolo Bonzini 4318*a24f15d2SPaolo Bonziniif host_arch == 'unknown' 4319f9332757SPaolo Bonzini message() 4320*a24f15d2SPaolo Bonzini warning('UNSUPPORTED HOST CPU') 4321f9332757SPaolo Bonzini message() 4322*a24f15d2SPaolo Bonzini message('Support for CPU host architecture ' + cpu + ' is not currently') 4323*a24f15d2SPaolo Bonzini message('maintained. The QEMU project does not guarantee that QEMU will') 4324*a24f15d2SPaolo Bonzini message('compile or work on this host CPU. You can help by volunteering') 4325*a24f15d2SPaolo Bonzini message('to maintain it and providing a build host for our continuous') 4326*a24f15d2SPaolo Bonzini message('integration setup.') 4327*a24f15d2SPaolo Bonzini if get_option('tcg').allowed() and target_dirs.length() > 0 4328*a24f15d2SPaolo Bonzini message() 4329f9332757SPaolo Bonzini message('configure has succeeded and you can continue to build, but') 4330*a24f15d2SPaolo Bonzini message('QEMU will use a slow interpreter to emulate the target CPU.') 4331*a24f15d2SPaolo Bonzini endif 4332f9332757SPaolo Bonziniendif 4333f9332757SPaolo Bonzini 4334f9332757SPaolo Bonziniif not supported_oses.contains(targetos) 4335f9332757SPaolo Bonzini message() 4336*a24f15d2SPaolo Bonzini warning('UNSUPPORTED HOST OS') 4337f9332757SPaolo Bonzini message() 4338*a24f15d2SPaolo Bonzini message('Support for host OS ' + targetos + 'is not currently maintained.') 4339f9332757SPaolo Bonzini message('configure has succeeded and you can continue to build, but') 4340*a24f15d2SPaolo Bonzini message('the QEMU project does not guarantee that QEMU will compile or') 4341*a24f15d2SPaolo Bonzini message('work on this operating system. You can help by volunteering') 4342*a24f15d2SPaolo Bonzini message('to maintain it and providing a build host for our continuous') 4343*a24f15d2SPaolo Bonzini message('integration setup. This will ensure that future versions of QEMU') 4344*a24f15d2SPaolo Bonzini message('will keep working on ' + targetos + '.') 4345*a24f15d2SPaolo Bonziniendif 4346*a24f15d2SPaolo Bonzini 4347*a24f15d2SPaolo Bonziniif host_arch == 'unknown' or not supported_oses.contains(targetos) 4348*a24f15d2SPaolo Bonzini message() 4349*a24f15d2SPaolo Bonzini message('If you want to help supporting QEMU on this platform, please') 4350*a24f15d2SPaolo Bonzini message('contact the developers at qemu-devel@nongnu.org.') 4351f9332757SPaolo Bonziniendif 4352