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_NETTLE' in config_host
121 nettle = declare_dependency(compile_args: config_host['NETTLE_CFLAGS'].split(),
122 link_args: config_host['NETTLE_LIBS'].split())
125 if 'CONFIG_GNUTLS' in config_host
126 gnutls = declare_dependency(compile_args: config_host['GNUTLS_CFLAGS'].split(),
127 link_args: config_host['GNUTLS_LIBS'].split())
130 if have_system or have_tools
131 pixman = dependency('pixman-1', required: have_system, version:'>=0.21.8',
132 method: 'pkg-config', static: enable_static)
135 if 'CONFIG_AUTH_PAM' in config_host
136 pam = cc.find_library('pam')
138 libaio = cc.find_library('aio', required: false)
139 zlib = dependency('zlib', required: true, static: enable_static)
140 linux_io_uring = not_found
141 if 'CONFIG_LINUX_IO_URING' in config_host
142 linux_io_uring = declare_dependency(compile_args: config_host['LINUX_IO_URING_CFLAGS'].split(),
143 link_args: config_host['LINUX_IO_URING_LIBS'].split())
146 if 'CONFIG_LIBXML2' in config_host
147 libxml2 = declare_dependency(compile_args: config_host['LIBXML2_CFLAGS'].split(),
148 link_args: config_host['LIBXML2_LIBS'].split())
151 if 'CONFIG_LIBNFS' in config_host
152 libnfs = declare_dependency(link_args: config_host['LIBNFS_LIBS'].split())
155 if 'CONFIG_ATTR' in config_host
156 libattr = declare_dependency(link_args: config_host['LIBATTR_LIBS'].split())
159 if 'CONFIG_SECCOMP' in config_host
160 seccomp = declare_dependency(compile_args: config_host['SECCOMP_CFLAGS'].split(),
161 link_args: config_host['SECCOMP_LIBS'].split())
163 libcap_ng = not_found
164 if 'CONFIG_LIBCAP_NG' in config_host
165 libcap_ng = declare_dependency(link_args: config_host['LIBCAP_NG_LIBS'].split())
167 if get_option('xkbcommon').auto() and not have_system and not have_tools
168 xkbcommon = not_found
170 xkbcommon = dependency('xkbcommon', required: get_option('xkbcommon'),
171 method: 'pkg-config', static: enable_static)
174 if config_host.has_key('CONFIG_SLIRP')
175 slirp = declare_dependency(compile_args: config_host['SLIRP_CFLAGS'].split(),
176 link_args: config_host['SLIRP_LIBS'].split())
179 if config_host.has_key('CONFIG_VDE')
180 vde = declare_dependency(link_args: config_host['VDE_LIBS'].split())
183 if 'CONFIG_LIBPULSE' in config_host
184 pulse = declare_dependency(compile_args: config_host['PULSE_CFLAGS'].split(),
185 link_args: config_host['PULSE_LIBS'].split())
188 if 'CONFIG_ALSA' in config_host
189 alsa = declare_dependency(compile_args: config_host['ALSA_CFLAGS'].split(),
190 link_args: config_host['ALSA_LIBS'].split())
193 if 'CONFIG_LIBJACK' in config_host
194 jack = declare_dependency(link_args: config_host['JACK_LIBS'].split())
197 if 'CONFIG_SPICE' in config_host
198 spice = declare_dependency(compile_args: config_host['SPICE_CFLAGS'].split(),
199 link_args: config_host['SPICE_LIBS'].split())
201 rt = cc.find_library('rt', required: false)
202 libmpathpersist = not_found
203 if config_host.has_key('CONFIG_MPATH')
204 libmpathpersist = cc.find_library('mpathpersist')
207 if 'CONFIG_LIBISCSI' in config_host
208 libiscsi = declare_dependency(compile_args: config_host['LIBISCSI_CFLAGS'].split(),
209 link_args: config_host['LIBISCSI_LIBS'].split())
212 if 'CONFIG_ZSTD' in config_host
213 zstd = declare_dependency(compile_args: config_host['ZSTD_CFLAGS'].split(),
214 link_args: config_host['ZSTD_LIBS'].split())
217 if 'CONFIG_GBM' in config_host
218 gbm = declare_dependency(compile_args: config_host['GBM_CFLAGS'].split(),
219 link_args: config_host['GBM_LIBS'].split())
222 if 'CONFIG_VIRGL' in config_host
223 virgl = declare_dependency(compile_args: config_host['VIRGL_CFLAGS'].split(),
224 link_args: config_host['VIRGL_LIBS'].split())
227 if 'CONFIG_CURL' in config_host
228 curl = declare_dependency(compile_args: config_host['CURL_CFLAGS'].split(),
229 link_args: config_host['CURL_LIBS'].split())
232 if 'CONFIG_LIBUDEV' in config_host
233 libudev = declare_dependency(link_args: config_host['LIBUDEV_LIBS'].split())
236 if 'CONFIG_BRLAPI' in config_host
237 brlapi = declare_dependency(link_args: config_host['BRLAPI_LIBS'].split())
242 sdl = dependency('sdl2', required: get_option('sdl'), static: enable_static)
243 sdl_image = not_found
246 # work around 2.0.8 bug
247 sdl = declare_dependency(compile_args: '-Wno-undef',
249 sdl_image = dependency('SDL2_image', required: get_option('sdl_image'),
250 method: 'pkg-config', static: enable_static)
252 if get_option('sdl_image').enabled()
253 error('sdl-image required, but SDL was @0@',
254 get_option('sdl').disabled() ? 'disabled' : 'not found')
256 sdl_image = not_found
260 if 'CONFIG_RBD' in config_host
261 rbd = declare_dependency(link_args: config_host['RBD_LIBS'].split())
263 glusterfs = not_found
264 if 'CONFIG_GLUSTERFS' in config_host
265 glusterfs = declare_dependency(compile_args: config_host['GLUSTERFS_CFLAGS'].split(),
266 link_args: config_host['GLUSTERFS_LIBS'].split())
269 if 'CONFIG_LIBSSH' in config_host
270 libssh = declare_dependency(compile_args: config_host['LIBSSH_CFLAGS'].split(),
271 link_args: config_host['LIBSSH_LIBS'].split())
274 if 'CONFIG_BZIP2' in config_host
275 libbzip2 = declare_dependency(link_args: config_host['BZIP2_LIBS'].split())
278 if 'CONFIG_LZFSE' in config_host
279 liblzfse = declare_dependency(link_args: config_host['LZFSE_LIBS'].split())
282 if 'CONFIG_AUDIO_OSS' in config_host
283 oss = declare_dependency(link_args: config_host['OSS_LIBS'].split())
286 if 'CONFIG_AUDIO_DSOUND' in config_host
287 dsound = declare_dependency(link_args: config_host['DSOUND_LIBS'].split())
289 coreaudio = not_found
290 if 'CONFIG_AUDIO_COREAUDIO' in config_host
291 coreaudio = declare_dependency(link_args: config_host['COREAUDIO_LIBS'].split())
294 if 'CONFIG_OPENGL' in config_host
295 opengl = declare_dependency(link_args: config_host['OPENGL_LIBS'].split())
299 if 'CONFIG_GTK' in config_host
300 gtk = declare_dependency(compile_args: config_host['GTK_CFLAGS'].split(),
301 link_args: config_host['GTK_LIBS'].split())
304 if 'CONFIG_VTE' in config_host
305 vte = declare_dependency(compile_args: config_host['VTE_CFLAGS'].split(),
306 link_args: config_host['VTE_LIBS'].split())
309 if 'CONFIG_X11' in config_host
310 x11 = declare_dependency(compile_args: config_host['X11_CFLAGS'].split(),
311 link_args: config_host['X11_LIBS'].split())
314 if 'CONFIG_CURSES' in config_host
315 curses = declare_dependency(compile_args: config_host['CURSES_CFLAGS'].split(),
316 link_args: config_host['CURSES_LIBS'].split())
319 if 'CONFIG_ICONV' in config_host
320 iconv = declare_dependency(compile_args: config_host['ICONV_CFLAGS'].split(),
321 link_args: config_host['ICONV_LIBS'].split())
324 if 'CONFIG_GIO' in config_host
325 gio = declare_dependency(compile_args: config_host['GIO_CFLAGS'].split(),
326 link_args: config_host['GIO_LIBS'].split())
332 if get_option('vnc').enabled()
333 vnc = declare_dependency() # dummy dependency
334 png = dependency('libpng', required: get_option('vnc_png'),
335 method: 'pkg-config', static: enable_static)
336 jpeg = cc.find_library('jpeg', has_headers: ['jpeglib.h'],
337 required: get_option('vnc_jpeg'),
338 static: enable_static)
339 sasl = cc.find_library('sasl2', has_headers: ['sasl/sasl.h'],
340 required: get_option('vnc_sasl'),
341 static: enable_static)
343 sasl = declare_dependency(dependencies: sasl,
344 compile_args: '-DSTRUCT_IOVEC_DEFINED')
348 if 'CONFIG_FDT' in config_host
349 fdt = declare_dependency(compile_args: config_host['FDT_CFLAGS'].split(),
350 link_args: config_host['FDT_LIBS'].split())
353 if 'CONFIG_SNAPPY' in config_host
354 snappy = declare_dependency(link_args: config_host['SNAPPY_LIBS'].split())
357 if 'CONFIG_LZO' in config_host
358 lzo = declare_dependency(link_args: config_host['LZO_LIBS'].split())
361 if 'CONFIG_RDMA' in config_host
362 rdma = declare_dependency(link_args: config_host['RDMA_LIBS'].split())
365 if 'CONFIG_NUMA' in config_host
366 numa = declare_dependency(link_args: config_host['NUMA_LIBS'].split())
369 if 'CONFIG_XEN_BACKEND' in config_host
370 xen = declare_dependency(compile_args: config_host['XEN_CFLAGS'].split(),
371 link_args: config_host['XEN_LIBS'].split())
374 if 'CONFIG_SMARTCARD' in config_host
375 cacard = declare_dependency(compile_args: config_host['SMARTCARD_CFLAGS'].split(),
376 link_args: config_host['SMARTCARD_LIBS'].split())
380 u2f = dependency('u2f-emu', required: get_option('u2f'),
381 method: 'pkg-config',
382 static: enable_static)
385 if 'CONFIG_USB_REDIR' in config_host
386 usbredir = declare_dependency(compile_args: config_host['USB_REDIR_CFLAGS'].split(),
387 link_args: config_host['USB_REDIR_LIBS'].split())
390 if 'CONFIG_USB_LIBUSB' in config_host
391 libusb = declare_dependency(compile_args: config_host['LIBUSB_CFLAGS'].split(),
392 link_args: config_host['LIBUSB_LIBS'].split())
395 if 'CONFIG_CAPSTONE' in config_host
396 capstone = declare_dependency(compile_args: config_host['CAPSTONE_CFLAGS'].split(),
397 link_args: config_host['CAPSTONE_LIBS'].split())
400 if 'CONFIG_LIBPMEM' in config_host
401 libpmem = declare_dependency(compile_args: config_host['LIBPMEM_CFLAGS'].split(),
402 link_args: config_host['LIBPMEM_LIBS'].split())
404 libdaxctl = not_found
405 if 'CONFIG_LIBDAXCTL' in config_host
406 libdaxctl = declare_dependency(link_args: config_host['LIBDAXCTL_LIBS'].split())
409 # Create config-host.h
411 config_host_data.set('CONFIG_SDL', sdl.found())
412 config_host_data.set('CONFIG_SDL_IMAGE', sdl_image.found())
413 config_host_data.set('CONFIG_VNC', vnc.found())
414 config_host_data.set('CONFIG_VNC_JPEG', jpeg.found())
415 config_host_data.set('CONFIG_VNC_PNG', png.found())
416 config_host_data.set('CONFIG_VNC_SASL', sasl.found())
417 config_host_data.set('CONFIG_XKBCOMMON', xkbcommon.found())
418 config_host_data.set('QEMU_VERSION', '"@0@"'.format(meson.project_version()))
419 config_host_data.set('QEMU_VERSION_MAJOR', meson.project_version().split('.')[0])
420 config_host_data.set('QEMU_VERSION_MINOR', meson.project_version().split('.')[1])
421 config_host_data.set('QEMU_VERSION_MICRO', meson.project_version().split('.')[2])
423 arrays = ['CONFIG_AUDIO_DRIVERS', 'CONFIG_BDRV_RW_WHITELIST', 'CONFIG_BDRV_RO_WHITELIST']
424 strings = ['HOST_DSOSUF', 'CONFIG_IASL', 'qemu_confdir', 'qemu_datadir',
425 'qemu_moddir', 'qemu_localstatedir', 'qemu_helperdir', 'qemu_localedir',
426 'qemu_icondir', 'qemu_desktopdir', 'qemu_firmwarepath']
427 foreach k, v: config_host
428 if arrays.contains(k)
430 v = '"' + '", "'.join(v.split()) + '", '
432 config_host_data.set(k, v)
434 config_host_data.set('HOST_' + v.to_upper(), 1)
435 elif strings.contains(k)
436 if not k.startswith('CONFIG_')
437 k = 'CONFIG_' + k.to_upper()
439 config_host_data.set_quoted(k, v)
440 elif k.startswith('CONFIG_') or k.startswith('HAVE_') or k.startswith('HOST_')
441 config_host_data.set(k, v == 'y' ? 1 : v)
444 genh += configure_file(output: 'config-host.h', configuration: config_host_data)
446 minikconf = find_program('scripts/minikconf.py')
447 config_devices_mak_list = []
448 config_devices_h = {}
450 config_target_mak = {}
451 kconfig_external_symbols = [
460 'CONFIG_VHOST_KERNEL',
465 ignored = ['TARGET_XML_FILES', 'TARGET_ABI_DIR', 'TARGET_DIRS']
466 foreach target : target_dirs
467 config_target = keyval.load(meson.current_build_dir() / target / 'config-target.mak')
469 config_target_data = configuration_data()
470 foreach k, v: config_target
471 if not k.startswith('TARGET_') and not k.startswith('CONFIG_')
473 elif ignored.contains(k)
475 elif k == 'TARGET_BASE_ARCH'
476 config_target_data.set('TARGET_' + v.to_upper(), 1)
477 elif k == 'TARGET_NAME'
478 config_target_data.set_quoted(k, v)
480 config_target_data.set(k, 1)
482 config_target_data.set(k, v)
485 config_target_h += {target: configure_file(output: target + '-config-target.h',
486 configuration: config_target_data)}
488 if target.endswith('-softmmu')
490 foreach sym : kconfig_external_symbols
491 if sym in config_target or sym in config_host
492 base_kconfig += '@0@=y'.format(sym)
496 config_devices_mak = target + '-config-devices.mak'
497 config_devices_mak = configure_file(
498 input: ['default-configs' / target + '.mak', 'Kconfig'],
499 output: config_devices_mak,
500 depfile: config_devices_mak + '.d',
502 command: [minikconf, config_host['CONFIG_MINIKCONF_MODE'],
503 config_devices_mak, '@DEPFILE@', '@INPUT@',
506 config_devices_data = configuration_data()
507 config_devices = keyval.load(config_devices_mak)
508 foreach k, v: config_devices
509 config_devices_data.set(k, 1)
511 config_devices_mak_list += config_devices_mak
512 config_devices_h += {target: configure_file(output: target + '-config-devices.h',
513 configuration: config_devices_data)}
514 config_target += config_devices
516 config_target_mak += {target: config_target}
519 grepy = find_program('scripts/grepy.sh')
520 # This configuration is used to build files that are shared by
521 # multiple binaries, and then extracted out of the "common"
522 # static_library target.
524 # We do not use all_sources()/all_dependencies(), because it would
525 # build literally all source files, including devices only used by
526 # targets that are not built for this compilation. The CONFIG_ALL
527 # pseudo symbol replaces it.
530 config_all_devices_mak = configure_file(
531 output: 'config-all-devices.mak',
532 input: config_devices_mak_list,
534 command: [grepy, '@INPUT@'],
536 config_all_devices = keyval.load(config_all_devices_mak)
538 config_all_devices = {}
540 config_all = config_all_devices
541 config_all += config_host
542 config_all += config_all_disas
544 'CONFIG_XEN': config_host.has_key('CONFIG_XEN_BACKEND'),
545 'CONFIG_SOFTMMU': have_system,
546 'CONFIG_USER_ONLY': have_user,
552 hxtool = find_program('scripts/hxtool')
553 shaderinclude = find_program('scripts/shaderinclude.pl')
554 qapi_gen = find_program('scripts/qapi-gen.py')
555 qapi_gen_depends = [ meson.source_root() / 'scripts/qapi/__init__.py',
556 meson.source_root() / 'scripts/qapi/commands.py',
557 meson.source_root() / 'scripts/qapi/common.py',
558 meson.source_root() / 'scripts/qapi/doc.py',
559 meson.source_root() / 'scripts/qapi/error.py',
560 meson.source_root() / 'scripts/qapi/events.py',
561 meson.source_root() / 'scripts/qapi/expr.py',
562 meson.source_root() / 'scripts/qapi/gen.py',
563 meson.source_root() / 'scripts/qapi/introspect.py',
564 meson.source_root() / 'scripts/qapi/parser.py',
565 meson.source_root() / 'scripts/qapi/schema.py',
566 meson.source_root() / 'scripts/qapi/source.py',
567 meson.source_root() / 'scripts/qapi/types.py',
568 meson.source_root() / 'scripts/qapi/visit.py',
569 meson.source_root() / 'scripts/qapi/common.py',
570 meson.source_root() / 'scripts/qapi/doc.py',
571 meson.source_root() / 'scripts/qapi-gen.py'
575 python, files('scripts/tracetool.py'),
576 '--backend=' + config_host['TRACE_BACKENDS']
579 qemu_version_cmd = [find_program('scripts/qemu-version.sh'),
580 meson.current_source_dir(),
581 config_host['PKGVERSION'], meson.project_version()]
582 qemu_version = custom_target('qemu-version.h',
583 output: 'qemu-version.h',
584 command: qemu_version_cmd,
586 build_by_default: true,
587 build_always_stale: true)
592 ['qemu-options.hx', 'qemu-options.def'],
593 ['qemu-img-cmds.hx', 'qemu-img-cmds.h'],
597 ['hmp-commands.hx', 'hmp-commands.h'],
598 ['hmp-commands-info.hx', 'hmp-commands-info.h'],
601 foreach d : hx_headers
602 hxdep += custom_target(d[1],
606 build_by_default: true, # to be removed when added to a target
607 command: [hxtool, '-h', '@INPUT0@'])
611 # Collect sourcesets.
613 util_ss = ss.source_set()
614 stub_ss = ss.source_set()
615 trace_ss = ss.source_set()
616 block_ss = ss.source_set()
617 blockdev_ss = ss.source_set()
618 qmp_ss = ss.source_set()
619 common_ss = ss.source_set()
620 softmmu_ss = ss.source_set()
621 user_ss = ss.source_set()
622 bsd_user_ss = ss.source_set()
623 linux_user_ss = ss.source_set()
624 specific_ss = ss.source_set()
625 specific_fuzz_ss = ss.source_set()
630 target_softmmu_arch = {}
636 # TODO: add each directory to the subdirs from its own meson.build, once
638 trace_events_subdirs = [
645 trace_events_subdirs += [ 'linux-user' ]
648 trace_events_subdirs += [
657 trace_events_subdirs += [
668 'hw/block/dataplane',
713 trace_events_subdirs += [
740 libmodulecommon = static_library('module-common', files('module-common.c') + genh, pic: true, c_args: '-DBUILD_DSO')
741 modulecommon = declare_dependency(link_whole: libmodulecommon, compile_args: '-DBUILD_DSO')
744 # Build targets from sourcesets
746 stub_ss = stub_ss.apply(config_all, strict: false)
748 util_ss.add_all(trace_ss)
749 util_ss = util_ss.apply(config_all, strict: false)
750 libqemuutil = static_library('qemuutil',
751 sources: util_ss.sources() + stub_ss.sources() + genh,
752 dependencies: [util_ss.dependencies(), m, glib, socket])
753 qemuutil = declare_dependency(link_with: libqemuutil,
754 sources: genh + version_res)
756 decodetree = generator(find_program('scripts/decodetree.py'),
757 output: 'decode-@BASENAME@.c.inc',
758 arguments: ['@INPUT@', '@EXTRA_ARGS@', '-o', '@OUTPUT@'])
764 subdir('libdecnumber')
774 block_ss.add(when: 'CONFIG_REPLICATION', if_true: files('replication.c'))
780 blockdev_ss.add(files(
787 # os-posix.c contains POSIX-specific functions used by qemu-storage-daemon,
788 # os-win32.c does not
789 blockdev_ss.add(when: 'CONFIG_POSIX', if_true: files('os-posix.c'))
790 softmmu_ss.add(when: 'CONFIG_WIN32', if_true: [files('os-win32.c')])
792 softmmu_ss.add_all(blockdev_ss)
793 softmmu_ss.add(files(
799 softmmu_ss.add(when: 'CONFIG_TPM', if_true: files('tpm.c'))
800 softmmu_ss.add(when: 'CONFIG_SECCOMP', if_true: [files('qemu-seccomp.c'), seccomp])
801 softmmu_ss.add(when: ['CONFIG_FDT', fdt], if_true: [files('device_tree.c')])
803 common_ss.add(files('cpus-common.c'))
807 specific_ss.add(files('disas.c', 'exec.c', 'gdbstub.c'), capstone, libpmem, libdaxctl)
808 specific_ss.add(files('exec-vary.c'))
809 specific_ss.add(when: 'CONFIG_TCG', if_true: files(
818 specific_ss.add(when: 'CONFIG_TCG_INTERPRETER', if_true: files('disas/tci.c', 'tcg/tci.c'))
832 bsd_user_ss.add(files('gdbstub.c'))
833 specific_ss.add_all(when: 'CONFIG_BSD_USER', if_true: bsd_user_ss)
835 linux_user_ss.add(files('gdbstub.c', 'thunk.c'))
836 specific_ss.add_all(when: 'CONFIG_LINUX_USER', if_true: linux_user_ss)
838 # needed for fuzzing binaries
839 subdir('tests/qtest/libqos')
840 subdir('tests/qtest/fuzz')
844 foreach d, list : modules
845 foreach m, module_ss : list
846 if enable_modules and targetos != 'windows'
847 module_ss = module_ss.apply(config_host, strict: false)
848 sl = static_library(d + '-' + m, [genh, module_ss.sources()],
849 dependencies: [modulecommon, module_ss.dependencies()], pic: true)
857 block_ss.add_all(module_ss)
859 softmmu_ss.add_all(module_ss)
865 nm = find_program('nm')
866 undefsym = find_program('scripts/undefsym.sh')
867 block_syms = custom_target('block.syms', output: 'block.syms',
868 input: [libqemuutil, block_mods],
870 command: [undefsym, nm, '@INPUT@'])
871 qemu_syms = custom_target('qemu.syms', output: 'qemu.syms',
872 input: [libqemuutil, softmmu_mods],
874 command: [undefsym, nm, '@INPUT@'])
876 block_ss = block_ss.apply(config_host, strict: false)
877 libblock = static_library('block', block_ss.sources() + genh,
878 dependencies: block_ss.dependencies(),
879 link_depends: block_syms,
881 build_by_default: false)
883 block = declare_dependency(link_whole: [libblock],
884 link_args: '@block.syms',
885 dependencies: [crypto, io])
887 qmp_ss = qmp_ss.apply(config_host, strict: false)
888 libqmp = static_library('qmp', qmp_ss.sources() + genh,
889 dependencies: qmp_ss.dependencies(),
891 build_by_default: false)
893 qmp = declare_dependency(link_whole: [libqmp])
895 foreach m : block_mods + softmmu_mods
896 shared_module(m.name(),
900 install_dir: config_host['qemu_moddir'])
903 softmmu_ss.add(authz, block, chardev, crypto, io, qmp)
904 common_ss.add(qom, qemuutil)
906 common_ss.add_all(when: 'CONFIG_SOFTMMU', if_true: [softmmu_ss])
907 common_ss.add_all(when: 'CONFIG_USER_ONLY', if_true: user_ss)
909 common_all = common_ss.apply(config_all, strict: false)
910 common_all = static_library('common',
911 build_by_default: false,
912 sources: common_all.sources() + genh,
913 dependencies: common_all.dependencies(),
916 feature_to_c = find_program('scripts/feature_to_c.sh')
919 foreach target : target_dirs
920 config_target = config_target_mak[target]
921 target_name = config_target['TARGET_NAME']
922 arch = config_target['TARGET_BASE_ARCH']
923 arch_srcs = [config_target_h[target]]
925 c_args = ['-DNEED_CPU_H',
926 '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
927 '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)]
930 config_target += config_host
931 target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
932 if targetos == 'linux'
933 target_inc += include_directories('linux-headers', is_system: true)
935 if target.endswith('-softmmu')
936 qemu_target_name = 'qemu-system-' + target_name
938 t = target_softmmu_arch[arch].apply(config_target, strict: false)
939 arch_srcs += t.sources()
940 arch_deps += t.dependencies()
942 hw_dir = target_name == 'sparc64' ? 'sparc64' : arch
943 hw = hw_arch[hw_dir].apply(config_target, strict: false)
944 arch_srcs += hw.sources()
945 arch_deps += hw.dependencies()
947 arch_srcs += config_devices_h[target]
948 link_args += ['@block.syms', '@qemu.syms']
950 abi = config_target['TARGET_ABI_DIR']
952 qemu_target_name = 'qemu-' + target_name
953 if 'CONFIG_LINUX_USER' in config_target
954 base_dir = 'linux-user'
955 target_inc += include_directories('linux-user/host/' / config_host['ARCH'])
957 base_dir = 'bsd-user'
959 target_inc += include_directories(
963 if 'CONFIG_LINUX_USER' in config_target
965 arch_srcs += files(dir / 'signal.c', dir / 'cpu_loop.c')
966 if config_target.has_key('TARGET_SYSTBL_ABI')
968 syscall_nr_generators[abi].process(base_dir / abi / config_target['TARGET_SYSTBL'],
969 extra_args : config_target['TARGET_SYSTBL_ABI'])
974 if 'TARGET_XML_FILES' in config_target
975 gdbstub_xml = custom_target(target + '-gdbstub-xml.c',
976 output: target + '-gdbstub-xml.c',
977 input: files(config_target['TARGET_XML_FILES'].split()),
978 command: [feature_to_c, '@INPUT@'],
980 arch_srcs += gdbstub_xml
983 t = target_arch[arch].apply(config_target, strict: false)
984 arch_srcs += t.sources()
985 arch_deps += t.dependencies()
987 target_common = common_ss.apply(config_target, strict: false)
988 objects = common_all.extract_objects(target_common.sources())
989 deps = target_common.dependencies()
991 target_specific = specific_ss.apply(config_target, strict: false)
992 arch_srcs += target_specific.sources()
993 arch_deps += target_specific.dependencies()
995 lib = static_library('qemu-' + target,
996 sources: arch_srcs + genh,
997 dependencies: arch_deps,
999 include_directories: target_inc,
1001 build_by_default: false,
1004 if target.endswith('-softmmu')
1006 'name': 'qemu-system-' + target_name,
1008 'sources': files('softmmu/main.c'),
1011 if targetos == 'windows' and (sdl.found() or gtk.found())
1013 'name': 'qemu-system-' + target_name + 'w',
1015 'sources': files('softmmu/main.c'),
1019 if config_host.has_key('CONFIG_FUZZ')
1020 specific_fuzz = specific_fuzz_ss.apply(config_target, strict: false)
1022 'name': 'qemu-fuzz-' + target_name,
1024 'sources': specific_fuzz.sources(),
1025 'dependencies': specific_fuzz.dependencies(),
1026 'link_depends': [files('tests/qtest/fuzz/fork_fuzz.ld')],
1031 'name': 'qemu-' + target_name,
1038 emulators += executable(exe['name'], exe['sources'],
1041 dependencies: arch_deps + deps + exe['dependencies'],
1042 objects: lib.extract_all_objects(recursive: true),
1043 link_language: link_language,
1044 link_depends: [block_syms, qemu_syms] + exe.get('link_depends', []),
1045 link_args: link_args,
1046 gui_app: exe['gui'])
1048 if 'CONFIG_TRACE_SYSTEMTAP' in config_host
1050 {'ext': '.stp-build', 'fmt': 'stap', 'bin': meson.current_build_dir() / exe['name'], 'install': false},
1051 {'ext': '.stp', 'fmt': 'stap', 'bin': get_option('prefix') / get_option('bindir') / exe['name'], 'install': true},
1052 {'ext': '-simpletrace.stp', 'fmt': 'simpletrace-stap', 'bin': '', 'install': true},
1053 {'ext': '-log.stp', 'fmt': 'log-stap', 'bin': '', 'install': true},
1055 custom_target(exe['name'] + stp['ext'],
1056 input: trace_events_all,
1057 output: exe['name'] + stp['ext'],
1059 install: stp['install'],
1060 install_dir: qemu_datadir / '../systemtap/tapset',
1062 tracetool, '--group=all', '--format=' + stp['fmt'],
1063 '--binary=' + stp['bin'],
1064 '--target-name=' + target_name,
1065 '--target-type=' + target_type,
1066 '--probe-prefix=qemu.' + target_type + '.' + target_name,
1074 # Other build targets
1076 if 'CONFIG_PLUGIN' in config_host
1077 install_headers('include/qemu/qemu-plugin.h')
1080 if 'CONFIG_GUEST_AGENT' in config_host
1084 # Don't build qemu-keymap if xkbcommon is not explicitly enabled
1085 # when we don't build tools or system
1086 if xkbcommon.found()
1087 # used for the update-keymaps target, so include rules even if !have_tools
1088 qemu_keymap = executable('qemu-keymap', files('qemu-keymap.c', 'ui/input-keymap.c') + genh,
1089 dependencies: [qemuutil, xkbcommon], install: have_tools)
1092 qemu_block_tools = []
1094 qemu_img = executable('qemu-img', [files('qemu-img.c'), hxdep],
1095 dependencies: [authz, block, crypto, io, qom, qemuutil], install: true)
1096 qemu_io = executable('qemu-io', files('qemu-io.c'),
1097 dependencies: [block, qemuutil], install: true)
1098 qemu_nbd = executable('qemu-nbd', files('qemu-nbd.c'),
1099 dependencies: [block, qemuutil], install: true)
1100 qemu_block_tools += [qemu_img, qemu_io, qemu_nbd]
1102 subdir('storage-daemon')
1103 subdir('contrib/rdmacm-mux')
1104 subdir('contrib/elf2dmp')
1106 executable('qemu-edid', files('qemu-edid.c', 'hw/display/edid-generate.c'),
1107 dependencies: qemuutil,
1110 if 'CONFIG_VHOST_USER' in config_host
1111 subdir('contrib/libvhost-user')
1112 subdir('contrib/vhost-user-blk')
1113 subdir('contrib/vhost-user-gpu')
1114 subdir('contrib/vhost-user-input')
1115 subdir('contrib/vhost-user-scsi')
1118 if targetos == 'linux'
1119 executable('qemu-bridge-helper', files('qemu-bridge-helper.c'),
1120 dependencies: [qemuutil, libcap_ng],
1122 install_dir: get_option('libexecdir'))
1124 executable('qemu-pr-helper', files('scsi/qemu-pr-helper.c', 'scsi/utils.c'),
1125 dependencies: [authz, crypto, io, qom, qemuutil,
1126 libcap_ng, libudev, libmpathpersist],
1130 if 'CONFIG_IVSHMEM' in config_host
1131 subdir('contrib/ivshmem-client')
1132 subdir('contrib/ivshmem-server')
1141 if 'CONFIG_GTK' in config_host
1146 makeinfo = find_program('makeinfo', required: build_docs)
1149 '-I', meson.current_source_dir(),
1150 '-I', meson.current_build_dir() / 'docs',
1154 version_texi = configure_file(output: 'version.texi',
1155 input: 'version.texi.in',
1156 configuration: {'VERSION': meson.project_version(),
1157 'qemu_confdir': config_host['qemu_confdir']})
1160 'qemu-qmp-ref': ['docs/interop/qemu-qmp-ref.texi', qapi_doc_texi, version_texi],
1162 if 'CONFIG_GUEST_AGENT' in config_host
1163 texi += {'qemu-ga-ref': ['docs/interop/qemu-ga-ref.texi', qga_qapi_doc_texi, version_texi]}
1168 'env', 'LC_ALL=C', makeinfo, '--no-split', '--number-sections', docs_inc,
1169 '@INPUT0@', '-o', '@OUTPUT@',
1171 foreach ext, args: {
1173 'html': ['--no-headers', '--html'],
1174 'txt': ['--no-headers', '--plaintext'],
1177 foreach doc, input: texi
1178 output = doc + '.' + ext
1179 t += custom_target(output,
1183 install_dir: qemu_docdir / 'interop',
1184 command: cmd + args)
1186 alias_target(ext, t)
1190 texi2pdf = find_program('texi2pdf', required: false)
1194 foreach doc, input: texi
1195 output = doc + '.pdf'
1196 pdfs += custom_target(output,
1199 command: [texi2pdf, '-q', docs_inc, '@INPUT0@', '-o', '@OUTPUT@'],
1200 build_by_default: false)
1202 alias_target('pdf', pdfs)
1205 texi2pod = find_program('scripts/texi2pod.pl')
1206 pod2man = find_program('pod2man', required: build_docs)
1209 foreach doc, input: texi
1211 pod = custom_target(man + '.pod',
1213 output: man + '.pod',
1215 '-DVERSION="' + meson.project_version() + '"',
1216 '-DCONFDIR="' + config_host['qemu_confdir'] + '"',
1217 '@INPUT0@', '@OUTPUT@'])
1218 man = custom_target(man,
1223 install_dir: get_option('mandir') / 'man7',
1224 command: [pod2man, '--utf8', '--section=7', '--center=" "',
1225 '--release=" "', '@INPUT@'])
1230 if host_machine.system() == 'windows'
1232 find_program('scripts/nsis.py'),
1234 get_option('prefix'),
1235 meson.current_source_dir(),
1236 host_machine.cpu_family(),
1238 '-DDISPLAYVERSION=' + meson.project_version(),
1241 nsis_cmd += '-DCONFIG_DOCUMENTATION=y'
1243 if 'CONFIG_GTK' in config_host
1244 nsis_cmd += '-DCONFIG_GTK=y'
1247 nsis = custom_target('nsis',
1248 output: 'qemu-setup-' + meson.project_version() + '.exe',
1249 input: files('qemu.nsi'),
1250 build_always_stale: true,
1251 command: nsis_cmd + ['@INPUT@'])
1252 alias_target('installer', nsis)
1256 summary_info += {'Install prefix': config_host['prefix']}
1257 summary_info += {'BIOS directory': config_host['qemu_datadir']}
1258 summary_info += {'firmware path': config_host['qemu_firmwarepath']}
1259 summary_info += {'binary directory': config_host['bindir']}
1260 summary_info += {'library directory': config_host['libdir']}
1261 summary_info += {'module directory': config_host['qemu_moddir']}
1262 summary_info += {'libexec directory': config_host['libexecdir']}
1263 summary_info += {'include directory': config_host['includedir']}
1264 summary_info += {'config directory': config_host['sysconfdir']}
1265 if targetos != 'windows'
1266 summary_info += {'local state directory': config_host['qemu_localstatedir']}
1267 summary_info += {'Manual directory': get_option('mandir')}
1269 summary_info += {'local state directory': 'queried at runtime'}
1271 summary_info += {'Doc directory': get_option('docdir')}
1272 summary_info += {'Build directory': meson.current_build_dir()}
1273 summary_info += {'Source path': meson.current_source_dir()}
1274 summary_info += {'GIT binary': config_host['GIT']}
1275 summary_info += {'GIT submodules': config_host['GIT_SUBMODULES']}
1276 summary_info += {'C compiler': meson.get_compiler('c').cmd_array()[0]}
1277 summary_info += {'Host C compiler': meson.get_compiler('c', native: true).cmd_array()[0]}
1278 if link_language == 'cpp'
1279 summary_info += {'C++ compiler': meson.get_compiler('cpp').cmd_array()[0]}
1281 summary_info += {'C++ compiler': false}
1283 if targetos == 'darwin'
1284 summary_info += {'Objective-C compiler': meson.get_compiler('objc').cmd_array()[0]}
1286 summary_info += {'ARFLAGS': config_host['ARFLAGS']}
1287 summary_info += {'CFLAGS': config_host['CFLAGS']}
1288 summary_info += {'QEMU_CFLAGS': config_host['QEMU_CFLAGS']}
1289 summary_info += {'QEMU_LDFLAGS': config_host['QEMU_LDFLAGS']}
1290 summary_info += {'make': config_host['MAKE']}
1291 summary_info += {'install': config_host['INSTALL']}
1292 summary_info += {'python': '@0@ (version: @1@)'.format(python.full_path(), python.language_version())}
1293 summary_info += {'sphinx-build': config_host['SPHINX_BUILD']}
1294 summary_info += {'genisoimage': config_host['GENISOIMAGE']}
1295 # TODO: add back version
1296 summary_info += {'slirp support': config_host.has_key('CONFIG_SLIRP')}
1297 if config_host.has_key('CONFIG_SLIRP')
1298 summary_info += {'smbd': config_host['CONFIG_SMBD_COMMAND']}
1300 summary_info += {'module support': config_host.has_key('CONFIG_MODULES')}
1301 if config_host.has_key('CONFIG_MODULES')
1302 summary_info += {'alternative module path': config_host.has_key('CONFIG_MODULE_UPGRADES')}
1304 summary_info += {'host CPU': cpu}
1305 summary_info += {'host endianness': build_machine.endian()}
1306 summary_info += {'target list': config_host['TARGET_DIRS']}
1307 summary_info += {'gprof enabled': config_host.has_key('CONFIG_GPROF')}
1308 summary_info += {'sparse enabled': meson.get_compiler('c').cmd_array().contains('cgcc')}
1309 summary_info += {'strip binaries': get_option('strip')}
1310 summary_info += {'profiler': config_host.has_key('CONFIG_PROFILER')}
1311 summary_info += {'static build': config_host.has_key('CONFIG_TOOLS')}
1312 if targetos == 'darwin'
1313 summary_info += {'Cocoa support': config_host.has_key('CONFIG_COCOA')}
1315 # TODO: add back version
1316 summary_info += {'SDL support': sdl.found()}
1317 summary_info += {'SDL image support': sdl_image.found()}
1318 # TODO: add back version
1319 summary_info += {'GTK support': config_host.has_key('CONFIG_GTK')}
1320 summary_info += {'GTK GL support': config_host.has_key('CONFIG_GTK_GL')}
1321 summary_info += {'pixman': pixman.found()}
1322 # TODO: add back version
1323 summary_info += {'VTE support': config_host.has_key('CONFIG_VTE')}
1324 summary_info += {'TLS priority': config_host['CONFIG_TLS_PRIORITY']}
1325 summary_info += {'GNUTLS support': config_host.has_key('CONFIG_GNUTLS')}
1326 # TODO: add back version
1327 summary_info += {'libgcrypt': config_host.has_key('CONFIG_GCRYPT')}
1328 if config_host.has_key('CONFIG_GCRYPT')
1329 summary_info += {' hmac': config_host.has_key('CONFIG_GCRYPT_HMAC')}
1330 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
1332 # TODO: add back version
1333 summary_info += {'nettle': config_host.has_key('CONFIG_NETTLE')}
1334 if config_host.has_key('CONFIG_NETTLE')
1335 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
1337 summary_info += {'libtasn1': config_host.has_key('CONFIG_TASN1')}
1338 summary_info += {'PAM': config_host.has_key('CONFIG_AUTH_PAM')}
1339 summary_info += {'iconv support': config_host.has_key('CONFIG_ICONV')}
1340 summary_info += {'curses support': config_host.has_key('CONFIG_CURSES')}
1341 # TODO: add back version
1342 summary_info += {'virgl support': config_host.has_key('CONFIG_VIRGL')}
1343 summary_info += {'curl support': config_host.has_key('CONFIG_CURL')}
1344 summary_info += {'mingw32 support': targetos == 'windows'}
1345 summary_info += {'Audio drivers': config_host['CONFIG_AUDIO_DRIVERS']}
1346 summary_info += {'Block whitelist (rw)': config_host['CONFIG_BDRV_RW_WHITELIST']}
1347 summary_info += {'Block whitelist (ro)': config_host['CONFIG_BDRV_RO_WHITELIST']}
1348 summary_info += {'VirtFS support': config_host.has_key('CONFIG_VIRTFS')}
1349 summary_info += {'Multipath support': config_host.has_key('CONFIG_MPATH')}
1350 summary_info += {'VNC support': vnc.found()}
1352 summary_info += {'VNC SASL support': sasl.found()}
1353 summary_info += {'VNC JPEG support': jpeg.found()}
1354 summary_info += {'VNC PNG support': png.found()}
1356 summary_info += {'xen support': config_host.has_key('CONFIG_XEN_BACKEND')}
1357 if config_host.has_key('CONFIG_XEN_BACKEND')
1358 summary_info += {'xen ctrl version': config_host['CONFIG_XEN_CTRL_INTERFACE_VERSION']}
1360 summary_info += {'brlapi support': config_host.has_key('CONFIG_BRLAPI')}
1361 summary_info += {'Documentation': config_host.has_key('BUILD_DOCS')}
1362 summary_info += {'PIE': get_option('b_pie')}
1363 summary_info += {'vde support': config_host.has_key('CONFIG_VDE')}
1364 summary_info += {'netmap support': config_host.has_key('CONFIG_NETMAP')}
1365 summary_info += {'Linux AIO support': config_host.has_key('CONFIG_LINUX_AIO')}
1366 summary_info += {'Linux io_uring support': config_host.has_key('CONFIG_LINUX_IO_URING')}
1367 summary_info += {'ATTR/XATTR support': config_host.has_key('CONFIG_ATTR')}
1368 summary_info += {'Install blobs': config_host.has_key('INSTALL_BLOBS')}
1369 # TODO: add back KVM/HAX/HVF/WHPX/TCG
1370 #summary_info += {'KVM support': have_kvm'}
1371 #summary_info += {'HAX support': have_hax'}
1372 #summary_info += {'HVF support': have_hvf'}
1373 #summary_info += {'WHPX support': have_whpx'}
1374 #summary_info += {'TCG support': have_tcg'}
1375 #if get_option('tcg')
1376 # summary_info += {'TCG debug enabled': config_host.has_key('CONFIG_DEBUG_TCG')}
1377 # summary_info += {'TCG interpreter': config_host.has_key('CONFIG_TCG_INTERPRETER')}
1379 summary_info += {'malloc trim support': config_host.has_key('CONFIG_MALLOC_TRIM')}
1380 summary_info += {'RDMA support': config_host.has_key('CONFIG_RDMA')}
1381 summary_info += {'PVRDMA support': config_host.has_key('CONFIG_PVRDMA')}
1382 summary_info += {'fdt support': config_host.has_key('CONFIG_FDT')}
1383 summary_info += {'membarrier': config_host.has_key('CONFIG_MEMBARRIER')}
1384 summary_info += {'preadv support': config_host.has_key('CONFIG_PREADV')}
1385 summary_info += {'fdatasync': config_host.has_key('CONFIG_FDATASYNC')}
1386 summary_info += {'madvise': config_host.has_key('CONFIG_MADVISE')}
1387 summary_info += {'posix_madvise': config_host.has_key('CONFIG_POSIX_MADVISE')}
1388 summary_info += {'posix_memalign': config_host.has_key('CONFIG_POSIX_MEMALIGN')}
1389 summary_info += {'libcap-ng support': config_host.has_key('CONFIG_LIBCAP_NG')}
1390 summary_info += {'vhost-net support': config_host.has_key('CONFIG_VHOST_NET')}
1391 summary_info += {'vhost-crypto support': config_host.has_key('CONFIG_VHOST_CRYPTO')}
1392 summary_info += {'vhost-scsi support': config_host.has_key('CONFIG_VHOST_SCSI')}
1393 summary_info += {'vhost-vsock support': config_host.has_key('CONFIG_VHOST_VSOCK')}
1394 summary_info += {'vhost-user support': config_host.has_key('CONFIG_VHOST_KERNEL')}
1395 summary_info += {'vhost-user-fs support': config_host.has_key('CONFIG_VHOST_USER_FS')}
1396 summary_info += {'vhost-vdpa support': config_host.has_key('CONFIG_VHOST_VDPA')}
1397 summary_info += {'Trace backends': config_host['TRACE_BACKENDS']}
1398 if config_host['TRACE_BACKENDS'].split().contains('simple')
1399 summary_info += {'Trace output file': config_host['CONFIG_TRACE_FILE'] + '-<pid>'}
1401 # TODO: add back protocol and server version
1402 summary_info += {'spice support': config_host.has_key('CONFIG_SPICE')}
1403 summary_info += {'rbd support': config_host.has_key('CONFIG_RBD')}
1404 summary_info += {'xfsctl support': config_host.has_key('CONFIG_XFS')}
1405 summary_info += {'smartcard support': config_host.has_key('CONFIG_SMARTCARD')}
1406 summary_info += {'U2F support': u2f.found()}
1407 summary_info += {'libusb': config_host.has_key('CONFIG_USB_LIBUSB')}
1408 summary_info += {'usb net redir': config_host.has_key('CONFIG_USB_REDIR')}
1409 summary_info += {'OpenGL support': config_host.has_key('CONFIG_OPENGL')}
1410 summary_info += {'OpenGL dmabufs': config_host.has_key('CONFIG_OPENGL_DMABUF')}
1411 summary_info += {'libiscsi support': config_host.has_key('CONFIG_LIBISCSI')}
1412 summary_info += {'libnfs support': config_host.has_key('CONFIG_LIBNFS')}
1413 summary_info += {'build guest agent': config_host.has_key('CONFIG_GUEST_AGENT')}
1414 if targetos == 'windows'
1415 if 'WIN_SDK' in config_host
1416 summary_info += {'Windows SDK': config_host['WIN_SDK']}
1418 summary_info += {'QGA VSS support': config_host.has_key('CONFIG_QGA_VSS')}
1419 summary_info += {'QGA w32 disk info': config_host.has_key('CONFIG_QGA_NTDDSCSI')}
1420 summary_info += {'QGA MSI support': config_host.has_key('CONFIG_QGA_MSI_ENABLED')}
1422 summary_info += {'seccomp support': config_host.has_key('CONFIG_SECCOMP')}
1423 summary_info += {'coroutine backend': config_host['CONFIG_COROUTINE_BACKEND']}
1424 summary_info += {'coroutine pool': config_host['CONFIG_COROUTINE_POOL'] == '1'}
1425 summary_info += {'debug stack usage': config_host.has_key('CONFIG_DEBUG_STACK_USAGE')}
1426 summary_info += {'mutex debugging': config_host.has_key('CONFIG_DEBUG_MUTEX')}
1427 summary_info += {'crypto afalg': config_host.has_key('CONFIG_AF_ALG')}
1428 summary_info += {'GlusterFS support': config_host.has_key('CONFIG_GLUSTERFS')}
1429 summary_info += {'gcov': get_option('b_coverage')}
1430 summary_info += {'TPM support': config_host.has_key('CONFIG_TPM')}
1431 summary_info += {'libssh support': config_host.has_key('CONFIG_LIBSSH')}
1432 summary_info += {'QOM debugging': config_host.has_key('CONFIG_QOM_CAST_DEBUG')}
1433 summary_info += {'Live block migration': config_host.has_key('CONFIG_LIVE_BLOCK_MIGRATION')}
1434 summary_info += {'lzo support': config_host.has_key('CONFIG_LZO')}
1435 summary_info += {'snappy support': config_host.has_key('CONFIG_SNAPPY')}
1436 summary_info += {'bzip2 support': config_host.has_key('CONFIG_BZIP2')}
1437 summary_info += {'lzfse support': config_host.has_key('CONFIG_LZFSE')}
1438 summary_info += {'zstd support': config_host.has_key('CONFIG_ZSTD')}
1439 summary_info += {'NUMA host support': config_host.has_key('CONFIG_NUMA')}
1440 summary_info += {'libxml2': config_host.has_key('CONFIG_LIBXML2')}
1441 summary_info += {'tcmalloc support': config_host.has_key('CONFIG_TCMALLOC')}
1442 summary_info += {'jemalloc support': config_host.has_key('CONFIG_JEMALLOC')}
1443 summary_info += {'avx2 optimization': config_host.has_key('CONFIG_AVX2_OPT')}
1444 summary_info += {'avx512f optimization': config_host.has_key('CONFIG_AVX512F_OPT')}
1445 summary_info += {'replication support': config_host.has_key('CONFIG_REPLICATION')}
1446 summary_info += {'bochs support': config_host.has_key('CONFIG_BOCHS')}
1447 summary_info += {'cloop support': config_host.has_key('CONFIG_CLOOP')}
1448 summary_info += {'dmg support': config_host.has_key('CONFIG_DMG')}
1449 summary_info += {'qcow v1 support': config_host.has_key('CONFIG_QCOW1')}
1450 summary_info += {'vdi support': config_host.has_key('CONFIG_VDI')}
1451 summary_info += {'vvfat support': config_host.has_key('CONFIG_VVFAT')}
1452 summary_info += {'qed support': config_host.has_key('CONFIG_QED')}
1453 summary_info += {'parallels support': config_host.has_key('CONFIG_PARALLELS')}
1454 summary_info += {'sheepdog support': config_host.has_key('CONFIG_SHEEPDOG')}
1455 summary_info += {'capstone': config_host.has_key('CONFIG_CAPSTONE')}
1456 summary_info += {'libpmem support': config_host.has_key('CONFIG_LIBPMEM')}
1457 summary_info += {'libdaxctl support': config_host.has_key('CONFIG_LIBDAXCTL')}
1458 summary_info += {'libudev': config_host.has_key('CONFIG_LIBUDEV')}
1459 summary_info += {'default devices': config_host['CONFIG_MINIKCONF_MODE'] == '--defconfig'}
1460 summary_info += {'plugin support': config_host.has_key('CONFIG_PLUGIN')}
1461 summary_info += {'fuzzing support': config_host.has_key('CONFIG_FUZZ')}
1462 if config_host.has_key('HAVE_GDB_BIN')
1463 summary_info += {'gdb': config_host['HAVE_GDB_BIN']}
1465 summary_info += {'thread sanitizer': config_host.has_key('CONFIG_TSAN')}
1466 summary_info += {'rng-none': config_host.has_key('CONFIG_RNG_NONE')}
1467 summary_info += {'Linux keyring': config_host.has_key('CONFIG_SECRET_KEYRING')}
1468 summary(summary_info, bool_yn: true)
1470 if not supported_cpus.contains(cpu)
1472 warning('SUPPORT FOR THIS HOST CPU WILL GO AWAY IN FUTURE RELEASES!')
1474 message('CPU host architecture ' + cpu + ' support is not currently maintained.')
1475 message('The QEMU project intends to remove support for this host CPU in')
1476 message('a future release if nobody volunteers to maintain it and to')
1477 message('provide a build host for our continuous integration setup.')
1478 message('configure has succeeded and you can continue to build, but')
1479 message('if you care about QEMU on this platform you should contact')
1480 message('us upstream at qemu-devel@nongnu.org.')
1483 if not supported_oses.contains(targetos)
1485 warning('WARNING: SUPPORT FOR THIS HOST OS WILL GO AWAY IN FUTURE RELEASES!')
1487 message('Host OS ' + targetos + 'support is not currently maintained.')
1488 message('The QEMU project intends to remove support for this host OS in')
1489 message('a future release if nobody volunteers to maintain it and to')
1490 message('provide a build host for our continuous integration setup.')
1491 message('configure has succeeded and you can continue to build, but')
1492 message('if you care about QEMU on this platform you should contact')
1493 message('us upstream at qemu-devel@nongnu.org.')