1 project('qemu', ['c'], meson_version: '>=0.55.0',
2 default_options: ['warning_level=1', 'c_std=gnu99', 'cpp_std=gnu++11',
4 version: run_command('head', meson.source_root() / 'VERSION').stdout().strip())
6 not_found = dependency('', required: false)
7 if meson.version().version_compare('>=0.56.0')
8 keyval = import('keyval')
10 keyval = import('unstable-keyval')
12 ss = import('sourceset')
14 sh = find_program('sh')
15 cc = meson.get_compiler('c')
16 config_host = keyval.load(meson.current_build_dir() / 'config-host.mak')
17 enable_modules = 'CONFIG_MODULES' in config_host
18 enable_static = 'CONFIG_STATIC' in config_host
19 build_docs = 'BUILD_DOCS' in config_host
20 qemu_datadir = get_option('datadir') / get_option('qemu_suffix')
21 qemu_docdir = get_option('docdir') / get_option('qemu_suffix')
22 config_host_data = configuration_data()
25 target_dirs = config_host['TARGET_DIRS'].split()
28 foreach target : target_dirs
29 have_user = have_user or target.endswith('-user')
30 have_system = have_system or target.endswith('-softmmu')
32 have_tools = 'CONFIG_TOOLS' in config_host
33 have_block = have_system or have_tools
35 python = import('python').find_installation()
37 supported_oses = ['windows', 'freebsd', 'netbsd', 'openbsd', 'darwin', 'sunos', 'linux']
38 supported_cpus = ['ppc', 'ppc64', 's390x', 'sparc64', 'riscv32', 'riscv64', 'x86', 'x86_64',
39 'arm', 'aarch64', 'mips', 'mips64', 'sparc', 'sparc64']
41 cpu = host_machine.cpu_family()
42 targetos = host_machine.system()
44 configure_file(input: files('scripts/ninjatool.py'),
46 configuration: config_host)
52 add_project_arguments(config_host['QEMU_CFLAGS'].split(),
53 native: false, language: ['c', 'objc'])
54 add_project_arguments(config_host['QEMU_CXXFLAGS'].split(),
55 native: false, language: 'cpp')
56 add_project_link_arguments(config_host['QEMU_LDFLAGS'].split(),
57 native: false, language: ['c', 'cpp', 'objc'])
58 add_project_arguments(config_host['QEMU_INCLUDES'].split(),
59 language: ['c', 'cpp', 'objc'])
61 # Specify linker-script with add_project_link_arguments so that it is not placed
62 # within a linker --start-group/--end-group pair
63 if 'CONFIG_FUZZ' in config_host
64 add_project_link_arguments(['-Wl,-T,',
65 (meson.current_source_dir() / 'tests/qtest/fuzz/fork_fuzz.ld')],
66 native: false, language: ['c', 'cpp', 'objc'])
69 link_language = meson.get_external_property('link_language', 'cpp')
70 if link_language == 'cpp'
71 add_languages('cpp', required: true, native: false)
73 if host_machine.system() == 'darwin'
74 add_languages('objc', required: false, native: false)
77 if 'SPARSE_CFLAGS' in config_host
79 command: [find_program('scripts/check_sparse.py'),
80 config_host['SPARSE_CFLAGS'].split(),
81 'compile_commands.json'])
84 m = cc.find_library('m', required: false)
85 util = cc.find_library('util', required: false)
93 if targetos == 'windows'
94 socket = cc.find_library('ws2_32')
95 winmm = cc.find_library('winmm')
97 win = import('windows')
98 version_res = win.compile_resources('version.rc',
99 depend_files: files('pc-bios/qemu-nsis.ico'),
100 include_directories: include_directories('.'))
101 elif targetos == 'darwin'
102 coref = dependency('appleframeworks', modules: 'CoreFoundation')
103 iokit = dependency('appleframeworks', modules: 'IOKit')
104 cocoa = dependency('appleframeworks', modules: 'Cocoa')
105 hvf = dependency('appleframeworks', modules: 'Hypervisor')
106 elif targetos == 'sunos'
107 socket = [cc.find_library('socket'),
108 cc.find_library('nsl'),
109 cc.find_library('resolv')]
110 elif targetos == 'haiku'
111 socket = [cc.find_library('posix_error_mapper'),
112 cc.find_library('network'),
113 cc.find_library('bsd')]
115 # The path to glib.h is added to all compilation commands. This was
116 # grandfathered in from the QEMU Makefiles.
117 add_project_arguments(config_host['GLIB_CFLAGS'].split(),
118 native: false, language: ['c', 'cpp', 'objc'])
119 glib = declare_dependency(link_args: config_host['GLIB_LIBS'].split())
121 if 'CONFIG_GIO' in config_host
122 gio = declare_dependency(compile_args: config_host['GIO_CFLAGS'].split(),
123 link_args: config_host['GIO_LIBS'].split())
126 if 'CONFIG_TRACE_UST' in config_host
127 lttng = declare_dependency(link_args: config_host['LTTNG_UST_LIBS'].split())
130 if 'CONFIG_TRACE_UST' in config_host
131 urcubp = declare_dependency(link_args: config_host['URCU_BP_LIBS'].split())
134 if 'CONFIG_GCRYPT' in config_host
135 gcrypt = declare_dependency(compile_args: config_host['GCRYPT_CFLAGS'].split(),
136 link_args: config_host['GCRYPT_LIBS'].split())
139 if 'CONFIG_NETTLE' in config_host
140 nettle = declare_dependency(compile_args: config_host['NETTLE_CFLAGS'].split(),
141 link_args: config_host['NETTLE_LIBS'].split())
144 if 'CONFIG_GNUTLS' in config_host
145 gnutls = declare_dependency(compile_args: config_host['GNUTLS_CFLAGS'].split(),
146 link_args: config_host['GNUTLS_LIBS'].split())
149 if have_system or have_tools
150 pixman = dependency('pixman-1', required: have_system, version:'>=0.21.8',
151 method: 'pkg-config', static: enable_static)
154 if 'CONFIG_AUTH_PAM' in config_host
155 pam = cc.find_library('pam')
157 libaio = cc.find_library('aio', required: false)
158 zlib = dependency('zlib', required: true, static: enable_static)
159 linux_io_uring = not_found
160 if 'CONFIG_LINUX_IO_URING' in config_host
161 linux_io_uring = declare_dependency(compile_args: config_host['LINUX_IO_URING_CFLAGS'].split(),
162 link_args: config_host['LINUX_IO_URING_LIBS'].split())
165 if 'CONFIG_LIBXML2' in config_host
166 libxml2 = declare_dependency(compile_args: config_host['LIBXML2_CFLAGS'].split(),
167 link_args: config_host['LIBXML2_LIBS'].split())
170 if 'CONFIG_LIBNFS' in config_host
171 libnfs = declare_dependency(link_args: config_host['LIBNFS_LIBS'].split())
174 if 'CONFIG_ATTR' in config_host
175 libattr = declare_dependency(link_args: config_host['LIBATTR_LIBS'].split())
178 if 'CONFIG_SECCOMP' in config_host
179 seccomp = declare_dependency(compile_args: config_host['SECCOMP_CFLAGS'].split(),
180 link_args: config_host['SECCOMP_LIBS'].split())
182 libcap_ng = not_found
183 if 'CONFIG_LIBCAP_NG' in config_host
184 libcap_ng = declare_dependency(link_args: config_host['LIBCAP_NG_LIBS'].split())
186 if get_option('xkbcommon').auto() and not have_system and not have_tools
187 xkbcommon = not_found
189 xkbcommon = dependency('xkbcommon', required: get_option('xkbcommon'),
190 method: 'pkg-config', static: enable_static)
193 if config_host.has_key('CONFIG_SLIRP')
194 slirp = declare_dependency(compile_args: config_host['SLIRP_CFLAGS'].split(),
195 link_args: config_host['SLIRP_LIBS'].split())
198 if config_host.has_key('CONFIG_VDE')
199 vde = declare_dependency(link_args: config_host['VDE_LIBS'].split())
202 if 'CONFIG_LIBPULSE' in config_host
203 pulse = declare_dependency(compile_args: config_host['PULSE_CFLAGS'].split(),
204 link_args: config_host['PULSE_LIBS'].split())
207 if 'CONFIG_ALSA' in config_host
208 alsa = declare_dependency(compile_args: config_host['ALSA_CFLAGS'].split(),
209 link_args: config_host['ALSA_LIBS'].split())
212 if 'CONFIG_LIBJACK' in config_host
213 jack = declare_dependency(link_args: config_host['JACK_LIBS'].split())
216 if 'CONFIG_SPICE' in config_host
217 spice = declare_dependency(compile_args: config_host['SPICE_CFLAGS'].split(),
218 link_args: config_host['SPICE_LIBS'].split())
220 rt = cc.find_library('rt', required: false)
221 libmpathpersist = not_found
222 if config_host.has_key('CONFIG_MPATH')
223 libmpathpersist = cc.find_library('mpathpersist')
226 if 'CONFIG_PLUGIN' in config_host
227 libdl = cc.find_library('dl', required: true)
230 if 'CONFIG_LIBISCSI' in config_host
231 libiscsi = declare_dependency(compile_args: config_host['LIBISCSI_CFLAGS'].split(),
232 link_args: config_host['LIBISCSI_LIBS'].split())
235 if 'CONFIG_ZSTD' in config_host
236 zstd = declare_dependency(compile_args: config_host['ZSTD_CFLAGS'].split(),
237 link_args: config_host['ZSTD_LIBS'].split())
240 if 'CONFIG_GBM' in config_host
241 gbm = declare_dependency(compile_args: config_host['GBM_CFLAGS'].split(),
242 link_args: config_host['GBM_LIBS'].split())
245 if 'CONFIG_VIRGL' in config_host
246 virgl = declare_dependency(compile_args: config_host['VIRGL_CFLAGS'].split(),
247 link_args: config_host['VIRGL_LIBS'].split())
250 if 'CONFIG_CURL' in config_host
251 curl = declare_dependency(compile_args: config_host['CURL_CFLAGS'].split(),
252 link_args: config_host['CURL_LIBS'].split())
255 if 'CONFIG_LIBUDEV' in config_host
256 libudev = declare_dependency(link_args: config_host['LIBUDEV_LIBS'].split())
259 if 'CONFIG_BRLAPI' in config_host
260 brlapi = declare_dependency(link_args: config_host['BRLAPI_LIBS'].split())
265 sdl = dependency('sdl2', required: get_option('sdl'), static: enable_static)
266 sdl_image = not_found
269 # work around 2.0.8 bug
270 sdl = declare_dependency(compile_args: '-Wno-undef',
272 sdl_image = dependency('SDL2_image', required: get_option('sdl_image'),
273 method: 'pkg-config', static: enable_static)
275 if get_option('sdl_image').enabled()
276 error('sdl-image required, but SDL was @0@'.format(
277 get_option('sdl').disabled() ? 'disabled' : 'not found'))
279 sdl_image = not_found
283 if 'CONFIG_RBD' in config_host
284 rbd = declare_dependency(link_args: config_host['RBD_LIBS'].split())
286 glusterfs = not_found
287 if 'CONFIG_GLUSTERFS' in config_host
288 glusterfs = declare_dependency(compile_args: config_host['GLUSTERFS_CFLAGS'].split(),
289 link_args: config_host['GLUSTERFS_LIBS'].split())
292 if 'CONFIG_LIBSSH' in config_host
293 libssh = declare_dependency(compile_args: config_host['LIBSSH_CFLAGS'].split(),
294 link_args: config_host['LIBSSH_LIBS'].split())
297 if 'CONFIG_BZIP2' in config_host
298 libbzip2 = declare_dependency(link_args: config_host['BZIP2_LIBS'].split())
301 if 'CONFIG_LZFSE' in config_host
302 liblzfse = declare_dependency(link_args: config_host['LZFSE_LIBS'].split())
305 if 'CONFIG_AUDIO_OSS' in config_host
306 oss = declare_dependency(link_args: config_host['OSS_LIBS'].split())
309 if 'CONFIG_AUDIO_DSOUND' in config_host
310 dsound = declare_dependency(link_args: config_host['DSOUND_LIBS'].split())
312 coreaudio = not_found
313 if 'CONFIG_AUDIO_COREAUDIO' in config_host
314 coreaudio = declare_dependency(link_args: config_host['COREAUDIO_LIBS'].split())
317 if 'CONFIG_OPENGL' in config_host
318 opengl = declare_dependency(compile_args: config_host['OPENGL_CFLAGS'].split(),
319 link_args: config_host['OPENGL_LIBS'].split())
322 if 'CONFIG_GTK' in config_host
323 gtk = declare_dependency(compile_args: config_host['GTK_CFLAGS'].split(),
324 link_args: config_host['GTK_LIBS'].split())
327 if 'CONFIG_VTE' in config_host
328 vte = declare_dependency(compile_args: config_host['VTE_CFLAGS'].split(),
329 link_args: config_host['VTE_LIBS'].split())
332 if 'CONFIG_X11' in config_host
333 x11 = declare_dependency(compile_args: config_host['X11_CFLAGS'].split(),
334 link_args: config_host['X11_LIBS'].split())
337 if 'CONFIG_CURSES' in config_host
338 curses = declare_dependency(compile_args: config_host['CURSES_CFLAGS'].split(),
339 link_args: config_host['CURSES_LIBS'].split())
342 if 'CONFIG_ICONV' in config_host
343 iconv = declare_dependency(compile_args: config_host['ICONV_CFLAGS'].split(),
344 link_args: config_host['ICONV_LIBS'].split())
350 if get_option('vnc').enabled()
351 vnc = declare_dependency() # dummy dependency
352 png = dependency('libpng', required: get_option('vnc_png'),
353 method: 'pkg-config', static: enable_static)
354 jpeg = cc.find_library('jpeg', has_headers: ['jpeglib.h'],
355 required: get_option('vnc_jpeg'),
356 static: enable_static)
357 sasl = cc.find_library('sasl2', has_headers: ['sasl/sasl.h'],
358 required: get_option('vnc_sasl'),
359 static: enable_static)
361 sasl = declare_dependency(dependencies: sasl,
362 compile_args: '-DSTRUCT_IOVEC_DEFINED')
366 if 'CONFIG_FDT' in config_host
367 fdt = declare_dependency(compile_args: config_host['FDT_CFLAGS'].split(),
368 link_args: config_host['FDT_LIBS'].split())
371 if 'CONFIG_SNAPPY' in config_host
372 snappy = declare_dependency(link_args: config_host['SNAPPY_LIBS'].split())
375 if 'CONFIG_LZO' in config_host
376 lzo = declare_dependency(link_args: config_host['LZO_LIBS'].split())
379 if 'CONFIG_RDMA' in config_host
380 rdma = declare_dependency(link_args: config_host['RDMA_LIBS'].split())
383 if 'CONFIG_NUMA' in config_host
384 numa = declare_dependency(link_args: config_host['NUMA_LIBS'].split())
387 if 'CONFIG_XEN_BACKEND' in config_host
388 xen = declare_dependency(compile_args: config_host['XEN_CFLAGS'].split(),
389 link_args: config_host['XEN_LIBS'].split())
392 if 'CONFIG_SMARTCARD' in config_host
393 cacard = declare_dependency(compile_args: config_host['SMARTCARD_CFLAGS'].split(),
394 link_args: config_host['SMARTCARD_LIBS'].split())
398 u2f = dependency('u2f-emu', required: get_option('u2f'),
399 method: 'pkg-config',
400 static: enable_static)
403 if 'CONFIG_USB_REDIR' in config_host
404 usbredir = declare_dependency(compile_args: config_host['USB_REDIR_CFLAGS'].split(),
405 link_args: config_host['USB_REDIR_LIBS'].split())
408 if 'CONFIG_USB_LIBUSB' in config_host
409 libusb = declare_dependency(compile_args: config_host['LIBUSB_CFLAGS'].split(),
410 link_args: config_host['LIBUSB_LIBS'].split())
413 if 'CONFIG_CAPSTONE' in config_host
414 capstone = declare_dependency(compile_args: config_host['CAPSTONE_CFLAGS'].split(),
415 link_args: config_host['CAPSTONE_LIBS'].split())
418 if 'CONFIG_LIBPMEM' in config_host
419 libpmem = declare_dependency(compile_args: config_host['LIBPMEM_CFLAGS'].split(),
420 link_args: config_host['LIBPMEM_LIBS'].split())
422 libdaxctl = not_found
423 if 'CONFIG_LIBDAXCTL' in config_host
424 libdaxctl = declare_dependency(link_args: config_host['LIBDAXCTL_LIBS'].split())
427 if 'CONFIG_TASN1' in config_host
428 tasn1 = declare_dependency(compile_args: config_host['TASN1_CFLAGS'].split(),
429 link_args: config_host['TASN1_LIBS'].split())
431 keyutils = dependency('libkeyutils', required: false,
432 method: 'pkg-config', static: enable_static)
434 has_gettid = cc.has_function('gettid')
436 # Create config-host.h
438 config_host_data.set('CONFIG_SDL', sdl.found())
439 config_host_data.set('CONFIG_SDL_IMAGE', sdl_image.found())
440 config_host_data.set('CONFIG_VNC', vnc.found())
441 config_host_data.set('CONFIG_VNC_JPEG', jpeg.found())
442 config_host_data.set('CONFIG_VNC_PNG', png.found())
443 config_host_data.set('CONFIG_VNC_SASL', sasl.found())
444 config_host_data.set('CONFIG_XKBCOMMON', xkbcommon.found())
445 config_host_data.set('CONFIG_KEYUTILS', keyutils.found())
446 config_host_data.set('CONFIG_GETTID', has_gettid)
447 config_host_data.set('QEMU_VERSION', '"@0@"'.format(meson.project_version()))
448 config_host_data.set('QEMU_VERSION_MAJOR', meson.project_version().split('.')[0])
449 config_host_data.set('QEMU_VERSION_MINOR', meson.project_version().split('.')[1])
450 config_host_data.set('QEMU_VERSION_MICRO', meson.project_version().split('.')[2])
452 arrays = ['CONFIG_AUDIO_DRIVERS', 'CONFIG_BDRV_RW_WHITELIST', 'CONFIG_BDRV_RO_WHITELIST']
453 strings = ['HOST_DSOSUF', 'CONFIG_IASL', 'qemu_confdir', 'qemu_datadir',
454 'qemu_moddir', 'qemu_localstatedir', 'qemu_helperdir', 'qemu_localedir',
455 'qemu_icondir', 'qemu_desktopdir', 'qemu_firmwarepath']
456 foreach k, v: config_host
457 if arrays.contains(k)
459 v = '"' + '", "'.join(v.split()) + '", '
461 config_host_data.set(k, v)
463 config_host_data.set('HOST_' + v.to_upper(), 1)
464 elif strings.contains(k)
465 if not k.startswith('CONFIG_')
466 k = 'CONFIG_' + k.to_upper()
468 config_host_data.set_quoted(k, v)
469 elif k.startswith('CONFIG_') or k.startswith('HAVE_') or k.startswith('HOST_')
470 config_host_data.set(k, v == 'y' ? 1 : v)
473 genh += configure_file(output: 'config-host.h', configuration: config_host_data)
475 minikconf = find_program('scripts/minikconf.py')
476 config_all_devices = {}
477 config_all_disas = {}
478 config_devices_mak_list = []
479 config_devices_h = {}
481 config_target_mak = {}
484 'alpha' : ['CONFIG_ALPHA_DIS'],
485 'arm' : ['CONFIG_ARM_DIS'],
486 'avr' : ['CONFIG_AVR_DIS'],
487 'cris' : ['CONFIG_CRIS_DIS'],
488 'hppa' : ['CONFIG_HPPA_DIS'],
489 'i386' : ['CONFIG_I386_DIS'],
490 'x86_64' : ['CONFIG_I386_DIS'],
491 'x32' : ['CONFIG_I386_DIS'],
492 'lm32' : ['CONFIG_LM32_DIS'],
493 'm68k' : ['CONFIG_M68K_DIS'],
494 'microblaze' : ['CONFIG_MICROBLAZE_DIS'],
495 'mips' : ['CONFIG_MIPS_DIS'],
496 'moxie' : ['CONFIG_MOXIE_DIS'],
497 'nios2' : ['CONFIG_NIOS2_DIS'],
498 'or1k' : ['CONFIG_OPENRISC_DIS'],
499 'ppc' : ['CONFIG_PPC_DIS'],
500 'riscv' : ['CONFIG_RISCV_DIS'],
501 'rx' : ['CONFIG_RX_DIS'],
502 's390' : ['CONFIG_S390_DIS'],
503 'sh4' : ['CONFIG_SH4_DIS'],
504 'sparc' : ['CONFIG_SPARC_DIS'],
505 'xtensa' : ['CONFIG_XTENSA_DIS'],
507 if link_language == 'cpp'
509 'aarch64' : [ 'CONFIG_ARM_A64_DIS'],
510 'arm' : [ 'CONFIG_ARM_DIS', 'CONFIG_ARM_A64_DIS'],
511 'mips' : [ 'CONFIG_MIPS_DIS', 'CONFIG_NANOMIPS_DIS'],
515 kconfig_external_symbols = [
525 'CONFIG_VHOST_KERNEL',
530 ignored = ['TARGET_XML_FILES', 'TARGET_ABI_DIR', 'TARGET_DIRS']
532 foreach target : target_dirs
533 config_target = keyval.load(meson.current_build_dir() / target / 'config-target.mak')
535 foreach k, v: disassemblers
536 if config_host['ARCH'].startswith(k) or config_target['TARGET_BASE_ARCH'].startswith(k)
538 config_target += { sym: 'y' }
539 config_all_disas += { sym: 'y' }
544 config_target_data = configuration_data()
545 foreach k, v: config_target
546 if not k.startswith('TARGET_') and not k.startswith('CONFIG_')
548 elif ignored.contains(k)
550 elif k == 'TARGET_BASE_ARCH'
551 config_target_data.set('TARGET_' + v.to_upper(), 1)
552 elif k == 'TARGET_NAME'
553 config_target_data.set_quoted(k, v)
555 config_target_data.set(k, 1)
557 config_target_data.set(k, v)
560 config_target_h += {target: configure_file(output: target + '-config-target.h',
561 configuration: config_target_data)}
563 if target.endswith('-softmmu')
565 foreach sym : kconfig_external_symbols
566 if sym in config_target or sym in config_host
567 base_kconfig += '@0@=y'.format(sym)
571 config_devices_mak = target + '-config-devices.mak'
572 config_devices_mak = configure_file(
573 input: ['default-configs' / target + '.mak', 'Kconfig'],
574 output: config_devices_mak,
575 depfile: config_devices_mak + '.d',
577 command: [minikconf, config_host['CONFIG_MINIKCONF_MODE'],
578 config_devices_mak, '@DEPFILE@', '@INPUT@',
581 config_devices_data = configuration_data()
582 config_devices = keyval.load(config_devices_mak)
583 foreach k, v: config_devices
584 config_devices_data.set(k, 1)
586 config_devices_mak_list += config_devices_mak
587 config_devices_h += {target: configure_file(output: target + '-config-devices.h',
588 configuration: config_devices_data)}
589 config_target += config_devices
590 config_all_devices += config_devices
592 config_target_mak += {target: config_target}
595 # This configuration is used to build files that are shared by
596 # multiple binaries, and then extracted out of the "common"
597 # static_library target.
599 # We do not use all_sources()/all_dependencies(), because it would
600 # build literally all source files, including devices only used by
601 # targets that are not built for this compilation. The CONFIG_ALL
602 # pseudo symbol replaces it.
604 config_all = config_all_devices
605 config_all += config_host
606 config_all += config_all_disas
608 'CONFIG_XEN': config_host.has_key('CONFIG_XEN_BACKEND'),
609 'CONFIG_SOFTMMU': have_system,
610 'CONFIG_USER_ONLY': have_user,
616 hxtool = find_program('scripts/hxtool')
617 shaderinclude = find_program('scripts/shaderinclude.pl')
618 qapi_gen = find_program('scripts/qapi-gen.py')
619 qapi_gen_depends = [ meson.source_root() / 'scripts/qapi/__init__.py',
620 meson.source_root() / 'scripts/qapi/commands.py',
621 meson.source_root() / 'scripts/qapi/common.py',
622 meson.source_root() / 'scripts/qapi/error.py',
623 meson.source_root() / 'scripts/qapi/events.py',
624 meson.source_root() / 'scripts/qapi/expr.py',
625 meson.source_root() / 'scripts/qapi/gen.py',
626 meson.source_root() / 'scripts/qapi/introspect.py',
627 meson.source_root() / 'scripts/qapi/parser.py',
628 meson.source_root() / 'scripts/qapi/schema.py',
629 meson.source_root() / 'scripts/qapi/source.py',
630 meson.source_root() / 'scripts/qapi/types.py',
631 meson.source_root() / 'scripts/qapi/visit.py',
632 meson.source_root() / 'scripts/qapi/common.py',
633 meson.source_root() / 'scripts/qapi-gen.py'
637 python, files('scripts/tracetool.py'),
638 '--backend=' + config_host['TRACE_BACKENDS']
641 qemu_version_cmd = [find_program('scripts/qemu-version.sh'),
642 meson.current_source_dir(),
643 config_host['PKGVERSION'], meson.project_version()]
644 qemu_version = custom_target('qemu-version.h',
645 output: 'qemu-version.h',
646 command: qemu_version_cmd,
648 build_by_default: true,
649 build_always_stale: true)
654 ['qemu-options.hx', 'qemu-options.def'],
655 ['qemu-img-cmds.hx', 'qemu-img-cmds.h'],
659 ['hmp-commands.hx', 'hmp-commands.h'],
660 ['hmp-commands-info.hx', 'hmp-commands-info.h'],
663 foreach d : hx_headers
664 hxdep += custom_target(d[1],
668 build_by_default: true, # to be removed when added to a target
669 command: [hxtool, '-h', '@INPUT0@'])
673 SPHINX_ARGS = [config_host['SPHINX_BUILD'],
674 '-Dversion=' + meson.project_version(),
675 '-Drelease=' + config_host['PKGVERSION']]
677 if get_option('werror')
678 SPHINX_ARGS += [ '-W' ]
681 sphinx_extn_depends = [ meson.source_root() / 'docs/sphinx/depfile.py',
682 meson.source_root() / 'docs/sphinx/hxtool.py',
683 meson.source_root() / 'docs/sphinx/kerneldoc.py',
684 meson.source_root() / 'docs/sphinx/kernellog.py',
685 meson.source_root() / 'docs/sphinx/qapidoc.py',
686 meson.source_root() / 'docs/sphinx/qmp_lexer.py',
689 # Collect sourcesets.
691 util_ss = ss.source_set()
692 stub_ss = ss.source_set()
693 trace_ss = ss.source_set()
694 block_ss = ss.source_set()
695 blockdev_ss = ss.source_set()
696 qmp_ss = ss.source_set()
697 common_ss = ss.source_set()
698 softmmu_ss = ss.source_set()
699 user_ss = ss.source_set()
700 bsd_user_ss = ss.source_set()
701 linux_user_ss = ss.source_set()
702 specific_ss = ss.source_set()
703 specific_fuzz_ss = ss.source_set()
708 target_softmmu_arch = {}
714 # TODO: add each directory to the subdirs from its own meson.build, once
716 trace_events_subdirs = [
723 trace_events_subdirs += [ 'linux-user' ]
726 trace_events_subdirs += [
735 trace_events_subdirs += [
746 'hw/block/dataplane',
791 trace_events_subdirs += [
818 libmodulecommon = static_library('module-common', files('module-common.c') + genh, pic: true, c_args: '-DBUILD_DSO')
819 modulecommon = declare_dependency(link_whole: libmodulecommon, compile_args: '-DBUILD_DSO')
822 # Build targets from sourcesets
824 stub_ss = stub_ss.apply(config_all, strict: false)
826 util_ss.add_all(trace_ss)
827 util_ss = util_ss.apply(config_all, strict: false)
828 libqemuutil = static_library('qemuutil',
829 sources: util_ss.sources() + stub_ss.sources() + genh,
830 dependencies: [util_ss.dependencies(), m, glib, socket])
831 qemuutil = declare_dependency(link_with: libqemuutil,
832 sources: genh + version_res)
834 decodetree = generator(find_program('scripts/decodetree.py'),
835 output: 'decode-@BASENAME@.c.inc',
836 arguments: ['@INPUT@', '@EXTRA_ARGS@', '-o', '@OUTPUT@'])
842 subdir('libdecnumber')
852 block_ss.add(when: 'CONFIG_REPLICATION', if_true: files('replication.c'))
858 blockdev_ss.add(files(
865 # os-posix.c contains POSIX-specific functions used by qemu-storage-daemon,
866 # os-win32.c does not
867 blockdev_ss.add(when: 'CONFIG_POSIX', if_true: files('os-posix.c'))
868 softmmu_ss.add(when: 'CONFIG_WIN32', if_true: [files('os-win32.c')])
870 softmmu_ss.add_all(blockdev_ss)
871 softmmu_ss.add(files(
877 softmmu_ss.add(when: 'CONFIG_TPM', if_true: files('tpm.c'))
878 softmmu_ss.add(when: 'CONFIG_SECCOMP', if_true: [files('qemu-seccomp.c'), seccomp])
879 softmmu_ss.add(when: ['CONFIG_FDT', fdt], if_true: [files('device_tree.c')])
881 common_ss.add(files('cpus-common.c'))
885 specific_ss.add(files('disas.c', 'exec.c', 'gdbstub.c'), capstone, libpmem, libdaxctl)
886 specific_ss.add(files('exec-vary.c'))
887 specific_ss.add(when: 'CONFIG_TCG', if_true: files(
896 specific_ss.add(when: 'CONFIG_TCG_INTERPRETER', if_true: files('disas/tci.c', 'tcg/tci.c'))
910 bsd_user_ss.add(files('gdbstub.c'))
911 specific_ss.add_all(when: 'CONFIG_BSD_USER', if_true: bsd_user_ss)
913 linux_user_ss.add(files('gdbstub.c', 'thunk.c'))
914 specific_ss.add_all(when: 'CONFIG_LINUX_USER', if_true: linux_user_ss)
916 # needed for fuzzing binaries
917 subdir('tests/qtest/libqos')
918 subdir('tests/qtest/fuzz')
922 foreach d, list : modules
923 foreach m, module_ss : list
924 if enable_modules and targetos != 'windows'
925 module_ss = module_ss.apply(config_all, strict: false)
926 sl = static_library(d + '-' + m, [genh, module_ss.sources()],
927 dependencies: [modulecommon, module_ss.dependencies()], pic: true)
935 block_ss.add_all(module_ss)
937 softmmu_ss.add_all(module_ss)
943 nm = find_program('nm')
944 undefsym = find_program('scripts/undefsym.py')
945 block_syms = custom_target('block.syms', output: 'block.syms',
946 input: [libqemuutil, block_mods],
948 command: [undefsym, nm, '@INPUT@'])
949 qemu_syms = custom_target('qemu.syms', output: 'qemu.syms',
950 input: [libqemuutil, softmmu_mods],
952 command: [undefsym, nm, '@INPUT@'])
954 block_ss = block_ss.apply(config_host, strict: false)
955 libblock = static_library('block', block_ss.sources() + genh,
956 dependencies: block_ss.dependencies(),
957 link_depends: block_syms,
959 build_by_default: false)
961 block = declare_dependency(link_whole: [libblock],
962 link_args: '@block.syms',
963 dependencies: [crypto, io])
965 qmp_ss = qmp_ss.apply(config_host, strict: false)
966 libqmp = static_library('qmp', qmp_ss.sources() + genh,
967 dependencies: qmp_ss.dependencies(),
969 build_by_default: false)
971 qmp = declare_dependency(link_whole: [libqmp])
973 foreach m : block_mods + softmmu_mods
974 shared_module(m.name(),
978 install_dir: config_host['qemu_moddir'])
981 softmmu_ss.add(authz, block, chardev, crypto, io, qmp)
982 common_ss.add(qom, qemuutil)
984 common_ss.add_all(when: 'CONFIG_SOFTMMU', if_true: [softmmu_ss])
985 common_ss.add_all(when: 'CONFIG_USER_ONLY', if_true: user_ss)
987 common_all = common_ss.apply(config_all, strict: false)
988 common_all = static_library('common',
989 build_by_default: false,
990 sources: common_all.sources() + genh,
991 dependencies: common_all.dependencies(),
994 feature_to_c = find_program('scripts/feature_to_c.sh')
997 foreach target : target_dirs
998 config_target = config_target_mak[target]
999 target_name = config_target['TARGET_NAME']
1000 arch = config_target['TARGET_BASE_ARCH']
1001 arch_srcs = [config_target_h[target]]
1003 c_args = ['-DNEED_CPU_H',
1004 '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
1005 '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)]
1008 config_target += config_host
1009 target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
1010 if targetos == 'linux'
1011 target_inc += include_directories('linux-headers', is_system: true)
1013 if target.endswith('-softmmu')
1014 qemu_target_name = 'qemu-system-' + target_name
1015 target_type='system'
1016 t = target_softmmu_arch[arch].apply(config_target, strict: false)
1017 arch_srcs += t.sources()
1018 arch_deps += t.dependencies()
1020 hw_dir = target_name == 'sparc64' ? 'sparc64' : arch
1021 hw = hw_arch[hw_dir].apply(config_target, strict: false)
1022 arch_srcs += hw.sources()
1023 arch_deps += hw.dependencies()
1025 arch_srcs += config_devices_h[target]
1026 link_args += ['@block.syms', '@qemu.syms']
1028 abi = config_target['TARGET_ABI_DIR']
1030 qemu_target_name = 'qemu-' + target_name
1031 if 'CONFIG_LINUX_USER' in config_target
1032 base_dir = 'linux-user'
1033 target_inc += include_directories('linux-user/host/' / config_host['ARCH'])
1035 base_dir = 'bsd-user'
1037 target_inc += include_directories(
1041 if 'CONFIG_LINUX_USER' in config_target
1042 dir = base_dir / abi
1043 arch_srcs += files(dir / 'signal.c', dir / 'cpu_loop.c')
1044 if config_target.has_key('TARGET_SYSTBL_ABI')
1046 syscall_nr_generators[abi].process(base_dir / abi / config_target['TARGET_SYSTBL'],
1047 extra_args : config_target['TARGET_SYSTBL_ABI'])
1052 if 'TARGET_XML_FILES' in config_target
1053 gdbstub_xml = custom_target(target + '-gdbstub-xml.c',
1054 output: target + '-gdbstub-xml.c',
1055 input: files(config_target['TARGET_XML_FILES'].split()),
1056 command: [feature_to_c, '@INPUT@'],
1058 arch_srcs += gdbstub_xml
1061 t = target_arch[arch].apply(config_target, strict: false)
1062 arch_srcs += t.sources()
1063 arch_deps += t.dependencies()
1065 target_common = common_ss.apply(config_target, strict: false)
1066 objects = common_all.extract_objects(target_common.sources())
1067 deps = target_common.dependencies()
1069 target_specific = specific_ss.apply(config_target, strict: false)
1070 arch_srcs += target_specific.sources()
1071 arch_deps += target_specific.dependencies()
1073 lib = static_library('qemu-' + target,
1074 sources: arch_srcs + genh,
1075 dependencies: arch_deps,
1077 include_directories: target_inc,
1079 build_by_default: false,
1082 if target.endswith('-softmmu')
1084 'name': 'qemu-system-' + target_name,
1086 'sources': files('softmmu/main.c'),
1089 if targetos == 'windows' and (sdl.found() or gtk.found())
1091 'name': 'qemu-system-' + target_name + 'w',
1093 'sources': files('softmmu/main.c'),
1097 if config_host.has_key('CONFIG_FUZZ')
1098 specific_fuzz = specific_fuzz_ss.apply(config_target, strict: false)
1100 'name': 'qemu-fuzz-' + target_name,
1102 'sources': specific_fuzz.sources(),
1103 'dependencies': specific_fuzz.dependencies(),
1108 'name': 'qemu-' + target_name,
1115 emulators += executable(exe['name'], exe['sources'],
1118 dependencies: arch_deps + deps + exe['dependencies'],
1119 objects: lib.extract_all_objects(recursive: true),
1120 link_language: link_language,
1121 link_depends: [block_syms, qemu_syms] + exe.get('link_depends', []),
1122 link_args: link_args,
1123 gui_app: exe['gui'])
1125 if 'CONFIG_TRACE_SYSTEMTAP' in config_host
1127 {'ext': '.stp-build', 'fmt': 'stap', 'bin': meson.current_build_dir() / exe['name'], 'install': false},
1128 {'ext': '.stp', 'fmt': 'stap', 'bin': get_option('prefix') / get_option('bindir') / exe['name'], 'install': true},
1129 {'ext': '-simpletrace.stp', 'fmt': 'simpletrace-stap', 'bin': '', 'install': true},
1130 {'ext': '-log.stp', 'fmt': 'log-stap', 'bin': '', 'install': true},
1132 custom_target(exe['name'] + stp['ext'],
1133 input: trace_events_all,
1134 output: exe['name'] + stp['ext'],
1136 install: stp['install'],
1137 install_dir: qemu_datadir / '../systemtap/tapset',
1139 tracetool, '--group=all', '--format=' + stp['fmt'],
1140 '--binary=' + stp['bin'],
1141 '--target-name=' + target_name,
1142 '--target-type=' + target_type,
1143 '--probe-prefix=qemu.' + target_type + '.' + target_name,
1151 # Other build targets
1153 if 'CONFIG_PLUGIN' in config_host
1154 install_headers('include/qemu/qemu-plugin.h')
1157 if 'CONFIG_GUEST_AGENT' in config_host
1161 # Don't build qemu-keymap if xkbcommon is not explicitly enabled
1162 # when we don't build tools or system
1163 if xkbcommon.found()
1164 # used for the update-keymaps target, so include rules even if !have_tools
1165 qemu_keymap = executable('qemu-keymap', files('qemu-keymap.c', 'ui/input-keymap.c') + genh,
1166 dependencies: [qemuutil, xkbcommon], install: have_tools)
1169 qemu_block_tools = []
1171 qemu_img = executable('qemu-img', [files('qemu-img.c'), hxdep],
1172 dependencies: [authz, block, crypto, io, qom, qemuutil], install: true)
1173 qemu_io = executable('qemu-io', files('qemu-io.c'),
1174 dependencies: [block, qemuutil], install: true)
1175 qemu_nbd = executable('qemu-nbd', files('qemu-nbd.c'),
1176 dependencies: [block, qemuutil], install: true)
1178 subdir('storage-daemon')
1179 subdir('contrib/rdmacm-mux')
1180 subdir('contrib/elf2dmp')
1182 executable('qemu-edid', files('qemu-edid.c', 'hw/display/edid-generate.c'),
1183 dependencies: qemuutil,
1186 if 'CONFIG_VHOST_USER' in config_host
1187 subdir('contrib/libvhost-user')
1188 subdir('contrib/vhost-user-blk')
1189 subdir('contrib/vhost-user-gpu')
1190 subdir('contrib/vhost-user-input')
1191 subdir('contrib/vhost-user-scsi')
1194 if targetos == 'linux'
1195 executable('qemu-bridge-helper', files('qemu-bridge-helper.c'),
1196 dependencies: [qemuutil, libcap_ng],
1198 install_dir: get_option('libexecdir'))
1200 executable('qemu-pr-helper', files('scsi/qemu-pr-helper.c', 'scsi/utils.c'),
1201 dependencies: [authz, crypto, io, qom, qemuutil,
1202 libcap_ng, libudev, libmpathpersist],
1206 if 'CONFIG_IVSHMEM' in config_host
1207 subdir('contrib/ivshmem-client')
1208 subdir('contrib/ivshmem-server')
1217 if 'CONFIG_GTK' in config_host
1221 if host_machine.system() == 'windows'
1223 find_program('scripts/nsis.py'),
1225 get_option('prefix'),
1226 meson.current_source_dir(),
1227 host_machine.cpu_family(),
1229 '-DDISPLAYVERSION=' + meson.project_version(),
1232 nsis_cmd += '-DCONFIG_DOCUMENTATION=y'
1234 if 'CONFIG_GTK' in config_host
1235 nsis_cmd += '-DCONFIG_GTK=y'
1238 nsis = custom_target('nsis',
1239 output: 'qemu-setup-' + meson.project_version() + '.exe',
1240 input: files('qemu.nsi'),
1241 build_always_stale: true,
1242 command: nsis_cmd + ['@INPUT@'])
1243 alias_target('installer', nsis)
1247 summary_info += {'Install prefix': config_host['prefix']}
1248 summary_info += {'BIOS directory': config_host['qemu_datadir']}
1249 summary_info += {'firmware path': config_host['qemu_firmwarepath']}
1250 summary_info += {'binary directory': config_host['bindir']}
1251 summary_info += {'library directory': config_host['libdir']}
1252 summary_info += {'module directory': config_host['qemu_moddir']}
1253 summary_info += {'libexec directory': config_host['libexecdir']}
1254 summary_info += {'include directory': config_host['includedir']}
1255 summary_info += {'config directory': config_host['sysconfdir']}
1256 if targetos != 'windows'
1257 summary_info += {'local state directory': config_host['qemu_localstatedir']}
1258 summary_info += {'Manual directory': get_option('mandir')}
1260 summary_info += {'local state directory': 'queried at runtime'}
1262 summary_info += {'Doc directory': get_option('docdir')}
1263 summary_info += {'Build directory': meson.current_build_dir()}
1264 summary_info += {'Source path': meson.current_source_dir()}
1265 summary_info += {'GIT binary': config_host['GIT']}
1266 summary_info += {'GIT submodules': config_host['GIT_SUBMODULES']}
1267 summary_info += {'C compiler': meson.get_compiler('c').cmd_array()[0]}
1268 summary_info += {'Host C compiler': meson.get_compiler('c', native: true).cmd_array()[0]}
1269 if link_language == 'cpp'
1270 summary_info += {'C++ compiler': meson.get_compiler('cpp').cmd_array()[0]}
1272 summary_info += {'C++ compiler': false}
1274 if targetos == 'darwin'
1275 summary_info += {'Objective-C compiler': meson.get_compiler('objc').cmd_array()[0]}
1277 summary_info += {'ARFLAGS': config_host['ARFLAGS']}
1278 summary_info += {'CFLAGS': config_host['CFLAGS']}
1279 summary_info += {'QEMU_CFLAGS': config_host['QEMU_CFLAGS']}
1280 summary_info += {'QEMU_LDFLAGS': config_host['QEMU_LDFLAGS']}
1281 summary_info += {'make': config_host['MAKE']}
1282 summary_info += {'python': '@0@ (version: @1@)'.format(python.full_path(), python.language_version())}
1283 summary_info += {'sphinx-build': config_host['SPHINX_BUILD']}
1284 summary_info += {'genisoimage': config_host['GENISOIMAGE']}
1285 # TODO: add back version
1286 summary_info += {'slirp support': config_host.has_key('CONFIG_SLIRP')}
1287 if config_host.has_key('CONFIG_SLIRP')
1288 summary_info += {'smbd': config_host['CONFIG_SMBD_COMMAND']}
1290 summary_info += {'module support': config_host.has_key('CONFIG_MODULES')}
1291 if config_host.has_key('CONFIG_MODULES')
1292 summary_info += {'alternative module path': config_host.has_key('CONFIG_MODULE_UPGRADES')}
1294 summary_info += {'host CPU': cpu}
1295 summary_info += {'host endianness': build_machine.endian()}
1296 summary_info += {'target list': config_host['TARGET_DIRS']}
1297 summary_info += {'gprof enabled': config_host.has_key('CONFIG_GPROF')}
1298 summary_info += {'sparse enabled': meson.get_compiler('c').cmd_array().contains('cgcc')}
1299 summary_info += {'strip binaries': get_option('strip')}
1300 summary_info += {'profiler': config_host.has_key('CONFIG_PROFILER')}
1301 summary_info += {'static build': config_host.has_key('CONFIG_STATIC')}
1302 if targetos == 'darwin'
1303 summary_info += {'Cocoa support': config_host.has_key('CONFIG_COCOA')}
1305 # TODO: add back version
1306 summary_info += {'SDL support': sdl.found()}
1307 summary_info += {'SDL image support': sdl_image.found()}
1308 # TODO: add back version
1309 summary_info += {'GTK support': config_host.has_key('CONFIG_GTK')}
1310 summary_info += {'GTK GL support': config_host.has_key('CONFIG_GTK_GL')}
1311 summary_info += {'pixman': pixman.found()}
1312 # TODO: add back version
1313 summary_info += {'VTE support': config_host.has_key('CONFIG_VTE')}
1314 summary_info += {'TLS priority': config_host['CONFIG_TLS_PRIORITY']}
1315 summary_info += {'GNUTLS support': config_host.has_key('CONFIG_GNUTLS')}
1316 # TODO: add back version
1317 summary_info += {'libgcrypt': config_host.has_key('CONFIG_GCRYPT')}
1318 if config_host.has_key('CONFIG_GCRYPT')
1319 summary_info += {' hmac': config_host.has_key('CONFIG_GCRYPT_HMAC')}
1320 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
1322 # TODO: add back version
1323 summary_info += {'nettle': config_host.has_key('CONFIG_NETTLE')}
1324 if config_host.has_key('CONFIG_NETTLE')
1325 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
1327 summary_info += {'libtasn1': config_host.has_key('CONFIG_TASN1')}
1328 summary_info += {'PAM': config_host.has_key('CONFIG_AUTH_PAM')}
1329 summary_info += {'iconv support': config_host.has_key('CONFIG_ICONV')}
1330 summary_info += {'curses support': config_host.has_key('CONFIG_CURSES')}
1331 # TODO: add back version
1332 summary_info += {'virgl support': config_host.has_key('CONFIG_VIRGL')}
1333 summary_info += {'curl support': config_host.has_key('CONFIG_CURL')}
1334 summary_info += {'mingw32 support': targetos == 'windows'}
1335 summary_info += {'Audio drivers': config_host['CONFIG_AUDIO_DRIVERS']}
1336 summary_info += {'Block whitelist (rw)': config_host['CONFIG_BDRV_RW_WHITELIST']}
1337 summary_info += {'Block whitelist (ro)': config_host['CONFIG_BDRV_RO_WHITELIST']}
1338 summary_info += {'VirtFS support': config_host.has_key('CONFIG_VIRTFS')}
1339 summary_info += {'Multipath support': config_host.has_key('CONFIG_MPATH')}
1340 summary_info += {'VNC support': vnc.found()}
1342 summary_info += {'VNC SASL support': sasl.found()}
1343 summary_info += {'VNC JPEG support': jpeg.found()}
1344 summary_info += {'VNC PNG support': png.found()}
1346 summary_info += {'xen support': config_host.has_key('CONFIG_XEN_BACKEND')}
1347 if config_host.has_key('CONFIG_XEN_BACKEND')
1348 summary_info += {'xen ctrl version': config_host['CONFIG_XEN_CTRL_INTERFACE_VERSION']}
1350 summary_info += {'brlapi support': config_host.has_key('CONFIG_BRLAPI')}
1351 summary_info += {'Documentation': config_host.has_key('BUILD_DOCS')}
1352 summary_info += {'PIE': get_option('b_pie')}
1353 summary_info += {'vde support': config_host.has_key('CONFIG_VDE')}
1354 summary_info += {'netmap support': config_host.has_key('CONFIG_NETMAP')}
1355 summary_info += {'Linux AIO support': config_host.has_key('CONFIG_LINUX_AIO')}
1356 summary_info += {'Linux io_uring support': config_host.has_key('CONFIG_LINUX_IO_URING')}
1357 summary_info += {'ATTR/XATTR support': config_host.has_key('CONFIG_ATTR')}
1358 summary_info += {'Install blobs': config_host.has_key('INSTALL_BLOBS')}
1359 # TODO: add back KVM/HAX/HVF/WHPX/TCG
1360 #summary_info += {'KVM support': have_kvm'}
1361 #summary_info += {'HAX support': have_hax'}
1362 #summary_info += {'HVF support': have_hvf'}
1363 #summary_info += {'WHPX support': have_whpx'}
1364 #summary_info += {'TCG support': have_tcg'}
1365 #if get_option('tcg')
1366 # summary_info += {'TCG debug enabled': config_host.has_key('CONFIG_DEBUG_TCG')}
1367 # summary_info += {'TCG interpreter': config_host.has_key('CONFIG_TCG_INTERPRETER')}
1369 summary_info += {'malloc trim support': config_host.has_key('CONFIG_MALLOC_TRIM')}
1370 summary_info += {'RDMA support': config_host.has_key('CONFIG_RDMA')}
1371 summary_info += {'PVRDMA support': config_host.has_key('CONFIG_PVRDMA')}
1372 summary_info += {'fdt support': config_host.has_key('CONFIG_FDT')}
1373 summary_info += {'membarrier': config_host.has_key('CONFIG_MEMBARRIER')}
1374 summary_info += {'preadv support': config_host.has_key('CONFIG_PREADV')}
1375 summary_info += {'fdatasync': config_host.has_key('CONFIG_FDATASYNC')}
1376 summary_info += {'madvise': config_host.has_key('CONFIG_MADVISE')}
1377 summary_info += {'posix_madvise': config_host.has_key('CONFIG_POSIX_MADVISE')}
1378 summary_info += {'posix_memalign': config_host.has_key('CONFIG_POSIX_MEMALIGN')}
1379 summary_info += {'libcap-ng support': config_host.has_key('CONFIG_LIBCAP_NG')}
1380 summary_info += {'vhost-net support': config_host.has_key('CONFIG_VHOST_NET')}
1381 summary_info += {'vhost-crypto support': config_host.has_key('CONFIG_VHOST_CRYPTO')}
1382 summary_info += {'vhost-scsi support': config_host.has_key('CONFIG_VHOST_SCSI')}
1383 summary_info += {'vhost-vsock support': config_host.has_key('CONFIG_VHOST_VSOCK')}
1384 summary_info += {'vhost-user support': config_host.has_key('CONFIG_VHOST_KERNEL')}
1385 summary_info += {'vhost-user-fs support': config_host.has_key('CONFIG_VHOST_USER_FS')}
1386 summary_info += {'vhost-vdpa support': config_host.has_key('CONFIG_VHOST_VDPA')}
1387 summary_info += {'Trace backends': config_host['TRACE_BACKENDS']}
1388 if config_host['TRACE_BACKENDS'].split().contains('simple')
1389 summary_info += {'Trace output file': config_host['CONFIG_TRACE_FILE'] + '-<pid>'}
1391 # TODO: add back protocol and server version
1392 summary_info += {'spice support': config_host.has_key('CONFIG_SPICE')}
1393 summary_info += {'rbd support': config_host.has_key('CONFIG_RBD')}
1394 summary_info += {'xfsctl support': config_host.has_key('CONFIG_XFS')}
1395 summary_info += {'smartcard support': config_host.has_key('CONFIG_SMARTCARD')}
1396 summary_info += {'U2F support': u2f.found()}
1397 summary_info += {'libusb': config_host.has_key('CONFIG_USB_LIBUSB')}
1398 summary_info += {'usb net redir': config_host.has_key('CONFIG_USB_REDIR')}
1399 summary_info += {'OpenGL support': config_host.has_key('CONFIG_OPENGL')}
1400 summary_info += {'OpenGL dmabufs': config_host.has_key('CONFIG_OPENGL_DMABUF')}
1401 summary_info += {'libiscsi support': config_host.has_key('CONFIG_LIBISCSI')}
1402 summary_info += {'libnfs support': config_host.has_key('CONFIG_LIBNFS')}
1403 summary_info += {'build guest agent': config_host.has_key('CONFIG_GUEST_AGENT')}
1404 if targetos == 'windows'
1405 if 'WIN_SDK' in config_host
1406 summary_info += {'Windows SDK': config_host['WIN_SDK']}
1408 summary_info += {'QGA VSS support': config_host.has_key('CONFIG_QGA_VSS')}
1409 summary_info += {'QGA w32 disk info': config_host.has_key('CONFIG_QGA_NTDDSCSI')}
1410 summary_info += {'QGA MSI support': config_host.has_key('CONFIG_QGA_MSI_ENABLED')}
1412 summary_info += {'seccomp support': config_host.has_key('CONFIG_SECCOMP')}
1413 summary_info += {'coroutine backend': config_host['CONFIG_COROUTINE_BACKEND']}
1414 summary_info += {'coroutine pool': config_host['CONFIG_COROUTINE_POOL'] == '1'}
1415 summary_info += {'debug stack usage': config_host.has_key('CONFIG_DEBUG_STACK_USAGE')}
1416 summary_info += {'mutex debugging': config_host.has_key('CONFIG_DEBUG_MUTEX')}
1417 summary_info += {'crypto afalg': config_host.has_key('CONFIG_AF_ALG')}
1418 summary_info += {'GlusterFS support': config_host.has_key('CONFIG_GLUSTERFS')}
1419 summary_info += {'gcov': get_option('b_coverage')}
1420 summary_info += {'TPM support': config_host.has_key('CONFIG_TPM')}
1421 summary_info += {'libssh support': config_host.has_key('CONFIG_LIBSSH')}
1422 summary_info += {'QOM debugging': config_host.has_key('CONFIG_QOM_CAST_DEBUG')}
1423 summary_info += {'Live block migration': config_host.has_key('CONFIG_LIVE_BLOCK_MIGRATION')}
1424 summary_info += {'lzo support': config_host.has_key('CONFIG_LZO')}
1425 summary_info += {'snappy support': config_host.has_key('CONFIG_SNAPPY')}
1426 summary_info += {'bzip2 support': config_host.has_key('CONFIG_BZIP2')}
1427 summary_info += {'lzfse support': config_host.has_key('CONFIG_LZFSE')}
1428 summary_info += {'zstd support': config_host.has_key('CONFIG_ZSTD')}
1429 summary_info += {'NUMA host support': config_host.has_key('CONFIG_NUMA')}
1430 summary_info += {'libxml2': config_host.has_key('CONFIG_LIBXML2')}
1431 summary_info += {'tcmalloc support': config_host.has_key('CONFIG_TCMALLOC')}
1432 summary_info += {'jemalloc support': config_host.has_key('CONFIG_JEMALLOC')}
1433 summary_info += {'avx2 optimization': config_host.has_key('CONFIG_AVX2_OPT')}
1434 summary_info += {'avx512f optimization': config_host.has_key('CONFIG_AVX512F_OPT')}
1435 summary_info += {'replication support': config_host.has_key('CONFIG_REPLICATION')}
1436 summary_info += {'bochs support': config_host.has_key('CONFIG_BOCHS')}
1437 summary_info += {'cloop support': config_host.has_key('CONFIG_CLOOP')}
1438 summary_info += {'dmg support': config_host.has_key('CONFIG_DMG')}
1439 summary_info += {'qcow v1 support': config_host.has_key('CONFIG_QCOW1')}
1440 summary_info += {'vdi support': config_host.has_key('CONFIG_VDI')}
1441 summary_info += {'vvfat support': config_host.has_key('CONFIG_VVFAT')}
1442 summary_info += {'qed support': config_host.has_key('CONFIG_QED')}
1443 summary_info += {'parallels support': config_host.has_key('CONFIG_PARALLELS')}
1444 summary_info += {'sheepdog support': config_host.has_key('CONFIG_SHEEPDOG')}
1445 summary_info += {'capstone': config_host.has_key('CONFIG_CAPSTONE')}
1446 summary_info += {'libpmem support': config_host.has_key('CONFIG_LIBPMEM')}
1447 summary_info += {'libdaxctl support': config_host.has_key('CONFIG_LIBDAXCTL')}
1448 summary_info += {'libudev': config_host.has_key('CONFIG_LIBUDEV')}
1449 summary_info += {'default devices': config_host['CONFIG_MINIKCONF_MODE'] == '--defconfig'}
1450 summary_info += {'plugin support': config_host.has_key('CONFIG_PLUGIN')}
1451 summary_info += {'fuzzing support': config_host.has_key('CONFIG_FUZZ')}
1452 if config_host.has_key('HAVE_GDB_BIN')
1453 summary_info += {'gdb': config_host['HAVE_GDB_BIN']}
1455 summary_info += {'thread sanitizer': config_host.has_key('CONFIG_TSAN')}
1456 summary_info += {'rng-none': config_host.has_key('CONFIG_RNG_NONE')}
1457 summary_info += {'Linux keyring': config_host.has_key('CONFIG_SECRET_KEYRING')}
1458 summary(summary_info, bool_yn: true)
1460 if not supported_cpus.contains(cpu)
1462 warning('SUPPORT FOR THIS HOST CPU WILL GO AWAY IN FUTURE RELEASES!')
1464 message('CPU host architecture ' + cpu + ' support is not currently maintained.')
1465 message('The QEMU project intends to remove support for this host CPU in')
1466 message('a future release if nobody volunteers to maintain it and to')
1467 message('provide a build host for our continuous integration setup.')
1468 message('configure has succeeded and you can continue to build, but')
1469 message('if you care about QEMU on this platform you should contact')
1470 message('us upstream at qemu-devel@nongnu.org.')
1473 if not supported_oses.contains(targetos)
1475 warning('WARNING: SUPPORT FOR THIS HOST OS WILL GO AWAY IN FUTURE RELEASES!')
1477 message('Host OS ' + targetos + 'support is not currently maintained.')
1478 message('The QEMU project intends to remove support for this host OS in')
1479 message('a future release if nobody volunteers to maintain it and to')
1480 message('provide a build host for our continuous integration setup.')
1481 message('configure has succeeded and you can continue to build, but')
1482 message('if you care about QEMU on this platform you should contact')
1483 message('us upstream at qemu-devel@nongnu.org.')