1 project('qemu', ['c'], meson_version: '>=0.55.0',
2 default_options: ['warning_level=1', 'c_std=gnu99', 'cpp_std=gnu++11',
4 version: run_command('head', meson.source_root() / 'VERSION').stdout().strip())
6 not_found = dependency('', required: false)
7 if meson.version().version_compare('>=0.56.0')
8 keyval = import('keyval')
10 keyval = import('unstable-keyval')
12 ss = import('sourceset')
14 sh = find_program('sh')
15 cc = meson.get_compiler('c')
16 config_host = keyval.load(meson.current_build_dir() / 'config-host.mak')
17 config_all_disas = keyval.load(meson.current_build_dir() / 'config-all-disas.mak')
18 enable_modules = 'CONFIG_MODULES' in config_host
19 enable_static = 'CONFIG_STATIC' in config_host
20 build_docs = 'BUILD_DOCS' in config_host
21 qemu_datadir = get_option('datadir') / get_option('qemu_suffix')
22 qemu_docdir = get_option('docdir') / get_option('qemu_suffix')
23 config_host_data = configuration_data()
26 target_dirs = config_host['TARGET_DIRS'].split()
29 foreach target : target_dirs
30 have_user = have_user or target.endswith('-user')
31 have_system = have_system or target.endswith('-softmmu')
33 have_tools = 'CONFIG_TOOLS' in config_host
34 have_block = have_system or have_tools
36 add_project_arguments(config_host['QEMU_CFLAGS'].split(),
37 native: false, language: ['c', 'objc'])
38 add_project_arguments(config_host['QEMU_CXXFLAGS'].split(),
39 native: false, language: 'cpp')
40 add_project_link_arguments(config_host['QEMU_LDFLAGS'].split(),
41 native: false, language: ['c', 'cpp', 'objc'])
42 add_project_arguments(config_host['QEMU_INCLUDES'].split(),
43 language: ['c', 'cpp', 'objc'])
45 python = import('python').find_installation()
47 link_language = meson.get_external_property('link_language', 'cpp')
48 if link_language == 'cpp'
49 add_languages('cpp', required: true, native: false)
51 if host_machine.system() == 'darwin'
52 add_languages('objc', required: false, native: false)
55 if 'SPARSE_CFLAGS' in config_host
57 command: [find_program('scripts/check_sparse.py'),
58 config_host['SPARSE_CFLAGS'].split(),
59 'compile_commands.json'])
62 configure_file(input: files('scripts/ninjatool.py'),
64 configuration: config_host)
66 supported_oses = ['windows', 'freebsd', 'netbsd', 'openbsd', 'darwin', 'sunos', 'linux']
67 supported_cpus = ['ppc', 'ppc64', 's390x', 'sparc64', 'riscv32', 'riscv64', 'x86', 'x86_64',
68 'arm', 'aarch64', 'mips', 'mips64', 'sparc', 'sparc64']
70 cpu = host_machine.cpu_family()
71 targetos = host_machine.system()
73 m = cc.find_library('m', required: false)
74 util = cc.find_library('util', required: false)
82 if targetos == 'windows'
83 socket = cc.find_library('ws2_32')
84 winmm = cc.find_library('winmm')
86 win = import('windows')
87 version_res = win.compile_resources('version.rc',
88 depend_files: files('pc-bios/qemu-nsis.ico'),
89 include_directories: include_directories('.'))
90 elif targetos == 'darwin'
91 coref = dependency('appleframeworks', modules: 'CoreFoundation')
92 iokit = dependency('appleframeworks', modules: 'IOKit')
93 cocoa = dependency('appleframeworks', modules: 'Cocoa')
94 hvf = dependency('appleframeworks', modules: 'Hypervisor')
95 elif targetos == 'sunos'
96 socket = [cc.find_library('socket'),
97 cc.find_library('nsl'),
98 cc.find_library('resolv')]
99 elif targetos == 'haiku'
100 socket = [cc.find_library('posix_error_mapper'),
101 cc.find_library('network'),
102 cc.find_library('bsd')]
104 glib = declare_dependency(compile_args: config_host['GLIB_CFLAGS'].split(),
105 link_args: config_host['GLIB_LIBS'].split())
107 if 'CONFIG_GIO' in config_host
108 gio = declare_dependency(compile_args: config_host['GIO_CFLAGS'].split(),
109 link_args: config_host['GIO_LIBS'].split())
112 if 'CONFIG_TRACE_UST' in config_host
113 lttng = declare_dependency(link_args: config_host['LTTNG_UST_LIBS'].split())
116 if 'CONFIG_TRACE_UST' in config_host
117 urcubp = declare_dependency(link_args: config_host['URCU_BP_LIBS'].split())
120 if 'CONFIG_GCRYPT' in config_host
121 gcrypt = declare_dependency(compile_args: config_host['GCRYPT_CFLAGS'].split(),
122 link_args: config_host['GCRYPT_LIBS'].split())
125 if 'CONFIG_NETTLE' in config_host
126 nettle = declare_dependency(compile_args: config_host['NETTLE_CFLAGS'].split(),
127 link_args: config_host['NETTLE_LIBS'].split())
130 if 'CONFIG_GNUTLS' in config_host
131 gnutls = declare_dependency(compile_args: config_host['GNUTLS_CFLAGS'].split(),
132 link_args: config_host['GNUTLS_LIBS'].split())
135 if have_system or have_tools
136 pixman = dependency('pixman-1', required: have_system, version:'>=0.21.8',
137 method: 'pkg-config', static: enable_static)
140 if 'CONFIG_AUTH_PAM' in config_host
141 pam = cc.find_library('pam')
143 libaio = cc.find_library('aio', required: false)
144 zlib = dependency('zlib', required: true, static: enable_static)
145 linux_io_uring = not_found
146 if 'CONFIG_LINUX_IO_URING' in config_host
147 linux_io_uring = declare_dependency(compile_args: config_host['LINUX_IO_URING_CFLAGS'].split(),
148 link_args: config_host['LINUX_IO_URING_LIBS'].split())
151 if 'CONFIG_LIBXML2' in config_host
152 libxml2 = declare_dependency(compile_args: config_host['LIBXML2_CFLAGS'].split(),
153 link_args: config_host['LIBXML2_LIBS'].split())
156 if 'CONFIG_LIBNFS' in config_host
157 libnfs = declare_dependency(link_args: config_host['LIBNFS_LIBS'].split())
160 if 'CONFIG_ATTR' in config_host
161 libattr = declare_dependency(link_args: config_host['LIBATTR_LIBS'].split())
164 if 'CONFIG_SECCOMP' in config_host
165 seccomp = declare_dependency(compile_args: config_host['SECCOMP_CFLAGS'].split(),
166 link_args: config_host['SECCOMP_LIBS'].split())
168 libcap_ng = not_found
169 if 'CONFIG_LIBCAP_NG' in config_host
170 libcap_ng = declare_dependency(link_args: config_host['LIBCAP_NG_LIBS'].split())
172 if get_option('xkbcommon').auto() and not have_system and not have_tools
173 xkbcommon = not_found
175 xkbcommon = dependency('xkbcommon', required: get_option('xkbcommon'),
176 method: 'pkg-config', static: enable_static)
179 if config_host.has_key('CONFIG_SLIRP')
180 slirp = declare_dependency(compile_args: config_host['SLIRP_CFLAGS'].split(),
181 link_args: config_host['SLIRP_LIBS'].split())
184 if config_host.has_key('CONFIG_VDE')
185 vde = declare_dependency(link_args: config_host['VDE_LIBS'].split())
188 if 'CONFIG_LIBPULSE' in config_host
189 pulse = declare_dependency(compile_args: config_host['PULSE_CFLAGS'].split(),
190 link_args: config_host['PULSE_LIBS'].split())
193 if 'CONFIG_ALSA' in config_host
194 alsa = declare_dependency(compile_args: config_host['ALSA_CFLAGS'].split(),
195 link_args: config_host['ALSA_LIBS'].split())
198 if 'CONFIG_LIBJACK' in config_host
199 jack = declare_dependency(link_args: config_host['JACK_LIBS'].split())
202 if 'CONFIG_SPICE' in config_host
203 spice = declare_dependency(compile_args: config_host['SPICE_CFLAGS'].split(),
204 link_args: config_host['SPICE_LIBS'].split())
206 rt = cc.find_library('rt', required: false)
207 libmpathpersist = not_found
208 if config_host.has_key('CONFIG_MPATH')
209 libmpathpersist = cc.find_library('mpathpersist')
212 if 'CONFIG_LIBISCSI' in config_host
213 libiscsi = declare_dependency(compile_args: config_host['LIBISCSI_CFLAGS'].split(),
214 link_args: config_host['LIBISCSI_LIBS'].split())
217 if 'CONFIG_ZSTD' in config_host
218 zstd = declare_dependency(compile_args: config_host['ZSTD_CFLAGS'].split(),
219 link_args: config_host['ZSTD_LIBS'].split())
222 if 'CONFIG_GBM' in config_host
223 gbm = declare_dependency(compile_args: config_host['GBM_CFLAGS'].split(),
224 link_args: config_host['GBM_LIBS'].split())
227 if 'CONFIG_VIRGL' in config_host
228 virgl = declare_dependency(compile_args: config_host['VIRGL_CFLAGS'].split(),
229 link_args: config_host['VIRGL_LIBS'].split())
232 if 'CONFIG_CURL' in config_host
233 curl = declare_dependency(compile_args: config_host['CURL_CFLAGS'].split(),
234 link_args: config_host['CURL_LIBS'].split())
237 if 'CONFIG_LIBUDEV' in config_host
238 libudev = declare_dependency(link_args: config_host['LIBUDEV_LIBS'].split())
241 if 'CONFIG_BRLAPI' in config_host
242 brlapi = declare_dependency(link_args: config_host['BRLAPI_LIBS'].split())
247 sdl = dependency('sdl2', required: get_option('sdl'), static: enable_static)
248 sdl_image = not_found
251 # work around 2.0.8 bug
252 sdl = declare_dependency(compile_args: '-Wno-undef',
254 sdl_image = dependency('SDL2_image', required: get_option('sdl_image'),
255 method: 'pkg-config', static: enable_static)
257 if get_option('sdl_image').enabled()
258 error('sdl-image required, but SDL was @0@',
259 get_option('sdl').disabled() ? 'disabled' : 'not found')
261 sdl_image = not_found
265 if 'CONFIG_RBD' in config_host
266 rbd = declare_dependency(link_args: config_host['RBD_LIBS'].split())
268 glusterfs = not_found
269 if 'CONFIG_GLUSTERFS' in config_host
270 glusterfs = declare_dependency(compile_args: config_host['GLUSTERFS_CFLAGS'].split(),
271 link_args: config_host['GLUSTERFS_LIBS'].split())
274 if 'CONFIG_LIBSSH' in config_host
275 libssh = declare_dependency(compile_args: config_host['LIBSSH_CFLAGS'].split(),
276 link_args: config_host['LIBSSH_LIBS'].split())
279 if 'CONFIG_BZIP2' in config_host
280 libbzip2 = declare_dependency(link_args: config_host['BZIP2_LIBS'].split())
283 if 'CONFIG_LZFSE' in config_host
284 liblzfse = declare_dependency(link_args: config_host['LZFSE_LIBS'].split())
287 if 'CONFIG_AUDIO_OSS' in config_host
288 oss = declare_dependency(link_args: config_host['OSS_LIBS'].split())
291 if 'CONFIG_AUDIO_DSOUND' in config_host
292 dsound = declare_dependency(link_args: config_host['DSOUND_LIBS'].split())
294 coreaudio = not_found
295 if 'CONFIG_AUDIO_COREAUDIO' in config_host
296 coreaudio = declare_dependency(link_args: config_host['COREAUDIO_LIBS'].split())
299 if 'CONFIG_OPENGL' in config_host
300 opengl = declare_dependency(link_args: config_host['OPENGL_LIBS'].split())
304 if 'CONFIG_GTK' in config_host
305 gtk = declare_dependency(compile_args: config_host['GTK_CFLAGS'].split(),
306 link_args: config_host['GTK_LIBS'].split())
309 if 'CONFIG_VTE' in config_host
310 vte = declare_dependency(compile_args: config_host['VTE_CFLAGS'].split(),
311 link_args: config_host['VTE_LIBS'].split())
314 if 'CONFIG_X11' in config_host
315 x11 = declare_dependency(compile_args: config_host['X11_CFLAGS'].split(),
316 link_args: config_host['X11_LIBS'].split())
319 if 'CONFIG_CURSES' in config_host
320 curses = declare_dependency(compile_args: config_host['CURSES_CFLAGS'].split(),
321 link_args: config_host['CURSES_LIBS'].split())
324 if 'CONFIG_ICONV' in config_host
325 iconv = declare_dependency(compile_args: config_host['ICONV_CFLAGS'].split(),
326 link_args: config_host['ICONV_LIBS'].split())
329 if 'CONFIG_GIO' in config_host
330 gio = declare_dependency(compile_args: config_host['GIO_CFLAGS'].split(),
331 link_args: config_host['GIO_LIBS'].split())
337 if get_option('vnc').enabled()
338 vnc = declare_dependency() # dummy dependency
339 png = dependency('libpng', required: get_option('vnc_png'),
340 method: 'pkg-config', static: enable_static)
341 jpeg = cc.find_library('jpeg', has_headers: ['jpeglib.h'],
342 required: get_option('vnc_jpeg'),
343 static: enable_static)
344 sasl = cc.find_library('sasl2', has_headers: ['sasl/sasl.h'],
345 required: get_option('vnc_sasl'),
346 static: enable_static)
348 sasl = declare_dependency(dependencies: sasl,
349 compile_args: '-DSTRUCT_IOVEC_DEFINED')
353 if 'CONFIG_FDT' in config_host
354 fdt = declare_dependency(compile_args: config_host['FDT_CFLAGS'].split(),
355 link_args: config_host['FDT_LIBS'].split())
358 if 'CONFIG_SNAPPY' in config_host
359 snappy = declare_dependency(link_args: config_host['SNAPPY_LIBS'].split())
362 if 'CONFIG_LZO' in config_host
363 lzo = declare_dependency(link_args: config_host['LZO_LIBS'].split())
366 if 'CONFIG_RDMA' in config_host
367 rdma = declare_dependency(link_args: config_host['RDMA_LIBS'].split())
370 if 'CONFIG_NUMA' in config_host
371 numa = declare_dependency(link_args: config_host['NUMA_LIBS'].split())
374 if 'CONFIG_XEN_BACKEND' in config_host
375 xen = declare_dependency(compile_args: config_host['XEN_CFLAGS'].split(),
376 link_args: config_host['XEN_LIBS'].split())
379 if 'CONFIG_SMARTCARD' in config_host
380 cacard = declare_dependency(compile_args: config_host['SMARTCARD_CFLAGS'].split(),
381 link_args: config_host['SMARTCARD_LIBS'].split())
385 u2f = dependency('u2f-emu', required: get_option('u2f'),
386 method: 'pkg-config',
387 static: enable_static)
390 if 'CONFIG_USB_REDIR' in config_host
391 usbredir = declare_dependency(compile_args: config_host['USB_REDIR_CFLAGS'].split(),
392 link_args: config_host['USB_REDIR_LIBS'].split())
395 if 'CONFIG_USB_LIBUSB' in config_host
396 libusb = declare_dependency(compile_args: config_host['LIBUSB_CFLAGS'].split(),
397 link_args: config_host['LIBUSB_LIBS'].split())
400 if 'CONFIG_CAPSTONE' in config_host
401 capstone = declare_dependency(compile_args: config_host['CAPSTONE_CFLAGS'].split(),
402 link_args: config_host['CAPSTONE_LIBS'].split())
405 if 'CONFIG_LIBPMEM' in config_host
406 libpmem = declare_dependency(compile_args: config_host['LIBPMEM_CFLAGS'].split(),
407 link_args: config_host['LIBPMEM_LIBS'].split())
409 libdaxctl = not_found
410 if 'CONFIG_LIBDAXCTL' in config_host
411 libdaxctl = declare_dependency(link_args: config_host['LIBDAXCTL_LIBS'].split())
414 if 'CONFIG_TASN1' in config_host
415 tasn1 = declare_dependency(compile_args: config_host['TASN1_CFLAGS'].split(),
416 link_args: config_host['TASN1_LIBS'].split())
418 keyutils = dependency('libkeyutils', required: false,
419 method: 'pkg-config', static: enable_static)
421 has_gettid = cc.has_function('gettid')
423 # Create config-host.h
425 config_host_data.set('CONFIG_SDL', sdl.found())
426 config_host_data.set('CONFIG_SDL_IMAGE', sdl_image.found())
427 config_host_data.set('CONFIG_VNC', vnc.found())
428 config_host_data.set('CONFIG_VNC_JPEG', jpeg.found())
429 config_host_data.set('CONFIG_VNC_PNG', png.found())
430 config_host_data.set('CONFIG_VNC_SASL', sasl.found())
431 config_host_data.set('CONFIG_XKBCOMMON', xkbcommon.found())
432 config_host_data.set('CONFIG_KEYUTILS', keyutils.found())
433 config_host_data.set('CONFIG_GETTID', has_gettid)
434 config_host_data.set('QEMU_VERSION', '"@0@"'.format(meson.project_version()))
435 config_host_data.set('QEMU_VERSION_MAJOR', meson.project_version().split('.')[0])
436 config_host_data.set('QEMU_VERSION_MINOR', meson.project_version().split('.')[1])
437 config_host_data.set('QEMU_VERSION_MICRO', meson.project_version().split('.')[2])
439 arrays = ['CONFIG_AUDIO_DRIVERS', 'CONFIG_BDRV_RW_WHITELIST', 'CONFIG_BDRV_RO_WHITELIST']
440 strings = ['HOST_DSOSUF', 'CONFIG_IASL', 'qemu_confdir', 'qemu_datadir',
441 'qemu_moddir', 'qemu_localstatedir', 'qemu_helperdir', 'qemu_localedir',
442 'qemu_icondir', 'qemu_desktopdir', 'qemu_firmwarepath']
443 foreach k, v: config_host
444 if arrays.contains(k)
446 v = '"' + '", "'.join(v.split()) + '", '
448 config_host_data.set(k, v)
450 config_host_data.set('HOST_' + v.to_upper(), 1)
451 elif strings.contains(k)
452 if not k.startswith('CONFIG_')
453 k = 'CONFIG_' + k.to_upper()
455 config_host_data.set_quoted(k, v)
456 elif k.startswith('CONFIG_') or k.startswith('HAVE_') or k.startswith('HOST_')
457 config_host_data.set(k, v == 'y' ? 1 : v)
460 genh += configure_file(output: 'config-host.h', configuration: config_host_data)
462 minikconf = find_program('scripts/minikconf.py')
463 config_devices_mak_list = []
464 config_devices_h = {}
466 config_target_mak = {}
467 kconfig_external_symbols = [
476 'CONFIG_VHOST_KERNEL',
481 ignored = ['TARGET_XML_FILES', 'TARGET_ABI_DIR', 'TARGET_DIRS']
482 foreach target : target_dirs
483 config_target = keyval.load(meson.current_build_dir() / target / 'config-target.mak')
485 config_target_data = configuration_data()
486 foreach k, v: config_target
487 if not k.startswith('TARGET_') and not k.startswith('CONFIG_')
489 elif ignored.contains(k)
491 elif k == 'TARGET_BASE_ARCH'
492 config_target_data.set('TARGET_' + v.to_upper(), 1)
493 elif k == 'TARGET_NAME'
494 config_target_data.set_quoted(k, v)
496 config_target_data.set(k, 1)
498 config_target_data.set(k, v)
501 config_target_h += {target: configure_file(output: target + '-config-target.h',
502 configuration: config_target_data)}
504 if target.endswith('-softmmu')
506 foreach sym : kconfig_external_symbols
507 if sym in config_target or sym in config_host
508 base_kconfig += '@0@=y'.format(sym)
512 config_devices_mak = target + '-config-devices.mak'
513 config_devices_mak = configure_file(
514 input: ['default-configs' / target + '.mak', 'Kconfig'],
515 output: config_devices_mak,
516 depfile: config_devices_mak + '.d',
518 command: [minikconf, config_host['CONFIG_MINIKCONF_MODE'],
519 config_devices_mak, '@DEPFILE@', '@INPUT@',
522 config_devices_data = configuration_data()
523 config_devices = keyval.load(config_devices_mak)
524 foreach k, v: config_devices
525 config_devices_data.set(k, 1)
527 config_devices_mak_list += config_devices_mak
528 config_devices_h += {target: configure_file(output: target + '-config-devices.h',
529 configuration: config_devices_data)}
530 config_target += config_devices
532 config_target_mak += {target: config_target}
535 grepy = find_program('scripts/grepy.sh')
536 # This configuration is used to build files that are shared by
537 # multiple binaries, and then extracted out of the "common"
538 # static_library target.
540 # We do not use all_sources()/all_dependencies(), because it would
541 # build literally all source files, including devices only used by
542 # targets that are not built for this compilation. The CONFIG_ALL
543 # pseudo symbol replaces it.
546 config_all_devices_mak = configure_file(
547 output: 'config-all-devices.mak',
548 input: config_devices_mak_list,
550 command: [grepy, '@INPUT@'],
552 config_all_devices = keyval.load(config_all_devices_mak)
554 config_all_devices = {}
556 config_all = config_all_devices
557 config_all += config_host
558 config_all += config_all_disas
560 'CONFIG_XEN': config_host.has_key('CONFIG_XEN_BACKEND'),
561 'CONFIG_SOFTMMU': have_system,
562 'CONFIG_USER_ONLY': have_user,
568 hxtool = find_program('scripts/hxtool')
569 shaderinclude = find_program('scripts/shaderinclude.pl')
570 qapi_gen = find_program('scripts/qapi-gen.py')
571 qapi_gen_depends = [ meson.source_root() / 'scripts/qapi/__init__.py',
572 meson.source_root() / 'scripts/qapi/commands.py',
573 meson.source_root() / 'scripts/qapi/common.py',
574 meson.source_root() / 'scripts/qapi/doc.py',
575 meson.source_root() / 'scripts/qapi/error.py',
576 meson.source_root() / 'scripts/qapi/events.py',
577 meson.source_root() / 'scripts/qapi/expr.py',
578 meson.source_root() / 'scripts/qapi/gen.py',
579 meson.source_root() / 'scripts/qapi/introspect.py',
580 meson.source_root() / 'scripts/qapi/parser.py',
581 meson.source_root() / 'scripts/qapi/schema.py',
582 meson.source_root() / 'scripts/qapi/source.py',
583 meson.source_root() / 'scripts/qapi/types.py',
584 meson.source_root() / 'scripts/qapi/visit.py',
585 meson.source_root() / 'scripts/qapi/common.py',
586 meson.source_root() / 'scripts/qapi/doc.py',
587 meson.source_root() / 'scripts/qapi-gen.py'
591 python, files('scripts/tracetool.py'),
592 '--backend=' + config_host['TRACE_BACKENDS']
595 qemu_version_cmd = [find_program('scripts/qemu-version.sh'),
596 meson.current_source_dir(),
597 config_host['PKGVERSION'], meson.project_version()]
598 qemu_version = custom_target('qemu-version.h',
599 output: 'qemu-version.h',
600 command: qemu_version_cmd,
602 build_by_default: true,
603 build_always_stale: true)
608 ['qemu-options.hx', 'qemu-options.def'],
609 ['qemu-img-cmds.hx', 'qemu-img-cmds.h'],
613 ['hmp-commands.hx', 'hmp-commands.h'],
614 ['hmp-commands-info.hx', 'hmp-commands-info.h'],
617 foreach d : hx_headers
618 hxdep += custom_target(d[1],
622 build_by_default: true, # to be removed when added to a target
623 command: [hxtool, '-h', '@INPUT0@'])
627 # Collect sourcesets.
629 util_ss = ss.source_set()
630 stub_ss = ss.source_set()
631 trace_ss = ss.source_set()
632 block_ss = ss.source_set()
633 blockdev_ss = ss.source_set()
634 qmp_ss = ss.source_set()
635 common_ss = ss.source_set()
636 softmmu_ss = ss.source_set()
637 user_ss = ss.source_set()
638 bsd_user_ss = ss.source_set()
639 linux_user_ss = ss.source_set()
640 specific_ss = ss.source_set()
641 specific_fuzz_ss = ss.source_set()
646 target_softmmu_arch = {}
652 # TODO: add each directory to the subdirs from its own meson.build, once
654 trace_events_subdirs = [
661 trace_events_subdirs += [ 'linux-user' ]
664 trace_events_subdirs += [
673 trace_events_subdirs += [
684 'hw/block/dataplane',
729 trace_events_subdirs += [
756 libmodulecommon = static_library('module-common', files('module-common.c') + genh, pic: true, c_args: '-DBUILD_DSO')
757 modulecommon = declare_dependency(link_whole: libmodulecommon, compile_args: '-DBUILD_DSO')
760 # Build targets from sourcesets
762 stub_ss = stub_ss.apply(config_all, strict: false)
764 util_ss.add_all(trace_ss)
765 util_ss = util_ss.apply(config_all, strict: false)
766 libqemuutil = static_library('qemuutil',
767 sources: util_ss.sources() + stub_ss.sources() + genh,
768 dependencies: [util_ss.dependencies(), m, glib, socket])
769 qemuutil = declare_dependency(link_with: libqemuutil,
770 sources: genh + version_res)
772 decodetree = generator(find_program('scripts/decodetree.py'),
773 output: 'decode-@BASENAME@.c.inc',
774 arguments: ['@INPUT@', '@EXTRA_ARGS@', '-o', '@OUTPUT@'])
780 subdir('libdecnumber')
790 block_ss.add(when: 'CONFIG_REPLICATION', if_true: files('replication.c'))
796 blockdev_ss.add(files(
803 # os-posix.c contains POSIX-specific functions used by qemu-storage-daemon,
804 # os-win32.c does not
805 blockdev_ss.add(when: 'CONFIG_POSIX', if_true: files('os-posix.c'))
806 softmmu_ss.add(when: 'CONFIG_WIN32', if_true: [files('os-win32.c')])
808 softmmu_ss.add_all(blockdev_ss)
809 softmmu_ss.add(files(
815 softmmu_ss.add(when: 'CONFIG_TPM', if_true: files('tpm.c'))
816 softmmu_ss.add(when: 'CONFIG_SECCOMP', if_true: [files('qemu-seccomp.c'), seccomp])
817 softmmu_ss.add(when: ['CONFIG_FDT', fdt], if_true: [files('device_tree.c')])
819 common_ss.add(files('cpus-common.c'))
823 specific_ss.add(files('disas.c', 'exec.c', 'gdbstub.c'), capstone, libpmem, libdaxctl)
824 specific_ss.add(files('exec-vary.c'))
825 specific_ss.add(when: 'CONFIG_TCG', if_true: files(
834 specific_ss.add(when: 'CONFIG_TCG_INTERPRETER', if_true: files('disas/tci.c', 'tcg/tci.c'))
848 bsd_user_ss.add(files('gdbstub.c'))
849 specific_ss.add_all(when: 'CONFIG_BSD_USER', if_true: bsd_user_ss)
851 linux_user_ss.add(files('gdbstub.c', 'thunk.c'))
852 specific_ss.add_all(when: 'CONFIG_LINUX_USER', if_true: linux_user_ss)
854 # needed for fuzzing binaries
855 subdir('tests/qtest/libqos')
856 subdir('tests/qtest/fuzz')
860 foreach d, list : modules
861 foreach m, module_ss : list
862 if enable_modules and targetos != 'windows'
863 module_ss = module_ss.apply(config_host, strict: false)
864 sl = static_library(d + '-' + m, [genh, module_ss.sources()],
865 dependencies: [modulecommon, module_ss.dependencies()], pic: true)
873 block_ss.add_all(module_ss)
875 softmmu_ss.add_all(module_ss)
881 nm = find_program('nm')
882 undefsym = find_program('scripts/undefsym.sh')
883 block_syms = custom_target('block.syms', output: 'block.syms',
884 input: [libqemuutil, block_mods],
886 command: [undefsym, nm, '@INPUT@'])
887 qemu_syms = custom_target('qemu.syms', output: 'qemu.syms',
888 input: [libqemuutil, softmmu_mods],
890 command: [undefsym, nm, '@INPUT@'])
892 block_ss = block_ss.apply(config_host, strict: false)
893 libblock = static_library('block', block_ss.sources() + genh,
894 dependencies: block_ss.dependencies(),
895 link_depends: block_syms,
897 build_by_default: false)
899 block = declare_dependency(link_whole: [libblock],
900 link_args: '@block.syms',
901 dependencies: [crypto, io])
903 qmp_ss = qmp_ss.apply(config_host, strict: false)
904 libqmp = static_library('qmp', qmp_ss.sources() + genh,
905 dependencies: qmp_ss.dependencies(),
907 build_by_default: false)
909 qmp = declare_dependency(link_whole: [libqmp])
911 foreach m : block_mods + softmmu_mods
912 shared_module(m.name(),
916 install_dir: config_host['qemu_moddir'])
919 softmmu_ss.add(authz, block, chardev, crypto, io, qmp)
920 common_ss.add(qom, qemuutil)
922 common_ss.add_all(when: 'CONFIG_SOFTMMU', if_true: [softmmu_ss])
923 common_ss.add_all(when: 'CONFIG_USER_ONLY', if_true: user_ss)
925 common_all = common_ss.apply(config_all, strict: false)
926 common_all = static_library('common',
927 build_by_default: false,
928 sources: common_all.sources() + genh,
929 dependencies: common_all.dependencies(),
932 feature_to_c = find_program('scripts/feature_to_c.sh')
935 foreach target : target_dirs
936 config_target = config_target_mak[target]
937 target_name = config_target['TARGET_NAME']
938 arch = config_target['TARGET_BASE_ARCH']
939 arch_srcs = [config_target_h[target]]
941 c_args = ['-DNEED_CPU_H',
942 '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
943 '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)]
946 config_target += config_host
947 target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
948 if targetos == 'linux'
949 target_inc += include_directories('linux-headers', is_system: true)
951 if target.endswith('-softmmu')
952 qemu_target_name = 'qemu-system-' + target_name
954 t = target_softmmu_arch[arch].apply(config_target, strict: false)
955 arch_srcs += t.sources()
956 arch_deps += t.dependencies()
958 hw_dir = target_name == 'sparc64' ? 'sparc64' : arch
959 hw = hw_arch[hw_dir].apply(config_target, strict: false)
960 arch_srcs += hw.sources()
961 arch_deps += hw.dependencies()
963 arch_srcs += config_devices_h[target]
964 link_args += ['@block.syms', '@qemu.syms']
966 abi = config_target['TARGET_ABI_DIR']
968 qemu_target_name = 'qemu-' + target_name
969 if 'CONFIG_LINUX_USER' in config_target
970 base_dir = 'linux-user'
971 target_inc += include_directories('linux-user/host/' / config_host['ARCH'])
973 base_dir = 'bsd-user'
975 target_inc += include_directories(
979 if 'CONFIG_LINUX_USER' in config_target
981 arch_srcs += files(dir / 'signal.c', dir / 'cpu_loop.c')
982 if config_target.has_key('TARGET_SYSTBL_ABI')
984 syscall_nr_generators[abi].process(base_dir / abi / config_target['TARGET_SYSTBL'],
985 extra_args : config_target['TARGET_SYSTBL_ABI'])
990 if 'TARGET_XML_FILES' in config_target
991 gdbstub_xml = custom_target(target + '-gdbstub-xml.c',
992 output: target + '-gdbstub-xml.c',
993 input: files(config_target['TARGET_XML_FILES'].split()),
994 command: [feature_to_c, '@INPUT@'],
996 arch_srcs += gdbstub_xml
999 t = target_arch[arch].apply(config_target, strict: false)
1000 arch_srcs += t.sources()
1001 arch_deps += t.dependencies()
1003 target_common = common_ss.apply(config_target, strict: false)
1004 objects = common_all.extract_objects(target_common.sources())
1005 deps = target_common.dependencies()
1007 target_specific = specific_ss.apply(config_target, strict: false)
1008 arch_srcs += target_specific.sources()
1009 arch_deps += target_specific.dependencies()
1011 lib = static_library('qemu-' + target,
1012 sources: arch_srcs + genh,
1013 dependencies: arch_deps,
1015 include_directories: target_inc,
1017 build_by_default: false,
1020 if target.endswith('-softmmu')
1022 'name': 'qemu-system-' + target_name,
1024 'sources': files('softmmu/main.c'),
1027 if targetos == 'windows' and (sdl.found() or gtk.found())
1029 'name': 'qemu-system-' + target_name + 'w',
1031 'sources': files('softmmu/main.c'),
1035 if config_host.has_key('CONFIG_FUZZ')
1036 specific_fuzz = specific_fuzz_ss.apply(config_target, strict: false)
1038 'name': 'qemu-fuzz-' + target_name,
1040 'sources': specific_fuzz.sources(),
1041 'dependencies': specific_fuzz.dependencies(),
1042 'link_depends': [files('tests/qtest/fuzz/fork_fuzz.ld')],
1047 'name': 'qemu-' + target_name,
1054 emulators += executable(exe['name'], exe['sources'],
1057 dependencies: arch_deps + deps + exe['dependencies'],
1058 objects: lib.extract_all_objects(recursive: true),
1059 link_language: link_language,
1060 link_depends: [block_syms, qemu_syms] + exe.get('link_depends', []),
1061 link_args: link_args,
1062 gui_app: exe['gui'])
1064 if 'CONFIG_TRACE_SYSTEMTAP' in config_host
1066 {'ext': '.stp-build', 'fmt': 'stap', 'bin': meson.current_build_dir() / exe['name'], 'install': false},
1067 {'ext': '.stp', 'fmt': 'stap', 'bin': get_option('prefix') / get_option('bindir') / exe['name'], 'install': true},
1068 {'ext': '-simpletrace.stp', 'fmt': 'simpletrace-stap', 'bin': '', 'install': true},
1069 {'ext': '-log.stp', 'fmt': 'log-stap', 'bin': '', 'install': true},
1071 custom_target(exe['name'] + stp['ext'],
1072 input: trace_events_all,
1073 output: exe['name'] + stp['ext'],
1075 install: stp['install'],
1076 install_dir: qemu_datadir / '../systemtap/tapset',
1078 tracetool, '--group=all', '--format=' + stp['fmt'],
1079 '--binary=' + stp['bin'],
1080 '--target-name=' + target_name,
1081 '--target-type=' + target_type,
1082 '--probe-prefix=qemu.' + target_type + '.' + target_name,
1090 # Other build targets
1092 if 'CONFIG_PLUGIN' in config_host
1093 install_headers('include/qemu/qemu-plugin.h')
1096 if 'CONFIG_GUEST_AGENT' in config_host
1100 # Don't build qemu-keymap if xkbcommon is not explicitly enabled
1101 # when we don't build tools or system
1102 if xkbcommon.found()
1103 # used for the update-keymaps target, so include rules even if !have_tools
1104 qemu_keymap = executable('qemu-keymap', files('qemu-keymap.c', 'ui/input-keymap.c') + genh,
1105 dependencies: [qemuutil, xkbcommon], install: have_tools)
1108 qemu_block_tools = []
1110 qemu_img = executable('qemu-img', [files('qemu-img.c'), hxdep],
1111 dependencies: [authz, block, crypto, io, qom, qemuutil], install: true)
1112 qemu_io = executable('qemu-io', files('qemu-io.c'),
1113 dependencies: [block, qemuutil], install: true)
1114 qemu_nbd = executable('qemu-nbd', files('qemu-nbd.c'),
1115 dependencies: [block, qemuutil], install: true)
1117 subdir('storage-daemon')
1118 subdir('contrib/rdmacm-mux')
1119 subdir('contrib/elf2dmp')
1121 executable('qemu-edid', files('qemu-edid.c', 'hw/display/edid-generate.c'),
1122 dependencies: qemuutil,
1125 if 'CONFIG_VHOST_USER' in config_host
1126 subdir('contrib/libvhost-user')
1127 subdir('contrib/vhost-user-blk')
1128 subdir('contrib/vhost-user-gpu')
1129 subdir('contrib/vhost-user-input')
1130 subdir('contrib/vhost-user-scsi')
1133 if targetos == 'linux'
1134 executable('qemu-bridge-helper', files('qemu-bridge-helper.c'),
1135 dependencies: [qemuutil, libcap_ng],
1137 install_dir: get_option('libexecdir'))
1139 executable('qemu-pr-helper', files('scsi/qemu-pr-helper.c', 'scsi/utils.c'),
1140 dependencies: [authz, crypto, io, qom, qemuutil,
1141 libcap_ng, libudev, libmpathpersist],
1145 if 'CONFIG_IVSHMEM' in config_host
1146 subdir('contrib/ivshmem-client')
1147 subdir('contrib/ivshmem-server')
1156 if 'CONFIG_GTK' in config_host
1161 makeinfo = find_program('makeinfo', required: build_docs)
1164 '-I', meson.current_source_dir(),
1165 '-I', meson.current_build_dir() / 'docs',
1169 version_texi = configure_file(output: 'version.texi',
1170 input: 'version.texi.in',
1171 configuration: {'VERSION': meson.project_version(),
1172 'qemu_confdir': config_host['qemu_confdir']})
1175 'qemu-qmp-ref': ['docs/interop/qemu-qmp-ref.texi', qapi_doc_texi, version_texi],
1177 if 'CONFIG_GUEST_AGENT' in config_host
1178 texi += {'qemu-ga-ref': ['docs/interop/qemu-ga-ref.texi', qga_qapi_doc_texi, version_texi]}
1183 'env', 'LC_ALL=C', makeinfo, '--no-split', '--number-sections', docs_inc,
1184 '@INPUT0@', '-o', '@OUTPUT@',
1186 foreach ext, args: {
1188 'html': ['--no-headers', '--html'],
1189 'txt': ['--no-headers', '--plaintext'],
1192 foreach doc, input: texi
1193 output = doc + '.' + ext
1194 t += custom_target(output,
1198 install_dir: qemu_docdir / 'interop',
1199 command: cmd + args)
1201 alias_target(ext, t)
1205 texi2pdf = find_program('texi2pdf', required: false)
1209 foreach doc, input: texi
1210 output = doc + '.pdf'
1211 pdfs += custom_target(output,
1214 command: [texi2pdf, '-q', docs_inc, '@INPUT0@', '-o', '@OUTPUT@'],
1215 build_by_default: false)
1217 alias_target('pdf', pdfs)
1220 texi2pod = find_program('scripts/texi2pod.pl')
1221 pod2man = find_program('pod2man', required: build_docs)
1224 foreach doc, input: texi
1226 pod = custom_target(man + '.pod',
1228 output: man + '.pod',
1230 '-DVERSION="' + meson.project_version() + '"',
1231 '-DCONFDIR="' + config_host['qemu_confdir'] + '"',
1232 '@INPUT0@', '@OUTPUT@'])
1233 man = custom_target(man,
1238 install_dir: get_option('mandir') / 'man7',
1239 command: [pod2man, '--utf8', '--section=7', '--center=" "',
1240 '--release=" "', '@INPUT@'])
1245 if host_machine.system() == 'windows'
1247 find_program('scripts/nsis.py'),
1249 get_option('prefix'),
1250 meson.current_source_dir(),
1251 host_machine.cpu_family(),
1253 '-DDISPLAYVERSION=' + meson.project_version(),
1256 nsis_cmd += '-DCONFIG_DOCUMENTATION=y'
1258 if 'CONFIG_GTK' in config_host
1259 nsis_cmd += '-DCONFIG_GTK=y'
1262 nsis = custom_target('nsis',
1263 output: 'qemu-setup-' + meson.project_version() + '.exe',
1264 input: files('qemu.nsi'),
1265 build_always_stale: true,
1266 command: nsis_cmd + ['@INPUT@'])
1267 alias_target('installer', nsis)
1271 summary_info += {'Install prefix': config_host['prefix']}
1272 summary_info += {'BIOS directory': config_host['qemu_datadir']}
1273 summary_info += {'firmware path': config_host['qemu_firmwarepath']}
1274 summary_info += {'binary directory': config_host['bindir']}
1275 summary_info += {'library directory': config_host['libdir']}
1276 summary_info += {'module directory': config_host['qemu_moddir']}
1277 summary_info += {'libexec directory': config_host['libexecdir']}
1278 summary_info += {'include directory': config_host['includedir']}
1279 summary_info += {'config directory': config_host['sysconfdir']}
1280 if targetos != 'windows'
1281 summary_info += {'local state directory': config_host['qemu_localstatedir']}
1282 summary_info += {'Manual directory': get_option('mandir')}
1284 summary_info += {'local state directory': 'queried at runtime'}
1286 summary_info += {'Doc directory': get_option('docdir')}
1287 summary_info += {'Build directory': meson.current_build_dir()}
1288 summary_info += {'Source path': meson.current_source_dir()}
1289 summary_info += {'GIT binary': config_host['GIT']}
1290 summary_info += {'GIT submodules': config_host['GIT_SUBMODULES']}
1291 summary_info += {'C compiler': meson.get_compiler('c').cmd_array()[0]}
1292 summary_info += {'Host C compiler': meson.get_compiler('c', native: true).cmd_array()[0]}
1293 if link_language == 'cpp'
1294 summary_info += {'C++ compiler': meson.get_compiler('cpp').cmd_array()[0]}
1296 summary_info += {'C++ compiler': false}
1298 if targetos == 'darwin'
1299 summary_info += {'Objective-C compiler': meson.get_compiler('objc').cmd_array()[0]}
1301 summary_info += {'ARFLAGS': config_host['ARFLAGS']}
1302 summary_info += {'CFLAGS': config_host['CFLAGS']}
1303 summary_info += {'QEMU_CFLAGS': config_host['QEMU_CFLAGS']}
1304 summary_info += {'QEMU_LDFLAGS': config_host['QEMU_LDFLAGS']}
1305 summary_info += {'make': config_host['MAKE']}
1306 summary_info += {'install': config_host['INSTALL']}
1307 summary_info += {'python': '@0@ (version: @1@)'.format(python.full_path(), python.language_version())}
1308 summary_info += {'sphinx-build': config_host['SPHINX_BUILD']}
1309 summary_info += {'genisoimage': config_host['GENISOIMAGE']}
1310 # TODO: add back version
1311 summary_info += {'slirp support': config_host.has_key('CONFIG_SLIRP')}
1312 if config_host.has_key('CONFIG_SLIRP')
1313 summary_info += {'smbd': config_host['CONFIG_SMBD_COMMAND']}
1315 summary_info += {'module support': config_host.has_key('CONFIG_MODULES')}
1316 if config_host.has_key('CONFIG_MODULES')
1317 summary_info += {'alternative module path': config_host.has_key('CONFIG_MODULE_UPGRADES')}
1319 summary_info += {'host CPU': cpu}
1320 summary_info += {'host endianness': build_machine.endian()}
1321 summary_info += {'target list': config_host['TARGET_DIRS']}
1322 summary_info += {'gprof enabled': config_host.has_key('CONFIG_GPROF')}
1323 summary_info += {'sparse enabled': meson.get_compiler('c').cmd_array().contains('cgcc')}
1324 summary_info += {'strip binaries': get_option('strip')}
1325 summary_info += {'profiler': config_host.has_key('CONFIG_PROFILER')}
1326 summary_info += {'static build': config_host.has_key('CONFIG_TOOLS')}
1327 if targetos == 'darwin'
1328 summary_info += {'Cocoa support': config_host.has_key('CONFIG_COCOA')}
1330 # TODO: add back version
1331 summary_info += {'SDL support': sdl.found()}
1332 summary_info += {'SDL image support': sdl_image.found()}
1333 # TODO: add back version
1334 summary_info += {'GTK support': config_host.has_key('CONFIG_GTK')}
1335 summary_info += {'GTK GL support': config_host.has_key('CONFIG_GTK_GL')}
1336 summary_info += {'pixman': pixman.found()}
1337 # TODO: add back version
1338 summary_info += {'VTE support': config_host.has_key('CONFIG_VTE')}
1339 summary_info += {'TLS priority': config_host['CONFIG_TLS_PRIORITY']}
1340 summary_info += {'GNUTLS support': config_host.has_key('CONFIG_GNUTLS')}
1341 # TODO: add back version
1342 summary_info += {'libgcrypt': config_host.has_key('CONFIG_GCRYPT')}
1343 if config_host.has_key('CONFIG_GCRYPT')
1344 summary_info += {' hmac': config_host.has_key('CONFIG_GCRYPT_HMAC')}
1345 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
1347 # TODO: add back version
1348 summary_info += {'nettle': config_host.has_key('CONFIG_NETTLE')}
1349 if config_host.has_key('CONFIG_NETTLE')
1350 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
1352 summary_info += {'libtasn1': config_host.has_key('CONFIG_TASN1')}
1353 summary_info += {'PAM': config_host.has_key('CONFIG_AUTH_PAM')}
1354 summary_info += {'iconv support': config_host.has_key('CONFIG_ICONV')}
1355 summary_info += {'curses support': config_host.has_key('CONFIG_CURSES')}
1356 # TODO: add back version
1357 summary_info += {'virgl support': config_host.has_key('CONFIG_VIRGL')}
1358 summary_info += {'curl support': config_host.has_key('CONFIG_CURL')}
1359 summary_info += {'mingw32 support': targetos == 'windows'}
1360 summary_info += {'Audio drivers': config_host['CONFIG_AUDIO_DRIVERS']}
1361 summary_info += {'Block whitelist (rw)': config_host['CONFIG_BDRV_RW_WHITELIST']}
1362 summary_info += {'Block whitelist (ro)': config_host['CONFIG_BDRV_RO_WHITELIST']}
1363 summary_info += {'VirtFS support': config_host.has_key('CONFIG_VIRTFS')}
1364 summary_info += {'Multipath support': config_host.has_key('CONFIG_MPATH')}
1365 summary_info += {'VNC support': vnc.found()}
1367 summary_info += {'VNC SASL support': sasl.found()}
1368 summary_info += {'VNC JPEG support': jpeg.found()}
1369 summary_info += {'VNC PNG support': png.found()}
1371 summary_info += {'xen support': config_host.has_key('CONFIG_XEN_BACKEND')}
1372 if config_host.has_key('CONFIG_XEN_BACKEND')
1373 summary_info += {'xen ctrl version': config_host['CONFIG_XEN_CTRL_INTERFACE_VERSION']}
1375 summary_info += {'brlapi support': config_host.has_key('CONFIG_BRLAPI')}
1376 summary_info += {'Documentation': config_host.has_key('BUILD_DOCS')}
1377 summary_info += {'PIE': get_option('b_pie')}
1378 summary_info += {'vde support': config_host.has_key('CONFIG_VDE')}
1379 summary_info += {'netmap support': config_host.has_key('CONFIG_NETMAP')}
1380 summary_info += {'Linux AIO support': config_host.has_key('CONFIG_LINUX_AIO')}
1381 summary_info += {'Linux io_uring support': config_host.has_key('CONFIG_LINUX_IO_URING')}
1382 summary_info += {'ATTR/XATTR support': config_host.has_key('CONFIG_ATTR')}
1383 summary_info += {'Install blobs': config_host.has_key('INSTALL_BLOBS')}
1384 # TODO: add back KVM/HAX/HVF/WHPX/TCG
1385 #summary_info += {'KVM support': have_kvm'}
1386 #summary_info += {'HAX support': have_hax'}
1387 #summary_info += {'HVF support': have_hvf'}
1388 #summary_info += {'WHPX support': have_whpx'}
1389 #summary_info += {'TCG support': have_tcg'}
1390 #if get_option('tcg')
1391 # summary_info += {'TCG debug enabled': config_host.has_key('CONFIG_DEBUG_TCG')}
1392 # summary_info += {'TCG interpreter': config_host.has_key('CONFIG_TCG_INTERPRETER')}
1394 summary_info += {'malloc trim support': config_host.has_key('CONFIG_MALLOC_TRIM')}
1395 summary_info += {'RDMA support': config_host.has_key('CONFIG_RDMA')}
1396 summary_info += {'PVRDMA support': config_host.has_key('CONFIG_PVRDMA')}
1397 summary_info += {'fdt support': config_host.has_key('CONFIG_FDT')}
1398 summary_info += {'membarrier': config_host.has_key('CONFIG_MEMBARRIER')}
1399 summary_info += {'preadv support': config_host.has_key('CONFIG_PREADV')}
1400 summary_info += {'fdatasync': config_host.has_key('CONFIG_FDATASYNC')}
1401 summary_info += {'madvise': config_host.has_key('CONFIG_MADVISE')}
1402 summary_info += {'posix_madvise': config_host.has_key('CONFIG_POSIX_MADVISE')}
1403 summary_info += {'posix_memalign': config_host.has_key('CONFIG_POSIX_MEMALIGN')}
1404 summary_info += {'libcap-ng support': config_host.has_key('CONFIG_LIBCAP_NG')}
1405 summary_info += {'vhost-net support': config_host.has_key('CONFIG_VHOST_NET')}
1406 summary_info += {'vhost-crypto support': config_host.has_key('CONFIG_VHOST_CRYPTO')}
1407 summary_info += {'vhost-scsi support': config_host.has_key('CONFIG_VHOST_SCSI')}
1408 summary_info += {'vhost-vsock support': config_host.has_key('CONFIG_VHOST_VSOCK')}
1409 summary_info += {'vhost-user support': config_host.has_key('CONFIG_VHOST_KERNEL')}
1410 summary_info += {'vhost-user-fs support': config_host.has_key('CONFIG_VHOST_USER_FS')}
1411 summary_info += {'vhost-vdpa support': config_host.has_key('CONFIG_VHOST_VDPA')}
1412 summary_info += {'Trace backends': config_host['TRACE_BACKENDS']}
1413 if config_host['TRACE_BACKENDS'].split().contains('simple')
1414 summary_info += {'Trace output file': config_host['CONFIG_TRACE_FILE'] + '-<pid>'}
1416 # TODO: add back protocol and server version
1417 summary_info += {'spice support': config_host.has_key('CONFIG_SPICE')}
1418 summary_info += {'rbd support': config_host.has_key('CONFIG_RBD')}
1419 summary_info += {'xfsctl support': config_host.has_key('CONFIG_XFS')}
1420 summary_info += {'smartcard support': config_host.has_key('CONFIG_SMARTCARD')}
1421 summary_info += {'U2F support': u2f.found()}
1422 summary_info += {'libusb': config_host.has_key('CONFIG_USB_LIBUSB')}
1423 summary_info += {'usb net redir': config_host.has_key('CONFIG_USB_REDIR')}
1424 summary_info += {'OpenGL support': config_host.has_key('CONFIG_OPENGL')}
1425 summary_info += {'OpenGL dmabufs': config_host.has_key('CONFIG_OPENGL_DMABUF')}
1426 summary_info += {'libiscsi support': config_host.has_key('CONFIG_LIBISCSI')}
1427 summary_info += {'libnfs support': config_host.has_key('CONFIG_LIBNFS')}
1428 summary_info += {'build guest agent': config_host.has_key('CONFIG_GUEST_AGENT')}
1429 if targetos == 'windows'
1430 if 'WIN_SDK' in config_host
1431 summary_info += {'Windows SDK': config_host['WIN_SDK']}
1433 summary_info += {'QGA VSS support': config_host.has_key('CONFIG_QGA_VSS')}
1434 summary_info += {'QGA w32 disk info': config_host.has_key('CONFIG_QGA_NTDDSCSI')}
1435 summary_info += {'QGA MSI support': config_host.has_key('CONFIG_QGA_MSI_ENABLED')}
1437 summary_info += {'seccomp support': config_host.has_key('CONFIG_SECCOMP')}
1438 summary_info += {'coroutine backend': config_host['CONFIG_COROUTINE_BACKEND']}
1439 summary_info += {'coroutine pool': config_host['CONFIG_COROUTINE_POOL'] == '1'}
1440 summary_info += {'debug stack usage': config_host.has_key('CONFIG_DEBUG_STACK_USAGE')}
1441 summary_info += {'mutex debugging': config_host.has_key('CONFIG_DEBUG_MUTEX')}
1442 summary_info += {'crypto afalg': config_host.has_key('CONFIG_AF_ALG')}
1443 summary_info += {'GlusterFS support': config_host.has_key('CONFIG_GLUSTERFS')}
1444 summary_info += {'gcov': get_option('b_coverage')}
1445 summary_info += {'TPM support': config_host.has_key('CONFIG_TPM')}
1446 summary_info += {'libssh support': config_host.has_key('CONFIG_LIBSSH')}
1447 summary_info += {'QOM debugging': config_host.has_key('CONFIG_QOM_CAST_DEBUG')}
1448 summary_info += {'Live block migration': config_host.has_key('CONFIG_LIVE_BLOCK_MIGRATION')}
1449 summary_info += {'lzo support': config_host.has_key('CONFIG_LZO')}
1450 summary_info += {'snappy support': config_host.has_key('CONFIG_SNAPPY')}
1451 summary_info += {'bzip2 support': config_host.has_key('CONFIG_BZIP2')}
1452 summary_info += {'lzfse support': config_host.has_key('CONFIG_LZFSE')}
1453 summary_info += {'zstd support': config_host.has_key('CONFIG_ZSTD')}
1454 summary_info += {'NUMA host support': config_host.has_key('CONFIG_NUMA')}
1455 summary_info += {'libxml2': config_host.has_key('CONFIG_LIBXML2')}
1456 summary_info += {'tcmalloc support': config_host.has_key('CONFIG_TCMALLOC')}
1457 summary_info += {'jemalloc support': config_host.has_key('CONFIG_JEMALLOC')}
1458 summary_info += {'avx2 optimization': config_host.has_key('CONFIG_AVX2_OPT')}
1459 summary_info += {'avx512f optimization': config_host.has_key('CONFIG_AVX512F_OPT')}
1460 summary_info += {'replication support': config_host.has_key('CONFIG_REPLICATION')}
1461 summary_info += {'bochs support': config_host.has_key('CONFIG_BOCHS')}
1462 summary_info += {'cloop support': config_host.has_key('CONFIG_CLOOP')}
1463 summary_info += {'dmg support': config_host.has_key('CONFIG_DMG')}
1464 summary_info += {'qcow v1 support': config_host.has_key('CONFIG_QCOW1')}
1465 summary_info += {'vdi support': config_host.has_key('CONFIG_VDI')}
1466 summary_info += {'vvfat support': config_host.has_key('CONFIG_VVFAT')}
1467 summary_info += {'qed support': config_host.has_key('CONFIG_QED')}
1468 summary_info += {'parallels support': config_host.has_key('CONFIG_PARALLELS')}
1469 summary_info += {'sheepdog support': config_host.has_key('CONFIG_SHEEPDOG')}
1470 summary_info += {'capstone': config_host.has_key('CONFIG_CAPSTONE')}
1471 summary_info += {'libpmem support': config_host.has_key('CONFIG_LIBPMEM')}
1472 summary_info += {'libdaxctl support': config_host.has_key('CONFIG_LIBDAXCTL')}
1473 summary_info += {'libudev': config_host.has_key('CONFIG_LIBUDEV')}
1474 summary_info += {'default devices': config_host['CONFIG_MINIKCONF_MODE'] == '--defconfig'}
1475 summary_info += {'plugin support': config_host.has_key('CONFIG_PLUGIN')}
1476 summary_info += {'fuzzing support': config_host.has_key('CONFIG_FUZZ')}
1477 if config_host.has_key('HAVE_GDB_BIN')
1478 summary_info += {'gdb': config_host['HAVE_GDB_BIN']}
1480 summary_info += {'thread sanitizer': config_host.has_key('CONFIG_TSAN')}
1481 summary_info += {'rng-none': config_host.has_key('CONFIG_RNG_NONE')}
1482 summary_info += {'Linux keyring': config_host.has_key('CONFIG_SECRET_KEYRING')}
1483 summary(summary_info, bool_yn: true)
1485 if not supported_cpus.contains(cpu)
1487 warning('SUPPORT FOR THIS HOST CPU WILL GO AWAY IN FUTURE RELEASES!')
1489 message('CPU host architecture ' + cpu + ' support is not currently maintained.')
1490 message('The QEMU project intends to remove support for this host CPU in')
1491 message('a future release if nobody volunteers to maintain it and to')
1492 message('provide a build host for our continuous integration setup.')
1493 message('configure has succeeded and you can continue to build, but')
1494 message('if you care about QEMU on this platform you should contact')
1495 message('us upstream at qemu-devel@nongnu.org.')
1498 if not supported_oses.contains(targetos)
1500 warning('WARNING: SUPPORT FOR THIS HOST OS WILL GO AWAY IN FUTURE RELEASES!')
1502 message('Host OS ' + targetos + 'support is not currently maintained.')
1503 message('The QEMU project intends to remove support for this host OS in')
1504 message('a future release if nobody volunteers to maintain it and to')
1505 message('provide a build host for our continuous integration setup.')
1506 message('configure has succeeded and you can continue to build, but')
1507 message('if you care about QEMU on this platform you should contact')
1508 message('us upstream at qemu-devel@nongnu.org.')