143a363aeSPaolo Bonziniproject('qemu', ['c'], meson_version: '>=0.59.3', 2654d6b04SPaolo Bonzini default_options: ['warning_level=1', 'c_std=gnu11', 'cpp_std=gnu++11', 'b_colorout=auto', 33d2f73efSPaolo Bonzini 'b_staticpic=false', 'stdsplit=false'], 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 10a5665051SPaolo Bonzininot_found = dependency('', required: false) 11b29b40f4SPaolo Bonzinikeyval = import('keyval') 12a81df1b6SPaolo Bonziniss = import('sourceset') 138b18cdbfSRichard Hendersonfs = import('fs') 14a81df1b6SPaolo Bonzini 15ce1c1e7aSPaolo Bonzinish = find_program('sh') 16a81df1b6SPaolo Bonzinicc = meson.get_compiler('c') 17a5665051SPaolo Bonziniconfig_host = keyval.load(meson.current_build_dir() / 'config-host.mak') 183154fee4SMarc-André Lureauenable_modules = 'CONFIG_MODULES' in config_host 1935be72baSPaolo Bonzinienable_static = 'CONFIG_STATIC' in config_host 20e3667660SYonggang Luo 21d7dedf42SPaolo Bonzini# Allow both shared and static libraries unless --enable-static 22d7dedf42SPaolo Bonzinistatic_kwargs = enable_static ? {'static': true} : {} 23d7dedf42SPaolo Bonzini 24e3667660SYonggang Luo# Temporary directory used for files created while 25e3667660SYonggang Luo# configure runs. Since it is in the build directory 26e3667660SYonggang Luo# we can safely blow away any previous version of it 27e3667660SYonggang Luo# (and we need not jump through hoops to try to delete 28e3667660SYonggang Luo# it when configure exits.) 29e3667660SYonggang Luotmpdir = meson.current_build_dir() / 'meson-private/temp' 308fe11232SMarc-André Lureau 318fe11232SMarc-André Lureauif get_option('qemu_suffix').startswith('/') 328fe11232SMarc-André Lureau error('qemu_suffix cannot start with a /') 338fe11232SMarc-André Lureauendif 348fe11232SMarc-André Lureau 3516bf7a33SPaolo Bonziniqemu_confdir = get_option('sysconfdir') / get_option('qemu_suffix') 36ab4c0996SMarc-André Lureauqemu_datadir = get_option('datadir') / get_option('qemu_suffix') 37491e74c1SMarc-André Lureauqemu_docdir = get_option('docdir') / get_option('qemu_suffix') 3816bf7a33SPaolo Bonziniqemu_moddir = get_option('libdir') / get_option('qemu_suffix') 3916bf7a33SPaolo Bonzini 4016bf7a33SPaolo Bonziniqemu_desktopdir = get_option('datadir') / 'applications' 4116bf7a33SPaolo Bonziniqemu_icondir = get_option('datadir') / 'icons' 4216bf7a33SPaolo Bonzini 43859aef02SPaolo Bonziniconfig_host_data = configuration_data() 44859aef02SPaolo Bonzinigenh = [] 45b83a80e8SVladimir Sementsov-Ogievskiyqapi_trace_events = [] 46a5665051SPaolo Bonzini 4720cf5cb4SPaolo Bonzinibsd_oses = ['gnu/kfreebsd', 'freebsd', 'netbsd', 'openbsd', 'dragonfly', 'darwin'] 48201e8ed7SPaolo Bonzinisupported_oses = ['windows', 'freebsd', 'netbsd', 'openbsd', 'darwin', 'sunos', 'linux'] 49ba0e7333SRichard Hendersonsupported_cpus = ['ppc', 'ppc64', 's390x', 'riscv', 'x86', 'x86_64', 50dfcf900bSWANG Xuerui 'arm', 'aarch64', 'loongarch64', 'mips', 'mips64', 'sparc', 'sparc64'] 51201e8ed7SPaolo Bonzini 52201e8ed7SPaolo Bonzinicpu = host_machine.cpu_family() 53c94c2394SRichard Henderson 54c94c2394SRichard Henderson# Unify riscv* to a single family. 55c94c2394SRichard Hendersonif cpu in ['riscv32', 'riscv64'] 56c94c2394SRichard Henderson cpu = 'riscv' 57c94c2394SRichard Hendersonendif 58c94c2394SRichard Henderson 59201e8ed7SPaolo Bonzinitargetos = host_machine.system() 60201e8ed7SPaolo Bonzini 6120cf5cb4SPaolo Bonzinitarget_dirs = config_host['TARGET_DIRS'].split() 6220cf5cb4SPaolo Bonzinihave_linux_user = false 6320cf5cb4SPaolo Bonzinihave_bsd_user = false 6420cf5cb4SPaolo Bonzinihave_system = false 6520cf5cb4SPaolo Bonziniforeach target : target_dirs 6620cf5cb4SPaolo Bonzini have_linux_user = have_linux_user or target.endswith('linux-user') 6720cf5cb4SPaolo Bonzini have_bsd_user = have_bsd_user or target.endswith('bsd-user') 6820cf5cb4SPaolo Bonzini have_system = have_system or target.endswith('-softmmu') 6920cf5cb4SPaolo Bonziniendforeach 7020cf5cb4SPaolo Bonzinihave_user = have_linux_user or have_bsd_user 7120cf5cb4SPaolo Bonzinihave_tools = get_option('tools') \ 7220cf5cb4SPaolo Bonzini .disable_auto_if(not have_system) \ 7320cf5cb4SPaolo Bonzini .allowed() 7420cf5cb4SPaolo Bonzinihave_ga = get_option('guest_agent') \ 7520cf5cb4SPaolo Bonzini .disable_auto_if(not have_system and not have_tools) \ 7620cf5cb4SPaolo Bonzini .require(targetos in ['sunos', 'linux', 'windows'], 7720cf5cb4SPaolo Bonzini error_message: 'unsupported OS for QEMU guest agent') \ 7820cf5cb4SPaolo Bonzini .allowed() 7920cf5cb4SPaolo Bonzinihave_block = have_system or have_tools 8020cf5cb4SPaolo Bonzini 8120cf5cb4SPaolo Bonzinipython = import('python').find_installation() 8220cf5cb4SPaolo Bonzini 83823eb013SPaolo Bonziniif cpu not in supported_cpus 84823eb013SPaolo Bonzini host_arch = 'unknown' 85823eb013SPaolo Bonzinielif cpu == 'x86' 86823eb013SPaolo Bonzini host_arch = 'i386' 870e3ed77dSRichard Hendersonelif cpu == 'mips64' 880e3ed77dSRichard Henderson host_arch = 'mips' 89823eb013SPaolo Bonzinielse 90823eb013SPaolo Bonzini host_arch = cpu 91823eb013SPaolo Bonziniendif 92823eb013SPaolo Bonzini 938a19980eSPaolo Bonziniif cpu in ['x86', 'x86_64'] 948a19980eSPaolo Bonzini kvm_targets = ['i386-softmmu', 'x86_64-softmmu'] 958a19980eSPaolo Bonzinielif cpu == 'aarch64' 968a19980eSPaolo Bonzini kvm_targets = ['aarch64-softmmu'] 978a19980eSPaolo Bonzinielif cpu == 's390x' 988a19980eSPaolo Bonzini kvm_targets = ['s390x-softmmu'] 998a19980eSPaolo Bonzinielif cpu in ['ppc', 'ppc64'] 1008a19980eSPaolo Bonzini kvm_targets = ['ppc-softmmu', 'ppc64-softmmu'] 101fbc5884cSHuacai Chenelif cpu in ['mips', 'mips64'] 102fbc5884cSHuacai Chen kvm_targets = ['mips-softmmu', 'mipsel-softmmu', 'mips64-softmmu', 'mips64el-softmmu'] 103fbf43c7dSYifei Jiangelif cpu in ['riscv'] 104fbf43c7dSYifei Jiang kvm_targets = ['riscv32-softmmu', 'riscv64-softmmu'] 1058a19980eSPaolo Bonzinielse 1068a19980eSPaolo Bonzini kvm_targets = [] 1078a19980eSPaolo Bonziniendif 1088a19980eSPaolo Bonzini 10944d3d898SIgor Mammedovkvm_targets_c = '""' 11043a363aeSPaolo Bonziniif get_option('kvm').allowed() and targetos == 'linux' 111e741aff0SIgor Mammedov kvm_targets_c = '"' + '" ,"'.join(kvm_targets) + '"' 112e741aff0SIgor Mammedovendif 113e741aff0SIgor Mammedovconfig_host_data.set('CONFIG_KVM_TARGETS', kvm_targets_c) 114e741aff0SIgor Mammedov 1158a19980eSPaolo Bonziniaccelerator_targets = { 'CONFIG_KVM': kvm_targets } 116844a06bbSAlexander Graf 117844a06bbSAlexander Grafif cpu in ['aarch64'] 118844a06bbSAlexander Graf accelerator_targets += { 119844a06bbSAlexander Graf 'CONFIG_HVF': ['aarch64-softmmu'] 120844a06bbSAlexander Graf } 121844a06bbSAlexander Grafendif 122844a06bbSAlexander Graf 1230c3e41d4SAlex Bennéeif cpu in ['x86', 'x86_64', 'arm', 'aarch64'] 1242a2d51bcSMarc-André Lureau # i386 emulator provides xenpv machine type for multiple architectures 1250c3e41d4SAlex Bennée accelerator_targets += { 1260c3e41d4SAlex Bennée 'CONFIG_XEN': ['i386-softmmu', 'x86_64-softmmu'], 1270c3e41d4SAlex Bennée } 1280c3e41d4SAlex Bennéeendif 1298a19980eSPaolo Bonziniif cpu in ['x86', 'x86_64'] 1308a19980eSPaolo Bonzini accelerator_targets += { 1318a19980eSPaolo Bonzini 'CONFIG_HAX': ['i386-softmmu', 'x86_64-softmmu'], 1328a19980eSPaolo Bonzini 'CONFIG_HVF': ['x86_64-softmmu'], 13374a414a1SReinoud Zandijk 'CONFIG_NVMM': ['i386-softmmu', 'x86_64-softmmu'], 1348a19980eSPaolo Bonzini 'CONFIG_WHPX': ['i386-softmmu', 'x86_64-softmmu'], 1358a19980eSPaolo Bonzini } 1368a19980eSPaolo Bonziniendif 1378a19980eSPaolo Bonzini 138a1b176f9SPaolo Bonzinimodular_tcg = [] 139a1b176f9SPaolo Bonzini# Darwin does not support references to thread-local variables in modules 140a1b176f9SPaolo Bonziniif targetos != 'darwin' 141dae0ec15SGerd Hoffmann modular_tcg = ['i386-softmmu', 'x86_64-softmmu'] 142a1b176f9SPaolo Bonziniendif 143dae0ec15SGerd Hoffmann 144eae9a1d1SPhilippe Mathieu-Daudéedk2_targets = [ 'arm-softmmu', 'aarch64-softmmu', 'i386-softmmu', 'x86_64-softmmu' ] 145e49c0ef6SPaolo Bonziniunpack_edk2_blobs = false 146e49c0ef6SPaolo Bonziniforeach target : edk2_targets 147e49c0ef6SPaolo Bonzini if target in target_dirs 148e49c0ef6SPaolo Bonzini bzip2 = find_program('bzip2', required: get_option('install_blobs')) 149e49c0ef6SPaolo Bonzini unpack_edk2_blobs = bzip2.found() 150e49c0ef6SPaolo Bonzini break 151eae9a1d1SPhilippe Mathieu-Daudé endif 152e49c0ef6SPaolo Bonziniendforeach 15345b545ddSPhilippe Mathieu-Daudé 1549c29b741SPaolo Bonzinidtrace = not_found 1559c29b741SPaolo Bonzinistap = not_found 1569c29b741SPaolo Bonziniif 'dtrace' in get_option('trace_backends') 1579c29b741SPaolo Bonzini dtrace = find_program('dtrace', required: true) 1589c29b741SPaolo Bonzini stap = find_program('stap', required: false) 1599c29b741SPaolo Bonzini if stap.found() 1609c29b741SPaolo Bonzini # Workaround to avoid dtrace(1) producing a file with 'hidden' symbol 1619c29b741SPaolo Bonzini # visibility. Define STAP_SDT_V2 to produce 'default' symbol visibility 1629c29b741SPaolo Bonzini # instead. QEMU --enable-modules depends on this because the SystemTap 1639c29b741SPaolo Bonzini # semaphores are linked into the main binary and not the module's shared 1649c29b741SPaolo Bonzini # object. 1659c29b741SPaolo Bonzini add_global_arguments('-DSTAP_SDT_V2', 1669c29b741SPaolo Bonzini native: false, language: ['c', 'cpp', 'objc']) 1679c29b741SPaolo Bonzini endif 1689c29b741SPaolo Bonziniendif 1699c29b741SPaolo Bonzini 170201e8ed7SPaolo Bonzini################## 171201e8ed7SPaolo Bonzini# Compiler flags # 172201e8ed7SPaolo Bonzini################## 173201e8ed7SPaolo Bonzini 1748cc2d231SPaolo Bonziniqemu_cflags = config_host['QEMU_CFLAGS'].split() 1758cc2d231SPaolo Bonziniqemu_cxxflags = config_host['QEMU_CXXFLAGS'].split() 1764cb37d11SPhilippe Mathieu-Daudéqemu_objcflags = config_host['QEMU_OBJCFLAGS'].split() 1778cc2d231SPaolo Bonziniqemu_ldflags = config_host['QEMU_LDFLAGS'].split() 1788cc2d231SPaolo Bonzini 179c55cf6abSPaolo Bonziniif get_option('gprof') 180c55cf6abSPaolo Bonzini qemu_cflags += ['-p'] 181c55cf6abSPaolo Bonzini qemu_cxxflags += ['-p'] 1824cb37d11SPhilippe Mathieu-Daudé qemu_objcflags += ['-p'] 183c55cf6abSPaolo Bonzini qemu_ldflags += ['-p'] 184c55cf6abSPaolo Bonziniendif 185c55cf6abSPaolo Bonzini 186ff9ed62bSAlexander Bulekov# Specify linker-script with add_project_link_arguments so that it is not placed 187ff9ed62bSAlexander Bulekov# within a linker --start-group/--end-group pair 188537b7248SPaolo Bonziniif get_option('fuzzing') 189ff9ed62bSAlexander Bulekov add_project_link_arguments(['-Wl,-T,', 190ff9ed62bSAlexander Bulekov (meson.current_source_dir() / 'tests/qtest/fuzz/fork_fuzz.ld')], 191ff9ed62bSAlexander Bulekov native: false, language: ['c', 'cpp', 'objc']) 192537b7248SPaolo Bonzini 193537b7248SPaolo Bonzini # Specify a filter to only instrument code that is directly related to 194537b7248SPaolo Bonzini # virtual-devices. 195537b7248SPaolo Bonzini configure_file(output: 'instrumentation-filter', 196537b7248SPaolo Bonzini input: 'scripts/oss-fuzz/instrumentation-filter-template', 197537b7248SPaolo Bonzini copy: true) 198537b7248SPaolo Bonzini add_global_arguments( 199537b7248SPaolo Bonzini cc.get_supported_arguments('-fsanitize-coverage-allowlist=instrumentation-filter'), 200537b7248SPaolo Bonzini native: false, language: ['c', 'cpp', 'objc']) 201537b7248SPaolo Bonzini 202537b7248SPaolo Bonzini if get_option('fuzzing_engine') == '' 203537b7248SPaolo Bonzini # Add CFLAGS to tell clang to add fuzzer-related instrumentation to all the 204537b7248SPaolo Bonzini # compiled code. To build non-fuzzer binaries with --enable-fuzzing, link 205537b7248SPaolo Bonzini # everything with fsanitize=fuzzer-no-link. Otherwise, the linker will be 206537b7248SPaolo Bonzini # unable to bind the fuzzer-related callbacks added by instrumentation. 207537b7248SPaolo Bonzini add_global_arguments('-fsanitize=fuzzer-no-link', 208537b7248SPaolo Bonzini native: false, language: ['c', 'cpp', 'objc']) 209537b7248SPaolo Bonzini add_global_link_arguments('-fsanitize=fuzzer-no-link', 210537b7248SPaolo Bonzini native: false, language: ['c', 'cpp', 'objc']) 211537b7248SPaolo Bonzini # For the actual fuzzer binaries, we need to link against the libfuzzer 212537b7248SPaolo Bonzini # library. They need to be configurable, to support OSS-Fuzz 213537b7248SPaolo Bonzini fuzz_exe_ldflags = ['-fsanitize=fuzzer'] 214537b7248SPaolo Bonzini else 215537b7248SPaolo Bonzini # LIB_FUZZING_ENGINE was set; assume we are running on OSS-Fuzz, and 216537b7248SPaolo Bonzini # the needed CFLAGS have already been provided 217537b7248SPaolo Bonzini fuzz_exe_ldflags = get_option('fuzzing_engine').split() 218537b7248SPaolo Bonzini endif 219ff9ed62bSAlexander Bulekovendif 220ff9ed62bSAlexander Bulekov 2214cb37d11SPhilippe Mathieu-Daudéadd_global_arguments(qemu_cflags, native: false, language: ['c']) 2228cc2d231SPaolo Bonziniadd_global_arguments(qemu_cxxflags, native: false, language: ['cpp']) 2234cb37d11SPhilippe Mathieu-Daudéadd_global_arguments(qemu_objcflags, native: false, language: ['objc']) 2248cc2d231SPaolo Bonziniadd_global_link_arguments(qemu_ldflags, native: false, language: ['c', 'cpp', 'objc']) 225a5665051SPaolo Bonzini 2261e6e616dSPaolo Bonziniif targetos == 'linux' 2271e6e616dSPaolo Bonzini add_project_arguments('-isystem', meson.current_source_dir() / 'linux-headers', 2281e6e616dSPaolo Bonzini '-isystem', 'linux-headers', 2291e6e616dSPaolo Bonzini language: ['c', 'cpp']) 2301e6e616dSPaolo Bonziniendif 2311e6e616dSPaolo Bonzini 23223a77b2dSPaolo Bonziniadd_project_arguments('-iquote', '.', 2331e6e616dSPaolo Bonzini '-iquote', meson.current_source_dir(), 2341e6e616dSPaolo Bonzini '-iquote', meson.current_source_dir() / 'include', 2351e6e616dSPaolo Bonzini '-iquote', meson.current_source_dir() / 'disas/libvixl', 2361e6e616dSPaolo Bonzini language: ['c', 'cpp', 'objc']) 237c46f76d1SAlexander Bulekov 238fc929892SMarc-André Lureaulink_language = meson.get_external_property('link_language', 'cpp') 239fc929892SMarc-André Lureauif link_language == 'cpp' 240fc929892SMarc-André Lureau add_languages('cpp', required: true, native: false) 241565174d0SPaolo Bonzini cxx = meson.get_compiler('cpp') 242565174d0SPaolo Bonzini linker = cxx 243565174d0SPaolo Bonzinielse 244565174d0SPaolo Bonzini linker = cc 245fc929892SMarc-André Lureauendif 246a5665051SPaolo Bonziniif host_machine.system() == 'darwin' 247a5665051SPaolo Bonzini add_languages('objc', required: false, native: false) 248a5665051SPaolo Bonziniendif 249a5665051SPaolo Bonzini 250deb62371SPaolo Bonzinisparse = find_program('cgcc', required: get_option('sparse')) 251deb62371SPaolo Bonziniif sparse.found() 252968b4db3SPaolo Bonzini run_target('sparse', 253968b4db3SPaolo Bonzini command: [find_program('scripts/check_sparse.py'), 254deb62371SPaolo Bonzini 'compile_commands.json', sparse.full_path(), '-Wbitwise', 255deb62371SPaolo Bonzini '-Wno-transparent-union', '-Wno-old-initializer', 256deb62371SPaolo Bonzini '-Wno-non-pointer-null']) 257968b4db3SPaolo Bonziniendif 258968b4db3SPaolo Bonzini 2596ec0e15dSPaolo Bonzini########################################### 2606ec0e15dSPaolo Bonzini# Target-specific checks and dependencies # 2616ec0e15dSPaolo Bonzini########################################### 2626ec0e15dSPaolo Bonzini 263b7a75c8cSPaolo Bonzini# Fuzzing 264537b7248SPaolo Bonziniif get_option('fuzzing') and get_option('fuzzing_engine') == '' and \ 265537b7248SPaolo Bonzini not cc.links(''' 266537b7248SPaolo Bonzini #include <stdint.h> 267537b7248SPaolo Bonzini #include <sys/types.h> 268537b7248SPaolo Bonzini int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size); 269537b7248SPaolo Bonzini int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { return 0; } 270537b7248SPaolo Bonzini ''', 271537b7248SPaolo Bonzini args: ['-Werror', '-fsanitize=fuzzer']) 272537b7248SPaolo Bonzini error('Your compiler does not support -fsanitize=fuzzer') 273537b7248SPaolo Bonziniendif 274537b7248SPaolo Bonzini 275b7a75c8cSPaolo Bonzini# Tracing backends 2769c29b741SPaolo Bonziniif 'ftrace' in get_option('trace_backends') and targetos != 'linux' 2779c29b741SPaolo Bonzini error('ftrace is supported only on Linux') 2789c29b741SPaolo Bonziniendif 2799c29b741SPaolo Bonziniif 'syslog' in get_option('trace_backends') and not cc.compiles(''' 2809c29b741SPaolo Bonzini #include <syslog.h> 2819c29b741SPaolo Bonzini int main(void) { 2829c29b741SPaolo Bonzini openlog("qemu", LOG_PID, LOG_DAEMON); 2839c29b741SPaolo Bonzini syslog(LOG_INFO, "configure"); 2849c29b741SPaolo Bonzini return 0; 2859c29b741SPaolo Bonzini }''') 2869c29b741SPaolo Bonzini error('syslog is not supported on this system') 2879c29b741SPaolo Bonziniendif 2889c29b741SPaolo Bonzini 289b7a75c8cSPaolo Bonzini# Miscellaneous Linux-only features 290a436d6d4SPaolo Bonziniget_option('mpath') \ 291a436d6d4SPaolo Bonzini .require(targetos == 'linux', error_message: 'Multipath is supported only on Linux') 2926ec0e15dSPaolo Bonzini 293a436d6d4SPaolo Bonzinimultiprocess_allowed = get_option('multiprocess') \ 294a436d6d4SPaolo Bonzini .require(targetos == 'linux', error_message: 'Multiprocess QEMU is supported only on Linux') \ 295a436d6d4SPaolo Bonzini .allowed() 296106ad1f9SPaolo Bonzini 2970d04c4c9SPaolo Bonzinihave_tpm = get_option('tpm') \ 2980d04c4c9SPaolo Bonzini .require(targetos != 'windows', error_message: 'TPM emulation only available on POSIX systems') \ 2990d04c4c9SPaolo Bonzini .allowed() 3000d04c4c9SPaolo Bonzini 301b7a75c8cSPaolo Bonzini# Target-specific libraries and flags 3027fa1c635SPaolo Bonzinilibm = cc.find_library('m', required: false) 3036d7c7c2dSPaolo Bonzinithreads = dependency('threads') 304a81df1b6SPaolo Bonziniutil = cc.find_library('util', required: false) 3054a96337dSPaolo Bonziniwinmm = [] 306a81df1b6SPaolo Bonzinisocket = [] 30704c6f1e7SMarc-André Lureauversion_res = [] 308d92989aaSMarc-André Lureaucoref = [] 309d92989aaSMarc-André Lureauiokit = [] 310b6c7cfd4SPaolo Bonziniemulator_link_args = [] 31174a414a1SReinoud Zandijknvmm =not_found 3128a19980eSPaolo Bonzinihvf = not_found 31323011f44SMarc-André Lureaumidl = not_found 31423011f44SMarc-André Lureauwidl = not_found 315a6305081SPaolo Bonzinihost_dsosuf = '.so' 316a81df1b6SPaolo Bonziniif targetos == 'windows' 31723011f44SMarc-André Lureau midl = find_program('midl', required: false) 31823011f44SMarc-André Lureau widl = find_program('widl', required: false) 319a81df1b6SPaolo Bonzini socket = cc.find_library('ws2_32') 3204a96337dSPaolo Bonzini winmm = cc.find_library('winmm') 32104c6f1e7SMarc-André Lureau 32204c6f1e7SMarc-André Lureau win = import('windows') 32304c6f1e7SMarc-André Lureau version_res = win.compile_resources('version.rc', 32404c6f1e7SMarc-André Lureau depend_files: files('pc-bios/qemu-nsis.ico'), 32504c6f1e7SMarc-André Lureau include_directories: include_directories('.')) 326a6305081SPaolo Bonzini host_dsosuf = '.dll' 327d92989aaSMarc-André Lureauelif targetos == 'darwin' 328d92989aaSMarc-André Lureau coref = dependency('appleframeworks', modules: 'CoreFoundation') 32914176c8dSJoelle van Dyne iokit = dependency('appleframeworks', modules: 'IOKit', required: false) 330a6305081SPaolo Bonzini host_dsosuf = '.dylib' 331cfad62f1SPaolo Bonzinielif targetos == 'sunos' 332cfad62f1SPaolo Bonzini socket = [cc.find_library('socket'), 333cfad62f1SPaolo Bonzini cc.find_library('nsl'), 334cfad62f1SPaolo Bonzini cc.find_library('resolv')] 335cfad62f1SPaolo Bonzinielif targetos == 'haiku' 336cfad62f1SPaolo Bonzini socket = [cc.find_library('posix_error_mapper'), 337cfad62f1SPaolo Bonzini cc.find_library('network'), 338cfad62f1SPaolo Bonzini cc.find_library('bsd')] 339b6c7cfd4SPaolo Bonzinielif targetos == 'openbsd' 34043a363aeSPaolo Bonzini if get_option('tcg').allowed() and target_dirs.length() > 0 341b6c7cfd4SPaolo Bonzini # Disable OpenBSD W^X if available 342b6c7cfd4SPaolo Bonzini emulator_link_args = cc.get_supported_link_arguments('-Wl,-z,wxneeded') 343b6c7cfd4SPaolo Bonzini endif 344a81df1b6SPaolo Bonziniendif 3456ec0e15dSPaolo Bonzini 346b7a75c8cSPaolo Bonzini# Target-specific configuration of accelerators 3478a19980eSPaolo Bonziniaccelerators = [] 34843a363aeSPaolo Bonziniif get_option('kvm').allowed() and targetos == 'linux' 3498a19980eSPaolo Bonzini accelerators += 'CONFIG_KVM' 3508a19980eSPaolo Bonziniendif 35143a363aeSPaolo Bonziniif get_option('whpx').allowed() and targetos == 'windows' 35257e2a1f8SSunil Muthuswamy if get_option('whpx').enabled() and host_machine.cpu() != 'x86_64' 3538a19980eSPaolo Bonzini error('WHPX requires 64-bit host') 3548a19980eSPaolo Bonzini elif cc.has_header('WinHvPlatform.h', required: get_option('whpx')) and \ 3558a19980eSPaolo Bonzini cc.has_header('WinHvEmulation.h', required: get_option('whpx')) 3568a19980eSPaolo Bonzini accelerators += 'CONFIG_WHPX' 3578a19980eSPaolo Bonzini endif 3588a19980eSPaolo Bonziniendif 35943a363aeSPaolo Bonziniif get_option('hvf').allowed() 3608a19980eSPaolo Bonzini hvf = dependency('appleframeworks', modules: 'Hypervisor', 3618a19980eSPaolo Bonzini required: get_option('hvf')) 3628a19980eSPaolo Bonzini if hvf.found() 3638a19980eSPaolo Bonzini accelerators += 'CONFIG_HVF' 3648a19980eSPaolo Bonzini endif 3658a19980eSPaolo Bonziniendif 36643a363aeSPaolo Bonziniif get_option('hax').allowed() 3678a19980eSPaolo Bonzini if get_option('hax').enabled() or targetos in ['windows', 'darwin', 'netbsd'] 3688a19980eSPaolo Bonzini accelerators += 'CONFIG_HAX' 3698a19980eSPaolo Bonzini endif 3708a19980eSPaolo Bonziniendif 37174a414a1SReinoud Zandijkif targetos == 'netbsd' 37274a414a1SReinoud Zandijk nvmm = cc.find_library('nvmm', required: get_option('nvmm')) 37374a414a1SReinoud Zandijk if nvmm.found() 37474a414a1SReinoud Zandijk accelerators += 'CONFIG_NVMM' 37574a414a1SReinoud Zandijk endif 37674a414a1SReinoud Zandijkendif 37723a77b2dSPaolo Bonzini 378823eb013SPaolo Bonzinitcg_arch = host_arch 37943a363aeSPaolo Bonziniif get_option('tcg').allowed() 380823eb013SPaolo Bonzini if host_arch == 'unknown' 38123a77b2dSPaolo Bonzini if get_option('tcg_interpreter') 382f1f727acSPhilippe Mathieu-Daudé warning('Unsupported CPU @0@, will use TCG with TCI (slow)'.format(cpu)) 3838a19980eSPaolo Bonzini else 3848a19980eSPaolo Bonzini error('Unsupported CPU @0@, try --enable-tcg-interpreter'.format(cpu)) 3858a19980eSPaolo Bonzini endif 386fa2f7b0bSPhilippe Mathieu-Daudé elif get_option('tcg_interpreter') 3871c282da3SPhilippe Mathieu-Daudé warning('Use of the TCG interpreter is not recommended on this host') 388fa2f7b0bSPhilippe Mathieu-Daudé warning('architecture. There is a native TCG execution backend available') 389fa2f7b0bSPhilippe Mathieu-Daudé warning('which provides substantially better performance and reliability.') 390fa2f7b0bSPhilippe Mathieu-Daudé warning('It is strongly recommended to remove the --enable-tcg-interpreter') 391fa2f7b0bSPhilippe Mathieu-Daudé warning('configuration option on this architecture to use the native') 392fa2f7b0bSPhilippe Mathieu-Daudé warning('backend.') 3938a19980eSPaolo Bonzini endif 39423a77b2dSPaolo Bonzini if get_option('tcg_interpreter') 39523a77b2dSPaolo Bonzini tcg_arch = 'tci' 396823eb013SPaolo Bonzini elif host_arch == 'sparc64' 39723a77b2dSPaolo Bonzini tcg_arch = 'sparc' 398823eb013SPaolo Bonzini elif host_arch == 'x86_64' 39923a77b2dSPaolo Bonzini tcg_arch = 'i386' 400823eb013SPaolo Bonzini elif host_arch == 'ppc64' 40123a77b2dSPaolo Bonzini tcg_arch = 'ppc' 40223a77b2dSPaolo Bonzini endif 40323a77b2dSPaolo Bonzini add_project_arguments('-iquote', meson.current_source_dir() / 'tcg' / tcg_arch, 40423a77b2dSPaolo Bonzini language: ['c', 'cpp', 'objc']) 40523a77b2dSPaolo Bonzini 4068a19980eSPaolo Bonzini accelerators += 'CONFIG_TCG' 4078a19980eSPaolo Bonzini config_host += { 'CONFIG_TCG': 'y' } 4088a19980eSPaolo Bonziniendif 4098a19980eSPaolo Bonzini 4108a19980eSPaolo Bonziniif 'CONFIG_KVM' not in accelerators and get_option('kvm').enabled() 4118a19980eSPaolo Bonzini error('KVM not available on this platform') 4128a19980eSPaolo Bonziniendif 4138a19980eSPaolo Bonziniif 'CONFIG_HVF' not in accelerators and get_option('hvf').enabled() 4148a19980eSPaolo Bonzini error('HVF not available on this platform') 4158a19980eSPaolo Bonziniendif 41674a414a1SReinoud Zandijkif 'CONFIG_NVMM' not in accelerators and get_option('nvmm').enabled() 41774a414a1SReinoud Zandijk error('NVMM not available on this platform') 41874a414a1SReinoud Zandijkendif 4198a19980eSPaolo Bonziniif 'CONFIG_WHPX' not in accelerators and get_option('whpx').enabled() 4208a19980eSPaolo Bonzini error('WHPX not available on this platform') 4218a19980eSPaolo Bonziniendif 422b4e312e9SPaolo Bonzini 4236ec0e15dSPaolo Bonzini################ 4246ec0e15dSPaolo Bonzini# Dependencies # 4256ec0e15dSPaolo Bonzini################ 4266ec0e15dSPaolo Bonzini 427215b0c2fSPaolo Bonzini# The path to glib.h is added to all compilation commands. This was 428215b0c2fSPaolo Bonzini# grandfathered in from the QEMU Makefiles. 429215b0c2fSPaolo Bonziniadd_project_arguments(config_host['GLIB_CFLAGS'].split(), 430215b0c2fSPaolo Bonzini native: false, language: ['c', 'cpp', 'objc']) 431953d5a9eSMarc-André Lureauglib = declare_dependency(compile_args: config_host['GLIB_CFLAGS'].split(), 432d83acfd0SMarc-André Lureau link_args: config_host['GLIB_LIBS'].split(), 433d83acfd0SMarc-André Lureau version: config_host['GLIB_VERSION']) 434953d5a9eSMarc-André Lureau# override glib dep with the configure results (for subprojects) 435953d5a9eSMarc-André Lureaumeson.override_dependency('glib-2.0', glib) 436953d5a9eSMarc-André Lureau 437a81df1b6SPaolo Bonzinigio = not_found 4387544060eSPaolo Bonzinigdbus_codegen = not_found 4397544060eSPaolo Bonziniif not get_option('gio').auto() or have_system 4407544060eSPaolo Bonzini gio = dependency('gio-2.0', required: get_option('gio'), 4417544060eSPaolo Bonzini method: 'pkg-config', kwargs: static_kwargs) 4427544060eSPaolo Bonzini if gio.found() and not cc.links(''' 4437544060eSPaolo Bonzini #include <gio/gio.h> 4447544060eSPaolo Bonzini int main(void) 4457544060eSPaolo Bonzini { 4467544060eSPaolo Bonzini g_dbus_proxy_new_sync(0, 0, 0, 0, 0, 0, 0, 0); 4477544060eSPaolo Bonzini return 0; 4487544060eSPaolo Bonzini }''', dependencies: [glib, gio]) 4497544060eSPaolo Bonzini if get_option('gio').enabled() 4507544060eSPaolo Bonzini error('The installed libgio is broken for static linking') 451a81df1b6SPaolo Bonzini endif 4527544060eSPaolo Bonzini gio = not_found 4537544060eSPaolo Bonzini endif 4547544060eSPaolo Bonzini if gio.found() 4557544060eSPaolo Bonzini gdbus_codegen = find_program(gio.get_variable('gdbus_codegen'), 4567544060eSPaolo Bonzini required: get_option('gio')) 4577544060eSPaolo Bonzini gio_unix = dependency('gio-unix-2.0', required: get_option('gio'), 4587544060eSPaolo Bonzini method: 'pkg-config', kwargs: static_kwargs) 4597544060eSPaolo Bonzini gio = declare_dependency(dependencies: [gio, gio_unix], 4607544060eSPaolo Bonzini version: gio.version()) 4617544060eSPaolo Bonzini endif 4627544060eSPaolo Bonziniendif 4637544060eSPaolo Bonzini 464a81df1b6SPaolo Bonzinilttng = not_found 4659c29b741SPaolo Bonziniif 'ust' in get_option('trace_backends') 466e32aaa5aSMarc-André Lureau lttng = dependency('lttng-ust', required: true, version: '>= 2.1', 467e32aaa5aSMarc-André Lureau method: 'pkg-config', kwargs: static_kwargs) 468a81df1b6SPaolo Bonziniendif 469b7612f45SPaolo Bonzinipixman = not_found 470b7612f45SPaolo Bonziniif have_system or have_tools 471b7612f45SPaolo Bonzini pixman = dependency('pixman-1', required: have_system, version:'>=0.21.8', 472d7dedf42SPaolo Bonzini method: 'pkg-config', kwargs: static_kwargs) 473b7612f45SPaolo Bonziniendif 474d7dedf42SPaolo Bonzinizlib = dependency('zlib', required: true, kwargs: static_kwargs) 47553c22b68SPaolo Bonzini 476ff66f3e5SPaolo Bonzinilibaio = not_found 477ff66f3e5SPaolo Bonziniif not get_option('linux_aio').auto() or have_block 478ff66f3e5SPaolo Bonzini libaio = cc.find_library('aio', has_headers: ['libaio.h'], 479ff66f3e5SPaolo Bonzini required: get_option('linux_aio'), 480ff66f3e5SPaolo Bonzini kwargs: static_kwargs) 481ff66f3e5SPaolo Bonziniendif 4825e5733e5SMarc-André Lureaulinux_io_uring = not_found 48353c22b68SPaolo Bonziniif not get_option('linux_io_uring').auto() or have_block 484a41b4fdcSDaniel P. Berrangé linux_io_uring = dependency('liburing', version: '>=0.3', 485a41b4fdcSDaniel P. Berrangé required: get_option('linux_io_uring'), 48653c22b68SPaolo Bonzini method: 'pkg-config', kwargs: static_kwargs) 4875e5733e5SMarc-André Lureauendif 4885e5733e5SMarc-André Lureaulibnfs = not_found 48930045c05SPaolo Bonziniif not get_option('libnfs').auto() or have_block 49030045c05SPaolo Bonzini libnfs = dependency('libnfs', version: '>=1.9.3', 49130045c05SPaolo Bonzini required: get_option('libnfs'), 492d7dedf42SPaolo Bonzini method: 'pkg-config', kwargs: static_kwargs) 4935e5733e5SMarc-André Lureauendif 494f7f2d651SPaolo Bonzini 495f7f2d651SPaolo Bonzinilibattr_test = ''' 496f7f2d651SPaolo Bonzini #include <stddef.h> 497f7f2d651SPaolo Bonzini #include <sys/types.h> 498f7f2d651SPaolo Bonzini #ifdef CONFIG_LIBATTR 499f7f2d651SPaolo Bonzini #include <attr/xattr.h> 500f7f2d651SPaolo Bonzini #else 501f7f2d651SPaolo Bonzini #include <sys/xattr.h> 502f7f2d651SPaolo Bonzini #endif 503f7f2d651SPaolo Bonzini int main(void) { getxattr(NULL, NULL, NULL, 0); setxattr(NULL, NULL, NULL, 0, 0); return 0; }''' 504f7f2d651SPaolo Bonzini 505ec0d5893SMarc-André Lureaulibattr = not_found 506f7f2d651SPaolo Bonzinihave_old_libattr = false 50743a363aeSPaolo Bonziniif get_option('attr').allowed() 508f7f2d651SPaolo Bonzini if cc.links(libattr_test) 509f7f2d651SPaolo Bonzini libattr = declare_dependency() 510f7f2d651SPaolo Bonzini else 511f7f2d651SPaolo Bonzini libattr = cc.find_library('attr', has_headers: ['attr/xattr.h'], 512f7f2d651SPaolo Bonzini required: get_option('attr'), 513d7dedf42SPaolo Bonzini kwargs: static_kwargs) 514f7f2d651SPaolo Bonzini if libattr.found() and not \ 515f7f2d651SPaolo Bonzini cc.links(libattr_test, dependencies: libattr, args: '-DCONFIG_LIBATTR') 516f7f2d651SPaolo Bonzini libattr = not_found 517f7f2d651SPaolo Bonzini if get_option('attr').enabled() 518f7f2d651SPaolo Bonzini error('could not link libattr') 519f7f2d651SPaolo Bonzini else 520f7f2d651SPaolo Bonzini warning('could not link libattr, disabling') 521ec0d5893SMarc-André Lureau endif 522f7f2d651SPaolo Bonzini else 523f7f2d651SPaolo Bonzini have_old_libattr = libattr.found() 524f7f2d651SPaolo Bonzini endif 525f7f2d651SPaolo Bonzini endif 526f7f2d651SPaolo Bonziniendif 527f7f2d651SPaolo Bonzini 528c1ec4941SPaolo Bonzinicocoa = dependency('appleframeworks', modules: 'Cocoa', required: get_option('cocoa')) 529c1ec4941SPaolo Bonziniif cocoa.found() and get_option('sdl').enabled() 530c1ec4941SPaolo Bonzini error('Cocoa and SDL cannot be enabled at the same time') 531c1ec4941SPaolo Bonziniendif 532c1ec4941SPaolo Bonziniif cocoa.found() and get_option('gtk').enabled() 533c1ec4941SPaolo Bonzini error('Cocoa and GTK+ cannot be enabled at the same time') 534c1ec4941SPaolo Bonziniendif 535c1ec4941SPaolo Bonzini 5363f99cf57SPaolo Bonziniseccomp = not_found 53790835c2bSPaolo Bonziniif not get_option('seccomp').auto() or have_system or have_tools 53890835c2bSPaolo Bonzini seccomp = dependency('libseccomp', version: '>=2.3.0', 53990835c2bSPaolo Bonzini required: get_option('seccomp'), 540d7dedf42SPaolo Bonzini method: 'pkg-config', kwargs: static_kwargs) 5413f99cf57SPaolo Bonziniendif 542727c8bb8SPaolo Bonzini 5433f99cf57SPaolo Bonzinilibcap_ng = not_found 544727c8bb8SPaolo Bonziniif not get_option('cap_ng').auto() or have_system or have_tools 545727c8bb8SPaolo Bonzini libcap_ng = cc.find_library('cap-ng', has_headers: ['cap-ng.h'], 546727c8bb8SPaolo Bonzini required: get_option('cap_ng'), 547d7dedf42SPaolo Bonzini kwargs: static_kwargs) 5483f99cf57SPaolo Bonziniendif 549727c8bb8SPaolo Bonziniif libcap_ng.found() and not cc.links(''' 550727c8bb8SPaolo Bonzini #include <cap-ng.h> 551727c8bb8SPaolo Bonzini int main(void) 552727c8bb8SPaolo Bonzini { 553727c8bb8SPaolo Bonzini capng_capability_to_name(CAPNG_EFFECTIVE); 554727c8bb8SPaolo Bonzini return 0; 555727c8bb8SPaolo Bonzini }''', dependencies: libcap_ng) 556727c8bb8SPaolo Bonzini libcap_ng = not_found 557727c8bb8SPaolo Bonzini if get_option('cap_ng').enabled() 558727c8bb8SPaolo Bonzini error('could not link libcap-ng') 559727c8bb8SPaolo Bonzini else 560727c8bb8SPaolo Bonzini warning('could not link libcap-ng, disabling') 561727c8bb8SPaolo Bonzini endif 562727c8bb8SPaolo Bonziniendif 563727c8bb8SPaolo Bonzini 5641917ec6dSPaolo Bonziniif get_option('xkbcommon').auto() and not have_system and not have_tools 5651917ec6dSPaolo Bonzini xkbcommon = not_found 5661917ec6dSPaolo Bonzinielse 5671917ec6dSPaolo Bonzini xkbcommon = dependency('xkbcommon', required: get_option('xkbcommon'), 568d7dedf42SPaolo Bonzini method: 'pkg-config', kwargs: static_kwargs) 569ade60d4fSMarc-André Lureauendif 570e1723999SPaolo Bonzini 571cdaf0722SMarc-André Lureauvde = not_found 572e1723999SPaolo Bonziniif not get_option('vde').auto() or have_system or have_tools 573e1723999SPaolo Bonzini vde = cc.find_library('vdeplug', has_headers: ['libvdeplug.h'], 574e1723999SPaolo Bonzini required: get_option('vde'), 575e1723999SPaolo Bonzini kwargs: static_kwargs) 576e1723999SPaolo Bonziniendif 577e1723999SPaolo Bonziniif vde.found() and not cc.links(''' 578e1723999SPaolo Bonzini #include <libvdeplug.h> 579e1723999SPaolo Bonzini int main(void) 580e1723999SPaolo Bonzini { 581e1723999SPaolo Bonzini struct vde_open_args a = {0, 0, 0}; 582e1723999SPaolo Bonzini char s[] = ""; 583e1723999SPaolo Bonzini vde_open(s, s, &a); 584e1723999SPaolo Bonzini return 0; 585e1723999SPaolo Bonzini }''', dependencies: vde) 586e1723999SPaolo Bonzini vde = not_found 587e1723999SPaolo Bonzini if get_option('cap_ng').enabled() 588e1723999SPaolo Bonzini error('could not link libvdeplug') 589e1723999SPaolo Bonzini else 590e1723999SPaolo Bonzini warning('could not link libvdeplug, disabling') 591e1723999SPaolo Bonzini endif 592cdaf0722SMarc-André Lureauendif 59387430d5bSPaolo Bonzini 594478e943fSPaolo Bonzinipulse = not_found 59587430d5bSPaolo Bonziniif not get_option('pa').auto() or (targetos == 'linux' and have_system) 59687430d5bSPaolo Bonzini pulse = dependency('libpulse', required: get_option('pa'), 59787430d5bSPaolo Bonzini method: 'pkg-config', kwargs: static_kwargs) 598478e943fSPaolo Bonziniendif 599478e943fSPaolo Bonzinialsa = not_found 60087430d5bSPaolo Bonziniif not get_option('alsa').auto() or (targetos == 'linux' and have_system) 60187430d5bSPaolo Bonzini alsa = dependency('alsa', required: get_option('alsa'), 60287430d5bSPaolo Bonzini method: 'pkg-config', kwargs: static_kwargs) 603478e943fSPaolo Bonziniendif 604478e943fSPaolo Bonzinijack = not_found 60587430d5bSPaolo Bonziniif not get_option('jack').auto() or have_system 60687430d5bSPaolo Bonzini jack = dependency('jack', required: get_option('jack'), 60787430d5bSPaolo Bonzini method: 'pkg-config', kwargs: static_kwargs) 608478e943fSPaolo Bonziniendif 60987430d5bSPaolo Bonzini 61058d3f3ffSGerd Hoffmannspice_protocol = not_found 6113f0a5d55SMarc-André Lureauif not get_option('spice_protocol').auto() or have_system 6123f0a5d55SMarc-André Lureau spice_protocol = dependency('spice-protocol', version: '>=0.12.3', 6133f0a5d55SMarc-André Lureau required: get_option('spice_protocol'), 6143f0a5d55SMarc-André Lureau method: 'pkg-config', kwargs: static_kwargs) 6152634733cSPaolo Bonziniendif 6163f0a5d55SMarc-André Lureauspice = not_found 6173f0a5d55SMarc-André Lureauif not get_option('spice').auto() or have_system 6183f0a5d55SMarc-André Lureau spice = dependency('spice-server', version: '>=0.12.5', 6193f0a5d55SMarc-André Lureau required: get_option('spice'), 6203f0a5d55SMarc-André Lureau method: 'pkg-config', kwargs: static_kwargs) 62158d3f3ffSGerd Hoffmannendif 6223f0a5d55SMarc-André Lureauspice_headers = spice.partial_dependency(compile_args: true, includes: true) 6233f0a5d55SMarc-André Lureau 6245ee24e78SMarc-André Lureaurt = cc.find_library('rt', required: false) 625a399f914SPaolo Bonzini 62699650b62SPaolo Bonzinilibiscsi = not_found 6279db405a3SPaolo Bonziniif not get_option('libiscsi').auto() or have_block 6289db405a3SPaolo Bonzini libiscsi = dependency('libiscsi', version: '>=1.9.0', 6299db405a3SPaolo Bonzini required: get_option('libiscsi'), 630d7dedf42SPaolo Bonzini method: 'pkg-config', kwargs: static_kwargs) 63199650b62SPaolo Bonziniendif 6325e5733e5SMarc-André Lureauzstd = not_found 633b1def33dSPaolo Bonziniif not get_option('zstd').auto() or have_block 634b1def33dSPaolo Bonzini zstd = dependency('libzstd', version: '>=1.4.0', 635b1def33dSPaolo Bonzini required: get_option('zstd'), 636d7dedf42SPaolo Bonzini method: 'pkg-config', kwargs: static_kwargs) 6375e5733e5SMarc-André Lureauendif 638ea458960SMarc-André Lureauvirgl = not_found 6390265fe9eSPaolo Bonzini 6400265fe9eSPaolo Bonzinihave_vhost_user_gpu = have_tools and targetos == 'linux' and pixman.found() 6410265fe9eSPaolo Bonziniif not get_option('virglrenderer').auto() or have_system or have_vhost_user_gpu 642587d59d6SPaolo Bonzini virgl = dependency('virglrenderer', 643587d59d6SPaolo Bonzini method: 'pkg-config', 644587d59d6SPaolo Bonzini required: get_option('virglrenderer'), 645587d59d6SPaolo Bonzini kwargs: static_kwargs) 646ea458960SMarc-André Lureauendif 6471d7bb6abSMarc-André Lureaucurl = not_found 648f9cd86feSPaolo Bonziniif not get_option('curl').auto() or have_block 649f9cd86feSPaolo Bonzini curl = dependency('libcurl', version: '>=7.29.0', 650f9cd86feSPaolo Bonzini method: 'pkg-config', 651f9cd86feSPaolo Bonzini required: get_option('curl'), 652d7dedf42SPaolo Bonzini kwargs: static_kwargs) 6531d7bb6abSMarc-André Lureauendif 654f15bff25SPaolo Bonzinilibudev = not_found 655f01496a3SPaolo Bonziniif targetos == 'linux' and (have_system or have_tools) 6566ec0e15dSPaolo Bonzini libudev = dependency('libudev', 657a0fbbb6eSPaolo Bonzini method: 'pkg-config', 6585c53015aSPaolo Bonzini required: get_option('libudev'), 659d7dedf42SPaolo Bonzini kwargs: static_kwargs) 660f15bff25SPaolo Bonziniendif 6616ec0e15dSPaolo Bonzini 6625c53015aSPaolo Bonzinimpathlibs = [libudev] 6636ec0e15dSPaolo Bonzinimpathpersist = not_found 6646ec0e15dSPaolo Bonzinimpathpersist_new_api = false 66543a363aeSPaolo Bonziniif targetos == 'linux' and have_tools and get_option('mpath').allowed() 6666ec0e15dSPaolo Bonzini mpath_test_source_new = ''' 6676ec0e15dSPaolo Bonzini #include <libudev.h> 6686ec0e15dSPaolo Bonzini #include <mpath_persist.h> 6696ec0e15dSPaolo Bonzini unsigned mpath_mx_alloc_len = 1024; 6706ec0e15dSPaolo Bonzini int logsink; 6716ec0e15dSPaolo Bonzini static struct config *multipath_conf; 6726ec0e15dSPaolo Bonzini extern struct udev *udev; 6736ec0e15dSPaolo Bonzini extern struct config *get_multipath_config(void); 6746ec0e15dSPaolo Bonzini extern void put_multipath_config(struct config *conf); 6756ec0e15dSPaolo Bonzini struct udev *udev; 6766ec0e15dSPaolo Bonzini struct config *get_multipath_config(void) { return multipath_conf; } 6776ec0e15dSPaolo Bonzini void put_multipath_config(struct config *conf) { } 6786ec0e15dSPaolo Bonzini int main(void) { 6796ec0e15dSPaolo Bonzini udev = udev_new(); 6806ec0e15dSPaolo Bonzini multipath_conf = mpath_lib_init(); 6816ec0e15dSPaolo Bonzini return 0; 6826ec0e15dSPaolo Bonzini }''' 6836ec0e15dSPaolo Bonzini mpath_test_source_old = ''' 6846ec0e15dSPaolo Bonzini #include <libudev.h> 6856ec0e15dSPaolo Bonzini #include <mpath_persist.h> 6866ec0e15dSPaolo Bonzini unsigned mpath_mx_alloc_len = 1024; 6876ec0e15dSPaolo Bonzini int logsink; 6886ec0e15dSPaolo Bonzini int main(void) { 6896ec0e15dSPaolo Bonzini struct udev *udev = udev_new(); 6906ec0e15dSPaolo Bonzini mpath_lib_init(udev); 6916ec0e15dSPaolo Bonzini return 0; 6926ec0e15dSPaolo Bonzini }''' 6935c53015aSPaolo Bonzini libmpathpersist = cc.find_library('mpathpersist', 6945c53015aSPaolo Bonzini required: get_option('mpath'), 695d7dedf42SPaolo Bonzini kwargs: static_kwargs) 6965c53015aSPaolo Bonzini if libmpathpersist.found() 6975c53015aSPaolo Bonzini mpathlibs += libmpathpersist 69843b43a40SPaolo Bonzini if enable_static 69943b43a40SPaolo Bonzini mpathlibs += cc.find_library('devmapper', 7006ec0e15dSPaolo Bonzini required: get_option('mpath'), 701d7dedf42SPaolo Bonzini kwargs: static_kwargs) 70243b43a40SPaolo Bonzini endif 70343b43a40SPaolo Bonzini mpathlibs += cc.find_library('multipath', 7046ec0e15dSPaolo Bonzini required: get_option('mpath'), 705d7dedf42SPaolo Bonzini kwargs: static_kwargs) 70643b43a40SPaolo Bonzini foreach lib: mpathlibs 70743b43a40SPaolo Bonzini if not lib.found() 70843b43a40SPaolo Bonzini mpathlibs = [] 70943b43a40SPaolo Bonzini break 71043b43a40SPaolo Bonzini endif 71143b43a40SPaolo Bonzini endforeach 7125c53015aSPaolo Bonzini if mpathlibs.length() == 0 7135c53015aSPaolo Bonzini msg = 'Dependencies missing for libmpathpersist' 7145c53015aSPaolo Bonzini elif cc.links(mpath_test_source_new, dependencies: mpathlibs) 7156ec0e15dSPaolo Bonzini mpathpersist = declare_dependency(dependencies: mpathlibs) 7166ec0e15dSPaolo Bonzini mpathpersist_new_api = true 7176ec0e15dSPaolo Bonzini elif cc.links(mpath_test_source_old, dependencies: mpathlibs) 7186ec0e15dSPaolo Bonzini mpathpersist = declare_dependency(dependencies: mpathlibs) 7196ec0e15dSPaolo Bonzini else 7205c53015aSPaolo Bonzini msg = 'Cannot detect libmpathpersist API' 7215c53015aSPaolo Bonzini endif 7225c53015aSPaolo Bonzini if not mpathpersist.found() 7236ec0e15dSPaolo Bonzini if get_option('mpath').enabled() 7245c53015aSPaolo Bonzini error(msg) 7256ec0e15dSPaolo Bonzini else 7265c53015aSPaolo Bonzini warning(msg + ', disabling') 7276ec0e15dSPaolo Bonzini endif 7286ec0e15dSPaolo Bonzini endif 7296ec0e15dSPaolo Bonzini endif 7306ec0e15dSPaolo Bonziniendif 7316ec0e15dSPaolo Bonzini 7325285e593SYonggang Luoiconv = not_found 73330fe76b1SPaolo Bonzinicurses = not_found 73443a363aeSPaolo Bonziniif have_system and get_option('curses').allowed() 7355285e593SYonggang Luo curses_test = ''' 736fbab8cc2SStefan Weil #if defined(__APPLE__) || defined(__OpenBSD__) 737fbab8cc2SStefan Weil #define _XOPEN_SOURCE_EXTENDED 1 738fbab8cc2SStefan Weil #endif 7395285e593SYonggang Luo #include <locale.h> 7405285e593SYonggang Luo #include <curses.h> 7415285e593SYonggang Luo #include <wchar.h> 7425285e593SYonggang Luo int main(void) { 7435285e593SYonggang Luo wchar_t wch = L'w'; 7445285e593SYonggang Luo setlocale(LC_ALL, ""); 7455285e593SYonggang Luo resize_term(0, 0); 7465285e593SYonggang Luo addwstr(L"wide chars\n"); 7475285e593SYonggang Luo addnwstr(&wch, 1); 7485285e593SYonggang Luo add_wch(WACS_DEGREE); 7495285e593SYonggang Luo return 0; 7505285e593SYonggang Luo }''' 751925a40dfSPaolo Bonzini 752ca31e307SYonggang Luo curses_dep_list = targetos == 'windows' ? ['ncurses', 'ncursesw'] : ['ncursesw'] 753ca31e307SYonggang Luo foreach curses_dep : curses_dep_list 754ca31e307SYonggang Luo if not curses.found() 755ca31e307SYonggang Luo curses = dependency(curses_dep, 7565285e593SYonggang Luo required: false, 7575285e593SYonggang Luo method: 'pkg-config', 758d7dedf42SPaolo Bonzini kwargs: static_kwargs) 759ca31e307SYonggang Luo endif 760ca31e307SYonggang Luo endforeach 761925a40dfSPaolo Bonzini msg = get_option('curses').enabled() ? 'curses library not found' : '' 762fbab8cc2SStefan Weil curses_compile_args = ['-DNCURSES_WIDECHAR=1'] 763925a40dfSPaolo Bonzini if curses.found() 7640dbce6efSPaolo Bonzini if cc.links(curses_test, args: curses_compile_args, dependencies: [curses]) 7650dbce6efSPaolo Bonzini curses = declare_dependency(compile_args: curses_compile_args, dependencies: [curses]) 766925a40dfSPaolo Bonzini else 767925a40dfSPaolo Bonzini msg = 'curses package not usable' 768925a40dfSPaolo Bonzini curses = not_found 7695285e593SYonggang Luo endif 770925a40dfSPaolo Bonzini endif 771925a40dfSPaolo Bonzini if not curses.found() 772925a40dfSPaolo Bonzini has_curses_h = cc.has_header('curses.h', args: curses_compile_args) 773925a40dfSPaolo Bonzini if targetos != 'windows' and not has_curses_h 774925a40dfSPaolo Bonzini message('Trying with /usr/include/ncursesw') 775925a40dfSPaolo Bonzini curses_compile_args += ['-I/usr/include/ncursesw'] 776925a40dfSPaolo Bonzini has_curses_h = cc.has_header('curses.h', args: curses_compile_args) 777925a40dfSPaolo Bonzini endif 778925a40dfSPaolo Bonzini if has_curses_h 779925a40dfSPaolo Bonzini curses_libname_list = (targetos == 'windows' ? ['pdcurses'] : ['ncursesw', 'cursesw']) 780925a40dfSPaolo Bonzini foreach curses_libname : curses_libname_list 7815285e593SYonggang Luo libcurses = cc.find_library(curses_libname, 7825285e593SYonggang Luo required: false, 783d7dedf42SPaolo Bonzini kwargs: static_kwargs) 7845285e593SYonggang Luo if libcurses.found() 785925a40dfSPaolo Bonzini if cc.links(curses_test, args: curses_compile_args, dependencies: libcurses) 786925a40dfSPaolo Bonzini curses = declare_dependency(compile_args: curses_compile_args, 787925a40dfSPaolo Bonzini dependencies: [libcurses]) 7885285e593SYonggang Luo break 789925a40dfSPaolo Bonzini else 790925a40dfSPaolo Bonzini msg = 'curses library not usable' 7915285e593SYonggang Luo endif 7925285e593SYonggang Luo endif 7935285e593SYonggang Luo endforeach 7945285e593SYonggang Luo endif 79530fe76b1SPaolo Bonzini endif 79643a363aeSPaolo Bonzini if get_option('iconv').allowed() 797925a40dfSPaolo Bonzini foreach link_args : [ ['-liconv'], [] ] 798925a40dfSPaolo Bonzini # Programs will be linked with glib and this will bring in libiconv on FreeBSD. 799925a40dfSPaolo Bonzini # We need to use libiconv if available because mixing libiconv's headers with 800925a40dfSPaolo Bonzini # the system libc does not work. 801925a40dfSPaolo Bonzini # However, without adding glib to the dependencies -L/usr/local/lib will not be 802925a40dfSPaolo Bonzini # included in the command line and libiconv will not be found. 803925a40dfSPaolo Bonzini if cc.links(''' 804925a40dfSPaolo Bonzini #include <iconv.h> 805925a40dfSPaolo Bonzini int main(void) { 806925a40dfSPaolo Bonzini iconv_t conv = iconv_open("WCHAR_T", "UCS-2"); 807925a40dfSPaolo Bonzini return conv != (iconv_t) -1; 808925a40dfSPaolo Bonzini }''', args: config_host['GLIB_CFLAGS'].split() + config_host['GLIB_LIBS'].split() + link_args) 809925a40dfSPaolo Bonzini iconv = declare_dependency(link_args: link_args, dependencies: glib) 810925a40dfSPaolo Bonzini break 811925a40dfSPaolo Bonzini endif 812925a40dfSPaolo Bonzini endforeach 813925a40dfSPaolo Bonzini endif 814925a40dfSPaolo Bonzini if curses.found() and not iconv.found() 815925a40dfSPaolo Bonzini if get_option('iconv').enabled() 816925a40dfSPaolo Bonzini error('iconv not available') 817925a40dfSPaolo Bonzini endif 818925a40dfSPaolo Bonzini msg = 'iconv required for curses UI but not available' 819925a40dfSPaolo Bonzini curses = not_found 820925a40dfSPaolo Bonzini endif 821925a40dfSPaolo Bonzini if not curses.found() and msg != '' 822925a40dfSPaolo Bonzini if get_option('curses').enabled() 823925a40dfSPaolo Bonzini error(msg) 8245285e593SYonggang Luo else 825925a40dfSPaolo Bonzini warning(msg + ', disabling') 82630fe76b1SPaolo Bonzini endif 8275285e593SYonggang Luo endif 8285285e593SYonggang Luoendif 8295285e593SYonggang Luo 8302634733cSPaolo Bonzinibrlapi = not_found 8318c6d4ff4SPaolo Bonziniif not get_option('brlapi').auto() or have_system 8328c6d4ff4SPaolo Bonzini brlapi = cc.find_library('brlapi', has_headers: ['brlapi.h'], 8338c6d4ff4SPaolo Bonzini required: get_option('brlapi'), 834d7dedf42SPaolo Bonzini kwargs: static_kwargs) 8358c6d4ff4SPaolo Bonzini if brlapi.found() and not cc.links(''' 8368c6d4ff4SPaolo Bonzini #include <brlapi.h> 8378c6d4ff4SPaolo Bonzini #include <stddef.h> 8388c6d4ff4SPaolo Bonzini int main(void) { return brlapi__openConnection (NULL, NULL, NULL); }''', dependencies: brlapi) 8398c6d4ff4SPaolo Bonzini brlapi = not_found 8408c6d4ff4SPaolo Bonzini if get_option('brlapi').enabled() 8418c6d4ff4SPaolo Bonzini error('could not link brlapi') 8428c6d4ff4SPaolo Bonzini else 8438c6d4ff4SPaolo Bonzini warning('could not link brlapi, disabling') 8448c6d4ff4SPaolo Bonzini endif 8458c6d4ff4SPaolo Bonzini endif 8462634733cSPaolo Bonziniendif 84735be72baSPaolo Bonzini 848760e4327SPaolo Bonzinisdl = not_found 849c1ec4941SPaolo Bonziniif not get_option('sdl').auto() or (have_system and not cocoa.found()) 850d7dedf42SPaolo Bonzini sdl = dependency('sdl2', required: get_option('sdl'), kwargs: static_kwargs) 85135be72baSPaolo Bonzini sdl_image = not_found 852760e4327SPaolo Bonziniendif 85335be72baSPaolo Bonziniif sdl.found() 85435be72baSPaolo Bonzini # work around 2.0.8 bug 85535be72baSPaolo Bonzini sdl = declare_dependency(compile_args: '-Wno-undef', 85635be72baSPaolo Bonzini dependencies: sdl) 8577161a433SVolker Rümelin sdl_image = dependency('SDL2_image', required: get_option('sdl_image'), 858d7dedf42SPaolo Bonzini method: 'pkg-config', kwargs: static_kwargs) 85935be72baSPaolo Bonzinielse 86035be72baSPaolo Bonzini if get_option('sdl_image').enabled() 861a8dc2aceSSergei Trofimovich error('sdl-image required, but SDL was @0@'.format( 862a8dc2aceSSergei Trofimovich get_option('sdl').disabled() ? 'disabled' : 'not found')) 8632634733cSPaolo Bonzini endif 86435be72baSPaolo Bonzini sdl_image = not_found 86535be72baSPaolo Bonziniendif 86635be72baSPaolo Bonzini 8675e5733e5SMarc-André Lureaurbd = not_found 868fabd1e93SPaolo Bonziniif not get_option('rbd').auto() or have_block 869fabd1e93SPaolo Bonzini librados = cc.find_library('rados', required: get_option('rbd'), 870d7dedf42SPaolo Bonzini kwargs: static_kwargs) 871fabd1e93SPaolo Bonzini librbd = cc.find_library('rbd', has_headers: ['rbd/librbd.h'], 872fabd1e93SPaolo Bonzini required: get_option('rbd'), 873d7dedf42SPaolo Bonzini kwargs: static_kwargs) 874c518d6c2SPaolo Bonzini if librados.found() and librbd.found() 875c518d6c2SPaolo Bonzini if cc.links(''' 876fabd1e93SPaolo Bonzini #include <stdio.h> 877fabd1e93SPaolo Bonzini #include <rbd/librbd.h> 878fabd1e93SPaolo Bonzini int main(void) { 879fabd1e93SPaolo Bonzini rados_t cluster; 880fabd1e93SPaolo Bonzini rados_create(&cluster, NULL); 88148672ac0SPeter Lieven #if LIBRBD_VERSION_CODE < LIBRBD_VERSION(1, 12, 0) 88248672ac0SPeter Lieven #error 88348672ac0SPeter Lieven #endif 884fabd1e93SPaolo Bonzini return 0; 885fabd1e93SPaolo Bonzini }''', dependencies: [librbd, librados]) 886fabd1e93SPaolo Bonzini rbd = declare_dependency(dependencies: [librbd, librados]) 887c518d6c2SPaolo Bonzini elif get_option('rbd').enabled() 88848672ac0SPeter Lieven error('librbd >= 1.12.0 required') 889c518d6c2SPaolo Bonzini else 89048672ac0SPeter Lieven warning('librbd >= 1.12.0 not found, disabling') 891c518d6c2SPaolo Bonzini endif 8925e5733e5SMarc-André Lureau endif 893fabd1e93SPaolo Bonziniendif 894fabd1e93SPaolo Bonzini 8955e5733e5SMarc-André Lureauglusterfs = not_found 89608821ca2SPaolo Bonziniglusterfs_ftruncate_has_stat = false 89708821ca2SPaolo Bonziniglusterfs_iocb_has_stat = false 89808821ca2SPaolo Bonziniif not get_option('glusterfs').auto() or have_block 89908821ca2SPaolo Bonzini glusterfs = dependency('glusterfs-api', version: '>=3', 90008821ca2SPaolo Bonzini required: get_option('glusterfs'), 901d7dedf42SPaolo Bonzini method: 'pkg-config', kwargs: static_kwargs) 90208821ca2SPaolo Bonzini if glusterfs.found() 90308821ca2SPaolo Bonzini glusterfs_ftruncate_has_stat = cc.links(''' 90408821ca2SPaolo Bonzini #include <glusterfs/api/glfs.h> 90508821ca2SPaolo Bonzini 90608821ca2SPaolo Bonzini int 90708821ca2SPaolo Bonzini main(void) 90808821ca2SPaolo Bonzini { 90908821ca2SPaolo Bonzini /* new glfs_ftruncate() passes two additional args */ 91008821ca2SPaolo Bonzini return glfs_ftruncate(NULL, 0, NULL, NULL); 91108821ca2SPaolo Bonzini } 91208821ca2SPaolo Bonzini ''', dependencies: glusterfs) 91308821ca2SPaolo Bonzini glusterfs_iocb_has_stat = cc.links(''' 91408821ca2SPaolo Bonzini #include <glusterfs/api/glfs.h> 91508821ca2SPaolo Bonzini 91608821ca2SPaolo Bonzini /* new glfs_io_cbk() passes two additional glfs_stat structs */ 91708821ca2SPaolo Bonzini static void 91808821ca2SPaolo Bonzini glusterfs_iocb(glfs_fd_t *fd, ssize_t ret, struct glfs_stat *prestat, struct glfs_stat *poststat, void *data) 91908821ca2SPaolo Bonzini {} 92008821ca2SPaolo Bonzini 92108821ca2SPaolo Bonzini int 92208821ca2SPaolo Bonzini main(void) 92308821ca2SPaolo Bonzini { 92408821ca2SPaolo Bonzini glfs_io_cbk iocb = &glusterfs_iocb; 92508821ca2SPaolo Bonzini iocb(NULL, 0 , NULL, NULL, NULL); 92608821ca2SPaolo Bonzini return 0; 92708821ca2SPaolo Bonzini } 92808821ca2SPaolo Bonzini ''', dependencies: glusterfs) 92908821ca2SPaolo Bonzini endif 9305e5733e5SMarc-André Lureauendif 931e6a52b36SThomas Huth 9325e5733e5SMarc-André Lureaulibssh = not_found 933e6a52b36SThomas Huthif not get_option('libssh').auto() or have_block 934e6a52b36SThomas Huth libssh = dependency('libssh', version: '>=0.8.7', 935e6a52b36SThomas Huth method: 'pkg-config', 936e6a52b36SThomas Huth required: get_option('libssh'), 937e6a52b36SThomas Huth kwargs: static_kwargs) 9385e5733e5SMarc-André Lureauendif 939e6a52b36SThomas Huth 9405e5733e5SMarc-André Lureaulibbzip2 = not_found 94129ba6116SPaolo Bonziniif not get_option('bzip2').auto() or have_block 94229ba6116SPaolo Bonzini libbzip2 = cc.find_library('bz2', has_headers: ['bzlib.h'], 94329ba6116SPaolo Bonzini required: get_option('bzip2'), 944d7dedf42SPaolo Bonzini kwargs: static_kwargs) 94529ba6116SPaolo Bonzini if libbzip2.found() and not cc.links(''' 94629ba6116SPaolo Bonzini #include <bzlib.h> 94729ba6116SPaolo Bonzini int main(void) { BZ2_bzlibVersion(); return 0; }''', dependencies: libbzip2) 94829ba6116SPaolo Bonzini libbzip2 = not_found 94929ba6116SPaolo Bonzini if get_option('bzip2').enabled() 95029ba6116SPaolo Bonzini error('could not link libbzip2') 95129ba6116SPaolo Bonzini else 95229ba6116SPaolo Bonzini warning('could not link libbzip2, disabling') 9535e5733e5SMarc-André Lureau endif 95429ba6116SPaolo Bonzini endif 9555e5733e5SMarc-André Lureauendif 956ecea3696SPaolo Bonzini 9575e5733e5SMarc-André Lureauliblzfse = not_found 958ecea3696SPaolo Bonziniif not get_option('lzfse').auto() or have_block 959ecea3696SPaolo Bonzini liblzfse = cc.find_library('lzfse', has_headers: ['lzfse.h'], 960ecea3696SPaolo Bonzini required: get_option('lzfse'), 961d7dedf42SPaolo Bonzini kwargs: static_kwargs) 9625e5733e5SMarc-André Lureauendif 963ecea3696SPaolo Bonziniif liblzfse.found() and not cc.links(''' 964ecea3696SPaolo Bonzini #include <lzfse.h> 965ecea3696SPaolo Bonzini int main(void) { lzfse_decode_scratch_size(); return 0; }''', dependencies: liblzfse) 966ecea3696SPaolo Bonzini liblzfse = not_found 967ecea3696SPaolo Bonzini if get_option('lzfse').enabled() 968ecea3696SPaolo Bonzini error('could not link liblzfse') 969ecea3696SPaolo Bonzini else 970ecea3696SPaolo Bonzini warning('could not link liblzfse, disabling') 971ecea3696SPaolo Bonzini endif 972ecea3696SPaolo Bonziniendif 973ecea3696SPaolo Bonzini 974478e943fSPaolo Bonzinioss = not_found 97543a363aeSPaolo Bonziniif get_option('oss').allowed() and have_system 97687430d5bSPaolo Bonzini if not cc.has_header('sys/soundcard.h') 97787430d5bSPaolo Bonzini # not found 97887430d5bSPaolo Bonzini elif targetos == 'netbsd' 97987430d5bSPaolo Bonzini oss = cc.find_library('ossaudio', required: get_option('oss'), 98087430d5bSPaolo Bonzini kwargs: static_kwargs) 98187430d5bSPaolo Bonzini else 98287430d5bSPaolo Bonzini oss = declare_dependency() 98387430d5bSPaolo Bonzini endif 98487430d5bSPaolo Bonzini 98587430d5bSPaolo Bonzini if not oss.found() 98687430d5bSPaolo Bonzini if get_option('oss').enabled() 98787430d5bSPaolo Bonzini error('OSS not found') 98887430d5bSPaolo Bonzini endif 98987430d5bSPaolo Bonzini endif 990478e943fSPaolo Bonziniendif 991478e943fSPaolo Bonzinidsound = not_found 99287430d5bSPaolo Bonziniif not get_option('dsound').auto() or (targetos == 'windows' and have_system) 99387430d5bSPaolo Bonzini if cc.has_header('dsound.h') 99487430d5bSPaolo Bonzini dsound = declare_dependency(link_args: ['-lole32', '-ldxguid']) 995478e943fSPaolo Bonzini endif 99687430d5bSPaolo Bonzini 99787430d5bSPaolo Bonzini if not dsound.found() 99887430d5bSPaolo Bonzini if get_option('dsound').enabled() 99987430d5bSPaolo Bonzini error('DirectSound not found') 100087430d5bSPaolo Bonzini endif 100187430d5bSPaolo Bonzini endif 100287430d5bSPaolo Bonziniendif 100387430d5bSPaolo Bonzini 1004478e943fSPaolo Bonzinicoreaudio = not_found 100587430d5bSPaolo Bonziniif not get_option('coreaudio').auto() or (targetos == 'darwin' and have_system) 100687430d5bSPaolo Bonzini coreaudio = dependency('appleframeworks', modules: 'CoreAudio', 100787430d5bSPaolo Bonzini required: get_option('coreaudio')) 1008478e943fSPaolo Bonziniendif 10098bc5184dSThomas Huth 10102b1ccdf4SMarc-André Lureauopengl = not_found 101188b6e618SPaolo Bonziniif not get_option('opengl').auto() or have_system or have_vhost_user_gpu 101288b6e618SPaolo Bonzini epoxy = dependency('epoxy', method: 'pkg-config', 101388b6e618SPaolo Bonzini required: get_option('opengl'), kwargs: static_kwargs) 101488b6e618SPaolo Bonzini if cc.has_header('epoxy/egl.h', dependencies: epoxy) 101588b6e618SPaolo Bonzini opengl = epoxy 101688b6e618SPaolo Bonzini elif get_option('opengl').enabled() 101788b6e618SPaolo Bonzini error('epoxy/egl.h not found') 101888b6e618SPaolo Bonzini endif 10192b1ccdf4SMarc-André Lureauendif 10208bc5184dSThomas Huthgbm = not_found 10218bc5184dSThomas Huthif (have_system or have_tools) and (virgl.found() or opengl.found()) 10228bc5184dSThomas Huth gbm = dependency('gbm', method: 'pkg-config', required: false, 10238bc5184dSThomas Huth kwargs: static_kwargs) 10248bc5184dSThomas Huthendif 10250265fe9eSPaolo Bonzinihave_vhost_user_gpu = have_vhost_user_gpu and virgl.found() and gbm.found() 10261b695471SPaolo Bonzini 102757612511SPaolo Bonzinignutls = not_found 1028cc4c7c73SDaniel P. Berrangégnutls_crypto = not_found 1029abc14fd0SAlyssa Rossif get_option('gnutls').enabled() or (get_option('gnutls').auto() and have_system) 1030cc4c7c73SDaniel P. Berrangé # For general TLS support our min gnutls matches 1031cc4c7c73SDaniel P. Berrangé # that implied by our platform support matrix 1032cc4c7c73SDaniel P. Berrangé # 1033cc4c7c73SDaniel P. Berrangé # For the crypto backends, we look for a newer 1034cc4c7c73SDaniel P. Berrangé # gnutls: 1035cc4c7c73SDaniel P. Berrangé # 1036cc4c7c73SDaniel P. Berrangé # Version 3.6.8 is needed to get XTS 1037cc4c7c73SDaniel P. Berrangé # Version 3.6.13 is needed to get PBKDF 1038cc4c7c73SDaniel P. Berrangé # Version 3.6.14 is needed to get HW accelerated XTS 1039cc4c7c73SDaniel P. Berrangé # 1040cc4c7c73SDaniel P. Berrangé # If newer enough gnutls isn't available, we can 1041cc4c7c73SDaniel P. Berrangé # still use a different crypto backend to satisfy 1042cc4c7c73SDaniel P. Berrangé # the platform support requirements 1043cc4c7c73SDaniel P. Berrangé gnutls_crypto = dependency('gnutls', version: '>=3.6.14', 1044cc4c7c73SDaniel P. Berrangé method: 'pkg-config', 1045cc4c7c73SDaniel P. Berrangé required: false, 1046cc4c7c73SDaniel P. Berrangé kwargs: static_kwargs) 1047cc4c7c73SDaniel P. Berrangé if gnutls_crypto.found() 1048cc4c7c73SDaniel P. Berrangé gnutls = gnutls_crypto 1049cc4c7c73SDaniel P. Berrangé else 1050cc4c7c73SDaniel P. Berrangé # Our min version if all we need is TLS 105157612511SPaolo Bonzini gnutls = dependency('gnutls', version: '>=3.5.18', 105257612511SPaolo Bonzini method: 'pkg-config', 105357612511SPaolo Bonzini required: get_option('gnutls'), 105457612511SPaolo Bonzini kwargs: static_kwargs) 105557612511SPaolo Bonzini endif 1056cc4c7c73SDaniel P. Berrangéendif 105757612511SPaolo Bonzini 10588bd0931fSDaniel P. Berrangé# We prefer use of gnutls for crypto, unless the options 10598bd0931fSDaniel P. Berrangé# explicitly asked for nettle or gcrypt. 10608bd0931fSDaniel P. Berrangé# 10618bd0931fSDaniel P. Berrangé# If gnutls isn't available for crypto, then we'll prefer 10628bd0931fSDaniel P. Berrangé# gcrypt over nettle for performance reasons. 106357612511SPaolo Bonzinigcrypt = not_found 106457612511SPaolo Bonzininettle = not_found 106568014044SDaniel P. Berrangéxts = 'none' 10668bd0931fSDaniel P. Berrangé 106757612511SPaolo Bonziniif get_option('nettle').enabled() and get_option('gcrypt').enabled() 106857612511SPaolo Bonzini error('Only one of gcrypt & nettle can be enabled') 106957612511SPaolo Bonziniendif 10708bd0931fSDaniel P. Berrangé 10718bd0931fSDaniel P. Berrangé# Explicit nettle/gcrypt request, so ignore gnutls for crypto 10728bd0931fSDaniel P. Berrangéif get_option('nettle').enabled() or get_option('gcrypt').enabled() 10738bd0931fSDaniel P. Berrangé gnutls_crypto = not_found 107457612511SPaolo Bonziniendif 10758bd0931fSDaniel P. Berrangé 10768bd0931fSDaniel P. Berrangéif not gnutls_crypto.found() 10778bd0931fSDaniel P. Berrangé if (not get_option('gcrypt').auto() or have_system) and not get_option('nettle').enabled() 10781741093bSDaniel P. Berrangé gcrypt = dependency('libgcrypt', version: '>=1.8', 107957612511SPaolo Bonzini method: 'config-tool', 108057612511SPaolo Bonzini required: get_option('gcrypt'), 108157612511SPaolo Bonzini kwargs: static_kwargs) 108257612511SPaolo Bonzini # Debian has removed -lgpg-error from libgcrypt-config 108357612511SPaolo Bonzini # as it "spreads unnecessary dependencies" which in 108457612511SPaolo Bonzini # turn breaks static builds... 108557612511SPaolo Bonzini if gcrypt.found() and enable_static 108657612511SPaolo Bonzini gcrypt = declare_dependency(dependencies: [ 108757612511SPaolo Bonzini gcrypt, 108857612511SPaolo Bonzini cc.find_library('gpg-error', required: true, kwargs: static_kwargs)]) 108957612511SPaolo Bonzini endif 109057612511SPaolo Bonzini endif 1091260a13d4SDaniel P. Berrangé if (not get_option('nettle').auto() or have_system) and not gcrypt.found() 1092260a13d4SDaniel P. Berrangé nettle = dependency('nettle', version: '>=3.4', 1093260a13d4SDaniel P. Berrangé method: 'pkg-config', 1094260a13d4SDaniel P. Berrangé required: get_option('nettle'), 1095260a13d4SDaniel P. Berrangé kwargs: static_kwargs) 1096260a13d4SDaniel P. Berrangé if nettle.found() and not cc.has_header('nettle/xts.h', dependencies: nettle) 1097260a13d4SDaniel P. Berrangé xts = 'private' 1098260a13d4SDaniel P. Berrangé endif 1099260a13d4SDaniel P. Berrangé endif 1100cc4c7c73SDaniel P. Berrangéendif 110157612511SPaolo Bonzini 11022b1ccdf4SMarc-André Lureaugtk = not_found 11031b695471SPaolo Bonzinigtkx11 = not_found 1104c23d7b4eSPaolo Bonzinivte = not_found 1105c1ec4941SPaolo Bonziniif not get_option('gtk').auto() or (have_system and not cocoa.found()) 11061b695471SPaolo Bonzini gtk = dependency('gtk+-3.0', version: '>=3.22.0', 11071b695471SPaolo Bonzini method: 'pkg-config', 11081b695471SPaolo Bonzini required: get_option('gtk'), 1109d7dedf42SPaolo Bonzini kwargs: static_kwargs) 11101b695471SPaolo Bonzini if gtk.found() 11111b695471SPaolo Bonzini gtkx11 = dependency('gtk+-x11-3.0', version: '>=3.22.0', 11121b695471SPaolo Bonzini method: 'pkg-config', 11131b695471SPaolo Bonzini required: false, 1114d7dedf42SPaolo Bonzini kwargs: static_kwargs) 11151b695471SPaolo Bonzini gtk = declare_dependency(dependencies: [gtk, gtkx11]) 1116c23d7b4eSPaolo Bonzini 1117c23d7b4eSPaolo Bonzini if not get_option('vte').auto() or have_system 1118c23d7b4eSPaolo Bonzini vte = dependency('vte-2.91', 1119c23d7b4eSPaolo Bonzini method: 'pkg-config', 1120c23d7b4eSPaolo Bonzini required: get_option('vte'), 1121c23d7b4eSPaolo Bonzini kwargs: static_kwargs) 1122c23d7b4eSPaolo Bonzini endif 11232b1ccdf4SMarc-André Lureau endif 11241b695471SPaolo Bonziniendif 11251b695471SPaolo Bonzini 11262b1ccdf4SMarc-André Lureaux11 = not_found 11279d49bcf6SMarkus Armbrusterif gtkx11.found() 11281b695471SPaolo Bonzini x11 = dependency('x11', method: 'pkg-config', required: gtkx11.found(), 1129d7dedf42SPaolo Bonzini kwargs: static_kwargs) 11302b1ccdf4SMarc-André Lureauendif 11312b1ccdf4SMarc-André Lureaupng = not_found 113295f8510eSKshitij Suriif get_option('png').allowed() and have_system 113395f8510eSKshitij Suri png = dependency('libpng', required: get_option('png'), 113495f8510eSKshitij Suri method: 'pkg-config', kwargs: static_kwargs) 113595f8510eSKshitij Suriendif 113695f8510eSKshitij Surivnc = not_found 11372b1ccdf4SMarc-André Lureaujpeg = not_found 11382b1ccdf4SMarc-André Lureausasl = not_found 113943a363aeSPaolo Bonziniif get_option('vnc').allowed() and have_system 1140a0b93237SPaolo Bonzini vnc = declare_dependency() # dummy dependency 11418e242b3cSPaolo Bonzini jpeg = dependency('libjpeg', required: get_option('vnc_jpeg'), 1142d7dedf42SPaolo Bonzini method: 'pkg-config', kwargs: static_kwargs) 1143a0b93237SPaolo Bonzini sasl = cc.find_library('sasl2', has_headers: ['sasl/sasl.h'], 1144a0b93237SPaolo Bonzini required: get_option('vnc_sasl'), 1145d7dedf42SPaolo Bonzini kwargs: static_kwargs) 1146a0b93237SPaolo Bonzini if sasl.found() 1147a0b93237SPaolo Bonzini sasl = declare_dependency(dependencies: sasl, 1148a0b93237SPaolo Bonzini compile_args: '-DSTRUCT_IOVEC_DEFINED') 1149a0b93237SPaolo Bonzini endif 11502b1ccdf4SMarc-André Lureauendif 1151241611eaSPaolo Bonzini 115205e391aeSPaolo Bonzinipam = not_found 115305e391aeSPaolo Bonziniif not get_option('auth_pam').auto() or have_system 115405e391aeSPaolo Bonzini pam = cc.find_library('pam', has_headers: ['security/pam_appl.h'], 115505e391aeSPaolo Bonzini required: get_option('auth_pam'), 115605e391aeSPaolo Bonzini kwargs: static_kwargs) 115705e391aeSPaolo Bonziniendif 115805e391aeSPaolo Bonziniif pam.found() and not cc.links(''' 115905e391aeSPaolo Bonzini #include <stddef.h> 116005e391aeSPaolo Bonzini #include <security/pam_appl.h> 116105e391aeSPaolo Bonzini int main(void) { 116205e391aeSPaolo Bonzini const char *service_name = "qemu"; 116305e391aeSPaolo Bonzini const char *user = "frank"; 116405e391aeSPaolo Bonzini const struct pam_conv pam_conv = { 0 }; 116505e391aeSPaolo Bonzini pam_handle_t *pamh = NULL; 116605e391aeSPaolo Bonzini pam_start(service_name, user, &pam_conv, &pamh); 116705e391aeSPaolo Bonzini return 0; 116805e391aeSPaolo Bonzini }''', dependencies: pam) 116905e391aeSPaolo Bonzini pam = not_found 117005e391aeSPaolo Bonzini if get_option('auth_pam').enabled() 117105e391aeSPaolo Bonzini error('could not link libpam') 117205e391aeSPaolo Bonzini else 117305e391aeSPaolo Bonzini warning('could not link libpam, disabling') 117405e391aeSPaolo Bonzini endif 117505e391aeSPaolo Bonziniendif 117605e391aeSPaolo Bonzini 1177708eab42SMarc-André Lureausnappy = not_found 1178241611eaSPaolo Bonziniif not get_option('snappy').auto() or have_system 1179241611eaSPaolo Bonzini snappy = cc.find_library('snappy', has_headers: ['snappy-c.h'], 1180241611eaSPaolo Bonzini required: get_option('snappy'), 1181d7dedf42SPaolo Bonzini kwargs: static_kwargs) 1182708eab42SMarc-André Lureauendif 1183565174d0SPaolo Bonziniif snappy.found() and not linker.links(''' 1184241611eaSPaolo Bonzini #include <snappy-c.h> 1185241611eaSPaolo Bonzini int main(void) { snappy_max_compressed_length(4096); return 0; }''', dependencies: snappy) 1186241611eaSPaolo Bonzini snappy = not_found 1187241611eaSPaolo Bonzini if get_option('snappy').enabled() 1188241611eaSPaolo Bonzini error('could not link libsnappy') 1189241611eaSPaolo Bonzini else 1190241611eaSPaolo Bonzini warning('could not link libsnappy, disabling') 1191241611eaSPaolo Bonzini endif 1192708eab42SMarc-André Lureauendif 11930c32a0aeSPaolo Bonzini 1194708eab42SMarc-André Lureaulzo = not_found 11950c32a0aeSPaolo Bonziniif not get_option('lzo').auto() or have_system 11960c32a0aeSPaolo Bonzini lzo = cc.find_library('lzo2', has_headers: ['lzo/lzo1x.h'], 11970c32a0aeSPaolo Bonzini required: get_option('lzo'), 1198d7dedf42SPaolo Bonzini kwargs: static_kwargs) 1199708eab42SMarc-André Lureauendif 12000c32a0aeSPaolo Bonziniif lzo.found() and not cc.links(''' 12010c32a0aeSPaolo Bonzini #include <lzo/lzo1x.h> 12020c32a0aeSPaolo Bonzini int main(void) { lzo_version(); return 0; }''', dependencies: lzo) 12030c32a0aeSPaolo Bonzini lzo = not_found 12040c32a0aeSPaolo Bonzini if get_option('lzo').enabled() 12050c32a0aeSPaolo Bonzini error('could not link liblzo2') 12060c32a0aeSPaolo Bonzini else 12070c32a0aeSPaolo Bonzini warning('could not link liblzo2, disabling') 12080c32a0aeSPaolo Bonzini endif 12090c32a0aeSPaolo Bonziniendif 12100c32a0aeSPaolo Bonzini 1211488a8c73SPaolo Bonzininuma = not_found 1212488a8c73SPaolo Bonziniif not get_option('numa').auto() or have_system or have_tools 1213488a8c73SPaolo Bonzini numa = cc.find_library('numa', has_headers: ['numa.h'], 1214488a8c73SPaolo Bonzini required: get_option('numa'), 1215488a8c73SPaolo Bonzini kwargs: static_kwargs) 1216488a8c73SPaolo Bonziniendif 1217488a8c73SPaolo Bonziniif numa.found() and not cc.links(''' 1218488a8c73SPaolo Bonzini #include <numa.h> 1219488a8c73SPaolo Bonzini int main(void) { return numa_available(); } 1220488a8c73SPaolo Bonzini ''', dependencies: numa) 1221488a8c73SPaolo Bonzini numa = not_found 1222488a8c73SPaolo Bonzini if get_option('numa').enabled() 1223488a8c73SPaolo Bonzini error('could not link numa') 1224488a8c73SPaolo Bonzini else 1225488a8c73SPaolo Bonzini warning('could not link numa, disabling') 1226488a8c73SPaolo Bonzini endif 1227488a8c73SPaolo Bonziniendif 1228488a8c73SPaolo Bonzini 122955166230SMarc-André Lureaurdma = not_found 12303730a734SPaolo Bonziniif not get_option('rdma').auto() or have_system 12313730a734SPaolo Bonzini libumad = cc.find_library('ibumad', required: get_option('rdma')) 12323730a734SPaolo Bonzini rdma_libs = [cc.find_library('rdmacm', has_headers: ['rdma/rdma_cma.h'], 12333730a734SPaolo Bonzini required: get_option('rdma'), 12343730a734SPaolo Bonzini kwargs: static_kwargs), 12353730a734SPaolo Bonzini cc.find_library('ibverbs', required: get_option('rdma'), 12363730a734SPaolo Bonzini kwargs: static_kwargs), 12373730a734SPaolo Bonzini libumad] 12383730a734SPaolo Bonzini rdma = declare_dependency(dependencies: rdma_libs) 12393730a734SPaolo Bonzini foreach lib: rdma_libs 12403730a734SPaolo Bonzini if not lib.found() 12413730a734SPaolo Bonzini rdma = not_found 124255166230SMarc-André Lureau endif 12433730a734SPaolo Bonzini endforeach 12443730a734SPaolo Bonziniendif 12453730a734SPaolo Bonzini 1246582ea95fSMarc-André Lureauxen = not_found 1247*14efd8d3SPaolo Bonziniif get_option('xen').enabled() or (get_option('xen').auto() and have_system) 1248*14efd8d3SPaolo Bonzini xencontrol = dependency('xencontrol', required: false, 1249*14efd8d3SPaolo Bonzini method: 'pkg-config', kwargs: static_kwargs) 1250*14efd8d3SPaolo Bonzini if xencontrol.found() 1251*14efd8d3SPaolo Bonzini xen_pc = declare_dependency(version: xencontrol.version(), 1252*14efd8d3SPaolo Bonzini dependencies: [ 1253*14efd8d3SPaolo Bonzini xencontrol, 1254*14efd8d3SPaolo Bonzini # disabler: true makes xen_pc.found() return false if any is not found 1255*14efd8d3SPaolo Bonzini dependency('xenstore', required: false, 1256*14efd8d3SPaolo Bonzini method: 'pkg-config', kwargs: static_kwargs, 1257*14efd8d3SPaolo Bonzini disabler: true), 1258*14efd8d3SPaolo Bonzini dependency('xenforeignmemory', required: false, 1259*14efd8d3SPaolo Bonzini method: 'pkg-config', kwargs: static_kwargs, 1260*14efd8d3SPaolo Bonzini disabler: true), 1261*14efd8d3SPaolo Bonzini dependency('xengnttab', required: false, 1262*14efd8d3SPaolo Bonzini method: 'pkg-config', kwargs: static_kwargs, 1263*14efd8d3SPaolo Bonzini disabler: true), 1264*14efd8d3SPaolo Bonzini dependency('xenevtchn', required: false, 1265*14efd8d3SPaolo Bonzini method: 'pkg-config', kwargs: static_kwargs, 1266*14efd8d3SPaolo Bonzini disabler: true), 1267*14efd8d3SPaolo Bonzini dependency('xendevicemodel', required: false, 1268*14efd8d3SPaolo Bonzini method: 'pkg-config', kwargs: static_kwargs, 1269*14efd8d3SPaolo Bonzini disabler: true), 1270*14efd8d3SPaolo Bonzini # optional, no "disabler: true" 1271*14efd8d3SPaolo Bonzini dependency('xentoolcore', required: false, 1272*14efd8d3SPaolo Bonzini method: 'pkg-config', kwargs: static_kwargs)]) 1273*14efd8d3SPaolo Bonzini if xen_pc.found() 1274*14efd8d3SPaolo Bonzini xen = xen_pc 1275582ea95fSMarc-André Lureau endif 1276*14efd8d3SPaolo Bonzini endif 1277*14efd8d3SPaolo Bonzini if not xen.found() 1278*14efd8d3SPaolo 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' ] 1279*14efd8d3SPaolo Bonzini xen_libs = { 1280*14efd8d3SPaolo Bonzini '4.11.0': [ 'xenstore', 'xenctrl', 'xendevicemodel', 'xenforeignmemory', 'xengnttab', 'xenevtchn', 'xentoolcore' ], 1281*14efd8d3SPaolo Bonzini '4.10.0': [ 'xenstore', 'xenctrl', 'xendevicemodel', 'xenforeignmemory', 'xengnttab', 'xenevtchn', 'xentoolcore' ], 1282*14efd8d3SPaolo Bonzini '4.9.0': [ 'xenstore', 'xenctrl', 'xendevicemodel', 'xenforeignmemory', 'xengnttab', 'xenevtchn' ], 1283*14efd8d3SPaolo Bonzini '4.8.0': [ 'xenstore', 'xenctrl', 'xenforeignmemory', 'xengnttab', 'xenevtchn' ], 1284*14efd8d3SPaolo Bonzini '4.7.1': [ 'xenstore', 'xenctrl', 'xenforeignmemory', 'xengnttab', 'xenevtchn' ], 1285*14efd8d3SPaolo Bonzini '4.6.0': [ 'xenstore', 'xenctrl' ], 1286*14efd8d3SPaolo Bonzini '4.5.0': [ 'xenstore', 'xenctrl' ], 1287*14efd8d3SPaolo Bonzini '4.2.0': [ 'xenstore', 'xenctrl' ], 1288*14efd8d3SPaolo Bonzini } 1289*14efd8d3SPaolo Bonzini xen_deps = {} 1290*14efd8d3SPaolo Bonzini foreach ver: xen_tests 1291*14efd8d3SPaolo Bonzini # cache the various library tests to avoid polluting the logs 1292*14efd8d3SPaolo Bonzini xen_test_deps = [] 1293*14efd8d3SPaolo Bonzini foreach l: xen_libs[ver] 1294*14efd8d3SPaolo Bonzini if l not in xen_deps 1295*14efd8d3SPaolo Bonzini xen_deps += { l: cc.find_library(l, required: false) } 1296*14efd8d3SPaolo Bonzini endif 1297*14efd8d3SPaolo Bonzini xen_test_deps += xen_deps[l] 1298*14efd8d3SPaolo Bonzini endforeach 1299*14efd8d3SPaolo Bonzini 1300*14efd8d3SPaolo Bonzini # Use -D to pick just one of the test programs in scripts/xen-detect.c 1301*14efd8d3SPaolo Bonzini xen_version = ver.split('.') 1302*14efd8d3SPaolo Bonzini xen_ctrl_version = xen_version[0] + \ 1303*14efd8d3SPaolo Bonzini ('0' + xen_version[1]).substring(-2) + \ 1304*14efd8d3SPaolo Bonzini ('0' + xen_version[2]).substring(-2) 1305*14efd8d3SPaolo Bonzini if cc.links(files('scripts/xen-detect.c'), 1306*14efd8d3SPaolo Bonzini args: '-DCONFIG_XEN_CTRL_INTERFACE_VERSION=' + xen_ctrl_version, 1307*14efd8d3SPaolo Bonzini dependencies: xen_test_deps) 1308*14efd8d3SPaolo Bonzini xen = declare_dependency(version: ver, dependencies: xen_test_deps) 1309*14efd8d3SPaolo Bonzini break 1310*14efd8d3SPaolo Bonzini endif 1311*14efd8d3SPaolo Bonzini endforeach 1312*14efd8d3SPaolo Bonzini endif 1313*14efd8d3SPaolo Bonzini if xen.found() 1314*14efd8d3SPaolo Bonzini accelerators += 'CONFIG_XEN' 1315*14efd8d3SPaolo Bonzini elif get_option('xen').enabled() 1316*14efd8d3SPaolo Bonzini error('could not compile and link Xen test program') 1317*14efd8d3SPaolo Bonzini endif 1318*14efd8d3SPaolo Bonziniendif 1319*14efd8d3SPaolo Bonzinihave_xen_pci_passthrough = get_option('xen_pci_passthrough') \ 1320*14efd8d3SPaolo Bonzini .require(xen.found(), 1321*14efd8d3SPaolo Bonzini error_message: 'Xen PCI passthrough requested but Xen not enabled') \ 1322*14efd8d3SPaolo Bonzini .require(targetos == 'linux', 1323*14efd8d3SPaolo Bonzini error_message: 'Xen PCI passthrough not available on this platform') \ 1324*14efd8d3SPaolo Bonzini .allowed() 1325*14efd8d3SPaolo Bonzini 1326*14efd8d3SPaolo Bonzini 132706677ce1SPaolo Bonzinicacard = not_found 13285f364c57SPaolo Bonziniif not get_option('smartcard').auto() or have_system 13295f364c57SPaolo Bonzini cacard = dependency('libcacard', required: get_option('smartcard'), 13305f364c57SPaolo Bonzini version: '>=2.5.1', method: 'pkg-config', 13315f364c57SPaolo Bonzini kwargs: static_kwargs) 133206677ce1SPaolo Bonziniendif 13330a40bcb7SCésar Belleyu2f = not_found 13340a40bcb7SCésar Belleyif have_system 13350a40bcb7SCésar Belley u2f = dependency('u2f-emu', required: get_option('u2f'), 13360a40bcb7SCésar Belley method: 'pkg-config', 1337d7dedf42SPaolo Bonzini kwargs: static_kwargs) 13380a40bcb7SCésar Belleyendif 133906677ce1SPaolo Bonziniusbredir = not_found 134018f31e60SPaolo Bonziniif not get_option('usb_redir').auto() or have_system 134118f31e60SPaolo Bonzini usbredir = dependency('libusbredirparser-0.5', required: get_option('usb_redir'), 134218f31e60SPaolo Bonzini version: '>=0.6', method: 'pkg-config', 134318f31e60SPaolo Bonzini kwargs: static_kwargs) 134406677ce1SPaolo Bonziniendif 134506677ce1SPaolo Bonzinilibusb = not_found 134690540f32SPaolo Bonziniif not get_option('libusb').auto() or have_system 134790540f32SPaolo Bonzini libusb = dependency('libusb-1.0', required: get_option('libusb'), 134890540f32SPaolo Bonzini version: '>=1.0.13', method: 'pkg-config', 134990540f32SPaolo Bonzini kwargs: static_kwargs) 135006677ce1SPaolo Bonziniendif 135190540f32SPaolo Bonzini 1352c9322ab5SMarc-André Lureaulibpmem = not_found 1353e36e8c70SPaolo Bonziniif not get_option('libpmem').auto() or have_system 1354e36e8c70SPaolo Bonzini libpmem = dependency('libpmem', required: get_option('libpmem'), 1355e36e8c70SPaolo Bonzini method: 'pkg-config', kwargs: static_kwargs) 1356c9322ab5SMarc-André Lureauendif 1357c7c91a74SBruce Rogerslibdaxctl = not_found 135883ef1682SPaolo Bonziniif not get_option('libdaxctl').auto() or have_system 135983ef1682SPaolo Bonzini libdaxctl = dependency('libdaxctl', required: get_option('libdaxctl'), 136083ef1682SPaolo Bonzini version: '>=57', method: 'pkg-config', 136183ef1682SPaolo Bonzini kwargs: static_kwargs) 1362c7c91a74SBruce Rogersendif 13638ce0a45fSMarc-André Lureautasn1 = not_found 1364ba7ed407SPaolo Bonziniif gnutls.found() 1365ba7ed407SPaolo Bonzini tasn1 = dependency('libtasn1', 1366ba7ed407SPaolo Bonzini method: 'pkg-config', 1367ba7ed407SPaolo Bonzini kwargs: static_kwargs) 13688ce0a45fSMarc-André Lureauendif 1369af04e89dSMarc-André Lureaukeyutils = dependency('libkeyutils', required: false, 1370d7dedf42SPaolo Bonzini method: 'pkg-config', kwargs: static_kwargs) 1371a81df1b6SPaolo Bonzini 13723909def8SMarc-André Lureauhas_gettid = cc.has_function('gettid') 13733909def8SMarc-André Lureau 13743d212b41SRichard W.M. Jones# libselinux 13753d212b41SRichard W.M. Jonesselinux = dependency('libselinux', 13763d212b41SRichard W.M. Jones required: get_option('selinux'), 13773d212b41SRichard W.M. Jones method: 'pkg-config', kwargs: static_kwargs) 13783d212b41SRichard W.M. Jones 1379aa087962SPaolo Bonzini# Malloc tests 1380aa087962SPaolo Bonzini 1381aa087962SPaolo Bonzinimalloc = [] 1382aa087962SPaolo Bonziniif get_option('malloc') == 'system' 1383aa087962SPaolo Bonzini has_malloc_trim = \ 138443a363aeSPaolo Bonzini get_option('malloc_trim').allowed() and \ 1385aa087962SPaolo Bonzini cc.links('''#include <malloc.h> 1386aa087962SPaolo Bonzini int main(void) { malloc_trim(0); return 0; }''') 1387aa087962SPaolo Bonzinielse 1388aa087962SPaolo Bonzini has_malloc_trim = false 1389aa087962SPaolo Bonzini malloc = cc.find_library(get_option('malloc'), required: true) 1390aa087962SPaolo Bonziniendif 1391aa087962SPaolo Bonziniif not has_malloc_trim and get_option('malloc_trim').enabled() 1392aa087962SPaolo Bonzini if get_option('malloc') == 'system' 1393aa087962SPaolo Bonzini error('malloc_trim not available on this platform.') 1394aa087962SPaolo Bonzini else 1395aa087962SPaolo Bonzini error('malloc_trim not available with non-libc memory allocator') 1396aa087962SPaolo Bonzini endif 1397aa087962SPaolo Bonziniendif 1398aa087962SPaolo Bonzini 139984e319a5SMax Reitz# Check whether the glibc provides statx() 140084e319a5SMax Reitz 1401e66420acSPaolo Bonzinignu_source_prefix = ''' 140284e319a5SMax Reitz #ifndef _GNU_SOURCE 140384e319a5SMax Reitz #define _GNU_SOURCE 140484e319a5SMax Reitz #endif 1405e66420acSPaolo Bonzini''' 1406e66420acSPaolo Bonzinistatx_test = gnu_source_prefix + ''' 140784e319a5SMax Reitz #include <sys/stat.h> 140884e319a5SMax Reitz int main(void) { 140984e319a5SMax Reitz struct statx statxbuf; 141084e319a5SMax Reitz statx(0, "", 0, STATX_BASIC_STATS, &statxbuf); 141184e319a5SMax Reitz return 0; 141284e319a5SMax Reitz }''' 141384e319a5SMax Reitz 141484e319a5SMax Reitzhas_statx = cc.links(statx_test) 141584e319a5SMax Reitz 14164ce7a08dSHanna Reitz# Check whether statx() provides mount ID information 14174ce7a08dSHanna Reitz 14184ce7a08dSHanna Reitzstatx_mnt_id_test = gnu_source_prefix + ''' 14194ce7a08dSHanna Reitz #include <sys/stat.h> 14204ce7a08dSHanna Reitz int main(void) { 14214ce7a08dSHanna Reitz struct statx statxbuf; 14224ce7a08dSHanna Reitz statx(0, "", 0, STATX_BASIC_STATS | STATX_MNT_ID, &statxbuf); 14234ce7a08dSHanna Reitz return statxbuf.stx_mnt_id; 14244ce7a08dSHanna Reitz }''' 14254ce7a08dSHanna Reitz 14264ce7a08dSHanna Reitzhas_statx_mnt_id = cc.links(statx_mnt_id_test) 14274ce7a08dSHanna Reitz 1428a436d6d4SPaolo Bonzinihave_vhost_user_blk_server = get_option('vhost_user_blk_server') \ 1429a436d6d4SPaolo Bonzini .require(targetos == 'linux', 1430a436d6d4SPaolo Bonzini error_message: 'vhost_user_blk_server requires linux') \ 1431a436d6d4SPaolo Bonzini .require('CONFIG_VHOST_USER' in config_host, 1432a436d6d4SPaolo Bonzini error_message: 'vhost_user_blk_server requires vhost-user support') \ 1433a436d6d4SPaolo Bonzini .disable_auto_if(not have_system) \ 1434a436d6d4SPaolo Bonzini .allowed() 14359e62ba48SDaniele Buono 1436df4ea709SMax Reitzif get_option('fuse').disabled() and get_option('fuse_lseek').enabled() 1437df4ea709SMax Reitz error('Cannot enable fuse-lseek while fuse is disabled') 1438df4ea709SMax Reitzendif 1439df4ea709SMax Reitz 1440a484a719SMax Reitzfuse = dependency('fuse3', required: get_option('fuse'), 1441a484a719SMax Reitz version: '>=3.1', method: 'pkg-config', 1442d7dedf42SPaolo Bonzini kwargs: static_kwargs) 1443a484a719SMax Reitz 1444df4ea709SMax Reitzfuse_lseek = not_found 144543a363aeSPaolo Bonziniif get_option('fuse_lseek').allowed() 1446df4ea709SMax Reitz if fuse.version().version_compare('>=3.8') 1447df4ea709SMax Reitz # Dummy dependency 1448df4ea709SMax Reitz fuse_lseek = declare_dependency() 1449df4ea709SMax Reitz elif get_option('fuse_lseek').enabled() 1450df4ea709SMax Reitz if fuse.found() 1451df4ea709SMax Reitz error('fuse-lseek requires libfuse >=3.8, found ' + fuse.version()) 1452df4ea709SMax Reitz else 1453df4ea709SMax Reitz error('fuse-lseek requires libfuse, which was not found') 1454df4ea709SMax Reitz endif 1455df4ea709SMax Reitz endif 1456df4ea709SMax Reitzendif 1457df4ea709SMax Reitz 145846627f41SAndrew Melnychenko# libbpf 145946627f41SAndrew Melnychenkolibbpf = dependency('libbpf', required: get_option('bpf'), method: 'pkg-config') 146046627f41SAndrew Melnychenkoif libbpf.found() and not cc.links(''' 146146627f41SAndrew Melnychenko #include <bpf/libbpf.h> 146246627f41SAndrew Melnychenko int main(void) 146346627f41SAndrew Melnychenko { 146446627f41SAndrew Melnychenko bpf_object__destroy_skeleton(NULL); 146546627f41SAndrew Melnychenko return 0; 146646627f41SAndrew Melnychenko }''', dependencies: libbpf) 146746627f41SAndrew Melnychenko libbpf = not_found 146846627f41SAndrew Melnychenko if get_option('bpf').enabled() 146946627f41SAndrew Melnychenko error('libbpf skeleton test failed') 147046627f41SAndrew Melnychenko else 147146627f41SAndrew Melnychenko warning('libbpf skeleton test failed, disabling') 147246627f41SAndrew Melnychenko endif 147346627f41SAndrew Melnychenkoendif 147446627f41SAndrew Melnychenko 147587430d5bSPaolo Bonzini################# 147687430d5bSPaolo Bonzini# config-host.h # 147787430d5bSPaolo Bonzini################# 147887430d5bSPaolo Bonzini 147987430d5bSPaolo Bonziniaudio_drivers_selected = [] 148087430d5bSPaolo Bonziniif have_system 148187430d5bSPaolo Bonzini audio_drivers_available = { 148287430d5bSPaolo Bonzini 'alsa': alsa.found(), 148387430d5bSPaolo Bonzini 'coreaudio': coreaudio.found(), 148487430d5bSPaolo Bonzini 'dsound': dsound.found(), 148587430d5bSPaolo Bonzini 'jack': jack.found(), 148687430d5bSPaolo Bonzini 'oss': oss.found(), 148787430d5bSPaolo Bonzini 'pa': pulse.found(), 148887430d5bSPaolo Bonzini 'sdl': sdl.found(), 148987430d5bSPaolo Bonzini } 1490e5424a29SPaolo Bonzini foreach k, v: audio_drivers_available 1491e5424a29SPaolo Bonzini config_host_data.set('CONFIG_AUDIO_' + k.to_upper(), v) 1492e5424a29SPaolo Bonzini endforeach 149387430d5bSPaolo Bonzini 149487430d5bSPaolo Bonzini # Default to native drivers first, OSS second, SDL third 149587430d5bSPaolo Bonzini audio_drivers_priority = \ 149687430d5bSPaolo Bonzini [ 'pa', 'coreaudio', 'dsound', 'oss' ] + \ 149787430d5bSPaolo Bonzini (targetos == 'linux' ? [] : [ 'sdl' ]) 149887430d5bSPaolo Bonzini audio_drivers_default = [] 149987430d5bSPaolo Bonzini foreach k: audio_drivers_priority 150087430d5bSPaolo Bonzini if audio_drivers_available[k] 150187430d5bSPaolo Bonzini audio_drivers_default += k 150287430d5bSPaolo Bonzini endif 150387430d5bSPaolo Bonzini endforeach 150487430d5bSPaolo Bonzini 150587430d5bSPaolo Bonzini foreach k: get_option('audio_drv_list') 150687430d5bSPaolo Bonzini if k == 'default' 150787430d5bSPaolo Bonzini audio_drivers_selected += audio_drivers_default 150887430d5bSPaolo Bonzini elif not audio_drivers_available[k] 150987430d5bSPaolo Bonzini error('Audio driver "@0@" not available.'.format(k)) 151087430d5bSPaolo Bonzini else 151187430d5bSPaolo Bonzini audio_drivers_selected += k 151287430d5bSPaolo Bonzini endif 151387430d5bSPaolo Bonzini endforeach 151487430d5bSPaolo Bonziniendif 151587430d5bSPaolo Bonziniconfig_host_data.set('CONFIG_AUDIO_DRIVERS', 151687430d5bSPaolo Bonzini '"' + '", "'.join(audio_drivers_selected) + '", ') 151787430d5bSPaolo Bonzini 15189e62ba48SDaniele Buonoif get_option('cfi') 15199e62ba48SDaniele Buono cfi_flags=[] 15209e62ba48SDaniele Buono # Check for dependency on LTO 15219e62ba48SDaniele Buono if not get_option('b_lto') 15229e62ba48SDaniele Buono error('Selected Control-Flow Integrity but LTO is disabled') 15239e62ba48SDaniele Buono endif 15249e62ba48SDaniele Buono if config_host.has_key('CONFIG_MODULES') 15259e62ba48SDaniele Buono error('Selected Control-Flow Integrity is not compatible with modules') 15269e62ba48SDaniele Buono endif 15279e62ba48SDaniele Buono # Check for cfi flags. CFI requires LTO so we can't use 15289e62ba48SDaniele Buono # get_supported_arguments, but need a more complex "compiles" which allows 15299e62ba48SDaniele Buono # custom arguments 15309e62ba48SDaniele Buono if cc.compiles('int main () { return 0; }', name: '-fsanitize=cfi-icall', 15319e62ba48SDaniele Buono args: ['-flto', '-fsanitize=cfi-icall'] ) 15329e62ba48SDaniele Buono cfi_flags += '-fsanitize=cfi-icall' 15339e62ba48SDaniele Buono else 15349e62ba48SDaniele Buono error('-fsanitize=cfi-icall is not supported by the compiler') 15359e62ba48SDaniele Buono endif 15369e62ba48SDaniele Buono if cc.compiles('int main () { return 0; }', 15379e62ba48SDaniele Buono name: '-fsanitize-cfi-icall-generalize-pointers', 15389e62ba48SDaniele Buono args: ['-flto', '-fsanitize=cfi-icall', 15399e62ba48SDaniele Buono '-fsanitize-cfi-icall-generalize-pointers'] ) 15409e62ba48SDaniele Buono cfi_flags += '-fsanitize-cfi-icall-generalize-pointers' 15419e62ba48SDaniele Buono else 15429e62ba48SDaniele Buono error('-fsanitize-cfi-icall-generalize-pointers is not supported by the compiler') 15439e62ba48SDaniele Buono endif 15449e62ba48SDaniele Buono if get_option('cfi_debug') 15459e62ba48SDaniele Buono if cc.compiles('int main () { return 0; }', 15469e62ba48SDaniele Buono name: '-fno-sanitize-trap=cfi-icall', 15479e62ba48SDaniele Buono args: ['-flto', '-fsanitize=cfi-icall', 15489e62ba48SDaniele Buono '-fno-sanitize-trap=cfi-icall'] ) 15499e62ba48SDaniele Buono cfi_flags += '-fno-sanitize-trap=cfi-icall' 15509e62ba48SDaniele Buono else 15519e62ba48SDaniele Buono error('-fno-sanitize-trap=cfi-icall is not supported by the compiler') 15529e62ba48SDaniele Buono endif 15539e62ba48SDaniele Buono endif 15545fc0617fSMarc-André Lureau add_global_arguments(cfi_flags, native: false, language: ['c', 'cpp', 'objc']) 15555fc0617fSMarc-André Lureau add_global_link_arguments(cfi_flags, native: false, language: ['c', 'cpp', 'objc']) 15569e62ba48SDaniele Buonoendif 15579e62ba48SDaniele Buono 155814176c8dSJoelle van Dynehave_host_block_device = (targetos != 'darwin' or 155914176c8dSJoelle van Dyne cc.has_header('IOKit/storage/IOMedia.h')) 156014176c8dSJoelle van Dyne 1561142ca628SMarc-André Lureau# FIXME enable_modules shouldn't be necessary, but: https://github.com/mesonbuild/meson/issues/8333 1562a436d6d4SPaolo Bonzinidbus_display = get_option('dbus_display') \ 1563a436d6d4SPaolo Bonzini .require(gio.version().version_compare('>=2.64'), 1564a436d6d4SPaolo Bonzini error_message: '-display dbus requires glib>=2.64') \ 1565a436d6d4SPaolo Bonzini .require(enable_modules, 1566a436d6d4SPaolo Bonzini error_message: '-display dbus requires --enable-modules') \ 15677544060eSPaolo Bonzini .require(gdbus_codegen.found(), 1568a436d6d4SPaolo Bonzini error_message: '-display dbus requires gdbus-codegen') \ 1569a436d6d4SPaolo Bonzini .allowed() 1570142ca628SMarc-André Lureau 1571a436d6d4SPaolo Bonzinihave_virtfs = get_option('virtfs') \ 15720fb1e19dSKeno Fischer .require(targetos == 'linux' or targetos == 'darwin', 15730fb1e19dSKeno Fischer error_message: 'virtio-9p (virtfs) requires Linux or macOS') \ 15740fb1e19dSKeno Fischer .require(targetos == 'linux' or cc.has_function('pthread_fchdir_np'), 15750fb1e19dSKeno Fischer error_message: 'virtio-9p (virtfs) on macOS requires the presence of pthread_fchdir_np') \ 15760fb1e19dSKeno Fischer .require(targetos == 'darwin' or (libattr.found() and libcap_ng.found()), 15770fb1e19dSKeno Fischer error_message: 'virtio-9p (virtfs) on Linux requires libcap-ng-devel and libattr-devel') \ 1578a436d6d4SPaolo Bonzini .disable_auto_if(not have_tools and not have_system) \ 1579a436d6d4SPaolo Bonzini .allowed() 158069202b40SPaolo Bonzini 15810fb1e19dSKeno Fischerhave_virtfs_proxy_helper = targetos != 'darwin' and have_virtfs and have_tools 15823a489d38SPhilippe Mathieu-Daudé 15839c29b741SPaolo Bonziniforeach k : get_option('trace_backends') 15849c29b741SPaolo Bonzini config_host_data.set('CONFIG_TRACE_' + k.to_upper(), true) 15859c29b741SPaolo Bonziniendforeach 15869c29b741SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_TRACE_FILE', get_option('trace_file')) 15875dc4618eSPaolo Bonziniif get_option('iasl') != '' 15885dc4618eSPaolo Bonzini config_host_data.set_quoted('CONFIG_IASL', get_option('iasl')) 15895dc4618eSPaolo Bonziniendif 159016bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_BINDIR', get_option('prefix') / get_option('bindir')) 159116bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_PREFIX', get_option('prefix')) 159216bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_QEMU_CONFDIR', get_option('prefix') / qemu_confdir) 159316bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_QEMU_DATADIR', get_option('prefix') / qemu_datadir) 159416bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_QEMU_DESKTOPDIR', get_option('prefix') / qemu_desktopdir) 159516bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_QEMU_FIRMWAREPATH', get_option('qemu_firmwarepath')) 159616bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_QEMU_HELPERDIR', get_option('prefix') / get_option('libexecdir')) 159716bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_QEMU_ICONDIR', get_option('prefix') / qemu_icondir) 159816bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_QEMU_LOCALEDIR', get_option('prefix') / get_option('localedir')) 159916bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_QEMU_LOCALSTATEDIR', get_option('prefix') / get_option('localstatedir')) 160016bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_QEMU_MODDIR', get_option('prefix') / qemu_moddir) 160116bf7a33SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_SYSCONFDIR', get_option('prefix') / get_option('sysconfdir')) 160216bf7a33SPaolo Bonzini 160335acbb30SPaolo Bonzinihave_slirp_smbd = get_option('slirp_smbd') \ 160435acbb30SPaolo Bonzini .require(targetos != 'windows', error_message: 'Host smbd not supported on this platform.') \ 160535acbb30SPaolo Bonzini .allowed() 160635acbb30SPaolo Bonziniif have_slirp_smbd 160735acbb30SPaolo Bonzini smbd_path = get_option('smbd') 160835acbb30SPaolo Bonzini if smbd_path == '' 160935acbb30SPaolo Bonzini smbd_path = (targetos == 'solaris' ? '/usr/sfw/sbin/smbd' : '/usr/sbin/smbd') 161035acbb30SPaolo Bonzini endif 161135acbb30SPaolo Bonzini config_host_data.set_quoted('CONFIG_SMBD_COMMAND', smbd_path) 161235acbb30SPaolo Bonziniendif 161335acbb30SPaolo Bonzini 1614823eb013SPaolo Bonziniconfig_host_data.set('HOST_' + host_arch.to_upper(), 1) 1615823eb013SPaolo Bonzini 16162cb2f580SPaolo Bonziniif get_option('module_upgrades') and not enable_modules 16172cb2f580SPaolo Bonzini error('Cannot enable module-upgrades as modules are not enabled') 16182cb2f580SPaolo Bonziniendif 16192cb2f580SPaolo Bonziniconfig_host_data.set('CONFIG_MODULE_UPGRADES', get_option('module_upgrades')) 16202cb2f580SPaolo Bonzini 1621f7f2d651SPaolo Bonziniconfig_host_data.set('CONFIG_ATTR', libattr.found()) 1622c55cf6abSPaolo Bonziniconfig_host_data.set('CONFIG_BDRV_WHITELIST_TOOLS', get_option('block_drv_whitelist_in_tools')) 16238c6d4ff4SPaolo Bonziniconfig_host_data.set('CONFIG_BRLAPI', brlapi.found()) 1624b4e312e9SPaolo Bonziniconfig_host_data.set('CONFIG_COCOA', cocoa.found()) 1625537b7248SPaolo Bonziniconfig_host_data.set('CONFIG_FUZZ', get_option('fuzzing')) 1626af2bb99bSPaolo Bonziniconfig_host_data.set('CONFIG_GCOV', get_option('b_coverage')) 1627f01496a3SPaolo Bonziniconfig_host_data.set('CONFIG_LIBUDEV', libudev.found()) 16280c32a0aeSPaolo Bonziniconfig_host_data.set('CONFIG_LZO', lzo.found()) 16296ec0e15dSPaolo Bonziniconfig_host_data.set('CONFIG_MPATH', mpathpersist.found()) 16306ec0e15dSPaolo Bonziniconfig_host_data.set('CONFIG_MPATH_NEW_API', mpathpersist_new_api) 1631f9cd86feSPaolo Bonziniconfig_host_data.set('CONFIG_CURL', curl.found()) 16325285e593SYonggang Luoconfig_host_data.set('CONFIG_CURSES', curses.found()) 16338bc5184dSThomas Huthconfig_host_data.set('CONFIG_GBM', gbm.found()) 16347544060eSPaolo Bonziniconfig_host_data.set('CONFIG_GIO', gio.found()) 163508821ca2SPaolo Bonziniconfig_host_data.set('CONFIG_GLUSTERFS', glusterfs.found()) 163608821ca2SPaolo Bonziniif glusterfs.found() 163708821ca2SPaolo Bonzini config_host_data.set('CONFIG_GLUSTERFS_XLATOR_OPT', glusterfs.version().version_compare('>=4')) 163808821ca2SPaolo Bonzini config_host_data.set('CONFIG_GLUSTERFS_DISCARD', glusterfs.version().version_compare('>=5')) 163908821ca2SPaolo Bonzini config_host_data.set('CONFIG_GLUSTERFS_FALLOCATE', glusterfs.version().version_compare('>=6')) 164008821ca2SPaolo Bonzini config_host_data.set('CONFIG_GLUSTERFS_ZEROFILL', glusterfs.version().version_compare('>=6')) 164108821ca2SPaolo Bonzini config_host_data.set('CONFIG_GLUSTERFS_FTRUNCATE_HAS_STAT', glusterfs_ftruncate_has_stat) 164208821ca2SPaolo Bonzini config_host_data.set('CONFIG_GLUSTERFS_IOCB_HAS_STAT', glusterfs_iocb_has_stat) 164308821ca2SPaolo Bonziniendif 16441b695471SPaolo Bonziniconfig_host_data.set('CONFIG_GTK', gtk.found()) 1645c23d7b4eSPaolo Bonziniconfig_host_data.set('CONFIG_VTE', vte.found()) 1646f7f2d651SPaolo Bonziniconfig_host_data.set('CONFIG_LIBATTR', have_old_libattr) 1647727c8bb8SPaolo Bonziniconfig_host_data.set('CONFIG_LIBCAP_NG', libcap_ng.found()) 164846627f41SAndrew Melnychenkoconfig_host_data.set('CONFIG_EBPF', libbpf.found()) 164963a7f853SPaolo Bonziniconfig_host_data.set('CONFIG_LIBDAXCTL', libdaxctl.found()) 16509db405a3SPaolo Bonziniconfig_host_data.set('CONFIG_LIBISCSI', libiscsi.found()) 165130045c05SPaolo Bonziniconfig_host_data.set('CONFIG_LIBNFS', libnfs.found()) 1652e6a52b36SThomas Huthconfig_host_data.set('CONFIG_LIBSSH', libssh.found()) 1653ff66f3e5SPaolo Bonziniconfig_host_data.set('CONFIG_LINUX_AIO', libaio.found()) 165463a7f853SPaolo Bonziniconfig_host_data.set('CONFIG_LINUX_IO_URING', linux_io_uring.found()) 165563a7f853SPaolo Bonziniconfig_host_data.set('CONFIG_LIBPMEM', libpmem.found()) 1656488a8c73SPaolo Bonziniconfig_host_data.set('CONFIG_NUMA', numa.found()) 165788b6e618SPaolo Bonziniconfig_host_data.set('CONFIG_OPENGL', opengl.found()) 1658c55cf6abSPaolo Bonziniconfig_host_data.set('CONFIG_PROFILER', get_option('profiler')) 1659fabd1e93SPaolo Bonziniconfig_host_data.set('CONFIG_RBD', rbd.found()) 16603730a734SPaolo Bonziniconfig_host_data.set('CONFIG_RDMA', rdma.found()) 166135be72baSPaolo Bonziniconfig_host_data.set('CONFIG_SDL', sdl.found()) 166235be72baSPaolo Bonziniconfig_host_data.set('CONFIG_SDL_IMAGE', sdl_image.found()) 166390835c2bSPaolo Bonziniconfig_host_data.set('CONFIG_SECCOMP', seccomp.found()) 1664241611eaSPaolo Bonziniconfig_host_data.set('CONFIG_SNAPPY', snappy.found()) 16650d04c4c9SPaolo Bonziniconfig_host_data.set('CONFIG_TPM', have_tpm) 166690540f32SPaolo Bonziniconfig_host_data.set('CONFIG_USB_LIBUSB', libusb.found()) 1667e1723999SPaolo Bonziniconfig_host_data.set('CONFIG_VDE', vde.found()) 1668e5e856c1SStefan Hajnocziconfig_host_data.set('CONFIG_VHOST_USER_BLK_SERVER', have_vhost_user_blk_server) 166995f8510eSKshitij Suriconfig_host_data.set('CONFIG_PNG', png.found()) 1670a0b93237SPaolo Bonziniconfig_host_data.set('CONFIG_VNC', vnc.found()) 1671a0b93237SPaolo Bonziniconfig_host_data.set('CONFIG_VNC_JPEG', jpeg.found()) 1672a0b93237SPaolo Bonziniconfig_host_data.set('CONFIG_VNC_SASL', sasl.found()) 167369202b40SPaolo Bonziniconfig_host_data.set('CONFIG_VIRTFS', have_virtfs) 167463a7f853SPaolo Bonziniconfig_host_data.set('CONFIG_VTE', vte.found()) 16754113f4cfSLaurent Vivierconfig_host_data.set('CONFIG_XKBCOMMON', xkbcommon.found()) 1676af04e89dSMarc-André Lureauconfig_host_data.set('CONFIG_KEYUTILS', keyutils.found()) 16773909def8SMarc-André Lureauconfig_host_data.set('CONFIG_GETTID', has_gettid) 167857612511SPaolo Bonziniconfig_host_data.set('CONFIG_GNUTLS', gnutls.found()) 1679cc4c7c73SDaniel P. Berrangéconfig_host_data.set('CONFIG_GNUTLS_CRYPTO', gnutls_crypto.found()) 168057612511SPaolo Bonziniconfig_host_data.set('CONFIG_GCRYPT', gcrypt.found()) 168157612511SPaolo Bonziniconfig_host_data.set('CONFIG_NETTLE', nettle.found()) 168257612511SPaolo Bonziniconfig_host_data.set('CONFIG_QEMU_PRIVATE_XTS', xts == 'private') 1683aa087962SPaolo Bonziniconfig_host_data.set('CONFIG_MALLOC_TRIM', has_malloc_trim) 168484e319a5SMax Reitzconfig_host_data.set('CONFIG_STATX', has_statx) 16854ce7a08dSHanna Reitzconfig_host_data.set('CONFIG_STATX_MNT_ID', has_statx_mnt_id) 1686b1def33dSPaolo Bonziniconfig_host_data.set('CONFIG_ZSTD', zstd.found()) 1687a484a719SMax Reitzconfig_host_data.set('CONFIG_FUSE', fuse.found()) 1688df4ea709SMax Reitzconfig_host_data.set('CONFIG_FUSE_LSEEK', fuse_lseek.found()) 16893f0a5d55SMarc-André Lureauconfig_host_data.set('CONFIG_SPICE_PROTOCOL', spice_protocol.found()) 1690ddece465SMarc-André Lureauif spice_protocol.found() 1691ddece465SMarc-André Lureauconfig_host_data.set('CONFIG_SPICE_PROTOCOL_MAJOR', spice_protocol.version().split('.')[0]) 1692ddece465SMarc-André Lureauconfig_host_data.set('CONFIG_SPICE_PROTOCOL_MINOR', spice_protocol.version().split('.')[1]) 1693ddece465SMarc-André Lureauconfig_host_data.set('CONFIG_SPICE_PROTOCOL_MICRO', spice_protocol.version().split('.')[2]) 1694ddece465SMarc-André Lureauendif 16953f0a5d55SMarc-André Lureauconfig_host_data.set('CONFIG_SPICE', spice.found()) 16969d71037fSPaolo Bonziniconfig_host_data.set('CONFIG_X11', x11.found()) 1697142ca628SMarc-André Lureauconfig_host_data.set('CONFIG_DBUS_DISPLAY', dbus_display) 16989e62ba48SDaniele Buonoconfig_host_data.set('CONFIG_CFI', get_option('cfi')) 16993d212b41SRichard W.M. Jonesconfig_host_data.set('CONFIG_SELINUX', selinux.found()) 1700*14efd8d3SPaolo Bonziniconfig_host_data.set('CONFIG_XEN_BACKEND', xen.found()) 1701*14efd8d3SPaolo Bonziniif xen.found() 1702*14efd8d3SPaolo Bonzini # protect from xen.version() having less than three components 1703*14efd8d3SPaolo Bonzini xen_version = xen.version().split('.') + ['0', '0'] 1704*14efd8d3SPaolo Bonzini xen_ctrl_version = xen_version[0] + \ 1705*14efd8d3SPaolo Bonzini ('0' + xen_version[1]).substring(-2) + \ 1706*14efd8d3SPaolo Bonzini ('0' + xen_version[2]).substring(-2) 1707*14efd8d3SPaolo Bonzini config_host_data.set('CONFIG_XEN_CTRL_INTERFACE_VERSION', xen_ctrl_version) 1708*14efd8d3SPaolo Bonziniendif 1709859aef02SPaolo Bonziniconfig_host_data.set('QEMU_VERSION', '"@0@"'.format(meson.project_version())) 1710859aef02SPaolo Bonziniconfig_host_data.set('QEMU_VERSION_MAJOR', meson.project_version().split('.')[0]) 1711859aef02SPaolo Bonziniconfig_host_data.set('QEMU_VERSION_MINOR', meson.project_version().split('.')[1]) 1712859aef02SPaolo Bonziniconfig_host_data.set('QEMU_VERSION_MICRO', meson.project_version().split('.')[2]) 1713859aef02SPaolo Bonzini 1714a6305081SPaolo Bonziniconfig_host_data.set_quoted('CONFIG_HOST_DSOSUF', host_dsosuf) 171569d8de7aSPaolo Bonziniconfig_host_data.set('HAVE_HOST_BLOCK_DEVICE', have_host_block_device) 171669d8de7aSPaolo Bonzini 1717728c0a2fSPaolo Bonzinihave_coroutine_pool = get_option('coroutine_pool') 1718728c0a2fSPaolo Bonziniif get_option('debug_stack_usage') and have_coroutine_pool 1719728c0a2fSPaolo Bonzini message('Disabling coroutine pool to measure stack usage') 1720728c0a2fSPaolo Bonzini have_coroutine_pool = false 1721728c0a2fSPaolo Bonziniendif 1722728c0a2fSPaolo Bonziniconfig_host_data.set10('CONFIG_COROUTINE_POOL', have_coroutine_pool) 1723c55cf6abSPaolo Bonziniconfig_host_data.set('CONFIG_DEBUG_MUTEX', get_option('debug_mutex')) 1724728c0a2fSPaolo Bonziniconfig_host_data.set('CONFIG_DEBUG_STACK_USAGE', get_option('debug_stack_usage')) 1725c55cf6abSPaolo Bonziniconfig_host_data.set('CONFIG_GPROF', get_option('gprof')) 1726406523f6SPaolo Bonziniconfig_host_data.set('CONFIG_LIVE_BLOCK_MIGRATION', get_option('live_block_migration').allowed()) 1727c55cf6abSPaolo Bonziniconfig_host_data.set('CONFIG_QOM_CAST_DEBUG', get_option('qom_cast_debug')) 1728406523f6SPaolo Bonziniconfig_host_data.set('CONFIG_REPLICATION', get_option('live_block_migration').allowed()) 1729406523f6SPaolo Bonzini 173069d8de7aSPaolo Bonzini# has_header 1731e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_EPOLL', cc.has_header('sys/epoll.h')) 1732d47a8b3bSPaolo Bonziniconfig_host_data.set('CONFIG_LINUX_MAGIC_H', cc.has_header('linux/magic.h')) 1733d47a8b3bSPaolo Bonziniconfig_host_data.set('CONFIG_VALGRIND_H', cc.has_header('valgrind/valgrind.h')) 173448f670ecSThomas Huthconfig_host_data.set('HAVE_BTRFS_H', cc.has_header('linux/btrfs.h')) 17352964be52SThomas Huthconfig_host_data.set('HAVE_DRM_H', cc.has_header('libdrm/drm.h')) 17362802d91dSThomas Huthconfig_host_data.set('HAVE_PTY_H', cc.has_header('pty.h')) 173769d8de7aSPaolo Bonziniconfig_host_data.set('HAVE_SYS_DISK_H', cc.has_header('sys/disk.h')) 1738ded5d78cSThomas Huthconfig_host_data.set('HAVE_SYS_IOCCOM_H', cc.has_header('sys/ioccom.h')) 17394a9d5f89SThomas Huthconfig_host_data.set('HAVE_SYS_KCOV_H', cc.has_header('sys/kcov.h')) 1740ded5d78cSThomas Huth 174169d8de7aSPaolo Bonzini# has_function 1742a620fbe9SPaolo Bonziniconfig_host_data.set('CONFIG_ACCEPT4', cc.has_function('accept4')) 1743e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_CLOCK_ADJTIME', cc.has_function('clock_adjtime')) 1744e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_DUP3', cc.has_function('dup3')) 1745e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_FALLOCATE', cc.has_function('fallocate')) 1746e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_POSIX_FALLOCATE', cc.has_function('posix_fallocate')) 17478698343bSPeter Maydell# Note that we need to specify prefix: here to avoid incorrectly 17488698343bSPeter Maydell# thinking that Windows has posix_memalign() 17498698343bSPeter Maydellconfig_host_data.set('CONFIG_POSIX_MEMALIGN', cc.has_function('posix_memalign', prefix: '#include <stdlib.h>')) 17505c8c714aSPeter Maydellconfig_host_data.set('CONFIG_ALIGNED_MALLOC', cc.has_function('_aligned_malloc')) 175188454f84SPeter Maydellconfig_host_data.set('CONFIG_VALLOC', cc.has_function('valloc')) 175288454f84SPeter Maydellconfig_host_data.set('CONFIG_MEMALIGN', cc.has_function('memalign')) 1753e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_PPOLL', cc.has_function('ppoll')) 17542b9f74efSPeter Maydellconfig_host_data.set('CONFIG_PREADV', cc.has_function('preadv', prefix: '#include <sys/uio.h>')) 1755029ed1bdSKeno Fischerconfig_host_data.set('CONFIG_PTHREAD_FCHDIR_NP', cc.has_function('pthread_fchdir_np')) 1756e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_SENDFILE', cc.has_function('sendfile')) 1757e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_SETNS', cc.has_function('setns') and cc.has_function('unshare')) 1758e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_SYNCFS', cc.has_function('syncfs')) 1759e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_SYNC_FILE_RANGE', cc.has_function('sync_file_range')) 1760e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_TIMERFD', cc.has_function('timerfd_create')) 1761be7e89f6SPaolo Bonziniconfig_host_data.set('HAVE_COPY_FILE_RANGE', cc.has_function('copy_file_range')) 176259e35c7bSAndrew Deasonconfig_host_data.set('HAVE_GETIFADDRS', cc.has_function('getifaddrs')) 1763e66420acSPaolo Bonziniconfig_host_data.set('HAVE_OPENPTY', cc.has_function('openpty', dependencies: util)) 1764ed3b3f17SPaolo Bonziniconfig_host_data.set('HAVE_STRCHRNUL', cc.has_function('strchrnul')) 176569d8de7aSPaolo Bonziniconfig_host_data.set('HAVE_SYSTEM_FUNCTION', cc.has_function('system', prefix: '#include <stdlib.h>')) 1766911965acSLi Zhijianif rdma.found() 1767911965acSLi Zhijian config_host_data.set('HAVE_IBV_ADVISE_MR', 1768911965acSLi Zhijian cc.has_function('ibv_advise_mr', 17693730a734SPaolo Bonzini dependencies: rdma, 1770911965acSLi Zhijian prefix: '#include <infiniband/verbs.h>')) 1771911965acSLi Zhijianendif 17722b9f74efSPeter Maydell 1773e66420acSPaolo Bonzini# has_header_symbol 1774e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_BYTESWAP_H', 1775e66420acSPaolo Bonzini cc.has_header_symbol('byteswap.h', 'bswap_32')) 1776e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_EPOLL_CREATE1', 1777e66420acSPaolo Bonzini cc.has_header_symbol('sys/epoll.h', 'epoll_create1')) 1778e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_FALLOCATE_PUNCH_HOLE', 1779e66420acSPaolo Bonzini cc.has_header_symbol('linux/falloc.h', 'FALLOC_FL_PUNCH_HOLE') and 1780e66420acSPaolo Bonzini cc.has_header_symbol('linux/falloc.h', 'FALLOC_FL_KEEP_SIZE')) 1781e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_FALLOCATE_ZERO_RANGE', 1782e66420acSPaolo Bonzini cc.has_header_symbol('linux/falloc.h', 'FALLOC_FL_ZERO_RANGE')) 1783e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_FIEMAP', 1784e66420acSPaolo Bonzini cc.has_header('linux/fiemap.h') and 1785e66420acSPaolo Bonzini cc.has_header_symbol('linux/fs.h', 'FS_IOC_FIEMAP')) 1786be7e89f6SPaolo Bonziniconfig_host_data.set('CONFIG_GETRANDOM', 1787be7e89f6SPaolo Bonzini cc.has_function('getrandom') and 1788be7e89f6SPaolo Bonzini cc.has_header_symbol('sys/random.h', 'GRND_NONBLOCK')) 1789a620fbe9SPaolo Bonziniconfig_host_data.set('CONFIG_INOTIFY', 1790a620fbe9SPaolo Bonzini cc.has_header_symbol('sys/inotify.h', 'inotify_init')) 1791a620fbe9SPaolo Bonziniconfig_host_data.set('CONFIG_INOTIFY1', 1792a620fbe9SPaolo Bonzini cc.has_header_symbol('sys/inotify.h', 'inotify_init1')) 1793e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_MACHINE_BSWAP_H', 1794e66420acSPaolo Bonzini cc.has_header_symbol('machine/bswap.h', 'bswap32', 1795e66420acSPaolo Bonzini prefix: '''#include <sys/endian.h> 1796e66420acSPaolo Bonzini #include <sys/types.h>''')) 1797e66420acSPaolo Bonziniconfig_host_data.set('CONFIG_PRCTL_PR_SET_TIMERSLACK', 1798e66420acSPaolo Bonzini cc.has_header_symbol('sys/prctl.h', 'PR_SET_TIMERSLACK')) 1799be7e89f6SPaolo Bonziniconfig_host_data.set('CONFIG_RTNETLINK', 1800be7e89f6SPaolo Bonzini cc.has_header_symbol('linux/rtnetlink.h', 'IFLA_PROTO_DOWN')) 1801be7e89f6SPaolo Bonziniconfig_host_data.set('CONFIG_SYSMACROS', 1802be7e89f6SPaolo Bonzini cc.has_header_symbol('sys/sysmacros.h', 'makedev')) 1803e1fbd2c4SPaolo Bonziniconfig_host_data.set('HAVE_OPTRESET', 1804e1fbd2c4SPaolo Bonzini cc.has_header_symbol('getopt.h', 'optreset')) 1805653163fcSMarc-André Lureauconfig_host_data.set('HAVE_IPPROTO_MPTCP', 1806653163fcSMarc-André Lureau cc.has_header_symbol('netinet/in.h', 'IPPROTO_MPTCP')) 1807e66420acSPaolo Bonzini 1808e66420acSPaolo Bonzini# has_member 1809e66420acSPaolo Bonziniconfig_host_data.set('HAVE_SIGEV_NOTIFY_THREAD_ID', 1810e66420acSPaolo Bonzini cc.has_member('struct sigevent', 'sigev_notify_thread_id', 1811e66420acSPaolo Bonzini prefix: '#include <signal.h>')) 1812ed3b3f17SPaolo Bonziniconfig_host_data.set('HAVE_STRUCT_STAT_ST_ATIM', 1813ed3b3f17SPaolo Bonzini cc.has_member('struct stat', 'st_atim', 1814ed3b3f17SPaolo Bonzini prefix: '#include <sys/stat.h>')) 1815e66420acSPaolo Bonzini 18166a23f819SPaolo Bonzini# has_type 18176a23f819SPaolo Bonziniconfig_host_data.set('CONFIG_IOVEC', 18186a23f819SPaolo Bonzini cc.has_type('struct iovec', 18196a23f819SPaolo Bonzini prefix: '#include <sys/uio.h>')) 18206a23f819SPaolo Bonziniconfig_host_data.set('HAVE_UTMPX', 18216a23f819SPaolo Bonzini cc.has_type('struct utmpx', 18226a23f819SPaolo Bonzini prefix: '#include <utmpx.h>')) 18236a23f819SPaolo Bonzini 1824904ad5ecSPaolo Bonziniconfig_host_data.set('CONFIG_EVENTFD', cc.links(''' 1825e1fbd2c4SPaolo Bonzini #include <sys/eventfd.h> 1826e1fbd2c4SPaolo Bonzini int main(void) { return eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC); }''')) 1827904ad5ecSPaolo Bonziniconfig_host_data.set('CONFIG_FDATASYNC', cc.links(gnu_source_prefix + ''' 1828e1fbd2c4SPaolo Bonzini #include <unistd.h> 1829e1fbd2c4SPaolo Bonzini int main(void) { 1830e1fbd2c4SPaolo Bonzini #if defined(_POSIX_SYNCHRONIZED_IO) && _POSIX_SYNCHRONIZED_IO > 0 1831e1fbd2c4SPaolo Bonzini return fdatasync(0); 1832e1fbd2c4SPaolo Bonzini #else 1833e1fbd2c4SPaolo Bonzini #error Not supported 1834e1fbd2c4SPaolo Bonzini #endif 1835e1fbd2c4SPaolo Bonzini }''')) 18368900c204SAndrew Deason 18378900c204SAndrew Deasonhas_madvise = cc.links(gnu_source_prefix + ''' 1838e1fbd2c4SPaolo Bonzini #include <sys/types.h> 1839e1fbd2c4SPaolo Bonzini #include <sys/mman.h> 1840e1fbd2c4SPaolo Bonzini #include <stddef.h> 18418900c204SAndrew Deason int main(void) { return madvise(NULL, 0, MADV_DONTNEED); }''') 18428900c204SAndrew Deasonmissing_madvise_proto = false 18438900c204SAndrew Deasonif has_madvise 18448900c204SAndrew Deason # Some platforms (illumos and Solaris before Solaris 11) provide madvise() 18458900c204SAndrew Deason # but forget to prototype it. In this case, has_madvise will be true (the 18468900c204SAndrew Deason # test program links despite a compile warning). To detect the 18478900c204SAndrew Deason # missing-prototype case, we try again with a definitely-bogus prototype. 18488900c204SAndrew Deason # This will only compile if the system headers don't provide the prototype; 18498900c204SAndrew Deason # otherwise the conflicting prototypes will cause a compiler error. 18508900c204SAndrew Deason missing_madvise_proto = cc.links(gnu_source_prefix + ''' 18518900c204SAndrew Deason #include <sys/types.h> 18528900c204SAndrew Deason #include <sys/mman.h> 18538900c204SAndrew Deason #include <stddef.h> 18548900c204SAndrew Deason extern int madvise(int); 18558900c204SAndrew Deason int main(void) { return madvise(0); }''') 18568900c204SAndrew Deasonendif 18578900c204SAndrew Deasonconfig_host_data.set('CONFIG_MADVISE', has_madvise) 18588900c204SAndrew Deasonconfig_host_data.set('HAVE_MADVISE_WITHOUT_PROTOTYPE', missing_madvise_proto) 18598900c204SAndrew Deason 1860904ad5ecSPaolo Bonziniconfig_host_data.set('CONFIG_MEMFD', cc.links(gnu_source_prefix + ''' 1861e1fbd2c4SPaolo Bonzini #include <sys/mman.h> 1862e1fbd2c4SPaolo Bonzini int main(void) { return memfd_create("foo", MFD_ALLOW_SEALING); }''')) 1863904ad5ecSPaolo Bonziniconfig_host_data.set('CONFIG_OPEN_BY_HANDLE', cc.links(gnu_source_prefix + ''' 1864d47a8b3bSPaolo Bonzini #include <fcntl.h> 1865d47a8b3bSPaolo Bonzini #if !defined(AT_EMPTY_PATH) 1866d47a8b3bSPaolo Bonzini # error missing definition 1867d47a8b3bSPaolo Bonzini #else 1868d47a8b3bSPaolo Bonzini int main(void) { struct file_handle fh; return open_by_handle_at(0, &fh, 0); } 1869d47a8b3bSPaolo Bonzini #endif''')) 1870904ad5ecSPaolo Bonziniconfig_host_data.set('CONFIG_PIPE2', cc.links(gnu_source_prefix + ''' 1871a620fbe9SPaolo Bonzini #include <unistd.h> 1872a620fbe9SPaolo Bonzini #include <fcntl.h> 1873a620fbe9SPaolo Bonzini 1874a620fbe9SPaolo Bonzini int main(void) 1875a620fbe9SPaolo Bonzini { 1876a620fbe9SPaolo Bonzini int pipefd[2]; 1877a620fbe9SPaolo Bonzini return pipe2(pipefd, O_CLOEXEC); 1878a620fbe9SPaolo Bonzini }''')) 1879904ad5ecSPaolo Bonziniconfig_host_data.set('CONFIG_POSIX_MADVISE', cc.links(gnu_source_prefix + ''' 1880e1fbd2c4SPaolo Bonzini #include <sys/mman.h> 1881e1fbd2c4SPaolo Bonzini #include <stddef.h> 1882e1fbd2c4SPaolo Bonzini int main(void) { return posix_madvise(NULL, 0, POSIX_MADV_DONTNEED); }''')) 188310f6b231SPaolo Bonzini 18846a23f819SPaolo Bonziniconfig_host_data.set('CONFIG_PTHREAD_SETNAME_NP_W_TID', cc.links(gnu_source_prefix + ''' 188510f6b231SPaolo Bonzini #include <pthread.h> 188610f6b231SPaolo Bonzini 188710f6b231SPaolo Bonzini static void *f(void *p) { return NULL; } 188810f6b231SPaolo Bonzini int main(void) 188910f6b231SPaolo Bonzini { 189010f6b231SPaolo Bonzini pthread_t thread; 189110f6b231SPaolo Bonzini pthread_create(&thread, 0, f, 0); 189210f6b231SPaolo Bonzini pthread_setname_np(thread, "QEMU"); 189310f6b231SPaolo Bonzini return 0; 189410f6b231SPaolo Bonzini }''', dependencies: threads)) 18956a23f819SPaolo Bonziniconfig_host_data.set('CONFIG_PTHREAD_SETNAME_NP_WO_TID', cc.links(gnu_source_prefix + ''' 189610f6b231SPaolo Bonzini #include <pthread.h> 189710f6b231SPaolo Bonzini 189810f6b231SPaolo Bonzini static void *f(void *p) { pthread_setname_np("QEMU"); return NULL; } 189910f6b231SPaolo Bonzini int main(void) 190010f6b231SPaolo Bonzini { 190110f6b231SPaolo Bonzini pthread_t thread; 190210f6b231SPaolo Bonzini pthread_create(&thread, 0, f, 0); 190310f6b231SPaolo Bonzini return 0; 190410f6b231SPaolo Bonzini }''', dependencies: threads)) 1905657ac98bSLongpeng(Mike)config_host_data.set('CONFIG_PTHREAD_CONDATTR_SETCLOCK', cc.links(gnu_source_prefix + ''' 1906657ac98bSLongpeng(Mike) #include <pthread.h> 1907657ac98bSLongpeng(Mike) #include <time.h> 1908657ac98bSLongpeng(Mike) 1909657ac98bSLongpeng(Mike) int main(void) 1910657ac98bSLongpeng(Mike) { 1911657ac98bSLongpeng(Mike) pthread_condattr_t attr 1912657ac98bSLongpeng(Mike) pthread_condattr_init(&attr); 1913657ac98bSLongpeng(Mike) pthread_condattr_setclock(&attr, CLOCK_MONOTONIC); 1914657ac98bSLongpeng(Mike) return 0; 1915657ac98bSLongpeng(Mike) }''', dependencies: threads)) 191610f6b231SPaolo Bonzini 1917904ad5ecSPaolo Bonziniconfig_host_data.set('CONFIG_SIGNALFD', cc.links(gnu_source_prefix + ''' 19186bd17dccSKacper Słomiński #include <sys/signalfd.h> 19196bd17dccSKacper Słomiński #include <stddef.h> 19206bd17dccSKacper Słomiński int main(void) { return signalfd(-1, NULL, SFD_CLOEXEC); }''')) 1921904ad5ecSPaolo Bonziniconfig_host_data.set('CONFIG_SPLICE', cc.links(gnu_source_prefix + ''' 1922a620fbe9SPaolo Bonzini #include <unistd.h> 1923a620fbe9SPaolo Bonzini #include <fcntl.h> 1924a620fbe9SPaolo Bonzini #include <limits.h> 1925a620fbe9SPaolo Bonzini 1926a620fbe9SPaolo Bonzini int main(void) 1927a620fbe9SPaolo Bonzini { 1928a620fbe9SPaolo Bonzini int len, fd = 0; 1929a620fbe9SPaolo Bonzini len = tee(STDIN_FILENO, STDOUT_FILENO, INT_MAX, SPLICE_F_NONBLOCK); 1930a620fbe9SPaolo Bonzini splice(STDIN_FILENO, NULL, fd, NULL, len, SPLICE_F_MOVE); 1931a620fbe9SPaolo Bonzini return 0; 1932a620fbe9SPaolo Bonzini }''')) 1933e1fbd2c4SPaolo Bonzini 193496a63aebSPaolo Bonziniconfig_host_data.set('HAVE_MLOCKALL', cc.links(gnu_source_prefix + ''' 193596a63aebSPaolo Bonzini #include <sys/mman.h> 193696a63aebSPaolo Bonzini int main(int argc, char *argv[]) { 193796a63aebSPaolo Bonzini return mlockall(MCL_FUTURE); 193896a63aebSPaolo Bonzini }''')) 193996a63aebSPaolo Bonzini 1940eea9453aSThomas Huthhave_l2tpv3 = false 194143a363aeSPaolo Bonziniif get_option('l2tpv3').allowed() and have_system 19426a23f819SPaolo Bonzini have_l2tpv3 = cc.has_type('struct mmsghdr', 19436a23f819SPaolo Bonzini prefix: gnu_source_prefix + ''' 19446a23f819SPaolo Bonzini #include <sys/socket.h> 19456a23f819SPaolo Bonzini #include <linux/ip.h>''') 1946eea9453aSThomas Huthendif 1947eea9453aSThomas Huthconfig_host_data.set('CONFIG_L2TPV3', have_l2tpv3) 1948eea9453aSThomas Huth 1949837b84b1SPaolo Bonzinihave_netmap = false 195043a363aeSPaolo Bonziniif get_option('netmap').allowed() and have_system 1951837b84b1SPaolo Bonzini have_netmap = cc.compiles(''' 1952837b84b1SPaolo Bonzini #include <inttypes.h> 1953837b84b1SPaolo Bonzini #include <net/if.h> 1954837b84b1SPaolo Bonzini #include <net/netmap.h> 1955837b84b1SPaolo Bonzini #include <net/netmap_user.h> 1956837b84b1SPaolo Bonzini #if (NETMAP_API < 11) || (NETMAP_API > 15) 1957837b84b1SPaolo Bonzini #error 1958837b84b1SPaolo Bonzini #endif 1959837b84b1SPaolo Bonzini int main(void) { return 0; }''') 1960837b84b1SPaolo Bonzini if not have_netmap and get_option('netmap').enabled() 1961837b84b1SPaolo Bonzini error('Netmap headers not available') 1962837b84b1SPaolo Bonzini endif 1963837b84b1SPaolo Bonziniendif 1964837b84b1SPaolo Bonziniconfig_host_data.set('CONFIG_NETMAP', have_netmap) 1965837b84b1SPaolo Bonzini 196696a63aebSPaolo Bonzini# Work around a system header bug with some kernel/XFS header 196796a63aebSPaolo Bonzini# versions where they both try to define 'struct fsxattr': 196896a63aebSPaolo Bonzini# xfs headers will not try to redefine structs from linux headers 196996a63aebSPaolo Bonzini# if this macro is set. 197096a63aebSPaolo Bonziniconfig_host_data.set('HAVE_FSXATTR', cc.links(''' 19716a23f819SPaolo Bonzini #include <linux/fs.h> 197296a63aebSPaolo Bonzini struct fsxattr foo; 197396a63aebSPaolo Bonzini int main(void) { 197496a63aebSPaolo Bonzini return 0; 197596a63aebSPaolo Bonzini }''')) 197696a63aebSPaolo Bonzini 1977e46bd55dSPaolo Bonzini# Some versions of Mac OS X incorrectly define SIZE_MAX 1978e46bd55dSPaolo Bonziniconfig_host_data.set('HAVE_BROKEN_SIZE_MAX', not cc.compiles(''' 1979e46bd55dSPaolo Bonzini #include <stdint.h> 1980e46bd55dSPaolo Bonzini #include <stdio.h> 1981e46bd55dSPaolo Bonzini int main(int argc, char *argv[]) { 1982e46bd55dSPaolo Bonzini return printf("%zu", SIZE_MAX); 1983e46bd55dSPaolo Bonzini }''', args: ['-Werror'])) 1984e46bd55dSPaolo Bonzini 1985d2958fb0SMarc-André Lureauatomic_test = ''' 1986bd87a367SPaolo Bonzini #include <stdint.h> 1987bd87a367SPaolo Bonzini int main(void) 1988bd87a367SPaolo Bonzini { 1989d2958fb0SMarc-André Lureau @0@ x = 0, y = 0; 1990bd87a367SPaolo Bonzini y = __atomic_load_n(&x, __ATOMIC_RELAXED); 1991bd87a367SPaolo Bonzini __atomic_store_n(&x, y, __ATOMIC_RELAXED); 1992bd87a367SPaolo Bonzini __atomic_compare_exchange_n(&x, &y, x, 0, __ATOMIC_RELAXED, __ATOMIC_RELAXED); 1993bd87a367SPaolo Bonzini __atomic_exchange_n(&x, y, __ATOMIC_RELAXED); 1994bd87a367SPaolo Bonzini __atomic_fetch_add(&x, y, __ATOMIC_RELAXED); 1995bd87a367SPaolo Bonzini return 0; 1996d2958fb0SMarc-André Lureau }''' 1997d2958fb0SMarc-André Lureau 1998d2958fb0SMarc-André Lureau# See if 64-bit atomic operations are supported. 1999d2958fb0SMarc-André Lureau# Note that without __atomic builtins, we can only 2000d2958fb0SMarc-André Lureau# assume atomic loads/stores max at pointer size. 2001d2958fb0SMarc-André Lureauconfig_host_data.set('CONFIG_ATOMIC64', cc.links(atomic_test.format('uint64_t'))) 2002bd87a367SPaolo Bonzini 2003848126d1SMarc-André Lureauhas_int128 = cc.links(''' 2004848126d1SMarc-André Lureau __int128_t a; 2005848126d1SMarc-André Lureau __uint128_t b; 2006848126d1SMarc-André Lureau int main (void) { 2007848126d1SMarc-André Lureau a = a + b; 2008848126d1SMarc-André Lureau b = a * b; 2009848126d1SMarc-André Lureau a = a * a; 2010848126d1SMarc-André Lureau return 0; 2011848126d1SMarc-André Lureau }''') 2012848126d1SMarc-André Lureau 2013848126d1SMarc-André Lureauconfig_host_data.set('CONFIG_INT128', has_int128) 2014848126d1SMarc-André Lureau 2015848126d1SMarc-André Lureauif has_int128 2016d2958fb0SMarc-André Lureau # "do we have 128-bit atomics which are handled inline and specifically not 2017d2958fb0SMarc-André Lureau # via libatomic". The reason we can't use libatomic is documented in the 2018d2958fb0SMarc-André Lureau # comment starting "GCC is a house divided" in include/qemu/atomic128.h. 2019d2958fb0SMarc-André Lureau has_atomic128 = cc.links(atomic_test.format('unsigned __int128')) 2020848126d1SMarc-André Lureau 2021848126d1SMarc-André Lureau config_host_data.set('CONFIG_ATOMIC128', has_atomic128) 2022848126d1SMarc-André Lureau 2023848126d1SMarc-André Lureau if not has_atomic128 2024848126d1SMarc-André Lureau has_cmpxchg128 = cc.links(''' 2025848126d1SMarc-André Lureau int main(void) 2026848126d1SMarc-André Lureau { 2027848126d1SMarc-André Lureau unsigned __int128 x = 0, y = 0; 2028848126d1SMarc-André Lureau __sync_val_compare_and_swap_16(&x, y, x); 2029848126d1SMarc-André Lureau return 0; 2030848126d1SMarc-André Lureau } 2031848126d1SMarc-André Lureau ''') 2032848126d1SMarc-André Lureau 2033848126d1SMarc-André Lureau config_host_data.set('CONFIG_CMPXCHG128', has_cmpxchg128) 2034848126d1SMarc-André Lureau endif 2035848126d1SMarc-André Lureauendif 2036bd87a367SPaolo Bonzini 2037bd87a367SPaolo Bonziniconfig_host_data.set('CONFIG_GETAUXVAL', cc.links(gnu_source_prefix + ''' 2038bd87a367SPaolo Bonzini #include <sys/auxv.h> 2039bd87a367SPaolo Bonzini int main(void) { 2040bd87a367SPaolo Bonzini return getauxval(AT_HWCAP) == 0; 2041bd87a367SPaolo Bonzini }''')) 2042bd87a367SPaolo Bonzini 20430dae95d4SPaolo Bonziniconfig_host_data.set('CONFIG_USBFS', have_linux_user and cc.compiles(''' 20440dae95d4SPaolo Bonzini #include <linux/usbdevice_fs.h> 20450dae95d4SPaolo Bonzini 20460dae95d4SPaolo Bonzini #ifndef USBDEVFS_GET_CAPABILITIES 20470dae95d4SPaolo Bonzini #error "USBDEVFS_GET_CAPABILITIES undefined" 20480dae95d4SPaolo Bonzini #endif 20490dae95d4SPaolo Bonzini 20500dae95d4SPaolo Bonzini #ifndef USBDEVFS_DISCONNECT_CLAIM 20510dae95d4SPaolo Bonzini #error "USBDEVFS_DISCONNECT_CLAIM undefined" 20520dae95d4SPaolo Bonzini #endif 20530dae95d4SPaolo Bonzini 20540dae95d4SPaolo Bonzini int main(void) { return 0; }''')) 20550dae95d4SPaolo Bonzini 20562edd2c04SPaolo Bonzinihave_keyring = get_option('keyring') \ 20572edd2c04SPaolo Bonzini .require(targetos == 'linux', error_message: 'keyring is only available on Linux') \ 20582edd2c04SPaolo Bonzini .require(cc.compiles(''' 20592edd2c04SPaolo Bonzini #include <errno.h> 20602edd2c04SPaolo Bonzini #include <asm/unistd.h> 20612edd2c04SPaolo Bonzini #include <linux/keyctl.h> 20622edd2c04SPaolo Bonzini #include <sys/syscall.h> 20632edd2c04SPaolo Bonzini #include <unistd.h> 20642edd2c04SPaolo Bonzini int main(void) { 20652edd2c04SPaolo Bonzini return syscall(__NR_keyctl, KEYCTL_READ, 0, NULL, NULL, 0); 20662edd2c04SPaolo Bonzini }'''), error_message: 'keyctl syscall not available on this system').allowed() 20672edd2c04SPaolo Bonziniconfig_host_data.set('CONFIG_SECRET_KEYRING', have_keyring) 20682edd2c04SPaolo Bonzini 2069622753d2SPaolo Bonzinihave_cpuid_h = cc.links(''' 2070622753d2SPaolo Bonzini #include <cpuid.h> 2071622753d2SPaolo Bonzini int main(void) { 2072622753d2SPaolo Bonzini unsigned a, b, c, d; 2073622753d2SPaolo Bonzini unsigned max = __get_cpuid_max(0, 0); 2074622753d2SPaolo Bonzini 2075622753d2SPaolo Bonzini if (max >= 1) { 2076622753d2SPaolo Bonzini __cpuid(1, a, b, c, d); 2077622753d2SPaolo Bonzini } 2078622753d2SPaolo Bonzini 2079622753d2SPaolo Bonzini if (max >= 7) { 2080622753d2SPaolo Bonzini __cpuid_count(7, 0, a, b, c, d); 2081622753d2SPaolo Bonzini } 2082622753d2SPaolo Bonzini 2083622753d2SPaolo Bonzini return 0; 2084622753d2SPaolo Bonzini }''') 2085622753d2SPaolo Bonziniconfig_host_data.set('CONFIG_CPUID_H', have_cpuid_h) 2086622753d2SPaolo Bonzini 2087622753d2SPaolo Bonziniconfig_host_data.set('CONFIG_AVX2_OPT', get_option('avx2') \ 2088622753d2SPaolo Bonzini .require(have_cpuid_h, error_message: 'cpuid.h not available, cannot enable AVX2') \ 2089622753d2SPaolo Bonzini .require(cc.links(''' 2090622753d2SPaolo Bonzini #pragma GCC push_options 2091622753d2SPaolo Bonzini #pragma GCC target("avx2") 2092622753d2SPaolo Bonzini #include <cpuid.h> 2093622753d2SPaolo Bonzini #include <immintrin.h> 2094622753d2SPaolo Bonzini static int bar(void *a) { 2095622753d2SPaolo Bonzini __m256i x = *(__m256i *)a; 2096622753d2SPaolo Bonzini return _mm256_testz_si256(x, x); 2097622753d2SPaolo Bonzini } 2098622753d2SPaolo Bonzini int main(int argc, char *argv[]) { return bar(argv[0]); } 2099622753d2SPaolo Bonzini '''), error_message: 'AVX2 not available').allowed()) 2100622753d2SPaolo Bonzini 2101622753d2SPaolo Bonziniconfig_host_data.set('CONFIG_AVX512F_OPT', get_option('avx512f') \ 2102622753d2SPaolo Bonzini .require(have_cpuid_h, error_message: 'cpuid.h not available, cannot enable AVX512F') \ 2103622753d2SPaolo Bonzini .require(cc.links(''' 2104622753d2SPaolo Bonzini #pragma GCC push_options 2105622753d2SPaolo Bonzini #pragma GCC target("avx512f") 2106622753d2SPaolo Bonzini #include <cpuid.h> 2107622753d2SPaolo Bonzini #include <immintrin.h> 2108622753d2SPaolo Bonzini static int bar(void *a) { 2109622753d2SPaolo Bonzini __m512i x = *(__m512i *)a; 2110622753d2SPaolo Bonzini return _mm512_test_epi64_mask(x, x); 2111622753d2SPaolo Bonzini } 2112622753d2SPaolo Bonzini int main(int argc, char *argv[]) { return bar(argv[0]); } 2113622753d2SPaolo Bonzini '''), error_message: 'AVX512F not available').allowed()) 2114622753d2SPaolo Bonzini 21153730a734SPaolo Bonzinihave_pvrdma = get_option('pvrdma') \ 21163730a734SPaolo Bonzini .require(rdma.found(), error_message: 'PVRDMA requires OpenFabrics libraries') \ 21173730a734SPaolo Bonzini .require(cc.compiles(''' 21183730a734SPaolo Bonzini int main(void) 21193730a734SPaolo Bonzini { 21203730a734SPaolo Bonzini char buf = 0; 21213730a734SPaolo Bonzini void *addr = &buf; 21223730a734SPaolo Bonzini addr = mremap(addr, 0, 1, MREMAP_MAYMOVE | MREMAP_FIXED); 21233730a734SPaolo Bonzini 21243730a734SPaolo Bonzini return 0; 21253730a734SPaolo Bonzini }'''), error_message: 'PVRDMA requires mremap').allowed() 21263730a734SPaolo Bonzini 21273730a734SPaolo Bonziniif have_pvrdma 21283730a734SPaolo Bonzini config_host_data.set('LEGACY_RDMA_REG_MR', not cc.compiles(''' 21293730a734SPaolo Bonzini #include <infiniband/verbs.h> 21303730a734SPaolo Bonzini int main(void) 21313730a734SPaolo Bonzini { 21323730a734SPaolo Bonzini struct ibv_mr *mr; 21333730a734SPaolo Bonzini struct ibv_pd *pd = NULL; 21343730a734SPaolo Bonzini size_t length = 10; 21353730a734SPaolo Bonzini uint64_t iova = 0; 21363730a734SPaolo Bonzini int access = 0; 21373730a734SPaolo Bonzini void *addr = NULL; 21383730a734SPaolo Bonzini 21393730a734SPaolo Bonzini mr = ibv_reg_mr_iova(pd, addr, length, iova, access); 21403730a734SPaolo Bonzini ibv_dereg_mr(mr); 21413730a734SPaolo Bonzini return 0; 21423730a734SPaolo Bonzini }''')) 21433730a734SPaolo Bonziniendif 21443730a734SPaolo Bonzini 2145b87df904SPaolo Bonziniif get_option('membarrier').disabled() 2146b87df904SPaolo Bonzini have_membarrier = false 2147b87df904SPaolo Bonzinielif targetos == 'windows' 2148b87df904SPaolo Bonzini have_membarrier = true 2149b87df904SPaolo Bonzinielif targetos == 'linux' 2150b87df904SPaolo Bonzini have_membarrier = cc.compiles(''' 2151b87df904SPaolo Bonzini #include <linux/membarrier.h> 2152b87df904SPaolo Bonzini #include <sys/syscall.h> 2153b87df904SPaolo Bonzini #include <unistd.h> 2154b87df904SPaolo Bonzini #include <stdlib.h> 2155b87df904SPaolo Bonzini int main(void) { 2156b87df904SPaolo Bonzini syscall(__NR_membarrier, MEMBARRIER_CMD_QUERY, 0); 2157b87df904SPaolo Bonzini syscall(__NR_membarrier, MEMBARRIER_CMD_SHARED, 0); 2158b87df904SPaolo Bonzini exit(0); 2159b87df904SPaolo Bonzini }''') 2160b87df904SPaolo Bonziniendif 2161b87df904SPaolo Bonziniconfig_host_data.set('CONFIG_MEMBARRIER', get_option('membarrier') \ 2162b87df904SPaolo Bonzini .require(have_membarrier, error_message: 'membarrier system call not available') \ 2163b87df904SPaolo Bonzini .allowed()) 2164b87df904SPaolo Bonzini 216534b52615SPaolo Bonzinihave_afalg = get_option('crypto_afalg') \ 216634b52615SPaolo Bonzini .require(cc.compiles(gnu_source_prefix + ''' 216734b52615SPaolo Bonzini #include <errno.h> 216834b52615SPaolo Bonzini #include <sys/types.h> 216934b52615SPaolo Bonzini #include <sys/socket.h> 217034b52615SPaolo Bonzini #include <linux/if_alg.h> 217134b52615SPaolo Bonzini int main(void) { 217234b52615SPaolo Bonzini int sock; 217334b52615SPaolo Bonzini sock = socket(AF_ALG, SOCK_SEQPACKET, 0); 217434b52615SPaolo Bonzini return sock; 217534b52615SPaolo Bonzini } 217634b52615SPaolo Bonzini '''), error_message: 'AF_ALG requested but could not be detected').allowed() 217734b52615SPaolo Bonziniconfig_host_data.set('CONFIG_AF_ALG', have_afalg) 217834b52615SPaolo Bonzini 21799d734b85SMarc-André Lureauconfig_host_data.set('CONFIG_AF_VSOCK', cc.has_header_symbol( 21809d734b85SMarc-André Lureau 'linux/vm_sockets.h', 'AF_VSOCK', 21819d734b85SMarc-André Lureau prefix: '#include <sys/socket.h>', 21829d734b85SMarc-André Lureau)) 2183bd87a367SPaolo Bonzini 21848821a389SMarc-André Lureauhave_vss = false 2185872b69e6SMarc-André Lureauhave_vss_sdk = false # old xp/2003 SDK 21868821a389SMarc-André Lureauif targetos == 'windows' and link_language == 'cpp' 21878821a389SMarc-André Lureau have_vss = cxx.compiles(''' 21888821a389SMarc-André Lureau #define __MIDL_user_allocate_free_DEFINED__ 218932478cb6SMarc-André Lureau #include <vss.h> 21908821a389SMarc-André Lureau int main(void) { return VSS_CTX_BACKUP; }''') 2191872b69e6SMarc-André Lureau have_vss_sdk = cxx.has_header('vscoordint.h') 21928821a389SMarc-André Lureauendif 2193872b69e6SMarc-André Lureauconfig_host_data.set('HAVE_VSS_SDK', have_vss_sdk) 21948821a389SMarc-André Lureau 2195a76a1f6bSPaolo Bonziniignored = ['CONFIG_QEMU_INTERP_PREFIX', # actually per-target 2196a76a1f6bSPaolo Bonzini 'HAVE_GDB_BIN'] 219787430d5bSPaolo Bonziniarrays = ['CONFIG_BDRV_RW_WHITELIST', 'CONFIG_BDRV_RO_WHITELIST'] 2198859aef02SPaolo Bonziniforeach k, v: config_host 2199765686d6SPaolo Bonzini if ignored.contains(k) 2200765686d6SPaolo Bonzini # do nothing 2201765686d6SPaolo Bonzini elif arrays.contains(k) 2202859aef02SPaolo Bonzini if v != '' 2203859aef02SPaolo Bonzini v = '"' + '", "'.join(v.split()) + '", ' 2204859aef02SPaolo Bonzini endif 2205859aef02SPaolo Bonzini config_host_data.set(k, v) 220696a63aebSPaolo Bonzini elif k.startswith('CONFIG_') 2207859aef02SPaolo Bonzini config_host_data.set(k, v == 'y' ? 1 : v) 2208859aef02SPaolo Bonzini endif 2209859aef02SPaolo Bonziniendforeach 2210859aef02SPaolo Bonzini 22116391c772SRichard Henderson# Older versions of MinGW do not import _lock_file and _unlock_file properly. 22126391c772SRichard Henderson# This was fixed for v6.0.0 with commit b48e3ac8969d. 22136391c772SRichard Hendersonif targetos == 'windows' 22146391c772SRichard Henderson config_host_data.set('HAVE__LOCK_FILE', cc.links(''' 22156391c772SRichard Henderson #include <stdio.h> 22166391c772SRichard Henderson int main(void) { 22176391c772SRichard Henderson _lock_file(NULL); 22186391c772SRichard Henderson _unlock_file(NULL); 22196391c772SRichard Henderson return 0; 22206391c772SRichard Henderson }''', name: '_lock_file and _unlock_file')) 22216391c772SRichard Hendersonendif 22226391c772SRichard Henderson 2223a0c9162cSPaolo Bonzini######################## 2224a0c9162cSPaolo Bonzini# Target configuration # 2225a0c9162cSPaolo Bonzini######################## 2226a0c9162cSPaolo Bonzini 22272becc36aSPaolo Bonziniminikconf = find_program('scripts/minikconf.py') 222805512f55SPaolo Bonziniconfig_all = {} 2229a98006bcSPaolo Bonziniconfig_all_devices = {} 2230ca0fc784SPaolo Bonziniconfig_all_disas = {} 22312becc36aSPaolo Bonziniconfig_devices_mak_list = [] 22322becc36aSPaolo Bonziniconfig_devices_h = {} 2233859aef02SPaolo Bonziniconfig_target_h = {} 22342becc36aSPaolo Bonziniconfig_target_mak = {} 2235ca0fc784SPaolo Bonzini 2236ca0fc784SPaolo Bonzinidisassemblers = { 2237ca0fc784SPaolo Bonzini 'alpha' : ['CONFIG_ALPHA_DIS'], 2238ca0fc784SPaolo Bonzini 'arm' : ['CONFIG_ARM_DIS'], 2239ca0fc784SPaolo Bonzini 'avr' : ['CONFIG_AVR_DIS'], 2240ca0fc784SPaolo Bonzini 'cris' : ['CONFIG_CRIS_DIS'], 22413e7a84eeSTaylor Simpson 'hexagon' : ['CONFIG_HEXAGON_DIS'], 2242ca0fc784SPaolo Bonzini 'hppa' : ['CONFIG_HPPA_DIS'], 2243ca0fc784SPaolo Bonzini 'i386' : ['CONFIG_I386_DIS'], 2244ca0fc784SPaolo Bonzini 'x86_64' : ['CONFIG_I386_DIS'], 2245ca0fc784SPaolo Bonzini 'm68k' : ['CONFIG_M68K_DIS'], 2246ca0fc784SPaolo Bonzini 'microblaze' : ['CONFIG_MICROBLAZE_DIS'], 2247ca0fc784SPaolo Bonzini 'mips' : ['CONFIG_MIPS_DIS'], 2248ca0fc784SPaolo Bonzini 'nios2' : ['CONFIG_NIOS2_DIS'], 2249ca0fc784SPaolo Bonzini 'or1k' : ['CONFIG_OPENRISC_DIS'], 2250ca0fc784SPaolo Bonzini 'ppc' : ['CONFIG_PPC_DIS'], 2251ca0fc784SPaolo Bonzini 'riscv' : ['CONFIG_RISCV_DIS'], 2252ca0fc784SPaolo Bonzini 'rx' : ['CONFIG_RX_DIS'], 2253ca0fc784SPaolo Bonzini 's390' : ['CONFIG_S390_DIS'], 2254ca0fc784SPaolo Bonzini 'sh4' : ['CONFIG_SH4_DIS'], 2255ca0fc784SPaolo Bonzini 'sparc' : ['CONFIG_SPARC_DIS'], 2256ca0fc784SPaolo Bonzini 'xtensa' : ['CONFIG_XTENSA_DIS'], 2257ca0fc784SPaolo Bonzini} 2258ca0fc784SPaolo Bonziniif link_language == 'cpp' 2259ca0fc784SPaolo Bonzini disassemblers += { 2260ca0fc784SPaolo Bonzini 'aarch64' : [ 'CONFIG_ARM_A64_DIS'], 2261ca0fc784SPaolo Bonzini 'arm' : [ 'CONFIG_ARM_DIS', 'CONFIG_ARM_A64_DIS'], 2262ca0fc784SPaolo Bonzini 'mips' : [ 'CONFIG_MIPS_DIS', 'CONFIG_NANOMIPS_DIS'], 2263ca0fc784SPaolo Bonzini } 2264ca0fc784SPaolo Bonziniendif 2265ca0fc784SPaolo Bonzini 2266e1fbd2c4SPaolo Bonzinihave_ivshmem = config_host_data.get('CONFIG_EVENTFD') 22670a189110SPaolo Bonzinihost_kconfig = \ 2268537b7248SPaolo Bonzini (get_option('fuzzing') ? ['CONFIG_FUZZ=y'] : []) + \ 22690d04c4c9SPaolo Bonzini (have_tpm ? ['CONFIG_TPM=y'] : []) + \ 22703f0a5d55SMarc-André Lureau (spice.found() ? ['CONFIG_SPICE=y'] : []) + \ 2271ccd250aaSPaolo Bonzini (have_ivshmem ? ['CONFIG_IVSHMEM=y'] : []) + \ 227288b6e618SPaolo Bonzini (opengl.found() ? ['CONFIG_OPENGL=y'] : []) + \ 22739d71037fSPaolo Bonzini (x11.found() ? ['CONFIG_X11=y'] : []) + \ 22740a189110SPaolo Bonzini ('CONFIG_VHOST_USER' in config_host ? ['CONFIG_VHOST_USER=y'] : []) + \ 22750a189110SPaolo Bonzini ('CONFIG_VHOST_VDPA' in config_host ? ['CONFIG_VHOST_VDPA=y'] : []) + \ 22760a189110SPaolo Bonzini ('CONFIG_VHOST_KERNEL' in config_host ? ['CONFIG_VHOST_KERNEL=y'] : []) + \ 227769202b40SPaolo Bonzini (have_virtfs ? ['CONFIG_VIRTFS=y'] : []) + \ 22780a189110SPaolo Bonzini ('CONFIG_LINUX' in config_host ? ['CONFIG_LINUX=y'] : []) + \ 22793730a734SPaolo Bonzini (have_pvrdma ? ['CONFIG_PVRDMA=y'] : []) + \ 2280106ad1f9SPaolo Bonzini (multiprocess_allowed ? ['CONFIG_MULTIPROCESS_ALLOWED=y'] : []) 22810a189110SPaolo Bonzini 2282a9a74907SPaolo Bonziniignored = [ 'TARGET_XML_FILES', 'TARGET_ABI_DIR', 'TARGET_ARCH' ] 2283ca0fc784SPaolo Bonzini 2284fdb75aefSPaolo Bonzinidefault_targets = 'CONFIG_DEFAULT_TARGETS' in config_host 2285fdb75aefSPaolo Bonziniactual_target_dirs = [] 2286fbb4121dSPaolo Bonzinifdt_required = [] 2287a81df1b6SPaolo Bonziniforeach target : target_dirs 2288765686d6SPaolo Bonzini config_target = { 'TARGET_NAME': target.split('-')[0] } 2289765686d6SPaolo Bonzini if target.endswith('linux-user') 2290fdb75aefSPaolo Bonzini if targetos != 'linux' 2291fdb75aefSPaolo Bonzini if default_targets 2292fdb75aefSPaolo Bonzini continue 2293fdb75aefSPaolo Bonzini endif 2294fdb75aefSPaolo Bonzini error('Target @0@ is only available on a Linux host'.format(target)) 2295fdb75aefSPaolo Bonzini endif 2296765686d6SPaolo Bonzini config_target += { 'CONFIG_LINUX_USER': 'y' } 2297765686d6SPaolo Bonzini elif target.endswith('bsd-user') 2298fdb75aefSPaolo Bonzini if 'CONFIG_BSD' not in config_host 2299fdb75aefSPaolo Bonzini if default_targets 2300fdb75aefSPaolo Bonzini continue 2301fdb75aefSPaolo Bonzini endif 2302fdb75aefSPaolo Bonzini error('Target @0@ is only available on a BSD host'.format(target)) 2303fdb75aefSPaolo Bonzini endif 2304765686d6SPaolo Bonzini config_target += { 'CONFIG_BSD_USER': 'y' } 2305765686d6SPaolo Bonzini elif target.endswith('softmmu') 2306765686d6SPaolo Bonzini config_target += { 'CONFIG_SOFTMMU': 'y' } 2307765686d6SPaolo Bonzini endif 2308765686d6SPaolo Bonzini if target.endswith('-user') 2309765686d6SPaolo Bonzini config_target += { 2310765686d6SPaolo Bonzini 'CONFIG_USER_ONLY': 'y', 2311765686d6SPaolo Bonzini 'CONFIG_QEMU_INTERP_PREFIX': 2312765686d6SPaolo Bonzini config_host['CONFIG_QEMU_INTERP_PREFIX'].format(config_target['TARGET_NAME']) 2313765686d6SPaolo Bonzini } 2314765686d6SPaolo Bonzini endif 2315859aef02SPaolo Bonzini 23160a189110SPaolo Bonzini accel_kconfig = [] 23178a19980eSPaolo Bonzini foreach sym: accelerators 23188a19980eSPaolo Bonzini if sym == 'CONFIG_TCG' or target in accelerator_targets.get(sym, []) 23198a19980eSPaolo Bonzini config_target += { sym: 'y' } 23208a19980eSPaolo Bonzini config_all += { sym: 'y' } 232123a77b2dSPaolo Bonzini if sym == 'CONFIG_TCG' and tcg_arch == 'tci' 232223a77b2dSPaolo Bonzini config_target += { 'CONFIG_TCG_INTERPRETER': 'y' } 23238a19980eSPaolo Bonzini endif 2324dae0ec15SGerd Hoffmann if target in modular_tcg 2325dae0ec15SGerd Hoffmann config_target += { 'CONFIG_TCG_MODULAR': 'y' } 2326dae0ec15SGerd Hoffmann else 2327dae0ec15SGerd Hoffmann config_target += { 'CONFIG_TCG_BUILTIN': 'y' } 2328dae0ec15SGerd Hoffmann endif 23290a189110SPaolo Bonzini accel_kconfig += [ sym + '=y' ] 23308a19980eSPaolo Bonzini endif 23318a19980eSPaolo Bonzini endforeach 23320a189110SPaolo Bonzini if accel_kconfig.length() == 0 2333fdb75aefSPaolo Bonzini if default_targets 2334fdb75aefSPaolo Bonzini continue 2335fdb75aefSPaolo Bonzini endif 2336fdb75aefSPaolo Bonzini error('No accelerator available for target @0@'.format(target)) 2337fdb75aefSPaolo Bonzini endif 23388a19980eSPaolo Bonzini 2339fdb75aefSPaolo Bonzini actual_target_dirs += target 2340812b31d3SAlex Bennée config_target += keyval.load('configs/targets' / target + '.mak') 2341a9a74907SPaolo Bonzini config_target += { 'TARGET_' + config_target['TARGET_ARCH'].to_upper(): 'y' } 2342765686d6SPaolo Bonzini 2343fbb4121dSPaolo Bonzini if 'TARGET_NEED_FDT' in config_target 2344fbb4121dSPaolo Bonzini fdt_required += target 2345fbb4121dSPaolo Bonzini endif 2346fbb4121dSPaolo Bonzini 2347fa73168bSPaolo Bonzini # Add default keys 2348fa73168bSPaolo Bonzini if 'TARGET_BASE_ARCH' not in config_target 2349fa73168bSPaolo Bonzini config_target += {'TARGET_BASE_ARCH': config_target['TARGET_ARCH']} 2350fa73168bSPaolo Bonzini endif 2351fa73168bSPaolo Bonzini if 'TARGET_ABI_DIR' not in config_target 2352fa73168bSPaolo Bonzini config_target += {'TARGET_ABI_DIR': config_target['TARGET_ARCH']} 2353fa73168bSPaolo Bonzini endif 2354ee3eb3a7SMarc-André Lureau if 'TARGET_BIG_ENDIAN' not in config_target 2355ee3eb3a7SMarc-André Lureau config_target += {'TARGET_BIG_ENDIAN': 'n'} 2356ee3eb3a7SMarc-André Lureau endif 2357859aef02SPaolo Bonzini 2358ca0fc784SPaolo Bonzini foreach k, v: disassemblers 2359823eb013SPaolo Bonzini if host_arch.startswith(k) or config_target['TARGET_BASE_ARCH'].startswith(k) 2360ca0fc784SPaolo Bonzini foreach sym: v 2361ca0fc784SPaolo Bonzini config_target += { sym: 'y' } 2362ca0fc784SPaolo Bonzini config_all_disas += { sym: 'y' } 2363ca0fc784SPaolo Bonzini endforeach 2364ca0fc784SPaolo Bonzini endif 2365ca0fc784SPaolo Bonzini endforeach 2366ca0fc784SPaolo Bonzini 2367859aef02SPaolo Bonzini config_target_data = configuration_data() 2368859aef02SPaolo Bonzini foreach k, v: config_target 2369859aef02SPaolo Bonzini if not k.startswith('TARGET_') and not k.startswith('CONFIG_') 2370859aef02SPaolo Bonzini # do nothing 2371859aef02SPaolo Bonzini elif ignored.contains(k) 2372859aef02SPaolo Bonzini # do nothing 2373859aef02SPaolo Bonzini elif k == 'TARGET_BASE_ARCH' 2374a9a74907SPaolo Bonzini # Note that TARGET_BASE_ARCH ends up in config-target.h but it is 2375a9a74907SPaolo Bonzini # not used to select files from sourcesets. 2376859aef02SPaolo Bonzini config_target_data.set('TARGET_' + v.to_upper(), 1) 2377765686d6SPaolo Bonzini elif k == 'TARGET_NAME' or k == 'CONFIG_QEMU_INTERP_PREFIX' 2378859aef02SPaolo Bonzini config_target_data.set_quoted(k, v) 2379859aef02SPaolo Bonzini elif v == 'y' 2380859aef02SPaolo Bonzini config_target_data.set(k, 1) 2381ee3eb3a7SMarc-André Lureau elif v == 'n' 2382ee3eb3a7SMarc-André Lureau config_target_data.set(k, 0) 2383859aef02SPaolo Bonzini else 2384859aef02SPaolo Bonzini config_target_data.set(k, v) 2385859aef02SPaolo Bonzini endif 2386859aef02SPaolo Bonzini endforeach 2387cb2c5531SPeter Maydell config_target_data.set('QEMU_ARCH', 2388cb2c5531SPeter Maydell 'QEMU_ARCH_' + config_target['TARGET_BASE_ARCH'].to_upper()) 2389859aef02SPaolo Bonzini config_target_h += {target: configure_file(output: target + '-config-target.h', 2390859aef02SPaolo Bonzini configuration: config_target_data)} 23912becc36aSPaolo Bonzini 23922becc36aSPaolo Bonzini if target.endswith('-softmmu') 2393d1d5e9eeSAlex Bennée config_input = meson.get_external_property(target, 'default') 23942becc36aSPaolo Bonzini config_devices_mak = target + '-config-devices.mak' 23952becc36aSPaolo Bonzini config_devices_mak = configure_file( 2396d1d5e9eeSAlex Bennée input: ['configs/devices' / target / config_input + '.mak', 'Kconfig'], 23972becc36aSPaolo Bonzini output: config_devices_mak, 23982becc36aSPaolo Bonzini depfile: config_devices_mak + '.d', 23992becc36aSPaolo Bonzini capture: true, 24007bc3ca7fSPaolo Bonzini command: [minikconf, 24017bc3ca7fSPaolo Bonzini get_option('default_devices') ? '--defconfig' : '--allnoconfig', 24022becc36aSPaolo Bonzini config_devices_mak, '@DEPFILE@', '@INPUT@', 2403f4063f9cSPhilippe Mathieu-Daudé host_kconfig, accel_kconfig, 2404f4063f9cSPhilippe Mathieu-Daudé 'CONFIG_' + config_target['TARGET_ARCH'].to_upper() + '=y']) 2405859aef02SPaolo Bonzini 2406859aef02SPaolo Bonzini config_devices_data = configuration_data() 2407859aef02SPaolo Bonzini config_devices = keyval.load(config_devices_mak) 2408859aef02SPaolo Bonzini foreach k, v: config_devices 2409859aef02SPaolo Bonzini config_devices_data.set(k, 1) 2410859aef02SPaolo Bonzini endforeach 24112becc36aSPaolo Bonzini config_devices_mak_list += config_devices_mak 2412859aef02SPaolo Bonzini config_devices_h += {target: configure_file(output: target + '-config-devices.h', 2413859aef02SPaolo Bonzini configuration: config_devices_data)} 2414859aef02SPaolo Bonzini config_target += config_devices 2415a98006bcSPaolo Bonzini config_all_devices += config_devices 24162becc36aSPaolo Bonzini endif 24172becc36aSPaolo Bonzini config_target_mak += {target: config_target} 2418a81df1b6SPaolo Bonziniendforeach 2419fdb75aefSPaolo Bonzinitarget_dirs = actual_target_dirs 2420a81df1b6SPaolo Bonzini 24212becc36aSPaolo Bonzini# This configuration is used to build files that are shared by 24222becc36aSPaolo Bonzini# multiple binaries, and then extracted out of the "common" 24232becc36aSPaolo Bonzini# static_library target. 24242becc36aSPaolo Bonzini# 24252becc36aSPaolo Bonzini# We do not use all_sources()/all_dependencies(), because it would 24262becc36aSPaolo Bonzini# build literally all source files, including devices only used by 24272becc36aSPaolo Bonzini# targets that are not built for this compilation. The CONFIG_ALL 24282becc36aSPaolo Bonzini# pseudo symbol replaces it. 24292becc36aSPaolo Bonzini 243005512f55SPaolo Bonziniconfig_all += config_all_devices 24312becc36aSPaolo Bonziniconfig_all += config_host 24322becc36aSPaolo Bonziniconfig_all += config_all_disas 24332becc36aSPaolo Bonziniconfig_all += { 2434*14efd8d3SPaolo Bonzini 'CONFIG_XEN': xen.found(), 24352becc36aSPaolo Bonzini 'CONFIG_SOFTMMU': have_system, 24362becc36aSPaolo Bonzini 'CONFIG_USER_ONLY': have_user, 24372becc36aSPaolo Bonzini 'CONFIG_ALL': true, 24382becc36aSPaolo Bonzini} 24392becc36aSPaolo Bonzini 2440eed56e9aSPaolo Bonzinitarget_configs_h = [] 2441eed56e9aSPaolo Bonziniforeach target: target_dirs 2442eed56e9aSPaolo Bonzini target_configs_h += config_target_h[target] 2443eed56e9aSPaolo Bonzini target_configs_h += config_devices_h.get(target, []) 2444eed56e9aSPaolo Bonziniendforeach 2445eed56e9aSPaolo Bonzinigenh += custom_target('config-poison.h', 2446eed56e9aSPaolo Bonzini input: [target_configs_h], 2447eed56e9aSPaolo Bonzini output: 'config-poison.h', 2448eed56e9aSPaolo Bonzini capture: true, 2449eed56e9aSPaolo Bonzini command: [find_program('scripts/make-config-poison.sh'), 2450eed56e9aSPaolo Bonzini target_configs_h]) 2451eed56e9aSPaolo Bonzini 2452a0c9162cSPaolo Bonzini############## 2453a0c9162cSPaolo Bonzini# Submodules # 2454a0c9162cSPaolo Bonzini############## 24558b18cdbfSRichard Henderson 24568b18cdbfSRichard Hendersoncapstone = not_found 24578b18cdbfSRichard Hendersoncapstone_opt = get_option('capstone') 24588b18cdbfSRichard Hendersonif capstone_opt in ['enabled', 'auto', 'system'] 24598b18cdbfSRichard Henderson have_internal = fs.exists(meson.current_source_dir() / 'capstone/Makefile') 2460bcf36862SRichard Henderson capstone = dependency('capstone', version: '>=4.0', 2461d7dedf42SPaolo Bonzini kwargs: static_kwargs, method: 'pkg-config', 24628b18cdbfSRichard Henderson required: capstone_opt == 'system' or 24638b18cdbfSRichard Henderson capstone_opt == 'enabled' and not have_internal) 24648f4aea71SDaniel P. Berrangé 24658f4aea71SDaniel P. Berrangé # Some versions of capstone have broken pkg-config file 24668f4aea71SDaniel P. Berrangé # that reports a wrong -I path, causing the #include to 24678f4aea71SDaniel P. Berrangé # fail later. If the system has such a broken version 24688f4aea71SDaniel P. Berrangé # do not use it. 24698f4aea71SDaniel P. Berrangé if capstone.found() and not cc.compiles('#include <capstone.h>', 24708f4aea71SDaniel P. Berrangé dependencies: [capstone]) 24718f4aea71SDaniel P. Berrangé capstone = not_found 24728f4aea71SDaniel P. Berrangé if capstone_opt == 'system' 24738f4aea71SDaniel P. Berrangé error('system capstone requested, it does not appear to work') 24748f4aea71SDaniel P. Berrangé endif 24758f4aea71SDaniel P. Berrangé endif 24768f4aea71SDaniel P. Berrangé 24778b18cdbfSRichard Henderson if capstone.found() 24788b18cdbfSRichard Henderson capstone_opt = 'system' 24798b18cdbfSRichard Henderson elif have_internal 24808b18cdbfSRichard Henderson capstone_opt = 'internal' 24818b18cdbfSRichard Henderson else 24828b18cdbfSRichard Henderson capstone_opt = 'disabled' 24838b18cdbfSRichard Henderson endif 24848b18cdbfSRichard Hendersonendif 24858b18cdbfSRichard Hendersonif capstone_opt == 'internal' 24868b18cdbfSRichard Henderson capstone_data = configuration_data() 24878b18cdbfSRichard Henderson capstone_data.set('CAPSTONE_USE_SYS_DYN_MEM', '1') 24888b18cdbfSRichard Henderson 24898b18cdbfSRichard Henderson capstone_files = files( 24908b18cdbfSRichard Henderson 'capstone/cs.c', 24918b18cdbfSRichard Henderson 'capstone/MCInst.c', 24928b18cdbfSRichard Henderson 'capstone/MCInstrDesc.c', 24938b18cdbfSRichard Henderson 'capstone/MCRegisterInfo.c', 24948b18cdbfSRichard Henderson 'capstone/SStream.c', 24958b18cdbfSRichard Henderson 'capstone/utils.c' 24968b18cdbfSRichard Henderson ) 24978b18cdbfSRichard Henderson 24988b18cdbfSRichard Henderson if 'CONFIG_ARM_DIS' in config_all_disas 24998b18cdbfSRichard Henderson capstone_data.set('CAPSTONE_HAS_ARM', '1') 25008b18cdbfSRichard Henderson capstone_files += files( 25018b18cdbfSRichard Henderson 'capstone/arch/ARM/ARMDisassembler.c', 25028b18cdbfSRichard Henderson 'capstone/arch/ARM/ARMInstPrinter.c', 25038b18cdbfSRichard Henderson 'capstone/arch/ARM/ARMMapping.c', 25048b18cdbfSRichard Henderson 'capstone/arch/ARM/ARMModule.c' 25058b18cdbfSRichard Henderson ) 25068b18cdbfSRichard Henderson endif 25078b18cdbfSRichard Henderson 25088b18cdbfSRichard Henderson # FIXME: This config entry currently depends on a c++ compiler. 25098b18cdbfSRichard Henderson # Which is needed for building libvixl, but not for capstone. 25108b18cdbfSRichard Henderson if 'CONFIG_ARM_A64_DIS' in config_all_disas 25118b18cdbfSRichard Henderson capstone_data.set('CAPSTONE_HAS_ARM64', '1') 25128b18cdbfSRichard Henderson capstone_files += files( 25138b18cdbfSRichard Henderson 'capstone/arch/AArch64/AArch64BaseInfo.c', 25148b18cdbfSRichard Henderson 'capstone/arch/AArch64/AArch64Disassembler.c', 25158b18cdbfSRichard Henderson 'capstone/arch/AArch64/AArch64InstPrinter.c', 25168b18cdbfSRichard Henderson 'capstone/arch/AArch64/AArch64Mapping.c', 25178b18cdbfSRichard Henderson 'capstone/arch/AArch64/AArch64Module.c' 25188b18cdbfSRichard Henderson ) 25198b18cdbfSRichard Henderson endif 25208b18cdbfSRichard Henderson 25218b18cdbfSRichard Henderson if 'CONFIG_PPC_DIS' in config_all_disas 25228b18cdbfSRichard Henderson capstone_data.set('CAPSTONE_HAS_POWERPC', '1') 25238b18cdbfSRichard Henderson capstone_files += files( 25248b18cdbfSRichard Henderson 'capstone/arch/PowerPC/PPCDisassembler.c', 25258b18cdbfSRichard Henderson 'capstone/arch/PowerPC/PPCInstPrinter.c', 25268b18cdbfSRichard Henderson 'capstone/arch/PowerPC/PPCMapping.c', 25278b18cdbfSRichard Henderson 'capstone/arch/PowerPC/PPCModule.c' 25288b18cdbfSRichard Henderson ) 25298b18cdbfSRichard Henderson endif 25308b18cdbfSRichard Henderson 25313d562845SRichard Henderson if 'CONFIG_S390_DIS' in config_all_disas 25323d562845SRichard Henderson capstone_data.set('CAPSTONE_HAS_SYSZ', '1') 25333d562845SRichard Henderson capstone_files += files( 25343d562845SRichard Henderson 'capstone/arch/SystemZ/SystemZDisassembler.c', 25353d562845SRichard Henderson 'capstone/arch/SystemZ/SystemZInstPrinter.c', 25363d562845SRichard Henderson 'capstone/arch/SystemZ/SystemZMapping.c', 25373d562845SRichard Henderson 'capstone/arch/SystemZ/SystemZModule.c', 25383d562845SRichard Henderson 'capstone/arch/SystemZ/SystemZMCTargetDesc.c' 25393d562845SRichard Henderson ) 25403d562845SRichard Henderson endif 25413d562845SRichard Henderson 25428b18cdbfSRichard Henderson if 'CONFIG_I386_DIS' in config_all_disas 25438b18cdbfSRichard Henderson capstone_data.set('CAPSTONE_HAS_X86', 1) 25448b18cdbfSRichard Henderson capstone_files += files( 25458b18cdbfSRichard Henderson 'capstone/arch/X86/X86Disassembler.c', 25468b18cdbfSRichard Henderson 'capstone/arch/X86/X86DisassemblerDecoder.c', 25478b18cdbfSRichard Henderson 'capstone/arch/X86/X86ATTInstPrinter.c', 25488b18cdbfSRichard Henderson 'capstone/arch/X86/X86IntelInstPrinter.c', 2549eef20e40SRichard Henderson 'capstone/arch/X86/X86InstPrinterCommon.c', 25508b18cdbfSRichard Henderson 'capstone/arch/X86/X86Mapping.c', 25518b18cdbfSRichard Henderson 'capstone/arch/X86/X86Module.c' 25528b18cdbfSRichard Henderson ) 25538b18cdbfSRichard Henderson endif 25548b18cdbfSRichard Henderson 25558b18cdbfSRichard Henderson configure_file(output: 'capstone-defs.h', configuration: capstone_data) 25568b18cdbfSRichard Henderson 25578b18cdbfSRichard Henderson capstone_cargs = [ 25588b18cdbfSRichard Henderson # FIXME: There does not seem to be a way to completely replace the c_args 25598b18cdbfSRichard Henderson # that come from add_project_arguments() -- we can only add to them. 25608b18cdbfSRichard Henderson # So: disable all warnings with a big hammer. 25618b18cdbfSRichard Henderson '-Wno-error', '-w', 25628b18cdbfSRichard Henderson 25638b18cdbfSRichard Henderson # Include all configuration defines via a header file, which will wind up 25648b18cdbfSRichard Henderson # as a dependency on the object file, and thus changes here will result 25658b18cdbfSRichard Henderson # in a rebuild. 25668b18cdbfSRichard Henderson '-include', 'capstone-defs.h' 25678b18cdbfSRichard Henderson ] 25688b18cdbfSRichard Henderson 25698b18cdbfSRichard Henderson libcapstone = static_library('capstone', 2570610e7e0eSPhilippe Mathieu-Daudé build_by_default: false, 25718b18cdbfSRichard Henderson sources: capstone_files, 25728b18cdbfSRichard Henderson c_args: capstone_cargs, 25738b18cdbfSRichard Henderson include_directories: 'capstone/include') 25748b18cdbfSRichard Henderson capstone = declare_dependency(link_with: libcapstone, 2575eef20e40SRichard Henderson include_directories: 'capstone/include/capstone') 25768b18cdbfSRichard Hendersonendif 25774d34a86bSPaolo Bonzini 25784d34a86bSPaolo Bonzinislirp = not_found 25794d34a86bSPaolo Bonzinislirp_opt = 'disabled' 25804d34a86bSPaolo Bonziniif have_system 25814d34a86bSPaolo Bonzini slirp_opt = get_option('slirp') 25824d34a86bSPaolo Bonzini if slirp_opt in ['enabled', 'auto', 'system'] 25834d34a86bSPaolo Bonzini have_internal = fs.exists(meson.current_source_dir() / 'slirp/meson.build') 2584d7dedf42SPaolo Bonzini slirp = dependency('slirp', kwargs: static_kwargs, 25854d34a86bSPaolo Bonzini method: 'pkg-config', 25864d34a86bSPaolo Bonzini required: slirp_opt == 'system' or 25874d34a86bSPaolo Bonzini slirp_opt == 'enabled' and not have_internal) 25884d34a86bSPaolo Bonzini if slirp.found() 25894d34a86bSPaolo Bonzini slirp_opt = 'system' 25904d34a86bSPaolo Bonzini elif have_internal 25914d34a86bSPaolo Bonzini slirp_opt = 'internal' 25924d34a86bSPaolo Bonzini else 25934d34a86bSPaolo Bonzini slirp_opt = 'disabled' 25944d34a86bSPaolo Bonzini endif 25954d34a86bSPaolo Bonzini endif 25964d34a86bSPaolo Bonzini if slirp_opt == 'internal' 25974d34a86bSPaolo Bonzini slirp_deps = [] 25984d34a86bSPaolo Bonzini if targetos == 'windows' 25994d34a86bSPaolo Bonzini slirp_deps = cc.find_library('iphlpapi') 260043f547b7SMarc-André Lureau elif targetos == 'darwin' 260143f547b7SMarc-André Lureau slirp_deps = cc.find_library('resolv') 26024d34a86bSPaolo Bonzini endif 26034d34a86bSPaolo Bonzini slirp_conf = configuration_data() 26044d34a86bSPaolo Bonzini slirp_conf.set('SLIRP_MAJOR_VERSION', meson.project_version().split('.')[0]) 26054d34a86bSPaolo Bonzini slirp_conf.set('SLIRP_MINOR_VERSION', meson.project_version().split('.')[1]) 26064d34a86bSPaolo Bonzini slirp_conf.set('SLIRP_MICRO_VERSION', meson.project_version().split('.')[2]) 26074d34a86bSPaolo Bonzini slirp_conf.set_quoted('SLIRP_VERSION_STRING', meson.project_version()) 26084d34a86bSPaolo Bonzini slirp_cargs = ['-DG_LOG_DOMAIN="Slirp"'] 26094d34a86bSPaolo Bonzini slirp_files = [ 26104d34a86bSPaolo Bonzini 'slirp/src/arp_table.c', 26114d34a86bSPaolo Bonzini 'slirp/src/bootp.c', 26124d34a86bSPaolo Bonzini 'slirp/src/cksum.c', 26134d34a86bSPaolo Bonzini 'slirp/src/dhcpv6.c', 26144d34a86bSPaolo Bonzini 'slirp/src/dnssearch.c', 26154d34a86bSPaolo Bonzini 'slirp/src/if.c', 26164d34a86bSPaolo Bonzini 'slirp/src/ip6_icmp.c', 26174d34a86bSPaolo Bonzini 'slirp/src/ip6_input.c', 26184d34a86bSPaolo Bonzini 'slirp/src/ip6_output.c', 26194d34a86bSPaolo Bonzini 'slirp/src/ip_icmp.c', 26204d34a86bSPaolo Bonzini 'slirp/src/ip_input.c', 26214d34a86bSPaolo Bonzini 'slirp/src/ip_output.c', 26224d34a86bSPaolo Bonzini 'slirp/src/mbuf.c', 26234d34a86bSPaolo Bonzini 'slirp/src/misc.c', 26244d34a86bSPaolo Bonzini 'slirp/src/ncsi.c', 26254d34a86bSPaolo Bonzini 'slirp/src/ndp_table.c', 26264d34a86bSPaolo Bonzini 'slirp/src/sbuf.c', 26274d34a86bSPaolo Bonzini 'slirp/src/slirp.c', 26284d34a86bSPaolo Bonzini 'slirp/src/socket.c', 26294d34a86bSPaolo Bonzini 'slirp/src/state.c', 26304d34a86bSPaolo Bonzini 'slirp/src/stream.c', 26314d34a86bSPaolo Bonzini 'slirp/src/tcp_input.c', 26324d34a86bSPaolo Bonzini 'slirp/src/tcp_output.c', 26334d34a86bSPaolo Bonzini 'slirp/src/tcp_subr.c', 26344d34a86bSPaolo Bonzini 'slirp/src/tcp_timer.c', 26354d34a86bSPaolo Bonzini 'slirp/src/tftp.c', 26364d34a86bSPaolo Bonzini 'slirp/src/udp.c', 26374d34a86bSPaolo Bonzini 'slirp/src/udp6.c', 26384d34a86bSPaolo Bonzini 'slirp/src/util.c', 26394d34a86bSPaolo Bonzini 'slirp/src/version.c', 26404d34a86bSPaolo Bonzini 'slirp/src/vmstate.c', 26414d34a86bSPaolo Bonzini ] 26424d34a86bSPaolo Bonzini 26434d34a86bSPaolo Bonzini configure_file( 26444d34a86bSPaolo Bonzini input : 'slirp/src/libslirp-version.h.in', 26454d34a86bSPaolo Bonzini output : 'libslirp-version.h', 26464d34a86bSPaolo Bonzini configuration: slirp_conf) 26474d34a86bSPaolo Bonzini 26484d34a86bSPaolo Bonzini slirp_inc = include_directories('slirp', 'slirp/src') 26494d34a86bSPaolo Bonzini libslirp = static_library('slirp', 2650610e7e0eSPhilippe Mathieu-Daudé build_by_default: false, 26514d34a86bSPaolo Bonzini sources: slirp_files, 26524d34a86bSPaolo Bonzini c_args: slirp_cargs, 26534d34a86bSPaolo Bonzini include_directories: slirp_inc) 26544d34a86bSPaolo Bonzini slirp = declare_dependency(link_with: libslirp, 26554d34a86bSPaolo Bonzini dependencies: slirp_deps, 26564d34a86bSPaolo Bonzini include_directories: slirp_inc) 26574d34a86bSPaolo Bonzini endif 26584d34a86bSPaolo Bonziniendif 26594d34a86bSPaolo Bonzini 2660c715343fSDaniele Buono# For CFI, we need to compile slirp as a static library together with qemu. 2661c715343fSDaniele Buono# This is because we register slirp functions as callbacks for QEMU Timers. 2662c715343fSDaniele Buono# When using a system-wide shared libslirp, the type information for the 2663c715343fSDaniele Buono# callback is missing and the timer call produces a false positive with CFI. 2664c715343fSDaniele Buono# 2665c715343fSDaniele Buono# Now that slirp_opt has been defined, check if the selected slirp is compatible 2666c715343fSDaniele Buono# with control-flow integrity. 2667c715343fSDaniele Buonoif get_option('cfi') and slirp_opt == 'system' 2668c715343fSDaniele Buono error('Control-Flow Integrity is not compatible with system-wide slirp.' \ 2669c715343fSDaniele Buono + ' Please configure with --enable-slirp=git') 2670c715343fSDaniele Buonoendif 2671c715343fSDaniele Buono 2672fbb4121dSPaolo Bonzinifdt = not_found 2673fbb4121dSPaolo Bonziniif have_system 2674c593d841SPhilippe Mathieu-Daudé fdt_opt = get_option('fdt') 2675fbb4121dSPaolo Bonzini if fdt_opt in ['enabled', 'auto', 'system'] 2676fbb4121dSPaolo Bonzini have_internal = fs.exists(meson.current_source_dir() / 'dtc/libfdt/Makefile.libfdt') 2677d7dedf42SPaolo Bonzini fdt = cc.find_library('fdt', kwargs: static_kwargs, 2678fbb4121dSPaolo Bonzini required: fdt_opt == 'system' or 2679fbb4121dSPaolo Bonzini fdt_opt == 'enabled' and not have_internal) 2680fbb4121dSPaolo Bonzini if fdt.found() and cc.links(''' 2681fbb4121dSPaolo Bonzini #include <libfdt.h> 2682fbb4121dSPaolo Bonzini #include <libfdt_env.h> 2683de47b0ffSThomas Huth int main(void) { fdt_find_max_phandle(NULL, NULL); return 0; }''', 2684fbb4121dSPaolo Bonzini dependencies: fdt) 2685fbb4121dSPaolo Bonzini fdt_opt = 'system' 26866c22853cSThomas Huth elif fdt_opt == 'system' 26876c22853cSThomas Huth error('system libfdt requested, but it is too old (1.5.1 or newer required)') 2688fbb4121dSPaolo Bonzini elif have_internal 2689fbb4121dSPaolo Bonzini fdt_opt = 'internal' 2690fbb4121dSPaolo Bonzini else 2691fbb4121dSPaolo Bonzini fdt_opt = 'disabled' 269287daf898SThomas Huth fdt = not_found 2693fbb4121dSPaolo Bonzini endif 2694fbb4121dSPaolo Bonzini endif 2695fbb4121dSPaolo Bonzini if fdt_opt == 'internal' 2696fbb4121dSPaolo Bonzini fdt_files = files( 2697fbb4121dSPaolo Bonzini 'dtc/libfdt/fdt.c', 2698fbb4121dSPaolo Bonzini 'dtc/libfdt/fdt_ro.c', 2699fbb4121dSPaolo Bonzini 'dtc/libfdt/fdt_wip.c', 2700fbb4121dSPaolo Bonzini 'dtc/libfdt/fdt_sw.c', 2701fbb4121dSPaolo Bonzini 'dtc/libfdt/fdt_rw.c', 2702fbb4121dSPaolo Bonzini 'dtc/libfdt/fdt_strerror.c', 2703fbb4121dSPaolo Bonzini 'dtc/libfdt/fdt_empty_tree.c', 2704fbb4121dSPaolo Bonzini 'dtc/libfdt/fdt_addresses.c', 2705fbb4121dSPaolo Bonzini 'dtc/libfdt/fdt_overlay.c', 2706fbb4121dSPaolo Bonzini 'dtc/libfdt/fdt_check.c', 2707fbb4121dSPaolo Bonzini ) 2708fbb4121dSPaolo Bonzini 2709fbb4121dSPaolo Bonzini fdt_inc = include_directories('dtc/libfdt') 2710fbb4121dSPaolo Bonzini libfdt = static_library('fdt', 2711610e7e0eSPhilippe Mathieu-Daudé build_by_default: false, 2712fbb4121dSPaolo Bonzini sources: fdt_files, 2713fbb4121dSPaolo Bonzini include_directories: fdt_inc) 2714fbb4121dSPaolo Bonzini fdt = declare_dependency(link_with: libfdt, 2715fbb4121dSPaolo Bonzini include_directories: fdt_inc) 2716fbb4121dSPaolo Bonzini endif 2717c593d841SPhilippe Mathieu-Daudéelse 2718c593d841SPhilippe Mathieu-Daudé fdt_opt = 'disabled' 2719fbb4121dSPaolo Bonziniendif 2720fbb4121dSPaolo Bonziniif not fdt.found() and fdt_required.length() > 0 2721fbb4121dSPaolo Bonzini error('fdt not available but required by targets ' + ', '.join(fdt_required)) 2722fbb4121dSPaolo Bonziniendif 2723fbb4121dSPaolo Bonzini 27248b18cdbfSRichard Hendersonconfig_host_data.set('CONFIG_CAPSTONE', capstone.found()) 2725fbb4121dSPaolo Bonziniconfig_host_data.set('CONFIG_FDT', fdt.found()) 27264d34a86bSPaolo Bonziniconfig_host_data.set('CONFIG_SLIRP', slirp.found()) 27278b18cdbfSRichard Henderson 2728a0c9162cSPaolo Bonzini##################### 2729a0c9162cSPaolo Bonzini# Generated sources # 2730a0c9162cSPaolo Bonzini##################### 27318b18cdbfSRichard Henderson 2732a0c9162cSPaolo Bonzinigenh += configure_file(output: 'config-host.h', configuration: config_host_data) 2733a81df1b6SPaolo Bonzini 27343f885659SMarc-André Lureauhxtool = find_program('scripts/hxtool') 2735650b5d54SMarc-André Lureaushaderinclude = find_program('scripts/shaderinclude.pl') 2736a81df1b6SPaolo Bonziniqapi_gen = find_program('scripts/qapi-gen.py') 2737654d6b04SPaolo Bonziniqapi_gen_depends = [ meson.current_source_dir() / 'scripts/qapi/__init__.py', 2738654d6b04SPaolo Bonzini meson.current_source_dir() / 'scripts/qapi/commands.py', 2739654d6b04SPaolo Bonzini meson.current_source_dir() / 'scripts/qapi/common.py', 2740654d6b04SPaolo Bonzini meson.current_source_dir() / 'scripts/qapi/error.py', 2741654d6b04SPaolo Bonzini meson.current_source_dir() / 'scripts/qapi/events.py', 2742654d6b04SPaolo Bonzini meson.current_source_dir() / 'scripts/qapi/expr.py', 2743654d6b04SPaolo Bonzini meson.current_source_dir() / 'scripts/qapi/gen.py', 2744654d6b04SPaolo Bonzini meson.current_source_dir() / 'scripts/qapi/introspect.py', 2745654d6b04SPaolo Bonzini meson.current_source_dir() / 'scripts/qapi/parser.py', 2746654d6b04SPaolo Bonzini meson.current_source_dir() / 'scripts/qapi/schema.py', 2747654d6b04SPaolo Bonzini meson.current_source_dir() / 'scripts/qapi/source.py', 2748654d6b04SPaolo Bonzini meson.current_source_dir() / 'scripts/qapi/types.py', 2749654d6b04SPaolo Bonzini meson.current_source_dir() / 'scripts/qapi/visit.py', 2750654d6b04SPaolo Bonzini meson.current_source_dir() / 'scripts/qapi/common.py', 2751654d6b04SPaolo Bonzini meson.current_source_dir() / 'scripts/qapi-gen.py' 2752a81df1b6SPaolo Bonzini] 2753a81df1b6SPaolo Bonzini 2754a81df1b6SPaolo Bonzinitracetool = [ 2755a81df1b6SPaolo Bonzini python, files('scripts/tracetool.py'), 27569c29b741SPaolo Bonzini '--backend=' + ','.join(get_option('trace_backends')) 2757a81df1b6SPaolo Bonzini] 27580572d6cdSStefan Hajnoczitracetool_depends = files( 27590572d6cdSStefan Hajnoczi 'scripts/tracetool/backend/log.py', 27600572d6cdSStefan Hajnoczi 'scripts/tracetool/backend/__init__.py', 27610572d6cdSStefan Hajnoczi 'scripts/tracetool/backend/dtrace.py', 27620572d6cdSStefan Hajnoczi 'scripts/tracetool/backend/ftrace.py', 27630572d6cdSStefan Hajnoczi 'scripts/tracetool/backend/simple.py', 27640572d6cdSStefan Hajnoczi 'scripts/tracetool/backend/syslog.py', 27650572d6cdSStefan Hajnoczi 'scripts/tracetool/backend/ust.py', 27660572d6cdSStefan Hajnoczi 'scripts/tracetool/format/ust_events_c.py', 27670572d6cdSStefan Hajnoczi 'scripts/tracetool/format/ust_events_h.py', 27680572d6cdSStefan Hajnoczi 'scripts/tracetool/format/__init__.py', 27690572d6cdSStefan Hajnoczi 'scripts/tracetool/format/d.py', 27700572d6cdSStefan Hajnoczi 'scripts/tracetool/format/simpletrace_stap.py', 27710572d6cdSStefan Hajnoczi 'scripts/tracetool/format/c.py', 27720572d6cdSStefan Hajnoczi 'scripts/tracetool/format/h.py', 27730572d6cdSStefan Hajnoczi 'scripts/tracetool/format/log_stap.py', 27740572d6cdSStefan Hajnoczi 'scripts/tracetool/format/stap.py', 27750572d6cdSStefan Hajnoczi 'scripts/tracetool/__init__.py', 27760572d6cdSStefan Hajnoczi 'scripts/tracetool/transform.py', 27770572d6cdSStefan Hajnoczi 'scripts/tracetool/vcpu.py' 27780572d6cdSStefan Hajnoczi) 2779a81df1b6SPaolo Bonzini 27802c273f32SMarc-André Lureauqemu_version_cmd = [find_program('scripts/qemu-version.sh'), 27812c273f32SMarc-André Lureau meson.current_source_dir(), 2782859aef02SPaolo Bonzini config_host['PKGVERSION'], meson.project_version()] 27832c273f32SMarc-André Lureauqemu_version = custom_target('qemu-version.h', 27842c273f32SMarc-André Lureau output: 'qemu-version.h', 27852c273f32SMarc-André Lureau command: qemu_version_cmd, 27862c273f32SMarc-André Lureau capture: true, 27872c273f32SMarc-André Lureau build_by_default: true, 27882c273f32SMarc-André Lureau build_always_stale: true) 27892c273f32SMarc-André Lureaugenh += qemu_version 27902c273f32SMarc-André Lureau 27913f885659SMarc-André Lureauhxdep = [] 27923f885659SMarc-André Lureauhx_headers = [ 27933f885659SMarc-André Lureau ['qemu-options.hx', 'qemu-options.def'], 27943f885659SMarc-André Lureau ['qemu-img-cmds.hx', 'qemu-img-cmds.h'], 27953f885659SMarc-André Lureau] 27963f885659SMarc-André Lureauif have_system 27973f885659SMarc-André Lureau hx_headers += [ 27983f885659SMarc-André Lureau ['hmp-commands.hx', 'hmp-commands.h'], 27993f885659SMarc-André Lureau ['hmp-commands-info.hx', 'hmp-commands-info.h'], 28003f885659SMarc-André Lureau ] 28013f885659SMarc-André Lureauendif 28023f885659SMarc-André Lureauforeach d : hx_headers 2803b7c70bf2SMarc-André Lureau hxdep += custom_target(d[1], 28043f885659SMarc-André Lureau input: files(d[0]), 28053f885659SMarc-André Lureau output: d[1], 28063f885659SMarc-André Lureau capture: true, 28073f885659SMarc-André Lureau build_by_default: true, # to be removed when added to a target 28083f885659SMarc-André Lureau command: [hxtool, '-h', '@INPUT0@']) 28093f885659SMarc-André Lureauendforeach 28103f885659SMarc-André Lureaugenh += hxdep 28113f885659SMarc-André Lureau 2812a0c9162cSPaolo Bonzini################### 2813a0c9162cSPaolo Bonzini# Collect sources # 2814a0c9162cSPaolo Bonzini################### 2815a81df1b6SPaolo Bonzini 281655567891SPhilippe Mathieu-Daudéauthz_ss = ss.source_set() 28177e2b888fSPhilippe Mathieu-Daudéblockdev_ss = ss.source_set() 28187e2b888fSPhilippe Mathieu-Daudéblock_ss = ss.source_set() 2819c2306d71SPhilippe Mathieu-Daudéchardev_ss = ss.source_set() 28207e2b888fSPhilippe Mathieu-Daudécommon_ss = ss.source_set() 28212389304aSPhilippe Mathieu-Daudécrypto_ss = ss.source_set() 2822f73fb063SPhilippe Mathieu-Daudéhwcore_ss = ss.source_set() 2823f78536b1SPhilippe Mathieu-Daudéio_ss = ss.source_set() 28247e2b888fSPhilippe Mathieu-Daudéqmp_ss = ss.source_set() 2825da33fc09SPhilippe Mathieu-Daudéqom_ss = ss.source_set() 28267e2b888fSPhilippe Mathieu-Daudésoftmmu_ss = ss.source_set() 28277e2b888fSPhilippe Mathieu-Daudéspecific_fuzz_ss = ss.source_set() 28287e2b888fSPhilippe Mathieu-Daudéspecific_ss = ss.source_set() 2829a81df1b6SPaolo Bonzinistub_ss = ss.source_set() 2830a81df1b6SPaolo Bonzinitrace_ss = ss.source_set() 28312becc36aSPaolo Bonziniuser_ss = ss.source_set() 28327e2b888fSPhilippe Mathieu-Daudéutil_ss = ss.source_set() 28332becc36aSPaolo Bonzini 2834c94a7b88SGerd Hoffmann# accel modules 2835c94a7b88SGerd Hoffmannqtest_module_ss = ss.source_set() 2836dae0ec15SGerd Hoffmanntcg_module_ss = ss.source_set() 2837c94a7b88SGerd Hoffmann 28383154fee4SMarc-André Lureaumodules = {} 2839db2e89dfSGerd Hoffmanntarget_modules = {} 28402becc36aSPaolo Bonzinihw_arch = {} 28412becc36aSPaolo Bonzinitarget_arch = {} 28422becc36aSPaolo Bonzinitarget_softmmu_arch = {} 284346369b50SPhilippe Mathieu-Daudétarget_user_arch = {} 2844a81df1b6SPaolo Bonzini 2845a81df1b6SPaolo Bonzini############### 2846a81df1b6SPaolo Bonzini# Trace files # 2847a81df1b6SPaolo Bonzini############### 2848a81df1b6SPaolo Bonzini 2849c9322ab5SMarc-André Lureau# TODO: add each directory to the subdirs from its own meson.build, once 2850c9322ab5SMarc-André Lureau# we have those 2851a81df1b6SPaolo Bonzinitrace_events_subdirs = [ 2852a81df1b6SPaolo Bonzini 'crypto', 285369ff4d0aSPhilippe Mathieu-Daudé 'qapi', 285469ff4d0aSPhilippe Mathieu-Daudé 'qom', 2855a81df1b6SPaolo Bonzini 'monitor', 285669ff4d0aSPhilippe Mathieu-Daudé 'util', 2857a81df1b6SPaolo Bonzini] 28586ddc1abeSWarner Loshif have_linux_user 2859a81df1b6SPaolo Bonzini trace_events_subdirs += [ 'linux-user' ] 2860a81df1b6SPaolo Bonziniendif 28616ddc1abeSWarner Loshif have_bsd_user 28626ddc1abeSWarner Losh trace_events_subdirs += [ 'bsd-user' ] 28636ddc1abeSWarner Loshendif 2864a81df1b6SPaolo Bonziniif have_block 2865a81df1b6SPaolo Bonzini trace_events_subdirs += [ 2866a81df1b6SPaolo Bonzini 'authz', 2867a81df1b6SPaolo Bonzini 'block', 2868a81df1b6SPaolo Bonzini 'io', 2869a81df1b6SPaolo Bonzini 'nbd', 2870a81df1b6SPaolo Bonzini 'scsi', 2871a81df1b6SPaolo Bonzini ] 2872a81df1b6SPaolo Bonziniendif 2873a81df1b6SPaolo Bonziniif have_system 2874a81df1b6SPaolo Bonzini trace_events_subdirs += [ 28758985db26SPhilippe Mathieu-Daudé 'accel/kvm', 2876a81df1b6SPaolo Bonzini 'audio', 2877a81df1b6SPaolo Bonzini 'backends', 2878a81df1b6SPaolo Bonzini 'backends/tpm', 2879a81df1b6SPaolo Bonzini 'chardev', 288046627f41SAndrew Melnychenko 'ebpf', 2881a81df1b6SPaolo Bonzini 'hw/9pfs', 2882a81df1b6SPaolo Bonzini 'hw/acpi', 288377c05b0bSHao Wu 'hw/adc', 2884a81df1b6SPaolo Bonzini 'hw/alpha', 2885a81df1b6SPaolo Bonzini 'hw/arm', 2886a81df1b6SPaolo Bonzini 'hw/audio', 2887a81df1b6SPaolo Bonzini 'hw/block', 2888a81df1b6SPaolo Bonzini 'hw/block/dataplane', 2889a81df1b6SPaolo Bonzini 'hw/char', 2890a81df1b6SPaolo Bonzini 'hw/display', 2891a81df1b6SPaolo Bonzini 'hw/dma', 2892a81df1b6SPaolo Bonzini 'hw/hppa', 2893a81df1b6SPaolo Bonzini 'hw/hyperv', 2894a81df1b6SPaolo Bonzini 'hw/i2c', 2895a81df1b6SPaolo Bonzini 'hw/i386', 2896a81df1b6SPaolo Bonzini 'hw/i386/xen', 2897a81df1b6SPaolo Bonzini 'hw/ide', 2898a81df1b6SPaolo Bonzini 'hw/input', 2899a81df1b6SPaolo Bonzini 'hw/intc', 2900a81df1b6SPaolo Bonzini 'hw/isa', 2901a81df1b6SPaolo Bonzini 'hw/mem', 2902a81df1b6SPaolo Bonzini 'hw/mips', 2903a81df1b6SPaolo Bonzini 'hw/misc', 2904a81df1b6SPaolo Bonzini 'hw/misc/macio', 2905a81df1b6SPaolo Bonzini 'hw/net', 290698e5d7a2SVikram Garhwal 'hw/net/can', 2907ce0e6a2cSMark Cave-Ayland 'hw/nubus', 290888eea45cSKlaus Jensen 'hw/nvme', 2909a81df1b6SPaolo Bonzini 'hw/nvram', 2910a81df1b6SPaolo Bonzini 'hw/pci', 2911a81df1b6SPaolo Bonzini 'hw/pci-host', 2912a81df1b6SPaolo Bonzini 'hw/ppc', 2913a81df1b6SPaolo Bonzini 'hw/rdma', 2914a81df1b6SPaolo Bonzini 'hw/rdma/vmw', 2915a81df1b6SPaolo Bonzini 'hw/rtc', 2916a81df1b6SPaolo Bonzini 'hw/s390x', 2917a81df1b6SPaolo Bonzini 'hw/scsi', 2918a81df1b6SPaolo Bonzini 'hw/sd', 2919ad52cfc1SBALATON Zoltan 'hw/sh4', 2920a81df1b6SPaolo Bonzini 'hw/sparc', 2921a81df1b6SPaolo Bonzini 'hw/sparc64', 2922a81df1b6SPaolo Bonzini 'hw/ssi', 2923a81df1b6SPaolo Bonzini 'hw/timer', 2924a81df1b6SPaolo Bonzini 'hw/tpm', 2925a81df1b6SPaolo Bonzini 'hw/usb', 2926a81df1b6SPaolo Bonzini 'hw/vfio', 2927a81df1b6SPaolo Bonzini 'hw/virtio', 2928a81df1b6SPaolo Bonzini 'hw/watchdog', 2929a81df1b6SPaolo Bonzini 'hw/xen', 2930a81df1b6SPaolo Bonzini 'hw/gpio', 2931a81df1b6SPaolo Bonzini 'migration', 2932a81df1b6SPaolo Bonzini 'net', 29338b7a5507SPhilippe Mathieu-Daudé 'softmmu', 2934a81df1b6SPaolo Bonzini 'ui', 2935ad22c308SElena Ufimtseva 'hw/remote', 2936a81df1b6SPaolo Bonzini ] 2937a81df1b6SPaolo Bonziniendif 29388985db26SPhilippe Mathieu-Daudéif have_system or have_user 29398985db26SPhilippe Mathieu-Daudé trace_events_subdirs += [ 29408985db26SPhilippe Mathieu-Daudé 'accel/tcg', 29418985db26SPhilippe Mathieu-Daudé 'hw/core', 29428985db26SPhilippe Mathieu-Daudé 'target/arm', 2943a1477da3SAlexander Graf 'target/arm/hvf', 29448985db26SPhilippe Mathieu-Daudé 'target/hppa', 29458985db26SPhilippe Mathieu-Daudé 'target/i386', 29468985db26SPhilippe Mathieu-Daudé 'target/i386/kvm', 294734b8ff25SPhilippe Mathieu-Daudé 'target/mips/tcg', 29486f83e277SRichard Henderson 'target/nios2', 29498985db26SPhilippe Mathieu-Daudé 'target/ppc', 29508985db26SPhilippe Mathieu-Daudé 'target/riscv', 29518985db26SPhilippe Mathieu-Daudé 'target/s390x', 295267043607SCho, Yu-Chen 'target/s390x/kvm', 29538985db26SPhilippe Mathieu-Daudé 'target/sparc', 29548985db26SPhilippe Mathieu-Daudé ] 29558985db26SPhilippe Mathieu-Daudéendif 2956a81df1b6SPaolo Bonzini 29570df750e9SMarc-André Lureauvhost_user = not_found 2958eb9baecdSSergio Lopezif targetos == 'linux' and 'CONFIG_VHOST_USER' in config_host 29590df750e9SMarc-André Lureau libvhost_user = subproject('libvhost-user') 29600df750e9SMarc-André Lureau vhost_user = libvhost_user.get_variable('vhost_user_dep') 29610df750e9SMarc-André Lureauendif 29620df750e9SMarc-André Lureau 2963b83a80e8SVladimir Sementsov-Ogievskiy# NOTE: the trace/ subdirectory needs the qapi_trace_events variable 2964b83a80e8SVladimir Sementsov-Ogievskiy# that is filled in by qapi/. 2965a81df1b6SPaolo Bonzinisubdir('qapi') 2966a81df1b6SPaolo Bonzinisubdir('qobject') 2967a81df1b6SPaolo Bonzinisubdir('stubs') 2968a81df1b6SPaolo Bonzinisubdir('trace') 2969a81df1b6SPaolo Bonzinisubdir('util') 29705582c58fSMarc-André Lureausubdir('qom') 29715582c58fSMarc-André Lureausubdir('authz') 2972a81df1b6SPaolo Bonzinisubdir('crypto') 29732d78b56eSMarc-André Lureausubdir('ui') 2974a81df1b6SPaolo Bonzini 29753154fee4SMarc-André Lureau 29763154fee4SMarc-André Lureauif enable_modules 29773154fee4SMarc-André Lureau libmodulecommon = static_library('module-common', files('module-common.c') + genh, pic: true, c_args: '-DBUILD_DSO') 29783154fee4SMarc-André Lureau modulecommon = declare_dependency(link_whole: libmodulecommon, compile_args: '-DBUILD_DSO') 29793154fee4SMarc-André Lureauendif 29803154fee4SMarc-André Lureau 29812becc36aSPaolo Bonzinistub_ss = stub_ss.apply(config_all, strict: false) 2982a81df1b6SPaolo Bonzini 2983a81df1b6SPaolo Bonziniutil_ss.add_all(trace_ss) 29842becc36aSPaolo Bonziniutil_ss = util_ss.apply(config_all, strict: false) 2985a81df1b6SPaolo Bonzinilibqemuutil = static_library('qemuutil', 2986a81df1b6SPaolo Bonzini sources: util_ss.sources() + stub_ss.sources() + genh, 29876d7c7c2dSPaolo Bonzini dependencies: [util_ss.dependencies(), libm, threads, glib, socket, malloc, pixman]) 2988a81df1b6SPaolo Bonziniqemuutil = declare_dependency(link_with: libqemuutil, 298904c6f1e7SMarc-André Lureau sources: genh + version_res) 2990a81df1b6SPaolo Bonzini 2991957b31f6SPhilippe Mathieu-Daudéif have_system or have_user 2992abff1abfSPaolo Bonzini decodetree = generator(find_program('scripts/decodetree.py'), 2993abff1abfSPaolo Bonzini output: 'decode-@BASENAME@.c.inc', 2994abff1abfSPaolo Bonzini arguments: ['@INPUT@', '@EXTRA_ARGS@', '-o', '@OUTPUT@']) 2995957b31f6SPhilippe Mathieu-Daudé subdir('libdecnumber') 2996957b31f6SPhilippe Mathieu-Daudé subdir('target') 2997957b31f6SPhilippe Mathieu-Daudéendif 2998abff1abfSPaolo Bonzini 2999478e943fSPaolo Bonzinisubdir('audio') 30007fcfd456SMarc-André Lureausubdir('io') 3001848e8ff6SMarc-André Lureausubdir('chardev') 3002ec0d5893SMarc-André Lureausubdir('fsdev') 3003708eab42SMarc-André Lureausubdir('dump') 3004ec0d5893SMarc-André Lureau 3005f285bd3fSPhilippe Mathieu-Daudéif have_block 30065e5733e5SMarc-André Lureau block_ss.add(files( 30075e5733e5SMarc-André Lureau 'block.c', 30085e5733e5SMarc-André Lureau 'blockjob.c', 30095e5733e5SMarc-André Lureau 'job.c', 30105e5733e5SMarc-André Lureau 'qemu-io-cmds.c', 30115e5733e5SMarc-André Lureau )) 3012406523f6SPaolo Bonzini if config_host_data.get('CONFIG_REPLICATION') 3013406523f6SPaolo Bonzini block_ss.add(files('replication.c')) 3014406523f6SPaolo Bonzini endif 30155e5733e5SMarc-André Lureau 30165e5733e5SMarc-André Lureau subdir('nbd') 30175e5733e5SMarc-André Lureau subdir('scsi') 30185e5733e5SMarc-André Lureau subdir('block') 30195e5733e5SMarc-André Lureau 30204a96337dSPaolo Bonzini blockdev_ss.add(files( 30214a96337dSPaolo Bonzini 'blockdev.c', 3022cbc20bfbSStefan Hajnoczi 'blockdev-nbd.c', 30234a96337dSPaolo Bonzini 'iothread.c', 30244a96337dSPaolo Bonzini 'job-qmp.c', 30253eacf70bSRoman Bolshakov ), gnutls) 30264a96337dSPaolo Bonzini 30274a96337dSPaolo Bonzini # os-posix.c contains POSIX-specific functions used by qemu-storage-daemon, 30284a96337dSPaolo Bonzini # os-win32.c does not 30294a96337dSPaolo Bonzini blockdev_ss.add(when: 'CONFIG_POSIX', if_true: files('os-posix.c')) 30304a96337dSPaolo Bonzini softmmu_ss.add(when: 'CONFIG_WIN32', if_true: [files('os-win32.c')]) 3031f285bd3fSPhilippe Mathieu-Daudéendif 30324a96337dSPaolo Bonzini 30334a96337dSPaolo Bonzinicommon_ss.add(files('cpus-common.c')) 30344a96337dSPaolo Bonzini 30355d3ea0e1SPaolo Bonzinisubdir('softmmu') 3036c9322ab5SMarc-André Lureau 3037f343346bSRichard Hendersoncommon_ss.add(capstone) 3038d9f24bf5SPaolo Bonzinispecific_ss.add(files('cpu.c', 'disas.c', 'gdbstub.c'), capstone) 3039c9322ab5SMarc-André Lureau 304044b99a6dSRichard Henderson# Work around a gcc bug/misfeature wherein constant propagation looks 304144b99a6dSRichard Henderson# through an alias: 304244b99a6dSRichard Henderson# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99696 304344b99a6dSRichard Henderson# to guess that a const variable is always zero. Without lto, this is 304444b99a6dSRichard Henderson# impossible, as the alias is restricted to page-vary-common.c. Indeed, 304544b99a6dSRichard Henderson# without lto, not even the alias is required -- we simply use different 304644b99a6dSRichard Henderson# declarations in different compilation units. 304744b99a6dSRichard Hendersonpagevary = files('page-vary-common.c') 304844b99a6dSRichard Hendersonif get_option('b_lto') 304944b99a6dSRichard Henderson pagevary_flags = ['-fno-lto'] 305044b99a6dSRichard Henderson if get_option('cfi') 305144b99a6dSRichard Henderson pagevary_flags += '-fno-sanitize=cfi-icall' 305244b99a6dSRichard Henderson endif 305354c9b194SThomas Huth pagevary = static_library('page-vary-common', sources: pagevary + genh, 305444b99a6dSRichard Henderson c_args: pagevary_flags) 305544b99a6dSRichard Henderson pagevary = declare_dependency(link_with: pagevary) 305644b99a6dSRichard Hendersonendif 305744b99a6dSRichard Hendersoncommon_ss.add(pagevary) 30586670d4d0SRichard Hendersonspecific_ss.add(files('page-vary.c')) 30596670d4d0SRichard Henderson 3060ab318051SMarc-André Lureausubdir('backends') 3061c574e161SMarc-André Lureausubdir('disas') 306255166230SMarc-André Lureausubdir('migration') 3063ff219dcaSPaolo Bonzinisubdir('monitor') 3064cdaf0722SMarc-André Lureausubdir('net') 306517ef2af6SMarc-André Lureausubdir('replay') 30668df9f0c3SPhilippe Mathieu-Daudésubdir('semihosting') 3067582ea95fSMarc-André Lureausubdir('hw') 3068104cc2c0SRichard Hendersonsubdir('tcg') 3069c6347541SRichard Hendersonsubdir('fpu') 30701a82878aSMarc-André Lureausubdir('accel') 3071f556b4a1SPaolo Bonzinisubdir('plugins') 3072bbf15aafSRichard Hendersonsubdir('ebpf') 3073bbf15aafSRichard Henderson 3074bbf15aafSRichard Hendersoncommon_user_inc = [] 3075bbf15aafSRichard Henderson 3076bbf15aafSRichard Hendersonsubdir('common-user') 3077b309c321SMarc-André Lureausubdir('bsd-user') 30783a30446aSMarc-André Lureausubdir('linux-user') 307946627f41SAndrew Melnychenko 3080a2ce7dbdSPaolo Bonzini# needed for fuzzing binaries 3081a2ce7dbdSPaolo Bonzinisubdir('tests/qtest/libqos') 308264ed6f92SPaolo Bonzinisubdir('tests/qtest/fuzz') 3083a2ce7dbdSPaolo Bonzini 3084c94a7b88SGerd Hoffmann# accel modules 3085dae0ec15SGerd Hoffmanntcg_real_module_ss = ss.source_set() 3086dae0ec15SGerd Hoffmanntcg_real_module_ss.add_all(when: 'CONFIG_TCG_MODULAR', if_true: tcg_module_ss) 3087dae0ec15SGerd Hoffmannspecific_ss.add_all(when: 'CONFIG_TCG_BUILTIN', if_true: tcg_module_ss) 3088dae0ec15SGerd Hoffmanntarget_modules += { 'accel' : { 'qtest': qtest_module_ss, 3089dae0ec15SGerd Hoffmann 'tcg': tcg_real_module_ss }} 3090c94a7b88SGerd Hoffmann 3091a0c9162cSPaolo Bonzini######################## 3092a0c9162cSPaolo Bonzini# Library dependencies # 3093a0c9162cSPaolo Bonzini######################## 3094a0c9162cSPaolo Bonzini 3095f5723ab6SGerd Hoffmannmodinfo_collect = find_program('scripts/modinfo-collect.py') 30965ebbfeccSGerd Hoffmannmodinfo_generate = find_program('scripts/modinfo-generate.py') 3097f5723ab6SGerd Hoffmannmodinfo_files = [] 3098f5723ab6SGerd Hoffmann 30993154fee4SMarc-André Lureaublock_mods = [] 31003154fee4SMarc-André Lureausoftmmu_mods = [] 31013154fee4SMarc-André Lureauforeach d, list : modules 31023154fee4SMarc-André Lureau foreach m, module_ss : list 31033154fee4SMarc-André Lureau if enable_modules and targetos != 'windows' 31043e292c51SGerd Hoffmann module_ss = module_ss.apply(config_all, strict: false) 31053154fee4SMarc-André Lureau sl = static_library(d + '-' + m, [genh, module_ss.sources()], 31063154fee4SMarc-André Lureau dependencies: [modulecommon, module_ss.dependencies()], pic: true) 31073154fee4SMarc-André Lureau if d == 'block' 31083154fee4SMarc-André Lureau block_mods += sl 31093154fee4SMarc-André Lureau else 31103154fee4SMarc-André Lureau softmmu_mods += sl 31113154fee4SMarc-André Lureau endif 3112f5723ab6SGerd Hoffmann if module_ss.sources() != [] 3113f5723ab6SGerd Hoffmann # FIXME: Should use sl.extract_all_objects(recursive: true) as 3114f5723ab6SGerd Hoffmann # input. Sources can be used multiple times but objects are 3115f5723ab6SGerd Hoffmann # unique when it comes to lookup in compile_commands.json. 3116f5723ab6SGerd Hoffmann # Depnds on a mesion version with 3117f5723ab6SGerd Hoffmann # https://github.com/mesonbuild/meson/pull/8900 3118f5723ab6SGerd Hoffmann modinfo_files += custom_target(d + '-' + m + '.modinfo', 3119f5723ab6SGerd Hoffmann output: d + '-' + m + '.modinfo', 3120ac347111SPaolo Bonzini input: module_ss.sources() + genh, 3121f5723ab6SGerd Hoffmann capture: true, 3122ac347111SPaolo Bonzini command: [modinfo_collect, module_ss.sources()]) 3123f5723ab6SGerd Hoffmann endif 31243154fee4SMarc-André Lureau else 31253154fee4SMarc-André Lureau if d == 'block' 31263154fee4SMarc-André Lureau block_ss.add_all(module_ss) 31273154fee4SMarc-André Lureau else 31283154fee4SMarc-André Lureau softmmu_ss.add_all(module_ss) 31293154fee4SMarc-André Lureau endif 31303154fee4SMarc-André Lureau endif 31313154fee4SMarc-André Lureau endforeach 31323154fee4SMarc-André Lureauendforeach 31333154fee4SMarc-André Lureau 3134db2e89dfSGerd Hoffmannforeach d, list : target_modules 3135db2e89dfSGerd Hoffmann foreach m, module_ss : list 3136db2e89dfSGerd Hoffmann if enable_modules and targetos != 'windows' 3137db2e89dfSGerd Hoffmann foreach target : target_dirs 3138db2e89dfSGerd Hoffmann if target.endswith('-softmmu') 3139db2e89dfSGerd Hoffmann config_target = config_target_mak[target] 3140db2e89dfSGerd Hoffmann config_target += config_host 3141db2e89dfSGerd Hoffmann target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])] 3142db2e89dfSGerd Hoffmann c_args = ['-DNEED_CPU_H', 3143db2e89dfSGerd Hoffmann '-DCONFIG_TARGET="@0@-config-target.h"'.format(target), 3144db2e89dfSGerd Hoffmann '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)] 3145db2e89dfSGerd Hoffmann target_module_ss = module_ss.apply(config_target, strict: false) 3146db2e89dfSGerd Hoffmann if target_module_ss.sources() != [] 3147db2e89dfSGerd Hoffmann module_name = d + '-' + m + '-' + config_target['TARGET_NAME'] 3148db2e89dfSGerd Hoffmann sl = static_library(module_name, 3149db2e89dfSGerd Hoffmann [genh, target_module_ss.sources()], 3150db2e89dfSGerd Hoffmann dependencies: [modulecommon, target_module_ss.dependencies()], 3151db2e89dfSGerd Hoffmann include_directories: target_inc, 3152db2e89dfSGerd Hoffmann c_args: c_args, 3153db2e89dfSGerd Hoffmann pic: true) 3154db2e89dfSGerd Hoffmann softmmu_mods += sl 3155db2e89dfSGerd Hoffmann # FIXME: Should use sl.extract_all_objects(recursive: true) too. 3156db2e89dfSGerd Hoffmann modinfo_files += custom_target(module_name + '.modinfo', 3157db2e89dfSGerd Hoffmann output: module_name + '.modinfo', 3158917ddc27SGerd Hoffmann input: target_module_ss.sources() + genh, 3159db2e89dfSGerd Hoffmann capture: true, 3160917ddc27SGerd Hoffmann command: [modinfo_collect, '--target', target, target_module_ss.sources()]) 3161db2e89dfSGerd Hoffmann endif 3162db2e89dfSGerd Hoffmann endif 3163db2e89dfSGerd Hoffmann endforeach 3164db2e89dfSGerd Hoffmann else 3165db2e89dfSGerd Hoffmann specific_ss.add_all(module_ss) 3166db2e89dfSGerd Hoffmann endif 3167db2e89dfSGerd Hoffmann endforeach 3168db2e89dfSGerd Hoffmannendforeach 3169db2e89dfSGerd Hoffmann 31705ebbfeccSGerd Hoffmannif enable_modules 31715ebbfeccSGerd Hoffmann modinfo_src = custom_target('modinfo.c', 31725ebbfeccSGerd Hoffmann output: 'modinfo.c', 31735ebbfeccSGerd Hoffmann input: modinfo_files, 31745ebbfeccSGerd Hoffmann command: [modinfo_generate, '@INPUT@'], 31755ebbfeccSGerd Hoffmann capture: true) 31765ebbfeccSGerd Hoffmann modinfo_lib = static_library('modinfo', modinfo_src) 31775ebbfeccSGerd Hoffmann modinfo_dep = declare_dependency(link_whole: modinfo_lib) 31785ebbfeccSGerd Hoffmann softmmu_ss.add(modinfo_dep) 31795ebbfeccSGerd Hoffmannendif 31805ebbfeccSGerd Hoffmann 31813154fee4SMarc-André Lureaunm = find_program('nm') 3182604f3e4eSYonggang Luoundefsym = find_program('scripts/undefsym.py') 31833154fee4SMarc-André Lureaublock_syms = custom_target('block.syms', output: 'block.syms', 31843154fee4SMarc-André Lureau input: [libqemuutil, block_mods], 31853154fee4SMarc-André Lureau capture: true, 31863154fee4SMarc-André Lureau command: [undefsym, nm, '@INPUT@']) 31873154fee4SMarc-André Lureauqemu_syms = custom_target('qemu.syms', output: 'qemu.syms', 31883154fee4SMarc-André Lureau input: [libqemuutil, softmmu_mods], 31893154fee4SMarc-André Lureau capture: true, 31903154fee4SMarc-André Lureau command: [undefsym, nm, '@INPUT@']) 31913154fee4SMarc-André Lureau 3192da33fc09SPhilippe Mathieu-Daudéqom_ss = qom_ss.apply(config_host, strict: false) 3193da33fc09SPhilippe Mathieu-Daudélibqom = static_library('qom', qom_ss.sources() + genh, 3194da33fc09SPhilippe Mathieu-Daudé dependencies: [qom_ss.dependencies()], 3195da33fc09SPhilippe Mathieu-Daudé name_suffix: 'fa') 3196da33fc09SPhilippe Mathieu-Daudé 3197da33fc09SPhilippe Mathieu-Daudéqom = declare_dependency(link_whole: libqom) 3198da33fc09SPhilippe Mathieu-Daudé 319955567891SPhilippe Mathieu-Daudéauthz_ss = authz_ss.apply(config_host, strict: false) 320055567891SPhilippe Mathieu-Daudélibauthz = static_library('authz', authz_ss.sources() + genh, 320155567891SPhilippe Mathieu-Daudé dependencies: [authz_ss.dependencies()], 320255567891SPhilippe Mathieu-Daudé name_suffix: 'fa', 320355567891SPhilippe Mathieu-Daudé build_by_default: false) 320455567891SPhilippe Mathieu-Daudé 320555567891SPhilippe Mathieu-Daudéauthz = declare_dependency(link_whole: libauthz, 320655567891SPhilippe Mathieu-Daudé dependencies: qom) 320755567891SPhilippe Mathieu-Daudé 32082389304aSPhilippe Mathieu-Daudécrypto_ss = crypto_ss.apply(config_host, strict: false) 32092389304aSPhilippe Mathieu-Daudélibcrypto = static_library('crypto', crypto_ss.sources() + genh, 32102389304aSPhilippe Mathieu-Daudé dependencies: [crypto_ss.dependencies()], 32112389304aSPhilippe Mathieu-Daudé name_suffix: 'fa', 32122389304aSPhilippe Mathieu-Daudé build_by_default: false) 32132389304aSPhilippe Mathieu-Daudé 32142389304aSPhilippe Mathieu-Daudécrypto = declare_dependency(link_whole: libcrypto, 32152389304aSPhilippe Mathieu-Daudé dependencies: [authz, qom]) 32162389304aSPhilippe Mathieu-Daudé 3217f78536b1SPhilippe Mathieu-Daudéio_ss = io_ss.apply(config_host, strict: false) 3218f78536b1SPhilippe Mathieu-Daudélibio = static_library('io', io_ss.sources() + genh, 3219f78536b1SPhilippe Mathieu-Daudé dependencies: [io_ss.dependencies()], 3220f78536b1SPhilippe Mathieu-Daudé link_with: libqemuutil, 3221f78536b1SPhilippe Mathieu-Daudé name_suffix: 'fa', 3222f78536b1SPhilippe Mathieu-Daudé build_by_default: false) 3223f78536b1SPhilippe Mathieu-Daudé 3224f78536b1SPhilippe Mathieu-Daudéio = declare_dependency(link_whole: libio, dependencies: [crypto, qom]) 3225f78536b1SPhilippe Mathieu-Daudé 32267e6edef3SPhilippe Mathieu-Daudélibmigration = static_library('migration', sources: migration_files + genh, 32277e6edef3SPhilippe Mathieu-Daudé name_suffix: 'fa', 32287e6edef3SPhilippe Mathieu-Daudé build_by_default: false) 32297e6edef3SPhilippe Mathieu-Daudémigration = declare_dependency(link_with: libmigration, 32307e6edef3SPhilippe Mathieu-Daudé dependencies: [zlib, qom, io]) 32317e6edef3SPhilippe Mathieu-Daudésoftmmu_ss.add(migration) 32327e6edef3SPhilippe Mathieu-Daudé 32335e5733e5SMarc-André Lureaublock_ss = block_ss.apply(config_host, strict: false) 32345e5733e5SMarc-André Lureaulibblock = static_library('block', block_ss.sources() + genh, 32355e5733e5SMarc-André Lureau dependencies: block_ss.dependencies(), 32365e5733e5SMarc-André Lureau link_depends: block_syms, 32375e5733e5SMarc-André Lureau name_suffix: 'fa', 32385e5733e5SMarc-André Lureau build_by_default: false) 32395e5733e5SMarc-André Lureau 32405e5733e5SMarc-André Lureaublock = declare_dependency(link_whole: [libblock], 3241b7c70bf2SMarc-André Lureau link_args: '@block.syms', 3242b7c70bf2SMarc-André Lureau dependencies: [crypto, io]) 32435e5733e5SMarc-André Lureau 32444fb9071fSStefan Hajnocziblockdev_ss = blockdev_ss.apply(config_host, strict: false) 32454fb9071fSStefan Hajnoczilibblockdev = static_library('blockdev', blockdev_ss.sources() + genh, 32464fb9071fSStefan Hajnoczi dependencies: blockdev_ss.dependencies(), 32474fb9071fSStefan Hajnoczi name_suffix: 'fa', 32484fb9071fSStefan Hajnoczi build_by_default: false) 32494fb9071fSStefan Hajnoczi 32504fb9071fSStefan Hajnocziblockdev = declare_dependency(link_whole: [libblockdev], 32514fb9071fSStefan Hajnoczi dependencies: [block]) 32524fb9071fSStefan Hajnoczi 3253ff219dcaSPaolo Bonziniqmp_ss = qmp_ss.apply(config_host, strict: false) 3254ff219dcaSPaolo Bonzinilibqmp = static_library('qmp', qmp_ss.sources() + genh, 3255ff219dcaSPaolo Bonzini dependencies: qmp_ss.dependencies(), 3256ff219dcaSPaolo Bonzini name_suffix: 'fa', 3257ff219dcaSPaolo Bonzini build_by_default: false) 3258ff219dcaSPaolo Bonzini 3259ff219dcaSPaolo Bonziniqmp = declare_dependency(link_whole: [libqmp]) 3260ff219dcaSPaolo Bonzini 3261c2306d71SPhilippe Mathieu-Daudélibchardev = static_library('chardev', chardev_ss.sources() + genh, 3262c2306d71SPhilippe Mathieu-Daudé name_suffix: 'fa', 326322d1f7a8SMarc-André Lureau dependencies: chardev_ss.dependencies(), 3264c2306d71SPhilippe Mathieu-Daudé build_by_default: false) 3265c2306d71SPhilippe Mathieu-Daudé 3266c2306d71SPhilippe Mathieu-Daudéchardev = declare_dependency(link_whole: libchardev) 3267c2306d71SPhilippe Mathieu-Daudé 3268f73fb063SPhilippe Mathieu-Daudéhwcore_ss = hwcore_ss.apply(config_host, strict: false) 3269f73fb063SPhilippe Mathieu-Daudélibhwcore = static_library('hwcore', sources: hwcore_ss.sources() + genh, 3270e28ab096SPhilippe Mathieu-Daudé name_suffix: 'fa', 3271e28ab096SPhilippe Mathieu-Daudé build_by_default: false) 3272e28ab096SPhilippe Mathieu-Daudéhwcore = declare_dependency(link_whole: libhwcore) 3273e28ab096SPhilippe Mathieu-Daudécommon_ss.add(hwcore) 3274e28ab096SPhilippe Mathieu-Daudé 3275064f8ee7SPhilippe Mathieu-Daudé########### 3276064f8ee7SPhilippe Mathieu-Daudé# Targets # 3277064f8ee7SPhilippe Mathieu-Daudé########### 3278064f8ee7SPhilippe Mathieu-Daudé 3279fb72176bSPaolo Bonziniemulator_modules = [] 32803154fee4SMarc-André Lureauforeach m : block_mods + softmmu_mods 3281fb72176bSPaolo Bonzini emulator_modules += shared_module(m.name(), 3282fb72176bSPaolo Bonzini build_by_default: true, 32833154fee4SMarc-André Lureau name_prefix: '', 32843154fee4SMarc-André Lureau link_whole: m, 32853154fee4SMarc-André Lureau install: true, 328616bf7a33SPaolo Bonzini install_dir: qemu_moddir) 32873154fee4SMarc-André Lureauendforeach 32883154fee4SMarc-André Lureau 32894fb9071fSStefan Hajnoczisoftmmu_ss.add(authz, blockdev, chardev, crypto, io, qmp) 329064ed6f92SPaolo Bonzinicommon_ss.add(qom, qemuutil) 329164ed6f92SPaolo Bonzini 329264ed6f92SPaolo Bonzinicommon_ss.add_all(when: 'CONFIG_SOFTMMU', if_true: [softmmu_ss]) 32932becc36aSPaolo Bonzinicommon_ss.add_all(when: 'CONFIG_USER_ONLY', if_true: user_ss) 32942becc36aSPaolo Bonzini 32952becc36aSPaolo Bonzinicommon_all = common_ss.apply(config_all, strict: false) 32962becc36aSPaolo Bonzinicommon_all = static_library('common', 32972becc36aSPaolo Bonzini build_by_default: false, 32982becc36aSPaolo Bonzini sources: common_all.sources() + genh, 32999d24fb73SPaolo Bonzini include_directories: common_user_inc, 330075eebe0bSKatsuhiro Ueno implicit_include_directories: false, 33012becc36aSPaolo Bonzini dependencies: common_all.dependencies(), 33022becc36aSPaolo Bonzini name_suffix: 'fa') 33032becc36aSPaolo Bonzini 3304c9322ab5SMarc-André Lureaufeature_to_c = find_program('scripts/feature_to_c.sh') 3305c9322ab5SMarc-André Lureau 330630cfa50dSPhilippe Mathieu-Daudéif targetos == 'darwin' 330730cfa50dSPhilippe Mathieu-Daudé entitlement = find_program('scripts/entitlement.sh') 330830cfa50dSPhilippe Mathieu-Daudéendif 330930cfa50dSPhilippe Mathieu-Daudé 3310fd5eef85SPaolo Bonziniemulators = {} 33112becc36aSPaolo Bonziniforeach target : target_dirs 33122becc36aSPaolo Bonzini config_target = config_target_mak[target] 33132becc36aSPaolo Bonzini target_name = config_target['TARGET_NAME'] 3314ffb91f68SPaolo Bonzini target_base_arch = config_target['TARGET_BASE_ARCH'] 3315859aef02SPaolo Bonzini arch_srcs = [config_target_h[target]] 331664ed6f92SPaolo Bonzini arch_deps = [] 331764ed6f92SPaolo Bonzini c_args = ['-DNEED_CPU_H', 331864ed6f92SPaolo Bonzini '-DCONFIG_TARGET="@0@-config-target.h"'.format(target), 331964ed6f92SPaolo Bonzini '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)] 3320b6c7cfd4SPaolo Bonzini link_args = emulator_link_args 33212becc36aSPaolo Bonzini 3322859aef02SPaolo Bonzini config_target += config_host 33232becc36aSPaolo Bonzini target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])] 33242becc36aSPaolo Bonzini if targetos == 'linux' 33252becc36aSPaolo Bonzini target_inc += include_directories('linux-headers', is_system: true) 33262becc36aSPaolo Bonzini endif 33272becc36aSPaolo Bonzini if target.endswith('-softmmu') 33282becc36aSPaolo Bonzini qemu_target_name = 'qemu-system-' + target_name 33292becc36aSPaolo Bonzini target_type='system' 3330ffb91f68SPaolo Bonzini t = target_softmmu_arch[target_base_arch].apply(config_target, strict: false) 3331abff1abfSPaolo Bonzini arch_srcs += t.sources() 333264ed6f92SPaolo Bonzini arch_deps += t.dependencies() 3333abff1abfSPaolo Bonzini 3334ffb91f68SPaolo Bonzini hw_dir = target_name == 'sparc64' ? 'sparc64' : target_base_arch 33352c44220dSMarc-André Lureau hw = hw_arch[hw_dir].apply(config_target, strict: false) 33362c44220dSMarc-André Lureau arch_srcs += hw.sources() 333764ed6f92SPaolo Bonzini arch_deps += hw.dependencies() 33382c44220dSMarc-André Lureau 33392becc36aSPaolo Bonzini arch_srcs += config_devices_h[target] 334064ed6f92SPaolo Bonzini link_args += ['@block.syms', '@qemu.syms'] 33412becc36aSPaolo Bonzini else 33423a30446aSMarc-André Lureau abi = config_target['TARGET_ABI_DIR'] 33432becc36aSPaolo Bonzini target_type='user' 3344a3a576b0SPaolo Bonzini target_inc += common_user_inc 33452becc36aSPaolo Bonzini qemu_target_name = 'qemu-' + target_name 3346ffb91f68SPaolo Bonzini if target_base_arch in target_user_arch 3347ffb91f68SPaolo Bonzini t = target_user_arch[target_base_arch].apply(config_target, strict: false) 334846369b50SPhilippe Mathieu-Daudé arch_srcs += t.sources() 334946369b50SPhilippe Mathieu-Daudé arch_deps += t.dependencies() 335046369b50SPhilippe Mathieu-Daudé endif 33512becc36aSPaolo Bonzini if 'CONFIG_LINUX_USER' in config_target 33522becc36aSPaolo Bonzini base_dir = 'linux-user' 3353e2a74729SWarner Losh endif 3354e2a74729SWarner Losh if 'CONFIG_BSD_USER' in config_target 33552becc36aSPaolo Bonzini base_dir = 'bsd-user' 3356e2a74729SWarner Losh target_inc += include_directories('bsd-user/' / targetos) 335785fc1b5dSWarner Losh target_inc += include_directories('bsd-user/host/' / host_arch) 3358e2a74729SWarner Losh dir = base_dir / abi 335919bf129fSWarner Losh arch_srcs += files(dir / 'signal.c', dir / 'target_arch_cpu.c') 33602becc36aSPaolo Bonzini endif 33612becc36aSPaolo Bonzini target_inc += include_directories( 33622becc36aSPaolo Bonzini base_dir, 33633a30446aSMarc-André Lureau base_dir / abi, 33642becc36aSPaolo Bonzini ) 33653a30446aSMarc-André Lureau if 'CONFIG_LINUX_USER' in config_target 33663a30446aSMarc-André Lureau dir = base_dir / abi 33673a30446aSMarc-André Lureau arch_srcs += files(dir / 'signal.c', dir / 'cpu_loop.c') 33683a30446aSMarc-André Lureau if config_target.has_key('TARGET_SYSTBL_ABI') 33693a30446aSMarc-André Lureau arch_srcs += \ 33703a30446aSMarc-André Lureau syscall_nr_generators[abi].process(base_dir / abi / config_target['TARGET_SYSTBL'], 33713a30446aSMarc-André Lureau extra_args : config_target['TARGET_SYSTBL_ABI']) 33723a30446aSMarc-André Lureau endif 33733a30446aSMarc-André Lureau endif 33742becc36aSPaolo Bonzini endif 33752becc36aSPaolo Bonzini 3376c9322ab5SMarc-André Lureau if 'TARGET_XML_FILES' in config_target 3377c9322ab5SMarc-André Lureau gdbstub_xml = custom_target(target + '-gdbstub-xml.c', 3378c9322ab5SMarc-André Lureau output: target + '-gdbstub-xml.c', 3379c9322ab5SMarc-André Lureau input: files(config_target['TARGET_XML_FILES'].split()), 3380c9322ab5SMarc-André Lureau command: [feature_to_c, '@INPUT@'], 3381c9322ab5SMarc-André Lureau capture: true) 3382c9322ab5SMarc-André Lureau arch_srcs += gdbstub_xml 3383c9322ab5SMarc-André Lureau endif 3384c9322ab5SMarc-André Lureau 3385ffb91f68SPaolo Bonzini t = target_arch[target_base_arch].apply(config_target, strict: false) 3386abff1abfSPaolo Bonzini arch_srcs += t.sources() 338764ed6f92SPaolo Bonzini arch_deps += t.dependencies() 3388abff1abfSPaolo Bonzini 33892becc36aSPaolo Bonzini target_common = common_ss.apply(config_target, strict: false) 33902becc36aSPaolo Bonzini objects = common_all.extract_objects(target_common.sources()) 339164ed6f92SPaolo Bonzini deps = target_common.dependencies() 33922becc36aSPaolo Bonzini 33932becc36aSPaolo Bonzini target_specific = specific_ss.apply(config_target, strict: false) 33942becc36aSPaolo Bonzini arch_srcs += target_specific.sources() 339564ed6f92SPaolo Bonzini arch_deps += target_specific.dependencies() 33962becc36aSPaolo Bonzini 339764ed6f92SPaolo Bonzini lib = static_library('qemu-' + target, 3398859aef02SPaolo Bonzini sources: arch_srcs + genh, 3399b7612f45SPaolo Bonzini dependencies: arch_deps, 34002becc36aSPaolo Bonzini objects: objects, 34012becc36aSPaolo Bonzini include_directories: target_inc, 340264ed6f92SPaolo Bonzini c_args: c_args, 340364ed6f92SPaolo Bonzini build_by_default: false, 34042becc36aSPaolo Bonzini name_suffix: 'fa') 340564ed6f92SPaolo Bonzini 340664ed6f92SPaolo Bonzini if target.endswith('-softmmu') 340764ed6f92SPaolo Bonzini execs = [{ 340864ed6f92SPaolo Bonzini 'name': 'qemu-system-' + target_name, 3409654d6b04SPaolo Bonzini 'win_subsystem': 'console', 341064ed6f92SPaolo Bonzini 'sources': files('softmmu/main.c'), 341164ed6f92SPaolo Bonzini 'dependencies': [] 341264ed6f92SPaolo Bonzini }] 341335be72baSPaolo Bonzini if targetos == 'windows' and (sdl.found() or gtk.found()) 341464ed6f92SPaolo Bonzini execs += [{ 341564ed6f92SPaolo Bonzini 'name': 'qemu-system-' + target_name + 'w', 3416654d6b04SPaolo Bonzini 'win_subsystem': 'windows', 341764ed6f92SPaolo Bonzini 'sources': files('softmmu/main.c'), 341864ed6f92SPaolo Bonzini 'dependencies': [] 341964ed6f92SPaolo Bonzini }] 342064ed6f92SPaolo Bonzini endif 3421537b7248SPaolo Bonzini if get_option('fuzzing') 342264ed6f92SPaolo Bonzini specific_fuzz = specific_fuzz_ss.apply(config_target, strict: false) 342364ed6f92SPaolo Bonzini execs += [{ 342464ed6f92SPaolo Bonzini 'name': 'qemu-fuzz-' + target_name, 3425654d6b04SPaolo Bonzini 'win_subsystem': 'console', 342664ed6f92SPaolo Bonzini 'sources': specific_fuzz.sources(), 342764ed6f92SPaolo Bonzini 'dependencies': specific_fuzz.dependencies(), 342864ed6f92SPaolo Bonzini }] 342964ed6f92SPaolo Bonzini endif 343064ed6f92SPaolo Bonzini else 343164ed6f92SPaolo Bonzini execs = [{ 343264ed6f92SPaolo Bonzini 'name': 'qemu-' + target_name, 3433654d6b04SPaolo Bonzini 'win_subsystem': 'console', 343464ed6f92SPaolo Bonzini 'sources': [], 343564ed6f92SPaolo Bonzini 'dependencies': [] 343664ed6f92SPaolo Bonzini }] 343764ed6f92SPaolo Bonzini endif 343864ed6f92SPaolo Bonzini foreach exe: execs 34398a74ce61SAlexander Graf exe_name = exe['name'] 34403983a767SJohn Arbuckle if targetos == 'darwin' 34418a74ce61SAlexander Graf exe_name += '-unsigned' 34428a74ce61SAlexander Graf endif 34438a74ce61SAlexander Graf 34448a74ce61SAlexander Graf emulator = executable(exe_name, exe['sources'], 3445237377acSAkihiko Odaki install: true, 344664ed6f92SPaolo Bonzini c_args: c_args, 344764ed6f92SPaolo Bonzini dependencies: arch_deps + deps + exe['dependencies'], 344864ed6f92SPaolo Bonzini objects: lib.extract_all_objects(recursive: true), 344964ed6f92SPaolo Bonzini link_language: link_language, 345064ed6f92SPaolo Bonzini link_depends: [block_syms, qemu_syms] + exe.get('link_depends', []), 345164ed6f92SPaolo Bonzini link_args: link_args, 3452654d6b04SPaolo Bonzini win_subsystem: exe['win_subsystem']) 34538a74ce61SAlexander Graf 34543983a767SJohn Arbuckle if targetos == 'darwin' 3455411ad8ddSAkihiko Odaki icon = 'pc-bios/qemu.rsrc' 3456411ad8ddSAkihiko Odaki build_input = [emulator, files(icon)] 3457411ad8ddSAkihiko Odaki install_input = [ 3458411ad8ddSAkihiko Odaki get_option('bindir') / exe_name, 3459411ad8ddSAkihiko Odaki meson.current_source_dir() / icon 3460411ad8ddSAkihiko Odaki ] 3461411ad8ddSAkihiko Odaki if 'CONFIG_HVF' in config_target 3462411ad8ddSAkihiko Odaki entitlements = 'accel/hvf/entitlements.plist' 3463411ad8ddSAkihiko Odaki build_input += files(entitlements) 3464411ad8ddSAkihiko Odaki install_input += meson.current_source_dir() / entitlements 3465411ad8ddSAkihiko Odaki endif 3466411ad8ddSAkihiko Odaki 34678a74ce61SAlexander Graf emulators += {exe['name'] : custom_target(exe['name'], 3468411ad8ddSAkihiko Odaki input: build_input, 34698a74ce61SAlexander Graf output: exe['name'], 3470235b523dSPhilippe Mathieu-Daudé command: [entitlement, '@OUTPUT@', '@INPUT@']) 3471fd5eef85SPaolo Bonzini } 3472237377acSAkihiko Odaki 3473235b523dSPhilippe Mathieu-Daudé meson.add_install_script(entitlement, '--install', 3474237377acSAkihiko Odaki get_option('bindir') / exe['name'], 3475411ad8ddSAkihiko Odaki install_input) 34768a74ce61SAlexander Graf else 34778a74ce61SAlexander Graf emulators += {exe['name']: emulator} 34788a74ce61SAlexander Graf endif 347910e1d263SMarc-André Lureau 34809c29b741SPaolo Bonzini if stap.found() 348110e1d263SMarc-André Lureau foreach stp: [ 3482bd5f973aSStefan Hajnoczi {'ext': '.stp-build', 'fmt': 'stap', 'bin': meson.current_build_dir() / exe['name'], 'install': false}, 3483bd5f973aSStefan Hajnoczi {'ext': '.stp', 'fmt': 'stap', 'bin': get_option('prefix') / get_option('bindir') / exe['name'], 'install': true}, 348410e1d263SMarc-André Lureau {'ext': '-simpletrace.stp', 'fmt': 'simpletrace-stap', 'bin': '', 'install': true}, 348510e1d263SMarc-André Lureau {'ext': '-log.stp', 'fmt': 'log-stap', 'bin': '', 'install': true}, 348610e1d263SMarc-André Lureau ] 3487bd5f973aSStefan Hajnoczi custom_target(exe['name'] + stp['ext'], 348810e1d263SMarc-André Lureau input: trace_events_all, 3489bd5f973aSStefan Hajnoczi output: exe['name'] + stp['ext'], 349010e1d263SMarc-André Lureau install: stp['install'], 349116bf7a33SPaolo Bonzini install_dir: get_option('datadir') / 'systemtap/tapset', 349210e1d263SMarc-André Lureau command: [ 349310e1d263SMarc-André Lureau tracetool, '--group=all', '--format=' + stp['fmt'], 349410e1d263SMarc-André Lureau '--binary=' + stp['bin'], 349510e1d263SMarc-André Lureau '--target-name=' + target_name, 349610e1d263SMarc-André Lureau '--target-type=' + target_type, 349710e1d263SMarc-André Lureau '--probe-prefix=qemu.' + target_type + '.' + target_name, 3498c05012a3SStefan Hajnoczi '@INPUT@', '@OUTPUT@' 34990572d6cdSStefan Hajnoczi ], 35000572d6cdSStefan Hajnoczi depend_files: tracetool_depends) 350110e1d263SMarc-André Lureau endforeach 350210e1d263SMarc-André Lureau endif 350364ed6f92SPaolo Bonzini endforeach 35042becc36aSPaolo Bonziniendforeach 35052becc36aSPaolo Bonzini 3506931049b4SPaolo Bonzini# Other build targets 3507897b5afaSMarc-André Lureau 3508f556b4a1SPaolo Bonziniif 'CONFIG_PLUGIN' in config_host 3509f556b4a1SPaolo Bonzini install_headers('include/qemu/qemu-plugin.h') 3510f556b4a1SPaolo Bonziniendif 3511f556b4a1SPaolo Bonzini 3512f15bff25SPaolo Bonzinisubdir('qga') 3513f15bff25SPaolo Bonzini 35149755c94aSLaurent Vivier# Don't build qemu-keymap if xkbcommon is not explicitly enabled 35159755c94aSLaurent Vivier# when we don't build tools or system 35164113f4cfSLaurent Vivierif xkbcommon.found() 351728742467SMarc-André Lureau # used for the update-keymaps target, so include rules even if !have_tools 351828742467SMarc-André Lureau qemu_keymap = executable('qemu-keymap', files('qemu-keymap.c', 'ui/input-keymap.c') + genh, 351928742467SMarc-André Lureau dependencies: [qemuutil, xkbcommon], install: have_tools) 352028742467SMarc-André Lureauendif 352128742467SMarc-André Lureau 3522931049b4SPaolo Bonziniif have_tools 3523b7c70bf2SMarc-André Lureau qemu_img = executable('qemu-img', [files('qemu-img.c'), hxdep], 3524b7c70bf2SMarc-André Lureau dependencies: [authz, block, crypto, io, qom, qemuutil], install: true) 3525b7c70bf2SMarc-André Lureau qemu_io = executable('qemu-io', files('qemu-io.c'), 3526b7c70bf2SMarc-André Lureau dependencies: [block, qemuutil], install: true) 3527b7c70bf2SMarc-André Lureau qemu_nbd = executable('qemu-nbd', files('qemu-nbd.c'), 35283d212b41SRichard W.M. Jones dependencies: [blockdev, qemuutil, gnutls, selinux], 35293d212b41SRichard W.M. Jones install: true) 3530b7c70bf2SMarc-André Lureau 35317c58bb76SPaolo Bonzini subdir('storage-daemon') 3532a9c9727cSPaolo Bonzini subdir('contrib/rdmacm-mux') 35331d7bb6abSMarc-André Lureau subdir('contrib/elf2dmp') 3534a9c9727cSPaolo Bonzini 3535157e7b13SMarc-André Lureau executable('qemu-edid', files('qemu-edid.c', 'hw/display/edid-generate.c'), 3536157e7b13SMarc-André Lureau dependencies: qemuutil, 3537157e7b13SMarc-André Lureau install: true) 3538157e7b13SMarc-André Lureau 3539931049b4SPaolo Bonzini if 'CONFIG_VHOST_USER' in config_host 35402d7ac0afSPaolo Bonzini subdir('contrib/vhost-user-blk') 3541ea458960SMarc-André Lureau subdir('contrib/vhost-user-gpu') 354232fcc624SMarc-André Lureau subdir('contrib/vhost-user-input') 354399650b62SPaolo Bonzini subdir('contrib/vhost-user-scsi') 3544931049b4SPaolo Bonzini endif 35458f51e01cSMarc-André Lureau 35468f51e01cSMarc-André Lureau if targetos == 'linux' 35478f51e01cSMarc-André Lureau executable('qemu-bridge-helper', files('qemu-bridge-helper.c'), 35488f51e01cSMarc-André Lureau dependencies: [qemuutil, libcap_ng], 35498f51e01cSMarc-André Lureau install: true, 35508f51e01cSMarc-André Lureau install_dir: get_option('libexecdir')) 3551897b5afaSMarc-André Lureau 3552897b5afaSMarc-André Lureau executable('qemu-pr-helper', files('scsi/qemu-pr-helper.c', 'scsi/utils.c'), 3553897b5afaSMarc-André Lureau dependencies: [authz, crypto, io, qom, qemuutil, 35546ec0e15dSPaolo Bonzini libcap_ng, mpathpersist], 3555897b5afaSMarc-André Lureau install: true) 35568f51e01cSMarc-André Lureau endif 35578f51e01cSMarc-André Lureau 3558ccd250aaSPaolo Bonzini if have_ivshmem 35595ee24e78SMarc-André Lureau subdir('contrib/ivshmem-client') 35605ee24e78SMarc-André Lureau subdir('contrib/ivshmem-server') 35615ee24e78SMarc-André Lureau endif 3562931049b4SPaolo Bonziniendif 3563931049b4SPaolo Bonzini 3564f5aa6320SMarc-André Lureausubdir('scripts') 35653f99cf57SPaolo Bonzinisubdir('tools') 3566bdcbea7aSMarc-André Lureausubdir('pc-bios') 3567f8aa24eaSPaolo Bonzinisubdir('docs') 3568e3667660SYonggang Luosubdir('tests') 35691b695471SPaolo Bonziniif gtk.found() 3570e8f3bd71SMarc-André Lureau subdir('po') 3571e8f3bd71SMarc-André Lureauendif 35723f99cf57SPaolo Bonzini 35738adfeba9SMarc-André Lureauif host_machine.system() == 'windows' 35748adfeba9SMarc-André Lureau nsis_cmd = [ 35758adfeba9SMarc-André Lureau find_program('scripts/nsis.py'), 35768adfeba9SMarc-André Lureau '@OUTPUT@', 35778adfeba9SMarc-André Lureau get_option('prefix'), 35788adfeba9SMarc-André Lureau meson.current_source_dir(), 357924bdcc96SStefan Weil host_machine.cpu(), 35808adfeba9SMarc-André Lureau '--', 35818adfeba9SMarc-André Lureau '-DDISPLAYVERSION=' + meson.project_version(), 35828adfeba9SMarc-André Lureau ] 35838adfeba9SMarc-André Lureau if build_docs 35848adfeba9SMarc-André Lureau nsis_cmd += '-DCONFIG_DOCUMENTATION=y' 35858adfeba9SMarc-André Lureau endif 35861b695471SPaolo Bonzini if gtk.found() 35878adfeba9SMarc-André Lureau nsis_cmd += '-DCONFIG_GTK=y' 35888adfeba9SMarc-André Lureau endif 35898adfeba9SMarc-André Lureau 35908adfeba9SMarc-André Lureau nsis = custom_target('nsis', 35918adfeba9SMarc-André Lureau output: 'qemu-setup-' + meson.project_version() + '.exe', 35928adfeba9SMarc-André Lureau input: files('qemu.nsi'), 35938adfeba9SMarc-André Lureau build_always_stale: true, 35948adfeba9SMarc-André Lureau command: nsis_cmd + ['@INPUT@']) 35958adfeba9SMarc-André Lureau alias_target('installer', nsis) 35968adfeba9SMarc-André Lureauendif 35978adfeba9SMarc-André Lureau 3598a0c9162cSPaolo Bonzini######################### 3599a0c9162cSPaolo Bonzini# Configuration summary # 3600a0c9162cSPaolo Bonzini######################### 3601a0c9162cSPaolo Bonzini 3602983d0a75SPhilippe Mathieu-Daudé# Directories 3603f9332757SPaolo Bonzinisummary_info = {} 360416bf7a33SPaolo Bonzinisummary_info += {'Install prefix': get_option('prefix')} 360516bf7a33SPaolo Bonzinisummary_info += {'BIOS directory': qemu_datadir} 360616bf7a33SPaolo Bonzinisummary_info += {'firmware path': get_option('qemu_firmwarepath')} 360716bf7a33SPaolo Bonzinisummary_info += {'binary directory': get_option('bindir')} 360816bf7a33SPaolo Bonzinisummary_info += {'library directory': get_option('libdir')} 360916bf7a33SPaolo Bonzinisummary_info += {'module directory': qemu_moddir} 361016bf7a33SPaolo Bonzinisummary_info += {'libexec directory': get_option('libexecdir')} 361116bf7a33SPaolo Bonzinisummary_info += {'include directory': get_option('includedir')} 361216bf7a33SPaolo Bonzinisummary_info += {'config directory': get_option('sysconfdir')} 3613f9332757SPaolo Bonziniif targetos != 'windows' 361416bf7a33SPaolo Bonzini summary_info += {'local state directory': get_option('localstatedir')} 3615b81efab7SMarc-André Lureau summary_info += {'Manual directory': get_option('mandir')} 3616f9332757SPaolo Bonzinielse 3617f9332757SPaolo Bonzini summary_info += {'local state directory': 'queried at runtime'} 3618f9332757SPaolo Bonziniendif 3619491e74c1SMarc-André Lureausummary_info += {'Doc directory': get_option('docdir')} 3620f9332757SPaolo Bonzinisummary_info += {'Build directory': meson.current_build_dir()} 3621f9332757SPaolo Bonzinisummary_info += {'Source path': meson.current_source_dir()} 3622f9332757SPaolo Bonzinisummary_info += {'GIT submodules': config_host['GIT_SUBMODULES']} 3623983d0a75SPhilippe Mathieu-Daudésummary(summary_info, bool_yn: true, section: 'Directories') 3624983d0a75SPhilippe Mathieu-Daudé 3625e11a0e17SPhilippe Mathieu-Daudé# Host binaries 3626983d0a75SPhilippe Mathieu-Daudésummary_info = {} 3627e11a0e17SPhilippe Mathieu-Daudésummary_info += {'git': config_host['GIT']} 3628e11a0e17SPhilippe Mathieu-Daudésummary_info += {'make': config_host['MAKE']} 3629e11a0e17SPhilippe Mathieu-Daudésummary_info += {'python': '@0@ (version: @1@)'.format(python.full_path(), python.language_version())} 3630bb647c49SPaolo Bonzinisummary_info += {'sphinx-build': sphinx_build} 3631e11a0e17SPhilippe Mathieu-Daudéif config_host.has_key('HAVE_GDB_BIN') 3632e11a0e17SPhilippe Mathieu-Daudé summary_info += {'gdb': config_host['HAVE_GDB_BIN']} 3633e11a0e17SPhilippe Mathieu-Daudéendif 36345dc4618eSPaolo Bonziniif get_option('iasl') != '' 36355dc4618eSPaolo Bonzini summary_info += {'iasl': get_option('iasl')} 36365dc4618eSPaolo Bonzinielse 36375dc4618eSPaolo Bonzini summary_info += {'iasl': false} 36385dc4618eSPaolo Bonziniendif 3639e11a0e17SPhilippe Mathieu-Daudésummary_info += {'genisoimage': config_host['GENISOIMAGE']} 364020cf5cb4SPaolo Bonziniif targetos == 'windows' and have_ga 3641bb647c49SPaolo Bonzini summary_info += {'wixl': wixl} 3642e11a0e17SPhilippe Mathieu-Daudéendif 364335acbb30SPaolo Bonziniif slirp_opt != 'disabled' and have_system 364435acbb30SPaolo Bonzini summary_info += {'smbd': have_slirp_smbd ? smbd_path : false} 3645e11a0e17SPhilippe Mathieu-Daudéendif 3646e11a0e17SPhilippe Mathieu-Daudésummary(summary_info, bool_yn: true, section: 'Host binaries') 3647e11a0e17SPhilippe Mathieu-Daudé 36481d718865SPhilippe Mathieu-Daudé# Configurable features 36491d718865SPhilippe Mathieu-Daudésummary_info = {} 36501d718865SPhilippe Mathieu-Daudésummary_info += {'Documentation': build_docs} 3651aa3ca634SPhilippe Mathieu-Daudésummary_info += {'system-mode emulation': have_system} 3652aa3ca634SPhilippe Mathieu-Daudésummary_info += {'user-mode emulation': have_user} 3653813803aaSPhilippe Mathieu-Daudésummary_info += {'block layer': have_block} 36541d718865SPhilippe Mathieu-Daudésummary_info += {'Install blobs': get_option('install_blobs')} 36551d718865SPhilippe Mathieu-Daudésummary_info += {'module support': config_host.has_key('CONFIG_MODULES')} 36561d718865SPhilippe Mathieu-Daudéif config_host.has_key('CONFIG_MODULES') 36572cb2f580SPaolo Bonzini summary_info += {'alternative module path': get_option('module_upgrades')} 36581d718865SPhilippe Mathieu-Daudéendif 3659537b7248SPaolo Bonzinisummary_info += {'fuzzing support': get_option('fuzzing')} 36601d718865SPhilippe Mathieu-Daudéif have_system 366187430d5bSPaolo Bonzini summary_info += {'Audio drivers': ' '.join(audio_drivers_selected)} 36621d718865SPhilippe Mathieu-Daudéendif 36639c29b741SPaolo Bonzinisummary_info += {'Trace backends': ','.join(get_option('trace_backends'))} 36649c29b741SPaolo Bonziniif 'simple' in get_option('trace_backends') 36659c29b741SPaolo Bonzini summary_info += {'Trace output file': get_option('trace_file') + '-<pid>'} 36661d718865SPhilippe Mathieu-Daudéendif 3667142ca628SMarc-André Lureausummary_info += {'D-Bus display': dbus_display} 3668c55cf6abSPaolo Bonzinisummary_info += {'QOM debugging': get_option('qom_cast_debug')} 36691d718865SPhilippe Mathieu-Daudésummary_info += {'vhost-kernel support': config_host.has_key('CONFIG_VHOST_KERNEL')} 36701d718865SPhilippe Mathieu-Daudésummary_info += {'vhost-net support': config_host.has_key('CONFIG_VHOST_NET')} 36711d718865SPhilippe Mathieu-Daudésummary_info += {'vhost-crypto support': config_host.has_key('CONFIG_VHOST_CRYPTO')} 36721d718865SPhilippe Mathieu-Daudésummary_info += {'vhost-scsi support': config_host.has_key('CONFIG_VHOST_SCSI')} 36731d718865SPhilippe Mathieu-Daudésummary_info += {'vhost-vsock support': config_host.has_key('CONFIG_VHOST_VSOCK')} 36741d718865SPhilippe Mathieu-Daudésummary_info += {'vhost-user support': config_host.has_key('CONFIG_VHOST_USER')} 36751d718865SPhilippe Mathieu-Daudésummary_info += {'vhost-user-blk server support': have_vhost_user_blk_server} 36761d718865SPhilippe Mathieu-Daudésummary_info += {'vhost-user-fs support': config_host.has_key('CONFIG_VHOST_USER_FS')} 36771d718865SPhilippe Mathieu-Daudésummary_info += {'vhost-vdpa support': config_host.has_key('CONFIG_VHOST_VDPA')} 367820cf5cb4SPaolo Bonzinisummary_info += {'build guest agent': have_ga} 36791d718865SPhilippe Mathieu-Daudésummary(summary_info, bool_yn: true, section: 'Configurable features') 36801d718865SPhilippe Mathieu-Daudé 36812e864b8bSPhilippe Mathieu-Daudé# Compilation information 3682e11a0e17SPhilippe Mathieu-Daudésummary_info = {} 36832e864b8bSPhilippe Mathieu-Daudésummary_info += {'host CPU': cpu} 36842e864b8bSPhilippe Mathieu-Daudésummary_info += {'host endianness': build_machine.endian()} 368563de9353SAlex Bennéesummary_info += {'C compiler': ' '.join(meson.get_compiler('c').cmd_array())} 368663de9353SAlex Bennéesummary_info += {'Host C compiler': ' '.join(meson.get_compiler('c', native: true).cmd_array())} 3687f9332757SPaolo Bonziniif link_language == 'cpp' 368863de9353SAlex Bennée summary_info += {'C++ compiler': ' '.join(meson.get_compiler('cpp').cmd_array())} 3689f9332757SPaolo Bonzinielse 3690f9332757SPaolo Bonzini summary_info += {'C++ compiler': false} 3691f9332757SPaolo Bonziniendif 3692f9332757SPaolo Bonziniif targetos == 'darwin' 369363de9353SAlex Bennée summary_info += {'Objective-C compiler': ' '.join(meson.get_compiler('objc').cmd_array())} 3694f9332757SPaolo Bonziniendif 369547b30835SPaolo Bonzinisummary_info += {'CFLAGS': ' '.join(get_option('c_args') 369647b30835SPaolo Bonzini + ['-O' + get_option('optimization')] 369747b30835SPaolo Bonzini + (get_option('debug') ? ['-g'] : []))} 369847b30835SPaolo Bonziniif link_language == 'cpp' 369947b30835SPaolo Bonzini summary_info += {'CXXFLAGS': ' '.join(get_option('cpp_args') 370047b30835SPaolo Bonzini + ['-O' + get_option('optimization')] 370147b30835SPaolo Bonzini + (get_option('debug') ? ['-g'] : []))} 370247b30835SPaolo Bonziniendif 3703e910c7d9SPhilippe Mathieu-Daudéif targetos == 'darwin' 3704e910c7d9SPhilippe Mathieu-Daudé summary_info += {'OBJCFLAGS': ' '.join(get_option('objc_args') 3705e910c7d9SPhilippe Mathieu-Daudé + ['-O' + get_option('optimization')] 3706e910c7d9SPhilippe Mathieu-Daudé + (get_option('debug') ? ['-g'] : []))} 3707e910c7d9SPhilippe Mathieu-Daudéendif 370847b30835SPaolo Bonzinilink_args = get_option(link_language + '_link_args') 370947b30835SPaolo Bonziniif link_args.length() > 0 371047b30835SPaolo Bonzini summary_info += {'LDFLAGS': ' '.join(link_args)} 371147b30835SPaolo Bonziniendif 3712d065177eSPaolo Bonzinisummary_info += {'QEMU_CFLAGS': ' '.join(qemu_cflags)} 3713d065177eSPaolo Bonzinisummary_info += {'QEMU_CXXFLAGS': ' '.join(qemu_cxxflags)} 3714d065177eSPaolo Bonzinisummary_info += {'QEMU_OBJCFLAGS': ' '.join(qemu_objcflags)} 3715d065177eSPaolo Bonzinisummary_info += {'QEMU_LDFLAGS': ' '.join(qemu_ldflags)} 3716c55cf6abSPaolo Bonzinisummary_info += {'profiler': get_option('profiler')} 3717cdad781dSDaniele Buonosummary_info += {'link-time optimization (LTO)': get_option('b_lto')} 37182e864b8bSPhilippe Mathieu-Daudésummary_info += {'PIE': get_option('b_pie')} 37193e8529ddSLaurent Viviersummary_info += {'static build': config_host.has_key('CONFIG_STATIC')} 37202e864b8bSPhilippe Mathieu-Daudésummary_info += {'malloc trim support': has_malloc_trim} 3721b87df904SPaolo Bonzinisummary_info += {'membarrier': have_membarrier} 3722728c0a2fSPaolo Bonzinisummary_info += {'debug stack usage': get_option('debug_stack_usage')} 3723c55cf6abSPaolo Bonzinisummary_info += {'mutex debugging': get_option('debug_mutex')} 37242e864b8bSPhilippe Mathieu-Daudésummary_info += {'memory allocator': get_option('malloc')} 3725622753d2SPaolo Bonzinisummary_info += {'avx2 optimization': config_host_data.get('CONFIG_AVX2_OPT')} 3726622753d2SPaolo Bonzinisummary_info += {'avx512f optimization': config_host_data.get('CONFIG_AVX512F_OPT')} 3727c55cf6abSPaolo Bonzinisummary_info += {'gprof enabled': get_option('gprof')} 37282e864b8bSPhilippe Mathieu-Daudésummary_info += {'gcov': get_option('b_coverage')} 37292e864b8bSPhilippe Mathieu-Daudésummary_info += {'thread sanitizer': config_host.has_key('CONFIG_TSAN')} 37302e864b8bSPhilippe Mathieu-Daudésummary_info += {'CFI support': get_option('cfi')} 37312e864b8bSPhilippe Mathieu-Daudéif get_option('cfi') 37322e864b8bSPhilippe Mathieu-Daudé summary_info += {'CFI debug support': get_option('cfi_debug')} 37332e864b8bSPhilippe Mathieu-Daudéendif 37342e864b8bSPhilippe Mathieu-Daudésummary_info += {'strip binaries': get_option('strip')} 3735bb647c49SPaolo Bonzinisummary_info += {'sparse': sparse} 37362e864b8bSPhilippe Mathieu-Daudésummary_info += {'mingw32 support': targetos == 'windows'} 373749e8565bSAlex Bennée 373849e8565bSAlex Bennée# snarf the cross-compilation information for tests 373949e8565bSAlex Bennéeforeach target: target_dirs 374049e8565bSAlex Bennée tcg_mak = meson.current_build_dir() / 'tests/tcg' / 'config-' + target + '.mak' 374149e8565bSAlex Bennée if fs.exists(tcg_mak) 374249e8565bSAlex Bennée config_cross_tcg = keyval.load(tcg_mak) 374349e8565bSAlex Bennée target = config_cross_tcg['TARGET_NAME'] 374449e8565bSAlex Bennée compiler = '' 374549e8565bSAlex Bennée if 'DOCKER_CROSS_CC_GUEST' in config_cross_tcg 374649e8565bSAlex Bennée summary_info += {target + ' tests': config_cross_tcg['DOCKER_CROSS_CC_GUEST'] + 374749e8565bSAlex Bennée ' via ' + config_cross_tcg['DOCKER_IMAGE']} 374849e8565bSAlex Bennée elif 'CROSS_CC_GUEST' in config_cross_tcg 374949e8565bSAlex Bennée summary_info += {target + ' tests' 375049e8565bSAlex Bennée : config_cross_tcg['CROSS_CC_GUEST'] } 375149e8565bSAlex Bennée endif 375249e8565bSAlex Bennée endif 375349e8565bSAlex Bennéeendforeach 375449e8565bSAlex Bennée 37552e864b8bSPhilippe Mathieu-Daudésummary(summary_info, bool_yn: true, section: 'Compilation') 37562e864b8bSPhilippe Mathieu-Daudé 3757aa3ca634SPhilippe Mathieu-Daudé# Targets and accelerators 37582e864b8bSPhilippe Mathieu-Daudésummary_info = {} 3759aa3ca634SPhilippe Mathieu-Daudéif have_system 3760aa3ca634SPhilippe Mathieu-Daudé summary_info += {'KVM support': config_all.has_key('CONFIG_KVM')} 3761aa3ca634SPhilippe Mathieu-Daudé summary_info += {'HAX support': config_all.has_key('CONFIG_HAX')} 3762aa3ca634SPhilippe Mathieu-Daudé summary_info += {'HVF support': config_all.has_key('CONFIG_HVF')} 3763aa3ca634SPhilippe Mathieu-Daudé summary_info += {'WHPX support': config_all.has_key('CONFIG_WHPX')} 376474a414a1SReinoud Zandijk summary_info += {'NVMM support': config_all.has_key('CONFIG_NVMM')} 3765*14efd8d3SPaolo Bonzini summary_info += {'Xen support': xen.found()} 3766*14efd8d3SPaolo Bonzini if xen.found() 3767*14efd8d3SPaolo Bonzini summary_info += {'xen ctrl version': xen.version()} 3768aa3ca634SPhilippe Mathieu-Daudé endif 3769aa3ca634SPhilippe Mathieu-Daudéendif 3770aa3ca634SPhilippe Mathieu-Daudésummary_info += {'TCG support': config_all.has_key('CONFIG_TCG')} 3771aa3ca634SPhilippe Mathieu-Daudéif config_all.has_key('CONFIG_TCG') 377239687acaSPhilippe Mathieu-Daudé if get_option('tcg_interpreter') 3773f1f727acSPhilippe Mathieu-Daudé summary_info += {'TCG backend': 'TCI (TCG with bytecode interpreter, slow)'} 377439687acaSPhilippe Mathieu-Daudé else 377539687acaSPhilippe Mathieu-Daudé summary_info += {'TCG backend': 'native (@0@)'.format(cpu)} 377639687acaSPhilippe Mathieu-Daudé endif 3777029aa68fSAlex Bennée summary_info += {'TCG plugins': config_host.has_key('CONFIG_PLUGIN')} 3778aa3ca634SPhilippe Mathieu-Daudé summary_info += {'TCG debug enabled': config_host.has_key('CONFIG_DEBUG_TCG')} 3779aa3ca634SPhilippe Mathieu-Daudéendif 37802e864b8bSPhilippe Mathieu-Daudésummary_info += {'target list': ' '.join(target_dirs)} 3781aa3ca634SPhilippe Mathieu-Daudéif have_system 3782aa3ca634SPhilippe Mathieu-Daudé summary_info += {'default devices': get_option('default_devices')} 3783106ad1f9SPaolo Bonzini summary_info += {'out of process emulation': multiprocess_allowed} 3784aa3ca634SPhilippe Mathieu-Daudéendif 3785aa3ca634SPhilippe Mathieu-Daudésummary(summary_info, bool_yn: true, section: 'Targets and accelerators') 3786aa3ca634SPhilippe Mathieu-Daudé 3787813803aaSPhilippe Mathieu-Daudé# Block layer 3788813803aaSPhilippe Mathieu-Daudésummary_info = {} 3789813803aaSPhilippe Mathieu-Daudésummary_info += {'coroutine backend': config_host['CONFIG_COROUTINE_BACKEND']} 3790728c0a2fSPaolo Bonzinisummary_info += {'coroutine pool': have_coroutine_pool} 3791813803aaSPhilippe Mathieu-Daudéif have_block 3792813803aaSPhilippe Mathieu-Daudé summary_info += {'Block whitelist (rw)': config_host['CONFIG_BDRV_RW_WHITELIST']} 3793813803aaSPhilippe Mathieu-Daudé summary_info += {'Block whitelist (ro)': config_host['CONFIG_BDRV_RO_WHITELIST']} 3794c55cf6abSPaolo Bonzini summary_info += {'Use block whitelist in tools': get_option('block_drv_whitelist_in_tools')} 3795813803aaSPhilippe Mathieu-Daudé summary_info += {'VirtFS support': have_virtfs} 3796813803aaSPhilippe Mathieu-Daudé summary_info += {'build virtiofs daemon': have_virtiofsd} 3797406523f6SPaolo Bonzini summary_info += {'Live block migration': config_host_data.get('CONFIG_LIVE_BLOCK_MIGRATION')} 3798406523f6SPaolo Bonzini summary_info += {'replication support': config_host_data.get('CONFIG_REPLICATION')} 3799ed793c2cSPaolo Bonzini summary_info += {'bochs support': get_option('bochs').allowed()} 3800ed793c2cSPaolo Bonzini summary_info += {'cloop support': get_option('cloop').allowed()} 3801ed793c2cSPaolo Bonzini summary_info += {'dmg support': get_option('dmg').allowed()} 3802ed793c2cSPaolo Bonzini summary_info += {'qcow v1 support': get_option('qcow1').allowed()} 3803ed793c2cSPaolo Bonzini summary_info += {'vdi support': get_option('vdi').allowed()} 3804ed793c2cSPaolo Bonzini summary_info += {'vvfat support': get_option('vvfat').allowed()} 3805ed793c2cSPaolo Bonzini summary_info += {'qed support': get_option('qed').allowed()} 3806ed793c2cSPaolo Bonzini summary_info += {'parallels support': get_option('parallels').allowed()} 3807bb647c49SPaolo Bonzini summary_info += {'FUSE exports': fuse} 3808813803aaSPhilippe Mathieu-Daudéendif 3809813803aaSPhilippe Mathieu-Daudésummary(summary_info, bool_yn: true, section: 'Block layer support') 3810813803aaSPhilippe Mathieu-Daudé 3811aa58028aSPhilippe Mathieu-Daudé# Crypto 3812aa3ca634SPhilippe Mathieu-Daudésummary_info = {} 3813f9332757SPaolo Bonzinisummary_info += {'TLS priority': config_host['CONFIG_TLS_PRIORITY']} 3814bb647c49SPaolo Bonzinisummary_info += {'GNUTLS support': gnutls} 3815bb647c49SPaolo Bonziniif gnutls.found() 3816cc4c7c73SDaniel P. Berrangé summary_info += {' GNUTLS crypto': gnutls_crypto.found()} 3817bb647c49SPaolo Bonziniendif 3818bb647c49SPaolo Bonzinisummary_info += {'libgcrypt': gcrypt} 3819bb647c49SPaolo Bonzinisummary_info += {'nettle': nettle} 382057612511SPaolo Bonziniif nettle.found() 382157612511SPaolo Bonzini summary_info += {' XTS': xts != 'private'} 3822f9332757SPaolo Bonziniendif 382334b52615SPaolo Bonzinisummary_info += {'AF_ALG support': have_afalg} 3824c55cf6abSPaolo Bonzinisummary_info += {'rng-none': get_option('rng_none')} 38252edd2c04SPaolo Bonzinisummary_info += {'Linux keyring': have_keyring} 3826aa58028aSPhilippe Mathieu-Daudésummary(summary_info, bool_yn: true, section: 'Crypto') 3827aa58028aSPhilippe Mathieu-Daudé 382869a78cceSPhilippe Mathieu-Daudé# Libraries 3829aa58028aSPhilippe Mathieu-Daudésummary_info = {} 3830aa58028aSPhilippe Mathieu-Daudéif targetos == 'darwin' 3831bb647c49SPaolo Bonzini summary_info += {'Cocoa support': cocoa} 3832aa58028aSPhilippe Mathieu-Daudéendif 3833bb647c49SPaolo Bonzinisummary_info += {'SDL support': sdl} 3834bb647c49SPaolo Bonzinisummary_info += {'SDL image support': sdl_image} 3835bb647c49SPaolo Bonzinisummary_info += {'GTK support': gtk} 3836bb647c49SPaolo Bonzinisummary_info += {'pixman': pixman} 3837bb647c49SPaolo Bonzinisummary_info += {'VTE support': vte} 3838bb647c49SPaolo Bonzinisummary_info += {'slirp support': slirp_opt == 'internal' ? slirp_opt : slirp} 3839bb647c49SPaolo Bonzinisummary_info += {'libtasn1': tasn1} 3840bb647c49SPaolo Bonzinisummary_info += {'PAM': pam} 3841bb647c49SPaolo Bonzinisummary_info += {'iconv support': iconv} 3842bb647c49SPaolo Bonzinisummary_info += {'curses support': curses} 3843bb647c49SPaolo Bonzinisummary_info += {'virgl support': virgl} 3844bb647c49SPaolo Bonzinisummary_info += {'curl support': curl} 3845bb647c49SPaolo Bonzinisummary_info += {'Multipath support': mpathpersist} 384695f8510eSKshitij Surisummary_info += {'PNG support': png} 3847bb647c49SPaolo Bonzinisummary_info += {'VNC support': vnc} 3848a0b93237SPaolo Bonziniif vnc.found() 3849bb647c49SPaolo Bonzini summary_info += {'VNC SASL support': sasl} 3850bb647c49SPaolo Bonzini summary_info += {'VNC JPEG support': jpeg} 3851f9332757SPaolo Bonziniendif 385287430d5bSPaolo Bonziniif targetos not in ['darwin', 'haiku', 'windows'] 385387430d5bSPaolo Bonzini summary_info += {'OSS support': oss} 385487430d5bSPaolo Bonzinielif targetos == 'darwin' 385587430d5bSPaolo Bonzini summary_info += {'CoreAudio support': coreaudio} 385687430d5bSPaolo Bonzinielif targetos == 'windows' 385787430d5bSPaolo Bonzini summary_info += {'DirectSound support': dsound} 385887430d5bSPaolo Bonziniendif 385987430d5bSPaolo Bonziniif targetos == 'linux' 386087430d5bSPaolo Bonzini summary_info += {'ALSA support': alsa} 386187430d5bSPaolo Bonzini summary_info += {'PulseAudio support': pulse} 386287430d5bSPaolo Bonziniendif 386387430d5bSPaolo Bonzinisummary_info += {'JACK support': jack} 3864bb647c49SPaolo Bonzinisummary_info += {'brlapi support': brlapi} 3865e1723999SPaolo Bonzinisummary_info += {'vde support': vde} 3866837b84b1SPaolo Bonzinisummary_info += {'netmap support': have_netmap} 3867eea9453aSThomas Huthsummary_info += {'l2tpv3 support': have_l2tpv3} 3868ff66f3e5SPaolo Bonzinisummary_info += {'Linux AIO support': libaio} 3869bb647c49SPaolo Bonzinisummary_info += {'Linux io_uring support': linux_io_uring} 3870bb647c49SPaolo Bonzinisummary_info += {'ATTR/XATTR support': libattr} 38713730a734SPaolo Bonzinisummary_info += {'RDMA support': rdma} 38723730a734SPaolo Bonzinisummary_info += {'PVRDMA support': have_pvrdma} 3873fbb4121dSPaolo Bonzinisummary_info += {'fdt support': fdt_opt == 'disabled' ? false : fdt_opt} 3874bb647c49SPaolo Bonzinisummary_info += {'libcap-ng support': libcap_ng} 3875bb647c49SPaolo Bonzinisummary_info += {'bpf support': libbpf} 38763f0a5d55SMarc-André Lureausummary_info += {'spice protocol support': spice_protocol} 38773f0a5d55SMarc-André Lureauif spice_protocol.found() 38783f0a5d55SMarc-André Lureau summary_info += {' spice server support': spice} 38793f0a5d55SMarc-André Lureauendif 3880bb647c49SPaolo Bonzinisummary_info += {'rbd support': rbd} 3881bb647c49SPaolo Bonzinisummary_info += {'smartcard support': cacard} 3882bb647c49SPaolo Bonzinisummary_info += {'U2F support': u2f} 3883bb647c49SPaolo Bonzinisummary_info += {'libusb': libusb} 3884bb647c49SPaolo Bonzinisummary_info += {'usb net redir': usbredir} 388588b6e618SPaolo Bonzinisummary_info += {'OpenGL support (epoxy)': opengl} 3886bb647c49SPaolo Bonzinisummary_info += {'GBM': gbm} 3887bb647c49SPaolo Bonzinisummary_info += {'libiscsi support': libiscsi} 3888bb647c49SPaolo Bonzinisummary_info += {'libnfs support': libnfs} 3889f9332757SPaolo Bonziniif targetos == 'windows' 389020cf5cb4SPaolo Bonzini if have_ga 38918821a389SMarc-André Lureau summary_info += {'QGA VSS support': have_qga_vss} 3892b846ab7cSPaolo Bonzini endif 3893f9332757SPaolo Bonziniendif 3894bb647c49SPaolo Bonzinisummary_info += {'seccomp support': seccomp} 3895bb647c49SPaolo Bonzinisummary_info += {'GlusterFS support': glusterfs} 38960d04c4c9SPaolo Bonzinisummary_info += {'TPM support': have_tpm} 3897e6a52b36SThomas Huthsummary_info += {'libssh support': libssh} 3898bb647c49SPaolo Bonzinisummary_info += {'lzo support': lzo} 3899bb647c49SPaolo Bonzinisummary_info += {'snappy support': snappy} 3900bb647c49SPaolo Bonzinisummary_info += {'bzip2 support': libbzip2} 3901bb647c49SPaolo Bonzinisummary_info += {'lzfse support': liblzfse} 3902bb647c49SPaolo Bonzinisummary_info += {'zstd support': zstd} 3903488a8c73SPaolo Bonzinisummary_info += {'NUMA host support': numa} 3904bb647c49SPaolo Bonzinisummary_info += {'capstone': capstone_opt == 'internal' ? capstone_opt : capstone} 3905bb647c49SPaolo Bonzinisummary_info += {'libpmem support': libpmem} 3906bb647c49SPaolo Bonzinisummary_info += {'libdaxctl support': libdaxctl} 3907bb647c49SPaolo Bonzinisummary_info += {'libudev': libudev} 3908bb647c49SPaolo Bonzini# Dummy dependency, keep .found() 3909df4ea709SMax Reitzsummary_info += {'FUSE lseek': fuse_lseek.found()} 39103d212b41SRichard W.M. Jonessummary_info += {'selinux': selinux} 391169a78cceSPhilippe Mathieu-Daudésummary(summary_info, bool_yn: true, section: 'Dependencies') 3912f9332757SPaolo Bonzini 3913f9332757SPaolo Bonziniif not supported_cpus.contains(cpu) 3914f9332757SPaolo Bonzini message() 3915f9332757SPaolo Bonzini warning('SUPPORT FOR THIS HOST CPU WILL GO AWAY IN FUTURE RELEASES!') 3916f9332757SPaolo Bonzini message() 3917f9332757SPaolo Bonzini message('CPU host architecture ' + cpu + ' support is not currently maintained.') 3918f9332757SPaolo Bonzini message('The QEMU project intends to remove support for this host CPU in') 3919f9332757SPaolo Bonzini message('a future release if nobody volunteers to maintain it and to') 3920f9332757SPaolo Bonzini message('provide a build host for our continuous integration setup.') 3921f9332757SPaolo Bonzini message('configure has succeeded and you can continue to build, but') 3922f9332757SPaolo Bonzini message('if you care about QEMU on this platform you should contact') 3923f9332757SPaolo Bonzini message('us upstream at qemu-devel@nongnu.org.') 3924f9332757SPaolo Bonziniendif 3925f9332757SPaolo Bonzini 3926f9332757SPaolo Bonziniif not supported_oses.contains(targetos) 3927f9332757SPaolo Bonzini message() 3928f9332757SPaolo Bonzini warning('WARNING: SUPPORT FOR THIS HOST OS WILL GO AWAY IN FUTURE RELEASES!') 3929f9332757SPaolo Bonzini message() 3930f9332757SPaolo Bonzini message('Host OS ' + targetos + 'support is not currently maintained.') 3931f9332757SPaolo Bonzini message('The QEMU project intends to remove support for this host OS in') 3932f9332757SPaolo Bonzini message('a future release if nobody volunteers to maintain it and to') 3933f9332757SPaolo Bonzini message('provide a build host for our continuous integration setup.') 3934f9332757SPaolo Bonzini message('configure has succeeded and you can continue to build, but') 3935f9332757SPaolo Bonzini message('if you care about QEMU on this platform you should contact') 3936f9332757SPaolo Bonzini message('us upstream at qemu-devel@nongnu.org.') 3937f9332757SPaolo Bonziniendif 3938