13b087f79SPaolo Bonziniproject('qemu', ['c'], meson_version: '>=0.63.0', 2654d6b04SPaolo Bonzini default_options: ['warning_level=1', 'c_std=gnu11', 'cpp_std=gnu++11', 'b_colorout=auto', 30a31e3a0SPaolo Bonzini 'b_staticpic=false', 'stdsplit=false', 'optimization=2', 'b_pie=true'], 4654d6b04SPaolo Bonzini version: files('VERSION')) 5a5665051SPaolo Bonzini 6e287072bSThomas Huthadd_test_setup('quick', exclude_suites: ['slow', 'thorough'], is_default: true) 7e287072bSThomas Huthadd_test_setup('slow', exclude_suites: ['thorough'], env: ['G_TEST_SLOW=1', 'SPEED=slow']) 8e287072bSThomas Huthadd_test_setup('thorough', env: ['G_TEST_SLOW=1', 'SPEED=thorough']) 93d2f73efSPaolo Bonzini 10cf60ccc3SAkihiko Odakimeson.add_postconf_script(find_program('scripts/symlink-install-tree.py')) 11cf60ccc3SAkihiko Odaki 12a5665051SPaolo Bonzininot_found = dependency('', required: false) 13b29b40f4SPaolo Bonzinikeyval = import('keyval') 14a81df1b6SPaolo Bonziniss = import('sourceset') 158b18cdbfSRichard Hendersonfs = import('fs') 16a81df1b6SPaolo Bonzini 17e5134024SPaolo Bonzinitargetos = host_machine.system() 18ce1c1e7aSPaolo Bonzinish = find_program('sh') 19a5665051SPaolo Bonziniconfig_host = keyval.load(meson.current_build_dir() / 'config-host.mak') 20d7dedf42SPaolo Bonzini 21e5134024SPaolo Bonzinicc = meson.get_compiler('c') 22e5134024SPaolo Bonziniall_languages = ['c'] 23e5134024SPaolo Bonziniif add_languages('cpp', required: false, native: false) 24e5134024SPaolo Bonzini all_languages += ['cpp'] 25e5134024SPaolo Bonzini cxx = meson.get_compiler('cpp') 26e5134024SPaolo Bonziniendif 27e5134024SPaolo Bonziniif targetos == 'darwin' and \ 28e5134024SPaolo Bonzini add_languages('objc', required: get_option('cocoa'), native: false) 29e5134024SPaolo Bonzini all_languages += ['objc'] 30e5134024SPaolo Bonzini objc = meson.get_compiler('objc') 31e5134024SPaolo Bonziniendif 32e5134024SPaolo Bonzini 33e3667660SYonggang Luo# Temporary directory used for files created while 34e3667660SYonggang Luo# configure runs. Since it is in the build directory 35e3667660SYonggang Luo# we can safely blow away any previous version of it 36e3667660SYonggang Luo# (and we need not jump through hoops to try to delete 37e3667660SYonggang Luo# it when configure exits.) 38e3667660SYonggang Luotmpdir = meson.current_build_dir() / 'meson-private/temp' 398fe11232SMarc-André Lureau 408fe11232SMarc-André Lureauif get_option('qemu_suffix').startswith('/') 418fe11232SMarc-André Lureau error('qemu_suffix cannot start with a /') 428fe11232SMarc-André Lureauendif 438fe11232SMarc-André Lureau 4416bf7a33SPaolo Bonziniqemu_confdir = get_option('sysconfdir') / get_option('qemu_suffix') 45ab4c0996SMarc-André Lureauqemu_datadir = get_option('datadir') / get_option('qemu_suffix') 46491e74c1SMarc-André Lureauqemu_docdir = get_option('docdir') / get_option('qemu_suffix') 4716bf7a33SPaolo Bonziniqemu_moddir = get_option('libdir') / get_option('qemu_suffix') 4816bf7a33SPaolo Bonzini 4916bf7a33SPaolo Bonziniqemu_desktopdir = get_option('datadir') / 'applications' 5016bf7a33SPaolo Bonziniqemu_icondir = get_option('datadir') / 'icons' 5116bf7a33SPaolo Bonzini 52859aef02SPaolo Bonziniconfig_host_data = configuration_data() 53859aef02SPaolo Bonzinigenh = [] 54b83a80e8SVladimir Sementsov-Ogievskiyqapi_trace_events = [] 55a5665051SPaolo Bonzini 5620cf5cb4SPaolo Bonzinibsd_oses = ['gnu/kfreebsd', 'freebsd', 'netbsd', 'openbsd', 'dragonfly', 'darwin'] 57201e8ed7SPaolo Bonzinisupported_oses = ['windows', 'freebsd', 'netbsd', 'openbsd', 'darwin', 'sunos', 'linux'] 58ba0e7333SRichard Hendersonsupported_cpus = ['ppc', 'ppc64', 's390x', 'riscv', 'x86', 'x86_64', 596d0b52edSRichard Henderson 'arm', 'aarch64', 'loongarch64', 'mips', 'mips64', 'sparc64'] 60201e8ed7SPaolo Bonzini 61201e8ed7SPaolo Bonzinicpu = host_machine.cpu_family() 62c94c2394SRichard Henderson 63c94c2394SRichard Henderson# Unify riscv* to a single family. 64c94c2394SRichard Hendersonif cpu in ['riscv32', 'riscv64'] 65c94c2394SRichard Henderson cpu = 'riscv' 66c94c2394SRichard Hendersonendif 67c94c2394SRichard Henderson 6820cf5cb4SPaolo Bonzinitarget_dirs = config_host['TARGET_DIRS'].split() 6920cf5cb4SPaolo Bonzinihave_linux_user = false 7020cf5cb4SPaolo Bonzinihave_bsd_user = false 7120cf5cb4SPaolo Bonzinihave_system = false 7220cf5cb4SPaolo Bonziniforeach target : target_dirs 7320cf5cb4SPaolo Bonzini have_linux_user = have_linux_user or target.endswith('linux-user') 7420cf5cb4SPaolo Bonzini have_bsd_user = have_bsd_user or target.endswith('bsd-user') 7520cf5cb4SPaolo Bonzini have_system = have_system or target.endswith('-softmmu') 7620cf5cb4SPaolo Bonziniendforeach 7720cf5cb4SPaolo Bonzinihave_user = have_linux_user or have_bsd_user 7820cf5cb4SPaolo Bonzinihave_tools = get_option('tools') \ 7920cf5cb4SPaolo Bonzini .disable_auto_if(not have_system) \ 8020cf5cb4SPaolo Bonzini .allowed() 8120cf5cb4SPaolo Bonzinihave_ga = get_option('guest_agent') \ 8220cf5cb4SPaolo Bonzini .disable_auto_if(not have_system and not have_tools) \ 8328236ad8SBrad Smith .require(targetos in ['sunos', 'linux', 'windows', 'freebsd', 'netbsd', 'openbsd'], 8420cf5cb4SPaolo Bonzini error_message: 'unsupported OS for QEMU guest agent') \ 8520cf5cb4SPaolo Bonzini .allowed() 86*6002711cSPaolo Bonzinienable_modules = get_option('modules') \ 87*6002711cSPaolo Bonzini .require(targetos != 'windows', 88*6002711cSPaolo Bonzini error_message: 'Modules are not available for Windows') \ 89*6002711cSPaolo Bonzini .require(not get_option('prefer_static'), 90*6002711cSPaolo Bonzini error_message: 'Modules are incompatible with static linking') \ 91*6002711cSPaolo Bonzini .allowed() 9220cf5cb4SPaolo Bonzinihave_block = have_system or have_tools 9320cf5cb4SPaolo Bonzini 9420cf5cb4SPaolo Bonzinipython = import('python').find_installation() 9520cf5cb4SPaolo Bonzini 96823eb013SPaolo Bonziniif cpu not in supported_cpus 97823eb013SPaolo Bonzini host_arch = 'unknown' 98823eb013SPaolo Bonzinielif cpu == 'x86' 99823eb013SPaolo Bonzini host_arch = 'i386' 1000e3ed77dSRichard Hendersonelif cpu == 'mips64' 1010e3ed77dSRichard Henderson host_arch = 'mips' 102823eb013SPaolo Bonzinielse 103823eb013SPaolo Bonzini host_arch = cpu 104823eb013SPaolo Bonziniendif 105823eb013SPaolo Bonzini 1068a19980eSPaolo Bonziniif cpu in ['x86', 'x86_64'] 1078a19980eSPaolo Bonzini kvm_targets = ['i386-softmmu', 'x86_64-softmmu'] 1088a19980eSPaolo Bonzinielif cpu == 'aarch64' 1098a19980eSPaolo Bonzini kvm_targets = ['aarch64-softmmu'] 1108a19980eSPaolo Bonzinielif cpu == 's390x' 1118a19980eSPaolo Bonzini kvm_targets = ['s390x-softmmu'] 1128a19980eSPaolo Bonzinielif cpu in ['ppc', 'ppc64'] 1138a19980eSPaolo Bonzini kvm_targets = ['ppc-softmmu', 'ppc64-softmmu'] 114fbc5884cSHuacai Chenelif cpu in ['mips', 'mips64'] 115fbc5884cSHuacai Chen kvm_targets = ['mips-softmmu', 'mipsel-softmmu', 'mips64-softmmu', 'mips64el-softmmu'] 116fbf43c7dSYifei Jiangelif cpu in ['riscv'] 117fbf43c7dSYifei Jiang kvm_targets = ['riscv32-softmmu', 'riscv64-softmmu'] 1188a19980eSPaolo Bonzinielse 1198a19980eSPaolo Bonzini kvm_targets = [] 1208a19980eSPaolo Bonziniendif 1218a19980eSPaolo Bonzini 12244d3d898SIgor Mammedovkvm_targets_c = '""' 12343a363aeSPaolo Bonziniif get_option('kvm').allowed() and targetos == 'linux' 124e741aff0SIgor Mammedov kvm_targets_c = '"' + '" ,"'.join(kvm_targets) + '"' 125e741aff0SIgor Mammedovendif 126e741aff0SIgor Mammedovconfig_host_data.set('CONFIG_KVM_TARGETS', kvm_targets_c) 127e741aff0SIgor Mammedov 1288a19980eSPaolo Bonziniaccelerator_targets = { 'CONFIG_KVM': kvm_targets } 129844a06bbSAlexander Graf 130844a06bbSAlexander Grafif cpu in ['aarch64'] 131844a06bbSAlexander Graf accelerator_targets += { 132844a06bbSAlexander Graf 'CONFIG_HVF': ['aarch64-softmmu'] 133844a06bbSAlexander Graf } 134844a06bbSAlexander Grafendif 135844a06bbSAlexander Graf 1360c3e41d4SAlex Bennéeif cpu in ['x86', 'x86_64', 'arm', 'aarch64'] 1372a2d51bcSMarc-André Lureau # i386 emulator provides xenpv machine type for multiple architectures 1380c3e41d4SAlex Bennée accelerator_targets += { 1390c3e41d4SAlex Bennée 'CONFIG_XEN': ['i386-softmmu', 'x86_64-softmmu'], 1400c3e41d4SAlex Bennée } 1410c3e41d4SAlex Bennéeendif 1428a19980eSPaolo Bonziniif cpu in ['x86', 'x86_64'] 1438a19980eSPaolo Bonzini accelerator_targets += { 1448a19980eSPaolo Bonzini 'CONFIG_HAX': ['i386-softmmu', 'x86_64-softmmu'], 1458a19980eSPaolo Bonzini 'CONFIG_HVF': ['x86_64-softmmu'], 14674a414a1SReinoud Zandijk 'CONFIG_NVMM': ['i386-softmmu', 'x86_64-softmmu'], 1478a19980eSPaolo Bonzini 'CONFIG_WHPX': ['i386-softmmu', 'x86_64-softmmu'], 1488a19980eSPaolo Bonzini } 1498a19980eSPaolo Bonziniendif 1508a19980eSPaolo Bonzini 151a1b176f9SPaolo Bonzinimodular_tcg = [] 152a1b176f9SPaolo Bonzini# Darwin does not support references to thread-local variables in modules 153a1b176f9SPaolo Bonziniif targetos != 'darwin' 154dae0ec15SGerd Hoffmann modular_tcg = ['i386-softmmu', 'x86_64-softmmu'] 155a1b176f9SPaolo Bonziniendif 156dae0ec15SGerd Hoffmann 157eae9a1d1SPhilippe Mathieu-Daudéedk2_targets = [ 'arm-softmmu', 'aarch64-softmmu', 'i386-softmmu', 'x86_64-softmmu' ] 158e49c0ef6SPaolo Bonziniunpack_edk2_blobs = false 159e49c0ef6SPaolo Bonziniforeach target : edk2_targets 160e49c0ef6SPaolo Bonzini if target in target_dirs 161e49c0ef6SPaolo Bonzini bzip2 = find_program('bzip2', required: get_option('install_blobs')) 162e49c0ef6SPaolo Bonzini unpack_edk2_blobs = bzip2.found() 163e49c0ef6SPaolo Bonzini break 164eae9a1d1SPhilippe Mathieu-Daudé endif 165e49c0ef6SPaolo Bonziniendforeach 16645b545ddSPhilippe Mathieu-Daudé 1679c29b741SPaolo Bonzinidtrace = not_found 1689c29b741SPaolo Bonzinistap = not_found 1699c29b741SPaolo Bonziniif 'dtrace' in get_option('trace_backends') 1709c29b741SPaolo Bonzini dtrace = find_program('dtrace', required: true) 1719c29b741SPaolo Bonzini stap = find_program('stap', required: false) 1729c29b741SPaolo Bonzini if stap.found() 1739c29b741SPaolo Bonzini # Workaround to avoid dtrace(1) producing a file with 'hidden' symbol 1749c29b741SPaolo Bonzini # visibility. Define STAP_SDT_V2 to produce 'default' symbol visibility 1759c29b741SPaolo Bonzini # instead. QEMU --enable-modules depends on this because the SystemTap 1769c29b741SPaolo Bonzini # semaphores are linked into the main binary and not the module's shared 1779c29b741SPaolo Bonzini # object. 1789c29b741SPaolo Bonzini add_global_arguments('-DSTAP_SDT_V2', 179e5134024SPaolo Bonzini native: false, language: all_languages) 1809c29b741SPaolo Bonzini endif 1819c29b741SPaolo Bonziniendif 1829c29b741SPaolo Bonzini 18340c909f5SPaolo Bonziniif get_option('iasl') == '' 18440c909f5SPaolo Bonzini iasl = find_program('iasl', required: false) 18540c909f5SPaolo Bonzinielse 18640c909f5SPaolo Bonzini iasl = find_program(get_option('iasl'), required: true) 18740c909f5SPaolo Bonziniendif 18840c909f5SPaolo Bonzini 189201e8ed7SPaolo Bonzini################## 190201e8ed7SPaolo Bonzini# Compiler flags # 191201e8ed7SPaolo Bonzini################## 192201e8ed7SPaolo Bonzini 1938cc2d231SPaolo Bonziniqemu_cflags = config_host['QEMU_CFLAGS'].split() 1944cb37d11SPhilippe Mathieu-Daudéqemu_objcflags = config_host['QEMU_OBJCFLAGS'].split() 1958cc2d231SPaolo Bonziniqemu_ldflags = config_host['QEMU_LDFLAGS'].split() 1968cc2d231SPaolo Bonzini 197a0cbd2e8SPaolo Bonziniif get_option('prefer_static') 198e4333d14SPaolo Bonzini qemu_ldflags += get_option('b_pie') ? '-static-pie' : '-static' 199e4333d14SPaolo Bonziniendif 200e4333d14SPaolo Bonzini 201e4333d14SPaolo Bonzini# Detect support for PT_GNU_RELRO + DT_BIND_NOW. 202e4333d14SPaolo Bonzini# The combination is known as "full relro", because .got.plt is read-only too. 203e4333d14SPaolo Bonziniqemu_ldflags += cc.get_supported_link_arguments('-Wl,-z,relro', '-Wl,-z,now') 204e4333d14SPaolo Bonzini 205d2147e04SPaolo Bonziniif targetos == 'windows' 206d2147e04SPaolo Bonzini qemu_ldflags += cc.get_supported_link_arguments('-Wl,--no-seh', '-Wl,--nxcompat') 2072d73fa74SPaolo Bonzini qemu_ldflags += cc.get_supported_link_arguments('-Wl,--dynamicbase', '-Wl,--high-entropy-va') 208d2147e04SPaolo Bonziniendif 209d2147e04SPaolo Bonzini 210c55cf6abSPaolo Bonziniif get_option('gprof') 211c55cf6abSPaolo Bonzini qemu_cflags += ['-p'] 2124cb37d11SPhilippe Mathieu-Daudé qemu_objcflags += ['-p'] 213c55cf6abSPaolo Bonzini qemu_ldflags += ['-p'] 214c55cf6abSPaolo Bonziniendif 215c55cf6abSPaolo Bonzini 216ff9ed62bSAlexander Bulekov# Specify linker-script with add_project_link_arguments so that it is not placed 217ff9ed62bSAlexander Bulekov# within a linker --start-group/--end-group pair 218537b7248SPaolo Bonziniif get_option('fuzzing') 219537b7248SPaolo Bonzini # Specify a filter to only instrument code that is directly related to 220537b7248SPaolo Bonzini # virtual-devices. 221537b7248SPaolo Bonzini configure_file(output: 'instrumentation-filter', 222537b7248SPaolo Bonzini input: 'scripts/oss-fuzz/instrumentation-filter-template', 223537b7248SPaolo Bonzini copy: true) 224aa4f3a3bSAlexander Bulekov 225aa4f3a3bSAlexander Bulekov if cc.compiles('int main () { return 0; }', 226aa4f3a3bSAlexander Bulekov name: '-fsanitize-coverage-allowlist=/dev/null', 227e56d0970SAlexander Bulekov args: ['-fsanitize-coverage-allowlist=/dev/null', 228e56d0970SAlexander Bulekov '-fsanitize-coverage=trace-pc'] ) 229aa4f3a3bSAlexander Bulekov add_global_arguments('-fsanitize-coverage-allowlist=instrumentation-filter', 230e5134024SPaolo Bonzini native: false, language: all_languages) 231aa4f3a3bSAlexander Bulekov endif 232537b7248SPaolo Bonzini 233537b7248SPaolo Bonzini if get_option('fuzzing_engine') == '' 234537b7248SPaolo Bonzini # Add CFLAGS to tell clang to add fuzzer-related instrumentation to all the 235537b7248SPaolo Bonzini # compiled code. To build non-fuzzer binaries with --enable-fuzzing, link 236537b7248SPaolo Bonzini # everything with fsanitize=fuzzer-no-link. Otherwise, the linker will be 237537b7248SPaolo Bonzini # unable to bind the fuzzer-related callbacks added by instrumentation. 238537b7248SPaolo Bonzini add_global_arguments('-fsanitize=fuzzer-no-link', 239e5134024SPaolo Bonzini native: false, language: all_languages) 240537b7248SPaolo Bonzini add_global_link_arguments('-fsanitize=fuzzer-no-link', 241e5134024SPaolo Bonzini native: false, language: all_languages) 242537b7248SPaolo Bonzini # For the actual fuzzer binaries, we need to link against the libfuzzer 243537b7248SPaolo Bonzini # library. They need to be configurable, to support OSS-Fuzz 244537b7248SPaolo Bonzini fuzz_exe_ldflags = ['-fsanitize=fuzzer'] 245537b7248SPaolo Bonzini else 246537b7248SPaolo Bonzini # LIB_FUZZING_ENGINE was set; assume we are running on OSS-Fuzz, and 247537b7248SPaolo Bonzini # the needed CFLAGS have already been provided 248537b7248SPaolo Bonzini fuzz_exe_ldflags = get_option('fuzzing_engine').split() 249537b7248SPaolo Bonzini endif 250ff9ed62bSAlexander Bulekovendif 251ff9ed62bSAlexander Bulekov 252b485458eSPaolo Bonzini# Check that the C++ compiler exists and works with the C compiler. 253b485458eSPaolo Bonzinilink_language = 'c' 254b485458eSPaolo Bonzinilinker = cc 255b485458eSPaolo Bonziniqemu_cxxflags = [] 256e5134024SPaolo Bonziniif 'cpp' in all_languages 257b485458eSPaolo Bonzini add_global_arguments(['-D__STDC_LIMIT_MACROS', '-D__STDC_CONSTANT_MACROS', '-D__STDC_FORMAT_MACROS'], 258b485458eSPaolo Bonzini native: false, language: 'cpp') 259b485458eSPaolo Bonzini foreach k: qemu_cflags 260b485458eSPaolo Bonzini if k not in ['-Wstrict-prototypes', '-Wmissing-prototypes', '-Wnested-externs', 261b485458eSPaolo Bonzini '-Wold-style-declaration', '-Wold-style-definition', '-Wredundant-decls'] 262b485458eSPaolo Bonzini qemu_cxxflags += [k] 263b485458eSPaolo Bonzini endif 264b485458eSPaolo Bonzini endforeach 265b485458eSPaolo Bonzini 266b485458eSPaolo Bonzini if cxx.links(files('scripts/main.c'), args: qemu_cflags) 267b485458eSPaolo Bonzini link_language = 'cpp' 268b485458eSPaolo Bonzini linker = cxx 269b485458eSPaolo Bonzini else 270b485458eSPaolo Bonzini message('C++ compiler does not work with C compiler') 271b485458eSPaolo Bonzini message('Disabling C++-specific optional code') 272b485458eSPaolo Bonzini endif 273b485458eSPaolo Bonziniendif 274b485458eSPaolo Bonzini 275e4333d14SPaolo Bonzini# Exclude --warn-common with TSan to suppress warnings from the TSan libraries. 276e4333d14SPaolo Bonziniif targetos != 'sunos' and not config_host.has_key('CONFIG_TSAN') 277e4333d14SPaolo Bonzini qemu_ldflags += linker.get_supported_link_arguments('-Wl,--warn-common') 278e4333d14SPaolo Bonziniendif 279e4333d14SPaolo Bonzini 280e5134024SPaolo Bonziniadd_global_link_arguments(qemu_ldflags, native: false, language: all_languages) 281a5665051SPaolo Bonzini 282e5134024SPaolo Bonziniadd_global_arguments(qemu_cflags, native: false, language: 'c') 283e5134024SPaolo Bonziniadd_global_arguments(qemu_cxxflags, native: false, language: 'cpp') 284e5134024SPaolo Bonziniadd_global_arguments(qemu_objcflags, native: false, language: 'objc') 2851e6e616dSPaolo Bonziniif targetos == 'linux' 2861e6e616dSPaolo Bonzini add_project_arguments('-isystem', meson.current_source_dir() / 'linux-headers', 2871e6e616dSPaolo Bonzini '-isystem', 'linux-headers', 288e5134024SPaolo Bonzini language: all_languages) 2891e6e616dSPaolo Bonziniendif 2901e6e616dSPaolo Bonzini 29123a77b2dSPaolo Bonziniadd_project_arguments('-iquote', '.', 2921e6e616dSPaolo Bonzini '-iquote', meson.current_source_dir(), 2931e6e616dSPaolo Bonzini '-iquote', meson.current_source_dir() / 'include', 294e5134024SPaolo Bonzini language: all_languages) 295a5665051SPaolo Bonzini 296deb62371SPaolo Bonzinisparse = find_program('cgcc', required: get_option('sparse')) 297deb62371SPaolo Bonziniif sparse.found() 298968b4db3SPaolo Bonzini run_target('sparse', 299968b4db3SPaolo Bonzini command: [find_program('scripts/check_sparse.py'), 300deb62371SPaolo Bonzini 'compile_commands.json', sparse.full_path(), '-Wbitwise', 301deb62371SPaolo Bonzini '-Wno-transparent-union', '-Wno-old-initializer', 302deb62371SPaolo Bonzini '-Wno-non-pointer-null']) 303968b4db3SPaolo Bonziniendif 304968b4db3SPaolo Bonzini 3056ec0e15dSPaolo Bonzini########################################### 3066ec0e15dSPaolo Bonzini# Target-specific checks and dependencies # 3076ec0e15dSPaolo Bonzini########################################### 3086ec0e15dSPaolo Bonzini 309b7a75c8cSPaolo Bonzini# Fuzzing 310537b7248SPaolo Bonziniif get_option('fuzzing') and get_option('fuzzing_engine') == '' and \ 311537b7248SPaolo Bonzini not cc.links(''' 312537b7248SPaolo Bonzini #include <stdint.h> 313537b7248SPaolo Bonzini #include <sys/types.h> 314537b7248SPaolo Bonzini int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size); 315537b7248SPaolo Bonzini int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { return 0; } 316537b7248SPaolo Bonzini ''', 317537b7248SPaolo Bonzini args: ['-Werror', '-fsanitize=fuzzer']) 318537b7248SPaolo Bonzini error('Your compiler does not support -fsanitize=fuzzer') 319537b7248SPaolo Bonziniendif 320537b7248SPaolo Bonzini 321b7a75c8cSPaolo Bonzini# Tracing backends 3229c29b741SPaolo Bonziniif 'ftrace' in get_option('trace_backends') and targetos != 'linux' 3239c29b741SPaolo Bonzini error('ftrace is supported only on Linux') 3249c29b741SPaolo Bonziniendif 3259c29b741SPaolo Bonziniif 'syslog' in get_option('trace_backends') and not cc.compiles(''' 3269c29b741SPaolo Bonzini #include <syslog.h> 3279c29b741SPaolo Bonzini int main(void) { 3289c29b741SPaolo Bonzini openlog("qemu", LOG_PID, LOG_DAEMON); 3299c29b741SPaolo Bonzini syslog(LOG_INFO, "configure"); 3309c29b741SPaolo Bonzini return 0; 3319c29b741SPaolo Bonzini }''') 3329c29b741SPaolo Bonzini error('syslog is not supported on this system') 3339c29b741SPaolo Bonziniendif 3349c29b741SPaolo Bonzini 335b7a75c8cSPaolo Bonzini# Miscellaneous Linux-only features 336a436d6d4SPaolo Bonziniget_option('mpath') \ 337a436d6d4SPaolo Bonzini .require(targetos == 'linux', error_message: 'Multipath is supported only on Linux') 3386ec0e15dSPaolo Bonzini 339a436d6d4SPaolo Bonzinimultiprocess_allowed = get_option('multiprocess') \ 340a436d6d4SPaolo Bonzini .require(targetos == 'linux', error_message: 'Multiprocess QEMU is supported only on Linux') \ 341a436d6d4SPaolo Bonzini .allowed() 342106ad1f9SPaolo Bonzini 34355116968SJagannathan Ramanvfio_user_server_allowed = get_option('vfio_user_server') \ 34455116968SJagannathan Raman .require(targetos == 'linux', error_message: 'vfio-user server is supported only on Linux') \ 34555116968SJagannathan Raman .allowed() 34655116968SJagannathan Raman 3470d04c4c9SPaolo Bonzinihave_tpm = get_option('tpm') \ 3480d04c4c9SPaolo Bonzini .require(targetos != 'windows', error_message: 'TPM emulation only available on POSIX systems') \ 3490d04c4c9SPaolo Bonzini .allowed() 3500d04c4c9SPaolo Bonzini 3512a3129a3SPaolo Bonzini# vhost 3522df89d54SPaolo Bonzinihave_vhost_user = get_option('vhost_user') \ 3532df89d54SPaolo Bonzini .disable_auto_if(targetos != 'linux') \ 3542df89d54SPaolo Bonzini .require(targetos != 'windows', 3552df89d54SPaolo Bonzini error_message: 'vhost-user is not available on Windows').allowed() 3562df89d54SPaolo Bonzinihave_vhost_vdpa = get_option('vhost_vdpa') \ 3572df89d54SPaolo Bonzini .require(targetos == 'linux', 3582df89d54SPaolo Bonzini error_message: 'vhost-vdpa is only available on Linux').allowed() 3592df89d54SPaolo Bonzinihave_vhost_kernel = get_option('vhost_kernel') \ 3602df89d54SPaolo Bonzini .require(targetos == 'linux', 3612df89d54SPaolo Bonzini error_message: 'vhost-kernel is only available on Linux').allowed() 3622df89d54SPaolo Bonzinihave_vhost_user_crypto = get_option('vhost_crypto') \ 3632df89d54SPaolo Bonzini .require(have_vhost_user, 3642df89d54SPaolo Bonzini error_message: 'vhost-crypto requires vhost-user to be enabled').allowed() 3652df89d54SPaolo Bonzini 36643b6d7eeSPaolo Bonzinihave_vhost = have_vhost_user or have_vhost_vdpa or have_vhost_kernel 3672df89d54SPaolo Bonzini 3682df89d54SPaolo Bonzinihave_vhost_net_user = have_vhost_user and get_option('vhost_net').allowed() 3692df89d54SPaolo Bonzinihave_vhost_net_vdpa = have_vhost_vdpa and get_option('vhost_net').allowed() 3702df89d54SPaolo Bonzinihave_vhost_net_kernel = have_vhost_kernel and get_option('vhost_net').allowed() 3712df89d54SPaolo Bonzinihave_vhost_net = have_vhost_net_kernel or have_vhost_net_user or have_vhost_net_vdpa 3722a3129a3SPaolo Bonzini 373b7a75c8cSPaolo Bonzini# Target-specific libraries and flags 3747fa1c635SPaolo Bonzinilibm = cc.find_library('m', required: false) 3756d7c7c2dSPaolo Bonzinithreads = dependency('threads') 376a81df1b6SPaolo Bonziniutil = cc.find_library('util', required: false) 3774a96337dSPaolo Bonziniwinmm = [] 378a81df1b6SPaolo Bonzinisocket = [] 37904c6f1e7SMarc-André Lureauversion_res = [] 380d92989aaSMarc-André Lureaucoref = [] 381d92989aaSMarc-André Lureauiokit = [] 382b6c7cfd4SPaolo Bonziniemulator_link_args = [] 38374a414a1SReinoud Zandijknvmm =not_found 3848a19980eSPaolo Bonzinihvf = not_found 38523011f44SMarc-André Lureaumidl = not_found 38623011f44SMarc-André Lureauwidl = not_found 387cf60ccc3SAkihiko Odakipathcch = not_found 388a6305081SPaolo Bonzinihost_dsosuf = '.so' 389a81df1b6SPaolo Bonziniif targetos == 'windows' 39023011f44SMarc-André Lureau midl = find_program('midl', required: false) 39123011f44SMarc-André Lureau widl = find_program('widl', required: false) 392cf60ccc3SAkihiko Odaki pathcch = cc.find_library('pathcch') 393a81df1b6SPaolo Bonzini socket = cc.find_library('ws2_32') 3944a96337dSPaolo Bonzini winmm = cc.find_library('winmm') 39504c6f1e7SMarc-André Lureau 39604c6f1e7SMarc-André Lureau win = import('windows') 39704c6f1e7SMarc-André Lureau version_res = win.compile_resources('version.rc', 39804c6f1e7SMarc-André Lureau depend_files: files('pc-bios/qemu-nsis.ico'), 39904c6f1e7SMarc-André Lureau include_directories: include_directories('.')) 400a6305081SPaolo Bonzini host_dsosuf = '.dll' 401d92989aaSMarc-André Lureauelif targetos == 'darwin' 402d92989aaSMarc-André Lureau coref = dependency('appleframeworks', modules: 'CoreFoundation') 40314176c8dSJoelle van Dyne iokit = dependency('appleframeworks', modules: 'IOKit', required: false) 404a6305081SPaolo Bonzini host_dsosuf = '.dylib' 405cfad62f1SPaolo Bonzinielif targetos == 'sunos' 406cfad62f1SPaolo Bonzini socket = [cc.find_library('socket'), 407cfad62f1SPaolo Bonzini cc.find_library('nsl'), 408cfad62f1SPaolo Bonzini cc.find_library('resolv')] 409cfad62f1SPaolo Bonzinielif targetos == 'haiku' 410cfad62f1SPaolo Bonzini socket = [cc.find_library('posix_error_mapper'), 411cfad62f1SPaolo Bonzini cc.find_library('network'), 412cfad62f1SPaolo Bonzini cc.find_library('bsd')] 413b6c7cfd4SPaolo Bonzinielif targetos == 'openbsd' 41443a363aeSPaolo Bonzini if get_option('tcg').allowed() and target_dirs.length() > 0 415b6c7cfd4SPaolo Bonzini # Disable OpenBSD W^X if available 416b6c7cfd4SPaolo Bonzini emulator_link_args = cc.get_supported_link_arguments('-Wl,-z,wxneeded') 417b6c7cfd4SPaolo Bonzini endif 418a81df1b6SPaolo Bonziniendif 4196ec0e15dSPaolo Bonzini 420b7a75c8cSPaolo Bonzini# Target-specific configuration of accelerators 4218a19980eSPaolo Bonziniaccelerators = [] 42243a363aeSPaolo Bonziniif get_option('kvm').allowed() and targetos == 'linux' 4238a19980eSPaolo Bonzini accelerators += 'CONFIG_KVM' 4248a19980eSPaolo Bonziniendif 42543a363aeSPaolo Bonziniif get_option('whpx').allowed() and targetos == 'windows' 42657e2a1f8SSunil Muthuswamy if get_option('whpx').enabled() and host_machine.cpu() != 'x86_64' 4278a19980eSPaolo Bonzini error('WHPX requires 64-bit host') 4288a19980eSPaolo Bonzini elif cc.has_header('WinHvPlatform.h', required: get_option('whpx')) and \ 4298a19980eSPaolo Bonzini cc.has_header('WinHvEmulation.h', required: get_option('whpx')) 4308a19980eSPaolo Bonzini accelerators += 'CONFIG_WHPX' 4318a19980eSPaolo Bonzini endif 4328a19980eSPaolo Bonziniendif 43343a363aeSPaolo Bonziniif get_option('hvf').allowed() 4348a19980eSPaolo Bonzini hvf = dependency('appleframeworks', modules: 'Hypervisor', 4358a19980eSPaolo Bonzini required: get_option('hvf')) 4368a19980eSPaolo Bonzini if hvf.found() 4378a19980eSPaolo Bonzini accelerators += 'CONFIG_HVF' 4388a19980eSPaolo Bonzini endif 4398a19980eSPaolo Bonziniendif 44043a363aeSPaolo Bonziniif get_option('hax').allowed() 4418a19980eSPaolo Bonzini if get_option('hax').enabled() or targetos in ['windows', 'darwin', 'netbsd'] 4428a19980eSPaolo Bonzini accelerators += 'CONFIG_HAX' 4438a19980eSPaolo Bonzini endif 4448a19980eSPaolo Bonziniendif 44574a414a1SReinoud Zandijkif targetos == 'netbsd' 44674a414a1SReinoud Zandijk nvmm = cc.find_library('nvmm', required: get_option('nvmm')) 44774a414a1SReinoud Zandijk if nvmm.found() 44874a414a1SReinoud Zandijk accelerators += 'CONFIG_NVMM' 44974a414a1SReinoud Zandijk endif 45074a414a1SReinoud Zandijkendif 45123a77b2dSPaolo Bonzini 452823eb013SPaolo Bonzinitcg_arch = host_arch 45343a363aeSPaolo Bonziniif get_option('tcg').allowed() 454823eb013SPaolo Bonzini if host_arch == 'unknown' 45523a77b2dSPaolo Bonzini if get_option('tcg_interpreter') 456f1f727acSPhilippe Mathieu-Daudé warning('Unsupported CPU @0@, will use TCG with TCI (slow)'.format(cpu)) 4578a19980eSPaolo Bonzini else 4588a19980eSPaolo Bonzini error('Unsupported CPU @0@, try --enable-tcg-interpreter'.format(cpu)) 4598a19980eSPaolo Bonzini endif 460fa2f7b0bSPhilippe Mathieu-Daudé elif get_option('tcg_interpreter') 4611c282da3SPhilippe Mathieu-Daudé warning('Use of the TCG interpreter is not recommended on this host') 462fa2f7b0bSPhilippe Mathieu-Daudé warning('architecture. There is a native TCG execution backend available') 463fa2f7b0bSPhilippe Mathieu-Daudé warning('which provides substantially better performance and reliability.') 464fa2f7b0bSPhilippe Mathieu-Daudé warning('It is strongly recommended to remove the --enable-tcg-interpreter') 465fa2f7b0bSPhilippe Mathieu-Daudé warning('configuration option on this architecture to use the native') 466fa2f7b0bSPhilippe Mathieu-Daudé warning('backend.') 4678a19980eSPaolo Bonzini endif 46823a77b2dSPaolo Bonzini if get_option('tcg_interpreter') 46923a77b2dSPaolo Bonzini tcg_arch = 'tci' 470ed145144SRichard Henderson config_host += { 'CONFIG_TCG_INTERPRETER': 'y' } 471823eb013SPaolo Bonzini elif host_arch == 'x86_64' 47223a77b2dSPaolo Bonzini tcg_arch = 'i386' 473823eb013SPaolo Bonzini elif host_arch == 'ppc64' 47423a77b2dSPaolo Bonzini tcg_arch = 'ppc' 47523a77b2dSPaolo Bonzini endif 47623a77b2dSPaolo Bonzini add_project_arguments('-iquote', meson.current_source_dir() / 'tcg' / tcg_arch, 477e5134024SPaolo Bonzini language: all_languages) 47823a77b2dSPaolo Bonzini 4798a19980eSPaolo Bonzini accelerators += 'CONFIG_TCG' 4808a19980eSPaolo Bonzini config_host += { 'CONFIG_TCG': 'y' } 4818a19980eSPaolo Bonziniendif 4828a19980eSPaolo Bonzini 4838a19980eSPaolo Bonziniif 'CONFIG_KVM' not in accelerators and get_option('kvm').enabled() 4848a19980eSPaolo Bonzini error('KVM not available on this platform') 4858a19980eSPaolo Bonziniendif 4868a19980eSPaolo Bonziniif 'CONFIG_HVF' not in accelerators and get_option('hvf').enabled() 4878a19980eSPaolo Bonzini error('HVF not available on this platform') 4888a19980eSPaolo Bonziniendif 48974a414a1SReinoud Zandijkif 'CONFIG_NVMM' not in accelerators and get_option('nvmm').enabled() 49074a414a1SReinoud Zandijk error('NVMM not available on this platform') 49174a414a1SReinoud Zandijkendif 4928a19980eSPaolo Bonziniif 'CONFIG_WHPX' not in accelerators and get_option('whpx').enabled() 4938a19980eSPaolo Bonzini error('WHPX not available on this platform') 4948a19980eSPaolo Bonziniendif 495b4e312e9SPaolo Bonzini 4966ec0e15dSPaolo Bonzini################ 4976ec0e15dSPaolo Bonzini# Dependencies # 4986ec0e15dSPaolo Bonzini################ 4996ec0e15dSPaolo Bonzini 500fc9a809eSPaolo Bonzini# When bumping glib minimum version, please check also whether to increase 501fc9a809eSPaolo Bonzini# the _WIN32_WINNT setting in osdep.h according to the value from glib 502fc9a809eSPaolo Bonziniglib_req_ver = '>=2.56.0' 503fc9a809eSPaolo Bonziniglib_pc = dependency('glib-2.0', version: glib_req_ver, required: true, 504fc9a809eSPaolo Bonzini method: 'pkg-config') 505fc9a809eSPaolo Bonziniglib_cflags = [] 506*6002711cSPaolo Bonziniif enable_modules 507fc9a809eSPaolo Bonzini gmodule = dependency('gmodule-export-2.0', version: glib_req_ver, required: true, 508fc9a809eSPaolo Bonzini method: 'pkg-config') 509fc9a809eSPaolo Bonzinielif config_host.has_key('CONFIG_PLUGIN') 510fc9a809eSPaolo Bonzini gmodule = dependency('gmodule-no-export-2.0', version: glib_req_ver, required: true, 511fc9a809eSPaolo Bonzini method: 'pkg-config') 512fc9a809eSPaolo Bonzinielse 513fc9a809eSPaolo Bonzini gmodule = not_found 514e3feb2ccSEmilio Cotaendif 515953d5a9eSMarc-André Lureau 516fc9a809eSPaolo Bonzini# This workaround is required due to a bug in pkg-config file for glib as it 517fc9a809eSPaolo Bonzini# doesn't define GLIB_STATIC_COMPILATION for pkg-config --static 518fc9a809eSPaolo Bonziniif targetos == 'windows' and get_option('prefer_static') 519fc9a809eSPaolo Bonzini glib_cflags += ['-DGLIB_STATIC_COMPILATION'] 520fc9a809eSPaolo Bonziniendif 521fc9a809eSPaolo Bonzini 522fc9a809eSPaolo Bonzini# Sanity check that the current size_t matches the 523fc9a809eSPaolo Bonzini# size that glib thinks it should be. This catches 524fc9a809eSPaolo Bonzini# problems on multi-arch where people try to build 525fc9a809eSPaolo Bonzini# 32-bit QEMU while pointing at 64-bit glib headers 526fc9a809eSPaolo Bonzini 527fc9a809eSPaolo Bonziniif not cc.compiles(''' 528fc9a809eSPaolo Bonzini #include <glib.h> 529fc9a809eSPaolo Bonzini #include <unistd.h> 530fc9a809eSPaolo Bonzini 531fc9a809eSPaolo Bonzini #define QEMU_BUILD_BUG_ON(x) \ 532fc9a809eSPaolo Bonzini typedef char qemu_build_bug_on[(x)?-1:1] __attribute__((unused)); 533fc9a809eSPaolo Bonzini 534fc9a809eSPaolo Bonzini int main(void) { 535fc9a809eSPaolo Bonzini QEMU_BUILD_BUG_ON(sizeof(size_t) != GLIB_SIZEOF_SIZE_T); 536fc9a809eSPaolo Bonzini return 0; 537fc9a809eSPaolo Bonzini }''', dependencies: glib_pc, args: glib_cflags) 538fc9a809eSPaolo Bonzini error('''sizeof(size_t) doesn't match GLIB_SIZEOF_SIZE_T. 539fc9a809eSPaolo Bonzini You probably need to set PKG_CONFIG_LIBDIR" to point 540fc9a809eSPaolo Bonzini to the right pkg-config files for your build target.''') 541fc9a809eSPaolo Bonziniendif 542fc9a809eSPaolo Bonzini 543fc9a809eSPaolo Bonzini# Silence clang warnings triggered by glib < 2.57.2 544fc9a809eSPaolo Bonziniif not cc.compiles(''' 545fc9a809eSPaolo Bonzini #include <glib.h> 546fc9a809eSPaolo Bonzini typedef struct Foo { 547fc9a809eSPaolo Bonzini int i; 548fc9a809eSPaolo Bonzini } Foo; 549fc9a809eSPaolo Bonzini static void foo_free(Foo *f) 550fc9a809eSPaolo Bonzini { 551fc9a809eSPaolo Bonzini g_free(f); 552fc9a809eSPaolo Bonzini } 553fc9a809eSPaolo Bonzini G_DEFINE_AUTOPTR_CLEANUP_FUNC(Foo, foo_free) 554fc9a809eSPaolo Bonzini int main(void) { return 0; }''', dependencies: glib_pc, args: ['-Werror']) 555fc9a809eSPaolo Bonzini glib_cflags += cc.get_supported_arguments('-Wno-unused-function') 556fc9a809eSPaolo Bonziniendif 557fc9a809eSPaolo Bonziniglib = declare_dependency(dependencies: [glib_pc, gmodule], 558fc9a809eSPaolo Bonzini compile_args: glib_cflags, 559fc9a809eSPaolo Bonzini version: glib_pc.version()) 560fc9a809eSPaolo Bonzini 561fc9a809eSPaolo Bonzini# Check whether glib has gslice, which we have to avoid for correctness. 562fc9a809eSPaolo Bonzini# TODO: remove this check and the corresponding workaround (qtree) when 563fc9a809eSPaolo Bonzini# the minimum supported glib is >= 2.75.3 564fc9a809eSPaolo Bonziniglib_has_gslice = glib.version().version_compare('<2.75.3') 565fc9a809eSPaolo Bonzini 566fc9a809eSPaolo Bonzini# override glib dep to include the above refinements 567fc9a809eSPaolo Bonzinimeson.override_dependency('glib-2.0', glib) 568fc9a809eSPaolo Bonzini 569fc9a809eSPaolo Bonzini# The path to glib.h is added to all compilation commands. 570fc9a809eSPaolo Bonziniadd_project_dependencies(glib.partial_dependency(compile_args: true, includes: true), 571fc9a809eSPaolo Bonzini native: false, language: all_languages) 572fc9a809eSPaolo Bonzini 573a81df1b6SPaolo Bonzinigio = not_found 5747544060eSPaolo Bonzinigdbus_codegen = not_found 575bb2dc4b7SPaolo Bonzinigdbus_codegen_error = '@0@ requires gdbus-codegen, please install libgio' 5767544060eSPaolo Bonziniif not get_option('gio').auto() or have_system 5777544060eSPaolo Bonzini gio = dependency('gio-2.0', required: get_option('gio'), 578063d5119SPaolo Bonzini method: 'pkg-config') 5797544060eSPaolo Bonzini if gio.found() and not cc.links(''' 5807544060eSPaolo Bonzini #include <gio/gio.h> 5817544060eSPaolo Bonzini int main(void) 5827544060eSPaolo Bonzini { 5837544060eSPaolo Bonzini g_dbus_proxy_new_sync(0, 0, 0, 0, 0, 0, 0, 0); 5847544060eSPaolo Bonzini return 0; 5857544060eSPaolo Bonzini }''', dependencies: [glib, gio]) 5867544060eSPaolo Bonzini if get_option('gio').enabled() 5877544060eSPaolo Bonzini error('The installed libgio is broken for static linking') 588a81df1b6SPaolo Bonzini endif 5897544060eSPaolo Bonzini gio = not_found 5907544060eSPaolo Bonzini endif 5917544060eSPaolo Bonzini if gio.found() 5927544060eSPaolo Bonzini gdbus_codegen = find_program(gio.get_variable('gdbus_codegen'), 5937544060eSPaolo Bonzini required: get_option('gio')) 5947544060eSPaolo Bonzini gio_unix = dependency('gio-unix-2.0', required: get_option('gio'), 595063d5119SPaolo Bonzini method: 'pkg-config') 5967544060eSPaolo Bonzini gio = declare_dependency(dependencies: [gio, gio_unix], 5977544060eSPaolo Bonzini version: gio.version()) 5987544060eSPaolo Bonzini endif 5997544060eSPaolo Bonziniendif 600bb2dc4b7SPaolo Bonziniif gdbus_codegen.found() and get_option('cfi') 601bb2dc4b7SPaolo Bonzini gdbus_codegen = not_found 602bb2dc4b7SPaolo Bonzini gdbus_codegen_error = '@0@ uses gdbus-codegen, which does not support control flow integrity' 603bb2dc4b7SPaolo Bonziniendif 6047544060eSPaolo Bonzini 605a81df1b6SPaolo Bonzinilttng = not_found 6069c29b741SPaolo Bonziniif 'ust' in get_option('trace_backends') 607e32aaa5aSMarc-André Lureau lttng = dependency('lttng-ust', required: true, version: '>= 2.1', 608063d5119SPaolo Bonzini method: 'pkg-config') 609a81df1b6SPaolo Bonziniendif 610b7612f45SPaolo Bonzinipixman = not_found 611b7612f45SPaolo Bonziniif have_system or have_tools 612b7612f45SPaolo Bonzini pixman = dependency('pixman-1', required: have_system, version:'>=0.21.8', 613063d5119SPaolo Bonzini method: 'pkg-config') 614b7612f45SPaolo Bonziniendif 615063d5119SPaolo Bonzinizlib = dependency('zlib', required: true) 61653c22b68SPaolo Bonzini 617ff66f3e5SPaolo Bonzinilibaio = not_found 618ff66f3e5SPaolo Bonziniif not get_option('linux_aio').auto() or have_block 619ff66f3e5SPaolo Bonzini libaio = cc.find_library('aio', has_headers: ['libaio.h'], 620063d5119SPaolo Bonzini required: get_option('linux_aio')) 621ff66f3e5SPaolo Bonziniendif 622354081d4SLeonardo Bras 623354081d4SLeonardo Braslinux_io_uring_test = ''' 624354081d4SLeonardo Bras #include <liburing.h> 625354081d4SLeonardo Bras #include <linux/errqueue.h> 626354081d4SLeonardo Bras 627354081d4SLeonardo Bras int main(void) { return 0; }''' 628354081d4SLeonardo Bras 6295e5733e5SMarc-André Lureaulinux_io_uring = not_found 63053c22b68SPaolo Bonziniif not get_option('linux_io_uring').auto() or have_block 631a41b4fdcSDaniel P. Berrangé linux_io_uring = dependency('liburing', version: '>=0.3', 632a41b4fdcSDaniel P. Berrangé required: get_option('linux_io_uring'), 633063d5119SPaolo Bonzini method: 'pkg-config') 634354081d4SLeonardo Bras if not cc.links(linux_io_uring_test) 635354081d4SLeonardo Bras linux_io_uring = not_found 6365e5733e5SMarc-André Lureau endif 637354081d4SLeonardo Brasendif 638354081d4SLeonardo Bras 6395e5733e5SMarc-André Lureaulibnfs = not_found 64030045c05SPaolo Bonziniif not get_option('libnfs').auto() or have_block 64130045c05SPaolo Bonzini libnfs = dependency('libnfs', version: '>=1.9.3', 64230045c05SPaolo Bonzini required: get_option('libnfs'), 643063d5119SPaolo Bonzini method: 'pkg-config') 6445e5733e5SMarc-André Lureauendif 645f7f2d651SPaolo Bonzini 646f7f2d651SPaolo Bonzinilibattr_test = ''' 647f7f2d651SPaolo Bonzini #include <stddef.h> 648f7f2d651SPaolo Bonzini #include <sys/types.h> 649f7f2d651SPaolo Bonzini #ifdef CONFIG_LIBATTR 650f7f2d651SPaolo Bonzini #include <attr/xattr.h> 651f7f2d651SPaolo Bonzini #else 652f7f2d651SPaolo Bonzini #include <sys/xattr.h> 653f7f2d651SPaolo Bonzini #endif 654f7f2d651SPaolo Bonzini int main(void) { getxattr(NULL, NULL, NULL, 0); setxattr(NULL, NULL, NULL, 0, 0); return 0; }''' 655f7f2d651SPaolo Bonzini 656ec0d5893SMarc-André Lureaulibattr = not_found 657f7f2d651SPaolo Bonzinihave_old_libattr = false 65843a363aeSPaolo Bonziniif get_option('attr').allowed() 659f7f2d651SPaolo Bonzini if cc.links(libattr_test) 660f7f2d651SPaolo Bonzini libattr = declare_dependency() 661f7f2d651SPaolo Bonzini else 662f7f2d651SPaolo Bonzini libattr = cc.find_library('attr', has_headers: ['attr/xattr.h'], 663063d5119SPaolo Bonzini required: get_option('attr')) 664f7f2d651SPaolo Bonzini if libattr.found() and not \ 665f7f2d651SPaolo Bonzini cc.links(libattr_test, dependencies: libattr, args: '-DCONFIG_LIBATTR') 666f7f2d651SPaolo Bonzini libattr = not_found 667f7f2d651SPaolo Bonzini if get_option('attr').enabled() 668f7f2d651SPaolo Bonzini error('could not link libattr') 669f7f2d651SPaolo Bonzini else 670f7f2d651SPaolo Bonzini warning('could not link libattr, disabling') 671ec0d5893SMarc-André Lureau endif 672f7f2d651SPaolo Bonzini else 673f7f2d651SPaolo Bonzini have_old_libattr = libattr.found() 674f7f2d651SPaolo Bonzini endif 675f7f2d651SPaolo Bonzini endif 676f7f2d651SPaolo Bonziniendif 677f7f2d651SPaolo Bonzini 67852eaefd3SAkihiko Odakicocoa = dependency('appleframeworks', modules: ['Cocoa', 'CoreVideo'], 67952eaefd3SAkihiko Odaki required: get_option('cocoa')) 680c1ec4941SPaolo Bonzini 681e2c1d78dSVladislav Yaroshchukvmnet = dependency('appleframeworks', modules: 'vmnet', required: get_option('vmnet')) 682e2c1d78dSVladislav Yaroshchukif vmnet.found() and not cc.has_header_symbol('vmnet/vmnet.h', 683e2c1d78dSVladislav Yaroshchuk 'VMNET_BRIDGED_MODE', 684e2c1d78dSVladislav Yaroshchuk dependencies: vmnet) 685e2c1d78dSVladislav Yaroshchuk vmnet = not_found 686e2c1d78dSVladislav Yaroshchuk if get_option('vmnet').enabled() 687e2c1d78dSVladislav Yaroshchuk error('vmnet.framework API is outdated') 688e2c1d78dSVladislav Yaroshchuk else 689e2c1d78dSVladislav Yaroshchuk warning('vmnet.framework API is outdated, disabling') 690e2c1d78dSVladislav Yaroshchuk endif 691e2c1d78dSVladislav Yaroshchukendif 692e2c1d78dSVladislav Yaroshchuk 6933f99cf57SPaolo Bonziniseccomp = not_found 69473422d95SMichal Privoznikseccomp_has_sysrawrc = false 69590835c2bSPaolo Bonziniif not get_option('seccomp').auto() or have_system or have_tools 69690835c2bSPaolo Bonzini seccomp = dependency('libseccomp', version: '>=2.3.0', 69790835c2bSPaolo Bonzini required: get_option('seccomp'), 698063d5119SPaolo Bonzini method: 'pkg-config') 69973422d95SMichal Privoznik if seccomp.found() 70073422d95SMichal Privoznik seccomp_has_sysrawrc = cc.has_header_symbol('seccomp.h', 70173422d95SMichal Privoznik 'SCMP_FLTATR_API_SYSRAWRC', 70273422d95SMichal Privoznik dependencies: seccomp) 70373422d95SMichal Privoznik endif 7043f99cf57SPaolo Bonziniendif 705727c8bb8SPaolo Bonzini 7063f99cf57SPaolo Bonzinilibcap_ng = not_found 707727c8bb8SPaolo Bonziniif not get_option('cap_ng').auto() or have_system or have_tools 708727c8bb8SPaolo Bonzini libcap_ng = cc.find_library('cap-ng', has_headers: ['cap-ng.h'], 709063d5119SPaolo Bonzini required: get_option('cap_ng')) 7103f99cf57SPaolo Bonziniendif 711727c8bb8SPaolo Bonziniif libcap_ng.found() and not cc.links(''' 712727c8bb8SPaolo Bonzini #include <cap-ng.h> 713727c8bb8SPaolo Bonzini int main(void) 714727c8bb8SPaolo Bonzini { 715727c8bb8SPaolo Bonzini capng_capability_to_name(CAPNG_EFFECTIVE); 716727c8bb8SPaolo Bonzini return 0; 717727c8bb8SPaolo Bonzini }''', dependencies: libcap_ng) 718727c8bb8SPaolo Bonzini libcap_ng = not_found 719727c8bb8SPaolo Bonzini if get_option('cap_ng').enabled() 720727c8bb8SPaolo Bonzini error('could not link libcap-ng') 721727c8bb8SPaolo Bonzini else 722727c8bb8SPaolo Bonzini warning('could not link libcap-ng, disabling') 723727c8bb8SPaolo Bonzini endif 724727c8bb8SPaolo Bonziniendif 725727c8bb8SPaolo Bonzini 7261917ec6dSPaolo Bonziniif get_option('xkbcommon').auto() and not have_system and not have_tools 7271917ec6dSPaolo Bonzini xkbcommon = not_found 7281917ec6dSPaolo Bonzinielse 7291917ec6dSPaolo Bonzini xkbcommon = dependency('xkbcommon', required: get_option('xkbcommon'), 730063d5119SPaolo Bonzini method: 'pkg-config') 731ade60d4fSMarc-André Lureauendif 732e1723999SPaolo Bonzini 7335890258aSThomas Huthslirp = not_found 7345890258aSThomas Huthif not get_option('slirp').auto() or have_system 7355890258aSThomas Huth slirp = dependency('slirp', required: get_option('slirp'), 736063d5119SPaolo Bonzini method: 'pkg-config') 7375890258aSThomas Huth # slirp < 4.7 is incompatible with CFI support in QEMU. This is because 7385890258aSThomas Huth # it passes function pointers within libslirp as callbacks for timers. 7395890258aSThomas Huth # When using a system-wide shared libslirp, the type information for the 7405890258aSThomas Huth # callback is missing and the timer call produces a false positive with CFI. 7415890258aSThomas Huth # Do not use the "version" keyword argument to produce a better error. 7425890258aSThomas Huth # with control-flow integrity. 7435890258aSThomas Huth if get_option('cfi') and slirp.found() and slirp.version().version_compare('<4.7') 7445890258aSThomas Huth if get_option('slirp').enabled() 7455890258aSThomas Huth error('Control-Flow Integrity requires libslirp 4.7.') 7465890258aSThomas Huth else 7475890258aSThomas Huth warning('Cannot use libslirp since Control-Flow Integrity requires libslirp >= 4.7.') 7485890258aSThomas Huth slirp = not_found 7495890258aSThomas Huth endif 7505890258aSThomas Huth endif 7515890258aSThomas Huthendif 7525890258aSThomas Huth 753cdaf0722SMarc-André Lureauvde = not_found 754e1723999SPaolo Bonziniif not get_option('vde').auto() or have_system or have_tools 755e1723999SPaolo Bonzini vde = cc.find_library('vdeplug', has_headers: ['libvdeplug.h'], 756063d5119SPaolo Bonzini required: get_option('vde')) 757e1723999SPaolo Bonziniendif 758e1723999SPaolo Bonziniif vde.found() and not cc.links(''' 759e1723999SPaolo Bonzini #include <libvdeplug.h> 760e1723999SPaolo Bonzini int main(void) 761e1723999SPaolo Bonzini { 762e1723999SPaolo Bonzini struct vde_open_args a = {0, 0, 0}; 763e1723999SPaolo Bonzini char s[] = ""; 764e1723999SPaolo Bonzini vde_open(s, s, &a); 765e1723999SPaolo Bonzini return 0; 766e1723999SPaolo Bonzini }''', dependencies: vde) 767e1723999SPaolo Bonzini vde = not_found 768e1723999SPaolo Bonzini if get_option('cap_ng').enabled() 769e1723999SPaolo Bonzini error('could not link libvdeplug') 770e1723999SPaolo Bonzini else 771e1723999SPaolo Bonzini warning('could not link libvdeplug, disabling') 772e1723999SPaolo Bonzini endif 773cdaf0722SMarc-André Lureauendif 77487430d5bSPaolo Bonzini 775478e943fSPaolo Bonzinipulse = not_found 77687430d5bSPaolo Bonziniif not get_option('pa').auto() or (targetos == 'linux' and have_system) 77787430d5bSPaolo Bonzini pulse = dependency('libpulse', required: get_option('pa'), 778063d5119SPaolo Bonzini method: 'pkg-config') 779478e943fSPaolo Bonziniendif 780478e943fSPaolo Bonzinialsa = not_found 78187430d5bSPaolo Bonziniif not get_option('alsa').auto() or (targetos == 'linux' and have_system) 78287430d5bSPaolo Bonzini alsa = dependency('alsa', required: get_option('alsa'), 783063d5119SPaolo Bonzini method: 'pkg-config') 784478e943fSPaolo Bonziniendif 785478e943fSPaolo Bonzinijack = not_found 78687430d5bSPaolo Bonziniif not get_option('jack').auto() or have_system 78787430d5bSPaolo Bonzini jack = dependency('jack', required: get_option('jack'), 788063d5119SPaolo Bonzini method: 'pkg-config') 789478e943fSPaolo Bonziniendif 790c2d3d1c2SDorinda Basseypipewire = not_found 791c2d3d1c2SDorinda Basseyif not get_option('pipewire').auto() or (targetos == 'linux' and have_system) 792c2d3d1c2SDorinda Bassey pipewire = dependency('libpipewire-0.3', version: '>=0.3.60', 793c2d3d1c2SDorinda Bassey required: get_option('pipewire'), 794063d5119SPaolo Bonzini method: 'pkg-config') 795c2d3d1c2SDorinda Basseyendif 796663df1ccSAlexandre Ratchovsndio = not_found 797663df1ccSAlexandre Ratchovif not get_option('sndio').auto() or have_system 798663df1ccSAlexandre Ratchov sndio = dependency('sndio', required: get_option('sndio'), 799063d5119SPaolo Bonzini method: 'pkg-config') 800663df1ccSAlexandre Ratchovendif 80187430d5bSPaolo Bonzini 80258d3f3ffSGerd Hoffmannspice_protocol = not_found 8033f0a5d55SMarc-André Lureauif not get_option('spice_protocol').auto() or have_system 8045c167b53SMarkus Armbruster spice_protocol = dependency('spice-protocol', version: '>=0.14.0', 8053f0a5d55SMarc-André Lureau required: get_option('spice_protocol'), 806063d5119SPaolo Bonzini method: 'pkg-config') 8072634733cSPaolo Bonziniendif 8083f0a5d55SMarc-André Lureauspice = not_found 8093f0a5d55SMarc-André Lureauif not get_option('spice').auto() or have_system 81034d55725SMarkus Armbruster spice = dependency('spice-server', version: '>=0.14.0', 8113f0a5d55SMarc-André Lureau required: get_option('spice'), 812063d5119SPaolo Bonzini method: 'pkg-config') 81358d3f3ffSGerd Hoffmannendif 8143f0a5d55SMarc-André Lureauspice_headers = spice.partial_dependency(compile_args: true, includes: true) 8153f0a5d55SMarc-André Lureau 8165ee24e78SMarc-André Lureaurt = cc.find_library('rt', required: false) 817a399f914SPaolo Bonzini 81899650b62SPaolo Bonzinilibiscsi = not_found 8199db405a3SPaolo Bonziniif not get_option('libiscsi').auto() or have_block 8209db405a3SPaolo Bonzini libiscsi = dependency('libiscsi', version: '>=1.9.0', 8219db405a3SPaolo Bonzini required: get_option('libiscsi'), 822063d5119SPaolo Bonzini method: 'pkg-config') 82399650b62SPaolo Bonziniendif 8245e5733e5SMarc-André Lureauzstd = not_found 825b1def33dSPaolo Bonziniif not get_option('zstd').auto() or have_block 826b1def33dSPaolo Bonzini zstd = dependency('libzstd', version: '>=1.4.0', 827b1def33dSPaolo Bonzini required: get_option('zstd'), 828063d5119SPaolo Bonzini method: 'pkg-config') 8295e5733e5SMarc-André Lureauendif 830ea458960SMarc-André Lureauvirgl = not_found 8310265fe9eSPaolo Bonzini 8320265fe9eSPaolo Bonzinihave_vhost_user_gpu = have_tools and targetos == 'linux' and pixman.found() 8330265fe9eSPaolo Bonziniif not get_option('virglrenderer').auto() or have_system or have_vhost_user_gpu 834587d59d6SPaolo Bonzini virgl = dependency('virglrenderer', 835587d59d6SPaolo Bonzini method: 'pkg-config', 836063d5119SPaolo Bonzini required: get_option('virglrenderer')) 837ea458960SMarc-André Lureauendif 838fd66dbd4SStefan Hajnocziblkio = not_found 839fd66dbd4SStefan Hajnocziif not get_option('blkio').auto() or have_block 840fd66dbd4SStefan Hajnoczi blkio = dependency('blkio', 841fd66dbd4SStefan Hajnoczi method: 'pkg-config', 842063d5119SPaolo Bonzini required: get_option('blkio')) 843fd66dbd4SStefan Hajnocziendif 8441d7bb6abSMarc-André Lureaucurl = not_found 845f9cd86feSPaolo Bonziniif not get_option('curl').auto() or have_block 846f9cd86feSPaolo Bonzini curl = dependency('libcurl', version: '>=7.29.0', 847f9cd86feSPaolo Bonzini method: 'pkg-config', 848063d5119SPaolo Bonzini required: get_option('curl')) 8491d7bb6abSMarc-André Lureauendif 850f15bff25SPaolo Bonzinilibudev = not_found 851f01496a3SPaolo Bonziniif targetos == 'linux' and (have_system or have_tools) 8526ec0e15dSPaolo Bonzini libudev = dependency('libudev', 853a0fbbb6eSPaolo Bonzini method: 'pkg-config', 854063d5119SPaolo Bonzini required: get_option('libudev')) 855f15bff25SPaolo Bonziniendif 8566ec0e15dSPaolo Bonzini 8575c53015aSPaolo Bonzinimpathlibs = [libudev] 8586ec0e15dSPaolo Bonzinimpathpersist = not_found 8596ec0e15dSPaolo Bonzinimpathpersist_new_api = false 86043a363aeSPaolo Bonziniif targetos == 'linux' and have_tools and get_option('mpath').allowed() 8616ec0e15dSPaolo Bonzini mpath_test_source_new = ''' 8626ec0e15dSPaolo Bonzini #include <libudev.h> 8636ec0e15dSPaolo Bonzini #include <mpath_persist.h> 8646ec0e15dSPaolo Bonzini unsigned mpath_mx_alloc_len = 1024; 8656ec0e15dSPaolo Bonzini int logsink; 8666ec0e15dSPaolo Bonzini static struct config *multipath_conf; 8676ec0e15dSPaolo Bonzini extern struct udev *udev; 8686ec0e15dSPaolo Bonzini extern struct config *get_multipath_config(void); 8696ec0e15dSPaolo Bonzini extern void put_multipath_config(struct config *conf); 8706ec0e15dSPaolo Bonzini struct udev *udev; 8716ec0e15dSPaolo Bonzini struct config *get_multipath_config(void) { return multipath_conf; } 8726ec0e15dSPaolo Bonzini void put_multipath_config(struct config *conf) { } 8736ec0e15dSPaolo Bonzini int main(void) { 8746ec0e15dSPaolo Bonzini udev = udev_new(); 8756ec0e15dSPaolo Bonzini multipath_conf = mpath_lib_init(); 8766ec0e15dSPaolo Bonzini return 0; 8776ec0e15dSPaolo Bonzini }''' 8786ec0e15dSPaolo Bonzini mpath_test_source_old = ''' 8796ec0e15dSPaolo Bonzini #include <libudev.h> 8806ec0e15dSPaolo Bonzini #include <mpath_persist.h> 8816ec0e15dSPaolo Bonzini unsigned mpath_mx_alloc_len = 1024; 8826ec0e15dSPaolo Bonzini int logsink; 8836ec0e15dSPaolo Bonzini int main(void) { 8846ec0e15dSPaolo Bonzini struct udev *udev = udev_new(); 8856ec0e15dSPaolo Bonzini mpath_lib_init(udev); 8866ec0e15dSPaolo Bonzini return 0; 8876ec0e15dSPaolo Bonzini }''' 8885c53015aSPaolo Bonzini libmpathpersist = cc.find_library('mpathpersist', 889063d5119SPaolo Bonzini required: get_option('mpath')) 8905c53015aSPaolo Bonzini if libmpathpersist.found() 8915c53015aSPaolo Bonzini mpathlibs += libmpathpersist 892a0cbd2e8SPaolo Bonzini if get_option('prefer_static') 89343b43a40SPaolo Bonzini mpathlibs += cc.find_library('devmapper', 894063d5119SPaolo Bonzini required: get_option('mpath')) 89543b43a40SPaolo Bonzini endif 89643b43a40SPaolo Bonzini mpathlibs += cc.find_library('multipath', 897063d5119SPaolo Bonzini required: get_option('mpath')) 89843b43a40SPaolo Bonzini foreach lib: mpathlibs 89943b43a40SPaolo Bonzini if not lib.found() 90043b43a40SPaolo Bonzini mpathlibs = [] 90143b43a40SPaolo Bonzini break 90243b43a40SPaolo Bonzini endif 90343b43a40SPaolo Bonzini endforeach 9045c53015aSPaolo Bonzini if mpathlibs.length() == 0 9055c53015aSPaolo Bonzini msg = 'Dependencies missing for libmpathpersist' 9065c53015aSPaolo Bonzini elif cc.links(mpath_test_source_new, dependencies: mpathlibs) 9076ec0e15dSPaolo Bonzini mpathpersist = declare_dependency(dependencies: mpathlibs) 9086ec0e15dSPaolo Bonzini mpathpersist_new_api = true 9096ec0e15dSPaolo Bonzini elif cc.links(mpath_test_source_old, dependencies: mpathlibs) 9106ec0e15dSPaolo Bonzini mpathpersist = declare_dependency(dependencies: mpathlibs) 9116ec0e15dSPaolo Bonzini else 9125c53015aSPaolo Bonzini msg = 'Cannot detect libmpathpersist API' 9135c53015aSPaolo Bonzini endif 9145c53015aSPaolo Bonzini if not mpathpersist.found() 9156ec0e15dSPaolo Bonzini if get_option('mpath').enabled() 9165c53015aSPaolo Bonzini error(msg) 9176ec0e15dSPaolo Bonzini else 9185c53015aSPaolo Bonzini warning(msg + ', disabling') 9196ec0e15dSPaolo Bonzini endif 9206ec0e15dSPaolo Bonzini endif 9216ec0e15dSPaolo Bonzini endif 9226ec0e15dSPaolo Bonziniendif 9236ec0e15dSPaolo Bonzini 9245285e593SYonggang Luoiconv = not_found 92530fe76b1SPaolo Bonzinicurses = not_found 92643a363aeSPaolo Bonziniif have_system and get_option('curses').allowed() 9275285e593SYonggang Luo curses_test = ''' 928fbab8cc2SStefan Weil #if defined(__APPLE__) || defined(__OpenBSD__) 929fbab8cc2SStefan Weil #define _XOPEN_SOURCE_EXTENDED 1 930fbab8cc2SStefan Weil #endif 9315285e593SYonggang Luo #include <locale.h> 9325285e593SYonggang Luo #include <curses.h> 9335285e593SYonggang Luo #include <wchar.h> 9345285e593SYonggang Luo int main(void) { 9355285e593SYonggang Luo wchar_t wch = L'w'; 9365285e593SYonggang Luo setlocale(LC_ALL, ""); 9375285e593SYonggang Luo resize_term(0, 0); 9385285e593SYonggang Luo addwstr(L"wide chars\n"); 9395285e593SYonggang Luo addnwstr(&wch, 1); 9405285e593SYonggang Luo add_wch(WACS_DEGREE); 9415285e593SYonggang Luo return 0; 9425285e593SYonggang Luo }''' 943925a40dfSPaolo Bonzini 944ca31e307SYonggang Luo curses_dep_list = targetos == 'windows' ? ['ncurses', 'ncursesw'] : ['ncursesw'] 9456d322635SPaolo Bonzini curses = dependency(curses_dep_list, 9465285e593SYonggang Luo required: false, 947063d5119SPaolo Bonzini method: 'pkg-config') 948925a40dfSPaolo Bonzini msg = get_option('curses').enabled() ? 'curses library not found' : '' 949fbab8cc2SStefan Weil curses_compile_args = ['-DNCURSES_WIDECHAR=1'] 950925a40dfSPaolo Bonzini if curses.found() 9510dbce6efSPaolo Bonzini if cc.links(curses_test, args: curses_compile_args, dependencies: [curses]) 952bd3615d6SPaolo Bonzini curses = declare_dependency(compile_args: curses_compile_args, dependencies: [curses], 953bd3615d6SPaolo Bonzini version: curses.version()) 954925a40dfSPaolo Bonzini else 955925a40dfSPaolo Bonzini msg = 'curses package not usable' 956925a40dfSPaolo Bonzini curses = not_found 9575285e593SYonggang Luo endif 958925a40dfSPaolo Bonzini endif 959925a40dfSPaolo Bonzini if not curses.found() 960925a40dfSPaolo Bonzini has_curses_h = cc.has_header('curses.h', args: curses_compile_args) 961925a40dfSPaolo Bonzini if targetos != 'windows' and not has_curses_h 962925a40dfSPaolo Bonzini message('Trying with /usr/include/ncursesw') 963925a40dfSPaolo Bonzini curses_compile_args += ['-I/usr/include/ncursesw'] 964925a40dfSPaolo Bonzini has_curses_h = cc.has_header('curses.h', args: curses_compile_args) 965925a40dfSPaolo Bonzini endif 966925a40dfSPaolo Bonzini if has_curses_h 967925a40dfSPaolo Bonzini curses_libname_list = (targetos == 'windows' ? ['pdcurses'] : ['ncursesw', 'cursesw']) 968925a40dfSPaolo Bonzini foreach curses_libname : curses_libname_list 9695285e593SYonggang Luo libcurses = cc.find_library(curses_libname, 970063d5119SPaolo Bonzini required: false) 9715285e593SYonggang Luo if libcurses.found() 972925a40dfSPaolo Bonzini if cc.links(curses_test, args: curses_compile_args, dependencies: libcurses) 973925a40dfSPaolo Bonzini curses = declare_dependency(compile_args: curses_compile_args, 974925a40dfSPaolo Bonzini dependencies: [libcurses]) 9755285e593SYonggang Luo break 976925a40dfSPaolo Bonzini else 977925a40dfSPaolo Bonzini msg = 'curses library not usable' 9785285e593SYonggang Luo endif 9795285e593SYonggang Luo endif 9805285e593SYonggang Luo endforeach 9815285e593SYonggang Luo endif 98230fe76b1SPaolo Bonzini endif 98343a363aeSPaolo Bonzini if get_option('iconv').allowed() 984925a40dfSPaolo Bonzini foreach link_args : [ ['-liconv'], [] ] 985925a40dfSPaolo Bonzini # Programs will be linked with glib and this will bring in libiconv on FreeBSD. 986925a40dfSPaolo Bonzini # We need to use libiconv if available because mixing libiconv's headers with 987925a40dfSPaolo Bonzini # the system libc does not work. 988925a40dfSPaolo Bonzini # However, without adding glib to the dependencies -L/usr/local/lib will not be 989925a40dfSPaolo Bonzini # included in the command line and libiconv will not be found. 990925a40dfSPaolo Bonzini if cc.links(''' 991925a40dfSPaolo Bonzini #include <iconv.h> 992925a40dfSPaolo Bonzini int main(void) { 993925a40dfSPaolo Bonzini iconv_t conv = iconv_open("WCHAR_T", "UCS-2"); 994925a40dfSPaolo Bonzini return conv != (iconv_t) -1; 995fc9a809eSPaolo Bonzini }''', args: link_args, dependencies: glib) 996925a40dfSPaolo Bonzini iconv = declare_dependency(link_args: link_args, dependencies: glib) 997925a40dfSPaolo Bonzini break 998925a40dfSPaolo Bonzini endif 999925a40dfSPaolo Bonzini endforeach 1000925a40dfSPaolo Bonzini endif 1001925a40dfSPaolo Bonzini if curses.found() and not iconv.found() 1002925a40dfSPaolo Bonzini if get_option('iconv').enabled() 1003925a40dfSPaolo Bonzini error('iconv not available') 1004925a40dfSPaolo Bonzini endif 1005925a40dfSPaolo Bonzini msg = 'iconv required for curses UI but not available' 1006925a40dfSPaolo Bonzini curses = not_found 1007925a40dfSPaolo Bonzini endif 1008925a40dfSPaolo Bonzini if not curses.found() and msg != '' 1009925a40dfSPaolo Bonzini if get_option('curses').enabled() 1010925a40dfSPaolo Bonzini error(msg) 10115285e593SYonggang Luo else 1012925a40dfSPaolo Bonzini warning(msg + ', disabling') 101330fe76b1SPaolo Bonzini endif 10145285e593SYonggang Luo endif 10155285e593SYonggang Luoendif 10165285e593SYonggang Luo 10172634733cSPaolo Bonzinibrlapi = not_found 10188c6d4ff4SPaolo Bonziniif not get_option('brlapi').auto() or have_system 10198c6d4ff4SPaolo Bonzini brlapi = cc.find_library('brlapi', has_headers: ['brlapi.h'], 1020063d5119SPaolo Bonzini required: get_option('brlapi')) 10218c6d4ff4SPaolo Bonzini if brlapi.found() and not cc.links(''' 10228c6d4ff4SPaolo Bonzini #include <brlapi.h> 10238c6d4ff4SPaolo Bonzini #include <stddef.h> 10248c6d4ff4SPaolo Bonzini int main(void) { return brlapi__openConnection (NULL, NULL, NULL); }''', dependencies: brlapi) 10258c6d4ff4SPaolo Bonzini brlapi = not_found 10268c6d4ff4SPaolo Bonzini if get_option('brlapi').enabled() 10278c6d4ff4SPaolo Bonzini error('could not link brlapi') 10288c6d4ff4SPaolo Bonzini else 10298c6d4ff4SPaolo Bonzini warning('could not link brlapi, disabling') 10308c6d4ff4SPaolo Bonzini endif 10318c6d4ff4SPaolo Bonzini endif 10322634733cSPaolo Bonziniendif 103335be72baSPaolo Bonzini 1034760e4327SPaolo Bonzinisdl = not_found 103564d3fec7SAkihiko Odakiif not get_option('sdl').auto() or have_system 1036063d5119SPaolo Bonzini sdl = dependency('sdl2', required: get_option('sdl')) 103735be72baSPaolo Bonzini sdl_image = not_found 1038760e4327SPaolo Bonziniendif 103935be72baSPaolo Bonziniif sdl.found() 104035be72baSPaolo Bonzini # work around 2.0.8 bug 104135be72baSPaolo Bonzini sdl = declare_dependency(compile_args: '-Wno-undef', 1042bd3615d6SPaolo Bonzini dependencies: sdl, 1043bd3615d6SPaolo Bonzini version: sdl.version()) 10447161a433SVolker Rümelin sdl_image = dependency('SDL2_image', required: get_option('sdl_image'), 1045063d5119SPaolo Bonzini method: 'pkg-config') 104635be72baSPaolo Bonzinielse 104735be72baSPaolo Bonzini if get_option('sdl_image').enabled() 1048a8dc2aceSSergei Trofimovich error('sdl-image required, but SDL was @0@'.format( 1049a8dc2aceSSergei Trofimovich get_option('sdl').disabled() ? 'disabled' : 'not found')) 10502634733cSPaolo Bonzini endif 105135be72baSPaolo Bonzini sdl_image = not_found 105235be72baSPaolo Bonziniendif 105335be72baSPaolo Bonzini 10545e5733e5SMarc-André Lureaurbd = not_found 1055fabd1e93SPaolo Bonziniif not get_option('rbd').auto() or have_block 1056063d5119SPaolo Bonzini librados = cc.find_library('rados', required: get_option('rbd')) 1057fabd1e93SPaolo Bonzini librbd = cc.find_library('rbd', has_headers: ['rbd/librbd.h'], 1058063d5119SPaolo Bonzini required: get_option('rbd')) 1059c518d6c2SPaolo Bonzini if librados.found() and librbd.found() 1060c518d6c2SPaolo Bonzini if cc.links(''' 1061fabd1e93SPaolo Bonzini #include <stdio.h> 1062fabd1e93SPaolo Bonzini #include <rbd/librbd.h> 1063fabd1e93SPaolo Bonzini int main(void) { 1064fabd1e93SPaolo Bonzini rados_t cluster; 1065fabd1e93SPaolo Bonzini rados_create(&cluster, NULL); 106648672ac0SPeter Lieven #if LIBRBD_VERSION_CODE < LIBRBD_VERSION(1, 12, 0) 106748672ac0SPeter Lieven #error 106848672ac0SPeter Lieven #endif 1069fabd1e93SPaolo Bonzini return 0; 1070fabd1e93SPaolo Bonzini }''', dependencies: [librbd, librados]) 1071fabd1e93SPaolo Bonzini rbd = declare_dependency(dependencies: [librbd, librados]) 1072c518d6c2SPaolo Bonzini elif get_option('rbd').enabled() 107348672ac0SPeter Lieven error('librbd >= 1.12.0 required') 1074c518d6c2SPaolo Bonzini else 107548672ac0SPeter Lieven warning('librbd >= 1.12.0 not found, disabling') 1076c518d6c2SPaolo Bonzini endif 10775e5733e5SMarc-André Lureau endif 1078fabd1e93SPaolo Bonziniendif 1079fabd1e93SPaolo Bonzini 10805e5733e5SMarc-André Lureauglusterfs = not_found 108108821ca2SPaolo Bonziniglusterfs_ftruncate_has_stat = false 108208821ca2SPaolo Bonziniglusterfs_iocb_has_stat = false 108308821ca2SPaolo Bonziniif not get_option('glusterfs').auto() or have_block 108408821ca2SPaolo Bonzini glusterfs = dependency('glusterfs-api', version: '>=3', 108508821ca2SPaolo Bonzini required: get_option('glusterfs'), 1086063d5119SPaolo Bonzini method: 'pkg-config') 108708821ca2SPaolo Bonzini if glusterfs.found() 108808821ca2SPaolo Bonzini glusterfs_ftruncate_has_stat = cc.links(''' 108908821ca2SPaolo Bonzini #include <glusterfs/api/glfs.h> 109008821ca2SPaolo Bonzini 109108821ca2SPaolo Bonzini int 109208821ca2SPaolo Bonzini main(void) 109308821ca2SPaolo Bonzini { 109408821ca2SPaolo Bonzini /* new glfs_ftruncate() passes two additional args */ 109508821ca2SPaolo Bonzini return glfs_ftruncate(NULL, 0, NULL, NULL); 109608821ca2SPaolo Bonzini } 109708821ca2SPaolo Bonzini ''', dependencies: glusterfs) 109808821ca2SPaolo Bonzini glusterfs_iocb_has_stat = cc.links(''' 109908821ca2SPaolo Bonzini #include <glusterfs/api/glfs.h> 110008821ca2SPaolo Bonzini 110108821ca2SPaolo Bonzini /* new glfs_io_cbk() passes two additional glfs_stat structs */ 110208821ca2SPaolo Bonzini static void 110308821ca2SPaolo Bonzini glusterfs_iocb(glfs_fd_t *fd, ssize_t ret, struct glfs_stat *prestat, struct glfs_stat *poststat, void *data) 110408821ca2SPaolo Bonzini {} 110508821ca2SPaolo Bonzini 110608821ca2SPaolo Bonzini int 110708821ca2SPaolo Bonzini main(void) 110808821ca2SPaolo Bonzini { 110908821ca2SPaolo Bonzini glfs_io_cbk iocb = &glusterfs_iocb; 111008821ca2SPaolo Bonzini iocb(NULL, 0 , NULL, NULL, NULL); 111108821ca2SPaolo Bonzini return 0; 111208821ca2SPaolo Bonzini } 111308821ca2SPaolo Bonzini ''', dependencies: glusterfs) 111408821ca2SPaolo Bonzini endif 11155e5733e5SMarc-André Lureauendif 1116e6a52b36SThomas Huth 11175e5733e5SMarc-André Lureaulibssh = not_found 1118e6a52b36SThomas Huthif not get_option('libssh').auto() or have_block 1119e6a52b36SThomas Huth libssh = dependency('libssh', version: '>=0.8.7', 1120e6a52b36SThomas Huth method: 'pkg-config', 1121063d5119SPaolo Bonzini required: get_option('libssh')) 11225e5733e5SMarc-André Lureauendif 1123e6a52b36SThomas Huth 11245e5733e5SMarc-André Lureaulibbzip2 = not_found 112529ba6116SPaolo Bonziniif not get_option('bzip2').auto() or have_block 112629ba6116SPaolo Bonzini libbzip2 = cc.find_library('bz2', has_headers: ['bzlib.h'], 1127063d5119SPaolo Bonzini required: get_option('bzip2')) 112829ba6116SPaolo Bonzini if libbzip2.found() and not cc.links(''' 112929ba6116SPaolo Bonzini #include <bzlib.h> 113029ba6116SPaolo Bonzini int main(void) { BZ2_bzlibVersion(); return 0; }''', dependencies: libbzip2) 113129ba6116SPaolo Bonzini libbzip2 = not_found 113229ba6116SPaolo Bonzini if get_option('bzip2').enabled() 113329ba6116SPaolo Bonzini error('could not link libbzip2') 113429ba6116SPaolo Bonzini else 113529ba6116SPaolo Bonzini warning('could not link libbzip2, disabling') 11365e5733e5SMarc-André Lureau endif 113729ba6116SPaolo Bonzini endif 11385e5733e5SMarc-André Lureauendif 1139ecea3696SPaolo Bonzini 11405e5733e5SMarc-André Lureauliblzfse = not_found 1141ecea3696SPaolo Bonziniif not get_option('lzfse').auto() or have_block 1142ecea3696SPaolo Bonzini liblzfse = cc.find_library('lzfse', has_headers: ['lzfse.h'], 1143063d5119SPaolo Bonzini required: get_option('lzfse')) 11445e5733e5SMarc-André Lureauendif 1145ecea3696SPaolo Bonziniif liblzfse.found() and not cc.links(''' 1146ecea3696SPaolo Bonzini #include <lzfse.h> 1147ecea3696SPaolo Bonzini int main(void) { lzfse_decode_scratch_size(); return 0; }''', dependencies: liblzfse) 1148ecea3696SPaolo Bonzini liblzfse = not_found 1149ecea3696SPaolo Bonzini if get_option('lzfse').enabled() 1150ecea3696SPaolo Bonzini error('could not link liblzfse') 1151ecea3696SPaolo Bonzini else 1152ecea3696SPaolo Bonzini warning('could not link liblzfse, disabling') 1153ecea3696SPaolo Bonzini endif 1154ecea3696SPaolo Bonziniendif 1155ecea3696SPaolo Bonzini 1156478e943fSPaolo Bonzinioss = not_found 115743a363aeSPaolo Bonziniif get_option('oss').allowed() and have_system 115887430d5bSPaolo Bonzini if not cc.has_header('sys/soundcard.h') 115987430d5bSPaolo Bonzini # not found 116087430d5bSPaolo Bonzini elif targetos == 'netbsd' 1161063d5119SPaolo Bonzini oss = cc.find_library('ossaudio', required: get_option('oss')) 116287430d5bSPaolo Bonzini else 116387430d5bSPaolo Bonzini oss = declare_dependency() 116487430d5bSPaolo Bonzini endif 116587430d5bSPaolo Bonzini 116687430d5bSPaolo Bonzini if not oss.found() 116787430d5bSPaolo Bonzini if get_option('oss').enabled() 116887430d5bSPaolo Bonzini error('OSS not found') 116987430d5bSPaolo Bonzini endif 117087430d5bSPaolo Bonzini endif 1171478e943fSPaolo Bonziniendif 1172478e943fSPaolo Bonzinidsound = not_found 117387430d5bSPaolo Bonziniif not get_option('dsound').auto() or (targetos == 'windows' and have_system) 117487430d5bSPaolo Bonzini if cc.has_header('dsound.h') 117587430d5bSPaolo Bonzini dsound = declare_dependency(link_args: ['-lole32', '-ldxguid']) 1176478e943fSPaolo Bonzini endif 117787430d5bSPaolo Bonzini 117887430d5bSPaolo Bonzini if not dsound.found() 117987430d5bSPaolo Bonzini if get_option('dsound').enabled() 118087430d5bSPaolo Bonzini error('DirectSound not found') 118187430d5bSPaolo Bonzini endif 118287430d5bSPaolo Bonzini endif 118387430d5bSPaolo Bonziniendif 118487430d5bSPaolo Bonzini 1185478e943fSPaolo Bonzinicoreaudio = not_found 118687430d5bSPaolo Bonziniif not get_option('coreaudio').auto() or (targetos == 'darwin' and have_system) 118787430d5bSPaolo Bonzini coreaudio = dependency('appleframeworks', modules: 'CoreAudio', 118887430d5bSPaolo Bonzini required: get_option('coreaudio')) 1189478e943fSPaolo Bonziniendif 11908bc5184dSThomas Huth 11912b1ccdf4SMarc-André Lureauopengl = not_found 119288b6e618SPaolo Bonziniif not get_option('opengl').auto() or have_system or have_vhost_user_gpu 119388b6e618SPaolo Bonzini epoxy = dependency('epoxy', method: 'pkg-config', 1194063d5119SPaolo Bonzini required: get_option('opengl')) 119588b6e618SPaolo Bonzini if cc.has_header('epoxy/egl.h', dependencies: epoxy) 119688b6e618SPaolo Bonzini opengl = epoxy 119788b6e618SPaolo Bonzini elif get_option('opengl').enabled() 119888b6e618SPaolo Bonzini error('epoxy/egl.h not found') 119988b6e618SPaolo Bonzini endif 12002b1ccdf4SMarc-André Lureauendif 12018bc5184dSThomas Huthgbm = not_found 12028bc5184dSThomas Huthif (have_system or have_tools) and (virgl.found() or opengl.found()) 1203063d5119SPaolo Bonzini gbm = dependency('gbm', method: 'pkg-config', required: false) 12048bc5184dSThomas Huthendif 1205f0caba44SMarc-André Lureauhave_vhost_user_gpu = have_vhost_user_gpu and virgl.found() and opengl.found() and gbm.found() 12061b695471SPaolo Bonzini 120757612511SPaolo Bonzinignutls = not_found 1208cc4c7c73SDaniel P. Berrangégnutls_crypto = not_found 1209abc14fd0SAlyssa Rossif get_option('gnutls').enabled() or (get_option('gnutls').auto() and have_system) 1210cc4c7c73SDaniel P. Berrangé # For general TLS support our min gnutls matches 1211cc4c7c73SDaniel P. Berrangé # that implied by our platform support matrix 1212cc4c7c73SDaniel P. Berrangé # 1213cc4c7c73SDaniel P. Berrangé # For the crypto backends, we look for a newer 1214cc4c7c73SDaniel P. Berrangé # gnutls: 1215cc4c7c73SDaniel P. Berrangé # 1216cc4c7c73SDaniel P. Berrangé # Version 3.6.8 is needed to get XTS 1217cc4c7c73SDaniel P. Berrangé # Version 3.6.13 is needed to get PBKDF 1218cc4c7c73SDaniel P. Berrangé # Version 3.6.14 is needed to get HW accelerated XTS 1219cc4c7c73SDaniel P. Berrangé # 1220cc4c7c73SDaniel P. Berrangé # If newer enough gnutls isn't available, we can 1221cc4c7c73SDaniel P. Berrangé # still use a different crypto backend to satisfy 1222cc4c7c73SDaniel P. Berrangé # the platform support requirements 1223cc4c7c73SDaniel P. Berrangé gnutls_crypto = dependency('gnutls', version: '>=3.6.14', 1224cc4c7c73SDaniel P. Berrangé method: 'pkg-config', 1225063d5119SPaolo Bonzini required: false) 1226cc4c7c73SDaniel P. Berrangé if gnutls_crypto.found() 1227cc4c7c73SDaniel P. Berrangé gnutls = gnutls_crypto 1228cc4c7c73SDaniel P. Berrangé else 1229cc4c7c73SDaniel P. Berrangé # Our min version if all we need is TLS 123057612511SPaolo Bonzini gnutls = dependency('gnutls', version: '>=3.5.18', 123157612511SPaolo Bonzini method: 'pkg-config', 1232063d5119SPaolo Bonzini required: get_option('gnutls')) 123357612511SPaolo Bonzini endif 1234cc4c7c73SDaniel P. Berrangéendif 123557612511SPaolo Bonzini 12368bd0931fSDaniel P. Berrangé# We prefer use of gnutls for crypto, unless the options 12378bd0931fSDaniel P. Berrangé# explicitly asked for nettle or gcrypt. 12388bd0931fSDaniel P. Berrangé# 12398bd0931fSDaniel P. Berrangé# If gnutls isn't available for crypto, then we'll prefer 12408bd0931fSDaniel P. Berrangé# gcrypt over nettle for performance reasons. 124157612511SPaolo Bonzinigcrypt = not_found 124257612511SPaolo Bonzininettle = not_found 12434c5e512eSLei Hehogweed = not_found 124468014044SDaniel P. Berrangéxts = 'none' 12458bd0931fSDaniel P. Berrangé 124657612511SPaolo Bonziniif get_option('nettle').enabled() and get_option('gcrypt').enabled() 124757612511SPaolo Bonzini error('Only one of gcrypt & nettle can be enabled') 124857612511SPaolo Bonziniendif 12498bd0931fSDaniel P. Berrangé 12508bd0931fSDaniel P. Berrangé# Explicit nettle/gcrypt request, so ignore gnutls for crypto 12518bd0931fSDaniel P. Berrangéif get_option('nettle').enabled() or get_option('gcrypt').enabled() 12528bd0931fSDaniel P. Berrangé gnutls_crypto = not_found 125357612511SPaolo Bonziniendif 12548bd0931fSDaniel P. Berrangé 12558bd0931fSDaniel P. Berrangéif not gnutls_crypto.found() 12568bd0931fSDaniel P. Berrangé if (not get_option('gcrypt').auto() or have_system) and not get_option('nettle').enabled() 12571741093bSDaniel P. Berrangé gcrypt = dependency('libgcrypt', version: '>=1.8', 125857612511SPaolo Bonzini method: 'config-tool', 1259063d5119SPaolo Bonzini required: get_option('gcrypt')) 126057612511SPaolo Bonzini # Debian has removed -lgpg-error from libgcrypt-config 126157612511SPaolo Bonzini # as it "spreads unnecessary dependencies" which in 126257612511SPaolo Bonzini # turn breaks static builds... 1263a0cbd2e8SPaolo Bonzini if gcrypt.found() and get_option('prefer_static') 1264bd3615d6SPaolo Bonzini gcrypt = declare_dependency(dependencies: 1265bd3615d6SPaolo Bonzini [gcrypt, 1266bd3615d6SPaolo Bonzini cc.find_library('gpg-error', required: true)], 1267bd3615d6SPaolo Bonzini version: gcrypt.version()) 126857612511SPaolo Bonzini endif 126957612511SPaolo Bonzini endif 1270260a13d4SDaniel P. Berrangé if (not get_option('nettle').auto() or have_system) and not gcrypt.found() 1271260a13d4SDaniel P. Berrangé nettle = dependency('nettle', version: '>=3.4', 1272260a13d4SDaniel P. Berrangé method: 'pkg-config', 1273063d5119SPaolo Bonzini required: get_option('nettle')) 1274260a13d4SDaniel P. Berrangé if nettle.found() and not cc.has_header('nettle/xts.h', dependencies: nettle) 1275260a13d4SDaniel P. Berrangé xts = 'private' 1276260a13d4SDaniel P. Berrangé endif 1277260a13d4SDaniel P. Berrangé endif 1278cc4c7c73SDaniel P. Berrangéendif 127957612511SPaolo Bonzini 1280063d5119SPaolo Bonzinigmp = dependency('gmp', required: false, method: 'pkg-config') 12814c5e512eSLei Heif nettle.found() and gmp.found() 12824c5e512eSLei He hogweed = dependency('hogweed', version: '>=3.4', 12834c5e512eSLei He method: 'pkg-config', 1284063d5119SPaolo Bonzini required: get_option('nettle')) 12854c5e512eSLei Heendif 12864c5e512eSLei He 12874c5e512eSLei He 12882b1ccdf4SMarc-André Lureaugtk = not_found 12891b695471SPaolo Bonzinigtkx11 = not_found 1290c23d7b4eSPaolo Bonzinivte = not_found 129129e0bfffSClaudio Fontanahave_gtk_clipboard = get_option('gtk_clipboard').enabled() 129229e0bfffSClaudio Fontana 129364d3fec7SAkihiko Odakiif not get_option('gtk').auto() or have_system 12941b695471SPaolo Bonzini gtk = dependency('gtk+-3.0', version: '>=3.22.0', 12951b695471SPaolo Bonzini method: 'pkg-config', 1296063d5119SPaolo Bonzini required: get_option('gtk')) 12971b695471SPaolo Bonzini if gtk.found() 12981b695471SPaolo Bonzini gtkx11 = dependency('gtk+-x11-3.0', version: '>=3.22.0', 12991b695471SPaolo Bonzini method: 'pkg-config', 1300063d5119SPaolo Bonzini required: false) 1301bd3615d6SPaolo Bonzini gtk = declare_dependency(dependencies: [gtk, gtkx11], 1302bd3615d6SPaolo Bonzini version: gtk.version()) 1303c23d7b4eSPaolo Bonzini 1304c23d7b4eSPaolo Bonzini if not get_option('vte').auto() or have_system 1305c23d7b4eSPaolo Bonzini vte = dependency('vte-2.91', 1306c23d7b4eSPaolo Bonzini method: 'pkg-config', 1307063d5119SPaolo Bonzini required: get_option('vte')) 1308c23d7b4eSPaolo Bonzini endif 130929e0bfffSClaudio Fontana elif have_gtk_clipboard 131029e0bfffSClaudio Fontana error('GTK clipboard requested, but GTK not found') 13112b1ccdf4SMarc-André Lureau endif 13121b695471SPaolo Bonziniendif 13131b695471SPaolo Bonzini 13142b1ccdf4SMarc-André Lureaux11 = not_found 13159d49bcf6SMarkus Armbrusterif gtkx11.found() 1316063d5119SPaolo Bonzini x11 = dependency('x11', method: 'pkg-config', required: gtkx11.found()) 13172b1ccdf4SMarc-André Lureauendif 13182b1ccdf4SMarc-André Lureaupng = not_found 131995f8510eSKshitij Suriif get_option('png').allowed() and have_system 13201ec8c2c0SThomas Huth png = dependency('libpng', version: '>=1.6.34', required: get_option('png'), 1321063d5119SPaolo Bonzini method: 'pkg-config') 132295f8510eSKshitij Suriendif 132395f8510eSKshitij Surivnc = not_found 13242b1ccdf4SMarc-André Lureaujpeg = not_found 13252b1ccdf4SMarc-André Lureausasl = not_found 132643a363aeSPaolo Bonziniif get_option('vnc').allowed() and have_system 1327a0b93237SPaolo Bonzini vnc = declare_dependency() # dummy dependency 13288e242b3cSPaolo Bonzini jpeg = dependency('libjpeg', required: get_option('vnc_jpeg'), 1329063d5119SPaolo Bonzini method: 'pkg-config') 1330a0b93237SPaolo Bonzini sasl = cc.find_library('sasl2', has_headers: ['sasl/sasl.h'], 1331063d5119SPaolo Bonzini required: get_option('vnc_sasl')) 1332a0b93237SPaolo Bonzini if sasl.found() 1333a0b93237SPaolo Bonzini sasl = declare_dependency(dependencies: sasl, 1334a0b93237SPaolo Bonzini compile_args: '-DSTRUCT_IOVEC_DEFINED') 1335a0b93237SPaolo Bonzini endif 13362b1ccdf4SMarc-André Lureauendif 1337241611eaSPaolo Bonzini 133805e391aeSPaolo Bonzinipam = not_found 133905e391aeSPaolo Bonziniif not get_option('auth_pam').auto() or have_system 134005e391aeSPaolo Bonzini pam = cc.find_library('pam', has_headers: ['security/pam_appl.h'], 1341063d5119SPaolo Bonzini required: get_option('auth_pam')) 134205e391aeSPaolo Bonziniendif 134305e391aeSPaolo Bonziniif pam.found() and not cc.links(''' 134405e391aeSPaolo Bonzini #include <stddef.h> 134505e391aeSPaolo Bonzini #include <security/pam_appl.h> 134605e391aeSPaolo Bonzini int main(void) { 134705e391aeSPaolo Bonzini const char *service_name = "qemu"; 134805e391aeSPaolo Bonzini const char *user = "frank"; 134905e391aeSPaolo Bonzini const struct pam_conv pam_conv = { 0 }; 135005e391aeSPaolo Bonzini pam_handle_t *pamh = NULL; 135105e391aeSPaolo Bonzini pam_start(service_name, user, &pam_conv, &pamh); 135205e391aeSPaolo Bonzini return 0; 135305e391aeSPaolo Bonzini }''', dependencies: pam) 135405e391aeSPaolo Bonzini pam = not_found 135505e391aeSPaolo Bonzini if get_option('auth_pam').enabled() 135605e391aeSPaolo Bonzini error('could not link libpam') 135705e391aeSPaolo Bonzini else 135805e391aeSPaolo Bonzini warning('could not link libpam, disabling') 135905e391aeSPaolo Bonzini endif 136005e391aeSPaolo Bonziniendif 136105e391aeSPaolo Bonzini 1362708eab42SMarc-André Lureausnappy = not_found 1363241611eaSPaolo Bonziniif not get_option('snappy').auto() or have_system 1364241611eaSPaolo Bonzini snappy = cc.find_library('snappy', has_headers: ['snappy-c.h'], 1365063d5119SPaolo Bonzini required: get_option('snappy')) 1366708eab42SMarc-André Lureauendif 1367565174d0SPaolo Bonziniif snappy.found() and not linker.links(''' 1368241611eaSPaolo Bonzini #include <snappy-c.h> 1369241611eaSPaolo Bonzini int main(void) { snappy_max_compressed_length(4096); return 0; }''', dependencies: snappy) 1370241611eaSPaolo Bonzini snappy = not_found 1371241611eaSPaolo Bonzini if get_option('snappy').enabled() 1372241611eaSPaolo Bonzini error('could not link libsnappy') 1373241611eaSPaolo Bonzini else 1374241611eaSPaolo Bonzini warning('could not link libsnappy, disabling') 1375241611eaSPaolo Bonzini endif 1376708eab42SMarc-André Lureauendif 13770c32a0aeSPaolo Bonzini 1378708eab42SMarc-André Lureaulzo = not_found 13790c32a0aeSPaolo Bonziniif not get_option('lzo').auto() or have_system 13800c32a0aeSPaolo Bonzini lzo = cc.find_library('lzo2', has_headers: ['lzo/lzo1x.h'], 1381063d5119SPaolo Bonzini required: get_option('lzo')) 1382708eab42SMarc-André Lureauendif 13830c32a0aeSPaolo Bonziniif lzo.found() and not cc.links(''' 13840c32a0aeSPaolo Bonzini #include <lzo/lzo1x.h> 13850c32a0aeSPaolo Bonzini int main(void) { lzo_version(); return 0; }''', dependencies: lzo) 13860c32a0aeSPaolo Bonzini lzo = not_found 13870c32a0aeSPaolo Bonzini if get_option('lzo').enabled() 13880c32a0aeSPaolo Bonzini error('could not link liblzo2') 13890c32a0aeSPaolo Bonzini else 13900c32a0aeSPaolo Bonzini warning('could not link liblzo2, disabling') 13910c32a0aeSPaolo Bonzini endif 13920c32a0aeSPaolo Bonziniendif 13930c32a0aeSPaolo Bonzini 1394488a8c73SPaolo Bonzininuma = not_found 1395488a8c73SPaolo Bonziniif not get_option('numa').auto() or have_system or have_tools 1396488a8c73SPaolo Bonzini numa = cc.find_library('numa', has_headers: ['numa.h'], 1397063d5119SPaolo Bonzini required: get_option('numa')) 1398488a8c73SPaolo Bonziniendif 1399488a8c73SPaolo Bonziniif numa.found() and not cc.links(''' 1400488a8c73SPaolo Bonzini #include <numa.h> 1401488a8c73SPaolo Bonzini int main(void) { return numa_available(); } 1402488a8c73SPaolo Bonzini ''', dependencies: numa) 1403488a8c73SPaolo Bonzini numa = not_found 1404488a8c73SPaolo Bonzini if get_option('numa').enabled() 1405488a8c73SPaolo Bonzini error('could not link numa') 1406488a8c73SPaolo Bonzini else 1407488a8c73SPaolo Bonzini warning('could not link numa, disabling') 1408488a8c73SPaolo Bonzini endif 1409488a8c73SPaolo Bonziniendif 1410488a8c73SPaolo Bonzini 141155166230SMarc-André Lureaurdma = not_found 14123730a734SPaolo Bonziniif not get_option('rdma').auto() or have_system 14133730a734SPaolo Bonzini libumad = cc.find_library('ibumad', required: get_option('rdma')) 14143730a734SPaolo Bonzini rdma_libs = [cc.find_library('rdmacm', has_headers: ['rdma/rdma_cma.h'], 1415063d5119SPaolo Bonzini required: get_option('rdma')), 1416063d5119SPaolo Bonzini cc.find_library('ibverbs', required: get_option('rdma')), 14173730a734SPaolo Bonzini libumad] 14183730a734SPaolo Bonzini rdma = declare_dependency(dependencies: rdma_libs) 14193730a734SPaolo Bonzini foreach lib: rdma_libs 14203730a734SPaolo Bonzini if not lib.found() 14213730a734SPaolo Bonzini rdma = not_found 142255166230SMarc-André Lureau endif 14233730a734SPaolo Bonzini endforeach 14243730a734SPaolo Bonziniendif 14253730a734SPaolo Bonzini 1426582ea95fSMarc-André Lureauxen = not_found 142714efd8d3SPaolo Bonziniif get_option('xen').enabled() or (get_option('xen').auto() and have_system) 142814efd8d3SPaolo Bonzini xencontrol = dependency('xencontrol', required: false, 1429063d5119SPaolo Bonzini method: 'pkg-config') 143014efd8d3SPaolo Bonzini if xencontrol.found() 143114efd8d3SPaolo Bonzini xen_pc = declare_dependency(version: xencontrol.version(), 143214efd8d3SPaolo Bonzini dependencies: [ 143314efd8d3SPaolo Bonzini xencontrol, 143414efd8d3SPaolo Bonzini # disabler: true makes xen_pc.found() return false if any is not found 143514efd8d3SPaolo Bonzini dependency('xenstore', required: false, 1436063d5119SPaolo Bonzini method: 'pkg-config', 143714efd8d3SPaolo Bonzini disabler: true), 143814efd8d3SPaolo Bonzini dependency('xenforeignmemory', required: false, 1439063d5119SPaolo Bonzini method: 'pkg-config', 144014efd8d3SPaolo Bonzini disabler: true), 144114efd8d3SPaolo Bonzini dependency('xengnttab', required: false, 1442063d5119SPaolo Bonzini method: 'pkg-config', 144314efd8d3SPaolo Bonzini disabler: true), 144414efd8d3SPaolo Bonzini dependency('xenevtchn', required: false, 1445063d5119SPaolo Bonzini method: 'pkg-config', 144614efd8d3SPaolo Bonzini disabler: true), 144714efd8d3SPaolo Bonzini dependency('xendevicemodel', required: false, 1448063d5119SPaolo Bonzini method: 'pkg-config', 144914efd8d3SPaolo Bonzini disabler: true), 145014efd8d3SPaolo Bonzini # optional, no "disabler: true" 145114efd8d3SPaolo Bonzini dependency('xentoolcore', required: false, 1452063d5119SPaolo Bonzini method: 'pkg-config')]) 145314efd8d3SPaolo Bonzini if xen_pc.found() 145414efd8d3SPaolo Bonzini xen = xen_pc 1455582ea95fSMarc-André Lureau endif 145614efd8d3SPaolo Bonzini endif 145714efd8d3SPaolo Bonzini if not xen.found() 145814efd8d3SPaolo 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' ] 145914efd8d3SPaolo Bonzini xen_libs = { 146014efd8d3SPaolo Bonzini '4.11.0': [ 'xenstore', 'xenctrl', 'xendevicemodel', 'xenforeignmemory', 'xengnttab', 'xenevtchn', 'xentoolcore' ], 146114efd8d3SPaolo Bonzini '4.10.0': [ 'xenstore', 'xenctrl', 'xendevicemodel', 'xenforeignmemory', 'xengnttab', 'xenevtchn', 'xentoolcore' ], 146214efd8d3SPaolo Bonzini '4.9.0': [ 'xenstore', 'xenctrl', 'xendevicemodel', 'xenforeignmemory', 'xengnttab', 'xenevtchn' ], 146314efd8d3SPaolo Bonzini '4.8.0': [ 'xenstore', 'xenctrl', 'xenforeignmemory', 'xengnttab', 'xenevtchn' ], 146414efd8d3SPaolo Bonzini '4.7.1': [ 'xenstore', 'xenctrl', 'xenforeignmemory', 'xengnttab', 'xenevtchn' ], 146514efd8d3SPaolo Bonzini '4.6.0': [ 'xenstore', 'xenctrl' ], 146614efd8d3SPaolo Bonzini '4.5.0': [ 'xenstore', 'xenctrl' ], 146714efd8d3SPaolo Bonzini '4.2.0': [ 'xenstore', 'xenctrl' ], 146814efd8d3SPaolo Bonzini } 146914efd8d3SPaolo Bonzini xen_deps = {} 147014efd8d3SPaolo Bonzini foreach ver: xen_tests 147114efd8d3SPaolo Bonzini # cache the various library tests to avoid polluting the logs 147214efd8d3SPaolo Bonzini xen_test_deps = [] 147314efd8d3SPaolo Bonzini foreach l: xen_libs[ver] 147414efd8d3SPaolo Bonzini if l not in xen_deps 147514efd8d3SPaolo Bonzini xen_deps += { l: cc.find_library(l, required: false) } 147614efd8d3SPaolo Bonzini endif 147714efd8d3SPaolo Bonzini xen_test_deps += xen_deps[l] 147814efd8d3SPaolo Bonzini endforeach 147914efd8d3SPaolo Bonzini 148014efd8d3SPaolo Bonzini # Use -D to pick just one of the test programs in scripts/xen-detect.c 148114efd8d3SPaolo Bonzini xen_version = ver.split('.') 148214efd8d3SPaolo Bonzini xen_ctrl_version = xen_version[0] + \ 148314efd8d3SPaolo Bonzini ('0' + xen_version[1]).substring(-2) + \ 148414efd8d3SPaolo Bonzini ('0' + xen_version[2]).substring(-2) 148514efd8d3SPaolo Bonzini if cc.links(files('scripts/xen-detect.c'), 148614efd8d3SPaolo Bonzini args: '-DCONFIG_XEN_CTRL_INTERFACE_VERSION=' + xen_ctrl_version, 148714efd8d3SPaolo Bonzini dependencies: xen_test_deps) 148814efd8d3SPaolo Bonzini xen = declare_dependency(version: ver, dependencies: xen_test_deps) 148914efd8d3SPaolo Bonzini break 149014efd8d3SPaolo Bonzini endif 149114efd8d3SPaolo Bonzini endforeach 149214efd8d3SPaolo Bonzini endif 149314efd8d3SPaolo Bonzini if xen.found() 149414efd8d3SPaolo Bonzini accelerators += 'CONFIG_XEN' 149514efd8d3SPaolo Bonzini elif get_option('xen').enabled() 149614efd8d3SPaolo Bonzini error('could not compile and link Xen test program') 149714efd8d3SPaolo Bonzini endif 149814efd8d3SPaolo Bonziniendif 149914efd8d3SPaolo Bonzinihave_xen_pci_passthrough = get_option('xen_pci_passthrough') \ 150014efd8d3SPaolo Bonzini .require(xen.found(), 150114efd8d3SPaolo Bonzini error_message: 'Xen PCI passthrough requested but Xen not enabled') \ 150214efd8d3SPaolo Bonzini .require(targetos == 'linux', 150314efd8d3SPaolo Bonzini error_message: 'Xen PCI passthrough not available on this platform') \ 150414efd8d3SPaolo Bonzini .allowed() 150514efd8d3SPaolo Bonzini 150614efd8d3SPaolo Bonzini 150706677ce1SPaolo Bonzinicacard = not_found 15085f364c57SPaolo Bonziniif not get_option('smartcard').auto() or have_system 15095f364c57SPaolo Bonzini cacard = dependency('libcacard', required: get_option('smartcard'), 1510063d5119SPaolo Bonzini version: '>=2.5.1', method: 'pkg-config') 151106677ce1SPaolo Bonziniendif 15120a40bcb7SCésar Belleyu2f = not_found 15130a40bcb7SCésar Belleyif have_system 15140a40bcb7SCésar Belley u2f = dependency('u2f-emu', required: get_option('u2f'), 1515063d5119SPaolo Bonzini method: 'pkg-config') 15160a40bcb7SCésar Belleyendif 15178caef850SHongren (Zenithal) Zhengcanokey = not_found 15188caef850SHongren (Zenithal) Zhengif have_system 15198caef850SHongren (Zenithal) Zheng canokey = dependency('canokey-qemu', required: get_option('canokey'), 1520063d5119SPaolo Bonzini method: 'pkg-config') 15218caef850SHongren (Zenithal) Zhengendif 152206677ce1SPaolo Bonziniusbredir = not_found 152318f31e60SPaolo Bonziniif not get_option('usb_redir').auto() or have_system 152418f31e60SPaolo Bonzini usbredir = dependency('libusbredirparser-0.5', required: get_option('usb_redir'), 1525063d5119SPaolo Bonzini version: '>=0.6', method: 'pkg-config') 152606677ce1SPaolo Bonziniendif 152706677ce1SPaolo Bonzinilibusb = not_found 152890540f32SPaolo Bonziniif not get_option('libusb').auto() or have_system 152990540f32SPaolo Bonzini libusb = dependency('libusb-1.0', required: get_option('libusb'), 1530063d5119SPaolo Bonzini version: '>=1.0.13', method: 'pkg-config') 153106677ce1SPaolo Bonziniendif 153290540f32SPaolo Bonzini 1533c9322ab5SMarc-André Lureaulibpmem = not_found 1534e36e8c70SPaolo Bonziniif not get_option('libpmem').auto() or have_system 1535e36e8c70SPaolo Bonzini libpmem = dependency('libpmem', required: get_option('libpmem'), 1536063d5119SPaolo Bonzini method: 'pkg-config') 1537c9322ab5SMarc-André Lureauendif 1538c7c91a74SBruce Rogerslibdaxctl = not_found 153983ef1682SPaolo Bonziniif not get_option('libdaxctl').auto() or have_system 154083ef1682SPaolo Bonzini libdaxctl = dependency('libdaxctl', required: get_option('libdaxctl'), 1541063d5119SPaolo Bonzini version: '>=57', method: 'pkg-config') 1542c7c91a74SBruce Rogersendif 15438ce0a45fSMarc-André Lureautasn1 = not_found 1544ba7ed407SPaolo Bonziniif gnutls.found() 1545ba7ed407SPaolo Bonzini tasn1 = dependency('libtasn1', 1546063d5119SPaolo Bonzini method: 'pkg-config') 15478ce0a45fSMarc-André Lureauendif 1548af04e89dSMarc-André Lureaukeyutils = dependency('libkeyutils', required: false, 1549063d5119SPaolo Bonzini method: 'pkg-config') 1550a81df1b6SPaolo Bonzini 15513909def8SMarc-André Lureauhas_gettid = cc.has_function('gettid') 15523909def8SMarc-André Lureau 15533d212b41SRichard W.M. Jones# libselinux 15543d212b41SRichard W.M. Jonesselinux = dependency('libselinux', 15553d212b41SRichard W.M. Jones required: get_option('selinux'), 1556063d5119SPaolo Bonzini method: 'pkg-config') 15573d212b41SRichard W.M. Jones 1558aa087962SPaolo Bonzini# Malloc tests 1559aa087962SPaolo Bonzini 1560aa087962SPaolo Bonzinimalloc = [] 1561aa087962SPaolo Bonziniif get_option('malloc') == 'system' 1562aa087962SPaolo Bonzini has_malloc_trim = \ 156343a363aeSPaolo Bonzini get_option('malloc_trim').allowed() and \ 1564aa087962SPaolo Bonzini cc.links('''#include <malloc.h> 1565aa087962SPaolo Bonzini int main(void) { malloc_trim(0); return 0; }''') 1566aa087962SPaolo Bonzinielse 1567aa087962SPaolo Bonzini has_malloc_trim = false 1568aa087962SPaolo Bonzini malloc = cc.find_library(get_option('malloc'), required: true) 1569aa087962SPaolo Bonziniendif 1570aa087962SPaolo Bonziniif not has_malloc_trim and get_option('malloc_trim').enabled() 1571aa087962SPaolo Bonzini if get_option('malloc') == 'system' 1572aa087962SPaolo Bonzini error('malloc_trim not available on this platform.') 1573aa087962SPaolo Bonzini else 1574aa087962SPaolo Bonzini error('malloc_trim not available with non-libc memory allocator') 1575aa087962SPaolo Bonzini endif 1576aa087962SPaolo Bonziniendif 1577aa087962SPaolo Bonzini 157884e319a5SMax Reitz# Check whether the glibc provides statx() 157984e319a5SMax Reitz 1580e66420acSPaolo Bonzinignu_source_prefix = ''' 158184e319a5SMax Reitz #ifndef _GNU_SOURCE 158284e319a5SMax Reitz #define _GNU_SOURCE 158384e319a5SMax Reitz #endif 1584e66420acSPaolo Bonzini''' 1585e66420acSPaolo Bonzinistatx_test = gnu_source_prefix + ''' 158684e319a5SMax Reitz #include <sys/stat.h> 158784e319a5SMax Reitz int main(void) { 158884e319a5SMax Reitz struct statx statxbuf; 158984e319a5SMax Reitz statx(0, "", 0, STATX_BASIC_STATS, &statxbuf); 159084e319a5SMax Reitz return 0; 159184e319a5SMax Reitz }''' 159284e319a5SMax Reitz 159384e319a5SMax Reitzhas_statx = cc.links(statx_test) 159484e319a5SMax Reitz 15954ce7a08dSHanna Reitz# Check whether statx() provides mount ID information 15964ce7a08dSHanna Reitz 15974ce7a08dSHanna Reitzstatx_mnt_id_test = gnu_source_prefix + ''' 15984ce7a08dSHanna Reitz #include <sys/stat.h> 15994ce7a08dSHanna Reitz int main(void) { 16004ce7a08dSHanna Reitz struct statx statxbuf; 16014ce7a08dSHanna Reitz statx(0, "", 0, STATX_BASIC_STATS | STATX_MNT_ID, &statxbuf); 16024ce7a08dSHanna Reitz return statxbuf.stx_mnt_id; 16034ce7a08dSHanna Reitz }''' 16044ce7a08dSHanna Reitz 16054ce7a08dSHanna Reitzhas_statx_mnt_id = cc.links(statx_mnt_id_test) 16064ce7a08dSHanna Reitz 1607a436d6d4SPaolo Bonzinihave_vhost_user_blk_server = get_option('vhost_user_blk_server') \ 1608a436d6d4SPaolo Bonzini .require(targetos == 'linux', 1609a436d6d4SPaolo Bonzini error_message: 'vhost_user_blk_server requires linux') \ 16102a3129a3SPaolo Bonzini .require(have_vhost_user, 1611a436d6d4SPaolo Bonzini error_message: 'vhost_user_blk_server requires vhost-user support') \ 161226ed501bSAlex Bennée .disable_auto_if(not have_tools and not have_system) \ 1613a436d6d4SPaolo Bonzini .allowed() 16149e62ba48SDaniele Buono 1615df4ea709SMax Reitzif get_option('fuse').disabled() and get_option('fuse_lseek').enabled() 1616df4ea709SMax Reitz error('Cannot enable fuse-lseek while fuse is disabled') 1617df4ea709SMax Reitzendif 1618df4ea709SMax Reitz 1619a484a719SMax Reitzfuse = dependency('fuse3', required: get_option('fuse'), 1620063d5119SPaolo Bonzini version: '>=3.1', method: 'pkg-config') 1621a484a719SMax Reitz 1622df4ea709SMax Reitzfuse_lseek = not_found 162343a363aeSPaolo Bonziniif get_option('fuse_lseek').allowed() 1624df4ea709SMax Reitz if fuse.version().version_compare('>=3.8') 1625df4ea709SMax Reitz # Dummy dependency 1626df4ea709SMax Reitz fuse_lseek = declare_dependency() 1627df4ea709SMax Reitz elif get_option('fuse_lseek').enabled() 1628df4ea709SMax Reitz if fuse.found() 1629df4ea709SMax Reitz error('fuse-lseek requires libfuse >=3.8, found ' + fuse.version()) 1630df4ea709SMax Reitz else 1631df4ea709SMax Reitz error('fuse-lseek requires libfuse, which was not found') 1632df4ea709SMax Reitz endif 1633df4ea709SMax Reitz endif 1634df4ea709SMax Reitzendif 1635df4ea709SMax Reitz 1636a6caeee8SXie Yongjihave_libvduse = (targetos == 'linux') 1637a6caeee8SXie Yongjiif get_option('libvduse').enabled() 1638a6caeee8SXie Yongji if targetos != 'linux' 1639a6caeee8SXie Yongji error('libvduse requires linux') 1640a6caeee8SXie Yongji endif 1641a6caeee8SXie Yongjielif get_option('libvduse').disabled() 1642a6caeee8SXie Yongji have_libvduse = false 1643a6caeee8SXie Yongjiendif 1644a6caeee8SXie Yongji 16452a2359b8SXie Yongjihave_vduse_blk_export = (have_libvduse and targetos == 'linux') 16462a2359b8SXie Yongjiif get_option('vduse_blk_export').enabled() 16472a2359b8SXie Yongji if targetos != 'linux' 16482a2359b8SXie Yongji error('vduse_blk_export requires linux') 16492a2359b8SXie Yongji elif not have_libvduse 16502a2359b8SXie Yongji error('vduse_blk_export requires libvduse support') 16512a2359b8SXie Yongji endif 16522a2359b8SXie Yongjielif get_option('vduse_blk_export').disabled() 16532a2359b8SXie Yongji have_vduse_blk_export = false 16542a2359b8SXie Yongjiendif 16552a2359b8SXie Yongji 165646627f41SAndrew Melnychenko# libbpf 165746627f41SAndrew Melnychenkolibbpf = dependency('libbpf', required: get_option('bpf'), method: 'pkg-config') 165846627f41SAndrew Melnychenkoif libbpf.found() and not cc.links(''' 165946627f41SAndrew Melnychenko #include <bpf/libbpf.h> 166046627f41SAndrew Melnychenko int main(void) 166146627f41SAndrew Melnychenko { 166246627f41SAndrew Melnychenko bpf_object__destroy_skeleton(NULL); 166346627f41SAndrew Melnychenko return 0; 166446627f41SAndrew Melnychenko }''', dependencies: libbpf) 166546627f41SAndrew Melnychenko libbpf = not_found 166646627f41SAndrew Melnychenko if get_option('bpf').enabled() 166746627f41SAndrew Melnychenko error('libbpf skeleton test failed') 166846627f41SAndrew Melnychenko else 166946627f41SAndrew Melnychenko warning('libbpf skeleton test failed, disabling') 167046627f41SAndrew Melnychenko endif 167146627f41SAndrew Melnychenkoendif 167246627f41SAndrew Melnychenko 16737c10cb38SIlya Leoshkevich# libdw 1674bc71d58fSIlya Leoshkevichlibdw = not_found 1675550c6d97SIlya Leoshkevichif not get_option('libdw').auto() or \ 1676a0cbd2e8SPaolo Bonzini (not get_option('prefer_static') and (have_system or have_user)) 16777c10cb38SIlya Leoshkevich libdw = dependency('libdw', 16787c10cb38SIlya Leoshkevich method: 'pkg-config', 1679bc71d58fSIlya Leoshkevich required: get_option('libdw')) 1680bc71d58fSIlya Leoshkevichendif 16817c10cb38SIlya Leoshkevich 168287430d5bSPaolo Bonzini################# 168387430d5bSPaolo Bonzini# config-host.h # 168487430d5bSPaolo Bonzini################# 168587430d5bSPaolo Bonzini 168687430d5bSPaolo Bonziniaudio_drivers_selected = [] 168787430d5bSPaolo Bonziniif have_system 168887430d5bSPaolo Bonzini audio_drivers_available = { 168987430d5bSPaolo Bonzini 'alsa': alsa.found(), 169087430d5bSPaolo Bonzini 'coreaudio': coreaudio.found(), 169187430d5bSPaolo Bonzini 'dsound': dsound.found(), 169287430d5bSPaolo Bonzini 'jack': jack.found(), 169387430d5bSPaolo Bonzini 'oss': oss.found(), 169487430d5bSPaolo Bonzini 'pa': pulse.found(), 1695c2d3d1c2SDorinda Bassey 'pipewire': pipewire.found(), 169687430d5bSPaolo Bonzini 'sdl': sdl.found(), 1697663df1ccSAlexandre Ratchov 'sndio': sndio.found(), 169887430d5bSPaolo Bonzini } 1699e5424a29SPaolo Bonzini foreach k, v: audio_drivers_available 1700e5424a29SPaolo Bonzini config_host_data.set('CONFIG_AUDIO_' + k.to_upper(), v) 1701e5424a29SPaolo Bonzini endforeach 170287430d5bSPaolo Bonzini 170387430d5bSPaolo Bonzini # Default to native drivers first, OSS second, SDL third 170487430d5bSPaolo Bonzini audio_drivers_priority = \ 1705663df1ccSAlexandre Ratchov [ 'pa', 'coreaudio', 'dsound', 'sndio', 'oss' ] + \ 170687430d5bSPaolo Bonzini (targetos == 'linux' ? [] : [ 'sdl' ]) 170787430d5bSPaolo Bonzini audio_drivers_default = [] 170887430d5bSPaolo Bonzini foreach k: audio_drivers_priority 170987430d5bSPaolo Bonzini if audio_drivers_available[k] 171087430d5bSPaolo Bonzini audio_drivers_default += k 171187430d5bSPaolo Bonzini endif 171287430d5bSPaolo Bonzini endforeach 171387430d5bSPaolo Bonzini 171487430d5bSPaolo Bonzini foreach k: get_option('audio_drv_list') 171587430d5bSPaolo Bonzini if k == 'default' 171687430d5bSPaolo Bonzini audio_drivers_selected += audio_drivers_default 171787430d5bSPaolo Bonzini elif not audio_drivers_available[k] 171887430d5bSPaolo Bonzini error('Audio driver "@0@" not available.'.format(k)) 171987430d5bSPaolo Bonzini else 172087430d5bSPaolo Bonzini audio_drivers_selected += k 172187430d5bSPaolo Bonzini endif 172287430d5bSPaolo Bonzini endforeach 172387430d5bSPaolo Bonziniendif 172487430d5bSPaolo Bonziniconfig_host_data.set('CONFIG_AUDIO_DRIVERS', 172587430d5bSPaolo Bonzini '"' + '", "'.join(audio_drivers_selected) + '", ') 172687430d5bSPaolo Bonzini 17279e62ba48SDaniele Buonoif get_option('cfi') 17289e62ba48SDaniele Buono cfi_flags=[] 17299e62ba48SDaniele Buono # Check for dependency on LTO 17309e62ba48SDaniele Buono if not get_option('b_lto') 17319e62ba48SDaniele Buono error('Selected Control-Flow Integrity but LTO is disabled') 17329e62ba48SDaniele Buono endif 1733*6002711cSPaolo Bonzini if enable_modules 17349e62ba48SDaniele Buono error('Selected Control-Flow Integrity is not compatible with modules') 17359e62ba48SDaniele Buono endif 17369e62ba48SDaniele Buono # Check for cfi flags. CFI requires LTO so we can't use 17379e62ba48SDaniele Buono # get_supported_arguments, but need a more complex "compiles" which allows 17389e62ba48SDaniele Buono # custom arguments 17399e62ba48SDaniele Buono if cc.compiles('int main () { return 0; }', name: '-fsanitize=cfi-icall', 17409e62ba48SDaniele Buono args: ['-flto', '-fsanitize=cfi-icall'] ) 17419e62ba48SDaniele Buono cfi_flags += '-fsanitize=cfi-icall' 17429e62ba48SDaniele Buono else 17439e62ba48SDaniele Buono error('-fsanitize=cfi-icall is not supported by the compiler') 17449e62ba48SDaniele Buono endif 17459e62ba48SDaniele Buono if cc.compiles('int main () { return 0; }', 17469e62ba48SDaniele Buono name: '-fsanitize-cfi-icall-generalize-pointers', 17479e62ba48SDaniele Buono args: ['-flto', '-fsanitize=cfi-icall', 17489e62ba48SDaniele Buono '-fsanitize-cfi-icall-generalize-pointers'] ) 17499e62ba48SDaniele Buono cfi_flags += '-fsanitize-cfi-icall-generalize-pointers' 17509e62ba48SDaniele Buono else 17519e62ba48SDaniele Buono error('-fsanitize-cfi-icall-generalize-pointers is not supported by the compiler') 17529e62ba48SDaniele Buono endif 17539e62ba48SDaniele Buono if get_option('cfi_debug') 17549e62ba48SDaniele Buono if cc.compiles('int main () { return 0; }', 17559e62ba48SDaniele Buono name: '-fno-sanitize-trap=cfi-icall', 17569e62ba48SDaniele Buono args: ['-flto', '-fsanitize=cfi-icall', 17579e62ba48SDaniele Buono '-fno-sanitize-trap=cfi-icall'] ) 17589e62ba48SDaniele Buono cfi_flags += '-fno-sanitize-trap=cfi-icall' 17599e62ba48SDaniele Buono else 17609e62ba48SDaniele Buono error('-fno-sanitize-trap=cfi-icall is not supported by the compiler') 17619e62ba48SDaniele Buono endif 17629e62ba48SDaniele Buono endif 1763e5134024SPaolo Bonzini add_global_arguments(cfi_flags, native: false, language: all_languages) 1764e5134024SPaolo Bonzini add_global_link_arguments(cfi_flags, native: false, language: all_languages) 17659e62ba48SDaniele Buonoendif 17669e62ba48SDaniele Buono 176714176c8dSJoelle van Dynehave_host_block_device = (targetos != 'darwin' or 176814176c8dSJoelle van Dyne cc.has_header('IOKit/storage/IOMedia.h')) 176914176c8dSJoelle van Dyne 1770a436d6d4SPaolo Bonzinidbus_display = get_option('dbus_display') \ 1771a436d6d4SPaolo Bonzini .require(gio.version().version_compare('>=2.64'), 1772a436d6d4SPaolo Bonzini error_message: '-display dbus requires glib>=2.64') \ 17737544060eSPaolo Bonzini .require(gdbus_codegen.found(), 1774bb2dc4b7SPaolo Bonzini error_message: gdbus_codegen_error.format('-display dbus')) \ 177584a0a2efSMarc-André Lureau .require(targetos != 'windows', 177684a0a2efSMarc-André Lureau error_message: '-display dbus is not available on Windows') \ 1777a436d6d4SPaolo Bonzini .allowed() 1778142ca628SMarc-André Lureau 1779a436d6d4SPaolo Bonzinihave_virtfs = get_option('virtfs') \ 17800fb1e19dSKeno Fischer .require(targetos == 'linux' or targetos == 'darwin', 17810fb1e19dSKeno Fischer error_message: 'virtio-9p (virtfs) requires Linux or macOS') \ 17820fb1e19dSKeno Fischer .require(targetos == 'linux' or cc.has_function('pthread_fchdir_np'), 17830fb1e19dSKeno Fischer error_message: 'virtio-9p (virtfs) on macOS requires the presence of pthread_fchdir_np') \ 17841a67e07fSPeter Foley .require(targetos == 'darwin' or libattr.found(), 17851a67e07fSPeter Foley error_message: 'virtio-9p (virtfs) on Linux requires libattr-devel') \ 1786a436d6d4SPaolo Bonzini .disable_auto_if(not have_tools and not have_system) \ 1787a436d6d4SPaolo Bonzini .allowed() 178869202b40SPaolo Bonzini 17891a67e07fSPeter Foleyhave_virtfs_proxy_helper = get_option('virtfs_proxy_helper') \ 17901a67e07fSPeter Foley .require(targetos != 'darwin', error_message: 'the virtfs proxy helper is incompatible with macOS') \ 17911a67e07fSPeter Foley .require(have_virtfs, error_message: 'the virtfs proxy helper requires that virtfs is enabled') \ 17921a67e07fSPeter Foley .disable_auto_if(not have_tools) \ 17931a67e07fSPeter Foley .require(libcap_ng.found(), error_message: 'the virtfs proxy helper requires libcap-ng') \ 17941a67e07fSPeter Foley .allowed() 17953a489d38SPhilippe Mathieu-Daudé 1796622d64ffSPaolo Bonziniif get_option('block_drv_ro_whitelist') == '' 1797622d64ffSPaolo Bonzini config_host_data.set('CONFIG_BDRV_RO_WHITELIST', '') 1798622d64ffSPaolo Bonzinielse 1799622d64ffSPaolo Bonzini config_host_data.set('CONFIG_BDRV_RO_WHITELIST', 1800622d64ffSPaolo Bonzini '"' + get_option('block_drv_ro_whitelist').replace(',', '", "') + '", ') 1801622d64ffSPaolo Bonziniendif 1802622d64ffSPaolo Bonziniif get_option('block_drv_rw_whitelist') == '' 1803622d64ffSPaolo Bonzini config_host_data.set('CONFIG_BDRV_RW_WHITELIST', '') 1804622d64ffSPaolo Bonzinielse 1805622d64ffSPaolo Bonzini config_host_data.set('CONFIG_BDRV_RW_WHITELIST', 1806622d64ffSPaolo Bonzini '"' + get_option('block_drv_rw_whitelist').replace(',', '", "') + '", ') 1807622d64ffSPaolo Bonziniendif 1808622d64ffSPaolo Bonzini 18099c29b741SPaolo Bonziniforeach k : get_option('trace_backends') 18109c29b741SPaolo Bonzini config_host_data.set('CONFIG_TRACE_' + k.to_upper(), true) 18119c29b741SPaolo Bonziniendforeach 18129c29b741SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_TRACE_FILE', get_option('trace_file')) 181341f2ae28SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_TLS_PRIORITY', get_option('tls_priority')) 181440c909f5SPaolo Bonziniif iasl.found() 181540c909f5SPaolo Bonzini config_host_data.set_quoted('CONFIG_IASL', iasl.full_path()) 18165dc4618eSPaolo Bonziniendif 181716bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_BINDIR', get_option('prefix') / get_option('bindir')) 181816bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_PREFIX', get_option('prefix')) 181916bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_QEMU_CONFDIR', get_option('prefix') / qemu_confdir) 182016bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_QEMU_DATADIR', get_option('prefix') / qemu_datadir) 182116bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_QEMU_DESKTOPDIR', get_option('prefix') / qemu_desktopdir) 18228154f5e6SAkihiko Odaki 18238154f5e6SAkihiko Odakiqemu_firmwarepath = '' 18248154f5e6SAkihiko Odakiforeach k : get_option('qemu_firmwarepath') 18258154f5e6SAkihiko Odaki qemu_firmwarepath += '"' + get_option('prefix') / k + '", ' 18268154f5e6SAkihiko Odakiendforeach 18278154f5e6SAkihiko Odakiconfig_host_data.set('CONFIG_QEMU_FIRMWAREPATH', qemu_firmwarepath) 18288154f5e6SAkihiko Odaki 182916bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_QEMU_HELPERDIR', get_option('prefix') / get_option('libexecdir')) 183016bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_QEMU_ICONDIR', get_option('prefix') / qemu_icondir) 183116bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_QEMU_LOCALEDIR', get_option('prefix') / get_option('localedir')) 183216bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_QEMU_LOCALSTATEDIR', get_option('prefix') / get_option('localstatedir')) 183316bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_QEMU_MODDIR', get_option('prefix') / qemu_moddir) 183416bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_SYSCONFDIR', get_option('prefix') / get_option('sysconfdir')) 183516bf7a33SPaolo Bonzini 1836*6002711cSPaolo Bonziniif enable_modules 1837b0b4323eSPaolo Bonzini config_host_data.set('CONFIG_STAMP', run_command( 1838b0b4323eSPaolo Bonzini meson.current_source_dir() / 'scripts/qemu-stamp.py', 1839b0b4323eSPaolo Bonzini meson.project_version(), get_option('pkgversion'), '--', 1840b0b4323eSPaolo Bonzini meson.current_source_dir() / 'configure', 1841b0b4323eSPaolo Bonzini capture: true, check: true).stdout().strip()) 1842b0b4323eSPaolo Bonziniendif 1843b0b4323eSPaolo Bonzini 184435acbb30SPaolo Bonzinihave_slirp_smbd = get_option('slirp_smbd') \ 184535acbb30SPaolo Bonzini .require(targetos != 'windows', error_message: 'Host smbd not supported on this platform.') \ 184635acbb30SPaolo Bonzini .allowed() 184735acbb30SPaolo Bonziniif have_slirp_smbd 184835acbb30SPaolo Bonzini smbd_path = get_option('smbd') 184935acbb30SPaolo Bonzini if smbd_path == '' 185035acbb30SPaolo Bonzini smbd_path = (targetos == 'solaris' ? '/usr/sfw/sbin/smbd' : '/usr/sbin/smbd') 185135acbb30SPaolo Bonzini endif 185235acbb30SPaolo Bonzini config_host_data.set_quoted('CONFIG_SMBD_COMMAND', smbd_path) 185335acbb30SPaolo Bonziniendif 185435acbb30SPaolo Bonzini 1855823eb013SPaolo Bonziniconfig_host_data.set('HOST_' + host_arch.to_upper(), 1) 1856823eb013SPaolo Bonzini 18572cb2f580SPaolo Bonziniif get_option('module_upgrades') and not enable_modules 18582cb2f580SPaolo Bonzini error('Cannot enable module-upgrades as modules are not enabled') 18592cb2f580SPaolo Bonziniendif 18602cb2f580SPaolo Bonziniconfig_host_data.set('CONFIG_MODULE_UPGRADES', get_option('module_upgrades')) 18612cb2f580SPaolo Bonzini 1862f7f2d651SPaolo Bonziniconfig_host_data.set('CONFIG_ATTR', libattr.found()) 1863c55cf6abSPaolo Bonziniconfig_host_data.set('CONFIG_BDRV_WHITELIST_TOOLS', get_option('block_drv_whitelist_in_tools')) 18648c6d4ff4SPaolo Bonziniconfig_host_data.set('CONFIG_BRLAPI', brlapi.found()) 1865b4e312e9SPaolo Bonziniconfig_host_data.set('CONFIG_COCOA', cocoa.found()) 1866537b7248SPaolo Bonziniconfig_host_data.set('CONFIG_FUZZ', get_option('fuzzing')) 1867af2bb99bSPaolo Bonziniconfig_host_data.set('CONFIG_GCOV', get_option('b_coverage')) 1868f01496a3SPaolo Bonziniconfig_host_data.set('CONFIG_LIBUDEV', libudev.found()) 18690c32a0aeSPaolo Bonziniconfig_host_data.set('CONFIG_LZO', lzo.found()) 18706ec0e15dSPaolo Bonziniconfig_host_data.set('CONFIG_MPATH', mpathpersist.found()) 18716ec0e15dSPaolo Bonziniconfig_host_data.set('CONFIG_MPATH_NEW_API', mpathpersist_new_api) 1872fd66dbd4SStefan Hajnocziconfig_host_data.set('CONFIG_BLKIO', blkio.found()) 1873f9cd86feSPaolo Bonziniconfig_host_data.set('CONFIG_CURL', curl.found()) 18745285e593SYonggang Luoconfig_host_data.set('CONFIG_CURSES', curses.found()) 18758bc5184dSThomas Huthconfig_host_data.set('CONFIG_GBM', gbm.found()) 18767544060eSPaolo Bonziniconfig_host_data.set('CONFIG_GIO', gio.found()) 187708821ca2SPaolo Bonziniconfig_host_data.set('CONFIG_GLUSTERFS', glusterfs.found()) 187808821ca2SPaolo Bonziniif glusterfs.found() 187908821ca2SPaolo Bonzini config_host_data.set('CONFIG_GLUSTERFS_XLATOR_OPT', glusterfs.version().version_compare('>=4')) 188008821ca2SPaolo Bonzini config_host_data.set('CONFIG_GLUSTERFS_DISCARD', glusterfs.version().version_compare('>=5')) 188108821ca2SPaolo Bonzini config_host_data.set('CONFIG_GLUSTERFS_FALLOCATE', glusterfs.version().version_compare('>=6')) 188208821ca2SPaolo Bonzini config_host_data.set('CONFIG_GLUSTERFS_ZEROFILL', glusterfs.version().version_compare('>=6')) 188308821ca2SPaolo Bonzini config_host_data.set('CONFIG_GLUSTERFS_FTRUNCATE_HAS_STAT', glusterfs_ftruncate_has_stat) 188408821ca2SPaolo Bonzini config_host_data.set('CONFIG_GLUSTERFS_IOCB_HAS_STAT', glusterfs_iocb_has_stat) 188508821ca2SPaolo Bonziniendif 18861b695471SPaolo Bonziniconfig_host_data.set('CONFIG_GTK', gtk.found()) 1887c23d7b4eSPaolo Bonziniconfig_host_data.set('CONFIG_VTE', vte.found()) 188829e0bfffSClaudio Fontanaconfig_host_data.set('CONFIG_GTK_CLIPBOARD', have_gtk_clipboard) 1889f7f2d651SPaolo Bonziniconfig_host_data.set('CONFIG_LIBATTR', have_old_libattr) 1890727c8bb8SPaolo Bonziniconfig_host_data.set('CONFIG_LIBCAP_NG', libcap_ng.found()) 189146627f41SAndrew Melnychenkoconfig_host_data.set('CONFIG_EBPF', libbpf.found()) 189263a7f853SPaolo Bonziniconfig_host_data.set('CONFIG_LIBDAXCTL', libdaxctl.found()) 18939db405a3SPaolo Bonziniconfig_host_data.set('CONFIG_LIBISCSI', libiscsi.found()) 189430045c05SPaolo Bonziniconfig_host_data.set('CONFIG_LIBNFS', libnfs.found()) 1895e6a52b36SThomas Huthconfig_host_data.set('CONFIG_LIBSSH', libssh.found()) 1896ff66f3e5SPaolo Bonziniconfig_host_data.set('CONFIG_LINUX_AIO', libaio.found()) 189763a7f853SPaolo Bonziniconfig_host_data.set('CONFIG_LINUX_IO_URING', linux_io_uring.found()) 189863a7f853SPaolo Bonziniconfig_host_data.set('CONFIG_LIBPMEM', libpmem.found()) 1899*6002711cSPaolo Bonziniconfig_host_data.set('CONFIG_MODULES', enable_modules) 1900488a8c73SPaolo Bonziniconfig_host_data.set('CONFIG_NUMA', numa.found()) 19016bb613f0SMichal Privoznikif numa.found() 19026bb613f0SMichal Privoznik config_host_data.set('HAVE_NUMA_HAS_PREFERRED_MANY', 19036bb613f0SMichal Privoznik cc.has_function('numa_has_preferred_many', 19046bb613f0SMichal Privoznik dependencies: numa)) 19056bb613f0SMichal Privoznikendif 190688b6e618SPaolo Bonziniconfig_host_data.set('CONFIG_OPENGL', opengl.found()) 1907c55cf6abSPaolo Bonziniconfig_host_data.set('CONFIG_PROFILER', get_option('profiler')) 1908fabd1e93SPaolo Bonziniconfig_host_data.set('CONFIG_RBD', rbd.found()) 19093730a734SPaolo Bonziniconfig_host_data.set('CONFIG_RDMA', rdma.found()) 191035be72baSPaolo Bonziniconfig_host_data.set('CONFIG_SDL', sdl.found()) 191135be72baSPaolo Bonziniconfig_host_data.set('CONFIG_SDL_IMAGE', sdl_image.found()) 191290835c2bSPaolo Bonziniconfig_host_data.set('CONFIG_SECCOMP', seccomp.found()) 191373422d95SMichal Privoznikif seccomp.found() 191473422d95SMichal Privoznik config_host_data.set('CONFIG_SECCOMP_SYSRAWRC', seccomp_has_sysrawrc) 191573422d95SMichal Privoznikendif 1916241611eaSPaolo Bonziniconfig_host_data.set('CONFIG_SNAPPY', snappy.found()) 19170d04c4c9SPaolo Bonziniconfig_host_data.set('CONFIG_TPM', have_tpm) 191890540f32SPaolo Bonziniconfig_host_data.set('CONFIG_USB_LIBUSB', libusb.found()) 1919e1723999SPaolo Bonziniconfig_host_data.set('CONFIG_VDE', vde.found()) 19202df89d54SPaolo Bonziniconfig_host_data.set('CONFIG_VHOST_NET', have_vhost_net) 19212df89d54SPaolo Bonziniconfig_host_data.set('CONFIG_VHOST_NET_USER', have_vhost_net_user) 19222df89d54SPaolo Bonziniconfig_host_data.set('CONFIG_VHOST_NET_VDPA', have_vhost_net_vdpa) 19232df89d54SPaolo Bonziniconfig_host_data.set('CONFIG_VHOST_KERNEL', have_vhost_kernel) 19242df89d54SPaolo Bonziniconfig_host_data.set('CONFIG_VHOST_USER', have_vhost_user) 19252df89d54SPaolo Bonziniconfig_host_data.set('CONFIG_VHOST_CRYPTO', have_vhost_user_crypto) 19262df89d54SPaolo Bonziniconfig_host_data.set('CONFIG_VHOST_VDPA', have_vhost_vdpa) 1927e2c1d78dSVladislav Yaroshchukconfig_host_data.set('CONFIG_VMNET', vmnet.found()) 1928e5e856c1SStefan Hajnocziconfig_host_data.set('CONFIG_VHOST_USER_BLK_SERVER', have_vhost_user_blk_server) 19292a2359b8SXie Yongjiconfig_host_data.set('CONFIG_VDUSE_BLK_EXPORT', have_vduse_blk_export) 193095f8510eSKshitij Suriconfig_host_data.set('CONFIG_PNG', png.found()) 1931a0b93237SPaolo Bonziniconfig_host_data.set('CONFIG_VNC', vnc.found()) 1932a0b93237SPaolo Bonziniconfig_host_data.set('CONFIG_VNC_JPEG', jpeg.found()) 1933a0b93237SPaolo Bonziniconfig_host_data.set('CONFIG_VNC_SASL', sasl.found()) 193469202b40SPaolo Bonziniconfig_host_data.set('CONFIG_VIRTFS', have_virtfs) 193563a7f853SPaolo Bonziniconfig_host_data.set('CONFIG_VTE', vte.found()) 19364113f4cfSLaurent Vivierconfig_host_data.set('CONFIG_XKBCOMMON', xkbcommon.found()) 1937af04e89dSMarc-André Lureauconfig_host_data.set('CONFIG_KEYUTILS', keyutils.found()) 19383909def8SMarc-André Lureauconfig_host_data.set('CONFIG_GETTID', has_gettid) 193957612511SPaolo Bonziniconfig_host_data.set('CONFIG_GNUTLS', gnutls.found()) 1940cc4c7c73SDaniel P. Berrangéconfig_host_data.set('CONFIG_GNUTLS_CRYPTO', gnutls_crypto.found()) 1941d47b83b1SDaniel P. Berrangéconfig_host_data.set('CONFIG_TASN1', tasn1.found()) 194257612511SPaolo Bonziniconfig_host_data.set('CONFIG_GCRYPT', gcrypt.found()) 194357612511SPaolo Bonziniconfig_host_data.set('CONFIG_NETTLE', nettle.found()) 19444c5e512eSLei Heconfig_host_data.set('CONFIG_HOGWEED', hogweed.found()) 194557612511SPaolo Bonziniconfig_host_data.set('CONFIG_QEMU_PRIVATE_XTS', xts == 'private') 1946aa087962SPaolo Bonziniconfig_host_data.set('CONFIG_MALLOC_TRIM', has_malloc_trim) 194784e319a5SMax Reitzconfig_host_data.set('CONFIG_STATX', has_statx) 19484ce7a08dSHanna Reitzconfig_host_data.set('CONFIG_STATX_MNT_ID', has_statx_mnt_id) 1949b1def33dSPaolo Bonziniconfig_host_data.set('CONFIG_ZSTD', zstd.found()) 1950a484a719SMax Reitzconfig_host_data.set('CONFIG_FUSE', fuse.found()) 1951df4ea709SMax Reitzconfig_host_data.set('CONFIG_FUSE_LSEEK', fuse_lseek.found()) 19523f0a5d55SMarc-André Lureauconfig_host_data.set('CONFIG_SPICE_PROTOCOL', spice_protocol.found()) 1953ddece465SMarc-André Lureauif spice_protocol.found() 1954ddece465SMarc-André Lureauconfig_host_data.set('CONFIG_SPICE_PROTOCOL_MAJOR', spice_protocol.version().split('.')[0]) 1955ddece465SMarc-André Lureauconfig_host_data.set('CONFIG_SPICE_PROTOCOL_MINOR', spice_protocol.version().split('.')[1]) 1956ddece465SMarc-André Lureauconfig_host_data.set('CONFIG_SPICE_PROTOCOL_MICRO', spice_protocol.version().split('.')[2]) 1957ddece465SMarc-André Lureauendif 19583f0a5d55SMarc-André Lureauconfig_host_data.set('CONFIG_SPICE', spice.found()) 19599d71037fSPaolo Bonziniconfig_host_data.set('CONFIG_X11', x11.found()) 1960142ca628SMarc-André Lureauconfig_host_data.set('CONFIG_DBUS_DISPLAY', dbus_display) 19619e62ba48SDaniele Buonoconfig_host_data.set('CONFIG_CFI', get_option('cfi')) 19623d212b41SRichard W.M. Jonesconfig_host_data.set('CONFIG_SELINUX', selinux.found()) 196314efd8d3SPaolo Bonziniconfig_host_data.set('CONFIG_XEN_BACKEND', xen.found()) 19647c10cb38SIlya Leoshkevichconfig_host_data.set('CONFIG_LIBDW', libdw.found()) 196514efd8d3SPaolo Bonziniif xen.found() 196614efd8d3SPaolo Bonzini # protect from xen.version() having less than three components 196714efd8d3SPaolo Bonzini xen_version = xen.version().split('.') + ['0', '0'] 196814efd8d3SPaolo Bonzini xen_ctrl_version = xen_version[0] + \ 196914efd8d3SPaolo Bonzini ('0' + xen_version[1]).substring(-2) + \ 197014efd8d3SPaolo Bonzini ('0' + xen_version[2]).substring(-2) 197114efd8d3SPaolo Bonzini config_host_data.set('CONFIG_XEN_CTRL_INTERFACE_VERSION', xen_ctrl_version) 197214efd8d3SPaolo Bonziniendif 1973859aef02SPaolo Bonziniconfig_host_data.set('QEMU_VERSION', '"@0@"'.format(meson.project_version())) 1974859aef02SPaolo Bonziniconfig_host_data.set('QEMU_VERSION_MAJOR', meson.project_version().split('.')[0]) 1975859aef02SPaolo Bonziniconfig_host_data.set('QEMU_VERSION_MINOR', meson.project_version().split('.')[1]) 1976859aef02SPaolo Bonziniconfig_host_data.set('QEMU_VERSION_MICRO', meson.project_version().split('.')[2]) 1977859aef02SPaolo Bonzini 1978a6305081SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_HOST_DSOSUF', host_dsosuf) 197969d8de7aSPaolo Bonziniconfig_host_data.set('HAVE_HOST_BLOCK_DEVICE', have_host_block_device) 198069d8de7aSPaolo Bonzini 1981728c0a2fSPaolo Bonzinihave_coroutine_pool = get_option('coroutine_pool') 1982728c0a2fSPaolo Bonziniif get_option('debug_stack_usage') and have_coroutine_pool 1983728c0a2fSPaolo Bonzini message('Disabling coroutine pool to measure stack usage') 1984728c0a2fSPaolo Bonzini have_coroutine_pool = false 1985728c0a2fSPaolo Bonziniendif 1986728c0a2fSPaolo Bonziniconfig_host_data.set10('CONFIG_COROUTINE_POOL', have_coroutine_pool) 198758a2e3f5SStefan Hajnocziconfig_host_data.set('CONFIG_DEBUG_GRAPH_LOCK', get_option('debug_graph_lock')) 1988c55cf6abSPaolo Bonziniconfig_host_data.set('CONFIG_DEBUG_MUTEX', get_option('debug_mutex')) 1989728c0a2fSPaolo Bonziniconfig_host_data.set('CONFIG_DEBUG_STACK_USAGE', get_option('debug_stack_usage')) 1990c55cf6abSPaolo Bonziniconfig_host_data.set('CONFIG_GPROF', get_option('gprof')) 1991406523f6SPaolo Bonziniconfig_host_data.set('CONFIG_LIVE_BLOCK_MIGRATION', get_option('live_block_migration').allowed()) 1992c55cf6abSPaolo Bonziniconfig_host_data.set('CONFIG_QOM_CAST_DEBUG', get_option('qom_cast_debug')) 1993abad185cSJuan Quintelaconfig_host_data.set('CONFIG_REPLICATION', get_option('replication').allowed()) 1994406523f6SPaolo Bonzini 199569d8de7aSPaolo Bonzini# has_header 1996e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_EPOLL', cc.has_header('sys/epoll.h')) 1997d47a8b3bSPaolo Bonziniconfig_host_data.set('CONFIG_LINUX_MAGIC_H', cc.has_header('linux/magic.h')) 1998d47a8b3bSPaolo Bonziniconfig_host_data.set('CONFIG_VALGRIND_H', cc.has_header('valgrind/valgrind.h')) 199948f670ecSThomas Huthconfig_host_data.set('HAVE_BTRFS_H', cc.has_header('linux/btrfs.h')) 20002964be52SThomas Huthconfig_host_data.set('HAVE_DRM_H', cc.has_header('libdrm/drm.h')) 20012802d91dSThomas Huthconfig_host_data.set('HAVE_PTY_H', cc.has_header('pty.h')) 200269d8de7aSPaolo Bonziniconfig_host_data.set('HAVE_SYS_DISK_H', cc.has_header('sys/disk.h')) 2003ded5d78cSThomas Huthconfig_host_data.set('HAVE_SYS_IOCCOM_H', cc.has_header('sys/ioccom.h')) 20044a9d5f89SThomas Huthconfig_host_data.set('HAVE_SYS_KCOV_H', cc.has_header('sys/kcov.h')) 2005d409373bSBin Mengif targetos == 'windows' 2006d409373bSBin Meng config_host_data.set('HAVE_AFUNIX_H', cc.has_header('afunix.h')) 2007d409373bSBin Mengendif 2008ded5d78cSThomas Huth 200969d8de7aSPaolo Bonzini# has_function 2010c891c24bSClaudio Imbrendaconfig_host_data.set('CONFIG_CLOSE_RANGE', cc.has_function('close_range')) 2011a620fbe9SPaolo Bonziniconfig_host_data.set('CONFIG_ACCEPT4', cc.has_function('accept4')) 2012e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_CLOCK_ADJTIME', cc.has_function('clock_adjtime')) 2013e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_DUP3', cc.has_function('dup3')) 2014e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_FALLOCATE', cc.has_function('fallocate')) 2015e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_POSIX_FALLOCATE', cc.has_function('posix_fallocate')) 20168698343bSPeter Maydell# Note that we need to specify prefix: here to avoid incorrectly 20178698343bSPeter Maydell# thinking that Windows has posix_memalign() 20188698343bSPeter Maydellconfig_host_data.set('CONFIG_POSIX_MEMALIGN', cc.has_function('posix_memalign', prefix: '#include <stdlib.h>')) 20195c8c714aSPeter Maydellconfig_host_data.set('CONFIG_ALIGNED_MALLOC', cc.has_function('_aligned_malloc')) 202088454f84SPeter Maydellconfig_host_data.set('CONFIG_VALLOC', cc.has_function('valloc')) 202188454f84SPeter Maydellconfig_host_data.set('CONFIG_MEMALIGN', cc.has_function('memalign')) 2022e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_PPOLL', cc.has_function('ppoll')) 20232b9f74efSPeter Maydellconfig_host_data.set('CONFIG_PREADV', cc.has_function('preadv', prefix: '#include <sys/uio.h>')) 2024029ed1bdSKeno Fischerconfig_host_data.set('CONFIG_PTHREAD_FCHDIR_NP', cc.has_function('pthread_fchdir_np')) 2025e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_SENDFILE', cc.has_function('sendfile')) 2026e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_SETNS', cc.has_function('setns') and cc.has_function('unshare')) 2027e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_SYNCFS', cc.has_function('syncfs')) 2028e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_SYNC_FILE_RANGE', cc.has_function('sync_file_range')) 2029e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_TIMERFD', cc.has_function('timerfd_create')) 2030be7e89f6SPaolo Bonziniconfig_host_data.set('HAVE_COPY_FILE_RANGE', cc.has_function('copy_file_range')) 203159e35c7bSAndrew Deasonconfig_host_data.set('HAVE_GETIFADDRS', cc.has_function('getifaddrs')) 2032fc9a809eSPaolo Bonziniconfig_host_data.set('HAVE_GLIB_WITH_SLICE_ALLOCATOR', glib_has_gslice) 2033e66420acSPaolo Bonziniconfig_host_data.set('HAVE_OPENPTY', cc.has_function('openpty', dependencies: util)) 2034ed3b3f17SPaolo Bonziniconfig_host_data.set('HAVE_STRCHRNUL', cc.has_function('strchrnul')) 203569d8de7aSPaolo Bonziniconfig_host_data.set('HAVE_SYSTEM_FUNCTION', cc.has_function('system', prefix: '#include <stdlib.h>')) 203666dc5f96SStefano Garzarellaif rbd.found() 203766dc5f96SStefano Garzarella config_host_data.set('HAVE_RBD_NAMESPACE_EXISTS', 203866dc5f96SStefano Garzarella cc.has_function('rbd_namespace_exists', 203966dc5f96SStefano Garzarella dependencies: rbd, 204066dc5f96SStefano Garzarella prefix: '#include <rbd/librbd.h>')) 204166dc5f96SStefano Garzarellaendif 2042911965acSLi Zhijianif rdma.found() 2043911965acSLi Zhijian config_host_data.set('HAVE_IBV_ADVISE_MR', 2044911965acSLi Zhijian cc.has_function('ibv_advise_mr', 20453730a734SPaolo Bonzini dependencies: rdma, 2046911965acSLi Zhijian prefix: '#include <infiniband/verbs.h>')) 2047911965acSLi Zhijianendif 20482b9f74efSPeter Maydell 2049e66420acSPaolo Bonzini# has_header_symbol 20506d43eaa3SSam Liconfig_host_data.set('CONFIG_BLKZONED', 20516d43eaa3SSam Li cc.has_header_symbol('linux/blkzoned.h', 'BLKOPENZONE')) 2052e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_EPOLL_CREATE1', 2053e66420acSPaolo Bonzini cc.has_header_symbol('sys/epoll.h', 'epoll_create1')) 2054e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_FALLOCATE_PUNCH_HOLE', 2055e66420acSPaolo Bonzini cc.has_header_symbol('linux/falloc.h', 'FALLOC_FL_PUNCH_HOLE') and 2056e66420acSPaolo Bonzini cc.has_header_symbol('linux/falloc.h', 'FALLOC_FL_KEEP_SIZE')) 2057e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_FALLOCATE_ZERO_RANGE', 2058e66420acSPaolo Bonzini cc.has_header_symbol('linux/falloc.h', 'FALLOC_FL_ZERO_RANGE')) 2059e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_FIEMAP', 2060e66420acSPaolo Bonzini cc.has_header('linux/fiemap.h') and 2061e66420acSPaolo Bonzini cc.has_header_symbol('linux/fs.h', 'FS_IOC_FIEMAP')) 2062be7e89f6SPaolo Bonziniconfig_host_data.set('CONFIG_GETRANDOM', 2063be7e89f6SPaolo Bonzini cc.has_function('getrandom') and 2064be7e89f6SPaolo Bonzini cc.has_header_symbol('sys/random.h', 'GRND_NONBLOCK')) 2065a620fbe9SPaolo Bonziniconfig_host_data.set('CONFIG_INOTIFY', 2066a620fbe9SPaolo Bonzini cc.has_header_symbol('sys/inotify.h', 'inotify_init')) 2067a620fbe9SPaolo Bonziniconfig_host_data.set('CONFIG_INOTIFY1', 2068a620fbe9SPaolo Bonzini cc.has_header_symbol('sys/inotify.h', 'inotify_init1')) 2069e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_PRCTL_PR_SET_TIMERSLACK', 2070e66420acSPaolo Bonzini cc.has_header_symbol('sys/prctl.h', 'PR_SET_TIMERSLACK')) 2071be7e89f6SPaolo Bonziniconfig_host_data.set('CONFIG_RTNETLINK', 2072be7e89f6SPaolo Bonzini cc.has_header_symbol('linux/rtnetlink.h', 'IFLA_PROTO_DOWN')) 2073be7e89f6SPaolo Bonziniconfig_host_data.set('CONFIG_SYSMACROS', 2074be7e89f6SPaolo Bonzini cc.has_header_symbol('sys/sysmacros.h', 'makedev')) 2075e1fbd2c4SPaolo Bonziniconfig_host_data.set('HAVE_OPTRESET', 2076e1fbd2c4SPaolo Bonzini cc.has_header_symbol('getopt.h', 'optreset')) 2077653163fcSMarc-André Lureauconfig_host_data.set('HAVE_IPPROTO_MPTCP', 2078653163fcSMarc-André Lureau cc.has_header_symbol('netinet/in.h', 'IPPROTO_MPTCP')) 2079e66420acSPaolo Bonzini 2080e66420acSPaolo Bonzini# has_member 2081e66420acSPaolo Bonziniconfig_host_data.set('HAVE_SIGEV_NOTIFY_THREAD_ID', 2082e66420acSPaolo Bonzini cc.has_member('struct sigevent', 'sigev_notify_thread_id', 2083e66420acSPaolo Bonzini prefix: '#include <signal.h>')) 2084ed3b3f17SPaolo Bonziniconfig_host_data.set('HAVE_STRUCT_STAT_ST_ATIM', 2085ed3b3f17SPaolo Bonzini cc.has_member('struct stat', 'st_atim', 2086ed3b3f17SPaolo Bonzini prefix: '#include <sys/stat.h>')) 20876d43eaa3SSam Liconfig_host_data.set('HAVE_BLK_ZONE_REP_CAPACITY', 20886d43eaa3SSam Li cc.has_member('struct blk_zone', 'capacity', 20896d43eaa3SSam Li prefix: '#include <linux/blkzoned.h>')) 2090e66420acSPaolo Bonzini 20916a23f819SPaolo Bonzini# has_type 20926a23f819SPaolo Bonziniconfig_host_data.set('CONFIG_IOVEC', 20936a23f819SPaolo Bonzini cc.has_type('struct iovec', 20946a23f819SPaolo Bonzini prefix: '#include <sys/uio.h>')) 20956a23f819SPaolo Bonziniconfig_host_data.set('HAVE_UTMPX', 20966a23f819SPaolo Bonzini cc.has_type('struct utmpx', 20976a23f819SPaolo Bonzini prefix: '#include <utmpx.h>')) 20986a23f819SPaolo Bonzini 2099904ad5ecSPaolo Bonziniconfig_host_data.set('CONFIG_EVENTFD', cc.links(''' 2100e1fbd2c4SPaolo Bonzini #include <sys/eventfd.h> 2101e1fbd2c4SPaolo Bonzini int main(void) { return eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC); }''')) 2102904ad5ecSPaolo Bonziniconfig_host_data.set('CONFIG_FDATASYNC', cc.links(gnu_source_prefix + ''' 2103e1fbd2c4SPaolo Bonzini #include <unistd.h> 2104e1fbd2c4SPaolo Bonzini int main(void) { 2105e1fbd2c4SPaolo Bonzini #if defined(_POSIX_SYNCHRONIZED_IO) && _POSIX_SYNCHRONIZED_IO > 0 2106e1fbd2c4SPaolo Bonzini return fdatasync(0); 2107e1fbd2c4SPaolo Bonzini #else 2108e1fbd2c4SPaolo Bonzini #error Not supported 2109e1fbd2c4SPaolo Bonzini #endif 2110e1fbd2c4SPaolo Bonzini }''')) 21118900c204SAndrew Deason 21128900c204SAndrew Deasonhas_madvise = cc.links(gnu_source_prefix + ''' 2113e1fbd2c4SPaolo Bonzini #include <sys/types.h> 2114e1fbd2c4SPaolo Bonzini #include <sys/mman.h> 2115e1fbd2c4SPaolo Bonzini #include <stddef.h> 21168900c204SAndrew Deason int main(void) { return madvise(NULL, 0, MADV_DONTNEED); }''') 21178900c204SAndrew Deasonmissing_madvise_proto = false 21188900c204SAndrew Deasonif has_madvise 21198900c204SAndrew Deason # Some platforms (illumos and Solaris before Solaris 11) provide madvise() 21208900c204SAndrew Deason # but forget to prototype it. In this case, has_madvise will be true (the 21218900c204SAndrew Deason # test program links despite a compile warning). To detect the 21228900c204SAndrew Deason # missing-prototype case, we try again with a definitely-bogus prototype. 21238900c204SAndrew Deason # This will only compile if the system headers don't provide the prototype; 21248900c204SAndrew Deason # otherwise the conflicting prototypes will cause a compiler error. 21258900c204SAndrew Deason missing_madvise_proto = cc.links(gnu_source_prefix + ''' 21268900c204SAndrew Deason #include <sys/types.h> 21278900c204SAndrew Deason #include <sys/mman.h> 21288900c204SAndrew Deason #include <stddef.h> 21298900c204SAndrew Deason extern int madvise(int); 21308900c204SAndrew Deason int main(void) { return madvise(0); }''') 21318900c204SAndrew Deasonendif 21328900c204SAndrew Deasonconfig_host_data.set('CONFIG_MADVISE', has_madvise) 21338900c204SAndrew Deasonconfig_host_data.set('HAVE_MADVISE_WITHOUT_PROTOTYPE', missing_madvise_proto) 21348900c204SAndrew Deason 2135904ad5ecSPaolo Bonziniconfig_host_data.set('CONFIG_MEMFD', cc.links(gnu_source_prefix + ''' 2136e1fbd2c4SPaolo Bonzini #include <sys/mman.h> 2137e1fbd2c4SPaolo Bonzini int main(void) { return memfd_create("foo", MFD_ALLOW_SEALING); }''')) 2138904ad5ecSPaolo Bonziniconfig_host_data.set('CONFIG_OPEN_BY_HANDLE', cc.links(gnu_source_prefix + ''' 2139d47a8b3bSPaolo Bonzini #include <fcntl.h> 2140d47a8b3bSPaolo Bonzini #if !defined(AT_EMPTY_PATH) 2141d47a8b3bSPaolo Bonzini # error missing definition 2142d47a8b3bSPaolo Bonzini #else 2143d47a8b3bSPaolo Bonzini int main(void) { struct file_handle fh; return open_by_handle_at(0, &fh, 0); } 2144d47a8b3bSPaolo Bonzini #endif''')) 2145904ad5ecSPaolo Bonziniconfig_host_data.set('CONFIG_POSIX_MADVISE', cc.links(gnu_source_prefix + ''' 2146e1fbd2c4SPaolo Bonzini #include <sys/mman.h> 2147e1fbd2c4SPaolo Bonzini #include <stddef.h> 2148e1fbd2c4SPaolo Bonzini int main(void) { return posix_madvise(NULL, 0, POSIX_MADV_DONTNEED); }''')) 214910f6b231SPaolo Bonzini 21506a23f819SPaolo Bonziniconfig_host_data.set('CONFIG_PTHREAD_SETNAME_NP_W_TID', cc.links(gnu_source_prefix + ''' 215110f6b231SPaolo Bonzini #include <pthread.h> 215210f6b231SPaolo Bonzini 215310f6b231SPaolo Bonzini static void *f(void *p) { return NULL; } 215410f6b231SPaolo Bonzini int main(void) 215510f6b231SPaolo Bonzini { 215610f6b231SPaolo Bonzini pthread_t thread; 215710f6b231SPaolo Bonzini pthread_create(&thread, 0, f, 0); 215810f6b231SPaolo Bonzini pthread_setname_np(thread, "QEMU"); 215910f6b231SPaolo Bonzini return 0; 216010f6b231SPaolo Bonzini }''', dependencies: threads)) 21616a23f819SPaolo Bonziniconfig_host_data.set('CONFIG_PTHREAD_SETNAME_NP_WO_TID', cc.links(gnu_source_prefix + ''' 216210f6b231SPaolo Bonzini #include <pthread.h> 216310f6b231SPaolo Bonzini 216410f6b231SPaolo Bonzini static void *f(void *p) { pthread_setname_np("QEMU"); return NULL; } 216510f6b231SPaolo Bonzini int main(void) 216610f6b231SPaolo Bonzini { 216710f6b231SPaolo Bonzini pthread_t thread; 216810f6b231SPaolo Bonzini pthread_create(&thread, 0, f, 0); 216910f6b231SPaolo Bonzini return 0; 217010f6b231SPaolo Bonzini }''', dependencies: threads)) 21713ada67a3SBrad Smithconfig_host_data.set('CONFIG_PTHREAD_SET_NAME_NP', cc.links(gnu_source_prefix + ''' 21723ada67a3SBrad Smith #include <pthread.h> 21733ada67a3SBrad Smith #include <pthread_np.h> 21743ada67a3SBrad Smith 21753ada67a3SBrad Smith static void *f(void *p) { return NULL; } 21763ada67a3SBrad Smith int main(void) 21773ada67a3SBrad Smith { 21783ada67a3SBrad Smith pthread_t thread; 21793ada67a3SBrad Smith pthread_create(&thread, 0, f, 0); 21803ada67a3SBrad Smith pthread_set_name_np(thread, "QEMU"); 21813ada67a3SBrad Smith return 0; 21823ada67a3SBrad Smith }''', dependencies: threads)) 2183657ac98bSLongpeng(Mike)config_host_data.set('CONFIG_PTHREAD_CONDATTR_SETCLOCK', cc.links(gnu_source_prefix + ''' 2184657ac98bSLongpeng(Mike) #include <pthread.h> 2185657ac98bSLongpeng(Mike) #include <time.h> 2186657ac98bSLongpeng(Mike) 2187657ac98bSLongpeng(Mike) int main(void) 2188657ac98bSLongpeng(Mike) { 2189657ac98bSLongpeng(Mike) pthread_condattr_t attr 2190657ac98bSLongpeng(Mike) pthread_condattr_init(&attr); 2191657ac98bSLongpeng(Mike) pthread_condattr_setclock(&attr, CLOCK_MONOTONIC); 2192657ac98bSLongpeng(Mike) return 0; 2193657ac98bSLongpeng(Mike) }''', dependencies: threads)) 21947730f32cSDavid Hildenbrandconfig_host_data.set('CONFIG_PTHREAD_AFFINITY_NP', cc.links(gnu_source_prefix + ''' 21957730f32cSDavid Hildenbrand #include <pthread.h> 219610f6b231SPaolo Bonzini 21977730f32cSDavid Hildenbrand static void *f(void *p) { return NULL; } 21987730f32cSDavid Hildenbrand int main(void) 21997730f32cSDavid Hildenbrand { 22007730f32cSDavid Hildenbrand int setsize = CPU_ALLOC_SIZE(64); 22017730f32cSDavid Hildenbrand pthread_t thread; 22027730f32cSDavid Hildenbrand cpu_set_t *cpuset; 22037730f32cSDavid Hildenbrand pthread_create(&thread, 0, f, 0); 22047730f32cSDavid Hildenbrand cpuset = CPU_ALLOC(64); 22057730f32cSDavid Hildenbrand CPU_ZERO_S(setsize, cpuset); 22067730f32cSDavid Hildenbrand pthread_setaffinity_np(thread, setsize, cpuset); 22077730f32cSDavid Hildenbrand pthread_getaffinity_np(thread, setsize, cpuset); 22087730f32cSDavid Hildenbrand CPU_FREE(cpuset); 22097730f32cSDavid Hildenbrand return 0; 22107730f32cSDavid Hildenbrand }''', dependencies: threads)) 2211904ad5ecSPaolo Bonziniconfig_host_data.set('CONFIG_SIGNALFD', cc.links(gnu_source_prefix + ''' 22126bd17dccSKacper Słomiński #include <sys/signalfd.h> 22136bd17dccSKacper Słomiński #include <stddef.h> 22146bd17dccSKacper Słomiński int main(void) { return signalfd(-1, NULL, SFD_CLOEXEC); }''')) 2215904ad5ecSPaolo Bonziniconfig_host_data.set('CONFIG_SPLICE', cc.links(gnu_source_prefix + ''' 2216a620fbe9SPaolo Bonzini #include <unistd.h> 2217a620fbe9SPaolo Bonzini #include <fcntl.h> 2218a620fbe9SPaolo Bonzini #include <limits.h> 2219a620fbe9SPaolo Bonzini 2220a620fbe9SPaolo Bonzini int main(void) 2221a620fbe9SPaolo Bonzini { 2222a620fbe9SPaolo Bonzini int len, fd = 0; 2223a620fbe9SPaolo Bonzini len = tee(STDIN_FILENO, STDOUT_FILENO, INT_MAX, SPLICE_F_NONBLOCK); 2224a620fbe9SPaolo Bonzini splice(STDIN_FILENO, NULL, fd, NULL, len, SPLICE_F_MOVE); 2225a620fbe9SPaolo Bonzini return 0; 2226a620fbe9SPaolo Bonzini }''')) 2227e1fbd2c4SPaolo Bonzini 222896a63aebSPaolo Bonziniconfig_host_data.set('HAVE_MLOCKALL', cc.links(gnu_source_prefix + ''' 222996a63aebSPaolo Bonzini #include <sys/mman.h> 2230b5d3dac1SPaolo Bonzini int main(void) { 223196a63aebSPaolo Bonzini return mlockall(MCL_FUTURE); 223296a63aebSPaolo Bonzini }''')) 223396a63aebSPaolo Bonzini 2234eea9453aSThomas Huthhave_l2tpv3 = false 223543a363aeSPaolo Bonziniif get_option('l2tpv3').allowed() and have_system 22366a23f819SPaolo Bonzini have_l2tpv3 = cc.has_type('struct mmsghdr', 22376a23f819SPaolo Bonzini prefix: gnu_source_prefix + ''' 22386a23f819SPaolo Bonzini #include <sys/socket.h> 22396a23f819SPaolo Bonzini #include <linux/ip.h>''') 2240eea9453aSThomas Huthendif 2241eea9453aSThomas Huthconfig_host_data.set('CONFIG_L2TPV3', have_l2tpv3) 2242eea9453aSThomas Huth 2243837b84b1SPaolo Bonzinihave_netmap = false 224443a363aeSPaolo Bonziniif get_option('netmap').allowed() and have_system 2245837b84b1SPaolo Bonzini have_netmap = cc.compiles(''' 2246837b84b1SPaolo Bonzini #include <inttypes.h> 2247837b84b1SPaolo Bonzini #include <net/if.h> 2248837b84b1SPaolo Bonzini #include <net/netmap.h> 2249837b84b1SPaolo Bonzini #include <net/netmap_user.h> 2250837b84b1SPaolo Bonzini #if (NETMAP_API < 11) || (NETMAP_API > 15) 2251837b84b1SPaolo Bonzini #error 2252837b84b1SPaolo Bonzini #endif 2253837b84b1SPaolo Bonzini int main(void) { return 0; }''') 2254837b84b1SPaolo Bonzini if not have_netmap and get_option('netmap').enabled() 2255837b84b1SPaolo Bonzini error('Netmap headers not available') 2256837b84b1SPaolo Bonzini endif 2257837b84b1SPaolo Bonziniendif 2258837b84b1SPaolo Bonziniconfig_host_data.set('CONFIG_NETMAP', have_netmap) 2259837b84b1SPaolo Bonzini 226096a63aebSPaolo Bonzini# Work around a system header bug with some kernel/XFS header 226196a63aebSPaolo Bonzini# versions where they both try to define 'struct fsxattr': 226296a63aebSPaolo Bonzini# xfs headers will not try to redefine structs from linux headers 226396a63aebSPaolo Bonzini# if this macro is set. 226496a63aebSPaolo Bonziniconfig_host_data.set('HAVE_FSXATTR', cc.links(''' 22656a23f819SPaolo Bonzini #include <linux/fs.h> 226696a63aebSPaolo Bonzini struct fsxattr foo; 226796a63aebSPaolo Bonzini int main(void) { 226896a63aebSPaolo Bonzini return 0; 226996a63aebSPaolo Bonzini }''')) 227096a63aebSPaolo Bonzini 2271e46bd55dSPaolo Bonzini# Some versions of Mac OS X incorrectly define SIZE_MAX 2272e46bd55dSPaolo Bonziniconfig_host_data.set('HAVE_BROKEN_SIZE_MAX', not cc.compiles(''' 2273e46bd55dSPaolo Bonzini #include <stdint.h> 2274e46bd55dSPaolo Bonzini #include <stdio.h> 2275b5d3dac1SPaolo Bonzini int main(void) { 2276e46bd55dSPaolo Bonzini return printf("%zu", SIZE_MAX); 2277e46bd55dSPaolo Bonzini }''', args: ['-Werror'])) 2278e46bd55dSPaolo Bonzini 2279e61f1efeSRichard Henderson# See if 64-bit atomic operations are supported. 2280e61f1efeSRichard Henderson# Note that without __atomic builtins, we can only 2281e61f1efeSRichard Henderson# assume atomic loads/stores max at pointer size. 2282e61f1efeSRichard Hendersonconfig_host_data.set('CONFIG_ATOMIC64', cc.links(''' 2283bd87a367SPaolo Bonzini #include <stdint.h> 2284bd87a367SPaolo Bonzini int main(void) 2285bd87a367SPaolo Bonzini { 2286e61f1efeSRichard Henderson uint64_t x = 0, y = 0; 2287bd87a367SPaolo Bonzini y = __atomic_load_n(&x, __ATOMIC_RELAXED); 2288bd87a367SPaolo Bonzini __atomic_store_n(&x, y, __ATOMIC_RELAXED); 2289bd87a367SPaolo Bonzini __atomic_compare_exchange_n(&x, &y, x, 0, __ATOMIC_RELAXED, __ATOMIC_RELAXED); 2290bd87a367SPaolo Bonzini __atomic_exchange_n(&x, y, __ATOMIC_RELAXED); 2291bd87a367SPaolo Bonzini __atomic_fetch_add(&x, y, __ATOMIC_RELAXED); 2292bd87a367SPaolo Bonzini return 0; 2293e61f1efeSRichard Henderson }''')) 2294bd87a367SPaolo Bonzini 2295848126d1SMarc-André Lureauhas_int128 = cc.links(''' 2296848126d1SMarc-André Lureau __int128_t a; 2297848126d1SMarc-André Lureau __uint128_t b; 2298848126d1SMarc-André Lureau int main (void) { 2299848126d1SMarc-André Lureau a = a + b; 2300848126d1SMarc-André Lureau b = a * b; 2301848126d1SMarc-André Lureau a = a * a; 2302848126d1SMarc-André Lureau return 0; 2303848126d1SMarc-André Lureau }''') 2304848126d1SMarc-André Lureau 2305848126d1SMarc-André Lureauconfig_host_data.set('CONFIG_INT128', has_int128) 2306848126d1SMarc-André Lureau 2307848126d1SMarc-André Lureauif has_int128 2308d2958fb0SMarc-André Lureau # "do we have 128-bit atomics which are handled inline and specifically not 2309d2958fb0SMarc-André Lureau # via libatomic". The reason we can't use libatomic is documented in the 2310d2958fb0SMarc-André Lureau # comment starting "GCC is a house divided" in include/qemu/atomic128.h. 2311e61f1efeSRichard Henderson # We only care about these operations on 16-byte aligned pointers, so 2312e61f1efeSRichard Henderson # force 16-byte alignment of the pointer, which may be greater than 2313e61f1efeSRichard Henderson # __alignof(unsigned __int128) for the host. 2314e61f1efeSRichard Henderson atomic_test_128 = ''' 2315e61f1efeSRichard Henderson int main(int ac, char **av) { 2316e61f1efeSRichard Henderson unsigned __int128 *p = __builtin_assume_aligned(av[ac - 1], sizeof(16)); 2317e61f1efeSRichard Henderson p[1] = __atomic_load_n(&p[0], __ATOMIC_RELAXED); 2318e61f1efeSRichard Henderson __atomic_store_n(&p[2], p[3], __ATOMIC_RELAXED); 2319e61f1efeSRichard Henderson __atomic_compare_exchange_n(&p[4], &p[5], p[6], 0, __ATOMIC_RELAXED, __ATOMIC_RELAXED); 2320e61f1efeSRichard Henderson return 0; 2321e61f1efeSRichard Henderson }''' 2322e61f1efeSRichard Henderson has_atomic128 = cc.links(atomic_test_128) 2323848126d1SMarc-André Lureau 2324848126d1SMarc-André Lureau config_host_data.set('CONFIG_ATOMIC128', has_atomic128) 2325848126d1SMarc-André Lureau 2326848126d1SMarc-André Lureau if not has_atomic128 2327e61f1efeSRichard Henderson # Even with __builtin_assume_aligned, the above test may have failed 2328e61f1efeSRichard Henderson # without optimization enabled. Try again with optimizations locally 2329e61f1efeSRichard Henderson # enabled for the function. See 2330e61f1efeSRichard Henderson # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107389 2331e61f1efeSRichard Henderson has_atomic128_opt = cc.links('__attribute__((optimize("O1")))' + atomic_test_128) 2332e61f1efeSRichard Henderson config_host_data.set('CONFIG_ATOMIC128_OPT', has_atomic128_opt) 2333e61f1efeSRichard Henderson 2334e61f1efeSRichard Henderson if not has_atomic128_opt 2335e61f1efeSRichard Henderson config_host_data.set('CONFIG_CMPXCHG128', cc.links(''' 2336848126d1SMarc-André Lureau int main(void) 2337848126d1SMarc-André Lureau { 2338848126d1SMarc-André Lureau unsigned __int128 x = 0, y = 0; 2339848126d1SMarc-André Lureau __sync_val_compare_and_swap_16(&x, y, x); 2340848126d1SMarc-André Lureau return 0; 2341848126d1SMarc-André Lureau } 2342e61f1efeSRichard Henderson ''')) 2343e61f1efeSRichard Henderson endif 2344848126d1SMarc-André Lureau endif 2345848126d1SMarc-André Lureauendif 2346bd87a367SPaolo Bonzini 2347bd87a367SPaolo Bonziniconfig_host_data.set('CONFIG_GETAUXVAL', cc.links(gnu_source_prefix + ''' 2348bd87a367SPaolo Bonzini #include <sys/auxv.h> 2349bd87a367SPaolo Bonzini int main(void) { 2350bd87a367SPaolo Bonzini return getauxval(AT_HWCAP) == 0; 2351bd87a367SPaolo Bonzini }''')) 2352bd87a367SPaolo Bonzini 23530dae95d4SPaolo Bonziniconfig_host_data.set('CONFIG_USBFS', have_linux_user and cc.compiles(''' 23540dae95d4SPaolo Bonzini #include <linux/usbdevice_fs.h> 23550dae95d4SPaolo Bonzini 23560dae95d4SPaolo Bonzini #ifndef USBDEVFS_GET_CAPABILITIES 23570dae95d4SPaolo Bonzini #error "USBDEVFS_GET_CAPABILITIES undefined" 23580dae95d4SPaolo Bonzini #endif 23590dae95d4SPaolo Bonzini 23600dae95d4SPaolo Bonzini #ifndef USBDEVFS_DISCONNECT_CLAIM 23610dae95d4SPaolo Bonzini #error "USBDEVFS_DISCONNECT_CLAIM undefined" 23620dae95d4SPaolo Bonzini #endif 23630dae95d4SPaolo Bonzini 23640dae95d4SPaolo Bonzini int main(void) { return 0; }''')) 23650dae95d4SPaolo Bonzini 23662edd2c04SPaolo Bonzinihave_keyring = get_option('keyring') \ 23672edd2c04SPaolo Bonzini .require(targetos == 'linux', error_message: 'keyring is only available on Linux') \ 23682edd2c04SPaolo Bonzini .require(cc.compiles(''' 23692edd2c04SPaolo Bonzini #include <errno.h> 23702edd2c04SPaolo Bonzini #include <asm/unistd.h> 23712edd2c04SPaolo Bonzini #include <linux/keyctl.h> 23722edd2c04SPaolo Bonzini #include <sys/syscall.h> 23732edd2c04SPaolo Bonzini #include <unistd.h> 23742edd2c04SPaolo Bonzini int main(void) { 23752edd2c04SPaolo Bonzini return syscall(__NR_keyctl, KEYCTL_READ, 0, NULL, NULL, 0); 23762edd2c04SPaolo Bonzini }'''), error_message: 'keyctl syscall not available on this system').allowed() 23772edd2c04SPaolo Bonziniconfig_host_data.set('CONFIG_SECRET_KEYRING', have_keyring) 23782edd2c04SPaolo Bonzini 2379622753d2SPaolo Bonzinihave_cpuid_h = cc.links(''' 2380622753d2SPaolo Bonzini #include <cpuid.h> 2381622753d2SPaolo Bonzini int main(void) { 2382622753d2SPaolo Bonzini unsigned a, b, c, d; 2383622753d2SPaolo Bonzini unsigned max = __get_cpuid_max(0, 0); 2384622753d2SPaolo Bonzini 2385622753d2SPaolo Bonzini if (max >= 1) { 2386622753d2SPaolo Bonzini __cpuid(1, a, b, c, d); 2387622753d2SPaolo Bonzini } 2388622753d2SPaolo Bonzini 2389622753d2SPaolo Bonzini if (max >= 7) { 2390622753d2SPaolo Bonzini __cpuid_count(7, 0, a, b, c, d); 2391622753d2SPaolo Bonzini } 2392622753d2SPaolo Bonzini 2393622753d2SPaolo Bonzini return 0; 2394622753d2SPaolo Bonzini }''') 2395622753d2SPaolo Bonziniconfig_host_data.set('CONFIG_CPUID_H', have_cpuid_h) 2396622753d2SPaolo Bonzini 2397622753d2SPaolo Bonziniconfig_host_data.set('CONFIG_AVX2_OPT', get_option('avx2') \ 2398622753d2SPaolo Bonzini .require(have_cpuid_h, error_message: 'cpuid.h not available, cannot enable AVX2') \ 2399622753d2SPaolo Bonzini .require(cc.links(''' 2400622753d2SPaolo Bonzini #include <cpuid.h> 2401622753d2SPaolo Bonzini #include <immintrin.h> 2402701ea587SRichard Henderson static int __attribute__((target("avx2"))) bar(void *a) { 2403622753d2SPaolo Bonzini __m256i x = *(__m256i *)a; 2404622753d2SPaolo Bonzini return _mm256_testz_si256(x, x); 2405622753d2SPaolo Bonzini } 2406b5d3dac1SPaolo Bonzini int main(int argc, char *argv[]) { return bar(argv[argc - 1]); } 2407622753d2SPaolo Bonzini '''), error_message: 'AVX2 not available').allowed()) 2408622753d2SPaolo Bonzini 2409622753d2SPaolo Bonziniconfig_host_data.set('CONFIG_AVX512F_OPT', get_option('avx512f') \ 2410622753d2SPaolo Bonzini .require(have_cpuid_h, error_message: 'cpuid.h not available, cannot enable AVX512F') \ 2411622753d2SPaolo Bonzini .require(cc.links(''' 2412622753d2SPaolo Bonzini #include <cpuid.h> 2413622753d2SPaolo Bonzini #include <immintrin.h> 2414701ea587SRichard Henderson static int __attribute__((target("avx512f"))) bar(void *a) { 2415622753d2SPaolo Bonzini __m512i x = *(__m512i *)a; 2416622753d2SPaolo Bonzini return _mm512_test_epi64_mask(x, x); 2417622753d2SPaolo Bonzini } 2418b5d3dac1SPaolo Bonzini int main(int argc, char *argv[]) { return bar(argv[argc - 1]); } 2419622753d2SPaolo Bonzini '''), error_message: 'AVX512F not available').allowed()) 2420622753d2SPaolo Bonzini 242104ffce13Sling xuconfig_host_data.set('CONFIG_AVX512BW_OPT', get_option('avx512bw') \ 242204ffce13Sling xu .require(have_cpuid_h, error_message: 'cpuid.h not available, cannot enable AVX512BW') \ 242304ffce13Sling xu .require(cc.links(''' 242404ffce13Sling xu #include <cpuid.h> 242504ffce13Sling xu #include <immintrin.h> 2426dc165fcdSRichard Henderson static int __attribute__((target("avx512bw"))) bar(void *a) { 242704ffce13Sling xu __m512i *x = a; 242804ffce13Sling xu __m512i res= _mm512_abs_epi8(*x); 242904ffce13Sling xu return res[1]; 243004ffce13Sling xu } 243104ffce13Sling xu int main(int argc, char *argv[]) { return bar(argv[0]); } 243204ffce13Sling xu '''), error_message: 'AVX512BW not available').allowed()) 243304ffce13Sling xu 24343730a734SPaolo Bonzinihave_pvrdma = get_option('pvrdma') \ 24353730a734SPaolo Bonzini .require(rdma.found(), error_message: 'PVRDMA requires OpenFabrics libraries') \ 2436354d2d9bSJuan Quintela .require(cc.compiles(gnu_source_prefix + ''' 2437354d2d9bSJuan Quintela #include <sys/mman.h> 24383730a734SPaolo Bonzini int main(void) 24393730a734SPaolo Bonzini { 24403730a734SPaolo Bonzini char buf = 0; 24413730a734SPaolo Bonzini void *addr = &buf; 24423730a734SPaolo Bonzini addr = mremap(addr, 0, 1, MREMAP_MAYMOVE | MREMAP_FIXED); 24433730a734SPaolo Bonzini 24443730a734SPaolo Bonzini return 0; 24453730a734SPaolo Bonzini }'''), error_message: 'PVRDMA requires mremap').allowed() 24463730a734SPaolo Bonzini 24473730a734SPaolo Bonziniif have_pvrdma 2448354d2d9bSJuan Quintela config_host_data.set('LEGACY_RDMA_REG_MR', not cc.links(''' 24493730a734SPaolo Bonzini #include <infiniband/verbs.h> 24503730a734SPaolo Bonzini int main(void) 24513730a734SPaolo Bonzini { 24523730a734SPaolo Bonzini struct ibv_mr *mr; 24533730a734SPaolo Bonzini struct ibv_pd *pd = NULL; 24543730a734SPaolo Bonzini size_t length = 10; 24553730a734SPaolo Bonzini uint64_t iova = 0; 24563730a734SPaolo Bonzini int access = 0; 24573730a734SPaolo Bonzini void *addr = NULL; 24583730a734SPaolo Bonzini 24593730a734SPaolo Bonzini mr = ibv_reg_mr_iova(pd, addr, length, iova, access); 24603730a734SPaolo Bonzini ibv_dereg_mr(mr); 24613730a734SPaolo Bonzini return 0; 24623730a734SPaolo Bonzini }''')) 24633730a734SPaolo Bonziniendif 24643730a734SPaolo Bonzini 2465b87df904SPaolo Bonziniif get_option('membarrier').disabled() 2466b87df904SPaolo Bonzini have_membarrier = false 2467b87df904SPaolo Bonzinielif targetos == 'windows' 2468b87df904SPaolo Bonzini have_membarrier = true 2469b87df904SPaolo Bonzinielif targetos == 'linux' 2470b87df904SPaolo Bonzini have_membarrier = cc.compiles(''' 2471b87df904SPaolo Bonzini #include <linux/membarrier.h> 2472b87df904SPaolo Bonzini #include <sys/syscall.h> 2473b87df904SPaolo Bonzini #include <unistd.h> 2474b87df904SPaolo Bonzini #include <stdlib.h> 2475b87df904SPaolo Bonzini int main(void) { 2476b87df904SPaolo Bonzini syscall(__NR_membarrier, MEMBARRIER_CMD_QUERY, 0); 2477b87df904SPaolo Bonzini syscall(__NR_membarrier, MEMBARRIER_CMD_SHARED, 0); 2478b87df904SPaolo Bonzini exit(0); 2479b87df904SPaolo Bonzini }''') 2480b87df904SPaolo Bonziniendif 2481b87df904SPaolo Bonziniconfig_host_data.set('CONFIG_MEMBARRIER', get_option('membarrier') \ 2482b87df904SPaolo Bonzini .require(have_membarrier, error_message: 'membarrier system call not available') \ 2483b87df904SPaolo Bonzini .allowed()) 2484b87df904SPaolo Bonzini 248534b52615SPaolo Bonzinihave_afalg = get_option('crypto_afalg') \ 248634b52615SPaolo Bonzini .require(cc.compiles(gnu_source_prefix + ''' 248734b52615SPaolo Bonzini #include <errno.h> 248834b52615SPaolo Bonzini #include <sys/types.h> 248934b52615SPaolo Bonzini #include <sys/socket.h> 249034b52615SPaolo Bonzini #include <linux/if_alg.h> 249134b52615SPaolo Bonzini int main(void) { 249234b52615SPaolo Bonzini int sock; 249334b52615SPaolo Bonzini sock = socket(AF_ALG, SOCK_SEQPACKET, 0); 249434b52615SPaolo Bonzini return sock; 249534b52615SPaolo Bonzini } 249634b52615SPaolo Bonzini '''), error_message: 'AF_ALG requested but could not be detected').allowed() 249734b52615SPaolo Bonziniconfig_host_data.set('CONFIG_AF_ALG', have_afalg) 249834b52615SPaolo Bonzini 24999d734b85SMarc-André Lureauconfig_host_data.set('CONFIG_AF_VSOCK', cc.has_header_symbol( 25009d734b85SMarc-André Lureau 'linux/vm_sockets.h', 'AF_VSOCK', 25019d734b85SMarc-André Lureau prefix: '#include <sys/socket.h>', 25029d734b85SMarc-André Lureau)) 2503bd87a367SPaolo Bonzini 25048821a389SMarc-André Lureauhave_vss = false 2505872b69e6SMarc-André Lureauhave_vss_sdk = false # old xp/2003 SDK 25068821a389SMarc-André Lureauif targetos == 'windows' and link_language == 'cpp' 25078821a389SMarc-André Lureau have_vss = cxx.compiles(''' 25088821a389SMarc-André Lureau #define __MIDL_user_allocate_free_DEFINED__ 250932478cb6SMarc-André Lureau #include <vss.h> 25108821a389SMarc-André Lureau int main(void) { return VSS_CTX_BACKUP; }''') 2511872b69e6SMarc-André Lureau have_vss_sdk = cxx.has_header('vscoordint.h') 25128821a389SMarc-André Lureauendif 2513872b69e6SMarc-André Lureauconfig_host_data.set('HAVE_VSS_SDK', have_vss_sdk) 25148821a389SMarc-André Lureau 2515859aef02SPaolo Bonziniforeach k, v: config_host 2516ce6119dcSPaolo Bonzini if k.startswith('CONFIG_') 2517859aef02SPaolo Bonzini config_host_data.set(k, v == 'y' ? 1 : v) 2518859aef02SPaolo Bonzini endif 2519859aef02SPaolo Bonziniendforeach 2520859aef02SPaolo Bonzini 25216391c772SRichard Henderson# Older versions of MinGW do not import _lock_file and _unlock_file properly. 25226391c772SRichard Henderson# This was fixed for v6.0.0 with commit b48e3ac8969d. 25236391c772SRichard Hendersonif targetos == 'windows' 25246391c772SRichard Henderson config_host_data.set('HAVE__LOCK_FILE', cc.links(''' 25256391c772SRichard Henderson #include <stdio.h> 25266391c772SRichard Henderson int main(void) { 25276391c772SRichard Henderson _lock_file(NULL); 25286391c772SRichard Henderson _unlock_file(NULL); 25296391c772SRichard Henderson return 0; 25306391c772SRichard Henderson }''', name: '_lock_file and _unlock_file')) 25316391c772SRichard Hendersonendif 25326391c772SRichard Henderson 2533dbd672c8SPierrick Bouvierif targetos == 'windows' 2534dbd672c8SPierrick Bouvier mingw_has_setjmp_longjmp = cc.links(''' 2535dbd672c8SPierrick Bouvier #include <setjmp.h> 2536dbd672c8SPierrick Bouvier int main(void) { 2537dbd672c8SPierrick Bouvier /* 2538dbd672c8SPierrick Bouvier * These functions are not available in setjmp header, but may be 2539dbd672c8SPierrick Bouvier * available at link time, from libmingwex.a. 2540dbd672c8SPierrick Bouvier */ 2541dbd672c8SPierrick Bouvier extern int __mingw_setjmp(jmp_buf); 2542dbd672c8SPierrick Bouvier extern void __attribute__((noreturn)) __mingw_longjmp(jmp_buf, int); 2543dbd672c8SPierrick Bouvier jmp_buf env; 2544dbd672c8SPierrick Bouvier __mingw_setjmp(env); 2545dbd672c8SPierrick Bouvier __mingw_longjmp(env, 0); 2546dbd672c8SPierrick Bouvier } 2547dbd672c8SPierrick Bouvier ''', name: 'mingw setjmp and longjmp') 2548dbd672c8SPierrick Bouvier 2549dbd672c8SPierrick Bouvier if cpu == 'aarch64' and not mingw_has_setjmp_longjmp 2550dbd672c8SPierrick Bouvier error('mingw must provide setjmp/longjmp for windows-arm64') 2551dbd672c8SPierrick Bouvier endif 2552dbd672c8SPierrick Bouvierendif 2553dbd672c8SPierrick Bouvier 2554a0c9162cSPaolo Bonzini######################## 2555a0c9162cSPaolo Bonzini# Target configuration # 2556a0c9162cSPaolo Bonzini######################## 2557a0c9162cSPaolo Bonzini 25582becc36aSPaolo Bonziniminikconf = find_program('scripts/minikconf.py') 255905512f55SPaolo Bonziniconfig_all = {} 2560a98006bcSPaolo Bonziniconfig_all_devices = {} 2561ca0fc784SPaolo Bonziniconfig_all_disas = {} 25622becc36aSPaolo Bonziniconfig_devices_mak_list = [] 25632becc36aSPaolo Bonziniconfig_devices_h = {} 2564859aef02SPaolo Bonziniconfig_target_h = {} 25652becc36aSPaolo Bonziniconfig_target_mak = {} 2566ca0fc784SPaolo Bonzini 2567ca0fc784SPaolo Bonzinidisassemblers = { 2568ca0fc784SPaolo Bonzini 'alpha' : ['CONFIG_ALPHA_DIS'], 2569ca0fc784SPaolo Bonzini 'avr' : ['CONFIG_AVR_DIS'], 2570ca0fc784SPaolo Bonzini 'cris' : ['CONFIG_CRIS_DIS'], 25713e7a84eeSTaylor Simpson 'hexagon' : ['CONFIG_HEXAGON_DIS'], 2572ca0fc784SPaolo Bonzini 'hppa' : ['CONFIG_HPPA_DIS'], 2573ca0fc784SPaolo Bonzini 'i386' : ['CONFIG_I386_DIS'], 2574ca0fc784SPaolo Bonzini 'x86_64' : ['CONFIG_I386_DIS'], 2575ca0fc784SPaolo Bonzini 'm68k' : ['CONFIG_M68K_DIS'], 2576ca0fc784SPaolo Bonzini 'microblaze' : ['CONFIG_MICROBLAZE_DIS'], 2577ca0fc784SPaolo Bonzini 'mips' : ['CONFIG_MIPS_DIS'], 2578ca0fc784SPaolo Bonzini 'nios2' : ['CONFIG_NIOS2_DIS'], 2579ca0fc784SPaolo Bonzini 'or1k' : ['CONFIG_OPENRISC_DIS'], 2580ca0fc784SPaolo Bonzini 'ppc' : ['CONFIG_PPC_DIS'], 2581ca0fc784SPaolo Bonzini 'riscv' : ['CONFIG_RISCV_DIS'], 2582ca0fc784SPaolo Bonzini 'rx' : ['CONFIG_RX_DIS'], 2583ca0fc784SPaolo Bonzini 's390' : ['CONFIG_S390_DIS'], 2584ca0fc784SPaolo Bonzini 'sh4' : ['CONFIG_SH4_DIS'], 2585ca0fc784SPaolo Bonzini 'sparc' : ['CONFIG_SPARC_DIS'], 2586ca0fc784SPaolo Bonzini 'xtensa' : ['CONFIG_XTENSA_DIS'], 2587aae1746cSSong Gao 'loongarch' : ['CONFIG_LOONGARCH_DIS'], 2588ca0fc784SPaolo Bonzini} 2589ca0fc784SPaolo Bonzini 2590e1fbd2c4SPaolo Bonzinihave_ivshmem = config_host_data.get('CONFIG_EVENTFD') 25910a189110SPaolo Bonzinihost_kconfig = \ 2592537b7248SPaolo Bonzini (get_option('fuzzing') ? ['CONFIG_FUZZ=y'] : []) + \ 25930d04c4c9SPaolo Bonzini (have_tpm ? ['CONFIG_TPM=y'] : []) + \ 25943f0a5d55SMarc-André Lureau (spice.found() ? ['CONFIG_SPICE=y'] : []) + \ 2595ccd250aaSPaolo Bonzini (have_ivshmem ? ['CONFIG_IVSHMEM=y'] : []) + \ 259688b6e618SPaolo Bonzini (opengl.found() ? ['CONFIG_OPENGL=y'] : []) + \ 25979d71037fSPaolo Bonzini (x11.found() ? ['CONFIG_X11=y'] : []) + \ 25982a3129a3SPaolo Bonzini (have_vhost_user ? ['CONFIG_VHOST_USER=y'] : []) + \ 25992a3129a3SPaolo Bonzini (have_vhost_vdpa ? ['CONFIG_VHOST_VDPA=y'] : []) + \ 26002a3129a3SPaolo Bonzini (have_vhost_kernel ? ['CONFIG_VHOST_KERNEL=y'] : []) + \ 260169202b40SPaolo Bonzini (have_virtfs ? ['CONFIG_VIRTFS=y'] : []) + \ 26020a189110SPaolo Bonzini ('CONFIG_LINUX' in config_host ? ['CONFIG_LINUX=y'] : []) + \ 26033730a734SPaolo Bonzini (have_pvrdma ? ['CONFIG_PVRDMA=y'] : []) + \ 260455116968SJagannathan Raman (multiprocess_allowed ? ['CONFIG_MULTIPROCESS_ALLOWED=y'] : []) + \ 260555116968SJagannathan Raman (vfio_user_server_allowed ? ['CONFIG_VFIO_USER_SERVER_ALLOWED=y'] : []) 26060a189110SPaolo Bonzini 2607a9a74907SPaolo Bonziniignored = [ 'TARGET_XML_FILES', 'TARGET_ABI_DIR', 'TARGET_ARCH' ] 2608ca0fc784SPaolo Bonzini 2609fdb75aefSPaolo Bonzinidefault_targets = 'CONFIG_DEFAULT_TARGETS' in config_host 2610fdb75aefSPaolo Bonziniactual_target_dirs = [] 2611fbb4121dSPaolo Bonzinifdt_required = [] 2612a81df1b6SPaolo Bonziniforeach target : target_dirs 2613765686d6SPaolo Bonzini config_target = { 'TARGET_NAME': target.split('-')[0] } 2614765686d6SPaolo Bonzini if target.endswith('linux-user') 2615fdb75aefSPaolo Bonzini if targetos != 'linux' 2616fdb75aefSPaolo Bonzini if default_targets 2617fdb75aefSPaolo Bonzini continue 2618fdb75aefSPaolo Bonzini endif 2619fdb75aefSPaolo Bonzini error('Target @0@ is only available on a Linux host'.format(target)) 2620fdb75aefSPaolo Bonzini endif 2621765686d6SPaolo Bonzini config_target += { 'CONFIG_LINUX_USER': 'y' } 2622765686d6SPaolo Bonzini elif target.endswith('bsd-user') 2623fdb75aefSPaolo Bonzini if 'CONFIG_BSD' not in config_host 2624fdb75aefSPaolo Bonzini if default_targets 2625fdb75aefSPaolo Bonzini continue 2626fdb75aefSPaolo Bonzini endif 2627fdb75aefSPaolo Bonzini error('Target @0@ is only available on a BSD host'.format(target)) 2628fdb75aefSPaolo Bonzini endif 2629765686d6SPaolo Bonzini config_target += { 'CONFIG_BSD_USER': 'y' } 2630765686d6SPaolo Bonzini elif target.endswith('softmmu') 2631765686d6SPaolo Bonzini config_target += { 'CONFIG_SOFTMMU': 'y' } 2632765686d6SPaolo Bonzini endif 2633765686d6SPaolo Bonzini if target.endswith('-user') 2634765686d6SPaolo Bonzini config_target += { 2635765686d6SPaolo Bonzini 'CONFIG_USER_ONLY': 'y', 2636765686d6SPaolo Bonzini 'CONFIG_QEMU_INTERP_PREFIX': 2637ce6119dcSPaolo Bonzini get_option('interp_prefix').replace('%M', config_target['TARGET_NAME']) 2638765686d6SPaolo Bonzini } 2639765686d6SPaolo Bonzini endif 2640859aef02SPaolo Bonzini 26410a189110SPaolo Bonzini accel_kconfig = [] 26428a19980eSPaolo Bonzini foreach sym: accelerators 26438a19980eSPaolo Bonzini if sym == 'CONFIG_TCG' or target in accelerator_targets.get(sym, []) 26448a19980eSPaolo Bonzini config_target += { sym: 'y' } 26458a19980eSPaolo Bonzini config_all += { sym: 'y' } 2646dae0ec15SGerd Hoffmann if target in modular_tcg 2647dae0ec15SGerd Hoffmann config_target += { 'CONFIG_TCG_MODULAR': 'y' } 2648dae0ec15SGerd Hoffmann else 2649dae0ec15SGerd Hoffmann config_target += { 'CONFIG_TCG_BUILTIN': 'y' } 2650dae0ec15SGerd Hoffmann endif 26510a189110SPaolo Bonzini accel_kconfig += [ sym + '=y' ] 26528a19980eSPaolo Bonzini endif 26538a19980eSPaolo Bonzini endforeach 26540a189110SPaolo Bonzini if accel_kconfig.length() == 0 2655fdb75aefSPaolo Bonzini if default_targets 2656fdb75aefSPaolo Bonzini continue 2657fdb75aefSPaolo Bonzini endif 2658fdb75aefSPaolo Bonzini error('No accelerator available for target @0@'.format(target)) 2659fdb75aefSPaolo Bonzini endif 26608a19980eSPaolo Bonzini 2661fdb75aefSPaolo Bonzini actual_target_dirs += target 2662812b31d3SAlex Bennée config_target += keyval.load('configs/targets' / target + '.mak') 2663a9a74907SPaolo Bonzini config_target += { 'TARGET_' + config_target['TARGET_ARCH'].to_upper(): 'y' } 2664765686d6SPaolo Bonzini 2665fbb4121dSPaolo Bonzini if 'TARGET_NEED_FDT' in config_target 2666fbb4121dSPaolo Bonzini fdt_required += target 2667fbb4121dSPaolo Bonzini endif 2668fbb4121dSPaolo Bonzini 2669fa73168bSPaolo Bonzini # Add default keys 2670fa73168bSPaolo Bonzini if 'TARGET_BASE_ARCH' not in config_target 2671fa73168bSPaolo Bonzini config_target += {'TARGET_BASE_ARCH': config_target['TARGET_ARCH']} 2672fa73168bSPaolo Bonzini endif 2673fa73168bSPaolo Bonzini if 'TARGET_ABI_DIR' not in config_target 2674fa73168bSPaolo Bonzini config_target += {'TARGET_ABI_DIR': config_target['TARGET_ARCH']} 2675fa73168bSPaolo Bonzini endif 2676ee3eb3a7SMarc-André Lureau if 'TARGET_BIG_ENDIAN' not in config_target 2677ee3eb3a7SMarc-André Lureau config_target += {'TARGET_BIG_ENDIAN': 'n'} 2678ee3eb3a7SMarc-André Lureau endif 2679859aef02SPaolo Bonzini 2680ca0fc784SPaolo Bonzini foreach k, v: disassemblers 2681823eb013SPaolo Bonzini if host_arch.startswith(k) or config_target['TARGET_BASE_ARCH'].startswith(k) 2682ca0fc784SPaolo Bonzini foreach sym: v 2683ca0fc784SPaolo Bonzini config_target += { sym: 'y' } 2684ca0fc784SPaolo Bonzini config_all_disas += { sym: 'y' } 2685ca0fc784SPaolo Bonzini endforeach 2686ca0fc784SPaolo Bonzini endif 2687ca0fc784SPaolo Bonzini endforeach 2688ca0fc784SPaolo Bonzini 2689859aef02SPaolo Bonzini config_target_data = configuration_data() 2690859aef02SPaolo Bonzini foreach k, v: config_target 2691859aef02SPaolo Bonzini if not k.startswith('TARGET_') and not k.startswith('CONFIG_') 2692859aef02SPaolo Bonzini # do nothing 2693859aef02SPaolo Bonzini elif ignored.contains(k) 2694859aef02SPaolo Bonzini # do nothing 2695859aef02SPaolo Bonzini elif k == 'TARGET_BASE_ARCH' 2696a9a74907SPaolo Bonzini # Note that TARGET_BASE_ARCH ends up in config-target.h but it is 2697a9a74907SPaolo Bonzini # not used to select files from sourcesets. 2698859aef02SPaolo Bonzini config_target_data.set('TARGET_' + v.to_upper(), 1) 2699765686d6SPaolo Bonzini elif k == 'TARGET_NAME' or k == 'CONFIG_QEMU_INTERP_PREFIX' 2700859aef02SPaolo Bonzini config_target_data.set_quoted(k, v) 2701859aef02SPaolo Bonzini elif v == 'y' 2702859aef02SPaolo Bonzini config_target_data.set(k, 1) 2703ee3eb3a7SMarc-André Lureau elif v == 'n' 2704ee3eb3a7SMarc-André Lureau config_target_data.set(k, 0) 2705859aef02SPaolo Bonzini else 2706859aef02SPaolo Bonzini config_target_data.set(k, v) 2707859aef02SPaolo Bonzini endif 2708859aef02SPaolo Bonzini endforeach 2709cb2c5531SPeter Maydell config_target_data.set('QEMU_ARCH', 2710cb2c5531SPeter Maydell 'QEMU_ARCH_' + config_target['TARGET_BASE_ARCH'].to_upper()) 2711859aef02SPaolo Bonzini config_target_h += {target: configure_file(output: target + '-config-target.h', 2712859aef02SPaolo Bonzini configuration: config_target_data)} 27132becc36aSPaolo Bonzini 27142becc36aSPaolo Bonzini if target.endswith('-softmmu') 2715d1d5e9eeSAlex Bennée config_input = meson.get_external_property(target, 'default') 27162becc36aSPaolo Bonzini config_devices_mak = target + '-config-devices.mak' 27172becc36aSPaolo Bonzini config_devices_mak = configure_file( 2718d1d5e9eeSAlex Bennée input: ['configs/devices' / target / config_input + '.mak', 'Kconfig'], 27192becc36aSPaolo Bonzini output: config_devices_mak, 27202becc36aSPaolo Bonzini depfile: config_devices_mak + '.d', 27212becc36aSPaolo Bonzini capture: true, 27227bc3ca7fSPaolo Bonzini command: [minikconf, 27237bc3ca7fSPaolo Bonzini get_option('default_devices') ? '--defconfig' : '--allnoconfig', 27242becc36aSPaolo Bonzini config_devices_mak, '@DEPFILE@', '@INPUT@', 2725f4063f9cSPhilippe Mathieu-Daudé host_kconfig, accel_kconfig, 2726f4063f9cSPhilippe Mathieu-Daudé 'CONFIG_' + config_target['TARGET_ARCH'].to_upper() + '=y']) 2727859aef02SPaolo Bonzini 2728859aef02SPaolo Bonzini config_devices_data = configuration_data() 2729859aef02SPaolo Bonzini config_devices = keyval.load(config_devices_mak) 2730859aef02SPaolo Bonzini foreach k, v: config_devices 2731859aef02SPaolo Bonzini config_devices_data.set(k, 1) 2732859aef02SPaolo Bonzini endforeach 27332becc36aSPaolo Bonzini config_devices_mak_list += config_devices_mak 2734859aef02SPaolo Bonzini config_devices_h += {target: configure_file(output: target + '-config-devices.h', 2735859aef02SPaolo Bonzini configuration: config_devices_data)} 2736859aef02SPaolo Bonzini config_target += config_devices 2737a98006bcSPaolo Bonzini config_all_devices += config_devices 27382becc36aSPaolo Bonzini endif 27392becc36aSPaolo Bonzini config_target_mak += {target: config_target} 2740a81df1b6SPaolo Bonziniendforeach 2741fdb75aefSPaolo Bonzinitarget_dirs = actual_target_dirs 2742a81df1b6SPaolo Bonzini 27432becc36aSPaolo Bonzini# This configuration is used to build files that are shared by 27442becc36aSPaolo Bonzini# multiple binaries, and then extracted out of the "common" 27452becc36aSPaolo Bonzini# static_library target. 27462becc36aSPaolo Bonzini# 27472becc36aSPaolo Bonzini# We do not use all_sources()/all_dependencies(), because it would 27482becc36aSPaolo Bonzini# build literally all source files, including devices only used by 27492becc36aSPaolo Bonzini# targets that are not built for this compilation. The CONFIG_ALL 27502becc36aSPaolo Bonzini# pseudo symbol replaces it. 27512becc36aSPaolo Bonzini 275205512f55SPaolo Bonziniconfig_all += config_all_devices 27532becc36aSPaolo Bonziniconfig_all += config_host 27542becc36aSPaolo Bonziniconfig_all += config_all_disas 27552becc36aSPaolo Bonziniconfig_all += { 275614efd8d3SPaolo Bonzini 'CONFIG_XEN': xen.found(), 27572becc36aSPaolo Bonzini 'CONFIG_SOFTMMU': have_system, 27582becc36aSPaolo Bonzini 'CONFIG_USER_ONLY': have_user, 27592becc36aSPaolo Bonzini 'CONFIG_ALL': true, 27602becc36aSPaolo Bonzini} 27612becc36aSPaolo Bonzini 2762eed56e9aSPaolo Bonzinitarget_configs_h = [] 2763eed56e9aSPaolo Bonziniforeach target: target_dirs 2764eed56e9aSPaolo Bonzini target_configs_h += config_target_h[target] 2765eed56e9aSPaolo Bonzini target_configs_h += config_devices_h.get(target, []) 2766eed56e9aSPaolo Bonziniendforeach 2767eed56e9aSPaolo Bonzinigenh += custom_target('config-poison.h', 2768eed56e9aSPaolo Bonzini input: [target_configs_h], 2769eed56e9aSPaolo Bonzini output: 'config-poison.h', 2770eed56e9aSPaolo Bonzini capture: true, 2771eed56e9aSPaolo Bonzini command: [find_program('scripts/make-config-poison.sh'), 2772eed56e9aSPaolo Bonzini target_configs_h]) 2773eed56e9aSPaolo Bonzini 2774a0c9162cSPaolo Bonzini############## 2775a0c9162cSPaolo Bonzini# Submodules # 2776a0c9162cSPaolo Bonzini############## 27778b18cdbfSRichard Henderson 27788b18cdbfSRichard Hendersoncapstone = not_found 277983602083SThomas Huthif not get_option('capstone').auto() or have_system or have_user 278043ecd166SThomas Huth capstone = dependency('capstone', version: '>=3.0.5', 2781063d5119SPaolo Bonzini method: 'pkg-config', 278283602083SThomas Huth required: get_option('capstone')) 27838f4aea71SDaniel P. Berrangé 27848f4aea71SDaniel P. Berrangé # Some versions of capstone have broken pkg-config file 27858f4aea71SDaniel P. Berrangé # that reports a wrong -I path, causing the #include to 27868f4aea71SDaniel P. Berrangé # fail later. If the system has such a broken version 27878f4aea71SDaniel P. Berrangé # do not use it. 27888f4aea71SDaniel P. Berrangé if capstone.found() and not cc.compiles('#include <capstone.h>', 27898f4aea71SDaniel P. Berrangé dependencies: [capstone]) 27908f4aea71SDaniel P. Berrangé capstone = not_found 279183602083SThomas Huth if get_option('capstone').enabled() 279283602083SThomas Huth error('capstone requested, but it does not appear to work') 27938f4aea71SDaniel P. Berrangé endif 27948f4aea71SDaniel P. Berrangé endif 27958b18cdbfSRichard Hendersonendif 27964d34a86bSPaolo Bonzini 279755116968SJagannathan Ramanlibvfio_user_dep = not_found 279855116968SJagannathan Ramanif have_system and vfio_user_server_allowed 279955116968SJagannathan Raman have_internal = fs.exists(meson.current_source_dir() / 'subprojects/libvfio-user/meson.build') 280055116968SJagannathan Raman 280155116968SJagannathan Raman if not have_internal 280255116968SJagannathan Raman error('libvfio-user source not found - please pull git submodule') 280355116968SJagannathan Raman endif 280455116968SJagannathan Raman 280555116968SJagannathan Raman libvfio_user_proj = subproject('libvfio-user') 280655116968SJagannathan Raman 28075328353cSPaolo Bonzini libvfio_user_dep = libvfio_user_proj.get_variable('libvfio_user_dep') 280855116968SJagannathan Ramanendif 280955116968SJagannathan Raman 2810fbb4121dSPaolo Bonzinifdt = not_found 2811fbb4121dSPaolo Bonziniif have_system 2812c593d841SPhilippe Mathieu-Daudé fdt_opt = get_option('fdt') 2813fbb4121dSPaolo Bonzini if fdt_opt in ['enabled', 'auto', 'system'] 2814fbb4121dSPaolo Bonzini have_internal = fs.exists(meson.current_source_dir() / 'dtc/libfdt/Makefile.libfdt') 2815063d5119SPaolo Bonzini fdt = cc.find_library('fdt', 2816fbb4121dSPaolo Bonzini required: fdt_opt == 'system' or 2817fbb4121dSPaolo Bonzini fdt_opt == 'enabled' and not have_internal) 2818fbb4121dSPaolo Bonzini if fdt.found() and cc.links(''' 2819fbb4121dSPaolo Bonzini #include <libfdt.h> 2820fbb4121dSPaolo Bonzini #include <libfdt_env.h> 2821de47b0ffSThomas Huth int main(void) { fdt_find_max_phandle(NULL, NULL); return 0; }''', 2822fbb4121dSPaolo Bonzini dependencies: fdt) 2823fbb4121dSPaolo Bonzini fdt_opt = 'system' 28246c22853cSThomas Huth elif fdt_opt == 'system' 28256c22853cSThomas Huth error('system libfdt requested, but it is too old (1.5.1 or newer required)') 2826fbb4121dSPaolo Bonzini elif have_internal 2827fbb4121dSPaolo Bonzini fdt_opt = 'internal' 2828fbb4121dSPaolo Bonzini else 2829fbb4121dSPaolo Bonzini fdt_opt = 'disabled' 283087daf898SThomas Huth fdt = not_found 2831fbb4121dSPaolo Bonzini endif 2832fbb4121dSPaolo Bonzini endif 2833fbb4121dSPaolo Bonzini if fdt_opt == 'internal' 2834fbb4121dSPaolo Bonzini fdt_files = files( 2835fbb4121dSPaolo Bonzini 'dtc/libfdt/fdt.c', 2836fbb4121dSPaolo Bonzini 'dtc/libfdt/fdt_ro.c', 2837fbb4121dSPaolo Bonzini 'dtc/libfdt/fdt_wip.c', 2838fbb4121dSPaolo Bonzini 'dtc/libfdt/fdt_sw.c', 2839fbb4121dSPaolo Bonzini 'dtc/libfdt/fdt_rw.c', 2840fbb4121dSPaolo Bonzini 'dtc/libfdt/fdt_strerror.c', 2841fbb4121dSPaolo Bonzini 'dtc/libfdt/fdt_empty_tree.c', 2842fbb4121dSPaolo Bonzini 'dtc/libfdt/fdt_addresses.c', 2843fbb4121dSPaolo Bonzini 'dtc/libfdt/fdt_overlay.c', 2844fbb4121dSPaolo Bonzini 'dtc/libfdt/fdt_check.c', 2845fbb4121dSPaolo Bonzini ) 2846fbb4121dSPaolo Bonzini 2847fbb4121dSPaolo Bonzini fdt_inc = include_directories('dtc/libfdt') 2848fbb4121dSPaolo Bonzini libfdt = static_library('fdt', 2849610e7e0eSPhilippe Mathieu-Daudé build_by_default: false, 2850fbb4121dSPaolo Bonzini sources: fdt_files, 2851fbb4121dSPaolo Bonzini include_directories: fdt_inc) 2852fbb4121dSPaolo Bonzini fdt = declare_dependency(link_with: libfdt, 2853fbb4121dSPaolo Bonzini include_directories: fdt_inc) 2854fbb4121dSPaolo Bonzini endif 2855c593d841SPhilippe Mathieu-Daudéelse 2856c593d841SPhilippe Mathieu-Daudé fdt_opt = 'disabled' 2857fbb4121dSPaolo Bonziniendif 2858fbb4121dSPaolo Bonziniif not fdt.found() and fdt_required.length() > 0 2859fbb4121dSPaolo Bonzini error('fdt not available but required by targets ' + ', '.join(fdt_required)) 2860fbb4121dSPaolo Bonziniendif 2861fbb4121dSPaolo Bonzini 28628b18cdbfSRichard Hendersonconfig_host_data.set('CONFIG_CAPSTONE', capstone.found()) 2863fbb4121dSPaolo Bonziniconfig_host_data.set('CONFIG_FDT', fdt.found()) 28644d34a86bSPaolo Bonziniconfig_host_data.set('CONFIG_SLIRP', slirp.found()) 28658b18cdbfSRichard Henderson 2866a0c9162cSPaolo Bonzini##################### 2867a0c9162cSPaolo Bonzini# Generated sources # 2868a0c9162cSPaolo Bonzini##################### 28698b18cdbfSRichard Henderson 2870a0c9162cSPaolo Bonzinigenh += configure_file(output: 'config-host.h', configuration: config_host_data) 2871a81df1b6SPaolo Bonzini 28723f885659SMarc-André Lureauhxtool = find_program('scripts/hxtool') 2873e2c4012bSMarc-André Lureaushaderinclude = find_program('scripts/shaderinclude.py') 2874a81df1b6SPaolo Bonziniqapi_gen = find_program('scripts/qapi-gen.py') 2875654d6b04SPaolo Bonziniqapi_gen_depends = [ meson.current_source_dir() / 'scripts/qapi/__init__.py', 2876654d6b04SPaolo Bonzini meson.current_source_dir() / 'scripts/qapi/commands.py', 2877654d6b04SPaolo Bonzini meson.current_source_dir() / 'scripts/qapi/common.py', 2878654d6b04SPaolo Bonzini meson.current_source_dir() / 'scripts/qapi/error.py', 2879654d6b04SPaolo Bonzini meson.current_source_dir() / 'scripts/qapi/events.py', 2880654d6b04SPaolo Bonzini meson.current_source_dir() / 'scripts/qapi/expr.py', 2881654d6b04SPaolo Bonzini meson.current_source_dir() / 'scripts/qapi/gen.py', 2882654d6b04SPaolo Bonzini meson.current_source_dir() / 'scripts/qapi/introspect.py', 288388d357d2SMarkus Armbruster meson.current_source_dir() / 'scripts/qapi/main.py', 2884654d6b04SPaolo Bonzini meson.current_source_dir() / 'scripts/qapi/parser.py', 2885654d6b04SPaolo Bonzini meson.current_source_dir() / 'scripts/qapi/schema.py', 2886654d6b04SPaolo Bonzini meson.current_source_dir() / 'scripts/qapi/source.py', 2887654d6b04SPaolo Bonzini meson.current_source_dir() / 'scripts/qapi/types.py', 2888654d6b04SPaolo Bonzini meson.current_source_dir() / 'scripts/qapi/visit.py', 2889654d6b04SPaolo Bonzini meson.current_source_dir() / 'scripts/qapi-gen.py' 2890a81df1b6SPaolo Bonzini] 2891a81df1b6SPaolo Bonzini 2892a81df1b6SPaolo Bonzinitracetool = [ 2893a81df1b6SPaolo Bonzini python, files('scripts/tracetool.py'), 28949c29b741SPaolo Bonzini '--backend=' + ','.join(get_option('trace_backends')) 2895a81df1b6SPaolo Bonzini] 28960572d6cdSStefan Hajnoczitracetool_depends = files( 28970572d6cdSStefan Hajnoczi 'scripts/tracetool/backend/log.py', 28980572d6cdSStefan Hajnoczi 'scripts/tracetool/backend/__init__.py', 28990572d6cdSStefan Hajnoczi 'scripts/tracetool/backend/dtrace.py', 29000572d6cdSStefan Hajnoczi 'scripts/tracetool/backend/ftrace.py', 29010572d6cdSStefan Hajnoczi 'scripts/tracetool/backend/simple.py', 29020572d6cdSStefan Hajnoczi 'scripts/tracetool/backend/syslog.py', 29030572d6cdSStefan Hajnoczi 'scripts/tracetool/backend/ust.py', 29040572d6cdSStefan Hajnoczi 'scripts/tracetool/format/ust_events_c.py', 29050572d6cdSStefan Hajnoczi 'scripts/tracetool/format/ust_events_h.py', 29060572d6cdSStefan Hajnoczi 'scripts/tracetool/format/__init__.py', 29070572d6cdSStefan Hajnoczi 'scripts/tracetool/format/d.py', 29080572d6cdSStefan Hajnoczi 'scripts/tracetool/format/simpletrace_stap.py', 29090572d6cdSStefan Hajnoczi 'scripts/tracetool/format/c.py', 29100572d6cdSStefan Hajnoczi 'scripts/tracetool/format/h.py', 29110572d6cdSStefan Hajnoczi 'scripts/tracetool/format/log_stap.py', 29120572d6cdSStefan Hajnoczi 'scripts/tracetool/format/stap.py', 29130572d6cdSStefan Hajnoczi 'scripts/tracetool/__init__.py', 29140572d6cdSStefan Hajnoczi 'scripts/tracetool/vcpu.py' 29150572d6cdSStefan Hajnoczi) 2916a81df1b6SPaolo Bonzini 29172c273f32SMarc-André Lureauqemu_version_cmd = [find_program('scripts/qemu-version.sh'), 29182c273f32SMarc-André Lureau meson.current_source_dir(), 2919b0b4323eSPaolo Bonzini get_option('pkgversion'), meson.project_version()] 29202c273f32SMarc-André Lureauqemu_version = custom_target('qemu-version.h', 29212c273f32SMarc-André Lureau output: 'qemu-version.h', 29222c273f32SMarc-André Lureau command: qemu_version_cmd, 29232c273f32SMarc-André Lureau capture: true, 29242c273f32SMarc-André Lureau build_by_default: true, 29252c273f32SMarc-André Lureau build_always_stale: true) 29262c273f32SMarc-André Lureaugenh += qemu_version 29272c273f32SMarc-André Lureau 29283f885659SMarc-André Lureauhxdep = [] 29293f885659SMarc-André Lureauhx_headers = [ 29303f885659SMarc-André Lureau ['qemu-options.hx', 'qemu-options.def'], 29313f885659SMarc-André Lureau ['qemu-img-cmds.hx', 'qemu-img-cmds.h'], 29323f885659SMarc-André Lureau] 29333f885659SMarc-André Lureauif have_system 29343f885659SMarc-André Lureau hx_headers += [ 29353f885659SMarc-André Lureau ['hmp-commands.hx', 'hmp-commands.h'], 29363f885659SMarc-André Lureau ['hmp-commands-info.hx', 'hmp-commands-info.h'], 29373f885659SMarc-André Lureau ] 29383f885659SMarc-André Lureauendif 29393f885659SMarc-André Lureauforeach d : hx_headers 2940b7c70bf2SMarc-André Lureau hxdep += custom_target(d[1], 29413f885659SMarc-André Lureau input: files(d[0]), 29423f885659SMarc-André Lureau output: d[1], 29433f885659SMarc-André Lureau capture: true, 29443f885659SMarc-André Lureau build_by_default: true, # to be removed when added to a target 29453f885659SMarc-André Lureau command: [hxtool, '-h', '@INPUT0@']) 29463f885659SMarc-André Lureauendforeach 29473f885659SMarc-André Lureaugenh += hxdep 29483f885659SMarc-André Lureau 2949a0c9162cSPaolo Bonzini################### 2950a0c9162cSPaolo Bonzini# Collect sources # 2951a0c9162cSPaolo Bonzini################### 2952a81df1b6SPaolo Bonzini 295355567891SPhilippe Mathieu-Daudéauthz_ss = ss.source_set() 29547e2b888fSPhilippe Mathieu-Daudéblockdev_ss = ss.source_set() 29557e2b888fSPhilippe Mathieu-Daudéblock_ss = ss.source_set() 2956c2306d71SPhilippe Mathieu-Daudéchardev_ss = ss.source_set() 29577e2b888fSPhilippe Mathieu-Daudécommon_ss = ss.source_set() 29582389304aSPhilippe Mathieu-Daudécrypto_ss = ss.source_set() 2959f73fb063SPhilippe Mathieu-Daudéhwcore_ss = ss.source_set() 2960f78536b1SPhilippe Mathieu-Daudéio_ss = ss.source_set() 29617e2b888fSPhilippe Mathieu-Daudéqmp_ss = ss.source_set() 2962da33fc09SPhilippe Mathieu-Daudéqom_ss = ss.source_set() 29637e2b888fSPhilippe Mathieu-Daudésoftmmu_ss = ss.source_set() 29647e2b888fSPhilippe Mathieu-Daudéspecific_fuzz_ss = ss.source_set() 29657e2b888fSPhilippe Mathieu-Daudéspecific_ss = ss.source_set() 2966a81df1b6SPaolo Bonzinistub_ss = ss.source_set() 2967a81df1b6SPaolo Bonzinitrace_ss = ss.source_set() 29682becc36aSPaolo Bonziniuser_ss = ss.source_set() 29697e2b888fSPhilippe Mathieu-Daudéutil_ss = ss.source_set() 29702becc36aSPaolo Bonzini 2971c94a7b88SGerd Hoffmann# accel modules 2972c94a7b88SGerd Hoffmannqtest_module_ss = ss.source_set() 2973dae0ec15SGerd Hoffmanntcg_module_ss = ss.source_set() 2974c94a7b88SGerd Hoffmann 29753154fee4SMarc-André Lureaumodules = {} 2976db2e89dfSGerd Hoffmanntarget_modules = {} 29772becc36aSPaolo Bonzinihw_arch = {} 29782becc36aSPaolo Bonzinitarget_arch = {} 29792becc36aSPaolo Bonzinitarget_softmmu_arch = {} 298046369b50SPhilippe Mathieu-Daudétarget_user_arch = {} 2981a81df1b6SPaolo Bonzini 2982a81df1b6SPaolo Bonzini############### 2983a81df1b6SPaolo Bonzini# Trace files # 2984a81df1b6SPaolo Bonzini############### 2985a81df1b6SPaolo Bonzini 2986c9322ab5SMarc-André Lureau# TODO: add each directory to the subdirs from its own meson.build, once 2987c9322ab5SMarc-André Lureau# we have those 2988a81df1b6SPaolo Bonzinitrace_events_subdirs = [ 2989a81df1b6SPaolo Bonzini 'crypto', 299069ff4d0aSPhilippe Mathieu-Daudé 'qapi', 299169ff4d0aSPhilippe Mathieu-Daudé 'qom', 2992a81df1b6SPaolo Bonzini 'monitor', 299369ff4d0aSPhilippe Mathieu-Daudé 'util', 2994842b42dfSAlex Bennée 'gdbstub', 2995a81df1b6SPaolo Bonzini] 29966ddc1abeSWarner Loshif have_linux_user 2997a81df1b6SPaolo Bonzini trace_events_subdirs += [ 'linux-user' ] 2998a81df1b6SPaolo Bonziniendif 29996ddc1abeSWarner Loshif have_bsd_user 30006ddc1abeSWarner Losh trace_events_subdirs += [ 'bsd-user' ] 30016ddc1abeSWarner Loshendif 3002a81df1b6SPaolo Bonziniif have_block 3003a81df1b6SPaolo Bonzini trace_events_subdirs += [ 3004a81df1b6SPaolo Bonzini 'authz', 3005a81df1b6SPaolo Bonzini 'block', 3006a81df1b6SPaolo Bonzini 'io', 3007a81df1b6SPaolo Bonzini 'nbd', 3008a81df1b6SPaolo Bonzini 'scsi', 3009a81df1b6SPaolo Bonzini ] 3010a81df1b6SPaolo Bonziniendif 3011a81df1b6SPaolo Bonziniif have_system 3012a81df1b6SPaolo Bonzini trace_events_subdirs += [ 30138985db26SPhilippe Mathieu-Daudé 'accel/kvm', 3014a81df1b6SPaolo Bonzini 'audio', 3015a81df1b6SPaolo Bonzini 'backends', 3016a81df1b6SPaolo Bonzini 'backends/tpm', 3017a81df1b6SPaolo Bonzini 'chardev', 301846627f41SAndrew Melnychenko 'ebpf', 3019a81df1b6SPaolo Bonzini 'hw/9pfs', 3020a81df1b6SPaolo Bonzini 'hw/acpi', 302177c05b0bSHao Wu 'hw/adc', 3022a81df1b6SPaolo Bonzini 'hw/alpha', 3023a81df1b6SPaolo Bonzini 'hw/arm', 3024a81df1b6SPaolo Bonzini 'hw/audio', 3025a81df1b6SPaolo Bonzini 'hw/block', 3026a81df1b6SPaolo Bonzini 'hw/block/dataplane', 3027a81df1b6SPaolo Bonzini 'hw/char', 3028a81df1b6SPaolo Bonzini 'hw/display', 3029a81df1b6SPaolo Bonzini 'hw/dma', 3030a81df1b6SPaolo Bonzini 'hw/hyperv', 3031a81df1b6SPaolo Bonzini 'hw/i2c', 3032a81df1b6SPaolo Bonzini 'hw/i386', 3033a81df1b6SPaolo Bonzini 'hw/i386/xen', 3034aa98ee38SDavid Woodhouse 'hw/i386/kvm', 3035a81df1b6SPaolo Bonzini 'hw/ide', 3036a81df1b6SPaolo Bonzini 'hw/input', 3037a81df1b6SPaolo Bonzini 'hw/intc', 3038a81df1b6SPaolo Bonzini 'hw/isa', 3039a81df1b6SPaolo Bonzini 'hw/mem', 3040a81df1b6SPaolo Bonzini 'hw/mips', 3041a81df1b6SPaolo Bonzini 'hw/misc', 3042a81df1b6SPaolo Bonzini 'hw/misc/macio', 3043a81df1b6SPaolo Bonzini 'hw/net', 304498e5d7a2SVikram Garhwal 'hw/net/can', 3045ce0e6a2cSMark Cave-Ayland 'hw/nubus', 304688eea45cSKlaus Jensen 'hw/nvme', 3047a81df1b6SPaolo Bonzini 'hw/nvram', 3048a81df1b6SPaolo Bonzini 'hw/pci', 3049a81df1b6SPaolo Bonzini 'hw/pci-host', 3050a81df1b6SPaolo Bonzini 'hw/ppc', 3051a81df1b6SPaolo Bonzini 'hw/rdma', 3052a81df1b6SPaolo Bonzini 'hw/rdma/vmw', 3053a81df1b6SPaolo Bonzini 'hw/rtc', 3054a81df1b6SPaolo Bonzini 'hw/s390x', 3055a81df1b6SPaolo Bonzini 'hw/scsi', 3056a81df1b6SPaolo Bonzini 'hw/sd', 3057ad52cfc1SBALATON Zoltan 'hw/sh4', 3058a81df1b6SPaolo Bonzini 'hw/sparc', 3059a81df1b6SPaolo Bonzini 'hw/sparc64', 3060a81df1b6SPaolo Bonzini 'hw/ssi', 3061a81df1b6SPaolo Bonzini 'hw/timer', 3062a81df1b6SPaolo Bonzini 'hw/tpm', 3063a81df1b6SPaolo Bonzini 'hw/usb', 3064a81df1b6SPaolo Bonzini 'hw/vfio', 3065a81df1b6SPaolo Bonzini 'hw/virtio', 3066a81df1b6SPaolo Bonzini 'hw/watchdog', 3067a81df1b6SPaolo Bonzini 'hw/xen', 3068a81df1b6SPaolo Bonzini 'hw/gpio', 3069a81df1b6SPaolo Bonzini 'migration', 3070a81df1b6SPaolo Bonzini 'net', 30718b7a5507SPhilippe Mathieu-Daudé 'softmmu', 3072a81df1b6SPaolo Bonzini 'ui', 3073ad22c308SElena Ufimtseva 'hw/remote', 3074a81df1b6SPaolo Bonzini ] 3075a81df1b6SPaolo Bonziniendif 30768985db26SPhilippe Mathieu-Daudéif have_system or have_user 30778985db26SPhilippe Mathieu-Daudé trace_events_subdirs += [ 30788985db26SPhilippe Mathieu-Daudé 'accel/tcg', 30798985db26SPhilippe Mathieu-Daudé 'hw/core', 30808985db26SPhilippe Mathieu-Daudé 'target/arm', 3081a1477da3SAlexander Graf 'target/arm/hvf', 30828985db26SPhilippe Mathieu-Daudé 'target/hppa', 30838985db26SPhilippe Mathieu-Daudé 'target/i386', 30848985db26SPhilippe Mathieu-Daudé 'target/i386/kvm', 308534b8ff25SPhilippe Mathieu-Daudé 'target/mips/tcg', 30866f83e277SRichard Henderson 'target/nios2', 30878985db26SPhilippe Mathieu-Daudé 'target/ppc', 30888985db26SPhilippe Mathieu-Daudé 'target/riscv', 30898985db26SPhilippe Mathieu-Daudé 'target/s390x', 309067043607SCho, Yu-Chen 'target/s390x/kvm', 30918985db26SPhilippe Mathieu-Daudé 'target/sparc', 30928985db26SPhilippe Mathieu-Daudé ] 30938985db26SPhilippe Mathieu-Daudéendif 3094a81df1b6SPaolo Bonzini 30950df750e9SMarc-André Lureauvhost_user = not_found 30962a3129a3SPaolo Bonziniif targetos == 'linux' and have_vhost_user 30970df750e9SMarc-André Lureau libvhost_user = subproject('libvhost-user') 30980df750e9SMarc-André Lureau vhost_user = libvhost_user.get_variable('vhost_user_dep') 30990df750e9SMarc-André Lureauendif 31000df750e9SMarc-André Lureau 3101a6caeee8SXie Yongjilibvduse = not_found 3102a6caeee8SXie Yongjiif have_libvduse 3103a6caeee8SXie Yongji libvduse_proj = subproject('libvduse') 3104a6caeee8SXie Yongji libvduse = libvduse_proj.get_variable('libvduse_dep') 3105a6caeee8SXie Yongjiendif 3106a6caeee8SXie Yongji 3107b83a80e8SVladimir Sementsov-Ogievskiy# NOTE: the trace/ subdirectory needs the qapi_trace_events variable 3108b83a80e8SVladimir Sementsov-Ogievskiy# that is filled in by qapi/. 3109a81df1b6SPaolo Bonzinisubdir('qapi') 3110a81df1b6SPaolo Bonzinisubdir('qobject') 3111a81df1b6SPaolo Bonzinisubdir('stubs') 3112a81df1b6SPaolo Bonzinisubdir('trace') 3113a81df1b6SPaolo Bonzinisubdir('util') 31145582c58fSMarc-André Lureausubdir('qom') 31155582c58fSMarc-André Lureausubdir('authz') 3116a81df1b6SPaolo Bonzinisubdir('crypto') 31172d78b56eSMarc-André Lureausubdir('ui') 31187d5983e3SNicolas Saenz Juliennesubdir('hw') 3119842b42dfSAlex Bennéesubdir('gdbstub') 3120a81df1b6SPaolo Bonzini 31213154fee4SMarc-André Lureauif enable_modules 31223154fee4SMarc-André Lureau libmodulecommon = static_library('module-common', files('module-common.c') + genh, pic: true, c_args: '-DBUILD_DSO') 31233154fee4SMarc-André Lureau modulecommon = declare_dependency(link_whole: libmodulecommon, compile_args: '-DBUILD_DSO') 31243154fee4SMarc-André Lureauendif 31253154fee4SMarc-André Lureau 31267d5983e3SNicolas Saenz Julienneqom_ss = qom_ss.apply(config_host, strict: false) 31277d5983e3SNicolas Saenz Juliennelibqom = static_library('qom', qom_ss.sources() + genh, 31287d5983e3SNicolas Saenz Julienne dependencies: [qom_ss.dependencies()], 31297d5983e3SNicolas Saenz Julienne name_suffix: 'fa') 31307d5983e3SNicolas Saenz Julienneqom = declare_dependency(link_whole: libqom) 31317d5983e3SNicolas Saenz Julienne 31327d5983e3SNicolas Saenz Julienneevent_loop_base = files('event-loop-base.c') 31337d5983e3SNicolas Saenz Julienneevent_loop_base = static_library('event-loop-base', sources: event_loop_base + genh, 31347d5983e3SNicolas Saenz Julienne build_by_default: true) 31357d5983e3SNicolas Saenz Julienneevent_loop_base = declare_dependency(link_whole: event_loop_base, 31367d5983e3SNicolas Saenz Julienne dependencies: [qom]) 31377d5983e3SNicolas Saenz Julienne 31382becc36aSPaolo Bonzinistub_ss = stub_ss.apply(config_all, strict: false) 3139a81df1b6SPaolo Bonzini 3140a81df1b6SPaolo Bonziniutil_ss.add_all(trace_ss) 31412becc36aSPaolo Bonziniutil_ss = util_ss.apply(config_all, strict: false) 3142a81df1b6SPaolo Bonzinilibqemuutil = static_library('qemuutil', 3143a81df1b6SPaolo Bonzini sources: util_ss.sources() + stub_ss.sources() + genh, 31446d7c7c2dSPaolo Bonzini dependencies: [util_ss.dependencies(), libm, threads, glib, socket, malloc, pixman]) 3145a81df1b6SPaolo Bonziniqemuutil = declare_dependency(link_with: libqemuutil, 314670ac26b9SNicolas Saenz Julienne sources: genh + version_res, 314770ac26b9SNicolas Saenz Julienne dependencies: [event_loop_base]) 3148a81df1b6SPaolo Bonzini 3149957b31f6SPhilippe Mathieu-Daudéif have_system or have_user 3150abff1abfSPaolo Bonzini decodetree = generator(find_program('scripts/decodetree.py'), 3151abff1abfSPaolo Bonzini output: 'decode-@BASENAME@.c.inc', 3152abff1abfSPaolo Bonzini arguments: ['@INPUT@', '@EXTRA_ARGS@', '-o', '@OUTPUT@']) 3153957b31f6SPhilippe Mathieu-Daudé subdir('libdecnumber') 3154957b31f6SPhilippe Mathieu-Daudé subdir('target') 3155957b31f6SPhilippe Mathieu-Daudéendif 3156abff1abfSPaolo Bonzini 3157478e943fSPaolo Bonzinisubdir('audio') 31587fcfd456SMarc-André Lureausubdir('io') 3159848e8ff6SMarc-André Lureausubdir('chardev') 3160ec0d5893SMarc-André Lureausubdir('fsdev') 3161708eab42SMarc-André Lureausubdir('dump') 3162ec0d5893SMarc-André Lureau 3163f285bd3fSPhilippe Mathieu-Daudéif have_block 31645e5733e5SMarc-André Lureau block_ss.add(files( 31655e5733e5SMarc-André Lureau 'block.c', 31665e5733e5SMarc-André Lureau 'blockjob.c', 31675e5733e5SMarc-André Lureau 'job.c', 31685e5733e5SMarc-André Lureau 'qemu-io-cmds.c', 31695e5733e5SMarc-André Lureau )) 3170406523f6SPaolo Bonzini if config_host_data.get('CONFIG_REPLICATION') 3171406523f6SPaolo Bonzini block_ss.add(files('replication.c')) 3172406523f6SPaolo Bonzini endif 31735e5733e5SMarc-André Lureau 31745e5733e5SMarc-André Lureau subdir('nbd') 31755e5733e5SMarc-André Lureau subdir('scsi') 31765e5733e5SMarc-André Lureau subdir('block') 31775e5733e5SMarc-André Lureau 31784a96337dSPaolo Bonzini blockdev_ss.add(files( 31794a96337dSPaolo Bonzini 'blockdev.c', 3180cbc20bfbSStefan Hajnoczi 'blockdev-nbd.c', 31814a96337dSPaolo Bonzini 'iothread.c', 31824a96337dSPaolo Bonzini 'job-qmp.c', 31833eacf70bSRoman Bolshakov ), gnutls) 31844a96337dSPaolo Bonzini 31854a96337dSPaolo Bonzini # os-posix.c contains POSIX-specific functions used by qemu-storage-daemon, 31864a96337dSPaolo Bonzini # os-win32.c does not 31874a96337dSPaolo Bonzini blockdev_ss.add(when: 'CONFIG_POSIX', if_true: files('os-posix.c')) 31884a96337dSPaolo Bonzini softmmu_ss.add(when: 'CONFIG_WIN32', if_true: [files('os-win32.c')]) 3189f285bd3fSPhilippe Mathieu-Daudéendif 31904a96337dSPaolo Bonzini 31914a96337dSPaolo Bonzinicommon_ss.add(files('cpus-common.c')) 319231ffa2aaSPhilippe Mathieu-Daudéspecific_ss.add(files('cpu.c')) 31934a96337dSPaolo Bonzini 31945d3ea0e1SPaolo Bonzinisubdir('softmmu') 3195c9322ab5SMarc-André Lureau 319644b99a6dSRichard Henderson# Work around a gcc bug/misfeature wherein constant propagation looks 319744b99a6dSRichard Henderson# through an alias: 319844b99a6dSRichard Henderson# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99696 319944b99a6dSRichard Henderson# to guess that a const variable is always zero. Without lto, this is 320044b99a6dSRichard Henderson# impossible, as the alias is restricted to page-vary-common.c. Indeed, 320144b99a6dSRichard Henderson# without lto, not even the alias is required -- we simply use different 320244b99a6dSRichard Henderson# declarations in different compilation units. 320344b99a6dSRichard Hendersonpagevary = files('page-vary-common.c') 320444b99a6dSRichard Hendersonif get_option('b_lto') 320544b99a6dSRichard Henderson pagevary_flags = ['-fno-lto'] 320644b99a6dSRichard Henderson if get_option('cfi') 320744b99a6dSRichard Henderson pagevary_flags += '-fno-sanitize=cfi-icall' 320844b99a6dSRichard Henderson endif 320954c9b194SThomas Huth pagevary = static_library('page-vary-common', sources: pagevary + genh, 321044b99a6dSRichard Henderson c_args: pagevary_flags) 321144b99a6dSRichard Henderson pagevary = declare_dependency(link_with: pagevary) 321244b99a6dSRichard Hendersonendif 321344b99a6dSRichard Hendersoncommon_ss.add(pagevary) 32146670d4d0SRichard Hendersonspecific_ss.add(files('page-vary.c')) 32156670d4d0SRichard Henderson 3216ab318051SMarc-André Lureausubdir('backends') 3217c574e161SMarc-André Lureausubdir('disas') 321855166230SMarc-André Lureausubdir('migration') 3219ff219dcaSPaolo Bonzinisubdir('monitor') 3220cdaf0722SMarc-André Lureausubdir('net') 322117ef2af6SMarc-André Lureausubdir('replay') 32228df9f0c3SPhilippe Mathieu-Daudésubdir('semihosting') 3223aa09b3d5SMarkus Armbrustersubdir('stats') 3224104cc2c0SRichard Hendersonsubdir('tcg') 3225c6347541SRichard Hendersonsubdir('fpu') 32261a82878aSMarc-André Lureausubdir('accel') 3227f556b4a1SPaolo Bonzinisubdir('plugins') 3228bbf15aafSRichard Hendersonsubdir('ebpf') 3229bbf15aafSRichard Henderson 3230bbf15aafSRichard Hendersoncommon_user_inc = [] 3231bbf15aafSRichard Henderson 3232bbf15aafSRichard Hendersonsubdir('common-user') 3233b309c321SMarc-André Lureausubdir('bsd-user') 32343a30446aSMarc-André Lureausubdir('linux-user') 323546627f41SAndrew Melnychenko 3236a2ce7dbdSPaolo Bonzini# needed for fuzzing binaries 3237a2ce7dbdSPaolo Bonzinisubdir('tests/qtest/libqos') 323864ed6f92SPaolo Bonzinisubdir('tests/qtest/fuzz') 3239a2ce7dbdSPaolo Bonzini 3240c94a7b88SGerd Hoffmann# accel modules 3241dae0ec15SGerd Hoffmanntcg_real_module_ss = ss.source_set() 3242dae0ec15SGerd Hoffmanntcg_real_module_ss.add_all(when: 'CONFIG_TCG_MODULAR', if_true: tcg_module_ss) 3243dae0ec15SGerd Hoffmannspecific_ss.add_all(when: 'CONFIG_TCG_BUILTIN', if_true: tcg_module_ss) 3244dae0ec15SGerd Hoffmanntarget_modules += { 'accel' : { 'qtest': qtest_module_ss, 3245dae0ec15SGerd Hoffmann 'tcg': tcg_real_module_ss }} 3246c94a7b88SGerd Hoffmann 3247a0c9162cSPaolo Bonzini######################## 3248a0c9162cSPaolo Bonzini# Library dependencies # 3249a0c9162cSPaolo Bonzini######################## 3250a0c9162cSPaolo Bonzini 3251f5723ab6SGerd Hoffmannmodinfo_collect = find_program('scripts/modinfo-collect.py') 32525ebbfeccSGerd Hoffmannmodinfo_generate = find_program('scripts/modinfo-generate.py') 3253f5723ab6SGerd Hoffmannmodinfo_files = [] 3254f5723ab6SGerd Hoffmann 32553154fee4SMarc-André Lureaublock_mods = [] 32563154fee4SMarc-André Lureausoftmmu_mods = [] 32573154fee4SMarc-André Lureauforeach d, list : modules 3258ef709860SPaolo Bonzini if not (d == 'block' ? have_block : have_system) 3259ef709860SPaolo Bonzini continue 3260ef709860SPaolo Bonzini endif 3261ef709860SPaolo Bonzini 32623154fee4SMarc-André Lureau foreach m, module_ss : list 3263*6002711cSPaolo Bonzini if enable_modules 32643e292c51SGerd Hoffmann module_ss = module_ss.apply(config_all, strict: false) 32653154fee4SMarc-André Lureau sl = static_library(d + '-' + m, [genh, module_ss.sources()], 32663154fee4SMarc-André Lureau dependencies: [modulecommon, module_ss.dependencies()], pic: true) 32673154fee4SMarc-André Lureau if d == 'block' 32683154fee4SMarc-André Lureau block_mods += sl 32693154fee4SMarc-André Lureau else 32703154fee4SMarc-André Lureau softmmu_mods += sl 32713154fee4SMarc-André Lureau endif 3272f5723ab6SGerd Hoffmann if module_ss.sources() != [] 3273f5723ab6SGerd Hoffmann # FIXME: Should use sl.extract_all_objects(recursive: true) as 3274f5723ab6SGerd Hoffmann # input. Sources can be used multiple times but objects are 3275f5723ab6SGerd Hoffmann # unique when it comes to lookup in compile_commands.json. 3276f5723ab6SGerd Hoffmann # Depnds on a mesion version with 3277f5723ab6SGerd Hoffmann # https://github.com/mesonbuild/meson/pull/8900 3278f5723ab6SGerd Hoffmann modinfo_files += custom_target(d + '-' + m + '.modinfo', 3279f5723ab6SGerd Hoffmann output: d + '-' + m + '.modinfo', 3280ac347111SPaolo Bonzini input: module_ss.sources() + genh, 3281f5723ab6SGerd Hoffmann capture: true, 3282ac347111SPaolo Bonzini command: [modinfo_collect, module_ss.sources()]) 3283f5723ab6SGerd Hoffmann endif 32843154fee4SMarc-André Lureau else 32853154fee4SMarc-André Lureau if d == 'block' 32863154fee4SMarc-André Lureau block_ss.add_all(module_ss) 32873154fee4SMarc-André Lureau else 32883154fee4SMarc-André Lureau softmmu_ss.add_all(module_ss) 32893154fee4SMarc-André Lureau endif 32903154fee4SMarc-André Lureau endif 32913154fee4SMarc-André Lureau endforeach 32923154fee4SMarc-André Lureauendforeach 32933154fee4SMarc-André Lureau 3294db2e89dfSGerd Hoffmannforeach d, list : target_modules 3295db2e89dfSGerd Hoffmann foreach m, module_ss : list 3296*6002711cSPaolo Bonzini if enable_modules 3297db2e89dfSGerd Hoffmann foreach target : target_dirs 3298db2e89dfSGerd Hoffmann if target.endswith('-softmmu') 3299db2e89dfSGerd Hoffmann config_target = config_target_mak[target] 3300db2e89dfSGerd Hoffmann config_target += config_host 3301db2e89dfSGerd Hoffmann target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])] 3302db2e89dfSGerd Hoffmann c_args = ['-DNEED_CPU_H', 3303db2e89dfSGerd Hoffmann '-DCONFIG_TARGET="@0@-config-target.h"'.format(target), 3304db2e89dfSGerd Hoffmann '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)] 3305db2e89dfSGerd Hoffmann target_module_ss = module_ss.apply(config_target, strict: false) 3306db2e89dfSGerd Hoffmann if target_module_ss.sources() != [] 3307db2e89dfSGerd Hoffmann module_name = d + '-' + m + '-' + config_target['TARGET_NAME'] 3308db2e89dfSGerd Hoffmann sl = static_library(module_name, 3309db2e89dfSGerd Hoffmann [genh, target_module_ss.sources()], 3310db2e89dfSGerd Hoffmann dependencies: [modulecommon, target_module_ss.dependencies()], 3311db2e89dfSGerd Hoffmann include_directories: target_inc, 3312db2e89dfSGerd Hoffmann c_args: c_args, 3313db2e89dfSGerd Hoffmann pic: true) 3314db2e89dfSGerd Hoffmann softmmu_mods += sl 3315db2e89dfSGerd Hoffmann # FIXME: Should use sl.extract_all_objects(recursive: true) too. 3316db2e89dfSGerd Hoffmann modinfo_files += custom_target(module_name + '.modinfo', 3317db2e89dfSGerd Hoffmann output: module_name + '.modinfo', 3318917ddc27SGerd Hoffmann input: target_module_ss.sources() + genh, 3319db2e89dfSGerd Hoffmann capture: true, 3320917ddc27SGerd Hoffmann command: [modinfo_collect, '--target', target, target_module_ss.sources()]) 3321db2e89dfSGerd Hoffmann endif 3322db2e89dfSGerd Hoffmann endif 3323db2e89dfSGerd Hoffmann endforeach 3324db2e89dfSGerd Hoffmann else 3325db2e89dfSGerd Hoffmann specific_ss.add_all(module_ss) 3326db2e89dfSGerd Hoffmann endif 3327db2e89dfSGerd Hoffmann endforeach 3328db2e89dfSGerd Hoffmannendforeach 3329db2e89dfSGerd Hoffmann 33305ebbfeccSGerd Hoffmannif enable_modules 333105d6814cSJose R. Ziviani foreach target : target_dirs 333205d6814cSJose R. Ziviani if target.endswith('-softmmu') 333305d6814cSJose R. Ziviani config_target = config_target_mak[target] 333405d6814cSJose R. Ziviani config_devices_mak = target + '-config-devices.mak' 333505d6814cSJose R. Ziviani modinfo_src = custom_target('modinfo-' + target + '.c', 333605d6814cSJose R. Ziviani output: 'modinfo-' + target + '.c', 33375ebbfeccSGerd Hoffmann input: modinfo_files, 333805d6814cSJose R. Ziviani command: [modinfo_generate, '--devices', config_devices_mak, '@INPUT@'], 33395ebbfeccSGerd Hoffmann capture: true) 334005d6814cSJose R. Ziviani 334105d6814cSJose R. Ziviani modinfo_lib = static_library('modinfo-' + target + '.c', modinfo_src) 334205d6814cSJose R. Ziviani modinfo_dep = declare_dependency(link_with: modinfo_lib) 334305d6814cSJose R. Ziviani 334405d6814cSJose R. Ziviani arch = config_target['TARGET_NAME'] == 'sparc64' ? 'sparc64' : config_target['TARGET_BASE_ARCH'] 334505d6814cSJose R. Ziviani hw_arch[arch].add(modinfo_dep) 334605d6814cSJose R. Ziviani endif 334705d6814cSJose R. Ziviani endforeach 33485ebbfeccSGerd Hoffmannendif 33495ebbfeccSGerd Hoffmann 33503154fee4SMarc-André Lureaunm = find_program('nm') 3351604f3e4eSYonggang Luoundefsym = find_program('scripts/undefsym.py') 33523154fee4SMarc-André Lureaublock_syms = custom_target('block.syms', output: 'block.syms', 33533154fee4SMarc-André Lureau input: [libqemuutil, block_mods], 33543154fee4SMarc-André Lureau capture: true, 33553154fee4SMarc-André Lureau command: [undefsym, nm, '@INPUT@']) 33563154fee4SMarc-André Lureauqemu_syms = custom_target('qemu.syms', output: 'qemu.syms', 33573154fee4SMarc-André Lureau input: [libqemuutil, softmmu_mods], 33583154fee4SMarc-André Lureau capture: true, 33593154fee4SMarc-André Lureau command: [undefsym, nm, '@INPUT@']) 33603154fee4SMarc-André Lureau 336155567891SPhilippe Mathieu-Daudéauthz_ss = authz_ss.apply(config_host, strict: false) 336255567891SPhilippe Mathieu-Daudélibauthz = static_library('authz', authz_ss.sources() + genh, 336355567891SPhilippe Mathieu-Daudé dependencies: [authz_ss.dependencies()], 336455567891SPhilippe Mathieu-Daudé name_suffix: 'fa', 336555567891SPhilippe Mathieu-Daudé build_by_default: false) 336655567891SPhilippe Mathieu-Daudé 336755567891SPhilippe Mathieu-Daudéauthz = declare_dependency(link_whole: libauthz, 336855567891SPhilippe Mathieu-Daudé dependencies: qom) 336955567891SPhilippe Mathieu-Daudé 33702389304aSPhilippe Mathieu-Daudécrypto_ss = crypto_ss.apply(config_host, strict: false) 33712389304aSPhilippe Mathieu-Daudélibcrypto = static_library('crypto', crypto_ss.sources() + genh, 33722389304aSPhilippe Mathieu-Daudé dependencies: [crypto_ss.dependencies()], 33732389304aSPhilippe Mathieu-Daudé name_suffix: 'fa', 33742389304aSPhilippe Mathieu-Daudé build_by_default: false) 33752389304aSPhilippe Mathieu-Daudé 33762389304aSPhilippe Mathieu-Daudécrypto = declare_dependency(link_whole: libcrypto, 33772389304aSPhilippe Mathieu-Daudé dependencies: [authz, qom]) 33782389304aSPhilippe Mathieu-Daudé 3379f78536b1SPhilippe Mathieu-Daudéio_ss = io_ss.apply(config_host, strict: false) 3380f78536b1SPhilippe Mathieu-Daudélibio = static_library('io', io_ss.sources() + genh, 3381f78536b1SPhilippe Mathieu-Daudé dependencies: [io_ss.dependencies()], 3382f78536b1SPhilippe Mathieu-Daudé link_with: libqemuutil, 3383f78536b1SPhilippe Mathieu-Daudé name_suffix: 'fa', 3384f78536b1SPhilippe Mathieu-Daudé build_by_default: false) 3385f78536b1SPhilippe Mathieu-Daudé 3386f78536b1SPhilippe Mathieu-Daudéio = declare_dependency(link_whole: libio, dependencies: [crypto, qom]) 3387f78536b1SPhilippe Mathieu-Daudé 33887e6edef3SPhilippe Mathieu-Daudélibmigration = static_library('migration', sources: migration_files + genh, 33897e6edef3SPhilippe Mathieu-Daudé name_suffix: 'fa', 33907e6edef3SPhilippe Mathieu-Daudé build_by_default: false) 33917e6edef3SPhilippe Mathieu-Daudémigration = declare_dependency(link_with: libmigration, 33927e6edef3SPhilippe Mathieu-Daudé dependencies: [zlib, qom, io]) 33937e6edef3SPhilippe Mathieu-Daudésoftmmu_ss.add(migration) 33947e6edef3SPhilippe Mathieu-Daudé 33955e5733e5SMarc-André Lureaublock_ss = block_ss.apply(config_host, strict: false) 33965e5733e5SMarc-André Lureaulibblock = static_library('block', block_ss.sources() + genh, 33975e5733e5SMarc-André Lureau dependencies: block_ss.dependencies(), 33985e5733e5SMarc-André Lureau link_depends: block_syms, 33995e5733e5SMarc-André Lureau name_suffix: 'fa', 34005e5733e5SMarc-André Lureau build_by_default: false) 34015e5733e5SMarc-André Lureau 34025e5733e5SMarc-André Lureaublock = declare_dependency(link_whole: [libblock], 3403b7c70bf2SMarc-André Lureau link_args: '@block.syms', 3404b7c70bf2SMarc-André Lureau dependencies: [crypto, io]) 34055e5733e5SMarc-André Lureau 34064fb9071fSStefan Hajnocziblockdev_ss = blockdev_ss.apply(config_host, strict: false) 34074fb9071fSStefan Hajnoczilibblockdev = static_library('blockdev', blockdev_ss.sources() + genh, 34084fb9071fSStefan Hajnoczi dependencies: blockdev_ss.dependencies(), 34094fb9071fSStefan Hajnoczi name_suffix: 'fa', 34104fb9071fSStefan Hajnoczi build_by_default: false) 34114fb9071fSStefan Hajnoczi 34124fb9071fSStefan Hajnocziblockdev = declare_dependency(link_whole: [libblockdev], 34137d5983e3SNicolas Saenz Julienne dependencies: [block, event_loop_base]) 34144fb9071fSStefan Hajnoczi 3415ff219dcaSPaolo Bonziniqmp_ss = qmp_ss.apply(config_host, strict: false) 3416ff219dcaSPaolo Bonzinilibqmp = static_library('qmp', qmp_ss.sources() + genh, 3417ff219dcaSPaolo Bonzini dependencies: qmp_ss.dependencies(), 3418ff219dcaSPaolo Bonzini name_suffix: 'fa', 3419ff219dcaSPaolo Bonzini build_by_default: false) 3420ff219dcaSPaolo Bonzini 3421ff219dcaSPaolo Bonziniqmp = declare_dependency(link_whole: [libqmp]) 3422ff219dcaSPaolo Bonzini 3423c2306d71SPhilippe Mathieu-Daudélibchardev = static_library('chardev', chardev_ss.sources() + genh, 3424c2306d71SPhilippe Mathieu-Daudé name_suffix: 'fa', 342522d1f7a8SMarc-André Lureau dependencies: chardev_ss.dependencies(), 3426c2306d71SPhilippe Mathieu-Daudé build_by_default: false) 3427c2306d71SPhilippe Mathieu-Daudé 3428c2306d71SPhilippe Mathieu-Daudéchardev = declare_dependency(link_whole: libchardev) 3429c2306d71SPhilippe Mathieu-Daudé 3430f73fb063SPhilippe Mathieu-Daudéhwcore_ss = hwcore_ss.apply(config_host, strict: false) 3431f73fb063SPhilippe Mathieu-Daudélibhwcore = static_library('hwcore', sources: hwcore_ss.sources() + genh, 3432e28ab096SPhilippe Mathieu-Daudé name_suffix: 'fa', 3433e28ab096SPhilippe Mathieu-Daudé build_by_default: false) 3434e28ab096SPhilippe Mathieu-Daudéhwcore = declare_dependency(link_whole: libhwcore) 3435e28ab096SPhilippe Mathieu-Daudécommon_ss.add(hwcore) 3436e28ab096SPhilippe Mathieu-Daudé 3437064f8ee7SPhilippe Mathieu-Daudé########### 3438064f8ee7SPhilippe Mathieu-Daudé# Targets # 3439064f8ee7SPhilippe Mathieu-Daudé########### 3440064f8ee7SPhilippe Mathieu-Daudé 3441fb72176bSPaolo Bonziniemulator_modules = [] 34423154fee4SMarc-André Lureauforeach m : block_mods + softmmu_mods 3443fb72176bSPaolo Bonzini emulator_modules += shared_module(m.name(), 3444fb72176bSPaolo Bonzini build_by_default: true, 34453154fee4SMarc-André Lureau name_prefix: '', 34463154fee4SMarc-André Lureau link_whole: m, 34473154fee4SMarc-André Lureau install: true, 344816bf7a33SPaolo Bonzini install_dir: qemu_moddir) 34493154fee4SMarc-André Lureauendforeach 3450d8f3a609SPaolo Bonziniif emulator_modules.length() > 0 3451d8f3a609SPaolo Bonzini alias_target('modules', emulator_modules) 3452d8f3a609SPaolo Bonziniendif 34533154fee4SMarc-André Lureau 34544fb9071fSStefan Hajnoczisoftmmu_ss.add(authz, blockdev, chardev, crypto, io, qmp) 345564ed6f92SPaolo Bonzinicommon_ss.add(qom, qemuutil) 345664ed6f92SPaolo Bonzini 345764ed6f92SPaolo Bonzinicommon_ss.add_all(when: 'CONFIG_SOFTMMU', if_true: [softmmu_ss]) 34582becc36aSPaolo Bonzinicommon_ss.add_all(when: 'CONFIG_USER_ONLY', if_true: user_ss) 34592becc36aSPaolo Bonzini 34602becc36aSPaolo Bonzinicommon_all = common_ss.apply(config_all, strict: false) 34612becc36aSPaolo Bonzinicommon_all = static_library('common', 34622becc36aSPaolo Bonzini build_by_default: false, 34632becc36aSPaolo Bonzini sources: common_all.sources() + genh, 34649d24fb73SPaolo Bonzini include_directories: common_user_inc, 346575eebe0bSKatsuhiro Ueno implicit_include_directories: false, 34662becc36aSPaolo Bonzini dependencies: common_all.dependencies(), 34672becc36aSPaolo Bonzini name_suffix: 'fa') 34682becc36aSPaolo Bonzini 3469c9322ab5SMarc-André Lureaufeature_to_c = find_program('scripts/feature_to_c.sh') 3470c9322ab5SMarc-André Lureau 347130cfa50dSPhilippe Mathieu-Daudéif targetos == 'darwin' 347230cfa50dSPhilippe Mathieu-Daudé entitlement = find_program('scripts/entitlement.sh') 347330cfa50dSPhilippe Mathieu-Daudéendif 347430cfa50dSPhilippe Mathieu-Daudé 3475fd5eef85SPaolo Bonziniemulators = {} 34762becc36aSPaolo Bonziniforeach target : target_dirs 34772becc36aSPaolo Bonzini config_target = config_target_mak[target] 34782becc36aSPaolo Bonzini target_name = config_target['TARGET_NAME'] 3479ffb91f68SPaolo Bonzini target_base_arch = config_target['TARGET_BASE_ARCH'] 3480859aef02SPaolo Bonzini arch_srcs = [config_target_h[target]] 348164ed6f92SPaolo Bonzini arch_deps = [] 348264ed6f92SPaolo Bonzini c_args = ['-DNEED_CPU_H', 348364ed6f92SPaolo Bonzini '-DCONFIG_TARGET="@0@-config-target.h"'.format(target), 348464ed6f92SPaolo Bonzini '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)] 3485b6c7cfd4SPaolo Bonzini link_args = emulator_link_args 34862becc36aSPaolo Bonzini 3487859aef02SPaolo Bonzini config_target += config_host 34882becc36aSPaolo Bonzini target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])] 34892becc36aSPaolo Bonzini if targetos == 'linux' 34902becc36aSPaolo Bonzini target_inc += include_directories('linux-headers', is_system: true) 34912becc36aSPaolo Bonzini endif 34922becc36aSPaolo Bonzini if target.endswith('-softmmu') 34932becc36aSPaolo Bonzini target_type='system' 3494ffb91f68SPaolo Bonzini t = target_softmmu_arch[target_base_arch].apply(config_target, strict: false) 3495abff1abfSPaolo Bonzini arch_srcs += t.sources() 349664ed6f92SPaolo Bonzini arch_deps += t.dependencies() 3497abff1abfSPaolo Bonzini 3498ffb91f68SPaolo Bonzini hw_dir = target_name == 'sparc64' ? 'sparc64' : target_base_arch 34992c44220dSMarc-André Lureau hw = hw_arch[hw_dir].apply(config_target, strict: false) 35002c44220dSMarc-André Lureau arch_srcs += hw.sources() 350164ed6f92SPaolo Bonzini arch_deps += hw.dependencies() 35022c44220dSMarc-André Lureau 35032becc36aSPaolo Bonzini arch_srcs += config_devices_h[target] 350464ed6f92SPaolo Bonzini link_args += ['@block.syms', '@qemu.syms'] 35052becc36aSPaolo Bonzini else 35063a30446aSMarc-André Lureau abi = config_target['TARGET_ABI_DIR'] 35072becc36aSPaolo Bonzini target_type='user' 3508a3a576b0SPaolo Bonzini target_inc += common_user_inc 3509ffb91f68SPaolo Bonzini if target_base_arch in target_user_arch 3510ffb91f68SPaolo Bonzini t = target_user_arch[target_base_arch].apply(config_target, strict: false) 351146369b50SPhilippe Mathieu-Daudé arch_srcs += t.sources() 351246369b50SPhilippe Mathieu-Daudé arch_deps += t.dependencies() 351346369b50SPhilippe Mathieu-Daudé endif 35142becc36aSPaolo Bonzini if 'CONFIG_LINUX_USER' in config_target 35152becc36aSPaolo Bonzini base_dir = 'linux-user' 3516e2a74729SWarner Losh endif 3517e2a74729SWarner Losh if 'CONFIG_BSD_USER' in config_target 35182becc36aSPaolo Bonzini base_dir = 'bsd-user' 3519e2a74729SWarner Losh target_inc += include_directories('bsd-user/' / targetos) 352085fc1b5dSWarner Losh target_inc += include_directories('bsd-user/host/' / host_arch) 3521e2a74729SWarner Losh dir = base_dir / abi 352219bf129fSWarner Losh arch_srcs += files(dir / 'signal.c', dir / 'target_arch_cpu.c') 35232becc36aSPaolo Bonzini endif 35242becc36aSPaolo Bonzini target_inc += include_directories( 35252becc36aSPaolo Bonzini base_dir, 35263a30446aSMarc-André Lureau base_dir / abi, 35272becc36aSPaolo Bonzini ) 35283a30446aSMarc-André Lureau if 'CONFIG_LINUX_USER' in config_target 35293a30446aSMarc-André Lureau dir = base_dir / abi 35303a30446aSMarc-André Lureau arch_srcs += files(dir / 'signal.c', dir / 'cpu_loop.c') 35313a30446aSMarc-André Lureau if config_target.has_key('TARGET_SYSTBL_ABI') 35323a30446aSMarc-André Lureau arch_srcs += \ 35333a30446aSMarc-André Lureau syscall_nr_generators[abi].process(base_dir / abi / config_target['TARGET_SYSTBL'], 35343a30446aSMarc-André Lureau extra_args : config_target['TARGET_SYSTBL_ABI']) 35353a30446aSMarc-André Lureau endif 35363a30446aSMarc-André Lureau endif 35372becc36aSPaolo Bonzini endif 35382becc36aSPaolo Bonzini 3539c9322ab5SMarc-André Lureau if 'TARGET_XML_FILES' in config_target 3540c9322ab5SMarc-André Lureau gdbstub_xml = custom_target(target + '-gdbstub-xml.c', 3541c9322ab5SMarc-André Lureau output: target + '-gdbstub-xml.c', 3542c9322ab5SMarc-André Lureau input: files(config_target['TARGET_XML_FILES'].split()), 3543c9322ab5SMarc-André Lureau command: [feature_to_c, '@INPUT@'], 3544c9322ab5SMarc-André Lureau capture: true) 3545c9322ab5SMarc-André Lureau arch_srcs += gdbstub_xml 3546c9322ab5SMarc-André Lureau endif 3547c9322ab5SMarc-André Lureau 3548ffb91f68SPaolo Bonzini t = target_arch[target_base_arch].apply(config_target, strict: false) 3549abff1abfSPaolo Bonzini arch_srcs += t.sources() 355064ed6f92SPaolo Bonzini arch_deps += t.dependencies() 3551abff1abfSPaolo Bonzini 35522becc36aSPaolo Bonzini target_common = common_ss.apply(config_target, strict: false) 35532becc36aSPaolo Bonzini objects = common_all.extract_objects(target_common.sources()) 355464ed6f92SPaolo Bonzini deps = target_common.dependencies() 35552becc36aSPaolo Bonzini 35562becc36aSPaolo Bonzini target_specific = specific_ss.apply(config_target, strict: false) 35572becc36aSPaolo Bonzini arch_srcs += target_specific.sources() 355864ed6f92SPaolo Bonzini arch_deps += target_specific.dependencies() 35592becc36aSPaolo Bonzini 356064ed6f92SPaolo Bonzini lib = static_library('qemu-' + target, 3561859aef02SPaolo Bonzini sources: arch_srcs + genh, 3562b7612f45SPaolo Bonzini dependencies: arch_deps, 35632becc36aSPaolo Bonzini objects: objects, 35642becc36aSPaolo Bonzini include_directories: target_inc, 356564ed6f92SPaolo Bonzini c_args: c_args, 356664ed6f92SPaolo Bonzini build_by_default: false, 35672becc36aSPaolo Bonzini name_suffix: 'fa') 356864ed6f92SPaolo Bonzini 356964ed6f92SPaolo Bonzini if target.endswith('-softmmu') 357064ed6f92SPaolo Bonzini execs = [{ 357164ed6f92SPaolo Bonzini 'name': 'qemu-system-' + target_name, 3572654d6b04SPaolo Bonzini 'win_subsystem': 'console', 357364ed6f92SPaolo Bonzini 'sources': files('softmmu/main.c'), 357464ed6f92SPaolo Bonzini 'dependencies': [] 357564ed6f92SPaolo Bonzini }] 357635be72baSPaolo Bonzini if targetos == 'windows' and (sdl.found() or gtk.found()) 357764ed6f92SPaolo Bonzini execs += [{ 357864ed6f92SPaolo Bonzini 'name': 'qemu-system-' + target_name + 'w', 3579654d6b04SPaolo Bonzini 'win_subsystem': 'windows', 358064ed6f92SPaolo Bonzini 'sources': files('softmmu/main.c'), 358164ed6f92SPaolo Bonzini 'dependencies': [] 358264ed6f92SPaolo Bonzini }] 358364ed6f92SPaolo Bonzini endif 3584537b7248SPaolo Bonzini if get_option('fuzzing') 358564ed6f92SPaolo Bonzini specific_fuzz = specific_fuzz_ss.apply(config_target, strict: false) 358664ed6f92SPaolo Bonzini execs += [{ 358764ed6f92SPaolo Bonzini 'name': 'qemu-fuzz-' + target_name, 3588654d6b04SPaolo Bonzini 'win_subsystem': 'console', 358964ed6f92SPaolo Bonzini 'sources': specific_fuzz.sources(), 359064ed6f92SPaolo Bonzini 'dependencies': specific_fuzz.dependencies(), 359164ed6f92SPaolo Bonzini }] 359264ed6f92SPaolo Bonzini endif 359364ed6f92SPaolo Bonzini else 359464ed6f92SPaolo Bonzini execs = [{ 359564ed6f92SPaolo Bonzini 'name': 'qemu-' + target_name, 3596654d6b04SPaolo Bonzini 'win_subsystem': 'console', 359764ed6f92SPaolo Bonzini 'sources': [], 359864ed6f92SPaolo Bonzini 'dependencies': [] 359964ed6f92SPaolo Bonzini }] 360064ed6f92SPaolo Bonzini endif 360164ed6f92SPaolo Bonzini foreach exe: execs 36028a74ce61SAlexander Graf exe_name = exe['name'] 36033983a767SJohn Arbuckle if targetos == 'darwin' 36048a74ce61SAlexander Graf exe_name += '-unsigned' 36058a74ce61SAlexander Graf endif 36068a74ce61SAlexander Graf 36078a74ce61SAlexander Graf emulator = executable(exe_name, exe['sources'], 3608237377acSAkihiko Odaki install: true, 360964ed6f92SPaolo Bonzini c_args: c_args, 361064ed6f92SPaolo Bonzini dependencies: arch_deps + deps + exe['dependencies'], 361164ed6f92SPaolo Bonzini objects: lib.extract_all_objects(recursive: true), 361264ed6f92SPaolo Bonzini link_language: link_language, 361364ed6f92SPaolo Bonzini link_depends: [block_syms, qemu_syms] + exe.get('link_depends', []), 361464ed6f92SPaolo Bonzini link_args: link_args, 3615654d6b04SPaolo Bonzini win_subsystem: exe['win_subsystem']) 36168a74ce61SAlexander Graf 36173983a767SJohn Arbuckle if targetos == 'darwin' 3618411ad8ddSAkihiko Odaki icon = 'pc-bios/qemu.rsrc' 3619411ad8ddSAkihiko Odaki build_input = [emulator, files(icon)] 3620411ad8ddSAkihiko Odaki install_input = [ 3621411ad8ddSAkihiko Odaki get_option('bindir') / exe_name, 3622411ad8ddSAkihiko Odaki meson.current_source_dir() / icon 3623411ad8ddSAkihiko Odaki ] 3624411ad8ddSAkihiko Odaki if 'CONFIG_HVF' in config_target 3625411ad8ddSAkihiko Odaki entitlements = 'accel/hvf/entitlements.plist' 3626411ad8ddSAkihiko Odaki build_input += files(entitlements) 3627411ad8ddSAkihiko Odaki install_input += meson.current_source_dir() / entitlements 3628411ad8ddSAkihiko Odaki endif 3629411ad8ddSAkihiko Odaki 36308a74ce61SAlexander Graf emulators += {exe['name'] : custom_target(exe['name'], 3631411ad8ddSAkihiko Odaki input: build_input, 36328a74ce61SAlexander Graf output: exe['name'], 3633235b523dSPhilippe Mathieu-Daudé command: [entitlement, '@OUTPUT@', '@INPUT@']) 3634fd5eef85SPaolo Bonzini } 3635237377acSAkihiko Odaki 3636235b523dSPhilippe Mathieu-Daudé meson.add_install_script(entitlement, '--install', 3637237377acSAkihiko Odaki get_option('bindir') / exe['name'], 3638411ad8ddSAkihiko Odaki install_input) 36398a74ce61SAlexander Graf else 36408a74ce61SAlexander Graf emulators += {exe['name']: emulator} 36418a74ce61SAlexander Graf endif 364210e1d263SMarc-André Lureau 36439c29b741SPaolo Bonzini if stap.found() 364410e1d263SMarc-André Lureau foreach stp: [ 3645bd5f973aSStefan Hajnoczi {'ext': '.stp-build', 'fmt': 'stap', 'bin': meson.current_build_dir() / exe['name'], 'install': false}, 3646bd5f973aSStefan Hajnoczi {'ext': '.stp', 'fmt': 'stap', 'bin': get_option('prefix') / get_option('bindir') / exe['name'], 'install': true}, 364710e1d263SMarc-André Lureau {'ext': '-simpletrace.stp', 'fmt': 'simpletrace-stap', 'bin': '', 'install': true}, 364810e1d263SMarc-André Lureau {'ext': '-log.stp', 'fmt': 'log-stap', 'bin': '', 'install': true}, 364910e1d263SMarc-André Lureau ] 3650bd5f973aSStefan Hajnoczi custom_target(exe['name'] + stp['ext'], 365110e1d263SMarc-André Lureau input: trace_events_all, 3652bd5f973aSStefan Hajnoczi output: exe['name'] + stp['ext'], 365310e1d263SMarc-André Lureau install: stp['install'], 365416bf7a33SPaolo Bonzini install_dir: get_option('datadir') / 'systemtap/tapset', 365510e1d263SMarc-André Lureau command: [ 365610e1d263SMarc-André Lureau tracetool, '--group=all', '--format=' + stp['fmt'], 365710e1d263SMarc-André Lureau '--binary=' + stp['bin'], 365810e1d263SMarc-André Lureau '--target-name=' + target_name, 365910e1d263SMarc-André Lureau '--target-type=' + target_type, 366010e1d263SMarc-André Lureau '--probe-prefix=qemu.' + target_type + '.' + target_name, 3661c05012a3SStefan Hajnoczi '@INPUT@', '@OUTPUT@' 36620572d6cdSStefan Hajnoczi ], 36630572d6cdSStefan Hajnoczi depend_files: tracetool_depends) 366410e1d263SMarc-André Lureau endforeach 366510e1d263SMarc-André Lureau endif 366664ed6f92SPaolo Bonzini endforeach 36672becc36aSPaolo Bonziniendforeach 36682becc36aSPaolo Bonzini 3669931049b4SPaolo Bonzini# Other build targets 3670897b5afaSMarc-André Lureau 3671f556b4a1SPaolo Bonziniif 'CONFIG_PLUGIN' in config_host 3672f556b4a1SPaolo Bonzini install_headers('include/qemu/qemu-plugin.h') 3673f556b4a1SPaolo Bonziniendif 3674f556b4a1SPaolo Bonzini 3675f15bff25SPaolo Bonzinisubdir('qga') 3676f15bff25SPaolo Bonzini 36779755c94aSLaurent Vivier# Don't build qemu-keymap if xkbcommon is not explicitly enabled 36789755c94aSLaurent Vivier# when we don't build tools or system 36794113f4cfSLaurent Vivierif xkbcommon.found() 368028742467SMarc-André Lureau # used for the update-keymaps target, so include rules even if !have_tools 368128742467SMarc-André Lureau qemu_keymap = executable('qemu-keymap', files('qemu-keymap.c', 'ui/input-keymap.c') + genh, 368228742467SMarc-André Lureau dependencies: [qemuutil, xkbcommon], install: have_tools) 368328742467SMarc-André Lureauendif 368428742467SMarc-André Lureau 3685931049b4SPaolo Bonziniif have_tools 3686b7c70bf2SMarc-André Lureau qemu_img = executable('qemu-img', [files('qemu-img.c'), hxdep], 3687b7c70bf2SMarc-André Lureau dependencies: [authz, block, crypto, io, qom, qemuutil], install: true) 3688b7c70bf2SMarc-André Lureau qemu_io = executable('qemu-io', files('qemu-io.c'), 3689b7c70bf2SMarc-André Lureau dependencies: [block, qemuutil], install: true) 3690b7c70bf2SMarc-André Lureau qemu_nbd = executable('qemu-nbd', files('qemu-nbd.c'), 36913d212b41SRichard W.M. Jones dependencies: [blockdev, qemuutil, gnutls, selinux], 36923d212b41SRichard W.M. Jones install: true) 3693b7c70bf2SMarc-André Lureau 36947c58bb76SPaolo Bonzini subdir('storage-daemon') 3695a9c9727cSPaolo Bonzini subdir('contrib/rdmacm-mux') 36961d7bb6abSMarc-André Lureau subdir('contrib/elf2dmp') 3697a9c9727cSPaolo Bonzini 3698157e7b13SMarc-André Lureau executable('qemu-edid', files('qemu-edid.c', 'hw/display/edid-generate.c'), 3699157e7b13SMarc-André Lureau dependencies: qemuutil, 3700157e7b13SMarc-André Lureau install: true) 3701157e7b13SMarc-André Lureau 37022a3129a3SPaolo Bonzini if have_vhost_user 37032d7ac0afSPaolo Bonzini subdir('contrib/vhost-user-blk') 3704ea458960SMarc-André Lureau subdir('contrib/vhost-user-gpu') 370532fcc624SMarc-André Lureau subdir('contrib/vhost-user-input') 370699650b62SPaolo Bonzini subdir('contrib/vhost-user-scsi') 3707931049b4SPaolo Bonzini endif 37088f51e01cSMarc-André Lureau 37098f51e01cSMarc-André Lureau if targetos == 'linux' 37108f51e01cSMarc-André Lureau executable('qemu-bridge-helper', files('qemu-bridge-helper.c'), 37118f51e01cSMarc-André Lureau dependencies: [qemuutil, libcap_ng], 37128f51e01cSMarc-André Lureau install: true, 37138f51e01cSMarc-André Lureau install_dir: get_option('libexecdir')) 3714897b5afaSMarc-André Lureau 3715897b5afaSMarc-André Lureau executable('qemu-pr-helper', files('scsi/qemu-pr-helper.c', 'scsi/utils.c'), 3716897b5afaSMarc-André Lureau dependencies: [authz, crypto, io, qom, qemuutil, 37176ec0e15dSPaolo Bonzini libcap_ng, mpathpersist], 3718897b5afaSMarc-André Lureau install: true) 37198f51e01cSMarc-André Lureau endif 37208f51e01cSMarc-André Lureau 3721ccd250aaSPaolo Bonzini if have_ivshmem 37225ee24e78SMarc-André Lureau subdir('contrib/ivshmem-client') 37235ee24e78SMarc-André Lureau subdir('contrib/ivshmem-server') 37245ee24e78SMarc-André Lureau endif 3725931049b4SPaolo Bonziniendif 3726931049b4SPaolo Bonzini 3727f5aa6320SMarc-André Lureausubdir('scripts') 37283f99cf57SPaolo Bonzinisubdir('tools') 3729bdcbea7aSMarc-André Lureausubdir('pc-bios') 3730f8aa24eaSPaolo Bonzinisubdir('docs') 3731e3667660SYonggang Luosubdir('tests') 37321b695471SPaolo Bonziniif gtk.found() 3733e8f3bd71SMarc-André Lureau subdir('po') 3734e8f3bd71SMarc-André Lureauendif 37353f99cf57SPaolo Bonzini 37368adfeba9SMarc-André Lureauif host_machine.system() == 'windows' 37378adfeba9SMarc-André Lureau nsis_cmd = [ 37388adfeba9SMarc-André Lureau find_program('scripts/nsis.py'), 37398adfeba9SMarc-André Lureau '@OUTPUT@', 37408adfeba9SMarc-André Lureau get_option('prefix'), 37418adfeba9SMarc-André Lureau meson.current_source_dir(), 3742fc9a809eSPaolo Bonzini glib_pc.get_variable('bindir'), 374324bdcc96SStefan Weil host_machine.cpu(), 37448adfeba9SMarc-André Lureau '--', 37458adfeba9SMarc-André Lureau '-DDISPLAYVERSION=' + meson.project_version(), 37468adfeba9SMarc-André Lureau ] 37478adfeba9SMarc-André Lureau if build_docs 37488adfeba9SMarc-André Lureau nsis_cmd += '-DCONFIG_DOCUMENTATION=y' 37498adfeba9SMarc-André Lureau endif 37501b695471SPaolo Bonzini if gtk.found() 37518adfeba9SMarc-André Lureau nsis_cmd += '-DCONFIG_GTK=y' 37528adfeba9SMarc-André Lureau endif 37538adfeba9SMarc-André Lureau 37548adfeba9SMarc-André Lureau nsis = custom_target('nsis', 37558adfeba9SMarc-André Lureau output: 'qemu-setup-' + meson.project_version() + '.exe', 37568adfeba9SMarc-André Lureau input: files('qemu.nsi'), 37578adfeba9SMarc-André Lureau build_always_stale: true, 37588adfeba9SMarc-André Lureau command: nsis_cmd + ['@INPUT@']) 37598adfeba9SMarc-André Lureau alias_target('installer', nsis) 37608adfeba9SMarc-André Lureauendif 37618adfeba9SMarc-André Lureau 3762a0c9162cSPaolo Bonzini######################### 3763a0c9162cSPaolo Bonzini# Configuration summary # 3764a0c9162cSPaolo Bonzini######################### 3765a0c9162cSPaolo Bonzini 3766983d0a75SPhilippe Mathieu-Daudé# Directories 3767f9332757SPaolo Bonzinisummary_info = {} 376816bf7a33SPaolo Bonzinisummary_info += {'Install prefix': get_option('prefix')} 376916bf7a33SPaolo Bonzinisummary_info += {'BIOS directory': qemu_datadir} 37708154f5e6SAkihiko Odakipathsep = targetos == 'windows' ? ';' : ':' 37718154f5e6SAkihiko Odakisummary_info += {'firmware path': pathsep.join(get_option('qemu_firmwarepath'))} 3772f7fb6c6aSPaolo Bonzinisummary_info += {'binary directory': get_option('prefix') / get_option('bindir')} 3773f7fb6c6aSPaolo Bonzinisummary_info += {'library directory': get_option('prefix') / get_option('libdir')} 377416bf7a33SPaolo Bonzinisummary_info += {'module directory': qemu_moddir} 3775f7fb6c6aSPaolo Bonzinisummary_info += {'libexec directory': get_option('prefix') / get_option('libexecdir')} 3776f7fb6c6aSPaolo Bonzinisummary_info += {'include directory': get_option('prefix') / get_option('includedir')} 3777f7fb6c6aSPaolo Bonzinisummary_info += {'config directory': get_option('prefix') / get_option('sysconfdir')} 3778f9332757SPaolo Bonziniif targetos != 'windows' 3779f7fb6c6aSPaolo Bonzini summary_info += {'local state directory': get_option('prefix') / get_option('localstatedir')} 3780f7fb6c6aSPaolo Bonzini summary_info += {'Manual directory': get_option('prefix') / get_option('mandir')} 3781f9332757SPaolo Bonzinielse 3782f9332757SPaolo Bonzini summary_info += {'local state directory': 'queried at runtime'} 3783f9332757SPaolo Bonziniendif 3784f7fb6c6aSPaolo Bonzinisummary_info += {'Doc directory': get_option('prefix') / get_option('docdir')} 3785f9332757SPaolo Bonzinisummary_info += {'Build directory': meson.current_build_dir()} 3786f9332757SPaolo Bonzinisummary_info += {'Source path': meson.current_source_dir()} 3787f9332757SPaolo Bonzinisummary_info += {'GIT submodules': config_host['GIT_SUBMODULES']} 3788983d0a75SPhilippe Mathieu-Daudésummary(summary_info, bool_yn: true, section: 'Directories') 3789983d0a75SPhilippe Mathieu-Daudé 3790e11a0e17SPhilippe Mathieu-Daudé# Host binaries 3791983d0a75SPhilippe Mathieu-Daudésummary_info = {} 3792e11a0e17SPhilippe Mathieu-Daudésummary_info += {'git': config_host['GIT']} 3793e11a0e17SPhilippe Mathieu-Daudésummary_info += {'make': config_host['MAKE']} 3794e11a0e17SPhilippe Mathieu-Daudésummary_info += {'python': '@0@ (version: @1@)'.format(python.full_path(), python.language_version())} 3795bb647c49SPaolo Bonzinisummary_info += {'sphinx-build': sphinx_build} 3796e11a0e17SPhilippe Mathieu-Daudéif config_host.has_key('HAVE_GDB_BIN') 3797e11a0e17SPhilippe Mathieu-Daudé summary_info += {'gdb': config_host['HAVE_GDB_BIN']} 3798e11a0e17SPhilippe Mathieu-Daudéendif 379940c909f5SPaolo Bonzinisummary_info += {'iasl': iasl} 3800e11a0e17SPhilippe Mathieu-Daudésummary_info += {'genisoimage': config_host['GENISOIMAGE']} 380120cf5cb4SPaolo Bonziniif targetos == 'windows' and have_ga 3802bb647c49SPaolo Bonzini summary_info += {'wixl': wixl} 3803e11a0e17SPhilippe Mathieu-Daudéendif 38045890258aSThomas Huthif slirp.found() and have_system 380535acbb30SPaolo Bonzini summary_info += {'smbd': have_slirp_smbd ? smbd_path : false} 3806e11a0e17SPhilippe Mathieu-Daudéendif 3807e11a0e17SPhilippe Mathieu-Daudésummary(summary_info, bool_yn: true, section: 'Host binaries') 3808e11a0e17SPhilippe Mathieu-Daudé 38091d718865SPhilippe Mathieu-Daudé# Configurable features 38101d718865SPhilippe Mathieu-Daudésummary_info = {} 38111d718865SPhilippe Mathieu-Daudésummary_info += {'Documentation': build_docs} 3812aa3ca634SPhilippe Mathieu-Daudésummary_info += {'system-mode emulation': have_system} 3813aa3ca634SPhilippe Mathieu-Daudésummary_info += {'user-mode emulation': have_user} 3814813803aaSPhilippe Mathieu-Daudésummary_info += {'block layer': have_block} 38151d718865SPhilippe Mathieu-Daudésummary_info += {'Install blobs': get_option('install_blobs')} 3816*6002711cSPaolo Bonzinisummary_info += {'module support': enable_modules} 3817*6002711cSPaolo Bonziniif enable_modules 38182cb2f580SPaolo Bonzini summary_info += {'alternative module path': get_option('module_upgrades')} 38191d718865SPhilippe Mathieu-Daudéendif 3820537b7248SPaolo Bonzinisummary_info += {'fuzzing support': get_option('fuzzing')} 38211d718865SPhilippe Mathieu-Daudéif have_system 382287430d5bSPaolo Bonzini summary_info += {'Audio drivers': ' '.join(audio_drivers_selected)} 38231d718865SPhilippe Mathieu-Daudéendif 38249c29b741SPaolo Bonzinisummary_info += {'Trace backends': ','.join(get_option('trace_backends'))} 38259c29b741SPaolo Bonziniif 'simple' in get_option('trace_backends') 38269c29b741SPaolo Bonzini summary_info += {'Trace output file': get_option('trace_file') + '-<pid>'} 38271d718865SPhilippe Mathieu-Daudéendif 3828142ca628SMarc-André Lureausummary_info += {'D-Bus display': dbus_display} 3829c55cf6abSPaolo Bonzinisummary_info += {'QOM debugging': get_option('qom_cast_debug')} 38302a3129a3SPaolo Bonzinisummary_info += {'vhost-kernel support': have_vhost_kernel} 38312a3129a3SPaolo Bonzinisummary_info += {'vhost-net support': have_vhost_net} 38322a3129a3SPaolo Bonzinisummary_info += {'vhost-user support': have_vhost_user} 38332a3129a3SPaolo Bonzinisummary_info += {'vhost-user-crypto support': have_vhost_user_crypto} 38341d718865SPhilippe Mathieu-Daudésummary_info += {'vhost-user-blk server support': have_vhost_user_blk_server} 38352a3129a3SPaolo Bonzinisummary_info += {'vhost-vdpa support': have_vhost_vdpa} 383620cf5cb4SPaolo Bonzinisummary_info += {'build guest agent': have_ga} 38371d718865SPhilippe Mathieu-Daudésummary(summary_info, bool_yn: true, section: 'Configurable features') 38381d718865SPhilippe Mathieu-Daudé 38392e864b8bSPhilippe Mathieu-Daudé# Compilation information 3840e11a0e17SPhilippe Mathieu-Daudésummary_info = {} 38412e864b8bSPhilippe Mathieu-Daudésummary_info += {'host CPU': cpu} 38422e864b8bSPhilippe Mathieu-Daudésummary_info += {'host endianness': build_machine.endian()} 384363de9353SAlex Bennéesummary_info += {'C compiler': ' '.join(meson.get_compiler('c').cmd_array())} 384463de9353SAlex Bennéesummary_info += {'Host C compiler': ' '.join(meson.get_compiler('c', native: true).cmd_array())} 3845f9332757SPaolo Bonziniif link_language == 'cpp' 384663de9353SAlex Bennée summary_info += {'C++ compiler': ' '.join(meson.get_compiler('cpp').cmd_array())} 3847f9332757SPaolo Bonzinielse 3848f9332757SPaolo Bonzini summary_info += {'C++ compiler': false} 3849f9332757SPaolo Bonziniendif 3850f9332757SPaolo Bonziniif targetos == 'darwin' 385163de9353SAlex Bennée summary_info += {'Objective-C compiler': ' '.join(meson.get_compiler('objc').cmd_array())} 3852f9332757SPaolo Bonziniendif 38536a97f393SPaolo Bonzinioption_cflags = (get_option('debug') ? ['-g'] : []) 38546a97f393SPaolo Bonziniif get_option('optimization') != 'plain' 38556a97f393SPaolo Bonzini option_cflags += ['-O' + get_option('optimization')] 38566a97f393SPaolo Bonziniendif 38576a97f393SPaolo Bonzinisummary_info += {'CFLAGS': ' '.join(get_option('c_args') + option_cflags)} 385847b30835SPaolo Bonziniif link_language == 'cpp' 38596a97f393SPaolo Bonzini summary_info += {'CXXFLAGS': ' '.join(get_option('cpp_args') + option_cflags)} 386047b30835SPaolo Bonziniendif 3861e910c7d9SPhilippe Mathieu-Daudéif targetos == 'darwin' 38626a97f393SPaolo Bonzini summary_info += {'OBJCFLAGS': ' '.join(get_option('objc_args') + option_cflags)} 3863e910c7d9SPhilippe Mathieu-Daudéendif 386447b30835SPaolo Bonzinilink_args = get_option(link_language + '_link_args') 386547b30835SPaolo Bonziniif link_args.length() > 0 386647b30835SPaolo Bonzini summary_info += {'LDFLAGS': ' '.join(link_args)} 386747b30835SPaolo Bonziniendif 3868d065177eSPaolo Bonzinisummary_info += {'QEMU_CFLAGS': ' '.join(qemu_cflags)} 3869e5134024SPaolo Bonziniif 'cpp' in all_languages 3870d065177eSPaolo Bonzini summary_info += {'QEMU_CXXFLAGS': ' '.join(qemu_cxxflags)} 3871e5134024SPaolo Bonziniendif 3872e5134024SPaolo Bonziniif 'objc' in all_languages 3873d065177eSPaolo Bonzini summary_info += {'QEMU_OBJCFLAGS': ' '.join(qemu_objcflags)} 3874e5134024SPaolo Bonziniendif 3875d065177eSPaolo Bonzinisummary_info += {'QEMU_LDFLAGS': ' '.join(qemu_ldflags)} 3876c55cf6abSPaolo Bonzinisummary_info += {'profiler': get_option('profiler')} 3877cdad781dSDaniele Buonosummary_info += {'link-time optimization (LTO)': get_option('b_lto')} 38782e864b8bSPhilippe Mathieu-Daudésummary_info += {'PIE': get_option('b_pie')} 38793e8529ddSLaurent Viviersummary_info += {'static build': config_host.has_key('CONFIG_STATIC')} 38802e864b8bSPhilippe Mathieu-Daudésummary_info += {'malloc trim support': has_malloc_trim} 3881b87df904SPaolo Bonzinisummary_info += {'membarrier': have_membarrier} 388258a2e3f5SStefan Hajnoczisummary_info += {'debug graph lock': get_option('debug_graph_lock')} 3883728c0a2fSPaolo Bonzinisummary_info += {'debug stack usage': get_option('debug_stack_usage')} 3884c55cf6abSPaolo Bonzinisummary_info += {'mutex debugging': get_option('debug_mutex')} 38852e864b8bSPhilippe Mathieu-Daudésummary_info += {'memory allocator': get_option('malloc')} 3886622753d2SPaolo Bonzinisummary_info += {'avx2 optimization': config_host_data.get('CONFIG_AVX2_OPT')} 388704ffce13Sling xusummary_info += {'avx512bw optimization': config_host_data.get('CONFIG_AVX512BW_OPT')} 3888622753d2SPaolo Bonzinisummary_info += {'avx512f optimization': config_host_data.get('CONFIG_AVX512F_OPT')} 3889bb9ecae7SAlex Bennéeif get_option('gprof') 3890bb9ecae7SAlex Bennée gprof_info = 'YES (deprecated)' 3891bb9ecae7SAlex Bennéeelse 3892bb9ecae7SAlex Bennée gprof_info = get_option('gprof') 3893bb9ecae7SAlex Bennéeendif 3894bb9ecae7SAlex Bennéesummary_info += {'gprof': gprof_info} 38952e864b8bSPhilippe Mathieu-Daudésummary_info += {'gcov': get_option('b_coverage')} 38962e864b8bSPhilippe Mathieu-Daudésummary_info += {'thread sanitizer': config_host.has_key('CONFIG_TSAN')} 38972e864b8bSPhilippe Mathieu-Daudésummary_info += {'CFI support': get_option('cfi')} 38982e864b8bSPhilippe Mathieu-Daudéif get_option('cfi') 38992e864b8bSPhilippe Mathieu-Daudé summary_info += {'CFI debug support': get_option('cfi_debug')} 39002e864b8bSPhilippe Mathieu-Daudéendif 39012e864b8bSPhilippe Mathieu-Daudésummary_info += {'strip binaries': get_option('strip')} 3902bb647c49SPaolo Bonzinisummary_info += {'sparse': sparse} 39032e864b8bSPhilippe Mathieu-Daudésummary_info += {'mingw32 support': targetos == 'windows'} 390412640f05SPaolo Bonzinisummary(summary_info, bool_yn: true, section: 'Compilation') 390549e8565bSAlex Bennée 390649e8565bSAlex Bennée# snarf the cross-compilation information for tests 390712640f05SPaolo Bonzinisummary_info = {} 390812640f05SPaolo Bonzinihave_cross = false 390949e8565bSAlex Bennéeforeach target: target_dirs 3910c7022a70SPaolo Bonzini tcg_mak = meson.current_build_dir() / 'tests/tcg' / target / 'config-target.mak' 391149e8565bSAlex Bennée if fs.exists(tcg_mak) 391249e8565bSAlex Bennée config_cross_tcg = keyval.load(tcg_mak) 391385b141eaSAlex Bennée if 'CC' in config_cross_tcg 391412640f05SPaolo Bonzini summary_info += {config_cross_tcg['TARGET_NAME']: config_cross_tcg['CC']} 391512640f05SPaolo Bonzini have_cross = true 391649e8565bSAlex Bennée endif 391749e8565bSAlex Bennée endif 391849e8565bSAlex Bennéeendforeach 391912640f05SPaolo Bonziniif have_cross 392012640f05SPaolo Bonzini summary(summary_info, bool_yn: true, section: 'Cross compilers') 392112640f05SPaolo Bonziniendif 39222e864b8bSPhilippe Mathieu-Daudé 3923aa3ca634SPhilippe Mathieu-Daudé# Targets and accelerators 39242e864b8bSPhilippe Mathieu-Daudésummary_info = {} 3925aa3ca634SPhilippe Mathieu-Daudéif have_system 3926aa3ca634SPhilippe Mathieu-Daudé summary_info += {'KVM support': config_all.has_key('CONFIG_KVM')} 3927aa3ca634SPhilippe Mathieu-Daudé summary_info += {'HAX support': config_all.has_key('CONFIG_HAX')} 3928aa3ca634SPhilippe Mathieu-Daudé summary_info += {'HVF support': config_all.has_key('CONFIG_HVF')} 3929aa3ca634SPhilippe Mathieu-Daudé summary_info += {'WHPX support': config_all.has_key('CONFIG_WHPX')} 393074a414a1SReinoud Zandijk summary_info += {'NVMM support': config_all.has_key('CONFIG_NVMM')} 393114efd8d3SPaolo Bonzini summary_info += {'Xen support': xen.found()} 393214efd8d3SPaolo Bonzini if xen.found() 393314efd8d3SPaolo Bonzini summary_info += {'xen ctrl version': xen.version()} 3934aa3ca634SPhilippe Mathieu-Daudé endif 3935820c1abaSDavid Woodhouse summary_info += {'Xen emulation': config_all.has_key('CONFIG_XEN_EMU')} 3936aa3ca634SPhilippe Mathieu-Daudéendif 3937aa3ca634SPhilippe Mathieu-Daudésummary_info += {'TCG support': config_all.has_key('CONFIG_TCG')} 3938aa3ca634SPhilippe Mathieu-Daudéif config_all.has_key('CONFIG_TCG') 393939687acaSPhilippe Mathieu-Daudé if get_option('tcg_interpreter') 3940f1f727acSPhilippe Mathieu-Daudé summary_info += {'TCG backend': 'TCI (TCG with bytecode interpreter, slow)'} 394139687acaSPhilippe Mathieu-Daudé else 394239687acaSPhilippe Mathieu-Daudé summary_info += {'TCG backend': 'native (@0@)'.format(cpu)} 394339687acaSPhilippe Mathieu-Daudé endif 3944029aa68fSAlex Bennée summary_info += {'TCG plugins': config_host.has_key('CONFIG_PLUGIN')} 3945aa3ca634SPhilippe Mathieu-Daudé summary_info += {'TCG debug enabled': config_host.has_key('CONFIG_DEBUG_TCG')} 3946aa3ca634SPhilippe Mathieu-Daudéendif 39472e864b8bSPhilippe Mathieu-Daudésummary_info += {'target list': ' '.join(target_dirs)} 3948aa3ca634SPhilippe Mathieu-Daudéif have_system 3949aa3ca634SPhilippe Mathieu-Daudé summary_info += {'default devices': get_option('default_devices')} 3950106ad1f9SPaolo Bonzini summary_info += {'out of process emulation': multiprocess_allowed} 395155116968SJagannathan Raman summary_info += {'vfio-user server': vfio_user_server_allowed} 3952aa3ca634SPhilippe Mathieu-Daudéendif 3953aa3ca634SPhilippe Mathieu-Daudésummary(summary_info, bool_yn: true, section: 'Targets and accelerators') 3954aa3ca634SPhilippe Mathieu-Daudé 3955813803aaSPhilippe Mathieu-Daudé# Block layer 3956813803aaSPhilippe Mathieu-Daudésummary_info = {} 3957813803aaSPhilippe Mathieu-Daudésummary_info += {'coroutine backend': config_host['CONFIG_COROUTINE_BACKEND']} 3958728c0a2fSPaolo Bonzinisummary_info += {'coroutine pool': have_coroutine_pool} 3959813803aaSPhilippe Mathieu-Daudéif have_block 3960622d64ffSPaolo Bonzini summary_info += {'Block whitelist (rw)': get_option('block_drv_rw_whitelist')} 3961622d64ffSPaolo Bonzini summary_info += {'Block whitelist (ro)': get_option('block_drv_ro_whitelist')} 3962c55cf6abSPaolo Bonzini summary_info += {'Use block whitelist in tools': get_option('block_drv_whitelist_in_tools')} 39633887702eSChristian Schoenebeck summary_info += {'VirtFS (9P) support': have_virtfs} 39643887702eSChristian Schoenebeck summary_info += {'VirtFS (9P) Proxy Helper support': have_virtfs_proxy_helper} 3965406523f6SPaolo Bonzini summary_info += {'Live block migration': config_host_data.get('CONFIG_LIVE_BLOCK_MIGRATION')} 3966406523f6SPaolo Bonzini summary_info += {'replication support': config_host_data.get('CONFIG_REPLICATION')} 3967ed793c2cSPaolo Bonzini summary_info += {'bochs support': get_option('bochs').allowed()} 3968ed793c2cSPaolo Bonzini summary_info += {'cloop support': get_option('cloop').allowed()} 3969ed793c2cSPaolo Bonzini summary_info += {'dmg support': get_option('dmg').allowed()} 3970ed793c2cSPaolo Bonzini summary_info += {'qcow v1 support': get_option('qcow1').allowed()} 3971ed793c2cSPaolo Bonzini summary_info += {'vdi support': get_option('vdi').allowed()} 397211cea42eSVladimir Sementsov-Ogievskiy summary_info += {'vhdx support': get_option('vhdx').allowed()} 397311cea42eSVladimir Sementsov-Ogievskiy summary_info += {'vmdk support': get_option('vmdk').allowed()} 397411cea42eSVladimir Sementsov-Ogievskiy summary_info += {'vpc support': get_option('vpc').allowed()} 3975ed793c2cSPaolo Bonzini summary_info += {'vvfat support': get_option('vvfat').allowed()} 3976ed793c2cSPaolo Bonzini summary_info += {'qed support': get_option('qed').allowed()} 3977ed793c2cSPaolo Bonzini summary_info += {'parallels support': get_option('parallels').allowed()} 3978bb647c49SPaolo Bonzini summary_info += {'FUSE exports': fuse} 39792a2359b8SXie Yongji summary_info += {'VDUSE block exports': have_vduse_blk_export} 3980813803aaSPhilippe Mathieu-Daudéendif 3981813803aaSPhilippe Mathieu-Daudésummary(summary_info, bool_yn: true, section: 'Block layer support') 3982813803aaSPhilippe Mathieu-Daudé 3983aa58028aSPhilippe Mathieu-Daudé# Crypto 3984aa3ca634SPhilippe Mathieu-Daudésummary_info = {} 398541f2ae28SPaolo Bonzinisummary_info += {'TLS priority': get_option('tls_priority')} 3986bb647c49SPaolo Bonzinisummary_info += {'GNUTLS support': gnutls} 3987bb647c49SPaolo Bonziniif gnutls.found() 3988cc4c7c73SDaniel P. Berrangé summary_info += {' GNUTLS crypto': gnutls_crypto.found()} 3989bb647c49SPaolo Bonziniendif 3990bb647c49SPaolo Bonzinisummary_info += {'libgcrypt': gcrypt} 3991bb647c49SPaolo Bonzinisummary_info += {'nettle': nettle} 399257612511SPaolo Bonziniif nettle.found() 399357612511SPaolo Bonzini summary_info += {' XTS': xts != 'private'} 3994f9332757SPaolo Bonziniendif 399534b52615SPaolo Bonzinisummary_info += {'AF_ALG support': have_afalg} 3996c55cf6abSPaolo Bonzinisummary_info += {'rng-none': get_option('rng_none')} 39972edd2c04SPaolo Bonzinisummary_info += {'Linux keyring': have_keyring} 3998aa58028aSPhilippe Mathieu-Daudésummary(summary_info, bool_yn: true, section: 'Crypto') 3999aa58028aSPhilippe Mathieu-Daudé 400069a78cceSPhilippe Mathieu-Daudé# Libraries 4001aa58028aSPhilippe Mathieu-Daudésummary_info = {} 4002aa58028aSPhilippe Mathieu-Daudéif targetos == 'darwin' 4003bb647c49SPaolo Bonzini summary_info += {'Cocoa support': cocoa} 4004e2c1d78dSVladislav Yaroshchuk summary_info += {'vmnet.framework support': vmnet} 4005aa58028aSPhilippe Mathieu-Daudéendif 4006bb647c49SPaolo Bonzinisummary_info += {'SDL support': sdl} 4007bb647c49SPaolo Bonzinisummary_info += {'SDL image support': sdl_image} 4008bb647c49SPaolo Bonzinisummary_info += {'GTK support': gtk} 4009bb647c49SPaolo Bonzinisummary_info += {'pixman': pixman} 4010bb647c49SPaolo Bonzinisummary_info += {'VTE support': vte} 40115890258aSThomas Huthsummary_info += {'slirp support': slirp} 4012bb647c49SPaolo Bonzinisummary_info += {'libtasn1': tasn1} 4013bb647c49SPaolo Bonzinisummary_info += {'PAM': pam} 4014bb647c49SPaolo Bonzinisummary_info += {'iconv support': iconv} 4015bb647c49SPaolo Bonzinisummary_info += {'curses support': curses} 4016bb647c49SPaolo Bonzinisummary_info += {'virgl support': virgl} 4017fd66dbd4SStefan Hajnoczisummary_info += {'blkio support': blkio} 4018bb647c49SPaolo Bonzinisummary_info += {'curl support': curl} 4019bb647c49SPaolo Bonzinisummary_info += {'Multipath support': mpathpersist} 402095f8510eSKshitij Surisummary_info += {'PNG support': png} 4021bb647c49SPaolo Bonzinisummary_info += {'VNC support': vnc} 4022a0b93237SPaolo Bonziniif vnc.found() 4023bb647c49SPaolo Bonzini summary_info += {'VNC SASL support': sasl} 4024bb647c49SPaolo Bonzini summary_info += {'VNC JPEG support': jpeg} 4025f9332757SPaolo Bonziniendif 402687430d5bSPaolo Bonziniif targetos not in ['darwin', 'haiku', 'windows'] 402787430d5bSPaolo Bonzini summary_info += {'OSS support': oss} 4028663df1ccSAlexandre Ratchov summary_info += {'sndio support': sndio} 402987430d5bSPaolo Bonzinielif targetos == 'darwin' 403087430d5bSPaolo Bonzini summary_info += {'CoreAudio support': coreaudio} 403187430d5bSPaolo Bonzinielif targetos == 'windows' 403287430d5bSPaolo Bonzini summary_info += {'DirectSound support': dsound} 403387430d5bSPaolo Bonziniendif 403487430d5bSPaolo Bonziniif targetos == 'linux' 403587430d5bSPaolo Bonzini summary_info += {'ALSA support': alsa} 403687430d5bSPaolo Bonzini summary_info += {'PulseAudio support': pulse} 403787430d5bSPaolo Bonziniendif 4038c2d3d1c2SDorinda Basseysummary_info += {'Pipewire support': pipewire} 403987430d5bSPaolo Bonzinisummary_info += {'JACK support': jack} 4040bb647c49SPaolo Bonzinisummary_info += {'brlapi support': brlapi} 4041e1723999SPaolo Bonzinisummary_info += {'vde support': vde} 4042837b84b1SPaolo Bonzinisummary_info += {'netmap support': have_netmap} 4043eea9453aSThomas Huthsummary_info += {'l2tpv3 support': have_l2tpv3} 4044ff66f3e5SPaolo Bonzinisummary_info += {'Linux AIO support': libaio} 4045bb647c49SPaolo Bonzinisummary_info += {'Linux io_uring support': linux_io_uring} 4046bb647c49SPaolo Bonzinisummary_info += {'ATTR/XATTR support': libattr} 40473730a734SPaolo Bonzinisummary_info += {'RDMA support': rdma} 40483730a734SPaolo Bonzinisummary_info += {'PVRDMA support': have_pvrdma} 4049fbb4121dSPaolo Bonzinisummary_info += {'fdt support': fdt_opt == 'disabled' ? false : fdt_opt} 4050bb647c49SPaolo Bonzinisummary_info += {'libcap-ng support': libcap_ng} 4051bb647c49SPaolo Bonzinisummary_info += {'bpf support': libbpf} 40523f0a5d55SMarc-André Lureausummary_info += {'spice protocol support': spice_protocol} 40533f0a5d55SMarc-André Lureauif spice_protocol.found() 40543f0a5d55SMarc-André Lureau summary_info += {' spice server support': spice} 40553f0a5d55SMarc-André Lureauendif 4056bb647c49SPaolo Bonzinisummary_info += {'rbd support': rbd} 4057bb647c49SPaolo Bonzinisummary_info += {'smartcard support': cacard} 4058bb647c49SPaolo Bonzinisummary_info += {'U2F support': u2f} 4059bb647c49SPaolo Bonzinisummary_info += {'libusb': libusb} 4060bb647c49SPaolo Bonzinisummary_info += {'usb net redir': usbredir} 406188b6e618SPaolo Bonzinisummary_info += {'OpenGL support (epoxy)': opengl} 4062bb647c49SPaolo Bonzinisummary_info += {'GBM': gbm} 4063bb647c49SPaolo Bonzinisummary_info += {'libiscsi support': libiscsi} 4064bb647c49SPaolo Bonzinisummary_info += {'libnfs support': libnfs} 4065f9332757SPaolo Bonziniif targetos == 'windows' 406620cf5cb4SPaolo Bonzini if have_ga 40678821a389SMarc-André Lureau summary_info += {'QGA VSS support': have_qga_vss} 4068b846ab7cSPaolo Bonzini endif 4069f9332757SPaolo Bonziniendif 4070bb647c49SPaolo Bonzinisummary_info += {'seccomp support': seccomp} 4071bb647c49SPaolo Bonzinisummary_info += {'GlusterFS support': glusterfs} 40720d04c4c9SPaolo Bonzinisummary_info += {'TPM support': have_tpm} 4073e6a52b36SThomas Huthsummary_info += {'libssh support': libssh} 4074bb647c49SPaolo Bonzinisummary_info += {'lzo support': lzo} 4075bb647c49SPaolo Bonzinisummary_info += {'snappy support': snappy} 4076bb647c49SPaolo Bonzinisummary_info += {'bzip2 support': libbzip2} 4077bb647c49SPaolo Bonzinisummary_info += {'lzfse support': liblzfse} 4078bb647c49SPaolo Bonzinisummary_info += {'zstd support': zstd} 4079488a8c73SPaolo Bonzinisummary_info += {'NUMA host support': numa} 408083602083SThomas Huthsummary_info += {'capstone': capstone} 4081bb647c49SPaolo Bonzinisummary_info += {'libpmem support': libpmem} 4082bb647c49SPaolo Bonzinisummary_info += {'libdaxctl support': libdaxctl} 4083bb647c49SPaolo Bonzinisummary_info += {'libudev': libudev} 4084bb647c49SPaolo Bonzini# Dummy dependency, keep .found() 4085df4ea709SMax Reitzsummary_info += {'FUSE lseek': fuse_lseek.found()} 40863d212b41SRichard W.M. Jonessummary_info += {'selinux': selinux} 40877c10cb38SIlya Leoshkevichsummary_info += {'libdw': libdw} 408869a78cceSPhilippe Mathieu-Daudésummary(summary_info, bool_yn: true, section: 'Dependencies') 4089f9332757SPaolo Bonzini 4090f9332757SPaolo Bonziniif not supported_cpus.contains(cpu) 4091f9332757SPaolo Bonzini message() 4092f9332757SPaolo Bonzini warning('SUPPORT FOR THIS HOST CPU WILL GO AWAY IN FUTURE RELEASES!') 4093f9332757SPaolo Bonzini message() 4094f9332757SPaolo Bonzini message('CPU host architecture ' + cpu + ' support is not currently maintained.') 4095f9332757SPaolo Bonzini message('The QEMU project intends to remove support for this host CPU in') 4096f9332757SPaolo Bonzini message('a future release if nobody volunteers to maintain it and to') 4097f9332757SPaolo Bonzini message('provide a build host for our continuous integration setup.') 4098f9332757SPaolo Bonzini message('configure has succeeded and you can continue to build, but') 4099f9332757SPaolo Bonzini message('if you care about QEMU on this platform you should contact') 4100f9332757SPaolo Bonzini message('us upstream at qemu-devel@nongnu.org.') 4101f9332757SPaolo Bonziniendif 4102f9332757SPaolo Bonzini 4103f9332757SPaolo Bonziniif not supported_oses.contains(targetos) 4104f9332757SPaolo Bonzini message() 4105f9332757SPaolo Bonzini warning('WARNING: SUPPORT FOR THIS HOST OS WILL GO AWAY IN FUTURE RELEASES!') 4106f9332757SPaolo Bonzini message() 4107f9332757SPaolo Bonzini message('Host OS ' + targetos + 'support is not currently maintained.') 4108f9332757SPaolo Bonzini message('The QEMU project intends to remove support for this host OS in') 4109f9332757SPaolo Bonzini message('a future release if nobody volunteers to maintain it and to') 4110f9332757SPaolo Bonzini message('provide a build host for our continuous integration setup.') 4111f9332757SPaolo Bonzini message('configure has succeeded and you can continue to build, but') 4112f9332757SPaolo Bonzini message('if you care about QEMU on this platform you should contact') 4113f9332757SPaolo Bonzini message('us upstream at qemu-devel@nongnu.org.') 4114f9332757SPaolo Bonziniendif 4115