1 project('qemu', ['c'], meson_version: '>=0.55.0',
2 default_options: ['warning_level=1', 'c_std=gnu99', 'cpp_std=gnu++11', 'b_lundef=false'],
3 version: run_command('head', meson.source_root() / 'VERSION').stdout().strip())
5 not_found = dependency('', required: false)
6 if meson.version().version_compare('>=0.56.0')
7 keyval = import('keyval')
9 keyval = import('unstable-keyval')
11 ss = import('sourceset')
13 sh = find_program('sh')
14 cc = meson.get_compiler('c')
15 config_host = keyval.load(meson.current_build_dir() / 'config-host.mak')
16 config_all_disas = keyval.load(meson.current_build_dir() / 'config-all-disas.mak')
17 enable_modules = 'CONFIG_MODULES' in config_host
18 enable_static = 'CONFIG_STATIC' in config_host
19 build_docs = 'BUILD_DOCS' in config_host
20 config_host_data = configuration_data()
23 add_project_arguments(config_host['QEMU_CFLAGS'].split(),
24 native: false, language: ['c', 'objc'])
25 add_project_arguments(config_host['QEMU_CXXFLAGS'].split(),
26 native: false, language: 'cpp')
27 add_project_link_arguments(config_host['QEMU_LDFLAGS'].split(),
28 native: false, language: ['c', 'cpp', 'objc'])
29 add_project_arguments(config_host['QEMU_INCLUDES'].split(),
30 language: ['c', 'cpp', 'objc'])
32 python = import('python').find_installation()
34 link_language = meson.get_external_property('link_language', 'cpp')
35 if link_language == 'cpp'
36 add_languages('cpp', required: true, native: false)
38 if host_machine.system() == 'darwin'
39 add_languages('objc', required: false, native: false)
42 if 'SPARSE_CFLAGS' in config_host
44 command: [find_program('scripts/check_sparse.py'),
45 config_host['SPARSE_CFLAGS'].split(),
46 'compile_commands.json'])
49 configure_file(input: files('scripts/ninjatool.py'),
51 configuration: config_host)
53 supported_oses = ['windows', 'freebsd', 'netbsd', 'openbsd', 'darwin', 'sunos', 'linux']
54 supported_cpus = ['ppc', 'ppc64', 's390x', 'sparc64', 'riscv32', 'riscv64', 'x86', 'x86_64',
55 'arm', 'aarch64', 'mips', 'mips64', 'sparc', 'sparc64']
57 cpu = host_machine.cpu_family()
58 targetos = host_machine.system()
60 m = cc.find_library('m', required: false)
61 util = cc.find_library('util', required: false)
69 if targetos == 'windows'
70 socket = cc.find_library('ws2_32')
71 winmm = cc.find_library('winmm')
73 win = import('windows')
74 version_res = win.compile_resources('version.rc',
75 depend_files: files('pc-bios/qemu-nsis.ico'),
76 include_directories: include_directories('.'))
77 elif targetos == 'darwin'
78 coref = dependency('appleframeworks', modules: 'CoreFoundation')
79 iokit = dependency('appleframeworks', modules: 'IOKit')
80 cocoa = dependency('appleframeworks', modules: 'Cocoa')
81 hvf = dependency('appleframeworks', modules: 'Hypervisor')
82 elif targetos == 'sunos'
83 socket = [cc.find_library('socket'),
84 cc.find_library('nsl'),
85 cc.find_library('resolv')]
86 elif targetos == 'haiku'
87 socket = [cc.find_library('posix_error_mapper'),
88 cc.find_library('network'),
89 cc.find_library('bsd')]
91 glib = declare_dependency(compile_args: config_host['GLIB_CFLAGS'].split(),
92 link_args: config_host['GLIB_LIBS'].split())
94 if 'CONFIG_GIO' in config_host
95 gio = declare_dependency(compile_args: config_host['GIO_CFLAGS'].split(),
96 link_args: config_host['GIO_LIBS'].split())
99 if 'CONFIG_TRACE_UST' in config_host
100 lttng = declare_dependency(link_args: config_host['LTTNG_UST_LIBS'].split())
103 if 'CONFIG_TRACE_UST' in config_host
104 urcubp = declare_dependency(link_args: config_host['URCU_BP_LIBS'].split())
107 if 'CONFIG_NETTLE' in config_host
108 nettle = declare_dependency(compile_args: config_host['NETTLE_CFLAGS'].split(),
109 link_args: config_host['NETTLE_LIBS'].split())
112 if 'CONFIG_GNUTLS' in config_host
113 gnutls = declare_dependency(compile_args: config_host['GNUTLS_CFLAGS'].split(),
114 link_args: config_host['GNUTLS_LIBS'].split())
116 pixman = declare_dependency(compile_args: config_host['PIXMAN_CFLAGS'].split(),
117 link_args: config_host['PIXMAN_LIBS'].split())
119 if 'CONFIG_AUTH_PAM' in config_host
120 pam = cc.find_library('pam')
122 libaio = cc.find_library('aio', required: false)
124 if 'CONFIG_ZLIB' in config_host
125 zlib = declare_dependency(compile_args: config_host['ZLIB_CFLAGS'].split(),
126 link_args: config_host['ZLIB_LIBS'].split())
128 linux_io_uring = not_found
129 if 'CONFIG_LINUX_IO_URING' in config_host
130 linux_io_uring = declare_dependency(compile_args: config_host['LINUX_IO_URING_CFLAGS'].split(),
131 link_args: config_host['LINUX_IO_URING_LIBS'].split())
134 if 'CONFIG_LIBXML2' in config_host
135 libxml2 = declare_dependency(compile_args: config_host['LIBXML2_CFLAGS'].split(),
136 link_args: config_host['LIBXML2_LIBS'].split())
139 if 'CONFIG_LIBNFS' in config_host
140 libnfs = declare_dependency(link_args: config_host['LIBNFS_LIBS'].split())
143 if 'CONFIG_ATTR' in config_host
144 libattr = declare_dependency(link_args: config_host['LIBATTR_LIBS'].split())
147 if 'CONFIG_SECCOMP' in config_host
148 seccomp = declare_dependency(compile_args: config_host['SECCOMP_CFLAGS'].split(),
149 link_args: config_host['SECCOMP_LIBS'].split())
151 libcap_ng = not_found
152 if 'CONFIG_LIBCAP_NG' in config_host
153 libcap_ng = declare_dependency(link_args: config_host['LIBCAP_NG_LIBS'].split())
155 xkbcommon = dependency('xkbcommon', required: get_option('xkbcommon'), static: enable_static,
156 include_type: 'system')
158 xkbcommon = declare_dependency(dependencies: xkbcommon)
161 if config_host.has_key('CONFIG_SLIRP')
162 slirp = declare_dependency(compile_args: config_host['SLIRP_CFLAGS'].split(),
163 link_args: config_host['SLIRP_LIBS'].split())
166 if config_host.has_key('CONFIG_VDE')
167 vde = declare_dependency(link_args: config_host['VDE_LIBS'].split())
170 if 'CONFIG_LIBPULSE' in config_host
171 pulse = declare_dependency(compile_args: config_host['PULSE_CFLAGS'].split(),
172 link_args: config_host['PULSE_LIBS'].split())
175 if 'CONFIG_ALSA' in config_host
176 alsa = declare_dependency(compile_args: config_host['ALSA_CFLAGS'].split(),
177 link_args: config_host['ALSA_LIBS'].split())
180 if 'CONFIG_LIBJACK' in config_host
181 jack = declare_dependency(link_args: config_host['JACK_LIBS'].split())
184 if 'CONFIG_SPICE' in config_host
185 spice = declare_dependency(compile_args: config_host['SPICE_CFLAGS'].split(),
186 link_args: config_host['SPICE_LIBS'].split())
188 rt = cc.find_library('rt', required: false)
189 libmpathpersist = not_found
190 if config_host.has_key('CONFIG_MPATH')
191 libmpathpersist = cc.find_library('mpathpersist')
194 if 'CONFIG_LIBISCSI' in config_host
195 libiscsi = declare_dependency(compile_args: config_host['LIBISCSI_CFLAGS'].split(),
196 link_args: config_host['LIBISCSI_LIBS'].split())
199 if 'CONFIG_ZSTD' in config_host
200 zstd = declare_dependency(compile_args: config_host['ZSTD_CFLAGS'].split(),
201 link_args: config_host['ZSTD_LIBS'].split())
204 if 'CONFIG_GBM' in config_host
205 gbm = declare_dependency(compile_args: config_host['GBM_CFLAGS'].split(),
206 link_args: config_host['GBM_LIBS'].split())
209 if 'CONFIG_VIRGL' in config_host
210 virgl = declare_dependency(compile_args: config_host['VIRGL_CFLAGS'].split(),
211 link_args: config_host['VIRGL_LIBS'].split())
214 if 'CONFIG_CURL' in config_host
215 curl = declare_dependency(compile_args: config_host['CURL_CFLAGS'].split(),
216 link_args: config_host['CURL_LIBS'].split())
219 if 'CONFIG_LIBUDEV' in config_host
220 libudev = declare_dependency(link_args: config_host['LIBUDEV_LIBS'].split())
223 if 'CONFIG_BRLAPI' in config_host
224 brlapi = declare_dependency(link_args: config_host['BRLAPI_LIBS'].split())
227 sdl = dependency('sdl2', required: get_option('sdl'), static: enable_static,
228 include_type: 'system')
229 sdl_image = not_found
231 # work around 2.0.8 bug
232 sdl = declare_dependency(compile_args: '-Wno-undef',
234 sdl_image = dependency('sdl-image', required: get_option('sdl_image'),
235 static: enable_static)
237 if get_option('sdl_image').enabled()
238 error('sdl-image required, but SDL was @0@',
239 get_option('sdl').disabled() ? 'disabled' : 'not found')
241 sdl_image = not_found
245 if 'CONFIG_RBD' in config_host
246 rbd = declare_dependency(link_args: config_host['RBD_LIBS'].split())
248 glusterfs = not_found
249 if 'CONFIG_GLUSTERFS' in config_host
250 glusterfs = declare_dependency(compile_args: config_host['GLUSTERFS_CFLAGS'].split(),
251 link_args: config_host['GLUSTERFS_LIBS'].split())
254 if 'CONFIG_LIBSSH' in config_host
255 libssh = declare_dependency(compile_args: config_host['LIBSSH_CFLAGS'].split(),
256 link_args: config_host['LIBSSH_LIBS'].split())
259 if 'CONFIG_BZIP2' in config_host
260 libbzip2 = declare_dependency(link_args: config_host['BZIP2_LIBS'].split())
263 if 'CONFIG_LZFSE' in config_host
264 liblzfse = declare_dependency(link_args: config_host['LZFSE_LIBS'].split())
267 if 'CONFIG_AUDIO_OSS' in config_host
268 oss = declare_dependency(link_args: config_host['OSS_LIBS'].split())
271 if 'CONFIG_AUDIO_DSOUND' in config_host
272 dsound = declare_dependency(link_args: config_host['DSOUND_LIBS'].split())
274 coreaudio = not_found
275 if 'CONFIG_AUDIO_COREAUDIO' in config_host
276 coreaudio = declare_dependency(link_args: config_host['COREAUDIO_LIBS'].split())
279 if 'CONFIG_OPENGL' in config_host
280 opengl = declare_dependency(link_args: config_host['OPENGL_LIBS'].split())
284 if 'CONFIG_GTK' in config_host
285 gtk = declare_dependency(compile_args: config_host['GTK_CFLAGS'].split(),
286 link_args: config_host['GTK_LIBS'].split())
289 if 'CONFIG_VTE' in config_host
290 vte = declare_dependency(compile_args: config_host['VTE_CFLAGS'].split(),
291 link_args: config_host['VTE_LIBS'].split())
294 if 'CONFIG_X11' in config_host
295 x11 = declare_dependency(compile_args: config_host['X11_CFLAGS'].split(),
296 link_args: config_host['X11_LIBS'].split())
299 if 'CONFIG_CURSES' in config_host
300 curses = declare_dependency(compile_args: config_host['CURSES_CFLAGS'].split(),
301 link_args: config_host['CURSES_LIBS'].split())
304 if 'CONFIG_ICONV' in config_host
305 iconv = declare_dependency(compile_args: config_host['ICONV_CFLAGS'].split(),
306 link_args: config_host['ICONV_LIBS'].split())
309 if 'CONFIG_GIO' in config_host
310 gio = declare_dependency(compile_args: config_host['GIO_CFLAGS'].split(),
311 link_args: config_host['GIO_LIBS'].split())
317 if get_option('vnc').enabled()
318 vnc = declare_dependency() # dummy dependency
319 png = dependency('libpng', required: get_option('vnc_png'),
320 static: enable_static)
321 jpeg = cc.find_library('jpeg', has_headers: ['jpeglib.h'],
322 required: get_option('vnc_jpeg'),
323 static: enable_static)
324 sasl = cc.find_library('sasl2', has_headers: ['sasl/sasl.h'],
325 required: get_option('vnc_sasl'),
326 static: enable_static)
328 sasl = declare_dependency(dependencies: sasl,
329 compile_args: '-DSTRUCT_IOVEC_DEFINED')
333 if 'CONFIG_FDT' in config_host
334 fdt = declare_dependency(compile_args: config_host['FDT_CFLAGS'].split(),
335 link_args: config_host['FDT_LIBS'].split())
338 if 'CONFIG_SNAPPY' in config_host
339 snappy = declare_dependency(link_args: config_host['SNAPPY_LIBS'].split())
342 if 'CONFIG_LZO' in config_host
343 lzo = declare_dependency(link_args: config_host['LZO_LIBS'].split())
346 if 'CONFIG_RDMA' in config_host
347 rdma = declare_dependency(link_args: config_host['RDMA_LIBS'].split())
350 if 'CONFIG_NUMA' in config_host
351 numa = declare_dependency(link_args: config_host['NUMA_LIBS'].split())
354 if 'CONFIG_XEN_BACKEND' in config_host
355 xen = declare_dependency(compile_args: config_host['XEN_CFLAGS'].split(),
356 link_args: config_host['XEN_LIBS'].split())
359 if 'CONFIG_SMARTCARD' in config_host
360 cacard = declare_dependency(compile_args: config_host['SMARTCARD_CFLAGS'].split(),
361 link_args: config_host['SMARTCARD_LIBS'].split())
364 if 'CONFIG_USB_REDIR' in config_host
365 usbredir = declare_dependency(compile_args: config_host['USB_REDIR_CFLAGS'].split(),
366 link_args: config_host['USB_REDIR_LIBS'].split())
369 if 'CONFIG_USB_LIBUSB' in config_host
370 libusb = declare_dependency(compile_args: config_host['LIBUSB_CFLAGS'].split(),
371 link_args: config_host['LIBUSB_LIBS'].split())
374 if 'CONFIG_CAPSTONE' in config_host
375 capstone = declare_dependency(compile_args: config_host['CAPSTONE_CFLAGS'].split(),
376 link_args: config_host['CAPSTONE_LIBS'].split())
379 if 'CONFIG_LIBPMEM' in config_host
380 libpmem = declare_dependency(compile_args: config_host['LIBPMEM_CFLAGS'].split(),
381 link_args: config_host['LIBPMEM_LIBS'].split())
383 libdaxctl = not_found
384 if 'CONFIG_LIBDAXCTL' in config_host
385 libdaxctl = declare_dependency(link_args: config_host['LIBDAXCTL_LIBS'].split())
388 # Create config-host.h
390 config_host_data.set('CONFIG_SDL', sdl.found())
391 config_host_data.set('CONFIG_SDL_IMAGE', sdl_image.found())
392 config_host_data.set('CONFIG_VNC', vnc.found())
393 config_host_data.set('CONFIG_VNC_JPEG', jpeg.found())
394 config_host_data.set('CONFIG_VNC_PNG', png.found())
395 config_host_data.set('CONFIG_VNC_SASL', sasl.found())
396 config_host_data.set('CONFIG_XKBCOMMON', xkbcommon.found())
397 config_host_data.set('QEMU_VERSION', '"@0@"'.format(meson.project_version()))
398 config_host_data.set('QEMU_VERSION_MAJOR', meson.project_version().split('.')[0])
399 config_host_data.set('QEMU_VERSION_MINOR', meson.project_version().split('.')[1])
400 config_host_data.set('QEMU_VERSION_MICRO', meson.project_version().split('.')[2])
402 arrays = ['CONFIG_AUDIO_DRIVERS', 'CONFIG_BDRV_RW_WHITELIST', 'CONFIG_BDRV_RO_WHITELIST']
403 strings = ['HOST_DSOSUF', 'CONFIG_IASL', 'qemu_confdir', 'qemu_datadir',
404 'qemu_moddir', 'qemu_localstatedir', 'qemu_helperdir', 'qemu_localedir',
405 'qemu_icondir', 'qemu_desktopdir', 'qemu_firmwarepath']
406 foreach k, v: config_host
407 if arrays.contains(k)
409 v = '"' + '", "'.join(v.split()) + '", '
411 config_host_data.set(k, v)
413 config_host_data.set('HOST_' + v.to_upper(), 1)
414 elif strings.contains(k)
415 if not k.startswith('CONFIG_')
416 k = 'CONFIG_' + k.to_upper()
418 config_host_data.set_quoted(k, v)
419 elif k.startswith('CONFIG_') or k.startswith('HAVE_') or k.startswith('HOST_')
420 config_host_data.set(k, v == 'y' ? 1 : v)
423 genh += configure_file(output: 'config-host.h', configuration: config_host_data)
425 minikconf = find_program('scripts/minikconf.py')
426 target_dirs = config_host['TARGET_DIRS'].split()
429 config_devices_mak_list = []
430 config_devices_h = {}
432 config_target_mak = {}
433 kconfig_external_symbols = [
442 'CONFIG_VHOST_KERNEL',
447 ignored = ['TARGET_XML_FILES', 'TARGET_ABI_DIR', 'TARGET_DIRS']
448 foreach target : target_dirs
449 have_user = have_user or target.endswith('-user')
450 config_target = keyval.load(meson.current_build_dir() / target / 'config-target.mak')
452 config_target_data = configuration_data()
453 foreach k, v: config_target
454 if not k.startswith('TARGET_') and not k.startswith('CONFIG_')
456 elif ignored.contains(k)
458 elif k == 'TARGET_BASE_ARCH'
459 config_target_data.set('TARGET_' + v.to_upper(), 1)
460 elif k == 'TARGET_NAME'
461 config_target_data.set_quoted(k, v)
463 config_target_data.set(k, 1)
465 config_target_data.set(k, v)
468 config_target_h += {target: configure_file(output: target + '-config-target.h',
469 configuration: config_target_data)}
471 if target.endswith('-softmmu')
475 foreach sym : kconfig_external_symbols
476 if sym in config_target or sym in config_host
477 base_kconfig += '@0@=y'.format(sym)
481 config_devices_mak = target + '-config-devices.mak'
482 config_devices_mak = configure_file(
483 input: ['default-configs' / target + '.mak', 'Kconfig'],
484 output: config_devices_mak,
485 depfile: config_devices_mak + '.d',
487 command: [minikconf, config_host['CONFIG_MINIKCONF_MODE'],
488 config_devices_mak, '@DEPFILE@', '@INPUT@',
491 config_devices_data = configuration_data()
492 config_devices = keyval.load(config_devices_mak)
493 foreach k, v: config_devices
494 config_devices_data.set(k, 1)
496 config_devices_mak_list += config_devices_mak
497 config_devices_h += {target: configure_file(output: target + '-config-devices.h',
498 configuration: config_devices_data)}
499 config_target += config_devices
501 config_target_mak += {target: config_target}
503 have_tools = 'CONFIG_TOOLS' in config_host
504 have_block = have_system or have_tools
506 grepy = find_program('scripts/grepy.sh')
507 # This configuration is used to build files that are shared by
508 # multiple binaries, and then extracted out of the "common"
509 # static_library target.
511 # We do not use all_sources()/all_dependencies(), because it would
512 # build literally all source files, including devices only used by
513 # targets that are not built for this compilation. The CONFIG_ALL
514 # pseudo symbol replaces it.
517 config_all_devices_mak = configure_file(
518 output: 'config-all-devices.mak',
519 input: config_devices_mak_list,
521 command: [grepy, '@INPUT@'],
523 config_all_devices = keyval.load(config_all_devices_mak)
525 config_all_devices = {}
527 config_all = config_all_devices
528 config_all += config_host
529 config_all += config_all_disas
531 'CONFIG_XEN': config_host.has_key('CONFIG_XEN_BACKEND'),
532 'CONFIG_SOFTMMU': have_system,
533 'CONFIG_USER_ONLY': have_user,
539 hxtool = find_program('scripts/hxtool')
540 shaderinclude = find_program('scripts/shaderinclude.pl')
541 qapi_gen = find_program('scripts/qapi-gen.py')
542 qapi_gen_depends = [ meson.source_root() / 'scripts/qapi/__init__.py',
543 meson.source_root() / 'scripts/qapi/commands.py',
544 meson.source_root() / 'scripts/qapi/common.py',
545 meson.source_root() / 'scripts/qapi/doc.py',
546 meson.source_root() / 'scripts/qapi/error.py',
547 meson.source_root() / 'scripts/qapi/events.py',
548 meson.source_root() / 'scripts/qapi/expr.py',
549 meson.source_root() / 'scripts/qapi/gen.py',
550 meson.source_root() / 'scripts/qapi/introspect.py',
551 meson.source_root() / 'scripts/qapi/parser.py',
552 meson.source_root() / 'scripts/qapi/schema.py',
553 meson.source_root() / 'scripts/qapi/source.py',
554 meson.source_root() / 'scripts/qapi/types.py',
555 meson.source_root() / 'scripts/qapi/visit.py',
556 meson.source_root() / 'scripts/qapi/common.py',
557 meson.source_root() / 'scripts/qapi/doc.py',
558 meson.source_root() / 'scripts/qapi-gen.py'
562 python, files('scripts/tracetool.py'),
563 '--backend=' + config_host['TRACE_BACKENDS']
566 qemu_version_cmd = [find_program('scripts/qemu-version.sh'),
567 meson.current_source_dir(),
568 config_host['PKGVERSION'], meson.project_version()]
569 qemu_version = custom_target('qemu-version.h',
570 output: 'qemu-version.h',
571 command: qemu_version_cmd,
573 build_by_default: true,
574 build_always_stale: true)
579 ['qemu-options.hx', 'qemu-options.def'],
580 ['qemu-img-cmds.hx', 'qemu-img-cmds.h'],
584 ['hmp-commands.hx', 'hmp-commands.h'],
585 ['hmp-commands-info.hx', 'hmp-commands-info.h'],
588 foreach d : hx_headers
589 hxdep += custom_target(d[1],
593 build_by_default: true, # to be removed when added to a target
594 command: [hxtool, '-h', '@INPUT0@'])
598 # Collect sourcesets.
600 util_ss = ss.source_set()
601 stub_ss = ss.source_set()
602 trace_ss = ss.source_set()
603 block_ss = ss.source_set()
604 blockdev_ss = ss.source_set()
605 qmp_ss = ss.source_set()
606 common_ss = ss.source_set()
607 softmmu_ss = ss.source_set()
608 user_ss = ss.source_set()
609 bsd_user_ss = ss.source_set()
610 linux_user_ss = ss.source_set()
611 specific_ss = ss.source_set()
612 specific_fuzz_ss = ss.source_set()
617 target_softmmu_arch = {}
623 # TODO: add each directory to the subdirs from its own meson.build, once
625 trace_events_subdirs = [
632 trace_events_subdirs += [ 'linux-user' ]
635 trace_events_subdirs += [
644 trace_events_subdirs += [
655 'hw/block/dataplane',
700 trace_events_subdirs += [
727 libmodulecommon = static_library('module-common', files('module-common.c') + genh, pic: true, c_args: '-DBUILD_DSO')
728 modulecommon = declare_dependency(link_whole: libmodulecommon, compile_args: '-DBUILD_DSO')
731 # Build targets from sourcesets
733 stub_ss = stub_ss.apply(config_all, strict: false)
735 util_ss.add_all(trace_ss)
736 util_ss = util_ss.apply(config_all, strict: false)
737 libqemuutil = static_library('qemuutil',
738 sources: util_ss.sources() + stub_ss.sources() + genh,
739 dependencies: [util_ss.dependencies(), m, glib, socket])
740 qemuutil = declare_dependency(link_with: libqemuutil,
741 sources: genh + version_res)
743 decodetree = generator(find_program('scripts/decodetree.py'),
744 output: 'decode-@BASENAME@.c.inc',
745 arguments: ['@INPUT@', '@EXTRA_ARGS@', '-o', '@OUTPUT@'])
751 subdir('libdecnumber')
761 block_ss.add(when: 'CONFIG_REPLICATION', if_true: files('replication.c'))
767 blockdev_ss.add(files(
774 # os-posix.c contains POSIX-specific functions used by qemu-storage-daemon,
775 # os-win32.c does not
776 blockdev_ss.add(when: 'CONFIG_POSIX', if_true: files('os-posix.c'))
777 softmmu_ss.add(when: 'CONFIG_WIN32', if_true: [files('os-win32.c')])
779 softmmu_ss.add_all(blockdev_ss)
780 softmmu_ss.add(files(
786 softmmu_ss.add(when: 'CONFIG_TPM', if_true: files('tpm.c'))
787 softmmu_ss.add(when: 'CONFIG_SECCOMP', if_true: [files('qemu-seccomp.c'), seccomp])
788 softmmu_ss.add(when: ['CONFIG_FDT', fdt], if_true: [files('device_tree.c')])
790 common_ss.add(files('cpus-common.c'))
794 specific_ss.add(files('disas.c', 'exec.c', 'gdbstub.c'), capstone, libpmem, libdaxctl)
795 specific_ss.add(files('exec-vary.c'))
796 specific_ss.add(when: 'CONFIG_TCG', if_true: files(
805 specific_ss.add(when: 'CONFIG_TCG_INTERPRETER', if_true: files('disas/tci.c', 'tcg/tci.c'))
819 bsd_user_ss.add(files('gdbstub.c'))
820 specific_ss.add_all(when: 'CONFIG_BSD_USER', if_true: bsd_user_ss)
822 linux_user_ss.add(files('gdbstub.c', 'thunk.c'))
823 specific_ss.add_all(when: 'CONFIG_LINUX_USER', if_true: linux_user_ss)
825 # needed for fuzzing binaries
826 subdir('tests/qtest/libqos')
827 subdir('tests/qtest/fuzz')
831 foreach d, list : modules
832 foreach m, module_ss : list
833 if enable_modules and targetos != 'windows'
834 module_ss = module_ss.apply(config_host, strict: false)
835 sl = static_library(d + '-' + m, [genh, module_ss.sources()],
836 dependencies: [modulecommon, module_ss.dependencies()], pic: true)
844 block_ss.add_all(module_ss)
846 softmmu_ss.add_all(module_ss)
852 nm = find_program('nm')
853 undefsym = find_program('scripts/undefsym.sh')
854 block_syms = custom_target('block.syms', output: 'block.syms',
855 input: [libqemuutil, block_mods],
857 command: [undefsym, nm, '@INPUT@'])
858 qemu_syms = custom_target('qemu.syms', output: 'qemu.syms',
859 input: [libqemuutil, softmmu_mods],
861 command: [undefsym, nm, '@INPUT@'])
863 block_ss = block_ss.apply(config_host, strict: false)
864 libblock = static_library('block', block_ss.sources() + genh,
865 dependencies: block_ss.dependencies(),
866 link_depends: block_syms,
868 build_by_default: false)
870 block = declare_dependency(link_whole: [libblock],
871 link_args: '@block.syms',
872 dependencies: [crypto, io])
874 qmp_ss = qmp_ss.apply(config_host, strict: false)
875 libqmp = static_library('qmp', qmp_ss.sources() + genh,
876 dependencies: qmp_ss.dependencies(),
878 build_by_default: false)
880 qmp = declare_dependency(link_whole: [libqmp])
882 foreach m : block_mods + softmmu_mods
883 shared_module(m.name(),
887 install_dir: config_host['qemu_moddir'])
890 softmmu_ss.add(authz, block, chardev, crypto, io, qmp)
891 common_ss.add(qom, qemuutil)
893 common_ss.add_all(when: 'CONFIG_SOFTMMU', if_true: [softmmu_ss])
894 common_ss.add_all(when: 'CONFIG_USER_ONLY', if_true: user_ss)
896 common_all = common_ss.apply(config_all, strict: false)
897 common_all = static_library('common',
898 build_by_default: false,
899 sources: common_all.sources() + genh,
900 dependencies: common_all.dependencies(),
903 feature_to_c = find_program('scripts/feature_to_c.sh')
906 foreach target : target_dirs
907 config_target = config_target_mak[target]
908 target_name = config_target['TARGET_NAME']
909 arch = config_target['TARGET_BASE_ARCH']
910 arch_srcs = [config_target_h[target]]
912 c_args = ['-DNEED_CPU_H',
913 '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
914 '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)]
917 config_target += config_host
918 target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
919 if targetos == 'linux'
920 target_inc += include_directories('linux-headers', is_system: true)
922 if target.endswith('-softmmu')
923 qemu_target_name = 'qemu-system-' + target_name
925 t = target_softmmu_arch[arch].apply(config_target, strict: false)
926 arch_srcs += t.sources()
927 arch_deps += t.dependencies()
929 hw_dir = target_name == 'sparc64' ? 'sparc64' : arch
930 hw = hw_arch[hw_dir].apply(config_target, strict: false)
931 arch_srcs += hw.sources()
932 arch_deps += hw.dependencies()
934 arch_srcs += config_devices_h[target]
935 link_args += ['@block.syms', '@qemu.syms']
937 abi = config_target['TARGET_ABI_DIR']
939 qemu_target_name = 'qemu-' + target_name
940 if 'CONFIG_LINUX_USER' in config_target
941 base_dir = 'linux-user'
942 target_inc += include_directories('linux-user/host/' / config_host['ARCH'])
944 base_dir = 'bsd-user'
946 target_inc += include_directories(
950 if 'CONFIG_LINUX_USER' in config_target
952 arch_srcs += files(dir / 'signal.c', dir / 'cpu_loop.c')
953 if config_target.has_key('TARGET_SYSTBL_ABI')
955 syscall_nr_generators[abi].process(base_dir / abi / config_target['TARGET_SYSTBL'],
956 extra_args : config_target['TARGET_SYSTBL_ABI'])
961 if 'TARGET_XML_FILES' in config_target
962 gdbstub_xml = custom_target(target + '-gdbstub-xml.c',
963 output: target + '-gdbstub-xml.c',
964 input: files(config_target['TARGET_XML_FILES'].split()),
965 command: [feature_to_c, '@INPUT@'],
967 arch_srcs += gdbstub_xml
970 t = target_arch[arch].apply(config_target, strict: false)
971 arch_srcs += t.sources()
972 arch_deps += t.dependencies()
974 target_common = common_ss.apply(config_target, strict: false)
975 objects = common_all.extract_objects(target_common.sources())
976 deps = target_common.dependencies()
978 target_specific = specific_ss.apply(config_target, strict: false)
979 arch_srcs += target_specific.sources()
980 arch_deps += target_specific.dependencies()
982 lib = static_library('qemu-' + target,
983 sources: arch_srcs + genh,
985 include_directories: target_inc,
987 build_by_default: false,
990 if target.endswith('-softmmu')
992 'name': 'qemu-system-' + target_name,
994 'sources': files('softmmu/main.c'),
997 if targetos == 'windows' and (sdl.found() or gtk.found())
999 'name': 'qemu-system-' + target_name + 'w',
1001 'sources': files('softmmu/main.c'),
1005 if config_host.has_key('CONFIG_FUZZ')
1006 specific_fuzz = specific_fuzz_ss.apply(config_target, strict: false)
1008 'name': 'qemu-fuzz-' + target_name,
1010 'sources': specific_fuzz.sources(),
1011 'dependencies': specific_fuzz.dependencies(),
1012 'link_depends': [files('tests/qtest/fuzz/fork_fuzz.ld')],
1017 'name': 'qemu-' + target_name,
1024 emulators += executable(exe['name'], exe['sources'],
1027 dependencies: arch_deps + deps + exe['dependencies'],
1028 objects: lib.extract_all_objects(recursive: true),
1029 link_language: link_language,
1030 link_depends: [block_syms, qemu_syms] + exe.get('link_depends', []),
1031 link_args: link_args,
1032 gui_app: exe['gui'])
1034 if 'CONFIG_TRACE_SYSTEMTAP' in config_host
1036 {'ext': '.stp-build', 'fmt': 'stap', 'bin': meson.current_build_dir() / exe['name'], 'install': false},
1037 {'ext': '.stp', 'fmt': 'stap', 'bin': get_option('prefix') / get_option('bindir') / exe['name'], 'install': true},
1038 {'ext': '-simpletrace.stp', 'fmt': 'simpletrace-stap', 'bin': '', 'install': true},
1039 {'ext': '-log.stp', 'fmt': 'log-stap', 'bin': '', 'install': true},
1041 custom_target(exe['name'] + stp['ext'],
1042 input: trace_events_all,
1043 output: exe['name'] + stp['ext'],
1045 install: stp['install'],
1046 install_dir: config_host['qemu_datadir'] / '../systemtap/tapset',
1048 tracetool, '--group=all', '--format=' + stp['fmt'],
1049 '--binary=' + stp['bin'],
1050 '--target-name=' + target_name,
1051 '--target-type=' + target_type,
1052 '--probe-prefix=qemu.' + target_type + '.' + target_name,
1060 # Other build targets
1062 if 'CONFIG_PLUGIN' in config_host
1063 install_headers('include/qemu/qemu-plugin.h')
1066 if 'CONFIG_GUEST_AGENT' in config_host
1070 # Don't build qemu-keymap if xkbcommon is not explicitly enabled
1071 # when we don't build tools or system
1072 if get_option('xkbcommon').auto() and not have_system and not have_tools
1073 xkbcommon = not_found
1075 if xkbcommon.found()
1076 # used for the update-keymaps target, so include rules even if !have_tools
1077 qemu_keymap = executable('qemu-keymap', files('qemu-keymap.c', 'ui/input-keymap.c') + genh,
1078 dependencies: [qemuutil, xkbcommon], install: have_tools)
1081 qemu_block_tools = []
1083 qemu_img = executable('qemu-img', [files('qemu-img.c'), hxdep],
1084 dependencies: [authz, block, crypto, io, qom, qemuutil], install: true)
1085 qemu_io = executable('qemu-io', files('qemu-io.c'),
1086 dependencies: [block, qemuutil], install: true)
1087 qemu_block_tools += [qemu_img, qemu_io]
1088 if targetos != 'windows'
1089 qemu_nbd = executable('qemu-nbd', files('qemu-nbd.c'),
1090 dependencies: [block, qemuutil], install: true)
1091 qemu_block_tools += [qemu_nbd]
1094 subdir('storage-daemon')
1095 subdir('contrib/rdmacm-mux')
1096 subdir('contrib/elf2dmp')
1098 executable('qemu-edid', files('qemu-edid.c', 'hw/display/edid-generate.c'),
1099 dependencies: qemuutil,
1102 if 'CONFIG_VHOST_USER' in config_host
1103 subdir('contrib/libvhost-user')
1104 subdir('contrib/vhost-user-blk')
1105 if 'CONFIG_LINUX' in config_host
1106 subdir('contrib/vhost-user-gpu')
1108 subdir('contrib/vhost-user-input')
1109 subdir('contrib/vhost-user-scsi')
1112 if targetos == 'linux'
1113 executable('qemu-bridge-helper', files('qemu-bridge-helper.c'),
1114 dependencies: [qemuutil, libcap_ng],
1116 install_dir: get_option('libexecdir'))
1118 executable('qemu-pr-helper', files('scsi/qemu-pr-helper.c', 'scsi/utils.c'),
1119 dependencies: [authz, crypto, io, qom, qemuutil,
1120 libcap_ng, libudev, libmpathpersist],
1124 if 'CONFIG_IVSHMEM' in config_host
1125 subdir('contrib/ivshmem-client')
1126 subdir('contrib/ivshmem-server')
1134 if 'CONFIG_GTK' in config_host
1139 makeinfo = find_program('makeinfo', required: build_docs)
1142 '-I', meson.current_source_dir(),
1143 '-I', meson.current_build_dir() / 'docs',
1147 version_texi = configure_file(output: 'version.texi',
1148 input: 'version.texi.in',
1149 configuration: {'VERSION': meson.project_version(),
1150 'qemu_confdir': config_host['qemu_confdir']})
1153 'qemu-qmp-ref': ['docs/interop/qemu-qmp-ref.texi', qapi_doc_texi, version_texi],
1155 if 'CONFIG_GUEST_AGENT' in config_host
1156 texi += {'qemu-ga-ref': ['docs/interop/qemu-ga-ref.texi', qga_qapi_doc_texi, version_texi]}
1161 'env', 'LC_ALL=C', makeinfo, '--no-split', '--number-sections', docs_inc,
1162 '@INPUT0@', '-o', '@OUTPUT@',
1164 foreach ext, args: {
1166 'html': ['--no-headers', '--html'],
1167 'txt': ['--no-headers', '--plaintext'],
1170 foreach doc, input: texi
1171 output = doc + '.' + ext
1172 t += custom_target(output,
1176 install_dir: config_host['qemu_docdir'] / 'interop',
1177 command: cmd + args)
1179 alias_target(ext, t)
1183 texi2pdf = find_program('texi2pdf', required: false)
1187 foreach doc, input: texi
1188 output = doc + '.pdf'
1189 pdfs += custom_target(output,
1192 command: [texi2pdf, '-q', docs_inc, '@INPUT0@', '-o', '@OUTPUT@'],
1193 build_by_default: false)
1195 alias_target('pdf', pdfs)
1198 texi2pod = find_program('scripts/texi2pod.pl')
1199 pod2man = find_program('pod2man', required: build_docs)
1202 foreach doc, input: texi
1204 pod = custom_target(man + '.pod',
1206 output: man + '.pod',
1208 '-DVERSION="' + meson.project_version() + '"',
1209 '-DCONFDIR="' + config_host['qemu_confdir'] + '"',
1210 '@INPUT0@', '@OUTPUT@'])
1211 man = custom_target(man,
1216 install_dir: config_host['mandir'] / 'man7',
1217 command: [pod2man, '--utf8', '--section=7', '--center=" "',
1218 '--release=" "', '@INPUT@'])
1224 summary_info += {'Install prefix': config_host['prefix']}
1225 summary_info += {'BIOS directory': config_host['qemu_datadir']}
1226 summary_info += {'firmware path': config_host['qemu_firmwarepath']}
1227 summary_info += {'binary directory': config_host['bindir']}
1228 summary_info += {'library directory': config_host['libdir']}
1229 summary_info += {'module directory': config_host['qemu_moddir']}
1230 summary_info += {'libexec directory': config_host['libexecdir']}
1231 summary_info += {'include directory': config_host['includedir']}
1232 summary_info += {'config directory': config_host['sysconfdir']}
1233 if targetos != 'windows'
1234 summary_info += {'local state directory': config_host['qemu_localstatedir']}
1235 summary_info += {'Manual directory': config_host['mandir']}
1237 summary_info += {'local state directory': 'queried at runtime'}
1239 summary_info += {'Build directory': meson.current_build_dir()}
1240 summary_info += {'Source path': meson.current_source_dir()}
1241 summary_info += {'GIT binary': config_host['GIT']}
1242 summary_info += {'GIT submodules': config_host['GIT_SUBMODULES']}
1243 summary_info += {'C compiler': meson.get_compiler('c').cmd_array()[0]}
1244 summary_info += {'Host C compiler': meson.get_compiler('c', native: true).cmd_array()[0]}
1245 if link_language == 'cpp'
1246 summary_info += {'C++ compiler': meson.get_compiler('cpp').cmd_array()[0]}
1248 summary_info += {'C++ compiler': false}
1250 if targetos == 'darwin'
1251 summary_info += {'Objective-C compiler': meson.get_compiler('objc').cmd_array()[0]}
1253 summary_info += {'ARFLAGS': config_host['ARFLAGS']}
1254 summary_info += {'CFLAGS': config_host['CFLAGS']}
1255 summary_info += {'QEMU_CFLAGS': config_host['QEMU_CFLAGS']}
1256 summary_info += {'QEMU_LDFLAGS': config_host['QEMU_LDFLAGS']}
1257 summary_info += {'make': config_host['MAKE']}
1258 summary_info += {'install': config_host['INSTALL']}
1259 summary_info += {'python': '@0@ (version: @1@)'.format(python.full_path(), python.language_version())}
1260 summary_info += {'sphinx-build': config_host['SPHINX_BUILD']}
1261 summary_info += {'genisoimage': config_host['GENISOIMAGE']}
1262 # TODO: add back version
1263 summary_info += {'slirp support': config_host.has_key('CONFIG_SLIRP')}
1264 if config_host.has_key('CONFIG_SLIRP')
1265 summary_info += {'smbd': config_host['CONFIG_SMBD_COMMAND']}
1267 summary_info += {'module support': config_host.has_key('CONFIG_MODULES')}
1268 if config_host.has_key('CONFIG_MODULES')
1269 summary_info += {'alternative module path': config_host.has_key('CONFIG_MODULE_UPGRADES')}
1271 summary_info += {'host CPU': cpu}
1272 summary_info += {'host endianness': build_machine.endian()}
1273 summary_info += {'target list': config_host['TARGET_DIRS']}
1274 summary_info += {'gprof enabled': config_host.has_key('CONFIG_GPROF')}
1275 summary_info += {'sparse enabled': meson.get_compiler('c').cmd_array().contains('cgcc')}
1276 summary_info += {'strip binaries': get_option('strip')}
1277 summary_info += {'profiler': config_host.has_key('CONFIG_PROFILER')}
1278 summary_info += {'static build': config_host.has_key('CONFIG_TOOLS')}
1279 if targetos == 'darwin'
1280 summary_info += {'Cocoa support': config_host.has_key('CONFIG_COCOA')}
1282 # TODO: add back version
1283 summary_info += {'SDL support': sdl.found()}
1284 summary_info += {'SDL image support': sdl_image.found()}
1285 # TODO: add back version
1286 summary_info += {'GTK support': config_host.has_key('CONFIG_GTK')}
1287 summary_info += {'GTK GL support': config_host.has_key('CONFIG_GTK_GL')}
1288 # TODO: add back version
1289 summary_info += {'VTE support': config_host.has_key('CONFIG_VTE')}
1290 summary_info += {'TLS priority': config_host['CONFIG_TLS_PRIORITY']}
1291 summary_info += {'GNUTLS support': config_host.has_key('CONFIG_GNUTLS')}
1292 # TODO: add back version
1293 summary_info += {'libgcrypt': config_host.has_key('CONFIG_GCRYPT')}
1294 if config_host.has_key('CONFIG_GCRYPT')
1295 summary_info += {' hmac': config_host.has_key('CONFIG_GCRYPT_HMAC')}
1296 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
1298 # TODO: add back version
1299 summary_info += {'nettle': config_host.has_key('CONFIG_NETTLE')}
1300 if config_host.has_key('CONFIG_NETTLE')
1301 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
1303 summary_info += {'libtasn1': config_host.has_key('CONFIG_TASN1')}
1304 summary_info += {'PAM': config_host.has_key('CONFIG_AUTH_PAM')}
1305 summary_info += {'iconv support': config_host.has_key('CONFIG_ICONV')}
1306 summary_info += {'curses support': config_host.has_key('CONFIG_CURSES')}
1307 # TODO: add back version
1308 summary_info += {'virgl support': config_host.has_key('CONFIG_VIRGL')}
1309 summary_info += {'curl support': config_host.has_key('CONFIG_CURL')}
1310 summary_info += {'mingw32 support': targetos == 'windows'}
1311 summary_info += {'Audio drivers': config_host['CONFIG_AUDIO_DRIVERS']}
1312 summary_info += {'Block whitelist (rw)': config_host['CONFIG_BDRV_RW_WHITELIST']}
1313 summary_info += {'Block whitelist (ro)': config_host['CONFIG_BDRV_RO_WHITELIST']}
1314 summary_info += {'VirtFS support': config_host.has_key('CONFIG_VIRTFS')}
1315 summary_info += {'Multipath support': config_host.has_key('CONFIG_MPATH')}
1316 summary_info += {'VNC support': vnc.found()}
1318 summary_info += {'VNC SASL support': sasl.found()}
1319 summary_info += {'VNC JPEG support': jpeg.found()}
1320 summary_info += {'VNC PNG support': png.found()}
1322 summary_info += {'xen support': config_host.has_key('CONFIG_XEN_BACKEND')}
1323 if config_host.has_key('CONFIG_XEN_BACKEND')
1324 summary_info += {'xen ctrl version': config_host['CONFIG_XEN_CTRL_INTERFACE_VERSION']}
1326 summary_info += {'brlapi support': config_host.has_key('CONFIG_BRLAPI')}
1327 summary_info += {'Documentation': config_host.has_key('BUILD_DOCS')}
1328 summary_info += {'PIE': get_option('b_pie')}
1329 summary_info += {'vde support': config_host.has_key('CONFIG_VDE')}
1330 summary_info += {'netmap support': config_host.has_key('CONFIG_NETMAP')}
1331 summary_info += {'Linux AIO support': config_host.has_key('CONFIG_LINUX_AIO')}
1332 summary_info += {'Linux io_uring support': config_host.has_key('CONFIG_LINUX_IO_URING')}
1333 summary_info += {'ATTR/XATTR support': config_host.has_key('CONFIG_ATTR')}
1334 summary_info += {'Install blobs': config_host.has_key('INSTALL_BLOBS')}
1335 # TODO: add back KVM/HAX/HVF/WHPX/TCG
1336 #summary_info += {'KVM support': have_kvm'}
1337 #summary_info += {'HAX support': have_hax'}
1338 #summary_info += {'HVF support': have_hvf'}
1339 #summary_info += {'WHPX support': have_whpx'}
1340 #summary_info += {'TCG support': have_tcg'}
1341 #if get_option('tcg')
1342 # summary_info += {'TCG debug enabled': config_host.has_key('CONFIG_DEBUG_TCG')}
1343 # summary_info += {'TCG interpreter': config_host.has_key('CONFIG_TCG_INTERPRETER')}
1345 summary_info += {'malloc trim support': config_host.has_key('CONFIG_MALLOC_TRIM')}
1346 summary_info += {'RDMA support': config_host.has_key('CONFIG_RDMA')}
1347 summary_info += {'PVRDMA support': config_host.has_key('CONFIG_PVRDMA')}
1348 summary_info += {'fdt support': config_host.has_key('CONFIG_FDT')}
1349 summary_info += {'membarrier': config_host.has_key('CONFIG_MEMBARRIER')}
1350 summary_info += {'preadv support': config_host.has_key('CONFIG_PREADV')}
1351 summary_info += {'fdatasync': config_host.has_key('CONFIG_FDATASYNC')}
1352 summary_info += {'madvise': config_host.has_key('CONFIG_MADVISE')}
1353 summary_info += {'posix_madvise': config_host.has_key('CONFIG_POSIX_MADVISE')}
1354 summary_info += {'posix_memalign': config_host.has_key('CONFIG_POSIX_MEMALIGN')}
1355 summary_info += {'libcap-ng support': config_host.has_key('CONFIG_LIBCAP_NG')}
1356 summary_info += {'vhost-net support': config_host.has_key('CONFIG_VHOST_NET')}
1357 summary_info += {'vhost-crypto support': config_host.has_key('CONFIG_VHOST_CRYPTO')}
1358 summary_info += {'vhost-scsi support': config_host.has_key('CONFIG_VHOST_SCSI')}
1359 summary_info += {'vhost-vsock support': config_host.has_key('CONFIG_VHOST_VSOCK')}
1360 summary_info += {'vhost-user support': config_host.has_key('CONFIG_VHOST_KERNEL')}
1361 summary_info += {'vhost-user-fs support': config_host.has_key('CONFIG_VHOST_USER_FS')}
1362 summary_info += {'vhost-vdpa support': config_host.has_key('CONFIG_VHOST_VDPA')}
1363 summary_info += {'Trace backends': config_host['TRACE_BACKENDS']}
1364 if config_host['TRACE_BACKENDS'].split().contains('simple')
1365 summary_info += {'Trace output file': config_host['CONFIG_TRACE_FILE'] + '-<pid>'}
1367 # TODO: add back protocol and server version
1368 summary_info += {'spice support': config_host.has_key('CONFIG_SPICE')}
1369 summary_info += {'rbd support': config_host.has_key('CONFIG_RBD')}
1370 summary_info += {'xfsctl support': config_host.has_key('CONFIG_XFS')}
1371 summary_info += {'smartcard support': config_host.has_key('CONFIG_SMARTCARD')}
1372 summary_info += {'libusb': config_host.has_key('CONFIG_USB_LIBUSB')}
1373 summary_info += {'usb net redir': config_host.has_key('CONFIG_USB_REDIR')}
1374 summary_info += {'OpenGL support': config_host.has_key('CONFIG_OPENGL')}
1375 summary_info += {'OpenGL dmabufs': config_host.has_key('CONFIG_OPENGL_DMABUF')}
1376 summary_info += {'libiscsi support': config_host.has_key('CONFIG_LIBISCSI')}
1377 summary_info += {'libnfs support': config_host.has_key('CONFIG_LIBNFS')}
1378 summary_info += {'build guest agent': config_host.has_key('CONFIG_GUEST_AGENT')}
1379 if targetos == 'windows'
1380 if 'WIN_SDK' in config_host
1381 summary_info += {'Windows SDK': config_host['WIN_SDK']}
1383 summary_info += {'QGA VSS support': config_host.has_key('CONFIG_QGA_VSS')}
1384 summary_info += {'QGA w32 disk info': config_host.has_key('CONFIG_QGA_NTDDSCSI')}
1385 summary_info += {'QGA MSI support': config_host.has_key('CONFIG_QGA_MSI_ENABLED')}
1387 summary_info += {'seccomp support': config_host.has_key('CONFIG_SECCOMP')}
1388 summary_info += {'coroutine backend': config_host['CONFIG_COROUTINE_BACKEND']}
1389 summary_info += {'coroutine pool': config_host['CONFIG_COROUTINE_POOL'] == '1'}
1390 summary_info += {'debug stack usage': config_host.has_key('CONFIG_DEBUG_STACK_USAGE')}
1391 summary_info += {'mutex debugging': config_host.has_key('CONFIG_DEBUG_MUTEX')}
1392 summary_info += {'crypto afalg': config_host.has_key('CONFIG_AF_ALG')}
1393 summary_info += {'GlusterFS support': config_host.has_key('CONFIG_GLUSTERFS')}
1394 summary_info += {'gcov': get_option('b_coverage')}
1395 summary_info += {'TPM support': config_host.has_key('CONFIG_TPM')}
1396 summary_info += {'libssh support': config_host.has_key('CONFIG_LIBSSH')}
1397 summary_info += {'QOM debugging': config_host.has_key('CONFIG_QOM_CAST_DEBUG')}
1398 summary_info += {'Live block migration': config_host.has_key('CONFIG_LIVE_BLOCK_MIGRATION')}
1399 summary_info += {'lzo support': config_host.has_key('CONFIG_LZO')}
1400 summary_info += {'snappy support': config_host.has_key('CONFIG_SNAPPY')}
1401 summary_info += {'bzip2 support': config_host.has_key('CONFIG_BZIP2')}
1402 summary_info += {'lzfse support': config_host.has_key('CONFIG_LZFSE')}
1403 summary_info += {'zstd support': config_host.has_key('CONFIG_ZSTD')}
1404 summary_info += {'NUMA host support': config_host.has_key('CONFIG_NUMA')}
1405 summary_info += {'libxml2': config_host.has_key('CONFIG_LIBXML2')}
1406 summary_info += {'tcmalloc support': config_host.has_key('CONFIG_TCMALLOC')}
1407 summary_info += {'jemalloc support': config_host.has_key('CONFIG_JEMALLOC')}
1408 summary_info += {'avx2 optimization': config_host.has_key('CONFIG_AVX2_OPT')}
1409 summary_info += {'avx512f optimization': config_host.has_key('CONFIG_AVX512F_OPT')}
1410 summary_info += {'replication support': config_host.has_key('CONFIG_REPLICATION')}
1411 summary_info += {'bochs support': config_host.has_key('CONFIG_BOCHS')}
1412 summary_info += {'cloop support': config_host.has_key('CONFIG_CLOOP')}
1413 summary_info += {'dmg support': config_host.has_key('CONFIG_DMG')}
1414 summary_info += {'qcow v1 support': config_host.has_key('CONFIG_QCOW1')}
1415 summary_info += {'vdi support': config_host.has_key('CONFIG_VDI')}
1416 summary_info += {'vvfat support': config_host.has_key('CONFIG_VVFAT')}
1417 summary_info += {'qed support': config_host.has_key('CONFIG_QED')}
1418 summary_info += {'parallels support': config_host.has_key('CONFIG_PARALLELS')}
1419 summary_info += {'sheepdog support': config_host.has_key('CONFIG_SHEEPDOG')}
1420 summary_info += {'capstone': config_host.has_key('CONFIG_CAPSTONE')}
1421 summary_info += {'libpmem support': config_host.has_key('CONFIG_LIBPMEM')}
1422 summary_info += {'libdaxctl support': config_host.has_key('CONFIG_LIBDAXCTL')}
1423 summary_info += {'libudev': config_host.has_key('CONFIG_LIBUDEV')}
1424 summary_info += {'default devices': config_host['CONFIG_MINIKCONF_MODE'] == '--defconfig'}
1425 summary_info += {'plugin support': config_host.has_key('CONFIG_PLUGIN')}
1426 summary_info += {'fuzzing support': config_host.has_key('CONFIG_FUZZ')}
1427 if config_host.has_key('HAVE_GDB_BIN')
1428 summary_info += {'gdb': config_host['HAVE_GDB_BIN']}
1430 summary_info += {'thread sanitizer': config_host.has_key('CONFIG_TSAN')}
1431 summary_info += {'rng-none': config_host.has_key('CONFIG_RNG_NONE')}
1432 summary_info += {'Linux keyring': config_host.has_key('CONFIG_SECRET_KEYRING')}
1433 summary(summary_info, bool_yn: true)
1435 if not supported_cpus.contains(cpu)
1437 warning('SUPPORT FOR THIS HOST CPU WILL GO AWAY IN FUTURE RELEASES!')
1439 message('CPU host architecture ' + cpu + ' support is not currently maintained.')
1440 message('The QEMU project intends to remove support for this host CPU in')
1441 message('a future release if nobody volunteers to maintain it and to')
1442 message('provide a build host for our continuous integration setup.')
1443 message('configure has succeeded and you can continue to build, but')
1444 message('if you care about QEMU on this platform you should contact')
1445 message('us upstream at qemu-devel@nongnu.org.')
1448 if not supported_oses.contains(targetos)
1450 warning('WARNING: SUPPORT FOR THIS HOST OS WILL GO AWAY IN FUTURE RELEASES!')
1452 message('Host OS ' + targetos + 'support is not currently maintained.')
1453 message('The QEMU project intends to remove support for this host OS in')
1454 message('a future release if nobody volunteers to maintain it and to')
1455 message('provide a build host for our continuous integration setup.')
1456 message('configure has succeeded and you can continue to build, but')
1457 message('if you care about QEMU on this platform you should contact')
1458 message('us upstream at qemu-devel@nongnu.org.')