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
21 if get_option('qemu_suffix').startswith('/')
22 error('qemu_suffix cannot start with a /')
25 qemu_datadir = get_option('datadir') / get_option('qemu_suffix')
26 qemu_docdir = get_option('docdir') / get_option('qemu_suffix')
27 config_host_data = configuration_data()
30 target_dirs = config_host['TARGET_DIRS'].split()
33 foreach target : target_dirs
34 have_user = have_user or target.endswith('-user')
35 have_system = have_system or target.endswith('-softmmu')
37 have_tools = 'CONFIG_TOOLS' in config_host
38 have_block = have_system or have_tools
40 python = import('python').find_installation()
42 supported_oses = ['windows', 'freebsd', 'netbsd', 'openbsd', 'darwin', 'sunos', 'linux']
43 supported_cpus = ['ppc', 'ppc64', 's390x', 'sparc64', 'riscv32', 'riscv64', 'x86', 'x86_64',
44 'arm', 'aarch64', 'mips', 'mips64', 'sparc', 'sparc64']
46 cpu = host_machine.cpu_family()
47 targetos = host_machine.system()
49 configure_file(input: files('scripts/ninjatool.py'),
51 configuration: config_host)
57 add_project_arguments(config_host['QEMU_CFLAGS'].split(),
58 native: false, language: ['c', 'objc'])
59 add_project_arguments(config_host['QEMU_CXXFLAGS'].split(),
60 native: false, language: 'cpp')
61 add_project_link_arguments(config_host['QEMU_LDFLAGS'].split(),
62 native: false, language: ['c', 'cpp', 'objc'])
63 add_project_arguments(config_host['QEMU_INCLUDES'].split(),
64 language: ['c', 'cpp', 'objc'])
66 # Specify linker-script with add_project_link_arguments so that it is not placed
67 # within a linker --start-group/--end-group pair
68 if 'CONFIG_FUZZ' in config_host
69 add_project_link_arguments(['-Wl,-T,',
70 (meson.current_source_dir() / 'tests/qtest/fuzz/fork_fuzz.ld')],
71 native: false, language: ['c', 'cpp', 'objc'])
74 link_language = meson.get_external_property('link_language', 'cpp')
75 if link_language == 'cpp'
76 add_languages('cpp', required: true, native: false)
78 if host_machine.system() == 'darwin'
79 add_languages('objc', required: false, native: false)
82 if 'SPARSE_CFLAGS' in config_host
84 command: [find_program('scripts/check_sparse.py'),
85 config_host['SPARSE_CFLAGS'].split(),
86 'compile_commands.json'])
89 m = cc.find_library('m', required: false)
90 util = cc.find_library('util', required: false)
98 if targetos == 'windows'
99 socket = cc.find_library('ws2_32')
100 winmm = cc.find_library('winmm')
102 win = import('windows')
103 version_res = win.compile_resources('version.rc',
104 depend_files: files('pc-bios/qemu-nsis.ico'),
105 include_directories: include_directories('.'))
106 elif targetos == 'darwin'
107 coref = dependency('appleframeworks', modules: 'CoreFoundation')
108 iokit = dependency('appleframeworks', modules: 'IOKit')
109 cocoa = dependency('appleframeworks', modules: 'Cocoa')
110 hvf = dependency('appleframeworks', modules: 'Hypervisor')
111 elif targetos == 'sunos'
112 socket = [cc.find_library('socket'),
113 cc.find_library('nsl'),
114 cc.find_library('resolv')]
115 elif targetos == 'haiku'
116 socket = [cc.find_library('posix_error_mapper'),
117 cc.find_library('network'),
118 cc.find_library('bsd')]
120 # The path to glib.h is added to all compilation commands. This was
121 # grandfathered in from the QEMU Makefiles.
122 add_project_arguments(config_host['GLIB_CFLAGS'].split(),
123 native: false, language: ['c', 'cpp', 'objc'])
124 glib = declare_dependency(link_args: config_host['GLIB_LIBS'].split())
126 if 'CONFIG_GIO' in config_host
127 gio = declare_dependency(compile_args: config_host['GIO_CFLAGS'].split(),
128 link_args: config_host['GIO_LIBS'].split())
131 if 'CONFIG_TRACE_UST' in config_host
132 lttng = declare_dependency(link_args: config_host['LTTNG_UST_LIBS'].split())
135 if 'CONFIG_TRACE_UST' in config_host
136 urcubp = declare_dependency(link_args: config_host['URCU_BP_LIBS'].split())
139 if 'CONFIG_GCRYPT' in config_host
140 gcrypt = declare_dependency(compile_args: config_host['GCRYPT_CFLAGS'].split(),
141 link_args: config_host['GCRYPT_LIBS'].split())
144 if 'CONFIG_NETTLE' in config_host
145 nettle = declare_dependency(compile_args: config_host['NETTLE_CFLAGS'].split(),
146 link_args: config_host['NETTLE_LIBS'].split())
149 if 'CONFIG_GNUTLS' in config_host
150 gnutls = declare_dependency(compile_args: config_host['GNUTLS_CFLAGS'].split(),
151 link_args: config_host['GNUTLS_LIBS'].split())
154 if have_system or have_tools
155 pixman = dependency('pixman-1', required: have_system, version:'>=0.21.8',
156 method: 'pkg-config', static: enable_static)
159 if 'CONFIG_AUTH_PAM' in config_host
160 pam = cc.find_library('pam')
162 libaio = cc.find_library('aio', required: false)
163 zlib = dependency('zlib', required: true, static: enable_static)
164 linux_io_uring = not_found
165 if 'CONFIG_LINUX_IO_URING' in config_host
166 linux_io_uring = declare_dependency(compile_args: config_host['LINUX_IO_URING_CFLAGS'].split(),
167 link_args: config_host['LINUX_IO_URING_LIBS'].split())
170 if 'CONFIG_LIBXML2' in config_host
171 libxml2 = declare_dependency(compile_args: config_host['LIBXML2_CFLAGS'].split(),
172 link_args: config_host['LIBXML2_LIBS'].split())
175 if 'CONFIG_LIBNFS' in config_host
176 libnfs = declare_dependency(link_args: config_host['LIBNFS_LIBS'].split())
179 if 'CONFIG_ATTR' in config_host
180 libattr = declare_dependency(link_args: config_host['LIBATTR_LIBS'].split())
183 if 'CONFIG_SECCOMP' in config_host
184 seccomp = declare_dependency(compile_args: config_host['SECCOMP_CFLAGS'].split(),
185 link_args: config_host['SECCOMP_LIBS'].split())
187 libcap_ng = not_found
188 if 'CONFIG_LIBCAP_NG' in config_host
189 libcap_ng = declare_dependency(link_args: config_host['LIBCAP_NG_LIBS'].split())
191 if get_option('xkbcommon').auto() and not have_system and not have_tools
192 xkbcommon = not_found
194 xkbcommon = dependency('xkbcommon', required: get_option('xkbcommon'),
195 method: 'pkg-config', static: enable_static)
198 if config_host.has_key('CONFIG_SLIRP')
199 slirp = declare_dependency(compile_args: config_host['SLIRP_CFLAGS'].split(),
200 link_args: config_host['SLIRP_LIBS'].split())
203 if config_host.has_key('CONFIG_VDE')
204 vde = declare_dependency(link_args: config_host['VDE_LIBS'].split())
207 if 'CONFIG_LIBPULSE' in config_host
208 pulse = declare_dependency(compile_args: config_host['PULSE_CFLAGS'].split(),
209 link_args: config_host['PULSE_LIBS'].split())
212 if 'CONFIG_ALSA' in config_host
213 alsa = declare_dependency(compile_args: config_host['ALSA_CFLAGS'].split(),
214 link_args: config_host['ALSA_LIBS'].split())
217 if 'CONFIG_LIBJACK' in config_host
218 jack = declare_dependency(link_args: config_host['JACK_LIBS'].split())
221 if 'CONFIG_SPICE' in config_host
222 spice = declare_dependency(compile_args: config_host['SPICE_CFLAGS'].split(),
223 link_args: config_host['SPICE_LIBS'].split())
225 rt = cc.find_library('rt', required: false)
226 libmpathpersist = not_found
227 if config_host.has_key('CONFIG_MPATH')
228 libmpathpersist = cc.find_library('mpathpersist')
231 if 'CONFIG_PLUGIN' in config_host
232 libdl = cc.find_library('dl', required: true)
235 if 'CONFIG_LIBISCSI' in config_host
236 libiscsi = declare_dependency(compile_args: config_host['LIBISCSI_CFLAGS'].split(),
237 link_args: config_host['LIBISCSI_LIBS'].split())
240 if 'CONFIG_ZSTD' in config_host
241 zstd = declare_dependency(compile_args: config_host['ZSTD_CFLAGS'].split(),
242 link_args: config_host['ZSTD_LIBS'].split())
245 if 'CONFIG_GBM' in config_host
246 gbm = declare_dependency(compile_args: config_host['GBM_CFLAGS'].split(),
247 link_args: config_host['GBM_LIBS'].split())
250 if 'CONFIG_VIRGL' in config_host
251 virgl = declare_dependency(compile_args: config_host['VIRGL_CFLAGS'].split(),
252 link_args: config_host['VIRGL_LIBS'].split())
255 if 'CONFIG_CURL' in config_host
256 curl = declare_dependency(compile_args: config_host['CURL_CFLAGS'].split(),
257 link_args: config_host['CURL_LIBS'].split())
260 if targetos == 'linux' and (have_system or have_tools)
261 libudev = dependency('libudev', static: enable_static)
264 if 'CONFIG_BRLAPI' in config_host
265 brlapi = declare_dependency(link_args: config_host['BRLAPI_LIBS'].split())
270 sdl = dependency('sdl2', required: get_option('sdl'), static: enable_static)
271 sdl_image = not_found
274 # work around 2.0.8 bug
275 sdl = declare_dependency(compile_args: '-Wno-undef',
277 sdl_image = dependency('SDL2_image', required: get_option('sdl_image'),
278 method: 'pkg-config', static: enable_static)
280 if get_option('sdl_image').enabled()
281 error('sdl-image required, but SDL was @0@'.format(
282 get_option('sdl').disabled() ? 'disabled' : 'not found'))
284 sdl_image = not_found
288 if 'CONFIG_RBD' in config_host
289 rbd = declare_dependency(link_args: config_host['RBD_LIBS'].split())
291 glusterfs = not_found
292 if 'CONFIG_GLUSTERFS' in config_host
293 glusterfs = declare_dependency(compile_args: config_host['GLUSTERFS_CFLAGS'].split(),
294 link_args: config_host['GLUSTERFS_LIBS'].split())
297 if 'CONFIG_LIBSSH' in config_host
298 libssh = declare_dependency(compile_args: config_host['LIBSSH_CFLAGS'].split(),
299 link_args: config_host['LIBSSH_LIBS'].split())
302 if 'CONFIG_BZIP2' in config_host
303 libbzip2 = declare_dependency(link_args: config_host['BZIP2_LIBS'].split())
306 if 'CONFIG_LZFSE' in config_host
307 liblzfse = declare_dependency(link_args: config_host['LZFSE_LIBS'].split())
310 if 'CONFIG_AUDIO_OSS' in config_host
311 oss = declare_dependency(link_args: config_host['OSS_LIBS'].split())
314 if 'CONFIG_AUDIO_DSOUND' in config_host
315 dsound = declare_dependency(link_args: config_host['DSOUND_LIBS'].split())
317 coreaudio = not_found
318 if 'CONFIG_AUDIO_COREAUDIO' in config_host
319 coreaudio = declare_dependency(link_args: config_host['COREAUDIO_LIBS'].split())
322 if 'CONFIG_OPENGL' in config_host
323 opengl = declare_dependency(compile_args: config_host['OPENGL_CFLAGS'].split(),
324 link_args: config_host['OPENGL_LIBS'].split())
327 if 'CONFIG_GTK' in config_host
328 gtk = declare_dependency(compile_args: config_host['GTK_CFLAGS'].split(),
329 link_args: config_host['GTK_LIBS'].split())
332 if 'CONFIG_VTE' in config_host
333 vte = declare_dependency(compile_args: config_host['VTE_CFLAGS'].split(),
334 link_args: config_host['VTE_LIBS'].split())
337 if 'CONFIG_X11' in config_host
338 x11 = declare_dependency(compile_args: config_host['X11_CFLAGS'].split(),
339 link_args: config_host['X11_LIBS'].split())
342 if 'CONFIG_CURSES' in config_host
343 curses = declare_dependency(compile_args: config_host['CURSES_CFLAGS'].split(),
344 link_args: config_host['CURSES_LIBS'].split())
347 if 'CONFIG_ICONV' in config_host
348 iconv = declare_dependency(compile_args: config_host['ICONV_CFLAGS'].split(),
349 link_args: config_host['ICONV_LIBS'].split())
355 if get_option('vnc').enabled()
356 vnc = declare_dependency() # dummy dependency
357 png = dependency('libpng', required: get_option('vnc_png'),
358 method: 'pkg-config', static: enable_static)
359 jpeg = cc.find_library('jpeg', has_headers: ['jpeglib.h'],
360 required: get_option('vnc_jpeg'),
361 static: enable_static)
362 sasl = cc.find_library('sasl2', has_headers: ['sasl/sasl.h'],
363 required: get_option('vnc_sasl'),
364 static: enable_static)
366 sasl = declare_dependency(dependencies: sasl,
367 compile_args: '-DSTRUCT_IOVEC_DEFINED')
371 if 'CONFIG_FDT' in config_host
372 fdt = declare_dependency(compile_args: config_host['FDT_CFLAGS'].split(),
373 link_args: config_host['FDT_LIBS'].split())
376 if 'CONFIG_SNAPPY' in config_host
377 snappy = declare_dependency(link_args: config_host['SNAPPY_LIBS'].split())
380 if 'CONFIG_LZO' in config_host
381 lzo = declare_dependency(link_args: config_host['LZO_LIBS'].split())
384 if 'CONFIG_RDMA' in config_host
385 rdma = declare_dependency(link_args: config_host['RDMA_LIBS'].split())
388 if 'CONFIG_NUMA' in config_host
389 numa = declare_dependency(link_args: config_host['NUMA_LIBS'].split())
392 if 'CONFIG_XEN_BACKEND' in config_host
393 xen = declare_dependency(compile_args: config_host['XEN_CFLAGS'].split(),
394 link_args: config_host['XEN_LIBS'].split())
397 if 'CONFIG_SMARTCARD' in config_host
398 cacard = declare_dependency(compile_args: config_host['SMARTCARD_CFLAGS'].split(),
399 link_args: config_host['SMARTCARD_LIBS'].split())
403 u2f = dependency('u2f-emu', required: get_option('u2f'),
404 method: 'pkg-config',
405 static: enable_static)
408 if 'CONFIG_USB_REDIR' in config_host
409 usbredir = declare_dependency(compile_args: config_host['USB_REDIR_CFLAGS'].split(),
410 link_args: config_host['USB_REDIR_LIBS'].split())
413 if 'CONFIG_USB_LIBUSB' in config_host
414 libusb = declare_dependency(compile_args: config_host['LIBUSB_CFLAGS'].split(),
415 link_args: config_host['LIBUSB_LIBS'].split())
418 if 'CONFIG_CAPSTONE' in config_host
419 capstone = declare_dependency(compile_args: config_host['CAPSTONE_CFLAGS'].split(),
420 link_args: config_host['CAPSTONE_LIBS'].split())
423 if 'CONFIG_LIBPMEM' in config_host
424 libpmem = declare_dependency(compile_args: config_host['LIBPMEM_CFLAGS'].split(),
425 link_args: config_host['LIBPMEM_LIBS'].split())
427 libdaxctl = not_found
428 if 'CONFIG_LIBDAXCTL' in config_host
429 libdaxctl = declare_dependency(link_args: config_host['LIBDAXCTL_LIBS'].split())
432 if 'CONFIG_TASN1' in config_host
433 tasn1 = declare_dependency(compile_args: config_host['TASN1_CFLAGS'].split(),
434 link_args: config_host['TASN1_LIBS'].split())
436 keyutils = dependency('libkeyutils', required: false,
437 method: 'pkg-config', static: enable_static)
439 has_gettid = cc.has_function('gettid')
441 # Create config-host.h
443 config_host_data.set('CONFIG_LIBUDEV', libudev.found())
444 config_host_data.set('CONFIG_SDL', sdl.found())
445 config_host_data.set('CONFIG_SDL_IMAGE', sdl_image.found())
446 config_host_data.set('CONFIG_VNC', vnc.found())
447 config_host_data.set('CONFIG_VNC_JPEG', jpeg.found())
448 config_host_data.set('CONFIG_VNC_PNG', png.found())
449 config_host_data.set('CONFIG_VNC_SASL', sasl.found())
450 config_host_data.set('CONFIG_XKBCOMMON', xkbcommon.found())
451 config_host_data.set('CONFIG_KEYUTILS', keyutils.found())
452 config_host_data.set('CONFIG_GETTID', has_gettid)
453 config_host_data.set('QEMU_VERSION', '"@0@"'.format(meson.project_version()))
454 config_host_data.set('QEMU_VERSION_MAJOR', meson.project_version().split('.')[0])
455 config_host_data.set('QEMU_VERSION_MINOR', meson.project_version().split('.')[1])
456 config_host_data.set('QEMU_VERSION_MICRO', meson.project_version().split('.')[2])
458 arrays = ['CONFIG_AUDIO_DRIVERS', 'CONFIG_BDRV_RW_WHITELIST', 'CONFIG_BDRV_RO_WHITELIST']
459 strings = ['HOST_DSOSUF', 'CONFIG_IASL', 'qemu_confdir', 'qemu_datadir',
460 'qemu_moddir', 'qemu_localstatedir', 'qemu_helperdir', 'qemu_localedir',
461 'qemu_icondir', 'qemu_desktopdir', 'qemu_firmwarepath']
462 foreach k, v: config_host
463 if arrays.contains(k)
465 v = '"' + '", "'.join(v.split()) + '", '
467 config_host_data.set(k, v)
469 config_host_data.set('HOST_' + v.to_upper(), 1)
470 elif strings.contains(k)
471 if not k.startswith('CONFIG_')
472 k = 'CONFIG_' + k.to_upper()
474 config_host_data.set_quoted(k, v)
475 elif k.startswith('CONFIG_') or k.startswith('HAVE_') or k.startswith('HOST_')
476 config_host_data.set(k, v == 'y' ? 1 : v)
479 genh += configure_file(output: 'config-host.h', configuration: config_host_data)
481 minikconf = find_program('scripts/minikconf.py')
482 config_all_devices = {}
483 config_all_disas = {}
484 config_devices_mak_list = []
485 config_devices_h = {}
487 config_target_mak = {}
490 'alpha' : ['CONFIG_ALPHA_DIS'],
491 'arm' : ['CONFIG_ARM_DIS'],
492 'avr' : ['CONFIG_AVR_DIS'],
493 'cris' : ['CONFIG_CRIS_DIS'],
494 'hppa' : ['CONFIG_HPPA_DIS'],
495 'i386' : ['CONFIG_I386_DIS'],
496 'x86_64' : ['CONFIG_I386_DIS'],
497 'x32' : ['CONFIG_I386_DIS'],
498 'lm32' : ['CONFIG_LM32_DIS'],
499 'm68k' : ['CONFIG_M68K_DIS'],
500 'microblaze' : ['CONFIG_MICROBLAZE_DIS'],
501 'mips' : ['CONFIG_MIPS_DIS'],
502 'moxie' : ['CONFIG_MOXIE_DIS'],
503 'nios2' : ['CONFIG_NIOS2_DIS'],
504 'or1k' : ['CONFIG_OPENRISC_DIS'],
505 'ppc' : ['CONFIG_PPC_DIS'],
506 'riscv' : ['CONFIG_RISCV_DIS'],
507 'rx' : ['CONFIG_RX_DIS'],
508 's390' : ['CONFIG_S390_DIS'],
509 'sh4' : ['CONFIG_SH4_DIS'],
510 'sparc' : ['CONFIG_SPARC_DIS'],
511 'xtensa' : ['CONFIG_XTENSA_DIS'],
513 if link_language == 'cpp'
515 'aarch64' : [ 'CONFIG_ARM_A64_DIS'],
516 'arm' : [ 'CONFIG_ARM_DIS', 'CONFIG_ARM_A64_DIS'],
517 'mips' : [ 'CONFIG_MIPS_DIS', 'CONFIG_NANOMIPS_DIS'],
521 kconfig_external_symbols = [
531 'CONFIG_VHOST_KERNEL',
536 ignored = ['TARGET_XML_FILES', 'TARGET_ABI_DIR', 'TARGET_DIRS']
538 foreach target : target_dirs
539 config_target = keyval.load(meson.current_build_dir() / target / 'config-target.mak')
541 foreach k, v: disassemblers
542 if config_host['ARCH'].startswith(k) or config_target['TARGET_BASE_ARCH'].startswith(k)
544 config_target += { sym: 'y' }
545 config_all_disas += { sym: 'y' }
550 config_target_data = configuration_data()
551 foreach k, v: config_target
552 if not k.startswith('TARGET_') and not k.startswith('CONFIG_')
554 elif ignored.contains(k)
556 elif k == 'TARGET_BASE_ARCH'
557 config_target_data.set('TARGET_' + v.to_upper(), 1)
558 elif k == 'TARGET_NAME'
559 config_target_data.set_quoted(k, v)
561 config_target_data.set(k, 1)
563 config_target_data.set(k, v)
566 config_target_h += {target: configure_file(output: target + '-config-target.h',
567 configuration: config_target_data)}
569 if target.endswith('-softmmu')
571 foreach sym : kconfig_external_symbols
572 if sym in config_target or sym in config_host
573 base_kconfig += '@0@=y'.format(sym)
577 config_devices_mak = target + '-config-devices.mak'
578 config_devices_mak = configure_file(
579 input: ['default-configs' / target + '.mak', 'Kconfig'],
580 output: config_devices_mak,
581 depfile: config_devices_mak + '.d',
583 command: [minikconf, config_host['CONFIG_MINIKCONF_MODE'],
584 config_devices_mak, '@DEPFILE@', '@INPUT@',
587 config_devices_data = configuration_data()
588 config_devices = keyval.load(config_devices_mak)
589 foreach k, v: config_devices
590 config_devices_data.set(k, 1)
592 config_devices_mak_list += config_devices_mak
593 config_devices_h += {target: configure_file(output: target + '-config-devices.h',
594 configuration: config_devices_data)}
595 config_target += config_devices
596 config_all_devices += config_devices
598 config_target_mak += {target: config_target}
601 # This configuration is used to build files that are shared by
602 # multiple binaries, and then extracted out of the "common"
603 # static_library target.
605 # We do not use all_sources()/all_dependencies(), because it would
606 # build literally all source files, including devices only used by
607 # targets that are not built for this compilation. The CONFIG_ALL
608 # pseudo symbol replaces it.
610 config_all = config_all_devices
611 config_all += config_host
612 config_all += config_all_disas
614 'CONFIG_XEN': config_host.has_key('CONFIG_XEN_BACKEND'),
615 'CONFIG_SOFTMMU': have_system,
616 'CONFIG_USER_ONLY': have_user,
622 hxtool = find_program('scripts/hxtool')
623 shaderinclude = find_program('scripts/shaderinclude.pl')
624 qapi_gen = find_program('scripts/qapi-gen.py')
625 qapi_gen_depends = [ meson.source_root() / 'scripts/qapi/__init__.py',
626 meson.source_root() / 'scripts/qapi/commands.py',
627 meson.source_root() / 'scripts/qapi/common.py',
628 meson.source_root() / 'scripts/qapi/error.py',
629 meson.source_root() / 'scripts/qapi/events.py',
630 meson.source_root() / 'scripts/qapi/expr.py',
631 meson.source_root() / 'scripts/qapi/gen.py',
632 meson.source_root() / 'scripts/qapi/introspect.py',
633 meson.source_root() / 'scripts/qapi/parser.py',
634 meson.source_root() / 'scripts/qapi/schema.py',
635 meson.source_root() / 'scripts/qapi/source.py',
636 meson.source_root() / 'scripts/qapi/types.py',
637 meson.source_root() / 'scripts/qapi/visit.py',
638 meson.source_root() / 'scripts/qapi/common.py',
639 meson.source_root() / 'scripts/qapi-gen.py'
643 python, files('scripts/tracetool.py'),
644 '--backend=' + config_host['TRACE_BACKENDS']
647 qemu_version_cmd = [find_program('scripts/qemu-version.sh'),
648 meson.current_source_dir(),
649 config_host['PKGVERSION'], meson.project_version()]
650 qemu_version = custom_target('qemu-version.h',
651 output: 'qemu-version.h',
652 command: qemu_version_cmd,
654 build_by_default: true,
655 build_always_stale: true)
660 ['qemu-options.hx', 'qemu-options.def'],
661 ['qemu-img-cmds.hx', 'qemu-img-cmds.h'],
665 ['hmp-commands.hx', 'hmp-commands.h'],
666 ['hmp-commands-info.hx', 'hmp-commands-info.h'],
669 foreach d : hx_headers
670 hxdep += custom_target(d[1],
674 build_by_default: true, # to be removed when added to a target
675 command: [hxtool, '-h', '@INPUT0@'])
679 SPHINX_ARGS = [config_host['SPHINX_BUILD'],
680 '-Dversion=' + meson.project_version(),
681 '-Drelease=' + config_host['PKGVERSION']]
683 if get_option('werror')
684 SPHINX_ARGS += [ '-W' ]
687 sphinx_extn_depends = [ meson.source_root() / 'docs/sphinx/depfile.py',
688 meson.source_root() / 'docs/sphinx/hxtool.py',
689 meson.source_root() / 'docs/sphinx/kerneldoc.py',
690 meson.source_root() / 'docs/sphinx/kernellog.py',
691 meson.source_root() / 'docs/sphinx/qapidoc.py',
692 meson.source_root() / 'docs/sphinx/qmp_lexer.py',
695 # Collect sourcesets.
697 util_ss = ss.source_set()
698 stub_ss = ss.source_set()
699 trace_ss = ss.source_set()
700 block_ss = ss.source_set()
701 blockdev_ss = ss.source_set()
702 qmp_ss = ss.source_set()
703 common_ss = ss.source_set()
704 softmmu_ss = ss.source_set()
705 user_ss = ss.source_set()
706 bsd_user_ss = ss.source_set()
707 linux_user_ss = ss.source_set()
708 specific_ss = ss.source_set()
709 specific_fuzz_ss = ss.source_set()
714 target_softmmu_arch = {}
720 # TODO: add each directory to the subdirs from its own meson.build, once
722 trace_events_subdirs = [
729 trace_events_subdirs += [ 'linux-user' ]
732 trace_events_subdirs += [
741 trace_events_subdirs += [
752 'hw/block/dataplane',
797 trace_events_subdirs += [
824 libmodulecommon = static_library('module-common', files('module-common.c') + genh, pic: true, c_args: '-DBUILD_DSO')
825 modulecommon = declare_dependency(link_whole: libmodulecommon, compile_args: '-DBUILD_DSO')
828 # Build targets from sourcesets
830 stub_ss = stub_ss.apply(config_all, strict: false)
832 util_ss.add_all(trace_ss)
833 util_ss = util_ss.apply(config_all, strict: false)
834 libqemuutil = static_library('qemuutil',
835 sources: util_ss.sources() + stub_ss.sources() + genh,
836 dependencies: [util_ss.dependencies(), m, glib, socket])
837 qemuutil = declare_dependency(link_with: libqemuutil,
838 sources: genh + version_res)
840 decodetree = generator(find_program('scripts/decodetree.py'),
841 output: 'decode-@BASENAME@.c.inc',
842 arguments: ['@INPUT@', '@EXTRA_ARGS@', '-o', '@OUTPUT@'])
848 subdir('libdecnumber')
858 block_ss.add(when: 'CONFIG_REPLICATION', if_true: files('replication.c'))
864 blockdev_ss.add(files(
871 # os-posix.c contains POSIX-specific functions used by qemu-storage-daemon,
872 # os-win32.c does not
873 blockdev_ss.add(when: 'CONFIG_POSIX', if_true: files('os-posix.c'))
874 softmmu_ss.add(when: 'CONFIG_WIN32', if_true: [files('os-win32.c')])
876 softmmu_ss.add_all(blockdev_ss)
877 softmmu_ss.add(files(
883 softmmu_ss.add(when: 'CONFIG_TPM', if_true: files('tpm.c'))
884 softmmu_ss.add(when: 'CONFIG_SECCOMP', if_true: [files('qemu-seccomp.c'), seccomp])
885 softmmu_ss.add(when: ['CONFIG_FDT', fdt], if_true: [files('device_tree.c')])
887 common_ss.add(files('cpus-common.c'))
891 specific_ss.add(files('disas.c', 'exec.c', 'gdbstub.c'), capstone, libpmem, libdaxctl)
892 specific_ss.add(files('exec-vary.c'))
893 specific_ss.add(when: 'CONFIG_TCG', if_true: files(
902 specific_ss.add(when: 'CONFIG_TCG_INTERPRETER', if_true: files('disas/tci.c', 'tcg/tci.c'))
916 bsd_user_ss.add(files('gdbstub.c'))
917 specific_ss.add_all(when: 'CONFIG_BSD_USER', if_true: bsd_user_ss)
919 linux_user_ss.add(files('gdbstub.c', 'thunk.c'))
920 specific_ss.add_all(when: 'CONFIG_LINUX_USER', if_true: linux_user_ss)
922 # needed for fuzzing binaries
923 subdir('tests/qtest/libqos')
924 subdir('tests/qtest/fuzz')
928 foreach d, list : modules
929 foreach m, module_ss : list
930 if enable_modules and targetos != 'windows'
931 module_ss = module_ss.apply(config_all, strict: false)
932 sl = static_library(d + '-' + m, [genh, module_ss.sources()],
933 dependencies: [modulecommon, module_ss.dependencies()], pic: true)
941 block_ss.add_all(module_ss)
943 softmmu_ss.add_all(module_ss)
949 nm = find_program('nm')
950 undefsym = find_program('scripts/undefsym.py')
951 block_syms = custom_target('block.syms', output: 'block.syms',
952 input: [libqemuutil, block_mods],
954 command: [undefsym, nm, '@INPUT@'])
955 qemu_syms = custom_target('qemu.syms', output: 'qemu.syms',
956 input: [libqemuutil, softmmu_mods],
958 command: [undefsym, nm, '@INPUT@'])
960 block_ss = block_ss.apply(config_host, strict: false)
961 libblock = static_library('block', block_ss.sources() + genh,
962 dependencies: block_ss.dependencies(),
963 link_depends: block_syms,
965 build_by_default: false)
967 block = declare_dependency(link_whole: [libblock],
968 link_args: '@block.syms',
969 dependencies: [crypto, io])
971 qmp_ss = qmp_ss.apply(config_host, strict: false)
972 libqmp = static_library('qmp', qmp_ss.sources() + genh,
973 dependencies: qmp_ss.dependencies(),
975 build_by_default: false)
977 qmp = declare_dependency(link_whole: [libqmp])
979 foreach m : block_mods + softmmu_mods
980 shared_module(m.name(),
984 install_dir: config_host['qemu_moddir'])
987 softmmu_ss.add(authz, block, chardev, crypto, io, qmp)
988 common_ss.add(qom, qemuutil)
990 common_ss.add_all(when: 'CONFIG_SOFTMMU', if_true: [softmmu_ss])
991 common_ss.add_all(when: 'CONFIG_USER_ONLY', if_true: user_ss)
993 common_all = common_ss.apply(config_all, strict: false)
994 common_all = static_library('common',
995 build_by_default: false,
996 sources: common_all.sources() + genh,
997 dependencies: common_all.dependencies(),
1000 feature_to_c = find_program('scripts/feature_to_c.sh')
1003 foreach target : target_dirs
1004 config_target = config_target_mak[target]
1005 target_name = config_target['TARGET_NAME']
1006 arch = config_target['TARGET_BASE_ARCH']
1007 arch_srcs = [config_target_h[target]]
1009 c_args = ['-DNEED_CPU_H',
1010 '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
1011 '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)]
1014 config_target += config_host
1015 target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
1016 if targetos == 'linux'
1017 target_inc += include_directories('linux-headers', is_system: true)
1019 if target.endswith('-softmmu')
1020 qemu_target_name = 'qemu-system-' + target_name
1021 target_type='system'
1022 t = target_softmmu_arch[arch].apply(config_target, strict: false)
1023 arch_srcs += t.sources()
1024 arch_deps += t.dependencies()
1026 hw_dir = target_name == 'sparc64' ? 'sparc64' : arch
1027 hw = hw_arch[hw_dir].apply(config_target, strict: false)
1028 arch_srcs += hw.sources()
1029 arch_deps += hw.dependencies()
1031 arch_srcs += config_devices_h[target]
1032 link_args += ['@block.syms', '@qemu.syms']
1034 abi = config_target['TARGET_ABI_DIR']
1036 qemu_target_name = 'qemu-' + target_name
1037 if 'CONFIG_LINUX_USER' in config_target
1038 base_dir = 'linux-user'
1039 target_inc += include_directories('linux-user/host/' / config_host['ARCH'])
1041 base_dir = 'bsd-user'
1043 target_inc += include_directories(
1047 if 'CONFIG_LINUX_USER' in config_target
1048 dir = base_dir / abi
1049 arch_srcs += files(dir / 'signal.c', dir / 'cpu_loop.c')
1050 if config_target.has_key('TARGET_SYSTBL_ABI')
1052 syscall_nr_generators[abi].process(base_dir / abi / config_target['TARGET_SYSTBL'],
1053 extra_args : config_target['TARGET_SYSTBL_ABI'])
1058 if 'TARGET_XML_FILES' in config_target
1059 gdbstub_xml = custom_target(target + '-gdbstub-xml.c',
1060 output: target + '-gdbstub-xml.c',
1061 input: files(config_target['TARGET_XML_FILES'].split()),
1062 command: [feature_to_c, '@INPUT@'],
1064 arch_srcs += gdbstub_xml
1067 t = target_arch[arch].apply(config_target, strict: false)
1068 arch_srcs += t.sources()
1069 arch_deps += t.dependencies()
1071 target_common = common_ss.apply(config_target, strict: false)
1072 objects = common_all.extract_objects(target_common.sources())
1073 deps = target_common.dependencies()
1075 target_specific = specific_ss.apply(config_target, strict: false)
1076 arch_srcs += target_specific.sources()
1077 arch_deps += target_specific.dependencies()
1079 lib = static_library('qemu-' + target,
1080 sources: arch_srcs + genh,
1081 dependencies: arch_deps,
1083 include_directories: target_inc,
1085 build_by_default: false,
1088 if target.endswith('-softmmu')
1090 'name': 'qemu-system-' + target_name,
1092 'sources': files('softmmu/main.c'),
1095 if targetos == 'windows' and (sdl.found() or gtk.found())
1097 'name': 'qemu-system-' + target_name + 'w',
1099 'sources': files('softmmu/main.c'),
1103 if config_host.has_key('CONFIG_FUZZ')
1104 specific_fuzz = specific_fuzz_ss.apply(config_target, strict: false)
1106 'name': 'qemu-fuzz-' + target_name,
1108 'sources': specific_fuzz.sources(),
1109 'dependencies': specific_fuzz.dependencies(),
1114 'name': 'qemu-' + target_name,
1121 emulators += executable(exe['name'], exe['sources'],
1124 dependencies: arch_deps + deps + exe['dependencies'],
1125 objects: lib.extract_all_objects(recursive: true),
1126 link_language: link_language,
1127 link_depends: [block_syms, qemu_syms] + exe.get('link_depends', []),
1128 link_args: link_args,
1129 gui_app: exe['gui'])
1131 if 'CONFIG_TRACE_SYSTEMTAP' in config_host
1133 {'ext': '.stp-build', 'fmt': 'stap', 'bin': meson.current_build_dir() / exe['name'], 'install': false},
1134 {'ext': '.stp', 'fmt': 'stap', 'bin': get_option('prefix') / get_option('bindir') / exe['name'], 'install': true},
1135 {'ext': '-simpletrace.stp', 'fmt': 'simpletrace-stap', 'bin': '', 'install': true},
1136 {'ext': '-log.stp', 'fmt': 'log-stap', 'bin': '', 'install': true},
1138 custom_target(exe['name'] + stp['ext'],
1139 input: trace_events_all,
1140 output: exe['name'] + stp['ext'],
1142 install: stp['install'],
1143 install_dir: qemu_datadir / '../systemtap/tapset',
1145 tracetool, '--group=all', '--format=' + stp['fmt'],
1146 '--binary=' + stp['bin'],
1147 '--target-name=' + target_name,
1148 '--target-type=' + target_type,
1149 '--probe-prefix=qemu.' + target_type + '.' + target_name,
1157 # Other build targets
1159 if 'CONFIG_PLUGIN' in config_host
1160 install_headers('include/qemu/qemu-plugin.h')
1163 if 'CONFIG_GUEST_AGENT' in config_host
1167 # Don't build qemu-keymap if xkbcommon is not explicitly enabled
1168 # when we don't build tools or system
1169 if xkbcommon.found()
1170 # used for the update-keymaps target, so include rules even if !have_tools
1171 qemu_keymap = executable('qemu-keymap', files('qemu-keymap.c', 'ui/input-keymap.c') + genh,
1172 dependencies: [qemuutil, xkbcommon], install: have_tools)
1175 qemu_block_tools = []
1177 qemu_img = executable('qemu-img', [files('qemu-img.c'), hxdep],
1178 dependencies: [authz, block, crypto, io, qom, qemuutil], install: true)
1179 qemu_io = executable('qemu-io', files('qemu-io.c'),
1180 dependencies: [block, qemuutil], install: true)
1181 qemu_nbd = executable('qemu-nbd', files('qemu-nbd.c'),
1182 dependencies: [block, qemuutil], install: true)
1184 subdir('storage-daemon')
1185 subdir('contrib/rdmacm-mux')
1186 subdir('contrib/elf2dmp')
1188 executable('qemu-edid', files('qemu-edid.c', 'hw/display/edid-generate.c'),
1189 dependencies: qemuutil,
1192 if 'CONFIG_VHOST_USER' in config_host
1193 subdir('contrib/libvhost-user')
1194 subdir('contrib/vhost-user-blk')
1195 subdir('contrib/vhost-user-gpu')
1196 subdir('contrib/vhost-user-input')
1197 subdir('contrib/vhost-user-scsi')
1200 if targetos == 'linux'
1201 executable('qemu-bridge-helper', files('qemu-bridge-helper.c'),
1202 dependencies: [qemuutil, libcap_ng],
1204 install_dir: get_option('libexecdir'))
1206 executable('qemu-pr-helper', files('scsi/qemu-pr-helper.c', 'scsi/utils.c'),
1207 dependencies: [authz, crypto, io, qom, qemuutil,
1208 libcap_ng, libudev, libmpathpersist],
1212 if 'CONFIG_IVSHMEM' in config_host
1213 subdir('contrib/ivshmem-client')
1214 subdir('contrib/ivshmem-server')
1223 if 'CONFIG_GTK' in config_host
1227 if host_machine.system() == 'windows'
1229 find_program('scripts/nsis.py'),
1231 get_option('prefix'),
1232 meson.current_source_dir(),
1233 host_machine.cpu_family(),
1235 '-DDISPLAYVERSION=' + meson.project_version(),
1238 nsis_cmd += '-DCONFIG_DOCUMENTATION=y'
1240 if 'CONFIG_GTK' in config_host
1241 nsis_cmd += '-DCONFIG_GTK=y'
1244 nsis = custom_target('nsis',
1245 output: 'qemu-setup-' + meson.project_version() + '.exe',
1246 input: files('qemu.nsi'),
1247 build_always_stale: true,
1248 command: nsis_cmd + ['@INPUT@'])
1249 alias_target('installer', nsis)
1253 summary_info += {'Install prefix': config_host['prefix']}
1254 summary_info += {'BIOS directory': config_host['qemu_datadir']}
1255 summary_info += {'firmware path': config_host['qemu_firmwarepath']}
1256 summary_info += {'binary directory': config_host['bindir']}
1257 summary_info += {'library directory': config_host['libdir']}
1258 summary_info += {'module directory': config_host['qemu_moddir']}
1259 summary_info += {'libexec directory': config_host['libexecdir']}
1260 summary_info += {'include directory': config_host['includedir']}
1261 summary_info += {'config directory': config_host['sysconfdir']}
1262 if targetos != 'windows'
1263 summary_info += {'local state directory': config_host['qemu_localstatedir']}
1264 summary_info += {'Manual directory': get_option('mandir')}
1266 summary_info += {'local state directory': 'queried at runtime'}
1268 summary_info += {'Doc directory': get_option('docdir')}
1269 summary_info += {'Build directory': meson.current_build_dir()}
1270 summary_info += {'Source path': meson.current_source_dir()}
1271 summary_info += {'GIT binary': config_host['GIT']}
1272 summary_info += {'GIT submodules': config_host['GIT_SUBMODULES']}
1273 summary_info += {'C compiler': meson.get_compiler('c').cmd_array()[0]}
1274 summary_info += {'Host C compiler': meson.get_compiler('c', native: true).cmd_array()[0]}
1275 if link_language == 'cpp'
1276 summary_info += {'C++ compiler': meson.get_compiler('cpp').cmd_array()[0]}
1278 summary_info += {'C++ compiler': false}
1280 if targetos == 'darwin'
1281 summary_info += {'Objective-C compiler': meson.get_compiler('objc').cmd_array()[0]}
1283 summary_info += {'ARFLAGS': config_host['ARFLAGS']}
1284 summary_info += {'CFLAGS': config_host['CFLAGS']}
1285 summary_info += {'QEMU_CFLAGS': config_host['QEMU_CFLAGS']}
1286 summary_info += {'QEMU_LDFLAGS': config_host['QEMU_LDFLAGS']}
1287 summary_info += {'make': config_host['MAKE']}
1288 summary_info += {'python': '@0@ (version: @1@)'.format(python.full_path(), python.language_version())}
1289 summary_info += {'sphinx-build': config_host['SPHINX_BUILD']}
1290 summary_info += {'genisoimage': config_host['GENISOIMAGE']}
1291 # TODO: add back version
1292 summary_info += {'slirp support': config_host.has_key('CONFIG_SLIRP')}
1293 if config_host.has_key('CONFIG_SLIRP')
1294 summary_info += {'smbd': config_host['CONFIG_SMBD_COMMAND']}
1296 summary_info += {'module support': config_host.has_key('CONFIG_MODULES')}
1297 if config_host.has_key('CONFIG_MODULES')
1298 summary_info += {'alternative module path': config_host.has_key('CONFIG_MODULE_UPGRADES')}
1300 summary_info += {'host CPU': cpu}
1301 summary_info += {'host endianness': build_machine.endian()}
1302 summary_info += {'target list': config_host['TARGET_DIRS']}
1303 summary_info += {'gprof enabled': config_host.has_key('CONFIG_GPROF')}
1304 summary_info += {'sparse enabled': meson.get_compiler('c').cmd_array().contains('cgcc')}
1305 summary_info += {'strip binaries': get_option('strip')}
1306 summary_info += {'profiler': config_host.has_key('CONFIG_PROFILER')}
1307 summary_info += {'static build': config_host.has_key('CONFIG_STATIC')}
1308 if targetos == 'darwin'
1309 summary_info += {'Cocoa support': config_host.has_key('CONFIG_COCOA')}
1311 # TODO: add back version
1312 summary_info += {'SDL support': sdl.found()}
1313 summary_info += {'SDL image support': sdl_image.found()}
1314 # TODO: add back version
1315 summary_info += {'GTK support': config_host.has_key('CONFIG_GTK')}
1316 summary_info += {'GTK GL support': config_host.has_key('CONFIG_GTK_GL')}
1317 summary_info += {'pixman': pixman.found()}
1318 # TODO: add back version
1319 summary_info += {'VTE support': config_host.has_key('CONFIG_VTE')}
1320 summary_info += {'TLS priority': config_host['CONFIG_TLS_PRIORITY']}
1321 summary_info += {'GNUTLS support': config_host.has_key('CONFIG_GNUTLS')}
1322 # TODO: add back version
1323 summary_info += {'libgcrypt': config_host.has_key('CONFIG_GCRYPT')}
1324 if config_host.has_key('CONFIG_GCRYPT')
1325 summary_info += {' hmac': config_host.has_key('CONFIG_GCRYPT_HMAC')}
1326 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
1328 # TODO: add back version
1329 summary_info += {'nettle': config_host.has_key('CONFIG_NETTLE')}
1330 if config_host.has_key('CONFIG_NETTLE')
1331 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
1333 summary_info += {'libtasn1': config_host.has_key('CONFIG_TASN1')}
1334 summary_info += {'PAM': config_host.has_key('CONFIG_AUTH_PAM')}
1335 summary_info += {'iconv support': config_host.has_key('CONFIG_ICONV')}
1336 summary_info += {'curses support': config_host.has_key('CONFIG_CURSES')}
1337 # TODO: add back version
1338 summary_info += {'virgl support': config_host.has_key('CONFIG_VIRGL')}
1339 summary_info += {'curl support': config_host.has_key('CONFIG_CURL')}
1340 summary_info += {'mingw32 support': targetos == 'windows'}
1341 summary_info += {'Audio drivers': config_host['CONFIG_AUDIO_DRIVERS']}
1342 summary_info += {'Block whitelist (rw)': config_host['CONFIG_BDRV_RW_WHITELIST']}
1343 summary_info += {'Block whitelist (ro)': config_host['CONFIG_BDRV_RO_WHITELIST']}
1344 summary_info += {'VirtFS support': config_host.has_key('CONFIG_VIRTFS')}
1345 summary_info += {'Multipath support': config_host.has_key('CONFIG_MPATH')}
1346 summary_info += {'VNC support': vnc.found()}
1348 summary_info += {'VNC SASL support': sasl.found()}
1349 summary_info += {'VNC JPEG support': jpeg.found()}
1350 summary_info += {'VNC PNG support': png.found()}
1352 summary_info += {'xen support': config_host.has_key('CONFIG_XEN_BACKEND')}
1353 if config_host.has_key('CONFIG_XEN_BACKEND')
1354 summary_info += {'xen ctrl version': config_host['CONFIG_XEN_CTRL_INTERFACE_VERSION']}
1356 summary_info += {'brlapi support': config_host.has_key('CONFIG_BRLAPI')}
1357 summary_info += {'Documentation': config_host.has_key('BUILD_DOCS')}
1358 summary_info += {'PIE': get_option('b_pie')}
1359 summary_info += {'vde support': config_host.has_key('CONFIG_VDE')}
1360 summary_info += {'netmap support': config_host.has_key('CONFIG_NETMAP')}
1361 summary_info += {'Linux AIO support': config_host.has_key('CONFIG_LINUX_AIO')}
1362 summary_info += {'Linux io_uring support': config_host.has_key('CONFIG_LINUX_IO_URING')}
1363 summary_info += {'ATTR/XATTR support': config_host.has_key('CONFIG_ATTR')}
1364 summary_info += {'Install blobs': config_host.has_key('INSTALL_BLOBS')}
1365 # TODO: add back KVM/HAX/HVF/WHPX/TCG
1366 #summary_info += {'KVM support': have_kvm'}
1367 #summary_info += {'HAX support': have_hax'}
1368 #summary_info += {'HVF support': have_hvf'}
1369 #summary_info += {'WHPX support': have_whpx'}
1370 #summary_info += {'TCG support': have_tcg'}
1371 #if get_option('tcg')
1372 # summary_info += {'TCG debug enabled': config_host.has_key('CONFIG_DEBUG_TCG')}
1373 # summary_info += {'TCG interpreter': config_host.has_key('CONFIG_TCG_INTERPRETER')}
1375 summary_info += {'malloc trim support': config_host.has_key('CONFIG_MALLOC_TRIM')}
1376 summary_info += {'RDMA support': config_host.has_key('CONFIG_RDMA')}
1377 summary_info += {'PVRDMA support': config_host.has_key('CONFIG_PVRDMA')}
1378 summary_info += {'fdt support': config_host.has_key('CONFIG_FDT')}
1379 summary_info += {'membarrier': config_host.has_key('CONFIG_MEMBARRIER')}
1380 summary_info += {'preadv support': config_host.has_key('CONFIG_PREADV')}
1381 summary_info += {'fdatasync': config_host.has_key('CONFIG_FDATASYNC')}
1382 summary_info += {'madvise': config_host.has_key('CONFIG_MADVISE')}
1383 summary_info += {'posix_madvise': config_host.has_key('CONFIG_POSIX_MADVISE')}
1384 summary_info += {'posix_memalign': config_host.has_key('CONFIG_POSIX_MEMALIGN')}
1385 summary_info += {'libcap-ng support': config_host.has_key('CONFIG_LIBCAP_NG')}
1386 summary_info += {'vhost-net support': config_host.has_key('CONFIG_VHOST_NET')}
1387 summary_info += {'vhost-crypto support': config_host.has_key('CONFIG_VHOST_CRYPTO')}
1388 summary_info += {'vhost-scsi support': config_host.has_key('CONFIG_VHOST_SCSI')}
1389 summary_info += {'vhost-vsock support': config_host.has_key('CONFIG_VHOST_VSOCK')}
1390 summary_info += {'vhost-user support': config_host.has_key('CONFIG_VHOST_KERNEL')}
1391 summary_info += {'vhost-user-fs support': config_host.has_key('CONFIG_VHOST_USER_FS')}
1392 summary_info += {'vhost-vdpa support': config_host.has_key('CONFIG_VHOST_VDPA')}
1393 summary_info += {'Trace backends': config_host['TRACE_BACKENDS']}
1394 if config_host['TRACE_BACKENDS'].split().contains('simple')
1395 summary_info += {'Trace output file': config_host['CONFIG_TRACE_FILE'] + '-<pid>'}
1397 # TODO: add back protocol and server version
1398 summary_info += {'spice support': config_host.has_key('CONFIG_SPICE')}
1399 summary_info += {'rbd support': config_host.has_key('CONFIG_RBD')}
1400 summary_info += {'xfsctl support': config_host.has_key('CONFIG_XFS')}
1401 summary_info += {'smartcard support': config_host.has_key('CONFIG_SMARTCARD')}
1402 summary_info += {'U2F support': u2f.found()}
1403 summary_info += {'libusb': config_host.has_key('CONFIG_USB_LIBUSB')}
1404 summary_info += {'usb net redir': config_host.has_key('CONFIG_USB_REDIR')}
1405 summary_info += {'OpenGL support': config_host.has_key('CONFIG_OPENGL')}
1406 summary_info += {'OpenGL dmabufs': config_host.has_key('CONFIG_OPENGL_DMABUF')}
1407 summary_info += {'libiscsi support': config_host.has_key('CONFIG_LIBISCSI')}
1408 summary_info += {'libnfs support': config_host.has_key('CONFIG_LIBNFS')}
1409 summary_info += {'build guest agent': config_host.has_key('CONFIG_GUEST_AGENT')}
1410 if targetos == 'windows'
1411 if 'WIN_SDK' in config_host
1412 summary_info += {'Windows SDK': config_host['WIN_SDK']}
1414 summary_info += {'QGA VSS support': config_host.has_key('CONFIG_QGA_VSS')}
1415 summary_info += {'QGA w32 disk info': config_host.has_key('CONFIG_QGA_NTDDSCSI')}
1416 summary_info += {'QGA MSI support': config_host.has_key('CONFIG_QGA_MSI')}
1418 summary_info += {'seccomp support': config_host.has_key('CONFIG_SECCOMP')}
1419 summary_info += {'coroutine backend': config_host['CONFIG_COROUTINE_BACKEND']}
1420 summary_info += {'coroutine pool': config_host['CONFIG_COROUTINE_POOL'] == '1'}
1421 summary_info += {'debug stack usage': config_host.has_key('CONFIG_DEBUG_STACK_USAGE')}
1422 summary_info += {'mutex debugging': config_host.has_key('CONFIG_DEBUG_MUTEX')}
1423 summary_info += {'crypto afalg': config_host.has_key('CONFIG_AF_ALG')}
1424 summary_info += {'GlusterFS support': config_host.has_key('CONFIG_GLUSTERFS')}
1425 summary_info += {'gcov': get_option('b_coverage')}
1426 summary_info += {'TPM support': config_host.has_key('CONFIG_TPM')}
1427 summary_info += {'libssh support': config_host.has_key('CONFIG_LIBSSH')}
1428 summary_info += {'QOM debugging': config_host.has_key('CONFIG_QOM_CAST_DEBUG')}
1429 summary_info += {'Live block migration': config_host.has_key('CONFIG_LIVE_BLOCK_MIGRATION')}
1430 summary_info += {'lzo support': config_host.has_key('CONFIG_LZO')}
1431 summary_info += {'snappy support': config_host.has_key('CONFIG_SNAPPY')}
1432 summary_info += {'bzip2 support': config_host.has_key('CONFIG_BZIP2')}
1433 summary_info += {'lzfse support': config_host.has_key('CONFIG_LZFSE')}
1434 summary_info += {'zstd support': config_host.has_key('CONFIG_ZSTD')}
1435 summary_info += {'NUMA host support': config_host.has_key('CONFIG_NUMA')}
1436 summary_info += {'libxml2': config_host.has_key('CONFIG_LIBXML2')}
1437 summary_info += {'tcmalloc support': config_host.has_key('CONFIG_TCMALLOC')}
1438 summary_info += {'jemalloc support': config_host.has_key('CONFIG_JEMALLOC')}
1439 summary_info += {'avx2 optimization': config_host.has_key('CONFIG_AVX2_OPT')}
1440 summary_info += {'avx512f optimization': config_host.has_key('CONFIG_AVX512F_OPT')}
1441 summary_info += {'replication support': config_host.has_key('CONFIG_REPLICATION')}
1442 summary_info += {'bochs support': config_host.has_key('CONFIG_BOCHS')}
1443 summary_info += {'cloop support': config_host.has_key('CONFIG_CLOOP')}
1444 summary_info += {'dmg support': config_host.has_key('CONFIG_DMG')}
1445 summary_info += {'qcow v1 support': config_host.has_key('CONFIG_QCOW1')}
1446 summary_info += {'vdi support': config_host.has_key('CONFIG_VDI')}
1447 summary_info += {'vvfat support': config_host.has_key('CONFIG_VVFAT')}
1448 summary_info += {'qed support': config_host.has_key('CONFIG_QED')}
1449 summary_info += {'parallels support': config_host.has_key('CONFIG_PARALLELS')}
1450 summary_info += {'sheepdog support': config_host.has_key('CONFIG_SHEEPDOG')}
1451 summary_info += {'capstone': config_host.has_key('CONFIG_CAPSTONE')}
1452 summary_info += {'libpmem support': config_host.has_key('CONFIG_LIBPMEM')}
1453 summary_info += {'libdaxctl support': config_host.has_key('CONFIG_LIBDAXCTL')}
1454 summary_info += {'libudev': libudev.found()}
1455 summary_info += {'default devices': config_host['CONFIG_MINIKCONF_MODE'] == '--defconfig'}
1456 summary_info += {'plugin support': config_host.has_key('CONFIG_PLUGIN')}
1457 summary_info += {'fuzzing support': config_host.has_key('CONFIG_FUZZ')}
1458 if config_host.has_key('HAVE_GDB_BIN')
1459 summary_info += {'gdb': config_host['HAVE_GDB_BIN']}
1461 summary_info += {'thread sanitizer': config_host.has_key('CONFIG_TSAN')}
1462 summary_info += {'rng-none': config_host.has_key('CONFIG_RNG_NONE')}
1463 summary_info += {'Linux keyring': config_host.has_key('CONFIG_SECRET_KEYRING')}
1464 summary(summary_info, bool_yn: true)
1466 if not supported_cpus.contains(cpu)
1468 warning('SUPPORT FOR THIS HOST CPU WILL GO AWAY IN FUTURE RELEASES!')
1470 message('CPU host architecture ' + cpu + ' support is not currently maintained.')
1471 message('The QEMU project intends to remove support for this host CPU in')
1472 message('a future release if nobody volunteers to maintain it and to')
1473 message('provide a build host for our continuous integration setup.')
1474 message('configure has succeeded and you can continue to build, but')
1475 message('if you care about QEMU on this platform you should contact')
1476 message('us upstream at qemu-devel@nongnu.org.')
1479 if not supported_oses.contains(targetos)
1481 warning('WARNING: SUPPORT FOR THIS HOST OS WILL GO AWAY IN FUTURE RELEASES!')
1483 message('Host OS ' + targetos + 'support is not currently maintained.')
1484 message('The QEMU project intends to remove support for this host OS in')
1485 message('a future release if nobody volunteers to maintain it and to')
1486 message('provide a build host for our continuous integration setup.')
1487 message('configure has succeeded and you can continue to build, but')
1488 message('if you care about QEMU on this platform you should contact')
1489 message('us upstream at qemu-devel@nongnu.org.')