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'] 23e5134024SPaolo Bonziniif 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'] 58ba0e7333SRichard Hendersonsupported_cpus = ['ppc', 'ppc64', 's390x', 'riscv', 'x86', 'x86_64', 596d0b52edSRichard Henderson 'arm', 'aarch64', 'loongarch64', 'mips', 'mips64', 'sparc64'] 60201e8ed7SPaolo Bonzini 61201e8ed7SPaolo Bonzinicpu = host_machine.cpu_family() 62c94c2394SRichard Henderson 63c94c2394SRichard Henderson# Unify riscv* to a single family. 64c94c2394SRichard Hendersonif cpu in ['riscv32', 'riscv64'] 65c94c2394SRichard Henderson cpu = 'riscv' 66c94c2394SRichard Hendersonendif 67c94c2394SRichard Henderson 6820cf5cb4SPaolo Bonzinitarget_dirs = config_host['TARGET_DIRS'].split() 6920cf5cb4SPaolo Bonzinihave_linux_user = false 7020cf5cb4SPaolo Bonzinihave_bsd_user = false 7120cf5cb4SPaolo Bonzinihave_system = false 7220cf5cb4SPaolo Bonziniforeach target : target_dirs 7320cf5cb4SPaolo Bonzini have_linux_user = have_linux_user or target.endswith('linux-user') 7420cf5cb4SPaolo Bonzini have_bsd_user = have_bsd_user or target.endswith('bsd-user') 7520cf5cb4SPaolo Bonzini have_system = have_system or target.endswith('-softmmu') 7620cf5cb4SPaolo Bonziniendforeach 7720cf5cb4SPaolo Bonzinihave_user = have_linux_user or have_bsd_user 7820cf5cb4SPaolo Bonzinihave_tools = get_option('tools') \ 7920cf5cb4SPaolo Bonzini .disable_auto_if(not have_system) \ 8020cf5cb4SPaolo Bonzini .allowed() 8120cf5cb4SPaolo Bonzinihave_ga = get_option('guest_agent') \ 8220cf5cb4SPaolo Bonzini .disable_auto_if(not have_system and not have_tools) \ 8328236ad8SBrad Smith .require(targetos in ['sunos', 'linux', 'windows', 'freebsd', 'netbsd', 'openbsd'], 8420cf5cb4SPaolo Bonzini error_message: 'unsupported OS for QEMU guest agent') \ 8520cf5cb4SPaolo Bonzini .allowed() 866002711cSPaolo Bonzinienable_modules = get_option('modules') \ 876002711cSPaolo Bonzini .require(targetos != 'windows', 886002711cSPaolo Bonzini error_message: 'Modules are not available for Windows') \ 896002711cSPaolo Bonzini .require(not get_option('prefer_static'), 906002711cSPaolo Bonzini error_message: 'Modules are incompatible with static linking') \ 916002711cSPaolo Bonzini .allowed() 9220cf5cb4SPaolo Bonzinihave_block = have_system or have_tools 9320cf5cb4SPaolo Bonzini 9420cf5cb4SPaolo Bonzinipython = import('python').find_installation() 9520cf5cb4SPaolo Bonzini 96823eb013SPaolo Bonziniif cpu not in supported_cpus 97823eb013SPaolo Bonzini host_arch = 'unknown' 98823eb013SPaolo Bonzinielif cpu == 'x86' 99823eb013SPaolo Bonzini host_arch = 'i386' 1000e3ed77dSRichard Hendersonelif cpu == 'mips64' 1010e3ed77dSRichard Henderson host_arch = 'mips' 102823eb013SPaolo Bonzinielse 103823eb013SPaolo Bonzini host_arch = cpu 104823eb013SPaolo Bonziniendif 105823eb013SPaolo Bonzini 1068a19980eSPaolo Bonziniif cpu in ['x86', 'x86_64'] 1078a19980eSPaolo Bonzini kvm_targets = ['i386-softmmu', 'x86_64-softmmu'] 1088a19980eSPaolo Bonzinielif cpu == 'aarch64' 1098a19980eSPaolo Bonzini kvm_targets = ['aarch64-softmmu'] 1108a19980eSPaolo Bonzinielif cpu == 's390x' 1118a19980eSPaolo Bonzini kvm_targets = ['s390x-softmmu'] 1128a19980eSPaolo Bonzinielif cpu in ['ppc', 'ppc64'] 1138a19980eSPaolo Bonzini kvm_targets = ['ppc-softmmu', 'ppc64-softmmu'] 114fbc5884cSHuacai Chenelif cpu in ['mips', 'mips64'] 115fbc5884cSHuacai Chen kvm_targets = ['mips-softmmu', 'mipsel-softmmu', 'mips64-softmmu', 'mips64el-softmmu'] 116fbf43c7dSYifei Jiangelif cpu in ['riscv'] 117fbf43c7dSYifei Jiang kvm_targets = ['riscv32-softmmu', 'riscv64-softmmu'] 1188a19980eSPaolo Bonzinielse 1198a19980eSPaolo Bonzini kvm_targets = [] 1208a19980eSPaolo Bonziniendif 1218a19980eSPaolo Bonzini 12244d3d898SIgor Mammedovkvm_targets_c = '""' 12343a363aeSPaolo Bonziniif get_option('kvm').allowed() and targetos == 'linux' 124e741aff0SIgor Mammedov kvm_targets_c = '"' + '" ,"'.join(kvm_targets) + '"' 125e741aff0SIgor Mammedovendif 126e741aff0SIgor Mammedovconfig_host_data.set('CONFIG_KVM_TARGETS', kvm_targets_c) 127e741aff0SIgor Mammedov 1288a19980eSPaolo Bonziniaccelerator_targets = { 'CONFIG_KVM': kvm_targets } 129844a06bbSAlexander Graf 130844a06bbSAlexander Grafif cpu in ['aarch64'] 131844a06bbSAlexander Graf accelerator_targets += { 132844a06bbSAlexander Graf 'CONFIG_HVF': ['aarch64-softmmu'] 133844a06bbSAlexander Graf } 134844a06bbSAlexander Grafendif 135844a06bbSAlexander Graf 1360c3e41d4SAlex Bennéeif cpu in ['x86', 'x86_64', 'arm', 'aarch64'] 1372a2d51bcSMarc-André Lureau # i386 emulator provides xenpv machine type for multiple architectures 1380c3e41d4SAlex Bennée accelerator_targets += { 1390c3e41d4SAlex Bennée 'CONFIG_XEN': ['i386-softmmu', 'x86_64-softmmu'], 1400c3e41d4SAlex Bennée } 1410c3e41d4SAlex Bennéeendif 1428a19980eSPaolo Bonziniif cpu in ['x86', 'x86_64'] 1438a19980eSPaolo Bonzini accelerator_targets += { 1448a19980eSPaolo Bonzini 'CONFIG_HAX': ['i386-softmmu', 'x86_64-softmmu'], 1458a19980eSPaolo Bonzini 'CONFIG_HVF': ['x86_64-softmmu'], 14674a414a1SReinoud Zandijk 'CONFIG_NVMM': ['i386-softmmu', 'x86_64-softmmu'], 1478a19980eSPaolo Bonzini 'CONFIG_WHPX': ['i386-softmmu', 'x86_64-softmmu'], 1488a19980eSPaolo Bonzini } 1498a19980eSPaolo Bonziniendif 1508a19980eSPaolo Bonzini 151a1b176f9SPaolo Bonzinimodular_tcg = [] 152a1b176f9SPaolo Bonzini# Darwin does not support references to thread-local variables in modules 153a1b176f9SPaolo Bonziniif targetos != 'darwin' 154dae0ec15SGerd Hoffmann modular_tcg = ['i386-softmmu', 'x86_64-softmmu'] 155a1b176f9SPaolo Bonziniendif 156dae0ec15SGerd Hoffmann 157eae9a1d1SPhilippe Mathieu-Daudéedk2_targets = [ 'arm-softmmu', 'aarch64-softmmu', 'i386-softmmu', 'x86_64-softmmu' ] 158e49c0ef6SPaolo Bonziniunpack_edk2_blobs = false 159e49c0ef6SPaolo Bonziniforeach target : edk2_targets 160e49c0ef6SPaolo Bonzini if target in target_dirs 161e49c0ef6SPaolo Bonzini bzip2 = find_program('bzip2', required: get_option('install_blobs')) 162e49c0ef6SPaolo Bonzini unpack_edk2_blobs = bzip2.found() 163e49c0ef6SPaolo Bonzini break 164eae9a1d1SPhilippe Mathieu-Daudé endif 165e49c0ef6SPaolo Bonziniendforeach 16645b545ddSPhilippe Mathieu-Daudé 1679c29b741SPaolo Bonzinidtrace = not_found 1689c29b741SPaolo Bonzinistap = not_found 1699c29b741SPaolo Bonziniif 'dtrace' in get_option('trace_backends') 1709c29b741SPaolo Bonzini dtrace = find_program('dtrace', required: true) 1719c29b741SPaolo Bonzini stap = find_program('stap', required: false) 1729c29b741SPaolo Bonzini if stap.found() 1739c29b741SPaolo Bonzini # Workaround to avoid dtrace(1) producing a file with 'hidden' symbol 1749c29b741SPaolo Bonzini # visibility. Define STAP_SDT_V2 to produce 'default' symbol visibility 1759c29b741SPaolo Bonzini # instead. QEMU --enable-modules depends on this because the SystemTap 1769c29b741SPaolo Bonzini # semaphores are linked into the main binary and not the module's shared 1779c29b741SPaolo Bonzini # object. 1789c29b741SPaolo Bonzini add_global_arguments('-DSTAP_SDT_V2', 179e5134024SPaolo Bonzini native: false, language: all_languages) 1809c29b741SPaolo Bonzini endif 1819c29b741SPaolo Bonziniendif 1829c29b741SPaolo Bonzini 18340c909f5SPaolo Bonziniif get_option('iasl') == '' 18440c909f5SPaolo Bonzini iasl = find_program('iasl', required: false) 18540c909f5SPaolo Bonzinielse 18640c909f5SPaolo Bonzini iasl = find_program(get_option('iasl'), required: true) 18740c909f5SPaolo Bonziniendif 18840c909f5SPaolo Bonzini 189201e8ed7SPaolo Bonzini################## 190201e8ed7SPaolo Bonzini# Compiler flags # 191201e8ed7SPaolo Bonzini################## 192201e8ed7SPaolo Bonzini 193*a988b4c5SPaolo Bonzini# default flags for all hosts 194*a988b4c5SPaolo Bonzini# We use -fwrapv to tell the compiler that we require a C dialect where 195*a988b4c5SPaolo Bonzini# left shift of signed integers is well defined and has the expected 196*a988b4c5SPaolo Bonzini# 2s-complement style results. (Both clang and gcc agree that it 197*a988b4c5SPaolo Bonzini# provides these semantics.) 198*a988b4c5SPaolo Bonzini 199*a988b4c5SPaolo Bonziniqemu_common_flags = [ 200*a988b4c5SPaolo Bonzini '-D_GNU_SOURCE', '-D_FILE_OFFSET_BITS=64', '-D_LARGEFILE_SOURCE', 201*a988b4c5SPaolo Bonzini '-fno-strict-aliasing', '-fno-common', '-fwrapv' ] 202d67212d4SPaolo Bonziniqemu_cflags = [] 203911d4caaSPaolo Bonziniqemu_ldflags = [] 2048cc2d231SPaolo Bonzini 205*a988b4c5SPaolo Bonziniif targetos == 'darwin' 206*a988b4c5SPaolo Bonzini # Disable attempts to use ObjectiveC features in os/object.h since they 207*a988b4c5SPaolo Bonzini # won't work when we're compiling with gcc as a C compiler. 208*a988b4c5SPaolo Bonzini qemu_common_flags += '-DOS_OBJECT_USE_OBJC=0' 209*a988b4c5SPaolo Bonzinielif targetos == 'solaris' 210*a988b4c5SPaolo Bonzini # needed for CMSG_ macros in sys/socket.h 211*a988b4c5SPaolo Bonzini qemu_common_flags += '-D_XOPEN_SOURCE=600' 212*a988b4c5SPaolo Bonzini # needed for TIOCWIN* defines in termios.h 213*a988b4c5SPaolo Bonzini qemu_common_flags += '-D__EXTENSIONS__' 214*a988b4c5SPaolo Bonzinielif targetos == 'haiku' 215*a988b4c5SPaolo Bonzini qemu_common_flags += ['-DB_USE_POSITIVE_POSIX_ERRORS', '-D_BSD_SOURCE', '-fPIC'] 216*a988b4c5SPaolo Bonziniendif 217*a988b4c5SPaolo Bonzini 218*a988b4c5SPaolo Bonzini# __sync_fetch_and_and requires at least -march=i486. Many toolchains 219*a988b4c5SPaolo Bonzini# use i686 as default anyway, but for those that don't, an explicit 220*a988b4c5SPaolo Bonzini# specification is necessary 221*a988b4c5SPaolo Bonziniif host_arch == 'i386' and not cc.links(''' 222*a988b4c5SPaolo Bonzini static int sfaa(int *ptr) 223*a988b4c5SPaolo Bonzini { 224*a988b4c5SPaolo Bonzini return __sync_fetch_and_and(ptr, 0); 225*a988b4c5SPaolo Bonzini } 226*a988b4c5SPaolo Bonzini 227*a988b4c5SPaolo Bonzini int main(void) 228*a988b4c5SPaolo Bonzini { 229*a988b4c5SPaolo Bonzini int val = 42; 230*a988b4c5SPaolo Bonzini val = __sync_val_compare_and_swap(&val, 0, 1); 231*a988b4c5SPaolo Bonzini sfaa(&val); 232*a988b4c5SPaolo Bonzini return val; 233*a988b4c5SPaolo Bonzini }''') 234*a988b4c5SPaolo Bonzini qemu_common_flags = ['-march=i486'] + qemu_common_flags 235*a988b4c5SPaolo Bonziniendif 236*a988b4c5SPaolo Bonzini 237d67212d4SPaolo Bonziniif get_option('gprof') 238d67212d4SPaolo Bonzini qemu_common_flags += ['-p'] 239d67212d4SPaolo Bonzini qemu_ldflags += ['-p'] 240d67212d4SPaolo Bonziniendif 241d67212d4SPaolo Bonzini 242a0cbd2e8SPaolo Bonziniif get_option('prefer_static') 243e4333d14SPaolo Bonzini qemu_ldflags += get_option('b_pie') ? '-static-pie' : '-static' 244e4333d14SPaolo Bonziniendif 245e4333d14SPaolo Bonzini 246*a988b4c5SPaolo Bonzini# Meson currently only handles pie as a boolean for now, so if the user 247*a988b4c5SPaolo Bonzini# has explicitly disabled PIE we need to extend our cflags. 248*a988b4c5SPaolo Bonziniif not get_option('b_pie') 249*a988b4c5SPaolo Bonzini qemu_common_flags += cc.get_supported_arguments('-fno-pie') 250*a988b4c5SPaolo Bonzini if not get_option('prefer_static') 251*a988b4c5SPaolo Bonzini # No PIE is implied by -static which we added above. 252*a988b4c5SPaolo Bonzini qemu_ldflags += cc.get_supported_link_arguments('-no-pie') 253*a988b4c5SPaolo Bonzini endif 254*a988b4c5SPaolo Bonziniendif 255*a988b4c5SPaolo Bonzini 256911d4caaSPaolo Bonziniif not get_option('stack_protector').disabled() 257911d4caaSPaolo Bonzini stack_protector_probe = ''' 258911d4caaSPaolo Bonzini int main(int argc, char *argv[]) 259911d4caaSPaolo Bonzini { 260911d4caaSPaolo Bonzini char arr[64], *p = arr, *c = argv[argc - 1]; 261911d4caaSPaolo Bonzini while (*c) { 262911d4caaSPaolo Bonzini *p++ = *c++; 263911d4caaSPaolo Bonzini } 264911d4caaSPaolo Bonzini return 0; 265911d4caaSPaolo Bonzini }''' 266911d4caaSPaolo Bonzini have_stack_protector = false 267911d4caaSPaolo Bonzini foreach arg : ['-fstack-protector-strong', '-fstack-protector-all'] 268911d4caaSPaolo Bonzini # We need to check both a compile and a link, since some compiler 269911d4caaSPaolo Bonzini # setups fail only on a .c->.o compile and some only at link time 270911d4caaSPaolo Bonzini if cc.compiles(stack_protector_probe, args: ['-Werror', arg]) and \ 271911d4caaSPaolo Bonzini cc.links(stack_protector_probe, args: ['-Werror', arg]) 272911d4caaSPaolo Bonzini have_stack_protector = true 273911d4caaSPaolo Bonzini qemu_cflags += arg 274911d4caaSPaolo Bonzini qemu_ldflags += arg 275911d4caaSPaolo Bonzini break 276911d4caaSPaolo Bonzini endif 277911d4caaSPaolo Bonzini endforeach 278911d4caaSPaolo Bonzini get_option('stack_protector') \ 279911d4caaSPaolo Bonzini .require(have_stack_protector, error_message: 'Stack protector not supported') 280911d4caaSPaolo Bonziniendif 281911d4caaSPaolo Bonzini 2826739825aSPaolo Bonzinicoroutine_backend = get_option('coroutine_backend') 2836739825aSPaolo Bonziniucontext_probe = ''' 2846739825aSPaolo Bonzini #include <ucontext.h> 2856739825aSPaolo Bonzini #ifdef __stub_makecontext 2866739825aSPaolo Bonzini #error Ignoring glibc stub makecontext which will always fail 2876739825aSPaolo Bonzini #endif 2886739825aSPaolo Bonzini int main(void) { makecontext(0, 0, 0); return 0; }''' 2896739825aSPaolo Bonzini 2906739825aSPaolo Bonzini# On Windows the only valid backend is the Windows specific one. 2916739825aSPaolo Bonzini# For POSIX prefer ucontext, but it's not always possible. The fallback 2926739825aSPaolo Bonzini# is sigcontext. 2936739825aSPaolo Bonzinisupported_backends = [] 2946739825aSPaolo Bonziniif targetos == 'windows' 2956739825aSPaolo Bonzini supported_backends += ['windows'] 2966739825aSPaolo Bonzinielse 2976739825aSPaolo Bonzini if targetos != 'darwin' and cc.links(ucontext_probe) 2986739825aSPaolo Bonzini supported_backends += ['ucontext'] 2996739825aSPaolo Bonzini endif 3006739825aSPaolo Bonzini supported_backends += ['sigaltstack'] 3016739825aSPaolo Bonziniendif 3026739825aSPaolo Bonzini 3036739825aSPaolo Bonziniif coroutine_backend == 'auto' 3046739825aSPaolo Bonzini coroutine_backend = supported_backends[0] 3056739825aSPaolo Bonzinielif coroutine_backend not in supported_backends 3066739825aSPaolo Bonzini error('"@0@" backend requested but not available. Available backends: @1@' \ 3076739825aSPaolo Bonzini .format(coroutine_backend, ', '.join(supported_backends))) 3086739825aSPaolo Bonziniendif 3096739825aSPaolo Bonzini 310721fa5e5SPaolo Bonzini# Compiles if SafeStack *not* enabled 311721fa5e5SPaolo Bonzinisafe_stack_probe = ''' 312721fa5e5SPaolo Bonzini int main(void) 313721fa5e5SPaolo Bonzini { 314721fa5e5SPaolo Bonzini #if defined(__has_feature) 315721fa5e5SPaolo Bonzini #if __has_feature(safe_stack) 316721fa5e5SPaolo Bonzini #error SafeStack Enabled 317721fa5e5SPaolo Bonzini #endif 318721fa5e5SPaolo Bonzini #endif 319721fa5e5SPaolo Bonzini return 0; 320721fa5e5SPaolo Bonzini }''' 321721fa5e5SPaolo Bonziniif get_option('safe_stack') != not cc.compiles(safe_stack_probe) 322721fa5e5SPaolo Bonzini safe_stack_arg = get_option('safe_stack') ? '-fsanitize=safe-stack' : '-fno-sanitize=safe-stack' 323721fa5e5SPaolo Bonzini if get_option('safe_stack') != not cc.compiles(safe_stack_probe, args: safe_stack_arg) 324721fa5e5SPaolo Bonzini error(get_option('safe_stack') \ 325721fa5e5SPaolo Bonzini ? 'SafeStack not supported by your compiler' \ 326721fa5e5SPaolo Bonzini : 'Cannot disable SafeStack') 327721fa5e5SPaolo Bonzini endif 328721fa5e5SPaolo Bonzini qemu_cflags += safe_stack_arg 329721fa5e5SPaolo Bonzini qemu_ldflags += safe_stack_arg 330721fa5e5SPaolo Bonziniendif 3316739825aSPaolo Bonziniif get_option('safe_stack') and coroutine_backend != 'ucontext' 332721fa5e5SPaolo Bonzini error('SafeStack is only supported with the ucontext coroutine backend') 333721fa5e5SPaolo Bonziniendif 334721fa5e5SPaolo Bonzini 33534f983d8SPaolo Bonziniif get_option('sanitizers') 33634f983d8SPaolo Bonzini if cc.has_argument('-fsanitize=address') 33734f983d8SPaolo Bonzini qemu_cflags = ['-fsanitize=address'] + qemu_cflags 33834f983d8SPaolo Bonzini qemu_ldflags = ['-fsanitize=address'] + qemu_ldflags 33934f983d8SPaolo Bonzini endif 34034f983d8SPaolo Bonzini 34134f983d8SPaolo Bonzini # Detect static linking issue with ubsan - https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84285 34234f983d8SPaolo Bonzini if cc.links('int main(int argc, char **argv) { return argc + 1; }', 34334f983d8SPaolo Bonzini args: [qemu_ldflags, '-fsanitize=undefined']) 34434f983d8SPaolo Bonzini qemu_cflags = ['-fsanitize=undefined'] + qemu_cflags 34534f983d8SPaolo Bonzini qemu_ldflags = ['-fsanitize=undefined'] + qemu_ldflags 34634f983d8SPaolo Bonzini endif 34734f983d8SPaolo Bonziniendif 34834f983d8SPaolo Bonzini 34934f983d8SPaolo Bonzini# Thread sanitizer is, for now, much noisier than the other sanitizers; 35034f983d8SPaolo Bonzini# keep it separate until that is not the case. 35134f983d8SPaolo Bonziniif get_option('tsan') 35234f983d8SPaolo Bonzini if get_option('sanitizers') 35334f983d8SPaolo Bonzini error('TSAN is not supported with other sanitizers') 35434f983d8SPaolo Bonzini endif 35534f983d8SPaolo Bonzini if not cc.has_function('__tsan_create_fiber', 35634f983d8SPaolo Bonzini args: '-fsanitize=thread', 35734f983d8SPaolo Bonzini prefix: '#include <sanitizer/tsan_interface.h>') 35834f983d8SPaolo Bonzini error('Cannot enable TSAN due to missing fiber annotation interface') 35934f983d8SPaolo Bonzini endif 36034f983d8SPaolo Bonzini qemu_cflags = ['-fsanitize=thread'] + qemu_cflags 36134f983d8SPaolo Bonzini qemu_ldflags = ['-fsanitize=thread'] + qemu_ldflags 36234f983d8SPaolo Bonziniendif 36334f983d8SPaolo Bonzini 364e4333d14SPaolo Bonzini# Detect support for PT_GNU_RELRO + DT_BIND_NOW. 365e4333d14SPaolo Bonzini# The combination is known as "full relro", because .got.plt is read-only too. 366e4333d14SPaolo Bonziniqemu_ldflags += cc.get_supported_link_arguments('-Wl,-z,relro', '-Wl,-z,now') 367e4333d14SPaolo Bonzini 368d2147e04SPaolo Bonziniif targetos == 'windows' 369d2147e04SPaolo Bonzini qemu_ldflags += cc.get_supported_link_arguments('-Wl,--no-seh', '-Wl,--nxcompat') 3702d73fa74SPaolo Bonzini qemu_ldflags += cc.get_supported_link_arguments('-Wl,--dynamicbase', '-Wl,--high-entropy-va') 371d2147e04SPaolo Bonziniendif 372d2147e04SPaolo Bonzini 373d67212d4SPaolo Bonzini# Exclude --warn-common with TSan to suppress warnings from the TSan libraries. 37434f983d8SPaolo Bonziniif targetos != 'sunos' and not get_option('tsan') 375d67212d4SPaolo Bonzini qemu_ldflags += cc.get_supported_link_arguments('-Wl,--warn-common') 376c55cf6abSPaolo Bonziniendif 377c55cf6abSPaolo Bonzini 378ff9ed62bSAlexander Bulekov# Specify linker-script with add_project_link_arguments so that it is not placed 379ff9ed62bSAlexander Bulekov# within a linker --start-group/--end-group pair 380537b7248SPaolo Bonziniif get_option('fuzzing') 381537b7248SPaolo Bonzini # Specify a filter to only instrument code that is directly related to 382537b7248SPaolo Bonzini # virtual-devices. 383537b7248SPaolo Bonzini configure_file(output: 'instrumentation-filter', 384537b7248SPaolo Bonzini input: 'scripts/oss-fuzz/instrumentation-filter-template', 385537b7248SPaolo Bonzini copy: true) 386aa4f3a3bSAlexander Bulekov 387aa4f3a3bSAlexander Bulekov if cc.compiles('int main () { return 0; }', 388aa4f3a3bSAlexander Bulekov name: '-fsanitize-coverage-allowlist=/dev/null', 389e56d0970SAlexander Bulekov args: ['-fsanitize-coverage-allowlist=/dev/null', 390e56d0970SAlexander Bulekov '-fsanitize-coverage=trace-pc'] ) 391d67212d4SPaolo Bonzini qemu_common_flags += ['-fsanitize-coverage-allowlist=instrumentation-filter'] 392aa4f3a3bSAlexander Bulekov endif 393537b7248SPaolo Bonzini 394537b7248SPaolo Bonzini if get_option('fuzzing_engine') == '' 395537b7248SPaolo Bonzini # Add CFLAGS to tell clang to add fuzzer-related instrumentation to all the 396537b7248SPaolo Bonzini # compiled code. To build non-fuzzer binaries with --enable-fuzzing, link 397537b7248SPaolo Bonzini # everything with fsanitize=fuzzer-no-link. Otherwise, the linker will be 398537b7248SPaolo Bonzini # unable to bind the fuzzer-related callbacks added by instrumentation. 399d67212d4SPaolo Bonzini qemu_common_flags += ['-fsanitize=fuzzer-no-link'] 400d67212d4SPaolo Bonzini qemu_ldflags += ['-fsanitize=fuzzer-no-link'] 401537b7248SPaolo Bonzini # For the actual fuzzer binaries, we need to link against the libfuzzer 402537b7248SPaolo Bonzini # library. They need to be configurable, to support OSS-Fuzz 403537b7248SPaolo Bonzini fuzz_exe_ldflags = ['-fsanitize=fuzzer'] 404537b7248SPaolo Bonzini else 405537b7248SPaolo Bonzini # LIB_FUZZING_ENGINE was set; assume we are running on OSS-Fuzz, and 406537b7248SPaolo Bonzini # the needed CFLAGS have already been provided 407537b7248SPaolo Bonzini fuzz_exe_ldflags = get_option('fuzzing_engine').split() 408537b7248SPaolo Bonzini endif 409ff9ed62bSAlexander Bulekovendif 410ff9ed62bSAlexander Bulekov 411d67212d4SPaolo Bonziniadd_global_arguments(qemu_common_flags, native: false, language: all_languages) 412d67212d4SPaolo Bonziniadd_global_link_arguments(qemu_ldflags, native: false, language: all_languages) 413d67212d4SPaolo Bonzini 41495caf1fbSPaolo Bonzini# Collect warnings that we want to enable 41595caf1fbSPaolo Bonzini 41695caf1fbSPaolo Bonziniwarn_flags = [ 41795caf1fbSPaolo Bonzini '-Wundef', 41895caf1fbSPaolo Bonzini '-Wwrite-strings', 41995caf1fbSPaolo Bonzini '-Wmissing-prototypes', 42095caf1fbSPaolo Bonzini '-Wstrict-prototypes', 42195caf1fbSPaolo Bonzini '-Wredundant-decls', 42295caf1fbSPaolo Bonzini '-Wold-style-declaration', 42395caf1fbSPaolo Bonzini '-Wold-style-definition', 42495caf1fbSPaolo Bonzini '-Wtype-limits', 42595caf1fbSPaolo Bonzini '-Wformat-security', 42695caf1fbSPaolo Bonzini '-Wformat-y2k', 42795caf1fbSPaolo Bonzini '-Winit-self', 42895caf1fbSPaolo Bonzini '-Wignored-qualifiers', 42995caf1fbSPaolo Bonzini '-Wempty-body', 43095caf1fbSPaolo Bonzini '-Wnested-externs', 43195caf1fbSPaolo Bonzini '-Wendif-labels', 43295caf1fbSPaolo Bonzini '-Wexpansion-to-defined', 43395caf1fbSPaolo Bonzini '-Wimplicit-fallthrough=2', 43495caf1fbSPaolo Bonzini '-Wmissing-format-attribute', 43595caf1fbSPaolo Bonzini '-Wno-initializer-overrides', 43695caf1fbSPaolo Bonzini '-Wno-missing-include-dirs', 43795caf1fbSPaolo Bonzini '-Wno-shift-negative-value', 43895caf1fbSPaolo Bonzini '-Wno-string-plus-int', 43995caf1fbSPaolo Bonzini '-Wno-typedef-redefinition', 44095caf1fbSPaolo Bonzini '-Wno-tautological-type-limit-compare', 44195caf1fbSPaolo Bonzini '-Wno-psabi', 44295caf1fbSPaolo Bonzini '-Wno-gnu-variable-sized-type-not-at-end', 44395caf1fbSPaolo Bonzini] 44495caf1fbSPaolo Bonzini 44595caf1fbSPaolo Bonziniif targetos != 'darwin' 44695caf1fbSPaolo Bonzini warn_flags += ['-Wthread-safety'] 44795caf1fbSPaolo Bonziniendif 44895caf1fbSPaolo Bonzini 449b485458eSPaolo Bonzini# Check that the C++ compiler exists and works with the C compiler. 450b485458eSPaolo Bonzinilink_language = 'c' 451b485458eSPaolo Bonzinilinker = cc 452b485458eSPaolo Bonziniqemu_cxxflags = [] 453e5134024SPaolo Bonziniif 'cpp' in all_languages 45495caf1fbSPaolo Bonzini qemu_cxxflags = ['-D__STDC_LIMIT_MACROS', '-D__STDC_CONSTANT_MACROS', '-D__STDC_FORMAT_MACROS'] + qemu_cflags 455b485458eSPaolo Bonzini if cxx.links(files('scripts/main.c'), args: qemu_cflags) 456b485458eSPaolo Bonzini link_language = 'cpp' 457b485458eSPaolo Bonzini linker = cxx 458b485458eSPaolo Bonzini else 459b485458eSPaolo Bonzini message('C++ compiler does not work with C compiler') 460b485458eSPaolo Bonzini message('Disabling C++-specific optional code') 461b485458eSPaolo Bonzini endif 462b485458eSPaolo Bonziniendif 463b485458eSPaolo Bonzini 46434f983d8SPaolo Bonzini# clang does not support glibc + FORTIFY_SOURCE (is it still true?) 46534f983d8SPaolo Bonziniif get_option('optimization') != '0' and targetos == 'linux' 46634f983d8SPaolo Bonzini if cc.get_id() == 'gcc' 46734f983d8SPaolo Bonzini qemu_cflags += ['-U_FORTIFY_SOURCE', '-D_FORTIFY_SOURCE=2'] 46834f983d8SPaolo Bonzini endif 46934f983d8SPaolo Bonzini if 'cpp' in all_languages and cxx.get_id() == 'gcc' 47034f983d8SPaolo Bonzini qemu_cxxflags += ['-U_FORTIFY_SOURCE', '-D_FORTIFY_SOURCE=2'] 47134f983d8SPaolo Bonzini endif 47234f983d8SPaolo Bonziniendif 47334f983d8SPaolo Bonzini 474d67212d4SPaolo Bonziniadd_project_arguments(qemu_cflags, native: false, language: 'c') 47595caf1fbSPaolo Bonziniadd_project_arguments(cc.get_supported_arguments(warn_flags), native: false, language: 'c') 47695caf1fbSPaolo Bonziniif 'cpp' in all_languages 477d67212d4SPaolo Bonzini add_project_arguments(qemu_cxxflags, native: false, language: 'cpp') 47895caf1fbSPaolo Bonzini add_project_arguments(cxx.get_supported_arguments(warn_flags), native: false, language: 'cpp') 47995caf1fbSPaolo Bonziniendif 48095caf1fbSPaolo Bonziniif 'objc' in all_languages 48195caf1fbSPaolo Bonzini # Note sanitizer flags are not applied to Objective-C sources! 48295caf1fbSPaolo Bonzini add_project_arguments(objc.get_supported_arguments(warn_flags), native: false, language: 'objc') 48395caf1fbSPaolo Bonziniendif 4841e6e616dSPaolo Bonziniif targetos == 'linux' 4851e6e616dSPaolo Bonzini add_project_arguments('-isystem', meson.current_source_dir() / 'linux-headers', 4861e6e616dSPaolo Bonzini '-isystem', 'linux-headers', 487e5134024SPaolo Bonzini language: all_languages) 4881e6e616dSPaolo Bonziniendif 4891e6e616dSPaolo Bonzini 49023a77b2dSPaolo Bonziniadd_project_arguments('-iquote', '.', 4911e6e616dSPaolo Bonzini '-iquote', meson.current_source_dir(), 4921e6e616dSPaolo Bonzini '-iquote', meson.current_source_dir() / 'include', 493e5134024SPaolo Bonzini language: all_languages) 494a5665051SPaolo Bonzini 495deb62371SPaolo Bonzinisparse = find_program('cgcc', required: get_option('sparse')) 496deb62371SPaolo Bonziniif sparse.found() 497968b4db3SPaolo Bonzini run_target('sparse', 498968b4db3SPaolo Bonzini command: [find_program('scripts/check_sparse.py'), 499deb62371SPaolo Bonzini 'compile_commands.json', sparse.full_path(), '-Wbitwise', 500deb62371SPaolo Bonzini '-Wno-transparent-union', '-Wno-old-initializer', 501deb62371SPaolo Bonzini '-Wno-non-pointer-null']) 502968b4db3SPaolo Bonziniendif 503968b4db3SPaolo Bonzini 5046ec0e15dSPaolo Bonzini########################################### 5056ec0e15dSPaolo Bonzini# Target-specific checks and dependencies # 5066ec0e15dSPaolo Bonzini########################################### 5076ec0e15dSPaolo Bonzini 508b7a75c8cSPaolo Bonzini# Fuzzing 509537b7248SPaolo Bonziniif get_option('fuzzing') and get_option('fuzzing_engine') == '' and \ 510537b7248SPaolo Bonzini not cc.links(''' 511537b7248SPaolo Bonzini #include <stdint.h> 512537b7248SPaolo Bonzini #include <sys/types.h> 513537b7248SPaolo Bonzini int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size); 514537b7248SPaolo Bonzini int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { return 0; } 515537b7248SPaolo Bonzini ''', 516537b7248SPaolo Bonzini args: ['-Werror', '-fsanitize=fuzzer']) 517537b7248SPaolo Bonzini error('Your compiler does not support -fsanitize=fuzzer') 518537b7248SPaolo Bonziniendif 519537b7248SPaolo Bonzini 520b7a75c8cSPaolo Bonzini# Tracing backends 5219c29b741SPaolo Bonziniif 'ftrace' in get_option('trace_backends') and targetos != 'linux' 5229c29b741SPaolo Bonzini error('ftrace is supported only on Linux') 5239c29b741SPaolo Bonziniendif 5249c29b741SPaolo Bonziniif 'syslog' in get_option('trace_backends') and not cc.compiles(''' 5259c29b741SPaolo Bonzini #include <syslog.h> 5269c29b741SPaolo Bonzini int main(void) { 5279c29b741SPaolo Bonzini openlog("qemu", LOG_PID, LOG_DAEMON); 5289c29b741SPaolo Bonzini syslog(LOG_INFO, "configure"); 5299c29b741SPaolo Bonzini return 0; 5309c29b741SPaolo Bonzini }''') 5319c29b741SPaolo Bonzini error('syslog is not supported on this system') 5329c29b741SPaolo Bonziniendif 5339c29b741SPaolo Bonzini 534b7a75c8cSPaolo Bonzini# Miscellaneous Linux-only features 535a436d6d4SPaolo Bonziniget_option('mpath') \ 536a436d6d4SPaolo Bonzini .require(targetos == 'linux', error_message: 'Multipath is supported only on Linux') 5376ec0e15dSPaolo Bonzini 538a436d6d4SPaolo Bonzinimultiprocess_allowed = get_option('multiprocess') \ 539a436d6d4SPaolo Bonzini .require(targetos == 'linux', error_message: 'Multiprocess QEMU is supported only on Linux') \ 540a436d6d4SPaolo Bonzini .allowed() 541106ad1f9SPaolo Bonzini 54255116968SJagannathan Ramanvfio_user_server_allowed = get_option('vfio_user_server') \ 54355116968SJagannathan Raman .require(targetos == 'linux', error_message: 'vfio-user server is supported only on Linux') \ 54455116968SJagannathan Raman .allowed() 54555116968SJagannathan Raman 5460d04c4c9SPaolo Bonzinihave_tpm = get_option('tpm') \ 5470d04c4c9SPaolo Bonzini .require(targetos != 'windows', error_message: 'TPM emulation only available on POSIX systems') \ 5480d04c4c9SPaolo Bonzini .allowed() 5490d04c4c9SPaolo Bonzini 5502a3129a3SPaolo Bonzini# vhost 5512df89d54SPaolo Bonzinihave_vhost_user = get_option('vhost_user') \ 5522df89d54SPaolo Bonzini .disable_auto_if(targetos != 'linux') \ 5532df89d54SPaolo Bonzini .require(targetos != 'windows', 5542df89d54SPaolo Bonzini error_message: 'vhost-user is not available on Windows').allowed() 5552df89d54SPaolo Bonzinihave_vhost_vdpa = get_option('vhost_vdpa') \ 5562df89d54SPaolo Bonzini .require(targetos == 'linux', 5572df89d54SPaolo Bonzini error_message: 'vhost-vdpa is only available on Linux').allowed() 5582df89d54SPaolo Bonzinihave_vhost_kernel = get_option('vhost_kernel') \ 5592df89d54SPaolo Bonzini .require(targetos == 'linux', 5602df89d54SPaolo Bonzini error_message: 'vhost-kernel is only available on Linux').allowed() 5612df89d54SPaolo Bonzinihave_vhost_user_crypto = get_option('vhost_crypto') \ 5622df89d54SPaolo Bonzini .require(have_vhost_user, 5632df89d54SPaolo Bonzini error_message: 'vhost-crypto requires vhost-user to be enabled').allowed() 5642df89d54SPaolo Bonzini 56543b6d7eeSPaolo Bonzinihave_vhost = have_vhost_user or have_vhost_vdpa or have_vhost_kernel 5662df89d54SPaolo Bonzini 5672df89d54SPaolo Bonzinihave_vhost_net_user = have_vhost_user and get_option('vhost_net').allowed() 5682df89d54SPaolo Bonzinihave_vhost_net_vdpa = have_vhost_vdpa and get_option('vhost_net').allowed() 5692df89d54SPaolo Bonzinihave_vhost_net_kernel = have_vhost_kernel and get_option('vhost_net').allowed() 5702df89d54SPaolo Bonzinihave_vhost_net = have_vhost_net_kernel or have_vhost_net_user or have_vhost_net_vdpa 5712a3129a3SPaolo Bonzini 572b7a75c8cSPaolo Bonzini# Target-specific libraries and flags 5737fa1c635SPaolo Bonzinilibm = cc.find_library('m', required: false) 5746d7c7c2dSPaolo Bonzinithreads = dependency('threads') 575a81df1b6SPaolo Bonziniutil = cc.find_library('util', required: false) 5764a96337dSPaolo Bonziniwinmm = [] 577a81df1b6SPaolo Bonzinisocket = [] 57804c6f1e7SMarc-André Lureauversion_res = [] 579d92989aaSMarc-André Lureaucoref = [] 580d92989aaSMarc-André Lureauiokit = [] 581b6c7cfd4SPaolo Bonziniemulator_link_args = [] 58274a414a1SReinoud Zandijknvmm =not_found 5838a19980eSPaolo Bonzinihvf = not_found 58423011f44SMarc-André Lureaumidl = not_found 58523011f44SMarc-André Lureauwidl = not_found 586cf60ccc3SAkihiko Odakipathcch = not_found 587a6305081SPaolo Bonzinihost_dsosuf = '.so' 588a81df1b6SPaolo Bonziniif targetos == 'windows' 58923011f44SMarc-André Lureau midl = find_program('midl', required: false) 59023011f44SMarc-André Lureau widl = find_program('widl', required: false) 591cf60ccc3SAkihiko Odaki pathcch = cc.find_library('pathcch') 592a81df1b6SPaolo Bonzini socket = cc.find_library('ws2_32') 5934a96337dSPaolo Bonzini winmm = cc.find_library('winmm') 59404c6f1e7SMarc-André Lureau 59504c6f1e7SMarc-André Lureau win = import('windows') 59604c6f1e7SMarc-André Lureau version_res = win.compile_resources('version.rc', 59704c6f1e7SMarc-André Lureau depend_files: files('pc-bios/qemu-nsis.ico'), 59804c6f1e7SMarc-André Lureau include_directories: include_directories('.')) 599a6305081SPaolo Bonzini host_dsosuf = '.dll' 600d92989aaSMarc-André Lureauelif targetos == 'darwin' 601d92989aaSMarc-André Lureau coref = dependency('appleframeworks', modules: 'CoreFoundation') 60214176c8dSJoelle van Dyne iokit = dependency('appleframeworks', modules: 'IOKit', required: false) 603a6305081SPaolo Bonzini host_dsosuf = '.dylib' 604cfad62f1SPaolo Bonzinielif targetos == 'sunos' 605cfad62f1SPaolo Bonzini socket = [cc.find_library('socket'), 606cfad62f1SPaolo Bonzini cc.find_library('nsl'), 607cfad62f1SPaolo Bonzini cc.find_library('resolv')] 608cfad62f1SPaolo Bonzinielif targetos == 'haiku' 609cfad62f1SPaolo Bonzini socket = [cc.find_library('posix_error_mapper'), 610cfad62f1SPaolo Bonzini cc.find_library('network'), 611cfad62f1SPaolo Bonzini cc.find_library('bsd')] 612b6c7cfd4SPaolo Bonzinielif targetos == 'openbsd' 61343a363aeSPaolo Bonzini if get_option('tcg').allowed() and target_dirs.length() > 0 614b6c7cfd4SPaolo Bonzini # Disable OpenBSD W^X if available 615b6c7cfd4SPaolo Bonzini emulator_link_args = cc.get_supported_link_arguments('-Wl,-z,wxneeded') 616b6c7cfd4SPaolo Bonzini endif 617a81df1b6SPaolo Bonziniendif 6186ec0e15dSPaolo Bonzini 619b7a75c8cSPaolo Bonzini# Target-specific configuration of accelerators 6208a19980eSPaolo Bonziniaccelerators = [] 62143a363aeSPaolo Bonziniif get_option('kvm').allowed() and targetos == 'linux' 6228a19980eSPaolo Bonzini accelerators += 'CONFIG_KVM' 6238a19980eSPaolo Bonziniendif 62443a363aeSPaolo Bonziniif get_option('whpx').allowed() and targetos == 'windows' 62557e2a1f8SSunil Muthuswamy if get_option('whpx').enabled() and host_machine.cpu() != 'x86_64' 6268a19980eSPaolo Bonzini error('WHPX requires 64-bit host') 6278a19980eSPaolo Bonzini elif cc.has_header('WinHvPlatform.h', required: get_option('whpx')) and \ 6288a19980eSPaolo Bonzini cc.has_header('WinHvEmulation.h', required: get_option('whpx')) 6298a19980eSPaolo Bonzini accelerators += 'CONFIG_WHPX' 6308a19980eSPaolo Bonzini endif 6318a19980eSPaolo Bonziniendif 63243a363aeSPaolo Bonziniif get_option('hvf').allowed() 6338a19980eSPaolo Bonzini hvf = dependency('appleframeworks', modules: 'Hypervisor', 6348a19980eSPaolo Bonzini required: get_option('hvf')) 6358a19980eSPaolo Bonzini if hvf.found() 6368a19980eSPaolo Bonzini accelerators += 'CONFIG_HVF' 6378a19980eSPaolo Bonzini endif 6388a19980eSPaolo Bonziniendif 63943a363aeSPaolo Bonziniif get_option('hax').allowed() 6408a19980eSPaolo Bonzini if get_option('hax').enabled() or targetos in ['windows', 'darwin', 'netbsd'] 6418a19980eSPaolo Bonzini accelerators += 'CONFIG_HAX' 6428a19980eSPaolo Bonzini endif 6438a19980eSPaolo Bonziniendif 64474a414a1SReinoud Zandijkif targetos == 'netbsd' 64574a414a1SReinoud Zandijk nvmm = cc.find_library('nvmm', required: get_option('nvmm')) 64674a414a1SReinoud Zandijk if nvmm.found() 64774a414a1SReinoud Zandijk accelerators += 'CONFIG_NVMM' 64874a414a1SReinoud Zandijk endif 64974a414a1SReinoud Zandijkendif 65023a77b2dSPaolo Bonzini 651823eb013SPaolo Bonzinitcg_arch = host_arch 65243a363aeSPaolo Bonziniif get_option('tcg').allowed() 653823eb013SPaolo Bonzini if host_arch == 'unknown' 65423a77b2dSPaolo Bonzini if get_option('tcg_interpreter') 655f1f727acSPhilippe Mathieu-Daudé warning('Unsupported CPU @0@, will use TCG with TCI (slow)'.format(cpu)) 6568a19980eSPaolo Bonzini else 6578a19980eSPaolo Bonzini error('Unsupported CPU @0@, try --enable-tcg-interpreter'.format(cpu)) 6588a19980eSPaolo Bonzini endif 659fa2f7b0bSPhilippe Mathieu-Daudé elif get_option('tcg_interpreter') 6601c282da3SPhilippe Mathieu-Daudé warning('Use of the TCG interpreter is not recommended on this host') 661fa2f7b0bSPhilippe Mathieu-Daudé warning('architecture. There is a native TCG execution backend available') 662fa2f7b0bSPhilippe Mathieu-Daudé warning('which provides substantially better performance and reliability.') 663fa2f7b0bSPhilippe Mathieu-Daudé warning('It is strongly recommended to remove the --enable-tcg-interpreter') 664fa2f7b0bSPhilippe Mathieu-Daudé warning('configuration option on this architecture to use the native') 665fa2f7b0bSPhilippe Mathieu-Daudé warning('backend.') 6668a19980eSPaolo Bonzini endif 66723a77b2dSPaolo Bonzini if get_option('tcg_interpreter') 66823a77b2dSPaolo Bonzini tcg_arch = 'tci' 669ed145144SRichard Henderson config_host += { 'CONFIG_TCG_INTERPRETER': 'y' } 670823eb013SPaolo Bonzini elif host_arch == 'x86_64' 67123a77b2dSPaolo Bonzini tcg_arch = 'i386' 672823eb013SPaolo Bonzini elif host_arch == 'ppc64' 67323a77b2dSPaolo Bonzini tcg_arch = 'ppc' 67423a77b2dSPaolo Bonzini endif 67523a77b2dSPaolo Bonzini add_project_arguments('-iquote', meson.current_source_dir() / 'tcg' / tcg_arch, 676e5134024SPaolo Bonzini language: all_languages) 67723a77b2dSPaolo Bonzini 6788a19980eSPaolo Bonzini accelerators += 'CONFIG_TCG' 6798a19980eSPaolo Bonzini config_host += { 'CONFIG_TCG': 'y' } 6808a19980eSPaolo Bonziniendif 6818a19980eSPaolo Bonzini 6828a19980eSPaolo Bonziniif 'CONFIG_KVM' not in accelerators and get_option('kvm').enabled() 6838a19980eSPaolo Bonzini error('KVM not available on this platform') 6848a19980eSPaolo Bonziniendif 6858a19980eSPaolo Bonziniif 'CONFIG_HVF' not in accelerators and get_option('hvf').enabled() 6868a19980eSPaolo Bonzini error('HVF not available on this platform') 6878a19980eSPaolo Bonziniendif 68874a414a1SReinoud Zandijkif 'CONFIG_NVMM' not in accelerators and get_option('nvmm').enabled() 68974a414a1SReinoud Zandijk error('NVMM not available on this platform') 69074a414a1SReinoud Zandijkendif 6918a19980eSPaolo Bonziniif 'CONFIG_WHPX' not in accelerators and get_option('whpx').enabled() 6928a19980eSPaolo Bonzini error('WHPX not available on this platform') 6938a19980eSPaolo Bonziniendif 694b4e312e9SPaolo Bonzini 6956ec0e15dSPaolo Bonzini################ 6966ec0e15dSPaolo Bonzini# Dependencies # 6976ec0e15dSPaolo Bonzini################ 6986ec0e15dSPaolo Bonzini 699fc9a809eSPaolo Bonzini# When bumping glib minimum version, please check also whether to increase 700fc9a809eSPaolo Bonzini# the _WIN32_WINNT setting in osdep.h according to the value from glib 701fc9a809eSPaolo Bonziniglib_req_ver = '>=2.56.0' 702fc9a809eSPaolo Bonziniglib_pc = dependency('glib-2.0', version: glib_req_ver, required: true, 703fc9a809eSPaolo Bonzini method: 'pkg-config') 704fc9a809eSPaolo Bonziniglib_cflags = [] 7056002711cSPaolo Bonziniif enable_modules 706fc9a809eSPaolo Bonzini gmodule = dependency('gmodule-export-2.0', version: glib_req_ver, required: true, 707fc9a809eSPaolo Bonzini method: 'pkg-config') 708fc9a809eSPaolo Bonzinielif config_host.has_key('CONFIG_PLUGIN') 709fc9a809eSPaolo Bonzini gmodule = dependency('gmodule-no-export-2.0', version: glib_req_ver, required: true, 710fc9a809eSPaolo Bonzini method: 'pkg-config') 711fc9a809eSPaolo Bonzinielse 712fc9a809eSPaolo Bonzini gmodule = not_found 713e3feb2ccSEmilio Cotaendif 714953d5a9eSMarc-André Lureau 715fc9a809eSPaolo Bonzini# This workaround is required due to a bug in pkg-config file for glib as it 716fc9a809eSPaolo Bonzini# doesn't define GLIB_STATIC_COMPILATION for pkg-config --static 717fc9a809eSPaolo Bonziniif targetos == 'windows' and get_option('prefer_static') 718fc9a809eSPaolo Bonzini glib_cflags += ['-DGLIB_STATIC_COMPILATION'] 719fc9a809eSPaolo Bonziniendif 720fc9a809eSPaolo Bonzini 721fc9a809eSPaolo Bonzini# Sanity check that the current size_t matches the 722fc9a809eSPaolo Bonzini# size that glib thinks it should be. This catches 723fc9a809eSPaolo Bonzini# problems on multi-arch where people try to build 724fc9a809eSPaolo Bonzini# 32-bit QEMU while pointing at 64-bit glib headers 725fc9a809eSPaolo Bonzini 726fc9a809eSPaolo Bonziniif not cc.compiles(''' 727fc9a809eSPaolo Bonzini #include <glib.h> 728fc9a809eSPaolo Bonzini #include <unistd.h> 729fc9a809eSPaolo Bonzini 730fc9a809eSPaolo Bonzini #define QEMU_BUILD_BUG_ON(x) \ 731fc9a809eSPaolo Bonzini typedef char qemu_build_bug_on[(x)?-1:1] __attribute__((unused)); 732fc9a809eSPaolo Bonzini 733fc9a809eSPaolo Bonzini int main(void) { 734fc9a809eSPaolo Bonzini QEMU_BUILD_BUG_ON(sizeof(size_t) != GLIB_SIZEOF_SIZE_T); 735fc9a809eSPaolo Bonzini return 0; 736fc9a809eSPaolo Bonzini }''', dependencies: glib_pc, args: glib_cflags) 737fc9a809eSPaolo Bonzini error('''sizeof(size_t) doesn't match GLIB_SIZEOF_SIZE_T. 738fc9a809eSPaolo Bonzini You probably need to set PKG_CONFIG_LIBDIR" to point 739fc9a809eSPaolo Bonzini to the right pkg-config files for your build target.''') 740fc9a809eSPaolo Bonziniendif 741fc9a809eSPaolo Bonzini 742fc9a809eSPaolo Bonzini# Silence clang warnings triggered by glib < 2.57.2 743fc9a809eSPaolo Bonziniif not cc.compiles(''' 744fc9a809eSPaolo Bonzini #include <glib.h> 745fc9a809eSPaolo Bonzini typedef struct Foo { 746fc9a809eSPaolo Bonzini int i; 747fc9a809eSPaolo Bonzini } Foo; 748fc9a809eSPaolo Bonzini static void foo_free(Foo *f) 749fc9a809eSPaolo Bonzini { 750fc9a809eSPaolo Bonzini g_free(f); 751fc9a809eSPaolo Bonzini } 752fc9a809eSPaolo Bonzini G_DEFINE_AUTOPTR_CLEANUP_FUNC(Foo, foo_free) 753fc9a809eSPaolo Bonzini int main(void) { return 0; }''', dependencies: glib_pc, args: ['-Werror']) 754fc9a809eSPaolo Bonzini glib_cflags += cc.get_supported_arguments('-Wno-unused-function') 755fc9a809eSPaolo Bonziniendif 756fc9a809eSPaolo Bonziniglib = declare_dependency(dependencies: [glib_pc, gmodule], 757fc9a809eSPaolo Bonzini compile_args: glib_cflags, 758fc9a809eSPaolo Bonzini version: glib_pc.version()) 759fc9a809eSPaolo Bonzini 760fc9a809eSPaolo Bonzini# Check whether glib has gslice, which we have to avoid for correctness. 761fc9a809eSPaolo Bonzini# TODO: remove this check and the corresponding workaround (qtree) when 762fc9a809eSPaolo Bonzini# the minimum supported glib is >= 2.75.3 763fc9a809eSPaolo Bonziniglib_has_gslice = glib.version().version_compare('<2.75.3') 764fc9a809eSPaolo Bonzini 765fc9a809eSPaolo Bonzini# override glib dep to include the above refinements 766fc9a809eSPaolo Bonzinimeson.override_dependency('glib-2.0', glib) 767fc9a809eSPaolo Bonzini 768fc9a809eSPaolo Bonzini# The path to glib.h is added to all compilation commands. 769fc9a809eSPaolo Bonziniadd_project_dependencies(glib.partial_dependency(compile_args: true, includes: true), 770fc9a809eSPaolo Bonzini native: false, language: all_languages) 771fc9a809eSPaolo Bonzini 772a81df1b6SPaolo Bonzinigio = not_found 7737544060eSPaolo Bonzinigdbus_codegen = not_found 774bb2dc4b7SPaolo Bonzinigdbus_codegen_error = '@0@ requires gdbus-codegen, please install libgio' 7757544060eSPaolo Bonziniif not get_option('gio').auto() or have_system 7767544060eSPaolo Bonzini gio = dependency('gio-2.0', required: get_option('gio'), 777063d5119SPaolo Bonzini method: 'pkg-config') 7787544060eSPaolo Bonzini if gio.found() and not cc.links(''' 7797544060eSPaolo Bonzini #include <gio/gio.h> 7807544060eSPaolo Bonzini int main(void) 7817544060eSPaolo Bonzini { 7827544060eSPaolo Bonzini g_dbus_proxy_new_sync(0, 0, 0, 0, 0, 0, 0, 0); 7837544060eSPaolo Bonzini return 0; 7847544060eSPaolo Bonzini }''', dependencies: [glib, gio]) 7857544060eSPaolo Bonzini if get_option('gio').enabled() 7867544060eSPaolo Bonzini error('The installed libgio is broken for static linking') 787a81df1b6SPaolo Bonzini endif 7887544060eSPaolo Bonzini gio = not_found 7897544060eSPaolo Bonzini endif 7907544060eSPaolo Bonzini if gio.found() 7917544060eSPaolo Bonzini gdbus_codegen = find_program(gio.get_variable('gdbus_codegen'), 7927544060eSPaolo Bonzini required: get_option('gio')) 7937544060eSPaolo Bonzini gio_unix = dependency('gio-unix-2.0', required: get_option('gio'), 794063d5119SPaolo Bonzini method: 'pkg-config') 7957544060eSPaolo Bonzini gio = declare_dependency(dependencies: [gio, gio_unix], 7967544060eSPaolo Bonzini version: gio.version()) 7977544060eSPaolo Bonzini endif 7987544060eSPaolo Bonziniendif 799bb2dc4b7SPaolo Bonziniif gdbus_codegen.found() and get_option('cfi') 800bb2dc4b7SPaolo Bonzini gdbus_codegen = not_found 801bb2dc4b7SPaolo Bonzini gdbus_codegen_error = '@0@ uses gdbus-codegen, which does not support control flow integrity' 802bb2dc4b7SPaolo Bonziniendif 8037544060eSPaolo Bonzini 804a81df1b6SPaolo Bonzinilttng = not_found 8059c29b741SPaolo Bonziniif 'ust' in get_option('trace_backends') 806e32aaa5aSMarc-André Lureau lttng = dependency('lttng-ust', required: true, version: '>= 2.1', 807063d5119SPaolo Bonzini method: 'pkg-config') 808a81df1b6SPaolo Bonziniendif 809b7612f45SPaolo Bonzinipixman = not_found 810b7612f45SPaolo Bonziniif have_system or have_tools 811b7612f45SPaolo Bonzini pixman = dependency('pixman-1', required: have_system, version:'>=0.21.8', 812063d5119SPaolo Bonzini method: 'pkg-config') 813b7612f45SPaolo Bonziniendif 814063d5119SPaolo Bonzinizlib = dependency('zlib', required: true) 81553c22b68SPaolo Bonzini 816ff66f3e5SPaolo Bonzinilibaio = not_found 817ff66f3e5SPaolo Bonziniif not get_option('linux_aio').auto() or have_block 818ff66f3e5SPaolo Bonzini libaio = cc.find_library('aio', has_headers: ['libaio.h'], 819063d5119SPaolo Bonzini required: get_option('linux_aio')) 820ff66f3e5SPaolo Bonziniendif 821354081d4SLeonardo Bras 822354081d4SLeonardo Braslinux_io_uring_test = ''' 823354081d4SLeonardo Bras #include <liburing.h> 824354081d4SLeonardo Bras #include <linux/errqueue.h> 825354081d4SLeonardo Bras 826354081d4SLeonardo Bras int main(void) { return 0; }''' 827354081d4SLeonardo Bras 8285e5733e5SMarc-André Lureaulinux_io_uring = not_found 82953c22b68SPaolo Bonziniif not get_option('linux_io_uring').auto() or have_block 830a41b4fdcSDaniel P. Berrangé linux_io_uring = dependency('liburing', version: '>=0.3', 831a41b4fdcSDaniel P. Berrangé required: get_option('linux_io_uring'), 832063d5119SPaolo Bonzini method: 'pkg-config') 833354081d4SLeonardo Bras if not cc.links(linux_io_uring_test) 834354081d4SLeonardo Bras linux_io_uring = not_found 8355e5733e5SMarc-André Lureau endif 836354081d4SLeonardo Brasendif 837354081d4SLeonardo Bras 8385e5733e5SMarc-André Lureaulibnfs = not_found 83930045c05SPaolo Bonziniif not get_option('libnfs').auto() or have_block 84030045c05SPaolo Bonzini libnfs = dependency('libnfs', version: '>=1.9.3', 84130045c05SPaolo Bonzini required: get_option('libnfs'), 842063d5119SPaolo Bonzini method: 'pkg-config') 8435e5733e5SMarc-André Lureauendif 844f7f2d651SPaolo Bonzini 845f7f2d651SPaolo Bonzinilibattr_test = ''' 846f7f2d651SPaolo Bonzini #include <stddef.h> 847f7f2d651SPaolo Bonzini #include <sys/types.h> 848f7f2d651SPaolo Bonzini #ifdef CONFIG_LIBATTR 849f7f2d651SPaolo Bonzini #include <attr/xattr.h> 850f7f2d651SPaolo Bonzini #else 851f7f2d651SPaolo Bonzini #include <sys/xattr.h> 852f7f2d651SPaolo Bonzini #endif 853f7f2d651SPaolo Bonzini int main(void) { getxattr(NULL, NULL, NULL, 0); setxattr(NULL, NULL, NULL, 0, 0); return 0; }''' 854f7f2d651SPaolo Bonzini 855ec0d5893SMarc-André Lureaulibattr = not_found 856f7f2d651SPaolo Bonzinihave_old_libattr = false 85743a363aeSPaolo Bonziniif get_option('attr').allowed() 858f7f2d651SPaolo Bonzini if cc.links(libattr_test) 859f7f2d651SPaolo Bonzini libattr = declare_dependency() 860f7f2d651SPaolo Bonzini else 861f7f2d651SPaolo Bonzini libattr = cc.find_library('attr', has_headers: ['attr/xattr.h'], 862063d5119SPaolo Bonzini required: get_option('attr')) 863f7f2d651SPaolo Bonzini if libattr.found() and not \ 864f7f2d651SPaolo Bonzini cc.links(libattr_test, dependencies: libattr, args: '-DCONFIG_LIBATTR') 865f7f2d651SPaolo Bonzini libattr = not_found 866f7f2d651SPaolo Bonzini if get_option('attr').enabled() 867f7f2d651SPaolo Bonzini error('could not link libattr') 868f7f2d651SPaolo Bonzini else 869f7f2d651SPaolo Bonzini warning('could not link libattr, disabling') 870ec0d5893SMarc-André Lureau endif 871f7f2d651SPaolo Bonzini else 872f7f2d651SPaolo Bonzini have_old_libattr = libattr.found() 873f7f2d651SPaolo Bonzini endif 874f7f2d651SPaolo Bonzini endif 875f7f2d651SPaolo Bonziniendif 876f7f2d651SPaolo Bonzini 87752eaefd3SAkihiko Odakicocoa = dependency('appleframeworks', modules: ['Cocoa', 'CoreVideo'], 87852eaefd3SAkihiko Odaki required: get_option('cocoa')) 879c1ec4941SPaolo Bonzini 880e2c1d78dSVladislav Yaroshchukvmnet = dependency('appleframeworks', modules: 'vmnet', required: get_option('vmnet')) 881e2c1d78dSVladislav Yaroshchukif vmnet.found() and not cc.has_header_symbol('vmnet/vmnet.h', 882e2c1d78dSVladislav Yaroshchuk 'VMNET_BRIDGED_MODE', 883e2c1d78dSVladislav Yaroshchuk dependencies: vmnet) 884e2c1d78dSVladislav Yaroshchuk vmnet = not_found 885e2c1d78dSVladislav Yaroshchuk if get_option('vmnet').enabled() 886e2c1d78dSVladislav Yaroshchuk error('vmnet.framework API is outdated') 887e2c1d78dSVladislav Yaroshchuk else 888e2c1d78dSVladislav Yaroshchuk warning('vmnet.framework API is outdated, disabling') 889e2c1d78dSVladislav Yaroshchuk endif 890e2c1d78dSVladislav Yaroshchukendif 891e2c1d78dSVladislav Yaroshchuk 8923f99cf57SPaolo Bonziniseccomp = not_found 89373422d95SMichal Privoznikseccomp_has_sysrawrc = false 89490835c2bSPaolo Bonziniif not get_option('seccomp').auto() or have_system or have_tools 89590835c2bSPaolo Bonzini seccomp = dependency('libseccomp', version: '>=2.3.0', 89690835c2bSPaolo Bonzini required: get_option('seccomp'), 897063d5119SPaolo Bonzini method: 'pkg-config') 89873422d95SMichal Privoznik if seccomp.found() 89973422d95SMichal Privoznik seccomp_has_sysrawrc = cc.has_header_symbol('seccomp.h', 90073422d95SMichal Privoznik 'SCMP_FLTATR_API_SYSRAWRC', 90173422d95SMichal Privoznik dependencies: seccomp) 90273422d95SMichal Privoznik endif 9033f99cf57SPaolo Bonziniendif 904727c8bb8SPaolo Bonzini 9053f99cf57SPaolo Bonzinilibcap_ng = not_found 906727c8bb8SPaolo Bonziniif not get_option('cap_ng').auto() or have_system or have_tools 907727c8bb8SPaolo Bonzini libcap_ng = cc.find_library('cap-ng', has_headers: ['cap-ng.h'], 908063d5119SPaolo Bonzini required: get_option('cap_ng')) 9093f99cf57SPaolo Bonziniendif 910727c8bb8SPaolo Bonziniif libcap_ng.found() and not cc.links(''' 911727c8bb8SPaolo Bonzini #include <cap-ng.h> 912727c8bb8SPaolo Bonzini int main(void) 913727c8bb8SPaolo Bonzini { 914727c8bb8SPaolo Bonzini capng_capability_to_name(CAPNG_EFFECTIVE); 915727c8bb8SPaolo Bonzini return 0; 916727c8bb8SPaolo Bonzini }''', dependencies: libcap_ng) 917727c8bb8SPaolo Bonzini libcap_ng = not_found 918727c8bb8SPaolo Bonzini if get_option('cap_ng').enabled() 919727c8bb8SPaolo Bonzini error('could not link libcap-ng') 920727c8bb8SPaolo Bonzini else 921727c8bb8SPaolo Bonzini warning('could not link libcap-ng, disabling') 922727c8bb8SPaolo Bonzini endif 923727c8bb8SPaolo Bonziniendif 924727c8bb8SPaolo Bonzini 9251917ec6dSPaolo Bonziniif get_option('xkbcommon').auto() and not have_system and not have_tools 9261917ec6dSPaolo Bonzini xkbcommon = not_found 9271917ec6dSPaolo Bonzinielse 9281917ec6dSPaolo Bonzini xkbcommon = dependency('xkbcommon', required: get_option('xkbcommon'), 929063d5119SPaolo Bonzini method: 'pkg-config') 930ade60d4fSMarc-André Lureauendif 931e1723999SPaolo Bonzini 9325890258aSThomas Huthslirp = not_found 9335890258aSThomas Huthif not get_option('slirp').auto() or have_system 9345890258aSThomas Huth slirp = dependency('slirp', required: get_option('slirp'), 935063d5119SPaolo Bonzini method: 'pkg-config') 9365890258aSThomas Huth # slirp < 4.7 is incompatible with CFI support in QEMU. This is because 9375890258aSThomas Huth # it passes function pointers within libslirp as callbacks for timers. 9385890258aSThomas Huth # When using a system-wide shared libslirp, the type information for the 9395890258aSThomas Huth # callback is missing and the timer call produces a false positive with CFI. 9405890258aSThomas Huth # Do not use the "version" keyword argument to produce a better error. 9415890258aSThomas Huth # with control-flow integrity. 9425890258aSThomas Huth if get_option('cfi') and slirp.found() and slirp.version().version_compare('<4.7') 9435890258aSThomas Huth if get_option('slirp').enabled() 9445890258aSThomas Huth error('Control-Flow Integrity requires libslirp 4.7.') 9455890258aSThomas Huth else 9465890258aSThomas Huth warning('Cannot use libslirp since Control-Flow Integrity requires libslirp >= 4.7.') 9475890258aSThomas Huth slirp = not_found 9485890258aSThomas Huth endif 9495890258aSThomas Huth endif 9505890258aSThomas Huthendif 9515890258aSThomas Huth 952cdaf0722SMarc-André Lureauvde = not_found 953e1723999SPaolo Bonziniif not get_option('vde').auto() or have_system or have_tools 954e1723999SPaolo Bonzini vde = cc.find_library('vdeplug', has_headers: ['libvdeplug.h'], 955063d5119SPaolo Bonzini required: get_option('vde')) 956e1723999SPaolo Bonziniendif 957e1723999SPaolo Bonziniif vde.found() and not cc.links(''' 958e1723999SPaolo Bonzini #include <libvdeplug.h> 959e1723999SPaolo Bonzini int main(void) 960e1723999SPaolo Bonzini { 961e1723999SPaolo Bonzini struct vde_open_args a = {0, 0, 0}; 962e1723999SPaolo Bonzini char s[] = ""; 963e1723999SPaolo Bonzini vde_open(s, s, &a); 964e1723999SPaolo Bonzini return 0; 965e1723999SPaolo Bonzini }''', dependencies: vde) 966e1723999SPaolo Bonzini vde = not_found 967e1723999SPaolo Bonzini if get_option('cap_ng').enabled() 968e1723999SPaolo Bonzini error('could not link libvdeplug') 969e1723999SPaolo Bonzini else 970e1723999SPaolo Bonzini warning('could not link libvdeplug, disabling') 971e1723999SPaolo Bonzini endif 972cdaf0722SMarc-André Lureauendif 97387430d5bSPaolo Bonzini 974478e943fSPaolo Bonzinipulse = not_found 97587430d5bSPaolo Bonziniif not get_option('pa').auto() or (targetos == 'linux' and have_system) 97687430d5bSPaolo Bonzini pulse = dependency('libpulse', required: get_option('pa'), 977063d5119SPaolo Bonzini method: 'pkg-config') 978478e943fSPaolo Bonziniendif 979478e943fSPaolo Bonzinialsa = not_found 98087430d5bSPaolo Bonziniif not get_option('alsa').auto() or (targetos == 'linux' and have_system) 98187430d5bSPaolo Bonzini alsa = dependency('alsa', required: get_option('alsa'), 982063d5119SPaolo Bonzini method: 'pkg-config') 983478e943fSPaolo Bonziniendif 984478e943fSPaolo Bonzinijack = not_found 98587430d5bSPaolo Bonziniif not get_option('jack').auto() or have_system 98687430d5bSPaolo Bonzini jack = dependency('jack', required: get_option('jack'), 987063d5119SPaolo Bonzini method: 'pkg-config') 988478e943fSPaolo Bonziniendif 989c2d3d1c2SDorinda Basseypipewire = not_found 990c2d3d1c2SDorinda Basseyif not get_option('pipewire').auto() or (targetos == 'linux' and have_system) 991c2d3d1c2SDorinda Bassey pipewire = dependency('libpipewire-0.3', version: '>=0.3.60', 992c2d3d1c2SDorinda Bassey required: get_option('pipewire'), 993063d5119SPaolo Bonzini method: 'pkg-config') 994c2d3d1c2SDorinda Basseyendif 995663df1ccSAlexandre Ratchovsndio = not_found 996663df1ccSAlexandre Ratchovif not get_option('sndio').auto() or have_system 997663df1ccSAlexandre Ratchov sndio = dependency('sndio', required: get_option('sndio'), 998063d5119SPaolo Bonzini method: 'pkg-config') 999663df1ccSAlexandre Ratchovendif 100087430d5bSPaolo Bonzini 100158d3f3ffSGerd Hoffmannspice_protocol = not_found 10023f0a5d55SMarc-André Lureauif not get_option('spice_protocol').auto() or have_system 10035c167b53SMarkus Armbruster spice_protocol = dependency('spice-protocol', version: '>=0.14.0', 10043f0a5d55SMarc-André Lureau required: get_option('spice_protocol'), 1005063d5119SPaolo Bonzini method: 'pkg-config') 10062634733cSPaolo Bonziniendif 10073f0a5d55SMarc-André Lureauspice = not_found 10083f0a5d55SMarc-André Lureauif not get_option('spice').auto() or have_system 100934d55725SMarkus Armbruster spice = dependency('spice-server', version: '>=0.14.0', 10103f0a5d55SMarc-André Lureau required: get_option('spice'), 1011063d5119SPaolo Bonzini method: 'pkg-config') 101258d3f3ffSGerd Hoffmannendif 10133f0a5d55SMarc-André Lureauspice_headers = spice.partial_dependency(compile_args: true, includes: true) 10143f0a5d55SMarc-André Lureau 10155ee24e78SMarc-André Lureaurt = cc.find_library('rt', required: false) 1016a399f914SPaolo Bonzini 101799650b62SPaolo Bonzinilibiscsi = not_found 10189db405a3SPaolo Bonziniif not get_option('libiscsi').auto() or have_block 10199db405a3SPaolo Bonzini libiscsi = dependency('libiscsi', version: '>=1.9.0', 10209db405a3SPaolo Bonzini required: get_option('libiscsi'), 1021063d5119SPaolo Bonzini method: 'pkg-config') 102299650b62SPaolo Bonziniendif 10235e5733e5SMarc-André Lureauzstd = not_found 1024b1def33dSPaolo Bonziniif not get_option('zstd').auto() or have_block 1025b1def33dSPaolo Bonzini zstd = dependency('libzstd', version: '>=1.4.0', 1026b1def33dSPaolo Bonzini required: get_option('zstd'), 1027063d5119SPaolo Bonzini method: 'pkg-config') 10285e5733e5SMarc-André Lureauendif 1029ea458960SMarc-André Lureauvirgl = not_found 10300265fe9eSPaolo Bonzini 10310265fe9eSPaolo Bonzinihave_vhost_user_gpu = have_tools and targetos == 'linux' and pixman.found() 10320265fe9eSPaolo Bonziniif not get_option('virglrenderer').auto() or have_system or have_vhost_user_gpu 1033587d59d6SPaolo Bonzini virgl = dependency('virglrenderer', 1034587d59d6SPaolo Bonzini method: 'pkg-config', 1035063d5119SPaolo Bonzini required: get_option('virglrenderer')) 1036ea458960SMarc-André Lureauendif 1037fd66dbd4SStefan Hajnocziblkio = not_found 1038fd66dbd4SStefan Hajnocziif not get_option('blkio').auto() or have_block 1039fd66dbd4SStefan Hajnoczi blkio = dependency('blkio', 1040fd66dbd4SStefan Hajnoczi method: 'pkg-config', 1041063d5119SPaolo Bonzini required: get_option('blkio')) 1042fd66dbd4SStefan Hajnocziendif 10431d7bb6abSMarc-André Lureaucurl = not_found 1044f9cd86feSPaolo Bonziniif not get_option('curl').auto() or have_block 1045f9cd86feSPaolo Bonzini curl = dependency('libcurl', version: '>=7.29.0', 1046f9cd86feSPaolo Bonzini method: 'pkg-config', 1047063d5119SPaolo Bonzini required: get_option('curl')) 10481d7bb6abSMarc-André Lureauendif 1049f15bff25SPaolo Bonzinilibudev = not_found 1050f01496a3SPaolo Bonziniif targetos == 'linux' and (have_system or have_tools) 10516ec0e15dSPaolo Bonzini libudev = dependency('libudev', 1052a0fbbb6eSPaolo Bonzini method: 'pkg-config', 1053063d5119SPaolo Bonzini required: get_option('libudev')) 1054f15bff25SPaolo Bonziniendif 10556ec0e15dSPaolo Bonzini 10565c53015aSPaolo Bonzinimpathlibs = [libudev] 10576ec0e15dSPaolo Bonzinimpathpersist = not_found 10586ec0e15dSPaolo Bonzinimpathpersist_new_api = false 105943a363aeSPaolo Bonziniif targetos == 'linux' and have_tools and get_option('mpath').allowed() 10606ec0e15dSPaolo Bonzini mpath_test_source_new = ''' 10616ec0e15dSPaolo Bonzini #include <libudev.h> 10626ec0e15dSPaolo Bonzini #include <mpath_persist.h> 10636ec0e15dSPaolo Bonzini unsigned mpath_mx_alloc_len = 1024; 10646ec0e15dSPaolo Bonzini int logsink; 10656ec0e15dSPaolo Bonzini static struct config *multipath_conf; 10666ec0e15dSPaolo Bonzini extern struct udev *udev; 10676ec0e15dSPaolo Bonzini extern struct config *get_multipath_config(void); 10686ec0e15dSPaolo Bonzini extern void put_multipath_config(struct config *conf); 10696ec0e15dSPaolo Bonzini struct udev *udev; 10706ec0e15dSPaolo Bonzini struct config *get_multipath_config(void) { return multipath_conf; } 10716ec0e15dSPaolo Bonzini void put_multipath_config(struct config *conf) { } 10726ec0e15dSPaolo Bonzini int main(void) { 10736ec0e15dSPaolo Bonzini udev = udev_new(); 10746ec0e15dSPaolo Bonzini multipath_conf = mpath_lib_init(); 10756ec0e15dSPaolo Bonzini return 0; 10766ec0e15dSPaolo Bonzini }''' 10776ec0e15dSPaolo Bonzini mpath_test_source_old = ''' 10786ec0e15dSPaolo Bonzini #include <libudev.h> 10796ec0e15dSPaolo Bonzini #include <mpath_persist.h> 10806ec0e15dSPaolo Bonzini unsigned mpath_mx_alloc_len = 1024; 10816ec0e15dSPaolo Bonzini int logsink; 10826ec0e15dSPaolo Bonzini int main(void) { 10836ec0e15dSPaolo Bonzini struct udev *udev = udev_new(); 10846ec0e15dSPaolo Bonzini mpath_lib_init(udev); 10856ec0e15dSPaolo Bonzini return 0; 10866ec0e15dSPaolo Bonzini }''' 10875c53015aSPaolo Bonzini libmpathpersist = cc.find_library('mpathpersist', 1088063d5119SPaolo Bonzini required: get_option('mpath')) 10895c53015aSPaolo Bonzini if libmpathpersist.found() 10905c53015aSPaolo Bonzini mpathlibs += libmpathpersist 1091a0cbd2e8SPaolo Bonzini if get_option('prefer_static') 109243b43a40SPaolo Bonzini mpathlibs += cc.find_library('devmapper', 1093063d5119SPaolo Bonzini required: get_option('mpath')) 109443b43a40SPaolo Bonzini endif 109543b43a40SPaolo Bonzini mpathlibs += cc.find_library('multipath', 1096063d5119SPaolo Bonzini required: get_option('mpath')) 109743b43a40SPaolo Bonzini foreach lib: mpathlibs 109843b43a40SPaolo Bonzini if not lib.found() 109943b43a40SPaolo Bonzini mpathlibs = [] 110043b43a40SPaolo Bonzini break 110143b43a40SPaolo Bonzini endif 110243b43a40SPaolo Bonzini endforeach 11035c53015aSPaolo Bonzini if mpathlibs.length() == 0 11045c53015aSPaolo Bonzini msg = 'Dependencies missing for libmpathpersist' 11055c53015aSPaolo Bonzini elif cc.links(mpath_test_source_new, dependencies: mpathlibs) 11066ec0e15dSPaolo Bonzini mpathpersist = declare_dependency(dependencies: mpathlibs) 11076ec0e15dSPaolo Bonzini mpathpersist_new_api = true 11086ec0e15dSPaolo Bonzini elif cc.links(mpath_test_source_old, dependencies: mpathlibs) 11096ec0e15dSPaolo Bonzini mpathpersist = declare_dependency(dependencies: mpathlibs) 11106ec0e15dSPaolo Bonzini else 11115c53015aSPaolo Bonzini msg = 'Cannot detect libmpathpersist API' 11125c53015aSPaolo Bonzini endif 11135c53015aSPaolo Bonzini if not mpathpersist.found() 11146ec0e15dSPaolo Bonzini if get_option('mpath').enabled() 11155c53015aSPaolo Bonzini error(msg) 11166ec0e15dSPaolo Bonzini else 11175c53015aSPaolo Bonzini warning(msg + ', disabling') 11186ec0e15dSPaolo Bonzini endif 11196ec0e15dSPaolo Bonzini endif 11206ec0e15dSPaolo Bonzini endif 11216ec0e15dSPaolo Bonziniendif 11226ec0e15dSPaolo Bonzini 11235285e593SYonggang Luoiconv = not_found 112430fe76b1SPaolo Bonzinicurses = not_found 112543a363aeSPaolo Bonziniif have_system and get_option('curses').allowed() 11265285e593SYonggang Luo curses_test = ''' 1127fbab8cc2SStefan Weil #if defined(__APPLE__) || defined(__OpenBSD__) 1128fbab8cc2SStefan Weil #define _XOPEN_SOURCE_EXTENDED 1 1129fbab8cc2SStefan Weil #endif 11305285e593SYonggang Luo #include <locale.h> 11315285e593SYonggang Luo #include <curses.h> 11325285e593SYonggang Luo #include <wchar.h> 11335285e593SYonggang Luo int main(void) { 11345285e593SYonggang Luo wchar_t wch = L'w'; 11355285e593SYonggang Luo setlocale(LC_ALL, ""); 11365285e593SYonggang Luo resize_term(0, 0); 11375285e593SYonggang Luo addwstr(L"wide chars\n"); 11385285e593SYonggang Luo addnwstr(&wch, 1); 11395285e593SYonggang Luo add_wch(WACS_DEGREE); 11405285e593SYonggang Luo return 0; 11415285e593SYonggang Luo }''' 1142925a40dfSPaolo Bonzini 1143ca31e307SYonggang Luo curses_dep_list = targetos == 'windows' ? ['ncurses', 'ncursesw'] : ['ncursesw'] 11446d322635SPaolo Bonzini curses = dependency(curses_dep_list, 11455285e593SYonggang Luo required: false, 1146063d5119SPaolo Bonzini method: 'pkg-config') 1147925a40dfSPaolo Bonzini msg = get_option('curses').enabled() ? 'curses library not found' : '' 1148fbab8cc2SStefan Weil curses_compile_args = ['-DNCURSES_WIDECHAR=1'] 1149925a40dfSPaolo Bonzini if curses.found() 11500dbce6efSPaolo Bonzini if cc.links(curses_test, args: curses_compile_args, dependencies: [curses]) 1151bd3615d6SPaolo Bonzini curses = declare_dependency(compile_args: curses_compile_args, dependencies: [curses], 1152bd3615d6SPaolo Bonzini version: curses.version()) 1153925a40dfSPaolo Bonzini else 1154925a40dfSPaolo Bonzini msg = 'curses package not usable' 1155925a40dfSPaolo Bonzini curses = not_found 11565285e593SYonggang Luo endif 1157925a40dfSPaolo Bonzini endif 1158925a40dfSPaolo Bonzini if not curses.found() 1159925a40dfSPaolo Bonzini has_curses_h = cc.has_header('curses.h', args: curses_compile_args) 1160925a40dfSPaolo Bonzini if targetos != 'windows' and not has_curses_h 1161925a40dfSPaolo Bonzini message('Trying with /usr/include/ncursesw') 1162925a40dfSPaolo Bonzini curses_compile_args += ['-I/usr/include/ncursesw'] 1163925a40dfSPaolo Bonzini has_curses_h = cc.has_header('curses.h', args: curses_compile_args) 1164925a40dfSPaolo Bonzini endif 1165925a40dfSPaolo Bonzini if has_curses_h 1166925a40dfSPaolo Bonzini curses_libname_list = (targetos == 'windows' ? ['pdcurses'] : ['ncursesw', 'cursesw']) 1167925a40dfSPaolo Bonzini foreach curses_libname : curses_libname_list 11685285e593SYonggang Luo libcurses = cc.find_library(curses_libname, 1169063d5119SPaolo Bonzini required: false) 11705285e593SYonggang Luo if libcurses.found() 1171925a40dfSPaolo Bonzini if cc.links(curses_test, args: curses_compile_args, dependencies: libcurses) 1172925a40dfSPaolo Bonzini curses = declare_dependency(compile_args: curses_compile_args, 1173925a40dfSPaolo Bonzini dependencies: [libcurses]) 11745285e593SYonggang Luo break 1175925a40dfSPaolo Bonzini else 1176925a40dfSPaolo Bonzini msg = 'curses library not usable' 11775285e593SYonggang Luo endif 11785285e593SYonggang Luo endif 11795285e593SYonggang Luo endforeach 11805285e593SYonggang Luo endif 118130fe76b1SPaolo Bonzini endif 118243a363aeSPaolo Bonzini if get_option('iconv').allowed() 1183925a40dfSPaolo Bonzini foreach link_args : [ ['-liconv'], [] ] 1184925a40dfSPaolo Bonzini # Programs will be linked with glib and this will bring in libiconv on FreeBSD. 1185925a40dfSPaolo Bonzini # We need to use libiconv if available because mixing libiconv's headers with 1186925a40dfSPaolo Bonzini # the system libc does not work. 1187925a40dfSPaolo Bonzini # However, without adding glib to the dependencies -L/usr/local/lib will not be 1188925a40dfSPaolo Bonzini # included in the command line and libiconv will not be found. 1189925a40dfSPaolo Bonzini if cc.links(''' 1190925a40dfSPaolo Bonzini #include <iconv.h> 1191925a40dfSPaolo Bonzini int main(void) { 1192925a40dfSPaolo Bonzini iconv_t conv = iconv_open("WCHAR_T", "UCS-2"); 1193925a40dfSPaolo Bonzini return conv != (iconv_t) -1; 1194fc9a809eSPaolo Bonzini }''', args: link_args, dependencies: glib) 1195925a40dfSPaolo Bonzini iconv = declare_dependency(link_args: link_args, dependencies: glib) 1196925a40dfSPaolo Bonzini break 1197925a40dfSPaolo Bonzini endif 1198925a40dfSPaolo Bonzini endforeach 1199925a40dfSPaolo Bonzini endif 1200925a40dfSPaolo Bonzini if curses.found() and not iconv.found() 1201925a40dfSPaolo Bonzini if get_option('iconv').enabled() 1202925a40dfSPaolo Bonzini error('iconv not available') 1203925a40dfSPaolo Bonzini endif 1204925a40dfSPaolo Bonzini msg = 'iconv required for curses UI but not available' 1205925a40dfSPaolo Bonzini curses = not_found 1206925a40dfSPaolo Bonzini endif 1207925a40dfSPaolo Bonzini if not curses.found() and msg != '' 1208925a40dfSPaolo Bonzini if get_option('curses').enabled() 1209925a40dfSPaolo Bonzini error(msg) 12105285e593SYonggang Luo else 1211925a40dfSPaolo Bonzini warning(msg + ', disabling') 121230fe76b1SPaolo Bonzini endif 12135285e593SYonggang Luo endif 12145285e593SYonggang Luoendif 12155285e593SYonggang Luo 12162634733cSPaolo Bonzinibrlapi = not_found 12178c6d4ff4SPaolo Bonziniif not get_option('brlapi').auto() or have_system 12188c6d4ff4SPaolo Bonzini brlapi = cc.find_library('brlapi', has_headers: ['brlapi.h'], 1219063d5119SPaolo Bonzini required: get_option('brlapi')) 12208c6d4ff4SPaolo Bonzini if brlapi.found() and not cc.links(''' 12218c6d4ff4SPaolo Bonzini #include <brlapi.h> 12228c6d4ff4SPaolo Bonzini #include <stddef.h> 12238c6d4ff4SPaolo Bonzini int main(void) { return brlapi__openConnection (NULL, NULL, NULL); }''', dependencies: brlapi) 12248c6d4ff4SPaolo Bonzini brlapi = not_found 12258c6d4ff4SPaolo Bonzini if get_option('brlapi').enabled() 12268c6d4ff4SPaolo Bonzini error('could not link brlapi') 12278c6d4ff4SPaolo Bonzini else 12288c6d4ff4SPaolo Bonzini warning('could not link brlapi, disabling') 12298c6d4ff4SPaolo Bonzini endif 12308c6d4ff4SPaolo Bonzini endif 12312634733cSPaolo Bonziniendif 123235be72baSPaolo Bonzini 1233760e4327SPaolo Bonzinisdl = not_found 123464d3fec7SAkihiko Odakiif not get_option('sdl').auto() or have_system 1235063d5119SPaolo Bonzini sdl = dependency('sdl2', required: get_option('sdl')) 123635be72baSPaolo Bonzini sdl_image = not_found 1237760e4327SPaolo Bonziniendif 123835be72baSPaolo Bonziniif sdl.found() 123935be72baSPaolo Bonzini # work around 2.0.8 bug 124035be72baSPaolo Bonzini sdl = declare_dependency(compile_args: '-Wno-undef', 1241bd3615d6SPaolo Bonzini dependencies: sdl, 1242bd3615d6SPaolo Bonzini version: sdl.version()) 12437161a433SVolker Rümelin sdl_image = dependency('SDL2_image', required: get_option('sdl_image'), 1244063d5119SPaolo Bonzini method: 'pkg-config') 124535be72baSPaolo Bonzinielse 124635be72baSPaolo Bonzini if get_option('sdl_image').enabled() 1247a8dc2aceSSergei Trofimovich error('sdl-image required, but SDL was @0@'.format( 1248a8dc2aceSSergei Trofimovich get_option('sdl').disabled() ? 'disabled' : 'not found')) 12492634733cSPaolo Bonzini endif 125035be72baSPaolo Bonzini sdl_image = not_found 125135be72baSPaolo Bonziniendif 125235be72baSPaolo Bonzini 12535e5733e5SMarc-André Lureaurbd = not_found 1254fabd1e93SPaolo Bonziniif not get_option('rbd').auto() or have_block 1255063d5119SPaolo Bonzini librados = cc.find_library('rados', required: get_option('rbd')) 1256fabd1e93SPaolo Bonzini librbd = cc.find_library('rbd', has_headers: ['rbd/librbd.h'], 1257063d5119SPaolo Bonzini required: get_option('rbd')) 1258c518d6c2SPaolo Bonzini if librados.found() and librbd.found() 1259c518d6c2SPaolo Bonzini if cc.links(''' 1260fabd1e93SPaolo Bonzini #include <stdio.h> 1261fabd1e93SPaolo Bonzini #include <rbd/librbd.h> 1262fabd1e93SPaolo Bonzini int main(void) { 1263fabd1e93SPaolo Bonzini rados_t cluster; 1264fabd1e93SPaolo Bonzini rados_create(&cluster, NULL); 126548672ac0SPeter Lieven #if LIBRBD_VERSION_CODE < LIBRBD_VERSION(1, 12, 0) 126648672ac0SPeter Lieven #error 126748672ac0SPeter Lieven #endif 1268fabd1e93SPaolo Bonzini return 0; 1269fabd1e93SPaolo Bonzini }''', dependencies: [librbd, librados]) 1270fabd1e93SPaolo Bonzini rbd = declare_dependency(dependencies: [librbd, librados]) 1271c518d6c2SPaolo Bonzini elif get_option('rbd').enabled() 127248672ac0SPeter Lieven error('librbd >= 1.12.0 required') 1273c518d6c2SPaolo Bonzini else 127448672ac0SPeter Lieven warning('librbd >= 1.12.0 not found, disabling') 1275c518d6c2SPaolo Bonzini endif 12765e5733e5SMarc-André Lureau endif 1277fabd1e93SPaolo Bonziniendif 1278fabd1e93SPaolo Bonzini 12795e5733e5SMarc-André Lureauglusterfs = not_found 128008821ca2SPaolo Bonziniglusterfs_ftruncate_has_stat = false 128108821ca2SPaolo Bonziniglusterfs_iocb_has_stat = false 128208821ca2SPaolo Bonziniif not get_option('glusterfs').auto() or have_block 128308821ca2SPaolo Bonzini glusterfs = dependency('glusterfs-api', version: '>=3', 128408821ca2SPaolo Bonzini required: get_option('glusterfs'), 1285063d5119SPaolo Bonzini method: 'pkg-config') 128608821ca2SPaolo Bonzini if glusterfs.found() 128708821ca2SPaolo Bonzini glusterfs_ftruncate_has_stat = cc.links(''' 128808821ca2SPaolo Bonzini #include <glusterfs/api/glfs.h> 128908821ca2SPaolo Bonzini 129008821ca2SPaolo Bonzini int 129108821ca2SPaolo Bonzini main(void) 129208821ca2SPaolo Bonzini { 129308821ca2SPaolo Bonzini /* new glfs_ftruncate() passes two additional args */ 129408821ca2SPaolo Bonzini return glfs_ftruncate(NULL, 0, NULL, NULL); 129508821ca2SPaolo Bonzini } 129608821ca2SPaolo Bonzini ''', dependencies: glusterfs) 129708821ca2SPaolo Bonzini glusterfs_iocb_has_stat = cc.links(''' 129808821ca2SPaolo Bonzini #include <glusterfs/api/glfs.h> 129908821ca2SPaolo Bonzini 130008821ca2SPaolo Bonzini /* new glfs_io_cbk() passes two additional glfs_stat structs */ 130108821ca2SPaolo Bonzini static void 130208821ca2SPaolo Bonzini glusterfs_iocb(glfs_fd_t *fd, ssize_t ret, struct glfs_stat *prestat, struct glfs_stat *poststat, void *data) 130308821ca2SPaolo Bonzini {} 130408821ca2SPaolo Bonzini 130508821ca2SPaolo Bonzini int 130608821ca2SPaolo Bonzini main(void) 130708821ca2SPaolo Bonzini { 130808821ca2SPaolo Bonzini glfs_io_cbk iocb = &glusterfs_iocb; 130908821ca2SPaolo Bonzini iocb(NULL, 0 , NULL, NULL, NULL); 131008821ca2SPaolo Bonzini return 0; 131108821ca2SPaolo Bonzini } 131208821ca2SPaolo Bonzini ''', dependencies: glusterfs) 131308821ca2SPaolo Bonzini endif 13145e5733e5SMarc-André Lureauendif 1315e6a52b36SThomas Huth 13165e5733e5SMarc-André Lureaulibssh = not_found 1317e6a52b36SThomas Huthif not get_option('libssh').auto() or have_block 1318e6a52b36SThomas Huth libssh = dependency('libssh', version: '>=0.8.7', 1319e6a52b36SThomas Huth method: 'pkg-config', 1320063d5119SPaolo Bonzini required: get_option('libssh')) 13215e5733e5SMarc-André Lureauendif 1322e6a52b36SThomas Huth 13235e5733e5SMarc-André Lureaulibbzip2 = not_found 132429ba6116SPaolo Bonziniif not get_option('bzip2').auto() or have_block 132529ba6116SPaolo Bonzini libbzip2 = cc.find_library('bz2', has_headers: ['bzlib.h'], 1326063d5119SPaolo Bonzini required: get_option('bzip2')) 132729ba6116SPaolo Bonzini if libbzip2.found() and not cc.links(''' 132829ba6116SPaolo Bonzini #include <bzlib.h> 132929ba6116SPaolo Bonzini int main(void) { BZ2_bzlibVersion(); return 0; }''', dependencies: libbzip2) 133029ba6116SPaolo Bonzini libbzip2 = not_found 133129ba6116SPaolo Bonzini if get_option('bzip2').enabled() 133229ba6116SPaolo Bonzini error('could not link libbzip2') 133329ba6116SPaolo Bonzini else 133429ba6116SPaolo Bonzini warning('could not link libbzip2, disabling') 13355e5733e5SMarc-André Lureau endif 133629ba6116SPaolo Bonzini endif 13375e5733e5SMarc-André Lureauendif 1338ecea3696SPaolo Bonzini 13395e5733e5SMarc-André Lureauliblzfse = not_found 1340ecea3696SPaolo Bonziniif not get_option('lzfse').auto() or have_block 1341ecea3696SPaolo Bonzini liblzfse = cc.find_library('lzfse', has_headers: ['lzfse.h'], 1342063d5119SPaolo Bonzini required: get_option('lzfse')) 13435e5733e5SMarc-André Lureauendif 1344ecea3696SPaolo Bonziniif liblzfse.found() and not cc.links(''' 1345ecea3696SPaolo Bonzini #include <lzfse.h> 1346ecea3696SPaolo Bonzini int main(void) { lzfse_decode_scratch_size(); return 0; }''', dependencies: liblzfse) 1347ecea3696SPaolo Bonzini liblzfse = not_found 1348ecea3696SPaolo Bonzini if get_option('lzfse').enabled() 1349ecea3696SPaolo Bonzini error('could not link liblzfse') 1350ecea3696SPaolo Bonzini else 1351ecea3696SPaolo Bonzini warning('could not link liblzfse, disabling') 1352ecea3696SPaolo Bonzini endif 1353ecea3696SPaolo Bonziniendif 1354ecea3696SPaolo Bonzini 1355478e943fSPaolo Bonzinioss = not_found 135643a363aeSPaolo Bonziniif get_option('oss').allowed() and have_system 135787430d5bSPaolo Bonzini if not cc.has_header('sys/soundcard.h') 135887430d5bSPaolo Bonzini # not found 135987430d5bSPaolo Bonzini elif targetos == 'netbsd' 1360063d5119SPaolo Bonzini oss = cc.find_library('ossaudio', required: get_option('oss')) 136187430d5bSPaolo Bonzini else 136287430d5bSPaolo Bonzini oss = declare_dependency() 136387430d5bSPaolo Bonzini endif 136487430d5bSPaolo Bonzini 136587430d5bSPaolo Bonzini if not oss.found() 136687430d5bSPaolo Bonzini if get_option('oss').enabled() 136787430d5bSPaolo Bonzini error('OSS not found') 136887430d5bSPaolo Bonzini endif 136987430d5bSPaolo Bonzini endif 1370478e943fSPaolo Bonziniendif 1371478e943fSPaolo Bonzinidsound = not_found 137287430d5bSPaolo Bonziniif not get_option('dsound').auto() or (targetos == 'windows' and have_system) 137387430d5bSPaolo Bonzini if cc.has_header('dsound.h') 137487430d5bSPaolo Bonzini dsound = declare_dependency(link_args: ['-lole32', '-ldxguid']) 1375478e943fSPaolo Bonzini endif 137687430d5bSPaolo Bonzini 137787430d5bSPaolo Bonzini if not dsound.found() 137887430d5bSPaolo Bonzini if get_option('dsound').enabled() 137987430d5bSPaolo Bonzini error('DirectSound not found') 138087430d5bSPaolo Bonzini endif 138187430d5bSPaolo Bonzini endif 138287430d5bSPaolo Bonziniendif 138387430d5bSPaolo Bonzini 1384478e943fSPaolo Bonzinicoreaudio = not_found 138587430d5bSPaolo Bonziniif not get_option('coreaudio').auto() or (targetos == 'darwin' and have_system) 138687430d5bSPaolo Bonzini coreaudio = dependency('appleframeworks', modules: 'CoreAudio', 138787430d5bSPaolo Bonzini required: get_option('coreaudio')) 1388478e943fSPaolo Bonziniendif 13898bc5184dSThomas Huth 13902b1ccdf4SMarc-André Lureauopengl = not_found 139188b6e618SPaolo Bonziniif not get_option('opengl').auto() or have_system or have_vhost_user_gpu 139288b6e618SPaolo Bonzini epoxy = dependency('epoxy', method: 'pkg-config', 1393063d5119SPaolo Bonzini required: get_option('opengl')) 139488b6e618SPaolo Bonzini if cc.has_header('epoxy/egl.h', dependencies: epoxy) 139588b6e618SPaolo Bonzini opengl = epoxy 139688b6e618SPaolo Bonzini elif get_option('opengl').enabled() 139788b6e618SPaolo Bonzini error('epoxy/egl.h not found') 139888b6e618SPaolo Bonzini endif 13992b1ccdf4SMarc-André Lureauendif 14008bc5184dSThomas Huthgbm = not_found 14018bc5184dSThomas Huthif (have_system or have_tools) and (virgl.found() or opengl.found()) 1402063d5119SPaolo Bonzini gbm = dependency('gbm', method: 'pkg-config', required: false) 14038bc5184dSThomas Huthendif 1404f0caba44SMarc-André Lureauhave_vhost_user_gpu = have_vhost_user_gpu and virgl.found() and opengl.found() and gbm.found() 14051b695471SPaolo Bonzini 140657612511SPaolo Bonzinignutls = not_found 1407cc4c7c73SDaniel P. Berrangégnutls_crypto = not_found 1408abc14fd0SAlyssa Rossif get_option('gnutls').enabled() or (get_option('gnutls').auto() and have_system) 1409cc4c7c73SDaniel P. Berrangé # For general TLS support our min gnutls matches 1410cc4c7c73SDaniel P. Berrangé # that implied by our platform support matrix 1411cc4c7c73SDaniel P. Berrangé # 1412cc4c7c73SDaniel P. Berrangé # For the crypto backends, we look for a newer 1413cc4c7c73SDaniel P. Berrangé # gnutls: 1414cc4c7c73SDaniel P. Berrangé # 1415cc4c7c73SDaniel P. Berrangé # Version 3.6.8 is needed to get XTS 1416cc4c7c73SDaniel P. Berrangé # Version 3.6.13 is needed to get PBKDF 1417cc4c7c73SDaniel P. Berrangé # Version 3.6.14 is needed to get HW accelerated XTS 1418cc4c7c73SDaniel P. Berrangé # 1419cc4c7c73SDaniel P. Berrangé # If newer enough gnutls isn't available, we can 1420cc4c7c73SDaniel P. Berrangé # still use a different crypto backend to satisfy 1421cc4c7c73SDaniel P. Berrangé # the platform support requirements 1422cc4c7c73SDaniel P. Berrangé gnutls_crypto = dependency('gnutls', version: '>=3.6.14', 1423cc4c7c73SDaniel P. Berrangé method: 'pkg-config', 1424063d5119SPaolo Bonzini required: false) 1425cc4c7c73SDaniel P. Berrangé if gnutls_crypto.found() 1426cc4c7c73SDaniel P. Berrangé gnutls = gnutls_crypto 1427cc4c7c73SDaniel P. Berrangé else 1428cc4c7c73SDaniel P. Berrangé # Our min version if all we need is TLS 142957612511SPaolo Bonzini gnutls = dependency('gnutls', version: '>=3.5.18', 143057612511SPaolo Bonzini method: 'pkg-config', 1431063d5119SPaolo Bonzini required: get_option('gnutls')) 143257612511SPaolo Bonzini endif 1433cc4c7c73SDaniel P. Berrangéendif 143457612511SPaolo Bonzini 14358bd0931fSDaniel P. Berrangé# We prefer use of gnutls for crypto, unless the options 14368bd0931fSDaniel P. Berrangé# explicitly asked for nettle or gcrypt. 14378bd0931fSDaniel P. Berrangé# 14388bd0931fSDaniel P. Berrangé# If gnutls isn't available for crypto, then we'll prefer 14398bd0931fSDaniel P. Berrangé# gcrypt over nettle for performance reasons. 144057612511SPaolo Bonzinigcrypt = not_found 144157612511SPaolo Bonzininettle = not_found 14424c5e512eSLei Hehogweed = not_found 144368014044SDaniel P. Berrangéxts = 'none' 14448bd0931fSDaniel P. Berrangé 144557612511SPaolo Bonziniif get_option('nettle').enabled() and get_option('gcrypt').enabled() 144657612511SPaolo Bonzini error('Only one of gcrypt & nettle can be enabled') 144757612511SPaolo Bonziniendif 14488bd0931fSDaniel P. Berrangé 14498bd0931fSDaniel P. Berrangé# Explicit nettle/gcrypt request, so ignore gnutls for crypto 14508bd0931fSDaniel P. Berrangéif get_option('nettle').enabled() or get_option('gcrypt').enabled() 14518bd0931fSDaniel P. Berrangé gnutls_crypto = not_found 145257612511SPaolo Bonziniendif 14538bd0931fSDaniel P. Berrangé 14548bd0931fSDaniel P. Berrangéif not gnutls_crypto.found() 14558bd0931fSDaniel P. Berrangé if (not get_option('gcrypt').auto() or have_system) and not get_option('nettle').enabled() 14561741093bSDaniel P. Berrangé gcrypt = dependency('libgcrypt', version: '>=1.8', 145757612511SPaolo Bonzini method: 'config-tool', 1458063d5119SPaolo Bonzini required: get_option('gcrypt')) 145957612511SPaolo Bonzini # Debian has removed -lgpg-error from libgcrypt-config 146057612511SPaolo Bonzini # as it "spreads unnecessary dependencies" which in 146157612511SPaolo Bonzini # turn breaks static builds... 1462a0cbd2e8SPaolo Bonzini if gcrypt.found() and get_option('prefer_static') 1463bd3615d6SPaolo Bonzini gcrypt = declare_dependency(dependencies: 1464bd3615d6SPaolo Bonzini [gcrypt, 1465bd3615d6SPaolo Bonzini cc.find_library('gpg-error', required: true)], 1466bd3615d6SPaolo Bonzini version: gcrypt.version()) 146757612511SPaolo Bonzini endif 146857612511SPaolo Bonzini endif 1469260a13d4SDaniel P. Berrangé if (not get_option('nettle').auto() or have_system) and not gcrypt.found() 1470260a13d4SDaniel P. Berrangé nettle = dependency('nettle', version: '>=3.4', 1471260a13d4SDaniel P. Berrangé method: 'pkg-config', 1472063d5119SPaolo Bonzini required: get_option('nettle')) 1473260a13d4SDaniel P. Berrangé if nettle.found() and not cc.has_header('nettle/xts.h', dependencies: nettle) 1474260a13d4SDaniel P. Berrangé xts = 'private' 1475260a13d4SDaniel P. Berrangé endif 1476260a13d4SDaniel P. Berrangé endif 1477cc4c7c73SDaniel P. Berrangéendif 147857612511SPaolo Bonzini 1479063d5119SPaolo Bonzinigmp = dependency('gmp', required: false, method: 'pkg-config') 14804c5e512eSLei Heif nettle.found() and gmp.found() 14814c5e512eSLei He hogweed = dependency('hogweed', version: '>=3.4', 14824c5e512eSLei He method: 'pkg-config', 1483063d5119SPaolo Bonzini required: get_option('nettle')) 14844c5e512eSLei Heendif 14854c5e512eSLei He 14864c5e512eSLei He 14872b1ccdf4SMarc-André Lureaugtk = not_found 14881b695471SPaolo Bonzinigtkx11 = not_found 1489c23d7b4eSPaolo Bonzinivte = not_found 149029e0bfffSClaudio Fontanahave_gtk_clipboard = get_option('gtk_clipboard').enabled() 149129e0bfffSClaudio Fontana 149264d3fec7SAkihiko Odakiif not get_option('gtk').auto() or have_system 14931b695471SPaolo Bonzini gtk = dependency('gtk+-3.0', version: '>=3.22.0', 14941b695471SPaolo Bonzini method: 'pkg-config', 1495063d5119SPaolo Bonzini required: get_option('gtk')) 14961b695471SPaolo Bonzini if gtk.found() 14971b695471SPaolo Bonzini gtkx11 = dependency('gtk+-x11-3.0', version: '>=3.22.0', 14981b695471SPaolo Bonzini method: 'pkg-config', 1499063d5119SPaolo Bonzini required: false) 1500bd3615d6SPaolo Bonzini gtk = declare_dependency(dependencies: [gtk, gtkx11], 1501bd3615d6SPaolo Bonzini version: gtk.version()) 1502c23d7b4eSPaolo Bonzini 1503c23d7b4eSPaolo Bonzini if not get_option('vte').auto() or have_system 1504c23d7b4eSPaolo Bonzini vte = dependency('vte-2.91', 1505c23d7b4eSPaolo Bonzini method: 'pkg-config', 1506063d5119SPaolo Bonzini required: get_option('vte')) 1507c23d7b4eSPaolo Bonzini endif 150829e0bfffSClaudio Fontana elif have_gtk_clipboard 150929e0bfffSClaudio Fontana error('GTK clipboard requested, but GTK not found') 15102b1ccdf4SMarc-André Lureau endif 15111b695471SPaolo Bonziniendif 15121b695471SPaolo Bonzini 15132b1ccdf4SMarc-André Lureaux11 = not_found 15149d49bcf6SMarkus Armbrusterif gtkx11.found() 1515063d5119SPaolo Bonzini x11 = dependency('x11', method: 'pkg-config', required: gtkx11.found()) 15162b1ccdf4SMarc-André Lureauendif 15172b1ccdf4SMarc-André Lureaupng = not_found 151895f8510eSKshitij Suriif get_option('png').allowed() and have_system 15191ec8c2c0SThomas Huth png = dependency('libpng', version: '>=1.6.34', required: get_option('png'), 1520063d5119SPaolo Bonzini method: 'pkg-config') 152195f8510eSKshitij Suriendif 152295f8510eSKshitij Surivnc = not_found 15232b1ccdf4SMarc-André Lureaujpeg = not_found 15242b1ccdf4SMarc-André Lureausasl = not_found 152543a363aeSPaolo Bonziniif get_option('vnc').allowed() and have_system 1526a0b93237SPaolo Bonzini vnc = declare_dependency() # dummy dependency 15278e242b3cSPaolo Bonzini jpeg = dependency('libjpeg', required: get_option('vnc_jpeg'), 1528063d5119SPaolo Bonzini method: 'pkg-config') 1529a0b93237SPaolo Bonzini sasl = cc.find_library('sasl2', has_headers: ['sasl/sasl.h'], 1530063d5119SPaolo Bonzini required: get_option('vnc_sasl')) 1531a0b93237SPaolo Bonzini if sasl.found() 1532a0b93237SPaolo Bonzini sasl = declare_dependency(dependencies: sasl, 1533a0b93237SPaolo Bonzini compile_args: '-DSTRUCT_IOVEC_DEFINED') 1534a0b93237SPaolo Bonzini endif 15352b1ccdf4SMarc-André Lureauendif 1536241611eaSPaolo Bonzini 153705e391aeSPaolo Bonzinipam = not_found 153805e391aeSPaolo Bonziniif not get_option('auth_pam').auto() or have_system 153905e391aeSPaolo Bonzini pam = cc.find_library('pam', has_headers: ['security/pam_appl.h'], 1540063d5119SPaolo Bonzini required: get_option('auth_pam')) 154105e391aeSPaolo Bonziniendif 154205e391aeSPaolo Bonziniif pam.found() and not cc.links(''' 154305e391aeSPaolo Bonzini #include <stddef.h> 154405e391aeSPaolo Bonzini #include <security/pam_appl.h> 154505e391aeSPaolo Bonzini int main(void) { 154605e391aeSPaolo Bonzini const char *service_name = "qemu"; 154705e391aeSPaolo Bonzini const char *user = "frank"; 154805e391aeSPaolo Bonzini const struct pam_conv pam_conv = { 0 }; 154905e391aeSPaolo Bonzini pam_handle_t *pamh = NULL; 155005e391aeSPaolo Bonzini pam_start(service_name, user, &pam_conv, &pamh); 155105e391aeSPaolo Bonzini return 0; 155205e391aeSPaolo Bonzini }''', dependencies: pam) 155305e391aeSPaolo Bonzini pam = not_found 155405e391aeSPaolo Bonzini if get_option('auth_pam').enabled() 155505e391aeSPaolo Bonzini error('could not link libpam') 155605e391aeSPaolo Bonzini else 155705e391aeSPaolo Bonzini warning('could not link libpam, disabling') 155805e391aeSPaolo Bonzini endif 155905e391aeSPaolo Bonziniendif 156005e391aeSPaolo Bonzini 1561708eab42SMarc-André Lureausnappy = not_found 1562241611eaSPaolo Bonziniif not get_option('snappy').auto() or have_system 1563241611eaSPaolo Bonzini snappy = cc.find_library('snappy', has_headers: ['snappy-c.h'], 1564063d5119SPaolo Bonzini required: get_option('snappy')) 1565708eab42SMarc-André Lureauendif 1566565174d0SPaolo Bonziniif snappy.found() and not linker.links(''' 1567241611eaSPaolo Bonzini #include <snappy-c.h> 1568241611eaSPaolo Bonzini int main(void) { snappy_max_compressed_length(4096); return 0; }''', dependencies: snappy) 1569241611eaSPaolo Bonzini snappy = not_found 1570241611eaSPaolo Bonzini if get_option('snappy').enabled() 1571241611eaSPaolo Bonzini error('could not link libsnappy') 1572241611eaSPaolo Bonzini else 1573241611eaSPaolo Bonzini warning('could not link libsnappy, disabling') 1574241611eaSPaolo Bonzini endif 1575708eab42SMarc-André Lureauendif 15760c32a0aeSPaolo Bonzini 1577708eab42SMarc-André Lureaulzo = not_found 15780c32a0aeSPaolo Bonziniif not get_option('lzo').auto() or have_system 15790c32a0aeSPaolo Bonzini lzo = cc.find_library('lzo2', has_headers: ['lzo/lzo1x.h'], 1580063d5119SPaolo Bonzini required: get_option('lzo')) 1581708eab42SMarc-André Lureauendif 15820c32a0aeSPaolo Bonziniif lzo.found() and not cc.links(''' 15830c32a0aeSPaolo Bonzini #include <lzo/lzo1x.h> 15840c32a0aeSPaolo Bonzini int main(void) { lzo_version(); return 0; }''', dependencies: lzo) 15850c32a0aeSPaolo Bonzini lzo = not_found 15860c32a0aeSPaolo Bonzini if get_option('lzo').enabled() 15870c32a0aeSPaolo Bonzini error('could not link liblzo2') 15880c32a0aeSPaolo Bonzini else 15890c32a0aeSPaolo Bonzini warning('could not link liblzo2, disabling') 15900c32a0aeSPaolo Bonzini endif 15910c32a0aeSPaolo Bonziniendif 15920c32a0aeSPaolo Bonzini 1593488a8c73SPaolo Bonzininuma = not_found 1594488a8c73SPaolo Bonziniif not get_option('numa').auto() or have_system or have_tools 1595488a8c73SPaolo Bonzini numa = cc.find_library('numa', has_headers: ['numa.h'], 1596063d5119SPaolo Bonzini required: get_option('numa')) 1597488a8c73SPaolo Bonziniendif 1598488a8c73SPaolo Bonziniif numa.found() and not cc.links(''' 1599488a8c73SPaolo Bonzini #include <numa.h> 1600488a8c73SPaolo Bonzini int main(void) { return numa_available(); } 1601488a8c73SPaolo Bonzini ''', dependencies: numa) 1602488a8c73SPaolo Bonzini numa = not_found 1603488a8c73SPaolo Bonzini if get_option('numa').enabled() 1604488a8c73SPaolo Bonzini error('could not link numa') 1605488a8c73SPaolo Bonzini else 1606488a8c73SPaolo Bonzini warning('could not link numa, disabling') 1607488a8c73SPaolo Bonzini endif 1608488a8c73SPaolo Bonziniendif 1609488a8c73SPaolo Bonzini 161055166230SMarc-André Lureaurdma = not_found 16113730a734SPaolo Bonziniif not get_option('rdma').auto() or have_system 16123730a734SPaolo Bonzini libumad = cc.find_library('ibumad', required: get_option('rdma')) 16133730a734SPaolo Bonzini rdma_libs = [cc.find_library('rdmacm', has_headers: ['rdma/rdma_cma.h'], 1614063d5119SPaolo Bonzini required: get_option('rdma')), 1615063d5119SPaolo Bonzini cc.find_library('ibverbs', required: get_option('rdma')), 16163730a734SPaolo Bonzini libumad] 16173730a734SPaolo Bonzini rdma = declare_dependency(dependencies: rdma_libs) 16183730a734SPaolo Bonzini foreach lib: rdma_libs 16193730a734SPaolo Bonzini if not lib.found() 16203730a734SPaolo Bonzini rdma = not_found 162155166230SMarc-André Lureau endif 16223730a734SPaolo Bonzini endforeach 16233730a734SPaolo Bonziniendif 16243730a734SPaolo Bonzini 1625582ea95fSMarc-André Lureauxen = not_found 162614efd8d3SPaolo Bonziniif get_option('xen').enabled() or (get_option('xen').auto() and have_system) 162714efd8d3SPaolo Bonzini xencontrol = dependency('xencontrol', required: false, 1628063d5119SPaolo Bonzini method: 'pkg-config') 162914efd8d3SPaolo Bonzini if xencontrol.found() 163014efd8d3SPaolo Bonzini xen_pc = declare_dependency(version: xencontrol.version(), 163114efd8d3SPaolo Bonzini dependencies: [ 163214efd8d3SPaolo Bonzini xencontrol, 163314efd8d3SPaolo Bonzini # disabler: true makes xen_pc.found() return false if any is not found 163414efd8d3SPaolo Bonzini dependency('xenstore', required: false, 1635063d5119SPaolo Bonzini method: 'pkg-config', 163614efd8d3SPaolo Bonzini disabler: true), 163714efd8d3SPaolo Bonzini dependency('xenforeignmemory', required: false, 1638063d5119SPaolo Bonzini method: 'pkg-config', 163914efd8d3SPaolo Bonzini disabler: true), 164014efd8d3SPaolo Bonzini dependency('xengnttab', required: false, 1641063d5119SPaolo Bonzini method: 'pkg-config', 164214efd8d3SPaolo Bonzini disabler: true), 164314efd8d3SPaolo Bonzini dependency('xenevtchn', required: false, 1644063d5119SPaolo Bonzini method: 'pkg-config', 164514efd8d3SPaolo Bonzini disabler: true), 164614efd8d3SPaolo Bonzini dependency('xendevicemodel', required: false, 1647063d5119SPaolo Bonzini method: 'pkg-config', 164814efd8d3SPaolo Bonzini disabler: true), 164914efd8d3SPaolo Bonzini # optional, no "disabler: true" 165014efd8d3SPaolo Bonzini dependency('xentoolcore', required: false, 1651063d5119SPaolo Bonzini method: 'pkg-config')]) 165214efd8d3SPaolo Bonzini if xen_pc.found() 165314efd8d3SPaolo Bonzini xen = xen_pc 1654582ea95fSMarc-André Lureau endif 165514efd8d3SPaolo Bonzini endif 165614efd8d3SPaolo Bonzini if not xen.found() 165714efd8d3SPaolo Bonzini xen_tests = [ '4.11.0', '4.10.0', '4.9.0', '4.8.0', '4.7.1', '4.6.0', '4.5.0', '4.2.0' ] 165814efd8d3SPaolo Bonzini xen_libs = { 165914efd8d3SPaolo Bonzini '4.11.0': [ 'xenstore', 'xenctrl', 'xendevicemodel', 'xenforeignmemory', 'xengnttab', 'xenevtchn', 'xentoolcore' ], 166014efd8d3SPaolo Bonzini '4.10.0': [ 'xenstore', 'xenctrl', 'xendevicemodel', 'xenforeignmemory', 'xengnttab', 'xenevtchn', 'xentoolcore' ], 166114efd8d3SPaolo Bonzini '4.9.0': [ 'xenstore', 'xenctrl', 'xendevicemodel', 'xenforeignmemory', 'xengnttab', 'xenevtchn' ], 166214efd8d3SPaolo Bonzini '4.8.0': [ 'xenstore', 'xenctrl', 'xenforeignmemory', 'xengnttab', 'xenevtchn' ], 166314efd8d3SPaolo Bonzini '4.7.1': [ 'xenstore', 'xenctrl', 'xenforeignmemory', 'xengnttab', 'xenevtchn' ], 166414efd8d3SPaolo Bonzini '4.6.0': [ 'xenstore', 'xenctrl' ], 166514efd8d3SPaolo Bonzini '4.5.0': [ 'xenstore', 'xenctrl' ], 166614efd8d3SPaolo Bonzini '4.2.0': [ 'xenstore', 'xenctrl' ], 166714efd8d3SPaolo Bonzini } 166814efd8d3SPaolo Bonzini xen_deps = {} 166914efd8d3SPaolo Bonzini foreach ver: xen_tests 167014efd8d3SPaolo Bonzini # cache the various library tests to avoid polluting the logs 167114efd8d3SPaolo Bonzini xen_test_deps = [] 167214efd8d3SPaolo Bonzini foreach l: xen_libs[ver] 167314efd8d3SPaolo Bonzini if l not in xen_deps 167414efd8d3SPaolo Bonzini xen_deps += { l: cc.find_library(l, required: false) } 167514efd8d3SPaolo Bonzini endif 167614efd8d3SPaolo Bonzini xen_test_deps += xen_deps[l] 167714efd8d3SPaolo Bonzini endforeach 167814efd8d3SPaolo Bonzini 167914efd8d3SPaolo Bonzini # Use -D to pick just one of the test programs in scripts/xen-detect.c 168014efd8d3SPaolo Bonzini xen_version = ver.split('.') 168114efd8d3SPaolo Bonzini xen_ctrl_version = xen_version[0] + \ 168214efd8d3SPaolo Bonzini ('0' + xen_version[1]).substring(-2) + \ 168314efd8d3SPaolo Bonzini ('0' + xen_version[2]).substring(-2) 168414efd8d3SPaolo Bonzini if cc.links(files('scripts/xen-detect.c'), 168514efd8d3SPaolo Bonzini args: '-DCONFIG_XEN_CTRL_INTERFACE_VERSION=' + xen_ctrl_version, 168614efd8d3SPaolo Bonzini dependencies: xen_test_deps) 168714efd8d3SPaolo Bonzini xen = declare_dependency(version: ver, dependencies: xen_test_deps) 168814efd8d3SPaolo Bonzini break 168914efd8d3SPaolo Bonzini endif 169014efd8d3SPaolo Bonzini endforeach 169114efd8d3SPaolo Bonzini endif 169214efd8d3SPaolo Bonzini if xen.found() 169314efd8d3SPaolo Bonzini accelerators += 'CONFIG_XEN' 169414efd8d3SPaolo Bonzini elif get_option('xen').enabled() 169514efd8d3SPaolo Bonzini error('could not compile and link Xen test program') 169614efd8d3SPaolo Bonzini endif 169714efd8d3SPaolo Bonziniendif 169814efd8d3SPaolo Bonzinihave_xen_pci_passthrough = get_option('xen_pci_passthrough') \ 169914efd8d3SPaolo Bonzini .require(xen.found(), 170014efd8d3SPaolo Bonzini error_message: 'Xen PCI passthrough requested but Xen not enabled') \ 170114efd8d3SPaolo Bonzini .require(targetos == 'linux', 170214efd8d3SPaolo Bonzini error_message: 'Xen PCI passthrough not available on this platform') \ 170314efd8d3SPaolo Bonzini .allowed() 170414efd8d3SPaolo Bonzini 170514efd8d3SPaolo Bonzini 170606677ce1SPaolo Bonzinicacard = not_found 17075f364c57SPaolo Bonziniif not get_option('smartcard').auto() or have_system 17085f364c57SPaolo Bonzini cacard = dependency('libcacard', required: get_option('smartcard'), 1709063d5119SPaolo Bonzini version: '>=2.5.1', method: 'pkg-config') 171006677ce1SPaolo Bonziniendif 17110a40bcb7SCésar Belleyu2f = not_found 17120a40bcb7SCésar Belleyif have_system 17130a40bcb7SCésar Belley u2f = dependency('u2f-emu', required: get_option('u2f'), 1714063d5119SPaolo Bonzini method: 'pkg-config') 17150a40bcb7SCésar Belleyendif 17168caef850SHongren (Zenithal) Zhengcanokey = not_found 17178caef850SHongren (Zenithal) Zhengif have_system 17188caef850SHongren (Zenithal) Zheng canokey = dependency('canokey-qemu', required: get_option('canokey'), 1719063d5119SPaolo Bonzini method: 'pkg-config') 17208caef850SHongren (Zenithal) Zhengendif 172106677ce1SPaolo Bonziniusbredir = not_found 172218f31e60SPaolo Bonziniif not get_option('usb_redir').auto() or have_system 172318f31e60SPaolo Bonzini usbredir = dependency('libusbredirparser-0.5', required: get_option('usb_redir'), 1724063d5119SPaolo Bonzini version: '>=0.6', method: 'pkg-config') 172506677ce1SPaolo Bonziniendif 172606677ce1SPaolo Bonzinilibusb = not_found 172790540f32SPaolo Bonziniif not get_option('libusb').auto() or have_system 172890540f32SPaolo Bonzini libusb = dependency('libusb-1.0', required: get_option('libusb'), 1729063d5119SPaolo Bonzini version: '>=1.0.13', method: 'pkg-config') 173006677ce1SPaolo Bonziniendif 173190540f32SPaolo Bonzini 1732c9322ab5SMarc-André Lureaulibpmem = not_found 1733e36e8c70SPaolo Bonziniif not get_option('libpmem').auto() or have_system 1734e36e8c70SPaolo Bonzini libpmem = dependency('libpmem', required: get_option('libpmem'), 1735063d5119SPaolo Bonzini method: 'pkg-config') 1736c9322ab5SMarc-André Lureauendif 1737c7c91a74SBruce Rogerslibdaxctl = not_found 173883ef1682SPaolo Bonziniif not get_option('libdaxctl').auto() or have_system 173983ef1682SPaolo Bonzini libdaxctl = dependency('libdaxctl', required: get_option('libdaxctl'), 1740063d5119SPaolo Bonzini version: '>=57', method: 'pkg-config') 1741c7c91a74SBruce Rogersendif 17428ce0a45fSMarc-André Lureautasn1 = not_found 1743ba7ed407SPaolo Bonziniif gnutls.found() 1744ba7ed407SPaolo Bonzini tasn1 = dependency('libtasn1', 1745063d5119SPaolo Bonzini method: 'pkg-config') 17468ce0a45fSMarc-André Lureauendif 1747af04e89dSMarc-André Lureaukeyutils = dependency('libkeyutils', required: false, 1748063d5119SPaolo Bonzini method: 'pkg-config') 1749a81df1b6SPaolo Bonzini 17503909def8SMarc-André Lureauhas_gettid = cc.has_function('gettid') 17513909def8SMarc-André Lureau 17523d212b41SRichard W.M. Jones# libselinux 17533d212b41SRichard W.M. Jonesselinux = dependency('libselinux', 17543d212b41SRichard W.M. Jones required: get_option('selinux'), 1755063d5119SPaolo Bonzini method: 'pkg-config') 17563d212b41SRichard W.M. Jones 1757aa087962SPaolo Bonzini# Malloc tests 1758aa087962SPaolo Bonzini 1759aa087962SPaolo Bonzinimalloc = [] 1760aa087962SPaolo Bonziniif get_option('malloc') == 'system' 1761aa087962SPaolo Bonzini has_malloc_trim = \ 176243a363aeSPaolo Bonzini get_option('malloc_trim').allowed() and \ 1763aa087962SPaolo Bonzini cc.links('''#include <malloc.h> 1764aa087962SPaolo Bonzini int main(void) { malloc_trim(0); return 0; }''') 1765aa087962SPaolo Bonzinielse 1766aa087962SPaolo Bonzini has_malloc_trim = false 1767aa087962SPaolo Bonzini malloc = cc.find_library(get_option('malloc'), required: true) 1768aa087962SPaolo Bonziniendif 1769aa087962SPaolo Bonziniif not has_malloc_trim and get_option('malloc_trim').enabled() 1770aa087962SPaolo Bonzini if get_option('malloc') == 'system' 1771aa087962SPaolo Bonzini error('malloc_trim not available on this platform.') 1772aa087962SPaolo Bonzini else 1773aa087962SPaolo Bonzini error('malloc_trim not available with non-libc memory allocator') 1774aa087962SPaolo Bonzini endif 1775aa087962SPaolo Bonziniendif 1776aa087962SPaolo Bonzini 177784e319a5SMax Reitz# Check whether the glibc provides statx() 177884e319a5SMax Reitz 1779e66420acSPaolo Bonzinignu_source_prefix = ''' 178084e319a5SMax Reitz #ifndef _GNU_SOURCE 178184e319a5SMax Reitz #define _GNU_SOURCE 178284e319a5SMax Reitz #endif 1783e66420acSPaolo Bonzini''' 1784e66420acSPaolo Bonzinistatx_test = gnu_source_prefix + ''' 178584e319a5SMax Reitz #include <sys/stat.h> 178684e319a5SMax Reitz int main(void) { 178784e319a5SMax Reitz struct statx statxbuf; 178884e319a5SMax Reitz statx(0, "", 0, STATX_BASIC_STATS, &statxbuf); 178984e319a5SMax Reitz return 0; 179084e319a5SMax Reitz }''' 179184e319a5SMax Reitz 179284e319a5SMax Reitzhas_statx = cc.links(statx_test) 179384e319a5SMax Reitz 17944ce7a08dSHanna Reitz# Check whether statx() provides mount ID information 17954ce7a08dSHanna Reitz 17964ce7a08dSHanna Reitzstatx_mnt_id_test = gnu_source_prefix + ''' 17974ce7a08dSHanna Reitz #include <sys/stat.h> 17984ce7a08dSHanna Reitz int main(void) { 17994ce7a08dSHanna Reitz struct statx statxbuf; 18004ce7a08dSHanna Reitz statx(0, "", 0, STATX_BASIC_STATS | STATX_MNT_ID, &statxbuf); 18014ce7a08dSHanna Reitz return statxbuf.stx_mnt_id; 18024ce7a08dSHanna Reitz }''' 18034ce7a08dSHanna Reitz 18044ce7a08dSHanna Reitzhas_statx_mnt_id = cc.links(statx_mnt_id_test) 18054ce7a08dSHanna Reitz 1806a436d6d4SPaolo Bonzinihave_vhost_user_blk_server = get_option('vhost_user_blk_server') \ 1807a436d6d4SPaolo Bonzini .require(targetos == 'linux', 1808a436d6d4SPaolo Bonzini error_message: 'vhost_user_blk_server requires linux') \ 18092a3129a3SPaolo Bonzini .require(have_vhost_user, 1810a436d6d4SPaolo Bonzini error_message: 'vhost_user_blk_server requires vhost-user support') \ 181126ed501bSAlex Bennée .disable_auto_if(not have_tools and not have_system) \ 1812a436d6d4SPaolo Bonzini .allowed() 18139e62ba48SDaniele Buono 1814df4ea709SMax Reitzif get_option('fuse').disabled() and get_option('fuse_lseek').enabled() 1815df4ea709SMax Reitz error('Cannot enable fuse-lseek while fuse is disabled') 1816df4ea709SMax Reitzendif 1817df4ea709SMax Reitz 1818a484a719SMax Reitzfuse = dependency('fuse3', required: get_option('fuse'), 1819063d5119SPaolo Bonzini version: '>=3.1', method: 'pkg-config') 1820a484a719SMax Reitz 1821df4ea709SMax Reitzfuse_lseek = not_found 182243a363aeSPaolo Bonziniif get_option('fuse_lseek').allowed() 1823df4ea709SMax Reitz if fuse.version().version_compare('>=3.8') 1824df4ea709SMax Reitz # Dummy dependency 1825df4ea709SMax Reitz fuse_lseek = declare_dependency() 1826df4ea709SMax Reitz elif get_option('fuse_lseek').enabled() 1827df4ea709SMax Reitz if fuse.found() 1828df4ea709SMax Reitz error('fuse-lseek requires libfuse >=3.8, found ' + fuse.version()) 1829df4ea709SMax Reitz else 1830df4ea709SMax Reitz error('fuse-lseek requires libfuse, which was not found') 1831df4ea709SMax Reitz endif 1832df4ea709SMax Reitz endif 1833df4ea709SMax Reitzendif 1834df4ea709SMax Reitz 1835a6caeee8SXie Yongjihave_libvduse = (targetos == 'linux') 1836a6caeee8SXie Yongjiif get_option('libvduse').enabled() 1837a6caeee8SXie Yongji if targetos != 'linux' 1838a6caeee8SXie Yongji error('libvduse requires linux') 1839a6caeee8SXie Yongji endif 1840a6caeee8SXie Yongjielif get_option('libvduse').disabled() 1841a6caeee8SXie Yongji have_libvduse = false 1842a6caeee8SXie Yongjiendif 1843a6caeee8SXie Yongji 18442a2359b8SXie Yongjihave_vduse_blk_export = (have_libvduse and targetos == 'linux') 18452a2359b8SXie Yongjiif get_option('vduse_blk_export').enabled() 18462a2359b8SXie Yongji if targetos != 'linux' 18472a2359b8SXie Yongji error('vduse_blk_export requires linux') 18482a2359b8SXie Yongji elif not have_libvduse 18492a2359b8SXie Yongji error('vduse_blk_export requires libvduse support') 18502a2359b8SXie Yongji endif 18512a2359b8SXie Yongjielif get_option('vduse_blk_export').disabled() 18522a2359b8SXie Yongji have_vduse_blk_export = false 18532a2359b8SXie Yongjiendif 18542a2359b8SXie Yongji 185546627f41SAndrew Melnychenko# libbpf 185646627f41SAndrew Melnychenkolibbpf = dependency('libbpf', required: get_option('bpf'), method: 'pkg-config') 185746627f41SAndrew Melnychenkoif libbpf.found() and not cc.links(''' 185846627f41SAndrew Melnychenko #include <bpf/libbpf.h> 185946627f41SAndrew Melnychenko int main(void) 186046627f41SAndrew Melnychenko { 186146627f41SAndrew Melnychenko bpf_object__destroy_skeleton(NULL); 186246627f41SAndrew Melnychenko return 0; 186346627f41SAndrew Melnychenko }''', dependencies: libbpf) 186446627f41SAndrew Melnychenko libbpf = not_found 186546627f41SAndrew Melnychenko if get_option('bpf').enabled() 186646627f41SAndrew Melnychenko error('libbpf skeleton test failed') 186746627f41SAndrew Melnychenko else 186846627f41SAndrew Melnychenko warning('libbpf skeleton test failed, disabling') 186946627f41SAndrew Melnychenko endif 187046627f41SAndrew Melnychenkoendif 187146627f41SAndrew Melnychenko 18727c10cb38SIlya Leoshkevich# libdw 1873bc71d58fSIlya Leoshkevichlibdw = not_found 1874550c6d97SIlya Leoshkevichif not get_option('libdw').auto() or \ 1875a0cbd2e8SPaolo Bonzini (not get_option('prefer_static') and (have_system or have_user)) 18767c10cb38SIlya Leoshkevich libdw = dependency('libdw', 18777c10cb38SIlya Leoshkevich method: 'pkg-config', 1878bc71d58fSIlya Leoshkevich required: get_option('libdw')) 1879bc71d58fSIlya Leoshkevichendif 18807c10cb38SIlya Leoshkevich 188187430d5bSPaolo Bonzini################# 188287430d5bSPaolo Bonzini# config-host.h # 188387430d5bSPaolo Bonzini################# 188487430d5bSPaolo Bonzini 188587430d5bSPaolo Bonziniaudio_drivers_selected = [] 188687430d5bSPaolo Bonziniif have_system 188787430d5bSPaolo Bonzini audio_drivers_available = { 188887430d5bSPaolo Bonzini 'alsa': alsa.found(), 188987430d5bSPaolo Bonzini 'coreaudio': coreaudio.found(), 189087430d5bSPaolo Bonzini 'dsound': dsound.found(), 189187430d5bSPaolo Bonzini 'jack': jack.found(), 189287430d5bSPaolo Bonzini 'oss': oss.found(), 189387430d5bSPaolo Bonzini 'pa': pulse.found(), 1894c2d3d1c2SDorinda Bassey 'pipewire': pipewire.found(), 189587430d5bSPaolo Bonzini 'sdl': sdl.found(), 1896663df1ccSAlexandre Ratchov 'sndio': sndio.found(), 189787430d5bSPaolo Bonzini } 1898e5424a29SPaolo Bonzini foreach k, v: audio_drivers_available 1899e5424a29SPaolo Bonzini config_host_data.set('CONFIG_AUDIO_' + k.to_upper(), v) 1900e5424a29SPaolo Bonzini endforeach 190187430d5bSPaolo Bonzini 190287430d5bSPaolo Bonzini # Default to native drivers first, OSS second, SDL third 190387430d5bSPaolo Bonzini audio_drivers_priority = \ 1904663df1ccSAlexandre Ratchov [ 'pa', 'coreaudio', 'dsound', 'sndio', 'oss' ] + \ 190587430d5bSPaolo Bonzini (targetos == 'linux' ? [] : [ 'sdl' ]) 190687430d5bSPaolo Bonzini audio_drivers_default = [] 190787430d5bSPaolo Bonzini foreach k: audio_drivers_priority 190887430d5bSPaolo Bonzini if audio_drivers_available[k] 190987430d5bSPaolo Bonzini audio_drivers_default += k 191087430d5bSPaolo Bonzini endif 191187430d5bSPaolo Bonzini endforeach 191287430d5bSPaolo Bonzini 191387430d5bSPaolo Bonzini foreach k: get_option('audio_drv_list') 191487430d5bSPaolo Bonzini if k == 'default' 191587430d5bSPaolo Bonzini audio_drivers_selected += audio_drivers_default 191687430d5bSPaolo Bonzini elif not audio_drivers_available[k] 191787430d5bSPaolo Bonzini error('Audio driver "@0@" not available.'.format(k)) 191887430d5bSPaolo Bonzini else 191987430d5bSPaolo Bonzini audio_drivers_selected += k 192087430d5bSPaolo Bonzini endif 192187430d5bSPaolo Bonzini endforeach 192287430d5bSPaolo Bonziniendif 192387430d5bSPaolo Bonziniconfig_host_data.set('CONFIG_AUDIO_DRIVERS', 192487430d5bSPaolo Bonzini '"' + '", "'.join(audio_drivers_selected) + '", ') 192587430d5bSPaolo Bonzini 19269e62ba48SDaniele Buonoif get_option('cfi') 19279e62ba48SDaniele Buono cfi_flags=[] 19289e62ba48SDaniele Buono # Check for dependency on LTO 19299e62ba48SDaniele Buono if not get_option('b_lto') 19309e62ba48SDaniele Buono error('Selected Control-Flow Integrity but LTO is disabled') 19319e62ba48SDaniele Buono endif 19326002711cSPaolo Bonzini if enable_modules 19339e62ba48SDaniele Buono error('Selected Control-Flow Integrity is not compatible with modules') 19349e62ba48SDaniele Buono endif 19359e62ba48SDaniele Buono # Check for cfi flags. CFI requires LTO so we can't use 19369e62ba48SDaniele Buono # get_supported_arguments, but need a more complex "compiles" which allows 19379e62ba48SDaniele Buono # custom arguments 19389e62ba48SDaniele Buono if cc.compiles('int main () { return 0; }', name: '-fsanitize=cfi-icall', 19399e62ba48SDaniele Buono args: ['-flto', '-fsanitize=cfi-icall'] ) 19409e62ba48SDaniele Buono cfi_flags += '-fsanitize=cfi-icall' 19419e62ba48SDaniele Buono else 19429e62ba48SDaniele Buono error('-fsanitize=cfi-icall is not supported by the compiler') 19439e62ba48SDaniele Buono endif 19449e62ba48SDaniele Buono if cc.compiles('int main () { return 0; }', 19459e62ba48SDaniele Buono name: '-fsanitize-cfi-icall-generalize-pointers', 19469e62ba48SDaniele Buono args: ['-flto', '-fsanitize=cfi-icall', 19479e62ba48SDaniele Buono '-fsanitize-cfi-icall-generalize-pointers'] ) 19489e62ba48SDaniele Buono cfi_flags += '-fsanitize-cfi-icall-generalize-pointers' 19499e62ba48SDaniele Buono else 19509e62ba48SDaniele Buono error('-fsanitize-cfi-icall-generalize-pointers is not supported by the compiler') 19519e62ba48SDaniele Buono endif 19529e62ba48SDaniele Buono if get_option('cfi_debug') 19539e62ba48SDaniele Buono if cc.compiles('int main () { return 0; }', 19549e62ba48SDaniele Buono name: '-fno-sanitize-trap=cfi-icall', 19559e62ba48SDaniele Buono args: ['-flto', '-fsanitize=cfi-icall', 19569e62ba48SDaniele Buono '-fno-sanitize-trap=cfi-icall'] ) 19579e62ba48SDaniele Buono cfi_flags += '-fno-sanitize-trap=cfi-icall' 19589e62ba48SDaniele Buono else 19599e62ba48SDaniele Buono error('-fno-sanitize-trap=cfi-icall is not supported by the compiler') 19609e62ba48SDaniele Buono endif 19619e62ba48SDaniele Buono endif 1962e5134024SPaolo Bonzini add_global_arguments(cfi_flags, native: false, language: all_languages) 1963e5134024SPaolo Bonzini add_global_link_arguments(cfi_flags, native: false, language: all_languages) 19649e62ba48SDaniele Buonoendif 19659e62ba48SDaniele Buono 196614176c8dSJoelle van Dynehave_host_block_device = (targetos != 'darwin' or 196714176c8dSJoelle van Dyne cc.has_header('IOKit/storage/IOMedia.h')) 196814176c8dSJoelle van Dyne 1969a436d6d4SPaolo Bonzinidbus_display = get_option('dbus_display') \ 1970a436d6d4SPaolo Bonzini .require(gio.version().version_compare('>=2.64'), 1971a436d6d4SPaolo Bonzini error_message: '-display dbus requires glib>=2.64') \ 19727544060eSPaolo Bonzini .require(gdbus_codegen.found(), 1973bb2dc4b7SPaolo Bonzini error_message: gdbus_codegen_error.format('-display dbus')) \ 197484a0a2efSMarc-André Lureau .require(targetos != 'windows', 197584a0a2efSMarc-André Lureau error_message: '-display dbus is not available on Windows') \ 1976a436d6d4SPaolo Bonzini .allowed() 1977142ca628SMarc-André Lureau 1978a436d6d4SPaolo Bonzinihave_virtfs = get_option('virtfs') \ 19790fb1e19dSKeno Fischer .require(targetos == 'linux' or targetos == 'darwin', 19800fb1e19dSKeno Fischer error_message: 'virtio-9p (virtfs) requires Linux or macOS') \ 19810fb1e19dSKeno Fischer .require(targetos == 'linux' or cc.has_function('pthread_fchdir_np'), 19820fb1e19dSKeno Fischer error_message: 'virtio-9p (virtfs) on macOS requires the presence of pthread_fchdir_np') \ 19831a67e07fSPeter Foley .require(targetos == 'darwin' or libattr.found(), 19841a67e07fSPeter Foley error_message: 'virtio-9p (virtfs) on Linux requires libattr-devel') \ 1985a436d6d4SPaolo Bonzini .disable_auto_if(not have_tools and not have_system) \ 1986a436d6d4SPaolo Bonzini .allowed() 198769202b40SPaolo Bonzini 19881a67e07fSPeter Foleyhave_virtfs_proxy_helper = get_option('virtfs_proxy_helper') \ 19891a67e07fSPeter Foley .require(targetos != 'darwin', error_message: 'the virtfs proxy helper is incompatible with macOS') \ 19901a67e07fSPeter Foley .require(have_virtfs, error_message: 'the virtfs proxy helper requires that virtfs is enabled') \ 19911a67e07fSPeter Foley .disable_auto_if(not have_tools) \ 19921a67e07fSPeter Foley .require(libcap_ng.found(), error_message: 'the virtfs proxy helper requires libcap-ng') \ 19931a67e07fSPeter Foley .allowed() 19943a489d38SPhilippe Mathieu-Daudé 1995622d64ffSPaolo Bonziniif get_option('block_drv_ro_whitelist') == '' 1996622d64ffSPaolo Bonzini config_host_data.set('CONFIG_BDRV_RO_WHITELIST', '') 1997622d64ffSPaolo Bonzinielse 1998622d64ffSPaolo Bonzini config_host_data.set('CONFIG_BDRV_RO_WHITELIST', 1999622d64ffSPaolo Bonzini '"' + get_option('block_drv_ro_whitelist').replace(',', '", "') + '", ') 2000622d64ffSPaolo Bonziniendif 2001622d64ffSPaolo Bonziniif get_option('block_drv_rw_whitelist') == '' 2002622d64ffSPaolo Bonzini config_host_data.set('CONFIG_BDRV_RW_WHITELIST', '') 2003622d64ffSPaolo Bonzinielse 2004622d64ffSPaolo Bonzini config_host_data.set('CONFIG_BDRV_RW_WHITELIST', 2005622d64ffSPaolo Bonzini '"' + get_option('block_drv_rw_whitelist').replace(',', '", "') + '", ') 2006622d64ffSPaolo Bonziniendif 2007622d64ffSPaolo Bonzini 20089c29b741SPaolo Bonziniforeach k : get_option('trace_backends') 20099c29b741SPaolo Bonzini config_host_data.set('CONFIG_TRACE_' + k.to_upper(), true) 20109c29b741SPaolo Bonziniendforeach 20119c29b741SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_TRACE_FILE', get_option('trace_file')) 201241f2ae28SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_TLS_PRIORITY', get_option('tls_priority')) 201340c909f5SPaolo Bonziniif iasl.found() 201440c909f5SPaolo Bonzini config_host_data.set_quoted('CONFIG_IASL', iasl.full_path()) 20155dc4618eSPaolo Bonziniendif 201616bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_BINDIR', get_option('prefix') / get_option('bindir')) 201716bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_PREFIX', get_option('prefix')) 201816bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_QEMU_CONFDIR', get_option('prefix') / qemu_confdir) 201916bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_QEMU_DATADIR', get_option('prefix') / qemu_datadir) 202016bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_QEMU_DESKTOPDIR', get_option('prefix') / qemu_desktopdir) 20218154f5e6SAkihiko Odaki 20228154f5e6SAkihiko Odakiqemu_firmwarepath = '' 20238154f5e6SAkihiko Odakiforeach k : get_option('qemu_firmwarepath') 20248154f5e6SAkihiko Odaki qemu_firmwarepath += '"' + get_option('prefix') / k + '", ' 20258154f5e6SAkihiko Odakiendforeach 20268154f5e6SAkihiko Odakiconfig_host_data.set('CONFIG_QEMU_FIRMWAREPATH', qemu_firmwarepath) 20278154f5e6SAkihiko Odaki 202816bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_QEMU_HELPERDIR', get_option('prefix') / get_option('libexecdir')) 202916bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_QEMU_ICONDIR', get_option('prefix') / qemu_icondir) 203016bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_QEMU_LOCALEDIR', get_option('prefix') / get_option('localedir')) 203116bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_QEMU_LOCALSTATEDIR', get_option('prefix') / get_option('localstatedir')) 203216bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_QEMU_MODDIR', get_option('prefix') / qemu_moddir) 203316bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_SYSCONFDIR', get_option('prefix') / get_option('sysconfdir')) 203416bf7a33SPaolo Bonzini 20356002711cSPaolo Bonziniif enable_modules 2036b0b4323eSPaolo Bonzini config_host_data.set('CONFIG_STAMP', run_command( 2037b0b4323eSPaolo Bonzini meson.current_source_dir() / 'scripts/qemu-stamp.py', 2038b0b4323eSPaolo Bonzini meson.project_version(), get_option('pkgversion'), '--', 2039b0b4323eSPaolo Bonzini meson.current_source_dir() / 'configure', 2040b0b4323eSPaolo Bonzini capture: true, check: true).stdout().strip()) 2041b0b4323eSPaolo Bonziniendif 2042b0b4323eSPaolo Bonzini 204335acbb30SPaolo Bonzinihave_slirp_smbd = get_option('slirp_smbd') \ 204435acbb30SPaolo Bonzini .require(targetos != 'windows', error_message: 'Host smbd not supported on this platform.') \ 204535acbb30SPaolo Bonzini .allowed() 204635acbb30SPaolo Bonziniif have_slirp_smbd 204735acbb30SPaolo Bonzini smbd_path = get_option('smbd') 204835acbb30SPaolo Bonzini if smbd_path == '' 204935acbb30SPaolo Bonzini smbd_path = (targetos == 'solaris' ? '/usr/sfw/sbin/smbd' : '/usr/sbin/smbd') 205035acbb30SPaolo Bonzini endif 205135acbb30SPaolo Bonzini config_host_data.set_quoted('CONFIG_SMBD_COMMAND', smbd_path) 205235acbb30SPaolo Bonziniendif 205335acbb30SPaolo Bonzini 2054823eb013SPaolo Bonziniconfig_host_data.set('HOST_' + host_arch.to_upper(), 1) 2055823eb013SPaolo Bonzini 20562cb2f580SPaolo Bonziniif get_option('module_upgrades') and not enable_modules 20572cb2f580SPaolo Bonzini error('Cannot enable module-upgrades as modules are not enabled') 20582cb2f580SPaolo Bonziniendif 20592cb2f580SPaolo Bonziniconfig_host_data.set('CONFIG_MODULE_UPGRADES', get_option('module_upgrades')) 20602cb2f580SPaolo Bonzini 2061f7f2d651SPaolo Bonziniconfig_host_data.set('CONFIG_ATTR', libattr.found()) 2062c55cf6abSPaolo Bonziniconfig_host_data.set('CONFIG_BDRV_WHITELIST_TOOLS', get_option('block_drv_whitelist_in_tools')) 20638c6d4ff4SPaolo Bonziniconfig_host_data.set('CONFIG_BRLAPI', brlapi.found()) 2064b4e312e9SPaolo Bonziniconfig_host_data.set('CONFIG_COCOA', cocoa.found()) 2065537b7248SPaolo Bonziniconfig_host_data.set('CONFIG_FUZZ', get_option('fuzzing')) 2066af2bb99bSPaolo Bonziniconfig_host_data.set('CONFIG_GCOV', get_option('b_coverage')) 2067f01496a3SPaolo Bonziniconfig_host_data.set('CONFIG_LIBUDEV', libudev.found()) 20680c32a0aeSPaolo Bonziniconfig_host_data.set('CONFIG_LZO', lzo.found()) 20696ec0e15dSPaolo Bonziniconfig_host_data.set('CONFIG_MPATH', mpathpersist.found()) 20706ec0e15dSPaolo Bonziniconfig_host_data.set('CONFIG_MPATH_NEW_API', mpathpersist_new_api) 2071fd66dbd4SStefan Hajnocziconfig_host_data.set('CONFIG_BLKIO', blkio.found()) 2072f9cd86feSPaolo Bonziniconfig_host_data.set('CONFIG_CURL', curl.found()) 20735285e593SYonggang Luoconfig_host_data.set('CONFIG_CURSES', curses.found()) 20748bc5184dSThomas Huthconfig_host_data.set('CONFIG_GBM', gbm.found()) 20757544060eSPaolo Bonziniconfig_host_data.set('CONFIG_GIO', gio.found()) 207608821ca2SPaolo Bonziniconfig_host_data.set('CONFIG_GLUSTERFS', glusterfs.found()) 207708821ca2SPaolo Bonziniif glusterfs.found() 207808821ca2SPaolo Bonzini config_host_data.set('CONFIG_GLUSTERFS_XLATOR_OPT', glusterfs.version().version_compare('>=4')) 207908821ca2SPaolo Bonzini config_host_data.set('CONFIG_GLUSTERFS_DISCARD', glusterfs.version().version_compare('>=5')) 208008821ca2SPaolo Bonzini config_host_data.set('CONFIG_GLUSTERFS_FALLOCATE', glusterfs.version().version_compare('>=6')) 208108821ca2SPaolo Bonzini config_host_data.set('CONFIG_GLUSTERFS_ZEROFILL', glusterfs.version().version_compare('>=6')) 208208821ca2SPaolo Bonzini config_host_data.set('CONFIG_GLUSTERFS_FTRUNCATE_HAS_STAT', glusterfs_ftruncate_has_stat) 208308821ca2SPaolo Bonzini config_host_data.set('CONFIG_GLUSTERFS_IOCB_HAS_STAT', glusterfs_iocb_has_stat) 208408821ca2SPaolo Bonziniendif 20851b695471SPaolo Bonziniconfig_host_data.set('CONFIG_GTK', gtk.found()) 2086c23d7b4eSPaolo Bonziniconfig_host_data.set('CONFIG_VTE', vte.found()) 208729e0bfffSClaudio Fontanaconfig_host_data.set('CONFIG_GTK_CLIPBOARD', have_gtk_clipboard) 2088f7f2d651SPaolo Bonziniconfig_host_data.set('CONFIG_LIBATTR', have_old_libattr) 2089727c8bb8SPaolo Bonziniconfig_host_data.set('CONFIG_LIBCAP_NG', libcap_ng.found()) 209046627f41SAndrew Melnychenkoconfig_host_data.set('CONFIG_EBPF', libbpf.found()) 209163a7f853SPaolo Bonziniconfig_host_data.set('CONFIG_LIBDAXCTL', libdaxctl.found()) 20929db405a3SPaolo Bonziniconfig_host_data.set('CONFIG_LIBISCSI', libiscsi.found()) 209330045c05SPaolo Bonziniconfig_host_data.set('CONFIG_LIBNFS', libnfs.found()) 2094e6a52b36SThomas Huthconfig_host_data.set('CONFIG_LIBSSH', libssh.found()) 2095ff66f3e5SPaolo Bonziniconfig_host_data.set('CONFIG_LINUX_AIO', libaio.found()) 209663a7f853SPaolo Bonziniconfig_host_data.set('CONFIG_LINUX_IO_URING', linux_io_uring.found()) 209763a7f853SPaolo Bonziniconfig_host_data.set('CONFIG_LIBPMEM', libpmem.found()) 20986002711cSPaolo Bonziniconfig_host_data.set('CONFIG_MODULES', enable_modules) 2099488a8c73SPaolo Bonziniconfig_host_data.set('CONFIG_NUMA', numa.found()) 21006bb613f0SMichal Privoznikif numa.found() 21016bb613f0SMichal Privoznik config_host_data.set('HAVE_NUMA_HAS_PREFERRED_MANY', 21026bb613f0SMichal Privoznik cc.has_function('numa_has_preferred_many', 21036bb613f0SMichal Privoznik dependencies: numa)) 21046bb613f0SMichal Privoznikendif 210588b6e618SPaolo Bonziniconfig_host_data.set('CONFIG_OPENGL', opengl.found()) 2106c55cf6abSPaolo Bonziniconfig_host_data.set('CONFIG_PROFILER', get_option('profiler')) 2107fabd1e93SPaolo Bonziniconfig_host_data.set('CONFIG_RBD', rbd.found()) 21083730a734SPaolo Bonziniconfig_host_data.set('CONFIG_RDMA', rdma.found()) 2109721fa5e5SPaolo Bonziniconfig_host_data.set('CONFIG_SAFESTACK', get_option('safe_stack')) 211035be72baSPaolo Bonziniconfig_host_data.set('CONFIG_SDL', sdl.found()) 211135be72baSPaolo Bonziniconfig_host_data.set('CONFIG_SDL_IMAGE', sdl_image.found()) 211290835c2bSPaolo Bonziniconfig_host_data.set('CONFIG_SECCOMP', seccomp.found()) 211373422d95SMichal Privoznikif seccomp.found() 211473422d95SMichal Privoznik config_host_data.set('CONFIG_SECCOMP_SYSRAWRC', seccomp_has_sysrawrc) 211573422d95SMichal Privoznikendif 2116241611eaSPaolo Bonziniconfig_host_data.set('CONFIG_SNAPPY', snappy.found()) 21170d04c4c9SPaolo Bonziniconfig_host_data.set('CONFIG_TPM', have_tpm) 211834f983d8SPaolo Bonziniconfig_host_data.set('CONFIG_TSAN', get_option('tsan')) 211990540f32SPaolo Bonziniconfig_host_data.set('CONFIG_USB_LIBUSB', libusb.found()) 2120e1723999SPaolo Bonziniconfig_host_data.set('CONFIG_VDE', vde.found()) 21212df89d54SPaolo Bonziniconfig_host_data.set('CONFIG_VHOST_NET', have_vhost_net) 21222df89d54SPaolo Bonziniconfig_host_data.set('CONFIG_VHOST_NET_USER', have_vhost_net_user) 21232df89d54SPaolo Bonziniconfig_host_data.set('CONFIG_VHOST_NET_VDPA', have_vhost_net_vdpa) 21242df89d54SPaolo Bonziniconfig_host_data.set('CONFIG_VHOST_KERNEL', have_vhost_kernel) 21252df89d54SPaolo Bonziniconfig_host_data.set('CONFIG_VHOST_USER', have_vhost_user) 21262df89d54SPaolo Bonziniconfig_host_data.set('CONFIG_VHOST_CRYPTO', have_vhost_user_crypto) 21272df89d54SPaolo Bonziniconfig_host_data.set('CONFIG_VHOST_VDPA', have_vhost_vdpa) 2128e2c1d78dSVladislav Yaroshchukconfig_host_data.set('CONFIG_VMNET', vmnet.found()) 2129e5e856c1SStefan Hajnocziconfig_host_data.set('CONFIG_VHOST_USER_BLK_SERVER', have_vhost_user_blk_server) 21302a2359b8SXie Yongjiconfig_host_data.set('CONFIG_VDUSE_BLK_EXPORT', have_vduse_blk_export) 213195f8510eSKshitij Suriconfig_host_data.set('CONFIG_PNG', png.found()) 2132a0b93237SPaolo Bonziniconfig_host_data.set('CONFIG_VNC', vnc.found()) 2133a0b93237SPaolo Bonziniconfig_host_data.set('CONFIG_VNC_JPEG', jpeg.found()) 2134a0b93237SPaolo Bonziniconfig_host_data.set('CONFIG_VNC_SASL', sasl.found()) 213569202b40SPaolo Bonziniconfig_host_data.set('CONFIG_VIRTFS', have_virtfs) 213663a7f853SPaolo Bonziniconfig_host_data.set('CONFIG_VTE', vte.found()) 21374113f4cfSLaurent Vivierconfig_host_data.set('CONFIG_XKBCOMMON', xkbcommon.found()) 2138af04e89dSMarc-André Lureauconfig_host_data.set('CONFIG_KEYUTILS', keyutils.found()) 21393909def8SMarc-André Lureauconfig_host_data.set('CONFIG_GETTID', has_gettid) 214057612511SPaolo Bonziniconfig_host_data.set('CONFIG_GNUTLS', gnutls.found()) 2141cc4c7c73SDaniel P. Berrangéconfig_host_data.set('CONFIG_GNUTLS_CRYPTO', gnutls_crypto.found()) 2142d47b83b1SDaniel P. Berrangéconfig_host_data.set('CONFIG_TASN1', tasn1.found()) 214357612511SPaolo Bonziniconfig_host_data.set('CONFIG_GCRYPT', gcrypt.found()) 214457612511SPaolo Bonziniconfig_host_data.set('CONFIG_NETTLE', nettle.found()) 21454c5e512eSLei Heconfig_host_data.set('CONFIG_HOGWEED', hogweed.found()) 214657612511SPaolo Bonziniconfig_host_data.set('CONFIG_QEMU_PRIVATE_XTS', xts == 'private') 2147aa087962SPaolo Bonziniconfig_host_data.set('CONFIG_MALLOC_TRIM', has_malloc_trim) 214884e319a5SMax Reitzconfig_host_data.set('CONFIG_STATX', has_statx) 21494ce7a08dSHanna Reitzconfig_host_data.set('CONFIG_STATX_MNT_ID', has_statx_mnt_id) 2150b1def33dSPaolo Bonziniconfig_host_data.set('CONFIG_ZSTD', zstd.found()) 2151a484a719SMax Reitzconfig_host_data.set('CONFIG_FUSE', fuse.found()) 2152df4ea709SMax Reitzconfig_host_data.set('CONFIG_FUSE_LSEEK', fuse_lseek.found()) 21533f0a5d55SMarc-André Lureauconfig_host_data.set('CONFIG_SPICE_PROTOCOL', spice_protocol.found()) 2154ddece465SMarc-André Lureauif spice_protocol.found() 2155ddece465SMarc-André Lureauconfig_host_data.set('CONFIG_SPICE_PROTOCOL_MAJOR', spice_protocol.version().split('.')[0]) 2156ddece465SMarc-André Lureauconfig_host_data.set('CONFIG_SPICE_PROTOCOL_MINOR', spice_protocol.version().split('.')[1]) 2157ddece465SMarc-André Lureauconfig_host_data.set('CONFIG_SPICE_PROTOCOL_MICRO', spice_protocol.version().split('.')[2]) 2158ddece465SMarc-André Lureauendif 21593f0a5d55SMarc-André Lureauconfig_host_data.set('CONFIG_SPICE', spice.found()) 21609d71037fSPaolo Bonziniconfig_host_data.set('CONFIG_X11', x11.found()) 2161142ca628SMarc-André Lureauconfig_host_data.set('CONFIG_DBUS_DISPLAY', dbus_display) 21629e62ba48SDaniele Buonoconfig_host_data.set('CONFIG_CFI', get_option('cfi')) 21633d212b41SRichard W.M. Jonesconfig_host_data.set('CONFIG_SELINUX', selinux.found()) 216414efd8d3SPaolo Bonziniconfig_host_data.set('CONFIG_XEN_BACKEND', xen.found()) 21657c10cb38SIlya Leoshkevichconfig_host_data.set('CONFIG_LIBDW', libdw.found()) 216614efd8d3SPaolo Bonziniif xen.found() 216714efd8d3SPaolo Bonzini # protect from xen.version() having less than three components 216814efd8d3SPaolo Bonzini xen_version = xen.version().split('.') + ['0', '0'] 216914efd8d3SPaolo Bonzini xen_ctrl_version = xen_version[0] + \ 217014efd8d3SPaolo Bonzini ('0' + xen_version[1]).substring(-2) + \ 217114efd8d3SPaolo Bonzini ('0' + xen_version[2]).substring(-2) 217214efd8d3SPaolo Bonzini config_host_data.set('CONFIG_XEN_CTRL_INTERFACE_VERSION', xen_ctrl_version) 217314efd8d3SPaolo Bonziniendif 2174859aef02SPaolo Bonziniconfig_host_data.set('QEMU_VERSION', '"@0@"'.format(meson.project_version())) 2175859aef02SPaolo Bonziniconfig_host_data.set('QEMU_VERSION_MAJOR', meson.project_version().split('.')[0]) 2176859aef02SPaolo Bonziniconfig_host_data.set('QEMU_VERSION_MINOR', meson.project_version().split('.')[1]) 2177859aef02SPaolo Bonziniconfig_host_data.set('QEMU_VERSION_MICRO', meson.project_version().split('.')[2]) 2178859aef02SPaolo Bonzini 2179a6305081SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_HOST_DSOSUF', host_dsosuf) 218069d8de7aSPaolo Bonziniconfig_host_data.set('HAVE_HOST_BLOCK_DEVICE', have_host_block_device) 218169d8de7aSPaolo Bonzini 2182728c0a2fSPaolo Bonzinihave_coroutine_pool = get_option('coroutine_pool') 2183728c0a2fSPaolo Bonziniif get_option('debug_stack_usage') and have_coroutine_pool 2184728c0a2fSPaolo Bonzini message('Disabling coroutine pool to measure stack usage') 2185728c0a2fSPaolo Bonzini have_coroutine_pool = false 2186728c0a2fSPaolo Bonziniendif 2187728c0a2fSPaolo Bonziniconfig_host_data.set10('CONFIG_COROUTINE_POOL', have_coroutine_pool) 218858a2e3f5SStefan Hajnocziconfig_host_data.set('CONFIG_DEBUG_GRAPH_LOCK', get_option('debug_graph_lock')) 2189c55cf6abSPaolo Bonziniconfig_host_data.set('CONFIG_DEBUG_MUTEX', get_option('debug_mutex')) 2190728c0a2fSPaolo Bonziniconfig_host_data.set('CONFIG_DEBUG_STACK_USAGE', get_option('debug_stack_usage')) 2191c55cf6abSPaolo Bonziniconfig_host_data.set('CONFIG_GPROF', get_option('gprof')) 2192406523f6SPaolo Bonziniconfig_host_data.set('CONFIG_LIVE_BLOCK_MIGRATION', get_option('live_block_migration').allowed()) 2193c55cf6abSPaolo Bonziniconfig_host_data.set('CONFIG_QOM_CAST_DEBUG', get_option('qom_cast_debug')) 2194abad185cSJuan Quintelaconfig_host_data.set('CONFIG_REPLICATION', get_option('replication').allowed()) 2195406523f6SPaolo Bonzini 219669d8de7aSPaolo Bonzini# has_header 2197e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_EPOLL', cc.has_header('sys/epoll.h')) 2198d47a8b3bSPaolo Bonziniconfig_host_data.set('CONFIG_LINUX_MAGIC_H', cc.has_header('linux/magic.h')) 2199d47a8b3bSPaolo Bonziniconfig_host_data.set('CONFIG_VALGRIND_H', cc.has_header('valgrind/valgrind.h')) 220048f670ecSThomas Huthconfig_host_data.set('HAVE_BTRFS_H', cc.has_header('linux/btrfs.h')) 22012964be52SThomas Huthconfig_host_data.set('HAVE_DRM_H', cc.has_header('libdrm/drm.h')) 22022802d91dSThomas Huthconfig_host_data.set('HAVE_PTY_H', cc.has_header('pty.h')) 220369d8de7aSPaolo Bonziniconfig_host_data.set('HAVE_SYS_DISK_H', cc.has_header('sys/disk.h')) 2204ded5d78cSThomas Huthconfig_host_data.set('HAVE_SYS_IOCCOM_H', cc.has_header('sys/ioccom.h')) 22054a9d5f89SThomas Huthconfig_host_data.set('HAVE_SYS_KCOV_H', cc.has_header('sys/kcov.h')) 2206d409373bSBin Mengif targetos == 'windows' 2207d409373bSBin Meng config_host_data.set('HAVE_AFUNIX_H', cc.has_header('afunix.h')) 2208d409373bSBin Mengendif 2209ded5d78cSThomas Huth 221069d8de7aSPaolo Bonzini# has_function 2211c891c24bSClaudio Imbrendaconfig_host_data.set('CONFIG_CLOSE_RANGE', cc.has_function('close_range')) 2212a620fbe9SPaolo Bonziniconfig_host_data.set('CONFIG_ACCEPT4', cc.has_function('accept4')) 2213e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_CLOCK_ADJTIME', cc.has_function('clock_adjtime')) 2214e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_DUP3', cc.has_function('dup3')) 2215e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_FALLOCATE', cc.has_function('fallocate')) 2216e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_POSIX_FALLOCATE', cc.has_function('posix_fallocate')) 22178698343bSPeter Maydell# Note that we need to specify prefix: here to avoid incorrectly 22188698343bSPeter Maydell# thinking that Windows has posix_memalign() 22198698343bSPeter Maydellconfig_host_data.set('CONFIG_POSIX_MEMALIGN', cc.has_function('posix_memalign', prefix: '#include <stdlib.h>')) 22205c8c714aSPeter Maydellconfig_host_data.set('CONFIG_ALIGNED_MALLOC', cc.has_function('_aligned_malloc')) 222188454f84SPeter Maydellconfig_host_data.set('CONFIG_VALLOC', cc.has_function('valloc')) 222288454f84SPeter Maydellconfig_host_data.set('CONFIG_MEMALIGN', cc.has_function('memalign')) 2223e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_PPOLL', cc.has_function('ppoll')) 22242b9f74efSPeter Maydellconfig_host_data.set('CONFIG_PREADV', cc.has_function('preadv', prefix: '#include <sys/uio.h>')) 2225029ed1bdSKeno Fischerconfig_host_data.set('CONFIG_PTHREAD_FCHDIR_NP', cc.has_function('pthread_fchdir_np')) 2226e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_SENDFILE', cc.has_function('sendfile')) 2227e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_SETNS', cc.has_function('setns') and cc.has_function('unshare')) 2228e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_SYNCFS', cc.has_function('syncfs')) 2229e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_SYNC_FILE_RANGE', cc.has_function('sync_file_range')) 2230e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_TIMERFD', cc.has_function('timerfd_create')) 2231be7e89f6SPaolo Bonziniconfig_host_data.set('HAVE_COPY_FILE_RANGE', cc.has_function('copy_file_range')) 223259e35c7bSAndrew Deasonconfig_host_data.set('HAVE_GETIFADDRS', cc.has_function('getifaddrs')) 2233fc9a809eSPaolo Bonziniconfig_host_data.set('HAVE_GLIB_WITH_SLICE_ALLOCATOR', glib_has_gslice) 2234e66420acSPaolo Bonziniconfig_host_data.set('HAVE_OPENPTY', cc.has_function('openpty', dependencies: util)) 2235ed3b3f17SPaolo Bonziniconfig_host_data.set('HAVE_STRCHRNUL', cc.has_function('strchrnul')) 223669d8de7aSPaolo Bonziniconfig_host_data.set('HAVE_SYSTEM_FUNCTION', cc.has_function('system', prefix: '#include <stdlib.h>')) 223766dc5f96SStefano Garzarellaif rbd.found() 223866dc5f96SStefano Garzarella config_host_data.set('HAVE_RBD_NAMESPACE_EXISTS', 223966dc5f96SStefano Garzarella cc.has_function('rbd_namespace_exists', 224066dc5f96SStefano Garzarella dependencies: rbd, 224166dc5f96SStefano Garzarella prefix: '#include <rbd/librbd.h>')) 224266dc5f96SStefano Garzarellaendif 2243911965acSLi Zhijianif rdma.found() 2244911965acSLi Zhijian config_host_data.set('HAVE_IBV_ADVISE_MR', 2245911965acSLi Zhijian cc.has_function('ibv_advise_mr', 22463730a734SPaolo Bonzini dependencies: rdma, 2247911965acSLi Zhijian prefix: '#include <infiniband/verbs.h>')) 2248911965acSLi Zhijianendif 22492b9f74efSPeter Maydell 225034f983d8SPaolo Bonzinihave_asan_fiber = false 225134f983d8SPaolo Bonziniif get_option('sanitizers') and \ 225234f983d8SPaolo Bonzini not cc.has_function('__sanitizer_start_switch_fiber', 225334f983d8SPaolo Bonzini args: '-fsanitize=address', 225434f983d8SPaolo Bonzini prefix: '#include <sanitizer/asan_interface.h>') 225534f983d8SPaolo Bonzini warning('Missing ASAN due to missing fiber annotation interface') 225634f983d8SPaolo Bonzini warning('Without code annotation, the report may be inferior.') 225734f983d8SPaolo Bonzinielse 225834f983d8SPaolo Bonzini have_asan_fiber = true 225934f983d8SPaolo Bonziniendif 226034f983d8SPaolo Bonziniconfig_host_data.set('CONFIG_ASAN_IFACE_FIBER', have_asan_fiber) 226134f983d8SPaolo Bonzini 2262e66420acSPaolo Bonzini# has_header_symbol 22636d43eaa3SSam Liconfig_host_data.set('CONFIG_BLKZONED', 22646d43eaa3SSam Li cc.has_header_symbol('linux/blkzoned.h', 'BLKOPENZONE')) 2265e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_EPOLL_CREATE1', 2266e66420acSPaolo Bonzini cc.has_header_symbol('sys/epoll.h', 'epoll_create1')) 2267e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_FALLOCATE_PUNCH_HOLE', 2268e66420acSPaolo Bonzini cc.has_header_symbol('linux/falloc.h', 'FALLOC_FL_PUNCH_HOLE') and 2269e66420acSPaolo Bonzini cc.has_header_symbol('linux/falloc.h', 'FALLOC_FL_KEEP_SIZE')) 2270e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_FALLOCATE_ZERO_RANGE', 2271e66420acSPaolo Bonzini cc.has_header_symbol('linux/falloc.h', 'FALLOC_FL_ZERO_RANGE')) 2272e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_FIEMAP', 2273e66420acSPaolo Bonzini cc.has_header('linux/fiemap.h') and 2274e66420acSPaolo Bonzini cc.has_header_symbol('linux/fs.h', 'FS_IOC_FIEMAP')) 2275be7e89f6SPaolo Bonziniconfig_host_data.set('CONFIG_GETRANDOM', 2276be7e89f6SPaolo Bonzini cc.has_function('getrandom') and 2277be7e89f6SPaolo Bonzini cc.has_header_symbol('sys/random.h', 'GRND_NONBLOCK')) 2278a620fbe9SPaolo Bonziniconfig_host_data.set('CONFIG_INOTIFY', 2279a620fbe9SPaolo Bonzini cc.has_header_symbol('sys/inotify.h', 'inotify_init')) 2280a620fbe9SPaolo Bonziniconfig_host_data.set('CONFIG_INOTIFY1', 2281a620fbe9SPaolo Bonzini cc.has_header_symbol('sys/inotify.h', 'inotify_init1')) 2282e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_PRCTL_PR_SET_TIMERSLACK', 2283e66420acSPaolo Bonzini cc.has_header_symbol('sys/prctl.h', 'PR_SET_TIMERSLACK')) 2284be7e89f6SPaolo Bonziniconfig_host_data.set('CONFIG_RTNETLINK', 2285be7e89f6SPaolo Bonzini cc.has_header_symbol('linux/rtnetlink.h', 'IFLA_PROTO_DOWN')) 2286be7e89f6SPaolo Bonziniconfig_host_data.set('CONFIG_SYSMACROS', 2287be7e89f6SPaolo Bonzini cc.has_header_symbol('sys/sysmacros.h', 'makedev')) 2288e1fbd2c4SPaolo Bonziniconfig_host_data.set('HAVE_OPTRESET', 2289e1fbd2c4SPaolo Bonzini cc.has_header_symbol('getopt.h', 'optreset')) 2290653163fcSMarc-André Lureauconfig_host_data.set('HAVE_IPPROTO_MPTCP', 2291653163fcSMarc-André Lureau cc.has_header_symbol('netinet/in.h', 'IPPROTO_MPTCP')) 2292e66420acSPaolo Bonzini 2293e66420acSPaolo Bonzini# has_member 2294e66420acSPaolo Bonziniconfig_host_data.set('HAVE_SIGEV_NOTIFY_THREAD_ID', 2295e66420acSPaolo Bonzini cc.has_member('struct sigevent', 'sigev_notify_thread_id', 2296e66420acSPaolo Bonzini prefix: '#include <signal.h>')) 2297ed3b3f17SPaolo Bonziniconfig_host_data.set('HAVE_STRUCT_STAT_ST_ATIM', 2298ed3b3f17SPaolo Bonzini cc.has_member('struct stat', 'st_atim', 2299ed3b3f17SPaolo Bonzini prefix: '#include <sys/stat.h>')) 23006d43eaa3SSam Liconfig_host_data.set('HAVE_BLK_ZONE_REP_CAPACITY', 23016d43eaa3SSam Li cc.has_member('struct blk_zone', 'capacity', 23026d43eaa3SSam Li prefix: '#include <linux/blkzoned.h>')) 2303e66420acSPaolo Bonzini 23046a23f819SPaolo Bonzini# has_type 23056a23f819SPaolo Bonziniconfig_host_data.set('CONFIG_IOVEC', 23066a23f819SPaolo Bonzini cc.has_type('struct iovec', 23076a23f819SPaolo Bonzini prefix: '#include <sys/uio.h>')) 23086a23f819SPaolo Bonziniconfig_host_data.set('HAVE_UTMPX', 23096a23f819SPaolo Bonzini cc.has_type('struct utmpx', 23106a23f819SPaolo Bonzini prefix: '#include <utmpx.h>')) 23116a23f819SPaolo Bonzini 2312904ad5ecSPaolo Bonziniconfig_host_data.set('CONFIG_EVENTFD', cc.links(''' 2313e1fbd2c4SPaolo Bonzini #include <sys/eventfd.h> 2314e1fbd2c4SPaolo Bonzini int main(void) { return eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC); }''')) 2315904ad5ecSPaolo Bonziniconfig_host_data.set('CONFIG_FDATASYNC', cc.links(gnu_source_prefix + ''' 2316e1fbd2c4SPaolo Bonzini #include <unistd.h> 2317e1fbd2c4SPaolo Bonzini int main(void) { 2318e1fbd2c4SPaolo Bonzini #if defined(_POSIX_SYNCHRONIZED_IO) && _POSIX_SYNCHRONIZED_IO > 0 2319e1fbd2c4SPaolo Bonzini return fdatasync(0); 2320e1fbd2c4SPaolo Bonzini #else 2321e1fbd2c4SPaolo Bonzini #error Not supported 2322e1fbd2c4SPaolo Bonzini #endif 2323e1fbd2c4SPaolo Bonzini }''')) 23248900c204SAndrew Deason 23258900c204SAndrew Deasonhas_madvise = cc.links(gnu_source_prefix + ''' 2326e1fbd2c4SPaolo Bonzini #include <sys/types.h> 2327e1fbd2c4SPaolo Bonzini #include <sys/mman.h> 2328e1fbd2c4SPaolo Bonzini #include <stddef.h> 23298900c204SAndrew Deason int main(void) { return madvise(NULL, 0, MADV_DONTNEED); }''') 23308900c204SAndrew Deasonmissing_madvise_proto = false 23318900c204SAndrew Deasonif has_madvise 23328900c204SAndrew Deason # Some platforms (illumos and Solaris before Solaris 11) provide madvise() 23338900c204SAndrew Deason # but forget to prototype it. In this case, has_madvise will be true (the 23348900c204SAndrew Deason # test program links despite a compile warning). To detect the 23358900c204SAndrew Deason # missing-prototype case, we try again with a definitely-bogus prototype. 23368900c204SAndrew Deason # This will only compile if the system headers don't provide the prototype; 23378900c204SAndrew Deason # otherwise the conflicting prototypes will cause a compiler error. 23388900c204SAndrew Deason missing_madvise_proto = cc.links(gnu_source_prefix + ''' 23398900c204SAndrew Deason #include <sys/types.h> 23408900c204SAndrew Deason #include <sys/mman.h> 23418900c204SAndrew Deason #include <stddef.h> 23428900c204SAndrew Deason extern int madvise(int); 23438900c204SAndrew Deason int main(void) { return madvise(0); }''') 23448900c204SAndrew Deasonendif 23458900c204SAndrew Deasonconfig_host_data.set('CONFIG_MADVISE', has_madvise) 23468900c204SAndrew Deasonconfig_host_data.set('HAVE_MADVISE_WITHOUT_PROTOTYPE', missing_madvise_proto) 23478900c204SAndrew Deason 2348904ad5ecSPaolo Bonziniconfig_host_data.set('CONFIG_MEMFD', cc.links(gnu_source_prefix + ''' 2349e1fbd2c4SPaolo Bonzini #include <sys/mman.h> 2350e1fbd2c4SPaolo Bonzini int main(void) { return memfd_create("foo", MFD_ALLOW_SEALING); }''')) 2351904ad5ecSPaolo Bonziniconfig_host_data.set('CONFIG_OPEN_BY_HANDLE', cc.links(gnu_source_prefix + ''' 2352d47a8b3bSPaolo Bonzini #include <fcntl.h> 2353d47a8b3bSPaolo Bonzini #if !defined(AT_EMPTY_PATH) 2354d47a8b3bSPaolo Bonzini # error missing definition 2355d47a8b3bSPaolo Bonzini #else 2356d47a8b3bSPaolo Bonzini int main(void) { struct file_handle fh; return open_by_handle_at(0, &fh, 0); } 2357d47a8b3bSPaolo Bonzini #endif''')) 2358904ad5ecSPaolo Bonziniconfig_host_data.set('CONFIG_POSIX_MADVISE', cc.links(gnu_source_prefix + ''' 2359e1fbd2c4SPaolo Bonzini #include <sys/mman.h> 2360e1fbd2c4SPaolo Bonzini #include <stddef.h> 2361e1fbd2c4SPaolo Bonzini int main(void) { return posix_madvise(NULL, 0, POSIX_MADV_DONTNEED); }''')) 236210f6b231SPaolo Bonzini 23636a23f819SPaolo Bonziniconfig_host_data.set('CONFIG_PTHREAD_SETNAME_NP_W_TID', cc.links(gnu_source_prefix + ''' 236410f6b231SPaolo Bonzini #include <pthread.h> 236510f6b231SPaolo Bonzini 236610f6b231SPaolo Bonzini static void *f(void *p) { return NULL; } 236710f6b231SPaolo Bonzini int main(void) 236810f6b231SPaolo Bonzini { 236910f6b231SPaolo Bonzini pthread_t thread; 237010f6b231SPaolo Bonzini pthread_create(&thread, 0, f, 0); 237110f6b231SPaolo Bonzini pthread_setname_np(thread, "QEMU"); 237210f6b231SPaolo Bonzini return 0; 237310f6b231SPaolo Bonzini }''', dependencies: threads)) 23746a23f819SPaolo Bonziniconfig_host_data.set('CONFIG_PTHREAD_SETNAME_NP_WO_TID', cc.links(gnu_source_prefix + ''' 237510f6b231SPaolo Bonzini #include <pthread.h> 237610f6b231SPaolo Bonzini 237710f6b231SPaolo Bonzini static void *f(void *p) { pthread_setname_np("QEMU"); return NULL; } 237810f6b231SPaolo Bonzini int main(void) 237910f6b231SPaolo Bonzini { 238010f6b231SPaolo Bonzini pthread_t thread; 238110f6b231SPaolo Bonzini pthread_create(&thread, 0, f, 0); 238210f6b231SPaolo Bonzini return 0; 238310f6b231SPaolo Bonzini }''', dependencies: threads)) 23843ada67a3SBrad Smithconfig_host_data.set('CONFIG_PTHREAD_SET_NAME_NP', cc.links(gnu_source_prefix + ''' 23853ada67a3SBrad Smith #include <pthread.h> 23863ada67a3SBrad Smith #include <pthread_np.h> 23873ada67a3SBrad Smith 23883ada67a3SBrad Smith static void *f(void *p) { return NULL; } 23893ada67a3SBrad Smith int main(void) 23903ada67a3SBrad Smith { 23913ada67a3SBrad Smith pthread_t thread; 23923ada67a3SBrad Smith pthread_create(&thread, 0, f, 0); 23933ada67a3SBrad Smith pthread_set_name_np(thread, "QEMU"); 23943ada67a3SBrad Smith return 0; 23953ada67a3SBrad Smith }''', dependencies: threads)) 2396657ac98bSLongpeng(Mike)config_host_data.set('CONFIG_PTHREAD_CONDATTR_SETCLOCK', cc.links(gnu_source_prefix + ''' 2397657ac98bSLongpeng(Mike) #include <pthread.h> 2398657ac98bSLongpeng(Mike) #include <time.h> 2399657ac98bSLongpeng(Mike) 2400657ac98bSLongpeng(Mike) int main(void) 2401657ac98bSLongpeng(Mike) { 2402657ac98bSLongpeng(Mike) pthread_condattr_t attr 2403657ac98bSLongpeng(Mike) pthread_condattr_init(&attr); 2404657ac98bSLongpeng(Mike) pthread_condattr_setclock(&attr, CLOCK_MONOTONIC); 2405657ac98bSLongpeng(Mike) return 0; 2406657ac98bSLongpeng(Mike) }''', dependencies: threads)) 24077730f32cSDavid Hildenbrandconfig_host_data.set('CONFIG_PTHREAD_AFFINITY_NP', cc.links(gnu_source_prefix + ''' 24087730f32cSDavid Hildenbrand #include <pthread.h> 240910f6b231SPaolo Bonzini 24107730f32cSDavid Hildenbrand static void *f(void *p) { return NULL; } 24117730f32cSDavid Hildenbrand int main(void) 24127730f32cSDavid Hildenbrand { 24137730f32cSDavid Hildenbrand int setsize = CPU_ALLOC_SIZE(64); 24147730f32cSDavid Hildenbrand pthread_t thread; 24157730f32cSDavid Hildenbrand cpu_set_t *cpuset; 24167730f32cSDavid Hildenbrand pthread_create(&thread, 0, f, 0); 24177730f32cSDavid Hildenbrand cpuset = CPU_ALLOC(64); 24187730f32cSDavid Hildenbrand CPU_ZERO_S(setsize, cpuset); 24197730f32cSDavid Hildenbrand pthread_setaffinity_np(thread, setsize, cpuset); 24207730f32cSDavid Hildenbrand pthread_getaffinity_np(thread, setsize, cpuset); 24217730f32cSDavid Hildenbrand CPU_FREE(cpuset); 24227730f32cSDavid Hildenbrand return 0; 24237730f32cSDavid Hildenbrand }''', dependencies: threads)) 2424904ad5ecSPaolo Bonziniconfig_host_data.set('CONFIG_SIGNALFD', cc.links(gnu_source_prefix + ''' 24256bd17dccSKacper Słomiński #include <sys/signalfd.h> 24266bd17dccSKacper Słomiński #include <stddef.h> 24276bd17dccSKacper Słomiński int main(void) { return signalfd(-1, NULL, SFD_CLOEXEC); }''')) 2428904ad5ecSPaolo Bonziniconfig_host_data.set('CONFIG_SPLICE', cc.links(gnu_source_prefix + ''' 2429a620fbe9SPaolo Bonzini #include <unistd.h> 2430a620fbe9SPaolo Bonzini #include <fcntl.h> 2431a620fbe9SPaolo Bonzini #include <limits.h> 2432a620fbe9SPaolo Bonzini 2433a620fbe9SPaolo Bonzini int main(void) 2434a620fbe9SPaolo Bonzini { 2435a620fbe9SPaolo Bonzini int len, fd = 0; 2436a620fbe9SPaolo Bonzini len = tee(STDIN_FILENO, STDOUT_FILENO, INT_MAX, SPLICE_F_NONBLOCK); 2437a620fbe9SPaolo Bonzini splice(STDIN_FILENO, NULL, fd, NULL, len, SPLICE_F_MOVE); 2438a620fbe9SPaolo Bonzini return 0; 2439a620fbe9SPaolo Bonzini }''')) 2440e1fbd2c4SPaolo Bonzini 244196a63aebSPaolo Bonziniconfig_host_data.set('HAVE_MLOCKALL', cc.links(gnu_source_prefix + ''' 244296a63aebSPaolo Bonzini #include <sys/mman.h> 2443b5d3dac1SPaolo Bonzini int main(void) { 244496a63aebSPaolo Bonzini return mlockall(MCL_FUTURE); 244596a63aebSPaolo Bonzini }''')) 244696a63aebSPaolo Bonzini 2447eea9453aSThomas Huthhave_l2tpv3 = false 244843a363aeSPaolo Bonziniif get_option('l2tpv3').allowed() and have_system 24496a23f819SPaolo Bonzini have_l2tpv3 = cc.has_type('struct mmsghdr', 24506a23f819SPaolo Bonzini prefix: gnu_source_prefix + ''' 24516a23f819SPaolo Bonzini #include <sys/socket.h> 24526a23f819SPaolo Bonzini #include <linux/ip.h>''') 2453eea9453aSThomas Huthendif 2454eea9453aSThomas Huthconfig_host_data.set('CONFIG_L2TPV3', have_l2tpv3) 2455eea9453aSThomas Huth 2456837b84b1SPaolo Bonzinihave_netmap = false 245743a363aeSPaolo Bonziniif get_option('netmap').allowed() and have_system 2458837b84b1SPaolo Bonzini have_netmap = cc.compiles(''' 2459837b84b1SPaolo Bonzini #include <inttypes.h> 2460837b84b1SPaolo Bonzini #include <net/if.h> 2461837b84b1SPaolo Bonzini #include <net/netmap.h> 2462837b84b1SPaolo Bonzini #include <net/netmap_user.h> 2463837b84b1SPaolo Bonzini #if (NETMAP_API < 11) || (NETMAP_API > 15) 2464837b84b1SPaolo Bonzini #error 2465837b84b1SPaolo Bonzini #endif 2466837b84b1SPaolo Bonzini int main(void) { return 0; }''') 2467837b84b1SPaolo Bonzini if not have_netmap and get_option('netmap').enabled() 2468837b84b1SPaolo Bonzini error('Netmap headers not available') 2469837b84b1SPaolo Bonzini endif 2470837b84b1SPaolo Bonziniendif 2471837b84b1SPaolo Bonziniconfig_host_data.set('CONFIG_NETMAP', have_netmap) 2472837b84b1SPaolo Bonzini 247396a63aebSPaolo Bonzini# Work around a system header bug with some kernel/XFS header 247496a63aebSPaolo Bonzini# versions where they both try to define 'struct fsxattr': 247596a63aebSPaolo Bonzini# xfs headers will not try to redefine structs from linux headers 247696a63aebSPaolo Bonzini# if this macro is set. 247796a63aebSPaolo Bonziniconfig_host_data.set('HAVE_FSXATTR', cc.links(''' 24786a23f819SPaolo Bonzini #include <linux/fs.h> 247996a63aebSPaolo Bonzini struct fsxattr foo; 248096a63aebSPaolo Bonzini int main(void) { 248196a63aebSPaolo Bonzini return 0; 248296a63aebSPaolo Bonzini }''')) 248396a63aebSPaolo Bonzini 2484e46bd55dSPaolo Bonzini# Some versions of Mac OS X incorrectly define SIZE_MAX 2485e46bd55dSPaolo Bonziniconfig_host_data.set('HAVE_BROKEN_SIZE_MAX', not cc.compiles(''' 2486e46bd55dSPaolo Bonzini #include <stdint.h> 2487e46bd55dSPaolo Bonzini #include <stdio.h> 2488b5d3dac1SPaolo Bonzini int main(void) { 2489e46bd55dSPaolo Bonzini return printf("%zu", SIZE_MAX); 2490e46bd55dSPaolo Bonzini }''', args: ['-Werror'])) 2491e46bd55dSPaolo Bonzini 2492e61f1efeSRichard Henderson# See if 64-bit atomic operations are supported. 2493e61f1efeSRichard Henderson# Note that without __atomic builtins, we can only 2494e61f1efeSRichard Henderson# assume atomic loads/stores max at pointer size. 2495e61f1efeSRichard Hendersonconfig_host_data.set('CONFIG_ATOMIC64', cc.links(''' 2496bd87a367SPaolo Bonzini #include <stdint.h> 2497bd87a367SPaolo Bonzini int main(void) 2498bd87a367SPaolo Bonzini { 2499e61f1efeSRichard Henderson uint64_t x = 0, y = 0; 2500bd87a367SPaolo Bonzini y = __atomic_load_n(&x, __ATOMIC_RELAXED); 2501bd87a367SPaolo Bonzini __atomic_store_n(&x, y, __ATOMIC_RELAXED); 2502bd87a367SPaolo Bonzini __atomic_compare_exchange_n(&x, &y, x, 0, __ATOMIC_RELAXED, __ATOMIC_RELAXED); 2503bd87a367SPaolo Bonzini __atomic_exchange_n(&x, y, __ATOMIC_RELAXED); 2504bd87a367SPaolo Bonzini __atomic_fetch_add(&x, y, __ATOMIC_RELAXED); 2505bd87a367SPaolo Bonzini return 0; 2506e61f1efeSRichard Henderson }''')) 2507bd87a367SPaolo Bonzini 2508848126d1SMarc-André Lureauhas_int128 = cc.links(''' 2509848126d1SMarc-André Lureau __int128_t a; 2510848126d1SMarc-André Lureau __uint128_t b; 2511848126d1SMarc-André Lureau int main (void) { 2512848126d1SMarc-André Lureau a = a + b; 2513848126d1SMarc-André Lureau b = a * b; 2514848126d1SMarc-André Lureau a = a * a; 2515848126d1SMarc-André Lureau return 0; 2516848126d1SMarc-André Lureau }''') 2517848126d1SMarc-André Lureau 2518848126d1SMarc-André Lureauconfig_host_data.set('CONFIG_INT128', has_int128) 2519848126d1SMarc-André Lureau 2520848126d1SMarc-André Lureauif has_int128 2521d2958fb0SMarc-André Lureau # "do we have 128-bit atomics which are handled inline and specifically not 2522d2958fb0SMarc-André Lureau # via libatomic". The reason we can't use libatomic is documented in the 2523d2958fb0SMarc-André Lureau # comment starting "GCC is a house divided" in include/qemu/atomic128.h. 2524e61f1efeSRichard Henderson # We only care about these operations on 16-byte aligned pointers, so 2525e61f1efeSRichard Henderson # force 16-byte alignment of the pointer, which may be greater than 2526e61f1efeSRichard Henderson # __alignof(unsigned __int128) for the host. 2527e61f1efeSRichard Henderson atomic_test_128 = ''' 2528e61f1efeSRichard Henderson int main(int ac, char **av) { 2529e61f1efeSRichard Henderson unsigned __int128 *p = __builtin_assume_aligned(av[ac - 1], sizeof(16)); 2530e61f1efeSRichard Henderson p[1] = __atomic_load_n(&p[0], __ATOMIC_RELAXED); 2531e61f1efeSRichard Henderson __atomic_store_n(&p[2], p[3], __ATOMIC_RELAXED); 2532e61f1efeSRichard Henderson __atomic_compare_exchange_n(&p[4], &p[5], p[6], 0, __ATOMIC_RELAXED, __ATOMIC_RELAXED); 2533e61f1efeSRichard Henderson return 0; 2534e61f1efeSRichard Henderson }''' 2535e61f1efeSRichard Henderson has_atomic128 = cc.links(atomic_test_128) 2536848126d1SMarc-André Lureau 2537848126d1SMarc-André Lureau config_host_data.set('CONFIG_ATOMIC128', has_atomic128) 2538848126d1SMarc-André Lureau 2539848126d1SMarc-André Lureau if not has_atomic128 2540e61f1efeSRichard Henderson # Even with __builtin_assume_aligned, the above test may have failed 2541e61f1efeSRichard Henderson # without optimization enabled. Try again with optimizations locally 2542e61f1efeSRichard Henderson # enabled for the function. See 2543e61f1efeSRichard Henderson # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107389 2544e61f1efeSRichard Henderson has_atomic128_opt = cc.links('__attribute__((optimize("O1")))' + atomic_test_128) 2545e61f1efeSRichard Henderson config_host_data.set('CONFIG_ATOMIC128_OPT', has_atomic128_opt) 2546e61f1efeSRichard Henderson 2547e61f1efeSRichard Henderson if not has_atomic128_opt 2548e61f1efeSRichard Henderson config_host_data.set('CONFIG_CMPXCHG128', cc.links(''' 2549848126d1SMarc-André Lureau int main(void) 2550848126d1SMarc-André Lureau { 2551848126d1SMarc-André Lureau unsigned __int128 x = 0, y = 0; 2552848126d1SMarc-André Lureau __sync_val_compare_and_swap_16(&x, y, x); 2553848126d1SMarc-André Lureau return 0; 2554848126d1SMarc-André Lureau } 2555e61f1efeSRichard Henderson ''')) 2556e61f1efeSRichard Henderson endif 2557848126d1SMarc-André Lureau endif 2558848126d1SMarc-André Lureauendif 2559bd87a367SPaolo Bonzini 2560bd87a367SPaolo Bonziniconfig_host_data.set('CONFIG_GETAUXVAL', cc.links(gnu_source_prefix + ''' 2561bd87a367SPaolo Bonzini #include <sys/auxv.h> 2562bd87a367SPaolo Bonzini int main(void) { 2563bd87a367SPaolo Bonzini return getauxval(AT_HWCAP) == 0; 2564bd87a367SPaolo Bonzini }''')) 2565bd87a367SPaolo Bonzini 25660dae95d4SPaolo Bonziniconfig_host_data.set('CONFIG_USBFS', have_linux_user and cc.compiles(''' 25670dae95d4SPaolo Bonzini #include <linux/usbdevice_fs.h> 25680dae95d4SPaolo Bonzini 25690dae95d4SPaolo Bonzini #ifndef USBDEVFS_GET_CAPABILITIES 25700dae95d4SPaolo Bonzini #error "USBDEVFS_GET_CAPABILITIES undefined" 25710dae95d4SPaolo Bonzini #endif 25720dae95d4SPaolo Bonzini 25730dae95d4SPaolo Bonzini #ifndef USBDEVFS_DISCONNECT_CLAIM 25740dae95d4SPaolo Bonzini #error "USBDEVFS_DISCONNECT_CLAIM undefined" 25750dae95d4SPaolo Bonzini #endif 25760dae95d4SPaolo Bonzini 25770dae95d4SPaolo Bonzini int main(void) { return 0; }''')) 25780dae95d4SPaolo Bonzini 25792edd2c04SPaolo Bonzinihave_keyring = get_option('keyring') \ 25802edd2c04SPaolo Bonzini .require(targetos == 'linux', error_message: 'keyring is only available on Linux') \ 25812edd2c04SPaolo Bonzini .require(cc.compiles(''' 25822edd2c04SPaolo Bonzini #include <errno.h> 25832edd2c04SPaolo Bonzini #include <asm/unistd.h> 25842edd2c04SPaolo Bonzini #include <linux/keyctl.h> 25852edd2c04SPaolo Bonzini #include <sys/syscall.h> 25862edd2c04SPaolo Bonzini #include <unistd.h> 25872edd2c04SPaolo Bonzini int main(void) { 25882edd2c04SPaolo Bonzini return syscall(__NR_keyctl, KEYCTL_READ, 0, NULL, NULL, 0); 25892edd2c04SPaolo Bonzini }'''), error_message: 'keyctl syscall not available on this system').allowed() 25902edd2c04SPaolo Bonziniconfig_host_data.set('CONFIG_SECRET_KEYRING', have_keyring) 25912edd2c04SPaolo Bonzini 2592622753d2SPaolo Bonzinihave_cpuid_h = cc.links(''' 2593622753d2SPaolo Bonzini #include <cpuid.h> 2594622753d2SPaolo Bonzini int main(void) { 2595622753d2SPaolo Bonzini unsigned a, b, c, d; 2596622753d2SPaolo Bonzini unsigned max = __get_cpuid_max(0, 0); 2597622753d2SPaolo Bonzini 2598622753d2SPaolo Bonzini if (max >= 1) { 2599622753d2SPaolo Bonzini __cpuid(1, a, b, c, d); 2600622753d2SPaolo Bonzini } 2601622753d2SPaolo Bonzini 2602622753d2SPaolo Bonzini if (max >= 7) { 2603622753d2SPaolo Bonzini __cpuid_count(7, 0, a, b, c, d); 2604622753d2SPaolo Bonzini } 2605622753d2SPaolo Bonzini 2606622753d2SPaolo Bonzini return 0; 2607622753d2SPaolo Bonzini }''') 2608622753d2SPaolo Bonziniconfig_host_data.set('CONFIG_CPUID_H', have_cpuid_h) 2609622753d2SPaolo Bonzini 2610622753d2SPaolo Bonziniconfig_host_data.set('CONFIG_AVX2_OPT', get_option('avx2') \ 2611622753d2SPaolo Bonzini .require(have_cpuid_h, error_message: 'cpuid.h not available, cannot enable AVX2') \ 2612622753d2SPaolo Bonzini .require(cc.links(''' 2613622753d2SPaolo Bonzini #include <cpuid.h> 2614622753d2SPaolo Bonzini #include <immintrin.h> 2615701ea587SRichard Henderson static int __attribute__((target("avx2"))) bar(void *a) { 2616622753d2SPaolo Bonzini __m256i x = *(__m256i *)a; 2617622753d2SPaolo Bonzini return _mm256_testz_si256(x, x); 2618622753d2SPaolo Bonzini } 2619b5d3dac1SPaolo Bonzini int main(int argc, char *argv[]) { return bar(argv[argc - 1]); } 2620622753d2SPaolo Bonzini '''), error_message: 'AVX2 not available').allowed()) 2621622753d2SPaolo Bonzini 2622622753d2SPaolo Bonziniconfig_host_data.set('CONFIG_AVX512F_OPT', get_option('avx512f') \ 2623622753d2SPaolo Bonzini .require(have_cpuid_h, error_message: 'cpuid.h not available, cannot enable AVX512F') \ 2624622753d2SPaolo Bonzini .require(cc.links(''' 2625622753d2SPaolo Bonzini #include <cpuid.h> 2626622753d2SPaolo Bonzini #include <immintrin.h> 2627701ea587SRichard Henderson static int __attribute__((target("avx512f"))) bar(void *a) { 2628622753d2SPaolo Bonzini __m512i x = *(__m512i *)a; 2629622753d2SPaolo Bonzini return _mm512_test_epi64_mask(x, x); 2630622753d2SPaolo Bonzini } 2631b5d3dac1SPaolo Bonzini int main(int argc, char *argv[]) { return bar(argv[argc - 1]); } 2632622753d2SPaolo Bonzini '''), error_message: 'AVX512F not available').allowed()) 2633622753d2SPaolo Bonzini 263404ffce13Sling xuconfig_host_data.set('CONFIG_AVX512BW_OPT', get_option('avx512bw') \ 263504ffce13Sling xu .require(have_cpuid_h, error_message: 'cpuid.h not available, cannot enable AVX512BW') \ 263604ffce13Sling xu .require(cc.links(''' 263704ffce13Sling xu #include <cpuid.h> 263804ffce13Sling xu #include <immintrin.h> 2639dc165fcdSRichard Henderson static int __attribute__((target("avx512bw"))) bar(void *a) { 264004ffce13Sling xu __m512i *x = a; 264104ffce13Sling xu __m512i res= _mm512_abs_epi8(*x); 264204ffce13Sling xu return res[1]; 264304ffce13Sling xu } 264404ffce13Sling xu int main(int argc, char *argv[]) { return bar(argv[0]); } 264504ffce13Sling xu '''), error_message: 'AVX512BW not available').allowed()) 264604ffce13Sling xu 26473730a734SPaolo Bonzinihave_pvrdma = get_option('pvrdma') \ 26483730a734SPaolo Bonzini .require(rdma.found(), error_message: 'PVRDMA requires OpenFabrics libraries') \ 2649354d2d9bSJuan Quintela .require(cc.compiles(gnu_source_prefix + ''' 2650354d2d9bSJuan Quintela #include <sys/mman.h> 26513730a734SPaolo Bonzini int main(void) 26523730a734SPaolo Bonzini { 26533730a734SPaolo Bonzini char buf = 0; 26543730a734SPaolo Bonzini void *addr = &buf; 26553730a734SPaolo Bonzini addr = mremap(addr, 0, 1, MREMAP_MAYMOVE | MREMAP_FIXED); 26563730a734SPaolo Bonzini 26573730a734SPaolo Bonzini return 0; 26583730a734SPaolo Bonzini }'''), error_message: 'PVRDMA requires mremap').allowed() 26593730a734SPaolo Bonzini 26603730a734SPaolo Bonziniif have_pvrdma 2661354d2d9bSJuan Quintela config_host_data.set('LEGACY_RDMA_REG_MR', not cc.links(''' 26623730a734SPaolo Bonzini #include <infiniband/verbs.h> 26633730a734SPaolo Bonzini int main(void) 26643730a734SPaolo Bonzini { 26653730a734SPaolo Bonzini struct ibv_mr *mr; 26663730a734SPaolo Bonzini struct ibv_pd *pd = NULL; 26673730a734SPaolo Bonzini size_t length = 10; 26683730a734SPaolo Bonzini uint64_t iova = 0; 26693730a734SPaolo Bonzini int access = 0; 26703730a734SPaolo Bonzini void *addr = NULL; 26713730a734SPaolo Bonzini 26723730a734SPaolo Bonzini mr = ibv_reg_mr_iova(pd, addr, length, iova, access); 26733730a734SPaolo Bonzini ibv_dereg_mr(mr); 26743730a734SPaolo Bonzini return 0; 26753730a734SPaolo Bonzini }''')) 26763730a734SPaolo Bonziniendif 26773730a734SPaolo Bonzini 2678b87df904SPaolo Bonziniif get_option('membarrier').disabled() 2679b87df904SPaolo Bonzini have_membarrier = false 2680b87df904SPaolo Bonzinielif targetos == 'windows' 2681b87df904SPaolo Bonzini have_membarrier = true 2682b87df904SPaolo Bonzinielif targetos == 'linux' 2683b87df904SPaolo Bonzini have_membarrier = cc.compiles(''' 2684b87df904SPaolo Bonzini #include <linux/membarrier.h> 2685b87df904SPaolo Bonzini #include <sys/syscall.h> 2686b87df904SPaolo Bonzini #include <unistd.h> 2687b87df904SPaolo Bonzini #include <stdlib.h> 2688b87df904SPaolo Bonzini int main(void) { 2689b87df904SPaolo Bonzini syscall(__NR_membarrier, MEMBARRIER_CMD_QUERY, 0); 2690b87df904SPaolo Bonzini syscall(__NR_membarrier, MEMBARRIER_CMD_SHARED, 0); 2691b87df904SPaolo Bonzini exit(0); 2692b87df904SPaolo Bonzini }''') 2693b87df904SPaolo Bonziniendif 2694b87df904SPaolo Bonziniconfig_host_data.set('CONFIG_MEMBARRIER', get_option('membarrier') \ 2695b87df904SPaolo Bonzini .require(have_membarrier, error_message: 'membarrier system call not available') \ 2696b87df904SPaolo Bonzini .allowed()) 2697b87df904SPaolo Bonzini 269834b52615SPaolo Bonzinihave_afalg = get_option('crypto_afalg') \ 269934b52615SPaolo Bonzini .require(cc.compiles(gnu_source_prefix + ''' 270034b52615SPaolo Bonzini #include <errno.h> 270134b52615SPaolo Bonzini #include <sys/types.h> 270234b52615SPaolo Bonzini #include <sys/socket.h> 270334b52615SPaolo Bonzini #include <linux/if_alg.h> 270434b52615SPaolo Bonzini int main(void) { 270534b52615SPaolo Bonzini int sock; 270634b52615SPaolo Bonzini sock = socket(AF_ALG, SOCK_SEQPACKET, 0); 270734b52615SPaolo Bonzini return sock; 270834b52615SPaolo Bonzini } 270934b52615SPaolo Bonzini '''), error_message: 'AF_ALG requested but could not be detected').allowed() 271034b52615SPaolo Bonziniconfig_host_data.set('CONFIG_AF_ALG', have_afalg) 271134b52615SPaolo Bonzini 27129d734b85SMarc-André Lureauconfig_host_data.set('CONFIG_AF_VSOCK', cc.has_header_symbol( 27139d734b85SMarc-André Lureau 'linux/vm_sockets.h', 'AF_VSOCK', 27149d734b85SMarc-André Lureau prefix: '#include <sys/socket.h>', 27159d734b85SMarc-André Lureau)) 2716bd87a367SPaolo Bonzini 27178821a389SMarc-André Lureauhave_vss = false 2718872b69e6SMarc-André Lureauhave_vss_sdk = false # old xp/2003 SDK 27198821a389SMarc-André Lureauif targetos == 'windows' and link_language == 'cpp' 27208821a389SMarc-André Lureau have_vss = cxx.compiles(''' 27218821a389SMarc-André Lureau #define __MIDL_user_allocate_free_DEFINED__ 272232478cb6SMarc-André Lureau #include <vss.h> 27238821a389SMarc-André Lureau int main(void) { return VSS_CTX_BACKUP; }''') 2724872b69e6SMarc-André Lureau have_vss_sdk = cxx.has_header('vscoordint.h') 27258821a389SMarc-André Lureauendif 2726872b69e6SMarc-André Lureauconfig_host_data.set('HAVE_VSS_SDK', have_vss_sdk) 27278821a389SMarc-André Lureau 2728859aef02SPaolo Bonziniforeach k, v: config_host 2729ce6119dcSPaolo Bonzini if k.startswith('CONFIG_') 2730859aef02SPaolo Bonzini config_host_data.set(k, v == 'y' ? 1 : v) 2731859aef02SPaolo Bonzini endif 2732859aef02SPaolo Bonziniendforeach 2733859aef02SPaolo Bonzini 27346391c772SRichard Henderson# Older versions of MinGW do not import _lock_file and _unlock_file properly. 27356391c772SRichard Henderson# This was fixed for v6.0.0 with commit b48e3ac8969d. 27366391c772SRichard Hendersonif targetos == 'windows' 27376391c772SRichard Henderson config_host_data.set('HAVE__LOCK_FILE', cc.links(''' 27386391c772SRichard Henderson #include <stdio.h> 27396391c772SRichard Henderson int main(void) { 27406391c772SRichard Henderson _lock_file(NULL); 27416391c772SRichard Henderson _unlock_file(NULL); 27426391c772SRichard Henderson return 0; 27436391c772SRichard Henderson }''', name: '_lock_file and _unlock_file')) 27446391c772SRichard Hendersonendif 27456391c772SRichard Henderson 2746dbd672c8SPierrick Bouvierif targetos == 'windows' 2747dbd672c8SPierrick Bouvier mingw_has_setjmp_longjmp = cc.links(''' 2748dbd672c8SPierrick Bouvier #include <setjmp.h> 2749dbd672c8SPierrick Bouvier int main(void) { 2750dbd672c8SPierrick Bouvier /* 2751dbd672c8SPierrick Bouvier * These functions are not available in setjmp header, but may be 2752dbd672c8SPierrick Bouvier * available at link time, from libmingwex.a. 2753dbd672c8SPierrick Bouvier */ 2754dbd672c8SPierrick Bouvier extern int __mingw_setjmp(jmp_buf); 2755dbd672c8SPierrick Bouvier extern void __attribute__((noreturn)) __mingw_longjmp(jmp_buf, int); 2756dbd672c8SPierrick Bouvier jmp_buf env; 2757dbd672c8SPierrick Bouvier __mingw_setjmp(env); 2758dbd672c8SPierrick Bouvier __mingw_longjmp(env, 0); 2759dbd672c8SPierrick Bouvier } 2760dbd672c8SPierrick Bouvier ''', name: 'mingw setjmp and longjmp') 2761dbd672c8SPierrick Bouvier 2762dbd672c8SPierrick Bouvier if cpu == 'aarch64' and not mingw_has_setjmp_longjmp 2763dbd672c8SPierrick Bouvier error('mingw must provide setjmp/longjmp for windows-arm64') 2764dbd672c8SPierrick Bouvier endif 2765dbd672c8SPierrick Bouvierendif 2766dbd672c8SPierrick Bouvier 2767a0c9162cSPaolo Bonzini######################## 2768a0c9162cSPaolo Bonzini# Target configuration # 2769a0c9162cSPaolo Bonzini######################## 2770a0c9162cSPaolo Bonzini 27712becc36aSPaolo Bonziniminikconf = find_program('scripts/minikconf.py') 277205512f55SPaolo Bonziniconfig_all = {} 2773a98006bcSPaolo Bonziniconfig_all_devices = {} 2774ca0fc784SPaolo Bonziniconfig_all_disas = {} 27752becc36aSPaolo Bonziniconfig_devices_mak_list = [] 27762becc36aSPaolo Bonziniconfig_devices_h = {} 2777859aef02SPaolo Bonziniconfig_target_h = {} 27782becc36aSPaolo Bonziniconfig_target_mak = {} 2779ca0fc784SPaolo Bonzini 2780ca0fc784SPaolo Bonzinidisassemblers = { 2781ca0fc784SPaolo Bonzini 'alpha' : ['CONFIG_ALPHA_DIS'], 2782ca0fc784SPaolo Bonzini 'avr' : ['CONFIG_AVR_DIS'], 2783ca0fc784SPaolo Bonzini 'cris' : ['CONFIG_CRIS_DIS'], 27843e7a84eeSTaylor Simpson 'hexagon' : ['CONFIG_HEXAGON_DIS'], 2785ca0fc784SPaolo Bonzini 'hppa' : ['CONFIG_HPPA_DIS'], 2786ca0fc784SPaolo Bonzini 'i386' : ['CONFIG_I386_DIS'], 2787ca0fc784SPaolo Bonzini 'x86_64' : ['CONFIG_I386_DIS'], 2788ca0fc784SPaolo Bonzini 'm68k' : ['CONFIG_M68K_DIS'], 2789ca0fc784SPaolo Bonzini 'microblaze' : ['CONFIG_MICROBLAZE_DIS'], 2790ca0fc784SPaolo Bonzini 'mips' : ['CONFIG_MIPS_DIS'], 2791ca0fc784SPaolo Bonzini 'nios2' : ['CONFIG_NIOS2_DIS'], 2792ca0fc784SPaolo Bonzini 'or1k' : ['CONFIG_OPENRISC_DIS'], 2793ca0fc784SPaolo Bonzini 'ppc' : ['CONFIG_PPC_DIS'], 2794ca0fc784SPaolo Bonzini 'riscv' : ['CONFIG_RISCV_DIS'], 2795ca0fc784SPaolo Bonzini 'rx' : ['CONFIG_RX_DIS'], 2796ca0fc784SPaolo Bonzini 's390' : ['CONFIG_S390_DIS'], 2797ca0fc784SPaolo Bonzini 'sh4' : ['CONFIG_SH4_DIS'], 2798ca0fc784SPaolo Bonzini 'sparc' : ['CONFIG_SPARC_DIS'], 2799ca0fc784SPaolo Bonzini 'xtensa' : ['CONFIG_XTENSA_DIS'], 2800aae1746cSSong Gao 'loongarch' : ['CONFIG_LOONGARCH_DIS'], 2801ca0fc784SPaolo Bonzini} 2802ca0fc784SPaolo Bonzini 2803e1fbd2c4SPaolo Bonzinihave_ivshmem = config_host_data.get('CONFIG_EVENTFD') 28040a189110SPaolo Bonzinihost_kconfig = \ 2805537b7248SPaolo Bonzini (get_option('fuzzing') ? ['CONFIG_FUZZ=y'] : []) + \ 28060d04c4c9SPaolo Bonzini (have_tpm ? ['CONFIG_TPM=y'] : []) + \ 28073f0a5d55SMarc-André Lureau (spice.found() ? ['CONFIG_SPICE=y'] : []) + \ 2808ccd250aaSPaolo Bonzini (have_ivshmem ? ['CONFIG_IVSHMEM=y'] : []) + \ 280988b6e618SPaolo Bonzini (opengl.found() ? ['CONFIG_OPENGL=y'] : []) + \ 28109d71037fSPaolo Bonzini (x11.found() ? ['CONFIG_X11=y'] : []) + \ 28112a3129a3SPaolo Bonzini (have_vhost_user ? ['CONFIG_VHOST_USER=y'] : []) + \ 28122a3129a3SPaolo Bonzini (have_vhost_vdpa ? ['CONFIG_VHOST_VDPA=y'] : []) + \ 28132a3129a3SPaolo Bonzini (have_vhost_kernel ? ['CONFIG_VHOST_KERNEL=y'] : []) + \ 281469202b40SPaolo Bonzini (have_virtfs ? ['CONFIG_VIRTFS=y'] : []) + \ 28150a189110SPaolo Bonzini ('CONFIG_LINUX' in config_host ? ['CONFIG_LINUX=y'] : []) + \ 28163730a734SPaolo Bonzini (have_pvrdma ? ['CONFIG_PVRDMA=y'] : []) + \ 281755116968SJagannathan Raman (multiprocess_allowed ? ['CONFIG_MULTIPROCESS_ALLOWED=y'] : []) + \ 281855116968SJagannathan Raman (vfio_user_server_allowed ? ['CONFIG_VFIO_USER_SERVER_ALLOWED=y'] : []) 28190a189110SPaolo Bonzini 2820a9a74907SPaolo Bonziniignored = [ 'TARGET_XML_FILES', 'TARGET_ABI_DIR', 'TARGET_ARCH' ] 2821ca0fc784SPaolo Bonzini 2822fdb75aefSPaolo Bonzinidefault_targets = 'CONFIG_DEFAULT_TARGETS' in config_host 2823fdb75aefSPaolo Bonziniactual_target_dirs = [] 2824fbb4121dSPaolo Bonzinifdt_required = [] 2825a81df1b6SPaolo Bonziniforeach target : target_dirs 2826765686d6SPaolo Bonzini config_target = { 'TARGET_NAME': target.split('-')[0] } 2827765686d6SPaolo Bonzini if target.endswith('linux-user') 2828fdb75aefSPaolo Bonzini if targetos != 'linux' 2829fdb75aefSPaolo Bonzini if default_targets 2830fdb75aefSPaolo Bonzini continue 2831fdb75aefSPaolo Bonzini endif 2832fdb75aefSPaolo Bonzini error('Target @0@ is only available on a Linux host'.format(target)) 2833fdb75aefSPaolo Bonzini endif 2834765686d6SPaolo Bonzini config_target += { 'CONFIG_LINUX_USER': 'y' } 2835765686d6SPaolo Bonzini elif target.endswith('bsd-user') 2836fdb75aefSPaolo Bonzini if 'CONFIG_BSD' not in config_host 2837fdb75aefSPaolo Bonzini if default_targets 2838fdb75aefSPaolo Bonzini continue 2839fdb75aefSPaolo Bonzini endif 2840fdb75aefSPaolo Bonzini error('Target @0@ is only available on a BSD host'.format(target)) 2841fdb75aefSPaolo Bonzini endif 2842765686d6SPaolo Bonzini config_target += { 'CONFIG_BSD_USER': 'y' } 2843765686d6SPaolo Bonzini elif target.endswith('softmmu') 2844765686d6SPaolo Bonzini config_target += { 'CONFIG_SOFTMMU': 'y' } 2845765686d6SPaolo Bonzini endif 2846765686d6SPaolo Bonzini if target.endswith('-user') 2847765686d6SPaolo Bonzini config_target += { 2848765686d6SPaolo Bonzini 'CONFIG_USER_ONLY': 'y', 2849765686d6SPaolo Bonzini 'CONFIG_QEMU_INTERP_PREFIX': 2850ce6119dcSPaolo Bonzini get_option('interp_prefix').replace('%M', config_target['TARGET_NAME']) 2851765686d6SPaolo Bonzini } 2852765686d6SPaolo Bonzini endif 2853859aef02SPaolo Bonzini 28540a189110SPaolo Bonzini accel_kconfig = [] 28558a19980eSPaolo Bonzini foreach sym: accelerators 28568a19980eSPaolo Bonzini if sym == 'CONFIG_TCG' or target in accelerator_targets.get(sym, []) 28578a19980eSPaolo Bonzini config_target += { sym: 'y' } 28588a19980eSPaolo Bonzini config_all += { sym: 'y' } 2859dae0ec15SGerd Hoffmann if target in modular_tcg 2860dae0ec15SGerd Hoffmann config_target += { 'CONFIG_TCG_MODULAR': 'y' } 2861dae0ec15SGerd Hoffmann else 2862dae0ec15SGerd Hoffmann config_target += { 'CONFIG_TCG_BUILTIN': 'y' } 2863dae0ec15SGerd Hoffmann endif 28640a189110SPaolo Bonzini accel_kconfig += [ sym + '=y' ] 28658a19980eSPaolo Bonzini endif 28668a19980eSPaolo Bonzini endforeach 28670a189110SPaolo Bonzini if accel_kconfig.length() == 0 2868fdb75aefSPaolo Bonzini if default_targets 2869fdb75aefSPaolo Bonzini continue 2870fdb75aefSPaolo Bonzini endif 2871fdb75aefSPaolo Bonzini error('No accelerator available for target @0@'.format(target)) 2872fdb75aefSPaolo Bonzini endif 28738a19980eSPaolo Bonzini 2874fdb75aefSPaolo Bonzini actual_target_dirs += target 2875812b31d3SAlex Bennée config_target += keyval.load('configs/targets' / target + '.mak') 2876a9a74907SPaolo Bonzini config_target += { 'TARGET_' + config_target['TARGET_ARCH'].to_upper(): 'y' } 2877765686d6SPaolo Bonzini 2878fbb4121dSPaolo Bonzini if 'TARGET_NEED_FDT' in config_target 2879fbb4121dSPaolo Bonzini fdt_required += target 2880fbb4121dSPaolo Bonzini endif 2881fbb4121dSPaolo Bonzini 2882fa73168bSPaolo Bonzini # Add default keys 2883fa73168bSPaolo Bonzini if 'TARGET_BASE_ARCH' not in config_target 2884fa73168bSPaolo Bonzini config_target += {'TARGET_BASE_ARCH': config_target['TARGET_ARCH']} 2885fa73168bSPaolo Bonzini endif 2886fa73168bSPaolo Bonzini if 'TARGET_ABI_DIR' not in config_target 2887fa73168bSPaolo Bonzini config_target += {'TARGET_ABI_DIR': config_target['TARGET_ARCH']} 2888fa73168bSPaolo Bonzini endif 2889ee3eb3a7SMarc-André Lureau if 'TARGET_BIG_ENDIAN' not in config_target 2890ee3eb3a7SMarc-André Lureau config_target += {'TARGET_BIG_ENDIAN': 'n'} 2891ee3eb3a7SMarc-André Lureau endif 2892859aef02SPaolo Bonzini 2893ca0fc784SPaolo Bonzini foreach k, v: disassemblers 2894823eb013SPaolo Bonzini if host_arch.startswith(k) or config_target['TARGET_BASE_ARCH'].startswith(k) 2895ca0fc784SPaolo Bonzini foreach sym: v 2896ca0fc784SPaolo Bonzini config_target += { sym: 'y' } 2897ca0fc784SPaolo Bonzini config_all_disas += { sym: 'y' } 2898ca0fc784SPaolo Bonzini endforeach 2899ca0fc784SPaolo Bonzini endif 2900ca0fc784SPaolo Bonzini endforeach 2901ca0fc784SPaolo Bonzini 2902859aef02SPaolo Bonzini config_target_data = configuration_data() 2903859aef02SPaolo Bonzini foreach k, v: config_target 2904859aef02SPaolo Bonzini if not k.startswith('TARGET_') and not k.startswith('CONFIG_') 2905859aef02SPaolo Bonzini # do nothing 2906859aef02SPaolo Bonzini elif ignored.contains(k) 2907859aef02SPaolo Bonzini # do nothing 2908859aef02SPaolo Bonzini elif k == 'TARGET_BASE_ARCH' 2909a9a74907SPaolo Bonzini # Note that TARGET_BASE_ARCH ends up in config-target.h but it is 2910a9a74907SPaolo Bonzini # not used to select files from sourcesets. 2911859aef02SPaolo Bonzini config_target_data.set('TARGET_' + v.to_upper(), 1) 2912765686d6SPaolo Bonzini elif k == 'TARGET_NAME' or k == 'CONFIG_QEMU_INTERP_PREFIX' 2913859aef02SPaolo Bonzini config_target_data.set_quoted(k, v) 2914859aef02SPaolo Bonzini elif v == 'y' 2915859aef02SPaolo Bonzini config_target_data.set(k, 1) 2916ee3eb3a7SMarc-André Lureau elif v == 'n' 2917ee3eb3a7SMarc-André Lureau config_target_data.set(k, 0) 2918859aef02SPaolo Bonzini else 2919859aef02SPaolo Bonzini config_target_data.set(k, v) 2920859aef02SPaolo Bonzini endif 2921859aef02SPaolo Bonzini endforeach 2922cb2c5531SPeter Maydell config_target_data.set('QEMU_ARCH', 2923cb2c5531SPeter Maydell 'QEMU_ARCH_' + config_target['TARGET_BASE_ARCH'].to_upper()) 2924859aef02SPaolo Bonzini config_target_h += {target: configure_file(output: target + '-config-target.h', 2925859aef02SPaolo Bonzini configuration: config_target_data)} 29262becc36aSPaolo Bonzini 29272becc36aSPaolo Bonzini if target.endswith('-softmmu') 2928d1d5e9eeSAlex Bennée config_input = meson.get_external_property(target, 'default') 29292becc36aSPaolo Bonzini config_devices_mak = target + '-config-devices.mak' 29302becc36aSPaolo Bonzini config_devices_mak = configure_file( 2931d1d5e9eeSAlex Bennée input: ['configs/devices' / target / config_input + '.mak', 'Kconfig'], 29322becc36aSPaolo Bonzini output: config_devices_mak, 29332becc36aSPaolo Bonzini depfile: config_devices_mak + '.d', 29342becc36aSPaolo Bonzini capture: true, 29357bc3ca7fSPaolo Bonzini command: [minikconf, 29367bc3ca7fSPaolo Bonzini get_option('default_devices') ? '--defconfig' : '--allnoconfig', 29372becc36aSPaolo Bonzini config_devices_mak, '@DEPFILE@', '@INPUT@', 2938f4063f9cSPhilippe Mathieu-Daudé host_kconfig, accel_kconfig, 2939f4063f9cSPhilippe Mathieu-Daudé 'CONFIG_' + config_target['TARGET_ARCH'].to_upper() + '=y']) 2940859aef02SPaolo Bonzini 2941859aef02SPaolo Bonzini config_devices_data = configuration_data() 2942859aef02SPaolo Bonzini config_devices = keyval.load(config_devices_mak) 2943859aef02SPaolo Bonzini foreach k, v: config_devices 2944859aef02SPaolo Bonzini config_devices_data.set(k, 1) 2945859aef02SPaolo Bonzini endforeach 29462becc36aSPaolo Bonzini config_devices_mak_list += config_devices_mak 2947859aef02SPaolo Bonzini config_devices_h += {target: configure_file(output: target + '-config-devices.h', 2948859aef02SPaolo Bonzini configuration: config_devices_data)} 2949859aef02SPaolo Bonzini config_target += config_devices 2950a98006bcSPaolo Bonzini config_all_devices += config_devices 29512becc36aSPaolo Bonzini endif 29522becc36aSPaolo Bonzini config_target_mak += {target: config_target} 2953a81df1b6SPaolo Bonziniendforeach 2954fdb75aefSPaolo Bonzinitarget_dirs = actual_target_dirs 2955a81df1b6SPaolo Bonzini 29562becc36aSPaolo Bonzini# This configuration is used to build files that are shared by 29572becc36aSPaolo Bonzini# multiple binaries, and then extracted out of the "common" 29582becc36aSPaolo Bonzini# static_library target. 29592becc36aSPaolo Bonzini# 29602becc36aSPaolo Bonzini# We do not use all_sources()/all_dependencies(), because it would 29612becc36aSPaolo Bonzini# build literally all source files, including devices only used by 29622becc36aSPaolo Bonzini# targets that are not built for this compilation. The CONFIG_ALL 29632becc36aSPaolo Bonzini# pseudo symbol replaces it. 29642becc36aSPaolo Bonzini 296505512f55SPaolo Bonziniconfig_all += config_all_devices 29662becc36aSPaolo Bonziniconfig_all += config_host 29672becc36aSPaolo Bonziniconfig_all += config_all_disas 29682becc36aSPaolo Bonziniconfig_all += { 296914efd8d3SPaolo Bonzini 'CONFIG_XEN': xen.found(), 29702becc36aSPaolo Bonzini 'CONFIG_SOFTMMU': have_system, 29712becc36aSPaolo Bonzini 'CONFIG_USER_ONLY': have_user, 29722becc36aSPaolo Bonzini 'CONFIG_ALL': true, 29732becc36aSPaolo Bonzini} 29742becc36aSPaolo Bonzini 2975eed56e9aSPaolo Bonzinitarget_configs_h = [] 2976eed56e9aSPaolo Bonziniforeach target: target_dirs 2977eed56e9aSPaolo Bonzini target_configs_h += config_target_h[target] 2978eed56e9aSPaolo Bonzini target_configs_h += config_devices_h.get(target, []) 2979eed56e9aSPaolo Bonziniendforeach 2980eed56e9aSPaolo Bonzinigenh += custom_target('config-poison.h', 2981eed56e9aSPaolo Bonzini input: [target_configs_h], 2982eed56e9aSPaolo Bonzini output: 'config-poison.h', 2983eed56e9aSPaolo Bonzini capture: true, 2984eed56e9aSPaolo Bonzini command: [find_program('scripts/make-config-poison.sh'), 2985eed56e9aSPaolo Bonzini target_configs_h]) 2986eed56e9aSPaolo Bonzini 2987a0c9162cSPaolo Bonzini############## 2988a0c9162cSPaolo Bonzini# Submodules # 2989a0c9162cSPaolo Bonzini############## 29908b18cdbfSRichard Henderson 29918b18cdbfSRichard Hendersoncapstone = not_found 299283602083SThomas Huthif not get_option('capstone').auto() or have_system or have_user 299343ecd166SThomas Huth capstone = dependency('capstone', version: '>=3.0.5', 2994063d5119SPaolo Bonzini method: 'pkg-config', 299583602083SThomas Huth required: get_option('capstone')) 29968f4aea71SDaniel P. Berrangé 29978f4aea71SDaniel P. Berrangé # Some versions of capstone have broken pkg-config file 29988f4aea71SDaniel P. Berrangé # that reports a wrong -I path, causing the #include to 29998f4aea71SDaniel P. Berrangé # fail later. If the system has such a broken version 30008f4aea71SDaniel P. Berrangé # do not use it. 30018f4aea71SDaniel P. Berrangé if capstone.found() and not cc.compiles('#include <capstone.h>', 30028f4aea71SDaniel P. Berrangé dependencies: [capstone]) 30038f4aea71SDaniel P. Berrangé capstone = not_found 300483602083SThomas Huth if get_option('capstone').enabled() 300583602083SThomas Huth error('capstone requested, but it does not appear to work') 30068f4aea71SDaniel P. Berrangé endif 30078f4aea71SDaniel P. Berrangé endif 30088b18cdbfSRichard Hendersonendif 30094d34a86bSPaolo Bonzini 301055116968SJagannathan Ramanlibvfio_user_dep = not_found 301155116968SJagannathan Ramanif have_system and vfio_user_server_allowed 301255116968SJagannathan Raman have_internal = fs.exists(meson.current_source_dir() / 'subprojects/libvfio-user/meson.build') 301355116968SJagannathan Raman 301455116968SJagannathan Raman if not have_internal 301555116968SJagannathan Raman error('libvfio-user source not found - please pull git submodule') 301655116968SJagannathan Raman endif 301755116968SJagannathan Raman 301855116968SJagannathan Raman libvfio_user_proj = subproject('libvfio-user') 301955116968SJagannathan Raman 30205328353cSPaolo Bonzini libvfio_user_dep = libvfio_user_proj.get_variable('libvfio_user_dep') 302155116968SJagannathan Ramanendif 302255116968SJagannathan Raman 3023fbb4121dSPaolo Bonzinifdt = not_found 3024fbb4121dSPaolo Bonziniif have_system 3025c593d841SPhilippe Mathieu-Daudé fdt_opt = get_option('fdt') 3026fbb4121dSPaolo Bonzini if fdt_opt in ['enabled', 'auto', 'system'] 3027fbb4121dSPaolo Bonzini have_internal = fs.exists(meson.current_source_dir() / 'dtc/libfdt/Makefile.libfdt') 3028063d5119SPaolo Bonzini fdt = cc.find_library('fdt', 3029fbb4121dSPaolo Bonzini required: fdt_opt == 'system' or 3030fbb4121dSPaolo Bonzini fdt_opt == 'enabled' and not have_internal) 3031fbb4121dSPaolo Bonzini if fdt.found() and cc.links(''' 3032fbb4121dSPaolo Bonzini #include <libfdt.h> 3033fbb4121dSPaolo Bonzini #include <libfdt_env.h> 3034de47b0ffSThomas Huth int main(void) { fdt_find_max_phandle(NULL, NULL); return 0; }''', 3035fbb4121dSPaolo Bonzini dependencies: fdt) 3036fbb4121dSPaolo Bonzini fdt_opt = 'system' 30376c22853cSThomas Huth elif fdt_opt == 'system' 30386c22853cSThomas Huth error('system libfdt requested, but it is too old (1.5.1 or newer required)') 3039fbb4121dSPaolo Bonzini elif have_internal 3040fbb4121dSPaolo Bonzini fdt_opt = 'internal' 3041fbb4121dSPaolo Bonzini else 3042fbb4121dSPaolo Bonzini fdt_opt = 'disabled' 304387daf898SThomas Huth fdt = not_found 3044fbb4121dSPaolo Bonzini endif 3045fbb4121dSPaolo Bonzini endif 3046fbb4121dSPaolo Bonzini if fdt_opt == 'internal' 3047fbb4121dSPaolo Bonzini fdt_files = files( 3048fbb4121dSPaolo Bonzini 'dtc/libfdt/fdt.c', 3049fbb4121dSPaolo Bonzini 'dtc/libfdt/fdt_ro.c', 3050fbb4121dSPaolo Bonzini 'dtc/libfdt/fdt_wip.c', 3051fbb4121dSPaolo Bonzini 'dtc/libfdt/fdt_sw.c', 3052fbb4121dSPaolo Bonzini 'dtc/libfdt/fdt_rw.c', 3053fbb4121dSPaolo Bonzini 'dtc/libfdt/fdt_strerror.c', 3054fbb4121dSPaolo Bonzini 'dtc/libfdt/fdt_empty_tree.c', 3055fbb4121dSPaolo Bonzini 'dtc/libfdt/fdt_addresses.c', 3056fbb4121dSPaolo Bonzini 'dtc/libfdt/fdt_overlay.c', 3057fbb4121dSPaolo Bonzini 'dtc/libfdt/fdt_check.c', 3058fbb4121dSPaolo Bonzini ) 3059fbb4121dSPaolo Bonzini 3060fbb4121dSPaolo Bonzini fdt_inc = include_directories('dtc/libfdt') 3061fbb4121dSPaolo Bonzini libfdt = static_library('fdt', 3062610e7e0eSPhilippe Mathieu-Daudé build_by_default: false, 3063fbb4121dSPaolo Bonzini sources: fdt_files, 3064fbb4121dSPaolo Bonzini include_directories: fdt_inc) 3065fbb4121dSPaolo Bonzini fdt = declare_dependency(link_with: libfdt, 3066fbb4121dSPaolo Bonzini include_directories: fdt_inc) 3067fbb4121dSPaolo Bonzini endif 3068c593d841SPhilippe Mathieu-Daudéelse 3069c593d841SPhilippe Mathieu-Daudé fdt_opt = 'disabled' 3070fbb4121dSPaolo Bonziniendif 3071fbb4121dSPaolo Bonziniif not fdt.found() and fdt_required.length() > 0 3072fbb4121dSPaolo Bonzini error('fdt not available but required by targets ' + ', '.join(fdt_required)) 3073fbb4121dSPaolo Bonziniendif 3074fbb4121dSPaolo Bonzini 30758b18cdbfSRichard Hendersonconfig_host_data.set('CONFIG_CAPSTONE', capstone.found()) 3076fbb4121dSPaolo Bonziniconfig_host_data.set('CONFIG_FDT', fdt.found()) 30774d34a86bSPaolo Bonziniconfig_host_data.set('CONFIG_SLIRP', slirp.found()) 30788b18cdbfSRichard Henderson 3079a0c9162cSPaolo Bonzini##################### 3080a0c9162cSPaolo Bonzini# Generated sources # 3081a0c9162cSPaolo Bonzini##################### 30828b18cdbfSRichard Henderson 3083a0c9162cSPaolo Bonzinigenh += configure_file(output: 'config-host.h', configuration: config_host_data) 3084a81df1b6SPaolo Bonzini 30853f885659SMarc-André Lureauhxtool = find_program('scripts/hxtool') 3086e2c4012bSMarc-André Lureaushaderinclude = find_program('scripts/shaderinclude.py') 3087a81df1b6SPaolo Bonziniqapi_gen = find_program('scripts/qapi-gen.py') 3088654d6b04SPaolo Bonziniqapi_gen_depends = [ meson.current_source_dir() / 'scripts/qapi/__init__.py', 3089654d6b04SPaolo Bonzini meson.current_source_dir() / 'scripts/qapi/commands.py', 3090654d6b04SPaolo Bonzini meson.current_source_dir() / 'scripts/qapi/common.py', 3091654d6b04SPaolo Bonzini meson.current_source_dir() / 'scripts/qapi/error.py', 3092654d6b04SPaolo Bonzini meson.current_source_dir() / 'scripts/qapi/events.py', 3093654d6b04SPaolo Bonzini meson.current_source_dir() / 'scripts/qapi/expr.py', 3094654d6b04SPaolo Bonzini meson.current_source_dir() / 'scripts/qapi/gen.py', 3095654d6b04SPaolo Bonzini meson.current_source_dir() / 'scripts/qapi/introspect.py', 309688d357d2SMarkus Armbruster meson.current_source_dir() / 'scripts/qapi/main.py', 3097654d6b04SPaolo Bonzini meson.current_source_dir() / 'scripts/qapi/parser.py', 3098654d6b04SPaolo Bonzini meson.current_source_dir() / 'scripts/qapi/schema.py', 3099654d6b04SPaolo Bonzini meson.current_source_dir() / 'scripts/qapi/source.py', 3100654d6b04SPaolo Bonzini meson.current_source_dir() / 'scripts/qapi/types.py', 3101654d6b04SPaolo Bonzini meson.current_source_dir() / 'scripts/qapi/visit.py', 3102654d6b04SPaolo Bonzini meson.current_source_dir() / 'scripts/qapi-gen.py' 3103a81df1b6SPaolo Bonzini] 3104a81df1b6SPaolo Bonzini 3105a81df1b6SPaolo Bonzinitracetool = [ 3106a81df1b6SPaolo Bonzini python, files('scripts/tracetool.py'), 31079c29b741SPaolo Bonzini '--backend=' + ','.join(get_option('trace_backends')) 3108a81df1b6SPaolo Bonzini] 31090572d6cdSStefan Hajnoczitracetool_depends = files( 31100572d6cdSStefan Hajnoczi 'scripts/tracetool/backend/log.py', 31110572d6cdSStefan Hajnoczi 'scripts/tracetool/backend/__init__.py', 31120572d6cdSStefan Hajnoczi 'scripts/tracetool/backend/dtrace.py', 31130572d6cdSStefan Hajnoczi 'scripts/tracetool/backend/ftrace.py', 31140572d6cdSStefan Hajnoczi 'scripts/tracetool/backend/simple.py', 31150572d6cdSStefan Hajnoczi 'scripts/tracetool/backend/syslog.py', 31160572d6cdSStefan Hajnoczi 'scripts/tracetool/backend/ust.py', 31170572d6cdSStefan Hajnoczi 'scripts/tracetool/format/ust_events_c.py', 31180572d6cdSStefan Hajnoczi 'scripts/tracetool/format/ust_events_h.py', 31190572d6cdSStefan Hajnoczi 'scripts/tracetool/format/__init__.py', 31200572d6cdSStefan Hajnoczi 'scripts/tracetool/format/d.py', 31210572d6cdSStefan Hajnoczi 'scripts/tracetool/format/simpletrace_stap.py', 31220572d6cdSStefan Hajnoczi 'scripts/tracetool/format/c.py', 31230572d6cdSStefan Hajnoczi 'scripts/tracetool/format/h.py', 31240572d6cdSStefan Hajnoczi 'scripts/tracetool/format/log_stap.py', 31250572d6cdSStefan Hajnoczi 'scripts/tracetool/format/stap.py', 31260572d6cdSStefan Hajnoczi 'scripts/tracetool/__init__.py', 31270572d6cdSStefan Hajnoczi 'scripts/tracetool/vcpu.py' 31280572d6cdSStefan Hajnoczi) 3129a81df1b6SPaolo Bonzini 31302c273f32SMarc-André Lureauqemu_version_cmd = [find_program('scripts/qemu-version.sh'), 31312c273f32SMarc-André Lureau meson.current_source_dir(), 3132b0b4323eSPaolo Bonzini get_option('pkgversion'), meson.project_version()] 31332c273f32SMarc-André Lureauqemu_version = custom_target('qemu-version.h', 31342c273f32SMarc-André Lureau output: 'qemu-version.h', 31352c273f32SMarc-André Lureau command: qemu_version_cmd, 31362c273f32SMarc-André Lureau capture: true, 31372c273f32SMarc-André Lureau build_by_default: true, 31382c273f32SMarc-André Lureau build_always_stale: true) 31392c273f32SMarc-André Lureaugenh += qemu_version 31402c273f32SMarc-André Lureau 31413f885659SMarc-André Lureauhxdep = [] 31423f885659SMarc-André Lureauhx_headers = [ 31433f885659SMarc-André Lureau ['qemu-options.hx', 'qemu-options.def'], 31443f885659SMarc-André Lureau ['qemu-img-cmds.hx', 'qemu-img-cmds.h'], 31453f885659SMarc-André Lureau] 31463f885659SMarc-André Lureauif have_system 31473f885659SMarc-André Lureau hx_headers += [ 31483f885659SMarc-André Lureau ['hmp-commands.hx', 'hmp-commands.h'], 31493f885659SMarc-André Lureau ['hmp-commands-info.hx', 'hmp-commands-info.h'], 31503f885659SMarc-André Lureau ] 31513f885659SMarc-André Lureauendif 31523f885659SMarc-André Lureauforeach d : hx_headers 3153b7c70bf2SMarc-André Lureau hxdep += custom_target(d[1], 31543f885659SMarc-André Lureau input: files(d[0]), 31553f885659SMarc-André Lureau output: d[1], 31563f885659SMarc-André Lureau capture: true, 31573f885659SMarc-André Lureau build_by_default: true, # to be removed when added to a target 31583f885659SMarc-André Lureau command: [hxtool, '-h', '@INPUT0@']) 31593f885659SMarc-André Lureauendforeach 31603f885659SMarc-André Lureaugenh += hxdep 31613f885659SMarc-André Lureau 3162a0c9162cSPaolo Bonzini################### 3163a0c9162cSPaolo Bonzini# Collect sources # 3164a0c9162cSPaolo Bonzini################### 3165a81df1b6SPaolo Bonzini 316655567891SPhilippe Mathieu-Daudéauthz_ss = ss.source_set() 31677e2b888fSPhilippe Mathieu-Daudéblockdev_ss = ss.source_set() 31687e2b888fSPhilippe Mathieu-Daudéblock_ss = ss.source_set() 3169c2306d71SPhilippe Mathieu-Daudéchardev_ss = ss.source_set() 31707e2b888fSPhilippe Mathieu-Daudécommon_ss = ss.source_set() 31712389304aSPhilippe Mathieu-Daudécrypto_ss = ss.source_set() 3172f73fb063SPhilippe Mathieu-Daudéhwcore_ss = ss.source_set() 3173f78536b1SPhilippe Mathieu-Daudéio_ss = ss.source_set() 31747e2b888fSPhilippe Mathieu-Daudéqmp_ss = ss.source_set() 3175da33fc09SPhilippe Mathieu-Daudéqom_ss = ss.source_set() 31767e2b888fSPhilippe Mathieu-Daudésoftmmu_ss = ss.source_set() 31777e2b888fSPhilippe Mathieu-Daudéspecific_fuzz_ss = ss.source_set() 31787e2b888fSPhilippe Mathieu-Daudéspecific_ss = ss.source_set() 3179a81df1b6SPaolo Bonzinistub_ss = ss.source_set() 3180a81df1b6SPaolo Bonzinitrace_ss = ss.source_set() 31812becc36aSPaolo Bonziniuser_ss = ss.source_set() 31827e2b888fSPhilippe Mathieu-Daudéutil_ss = ss.source_set() 31832becc36aSPaolo Bonzini 3184c94a7b88SGerd Hoffmann# accel modules 3185c94a7b88SGerd Hoffmannqtest_module_ss = ss.source_set() 3186dae0ec15SGerd Hoffmanntcg_module_ss = ss.source_set() 3187c94a7b88SGerd Hoffmann 31883154fee4SMarc-André Lureaumodules = {} 3189db2e89dfSGerd Hoffmanntarget_modules = {} 31902becc36aSPaolo Bonzinihw_arch = {} 31912becc36aSPaolo Bonzinitarget_arch = {} 31922becc36aSPaolo Bonzinitarget_softmmu_arch = {} 319346369b50SPhilippe Mathieu-Daudétarget_user_arch = {} 3194a81df1b6SPaolo Bonzini 3195a81df1b6SPaolo Bonzini############### 3196a81df1b6SPaolo Bonzini# Trace files # 3197a81df1b6SPaolo Bonzini############### 3198a81df1b6SPaolo Bonzini 3199c9322ab5SMarc-André Lureau# TODO: add each directory to the subdirs from its own meson.build, once 3200c9322ab5SMarc-André Lureau# we have those 3201a81df1b6SPaolo Bonzinitrace_events_subdirs = [ 3202a81df1b6SPaolo Bonzini 'crypto', 320369ff4d0aSPhilippe Mathieu-Daudé 'qapi', 320469ff4d0aSPhilippe Mathieu-Daudé 'qom', 3205a81df1b6SPaolo Bonzini 'monitor', 320669ff4d0aSPhilippe Mathieu-Daudé 'util', 3207842b42dfSAlex Bennée 'gdbstub', 3208a81df1b6SPaolo Bonzini] 32096ddc1abeSWarner Loshif have_linux_user 3210a81df1b6SPaolo Bonzini trace_events_subdirs += [ 'linux-user' ] 3211a81df1b6SPaolo Bonziniendif 32126ddc1abeSWarner Loshif have_bsd_user 32136ddc1abeSWarner Losh trace_events_subdirs += [ 'bsd-user' ] 32146ddc1abeSWarner Loshendif 3215a81df1b6SPaolo Bonziniif have_block 3216a81df1b6SPaolo Bonzini trace_events_subdirs += [ 3217a81df1b6SPaolo Bonzini 'authz', 3218a81df1b6SPaolo Bonzini 'block', 3219a81df1b6SPaolo Bonzini 'io', 3220a81df1b6SPaolo Bonzini 'nbd', 3221a81df1b6SPaolo Bonzini 'scsi', 3222a81df1b6SPaolo Bonzini ] 3223a81df1b6SPaolo Bonziniendif 3224a81df1b6SPaolo Bonziniif have_system 3225a81df1b6SPaolo Bonzini trace_events_subdirs += [ 32268985db26SPhilippe Mathieu-Daudé 'accel/kvm', 3227a81df1b6SPaolo Bonzini 'audio', 3228a81df1b6SPaolo Bonzini 'backends', 3229a81df1b6SPaolo Bonzini 'backends/tpm', 3230a81df1b6SPaolo Bonzini 'chardev', 323146627f41SAndrew Melnychenko 'ebpf', 3232a81df1b6SPaolo Bonzini 'hw/9pfs', 3233a81df1b6SPaolo Bonzini 'hw/acpi', 323477c05b0bSHao Wu 'hw/adc', 3235a81df1b6SPaolo Bonzini 'hw/alpha', 3236a81df1b6SPaolo Bonzini 'hw/arm', 3237a81df1b6SPaolo Bonzini 'hw/audio', 3238a81df1b6SPaolo Bonzini 'hw/block', 3239a81df1b6SPaolo Bonzini 'hw/block/dataplane', 3240a81df1b6SPaolo Bonzini 'hw/char', 3241a81df1b6SPaolo Bonzini 'hw/display', 3242a81df1b6SPaolo Bonzini 'hw/dma', 3243a81df1b6SPaolo Bonzini 'hw/hyperv', 3244a81df1b6SPaolo Bonzini 'hw/i2c', 3245a81df1b6SPaolo Bonzini 'hw/i386', 3246a81df1b6SPaolo Bonzini 'hw/i386/xen', 3247aa98ee38SDavid Woodhouse 'hw/i386/kvm', 3248a81df1b6SPaolo Bonzini 'hw/ide', 3249a81df1b6SPaolo Bonzini 'hw/input', 3250a81df1b6SPaolo Bonzini 'hw/intc', 3251a81df1b6SPaolo Bonzini 'hw/isa', 3252a81df1b6SPaolo Bonzini 'hw/mem', 3253a81df1b6SPaolo Bonzini 'hw/mips', 3254a81df1b6SPaolo Bonzini 'hw/misc', 3255a81df1b6SPaolo Bonzini 'hw/misc/macio', 3256a81df1b6SPaolo Bonzini 'hw/net', 325798e5d7a2SVikram Garhwal 'hw/net/can', 3258ce0e6a2cSMark Cave-Ayland 'hw/nubus', 325988eea45cSKlaus Jensen 'hw/nvme', 3260a81df1b6SPaolo Bonzini 'hw/nvram', 3261a81df1b6SPaolo Bonzini 'hw/pci', 3262a81df1b6SPaolo Bonzini 'hw/pci-host', 3263a81df1b6SPaolo Bonzini 'hw/ppc', 3264a81df1b6SPaolo Bonzini 'hw/rdma', 3265a81df1b6SPaolo Bonzini 'hw/rdma/vmw', 3266a81df1b6SPaolo Bonzini 'hw/rtc', 3267a81df1b6SPaolo Bonzini 'hw/s390x', 3268a81df1b6SPaolo Bonzini 'hw/scsi', 3269a81df1b6SPaolo Bonzini 'hw/sd', 3270ad52cfc1SBALATON Zoltan 'hw/sh4', 3271a81df1b6SPaolo Bonzini 'hw/sparc', 3272a81df1b6SPaolo Bonzini 'hw/sparc64', 3273a81df1b6SPaolo Bonzini 'hw/ssi', 3274a81df1b6SPaolo Bonzini 'hw/timer', 3275a81df1b6SPaolo Bonzini 'hw/tpm', 3276a81df1b6SPaolo Bonzini 'hw/usb', 3277a81df1b6SPaolo Bonzini 'hw/vfio', 3278a81df1b6SPaolo Bonzini 'hw/virtio', 3279a81df1b6SPaolo Bonzini 'hw/watchdog', 3280a81df1b6SPaolo Bonzini 'hw/xen', 3281a81df1b6SPaolo Bonzini 'hw/gpio', 3282a81df1b6SPaolo Bonzini 'migration', 3283a81df1b6SPaolo Bonzini 'net', 32848b7a5507SPhilippe Mathieu-Daudé 'softmmu', 3285a81df1b6SPaolo Bonzini 'ui', 3286ad22c308SElena Ufimtseva 'hw/remote', 3287a81df1b6SPaolo Bonzini ] 3288a81df1b6SPaolo Bonziniendif 32898985db26SPhilippe Mathieu-Daudéif have_system or have_user 32908985db26SPhilippe Mathieu-Daudé trace_events_subdirs += [ 32918985db26SPhilippe Mathieu-Daudé 'accel/tcg', 32928985db26SPhilippe Mathieu-Daudé 'hw/core', 32938985db26SPhilippe Mathieu-Daudé 'target/arm', 3294a1477da3SAlexander Graf 'target/arm/hvf', 32958985db26SPhilippe Mathieu-Daudé 'target/hppa', 32968985db26SPhilippe Mathieu-Daudé 'target/i386', 32978985db26SPhilippe Mathieu-Daudé 'target/i386/kvm', 329834b8ff25SPhilippe Mathieu-Daudé 'target/mips/tcg', 32996f83e277SRichard Henderson 'target/nios2', 33008985db26SPhilippe Mathieu-Daudé 'target/ppc', 33018985db26SPhilippe Mathieu-Daudé 'target/riscv', 33028985db26SPhilippe Mathieu-Daudé 'target/s390x', 330367043607SCho, Yu-Chen 'target/s390x/kvm', 33048985db26SPhilippe Mathieu-Daudé 'target/sparc', 33058985db26SPhilippe Mathieu-Daudé ] 33068985db26SPhilippe Mathieu-Daudéendif 3307a81df1b6SPaolo Bonzini 33080df750e9SMarc-André Lureauvhost_user = not_found 33092a3129a3SPaolo Bonziniif targetos == 'linux' and have_vhost_user 33100df750e9SMarc-André Lureau libvhost_user = subproject('libvhost-user') 33110df750e9SMarc-André Lureau vhost_user = libvhost_user.get_variable('vhost_user_dep') 33120df750e9SMarc-André Lureauendif 33130df750e9SMarc-André Lureau 3314a6caeee8SXie Yongjilibvduse = not_found 3315a6caeee8SXie Yongjiif have_libvduse 3316a6caeee8SXie Yongji libvduse_proj = subproject('libvduse') 3317a6caeee8SXie Yongji libvduse = libvduse_proj.get_variable('libvduse_dep') 3318a6caeee8SXie Yongjiendif 3319a6caeee8SXie Yongji 3320b83a80e8SVladimir Sementsov-Ogievskiy# NOTE: the trace/ subdirectory needs the qapi_trace_events variable 3321b83a80e8SVladimir Sementsov-Ogievskiy# that is filled in by qapi/. 3322a81df1b6SPaolo Bonzinisubdir('qapi') 3323a81df1b6SPaolo Bonzinisubdir('qobject') 3324a81df1b6SPaolo Bonzinisubdir('stubs') 3325a81df1b6SPaolo Bonzinisubdir('trace') 3326a81df1b6SPaolo Bonzinisubdir('util') 33275582c58fSMarc-André Lureausubdir('qom') 33285582c58fSMarc-André Lureausubdir('authz') 3329a81df1b6SPaolo Bonzinisubdir('crypto') 33302d78b56eSMarc-André Lureausubdir('ui') 33317d5983e3SNicolas Saenz Juliennesubdir('hw') 3332842b42dfSAlex Bennéesubdir('gdbstub') 3333a81df1b6SPaolo Bonzini 33343154fee4SMarc-André Lureauif enable_modules 33353154fee4SMarc-André Lureau libmodulecommon = static_library('module-common', files('module-common.c') + genh, pic: true, c_args: '-DBUILD_DSO') 33363154fee4SMarc-André Lureau modulecommon = declare_dependency(link_whole: libmodulecommon, compile_args: '-DBUILD_DSO') 33373154fee4SMarc-André Lureauendif 33383154fee4SMarc-André Lureau 33397d5983e3SNicolas Saenz Julienneqom_ss = qom_ss.apply(config_host, strict: false) 33407d5983e3SNicolas Saenz Juliennelibqom = static_library('qom', qom_ss.sources() + genh, 33417d5983e3SNicolas Saenz Julienne dependencies: [qom_ss.dependencies()], 33427d5983e3SNicolas Saenz Julienne name_suffix: 'fa') 33437d5983e3SNicolas Saenz Julienneqom = declare_dependency(link_whole: libqom) 33447d5983e3SNicolas Saenz Julienne 33457d5983e3SNicolas Saenz Julienneevent_loop_base = files('event-loop-base.c') 33467d5983e3SNicolas Saenz Julienneevent_loop_base = static_library('event-loop-base', sources: event_loop_base + genh, 33477d5983e3SNicolas Saenz Julienne build_by_default: true) 33487d5983e3SNicolas Saenz Julienneevent_loop_base = declare_dependency(link_whole: event_loop_base, 33497d5983e3SNicolas Saenz Julienne dependencies: [qom]) 33507d5983e3SNicolas Saenz Julienne 33512becc36aSPaolo Bonzinistub_ss = stub_ss.apply(config_all, strict: false) 3352a81df1b6SPaolo Bonzini 3353a81df1b6SPaolo Bonziniutil_ss.add_all(trace_ss) 33542becc36aSPaolo Bonziniutil_ss = util_ss.apply(config_all, strict: false) 3355a81df1b6SPaolo Bonzinilibqemuutil = static_library('qemuutil', 3356a81df1b6SPaolo Bonzini sources: util_ss.sources() + stub_ss.sources() + genh, 33576d7c7c2dSPaolo Bonzini dependencies: [util_ss.dependencies(), libm, threads, glib, socket, malloc, pixman]) 3358a81df1b6SPaolo Bonziniqemuutil = declare_dependency(link_with: libqemuutil, 335970ac26b9SNicolas Saenz Julienne sources: genh + version_res, 336070ac26b9SNicolas Saenz Julienne dependencies: [event_loop_base]) 3361a81df1b6SPaolo Bonzini 3362957b31f6SPhilippe Mathieu-Daudéif have_system or have_user 3363abff1abfSPaolo Bonzini decodetree = generator(find_program('scripts/decodetree.py'), 3364abff1abfSPaolo Bonzini output: 'decode-@BASENAME@.c.inc', 3365abff1abfSPaolo Bonzini arguments: ['@INPUT@', '@EXTRA_ARGS@', '-o', '@OUTPUT@']) 3366957b31f6SPhilippe Mathieu-Daudé subdir('libdecnumber') 3367957b31f6SPhilippe Mathieu-Daudé subdir('target') 3368957b31f6SPhilippe Mathieu-Daudéendif 3369abff1abfSPaolo Bonzini 3370478e943fSPaolo Bonzinisubdir('audio') 33717fcfd456SMarc-André Lureausubdir('io') 3372848e8ff6SMarc-André Lureausubdir('chardev') 3373ec0d5893SMarc-André Lureausubdir('fsdev') 3374708eab42SMarc-André Lureausubdir('dump') 3375ec0d5893SMarc-André Lureau 3376f285bd3fSPhilippe Mathieu-Daudéif have_block 33775e5733e5SMarc-André Lureau block_ss.add(files( 33785e5733e5SMarc-André Lureau 'block.c', 33795e5733e5SMarc-André Lureau 'blockjob.c', 33805e5733e5SMarc-André Lureau 'job.c', 33815e5733e5SMarc-André Lureau 'qemu-io-cmds.c', 33825e5733e5SMarc-André Lureau )) 3383406523f6SPaolo Bonzini if config_host_data.get('CONFIG_REPLICATION') 3384406523f6SPaolo Bonzini block_ss.add(files('replication.c')) 3385406523f6SPaolo Bonzini endif 33865e5733e5SMarc-André Lureau 33875e5733e5SMarc-André Lureau subdir('nbd') 33885e5733e5SMarc-André Lureau subdir('scsi') 33895e5733e5SMarc-André Lureau subdir('block') 33905e5733e5SMarc-André Lureau 33914a96337dSPaolo Bonzini blockdev_ss.add(files( 33924a96337dSPaolo Bonzini 'blockdev.c', 3393cbc20bfbSStefan Hajnoczi 'blockdev-nbd.c', 33944a96337dSPaolo Bonzini 'iothread.c', 33954a96337dSPaolo Bonzini 'job-qmp.c', 33963eacf70bSRoman Bolshakov ), gnutls) 33974a96337dSPaolo Bonzini 33984a96337dSPaolo Bonzini # os-posix.c contains POSIX-specific functions used by qemu-storage-daemon, 33994a96337dSPaolo Bonzini # os-win32.c does not 34004a96337dSPaolo Bonzini blockdev_ss.add(when: 'CONFIG_POSIX', if_true: files('os-posix.c')) 34014a96337dSPaolo Bonzini softmmu_ss.add(when: 'CONFIG_WIN32', if_true: [files('os-win32.c')]) 3402f285bd3fSPhilippe Mathieu-Daudéendif 34034a96337dSPaolo Bonzini 34044a96337dSPaolo Bonzinicommon_ss.add(files('cpus-common.c')) 340531ffa2aaSPhilippe Mathieu-Daudéspecific_ss.add(files('cpu.c')) 34064a96337dSPaolo Bonzini 34075d3ea0e1SPaolo Bonzinisubdir('softmmu') 3408c9322ab5SMarc-André Lureau 340944b99a6dSRichard Henderson# Work around a gcc bug/misfeature wherein constant propagation looks 341044b99a6dSRichard Henderson# through an alias: 341144b99a6dSRichard Henderson# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99696 341244b99a6dSRichard Henderson# to guess that a const variable is always zero. Without lto, this is 341344b99a6dSRichard Henderson# impossible, as the alias is restricted to page-vary-common.c. Indeed, 341444b99a6dSRichard Henderson# without lto, not even the alias is required -- we simply use different 341544b99a6dSRichard Henderson# declarations in different compilation units. 341644b99a6dSRichard Hendersonpagevary = files('page-vary-common.c') 341744b99a6dSRichard Hendersonif get_option('b_lto') 341844b99a6dSRichard Henderson pagevary_flags = ['-fno-lto'] 341944b99a6dSRichard Henderson if get_option('cfi') 342044b99a6dSRichard Henderson pagevary_flags += '-fno-sanitize=cfi-icall' 342144b99a6dSRichard Henderson endif 342254c9b194SThomas Huth pagevary = static_library('page-vary-common', sources: pagevary + genh, 342344b99a6dSRichard Henderson c_args: pagevary_flags) 342444b99a6dSRichard Henderson pagevary = declare_dependency(link_with: pagevary) 342544b99a6dSRichard Hendersonendif 342644b99a6dSRichard Hendersoncommon_ss.add(pagevary) 34276670d4d0SRichard Hendersonspecific_ss.add(files('page-vary.c')) 34286670d4d0SRichard Henderson 3429ab318051SMarc-André Lureausubdir('backends') 3430c574e161SMarc-André Lureausubdir('disas') 343155166230SMarc-André Lureausubdir('migration') 3432ff219dcaSPaolo Bonzinisubdir('monitor') 3433cdaf0722SMarc-André Lureausubdir('net') 343417ef2af6SMarc-André Lureausubdir('replay') 34358df9f0c3SPhilippe Mathieu-Daudésubdir('semihosting') 3436aa09b3d5SMarkus Armbrustersubdir('stats') 3437104cc2c0SRichard Hendersonsubdir('tcg') 3438c6347541SRichard Hendersonsubdir('fpu') 34391a82878aSMarc-André Lureausubdir('accel') 3440f556b4a1SPaolo Bonzinisubdir('plugins') 3441bbf15aafSRichard Hendersonsubdir('ebpf') 3442bbf15aafSRichard Henderson 3443bbf15aafSRichard Hendersoncommon_user_inc = [] 3444bbf15aafSRichard Henderson 3445bbf15aafSRichard Hendersonsubdir('common-user') 3446b309c321SMarc-André Lureausubdir('bsd-user') 34473a30446aSMarc-André Lureausubdir('linux-user') 344846627f41SAndrew Melnychenko 3449a2ce7dbdSPaolo Bonzini# needed for fuzzing binaries 3450a2ce7dbdSPaolo Bonzinisubdir('tests/qtest/libqos') 345164ed6f92SPaolo Bonzinisubdir('tests/qtest/fuzz') 3452a2ce7dbdSPaolo Bonzini 3453c94a7b88SGerd Hoffmann# accel modules 3454dae0ec15SGerd Hoffmanntcg_real_module_ss = ss.source_set() 3455dae0ec15SGerd Hoffmanntcg_real_module_ss.add_all(when: 'CONFIG_TCG_MODULAR', if_true: tcg_module_ss) 3456dae0ec15SGerd Hoffmannspecific_ss.add_all(when: 'CONFIG_TCG_BUILTIN', if_true: tcg_module_ss) 3457dae0ec15SGerd Hoffmanntarget_modules += { 'accel' : { 'qtest': qtest_module_ss, 3458dae0ec15SGerd Hoffmann 'tcg': tcg_real_module_ss }} 3459c94a7b88SGerd Hoffmann 3460a0c9162cSPaolo Bonzini######################## 3461a0c9162cSPaolo Bonzini# Library dependencies # 3462a0c9162cSPaolo Bonzini######################## 3463a0c9162cSPaolo Bonzini 3464f5723ab6SGerd Hoffmannmodinfo_collect = find_program('scripts/modinfo-collect.py') 34655ebbfeccSGerd Hoffmannmodinfo_generate = find_program('scripts/modinfo-generate.py') 3466f5723ab6SGerd Hoffmannmodinfo_files = [] 3467f5723ab6SGerd Hoffmann 34683154fee4SMarc-André Lureaublock_mods = [] 34693154fee4SMarc-André Lureausoftmmu_mods = [] 34703154fee4SMarc-André Lureauforeach d, list : modules 3471ef709860SPaolo Bonzini if not (d == 'block' ? have_block : have_system) 3472ef709860SPaolo Bonzini continue 3473ef709860SPaolo Bonzini endif 3474ef709860SPaolo Bonzini 34753154fee4SMarc-André Lureau foreach m, module_ss : list 34766002711cSPaolo Bonzini if enable_modules 34773e292c51SGerd Hoffmann module_ss = module_ss.apply(config_all, strict: false) 34783154fee4SMarc-André Lureau sl = static_library(d + '-' + m, [genh, module_ss.sources()], 34793154fee4SMarc-André Lureau dependencies: [modulecommon, module_ss.dependencies()], pic: true) 34803154fee4SMarc-André Lureau if d == 'block' 34813154fee4SMarc-André Lureau block_mods += sl 34823154fee4SMarc-André Lureau else 34833154fee4SMarc-André Lureau softmmu_mods += sl 34843154fee4SMarc-André Lureau endif 3485f5723ab6SGerd Hoffmann if module_ss.sources() != [] 3486f5723ab6SGerd Hoffmann # FIXME: Should use sl.extract_all_objects(recursive: true) as 3487f5723ab6SGerd Hoffmann # input. Sources can be used multiple times but objects are 3488f5723ab6SGerd Hoffmann # unique when it comes to lookup in compile_commands.json. 3489f5723ab6SGerd Hoffmann # Depnds on a mesion version with 3490f5723ab6SGerd Hoffmann # https://github.com/mesonbuild/meson/pull/8900 3491f5723ab6SGerd Hoffmann modinfo_files += custom_target(d + '-' + m + '.modinfo', 3492f5723ab6SGerd Hoffmann output: d + '-' + m + '.modinfo', 3493ac347111SPaolo Bonzini input: module_ss.sources() + genh, 3494f5723ab6SGerd Hoffmann capture: true, 3495ac347111SPaolo Bonzini command: [modinfo_collect, module_ss.sources()]) 3496f5723ab6SGerd Hoffmann endif 34973154fee4SMarc-André Lureau else 34983154fee4SMarc-André Lureau if d == 'block' 34993154fee4SMarc-André Lureau block_ss.add_all(module_ss) 35003154fee4SMarc-André Lureau else 35013154fee4SMarc-André Lureau softmmu_ss.add_all(module_ss) 35023154fee4SMarc-André Lureau endif 35033154fee4SMarc-André Lureau endif 35043154fee4SMarc-André Lureau endforeach 35053154fee4SMarc-André Lureauendforeach 35063154fee4SMarc-André Lureau 3507db2e89dfSGerd Hoffmannforeach d, list : target_modules 3508db2e89dfSGerd Hoffmann foreach m, module_ss : list 35096002711cSPaolo Bonzini if enable_modules 3510db2e89dfSGerd Hoffmann foreach target : target_dirs 3511db2e89dfSGerd Hoffmann if target.endswith('-softmmu') 3512db2e89dfSGerd Hoffmann config_target = config_target_mak[target] 3513db2e89dfSGerd Hoffmann config_target += config_host 3514db2e89dfSGerd Hoffmann target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])] 3515db2e89dfSGerd Hoffmann c_args = ['-DNEED_CPU_H', 3516db2e89dfSGerd Hoffmann '-DCONFIG_TARGET="@0@-config-target.h"'.format(target), 3517db2e89dfSGerd Hoffmann '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)] 3518db2e89dfSGerd Hoffmann target_module_ss = module_ss.apply(config_target, strict: false) 3519db2e89dfSGerd Hoffmann if target_module_ss.sources() != [] 3520db2e89dfSGerd Hoffmann module_name = d + '-' + m + '-' + config_target['TARGET_NAME'] 3521db2e89dfSGerd Hoffmann sl = static_library(module_name, 3522db2e89dfSGerd Hoffmann [genh, target_module_ss.sources()], 3523db2e89dfSGerd Hoffmann dependencies: [modulecommon, target_module_ss.dependencies()], 3524db2e89dfSGerd Hoffmann include_directories: target_inc, 3525db2e89dfSGerd Hoffmann c_args: c_args, 3526db2e89dfSGerd Hoffmann pic: true) 3527db2e89dfSGerd Hoffmann softmmu_mods += sl 3528db2e89dfSGerd Hoffmann # FIXME: Should use sl.extract_all_objects(recursive: true) too. 3529db2e89dfSGerd Hoffmann modinfo_files += custom_target(module_name + '.modinfo', 3530db2e89dfSGerd Hoffmann output: module_name + '.modinfo', 3531917ddc27SGerd Hoffmann input: target_module_ss.sources() + genh, 3532db2e89dfSGerd Hoffmann capture: true, 3533917ddc27SGerd Hoffmann command: [modinfo_collect, '--target', target, target_module_ss.sources()]) 3534db2e89dfSGerd Hoffmann endif 3535db2e89dfSGerd Hoffmann endif 3536db2e89dfSGerd Hoffmann endforeach 3537db2e89dfSGerd Hoffmann else 3538db2e89dfSGerd Hoffmann specific_ss.add_all(module_ss) 3539db2e89dfSGerd Hoffmann endif 3540db2e89dfSGerd Hoffmann endforeach 3541db2e89dfSGerd Hoffmannendforeach 3542db2e89dfSGerd Hoffmann 35435ebbfeccSGerd Hoffmannif enable_modules 354405d6814cSJose R. Ziviani foreach target : target_dirs 354505d6814cSJose R. Ziviani if target.endswith('-softmmu') 354605d6814cSJose R. Ziviani config_target = config_target_mak[target] 354705d6814cSJose R. Ziviani config_devices_mak = target + '-config-devices.mak' 354805d6814cSJose R. Ziviani modinfo_src = custom_target('modinfo-' + target + '.c', 354905d6814cSJose R. Ziviani output: 'modinfo-' + target + '.c', 35505ebbfeccSGerd Hoffmann input: modinfo_files, 355105d6814cSJose R. Ziviani command: [modinfo_generate, '--devices', config_devices_mak, '@INPUT@'], 35525ebbfeccSGerd Hoffmann capture: true) 355305d6814cSJose R. Ziviani 355405d6814cSJose R. Ziviani modinfo_lib = static_library('modinfo-' + target + '.c', modinfo_src) 355505d6814cSJose R. Ziviani modinfo_dep = declare_dependency(link_with: modinfo_lib) 355605d6814cSJose R. Ziviani 355705d6814cSJose R. Ziviani arch = config_target['TARGET_NAME'] == 'sparc64' ? 'sparc64' : config_target['TARGET_BASE_ARCH'] 355805d6814cSJose R. Ziviani hw_arch[arch].add(modinfo_dep) 355905d6814cSJose R. Ziviani endif 356005d6814cSJose R. Ziviani endforeach 35615ebbfeccSGerd Hoffmannendif 35625ebbfeccSGerd Hoffmann 35633154fee4SMarc-André Lureaunm = find_program('nm') 3564604f3e4eSYonggang Luoundefsym = find_program('scripts/undefsym.py') 35653154fee4SMarc-André Lureaublock_syms = custom_target('block.syms', output: 'block.syms', 35663154fee4SMarc-André Lureau input: [libqemuutil, block_mods], 35673154fee4SMarc-André Lureau capture: true, 35683154fee4SMarc-André Lureau command: [undefsym, nm, '@INPUT@']) 35693154fee4SMarc-André Lureauqemu_syms = custom_target('qemu.syms', output: 'qemu.syms', 35703154fee4SMarc-André Lureau input: [libqemuutil, softmmu_mods], 35713154fee4SMarc-André Lureau capture: true, 35723154fee4SMarc-André Lureau command: [undefsym, nm, '@INPUT@']) 35733154fee4SMarc-André Lureau 357455567891SPhilippe Mathieu-Daudéauthz_ss = authz_ss.apply(config_host, strict: false) 357555567891SPhilippe Mathieu-Daudélibauthz = static_library('authz', authz_ss.sources() + genh, 357655567891SPhilippe Mathieu-Daudé dependencies: [authz_ss.dependencies()], 357755567891SPhilippe Mathieu-Daudé name_suffix: 'fa', 357855567891SPhilippe Mathieu-Daudé build_by_default: false) 357955567891SPhilippe Mathieu-Daudé 358055567891SPhilippe Mathieu-Daudéauthz = declare_dependency(link_whole: libauthz, 358155567891SPhilippe Mathieu-Daudé dependencies: qom) 358255567891SPhilippe Mathieu-Daudé 35832389304aSPhilippe Mathieu-Daudécrypto_ss = crypto_ss.apply(config_host, strict: false) 35842389304aSPhilippe Mathieu-Daudélibcrypto = static_library('crypto', crypto_ss.sources() + genh, 35852389304aSPhilippe Mathieu-Daudé dependencies: [crypto_ss.dependencies()], 35862389304aSPhilippe Mathieu-Daudé name_suffix: 'fa', 35872389304aSPhilippe Mathieu-Daudé build_by_default: false) 35882389304aSPhilippe Mathieu-Daudé 35892389304aSPhilippe Mathieu-Daudécrypto = declare_dependency(link_whole: libcrypto, 35902389304aSPhilippe Mathieu-Daudé dependencies: [authz, qom]) 35912389304aSPhilippe Mathieu-Daudé 3592f78536b1SPhilippe Mathieu-Daudéio_ss = io_ss.apply(config_host, strict: false) 3593f78536b1SPhilippe Mathieu-Daudélibio = static_library('io', io_ss.sources() + genh, 3594f78536b1SPhilippe Mathieu-Daudé dependencies: [io_ss.dependencies()], 3595f78536b1SPhilippe Mathieu-Daudé link_with: libqemuutil, 3596f78536b1SPhilippe Mathieu-Daudé name_suffix: 'fa', 3597f78536b1SPhilippe Mathieu-Daudé build_by_default: false) 3598f78536b1SPhilippe Mathieu-Daudé 3599f78536b1SPhilippe Mathieu-Daudéio = declare_dependency(link_whole: libio, dependencies: [crypto, qom]) 3600f78536b1SPhilippe Mathieu-Daudé 36017e6edef3SPhilippe Mathieu-Daudélibmigration = static_library('migration', sources: migration_files + genh, 36027e6edef3SPhilippe Mathieu-Daudé name_suffix: 'fa', 36037e6edef3SPhilippe Mathieu-Daudé build_by_default: false) 36047e6edef3SPhilippe Mathieu-Daudémigration = declare_dependency(link_with: libmigration, 36057e6edef3SPhilippe Mathieu-Daudé dependencies: [zlib, qom, io]) 36067e6edef3SPhilippe Mathieu-Daudésoftmmu_ss.add(migration) 36077e6edef3SPhilippe Mathieu-Daudé 36085e5733e5SMarc-André Lureaublock_ss = block_ss.apply(config_host, strict: false) 36095e5733e5SMarc-André Lureaulibblock = static_library('block', block_ss.sources() + genh, 36105e5733e5SMarc-André Lureau dependencies: block_ss.dependencies(), 36115e5733e5SMarc-André Lureau link_depends: block_syms, 36125e5733e5SMarc-André Lureau name_suffix: 'fa', 36135e5733e5SMarc-André Lureau build_by_default: false) 36145e5733e5SMarc-André Lureau 36155e5733e5SMarc-André Lureaublock = declare_dependency(link_whole: [libblock], 3616b7c70bf2SMarc-André Lureau link_args: '@block.syms', 3617b7c70bf2SMarc-André Lureau dependencies: [crypto, io]) 36185e5733e5SMarc-André Lureau 36194fb9071fSStefan Hajnocziblockdev_ss = blockdev_ss.apply(config_host, strict: false) 36204fb9071fSStefan Hajnoczilibblockdev = static_library('blockdev', blockdev_ss.sources() + genh, 36214fb9071fSStefan Hajnoczi dependencies: blockdev_ss.dependencies(), 36224fb9071fSStefan Hajnoczi name_suffix: 'fa', 36234fb9071fSStefan Hajnoczi build_by_default: false) 36244fb9071fSStefan Hajnoczi 36254fb9071fSStefan Hajnocziblockdev = declare_dependency(link_whole: [libblockdev], 36267d5983e3SNicolas Saenz Julienne dependencies: [block, event_loop_base]) 36274fb9071fSStefan Hajnoczi 3628ff219dcaSPaolo Bonziniqmp_ss = qmp_ss.apply(config_host, strict: false) 3629ff219dcaSPaolo Bonzinilibqmp = static_library('qmp', qmp_ss.sources() + genh, 3630ff219dcaSPaolo Bonzini dependencies: qmp_ss.dependencies(), 3631ff219dcaSPaolo Bonzini name_suffix: 'fa', 3632ff219dcaSPaolo Bonzini build_by_default: false) 3633ff219dcaSPaolo Bonzini 3634ff219dcaSPaolo Bonziniqmp = declare_dependency(link_whole: [libqmp]) 3635ff219dcaSPaolo Bonzini 3636c2306d71SPhilippe Mathieu-Daudélibchardev = static_library('chardev', chardev_ss.sources() + genh, 3637c2306d71SPhilippe Mathieu-Daudé name_suffix: 'fa', 363822d1f7a8SMarc-André Lureau dependencies: chardev_ss.dependencies(), 3639c2306d71SPhilippe Mathieu-Daudé build_by_default: false) 3640c2306d71SPhilippe Mathieu-Daudé 3641c2306d71SPhilippe Mathieu-Daudéchardev = declare_dependency(link_whole: libchardev) 3642c2306d71SPhilippe Mathieu-Daudé 3643f73fb063SPhilippe Mathieu-Daudéhwcore_ss = hwcore_ss.apply(config_host, strict: false) 3644f73fb063SPhilippe Mathieu-Daudélibhwcore = static_library('hwcore', sources: hwcore_ss.sources() + genh, 3645e28ab096SPhilippe Mathieu-Daudé name_suffix: 'fa', 3646e28ab096SPhilippe Mathieu-Daudé build_by_default: false) 3647e28ab096SPhilippe Mathieu-Daudéhwcore = declare_dependency(link_whole: libhwcore) 3648e28ab096SPhilippe Mathieu-Daudécommon_ss.add(hwcore) 3649e28ab096SPhilippe Mathieu-Daudé 3650064f8ee7SPhilippe Mathieu-Daudé########### 3651064f8ee7SPhilippe Mathieu-Daudé# Targets # 3652064f8ee7SPhilippe Mathieu-Daudé########### 3653064f8ee7SPhilippe Mathieu-Daudé 3654fb72176bSPaolo Bonziniemulator_modules = [] 36553154fee4SMarc-André Lureauforeach m : block_mods + softmmu_mods 3656fb72176bSPaolo Bonzini emulator_modules += shared_module(m.name(), 3657fb72176bSPaolo Bonzini build_by_default: true, 36583154fee4SMarc-André Lureau name_prefix: '', 36593154fee4SMarc-André Lureau link_whole: m, 36603154fee4SMarc-André Lureau install: true, 366116bf7a33SPaolo Bonzini install_dir: qemu_moddir) 36623154fee4SMarc-André Lureauendforeach 3663d8f3a609SPaolo Bonziniif emulator_modules.length() > 0 3664d8f3a609SPaolo Bonzini alias_target('modules', emulator_modules) 3665d8f3a609SPaolo Bonziniendif 36663154fee4SMarc-André Lureau 36674fb9071fSStefan Hajnoczisoftmmu_ss.add(authz, blockdev, chardev, crypto, io, qmp) 366864ed6f92SPaolo Bonzinicommon_ss.add(qom, qemuutil) 366964ed6f92SPaolo Bonzini 367064ed6f92SPaolo Bonzinicommon_ss.add_all(when: 'CONFIG_SOFTMMU', if_true: [softmmu_ss]) 36712becc36aSPaolo Bonzinicommon_ss.add_all(when: 'CONFIG_USER_ONLY', if_true: user_ss) 36722becc36aSPaolo Bonzini 36732becc36aSPaolo Bonzinicommon_all = common_ss.apply(config_all, strict: false) 36742becc36aSPaolo Bonzinicommon_all = static_library('common', 36752becc36aSPaolo Bonzini build_by_default: false, 36762becc36aSPaolo Bonzini sources: common_all.sources() + genh, 36779d24fb73SPaolo Bonzini include_directories: common_user_inc, 367875eebe0bSKatsuhiro Ueno implicit_include_directories: false, 36792becc36aSPaolo Bonzini dependencies: common_all.dependencies(), 36802becc36aSPaolo Bonzini name_suffix: 'fa') 36812becc36aSPaolo Bonzini 3682c9322ab5SMarc-André Lureaufeature_to_c = find_program('scripts/feature_to_c.sh') 3683c9322ab5SMarc-André Lureau 368430cfa50dSPhilippe Mathieu-Daudéif targetos == 'darwin' 368530cfa50dSPhilippe Mathieu-Daudé entitlement = find_program('scripts/entitlement.sh') 368630cfa50dSPhilippe Mathieu-Daudéendif 368730cfa50dSPhilippe Mathieu-Daudé 3688fd5eef85SPaolo Bonziniemulators = {} 36892becc36aSPaolo Bonziniforeach target : target_dirs 36902becc36aSPaolo Bonzini config_target = config_target_mak[target] 36912becc36aSPaolo Bonzini target_name = config_target['TARGET_NAME'] 3692ffb91f68SPaolo Bonzini target_base_arch = config_target['TARGET_BASE_ARCH'] 3693859aef02SPaolo Bonzini arch_srcs = [config_target_h[target]] 369464ed6f92SPaolo Bonzini arch_deps = [] 369564ed6f92SPaolo Bonzini c_args = ['-DNEED_CPU_H', 369664ed6f92SPaolo Bonzini '-DCONFIG_TARGET="@0@-config-target.h"'.format(target), 369764ed6f92SPaolo Bonzini '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)] 3698b6c7cfd4SPaolo Bonzini link_args = emulator_link_args 36992becc36aSPaolo Bonzini 3700859aef02SPaolo Bonzini config_target += config_host 37012becc36aSPaolo Bonzini target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])] 37022becc36aSPaolo Bonzini if targetos == 'linux' 37032becc36aSPaolo Bonzini target_inc += include_directories('linux-headers', is_system: true) 37042becc36aSPaolo Bonzini endif 37052becc36aSPaolo Bonzini if target.endswith('-softmmu') 37062becc36aSPaolo Bonzini target_type='system' 3707ffb91f68SPaolo Bonzini t = target_softmmu_arch[target_base_arch].apply(config_target, strict: false) 3708abff1abfSPaolo Bonzini arch_srcs += t.sources() 370964ed6f92SPaolo Bonzini arch_deps += t.dependencies() 3710abff1abfSPaolo Bonzini 3711ffb91f68SPaolo Bonzini hw_dir = target_name == 'sparc64' ? 'sparc64' : target_base_arch 37122c44220dSMarc-André Lureau hw = hw_arch[hw_dir].apply(config_target, strict: false) 37132c44220dSMarc-André Lureau arch_srcs += hw.sources() 371464ed6f92SPaolo Bonzini arch_deps += hw.dependencies() 37152c44220dSMarc-André Lureau 37162becc36aSPaolo Bonzini arch_srcs += config_devices_h[target] 371764ed6f92SPaolo Bonzini link_args += ['@block.syms', '@qemu.syms'] 37182becc36aSPaolo Bonzini else 37193a30446aSMarc-André Lureau abi = config_target['TARGET_ABI_DIR'] 37202becc36aSPaolo Bonzini target_type='user' 3721a3a576b0SPaolo Bonzini target_inc += common_user_inc 3722ffb91f68SPaolo Bonzini if target_base_arch in target_user_arch 3723ffb91f68SPaolo Bonzini t = target_user_arch[target_base_arch].apply(config_target, strict: false) 372446369b50SPhilippe Mathieu-Daudé arch_srcs += t.sources() 372546369b50SPhilippe Mathieu-Daudé arch_deps += t.dependencies() 372646369b50SPhilippe Mathieu-Daudé endif 37272becc36aSPaolo Bonzini if 'CONFIG_LINUX_USER' in config_target 37282becc36aSPaolo Bonzini base_dir = 'linux-user' 3729e2a74729SWarner Losh endif 3730e2a74729SWarner Losh if 'CONFIG_BSD_USER' in config_target 37312becc36aSPaolo Bonzini base_dir = 'bsd-user' 3732e2a74729SWarner Losh target_inc += include_directories('bsd-user/' / targetos) 373385fc1b5dSWarner Losh target_inc += include_directories('bsd-user/host/' / host_arch) 3734e2a74729SWarner Losh dir = base_dir / abi 373519bf129fSWarner Losh arch_srcs += files(dir / 'signal.c', dir / 'target_arch_cpu.c') 37362becc36aSPaolo Bonzini endif 37372becc36aSPaolo Bonzini target_inc += include_directories( 37382becc36aSPaolo Bonzini base_dir, 37393a30446aSMarc-André Lureau base_dir / abi, 37402becc36aSPaolo Bonzini ) 37413a30446aSMarc-André Lureau if 'CONFIG_LINUX_USER' in config_target 37423a30446aSMarc-André Lureau dir = base_dir / abi 37433a30446aSMarc-André Lureau arch_srcs += files(dir / 'signal.c', dir / 'cpu_loop.c') 37443a30446aSMarc-André Lureau if config_target.has_key('TARGET_SYSTBL_ABI') 37453a30446aSMarc-André Lureau arch_srcs += \ 37463a30446aSMarc-André Lureau syscall_nr_generators[abi].process(base_dir / abi / config_target['TARGET_SYSTBL'], 37473a30446aSMarc-André Lureau extra_args : config_target['TARGET_SYSTBL_ABI']) 37483a30446aSMarc-André Lureau endif 37493a30446aSMarc-André Lureau endif 37502becc36aSPaolo Bonzini endif 37512becc36aSPaolo Bonzini 3752c9322ab5SMarc-André Lureau if 'TARGET_XML_FILES' in config_target 3753c9322ab5SMarc-André Lureau gdbstub_xml = custom_target(target + '-gdbstub-xml.c', 3754c9322ab5SMarc-André Lureau output: target + '-gdbstub-xml.c', 3755c9322ab5SMarc-André Lureau input: files(config_target['TARGET_XML_FILES'].split()), 3756c9322ab5SMarc-André Lureau command: [feature_to_c, '@INPUT@'], 3757c9322ab5SMarc-André Lureau capture: true) 3758c9322ab5SMarc-André Lureau arch_srcs += gdbstub_xml 3759c9322ab5SMarc-André Lureau endif 3760c9322ab5SMarc-André Lureau 3761ffb91f68SPaolo Bonzini t = target_arch[target_base_arch].apply(config_target, strict: false) 3762abff1abfSPaolo Bonzini arch_srcs += t.sources() 376364ed6f92SPaolo Bonzini arch_deps += t.dependencies() 3764abff1abfSPaolo Bonzini 37652becc36aSPaolo Bonzini target_common = common_ss.apply(config_target, strict: false) 37662becc36aSPaolo Bonzini objects = common_all.extract_objects(target_common.sources()) 376764ed6f92SPaolo Bonzini deps = target_common.dependencies() 37682becc36aSPaolo Bonzini 37692becc36aSPaolo Bonzini target_specific = specific_ss.apply(config_target, strict: false) 37702becc36aSPaolo Bonzini arch_srcs += target_specific.sources() 377164ed6f92SPaolo Bonzini arch_deps += target_specific.dependencies() 37722becc36aSPaolo Bonzini 377364ed6f92SPaolo Bonzini lib = static_library('qemu-' + target, 3774859aef02SPaolo Bonzini sources: arch_srcs + genh, 3775b7612f45SPaolo Bonzini dependencies: arch_deps, 37762becc36aSPaolo Bonzini objects: objects, 37772becc36aSPaolo Bonzini include_directories: target_inc, 377864ed6f92SPaolo Bonzini c_args: c_args, 377964ed6f92SPaolo Bonzini build_by_default: false, 37802becc36aSPaolo Bonzini name_suffix: 'fa') 378164ed6f92SPaolo Bonzini 378264ed6f92SPaolo Bonzini if target.endswith('-softmmu') 378364ed6f92SPaolo Bonzini execs = [{ 378464ed6f92SPaolo Bonzini 'name': 'qemu-system-' + target_name, 3785654d6b04SPaolo Bonzini 'win_subsystem': 'console', 378664ed6f92SPaolo Bonzini 'sources': files('softmmu/main.c'), 378764ed6f92SPaolo Bonzini 'dependencies': [] 378864ed6f92SPaolo Bonzini }] 378935be72baSPaolo Bonzini if targetos == 'windows' and (sdl.found() or gtk.found()) 379064ed6f92SPaolo Bonzini execs += [{ 379164ed6f92SPaolo Bonzini 'name': 'qemu-system-' + target_name + 'w', 3792654d6b04SPaolo Bonzini 'win_subsystem': 'windows', 379364ed6f92SPaolo Bonzini 'sources': files('softmmu/main.c'), 379464ed6f92SPaolo Bonzini 'dependencies': [] 379564ed6f92SPaolo Bonzini }] 379664ed6f92SPaolo Bonzini endif 3797537b7248SPaolo Bonzini if get_option('fuzzing') 379864ed6f92SPaolo Bonzini specific_fuzz = specific_fuzz_ss.apply(config_target, strict: false) 379964ed6f92SPaolo Bonzini execs += [{ 380064ed6f92SPaolo Bonzini 'name': 'qemu-fuzz-' + target_name, 3801654d6b04SPaolo Bonzini 'win_subsystem': 'console', 380264ed6f92SPaolo Bonzini 'sources': specific_fuzz.sources(), 380364ed6f92SPaolo Bonzini 'dependencies': specific_fuzz.dependencies(), 380464ed6f92SPaolo Bonzini }] 380564ed6f92SPaolo Bonzini endif 380664ed6f92SPaolo Bonzini else 380764ed6f92SPaolo Bonzini execs = [{ 380864ed6f92SPaolo Bonzini 'name': 'qemu-' + target_name, 3809654d6b04SPaolo Bonzini 'win_subsystem': 'console', 381064ed6f92SPaolo Bonzini 'sources': [], 381164ed6f92SPaolo Bonzini 'dependencies': [] 381264ed6f92SPaolo Bonzini }] 381364ed6f92SPaolo Bonzini endif 381464ed6f92SPaolo Bonzini foreach exe: execs 38158a74ce61SAlexander Graf exe_name = exe['name'] 38163983a767SJohn Arbuckle if targetos == 'darwin' 38178a74ce61SAlexander Graf exe_name += '-unsigned' 38188a74ce61SAlexander Graf endif 38198a74ce61SAlexander Graf 38208a74ce61SAlexander Graf emulator = executable(exe_name, exe['sources'], 3821237377acSAkihiko Odaki install: true, 382264ed6f92SPaolo Bonzini c_args: c_args, 382364ed6f92SPaolo Bonzini dependencies: arch_deps + deps + exe['dependencies'], 382464ed6f92SPaolo Bonzini objects: lib.extract_all_objects(recursive: true), 382564ed6f92SPaolo Bonzini link_language: link_language, 382664ed6f92SPaolo Bonzini link_depends: [block_syms, qemu_syms] + exe.get('link_depends', []), 382764ed6f92SPaolo Bonzini link_args: link_args, 3828654d6b04SPaolo Bonzini win_subsystem: exe['win_subsystem']) 38298a74ce61SAlexander Graf 38303983a767SJohn Arbuckle if targetos == 'darwin' 3831411ad8ddSAkihiko Odaki icon = 'pc-bios/qemu.rsrc' 3832411ad8ddSAkihiko Odaki build_input = [emulator, files(icon)] 3833411ad8ddSAkihiko Odaki install_input = [ 3834411ad8ddSAkihiko Odaki get_option('bindir') / exe_name, 3835411ad8ddSAkihiko Odaki meson.current_source_dir() / icon 3836411ad8ddSAkihiko Odaki ] 3837411ad8ddSAkihiko Odaki if 'CONFIG_HVF' in config_target 3838411ad8ddSAkihiko Odaki entitlements = 'accel/hvf/entitlements.plist' 3839411ad8ddSAkihiko Odaki build_input += files(entitlements) 3840411ad8ddSAkihiko Odaki install_input += meson.current_source_dir() / entitlements 3841411ad8ddSAkihiko Odaki endif 3842411ad8ddSAkihiko Odaki 38438a74ce61SAlexander Graf emulators += {exe['name'] : custom_target(exe['name'], 3844411ad8ddSAkihiko Odaki input: build_input, 38458a74ce61SAlexander Graf output: exe['name'], 3846235b523dSPhilippe Mathieu-Daudé command: [entitlement, '@OUTPUT@', '@INPUT@']) 3847fd5eef85SPaolo Bonzini } 3848237377acSAkihiko Odaki 3849235b523dSPhilippe Mathieu-Daudé meson.add_install_script(entitlement, '--install', 3850237377acSAkihiko Odaki get_option('bindir') / exe['name'], 3851411ad8ddSAkihiko Odaki install_input) 38528a74ce61SAlexander Graf else 38538a74ce61SAlexander Graf emulators += {exe['name']: emulator} 38548a74ce61SAlexander Graf endif 385510e1d263SMarc-André Lureau 38569c29b741SPaolo Bonzini if stap.found() 385710e1d263SMarc-André Lureau foreach stp: [ 3858bd5f973aSStefan Hajnoczi {'ext': '.stp-build', 'fmt': 'stap', 'bin': meson.current_build_dir() / exe['name'], 'install': false}, 3859bd5f973aSStefan Hajnoczi {'ext': '.stp', 'fmt': 'stap', 'bin': get_option('prefix') / get_option('bindir') / exe['name'], 'install': true}, 386010e1d263SMarc-André Lureau {'ext': '-simpletrace.stp', 'fmt': 'simpletrace-stap', 'bin': '', 'install': true}, 386110e1d263SMarc-André Lureau {'ext': '-log.stp', 'fmt': 'log-stap', 'bin': '', 'install': true}, 386210e1d263SMarc-André Lureau ] 3863bd5f973aSStefan Hajnoczi custom_target(exe['name'] + stp['ext'], 386410e1d263SMarc-André Lureau input: trace_events_all, 3865bd5f973aSStefan Hajnoczi output: exe['name'] + stp['ext'], 386610e1d263SMarc-André Lureau install: stp['install'], 386716bf7a33SPaolo Bonzini install_dir: get_option('datadir') / 'systemtap/tapset', 386810e1d263SMarc-André Lureau command: [ 386910e1d263SMarc-André Lureau tracetool, '--group=all', '--format=' + stp['fmt'], 387010e1d263SMarc-André Lureau '--binary=' + stp['bin'], 387110e1d263SMarc-André Lureau '--target-name=' + target_name, 387210e1d263SMarc-André Lureau '--target-type=' + target_type, 387310e1d263SMarc-André Lureau '--probe-prefix=qemu.' + target_type + '.' + target_name, 3874c05012a3SStefan Hajnoczi '@INPUT@', '@OUTPUT@' 38750572d6cdSStefan Hajnoczi ], 38760572d6cdSStefan Hajnoczi depend_files: tracetool_depends) 387710e1d263SMarc-André Lureau endforeach 387810e1d263SMarc-André Lureau endif 387964ed6f92SPaolo Bonzini endforeach 38802becc36aSPaolo Bonziniendforeach 38812becc36aSPaolo Bonzini 3882931049b4SPaolo Bonzini# Other build targets 3883897b5afaSMarc-André Lureau 3884f556b4a1SPaolo Bonziniif 'CONFIG_PLUGIN' in config_host 3885f556b4a1SPaolo Bonzini install_headers('include/qemu/qemu-plugin.h') 3886f556b4a1SPaolo Bonziniendif 3887f556b4a1SPaolo Bonzini 3888f15bff25SPaolo Bonzinisubdir('qga') 3889f15bff25SPaolo Bonzini 38909755c94aSLaurent Vivier# Don't build qemu-keymap if xkbcommon is not explicitly enabled 38919755c94aSLaurent Vivier# when we don't build tools or system 38924113f4cfSLaurent Vivierif xkbcommon.found() 389328742467SMarc-André Lureau # used for the update-keymaps target, so include rules even if !have_tools 389428742467SMarc-André Lureau qemu_keymap = executable('qemu-keymap', files('qemu-keymap.c', 'ui/input-keymap.c') + genh, 389528742467SMarc-André Lureau dependencies: [qemuutil, xkbcommon], install: have_tools) 389628742467SMarc-André Lureauendif 389728742467SMarc-André Lureau 3898931049b4SPaolo Bonziniif have_tools 3899b7c70bf2SMarc-André Lureau qemu_img = executable('qemu-img', [files('qemu-img.c'), hxdep], 3900b7c70bf2SMarc-André Lureau dependencies: [authz, block, crypto, io, qom, qemuutil], install: true) 3901b7c70bf2SMarc-André Lureau qemu_io = executable('qemu-io', files('qemu-io.c'), 3902b7c70bf2SMarc-André Lureau dependencies: [block, qemuutil], install: true) 3903b7c70bf2SMarc-André Lureau qemu_nbd = executable('qemu-nbd', files('qemu-nbd.c'), 39043d212b41SRichard W.M. Jones dependencies: [blockdev, qemuutil, gnutls, selinux], 39053d212b41SRichard W.M. Jones install: true) 3906b7c70bf2SMarc-André Lureau 39077c58bb76SPaolo Bonzini subdir('storage-daemon') 3908a9c9727cSPaolo Bonzini subdir('contrib/rdmacm-mux') 39091d7bb6abSMarc-André Lureau subdir('contrib/elf2dmp') 3910a9c9727cSPaolo Bonzini 3911157e7b13SMarc-André Lureau executable('qemu-edid', files('qemu-edid.c', 'hw/display/edid-generate.c'), 3912157e7b13SMarc-André Lureau dependencies: qemuutil, 3913157e7b13SMarc-André Lureau install: true) 3914157e7b13SMarc-André Lureau 39152a3129a3SPaolo Bonzini if have_vhost_user 39162d7ac0afSPaolo Bonzini subdir('contrib/vhost-user-blk') 3917ea458960SMarc-André Lureau subdir('contrib/vhost-user-gpu') 391832fcc624SMarc-André Lureau subdir('contrib/vhost-user-input') 391999650b62SPaolo Bonzini subdir('contrib/vhost-user-scsi') 3920931049b4SPaolo Bonzini endif 39218f51e01cSMarc-André Lureau 39228f51e01cSMarc-André Lureau if targetos == 'linux' 39238f51e01cSMarc-André Lureau executable('qemu-bridge-helper', files('qemu-bridge-helper.c'), 39248f51e01cSMarc-André Lureau dependencies: [qemuutil, libcap_ng], 39258f51e01cSMarc-André Lureau install: true, 39268f51e01cSMarc-André Lureau install_dir: get_option('libexecdir')) 3927897b5afaSMarc-André Lureau 3928897b5afaSMarc-André Lureau executable('qemu-pr-helper', files('scsi/qemu-pr-helper.c', 'scsi/utils.c'), 3929897b5afaSMarc-André Lureau dependencies: [authz, crypto, io, qom, qemuutil, 39306ec0e15dSPaolo Bonzini libcap_ng, mpathpersist], 3931897b5afaSMarc-André Lureau install: true) 39328f51e01cSMarc-André Lureau endif 39338f51e01cSMarc-André Lureau 3934ccd250aaSPaolo Bonzini if have_ivshmem 39355ee24e78SMarc-André Lureau subdir('contrib/ivshmem-client') 39365ee24e78SMarc-André Lureau subdir('contrib/ivshmem-server') 39375ee24e78SMarc-André Lureau endif 3938931049b4SPaolo Bonziniendif 3939931049b4SPaolo Bonzini 3940f5aa6320SMarc-André Lureausubdir('scripts') 39413f99cf57SPaolo Bonzinisubdir('tools') 3942bdcbea7aSMarc-André Lureausubdir('pc-bios') 3943f8aa24eaSPaolo Bonzinisubdir('docs') 3944e3667660SYonggang Luosubdir('tests') 39451b695471SPaolo Bonziniif gtk.found() 3946e8f3bd71SMarc-André Lureau subdir('po') 3947e8f3bd71SMarc-André Lureauendif 39483f99cf57SPaolo Bonzini 39498adfeba9SMarc-André Lureauif host_machine.system() == 'windows' 39508adfeba9SMarc-André Lureau nsis_cmd = [ 39518adfeba9SMarc-André Lureau find_program('scripts/nsis.py'), 39528adfeba9SMarc-André Lureau '@OUTPUT@', 39538adfeba9SMarc-André Lureau get_option('prefix'), 39548adfeba9SMarc-André Lureau meson.current_source_dir(), 3955fc9a809eSPaolo Bonzini glib_pc.get_variable('bindir'), 395624bdcc96SStefan Weil host_machine.cpu(), 39578adfeba9SMarc-André Lureau '--', 39588adfeba9SMarc-André Lureau '-DDISPLAYVERSION=' + meson.project_version(), 39598adfeba9SMarc-André Lureau ] 39608adfeba9SMarc-André Lureau if build_docs 39618adfeba9SMarc-André Lureau nsis_cmd += '-DCONFIG_DOCUMENTATION=y' 39628adfeba9SMarc-André Lureau endif 39631b695471SPaolo Bonzini if gtk.found() 39648adfeba9SMarc-André Lureau nsis_cmd += '-DCONFIG_GTK=y' 39658adfeba9SMarc-André Lureau endif 39668adfeba9SMarc-André Lureau 39678adfeba9SMarc-André Lureau nsis = custom_target('nsis', 39688adfeba9SMarc-André Lureau output: 'qemu-setup-' + meson.project_version() + '.exe', 39698adfeba9SMarc-André Lureau input: files('qemu.nsi'), 39708adfeba9SMarc-André Lureau build_always_stale: true, 39718adfeba9SMarc-André Lureau command: nsis_cmd + ['@INPUT@']) 39728adfeba9SMarc-André Lureau alias_target('installer', nsis) 39738adfeba9SMarc-André Lureauendif 39748adfeba9SMarc-André Lureau 3975a0c9162cSPaolo Bonzini######################### 3976a0c9162cSPaolo Bonzini# Configuration summary # 3977a0c9162cSPaolo Bonzini######################### 3978a0c9162cSPaolo Bonzini 3979983d0a75SPhilippe Mathieu-Daudé# Directories 3980f9332757SPaolo Bonzinisummary_info = {} 398116bf7a33SPaolo Bonzinisummary_info += {'Install prefix': get_option('prefix')} 398216bf7a33SPaolo Bonzinisummary_info += {'BIOS directory': qemu_datadir} 39838154f5e6SAkihiko Odakipathsep = targetos == 'windows' ? ';' : ':' 39848154f5e6SAkihiko Odakisummary_info += {'firmware path': pathsep.join(get_option('qemu_firmwarepath'))} 3985f7fb6c6aSPaolo Bonzinisummary_info += {'binary directory': get_option('prefix') / get_option('bindir')} 3986f7fb6c6aSPaolo Bonzinisummary_info += {'library directory': get_option('prefix') / get_option('libdir')} 398716bf7a33SPaolo Bonzinisummary_info += {'module directory': qemu_moddir} 3988f7fb6c6aSPaolo Bonzinisummary_info += {'libexec directory': get_option('prefix') / get_option('libexecdir')} 3989f7fb6c6aSPaolo Bonzinisummary_info += {'include directory': get_option('prefix') / get_option('includedir')} 3990f7fb6c6aSPaolo Bonzinisummary_info += {'config directory': get_option('prefix') / get_option('sysconfdir')} 3991f9332757SPaolo Bonziniif targetos != 'windows' 3992f7fb6c6aSPaolo Bonzini summary_info += {'local state directory': get_option('prefix') / get_option('localstatedir')} 3993f7fb6c6aSPaolo Bonzini summary_info += {'Manual directory': get_option('prefix') / get_option('mandir')} 3994f9332757SPaolo Bonzinielse 3995f9332757SPaolo Bonzini summary_info += {'local state directory': 'queried at runtime'} 3996f9332757SPaolo Bonziniendif 3997f7fb6c6aSPaolo Bonzinisummary_info += {'Doc directory': get_option('prefix') / get_option('docdir')} 3998f9332757SPaolo Bonzinisummary_info += {'Build directory': meson.current_build_dir()} 3999f9332757SPaolo Bonzinisummary_info += {'Source path': meson.current_source_dir()} 4000f9332757SPaolo Bonzinisummary_info += {'GIT submodules': config_host['GIT_SUBMODULES']} 4001983d0a75SPhilippe Mathieu-Daudésummary(summary_info, bool_yn: true, section: 'Directories') 4002983d0a75SPhilippe Mathieu-Daudé 4003e11a0e17SPhilippe Mathieu-Daudé# Host binaries 4004983d0a75SPhilippe Mathieu-Daudésummary_info = {} 4005e11a0e17SPhilippe Mathieu-Daudésummary_info += {'git': config_host['GIT']} 4006e11a0e17SPhilippe Mathieu-Daudésummary_info += {'make': config_host['MAKE']} 4007e11a0e17SPhilippe Mathieu-Daudésummary_info += {'python': '@0@ (version: @1@)'.format(python.full_path(), python.language_version())} 4008bb647c49SPaolo Bonzinisummary_info += {'sphinx-build': sphinx_build} 4009e11a0e17SPhilippe Mathieu-Daudéif config_host.has_key('HAVE_GDB_BIN') 4010e11a0e17SPhilippe Mathieu-Daudé summary_info += {'gdb': config_host['HAVE_GDB_BIN']} 4011e11a0e17SPhilippe Mathieu-Daudéendif 401240c909f5SPaolo Bonzinisummary_info += {'iasl': iasl} 4013e11a0e17SPhilippe Mathieu-Daudésummary_info += {'genisoimage': config_host['GENISOIMAGE']} 401420cf5cb4SPaolo Bonziniif targetos == 'windows' and have_ga 4015bb647c49SPaolo Bonzini summary_info += {'wixl': wixl} 4016e11a0e17SPhilippe Mathieu-Daudéendif 40175890258aSThomas Huthif slirp.found() and have_system 401835acbb30SPaolo Bonzini summary_info += {'smbd': have_slirp_smbd ? smbd_path : false} 4019e11a0e17SPhilippe Mathieu-Daudéendif 4020e11a0e17SPhilippe Mathieu-Daudésummary(summary_info, bool_yn: true, section: 'Host binaries') 4021e11a0e17SPhilippe Mathieu-Daudé 40221d718865SPhilippe Mathieu-Daudé# Configurable features 40231d718865SPhilippe Mathieu-Daudésummary_info = {} 40241d718865SPhilippe Mathieu-Daudésummary_info += {'Documentation': build_docs} 4025aa3ca634SPhilippe Mathieu-Daudésummary_info += {'system-mode emulation': have_system} 4026aa3ca634SPhilippe Mathieu-Daudésummary_info += {'user-mode emulation': have_user} 4027813803aaSPhilippe Mathieu-Daudésummary_info += {'block layer': have_block} 40281d718865SPhilippe Mathieu-Daudésummary_info += {'Install blobs': get_option('install_blobs')} 40296002711cSPaolo Bonzinisummary_info += {'module support': enable_modules} 40306002711cSPaolo Bonziniif enable_modules 40312cb2f580SPaolo Bonzini summary_info += {'alternative module path': get_option('module_upgrades')} 40321d718865SPhilippe Mathieu-Daudéendif 4033537b7248SPaolo Bonzinisummary_info += {'fuzzing support': get_option('fuzzing')} 40341d718865SPhilippe Mathieu-Daudéif have_system 403587430d5bSPaolo Bonzini summary_info += {'Audio drivers': ' '.join(audio_drivers_selected)} 40361d718865SPhilippe Mathieu-Daudéendif 40379c29b741SPaolo Bonzinisummary_info += {'Trace backends': ','.join(get_option('trace_backends'))} 40389c29b741SPaolo Bonziniif 'simple' in get_option('trace_backends') 40399c29b741SPaolo Bonzini summary_info += {'Trace output file': get_option('trace_file') + '-<pid>'} 40401d718865SPhilippe Mathieu-Daudéendif 4041142ca628SMarc-André Lureausummary_info += {'D-Bus display': dbus_display} 4042c55cf6abSPaolo Bonzinisummary_info += {'QOM debugging': get_option('qom_cast_debug')} 40432a3129a3SPaolo Bonzinisummary_info += {'vhost-kernel support': have_vhost_kernel} 40442a3129a3SPaolo Bonzinisummary_info += {'vhost-net support': have_vhost_net} 40452a3129a3SPaolo Bonzinisummary_info += {'vhost-user support': have_vhost_user} 40462a3129a3SPaolo Bonzinisummary_info += {'vhost-user-crypto support': have_vhost_user_crypto} 40471d718865SPhilippe Mathieu-Daudésummary_info += {'vhost-user-blk server support': have_vhost_user_blk_server} 40482a3129a3SPaolo Bonzinisummary_info += {'vhost-vdpa support': have_vhost_vdpa} 404920cf5cb4SPaolo Bonzinisummary_info += {'build guest agent': have_ga} 40501d718865SPhilippe Mathieu-Daudésummary(summary_info, bool_yn: true, section: 'Configurable features') 40511d718865SPhilippe Mathieu-Daudé 40522e864b8bSPhilippe Mathieu-Daudé# Compilation information 4053e11a0e17SPhilippe Mathieu-Daudésummary_info = {} 40542e864b8bSPhilippe Mathieu-Daudésummary_info += {'host CPU': cpu} 40552e864b8bSPhilippe Mathieu-Daudésummary_info += {'host endianness': build_machine.endian()} 405663de9353SAlex Bennéesummary_info += {'C compiler': ' '.join(meson.get_compiler('c').cmd_array())} 405763de9353SAlex Bennéesummary_info += {'Host C compiler': ' '.join(meson.get_compiler('c', native: true).cmd_array())} 4058f9332757SPaolo Bonziniif link_language == 'cpp' 405963de9353SAlex Bennée summary_info += {'C++ compiler': ' '.join(meson.get_compiler('cpp').cmd_array())} 4060f9332757SPaolo Bonzinielse 4061f9332757SPaolo Bonzini summary_info += {'C++ compiler': false} 4062f9332757SPaolo Bonziniendif 4063f9332757SPaolo Bonziniif targetos == 'darwin' 406463de9353SAlex Bennée summary_info += {'Objective-C compiler': ' '.join(meson.get_compiler('objc').cmd_array())} 4065f9332757SPaolo Bonziniendif 40666a97f393SPaolo Bonzinioption_cflags = (get_option('debug') ? ['-g'] : []) 40676a97f393SPaolo Bonziniif get_option('optimization') != 'plain' 40686a97f393SPaolo Bonzini option_cflags += ['-O' + get_option('optimization')] 40696a97f393SPaolo Bonziniendif 40706a97f393SPaolo Bonzinisummary_info += {'CFLAGS': ' '.join(get_option('c_args') + option_cflags)} 407147b30835SPaolo Bonziniif link_language == 'cpp' 40726a97f393SPaolo Bonzini summary_info += {'CXXFLAGS': ' '.join(get_option('cpp_args') + option_cflags)} 407347b30835SPaolo Bonziniendif 4074e910c7d9SPhilippe Mathieu-Daudéif targetos == 'darwin' 40756a97f393SPaolo Bonzini summary_info += {'OBJCFLAGS': ' '.join(get_option('objc_args') + option_cflags)} 4076e910c7d9SPhilippe Mathieu-Daudéendif 407747b30835SPaolo Bonzinilink_args = get_option(link_language + '_link_args') 407847b30835SPaolo Bonziniif link_args.length() > 0 407947b30835SPaolo Bonzini summary_info += {'LDFLAGS': ' '.join(link_args)} 408047b30835SPaolo Bonziniendif 4081d67212d4SPaolo Bonzinisummary_info += {'QEMU_CFLAGS': ' '.join(qemu_common_flags + qemu_cflags)} 4082e5134024SPaolo Bonziniif 'cpp' in all_languages 4083d67212d4SPaolo Bonzini summary_info += {'QEMU_CXXFLAGS': ' '.join(qemu_common_flags + qemu_cxxflags)} 4084e5134024SPaolo Bonziniendif 4085e5134024SPaolo Bonziniif 'objc' in all_languages 408695caf1fbSPaolo Bonzini summary_info += {'QEMU_OBJCFLAGS': ' '.join(qemu_common_flags)} 4087e5134024SPaolo Bonziniendif 4088d065177eSPaolo Bonzinisummary_info += {'QEMU_LDFLAGS': ' '.join(qemu_ldflags)} 4089c55cf6abSPaolo Bonzinisummary_info += {'profiler': get_option('profiler')} 4090cdad781dSDaniele Buonosummary_info += {'link-time optimization (LTO)': get_option('b_lto')} 40912e864b8bSPhilippe Mathieu-Daudésummary_info += {'PIE': get_option('b_pie')} 40923e8529ddSLaurent Viviersummary_info += {'static build': config_host.has_key('CONFIG_STATIC')} 40932e864b8bSPhilippe Mathieu-Daudésummary_info += {'malloc trim support': has_malloc_trim} 4094b87df904SPaolo Bonzinisummary_info += {'membarrier': have_membarrier} 409558a2e3f5SStefan Hajnoczisummary_info += {'debug graph lock': get_option('debug_graph_lock')} 4096728c0a2fSPaolo Bonzinisummary_info += {'debug stack usage': get_option('debug_stack_usage')} 4097c55cf6abSPaolo Bonzinisummary_info += {'mutex debugging': get_option('debug_mutex')} 40982e864b8bSPhilippe Mathieu-Daudésummary_info += {'memory allocator': get_option('malloc')} 4099622753d2SPaolo Bonzinisummary_info += {'avx2 optimization': config_host_data.get('CONFIG_AVX2_OPT')} 410004ffce13Sling xusummary_info += {'avx512bw optimization': config_host_data.get('CONFIG_AVX512BW_OPT')} 4101622753d2SPaolo Bonzinisummary_info += {'avx512f optimization': config_host_data.get('CONFIG_AVX512F_OPT')} 4102bb9ecae7SAlex Bennéeif get_option('gprof') 4103bb9ecae7SAlex Bennée gprof_info = 'YES (deprecated)' 4104bb9ecae7SAlex Bennéeelse 4105bb9ecae7SAlex Bennée gprof_info = get_option('gprof') 4106bb9ecae7SAlex Bennéeendif 4107bb9ecae7SAlex Bennéesummary_info += {'gprof': gprof_info} 41082e864b8bSPhilippe Mathieu-Daudésummary_info += {'gcov': get_option('b_coverage')} 410934f983d8SPaolo Bonzinisummary_info += {'thread sanitizer': get_option('tsan')} 41102e864b8bSPhilippe Mathieu-Daudésummary_info += {'CFI support': get_option('cfi')} 41112e864b8bSPhilippe Mathieu-Daudéif get_option('cfi') 41122e864b8bSPhilippe Mathieu-Daudé summary_info += {'CFI debug support': get_option('cfi_debug')} 41132e864b8bSPhilippe Mathieu-Daudéendif 41142e864b8bSPhilippe Mathieu-Daudésummary_info += {'strip binaries': get_option('strip')} 4115bb647c49SPaolo Bonzinisummary_info += {'sparse': sparse} 41162e864b8bSPhilippe Mathieu-Daudésummary_info += {'mingw32 support': targetos == 'windows'} 411712640f05SPaolo Bonzinisummary(summary_info, bool_yn: true, section: 'Compilation') 411849e8565bSAlex Bennée 411949e8565bSAlex Bennée# snarf the cross-compilation information for tests 412012640f05SPaolo Bonzinisummary_info = {} 412112640f05SPaolo Bonzinihave_cross = false 412249e8565bSAlex Bennéeforeach target: target_dirs 4123c7022a70SPaolo Bonzini tcg_mak = meson.current_build_dir() / 'tests/tcg' / target / 'config-target.mak' 412449e8565bSAlex Bennée if fs.exists(tcg_mak) 412549e8565bSAlex Bennée config_cross_tcg = keyval.load(tcg_mak) 412685b141eaSAlex Bennée if 'CC' in config_cross_tcg 412712640f05SPaolo Bonzini summary_info += {config_cross_tcg['TARGET_NAME']: config_cross_tcg['CC']} 412812640f05SPaolo Bonzini have_cross = true 412949e8565bSAlex Bennée endif 413049e8565bSAlex Bennée endif 413149e8565bSAlex Bennéeendforeach 413212640f05SPaolo Bonziniif have_cross 413312640f05SPaolo Bonzini summary(summary_info, bool_yn: true, section: 'Cross compilers') 413412640f05SPaolo Bonziniendif 41352e864b8bSPhilippe Mathieu-Daudé 4136aa3ca634SPhilippe Mathieu-Daudé# Targets and accelerators 41372e864b8bSPhilippe Mathieu-Daudésummary_info = {} 4138aa3ca634SPhilippe Mathieu-Daudéif have_system 4139aa3ca634SPhilippe Mathieu-Daudé summary_info += {'KVM support': config_all.has_key('CONFIG_KVM')} 4140aa3ca634SPhilippe Mathieu-Daudé summary_info += {'HAX support': config_all.has_key('CONFIG_HAX')} 4141aa3ca634SPhilippe Mathieu-Daudé summary_info += {'HVF support': config_all.has_key('CONFIG_HVF')} 4142aa3ca634SPhilippe Mathieu-Daudé summary_info += {'WHPX support': config_all.has_key('CONFIG_WHPX')} 414374a414a1SReinoud Zandijk summary_info += {'NVMM support': config_all.has_key('CONFIG_NVMM')} 414414efd8d3SPaolo Bonzini summary_info += {'Xen support': xen.found()} 414514efd8d3SPaolo Bonzini if xen.found() 414614efd8d3SPaolo Bonzini summary_info += {'xen ctrl version': xen.version()} 4147aa3ca634SPhilippe Mathieu-Daudé endif 4148820c1abaSDavid Woodhouse summary_info += {'Xen emulation': config_all.has_key('CONFIG_XEN_EMU')} 4149aa3ca634SPhilippe Mathieu-Daudéendif 4150aa3ca634SPhilippe Mathieu-Daudésummary_info += {'TCG support': config_all.has_key('CONFIG_TCG')} 4151aa3ca634SPhilippe Mathieu-Daudéif config_all.has_key('CONFIG_TCG') 415239687acaSPhilippe Mathieu-Daudé if get_option('tcg_interpreter') 4153f1f727acSPhilippe Mathieu-Daudé summary_info += {'TCG backend': 'TCI (TCG with bytecode interpreter, slow)'} 415439687acaSPhilippe Mathieu-Daudé else 415539687acaSPhilippe Mathieu-Daudé summary_info += {'TCG backend': 'native (@0@)'.format(cpu)} 415639687acaSPhilippe Mathieu-Daudé endif 4157029aa68fSAlex Bennée summary_info += {'TCG plugins': config_host.has_key('CONFIG_PLUGIN')} 4158aa3ca634SPhilippe Mathieu-Daudé summary_info += {'TCG debug enabled': config_host.has_key('CONFIG_DEBUG_TCG')} 4159aa3ca634SPhilippe Mathieu-Daudéendif 41602e864b8bSPhilippe Mathieu-Daudésummary_info += {'target list': ' '.join(target_dirs)} 4161aa3ca634SPhilippe Mathieu-Daudéif have_system 4162aa3ca634SPhilippe Mathieu-Daudé summary_info += {'default devices': get_option('default_devices')} 4163106ad1f9SPaolo Bonzini summary_info += {'out of process emulation': multiprocess_allowed} 416455116968SJagannathan Raman summary_info += {'vfio-user server': vfio_user_server_allowed} 4165aa3ca634SPhilippe Mathieu-Daudéendif 4166aa3ca634SPhilippe Mathieu-Daudésummary(summary_info, bool_yn: true, section: 'Targets and accelerators') 4167aa3ca634SPhilippe Mathieu-Daudé 4168813803aaSPhilippe Mathieu-Daudé# Block layer 4169813803aaSPhilippe Mathieu-Daudésummary_info = {} 41706739825aSPaolo Bonzinisummary_info += {'coroutine backend': coroutine_backend} 4171728c0a2fSPaolo Bonzinisummary_info += {'coroutine pool': have_coroutine_pool} 4172813803aaSPhilippe Mathieu-Daudéif have_block 4173622d64ffSPaolo Bonzini summary_info += {'Block whitelist (rw)': get_option('block_drv_rw_whitelist')} 4174622d64ffSPaolo Bonzini summary_info += {'Block whitelist (ro)': get_option('block_drv_ro_whitelist')} 4175c55cf6abSPaolo Bonzini summary_info += {'Use block whitelist in tools': get_option('block_drv_whitelist_in_tools')} 41763887702eSChristian Schoenebeck summary_info += {'VirtFS (9P) support': have_virtfs} 41773887702eSChristian Schoenebeck summary_info += {'VirtFS (9P) Proxy Helper support': have_virtfs_proxy_helper} 4178406523f6SPaolo Bonzini summary_info += {'Live block migration': config_host_data.get('CONFIG_LIVE_BLOCK_MIGRATION')} 4179406523f6SPaolo Bonzini summary_info += {'replication support': config_host_data.get('CONFIG_REPLICATION')} 4180ed793c2cSPaolo Bonzini summary_info += {'bochs support': get_option('bochs').allowed()} 4181ed793c2cSPaolo Bonzini summary_info += {'cloop support': get_option('cloop').allowed()} 4182ed793c2cSPaolo Bonzini summary_info += {'dmg support': get_option('dmg').allowed()} 4183ed793c2cSPaolo Bonzini summary_info += {'qcow v1 support': get_option('qcow1').allowed()} 4184ed793c2cSPaolo Bonzini summary_info += {'vdi support': get_option('vdi').allowed()} 418511cea42eSVladimir Sementsov-Ogievskiy summary_info += {'vhdx support': get_option('vhdx').allowed()} 418611cea42eSVladimir Sementsov-Ogievskiy summary_info += {'vmdk support': get_option('vmdk').allowed()} 418711cea42eSVladimir Sementsov-Ogievskiy summary_info += {'vpc support': get_option('vpc').allowed()} 4188ed793c2cSPaolo Bonzini summary_info += {'vvfat support': get_option('vvfat').allowed()} 4189ed793c2cSPaolo Bonzini summary_info += {'qed support': get_option('qed').allowed()} 4190ed793c2cSPaolo Bonzini summary_info += {'parallels support': get_option('parallels').allowed()} 4191bb647c49SPaolo Bonzini summary_info += {'FUSE exports': fuse} 41922a2359b8SXie Yongji summary_info += {'VDUSE block exports': have_vduse_blk_export} 4193813803aaSPhilippe Mathieu-Daudéendif 4194813803aaSPhilippe Mathieu-Daudésummary(summary_info, bool_yn: true, section: 'Block layer support') 4195813803aaSPhilippe Mathieu-Daudé 4196aa58028aSPhilippe Mathieu-Daudé# Crypto 4197aa3ca634SPhilippe Mathieu-Daudésummary_info = {} 419841f2ae28SPaolo Bonzinisummary_info += {'TLS priority': get_option('tls_priority')} 4199bb647c49SPaolo Bonzinisummary_info += {'GNUTLS support': gnutls} 4200bb647c49SPaolo Bonziniif gnutls.found() 4201cc4c7c73SDaniel P. Berrangé summary_info += {' GNUTLS crypto': gnutls_crypto.found()} 4202bb647c49SPaolo Bonziniendif 4203bb647c49SPaolo Bonzinisummary_info += {'libgcrypt': gcrypt} 4204bb647c49SPaolo Bonzinisummary_info += {'nettle': nettle} 420557612511SPaolo Bonziniif nettle.found() 420657612511SPaolo Bonzini summary_info += {' XTS': xts != 'private'} 4207f9332757SPaolo Bonziniendif 420834b52615SPaolo Bonzinisummary_info += {'AF_ALG support': have_afalg} 4209c55cf6abSPaolo Bonzinisummary_info += {'rng-none': get_option('rng_none')} 42102edd2c04SPaolo Bonzinisummary_info += {'Linux keyring': have_keyring} 4211aa58028aSPhilippe Mathieu-Daudésummary(summary_info, bool_yn: true, section: 'Crypto') 4212aa58028aSPhilippe Mathieu-Daudé 421369a78cceSPhilippe Mathieu-Daudé# Libraries 4214aa58028aSPhilippe Mathieu-Daudésummary_info = {} 4215aa58028aSPhilippe Mathieu-Daudéif targetos == 'darwin' 4216bb647c49SPaolo Bonzini summary_info += {'Cocoa support': cocoa} 4217e2c1d78dSVladislav Yaroshchuk summary_info += {'vmnet.framework support': vmnet} 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} 42245890258aSThomas Huthsummary_info += {'slirp support': slirp} 4225bb647c49SPaolo Bonzinisummary_info += {'libtasn1': tasn1} 4226bb647c49SPaolo Bonzinisummary_info += {'PAM': pam} 4227bb647c49SPaolo Bonzinisummary_info += {'iconv support': iconv} 4228bb647c49SPaolo Bonzinisummary_info += {'curses support': curses} 4229bb647c49SPaolo Bonzinisummary_info += {'virgl support': virgl} 4230fd66dbd4SStefan Hajnoczisummary_info += {'blkio support': blkio} 4231bb647c49SPaolo Bonzinisummary_info += {'curl support': curl} 4232bb647c49SPaolo Bonzinisummary_info += {'Multipath support': mpathpersist} 423395f8510eSKshitij Surisummary_info += {'PNG support': png} 4234bb647c49SPaolo Bonzinisummary_info += {'VNC support': vnc} 4235a0b93237SPaolo Bonziniif vnc.found() 4236bb647c49SPaolo Bonzini summary_info += {'VNC SASL support': sasl} 4237bb647c49SPaolo Bonzini summary_info += {'VNC JPEG support': jpeg} 4238f9332757SPaolo Bonziniendif 423987430d5bSPaolo Bonziniif targetos not in ['darwin', 'haiku', 'windows'] 424087430d5bSPaolo Bonzini summary_info += {'OSS support': oss} 4241663df1ccSAlexandre Ratchov summary_info += {'sndio support': sndio} 424287430d5bSPaolo Bonzinielif targetos == 'darwin' 424387430d5bSPaolo Bonzini summary_info += {'CoreAudio support': coreaudio} 424487430d5bSPaolo Bonzinielif targetos == 'windows' 424587430d5bSPaolo Bonzini summary_info += {'DirectSound support': dsound} 424687430d5bSPaolo Bonziniendif 424787430d5bSPaolo Bonziniif targetos == 'linux' 424887430d5bSPaolo Bonzini summary_info += {'ALSA support': alsa} 424987430d5bSPaolo Bonzini summary_info += {'PulseAudio support': pulse} 425087430d5bSPaolo Bonziniendif 4251c2d3d1c2SDorinda Basseysummary_info += {'Pipewire support': pipewire} 425287430d5bSPaolo Bonzinisummary_info += {'JACK support': jack} 4253bb647c49SPaolo Bonzinisummary_info += {'brlapi support': brlapi} 4254e1723999SPaolo Bonzinisummary_info += {'vde support': vde} 4255837b84b1SPaolo Bonzinisummary_info += {'netmap support': have_netmap} 4256eea9453aSThomas Huthsummary_info += {'l2tpv3 support': have_l2tpv3} 4257ff66f3e5SPaolo Bonzinisummary_info += {'Linux AIO support': libaio} 4258bb647c49SPaolo Bonzinisummary_info += {'Linux io_uring support': linux_io_uring} 4259bb647c49SPaolo Bonzinisummary_info += {'ATTR/XATTR support': libattr} 42603730a734SPaolo Bonzinisummary_info += {'RDMA support': rdma} 42613730a734SPaolo Bonzinisummary_info += {'PVRDMA support': have_pvrdma} 4262fbb4121dSPaolo Bonzinisummary_info += {'fdt support': fdt_opt == 'disabled' ? false : fdt_opt} 4263bb647c49SPaolo Bonzinisummary_info += {'libcap-ng support': libcap_ng} 4264bb647c49SPaolo Bonzinisummary_info += {'bpf support': libbpf} 42653f0a5d55SMarc-André Lureausummary_info += {'spice protocol support': spice_protocol} 42663f0a5d55SMarc-André Lureauif spice_protocol.found() 42673f0a5d55SMarc-André Lureau summary_info += {' spice server support': spice} 42683f0a5d55SMarc-André Lureauendif 4269bb647c49SPaolo Bonzinisummary_info += {'rbd support': rbd} 4270bb647c49SPaolo Bonzinisummary_info += {'smartcard support': cacard} 4271bb647c49SPaolo Bonzinisummary_info += {'U2F support': u2f} 4272bb647c49SPaolo Bonzinisummary_info += {'libusb': libusb} 4273bb647c49SPaolo Bonzinisummary_info += {'usb net redir': usbredir} 427488b6e618SPaolo Bonzinisummary_info += {'OpenGL support (epoxy)': opengl} 4275bb647c49SPaolo Bonzinisummary_info += {'GBM': gbm} 4276bb647c49SPaolo Bonzinisummary_info += {'libiscsi support': libiscsi} 4277bb647c49SPaolo Bonzinisummary_info += {'libnfs support': libnfs} 4278f9332757SPaolo Bonziniif targetos == 'windows' 427920cf5cb4SPaolo Bonzini if have_ga 42808821a389SMarc-André Lureau summary_info += {'QGA VSS support': have_qga_vss} 4281b846ab7cSPaolo Bonzini endif 4282f9332757SPaolo Bonziniendif 4283bb647c49SPaolo Bonzinisummary_info += {'seccomp support': seccomp} 4284bb647c49SPaolo Bonzinisummary_info += {'GlusterFS support': glusterfs} 42850d04c4c9SPaolo Bonzinisummary_info += {'TPM support': have_tpm} 4286e6a52b36SThomas Huthsummary_info += {'libssh support': libssh} 4287bb647c49SPaolo Bonzinisummary_info += {'lzo support': lzo} 4288bb647c49SPaolo Bonzinisummary_info += {'snappy support': snappy} 4289bb647c49SPaolo Bonzinisummary_info += {'bzip2 support': libbzip2} 4290bb647c49SPaolo Bonzinisummary_info += {'lzfse support': liblzfse} 4291bb647c49SPaolo Bonzinisummary_info += {'zstd support': zstd} 4292488a8c73SPaolo Bonzinisummary_info += {'NUMA host support': numa} 429383602083SThomas Huthsummary_info += {'capstone': capstone} 4294bb647c49SPaolo Bonzinisummary_info += {'libpmem support': libpmem} 4295bb647c49SPaolo Bonzinisummary_info += {'libdaxctl support': libdaxctl} 4296bb647c49SPaolo Bonzinisummary_info += {'libudev': libudev} 4297bb647c49SPaolo Bonzini# Dummy dependency, keep .found() 4298df4ea709SMax Reitzsummary_info += {'FUSE lseek': fuse_lseek.found()} 42993d212b41SRichard W.M. Jonessummary_info += {'selinux': selinux} 43007c10cb38SIlya Leoshkevichsummary_info += {'libdw': libdw} 430169a78cceSPhilippe Mathieu-Daudésummary(summary_info, bool_yn: true, section: 'Dependencies') 4302f9332757SPaolo Bonzini 4303f9332757SPaolo Bonziniif not supported_cpus.contains(cpu) 4304f9332757SPaolo Bonzini message() 4305f9332757SPaolo Bonzini warning('SUPPORT FOR THIS HOST CPU WILL GO AWAY IN FUTURE RELEASES!') 4306f9332757SPaolo Bonzini message() 4307f9332757SPaolo Bonzini message('CPU host architecture ' + cpu + ' support is not currently maintained.') 4308f9332757SPaolo Bonzini message('The QEMU project intends to remove support for this host CPU in') 4309f9332757SPaolo Bonzini message('a future release if nobody volunteers to maintain it and to') 4310f9332757SPaolo Bonzini message('provide a build host for our continuous integration setup.') 4311f9332757SPaolo Bonzini message('configure has succeeded and you can continue to build, but') 4312f9332757SPaolo Bonzini message('if you care about QEMU on this platform you should contact') 4313f9332757SPaolo Bonzini message('us upstream at qemu-devel@nongnu.org.') 4314f9332757SPaolo Bonziniendif 4315f9332757SPaolo Bonzini 4316f9332757SPaolo Bonziniif not supported_oses.contains(targetos) 4317f9332757SPaolo Bonzini message() 4318f9332757SPaolo Bonzini warning('WARNING: SUPPORT FOR THIS HOST OS WILL GO AWAY IN FUTURE RELEASES!') 4319f9332757SPaolo Bonzini message() 4320f9332757SPaolo Bonzini message('Host OS ' + targetos + 'support is not currently maintained.') 4321f9332757SPaolo Bonzini message('The QEMU project intends to remove support for this host OS in') 4322f9332757SPaolo Bonzini message('a future release if nobody volunteers to maintain it and to') 4323f9332757SPaolo Bonzini message('provide a build host for our continuous integration setup.') 4324f9332757SPaolo Bonzini message('configure has succeeded and you can continue to build, but') 4325f9332757SPaolo Bonzini message('if you care about QEMU on this platform you should contact') 4326f9332757SPaolo Bonzini message('us upstream at qemu-devel@nongnu.org.') 4327f9332757SPaolo Bonziniendif 4328