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')
112 libaio = cc.find_library('aio', required: false)
114 if 'CONFIG_ZLIB' in config_host
115 zlib = declare_dependency(compile_args: config_host['ZLIB_CFLAGS'].split(),
116 link_args: config_host['ZLIB_LIBS'].split())
118 linux_io_uring = not_found
119 if 'CONFIG_LINUX_IO_URING' in config_host
120 linux_io_uring = declare_dependency(compile_args: config_host['LINUX_IO_URING_CFLAGS'].split(),
121 link_args: config_host['LINUX_IO_URING_LIBS'].split())
124 if 'CONFIG_LIBXML2' in config_host
125 libxml2 = declare_dependency(compile_args: config_host['LIBXML2_CFLAGS'].split(),
126 link_args: config_host['LIBXML2_LIBS'].split())
129 if 'CONFIG_LIBNFS' in config_host
130 libnfs = declare_dependency(link_args: config_host['LIBNFS_LIBS'].split())
133 if 'CONFIG_ATTR' in config_host
134 libattr = declare_dependency(link_args: config_host['LIBATTR_LIBS'].split())
137 if 'CONFIG_SECCOMP' in config_host
138 seccomp = declare_dependency(compile_args: config_host['SECCOMP_CFLAGS'].split(),
139 link_args: config_host['SECCOMP_LIBS'].split())
141 libcap_ng = not_found
142 if 'CONFIG_LIBCAP_NG' in config_host
143 libcap_ng = declare_dependency(link_args: config_host['LIBCAP_NG_LIBS'].split())
145 xkbcommon = not_found
146 if 'CONFIG_XKBCOMMON' in config_host
147 xkbcommon = declare_dependency(compile_args: config_host['XKBCOMMON_CFLAGS'].split(),
148 link_args: config_host['XKBCOMMON_LIBS'].split())
150 rt = cc.find_library('rt', required: false)
152 if 'CONFIG_LIBISCSI' in config_host
153 libiscsi = declare_dependency(compile_args: config_host['LIBISCSI_CFLAGS'].split(),
154 link_args: config_host['LIBISCSI_LIBS'].split())
157 if 'CONFIG_ZSTD' in config_host
158 zstd = declare_dependency(compile_args: config_host['ZSTD_CFLAGS'].split(),
159 link_args: config_host['ZSTD_LIBS'].split())
162 if 'CONFIG_GBM' in config_host
163 gbm = declare_dependency(compile_args: config_host['GBM_CFLAGS'].split(),
164 link_args: config_host['GBM_LIBS'].split())
167 if 'CONFIG_VIRGL' in config_host
168 virgl = declare_dependency(compile_args: config_host['VIRGL_CFLAGS'].split(),
169 link_args: config_host['VIRGL_LIBS'].split())
172 if 'CONFIG_CURL' in config_host
173 curl = declare_dependency(compile_args: config_host['CURL_CFLAGS'].split(),
174 link_args: config_host['CURL_LIBS'].split())
177 if 'CONFIG_LIBUDEV' in config_host
178 libudev = declare_dependency(link_args: config_host['LIBUDEV_LIBS'].split())
181 if 'CONFIG_RBD' in config_host
182 rbd = declare_dependency(link_args: config_host['RBD_LIBS'].split())
184 glusterfs = not_found
185 if 'CONFIG_GLUSTERFS' in config_host
186 glusterfs = declare_dependency(compile_args: config_host['GLUSTERFS_CFLAGS'].split(),
187 link_args: config_host['GLUSTERFS_LIBS'].split())
190 if 'CONFIG_LIBSSH' in config_host
191 libssh = declare_dependency(compile_args: config_host['LIBSSH_CFLAGS'].split(),
192 link_args: config_host['LIBSSH_LIBS'].split())
195 if 'CONFIG_BZIP2' in config_host
196 libbzip2 = declare_dependency(link_args: config_host['BZIP2_LIBS'].split())
199 if 'CONFIG_LZFSE' in config_host
200 liblzfse = declare_dependency(link_args: config_host['LZFSE_LIBS'].split())
203 create_config = find_program('scripts/create_config')
204 minikconf = find_program('scripts/minikconf.py')
205 target_dirs = config_host['TARGET_DIRS'].split()
208 config_devices_mak_list = []
209 config_devices_h = {}
210 config_target_mak = {}
211 kconfig_external_symbols = [
220 'CONFIG_VHOST_KERNEL',
225 foreach target : target_dirs
226 have_user = have_user or target.endswith('-user')
227 config_target = keyval.load(meson.current_build_dir() / target / 'config-target.mak') + config_host
229 if target.endswith('-softmmu')
233 foreach sym : kconfig_external_symbols
234 if sym in config_target
235 base_kconfig += '@0@=y'.format(sym)
239 config_devices_mak = target + '-config-devices.mak'
240 config_devices_mak = configure_file(
241 input: ['default-configs' / target + '.mak', 'Kconfig'],
242 output: config_devices_mak,
243 depfile: config_devices_mak + '.d',
245 command: [minikconf, config_host['CONFIG_MINIKCONF_MODE'],
246 config_devices_mak, '@DEPFILE@', '@INPUT@',
248 config_devices_h += {target: custom_target(
249 target + '-config-devices.h',
250 input: config_devices_mak,
251 output: target + '-config-devices.h',
253 command: [create_config, '@INPUT@'])}
254 config_devices_mak_list += config_devices_mak
255 config_target += keyval.load(config_devices_mak)
257 config_target_mak += {target: config_target}
259 have_tools = 'CONFIG_TOOLS' in config_host
260 have_block = have_system or have_tools
262 grepy = find_program('scripts/grepy.sh')
263 # This configuration is used to build files that are shared by
264 # multiple binaries, and then extracted out of the "common"
265 # static_library target.
267 # We do not use all_sources()/all_dependencies(), because it would
268 # build literally all source files, including devices only used by
269 # targets that are not built for this compilation. The CONFIG_ALL
270 # pseudo symbol replaces it.
273 config_all_devices_mak = configure_file(
274 output: 'config-all-devices.mak',
275 input: config_devices_mak_list,
277 command: [grepy, '@INPUT@'],
279 config_all_devices = keyval.load(config_all_devices_mak)
281 config_all_devices = {}
283 config_all = config_all_devices
284 config_all += config_host
285 config_all += config_all_disas
287 'CONFIG_XEN': config_host.has_key('CONFIG_XEN_BACKEND'),
288 'CONFIG_SOFTMMU': have_system,
289 'CONFIG_USER_ONLY': have_user,
296 hxtool = find_program('scripts/hxtool')
297 shaderinclude = find_program('scripts/shaderinclude.pl')
298 qapi_gen = find_program('scripts/qapi-gen.py')
299 qapi_gen_depends = [ meson.source_root() / 'scripts/qapi/__init__.py',
300 meson.source_root() / 'scripts/qapi/commands.py',
301 meson.source_root() / 'scripts/qapi/common.py',
302 meson.source_root() / 'scripts/qapi/doc.py',
303 meson.source_root() / 'scripts/qapi/error.py',
304 meson.source_root() / 'scripts/qapi/events.py',
305 meson.source_root() / 'scripts/qapi/expr.py',
306 meson.source_root() / 'scripts/qapi/gen.py',
307 meson.source_root() / 'scripts/qapi/introspect.py',
308 meson.source_root() / 'scripts/qapi/parser.py',
309 meson.source_root() / 'scripts/qapi/schema.py',
310 meson.source_root() / 'scripts/qapi/source.py',
311 meson.source_root() / 'scripts/qapi/types.py',
312 meson.source_root() / 'scripts/qapi/visit.py',
313 meson.source_root() / 'scripts/qapi/common.py',
314 meson.source_root() / 'scripts/qapi/doc.py',
315 meson.source_root() / 'scripts/qapi-gen.py'
319 python, files('scripts/tracetool.py'),
320 '--backend=' + config_host['TRACE_BACKENDS']
323 qemu_version_cmd = [find_program('scripts/qemu-version.sh'),
324 meson.current_source_dir(),
325 config_host['PKGVERSION'], config_host['VERSION']]
326 qemu_version = custom_target('qemu-version.h',
327 output: 'qemu-version.h',
328 command: qemu_version_cmd,
330 build_by_default: true,
331 build_always_stale: true)
334 config_host_h = custom_target('config-host.h',
335 input: meson.current_build_dir() / 'config-host.mak',
336 output: 'config-host.h',
338 command: [create_config, '@INPUT@'])
339 genh += config_host_h
343 ['qemu-options.hx', 'qemu-options.def'],
344 ['qemu-img-cmds.hx', 'qemu-img-cmds.h'],
348 ['hmp-commands.hx', 'hmp-commands.h'],
349 ['hmp-commands-info.hx', 'hmp-commands-info.h'],
352 foreach d : hx_headers
353 hxdep += custom_target(d[1],
357 build_by_default: true, # to be removed when added to a target
358 command: [hxtool, '-h', '@INPUT0@'])
362 # Collect sourcesets.
364 util_ss = ss.source_set()
365 stub_ss = ss.source_set()
366 trace_ss = ss.source_set()
367 block_ss = ss.source_set()
368 common_ss = ss.source_set()
369 softmmu_ss = ss.source_set()
370 user_ss = ss.source_set()
371 bsd_user_ss = ss.source_set()
372 linux_user_ss = ss.source_set()
373 specific_ss = ss.source_set()
378 target_softmmu_arch = {}
384 trace_events_subdirs = [
391 trace_events_subdirs += [ 'linux-user' ]
394 trace_events_subdirs += [
403 trace_events_subdirs += [
414 'hw/block/dataplane',
459 trace_events_subdirs += [
482 subdir('storage-daemon')
487 libmodulecommon = static_library('module-common', files('module-common.c') + genh, pic: true, c_args: '-DBUILD_DSO')
488 modulecommon = declare_dependency(link_whole: libmodulecommon, compile_args: '-DBUILD_DSO')
491 # Build targets from sourcesets
493 stub_ss = stub_ss.apply(config_all, strict: false)
495 util_ss.add_all(trace_ss)
496 util_ss = util_ss.apply(config_all, strict: false)
497 libqemuutil = static_library('qemuutil',
498 sources: util_ss.sources() + stub_ss.sources() + genh,
499 dependencies: [util_ss.dependencies(), m, glib, socket])
500 qemuutil = declare_dependency(link_with: libqemuutil,
501 sources: genh + version_res)
514 block_ss.add(when: 'CONFIG_REPLICATION', if_true: files('replication.c'))
522 foreach d, list : modules
523 foreach m, module_ss : list
524 if enable_modules and targetos != 'windows'
525 module_ss = module_ss.apply(config_host, strict: false)
526 sl = static_library(d + '-' + m, [genh, module_ss.sources()],
527 dependencies: [modulecommon, module_ss.dependencies()], pic: true)
535 block_ss.add_all(module_ss)
537 softmmu_ss.add_all(module_ss)
543 nm = find_program('nm')
544 undefsym = find_program('scripts/undefsym.sh')
545 block_syms = custom_target('block.syms', output: 'block.syms',
546 input: [libqemuutil, block_mods],
548 command: [undefsym, nm, '@INPUT@'])
549 qemu_syms = custom_target('qemu.syms', output: 'qemu.syms',
550 input: [libqemuutil, softmmu_mods],
552 command: [undefsym, nm, '@INPUT@'])
554 block_ss = block_ss.apply(config_host, strict: false)
555 libblock = static_library('block', block_ss.sources() + genh,
556 dependencies: block_ss.dependencies(),
557 link_depends: block_syms,
559 build_by_default: false)
561 block = declare_dependency(link_whole: [libblock],
562 link_args: '@block.syms',
563 dependencies: [crypto, io])
565 foreach m : block_mods + softmmu_mods
566 shared_module(m.name(),
570 install_dir: config_host['qemu_moddir'])
573 common_ss.add_all(when: 'CONFIG_SOFTMMU', if_true: softmmu_ss)
574 common_ss.add_all(when: 'CONFIG_USER_ONLY', if_true: user_ss)
576 common_all = common_ss.apply(config_all, strict: false)
577 common_all = static_library('common',
578 build_by_default: false,
579 sources: common_all.sources() + genh,
580 dependencies: common_all.dependencies(),
583 foreach target : target_dirs
584 config_target = config_target_mak[target]
585 target_name = config_target['TARGET_NAME']
586 arch = config_target['TARGET_BASE_ARCH']
589 target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
590 if targetos == 'linux'
591 target_inc += include_directories('linux-headers', is_system: true)
593 if target.endswith('-softmmu')
594 qemu_target_name = 'qemu-system-' + target_name
596 arch_srcs += config_devices_h[target]
599 qemu_target_name = 'qemu-' + target_name
600 if 'CONFIG_LINUX_USER' in config_target
601 base_dir = 'linux-user'
602 target_inc += include_directories('linux-user/host/' / config_host['ARCH'])
604 base_dir = 'bsd-user'
606 target_inc += include_directories(
608 base_dir / config_target['TARGET_ABI_DIR'],
612 target_common = common_ss.apply(config_target, strict: false)
613 objects = common_all.extract_objects(target_common.sources())
615 # TODO: Change to generator once obj-y goes away
616 config_target_h = custom_target(target + '-config-target.h',
617 input: meson.current_build_dir() / target / 'config-target.mak',
618 output: target + '-config-target.h',
620 command: [create_config, '@INPUT@'])
622 target_specific = specific_ss.apply(config_target, strict: false)
623 arch_srcs += target_specific.sources()
625 static_library('qemu-' + target,
626 sources: arch_srcs + [config_target_h] + genh,
628 include_directories: target_inc,
629 c_args: ['-DNEED_CPU_H',
635 # Other build targets
636 if 'CONFIG_GUEST_AGENT' in config_host
641 qemu_img = executable('qemu-img', [files('qemu-img.c'), hxdep],
642 dependencies: [authz, block, crypto, io, qom, qemuutil], install: true)
643 qemu_io = executable('qemu-io', files('qemu-io.c'),
644 dependencies: [block, qemuutil], install: true)
645 if targetos == 'linux' or targetos == 'sunos' or targetos.endswith('bsd')
646 qemu_nbd = executable('qemu-nbd', files('qemu-nbd.c'),
647 dependencies: [block, qemuutil], install: true)
650 subdir('contrib/rdmacm-mux')
651 subdir('contrib/elf2dmp')
653 if 'CONFIG_XKBCOMMON' in config_host
654 executable('qemu-keymap', files('qemu-keymap.c', 'ui/input-keymap.c'),
655 dependencies: [qemuutil, xkbcommon], install: true)
658 executable('qemu-edid', files('qemu-edid.c', 'hw/display/edid-generate.c'),
659 dependencies: qemuutil,
662 if 'CONFIG_VHOST_USER' in config_host
663 subdir('contrib/libvhost-user')
664 subdir('contrib/vhost-user-blk')
665 if 'CONFIG_LINUX' in config_host
666 subdir('contrib/vhost-user-gpu')
668 subdir('contrib/vhost-user-input')
669 subdir('contrib/vhost-user-scsi')
672 if targetos == 'linux'
673 executable('qemu-bridge-helper', files('qemu-bridge-helper.c'),
674 dependencies: [qemuutil, libcap_ng],
676 install_dir: get_option('libexecdir'))
679 if 'CONFIG_IVSHMEM' in config_host
680 subdir('contrib/ivshmem-client')
681 subdir('contrib/ivshmem-server')
690 summary_info += {'Install prefix': config_host['prefix']}
691 summary_info += {'BIOS directory': config_host['qemu_datadir']}
692 summary_info += {'firmware path': config_host['qemu_firmwarepath']}
693 summary_info += {'binary directory': config_host['bindir']}
694 summary_info += {'library directory': config_host['libdir']}
695 summary_info += {'module directory': config_host['qemu_moddir']}
696 summary_info += {'libexec directory': config_host['libexecdir']}
697 summary_info += {'include directory': config_host['includedir']}
698 summary_info += {'config directory': config_host['sysconfdir']}
699 if targetos != 'windows'
700 summary_info += {'local state directory': config_host['qemu_localstatedir']}
701 summary_info += {'Manual directory': config_host['mandir']}
703 summary_info += {'local state directory': 'queried at runtime'}
705 summary_info += {'Build directory': meson.current_build_dir()}
706 summary_info += {'Source path': meson.current_source_dir()}
707 summary_info += {'GIT binary': config_host['GIT']}
708 summary_info += {'GIT submodules': config_host['GIT_SUBMODULES']}
709 summary_info += {'C compiler': meson.get_compiler('c').cmd_array()[0]}
710 summary_info += {'Host C compiler': meson.get_compiler('c', native: true).cmd_array()[0]}
711 if link_language == 'cpp'
712 summary_info += {'C++ compiler': meson.get_compiler('cpp').cmd_array()[0]}
714 summary_info += {'C++ compiler': false}
716 if targetos == 'darwin'
717 summary_info += {'Objective-C compiler': meson.get_compiler('objc').cmd_array()[0]}
719 summary_info += {'ARFLAGS': config_host['ARFLAGS']}
720 summary_info += {'CFLAGS': config_host['CFLAGS']}
721 summary_info += {'QEMU_CFLAGS': config_host['QEMU_CFLAGS']}
722 summary_info += {'QEMU_LDFLAGS': config_host['QEMU_LDFLAGS']}
723 summary_info += {'make': config_host['MAKE']}
724 summary_info += {'install': config_host['INSTALL']}
725 summary_info += {'python': '@0@ (version: @1@)'.format(python.full_path(), python.language_version())}
726 summary_info += {'sphinx-build': config_host['SPHINX_BUILD']}
727 summary_info += {'genisoimage': config_host['GENISOIMAGE']}
728 # TODO: add back version
729 summary_info += {'slirp support': config_host.has_key('CONFIG_SLIRP')}
730 if config_host.has_key('CONFIG_SLIRP')
731 summary_info += {'smbd': config_host['CONFIG_SMBD_COMMAND']}
733 summary_info += {'module support': config_host.has_key('CONFIG_MODULES')}
734 if config_host.has_key('CONFIG_MODULES')
735 summary_info += {'alternative module path': config_host.has_key('CONFIG_MODULE_UPGRADES')}
737 summary_info += {'host CPU': cpu}
738 summary_info += {'host endianness': build_machine.endian()}
739 summary_info += {'target list': config_host['TARGET_DIRS']}
740 summary_info += {'gprof enabled': config_host.has_key('CONFIG_GPROF')}
741 summary_info += {'sparse enabled': meson.get_compiler('c').cmd_array().contains('cgcc')}
742 summary_info += {'strip binaries': get_option('strip')}
743 summary_info += {'profiler': config_host.has_key('CONFIG_PROFILER')}
744 summary_info += {'static build': config_host.has_key('CONFIG_TOOLS')}
745 if targetos == 'darwin'
746 summary_info += {'Cocoa support': config_host.has_key('CONFIG_COCOA')}
748 # TODO: add back version
749 summary_info += {'SDL support': config_host.has_key('CONFIG_SDL')}
750 summary_info += {'SDL image support': config_host.has_key('CONFIG_SDL_IMAGE')}
751 # TODO: add back version
752 summary_info += {'GTK support': config_host.has_key('CONFIG_GTK')}
753 summary_info += {'GTK GL support': config_host.has_key('CONFIG_GTK_GL')}
754 # TODO: add back version
755 summary_info += {'VTE support': config_host.has_key('CONFIG_VTE')}
756 summary_info += {'TLS priority': config_host['CONFIG_TLS_PRIORITY']}
757 summary_info += {'GNUTLS support': config_host.has_key('CONFIG_GNUTLS')}
758 # TODO: add back version
759 summary_info += {'libgcrypt': config_host.has_key('CONFIG_GCRYPT')}
760 if config_host.has_key('CONFIG_GCRYPT')
761 summary_info += {' hmac': config_host.has_key('CONFIG_GCRYPT_HMAC')}
762 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
764 # TODO: add back version
765 summary_info += {'nettle': config_host.has_key('CONFIG_NETTLE')}
766 if config_host.has_key('CONFIG_NETTLE')
767 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
769 summary_info += {'libtasn1': config_host.has_key('CONFIG_TASN1')}
770 summary_info += {'PAM': config_host.has_key('CONFIG_AUTH_PAM')}
771 summary_info += {'iconv support': config_host.has_key('CONFIG_ICONV')}
772 summary_info += {'curses support': config_host.has_key('CONFIG_CURSES')}
773 # TODO: add back version
774 summary_info += {'virgl support': config_host.has_key('CONFIG_VIRGL')}
775 summary_info += {'curl support': config_host.has_key('CONFIG_CURL')}
776 summary_info += {'mingw32 support': targetos == 'windows'}
777 summary_info += {'Audio drivers': config_host['CONFIG_AUDIO_DRIVERS']}
778 summary_info += {'Block whitelist (rw)': config_host['CONFIG_BDRV_RW_WHITELIST']}
779 summary_info += {'Block whitelist (ro)': config_host['CONFIG_BDRV_RO_WHITELIST']}
780 summary_info += {'VirtFS support': config_host.has_key('CONFIG_VIRTFS')}
781 summary_info += {'Multipath support': config_host.has_key('CONFIG_MPATH')}
782 summary_info += {'VNC support': config_host.has_key('CONFIG_VNC')}
783 if config_host.has_key('CONFIG_VNC')
784 summary_info += {'VNC SASL support': config_host.has_key('CONFIG_VNC_SASL')}
785 summary_info += {'VNC JPEG support': config_host.has_key('CONFIG_VNC_JPEG')}
786 summary_info += {'VNC PNG support': config_host.has_key('CONFIG_VNC_PNG')}
788 summary_info += {'xen support': config_host.has_key('CONFIG_XEN_BACKEND')}
789 if config_host.has_key('CONFIG_XEN_BACKEND')
790 summary_info += {'xen ctrl version': config_host['CONFIG_XEN_CTRL_INTERFACE_VERSION']}
792 summary_info += {'brlapi support': config_host.has_key('CONFIG_BRLAPI')}
793 summary_info += {'Documentation': config_host.has_key('BUILD_DOCS')}
794 summary_info += {'PIE': get_option('b_pie')}
795 summary_info += {'vde support': config_host.has_key('CONFIG_VDE')}
796 summary_info += {'netmap support': config_host.has_key('CONFIG_NETMAP')}
797 summary_info += {'Linux AIO support': config_host.has_key('CONFIG_LINUX_AIO')}
798 summary_info += {'Linux io_uring support': config_host.has_key('CONFIG_LINUX_IO_URING')}
799 summary_info += {'ATTR/XATTR support': config_host.has_key('CONFIG_ATTR')}
800 summary_info += {'Install blobs': config_host.has_key('INSTALL_BLOBS')}
801 # TODO: add back KVM/HAX/HVF/WHPX/TCG
802 #summary_info += {'KVM support': have_kvm'}
803 #summary_info += {'HAX support': have_hax'}
804 #summary_info += {'HVF support': have_hvf'}
805 #summary_info += {'WHPX support': have_whpx'}
806 #summary_info += {'TCG support': have_tcg'}
807 #if get_option('tcg')
808 # summary_info += {'TCG debug enabled': config_host.has_key('CONFIG_DEBUG_TCG')}
809 # summary_info += {'TCG interpreter': config_host.has_key('CONFIG_TCG_INTERPRETER')}
811 summary_info += {'malloc trim support': config_host.has_key('CONFIG_MALLOC_TRIM')}
812 summary_info += {'RDMA support': config_host.has_key('CONFIG_RDMA')}
813 summary_info += {'PVRDMA support': config_host.has_key('CONFIG_PVRDMA')}
814 summary_info += {'fdt support': config_host.has_key('CONFIG_FDT')}
815 summary_info += {'membarrier': config_host.has_key('CONFIG_MEMBARRIER')}
816 summary_info += {'preadv support': config_host.has_key('CONFIG_PREADV')}
817 summary_info += {'fdatasync': config_host.has_key('CONFIG_FDATASYNC')}
818 summary_info += {'madvise': config_host.has_key('CONFIG_MADVISE')}
819 summary_info += {'posix_madvise': config_host.has_key('CONFIG_POSIX_MADVISE')}
820 summary_info += {'posix_memalign': config_host.has_key('CONFIG_POSIX_MEMALIGN')}
821 summary_info += {'libcap-ng support': config_host.has_key('CONFIG_LIBCAP_NG')}
822 summary_info += {'vhost-net support': config_host.has_key('CONFIG_VHOST_NET')}
823 summary_info += {'vhost-crypto support': config_host.has_key('CONFIG_VHOST_CRYPTO')}
824 summary_info += {'vhost-scsi support': config_host.has_key('CONFIG_VHOST_SCSI')}
825 summary_info += {'vhost-vsock support': config_host.has_key('CONFIG_VHOST_VSOCK')}
826 summary_info += {'vhost-user support': config_host.has_key('CONFIG_VHOST_KERNEL')}
827 summary_info += {'vhost-user-fs support': config_host.has_key('CONFIG_VHOST_USER_FS')}
828 summary_info += {'vhost-vdpa support': config_host.has_key('CONFIG_VHOST_VDPA')}
829 summary_info += {'Trace backends': config_host['TRACE_BACKENDS']}
830 if config_host['TRACE_BACKENDS'].split().contains('simple')
831 summary_info += {'Trace output file': config_host['CONFIG_TRACE_FILE'] + '-<pid>'}
833 # TODO: add back protocol and server version
834 summary_info += {'spice support': config_host.has_key('CONFIG_SPICE')}
835 summary_info += {'rbd support': config_host.has_key('CONFIG_RBD')}
836 summary_info += {'xfsctl support': config_host.has_key('CONFIG_XFS')}
837 summary_info += {'smartcard support': config_host.has_key('CONFIG_SMARTCARD')}
838 summary_info += {'libusb': config_host.has_key('CONFIG_USB_LIBUSB')}
839 summary_info += {'usb net redir': config_host.has_key('CONFIG_USB_REDIR')}
840 summary_info += {'OpenGL support': config_host.has_key('CONFIG_OPENGL')}
841 summary_info += {'OpenGL dmabufs': config_host.has_key('CONFIG_OPENGL_DMABUF')}
842 summary_info += {'libiscsi support': config_host.has_key('CONFIG_LIBISCSI')}
843 summary_info += {'libnfs support': config_host.has_key('CONFIG_LIBNFS')}
844 summary_info += {'build guest agent': config_host.has_key('CONFIG_GUEST_AGENT')}
845 if targetos == 'windows'
846 if 'WIN_SDK' in config_host
847 summary_info += {'Windows SDK': config_host['WIN_SDK']}
849 summary_info += {'QGA VSS support': config_host.has_key('CONFIG_QGA_VSS')}
850 summary_info += {'QGA w32 disk info': config_host.has_key('CONFIG_QGA_NTDDSCSI')}
851 summary_info += {'QGA MSI support': config_host.has_key('CONFIG_QGA_MSI_ENABLED')}
853 summary_info += {'seccomp support': config_host.has_key('CONFIG_SECCOMP')}
854 summary_info += {'coroutine backend': config_host['CONFIG_COROUTINE_BACKEND']}
855 summary_info += {'coroutine pool': config_host['CONFIG_COROUTINE_POOL'] == '1'}
856 summary_info += {'debug stack usage': config_host.has_key('CONFIG_DEBUG_STACK_USAGE')}
857 summary_info += {'mutex debugging': config_host.has_key('CONFIG_DEBUG_MUTEX')}
858 summary_info += {'crypto afalg': config_host.has_key('CONFIG_AF_ALG')}
859 summary_info += {'GlusterFS support': config_host.has_key('CONFIG_GLUSTERFS')}
860 summary_info += {'gcov': get_option('b_coverage')}
861 summary_info += {'TPM support': config_host.has_key('CONFIG_TPM')}
862 summary_info += {'libssh support': config_host.has_key('CONFIG_LIBSSH')}
863 summary_info += {'QOM debugging': config_host.has_key('CONFIG_QOM_CAST_DEBUG')}
864 summary_info += {'Live block migration': config_host.has_key('CONFIG_LIVE_BLOCK_MIGRATION')}
865 summary_info += {'lzo support': config_host.has_key('CONFIG_LZO')}
866 summary_info += {'snappy support': config_host.has_key('CONFIG_SNAPPY')}
867 summary_info += {'bzip2 support': config_host.has_key('CONFIG_BZIP2')}
868 summary_info += {'lzfse support': config_host.has_key('CONFIG_LZFSE')}
869 summary_info += {'zstd support': config_host.has_key('CONFIG_ZSTD')}
870 summary_info += {'NUMA host support': config_host.has_key('CONFIG_NUMA')}
871 summary_info += {'libxml2': config_host.has_key('CONFIG_LIBXML2')}
872 summary_info += {'tcmalloc support': config_host.has_key('CONFIG_TCMALLOC')}
873 summary_info += {'jemalloc support': config_host.has_key('CONFIG_JEMALLOC')}
874 summary_info += {'avx2 optimization': config_host.has_key('CONFIG_AVX2_OPT')}
875 summary_info += {'avx512f optimization': config_host.has_key('CONFIG_AVX512F_OPT')}
876 summary_info += {'replication support': config_host.has_key('CONFIG_REPLICATION')}
877 summary_info += {'bochs support': config_host.has_key('CONFIG_BOCHS')}
878 summary_info += {'cloop support': config_host.has_key('CONFIG_CLOOP')}
879 summary_info += {'dmg support': config_host.has_key('CONFIG_DMG')}
880 summary_info += {'qcow v1 support': config_host.has_key('CONFIG_QCOW1')}
881 summary_info += {'vdi support': config_host.has_key('CONFIG_VDI')}
882 summary_info += {'vvfat support': config_host.has_key('CONFIG_VVFAT')}
883 summary_info += {'qed support': config_host.has_key('CONFIG_QED')}
884 summary_info += {'parallels support': config_host.has_key('CONFIG_PARALLELS')}
885 summary_info += {'sheepdog support': config_host.has_key('CONFIG_SHEEPDOG')}
886 summary_info += {'capstone': config_host.has_key('CONFIG_CAPSTONE')}
887 summary_info += {'libpmem support': config_host.has_key('CONFIG_LIBPMEM')}
888 summary_info += {'libdaxctl support': config_host.has_key('CONFIG_LIBDAXCTL')}
889 summary_info += {'libudev': config_host.has_key('CONFIG_LIBUDEV')}
890 summary_info += {'default devices': config_host['CONFIG_MINIKCONF_MODE'] == '--defconfig'}
891 summary_info += {'plugin support': config_host.has_key('CONFIG_PLUGIN')}
892 summary_info += {'fuzzing support': config_host.has_key('CONFIG_FUZZ')}
893 if config_host.has_key('HAVE_GDB_BIN')
894 summary_info += {'gdb': config_host['HAVE_GDB_BIN']}
896 summary_info += {'thread sanitizer': config_host.has_key('CONFIG_TSAN')}
897 summary_info += {'rng-none': config_host.has_key('CONFIG_RNG_NONE')}
898 summary_info += {'Linux keyring': config_host.has_key('CONFIG_SECRET_KEYRING')}
899 summary(summary_info, bool_yn: true)
901 if not supported_cpus.contains(cpu)
903 warning('SUPPORT FOR THIS HOST CPU WILL GO AWAY IN FUTURE RELEASES!')
905 message('CPU host architecture ' + cpu + ' support is not currently maintained.')
906 message('The QEMU project intends to remove support for this host CPU in')
907 message('a future release if nobody volunteers to maintain it and to')
908 message('provide a build host for our continuous integration setup.')
909 message('configure has succeeded and you can continue to build, but')
910 message('if you care about QEMU on this platform you should contact')
914 if not supported_oses.contains(targetos)
916 warning('WARNING: SUPPORT FOR THIS HOST OS WILL GO AWAY IN FUTURE RELEASES!')
918 message('Host OS ' + targetos + 'support is not currently maintained.')
919 message('The QEMU project intends to remove support for this host OS in')
920 message('a future release if nobody volunteers to maintain it and to')
921 message('provide a build host for our continuous integration setup.')
922 message('configure has succeeded and you can continue to build, but')
923 message('if you care about QEMU on this platform you should contact')