1 project('qemu', ['c'], meson_version: '>=0.55.0',
2 default_options: ['warning_level=1', 'c_std=gnu99', 'cpp_std=gnu++11',
3 'b_lundef=false','b_colorout=auto'],
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 # Create config-host.h
416 config_host_data.set('CONFIG_SDL', sdl.found())
417 config_host_data.set('CONFIG_SDL_IMAGE', sdl_image.found())
418 config_host_data.set('CONFIG_VNC', vnc.found())
419 config_host_data.set('CONFIG_VNC_JPEG', jpeg.found())
420 config_host_data.set('CONFIG_VNC_PNG', png.found())
421 config_host_data.set('CONFIG_VNC_SASL', sasl.found())
422 config_host_data.set('CONFIG_XKBCOMMON', xkbcommon.found())
423 config_host_data.set('QEMU_VERSION', '"@0@"'.format(meson.project_version()))
424 config_host_data.set('QEMU_VERSION_MAJOR', meson.project_version().split('.')[0])
425 config_host_data.set('QEMU_VERSION_MINOR', meson.project_version().split('.')[1])
426 config_host_data.set('QEMU_VERSION_MICRO', meson.project_version().split('.')[2])
428 arrays = ['CONFIG_AUDIO_DRIVERS', 'CONFIG_BDRV_RW_WHITELIST', 'CONFIG_BDRV_RO_WHITELIST']
429 strings = ['HOST_DSOSUF', 'CONFIG_IASL', 'qemu_confdir', 'qemu_datadir',
430 'qemu_moddir', 'qemu_localstatedir', 'qemu_helperdir', 'qemu_localedir',
431 'qemu_icondir', 'qemu_desktopdir', 'qemu_firmwarepath']
432 foreach k, v: config_host
433 if arrays.contains(k)
435 v = '"' + '", "'.join(v.split()) + '", '
437 config_host_data.set(k, v)
439 config_host_data.set('HOST_' + v.to_upper(), 1)
440 elif strings.contains(k)
441 if not k.startswith('CONFIG_')
442 k = 'CONFIG_' + k.to_upper()
444 config_host_data.set_quoted(k, v)
445 elif k.startswith('CONFIG_') or k.startswith('HAVE_') or k.startswith('HOST_')
446 config_host_data.set(k, v == 'y' ? 1 : v)
449 genh += configure_file(output: 'config-host.h', configuration: config_host_data)
451 minikconf = find_program('scripts/minikconf.py')
452 config_devices_mak_list = []
453 config_devices_h = {}
455 config_target_mak = {}
456 kconfig_external_symbols = [
465 'CONFIG_VHOST_KERNEL',
470 ignored = ['TARGET_XML_FILES', 'TARGET_ABI_DIR', 'TARGET_DIRS']
471 foreach target : target_dirs
472 config_target = keyval.load(meson.current_build_dir() / target / 'config-target.mak')
474 config_target_data = configuration_data()
475 foreach k, v: config_target
476 if not k.startswith('TARGET_') and not k.startswith('CONFIG_')
478 elif ignored.contains(k)
480 elif k == 'TARGET_BASE_ARCH'
481 config_target_data.set('TARGET_' + v.to_upper(), 1)
482 elif k == 'TARGET_NAME'
483 config_target_data.set_quoted(k, v)
485 config_target_data.set(k, 1)
487 config_target_data.set(k, v)
490 config_target_h += {target: configure_file(output: target + '-config-target.h',
491 configuration: config_target_data)}
493 if target.endswith('-softmmu')
495 foreach sym : kconfig_external_symbols
496 if sym in config_target or sym in config_host
497 base_kconfig += '@0@=y'.format(sym)
501 config_devices_mak = target + '-config-devices.mak'
502 config_devices_mak = configure_file(
503 input: ['default-configs' / target + '.mak', 'Kconfig'],
504 output: config_devices_mak,
505 depfile: config_devices_mak + '.d',
507 command: [minikconf, config_host['CONFIG_MINIKCONF_MODE'],
508 config_devices_mak, '@DEPFILE@', '@INPUT@',
511 config_devices_data = configuration_data()
512 config_devices = keyval.load(config_devices_mak)
513 foreach k, v: config_devices
514 config_devices_data.set(k, 1)
516 config_devices_mak_list += config_devices_mak
517 config_devices_h += {target: configure_file(output: target + '-config-devices.h',
518 configuration: config_devices_data)}
519 config_target += config_devices
521 config_target_mak += {target: config_target}
524 grepy = find_program('scripts/grepy.sh')
525 # This configuration is used to build files that are shared by
526 # multiple binaries, and then extracted out of the "common"
527 # static_library target.
529 # We do not use all_sources()/all_dependencies(), because it would
530 # build literally all source files, including devices only used by
531 # targets that are not built for this compilation. The CONFIG_ALL
532 # pseudo symbol replaces it.
535 config_all_devices_mak = configure_file(
536 output: 'config-all-devices.mak',
537 input: config_devices_mak_list,
539 command: [grepy, '@INPUT@'],
541 config_all_devices = keyval.load(config_all_devices_mak)
543 config_all_devices = {}
545 config_all = config_all_devices
546 config_all += config_host
547 config_all += config_all_disas
549 'CONFIG_XEN': config_host.has_key('CONFIG_XEN_BACKEND'),
550 'CONFIG_SOFTMMU': have_system,
551 'CONFIG_USER_ONLY': have_user,
557 hxtool = find_program('scripts/hxtool')
558 shaderinclude = find_program('scripts/shaderinclude.pl')
559 qapi_gen = find_program('scripts/qapi-gen.py')
560 qapi_gen_depends = [ meson.source_root() / 'scripts/qapi/__init__.py',
561 meson.source_root() / 'scripts/qapi/commands.py',
562 meson.source_root() / 'scripts/qapi/common.py',
563 meson.source_root() / 'scripts/qapi/doc.py',
564 meson.source_root() / 'scripts/qapi/error.py',
565 meson.source_root() / 'scripts/qapi/events.py',
566 meson.source_root() / 'scripts/qapi/expr.py',
567 meson.source_root() / 'scripts/qapi/gen.py',
568 meson.source_root() / 'scripts/qapi/introspect.py',
569 meson.source_root() / 'scripts/qapi/parser.py',
570 meson.source_root() / 'scripts/qapi/schema.py',
571 meson.source_root() / 'scripts/qapi/source.py',
572 meson.source_root() / 'scripts/qapi/types.py',
573 meson.source_root() / 'scripts/qapi/visit.py',
574 meson.source_root() / 'scripts/qapi/common.py',
575 meson.source_root() / 'scripts/qapi/doc.py',
576 meson.source_root() / 'scripts/qapi-gen.py'
580 python, files('scripts/tracetool.py'),
581 '--backend=' + config_host['TRACE_BACKENDS']
584 qemu_version_cmd = [find_program('scripts/qemu-version.sh'),
585 meson.current_source_dir(),
586 config_host['PKGVERSION'], meson.project_version()]
587 qemu_version = custom_target('qemu-version.h',
588 output: 'qemu-version.h',
589 command: qemu_version_cmd,
591 build_by_default: true,
592 build_always_stale: true)
597 ['qemu-options.hx', 'qemu-options.def'],
598 ['qemu-img-cmds.hx', 'qemu-img-cmds.h'],
602 ['hmp-commands.hx', 'hmp-commands.h'],
603 ['hmp-commands-info.hx', 'hmp-commands-info.h'],
606 foreach d : hx_headers
607 hxdep += custom_target(d[1],
611 build_by_default: true, # to be removed when added to a target
612 command: [hxtool, '-h', '@INPUT0@'])
616 # Collect sourcesets.
618 util_ss = ss.source_set()
619 stub_ss = ss.source_set()
620 trace_ss = ss.source_set()
621 block_ss = ss.source_set()
622 blockdev_ss = ss.source_set()
623 qmp_ss = ss.source_set()
624 common_ss = ss.source_set()
625 softmmu_ss = ss.source_set()
626 user_ss = ss.source_set()
627 bsd_user_ss = ss.source_set()
628 linux_user_ss = ss.source_set()
629 specific_ss = ss.source_set()
630 specific_fuzz_ss = ss.source_set()
635 target_softmmu_arch = {}
641 # TODO: add each directory to the subdirs from its own meson.build, once
643 trace_events_subdirs = [
650 trace_events_subdirs += [ 'linux-user' ]
653 trace_events_subdirs += [
662 trace_events_subdirs += [
673 'hw/block/dataplane',
718 trace_events_subdirs += [
745 libmodulecommon = static_library('module-common', files('module-common.c') + genh, pic: true, c_args: '-DBUILD_DSO')
746 modulecommon = declare_dependency(link_whole: libmodulecommon, compile_args: '-DBUILD_DSO')
749 # Build targets from sourcesets
751 stub_ss = stub_ss.apply(config_all, strict: false)
753 util_ss.add_all(trace_ss)
754 util_ss = util_ss.apply(config_all, strict: false)
755 libqemuutil = static_library('qemuutil',
756 sources: util_ss.sources() + stub_ss.sources() + genh,
757 dependencies: [util_ss.dependencies(), m, glib, socket])
758 qemuutil = declare_dependency(link_with: libqemuutil,
759 sources: genh + version_res)
761 decodetree = generator(find_program('scripts/decodetree.py'),
762 output: 'decode-@BASENAME@.c.inc',
763 arguments: ['@INPUT@', '@EXTRA_ARGS@', '-o', '@OUTPUT@'])
769 subdir('libdecnumber')
779 block_ss.add(when: 'CONFIG_REPLICATION', if_true: files('replication.c'))
785 blockdev_ss.add(files(
792 # os-posix.c contains POSIX-specific functions used by qemu-storage-daemon,
793 # os-win32.c does not
794 blockdev_ss.add(when: 'CONFIG_POSIX', if_true: files('os-posix.c'))
795 softmmu_ss.add(when: 'CONFIG_WIN32', if_true: [files('os-win32.c')])
797 softmmu_ss.add_all(blockdev_ss)
798 softmmu_ss.add(files(
804 softmmu_ss.add(when: 'CONFIG_TPM', if_true: files('tpm.c'))
805 softmmu_ss.add(when: 'CONFIG_SECCOMP', if_true: [files('qemu-seccomp.c'), seccomp])
806 softmmu_ss.add(when: ['CONFIG_FDT', fdt], if_true: [files('device_tree.c')])
808 common_ss.add(files('cpus-common.c'))
812 specific_ss.add(files('disas.c', 'exec.c', 'gdbstub.c'), capstone, libpmem, libdaxctl)
813 specific_ss.add(files('exec-vary.c'))
814 specific_ss.add(when: 'CONFIG_TCG', if_true: files(
823 specific_ss.add(when: 'CONFIG_TCG_INTERPRETER', if_true: files('disas/tci.c', 'tcg/tci.c'))
837 bsd_user_ss.add(files('gdbstub.c'))
838 specific_ss.add_all(when: 'CONFIG_BSD_USER', if_true: bsd_user_ss)
840 linux_user_ss.add(files('gdbstub.c', 'thunk.c'))
841 specific_ss.add_all(when: 'CONFIG_LINUX_USER', if_true: linux_user_ss)
843 # needed for fuzzing binaries
844 subdir('tests/qtest/libqos')
845 subdir('tests/qtest/fuzz')
849 foreach d, list : modules
850 foreach m, module_ss : list
851 if enable_modules and targetos != 'windows'
852 module_ss = module_ss.apply(config_host, strict: false)
853 sl = static_library(d + '-' + m, [genh, module_ss.sources()],
854 dependencies: [modulecommon, module_ss.dependencies()], pic: true)
862 block_ss.add_all(module_ss)
864 softmmu_ss.add_all(module_ss)
870 nm = find_program('nm')
871 undefsym = find_program('scripts/undefsym.sh')
872 block_syms = custom_target('block.syms', output: 'block.syms',
873 input: [libqemuutil, block_mods],
875 command: [undefsym, nm, '@INPUT@'])
876 qemu_syms = custom_target('qemu.syms', output: 'qemu.syms',
877 input: [libqemuutil, softmmu_mods],
879 command: [undefsym, nm, '@INPUT@'])
881 block_ss = block_ss.apply(config_host, strict: false)
882 libblock = static_library('block', block_ss.sources() + genh,
883 dependencies: block_ss.dependencies(),
884 link_depends: block_syms,
886 build_by_default: false)
888 block = declare_dependency(link_whole: [libblock],
889 link_args: '@block.syms',
890 dependencies: [crypto, io])
892 qmp_ss = qmp_ss.apply(config_host, strict: false)
893 libqmp = static_library('qmp', qmp_ss.sources() + genh,
894 dependencies: qmp_ss.dependencies(),
896 build_by_default: false)
898 qmp = declare_dependency(link_whole: [libqmp])
900 foreach m : block_mods + softmmu_mods
901 shared_module(m.name(),
905 install_dir: config_host['qemu_moddir'])
908 softmmu_ss.add(authz, block, chardev, crypto, io, qmp)
909 common_ss.add(qom, qemuutil)
911 common_ss.add_all(when: 'CONFIG_SOFTMMU', if_true: [softmmu_ss])
912 common_ss.add_all(when: 'CONFIG_USER_ONLY', if_true: user_ss)
914 common_all = common_ss.apply(config_all, strict: false)
915 common_all = static_library('common',
916 build_by_default: false,
917 sources: common_all.sources() + genh,
918 dependencies: common_all.dependencies(),
921 feature_to_c = find_program('scripts/feature_to_c.sh')
924 foreach target : target_dirs
925 config_target = config_target_mak[target]
926 target_name = config_target['TARGET_NAME']
927 arch = config_target['TARGET_BASE_ARCH']
928 arch_srcs = [config_target_h[target]]
930 c_args = ['-DNEED_CPU_H',
931 '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
932 '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)]
935 config_target += config_host
936 target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
937 if targetos == 'linux'
938 target_inc += include_directories('linux-headers', is_system: true)
940 if target.endswith('-softmmu')
941 qemu_target_name = 'qemu-system-' + target_name
943 t = target_softmmu_arch[arch].apply(config_target, strict: false)
944 arch_srcs += t.sources()
945 arch_deps += t.dependencies()
947 hw_dir = target_name == 'sparc64' ? 'sparc64' : arch
948 hw = hw_arch[hw_dir].apply(config_target, strict: false)
949 arch_srcs += hw.sources()
950 arch_deps += hw.dependencies()
952 arch_srcs += config_devices_h[target]
953 link_args += ['@block.syms', '@qemu.syms']
955 abi = config_target['TARGET_ABI_DIR']
957 qemu_target_name = 'qemu-' + target_name
958 if 'CONFIG_LINUX_USER' in config_target
959 base_dir = 'linux-user'
960 target_inc += include_directories('linux-user/host/' / config_host['ARCH'])
962 base_dir = 'bsd-user'
964 target_inc += include_directories(
968 if 'CONFIG_LINUX_USER' in config_target
970 arch_srcs += files(dir / 'signal.c', dir / 'cpu_loop.c')
971 if config_target.has_key('TARGET_SYSTBL_ABI')
973 syscall_nr_generators[abi].process(base_dir / abi / config_target['TARGET_SYSTBL'],
974 extra_args : config_target['TARGET_SYSTBL_ABI'])
979 if 'TARGET_XML_FILES' in config_target
980 gdbstub_xml = custom_target(target + '-gdbstub-xml.c',
981 output: target + '-gdbstub-xml.c',
982 input: files(config_target['TARGET_XML_FILES'].split()),
983 command: [feature_to_c, '@INPUT@'],
985 arch_srcs += gdbstub_xml
988 t = target_arch[arch].apply(config_target, strict: false)
989 arch_srcs += t.sources()
990 arch_deps += t.dependencies()
992 target_common = common_ss.apply(config_target, strict: false)
993 objects = common_all.extract_objects(target_common.sources())
994 deps = target_common.dependencies()
996 target_specific = specific_ss.apply(config_target, strict: false)
997 arch_srcs += target_specific.sources()
998 arch_deps += target_specific.dependencies()
1000 lib = static_library('qemu-' + target,
1001 sources: arch_srcs + genh,
1002 dependencies: arch_deps,
1004 include_directories: target_inc,
1006 build_by_default: false,
1009 if target.endswith('-softmmu')
1011 'name': 'qemu-system-' + target_name,
1013 'sources': files('softmmu/main.c'),
1016 if targetos == 'windows' and (sdl.found() or gtk.found())
1018 'name': 'qemu-system-' + target_name + 'w',
1020 'sources': files('softmmu/main.c'),
1024 if config_host.has_key('CONFIG_FUZZ')
1025 specific_fuzz = specific_fuzz_ss.apply(config_target, strict: false)
1027 'name': 'qemu-fuzz-' + target_name,
1029 'sources': specific_fuzz.sources(),
1030 'dependencies': specific_fuzz.dependencies(),
1031 'link_depends': [files('tests/qtest/fuzz/fork_fuzz.ld')],
1036 'name': 'qemu-' + target_name,
1043 emulators += executable(exe['name'], exe['sources'],
1046 dependencies: arch_deps + deps + exe['dependencies'],
1047 objects: lib.extract_all_objects(recursive: true),
1048 link_language: link_language,
1049 link_depends: [block_syms, qemu_syms] + exe.get('link_depends', []),
1050 link_args: link_args,
1051 gui_app: exe['gui'])
1053 if 'CONFIG_TRACE_SYSTEMTAP' in config_host
1055 {'ext': '.stp-build', 'fmt': 'stap', 'bin': meson.current_build_dir() / exe['name'], 'install': false},
1056 {'ext': '.stp', 'fmt': 'stap', 'bin': get_option('prefix') / get_option('bindir') / exe['name'], 'install': true},
1057 {'ext': '-simpletrace.stp', 'fmt': 'simpletrace-stap', 'bin': '', 'install': true},
1058 {'ext': '-log.stp', 'fmt': 'log-stap', 'bin': '', 'install': true},
1060 custom_target(exe['name'] + stp['ext'],
1061 input: trace_events_all,
1062 output: exe['name'] + stp['ext'],
1064 install: stp['install'],
1065 install_dir: qemu_datadir / '../systemtap/tapset',
1067 tracetool, '--group=all', '--format=' + stp['fmt'],
1068 '--binary=' + stp['bin'],
1069 '--target-name=' + target_name,
1070 '--target-type=' + target_type,
1071 '--probe-prefix=qemu.' + target_type + '.' + target_name,
1079 # Other build targets
1081 if 'CONFIG_PLUGIN' in config_host
1082 install_headers('include/qemu/qemu-plugin.h')
1085 if 'CONFIG_GUEST_AGENT' in config_host
1089 # Don't build qemu-keymap if xkbcommon is not explicitly enabled
1090 # when we don't build tools or system
1091 if xkbcommon.found()
1092 # used for the update-keymaps target, so include rules even if !have_tools
1093 qemu_keymap = executable('qemu-keymap', files('qemu-keymap.c', 'ui/input-keymap.c') + genh,
1094 dependencies: [qemuutil, xkbcommon], install: have_tools)
1097 qemu_block_tools = []
1099 qemu_img = executable('qemu-img', [files('qemu-img.c'), hxdep],
1100 dependencies: [authz, block, crypto, io, qom, qemuutil], install: true)
1101 qemu_io = executable('qemu-io', files('qemu-io.c'),
1102 dependencies: [block, qemuutil], install: true)
1103 qemu_nbd = executable('qemu-nbd', files('qemu-nbd.c'),
1104 dependencies: [block, qemuutil], install: true)
1105 qemu_block_tools += [qemu_img, qemu_io, qemu_nbd]
1107 subdir('storage-daemon')
1108 subdir('contrib/rdmacm-mux')
1109 subdir('contrib/elf2dmp')
1111 executable('qemu-edid', files('qemu-edid.c', 'hw/display/edid-generate.c'),
1112 dependencies: qemuutil,
1115 if 'CONFIG_VHOST_USER' in config_host
1116 subdir('contrib/libvhost-user')
1117 subdir('contrib/vhost-user-blk')
1118 subdir('contrib/vhost-user-gpu')
1119 subdir('contrib/vhost-user-input')
1120 subdir('contrib/vhost-user-scsi')
1123 if targetos == 'linux'
1124 executable('qemu-bridge-helper', files('qemu-bridge-helper.c'),
1125 dependencies: [qemuutil, libcap_ng],
1127 install_dir: get_option('libexecdir'))
1129 executable('qemu-pr-helper', files('scsi/qemu-pr-helper.c', 'scsi/utils.c'),
1130 dependencies: [authz, crypto, io, qom, qemuutil,
1131 libcap_ng, libudev, libmpathpersist],
1135 if 'CONFIG_IVSHMEM' in config_host
1136 subdir('contrib/ivshmem-client')
1137 subdir('contrib/ivshmem-server')
1146 if 'CONFIG_GTK' in config_host
1151 makeinfo = find_program('makeinfo', required: build_docs)
1154 '-I', meson.current_source_dir(),
1155 '-I', meson.current_build_dir() / 'docs',
1159 version_texi = configure_file(output: 'version.texi',
1160 input: 'version.texi.in',
1161 configuration: {'VERSION': meson.project_version(),
1162 'qemu_confdir': config_host['qemu_confdir']})
1165 'qemu-qmp-ref': ['docs/interop/qemu-qmp-ref.texi', qapi_doc_texi, version_texi],
1167 if 'CONFIG_GUEST_AGENT' in config_host
1168 texi += {'qemu-ga-ref': ['docs/interop/qemu-ga-ref.texi', qga_qapi_doc_texi, version_texi]}
1173 'env', 'LC_ALL=C', makeinfo, '--no-split', '--number-sections', docs_inc,
1174 '@INPUT0@', '-o', '@OUTPUT@',
1176 foreach ext, args: {
1178 'html': ['--no-headers', '--html'],
1179 'txt': ['--no-headers', '--plaintext'],
1182 foreach doc, input: texi
1183 output = doc + '.' + ext
1184 t += custom_target(output,
1188 install_dir: qemu_docdir / 'interop',
1189 command: cmd + args)
1191 alias_target(ext, t)
1195 texi2pdf = find_program('texi2pdf', required: false)
1199 foreach doc, input: texi
1200 output = doc + '.pdf'
1201 pdfs += custom_target(output,
1204 command: [texi2pdf, '-q', docs_inc, '@INPUT0@', '-o', '@OUTPUT@'],
1205 build_by_default: false)
1207 alias_target('pdf', pdfs)
1210 texi2pod = find_program('scripts/texi2pod.pl')
1211 pod2man = find_program('pod2man', required: build_docs)
1214 foreach doc, input: texi
1216 pod = custom_target(man + '.pod',
1218 output: man + '.pod',
1220 '-DVERSION="' + meson.project_version() + '"',
1221 '-DCONFDIR="' + config_host['qemu_confdir'] + '"',
1222 '@INPUT0@', '@OUTPUT@'])
1223 man = custom_target(man,
1228 install_dir: get_option('mandir') / 'man7',
1229 command: [pod2man, '--utf8', '--section=7', '--center=" "',
1230 '--release=" "', '@INPUT@'])
1235 if host_machine.system() == 'windows'
1237 find_program('scripts/nsis.py'),
1239 get_option('prefix'),
1240 meson.current_source_dir(),
1241 host_machine.cpu_family(),
1243 '-DDISPLAYVERSION=' + meson.project_version(),
1246 nsis_cmd += '-DCONFIG_DOCUMENTATION=y'
1248 if 'CONFIG_GTK' in config_host
1249 nsis_cmd += '-DCONFIG_GTK=y'
1252 nsis = custom_target('nsis',
1253 output: 'qemu-setup-' + meson.project_version() + '.exe',
1254 input: files('qemu.nsi'),
1255 build_always_stale: true,
1256 command: nsis_cmd + ['@INPUT@'])
1257 alias_target('installer', nsis)
1261 summary_info += {'Install prefix': config_host['prefix']}
1262 summary_info += {'BIOS directory': config_host['qemu_datadir']}
1263 summary_info += {'firmware path': config_host['qemu_firmwarepath']}
1264 summary_info += {'binary directory': config_host['bindir']}
1265 summary_info += {'library directory': config_host['libdir']}
1266 summary_info += {'module directory': config_host['qemu_moddir']}
1267 summary_info += {'libexec directory': config_host['libexecdir']}
1268 summary_info += {'include directory': config_host['includedir']}
1269 summary_info += {'config directory': config_host['sysconfdir']}
1270 if targetos != 'windows'
1271 summary_info += {'local state directory': config_host['qemu_localstatedir']}
1272 summary_info += {'Manual directory': get_option('mandir')}
1274 summary_info += {'local state directory': 'queried at runtime'}
1276 summary_info += {'Doc directory': get_option('docdir')}
1277 summary_info += {'Build directory': meson.current_build_dir()}
1278 summary_info += {'Source path': meson.current_source_dir()}
1279 summary_info += {'GIT binary': config_host['GIT']}
1280 summary_info += {'GIT submodules': config_host['GIT_SUBMODULES']}
1281 summary_info += {'C compiler': meson.get_compiler('c').cmd_array()[0]}
1282 summary_info += {'Host C compiler': meson.get_compiler('c', native: true).cmd_array()[0]}
1283 if link_language == 'cpp'
1284 summary_info += {'C++ compiler': meson.get_compiler('cpp').cmd_array()[0]}
1286 summary_info += {'C++ compiler': false}
1288 if targetos == 'darwin'
1289 summary_info += {'Objective-C compiler': meson.get_compiler('objc').cmd_array()[0]}
1291 summary_info += {'ARFLAGS': config_host['ARFLAGS']}
1292 summary_info += {'CFLAGS': config_host['CFLAGS']}
1293 summary_info += {'QEMU_CFLAGS': config_host['QEMU_CFLAGS']}
1294 summary_info += {'QEMU_LDFLAGS': config_host['QEMU_LDFLAGS']}
1295 summary_info += {'make': config_host['MAKE']}
1296 summary_info += {'install': config_host['INSTALL']}
1297 summary_info += {'python': '@0@ (version: @1@)'.format(python.full_path(), python.language_version())}
1298 summary_info += {'sphinx-build': config_host['SPHINX_BUILD']}
1299 summary_info += {'genisoimage': config_host['GENISOIMAGE']}
1300 # TODO: add back version
1301 summary_info += {'slirp support': config_host.has_key('CONFIG_SLIRP')}
1302 if config_host.has_key('CONFIG_SLIRP')
1303 summary_info += {'smbd': config_host['CONFIG_SMBD_COMMAND']}
1305 summary_info += {'module support': config_host.has_key('CONFIG_MODULES')}
1306 if config_host.has_key('CONFIG_MODULES')
1307 summary_info += {'alternative module path': config_host.has_key('CONFIG_MODULE_UPGRADES')}
1309 summary_info += {'host CPU': cpu}
1310 summary_info += {'host endianness': build_machine.endian()}
1311 summary_info += {'target list': config_host['TARGET_DIRS']}
1312 summary_info += {'gprof enabled': config_host.has_key('CONFIG_GPROF')}
1313 summary_info += {'sparse enabled': meson.get_compiler('c').cmd_array().contains('cgcc')}
1314 summary_info += {'strip binaries': get_option('strip')}
1315 summary_info += {'profiler': config_host.has_key('CONFIG_PROFILER')}
1316 summary_info += {'static build': config_host.has_key('CONFIG_TOOLS')}
1317 if targetos == 'darwin'
1318 summary_info += {'Cocoa support': config_host.has_key('CONFIG_COCOA')}
1320 # TODO: add back version
1321 summary_info += {'SDL support': sdl.found()}
1322 summary_info += {'SDL image support': sdl_image.found()}
1323 # TODO: add back version
1324 summary_info += {'GTK support': config_host.has_key('CONFIG_GTK')}
1325 summary_info += {'GTK GL support': config_host.has_key('CONFIG_GTK_GL')}
1326 summary_info += {'pixman': pixman.found()}
1327 # TODO: add back version
1328 summary_info += {'VTE support': config_host.has_key('CONFIG_VTE')}
1329 summary_info += {'TLS priority': config_host['CONFIG_TLS_PRIORITY']}
1330 summary_info += {'GNUTLS support': config_host.has_key('CONFIG_GNUTLS')}
1331 # TODO: add back version
1332 summary_info += {'libgcrypt': config_host.has_key('CONFIG_GCRYPT')}
1333 if config_host.has_key('CONFIG_GCRYPT')
1334 summary_info += {' hmac': config_host.has_key('CONFIG_GCRYPT_HMAC')}
1335 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
1337 # TODO: add back version
1338 summary_info += {'nettle': config_host.has_key('CONFIG_NETTLE')}
1339 if config_host.has_key('CONFIG_NETTLE')
1340 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
1342 summary_info += {'libtasn1': config_host.has_key('CONFIG_TASN1')}
1343 summary_info += {'PAM': config_host.has_key('CONFIG_AUTH_PAM')}
1344 summary_info += {'iconv support': config_host.has_key('CONFIG_ICONV')}
1345 summary_info += {'curses support': config_host.has_key('CONFIG_CURSES')}
1346 # TODO: add back version
1347 summary_info += {'virgl support': config_host.has_key('CONFIG_VIRGL')}
1348 summary_info += {'curl support': config_host.has_key('CONFIG_CURL')}
1349 summary_info += {'mingw32 support': targetos == 'windows'}
1350 summary_info += {'Audio drivers': config_host['CONFIG_AUDIO_DRIVERS']}
1351 summary_info += {'Block whitelist (rw)': config_host['CONFIG_BDRV_RW_WHITELIST']}
1352 summary_info += {'Block whitelist (ro)': config_host['CONFIG_BDRV_RO_WHITELIST']}
1353 summary_info += {'VirtFS support': config_host.has_key('CONFIG_VIRTFS')}
1354 summary_info += {'Multipath support': config_host.has_key('CONFIG_MPATH')}
1355 summary_info += {'VNC support': vnc.found()}
1357 summary_info += {'VNC SASL support': sasl.found()}
1358 summary_info += {'VNC JPEG support': jpeg.found()}
1359 summary_info += {'VNC PNG support': png.found()}
1361 summary_info += {'xen support': config_host.has_key('CONFIG_XEN_BACKEND')}
1362 if config_host.has_key('CONFIG_XEN_BACKEND')
1363 summary_info += {'xen ctrl version': config_host['CONFIG_XEN_CTRL_INTERFACE_VERSION']}
1365 summary_info += {'brlapi support': config_host.has_key('CONFIG_BRLAPI')}
1366 summary_info += {'Documentation': config_host.has_key('BUILD_DOCS')}
1367 summary_info += {'PIE': get_option('b_pie')}
1368 summary_info += {'vde support': config_host.has_key('CONFIG_VDE')}
1369 summary_info += {'netmap support': config_host.has_key('CONFIG_NETMAP')}
1370 summary_info += {'Linux AIO support': config_host.has_key('CONFIG_LINUX_AIO')}
1371 summary_info += {'Linux io_uring support': config_host.has_key('CONFIG_LINUX_IO_URING')}
1372 summary_info += {'ATTR/XATTR support': config_host.has_key('CONFIG_ATTR')}
1373 summary_info += {'Install blobs': config_host.has_key('INSTALL_BLOBS')}
1374 # TODO: add back KVM/HAX/HVF/WHPX/TCG
1375 #summary_info += {'KVM support': have_kvm'}
1376 #summary_info += {'HAX support': have_hax'}
1377 #summary_info += {'HVF support': have_hvf'}
1378 #summary_info += {'WHPX support': have_whpx'}
1379 #summary_info += {'TCG support': have_tcg'}
1380 #if get_option('tcg')
1381 # summary_info += {'TCG debug enabled': config_host.has_key('CONFIG_DEBUG_TCG')}
1382 # summary_info += {'TCG interpreter': config_host.has_key('CONFIG_TCG_INTERPRETER')}
1384 summary_info += {'malloc trim support': config_host.has_key('CONFIG_MALLOC_TRIM')}
1385 summary_info += {'RDMA support': config_host.has_key('CONFIG_RDMA')}
1386 summary_info += {'PVRDMA support': config_host.has_key('CONFIG_PVRDMA')}
1387 summary_info += {'fdt support': config_host.has_key('CONFIG_FDT')}
1388 summary_info += {'membarrier': config_host.has_key('CONFIG_MEMBARRIER')}
1389 summary_info += {'preadv support': config_host.has_key('CONFIG_PREADV')}
1390 summary_info += {'fdatasync': config_host.has_key('CONFIG_FDATASYNC')}
1391 summary_info += {'madvise': config_host.has_key('CONFIG_MADVISE')}
1392 summary_info += {'posix_madvise': config_host.has_key('CONFIG_POSIX_MADVISE')}
1393 summary_info += {'posix_memalign': config_host.has_key('CONFIG_POSIX_MEMALIGN')}
1394 summary_info += {'libcap-ng support': config_host.has_key('CONFIG_LIBCAP_NG')}
1395 summary_info += {'vhost-net support': config_host.has_key('CONFIG_VHOST_NET')}
1396 summary_info += {'vhost-crypto support': config_host.has_key('CONFIG_VHOST_CRYPTO')}
1397 summary_info += {'vhost-scsi support': config_host.has_key('CONFIG_VHOST_SCSI')}
1398 summary_info += {'vhost-vsock support': config_host.has_key('CONFIG_VHOST_VSOCK')}
1399 summary_info += {'vhost-user support': config_host.has_key('CONFIG_VHOST_KERNEL')}
1400 summary_info += {'vhost-user-fs support': config_host.has_key('CONFIG_VHOST_USER_FS')}
1401 summary_info += {'vhost-vdpa support': config_host.has_key('CONFIG_VHOST_VDPA')}
1402 summary_info += {'Trace backends': config_host['TRACE_BACKENDS']}
1403 if config_host['TRACE_BACKENDS'].split().contains('simple')
1404 summary_info += {'Trace output file': config_host['CONFIG_TRACE_FILE'] + '-<pid>'}
1406 # TODO: add back protocol and server version
1407 summary_info += {'spice support': config_host.has_key('CONFIG_SPICE')}
1408 summary_info += {'rbd support': config_host.has_key('CONFIG_RBD')}
1409 summary_info += {'xfsctl support': config_host.has_key('CONFIG_XFS')}
1410 summary_info += {'smartcard support': config_host.has_key('CONFIG_SMARTCARD')}
1411 summary_info += {'U2F support': u2f.found()}
1412 summary_info += {'libusb': config_host.has_key('CONFIG_USB_LIBUSB')}
1413 summary_info += {'usb net redir': config_host.has_key('CONFIG_USB_REDIR')}
1414 summary_info += {'OpenGL support': config_host.has_key('CONFIG_OPENGL')}
1415 summary_info += {'OpenGL dmabufs': config_host.has_key('CONFIG_OPENGL_DMABUF')}
1416 summary_info += {'libiscsi support': config_host.has_key('CONFIG_LIBISCSI')}
1417 summary_info += {'libnfs support': config_host.has_key('CONFIG_LIBNFS')}
1418 summary_info += {'build guest agent': config_host.has_key('CONFIG_GUEST_AGENT')}
1419 if targetos == 'windows'
1420 if 'WIN_SDK' in config_host
1421 summary_info += {'Windows SDK': config_host['WIN_SDK']}
1423 summary_info += {'QGA VSS support': config_host.has_key('CONFIG_QGA_VSS')}
1424 summary_info += {'QGA w32 disk info': config_host.has_key('CONFIG_QGA_NTDDSCSI')}
1425 summary_info += {'QGA MSI support': config_host.has_key('CONFIG_QGA_MSI_ENABLED')}
1427 summary_info += {'seccomp support': config_host.has_key('CONFIG_SECCOMP')}
1428 summary_info += {'coroutine backend': config_host['CONFIG_COROUTINE_BACKEND']}
1429 summary_info += {'coroutine pool': config_host['CONFIG_COROUTINE_POOL'] == '1'}
1430 summary_info += {'debug stack usage': config_host.has_key('CONFIG_DEBUG_STACK_USAGE')}
1431 summary_info += {'mutex debugging': config_host.has_key('CONFIG_DEBUG_MUTEX')}
1432 summary_info += {'crypto afalg': config_host.has_key('CONFIG_AF_ALG')}
1433 summary_info += {'GlusterFS support': config_host.has_key('CONFIG_GLUSTERFS')}
1434 summary_info += {'gcov': get_option('b_coverage')}
1435 summary_info += {'TPM support': config_host.has_key('CONFIG_TPM')}
1436 summary_info += {'libssh support': config_host.has_key('CONFIG_LIBSSH')}
1437 summary_info += {'QOM debugging': config_host.has_key('CONFIG_QOM_CAST_DEBUG')}
1438 summary_info += {'Live block migration': config_host.has_key('CONFIG_LIVE_BLOCK_MIGRATION')}
1439 summary_info += {'lzo support': config_host.has_key('CONFIG_LZO')}
1440 summary_info += {'snappy support': config_host.has_key('CONFIG_SNAPPY')}
1441 summary_info += {'bzip2 support': config_host.has_key('CONFIG_BZIP2')}
1442 summary_info += {'lzfse support': config_host.has_key('CONFIG_LZFSE')}
1443 summary_info += {'zstd support': config_host.has_key('CONFIG_ZSTD')}
1444 summary_info += {'NUMA host support': config_host.has_key('CONFIG_NUMA')}
1445 summary_info += {'libxml2': config_host.has_key('CONFIG_LIBXML2')}
1446 summary_info += {'tcmalloc support': config_host.has_key('CONFIG_TCMALLOC')}
1447 summary_info += {'jemalloc support': config_host.has_key('CONFIG_JEMALLOC')}
1448 summary_info += {'avx2 optimization': config_host.has_key('CONFIG_AVX2_OPT')}
1449 summary_info += {'avx512f optimization': config_host.has_key('CONFIG_AVX512F_OPT')}
1450 summary_info += {'replication support': config_host.has_key('CONFIG_REPLICATION')}
1451 summary_info += {'bochs support': config_host.has_key('CONFIG_BOCHS')}
1452 summary_info += {'cloop support': config_host.has_key('CONFIG_CLOOP')}
1453 summary_info += {'dmg support': config_host.has_key('CONFIG_DMG')}
1454 summary_info += {'qcow v1 support': config_host.has_key('CONFIG_QCOW1')}
1455 summary_info += {'vdi support': config_host.has_key('CONFIG_VDI')}
1456 summary_info += {'vvfat support': config_host.has_key('CONFIG_VVFAT')}
1457 summary_info += {'qed support': config_host.has_key('CONFIG_QED')}
1458 summary_info += {'parallels support': config_host.has_key('CONFIG_PARALLELS')}
1459 summary_info += {'sheepdog support': config_host.has_key('CONFIG_SHEEPDOG')}
1460 summary_info += {'capstone': config_host.has_key('CONFIG_CAPSTONE')}
1461 summary_info += {'libpmem support': config_host.has_key('CONFIG_LIBPMEM')}
1462 summary_info += {'libdaxctl support': config_host.has_key('CONFIG_LIBDAXCTL')}
1463 summary_info += {'libudev': config_host.has_key('CONFIG_LIBUDEV')}
1464 summary_info += {'default devices': config_host['CONFIG_MINIKCONF_MODE'] == '--defconfig'}
1465 summary_info += {'plugin support': config_host.has_key('CONFIG_PLUGIN')}
1466 summary_info += {'fuzzing support': config_host.has_key('CONFIG_FUZZ')}
1467 if config_host.has_key('HAVE_GDB_BIN')
1468 summary_info += {'gdb': config_host['HAVE_GDB_BIN']}
1470 summary_info += {'thread sanitizer': config_host.has_key('CONFIG_TSAN')}
1471 summary_info += {'rng-none': config_host.has_key('CONFIG_RNG_NONE')}
1472 summary_info += {'Linux keyring': config_host.has_key('CONFIG_SECRET_KEYRING')}
1473 summary(summary_info, bool_yn: true)
1475 if not supported_cpus.contains(cpu)
1477 warning('SUPPORT FOR THIS HOST CPU WILL GO AWAY IN FUTURE RELEASES!')
1479 message('CPU host architecture ' + cpu + ' support is not currently maintained.')
1480 message('The QEMU project intends to remove support for this host CPU in')
1481 message('a future release if nobody volunteers to maintain it and to')
1482 message('provide a build host for our continuous integration setup.')
1483 message('configure has succeeded and you can continue to build, but')
1484 message('if you care about QEMU on this platform you should contact')
1485 message('us upstream at qemu-devel@nongnu.org.')
1488 if not supported_oses.contains(targetos)
1490 warning('WARNING: SUPPORT FOR THIS HOST OS WILL GO AWAY IN FUTURE RELEASES!')
1492 message('Host OS ' + targetos + 'support is not currently maintained.')
1493 message('The QEMU project intends to remove support for this host OS in')
1494 message('a future release if nobody volunteers to maintain it and to')
1495 message('provide a build host for our continuous integration setup.')
1496 message('configure has succeeded and you can continue to build, but')
1497 message('if you care about QEMU on this platform you should contact')
1498 message('us upstream at qemu-devel@nongnu.org.')