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 193d67212d4SPaolo Bonziniqemu_common_flags = [] 194d67212d4SPaolo Bonziniqemu_cflags = [] 195d67212d4SPaolo Bonziniforeach arg : config_host['QEMU_CFLAGS'].split() 196d67212d4SPaolo Bonzini if arg.startswith('-W') 197d67212d4SPaolo Bonzini qemu_cflags += arg 198d67212d4SPaolo Bonzini else 199d67212d4SPaolo Bonzini qemu_common_flags += arg 200d67212d4SPaolo Bonzini endif 201d67212d4SPaolo Bonziniendforeach 2024cb37d11SPhilippe Mathieu-Daudéqemu_objcflags = config_host['QEMU_OBJCFLAGS'].split() 2038cc2d231SPaolo Bonziniqemu_ldflags = config_host['QEMU_LDFLAGS'].split() 2048cc2d231SPaolo Bonzini 205d67212d4SPaolo Bonziniif get_option('gprof') 206d67212d4SPaolo Bonzini qemu_common_flags += ['-p'] 207d67212d4SPaolo Bonzini qemu_ldflags += ['-p'] 208d67212d4SPaolo Bonziniendif 209d67212d4SPaolo Bonzini 210a0cbd2e8SPaolo Bonziniif get_option('prefer_static') 211e4333d14SPaolo Bonzini qemu_ldflags += get_option('b_pie') ? '-static-pie' : '-static' 212e4333d14SPaolo Bonziniendif 213e4333d14SPaolo Bonzini 21434f983d8SPaolo Bonziniif get_option('sanitizers') 21534f983d8SPaolo Bonzini if cc.has_argument('-fsanitize=address') 21634f983d8SPaolo Bonzini qemu_cflags = ['-fsanitize=address'] + qemu_cflags 21734f983d8SPaolo Bonzini qemu_ldflags = ['-fsanitize=address'] + qemu_ldflags 21834f983d8SPaolo Bonzini endif 21934f983d8SPaolo Bonzini 22034f983d8SPaolo Bonzini # Detect static linking issue with ubsan - https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84285 22134f983d8SPaolo Bonzini if cc.links('int main(int argc, char **argv) { return argc + 1; }', 22234f983d8SPaolo Bonzini args: [qemu_ldflags, '-fsanitize=undefined']) 22334f983d8SPaolo Bonzini qemu_cflags = ['-fsanitize=undefined'] + qemu_cflags 22434f983d8SPaolo Bonzini qemu_ldflags = ['-fsanitize=undefined'] + qemu_ldflags 22534f983d8SPaolo Bonzini endif 22634f983d8SPaolo Bonziniendif 22734f983d8SPaolo Bonzini 22834f983d8SPaolo Bonzini# Thread sanitizer is, for now, much noisier than the other sanitizers; 22934f983d8SPaolo Bonzini# keep it separate until that is not the case. 23034f983d8SPaolo Bonziniif get_option('tsan') 23134f983d8SPaolo Bonzini if get_option('sanitizers') 23234f983d8SPaolo Bonzini error('TSAN is not supported with other sanitizers') 23334f983d8SPaolo Bonzini endif 23434f983d8SPaolo Bonzini if not cc.has_function('__tsan_create_fiber', 23534f983d8SPaolo Bonzini args: '-fsanitize=thread', 23634f983d8SPaolo Bonzini prefix: '#include <sanitizer/tsan_interface.h>') 23734f983d8SPaolo Bonzini error('Cannot enable TSAN due to missing fiber annotation interface') 23834f983d8SPaolo Bonzini endif 23934f983d8SPaolo Bonzini qemu_cflags = ['-fsanitize=thread'] + qemu_cflags 24034f983d8SPaolo Bonzini qemu_ldflags = ['-fsanitize=thread'] + qemu_ldflags 24134f983d8SPaolo Bonziniendif 24234f983d8SPaolo Bonzini 243e4333d14SPaolo Bonzini# Detect support for PT_GNU_RELRO + DT_BIND_NOW. 244e4333d14SPaolo Bonzini# The combination is known as "full relro", because .got.plt is read-only too. 245e4333d14SPaolo Bonziniqemu_ldflags += cc.get_supported_link_arguments('-Wl,-z,relro', '-Wl,-z,now') 246e4333d14SPaolo Bonzini 247d2147e04SPaolo Bonziniif targetos == 'windows' 248d2147e04SPaolo Bonzini qemu_ldflags += cc.get_supported_link_arguments('-Wl,--no-seh', '-Wl,--nxcompat') 2492d73fa74SPaolo Bonzini qemu_ldflags += cc.get_supported_link_arguments('-Wl,--dynamicbase', '-Wl,--high-entropy-va') 250d2147e04SPaolo Bonziniendif 251d2147e04SPaolo Bonzini 252d67212d4SPaolo Bonzini# Exclude --warn-common with TSan to suppress warnings from the TSan libraries. 25334f983d8SPaolo Bonziniif targetos != 'sunos' and not get_option('tsan') 254d67212d4SPaolo Bonzini qemu_ldflags += cc.get_supported_link_arguments('-Wl,--warn-common') 255c55cf6abSPaolo Bonziniendif 256c55cf6abSPaolo Bonzini 257ff9ed62bSAlexander Bulekov# Specify linker-script with add_project_link_arguments so that it is not placed 258ff9ed62bSAlexander Bulekov# within a linker --start-group/--end-group pair 259537b7248SPaolo Bonziniif get_option('fuzzing') 260537b7248SPaolo Bonzini # Specify a filter to only instrument code that is directly related to 261537b7248SPaolo Bonzini # virtual-devices. 262537b7248SPaolo Bonzini configure_file(output: 'instrumentation-filter', 263537b7248SPaolo Bonzini input: 'scripts/oss-fuzz/instrumentation-filter-template', 264537b7248SPaolo Bonzini copy: true) 265aa4f3a3bSAlexander Bulekov 266aa4f3a3bSAlexander Bulekov if cc.compiles('int main () { return 0; }', 267aa4f3a3bSAlexander Bulekov name: '-fsanitize-coverage-allowlist=/dev/null', 268e56d0970SAlexander Bulekov args: ['-fsanitize-coverage-allowlist=/dev/null', 269e56d0970SAlexander Bulekov '-fsanitize-coverage=trace-pc'] ) 270d67212d4SPaolo Bonzini qemu_common_flags += ['-fsanitize-coverage-allowlist=instrumentation-filter'] 271aa4f3a3bSAlexander Bulekov endif 272537b7248SPaolo Bonzini 273537b7248SPaolo Bonzini if get_option('fuzzing_engine') == '' 274537b7248SPaolo Bonzini # Add CFLAGS to tell clang to add fuzzer-related instrumentation to all the 275537b7248SPaolo Bonzini # compiled code. To build non-fuzzer binaries with --enable-fuzzing, link 276537b7248SPaolo Bonzini # everything with fsanitize=fuzzer-no-link. Otherwise, the linker will be 277537b7248SPaolo Bonzini # unable to bind the fuzzer-related callbacks added by instrumentation. 278d67212d4SPaolo Bonzini qemu_common_flags += ['-fsanitize=fuzzer-no-link'] 279d67212d4SPaolo Bonzini qemu_ldflags += ['-fsanitize=fuzzer-no-link'] 280537b7248SPaolo Bonzini # For the actual fuzzer binaries, we need to link against the libfuzzer 281537b7248SPaolo Bonzini # library. They need to be configurable, to support OSS-Fuzz 282537b7248SPaolo Bonzini fuzz_exe_ldflags = ['-fsanitize=fuzzer'] 283537b7248SPaolo Bonzini else 284537b7248SPaolo Bonzini # LIB_FUZZING_ENGINE was set; assume we are running on OSS-Fuzz, and 285537b7248SPaolo Bonzini # the needed CFLAGS have already been provided 286537b7248SPaolo Bonzini fuzz_exe_ldflags = get_option('fuzzing_engine').split() 287537b7248SPaolo Bonzini endif 288ff9ed62bSAlexander Bulekovendif 289ff9ed62bSAlexander Bulekov 290d67212d4SPaolo Bonziniadd_global_arguments(qemu_common_flags, native: false, language: all_languages) 291d67212d4SPaolo Bonziniadd_global_link_arguments(qemu_ldflags, native: false, language: all_languages) 292d67212d4SPaolo Bonzini 293b485458eSPaolo Bonzini# Check that the C++ compiler exists and works with the C compiler. 294b485458eSPaolo Bonzinilink_language = 'c' 295b485458eSPaolo Bonzinilinker = cc 296b485458eSPaolo Bonziniqemu_cxxflags = [] 297e5134024SPaolo Bonziniif 'cpp' in all_languages 298b485458eSPaolo Bonzini add_global_arguments(['-D__STDC_LIMIT_MACROS', '-D__STDC_CONSTANT_MACROS', '-D__STDC_FORMAT_MACROS'], 299b485458eSPaolo Bonzini native: false, language: 'cpp') 300b485458eSPaolo Bonzini foreach k: qemu_cflags 301b485458eSPaolo Bonzini if k not in ['-Wstrict-prototypes', '-Wmissing-prototypes', '-Wnested-externs', 302b485458eSPaolo Bonzini '-Wold-style-declaration', '-Wold-style-definition', '-Wredundant-decls'] 303b485458eSPaolo Bonzini qemu_cxxflags += [k] 304b485458eSPaolo Bonzini endif 305b485458eSPaolo Bonzini endforeach 306b485458eSPaolo Bonzini 307b485458eSPaolo Bonzini if cxx.links(files('scripts/main.c'), args: qemu_cflags) 308b485458eSPaolo Bonzini link_language = 'cpp' 309b485458eSPaolo Bonzini linker = cxx 310b485458eSPaolo Bonzini else 311b485458eSPaolo Bonzini message('C++ compiler does not work with C compiler') 312b485458eSPaolo Bonzini message('Disabling C++-specific optional code') 313b485458eSPaolo Bonzini endif 314b485458eSPaolo Bonziniendif 315b485458eSPaolo Bonzini 31634f983d8SPaolo Bonzini# clang does not support glibc + FORTIFY_SOURCE (is it still true?) 31734f983d8SPaolo Bonziniif get_option('optimization') != '0' and targetos == 'linux' 31834f983d8SPaolo Bonzini if cc.get_id() == 'gcc' 31934f983d8SPaolo Bonzini qemu_cflags += ['-U_FORTIFY_SOURCE', '-D_FORTIFY_SOURCE=2'] 32034f983d8SPaolo Bonzini endif 32134f983d8SPaolo Bonzini if 'cpp' in all_languages and cxx.get_id() == 'gcc' 32234f983d8SPaolo Bonzini qemu_cxxflags += ['-U_FORTIFY_SOURCE', '-D_FORTIFY_SOURCE=2'] 32334f983d8SPaolo Bonzini endif 32434f983d8SPaolo Bonziniendif 32534f983d8SPaolo Bonzini 326d67212d4SPaolo Bonziniadd_project_arguments(qemu_cflags, native: false, language: 'c') 327d67212d4SPaolo Bonziniadd_project_arguments(qemu_cxxflags, native: false, language: 'cpp') 328d67212d4SPaolo Bonziniadd_project_arguments(qemu_objcflags, native: false, language: 'objc') 3291e6e616dSPaolo Bonziniif targetos == 'linux' 3301e6e616dSPaolo Bonzini add_project_arguments('-isystem', meson.current_source_dir() / 'linux-headers', 3311e6e616dSPaolo Bonzini '-isystem', 'linux-headers', 332e5134024SPaolo Bonzini language: all_languages) 3331e6e616dSPaolo Bonziniendif 3341e6e616dSPaolo Bonzini 33523a77b2dSPaolo Bonziniadd_project_arguments('-iquote', '.', 3361e6e616dSPaolo Bonzini '-iquote', meson.current_source_dir(), 3371e6e616dSPaolo Bonzini '-iquote', meson.current_source_dir() / 'include', 338e5134024SPaolo Bonzini language: all_languages) 339a5665051SPaolo Bonzini 340deb62371SPaolo Bonzinisparse = find_program('cgcc', required: get_option('sparse')) 341deb62371SPaolo Bonziniif sparse.found() 342968b4db3SPaolo Bonzini run_target('sparse', 343968b4db3SPaolo Bonzini command: [find_program('scripts/check_sparse.py'), 344deb62371SPaolo Bonzini 'compile_commands.json', sparse.full_path(), '-Wbitwise', 345deb62371SPaolo Bonzini '-Wno-transparent-union', '-Wno-old-initializer', 346deb62371SPaolo Bonzini '-Wno-non-pointer-null']) 347968b4db3SPaolo Bonziniendif 348968b4db3SPaolo Bonzini 3496ec0e15dSPaolo Bonzini########################################### 3506ec0e15dSPaolo Bonzini# Target-specific checks and dependencies # 3516ec0e15dSPaolo Bonzini########################################### 3526ec0e15dSPaolo Bonzini 353b7a75c8cSPaolo Bonzini# Fuzzing 354537b7248SPaolo Bonziniif get_option('fuzzing') and get_option('fuzzing_engine') == '' and \ 355537b7248SPaolo Bonzini not cc.links(''' 356537b7248SPaolo Bonzini #include <stdint.h> 357537b7248SPaolo Bonzini #include <sys/types.h> 358537b7248SPaolo Bonzini int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size); 359537b7248SPaolo Bonzini int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { return 0; } 360537b7248SPaolo Bonzini ''', 361537b7248SPaolo Bonzini args: ['-Werror', '-fsanitize=fuzzer']) 362537b7248SPaolo Bonzini error('Your compiler does not support -fsanitize=fuzzer') 363537b7248SPaolo Bonziniendif 364537b7248SPaolo Bonzini 365b7a75c8cSPaolo Bonzini# Tracing backends 3669c29b741SPaolo Bonziniif 'ftrace' in get_option('trace_backends') and targetos != 'linux' 3679c29b741SPaolo Bonzini error('ftrace is supported only on Linux') 3689c29b741SPaolo Bonziniendif 3699c29b741SPaolo Bonziniif 'syslog' in get_option('trace_backends') and not cc.compiles(''' 3709c29b741SPaolo Bonzini #include <syslog.h> 3719c29b741SPaolo Bonzini int main(void) { 3729c29b741SPaolo Bonzini openlog("qemu", LOG_PID, LOG_DAEMON); 3739c29b741SPaolo Bonzini syslog(LOG_INFO, "configure"); 3749c29b741SPaolo Bonzini return 0; 3759c29b741SPaolo Bonzini }''') 3769c29b741SPaolo Bonzini error('syslog is not supported on this system') 3779c29b741SPaolo Bonziniendif 3789c29b741SPaolo Bonzini 379b7a75c8cSPaolo Bonzini# Miscellaneous Linux-only features 380a436d6d4SPaolo Bonziniget_option('mpath') \ 381a436d6d4SPaolo Bonzini .require(targetos == 'linux', error_message: 'Multipath is supported only on Linux') 3826ec0e15dSPaolo Bonzini 383a436d6d4SPaolo Bonzinimultiprocess_allowed = get_option('multiprocess') \ 384a436d6d4SPaolo Bonzini .require(targetos == 'linux', error_message: 'Multiprocess QEMU is supported only on Linux') \ 385a436d6d4SPaolo Bonzini .allowed() 386106ad1f9SPaolo Bonzini 38755116968SJagannathan Ramanvfio_user_server_allowed = get_option('vfio_user_server') \ 38855116968SJagannathan Raman .require(targetos == 'linux', error_message: 'vfio-user server is supported only on Linux') \ 38955116968SJagannathan Raman .allowed() 39055116968SJagannathan Raman 3910d04c4c9SPaolo Bonzinihave_tpm = get_option('tpm') \ 3920d04c4c9SPaolo Bonzini .require(targetos != 'windows', error_message: 'TPM emulation only available on POSIX systems') \ 3930d04c4c9SPaolo Bonzini .allowed() 3940d04c4c9SPaolo Bonzini 3952a3129a3SPaolo Bonzini# vhost 3962df89d54SPaolo Bonzinihave_vhost_user = get_option('vhost_user') \ 3972df89d54SPaolo Bonzini .disable_auto_if(targetos != 'linux') \ 3982df89d54SPaolo Bonzini .require(targetos != 'windows', 3992df89d54SPaolo Bonzini error_message: 'vhost-user is not available on Windows').allowed() 4002df89d54SPaolo Bonzinihave_vhost_vdpa = get_option('vhost_vdpa') \ 4012df89d54SPaolo Bonzini .require(targetos == 'linux', 4022df89d54SPaolo Bonzini error_message: 'vhost-vdpa is only available on Linux').allowed() 4032df89d54SPaolo Bonzinihave_vhost_kernel = get_option('vhost_kernel') \ 4042df89d54SPaolo Bonzini .require(targetos == 'linux', 4052df89d54SPaolo Bonzini error_message: 'vhost-kernel is only available on Linux').allowed() 4062df89d54SPaolo Bonzinihave_vhost_user_crypto = get_option('vhost_crypto') \ 4072df89d54SPaolo Bonzini .require(have_vhost_user, 4082df89d54SPaolo Bonzini error_message: 'vhost-crypto requires vhost-user to be enabled').allowed() 4092df89d54SPaolo Bonzini 41043b6d7eeSPaolo Bonzinihave_vhost = have_vhost_user or have_vhost_vdpa or have_vhost_kernel 4112df89d54SPaolo Bonzini 4122df89d54SPaolo Bonzinihave_vhost_net_user = have_vhost_user and get_option('vhost_net').allowed() 4132df89d54SPaolo Bonzinihave_vhost_net_vdpa = have_vhost_vdpa and get_option('vhost_net').allowed() 4142df89d54SPaolo Bonzinihave_vhost_net_kernel = have_vhost_kernel and get_option('vhost_net').allowed() 4152df89d54SPaolo Bonzinihave_vhost_net = have_vhost_net_kernel or have_vhost_net_user or have_vhost_net_vdpa 4162a3129a3SPaolo Bonzini 417b7a75c8cSPaolo Bonzini# Target-specific libraries and flags 4187fa1c635SPaolo Bonzinilibm = cc.find_library('m', required: false) 4196d7c7c2dSPaolo Bonzinithreads = dependency('threads') 420a81df1b6SPaolo Bonziniutil = cc.find_library('util', required: false) 4214a96337dSPaolo Bonziniwinmm = [] 422a81df1b6SPaolo Bonzinisocket = [] 42304c6f1e7SMarc-André Lureauversion_res = [] 424d92989aaSMarc-André Lureaucoref = [] 425d92989aaSMarc-André Lureauiokit = [] 426b6c7cfd4SPaolo Bonziniemulator_link_args = [] 42774a414a1SReinoud Zandijknvmm =not_found 4288a19980eSPaolo Bonzinihvf = not_found 42923011f44SMarc-André Lureaumidl = not_found 43023011f44SMarc-André Lureauwidl = not_found 431cf60ccc3SAkihiko Odakipathcch = not_found 432a6305081SPaolo Bonzinihost_dsosuf = '.so' 433a81df1b6SPaolo Bonziniif targetos == 'windows' 43423011f44SMarc-André Lureau midl = find_program('midl', required: false) 43523011f44SMarc-André Lureau widl = find_program('widl', required: false) 436cf60ccc3SAkihiko Odaki pathcch = cc.find_library('pathcch') 437a81df1b6SPaolo Bonzini socket = cc.find_library('ws2_32') 4384a96337dSPaolo Bonzini winmm = cc.find_library('winmm') 43904c6f1e7SMarc-André Lureau 44004c6f1e7SMarc-André Lureau win = import('windows') 44104c6f1e7SMarc-André Lureau version_res = win.compile_resources('version.rc', 44204c6f1e7SMarc-André Lureau depend_files: files('pc-bios/qemu-nsis.ico'), 44304c6f1e7SMarc-André Lureau include_directories: include_directories('.')) 444a6305081SPaolo Bonzini host_dsosuf = '.dll' 445d92989aaSMarc-André Lureauelif targetos == 'darwin' 446d92989aaSMarc-André Lureau coref = dependency('appleframeworks', modules: 'CoreFoundation') 44714176c8dSJoelle van Dyne iokit = dependency('appleframeworks', modules: 'IOKit', required: false) 448a6305081SPaolo Bonzini host_dsosuf = '.dylib' 449cfad62f1SPaolo Bonzinielif targetos == 'sunos' 450cfad62f1SPaolo Bonzini socket = [cc.find_library('socket'), 451cfad62f1SPaolo Bonzini cc.find_library('nsl'), 452cfad62f1SPaolo Bonzini cc.find_library('resolv')] 453cfad62f1SPaolo Bonzinielif targetos == 'haiku' 454cfad62f1SPaolo Bonzini socket = [cc.find_library('posix_error_mapper'), 455cfad62f1SPaolo Bonzini cc.find_library('network'), 456cfad62f1SPaolo Bonzini cc.find_library('bsd')] 457b6c7cfd4SPaolo Bonzinielif targetos == 'openbsd' 45843a363aeSPaolo Bonzini if get_option('tcg').allowed() and target_dirs.length() > 0 459b6c7cfd4SPaolo Bonzini # Disable OpenBSD W^X if available 460b6c7cfd4SPaolo Bonzini emulator_link_args = cc.get_supported_link_arguments('-Wl,-z,wxneeded') 461b6c7cfd4SPaolo Bonzini endif 462a81df1b6SPaolo Bonziniendif 4636ec0e15dSPaolo Bonzini 464b7a75c8cSPaolo Bonzini# Target-specific configuration of accelerators 4658a19980eSPaolo Bonziniaccelerators = [] 46643a363aeSPaolo Bonziniif get_option('kvm').allowed() and targetos == 'linux' 4678a19980eSPaolo Bonzini accelerators += 'CONFIG_KVM' 4688a19980eSPaolo Bonziniendif 46943a363aeSPaolo Bonziniif get_option('whpx').allowed() and targetos == 'windows' 47057e2a1f8SSunil Muthuswamy if get_option('whpx').enabled() and host_machine.cpu() != 'x86_64' 4718a19980eSPaolo Bonzini error('WHPX requires 64-bit host') 4728a19980eSPaolo Bonzini elif cc.has_header('WinHvPlatform.h', required: get_option('whpx')) and \ 4738a19980eSPaolo Bonzini cc.has_header('WinHvEmulation.h', required: get_option('whpx')) 4748a19980eSPaolo Bonzini accelerators += 'CONFIG_WHPX' 4758a19980eSPaolo Bonzini endif 4768a19980eSPaolo Bonziniendif 47743a363aeSPaolo Bonziniif get_option('hvf').allowed() 4788a19980eSPaolo Bonzini hvf = dependency('appleframeworks', modules: 'Hypervisor', 4798a19980eSPaolo Bonzini required: get_option('hvf')) 4808a19980eSPaolo Bonzini if hvf.found() 4818a19980eSPaolo Bonzini accelerators += 'CONFIG_HVF' 4828a19980eSPaolo Bonzini endif 4838a19980eSPaolo Bonziniendif 48443a363aeSPaolo Bonziniif get_option('hax').allowed() 4858a19980eSPaolo Bonzini if get_option('hax').enabled() or targetos in ['windows', 'darwin', 'netbsd'] 4868a19980eSPaolo Bonzini accelerators += 'CONFIG_HAX' 4878a19980eSPaolo Bonzini endif 4888a19980eSPaolo Bonziniendif 48974a414a1SReinoud Zandijkif targetos == 'netbsd' 49074a414a1SReinoud Zandijk nvmm = cc.find_library('nvmm', required: get_option('nvmm')) 49174a414a1SReinoud Zandijk if nvmm.found() 49274a414a1SReinoud Zandijk accelerators += 'CONFIG_NVMM' 49374a414a1SReinoud Zandijk endif 49474a414a1SReinoud Zandijkendif 49523a77b2dSPaolo Bonzini 496823eb013SPaolo Bonzinitcg_arch = host_arch 49743a363aeSPaolo Bonziniif get_option('tcg').allowed() 498823eb013SPaolo Bonzini if host_arch == 'unknown' 49923a77b2dSPaolo Bonzini if get_option('tcg_interpreter') 500f1f727acSPhilippe Mathieu-Daudé warning('Unsupported CPU @0@, will use TCG with TCI (slow)'.format(cpu)) 5018a19980eSPaolo Bonzini else 5028a19980eSPaolo Bonzini error('Unsupported CPU @0@, try --enable-tcg-interpreter'.format(cpu)) 5038a19980eSPaolo Bonzini endif 504fa2f7b0bSPhilippe Mathieu-Daudé elif get_option('tcg_interpreter') 5051c282da3SPhilippe Mathieu-Daudé warning('Use of the TCG interpreter is not recommended on this host') 506fa2f7b0bSPhilippe Mathieu-Daudé warning('architecture. There is a native TCG execution backend available') 507fa2f7b0bSPhilippe Mathieu-Daudé warning('which provides substantially better performance and reliability.') 508fa2f7b0bSPhilippe Mathieu-Daudé warning('It is strongly recommended to remove the --enable-tcg-interpreter') 509fa2f7b0bSPhilippe Mathieu-Daudé warning('configuration option on this architecture to use the native') 510fa2f7b0bSPhilippe Mathieu-Daudé warning('backend.') 5118a19980eSPaolo Bonzini endif 51223a77b2dSPaolo Bonzini if get_option('tcg_interpreter') 51323a77b2dSPaolo Bonzini tcg_arch = 'tci' 514ed145144SRichard Henderson config_host += { 'CONFIG_TCG_INTERPRETER': 'y' } 515823eb013SPaolo Bonzini elif host_arch == 'x86_64' 51623a77b2dSPaolo Bonzini tcg_arch = 'i386' 517823eb013SPaolo Bonzini elif host_arch == 'ppc64' 51823a77b2dSPaolo Bonzini tcg_arch = 'ppc' 51923a77b2dSPaolo Bonzini endif 52023a77b2dSPaolo Bonzini add_project_arguments('-iquote', meson.current_source_dir() / 'tcg' / tcg_arch, 521e5134024SPaolo Bonzini language: all_languages) 52223a77b2dSPaolo Bonzini 5238a19980eSPaolo Bonzini accelerators += 'CONFIG_TCG' 5248a19980eSPaolo Bonzini config_host += { 'CONFIG_TCG': 'y' } 5258a19980eSPaolo Bonziniendif 5268a19980eSPaolo Bonzini 5278a19980eSPaolo Bonziniif 'CONFIG_KVM' not in accelerators and get_option('kvm').enabled() 5288a19980eSPaolo Bonzini error('KVM not available on this platform') 5298a19980eSPaolo Bonziniendif 5308a19980eSPaolo Bonziniif 'CONFIG_HVF' not in accelerators and get_option('hvf').enabled() 5318a19980eSPaolo Bonzini error('HVF not available on this platform') 5328a19980eSPaolo Bonziniendif 53374a414a1SReinoud Zandijkif 'CONFIG_NVMM' not in accelerators and get_option('nvmm').enabled() 53474a414a1SReinoud Zandijk error('NVMM not available on this platform') 53574a414a1SReinoud Zandijkendif 5368a19980eSPaolo Bonziniif 'CONFIG_WHPX' not in accelerators and get_option('whpx').enabled() 5378a19980eSPaolo Bonzini error('WHPX not available on this platform') 5388a19980eSPaolo Bonziniendif 539b4e312e9SPaolo Bonzini 5406ec0e15dSPaolo Bonzini################ 5416ec0e15dSPaolo Bonzini# Dependencies # 5426ec0e15dSPaolo Bonzini################ 5436ec0e15dSPaolo Bonzini 544fc9a809eSPaolo Bonzini# When bumping glib minimum version, please check also whether to increase 545fc9a809eSPaolo Bonzini# the _WIN32_WINNT setting in osdep.h according to the value from glib 546fc9a809eSPaolo Bonziniglib_req_ver = '>=2.56.0' 547fc9a809eSPaolo Bonziniglib_pc = dependency('glib-2.0', version: glib_req_ver, required: true, 548fc9a809eSPaolo Bonzini method: 'pkg-config') 549fc9a809eSPaolo Bonziniglib_cflags = [] 5506002711cSPaolo Bonziniif enable_modules 551fc9a809eSPaolo Bonzini gmodule = dependency('gmodule-export-2.0', version: glib_req_ver, required: true, 552fc9a809eSPaolo Bonzini method: 'pkg-config') 553fc9a809eSPaolo Bonzinielif config_host.has_key('CONFIG_PLUGIN') 554fc9a809eSPaolo Bonzini gmodule = dependency('gmodule-no-export-2.0', version: glib_req_ver, required: true, 555fc9a809eSPaolo Bonzini method: 'pkg-config') 556fc9a809eSPaolo Bonzinielse 557fc9a809eSPaolo Bonzini gmodule = not_found 558e3feb2ccSEmilio Cotaendif 559953d5a9eSMarc-André Lureau 560fc9a809eSPaolo Bonzini# This workaround is required due to a bug in pkg-config file for glib as it 561fc9a809eSPaolo Bonzini# doesn't define GLIB_STATIC_COMPILATION for pkg-config --static 562fc9a809eSPaolo Bonziniif targetos == 'windows' and get_option('prefer_static') 563fc9a809eSPaolo Bonzini glib_cflags += ['-DGLIB_STATIC_COMPILATION'] 564fc9a809eSPaolo Bonziniendif 565fc9a809eSPaolo Bonzini 566fc9a809eSPaolo Bonzini# Sanity check that the current size_t matches the 567fc9a809eSPaolo Bonzini# size that glib thinks it should be. This catches 568fc9a809eSPaolo Bonzini# problems on multi-arch where people try to build 569fc9a809eSPaolo Bonzini# 32-bit QEMU while pointing at 64-bit glib headers 570fc9a809eSPaolo Bonzini 571fc9a809eSPaolo Bonziniif not cc.compiles(''' 572fc9a809eSPaolo Bonzini #include <glib.h> 573fc9a809eSPaolo Bonzini #include <unistd.h> 574fc9a809eSPaolo Bonzini 575fc9a809eSPaolo Bonzini #define QEMU_BUILD_BUG_ON(x) \ 576fc9a809eSPaolo Bonzini typedef char qemu_build_bug_on[(x)?-1:1] __attribute__((unused)); 577fc9a809eSPaolo Bonzini 578fc9a809eSPaolo Bonzini int main(void) { 579fc9a809eSPaolo Bonzini QEMU_BUILD_BUG_ON(sizeof(size_t) != GLIB_SIZEOF_SIZE_T); 580fc9a809eSPaolo Bonzini return 0; 581fc9a809eSPaolo Bonzini }''', dependencies: glib_pc, args: glib_cflags) 582fc9a809eSPaolo Bonzini error('''sizeof(size_t) doesn't match GLIB_SIZEOF_SIZE_T. 583fc9a809eSPaolo Bonzini You probably need to set PKG_CONFIG_LIBDIR" to point 584fc9a809eSPaolo Bonzini to the right pkg-config files for your build target.''') 585fc9a809eSPaolo Bonziniendif 586fc9a809eSPaolo Bonzini 587fc9a809eSPaolo Bonzini# Silence clang warnings triggered by glib < 2.57.2 588fc9a809eSPaolo Bonziniif not cc.compiles(''' 589fc9a809eSPaolo Bonzini #include <glib.h> 590fc9a809eSPaolo Bonzini typedef struct Foo { 591fc9a809eSPaolo Bonzini int i; 592fc9a809eSPaolo Bonzini } Foo; 593fc9a809eSPaolo Bonzini static void foo_free(Foo *f) 594fc9a809eSPaolo Bonzini { 595fc9a809eSPaolo Bonzini g_free(f); 596fc9a809eSPaolo Bonzini } 597fc9a809eSPaolo Bonzini G_DEFINE_AUTOPTR_CLEANUP_FUNC(Foo, foo_free) 598fc9a809eSPaolo Bonzini int main(void) { return 0; }''', dependencies: glib_pc, args: ['-Werror']) 599fc9a809eSPaolo Bonzini glib_cflags += cc.get_supported_arguments('-Wno-unused-function') 600fc9a809eSPaolo Bonziniendif 601fc9a809eSPaolo Bonziniglib = declare_dependency(dependencies: [glib_pc, gmodule], 602fc9a809eSPaolo Bonzini compile_args: glib_cflags, 603fc9a809eSPaolo Bonzini version: glib_pc.version()) 604fc9a809eSPaolo Bonzini 605fc9a809eSPaolo Bonzini# Check whether glib has gslice, which we have to avoid for correctness. 606fc9a809eSPaolo Bonzini# TODO: remove this check and the corresponding workaround (qtree) when 607fc9a809eSPaolo Bonzini# the minimum supported glib is >= 2.75.3 608fc9a809eSPaolo Bonziniglib_has_gslice = glib.version().version_compare('<2.75.3') 609fc9a809eSPaolo Bonzini 610fc9a809eSPaolo Bonzini# override glib dep to include the above refinements 611fc9a809eSPaolo Bonzinimeson.override_dependency('glib-2.0', glib) 612fc9a809eSPaolo Bonzini 613fc9a809eSPaolo Bonzini# The path to glib.h is added to all compilation commands. 614fc9a809eSPaolo Bonziniadd_project_dependencies(glib.partial_dependency(compile_args: true, includes: true), 615fc9a809eSPaolo Bonzini native: false, language: all_languages) 616fc9a809eSPaolo Bonzini 617a81df1b6SPaolo Bonzinigio = not_found 6187544060eSPaolo Bonzinigdbus_codegen = not_found 619bb2dc4b7SPaolo Bonzinigdbus_codegen_error = '@0@ requires gdbus-codegen, please install libgio' 6207544060eSPaolo Bonziniif not get_option('gio').auto() or have_system 6217544060eSPaolo Bonzini gio = dependency('gio-2.0', required: get_option('gio'), 622063d5119SPaolo Bonzini method: 'pkg-config') 6237544060eSPaolo Bonzini if gio.found() and not cc.links(''' 6247544060eSPaolo Bonzini #include <gio/gio.h> 6257544060eSPaolo Bonzini int main(void) 6267544060eSPaolo Bonzini { 6277544060eSPaolo Bonzini g_dbus_proxy_new_sync(0, 0, 0, 0, 0, 0, 0, 0); 6287544060eSPaolo Bonzini return 0; 6297544060eSPaolo Bonzini }''', dependencies: [glib, gio]) 6307544060eSPaolo Bonzini if get_option('gio').enabled() 6317544060eSPaolo Bonzini error('The installed libgio is broken for static linking') 632a81df1b6SPaolo Bonzini endif 6337544060eSPaolo Bonzini gio = not_found 6347544060eSPaolo Bonzini endif 6357544060eSPaolo Bonzini if gio.found() 6367544060eSPaolo Bonzini gdbus_codegen = find_program(gio.get_variable('gdbus_codegen'), 6377544060eSPaolo Bonzini required: get_option('gio')) 6387544060eSPaolo Bonzini gio_unix = dependency('gio-unix-2.0', required: get_option('gio'), 639063d5119SPaolo Bonzini method: 'pkg-config') 6407544060eSPaolo Bonzini gio = declare_dependency(dependencies: [gio, gio_unix], 6417544060eSPaolo Bonzini version: gio.version()) 6427544060eSPaolo Bonzini endif 6437544060eSPaolo Bonziniendif 644bb2dc4b7SPaolo Bonziniif gdbus_codegen.found() and get_option('cfi') 645bb2dc4b7SPaolo Bonzini gdbus_codegen = not_found 646bb2dc4b7SPaolo Bonzini gdbus_codegen_error = '@0@ uses gdbus-codegen, which does not support control flow integrity' 647bb2dc4b7SPaolo Bonziniendif 6487544060eSPaolo Bonzini 649a81df1b6SPaolo Bonzinilttng = not_found 6509c29b741SPaolo Bonziniif 'ust' in get_option('trace_backends') 651e32aaa5aSMarc-André Lureau lttng = dependency('lttng-ust', required: true, version: '>= 2.1', 652063d5119SPaolo Bonzini method: 'pkg-config') 653a81df1b6SPaolo Bonziniendif 654b7612f45SPaolo Bonzinipixman = not_found 655b7612f45SPaolo Bonziniif have_system or have_tools 656b7612f45SPaolo Bonzini pixman = dependency('pixman-1', required: have_system, version:'>=0.21.8', 657063d5119SPaolo Bonzini method: 'pkg-config') 658b7612f45SPaolo Bonziniendif 659063d5119SPaolo Bonzinizlib = dependency('zlib', required: true) 66053c22b68SPaolo Bonzini 661ff66f3e5SPaolo Bonzinilibaio = not_found 662ff66f3e5SPaolo Bonziniif not get_option('linux_aio').auto() or have_block 663ff66f3e5SPaolo Bonzini libaio = cc.find_library('aio', has_headers: ['libaio.h'], 664063d5119SPaolo Bonzini required: get_option('linux_aio')) 665ff66f3e5SPaolo Bonziniendif 666354081d4SLeonardo Bras 667354081d4SLeonardo Braslinux_io_uring_test = ''' 668354081d4SLeonardo Bras #include <liburing.h> 669354081d4SLeonardo Bras #include <linux/errqueue.h> 670354081d4SLeonardo Bras 671354081d4SLeonardo Bras int main(void) { return 0; }''' 672354081d4SLeonardo Bras 6735e5733e5SMarc-André Lureaulinux_io_uring = not_found 67453c22b68SPaolo Bonziniif not get_option('linux_io_uring').auto() or have_block 675a41b4fdcSDaniel P. Berrangé linux_io_uring = dependency('liburing', version: '>=0.3', 676a41b4fdcSDaniel P. Berrangé required: get_option('linux_io_uring'), 677063d5119SPaolo Bonzini method: 'pkg-config') 678354081d4SLeonardo Bras if not cc.links(linux_io_uring_test) 679354081d4SLeonardo Bras linux_io_uring = not_found 6805e5733e5SMarc-André Lureau endif 681354081d4SLeonardo Brasendif 682354081d4SLeonardo Bras 6835e5733e5SMarc-André Lureaulibnfs = not_found 68430045c05SPaolo Bonziniif not get_option('libnfs').auto() or have_block 68530045c05SPaolo Bonzini libnfs = dependency('libnfs', version: '>=1.9.3', 68630045c05SPaolo Bonzini required: get_option('libnfs'), 687063d5119SPaolo Bonzini method: 'pkg-config') 6885e5733e5SMarc-André Lureauendif 689f7f2d651SPaolo Bonzini 690f7f2d651SPaolo Bonzinilibattr_test = ''' 691f7f2d651SPaolo Bonzini #include <stddef.h> 692f7f2d651SPaolo Bonzini #include <sys/types.h> 693f7f2d651SPaolo Bonzini #ifdef CONFIG_LIBATTR 694f7f2d651SPaolo Bonzini #include <attr/xattr.h> 695f7f2d651SPaolo Bonzini #else 696f7f2d651SPaolo Bonzini #include <sys/xattr.h> 697f7f2d651SPaolo Bonzini #endif 698f7f2d651SPaolo Bonzini int main(void) { getxattr(NULL, NULL, NULL, 0); setxattr(NULL, NULL, NULL, 0, 0); return 0; }''' 699f7f2d651SPaolo Bonzini 700ec0d5893SMarc-André Lureaulibattr = not_found 701f7f2d651SPaolo Bonzinihave_old_libattr = false 70243a363aeSPaolo Bonziniif get_option('attr').allowed() 703f7f2d651SPaolo Bonzini if cc.links(libattr_test) 704f7f2d651SPaolo Bonzini libattr = declare_dependency() 705f7f2d651SPaolo Bonzini else 706f7f2d651SPaolo Bonzini libattr = cc.find_library('attr', has_headers: ['attr/xattr.h'], 707063d5119SPaolo Bonzini required: get_option('attr')) 708f7f2d651SPaolo Bonzini if libattr.found() and not \ 709f7f2d651SPaolo Bonzini cc.links(libattr_test, dependencies: libattr, args: '-DCONFIG_LIBATTR') 710f7f2d651SPaolo Bonzini libattr = not_found 711f7f2d651SPaolo Bonzini if get_option('attr').enabled() 712f7f2d651SPaolo Bonzini error('could not link libattr') 713f7f2d651SPaolo Bonzini else 714f7f2d651SPaolo Bonzini warning('could not link libattr, disabling') 715ec0d5893SMarc-André Lureau endif 716f7f2d651SPaolo Bonzini else 717f7f2d651SPaolo Bonzini have_old_libattr = libattr.found() 718f7f2d651SPaolo Bonzini endif 719f7f2d651SPaolo Bonzini endif 720f7f2d651SPaolo Bonziniendif 721f7f2d651SPaolo Bonzini 72252eaefd3SAkihiko Odakicocoa = dependency('appleframeworks', modules: ['Cocoa', 'CoreVideo'], 72352eaefd3SAkihiko Odaki required: get_option('cocoa')) 724c1ec4941SPaolo Bonzini 725e2c1d78dSVladislav Yaroshchukvmnet = dependency('appleframeworks', modules: 'vmnet', required: get_option('vmnet')) 726e2c1d78dSVladislav Yaroshchukif vmnet.found() and not cc.has_header_symbol('vmnet/vmnet.h', 727e2c1d78dSVladislav Yaroshchuk 'VMNET_BRIDGED_MODE', 728e2c1d78dSVladislav Yaroshchuk dependencies: vmnet) 729e2c1d78dSVladislav Yaroshchuk vmnet = not_found 730e2c1d78dSVladislav Yaroshchuk if get_option('vmnet').enabled() 731e2c1d78dSVladislav Yaroshchuk error('vmnet.framework API is outdated') 732e2c1d78dSVladislav Yaroshchuk else 733e2c1d78dSVladislav Yaroshchuk warning('vmnet.framework API is outdated, disabling') 734e2c1d78dSVladislav Yaroshchuk endif 735e2c1d78dSVladislav Yaroshchukendif 736e2c1d78dSVladislav Yaroshchuk 7373f99cf57SPaolo Bonziniseccomp = not_found 73873422d95SMichal Privoznikseccomp_has_sysrawrc = false 73990835c2bSPaolo Bonziniif not get_option('seccomp').auto() or have_system or have_tools 74090835c2bSPaolo Bonzini seccomp = dependency('libseccomp', version: '>=2.3.0', 74190835c2bSPaolo Bonzini required: get_option('seccomp'), 742063d5119SPaolo Bonzini method: 'pkg-config') 74373422d95SMichal Privoznik if seccomp.found() 74473422d95SMichal Privoznik seccomp_has_sysrawrc = cc.has_header_symbol('seccomp.h', 74573422d95SMichal Privoznik 'SCMP_FLTATR_API_SYSRAWRC', 74673422d95SMichal Privoznik dependencies: seccomp) 74773422d95SMichal Privoznik endif 7483f99cf57SPaolo Bonziniendif 749727c8bb8SPaolo Bonzini 7503f99cf57SPaolo Bonzinilibcap_ng = not_found 751727c8bb8SPaolo Bonziniif not get_option('cap_ng').auto() or have_system or have_tools 752727c8bb8SPaolo Bonzini libcap_ng = cc.find_library('cap-ng', has_headers: ['cap-ng.h'], 753063d5119SPaolo Bonzini required: get_option('cap_ng')) 7543f99cf57SPaolo Bonziniendif 755727c8bb8SPaolo Bonziniif libcap_ng.found() and not cc.links(''' 756727c8bb8SPaolo Bonzini #include <cap-ng.h> 757727c8bb8SPaolo Bonzini int main(void) 758727c8bb8SPaolo Bonzini { 759727c8bb8SPaolo Bonzini capng_capability_to_name(CAPNG_EFFECTIVE); 760727c8bb8SPaolo Bonzini return 0; 761727c8bb8SPaolo Bonzini }''', dependencies: libcap_ng) 762727c8bb8SPaolo Bonzini libcap_ng = not_found 763727c8bb8SPaolo Bonzini if get_option('cap_ng').enabled() 764727c8bb8SPaolo Bonzini error('could not link libcap-ng') 765727c8bb8SPaolo Bonzini else 766727c8bb8SPaolo Bonzini warning('could not link libcap-ng, disabling') 767727c8bb8SPaolo Bonzini endif 768727c8bb8SPaolo Bonziniendif 769727c8bb8SPaolo Bonzini 7701917ec6dSPaolo Bonziniif get_option('xkbcommon').auto() and not have_system and not have_tools 7711917ec6dSPaolo Bonzini xkbcommon = not_found 7721917ec6dSPaolo Bonzinielse 7731917ec6dSPaolo Bonzini xkbcommon = dependency('xkbcommon', required: get_option('xkbcommon'), 774063d5119SPaolo Bonzini method: 'pkg-config') 775ade60d4fSMarc-André Lureauendif 776e1723999SPaolo Bonzini 7775890258aSThomas Huthslirp = not_found 7785890258aSThomas Huthif not get_option('slirp').auto() or have_system 7795890258aSThomas Huth slirp = dependency('slirp', required: get_option('slirp'), 780063d5119SPaolo Bonzini method: 'pkg-config') 7815890258aSThomas Huth # slirp < 4.7 is incompatible with CFI support in QEMU. This is because 7825890258aSThomas Huth # it passes function pointers within libslirp as callbacks for timers. 7835890258aSThomas Huth # When using a system-wide shared libslirp, the type information for the 7845890258aSThomas Huth # callback is missing and the timer call produces a false positive with CFI. 7855890258aSThomas Huth # Do not use the "version" keyword argument to produce a better error. 7865890258aSThomas Huth # with control-flow integrity. 7875890258aSThomas Huth if get_option('cfi') and slirp.found() and slirp.version().version_compare('<4.7') 7885890258aSThomas Huth if get_option('slirp').enabled() 7895890258aSThomas Huth error('Control-Flow Integrity requires libslirp 4.7.') 7905890258aSThomas Huth else 7915890258aSThomas Huth warning('Cannot use libslirp since Control-Flow Integrity requires libslirp >= 4.7.') 7925890258aSThomas Huth slirp = not_found 7935890258aSThomas Huth endif 7945890258aSThomas Huth endif 7955890258aSThomas Huthendif 7965890258aSThomas Huth 797cdaf0722SMarc-André Lureauvde = not_found 798e1723999SPaolo Bonziniif not get_option('vde').auto() or have_system or have_tools 799e1723999SPaolo Bonzini vde = cc.find_library('vdeplug', has_headers: ['libvdeplug.h'], 800063d5119SPaolo Bonzini required: get_option('vde')) 801e1723999SPaolo Bonziniendif 802e1723999SPaolo Bonziniif vde.found() and not cc.links(''' 803e1723999SPaolo Bonzini #include <libvdeplug.h> 804e1723999SPaolo Bonzini int main(void) 805e1723999SPaolo Bonzini { 806e1723999SPaolo Bonzini struct vde_open_args a = {0, 0, 0}; 807e1723999SPaolo Bonzini char s[] = ""; 808e1723999SPaolo Bonzini vde_open(s, s, &a); 809e1723999SPaolo Bonzini return 0; 810e1723999SPaolo Bonzini }''', dependencies: vde) 811e1723999SPaolo Bonzini vde = not_found 812e1723999SPaolo Bonzini if get_option('cap_ng').enabled() 813e1723999SPaolo Bonzini error('could not link libvdeplug') 814e1723999SPaolo Bonzini else 815e1723999SPaolo Bonzini warning('could not link libvdeplug, disabling') 816e1723999SPaolo Bonzini endif 817cdaf0722SMarc-André Lureauendif 81887430d5bSPaolo Bonzini 819478e943fSPaolo Bonzinipulse = not_found 82087430d5bSPaolo Bonziniif not get_option('pa').auto() or (targetos == 'linux' and have_system) 82187430d5bSPaolo Bonzini pulse = dependency('libpulse', required: get_option('pa'), 822063d5119SPaolo Bonzini method: 'pkg-config') 823478e943fSPaolo Bonziniendif 824478e943fSPaolo Bonzinialsa = not_found 82587430d5bSPaolo Bonziniif not get_option('alsa').auto() or (targetos == 'linux' and have_system) 82687430d5bSPaolo Bonzini alsa = dependency('alsa', required: get_option('alsa'), 827063d5119SPaolo Bonzini method: 'pkg-config') 828478e943fSPaolo Bonziniendif 829478e943fSPaolo Bonzinijack = not_found 83087430d5bSPaolo Bonziniif not get_option('jack').auto() or have_system 83187430d5bSPaolo Bonzini jack = dependency('jack', required: get_option('jack'), 832063d5119SPaolo Bonzini method: 'pkg-config') 833478e943fSPaolo Bonziniendif 834c2d3d1c2SDorinda Basseypipewire = not_found 835c2d3d1c2SDorinda Basseyif not get_option('pipewire').auto() or (targetos == 'linux' and have_system) 836c2d3d1c2SDorinda Bassey pipewire = dependency('libpipewire-0.3', version: '>=0.3.60', 837c2d3d1c2SDorinda Bassey required: get_option('pipewire'), 838063d5119SPaolo Bonzini method: 'pkg-config') 839c2d3d1c2SDorinda Basseyendif 840663df1ccSAlexandre Ratchovsndio = not_found 841663df1ccSAlexandre Ratchovif not get_option('sndio').auto() or have_system 842663df1ccSAlexandre Ratchov sndio = dependency('sndio', required: get_option('sndio'), 843063d5119SPaolo Bonzini method: 'pkg-config') 844663df1ccSAlexandre Ratchovendif 84587430d5bSPaolo Bonzini 84658d3f3ffSGerd Hoffmannspice_protocol = not_found 8473f0a5d55SMarc-André Lureauif not get_option('spice_protocol').auto() or have_system 8485c167b53SMarkus Armbruster spice_protocol = dependency('spice-protocol', version: '>=0.14.0', 8493f0a5d55SMarc-André Lureau required: get_option('spice_protocol'), 850063d5119SPaolo Bonzini method: 'pkg-config') 8512634733cSPaolo Bonziniendif 8523f0a5d55SMarc-André Lureauspice = not_found 8533f0a5d55SMarc-André Lureauif not get_option('spice').auto() or have_system 85434d55725SMarkus Armbruster spice = dependency('spice-server', version: '>=0.14.0', 8553f0a5d55SMarc-André Lureau required: get_option('spice'), 856063d5119SPaolo Bonzini method: 'pkg-config') 85758d3f3ffSGerd Hoffmannendif 8583f0a5d55SMarc-André Lureauspice_headers = spice.partial_dependency(compile_args: true, includes: true) 8593f0a5d55SMarc-André Lureau 8605ee24e78SMarc-André Lureaurt = cc.find_library('rt', required: false) 861a399f914SPaolo Bonzini 86299650b62SPaolo Bonzinilibiscsi = not_found 8639db405a3SPaolo Bonziniif not get_option('libiscsi').auto() or have_block 8649db405a3SPaolo Bonzini libiscsi = dependency('libiscsi', version: '>=1.9.0', 8659db405a3SPaolo Bonzini required: get_option('libiscsi'), 866063d5119SPaolo Bonzini method: 'pkg-config') 86799650b62SPaolo Bonziniendif 8685e5733e5SMarc-André Lureauzstd = not_found 869b1def33dSPaolo Bonziniif not get_option('zstd').auto() or have_block 870b1def33dSPaolo Bonzini zstd = dependency('libzstd', version: '>=1.4.0', 871b1def33dSPaolo Bonzini required: get_option('zstd'), 872063d5119SPaolo Bonzini method: 'pkg-config') 8735e5733e5SMarc-André Lureauendif 874ea458960SMarc-André Lureauvirgl = not_found 8750265fe9eSPaolo Bonzini 8760265fe9eSPaolo Bonzinihave_vhost_user_gpu = have_tools and targetos == 'linux' and pixman.found() 8770265fe9eSPaolo Bonziniif not get_option('virglrenderer').auto() or have_system or have_vhost_user_gpu 878587d59d6SPaolo Bonzini virgl = dependency('virglrenderer', 879587d59d6SPaolo Bonzini method: 'pkg-config', 880063d5119SPaolo Bonzini required: get_option('virglrenderer')) 881ea458960SMarc-André Lureauendif 882fd66dbd4SStefan Hajnocziblkio = not_found 883fd66dbd4SStefan Hajnocziif not get_option('blkio').auto() or have_block 884fd66dbd4SStefan Hajnoczi blkio = dependency('blkio', 885fd66dbd4SStefan Hajnoczi method: 'pkg-config', 886063d5119SPaolo Bonzini required: get_option('blkio')) 887fd66dbd4SStefan Hajnocziendif 8881d7bb6abSMarc-André Lureaucurl = not_found 889f9cd86feSPaolo Bonziniif not get_option('curl').auto() or have_block 890f9cd86feSPaolo Bonzini curl = dependency('libcurl', version: '>=7.29.0', 891f9cd86feSPaolo Bonzini method: 'pkg-config', 892063d5119SPaolo Bonzini required: get_option('curl')) 8931d7bb6abSMarc-André Lureauendif 894f15bff25SPaolo Bonzinilibudev = not_found 895f01496a3SPaolo Bonziniif targetos == 'linux' and (have_system or have_tools) 8966ec0e15dSPaolo Bonzini libudev = dependency('libudev', 897a0fbbb6eSPaolo Bonzini method: 'pkg-config', 898063d5119SPaolo Bonzini required: get_option('libudev')) 899f15bff25SPaolo Bonziniendif 9006ec0e15dSPaolo Bonzini 9015c53015aSPaolo Bonzinimpathlibs = [libudev] 9026ec0e15dSPaolo Bonzinimpathpersist = not_found 9036ec0e15dSPaolo Bonzinimpathpersist_new_api = false 90443a363aeSPaolo Bonziniif targetos == 'linux' and have_tools and get_option('mpath').allowed() 9056ec0e15dSPaolo Bonzini mpath_test_source_new = ''' 9066ec0e15dSPaolo Bonzini #include <libudev.h> 9076ec0e15dSPaolo Bonzini #include <mpath_persist.h> 9086ec0e15dSPaolo Bonzini unsigned mpath_mx_alloc_len = 1024; 9096ec0e15dSPaolo Bonzini int logsink; 9106ec0e15dSPaolo Bonzini static struct config *multipath_conf; 9116ec0e15dSPaolo Bonzini extern struct udev *udev; 9126ec0e15dSPaolo Bonzini extern struct config *get_multipath_config(void); 9136ec0e15dSPaolo Bonzini extern void put_multipath_config(struct config *conf); 9146ec0e15dSPaolo Bonzini struct udev *udev; 9156ec0e15dSPaolo Bonzini struct config *get_multipath_config(void) { return multipath_conf; } 9166ec0e15dSPaolo Bonzini void put_multipath_config(struct config *conf) { } 9176ec0e15dSPaolo Bonzini int main(void) { 9186ec0e15dSPaolo Bonzini udev = udev_new(); 9196ec0e15dSPaolo Bonzini multipath_conf = mpath_lib_init(); 9206ec0e15dSPaolo Bonzini return 0; 9216ec0e15dSPaolo Bonzini }''' 9226ec0e15dSPaolo Bonzini mpath_test_source_old = ''' 9236ec0e15dSPaolo Bonzini #include <libudev.h> 9246ec0e15dSPaolo Bonzini #include <mpath_persist.h> 9256ec0e15dSPaolo Bonzini unsigned mpath_mx_alloc_len = 1024; 9266ec0e15dSPaolo Bonzini int logsink; 9276ec0e15dSPaolo Bonzini int main(void) { 9286ec0e15dSPaolo Bonzini struct udev *udev = udev_new(); 9296ec0e15dSPaolo Bonzini mpath_lib_init(udev); 9306ec0e15dSPaolo Bonzini return 0; 9316ec0e15dSPaolo Bonzini }''' 9325c53015aSPaolo Bonzini libmpathpersist = cc.find_library('mpathpersist', 933063d5119SPaolo Bonzini required: get_option('mpath')) 9345c53015aSPaolo Bonzini if libmpathpersist.found() 9355c53015aSPaolo Bonzini mpathlibs += libmpathpersist 936a0cbd2e8SPaolo Bonzini if get_option('prefer_static') 93743b43a40SPaolo Bonzini mpathlibs += cc.find_library('devmapper', 938063d5119SPaolo Bonzini required: get_option('mpath')) 93943b43a40SPaolo Bonzini endif 94043b43a40SPaolo Bonzini mpathlibs += cc.find_library('multipath', 941063d5119SPaolo Bonzini required: get_option('mpath')) 94243b43a40SPaolo Bonzini foreach lib: mpathlibs 94343b43a40SPaolo Bonzini if not lib.found() 94443b43a40SPaolo Bonzini mpathlibs = [] 94543b43a40SPaolo Bonzini break 94643b43a40SPaolo Bonzini endif 94743b43a40SPaolo Bonzini endforeach 9485c53015aSPaolo Bonzini if mpathlibs.length() == 0 9495c53015aSPaolo Bonzini msg = 'Dependencies missing for libmpathpersist' 9505c53015aSPaolo Bonzini elif cc.links(mpath_test_source_new, dependencies: mpathlibs) 9516ec0e15dSPaolo Bonzini mpathpersist = declare_dependency(dependencies: mpathlibs) 9526ec0e15dSPaolo Bonzini mpathpersist_new_api = true 9536ec0e15dSPaolo Bonzini elif cc.links(mpath_test_source_old, dependencies: mpathlibs) 9546ec0e15dSPaolo Bonzini mpathpersist = declare_dependency(dependencies: mpathlibs) 9556ec0e15dSPaolo Bonzini else 9565c53015aSPaolo Bonzini msg = 'Cannot detect libmpathpersist API' 9575c53015aSPaolo Bonzini endif 9585c53015aSPaolo Bonzini if not mpathpersist.found() 9596ec0e15dSPaolo Bonzini if get_option('mpath').enabled() 9605c53015aSPaolo Bonzini error(msg) 9616ec0e15dSPaolo Bonzini else 9625c53015aSPaolo Bonzini warning(msg + ', disabling') 9636ec0e15dSPaolo Bonzini endif 9646ec0e15dSPaolo Bonzini endif 9656ec0e15dSPaolo Bonzini endif 9666ec0e15dSPaolo Bonziniendif 9676ec0e15dSPaolo Bonzini 9685285e593SYonggang Luoiconv = not_found 96930fe76b1SPaolo Bonzinicurses = not_found 97043a363aeSPaolo Bonziniif have_system and get_option('curses').allowed() 9715285e593SYonggang Luo curses_test = ''' 972fbab8cc2SStefan Weil #if defined(__APPLE__) || defined(__OpenBSD__) 973fbab8cc2SStefan Weil #define _XOPEN_SOURCE_EXTENDED 1 974fbab8cc2SStefan Weil #endif 9755285e593SYonggang Luo #include <locale.h> 9765285e593SYonggang Luo #include <curses.h> 9775285e593SYonggang Luo #include <wchar.h> 9785285e593SYonggang Luo int main(void) { 9795285e593SYonggang Luo wchar_t wch = L'w'; 9805285e593SYonggang Luo setlocale(LC_ALL, ""); 9815285e593SYonggang Luo resize_term(0, 0); 9825285e593SYonggang Luo addwstr(L"wide chars\n"); 9835285e593SYonggang Luo addnwstr(&wch, 1); 9845285e593SYonggang Luo add_wch(WACS_DEGREE); 9855285e593SYonggang Luo return 0; 9865285e593SYonggang Luo }''' 987925a40dfSPaolo Bonzini 988ca31e307SYonggang Luo curses_dep_list = targetos == 'windows' ? ['ncurses', 'ncursesw'] : ['ncursesw'] 9896d322635SPaolo Bonzini curses = dependency(curses_dep_list, 9905285e593SYonggang Luo required: false, 991063d5119SPaolo Bonzini method: 'pkg-config') 992925a40dfSPaolo Bonzini msg = get_option('curses').enabled() ? 'curses library not found' : '' 993fbab8cc2SStefan Weil curses_compile_args = ['-DNCURSES_WIDECHAR=1'] 994925a40dfSPaolo Bonzini if curses.found() 9950dbce6efSPaolo Bonzini if cc.links(curses_test, args: curses_compile_args, dependencies: [curses]) 996bd3615d6SPaolo Bonzini curses = declare_dependency(compile_args: curses_compile_args, dependencies: [curses], 997bd3615d6SPaolo Bonzini version: curses.version()) 998925a40dfSPaolo Bonzini else 999925a40dfSPaolo Bonzini msg = 'curses package not usable' 1000925a40dfSPaolo Bonzini curses = not_found 10015285e593SYonggang Luo endif 1002925a40dfSPaolo Bonzini endif 1003925a40dfSPaolo Bonzini if not curses.found() 1004925a40dfSPaolo Bonzini has_curses_h = cc.has_header('curses.h', args: curses_compile_args) 1005925a40dfSPaolo Bonzini if targetos != 'windows' and not has_curses_h 1006925a40dfSPaolo Bonzini message('Trying with /usr/include/ncursesw') 1007925a40dfSPaolo Bonzini curses_compile_args += ['-I/usr/include/ncursesw'] 1008925a40dfSPaolo Bonzini has_curses_h = cc.has_header('curses.h', args: curses_compile_args) 1009925a40dfSPaolo Bonzini endif 1010925a40dfSPaolo Bonzini if has_curses_h 1011925a40dfSPaolo Bonzini curses_libname_list = (targetos == 'windows' ? ['pdcurses'] : ['ncursesw', 'cursesw']) 1012925a40dfSPaolo Bonzini foreach curses_libname : curses_libname_list 10135285e593SYonggang Luo libcurses = cc.find_library(curses_libname, 1014063d5119SPaolo Bonzini required: false) 10155285e593SYonggang Luo if libcurses.found() 1016925a40dfSPaolo Bonzini if cc.links(curses_test, args: curses_compile_args, dependencies: libcurses) 1017925a40dfSPaolo Bonzini curses = declare_dependency(compile_args: curses_compile_args, 1018925a40dfSPaolo Bonzini dependencies: [libcurses]) 10195285e593SYonggang Luo break 1020925a40dfSPaolo Bonzini else 1021925a40dfSPaolo Bonzini msg = 'curses library not usable' 10225285e593SYonggang Luo endif 10235285e593SYonggang Luo endif 10245285e593SYonggang Luo endforeach 10255285e593SYonggang Luo endif 102630fe76b1SPaolo Bonzini endif 102743a363aeSPaolo Bonzini if get_option('iconv').allowed() 1028925a40dfSPaolo Bonzini foreach link_args : [ ['-liconv'], [] ] 1029925a40dfSPaolo Bonzini # Programs will be linked with glib and this will bring in libiconv on FreeBSD. 1030925a40dfSPaolo Bonzini # We need to use libiconv if available because mixing libiconv's headers with 1031925a40dfSPaolo Bonzini # the system libc does not work. 1032925a40dfSPaolo Bonzini # However, without adding glib to the dependencies -L/usr/local/lib will not be 1033925a40dfSPaolo Bonzini # included in the command line and libiconv will not be found. 1034925a40dfSPaolo Bonzini if cc.links(''' 1035925a40dfSPaolo Bonzini #include <iconv.h> 1036925a40dfSPaolo Bonzini int main(void) { 1037925a40dfSPaolo Bonzini iconv_t conv = iconv_open("WCHAR_T", "UCS-2"); 1038925a40dfSPaolo Bonzini return conv != (iconv_t) -1; 1039fc9a809eSPaolo Bonzini }''', args: link_args, dependencies: glib) 1040925a40dfSPaolo Bonzini iconv = declare_dependency(link_args: link_args, dependencies: glib) 1041925a40dfSPaolo Bonzini break 1042925a40dfSPaolo Bonzini endif 1043925a40dfSPaolo Bonzini endforeach 1044925a40dfSPaolo Bonzini endif 1045925a40dfSPaolo Bonzini if curses.found() and not iconv.found() 1046925a40dfSPaolo Bonzini if get_option('iconv').enabled() 1047925a40dfSPaolo Bonzini error('iconv not available') 1048925a40dfSPaolo Bonzini endif 1049925a40dfSPaolo Bonzini msg = 'iconv required for curses UI but not available' 1050925a40dfSPaolo Bonzini curses = not_found 1051925a40dfSPaolo Bonzini endif 1052925a40dfSPaolo Bonzini if not curses.found() and msg != '' 1053925a40dfSPaolo Bonzini if get_option('curses').enabled() 1054925a40dfSPaolo Bonzini error(msg) 10555285e593SYonggang Luo else 1056925a40dfSPaolo Bonzini warning(msg + ', disabling') 105730fe76b1SPaolo Bonzini endif 10585285e593SYonggang Luo endif 10595285e593SYonggang Luoendif 10605285e593SYonggang Luo 10612634733cSPaolo Bonzinibrlapi = not_found 10628c6d4ff4SPaolo Bonziniif not get_option('brlapi').auto() or have_system 10638c6d4ff4SPaolo Bonzini brlapi = cc.find_library('brlapi', has_headers: ['brlapi.h'], 1064063d5119SPaolo Bonzini required: get_option('brlapi')) 10658c6d4ff4SPaolo Bonzini if brlapi.found() and not cc.links(''' 10668c6d4ff4SPaolo Bonzini #include <brlapi.h> 10678c6d4ff4SPaolo Bonzini #include <stddef.h> 10688c6d4ff4SPaolo Bonzini int main(void) { return brlapi__openConnection (NULL, NULL, NULL); }''', dependencies: brlapi) 10698c6d4ff4SPaolo Bonzini brlapi = not_found 10708c6d4ff4SPaolo Bonzini if get_option('brlapi').enabled() 10718c6d4ff4SPaolo Bonzini error('could not link brlapi') 10728c6d4ff4SPaolo Bonzini else 10738c6d4ff4SPaolo Bonzini warning('could not link brlapi, disabling') 10748c6d4ff4SPaolo Bonzini endif 10758c6d4ff4SPaolo Bonzini endif 10762634733cSPaolo Bonziniendif 107735be72baSPaolo Bonzini 1078760e4327SPaolo Bonzinisdl = not_found 107964d3fec7SAkihiko Odakiif not get_option('sdl').auto() or have_system 1080063d5119SPaolo Bonzini sdl = dependency('sdl2', required: get_option('sdl')) 108135be72baSPaolo Bonzini sdl_image = not_found 1082760e4327SPaolo Bonziniendif 108335be72baSPaolo Bonziniif sdl.found() 108435be72baSPaolo Bonzini # work around 2.0.8 bug 108535be72baSPaolo Bonzini sdl = declare_dependency(compile_args: '-Wno-undef', 1086bd3615d6SPaolo Bonzini dependencies: sdl, 1087bd3615d6SPaolo Bonzini version: sdl.version()) 10887161a433SVolker Rümelin sdl_image = dependency('SDL2_image', required: get_option('sdl_image'), 1089063d5119SPaolo Bonzini method: 'pkg-config') 109035be72baSPaolo Bonzinielse 109135be72baSPaolo Bonzini if get_option('sdl_image').enabled() 1092a8dc2aceSSergei Trofimovich error('sdl-image required, but SDL was @0@'.format( 1093a8dc2aceSSergei Trofimovich get_option('sdl').disabled() ? 'disabled' : 'not found')) 10942634733cSPaolo Bonzini endif 109535be72baSPaolo Bonzini sdl_image = not_found 109635be72baSPaolo Bonziniendif 109735be72baSPaolo Bonzini 10985e5733e5SMarc-André Lureaurbd = not_found 1099fabd1e93SPaolo Bonziniif not get_option('rbd').auto() or have_block 1100063d5119SPaolo Bonzini librados = cc.find_library('rados', required: get_option('rbd')) 1101fabd1e93SPaolo Bonzini librbd = cc.find_library('rbd', has_headers: ['rbd/librbd.h'], 1102063d5119SPaolo Bonzini required: get_option('rbd')) 1103c518d6c2SPaolo Bonzini if librados.found() and librbd.found() 1104c518d6c2SPaolo Bonzini if cc.links(''' 1105fabd1e93SPaolo Bonzini #include <stdio.h> 1106fabd1e93SPaolo Bonzini #include <rbd/librbd.h> 1107fabd1e93SPaolo Bonzini int main(void) { 1108fabd1e93SPaolo Bonzini rados_t cluster; 1109fabd1e93SPaolo Bonzini rados_create(&cluster, NULL); 111048672ac0SPeter Lieven #if LIBRBD_VERSION_CODE < LIBRBD_VERSION(1, 12, 0) 111148672ac0SPeter Lieven #error 111248672ac0SPeter Lieven #endif 1113fabd1e93SPaolo Bonzini return 0; 1114fabd1e93SPaolo Bonzini }''', dependencies: [librbd, librados]) 1115fabd1e93SPaolo Bonzini rbd = declare_dependency(dependencies: [librbd, librados]) 1116c518d6c2SPaolo Bonzini elif get_option('rbd').enabled() 111748672ac0SPeter Lieven error('librbd >= 1.12.0 required') 1118c518d6c2SPaolo Bonzini else 111948672ac0SPeter Lieven warning('librbd >= 1.12.0 not found, disabling') 1120c518d6c2SPaolo Bonzini endif 11215e5733e5SMarc-André Lureau endif 1122fabd1e93SPaolo Bonziniendif 1123fabd1e93SPaolo Bonzini 11245e5733e5SMarc-André Lureauglusterfs = not_found 112508821ca2SPaolo Bonziniglusterfs_ftruncate_has_stat = false 112608821ca2SPaolo Bonziniglusterfs_iocb_has_stat = false 112708821ca2SPaolo Bonziniif not get_option('glusterfs').auto() or have_block 112808821ca2SPaolo Bonzini glusterfs = dependency('glusterfs-api', version: '>=3', 112908821ca2SPaolo Bonzini required: get_option('glusterfs'), 1130063d5119SPaolo Bonzini method: 'pkg-config') 113108821ca2SPaolo Bonzini if glusterfs.found() 113208821ca2SPaolo Bonzini glusterfs_ftruncate_has_stat = cc.links(''' 113308821ca2SPaolo Bonzini #include <glusterfs/api/glfs.h> 113408821ca2SPaolo Bonzini 113508821ca2SPaolo Bonzini int 113608821ca2SPaolo Bonzini main(void) 113708821ca2SPaolo Bonzini { 113808821ca2SPaolo Bonzini /* new glfs_ftruncate() passes two additional args */ 113908821ca2SPaolo Bonzini return glfs_ftruncate(NULL, 0, NULL, NULL); 114008821ca2SPaolo Bonzini } 114108821ca2SPaolo Bonzini ''', dependencies: glusterfs) 114208821ca2SPaolo Bonzini glusterfs_iocb_has_stat = cc.links(''' 114308821ca2SPaolo Bonzini #include <glusterfs/api/glfs.h> 114408821ca2SPaolo Bonzini 114508821ca2SPaolo Bonzini /* new glfs_io_cbk() passes two additional glfs_stat structs */ 114608821ca2SPaolo Bonzini static void 114708821ca2SPaolo Bonzini glusterfs_iocb(glfs_fd_t *fd, ssize_t ret, struct glfs_stat *prestat, struct glfs_stat *poststat, void *data) 114808821ca2SPaolo Bonzini {} 114908821ca2SPaolo Bonzini 115008821ca2SPaolo Bonzini int 115108821ca2SPaolo Bonzini main(void) 115208821ca2SPaolo Bonzini { 115308821ca2SPaolo Bonzini glfs_io_cbk iocb = &glusterfs_iocb; 115408821ca2SPaolo Bonzini iocb(NULL, 0 , NULL, NULL, NULL); 115508821ca2SPaolo Bonzini return 0; 115608821ca2SPaolo Bonzini } 115708821ca2SPaolo Bonzini ''', dependencies: glusterfs) 115808821ca2SPaolo Bonzini endif 11595e5733e5SMarc-André Lureauendif 1160e6a52b36SThomas Huth 11615e5733e5SMarc-André Lureaulibssh = not_found 1162e6a52b36SThomas Huthif not get_option('libssh').auto() or have_block 1163e6a52b36SThomas Huth libssh = dependency('libssh', version: '>=0.8.7', 1164e6a52b36SThomas Huth method: 'pkg-config', 1165063d5119SPaolo Bonzini required: get_option('libssh')) 11665e5733e5SMarc-André Lureauendif 1167e6a52b36SThomas Huth 11685e5733e5SMarc-André Lureaulibbzip2 = not_found 116929ba6116SPaolo Bonziniif not get_option('bzip2').auto() or have_block 117029ba6116SPaolo Bonzini libbzip2 = cc.find_library('bz2', has_headers: ['bzlib.h'], 1171063d5119SPaolo Bonzini required: get_option('bzip2')) 117229ba6116SPaolo Bonzini if libbzip2.found() and not cc.links(''' 117329ba6116SPaolo Bonzini #include <bzlib.h> 117429ba6116SPaolo Bonzini int main(void) { BZ2_bzlibVersion(); return 0; }''', dependencies: libbzip2) 117529ba6116SPaolo Bonzini libbzip2 = not_found 117629ba6116SPaolo Bonzini if get_option('bzip2').enabled() 117729ba6116SPaolo Bonzini error('could not link libbzip2') 117829ba6116SPaolo Bonzini else 117929ba6116SPaolo Bonzini warning('could not link libbzip2, disabling') 11805e5733e5SMarc-André Lureau endif 118129ba6116SPaolo Bonzini endif 11825e5733e5SMarc-André Lureauendif 1183ecea3696SPaolo Bonzini 11845e5733e5SMarc-André Lureauliblzfse = not_found 1185ecea3696SPaolo Bonziniif not get_option('lzfse').auto() or have_block 1186ecea3696SPaolo Bonzini liblzfse = cc.find_library('lzfse', has_headers: ['lzfse.h'], 1187063d5119SPaolo Bonzini required: get_option('lzfse')) 11885e5733e5SMarc-André Lureauendif 1189ecea3696SPaolo Bonziniif liblzfse.found() and not cc.links(''' 1190ecea3696SPaolo Bonzini #include <lzfse.h> 1191ecea3696SPaolo Bonzini int main(void) { lzfse_decode_scratch_size(); return 0; }''', dependencies: liblzfse) 1192ecea3696SPaolo Bonzini liblzfse = not_found 1193ecea3696SPaolo Bonzini if get_option('lzfse').enabled() 1194ecea3696SPaolo Bonzini error('could not link liblzfse') 1195ecea3696SPaolo Bonzini else 1196ecea3696SPaolo Bonzini warning('could not link liblzfse, disabling') 1197ecea3696SPaolo Bonzini endif 1198ecea3696SPaolo Bonziniendif 1199ecea3696SPaolo Bonzini 1200478e943fSPaolo Bonzinioss = not_found 120143a363aeSPaolo Bonziniif get_option('oss').allowed() and have_system 120287430d5bSPaolo Bonzini if not cc.has_header('sys/soundcard.h') 120387430d5bSPaolo Bonzini # not found 120487430d5bSPaolo Bonzini elif targetos == 'netbsd' 1205063d5119SPaolo Bonzini oss = cc.find_library('ossaudio', required: get_option('oss')) 120687430d5bSPaolo Bonzini else 120787430d5bSPaolo Bonzini oss = declare_dependency() 120887430d5bSPaolo Bonzini endif 120987430d5bSPaolo Bonzini 121087430d5bSPaolo Bonzini if not oss.found() 121187430d5bSPaolo Bonzini if get_option('oss').enabled() 121287430d5bSPaolo Bonzini error('OSS not found') 121387430d5bSPaolo Bonzini endif 121487430d5bSPaolo Bonzini endif 1215478e943fSPaolo Bonziniendif 1216478e943fSPaolo Bonzinidsound = not_found 121787430d5bSPaolo Bonziniif not get_option('dsound').auto() or (targetos == 'windows' and have_system) 121887430d5bSPaolo Bonzini if cc.has_header('dsound.h') 121987430d5bSPaolo Bonzini dsound = declare_dependency(link_args: ['-lole32', '-ldxguid']) 1220478e943fSPaolo Bonzini endif 122187430d5bSPaolo Bonzini 122287430d5bSPaolo Bonzini if not dsound.found() 122387430d5bSPaolo Bonzini if get_option('dsound').enabled() 122487430d5bSPaolo Bonzini error('DirectSound not found') 122587430d5bSPaolo Bonzini endif 122687430d5bSPaolo Bonzini endif 122787430d5bSPaolo Bonziniendif 122887430d5bSPaolo Bonzini 1229478e943fSPaolo Bonzinicoreaudio = not_found 123087430d5bSPaolo Bonziniif not get_option('coreaudio').auto() or (targetos == 'darwin' and have_system) 123187430d5bSPaolo Bonzini coreaudio = dependency('appleframeworks', modules: 'CoreAudio', 123287430d5bSPaolo Bonzini required: get_option('coreaudio')) 1233478e943fSPaolo Bonziniendif 12348bc5184dSThomas Huth 12352b1ccdf4SMarc-André Lureauopengl = not_found 123688b6e618SPaolo Bonziniif not get_option('opengl').auto() or have_system or have_vhost_user_gpu 123788b6e618SPaolo Bonzini epoxy = dependency('epoxy', method: 'pkg-config', 1238063d5119SPaolo Bonzini required: get_option('opengl')) 123988b6e618SPaolo Bonzini if cc.has_header('epoxy/egl.h', dependencies: epoxy) 124088b6e618SPaolo Bonzini opengl = epoxy 124188b6e618SPaolo Bonzini elif get_option('opengl').enabled() 124288b6e618SPaolo Bonzini error('epoxy/egl.h not found') 124388b6e618SPaolo Bonzini endif 12442b1ccdf4SMarc-André Lureauendif 12458bc5184dSThomas Huthgbm = not_found 12468bc5184dSThomas Huthif (have_system or have_tools) and (virgl.found() or opengl.found()) 1247063d5119SPaolo Bonzini gbm = dependency('gbm', method: 'pkg-config', required: false) 12488bc5184dSThomas Huthendif 1249f0caba44SMarc-André Lureauhave_vhost_user_gpu = have_vhost_user_gpu and virgl.found() and opengl.found() and gbm.found() 12501b695471SPaolo Bonzini 125157612511SPaolo Bonzinignutls = not_found 1252cc4c7c73SDaniel P. Berrangégnutls_crypto = not_found 1253abc14fd0SAlyssa Rossif get_option('gnutls').enabled() or (get_option('gnutls').auto() and have_system) 1254cc4c7c73SDaniel P. Berrangé # For general TLS support our min gnutls matches 1255cc4c7c73SDaniel P. Berrangé # that implied by our platform support matrix 1256cc4c7c73SDaniel P. Berrangé # 1257cc4c7c73SDaniel P. Berrangé # For the crypto backends, we look for a newer 1258cc4c7c73SDaniel P. Berrangé # gnutls: 1259cc4c7c73SDaniel P. Berrangé # 1260cc4c7c73SDaniel P. Berrangé # Version 3.6.8 is needed to get XTS 1261cc4c7c73SDaniel P. Berrangé # Version 3.6.13 is needed to get PBKDF 1262cc4c7c73SDaniel P. Berrangé # Version 3.6.14 is needed to get HW accelerated XTS 1263cc4c7c73SDaniel P. Berrangé # 1264cc4c7c73SDaniel P. Berrangé # If newer enough gnutls isn't available, we can 1265cc4c7c73SDaniel P. Berrangé # still use a different crypto backend to satisfy 1266cc4c7c73SDaniel P. Berrangé # the platform support requirements 1267cc4c7c73SDaniel P. Berrangé gnutls_crypto = dependency('gnutls', version: '>=3.6.14', 1268cc4c7c73SDaniel P. Berrangé method: 'pkg-config', 1269063d5119SPaolo Bonzini required: false) 1270cc4c7c73SDaniel P. Berrangé if gnutls_crypto.found() 1271cc4c7c73SDaniel P. Berrangé gnutls = gnutls_crypto 1272cc4c7c73SDaniel P. Berrangé else 1273cc4c7c73SDaniel P. Berrangé # Our min version if all we need is TLS 127457612511SPaolo Bonzini gnutls = dependency('gnutls', version: '>=3.5.18', 127557612511SPaolo Bonzini method: 'pkg-config', 1276063d5119SPaolo Bonzini required: get_option('gnutls')) 127757612511SPaolo Bonzini endif 1278cc4c7c73SDaniel P. Berrangéendif 127957612511SPaolo Bonzini 12808bd0931fSDaniel P. Berrangé# We prefer use of gnutls for crypto, unless the options 12818bd0931fSDaniel P. Berrangé# explicitly asked for nettle or gcrypt. 12828bd0931fSDaniel P. Berrangé# 12838bd0931fSDaniel P. Berrangé# If gnutls isn't available for crypto, then we'll prefer 12848bd0931fSDaniel P. Berrangé# gcrypt over nettle for performance reasons. 128557612511SPaolo Bonzinigcrypt = not_found 128657612511SPaolo Bonzininettle = not_found 12874c5e512eSLei Hehogweed = not_found 128868014044SDaniel P. Berrangéxts = 'none' 12898bd0931fSDaniel P. Berrangé 129057612511SPaolo Bonziniif get_option('nettle').enabled() and get_option('gcrypt').enabled() 129157612511SPaolo Bonzini error('Only one of gcrypt & nettle can be enabled') 129257612511SPaolo Bonziniendif 12938bd0931fSDaniel P. Berrangé 12948bd0931fSDaniel P. Berrangé# Explicit nettle/gcrypt request, so ignore gnutls for crypto 12958bd0931fSDaniel P. Berrangéif get_option('nettle').enabled() or get_option('gcrypt').enabled() 12968bd0931fSDaniel P. Berrangé gnutls_crypto = not_found 129757612511SPaolo Bonziniendif 12988bd0931fSDaniel P. Berrangé 12998bd0931fSDaniel P. Berrangéif not gnutls_crypto.found() 13008bd0931fSDaniel P. Berrangé if (not get_option('gcrypt').auto() or have_system) and not get_option('nettle').enabled() 13011741093bSDaniel P. Berrangé gcrypt = dependency('libgcrypt', version: '>=1.8', 130257612511SPaolo Bonzini method: 'config-tool', 1303063d5119SPaolo Bonzini required: get_option('gcrypt')) 130457612511SPaolo Bonzini # Debian has removed -lgpg-error from libgcrypt-config 130557612511SPaolo Bonzini # as it "spreads unnecessary dependencies" which in 130657612511SPaolo Bonzini # turn breaks static builds... 1307a0cbd2e8SPaolo Bonzini if gcrypt.found() and get_option('prefer_static') 1308bd3615d6SPaolo Bonzini gcrypt = declare_dependency(dependencies: 1309bd3615d6SPaolo Bonzini [gcrypt, 1310bd3615d6SPaolo Bonzini cc.find_library('gpg-error', required: true)], 1311bd3615d6SPaolo Bonzini version: gcrypt.version()) 131257612511SPaolo Bonzini endif 131357612511SPaolo Bonzini endif 1314260a13d4SDaniel P. Berrangé if (not get_option('nettle').auto() or have_system) and not gcrypt.found() 1315260a13d4SDaniel P. Berrangé nettle = dependency('nettle', version: '>=3.4', 1316260a13d4SDaniel P. Berrangé method: 'pkg-config', 1317063d5119SPaolo Bonzini required: get_option('nettle')) 1318260a13d4SDaniel P. Berrangé if nettle.found() and not cc.has_header('nettle/xts.h', dependencies: nettle) 1319260a13d4SDaniel P. Berrangé xts = 'private' 1320260a13d4SDaniel P. Berrangé endif 1321260a13d4SDaniel P. Berrangé endif 1322cc4c7c73SDaniel P. Berrangéendif 132357612511SPaolo Bonzini 1324063d5119SPaolo Bonzinigmp = dependency('gmp', required: false, method: 'pkg-config') 13254c5e512eSLei Heif nettle.found() and gmp.found() 13264c5e512eSLei He hogweed = dependency('hogweed', version: '>=3.4', 13274c5e512eSLei He method: 'pkg-config', 1328063d5119SPaolo Bonzini required: get_option('nettle')) 13294c5e512eSLei Heendif 13304c5e512eSLei He 13314c5e512eSLei He 13322b1ccdf4SMarc-André Lureaugtk = not_found 13331b695471SPaolo Bonzinigtkx11 = not_found 1334c23d7b4eSPaolo Bonzinivte = not_found 133529e0bfffSClaudio Fontanahave_gtk_clipboard = get_option('gtk_clipboard').enabled() 133629e0bfffSClaudio Fontana 133764d3fec7SAkihiko Odakiif not get_option('gtk').auto() or have_system 13381b695471SPaolo Bonzini gtk = dependency('gtk+-3.0', version: '>=3.22.0', 13391b695471SPaolo Bonzini method: 'pkg-config', 1340063d5119SPaolo Bonzini required: get_option('gtk')) 13411b695471SPaolo Bonzini if gtk.found() 13421b695471SPaolo Bonzini gtkx11 = dependency('gtk+-x11-3.0', version: '>=3.22.0', 13431b695471SPaolo Bonzini method: 'pkg-config', 1344063d5119SPaolo Bonzini required: false) 1345bd3615d6SPaolo Bonzini gtk = declare_dependency(dependencies: [gtk, gtkx11], 1346bd3615d6SPaolo Bonzini version: gtk.version()) 1347c23d7b4eSPaolo Bonzini 1348c23d7b4eSPaolo Bonzini if not get_option('vte').auto() or have_system 1349c23d7b4eSPaolo Bonzini vte = dependency('vte-2.91', 1350c23d7b4eSPaolo Bonzini method: 'pkg-config', 1351063d5119SPaolo Bonzini required: get_option('vte')) 1352c23d7b4eSPaolo Bonzini endif 135329e0bfffSClaudio Fontana elif have_gtk_clipboard 135429e0bfffSClaudio Fontana error('GTK clipboard requested, but GTK not found') 13552b1ccdf4SMarc-André Lureau endif 13561b695471SPaolo Bonziniendif 13571b695471SPaolo Bonzini 13582b1ccdf4SMarc-André Lureaux11 = not_found 13599d49bcf6SMarkus Armbrusterif gtkx11.found() 1360063d5119SPaolo Bonzini x11 = dependency('x11', method: 'pkg-config', required: gtkx11.found()) 13612b1ccdf4SMarc-André Lureauendif 13622b1ccdf4SMarc-André Lureaupng = not_found 136395f8510eSKshitij Suriif get_option('png').allowed() and have_system 13641ec8c2c0SThomas Huth png = dependency('libpng', version: '>=1.6.34', required: get_option('png'), 1365063d5119SPaolo Bonzini method: 'pkg-config') 136695f8510eSKshitij Suriendif 136795f8510eSKshitij Surivnc = not_found 13682b1ccdf4SMarc-André Lureaujpeg = not_found 13692b1ccdf4SMarc-André Lureausasl = not_found 137043a363aeSPaolo Bonziniif get_option('vnc').allowed() and have_system 1371a0b93237SPaolo Bonzini vnc = declare_dependency() # dummy dependency 13728e242b3cSPaolo Bonzini jpeg = dependency('libjpeg', required: get_option('vnc_jpeg'), 1373063d5119SPaolo Bonzini method: 'pkg-config') 1374a0b93237SPaolo Bonzini sasl = cc.find_library('sasl2', has_headers: ['sasl/sasl.h'], 1375063d5119SPaolo Bonzini required: get_option('vnc_sasl')) 1376a0b93237SPaolo Bonzini if sasl.found() 1377a0b93237SPaolo Bonzini sasl = declare_dependency(dependencies: sasl, 1378a0b93237SPaolo Bonzini compile_args: '-DSTRUCT_IOVEC_DEFINED') 1379a0b93237SPaolo Bonzini endif 13802b1ccdf4SMarc-André Lureauendif 1381241611eaSPaolo Bonzini 138205e391aeSPaolo Bonzinipam = not_found 138305e391aeSPaolo Bonziniif not get_option('auth_pam').auto() or have_system 138405e391aeSPaolo Bonzini pam = cc.find_library('pam', has_headers: ['security/pam_appl.h'], 1385063d5119SPaolo Bonzini required: get_option('auth_pam')) 138605e391aeSPaolo Bonziniendif 138705e391aeSPaolo Bonziniif pam.found() and not cc.links(''' 138805e391aeSPaolo Bonzini #include <stddef.h> 138905e391aeSPaolo Bonzini #include <security/pam_appl.h> 139005e391aeSPaolo Bonzini int main(void) { 139105e391aeSPaolo Bonzini const char *service_name = "qemu"; 139205e391aeSPaolo Bonzini const char *user = "frank"; 139305e391aeSPaolo Bonzini const struct pam_conv pam_conv = { 0 }; 139405e391aeSPaolo Bonzini pam_handle_t *pamh = NULL; 139505e391aeSPaolo Bonzini pam_start(service_name, user, &pam_conv, &pamh); 139605e391aeSPaolo Bonzini return 0; 139705e391aeSPaolo Bonzini }''', dependencies: pam) 139805e391aeSPaolo Bonzini pam = not_found 139905e391aeSPaolo Bonzini if get_option('auth_pam').enabled() 140005e391aeSPaolo Bonzini error('could not link libpam') 140105e391aeSPaolo Bonzini else 140205e391aeSPaolo Bonzini warning('could not link libpam, disabling') 140305e391aeSPaolo Bonzini endif 140405e391aeSPaolo Bonziniendif 140505e391aeSPaolo Bonzini 1406708eab42SMarc-André Lureausnappy = not_found 1407241611eaSPaolo Bonziniif not get_option('snappy').auto() or have_system 1408241611eaSPaolo Bonzini snappy = cc.find_library('snappy', has_headers: ['snappy-c.h'], 1409063d5119SPaolo Bonzini required: get_option('snappy')) 1410708eab42SMarc-André Lureauendif 1411565174d0SPaolo Bonziniif snappy.found() and not linker.links(''' 1412241611eaSPaolo Bonzini #include <snappy-c.h> 1413241611eaSPaolo Bonzini int main(void) { snappy_max_compressed_length(4096); return 0; }''', dependencies: snappy) 1414241611eaSPaolo Bonzini snappy = not_found 1415241611eaSPaolo Bonzini if get_option('snappy').enabled() 1416241611eaSPaolo Bonzini error('could not link libsnappy') 1417241611eaSPaolo Bonzini else 1418241611eaSPaolo Bonzini warning('could not link libsnappy, disabling') 1419241611eaSPaolo Bonzini endif 1420708eab42SMarc-André Lureauendif 14210c32a0aeSPaolo Bonzini 1422708eab42SMarc-André Lureaulzo = not_found 14230c32a0aeSPaolo Bonziniif not get_option('lzo').auto() or have_system 14240c32a0aeSPaolo Bonzini lzo = cc.find_library('lzo2', has_headers: ['lzo/lzo1x.h'], 1425063d5119SPaolo Bonzini required: get_option('lzo')) 1426708eab42SMarc-André Lureauendif 14270c32a0aeSPaolo Bonziniif lzo.found() and not cc.links(''' 14280c32a0aeSPaolo Bonzini #include <lzo/lzo1x.h> 14290c32a0aeSPaolo Bonzini int main(void) { lzo_version(); return 0; }''', dependencies: lzo) 14300c32a0aeSPaolo Bonzini lzo = not_found 14310c32a0aeSPaolo Bonzini if get_option('lzo').enabled() 14320c32a0aeSPaolo Bonzini error('could not link liblzo2') 14330c32a0aeSPaolo Bonzini else 14340c32a0aeSPaolo Bonzini warning('could not link liblzo2, disabling') 14350c32a0aeSPaolo Bonzini endif 14360c32a0aeSPaolo Bonziniendif 14370c32a0aeSPaolo Bonzini 1438488a8c73SPaolo Bonzininuma = not_found 1439488a8c73SPaolo Bonziniif not get_option('numa').auto() or have_system or have_tools 1440488a8c73SPaolo Bonzini numa = cc.find_library('numa', has_headers: ['numa.h'], 1441063d5119SPaolo Bonzini required: get_option('numa')) 1442488a8c73SPaolo Bonziniendif 1443488a8c73SPaolo Bonziniif numa.found() and not cc.links(''' 1444488a8c73SPaolo Bonzini #include <numa.h> 1445488a8c73SPaolo Bonzini int main(void) { return numa_available(); } 1446488a8c73SPaolo Bonzini ''', dependencies: numa) 1447488a8c73SPaolo Bonzini numa = not_found 1448488a8c73SPaolo Bonzini if get_option('numa').enabled() 1449488a8c73SPaolo Bonzini error('could not link numa') 1450488a8c73SPaolo Bonzini else 1451488a8c73SPaolo Bonzini warning('could not link numa, disabling') 1452488a8c73SPaolo Bonzini endif 1453488a8c73SPaolo Bonziniendif 1454488a8c73SPaolo Bonzini 145555166230SMarc-André Lureaurdma = not_found 14563730a734SPaolo Bonziniif not get_option('rdma').auto() or have_system 14573730a734SPaolo Bonzini libumad = cc.find_library('ibumad', required: get_option('rdma')) 14583730a734SPaolo Bonzini rdma_libs = [cc.find_library('rdmacm', has_headers: ['rdma/rdma_cma.h'], 1459063d5119SPaolo Bonzini required: get_option('rdma')), 1460063d5119SPaolo Bonzini cc.find_library('ibverbs', required: get_option('rdma')), 14613730a734SPaolo Bonzini libumad] 14623730a734SPaolo Bonzini rdma = declare_dependency(dependencies: rdma_libs) 14633730a734SPaolo Bonzini foreach lib: rdma_libs 14643730a734SPaolo Bonzini if not lib.found() 14653730a734SPaolo Bonzini rdma = not_found 146655166230SMarc-André Lureau endif 14673730a734SPaolo Bonzini endforeach 14683730a734SPaolo Bonziniendif 14693730a734SPaolo Bonzini 1470582ea95fSMarc-André Lureauxen = not_found 147114efd8d3SPaolo Bonziniif get_option('xen').enabled() or (get_option('xen').auto() and have_system) 147214efd8d3SPaolo Bonzini xencontrol = dependency('xencontrol', required: false, 1473063d5119SPaolo Bonzini method: 'pkg-config') 147414efd8d3SPaolo Bonzini if xencontrol.found() 147514efd8d3SPaolo Bonzini xen_pc = declare_dependency(version: xencontrol.version(), 147614efd8d3SPaolo Bonzini dependencies: [ 147714efd8d3SPaolo Bonzini xencontrol, 147814efd8d3SPaolo Bonzini # disabler: true makes xen_pc.found() return false if any is not found 147914efd8d3SPaolo Bonzini dependency('xenstore', required: false, 1480063d5119SPaolo Bonzini method: 'pkg-config', 148114efd8d3SPaolo Bonzini disabler: true), 148214efd8d3SPaolo Bonzini dependency('xenforeignmemory', required: false, 1483063d5119SPaolo Bonzini method: 'pkg-config', 148414efd8d3SPaolo Bonzini disabler: true), 148514efd8d3SPaolo Bonzini dependency('xengnttab', required: false, 1486063d5119SPaolo Bonzini method: 'pkg-config', 148714efd8d3SPaolo Bonzini disabler: true), 148814efd8d3SPaolo Bonzini dependency('xenevtchn', required: false, 1489063d5119SPaolo Bonzini method: 'pkg-config', 149014efd8d3SPaolo Bonzini disabler: true), 149114efd8d3SPaolo Bonzini dependency('xendevicemodel', required: false, 1492063d5119SPaolo Bonzini method: 'pkg-config', 149314efd8d3SPaolo Bonzini disabler: true), 149414efd8d3SPaolo Bonzini # optional, no "disabler: true" 149514efd8d3SPaolo Bonzini dependency('xentoolcore', required: false, 1496063d5119SPaolo Bonzini method: 'pkg-config')]) 149714efd8d3SPaolo Bonzini if xen_pc.found() 149814efd8d3SPaolo Bonzini xen = xen_pc 1499582ea95fSMarc-André Lureau endif 150014efd8d3SPaolo Bonzini endif 150114efd8d3SPaolo Bonzini if not xen.found() 150214efd8d3SPaolo 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' ] 150314efd8d3SPaolo Bonzini xen_libs = { 150414efd8d3SPaolo Bonzini '4.11.0': [ 'xenstore', 'xenctrl', 'xendevicemodel', 'xenforeignmemory', 'xengnttab', 'xenevtchn', 'xentoolcore' ], 150514efd8d3SPaolo Bonzini '4.10.0': [ 'xenstore', 'xenctrl', 'xendevicemodel', 'xenforeignmemory', 'xengnttab', 'xenevtchn', 'xentoolcore' ], 150614efd8d3SPaolo Bonzini '4.9.0': [ 'xenstore', 'xenctrl', 'xendevicemodel', 'xenforeignmemory', 'xengnttab', 'xenevtchn' ], 150714efd8d3SPaolo Bonzini '4.8.0': [ 'xenstore', 'xenctrl', 'xenforeignmemory', 'xengnttab', 'xenevtchn' ], 150814efd8d3SPaolo Bonzini '4.7.1': [ 'xenstore', 'xenctrl', 'xenforeignmemory', 'xengnttab', 'xenevtchn' ], 150914efd8d3SPaolo Bonzini '4.6.0': [ 'xenstore', 'xenctrl' ], 151014efd8d3SPaolo Bonzini '4.5.0': [ 'xenstore', 'xenctrl' ], 151114efd8d3SPaolo Bonzini '4.2.0': [ 'xenstore', 'xenctrl' ], 151214efd8d3SPaolo Bonzini } 151314efd8d3SPaolo Bonzini xen_deps = {} 151414efd8d3SPaolo Bonzini foreach ver: xen_tests 151514efd8d3SPaolo Bonzini # cache the various library tests to avoid polluting the logs 151614efd8d3SPaolo Bonzini xen_test_deps = [] 151714efd8d3SPaolo Bonzini foreach l: xen_libs[ver] 151814efd8d3SPaolo Bonzini if l not in xen_deps 151914efd8d3SPaolo Bonzini xen_deps += { l: cc.find_library(l, required: false) } 152014efd8d3SPaolo Bonzini endif 152114efd8d3SPaolo Bonzini xen_test_deps += xen_deps[l] 152214efd8d3SPaolo Bonzini endforeach 152314efd8d3SPaolo Bonzini 152414efd8d3SPaolo Bonzini # Use -D to pick just one of the test programs in scripts/xen-detect.c 152514efd8d3SPaolo Bonzini xen_version = ver.split('.') 152614efd8d3SPaolo Bonzini xen_ctrl_version = xen_version[0] + \ 152714efd8d3SPaolo Bonzini ('0' + xen_version[1]).substring(-2) + \ 152814efd8d3SPaolo Bonzini ('0' + xen_version[2]).substring(-2) 152914efd8d3SPaolo Bonzini if cc.links(files('scripts/xen-detect.c'), 153014efd8d3SPaolo Bonzini args: '-DCONFIG_XEN_CTRL_INTERFACE_VERSION=' + xen_ctrl_version, 153114efd8d3SPaolo Bonzini dependencies: xen_test_deps) 153214efd8d3SPaolo Bonzini xen = declare_dependency(version: ver, dependencies: xen_test_deps) 153314efd8d3SPaolo Bonzini break 153414efd8d3SPaolo Bonzini endif 153514efd8d3SPaolo Bonzini endforeach 153614efd8d3SPaolo Bonzini endif 153714efd8d3SPaolo Bonzini if xen.found() 153814efd8d3SPaolo Bonzini accelerators += 'CONFIG_XEN' 153914efd8d3SPaolo Bonzini elif get_option('xen').enabled() 154014efd8d3SPaolo Bonzini error('could not compile and link Xen test program') 154114efd8d3SPaolo Bonzini endif 154214efd8d3SPaolo Bonziniendif 154314efd8d3SPaolo Bonzinihave_xen_pci_passthrough = get_option('xen_pci_passthrough') \ 154414efd8d3SPaolo Bonzini .require(xen.found(), 154514efd8d3SPaolo Bonzini error_message: 'Xen PCI passthrough requested but Xen not enabled') \ 154614efd8d3SPaolo Bonzini .require(targetos == 'linux', 154714efd8d3SPaolo Bonzini error_message: 'Xen PCI passthrough not available on this platform') \ 154814efd8d3SPaolo Bonzini .allowed() 154914efd8d3SPaolo Bonzini 155014efd8d3SPaolo Bonzini 155106677ce1SPaolo Bonzinicacard = not_found 15525f364c57SPaolo Bonziniif not get_option('smartcard').auto() or have_system 15535f364c57SPaolo Bonzini cacard = dependency('libcacard', required: get_option('smartcard'), 1554063d5119SPaolo Bonzini version: '>=2.5.1', method: 'pkg-config') 155506677ce1SPaolo Bonziniendif 15560a40bcb7SCésar Belleyu2f = not_found 15570a40bcb7SCésar Belleyif have_system 15580a40bcb7SCésar Belley u2f = dependency('u2f-emu', required: get_option('u2f'), 1559063d5119SPaolo Bonzini method: 'pkg-config') 15600a40bcb7SCésar Belleyendif 15618caef850SHongren (Zenithal) Zhengcanokey = not_found 15628caef850SHongren (Zenithal) Zhengif have_system 15638caef850SHongren (Zenithal) Zheng canokey = dependency('canokey-qemu', required: get_option('canokey'), 1564063d5119SPaolo Bonzini method: 'pkg-config') 15658caef850SHongren (Zenithal) Zhengendif 156606677ce1SPaolo Bonziniusbredir = not_found 156718f31e60SPaolo Bonziniif not get_option('usb_redir').auto() or have_system 156818f31e60SPaolo Bonzini usbredir = dependency('libusbredirparser-0.5', required: get_option('usb_redir'), 1569063d5119SPaolo Bonzini version: '>=0.6', method: 'pkg-config') 157006677ce1SPaolo Bonziniendif 157106677ce1SPaolo Bonzinilibusb = not_found 157290540f32SPaolo Bonziniif not get_option('libusb').auto() or have_system 157390540f32SPaolo Bonzini libusb = dependency('libusb-1.0', required: get_option('libusb'), 1574063d5119SPaolo Bonzini version: '>=1.0.13', method: 'pkg-config') 157506677ce1SPaolo Bonziniendif 157690540f32SPaolo Bonzini 1577c9322ab5SMarc-André Lureaulibpmem = not_found 1578e36e8c70SPaolo Bonziniif not get_option('libpmem').auto() or have_system 1579e36e8c70SPaolo Bonzini libpmem = dependency('libpmem', required: get_option('libpmem'), 1580063d5119SPaolo Bonzini method: 'pkg-config') 1581c9322ab5SMarc-André Lureauendif 1582c7c91a74SBruce Rogerslibdaxctl = not_found 158383ef1682SPaolo Bonziniif not get_option('libdaxctl').auto() or have_system 158483ef1682SPaolo Bonzini libdaxctl = dependency('libdaxctl', required: get_option('libdaxctl'), 1585063d5119SPaolo Bonzini version: '>=57', method: 'pkg-config') 1586c7c91a74SBruce Rogersendif 15878ce0a45fSMarc-André Lureautasn1 = not_found 1588ba7ed407SPaolo Bonziniif gnutls.found() 1589ba7ed407SPaolo Bonzini tasn1 = dependency('libtasn1', 1590063d5119SPaolo Bonzini method: 'pkg-config') 15918ce0a45fSMarc-André Lureauendif 1592af04e89dSMarc-André Lureaukeyutils = dependency('libkeyutils', required: false, 1593063d5119SPaolo Bonzini method: 'pkg-config') 1594a81df1b6SPaolo Bonzini 15953909def8SMarc-André Lureauhas_gettid = cc.has_function('gettid') 15963909def8SMarc-André Lureau 15973d212b41SRichard W.M. Jones# libselinux 15983d212b41SRichard W.M. Jonesselinux = dependency('libselinux', 15993d212b41SRichard W.M. Jones required: get_option('selinux'), 1600063d5119SPaolo Bonzini method: 'pkg-config') 16013d212b41SRichard W.M. Jones 1602aa087962SPaolo Bonzini# Malloc tests 1603aa087962SPaolo Bonzini 1604aa087962SPaolo Bonzinimalloc = [] 1605aa087962SPaolo Bonziniif get_option('malloc') == 'system' 1606aa087962SPaolo Bonzini has_malloc_trim = \ 160743a363aeSPaolo Bonzini get_option('malloc_trim').allowed() and \ 1608aa087962SPaolo Bonzini cc.links('''#include <malloc.h> 1609aa087962SPaolo Bonzini int main(void) { malloc_trim(0); return 0; }''') 1610aa087962SPaolo Bonzinielse 1611aa087962SPaolo Bonzini has_malloc_trim = false 1612aa087962SPaolo Bonzini malloc = cc.find_library(get_option('malloc'), required: true) 1613aa087962SPaolo Bonziniendif 1614aa087962SPaolo Bonziniif not has_malloc_trim and get_option('malloc_trim').enabled() 1615aa087962SPaolo Bonzini if get_option('malloc') == 'system' 1616aa087962SPaolo Bonzini error('malloc_trim not available on this platform.') 1617aa087962SPaolo Bonzini else 1618aa087962SPaolo Bonzini error('malloc_trim not available with non-libc memory allocator') 1619aa087962SPaolo Bonzini endif 1620aa087962SPaolo Bonziniendif 1621aa087962SPaolo Bonzini 162284e319a5SMax Reitz# Check whether the glibc provides statx() 162384e319a5SMax Reitz 1624e66420acSPaolo Bonzinignu_source_prefix = ''' 162584e319a5SMax Reitz #ifndef _GNU_SOURCE 162684e319a5SMax Reitz #define _GNU_SOURCE 162784e319a5SMax Reitz #endif 1628e66420acSPaolo Bonzini''' 1629e66420acSPaolo Bonzinistatx_test = gnu_source_prefix + ''' 163084e319a5SMax Reitz #include <sys/stat.h> 163184e319a5SMax Reitz int main(void) { 163284e319a5SMax Reitz struct statx statxbuf; 163384e319a5SMax Reitz statx(0, "", 0, STATX_BASIC_STATS, &statxbuf); 163484e319a5SMax Reitz return 0; 163584e319a5SMax Reitz }''' 163684e319a5SMax Reitz 163784e319a5SMax Reitzhas_statx = cc.links(statx_test) 163884e319a5SMax Reitz 16394ce7a08dSHanna Reitz# Check whether statx() provides mount ID information 16404ce7a08dSHanna Reitz 16414ce7a08dSHanna Reitzstatx_mnt_id_test = gnu_source_prefix + ''' 16424ce7a08dSHanna Reitz #include <sys/stat.h> 16434ce7a08dSHanna Reitz int main(void) { 16444ce7a08dSHanna Reitz struct statx statxbuf; 16454ce7a08dSHanna Reitz statx(0, "", 0, STATX_BASIC_STATS | STATX_MNT_ID, &statxbuf); 16464ce7a08dSHanna Reitz return statxbuf.stx_mnt_id; 16474ce7a08dSHanna Reitz }''' 16484ce7a08dSHanna Reitz 16494ce7a08dSHanna Reitzhas_statx_mnt_id = cc.links(statx_mnt_id_test) 16504ce7a08dSHanna Reitz 1651a436d6d4SPaolo Bonzinihave_vhost_user_blk_server = get_option('vhost_user_blk_server') \ 1652a436d6d4SPaolo Bonzini .require(targetos == 'linux', 1653a436d6d4SPaolo Bonzini error_message: 'vhost_user_blk_server requires linux') \ 16542a3129a3SPaolo Bonzini .require(have_vhost_user, 1655a436d6d4SPaolo Bonzini error_message: 'vhost_user_blk_server requires vhost-user support') \ 165626ed501bSAlex Bennée .disable_auto_if(not have_tools and not have_system) \ 1657a436d6d4SPaolo Bonzini .allowed() 16589e62ba48SDaniele Buono 1659df4ea709SMax Reitzif get_option('fuse').disabled() and get_option('fuse_lseek').enabled() 1660df4ea709SMax Reitz error('Cannot enable fuse-lseek while fuse is disabled') 1661df4ea709SMax Reitzendif 1662df4ea709SMax Reitz 1663a484a719SMax Reitzfuse = dependency('fuse3', required: get_option('fuse'), 1664063d5119SPaolo Bonzini version: '>=3.1', method: 'pkg-config') 1665a484a719SMax Reitz 1666df4ea709SMax Reitzfuse_lseek = not_found 166743a363aeSPaolo Bonziniif get_option('fuse_lseek').allowed() 1668df4ea709SMax Reitz if fuse.version().version_compare('>=3.8') 1669df4ea709SMax Reitz # Dummy dependency 1670df4ea709SMax Reitz fuse_lseek = declare_dependency() 1671df4ea709SMax Reitz elif get_option('fuse_lseek').enabled() 1672df4ea709SMax Reitz if fuse.found() 1673df4ea709SMax Reitz error('fuse-lseek requires libfuse >=3.8, found ' + fuse.version()) 1674df4ea709SMax Reitz else 1675df4ea709SMax Reitz error('fuse-lseek requires libfuse, which was not found') 1676df4ea709SMax Reitz endif 1677df4ea709SMax Reitz endif 1678df4ea709SMax Reitzendif 1679df4ea709SMax Reitz 1680a6caeee8SXie Yongjihave_libvduse = (targetos == 'linux') 1681a6caeee8SXie Yongjiif get_option('libvduse').enabled() 1682a6caeee8SXie Yongji if targetos != 'linux' 1683a6caeee8SXie Yongji error('libvduse requires linux') 1684a6caeee8SXie Yongji endif 1685a6caeee8SXie Yongjielif get_option('libvduse').disabled() 1686a6caeee8SXie Yongji have_libvduse = false 1687a6caeee8SXie Yongjiendif 1688a6caeee8SXie Yongji 16892a2359b8SXie Yongjihave_vduse_blk_export = (have_libvduse and targetos == 'linux') 16902a2359b8SXie Yongjiif get_option('vduse_blk_export').enabled() 16912a2359b8SXie Yongji if targetos != 'linux' 16922a2359b8SXie Yongji error('vduse_blk_export requires linux') 16932a2359b8SXie Yongji elif not have_libvduse 16942a2359b8SXie Yongji error('vduse_blk_export requires libvduse support') 16952a2359b8SXie Yongji endif 16962a2359b8SXie Yongjielif get_option('vduse_blk_export').disabled() 16972a2359b8SXie Yongji have_vduse_blk_export = false 16982a2359b8SXie Yongjiendif 16992a2359b8SXie Yongji 170046627f41SAndrew Melnychenko# libbpf 170146627f41SAndrew Melnychenkolibbpf = dependency('libbpf', required: get_option('bpf'), method: 'pkg-config') 170246627f41SAndrew Melnychenkoif libbpf.found() and not cc.links(''' 170346627f41SAndrew Melnychenko #include <bpf/libbpf.h> 170446627f41SAndrew Melnychenko int main(void) 170546627f41SAndrew Melnychenko { 170646627f41SAndrew Melnychenko bpf_object__destroy_skeleton(NULL); 170746627f41SAndrew Melnychenko return 0; 170846627f41SAndrew Melnychenko }''', dependencies: libbpf) 170946627f41SAndrew Melnychenko libbpf = not_found 171046627f41SAndrew Melnychenko if get_option('bpf').enabled() 171146627f41SAndrew Melnychenko error('libbpf skeleton test failed') 171246627f41SAndrew Melnychenko else 171346627f41SAndrew Melnychenko warning('libbpf skeleton test failed, disabling') 171446627f41SAndrew Melnychenko endif 171546627f41SAndrew Melnychenkoendif 171646627f41SAndrew Melnychenko 17177c10cb38SIlya Leoshkevich# libdw 1718bc71d58fSIlya Leoshkevichlibdw = not_found 1719550c6d97SIlya Leoshkevichif not get_option('libdw').auto() or \ 1720a0cbd2e8SPaolo Bonzini (not get_option('prefer_static') and (have_system or have_user)) 17217c10cb38SIlya Leoshkevich libdw = dependency('libdw', 17227c10cb38SIlya Leoshkevich method: 'pkg-config', 1723bc71d58fSIlya Leoshkevich required: get_option('libdw')) 1724bc71d58fSIlya Leoshkevichendif 17257c10cb38SIlya Leoshkevich 172687430d5bSPaolo Bonzini################# 172787430d5bSPaolo Bonzini# config-host.h # 172887430d5bSPaolo Bonzini################# 172987430d5bSPaolo Bonzini 173087430d5bSPaolo Bonziniaudio_drivers_selected = [] 173187430d5bSPaolo Bonziniif have_system 173287430d5bSPaolo Bonzini audio_drivers_available = { 173387430d5bSPaolo Bonzini 'alsa': alsa.found(), 173487430d5bSPaolo Bonzini 'coreaudio': coreaudio.found(), 173587430d5bSPaolo Bonzini 'dsound': dsound.found(), 173687430d5bSPaolo Bonzini 'jack': jack.found(), 173787430d5bSPaolo Bonzini 'oss': oss.found(), 173887430d5bSPaolo Bonzini 'pa': pulse.found(), 1739c2d3d1c2SDorinda Bassey 'pipewire': pipewire.found(), 174087430d5bSPaolo Bonzini 'sdl': sdl.found(), 1741663df1ccSAlexandre Ratchov 'sndio': sndio.found(), 174287430d5bSPaolo Bonzini } 1743e5424a29SPaolo Bonzini foreach k, v: audio_drivers_available 1744e5424a29SPaolo Bonzini config_host_data.set('CONFIG_AUDIO_' + k.to_upper(), v) 1745e5424a29SPaolo Bonzini endforeach 174687430d5bSPaolo Bonzini 174787430d5bSPaolo Bonzini # Default to native drivers first, OSS second, SDL third 174887430d5bSPaolo Bonzini audio_drivers_priority = \ 1749663df1ccSAlexandre Ratchov [ 'pa', 'coreaudio', 'dsound', 'sndio', 'oss' ] + \ 175087430d5bSPaolo Bonzini (targetos == 'linux' ? [] : [ 'sdl' ]) 175187430d5bSPaolo Bonzini audio_drivers_default = [] 175287430d5bSPaolo Bonzini foreach k: audio_drivers_priority 175387430d5bSPaolo Bonzini if audio_drivers_available[k] 175487430d5bSPaolo Bonzini audio_drivers_default += k 175587430d5bSPaolo Bonzini endif 175687430d5bSPaolo Bonzini endforeach 175787430d5bSPaolo Bonzini 175887430d5bSPaolo Bonzini foreach k: get_option('audio_drv_list') 175987430d5bSPaolo Bonzini if k == 'default' 176087430d5bSPaolo Bonzini audio_drivers_selected += audio_drivers_default 176187430d5bSPaolo Bonzini elif not audio_drivers_available[k] 176287430d5bSPaolo Bonzini error('Audio driver "@0@" not available.'.format(k)) 176387430d5bSPaolo Bonzini else 176487430d5bSPaolo Bonzini audio_drivers_selected += k 176587430d5bSPaolo Bonzini endif 176687430d5bSPaolo Bonzini endforeach 176787430d5bSPaolo Bonziniendif 176887430d5bSPaolo Bonziniconfig_host_data.set('CONFIG_AUDIO_DRIVERS', 176987430d5bSPaolo Bonzini '"' + '", "'.join(audio_drivers_selected) + '", ') 177087430d5bSPaolo Bonzini 17719e62ba48SDaniele Buonoif get_option('cfi') 17729e62ba48SDaniele Buono cfi_flags=[] 17739e62ba48SDaniele Buono # Check for dependency on LTO 17749e62ba48SDaniele Buono if not get_option('b_lto') 17759e62ba48SDaniele Buono error('Selected Control-Flow Integrity but LTO is disabled') 17769e62ba48SDaniele Buono endif 17776002711cSPaolo Bonzini if enable_modules 17789e62ba48SDaniele Buono error('Selected Control-Flow Integrity is not compatible with modules') 17799e62ba48SDaniele Buono endif 17809e62ba48SDaniele Buono # Check for cfi flags. CFI requires LTO so we can't use 17819e62ba48SDaniele Buono # get_supported_arguments, but need a more complex "compiles" which allows 17829e62ba48SDaniele Buono # custom arguments 17839e62ba48SDaniele Buono if cc.compiles('int main () { return 0; }', name: '-fsanitize=cfi-icall', 17849e62ba48SDaniele Buono args: ['-flto', '-fsanitize=cfi-icall'] ) 17859e62ba48SDaniele Buono cfi_flags += '-fsanitize=cfi-icall' 17869e62ba48SDaniele Buono else 17879e62ba48SDaniele Buono error('-fsanitize=cfi-icall is not supported by the compiler') 17889e62ba48SDaniele Buono endif 17899e62ba48SDaniele Buono if cc.compiles('int main () { return 0; }', 17909e62ba48SDaniele Buono name: '-fsanitize-cfi-icall-generalize-pointers', 17919e62ba48SDaniele Buono args: ['-flto', '-fsanitize=cfi-icall', 17929e62ba48SDaniele Buono '-fsanitize-cfi-icall-generalize-pointers'] ) 17939e62ba48SDaniele Buono cfi_flags += '-fsanitize-cfi-icall-generalize-pointers' 17949e62ba48SDaniele Buono else 17959e62ba48SDaniele Buono error('-fsanitize-cfi-icall-generalize-pointers is not supported by the compiler') 17969e62ba48SDaniele Buono endif 17979e62ba48SDaniele Buono if get_option('cfi_debug') 17989e62ba48SDaniele Buono if cc.compiles('int main () { return 0; }', 17999e62ba48SDaniele Buono name: '-fno-sanitize-trap=cfi-icall', 18009e62ba48SDaniele Buono args: ['-flto', '-fsanitize=cfi-icall', 18019e62ba48SDaniele Buono '-fno-sanitize-trap=cfi-icall'] ) 18029e62ba48SDaniele Buono cfi_flags += '-fno-sanitize-trap=cfi-icall' 18039e62ba48SDaniele Buono else 18049e62ba48SDaniele Buono error('-fno-sanitize-trap=cfi-icall is not supported by the compiler') 18059e62ba48SDaniele Buono endif 18069e62ba48SDaniele Buono endif 1807e5134024SPaolo Bonzini add_global_arguments(cfi_flags, native: false, language: all_languages) 1808e5134024SPaolo Bonzini add_global_link_arguments(cfi_flags, native: false, language: all_languages) 18099e62ba48SDaniele Buonoendif 18109e62ba48SDaniele Buono 181114176c8dSJoelle van Dynehave_host_block_device = (targetos != 'darwin' or 181214176c8dSJoelle van Dyne cc.has_header('IOKit/storage/IOMedia.h')) 181314176c8dSJoelle van Dyne 1814a436d6d4SPaolo Bonzinidbus_display = get_option('dbus_display') \ 1815a436d6d4SPaolo Bonzini .require(gio.version().version_compare('>=2.64'), 1816a436d6d4SPaolo Bonzini error_message: '-display dbus requires glib>=2.64') \ 18177544060eSPaolo Bonzini .require(gdbus_codegen.found(), 1818bb2dc4b7SPaolo Bonzini error_message: gdbus_codegen_error.format('-display dbus')) \ 181984a0a2efSMarc-André Lureau .require(targetos != 'windows', 182084a0a2efSMarc-André Lureau error_message: '-display dbus is not available on Windows') \ 1821a436d6d4SPaolo Bonzini .allowed() 1822142ca628SMarc-André Lureau 1823a436d6d4SPaolo Bonzinihave_virtfs = get_option('virtfs') \ 18240fb1e19dSKeno Fischer .require(targetos == 'linux' or targetos == 'darwin', 18250fb1e19dSKeno Fischer error_message: 'virtio-9p (virtfs) requires Linux or macOS') \ 18260fb1e19dSKeno Fischer .require(targetos == 'linux' or cc.has_function('pthread_fchdir_np'), 18270fb1e19dSKeno Fischer error_message: 'virtio-9p (virtfs) on macOS requires the presence of pthread_fchdir_np') \ 18281a67e07fSPeter Foley .require(targetos == 'darwin' or libattr.found(), 18291a67e07fSPeter Foley error_message: 'virtio-9p (virtfs) on Linux requires libattr-devel') \ 1830a436d6d4SPaolo Bonzini .disable_auto_if(not have_tools and not have_system) \ 1831a436d6d4SPaolo Bonzini .allowed() 183269202b40SPaolo Bonzini 18331a67e07fSPeter Foleyhave_virtfs_proxy_helper = get_option('virtfs_proxy_helper') \ 18341a67e07fSPeter Foley .require(targetos != 'darwin', error_message: 'the virtfs proxy helper is incompatible with macOS') \ 18351a67e07fSPeter Foley .require(have_virtfs, error_message: 'the virtfs proxy helper requires that virtfs is enabled') \ 18361a67e07fSPeter Foley .disable_auto_if(not have_tools) \ 18371a67e07fSPeter Foley .require(libcap_ng.found(), error_message: 'the virtfs proxy helper requires libcap-ng') \ 18381a67e07fSPeter Foley .allowed() 18393a489d38SPhilippe Mathieu-Daudé 1840622d64ffSPaolo Bonziniif get_option('block_drv_ro_whitelist') == '' 1841622d64ffSPaolo Bonzini config_host_data.set('CONFIG_BDRV_RO_WHITELIST', '') 1842622d64ffSPaolo Bonzinielse 1843622d64ffSPaolo Bonzini config_host_data.set('CONFIG_BDRV_RO_WHITELIST', 1844622d64ffSPaolo Bonzini '"' + get_option('block_drv_ro_whitelist').replace(',', '", "') + '", ') 1845622d64ffSPaolo Bonziniendif 1846622d64ffSPaolo Bonziniif get_option('block_drv_rw_whitelist') == '' 1847622d64ffSPaolo Bonzini config_host_data.set('CONFIG_BDRV_RW_WHITELIST', '') 1848622d64ffSPaolo Bonzinielse 1849622d64ffSPaolo Bonzini config_host_data.set('CONFIG_BDRV_RW_WHITELIST', 1850622d64ffSPaolo Bonzini '"' + get_option('block_drv_rw_whitelist').replace(',', '", "') + '", ') 1851622d64ffSPaolo Bonziniendif 1852622d64ffSPaolo Bonzini 18539c29b741SPaolo Bonziniforeach k : get_option('trace_backends') 18549c29b741SPaolo Bonzini config_host_data.set('CONFIG_TRACE_' + k.to_upper(), true) 18559c29b741SPaolo Bonziniendforeach 18569c29b741SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_TRACE_FILE', get_option('trace_file')) 185741f2ae28SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_TLS_PRIORITY', get_option('tls_priority')) 185840c909f5SPaolo Bonziniif iasl.found() 185940c909f5SPaolo Bonzini config_host_data.set_quoted('CONFIG_IASL', iasl.full_path()) 18605dc4618eSPaolo Bonziniendif 186116bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_BINDIR', get_option('prefix') / get_option('bindir')) 186216bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_PREFIX', get_option('prefix')) 186316bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_QEMU_CONFDIR', get_option('prefix') / qemu_confdir) 186416bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_QEMU_DATADIR', get_option('prefix') / qemu_datadir) 186516bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_QEMU_DESKTOPDIR', get_option('prefix') / qemu_desktopdir) 18668154f5e6SAkihiko Odaki 18678154f5e6SAkihiko Odakiqemu_firmwarepath = '' 18688154f5e6SAkihiko Odakiforeach k : get_option('qemu_firmwarepath') 18698154f5e6SAkihiko Odaki qemu_firmwarepath += '"' + get_option('prefix') / k + '", ' 18708154f5e6SAkihiko Odakiendforeach 18718154f5e6SAkihiko Odakiconfig_host_data.set('CONFIG_QEMU_FIRMWAREPATH', qemu_firmwarepath) 18728154f5e6SAkihiko Odaki 187316bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_QEMU_HELPERDIR', get_option('prefix') / get_option('libexecdir')) 187416bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_QEMU_ICONDIR', get_option('prefix') / qemu_icondir) 187516bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_QEMU_LOCALEDIR', get_option('prefix') / get_option('localedir')) 187616bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_QEMU_LOCALSTATEDIR', get_option('prefix') / get_option('localstatedir')) 187716bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_QEMU_MODDIR', get_option('prefix') / qemu_moddir) 187816bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_SYSCONFDIR', get_option('prefix') / get_option('sysconfdir')) 187916bf7a33SPaolo Bonzini 18806002711cSPaolo Bonziniif enable_modules 1881b0b4323eSPaolo Bonzini config_host_data.set('CONFIG_STAMP', run_command( 1882b0b4323eSPaolo Bonzini meson.current_source_dir() / 'scripts/qemu-stamp.py', 1883b0b4323eSPaolo Bonzini meson.project_version(), get_option('pkgversion'), '--', 1884b0b4323eSPaolo Bonzini meson.current_source_dir() / 'configure', 1885b0b4323eSPaolo Bonzini capture: true, check: true).stdout().strip()) 1886b0b4323eSPaolo Bonziniendif 1887b0b4323eSPaolo Bonzini 188835acbb30SPaolo Bonzinihave_slirp_smbd = get_option('slirp_smbd') \ 188935acbb30SPaolo Bonzini .require(targetos != 'windows', error_message: 'Host smbd not supported on this platform.') \ 189035acbb30SPaolo Bonzini .allowed() 189135acbb30SPaolo Bonziniif have_slirp_smbd 189235acbb30SPaolo Bonzini smbd_path = get_option('smbd') 189335acbb30SPaolo Bonzini if smbd_path == '' 189435acbb30SPaolo Bonzini smbd_path = (targetos == 'solaris' ? '/usr/sfw/sbin/smbd' : '/usr/sbin/smbd') 189535acbb30SPaolo Bonzini endif 189635acbb30SPaolo Bonzini config_host_data.set_quoted('CONFIG_SMBD_COMMAND', smbd_path) 189735acbb30SPaolo Bonziniendif 189835acbb30SPaolo Bonzini 1899823eb013SPaolo Bonziniconfig_host_data.set('HOST_' + host_arch.to_upper(), 1) 1900823eb013SPaolo Bonzini 19012cb2f580SPaolo Bonziniif get_option('module_upgrades') and not enable_modules 19022cb2f580SPaolo Bonzini error('Cannot enable module-upgrades as modules are not enabled') 19032cb2f580SPaolo Bonziniendif 19042cb2f580SPaolo Bonziniconfig_host_data.set('CONFIG_MODULE_UPGRADES', get_option('module_upgrades')) 19052cb2f580SPaolo Bonzini 1906f7f2d651SPaolo Bonziniconfig_host_data.set('CONFIG_ATTR', libattr.found()) 1907c55cf6abSPaolo Bonziniconfig_host_data.set('CONFIG_BDRV_WHITELIST_TOOLS', get_option('block_drv_whitelist_in_tools')) 19088c6d4ff4SPaolo Bonziniconfig_host_data.set('CONFIG_BRLAPI', brlapi.found()) 1909b4e312e9SPaolo Bonziniconfig_host_data.set('CONFIG_COCOA', cocoa.found()) 1910537b7248SPaolo Bonziniconfig_host_data.set('CONFIG_FUZZ', get_option('fuzzing')) 1911af2bb99bSPaolo Bonziniconfig_host_data.set('CONFIG_GCOV', get_option('b_coverage')) 1912f01496a3SPaolo Bonziniconfig_host_data.set('CONFIG_LIBUDEV', libudev.found()) 19130c32a0aeSPaolo Bonziniconfig_host_data.set('CONFIG_LZO', lzo.found()) 19146ec0e15dSPaolo Bonziniconfig_host_data.set('CONFIG_MPATH', mpathpersist.found()) 19156ec0e15dSPaolo Bonziniconfig_host_data.set('CONFIG_MPATH_NEW_API', mpathpersist_new_api) 1916fd66dbd4SStefan Hajnocziconfig_host_data.set('CONFIG_BLKIO', blkio.found()) 1917f9cd86feSPaolo Bonziniconfig_host_data.set('CONFIG_CURL', curl.found()) 19185285e593SYonggang Luoconfig_host_data.set('CONFIG_CURSES', curses.found()) 19198bc5184dSThomas Huthconfig_host_data.set('CONFIG_GBM', gbm.found()) 19207544060eSPaolo Bonziniconfig_host_data.set('CONFIG_GIO', gio.found()) 192108821ca2SPaolo Bonziniconfig_host_data.set('CONFIG_GLUSTERFS', glusterfs.found()) 192208821ca2SPaolo Bonziniif glusterfs.found() 192308821ca2SPaolo Bonzini config_host_data.set('CONFIG_GLUSTERFS_XLATOR_OPT', glusterfs.version().version_compare('>=4')) 192408821ca2SPaolo Bonzini config_host_data.set('CONFIG_GLUSTERFS_DISCARD', glusterfs.version().version_compare('>=5')) 192508821ca2SPaolo Bonzini config_host_data.set('CONFIG_GLUSTERFS_FALLOCATE', glusterfs.version().version_compare('>=6')) 192608821ca2SPaolo Bonzini config_host_data.set('CONFIG_GLUSTERFS_ZEROFILL', glusterfs.version().version_compare('>=6')) 192708821ca2SPaolo Bonzini config_host_data.set('CONFIG_GLUSTERFS_FTRUNCATE_HAS_STAT', glusterfs_ftruncate_has_stat) 192808821ca2SPaolo Bonzini config_host_data.set('CONFIG_GLUSTERFS_IOCB_HAS_STAT', glusterfs_iocb_has_stat) 192908821ca2SPaolo Bonziniendif 19301b695471SPaolo Bonziniconfig_host_data.set('CONFIG_GTK', gtk.found()) 1931c23d7b4eSPaolo Bonziniconfig_host_data.set('CONFIG_VTE', vte.found()) 193229e0bfffSClaudio Fontanaconfig_host_data.set('CONFIG_GTK_CLIPBOARD', have_gtk_clipboard) 1933f7f2d651SPaolo Bonziniconfig_host_data.set('CONFIG_LIBATTR', have_old_libattr) 1934727c8bb8SPaolo Bonziniconfig_host_data.set('CONFIG_LIBCAP_NG', libcap_ng.found()) 193546627f41SAndrew Melnychenkoconfig_host_data.set('CONFIG_EBPF', libbpf.found()) 193663a7f853SPaolo Bonziniconfig_host_data.set('CONFIG_LIBDAXCTL', libdaxctl.found()) 19379db405a3SPaolo Bonziniconfig_host_data.set('CONFIG_LIBISCSI', libiscsi.found()) 193830045c05SPaolo Bonziniconfig_host_data.set('CONFIG_LIBNFS', libnfs.found()) 1939e6a52b36SThomas Huthconfig_host_data.set('CONFIG_LIBSSH', libssh.found()) 1940ff66f3e5SPaolo Bonziniconfig_host_data.set('CONFIG_LINUX_AIO', libaio.found()) 194163a7f853SPaolo Bonziniconfig_host_data.set('CONFIG_LINUX_IO_URING', linux_io_uring.found()) 194263a7f853SPaolo Bonziniconfig_host_data.set('CONFIG_LIBPMEM', libpmem.found()) 19436002711cSPaolo Bonziniconfig_host_data.set('CONFIG_MODULES', enable_modules) 1944488a8c73SPaolo Bonziniconfig_host_data.set('CONFIG_NUMA', numa.found()) 19456bb613f0SMichal Privoznikif numa.found() 19466bb613f0SMichal Privoznik config_host_data.set('HAVE_NUMA_HAS_PREFERRED_MANY', 19476bb613f0SMichal Privoznik cc.has_function('numa_has_preferred_many', 19486bb613f0SMichal Privoznik dependencies: numa)) 19496bb613f0SMichal Privoznikendif 195088b6e618SPaolo Bonziniconfig_host_data.set('CONFIG_OPENGL', opengl.found()) 1951c55cf6abSPaolo Bonziniconfig_host_data.set('CONFIG_PROFILER', get_option('profiler')) 1952fabd1e93SPaolo Bonziniconfig_host_data.set('CONFIG_RBD', rbd.found()) 19533730a734SPaolo Bonziniconfig_host_data.set('CONFIG_RDMA', rdma.found()) 195435be72baSPaolo Bonziniconfig_host_data.set('CONFIG_SDL', sdl.found()) 195535be72baSPaolo Bonziniconfig_host_data.set('CONFIG_SDL_IMAGE', sdl_image.found()) 195690835c2bSPaolo Bonziniconfig_host_data.set('CONFIG_SECCOMP', seccomp.found()) 195773422d95SMichal Privoznikif seccomp.found() 195873422d95SMichal Privoznik config_host_data.set('CONFIG_SECCOMP_SYSRAWRC', seccomp_has_sysrawrc) 195973422d95SMichal Privoznikendif 1960241611eaSPaolo Bonziniconfig_host_data.set('CONFIG_SNAPPY', snappy.found()) 19610d04c4c9SPaolo Bonziniconfig_host_data.set('CONFIG_TPM', have_tpm) 196234f983d8SPaolo Bonziniconfig_host_data.set('CONFIG_TSAN', get_option('tsan')) 196390540f32SPaolo Bonziniconfig_host_data.set('CONFIG_USB_LIBUSB', libusb.found()) 1964e1723999SPaolo Bonziniconfig_host_data.set('CONFIG_VDE', vde.found()) 19652df89d54SPaolo Bonziniconfig_host_data.set('CONFIG_VHOST_NET', have_vhost_net) 19662df89d54SPaolo Bonziniconfig_host_data.set('CONFIG_VHOST_NET_USER', have_vhost_net_user) 19672df89d54SPaolo Bonziniconfig_host_data.set('CONFIG_VHOST_NET_VDPA', have_vhost_net_vdpa) 19682df89d54SPaolo Bonziniconfig_host_data.set('CONFIG_VHOST_KERNEL', have_vhost_kernel) 19692df89d54SPaolo Bonziniconfig_host_data.set('CONFIG_VHOST_USER', have_vhost_user) 19702df89d54SPaolo Bonziniconfig_host_data.set('CONFIG_VHOST_CRYPTO', have_vhost_user_crypto) 19712df89d54SPaolo Bonziniconfig_host_data.set('CONFIG_VHOST_VDPA', have_vhost_vdpa) 1972e2c1d78dSVladislav Yaroshchukconfig_host_data.set('CONFIG_VMNET', vmnet.found()) 1973e5e856c1SStefan Hajnocziconfig_host_data.set('CONFIG_VHOST_USER_BLK_SERVER', have_vhost_user_blk_server) 19742a2359b8SXie Yongjiconfig_host_data.set('CONFIG_VDUSE_BLK_EXPORT', have_vduse_blk_export) 197595f8510eSKshitij Suriconfig_host_data.set('CONFIG_PNG', png.found()) 1976a0b93237SPaolo Bonziniconfig_host_data.set('CONFIG_VNC', vnc.found()) 1977a0b93237SPaolo Bonziniconfig_host_data.set('CONFIG_VNC_JPEG', jpeg.found()) 1978a0b93237SPaolo Bonziniconfig_host_data.set('CONFIG_VNC_SASL', sasl.found()) 197969202b40SPaolo Bonziniconfig_host_data.set('CONFIG_VIRTFS', have_virtfs) 198063a7f853SPaolo Bonziniconfig_host_data.set('CONFIG_VTE', vte.found()) 19814113f4cfSLaurent Vivierconfig_host_data.set('CONFIG_XKBCOMMON', xkbcommon.found()) 1982af04e89dSMarc-André Lureauconfig_host_data.set('CONFIG_KEYUTILS', keyutils.found()) 19833909def8SMarc-André Lureauconfig_host_data.set('CONFIG_GETTID', has_gettid) 198457612511SPaolo Bonziniconfig_host_data.set('CONFIG_GNUTLS', gnutls.found()) 1985cc4c7c73SDaniel P. Berrangéconfig_host_data.set('CONFIG_GNUTLS_CRYPTO', gnutls_crypto.found()) 1986d47b83b1SDaniel P. Berrangéconfig_host_data.set('CONFIG_TASN1', tasn1.found()) 198757612511SPaolo Bonziniconfig_host_data.set('CONFIG_GCRYPT', gcrypt.found()) 198857612511SPaolo Bonziniconfig_host_data.set('CONFIG_NETTLE', nettle.found()) 19894c5e512eSLei Heconfig_host_data.set('CONFIG_HOGWEED', hogweed.found()) 199057612511SPaolo Bonziniconfig_host_data.set('CONFIG_QEMU_PRIVATE_XTS', xts == 'private') 1991aa087962SPaolo Bonziniconfig_host_data.set('CONFIG_MALLOC_TRIM', has_malloc_trim) 199284e319a5SMax Reitzconfig_host_data.set('CONFIG_STATX', has_statx) 19934ce7a08dSHanna Reitzconfig_host_data.set('CONFIG_STATX_MNT_ID', has_statx_mnt_id) 1994b1def33dSPaolo Bonziniconfig_host_data.set('CONFIG_ZSTD', zstd.found()) 1995a484a719SMax Reitzconfig_host_data.set('CONFIG_FUSE', fuse.found()) 1996df4ea709SMax Reitzconfig_host_data.set('CONFIG_FUSE_LSEEK', fuse_lseek.found()) 19973f0a5d55SMarc-André Lureauconfig_host_data.set('CONFIG_SPICE_PROTOCOL', spice_protocol.found()) 1998ddece465SMarc-André Lureauif spice_protocol.found() 1999ddece465SMarc-André Lureauconfig_host_data.set('CONFIG_SPICE_PROTOCOL_MAJOR', spice_protocol.version().split('.')[0]) 2000ddece465SMarc-André Lureauconfig_host_data.set('CONFIG_SPICE_PROTOCOL_MINOR', spice_protocol.version().split('.')[1]) 2001ddece465SMarc-André Lureauconfig_host_data.set('CONFIG_SPICE_PROTOCOL_MICRO', spice_protocol.version().split('.')[2]) 2002ddece465SMarc-André Lureauendif 20033f0a5d55SMarc-André Lureauconfig_host_data.set('CONFIG_SPICE', spice.found()) 20049d71037fSPaolo Bonziniconfig_host_data.set('CONFIG_X11', x11.found()) 2005142ca628SMarc-André Lureauconfig_host_data.set('CONFIG_DBUS_DISPLAY', dbus_display) 20069e62ba48SDaniele Buonoconfig_host_data.set('CONFIG_CFI', get_option('cfi')) 20073d212b41SRichard W.M. Jonesconfig_host_data.set('CONFIG_SELINUX', selinux.found()) 200814efd8d3SPaolo Bonziniconfig_host_data.set('CONFIG_XEN_BACKEND', xen.found()) 20097c10cb38SIlya Leoshkevichconfig_host_data.set('CONFIG_LIBDW', libdw.found()) 201014efd8d3SPaolo Bonziniif xen.found() 201114efd8d3SPaolo Bonzini # protect from xen.version() having less than three components 201214efd8d3SPaolo Bonzini xen_version = xen.version().split('.') + ['0', '0'] 201314efd8d3SPaolo Bonzini xen_ctrl_version = xen_version[0] + \ 201414efd8d3SPaolo Bonzini ('0' + xen_version[1]).substring(-2) + \ 201514efd8d3SPaolo Bonzini ('0' + xen_version[2]).substring(-2) 201614efd8d3SPaolo Bonzini config_host_data.set('CONFIG_XEN_CTRL_INTERFACE_VERSION', xen_ctrl_version) 201714efd8d3SPaolo Bonziniendif 2018859aef02SPaolo Bonziniconfig_host_data.set('QEMU_VERSION', '"@0@"'.format(meson.project_version())) 2019859aef02SPaolo Bonziniconfig_host_data.set('QEMU_VERSION_MAJOR', meson.project_version().split('.')[0]) 2020859aef02SPaolo Bonziniconfig_host_data.set('QEMU_VERSION_MINOR', meson.project_version().split('.')[1]) 2021859aef02SPaolo Bonziniconfig_host_data.set('QEMU_VERSION_MICRO', meson.project_version().split('.')[2]) 2022859aef02SPaolo Bonzini 2023a6305081SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_HOST_DSOSUF', host_dsosuf) 202469d8de7aSPaolo Bonziniconfig_host_data.set('HAVE_HOST_BLOCK_DEVICE', have_host_block_device) 202569d8de7aSPaolo Bonzini 2026728c0a2fSPaolo Bonzinihave_coroutine_pool = get_option('coroutine_pool') 2027728c0a2fSPaolo Bonziniif get_option('debug_stack_usage') and have_coroutine_pool 2028728c0a2fSPaolo Bonzini message('Disabling coroutine pool to measure stack usage') 2029728c0a2fSPaolo Bonzini have_coroutine_pool = false 2030728c0a2fSPaolo Bonziniendif 2031728c0a2fSPaolo Bonziniconfig_host_data.set10('CONFIG_COROUTINE_POOL', have_coroutine_pool) 203258a2e3f5SStefan Hajnocziconfig_host_data.set('CONFIG_DEBUG_GRAPH_LOCK', get_option('debug_graph_lock')) 2033c55cf6abSPaolo Bonziniconfig_host_data.set('CONFIG_DEBUG_MUTEX', get_option('debug_mutex')) 2034728c0a2fSPaolo Bonziniconfig_host_data.set('CONFIG_DEBUG_STACK_USAGE', get_option('debug_stack_usage')) 2035c55cf6abSPaolo Bonziniconfig_host_data.set('CONFIG_GPROF', get_option('gprof')) 2036406523f6SPaolo Bonziniconfig_host_data.set('CONFIG_LIVE_BLOCK_MIGRATION', get_option('live_block_migration').allowed()) 2037c55cf6abSPaolo Bonziniconfig_host_data.set('CONFIG_QOM_CAST_DEBUG', get_option('qom_cast_debug')) 2038abad185cSJuan Quintelaconfig_host_data.set('CONFIG_REPLICATION', get_option('replication').allowed()) 2039406523f6SPaolo Bonzini 204069d8de7aSPaolo Bonzini# has_header 2041e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_EPOLL', cc.has_header('sys/epoll.h')) 2042d47a8b3bSPaolo Bonziniconfig_host_data.set('CONFIG_LINUX_MAGIC_H', cc.has_header('linux/magic.h')) 2043d47a8b3bSPaolo Bonziniconfig_host_data.set('CONFIG_VALGRIND_H', cc.has_header('valgrind/valgrind.h')) 204448f670ecSThomas Huthconfig_host_data.set('HAVE_BTRFS_H', cc.has_header('linux/btrfs.h')) 20452964be52SThomas Huthconfig_host_data.set('HAVE_DRM_H', cc.has_header('libdrm/drm.h')) 20462802d91dSThomas Huthconfig_host_data.set('HAVE_PTY_H', cc.has_header('pty.h')) 204769d8de7aSPaolo Bonziniconfig_host_data.set('HAVE_SYS_DISK_H', cc.has_header('sys/disk.h')) 2048ded5d78cSThomas Huthconfig_host_data.set('HAVE_SYS_IOCCOM_H', cc.has_header('sys/ioccom.h')) 20494a9d5f89SThomas Huthconfig_host_data.set('HAVE_SYS_KCOV_H', cc.has_header('sys/kcov.h')) 2050d409373bSBin Mengif targetos == 'windows' 2051d409373bSBin Meng config_host_data.set('HAVE_AFUNIX_H', cc.has_header('afunix.h')) 2052d409373bSBin Mengendif 2053ded5d78cSThomas Huth 205469d8de7aSPaolo Bonzini# has_function 2055c891c24bSClaudio Imbrendaconfig_host_data.set('CONFIG_CLOSE_RANGE', cc.has_function('close_range')) 2056a620fbe9SPaolo Bonziniconfig_host_data.set('CONFIG_ACCEPT4', cc.has_function('accept4')) 2057e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_CLOCK_ADJTIME', cc.has_function('clock_adjtime')) 2058e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_DUP3', cc.has_function('dup3')) 2059e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_FALLOCATE', cc.has_function('fallocate')) 2060e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_POSIX_FALLOCATE', cc.has_function('posix_fallocate')) 20618698343bSPeter Maydell# Note that we need to specify prefix: here to avoid incorrectly 20628698343bSPeter Maydell# thinking that Windows has posix_memalign() 20638698343bSPeter Maydellconfig_host_data.set('CONFIG_POSIX_MEMALIGN', cc.has_function('posix_memalign', prefix: '#include <stdlib.h>')) 20645c8c714aSPeter Maydellconfig_host_data.set('CONFIG_ALIGNED_MALLOC', cc.has_function('_aligned_malloc')) 206588454f84SPeter Maydellconfig_host_data.set('CONFIG_VALLOC', cc.has_function('valloc')) 206688454f84SPeter Maydellconfig_host_data.set('CONFIG_MEMALIGN', cc.has_function('memalign')) 2067e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_PPOLL', cc.has_function('ppoll')) 20682b9f74efSPeter Maydellconfig_host_data.set('CONFIG_PREADV', cc.has_function('preadv', prefix: '#include <sys/uio.h>')) 2069029ed1bdSKeno Fischerconfig_host_data.set('CONFIG_PTHREAD_FCHDIR_NP', cc.has_function('pthread_fchdir_np')) 2070e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_SENDFILE', cc.has_function('sendfile')) 2071e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_SETNS', cc.has_function('setns') and cc.has_function('unshare')) 2072e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_SYNCFS', cc.has_function('syncfs')) 2073e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_SYNC_FILE_RANGE', cc.has_function('sync_file_range')) 2074e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_TIMERFD', cc.has_function('timerfd_create')) 2075be7e89f6SPaolo Bonziniconfig_host_data.set('HAVE_COPY_FILE_RANGE', cc.has_function('copy_file_range')) 207659e35c7bSAndrew Deasonconfig_host_data.set('HAVE_GETIFADDRS', cc.has_function('getifaddrs')) 2077fc9a809eSPaolo Bonziniconfig_host_data.set('HAVE_GLIB_WITH_SLICE_ALLOCATOR', glib_has_gslice) 2078e66420acSPaolo Bonziniconfig_host_data.set('HAVE_OPENPTY', cc.has_function('openpty', dependencies: util)) 2079ed3b3f17SPaolo Bonziniconfig_host_data.set('HAVE_STRCHRNUL', cc.has_function('strchrnul')) 208069d8de7aSPaolo Bonziniconfig_host_data.set('HAVE_SYSTEM_FUNCTION', cc.has_function('system', prefix: '#include <stdlib.h>')) 208166dc5f96SStefano Garzarellaif rbd.found() 208266dc5f96SStefano Garzarella config_host_data.set('HAVE_RBD_NAMESPACE_EXISTS', 208366dc5f96SStefano Garzarella cc.has_function('rbd_namespace_exists', 208466dc5f96SStefano Garzarella dependencies: rbd, 208566dc5f96SStefano Garzarella prefix: '#include <rbd/librbd.h>')) 208666dc5f96SStefano Garzarellaendif 2087911965acSLi Zhijianif rdma.found() 2088911965acSLi Zhijian config_host_data.set('HAVE_IBV_ADVISE_MR', 2089911965acSLi Zhijian cc.has_function('ibv_advise_mr', 20903730a734SPaolo Bonzini dependencies: rdma, 2091911965acSLi Zhijian prefix: '#include <infiniband/verbs.h>')) 2092911965acSLi Zhijianendif 20932b9f74efSPeter Maydell 209434f983d8SPaolo Bonzinihave_asan_fiber = false 209534f983d8SPaolo Bonziniif get_option('sanitizers') and \ 209634f983d8SPaolo Bonzini not cc.has_function('__sanitizer_start_switch_fiber', 209734f983d8SPaolo Bonzini args: '-fsanitize=address', 209834f983d8SPaolo Bonzini prefix: '#include <sanitizer/asan_interface.h>') 209934f983d8SPaolo Bonzini warning('Missing ASAN due to missing fiber annotation interface') 210034f983d8SPaolo Bonzini warning('Without code annotation, the report may be inferior.') 210134f983d8SPaolo Bonzinielse 210234f983d8SPaolo Bonzini have_asan_fiber = true 210334f983d8SPaolo Bonziniendif 210434f983d8SPaolo Bonziniconfig_host_data.set('CONFIG_ASAN_IFACE_FIBER', have_asan_fiber) 210534f983d8SPaolo Bonzini 2106e66420acSPaolo Bonzini# has_header_symbol 21076d43eaa3SSam Liconfig_host_data.set('CONFIG_BLKZONED', 21086d43eaa3SSam Li cc.has_header_symbol('linux/blkzoned.h', 'BLKOPENZONE')) 2109e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_EPOLL_CREATE1', 2110e66420acSPaolo Bonzini cc.has_header_symbol('sys/epoll.h', 'epoll_create1')) 2111e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_FALLOCATE_PUNCH_HOLE', 2112e66420acSPaolo Bonzini cc.has_header_symbol('linux/falloc.h', 'FALLOC_FL_PUNCH_HOLE') and 2113e66420acSPaolo Bonzini cc.has_header_symbol('linux/falloc.h', 'FALLOC_FL_KEEP_SIZE')) 2114e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_FALLOCATE_ZERO_RANGE', 2115e66420acSPaolo Bonzini cc.has_header_symbol('linux/falloc.h', 'FALLOC_FL_ZERO_RANGE')) 2116e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_FIEMAP', 2117e66420acSPaolo Bonzini cc.has_header('linux/fiemap.h') and 2118e66420acSPaolo Bonzini cc.has_header_symbol('linux/fs.h', 'FS_IOC_FIEMAP')) 2119be7e89f6SPaolo Bonziniconfig_host_data.set('CONFIG_GETRANDOM', 2120be7e89f6SPaolo Bonzini cc.has_function('getrandom') and 2121be7e89f6SPaolo Bonzini cc.has_header_symbol('sys/random.h', 'GRND_NONBLOCK')) 2122a620fbe9SPaolo Bonziniconfig_host_data.set('CONFIG_INOTIFY', 2123a620fbe9SPaolo Bonzini cc.has_header_symbol('sys/inotify.h', 'inotify_init')) 2124a620fbe9SPaolo Bonziniconfig_host_data.set('CONFIG_INOTIFY1', 2125a620fbe9SPaolo Bonzini cc.has_header_symbol('sys/inotify.h', 'inotify_init1')) 2126e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_PRCTL_PR_SET_TIMERSLACK', 2127e66420acSPaolo Bonzini cc.has_header_symbol('sys/prctl.h', 'PR_SET_TIMERSLACK')) 2128be7e89f6SPaolo Bonziniconfig_host_data.set('CONFIG_RTNETLINK', 2129be7e89f6SPaolo Bonzini cc.has_header_symbol('linux/rtnetlink.h', 'IFLA_PROTO_DOWN')) 2130be7e89f6SPaolo Bonziniconfig_host_data.set('CONFIG_SYSMACROS', 2131be7e89f6SPaolo Bonzini cc.has_header_symbol('sys/sysmacros.h', 'makedev')) 2132e1fbd2c4SPaolo Bonziniconfig_host_data.set('HAVE_OPTRESET', 2133e1fbd2c4SPaolo Bonzini cc.has_header_symbol('getopt.h', 'optreset')) 2134653163fcSMarc-André Lureauconfig_host_data.set('HAVE_IPPROTO_MPTCP', 2135653163fcSMarc-André Lureau cc.has_header_symbol('netinet/in.h', 'IPPROTO_MPTCP')) 2136e66420acSPaolo Bonzini 2137e66420acSPaolo Bonzini# has_member 2138e66420acSPaolo Bonziniconfig_host_data.set('HAVE_SIGEV_NOTIFY_THREAD_ID', 2139e66420acSPaolo Bonzini cc.has_member('struct sigevent', 'sigev_notify_thread_id', 2140e66420acSPaolo Bonzini prefix: '#include <signal.h>')) 2141ed3b3f17SPaolo Bonziniconfig_host_data.set('HAVE_STRUCT_STAT_ST_ATIM', 2142ed3b3f17SPaolo Bonzini cc.has_member('struct stat', 'st_atim', 2143ed3b3f17SPaolo Bonzini prefix: '#include <sys/stat.h>')) 21446d43eaa3SSam Liconfig_host_data.set('HAVE_BLK_ZONE_REP_CAPACITY', 21456d43eaa3SSam Li cc.has_member('struct blk_zone', 'capacity', 21466d43eaa3SSam Li prefix: '#include <linux/blkzoned.h>')) 2147e66420acSPaolo Bonzini 21486a23f819SPaolo Bonzini# has_type 21496a23f819SPaolo Bonziniconfig_host_data.set('CONFIG_IOVEC', 21506a23f819SPaolo Bonzini cc.has_type('struct iovec', 21516a23f819SPaolo Bonzini prefix: '#include <sys/uio.h>')) 21526a23f819SPaolo Bonziniconfig_host_data.set('HAVE_UTMPX', 21536a23f819SPaolo Bonzini cc.has_type('struct utmpx', 21546a23f819SPaolo Bonzini prefix: '#include <utmpx.h>')) 21556a23f819SPaolo Bonzini 2156904ad5ecSPaolo Bonziniconfig_host_data.set('CONFIG_EVENTFD', cc.links(''' 2157e1fbd2c4SPaolo Bonzini #include <sys/eventfd.h> 2158e1fbd2c4SPaolo Bonzini int main(void) { return eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC); }''')) 2159904ad5ecSPaolo Bonziniconfig_host_data.set('CONFIG_FDATASYNC', cc.links(gnu_source_prefix + ''' 2160e1fbd2c4SPaolo Bonzini #include <unistd.h> 2161e1fbd2c4SPaolo Bonzini int main(void) { 2162e1fbd2c4SPaolo Bonzini #if defined(_POSIX_SYNCHRONIZED_IO) && _POSIX_SYNCHRONIZED_IO > 0 2163e1fbd2c4SPaolo Bonzini return fdatasync(0); 2164e1fbd2c4SPaolo Bonzini #else 2165e1fbd2c4SPaolo Bonzini #error Not supported 2166e1fbd2c4SPaolo Bonzini #endif 2167e1fbd2c4SPaolo Bonzini }''')) 21688900c204SAndrew Deason 21698900c204SAndrew Deasonhas_madvise = cc.links(gnu_source_prefix + ''' 2170e1fbd2c4SPaolo Bonzini #include <sys/types.h> 2171e1fbd2c4SPaolo Bonzini #include <sys/mman.h> 2172e1fbd2c4SPaolo Bonzini #include <stddef.h> 21738900c204SAndrew Deason int main(void) { return madvise(NULL, 0, MADV_DONTNEED); }''') 21748900c204SAndrew Deasonmissing_madvise_proto = false 21758900c204SAndrew Deasonif has_madvise 21768900c204SAndrew Deason # Some platforms (illumos and Solaris before Solaris 11) provide madvise() 21778900c204SAndrew Deason # but forget to prototype it. In this case, has_madvise will be true (the 21788900c204SAndrew Deason # test program links despite a compile warning). To detect the 21798900c204SAndrew Deason # missing-prototype case, we try again with a definitely-bogus prototype. 21808900c204SAndrew Deason # This will only compile if the system headers don't provide the prototype; 21818900c204SAndrew Deason # otherwise the conflicting prototypes will cause a compiler error. 21828900c204SAndrew Deason missing_madvise_proto = cc.links(gnu_source_prefix + ''' 21838900c204SAndrew Deason #include <sys/types.h> 21848900c204SAndrew Deason #include <sys/mman.h> 21858900c204SAndrew Deason #include <stddef.h> 21868900c204SAndrew Deason extern int madvise(int); 21878900c204SAndrew Deason int main(void) { return madvise(0); }''') 21888900c204SAndrew Deasonendif 21898900c204SAndrew Deasonconfig_host_data.set('CONFIG_MADVISE', has_madvise) 21908900c204SAndrew Deasonconfig_host_data.set('HAVE_MADVISE_WITHOUT_PROTOTYPE', missing_madvise_proto) 21918900c204SAndrew Deason 2192904ad5ecSPaolo Bonziniconfig_host_data.set('CONFIG_MEMFD', cc.links(gnu_source_prefix + ''' 2193e1fbd2c4SPaolo Bonzini #include <sys/mman.h> 2194e1fbd2c4SPaolo Bonzini int main(void) { return memfd_create("foo", MFD_ALLOW_SEALING); }''')) 2195904ad5ecSPaolo Bonziniconfig_host_data.set('CONFIG_OPEN_BY_HANDLE', cc.links(gnu_source_prefix + ''' 2196d47a8b3bSPaolo Bonzini #include <fcntl.h> 2197d47a8b3bSPaolo Bonzini #if !defined(AT_EMPTY_PATH) 2198d47a8b3bSPaolo Bonzini # error missing definition 2199d47a8b3bSPaolo Bonzini #else 2200d47a8b3bSPaolo Bonzini int main(void) { struct file_handle fh; return open_by_handle_at(0, &fh, 0); } 2201d47a8b3bSPaolo Bonzini #endif''')) 2202904ad5ecSPaolo Bonziniconfig_host_data.set('CONFIG_POSIX_MADVISE', cc.links(gnu_source_prefix + ''' 2203e1fbd2c4SPaolo Bonzini #include <sys/mman.h> 2204e1fbd2c4SPaolo Bonzini #include <stddef.h> 2205e1fbd2c4SPaolo Bonzini int main(void) { return posix_madvise(NULL, 0, POSIX_MADV_DONTNEED); }''')) 220610f6b231SPaolo Bonzini 22076a23f819SPaolo Bonziniconfig_host_data.set('CONFIG_PTHREAD_SETNAME_NP_W_TID', cc.links(gnu_source_prefix + ''' 220810f6b231SPaolo Bonzini #include <pthread.h> 220910f6b231SPaolo Bonzini 221010f6b231SPaolo Bonzini static void *f(void *p) { return NULL; } 221110f6b231SPaolo Bonzini int main(void) 221210f6b231SPaolo Bonzini { 221310f6b231SPaolo Bonzini pthread_t thread; 221410f6b231SPaolo Bonzini pthread_create(&thread, 0, f, 0); 221510f6b231SPaolo Bonzini pthread_setname_np(thread, "QEMU"); 221610f6b231SPaolo Bonzini return 0; 221710f6b231SPaolo Bonzini }''', dependencies: threads)) 22186a23f819SPaolo Bonziniconfig_host_data.set('CONFIG_PTHREAD_SETNAME_NP_WO_TID', cc.links(gnu_source_prefix + ''' 221910f6b231SPaolo Bonzini #include <pthread.h> 222010f6b231SPaolo Bonzini 222110f6b231SPaolo Bonzini static void *f(void *p) { pthread_setname_np("QEMU"); return NULL; } 222210f6b231SPaolo Bonzini int main(void) 222310f6b231SPaolo Bonzini { 222410f6b231SPaolo Bonzini pthread_t thread; 222510f6b231SPaolo Bonzini pthread_create(&thread, 0, f, 0); 222610f6b231SPaolo Bonzini return 0; 222710f6b231SPaolo Bonzini }''', dependencies: threads)) 22283ada67a3SBrad Smithconfig_host_data.set('CONFIG_PTHREAD_SET_NAME_NP', cc.links(gnu_source_prefix + ''' 22293ada67a3SBrad Smith #include <pthread.h> 22303ada67a3SBrad Smith #include <pthread_np.h> 22313ada67a3SBrad Smith 22323ada67a3SBrad Smith static void *f(void *p) { return NULL; } 22333ada67a3SBrad Smith int main(void) 22343ada67a3SBrad Smith { 22353ada67a3SBrad Smith pthread_t thread; 22363ada67a3SBrad Smith pthread_create(&thread, 0, f, 0); 22373ada67a3SBrad Smith pthread_set_name_np(thread, "QEMU"); 22383ada67a3SBrad Smith return 0; 22393ada67a3SBrad Smith }''', dependencies: threads)) 2240657ac98bSLongpeng(Mike)config_host_data.set('CONFIG_PTHREAD_CONDATTR_SETCLOCK', cc.links(gnu_source_prefix + ''' 2241657ac98bSLongpeng(Mike) #include <pthread.h> 2242657ac98bSLongpeng(Mike) #include <time.h> 2243657ac98bSLongpeng(Mike) 2244657ac98bSLongpeng(Mike) int main(void) 2245657ac98bSLongpeng(Mike) { 2246657ac98bSLongpeng(Mike) pthread_condattr_t attr 2247657ac98bSLongpeng(Mike) pthread_condattr_init(&attr); 2248657ac98bSLongpeng(Mike) pthread_condattr_setclock(&attr, CLOCK_MONOTONIC); 2249657ac98bSLongpeng(Mike) return 0; 2250657ac98bSLongpeng(Mike) }''', dependencies: threads)) 22517730f32cSDavid Hildenbrandconfig_host_data.set('CONFIG_PTHREAD_AFFINITY_NP', cc.links(gnu_source_prefix + ''' 22527730f32cSDavid Hildenbrand #include <pthread.h> 225310f6b231SPaolo Bonzini 22547730f32cSDavid Hildenbrand static void *f(void *p) { return NULL; } 22557730f32cSDavid Hildenbrand int main(void) 22567730f32cSDavid Hildenbrand { 22577730f32cSDavid Hildenbrand int setsize = CPU_ALLOC_SIZE(64); 22587730f32cSDavid Hildenbrand pthread_t thread; 22597730f32cSDavid Hildenbrand cpu_set_t *cpuset; 22607730f32cSDavid Hildenbrand pthread_create(&thread, 0, f, 0); 22617730f32cSDavid Hildenbrand cpuset = CPU_ALLOC(64); 22627730f32cSDavid Hildenbrand CPU_ZERO_S(setsize, cpuset); 22637730f32cSDavid Hildenbrand pthread_setaffinity_np(thread, setsize, cpuset); 22647730f32cSDavid Hildenbrand pthread_getaffinity_np(thread, setsize, cpuset); 22657730f32cSDavid Hildenbrand CPU_FREE(cpuset); 22667730f32cSDavid Hildenbrand return 0; 22677730f32cSDavid Hildenbrand }''', dependencies: threads)) 2268904ad5ecSPaolo Bonziniconfig_host_data.set('CONFIG_SIGNALFD', cc.links(gnu_source_prefix + ''' 22696bd17dccSKacper Słomiński #include <sys/signalfd.h> 22706bd17dccSKacper Słomiński #include <stddef.h> 22716bd17dccSKacper Słomiński int main(void) { return signalfd(-1, NULL, SFD_CLOEXEC); }''')) 2272904ad5ecSPaolo Bonziniconfig_host_data.set('CONFIG_SPLICE', cc.links(gnu_source_prefix + ''' 2273a620fbe9SPaolo Bonzini #include <unistd.h> 2274a620fbe9SPaolo Bonzini #include <fcntl.h> 2275a620fbe9SPaolo Bonzini #include <limits.h> 2276a620fbe9SPaolo Bonzini 2277a620fbe9SPaolo Bonzini int main(void) 2278a620fbe9SPaolo Bonzini { 2279a620fbe9SPaolo Bonzini int len, fd = 0; 2280a620fbe9SPaolo Bonzini len = tee(STDIN_FILENO, STDOUT_FILENO, INT_MAX, SPLICE_F_NONBLOCK); 2281a620fbe9SPaolo Bonzini splice(STDIN_FILENO, NULL, fd, NULL, len, SPLICE_F_MOVE); 2282a620fbe9SPaolo Bonzini return 0; 2283a620fbe9SPaolo Bonzini }''')) 2284e1fbd2c4SPaolo Bonzini 228596a63aebSPaolo Bonziniconfig_host_data.set('HAVE_MLOCKALL', cc.links(gnu_source_prefix + ''' 228696a63aebSPaolo Bonzini #include <sys/mman.h> 2287b5d3dac1SPaolo Bonzini int main(void) { 228896a63aebSPaolo Bonzini return mlockall(MCL_FUTURE); 228996a63aebSPaolo Bonzini }''')) 229096a63aebSPaolo Bonzini 2291eea9453aSThomas Huthhave_l2tpv3 = false 229243a363aeSPaolo Bonziniif get_option('l2tpv3').allowed() and have_system 22936a23f819SPaolo Bonzini have_l2tpv3 = cc.has_type('struct mmsghdr', 22946a23f819SPaolo Bonzini prefix: gnu_source_prefix + ''' 22956a23f819SPaolo Bonzini #include <sys/socket.h> 22966a23f819SPaolo Bonzini #include <linux/ip.h>''') 2297eea9453aSThomas Huthendif 2298eea9453aSThomas Huthconfig_host_data.set('CONFIG_L2TPV3', have_l2tpv3) 2299eea9453aSThomas Huth 2300837b84b1SPaolo Bonzinihave_netmap = false 230143a363aeSPaolo Bonziniif get_option('netmap').allowed() and have_system 2302837b84b1SPaolo Bonzini have_netmap = cc.compiles(''' 2303837b84b1SPaolo Bonzini #include <inttypes.h> 2304837b84b1SPaolo Bonzini #include <net/if.h> 2305837b84b1SPaolo Bonzini #include <net/netmap.h> 2306837b84b1SPaolo Bonzini #include <net/netmap_user.h> 2307837b84b1SPaolo Bonzini #if (NETMAP_API < 11) || (NETMAP_API > 15) 2308837b84b1SPaolo Bonzini #error 2309837b84b1SPaolo Bonzini #endif 2310837b84b1SPaolo Bonzini int main(void) { return 0; }''') 2311837b84b1SPaolo Bonzini if not have_netmap and get_option('netmap').enabled() 2312837b84b1SPaolo Bonzini error('Netmap headers not available') 2313837b84b1SPaolo Bonzini endif 2314837b84b1SPaolo Bonziniendif 2315837b84b1SPaolo Bonziniconfig_host_data.set('CONFIG_NETMAP', have_netmap) 2316837b84b1SPaolo Bonzini 231796a63aebSPaolo Bonzini# Work around a system header bug with some kernel/XFS header 231896a63aebSPaolo Bonzini# versions where they both try to define 'struct fsxattr': 231996a63aebSPaolo Bonzini# xfs headers will not try to redefine structs from linux headers 232096a63aebSPaolo Bonzini# if this macro is set. 232196a63aebSPaolo Bonziniconfig_host_data.set('HAVE_FSXATTR', cc.links(''' 23226a23f819SPaolo Bonzini #include <linux/fs.h> 232396a63aebSPaolo Bonzini struct fsxattr foo; 232496a63aebSPaolo Bonzini int main(void) { 232596a63aebSPaolo Bonzini return 0; 232696a63aebSPaolo Bonzini }''')) 232796a63aebSPaolo Bonzini 2328e46bd55dSPaolo Bonzini# Some versions of Mac OS X incorrectly define SIZE_MAX 2329e46bd55dSPaolo Bonziniconfig_host_data.set('HAVE_BROKEN_SIZE_MAX', not cc.compiles(''' 2330e46bd55dSPaolo Bonzini #include <stdint.h> 2331e46bd55dSPaolo Bonzini #include <stdio.h> 2332b5d3dac1SPaolo Bonzini int main(void) { 2333e46bd55dSPaolo Bonzini return printf("%zu", SIZE_MAX); 2334e46bd55dSPaolo Bonzini }''', args: ['-Werror'])) 2335e46bd55dSPaolo Bonzini 2336e61f1efeSRichard Henderson# See if 64-bit atomic operations are supported. 2337e61f1efeSRichard Henderson# Note that without __atomic builtins, we can only 2338e61f1efeSRichard Henderson# assume atomic loads/stores max at pointer size. 2339e61f1efeSRichard Hendersonconfig_host_data.set('CONFIG_ATOMIC64', cc.links(''' 2340bd87a367SPaolo Bonzini #include <stdint.h> 2341bd87a367SPaolo Bonzini int main(void) 2342bd87a367SPaolo Bonzini { 2343e61f1efeSRichard Henderson uint64_t x = 0, y = 0; 2344bd87a367SPaolo Bonzini y = __atomic_load_n(&x, __ATOMIC_RELAXED); 2345bd87a367SPaolo Bonzini __atomic_store_n(&x, y, __ATOMIC_RELAXED); 2346bd87a367SPaolo Bonzini __atomic_compare_exchange_n(&x, &y, x, 0, __ATOMIC_RELAXED, __ATOMIC_RELAXED); 2347bd87a367SPaolo Bonzini __atomic_exchange_n(&x, y, __ATOMIC_RELAXED); 2348bd87a367SPaolo Bonzini __atomic_fetch_add(&x, y, __ATOMIC_RELAXED); 2349bd87a367SPaolo Bonzini return 0; 2350e61f1efeSRichard Henderson }''')) 2351bd87a367SPaolo Bonzini 2352848126d1SMarc-André Lureauhas_int128 = cc.links(''' 2353848126d1SMarc-André Lureau __int128_t a; 2354848126d1SMarc-André Lureau __uint128_t b; 2355848126d1SMarc-André Lureau int main (void) { 2356848126d1SMarc-André Lureau a = a + b; 2357848126d1SMarc-André Lureau b = a * b; 2358848126d1SMarc-André Lureau a = a * a; 2359848126d1SMarc-André Lureau return 0; 2360848126d1SMarc-André Lureau }''') 2361848126d1SMarc-André Lureau 2362848126d1SMarc-André Lureauconfig_host_data.set('CONFIG_INT128', has_int128) 2363848126d1SMarc-André Lureau 2364848126d1SMarc-André Lureauif has_int128 2365d2958fb0SMarc-André Lureau # "do we have 128-bit atomics which are handled inline and specifically not 2366d2958fb0SMarc-André Lureau # via libatomic". The reason we can't use libatomic is documented in the 2367d2958fb0SMarc-André Lureau # comment starting "GCC is a house divided" in include/qemu/atomic128.h. 2368e61f1efeSRichard Henderson # We only care about these operations on 16-byte aligned pointers, so 2369e61f1efeSRichard Henderson # force 16-byte alignment of the pointer, which may be greater than 2370e61f1efeSRichard Henderson # __alignof(unsigned __int128) for the host. 2371e61f1efeSRichard Henderson atomic_test_128 = ''' 2372e61f1efeSRichard Henderson int main(int ac, char **av) { 2373e61f1efeSRichard Henderson unsigned __int128 *p = __builtin_assume_aligned(av[ac - 1], sizeof(16)); 2374e61f1efeSRichard Henderson p[1] = __atomic_load_n(&p[0], __ATOMIC_RELAXED); 2375e61f1efeSRichard Henderson __atomic_store_n(&p[2], p[3], __ATOMIC_RELAXED); 2376e61f1efeSRichard Henderson __atomic_compare_exchange_n(&p[4], &p[5], p[6], 0, __ATOMIC_RELAXED, __ATOMIC_RELAXED); 2377e61f1efeSRichard Henderson return 0; 2378e61f1efeSRichard Henderson }''' 2379e61f1efeSRichard Henderson has_atomic128 = cc.links(atomic_test_128) 2380848126d1SMarc-André Lureau 2381848126d1SMarc-André Lureau config_host_data.set('CONFIG_ATOMIC128', has_atomic128) 2382848126d1SMarc-André Lureau 2383848126d1SMarc-André Lureau if not has_atomic128 2384e61f1efeSRichard Henderson # Even with __builtin_assume_aligned, the above test may have failed 2385e61f1efeSRichard Henderson # without optimization enabled. Try again with optimizations locally 2386e61f1efeSRichard Henderson # enabled for the function. See 2387e61f1efeSRichard Henderson # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107389 2388e61f1efeSRichard Henderson has_atomic128_opt = cc.links('__attribute__((optimize("O1")))' + atomic_test_128) 2389e61f1efeSRichard Henderson config_host_data.set('CONFIG_ATOMIC128_OPT', has_atomic128_opt) 2390e61f1efeSRichard Henderson 2391e61f1efeSRichard Henderson if not has_atomic128_opt 2392e61f1efeSRichard Henderson config_host_data.set('CONFIG_CMPXCHG128', cc.links(''' 2393848126d1SMarc-André Lureau int main(void) 2394848126d1SMarc-André Lureau { 2395848126d1SMarc-André Lureau unsigned __int128 x = 0, y = 0; 2396848126d1SMarc-André Lureau __sync_val_compare_and_swap_16(&x, y, x); 2397848126d1SMarc-André Lureau return 0; 2398848126d1SMarc-André Lureau } 2399e61f1efeSRichard Henderson ''')) 2400e61f1efeSRichard Henderson endif 2401848126d1SMarc-André Lureau endif 2402848126d1SMarc-André Lureauendif 2403bd87a367SPaolo Bonzini 2404bd87a367SPaolo Bonziniconfig_host_data.set('CONFIG_GETAUXVAL', cc.links(gnu_source_prefix + ''' 2405bd87a367SPaolo Bonzini #include <sys/auxv.h> 2406bd87a367SPaolo Bonzini int main(void) { 2407bd87a367SPaolo Bonzini return getauxval(AT_HWCAP) == 0; 2408bd87a367SPaolo Bonzini }''')) 2409bd87a367SPaolo Bonzini 24100dae95d4SPaolo Bonziniconfig_host_data.set('CONFIG_USBFS', have_linux_user and cc.compiles(''' 24110dae95d4SPaolo Bonzini #include <linux/usbdevice_fs.h> 24120dae95d4SPaolo Bonzini 24130dae95d4SPaolo Bonzini #ifndef USBDEVFS_GET_CAPABILITIES 24140dae95d4SPaolo Bonzini #error "USBDEVFS_GET_CAPABILITIES undefined" 24150dae95d4SPaolo Bonzini #endif 24160dae95d4SPaolo Bonzini 24170dae95d4SPaolo Bonzini #ifndef USBDEVFS_DISCONNECT_CLAIM 24180dae95d4SPaolo Bonzini #error "USBDEVFS_DISCONNECT_CLAIM undefined" 24190dae95d4SPaolo Bonzini #endif 24200dae95d4SPaolo Bonzini 24210dae95d4SPaolo Bonzini int main(void) { return 0; }''')) 24220dae95d4SPaolo Bonzini 24232edd2c04SPaolo Bonzinihave_keyring = get_option('keyring') \ 24242edd2c04SPaolo Bonzini .require(targetos == 'linux', error_message: 'keyring is only available on Linux') \ 24252edd2c04SPaolo Bonzini .require(cc.compiles(''' 24262edd2c04SPaolo Bonzini #include <errno.h> 24272edd2c04SPaolo Bonzini #include <asm/unistd.h> 24282edd2c04SPaolo Bonzini #include <linux/keyctl.h> 24292edd2c04SPaolo Bonzini #include <sys/syscall.h> 24302edd2c04SPaolo Bonzini #include <unistd.h> 24312edd2c04SPaolo Bonzini int main(void) { 24322edd2c04SPaolo Bonzini return syscall(__NR_keyctl, KEYCTL_READ, 0, NULL, NULL, 0); 24332edd2c04SPaolo Bonzini }'''), error_message: 'keyctl syscall not available on this system').allowed() 24342edd2c04SPaolo Bonziniconfig_host_data.set('CONFIG_SECRET_KEYRING', have_keyring) 24352edd2c04SPaolo Bonzini 2436622753d2SPaolo Bonzinihave_cpuid_h = cc.links(''' 2437622753d2SPaolo Bonzini #include <cpuid.h> 2438622753d2SPaolo Bonzini int main(void) { 2439622753d2SPaolo Bonzini unsigned a, b, c, d; 2440622753d2SPaolo Bonzini unsigned max = __get_cpuid_max(0, 0); 2441622753d2SPaolo Bonzini 2442622753d2SPaolo Bonzini if (max >= 1) { 2443622753d2SPaolo Bonzini __cpuid(1, a, b, c, d); 2444622753d2SPaolo Bonzini } 2445622753d2SPaolo Bonzini 2446622753d2SPaolo Bonzini if (max >= 7) { 2447622753d2SPaolo Bonzini __cpuid_count(7, 0, a, b, c, d); 2448622753d2SPaolo Bonzini } 2449622753d2SPaolo Bonzini 2450622753d2SPaolo Bonzini return 0; 2451622753d2SPaolo Bonzini }''') 2452622753d2SPaolo Bonziniconfig_host_data.set('CONFIG_CPUID_H', have_cpuid_h) 2453622753d2SPaolo Bonzini 2454622753d2SPaolo Bonziniconfig_host_data.set('CONFIG_AVX2_OPT', get_option('avx2') \ 2455622753d2SPaolo Bonzini .require(have_cpuid_h, error_message: 'cpuid.h not available, cannot enable AVX2') \ 2456622753d2SPaolo Bonzini .require(cc.links(''' 2457622753d2SPaolo Bonzini #include <cpuid.h> 2458622753d2SPaolo Bonzini #include <immintrin.h> 2459701ea587SRichard Henderson static int __attribute__((target("avx2"))) bar(void *a) { 2460622753d2SPaolo Bonzini __m256i x = *(__m256i *)a; 2461622753d2SPaolo Bonzini return _mm256_testz_si256(x, x); 2462622753d2SPaolo Bonzini } 2463b5d3dac1SPaolo Bonzini int main(int argc, char *argv[]) { return bar(argv[argc - 1]); } 2464622753d2SPaolo Bonzini '''), error_message: 'AVX2 not available').allowed()) 2465622753d2SPaolo Bonzini 2466622753d2SPaolo Bonziniconfig_host_data.set('CONFIG_AVX512F_OPT', get_option('avx512f') \ 2467622753d2SPaolo Bonzini .require(have_cpuid_h, error_message: 'cpuid.h not available, cannot enable AVX512F') \ 2468622753d2SPaolo Bonzini .require(cc.links(''' 2469622753d2SPaolo Bonzini #include <cpuid.h> 2470622753d2SPaolo Bonzini #include <immintrin.h> 2471701ea587SRichard Henderson static int __attribute__((target("avx512f"))) bar(void *a) { 2472622753d2SPaolo Bonzini __m512i x = *(__m512i *)a; 2473622753d2SPaolo Bonzini return _mm512_test_epi64_mask(x, x); 2474622753d2SPaolo Bonzini } 2475b5d3dac1SPaolo Bonzini int main(int argc, char *argv[]) { return bar(argv[argc - 1]); } 2476622753d2SPaolo Bonzini '''), error_message: 'AVX512F not available').allowed()) 2477622753d2SPaolo Bonzini 247804ffce13Sling xuconfig_host_data.set('CONFIG_AVX512BW_OPT', get_option('avx512bw') \ 247904ffce13Sling xu .require(have_cpuid_h, error_message: 'cpuid.h not available, cannot enable AVX512BW') \ 248004ffce13Sling xu .require(cc.links(''' 248104ffce13Sling xu #include <cpuid.h> 248204ffce13Sling xu #include <immintrin.h> 2483dc165fcdSRichard Henderson static int __attribute__((target("avx512bw"))) bar(void *a) { 248404ffce13Sling xu __m512i *x = a; 248504ffce13Sling xu __m512i res= _mm512_abs_epi8(*x); 248604ffce13Sling xu return res[1]; 248704ffce13Sling xu } 248804ffce13Sling xu int main(int argc, char *argv[]) { return bar(argv[0]); } 248904ffce13Sling xu '''), error_message: 'AVX512BW not available').allowed()) 249004ffce13Sling xu 24913730a734SPaolo Bonzinihave_pvrdma = get_option('pvrdma') \ 24923730a734SPaolo Bonzini .require(rdma.found(), error_message: 'PVRDMA requires OpenFabrics libraries') \ 2493354d2d9bSJuan Quintela .require(cc.compiles(gnu_source_prefix + ''' 2494354d2d9bSJuan Quintela #include <sys/mman.h> 24953730a734SPaolo Bonzini int main(void) 24963730a734SPaolo Bonzini { 24973730a734SPaolo Bonzini char buf = 0; 24983730a734SPaolo Bonzini void *addr = &buf; 24993730a734SPaolo Bonzini addr = mremap(addr, 0, 1, MREMAP_MAYMOVE | MREMAP_FIXED); 25003730a734SPaolo Bonzini 25013730a734SPaolo Bonzini return 0; 25023730a734SPaolo Bonzini }'''), error_message: 'PVRDMA requires mremap').allowed() 25033730a734SPaolo Bonzini 25043730a734SPaolo Bonziniif have_pvrdma 2505354d2d9bSJuan Quintela config_host_data.set('LEGACY_RDMA_REG_MR', not cc.links(''' 25063730a734SPaolo Bonzini #include <infiniband/verbs.h> 25073730a734SPaolo Bonzini int main(void) 25083730a734SPaolo Bonzini { 25093730a734SPaolo Bonzini struct ibv_mr *mr; 25103730a734SPaolo Bonzini struct ibv_pd *pd = NULL; 25113730a734SPaolo Bonzini size_t length = 10; 25123730a734SPaolo Bonzini uint64_t iova = 0; 25133730a734SPaolo Bonzini int access = 0; 25143730a734SPaolo Bonzini void *addr = NULL; 25153730a734SPaolo Bonzini 25163730a734SPaolo Bonzini mr = ibv_reg_mr_iova(pd, addr, length, iova, access); 25173730a734SPaolo Bonzini ibv_dereg_mr(mr); 25183730a734SPaolo Bonzini return 0; 25193730a734SPaolo Bonzini }''')) 25203730a734SPaolo Bonziniendif 25213730a734SPaolo Bonzini 2522b87df904SPaolo Bonziniif get_option('membarrier').disabled() 2523b87df904SPaolo Bonzini have_membarrier = false 2524b87df904SPaolo Bonzinielif targetos == 'windows' 2525b87df904SPaolo Bonzini have_membarrier = true 2526b87df904SPaolo Bonzinielif targetos == 'linux' 2527b87df904SPaolo Bonzini have_membarrier = cc.compiles(''' 2528b87df904SPaolo Bonzini #include <linux/membarrier.h> 2529b87df904SPaolo Bonzini #include <sys/syscall.h> 2530b87df904SPaolo Bonzini #include <unistd.h> 2531b87df904SPaolo Bonzini #include <stdlib.h> 2532b87df904SPaolo Bonzini int main(void) { 2533b87df904SPaolo Bonzini syscall(__NR_membarrier, MEMBARRIER_CMD_QUERY, 0); 2534b87df904SPaolo Bonzini syscall(__NR_membarrier, MEMBARRIER_CMD_SHARED, 0); 2535b87df904SPaolo Bonzini exit(0); 2536b87df904SPaolo Bonzini }''') 2537b87df904SPaolo Bonziniendif 2538b87df904SPaolo Bonziniconfig_host_data.set('CONFIG_MEMBARRIER', get_option('membarrier') \ 2539b87df904SPaolo Bonzini .require(have_membarrier, error_message: 'membarrier system call not available') \ 2540b87df904SPaolo Bonzini .allowed()) 2541b87df904SPaolo Bonzini 254234b52615SPaolo Bonzinihave_afalg = get_option('crypto_afalg') \ 254334b52615SPaolo Bonzini .require(cc.compiles(gnu_source_prefix + ''' 254434b52615SPaolo Bonzini #include <errno.h> 254534b52615SPaolo Bonzini #include <sys/types.h> 254634b52615SPaolo Bonzini #include <sys/socket.h> 254734b52615SPaolo Bonzini #include <linux/if_alg.h> 254834b52615SPaolo Bonzini int main(void) { 254934b52615SPaolo Bonzini int sock; 255034b52615SPaolo Bonzini sock = socket(AF_ALG, SOCK_SEQPACKET, 0); 255134b52615SPaolo Bonzini return sock; 255234b52615SPaolo Bonzini } 255334b52615SPaolo Bonzini '''), error_message: 'AF_ALG requested but could not be detected').allowed() 255434b52615SPaolo Bonziniconfig_host_data.set('CONFIG_AF_ALG', have_afalg) 255534b52615SPaolo Bonzini 25569d734b85SMarc-André Lureauconfig_host_data.set('CONFIG_AF_VSOCK', cc.has_header_symbol( 25579d734b85SMarc-André Lureau 'linux/vm_sockets.h', 'AF_VSOCK', 25589d734b85SMarc-André Lureau prefix: '#include <sys/socket.h>', 25599d734b85SMarc-André Lureau)) 2560bd87a367SPaolo Bonzini 25618821a389SMarc-André Lureauhave_vss = false 2562872b69e6SMarc-André Lureauhave_vss_sdk = false # old xp/2003 SDK 25638821a389SMarc-André Lureauif targetos == 'windows' and link_language == 'cpp' 25648821a389SMarc-André Lureau have_vss = cxx.compiles(''' 25658821a389SMarc-André Lureau #define __MIDL_user_allocate_free_DEFINED__ 256632478cb6SMarc-André Lureau #include <vss.h> 25678821a389SMarc-André Lureau int main(void) { return VSS_CTX_BACKUP; }''') 2568872b69e6SMarc-André Lureau have_vss_sdk = cxx.has_header('vscoordint.h') 25698821a389SMarc-André Lureauendif 2570872b69e6SMarc-André Lureauconfig_host_data.set('HAVE_VSS_SDK', have_vss_sdk) 25718821a389SMarc-André Lureau 2572859aef02SPaolo Bonziniforeach k, v: config_host 2573ce6119dcSPaolo Bonzini if k.startswith('CONFIG_') 2574859aef02SPaolo Bonzini config_host_data.set(k, v == 'y' ? 1 : v) 2575859aef02SPaolo Bonzini endif 2576859aef02SPaolo Bonziniendforeach 2577859aef02SPaolo Bonzini 25786391c772SRichard Henderson# Older versions of MinGW do not import _lock_file and _unlock_file properly. 25796391c772SRichard Henderson# This was fixed for v6.0.0 with commit b48e3ac8969d. 25806391c772SRichard Hendersonif targetos == 'windows' 25816391c772SRichard Henderson config_host_data.set('HAVE__LOCK_FILE', cc.links(''' 25826391c772SRichard Henderson #include <stdio.h> 25836391c772SRichard Henderson int main(void) { 25846391c772SRichard Henderson _lock_file(NULL); 25856391c772SRichard Henderson _unlock_file(NULL); 25866391c772SRichard Henderson return 0; 25876391c772SRichard Henderson }''', name: '_lock_file and _unlock_file')) 25886391c772SRichard Hendersonendif 25896391c772SRichard Henderson 2590dbd672c8SPierrick Bouvierif targetos == 'windows' 2591dbd672c8SPierrick Bouvier mingw_has_setjmp_longjmp = cc.links(''' 2592dbd672c8SPierrick Bouvier #include <setjmp.h> 2593dbd672c8SPierrick Bouvier int main(void) { 2594dbd672c8SPierrick Bouvier /* 2595dbd672c8SPierrick Bouvier * These functions are not available in setjmp header, but may be 2596dbd672c8SPierrick Bouvier * available at link time, from libmingwex.a. 2597dbd672c8SPierrick Bouvier */ 2598dbd672c8SPierrick Bouvier extern int __mingw_setjmp(jmp_buf); 2599dbd672c8SPierrick Bouvier extern void __attribute__((noreturn)) __mingw_longjmp(jmp_buf, int); 2600dbd672c8SPierrick Bouvier jmp_buf env; 2601dbd672c8SPierrick Bouvier __mingw_setjmp(env); 2602dbd672c8SPierrick Bouvier __mingw_longjmp(env, 0); 2603dbd672c8SPierrick Bouvier } 2604dbd672c8SPierrick Bouvier ''', name: 'mingw setjmp and longjmp') 2605dbd672c8SPierrick Bouvier 2606dbd672c8SPierrick Bouvier if cpu == 'aarch64' and not mingw_has_setjmp_longjmp 2607dbd672c8SPierrick Bouvier error('mingw must provide setjmp/longjmp for windows-arm64') 2608dbd672c8SPierrick Bouvier endif 2609dbd672c8SPierrick Bouvierendif 2610dbd672c8SPierrick Bouvier 2611a0c9162cSPaolo Bonzini######################## 2612a0c9162cSPaolo Bonzini# Target configuration # 2613a0c9162cSPaolo Bonzini######################## 2614a0c9162cSPaolo Bonzini 26152becc36aSPaolo Bonziniminikconf = find_program('scripts/minikconf.py') 261605512f55SPaolo Bonziniconfig_all = {} 2617a98006bcSPaolo Bonziniconfig_all_devices = {} 2618ca0fc784SPaolo Bonziniconfig_all_disas = {} 26192becc36aSPaolo Bonziniconfig_devices_mak_list = [] 26202becc36aSPaolo Bonziniconfig_devices_h = {} 2621859aef02SPaolo Bonziniconfig_target_h = {} 26222becc36aSPaolo Bonziniconfig_target_mak = {} 2623ca0fc784SPaolo Bonzini 2624ca0fc784SPaolo Bonzinidisassemblers = { 2625ca0fc784SPaolo Bonzini 'alpha' : ['CONFIG_ALPHA_DIS'], 2626ca0fc784SPaolo Bonzini 'avr' : ['CONFIG_AVR_DIS'], 2627ca0fc784SPaolo Bonzini 'cris' : ['CONFIG_CRIS_DIS'], 26283e7a84eeSTaylor Simpson 'hexagon' : ['CONFIG_HEXAGON_DIS'], 2629ca0fc784SPaolo Bonzini 'hppa' : ['CONFIG_HPPA_DIS'], 2630ca0fc784SPaolo Bonzini 'i386' : ['CONFIG_I386_DIS'], 2631ca0fc784SPaolo Bonzini 'x86_64' : ['CONFIG_I386_DIS'], 2632ca0fc784SPaolo Bonzini 'm68k' : ['CONFIG_M68K_DIS'], 2633ca0fc784SPaolo Bonzini 'microblaze' : ['CONFIG_MICROBLAZE_DIS'], 2634ca0fc784SPaolo Bonzini 'mips' : ['CONFIG_MIPS_DIS'], 2635ca0fc784SPaolo Bonzini 'nios2' : ['CONFIG_NIOS2_DIS'], 2636ca0fc784SPaolo Bonzini 'or1k' : ['CONFIG_OPENRISC_DIS'], 2637ca0fc784SPaolo Bonzini 'ppc' : ['CONFIG_PPC_DIS'], 2638ca0fc784SPaolo Bonzini 'riscv' : ['CONFIG_RISCV_DIS'], 2639ca0fc784SPaolo Bonzini 'rx' : ['CONFIG_RX_DIS'], 2640ca0fc784SPaolo Bonzini 's390' : ['CONFIG_S390_DIS'], 2641ca0fc784SPaolo Bonzini 'sh4' : ['CONFIG_SH4_DIS'], 2642ca0fc784SPaolo Bonzini 'sparc' : ['CONFIG_SPARC_DIS'], 2643ca0fc784SPaolo Bonzini 'xtensa' : ['CONFIG_XTENSA_DIS'], 2644aae1746cSSong Gao 'loongarch' : ['CONFIG_LOONGARCH_DIS'], 2645ca0fc784SPaolo Bonzini} 2646ca0fc784SPaolo Bonzini 2647e1fbd2c4SPaolo Bonzinihave_ivshmem = config_host_data.get('CONFIG_EVENTFD') 26480a189110SPaolo Bonzinihost_kconfig = \ 2649537b7248SPaolo Bonzini (get_option('fuzzing') ? ['CONFIG_FUZZ=y'] : []) + \ 26500d04c4c9SPaolo Bonzini (have_tpm ? ['CONFIG_TPM=y'] : []) + \ 26513f0a5d55SMarc-André Lureau (spice.found() ? ['CONFIG_SPICE=y'] : []) + \ 2652ccd250aaSPaolo Bonzini (have_ivshmem ? ['CONFIG_IVSHMEM=y'] : []) + \ 265388b6e618SPaolo Bonzini (opengl.found() ? ['CONFIG_OPENGL=y'] : []) + \ 26549d71037fSPaolo Bonzini (x11.found() ? ['CONFIG_X11=y'] : []) + \ 26552a3129a3SPaolo Bonzini (have_vhost_user ? ['CONFIG_VHOST_USER=y'] : []) + \ 26562a3129a3SPaolo Bonzini (have_vhost_vdpa ? ['CONFIG_VHOST_VDPA=y'] : []) + \ 26572a3129a3SPaolo Bonzini (have_vhost_kernel ? ['CONFIG_VHOST_KERNEL=y'] : []) + \ 265869202b40SPaolo Bonzini (have_virtfs ? ['CONFIG_VIRTFS=y'] : []) + \ 26590a189110SPaolo Bonzini ('CONFIG_LINUX' in config_host ? ['CONFIG_LINUX=y'] : []) + \ 26603730a734SPaolo Bonzini (have_pvrdma ? ['CONFIG_PVRDMA=y'] : []) + \ 266155116968SJagannathan Raman (multiprocess_allowed ? ['CONFIG_MULTIPROCESS_ALLOWED=y'] : []) + \ 266255116968SJagannathan Raman (vfio_user_server_allowed ? ['CONFIG_VFIO_USER_SERVER_ALLOWED=y'] : []) 26630a189110SPaolo Bonzini 2664a9a74907SPaolo Bonziniignored = [ 'TARGET_XML_FILES', 'TARGET_ABI_DIR', 'TARGET_ARCH' ] 2665ca0fc784SPaolo Bonzini 2666fdb75aefSPaolo Bonzinidefault_targets = 'CONFIG_DEFAULT_TARGETS' in config_host 2667fdb75aefSPaolo Bonziniactual_target_dirs = [] 2668fbb4121dSPaolo Bonzinifdt_required = [] 2669a81df1b6SPaolo Bonziniforeach target : target_dirs 2670765686d6SPaolo Bonzini config_target = { 'TARGET_NAME': target.split('-')[0] } 2671765686d6SPaolo Bonzini if target.endswith('linux-user') 2672fdb75aefSPaolo Bonzini if targetos != 'linux' 2673fdb75aefSPaolo Bonzini if default_targets 2674fdb75aefSPaolo Bonzini continue 2675fdb75aefSPaolo Bonzini endif 2676fdb75aefSPaolo Bonzini error('Target @0@ is only available on a Linux host'.format(target)) 2677fdb75aefSPaolo Bonzini endif 2678765686d6SPaolo Bonzini config_target += { 'CONFIG_LINUX_USER': 'y' } 2679765686d6SPaolo Bonzini elif target.endswith('bsd-user') 2680fdb75aefSPaolo Bonzini if 'CONFIG_BSD' not in config_host 2681fdb75aefSPaolo Bonzini if default_targets 2682fdb75aefSPaolo Bonzini continue 2683fdb75aefSPaolo Bonzini endif 2684fdb75aefSPaolo Bonzini error('Target @0@ is only available on a BSD host'.format(target)) 2685fdb75aefSPaolo Bonzini endif 2686765686d6SPaolo Bonzini config_target += { 'CONFIG_BSD_USER': 'y' } 2687765686d6SPaolo Bonzini elif target.endswith('softmmu') 2688765686d6SPaolo Bonzini config_target += { 'CONFIG_SOFTMMU': 'y' } 2689765686d6SPaolo Bonzini endif 2690765686d6SPaolo Bonzini if target.endswith('-user') 2691765686d6SPaolo Bonzini config_target += { 2692765686d6SPaolo Bonzini 'CONFIG_USER_ONLY': 'y', 2693765686d6SPaolo Bonzini 'CONFIG_QEMU_INTERP_PREFIX': 2694ce6119dcSPaolo Bonzini get_option('interp_prefix').replace('%M', config_target['TARGET_NAME']) 2695765686d6SPaolo Bonzini } 2696765686d6SPaolo Bonzini endif 2697859aef02SPaolo Bonzini 26980a189110SPaolo Bonzini accel_kconfig = [] 26998a19980eSPaolo Bonzini foreach sym: accelerators 27008a19980eSPaolo Bonzini if sym == 'CONFIG_TCG' or target in accelerator_targets.get(sym, []) 27018a19980eSPaolo Bonzini config_target += { sym: 'y' } 27028a19980eSPaolo Bonzini config_all += { sym: 'y' } 2703dae0ec15SGerd Hoffmann if target in modular_tcg 2704dae0ec15SGerd Hoffmann config_target += { 'CONFIG_TCG_MODULAR': 'y' } 2705dae0ec15SGerd Hoffmann else 2706dae0ec15SGerd Hoffmann config_target += { 'CONFIG_TCG_BUILTIN': 'y' } 2707dae0ec15SGerd Hoffmann endif 27080a189110SPaolo Bonzini accel_kconfig += [ sym + '=y' ] 27098a19980eSPaolo Bonzini endif 27108a19980eSPaolo Bonzini endforeach 27110a189110SPaolo Bonzini if accel_kconfig.length() == 0 2712fdb75aefSPaolo Bonzini if default_targets 2713fdb75aefSPaolo Bonzini continue 2714fdb75aefSPaolo Bonzini endif 2715fdb75aefSPaolo Bonzini error('No accelerator available for target @0@'.format(target)) 2716fdb75aefSPaolo Bonzini endif 27178a19980eSPaolo Bonzini 2718fdb75aefSPaolo Bonzini actual_target_dirs += target 2719812b31d3SAlex Bennée config_target += keyval.load('configs/targets' / target + '.mak') 2720a9a74907SPaolo Bonzini config_target += { 'TARGET_' + config_target['TARGET_ARCH'].to_upper(): 'y' } 2721765686d6SPaolo Bonzini 2722fbb4121dSPaolo Bonzini if 'TARGET_NEED_FDT' in config_target 2723fbb4121dSPaolo Bonzini fdt_required += target 2724fbb4121dSPaolo Bonzini endif 2725fbb4121dSPaolo Bonzini 2726fa73168bSPaolo Bonzini # Add default keys 2727fa73168bSPaolo Bonzini if 'TARGET_BASE_ARCH' not in config_target 2728fa73168bSPaolo Bonzini config_target += {'TARGET_BASE_ARCH': config_target['TARGET_ARCH']} 2729fa73168bSPaolo Bonzini endif 2730fa73168bSPaolo Bonzini if 'TARGET_ABI_DIR' not in config_target 2731fa73168bSPaolo Bonzini config_target += {'TARGET_ABI_DIR': config_target['TARGET_ARCH']} 2732fa73168bSPaolo Bonzini endif 2733ee3eb3a7SMarc-André Lureau if 'TARGET_BIG_ENDIAN' not in config_target 2734ee3eb3a7SMarc-André Lureau config_target += {'TARGET_BIG_ENDIAN': 'n'} 2735ee3eb3a7SMarc-André Lureau endif 2736859aef02SPaolo Bonzini 2737ca0fc784SPaolo Bonzini foreach k, v: disassemblers 2738823eb013SPaolo Bonzini if host_arch.startswith(k) or config_target['TARGET_BASE_ARCH'].startswith(k) 2739ca0fc784SPaolo Bonzini foreach sym: v 2740ca0fc784SPaolo Bonzini config_target += { sym: 'y' } 2741ca0fc784SPaolo Bonzini config_all_disas += { sym: 'y' } 2742ca0fc784SPaolo Bonzini endforeach 2743ca0fc784SPaolo Bonzini endif 2744ca0fc784SPaolo Bonzini endforeach 2745ca0fc784SPaolo Bonzini 2746859aef02SPaolo Bonzini config_target_data = configuration_data() 2747859aef02SPaolo Bonzini foreach k, v: config_target 2748859aef02SPaolo Bonzini if not k.startswith('TARGET_') and not k.startswith('CONFIG_') 2749859aef02SPaolo Bonzini # do nothing 2750859aef02SPaolo Bonzini elif ignored.contains(k) 2751859aef02SPaolo Bonzini # do nothing 2752859aef02SPaolo Bonzini elif k == 'TARGET_BASE_ARCH' 2753a9a74907SPaolo Bonzini # Note that TARGET_BASE_ARCH ends up in config-target.h but it is 2754a9a74907SPaolo Bonzini # not used to select files from sourcesets. 2755859aef02SPaolo Bonzini config_target_data.set('TARGET_' + v.to_upper(), 1) 2756765686d6SPaolo Bonzini elif k == 'TARGET_NAME' or k == 'CONFIG_QEMU_INTERP_PREFIX' 2757859aef02SPaolo Bonzini config_target_data.set_quoted(k, v) 2758859aef02SPaolo Bonzini elif v == 'y' 2759859aef02SPaolo Bonzini config_target_data.set(k, 1) 2760ee3eb3a7SMarc-André Lureau elif v == 'n' 2761ee3eb3a7SMarc-André Lureau config_target_data.set(k, 0) 2762859aef02SPaolo Bonzini else 2763859aef02SPaolo Bonzini config_target_data.set(k, v) 2764859aef02SPaolo Bonzini endif 2765859aef02SPaolo Bonzini endforeach 2766cb2c5531SPeter Maydell config_target_data.set('QEMU_ARCH', 2767cb2c5531SPeter Maydell 'QEMU_ARCH_' + config_target['TARGET_BASE_ARCH'].to_upper()) 2768859aef02SPaolo Bonzini config_target_h += {target: configure_file(output: target + '-config-target.h', 2769859aef02SPaolo Bonzini configuration: config_target_data)} 27702becc36aSPaolo Bonzini 27712becc36aSPaolo Bonzini if target.endswith('-softmmu') 2772d1d5e9eeSAlex Bennée config_input = meson.get_external_property(target, 'default') 27732becc36aSPaolo Bonzini config_devices_mak = target + '-config-devices.mak' 27742becc36aSPaolo Bonzini config_devices_mak = configure_file( 2775d1d5e9eeSAlex Bennée input: ['configs/devices' / target / config_input + '.mak', 'Kconfig'], 27762becc36aSPaolo Bonzini output: config_devices_mak, 27772becc36aSPaolo Bonzini depfile: config_devices_mak + '.d', 27782becc36aSPaolo Bonzini capture: true, 27797bc3ca7fSPaolo Bonzini command: [minikconf, 27807bc3ca7fSPaolo Bonzini get_option('default_devices') ? '--defconfig' : '--allnoconfig', 27812becc36aSPaolo Bonzini config_devices_mak, '@DEPFILE@', '@INPUT@', 2782f4063f9cSPhilippe Mathieu-Daudé host_kconfig, accel_kconfig, 2783f4063f9cSPhilippe Mathieu-Daudé 'CONFIG_' + config_target['TARGET_ARCH'].to_upper() + '=y']) 2784859aef02SPaolo Bonzini 2785859aef02SPaolo Bonzini config_devices_data = configuration_data() 2786859aef02SPaolo Bonzini config_devices = keyval.load(config_devices_mak) 2787859aef02SPaolo Bonzini foreach k, v: config_devices 2788859aef02SPaolo Bonzini config_devices_data.set(k, 1) 2789859aef02SPaolo Bonzini endforeach 27902becc36aSPaolo Bonzini config_devices_mak_list += config_devices_mak 2791859aef02SPaolo Bonzini config_devices_h += {target: configure_file(output: target + '-config-devices.h', 2792859aef02SPaolo Bonzini configuration: config_devices_data)} 2793859aef02SPaolo Bonzini config_target += config_devices 2794a98006bcSPaolo Bonzini config_all_devices += config_devices 27952becc36aSPaolo Bonzini endif 27962becc36aSPaolo Bonzini config_target_mak += {target: config_target} 2797a81df1b6SPaolo Bonziniendforeach 2798fdb75aefSPaolo Bonzinitarget_dirs = actual_target_dirs 2799a81df1b6SPaolo Bonzini 28002becc36aSPaolo Bonzini# This configuration is used to build files that are shared by 28012becc36aSPaolo Bonzini# multiple binaries, and then extracted out of the "common" 28022becc36aSPaolo Bonzini# static_library target. 28032becc36aSPaolo Bonzini# 28042becc36aSPaolo Bonzini# We do not use all_sources()/all_dependencies(), because it would 28052becc36aSPaolo Bonzini# build literally all source files, including devices only used by 28062becc36aSPaolo Bonzini# targets that are not built for this compilation. The CONFIG_ALL 28072becc36aSPaolo Bonzini# pseudo symbol replaces it. 28082becc36aSPaolo Bonzini 280905512f55SPaolo Bonziniconfig_all += config_all_devices 28102becc36aSPaolo Bonziniconfig_all += config_host 28112becc36aSPaolo Bonziniconfig_all += config_all_disas 28122becc36aSPaolo Bonziniconfig_all += { 281314efd8d3SPaolo Bonzini 'CONFIG_XEN': xen.found(), 28142becc36aSPaolo Bonzini 'CONFIG_SOFTMMU': have_system, 28152becc36aSPaolo Bonzini 'CONFIG_USER_ONLY': have_user, 28162becc36aSPaolo Bonzini 'CONFIG_ALL': true, 28172becc36aSPaolo Bonzini} 28182becc36aSPaolo Bonzini 2819eed56e9aSPaolo Bonzinitarget_configs_h = [] 2820eed56e9aSPaolo Bonziniforeach target: target_dirs 2821eed56e9aSPaolo Bonzini target_configs_h += config_target_h[target] 2822eed56e9aSPaolo Bonzini target_configs_h += config_devices_h.get(target, []) 2823eed56e9aSPaolo Bonziniendforeach 2824eed56e9aSPaolo Bonzinigenh += custom_target('config-poison.h', 2825eed56e9aSPaolo Bonzini input: [target_configs_h], 2826eed56e9aSPaolo Bonzini output: 'config-poison.h', 2827eed56e9aSPaolo Bonzini capture: true, 2828eed56e9aSPaolo Bonzini command: [find_program('scripts/make-config-poison.sh'), 2829eed56e9aSPaolo Bonzini target_configs_h]) 2830eed56e9aSPaolo Bonzini 2831a0c9162cSPaolo Bonzini############## 2832a0c9162cSPaolo Bonzini# Submodules # 2833a0c9162cSPaolo Bonzini############## 28348b18cdbfSRichard Henderson 28358b18cdbfSRichard Hendersoncapstone = not_found 283683602083SThomas Huthif not get_option('capstone').auto() or have_system or have_user 283743ecd166SThomas Huth capstone = dependency('capstone', version: '>=3.0.5', 2838063d5119SPaolo Bonzini method: 'pkg-config', 283983602083SThomas Huth required: get_option('capstone')) 28408f4aea71SDaniel P. Berrangé 28418f4aea71SDaniel P. Berrangé # Some versions of capstone have broken pkg-config file 28428f4aea71SDaniel P. Berrangé # that reports a wrong -I path, causing the #include to 28438f4aea71SDaniel P. Berrangé # fail later. If the system has such a broken version 28448f4aea71SDaniel P. Berrangé # do not use it. 28458f4aea71SDaniel P. Berrangé if capstone.found() and not cc.compiles('#include <capstone.h>', 28468f4aea71SDaniel P. Berrangé dependencies: [capstone]) 28478f4aea71SDaniel P. Berrangé capstone = not_found 284883602083SThomas Huth if get_option('capstone').enabled() 284983602083SThomas Huth error('capstone requested, but it does not appear to work') 28508f4aea71SDaniel P. Berrangé endif 28518f4aea71SDaniel P. Berrangé endif 28528b18cdbfSRichard Hendersonendif 28534d34a86bSPaolo Bonzini 285455116968SJagannathan Ramanlibvfio_user_dep = not_found 285555116968SJagannathan Ramanif have_system and vfio_user_server_allowed 285655116968SJagannathan Raman have_internal = fs.exists(meson.current_source_dir() / 'subprojects/libvfio-user/meson.build') 285755116968SJagannathan Raman 285855116968SJagannathan Raman if not have_internal 285955116968SJagannathan Raman error('libvfio-user source not found - please pull git submodule') 286055116968SJagannathan Raman endif 286155116968SJagannathan Raman 286255116968SJagannathan Raman libvfio_user_proj = subproject('libvfio-user') 286355116968SJagannathan Raman 28645328353cSPaolo Bonzini libvfio_user_dep = libvfio_user_proj.get_variable('libvfio_user_dep') 286555116968SJagannathan Ramanendif 286655116968SJagannathan Raman 2867fbb4121dSPaolo Bonzinifdt = not_found 2868fbb4121dSPaolo Bonziniif have_system 2869c593d841SPhilippe Mathieu-Daudé fdt_opt = get_option('fdt') 2870fbb4121dSPaolo Bonzini if fdt_opt in ['enabled', 'auto', 'system'] 2871fbb4121dSPaolo Bonzini have_internal = fs.exists(meson.current_source_dir() / 'dtc/libfdt/Makefile.libfdt') 2872063d5119SPaolo Bonzini fdt = cc.find_library('fdt', 2873fbb4121dSPaolo Bonzini required: fdt_opt == 'system' or 2874fbb4121dSPaolo Bonzini fdt_opt == 'enabled' and not have_internal) 2875fbb4121dSPaolo Bonzini if fdt.found() and cc.links(''' 2876fbb4121dSPaolo Bonzini #include <libfdt.h> 2877fbb4121dSPaolo Bonzini #include <libfdt_env.h> 2878de47b0ffSThomas Huth int main(void) { fdt_find_max_phandle(NULL, NULL); return 0; }''', 2879fbb4121dSPaolo Bonzini dependencies: fdt) 2880fbb4121dSPaolo Bonzini fdt_opt = 'system' 28816c22853cSThomas Huth elif fdt_opt == 'system' 28826c22853cSThomas Huth error('system libfdt requested, but it is too old (1.5.1 or newer required)') 2883fbb4121dSPaolo Bonzini elif have_internal 2884fbb4121dSPaolo Bonzini fdt_opt = 'internal' 2885fbb4121dSPaolo Bonzini else 2886fbb4121dSPaolo Bonzini fdt_opt = 'disabled' 288787daf898SThomas Huth fdt = not_found 2888fbb4121dSPaolo Bonzini endif 2889fbb4121dSPaolo Bonzini endif 2890fbb4121dSPaolo Bonzini if fdt_opt == 'internal' 2891fbb4121dSPaolo Bonzini fdt_files = files( 2892fbb4121dSPaolo Bonzini 'dtc/libfdt/fdt.c', 2893fbb4121dSPaolo Bonzini 'dtc/libfdt/fdt_ro.c', 2894fbb4121dSPaolo Bonzini 'dtc/libfdt/fdt_wip.c', 2895fbb4121dSPaolo Bonzini 'dtc/libfdt/fdt_sw.c', 2896fbb4121dSPaolo Bonzini 'dtc/libfdt/fdt_rw.c', 2897fbb4121dSPaolo Bonzini 'dtc/libfdt/fdt_strerror.c', 2898fbb4121dSPaolo Bonzini 'dtc/libfdt/fdt_empty_tree.c', 2899fbb4121dSPaolo Bonzini 'dtc/libfdt/fdt_addresses.c', 2900fbb4121dSPaolo Bonzini 'dtc/libfdt/fdt_overlay.c', 2901fbb4121dSPaolo Bonzini 'dtc/libfdt/fdt_check.c', 2902fbb4121dSPaolo Bonzini ) 2903fbb4121dSPaolo Bonzini 2904fbb4121dSPaolo Bonzini fdt_inc = include_directories('dtc/libfdt') 2905fbb4121dSPaolo Bonzini libfdt = static_library('fdt', 2906610e7e0eSPhilippe Mathieu-Daudé build_by_default: false, 2907fbb4121dSPaolo Bonzini sources: fdt_files, 2908fbb4121dSPaolo Bonzini include_directories: fdt_inc) 2909fbb4121dSPaolo Bonzini fdt = declare_dependency(link_with: libfdt, 2910fbb4121dSPaolo Bonzini include_directories: fdt_inc) 2911fbb4121dSPaolo Bonzini endif 2912c593d841SPhilippe Mathieu-Daudéelse 2913c593d841SPhilippe Mathieu-Daudé fdt_opt = 'disabled' 2914fbb4121dSPaolo Bonziniendif 2915fbb4121dSPaolo Bonziniif not fdt.found() and fdt_required.length() > 0 2916fbb4121dSPaolo Bonzini error('fdt not available but required by targets ' + ', '.join(fdt_required)) 2917fbb4121dSPaolo Bonziniendif 2918fbb4121dSPaolo Bonzini 29198b18cdbfSRichard Hendersonconfig_host_data.set('CONFIG_CAPSTONE', capstone.found()) 2920fbb4121dSPaolo Bonziniconfig_host_data.set('CONFIG_FDT', fdt.found()) 29214d34a86bSPaolo Bonziniconfig_host_data.set('CONFIG_SLIRP', slirp.found()) 29228b18cdbfSRichard Henderson 2923a0c9162cSPaolo Bonzini##################### 2924a0c9162cSPaolo Bonzini# Generated sources # 2925a0c9162cSPaolo Bonzini##################### 29268b18cdbfSRichard Henderson 2927a0c9162cSPaolo Bonzinigenh += configure_file(output: 'config-host.h', configuration: config_host_data) 2928a81df1b6SPaolo Bonzini 29293f885659SMarc-André Lureauhxtool = find_program('scripts/hxtool') 2930e2c4012bSMarc-André Lureaushaderinclude = find_program('scripts/shaderinclude.py') 2931a81df1b6SPaolo Bonziniqapi_gen = find_program('scripts/qapi-gen.py') 2932654d6b04SPaolo Bonziniqapi_gen_depends = [ meson.current_source_dir() / 'scripts/qapi/__init__.py', 2933654d6b04SPaolo Bonzini meson.current_source_dir() / 'scripts/qapi/commands.py', 2934654d6b04SPaolo Bonzini meson.current_source_dir() / 'scripts/qapi/common.py', 2935654d6b04SPaolo Bonzini meson.current_source_dir() / 'scripts/qapi/error.py', 2936654d6b04SPaolo Bonzini meson.current_source_dir() / 'scripts/qapi/events.py', 2937654d6b04SPaolo Bonzini meson.current_source_dir() / 'scripts/qapi/expr.py', 2938654d6b04SPaolo Bonzini meson.current_source_dir() / 'scripts/qapi/gen.py', 2939654d6b04SPaolo Bonzini meson.current_source_dir() / 'scripts/qapi/introspect.py', 294088d357d2SMarkus Armbruster meson.current_source_dir() / 'scripts/qapi/main.py', 2941654d6b04SPaolo Bonzini meson.current_source_dir() / 'scripts/qapi/parser.py', 2942654d6b04SPaolo Bonzini meson.current_source_dir() / 'scripts/qapi/schema.py', 2943654d6b04SPaolo Bonzini meson.current_source_dir() / 'scripts/qapi/source.py', 2944654d6b04SPaolo Bonzini meson.current_source_dir() / 'scripts/qapi/types.py', 2945654d6b04SPaolo Bonzini meson.current_source_dir() / 'scripts/qapi/visit.py', 2946654d6b04SPaolo Bonzini meson.current_source_dir() / 'scripts/qapi-gen.py' 2947a81df1b6SPaolo Bonzini] 2948a81df1b6SPaolo Bonzini 2949a81df1b6SPaolo Bonzinitracetool = [ 2950a81df1b6SPaolo Bonzini python, files('scripts/tracetool.py'), 29519c29b741SPaolo Bonzini '--backend=' + ','.join(get_option('trace_backends')) 2952a81df1b6SPaolo Bonzini] 29530572d6cdSStefan Hajnoczitracetool_depends = files( 29540572d6cdSStefan Hajnoczi 'scripts/tracetool/backend/log.py', 29550572d6cdSStefan Hajnoczi 'scripts/tracetool/backend/__init__.py', 29560572d6cdSStefan Hajnoczi 'scripts/tracetool/backend/dtrace.py', 29570572d6cdSStefan Hajnoczi 'scripts/tracetool/backend/ftrace.py', 29580572d6cdSStefan Hajnoczi 'scripts/tracetool/backend/simple.py', 29590572d6cdSStefan Hajnoczi 'scripts/tracetool/backend/syslog.py', 29600572d6cdSStefan Hajnoczi 'scripts/tracetool/backend/ust.py', 29610572d6cdSStefan Hajnoczi 'scripts/tracetool/format/ust_events_c.py', 29620572d6cdSStefan Hajnoczi 'scripts/tracetool/format/ust_events_h.py', 29630572d6cdSStefan Hajnoczi 'scripts/tracetool/format/__init__.py', 29640572d6cdSStefan Hajnoczi 'scripts/tracetool/format/d.py', 29650572d6cdSStefan Hajnoczi 'scripts/tracetool/format/simpletrace_stap.py', 29660572d6cdSStefan Hajnoczi 'scripts/tracetool/format/c.py', 29670572d6cdSStefan Hajnoczi 'scripts/tracetool/format/h.py', 29680572d6cdSStefan Hajnoczi 'scripts/tracetool/format/log_stap.py', 29690572d6cdSStefan Hajnoczi 'scripts/tracetool/format/stap.py', 29700572d6cdSStefan Hajnoczi 'scripts/tracetool/__init__.py', 29710572d6cdSStefan Hajnoczi 'scripts/tracetool/vcpu.py' 29720572d6cdSStefan Hajnoczi) 2973a81df1b6SPaolo Bonzini 29742c273f32SMarc-André Lureauqemu_version_cmd = [find_program('scripts/qemu-version.sh'), 29752c273f32SMarc-André Lureau meson.current_source_dir(), 2976b0b4323eSPaolo Bonzini get_option('pkgversion'), meson.project_version()] 29772c273f32SMarc-André Lureauqemu_version = custom_target('qemu-version.h', 29782c273f32SMarc-André Lureau output: 'qemu-version.h', 29792c273f32SMarc-André Lureau command: qemu_version_cmd, 29802c273f32SMarc-André Lureau capture: true, 29812c273f32SMarc-André Lureau build_by_default: true, 29822c273f32SMarc-André Lureau build_always_stale: true) 29832c273f32SMarc-André Lureaugenh += qemu_version 29842c273f32SMarc-André Lureau 29853f885659SMarc-André Lureauhxdep = [] 29863f885659SMarc-André Lureauhx_headers = [ 29873f885659SMarc-André Lureau ['qemu-options.hx', 'qemu-options.def'], 29883f885659SMarc-André Lureau ['qemu-img-cmds.hx', 'qemu-img-cmds.h'], 29893f885659SMarc-André Lureau] 29903f885659SMarc-André Lureauif have_system 29913f885659SMarc-André Lureau hx_headers += [ 29923f885659SMarc-André Lureau ['hmp-commands.hx', 'hmp-commands.h'], 29933f885659SMarc-André Lureau ['hmp-commands-info.hx', 'hmp-commands-info.h'], 29943f885659SMarc-André Lureau ] 29953f885659SMarc-André Lureauendif 29963f885659SMarc-André Lureauforeach d : hx_headers 2997b7c70bf2SMarc-André Lureau hxdep += custom_target(d[1], 29983f885659SMarc-André Lureau input: files(d[0]), 29993f885659SMarc-André Lureau output: d[1], 30003f885659SMarc-André Lureau capture: true, 30013f885659SMarc-André Lureau build_by_default: true, # to be removed when added to a target 30023f885659SMarc-André Lureau command: [hxtool, '-h', '@INPUT0@']) 30033f885659SMarc-André Lureauendforeach 30043f885659SMarc-André Lureaugenh += hxdep 30053f885659SMarc-André Lureau 3006a0c9162cSPaolo Bonzini################### 3007a0c9162cSPaolo Bonzini# Collect sources # 3008a0c9162cSPaolo Bonzini################### 3009a81df1b6SPaolo Bonzini 301055567891SPhilippe Mathieu-Daudéauthz_ss = ss.source_set() 30117e2b888fSPhilippe Mathieu-Daudéblockdev_ss = ss.source_set() 30127e2b888fSPhilippe Mathieu-Daudéblock_ss = ss.source_set() 3013c2306d71SPhilippe Mathieu-Daudéchardev_ss = ss.source_set() 30147e2b888fSPhilippe Mathieu-Daudécommon_ss = ss.source_set() 30152389304aSPhilippe Mathieu-Daudécrypto_ss = ss.source_set() 3016f73fb063SPhilippe Mathieu-Daudéhwcore_ss = ss.source_set() 3017f78536b1SPhilippe Mathieu-Daudéio_ss = ss.source_set() 30187e2b888fSPhilippe Mathieu-Daudéqmp_ss = ss.source_set() 3019da33fc09SPhilippe Mathieu-Daudéqom_ss = ss.source_set() 30207e2b888fSPhilippe Mathieu-Daudésoftmmu_ss = ss.source_set() 30217e2b888fSPhilippe Mathieu-Daudéspecific_fuzz_ss = ss.source_set() 30227e2b888fSPhilippe Mathieu-Daudéspecific_ss = ss.source_set() 3023a81df1b6SPaolo Bonzinistub_ss = ss.source_set() 3024a81df1b6SPaolo Bonzinitrace_ss = ss.source_set() 30252becc36aSPaolo Bonziniuser_ss = ss.source_set() 30267e2b888fSPhilippe Mathieu-Daudéutil_ss = ss.source_set() 30272becc36aSPaolo Bonzini 3028c94a7b88SGerd Hoffmann# accel modules 3029c94a7b88SGerd Hoffmannqtest_module_ss = ss.source_set() 3030dae0ec15SGerd Hoffmanntcg_module_ss = ss.source_set() 3031c94a7b88SGerd Hoffmann 30323154fee4SMarc-André Lureaumodules = {} 3033db2e89dfSGerd Hoffmanntarget_modules = {} 30342becc36aSPaolo Bonzinihw_arch = {} 30352becc36aSPaolo Bonzinitarget_arch = {} 30362becc36aSPaolo Bonzinitarget_softmmu_arch = {} 303746369b50SPhilippe Mathieu-Daudétarget_user_arch = {} 3038a81df1b6SPaolo Bonzini 3039a81df1b6SPaolo Bonzini############### 3040a81df1b6SPaolo Bonzini# Trace files # 3041a81df1b6SPaolo Bonzini############### 3042a81df1b6SPaolo Bonzini 3043c9322ab5SMarc-André Lureau# TODO: add each directory to the subdirs from its own meson.build, once 3044c9322ab5SMarc-André Lureau# we have those 3045a81df1b6SPaolo Bonzinitrace_events_subdirs = [ 3046a81df1b6SPaolo Bonzini 'crypto', 304769ff4d0aSPhilippe Mathieu-Daudé 'qapi', 304869ff4d0aSPhilippe Mathieu-Daudé 'qom', 3049a81df1b6SPaolo Bonzini 'monitor', 305069ff4d0aSPhilippe Mathieu-Daudé 'util', 3051842b42dfSAlex Bennée 'gdbstub', 3052a81df1b6SPaolo Bonzini] 30536ddc1abeSWarner Loshif have_linux_user 3054a81df1b6SPaolo Bonzini trace_events_subdirs += [ 'linux-user' ] 3055a81df1b6SPaolo Bonziniendif 30566ddc1abeSWarner Loshif have_bsd_user 30576ddc1abeSWarner Losh trace_events_subdirs += [ 'bsd-user' ] 30586ddc1abeSWarner Loshendif 3059a81df1b6SPaolo Bonziniif have_block 3060a81df1b6SPaolo Bonzini trace_events_subdirs += [ 3061a81df1b6SPaolo Bonzini 'authz', 3062a81df1b6SPaolo Bonzini 'block', 3063a81df1b6SPaolo Bonzini 'io', 3064a81df1b6SPaolo Bonzini 'nbd', 3065a81df1b6SPaolo Bonzini 'scsi', 3066a81df1b6SPaolo Bonzini ] 3067a81df1b6SPaolo Bonziniendif 3068a81df1b6SPaolo Bonziniif have_system 3069a81df1b6SPaolo Bonzini trace_events_subdirs += [ 30708985db26SPhilippe Mathieu-Daudé 'accel/kvm', 3071a81df1b6SPaolo Bonzini 'audio', 3072a81df1b6SPaolo Bonzini 'backends', 3073a81df1b6SPaolo Bonzini 'backends/tpm', 3074a81df1b6SPaolo Bonzini 'chardev', 307546627f41SAndrew Melnychenko 'ebpf', 3076a81df1b6SPaolo Bonzini 'hw/9pfs', 3077a81df1b6SPaolo Bonzini 'hw/acpi', 307877c05b0bSHao Wu 'hw/adc', 3079a81df1b6SPaolo Bonzini 'hw/alpha', 3080a81df1b6SPaolo Bonzini 'hw/arm', 3081a81df1b6SPaolo Bonzini 'hw/audio', 3082a81df1b6SPaolo Bonzini 'hw/block', 3083a81df1b6SPaolo Bonzini 'hw/block/dataplane', 3084a81df1b6SPaolo Bonzini 'hw/char', 3085a81df1b6SPaolo Bonzini 'hw/display', 3086a81df1b6SPaolo Bonzini 'hw/dma', 3087a81df1b6SPaolo Bonzini 'hw/hyperv', 3088a81df1b6SPaolo Bonzini 'hw/i2c', 3089a81df1b6SPaolo Bonzini 'hw/i386', 3090a81df1b6SPaolo Bonzini 'hw/i386/xen', 3091aa98ee38SDavid Woodhouse 'hw/i386/kvm', 3092a81df1b6SPaolo Bonzini 'hw/ide', 3093a81df1b6SPaolo Bonzini 'hw/input', 3094a81df1b6SPaolo Bonzini 'hw/intc', 3095a81df1b6SPaolo Bonzini 'hw/isa', 3096a81df1b6SPaolo Bonzini 'hw/mem', 3097a81df1b6SPaolo Bonzini 'hw/mips', 3098a81df1b6SPaolo Bonzini 'hw/misc', 3099a81df1b6SPaolo Bonzini 'hw/misc/macio', 3100a81df1b6SPaolo Bonzini 'hw/net', 310198e5d7a2SVikram Garhwal 'hw/net/can', 3102ce0e6a2cSMark Cave-Ayland 'hw/nubus', 310388eea45cSKlaus Jensen 'hw/nvme', 3104a81df1b6SPaolo Bonzini 'hw/nvram', 3105a81df1b6SPaolo Bonzini 'hw/pci', 3106a81df1b6SPaolo Bonzini 'hw/pci-host', 3107a81df1b6SPaolo Bonzini 'hw/ppc', 3108a81df1b6SPaolo Bonzini 'hw/rdma', 3109a81df1b6SPaolo Bonzini 'hw/rdma/vmw', 3110a81df1b6SPaolo Bonzini 'hw/rtc', 3111a81df1b6SPaolo Bonzini 'hw/s390x', 3112a81df1b6SPaolo Bonzini 'hw/scsi', 3113a81df1b6SPaolo Bonzini 'hw/sd', 3114ad52cfc1SBALATON Zoltan 'hw/sh4', 3115a81df1b6SPaolo Bonzini 'hw/sparc', 3116a81df1b6SPaolo Bonzini 'hw/sparc64', 3117a81df1b6SPaolo Bonzini 'hw/ssi', 3118a81df1b6SPaolo Bonzini 'hw/timer', 3119a81df1b6SPaolo Bonzini 'hw/tpm', 3120a81df1b6SPaolo Bonzini 'hw/usb', 3121a81df1b6SPaolo Bonzini 'hw/vfio', 3122a81df1b6SPaolo Bonzini 'hw/virtio', 3123a81df1b6SPaolo Bonzini 'hw/watchdog', 3124a81df1b6SPaolo Bonzini 'hw/xen', 3125a81df1b6SPaolo Bonzini 'hw/gpio', 3126a81df1b6SPaolo Bonzini 'migration', 3127a81df1b6SPaolo Bonzini 'net', 31288b7a5507SPhilippe Mathieu-Daudé 'softmmu', 3129a81df1b6SPaolo Bonzini 'ui', 3130ad22c308SElena Ufimtseva 'hw/remote', 3131a81df1b6SPaolo Bonzini ] 3132a81df1b6SPaolo Bonziniendif 31338985db26SPhilippe Mathieu-Daudéif have_system or have_user 31348985db26SPhilippe Mathieu-Daudé trace_events_subdirs += [ 31358985db26SPhilippe Mathieu-Daudé 'accel/tcg', 31368985db26SPhilippe Mathieu-Daudé 'hw/core', 31378985db26SPhilippe Mathieu-Daudé 'target/arm', 3138a1477da3SAlexander Graf 'target/arm/hvf', 31398985db26SPhilippe Mathieu-Daudé 'target/hppa', 31408985db26SPhilippe Mathieu-Daudé 'target/i386', 31418985db26SPhilippe Mathieu-Daudé 'target/i386/kvm', 314234b8ff25SPhilippe Mathieu-Daudé 'target/mips/tcg', 31436f83e277SRichard Henderson 'target/nios2', 31448985db26SPhilippe Mathieu-Daudé 'target/ppc', 31458985db26SPhilippe Mathieu-Daudé 'target/riscv', 31468985db26SPhilippe Mathieu-Daudé 'target/s390x', 314767043607SCho, Yu-Chen 'target/s390x/kvm', 31488985db26SPhilippe Mathieu-Daudé 'target/sparc', 31498985db26SPhilippe Mathieu-Daudé ] 31508985db26SPhilippe Mathieu-Daudéendif 3151a81df1b6SPaolo Bonzini 31520df750e9SMarc-André Lureauvhost_user = not_found 31532a3129a3SPaolo Bonziniif targetos == 'linux' and have_vhost_user 31540df750e9SMarc-André Lureau libvhost_user = subproject('libvhost-user') 31550df750e9SMarc-André Lureau vhost_user = libvhost_user.get_variable('vhost_user_dep') 31560df750e9SMarc-André Lureauendif 31570df750e9SMarc-André Lureau 3158a6caeee8SXie Yongjilibvduse = not_found 3159a6caeee8SXie Yongjiif have_libvduse 3160a6caeee8SXie Yongji libvduse_proj = subproject('libvduse') 3161a6caeee8SXie Yongji libvduse = libvduse_proj.get_variable('libvduse_dep') 3162a6caeee8SXie Yongjiendif 3163a6caeee8SXie Yongji 3164b83a80e8SVladimir Sementsov-Ogievskiy# NOTE: the trace/ subdirectory needs the qapi_trace_events variable 3165b83a80e8SVladimir Sementsov-Ogievskiy# that is filled in by qapi/. 3166a81df1b6SPaolo Bonzinisubdir('qapi') 3167a81df1b6SPaolo Bonzinisubdir('qobject') 3168a81df1b6SPaolo Bonzinisubdir('stubs') 3169a81df1b6SPaolo Bonzinisubdir('trace') 3170a81df1b6SPaolo Bonzinisubdir('util') 31715582c58fSMarc-André Lureausubdir('qom') 31725582c58fSMarc-André Lureausubdir('authz') 3173a81df1b6SPaolo Bonzinisubdir('crypto') 31742d78b56eSMarc-André Lureausubdir('ui') 31757d5983e3SNicolas Saenz Juliennesubdir('hw') 3176842b42dfSAlex Bennéesubdir('gdbstub') 3177a81df1b6SPaolo Bonzini 31783154fee4SMarc-André Lureauif enable_modules 31793154fee4SMarc-André Lureau libmodulecommon = static_library('module-common', files('module-common.c') + genh, pic: true, c_args: '-DBUILD_DSO') 31803154fee4SMarc-André Lureau modulecommon = declare_dependency(link_whole: libmodulecommon, compile_args: '-DBUILD_DSO') 31813154fee4SMarc-André Lureauendif 31823154fee4SMarc-André Lureau 31837d5983e3SNicolas Saenz Julienneqom_ss = qom_ss.apply(config_host, strict: false) 31847d5983e3SNicolas Saenz Juliennelibqom = static_library('qom', qom_ss.sources() + genh, 31857d5983e3SNicolas Saenz Julienne dependencies: [qom_ss.dependencies()], 31867d5983e3SNicolas Saenz Julienne name_suffix: 'fa') 31877d5983e3SNicolas Saenz Julienneqom = declare_dependency(link_whole: libqom) 31887d5983e3SNicolas Saenz Julienne 31897d5983e3SNicolas Saenz Julienneevent_loop_base = files('event-loop-base.c') 31907d5983e3SNicolas Saenz Julienneevent_loop_base = static_library('event-loop-base', sources: event_loop_base + genh, 31917d5983e3SNicolas Saenz Julienne build_by_default: true) 31927d5983e3SNicolas Saenz Julienneevent_loop_base = declare_dependency(link_whole: event_loop_base, 31937d5983e3SNicolas Saenz Julienne dependencies: [qom]) 31947d5983e3SNicolas Saenz Julienne 31952becc36aSPaolo Bonzinistub_ss = stub_ss.apply(config_all, strict: false) 3196a81df1b6SPaolo Bonzini 3197a81df1b6SPaolo Bonziniutil_ss.add_all(trace_ss) 31982becc36aSPaolo Bonziniutil_ss = util_ss.apply(config_all, strict: false) 3199a81df1b6SPaolo Bonzinilibqemuutil = static_library('qemuutil', 3200a81df1b6SPaolo Bonzini sources: util_ss.sources() + stub_ss.sources() + genh, 32016d7c7c2dSPaolo Bonzini dependencies: [util_ss.dependencies(), libm, threads, glib, socket, malloc, pixman]) 3202a81df1b6SPaolo Bonziniqemuutil = declare_dependency(link_with: libqemuutil, 320370ac26b9SNicolas Saenz Julienne sources: genh + version_res, 320470ac26b9SNicolas Saenz Julienne dependencies: [event_loop_base]) 3205a81df1b6SPaolo Bonzini 3206957b31f6SPhilippe Mathieu-Daudéif have_system or have_user 3207abff1abfSPaolo Bonzini decodetree = generator(find_program('scripts/decodetree.py'), 3208abff1abfSPaolo Bonzini output: 'decode-@BASENAME@.c.inc', 3209abff1abfSPaolo Bonzini arguments: ['@INPUT@', '@EXTRA_ARGS@', '-o', '@OUTPUT@']) 3210957b31f6SPhilippe Mathieu-Daudé subdir('libdecnumber') 3211957b31f6SPhilippe Mathieu-Daudé subdir('target') 3212957b31f6SPhilippe Mathieu-Daudéendif 3213abff1abfSPaolo Bonzini 3214478e943fSPaolo Bonzinisubdir('audio') 32157fcfd456SMarc-André Lureausubdir('io') 3216848e8ff6SMarc-André Lureausubdir('chardev') 3217ec0d5893SMarc-André Lureausubdir('fsdev') 3218708eab42SMarc-André Lureausubdir('dump') 3219ec0d5893SMarc-André Lureau 3220f285bd3fSPhilippe Mathieu-Daudéif have_block 32215e5733e5SMarc-André Lureau block_ss.add(files( 32225e5733e5SMarc-André Lureau 'block.c', 32235e5733e5SMarc-André Lureau 'blockjob.c', 32245e5733e5SMarc-André Lureau 'job.c', 32255e5733e5SMarc-André Lureau 'qemu-io-cmds.c', 32265e5733e5SMarc-André Lureau )) 3227406523f6SPaolo Bonzini if config_host_data.get('CONFIG_REPLICATION') 3228406523f6SPaolo Bonzini block_ss.add(files('replication.c')) 3229406523f6SPaolo Bonzini endif 32305e5733e5SMarc-André Lureau 32315e5733e5SMarc-André Lureau subdir('nbd') 32325e5733e5SMarc-André Lureau subdir('scsi') 32335e5733e5SMarc-André Lureau subdir('block') 32345e5733e5SMarc-André Lureau 32354a96337dSPaolo Bonzini blockdev_ss.add(files( 32364a96337dSPaolo Bonzini 'blockdev.c', 3237cbc20bfbSStefan Hajnoczi 'blockdev-nbd.c', 32384a96337dSPaolo Bonzini 'iothread.c', 32394a96337dSPaolo Bonzini 'job-qmp.c', 32403eacf70bSRoman Bolshakov ), gnutls) 32414a96337dSPaolo Bonzini 32424a96337dSPaolo Bonzini # os-posix.c contains POSIX-specific functions used by qemu-storage-daemon, 32434a96337dSPaolo Bonzini # os-win32.c does not 32444a96337dSPaolo Bonzini blockdev_ss.add(when: 'CONFIG_POSIX', if_true: files('os-posix.c')) 32454a96337dSPaolo Bonzini softmmu_ss.add(when: 'CONFIG_WIN32', if_true: [files('os-win32.c')]) 3246f285bd3fSPhilippe Mathieu-Daudéendif 32474a96337dSPaolo Bonzini 32484a96337dSPaolo Bonzinicommon_ss.add(files('cpus-common.c')) 324931ffa2aaSPhilippe Mathieu-Daudéspecific_ss.add(files('cpu.c')) 32504a96337dSPaolo Bonzini 32515d3ea0e1SPaolo Bonzinisubdir('softmmu') 3252c9322ab5SMarc-André Lureau 325344b99a6dSRichard Henderson# Work around a gcc bug/misfeature wherein constant propagation looks 325444b99a6dSRichard Henderson# through an alias: 325544b99a6dSRichard Henderson# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99696 325644b99a6dSRichard Henderson# to guess that a const variable is always zero. Without lto, this is 325744b99a6dSRichard Henderson# impossible, as the alias is restricted to page-vary-common.c. Indeed, 325844b99a6dSRichard Henderson# without lto, not even the alias is required -- we simply use different 325944b99a6dSRichard Henderson# declarations in different compilation units. 326044b99a6dSRichard Hendersonpagevary = files('page-vary-common.c') 326144b99a6dSRichard Hendersonif get_option('b_lto') 326244b99a6dSRichard Henderson pagevary_flags = ['-fno-lto'] 326344b99a6dSRichard Henderson if get_option('cfi') 326444b99a6dSRichard Henderson pagevary_flags += '-fno-sanitize=cfi-icall' 326544b99a6dSRichard Henderson endif 326654c9b194SThomas Huth pagevary = static_library('page-vary-common', sources: pagevary + genh, 326744b99a6dSRichard Henderson c_args: pagevary_flags) 326844b99a6dSRichard Henderson pagevary = declare_dependency(link_with: pagevary) 326944b99a6dSRichard Hendersonendif 327044b99a6dSRichard Hendersoncommon_ss.add(pagevary) 32716670d4d0SRichard Hendersonspecific_ss.add(files('page-vary.c')) 32726670d4d0SRichard Henderson 3273ab318051SMarc-André Lureausubdir('backends') 3274c574e161SMarc-André Lureausubdir('disas') 327555166230SMarc-André Lureausubdir('migration') 3276ff219dcaSPaolo Bonzinisubdir('monitor') 3277cdaf0722SMarc-André Lureausubdir('net') 327817ef2af6SMarc-André Lureausubdir('replay') 32798df9f0c3SPhilippe Mathieu-Daudésubdir('semihosting') 3280aa09b3d5SMarkus Armbrustersubdir('stats') 3281104cc2c0SRichard Hendersonsubdir('tcg') 3282c6347541SRichard Hendersonsubdir('fpu') 32831a82878aSMarc-André Lureausubdir('accel') 3284f556b4a1SPaolo Bonzinisubdir('plugins') 3285bbf15aafSRichard Hendersonsubdir('ebpf') 3286bbf15aafSRichard Henderson 3287bbf15aafSRichard Hendersoncommon_user_inc = [] 3288bbf15aafSRichard Henderson 3289bbf15aafSRichard Hendersonsubdir('common-user') 3290b309c321SMarc-André Lureausubdir('bsd-user') 32913a30446aSMarc-André Lureausubdir('linux-user') 329246627f41SAndrew Melnychenko 3293a2ce7dbdSPaolo Bonzini# needed for fuzzing binaries 3294a2ce7dbdSPaolo Bonzinisubdir('tests/qtest/libqos') 329564ed6f92SPaolo Bonzinisubdir('tests/qtest/fuzz') 3296a2ce7dbdSPaolo Bonzini 3297c94a7b88SGerd Hoffmann# accel modules 3298dae0ec15SGerd Hoffmanntcg_real_module_ss = ss.source_set() 3299dae0ec15SGerd Hoffmanntcg_real_module_ss.add_all(when: 'CONFIG_TCG_MODULAR', if_true: tcg_module_ss) 3300dae0ec15SGerd Hoffmannspecific_ss.add_all(when: 'CONFIG_TCG_BUILTIN', if_true: tcg_module_ss) 3301dae0ec15SGerd Hoffmanntarget_modules += { 'accel' : { 'qtest': qtest_module_ss, 3302dae0ec15SGerd Hoffmann 'tcg': tcg_real_module_ss }} 3303c94a7b88SGerd Hoffmann 3304a0c9162cSPaolo Bonzini######################## 3305a0c9162cSPaolo Bonzini# Library dependencies # 3306a0c9162cSPaolo Bonzini######################## 3307a0c9162cSPaolo Bonzini 3308f5723ab6SGerd Hoffmannmodinfo_collect = find_program('scripts/modinfo-collect.py') 33095ebbfeccSGerd Hoffmannmodinfo_generate = find_program('scripts/modinfo-generate.py') 3310f5723ab6SGerd Hoffmannmodinfo_files = [] 3311f5723ab6SGerd Hoffmann 33123154fee4SMarc-André Lureaublock_mods = [] 33133154fee4SMarc-André Lureausoftmmu_mods = [] 33143154fee4SMarc-André Lureauforeach d, list : modules 3315ef709860SPaolo Bonzini if not (d == 'block' ? have_block : have_system) 3316ef709860SPaolo Bonzini continue 3317ef709860SPaolo Bonzini endif 3318ef709860SPaolo Bonzini 33193154fee4SMarc-André Lureau foreach m, module_ss : list 33206002711cSPaolo Bonzini if enable_modules 33213e292c51SGerd Hoffmann module_ss = module_ss.apply(config_all, strict: false) 33223154fee4SMarc-André Lureau sl = static_library(d + '-' + m, [genh, module_ss.sources()], 33233154fee4SMarc-André Lureau dependencies: [modulecommon, module_ss.dependencies()], pic: true) 33243154fee4SMarc-André Lureau if d == 'block' 33253154fee4SMarc-André Lureau block_mods += sl 33263154fee4SMarc-André Lureau else 33273154fee4SMarc-André Lureau softmmu_mods += sl 33283154fee4SMarc-André Lureau endif 3329f5723ab6SGerd Hoffmann if module_ss.sources() != [] 3330f5723ab6SGerd Hoffmann # FIXME: Should use sl.extract_all_objects(recursive: true) as 3331f5723ab6SGerd Hoffmann # input. Sources can be used multiple times but objects are 3332f5723ab6SGerd Hoffmann # unique when it comes to lookup in compile_commands.json. 3333f5723ab6SGerd Hoffmann # Depnds on a mesion version with 3334f5723ab6SGerd Hoffmann # https://github.com/mesonbuild/meson/pull/8900 3335f5723ab6SGerd Hoffmann modinfo_files += custom_target(d + '-' + m + '.modinfo', 3336f5723ab6SGerd Hoffmann output: d + '-' + m + '.modinfo', 3337ac347111SPaolo Bonzini input: module_ss.sources() + genh, 3338f5723ab6SGerd Hoffmann capture: true, 3339ac347111SPaolo Bonzini command: [modinfo_collect, module_ss.sources()]) 3340f5723ab6SGerd Hoffmann endif 33413154fee4SMarc-André Lureau else 33423154fee4SMarc-André Lureau if d == 'block' 33433154fee4SMarc-André Lureau block_ss.add_all(module_ss) 33443154fee4SMarc-André Lureau else 33453154fee4SMarc-André Lureau softmmu_ss.add_all(module_ss) 33463154fee4SMarc-André Lureau endif 33473154fee4SMarc-André Lureau endif 33483154fee4SMarc-André Lureau endforeach 33493154fee4SMarc-André Lureauendforeach 33503154fee4SMarc-André Lureau 3351db2e89dfSGerd Hoffmannforeach d, list : target_modules 3352db2e89dfSGerd Hoffmann foreach m, module_ss : list 33536002711cSPaolo Bonzini if enable_modules 3354db2e89dfSGerd Hoffmann foreach target : target_dirs 3355db2e89dfSGerd Hoffmann if target.endswith('-softmmu') 3356db2e89dfSGerd Hoffmann config_target = config_target_mak[target] 3357db2e89dfSGerd Hoffmann config_target += config_host 3358db2e89dfSGerd Hoffmann target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])] 3359db2e89dfSGerd Hoffmann c_args = ['-DNEED_CPU_H', 3360db2e89dfSGerd Hoffmann '-DCONFIG_TARGET="@0@-config-target.h"'.format(target), 3361db2e89dfSGerd Hoffmann '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)] 3362db2e89dfSGerd Hoffmann target_module_ss = module_ss.apply(config_target, strict: false) 3363db2e89dfSGerd Hoffmann if target_module_ss.sources() != [] 3364db2e89dfSGerd Hoffmann module_name = d + '-' + m + '-' + config_target['TARGET_NAME'] 3365db2e89dfSGerd Hoffmann sl = static_library(module_name, 3366db2e89dfSGerd Hoffmann [genh, target_module_ss.sources()], 3367db2e89dfSGerd Hoffmann dependencies: [modulecommon, target_module_ss.dependencies()], 3368db2e89dfSGerd Hoffmann include_directories: target_inc, 3369db2e89dfSGerd Hoffmann c_args: c_args, 3370db2e89dfSGerd Hoffmann pic: true) 3371db2e89dfSGerd Hoffmann softmmu_mods += sl 3372db2e89dfSGerd Hoffmann # FIXME: Should use sl.extract_all_objects(recursive: true) too. 3373db2e89dfSGerd Hoffmann modinfo_files += custom_target(module_name + '.modinfo', 3374db2e89dfSGerd Hoffmann output: module_name + '.modinfo', 3375917ddc27SGerd Hoffmann input: target_module_ss.sources() + genh, 3376db2e89dfSGerd Hoffmann capture: true, 3377917ddc27SGerd Hoffmann command: [modinfo_collect, '--target', target, target_module_ss.sources()]) 3378db2e89dfSGerd Hoffmann endif 3379db2e89dfSGerd Hoffmann endif 3380db2e89dfSGerd Hoffmann endforeach 3381db2e89dfSGerd Hoffmann else 3382db2e89dfSGerd Hoffmann specific_ss.add_all(module_ss) 3383db2e89dfSGerd Hoffmann endif 3384db2e89dfSGerd Hoffmann endforeach 3385db2e89dfSGerd Hoffmannendforeach 3386db2e89dfSGerd Hoffmann 33875ebbfeccSGerd Hoffmannif enable_modules 338805d6814cSJose R. Ziviani foreach target : target_dirs 338905d6814cSJose R. Ziviani if target.endswith('-softmmu') 339005d6814cSJose R. Ziviani config_target = config_target_mak[target] 339105d6814cSJose R. Ziviani config_devices_mak = target + '-config-devices.mak' 339205d6814cSJose R. Ziviani modinfo_src = custom_target('modinfo-' + target + '.c', 339305d6814cSJose R. Ziviani output: 'modinfo-' + target + '.c', 33945ebbfeccSGerd Hoffmann input: modinfo_files, 339505d6814cSJose R. Ziviani command: [modinfo_generate, '--devices', config_devices_mak, '@INPUT@'], 33965ebbfeccSGerd Hoffmann capture: true) 339705d6814cSJose R. Ziviani 339805d6814cSJose R. Ziviani modinfo_lib = static_library('modinfo-' + target + '.c', modinfo_src) 339905d6814cSJose R. Ziviani modinfo_dep = declare_dependency(link_with: modinfo_lib) 340005d6814cSJose R. Ziviani 340105d6814cSJose R. Ziviani arch = config_target['TARGET_NAME'] == 'sparc64' ? 'sparc64' : config_target['TARGET_BASE_ARCH'] 340205d6814cSJose R. Ziviani hw_arch[arch].add(modinfo_dep) 340305d6814cSJose R. Ziviani endif 340405d6814cSJose R. Ziviani endforeach 34055ebbfeccSGerd Hoffmannendif 34065ebbfeccSGerd Hoffmann 34073154fee4SMarc-André Lureaunm = find_program('nm') 3408604f3e4eSYonggang Luoundefsym = find_program('scripts/undefsym.py') 34093154fee4SMarc-André Lureaublock_syms = custom_target('block.syms', output: 'block.syms', 34103154fee4SMarc-André Lureau input: [libqemuutil, block_mods], 34113154fee4SMarc-André Lureau capture: true, 34123154fee4SMarc-André Lureau command: [undefsym, nm, '@INPUT@']) 34133154fee4SMarc-André Lureauqemu_syms = custom_target('qemu.syms', output: 'qemu.syms', 34143154fee4SMarc-André Lureau input: [libqemuutil, softmmu_mods], 34153154fee4SMarc-André Lureau capture: true, 34163154fee4SMarc-André Lureau command: [undefsym, nm, '@INPUT@']) 34173154fee4SMarc-André Lureau 341855567891SPhilippe Mathieu-Daudéauthz_ss = authz_ss.apply(config_host, strict: false) 341955567891SPhilippe Mathieu-Daudélibauthz = static_library('authz', authz_ss.sources() + genh, 342055567891SPhilippe Mathieu-Daudé dependencies: [authz_ss.dependencies()], 342155567891SPhilippe Mathieu-Daudé name_suffix: 'fa', 342255567891SPhilippe Mathieu-Daudé build_by_default: false) 342355567891SPhilippe Mathieu-Daudé 342455567891SPhilippe Mathieu-Daudéauthz = declare_dependency(link_whole: libauthz, 342555567891SPhilippe Mathieu-Daudé dependencies: qom) 342655567891SPhilippe Mathieu-Daudé 34272389304aSPhilippe Mathieu-Daudécrypto_ss = crypto_ss.apply(config_host, strict: false) 34282389304aSPhilippe Mathieu-Daudélibcrypto = static_library('crypto', crypto_ss.sources() + genh, 34292389304aSPhilippe Mathieu-Daudé dependencies: [crypto_ss.dependencies()], 34302389304aSPhilippe Mathieu-Daudé name_suffix: 'fa', 34312389304aSPhilippe Mathieu-Daudé build_by_default: false) 34322389304aSPhilippe Mathieu-Daudé 34332389304aSPhilippe Mathieu-Daudécrypto = declare_dependency(link_whole: libcrypto, 34342389304aSPhilippe Mathieu-Daudé dependencies: [authz, qom]) 34352389304aSPhilippe Mathieu-Daudé 3436f78536b1SPhilippe Mathieu-Daudéio_ss = io_ss.apply(config_host, strict: false) 3437f78536b1SPhilippe Mathieu-Daudélibio = static_library('io', io_ss.sources() + genh, 3438f78536b1SPhilippe Mathieu-Daudé dependencies: [io_ss.dependencies()], 3439f78536b1SPhilippe Mathieu-Daudé link_with: libqemuutil, 3440f78536b1SPhilippe Mathieu-Daudé name_suffix: 'fa', 3441f78536b1SPhilippe Mathieu-Daudé build_by_default: false) 3442f78536b1SPhilippe Mathieu-Daudé 3443f78536b1SPhilippe Mathieu-Daudéio = declare_dependency(link_whole: libio, dependencies: [crypto, qom]) 3444f78536b1SPhilippe Mathieu-Daudé 34457e6edef3SPhilippe Mathieu-Daudélibmigration = static_library('migration', sources: migration_files + genh, 34467e6edef3SPhilippe Mathieu-Daudé name_suffix: 'fa', 34477e6edef3SPhilippe Mathieu-Daudé build_by_default: false) 34487e6edef3SPhilippe Mathieu-Daudémigration = declare_dependency(link_with: libmigration, 34497e6edef3SPhilippe Mathieu-Daudé dependencies: [zlib, qom, io]) 34507e6edef3SPhilippe Mathieu-Daudésoftmmu_ss.add(migration) 34517e6edef3SPhilippe Mathieu-Daudé 34525e5733e5SMarc-André Lureaublock_ss = block_ss.apply(config_host, strict: false) 34535e5733e5SMarc-André Lureaulibblock = static_library('block', block_ss.sources() + genh, 34545e5733e5SMarc-André Lureau dependencies: block_ss.dependencies(), 34555e5733e5SMarc-André Lureau link_depends: block_syms, 34565e5733e5SMarc-André Lureau name_suffix: 'fa', 34575e5733e5SMarc-André Lureau build_by_default: false) 34585e5733e5SMarc-André Lureau 34595e5733e5SMarc-André Lureaublock = declare_dependency(link_whole: [libblock], 3460b7c70bf2SMarc-André Lureau link_args: '@block.syms', 3461b7c70bf2SMarc-André Lureau dependencies: [crypto, io]) 34625e5733e5SMarc-André Lureau 34634fb9071fSStefan Hajnocziblockdev_ss = blockdev_ss.apply(config_host, strict: false) 34644fb9071fSStefan Hajnoczilibblockdev = static_library('blockdev', blockdev_ss.sources() + genh, 34654fb9071fSStefan Hajnoczi dependencies: blockdev_ss.dependencies(), 34664fb9071fSStefan Hajnoczi name_suffix: 'fa', 34674fb9071fSStefan Hajnoczi build_by_default: false) 34684fb9071fSStefan Hajnoczi 34694fb9071fSStefan Hajnocziblockdev = declare_dependency(link_whole: [libblockdev], 34707d5983e3SNicolas Saenz Julienne dependencies: [block, event_loop_base]) 34714fb9071fSStefan Hajnoczi 3472ff219dcaSPaolo Bonziniqmp_ss = qmp_ss.apply(config_host, strict: false) 3473ff219dcaSPaolo Bonzinilibqmp = static_library('qmp', qmp_ss.sources() + genh, 3474ff219dcaSPaolo Bonzini dependencies: qmp_ss.dependencies(), 3475ff219dcaSPaolo Bonzini name_suffix: 'fa', 3476ff219dcaSPaolo Bonzini build_by_default: false) 3477ff219dcaSPaolo Bonzini 3478ff219dcaSPaolo Bonziniqmp = declare_dependency(link_whole: [libqmp]) 3479ff219dcaSPaolo Bonzini 3480c2306d71SPhilippe Mathieu-Daudélibchardev = static_library('chardev', chardev_ss.sources() + genh, 3481c2306d71SPhilippe Mathieu-Daudé name_suffix: 'fa', 348222d1f7a8SMarc-André Lureau dependencies: chardev_ss.dependencies(), 3483c2306d71SPhilippe Mathieu-Daudé build_by_default: false) 3484c2306d71SPhilippe Mathieu-Daudé 3485c2306d71SPhilippe Mathieu-Daudéchardev = declare_dependency(link_whole: libchardev) 3486c2306d71SPhilippe Mathieu-Daudé 3487f73fb063SPhilippe Mathieu-Daudéhwcore_ss = hwcore_ss.apply(config_host, strict: false) 3488f73fb063SPhilippe Mathieu-Daudélibhwcore = static_library('hwcore', sources: hwcore_ss.sources() + genh, 3489e28ab096SPhilippe Mathieu-Daudé name_suffix: 'fa', 3490e28ab096SPhilippe Mathieu-Daudé build_by_default: false) 3491e28ab096SPhilippe Mathieu-Daudéhwcore = declare_dependency(link_whole: libhwcore) 3492e28ab096SPhilippe Mathieu-Daudécommon_ss.add(hwcore) 3493e28ab096SPhilippe Mathieu-Daudé 3494064f8ee7SPhilippe Mathieu-Daudé########### 3495064f8ee7SPhilippe Mathieu-Daudé# Targets # 3496064f8ee7SPhilippe Mathieu-Daudé########### 3497064f8ee7SPhilippe Mathieu-Daudé 3498fb72176bSPaolo Bonziniemulator_modules = [] 34993154fee4SMarc-André Lureauforeach m : block_mods + softmmu_mods 3500fb72176bSPaolo Bonzini emulator_modules += shared_module(m.name(), 3501fb72176bSPaolo Bonzini build_by_default: true, 35023154fee4SMarc-André Lureau name_prefix: '', 35033154fee4SMarc-André Lureau link_whole: m, 35043154fee4SMarc-André Lureau install: true, 350516bf7a33SPaolo Bonzini install_dir: qemu_moddir) 35063154fee4SMarc-André Lureauendforeach 3507d8f3a609SPaolo Bonziniif emulator_modules.length() > 0 3508d8f3a609SPaolo Bonzini alias_target('modules', emulator_modules) 3509d8f3a609SPaolo Bonziniendif 35103154fee4SMarc-André Lureau 35114fb9071fSStefan Hajnoczisoftmmu_ss.add(authz, blockdev, chardev, crypto, io, qmp) 351264ed6f92SPaolo Bonzinicommon_ss.add(qom, qemuutil) 351364ed6f92SPaolo Bonzini 351464ed6f92SPaolo Bonzinicommon_ss.add_all(when: 'CONFIG_SOFTMMU', if_true: [softmmu_ss]) 35152becc36aSPaolo Bonzinicommon_ss.add_all(when: 'CONFIG_USER_ONLY', if_true: user_ss) 35162becc36aSPaolo Bonzini 35172becc36aSPaolo Bonzinicommon_all = common_ss.apply(config_all, strict: false) 35182becc36aSPaolo Bonzinicommon_all = static_library('common', 35192becc36aSPaolo Bonzini build_by_default: false, 35202becc36aSPaolo Bonzini sources: common_all.sources() + genh, 35219d24fb73SPaolo Bonzini include_directories: common_user_inc, 352275eebe0bSKatsuhiro Ueno implicit_include_directories: false, 35232becc36aSPaolo Bonzini dependencies: common_all.dependencies(), 35242becc36aSPaolo Bonzini name_suffix: 'fa') 35252becc36aSPaolo Bonzini 3526c9322ab5SMarc-André Lureaufeature_to_c = find_program('scripts/feature_to_c.sh') 3527c9322ab5SMarc-André Lureau 352830cfa50dSPhilippe Mathieu-Daudéif targetos == 'darwin' 352930cfa50dSPhilippe Mathieu-Daudé entitlement = find_program('scripts/entitlement.sh') 353030cfa50dSPhilippe Mathieu-Daudéendif 353130cfa50dSPhilippe Mathieu-Daudé 3532fd5eef85SPaolo Bonziniemulators = {} 35332becc36aSPaolo Bonziniforeach target : target_dirs 35342becc36aSPaolo Bonzini config_target = config_target_mak[target] 35352becc36aSPaolo Bonzini target_name = config_target['TARGET_NAME'] 3536ffb91f68SPaolo Bonzini target_base_arch = config_target['TARGET_BASE_ARCH'] 3537859aef02SPaolo Bonzini arch_srcs = [config_target_h[target]] 353864ed6f92SPaolo Bonzini arch_deps = [] 353964ed6f92SPaolo Bonzini c_args = ['-DNEED_CPU_H', 354064ed6f92SPaolo Bonzini '-DCONFIG_TARGET="@0@-config-target.h"'.format(target), 354164ed6f92SPaolo Bonzini '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)] 3542b6c7cfd4SPaolo Bonzini link_args = emulator_link_args 35432becc36aSPaolo Bonzini 3544859aef02SPaolo Bonzini config_target += config_host 35452becc36aSPaolo Bonzini target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])] 35462becc36aSPaolo Bonzini if targetos == 'linux' 35472becc36aSPaolo Bonzini target_inc += include_directories('linux-headers', is_system: true) 35482becc36aSPaolo Bonzini endif 35492becc36aSPaolo Bonzini if target.endswith('-softmmu') 35502becc36aSPaolo Bonzini target_type='system' 3551ffb91f68SPaolo Bonzini t = target_softmmu_arch[target_base_arch].apply(config_target, strict: false) 3552abff1abfSPaolo Bonzini arch_srcs += t.sources() 355364ed6f92SPaolo Bonzini arch_deps += t.dependencies() 3554abff1abfSPaolo Bonzini 3555ffb91f68SPaolo Bonzini hw_dir = target_name == 'sparc64' ? 'sparc64' : target_base_arch 35562c44220dSMarc-André Lureau hw = hw_arch[hw_dir].apply(config_target, strict: false) 35572c44220dSMarc-André Lureau arch_srcs += hw.sources() 355864ed6f92SPaolo Bonzini arch_deps += hw.dependencies() 35592c44220dSMarc-André Lureau 35602becc36aSPaolo Bonzini arch_srcs += config_devices_h[target] 356164ed6f92SPaolo Bonzini link_args += ['@block.syms', '@qemu.syms'] 35622becc36aSPaolo Bonzini else 35633a30446aSMarc-André Lureau abi = config_target['TARGET_ABI_DIR'] 35642becc36aSPaolo Bonzini target_type='user' 3565a3a576b0SPaolo Bonzini target_inc += common_user_inc 3566ffb91f68SPaolo Bonzini if target_base_arch in target_user_arch 3567ffb91f68SPaolo Bonzini t = target_user_arch[target_base_arch].apply(config_target, strict: false) 356846369b50SPhilippe Mathieu-Daudé arch_srcs += t.sources() 356946369b50SPhilippe Mathieu-Daudé arch_deps += t.dependencies() 357046369b50SPhilippe Mathieu-Daudé endif 35712becc36aSPaolo Bonzini if 'CONFIG_LINUX_USER' in config_target 35722becc36aSPaolo Bonzini base_dir = 'linux-user' 3573e2a74729SWarner Losh endif 3574e2a74729SWarner Losh if 'CONFIG_BSD_USER' in config_target 35752becc36aSPaolo Bonzini base_dir = 'bsd-user' 3576e2a74729SWarner Losh target_inc += include_directories('bsd-user/' / targetos) 357785fc1b5dSWarner Losh target_inc += include_directories('bsd-user/host/' / host_arch) 3578e2a74729SWarner Losh dir = base_dir / abi 357919bf129fSWarner Losh arch_srcs += files(dir / 'signal.c', dir / 'target_arch_cpu.c') 35802becc36aSPaolo Bonzini endif 35812becc36aSPaolo Bonzini target_inc += include_directories( 35822becc36aSPaolo Bonzini base_dir, 35833a30446aSMarc-André Lureau base_dir / abi, 35842becc36aSPaolo Bonzini ) 35853a30446aSMarc-André Lureau if 'CONFIG_LINUX_USER' in config_target 35863a30446aSMarc-André Lureau dir = base_dir / abi 35873a30446aSMarc-André Lureau arch_srcs += files(dir / 'signal.c', dir / 'cpu_loop.c') 35883a30446aSMarc-André Lureau if config_target.has_key('TARGET_SYSTBL_ABI') 35893a30446aSMarc-André Lureau arch_srcs += \ 35903a30446aSMarc-André Lureau syscall_nr_generators[abi].process(base_dir / abi / config_target['TARGET_SYSTBL'], 35913a30446aSMarc-André Lureau extra_args : config_target['TARGET_SYSTBL_ABI']) 35923a30446aSMarc-André Lureau endif 35933a30446aSMarc-André Lureau endif 35942becc36aSPaolo Bonzini endif 35952becc36aSPaolo Bonzini 3596c9322ab5SMarc-André Lureau if 'TARGET_XML_FILES' in config_target 3597c9322ab5SMarc-André Lureau gdbstub_xml = custom_target(target + '-gdbstub-xml.c', 3598c9322ab5SMarc-André Lureau output: target + '-gdbstub-xml.c', 3599c9322ab5SMarc-André Lureau input: files(config_target['TARGET_XML_FILES'].split()), 3600c9322ab5SMarc-André Lureau command: [feature_to_c, '@INPUT@'], 3601c9322ab5SMarc-André Lureau capture: true) 3602c9322ab5SMarc-André Lureau arch_srcs += gdbstub_xml 3603c9322ab5SMarc-André Lureau endif 3604c9322ab5SMarc-André Lureau 3605ffb91f68SPaolo Bonzini t = target_arch[target_base_arch].apply(config_target, strict: false) 3606abff1abfSPaolo Bonzini arch_srcs += t.sources() 360764ed6f92SPaolo Bonzini arch_deps += t.dependencies() 3608abff1abfSPaolo Bonzini 36092becc36aSPaolo Bonzini target_common = common_ss.apply(config_target, strict: false) 36102becc36aSPaolo Bonzini objects = common_all.extract_objects(target_common.sources()) 361164ed6f92SPaolo Bonzini deps = target_common.dependencies() 36122becc36aSPaolo Bonzini 36132becc36aSPaolo Bonzini target_specific = specific_ss.apply(config_target, strict: false) 36142becc36aSPaolo Bonzini arch_srcs += target_specific.sources() 361564ed6f92SPaolo Bonzini arch_deps += target_specific.dependencies() 36162becc36aSPaolo Bonzini 361764ed6f92SPaolo Bonzini lib = static_library('qemu-' + target, 3618859aef02SPaolo Bonzini sources: arch_srcs + genh, 3619b7612f45SPaolo Bonzini dependencies: arch_deps, 36202becc36aSPaolo Bonzini objects: objects, 36212becc36aSPaolo Bonzini include_directories: target_inc, 362264ed6f92SPaolo Bonzini c_args: c_args, 362364ed6f92SPaolo Bonzini build_by_default: false, 36242becc36aSPaolo Bonzini name_suffix: 'fa') 362564ed6f92SPaolo Bonzini 362664ed6f92SPaolo Bonzini if target.endswith('-softmmu') 362764ed6f92SPaolo Bonzini execs = [{ 362864ed6f92SPaolo Bonzini 'name': 'qemu-system-' + target_name, 3629654d6b04SPaolo Bonzini 'win_subsystem': 'console', 363064ed6f92SPaolo Bonzini 'sources': files('softmmu/main.c'), 363164ed6f92SPaolo Bonzini 'dependencies': [] 363264ed6f92SPaolo Bonzini }] 363335be72baSPaolo Bonzini if targetos == 'windows' and (sdl.found() or gtk.found()) 363464ed6f92SPaolo Bonzini execs += [{ 363564ed6f92SPaolo Bonzini 'name': 'qemu-system-' + target_name + 'w', 3636654d6b04SPaolo Bonzini 'win_subsystem': 'windows', 363764ed6f92SPaolo Bonzini 'sources': files('softmmu/main.c'), 363864ed6f92SPaolo Bonzini 'dependencies': [] 363964ed6f92SPaolo Bonzini }] 364064ed6f92SPaolo Bonzini endif 3641537b7248SPaolo Bonzini if get_option('fuzzing') 364264ed6f92SPaolo Bonzini specific_fuzz = specific_fuzz_ss.apply(config_target, strict: false) 364364ed6f92SPaolo Bonzini execs += [{ 364464ed6f92SPaolo Bonzini 'name': 'qemu-fuzz-' + target_name, 3645654d6b04SPaolo Bonzini 'win_subsystem': 'console', 364664ed6f92SPaolo Bonzini 'sources': specific_fuzz.sources(), 364764ed6f92SPaolo Bonzini 'dependencies': specific_fuzz.dependencies(), 364864ed6f92SPaolo Bonzini }] 364964ed6f92SPaolo Bonzini endif 365064ed6f92SPaolo Bonzini else 365164ed6f92SPaolo Bonzini execs = [{ 365264ed6f92SPaolo Bonzini 'name': 'qemu-' + target_name, 3653654d6b04SPaolo Bonzini 'win_subsystem': 'console', 365464ed6f92SPaolo Bonzini 'sources': [], 365564ed6f92SPaolo Bonzini 'dependencies': [] 365664ed6f92SPaolo Bonzini }] 365764ed6f92SPaolo Bonzini endif 365864ed6f92SPaolo Bonzini foreach exe: execs 36598a74ce61SAlexander Graf exe_name = exe['name'] 36603983a767SJohn Arbuckle if targetos == 'darwin' 36618a74ce61SAlexander Graf exe_name += '-unsigned' 36628a74ce61SAlexander Graf endif 36638a74ce61SAlexander Graf 36648a74ce61SAlexander Graf emulator = executable(exe_name, exe['sources'], 3665237377acSAkihiko Odaki install: true, 366664ed6f92SPaolo Bonzini c_args: c_args, 366764ed6f92SPaolo Bonzini dependencies: arch_deps + deps + exe['dependencies'], 366864ed6f92SPaolo Bonzini objects: lib.extract_all_objects(recursive: true), 366964ed6f92SPaolo Bonzini link_language: link_language, 367064ed6f92SPaolo Bonzini link_depends: [block_syms, qemu_syms] + exe.get('link_depends', []), 367164ed6f92SPaolo Bonzini link_args: link_args, 3672654d6b04SPaolo Bonzini win_subsystem: exe['win_subsystem']) 36738a74ce61SAlexander Graf 36743983a767SJohn Arbuckle if targetos == 'darwin' 3675411ad8ddSAkihiko Odaki icon = 'pc-bios/qemu.rsrc' 3676411ad8ddSAkihiko Odaki build_input = [emulator, files(icon)] 3677411ad8ddSAkihiko Odaki install_input = [ 3678411ad8ddSAkihiko Odaki get_option('bindir') / exe_name, 3679411ad8ddSAkihiko Odaki meson.current_source_dir() / icon 3680411ad8ddSAkihiko Odaki ] 3681411ad8ddSAkihiko Odaki if 'CONFIG_HVF' in config_target 3682411ad8ddSAkihiko Odaki entitlements = 'accel/hvf/entitlements.plist' 3683411ad8ddSAkihiko Odaki build_input += files(entitlements) 3684411ad8ddSAkihiko Odaki install_input += meson.current_source_dir() / entitlements 3685411ad8ddSAkihiko Odaki endif 3686411ad8ddSAkihiko Odaki 36878a74ce61SAlexander Graf emulators += {exe['name'] : custom_target(exe['name'], 3688411ad8ddSAkihiko Odaki input: build_input, 36898a74ce61SAlexander Graf output: exe['name'], 3690235b523dSPhilippe Mathieu-Daudé command: [entitlement, '@OUTPUT@', '@INPUT@']) 3691fd5eef85SPaolo Bonzini } 3692237377acSAkihiko Odaki 3693235b523dSPhilippe Mathieu-Daudé meson.add_install_script(entitlement, '--install', 3694237377acSAkihiko Odaki get_option('bindir') / exe['name'], 3695411ad8ddSAkihiko Odaki install_input) 36968a74ce61SAlexander Graf else 36978a74ce61SAlexander Graf emulators += {exe['name']: emulator} 36988a74ce61SAlexander Graf endif 369910e1d263SMarc-André Lureau 37009c29b741SPaolo Bonzini if stap.found() 370110e1d263SMarc-André Lureau foreach stp: [ 3702bd5f973aSStefan Hajnoczi {'ext': '.stp-build', 'fmt': 'stap', 'bin': meson.current_build_dir() / exe['name'], 'install': false}, 3703bd5f973aSStefan Hajnoczi {'ext': '.stp', 'fmt': 'stap', 'bin': get_option('prefix') / get_option('bindir') / exe['name'], 'install': true}, 370410e1d263SMarc-André Lureau {'ext': '-simpletrace.stp', 'fmt': 'simpletrace-stap', 'bin': '', 'install': true}, 370510e1d263SMarc-André Lureau {'ext': '-log.stp', 'fmt': 'log-stap', 'bin': '', 'install': true}, 370610e1d263SMarc-André Lureau ] 3707bd5f973aSStefan Hajnoczi custom_target(exe['name'] + stp['ext'], 370810e1d263SMarc-André Lureau input: trace_events_all, 3709bd5f973aSStefan Hajnoczi output: exe['name'] + stp['ext'], 371010e1d263SMarc-André Lureau install: stp['install'], 371116bf7a33SPaolo Bonzini install_dir: get_option('datadir') / 'systemtap/tapset', 371210e1d263SMarc-André Lureau command: [ 371310e1d263SMarc-André Lureau tracetool, '--group=all', '--format=' + stp['fmt'], 371410e1d263SMarc-André Lureau '--binary=' + stp['bin'], 371510e1d263SMarc-André Lureau '--target-name=' + target_name, 371610e1d263SMarc-André Lureau '--target-type=' + target_type, 371710e1d263SMarc-André Lureau '--probe-prefix=qemu.' + target_type + '.' + target_name, 3718c05012a3SStefan Hajnoczi '@INPUT@', '@OUTPUT@' 37190572d6cdSStefan Hajnoczi ], 37200572d6cdSStefan Hajnoczi depend_files: tracetool_depends) 372110e1d263SMarc-André Lureau endforeach 372210e1d263SMarc-André Lureau endif 372364ed6f92SPaolo Bonzini endforeach 37242becc36aSPaolo Bonziniendforeach 37252becc36aSPaolo Bonzini 3726931049b4SPaolo Bonzini# Other build targets 3727897b5afaSMarc-André Lureau 3728f556b4a1SPaolo Bonziniif 'CONFIG_PLUGIN' in config_host 3729f556b4a1SPaolo Bonzini install_headers('include/qemu/qemu-plugin.h') 3730f556b4a1SPaolo Bonziniendif 3731f556b4a1SPaolo Bonzini 3732f15bff25SPaolo Bonzinisubdir('qga') 3733f15bff25SPaolo Bonzini 37349755c94aSLaurent Vivier# Don't build qemu-keymap if xkbcommon is not explicitly enabled 37359755c94aSLaurent Vivier# when we don't build tools or system 37364113f4cfSLaurent Vivierif xkbcommon.found() 373728742467SMarc-André Lureau # used for the update-keymaps target, so include rules even if !have_tools 373828742467SMarc-André Lureau qemu_keymap = executable('qemu-keymap', files('qemu-keymap.c', 'ui/input-keymap.c') + genh, 373928742467SMarc-André Lureau dependencies: [qemuutil, xkbcommon], install: have_tools) 374028742467SMarc-André Lureauendif 374128742467SMarc-André Lureau 3742931049b4SPaolo Bonziniif have_tools 3743b7c70bf2SMarc-André Lureau qemu_img = executable('qemu-img', [files('qemu-img.c'), hxdep], 3744b7c70bf2SMarc-André Lureau dependencies: [authz, block, crypto, io, qom, qemuutil], install: true) 3745b7c70bf2SMarc-André Lureau qemu_io = executable('qemu-io', files('qemu-io.c'), 3746b7c70bf2SMarc-André Lureau dependencies: [block, qemuutil], install: true) 3747b7c70bf2SMarc-André Lureau qemu_nbd = executable('qemu-nbd', files('qemu-nbd.c'), 37483d212b41SRichard W.M. Jones dependencies: [blockdev, qemuutil, gnutls, selinux], 37493d212b41SRichard W.M. Jones install: true) 3750b7c70bf2SMarc-André Lureau 37517c58bb76SPaolo Bonzini subdir('storage-daemon') 3752a9c9727cSPaolo Bonzini subdir('contrib/rdmacm-mux') 37531d7bb6abSMarc-André Lureau subdir('contrib/elf2dmp') 3754a9c9727cSPaolo Bonzini 3755157e7b13SMarc-André Lureau executable('qemu-edid', files('qemu-edid.c', 'hw/display/edid-generate.c'), 3756157e7b13SMarc-André Lureau dependencies: qemuutil, 3757157e7b13SMarc-André Lureau install: true) 3758157e7b13SMarc-André Lureau 37592a3129a3SPaolo Bonzini if have_vhost_user 37602d7ac0afSPaolo Bonzini subdir('contrib/vhost-user-blk') 3761ea458960SMarc-André Lureau subdir('contrib/vhost-user-gpu') 376232fcc624SMarc-André Lureau subdir('contrib/vhost-user-input') 376399650b62SPaolo Bonzini subdir('contrib/vhost-user-scsi') 3764931049b4SPaolo Bonzini endif 37658f51e01cSMarc-André Lureau 37668f51e01cSMarc-André Lureau if targetos == 'linux' 37678f51e01cSMarc-André Lureau executable('qemu-bridge-helper', files('qemu-bridge-helper.c'), 37688f51e01cSMarc-André Lureau dependencies: [qemuutil, libcap_ng], 37698f51e01cSMarc-André Lureau install: true, 37708f51e01cSMarc-André Lureau install_dir: get_option('libexecdir')) 3771897b5afaSMarc-André Lureau 3772897b5afaSMarc-André Lureau executable('qemu-pr-helper', files('scsi/qemu-pr-helper.c', 'scsi/utils.c'), 3773897b5afaSMarc-André Lureau dependencies: [authz, crypto, io, qom, qemuutil, 37746ec0e15dSPaolo Bonzini libcap_ng, mpathpersist], 3775897b5afaSMarc-André Lureau install: true) 37768f51e01cSMarc-André Lureau endif 37778f51e01cSMarc-André Lureau 3778ccd250aaSPaolo Bonzini if have_ivshmem 37795ee24e78SMarc-André Lureau subdir('contrib/ivshmem-client') 37805ee24e78SMarc-André Lureau subdir('contrib/ivshmem-server') 37815ee24e78SMarc-André Lureau endif 3782931049b4SPaolo Bonziniendif 3783931049b4SPaolo Bonzini 3784f5aa6320SMarc-André Lureausubdir('scripts') 37853f99cf57SPaolo Bonzinisubdir('tools') 3786bdcbea7aSMarc-André Lureausubdir('pc-bios') 3787f8aa24eaSPaolo Bonzinisubdir('docs') 3788e3667660SYonggang Luosubdir('tests') 37891b695471SPaolo Bonziniif gtk.found() 3790e8f3bd71SMarc-André Lureau subdir('po') 3791e8f3bd71SMarc-André Lureauendif 37923f99cf57SPaolo Bonzini 37938adfeba9SMarc-André Lureauif host_machine.system() == 'windows' 37948adfeba9SMarc-André Lureau nsis_cmd = [ 37958adfeba9SMarc-André Lureau find_program('scripts/nsis.py'), 37968adfeba9SMarc-André Lureau '@OUTPUT@', 37978adfeba9SMarc-André Lureau get_option('prefix'), 37988adfeba9SMarc-André Lureau meson.current_source_dir(), 3799fc9a809eSPaolo Bonzini glib_pc.get_variable('bindir'), 380024bdcc96SStefan Weil host_machine.cpu(), 38018adfeba9SMarc-André Lureau '--', 38028adfeba9SMarc-André Lureau '-DDISPLAYVERSION=' + meson.project_version(), 38038adfeba9SMarc-André Lureau ] 38048adfeba9SMarc-André Lureau if build_docs 38058adfeba9SMarc-André Lureau nsis_cmd += '-DCONFIG_DOCUMENTATION=y' 38068adfeba9SMarc-André Lureau endif 38071b695471SPaolo Bonzini if gtk.found() 38088adfeba9SMarc-André Lureau nsis_cmd += '-DCONFIG_GTK=y' 38098adfeba9SMarc-André Lureau endif 38108adfeba9SMarc-André Lureau 38118adfeba9SMarc-André Lureau nsis = custom_target('nsis', 38128adfeba9SMarc-André Lureau output: 'qemu-setup-' + meson.project_version() + '.exe', 38138adfeba9SMarc-André Lureau input: files('qemu.nsi'), 38148adfeba9SMarc-André Lureau build_always_stale: true, 38158adfeba9SMarc-André Lureau command: nsis_cmd + ['@INPUT@']) 38168adfeba9SMarc-André Lureau alias_target('installer', nsis) 38178adfeba9SMarc-André Lureauendif 38188adfeba9SMarc-André Lureau 3819a0c9162cSPaolo Bonzini######################### 3820a0c9162cSPaolo Bonzini# Configuration summary # 3821a0c9162cSPaolo Bonzini######################### 3822a0c9162cSPaolo Bonzini 3823983d0a75SPhilippe Mathieu-Daudé# Directories 3824f9332757SPaolo Bonzinisummary_info = {} 382516bf7a33SPaolo Bonzinisummary_info += {'Install prefix': get_option('prefix')} 382616bf7a33SPaolo Bonzinisummary_info += {'BIOS directory': qemu_datadir} 38278154f5e6SAkihiko Odakipathsep = targetos == 'windows' ? ';' : ':' 38288154f5e6SAkihiko Odakisummary_info += {'firmware path': pathsep.join(get_option('qemu_firmwarepath'))} 3829f7fb6c6aSPaolo Bonzinisummary_info += {'binary directory': get_option('prefix') / get_option('bindir')} 3830f7fb6c6aSPaolo Bonzinisummary_info += {'library directory': get_option('prefix') / get_option('libdir')} 383116bf7a33SPaolo Bonzinisummary_info += {'module directory': qemu_moddir} 3832f7fb6c6aSPaolo Bonzinisummary_info += {'libexec directory': get_option('prefix') / get_option('libexecdir')} 3833f7fb6c6aSPaolo Bonzinisummary_info += {'include directory': get_option('prefix') / get_option('includedir')} 3834f7fb6c6aSPaolo Bonzinisummary_info += {'config directory': get_option('prefix') / get_option('sysconfdir')} 3835f9332757SPaolo Bonziniif targetos != 'windows' 3836f7fb6c6aSPaolo Bonzini summary_info += {'local state directory': get_option('prefix') / get_option('localstatedir')} 3837f7fb6c6aSPaolo Bonzini summary_info += {'Manual directory': get_option('prefix') / get_option('mandir')} 3838f9332757SPaolo Bonzinielse 3839f9332757SPaolo Bonzini summary_info += {'local state directory': 'queried at runtime'} 3840f9332757SPaolo Bonziniendif 3841f7fb6c6aSPaolo Bonzinisummary_info += {'Doc directory': get_option('prefix') / get_option('docdir')} 3842f9332757SPaolo Bonzinisummary_info += {'Build directory': meson.current_build_dir()} 3843f9332757SPaolo Bonzinisummary_info += {'Source path': meson.current_source_dir()} 3844f9332757SPaolo Bonzinisummary_info += {'GIT submodules': config_host['GIT_SUBMODULES']} 3845983d0a75SPhilippe Mathieu-Daudésummary(summary_info, bool_yn: true, section: 'Directories') 3846983d0a75SPhilippe Mathieu-Daudé 3847e11a0e17SPhilippe Mathieu-Daudé# Host binaries 3848983d0a75SPhilippe Mathieu-Daudésummary_info = {} 3849e11a0e17SPhilippe Mathieu-Daudésummary_info += {'git': config_host['GIT']} 3850e11a0e17SPhilippe Mathieu-Daudésummary_info += {'make': config_host['MAKE']} 3851e11a0e17SPhilippe Mathieu-Daudésummary_info += {'python': '@0@ (version: @1@)'.format(python.full_path(), python.language_version())} 3852bb647c49SPaolo Bonzinisummary_info += {'sphinx-build': sphinx_build} 3853e11a0e17SPhilippe Mathieu-Daudéif config_host.has_key('HAVE_GDB_BIN') 3854e11a0e17SPhilippe Mathieu-Daudé summary_info += {'gdb': config_host['HAVE_GDB_BIN']} 3855e11a0e17SPhilippe Mathieu-Daudéendif 385640c909f5SPaolo Bonzinisummary_info += {'iasl': iasl} 3857e11a0e17SPhilippe Mathieu-Daudésummary_info += {'genisoimage': config_host['GENISOIMAGE']} 385820cf5cb4SPaolo Bonziniif targetos == 'windows' and have_ga 3859bb647c49SPaolo Bonzini summary_info += {'wixl': wixl} 3860e11a0e17SPhilippe Mathieu-Daudéendif 38615890258aSThomas Huthif slirp.found() and have_system 386235acbb30SPaolo Bonzini summary_info += {'smbd': have_slirp_smbd ? smbd_path : false} 3863e11a0e17SPhilippe Mathieu-Daudéendif 3864e11a0e17SPhilippe Mathieu-Daudésummary(summary_info, bool_yn: true, section: 'Host binaries') 3865e11a0e17SPhilippe Mathieu-Daudé 38661d718865SPhilippe Mathieu-Daudé# Configurable features 38671d718865SPhilippe Mathieu-Daudésummary_info = {} 38681d718865SPhilippe Mathieu-Daudésummary_info += {'Documentation': build_docs} 3869aa3ca634SPhilippe Mathieu-Daudésummary_info += {'system-mode emulation': have_system} 3870aa3ca634SPhilippe Mathieu-Daudésummary_info += {'user-mode emulation': have_user} 3871813803aaSPhilippe Mathieu-Daudésummary_info += {'block layer': have_block} 38721d718865SPhilippe Mathieu-Daudésummary_info += {'Install blobs': get_option('install_blobs')} 38736002711cSPaolo Bonzinisummary_info += {'module support': enable_modules} 38746002711cSPaolo Bonziniif enable_modules 38752cb2f580SPaolo Bonzini summary_info += {'alternative module path': get_option('module_upgrades')} 38761d718865SPhilippe Mathieu-Daudéendif 3877537b7248SPaolo Bonzinisummary_info += {'fuzzing support': get_option('fuzzing')} 38781d718865SPhilippe Mathieu-Daudéif have_system 387987430d5bSPaolo Bonzini summary_info += {'Audio drivers': ' '.join(audio_drivers_selected)} 38801d718865SPhilippe Mathieu-Daudéendif 38819c29b741SPaolo Bonzinisummary_info += {'Trace backends': ','.join(get_option('trace_backends'))} 38829c29b741SPaolo Bonziniif 'simple' in get_option('trace_backends') 38839c29b741SPaolo Bonzini summary_info += {'Trace output file': get_option('trace_file') + '-<pid>'} 38841d718865SPhilippe Mathieu-Daudéendif 3885142ca628SMarc-André Lureausummary_info += {'D-Bus display': dbus_display} 3886c55cf6abSPaolo Bonzinisummary_info += {'QOM debugging': get_option('qom_cast_debug')} 38872a3129a3SPaolo Bonzinisummary_info += {'vhost-kernel support': have_vhost_kernel} 38882a3129a3SPaolo Bonzinisummary_info += {'vhost-net support': have_vhost_net} 38892a3129a3SPaolo Bonzinisummary_info += {'vhost-user support': have_vhost_user} 38902a3129a3SPaolo Bonzinisummary_info += {'vhost-user-crypto support': have_vhost_user_crypto} 38911d718865SPhilippe Mathieu-Daudésummary_info += {'vhost-user-blk server support': have_vhost_user_blk_server} 38922a3129a3SPaolo Bonzinisummary_info += {'vhost-vdpa support': have_vhost_vdpa} 389320cf5cb4SPaolo Bonzinisummary_info += {'build guest agent': have_ga} 38941d718865SPhilippe Mathieu-Daudésummary(summary_info, bool_yn: true, section: 'Configurable features') 38951d718865SPhilippe Mathieu-Daudé 38962e864b8bSPhilippe Mathieu-Daudé# Compilation information 3897e11a0e17SPhilippe Mathieu-Daudésummary_info = {} 38982e864b8bSPhilippe Mathieu-Daudésummary_info += {'host CPU': cpu} 38992e864b8bSPhilippe Mathieu-Daudésummary_info += {'host endianness': build_machine.endian()} 390063de9353SAlex Bennéesummary_info += {'C compiler': ' '.join(meson.get_compiler('c').cmd_array())} 390163de9353SAlex Bennéesummary_info += {'Host C compiler': ' '.join(meson.get_compiler('c', native: true).cmd_array())} 3902f9332757SPaolo Bonziniif link_language == 'cpp' 390363de9353SAlex Bennée summary_info += {'C++ compiler': ' '.join(meson.get_compiler('cpp').cmd_array())} 3904f9332757SPaolo Bonzinielse 3905f9332757SPaolo Bonzini summary_info += {'C++ compiler': false} 3906f9332757SPaolo Bonziniendif 3907f9332757SPaolo Bonziniif targetos == 'darwin' 390863de9353SAlex Bennée summary_info += {'Objective-C compiler': ' '.join(meson.get_compiler('objc').cmd_array())} 3909f9332757SPaolo Bonziniendif 39106a97f393SPaolo Bonzinioption_cflags = (get_option('debug') ? ['-g'] : []) 39116a97f393SPaolo Bonziniif get_option('optimization') != 'plain' 39126a97f393SPaolo Bonzini option_cflags += ['-O' + get_option('optimization')] 39136a97f393SPaolo Bonziniendif 39146a97f393SPaolo Bonzinisummary_info += {'CFLAGS': ' '.join(get_option('c_args') + option_cflags)} 391547b30835SPaolo Bonziniif link_language == 'cpp' 39166a97f393SPaolo Bonzini summary_info += {'CXXFLAGS': ' '.join(get_option('cpp_args') + option_cflags)} 391747b30835SPaolo Bonziniendif 3918e910c7d9SPhilippe Mathieu-Daudéif targetos == 'darwin' 39196a97f393SPaolo Bonzini summary_info += {'OBJCFLAGS': ' '.join(get_option('objc_args') + option_cflags)} 3920e910c7d9SPhilippe Mathieu-Daudéendif 392147b30835SPaolo Bonzinilink_args = get_option(link_language + '_link_args') 392247b30835SPaolo Bonziniif link_args.length() > 0 392347b30835SPaolo Bonzini summary_info += {'LDFLAGS': ' '.join(link_args)} 392447b30835SPaolo Bonziniendif 3925d67212d4SPaolo Bonzinisummary_info += {'QEMU_CFLAGS': ' '.join(qemu_common_flags + qemu_cflags)} 3926e5134024SPaolo Bonziniif 'cpp' in all_languages 3927d67212d4SPaolo Bonzini summary_info += {'QEMU_CXXFLAGS': ' '.join(qemu_common_flags + qemu_cxxflags)} 3928e5134024SPaolo Bonziniendif 3929e5134024SPaolo Bonziniif 'objc' in all_languages 3930d67212d4SPaolo Bonzini summary_info += {'QEMU_OBJCFLAGS': ' '.join(qemu_common_flags + qemu_objcflags)} 3931e5134024SPaolo Bonziniendif 3932d065177eSPaolo Bonzinisummary_info += {'QEMU_LDFLAGS': ' '.join(qemu_ldflags)} 3933c55cf6abSPaolo Bonzinisummary_info += {'profiler': get_option('profiler')} 3934cdad781dSDaniele Buonosummary_info += {'link-time optimization (LTO)': get_option('b_lto')} 39352e864b8bSPhilippe Mathieu-Daudésummary_info += {'PIE': get_option('b_pie')} 39363e8529ddSLaurent Viviersummary_info += {'static build': config_host.has_key('CONFIG_STATIC')} 39372e864b8bSPhilippe Mathieu-Daudésummary_info += {'malloc trim support': has_malloc_trim} 3938b87df904SPaolo Bonzinisummary_info += {'membarrier': have_membarrier} 393958a2e3f5SStefan Hajnoczisummary_info += {'debug graph lock': get_option('debug_graph_lock')} 3940728c0a2fSPaolo Bonzinisummary_info += {'debug stack usage': get_option('debug_stack_usage')} 3941c55cf6abSPaolo Bonzinisummary_info += {'mutex debugging': get_option('debug_mutex')} 39422e864b8bSPhilippe Mathieu-Daudésummary_info += {'memory allocator': get_option('malloc')} 3943622753d2SPaolo Bonzinisummary_info += {'avx2 optimization': config_host_data.get('CONFIG_AVX2_OPT')} 394404ffce13Sling xusummary_info += {'avx512bw optimization': config_host_data.get('CONFIG_AVX512BW_OPT')} 3945622753d2SPaolo Bonzinisummary_info += {'avx512f optimization': config_host_data.get('CONFIG_AVX512F_OPT')} 3946bb9ecae7SAlex Bennéeif get_option('gprof') 3947bb9ecae7SAlex Bennée gprof_info = 'YES (deprecated)' 3948bb9ecae7SAlex Bennéeelse 3949bb9ecae7SAlex Bennée gprof_info = get_option('gprof') 3950bb9ecae7SAlex Bennéeendif 3951bb9ecae7SAlex Bennéesummary_info += {'gprof': gprof_info} 39522e864b8bSPhilippe Mathieu-Daudésummary_info += {'gcov': get_option('b_coverage')} 395334f983d8SPaolo Bonzinisummary_info += {'thread sanitizer': get_option('tsan')} 39542e864b8bSPhilippe Mathieu-Daudésummary_info += {'CFI support': get_option('cfi')} 39552e864b8bSPhilippe Mathieu-Daudéif get_option('cfi') 39562e864b8bSPhilippe Mathieu-Daudé summary_info += {'CFI debug support': get_option('cfi_debug')} 39572e864b8bSPhilippe Mathieu-Daudéendif 39582e864b8bSPhilippe Mathieu-Daudésummary_info += {'strip binaries': get_option('strip')} 3959bb647c49SPaolo Bonzinisummary_info += {'sparse': sparse} 39602e864b8bSPhilippe Mathieu-Daudésummary_info += {'mingw32 support': targetos == 'windows'} 396112640f05SPaolo Bonzinisummary(summary_info, bool_yn: true, section: 'Compilation') 396249e8565bSAlex Bennée 396349e8565bSAlex Bennée# snarf the cross-compilation information for tests 396412640f05SPaolo Bonzinisummary_info = {} 396512640f05SPaolo Bonzinihave_cross = false 396649e8565bSAlex Bennéeforeach target: target_dirs 3967c7022a70SPaolo Bonzini tcg_mak = meson.current_build_dir() / 'tests/tcg' / target / 'config-target.mak' 396849e8565bSAlex Bennée if fs.exists(tcg_mak) 396949e8565bSAlex Bennée config_cross_tcg = keyval.load(tcg_mak) 397085b141eaSAlex Bennée if 'CC' in config_cross_tcg 397112640f05SPaolo Bonzini summary_info += {config_cross_tcg['TARGET_NAME']: config_cross_tcg['CC']} 397212640f05SPaolo Bonzini have_cross = true 397349e8565bSAlex Bennée endif 397449e8565bSAlex Bennée endif 397549e8565bSAlex Bennéeendforeach 397612640f05SPaolo Bonziniif have_cross 397712640f05SPaolo Bonzini summary(summary_info, bool_yn: true, section: 'Cross compilers') 397812640f05SPaolo Bonziniendif 39792e864b8bSPhilippe Mathieu-Daudé 3980aa3ca634SPhilippe Mathieu-Daudé# Targets and accelerators 39812e864b8bSPhilippe Mathieu-Daudésummary_info = {} 3982aa3ca634SPhilippe Mathieu-Daudéif have_system 3983aa3ca634SPhilippe Mathieu-Daudé summary_info += {'KVM support': config_all.has_key('CONFIG_KVM')} 3984aa3ca634SPhilippe Mathieu-Daudé summary_info += {'HAX support': config_all.has_key('CONFIG_HAX')} 3985aa3ca634SPhilippe Mathieu-Daudé summary_info += {'HVF support': config_all.has_key('CONFIG_HVF')} 3986aa3ca634SPhilippe Mathieu-Daudé summary_info += {'WHPX support': config_all.has_key('CONFIG_WHPX')} 398774a414a1SReinoud Zandijk summary_info += {'NVMM support': config_all.has_key('CONFIG_NVMM')} 398814efd8d3SPaolo Bonzini summary_info += {'Xen support': xen.found()} 398914efd8d3SPaolo Bonzini if xen.found() 399014efd8d3SPaolo Bonzini summary_info += {'xen ctrl version': xen.version()} 3991aa3ca634SPhilippe Mathieu-Daudé endif 3992820c1abaSDavid Woodhouse summary_info += {'Xen emulation': config_all.has_key('CONFIG_XEN_EMU')} 3993aa3ca634SPhilippe Mathieu-Daudéendif 3994aa3ca634SPhilippe Mathieu-Daudésummary_info += {'TCG support': config_all.has_key('CONFIG_TCG')} 3995aa3ca634SPhilippe Mathieu-Daudéif config_all.has_key('CONFIG_TCG') 399639687acaSPhilippe Mathieu-Daudé if get_option('tcg_interpreter') 3997f1f727acSPhilippe Mathieu-Daudé summary_info += {'TCG backend': 'TCI (TCG with bytecode interpreter, slow)'} 399839687acaSPhilippe Mathieu-Daudé else 399939687acaSPhilippe Mathieu-Daudé summary_info += {'TCG backend': 'native (@0@)'.format(cpu)} 400039687acaSPhilippe Mathieu-Daudé endif 4001029aa68fSAlex Bennée summary_info += {'TCG plugins': config_host.has_key('CONFIG_PLUGIN')} 4002aa3ca634SPhilippe Mathieu-Daudé summary_info += {'TCG debug enabled': config_host.has_key('CONFIG_DEBUG_TCG')} 4003aa3ca634SPhilippe Mathieu-Daudéendif 40042e864b8bSPhilippe Mathieu-Daudésummary_info += {'target list': ' '.join(target_dirs)} 4005aa3ca634SPhilippe Mathieu-Daudéif have_system 4006aa3ca634SPhilippe Mathieu-Daudé summary_info += {'default devices': get_option('default_devices')} 4007106ad1f9SPaolo Bonzini summary_info += {'out of process emulation': multiprocess_allowed} 400855116968SJagannathan Raman summary_info += {'vfio-user server': vfio_user_server_allowed} 4009aa3ca634SPhilippe Mathieu-Daudéendif 4010aa3ca634SPhilippe Mathieu-Daudésummary(summary_info, bool_yn: true, section: 'Targets and accelerators') 4011aa3ca634SPhilippe Mathieu-Daudé 4012813803aaSPhilippe Mathieu-Daudé# Block layer 4013813803aaSPhilippe Mathieu-Daudésummary_info = {} 4014813803aaSPhilippe Mathieu-Daudésummary_info += {'coroutine backend': config_host['CONFIG_COROUTINE_BACKEND']} 4015728c0a2fSPaolo Bonzinisummary_info += {'coroutine pool': have_coroutine_pool} 4016813803aaSPhilippe Mathieu-Daudéif have_block 4017622d64ffSPaolo Bonzini summary_info += {'Block whitelist (rw)': get_option('block_drv_rw_whitelist')} 4018622d64ffSPaolo Bonzini summary_info += {'Block whitelist (ro)': get_option('block_drv_ro_whitelist')} 4019c55cf6abSPaolo Bonzini summary_info += {'Use block whitelist in tools': get_option('block_drv_whitelist_in_tools')} 40203887702eSChristian Schoenebeck summary_info += {'VirtFS (9P) support': have_virtfs} 40213887702eSChristian Schoenebeck summary_info += {'VirtFS (9P) Proxy Helper support': have_virtfs_proxy_helper} 4022406523f6SPaolo Bonzini summary_info += {'Live block migration': config_host_data.get('CONFIG_LIVE_BLOCK_MIGRATION')} 4023406523f6SPaolo Bonzini summary_info += {'replication support': config_host_data.get('CONFIG_REPLICATION')} 4024ed793c2cSPaolo Bonzini summary_info += {'bochs support': get_option('bochs').allowed()} 4025ed793c2cSPaolo Bonzini summary_info += {'cloop support': get_option('cloop').allowed()} 4026ed793c2cSPaolo Bonzini summary_info += {'dmg support': get_option('dmg').allowed()} 4027ed793c2cSPaolo Bonzini summary_info += {'qcow v1 support': get_option('qcow1').allowed()} 4028ed793c2cSPaolo Bonzini summary_info += {'vdi support': get_option('vdi').allowed()} 402911cea42eSVladimir Sementsov-Ogievskiy summary_info += {'vhdx support': get_option('vhdx').allowed()} 403011cea42eSVladimir Sementsov-Ogievskiy summary_info += {'vmdk support': get_option('vmdk').allowed()} 403111cea42eSVladimir Sementsov-Ogievskiy summary_info += {'vpc support': get_option('vpc').allowed()} 4032ed793c2cSPaolo Bonzini summary_info += {'vvfat support': get_option('vvfat').allowed()} 4033ed793c2cSPaolo Bonzini summary_info += {'qed support': get_option('qed').allowed()} 4034ed793c2cSPaolo Bonzini summary_info += {'parallels support': get_option('parallels').allowed()} 4035bb647c49SPaolo Bonzini summary_info += {'FUSE exports': fuse} 40362a2359b8SXie Yongji summary_info += {'VDUSE block exports': have_vduse_blk_export} 4037813803aaSPhilippe Mathieu-Daudéendif 4038813803aaSPhilippe Mathieu-Daudésummary(summary_info, bool_yn: true, section: 'Block layer support') 4039813803aaSPhilippe Mathieu-Daudé 4040aa58028aSPhilippe Mathieu-Daudé# Crypto 4041aa3ca634SPhilippe Mathieu-Daudésummary_info = {} 404241f2ae28SPaolo Bonzinisummary_info += {'TLS priority': get_option('tls_priority')} 4043bb647c49SPaolo Bonzinisummary_info += {'GNUTLS support': gnutls} 4044bb647c49SPaolo Bonziniif gnutls.found() 4045cc4c7c73SDaniel P. Berrangé summary_info += {' GNUTLS crypto': gnutls_crypto.found()} 4046bb647c49SPaolo Bonziniendif 4047bb647c49SPaolo Bonzinisummary_info += {'libgcrypt': gcrypt} 4048bb647c49SPaolo Bonzinisummary_info += {'nettle': nettle} 404957612511SPaolo Bonziniif nettle.found() 405057612511SPaolo Bonzini summary_info += {' XTS': xts != 'private'} 4051f9332757SPaolo Bonziniendif 405234b52615SPaolo Bonzinisummary_info += {'AF_ALG support': have_afalg} 4053c55cf6abSPaolo Bonzinisummary_info += {'rng-none': get_option('rng_none')} 40542edd2c04SPaolo Bonzinisummary_info += {'Linux keyring': have_keyring} 4055aa58028aSPhilippe Mathieu-Daudésummary(summary_info, bool_yn: true, section: 'Crypto') 4056aa58028aSPhilippe Mathieu-Daudé 405769a78cceSPhilippe Mathieu-Daudé# Libraries 4058aa58028aSPhilippe Mathieu-Daudésummary_info = {} 4059aa58028aSPhilippe Mathieu-Daudéif targetos == 'darwin' 4060bb647c49SPaolo Bonzini summary_info += {'Cocoa support': cocoa} 4061e2c1d78dSVladislav Yaroshchuk summary_info += {'vmnet.framework support': vmnet} 4062aa58028aSPhilippe Mathieu-Daudéendif 4063bb647c49SPaolo Bonzinisummary_info += {'SDL support': sdl} 4064bb647c49SPaolo Bonzinisummary_info += {'SDL image support': sdl_image} 4065bb647c49SPaolo Bonzinisummary_info += {'GTK support': gtk} 4066bb647c49SPaolo Bonzinisummary_info += {'pixman': pixman} 4067bb647c49SPaolo Bonzinisummary_info += {'VTE support': vte} 40685890258aSThomas Huthsummary_info += {'slirp support': slirp} 4069bb647c49SPaolo Bonzinisummary_info += {'libtasn1': tasn1} 4070bb647c49SPaolo Bonzinisummary_info += {'PAM': pam} 4071bb647c49SPaolo Bonzinisummary_info += {'iconv support': iconv} 4072bb647c49SPaolo Bonzinisummary_info += {'curses support': curses} 4073bb647c49SPaolo Bonzinisummary_info += {'virgl support': virgl} 4074fd66dbd4SStefan Hajnoczisummary_info += {'blkio support': blkio} 4075bb647c49SPaolo Bonzinisummary_info += {'curl support': curl} 4076bb647c49SPaolo Bonzinisummary_info += {'Multipath support': mpathpersist} 407795f8510eSKshitij Surisummary_info += {'PNG support': png} 4078bb647c49SPaolo Bonzinisummary_info += {'VNC support': vnc} 4079a0b93237SPaolo Bonziniif vnc.found() 4080bb647c49SPaolo Bonzini summary_info += {'VNC SASL support': sasl} 4081bb647c49SPaolo Bonzini summary_info += {'VNC JPEG support': jpeg} 4082f9332757SPaolo Bonziniendif 408387430d5bSPaolo Bonziniif targetos not in ['darwin', 'haiku', 'windows'] 408487430d5bSPaolo Bonzini summary_info += {'OSS support': oss} 4085663df1ccSAlexandre Ratchov summary_info += {'sndio support': sndio} 408687430d5bSPaolo Bonzinielif targetos == 'darwin' 408787430d5bSPaolo Bonzini summary_info += {'CoreAudio support': coreaudio} 408887430d5bSPaolo Bonzinielif targetos == 'windows' 408987430d5bSPaolo Bonzini summary_info += {'DirectSound support': dsound} 409087430d5bSPaolo Bonziniendif 409187430d5bSPaolo Bonziniif targetos == 'linux' 409287430d5bSPaolo Bonzini summary_info += {'ALSA support': alsa} 409387430d5bSPaolo Bonzini summary_info += {'PulseAudio support': pulse} 409487430d5bSPaolo Bonziniendif 4095c2d3d1c2SDorinda Basseysummary_info += {'Pipewire support': pipewire} 409687430d5bSPaolo Bonzinisummary_info += {'JACK support': jack} 4097bb647c49SPaolo Bonzinisummary_info += {'brlapi support': brlapi} 4098e1723999SPaolo Bonzinisummary_info += {'vde support': vde} 4099837b84b1SPaolo Bonzinisummary_info += {'netmap support': have_netmap} 4100eea9453aSThomas Huthsummary_info += {'l2tpv3 support': have_l2tpv3} 4101ff66f3e5SPaolo Bonzinisummary_info += {'Linux AIO support': libaio} 4102bb647c49SPaolo Bonzinisummary_info += {'Linux io_uring support': linux_io_uring} 4103bb647c49SPaolo Bonzinisummary_info += {'ATTR/XATTR support': libattr} 41043730a734SPaolo Bonzinisummary_info += {'RDMA support': rdma} 41053730a734SPaolo Bonzinisummary_info += {'PVRDMA support': have_pvrdma} 4106fbb4121dSPaolo Bonzinisummary_info += {'fdt support': fdt_opt == 'disabled' ? false : fdt_opt} 4107bb647c49SPaolo Bonzinisummary_info += {'libcap-ng support': libcap_ng} 4108bb647c49SPaolo Bonzinisummary_info += {'bpf support': libbpf} 41093f0a5d55SMarc-André Lureausummary_info += {'spice protocol support': spice_protocol} 41103f0a5d55SMarc-André Lureauif spice_protocol.found() 41113f0a5d55SMarc-André Lureau summary_info += {' spice server support': spice} 41123f0a5d55SMarc-André Lureauendif 4113bb647c49SPaolo Bonzinisummary_info += {'rbd support': rbd} 4114bb647c49SPaolo Bonzinisummary_info += {'smartcard support': cacard} 4115bb647c49SPaolo Bonzinisummary_info += {'U2F support': u2f} 4116bb647c49SPaolo Bonzinisummary_info += {'libusb': libusb} 4117bb647c49SPaolo Bonzinisummary_info += {'usb net redir': usbredir} 411888b6e618SPaolo Bonzinisummary_info += {'OpenGL support (epoxy)': opengl} 4119bb647c49SPaolo Bonzinisummary_info += {'GBM': gbm} 4120bb647c49SPaolo Bonzinisummary_info += {'libiscsi support': libiscsi} 4121bb647c49SPaolo Bonzinisummary_info += {'libnfs support': libnfs} 4122f9332757SPaolo Bonziniif targetos == 'windows' 412320cf5cb4SPaolo Bonzini if have_ga 41248821a389SMarc-André Lureau summary_info += {'QGA VSS support': have_qga_vss} 4125b846ab7cSPaolo Bonzini endif 4126f9332757SPaolo Bonziniendif 4127bb647c49SPaolo Bonzinisummary_info += {'seccomp support': seccomp} 4128bb647c49SPaolo Bonzinisummary_info += {'GlusterFS support': glusterfs} 41290d04c4c9SPaolo Bonzinisummary_info += {'TPM support': have_tpm} 4130e6a52b36SThomas Huthsummary_info += {'libssh support': libssh} 4131bb647c49SPaolo Bonzinisummary_info += {'lzo support': lzo} 4132bb647c49SPaolo Bonzinisummary_info += {'snappy support': snappy} 4133bb647c49SPaolo Bonzinisummary_info += {'bzip2 support': libbzip2} 4134bb647c49SPaolo Bonzinisummary_info += {'lzfse support': liblzfse} 4135bb647c49SPaolo Bonzinisummary_info += {'zstd support': zstd} 4136488a8c73SPaolo Bonzinisummary_info += {'NUMA host support': numa} 413783602083SThomas Huthsummary_info += {'capstone': capstone} 4138bb647c49SPaolo Bonzinisummary_info += {'libpmem support': libpmem} 4139bb647c49SPaolo Bonzinisummary_info += {'libdaxctl support': libdaxctl} 4140bb647c49SPaolo Bonzinisummary_info += {'libudev': libudev} 4141bb647c49SPaolo Bonzini# Dummy dependency, keep .found() 4142df4ea709SMax Reitzsummary_info += {'FUSE lseek': fuse_lseek.found()} 41433d212b41SRichard W.M. Jonessummary_info += {'selinux': selinux} 41447c10cb38SIlya Leoshkevichsummary_info += {'libdw': libdw} 414569a78cceSPhilippe Mathieu-Daudésummary(summary_info, bool_yn: true, section: 'Dependencies') 4146f9332757SPaolo Bonzini 4147f9332757SPaolo Bonziniif not supported_cpus.contains(cpu) 4148f9332757SPaolo Bonzini message() 4149f9332757SPaolo Bonzini warning('SUPPORT FOR THIS HOST CPU WILL GO AWAY IN FUTURE RELEASES!') 4150f9332757SPaolo Bonzini message() 4151f9332757SPaolo Bonzini message('CPU host architecture ' + cpu + ' support is not currently maintained.') 4152f9332757SPaolo Bonzini message('The QEMU project intends to remove support for this host CPU in') 4153f9332757SPaolo Bonzini message('a future release if nobody volunteers to maintain it and to') 4154f9332757SPaolo Bonzini message('provide a build host for our continuous integration setup.') 4155f9332757SPaolo Bonzini message('configure has succeeded and you can continue to build, but') 4156f9332757SPaolo Bonzini message('if you care about QEMU on this platform you should contact') 4157f9332757SPaolo Bonzini message('us upstream at qemu-devel@nongnu.org.') 4158f9332757SPaolo Bonziniendif 4159f9332757SPaolo Bonzini 4160f9332757SPaolo Bonziniif not supported_oses.contains(targetos) 4161f9332757SPaolo Bonzini message() 4162f9332757SPaolo Bonzini warning('WARNING: SUPPORT FOR THIS HOST OS WILL GO AWAY IN FUTURE RELEASES!') 4163f9332757SPaolo Bonzini message() 4164f9332757SPaolo Bonzini message('Host OS ' + targetos + 'support is not currently maintained.') 4165f9332757SPaolo Bonzini message('The QEMU project intends to remove support for this host OS in') 4166f9332757SPaolo Bonzini message('a future release if nobody volunteers to maintain it and to') 4167f9332757SPaolo Bonzini message('provide a build host for our continuous integration setup.') 4168f9332757SPaolo Bonzini message('configure has succeeded and you can continue to build, but') 4169f9332757SPaolo Bonzini message('if you care about QEMU on this platform you should contact') 4170f9332757SPaolo Bonzini message('us upstream at qemu-devel@nongnu.org.') 4171f9332757SPaolo Bonziniendif 4172