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') 203154fee4SMarc-André Lureauenable_modules = 'CONFIG_MODULES' in config_host 21d7dedf42SPaolo Bonzini 22e5134024SPaolo Bonzinicc = meson.get_compiler('c') 23e5134024SPaolo Bonziniall_languages = ['c'] 24e5134024SPaolo Bonziniif add_languages('cpp', required: false, native: false) 25e5134024SPaolo Bonzini all_languages += ['cpp'] 26e5134024SPaolo Bonzini cxx = meson.get_compiler('cpp') 27e5134024SPaolo Bonziniendif 28e5134024SPaolo Bonziniif targetos == 'darwin' and \ 29e5134024SPaolo Bonzini add_languages('objc', required: get_option('cocoa'), native: false) 30e5134024SPaolo Bonzini all_languages += ['objc'] 31e5134024SPaolo Bonzini objc = meson.get_compiler('objc') 32e5134024SPaolo Bonziniendif 33e5134024SPaolo Bonzini 34e3667660SYonggang Luo# Temporary directory used for files created while 35e3667660SYonggang Luo# configure runs. Since it is in the build directory 36e3667660SYonggang Luo# we can safely blow away any previous version of it 37e3667660SYonggang Luo# (and we need not jump through hoops to try to delete 38e3667660SYonggang Luo# it when configure exits.) 39e3667660SYonggang Luotmpdir = meson.current_build_dir() / 'meson-private/temp' 408fe11232SMarc-André Lureau 418fe11232SMarc-André Lureauif get_option('qemu_suffix').startswith('/') 428fe11232SMarc-André Lureau error('qemu_suffix cannot start with a /') 438fe11232SMarc-André Lureauendif 448fe11232SMarc-André Lureau 4516bf7a33SPaolo Bonziniqemu_confdir = get_option('sysconfdir') / get_option('qemu_suffix') 46ab4c0996SMarc-André Lureauqemu_datadir = get_option('datadir') / get_option('qemu_suffix') 47491e74c1SMarc-André Lureauqemu_docdir = get_option('docdir') / get_option('qemu_suffix') 4816bf7a33SPaolo Bonziniqemu_moddir = get_option('libdir') / get_option('qemu_suffix') 4916bf7a33SPaolo Bonzini 5016bf7a33SPaolo Bonziniqemu_desktopdir = get_option('datadir') / 'applications' 5116bf7a33SPaolo Bonziniqemu_icondir = get_option('datadir') / 'icons' 5216bf7a33SPaolo Bonzini 53859aef02SPaolo Bonziniconfig_host_data = configuration_data() 54859aef02SPaolo Bonzinigenh = [] 55b83a80e8SVladimir Sementsov-Ogievskiyqapi_trace_events = [] 56a5665051SPaolo Bonzini 5720cf5cb4SPaolo Bonzinibsd_oses = ['gnu/kfreebsd', 'freebsd', 'netbsd', 'openbsd', 'dragonfly', 'darwin'] 58201e8ed7SPaolo Bonzinisupported_oses = ['windows', 'freebsd', 'netbsd', 'openbsd', 'darwin', 'sunos', 'linux'] 59ba0e7333SRichard Hendersonsupported_cpus = ['ppc', 'ppc64', 's390x', 'riscv', 'x86', 'x86_64', 606d0b52edSRichard Henderson 'arm', 'aarch64', 'loongarch64', 'mips', 'mips64', 'sparc64'] 61201e8ed7SPaolo Bonzini 62201e8ed7SPaolo Bonzinicpu = host_machine.cpu_family() 63c94c2394SRichard Henderson 64c94c2394SRichard Henderson# Unify riscv* to a single family. 65c94c2394SRichard Hendersonif cpu in ['riscv32', 'riscv64'] 66c94c2394SRichard Henderson cpu = 'riscv' 67c94c2394SRichard Hendersonendif 68c94c2394SRichard Henderson 6920cf5cb4SPaolo Bonzinitarget_dirs = config_host['TARGET_DIRS'].split() 7020cf5cb4SPaolo Bonzinihave_linux_user = false 7120cf5cb4SPaolo Bonzinihave_bsd_user = false 7220cf5cb4SPaolo Bonzinihave_system = false 7320cf5cb4SPaolo Bonziniforeach target : target_dirs 7420cf5cb4SPaolo Bonzini have_linux_user = have_linux_user or target.endswith('linux-user') 7520cf5cb4SPaolo Bonzini have_bsd_user = have_bsd_user or target.endswith('bsd-user') 7620cf5cb4SPaolo Bonzini have_system = have_system or target.endswith('-softmmu') 7720cf5cb4SPaolo Bonziniendforeach 7820cf5cb4SPaolo Bonzinihave_user = have_linux_user or have_bsd_user 7920cf5cb4SPaolo Bonzinihave_tools = get_option('tools') \ 8020cf5cb4SPaolo Bonzini .disable_auto_if(not have_system) \ 8120cf5cb4SPaolo Bonzini .allowed() 8220cf5cb4SPaolo Bonzinihave_ga = get_option('guest_agent') \ 8320cf5cb4SPaolo Bonzini .disable_auto_if(not have_system and not have_tools) \ 8428236ad8SBrad Smith .require(targetos in ['sunos', 'linux', 'windows', 'freebsd', 'netbsd', 'openbsd'], 8520cf5cb4SPaolo Bonzini error_message: 'unsupported OS for QEMU guest agent') \ 8620cf5cb4SPaolo Bonzini .allowed() 8720cf5cb4SPaolo Bonzinihave_block = have_system or have_tools 8820cf5cb4SPaolo Bonzini 8920cf5cb4SPaolo Bonzinipython = import('python').find_installation() 9020cf5cb4SPaolo Bonzini 91823eb013SPaolo Bonziniif cpu not in supported_cpus 92823eb013SPaolo Bonzini host_arch = 'unknown' 93823eb013SPaolo Bonzinielif cpu == 'x86' 94823eb013SPaolo Bonzini host_arch = 'i386' 950e3ed77dSRichard Hendersonelif cpu == 'mips64' 960e3ed77dSRichard Henderson host_arch = 'mips' 97823eb013SPaolo Bonzinielse 98823eb013SPaolo Bonzini host_arch = cpu 99823eb013SPaolo Bonziniendif 100823eb013SPaolo Bonzini 1018a19980eSPaolo Bonziniif cpu in ['x86', 'x86_64'] 1028a19980eSPaolo Bonzini kvm_targets = ['i386-softmmu', 'x86_64-softmmu'] 1038a19980eSPaolo Bonzinielif cpu == 'aarch64' 1048a19980eSPaolo Bonzini kvm_targets = ['aarch64-softmmu'] 1058a19980eSPaolo Bonzinielif cpu == 's390x' 1068a19980eSPaolo Bonzini kvm_targets = ['s390x-softmmu'] 1078a19980eSPaolo Bonzinielif cpu in ['ppc', 'ppc64'] 1088a19980eSPaolo Bonzini kvm_targets = ['ppc-softmmu', 'ppc64-softmmu'] 109fbc5884cSHuacai Chenelif cpu in ['mips', 'mips64'] 110fbc5884cSHuacai Chen kvm_targets = ['mips-softmmu', 'mipsel-softmmu', 'mips64-softmmu', 'mips64el-softmmu'] 111fbf43c7dSYifei Jiangelif cpu in ['riscv'] 112fbf43c7dSYifei Jiang kvm_targets = ['riscv32-softmmu', 'riscv64-softmmu'] 1138a19980eSPaolo Bonzinielse 1148a19980eSPaolo Bonzini kvm_targets = [] 1158a19980eSPaolo Bonziniendif 1168a19980eSPaolo Bonzini 11744d3d898SIgor Mammedovkvm_targets_c = '""' 11843a363aeSPaolo Bonziniif get_option('kvm').allowed() and targetos == 'linux' 119e741aff0SIgor Mammedov kvm_targets_c = '"' + '" ,"'.join(kvm_targets) + '"' 120e741aff0SIgor Mammedovendif 121e741aff0SIgor Mammedovconfig_host_data.set('CONFIG_KVM_TARGETS', kvm_targets_c) 122e741aff0SIgor Mammedov 1238a19980eSPaolo Bonziniaccelerator_targets = { 'CONFIG_KVM': kvm_targets } 124844a06bbSAlexander Graf 125844a06bbSAlexander Grafif cpu in ['aarch64'] 126844a06bbSAlexander Graf accelerator_targets += { 127844a06bbSAlexander Graf 'CONFIG_HVF': ['aarch64-softmmu'] 128844a06bbSAlexander Graf } 129844a06bbSAlexander Grafendif 130844a06bbSAlexander Graf 1310c3e41d4SAlex Bennéeif cpu in ['x86', 'x86_64', 'arm', 'aarch64'] 1322a2d51bcSMarc-André Lureau # i386 emulator provides xenpv machine type for multiple architectures 1330c3e41d4SAlex Bennée accelerator_targets += { 1340c3e41d4SAlex Bennée 'CONFIG_XEN': ['i386-softmmu', 'x86_64-softmmu'], 1350c3e41d4SAlex Bennée } 1360c3e41d4SAlex Bennéeendif 1378a19980eSPaolo Bonziniif cpu in ['x86', 'x86_64'] 1388a19980eSPaolo Bonzini accelerator_targets += { 1398a19980eSPaolo Bonzini 'CONFIG_HAX': ['i386-softmmu', 'x86_64-softmmu'], 1408a19980eSPaolo Bonzini 'CONFIG_HVF': ['x86_64-softmmu'], 14174a414a1SReinoud Zandijk 'CONFIG_NVMM': ['i386-softmmu', 'x86_64-softmmu'], 1428a19980eSPaolo Bonzini 'CONFIG_WHPX': ['i386-softmmu', 'x86_64-softmmu'], 1438a19980eSPaolo Bonzini } 1448a19980eSPaolo Bonziniendif 1458a19980eSPaolo Bonzini 146a1b176f9SPaolo Bonzinimodular_tcg = [] 147a1b176f9SPaolo Bonzini# Darwin does not support references to thread-local variables in modules 148a1b176f9SPaolo Bonziniif targetos != 'darwin' 149dae0ec15SGerd Hoffmann modular_tcg = ['i386-softmmu', 'x86_64-softmmu'] 150a1b176f9SPaolo Bonziniendif 151dae0ec15SGerd Hoffmann 152eae9a1d1SPhilippe Mathieu-Daudéedk2_targets = [ 'arm-softmmu', 'aarch64-softmmu', 'i386-softmmu', 'x86_64-softmmu' ] 153e49c0ef6SPaolo Bonziniunpack_edk2_blobs = false 154e49c0ef6SPaolo Bonziniforeach target : edk2_targets 155e49c0ef6SPaolo Bonzini if target in target_dirs 156e49c0ef6SPaolo Bonzini bzip2 = find_program('bzip2', required: get_option('install_blobs')) 157e49c0ef6SPaolo Bonzini unpack_edk2_blobs = bzip2.found() 158e49c0ef6SPaolo Bonzini break 159eae9a1d1SPhilippe Mathieu-Daudé endif 160e49c0ef6SPaolo Bonziniendforeach 16145b545ddSPhilippe Mathieu-Daudé 1629c29b741SPaolo Bonzinidtrace = not_found 1639c29b741SPaolo Bonzinistap = not_found 1649c29b741SPaolo Bonziniif 'dtrace' in get_option('trace_backends') 1659c29b741SPaolo Bonzini dtrace = find_program('dtrace', required: true) 1669c29b741SPaolo Bonzini stap = find_program('stap', required: false) 1679c29b741SPaolo Bonzini if stap.found() 1689c29b741SPaolo Bonzini # Workaround to avoid dtrace(1) producing a file with 'hidden' symbol 1699c29b741SPaolo Bonzini # visibility. Define STAP_SDT_V2 to produce 'default' symbol visibility 1709c29b741SPaolo Bonzini # instead. QEMU --enable-modules depends on this because the SystemTap 1719c29b741SPaolo Bonzini # semaphores are linked into the main binary and not the module's shared 1729c29b741SPaolo Bonzini # object. 1739c29b741SPaolo Bonzini add_global_arguments('-DSTAP_SDT_V2', 174e5134024SPaolo Bonzini native: false, language: all_languages) 1759c29b741SPaolo Bonzini endif 1769c29b741SPaolo Bonziniendif 1779c29b741SPaolo Bonzini 17840c909f5SPaolo Bonziniif get_option('iasl') == '' 17940c909f5SPaolo Bonzini iasl = find_program('iasl', required: false) 18040c909f5SPaolo Bonzinielse 18140c909f5SPaolo Bonzini iasl = find_program(get_option('iasl'), required: true) 18240c909f5SPaolo Bonziniendif 18340c909f5SPaolo Bonzini 184201e8ed7SPaolo Bonzini################## 185201e8ed7SPaolo Bonzini# Compiler flags # 186201e8ed7SPaolo Bonzini################## 187201e8ed7SPaolo Bonzini 1888cc2d231SPaolo Bonziniqemu_cflags = config_host['QEMU_CFLAGS'].split() 1894cb37d11SPhilippe Mathieu-Daudéqemu_objcflags = config_host['QEMU_OBJCFLAGS'].split() 1908cc2d231SPaolo Bonziniqemu_ldflags = config_host['QEMU_LDFLAGS'].split() 1918cc2d231SPaolo Bonzini 192a0cbd2e8SPaolo Bonziniif get_option('prefer_static') 193e4333d14SPaolo Bonzini qemu_ldflags += get_option('b_pie') ? '-static-pie' : '-static' 194e4333d14SPaolo Bonziniendif 195e4333d14SPaolo Bonzini 196e4333d14SPaolo Bonzini# Detect support for PT_GNU_RELRO + DT_BIND_NOW. 197e4333d14SPaolo Bonzini# The combination is known as "full relro", because .got.plt is read-only too. 198e4333d14SPaolo Bonziniqemu_ldflags += cc.get_supported_link_arguments('-Wl,-z,relro', '-Wl,-z,now') 199e4333d14SPaolo Bonzini 200d2147e04SPaolo Bonziniif targetos == 'windows' 201d2147e04SPaolo Bonzini qemu_ldflags += cc.get_supported_link_arguments('-Wl,--no-seh', '-Wl,--nxcompat') 2022d73fa74SPaolo Bonzini qemu_ldflags += cc.get_supported_link_arguments('-Wl,--dynamicbase', '-Wl,--high-entropy-va') 203d2147e04SPaolo Bonziniendif 204d2147e04SPaolo Bonzini 205c55cf6abSPaolo Bonziniif get_option('gprof') 206c55cf6abSPaolo Bonzini qemu_cflags += ['-p'] 2074cb37d11SPhilippe Mathieu-Daudé qemu_objcflags += ['-p'] 208c55cf6abSPaolo Bonzini qemu_ldflags += ['-p'] 209c55cf6abSPaolo Bonziniendif 210c55cf6abSPaolo Bonzini 211ff9ed62bSAlexander Bulekov# Specify linker-script with add_project_link_arguments so that it is not placed 212ff9ed62bSAlexander Bulekov# within a linker --start-group/--end-group pair 213537b7248SPaolo Bonziniif get_option('fuzzing') 214537b7248SPaolo Bonzini # Specify a filter to only instrument code that is directly related to 215537b7248SPaolo Bonzini # virtual-devices. 216537b7248SPaolo Bonzini configure_file(output: 'instrumentation-filter', 217537b7248SPaolo Bonzini input: 'scripts/oss-fuzz/instrumentation-filter-template', 218537b7248SPaolo Bonzini copy: true) 219aa4f3a3bSAlexander Bulekov 220aa4f3a3bSAlexander Bulekov if cc.compiles('int main () { return 0; }', 221aa4f3a3bSAlexander Bulekov name: '-fsanitize-coverage-allowlist=/dev/null', 222e56d0970SAlexander Bulekov args: ['-fsanitize-coverage-allowlist=/dev/null', 223e56d0970SAlexander Bulekov '-fsanitize-coverage=trace-pc'] ) 224aa4f3a3bSAlexander Bulekov add_global_arguments('-fsanitize-coverage-allowlist=instrumentation-filter', 225e5134024SPaolo Bonzini native: false, language: all_languages) 226aa4f3a3bSAlexander Bulekov endif 227537b7248SPaolo Bonzini 228537b7248SPaolo Bonzini if get_option('fuzzing_engine') == '' 229537b7248SPaolo Bonzini # Add CFLAGS to tell clang to add fuzzer-related instrumentation to all the 230537b7248SPaolo Bonzini # compiled code. To build non-fuzzer binaries with --enable-fuzzing, link 231537b7248SPaolo Bonzini # everything with fsanitize=fuzzer-no-link. Otherwise, the linker will be 232537b7248SPaolo Bonzini # unable to bind the fuzzer-related callbacks added by instrumentation. 233537b7248SPaolo Bonzini add_global_arguments('-fsanitize=fuzzer-no-link', 234e5134024SPaolo Bonzini native: false, language: all_languages) 235537b7248SPaolo Bonzini add_global_link_arguments('-fsanitize=fuzzer-no-link', 236e5134024SPaolo Bonzini native: false, language: all_languages) 237537b7248SPaolo Bonzini # For the actual fuzzer binaries, we need to link against the libfuzzer 238537b7248SPaolo Bonzini # library. They need to be configurable, to support OSS-Fuzz 239537b7248SPaolo Bonzini fuzz_exe_ldflags = ['-fsanitize=fuzzer'] 240537b7248SPaolo Bonzini else 241537b7248SPaolo Bonzini # LIB_FUZZING_ENGINE was set; assume we are running on OSS-Fuzz, and 242537b7248SPaolo Bonzini # the needed CFLAGS have already been provided 243537b7248SPaolo Bonzini fuzz_exe_ldflags = get_option('fuzzing_engine').split() 244537b7248SPaolo Bonzini endif 245ff9ed62bSAlexander Bulekovendif 246ff9ed62bSAlexander Bulekov 247b485458eSPaolo Bonzini# Check that the C++ compiler exists and works with the C compiler. 248b485458eSPaolo Bonzinilink_language = 'c' 249b485458eSPaolo Bonzinilinker = cc 250b485458eSPaolo Bonziniqemu_cxxflags = [] 251e5134024SPaolo Bonziniif 'cpp' in all_languages 252b485458eSPaolo Bonzini add_global_arguments(['-D__STDC_LIMIT_MACROS', '-D__STDC_CONSTANT_MACROS', '-D__STDC_FORMAT_MACROS'], 253b485458eSPaolo Bonzini native: false, language: 'cpp') 254b485458eSPaolo Bonzini foreach k: qemu_cflags 255b485458eSPaolo Bonzini if k not in ['-Wstrict-prototypes', '-Wmissing-prototypes', '-Wnested-externs', 256b485458eSPaolo Bonzini '-Wold-style-declaration', '-Wold-style-definition', '-Wredundant-decls'] 257b485458eSPaolo Bonzini qemu_cxxflags += [k] 258b485458eSPaolo Bonzini endif 259b485458eSPaolo Bonzini endforeach 260b485458eSPaolo Bonzini 261b485458eSPaolo Bonzini if cxx.links(files('scripts/main.c'), args: qemu_cflags) 262b485458eSPaolo Bonzini link_language = 'cpp' 263b485458eSPaolo Bonzini linker = cxx 264b485458eSPaolo Bonzini else 265b485458eSPaolo Bonzini message('C++ compiler does not work with C compiler') 266b485458eSPaolo Bonzini message('Disabling C++-specific optional code') 267b485458eSPaolo Bonzini endif 268b485458eSPaolo Bonziniendif 269b485458eSPaolo Bonzini 270e4333d14SPaolo Bonzini# Exclude --warn-common with TSan to suppress warnings from the TSan libraries. 271e4333d14SPaolo Bonziniif targetos != 'sunos' and not config_host.has_key('CONFIG_TSAN') 272e4333d14SPaolo Bonzini qemu_ldflags += linker.get_supported_link_arguments('-Wl,--warn-common') 273e4333d14SPaolo Bonziniendif 274e4333d14SPaolo Bonzini 275e5134024SPaolo Bonziniadd_global_link_arguments(qemu_ldflags, native: false, language: all_languages) 276a5665051SPaolo Bonzini 277e5134024SPaolo Bonziniadd_global_arguments(qemu_cflags, native: false, language: 'c') 278e5134024SPaolo Bonziniadd_global_arguments(qemu_cxxflags, native: false, language: 'cpp') 279e5134024SPaolo Bonziniadd_global_arguments(qemu_objcflags, native: false, language: 'objc') 2801e6e616dSPaolo Bonziniif targetos == 'linux' 2811e6e616dSPaolo Bonzini add_project_arguments('-isystem', meson.current_source_dir() / 'linux-headers', 2821e6e616dSPaolo Bonzini '-isystem', 'linux-headers', 283e5134024SPaolo Bonzini language: all_languages) 2841e6e616dSPaolo Bonziniendif 2851e6e616dSPaolo Bonzini 28623a77b2dSPaolo Bonziniadd_project_arguments('-iquote', '.', 2871e6e616dSPaolo Bonzini '-iquote', meson.current_source_dir(), 2881e6e616dSPaolo Bonzini '-iquote', meson.current_source_dir() / 'include', 289e5134024SPaolo Bonzini language: all_languages) 290a5665051SPaolo Bonzini 291deb62371SPaolo Bonzinisparse = find_program('cgcc', required: get_option('sparse')) 292deb62371SPaolo Bonziniif sparse.found() 293968b4db3SPaolo Bonzini run_target('sparse', 294968b4db3SPaolo Bonzini command: [find_program('scripts/check_sparse.py'), 295deb62371SPaolo Bonzini 'compile_commands.json', sparse.full_path(), '-Wbitwise', 296deb62371SPaolo Bonzini '-Wno-transparent-union', '-Wno-old-initializer', 297deb62371SPaolo Bonzini '-Wno-non-pointer-null']) 298968b4db3SPaolo Bonziniendif 299968b4db3SPaolo Bonzini 3006ec0e15dSPaolo Bonzini########################################### 3016ec0e15dSPaolo Bonzini# Target-specific checks and dependencies # 3026ec0e15dSPaolo Bonzini########################################### 3036ec0e15dSPaolo Bonzini 304b7a75c8cSPaolo Bonzini# Fuzzing 305537b7248SPaolo Bonziniif get_option('fuzzing') and get_option('fuzzing_engine') == '' and \ 306537b7248SPaolo Bonzini not cc.links(''' 307537b7248SPaolo Bonzini #include <stdint.h> 308537b7248SPaolo Bonzini #include <sys/types.h> 309537b7248SPaolo Bonzini int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size); 310537b7248SPaolo Bonzini int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { return 0; } 311537b7248SPaolo Bonzini ''', 312537b7248SPaolo Bonzini args: ['-Werror', '-fsanitize=fuzzer']) 313537b7248SPaolo Bonzini error('Your compiler does not support -fsanitize=fuzzer') 314537b7248SPaolo Bonziniendif 315537b7248SPaolo Bonzini 316b7a75c8cSPaolo Bonzini# Tracing backends 3179c29b741SPaolo Bonziniif 'ftrace' in get_option('trace_backends') and targetos != 'linux' 3189c29b741SPaolo Bonzini error('ftrace is supported only on Linux') 3199c29b741SPaolo Bonziniendif 3209c29b741SPaolo Bonziniif 'syslog' in get_option('trace_backends') and not cc.compiles(''' 3219c29b741SPaolo Bonzini #include <syslog.h> 3229c29b741SPaolo Bonzini int main(void) { 3239c29b741SPaolo Bonzini openlog("qemu", LOG_PID, LOG_DAEMON); 3249c29b741SPaolo Bonzini syslog(LOG_INFO, "configure"); 3259c29b741SPaolo Bonzini return 0; 3269c29b741SPaolo Bonzini }''') 3279c29b741SPaolo Bonzini error('syslog is not supported on this system') 3289c29b741SPaolo Bonziniendif 3299c29b741SPaolo Bonzini 330b7a75c8cSPaolo Bonzini# Miscellaneous Linux-only features 331a436d6d4SPaolo Bonziniget_option('mpath') \ 332a436d6d4SPaolo Bonzini .require(targetos == 'linux', error_message: 'Multipath is supported only on Linux') 3336ec0e15dSPaolo Bonzini 334a436d6d4SPaolo Bonzinimultiprocess_allowed = get_option('multiprocess') \ 335a436d6d4SPaolo Bonzini .require(targetos == 'linux', error_message: 'Multiprocess QEMU is supported only on Linux') \ 336a436d6d4SPaolo Bonzini .allowed() 337106ad1f9SPaolo Bonzini 33855116968SJagannathan Ramanvfio_user_server_allowed = get_option('vfio_user_server') \ 33955116968SJagannathan Raman .require(targetos == 'linux', error_message: 'vfio-user server is supported only on Linux') \ 34055116968SJagannathan Raman .allowed() 34155116968SJagannathan Raman 3420d04c4c9SPaolo Bonzinihave_tpm = get_option('tpm') \ 3430d04c4c9SPaolo Bonzini .require(targetos != 'windows', error_message: 'TPM emulation only available on POSIX systems') \ 3440d04c4c9SPaolo Bonzini .allowed() 3450d04c4c9SPaolo Bonzini 3462a3129a3SPaolo Bonzini# vhost 3472df89d54SPaolo Bonzinihave_vhost_user = get_option('vhost_user') \ 3482df89d54SPaolo Bonzini .disable_auto_if(targetos != 'linux') \ 3492df89d54SPaolo Bonzini .require(targetos != 'windows', 3502df89d54SPaolo Bonzini error_message: 'vhost-user is not available on Windows').allowed() 3512df89d54SPaolo Bonzinihave_vhost_vdpa = get_option('vhost_vdpa') \ 3522df89d54SPaolo Bonzini .require(targetos == 'linux', 3532df89d54SPaolo Bonzini error_message: 'vhost-vdpa is only available on Linux').allowed() 3542df89d54SPaolo Bonzinihave_vhost_kernel = get_option('vhost_kernel') \ 3552df89d54SPaolo Bonzini .require(targetos == 'linux', 3562df89d54SPaolo Bonzini error_message: 'vhost-kernel is only available on Linux').allowed() 3572df89d54SPaolo Bonzinihave_vhost_user_crypto = get_option('vhost_crypto') \ 3582df89d54SPaolo Bonzini .require(have_vhost_user, 3592df89d54SPaolo Bonzini error_message: 'vhost-crypto requires vhost-user to be enabled').allowed() 3602df89d54SPaolo Bonzini 36143b6d7eeSPaolo Bonzinihave_vhost = have_vhost_user or have_vhost_vdpa or have_vhost_kernel 3622df89d54SPaolo Bonzini 3632df89d54SPaolo Bonzinihave_vhost_net_user = have_vhost_user and get_option('vhost_net').allowed() 3642df89d54SPaolo Bonzinihave_vhost_net_vdpa = have_vhost_vdpa and get_option('vhost_net').allowed() 3652df89d54SPaolo Bonzinihave_vhost_net_kernel = have_vhost_kernel and get_option('vhost_net').allowed() 3662df89d54SPaolo Bonzinihave_vhost_net = have_vhost_net_kernel or have_vhost_net_user or have_vhost_net_vdpa 3672a3129a3SPaolo Bonzini 368b7a75c8cSPaolo Bonzini# Target-specific libraries and flags 3697fa1c635SPaolo Bonzinilibm = cc.find_library('m', required: false) 3706d7c7c2dSPaolo Bonzinithreads = dependency('threads') 371a81df1b6SPaolo Bonziniutil = cc.find_library('util', required: false) 3724a96337dSPaolo Bonziniwinmm = [] 373a81df1b6SPaolo Bonzinisocket = [] 37404c6f1e7SMarc-André Lureauversion_res = [] 375d92989aaSMarc-André Lureaucoref = [] 376d92989aaSMarc-André Lureauiokit = [] 377b6c7cfd4SPaolo Bonziniemulator_link_args = [] 37874a414a1SReinoud Zandijknvmm =not_found 3798a19980eSPaolo Bonzinihvf = not_found 38023011f44SMarc-André Lureaumidl = not_found 38123011f44SMarc-André Lureauwidl = not_found 382cf60ccc3SAkihiko Odakipathcch = not_found 383a6305081SPaolo Bonzinihost_dsosuf = '.so' 384a81df1b6SPaolo Bonziniif targetos == 'windows' 38523011f44SMarc-André Lureau midl = find_program('midl', required: false) 38623011f44SMarc-André Lureau widl = find_program('widl', required: false) 387cf60ccc3SAkihiko Odaki pathcch = cc.find_library('pathcch') 388a81df1b6SPaolo Bonzini socket = cc.find_library('ws2_32') 3894a96337dSPaolo Bonzini winmm = cc.find_library('winmm') 39004c6f1e7SMarc-André Lureau 39104c6f1e7SMarc-André Lureau win = import('windows') 39204c6f1e7SMarc-André Lureau version_res = win.compile_resources('version.rc', 39304c6f1e7SMarc-André Lureau depend_files: files('pc-bios/qemu-nsis.ico'), 39404c6f1e7SMarc-André Lureau include_directories: include_directories('.')) 395a6305081SPaolo Bonzini host_dsosuf = '.dll' 396d92989aaSMarc-André Lureauelif targetos == 'darwin' 397d92989aaSMarc-André Lureau coref = dependency('appleframeworks', modules: 'CoreFoundation') 39814176c8dSJoelle van Dyne iokit = dependency('appleframeworks', modules: 'IOKit', required: false) 399a6305081SPaolo Bonzini host_dsosuf = '.dylib' 400cfad62f1SPaolo Bonzinielif targetos == 'sunos' 401cfad62f1SPaolo Bonzini socket = [cc.find_library('socket'), 402cfad62f1SPaolo Bonzini cc.find_library('nsl'), 403cfad62f1SPaolo Bonzini cc.find_library('resolv')] 404cfad62f1SPaolo Bonzinielif targetos == 'haiku' 405cfad62f1SPaolo Bonzini socket = [cc.find_library('posix_error_mapper'), 406cfad62f1SPaolo Bonzini cc.find_library('network'), 407cfad62f1SPaolo Bonzini cc.find_library('bsd')] 408b6c7cfd4SPaolo Bonzinielif targetos == 'openbsd' 40943a363aeSPaolo Bonzini if get_option('tcg').allowed() and target_dirs.length() > 0 410b6c7cfd4SPaolo Bonzini # Disable OpenBSD W^X if available 411b6c7cfd4SPaolo Bonzini emulator_link_args = cc.get_supported_link_arguments('-Wl,-z,wxneeded') 412b6c7cfd4SPaolo Bonzini endif 413a81df1b6SPaolo Bonziniendif 4146ec0e15dSPaolo Bonzini 415b7a75c8cSPaolo Bonzini# Target-specific configuration of accelerators 4168a19980eSPaolo Bonziniaccelerators = [] 41743a363aeSPaolo Bonziniif get_option('kvm').allowed() and targetos == 'linux' 4188a19980eSPaolo Bonzini accelerators += 'CONFIG_KVM' 4198a19980eSPaolo Bonziniendif 42043a363aeSPaolo Bonziniif get_option('whpx').allowed() and targetos == 'windows' 42157e2a1f8SSunil Muthuswamy if get_option('whpx').enabled() and host_machine.cpu() != 'x86_64' 4228a19980eSPaolo Bonzini error('WHPX requires 64-bit host') 4238a19980eSPaolo Bonzini elif cc.has_header('WinHvPlatform.h', required: get_option('whpx')) and \ 4248a19980eSPaolo Bonzini cc.has_header('WinHvEmulation.h', required: get_option('whpx')) 4258a19980eSPaolo Bonzini accelerators += 'CONFIG_WHPX' 4268a19980eSPaolo Bonzini endif 4278a19980eSPaolo Bonziniendif 42843a363aeSPaolo Bonziniif get_option('hvf').allowed() 4298a19980eSPaolo Bonzini hvf = dependency('appleframeworks', modules: 'Hypervisor', 4308a19980eSPaolo Bonzini required: get_option('hvf')) 4318a19980eSPaolo Bonzini if hvf.found() 4328a19980eSPaolo Bonzini accelerators += 'CONFIG_HVF' 4338a19980eSPaolo Bonzini endif 4348a19980eSPaolo Bonziniendif 43543a363aeSPaolo Bonziniif get_option('hax').allowed() 4368a19980eSPaolo Bonzini if get_option('hax').enabled() or targetos in ['windows', 'darwin', 'netbsd'] 4378a19980eSPaolo Bonzini accelerators += 'CONFIG_HAX' 4388a19980eSPaolo Bonzini endif 4398a19980eSPaolo Bonziniendif 44074a414a1SReinoud Zandijkif targetos == 'netbsd' 44174a414a1SReinoud Zandijk nvmm = cc.find_library('nvmm', required: get_option('nvmm')) 44274a414a1SReinoud Zandijk if nvmm.found() 44374a414a1SReinoud Zandijk accelerators += 'CONFIG_NVMM' 44474a414a1SReinoud Zandijk endif 44574a414a1SReinoud Zandijkendif 44623a77b2dSPaolo Bonzini 447823eb013SPaolo Bonzinitcg_arch = host_arch 44843a363aeSPaolo Bonziniif get_option('tcg').allowed() 449823eb013SPaolo Bonzini if host_arch == 'unknown' 45023a77b2dSPaolo Bonzini if get_option('tcg_interpreter') 451f1f727acSPhilippe Mathieu-Daudé warning('Unsupported CPU @0@, will use TCG with TCI (slow)'.format(cpu)) 4528a19980eSPaolo Bonzini else 4538a19980eSPaolo Bonzini error('Unsupported CPU @0@, try --enable-tcg-interpreter'.format(cpu)) 4548a19980eSPaolo Bonzini endif 455fa2f7b0bSPhilippe Mathieu-Daudé elif get_option('tcg_interpreter') 4561c282da3SPhilippe Mathieu-Daudé warning('Use of the TCG interpreter is not recommended on this host') 457fa2f7b0bSPhilippe Mathieu-Daudé warning('architecture. There is a native TCG execution backend available') 458fa2f7b0bSPhilippe Mathieu-Daudé warning('which provides substantially better performance and reliability.') 459fa2f7b0bSPhilippe Mathieu-Daudé warning('It is strongly recommended to remove the --enable-tcg-interpreter') 460fa2f7b0bSPhilippe Mathieu-Daudé warning('configuration option on this architecture to use the native') 461fa2f7b0bSPhilippe Mathieu-Daudé warning('backend.') 4628a19980eSPaolo Bonzini endif 46323a77b2dSPaolo Bonzini if get_option('tcg_interpreter') 46423a77b2dSPaolo Bonzini tcg_arch = 'tci' 465ed145144SRichard Henderson config_host += { 'CONFIG_TCG_INTERPRETER': 'y' } 466823eb013SPaolo Bonzini elif host_arch == 'x86_64' 46723a77b2dSPaolo Bonzini tcg_arch = 'i386' 468823eb013SPaolo Bonzini elif host_arch == 'ppc64' 46923a77b2dSPaolo Bonzini tcg_arch = 'ppc' 47023a77b2dSPaolo Bonzini endif 47123a77b2dSPaolo Bonzini add_project_arguments('-iquote', meson.current_source_dir() / 'tcg' / tcg_arch, 472e5134024SPaolo Bonzini language: all_languages) 47323a77b2dSPaolo Bonzini 4748a19980eSPaolo Bonzini accelerators += 'CONFIG_TCG' 4758a19980eSPaolo Bonzini config_host += { 'CONFIG_TCG': 'y' } 4768a19980eSPaolo Bonziniendif 4778a19980eSPaolo Bonzini 4788a19980eSPaolo Bonziniif 'CONFIG_KVM' not in accelerators and get_option('kvm').enabled() 4798a19980eSPaolo Bonzini error('KVM not available on this platform') 4808a19980eSPaolo Bonziniendif 4818a19980eSPaolo Bonziniif 'CONFIG_HVF' not in accelerators and get_option('hvf').enabled() 4828a19980eSPaolo Bonzini error('HVF not available on this platform') 4838a19980eSPaolo Bonziniendif 48474a414a1SReinoud Zandijkif 'CONFIG_NVMM' not in accelerators and get_option('nvmm').enabled() 48574a414a1SReinoud Zandijk error('NVMM not available on this platform') 48674a414a1SReinoud Zandijkendif 4878a19980eSPaolo Bonziniif 'CONFIG_WHPX' not in accelerators and get_option('whpx').enabled() 4888a19980eSPaolo Bonzini error('WHPX not available on this platform') 4898a19980eSPaolo Bonziniendif 490b4e312e9SPaolo Bonzini 4916ec0e15dSPaolo Bonzini################ 4926ec0e15dSPaolo Bonzini# Dependencies # 4936ec0e15dSPaolo Bonzini################ 4946ec0e15dSPaolo Bonzini 495*fc9a809eSPaolo Bonzini# When bumping glib minimum version, please check also whether to increase 496*fc9a809eSPaolo Bonzini# the _WIN32_WINNT setting in osdep.h according to the value from glib 497*fc9a809eSPaolo Bonziniglib_req_ver = '>=2.56.0' 498*fc9a809eSPaolo Bonziniglib_pc = dependency('glib-2.0', version: glib_req_ver, required: true, 499*fc9a809eSPaolo Bonzini method: 'pkg-config') 500*fc9a809eSPaolo Bonziniglib_cflags = [] 501*fc9a809eSPaolo Bonziniif config_host.has_key('CONFIG_MODULES') 502*fc9a809eSPaolo Bonzini gmodule = dependency('gmodule-export-2.0', version: glib_req_ver, required: true, 503*fc9a809eSPaolo Bonzini method: 'pkg-config') 504*fc9a809eSPaolo Bonzinielif config_host.has_key('CONFIG_PLUGIN') 505*fc9a809eSPaolo Bonzini gmodule = dependency('gmodule-no-export-2.0', version: glib_req_ver, required: true, 506*fc9a809eSPaolo Bonzini method: 'pkg-config') 507*fc9a809eSPaolo Bonzinielse 508*fc9a809eSPaolo Bonzini gmodule = not_found 509e3feb2ccSEmilio Cotaendif 510953d5a9eSMarc-André Lureau 511*fc9a809eSPaolo Bonzini# This workaround is required due to a bug in pkg-config file for glib as it 512*fc9a809eSPaolo Bonzini# doesn't define GLIB_STATIC_COMPILATION for pkg-config --static 513*fc9a809eSPaolo Bonziniif targetos == 'windows' and get_option('prefer_static') 514*fc9a809eSPaolo Bonzini glib_cflags += ['-DGLIB_STATIC_COMPILATION'] 515*fc9a809eSPaolo Bonziniendif 516*fc9a809eSPaolo Bonzini 517*fc9a809eSPaolo Bonzini# Sanity check that the current size_t matches the 518*fc9a809eSPaolo Bonzini# size that glib thinks it should be. This catches 519*fc9a809eSPaolo Bonzini# problems on multi-arch where people try to build 520*fc9a809eSPaolo Bonzini# 32-bit QEMU while pointing at 64-bit glib headers 521*fc9a809eSPaolo Bonzini 522*fc9a809eSPaolo Bonziniif not cc.compiles(''' 523*fc9a809eSPaolo Bonzini #include <glib.h> 524*fc9a809eSPaolo Bonzini #include <unistd.h> 525*fc9a809eSPaolo Bonzini 526*fc9a809eSPaolo Bonzini #define QEMU_BUILD_BUG_ON(x) \ 527*fc9a809eSPaolo Bonzini typedef char qemu_build_bug_on[(x)?-1:1] __attribute__((unused)); 528*fc9a809eSPaolo Bonzini 529*fc9a809eSPaolo Bonzini int main(void) { 530*fc9a809eSPaolo Bonzini QEMU_BUILD_BUG_ON(sizeof(size_t) != GLIB_SIZEOF_SIZE_T); 531*fc9a809eSPaolo Bonzini return 0; 532*fc9a809eSPaolo Bonzini }''', dependencies: glib_pc, args: glib_cflags) 533*fc9a809eSPaolo Bonzini error('''sizeof(size_t) doesn't match GLIB_SIZEOF_SIZE_T. 534*fc9a809eSPaolo Bonzini You probably need to set PKG_CONFIG_LIBDIR" to point 535*fc9a809eSPaolo Bonzini to the right pkg-config files for your build target.''') 536*fc9a809eSPaolo Bonziniendif 537*fc9a809eSPaolo Bonzini 538*fc9a809eSPaolo Bonzini# Silence clang warnings triggered by glib < 2.57.2 539*fc9a809eSPaolo Bonziniif not cc.compiles(''' 540*fc9a809eSPaolo Bonzini #include <glib.h> 541*fc9a809eSPaolo Bonzini typedef struct Foo { 542*fc9a809eSPaolo Bonzini int i; 543*fc9a809eSPaolo Bonzini } Foo; 544*fc9a809eSPaolo Bonzini static void foo_free(Foo *f) 545*fc9a809eSPaolo Bonzini { 546*fc9a809eSPaolo Bonzini g_free(f); 547*fc9a809eSPaolo Bonzini } 548*fc9a809eSPaolo Bonzini G_DEFINE_AUTOPTR_CLEANUP_FUNC(Foo, foo_free) 549*fc9a809eSPaolo Bonzini int main(void) { return 0; }''', dependencies: glib_pc, args: ['-Werror']) 550*fc9a809eSPaolo Bonzini glib_cflags += cc.get_supported_arguments('-Wno-unused-function') 551*fc9a809eSPaolo Bonziniendif 552*fc9a809eSPaolo Bonziniglib = declare_dependency(dependencies: [glib_pc, gmodule], 553*fc9a809eSPaolo Bonzini compile_args: glib_cflags, 554*fc9a809eSPaolo Bonzini version: glib_pc.version()) 555*fc9a809eSPaolo Bonzini 556*fc9a809eSPaolo Bonzini# Check whether glib has gslice, which we have to avoid for correctness. 557*fc9a809eSPaolo Bonzini# TODO: remove this check and the corresponding workaround (qtree) when 558*fc9a809eSPaolo Bonzini# the minimum supported glib is >= 2.75.3 559*fc9a809eSPaolo Bonziniglib_has_gslice = glib.version().version_compare('<2.75.3') 560*fc9a809eSPaolo Bonzini 561*fc9a809eSPaolo Bonzini# override glib dep to include the above refinements 562*fc9a809eSPaolo Bonzinimeson.override_dependency('glib-2.0', glib) 563*fc9a809eSPaolo Bonzini 564*fc9a809eSPaolo Bonzini# The path to glib.h is added to all compilation commands. 565*fc9a809eSPaolo Bonziniadd_project_dependencies(glib.partial_dependency(compile_args: true, includes: true), 566*fc9a809eSPaolo Bonzini native: false, language: all_languages) 567*fc9a809eSPaolo Bonzini 568a81df1b6SPaolo Bonzinigio = not_found 5697544060eSPaolo Bonzinigdbus_codegen = not_found 570bb2dc4b7SPaolo Bonzinigdbus_codegen_error = '@0@ requires gdbus-codegen, please install libgio' 5717544060eSPaolo Bonziniif not get_option('gio').auto() or have_system 5727544060eSPaolo Bonzini gio = dependency('gio-2.0', required: get_option('gio'), 573063d5119SPaolo Bonzini method: 'pkg-config') 5747544060eSPaolo Bonzini if gio.found() and not cc.links(''' 5757544060eSPaolo Bonzini #include <gio/gio.h> 5767544060eSPaolo Bonzini int main(void) 5777544060eSPaolo Bonzini { 5787544060eSPaolo Bonzini g_dbus_proxy_new_sync(0, 0, 0, 0, 0, 0, 0, 0); 5797544060eSPaolo Bonzini return 0; 5807544060eSPaolo Bonzini }''', dependencies: [glib, gio]) 5817544060eSPaolo Bonzini if get_option('gio').enabled() 5827544060eSPaolo Bonzini error('The installed libgio is broken for static linking') 583a81df1b6SPaolo Bonzini endif 5847544060eSPaolo Bonzini gio = not_found 5857544060eSPaolo Bonzini endif 5867544060eSPaolo Bonzini if gio.found() 5877544060eSPaolo Bonzini gdbus_codegen = find_program(gio.get_variable('gdbus_codegen'), 5887544060eSPaolo Bonzini required: get_option('gio')) 5897544060eSPaolo Bonzini gio_unix = dependency('gio-unix-2.0', required: get_option('gio'), 590063d5119SPaolo Bonzini method: 'pkg-config') 5917544060eSPaolo Bonzini gio = declare_dependency(dependencies: [gio, gio_unix], 5927544060eSPaolo Bonzini version: gio.version()) 5937544060eSPaolo Bonzini endif 5947544060eSPaolo Bonziniendif 595bb2dc4b7SPaolo Bonziniif gdbus_codegen.found() and get_option('cfi') 596bb2dc4b7SPaolo Bonzini gdbus_codegen = not_found 597bb2dc4b7SPaolo Bonzini gdbus_codegen_error = '@0@ uses gdbus-codegen, which does not support control flow integrity' 598bb2dc4b7SPaolo Bonziniendif 5997544060eSPaolo Bonzini 600a81df1b6SPaolo Bonzinilttng = not_found 6019c29b741SPaolo Bonziniif 'ust' in get_option('trace_backends') 602e32aaa5aSMarc-André Lureau lttng = dependency('lttng-ust', required: true, version: '>= 2.1', 603063d5119SPaolo Bonzini method: 'pkg-config') 604a81df1b6SPaolo Bonziniendif 605b7612f45SPaolo Bonzinipixman = not_found 606b7612f45SPaolo Bonziniif have_system or have_tools 607b7612f45SPaolo Bonzini pixman = dependency('pixman-1', required: have_system, version:'>=0.21.8', 608063d5119SPaolo Bonzini method: 'pkg-config') 609b7612f45SPaolo Bonziniendif 610063d5119SPaolo Bonzinizlib = dependency('zlib', required: true) 61153c22b68SPaolo Bonzini 612ff66f3e5SPaolo Bonzinilibaio = not_found 613ff66f3e5SPaolo Bonziniif not get_option('linux_aio').auto() or have_block 614ff66f3e5SPaolo Bonzini libaio = cc.find_library('aio', has_headers: ['libaio.h'], 615063d5119SPaolo Bonzini required: get_option('linux_aio')) 616ff66f3e5SPaolo Bonziniendif 617354081d4SLeonardo Bras 618354081d4SLeonardo Braslinux_io_uring_test = ''' 619354081d4SLeonardo Bras #include <liburing.h> 620354081d4SLeonardo Bras #include <linux/errqueue.h> 621354081d4SLeonardo Bras 622354081d4SLeonardo Bras int main(void) { return 0; }''' 623354081d4SLeonardo Bras 6245e5733e5SMarc-André Lureaulinux_io_uring = not_found 62553c22b68SPaolo Bonziniif not get_option('linux_io_uring').auto() or have_block 626a41b4fdcSDaniel P. Berrangé linux_io_uring = dependency('liburing', version: '>=0.3', 627a41b4fdcSDaniel P. Berrangé required: get_option('linux_io_uring'), 628063d5119SPaolo Bonzini method: 'pkg-config') 629354081d4SLeonardo Bras if not cc.links(linux_io_uring_test) 630354081d4SLeonardo Bras linux_io_uring = not_found 6315e5733e5SMarc-André Lureau endif 632354081d4SLeonardo Brasendif 633354081d4SLeonardo Bras 6345e5733e5SMarc-André Lureaulibnfs = not_found 63530045c05SPaolo Bonziniif not get_option('libnfs').auto() or have_block 63630045c05SPaolo Bonzini libnfs = dependency('libnfs', version: '>=1.9.3', 63730045c05SPaolo Bonzini required: get_option('libnfs'), 638063d5119SPaolo Bonzini method: 'pkg-config') 6395e5733e5SMarc-André Lureauendif 640f7f2d651SPaolo Bonzini 641f7f2d651SPaolo Bonzinilibattr_test = ''' 642f7f2d651SPaolo Bonzini #include <stddef.h> 643f7f2d651SPaolo Bonzini #include <sys/types.h> 644f7f2d651SPaolo Bonzini #ifdef CONFIG_LIBATTR 645f7f2d651SPaolo Bonzini #include <attr/xattr.h> 646f7f2d651SPaolo Bonzini #else 647f7f2d651SPaolo Bonzini #include <sys/xattr.h> 648f7f2d651SPaolo Bonzini #endif 649f7f2d651SPaolo Bonzini int main(void) { getxattr(NULL, NULL, NULL, 0); setxattr(NULL, NULL, NULL, 0, 0); return 0; }''' 650f7f2d651SPaolo Bonzini 651ec0d5893SMarc-André Lureaulibattr = not_found 652f7f2d651SPaolo Bonzinihave_old_libattr = false 65343a363aeSPaolo Bonziniif get_option('attr').allowed() 654f7f2d651SPaolo Bonzini if cc.links(libattr_test) 655f7f2d651SPaolo Bonzini libattr = declare_dependency() 656f7f2d651SPaolo Bonzini else 657f7f2d651SPaolo Bonzini libattr = cc.find_library('attr', has_headers: ['attr/xattr.h'], 658063d5119SPaolo Bonzini required: get_option('attr')) 659f7f2d651SPaolo Bonzini if libattr.found() and not \ 660f7f2d651SPaolo Bonzini cc.links(libattr_test, dependencies: libattr, args: '-DCONFIG_LIBATTR') 661f7f2d651SPaolo Bonzini libattr = not_found 662f7f2d651SPaolo Bonzini if get_option('attr').enabled() 663f7f2d651SPaolo Bonzini error('could not link libattr') 664f7f2d651SPaolo Bonzini else 665f7f2d651SPaolo Bonzini warning('could not link libattr, disabling') 666ec0d5893SMarc-André Lureau endif 667f7f2d651SPaolo Bonzini else 668f7f2d651SPaolo Bonzini have_old_libattr = libattr.found() 669f7f2d651SPaolo Bonzini endif 670f7f2d651SPaolo Bonzini endif 671f7f2d651SPaolo Bonziniendif 672f7f2d651SPaolo Bonzini 67352eaefd3SAkihiko Odakicocoa = dependency('appleframeworks', modules: ['Cocoa', 'CoreVideo'], 67452eaefd3SAkihiko Odaki required: get_option('cocoa')) 675c1ec4941SPaolo Bonzini 676e2c1d78dSVladislav Yaroshchukvmnet = dependency('appleframeworks', modules: 'vmnet', required: get_option('vmnet')) 677e2c1d78dSVladislav Yaroshchukif vmnet.found() and not cc.has_header_symbol('vmnet/vmnet.h', 678e2c1d78dSVladislav Yaroshchuk 'VMNET_BRIDGED_MODE', 679e2c1d78dSVladislav Yaroshchuk dependencies: vmnet) 680e2c1d78dSVladislav Yaroshchuk vmnet = not_found 681e2c1d78dSVladislav Yaroshchuk if get_option('vmnet').enabled() 682e2c1d78dSVladislav Yaroshchuk error('vmnet.framework API is outdated') 683e2c1d78dSVladislav Yaroshchuk else 684e2c1d78dSVladislav Yaroshchuk warning('vmnet.framework API is outdated, disabling') 685e2c1d78dSVladislav Yaroshchuk endif 686e2c1d78dSVladislav Yaroshchukendif 687e2c1d78dSVladislav Yaroshchuk 6883f99cf57SPaolo Bonziniseccomp = not_found 68973422d95SMichal Privoznikseccomp_has_sysrawrc = false 69090835c2bSPaolo Bonziniif not get_option('seccomp').auto() or have_system or have_tools 69190835c2bSPaolo Bonzini seccomp = dependency('libseccomp', version: '>=2.3.0', 69290835c2bSPaolo Bonzini required: get_option('seccomp'), 693063d5119SPaolo Bonzini method: 'pkg-config') 69473422d95SMichal Privoznik if seccomp.found() 69573422d95SMichal Privoznik seccomp_has_sysrawrc = cc.has_header_symbol('seccomp.h', 69673422d95SMichal Privoznik 'SCMP_FLTATR_API_SYSRAWRC', 69773422d95SMichal Privoznik dependencies: seccomp) 69873422d95SMichal Privoznik endif 6993f99cf57SPaolo Bonziniendif 700727c8bb8SPaolo Bonzini 7013f99cf57SPaolo Bonzinilibcap_ng = not_found 702727c8bb8SPaolo Bonziniif not get_option('cap_ng').auto() or have_system or have_tools 703727c8bb8SPaolo Bonzini libcap_ng = cc.find_library('cap-ng', has_headers: ['cap-ng.h'], 704063d5119SPaolo Bonzini required: get_option('cap_ng')) 7053f99cf57SPaolo Bonziniendif 706727c8bb8SPaolo Bonziniif libcap_ng.found() and not cc.links(''' 707727c8bb8SPaolo Bonzini #include <cap-ng.h> 708727c8bb8SPaolo Bonzini int main(void) 709727c8bb8SPaolo Bonzini { 710727c8bb8SPaolo Bonzini capng_capability_to_name(CAPNG_EFFECTIVE); 711727c8bb8SPaolo Bonzini return 0; 712727c8bb8SPaolo Bonzini }''', dependencies: libcap_ng) 713727c8bb8SPaolo Bonzini libcap_ng = not_found 714727c8bb8SPaolo Bonzini if get_option('cap_ng').enabled() 715727c8bb8SPaolo Bonzini error('could not link libcap-ng') 716727c8bb8SPaolo Bonzini else 717727c8bb8SPaolo Bonzini warning('could not link libcap-ng, disabling') 718727c8bb8SPaolo Bonzini endif 719727c8bb8SPaolo Bonziniendif 720727c8bb8SPaolo Bonzini 7211917ec6dSPaolo Bonziniif get_option('xkbcommon').auto() and not have_system and not have_tools 7221917ec6dSPaolo Bonzini xkbcommon = not_found 7231917ec6dSPaolo Bonzinielse 7241917ec6dSPaolo Bonzini xkbcommon = dependency('xkbcommon', required: get_option('xkbcommon'), 725063d5119SPaolo Bonzini method: 'pkg-config') 726ade60d4fSMarc-André Lureauendif 727e1723999SPaolo Bonzini 7285890258aSThomas Huthslirp = not_found 7295890258aSThomas Huthif not get_option('slirp').auto() or have_system 7305890258aSThomas Huth slirp = dependency('slirp', required: get_option('slirp'), 731063d5119SPaolo Bonzini method: 'pkg-config') 7325890258aSThomas Huth # slirp < 4.7 is incompatible with CFI support in QEMU. This is because 7335890258aSThomas Huth # it passes function pointers within libslirp as callbacks for timers. 7345890258aSThomas Huth # When using a system-wide shared libslirp, the type information for the 7355890258aSThomas Huth # callback is missing and the timer call produces a false positive with CFI. 7365890258aSThomas Huth # Do not use the "version" keyword argument to produce a better error. 7375890258aSThomas Huth # with control-flow integrity. 7385890258aSThomas Huth if get_option('cfi') and slirp.found() and slirp.version().version_compare('<4.7') 7395890258aSThomas Huth if get_option('slirp').enabled() 7405890258aSThomas Huth error('Control-Flow Integrity requires libslirp 4.7.') 7415890258aSThomas Huth else 7425890258aSThomas Huth warning('Cannot use libslirp since Control-Flow Integrity requires libslirp >= 4.7.') 7435890258aSThomas Huth slirp = not_found 7445890258aSThomas Huth endif 7455890258aSThomas Huth endif 7465890258aSThomas Huthendif 7475890258aSThomas Huth 748cdaf0722SMarc-André Lureauvde = not_found 749e1723999SPaolo Bonziniif not get_option('vde').auto() or have_system or have_tools 750e1723999SPaolo Bonzini vde = cc.find_library('vdeplug', has_headers: ['libvdeplug.h'], 751063d5119SPaolo Bonzini required: get_option('vde')) 752e1723999SPaolo Bonziniendif 753e1723999SPaolo Bonziniif vde.found() and not cc.links(''' 754e1723999SPaolo Bonzini #include <libvdeplug.h> 755e1723999SPaolo Bonzini int main(void) 756e1723999SPaolo Bonzini { 757e1723999SPaolo Bonzini struct vde_open_args a = {0, 0, 0}; 758e1723999SPaolo Bonzini char s[] = ""; 759e1723999SPaolo Bonzini vde_open(s, s, &a); 760e1723999SPaolo Bonzini return 0; 761e1723999SPaolo Bonzini }''', dependencies: vde) 762e1723999SPaolo Bonzini vde = not_found 763e1723999SPaolo Bonzini if get_option('cap_ng').enabled() 764e1723999SPaolo Bonzini error('could not link libvdeplug') 765e1723999SPaolo Bonzini else 766e1723999SPaolo Bonzini warning('could not link libvdeplug, disabling') 767e1723999SPaolo Bonzini endif 768cdaf0722SMarc-André Lureauendif 76987430d5bSPaolo Bonzini 770478e943fSPaolo Bonzinipulse = not_found 77187430d5bSPaolo Bonziniif not get_option('pa').auto() or (targetos == 'linux' and have_system) 77287430d5bSPaolo Bonzini pulse = dependency('libpulse', required: get_option('pa'), 773063d5119SPaolo Bonzini method: 'pkg-config') 774478e943fSPaolo Bonziniendif 775478e943fSPaolo Bonzinialsa = not_found 77687430d5bSPaolo Bonziniif not get_option('alsa').auto() or (targetos == 'linux' and have_system) 77787430d5bSPaolo Bonzini alsa = dependency('alsa', required: get_option('alsa'), 778063d5119SPaolo Bonzini method: 'pkg-config') 779478e943fSPaolo Bonziniendif 780478e943fSPaolo Bonzinijack = not_found 78187430d5bSPaolo Bonziniif not get_option('jack').auto() or have_system 78287430d5bSPaolo Bonzini jack = dependency('jack', required: get_option('jack'), 783063d5119SPaolo Bonzini method: 'pkg-config') 784478e943fSPaolo Bonziniendif 785c2d3d1c2SDorinda Basseypipewire = not_found 786c2d3d1c2SDorinda Basseyif not get_option('pipewire').auto() or (targetos == 'linux' and have_system) 787c2d3d1c2SDorinda Bassey pipewire = dependency('libpipewire-0.3', version: '>=0.3.60', 788c2d3d1c2SDorinda Bassey required: get_option('pipewire'), 789063d5119SPaolo Bonzini method: 'pkg-config') 790c2d3d1c2SDorinda Basseyendif 791663df1ccSAlexandre Ratchovsndio = not_found 792663df1ccSAlexandre Ratchovif not get_option('sndio').auto() or have_system 793663df1ccSAlexandre Ratchov sndio = dependency('sndio', required: get_option('sndio'), 794063d5119SPaolo Bonzini method: 'pkg-config') 795663df1ccSAlexandre Ratchovendif 79687430d5bSPaolo Bonzini 79758d3f3ffSGerd Hoffmannspice_protocol = not_found 7983f0a5d55SMarc-André Lureauif not get_option('spice_protocol').auto() or have_system 7995c167b53SMarkus Armbruster spice_protocol = dependency('spice-protocol', version: '>=0.14.0', 8003f0a5d55SMarc-André Lureau required: get_option('spice_protocol'), 801063d5119SPaolo Bonzini method: 'pkg-config') 8022634733cSPaolo Bonziniendif 8033f0a5d55SMarc-André Lureauspice = not_found 8043f0a5d55SMarc-André Lureauif not get_option('spice').auto() or have_system 80534d55725SMarkus Armbruster spice = dependency('spice-server', version: '>=0.14.0', 8063f0a5d55SMarc-André Lureau required: get_option('spice'), 807063d5119SPaolo Bonzini method: 'pkg-config') 80858d3f3ffSGerd Hoffmannendif 8093f0a5d55SMarc-André Lureauspice_headers = spice.partial_dependency(compile_args: true, includes: true) 8103f0a5d55SMarc-André Lureau 8115ee24e78SMarc-André Lureaurt = cc.find_library('rt', required: false) 812a399f914SPaolo Bonzini 81399650b62SPaolo Bonzinilibiscsi = not_found 8149db405a3SPaolo Bonziniif not get_option('libiscsi').auto() or have_block 8159db405a3SPaolo Bonzini libiscsi = dependency('libiscsi', version: '>=1.9.0', 8169db405a3SPaolo Bonzini required: get_option('libiscsi'), 817063d5119SPaolo Bonzini method: 'pkg-config') 81899650b62SPaolo Bonziniendif 8195e5733e5SMarc-André Lureauzstd = not_found 820b1def33dSPaolo Bonziniif not get_option('zstd').auto() or have_block 821b1def33dSPaolo Bonzini zstd = dependency('libzstd', version: '>=1.4.0', 822b1def33dSPaolo Bonzini required: get_option('zstd'), 823063d5119SPaolo Bonzini method: 'pkg-config') 8245e5733e5SMarc-André Lureauendif 825ea458960SMarc-André Lureauvirgl = not_found 8260265fe9eSPaolo Bonzini 8270265fe9eSPaolo Bonzinihave_vhost_user_gpu = have_tools and targetos == 'linux' and pixman.found() 8280265fe9eSPaolo Bonziniif not get_option('virglrenderer').auto() or have_system or have_vhost_user_gpu 829587d59d6SPaolo Bonzini virgl = dependency('virglrenderer', 830587d59d6SPaolo Bonzini method: 'pkg-config', 831063d5119SPaolo Bonzini required: get_option('virglrenderer')) 832ea458960SMarc-André Lureauendif 833fd66dbd4SStefan Hajnocziblkio = not_found 834fd66dbd4SStefan Hajnocziif not get_option('blkio').auto() or have_block 835fd66dbd4SStefan Hajnoczi blkio = dependency('blkio', 836fd66dbd4SStefan Hajnoczi method: 'pkg-config', 837063d5119SPaolo Bonzini required: get_option('blkio')) 838fd66dbd4SStefan Hajnocziendif 8391d7bb6abSMarc-André Lureaucurl = not_found 840f9cd86feSPaolo Bonziniif not get_option('curl').auto() or have_block 841f9cd86feSPaolo Bonzini curl = dependency('libcurl', version: '>=7.29.0', 842f9cd86feSPaolo Bonzini method: 'pkg-config', 843063d5119SPaolo Bonzini required: get_option('curl')) 8441d7bb6abSMarc-André Lureauendif 845f15bff25SPaolo Bonzinilibudev = not_found 846f01496a3SPaolo Bonziniif targetos == 'linux' and (have_system or have_tools) 8476ec0e15dSPaolo Bonzini libudev = dependency('libudev', 848a0fbbb6eSPaolo Bonzini method: 'pkg-config', 849063d5119SPaolo Bonzini required: get_option('libudev')) 850f15bff25SPaolo Bonziniendif 8516ec0e15dSPaolo Bonzini 8525c53015aSPaolo Bonzinimpathlibs = [libudev] 8536ec0e15dSPaolo Bonzinimpathpersist = not_found 8546ec0e15dSPaolo Bonzinimpathpersist_new_api = false 85543a363aeSPaolo Bonziniif targetos == 'linux' and have_tools and get_option('mpath').allowed() 8566ec0e15dSPaolo Bonzini mpath_test_source_new = ''' 8576ec0e15dSPaolo Bonzini #include <libudev.h> 8586ec0e15dSPaolo Bonzini #include <mpath_persist.h> 8596ec0e15dSPaolo Bonzini unsigned mpath_mx_alloc_len = 1024; 8606ec0e15dSPaolo Bonzini int logsink; 8616ec0e15dSPaolo Bonzini static struct config *multipath_conf; 8626ec0e15dSPaolo Bonzini extern struct udev *udev; 8636ec0e15dSPaolo Bonzini extern struct config *get_multipath_config(void); 8646ec0e15dSPaolo Bonzini extern void put_multipath_config(struct config *conf); 8656ec0e15dSPaolo Bonzini struct udev *udev; 8666ec0e15dSPaolo Bonzini struct config *get_multipath_config(void) { return multipath_conf; } 8676ec0e15dSPaolo Bonzini void put_multipath_config(struct config *conf) { } 8686ec0e15dSPaolo Bonzini int main(void) { 8696ec0e15dSPaolo Bonzini udev = udev_new(); 8706ec0e15dSPaolo Bonzini multipath_conf = mpath_lib_init(); 8716ec0e15dSPaolo Bonzini return 0; 8726ec0e15dSPaolo Bonzini }''' 8736ec0e15dSPaolo Bonzini mpath_test_source_old = ''' 8746ec0e15dSPaolo Bonzini #include <libudev.h> 8756ec0e15dSPaolo Bonzini #include <mpath_persist.h> 8766ec0e15dSPaolo Bonzini unsigned mpath_mx_alloc_len = 1024; 8776ec0e15dSPaolo Bonzini int logsink; 8786ec0e15dSPaolo Bonzini int main(void) { 8796ec0e15dSPaolo Bonzini struct udev *udev = udev_new(); 8806ec0e15dSPaolo Bonzini mpath_lib_init(udev); 8816ec0e15dSPaolo Bonzini return 0; 8826ec0e15dSPaolo Bonzini }''' 8835c53015aSPaolo Bonzini libmpathpersist = cc.find_library('mpathpersist', 884063d5119SPaolo Bonzini required: get_option('mpath')) 8855c53015aSPaolo Bonzini if libmpathpersist.found() 8865c53015aSPaolo Bonzini mpathlibs += libmpathpersist 887a0cbd2e8SPaolo Bonzini if get_option('prefer_static') 88843b43a40SPaolo Bonzini mpathlibs += cc.find_library('devmapper', 889063d5119SPaolo Bonzini required: get_option('mpath')) 89043b43a40SPaolo Bonzini endif 89143b43a40SPaolo Bonzini mpathlibs += cc.find_library('multipath', 892063d5119SPaolo Bonzini required: get_option('mpath')) 89343b43a40SPaolo Bonzini foreach lib: mpathlibs 89443b43a40SPaolo Bonzini if not lib.found() 89543b43a40SPaolo Bonzini mpathlibs = [] 89643b43a40SPaolo Bonzini break 89743b43a40SPaolo Bonzini endif 89843b43a40SPaolo Bonzini endforeach 8995c53015aSPaolo Bonzini if mpathlibs.length() == 0 9005c53015aSPaolo Bonzini msg = 'Dependencies missing for libmpathpersist' 9015c53015aSPaolo Bonzini elif cc.links(mpath_test_source_new, dependencies: mpathlibs) 9026ec0e15dSPaolo Bonzini mpathpersist = declare_dependency(dependencies: mpathlibs) 9036ec0e15dSPaolo Bonzini mpathpersist_new_api = true 9046ec0e15dSPaolo Bonzini elif cc.links(mpath_test_source_old, dependencies: mpathlibs) 9056ec0e15dSPaolo Bonzini mpathpersist = declare_dependency(dependencies: mpathlibs) 9066ec0e15dSPaolo Bonzini else 9075c53015aSPaolo Bonzini msg = 'Cannot detect libmpathpersist API' 9085c53015aSPaolo Bonzini endif 9095c53015aSPaolo Bonzini if not mpathpersist.found() 9106ec0e15dSPaolo Bonzini if get_option('mpath').enabled() 9115c53015aSPaolo Bonzini error(msg) 9126ec0e15dSPaolo Bonzini else 9135c53015aSPaolo Bonzini warning(msg + ', disabling') 9146ec0e15dSPaolo Bonzini endif 9156ec0e15dSPaolo Bonzini endif 9166ec0e15dSPaolo Bonzini endif 9176ec0e15dSPaolo Bonziniendif 9186ec0e15dSPaolo Bonzini 9195285e593SYonggang Luoiconv = not_found 92030fe76b1SPaolo Bonzinicurses = not_found 92143a363aeSPaolo Bonziniif have_system and get_option('curses').allowed() 9225285e593SYonggang Luo curses_test = ''' 923fbab8cc2SStefan Weil #if defined(__APPLE__) || defined(__OpenBSD__) 924fbab8cc2SStefan Weil #define _XOPEN_SOURCE_EXTENDED 1 925fbab8cc2SStefan Weil #endif 9265285e593SYonggang Luo #include <locale.h> 9275285e593SYonggang Luo #include <curses.h> 9285285e593SYonggang Luo #include <wchar.h> 9295285e593SYonggang Luo int main(void) { 9305285e593SYonggang Luo wchar_t wch = L'w'; 9315285e593SYonggang Luo setlocale(LC_ALL, ""); 9325285e593SYonggang Luo resize_term(0, 0); 9335285e593SYonggang Luo addwstr(L"wide chars\n"); 9345285e593SYonggang Luo addnwstr(&wch, 1); 9355285e593SYonggang Luo add_wch(WACS_DEGREE); 9365285e593SYonggang Luo return 0; 9375285e593SYonggang Luo }''' 938925a40dfSPaolo Bonzini 939ca31e307SYonggang Luo curses_dep_list = targetos == 'windows' ? ['ncurses', 'ncursesw'] : ['ncursesw'] 9406d322635SPaolo Bonzini curses = dependency(curses_dep_list, 9415285e593SYonggang Luo required: false, 942063d5119SPaolo Bonzini method: 'pkg-config') 943925a40dfSPaolo Bonzini msg = get_option('curses').enabled() ? 'curses library not found' : '' 944fbab8cc2SStefan Weil curses_compile_args = ['-DNCURSES_WIDECHAR=1'] 945925a40dfSPaolo Bonzini if curses.found() 9460dbce6efSPaolo Bonzini if cc.links(curses_test, args: curses_compile_args, dependencies: [curses]) 947bd3615d6SPaolo Bonzini curses = declare_dependency(compile_args: curses_compile_args, dependencies: [curses], 948bd3615d6SPaolo Bonzini version: curses.version()) 949925a40dfSPaolo Bonzini else 950925a40dfSPaolo Bonzini msg = 'curses package not usable' 951925a40dfSPaolo Bonzini curses = not_found 9525285e593SYonggang Luo endif 953925a40dfSPaolo Bonzini endif 954925a40dfSPaolo Bonzini if not curses.found() 955925a40dfSPaolo Bonzini has_curses_h = cc.has_header('curses.h', args: curses_compile_args) 956925a40dfSPaolo Bonzini if targetos != 'windows' and not has_curses_h 957925a40dfSPaolo Bonzini message('Trying with /usr/include/ncursesw') 958925a40dfSPaolo Bonzini curses_compile_args += ['-I/usr/include/ncursesw'] 959925a40dfSPaolo Bonzini has_curses_h = cc.has_header('curses.h', args: curses_compile_args) 960925a40dfSPaolo Bonzini endif 961925a40dfSPaolo Bonzini if has_curses_h 962925a40dfSPaolo Bonzini curses_libname_list = (targetos == 'windows' ? ['pdcurses'] : ['ncursesw', 'cursesw']) 963925a40dfSPaolo Bonzini foreach curses_libname : curses_libname_list 9645285e593SYonggang Luo libcurses = cc.find_library(curses_libname, 965063d5119SPaolo Bonzini required: false) 9665285e593SYonggang Luo if libcurses.found() 967925a40dfSPaolo Bonzini if cc.links(curses_test, args: curses_compile_args, dependencies: libcurses) 968925a40dfSPaolo Bonzini curses = declare_dependency(compile_args: curses_compile_args, 969925a40dfSPaolo Bonzini dependencies: [libcurses]) 9705285e593SYonggang Luo break 971925a40dfSPaolo Bonzini else 972925a40dfSPaolo Bonzini msg = 'curses library not usable' 9735285e593SYonggang Luo endif 9745285e593SYonggang Luo endif 9755285e593SYonggang Luo endforeach 9765285e593SYonggang Luo endif 97730fe76b1SPaolo Bonzini endif 97843a363aeSPaolo Bonzini if get_option('iconv').allowed() 979925a40dfSPaolo Bonzini foreach link_args : [ ['-liconv'], [] ] 980925a40dfSPaolo Bonzini # Programs will be linked with glib and this will bring in libiconv on FreeBSD. 981925a40dfSPaolo Bonzini # We need to use libiconv if available because mixing libiconv's headers with 982925a40dfSPaolo Bonzini # the system libc does not work. 983925a40dfSPaolo Bonzini # However, without adding glib to the dependencies -L/usr/local/lib will not be 984925a40dfSPaolo Bonzini # included in the command line and libiconv will not be found. 985925a40dfSPaolo Bonzini if cc.links(''' 986925a40dfSPaolo Bonzini #include <iconv.h> 987925a40dfSPaolo Bonzini int main(void) { 988925a40dfSPaolo Bonzini iconv_t conv = iconv_open("WCHAR_T", "UCS-2"); 989925a40dfSPaolo Bonzini return conv != (iconv_t) -1; 990*fc9a809eSPaolo Bonzini }''', args: link_args, dependencies: glib) 991925a40dfSPaolo Bonzini iconv = declare_dependency(link_args: link_args, dependencies: glib) 992925a40dfSPaolo Bonzini break 993925a40dfSPaolo Bonzini endif 994925a40dfSPaolo Bonzini endforeach 995925a40dfSPaolo Bonzini endif 996925a40dfSPaolo Bonzini if curses.found() and not iconv.found() 997925a40dfSPaolo Bonzini if get_option('iconv').enabled() 998925a40dfSPaolo Bonzini error('iconv not available') 999925a40dfSPaolo Bonzini endif 1000925a40dfSPaolo Bonzini msg = 'iconv required for curses UI but not available' 1001925a40dfSPaolo Bonzini curses = not_found 1002925a40dfSPaolo Bonzini endif 1003925a40dfSPaolo Bonzini if not curses.found() and msg != '' 1004925a40dfSPaolo Bonzini if get_option('curses').enabled() 1005925a40dfSPaolo Bonzini error(msg) 10065285e593SYonggang Luo else 1007925a40dfSPaolo Bonzini warning(msg + ', disabling') 100830fe76b1SPaolo Bonzini endif 10095285e593SYonggang Luo endif 10105285e593SYonggang Luoendif 10115285e593SYonggang Luo 10122634733cSPaolo Bonzinibrlapi = not_found 10138c6d4ff4SPaolo Bonziniif not get_option('brlapi').auto() or have_system 10148c6d4ff4SPaolo Bonzini brlapi = cc.find_library('brlapi', has_headers: ['brlapi.h'], 1015063d5119SPaolo Bonzini required: get_option('brlapi')) 10168c6d4ff4SPaolo Bonzini if brlapi.found() and not cc.links(''' 10178c6d4ff4SPaolo Bonzini #include <brlapi.h> 10188c6d4ff4SPaolo Bonzini #include <stddef.h> 10198c6d4ff4SPaolo Bonzini int main(void) { return brlapi__openConnection (NULL, NULL, NULL); }''', dependencies: brlapi) 10208c6d4ff4SPaolo Bonzini brlapi = not_found 10218c6d4ff4SPaolo Bonzini if get_option('brlapi').enabled() 10228c6d4ff4SPaolo Bonzini error('could not link brlapi') 10238c6d4ff4SPaolo Bonzini else 10248c6d4ff4SPaolo Bonzini warning('could not link brlapi, disabling') 10258c6d4ff4SPaolo Bonzini endif 10268c6d4ff4SPaolo Bonzini endif 10272634733cSPaolo Bonziniendif 102835be72baSPaolo Bonzini 1029760e4327SPaolo Bonzinisdl = not_found 103064d3fec7SAkihiko Odakiif not get_option('sdl').auto() or have_system 1031063d5119SPaolo Bonzini sdl = dependency('sdl2', required: get_option('sdl')) 103235be72baSPaolo Bonzini sdl_image = not_found 1033760e4327SPaolo Bonziniendif 103435be72baSPaolo Bonziniif sdl.found() 103535be72baSPaolo Bonzini # work around 2.0.8 bug 103635be72baSPaolo Bonzini sdl = declare_dependency(compile_args: '-Wno-undef', 1037bd3615d6SPaolo Bonzini dependencies: sdl, 1038bd3615d6SPaolo Bonzini version: sdl.version()) 10397161a433SVolker Rümelin sdl_image = dependency('SDL2_image', required: get_option('sdl_image'), 1040063d5119SPaolo Bonzini method: 'pkg-config') 104135be72baSPaolo Bonzinielse 104235be72baSPaolo Bonzini if get_option('sdl_image').enabled() 1043a8dc2aceSSergei Trofimovich error('sdl-image required, but SDL was @0@'.format( 1044a8dc2aceSSergei Trofimovich get_option('sdl').disabled() ? 'disabled' : 'not found')) 10452634733cSPaolo Bonzini endif 104635be72baSPaolo Bonzini sdl_image = not_found 104735be72baSPaolo Bonziniendif 104835be72baSPaolo Bonzini 10495e5733e5SMarc-André Lureaurbd = not_found 1050fabd1e93SPaolo Bonziniif not get_option('rbd').auto() or have_block 1051063d5119SPaolo Bonzini librados = cc.find_library('rados', required: get_option('rbd')) 1052fabd1e93SPaolo Bonzini librbd = cc.find_library('rbd', has_headers: ['rbd/librbd.h'], 1053063d5119SPaolo Bonzini required: get_option('rbd')) 1054c518d6c2SPaolo Bonzini if librados.found() and librbd.found() 1055c518d6c2SPaolo Bonzini if cc.links(''' 1056fabd1e93SPaolo Bonzini #include <stdio.h> 1057fabd1e93SPaolo Bonzini #include <rbd/librbd.h> 1058fabd1e93SPaolo Bonzini int main(void) { 1059fabd1e93SPaolo Bonzini rados_t cluster; 1060fabd1e93SPaolo Bonzini rados_create(&cluster, NULL); 106148672ac0SPeter Lieven #if LIBRBD_VERSION_CODE < LIBRBD_VERSION(1, 12, 0) 106248672ac0SPeter Lieven #error 106348672ac0SPeter Lieven #endif 1064fabd1e93SPaolo Bonzini return 0; 1065fabd1e93SPaolo Bonzini }''', dependencies: [librbd, librados]) 1066fabd1e93SPaolo Bonzini rbd = declare_dependency(dependencies: [librbd, librados]) 1067c518d6c2SPaolo Bonzini elif get_option('rbd').enabled() 106848672ac0SPeter Lieven error('librbd >= 1.12.0 required') 1069c518d6c2SPaolo Bonzini else 107048672ac0SPeter Lieven warning('librbd >= 1.12.0 not found, disabling') 1071c518d6c2SPaolo Bonzini endif 10725e5733e5SMarc-André Lureau endif 1073fabd1e93SPaolo Bonziniendif 1074fabd1e93SPaolo Bonzini 10755e5733e5SMarc-André Lureauglusterfs = not_found 107608821ca2SPaolo Bonziniglusterfs_ftruncate_has_stat = false 107708821ca2SPaolo Bonziniglusterfs_iocb_has_stat = false 107808821ca2SPaolo Bonziniif not get_option('glusterfs').auto() or have_block 107908821ca2SPaolo Bonzini glusterfs = dependency('glusterfs-api', version: '>=3', 108008821ca2SPaolo Bonzini required: get_option('glusterfs'), 1081063d5119SPaolo Bonzini method: 'pkg-config') 108208821ca2SPaolo Bonzini if glusterfs.found() 108308821ca2SPaolo Bonzini glusterfs_ftruncate_has_stat = cc.links(''' 108408821ca2SPaolo Bonzini #include <glusterfs/api/glfs.h> 108508821ca2SPaolo Bonzini 108608821ca2SPaolo Bonzini int 108708821ca2SPaolo Bonzini main(void) 108808821ca2SPaolo Bonzini { 108908821ca2SPaolo Bonzini /* new glfs_ftruncate() passes two additional args */ 109008821ca2SPaolo Bonzini return glfs_ftruncate(NULL, 0, NULL, NULL); 109108821ca2SPaolo Bonzini } 109208821ca2SPaolo Bonzini ''', dependencies: glusterfs) 109308821ca2SPaolo Bonzini glusterfs_iocb_has_stat = cc.links(''' 109408821ca2SPaolo Bonzini #include <glusterfs/api/glfs.h> 109508821ca2SPaolo Bonzini 109608821ca2SPaolo Bonzini /* new glfs_io_cbk() passes two additional glfs_stat structs */ 109708821ca2SPaolo Bonzini static void 109808821ca2SPaolo Bonzini glusterfs_iocb(glfs_fd_t *fd, ssize_t ret, struct glfs_stat *prestat, struct glfs_stat *poststat, void *data) 109908821ca2SPaolo Bonzini {} 110008821ca2SPaolo Bonzini 110108821ca2SPaolo Bonzini int 110208821ca2SPaolo Bonzini main(void) 110308821ca2SPaolo Bonzini { 110408821ca2SPaolo Bonzini glfs_io_cbk iocb = &glusterfs_iocb; 110508821ca2SPaolo Bonzini iocb(NULL, 0 , NULL, NULL, NULL); 110608821ca2SPaolo Bonzini return 0; 110708821ca2SPaolo Bonzini } 110808821ca2SPaolo Bonzini ''', dependencies: glusterfs) 110908821ca2SPaolo Bonzini endif 11105e5733e5SMarc-André Lureauendif 1111e6a52b36SThomas Huth 11125e5733e5SMarc-André Lureaulibssh = not_found 1113e6a52b36SThomas Huthif not get_option('libssh').auto() or have_block 1114e6a52b36SThomas Huth libssh = dependency('libssh', version: '>=0.8.7', 1115e6a52b36SThomas Huth method: 'pkg-config', 1116063d5119SPaolo Bonzini required: get_option('libssh')) 11175e5733e5SMarc-André Lureauendif 1118e6a52b36SThomas Huth 11195e5733e5SMarc-André Lureaulibbzip2 = not_found 112029ba6116SPaolo Bonziniif not get_option('bzip2').auto() or have_block 112129ba6116SPaolo Bonzini libbzip2 = cc.find_library('bz2', has_headers: ['bzlib.h'], 1122063d5119SPaolo Bonzini required: get_option('bzip2')) 112329ba6116SPaolo Bonzini if libbzip2.found() and not cc.links(''' 112429ba6116SPaolo Bonzini #include <bzlib.h> 112529ba6116SPaolo Bonzini int main(void) { BZ2_bzlibVersion(); return 0; }''', dependencies: libbzip2) 112629ba6116SPaolo Bonzini libbzip2 = not_found 112729ba6116SPaolo Bonzini if get_option('bzip2').enabled() 112829ba6116SPaolo Bonzini error('could not link libbzip2') 112929ba6116SPaolo Bonzini else 113029ba6116SPaolo Bonzini warning('could not link libbzip2, disabling') 11315e5733e5SMarc-André Lureau endif 113229ba6116SPaolo Bonzini endif 11335e5733e5SMarc-André Lureauendif 1134ecea3696SPaolo Bonzini 11355e5733e5SMarc-André Lureauliblzfse = not_found 1136ecea3696SPaolo Bonziniif not get_option('lzfse').auto() or have_block 1137ecea3696SPaolo Bonzini liblzfse = cc.find_library('lzfse', has_headers: ['lzfse.h'], 1138063d5119SPaolo Bonzini required: get_option('lzfse')) 11395e5733e5SMarc-André Lureauendif 1140ecea3696SPaolo Bonziniif liblzfse.found() and not cc.links(''' 1141ecea3696SPaolo Bonzini #include <lzfse.h> 1142ecea3696SPaolo Bonzini int main(void) { lzfse_decode_scratch_size(); return 0; }''', dependencies: liblzfse) 1143ecea3696SPaolo Bonzini liblzfse = not_found 1144ecea3696SPaolo Bonzini if get_option('lzfse').enabled() 1145ecea3696SPaolo Bonzini error('could not link liblzfse') 1146ecea3696SPaolo Bonzini else 1147ecea3696SPaolo Bonzini warning('could not link liblzfse, disabling') 1148ecea3696SPaolo Bonzini endif 1149ecea3696SPaolo Bonziniendif 1150ecea3696SPaolo Bonzini 1151478e943fSPaolo Bonzinioss = not_found 115243a363aeSPaolo Bonziniif get_option('oss').allowed() and have_system 115387430d5bSPaolo Bonzini if not cc.has_header('sys/soundcard.h') 115487430d5bSPaolo Bonzini # not found 115587430d5bSPaolo Bonzini elif targetos == 'netbsd' 1156063d5119SPaolo Bonzini oss = cc.find_library('ossaudio', required: get_option('oss')) 115787430d5bSPaolo Bonzini else 115887430d5bSPaolo Bonzini oss = declare_dependency() 115987430d5bSPaolo Bonzini endif 116087430d5bSPaolo Bonzini 116187430d5bSPaolo Bonzini if not oss.found() 116287430d5bSPaolo Bonzini if get_option('oss').enabled() 116387430d5bSPaolo Bonzini error('OSS not found') 116487430d5bSPaolo Bonzini endif 116587430d5bSPaolo Bonzini endif 1166478e943fSPaolo Bonziniendif 1167478e943fSPaolo Bonzinidsound = not_found 116887430d5bSPaolo Bonziniif not get_option('dsound').auto() or (targetos == 'windows' and have_system) 116987430d5bSPaolo Bonzini if cc.has_header('dsound.h') 117087430d5bSPaolo Bonzini dsound = declare_dependency(link_args: ['-lole32', '-ldxguid']) 1171478e943fSPaolo Bonzini endif 117287430d5bSPaolo Bonzini 117387430d5bSPaolo Bonzini if not dsound.found() 117487430d5bSPaolo Bonzini if get_option('dsound').enabled() 117587430d5bSPaolo Bonzini error('DirectSound not found') 117687430d5bSPaolo Bonzini endif 117787430d5bSPaolo Bonzini endif 117887430d5bSPaolo Bonziniendif 117987430d5bSPaolo Bonzini 1180478e943fSPaolo Bonzinicoreaudio = not_found 118187430d5bSPaolo Bonziniif not get_option('coreaudio').auto() or (targetos == 'darwin' and have_system) 118287430d5bSPaolo Bonzini coreaudio = dependency('appleframeworks', modules: 'CoreAudio', 118387430d5bSPaolo Bonzini required: get_option('coreaudio')) 1184478e943fSPaolo Bonziniendif 11858bc5184dSThomas Huth 11862b1ccdf4SMarc-André Lureauopengl = not_found 118788b6e618SPaolo Bonziniif not get_option('opengl').auto() or have_system or have_vhost_user_gpu 118888b6e618SPaolo Bonzini epoxy = dependency('epoxy', method: 'pkg-config', 1189063d5119SPaolo Bonzini required: get_option('opengl')) 119088b6e618SPaolo Bonzini if cc.has_header('epoxy/egl.h', dependencies: epoxy) 119188b6e618SPaolo Bonzini opengl = epoxy 119288b6e618SPaolo Bonzini elif get_option('opengl').enabled() 119388b6e618SPaolo Bonzini error('epoxy/egl.h not found') 119488b6e618SPaolo Bonzini endif 11952b1ccdf4SMarc-André Lureauendif 11968bc5184dSThomas Huthgbm = not_found 11978bc5184dSThomas Huthif (have_system or have_tools) and (virgl.found() or opengl.found()) 1198063d5119SPaolo Bonzini gbm = dependency('gbm', method: 'pkg-config', required: false) 11998bc5184dSThomas Huthendif 1200f0caba44SMarc-André Lureauhave_vhost_user_gpu = have_vhost_user_gpu and virgl.found() and opengl.found() and gbm.found() 12011b695471SPaolo Bonzini 120257612511SPaolo Bonzinignutls = not_found 1203cc4c7c73SDaniel P. Berrangégnutls_crypto = not_found 1204abc14fd0SAlyssa Rossif get_option('gnutls').enabled() or (get_option('gnutls').auto() and have_system) 1205cc4c7c73SDaniel P. Berrangé # For general TLS support our min gnutls matches 1206cc4c7c73SDaniel P. Berrangé # that implied by our platform support matrix 1207cc4c7c73SDaniel P. Berrangé # 1208cc4c7c73SDaniel P. Berrangé # For the crypto backends, we look for a newer 1209cc4c7c73SDaniel P. Berrangé # gnutls: 1210cc4c7c73SDaniel P. Berrangé # 1211cc4c7c73SDaniel P. Berrangé # Version 3.6.8 is needed to get XTS 1212cc4c7c73SDaniel P. Berrangé # Version 3.6.13 is needed to get PBKDF 1213cc4c7c73SDaniel P. Berrangé # Version 3.6.14 is needed to get HW accelerated XTS 1214cc4c7c73SDaniel P. Berrangé # 1215cc4c7c73SDaniel P. Berrangé # If newer enough gnutls isn't available, we can 1216cc4c7c73SDaniel P. Berrangé # still use a different crypto backend to satisfy 1217cc4c7c73SDaniel P. Berrangé # the platform support requirements 1218cc4c7c73SDaniel P. Berrangé gnutls_crypto = dependency('gnutls', version: '>=3.6.14', 1219cc4c7c73SDaniel P. Berrangé method: 'pkg-config', 1220063d5119SPaolo Bonzini required: false) 1221cc4c7c73SDaniel P. Berrangé if gnutls_crypto.found() 1222cc4c7c73SDaniel P. Berrangé gnutls = gnutls_crypto 1223cc4c7c73SDaniel P. Berrangé else 1224cc4c7c73SDaniel P. Berrangé # Our min version if all we need is TLS 122557612511SPaolo Bonzini gnutls = dependency('gnutls', version: '>=3.5.18', 122657612511SPaolo Bonzini method: 'pkg-config', 1227063d5119SPaolo Bonzini required: get_option('gnutls')) 122857612511SPaolo Bonzini endif 1229cc4c7c73SDaniel P. Berrangéendif 123057612511SPaolo Bonzini 12318bd0931fSDaniel P. Berrangé# We prefer use of gnutls for crypto, unless the options 12328bd0931fSDaniel P. Berrangé# explicitly asked for nettle or gcrypt. 12338bd0931fSDaniel P. Berrangé# 12348bd0931fSDaniel P. Berrangé# If gnutls isn't available for crypto, then we'll prefer 12358bd0931fSDaniel P. Berrangé# gcrypt over nettle for performance reasons. 123657612511SPaolo Bonzinigcrypt = not_found 123757612511SPaolo Bonzininettle = not_found 12384c5e512eSLei Hehogweed = not_found 123968014044SDaniel P. Berrangéxts = 'none' 12408bd0931fSDaniel P. Berrangé 124157612511SPaolo Bonziniif get_option('nettle').enabled() and get_option('gcrypt').enabled() 124257612511SPaolo Bonzini error('Only one of gcrypt & nettle can be enabled') 124357612511SPaolo Bonziniendif 12448bd0931fSDaniel P. Berrangé 12458bd0931fSDaniel P. Berrangé# Explicit nettle/gcrypt request, so ignore gnutls for crypto 12468bd0931fSDaniel P. Berrangéif get_option('nettle').enabled() or get_option('gcrypt').enabled() 12478bd0931fSDaniel P. Berrangé gnutls_crypto = not_found 124857612511SPaolo Bonziniendif 12498bd0931fSDaniel P. Berrangé 12508bd0931fSDaniel P. Berrangéif not gnutls_crypto.found() 12518bd0931fSDaniel P. Berrangé if (not get_option('gcrypt').auto() or have_system) and not get_option('nettle').enabled() 12521741093bSDaniel P. Berrangé gcrypt = dependency('libgcrypt', version: '>=1.8', 125357612511SPaolo Bonzini method: 'config-tool', 1254063d5119SPaolo Bonzini required: get_option('gcrypt')) 125557612511SPaolo Bonzini # Debian has removed -lgpg-error from libgcrypt-config 125657612511SPaolo Bonzini # as it "spreads unnecessary dependencies" which in 125757612511SPaolo Bonzini # turn breaks static builds... 1258a0cbd2e8SPaolo Bonzini if gcrypt.found() and get_option('prefer_static') 1259bd3615d6SPaolo Bonzini gcrypt = declare_dependency(dependencies: 1260bd3615d6SPaolo Bonzini [gcrypt, 1261bd3615d6SPaolo Bonzini cc.find_library('gpg-error', required: true)], 1262bd3615d6SPaolo Bonzini version: gcrypt.version()) 126357612511SPaolo Bonzini endif 126457612511SPaolo Bonzini endif 1265260a13d4SDaniel P. Berrangé if (not get_option('nettle').auto() or have_system) and not gcrypt.found() 1266260a13d4SDaniel P. Berrangé nettle = dependency('nettle', version: '>=3.4', 1267260a13d4SDaniel P. Berrangé method: 'pkg-config', 1268063d5119SPaolo Bonzini required: get_option('nettle')) 1269260a13d4SDaniel P. Berrangé if nettle.found() and not cc.has_header('nettle/xts.h', dependencies: nettle) 1270260a13d4SDaniel P. Berrangé xts = 'private' 1271260a13d4SDaniel P. Berrangé endif 1272260a13d4SDaniel P. Berrangé endif 1273cc4c7c73SDaniel P. Berrangéendif 127457612511SPaolo Bonzini 1275063d5119SPaolo Bonzinigmp = dependency('gmp', required: false, method: 'pkg-config') 12764c5e512eSLei Heif nettle.found() and gmp.found() 12774c5e512eSLei He hogweed = dependency('hogweed', version: '>=3.4', 12784c5e512eSLei He method: 'pkg-config', 1279063d5119SPaolo Bonzini required: get_option('nettle')) 12804c5e512eSLei Heendif 12814c5e512eSLei He 12824c5e512eSLei He 12832b1ccdf4SMarc-André Lureaugtk = not_found 12841b695471SPaolo Bonzinigtkx11 = not_found 1285c23d7b4eSPaolo Bonzinivte = not_found 128629e0bfffSClaudio Fontanahave_gtk_clipboard = get_option('gtk_clipboard').enabled() 128729e0bfffSClaudio Fontana 128864d3fec7SAkihiko Odakiif not get_option('gtk').auto() or have_system 12891b695471SPaolo Bonzini gtk = dependency('gtk+-3.0', version: '>=3.22.0', 12901b695471SPaolo Bonzini method: 'pkg-config', 1291063d5119SPaolo Bonzini required: get_option('gtk')) 12921b695471SPaolo Bonzini if gtk.found() 12931b695471SPaolo Bonzini gtkx11 = dependency('gtk+-x11-3.0', version: '>=3.22.0', 12941b695471SPaolo Bonzini method: 'pkg-config', 1295063d5119SPaolo Bonzini required: false) 1296bd3615d6SPaolo Bonzini gtk = declare_dependency(dependencies: [gtk, gtkx11], 1297bd3615d6SPaolo Bonzini version: gtk.version()) 1298c23d7b4eSPaolo Bonzini 1299c23d7b4eSPaolo Bonzini if not get_option('vte').auto() or have_system 1300c23d7b4eSPaolo Bonzini vte = dependency('vte-2.91', 1301c23d7b4eSPaolo Bonzini method: 'pkg-config', 1302063d5119SPaolo Bonzini required: get_option('vte')) 1303c23d7b4eSPaolo Bonzini endif 130429e0bfffSClaudio Fontana elif have_gtk_clipboard 130529e0bfffSClaudio Fontana error('GTK clipboard requested, but GTK not found') 13062b1ccdf4SMarc-André Lureau endif 13071b695471SPaolo Bonziniendif 13081b695471SPaolo Bonzini 13092b1ccdf4SMarc-André Lureaux11 = not_found 13109d49bcf6SMarkus Armbrusterif gtkx11.found() 1311063d5119SPaolo Bonzini x11 = dependency('x11', method: 'pkg-config', required: gtkx11.found()) 13122b1ccdf4SMarc-André Lureauendif 13132b1ccdf4SMarc-André Lureaupng = not_found 131495f8510eSKshitij Suriif get_option('png').allowed() and have_system 13151ec8c2c0SThomas Huth png = dependency('libpng', version: '>=1.6.34', required: get_option('png'), 1316063d5119SPaolo Bonzini method: 'pkg-config') 131795f8510eSKshitij Suriendif 131895f8510eSKshitij Surivnc = not_found 13192b1ccdf4SMarc-André Lureaujpeg = not_found 13202b1ccdf4SMarc-André Lureausasl = not_found 132143a363aeSPaolo Bonziniif get_option('vnc').allowed() and have_system 1322a0b93237SPaolo Bonzini vnc = declare_dependency() # dummy dependency 13238e242b3cSPaolo Bonzini jpeg = dependency('libjpeg', required: get_option('vnc_jpeg'), 1324063d5119SPaolo Bonzini method: 'pkg-config') 1325a0b93237SPaolo Bonzini sasl = cc.find_library('sasl2', has_headers: ['sasl/sasl.h'], 1326063d5119SPaolo Bonzini required: get_option('vnc_sasl')) 1327a0b93237SPaolo Bonzini if sasl.found() 1328a0b93237SPaolo Bonzini sasl = declare_dependency(dependencies: sasl, 1329a0b93237SPaolo Bonzini compile_args: '-DSTRUCT_IOVEC_DEFINED') 1330a0b93237SPaolo Bonzini endif 13312b1ccdf4SMarc-André Lureauendif 1332241611eaSPaolo Bonzini 133305e391aeSPaolo Bonzinipam = not_found 133405e391aeSPaolo Bonziniif not get_option('auth_pam').auto() or have_system 133505e391aeSPaolo Bonzini pam = cc.find_library('pam', has_headers: ['security/pam_appl.h'], 1336063d5119SPaolo Bonzini required: get_option('auth_pam')) 133705e391aeSPaolo Bonziniendif 133805e391aeSPaolo Bonziniif pam.found() and not cc.links(''' 133905e391aeSPaolo Bonzini #include <stddef.h> 134005e391aeSPaolo Bonzini #include <security/pam_appl.h> 134105e391aeSPaolo Bonzini int main(void) { 134205e391aeSPaolo Bonzini const char *service_name = "qemu"; 134305e391aeSPaolo Bonzini const char *user = "frank"; 134405e391aeSPaolo Bonzini const struct pam_conv pam_conv = { 0 }; 134505e391aeSPaolo Bonzini pam_handle_t *pamh = NULL; 134605e391aeSPaolo Bonzini pam_start(service_name, user, &pam_conv, &pamh); 134705e391aeSPaolo Bonzini return 0; 134805e391aeSPaolo Bonzini }''', dependencies: pam) 134905e391aeSPaolo Bonzini pam = not_found 135005e391aeSPaolo Bonzini if get_option('auth_pam').enabled() 135105e391aeSPaolo Bonzini error('could not link libpam') 135205e391aeSPaolo Bonzini else 135305e391aeSPaolo Bonzini warning('could not link libpam, disabling') 135405e391aeSPaolo Bonzini endif 135505e391aeSPaolo Bonziniendif 135605e391aeSPaolo Bonzini 1357708eab42SMarc-André Lureausnappy = not_found 1358241611eaSPaolo Bonziniif not get_option('snappy').auto() or have_system 1359241611eaSPaolo Bonzini snappy = cc.find_library('snappy', has_headers: ['snappy-c.h'], 1360063d5119SPaolo Bonzini required: get_option('snappy')) 1361708eab42SMarc-André Lureauendif 1362565174d0SPaolo Bonziniif snappy.found() and not linker.links(''' 1363241611eaSPaolo Bonzini #include <snappy-c.h> 1364241611eaSPaolo Bonzini int main(void) { snappy_max_compressed_length(4096); return 0; }''', dependencies: snappy) 1365241611eaSPaolo Bonzini snappy = not_found 1366241611eaSPaolo Bonzini if get_option('snappy').enabled() 1367241611eaSPaolo Bonzini error('could not link libsnappy') 1368241611eaSPaolo Bonzini else 1369241611eaSPaolo Bonzini warning('could not link libsnappy, disabling') 1370241611eaSPaolo Bonzini endif 1371708eab42SMarc-André Lureauendif 13720c32a0aeSPaolo Bonzini 1373708eab42SMarc-André Lureaulzo = not_found 13740c32a0aeSPaolo Bonziniif not get_option('lzo').auto() or have_system 13750c32a0aeSPaolo Bonzini lzo = cc.find_library('lzo2', has_headers: ['lzo/lzo1x.h'], 1376063d5119SPaolo Bonzini required: get_option('lzo')) 1377708eab42SMarc-André Lureauendif 13780c32a0aeSPaolo Bonziniif lzo.found() and not cc.links(''' 13790c32a0aeSPaolo Bonzini #include <lzo/lzo1x.h> 13800c32a0aeSPaolo Bonzini int main(void) { lzo_version(); return 0; }''', dependencies: lzo) 13810c32a0aeSPaolo Bonzini lzo = not_found 13820c32a0aeSPaolo Bonzini if get_option('lzo').enabled() 13830c32a0aeSPaolo Bonzini error('could not link liblzo2') 13840c32a0aeSPaolo Bonzini else 13850c32a0aeSPaolo Bonzini warning('could not link liblzo2, disabling') 13860c32a0aeSPaolo Bonzini endif 13870c32a0aeSPaolo Bonziniendif 13880c32a0aeSPaolo Bonzini 1389488a8c73SPaolo Bonzininuma = not_found 1390488a8c73SPaolo Bonziniif not get_option('numa').auto() or have_system or have_tools 1391488a8c73SPaolo Bonzini numa = cc.find_library('numa', has_headers: ['numa.h'], 1392063d5119SPaolo Bonzini required: get_option('numa')) 1393488a8c73SPaolo Bonziniendif 1394488a8c73SPaolo Bonziniif numa.found() and not cc.links(''' 1395488a8c73SPaolo Bonzini #include <numa.h> 1396488a8c73SPaolo Bonzini int main(void) { return numa_available(); } 1397488a8c73SPaolo Bonzini ''', dependencies: numa) 1398488a8c73SPaolo Bonzini numa = not_found 1399488a8c73SPaolo Bonzini if get_option('numa').enabled() 1400488a8c73SPaolo Bonzini error('could not link numa') 1401488a8c73SPaolo Bonzini else 1402488a8c73SPaolo Bonzini warning('could not link numa, disabling') 1403488a8c73SPaolo Bonzini endif 1404488a8c73SPaolo Bonziniendif 1405488a8c73SPaolo Bonzini 140655166230SMarc-André Lureaurdma = not_found 14073730a734SPaolo Bonziniif not get_option('rdma').auto() or have_system 14083730a734SPaolo Bonzini libumad = cc.find_library('ibumad', required: get_option('rdma')) 14093730a734SPaolo Bonzini rdma_libs = [cc.find_library('rdmacm', has_headers: ['rdma/rdma_cma.h'], 1410063d5119SPaolo Bonzini required: get_option('rdma')), 1411063d5119SPaolo Bonzini cc.find_library('ibverbs', required: get_option('rdma')), 14123730a734SPaolo Bonzini libumad] 14133730a734SPaolo Bonzini rdma = declare_dependency(dependencies: rdma_libs) 14143730a734SPaolo Bonzini foreach lib: rdma_libs 14153730a734SPaolo Bonzini if not lib.found() 14163730a734SPaolo Bonzini rdma = not_found 141755166230SMarc-André Lureau endif 14183730a734SPaolo Bonzini endforeach 14193730a734SPaolo Bonziniendif 14203730a734SPaolo Bonzini 1421582ea95fSMarc-André Lureauxen = not_found 142214efd8d3SPaolo Bonziniif get_option('xen').enabled() or (get_option('xen').auto() and have_system) 142314efd8d3SPaolo Bonzini xencontrol = dependency('xencontrol', required: false, 1424063d5119SPaolo Bonzini method: 'pkg-config') 142514efd8d3SPaolo Bonzini if xencontrol.found() 142614efd8d3SPaolo Bonzini xen_pc = declare_dependency(version: xencontrol.version(), 142714efd8d3SPaolo Bonzini dependencies: [ 142814efd8d3SPaolo Bonzini xencontrol, 142914efd8d3SPaolo Bonzini # disabler: true makes xen_pc.found() return false if any is not found 143014efd8d3SPaolo Bonzini dependency('xenstore', required: false, 1431063d5119SPaolo Bonzini method: 'pkg-config', 143214efd8d3SPaolo Bonzini disabler: true), 143314efd8d3SPaolo Bonzini dependency('xenforeignmemory', required: false, 1434063d5119SPaolo Bonzini method: 'pkg-config', 143514efd8d3SPaolo Bonzini disabler: true), 143614efd8d3SPaolo Bonzini dependency('xengnttab', required: false, 1437063d5119SPaolo Bonzini method: 'pkg-config', 143814efd8d3SPaolo Bonzini disabler: true), 143914efd8d3SPaolo Bonzini dependency('xenevtchn', required: false, 1440063d5119SPaolo Bonzini method: 'pkg-config', 144114efd8d3SPaolo Bonzini disabler: true), 144214efd8d3SPaolo Bonzini dependency('xendevicemodel', required: false, 1443063d5119SPaolo Bonzini method: 'pkg-config', 144414efd8d3SPaolo Bonzini disabler: true), 144514efd8d3SPaolo Bonzini # optional, no "disabler: true" 144614efd8d3SPaolo Bonzini dependency('xentoolcore', required: false, 1447063d5119SPaolo Bonzini method: 'pkg-config')]) 144814efd8d3SPaolo Bonzini if xen_pc.found() 144914efd8d3SPaolo Bonzini xen = xen_pc 1450582ea95fSMarc-André Lureau endif 145114efd8d3SPaolo Bonzini endif 145214efd8d3SPaolo Bonzini if not xen.found() 145314efd8d3SPaolo 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' ] 145414efd8d3SPaolo Bonzini xen_libs = { 145514efd8d3SPaolo Bonzini '4.11.0': [ 'xenstore', 'xenctrl', 'xendevicemodel', 'xenforeignmemory', 'xengnttab', 'xenevtchn', 'xentoolcore' ], 145614efd8d3SPaolo Bonzini '4.10.0': [ 'xenstore', 'xenctrl', 'xendevicemodel', 'xenforeignmemory', 'xengnttab', 'xenevtchn', 'xentoolcore' ], 145714efd8d3SPaolo Bonzini '4.9.0': [ 'xenstore', 'xenctrl', 'xendevicemodel', 'xenforeignmemory', 'xengnttab', 'xenevtchn' ], 145814efd8d3SPaolo Bonzini '4.8.0': [ 'xenstore', 'xenctrl', 'xenforeignmemory', 'xengnttab', 'xenevtchn' ], 145914efd8d3SPaolo Bonzini '4.7.1': [ 'xenstore', 'xenctrl', 'xenforeignmemory', 'xengnttab', 'xenevtchn' ], 146014efd8d3SPaolo Bonzini '4.6.0': [ 'xenstore', 'xenctrl' ], 146114efd8d3SPaolo Bonzini '4.5.0': [ 'xenstore', 'xenctrl' ], 146214efd8d3SPaolo Bonzini '4.2.0': [ 'xenstore', 'xenctrl' ], 146314efd8d3SPaolo Bonzini } 146414efd8d3SPaolo Bonzini xen_deps = {} 146514efd8d3SPaolo Bonzini foreach ver: xen_tests 146614efd8d3SPaolo Bonzini # cache the various library tests to avoid polluting the logs 146714efd8d3SPaolo Bonzini xen_test_deps = [] 146814efd8d3SPaolo Bonzini foreach l: xen_libs[ver] 146914efd8d3SPaolo Bonzini if l not in xen_deps 147014efd8d3SPaolo Bonzini xen_deps += { l: cc.find_library(l, required: false) } 147114efd8d3SPaolo Bonzini endif 147214efd8d3SPaolo Bonzini xen_test_deps += xen_deps[l] 147314efd8d3SPaolo Bonzini endforeach 147414efd8d3SPaolo Bonzini 147514efd8d3SPaolo Bonzini # Use -D to pick just one of the test programs in scripts/xen-detect.c 147614efd8d3SPaolo Bonzini xen_version = ver.split('.') 147714efd8d3SPaolo Bonzini xen_ctrl_version = xen_version[0] + \ 147814efd8d3SPaolo Bonzini ('0' + xen_version[1]).substring(-2) + \ 147914efd8d3SPaolo Bonzini ('0' + xen_version[2]).substring(-2) 148014efd8d3SPaolo Bonzini if cc.links(files('scripts/xen-detect.c'), 148114efd8d3SPaolo Bonzini args: '-DCONFIG_XEN_CTRL_INTERFACE_VERSION=' + xen_ctrl_version, 148214efd8d3SPaolo Bonzini dependencies: xen_test_deps) 148314efd8d3SPaolo Bonzini xen = declare_dependency(version: ver, dependencies: xen_test_deps) 148414efd8d3SPaolo Bonzini break 148514efd8d3SPaolo Bonzini endif 148614efd8d3SPaolo Bonzini endforeach 148714efd8d3SPaolo Bonzini endif 148814efd8d3SPaolo Bonzini if xen.found() 148914efd8d3SPaolo Bonzini accelerators += 'CONFIG_XEN' 149014efd8d3SPaolo Bonzini elif get_option('xen').enabled() 149114efd8d3SPaolo Bonzini error('could not compile and link Xen test program') 149214efd8d3SPaolo Bonzini endif 149314efd8d3SPaolo Bonziniendif 149414efd8d3SPaolo Bonzinihave_xen_pci_passthrough = get_option('xen_pci_passthrough') \ 149514efd8d3SPaolo Bonzini .require(xen.found(), 149614efd8d3SPaolo Bonzini error_message: 'Xen PCI passthrough requested but Xen not enabled') \ 149714efd8d3SPaolo Bonzini .require(targetos == 'linux', 149814efd8d3SPaolo Bonzini error_message: 'Xen PCI passthrough not available on this platform') \ 149914efd8d3SPaolo Bonzini .allowed() 150014efd8d3SPaolo Bonzini 150114efd8d3SPaolo Bonzini 150206677ce1SPaolo Bonzinicacard = not_found 15035f364c57SPaolo Bonziniif not get_option('smartcard').auto() or have_system 15045f364c57SPaolo Bonzini cacard = dependency('libcacard', required: get_option('smartcard'), 1505063d5119SPaolo Bonzini version: '>=2.5.1', method: 'pkg-config') 150606677ce1SPaolo Bonziniendif 15070a40bcb7SCésar Belleyu2f = not_found 15080a40bcb7SCésar Belleyif have_system 15090a40bcb7SCésar Belley u2f = dependency('u2f-emu', required: get_option('u2f'), 1510063d5119SPaolo Bonzini method: 'pkg-config') 15110a40bcb7SCésar Belleyendif 15128caef850SHongren (Zenithal) Zhengcanokey = not_found 15138caef850SHongren (Zenithal) Zhengif have_system 15148caef850SHongren (Zenithal) Zheng canokey = dependency('canokey-qemu', required: get_option('canokey'), 1515063d5119SPaolo Bonzini method: 'pkg-config') 15168caef850SHongren (Zenithal) Zhengendif 151706677ce1SPaolo Bonziniusbredir = not_found 151818f31e60SPaolo Bonziniif not get_option('usb_redir').auto() or have_system 151918f31e60SPaolo Bonzini usbredir = dependency('libusbredirparser-0.5', required: get_option('usb_redir'), 1520063d5119SPaolo Bonzini version: '>=0.6', method: 'pkg-config') 152106677ce1SPaolo Bonziniendif 152206677ce1SPaolo Bonzinilibusb = not_found 152390540f32SPaolo Bonziniif not get_option('libusb').auto() or have_system 152490540f32SPaolo Bonzini libusb = dependency('libusb-1.0', required: get_option('libusb'), 1525063d5119SPaolo Bonzini version: '>=1.0.13', method: 'pkg-config') 152606677ce1SPaolo Bonziniendif 152790540f32SPaolo Bonzini 1528c9322ab5SMarc-André Lureaulibpmem = not_found 1529e36e8c70SPaolo Bonziniif not get_option('libpmem').auto() or have_system 1530e36e8c70SPaolo Bonzini libpmem = dependency('libpmem', required: get_option('libpmem'), 1531063d5119SPaolo Bonzini method: 'pkg-config') 1532c9322ab5SMarc-André Lureauendif 1533c7c91a74SBruce Rogerslibdaxctl = not_found 153483ef1682SPaolo Bonziniif not get_option('libdaxctl').auto() or have_system 153583ef1682SPaolo Bonzini libdaxctl = dependency('libdaxctl', required: get_option('libdaxctl'), 1536063d5119SPaolo Bonzini version: '>=57', method: 'pkg-config') 1537c7c91a74SBruce Rogersendif 15388ce0a45fSMarc-André Lureautasn1 = not_found 1539ba7ed407SPaolo Bonziniif gnutls.found() 1540ba7ed407SPaolo Bonzini tasn1 = dependency('libtasn1', 1541063d5119SPaolo Bonzini method: 'pkg-config') 15428ce0a45fSMarc-André Lureauendif 1543af04e89dSMarc-André Lureaukeyutils = dependency('libkeyutils', required: false, 1544063d5119SPaolo Bonzini method: 'pkg-config') 1545a81df1b6SPaolo Bonzini 15463909def8SMarc-André Lureauhas_gettid = cc.has_function('gettid') 15473909def8SMarc-André Lureau 15483d212b41SRichard W.M. Jones# libselinux 15493d212b41SRichard W.M. Jonesselinux = dependency('libselinux', 15503d212b41SRichard W.M. Jones required: get_option('selinux'), 1551063d5119SPaolo Bonzini method: 'pkg-config') 15523d212b41SRichard W.M. Jones 1553aa087962SPaolo Bonzini# Malloc tests 1554aa087962SPaolo Bonzini 1555aa087962SPaolo Bonzinimalloc = [] 1556aa087962SPaolo Bonziniif get_option('malloc') == 'system' 1557aa087962SPaolo Bonzini has_malloc_trim = \ 155843a363aeSPaolo Bonzini get_option('malloc_trim').allowed() and \ 1559aa087962SPaolo Bonzini cc.links('''#include <malloc.h> 1560aa087962SPaolo Bonzini int main(void) { malloc_trim(0); return 0; }''') 1561aa087962SPaolo Bonzinielse 1562aa087962SPaolo Bonzini has_malloc_trim = false 1563aa087962SPaolo Bonzini malloc = cc.find_library(get_option('malloc'), required: true) 1564aa087962SPaolo Bonziniendif 1565aa087962SPaolo Bonziniif not has_malloc_trim and get_option('malloc_trim').enabled() 1566aa087962SPaolo Bonzini if get_option('malloc') == 'system' 1567aa087962SPaolo Bonzini error('malloc_trim not available on this platform.') 1568aa087962SPaolo Bonzini else 1569aa087962SPaolo Bonzini error('malloc_trim not available with non-libc memory allocator') 1570aa087962SPaolo Bonzini endif 1571aa087962SPaolo Bonziniendif 1572aa087962SPaolo Bonzini 157384e319a5SMax Reitz# Check whether the glibc provides statx() 157484e319a5SMax Reitz 1575e66420acSPaolo Bonzinignu_source_prefix = ''' 157684e319a5SMax Reitz #ifndef _GNU_SOURCE 157784e319a5SMax Reitz #define _GNU_SOURCE 157884e319a5SMax Reitz #endif 1579e66420acSPaolo Bonzini''' 1580e66420acSPaolo Bonzinistatx_test = gnu_source_prefix + ''' 158184e319a5SMax Reitz #include <sys/stat.h> 158284e319a5SMax Reitz int main(void) { 158384e319a5SMax Reitz struct statx statxbuf; 158484e319a5SMax Reitz statx(0, "", 0, STATX_BASIC_STATS, &statxbuf); 158584e319a5SMax Reitz return 0; 158684e319a5SMax Reitz }''' 158784e319a5SMax Reitz 158884e319a5SMax Reitzhas_statx = cc.links(statx_test) 158984e319a5SMax Reitz 15904ce7a08dSHanna Reitz# Check whether statx() provides mount ID information 15914ce7a08dSHanna Reitz 15924ce7a08dSHanna Reitzstatx_mnt_id_test = gnu_source_prefix + ''' 15934ce7a08dSHanna Reitz #include <sys/stat.h> 15944ce7a08dSHanna Reitz int main(void) { 15954ce7a08dSHanna Reitz struct statx statxbuf; 15964ce7a08dSHanna Reitz statx(0, "", 0, STATX_BASIC_STATS | STATX_MNT_ID, &statxbuf); 15974ce7a08dSHanna Reitz return statxbuf.stx_mnt_id; 15984ce7a08dSHanna Reitz }''' 15994ce7a08dSHanna Reitz 16004ce7a08dSHanna Reitzhas_statx_mnt_id = cc.links(statx_mnt_id_test) 16014ce7a08dSHanna Reitz 1602a436d6d4SPaolo Bonzinihave_vhost_user_blk_server = get_option('vhost_user_blk_server') \ 1603a436d6d4SPaolo Bonzini .require(targetos == 'linux', 1604a436d6d4SPaolo Bonzini error_message: 'vhost_user_blk_server requires linux') \ 16052a3129a3SPaolo Bonzini .require(have_vhost_user, 1606a436d6d4SPaolo Bonzini error_message: 'vhost_user_blk_server requires vhost-user support') \ 160726ed501bSAlex Bennée .disable_auto_if(not have_tools and not have_system) \ 1608a436d6d4SPaolo Bonzini .allowed() 16099e62ba48SDaniele Buono 1610df4ea709SMax Reitzif get_option('fuse').disabled() and get_option('fuse_lseek').enabled() 1611df4ea709SMax Reitz error('Cannot enable fuse-lseek while fuse is disabled') 1612df4ea709SMax Reitzendif 1613df4ea709SMax Reitz 1614a484a719SMax Reitzfuse = dependency('fuse3', required: get_option('fuse'), 1615063d5119SPaolo Bonzini version: '>=3.1', method: 'pkg-config') 1616a484a719SMax Reitz 1617df4ea709SMax Reitzfuse_lseek = not_found 161843a363aeSPaolo Bonziniif get_option('fuse_lseek').allowed() 1619df4ea709SMax Reitz if fuse.version().version_compare('>=3.8') 1620df4ea709SMax Reitz # Dummy dependency 1621df4ea709SMax Reitz fuse_lseek = declare_dependency() 1622df4ea709SMax Reitz elif get_option('fuse_lseek').enabled() 1623df4ea709SMax Reitz if fuse.found() 1624df4ea709SMax Reitz error('fuse-lseek requires libfuse >=3.8, found ' + fuse.version()) 1625df4ea709SMax Reitz else 1626df4ea709SMax Reitz error('fuse-lseek requires libfuse, which was not found') 1627df4ea709SMax Reitz endif 1628df4ea709SMax Reitz endif 1629df4ea709SMax Reitzendif 1630df4ea709SMax Reitz 1631a6caeee8SXie Yongjihave_libvduse = (targetos == 'linux') 1632a6caeee8SXie Yongjiif get_option('libvduse').enabled() 1633a6caeee8SXie Yongji if targetos != 'linux' 1634a6caeee8SXie Yongji error('libvduse requires linux') 1635a6caeee8SXie Yongji endif 1636a6caeee8SXie Yongjielif get_option('libvduse').disabled() 1637a6caeee8SXie Yongji have_libvduse = false 1638a6caeee8SXie Yongjiendif 1639a6caeee8SXie Yongji 16402a2359b8SXie Yongjihave_vduse_blk_export = (have_libvduse and targetos == 'linux') 16412a2359b8SXie Yongjiif get_option('vduse_blk_export').enabled() 16422a2359b8SXie Yongji if targetos != 'linux' 16432a2359b8SXie Yongji error('vduse_blk_export requires linux') 16442a2359b8SXie Yongji elif not have_libvduse 16452a2359b8SXie Yongji error('vduse_blk_export requires libvduse support') 16462a2359b8SXie Yongji endif 16472a2359b8SXie Yongjielif get_option('vduse_blk_export').disabled() 16482a2359b8SXie Yongji have_vduse_blk_export = false 16492a2359b8SXie Yongjiendif 16502a2359b8SXie Yongji 165146627f41SAndrew Melnychenko# libbpf 165246627f41SAndrew Melnychenkolibbpf = dependency('libbpf', required: get_option('bpf'), method: 'pkg-config') 165346627f41SAndrew Melnychenkoif libbpf.found() and not cc.links(''' 165446627f41SAndrew Melnychenko #include <bpf/libbpf.h> 165546627f41SAndrew Melnychenko int main(void) 165646627f41SAndrew Melnychenko { 165746627f41SAndrew Melnychenko bpf_object__destroy_skeleton(NULL); 165846627f41SAndrew Melnychenko return 0; 165946627f41SAndrew Melnychenko }''', dependencies: libbpf) 166046627f41SAndrew Melnychenko libbpf = not_found 166146627f41SAndrew Melnychenko if get_option('bpf').enabled() 166246627f41SAndrew Melnychenko error('libbpf skeleton test failed') 166346627f41SAndrew Melnychenko else 166446627f41SAndrew Melnychenko warning('libbpf skeleton test failed, disabling') 166546627f41SAndrew Melnychenko endif 166646627f41SAndrew Melnychenkoendif 166746627f41SAndrew Melnychenko 16687c10cb38SIlya Leoshkevich# libdw 1669bc71d58fSIlya Leoshkevichlibdw = not_found 1670550c6d97SIlya Leoshkevichif not get_option('libdw').auto() or \ 1671a0cbd2e8SPaolo Bonzini (not get_option('prefer_static') and (have_system or have_user)) 16727c10cb38SIlya Leoshkevich libdw = dependency('libdw', 16737c10cb38SIlya Leoshkevich method: 'pkg-config', 1674bc71d58fSIlya Leoshkevich required: get_option('libdw')) 1675bc71d58fSIlya Leoshkevichendif 16767c10cb38SIlya Leoshkevich 167787430d5bSPaolo Bonzini################# 167887430d5bSPaolo Bonzini# config-host.h # 167987430d5bSPaolo Bonzini################# 168087430d5bSPaolo Bonzini 168187430d5bSPaolo Bonziniaudio_drivers_selected = [] 168287430d5bSPaolo Bonziniif have_system 168387430d5bSPaolo Bonzini audio_drivers_available = { 168487430d5bSPaolo Bonzini 'alsa': alsa.found(), 168587430d5bSPaolo Bonzini 'coreaudio': coreaudio.found(), 168687430d5bSPaolo Bonzini 'dsound': dsound.found(), 168787430d5bSPaolo Bonzini 'jack': jack.found(), 168887430d5bSPaolo Bonzini 'oss': oss.found(), 168987430d5bSPaolo Bonzini 'pa': pulse.found(), 1690c2d3d1c2SDorinda Bassey 'pipewire': pipewire.found(), 169187430d5bSPaolo Bonzini 'sdl': sdl.found(), 1692663df1ccSAlexandre Ratchov 'sndio': sndio.found(), 169387430d5bSPaolo Bonzini } 1694e5424a29SPaolo Bonzini foreach k, v: audio_drivers_available 1695e5424a29SPaolo Bonzini config_host_data.set('CONFIG_AUDIO_' + k.to_upper(), v) 1696e5424a29SPaolo Bonzini endforeach 169787430d5bSPaolo Bonzini 169887430d5bSPaolo Bonzini # Default to native drivers first, OSS second, SDL third 169987430d5bSPaolo Bonzini audio_drivers_priority = \ 1700663df1ccSAlexandre Ratchov [ 'pa', 'coreaudio', 'dsound', 'sndio', 'oss' ] + \ 170187430d5bSPaolo Bonzini (targetos == 'linux' ? [] : [ 'sdl' ]) 170287430d5bSPaolo Bonzini audio_drivers_default = [] 170387430d5bSPaolo Bonzini foreach k: audio_drivers_priority 170487430d5bSPaolo Bonzini if audio_drivers_available[k] 170587430d5bSPaolo Bonzini audio_drivers_default += k 170687430d5bSPaolo Bonzini endif 170787430d5bSPaolo Bonzini endforeach 170887430d5bSPaolo Bonzini 170987430d5bSPaolo Bonzini foreach k: get_option('audio_drv_list') 171087430d5bSPaolo Bonzini if k == 'default' 171187430d5bSPaolo Bonzini audio_drivers_selected += audio_drivers_default 171287430d5bSPaolo Bonzini elif not audio_drivers_available[k] 171387430d5bSPaolo Bonzini error('Audio driver "@0@" not available.'.format(k)) 171487430d5bSPaolo Bonzini else 171587430d5bSPaolo Bonzini audio_drivers_selected += k 171687430d5bSPaolo Bonzini endif 171787430d5bSPaolo Bonzini endforeach 171887430d5bSPaolo Bonziniendif 171987430d5bSPaolo Bonziniconfig_host_data.set('CONFIG_AUDIO_DRIVERS', 172087430d5bSPaolo Bonzini '"' + '", "'.join(audio_drivers_selected) + '", ') 172187430d5bSPaolo Bonzini 17229e62ba48SDaniele Buonoif get_option('cfi') 17239e62ba48SDaniele Buono cfi_flags=[] 17249e62ba48SDaniele Buono # Check for dependency on LTO 17259e62ba48SDaniele Buono if not get_option('b_lto') 17269e62ba48SDaniele Buono error('Selected Control-Flow Integrity but LTO is disabled') 17279e62ba48SDaniele Buono endif 17289e62ba48SDaniele Buono if config_host.has_key('CONFIG_MODULES') 17299e62ba48SDaniele Buono error('Selected Control-Flow Integrity is not compatible with modules') 17309e62ba48SDaniele Buono endif 17319e62ba48SDaniele Buono # Check for cfi flags. CFI requires LTO so we can't use 17329e62ba48SDaniele Buono # get_supported_arguments, but need a more complex "compiles" which allows 17339e62ba48SDaniele Buono # custom arguments 17349e62ba48SDaniele Buono if cc.compiles('int main () { return 0; }', name: '-fsanitize=cfi-icall', 17359e62ba48SDaniele Buono args: ['-flto', '-fsanitize=cfi-icall'] ) 17369e62ba48SDaniele Buono cfi_flags += '-fsanitize=cfi-icall' 17379e62ba48SDaniele Buono else 17389e62ba48SDaniele Buono error('-fsanitize=cfi-icall is not supported by the compiler') 17399e62ba48SDaniele Buono endif 17409e62ba48SDaniele Buono if cc.compiles('int main () { return 0; }', 17419e62ba48SDaniele Buono name: '-fsanitize-cfi-icall-generalize-pointers', 17429e62ba48SDaniele Buono args: ['-flto', '-fsanitize=cfi-icall', 17439e62ba48SDaniele Buono '-fsanitize-cfi-icall-generalize-pointers'] ) 17449e62ba48SDaniele Buono cfi_flags += '-fsanitize-cfi-icall-generalize-pointers' 17459e62ba48SDaniele Buono else 17469e62ba48SDaniele Buono error('-fsanitize-cfi-icall-generalize-pointers is not supported by the compiler') 17479e62ba48SDaniele Buono endif 17489e62ba48SDaniele Buono if get_option('cfi_debug') 17499e62ba48SDaniele Buono if cc.compiles('int main () { return 0; }', 17509e62ba48SDaniele Buono name: '-fno-sanitize-trap=cfi-icall', 17519e62ba48SDaniele Buono args: ['-flto', '-fsanitize=cfi-icall', 17529e62ba48SDaniele Buono '-fno-sanitize-trap=cfi-icall'] ) 17539e62ba48SDaniele Buono cfi_flags += '-fno-sanitize-trap=cfi-icall' 17549e62ba48SDaniele Buono else 17559e62ba48SDaniele Buono error('-fno-sanitize-trap=cfi-icall is not supported by the compiler') 17569e62ba48SDaniele Buono endif 17579e62ba48SDaniele Buono endif 1758e5134024SPaolo Bonzini add_global_arguments(cfi_flags, native: false, language: all_languages) 1759e5134024SPaolo Bonzini add_global_link_arguments(cfi_flags, native: false, language: all_languages) 17609e62ba48SDaniele Buonoendif 17619e62ba48SDaniele Buono 176214176c8dSJoelle van Dynehave_host_block_device = (targetos != 'darwin' or 176314176c8dSJoelle van Dyne cc.has_header('IOKit/storage/IOMedia.h')) 176414176c8dSJoelle van Dyne 1765a436d6d4SPaolo Bonzinidbus_display = get_option('dbus_display') \ 1766a436d6d4SPaolo Bonzini .require(gio.version().version_compare('>=2.64'), 1767a436d6d4SPaolo Bonzini error_message: '-display dbus requires glib>=2.64') \ 17687544060eSPaolo Bonzini .require(gdbus_codegen.found(), 1769bb2dc4b7SPaolo Bonzini error_message: gdbus_codegen_error.format('-display dbus')) \ 177084a0a2efSMarc-André Lureau .require(targetos != 'windows', 177184a0a2efSMarc-André Lureau error_message: '-display dbus is not available on Windows') \ 1772a436d6d4SPaolo Bonzini .allowed() 1773142ca628SMarc-André Lureau 1774a436d6d4SPaolo Bonzinihave_virtfs = get_option('virtfs') \ 17750fb1e19dSKeno Fischer .require(targetos == 'linux' or targetos == 'darwin', 17760fb1e19dSKeno Fischer error_message: 'virtio-9p (virtfs) requires Linux or macOS') \ 17770fb1e19dSKeno Fischer .require(targetos == 'linux' or cc.has_function('pthread_fchdir_np'), 17780fb1e19dSKeno Fischer error_message: 'virtio-9p (virtfs) on macOS requires the presence of pthread_fchdir_np') \ 17791a67e07fSPeter Foley .require(targetos == 'darwin' or libattr.found(), 17801a67e07fSPeter Foley error_message: 'virtio-9p (virtfs) on Linux requires libattr-devel') \ 1781a436d6d4SPaolo Bonzini .disable_auto_if(not have_tools and not have_system) \ 1782a436d6d4SPaolo Bonzini .allowed() 178369202b40SPaolo Bonzini 17841a67e07fSPeter Foleyhave_virtfs_proxy_helper = get_option('virtfs_proxy_helper') \ 17851a67e07fSPeter Foley .require(targetos != 'darwin', error_message: 'the virtfs proxy helper is incompatible with macOS') \ 17861a67e07fSPeter Foley .require(have_virtfs, error_message: 'the virtfs proxy helper requires that virtfs is enabled') \ 17871a67e07fSPeter Foley .disable_auto_if(not have_tools) \ 17881a67e07fSPeter Foley .require(libcap_ng.found(), error_message: 'the virtfs proxy helper requires libcap-ng') \ 17891a67e07fSPeter Foley .allowed() 17903a489d38SPhilippe Mathieu-Daudé 1791622d64ffSPaolo Bonziniif get_option('block_drv_ro_whitelist') == '' 1792622d64ffSPaolo Bonzini config_host_data.set('CONFIG_BDRV_RO_WHITELIST', '') 1793622d64ffSPaolo Bonzinielse 1794622d64ffSPaolo Bonzini config_host_data.set('CONFIG_BDRV_RO_WHITELIST', 1795622d64ffSPaolo Bonzini '"' + get_option('block_drv_ro_whitelist').replace(',', '", "') + '", ') 1796622d64ffSPaolo Bonziniendif 1797622d64ffSPaolo Bonziniif get_option('block_drv_rw_whitelist') == '' 1798622d64ffSPaolo Bonzini config_host_data.set('CONFIG_BDRV_RW_WHITELIST', '') 1799622d64ffSPaolo Bonzinielse 1800622d64ffSPaolo Bonzini config_host_data.set('CONFIG_BDRV_RW_WHITELIST', 1801622d64ffSPaolo Bonzini '"' + get_option('block_drv_rw_whitelist').replace(',', '", "') + '", ') 1802622d64ffSPaolo Bonziniendif 1803622d64ffSPaolo Bonzini 18049c29b741SPaolo Bonziniforeach k : get_option('trace_backends') 18059c29b741SPaolo Bonzini config_host_data.set('CONFIG_TRACE_' + k.to_upper(), true) 18069c29b741SPaolo Bonziniendforeach 18079c29b741SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_TRACE_FILE', get_option('trace_file')) 180841f2ae28SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_TLS_PRIORITY', get_option('tls_priority')) 180940c909f5SPaolo Bonziniif iasl.found() 181040c909f5SPaolo Bonzini config_host_data.set_quoted('CONFIG_IASL', iasl.full_path()) 18115dc4618eSPaolo Bonziniendif 181216bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_BINDIR', get_option('prefix') / get_option('bindir')) 181316bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_PREFIX', get_option('prefix')) 181416bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_QEMU_CONFDIR', get_option('prefix') / qemu_confdir) 181516bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_QEMU_DATADIR', get_option('prefix') / qemu_datadir) 181616bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_QEMU_DESKTOPDIR', get_option('prefix') / qemu_desktopdir) 18178154f5e6SAkihiko Odaki 18188154f5e6SAkihiko Odakiqemu_firmwarepath = '' 18198154f5e6SAkihiko Odakiforeach k : get_option('qemu_firmwarepath') 18208154f5e6SAkihiko Odaki qemu_firmwarepath += '"' + get_option('prefix') / k + '", ' 18218154f5e6SAkihiko Odakiendforeach 18228154f5e6SAkihiko Odakiconfig_host_data.set('CONFIG_QEMU_FIRMWAREPATH', qemu_firmwarepath) 18238154f5e6SAkihiko Odaki 182416bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_QEMU_HELPERDIR', get_option('prefix') / get_option('libexecdir')) 182516bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_QEMU_ICONDIR', get_option('prefix') / qemu_icondir) 182616bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_QEMU_LOCALEDIR', get_option('prefix') / get_option('localedir')) 182716bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_QEMU_LOCALSTATEDIR', get_option('prefix') / get_option('localstatedir')) 182816bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_QEMU_MODDIR', get_option('prefix') / qemu_moddir) 182916bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_SYSCONFDIR', get_option('prefix') / get_option('sysconfdir')) 183016bf7a33SPaolo Bonzini 1831b0b4323eSPaolo Bonziniif config_host.has_key('CONFIG_MODULES') 1832b0b4323eSPaolo Bonzini config_host_data.set('CONFIG_STAMP', run_command( 1833b0b4323eSPaolo Bonzini meson.current_source_dir() / 'scripts/qemu-stamp.py', 1834b0b4323eSPaolo Bonzini meson.project_version(), get_option('pkgversion'), '--', 1835b0b4323eSPaolo Bonzini meson.current_source_dir() / 'configure', 1836b0b4323eSPaolo Bonzini capture: true, check: true).stdout().strip()) 1837b0b4323eSPaolo Bonziniendif 1838b0b4323eSPaolo Bonzini 183935acbb30SPaolo Bonzinihave_slirp_smbd = get_option('slirp_smbd') \ 184035acbb30SPaolo Bonzini .require(targetos != 'windows', error_message: 'Host smbd not supported on this platform.') \ 184135acbb30SPaolo Bonzini .allowed() 184235acbb30SPaolo Bonziniif have_slirp_smbd 184335acbb30SPaolo Bonzini smbd_path = get_option('smbd') 184435acbb30SPaolo Bonzini if smbd_path == '' 184535acbb30SPaolo Bonzini smbd_path = (targetos == 'solaris' ? '/usr/sfw/sbin/smbd' : '/usr/sbin/smbd') 184635acbb30SPaolo Bonzini endif 184735acbb30SPaolo Bonzini config_host_data.set_quoted('CONFIG_SMBD_COMMAND', smbd_path) 184835acbb30SPaolo Bonziniendif 184935acbb30SPaolo Bonzini 1850823eb013SPaolo Bonziniconfig_host_data.set('HOST_' + host_arch.to_upper(), 1) 1851823eb013SPaolo Bonzini 18522cb2f580SPaolo Bonziniif get_option('module_upgrades') and not enable_modules 18532cb2f580SPaolo Bonzini error('Cannot enable module-upgrades as modules are not enabled') 18542cb2f580SPaolo Bonziniendif 18552cb2f580SPaolo Bonziniconfig_host_data.set('CONFIG_MODULE_UPGRADES', get_option('module_upgrades')) 18562cb2f580SPaolo Bonzini 1857f7f2d651SPaolo Bonziniconfig_host_data.set('CONFIG_ATTR', libattr.found()) 1858c55cf6abSPaolo Bonziniconfig_host_data.set('CONFIG_BDRV_WHITELIST_TOOLS', get_option('block_drv_whitelist_in_tools')) 18598c6d4ff4SPaolo Bonziniconfig_host_data.set('CONFIG_BRLAPI', brlapi.found()) 1860b4e312e9SPaolo Bonziniconfig_host_data.set('CONFIG_COCOA', cocoa.found()) 1861537b7248SPaolo Bonziniconfig_host_data.set('CONFIG_FUZZ', get_option('fuzzing')) 1862af2bb99bSPaolo Bonziniconfig_host_data.set('CONFIG_GCOV', get_option('b_coverage')) 1863f01496a3SPaolo Bonziniconfig_host_data.set('CONFIG_LIBUDEV', libudev.found()) 18640c32a0aeSPaolo Bonziniconfig_host_data.set('CONFIG_LZO', lzo.found()) 18656ec0e15dSPaolo Bonziniconfig_host_data.set('CONFIG_MPATH', mpathpersist.found()) 18666ec0e15dSPaolo Bonziniconfig_host_data.set('CONFIG_MPATH_NEW_API', mpathpersist_new_api) 1867fd66dbd4SStefan Hajnocziconfig_host_data.set('CONFIG_BLKIO', blkio.found()) 1868f9cd86feSPaolo Bonziniconfig_host_data.set('CONFIG_CURL', curl.found()) 18695285e593SYonggang Luoconfig_host_data.set('CONFIG_CURSES', curses.found()) 18708bc5184dSThomas Huthconfig_host_data.set('CONFIG_GBM', gbm.found()) 18717544060eSPaolo Bonziniconfig_host_data.set('CONFIG_GIO', gio.found()) 187208821ca2SPaolo Bonziniconfig_host_data.set('CONFIG_GLUSTERFS', glusterfs.found()) 187308821ca2SPaolo Bonziniif glusterfs.found() 187408821ca2SPaolo Bonzini config_host_data.set('CONFIG_GLUSTERFS_XLATOR_OPT', glusterfs.version().version_compare('>=4')) 187508821ca2SPaolo Bonzini config_host_data.set('CONFIG_GLUSTERFS_DISCARD', glusterfs.version().version_compare('>=5')) 187608821ca2SPaolo Bonzini config_host_data.set('CONFIG_GLUSTERFS_FALLOCATE', glusterfs.version().version_compare('>=6')) 187708821ca2SPaolo Bonzini config_host_data.set('CONFIG_GLUSTERFS_ZEROFILL', glusterfs.version().version_compare('>=6')) 187808821ca2SPaolo Bonzini config_host_data.set('CONFIG_GLUSTERFS_FTRUNCATE_HAS_STAT', glusterfs_ftruncate_has_stat) 187908821ca2SPaolo Bonzini config_host_data.set('CONFIG_GLUSTERFS_IOCB_HAS_STAT', glusterfs_iocb_has_stat) 188008821ca2SPaolo Bonziniendif 18811b695471SPaolo Bonziniconfig_host_data.set('CONFIG_GTK', gtk.found()) 1882c23d7b4eSPaolo Bonziniconfig_host_data.set('CONFIG_VTE', vte.found()) 188329e0bfffSClaudio Fontanaconfig_host_data.set('CONFIG_GTK_CLIPBOARD', have_gtk_clipboard) 1884f7f2d651SPaolo Bonziniconfig_host_data.set('CONFIG_LIBATTR', have_old_libattr) 1885727c8bb8SPaolo Bonziniconfig_host_data.set('CONFIG_LIBCAP_NG', libcap_ng.found()) 188646627f41SAndrew Melnychenkoconfig_host_data.set('CONFIG_EBPF', libbpf.found()) 188763a7f853SPaolo Bonziniconfig_host_data.set('CONFIG_LIBDAXCTL', libdaxctl.found()) 18889db405a3SPaolo Bonziniconfig_host_data.set('CONFIG_LIBISCSI', libiscsi.found()) 188930045c05SPaolo Bonziniconfig_host_data.set('CONFIG_LIBNFS', libnfs.found()) 1890e6a52b36SThomas Huthconfig_host_data.set('CONFIG_LIBSSH', libssh.found()) 1891ff66f3e5SPaolo Bonziniconfig_host_data.set('CONFIG_LINUX_AIO', libaio.found()) 189263a7f853SPaolo Bonziniconfig_host_data.set('CONFIG_LINUX_IO_URING', linux_io_uring.found()) 189363a7f853SPaolo Bonziniconfig_host_data.set('CONFIG_LIBPMEM', libpmem.found()) 1894488a8c73SPaolo Bonziniconfig_host_data.set('CONFIG_NUMA', numa.found()) 18956bb613f0SMichal Privoznikif numa.found() 18966bb613f0SMichal Privoznik config_host_data.set('HAVE_NUMA_HAS_PREFERRED_MANY', 18976bb613f0SMichal Privoznik cc.has_function('numa_has_preferred_many', 18986bb613f0SMichal Privoznik dependencies: numa)) 18996bb613f0SMichal Privoznikendif 190088b6e618SPaolo Bonziniconfig_host_data.set('CONFIG_OPENGL', opengl.found()) 1901c55cf6abSPaolo Bonziniconfig_host_data.set('CONFIG_PROFILER', get_option('profiler')) 1902fabd1e93SPaolo Bonziniconfig_host_data.set('CONFIG_RBD', rbd.found()) 19033730a734SPaolo Bonziniconfig_host_data.set('CONFIG_RDMA', rdma.found()) 190435be72baSPaolo Bonziniconfig_host_data.set('CONFIG_SDL', sdl.found()) 190535be72baSPaolo Bonziniconfig_host_data.set('CONFIG_SDL_IMAGE', sdl_image.found()) 190690835c2bSPaolo Bonziniconfig_host_data.set('CONFIG_SECCOMP', seccomp.found()) 190773422d95SMichal Privoznikif seccomp.found() 190873422d95SMichal Privoznik config_host_data.set('CONFIG_SECCOMP_SYSRAWRC', seccomp_has_sysrawrc) 190973422d95SMichal Privoznikendif 1910241611eaSPaolo Bonziniconfig_host_data.set('CONFIG_SNAPPY', snappy.found()) 19110d04c4c9SPaolo Bonziniconfig_host_data.set('CONFIG_TPM', have_tpm) 191290540f32SPaolo Bonziniconfig_host_data.set('CONFIG_USB_LIBUSB', libusb.found()) 1913e1723999SPaolo Bonziniconfig_host_data.set('CONFIG_VDE', vde.found()) 19142df89d54SPaolo Bonziniconfig_host_data.set('CONFIG_VHOST_NET', have_vhost_net) 19152df89d54SPaolo Bonziniconfig_host_data.set('CONFIG_VHOST_NET_USER', have_vhost_net_user) 19162df89d54SPaolo Bonziniconfig_host_data.set('CONFIG_VHOST_NET_VDPA', have_vhost_net_vdpa) 19172df89d54SPaolo Bonziniconfig_host_data.set('CONFIG_VHOST_KERNEL', have_vhost_kernel) 19182df89d54SPaolo Bonziniconfig_host_data.set('CONFIG_VHOST_USER', have_vhost_user) 19192df89d54SPaolo Bonziniconfig_host_data.set('CONFIG_VHOST_CRYPTO', have_vhost_user_crypto) 19202df89d54SPaolo Bonziniconfig_host_data.set('CONFIG_VHOST_VDPA', have_vhost_vdpa) 1921e2c1d78dSVladislav Yaroshchukconfig_host_data.set('CONFIG_VMNET', vmnet.found()) 1922e5e856c1SStefan Hajnocziconfig_host_data.set('CONFIG_VHOST_USER_BLK_SERVER', have_vhost_user_blk_server) 19232a2359b8SXie Yongjiconfig_host_data.set('CONFIG_VDUSE_BLK_EXPORT', have_vduse_blk_export) 192495f8510eSKshitij Suriconfig_host_data.set('CONFIG_PNG', png.found()) 1925a0b93237SPaolo Bonziniconfig_host_data.set('CONFIG_VNC', vnc.found()) 1926a0b93237SPaolo Bonziniconfig_host_data.set('CONFIG_VNC_JPEG', jpeg.found()) 1927a0b93237SPaolo Bonziniconfig_host_data.set('CONFIG_VNC_SASL', sasl.found()) 192869202b40SPaolo Bonziniconfig_host_data.set('CONFIG_VIRTFS', have_virtfs) 192963a7f853SPaolo Bonziniconfig_host_data.set('CONFIG_VTE', vte.found()) 19304113f4cfSLaurent Vivierconfig_host_data.set('CONFIG_XKBCOMMON', xkbcommon.found()) 1931af04e89dSMarc-André Lureauconfig_host_data.set('CONFIG_KEYUTILS', keyutils.found()) 19323909def8SMarc-André Lureauconfig_host_data.set('CONFIG_GETTID', has_gettid) 193357612511SPaolo Bonziniconfig_host_data.set('CONFIG_GNUTLS', gnutls.found()) 1934cc4c7c73SDaniel P. Berrangéconfig_host_data.set('CONFIG_GNUTLS_CRYPTO', gnutls_crypto.found()) 1935d47b83b1SDaniel P. Berrangéconfig_host_data.set('CONFIG_TASN1', tasn1.found()) 193657612511SPaolo Bonziniconfig_host_data.set('CONFIG_GCRYPT', gcrypt.found()) 193757612511SPaolo Bonziniconfig_host_data.set('CONFIG_NETTLE', nettle.found()) 19384c5e512eSLei Heconfig_host_data.set('CONFIG_HOGWEED', hogweed.found()) 193957612511SPaolo Bonziniconfig_host_data.set('CONFIG_QEMU_PRIVATE_XTS', xts == 'private') 1940aa087962SPaolo Bonziniconfig_host_data.set('CONFIG_MALLOC_TRIM', has_malloc_trim) 194184e319a5SMax Reitzconfig_host_data.set('CONFIG_STATX', has_statx) 19424ce7a08dSHanna Reitzconfig_host_data.set('CONFIG_STATX_MNT_ID', has_statx_mnt_id) 1943b1def33dSPaolo Bonziniconfig_host_data.set('CONFIG_ZSTD', zstd.found()) 1944a484a719SMax Reitzconfig_host_data.set('CONFIG_FUSE', fuse.found()) 1945df4ea709SMax Reitzconfig_host_data.set('CONFIG_FUSE_LSEEK', fuse_lseek.found()) 19463f0a5d55SMarc-André Lureauconfig_host_data.set('CONFIG_SPICE_PROTOCOL', spice_protocol.found()) 1947ddece465SMarc-André Lureauif spice_protocol.found() 1948ddece465SMarc-André Lureauconfig_host_data.set('CONFIG_SPICE_PROTOCOL_MAJOR', spice_protocol.version().split('.')[0]) 1949ddece465SMarc-André Lureauconfig_host_data.set('CONFIG_SPICE_PROTOCOL_MINOR', spice_protocol.version().split('.')[1]) 1950ddece465SMarc-André Lureauconfig_host_data.set('CONFIG_SPICE_PROTOCOL_MICRO', spice_protocol.version().split('.')[2]) 1951ddece465SMarc-André Lureauendif 19523f0a5d55SMarc-André Lureauconfig_host_data.set('CONFIG_SPICE', spice.found()) 19539d71037fSPaolo Bonziniconfig_host_data.set('CONFIG_X11', x11.found()) 1954142ca628SMarc-André Lureauconfig_host_data.set('CONFIG_DBUS_DISPLAY', dbus_display) 19559e62ba48SDaniele Buonoconfig_host_data.set('CONFIG_CFI', get_option('cfi')) 19563d212b41SRichard W.M. Jonesconfig_host_data.set('CONFIG_SELINUX', selinux.found()) 195714efd8d3SPaolo Bonziniconfig_host_data.set('CONFIG_XEN_BACKEND', xen.found()) 19587c10cb38SIlya Leoshkevichconfig_host_data.set('CONFIG_LIBDW', libdw.found()) 195914efd8d3SPaolo Bonziniif xen.found() 196014efd8d3SPaolo Bonzini # protect from xen.version() having less than three components 196114efd8d3SPaolo Bonzini xen_version = xen.version().split('.') + ['0', '0'] 196214efd8d3SPaolo Bonzini xen_ctrl_version = xen_version[0] + \ 196314efd8d3SPaolo Bonzini ('0' + xen_version[1]).substring(-2) + \ 196414efd8d3SPaolo Bonzini ('0' + xen_version[2]).substring(-2) 196514efd8d3SPaolo Bonzini config_host_data.set('CONFIG_XEN_CTRL_INTERFACE_VERSION', xen_ctrl_version) 196614efd8d3SPaolo Bonziniendif 1967859aef02SPaolo Bonziniconfig_host_data.set('QEMU_VERSION', '"@0@"'.format(meson.project_version())) 1968859aef02SPaolo Bonziniconfig_host_data.set('QEMU_VERSION_MAJOR', meson.project_version().split('.')[0]) 1969859aef02SPaolo Bonziniconfig_host_data.set('QEMU_VERSION_MINOR', meson.project_version().split('.')[1]) 1970859aef02SPaolo Bonziniconfig_host_data.set('QEMU_VERSION_MICRO', meson.project_version().split('.')[2]) 1971859aef02SPaolo Bonzini 1972a6305081SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_HOST_DSOSUF', host_dsosuf) 197369d8de7aSPaolo Bonziniconfig_host_data.set('HAVE_HOST_BLOCK_DEVICE', have_host_block_device) 197469d8de7aSPaolo Bonzini 1975728c0a2fSPaolo Bonzinihave_coroutine_pool = get_option('coroutine_pool') 1976728c0a2fSPaolo Bonziniif get_option('debug_stack_usage') and have_coroutine_pool 1977728c0a2fSPaolo Bonzini message('Disabling coroutine pool to measure stack usage') 1978728c0a2fSPaolo Bonzini have_coroutine_pool = false 1979728c0a2fSPaolo Bonziniendif 1980728c0a2fSPaolo Bonziniconfig_host_data.set10('CONFIG_COROUTINE_POOL', have_coroutine_pool) 198158a2e3f5SStefan Hajnocziconfig_host_data.set('CONFIG_DEBUG_GRAPH_LOCK', get_option('debug_graph_lock')) 1982c55cf6abSPaolo Bonziniconfig_host_data.set('CONFIG_DEBUG_MUTEX', get_option('debug_mutex')) 1983728c0a2fSPaolo Bonziniconfig_host_data.set('CONFIG_DEBUG_STACK_USAGE', get_option('debug_stack_usage')) 1984c55cf6abSPaolo Bonziniconfig_host_data.set('CONFIG_GPROF', get_option('gprof')) 1985406523f6SPaolo Bonziniconfig_host_data.set('CONFIG_LIVE_BLOCK_MIGRATION', get_option('live_block_migration').allowed()) 1986c55cf6abSPaolo Bonziniconfig_host_data.set('CONFIG_QOM_CAST_DEBUG', get_option('qom_cast_debug')) 1987abad185cSJuan Quintelaconfig_host_data.set('CONFIG_REPLICATION', get_option('replication').allowed()) 1988406523f6SPaolo Bonzini 198969d8de7aSPaolo Bonzini# has_header 1990e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_EPOLL', cc.has_header('sys/epoll.h')) 1991d47a8b3bSPaolo Bonziniconfig_host_data.set('CONFIG_LINUX_MAGIC_H', cc.has_header('linux/magic.h')) 1992d47a8b3bSPaolo Bonziniconfig_host_data.set('CONFIG_VALGRIND_H', cc.has_header('valgrind/valgrind.h')) 199348f670ecSThomas Huthconfig_host_data.set('HAVE_BTRFS_H', cc.has_header('linux/btrfs.h')) 19942964be52SThomas Huthconfig_host_data.set('HAVE_DRM_H', cc.has_header('libdrm/drm.h')) 19952802d91dSThomas Huthconfig_host_data.set('HAVE_PTY_H', cc.has_header('pty.h')) 199669d8de7aSPaolo Bonziniconfig_host_data.set('HAVE_SYS_DISK_H', cc.has_header('sys/disk.h')) 1997ded5d78cSThomas Huthconfig_host_data.set('HAVE_SYS_IOCCOM_H', cc.has_header('sys/ioccom.h')) 19984a9d5f89SThomas Huthconfig_host_data.set('HAVE_SYS_KCOV_H', cc.has_header('sys/kcov.h')) 1999d409373bSBin Mengif targetos == 'windows' 2000d409373bSBin Meng config_host_data.set('HAVE_AFUNIX_H', cc.has_header('afunix.h')) 2001d409373bSBin Mengendif 2002ded5d78cSThomas Huth 200369d8de7aSPaolo Bonzini# has_function 2004c891c24bSClaudio Imbrendaconfig_host_data.set('CONFIG_CLOSE_RANGE', cc.has_function('close_range')) 2005a620fbe9SPaolo Bonziniconfig_host_data.set('CONFIG_ACCEPT4', cc.has_function('accept4')) 2006e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_CLOCK_ADJTIME', cc.has_function('clock_adjtime')) 2007e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_DUP3', cc.has_function('dup3')) 2008e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_FALLOCATE', cc.has_function('fallocate')) 2009e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_POSIX_FALLOCATE', cc.has_function('posix_fallocate')) 20108698343bSPeter Maydell# Note that we need to specify prefix: here to avoid incorrectly 20118698343bSPeter Maydell# thinking that Windows has posix_memalign() 20128698343bSPeter Maydellconfig_host_data.set('CONFIG_POSIX_MEMALIGN', cc.has_function('posix_memalign', prefix: '#include <stdlib.h>')) 20135c8c714aSPeter Maydellconfig_host_data.set('CONFIG_ALIGNED_MALLOC', cc.has_function('_aligned_malloc')) 201488454f84SPeter Maydellconfig_host_data.set('CONFIG_VALLOC', cc.has_function('valloc')) 201588454f84SPeter Maydellconfig_host_data.set('CONFIG_MEMALIGN', cc.has_function('memalign')) 2016e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_PPOLL', cc.has_function('ppoll')) 20172b9f74efSPeter Maydellconfig_host_data.set('CONFIG_PREADV', cc.has_function('preadv', prefix: '#include <sys/uio.h>')) 2018029ed1bdSKeno Fischerconfig_host_data.set('CONFIG_PTHREAD_FCHDIR_NP', cc.has_function('pthread_fchdir_np')) 2019e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_SENDFILE', cc.has_function('sendfile')) 2020e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_SETNS', cc.has_function('setns') and cc.has_function('unshare')) 2021e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_SYNCFS', cc.has_function('syncfs')) 2022e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_SYNC_FILE_RANGE', cc.has_function('sync_file_range')) 2023e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_TIMERFD', cc.has_function('timerfd_create')) 2024be7e89f6SPaolo Bonziniconfig_host_data.set('HAVE_COPY_FILE_RANGE', cc.has_function('copy_file_range')) 202559e35c7bSAndrew Deasonconfig_host_data.set('HAVE_GETIFADDRS', cc.has_function('getifaddrs')) 2026*fc9a809eSPaolo Bonziniconfig_host_data.set('HAVE_GLIB_WITH_SLICE_ALLOCATOR', glib_has_gslice) 2027e66420acSPaolo Bonziniconfig_host_data.set('HAVE_OPENPTY', cc.has_function('openpty', dependencies: util)) 2028ed3b3f17SPaolo Bonziniconfig_host_data.set('HAVE_STRCHRNUL', cc.has_function('strchrnul')) 202969d8de7aSPaolo Bonziniconfig_host_data.set('HAVE_SYSTEM_FUNCTION', cc.has_function('system', prefix: '#include <stdlib.h>')) 203066dc5f96SStefano Garzarellaif rbd.found() 203166dc5f96SStefano Garzarella config_host_data.set('HAVE_RBD_NAMESPACE_EXISTS', 203266dc5f96SStefano Garzarella cc.has_function('rbd_namespace_exists', 203366dc5f96SStefano Garzarella dependencies: rbd, 203466dc5f96SStefano Garzarella prefix: '#include <rbd/librbd.h>')) 203566dc5f96SStefano Garzarellaendif 2036911965acSLi Zhijianif rdma.found() 2037911965acSLi Zhijian config_host_data.set('HAVE_IBV_ADVISE_MR', 2038911965acSLi Zhijian cc.has_function('ibv_advise_mr', 20393730a734SPaolo Bonzini dependencies: rdma, 2040911965acSLi Zhijian prefix: '#include <infiniband/verbs.h>')) 2041911965acSLi Zhijianendif 20422b9f74efSPeter Maydell 2043e66420acSPaolo Bonzini# has_header_symbol 20446d43eaa3SSam Liconfig_host_data.set('CONFIG_BLKZONED', 20456d43eaa3SSam Li cc.has_header_symbol('linux/blkzoned.h', 'BLKOPENZONE')) 2046e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_EPOLL_CREATE1', 2047e66420acSPaolo Bonzini cc.has_header_symbol('sys/epoll.h', 'epoll_create1')) 2048e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_FALLOCATE_PUNCH_HOLE', 2049e66420acSPaolo Bonzini cc.has_header_symbol('linux/falloc.h', 'FALLOC_FL_PUNCH_HOLE') and 2050e66420acSPaolo Bonzini cc.has_header_symbol('linux/falloc.h', 'FALLOC_FL_KEEP_SIZE')) 2051e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_FALLOCATE_ZERO_RANGE', 2052e66420acSPaolo Bonzini cc.has_header_symbol('linux/falloc.h', 'FALLOC_FL_ZERO_RANGE')) 2053e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_FIEMAP', 2054e66420acSPaolo Bonzini cc.has_header('linux/fiemap.h') and 2055e66420acSPaolo Bonzini cc.has_header_symbol('linux/fs.h', 'FS_IOC_FIEMAP')) 2056be7e89f6SPaolo Bonziniconfig_host_data.set('CONFIG_GETRANDOM', 2057be7e89f6SPaolo Bonzini cc.has_function('getrandom') and 2058be7e89f6SPaolo Bonzini cc.has_header_symbol('sys/random.h', 'GRND_NONBLOCK')) 2059a620fbe9SPaolo Bonziniconfig_host_data.set('CONFIG_INOTIFY', 2060a620fbe9SPaolo Bonzini cc.has_header_symbol('sys/inotify.h', 'inotify_init')) 2061a620fbe9SPaolo Bonziniconfig_host_data.set('CONFIG_INOTIFY1', 2062a620fbe9SPaolo Bonzini cc.has_header_symbol('sys/inotify.h', 'inotify_init1')) 2063e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_PRCTL_PR_SET_TIMERSLACK', 2064e66420acSPaolo Bonzini cc.has_header_symbol('sys/prctl.h', 'PR_SET_TIMERSLACK')) 2065be7e89f6SPaolo Bonziniconfig_host_data.set('CONFIG_RTNETLINK', 2066be7e89f6SPaolo Bonzini cc.has_header_symbol('linux/rtnetlink.h', 'IFLA_PROTO_DOWN')) 2067be7e89f6SPaolo Bonziniconfig_host_data.set('CONFIG_SYSMACROS', 2068be7e89f6SPaolo Bonzini cc.has_header_symbol('sys/sysmacros.h', 'makedev')) 2069e1fbd2c4SPaolo Bonziniconfig_host_data.set('HAVE_OPTRESET', 2070e1fbd2c4SPaolo Bonzini cc.has_header_symbol('getopt.h', 'optreset')) 2071653163fcSMarc-André Lureauconfig_host_data.set('HAVE_IPPROTO_MPTCP', 2072653163fcSMarc-André Lureau cc.has_header_symbol('netinet/in.h', 'IPPROTO_MPTCP')) 2073e66420acSPaolo Bonzini 2074e66420acSPaolo Bonzini# has_member 2075e66420acSPaolo Bonziniconfig_host_data.set('HAVE_SIGEV_NOTIFY_THREAD_ID', 2076e66420acSPaolo Bonzini cc.has_member('struct sigevent', 'sigev_notify_thread_id', 2077e66420acSPaolo Bonzini prefix: '#include <signal.h>')) 2078ed3b3f17SPaolo Bonziniconfig_host_data.set('HAVE_STRUCT_STAT_ST_ATIM', 2079ed3b3f17SPaolo Bonzini cc.has_member('struct stat', 'st_atim', 2080ed3b3f17SPaolo Bonzini prefix: '#include <sys/stat.h>')) 20816d43eaa3SSam Liconfig_host_data.set('HAVE_BLK_ZONE_REP_CAPACITY', 20826d43eaa3SSam Li cc.has_member('struct blk_zone', 'capacity', 20836d43eaa3SSam Li prefix: '#include <linux/blkzoned.h>')) 2084e66420acSPaolo Bonzini 20856a23f819SPaolo Bonzini# has_type 20866a23f819SPaolo Bonziniconfig_host_data.set('CONFIG_IOVEC', 20876a23f819SPaolo Bonzini cc.has_type('struct iovec', 20886a23f819SPaolo Bonzini prefix: '#include <sys/uio.h>')) 20896a23f819SPaolo Bonziniconfig_host_data.set('HAVE_UTMPX', 20906a23f819SPaolo Bonzini cc.has_type('struct utmpx', 20916a23f819SPaolo Bonzini prefix: '#include <utmpx.h>')) 20926a23f819SPaolo Bonzini 2093904ad5ecSPaolo Bonziniconfig_host_data.set('CONFIG_EVENTFD', cc.links(''' 2094e1fbd2c4SPaolo Bonzini #include <sys/eventfd.h> 2095e1fbd2c4SPaolo Bonzini int main(void) { return eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC); }''')) 2096904ad5ecSPaolo Bonziniconfig_host_data.set('CONFIG_FDATASYNC', cc.links(gnu_source_prefix + ''' 2097e1fbd2c4SPaolo Bonzini #include <unistd.h> 2098e1fbd2c4SPaolo Bonzini int main(void) { 2099e1fbd2c4SPaolo Bonzini #if defined(_POSIX_SYNCHRONIZED_IO) && _POSIX_SYNCHRONIZED_IO > 0 2100e1fbd2c4SPaolo Bonzini return fdatasync(0); 2101e1fbd2c4SPaolo Bonzini #else 2102e1fbd2c4SPaolo Bonzini #error Not supported 2103e1fbd2c4SPaolo Bonzini #endif 2104e1fbd2c4SPaolo Bonzini }''')) 21058900c204SAndrew Deason 21068900c204SAndrew Deasonhas_madvise = cc.links(gnu_source_prefix + ''' 2107e1fbd2c4SPaolo Bonzini #include <sys/types.h> 2108e1fbd2c4SPaolo Bonzini #include <sys/mman.h> 2109e1fbd2c4SPaolo Bonzini #include <stddef.h> 21108900c204SAndrew Deason int main(void) { return madvise(NULL, 0, MADV_DONTNEED); }''') 21118900c204SAndrew Deasonmissing_madvise_proto = false 21128900c204SAndrew Deasonif has_madvise 21138900c204SAndrew Deason # Some platforms (illumos and Solaris before Solaris 11) provide madvise() 21148900c204SAndrew Deason # but forget to prototype it. In this case, has_madvise will be true (the 21158900c204SAndrew Deason # test program links despite a compile warning). To detect the 21168900c204SAndrew Deason # missing-prototype case, we try again with a definitely-bogus prototype. 21178900c204SAndrew Deason # This will only compile if the system headers don't provide the prototype; 21188900c204SAndrew Deason # otherwise the conflicting prototypes will cause a compiler error. 21198900c204SAndrew Deason missing_madvise_proto = cc.links(gnu_source_prefix + ''' 21208900c204SAndrew Deason #include <sys/types.h> 21218900c204SAndrew Deason #include <sys/mman.h> 21228900c204SAndrew Deason #include <stddef.h> 21238900c204SAndrew Deason extern int madvise(int); 21248900c204SAndrew Deason int main(void) { return madvise(0); }''') 21258900c204SAndrew Deasonendif 21268900c204SAndrew Deasonconfig_host_data.set('CONFIG_MADVISE', has_madvise) 21278900c204SAndrew Deasonconfig_host_data.set('HAVE_MADVISE_WITHOUT_PROTOTYPE', missing_madvise_proto) 21288900c204SAndrew Deason 2129904ad5ecSPaolo Bonziniconfig_host_data.set('CONFIG_MEMFD', cc.links(gnu_source_prefix + ''' 2130e1fbd2c4SPaolo Bonzini #include <sys/mman.h> 2131e1fbd2c4SPaolo Bonzini int main(void) { return memfd_create("foo", MFD_ALLOW_SEALING); }''')) 2132904ad5ecSPaolo Bonziniconfig_host_data.set('CONFIG_OPEN_BY_HANDLE', cc.links(gnu_source_prefix + ''' 2133d47a8b3bSPaolo Bonzini #include <fcntl.h> 2134d47a8b3bSPaolo Bonzini #if !defined(AT_EMPTY_PATH) 2135d47a8b3bSPaolo Bonzini # error missing definition 2136d47a8b3bSPaolo Bonzini #else 2137d47a8b3bSPaolo Bonzini int main(void) { struct file_handle fh; return open_by_handle_at(0, &fh, 0); } 2138d47a8b3bSPaolo Bonzini #endif''')) 2139904ad5ecSPaolo Bonziniconfig_host_data.set('CONFIG_POSIX_MADVISE', cc.links(gnu_source_prefix + ''' 2140e1fbd2c4SPaolo Bonzini #include <sys/mman.h> 2141e1fbd2c4SPaolo Bonzini #include <stddef.h> 2142e1fbd2c4SPaolo Bonzini int main(void) { return posix_madvise(NULL, 0, POSIX_MADV_DONTNEED); }''')) 214310f6b231SPaolo Bonzini 21446a23f819SPaolo Bonziniconfig_host_data.set('CONFIG_PTHREAD_SETNAME_NP_W_TID', cc.links(gnu_source_prefix + ''' 214510f6b231SPaolo Bonzini #include <pthread.h> 214610f6b231SPaolo Bonzini 214710f6b231SPaolo Bonzini static void *f(void *p) { return NULL; } 214810f6b231SPaolo Bonzini int main(void) 214910f6b231SPaolo Bonzini { 215010f6b231SPaolo Bonzini pthread_t thread; 215110f6b231SPaolo Bonzini pthread_create(&thread, 0, f, 0); 215210f6b231SPaolo Bonzini pthread_setname_np(thread, "QEMU"); 215310f6b231SPaolo Bonzini return 0; 215410f6b231SPaolo Bonzini }''', dependencies: threads)) 21556a23f819SPaolo Bonziniconfig_host_data.set('CONFIG_PTHREAD_SETNAME_NP_WO_TID', cc.links(gnu_source_prefix + ''' 215610f6b231SPaolo Bonzini #include <pthread.h> 215710f6b231SPaolo Bonzini 215810f6b231SPaolo Bonzini static void *f(void *p) { pthread_setname_np("QEMU"); return NULL; } 215910f6b231SPaolo Bonzini int main(void) 216010f6b231SPaolo Bonzini { 216110f6b231SPaolo Bonzini pthread_t thread; 216210f6b231SPaolo Bonzini pthread_create(&thread, 0, f, 0); 216310f6b231SPaolo Bonzini return 0; 216410f6b231SPaolo Bonzini }''', dependencies: threads)) 21653ada67a3SBrad Smithconfig_host_data.set('CONFIG_PTHREAD_SET_NAME_NP', cc.links(gnu_source_prefix + ''' 21663ada67a3SBrad Smith #include <pthread.h> 21673ada67a3SBrad Smith #include <pthread_np.h> 21683ada67a3SBrad Smith 21693ada67a3SBrad Smith static void *f(void *p) { return NULL; } 21703ada67a3SBrad Smith int main(void) 21713ada67a3SBrad Smith { 21723ada67a3SBrad Smith pthread_t thread; 21733ada67a3SBrad Smith pthread_create(&thread, 0, f, 0); 21743ada67a3SBrad Smith pthread_set_name_np(thread, "QEMU"); 21753ada67a3SBrad Smith return 0; 21763ada67a3SBrad Smith }''', dependencies: threads)) 2177657ac98bSLongpeng(Mike)config_host_data.set('CONFIG_PTHREAD_CONDATTR_SETCLOCK', cc.links(gnu_source_prefix + ''' 2178657ac98bSLongpeng(Mike) #include <pthread.h> 2179657ac98bSLongpeng(Mike) #include <time.h> 2180657ac98bSLongpeng(Mike) 2181657ac98bSLongpeng(Mike) int main(void) 2182657ac98bSLongpeng(Mike) { 2183657ac98bSLongpeng(Mike) pthread_condattr_t attr 2184657ac98bSLongpeng(Mike) pthread_condattr_init(&attr); 2185657ac98bSLongpeng(Mike) pthread_condattr_setclock(&attr, CLOCK_MONOTONIC); 2186657ac98bSLongpeng(Mike) return 0; 2187657ac98bSLongpeng(Mike) }''', dependencies: threads)) 21887730f32cSDavid Hildenbrandconfig_host_data.set('CONFIG_PTHREAD_AFFINITY_NP', cc.links(gnu_source_prefix + ''' 21897730f32cSDavid Hildenbrand #include <pthread.h> 219010f6b231SPaolo Bonzini 21917730f32cSDavid Hildenbrand static void *f(void *p) { return NULL; } 21927730f32cSDavid Hildenbrand int main(void) 21937730f32cSDavid Hildenbrand { 21947730f32cSDavid Hildenbrand int setsize = CPU_ALLOC_SIZE(64); 21957730f32cSDavid Hildenbrand pthread_t thread; 21967730f32cSDavid Hildenbrand cpu_set_t *cpuset; 21977730f32cSDavid Hildenbrand pthread_create(&thread, 0, f, 0); 21987730f32cSDavid Hildenbrand cpuset = CPU_ALLOC(64); 21997730f32cSDavid Hildenbrand CPU_ZERO_S(setsize, cpuset); 22007730f32cSDavid Hildenbrand pthread_setaffinity_np(thread, setsize, cpuset); 22017730f32cSDavid Hildenbrand pthread_getaffinity_np(thread, setsize, cpuset); 22027730f32cSDavid Hildenbrand CPU_FREE(cpuset); 22037730f32cSDavid Hildenbrand return 0; 22047730f32cSDavid Hildenbrand }''', dependencies: threads)) 2205904ad5ecSPaolo Bonziniconfig_host_data.set('CONFIG_SIGNALFD', cc.links(gnu_source_prefix + ''' 22066bd17dccSKacper Słomiński #include <sys/signalfd.h> 22076bd17dccSKacper Słomiński #include <stddef.h> 22086bd17dccSKacper Słomiński int main(void) { return signalfd(-1, NULL, SFD_CLOEXEC); }''')) 2209904ad5ecSPaolo Bonziniconfig_host_data.set('CONFIG_SPLICE', cc.links(gnu_source_prefix + ''' 2210a620fbe9SPaolo Bonzini #include <unistd.h> 2211a620fbe9SPaolo Bonzini #include <fcntl.h> 2212a620fbe9SPaolo Bonzini #include <limits.h> 2213a620fbe9SPaolo Bonzini 2214a620fbe9SPaolo Bonzini int main(void) 2215a620fbe9SPaolo Bonzini { 2216a620fbe9SPaolo Bonzini int len, fd = 0; 2217a620fbe9SPaolo Bonzini len = tee(STDIN_FILENO, STDOUT_FILENO, INT_MAX, SPLICE_F_NONBLOCK); 2218a620fbe9SPaolo Bonzini splice(STDIN_FILENO, NULL, fd, NULL, len, SPLICE_F_MOVE); 2219a620fbe9SPaolo Bonzini return 0; 2220a620fbe9SPaolo Bonzini }''')) 2221e1fbd2c4SPaolo Bonzini 222296a63aebSPaolo Bonziniconfig_host_data.set('HAVE_MLOCKALL', cc.links(gnu_source_prefix + ''' 222396a63aebSPaolo Bonzini #include <sys/mman.h> 2224b5d3dac1SPaolo Bonzini int main(void) { 222596a63aebSPaolo Bonzini return mlockall(MCL_FUTURE); 222696a63aebSPaolo Bonzini }''')) 222796a63aebSPaolo Bonzini 2228eea9453aSThomas Huthhave_l2tpv3 = false 222943a363aeSPaolo Bonziniif get_option('l2tpv3').allowed() and have_system 22306a23f819SPaolo Bonzini have_l2tpv3 = cc.has_type('struct mmsghdr', 22316a23f819SPaolo Bonzini prefix: gnu_source_prefix + ''' 22326a23f819SPaolo Bonzini #include <sys/socket.h> 22336a23f819SPaolo Bonzini #include <linux/ip.h>''') 2234eea9453aSThomas Huthendif 2235eea9453aSThomas Huthconfig_host_data.set('CONFIG_L2TPV3', have_l2tpv3) 2236eea9453aSThomas Huth 2237837b84b1SPaolo Bonzinihave_netmap = false 223843a363aeSPaolo Bonziniif get_option('netmap').allowed() and have_system 2239837b84b1SPaolo Bonzini have_netmap = cc.compiles(''' 2240837b84b1SPaolo Bonzini #include <inttypes.h> 2241837b84b1SPaolo Bonzini #include <net/if.h> 2242837b84b1SPaolo Bonzini #include <net/netmap.h> 2243837b84b1SPaolo Bonzini #include <net/netmap_user.h> 2244837b84b1SPaolo Bonzini #if (NETMAP_API < 11) || (NETMAP_API > 15) 2245837b84b1SPaolo Bonzini #error 2246837b84b1SPaolo Bonzini #endif 2247837b84b1SPaolo Bonzini int main(void) { return 0; }''') 2248837b84b1SPaolo Bonzini if not have_netmap and get_option('netmap').enabled() 2249837b84b1SPaolo Bonzini error('Netmap headers not available') 2250837b84b1SPaolo Bonzini endif 2251837b84b1SPaolo Bonziniendif 2252837b84b1SPaolo Bonziniconfig_host_data.set('CONFIG_NETMAP', have_netmap) 2253837b84b1SPaolo Bonzini 225496a63aebSPaolo Bonzini# Work around a system header bug with some kernel/XFS header 225596a63aebSPaolo Bonzini# versions where they both try to define 'struct fsxattr': 225696a63aebSPaolo Bonzini# xfs headers will not try to redefine structs from linux headers 225796a63aebSPaolo Bonzini# if this macro is set. 225896a63aebSPaolo Bonziniconfig_host_data.set('HAVE_FSXATTR', cc.links(''' 22596a23f819SPaolo Bonzini #include <linux/fs.h> 226096a63aebSPaolo Bonzini struct fsxattr foo; 226196a63aebSPaolo Bonzini int main(void) { 226296a63aebSPaolo Bonzini return 0; 226396a63aebSPaolo Bonzini }''')) 226496a63aebSPaolo Bonzini 2265e46bd55dSPaolo Bonzini# Some versions of Mac OS X incorrectly define SIZE_MAX 2266e46bd55dSPaolo Bonziniconfig_host_data.set('HAVE_BROKEN_SIZE_MAX', not cc.compiles(''' 2267e46bd55dSPaolo Bonzini #include <stdint.h> 2268e46bd55dSPaolo Bonzini #include <stdio.h> 2269b5d3dac1SPaolo Bonzini int main(void) { 2270e46bd55dSPaolo Bonzini return printf("%zu", SIZE_MAX); 2271e46bd55dSPaolo Bonzini }''', args: ['-Werror'])) 2272e46bd55dSPaolo Bonzini 2273e61f1efeSRichard Henderson# See if 64-bit atomic operations are supported. 2274e61f1efeSRichard Henderson# Note that without __atomic builtins, we can only 2275e61f1efeSRichard Henderson# assume atomic loads/stores max at pointer size. 2276e61f1efeSRichard Hendersonconfig_host_data.set('CONFIG_ATOMIC64', cc.links(''' 2277bd87a367SPaolo Bonzini #include <stdint.h> 2278bd87a367SPaolo Bonzini int main(void) 2279bd87a367SPaolo Bonzini { 2280e61f1efeSRichard Henderson uint64_t x = 0, y = 0; 2281bd87a367SPaolo Bonzini y = __atomic_load_n(&x, __ATOMIC_RELAXED); 2282bd87a367SPaolo Bonzini __atomic_store_n(&x, y, __ATOMIC_RELAXED); 2283bd87a367SPaolo Bonzini __atomic_compare_exchange_n(&x, &y, x, 0, __ATOMIC_RELAXED, __ATOMIC_RELAXED); 2284bd87a367SPaolo Bonzini __atomic_exchange_n(&x, y, __ATOMIC_RELAXED); 2285bd87a367SPaolo Bonzini __atomic_fetch_add(&x, y, __ATOMIC_RELAXED); 2286bd87a367SPaolo Bonzini return 0; 2287e61f1efeSRichard Henderson }''')) 2288bd87a367SPaolo Bonzini 2289848126d1SMarc-André Lureauhas_int128 = cc.links(''' 2290848126d1SMarc-André Lureau __int128_t a; 2291848126d1SMarc-André Lureau __uint128_t b; 2292848126d1SMarc-André Lureau int main (void) { 2293848126d1SMarc-André Lureau a = a + b; 2294848126d1SMarc-André Lureau b = a * b; 2295848126d1SMarc-André Lureau a = a * a; 2296848126d1SMarc-André Lureau return 0; 2297848126d1SMarc-André Lureau }''') 2298848126d1SMarc-André Lureau 2299848126d1SMarc-André Lureauconfig_host_data.set('CONFIG_INT128', has_int128) 2300848126d1SMarc-André Lureau 2301848126d1SMarc-André Lureauif has_int128 2302d2958fb0SMarc-André Lureau # "do we have 128-bit atomics which are handled inline and specifically not 2303d2958fb0SMarc-André Lureau # via libatomic". The reason we can't use libatomic is documented in the 2304d2958fb0SMarc-André Lureau # comment starting "GCC is a house divided" in include/qemu/atomic128.h. 2305e61f1efeSRichard Henderson # We only care about these operations on 16-byte aligned pointers, so 2306e61f1efeSRichard Henderson # force 16-byte alignment of the pointer, which may be greater than 2307e61f1efeSRichard Henderson # __alignof(unsigned __int128) for the host. 2308e61f1efeSRichard Henderson atomic_test_128 = ''' 2309e61f1efeSRichard Henderson int main(int ac, char **av) { 2310e61f1efeSRichard Henderson unsigned __int128 *p = __builtin_assume_aligned(av[ac - 1], sizeof(16)); 2311e61f1efeSRichard Henderson p[1] = __atomic_load_n(&p[0], __ATOMIC_RELAXED); 2312e61f1efeSRichard Henderson __atomic_store_n(&p[2], p[3], __ATOMIC_RELAXED); 2313e61f1efeSRichard Henderson __atomic_compare_exchange_n(&p[4], &p[5], p[6], 0, __ATOMIC_RELAXED, __ATOMIC_RELAXED); 2314e61f1efeSRichard Henderson return 0; 2315e61f1efeSRichard Henderson }''' 2316e61f1efeSRichard Henderson has_atomic128 = cc.links(atomic_test_128) 2317848126d1SMarc-André Lureau 2318848126d1SMarc-André Lureau config_host_data.set('CONFIG_ATOMIC128', has_atomic128) 2319848126d1SMarc-André Lureau 2320848126d1SMarc-André Lureau if not has_atomic128 2321e61f1efeSRichard Henderson # Even with __builtin_assume_aligned, the above test may have failed 2322e61f1efeSRichard Henderson # without optimization enabled. Try again with optimizations locally 2323e61f1efeSRichard Henderson # enabled for the function. See 2324e61f1efeSRichard Henderson # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107389 2325e61f1efeSRichard Henderson has_atomic128_opt = cc.links('__attribute__((optimize("O1")))' + atomic_test_128) 2326e61f1efeSRichard Henderson config_host_data.set('CONFIG_ATOMIC128_OPT', has_atomic128_opt) 2327e61f1efeSRichard Henderson 2328e61f1efeSRichard Henderson if not has_atomic128_opt 2329e61f1efeSRichard Henderson config_host_data.set('CONFIG_CMPXCHG128', cc.links(''' 2330848126d1SMarc-André Lureau int main(void) 2331848126d1SMarc-André Lureau { 2332848126d1SMarc-André Lureau unsigned __int128 x = 0, y = 0; 2333848126d1SMarc-André Lureau __sync_val_compare_and_swap_16(&x, y, x); 2334848126d1SMarc-André Lureau return 0; 2335848126d1SMarc-André Lureau } 2336e61f1efeSRichard Henderson ''')) 2337e61f1efeSRichard Henderson endif 2338848126d1SMarc-André Lureau endif 2339848126d1SMarc-André Lureauendif 2340bd87a367SPaolo Bonzini 2341bd87a367SPaolo Bonziniconfig_host_data.set('CONFIG_GETAUXVAL', cc.links(gnu_source_prefix + ''' 2342bd87a367SPaolo Bonzini #include <sys/auxv.h> 2343bd87a367SPaolo Bonzini int main(void) { 2344bd87a367SPaolo Bonzini return getauxval(AT_HWCAP) == 0; 2345bd87a367SPaolo Bonzini }''')) 2346bd87a367SPaolo Bonzini 23470dae95d4SPaolo Bonziniconfig_host_data.set('CONFIG_USBFS', have_linux_user and cc.compiles(''' 23480dae95d4SPaolo Bonzini #include <linux/usbdevice_fs.h> 23490dae95d4SPaolo Bonzini 23500dae95d4SPaolo Bonzini #ifndef USBDEVFS_GET_CAPABILITIES 23510dae95d4SPaolo Bonzini #error "USBDEVFS_GET_CAPABILITIES undefined" 23520dae95d4SPaolo Bonzini #endif 23530dae95d4SPaolo Bonzini 23540dae95d4SPaolo Bonzini #ifndef USBDEVFS_DISCONNECT_CLAIM 23550dae95d4SPaolo Bonzini #error "USBDEVFS_DISCONNECT_CLAIM undefined" 23560dae95d4SPaolo Bonzini #endif 23570dae95d4SPaolo Bonzini 23580dae95d4SPaolo Bonzini int main(void) { return 0; }''')) 23590dae95d4SPaolo Bonzini 23602edd2c04SPaolo Bonzinihave_keyring = get_option('keyring') \ 23612edd2c04SPaolo Bonzini .require(targetos == 'linux', error_message: 'keyring is only available on Linux') \ 23622edd2c04SPaolo Bonzini .require(cc.compiles(''' 23632edd2c04SPaolo Bonzini #include <errno.h> 23642edd2c04SPaolo Bonzini #include <asm/unistd.h> 23652edd2c04SPaolo Bonzini #include <linux/keyctl.h> 23662edd2c04SPaolo Bonzini #include <sys/syscall.h> 23672edd2c04SPaolo Bonzini #include <unistd.h> 23682edd2c04SPaolo Bonzini int main(void) { 23692edd2c04SPaolo Bonzini return syscall(__NR_keyctl, KEYCTL_READ, 0, NULL, NULL, 0); 23702edd2c04SPaolo Bonzini }'''), error_message: 'keyctl syscall not available on this system').allowed() 23712edd2c04SPaolo Bonziniconfig_host_data.set('CONFIG_SECRET_KEYRING', have_keyring) 23722edd2c04SPaolo Bonzini 2373622753d2SPaolo Bonzinihave_cpuid_h = cc.links(''' 2374622753d2SPaolo Bonzini #include <cpuid.h> 2375622753d2SPaolo Bonzini int main(void) { 2376622753d2SPaolo Bonzini unsigned a, b, c, d; 2377622753d2SPaolo Bonzini unsigned max = __get_cpuid_max(0, 0); 2378622753d2SPaolo Bonzini 2379622753d2SPaolo Bonzini if (max >= 1) { 2380622753d2SPaolo Bonzini __cpuid(1, a, b, c, d); 2381622753d2SPaolo Bonzini } 2382622753d2SPaolo Bonzini 2383622753d2SPaolo Bonzini if (max >= 7) { 2384622753d2SPaolo Bonzini __cpuid_count(7, 0, a, b, c, d); 2385622753d2SPaolo Bonzini } 2386622753d2SPaolo Bonzini 2387622753d2SPaolo Bonzini return 0; 2388622753d2SPaolo Bonzini }''') 2389622753d2SPaolo Bonziniconfig_host_data.set('CONFIG_CPUID_H', have_cpuid_h) 2390622753d2SPaolo Bonzini 2391622753d2SPaolo Bonziniconfig_host_data.set('CONFIG_AVX2_OPT', get_option('avx2') \ 2392622753d2SPaolo Bonzini .require(have_cpuid_h, error_message: 'cpuid.h not available, cannot enable AVX2') \ 2393622753d2SPaolo Bonzini .require(cc.links(''' 2394622753d2SPaolo Bonzini #include <cpuid.h> 2395622753d2SPaolo Bonzini #include <immintrin.h> 2396701ea587SRichard Henderson static int __attribute__((target("avx2"))) bar(void *a) { 2397622753d2SPaolo Bonzini __m256i x = *(__m256i *)a; 2398622753d2SPaolo Bonzini return _mm256_testz_si256(x, x); 2399622753d2SPaolo Bonzini } 2400b5d3dac1SPaolo Bonzini int main(int argc, char *argv[]) { return bar(argv[argc - 1]); } 2401622753d2SPaolo Bonzini '''), error_message: 'AVX2 not available').allowed()) 2402622753d2SPaolo Bonzini 2403622753d2SPaolo Bonziniconfig_host_data.set('CONFIG_AVX512F_OPT', get_option('avx512f') \ 2404622753d2SPaolo Bonzini .require(have_cpuid_h, error_message: 'cpuid.h not available, cannot enable AVX512F') \ 2405622753d2SPaolo Bonzini .require(cc.links(''' 2406622753d2SPaolo Bonzini #include <cpuid.h> 2407622753d2SPaolo Bonzini #include <immintrin.h> 2408701ea587SRichard Henderson static int __attribute__((target("avx512f"))) bar(void *a) { 2409622753d2SPaolo Bonzini __m512i x = *(__m512i *)a; 2410622753d2SPaolo Bonzini return _mm512_test_epi64_mask(x, x); 2411622753d2SPaolo Bonzini } 2412b5d3dac1SPaolo Bonzini int main(int argc, char *argv[]) { return bar(argv[argc - 1]); } 2413622753d2SPaolo Bonzini '''), error_message: 'AVX512F not available').allowed()) 2414622753d2SPaolo Bonzini 241504ffce13Sling xuconfig_host_data.set('CONFIG_AVX512BW_OPT', get_option('avx512bw') \ 241604ffce13Sling xu .require(have_cpuid_h, error_message: 'cpuid.h not available, cannot enable AVX512BW') \ 241704ffce13Sling xu .require(cc.links(''' 241804ffce13Sling xu #include <cpuid.h> 241904ffce13Sling xu #include <immintrin.h> 2420dc165fcdSRichard Henderson static int __attribute__((target("avx512bw"))) bar(void *a) { 242104ffce13Sling xu __m512i *x = a; 242204ffce13Sling xu __m512i res= _mm512_abs_epi8(*x); 242304ffce13Sling xu return res[1]; 242404ffce13Sling xu } 242504ffce13Sling xu int main(int argc, char *argv[]) { return bar(argv[0]); } 242604ffce13Sling xu '''), error_message: 'AVX512BW not available').allowed()) 242704ffce13Sling xu 24283730a734SPaolo Bonzinihave_pvrdma = get_option('pvrdma') \ 24293730a734SPaolo Bonzini .require(rdma.found(), error_message: 'PVRDMA requires OpenFabrics libraries') \ 2430354d2d9bSJuan Quintela .require(cc.compiles(gnu_source_prefix + ''' 2431354d2d9bSJuan Quintela #include <sys/mman.h> 24323730a734SPaolo Bonzini int main(void) 24333730a734SPaolo Bonzini { 24343730a734SPaolo Bonzini char buf = 0; 24353730a734SPaolo Bonzini void *addr = &buf; 24363730a734SPaolo Bonzini addr = mremap(addr, 0, 1, MREMAP_MAYMOVE | MREMAP_FIXED); 24373730a734SPaolo Bonzini 24383730a734SPaolo Bonzini return 0; 24393730a734SPaolo Bonzini }'''), error_message: 'PVRDMA requires mremap').allowed() 24403730a734SPaolo Bonzini 24413730a734SPaolo Bonziniif have_pvrdma 2442354d2d9bSJuan Quintela config_host_data.set('LEGACY_RDMA_REG_MR', not cc.links(''' 24433730a734SPaolo Bonzini #include <infiniband/verbs.h> 24443730a734SPaolo Bonzini int main(void) 24453730a734SPaolo Bonzini { 24463730a734SPaolo Bonzini struct ibv_mr *mr; 24473730a734SPaolo Bonzini struct ibv_pd *pd = NULL; 24483730a734SPaolo Bonzini size_t length = 10; 24493730a734SPaolo Bonzini uint64_t iova = 0; 24503730a734SPaolo Bonzini int access = 0; 24513730a734SPaolo Bonzini void *addr = NULL; 24523730a734SPaolo Bonzini 24533730a734SPaolo Bonzini mr = ibv_reg_mr_iova(pd, addr, length, iova, access); 24543730a734SPaolo Bonzini ibv_dereg_mr(mr); 24553730a734SPaolo Bonzini return 0; 24563730a734SPaolo Bonzini }''')) 24573730a734SPaolo Bonziniendif 24583730a734SPaolo Bonzini 2459b87df904SPaolo Bonziniif get_option('membarrier').disabled() 2460b87df904SPaolo Bonzini have_membarrier = false 2461b87df904SPaolo Bonzinielif targetos == 'windows' 2462b87df904SPaolo Bonzini have_membarrier = true 2463b87df904SPaolo Bonzinielif targetos == 'linux' 2464b87df904SPaolo Bonzini have_membarrier = cc.compiles(''' 2465b87df904SPaolo Bonzini #include <linux/membarrier.h> 2466b87df904SPaolo Bonzini #include <sys/syscall.h> 2467b87df904SPaolo Bonzini #include <unistd.h> 2468b87df904SPaolo Bonzini #include <stdlib.h> 2469b87df904SPaolo Bonzini int main(void) { 2470b87df904SPaolo Bonzini syscall(__NR_membarrier, MEMBARRIER_CMD_QUERY, 0); 2471b87df904SPaolo Bonzini syscall(__NR_membarrier, MEMBARRIER_CMD_SHARED, 0); 2472b87df904SPaolo Bonzini exit(0); 2473b87df904SPaolo Bonzini }''') 2474b87df904SPaolo Bonziniendif 2475b87df904SPaolo Bonziniconfig_host_data.set('CONFIG_MEMBARRIER', get_option('membarrier') \ 2476b87df904SPaolo Bonzini .require(have_membarrier, error_message: 'membarrier system call not available') \ 2477b87df904SPaolo Bonzini .allowed()) 2478b87df904SPaolo Bonzini 247934b52615SPaolo Bonzinihave_afalg = get_option('crypto_afalg') \ 248034b52615SPaolo Bonzini .require(cc.compiles(gnu_source_prefix + ''' 248134b52615SPaolo Bonzini #include <errno.h> 248234b52615SPaolo Bonzini #include <sys/types.h> 248334b52615SPaolo Bonzini #include <sys/socket.h> 248434b52615SPaolo Bonzini #include <linux/if_alg.h> 248534b52615SPaolo Bonzini int main(void) { 248634b52615SPaolo Bonzini int sock; 248734b52615SPaolo Bonzini sock = socket(AF_ALG, SOCK_SEQPACKET, 0); 248834b52615SPaolo Bonzini return sock; 248934b52615SPaolo Bonzini } 249034b52615SPaolo Bonzini '''), error_message: 'AF_ALG requested but could not be detected').allowed() 249134b52615SPaolo Bonziniconfig_host_data.set('CONFIG_AF_ALG', have_afalg) 249234b52615SPaolo Bonzini 24939d734b85SMarc-André Lureauconfig_host_data.set('CONFIG_AF_VSOCK', cc.has_header_symbol( 24949d734b85SMarc-André Lureau 'linux/vm_sockets.h', 'AF_VSOCK', 24959d734b85SMarc-André Lureau prefix: '#include <sys/socket.h>', 24969d734b85SMarc-André Lureau)) 2497bd87a367SPaolo Bonzini 24988821a389SMarc-André Lureauhave_vss = false 2499872b69e6SMarc-André Lureauhave_vss_sdk = false # old xp/2003 SDK 25008821a389SMarc-André Lureauif targetos == 'windows' and link_language == 'cpp' 25018821a389SMarc-André Lureau have_vss = cxx.compiles(''' 25028821a389SMarc-André Lureau #define __MIDL_user_allocate_free_DEFINED__ 250332478cb6SMarc-André Lureau #include <vss.h> 25048821a389SMarc-André Lureau int main(void) { return VSS_CTX_BACKUP; }''') 2505872b69e6SMarc-André Lureau have_vss_sdk = cxx.has_header('vscoordint.h') 25068821a389SMarc-André Lureauendif 2507872b69e6SMarc-André Lureauconfig_host_data.set('HAVE_VSS_SDK', have_vss_sdk) 25088821a389SMarc-André Lureau 2509859aef02SPaolo Bonziniforeach k, v: config_host 2510ce6119dcSPaolo Bonzini if k.startswith('CONFIG_') 2511859aef02SPaolo Bonzini config_host_data.set(k, v == 'y' ? 1 : v) 2512859aef02SPaolo Bonzini endif 2513859aef02SPaolo Bonziniendforeach 2514859aef02SPaolo Bonzini 25156391c772SRichard Henderson# Older versions of MinGW do not import _lock_file and _unlock_file properly. 25166391c772SRichard Henderson# This was fixed for v6.0.0 with commit b48e3ac8969d. 25176391c772SRichard Hendersonif targetos == 'windows' 25186391c772SRichard Henderson config_host_data.set('HAVE__LOCK_FILE', cc.links(''' 25196391c772SRichard Henderson #include <stdio.h> 25206391c772SRichard Henderson int main(void) { 25216391c772SRichard Henderson _lock_file(NULL); 25226391c772SRichard Henderson _unlock_file(NULL); 25236391c772SRichard Henderson return 0; 25246391c772SRichard Henderson }''', name: '_lock_file and _unlock_file')) 25256391c772SRichard Hendersonendif 25266391c772SRichard Henderson 2527dbd672c8SPierrick Bouvierif targetos == 'windows' 2528dbd672c8SPierrick Bouvier mingw_has_setjmp_longjmp = cc.links(''' 2529dbd672c8SPierrick Bouvier #include <setjmp.h> 2530dbd672c8SPierrick Bouvier int main(void) { 2531dbd672c8SPierrick Bouvier /* 2532dbd672c8SPierrick Bouvier * These functions are not available in setjmp header, but may be 2533dbd672c8SPierrick Bouvier * available at link time, from libmingwex.a. 2534dbd672c8SPierrick Bouvier */ 2535dbd672c8SPierrick Bouvier extern int __mingw_setjmp(jmp_buf); 2536dbd672c8SPierrick Bouvier extern void __attribute__((noreturn)) __mingw_longjmp(jmp_buf, int); 2537dbd672c8SPierrick Bouvier jmp_buf env; 2538dbd672c8SPierrick Bouvier __mingw_setjmp(env); 2539dbd672c8SPierrick Bouvier __mingw_longjmp(env, 0); 2540dbd672c8SPierrick Bouvier } 2541dbd672c8SPierrick Bouvier ''', name: 'mingw setjmp and longjmp') 2542dbd672c8SPierrick Bouvier 2543dbd672c8SPierrick Bouvier if cpu == 'aarch64' and not mingw_has_setjmp_longjmp 2544dbd672c8SPierrick Bouvier error('mingw must provide setjmp/longjmp for windows-arm64') 2545dbd672c8SPierrick Bouvier endif 2546dbd672c8SPierrick Bouvierendif 2547dbd672c8SPierrick Bouvier 2548a0c9162cSPaolo Bonzini######################## 2549a0c9162cSPaolo Bonzini# Target configuration # 2550a0c9162cSPaolo Bonzini######################## 2551a0c9162cSPaolo Bonzini 25522becc36aSPaolo Bonziniminikconf = find_program('scripts/minikconf.py') 255305512f55SPaolo Bonziniconfig_all = {} 2554a98006bcSPaolo Bonziniconfig_all_devices = {} 2555ca0fc784SPaolo Bonziniconfig_all_disas = {} 25562becc36aSPaolo Bonziniconfig_devices_mak_list = [] 25572becc36aSPaolo Bonziniconfig_devices_h = {} 2558859aef02SPaolo Bonziniconfig_target_h = {} 25592becc36aSPaolo Bonziniconfig_target_mak = {} 2560ca0fc784SPaolo Bonzini 2561ca0fc784SPaolo Bonzinidisassemblers = { 2562ca0fc784SPaolo Bonzini 'alpha' : ['CONFIG_ALPHA_DIS'], 2563ca0fc784SPaolo Bonzini 'avr' : ['CONFIG_AVR_DIS'], 2564ca0fc784SPaolo Bonzini 'cris' : ['CONFIG_CRIS_DIS'], 25653e7a84eeSTaylor Simpson 'hexagon' : ['CONFIG_HEXAGON_DIS'], 2566ca0fc784SPaolo Bonzini 'hppa' : ['CONFIG_HPPA_DIS'], 2567ca0fc784SPaolo Bonzini 'i386' : ['CONFIG_I386_DIS'], 2568ca0fc784SPaolo Bonzini 'x86_64' : ['CONFIG_I386_DIS'], 2569ca0fc784SPaolo Bonzini 'm68k' : ['CONFIG_M68K_DIS'], 2570ca0fc784SPaolo Bonzini 'microblaze' : ['CONFIG_MICROBLAZE_DIS'], 2571ca0fc784SPaolo Bonzini 'mips' : ['CONFIG_MIPS_DIS'], 2572ca0fc784SPaolo Bonzini 'nios2' : ['CONFIG_NIOS2_DIS'], 2573ca0fc784SPaolo Bonzini 'or1k' : ['CONFIG_OPENRISC_DIS'], 2574ca0fc784SPaolo Bonzini 'ppc' : ['CONFIG_PPC_DIS'], 2575ca0fc784SPaolo Bonzini 'riscv' : ['CONFIG_RISCV_DIS'], 2576ca0fc784SPaolo Bonzini 'rx' : ['CONFIG_RX_DIS'], 2577ca0fc784SPaolo Bonzini 's390' : ['CONFIG_S390_DIS'], 2578ca0fc784SPaolo Bonzini 'sh4' : ['CONFIG_SH4_DIS'], 2579ca0fc784SPaolo Bonzini 'sparc' : ['CONFIG_SPARC_DIS'], 2580ca0fc784SPaolo Bonzini 'xtensa' : ['CONFIG_XTENSA_DIS'], 2581aae1746cSSong Gao 'loongarch' : ['CONFIG_LOONGARCH_DIS'], 2582ca0fc784SPaolo Bonzini} 2583ca0fc784SPaolo Bonzini 2584e1fbd2c4SPaolo Bonzinihave_ivshmem = config_host_data.get('CONFIG_EVENTFD') 25850a189110SPaolo Bonzinihost_kconfig = \ 2586537b7248SPaolo Bonzini (get_option('fuzzing') ? ['CONFIG_FUZZ=y'] : []) + \ 25870d04c4c9SPaolo Bonzini (have_tpm ? ['CONFIG_TPM=y'] : []) + \ 25883f0a5d55SMarc-André Lureau (spice.found() ? ['CONFIG_SPICE=y'] : []) + \ 2589ccd250aaSPaolo Bonzini (have_ivshmem ? ['CONFIG_IVSHMEM=y'] : []) + \ 259088b6e618SPaolo Bonzini (opengl.found() ? ['CONFIG_OPENGL=y'] : []) + \ 25919d71037fSPaolo Bonzini (x11.found() ? ['CONFIG_X11=y'] : []) + \ 25922a3129a3SPaolo Bonzini (have_vhost_user ? ['CONFIG_VHOST_USER=y'] : []) + \ 25932a3129a3SPaolo Bonzini (have_vhost_vdpa ? ['CONFIG_VHOST_VDPA=y'] : []) + \ 25942a3129a3SPaolo Bonzini (have_vhost_kernel ? ['CONFIG_VHOST_KERNEL=y'] : []) + \ 259569202b40SPaolo Bonzini (have_virtfs ? ['CONFIG_VIRTFS=y'] : []) + \ 25960a189110SPaolo Bonzini ('CONFIG_LINUX' in config_host ? ['CONFIG_LINUX=y'] : []) + \ 25973730a734SPaolo Bonzini (have_pvrdma ? ['CONFIG_PVRDMA=y'] : []) + \ 259855116968SJagannathan Raman (multiprocess_allowed ? ['CONFIG_MULTIPROCESS_ALLOWED=y'] : []) + \ 259955116968SJagannathan Raman (vfio_user_server_allowed ? ['CONFIG_VFIO_USER_SERVER_ALLOWED=y'] : []) 26000a189110SPaolo Bonzini 2601a9a74907SPaolo Bonziniignored = [ 'TARGET_XML_FILES', 'TARGET_ABI_DIR', 'TARGET_ARCH' ] 2602ca0fc784SPaolo Bonzini 2603fdb75aefSPaolo Bonzinidefault_targets = 'CONFIG_DEFAULT_TARGETS' in config_host 2604fdb75aefSPaolo Bonziniactual_target_dirs = [] 2605fbb4121dSPaolo Bonzinifdt_required = [] 2606a81df1b6SPaolo Bonziniforeach target : target_dirs 2607765686d6SPaolo Bonzini config_target = { 'TARGET_NAME': target.split('-')[0] } 2608765686d6SPaolo Bonzini if target.endswith('linux-user') 2609fdb75aefSPaolo Bonzini if targetos != 'linux' 2610fdb75aefSPaolo Bonzini if default_targets 2611fdb75aefSPaolo Bonzini continue 2612fdb75aefSPaolo Bonzini endif 2613fdb75aefSPaolo Bonzini error('Target @0@ is only available on a Linux host'.format(target)) 2614fdb75aefSPaolo Bonzini endif 2615765686d6SPaolo Bonzini config_target += { 'CONFIG_LINUX_USER': 'y' } 2616765686d6SPaolo Bonzini elif target.endswith('bsd-user') 2617fdb75aefSPaolo Bonzini if 'CONFIG_BSD' not in config_host 2618fdb75aefSPaolo Bonzini if default_targets 2619fdb75aefSPaolo Bonzini continue 2620fdb75aefSPaolo Bonzini endif 2621fdb75aefSPaolo Bonzini error('Target @0@ is only available on a BSD host'.format(target)) 2622fdb75aefSPaolo Bonzini endif 2623765686d6SPaolo Bonzini config_target += { 'CONFIG_BSD_USER': 'y' } 2624765686d6SPaolo Bonzini elif target.endswith('softmmu') 2625765686d6SPaolo Bonzini config_target += { 'CONFIG_SOFTMMU': 'y' } 2626765686d6SPaolo Bonzini endif 2627765686d6SPaolo Bonzini if target.endswith('-user') 2628765686d6SPaolo Bonzini config_target += { 2629765686d6SPaolo Bonzini 'CONFIG_USER_ONLY': 'y', 2630765686d6SPaolo Bonzini 'CONFIG_QEMU_INTERP_PREFIX': 2631ce6119dcSPaolo Bonzini get_option('interp_prefix').replace('%M', config_target['TARGET_NAME']) 2632765686d6SPaolo Bonzini } 2633765686d6SPaolo Bonzini endif 2634859aef02SPaolo Bonzini 26350a189110SPaolo Bonzini accel_kconfig = [] 26368a19980eSPaolo Bonzini foreach sym: accelerators 26378a19980eSPaolo Bonzini if sym == 'CONFIG_TCG' or target in accelerator_targets.get(sym, []) 26388a19980eSPaolo Bonzini config_target += { sym: 'y' } 26398a19980eSPaolo Bonzini config_all += { sym: 'y' } 2640dae0ec15SGerd Hoffmann if target in modular_tcg 2641dae0ec15SGerd Hoffmann config_target += { 'CONFIG_TCG_MODULAR': 'y' } 2642dae0ec15SGerd Hoffmann else 2643dae0ec15SGerd Hoffmann config_target += { 'CONFIG_TCG_BUILTIN': 'y' } 2644dae0ec15SGerd Hoffmann endif 26450a189110SPaolo Bonzini accel_kconfig += [ sym + '=y' ] 26468a19980eSPaolo Bonzini endif 26478a19980eSPaolo Bonzini endforeach 26480a189110SPaolo Bonzini if accel_kconfig.length() == 0 2649fdb75aefSPaolo Bonzini if default_targets 2650fdb75aefSPaolo Bonzini continue 2651fdb75aefSPaolo Bonzini endif 2652fdb75aefSPaolo Bonzini error('No accelerator available for target @0@'.format(target)) 2653fdb75aefSPaolo Bonzini endif 26548a19980eSPaolo Bonzini 2655fdb75aefSPaolo Bonzini actual_target_dirs += target 2656812b31d3SAlex Bennée config_target += keyval.load('configs/targets' / target + '.mak') 2657a9a74907SPaolo Bonzini config_target += { 'TARGET_' + config_target['TARGET_ARCH'].to_upper(): 'y' } 2658765686d6SPaolo Bonzini 2659fbb4121dSPaolo Bonzini if 'TARGET_NEED_FDT' in config_target 2660fbb4121dSPaolo Bonzini fdt_required += target 2661fbb4121dSPaolo Bonzini endif 2662fbb4121dSPaolo Bonzini 2663fa73168bSPaolo Bonzini # Add default keys 2664fa73168bSPaolo Bonzini if 'TARGET_BASE_ARCH' not in config_target 2665fa73168bSPaolo Bonzini config_target += {'TARGET_BASE_ARCH': config_target['TARGET_ARCH']} 2666fa73168bSPaolo Bonzini endif 2667fa73168bSPaolo Bonzini if 'TARGET_ABI_DIR' not in config_target 2668fa73168bSPaolo Bonzini config_target += {'TARGET_ABI_DIR': config_target['TARGET_ARCH']} 2669fa73168bSPaolo Bonzini endif 2670ee3eb3a7SMarc-André Lureau if 'TARGET_BIG_ENDIAN' not in config_target 2671ee3eb3a7SMarc-André Lureau config_target += {'TARGET_BIG_ENDIAN': 'n'} 2672ee3eb3a7SMarc-André Lureau endif 2673859aef02SPaolo Bonzini 2674ca0fc784SPaolo Bonzini foreach k, v: disassemblers 2675823eb013SPaolo Bonzini if host_arch.startswith(k) or config_target['TARGET_BASE_ARCH'].startswith(k) 2676ca0fc784SPaolo Bonzini foreach sym: v 2677ca0fc784SPaolo Bonzini config_target += { sym: 'y' } 2678ca0fc784SPaolo Bonzini config_all_disas += { sym: 'y' } 2679ca0fc784SPaolo Bonzini endforeach 2680ca0fc784SPaolo Bonzini endif 2681ca0fc784SPaolo Bonzini endforeach 2682ca0fc784SPaolo Bonzini 2683859aef02SPaolo Bonzini config_target_data = configuration_data() 2684859aef02SPaolo Bonzini foreach k, v: config_target 2685859aef02SPaolo Bonzini if not k.startswith('TARGET_') and not k.startswith('CONFIG_') 2686859aef02SPaolo Bonzini # do nothing 2687859aef02SPaolo Bonzini elif ignored.contains(k) 2688859aef02SPaolo Bonzini # do nothing 2689859aef02SPaolo Bonzini elif k == 'TARGET_BASE_ARCH' 2690a9a74907SPaolo Bonzini # Note that TARGET_BASE_ARCH ends up in config-target.h but it is 2691a9a74907SPaolo Bonzini # not used to select files from sourcesets. 2692859aef02SPaolo Bonzini config_target_data.set('TARGET_' + v.to_upper(), 1) 2693765686d6SPaolo Bonzini elif k == 'TARGET_NAME' or k == 'CONFIG_QEMU_INTERP_PREFIX' 2694859aef02SPaolo Bonzini config_target_data.set_quoted(k, v) 2695859aef02SPaolo Bonzini elif v == 'y' 2696859aef02SPaolo Bonzini config_target_data.set(k, 1) 2697ee3eb3a7SMarc-André Lureau elif v == 'n' 2698ee3eb3a7SMarc-André Lureau config_target_data.set(k, 0) 2699859aef02SPaolo Bonzini else 2700859aef02SPaolo Bonzini config_target_data.set(k, v) 2701859aef02SPaolo Bonzini endif 2702859aef02SPaolo Bonzini endforeach 2703cb2c5531SPeter Maydell config_target_data.set('QEMU_ARCH', 2704cb2c5531SPeter Maydell 'QEMU_ARCH_' + config_target['TARGET_BASE_ARCH'].to_upper()) 2705859aef02SPaolo Bonzini config_target_h += {target: configure_file(output: target + '-config-target.h', 2706859aef02SPaolo Bonzini configuration: config_target_data)} 27072becc36aSPaolo Bonzini 27082becc36aSPaolo Bonzini if target.endswith('-softmmu') 2709d1d5e9eeSAlex Bennée config_input = meson.get_external_property(target, 'default') 27102becc36aSPaolo Bonzini config_devices_mak = target + '-config-devices.mak' 27112becc36aSPaolo Bonzini config_devices_mak = configure_file( 2712d1d5e9eeSAlex Bennée input: ['configs/devices' / target / config_input + '.mak', 'Kconfig'], 27132becc36aSPaolo Bonzini output: config_devices_mak, 27142becc36aSPaolo Bonzini depfile: config_devices_mak + '.d', 27152becc36aSPaolo Bonzini capture: true, 27167bc3ca7fSPaolo Bonzini command: [minikconf, 27177bc3ca7fSPaolo Bonzini get_option('default_devices') ? '--defconfig' : '--allnoconfig', 27182becc36aSPaolo Bonzini config_devices_mak, '@DEPFILE@', '@INPUT@', 2719f4063f9cSPhilippe Mathieu-Daudé host_kconfig, accel_kconfig, 2720f4063f9cSPhilippe Mathieu-Daudé 'CONFIG_' + config_target['TARGET_ARCH'].to_upper() + '=y']) 2721859aef02SPaolo Bonzini 2722859aef02SPaolo Bonzini config_devices_data = configuration_data() 2723859aef02SPaolo Bonzini config_devices = keyval.load(config_devices_mak) 2724859aef02SPaolo Bonzini foreach k, v: config_devices 2725859aef02SPaolo Bonzini config_devices_data.set(k, 1) 2726859aef02SPaolo Bonzini endforeach 27272becc36aSPaolo Bonzini config_devices_mak_list += config_devices_mak 2728859aef02SPaolo Bonzini config_devices_h += {target: configure_file(output: target + '-config-devices.h', 2729859aef02SPaolo Bonzini configuration: config_devices_data)} 2730859aef02SPaolo Bonzini config_target += config_devices 2731a98006bcSPaolo Bonzini config_all_devices += config_devices 27322becc36aSPaolo Bonzini endif 27332becc36aSPaolo Bonzini config_target_mak += {target: config_target} 2734a81df1b6SPaolo Bonziniendforeach 2735fdb75aefSPaolo Bonzinitarget_dirs = actual_target_dirs 2736a81df1b6SPaolo Bonzini 27372becc36aSPaolo Bonzini# This configuration is used to build files that are shared by 27382becc36aSPaolo Bonzini# multiple binaries, and then extracted out of the "common" 27392becc36aSPaolo Bonzini# static_library target. 27402becc36aSPaolo Bonzini# 27412becc36aSPaolo Bonzini# We do not use all_sources()/all_dependencies(), because it would 27422becc36aSPaolo Bonzini# build literally all source files, including devices only used by 27432becc36aSPaolo Bonzini# targets that are not built for this compilation. The CONFIG_ALL 27442becc36aSPaolo Bonzini# pseudo symbol replaces it. 27452becc36aSPaolo Bonzini 274605512f55SPaolo Bonziniconfig_all += config_all_devices 27472becc36aSPaolo Bonziniconfig_all += config_host 27482becc36aSPaolo Bonziniconfig_all += config_all_disas 27492becc36aSPaolo Bonziniconfig_all += { 275014efd8d3SPaolo Bonzini 'CONFIG_XEN': xen.found(), 27512becc36aSPaolo Bonzini 'CONFIG_SOFTMMU': have_system, 27522becc36aSPaolo Bonzini 'CONFIG_USER_ONLY': have_user, 27532becc36aSPaolo Bonzini 'CONFIG_ALL': true, 27542becc36aSPaolo Bonzini} 27552becc36aSPaolo Bonzini 2756eed56e9aSPaolo Bonzinitarget_configs_h = [] 2757eed56e9aSPaolo Bonziniforeach target: target_dirs 2758eed56e9aSPaolo Bonzini target_configs_h += config_target_h[target] 2759eed56e9aSPaolo Bonzini target_configs_h += config_devices_h.get(target, []) 2760eed56e9aSPaolo Bonziniendforeach 2761eed56e9aSPaolo Bonzinigenh += custom_target('config-poison.h', 2762eed56e9aSPaolo Bonzini input: [target_configs_h], 2763eed56e9aSPaolo Bonzini output: 'config-poison.h', 2764eed56e9aSPaolo Bonzini capture: true, 2765eed56e9aSPaolo Bonzini command: [find_program('scripts/make-config-poison.sh'), 2766eed56e9aSPaolo Bonzini target_configs_h]) 2767eed56e9aSPaolo Bonzini 2768a0c9162cSPaolo Bonzini############## 2769a0c9162cSPaolo Bonzini# Submodules # 2770a0c9162cSPaolo Bonzini############## 27718b18cdbfSRichard Henderson 27728b18cdbfSRichard Hendersoncapstone = not_found 277383602083SThomas Huthif not get_option('capstone').auto() or have_system or have_user 277443ecd166SThomas Huth capstone = dependency('capstone', version: '>=3.0.5', 2775063d5119SPaolo Bonzini method: 'pkg-config', 277683602083SThomas Huth required: get_option('capstone')) 27778f4aea71SDaniel P. Berrangé 27788f4aea71SDaniel P. Berrangé # Some versions of capstone have broken pkg-config file 27798f4aea71SDaniel P. Berrangé # that reports a wrong -I path, causing the #include to 27808f4aea71SDaniel P. Berrangé # fail later. If the system has such a broken version 27818f4aea71SDaniel P. Berrangé # do not use it. 27828f4aea71SDaniel P. Berrangé if capstone.found() and not cc.compiles('#include <capstone.h>', 27838f4aea71SDaniel P. Berrangé dependencies: [capstone]) 27848f4aea71SDaniel P. Berrangé capstone = not_found 278583602083SThomas Huth if get_option('capstone').enabled() 278683602083SThomas Huth error('capstone requested, but it does not appear to work') 27878f4aea71SDaniel P. Berrangé endif 27888f4aea71SDaniel P. Berrangé endif 27898b18cdbfSRichard Hendersonendif 27904d34a86bSPaolo Bonzini 279155116968SJagannathan Ramanlibvfio_user_dep = not_found 279255116968SJagannathan Ramanif have_system and vfio_user_server_allowed 279355116968SJagannathan Raman have_internal = fs.exists(meson.current_source_dir() / 'subprojects/libvfio-user/meson.build') 279455116968SJagannathan Raman 279555116968SJagannathan Raman if not have_internal 279655116968SJagannathan Raman error('libvfio-user source not found - please pull git submodule') 279755116968SJagannathan Raman endif 279855116968SJagannathan Raman 279955116968SJagannathan Raman libvfio_user_proj = subproject('libvfio-user') 280055116968SJagannathan Raman 28015328353cSPaolo Bonzini libvfio_user_dep = libvfio_user_proj.get_variable('libvfio_user_dep') 280255116968SJagannathan Ramanendif 280355116968SJagannathan Raman 2804fbb4121dSPaolo Bonzinifdt = not_found 2805fbb4121dSPaolo Bonziniif have_system 2806c593d841SPhilippe Mathieu-Daudé fdt_opt = get_option('fdt') 2807fbb4121dSPaolo Bonzini if fdt_opt in ['enabled', 'auto', 'system'] 2808fbb4121dSPaolo Bonzini have_internal = fs.exists(meson.current_source_dir() / 'dtc/libfdt/Makefile.libfdt') 2809063d5119SPaolo Bonzini fdt = cc.find_library('fdt', 2810fbb4121dSPaolo Bonzini required: fdt_opt == 'system' or 2811fbb4121dSPaolo Bonzini fdt_opt == 'enabled' and not have_internal) 2812fbb4121dSPaolo Bonzini if fdt.found() and cc.links(''' 2813fbb4121dSPaolo Bonzini #include <libfdt.h> 2814fbb4121dSPaolo Bonzini #include <libfdt_env.h> 2815de47b0ffSThomas Huth int main(void) { fdt_find_max_phandle(NULL, NULL); return 0; }''', 2816fbb4121dSPaolo Bonzini dependencies: fdt) 2817fbb4121dSPaolo Bonzini fdt_opt = 'system' 28186c22853cSThomas Huth elif fdt_opt == 'system' 28196c22853cSThomas Huth error('system libfdt requested, but it is too old (1.5.1 or newer required)') 2820fbb4121dSPaolo Bonzini elif have_internal 2821fbb4121dSPaolo Bonzini fdt_opt = 'internal' 2822fbb4121dSPaolo Bonzini else 2823fbb4121dSPaolo Bonzini fdt_opt = 'disabled' 282487daf898SThomas Huth fdt = not_found 2825fbb4121dSPaolo Bonzini endif 2826fbb4121dSPaolo Bonzini endif 2827fbb4121dSPaolo Bonzini if fdt_opt == 'internal' 2828fbb4121dSPaolo Bonzini fdt_files = files( 2829fbb4121dSPaolo Bonzini 'dtc/libfdt/fdt.c', 2830fbb4121dSPaolo Bonzini 'dtc/libfdt/fdt_ro.c', 2831fbb4121dSPaolo Bonzini 'dtc/libfdt/fdt_wip.c', 2832fbb4121dSPaolo Bonzini 'dtc/libfdt/fdt_sw.c', 2833fbb4121dSPaolo Bonzini 'dtc/libfdt/fdt_rw.c', 2834fbb4121dSPaolo Bonzini 'dtc/libfdt/fdt_strerror.c', 2835fbb4121dSPaolo Bonzini 'dtc/libfdt/fdt_empty_tree.c', 2836fbb4121dSPaolo Bonzini 'dtc/libfdt/fdt_addresses.c', 2837fbb4121dSPaolo Bonzini 'dtc/libfdt/fdt_overlay.c', 2838fbb4121dSPaolo Bonzini 'dtc/libfdt/fdt_check.c', 2839fbb4121dSPaolo Bonzini ) 2840fbb4121dSPaolo Bonzini 2841fbb4121dSPaolo Bonzini fdt_inc = include_directories('dtc/libfdt') 2842fbb4121dSPaolo Bonzini libfdt = static_library('fdt', 2843610e7e0eSPhilippe Mathieu-Daudé build_by_default: false, 2844fbb4121dSPaolo Bonzini sources: fdt_files, 2845fbb4121dSPaolo Bonzini include_directories: fdt_inc) 2846fbb4121dSPaolo Bonzini fdt = declare_dependency(link_with: libfdt, 2847fbb4121dSPaolo Bonzini include_directories: fdt_inc) 2848fbb4121dSPaolo Bonzini endif 2849c593d841SPhilippe Mathieu-Daudéelse 2850c593d841SPhilippe Mathieu-Daudé fdt_opt = 'disabled' 2851fbb4121dSPaolo Bonziniendif 2852fbb4121dSPaolo Bonziniif not fdt.found() and fdt_required.length() > 0 2853fbb4121dSPaolo Bonzini error('fdt not available but required by targets ' + ', '.join(fdt_required)) 2854fbb4121dSPaolo Bonziniendif 2855fbb4121dSPaolo Bonzini 28568b18cdbfSRichard Hendersonconfig_host_data.set('CONFIG_CAPSTONE', capstone.found()) 2857fbb4121dSPaolo Bonziniconfig_host_data.set('CONFIG_FDT', fdt.found()) 28584d34a86bSPaolo Bonziniconfig_host_data.set('CONFIG_SLIRP', slirp.found()) 28598b18cdbfSRichard Henderson 2860a0c9162cSPaolo Bonzini##################### 2861a0c9162cSPaolo Bonzini# Generated sources # 2862a0c9162cSPaolo Bonzini##################### 28638b18cdbfSRichard Henderson 2864a0c9162cSPaolo Bonzinigenh += configure_file(output: 'config-host.h', configuration: config_host_data) 2865a81df1b6SPaolo Bonzini 28663f885659SMarc-André Lureauhxtool = find_program('scripts/hxtool') 2867e2c4012bSMarc-André Lureaushaderinclude = find_program('scripts/shaderinclude.py') 2868a81df1b6SPaolo Bonziniqapi_gen = find_program('scripts/qapi-gen.py') 2869654d6b04SPaolo Bonziniqapi_gen_depends = [ meson.current_source_dir() / 'scripts/qapi/__init__.py', 2870654d6b04SPaolo Bonzini meson.current_source_dir() / 'scripts/qapi/commands.py', 2871654d6b04SPaolo Bonzini meson.current_source_dir() / 'scripts/qapi/common.py', 2872654d6b04SPaolo Bonzini meson.current_source_dir() / 'scripts/qapi/error.py', 2873654d6b04SPaolo Bonzini meson.current_source_dir() / 'scripts/qapi/events.py', 2874654d6b04SPaolo Bonzini meson.current_source_dir() / 'scripts/qapi/expr.py', 2875654d6b04SPaolo Bonzini meson.current_source_dir() / 'scripts/qapi/gen.py', 2876654d6b04SPaolo Bonzini meson.current_source_dir() / 'scripts/qapi/introspect.py', 287788d357d2SMarkus Armbruster meson.current_source_dir() / 'scripts/qapi/main.py', 2878654d6b04SPaolo Bonzini meson.current_source_dir() / 'scripts/qapi/parser.py', 2879654d6b04SPaolo Bonzini meson.current_source_dir() / 'scripts/qapi/schema.py', 2880654d6b04SPaolo Bonzini meson.current_source_dir() / 'scripts/qapi/source.py', 2881654d6b04SPaolo Bonzini meson.current_source_dir() / 'scripts/qapi/types.py', 2882654d6b04SPaolo Bonzini meson.current_source_dir() / 'scripts/qapi/visit.py', 2883654d6b04SPaolo Bonzini meson.current_source_dir() / 'scripts/qapi-gen.py' 2884a81df1b6SPaolo Bonzini] 2885a81df1b6SPaolo Bonzini 2886a81df1b6SPaolo Bonzinitracetool = [ 2887a81df1b6SPaolo Bonzini python, files('scripts/tracetool.py'), 28889c29b741SPaolo Bonzini '--backend=' + ','.join(get_option('trace_backends')) 2889a81df1b6SPaolo Bonzini] 28900572d6cdSStefan Hajnoczitracetool_depends = files( 28910572d6cdSStefan Hajnoczi 'scripts/tracetool/backend/log.py', 28920572d6cdSStefan Hajnoczi 'scripts/tracetool/backend/__init__.py', 28930572d6cdSStefan Hajnoczi 'scripts/tracetool/backend/dtrace.py', 28940572d6cdSStefan Hajnoczi 'scripts/tracetool/backend/ftrace.py', 28950572d6cdSStefan Hajnoczi 'scripts/tracetool/backend/simple.py', 28960572d6cdSStefan Hajnoczi 'scripts/tracetool/backend/syslog.py', 28970572d6cdSStefan Hajnoczi 'scripts/tracetool/backend/ust.py', 28980572d6cdSStefan Hajnoczi 'scripts/tracetool/format/ust_events_c.py', 28990572d6cdSStefan Hajnoczi 'scripts/tracetool/format/ust_events_h.py', 29000572d6cdSStefan Hajnoczi 'scripts/tracetool/format/__init__.py', 29010572d6cdSStefan Hajnoczi 'scripts/tracetool/format/d.py', 29020572d6cdSStefan Hajnoczi 'scripts/tracetool/format/simpletrace_stap.py', 29030572d6cdSStefan Hajnoczi 'scripts/tracetool/format/c.py', 29040572d6cdSStefan Hajnoczi 'scripts/tracetool/format/h.py', 29050572d6cdSStefan Hajnoczi 'scripts/tracetool/format/log_stap.py', 29060572d6cdSStefan Hajnoczi 'scripts/tracetool/format/stap.py', 29070572d6cdSStefan Hajnoczi 'scripts/tracetool/__init__.py', 29080572d6cdSStefan Hajnoczi 'scripts/tracetool/vcpu.py' 29090572d6cdSStefan Hajnoczi) 2910a81df1b6SPaolo Bonzini 29112c273f32SMarc-André Lureauqemu_version_cmd = [find_program('scripts/qemu-version.sh'), 29122c273f32SMarc-André Lureau meson.current_source_dir(), 2913b0b4323eSPaolo Bonzini get_option('pkgversion'), meson.project_version()] 29142c273f32SMarc-André Lureauqemu_version = custom_target('qemu-version.h', 29152c273f32SMarc-André Lureau output: 'qemu-version.h', 29162c273f32SMarc-André Lureau command: qemu_version_cmd, 29172c273f32SMarc-André Lureau capture: true, 29182c273f32SMarc-André Lureau build_by_default: true, 29192c273f32SMarc-André Lureau build_always_stale: true) 29202c273f32SMarc-André Lureaugenh += qemu_version 29212c273f32SMarc-André Lureau 29223f885659SMarc-André Lureauhxdep = [] 29233f885659SMarc-André Lureauhx_headers = [ 29243f885659SMarc-André Lureau ['qemu-options.hx', 'qemu-options.def'], 29253f885659SMarc-André Lureau ['qemu-img-cmds.hx', 'qemu-img-cmds.h'], 29263f885659SMarc-André Lureau] 29273f885659SMarc-André Lureauif have_system 29283f885659SMarc-André Lureau hx_headers += [ 29293f885659SMarc-André Lureau ['hmp-commands.hx', 'hmp-commands.h'], 29303f885659SMarc-André Lureau ['hmp-commands-info.hx', 'hmp-commands-info.h'], 29313f885659SMarc-André Lureau ] 29323f885659SMarc-André Lureauendif 29333f885659SMarc-André Lureauforeach d : hx_headers 2934b7c70bf2SMarc-André Lureau hxdep += custom_target(d[1], 29353f885659SMarc-André Lureau input: files(d[0]), 29363f885659SMarc-André Lureau output: d[1], 29373f885659SMarc-André Lureau capture: true, 29383f885659SMarc-André Lureau build_by_default: true, # to be removed when added to a target 29393f885659SMarc-André Lureau command: [hxtool, '-h', '@INPUT0@']) 29403f885659SMarc-André Lureauendforeach 29413f885659SMarc-André Lureaugenh += hxdep 29423f885659SMarc-André Lureau 2943a0c9162cSPaolo Bonzini################### 2944a0c9162cSPaolo Bonzini# Collect sources # 2945a0c9162cSPaolo Bonzini################### 2946a81df1b6SPaolo Bonzini 294755567891SPhilippe Mathieu-Daudéauthz_ss = ss.source_set() 29487e2b888fSPhilippe Mathieu-Daudéblockdev_ss = ss.source_set() 29497e2b888fSPhilippe Mathieu-Daudéblock_ss = ss.source_set() 2950c2306d71SPhilippe Mathieu-Daudéchardev_ss = ss.source_set() 29517e2b888fSPhilippe Mathieu-Daudécommon_ss = ss.source_set() 29522389304aSPhilippe Mathieu-Daudécrypto_ss = ss.source_set() 2953f73fb063SPhilippe Mathieu-Daudéhwcore_ss = ss.source_set() 2954f78536b1SPhilippe Mathieu-Daudéio_ss = ss.source_set() 29557e2b888fSPhilippe Mathieu-Daudéqmp_ss = ss.source_set() 2956da33fc09SPhilippe Mathieu-Daudéqom_ss = ss.source_set() 29577e2b888fSPhilippe Mathieu-Daudésoftmmu_ss = ss.source_set() 29587e2b888fSPhilippe Mathieu-Daudéspecific_fuzz_ss = ss.source_set() 29597e2b888fSPhilippe Mathieu-Daudéspecific_ss = ss.source_set() 2960a81df1b6SPaolo Bonzinistub_ss = ss.source_set() 2961a81df1b6SPaolo Bonzinitrace_ss = ss.source_set() 29622becc36aSPaolo Bonziniuser_ss = ss.source_set() 29637e2b888fSPhilippe Mathieu-Daudéutil_ss = ss.source_set() 29642becc36aSPaolo Bonzini 2965c94a7b88SGerd Hoffmann# accel modules 2966c94a7b88SGerd Hoffmannqtest_module_ss = ss.source_set() 2967dae0ec15SGerd Hoffmanntcg_module_ss = ss.source_set() 2968c94a7b88SGerd Hoffmann 29693154fee4SMarc-André Lureaumodules = {} 2970db2e89dfSGerd Hoffmanntarget_modules = {} 29712becc36aSPaolo Bonzinihw_arch = {} 29722becc36aSPaolo Bonzinitarget_arch = {} 29732becc36aSPaolo Bonzinitarget_softmmu_arch = {} 297446369b50SPhilippe Mathieu-Daudétarget_user_arch = {} 2975a81df1b6SPaolo Bonzini 2976a81df1b6SPaolo Bonzini############### 2977a81df1b6SPaolo Bonzini# Trace files # 2978a81df1b6SPaolo Bonzini############### 2979a81df1b6SPaolo Bonzini 2980c9322ab5SMarc-André Lureau# TODO: add each directory to the subdirs from its own meson.build, once 2981c9322ab5SMarc-André Lureau# we have those 2982a81df1b6SPaolo Bonzinitrace_events_subdirs = [ 2983a81df1b6SPaolo Bonzini 'crypto', 298469ff4d0aSPhilippe Mathieu-Daudé 'qapi', 298569ff4d0aSPhilippe Mathieu-Daudé 'qom', 2986a81df1b6SPaolo Bonzini 'monitor', 298769ff4d0aSPhilippe Mathieu-Daudé 'util', 2988842b42dfSAlex Bennée 'gdbstub', 2989a81df1b6SPaolo Bonzini] 29906ddc1abeSWarner Loshif have_linux_user 2991a81df1b6SPaolo Bonzini trace_events_subdirs += [ 'linux-user' ] 2992a81df1b6SPaolo Bonziniendif 29936ddc1abeSWarner Loshif have_bsd_user 29946ddc1abeSWarner Losh trace_events_subdirs += [ 'bsd-user' ] 29956ddc1abeSWarner Loshendif 2996a81df1b6SPaolo Bonziniif have_block 2997a81df1b6SPaolo Bonzini trace_events_subdirs += [ 2998a81df1b6SPaolo Bonzini 'authz', 2999a81df1b6SPaolo Bonzini 'block', 3000a81df1b6SPaolo Bonzini 'io', 3001a81df1b6SPaolo Bonzini 'nbd', 3002a81df1b6SPaolo Bonzini 'scsi', 3003a81df1b6SPaolo Bonzini ] 3004a81df1b6SPaolo Bonziniendif 3005a81df1b6SPaolo Bonziniif have_system 3006a81df1b6SPaolo Bonzini trace_events_subdirs += [ 30078985db26SPhilippe Mathieu-Daudé 'accel/kvm', 3008a81df1b6SPaolo Bonzini 'audio', 3009a81df1b6SPaolo Bonzini 'backends', 3010a81df1b6SPaolo Bonzini 'backends/tpm', 3011a81df1b6SPaolo Bonzini 'chardev', 301246627f41SAndrew Melnychenko 'ebpf', 3013a81df1b6SPaolo Bonzini 'hw/9pfs', 3014a81df1b6SPaolo Bonzini 'hw/acpi', 301577c05b0bSHao Wu 'hw/adc', 3016a81df1b6SPaolo Bonzini 'hw/alpha', 3017a81df1b6SPaolo Bonzini 'hw/arm', 3018a81df1b6SPaolo Bonzini 'hw/audio', 3019a81df1b6SPaolo Bonzini 'hw/block', 3020a81df1b6SPaolo Bonzini 'hw/block/dataplane', 3021a81df1b6SPaolo Bonzini 'hw/char', 3022a81df1b6SPaolo Bonzini 'hw/display', 3023a81df1b6SPaolo Bonzini 'hw/dma', 3024a81df1b6SPaolo Bonzini 'hw/hyperv', 3025a81df1b6SPaolo Bonzini 'hw/i2c', 3026a81df1b6SPaolo Bonzini 'hw/i386', 3027a81df1b6SPaolo Bonzini 'hw/i386/xen', 3028aa98ee38SDavid Woodhouse 'hw/i386/kvm', 3029a81df1b6SPaolo Bonzini 'hw/ide', 3030a81df1b6SPaolo Bonzini 'hw/input', 3031a81df1b6SPaolo Bonzini 'hw/intc', 3032a81df1b6SPaolo Bonzini 'hw/isa', 3033a81df1b6SPaolo Bonzini 'hw/mem', 3034a81df1b6SPaolo Bonzini 'hw/mips', 3035a81df1b6SPaolo Bonzini 'hw/misc', 3036a81df1b6SPaolo Bonzini 'hw/misc/macio', 3037a81df1b6SPaolo Bonzini 'hw/net', 303898e5d7a2SVikram Garhwal 'hw/net/can', 3039ce0e6a2cSMark Cave-Ayland 'hw/nubus', 304088eea45cSKlaus Jensen 'hw/nvme', 3041a81df1b6SPaolo Bonzini 'hw/nvram', 3042a81df1b6SPaolo Bonzini 'hw/pci', 3043a81df1b6SPaolo Bonzini 'hw/pci-host', 3044a81df1b6SPaolo Bonzini 'hw/ppc', 3045a81df1b6SPaolo Bonzini 'hw/rdma', 3046a81df1b6SPaolo Bonzini 'hw/rdma/vmw', 3047a81df1b6SPaolo Bonzini 'hw/rtc', 3048a81df1b6SPaolo Bonzini 'hw/s390x', 3049a81df1b6SPaolo Bonzini 'hw/scsi', 3050a81df1b6SPaolo Bonzini 'hw/sd', 3051ad52cfc1SBALATON Zoltan 'hw/sh4', 3052a81df1b6SPaolo Bonzini 'hw/sparc', 3053a81df1b6SPaolo Bonzini 'hw/sparc64', 3054a81df1b6SPaolo Bonzini 'hw/ssi', 3055a81df1b6SPaolo Bonzini 'hw/timer', 3056a81df1b6SPaolo Bonzini 'hw/tpm', 3057a81df1b6SPaolo Bonzini 'hw/usb', 3058a81df1b6SPaolo Bonzini 'hw/vfio', 3059a81df1b6SPaolo Bonzini 'hw/virtio', 3060a81df1b6SPaolo Bonzini 'hw/watchdog', 3061a81df1b6SPaolo Bonzini 'hw/xen', 3062a81df1b6SPaolo Bonzini 'hw/gpio', 3063a81df1b6SPaolo Bonzini 'migration', 3064a81df1b6SPaolo Bonzini 'net', 30658b7a5507SPhilippe Mathieu-Daudé 'softmmu', 3066a81df1b6SPaolo Bonzini 'ui', 3067ad22c308SElena Ufimtseva 'hw/remote', 3068a81df1b6SPaolo Bonzini ] 3069a81df1b6SPaolo Bonziniendif 30708985db26SPhilippe Mathieu-Daudéif have_system or have_user 30718985db26SPhilippe Mathieu-Daudé trace_events_subdirs += [ 30728985db26SPhilippe Mathieu-Daudé 'accel/tcg', 30738985db26SPhilippe Mathieu-Daudé 'hw/core', 30748985db26SPhilippe Mathieu-Daudé 'target/arm', 3075a1477da3SAlexander Graf 'target/arm/hvf', 30768985db26SPhilippe Mathieu-Daudé 'target/hppa', 30778985db26SPhilippe Mathieu-Daudé 'target/i386', 30788985db26SPhilippe Mathieu-Daudé 'target/i386/kvm', 307934b8ff25SPhilippe Mathieu-Daudé 'target/mips/tcg', 30806f83e277SRichard Henderson 'target/nios2', 30818985db26SPhilippe Mathieu-Daudé 'target/ppc', 30828985db26SPhilippe Mathieu-Daudé 'target/riscv', 30838985db26SPhilippe Mathieu-Daudé 'target/s390x', 308467043607SCho, Yu-Chen 'target/s390x/kvm', 30858985db26SPhilippe Mathieu-Daudé 'target/sparc', 30868985db26SPhilippe Mathieu-Daudé ] 30878985db26SPhilippe Mathieu-Daudéendif 3088a81df1b6SPaolo Bonzini 30890df750e9SMarc-André Lureauvhost_user = not_found 30902a3129a3SPaolo Bonziniif targetos == 'linux' and have_vhost_user 30910df750e9SMarc-André Lureau libvhost_user = subproject('libvhost-user') 30920df750e9SMarc-André Lureau vhost_user = libvhost_user.get_variable('vhost_user_dep') 30930df750e9SMarc-André Lureauendif 30940df750e9SMarc-André Lureau 3095a6caeee8SXie Yongjilibvduse = not_found 3096a6caeee8SXie Yongjiif have_libvduse 3097a6caeee8SXie Yongji libvduse_proj = subproject('libvduse') 3098a6caeee8SXie Yongji libvduse = libvduse_proj.get_variable('libvduse_dep') 3099a6caeee8SXie Yongjiendif 3100a6caeee8SXie Yongji 3101b83a80e8SVladimir Sementsov-Ogievskiy# NOTE: the trace/ subdirectory needs the qapi_trace_events variable 3102b83a80e8SVladimir Sementsov-Ogievskiy# that is filled in by qapi/. 3103a81df1b6SPaolo Bonzinisubdir('qapi') 3104a81df1b6SPaolo Bonzinisubdir('qobject') 3105a81df1b6SPaolo Bonzinisubdir('stubs') 3106a81df1b6SPaolo Bonzinisubdir('trace') 3107a81df1b6SPaolo Bonzinisubdir('util') 31085582c58fSMarc-André Lureausubdir('qom') 31095582c58fSMarc-André Lureausubdir('authz') 3110a81df1b6SPaolo Bonzinisubdir('crypto') 31112d78b56eSMarc-André Lureausubdir('ui') 31127d5983e3SNicolas Saenz Juliennesubdir('hw') 3113842b42dfSAlex Bennéesubdir('gdbstub') 3114a81df1b6SPaolo Bonzini 31153154fee4SMarc-André Lureauif enable_modules 31163154fee4SMarc-André Lureau libmodulecommon = static_library('module-common', files('module-common.c') + genh, pic: true, c_args: '-DBUILD_DSO') 31173154fee4SMarc-André Lureau modulecommon = declare_dependency(link_whole: libmodulecommon, compile_args: '-DBUILD_DSO') 31183154fee4SMarc-André Lureauendif 31193154fee4SMarc-André Lureau 31207d5983e3SNicolas Saenz Julienneqom_ss = qom_ss.apply(config_host, strict: false) 31217d5983e3SNicolas Saenz Juliennelibqom = static_library('qom', qom_ss.sources() + genh, 31227d5983e3SNicolas Saenz Julienne dependencies: [qom_ss.dependencies()], 31237d5983e3SNicolas Saenz Julienne name_suffix: 'fa') 31247d5983e3SNicolas Saenz Julienneqom = declare_dependency(link_whole: libqom) 31257d5983e3SNicolas Saenz Julienne 31267d5983e3SNicolas Saenz Julienneevent_loop_base = files('event-loop-base.c') 31277d5983e3SNicolas Saenz Julienneevent_loop_base = static_library('event-loop-base', sources: event_loop_base + genh, 31287d5983e3SNicolas Saenz Julienne build_by_default: true) 31297d5983e3SNicolas Saenz Julienneevent_loop_base = declare_dependency(link_whole: event_loop_base, 31307d5983e3SNicolas Saenz Julienne dependencies: [qom]) 31317d5983e3SNicolas Saenz Julienne 31322becc36aSPaolo Bonzinistub_ss = stub_ss.apply(config_all, strict: false) 3133a81df1b6SPaolo Bonzini 3134a81df1b6SPaolo Bonziniutil_ss.add_all(trace_ss) 31352becc36aSPaolo Bonziniutil_ss = util_ss.apply(config_all, strict: false) 3136a81df1b6SPaolo Bonzinilibqemuutil = static_library('qemuutil', 3137a81df1b6SPaolo Bonzini sources: util_ss.sources() + stub_ss.sources() + genh, 31386d7c7c2dSPaolo Bonzini dependencies: [util_ss.dependencies(), libm, threads, glib, socket, malloc, pixman]) 3139a81df1b6SPaolo Bonziniqemuutil = declare_dependency(link_with: libqemuutil, 314070ac26b9SNicolas Saenz Julienne sources: genh + version_res, 314170ac26b9SNicolas Saenz Julienne dependencies: [event_loop_base]) 3142a81df1b6SPaolo Bonzini 3143957b31f6SPhilippe Mathieu-Daudéif have_system or have_user 3144abff1abfSPaolo Bonzini decodetree = generator(find_program('scripts/decodetree.py'), 3145abff1abfSPaolo Bonzini output: 'decode-@BASENAME@.c.inc', 3146abff1abfSPaolo Bonzini arguments: ['@INPUT@', '@EXTRA_ARGS@', '-o', '@OUTPUT@']) 3147957b31f6SPhilippe Mathieu-Daudé subdir('libdecnumber') 3148957b31f6SPhilippe Mathieu-Daudé subdir('target') 3149957b31f6SPhilippe Mathieu-Daudéendif 3150abff1abfSPaolo Bonzini 3151478e943fSPaolo Bonzinisubdir('audio') 31527fcfd456SMarc-André Lureausubdir('io') 3153848e8ff6SMarc-André Lureausubdir('chardev') 3154ec0d5893SMarc-André Lureausubdir('fsdev') 3155708eab42SMarc-André Lureausubdir('dump') 3156ec0d5893SMarc-André Lureau 3157f285bd3fSPhilippe Mathieu-Daudéif have_block 31585e5733e5SMarc-André Lureau block_ss.add(files( 31595e5733e5SMarc-André Lureau 'block.c', 31605e5733e5SMarc-André Lureau 'blockjob.c', 31615e5733e5SMarc-André Lureau 'job.c', 31625e5733e5SMarc-André Lureau 'qemu-io-cmds.c', 31635e5733e5SMarc-André Lureau )) 3164406523f6SPaolo Bonzini if config_host_data.get('CONFIG_REPLICATION') 3165406523f6SPaolo Bonzini block_ss.add(files('replication.c')) 3166406523f6SPaolo Bonzini endif 31675e5733e5SMarc-André Lureau 31685e5733e5SMarc-André Lureau subdir('nbd') 31695e5733e5SMarc-André Lureau subdir('scsi') 31705e5733e5SMarc-André Lureau subdir('block') 31715e5733e5SMarc-André Lureau 31724a96337dSPaolo Bonzini blockdev_ss.add(files( 31734a96337dSPaolo Bonzini 'blockdev.c', 3174cbc20bfbSStefan Hajnoczi 'blockdev-nbd.c', 31754a96337dSPaolo Bonzini 'iothread.c', 31764a96337dSPaolo Bonzini 'job-qmp.c', 31773eacf70bSRoman Bolshakov ), gnutls) 31784a96337dSPaolo Bonzini 31794a96337dSPaolo Bonzini # os-posix.c contains POSIX-specific functions used by qemu-storage-daemon, 31804a96337dSPaolo Bonzini # os-win32.c does not 31814a96337dSPaolo Bonzini blockdev_ss.add(when: 'CONFIG_POSIX', if_true: files('os-posix.c')) 31824a96337dSPaolo Bonzini softmmu_ss.add(when: 'CONFIG_WIN32', if_true: [files('os-win32.c')]) 3183f285bd3fSPhilippe Mathieu-Daudéendif 31844a96337dSPaolo Bonzini 31854a96337dSPaolo Bonzinicommon_ss.add(files('cpus-common.c')) 318631ffa2aaSPhilippe Mathieu-Daudéspecific_ss.add(files('cpu.c')) 31874a96337dSPaolo Bonzini 31885d3ea0e1SPaolo Bonzinisubdir('softmmu') 3189c9322ab5SMarc-André Lureau 319044b99a6dSRichard Henderson# Work around a gcc bug/misfeature wherein constant propagation looks 319144b99a6dSRichard Henderson# through an alias: 319244b99a6dSRichard Henderson# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99696 319344b99a6dSRichard Henderson# to guess that a const variable is always zero. Without lto, this is 319444b99a6dSRichard Henderson# impossible, as the alias is restricted to page-vary-common.c. Indeed, 319544b99a6dSRichard Henderson# without lto, not even the alias is required -- we simply use different 319644b99a6dSRichard Henderson# declarations in different compilation units. 319744b99a6dSRichard Hendersonpagevary = files('page-vary-common.c') 319844b99a6dSRichard Hendersonif get_option('b_lto') 319944b99a6dSRichard Henderson pagevary_flags = ['-fno-lto'] 320044b99a6dSRichard Henderson if get_option('cfi') 320144b99a6dSRichard Henderson pagevary_flags += '-fno-sanitize=cfi-icall' 320244b99a6dSRichard Henderson endif 320354c9b194SThomas Huth pagevary = static_library('page-vary-common', sources: pagevary + genh, 320444b99a6dSRichard Henderson c_args: pagevary_flags) 320544b99a6dSRichard Henderson pagevary = declare_dependency(link_with: pagevary) 320644b99a6dSRichard Hendersonendif 320744b99a6dSRichard Hendersoncommon_ss.add(pagevary) 32086670d4d0SRichard Hendersonspecific_ss.add(files('page-vary.c')) 32096670d4d0SRichard Henderson 3210ab318051SMarc-André Lureausubdir('backends') 3211c574e161SMarc-André Lureausubdir('disas') 321255166230SMarc-André Lureausubdir('migration') 3213ff219dcaSPaolo Bonzinisubdir('monitor') 3214cdaf0722SMarc-André Lureausubdir('net') 321517ef2af6SMarc-André Lureausubdir('replay') 32168df9f0c3SPhilippe Mathieu-Daudésubdir('semihosting') 3217aa09b3d5SMarkus Armbrustersubdir('stats') 3218104cc2c0SRichard Hendersonsubdir('tcg') 3219c6347541SRichard Hendersonsubdir('fpu') 32201a82878aSMarc-André Lureausubdir('accel') 3221f556b4a1SPaolo Bonzinisubdir('plugins') 3222bbf15aafSRichard Hendersonsubdir('ebpf') 3223bbf15aafSRichard Henderson 3224bbf15aafSRichard Hendersoncommon_user_inc = [] 3225bbf15aafSRichard Henderson 3226bbf15aafSRichard Hendersonsubdir('common-user') 3227b309c321SMarc-André Lureausubdir('bsd-user') 32283a30446aSMarc-André Lureausubdir('linux-user') 322946627f41SAndrew Melnychenko 3230a2ce7dbdSPaolo Bonzini# needed for fuzzing binaries 3231a2ce7dbdSPaolo Bonzinisubdir('tests/qtest/libqos') 323264ed6f92SPaolo Bonzinisubdir('tests/qtest/fuzz') 3233a2ce7dbdSPaolo Bonzini 3234c94a7b88SGerd Hoffmann# accel modules 3235dae0ec15SGerd Hoffmanntcg_real_module_ss = ss.source_set() 3236dae0ec15SGerd Hoffmanntcg_real_module_ss.add_all(when: 'CONFIG_TCG_MODULAR', if_true: tcg_module_ss) 3237dae0ec15SGerd Hoffmannspecific_ss.add_all(when: 'CONFIG_TCG_BUILTIN', if_true: tcg_module_ss) 3238dae0ec15SGerd Hoffmanntarget_modules += { 'accel' : { 'qtest': qtest_module_ss, 3239dae0ec15SGerd Hoffmann 'tcg': tcg_real_module_ss }} 3240c94a7b88SGerd Hoffmann 3241a0c9162cSPaolo Bonzini######################## 3242a0c9162cSPaolo Bonzini# Library dependencies # 3243a0c9162cSPaolo Bonzini######################## 3244a0c9162cSPaolo Bonzini 3245f5723ab6SGerd Hoffmannmodinfo_collect = find_program('scripts/modinfo-collect.py') 32465ebbfeccSGerd Hoffmannmodinfo_generate = find_program('scripts/modinfo-generate.py') 3247f5723ab6SGerd Hoffmannmodinfo_files = [] 3248f5723ab6SGerd Hoffmann 32493154fee4SMarc-André Lureaublock_mods = [] 32503154fee4SMarc-André Lureausoftmmu_mods = [] 32513154fee4SMarc-André Lureauforeach d, list : modules 3252ef709860SPaolo Bonzini if not (d == 'block' ? have_block : have_system) 3253ef709860SPaolo Bonzini continue 3254ef709860SPaolo Bonzini endif 3255ef709860SPaolo Bonzini 32563154fee4SMarc-André Lureau foreach m, module_ss : list 32573154fee4SMarc-André Lureau if enable_modules and targetos != 'windows' 32583e292c51SGerd Hoffmann module_ss = module_ss.apply(config_all, strict: false) 32593154fee4SMarc-André Lureau sl = static_library(d + '-' + m, [genh, module_ss.sources()], 32603154fee4SMarc-André Lureau dependencies: [modulecommon, module_ss.dependencies()], pic: true) 32613154fee4SMarc-André Lureau if d == 'block' 32623154fee4SMarc-André Lureau block_mods += sl 32633154fee4SMarc-André Lureau else 32643154fee4SMarc-André Lureau softmmu_mods += sl 32653154fee4SMarc-André Lureau endif 3266f5723ab6SGerd Hoffmann if module_ss.sources() != [] 3267f5723ab6SGerd Hoffmann # FIXME: Should use sl.extract_all_objects(recursive: true) as 3268f5723ab6SGerd Hoffmann # input. Sources can be used multiple times but objects are 3269f5723ab6SGerd Hoffmann # unique when it comes to lookup in compile_commands.json. 3270f5723ab6SGerd Hoffmann # Depnds on a mesion version with 3271f5723ab6SGerd Hoffmann # https://github.com/mesonbuild/meson/pull/8900 3272f5723ab6SGerd Hoffmann modinfo_files += custom_target(d + '-' + m + '.modinfo', 3273f5723ab6SGerd Hoffmann output: d + '-' + m + '.modinfo', 3274ac347111SPaolo Bonzini input: module_ss.sources() + genh, 3275f5723ab6SGerd Hoffmann capture: true, 3276ac347111SPaolo Bonzini command: [modinfo_collect, module_ss.sources()]) 3277f5723ab6SGerd Hoffmann endif 32783154fee4SMarc-André Lureau else 32793154fee4SMarc-André Lureau if d == 'block' 32803154fee4SMarc-André Lureau block_ss.add_all(module_ss) 32813154fee4SMarc-André Lureau else 32823154fee4SMarc-André Lureau softmmu_ss.add_all(module_ss) 32833154fee4SMarc-André Lureau endif 32843154fee4SMarc-André Lureau endif 32853154fee4SMarc-André Lureau endforeach 32863154fee4SMarc-André Lureauendforeach 32873154fee4SMarc-André Lureau 3288db2e89dfSGerd Hoffmannforeach d, list : target_modules 3289db2e89dfSGerd Hoffmann foreach m, module_ss : list 3290db2e89dfSGerd Hoffmann if enable_modules and targetos != 'windows' 3291db2e89dfSGerd Hoffmann foreach target : target_dirs 3292db2e89dfSGerd Hoffmann if target.endswith('-softmmu') 3293db2e89dfSGerd Hoffmann config_target = config_target_mak[target] 3294db2e89dfSGerd Hoffmann config_target += config_host 3295db2e89dfSGerd Hoffmann target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])] 3296db2e89dfSGerd Hoffmann c_args = ['-DNEED_CPU_H', 3297db2e89dfSGerd Hoffmann '-DCONFIG_TARGET="@0@-config-target.h"'.format(target), 3298db2e89dfSGerd Hoffmann '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)] 3299db2e89dfSGerd Hoffmann target_module_ss = module_ss.apply(config_target, strict: false) 3300db2e89dfSGerd Hoffmann if target_module_ss.sources() != [] 3301db2e89dfSGerd Hoffmann module_name = d + '-' + m + '-' + config_target['TARGET_NAME'] 3302db2e89dfSGerd Hoffmann sl = static_library(module_name, 3303db2e89dfSGerd Hoffmann [genh, target_module_ss.sources()], 3304db2e89dfSGerd Hoffmann dependencies: [modulecommon, target_module_ss.dependencies()], 3305db2e89dfSGerd Hoffmann include_directories: target_inc, 3306db2e89dfSGerd Hoffmann c_args: c_args, 3307db2e89dfSGerd Hoffmann pic: true) 3308db2e89dfSGerd Hoffmann softmmu_mods += sl 3309db2e89dfSGerd Hoffmann # FIXME: Should use sl.extract_all_objects(recursive: true) too. 3310db2e89dfSGerd Hoffmann modinfo_files += custom_target(module_name + '.modinfo', 3311db2e89dfSGerd Hoffmann output: module_name + '.modinfo', 3312917ddc27SGerd Hoffmann input: target_module_ss.sources() + genh, 3313db2e89dfSGerd Hoffmann capture: true, 3314917ddc27SGerd Hoffmann command: [modinfo_collect, '--target', target, target_module_ss.sources()]) 3315db2e89dfSGerd Hoffmann endif 3316db2e89dfSGerd Hoffmann endif 3317db2e89dfSGerd Hoffmann endforeach 3318db2e89dfSGerd Hoffmann else 3319db2e89dfSGerd Hoffmann specific_ss.add_all(module_ss) 3320db2e89dfSGerd Hoffmann endif 3321db2e89dfSGerd Hoffmann endforeach 3322db2e89dfSGerd Hoffmannendforeach 3323db2e89dfSGerd Hoffmann 33245ebbfeccSGerd Hoffmannif enable_modules 332505d6814cSJose R. Ziviani foreach target : target_dirs 332605d6814cSJose R. Ziviani if target.endswith('-softmmu') 332705d6814cSJose R. Ziviani config_target = config_target_mak[target] 332805d6814cSJose R. Ziviani config_devices_mak = target + '-config-devices.mak' 332905d6814cSJose R. Ziviani modinfo_src = custom_target('modinfo-' + target + '.c', 333005d6814cSJose R. Ziviani output: 'modinfo-' + target + '.c', 33315ebbfeccSGerd Hoffmann input: modinfo_files, 333205d6814cSJose R. Ziviani command: [modinfo_generate, '--devices', config_devices_mak, '@INPUT@'], 33335ebbfeccSGerd Hoffmann capture: true) 333405d6814cSJose R. Ziviani 333505d6814cSJose R. Ziviani modinfo_lib = static_library('modinfo-' + target + '.c', modinfo_src) 333605d6814cSJose R. Ziviani modinfo_dep = declare_dependency(link_with: modinfo_lib) 333705d6814cSJose R. Ziviani 333805d6814cSJose R. Ziviani arch = config_target['TARGET_NAME'] == 'sparc64' ? 'sparc64' : config_target['TARGET_BASE_ARCH'] 333905d6814cSJose R. Ziviani hw_arch[arch].add(modinfo_dep) 334005d6814cSJose R. Ziviani endif 334105d6814cSJose R. Ziviani endforeach 33425ebbfeccSGerd Hoffmannendif 33435ebbfeccSGerd Hoffmann 33443154fee4SMarc-André Lureaunm = find_program('nm') 3345604f3e4eSYonggang Luoundefsym = find_program('scripts/undefsym.py') 33463154fee4SMarc-André Lureaublock_syms = custom_target('block.syms', output: 'block.syms', 33473154fee4SMarc-André Lureau input: [libqemuutil, block_mods], 33483154fee4SMarc-André Lureau capture: true, 33493154fee4SMarc-André Lureau command: [undefsym, nm, '@INPUT@']) 33503154fee4SMarc-André Lureauqemu_syms = custom_target('qemu.syms', output: 'qemu.syms', 33513154fee4SMarc-André Lureau input: [libqemuutil, softmmu_mods], 33523154fee4SMarc-André Lureau capture: true, 33533154fee4SMarc-André Lureau command: [undefsym, nm, '@INPUT@']) 33543154fee4SMarc-André Lureau 335555567891SPhilippe Mathieu-Daudéauthz_ss = authz_ss.apply(config_host, strict: false) 335655567891SPhilippe Mathieu-Daudélibauthz = static_library('authz', authz_ss.sources() + genh, 335755567891SPhilippe Mathieu-Daudé dependencies: [authz_ss.dependencies()], 335855567891SPhilippe Mathieu-Daudé name_suffix: 'fa', 335955567891SPhilippe Mathieu-Daudé build_by_default: false) 336055567891SPhilippe Mathieu-Daudé 336155567891SPhilippe Mathieu-Daudéauthz = declare_dependency(link_whole: libauthz, 336255567891SPhilippe Mathieu-Daudé dependencies: qom) 336355567891SPhilippe Mathieu-Daudé 33642389304aSPhilippe Mathieu-Daudécrypto_ss = crypto_ss.apply(config_host, strict: false) 33652389304aSPhilippe Mathieu-Daudélibcrypto = static_library('crypto', crypto_ss.sources() + genh, 33662389304aSPhilippe Mathieu-Daudé dependencies: [crypto_ss.dependencies()], 33672389304aSPhilippe Mathieu-Daudé name_suffix: 'fa', 33682389304aSPhilippe Mathieu-Daudé build_by_default: false) 33692389304aSPhilippe Mathieu-Daudé 33702389304aSPhilippe Mathieu-Daudécrypto = declare_dependency(link_whole: libcrypto, 33712389304aSPhilippe Mathieu-Daudé dependencies: [authz, qom]) 33722389304aSPhilippe Mathieu-Daudé 3373f78536b1SPhilippe Mathieu-Daudéio_ss = io_ss.apply(config_host, strict: false) 3374f78536b1SPhilippe Mathieu-Daudélibio = static_library('io', io_ss.sources() + genh, 3375f78536b1SPhilippe Mathieu-Daudé dependencies: [io_ss.dependencies()], 3376f78536b1SPhilippe Mathieu-Daudé link_with: libqemuutil, 3377f78536b1SPhilippe Mathieu-Daudé name_suffix: 'fa', 3378f78536b1SPhilippe Mathieu-Daudé build_by_default: false) 3379f78536b1SPhilippe Mathieu-Daudé 3380f78536b1SPhilippe Mathieu-Daudéio = declare_dependency(link_whole: libio, dependencies: [crypto, qom]) 3381f78536b1SPhilippe Mathieu-Daudé 33827e6edef3SPhilippe Mathieu-Daudélibmigration = static_library('migration', sources: migration_files + genh, 33837e6edef3SPhilippe Mathieu-Daudé name_suffix: 'fa', 33847e6edef3SPhilippe Mathieu-Daudé build_by_default: false) 33857e6edef3SPhilippe Mathieu-Daudémigration = declare_dependency(link_with: libmigration, 33867e6edef3SPhilippe Mathieu-Daudé dependencies: [zlib, qom, io]) 33877e6edef3SPhilippe Mathieu-Daudésoftmmu_ss.add(migration) 33887e6edef3SPhilippe Mathieu-Daudé 33895e5733e5SMarc-André Lureaublock_ss = block_ss.apply(config_host, strict: false) 33905e5733e5SMarc-André Lureaulibblock = static_library('block', block_ss.sources() + genh, 33915e5733e5SMarc-André Lureau dependencies: block_ss.dependencies(), 33925e5733e5SMarc-André Lureau link_depends: block_syms, 33935e5733e5SMarc-André Lureau name_suffix: 'fa', 33945e5733e5SMarc-André Lureau build_by_default: false) 33955e5733e5SMarc-André Lureau 33965e5733e5SMarc-André Lureaublock = declare_dependency(link_whole: [libblock], 3397b7c70bf2SMarc-André Lureau link_args: '@block.syms', 3398b7c70bf2SMarc-André Lureau dependencies: [crypto, io]) 33995e5733e5SMarc-André Lureau 34004fb9071fSStefan Hajnocziblockdev_ss = blockdev_ss.apply(config_host, strict: false) 34014fb9071fSStefan Hajnoczilibblockdev = static_library('blockdev', blockdev_ss.sources() + genh, 34024fb9071fSStefan Hajnoczi dependencies: blockdev_ss.dependencies(), 34034fb9071fSStefan Hajnoczi name_suffix: 'fa', 34044fb9071fSStefan Hajnoczi build_by_default: false) 34054fb9071fSStefan Hajnoczi 34064fb9071fSStefan Hajnocziblockdev = declare_dependency(link_whole: [libblockdev], 34077d5983e3SNicolas Saenz Julienne dependencies: [block, event_loop_base]) 34084fb9071fSStefan Hajnoczi 3409ff219dcaSPaolo Bonziniqmp_ss = qmp_ss.apply(config_host, strict: false) 3410ff219dcaSPaolo Bonzinilibqmp = static_library('qmp', qmp_ss.sources() + genh, 3411ff219dcaSPaolo Bonzini dependencies: qmp_ss.dependencies(), 3412ff219dcaSPaolo Bonzini name_suffix: 'fa', 3413ff219dcaSPaolo Bonzini build_by_default: false) 3414ff219dcaSPaolo Bonzini 3415ff219dcaSPaolo Bonziniqmp = declare_dependency(link_whole: [libqmp]) 3416ff219dcaSPaolo Bonzini 3417c2306d71SPhilippe Mathieu-Daudélibchardev = static_library('chardev', chardev_ss.sources() + genh, 3418c2306d71SPhilippe Mathieu-Daudé name_suffix: 'fa', 341922d1f7a8SMarc-André Lureau dependencies: chardev_ss.dependencies(), 3420c2306d71SPhilippe Mathieu-Daudé build_by_default: false) 3421c2306d71SPhilippe Mathieu-Daudé 3422c2306d71SPhilippe Mathieu-Daudéchardev = declare_dependency(link_whole: libchardev) 3423c2306d71SPhilippe Mathieu-Daudé 3424f73fb063SPhilippe Mathieu-Daudéhwcore_ss = hwcore_ss.apply(config_host, strict: false) 3425f73fb063SPhilippe Mathieu-Daudélibhwcore = static_library('hwcore', sources: hwcore_ss.sources() + genh, 3426e28ab096SPhilippe Mathieu-Daudé name_suffix: 'fa', 3427e28ab096SPhilippe Mathieu-Daudé build_by_default: false) 3428e28ab096SPhilippe Mathieu-Daudéhwcore = declare_dependency(link_whole: libhwcore) 3429e28ab096SPhilippe Mathieu-Daudécommon_ss.add(hwcore) 3430e28ab096SPhilippe Mathieu-Daudé 3431064f8ee7SPhilippe Mathieu-Daudé########### 3432064f8ee7SPhilippe Mathieu-Daudé# Targets # 3433064f8ee7SPhilippe Mathieu-Daudé########### 3434064f8ee7SPhilippe Mathieu-Daudé 3435fb72176bSPaolo Bonziniemulator_modules = [] 34363154fee4SMarc-André Lureauforeach m : block_mods + softmmu_mods 3437fb72176bSPaolo Bonzini emulator_modules += shared_module(m.name(), 3438fb72176bSPaolo Bonzini build_by_default: true, 34393154fee4SMarc-André Lureau name_prefix: '', 34403154fee4SMarc-André Lureau link_whole: m, 34413154fee4SMarc-André Lureau install: true, 344216bf7a33SPaolo Bonzini install_dir: qemu_moddir) 34433154fee4SMarc-André Lureauendforeach 3444d8f3a609SPaolo Bonziniif emulator_modules.length() > 0 3445d8f3a609SPaolo Bonzini alias_target('modules', emulator_modules) 3446d8f3a609SPaolo Bonziniendif 34473154fee4SMarc-André Lureau 34484fb9071fSStefan Hajnoczisoftmmu_ss.add(authz, blockdev, chardev, crypto, io, qmp) 344964ed6f92SPaolo Bonzinicommon_ss.add(qom, qemuutil) 345064ed6f92SPaolo Bonzini 345164ed6f92SPaolo Bonzinicommon_ss.add_all(when: 'CONFIG_SOFTMMU', if_true: [softmmu_ss]) 34522becc36aSPaolo Bonzinicommon_ss.add_all(when: 'CONFIG_USER_ONLY', if_true: user_ss) 34532becc36aSPaolo Bonzini 34542becc36aSPaolo Bonzinicommon_all = common_ss.apply(config_all, strict: false) 34552becc36aSPaolo Bonzinicommon_all = static_library('common', 34562becc36aSPaolo Bonzini build_by_default: false, 34572becc36aSPaolo Bonzini sources: common_all.sources() + genh, 34589d24fb73SPaolo Bonzini include_directories: common_user_inc, 345975eebe0bSKatsuhiro Ueno implicit_include_directories: false, 34602becc36aSPaolo Bonzini dependencies: common_all.dependencies(), 34612becc36aSPaolo Bonzini name_suffix: 'fa') 34622becc36aSPaolo Bonzini 3463c9322ab5SMarc-André Lureaufeature_to_c = find_program('scripts/feature_to_c.sh') 3464c9322ab5SMarc-André Lureau 346530cfa50dSPhilippe Mathieu-Daudéif targetos == 'darwin' 346630cfa50dSPhilippe Mathieu-Daudé entitlement = find_program('scripts/entitlement.sh') 346730cfa50dSPhilippe Mathieu-Daudéendif 346830cfa50dSPhilippe Mathieu-Daudé 3469fd5eef85SPaolo Bonziniemulators = {} 34702becc36aSPaolo Bonziniforeach target : target_dirs 34712becc36aSPaolo Bonzini config_target = config_target_mak[target] 34722becc36aSPaolo Bonzini target_name = config_target['TARGET_NAME'] 3473ffb91f68SPaolo Bonzini target_base_arch = config_target['TARGET_BASE_ARCH'] 3474859aef02SPaolo Bonzini arch_srcs = [config_target_h[target]] 347564ed6f92SPaolo Bonzini arch_deps = [] 347664ed6f92SPaolo Bonzini c_args = ['-DNEED_CPU_H', 347764ed6f92SPaolo Bonzini '-DCONFIG_TARGET="@0@-config-target.h"'.format(target), 347864ed6f92SPaolo Bonzini '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)] 3479b6c7cfd4SPaolo Bonzini link_args = emulator_link_args 34802becc36aSPaolo Bonzini 3481859aef02SPaolo Bonzini config_target += config_host 34822becc36aSPaolo Bonzini target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])] 34832becc36aSPaolo Bonzini if targetos == 'linux' 34842becc36aSPaolo Bonzini target_inc += include_directories('linux-headers', is_system: true) 34852becc36aSPaolo Bonzini endif 34862becc36aSPaolo Bonzini if target.endswith('-softmmu') 34872becc36aSPaolo Bonzini target_type='system' 3488ffb91f68SPaolo Bonzini t = target_softmmu_arch[target_base_arch].apply(config_target, strict: false) 3489abff1abfSPaolo Bonzini arch_srcs += t.sources() 349064ed6f92SPaolo Bonzini arch_deps += t.dependencies() 3491abff1abfSPaolo Bonzini 3492ffb91f68SPaolo Bonzini hw_dir = target_name == 'sparc64' ? 'sparc64' : target_base_arch 34932c44220dSMarc-André Lureau hw = hw_arch[hw_dir].apply(config_target, strict: false) 34942c44220dSMarc-André Lureau arch_srcs += hw.sources() 349564ed6f92SPaolo Bonzini arch_deps += hw.dependencies() 34962c44220dSMarc-André Lureau 34972becc36aSPaolo Bonzini arch_srcs += config_devices_h[target] 349864ed6f92SPaolo Bonzini link_args += ['@block.syms', '@qemu.syms'] 34992becc36aSPaolo Bonzini else 35003a30446aSMarc-André Lureau abi = config_target['TARGET_ABI_DIR'] 35012becc36aSPaolo Bonzini target_type='user' 3502a3a576b0SPaolo Bonzini target_inc += common_user_inc 3503ffb91f68SPaolo Bonzini if target_base_arch in target_user_arch 3504ffb91f68SPaolo Bonzini t = target_user_arch[target_base_arch].apply(config_target, strict: false) 350546369b50SPhilippe Mathieu-Daudé arch_srcs += t.sources() 350646369b50SPhilippe Mathieu-Daudé arch_deps += t.dependencies() 350746369b50SPhilippe Mathieu-Daudé endif 35082becc36aSPaolo Bonzini if 'CONFIG_LINUX_USER' in config_target 35092becc36aSPaolo Bonzini base_dir = 'linux-user' 3510e2a74729SWarner Losh endif 3511e2a74729SWarner Losh if 'CONFIG_BSD_USER' in config_target 35122becc36aSPaolo Bonzini base_dir = 'bsd-user' 3513e2a74729SWarner Losh target_inc += include_directories('bsd-user/' / targetos) 351485fc1b5dSWarner Losh target_inc += include_directories('bsd-user/host/' / host_arch) 3515e2a74729SWarner Losh dir = base_dir / abi 351619bf129fSWarner Losh arch_srcs += files(dir / 'signal.c', dir / 'target_arch_cpu.c') 35172becc36aSPaolo Bonzini endif 35182becc36aSPaolo Bonzini target_inc += include_directories( 35192becc36aSPaolo Bonzini base_dir, 35203a30446aSMarc-André Lureau base_dir / abi, 35212becc36aSPaolo Bonzini ) 35223a30446aSMarc-André Lureau if 'CONFIG_LINUX_USER' in config_target 35233a30446aSMarc-André Lureau dir = base_dir / abi 35243a30446aSMarc-André Lureau arch_srcs += files(dir / 'signal.c', dir / 'cpu_loop.c') 35253a30446aSMarc-André Lureau if config_target.has_key('TARGET_SYSTBL_ABI') 35263a30446aSMarc-André Lureau arch_srcs += \ 35273a30446aSMarc-André Lureau syscall_nr_generators[abi].process(base_dir / abi / config_target['TARGET_SYSTBL'], 35283a30446aSMarc-André Lureau extra_args : config_target['TARGET_SYSTBL_ABI']) 35293a30446aSMarc-André Lureau endif 35303a30446aSMarc-André Lureau endif 35312becc36aSPaolo Bonzini endif 35322becc36aSPaolo Bonzini 3533c9322ab5SMarc-André Lureau if 'TARGET_XML_FILES' in config_target 3534c9322ab5SMarc-André Lureau gdbstub_xml = custom_target(target + '-gdbstub-xml.c', 3535c9322ab5SMarc-André Lureau output: target + '-gdbstub-xml.c', 3536c9322ab5SMarc-André Lureau input: files(config_target['TARGET_XML_FILES'].split()), 3537c9322ab5SMarc-André Lureau command: [feature_to_c, '@INPUT@'], 3538c9322ab5SMarc-André Lureau capture: true) 3539c9322ab5SMarc-André Lureau arch_srcs += gdbstub_xml 3540c9322ab5SMarc-André Lureau endif 3541c9322ab5SMarc-André Lureau 3542ffb91f68SPaolo Bonzini t = target_arch[target_base_arch].apply(config_target, strict: false) 3543abff1abfSPaolo Bonzini arch_srcs += t.sources() 354464ed6f92SPaolo Bonzini arch_deps += t.dependencies() 3545abff1abfSPaolo Bonzini 35462becc36aSPaolo Bonzini target_common = common_ss.apply(config_target, strict: false) 35472becc36aSPaolo Bonzini objects = common_all.extract_objects(target_common.sources()) 354864ed6f92SPaolo Bonzini deps = target_common.dependencies() 35492becc36aSPaolo Bonzini 35502becc36aSPaolo Bonzini target_specific = specific_ss.apply(config_target, strict: false) 35512becc36aSPaolo Bonzini arch_srcs += target_specific.sources() 355264ed6f92SPaolo Bonzini arch_deps += target_specific.dependencies() 35532becc36aSPaolo Bonzini 355464ed6f92SPaolo Bonzini lib = static_library('qemu-' + target, 3555859aef02SPaolo Bonzini sources: arch_srcs + genh, 3556b7612f45SPaolo Bonzini dependencies: arch_deps, 35572becc36aSPaolo Bonzini objects: objects, 35582becc36aSPaolo Bonzini include_directories: target_inc, 355964ed6f92SPaolo Bonzini c_args: c_args, 356064ed6f92SPaolo Bonzini build_by_default: false, 35612becc36aSPaolo Bonzini name_suffix: 'fa') 356264ed6f92SPaolo Bonzini 356364ed6f92SPaolo Bonzini if target.endswith('-softmmu') 356464ed6f92SPaolo Bonzini execs = [{ 356564ed6f92SPaolo Bonzini 'name': 'qemu-system-' + target_name, 3566654d6b04SPaolo Bonzini 'win_subsystem': 'console', 356764ed6f92SPaolo Bonzini 'sources': files('softmmu/main.c'), 356864ed6f92SPaolo Bonzini 'dependencies': [] 356964ed6f92SPaolo Bonzini }] 357035be72baSPaolo Bonzini if targetos == 'windows' and (sdl.found() or gtk.found()) 357164ed6f92SPaolo Bonzini execs += [{ 357264ed6f92SPaolo Bonzini 'name': 'qemu-system-' + target_name + 'w', 3573654d6b04SPaolo Bonzini 'win_subsystem': 'windows', 357464ed6f92SPaolo Bonzini 'sources': files('softmmu/main.c'), 357564ed6f92SPaolo Bonzini 'dependencies': [] 357664ed6f92SPaolo Bonzini }] 357764ed6f92SPaolo Bonzini endif 3578537b7248SPaolo Bonzini if get_option('fuzzing') 357964ed6f92SPaolo Bonzini specific_fuzz = specific_fuzz_ss.apply(config_target, strict: false) 358064ed6f92SPaolo Bonzini execs += [{ 358164ed6f92SPaolo Bonzini 'name': 'qemu-fuzz-' + target_name, 3582654d6b04SPaolo Bonzini 'win_subsystem': 'console', 358364ed6f92SPaolo Bonzini 'sources': specific_fuzz.sources(), 358464ed6f92SPaolo Bonzini 'dependencies': specific_fuzz.dependencies(), 358564ed6f92SPaolo Bonzini }] 358664ed6f92SPaolo Bonzini endif 358764ed6f92SPaolo Bonzini else 358864ed6f92SPaolo Bonzini execs = [{ 358964ed6f92SPaolo Bonzini 'name': 'qemu-' + target_name, 3590654d6b04SPaolo Bonzini 'win_subsystem': 'console', 359164ed6f92SPaolo Bonzini 'sources': [], 359264ed6f92SPaolo Bonzini 'dependencies': [] 359364ed6f92SPaolo Bonzini }] 359464ed6f92SPaolo Bonzini endif 359564ed6f92SPaolo Bonzini foreach exe: execs 35968a74ce61SAlexander Graf exe_name = exe['name'] 35973983a767SJohn Arbuckle if targetos == 'darwin' 35988a74ce61SAlexander Graf exe_name += '-unsigned' 35998a74ce61SAlexander Graf endif 36008a74ce61SAlexander Graf 36018a74ce61SAlexander Graf emulator = executable(exe_name, exe['sources'], 3602237377acSAkihiko Odaki install: true, 360364ed6f92SPaolo Bonzini c_args: c_args, 360464ed6f92SPaolo Bonzini dependencies: arch_deps + deps + exe['dependencies'], 360564ed6f92SPaolo Bonzini objects: lib.extract_all_objects(recursive: true), 360664ed6f92SPaolo Bonzini link_language: link_language, 360764ed6f92SPaolo Bonzini link_depends: [block_syms, qemu_syms] + exe.get('link_depends', []), 360864ed6f92SPaolo Bonzini link_args: link_args, 3609654d6b04SPaolo Bonzini win_subsystem: exe['win_subsystem']) 36108a74ce61SAlexander Graf 36113983a767SJohn Arbuckle if targetos == 'darwin' 3612411ad8ddSAkihiko Odaki icon = 'pc-bios/qemu.rsrc' 3613411ad8ddSAkihiko Odaki build_input = [emulator, files(icon)] 3614411ad8ddSAkihiko Odaki install_input = [ 3615411ad8ddSAkihiko Odaki get_option('bindir') / exe_name, 3616411ad8ddSAkihiko Odaki meson.current_source_dir() / icon 3617411ad8ddSAkihiko Odaki ] 3618411ad8ddSAkihiko Odaki if 'CONFIG_HVF' in config_target 3619411ad8ddSAkihiko Odaki entitlements = 'accel/hvf/entitlements.plist' 3620411ad8ddSAkihiko Odaki build_input += files(entitlements) 3621411ad8ddSAkihiko Odaki install_input += meson.current_source_dir() / entitlements 3622411ad8ddSAkihiko Odaki endif 3623411ad8ddSAkihiko Odaki 36248a74ce61SAlexander Graf emulators += {exe['name'] : custom_target(exe['name'], 3625411ad8ddSAkihiko Odaki input: build_input, 36268a74ce61SAlexander Graf output: exe['name'], 3627235b523dSPhilippe Mathieu-Daudé command: [entitlement, '@OUTPUT@', '@INPUT@']) 3628fd5eef85SPaolo Bonzini } 3629237377acSAkihiko Odaki 3630235b523dSPhilippe Mathieu-Daudé meson.add_install_script(entitlement, '--install', 3631237377acSAkihiko Odaki get_option('bindir') / exe['name'], 3632411ad8ddSAkihiko Odaki install_input) 36338a74ce61SAlexander Graf else 36348a74ce61SAlexander Graf emulators += {exe['name']: emulator} 36358a74ce61SAlexander Graf endif 363610e1d263SMarc-André Lureau 36379c29b741SPaolo Bonzini if stap.found() 363810e1d263SMarc-André Lureau foreach stp: [ 3639bd5f973aSStefan Hajnoczi {'ext': '.stp-build', 'fmt': 'stap', 'bin': meson.current_build_dir() / exe['name'], 'install': false}, 3640bd5f973aSStefan Hajnoczi {'ext': '.stp', 'fmt': 'stap', 'bin': get_option('prefix') / get_option('bindir') / exe['name'], 'install': true}, 364110e1d263SMarc-André Lureau {'ext': '-simpletrace.stp', 'fmt': 'simpletrace-stap', 'bin': '', 'install': true}, 364210e1d263SMarc-André Lureau {'ext': '-log.stp', 'fmt': 'log-stap', 'bin': '', 'install': true}, 364310e1d263SMarc-André Lureau ] 3644bd5f973aSStefan Hajnoczi custom_target(exe['name'] + stp['ext'], 364510e1d263SMarc-André Lureau input: trace_events_all, 3646bd5f973aSStefan Hajnoczi output: exe['name'] + stp['ext'], 364710e1d263SMarc-André Lureau install: stp['install'], 364816bf7a33SPaolo Bonzini install_dir: get_option('datadir') / 'systemtap/tapset', 364910e1d263SMarc-André Lureau command: [ 365010e1d263SMarc-André Lureau tracetool, '--group=all', '--format=' + stp['fmt'], 365110e1d263SMarc-André Lureau '--binary=' + stp['bin'], 365210e1d263SMarc-André Lureau '--target-name=' + target_name, 365310e1d263SMarc-André Lureau '--target-type=' + target_type, 365410e1d263SMarc-André Lureau '--probe-prefix=qemu.' + target_type + '.' + target_name, 3655c05012a3SStefan Hajnoczi '@INPUT@', '@OUTPUT@' 36560572d6cdSStefan Hajnoczi ], 36570572d6cdSStefan Hajnoczi depend_files: tracetool_depends) 365810e1d263SMarc-André Lureau endforeach 365910e1d263SMarc-André Lureau endif 366064ed6f92SPaolo Bonzini endforeach 36612becc36aSPaolo Bonziniendforeach 36622becc36aSPaolo Bonzini 3663931049b4SPaolo Bonzini# Other build targets 3664897b5afaSMarc-André Lureau 3665f556b4a1SPaolo Bonziniif 'CONFIG_PLUGIN' in config_host 3666f556b4a1SPaolo Bonzini install_headers('include/qemu/qemu-plugin.h') 3667f556b4a1SPaolo Bonziniendif 3668f556b4a1SPaolo Bonzini 3669f15bff25SPaolo Bonzinisubdir('qga') 3670f15bff25SPaolo Bonzini 36719755c94aSLaurent Vivier# Don't build qemu-keymap if xkbcommon is not explicitly enabled 36729755c94aSLaurent Vivier# when we don't build tools or system 36734113f4cfSLaurent Vivierif xkbcommon.found() 367428742467SMarc-André Lureau # used for the update-keymaps target, so include rules even if !have_tools 367528742467SMarc-André Lureau qemu_keymap = executable('qemu-keymap', files('qemu-keymap.c', 'ui/input-keymap.c') + genh, 367628742467SMarc-André Lureau dependencies: [qemuutil, xkbcommon], install: have_tools) 367728742467SMarc-André Lureauendif 367828742467SMarc-André Lureau 3679931049b4SPaolo Bonziniif have_tools 3680b7c70bf2SMarc-André Lureau qemu_img = executable('qemu-img', [files('qemu-img.c'), hxdep], 3681b7c70bf2SMarc-André Lureau dependencies: [authz, block, crypto, io, qom, qemuutil], install: true) 3682b7c70bf2SMarc-André Lureau qemu_io = executable('qemu-io', files('qemu-io.c'), 3683b7c70bf2SMarc-André Lureau dependencies: [block, qemuutil], install: true) 3684b7c70bf2SMarc-André Lureau qemu_nbd = executable('qemu-nbd', files('qemu-nbd.c'), 36853d212b41SRichard W.M. Jones dependencies: [blockdev, qemuutil, gnutls, selinux], 36863d212b41SRichard W.M. Jones install: true) 3687b7c70bf2SMarc-André Lureau 36887c58bb76SPaolo Bonzini subdir('storage-daemon') 3689a9c9727cSPaolo Bonzini subdir('contrib/rdmacm-mux') 36901d7bb6abSMarc-André Lureau subdir('contrib/elf2dmp') 3691a9c9727cSPaolo Bonzini 3692157e7b13SMarc-André Lureau executable('qemu-edid', files('qemu-edid.c', 'hw/display/edid-generate.c'), 3693157e7b13SMarc-André Lureau dependencies: qemuutil, 3694157e7b13SMarc-André Lureau install: true) 3695157e7b13SMarc-André Lureau 36962a3129a3SPaolo Bonzini if have_vhost_user 36972d7ac0afSPaolo Bonzini subdir('contrib/vhost-user-blk') 3698ea458960SMarc-André Lureau subdir('contrib/vhost-user-gpu') 369932fcc624SMarc-André Lureau subdir('contrib/vhost-user-input') 370099650b62SPaolo Bonzini subdir('contrib/vhost-user-scsi') 3701931049b4SPaolo Bonzini endif 37028f51e01cSMarc-André Lureau 37038f51e01cSMarc-André Lureau if targetos == 'linux' 37048f51e01cSMarc-André Lureau executable('qemu-bridge-helper', files('qemu-bridge-helper.c'), 37058f51e01cSMarc-André Lureau dependencies: [qemuutil, libcap_ng], 37068f51e01cSMarc-André Lureau install: true, 37078f51e01cSMarc-André Lureau install_dir: get_option('libexecdir')) 3708897b5afaSMarc-André Lureau 3709897b5afaSMarc-André Lureau executable('qemu-pr-helper', files('scsi/qemu-pr-helper.c', 'scsi/utils.c'), 3710897b5afaSMarc-André Lureau dependencies: [authz, crypto, io, qom, qemuutil, 37116ec0e15dSPaolo Bonzini libcap_ng, mpathpersist], 3712897b5afaSMarc-André Lureau install: true) 37138f51e01cSMarc-André Lureau endif 37148f51e01cSMarc-André Lureau 3715ccd250aaSPaolo Bonzini if have_ivshmem 37165ee24e78SMarc-André Lureau subdir('contrib/ivshmem-client') 37175ee24e78SMarc-André Lureau subdir('contrib/ivshmem-server') 37185ee24e78SMarc-André Lureau endif 3719931049b4SPaolo Bonziniendif 3720931049b4SPaolo Bonzini 3721f5aa6320SMarc-André Lureausubdir('scripts') 37223f99cf57SPaolo Bonzinisubdir('tools') 3723bdcbea7aSMarc-André Lureausubdir('pc-bios') 3724f8aa24eaSPaolo Bonzinisubdir('docs') 3725e3667660SYonggang Luosubdir('tests') 37261b695471SPaolo Bonziniif gtk.found() 3727e8f3bd71SMarc-André Lureau subdir('po') 3728e8f3bd71SMarc-André Lureauendif 37293f99cf57SPaolo Bonzini 37308adfeba9SMarc-André Lureauif host_machine.system() == 'windows' 37318adfeba9SMarc-André Lureau nsis_cmd = [ 37328adfeba9SMarc-André Lureau find_program('scripts/nsis.py'), 37338adfeba9SMarc-André Lureau '@OUTPUT@', 37348adfeba9SMarc-André Lureau get_option('prefix'), 37358adfeba9SMarc-André Lureau meson.current_source_dir(), 3736*fc9a809eSPaolo Bonzini glib_pc.get_variable('bindir'), 373724bdcc96SStefan Weil host_machine.cpu(), 37388adfeba9SMarc-André Lureau '--', 37398adfeba9SMarc-André Lureau '-DDISPLAYVERSION=' + meson.project_version(), 37408adfeba9SMarc-André Lureau ] 37418adfeba9SMarc-André Lureau if build_docs 37428adfeba9SMarc-André Lureau nsis_cmd += '-DCONFIG_DOCUMENTATION=y' 37438adfeba9SMarc-André Lureau endif 37441b695471SPaolo Bonzini if gtk.found() 37458adfeba9SMarc-André Lureau nsis_cmd += '-DCONFIG_GTK=y' 37468adfeba9SMarc-André Lureau endif 37478adfeba9SMarc-André Lureau 37488adfeba9SMarc-André Lureau nsis = custom_target('nsis', 37498adfeba9SMarc-André Lureau output: 'qemu-setup-' + meson.project_version() + '.exe', 37508adfeba9SMarc-André Lureau input: files('qemu.nsi'), 37518adfeba9SMarc-André Lureau build_always_stale: true, 37528adfeba9SMarc-André Lureau command: nsis_cmd + ['@INPUT@']) 37538adfeba9SMarc-André Lureau alias_target('installer', nsis) 37548adfeba9SMarc-André Lureauendif 37558adfeba9SMarc-André Lureau 3756a0c9162cSPaolo Bonzini######################### 3757a0c9162cSPaolo Bonzini# Configuration summary # 3758a0c9162cSPaolo Bonzini######################### 3759a0c9162cSPaolo Bonzini 3760983d0a75SPhilippe Mathieu-Daudé# Directories 3761f9332757SPaolo Bonzinisummary_info = {} 376216bf7a33SPaolo Bonzinisummary_info += {'Install prefix': get_option('prefix')} 376316bf7a33SPaolo Bonzinisummary_info += {'BIOS directory': qemu_datadir} 37648154f5e6SAkihiko Odakipathsep = targetos == 'windows' ? ';' : ':' 37658154f5e6SAkihiko Odakisummary_info += {'firmware path': pathsep.join(get_option('qemu_firmwarepath'))} 3766f7fb6c6aSPaolo Bonzinisummary_info += {'binary directory': get_option('prefix') / get_option('bindir')} 3767f7fb6c6aSPaolo Bonzinisummary_info += {'library directory': get_option('prefix') / get_option('libdir')} 376816bf7a33SPaolo Bonzinisummary_info += {'module directory': qemu_moddir} 3769f7fb6c6aSPaolo Bonzinisummary_info += {'libexec directory': get_option('prefix') / get_option('libexecdir')} 3770f7fb6c6aSPaolo Bonzinisummary_info += {'include directory': get_option('prefix') / get_option('includedir')} 3771f7fb6c6aSPaolo Bonzinisummary_info += {'config directory': get_option('prefix') / get_option('sysconfdir')} 3772f9332757SPaolo Bonziniif targetos != 'windows' 3773f7fb6c6aSPaolo Bonzini summary_info += {'local state directory': get_option('prefix') / get_option('localstatedir')} 3774f7fb6c6aSPaolo Bonzini summary_info += {'Manual directory': get_option('prefix') / get_option('mandir')} 3775f9332757SPaolo Bonzinielse 3776f9332757SPaolo Bonzini summary_info += {'local state directory': 'queried at runtime'} 3777f9332757SPaolo Bonziniendif 3778f7fb6c6aSPaolo Bonzinisummary_info += {'Doc directory': get_option('prefix') / get_option('docdir')} 3779f9332757SPaolo Bonzinisummary_info += {'Build directory': meson.current_build_dir()} 3780f9332757SPaolo Bonzinisummary_info += {'Source path': meson.current_source_dir()} 3781f9332757SPaolo Bonzinisummary_info += {'GIT submodules': config_host['GIT_SUBMODULES']} 3782983d0a75SPhilippe Mathieu-Daudésummary(summary_info, bool_yn: true, section: 'Directories') 3783983d0a75SPhilippe Mathieu-Daudé 3784e11a0e17SPhilippe Mathieu-Daudé# Host binaries 3785983d0a75SPhilippe Mathieu-Daudésummary_info = {} 3786e11a0e17SPhilippe Mathieu-Daudésummary_info += {'git': config_host['GIT']} 3787e11a0e17SPhilippe Mathieu-Daudésummary_info += {'make': config_host['MAKE']} 3788e11a0e17SPhilippe Mathieu-Daudésummary_info += {'python': '@0@ (version: @1@)'.format(python.full_path(), python.language_version())} 3789bb647c49SPaolo Bonzinisummary_info += {'sphinx-build': sphinx_build} 3790e11a0e17SPhilippe Mathieu-Daudéif config_host.has_key('HAVE_GDB_BIN') 3791e11a0e17SPhilippe Mathieu-Daudé summary_info += {'gdb': config_host['HAVE_GDB_BIN']} 3792e11a0e17SPhilippe Mathieu-Daudéendif 379340c909f5SPaolo Bonzinisummary_info += {'iasl': iasl} 3794e11a0e17SPhilippe Mathieu-Daudésummary_info += {'genisoimage': config_host['GENISOIMAGE']} 379520cf5cb4SPaolo Bonziniif targetos == 'windows' and have_ga 3796bb647c49SPaolo Bonzini summary_info += {'wixl': wixl} 3797e11a0e17SPhilippe Mathieu-Daudéendif 37985890258aSThomas Huthif slirp.found() and have_system 379935acbb30SPaolo Bonzini summary_info += {'smbd': have_slirp_smbd ? smbd_path : false} 3800e11a0e17SPhilippe Mathieu-Daudéendif 3801e11a0e17SPhilippe Mathieu-Daudésummary(summary_info, bool_yn: true, section: 'Host binaries') 3802e11a0e17SPhilippe Mathieu-Daudé 38031d718865SPhilippe Mathieu-Daudé# Configurable features 38041d718865SPhilippe Mathieu-Daudésummary_info = {} 38051d718865SPhilippe Mathieu-Daudésummary_info += {'Documentation': build_docs} 3806aa3ca634SPhilippe Mathieu-Daudésummary_info += {'system-mode emulation': have_system} 3807aa3ca634SPhilippe Mathieu-Daudésummary_info += {'user-mode emulation': have_user} 3808813803aaSPhilippe Mathieu-Daudésummary_info += {'block layer': have_block} 38091d718865SPhilippe Mathieu-Daudésummary_info += {'Install blobs': get_option('install_blobs')} 38101d718865SPhilippe Mathieu-Daudésummary_info += {'module support': config_host.has_key('CONFIG_MODULES')} 38111d718865SPhilippe Mathieu-Daudéif config_host.has_key('CONFIG_MODULES') 38122cb2f580SPaolo Bonzini summary_info += {'alternative module path': get_option('module_upgrades')} 38131d718865SPhilippe Mathieu-Daudéendif 3814537b7248SPaolo Bonzinisummary_info += {'fuzzing support': get_option('fuzzing')} 38151d718865SPhilippe Mathieu-Daudéif have_system 381687430d5bSPaolo Bonzini summary_info += {'Audio drivers': ' '.join(audio_drivers_selected)} 38171d718865SPhilippe Mathieu-Daudéendif 38189c29b741SPaolo Bonzinisummary_info += {'Trace backends': ','.join(get_option('trace_backends'))} 38199c29b741SPaolo Bonziniif 'simple' in get_option('trace_backends') 38209c29b741SPaolo Bonzini summary_info += {'Trace output file': get_option('trace_file') + '-<pid>'} 38211d718865SPhilippe Mathieu-Daudéendif 3822142ca628SMarc-André Lureausummary_info += {'D-Bus display': dbus_display} 3823c55cf6abSPaolo Bonzinisummary_info += {'QOM debugging': get_option('qom_cast_debug')} 38242a3129a3SPaolo Bonzinisummary_info += {'vhost-kernel support': have_vhost_kernel} 38252a3129a3SPaolo Bonzinisummary_info += {'vhost-net support': have_vhost_net} 38262a3129a3SPaolo Bonzinisummary_info += {'vhost-user support': have_vhost_user} 38272a3129a3SPaolo Bonzinisummary_info += {'vhost-user-crypto support': have_vhost_user_crypto} 38281d718865SPhilippe Mathieu-Daudésummary_info += {'vhost-user-blk server support': have_vhost_user_blk_server} 38292a3129a3SPaolo Bonzinisummary_info += {'vhost-vdpa support': have_vhost_vdpa} 383020cf5cb4SPaolo Bonzinisummary_info += {'build guest agent': have_ga} 38311d718865SPhilippe Mathieu-Daudésummary(summary_info, bool_yn: true, section: 'Configurable features') 38321d718865SPhilippe Mathieu-Daudé 38332e864b8bSPhilippe Mathieu-Daudé# Compilation information 3834e11a0e17SPhilippe Mathieu-Daudésummary_info = {} 38352e864b8bSPhilippe Mathieu-Daudésummary_info += {'host CPU': cpu} 38362e864b8bSPhilippe Mathieu-Daudésummary_info += {'host endianness': build_machine.endian()} 383763de9353SAlex Bennéesummary_info += {'C compiler': ' '.join(meson.get_compiler('c').cmd_array())} 383863de9353SAlex Bennéesummary_info += {'Host C compiler': ' '.join(meson.get_compiler('c', native: true).cmd_array())} 3839f9332757SPaolo Bonziniif link_language == 'cpp' 384063de9353SAlex Bennée summary_info += {'C++ compiler': ' '.join(meson.get_compiler('cpp').cmd_array())} 3841f9332757SPaolo Bonzinielse 3842f9332757SPaolo Bonzini summary_info += {'C++ compiler': false} 3843f9332757SPaolo Bonziniendif 3844f9332757SPaolo Bonziniif targetos == 'darwin' 384563de9353SAlex Bennée summary_info += {'Objective-C compiler': ' '.join(meson.get_compiler('objc').cmd_array())} 3846f9332757SPaolo Bonziniendif 38476a97f393SPaolo Bonzinioption_cflags = (get_option('debug') ? ['-g'] : []) 38486a97f393SPaolo Bonziniif get_option('optimization') != 'plain' 38496a97f393SPaolo Bonzini option_cflags += ['-O' + get_option('optimization')] 38506a97f393SPaolo Bonziniendif 38516a97f393SPaolo Bonzinisummary_info += {'CFLAGS': ' '.join(get_option('c_args') + option_cflags)} 385247b30835SPaolo Bonziniif link_language == 'cpp' 38536a97f393SPaolo Bonzini summary_info += {'CXXFLAGS': ' '.join(get_option('cpp_args') + option_cflags)} 385447b30835SPaolo Bonziniendif 3855e910c7d9SPhilippe Mathieu-Daudéif targetos == 'darwin' 38566a97f393SPaolo Bonzini summary_info += {'OBJCFLAGS': ' '.join(get_option('objc_args') + option_cflags)} 3857e910c7d9SPhilippe Mathieu-Daudéendif 385847b30835SPaolo Bonzinilink_args = get_option(link_language + '_link_args') 385947b30835SPaolo Bonziniif link_args.length() > 0 386047b30835SPaolo Bonzini summary_info += {'LDFLAGS': ' '.join(link_args)} 386147b30835SPaolo Bonziniendif 3862d065177eSPaolo Bonzinisummary_info += {'QEMU_CFLAGS': ' '.join(qemu_cflags)} 3863e5134024SPaolo Bonziniif 'cpp' in all_languages 3864d065177eSPaolo Bonzini summary_info += {'QEMU_CXXFLAGS': ' '.join(qemu_cxxflags)} 3865e5134024SPaolo Bonziniendif 3866e5134024SPaolo Bonziniif 'objc' in all_languages 3867d065177eSPaolo Bonzini summary_info += {'QEMU_OBJCFLAGS': ' '.join(qemu_objcflags)} 3868e5134024SPaolo Bonziniendif 3869d065177eSPaolo Bonzinisummary_info += {'QEMU_LDFLAGS': ' '.join(qemu_ldflags)} 3870c55cf6abSPaolo Bonzinisummary_info += {'profiler': get_option('profiler')} 3871cdad781dSDaniele Buonosummary_info += {'link-time optimization (LTO)': get_option('b_lto')} 38722e864b8bSPhilippe Mathieu-Daudésummary_info += {'PIE': get_option('b_pie')} 38733e8529ddSLaurent Viviersummary_info += {'static build': config_host.has_key('CONFIG_STATIC')} 38742e864b8bSPhilippe Mathieu-Daudésummary_info += {'malloc trim support': has_malloc_trim} 3875b87df904SPaolo Bonzinisummary_info += {'membarrier': have_membarrier} 387658a2e3f5SStefan Hajnoczisummary_info += {'debug graph lock': get_option('debug_graph_lock')} 3877728c0a2fSPaolo Bonzinisummary_info += {'debug stack usage': get_option('debug_stack_usage')} 3878c55cf6abSPaolo Bonzinisummary_info += {'mutex debugging': get_option('debug_mutex')} 38792e864b8bSPhilippe Mathieu-Daudésummary_info += {'memory allocator': get_option('malloc')} 3880622753d2SPaolo Bonzinisummary_info += {'avx2 optimization': config_host_data.get('CONFIG_AVX2_OPT')} 388104ffce13Sling xusummary_info += {'avx512bw optimization': config_host_data.get('CONFIG_AVX512BW_OPT')} 3882622753d2SPaolo Bonzinisummary_info += {'avx512f optimization': config_host_data.get('CONFIG_AVX512F_OPT')} 3883bb9ecae7SAlex Bennéeif get_option('gprof') 3884bb9ecae7SAlex Bennée gprof_info = 'YES (deprecated)' 3885bb9ecae7SAlex Bennéeelse 3886bb9ecae7SAlex Bennée gprof_info = get_option('gprof') 3887bb9ecae7SAlex Bennéeendif 3888bb9ecae7SAlex Bennéesummary_info += {'gprof': gprof_info} 38892e864b8bSPhilippe Mathieu-Daudésummary_info += {'gcov': get_option('b_coverage')} 38902e864b8bSPhilippe Mathieu-Daudésummary_info += {'thread sanitizer': config_host.has_key('CONFIG_TSAN')} 38912e864b8bSPhilippe Mathieu-Daudésummary_info += {'CFI support': get_option('cfi')} 38922e864b8bSPhilippe Mathieu-Daudéif get_option('cfi') 38932e864b8bSPhilippe Mathieu-Daudé summary_info += {'CFI debug support': get_option('cfi_debug')} 38942e864b8bSPhilippe Mathieu-Daudéendif 38952e864b8bSPhilippe Mathieu-Daudésummary_info += {'strip binaries': get_option('strip')} 3896bb647c49SPaolo Bonzinisummary_info += {'sparse': sparse} 38972e864b8bSPhilippe Mathieu-Daudésummary_info += {'mingw32 support': targetos == 'windows'} 389812640f05SPaolo Bonzinisummary(summary_info, bool_yn: true, section: 'Compilation') 389949e8565bSAlex Bennée 390049e8565bSAlex Bennée# snarf the cross-compilation information for tests 390112640f05SPaolo Bonzinisummary_info = {} 390212640f05SPaolo Bonzinihave_cross = false 390349e8565bSAlex Bennéeforeach target: target_dirs 3904c7022a70SPaolo Bonzini tcg_mak = meson.current_build_dir() / 'tests/tcg' / target / 'config-target.mak' 390549e8565bSAlex Bennée if fs.exists(tcg_mak) 390649e8565bSAlex Bennée config_cross_tcg = keyval.load(tcg_mak) 390785b141eaSAlex Bennée if 'CC' in config_cross_tcg 390812640f05SPaolo Bonzini summary_info += {config_cross_tcg['TARGET_NAME']: config_cross_tcg['CC']} 390912640f05SPaolo Bonzini have_cross = true 391049e8565bSAlex Bennée endif 391149e8565bSAlex Bennée endif 391249e8565bSAlex Bennéeendforeach 391312640f05SPaolo Bonziniif have_cross 391412640f05SPaolo Bonzini summary(summary_info, bool_yn: true, section: 'Cross compilers') 391512640f05SPaolo Bonziniendif 39162e864b8bSPhilippe Mathieu-Daudé 3917aa3ca634SPhilippe Mathieu-Daudé# Targets and accelerators 39182e864b8bSPhilippe Mathieu-Daudésummary_info = {} 3919aa3ca634SPhilippe Mathieu-Daudéif have_system 3920aa3ca634SPhilippe Mathieu-Daudé summary_info += {'KVM support': config_all.has_key('CONFIG_KVM')} 3921aa3ca634SPhilippe Mathieu-Daudé summary_info += {'HAX support': config_all.has_key('CONFIG_HAX')} 3922aa3ca634SPhilippe Mathieu-Daudé summary_info += {'HVF support': config_all.has_key('CONFIG_HVF')} 3923aa3ca634SPhilippe Mathieu-Daudé summary_info += {'WHPX support': config_all.has_key('CONFIG_WHPX')} 392474a414a1SReinoud Zandijk summary_info += {'NVMM support': config_all.has_key('CONFIG_NVMM')} 392514efd8d3SPaolo Bonzini summary_info += {'Xen support': xen.found()} 392614efd8d3SPaolo Bonzini if xen.found() 392714efd8d3SPaolo Bonzini summary_info += {'xen ctrl version': xen.version()} 3928aa3ca634SPhilippe Mathieu-Daudé endif 3929820c1abaSDavid Woodhouse summary_info += {'Xen emulation': config_all.has_key('CONFIG_XEN_EMU')} 3930aa3ca634SPhilippe Mathieu-Daudéendif 3931aa3ca634SPhilippe Mathieu-Daudésummary_info += {'TCG support': config_all.has_key('CONFIG_TCG')} 3932aa3ca634SPhilippe Mathieu-Daudéif config_all.has_key('CONFIG_TCG') 393339687acaSPhilippe Mathieu-Daudé if get_option('tcg_interpreter') 3934f1f727acSPhilippe Mathieu-Daudé summary_info += {'TCG backend': 'TCI (TCG with bytecode interpreter, slow)'} 393539687acaSPhilippe Mathieu-Daudé else 393639687acaSPhilippe Mathieu-Daudé summary_info += {'TCG backend': 'native (@0@)'.format(cpu)} 393739687acaSPhilippe Mathieu-Daudé endif 3938029aa68fSAlex Bennée summary_info += {'TCG plugins': config_host.has_key('CONFIG_PLUGIN')} 3939aa3ca634SPhilippe Mathieu-Daudé summary_info += {'TCG debug enabled': config_host.has_key('CONFIG_DEBUG_TCG')} 3940aa3ca634SPhilippe Mathieu-Daudéendif 39412e864b8bSPhilippe Mathieu-Daudésummary_info += {'target list': ' '.join(target_dirs)} 3942aa3ca634SPhilippe Mathieu-Daudéif have_system 3943aa3ca634SPhilippe Mathieu-Daudé summary_info += {'default devices': get_option('default_devices')} 3944106ad1f9SPaolo Bonzini summary_info += {'out of process emulation': multiprocess_allowed} 394555116968SJagannathan Raman summary_info += {'vfio-user server': vfio_user_server_allowed} 3946aa3ca634SPhilippe Mathieu-Daudéendif 3947aa3ca634SPhilippe Mathieu-Daudésummary(summary_info, bool_yn: true, section: 'Targets and accelerators') 3948aa3ca634SPhilippe Mathieu-Daudé 3949813803aaSPhilippe Mathieu-Daudé# Block layer 3950813803aaSPhilippe Mathieu-Daudésummary_info = {} 3951813803aaSPhilippe Mathieu-Daudésummary_info += {'coroutine backend': config_host['CONFIG_COROUTINE_BACKEND']} 3952728c0a2fSPaolo Bonzinisummary_info += {'coroutine pool': have_coroutine_pool} 3953813803aaSPhilippe Mathieu-Daudéif have_block 3954622d64ffSPaolo Bonzini summary_info += {'Block whitelist (rw)': get_option('block_drv_rw_whitelist')} 3955622d64ffSPaolo Bonzini summary_info += {'Block whitelist (ro)': get_option('block_drv_ro_whitelist')} 3956c55cf6abSPaolo Bonzini summary_info += {'Use block whitelist in tools': get_option('block_drv_whitelist_in_tools')} 39573887702eSChristian Schoenebeck summary_info += {'VirtFS (9P) support': have_virtfs} 39583887702eSChristian Schoenebeck summary_info += {'VirtFS (9P) Proxy Helper support': have_virtfs_proxy_helper} 3959406523f6SPaolo Bonzini summary_info += {'Live block migration': config_host_data.get('CONFIG_LIVE_BLOCK_MIGRATION')} 3960406523f6SPaolo Bonzini summary_info += {'replication support': config_host_data.get('CONFIG_REPLICATION')} 3961ed793c2cSPaolo Bonzini summary_info += {'bochs support': get_option('bochs').allowed()} 3962ed793c2cSPaolo Bonzini summary_info += {'cloop support': get_option('cloop').allowed()} 3963ed793c2cSPaolo Bonzini summary_info += {'dmg support': get_option('dmg').allowed()} 3964ed793c2cSPaolo Bonzini summary_info += {'qcow v1 support': get_option('qcow1').allowed()} 3965ed793c2cSPaolo Bonzini summary_info += {'vdi support': get_option('vdi').allowed()} 396611cea42eSVladimir Sementsov-Ogievskiy summary_info += {'vhdx support': get_option('vhdx').allowed()} 396711cea42eSVladimir Sementsov-Ogievskiy summary_info += {'vmdk support': get_option('vmdk').allowed()} 396811cea42eSVladimir Sementsov-Ogievskiy summary_info += {'vpc support': get_option('vpc').allowed()} 3969ed793c2cSPaolo Bonzini summary_info += {'vvfat support': get_option('vvfat').allowed()} 3970ed793c2cSPaolo Bonzini summary_info += {'qed support': get_option('qed').allowed()} 3971ed793c2cSPaolo Bonzini summary_info += {'parallels support': get_option('parallels').allowed()} 3972bb647c49SPaolo Bonzini summary_info += {'FUSE exports': fuse} 39732a2359b8SXie Yongji summary_info += {'VDUSE block exports': have_vduse_blk_export} 3974813803aaSPhilippe Mathieu-Daudéendif 3975813803aaSPhilippe Mathieu-Daudésummary(summary_info, bool_yn: true, section: 'Block layer support') 3976813803aaSPhilippe Mathieu-Daudé 3977aa58028aSPhilippe Mathieu-Daudé# Crypto 3978aa3ca634SPhilippe Mathieu-Daudésummary_info = {} 397941f2ae28SPaolo Bonzinisummary_info += {'TLS priority': get_option('tls_priority')} 3980bb647c49SPaolo Bonzinisummary_info += {'GNUTLS support': gnutls} 3981bb647c49SPaolo Bonziniif gnutls.found() 3982cc4c7c73SDaniel P. Berrangé summary_info += {' GNUTLS crypto': gnutls_crypto.found()} 3983bb647c49SPaolo Bonziniendif 3984bb647c49SPaolo Bonzinisummary_info += {'libgcrypt': gcrypt} 3985bb647c49SPaolo Bonzinisummary_info += {'nettle': nettle} 398657612511SPaolo Bonziniif nettle.found() 398757612511SPaolo Bonzini summary_info += {' XTS': xts != 'private'} 3988f9332757SPaolo Bonziniendif 398934b52615SPaolo Bonzinisummary_info += {'AF_ALG support': have_afalg} 3990c55cf6abSPaolo Bonzinisummary_info += {'rng-none': get_option('rng_none')} 39912edd2c04SPaolo Bonzinisummary_info += {'Linux keyring': have_keyring} 3992aa58028aSPhilippe Mathieu-Daudésummary(summary_info, bool_yn: true, section: 'Crypto') 3993aa58028aSPhilippe Mathieu-Daudé 399469a78cceSPhilippe Mathieu-Daudé# Libraries 3995aa58028aSPhilippe Mathieu-Daudésummary_info = {} 3996aa58028aSPhilippe Mathieu-Daudéif targetos == 'darwin' 3997bb647c49SPaolo Bonzini summary_info += {'Cocoa support': cocoa} 3998e2c1d78dSVladislav Yaroshchuk summary_info += {'vmnet.framework support': vmnet} 3999aa58028aSPhilippe Mathieu-Daudéendif 4000bb647c49SPaolo Bonzinisummary_info += {'SDL support': sdl} 4001bb647c49SPaolo Bonzinisummary_info += {'SDL image support': sdl_image} 4002bb647c49SPaolo Bonzinisummary_info += {'GTK support': gtk} 4003bb647c49SPaolo Bonzinisummary_info += {'pixman': pixman} 4004bb647c49SPaolo Bonzinisummary_info += {'VTE support': vte} 40055890258aSThomas Huthsummary_info += {'slirp support': slirp} 4006bb647c49SPaolo Bonzinisummary_info += {'libtasn1': tasn1} 4007bb647c49SPaolo Bonzinisummary_info += {'PAM': pam} 4008bb647c49SPaolo Bonzinisummary_info += {'iconv support': iconv} 4009bb647c49SPaolo Bonzinisummary_info += {'curses support': curses} 4010bb647c49SPaolo Bonzinisummary_info += {'virgl support': virgl} 4011fd66dbd4SStefan Hajnoczisummary_info += {'blkio support': blkio} 4012bb647c49SPaolo Bonzinisummary_info += {'curl support': curl} 4013bb647c49SPaolo Bonzinisummary_info += {'Multipath support': mpathpersist} 401495f8510eSKshitij Surisummary_info += {'PNG support': png} 4015bb647c49SPaolo Bonzinisummary_info += {'VNC support': vnc} 4016a0b93237SPaolo Bonziniif vnc.found() 4017bb647c49SPaolo Bonzini summary_info += {'VNC SASL support': sasl} 4018bb647c49SPaolo Bonzini summary_info += {'VNC JPEG support': jpeg} 4019f9332757SPaolo Bonziniendif 402087430d5bSPaolo Bonziniif targetos not in ['darwin', 'haiku', 'windows'] 402187430d5bSPaolo Bonzini summary_info += {'OSS support': oss} 4022663df1ccSAlexandre Ratchov summary_info += {'sndio support': sndio} 402387430d5bSPaolo Bonzinielif targetos == 'darwin' 402487430d5bSPaolo Bonzini summary_info += {'CoreAudio support': coreaudio} 402587430d5bSPaolo Bonzinielif targetos == 'windows' 402687430d5bSPaolo Bonzini summary_info += {'DirectSound support': dsound} 402787430d5bSPaolo Bonziniendif 402887430d5bSPaolo Bonziniif targetos == 'linux' 402987430d5bSPaolo Bonzini summary_info += {'ALSA support': alsa} 403087430d5bSPaolo Bonzini summary_info += {'PulseAudio support': pulse} 403187430d5bSPaolo Bonziniendif 4032c2d3d1c2SDorinda Basseysummary_info += {'Pipewire support': pipewire} 403387430d5bSPaolo Bonzinisummary_info += {'JACK support': jack} 4034bb647c49SPaolo Bonzinisummary_info += {'brlapi support': brlapi} 4035e1723999SPaolo Bonzinisummary_info += {'vde support': vde} 4036837b84b1SPaolo Bonzinisummary_info += {'netmap support': have_netmap} 4037eea9453aSThomas Huthsummary_info += {'l2tpv3 support': have_l2tpv3} 4038ff66f3e5SPaolo Bonzinisummary_info += {'Linux AIO support': libaio} 4039bb647c49SPaolo Bonzinisummary_info += {'Linux io_uring support': linux_io_uring} 4040bb647c49SPaolo Bonzinisummary_info += {'ATTR/XATTR support': libattr} 40413730a734SPaolo Bonzinisummary_info += {'RDMA support': rdma} 40423730a734SPaolo Bonzinisummary_info += {'PVRDMA support': have_pvrdma} 4043fbb4121dSPaolo Bonzinisummary_info += {'fdt support': fdt_opt == 'disabled' ? false : fdt_opt} 4044bb647c49SPaolo Bonzinisummary_info += {'libcap-ng support': libcap_ng} 4045bb647c49SPaolo Bonzinisummary_info += {'bpf support': libbpf} 40463f0a5d55SMarc-André Lureausummary_info += {'spice protocol support': spice_protocol} 40473f0a5d55SMarc-André Lureauif spice_protocol.found() 40483f0a5d55SMarc-André Lureau summary_info += {' spice server support': spice} 40493f0a5d55SMarc-André Lureauendif 4050bb647c49SPaolo Bonzinisummary_info += {'rbd support': rbd} 4051bb647c49SPaolo Bonzinisummary_info += {'smartcard support': cacard} 4052bb647c49SPaolo Bonzinisummary_info += {'U2F support': u2f} 4053bb647c49SPaolo Bonzinisummary_info += {'libusb': libusb} 4054bb647c49SPaolo Bonzinisummary_info += {'usb net redir': usbredir} 405588b6e618SPaolo Bonzinisummary_info += {'OpenGL support (epoxy)': opengl} 4056bb647c49SPaolo Bonzinisummary_info += {'GBM': gbm} 4057bb647c49SPaolo Bonzinisummary_info += {'libiscsi support': libiscsi} 4058bb647c49SPaolo Bonzinisummary_info += {'libnfs support': libnfs} 4059f9332757SPaolo Bonziniif targetos == 'windows' 406020cf5cb4SPaolo Bonzini if have_ga 40618821a389SMarc-André Lureau summary_info += {'QGA VSS support': have_qga_vss} 4062b846ab7cSPaolo Bonzini endif 4063f9332757SPaolo Bonziniendif 4064bb647c49SPaolo Bonzinisummary_info += {'seccomp support': seccomp} 4065bb647c49SPaolo Bonzinisummary_info += {'GlusterFS support': glusterfs} 40660d04c4c9SPaolo Bonzinisummary_info += {'TPM support': have_tpm} 4067e6a52b36SThomas Huthsummary_info += {'libssh support': libssh} 4068bb647c49SPaolo Bonzinisummary_info += {'lzo support': lzo} 4069bb647c49SPaolo Bonzinisummary_info += {'snappy support': snappy} 4070bb647c49SPaolo Bonzinisummary_info += {'bzip2 support': libbzip2} 4071bb647c49SPaolo Bonzinisummary_info += {'lzfse support': liblzfse} 4072bb647c49SPaolo Bonzinisummary_info += {'zstd support': zstd} 4073488a8c73SPaolo Bonzinisummary_info += {'NUMA host support': numa} 407483602083SThomas Huthsummary_info += {'capstone': capstone} 4075bb647c49SPaolo Bonzinisummary_info += {'libpmem support': libpmem} 4076bb647c49SPaolo Bonzinisummary_info += {'libdaxctl support': libdaxctl} 4077bb647c49SPaolo Bonzinisummary_info += {'libudev': libudev} 4078bb647c49SPaolo Bonzini# Dummy dependency, keep .found() 4079df4ea709SMax Reitzsummary_info += {'FUSE lseek': fuse_lseek.found()} 40803d212b41SRichard W.M. Jonessummary_info += {'selinux': selinux} 40817c10cb38SIlya Leoshkevichsummary_info += {'libdw': libdw} 408269a78cceSPhilippe Mathieu-Daudésummary(summary_info, bool_yn: true, section: 'Dependencies') 4083f9332757SPaolo Bonzini 4084f9332757SPaolo Bonziniif not supported_cpus.contains(cpu) 4085f9332757SPaolo Bonzini message() 4086f9332757SPaolo Bonzini warning('SUPPORT FOR THIS HOST CPU WILL GO AWAY IN FUTURE RELEASES!') 4087f9332757SPaolo Bonzini message() 4088f9332757SPaolo Bonzini message('CPU host architecture ' + cpu + ' support is not currently maintained.') 4089f9332757SPaolo Bonzini message('The QEMU project intends to remove support for this host CPU in') 4090f9332757SPaolo Bonzini message('a future release if nobody volunteers to maintain it and to') 4091f9332757SPaolo Bonzini message('provide a build host for our continuous integration setup.') 4092f9332757SPaolo Bonzini message('configure has succeeded and you can continue to build, but') 4093f9332757SPaolo Bonzini message('if you care about QEMU on this platform you should contact') 4094f9332757SPaolo Bonzini message('us upstream at qemu-devel@nongnu.org.') 4095f9332757SPaolo Bonziniendif 4096f9332757SPaolo Bonzini 4097f9332757SPaolo Bonziniif not supported_oses.contains(targetos) 4098f9332757SPaolo Bonzini message() 4099f9332757SPaolo Bonzini warning('WARNING: SUPPORT FOR THIS HOST OS WILL GO AWAY IN FUTURE RELEASES!') 4100f9332757SPaolo Bonzini message() 4101f9332757SPaolo Bonzini message('Host OS ' + targetos + 'support is not currently maintained.') 4102f9332757SPaolo Bonzini message('The QEMU project intends to remove support for this host OS in') 4103f9332757SPaolo Bonzini message('a future release if nobody volunteers to maintain it and to') 4104f9332757SPaolo Bonzini message('provide a build host for our continuous integration setup.') 4105f9332757SPaolo Bonzini message('configure has succeeded and you can continue to build, but') 4106f9332757SPaolo Bonzini message('if you care about QEMU on this platform you should contact') 4107f9332757SPaolo Bonzini message('us upstream at qemu-devel@nongnu.org.') 4108f9332757SPaolo Bonziniendif 4109