1 project('qemu', ['c'], meson_version: '>=0.55.0',
2 default_options: ['warning_level=1', 'c_std=gnu99', 'cpp_std=gnu++11', 'b_lundef=false'],
3 version: run_command('head', meson.source_root() / 'VERSION').stdout().strip())
5 not_found = dependency('', required: false)
6 keyval = import('unstable-keyval')
7 ss = import('sourceset')
9 sh = find_program('sh')
10 cc = meson.get_compiler('c')
11 config_host = keyval.load(meson.current_build_dir() / 'config-host.mak')
12 config_all_disas = keyval.load(meson.current_build_dir() / 'config-all-disas.mak')
13 enable_modules = 'CONFIG_MODULES' in config_host
15 add_project_arguments(config_host['QEMU_CFLAGS'].split(),
16 native: false, language: ['c', 'objc'])
17 add_project_arguments(config_host['QEMU_CXXFLAGS'].split(),
18 native: false, language: 'cpp')
19 add_project_link_arguments(config_host['QEMU_LDFLAGS'].split(),
20 native: false, language: ['c', 'cpp', 'objc'])
21 add_project_arguments(config_host['QEMU_INCLUDES'].split(),
22 language: ['c', 'cpp', 'objc'])
24 python = import('python').find_installation()
26 link_language = meson.get_external_property('link_language', 'cpp')
27 if link_language == 'cpp'
28 add_languages('cpp', required: true, native: false)
30 if host_machine.system() == 'darwin'
31 add_languages('objc', required: false, native: false)
34 if 'SPARSE_CFLAGS' in config_host
36 command: [find_program('scripts/check_sparse.py'),
37 config_host['SPARSE_CFLAGS'].split(),
38 'compile_commands.json'])
41 configure_file(input: files('scripts/ninjatool.py'),
43 configuration: config_host)
45 supported_oses = ['windows', 'freebsd', 'netbsd', 'openbsd', 'darwin', 'sunos', 'linux']
46 supported_cpus = ['ppc', 'ppc64', 's390x', 'sparc64', 'riscv32', 'riscv64', 'x86', 'x86_64',
47 'arm', 'aarch64', 'mips', 'mips64', 'sparc', 'sparc64']
49 cpu = host_machine.cpu_family()
50 targetos = host_machine.system()
52 m = cc.find_library('m', required: false)
53 util = cc.find_library('util', required: false)
60 if targetos == 'windows'
61 socket = cc.find_library('ws2_32')
63 win = import('windows')
64 version_res = win.compile_resources('version.rc',
65 depend_files: files('pc-bios/qemu-nsis.ico'),
66 include_directories: include_directories('.'))
67 elif targetos == 'darwin'
68 coref = dependency('appleframeworks', modules: 'CoreFoundation')
69 iokit = dependency('appleframeworks', modules: 'IOKit')
70 cocoa = dependency('appleframeworks', modules: 'Cocoa')
71 hvf = dependency('appleframeworks', modules: 'Hypervisor')
72 elif targetos == 'sunos'
73 socket = [cc.find_library('socket'),
74 cc.find_library('nsl'),
75 cc.find_library('resolv')]
76 elif targetos == 'haiku'
77 socket = [cc.find_library('posix_error_mapper'),
78 cc.find_library('network'),
79 cc.find_library('bsd')]
81 glib = declare_dependency(compile_args: config_host['GLIB_CFLAGS'].split(),
82 link_args: config_host['GLIB_LIBS'].split())
84 if 'CONFIG_GIO' in config_host
85 gio = declare_dependency(compile_args: config_host['GIO_CFLAGS'].split(),
86 link_args: config_host['GIO_LIBS'].split())
89 if 'CONFIG_TRACE_UST' in config_host
90 lttng = declare_dependency(link_args: config_host['LTTNG_UST_LIBS'].split())
93 if 'CONFIG_TRACE_UST' in config_host
94 urcubp = declare_dependency(link_args: config_host['URCU_BP_LIBS'].split())
97 if 'CONFIG_NETTLE' in config_host
98 nettle = declare_dependency(compile_args: config_host['NETTLE_CFLAGS'].split(),
99 link_args: config_host['NETTLE_LIBS'].split())
102 if 'CONFIG_GNUTLS' in config_host
103 gnutls = declare_dependency(compile_args: config_host['GNUTLS_CFLAGS'].split(),
104 link_args: config_host['GNUTLS_LIBS'].split())
106 pixman = declare_dependency(compile_args: config_host['PIXMAN_CFLAGS'].split(),
107 link_args: config_host['PIXMAN_LIBS'].split())
109 if 'CONFIG_AUTH_PAM' in config_host
110 pam = cc.find_library('pam')
112 libaio = cc.find_library('aio', required: false)
114 if 'CONFIG_ZLIB' in config_host
115 zlib = declare_dependency(compile_args: config_host['ZLIB_CFLAGS'].split(),
116 link_args: config_host['ZLIB_LIBS'].split())
118 linux_io_uring = not_found
119 if 'CONFIG_LINUX_IO_URING' in config_host
120 linux_io_uring = declare_dependency(compile_args: config_host['LINUX_IO_URING_CFLAGS'].split(),
121 link_args: config_host['LINUX_IO_URING_LIBS'].split())
124 if 'CONFIG_LIBXML2' in config_host
125 libxml2 = declare_dependency(compile_args: config_host['LIBXML2_CFLAGS'].split(),
126 link_args: config_host['LIBXML2_LIBS'].split())
129 if 'CONFIG_LIBNFS' in config_host
130 libnfs = declare_dependency(link_args: config_host['LIBNFS_LIBS'].split())
133 if 'CONFIG_ATTR' in config_host
134 libattr = declare_dependency(link_args: config_host['LIBATTR_LIBS'].split())
137 if 'CONFIG_SECCOMP' in config_host
138 seccomp = declare_dependency(compile_args: config_host['SECCOMP_CFLAGS'].split(),
139 link_args: config_host['SECCOMP_LIBS'].split())
141 libcap_ng = not_found
142 if 'CONFIG_LIBCAP_NG' in config_host
143 libcap_ng = declare_dependency(link_args: config_host['LIBCAP_NG_LIBS'].split())
145 xkbcommon = not_found
146 if 'CONFIG_XKBCOMMON' in config_host
147 xkbcommon = declare_dependency(compile_args: config_host['XKBCOMMON_CFLAGS'].split(),
148 link_args: config_host['XKBCOMMON_LIBS'].split())
151 if 'CONFIG_LIBPULSE' in config_host
152 pulse = declare_dependency(compile_args: config_host['PULSE_CFLAGS'].split(),
153 link_args: config_host['PULSE_LIBS'].split())
156 if 'CONFIG_ALSA' in config_host
157 alsa = declare_dependency(compile_args: config_host['ALSA_CFLAGS'].split(),
158 link_args: config_host['ALSA_LIBS'].split())
161 if 'CONFIG_LIBJACK' in config_host
162 jack = declare_dependency(link_args: config_host['JACK_LIBS'].split())
165 if 'CONFIG_SPICE' in config_host
166 spice = declare_dependency(compile_args: config_host['SPICE_CFLAGS'].split(),
167 link_args: config_host['SPICE_LIBS'].split())
169 rt = cc.find_library('rt', required: false)
170 libmpathpersist = not_found
171 if config_host.has_key('CONFIG_MPATH')
172 libmpathpersist = cc.find_library('mpathpersist')
175 if 'CONFIG_LIBISCSI' in config_host
176 libiscsi = declare_dependency(compile_args: config_host['LIBISCSI_CFLAGS'].split(),
177 link_args: config_host['LIBISCSI_LIBS'].split())
180 if 'CONFIG_ZSTD' in config_host
181 zstd = declare_dependency(compile_args: config_host['ZSTD_CFLAGS'].split(),
182 link_args: config_host['ZSTD_LIBS'].split())
185 if 'CONFIG_GBM' in config_host
186 gbm = declare_dependency(compile_args: config_host['GBM_CFLAGS'].split(),
187 link_args: config_host['GBM_LIBS'].split())
190 if 'CONFIG_VIRGL' in config_host
191 virgl = declare_dependency(compile_args: config_host['VIRGL_CFLAGS'].split(),
192 link_args: config_host['VIRGL_LIBS'].split())
195 if 'CONFIG_CURL' in config_host
196 curl = declare_dependency(compile_args: config_host['CURL_CFLAGS'].split(),
197 link_args: config_host['CURL_LIBS'].split())
200 if 'CONFIG_LIBUDEV' in config_host
201 libudev = declare_dependency(link_args: config_host['LIBUDEV_LIBS'].split())
204 if 'CONFIG_BRLAPI' in config_host
205 brlapi = declare_dependency(link_args: config_host['BRLAPI_LIBS'].split())
208 if 'CONFIG_SDL' in config_host
209 sdl = declare_dependency(compile_args: config_host['SDL_CFLAGS'].split(),
210 link_args: config_host['SDL_LIBS'].split())
213 if 'CONFIG_RBD' in config_host
214 rbd = declare_dependency(link_args: config_host['RBD_LIBS'].split())
216 glusterfs = not_found
217 if 'CONFIG_GLUSTERFS' in config_host
218 glusterfs = declare_dependency(compile_args: config_host['GLUSTERFS_CFLAGS'].split(),
219 link_args: config_host['GLUSTERFS_LIBS'].split())
222 if 'CONFIG_LIBSSH' in config_host
223 libssh = declare_dependency(compile_args: config_host['LIBSSH_CFLAGS'].split(),
224 link_args: config_host['LIBSSH_LIBS'].split())
227 if 'CONFIG_BZIP2' in config_host
228 libbzip2 = declare_dependency(link_args: config_host['BZIP2_LIBS'].split())
231 if 'CONFIG_LZFSE' in config_host
232 liblzfse = declare_dependency(link_args: config_host['LZFSE_LIBS'].split())
235 if 'CONFIG_AUDIO_OSS' in config_host
236 oss = declare_dependency(link_args: config_host['OSS_LIBS'].split())
239 if 'CONFIG_AUDIO_DSOUND' in config_host
240 dsound = declare_dependency(link_args: config_host['DSOUND_LIBS'].split())
242 coreaudio = not_found
243 if 'CONFIG_AUDIO_COREAUDIO' in config_host
244 coreaudio = declare_dependency(link_args: config_host['COREAUDIO_LIBS'].split())
247 if 'CONFIG_OPENGL' in config_host
248 opengl = declare_dependency(link_args: config_host['OPENGL_LIBS'].split())
252 if 'CONFIG_GTK' in config_host
253 gtk = declare_dependency(compile_args: config_host['GTK_CFLAGS'].split(),
254 link_args: config_host['GTK_LIBS'].split())
257 if 'CONFIG_VTE' in config_host
258 vte = declare_dependency(compile_args: config_host['VTE_CFLAGS'].split(),
259 link_args: config_host['VTE_LIBS'].split())
262 if 'CONFIG_X11' in config_host
263 x11 = declare_dependency(compile_args: config_host['X11_CFLAGS'].split(),
264 link_args: config_host['X11_LIBS'].split())
267 if 'CONFIG_CURSES' in config_host
268 curses = declare_dependency(compile_args: config_host['CURSES_CFLAGS'].split(),
269 link_args: config_host['CURSES_LIBS'].split())
272 if 'CONFIG_ICONV' in config_host
273 iconv = declare_dependency(compile_args: config_host['ICONV_CFLAGS'].split(),
274 link_args: config_host['ICONV_LIBS'].split())
277 if 'CONFIG_GIO' in config_host
278 gio = declare_dependency(compile_args: config_host['GIO_CFLAGS'].split(),
279 link_args: config_host['GIO_LIBS'].split())
282 if 'CONFIG_VNC_PNG' in config_host
283 png = declare_dependency(compile_args: config_host['PNG_CFLAGS'].split(),
284 link_args: config_host['PNG_LIBS'].split())
287 if 'CONFIG_VNC_JPEG' in config_host
288 jpeg = declare_dependency(compile_args: config_host['JPEG_CFLAGS'].split(),
289 link_args: config_host['JPEG_LIBS'].split())
292 if 'CONFIG_VNC_SASL' in config_host
293 sasl = declare_dependency(compile_args: config_host['SASL_CFLAGS'].split(),
294 link_args: config_host['SASL_LIBS'].split())
297 create_config = find_program('scripts/create_config')
298 minikconf = find_program('scripts/minikconf.py')
299 target_dirs = config_host['TARGET_DIRS'].split()
302 config_devices_mak_list = []
303 config_devices_h = {}
304 config_target_mak = {}
305 kconfig_external_symbols = [
314 'CONFIG_VHOST_KERNEL',
319 foreach target : target_dirs
320 have_user = have_user or target.endswith('-user')
321 config_target = keyval.load(meson.current_build_dir() / target / 'config-target.mak') + config_host
323 if target.endswith('-softmmu')
327 foreach sym : kconfig_external_symbols
328 if sym in config_target
329 base_kconfig += '@0@=y'.format(sym)
333 config_devices_mak = target + '-config-devices.mak'
334 config_devices_mak = configure_file(
335 input: ['default-configs' / target + '.mak', 'Kconfig'],
336 output: config_devices_mak,
337 depfile: config_devices_mak + '.d',
339 command: [minikconf, config_host['CONFIG_MINIKCONF_MODE'],
340 config_devices_mak, '@DEPFILE@', '@INPUT@',
342 config_devices_h += {target: custom_target(
343 target + '-config-devices.h',
344 input: config_devices_mak,
345 output: target + '-config-devices.h',
347 command: [create_config, '@INPUT@'])}
348 config_devices_mak_list += config_devices_mak
349 config_target += keyval.load(config_devices_mak)
351 config_target_mak += {target: config_target}
353 have_tools = 'CONFIG_TOOLS' in config_host
354 have_block = have_system or have_tools
356 grepy = find_program('scripts/grepy.sh')
357 # This configuration is used to build files that are shared by
358 # multiple binaries, and then extracted out of the "common"
359 # static_library target.
361 # We do not use all_sources()/all_dependencies(), because it would
362 # build literally all source files, including devices only used by
363 # targets that are not built for this compilation. The CONFIG_ALL
364 # pseudo symbol replaces it.
367 config_all_devices_mak = configure_file(
368 output: 'config-all-devices.mak',
369 input: config_devices_mak_list,
371 command: [grepy, '@INPUT@'],
373 config_all_devices = keyval.load(config_all_devices_mak)
375 config_all_devices = {}
377 config_all = config_all_devices
378 config_all += config_host
379 config_all += config_all_disas
381 'CONFIG_XEN': config_host.has_key('CONFIG_XEN_BACKEND'),
382 'CONFIG_SOFTMMU': have_system,
383 'CONFIG_USER_ONLY': have_user,
390 hxtool = find_program('scripts/hxtool')
391 shaderinclude = find_program('scripts/shaderinclude.pl')
392 qapi_gen = find_program('scripts/qapi-gen.py')
393 qapi_gen_depends = [ meson.source_root() / 'scripts/qapi/__init__.py',
394 meson.source_root() / 'scripts/qapi/commands.py',
395 meson.source_root() / 'scripts/qapi/common.py',
396 meson.source_root() / 'scripts/qapi/doc.py',
397 meson.source_root() / 'scripts/qapi/error.py',
398 meson.source_root() / 'scripts/qapi/events.py',
399 meson.source_root() / 'scripts/qapi/expr.py',
400 meson.source_root() / 'scripts/qapi/gen.py',
401 meson.source_root() / 'scripts/qapi/introspect.py',
402 meson.source_root() / 'scripts/qapi/parser.py',
403 meson.source_root() / 'scripts/qapi/schema.py',
404 meson.source_root() / 'scripts/qapi/source.py',
405 meson.source_root() / 'scripts/qapi/types.py',
406 meson.source_root() / 'scripts/qapi/visit.py',
407 meson.source_root() / 'scripts/qapi/common.py',
408 meson.source_root() / 'scripts/qapi/doc.py',
409 meson.source_root() / 'scripts/qapi-gen.py'
413 python, files('scripts/tracetool.py'),
414 '--backend=' + config_host['TRACE_BACKENDS']
417 qemu_version_cmd = [find_program('scripts/qemu-version.sh'),
418 meson.current_source_dir(),
419 config_host['PKGVERSION'], config_host['VERSION']]
420 qemu_version = custom_target('qemu-version.h',
421 output: 'qemu-version.h',
422 command: qemu_version_cmd,
424 build_by_default: true,
425 build_always_stale: true)
428 config_host_h = custom_target('config-host.h',
429 input: meson.current_build_dir() / 'config-host.mak',
430 output: 'config-host.h',
432 command: [create_config, '@INPUT@'])
433 genh += config_host_h
437 ['qemu-options.hx', 'qemu-options.def'],
438 ['qemu-img-cmds.hx', 'qemu-img-cmds.h'],
442 ['hmp-commands.hx', 'hmp-commands.h'],
443 ['hmp-commands-info.hx', 'hmp-commands-info.h'],
446 foreach d : hx_headers
447 hxdep += custom_target(d[1],
451 build_by_default: true, # to be removed when added to a target
452 command: [hxtool, '-h', '@INPUT0@'])
456 # Collect sourcesets.
458 util_ss = ss.source_set()
459 stub_ss = ss.source_set()
460 trace_ss = ss.source_set()
461 block_ss = ss.source_set()
462 common_ss = ss.source_set()
463 softmmu_ss = ss.source_set()
464 user_ss = ss.source_set()
465 bsd_user_ss = ss.source_set()
466 linux_user_ss = ss.source_set()
467 specific_ss = ss.source_set()
472 target_softmmu_arch = {}
478 trace_events_subdirs = [
485 trace_events_subdirs += [ 'linux-user' ]
488 trace_events_subdirs += [
497 trace_events_subdirs += [
508 'hw/block/dataplane',
553 trace_events_subdirs += [
576 subdir('storage-daemon')
581 libmodulecommon = static_library('module-common', files('module-common.c') + genh, pic: true, c_args: '-DBUILD_DSO')
582 modulecommon = declare_dependency(link_whole: libmodulecommon, compile_args: '-DBUILD_DSO')
585 # Build targets from sourcesets
587 stub_ss = stub_ss.apply(config_all, strict: false)
589 util_ss.add_all(trace_ss)
590 util_ss = util_ss.apply(config_all, strict: false)
591 libqemuutil = static_library('qemuutil',
592 sources: util_ss.sources() + stub_ss.sources() + genh,
593 dependencies: [util_ss.dependencies(), m, glib, socket])
594 qemuutil = declare_dependency(link_with: libqemuutil,
595 sources: genh + version_res)
609 block_ss.add(when: 'CONFIG_REPLICATION', if_true: files('replication.c'))
615 # needed for fuzzing binaries
616 subdir('tests/qtest/libqos')
620 foreach d, list : modules
621 foreach m, module_ss : list
622 if enable_modules and targetos != 'windows'
623 module_ss = module_ss.apply(config_host, strict: false)
624 sl = static_library(d + '-' + m, [genh, module_ss.sources()],
625 dependencies: [modulecommon, module_ss.dependencies()], pic: true)
633 block_ss.add_all(module_ss)
635 softmmu_ss.add_all(module_ss)
641 nm = find_program('nm')
642 undefsym = find_program('scripts/undefsym.sh')
643 block_syms = custom_target('block.syms', output: 'block.syms',
644 input: [libqemuutil, block_mods],
646 command: [undefsym, nm, '@INPUT@'])
647 qemu_syms = custom_target('qemu.syms', output: 'qemu.syms',
648 input: [libqemuutil, softmmu_mods],
650 command: [undefsym, nm, '@INPUT@'])
652 block_ss = block_ss.apply(config_host, strict: false)
653 libblock = static_library('block', block_ss.sources() + genh,
654 dependencies: block_ss.dependencies(),
655 link_depends: block_syms,
657 build_by_default: false)
659 block = declare_dependency(link_whole: [libblock],
660 link_args: '@block.syms',
661 dependencies: [crypto, io])
663 foreach m : block_mods + softmmu_mods
664 shared_module(m.name(),
668 install_dir: config_host['qemu_moddir'])
671 common_ss.add_all(when: 'CONFIG_SOFTMMU', if_true: softmmu_ss)
672 common_ss.add_all(when: 'CONFIG_USER_ONLY', if_true: user_ss)
674 common_all = common_ss.apply(config_all, strict: false)
675 common_all = static_library('common',
676 build_by_default: false,
677 sources: common_all.sources() + genh,
678 dependencies: common_all.dependencies(),
681 foreach target : target_dirs
682 config_target = config_target_mak[target]
683 target_name = config_target['TARGET_NAME']
684 arch = config_target['TARGET_BASE_ARCH']
687 target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
688 if targetos == 'linux'
689 target_inc += include_directories('linux-headers', is_system: true)
691 if target.endswith('-softmmu')
692 qemu_target_name = 'qemu-system-' + target_name
694 arch_srcs += config_devices_h[target]
697 qemu_target_name = 'qemu-' + target_name
698 if 'CONFIG_LINUX_USER' in config_target
699 base_dir = 'linux-user'
700 target_inc += include_directories('linux-user/host/' / config_host['ARCH'])
702 base_dir = 'bsd-user'
704 target_inc += include_directories(
706 base_dir / config_target['TARGET_ABI_DIR'],
710 target_common = common_ss.apply(config_target, strict: false)
711 objects = common_all.extract_objects(target_common.sources())
713 # TODO: Change to generator once obj-y goes away
714 config_target_h = custom_target(target + '-config-target.h',
715 input: meson.current_build_dir() / target / 'config-target.mak',
716 output: target + '-config-target.h',
718 command: [create_config, '@INPUT@'])
720 target_specific = specific_ss.apply(config_target, strict: false)
721 arch_srcs += target_specific.sources()
723 static_library('qemu-' + target,
724 sources: arch_srcs + [config_target_h] + genh,
726 include_directories: target_inc,
727 c_args: ['-DNEED_CPU_H',
728 '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
729 '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)],
733 # Other build targets
735 if 'CONFIG_GUEST_AGENT' in config_host
740 qemu_img = executable('qemu-img', [files('qemu-img.c'), hxdep],
741 dependencies: [authz, block, crypto, io, qom, qemuutil], install: true)
742 qemu_io = executable('qemu-io', files('qemu-io.c'),
743 dependencies: [block, qemuutil], install: true)
744 if targetos == 'linux' or targetos == 'sunos' or targetos.endswith('bsd')
745 qemu_nbd = executable('qemu-nbd', files('qemu-nbd.c'),
746 dependencies: [block, qemuutil], install: true)
749 subdir('contrib/rdmacm-mux')
750 subdir('contrib/elf2dmp')
752 if 'CONFIG_XKBCOMMON' in config_host
753 executable('qemu-keymap', files('qemu-keymap.c', 'ui/input-keymap.c'),
754 dependencies: [qemuutil, xkbcommon], install: true)
757 executable('qemu-edid', files('qemu-edid.c', 'hw/display/edid-generate.c'),
758 dependencies: qemuutil,
761 if 'CONFIG_VHOST_USER' in config_host
762 subdir('contrib/libvhost-user')
763 subdir('contrib/vhost-user-blk')
764 if 'CONFIG_LINUX' in config_host
765 subdir('contrib/vhost-user-gpu')
767 subdir('contrib/vhost-user-input')
768 subdir('contrib/vhost-user-scsi')
771 if targetos == 'linux'
772 executable('qemu-bridge-helper', files('qemu-bridge-helper.c'),
773 dependencies: [qemuutil, libcap_ng],
775 install_dir: get_option('libexecdir'))
777 executable('qemu-pr-helper', files('scsi/qemu-pr-helper.c', 'scsi/utils.c'),
778 dependencies: [authz, crypto, io, qom, qemuutil,
779 libcap_ng, libudev, libmpathpersist],
783 if 'CONFIG_IVSHMEM' in config_host
784 subdir('contrib/ivshmem-client')
785 subdir('contrib/ivshmem-server')
794 summary_info += {'Install prefix': config_host['prefix']}
795 summary_info += {'BIOS directory': config_host['qemu_datadir']}
796 summary_info += {'firmware path': config_host['qemu_firmwarepath']}
797 summary_info += {'binary directory': config_host['bindir']}
798 summary_info += {'library directory': config_host['libdir']}
799 summary_info += {'module directory': config_host['qemu_moddir']}
800 summary_info += {'libexec directory': config_host['libexecdir']}
801 summary_info += {'include directory': config_host['includedir']}
802 summary_info += {'config directory': config_host['sysconfdir']}
803 if targetos != 'windows'
804 summary_info += {'local state directory': config_host['qemu_localstatedir']}
805 summary_info += {'Manual directory': config_host['mandir']}
807 summary_info += {'local state directory': 'queried at runtime'}
809 summary_info += {'Build directory': meson.current_build_dir()}
810 summary_info += {'Source path': meson.current_source_dir()}
811 summary_info += {'GIT binary': config_host['GIT']}
812 summary_info += {'GIT submodules': config_host['GIT_SUBMODULES']}
813 summary_info += {'C compiler': meson.get_compiler('c').cmd_array()[0]}
814 summary_info += {'Host C compiler': meson.get_compiler('c', native: true).cmd_array()[0]}
815 if link_language == 'cpp'
816 summary_info += {'C++ compiler': meson.get_compiler('cpp').cmd_array()[0]}
818 summary_info += {'C++ compiler': false}
820 if targetos == 'darwin'
821 summary_info += {'Objective-C compiler': meson.get_compiler('objc').cmd_array()[0]}
823 summary_info += {'ARFLAGS': config_host['ARFLAGS']}
824 summary_info += {'CFLAGS': config_host['CFLAGS']}
825 summary_info += {'QEMU_CFLAGS': config_host['QEMU_CFLAGS']}
826 summary_info += {'QEMU_LDFLAGS': config_host['QEMU_LDFLAGS']}
827 summary_info += {'make': config_host['MAKE']}
828 summary_info += {'install': config_host['INSTALL']}
829 summary_info += {'python': '@0@ (version: @1@)'.format(python.full_path(), python.language_version())}
830 summary_info += {'sphinx-build': config_host['SPHINX_BUILD']}
831 summary_info += {'genisoimage': config_host['GENISOIMAGE']}
832 # TODO: add back version
833 summary_info += {'slirp support': config_host.has_key('CONFIG_SLIRP')}
834 if config_host.has_key('CONFIG_SLIRP')
835 summary_info += {'smbd': config_host['CONFIG_SMBD_COMMAND']}
837 summary_info += {'module support': config_host.has_key('CONFIG_MODULES')}
838 if config_host.has_key('CONFIG_MODULES')
839 summary_info += {'alternative module path': config_host.has_key('CONFIG_MODULE_UPGRADES')}
841 summary_info += {'host CPU': cpu}
842 summary_info += {'host endianness': build_machine.endian()}
843 summary_info += {'target list': config_host['TARGET_DIRS']}
844 summary_info += {'gprof enabled': config_host.has_key('CONFIG_GPROF')}
845 summary_info += {'sparse enabled': meson.get_compiler('c').cmd_array().contains('cgcc')}
846 summary_info += {'strip binaries': get_option('strip')}
847 summary_info += {'profiler': config_host.has_key('CONFIG_PROFILER')}
848 summary_info += {'static build': config_host.has_key('CONFIG_TOOLS')}
849 if targetos == 'darwin'
850 summary_info += {'Cocoa support': config_host.has_key('CONFIG_COCOA')}
852 # TODO: add back version
853 summary_info += {'SDL support': config_host.has_key('CONFIG_SDL')}
854 summary_info += {'SDL image support': config_host.has_key('CONFIG_SDL_IMAGE')}
855 # TODO: add back version
856 summary_info += {'GTK support': config_host.has_key('CONFIG_GTK')}
857 summary_info += {'GTK GL support': config_host.has_key('CONFIG_GTK_GL')}
858 # TODO: add back version
859 summary_info += {'VTE support': config_host.has_key('CONFIG_VTE')}
860 summary_info += {'TLS priority': config_host['CONFIG_TLS_PRIORITY']}
861 summary_info += {'GNUTLS support': config_host.has_key('CONFIG_GNUTLS')}
862 # TODO: add back version
863 summary_info += {'libgcrypt': config_host.has_key('CONFIG_GCRYPT')}
864 if config_host.has_key('CONFIG_GCRYPT')
865 summary_info += {' hmac': config_host.has_key('CONFIG_GCRYPT_HMAC')}
866 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
868 # TODO: add back version
869 summary_info += {'nettle': config_host.has_key('CONFIG_NETTLE')}
870 if config_host.has_key('CONFIG_NETTLE')
871 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
873 summary_info += {'libtasn1': config_host.has_key('CONFIG_TASN1')}
874 summary_info += {'PAM': config_host.has_key('CONFIG_AUTH_PAM')}
875 summary_info += {'iconv support': config_host.has_key('CONFIG_ICONV')}
876 summary_info += {'curses support': config_host.has_key('CONFIG_CURSES')}
877 # TODO: add back version
878 summary_info += {'virgl support': config_host.has_key('CONFIG_VIRGL')}
879 summary_info += {'curl support': config_host.has_key('CONFIG_CURL')}
880 summary_info += {'mingw32 support': targetos == 'windows'}
881 summary_info += {'Audio drivers': config_host['CONFIG_AUDIO_DRIVERS']}
882 summary_info += {'Block whitelist (rw)': config_host['CONFIG_BDRV_RW_WHITELIST']}
883 summary_info += {'Block whitelist (ro)': config_host['CONFIG_BDRV_RO_WHITELIST']}
884 summary_info += {'VirtFS support': config_host.has_key('CONFIG_VIRTFS')}
885 summary_info += {'Multipath support': config_host.has_key('CONFIG_MPATH')}
886 summary_info += {'VNC support': config_host.has_key('CONFIG_VNC')}
887 if config_host.has_key('CONFIG_VNC')
888 summary_info += {'VNC SASL support': config_host.has_key('CONFIG_VNC_SASL')}
889 summary_info += {'VNC JPEG support': config_host.has_key('CONFIG_VNC_JPEG')}
890 summary_info += {'VNC PNG support': config_host.has_key('CONFIG_VNC_PNG')}
892 summary_info += {'xen support': config_host.has_key('CONFIG_XEN_BACKEND')}
893 if config_host.has_key('CONFIG_XEN_BACKEND')
894 summary_info += {'xen ctrl version': config_host['CONFIG_XEN_CTRL_INTERFACE_VERSION']}
896 summary_info += {'brlapi support': config_host.has_key('CONFIG_BRLAPI')}
897 summary_info += {'Documentation': config_host.has_key('BUILD_DOCS')}
898 summary_info += {'PIE': get_option('b_pie')}
899 summary_info += {'vde support': config_host.has_key('CONFIG_VDE')}
900 summary_info += {'netmap support': config_host.has_key('CONFIG_NETMAP')}
901 summary_info += {'Linux AIO support': config_host.has_key('CONFIG_LINUX_AIO')}
902 summary_info += {'Linux io_uring support': config_host.has_key('CONFIG_LINUX_IO_URING')}
903 summary_info += {'ATTR/XATTR support': config_host.has_key('CONFIG_ATTR')}
904 summary_info += {'Install blobs': config_host.has_key('INSTALL_BLOBS')}
905 # TODO: add back KVM/HAX/HVF/WHPX/TCG
906 #summary_info += {'KVM support': have_kvm'}
907 #summary_info += {'HAX support': have_hax'}
908 #summary_info += {'HVF support': have_hvf'}
909 #summary_info += {'WHPX support': have_whpx'}
910 #summary_info += {'TCG support': have_tcg'}
911 #if get_option('tcg')
912 # summary_info += {'TCG debug enabled': config_host.has_key('CONFIG_DEBUG_TCG')}
913 # summary_info += {'TCG interpreter': config_host.has_key('CONFIG_TCG_INTERPRETER')}
915 summary_info += {'malloc trim support': config_host.has_key('CONFIG_MALLOC_TRIM')}
916 summary_info += {'RDMA support': config_host.has_key('CONFIG_RDMA')}
917 summary_info += {'PVRDMA support': config_host.has_key('CONFIG_PVRDMA')}
918 summary_info += {'fdt support': config_host.has_key('CONFIG_FDT')}
919 summary_info += {'membarrier': config_host.has_key('CONFIG_MEMBARRIER')}
920 summary_info += {'preadv support': config_host.has_key('CONFIG_PREADV')}
921 summary_info += {'fdatasync': config_host.has_key('CONFIG_FDATASYNC')}
922 summary_info += {'madvise': config_host.has_key('CONFIG_MADVISE')}
923 summary_info += {'posix_madvise': config_host.has_key('CONFIG_POSIX_MADVISE')}
924 summary_info += {'posix_memalign': config_host.has_key('CONFIG_POSIX_MEMALIGN')}
925 summary_info += {'libcap-ng support': config_host.has_key('CONFIG_LIBCAP_NG')}
926 summary_info += {'vhost-net support': config_host.has_key('CONFIG_VHOST_NET')}
927 summary_info += {'vhost-crypto support': config_host.has_key('CONFIG_VHOST_CRYPTO')}
928 summary_info += {'vhost-scsi support': config_host.has_key('CONFIG_VHOST_SCSI')}
929 summary_info += {'vhost-vsock support': config_host.has_key('CONFIG_VHOST_VSOCK')}
930 summary_info += {'vhost-user support': config_host.has_key('CONFIG_VHOST_KERNEL')}
931 summary_info += {'vhost-user-fs support': config_host.has_key('CONFIG_VHOST_USER_FS')}
932 summary_info += {'vhost-vdpa support': config_host.has_key('CONFIG_VHOST_VDPA')}
933 summary_info += {'Trace backends': config_host['TRACE_BACKENDS']}
934 if config_host['TRACE_BACKENDS'].split().contains('simple')
935 summary_info += {'Trace output file': config_host['CONFIG_TRACE_FILE'] + '-<pid>'}
937 # TODO: add back protocol and server version
938 summary_info += {'spice support': config_host.has_key('CONFIG_SPICE')}
939 summary_info += {'rbd support': config_host.has_key('CONFIG_RBD')}
940 summary_info += {'xfsctl support': config_host.has_key('CONFIG_XFS')}
941 summary_info += {'smartcard support': config_host.has_key('CONFIG_SMARTCARD')}
942 summary_info += {'libusb': config_host.has_key('CONFIG_USB_LIBUSB')}
943 summary_info += {'usb net redir': config_host.has_key('CONFIG_USB_REDIR')}
944 summary_info += {'OpenGL support': config_host.has_key('CONFIG_OPENGL')}
945 summary_info += {'OpenGL dmabufs': config_host.has_key('CONFIG_OPENGL_DMABUF')}
946 summary_info += {'libiscsi support': config_host.has_key('CONFIG_LIBISCSI')}
947 summary_info += {'libnfs support': config_host.has_key('CONFIG_LIBNFS')}
948 summary_info += {'build guest agent': config_host.has_key('CONFIG_GUEST_AGENT')}
949 if targetos == 'windows'
950 if 'WIN_SDK' in config_host
951 summary_info += {'Windows SDK': config_host['WIN_SDK']}
953 summary_info += {'QGA VSS support': config_host.has_key('CONFIG_QGA_VSS')}
954 summary_info += {'QGA w32 disk info': config_host.has_key('CONFIG_QGA_NTDDSCSI')}
955 summary_info += {'QGA MSI support': config_host.has_key('CONFIG_QGA_MSI_ENABLED')}
957 summary_info += {'seccomp support': config_host.has_key('CONFIG_SECCOMP')}
958 summary_info += {'coroutine backend': config_host['CONFIG_COROUTINE_BACKEND']}
959 summary_info += {'coroutine pool': config_host['CONFIG_COROUTINE_POOL'] == '1'}
960 summary_info += {'debug stack usage': config_host.has_key('CONFIG_DEBUG_STACK_USAGE')}
961 summary_info += {'mutex debugging': config_host.has_key('CONFIG_DEBUG_MUTEX')}
962 summary_info += {'crypto afalg': config_host.has_key('CONFIG_AF_ALG')}
963 summary_info += {'GlusterFS support': config_host.has_key('CONFIG_GLUSTERFS')}
964 summary_info += {'gcov': get_option('b_coverage')}
965 summary_info += {'TPM support': config_host.has_key('CONFIG_TPM')}
966 summary_info += {'libssh support': config_host.has_key('CONFIG_LIBSSH')}
967 summary_info += {'QOM debugging': config_host.has_key('CONFIG_QOM_CAST_DEBUG')}
968 summary_info += {'Live block migration': config_host.has_key('CONFIG_LIVE_BLOCK_MIGRATION')}
969 summary_info += {'lzo support': config_host.has_key('CONFIG_LZO')}
970 summary_info += {'snappy support': config_host.has_key('CONFIG_SNAPPY')}
971 summary_info += {'bzip2 support': config_host.has_key('CONFIG_BZIP2')}
972 summary_info += {'lzfse support': config_host.has_key('CONFIG_LZFSE')}
973 summary_info += {'zstd support': config_host.has_key('CONFIG_ZSTD')}
974 summary_info += {'NUMA host support': config_host.has_key('CONFIG_NUMA')}
975 summary_info += {'libxml2': config_host.has_key('CONFIG_LIBXML2')}
976 summary_info += {'tcmalloc support': config_host.has_key('CONFIG_TCMALLOC')}
977 summary_info += {'jemalloc support': config_host.has_key('CONFIG_JEMALLOC')}
978 summary_info += {'avx2 optimization': config_host.has_key('CONFIG_AVX2_OPT')}
979 summary_info += {'avx512f optimization': config_host.has_key('CONFIG_AVX512F_OPT')}
980 summary_info += {'replication support': config_host.has_key('CONFIG_REPLICATION')}
981 summary_info += {'bochs support': config_host.has_key('CONFIG_BOCHS')}
982 summary_info += {'cloop support': config_host.has_key('CONFIG_CLOOP')}
983 summary_info += {'dmg support': config_host.has_key('CONFIG_DMG')}
984 summary_info += {'qcow v1 support': config_host.has_key('CONFIG_QCOW1')}
985 summary_info += {'vdi support': config_host.has_key('CONFIG_VDI')}
986 summary_info += {'vvfat support': config_host.has_key('CONFIG_VVFAT')}
987 summary_info += {'qed support': config_host.has_key('CONFIG_QED')}
988 summary_info += {'parallels support': config_host.has_key('CONFIG_PARALLELS')}
989 summary_info += {'sheepdog support': config_host.has_key('CONFIG_SHEEPDOG')}
990 summary_info += {'capstone': config_host.has_key('CONFIG_CAPSTONE')}
991 summary_info += {'libpmem support': config_host.has_key('CONFIG_LIBPMEM')}
992 summary_info += {'libdaxctl support': config_host.has_key('CONFIG_LIBDAXCTL')}
993 summary_info += {'libudev': config_host.has_key('CONFIG_LIBUDEV')}
994 summary_info += {'default devices': config_host['CONFIG_MINIKCONF_MODE'] == '--defconfig'}
995 summary_info += {'plugin support': config_host.has_key('CONFIG_PLUGIN')}
996 summary_info += {'fuzzing support': config_host.has_key('CONFIG_FUZZ')}
997 if config_host.has_key('HAVE_GDB_BIN')
998 summary_info += {'gdb': config_host['HAVE_GDB_BIN']}
1000 summary_info += {'thread sanitizer': config_host.has_key('CONFIG_TSAN')}
1001 summary_info += {'rng-none': config_host.has_key('CONFIG_RNG_NONE')}
1002 summary_info += {'Linux keyring': config_host.has_key('CONFIG_SECRET_KEYRING')}
1003 summary(summary_info, bool_yn: true)
1005 if not supported_cpus.contains(cpu)
1007 warning('SUPPORT FOR THIS HOST CPU WILL GO AWAY IN FUTURE RELEASES!')
1009 message('CPU host architecture ' + cpu + ' support is not currently maintained.')
1010 message('The QEMU project intends to remove support for this host CPU in')
1011 message('a future release if nobody volunteers to maintain it and to')
1012 message('provide a build host for our continuous integration setup.')
1013 message('configure has succeeded and you can continue to build, but')
1014 message('if you care about QEMU on this platform you should contact')
1015 message('us upstream at qemu-devel@nongnu.org.')
1018 if not supported_oses.contains(targetos)
1020 warning('WARNING: SUPPORT FOR THIS HOST OS WILL GO AWAY IN FUTURE RELEASES!')
1022 message('Host OS ' + targetos + 'support is not currently maintained.')
1023 message('The QEMU project intends to remove support for this host OS in')
1024 message('a future release if nobody volunteers to maintain it and to')
1025 message('provide a build host for our continuous integration setup.')
1026 message('configure has succeeded and you can continue to build, but')
1027 message('if you care about QEMU on this platform you should contact')
1028 message('us upstream at qemu-devel@nongnu.org.')