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')
15 sh = find_program('sh')
16 cc = meson.get_compiler('c')
17 config_host = keyval.load(meson.current_build_dir() / 'config-host.mak')
18 enable_modules = 'CONFIG_MODULES' in config_host
19 enable_static = 'CONFIG_STATIC' in config_host
20 build_docs = 'BUILD_DOCS' in config_host
22 if get_option('qemu_suffix').startswith('/')
23 error('qemu_suffix cannot start with a /')
26 qemu_datadir = get_option('datadir') / get_option('qemu_suffix')
27 qemu_docdir = get_option('docdir') / get_option('qemu_suffix')
28 config_host_data = configuration_data()
31 target_dirs = config_host['TARGET_DIRS'].split()
34 foreach target : target_dirs
35 have_user = have_user or target.endswith('-user')
36 have_system = have_system or target.endswith('-softmmu')
38 have_tools = 'CONFIG_TOOLS' in config_host
39 have_block = have_system or have_tools
41 python = import('python').find_installation()
43 supported_oses = ['windows', 'freebsd', 'netbsd', 'openbsd', 'darwin', 'sunos', 'linux']
44 supported_cpus = ['ppc', 'ppc64', 's390x', 'riscv32', 'riscv64', 'x86', 'x86_64',
45 'arm', 'aarch64', 'mips', 'mips64', 'sparc', 'sparc64']
47 cpu = host_machine.cpu_family()
48 targetos = host_machine.system()
50 configure_file(input: files('scripts/ninjatool.py'),
52 configuration: config_host)
54 if cpu in ['x86', 'x86_64']
55 kvm_targets = ['i386-softmmu', 'x86_64-softmmu']
57 kvm_targets = ['aarch64-softmmu']
59 kvm_targets = ['s390x-softmmu']
60 elif cpu in ['ppc', 'ppc64']
61 kvm_targets = ['ppc-softmmu', 'ppc64-softmmu']
62 elif cpu in ['mips', 'mips64']
63 kvm_targets = ['mips-softmmu', 'mipsel-softmmu', 'mips64-softmmu', 'mips64el-softmmu']
68 accelerator_targets = { 'CONFIG_KVM': kvm_targets }
69 if cpu in ['x86', 'x86_64']
70 accelerator_targets += {
71 'CONFIG_HAX': ['i386-softmmu', 'x86_64-softmmu'],
72 'CONFIG_XEN': ['i386-softmmu', 'x86_64-softmmu'],
73 'CONFIG_HVF': ['x86_64-softmmu'],
74 'CONFIG_WHPX': ['i386-softmmu', 'x86_64-softmmu'],
82 # Specify linker-script with add_project_link_arguments so that it is not placed
83 # within a linker --start-group/--end-group pair
84 if 'CONFIG_FUZZ' in config_host
85 add_project_link_arguments(['-Wl,-T,',
86 (meson.current_source_dir() / 'tests/qtest/fuzz/fork_fuzz.ld')],
87 native: false, language: ['c', 'cpp', 'objc'])
90 add_project_arguments(config_host['QEMU_CFLAGS'].split(),
91 native: false, language: ['c', 'objc'])
92 add_project_arguments(config_host['QEMU_CXXFLAGS'].split(),
93 native: false, language: 'cpp')
94 add_project_link_arguments(config_host['QEMU_LDFLAGS'].split(),
95 native: false, language: ['c', 'cpp', 'objc'])
96 add_project_arguments(config_host['QEMU_INCLUDES'].split(),
97 language: ['c', 'cpp', 'objc'])
100 link_language = meson.get_external_property('link_language', 'cpp')
101 if link_language == 'cpp'
102 add_languages('cpp', required: true, native: false)
104 if host_machine.system() == 'darwin'
105 add_languages('objc', required: false, native: false)
108 sparse = find_program('cgcc', required: get_option('sparse'))
111 command: [find_program('scripts/check_sparse.py'),
112 'compile_commands.json', sparse.full_path(), '-Wbitwise',
113 '-Wno-transparent-union', '-Wno-old-initializer',
114 '-Wno-non-pointer-null'])
117 ###########################################
118 # Target-specific checks and dependencies #
119 ###########################################
121 if targetos != 'linux' and get_option('mpath').enabled()
122 error('Multipath is supported only on Linux')
125 m = cc.find_library('m', required: false)
126 util = cc.find_library('util', required: false)
132 emulator_link_args = []
135 if targetos == 'windows'
136 socket = cc.find_library('ws2_32')
137 winmm = cc.find_library('winmm')
139 win = import('windows')
140 version_res = win.compile_resources('version.rc',
141 depend_files: files('pc-bios/qemu-nsis.ico'),
142 include_directories: include_directories('.'))
143 elif targetos == 'darwin'
144 coref = dependency('appleframeworks', modules: 'CoreFoundation')
145 iokit = dependency('appleframeworks', modules: 'IOKit')
146 cocoa = dependency('appleframeworks', modules: 'Cocoa', required: get_option('cocoa'))
147 elif targetos == 'sunos'
148 socket = [cc.find_library('socket'),
149 cc.find_library('nsl'),
150 cc.find_library('resolv')]
151 elif targetos == 'haiku'
152 socket = [cc.find_library('posix_error_mapper'),
153 cc.find_library('network'),
154 cc.find_library('bsd')]
155 elif targetos == 'openbsd'
156 if not get_option('tcg').disabled() and target_dirs.length() > 0
157 # Disable OpenBSD W^X if available
158 emulator_link_args = cc.get_supported_link_arguments('-Wl,-z,wxneeded')
163 if not get_option('kvm').disabled() and targetos == 'linux'
164 accelerators += 'CONFIG_KVM'
166 if not get_option('xen').disabled() and 'CONFIG_XEN_BACKEND' in config_host
167 accelerators += 'CONFIG_XEN'
168 have_xen_pci_passthrough = not get_option('xen_pci_passthrough').disabled() and targetos == 'linux'
170 have_xen_pci_passthrough = false
172 if not get_option('whpx').disabled() and targetos == 'windows'
173 if get_option('whpx').enabled() and cpu != 'x86_64'
174 error('WHPX requires 64-bit host')
175 elif cc.has_header('WinHvPlatform.h', required: get_option('whpx')) and \
176 cc.has_header('WinHvEmulation.h', required: get_option('whpx'))
177 accelerators += 'CONFIG_WHPX'
180 if not get_option('hvf').disabled()
181 hvf = dependency('appleframeworks', modules: 'Hypervisor',
182 required: get_option('hvf'))
184 accelerators += 'CONFIG_HVF'
187 if not get_option('hax').disabled()
188 if get_option('hax').enabled() or targetos in ['windows', 'darwin', 'netbsd']
189 accelerators += 'CONFIG_HAX'
192 if not get_option('tcg').disabled()
193 if cpu not in supported_cpus
194 if 'CONFIG_TCG_INTERPRETER' in config_host
195 warning('Unsupported CPU @0@, will use TCG with TCI (experimental)'.format(cpu))
197 error('Unsupported CPU @0@, try --enable-tcg-interpreter'.format(cpu))
200 accelerators += 'CONFIG_TCG'
201 config_host += { 'CONFIG_TCG': 'y' }
204 if 'CONFIG_KVM' not in accelerators and get_option('kvm').enabled()
205 error('KVM not available on this platform')
207 if 'CONFIG_HVF' not in accelerators and get_option('hvf').enabled()
208 error('HVF not available on this platform')
210 if 'CONFIG_WHPX' not in accelerators and get_option('whpx').enabled()
211 error('WHPX not available on this platform')
213 if not have_xen_pci_passthrough and get_option('xen_pci_passthrough').enabled()
214 if 'CONFIG_XEN' in accelerators
215 error('Xen PCI passthrough not available on this platform')
217 error('Xen PCI passthrough requested but Xen not enabled')
220 if not cocoa.found() and get_option('cocoa').enabled()
221 error('Cocoa not available on this platform')
228 # The path to glib.h is added to all compilation commands. This was
229 # grandfathered in from the QEMU Makefiles.
230 add_project_arguments(config_host['GLIB_CFLAGS'].split(),
231 native: false, language: ['c', 'cpp', 'objc'])
232 glib = declare_dependency(link_args: config_host['GLIB_LIBS'].split())
234 if 'CONFIG_GIO' in config_host
235 gio = declare_dependency(compile_args: config_host['GIO_CFLAGS'].split(),
236 link_args: config_host['GIO_LIBS'].split())
239 if 'CONFIG_TRACE_UST' in config_host
240 lttng = declare_dependency(link_args: config_host['LTTNG_UST_LIBS'].split())
243 if 'CONFIG_TRACE_UST' in config_host
244 urcubp = declare_dependency(link_args: config_host['URCU_BP_LIBS'].split())
247 if 'CONFIG_GCRYPT' in config_host
248 gcrypt = declare_dependency(compile_args: config_host['GCRYPT_CFLAGS'].split(),
249 link_args: config_host['GCRYPT_LIBS'].split())
252 if 'CONFIG_NETTLE' in config_host
253 nettle = declare_dependency(compile_args: config_host['NETTLE_CFLAGS'].split(),
254 link_args: config_host['NETTLE_LIBS'].split())
257 if 'CONFIG_GNUTLS' in config_host
258 gnutls = declare_dependency(compile_args: config_host['GNUTLS_CFLAGS'].split(),
259 link_args: config_host['GNUTLS_LIBS'].split())
262 if have_system or have_tools
263 pixman = dependency('pixman-1', required: have_system, version:'>=0.21.8',
264 method: 'pkg-config', static: enable_static)
267 if 'CONFIG_AUTH_PAM' in config_host
268 pam = cc.find_library('pam')
270 libaio = cc.find_library('aio', required: false)
271 zlib = dependency('zlib', required: true, static: enable_static)
272 linux_io_uring = not_found
273 if 'CONFIG_LINUX_IO_URING' in config_host
274 linux_io_uring = declare_dependency(compile_args: config_host['LINUX_IO_URING_CFLAGS'].split(),
275 link_args: config_host['LINUX_IO_URING_LIBS'].split())
278 if 'CONFIG_LIBXML2' in config_host
279 libxml2 = declare_dependency(compile_args: config_host['LIBXML2_CFLAGS'].split(),
280 link_args: config_host['LIBXML2_LIBS'].split())
283 if 'CONFIG_LIBNFS' in config_host
284 libnfs = declare_dependency(link_args: config_host['LIBNFS_LIBS'].split())
287 if 'CONFIG_ATTR' in config_host
288 libattr = declare_dependency(link_args: config_host['LIBATTR_LIBS'].split())
291 if 'CONFIG_SECCOMP' in config_host
292 seccomp = declare_dependency(compile_args: config_host['SECCOMP_CFLAGS'].split(),
293 link_args: config_host['SECCOMP_LIBS'].split())
295 libcap_ng = not_found
296 if 'CONFIG_LIBCAP_NG' in config_host
297 libcap_ng = declare_dependency(link_args: config_host['LIBCAP_NG_LIBS'].split())
299 if get_option('xkbcommon').auto() and not have_system and not have_tools
300 xkbcommon = not_found
302 xkbcommon = dependency('xkbcommon', required: get_option('xkbcommon'),
303 method: 'pkg-config', static: enable_static)
306 if config_host.has_key('CONFIG_VDE')
307 vde = declare_dependency(link_args: config_host['VDE_LIBS'].split())
310 if 'CONFIG_LIBPULSE' in config_host
311 pulse = declare_dependency(compile_args: config_host['PULSE_CFLAGS'].split(),
312 link_args: config_host['PULSE_LIBS'].split())
315 if 'CONFIG_ALSA' in config_host
316 alsa = declare_dependency(compile_args: config_host['ALSA_CFLAGS'].split(),
317 link_args: config_host['ALSA_LIBS'].split())
320 if 'CONFIG_LIBJACK' in config_host
321 jack = declare_dependency(link_args: config_host['JACK_LIBS'].split())
324 if 'CONFIG_SPICE' in config_host
325 spice = declare_dependency(compile_args: config_host['SPICE_CFLAGS'].split(),
326 link_args: config_host['SPICE_LIBS'].split())
328 rt = cc.find_library('rt', required: false)
330 if 'CONFIG_PLUGIN' in config_host
331 libdl = cc.find_library('dl', required: true)
334 if 'CONFIG_LIBISCSI' in config_host
335 libiscsi = declare_dependency(compile_args: config_host['LIBISCSI_CFLAGS'].split(),
336 link_args: config_host['LIBISCSI_LIBS'].split())
339 if 'CONFIG_ZSTD' in config_host
340 zstd = declare_dependency(compile_args: config_host['ZSTD_CFLAGS'].split(),
341 link_args: config_host['ZSTD_LIBS'].split())
344 if 'CONFIG_GBM' in config_host
345 gbm = declare_dependency(compile_args: config_host['GBM_CFLAGS'].split(),
346 link_args: config_host['GBM_LIBS'].split())
349 if 'CONFIG_VIRGL' in config_host
350 virgl = declare_dependency(compile_args: config_host['VIRGL_CFLAGS'].split(),
351 link_args: config_host['VIRGL_LIBS'].split())
354 if 'CONFIG_CURL' in config_host
355 curl = declare_dependency(compile_args: config_host['CURL_CFLAGS'].split(),
356 link_args: config_host['CURL_LIBS'].split())
359 if targetos == 'linux' and (have_system or have_tools)
360 libudev = dependency('libudev',
361 required: get_option('mpath').enabled(),
362 static: enable_static)
365 mpathpersist = not_found
366 mpathpersist_new_api = false
367 if targetos == 'linux' and have_tools and not get_option('mpath').disabled()
368 mpath_test_source_new = '''
370 #include <mpath_persist.h>
371 unsigned mpath_mx_alloc_len = 1024;
373 static struct config *multipath_conf;
374 extern struct udev *udev;
375 extern struct config *get_multipath_config(void);
376 extern void put_multipath_config(struct config *conf);
378 struct config *get_multipath_config(void) { return multipath_conf; }
379 void put_multipath_config(struct config *conf) { }
382 multipath_conf = mpath_lib_init();
385 mpath_test_source_old = '''
387 #include <mpath_persist.h>
388 unsigned mpath_mx_alloc_len = 1024;
391 struct udev *udev = udev_new();
392 mpath_lib_init(udev);
395 mpathlibs = [libudev]
397 mpathlibs += cc.find_library('devmapper',
398 required: get_option('mpath'),
399 static: enable_static)
401 mpathlibs += cc.find_library('multipath',
402 required: get_option('mpath'),
403 static: enable_static)
404 mpathlibs += cc.find_library('mpathpersist',
405 required: get_option('mpath'),
406 static: enable_static)
407 foreach lib: mpathlibs
413 if mpathlibs.length() > 0
414 if cc.links(mpath_test_source_new, dependencies: mpathlibs)
415 mpathpersist = declare_dependency(dependencies: mpathlibs)
416 mpathpersist_new_api = true
417 elif cc.links(mpath_test_source_old, dependencies: mpathlibs)
418 mpathpersist = declare_dependency(dependencies: mpathlibs)
420 if get_option('mpath').enabled()
421 error('Cannot detect libmpathpersist API')
423 warning('Cannot detect libmpathpersist API, disabling')
430 if 'CONFIG_BRLAPI' in config_host
431 brlapi = declare_dependency(link_args: config_host['BRLAPI_LIBS'].split())
436 sdl = dependency('sdl2', required: get_option('sdl'), static: enable_static)
437 sdl_image = not_found
440 # work around 2.0.8 bug
441 sdl = declare_dependency(compile_args: '-Wno-undef',
443 sdl_image = dependency('SDL2_image', required: get_option('sdl_image'),
444 method: 'pkg-config', static: enable_static)
446 if get_option('sdl_image').enabled()
447 error('sdl-image required, but SDL was @0@'.format(
448 get_option('sdl').disabled() ? 'disabled' : 'not found'))
450 sdl_image = not_found
454 if 'CONFIG_RBD' in config_host
455 rbd = declare_dependency(link_args: config_host['RBD_LIBS'].split())
457 glusterfs = not_found
458 if 'CONFIG_GLUSTERFS' in config_host
459 glusterfs = declare_dependency(compile_args: config_host['GLUSTERFS_CFLAGS'].split(),
460 link_args: config_host['GLUSTERFS_LIBS'].split())
463 if 'CONFIG_LIBSSH' in config_host
464 libssh = declare_dependency(compile_args: config_host['LIBSSH_CFLAGS'].split(),
465 link_args: config_host['LIBSSH_LIBS'].split())
468 if 'CONFIG_BZIP2' in config_host
469 libbzip2 = declare_dependency(link_args: config_host['BZIP2_LIBS'].split())
472 if 'CONFIG_LZFSE' in config_host
473 liblzfse = declare_dependency(link_args: config_host['LZFSE_LIBS'].split())
476 if 'CONFIG_AUDIO_OSS' in config_host
477 oss = declare_dependency(link_args: config_host['OSS_LIBS'].split())
480 if 'CONFIG_AUDIO_DSOUND' in config_host
481 dsound = declare_dependency(link_args: config_host['DSOUND_LIBS'].split())
483 coreaudio = not_found
484 if 'CONFIG_AUDIO_COREAUDIO' in config_host
485 coreaudio = declare_dependency(link_args: config_host['COREAUDIO_LIBS'].split())
488 if 'CONFIG_OPENGL' in config_host
489 opengl = declare_dependency(compile_args: config_host['OPENGL_CFLAGS'].split(),
490 link_args: config_host['OPENGL_LIBS'].split())
493 if 'CONFIG_GTK' in config_host
494 gtk = declare_dependency(compile_args: config_host['GTK_CFLAGS'].split(),
495 link_args: config_host['GTK_LIBS'].split())
498 if 'CONFIG_VTE' in config_host
499 vte = declare_dependency(compile_args: config_host['VTE_CFLAGS'].split(),
500 link_args: config_host['VTE_LIBS'].split())
503 if 'CONFIG_X11' in config_host
504 x11 = declare_dependency(compile_args: config_host['X11_CFLAGS'].split(),
505 link_args: config_host['X11_LIBS'].split())
508 if 'CONFIG_CURSES' in config_host
509 curses = declare_dependency(compile_args: config_host['CURSES_CFLAGS'].split(),
510 link_args: config_host['CURSES_LIBS'].split())
513 if 'CONFIG_ICONV' in config_host
514 iconv = declare_dependency(compile_args: config_host['ICONV_CFLAGS'].split(),
515 link_args: config_host['ICONV_LIBS'].split())
521 if get_option('vnc').enabled()
522 vnc = declare_dependency() # dummy dependency
523 png = dependency('libpng', required: get_option('vnc_png'),
524 method: 'pkg-config', static: enable_static)
525 jpeg = cc.find_library('jpeg', has_headers: ['jpeglib.h'],
526 required: get_option('vnc_jpeg'),
527 static: enable_static)
528 sasl = cc.find_library('sasl2', has_headers: ['sasl/sasl.h'],
529 required: get_option('vnc_sasl'),
530 static: enable_static)
532 sasl = declare_dependency(dependencies: sasl,
533 compile_args: '-DSTRUCT_IOVEC_DEFINED')
537 if 'CONFIG_SNAPPY' in config_host
538 snappy = declare_dependency(link_args: config_host['SNAPPY_LIBS'].split())
541 if 'CONFIG_LZO' in config_host
542 lzo = declare_dependency(link_args: config_host['LZO_LIBS'].split())
545 if 'CONFIG_RDMA' in config_host
546 rdma = declare_dependency(link_args: config_host['RDMA_LIBS'].split())
549 if 'CONFIG_NUMA' in config_host
550 numa = declare_dependency(link_args: config_host['NUMA_LIBS'].split())
553 if 'CONFIG_XEN_BACKEND' in config_host
554 xen = declare_dependency(compile_args: config_host['XEN_CFLAGS'].split(),
555 link_args: config_host['XEN_LIBS'].split())
558 if 'CONFIG_SMARTCARD' in config_host
559 cacard = declare_dependency(compile_args: config_host['SMARTCARD_CFLAGS'].split(),
560 link_args: config_host['SMARTCARD_LIBS'].split())
564 u2f = dependency('u2f-emu', required: get_option('u2f'),
565 method: 'pkg-config',
566 static: enable_static)
569 if 'CONFIG_USB_REDIR' in config_host
570 usbredir = declare_dependency(compile_args: config_host['USB_REDIR_CFLAGS'].split(),
571 link_args: config_host['USB_REDIR_LIBS'].split())
574 if 'CONFIG_USB_LIBUSB' in config_host
575 libusb = declare_dependency(compile_args: config_host['LIBUSB_CFLAGS'].split(),
576 link_args: config_host['LIBUSB_LIBS'].split())
579 if 'CONFIG_LIBPMEM' in config_host
580 libpmem = declare_dependency(compile_args: config_host['LIBPMEM_CFLAGS'].split(),
581 link_args: config_host['LIBPMEM_LIBS'].split())
583 libdaxctl = not_found
584 if 'CONFIG_LIBDAXCTL' in config_host
585 libdaxctl = declare_dependency(link_args: config_host['LIBDAXCTL_LIBS'].split())
588 if 'CONFIG_TASN1' in config_host
589 tasn1 = declare_dependency(compile_args: config_host['TASN1_CFLAGS'].split(),
590 link_args: config_host['TASN1_LIBS'].split())
592 keyutils = dependency('libkeyutils', required: false,
593 method: 'pkg-config', static: enable_static)
595 has_gettid = cc.has_function('gettid')
600 if get_option('malloc') == 'system'
602 not get_option('malloc_trim').disabled() and \
603 cc.links('''#include <malloc.h>
604 int main(void) { malloc_trim(0); return 0; }''')
606 has_malloc_trim = false
607 malloc = cc.find_library(get_option('malloc'), required: true)
609 if not has_malloc_trim and get_option('malloc_trim').enabled()
610 if get_option('malloc') == 'system'
611 error('malloc_trim not available on this platform.')
613 error('malloc_trim not available with non-libc memory allocator')
621 config_host_data.set('CONFIG_COCOA', cocoa.found())
622 config_host_data.set('CONFIG_LIBUDEV', libudev.found())
623 config_host_data.set('CONFIG_MPATH', mpathpersist.found())
624 config_host_data.set('CONFIG_MPATH_NEW_API', mpathpersist_new_api)
625 config_host_data.set('CONFIG_SDL', sdl.found())
626 config_host_data.set('CONFIG_SDL_IMAGE', sdl_image.found())
627 config_host_data.set('CONFIG_VNC', vnc.found())
628 config_host_data.set('CONFIG_VNC_JPEG', jpeg.found())
629 config_host_data.set('CONFIG_VNC_PNG', png.found())
630 config_host_data.set('CONFIG_VNC_SASL', sasl.found())
631 config_host_data.set('CONFIG_XKBCOMMON', xkbcommon.found())
632 config_host_data.set('CONFIG_KEYUTILS', keyutils.found())
633 config_host_data.set('CONFIG_GETTID', has_gettid)
634 config_host_data.set('CONFIG_MALLOC_TRIM', has_malloc_trim)
635 config_host_data.set('QEMU_VERSION', '"@0@"'.format(meson.project_version()))
636 config_host_data.set('QEMU_VERSION_MAJOR', meson.project_version().split('.')[0])
637 config_host_data.set('QEMU_VERSION_MINOR', meson.project_version().split('.')[1])
638 config_host_data.set('QEMU_VERSION_MICRO', meson.project_version().split('.')[2])
640 ignored = ['CONFIG_QEMU_INTERP_PREFIX'] # actually per-target
641 arrays = ['CONFIG_AUDIO_DRIVERS', 'CONFIG_BDRV_RW_WHITELIST', 'CONFIG_BDRV_RO_WHITELIST']
642 strings = ['HOST_DSOSUF', 'CONFIG_IASL', 'bindir', 'prefix', 'qemu_confdir', 'qemu_datadir',
643 'qemu_moddir', 'qemu_localstatedir', 'qemu_helperdir', 'qemu_localedir',
644 'qemu_icondir', 'qemu_desktopdir', 'qemu_firmwarepath', 'sysconfdir']
645 foreach k, v: config_host
646 if ignored.contains(k)
648 elif arrays.contains(k)
650 v = '"' + '", "'.join(v.split()) + '", '
652 config_host_data.set(k, v)
654 config_host_data.set('HOST_' + v.to_upper(), 1)
655 elif strings.contains(k)
656 if not k.startswith('CONFIG_')
657 k = 'CONFIG_' + k.to_upper()
659 config_host_data.set_quoted(k, v)
660 elif k.startswith('CONFIG_') or k.startswith('HAVE_') or k.startswith('HOST_')
661 config_host_data.set(k, v == 'y' ? 1 : v)
665 ########################
666 # Target configuration #
667 ########################
669 minikconf = find_program('scripts/minikconf.py')
671 config_all_devices = {}
672 config_all_disas = {}
673 config_devices_mak_list = []
674 config_devices_h = {}
676 config_target_mak = {}
679 'alpha' : ['CONFIG_ALPHA_DIS'],
680 'arm' : ['CONFIG_ARM_DIS'],
681 'avr' : ['CONFIG_AVR_DIS'],
682 'cris' : ['CONFIG_CRIS_DIS'],
683 'hppa' : ['CONFIG_HPPA_DIS'],
684 'i386' : ['CONFIG_I386_DIS'],
685 'x86_64' : ['CONFIG_I386_DIS'],
686 'x32' : ['CONFIG_I386_DIS'],
687 'lm32' : ['CONFIG_LM32_DIS'],
688 'm68k' : ['CONFIG_M68K_DIS'],
689 'microblaze' : ['CONFIG_MICROBLAZE_DIS'],
690 'mips' : ['CONFIG_MIPS_DIS'],
691 'moxie' : ['CONFIG_MOXIE_DIS'],
692 'nios2' : ['CONFIG_NIOS2_DIS'],
693 'or1k' : ['CONFIG_OPENRISC_DIS'],
694 'ppc' : ['CONFIG_PPC_DIS'],
695 'riscv' : ['CONFIG_RISCV_DIS'],
696 'rx' : ['CONFIG_RX_DIS'],
697 's390' : ['CONFIG_S390_DIS'],
698 'sh4' : ['CONFIG_SH4_DIS'],
699 'sparc' : ['CONFIG_SPARC_DIS'],
700 'xtensa' : ['CONFIG_XTENSA_DIS'],
702 if link_language == 'cpp'
704 'aarch64' : [ 'CONFIG_ARM_A64_DIS'],
705 'arm' : [ 'CONFIG_ARM_DIS', 'CONFIG_ARM_A64_DIS'],
706 'mips' : [ 'CONFIG_MIPS_DIS', 'CONFIG_NANOMIPS_DIS'],
710 kconfig_external_symbols = [
720 'CONFIG_VHOST_KERNEL',
725 ignored = [ 'TARGET_XML_FILES', 'TARGET_ABI_DIR', 'TARGET_ARCH' ]
727 default_targets = 'CONFIG_DEFAULT_TARGETS' in config_host
728 actual_target_dirs = []
730 foreach target : target_dirs
731 config_target = { 'TARGET_NAME': target.split('-')[0] }
732 if target.endswith('linux-user')
733 if targetos != 'linux'
737 error('Target @0@ is only available on a Linux host'.format(target))
739 config_target += { 'CONFIG_LINUX_USER': 'y' }
740 elif target.endswith('bsd-user')
741 if 'CONFIG_BSD' not in config_host
745 error('Target @0@ is only available on a BSD host'.format(target))
747 config_target += { 'CONFIG_BSD_USER': 'y' }
748 elif target.endswith('softmmu')
749 config_target += { 'CONFIG_SOFTMMU': 'y' }
751 if target.endswith('-user')
753 'CONFIG_USER_ONLY': 'y',
754 'CONFIG_QEMU_INTERP_PREFIX':
755 config_host['CONFIG_QEMU_INTERP_PREFIX'].format(config_target['TARGET_NAME'])
760 foreach sym: accelerators
761 if sym == 'CONFIG_TCG' or target in accelerator_targets.get(sym, [])
762 config_target += { sym: 'y' }
763 config_all += { sym: 'y' }
764 if sym == 'CONFIG_XEN' and have_xen_pci_passthrough
765 config_target += { 'CONFIG_XEN_PCI_PASSTHROUGH': 'y' }
774 error('No accelerator available for target @0@'.format(target))
777 actual_target_dirs += target
778 config_target += keyval.load('default-configs/targets' / target + '.mak')
779 config_target += { 'TARGET_' + config_target['TARGET_ARCH'].to_upper(): 'y' }
781 if 'TARGET_NEED_FDT' in config_target
782 fdt_required += target
786 if 'TARGET_BASE_ARCH' not in config_target
787 config_target += {'TARGET_BASE_ARCH': config_target['TARGET_ARCH']}
789 if 'TARGET_ABI_DIR' not in config_target
790 config_target += {'TARGET_ABI_DIR': config_target['TARGET_ARCH']}
793 foreach k, v: disassemblers
794 if config_host['ARCH'].startswith(k) or config_target['TARGET_BASE_ARCH'].startswith(k)
796 config_target += { sym: 'y' }
797 config_all_disas += { sym: 'y' }
802 config_target_data = configuration_data()
803 foreach k, v: config_target
804 if not k.startswith('TARGET_') and not k.startswith('CONFIG_')
806 elif ignored.contains(k)
808 elif k == 'TARGET_BASE_ARCH'
809 # Note that TARGET_BASE_ARCH ends up in config-target.h but it is
810 # not used to select files from sourcesets.
811 config_target_data.set('TARGET_' + v.to_upper(), 1)
812 elif k == 'TARGET_NAME' or k == 'CONFIG_QEMU_INTERP_PREFIX'
813 config_target_data.set_quoted(k, v)
815 config_target_data.set(k, 1)
817 config_target_data.set(k, v)
820 config_target_h += {target: configure_file(output: target + '-config-target.h',
821 configuration: config_target_data)}
823 if target.endswith('-softmmu')
825 foreach sym : kconfig_external_symbols
826 if sym in config_target or sym in config_host
827 base_kconfig += '@0@=y'.format(sym)
831 config_devices_mak = target + '-config-devices.mak'
832 config_devices_mak = configure_file(
833 input: ['default-configs/devices' / target + '.mak', 'Kconfig'],
834 output: config_devices_mak,
835 depfile: config_devices_mak + '.d',
837 command: [minikconf, config_host['CONFIG_MINIKCONF_MODE'],
838 config_devices_mak, '@DEPFILE@', '@INPUT@',
841 config_devices_data = configuration_data()
842 config_devices = keyval.load(config_devices_mak)
843 foreach k, v: config_devices
844 config_devices_data.set(k, 1)
846 config_devices_mak_list += config_devices_mak
847 config_devices_h += {target: configure_file(output: target + '-config-devices.h',
848 configuration: config_devices_data)}
849 config_target += config_devices
850 config_all_devices += config_devices
852 config_target_mak += {target: config_target}
854 target_dirs = actual_target_dirs
856 # This configuration is used to build files that are shared by
857 # multiple binaries, and then extracted out of the "common"
858 # static_library target.
860 # We do not use all_sources()/all_dependencies(), because it would
861 # build literally all source files, including devices only used by
862 # targets that are not built for this compilation. The CONFIG_ALL
863 # pseudo symbol replaces it.
865 config_all += config_all_devices
866 config_all += config_host
867 config_all += config_all_disas
869 'CONFIG_XEN': config_host.has_key('CONFIG_XEN_BACKEND'),
870 'CONFIG_SOFTMMU': have_system,
871 'CONFIG_USER_ONLY': have_user,
880 capstone_opt = get_option('capstone')
881 if capstone_opt in ['enabled', 'auto', 'system']
882 have_internal = fs.exists(meson.current_source_dir() / 'capstone/Makefile')
883 capstone = dependency('capstone', version: '>=4.0',
884 static: enable_static, method: 'pkg-config',
885 required: capstone_opt == 'system' or
886 capstone_opt == 'enabled' and not have_internal)
888 capstone_opt = 'system'
890 capstone_opt = 'internal'
892 capstone_opt = 'disabled'
895 if capstone_opt == 'internal'
896 capstone_data = configuration_data()
897 capstone_data.set('CAPSTONE_USE_SYS_DYN_MEM', '1')
899 capstone_files = files(
902 'capstone/MCInstrDesc.c',
903 'capstone/MCRegisterInfo.c',
904 'capstone/SStream.c',
908 if 'CONFIG_ARM_DIS' in config_all_disas
909 capstone_data.set('CAPSTONE_HAS_ARM', '1')
910 capstone_files += files(
911 'capstone/arch/ARM/ARMDisassembler.c',
912 'capstone/arch/ARM/ARMInstPrinter.c',
913 'capstone/arch/ARM/ARMMapping.c',
914 'capstone/arch/ARM/ARMModule.c'
918 # FIXME: This config entry currently depends on a c++ compiler.
919 # Which is needed for building libvixl, but not for capstone.
920 if 'CONFIG_ARM_A64_DIS' in config_all_disas
921 capstone_data.set('CAPSTONE_HAS_ARM64', '1')
922 capstone_files += files(
923 'capstone/arch/AArch64/AArch64BaseInfo.c',
924 'capstone/arch/AArch64/AArch64Disassembler.c',
925 'capstone/arch/AArch64/AArch64InstPrinter.c',
926 'capstone/arch/AArch64/AArch64Mapping.c',
927 'capstone/arch/AArch64/AArch64Module.c'
931 if 'CONFIG_PPC_DIS' in config_all_disas
932 capstone_data.set('CAPSTONE_HAS_POWERPC', '1')
933 capstone_files += files(
934 'capstone/arch/PowerPC/PPCDisassembler.c',
935 'capstone/arch/PowerPC/PPCInstPrinter.c',
936 'capstone/arch/PowerPC/PPCMapping.c',
937 'capstone/arch/PowerPC/PPCModule.c'
941 if 'CONFIG_S390_DIS' in config_all_disas
942 capstone_data.set('CAPSTONE_HAS_SYSZ', '1')
943 capstone_files += files(
944 'capstone/arch/SystemZ/SystemZDisassembler.c',
945 'capstone/arch/SystemZ/SystemZInstPrinter.c',
946 'capstone/arch/SystemZ/SystemZMapping.c',
947 'capstone/arch/SystemZ/SystemZModule.c',
948 'capstone/arch/SystemZ/SystemZMCTargetDesc.c'
952 if 'CONFIG_I386_DIS' in config_all_disas
953 capstone_data.set('CAPSTONE_HAS_X86', 1)
954 capstone_files += files(
955 'capstone/arch/X86/X86Disassembler.c',
956 'capstone/arch/X86/X86DisassemblerDecoder.c',
957 'capstone/arch/X86/X86ATTInstPrinter.c',
958 'capstone/arch/X86/X86IntelInstPrinter.c',
959 'capstone/arch/X86/X86InstPrinterCommon.c',
960 'capstone/arch/X86/X86Mapping.c',
961 'capstone/arch/X86/X86Module.c'
965 configure_file(output: 'capstone-defs.h', configuration: capstone_data)
968 # FIXME: There does not seem to be a way to completely replace the c_args
969 # that come from add_project_arguments() -- we can only add to them.
970 # So: disable all warnings with a big hammer.
973 # Include all configuration defines via a header file, which will wind up
974 # as a dependency on the object file, and thus changes here will result
976 '-include', 'capstone-defs.h'
979 libcapstone = static_library('capstone',
980 sources: capstone_files,
981 c_args: capstone_cargs,
982 include_directories: 'capstone/include')
983 capstone = declare_dependency(link_with: libcapstone,
984 include_directories: 'capstone/include/capstone')
988 slirp_opt = 'disabled'
990 slirp_opt = get_option('slirp')
991 if slirp_opt in ['enabled', 'auto', 'system']
992 have_internal = fs.exists(meson.current_source_dir() / 'slirp/meson.build')
993 slirp = dependency('slirp', static: enable_static,
994 method: 'pkg-config',
995 required: slirp_opt == 'system' or
996 slirp_opt == 'enabled' and not have_internal)
1000 slirp_opt = 'internal'
1002 slirp_opt = 'disabled'
1005 if slirp_opt == 'internal'
1007 if targetos == 'windows'
1008 slirp_deps = cc.find_library('iphlpapi')
1010 slirp_conf = configuration_data()
1011 slirp_conf.set('SLIRP_MAJOR_VERSION', meson.project_version().split('.')[0])
1012 slirp_conf.set('SLIRP_MINOR_VERSION', meson.project_version().split('.')[1])
1013 slirp_conf.set('SLIRP_MICRO_VERSION', meson.project_version().split('.')[2])
1014 slirp_conf.set_quoted('SLIRP_VERSION_STRING', meson.project_version())
1015 slirp_cargs = ['-DG_LOG_DOMAIN="Slirp"']
1017 'slirp/src/arp_table.c',
1018 'slirp/src/bootp.c',
1019 'slirp/src/cksum.c',
1020 'slirp/src/dhcpv6.c',
1021 'slirp/src/dnssearch.c',
1023 'slirp/src/ip6_icmp.c',
1024 'slirp/src/ip6_input.c',
1025 'slirp/src/ip6_output.c',
1026 'slirp/src/ip_icmp.c',
1027 'slirp/src/ip_input.c',
1028 'slirp/src/ip_output.c',
1032 'slirp/src/ndp_table.c',
1034 'slirp/src/slirp.c',
1035 'slirp/src/socket.c',
1036 'slirp/src/state.c',
1037 'slirp/src/stream.c',
1038 'slirp/src/tcp_input.c',
1039 'slirp/src/tcp_output.c',
1040 'slirp/src/tcp_subr.c',
1041 'slirp/src/tcp_timer.c',
1046 'slirp/src/version.c',
1047 'slirp/src/vmstate.c',
1051 input : 'slirp/src/libslirp-version.h.in',
1052 output : 'libslirp-version.h',
1053 configuration: slirp_conf)
1055 slirp_inc = include_directories('slirp', 'slirp/src')
1056 libslirp = static_library('slirp',
1057 sources: slirp_files,
1058 c_args: slirp_cargs,
1059 include_directories: slirp_inc)
1060 slirp = declare_dependency(link_with: libslirp,
1061 dependencies: slirp_deps,
1062 include_directories: slirp_inc)
1067 fdt_opt = get_option('fdt')
1069 if fdt_opt in ['enabled', 'auto', 'system']
1070 have_internal = fs.exists(meson.current_source_dir() / 'dtc/libfdt/Makefile.libfdt')
1071 fdt = cc.find_library('fdt', static: enable_static,
1072 required: fdt_opt == 'system' or
1073 fdt_opt == 'enabled' and not have_internal)
1074 if fdt.found() and cc.links('''
1076 #include <libfdt_env.h>
1077 int main(void) { fdt_check_full(NULL, 0); return 0; }''',
1081 fdt_opt = 'internal'
1083 fdt_opt = 'disabled'
1086 if fdt_opt == 'internal'
1089 'dtc/libfdt/fdt_ro.c',
1090 'dtc/libfdt/fdt_wip.c',
1091 'dtc/libfdt/fdt_sw.c',
1092 'dtc/libfdt/fdt_rw.c',
1093 'dtc/libfdt/fdt_strerror.c',
1094 'dtc/libfdt/fdt_empty_tree.c',
1095 'dtc/libfdt/fdt_addresses.c',
1096 'dtc/libfdt/fdt_overlay.c',
1097 'dtc/libfdt/fdt_check.c',
1100 fdt_inc = include_directories('dtc/libfdt')
1101 libfdt = static_library('fdt',
1103 include_directories: fdt_inc)
1104 fdt = declare_dependency(link_with: libfdt,
1105 include_directories: fdt_inc)
1108 if not fdt.found() and fdt_required.length() > 0
1109 error('fdt not available but required by targets ' + ', '.join(fdt_required))
1112 config_host_data.set('CONFIG_CAPSTONE', capstone.found())
1113 config_host_data.set('CONFIG_FDT', fdt.found())
1114 config_host_data.set('CONFIG_SLIRP', slirp.found())
1116 #####################
1117 # Generated sources #
1118 #####################
1120 genh += configure_file(output: 'config-host.h', configuration: config_host_data)
1122 hxtool = find_program('scripts/hxtool')
1123 shaderinclude = find_program('scripts/shaderinclude.pl')
1124 qapi_gen = find_program('scripts/qapi-gen.py')
1125 qapi_gen_depends = [ meson.source_root() / 'scripts/qapi/__init__.py',
1126 meson.source_root() / 'scripts/qapi/commands.py',
1127 meson.source_root() / 'scripts/qapi/common.py',
1128 meson.source_root() / 'scripts/qapi/error.py',
1129 meson.source_root() / 'scripts/qapi/events.py',
1130 meson.source_root() / 'scripts/qapi/expr.py',
1131 meson.source_root() / 'scripts/qapi/gen.py',
1132 meson.source_root() / 'scripts/qapi/introspect.py',
1133 meson.source_root() / 'scripts/qapi/parser.py',
1134 meson.source_root() / 'scripts/qapi/schema.py',
1135 meson.source_root() / 'scripts/qapi/source.py',
1136 meson.source_root() / 'scripts/qapi/types.py',
1137 meson.source_root() / 'scripts/qapi/visit.py',
1138 meson.source_root() / 'scripts/qapi/common.py',
1139 meson.source_root() / 'scripts/qapi-gen.py'
1143 python, files('scripts/tracetool.py'),
1144 '--backend=' + config_host['TRACE_BACKENDS']
1147 qemu_version_cmd = [find_program('scripts/qemu-version.sh'),
1148 meson.current_source_dir(),
1149 config_host['PKGVERSION'], meson.project_version()]
1150 qemu_version = custom_target('qemu-version.h',
1151 output: 'qemu-version.h',
1152 command: qemu_version_cmd,
1154 build_by_default: true,
1155 build_always_stale: true)
1156 genh += qemu_version
1160 ['qemu-options.hx', 'qemu-options.def'],
1161 ['qemu-img-cmds.hx', 'qemu-img-cmds.h'],
1165 ['hmp-commands.hx', 'hmp-commands.h'],
1166 ['hmp-commands-info.hx', 'hmp-commands-info.h'],
1169 foreach d : hx_headers
1170 hxdep += custom_target(d[1],
1174 build_by_default: true, # to be removed when added to a target
1175 command: [hxtool, '-h', '@INPUT0@'])
1179 SPHINX_ARGS = [config_host['SPHINX_BUILD'],
1180 '-Dversion=' + meson.project_version(),
1181 '-Drelease=' + config_host['PKGVERSION']]
1183 if get_option('werror')
1184 SPHINX_ARGS += [ '-W' ]
1187 sphinx_extn_depends = [ meson.source_root() / 'docs/sphinx/depfile.py',
1188 meson.source_root() / 'docs/sphinx/hxtool.py',
1189 meson.source_root() / 'docs/sphinx/kerneldoc.py',
1190 meson.source_root() / 'docs/sphinx/kernellog.py',
1191 meson.source_root() / 'docs/sphinx/qapidoc.py',
1192 meson.source_root() / 'docs/sphinx/qmp_lexer.py',
1199 authz_ss = ss.source_set()
1200 blockdev_ss = ss.source_set()
1201 block_ss = ss.source_set()
1202 bsd_user_ss = ss.source_set()
1203 chardev_ss = ss.source_set()
1204 common_ss = ss.source_set()
1205 crypto_ss = ss.source_set()
1206 io_ss = ss.source_set()
1207 linux_user_ss = ss.source_set()
1208 qmp_ss = ss.source_set()
1209 qom_ss = ss.source_set()
1210 softmmu_ss = ss.source_set()
1211 specific_fuzz_ss = ss.source_set()
1212 specific_ss = ss.source_set()
1213 stub_ss = ss.source_set()
1214 trace_ss = ss.source_set()
1215 user_ss = ss.source_set()
1216 util_ss = ss.source_set()
1221 target_softmmu_arch = {}
1227 # TODO: add each directory to the subdirs from its own meson.build, once
1229 trace_events_subdirs = [
1236 trace_events_subdirs += [ 'linux-user' ]
1239 trace_events_subdirs += [
1248 trace_events_subdirs += [
1259 'hw/block/dataplane',
1304 trace_events_subdirs += [
1331 libmodulecommon = static_library('module-common', files('module-common.c') + genh, pic: true, c_args: '-DBUILD_DSO')
1332 modulecommon = declare_dependency(link_whole: libmodulecommon, compile_args: '-DBUILD_DSO')
1335 stub_ss = stub_ss.apply(config_all, strict: false)
1337 util_ss.add_all(trace_ss)
1338 util_ss = util_ss.apply(config_all, strict: false)
1339 libqemuutil = static_library('qemuutil',
1340 sources: util_ss.sources() + stub_ss.sources() + genh,
1341 dependencies: [util_ss.dependencies(), m, glib, socket, malloc])
1342 qemuutil = declare_dependency(link_with: libqemuutil,
1343 sources: genh + version_res)
1345 decodetree = generator(find_program('scripts/decodetree.py'),
1346 output: 'decode-@BASENAME@.c.inc',
1347 arguments: ['@INPUT@', '@EXTRA_ARGS@', '-o', '@OUTPUT@'])
1353 subdir('libdecnumber')
1364 block_ss.add(when: 'CONFIG_REPLICATION', if_true: files('replication.c'))
1370 blockdev_ss.add(files(
1376 # os-posix.c contains POSIX-specific functions used by qemu-storage-daemon,
1377 # os-win32.c does not
1378 blockdev_ss.add(when: 'CONFIG_POSIX', if_true: files('os-posix.c'))
1379 softmmu_ss.add(when: 'CONFIG_WIN32', if_true: [files('os-win32.c')])
1380 softmmu_ss.add_all(blockdev_ss)
1382 common_ss.add(files('cpus-common.c'))
1386 common_ss.add(capstone)
1387 specific_ss.add(files('cpu.c', 'disas.c', 'gdbstub.c'), capstone)
1388 specific_ss.add(files('exec-vary.c'))
1389 specific_ss.add(when: 'CONFIG_TCG', if_true: files(
1393 'tcg/tcg-op-gvec.c',
1398 specific_ss.add(when: 'CONFIG_TCG_INTERPRETER', if_true: files('disas/tci.c', 'tcg/tci.c'))
1410 subdir('linux-user')
1412 bsd_user_ss.add(files('gdbstub.c'))
1413 specific_ss.add_all(when: 'CONFIG_BSD_USER', if_true: bsd_user_ss)
1415 linux_user_ss.add(files('gdbstub.c', 'thunk.c'))
1416 specific_ss.add_all(when: 'CONFIG_LINUX_USER', if_true: linux_user_ss)
1418 # needed for fuzzing binaries
1419 subdir('tests/qtest/libqos')
1420 subdir('tests/qtest/fuzz')
1422 ########################
1423 # Library dependencies #
1424 ########################
1428 foreach d, list : modules
1429 foreach m, module_ss : list
1430 if enable_modules and targetos != 'windows'
1431 module_ss = module_ss.apply(config_all, strict: false)
1432 sl = static_library(d + '-' + m, [genh, module_ss.sources()],
1433 dependencies: [modulecommon, module_ss.dependencies()], pic: true)
1441 block_ss.add_all(module_ss)
1443 softmmu_ss.add_all(module_ss)
1449 nm = find_program('nm')
1450 undefsym = find_program('scripts/undefsym.py')
1451 block_syms = custom_target('block.syms', output: 'block.syms',
1452 input: [libqemuutil, block_mods],
1454 command: [undefsym, nm, '@INPUT@'])
1455 qemu_syms = custom_target('qemu.syms', output: 'qemu.syms',
1456 input: [libqemuutil, softmmu_mods],
1458 command: [undefsym, nm, '@INPUT@'])
1460 qom_ss = qom_ss.apply(config_host, strict: false)
1461 libqom = static_library('qom', qom_ss.sources() + genh,
1462 dependencies: [qom_ss.dependencies()],
1465 qom = declare_dependency(link_whole: libqom)
1467 authz_ss = authz_ss.apply(config_host, strict: false)
1468 libauthz = static_library('authz', authz_ss.sources() + genh,
1469 dependencies: [authz_ss.dependencies()],
1471 build_by_default: false)
1473 authz = declare_dependency(link_whole: libauthz,
1476 crypto_ss = crypto_ss.apply(config_host, strict: false)
1477 libcrypto = static_library('crypto', crypto_ss.sources() + genh,
1478 dependencies: [crypto_ss.dependencies()],
1480 build_by_default: false)
1482 crypto = declare_dependency(link_whole: libcrypto,
1483 dependencies: [authz, qom])
1485 io_ss = io_ss.apply(config_host, strict: false)
1486 libio = static_library('io', io_ss.sources() + genh,
1487 dependencies: [io_ss.dependencies()],
1488 link_with: libqemuutil,
1490 build_by_default: false)
1492 io = declare_dependency(link_whole: libio, dependencies: [crypto, qom])
1494 libmigration = static_library('migration', sources: migration_files + genh,
1496 build_by_default: false)
1497 migration = declare_dependency(link_with: libmigration,
1498 dependencies: [zlib, qom, io])
1499 softmmu_ss.add(migration)
1501 block_ss = block_ss.apply(config_host, strict: false)
1502 libblock = static_library('block', block_ss.sources() + genh,
1503 dependencies: block_ss.dependencies(),
1504 link_depends: block_syms,
1506 build_by_default: false)
1508 block = declare_dependency(link_whole: [libblock],
1509 link_args: '@block.syms',
1510 dependencies: [crypto, io])
1512 qmp_ss = qmp_ss.apply(config_host, strict: false)
1513 libqmp = static_library('qmp', qmp_ss.sources() + genh,
1514 dependencies: qmp_ss.dependencies(),
1516 build_by_default: false)
1518 qmp = declare_dependency(link_whole: [libqmp])
1520 libchardev = static_library('chardev', chardev_ss.sources() + genh,
1522 build_by_default: false)
1524 chardev = declare_dependency(link_whole: libchardev)
1526 libhwcore = static_library('hwcore', sources: hwcore_files + genh,
1528 build_by_default: false)
1529 hwcore = declare_dependency(link_whole: libhwcore)
1530 common_ss.add(hwcore)
1536 foreach m : block_mods + softmmu_mods
1537 shared_module(m.name(),
1541 install_dir: config_host['qemu_moddir'])
1544 softmmu_ss.add(authz, block, chardev, crypto, io, qmp)
1545 common_ss.add(qom, qemuutil)
1547 common_ss.add_all(when: 'CONFIG_SOFTMMU', if_true: [softmmu_ss])
1548 common_ss.add_all(when: 'CONFIG_USER_ONLY', if_true: user_ss)
1550 common_all = common_ss.apply(config_all, strict: false)
1551 common_all = static_library('common',
1552 build_by_default: false,
1553 sources: common_all.sources() + genh,
1554 dependencies: common_all.dependencies(),
1557 feature_to_c = find_program('scripts/feature_to_c.sh')
1560 foreach target : target_dirs
1561 config_target = config_target_mak[target]
1562 target_name = config_target['TARGET_NAME']
1563 arch = config_target['TARGET_BASE_ARCH']
1564 arch_srcs = [config_target_h[target]]
1566 c_args = ['-DNEED_CPU_H',
1567 '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
1568 '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)]
1569 link_args = emulator_link_args
1571 config_target += config_host
1572 target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
1573 if targetos == 'linux'
1574 target_inc += include_directories('linux-headers', is_system: true)
1576 if target.endswith('-softmmu')
1577 qemu_target_name = 'qemu-system-' + target_name
1578 target_type='system'
1579 t = target_softmmu_arch[arch].apply(config_target, strict: false)
1580 arch_srcs += t.sources()
1581 arch_deps += t.dependencies()
1583 hw_dir = target_name == 'sparc64' ? 'sparc64' : arch
1584 hw = hw_arch[hw_dir].apply(config_target, strict: false)
1585 arch_srcs += hw.sources()
1586 arch_deps += hw.dependencies()
1588 arch_srcs += config_devices_h[target]
1589 link_args += ['@block.syms', '@qemu.syms']
1591 abi = config_target['TARGET_ABI_DIR']
1593 qemu_target_name = 'qemu-' + target_name
1594 if 'CONFIG_LINUX_USER' in config_target
1595 base_dir = 'linux-user'
1596 target_inc += include_directories('linux-user/host/' / config_host['ARCH'])
1598 base_dir = 'bsd-user'
1600 target_inc += include_directories(
1604 if 'CONFIG_LINUX_USER' in config_target
1605 dir = base_dir / abi
1606 arch_srcs += files(dir / 'signal.c', dir / 'cpu_loop.c')
1607 if config_target.has_key('TARGET_SYSTBL_ABI')
1609 syscall_nr_generators[abi].process(base_dir / abi / config_target['TARGET_SYSTBL'],
1610 extra_args : config_target['TARGET_SYSTBL_ABI'])
1615 if 'TARGET_XML_FILES' in config_target
1616 gdbstub_xml = custom_target(target + '-gdbstub-xml.c',
1617 output: target + '-gdbstub-xml.c',
1618 input: files(config_target['TARGET_XML_FILES'].split()),
1619 command: [feature_to_c, '@INPUT@'],
1621 arch_srcs += gdbstub_xml
1624 t = target_arch[arch].apply(config_target, strict: false)
1625 arch_srcs += t.sources()
1626 arch_deps += t.dependencies()
1628 target_common = common_ss.apply(config_target, strict: false)
1629 objects = common_all.extract_objects(target_common.sources())
1630 deps = target_common.dependencies()
1632 target_specific = specific_ss.apply(config_target, strict: false)
1633 arch_srcs += target_specific.sources()
1634 arch_deps += target_specific.dependencies()
1636 lib = static_library('qemu-' + target,
1637 sources: arch_srcs + genh,
1638 dependencies: arch_deps,
1640 include_directories: target_inc,
1642 build_by_default: false,
1645 if target.endswith('-softmmu')
1647 'name': 'qemu-system-' + target_name,
1649 'sources': files('softmmu/main.c'),
1652 if targetos == 'windows' and (sdl.found() or gtk.found())
1654 'name': 'qemu-system-' + target_name + 'w',
1656 'sources': files('softmmu/main.c'),
1660 if config_host.has_key('CONFIG_FUZZ')
1661 specific_fuzz = specific_fuzz_ss.apply(config_target, strict: false)
1663 'name': 'qemu-fuzz-' + target_name,
1665 'sources': specific_fuzz.sources(),
1666 'dependencies': specific_fuzz.dependencies(),
1671 'name': 'qemu-' + target_name,
1678 emulators += {exe['name']:
1679 executable(exe['name'], exe['sources'],
1682 dependencies: arch_deps + deps + exe['dependencies'],
1683 objects: lib.extract_all_objects(recursive: true),
1684 link_language: link_language,
1685 link_depends: [block_syms, qemu_syms] + exe.get('link_depends', []),
1686 link_args: link_args,
1687 gui_app: exe['gui'])
1690 if 'CONFIG_TRACE_SYSTEMTAP' in config_host
1692 {'ext': '.stp-build', 'fmt': 'stap', 'bin': meson.current_build_dir() / exe['name'], 'install': false},
1693 {'ext': '.stp', 'fmt': 'stap', 'bin': get_option('prefix') / get_option('bindir') / exe['name'], 'install': true},
1694 {'ext': '-simpletrace.stp', 'fmt': 'simpletrace-stap', 'bin': '', 'install': true},
1695 {'ext': '-log.stp', 'fmt': 'log-stap', 'bin': '', 'install': true},
1697 custom_target(exe['name'] + stp['ext'],
1698 input: trace_events_all,
1699 output: exe['name'] + stp['ext'],
1701 install: stp['install'],
1702 install_dir: qemu_datadir / '../systemtap/tapset',
1704 tracetool, '--group=all', '--format=' + stp['fmt'],
1705 '--binary=' + stp['bin'],
1706 '--target-name=' + target_name,
1707 '--target-type=' + target_type,
1708 '--probe-prefix=qemu.' + target_type + '.' + target_name,
1716 # Other build targets
1718 if 'CONFIG_PLUGIN' in config_host
1719 install_headers('include/qemu/qemu-plugin.h')
1722 if 'CONFIG_GUEST_AGENT' in config_host
1726 # Don't build qemu-keymap if xkbcommon is not explicitly enabled
1727 # when we don't build tools or system
1728 if xkbcommon.found()
1729 # used for the update-keymaps target, so include rules even if !have_tools
1730 qemu_keymap = executable('qemu-keymap', files('qemu-keymap.c', 'ui/input-keymap.c') + genh,
1731 dependencies: [qemuutil, xkbcommon], install: have_tools)
1735 qemu_img = executable('qemu-img', [files('qemu-img.c'), hxdep],
1736 dependencies: [authz, block, crypto, io, qom, qemuutil], install: true)
1737 qemu_io = executable('qemu-io', files('qemu-io.c'),
1738 dependencies: [block, qemuutil], install: true)
1739 qemu_nbd = executable('qemu-nbd', files('qemu-nbd.c'),
1740 dependencies: [block, qemuutil], install: true)
1742 subdir('storage-daemon')
1743 subdir('contrib/rdmacm-mux')
1744 subdir('contrib/elf2dmp')
1746 executable('qemu-edid', files('qemu-edid.c', 'hw/display/edid-generate.c'),
1747 dependencies: qemuutil,
1750 if 'CONFIG_VHOST_USER' in config_host
1751 subdir('contrib/libvhost-user')
1752 subdir('contrib/vhost-user-blk')
1753 subdir('contrib/vhost-user-gpu')
1754 subdir('contrib/vhost-user-input')
1755 subdir('contrib/vhost-user-scsi')
1758 if targetos == 'linux'
1759 executable('qemu-bridge-helper', files('qemu-bridge-helper.c'),
1760 dependencies: [qemuutil, libcap_ng],
1762 install_dir: get_option('libexecdir'))
1764 executable('qemu-pr-helper', files('scsi/qemu-pr-helper.c', 'scsi/utils.c'),
1765 dependencies: [authz, crypto, io, qom, qemuutil,
1766 libcap_ng, mpathpersist],
1770 if 'CONFIG_IVSHMEM' in config_host
1771 subdir('contrib/ivshmem-client')
1772 subdir('contrib/ivshmem-server')
1781 if 'CONFIG_GTK' in config_host
1785 if host_machine.system() == 'windows'
1787 find_program('scripts/nsis.py'),
1789 get_option('prefix'),
1790 meson.current_source_dir(),
1791 host_machine.cpu_family(),
1793 '-DDISPLAYVERSION=' + meson.project_version(),
1796 nsis_cmd += '-DCONFIG_DOCUMENTATION=y'
1798 if 'CONFIG_GTK' in config_host
1799 nsis_cmd += '-DCONFIG_GTK=y'
1802 nsis = custom_target('nsis',
1803 output: 'qemu-setup-' + meson.project_version() + '.exe',
1804 input: files('qemu.nsi'),
1805 build_always_stale: true,
1806 command: nsis_cmd + ['@INPUT@'])
1807 alias_target('installer', nsis)
1810 #########################
1811 # Configuration summary #
1812 #########################
1815 summary_info += {'Install prefix': config_host['prefix']}
1816 summary_info += {'BIOS directory': config_host['qemu_datadir']}
1817 summary_info += {'firmware path': config_host['qemu_firmwarepath']}
1818 summary_info += {'binary directory': config_host['bindir']}
1819 summary_info += {'library directory': config_host['libdir']}
1820 summary_info += {'module directory': config_host['qemu_moddir']}
1821 summary_info += {'libexec directory': config_host['libexecdir']}
1822 summary_info += {'include directory': config_host['includedir']}
1823 summary_info += {'config directory': config_host['sysconfdir']}
1824 if targetos != 'windows'
1825 summary_info += {'local state directory': config_host['qemu_localstatedir']}
1826 summary_info += {'Manual directory': get_option('mandir')}
1828 summary_info += {'local state directory': 'queried at runtime'}
1830 summary_info += {'Doc directory': get_option('docdir')}
1831 summary_info += {'Build directory': meson.current_build_dir()}
1832 summary_info += {'Source path': meson.current_source_dir()}
1833 summary_info += {'GIT binary': config_host['GIT']}
1834 summary_info += {'GIT submodules': config_host['GIT_SUBMODULES']}
1835 summary_info += {'C compiler': meson.get_compiler('c').cmd_array()[0]}
1836 summary_info += {'Host C compiler': meson.get_compiler('c', native: true).cmd_array()[0]}
1837 if link_language == 'cpp'
1838 summary_info += {'C++ compiler': meson.get_compiler('cpp').cmd_array()[0]}
1840 summary_info += {'C++ compiler': false}
1842 if targetos == 'darwin'
1843 summary_info += {'Objective-C compiler': meson.get_compiler('objc').cmd_array()[0]}
1845 summary_info += {'ARFLAGS': config_host['ARFLAGS']}
1846 summary_info += {'CFLAGS': ' '.join(get_option('c_args')
1847 + ['-O' + get_option('optimization')]
1848 + (get_option('debug') ? ['-g'] : []))}
1849 if link_language == 'cpp'
1850 summary_info += {'CXXFLAGS': ' '.join(get_option('cpp_args')
1851 + ['-O' + get_option('optimization')]
1852 + (get_option('debug') ? ['-g'] : []))}
1854 link_args = get_option(link_language + '_link_args')
1855 if link_args.length() > 0
1856 summary_info += {'LDFLAGS': ' '.join(link_args)}
1858 summary_info += {'QEMU_CFLAGS': config_host['QEMU_CFLAGS']}
1859 summary_info += {'QEMU_LDFLAGS': config_host['QEMU_LDFLAGS']}
1860 summary_info += {'make': config_host['MAKE']}
1861 summary_info += {'python': '@0@ (version: @1@)'.format(python.full_path(), python.language_version())}
1862 summary_info += {'sphinx-build': config_host['SPHINX_BUILD']}
1863 summary_info += {'genisoimage': config_host['GENISOIMAGE']}
1864 # TODO: add back version
1865 summary_info += {'slirp support': slirp_opt == 'disabled' ? false : slirp_opt}
1866 if slirp_opt != 'disabled'
1867 summary_info += {'smbd': config_host['CONFIG_SMBD_COMMAND']}
1869 summary_info += {'module support': config_host.has_key('CONFIG_MODULES')}
1870 if config_host.has_key('CONFIG_MODULES')
1871 summary_info += {'alternative module path': config_host.has_key('CONFIG_MODULE_UPGRADES')}
1873 summary_info += {'host CPU': cpu}
1874 summary_info += {'host endianness': build_machine.endian()}
1875 summary_info += {'target list': ' '.join(target_dirs)}
1876 summary_info += {'gprof enabled': config_host.has_key('CONFIG_GPROF')}
1877 summary_info += {'sparse enabled': sparse.found()}
1878 summary_info += {'strip binaries': get_option('strip')}
1879 summary_info += {'profiler': config_host.has_key('CONFIG_PROFILER')}
1880 summary_info += {'static build': config_host.has_key('CONFIG_STATIC')}
1881 if targetos == 'darwin'
1882 summary_info += {'Cocoa support': config_host.has_key('CONFIG_COCOA')}
1884 # TODO: add back version
1885 summary_info += {'SDL support': sdl.found()}
1886 summary_info += {'SDL image support': sdl_image.found()}
1887 # TODO: add back version
1888 summary_info += {'GTK support': config_host.has_key('CONFIG_GTK')}
1889 summary_info += {'GTK GL support': config_host.has_key('CONFIG_GTK_GL')}
1890 summary_info += {'pixman': pixman.found()}
1891 # TODO: add back version
1892 summary_info += {'VTE support': config_host.has_key('CONFIG_VTE')}
1893 summary_info += {'TLS priority': config_host['CONFIG_TLS_PRIORITY']}
1894 summary_info += {'GNUTLS support': config_host.has_key('CONFIG_GNUTLS')}
1895 # TODO: add back version
1896 summary_info += {'libgcrypt': config_host.has_key('CONFIG_GCRYPT')}
1897 if config_host.has_key('CONFIG_GCRYPT')
1898 summary_info += {' hmac': config_host.has_key('CONFIG_GCRYPT_HMAC')}
1899 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
1901 # TODO: add back version
1902 summary_info += {'nettle': config_host.has_key('CONFIG_NETTLE')}
1903 if config_host.has_key('CONFIG_NETTLE')
1904 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
1906 summary_info += {'libtasn1': config_host.has_key('CONFIG_TASN1')}
1907 summary_info += {'PAM': config_host.has_key('CONFIG_AUTH_PAM')}
1908 summary_info += {'iconv support': config_host.has_key('CONFIG_ICONV')}
1909 summary_info += {'curses support': config_host.has_key('CONFIG_CURSES')}
1910 # TODO: add back version
1911 summary_info += {'virgl support': config_host.has_key('CONFIG_VIRGL')}
1912 summary_info += {'curl support': config_host.has_key('CONFIG_CURL')}
1913 summary_info += {'mingw32 support': targetos == 'windows'}
1914 summary_info += {'Audio drivers': config_host['CONFIG_AUDIO_DRIVERS']}
1915 summary_info += {'Block whitelist (rw)': config_host['CONFIG_BDRV_RW_WHITELIST']}
1916 summary_info += {'Block whitelist (ro)': config_host['CONFIG_BDRV_RO_WHITELIST']}
1917 summary_info += {'VirtFS support': config_host.has_key('CONFIG_VIRTFS')}
1918 summary_info += {'Multipath support': mpathpersist.found()}
1919 summary_info += {'VNC support': vnc.found()}
1921 summary_info += {'VNC SASL support': sasl.found()}
1922 summary_info += {'VNC JPEG support': jpeg.found()}
1923 summary_info += {'VNC PNG support': png.found()}
1925 summary_info += {'xen support': config_host.has_key('CONFIG_XEN_BACKEND')}
1926 if config_host.has_key('CONFIG_XEN_BACKEND')
1927 summary_info += {'xen ctrl version': config_host['CONFIG_XEN_CTRL_INTERFACE_VERSION']}
1929 summary_info += {'brlapi support': config_host.has_key('CONFIG_BRLAPI')}
1930 summary_info += {'Documentation': config_host.has_key('BUILD_DOCS')}
1931 summary_info += {'PIE': get_option('b_pie')}
1932 summary_info += {'vde support': config_host.has_key('CONFIG_VDE')}
1933 summary_info += {'netmap support': config_host.has_key('CONFIG_NETMAP')}
1934 summary_info += {'Linux AIO support': config_host.has_key('CONFIG_LINUX_AIO')}
1935 summary_info += {'Linux io_uring support': config_host.has_key('CONFIG_LINUX_IO_URING')}
1936 summary_info += {'ATTR/XATTR support': config_host.has_key('CONFIG_ATTR')}
1937 summary_info += {'Install blobs': config_host.has_key('INSTALL_BLOBS')}
1938 summary_info += {'KVM support': config_all.has_key('CONFIG_KVM')}
1939 summary_info += {'HAX support': config_all.has_key('CONFIG_HAX')}
1940 summary_info += {'HVF support': config_all.has_key('CONFIG_HVF')}
1941 summary_info += {'WHPX support': config_all.has_key('CONFIG_WHPX')}
1942 summary_info += {'TCG support': config_all.has_key('CONFIG_TCG')}
1943 if config_all.has_key('CONFIG_TCG')
1944 summary_info += {'TCG debug enabled': config_host.has_key('CONFIG_DEBUG_TCG')}
1945 summary_info += {'TCG interpreter': config_host.has_key('CONFIG_TCG_INTERPRETER')}
1947 summary_info += {'malloc trim support': has_malloc_trim}
1948 summary_info += {'RDMA support': config_host.has_key('CONFIG_RDMA')}
1949 summary_info += {'PVRDMA support': config_host.has_key('CONFIG_PVRDMA')}
1950 summary_info += {'fdt support': fdt_opt == 'disabled' ? false : fdt_opt}
1951 summary_info += {'membarrier': config_host.has_key('CONFIG_MEMBARRIER')}
1952 summary_info += {'preadv support': config_host.has_key('CONFIG_PREADV')}
1953 summary_info += {'fdatasync': config_host.has_key('CONFIG_FDATASYNC')}
1954 summary_info += {'madvise': config_host.has_key('CONFIG_MADVISE')}
1955 summary_info += {'posix_madvise': config_host.has_key('CONFIG_POSIX_MADVISE')}
1956 summary_info += {'posix_memalign': config_host.has_key('CONFIG_POSIX_MEMALIGN')}
1957 summary_info += {'libcap-ng support': config_host.has_key('CONFIG_LIBCAP_NG')}
1958 summary_info += {'vhost-net support': config_host.has_key('CONFIG_VHOST_NET')}
1959 summary_info += {'vhost-crypto support': config_host.has_key('CONFIG_VHOST_CRYPTO')}
1960 summary_info += {'vhost-scsi support': config_host.has_key('CONFIG_VHOST_SCSI')}
1961 summary_info += {'vhost-vsock support': config_host.has_key('CONFIG_VHOST_VSOCK')}
1962 summary_info += {'vhost-user support': config_host.has_key('CONFIG_VHOST_KERNEL')}
1963 summary_info += {'vhost-user-fs support': config_host.has_key('CONFIG_VHOST_USER_FS')}
1964 summary_info += {'vhost-vdpa support': config_host.has_key('CONFIG_VHOST_VDPA')}
1965 summary_info += {'Trace backends': config_host['TRACE_BACKENDS']}
1966 if config_host['TRACE_BACKENDS'].split().contains('simple')
1967 summary_info += {'Trace output file': config_host['CONFIG_TRACE_FILE'] + '-<pid>'}
1969 # TODO: add back protocol and server version
1970 summary_info += {'spice support': config_host.has_key('CONFIG_SPICE')}
1971 summary_info += {'rbd support': config_host.has_key('CONFIG_RBD')}
1972 summary_info += {'xfsctl support': config_host.has_key('CONFIG_XFS')}
1973 summary_info += {'smartcard support': config_host.has_key('CONFIG_SMARTCARD')}
1974 summary_info += {'U2F support': u2f.found()}
1975 summary_info += {'libusb': config_host.has_key('CONFIG_USB_LIBUSB')}
1976 summary_info += {'usb net redir': config_host.has_key('CONFIG_USB_REDIR')}
1977 summary_info += {'OpenGL support': config_host.has_key('CONFIG_OPENGL')}
1978 summary_info += {'OpenGL dmabufs': config_host.has_key('CONFIG_OPENGL_DMABUF')}
1979 summary_info += {'libiscsi support': config_host.has_key('CONFIG_LIBISCSI')}
1980 summary_info += {'libnfs support': config_host.has_key('CONFIG_LIBNFS')}
1981 summary_info += {'build guest agent': config_host.has_key('CONFIG_GUEST_AGENT')}
1982 if targetos == 'windows'
1983 if 'WIN_SDK' in config_host
1984 summary_info += {'Windows SDK': config_host['WIN_SDK']}
1986 summary_info += {'QGA VSS support': config_host.has_key('CONFIG_QGA_VSS')}
1987 summary_info += {'QGA w32 disk info': config_host.has_key('CONFIG_QGA_NTDDSCSI')}
1988 summary_info += {'QGA MSI support': config_host.has_key('CONFIG_QGA_MSI')}
1990 summary_info += {'seccomp support': config_host.has_key('CONFIG_SECCOMP')}
1991 summary_info += {'coroutine backend': config_host['CONFIG_COROUTINE_BACKEND']}
1992 summary_info += {'coroutine pool': config_host['CONFIG_COROUTINE_POOL'] == '1'}
1993 summary_info += {'debug stack usage': config_host.has_key('CONFIG_DEBUG_STACK_USAGE')}
1994 summary_info += {'mutex debugging': config_host.has_key('CONFIG_DEBUG_MUTEX')}
1995 summary_info += {'crypto afalg': config_host.has_key('CONFIG_AF_ALG')}
1996 summary_info += {'GlusterFS support': config_host.has_key('CONFIG_GLUSTERFS')}
1997 summary_info += {'gcov': get_option('b_coverage')}
1998 summary_info += {'TPM support': config_host.has_key('CONFIG_TPM')}
1999 summary_info += {'libssh support': config_host.has_key('CONFIG_LIBSSH')}
2000 summary_info += {'QOM debugging': config_host.has_key('CONFIG_QOM_CAST_DEBUG')}
2001 summary_info += {'Live block migration': config_host.has_key('CONFIG_LIVE_BLOCK_MIGRATION')}
2002 summary_info += {'lzo support': config_host.has_key('CONFIG_LZO')}
2003 summary_info += {'snappy support': config_host.has_key('CONFIG_SNAPPY')}
2004 summary_info += {'bzip2 support': config_host.has_key('CONFIG_BZIP2')}
2005 summary_info += {'lzfse support': config_host.has_key('CONFIG_LZFSE')}
2006 summary_info += {'zstd support': config_host.has_key('CONFIG_ZSTD')}
2007 summary_info += {'NUMA host support': config_host.has_key('CONFIG_NUMA')}
2008 summary_info += {'libxml2': config_host.has_key('CONFIG_LIBXML2')}
2009 summary_info += {'memory allocator': get_option('malloc')}
2010 summary_info += {'avx2 optimization': config_host.has_key('CONFIG_AVX2_OPT')}
2011 summary_info += {'avx512f optimization': config_host.has_key('CONFIG_AVX512F_OPT')}
2012 summary_info += {'replication support': config_host.has_key('CONFIG_REPLICATION')}
2013 summary_info += {'bochs support': config_host.has_key('CONFIG_BOCHS')}
2014 summary_info += {'cloop support': config_host.has_key('CONFIG_CLOOP')}
2015 summary_info += {'dmg support': config_host.has_key('CONFIG_DMG')}
2016 summary_info += {'qcow v1 support': config_host.has_key('CONFIG_QCOW1')}
2017 summary_info += {'vdi support': config_host.has_key('CONFIG_VDI')}
2018 summary_info += {'vvfat support': config_host.has_key('CONFIG_VVFAT')}
2019 summary_info += {'qed support': config_host.has_key('CONFIG_QED')}
2020 summary_info += {'parallels support': config_host.has_key('CONFIG_PARALLELS')}
2021 summary_info += {'sheepdog support': config_host.has_key('CONFIG_SHEEPDOG')}
2022 summary_info += {'capstone': capstone_opt == 'disabled' ? false : capstone_opt}
2023 summary_info += {'libpmem support': config_host.has_key('CONFIG_LIBPMEM')}
2024 summary_info += {'libdaxctl support': config_host.has_key('CONFIG_LIBDAXCTL')}
2025 summary_info += {'libudev': libudev.found()}
2026 summary_info += {'default devices': config_host['CONFIG_MINIKCONF_MODE'] == '--defconfig'}
2027 summary_info += {'plugin support': config_host.has_key('CONFIG_PLUGIN')}
2028 summary_info += {'fuzzing support': config_host.has_key('CONFIG_FUZZ')}
2029 if config_host.has_key('HAVE_GDB_BIN')
2030 summary_info += {'gdb': config_host['HAVE_GDB_BIN']}
2032 summary_info += {'thread sanitizer': config_host.has_key('CONFIG_TSAN')}
2033 summary_info += {'rng-none': config_host.has_key('CONFIG_RNG_NONE')}
2034 summary_info += {'Linux keyring': config_host.has_key('CONFIG_SECRET_KEYRING')}
2035 summary(summary_info, bool_yn: true)
2037 if not supported_cpus.contains(cpu)
2039 warning('SUPPORT FOR THIS HOST CPU WILL GO AWAY IN FUTURE RELEASES!')
2041 message('CPU host architecture ' + cpu + ' support is not currently maintained.')
2042 message('The QEMU project intends to remove support for this host CPU in')
2043 message('a future release if nobody volunteers to maintain it and to')
2044 message('provide a build host for our continuous integration setup.')
2045 message('configure has succeeded and you can continue to build, but')
2046 message('if you care about QEMU on this platform you should contact')
2047 message('us upstream at qemu-devel@nongnu.org.')
2050 if not supported_oses.contains(targetos)
2052 warning('WARNING: SUPPORT FOR THIS HOST OS WILL GO AWAY IN FUTURE RELEASES!')
2054 message('Host OS ' + targetos + 'support is not currently maintained.')
2055 message('The QEMU project intends to remove support for this host OS in')
2056 message('a future release if nobody volunteers to maintain it and to')
2057 message('provide a build host for our continuous integration setup.')
2058 message('configure has succeeded and you can continue to build, but')
2059 message('if you care about QEMU on this platform you should contact')
2060 message('us upstream at qemu-devel@nongnu.org.')