1 project('qemu', ['c'], meson_version: '>=0.55.0',
2 default_options: ['warning_level=1', 'c_std=gnu99', 'cpp_std=gnu++11', 'b_lundef=false'],
3 version: run_command('head', meson.source_root() / 'VERSION').stdout().strip())
5 not_found = dependency('', required: false)
6 keyval = import('unstable-keyval')
7 ss = import('sourceset')
9 sh = find_program('sh')
10 cc = meson.get_compiler('c')
11 config_host = keyval.load(meson.current_build_dir() / 'config-host.mak')
12 config_all_disas = keyval.load(meson.current_build_dir() / 'config-all-disas.mak')
13 enable_modules = 'CONFIG_MODULES' in config_host
15 add_project_arguments(config_host['QEMU_CFLAGS'].split(),
16 native: false, language: ['c', 'objc'])
17 add_project_arguments(config_host['QEMU_CXXFLAGS'].split(),
18 native: false, language: 'cpp')
19 add_project_link_arguments(config_host['QEMU_LDFLAGS'].split(),
20 native: false, language: ['c', 'cpp', 'objc'])
21 add_project_arguments(config_host['QEMU_INCLUDES'].split(),
22 language: ['c', 'cpp', 'objc'])
24 python = import('python').find_installation()
26 link_language = meson.get_external_property('link_language', 'cpp')
27 if link_language == 'cpp'
28 add_languages('cpp', required: true, native: false)
30 if host_machine.system() == 'darwin'
31 add_languages('objc', required: false, native: false)
34 if 'SPARSE_CFLAGS' in config_host
36 command: [find_program('scripts/check_sparse.py'),
37 config_host['SPARSE_CFLAGS'].split(),
38 'compile_commands.json'])
41 configure_file(input: files('scripts/ninjatool.py'),
43 configuration: config_host)
45 supported_oses = ['windows', 'freebsd', 'netbsd', 'openbsd', 'darwin', 'sunos', 'linux']
46 supported_cpus = ['ppc', 'ppc64', 's390x', 'sparc64', 'riscv32', 'riscv64', 'x86', 'x86_64',
47 'arm', 'aarch64', 'mips', 'mips64', 'sparc', 'sparc64']
49 cpu = host_machine.cpu_family()
50 targetos = host_machine.system()
52 m = cc.find_library('m', required: false)
53 util = cc.find_library('util', required: false)
60 if targetos == 'windows'
61 socket = cc.find_library('ws2_32')
63 win = import('windows')
64 version_res = win.compile_resources('version.rc',
65 depend_files: files('pc-bios/qemu-nsis.ico'),
66 include_directories: include_directories('.'))
67 elif targetos == 'darwin'
68 coref = dependency('appleframeworks', modules: 'CoreFoundation')
69 iokit = dependency('appleframeworks', modules: 'IOKit')
70 cocoa = dependency('appleframeworks', modules: 'Cocoa')
71 hvf = dependency('appleframeworks', modules: 'Hypervisor')
72 elif targetos == 'sunos'
73 socket = [cc.find_library('socket'),
74 cc.find_library('nsl'),
75 cc.find_library('resolv')]
76 elif targetos == 'haiku'
77 socket = [cc.find_library('posix_error_mapper'),
78 cc.find_library('network'),
79 cc.find_library('bsd')]
81 glib = declare_dependency(compile_args: config_host['GLIB_CFLAGS'].split(),
82 link_args: config_host['GLIB_LIBS'].split())
84 if 'CONFIG_GIO' in config_host
85 gio = declare_dependency(compile_args: config_host['GIO_CFLAGS'].split(),
86 link_args: config_host['GIO_LIBS'].split())
89 if 'CONFIG_TRACE_UST' in config_host
90 lttng = declare_dependency(link_args: config_host['LTTNG_UST_LIBS'].split())
93 if 'CONFIG_TRACE_UST' in config_host
94 urcubp = declare_dependency(link_args: config_host['URCU_BP_LIBS'].split())
97 if 'CONFIG_NETTLE' in config_host
98 nettle = declare_dependency(compile_args: config_host['NETTLE_CFLAGS'].split(),
99 link_args: config_host['NETTLE_LIBS'].split())
102 if 'CONFIG_GNUTLS' in config_host
103 gnutls = declare_dependency(compile_args: config_host['GNUTLS_CFLAGS'].split(),
104 link_args: config_host['GNUTLS_LIBS'].split())
106 pixman = declare_dependency(compile_args: config_host['PIXMAN_CFLAGS'].split(),
107 link_args: config_host['PIXMAN_LIBS'].split())
109 if 'CONFIG_AUTH_PAM' in config_host
110 pam = cc.find_library('pam')
113 if 'CONFIG_ATTR' in config_host
114 libattr = declare_dependency(link_args: config_host['LIBATTR_LIBS'].split())
117 if 'CONFIG_SECCOMP' in config_host
118 seccomp = declare_dependency(compile_args: config_host['SECCOMP_CFLAGS'].split(),
119 link_args: config_host['SECCOMP_LIBS'].split())
121 libcap_ng = not_found
122 if 'CONFIG_LIBCAP_NG' in config_host
123 libcap_ng = declare_dependency(link_args: config_host['LIBCAP_NG_LIBS'].split())
125 xkbcommon = not_found
126 if 'CONFIG_XKBCOMMON' in config_host
127 xkbcommon = declare_dependency(compile_args: config_host['XKBCOMMON_CFLAGS'].split(),
128 link_args: config_host['XKBCOMMON_LIBS'].split())
130 rt = cc.find_library('rt', required: false)
132 if 'CONFIG_LIBISCSI' in config_host
133 libiscsi = declare_dependency(compile_args: config_host['LIBISCSI_CFLAGS'].split(),
134 link_args: config_host['LIBISCSI_LIBS'].split())
137 if 'CONFIG_GBM' in config_host
138 gbm = declare_dependency(compile_args: config_host['GBM_CFLAGS'].split(),
139 link_args: config_host['GBM_LIBS'].split())
142 if 'CONFIG_VIRGL' in config_host
143 virgl = declare_dependency(compile_args: config_host['VIRGL_CFLAGS'].split(),
144 link_args: config_host['VIRGL_LIBS'].split())
147 if 'CONFIG_CURL' in config_host
148 curl = declare_dependency(compile_args: config_host['CURL_CFLAGS'].split(),
149 link_args: config_host['CURL_LIBS'].split())
152 if 'CONFIG_LIBUDEV' in config_host
153 libudev = declare_dependency(link_args: config_host['LIBUDEV_LIBS'].split())
156 create_config = find_program('scripts/create_config')
157 minikconf = find_program('scripts/minikconf.py')
158 target_dirs = config_host['TARGET_DIRS'].split()
161 config_devices_mak_list = []
162 config_devices_h = {}
163 config_target_mak = {}
164 kconfig_external_symbols = [
173 'CONFIG_VHOST_KERNEL',
178 foreach target : target_dirs
179 have_user = have_user or target.endswith('-user')
180 config_target = keyval.load(meson.current_build_dir() / target / 'config-target.mak') + config_host
182 if target.endswith('-softmmu')
186 foreach sym : kconfig_external_symbols
187 if sym in config_target
188 base_kconfig += '@0@=y'.format(sym)
192 config_devices_mak = target + '-config-devices.mak'
193 config_devices_mak = configure_file(
194 input: ['default-configs' / target + '.mak', 'Kconfig'],
195 output: config_devices_mak,
196 depfile: config_devices_mak + '.d',
198 command: [minikconf, config_host['CONFIG_MINIKCONF_MODE'],
199 config_devices_mak, '@DEPFILE@', '@INPUT@',
201 config_devices_h += {target: custom_target(
202 target + '-config-devices.h',
203 input: config_devices_mak,
204 output: target + '-config-devices.h',
206 command: [create_config, '@INPUT@'])}
207 config_devices_mak_list += config_devices_mak
208 config_target += keyval.load(config_devices_mak)
210 config_target_mak += {target: config_target}
212 have_tools = 'CONFIG_TOOLS' in config_host
213 have_block = have_system or have_tools
215 grepy = find_program('scripts/grepy.sh')
216 # This configuration is used to build files that are shared by
217 # multiple binaries, and then extracted out of the "common"
218 # static_library target.
220 # We do not use all_sources()/all_dependencies(), because it would
221 # build literally all source files, including devices only used by
222 # targets that are not built for this compilation. The CONFIG_ALL
223 # pseudo symbol replaces it.
226 config_all_devices_mak = configure_file(
227 output: 'config-all-devices.mak',
228 input: config_devices_mak_list,
230 command: [grepy, '@INPUT@'],
232 config_all_devices = keyval.load(config_all_devices_mak)
234 config_all_devices = {}
236 config_all = config_all_devices
237 config_all += config_host
238 config_all += config_all_disas
240 'CONFIG_XEN': config_host.has_key('CONFIG_XEN_BACKEND'),
241 'CONFIG_SOFTMMU': have_system,
242 'CONFIG_USER_ONLY': have_user,
249 hxtool = find_program('scripts/hxtool')
250 shaderinclude = find_program('scripts/shaderinclude.pl')
251 qapi_gen = find_program('scripts/qapi-gen.py')
252 qapi_gen_depends = [ meson.source_root() / 'scripts/qapi/__init__.py',
253 meson.source_root() / 'scripts/qapi/commands.py',
254 meson.source_root() / 'scripts/qapi/common.py',
255 meson.source_root() / 'scripts/qapi/doc.py',
256 meson.source_root() / 'scripts/qapi/error.py',
257 meson.source_root() / 'scripts/qapi/events.py',
258 meson.source_root() / 'scripts/qapi/expr.py',
259 meson.source_root() / 'scripts/qapi/gen.py',
260 meson.source_root() / 'scripts/qapi/introspect.py',
261 meson.source_root() / 'scripts/qapi/parser.py',
262 meson.source_root() / 'scripts/qapi/schema.py',
263 meson.source_root() / 'scripts/qapi/source.py',
264 meson.source_root() / 'scripts/qapi/types.py',
265 meson.source_root() / 'scripts/qapi/visit.py',
266 meson.source_root() / 'scripts/qapi/common.py',
267 meson.source_root() / 'scripts/qapi/doc.py',
268 meson.source_root() / 'scripts/qapi-gen.py'
272 python, files('scripts/tracetool.py'),
273 '--backend=' + config_host['TRACE_BACKENDS']
276 qemu_version_cmd = [find_program('scripts/qemu-version.sh'),
277 meson.current_source_dir(),
278 config_host['PKGVERSION'], config_host['VERSION']]
279 qemu_version = custom_target('qemu-version.h',
280 output: 'qemu-version.h',
281 command: qemu_version_cmd,
283 build_by_default: true,
284 build_always_stale: true)
287 config_host_h = custom_target('config-host.h',
288 input: meson.current_build_dir() / 'config-host.mak',
289 output: 'config-host.h',
291 command: [create_config, '@INPUT@'])
292 genh += config_host_h
296 ['qemu-options.hx', 'qemu-options.def'],
297 ['qemu-img-cmds.hx', 'qemu-img-cmds.h'],
301 ['hmp-commands.hx', 'hmp-commands.h'],
302 ['hmp-commands-info.hx', 'hmp-commands-info.h'],
305 foreach d : hx_headers
310 build_by_default: true, # to be removed when added to a target
311 command: [hxtool, '-h', '@INPUT0@'])
315 # Collect sourcesets.
317 util_ss = ss.source_set()
318 stub_ss = ss.source_set()
319 trace_ss = ss.source_set()
320 block_ss = ss.source_set()
321 common_ss = ss.source_set()
322 softmmu_ss = ss.source_set()
323 user_ss = ss.source_set()
324 bsd_user_ss = ss.source_set()
325 linux_user_ss = ss.source_set()
326 specific_ss = ss.source_set()
331 target_softmmu_arch = {}
337 trace_events_subdirs = [
344 trace_events_subdirs += [ 'linux-user' ]
347 trace_events_subdirs += [
356 trace_events_subdirs += [
367 'hw/block/dataplane',
412 trace_events_subdirs += [
435 subdir('storage-daemon')
440 libmodulecommon = static_library('module-common', files('module-common.c') + genh, pic: true, c_args: '-DBUILD_DSO')
441 modulecommon = declare_dependency(link_whole: libmodulecommon, compile_args: '-DBUILD_DSO')
444 # Build targets from sourcesets
446 stub_ss = stub_ss.apply(config_all, strict: false)
448 util_ss.add_all(trace_ss)
449 util_ss = util_ss.apply(config_all, strict: false)
450 libqemuutil = static_library('qemuutil',
451 sources: util_ss.sources() + stub_ss.sources() + genh,
452 dependencies: [util_ss.dependencies(), m, glib, socket])
453 qemuutil = declare_dependency(link_with: libqemuutil,
454 sources: genh + version_res)
463 foreach d, list : modules
464 foreach m, module_ss : list
465 if enable_modules and targetos != 'windows'
466 module_ss = module_ss.apply(config_host, strict: false)
467 sl = static_library(d + '-' + m, [genh, module_ss.sources()],
468 dependencies: [modulecommon, module_ss.dependencies()], pic: true)
476 block_ss.add_all(module_ss)
478 softmmu_ss.add_all(module_ss)
484 nm = find_program('nm')
485 undefsym = find_program('scripts/undefsym.sh')
486 block_syms = custom_target('block.syms', output: 'block.syms',
487 input: [libqemuutil, block_mods],
489 command: [undefsym, nm, '@INPUT@'])
490 qemu_syms = custom_target('qemu.syms', output: 'qemu.syms',
491 input: [libqemuutil, softmmu_mods],
493 command: [undefsym, nm, '@INPUT@'])
495 foreach m : block_mods + softmmu_mods
496 shared_module(m.name(),
500 install_dir: config_host['qemu_moddir'])
503 common_ss.add_all(when: 'CONFIG_SOFTMMU', if_true: softmmu_ss)
504 common_ss.add_all(when: 'CONFIG_USER_ONLY', if_true: user_ss)
506 common_all = common_ss.apply(config_all, strict: false)
507 common_all = static_library('common',
508 build_by_default: false,
509 sources: common_all.sources() + genh,
510 dependencies: common_all.dependencies(),
513 foreach target : target_dirs
514 config_target = config_target_mak[target]
515 target_name = config_target['TARGET_NAME']
516 arch = config_target['TARGET_BASE_ARCH']
519 target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
520 if targetos == 'linux'
521 target_inc += include_directories('linux-headers', is_system: true)
523 if target.endswith('-softmmu')
524 qemu_target_name = 'qemu-system-' + target_name
526 arch_srcs += config_devices_h[target]
529 qemu_target_name = 'qemu-' + target_name
530 if 'CONFIG_LINUX_USER' in config_target
531 base_dir = 'linux-user'
532 target_inc += include_directories('linux-user/host/' / config_host['ARCH'])
534 base_dir = 'bsd-user'
536 target_inc += include_directories(
538 base_dir / config_target['TARGET_ABI_DIR'],
542 target_common = common_ss.apply(config_target, strict: false)
543 objects = common_all.extract_objects(target_common.sources())
545 # TODO: Change to generator once obj-y goes away
546 config_target_h = custom_target(target + '-config-target.h',
547 input: meson.current_build_dir() / target / 'config-target.mak',
548 output: target + '-config-target.h',
550 command: [create_config, '@INPUT@'])
552 target_specific = specific_ss.apply(config_target, strict: false)
553 arch_srcs += target_specific.sources()
555 static_library('qemu-' + target,
556 sources: arch_srcs + [config_target_h] + genh,
558 include_directories: target_inc,
559 c_args: ['-DNEED_CPU_H',
560 '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
561 '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)],
565 # Other build targets
566 if 'CONFIG_GUEST_AGENT' in config_host
571 subdir('contrib/rdmacm-mux')
572 subdir('contrib/elf2dmp')
574 if 'CONFIG_XKBCOMMON' in config_host
575 executable('qemu-keymap', files('qemu-keymap.c', 'ui/input-keymap.c'),
576 dependencies: [qemuutil, xkbcommon], install: true)
579 executable('qemu-edid', files('qemu-edid.c', 'hw/display/edid-generate.c'),
580 dependencies: qemuutil,
583 if 'CONFIG_VHOST_USER' in config_host
584 subdir('contrib/libvhost-user')
585 subdir('contrib/vhost-user-blk')
586 if 'CONFIG_LINUX' in config_host
587 subdir('contrib/vhost-user-gpu')
589 subdir('contrib/vhost-user-input')
590 subdir('contrib/vhost-user-scsi')
593 if targetos == 'linux'
594 executable('qemu-bridge-helper', files('qemu-bridge-helper.c'),
595 dependencies: [qemuutil, libcap_ng],
597 install_dir: get_option('libexecdir'))
600 if 'CONFIG_IVSHMEM' in config_host
601 subdir('contrib/ivshmem-client')
602 subdir('contrib/ivshmem-server')
611 summary_info += {'Install prefix': config_host['prefix']}
612 summary_info += {'BIOS directory': config_host['qemu_datadir']}
613 summary_info += {'firmware path': config_host['qemu_firmwarepath']}
614 summary_info += {'binary directory': config_host['bindir']}
615 summary_info += {'library directory': config_host['libdir']}
616 summary_info += {'module directory': config_host['qemu_moddir']}
617 summary_info += {'libexec directory': config_host['libexecdir']}
618 summary_info += {'include directory': config_host['includedir']}
619 summary_info += {'config directory': config_host['sysconfdir']}
620 if targetos != 'windows'
621 summary_info += {'local state directory': config_host['qemu_localstatedir']}
622 summary_info += {'Manual directory': config_host['mandir']}
624 summary_info += {'local state directory': 'queried at runtime'}
626 summary_info += {'Build directory': meson.current_build_dir()}
627 summary_info += {'Source path': meson.current_source_dir()}
628 summary_info += {'GIT binary': config_host['GIT']}
629 summary_info += {'GIT submodules': config_host['GIT_SUBMODULES']}
630 summary_info += {'C compiler': meson.get_compiler('c').cmd_array()[0]}
631 summary_info += {'Host C compiler': meson.get_compiler('c', native: true).cmd_array()[0]}
632 if link_language == 'cpp'
633 summary_info += {'C++ compiler': meson.get_compiler('cpp').cmd_array()[0]}
635 summary_info += {'C++ compiler': false}
637 if targetos == 'darwin'
638 summary_info += {'Objective-C compiler': meson.get_compiler('objc').cmd_array()[0]}
640 summary_info += {'ARFLAGS': config_host['ARFLAGS']}
641 summary_info += {'CFLAGS': config_host['CFLAGS']}
642 summary_info += {'QEMU_CFLAGS': config_host['QEMU_CFLAGS']}
643 summary_info += {'QEMU_LDFLAGS': config_host['QEMU_LDFLAGS']}
644 summary_info += {'make': config_host['MAKE']}
645 summary_info += {'install': config_host['INSTALL']}
646 summary_info += {'python': '@0@ (version: @1@)'.format(python.full_path(), python.language_version())}
647 summary_info += {'sphinx-build': config_host['SPHINX_BUILD']}
648 summary_info += {'genisoimage': config_host['GENISOIMAGE']}
649 # TODO: add back version
650 summary_info += {'slirp support': config_host.has_key('CONFIG_SLIRP')}
651 if config_host.has_key('CONFIG_SLIRP')
652 summary_info += {'smbd': config_host['CONFIG_SMBD_COMMAND']}
654 summary_info += {'module support': config_host.has_key('CONFIG_MODULES')}
655 if config_host.has_key('CONFIG_MODULES')
656 summary_info += {'alternative module path': config_host.has_key('CONFIG_MODULE_UPGRADES')}
658 summary_info += {'host CPU': cpu}
659 summary_info += {'host endianness': build_machine.endian()}
660 summary_info += {'target list': config_host['TARGET_DIRS']}
661 summary_info += {'gprof enabled': config_host.has_key('CONFIG_GPROF')}
662 summary_info += {'sparse enabled': meson.get_compiler('c').cmd_array().contains('cgcc')}
663 summary_info += {'strip binaries': get_option('strip')}
664 summary_info += {'profiler': config_host.has_key('CONFIG_PROFILER')}
665 summary_info += {'static build': config_host.has_key('CONFIG_TOOLS')}
666 if targetos == 'darwin'
667 summary_info += {'Cocoa support': config_host.has_key('CONFIG_COCOA')}
669 # TODO: add back version
670 summary_info += {'SDL support': config_host.has_key('CONFIG_SDL')}
671 summary_info += {'SDL image support': config_host.has_key('CONFIG_SDL_IMAGE')}
672 # TODO: add back version
673 summary_info += {'GTK support': config_host.has_key('CONFIG_GTK')}
674 summary_info += {'GTK GL support': config_host.has_key('CONFIG_GTK_GL')}
675 # TODO: add back version
676 summary_info += {'VTE support': config_host.has_key('CONFIG_VTE')}
677 summary_info += {'TLS priority': config_host['CONFIG_TLS_PRIORITY']}
678 summary_info += {'GNUTLS support': config_host.has_key('CONFIG_GNUTLS')}
679 # TODO: add back version
680 summary_info += {'libgcrypt': config_host.has_key('CONFIG_GCRYPT')}
681 if config_host.has_key('CONFIG_GCRYPT')
682 summary_info += {' hmac': config_host.has_key('CONFIG_GCRYPT_HMAC')}
683 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
685 # TODO: add back version
686 summary_info += {'nettle': config_host.has_key('CONFIG_NETTLE')}
687 if config_host.has_key('CONFIG_NETTLE')
688 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
690 summary_info += {'libtasn1': config_host.has_key('CONFIG_TASN1')}
691 summary_info += {'PAM': config_host.has_key('CONFIG_AUTH_PAM')}
692 summary_info += {'iconv support': config_host.has_key('CONFIG_ICONV')}
693 summary_info += {'curses support': config_host.has_key('CONFIG_CURSES')}
694 # TODO: add back version
695 summary_info += {'virgl support': config_host.has_key('CONFIG_VIRGL')}
696 summary_info += {'curl support': config_host.has_key('CONFIG_CURL')}
697 summary_info += {'mingw32 support': targetos == 'windows'}
698 summary_info += {'Audio drivers': config_host['CONFIG_AUDIO_DRIVERS']}
699 summary_info += {'Block whitelist (rw)': config_host['CONFIG_BDRV_RW_WHITELIST']}
700 summary_info += {'Block whitelist (ro)': config_host['CONFIG_BDRV_RO_WHITELIST']}
701 summary_info += {'VirtFS support': config_host.has_key('CONFIG_VIRTFS')}
702 summary_info += {'Multipath support': config_host.has_key('CONFIG_MPATH')}
703 summary_info += {'VNC support': config_host.has_key('CONFIG_VNC')}
704 if config_host.has_key('CONFIG_VNC')
705 summary_info += {'VNC SASL support': config_host.has_key('CONFIG_VNC_SASL')}
706 summary_info += {'VNC JPEG support': config_host.has_key('CONFIG_VNC_JPEG')}
707 summary_info += {'VNC PNG support': config_host.has_key('CONFIG_VNC_PNG')}
709 summary_info += {'xen support': config_host.has_key('CONFIG_XEN_BACKEND')}
710 if config_host.has_key('CONFIG_XEN_BACKEND')
711 summary_info += {'xen ctrl version': config_host['CONFIG_XEN_CTRL_INTERFACE_VERSION']}
713 summary_info += {'brlapi support': config_host.has_key('CONFIG_BRLAPI')}
714 summary_info += {'Documentation': config_host.has_key('BUILD_DOCS')}
715 summary_info += {'PIE': get_option('b_pie')}
716 summary_info += {'vde support': config_host.has_key('CONFIG_VDE')}
717 summary_info += {'netmap support': config_host.has_key('CONFIG_NETMAP')}
718 summary_info += {'Linux AIO support': config_host.has_key('CONFIG_LINUX_AIO')}
719 summary_info += {'Linux io_uring support': config_host.has_key('CONFIG_LINUX_IO_URING')}
720 summary_info += {'ATTR/XATTR support': config_host.has_key('CONFIG_ATTR')}
721 summary_info += {'Install blobs': config_host.has_key('INSTALL_BLOBS')}
722 # TODO: add back KVM/HAX/HVF/WHPX/TCG
723 #summary_info += {'KVM support': have_kvm'}
724 #summary_info += {'HAX support': have_hax'}
725 #summary_info += {'HVF support': have_hvf'}
726 #summary_info += {'WHPX support': have_whpx'}
727 #summary_info += {'TCG support': have_tcg'}
728 #if get_option('tcg')
729 # summary_info += {'TCG debug enabled': config_host.has_key('CONFIG_DEBUG_TCG')}
730 # summary_info += {'TCG interpreter': config_host.has_key('CONFIG_TCG_INTERPRETER')}
732 summary_info += {'malloc trim support': config_host.has_key('CONFIG_MALLOC_TRIM')}
733 summary_info += {'RDMA support': config_host.has_key('CONFIG_RDMA')}
734 summary_info += {'PVRDMA support': config_host.has_key('CONFIG_PVRDMA')}
735 summary_info += {'fdt support': config_host.has_key('CONFIG_FDT')}
736 summary_info += {'membarrier': config_host.has_key('CONFIG_MEMBARRIER')}
737 summary_info += {'preadv support': config_host.has_key('CONFIG_PREADV')}
738 summary_info += {'fdatasync': config_host.has_key('CONFIG_FDATASYNC')}
739 summary_info += {'madvise': config_host.has_key('CONFIG_MADVISE')}
740 summary_info += {'posix_madvise': config_host.has_key('CONFIG_POSIX_MADVISE')}
741 summary_info += {'posix_memalign': config_host.has_key('CONFIG_POSIX_MEMALIGN')}
742 summary_info += {'libcap-ng support': config_host.has_key('CONFIG_LIBCAP_NG')}
743 summary_info += {'vhost-net support': config_host.has_key('CONFIG_VHOST_NET')}
744 summary_info += {'vhost-crypto support': config_host.has_key('CONFIG_VHOST_CRYPTO')}
745 summary_info += {'vhost-scsi support': config_host.has_key('CONFIG_VHOST_SCSI')}
746 summary_info += {'vhost-vsock support': config_host.has_key('CONFIG_VHOST_VSOCK')}
747 summary_info += {'vhost-user support': config_host.has_key('CONFIG_VHOST_KERNEL')}
748 summary_info += {'vhost-user-fs support': config_host.has_key('CONFIG_VHOST_USER_FS')}
749 summary_info += {'vhost-vdpa support': config_host.has_key('CONFIG_VHOST_VDPA')}
750 summary_info += {'Trace backends': config_host['TRACE_BACKENDS']}
751 if config_host['TRACE_BACKENDS'].split().contains('simple')
752 summary_info += {'Trace output file': config_host['CONFIG_TRACE_FILE'] + '-<pid>'}
754 # TODO: add back protocol and server version
755 summary_info += {'spice support': config_host.has_key('CONFIG_SPICE')}
756 summary_info += {'rbd support': config_host.has_key('CONFIG_RBD')}
757 summary_info += {'xfsctl support': config_host.has_key('CONFIG_XFS')}
758 summary_info += {'smartcard support': config_host.has_key('CONFIG_SMARTCARD')}
759 summary_info += {'libusb': config_host.has_key('CONFIG_USB_LIBUSB')}
760 summary_info += {'usb net redir': config_host.has_key('CONFIG_USB_REDIR')}
761 summary_info += {'OpenGL support': config_host.has_key('CONFIG_OPENGL')}
762 summary_info += {'OpenGL dmabufs': config_host.has_key('CONFIG_OPENGL_DMABUF')}
763 summary_info += {'libiscsi support': config_host.has_key('CONFIG_LIBISCSI')}
764 summary_info += {'libnfs support': config_host.has_key('CONFIG_LIBNFS')}
765 summary_info += {'build guest agent': config_host.has_key('CONFIG_GUEST_AGENT')}
766 if targetos == 'windows'
767 if 'WIN_SDK' in config_host
768 summary_info += {'Windows SDK': config_host['WIN_SDK']}
770 summary_info += {'QGA VSS support': config_host.has_key('CONFIG_QGA_VSS')}
771 summary_info += {'QGA w32 disk info': config_host.has_key('CONFIG_QGA_NTDDSCSI')}
772 summary_info += {'QGA MSI support': config_host.has_key('CONFIG_QGA_MSI_ENABLED')}
774 summary_info += {'seccomp support': config_host.has_key('CONFIG_SECCOMP')}
775 summary_info += {'coroutine backend': config_host['CONFIG_COROUTINE_BACKEND']}
776 summary_info += {'coroutine pool': config_host['CONFIG_COROUTINE_POOL'] == '1'}
777 summary_info += {'debug stack usage': config_host.has_key('CONFIG_DEBUG_STACK_USAGE')}
778 summary_info += {'mutex debugging': config_host.has_key('CONFIG_DEBUG_MUTEX')}
779 summary_info += {'crypto afalg': config_host.has_key('CONFIG_AF_ALG')}
780 summary_info += {'GlusterFS support': config_host.has_key('CONFIG_GLUSTERFS')}
781 summary_info += {'gcov': get_option('b_coverage')}
782 summary_info += {'TPM support': config_host.has_key('CONFIG_TPM')}
783 summary_info += {'libssh support': config_host.has_key('CONFIG_LIBSSH')}
784 summary_info += {'QOM debugging': config_host.has_key('CONFIG_QOM_CAST_DEBUG')}
785 summary_info += {'Live block migration': config_host.has_key('CONFIG_LIVE_BLOCK_MIGRATION')}
786 summary_info += {'lzo support': config_host.has_key('CONFIG_LZO')}
787 summary_info += {'snappy support': config_host.has_key('CONFIG_SNAPPY')}
788 summary_info += {'bzip2 support': config_host.has_key('CONFIG_BZIP2')}
789 summary_info += {'lzfse support': config_host.has_key('CONFIG_LZFSE')}
790 summary_info += {'zstd support': config_host.has_key('CONFIG_ZSTD')}
791 summary_info += {'NUMA host support': config_host.has_key('CONFIG_NUMA')}
792 summary_info += {'libxml2': config_host.has_key('CONFIG_LIBXML2')}
793 summary_info += {'tcmalloc support': config_host.has_key('CONFIG_TCMALLOC')}
794 summary_info += {'jemalloc support': config_host.has_key('CONFIG_JEMALLOC')}
795 summary_info += {'avx2 optimization': config_host.has_key('CONFIG_AVX2_OPT')}
796 summary_info += {'avx512f optimization': config_host.has_key('CONFIG_AVX512F_OPT')}
797 summary_info += {'replication support': config_host.has_key('CONFIG_REPLICATION')}
798 summary_info += {'bochs support': config_host.has_key('CONFIG_BOCHS')}
799 summary_info += {'cloop support': config_host.has_key('CONFIG_CLOOP')}
800 summary_info += {'dmg support': config_host.has_key('CONFIG_DMG')}
801 summary_info += {'qcow v1 support': config_host.has_key('CONFIG_QCOW1')}
802 summary_info += {'vdi support': config_host.has_key('CONFIG_VDI')}
803 summary_info += {'vvfat support': config_host.has_key('CONFIG_VVFAT')}
804 summary_info += {'qed support': config_host.has_key('CONFIG_QED')}
805 summary_info += {'parallels support': config_host.has_key('CONFIG_PARALLELS')}
806 summary_info += {'sheepdog support': config_host.has_key('CONFIG_SHEEPDOG')}
807 summary_info += {'capstone': config_host.has_key('CONFIG_CAPSTONE')}
808 summary_info += {'libpmem support': config_host.has_key('CONFIG_LIBPMEM')}
809 summary_info += {'libdaxctl support': config_host.has_key('CONFIG_LIBDAXCTL')}
810 summary_info += {'libudev': config_host.has_key('CONFIG_LIBUDEV')}
811 summary_info += {'default devices': config_host['CONFIG_MINIKCONF_MODE'] == '--defconfig'}
812 summary_info += {'plugin support': config_host.has_key('CONFIG_PLUGIN')}
813 summary_info += {'fuzzing support': config_host.has_key('CONFIG_FUZZ')}
814 if config_host.has_key('HAVE_GDB_BIN')
815 summary_info += {'gdb': config_host['HAVE_GDB_BIN']}
817 summary_info += {'thread sanitizer': config_host.has_key('CONFIG_TSAN')}
818 summary_info += {'rng-none': config_host.has_key('CONFIG_RNG_NONE')}
819 summary_info += {'Linux keyring': config_host.has_key('CONFIG_SECRET_KEYRING')}
820 summary(summary_info, bool_yn: true)
822 if not supported_cpus.contains(cpu)
824 warning('SUPPORT FOR THIS HOST CPU WILL GO AWAY IN FUTURE RELEASES!')
826 message('CPU host architecture ' + cpu + ' support is not currently maintained.')
827 message('The QEMU project intends to remove support for this host CPU in')
828 message('a future release if nobody volunteers to maintain it and to')
829 message('provide a build host for our continuous integration setup.')
830 message('configure has succeeded and you can continue to build, but')
831 message('if you care about QEMU on this platform you should contact')
832 message('us upstream at qemu-devel@nongnu.org.')
835 if not supported_oses.contains(targetos)
837 warning('WARNING: SUPPORT FOR THIS HOST OS WILL GO AWAY IN FUTURE RELEASES!')
839 message('Host OS ' + targetos + 'support is not currently maintained.')
840 message('The QEMU project intends to remove support for this host OS in')
841 message('a future release if nobody volunteers to maintain it and to')
842 message('provide a build host for our continuous integration setup.')
843 message('configure has succeeded and you can continue to build, but')
844 message('if you care about QEMU on this platform you should contact')
845 message('us upstream at qemu-devel@nongnu.org.')