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', 'sparc64', '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']
66 accelerator_targets = { 'CONFIG_KVM': kvm_targets }
67 if cpu in ['x86', 'x86_64']
68 accelerator_targets += {
69 'CONFIG_HAX': ['i386-softmmu', 'x86_64-softmmu'],
70 'CONFIG_XEN': ['i386-softmmu', 'x86_64-softmmu'],
71 'CONFIG_HVF': ['x86_64-softmmu'],
72 'CONFIG_WHPX': ['i386-softmmu', 'x86_64-softmmu'],
80 # Specify linker-script with add_project_link_arguments so that it is not placed
81 # within a linker --start-group/--end-group pair
82 if 'CONFIG_FUZZ' in config_host
83 add_project_link_arguments(['-Wl,-T,',
84 (meson.current_source_dir() / 'tests/qtest/fuzz/fork_fuzz.ld')],
85 native: false, language: ['c', 'cpp', 'objc'])
88 add_project_arguments(config_host['QEMU_CFLAGS'].split(),
89 native: false, language: ['c', 'objc'])
90 add_project_arguments(config_host['QEMU_CXXFLAGS'].split(),
91 native: false, language: 'cpp')
92 add_project_link_arguments(config_host['QEMU_LDFLAGS'].split(),
93 native: false, language: ['c', 'cpp', 'objc'])
94 add_project_arguments(config_host['QEMU_INCLUDES'].split(),
95 language: ['c', 'cpp', 'objc'])
98 link_language = meson.get_external_property('link_language', 'cpp')
99 if link_language == 'cpp'
100 add_languages('cpp', required: true, native: false)
102 if host_machine.system() == 'darwin'
103 add_languages('objc', required: false, native: false)
106 sparse = find_program('cgcc', required: get_option('sparse'))
109 command: [find_program('scripts/check_sparse.py'),
110 'compile_commands.json', sparse.full_path(), '-Wbitwise',
111 '-Wno-transparent-union', '-Wno-old-initializer',
112 '-Wno-non-pointer-null'])
115 ###########################################
116 # Target-specific checks and dependencies #
117 ###########################################
119 if targetos != 'linux' and get_option('mpath').enabled()
120 error('Multipath is supported only on Linux')
123 m = cc.find_library('m', required: false)
124 util = cc.find_library('util', required: false)
130 emulator_link_args = []
133 if targetos == 'windows'
134 socket = cc.find_library('ws2_32')
135 winmm = cc.find_library('winmm')
137 win = import('windows')
138 version_res = win.compile_resources('version.rc',
139 depend_files: files('pc-bios/qemu-nsis.ico'),
140 include_directories: include_directories('.'))
141 elif targetos == 'darwin'
142 coref = dependency('appleframeworks', modules: 'CoreFoundation')
143 iokit = dependency('appleframeworks', modules: 'IOKit')
144 cocoa = dependency('appleframeworks', modules: 'Cocoa', required: get_option('cocoa'))
145 elif targetos == 'sunos'
146 socket = [cc.find_library('socket'),
147 cc.find_library('nsl'),
148 cc.find_library('resolv')]
149 elif targetos == 'haiku'
150 socket = [cc.find_library('posix_error_mapper'),
151 cc.find_library('network'),
152 cc.find_library('bsd')]
153 elif targetos == 'openbsd'
154 if not get_option('tcg').disabled() and target_dirs.length() > 0
155 # Disable OpenBSD W^X if available
156 emulator_link_args = cc.get_supported_link_arguments('-Wl,-z,wxneeded')
161 if not get_option('kvm').disabled() and targetos == 'linux'
162 accelerators += 'CONFIG_KVM'
164 if not get_option('xen').disabled() and 'CONFIG_XEN_BACKEND' in config_host
165 accelerators += 'CONFIG_XEN'
166 have_xen_pci_passthrough = not get_option('xen_pci_passthrough').disabled() and targetos == 'linux'
168 have_xen_pci_passthrough = false
170 if not get_option('whpx').disabled() and targetos == 'windows'
171 if get_option('whpx').enabled() and cpu != 'x86_64'
172 error('WHPX requires 64-bit host')
173 elif cc.has_header('WinHvPlatform.h', required: get_option('whpx')) and \
174 cc.has_header('WinHvEmulation.h', required: get_option('whpx'))
175 accelerators += 'CONFIG_WHPX'
178 if not get_option('hvf').disabled()
179 hvf = dependency('appleframeworks', modules: 'Hypervisor',
180 required: get_option('hvf'))
182 accelerators += 'CONFIG_HVF'
185 if not get_option('hax').disabled()
186 if get_option('hax').enabled() or targetos in ['windows', 'darwin', 'netbsd']
187 accelerators += 'CONFIG_HAX'
190 if not get_option('tcg').disabled()
191 if cpu not in supported_cpus
192 if 'CONFIG_TCG_INTERPRETER' in config_host
193 warning('Unsupported CPU @0@, will use TCG with TCI (experimental)'.format(cpu))
195 error('Unsupported CPU @0@, try --enable-tcg-interpreter'.format(cpu))
198 accelerators += 'CONFIG_TCG'
199 config_host += { 'CONFIG_TCG': 'y' }
202 if 'CONFIG_KVM' not in accelerators and get_option('kvm').enabled()
203 error('KVM not available on this platform')
205 if 'CONFIG_HVF' not in accelerators and get_option('hvf').enabled()
206 error('HVF not available on this platform')
208 if 'CONFIG_WHPX' not in accelerators and get_option('whpx').enabled()
209 error('WHPX not available on this platform')
211 if not have_xen_pci_passthrough and get_option('xen_pci_passthrough').enabled()
212 if 'CONFIG_XEN' in accelerators
213 error('Xen PCI passthrough not available on this platform')
215 error('Xen PCI passthrough requested but Xen not enabled')
218 if not cocoa.found() and get_option('cocoa').enabled()
219 error('Cocoa not available on this platform')
226 # The path to glib.h is added to all compilation commands. This was
227 # grandfathered in from the QEMU Makefiles.
228 add_project_arguments(config_host['GLIB_CFLAGS'].split(),
229 native: false, language: ['c', 'cpp', 'objc'])
230 glib = declare_dependency(link_args: config_host['GLIB_LIBS'].split())
232 if 'CONFIG_GIO' in config_host
233 gio = declare_dependency(compile_args: config_host['GIO_CFLAGS'].split(),
234 link_args: config_host['GIO_LIBS'].split())
237 if 'CONFIG_TRACE_UST' in config_host
238 lttng = declare_dependency(link_args: config_host['LTTNG_UST_LIBS'].split())
241 if 'CONFIG_TRACE_UST' in config_host
242 urcubp = declare_dependency(link_args: config_host['URCU_BP_LIBS'].split())
245 if 'CONFIG_GCRYPT' in config_host
246 gcrypt = declare_dependency(compile_args: config_host['GCRYPT_CFLAGS'].split(),
247 link_args: config_host['GCRYPT_LIBS'].split())
250 if 'CONFIG_NETTLE' in config_host
251 nettle = declare_dependency(compile_args: config_host['NETTLE_CFLAGS'].split(),
252 link_args: config_host['NETTLE_LIBS'].split())
255 if 'CONFIG_GNUTLS' in config_host
256 gnutls = declare_dependency(compile_args: config_host['GNUTLS_CFLAGS'].split(),
257 link_args: config_host['GNUTLS_LIBS'].split())
260 if have_system or have_tools
261 pixman = dependency('pixman-1', required: have_system, version:'>=0.21.8',
262 method: 'pkg-config', static: enable_static)
265 if 'CONFIG_AUTH_PAM' in config_host
266 pam = cc.find_library('pam')
268 libaio = cc.find_library('aio', required: false)
269 zlib = dependency('zlib', required: true, static: enable_static)
270 linux_io_uring = not_found
271 if 'CONFIG_LINUX_IO_URING' in config_host
272 linux_io_uring = declare_dependency(compile_args: config_host['LINUX_IO_URING_CFLAGS'].split(),
273 link_args: config_host['LINUX_IO_URING_LIBS'].split())
276 if 'CONFIG_LIBXML2' in config_host
277 libxml2 = declare_dependency(compile_args: config_host['LIBXML2_CFLAGS'].split(),
278 link_args: config_host['LIBXML2_LIBS'].split())
281 if 'CONFIG_LIBNFS' in config_host
282 libnfs = declare_dependency(link_args: config_host['LIBNFS_LIBS'].split())
285 if 'CONFIG_ATTR' in config_host
286 libattr = declare_dependency(link_args: config_host['LIBATTR_LIBS'].split())
289 if 'CONFIG_SECCOMP' in config_host
290 seccomp = declare_dependency(compile_args: config_host['SECCOMP_CFLAGS'].split(),
291 link_args: config_host['SECCOMP_LIBS'].split())
293 libcap_ng = not_found
294 if 'CONFIG_LIBCAP_NG' in config_host
295 libcap_ng = declare_dependency(link_args: config_host['LIBCAP_NG_LIBS'].split())
297 if get_option('xkbcommon').auto() and not have_system and not have_tools
298 xkbcommon = not_found
300 xkbcommon = dependency('xkbcommon', required: get_option('xkbcommon'),
301 method: 'pkg-config', static: enable_static)
304 if config_host.has_key('CONFIG_VDE')
305 vde = declare_dependency(link_args: config_host['VDE_LIBS'].split())
308 if 'CONFIG_LIBPULSE' in config_host
309 pulse = declare_dependency(compile_args: config_host['PULSE_CFLAGS'].split(),
310 link_args: config_host['PULSE_LIBS'].split())
313 if 'CONFIG_ALSA' in config_host
314 alsa = declare_dependency(compile_args: config_host['ALSA_CFLAGS'].split(),
315 link_args: config_host['ALSA_LIBS'].split())
318 if 'CONFIG_LIBJACK' in config_host
319 jack = declare_dependency(link_args: config_host['JACK_LIBS'].split())
322 if 'CONFIG_SPICE' in config_host
323 spice = declare_dependency(compile_args: config_host['SPICE_CFLAGS'].split(),
324 link_args: config_host['SPICE_LIBS'].split())
326 rt = cc.find_library('rt', required: false)
328 if 'CONFIG_PLUGIN' in config_host
329 libdl = cc.find_library('dl', required: true)
332 if 'CONFIG_LIBISCSI' in config_host
333 libiscsi = declare_dependency(compile_args: config_host['LIBISCSI_CFLAGS'].split(),
334 link_args: config_host['LIBISCSI_LIBS'].split())
337 if 'CONFIG_ZSTD' in config_host
338 zstd = declare_dependency(compile_args: config_host['ZSTD_CFLAGS'].split(),
339 link_args: config_host['ZSTD_LIBS'].split())
342 if 'CONFIG_GBM' in config_host
343 gbm = declare_dependency(compile_args: config_host['GBM_CFLAGS'].split(),
344 link_args: config_host['GBM_LIBS'].split())
347 if 'CONFIG_VIRGL' in config_host
348 virgl = declare_dependency(compile_args: config_host['VIRGL_CFLAGS'].split(),
349 link_args: config_host['VIRGL_LIBS'].split())
352 if 'CONFIG_CURL' in config_host
353 curl = declare_dependency(compile_args: config_host['CURL_CFLAGS'].split(),
354 link_args: config_host['CURL_LIBS'].split())
357 if targetos == 'linux' and (have_system or have_tools)
358 libudev = dependency('libudev',
359 required: get_option('mpath').enabled(),
360 static: enable_static)
363 mpathpersist = not_found
364 mpathpersist_new_api = false
365 if targetos == 'linux' and have_tools and not get_option('mpath').disabled()
366 mpath_test_source_new = '''
368 #include <mpath_persist.h>
369 unsigned mpath_mx_alloc_len = 1024;
371 static struct config *multipath_conf;
372 extern struct udev *udev;
373 extern struct config *get_multipath_config(void);
374 extern void put_multipath_config(struct config *conf);
376 struct config *get_multipath_config(void) { return multipath_conf; }
377 void put_multipath_config(struct config *conf) { }
380 multipath_conf = mpath_lib_init();
383 mpath_test_source_old = '''
385 #include <mpath_persist.h>
386 unsigned mpath_mx_alloc_len = 1024;
389 struct udev *udev = udev_new();
390 mpath_lib_init(udev);
393 mpathlibs = [libudev]
395 mpathlibs += cc.find_library('devmapper',
396 required: get_option('mpath'),
397 static: enable_static)
399 mpathlibs += cc.find_library('multipath',
400 required: get_option('mpath'),
401 static: enable_static)
402 mpathlibs += cc.find_library('mpathpersist',
403 required: get_option('mpath'),
404 static: enable_static)
405 foreach lib: mpathlibs
411 if mpathlibs.length() > 0
412 if cc.links(mpath_test_source_new, dependencies: mpathlibs)
413 mpathpersist = declare_dependency(dependencies: mpathlibs)
414 mpathpersist_new_api = true
415 elif cc.links(mpath_test_source_old, dependencies: mpathlibs)
416 mpathpersist = declare_dependency(dependencies: mpathlibs)
418 if get_option('mpath').enabled()
419 error('Cannot detect libmpathpersist API')
421 warning('Cannot detect libmpathpersist API, disabling')
428 if 'CONFIG_BRLAPI' in config_host
429 brlapi = declare_dependency(link_args: config_host['BRLAPI_LIBS'].split())
434 sdl = dependency('sdl2', required: get_option('sdl'), static: enable_static)
435 sdl_image = not_found
438 # work around 2.0.8 bug
439 sdl = declare_dependency(compile_args: '-Wno-undef',
441 sdl_image = dependency('SDL2_image', required: get_option('sdl_image'),
442 method: 'pkg-config', static: enable_static)
444 if get_option('sdl_image').enabled()
445 error('sdl-image required, but SDL was @0@'.format(
446 get_option('sdl').disabled() ? 'disabled' : 'not found'))
448 sdl_image = not_found
452 if 'CONFIG_RBD' in config_host
453 rbd = declare_dependency(link_args: config_host['RBD_LIBS'].split())
455 glusterfs = not_found
456 if 'CONFIG_GLUSTERFS' in config_host
457 glusterfs = declare_dependency(compile_args: config_host['GLUSTERFS_CFLAGS'].split(),
458 link_args: config_host['GLUSTERFS_LIBS'].split())
461 if 'CONFIG_LIBSSH' in config_host
462 libssh = declare_dependency(compile_args: config_host['LIBSSH_CFLAGS'].split(),
463 link_args: config_host['LIBSSH_LIBS'].split())
466 if 'CONFIG_BZIP2' in config_host
467 libbzip2 = declare_dependency(link_args: config_host['BZIP2_LIBS'].split())
470 if 'CONFIG_LZFSE' in config_host
471 liblzfse = declare_dependency(link_args: config_host['LZFSE_LIBS'].split())
474 if 'CONFIG_AUDIO_OSS' in config_host
475 oss = declare_dependency(link_args: config_host['OSS_LIBS'].split())
478 if 'CONFIG_AUDIO_DSOUND' in config_host
479 dsound = declare_dependency(link_args: config_host['DSOUND_LIBS'].split())
481 coreaudio = not_found
482 if 'CONFIG_AUDIO_COREAUDIO' in config_host
483 coreaudio = declare_dependency(link_args: config_host['COREAUDIO_LIBS'].split())
486 if 'CONFIG_OPENGL' in config_host
487 opengl = declare_dependency(compile_args: config_host['OPENGL_CFLAGS'].split(),
488 link_args: config_host['OPENGL_LIBS'].split())
491 if 'CONFIG_GTK' in config_host
492 gtk = declare_dependency(compile_args: config_host['GTK_CFLAGS'].split(),
493 link_args: config_host['GTK_LIBS'].split())
496 if 'CONFIG_VTE' in config_host
497 vte = declare_dependency(compile_args: config_host['VTE_CFLAGS'].split(),
498 link_args: config_host['VTE_LIBS'].split())
501 if 'CONFIG_X11' in config_host
502 x11 = declare_dependency(compile_args: config_host['X11_CFLAGS'].split(),
503 link_args: config_host['X11_LIBS'].split())
506 if 'CONFIG_CURSES' in config_host
507 curses = declare_dependency(compile_args: config_host['CURSES_CFLAGS'].split(),
508 link_args: config_host['CURSES_LIBS'].split())
511 if 'CONFIG_ICONV' in config_host
512 iconv = declare_dependency(compile_args: config_host['ICONV_CFLAGS'].split(),
513 link_args: config_host['ICONV_LIBS'].split())
519 if get_option('vnc').enabled()
520 vnc = declare_dependency() # dummy dependency
521 png = dependency('libpng', required: get_option('vnc_png'),
522 method: 'pkg-config', static: enable_static)
523 jpeg = cc.find_library('jpeg', has_headers: ['jpeglib.h'],
524 required: get_option('vnc_jpeg'),
525 static: enable_static)
526 sasl = cc.find_library('sasl2', has_headers: ['sasl/sasl.h'],
527 required: get_option('vnc_sasl'),
528 static: enable_static)
530 sasl = declare_dependency(dependencies: sasl,
531 compile_args: '-DSTRUCT_IOVEC_DEFINED')
535 if 'CONFIG_SNAPPY' in config_host
536 snappy = declare_dependency(link_args: config_host['SNAPPY_LIBS'].split())
539 if 'CONFIG_LZO' in config_host
540 lzo = declare_dependency(link_args: config_host['LZO_LIBS'].split())
543 if 'CONFIG_RDMA' in config_host
544 rdma = declare_dependency(link_args: config_host['RDMA_LIBS'].split())
547 if 'CONFIG_NUMA' in config_host
548 numa = declare_dependency(link_args: config_host['NUMA_LIBS'].split())
551 if 'CONFIG_XEN_BACKEND' in config_host
552 xen = declare_dependency(compile_args: config_host['XEN_CFLAGS'].split(),
553 link_args: config_host['XEN_LIBS'].split())
556 if 'CONFIG_SMARTCARD' in config_host
557 cacard = declare_dependency(compile_args: config_host['SMARTCARD_CFLAGS'].split(),
558 link_args: config_host['SMARTCARD_LIBS'].split())
562 u2f = dependency('u2f-emu', required: get_option('u2f'),
563 method: 'pkg-config',
564 static: enable_static)
567 if 'CONFIG_USB_REDIR' in config_host
568 usbredir = declare_dependency(compile_args: config_host['USB_REDIR_CFLAGS'].split(),
569 link_args: config_host['USB_REDIR_LIBS'].split())
572 if 'CONFIG_USB_LIBUSB' in config_host
573 libusb = declare_dependency(compile_args: config_host['LIBUSB_CFLAGS'].split(),
574 link_args: config_host['LIBUSB_LIBS'].split())
577 if 'CONFIG_LIBPMEM' in config_host
578 libpmem = declare_dependency(compile_args: config_host['LIBPMEM_CFLAGS'].split(),
579 link_args: config_host['LIBPMEM_LIBS'].split())
581 libdaxctl = not_found
582 if 'CONFIG_LIBDAXCTL' in config_host
583 libdaxctl = declare_dependency(link_args: config_host['LIBDAXCTL_LIBS'].split())
586 if 'CONFIG_TASN1' in config_host
587 tasn1 = declare_dependency(compile_args: config_host['TASN1_CFLAGS'].split(),
588 link_args: config_host['TASN1_LIBS'].split())
590 keyutils = dependency('libkeyutils', required: false,
591 method: 'pkg-config', static: enable_static)
593 has_gettid = cc.has_function('gettid')
598 if get_option('malloc') == 'system'
600 not get_option('malloc_trim').disabled() and \
601 cc.links('''#include <malloc.h>
602 int main(void) { malloc_trim(0); return 0; }''')
604 has_malloc_trim = false
605 malloc = cc.find_library(get_option('malloc'), required: true)
607 if not has_malloc_trim and get_option('malloc_trim').enabled()
608 if get_option('malloc') == 'system'
609 error('malloc_trim not available on this platform.')
611 error('malloc_trim not available with non-libc memory allocator')
615 # Create config-host.h
617 config_host_data.set('CONFIG_COCOA', cocoa.found())
618 config_host_data.set('CONFIG_LIBUDEV', libudev.found())
619 config_host_data.set('CONFIG_MPATH', mpathpersist.found())
620 config_host_data.set('CONFIG_MPATH_NEW_API', mpathpersist_new_api)
621 config_host_data.set('CONFIG_SDL', sdl.found())
622 config_host_data.set('CONFIG_SDL_IMAGE', sdl_image.found())
623 config_host_data.set('CONFIG_VNC', vnc.found())
624 config_host_data.set('CONFIG_VNC_JPEG', jpeg.found())
625 config_host_data.set('CONFIG_VNC_PNG', png.found())
626 config_host_data.set('CONFIG_VNC_SASL', sasl.found())
627 config_host_data.set('CONFIG_XKBCOMMON', xkbcommon.found())
628 config_host_data.set('CONFIG_KEYUTILS', keyutils.found())
629 config_host_data.set('CONFIG_GETTID', has_gettid)
630 config_host_data.set('CONFIG_MALLOC_TRIM', has_malloc_trim)
631 config_host_data.set('QEMU_VERSION', '"@0@"'.format(meson.project_version()))
632 config_host_data.set('QEMU_VERSION_MAJOR', meson.project_version().split('.')[0])
633 config_host_data.set('QEMU_VERSION_MINOR', meson.project_version().split('.')[1])
634 config_host_data.set('QEMU_VERSION_MICRO', meson.project_version().split('.')[2])
636 ignored = ['CONFIG_QEMU_INTERP_PREFIX'] # actually per-target
637 arrays = ['CONFIG_AUDIO_DRIVERS', 'CONFIG_BDRV_RW_WHITELIST', 'CONFIG_BDRV_RO_WHITELIST']
638 strings = ['HOST_DSOSUF', 'CONFIG_IASL', 'bindir', 'prefix', 'qemu_confdir', 'qemu_datadir',
639 'qemu_moddir', 'qemu_localstatedir', 'qemu_helperdir', 'qemu_localedir',
640 'qemu_icondir', 'qemu_desktopdir', 'qemu_firmwarepath', 'sysconfdir']
641 foreach k, v: config_host
642 if ignored.contains(k)
644 elif arrays.contains(k)
646 v = '"' + '", "'.join(v.split()) + '", '
648 config_host_data.set(k, v)
650 config_host_data.set('HOST_' + v.to_upper(), 1)
651 elif strings.contains(k)
652 if not k.startswith('CONFIG_')
653 k = 'CONFIG_' + k.to_upper()
655 config_host_data.set_quoted(k, v)
656 elif k.startswith('CONFIG_') or k.startswith('HAVE_') or k.startswith('HOST_')
657 config_host_data.set(k, v == 'y' ? 1 : v)
661 minikconf = find_program('scripts/minikconf.py')
663 config_all_devices = {}
664 config_all_disas = {}
665 config_devices_mak_list = []
666 config_devices_h = {}
668 config_target_mak = {}
671 'alpha' : ['CONFIG_ALPHA_DIS'],
672 'arm' : ['CONFIG_ARM_DIS'],
673 'avr' : ['CONFIG_AVR_DIS'],
674 'cris' : ['CONFIG_CRIS_DIS'],
675 'hppa' : ['CONFIG_HPPA_DIS'],
676 'i386' : ['CONFIG_I386_DIS'],
677 'x86_64' : ['CONFIG_I386_DIS'],
678 'x32' : ['CONFIG_I386_DIS'],
679 'lm32' : ['CONFIG_LM32_DIS'],
680 'm68k' : ['CONFIG_M68K_DIS'],
681 'microblaze' : ['CONFIG_MICROBLAZE_DIS'],
682 'mips' : ['CONFIG_MIPS_DIS'],
683 'moxie' : ['CONFIG_MOXIE_DIS'],
684 'nios2' : ['CONFIG_NIOS2_DIS'],
685 'or1k' : ['CONFIG_OPENRISC_DIS'],
686 'ppc' : ['CONFIG_PPC_DIS'],
687 'riscv' : ['CONFIG_RISCV_DIS'],
688 'rx' : ['CONFIG_RX_DIS'],
689 's390' : ['CONFIG_S390_DIS'],
690 'sh4' : ['CONFIG_SH4_DIS'],
691 'sparc' : ['CONFIG_SPARC_DIS'],
692 'xtensa' : ['CONFIG_XTENSA_DIS'],
694 if link_language == 'cpp'
696 'aarch64' : [ 'CONFIG_ARM_A64_DIS'],
697 'arm' : [ 'CONFIG_ARM_DIS', 'CONFIG_ARM_A64_DIS'],
698 'mips' : [ 'CONFIG_MIPS_DIS', 'CONFIG_NANOMIPS_DIS'],
702 kconfig_external_symbols = [
712 'CONFIG_VHOST_KERNEL',
717 ignored = [ 'TARGET_XML_FILES', 'TARGET_ABI_DIR', 'TARGET_ARCH' ]
719 default_targets = 'CONFIG_DEFAULT_TARGETS' in config_host
720 actual_target_dirs = []
722 foreach target : target_dirs
723 config_target = { 'TARGET_NAME': target.split('-')[0] }
724 if target.endswith('linux-user')
725 if targetos != 'linux'
729 error('Target @0@ is only available on a Linux host'.format(target))
731 config_target += { 'CONFIG_LINUX_USER': 'y' }
732 elif target.endswith('bsd-user')
733 if 'CONFIG_BSD' not in config_host
737 error('Target @0@ is only available on a BSD host'.format(target))
739 config_target += { 'CONFIG_BSD_USER': 'y' }
740 elif target.endswith('softmmu')
741 config_target += { 'CONFIG_SOFTMMU': 'y' }
743 if target.endswith('-user')
745 'CONFIG_USER_ONLY': 'y',
746 'CONFIG_QEMU_INTERP_PREFIX':
747 config_host['CONFIG_QEMU_INTERP_PREFIX'].format(config_target['TARGET_NAME'])
752 foreach sym: accelerators
753 if sym == 'CONFIG_TCG' or target in accelerator_targets.get(sym, [])
754 config_target += { sym: 'y' }
755 config_all += { sym: 'y' }
756 if sym == 'CONFIG_XEN' and have_xen_pci_passthrough
757 config_target += { 'CONFIG_XEN_PCI_PASSTHROUGH': 'y' }
766 error('No accelerator available for target @0@'.format(target))
769 actual_target_dirs += target
770 config_target += keyval.load('default-configs/targets' / target + '.mak')
771 config_target += { 'TARGET_' + config_target['TARGET_ARCH'].to_upper(): 'y' }
773 if 'TARGET_NEED_FDT' in config_target
774 fdt_required += target
778 if 'TARGET_BASE_ARCH' not in config_target
779 config_target += {'TARGET_BASE_ARCH': config_target['TARGET_ARCH']}
781 if 'TARGET_ABI_DIR' not in config_target
782 config_target += {'TARGET_ABI_DIR': config_target['TARGET_ARCH']}
785 foreach k, v: disassemblers
786 if config_host['ARCH'].startswith(k) or config_target['TARGET_BASE_ARCH'].startswith(k)
788 config_target += { sym: 'y' }
789 config_all_disas += { sym: 'y' }
794 config_target_data = configuration_data()
795 foreach k, v: config_target
796 if not k.startswith('TARGET_') and not k.startswith('CONFIG_')
798 elif ignored.contains(k)
800 elif k == 'TARGET_BASE_ARCH'
801 # Note that TARGET_BASE_ARCH ends up in config-target.h but it is
802 # not used to select files from sourcesets.
803 config_target_data.set('TARGET_' + v.to_upper(), 1)
804 elif k == 'TARGET_NAME' or k == 'CONFIG_QEMU_INTERP_PREFIX'
805 config_target_data.set_quoted(k, v)
807 config_target_data.set(k, 1)
809 config_target_data.set(k, v)
812 config_target_h += {target: configure_file(output: target + '-config-target.h',
813 configuration: config_target_data)}
815 if target.endswith('-softmmu')
817 foreach sym : kconfig_external_symbols
818 if sym in config_target or sym in config_host
819 base_kconfig += '@0@=y'.format(sym)
823 config_devices_mak = target + '-config-devices.mak'
824 config_devices_mak = configure_file(
825 input: ['default-configs/devices' / target + '.mak', 'Kconfig'],
826 output: config_devices_mak,
827 depfile: config_devices_mak + '.d',
829 command: [minikconf, config_host['CONFIG_MINIKCONF_MODE'],
830 config_devices_mak, '@DEPFILE@', '@INPUT@',
833 config_devices_data = configuration_data()
834 config_devices = keyval.load(config_devices_mak)
835 foreach k, v: config_devices
836 config_devices_data.set(k, 1)
838 config_devices_mak_list += config_devices_mak
839 config_devices_h += {target: configure_file(output: target + '-config-devices.h',
840 configuration: config_devices_data)}
841 config_target += config_devices
842 config_all_devices += config_devices
844 config_target_mak += {target: config_target}
846 target_dirs = actual_target_dirs
848 # This configuration is used to build files that are shared by
849 # multiple binaries, and then extracted out of the "common"
850 # static_library target.
852 # We do not use all_sources()/all_dependencies(), because it would
853 # build literally all source files, including devices only used by
854 # targets that are not built for this compilation. The CONFIG_ALL
855 # pseudo symbol replaces it.
857 config_all += config_all_devices
858 config_all += config_host
859 config_all += config_all_disas
861 'CONFIG_XEN': config_host.has_key('CONFIG_XEN_BACKEND'),
862 'CONFIG_SOFTMMU': have_system,
863 'CONFIG_USER_ONLY': have_user,
870 capstone_opt = get_option('capstone')
871 if capstone_opt in ['enabled', 'auto', 'system']
872 have_internal = fs.exists(meson.current_source_dir() / 'capstone/Makefile')
873 capstone = dependency('capstone', version: '>=4.0',
874 static: enable_static, method: 'pkg-config',
875 required: capstone_opt == 'system' or
876 capstone_opt == 'enabled' and not have_internal)
878 capstone_opt = 'system'
880 capstone_opt = 'internal'
882 capstone_opt = 'disabled'
885 if capstone_opt == 'internal'
886 capstone_data = configuration_data()
887 capstone_data.set('CAPSTONE_USE_SYS_DYN_MEM', '1')
889 capstone_files = files(
892 'capstone/MCInstrDesc.c',
893 'capstone/MCRegisterInfo.c',
894 'capstone/SStream.c',
898 if 'CONFIG_ARM_DIS' in config_all_disas
899 capstone_data.set('CAPSTONE_HAS_ARM', '1')
900 capstone_files += files(
901 'capstone/arch/ARM/ARMDisassembler.c',
902 'capstone/arch/ARM/ARMInstPrinter.c',
903 'capstone/arch/ARM/ARMMapping.c',
904 'capstone/arch/ARM/ARMModule.c'
908 # FIXME: This config entry currently depends on a c++ compiler.
909 # Which is needed for building libvixl, but not for capstone.
910 if 'CONFIG_ARM_A64_DIS' in config_all_disas
911 capstone_data.set('CAPSTONE_HAS_ARM64', '1')
912 capstone_files += files(
913 'capstone/arch/AArch64/AArch64BaseInfo.c',
914 'capstone/arch/AArch64/AArch64Disassembler.c',
915 'capstone/arch/AArch64/AArch64InstPrinter.c',
916 'capstone/arch/AArch64/AArch64Mapping.c',
917 'capstone/arch/AArch64/AArch64Module.c'
921 if 'CONFIG_PPC_DIS' in config_all_disas
922 capstone_data.set('CAPSTONE_HAS_POWERPC', '1')
923 capstone_files += files(
924 'capstone/arch/PowerPC/PPCDisassembler.c',
925 'capstone/arch/PowerPC/PPCInstPrinter.c',
926 'capstone/arch/PowerPC/PPCMapping.c',
927 'capstone/arch/PowerPC/PPCModule.c'
931 if 'CONFIG_S390_DIS' in config_all_disas
932 capstone_data.set('CAPSTONE_HAS_SYSZ', '1')
933 capstone_files += files(
934 'capstone/arch/SystemZ/SystemZDisassembler.c',
935 'capstone/arch/SystemZ/SystemZInstPrinter.c',
936 'capstone/arch/SystemZ/SystemZMapping.c',
937 'capstone/arch/SystemZ/SystemZModule.c',
938 'capstone/arch/SystemZ/SystemZMCTargetDesc.c'
942 if 'CONFIG_I386_DIS' in config_all_disas
943 capstone_data.set('CAPSTONE_HAS_X86', 1)
944 capstone_files += files(
945 'capstone/arch/X86/X86Disassembler.c',
946 'capstone/arch/X86/X86DisassemblerDecoder.c',
947 'capstone/arch/X86/X86ATTInstPrinter.c',
948 'capstone/arch/X86/X86IntelInstPrinter.c',
949 'capstone/arch/X86/X86InstPrinterCommon.c',
950 'capstone/arch/X86/X86Mapping.c',
951 'capstone/arch/X86/X86Module.c'
955 configure_file(output: 'capstone-defs.h', configuration: capstone_data)
958 # FIXME: There does not seem to be a way to completely replace the c_args
959 # that come from add_project_arguments() -- we can only add to them.
960 # So: disable all warnings with a big hammer.
963 # Include all configuration defines via a header file, which will wind up
964 # as a dependency on the object file, and thus changes here will result
966 '-include', 'capstone-defs.h'
969 libcapstone = static_library('capstone',
970 sources: capstone_files,
971 c_args: capstone_cargs,
972 include_directories: 'capstone/include')
973 capstone = declare_dependency(link_with: libcapstone,
974 include_directories: 'capstone/include/capstone')
978 slirp_opt = 'disabled'
980 slirp_opt = get_option('slirp')
981 if slirp_opt in ['enabled', 'auto', 'system']
982 have_internal = fs.exists(meson.current_source_dir() / 'slirp/meson.build')
983 slirp = dependency('slirp', static: enable_static,
984 method: 'pkg-config',
985 required: slirp_opt == 'system' or
986 slirp_opt == 'enabled' and not have_internal)
990 slirp_opt = 'internal'
992 slirp_opt = 'disabled'
995 if slirp_opt == 'internal'
997 if targetos == 'windows'
998 slirp_deps = cc.find_library('iphlpapi')
1000 slirp_conf = configuration_data()
1001 slirp_conf.set('SLIRP_MAJOR_VERSION', meson.project_version().split('.')[0])
1002 slirp_conf.set('SLIRP_MINOR_VERSION', meson.project_version().split('.')[1])
1003 slirp_conf.set('SLIRP_MICRO_VERSION', meson.project_version().split('.')[2])
1004 slirp_conf.set_quoted('SLIRP_VERSION_STRING', meson.project_version())
1005 slirp_cargs = ['-DG_LOG_DOMAIN="Slirp"']
1007 'slirp/src/arp_table.c',
1008 'slirp/src/bootp.c',
1009 'slirp/src/cksum.c',
1010 'slirp/src/dhcpv6.c',
1011 'slirp/src/dnssearch.c',
1013 'slirp/src/ip6_icmp.c',
1014 'slirp/src/ip6_input.c',
1015 'slirp/src/ip6_output.c',
1016 'slirp/src/ip_icmp.c',
1017 'slirp/src/ip_input.c',
1018 'slirp/src/ip_output.c',
1022 'slirp/src/ndp_table.c',
1024 'slirp/src/slirp.c',
1025 'slirp/src/socket.c',
1026 'slirp/src/state.c',
1027 'slirp/src/stream.c',
1028 'slirp/src/tcp_input.c',
1029 'slirp/src/tcp_output.c',
1030 'slirp/src/tcp_subr.c',
1031 'slirp/src/tcp_timer.c',
1036 'slirp/src/version.c',
1037 'slirp/src/vmstate.c',
1041 input : 'slirp/src/libslirp-version.h.in',
1042 output : 'libslirp-version.h',
1043 configuration: slirp_conf)
1045 slirp_inc = include_directories('slirp', 'slirp/src')
1046 libslirp = static_library('slirp',
1047 sources: slirp_files,
1048 c_args: slirp_cargs,
1049 include_directories: slirp_inc)
1050 slirp = declare_dependency(link_with: libslirp,
1051 dependencies: slirp_deps,
1052 include_directories: slirp_inc)
1057 fdt_opt = get_option('fdt')
1059 if fdt_opt in ['enabled', 'auto', 'system']
1060 have_internal = fs.exists(meson.current_source_dir() / 'dtc/libfdt/Makefile.libfdt')
1061 fdt = cc.find_library('fdt', static: enable_static,
1062 required: fdt_opt == 'system' or
1063 fdt_opt == 'enabled' and not have_internal)
1064 if fdt.found() and cc.links('''
1066 #include <libfdt_env.h>
1067 int main(void) { fdt_check_full(NULL, 0); return 0; }''',
1071 fdt_opt = 'internal'
1073 fdt_opt = 'disabled'
1076 if fdt_opt == 'internal'
1079 'dtc/libfdt/fdt_ro.c',
1080 'dtc/libfdt/fdt_wip.c',
1081 'dtc/libfdt/fdt_sw.c',
1082 'dtc/libfdt/fdt_rw.c',
1083 'dtc/libfdt/fdt_strerror.c',
1084 'dtc/libfdt/fdt_empty_tree.c',
1085 'dtc/libfdt/fdt_addresses.c',
1086 'dtc/libfdt/fdt_overlay.c',
1087 'dtc/libfdt/fdt_check.c',
1090 fdt_inc = include_directories('dtc/libfdt')
1091 libfdt = static_library('fdt',
1093 include_directories: fdt_inc)
1094 fdt = declare_dependency(link_with: libfdt,
1095 include_directories: fdt_inc)
1098 if not fdt.found() and fdt_required.length() > 0
1099 error('fdt not available but required by targets ' + ', '.join(fdt_required))
1102 config_host_data.set('CONFIG_CAPSTONE', capstone.found())
1103 config_host_data.set('CONFIG_FDT', fdt.found())
1104 config_host_data.set('CONFIG_SLIRP', slirp.found())
1106 genh += configure_file(output: 'config-host.h', configuration: config_host_data)
1110 hxtool = find_program('scripts/hxtool')
1111 shaderinclude = find_program('scripts/shaderinclude.pl')
1112 qapi_gen = find_program('scripts/qapi-gen.py')
1113 qapi_gen_depends = [ meson.source_root() / 'scripts/qapi/__init__.py',
1114 meson.source_root() / 'scripts/qapi/commands.py',
1115 meson.source_root() / 'scripts/qapi/common.py',
1116 meson.source_root() / 'scripts/qapi/error.py',
1117 meson.source_root() / 'scripts/qapi/events.py',
1118 meson.source_root() / 'scripts/qapi/expr.py',
1119 meson.source_root() / 'scripts/qapi/gen.py',
1120 meson.source_root() / 'scripts/qapi/introspect.py',
1121 meson.source_root() / 'scripts/qapi/parser.py',
1122 meson.source_root() / 'scripts/qapi/schema.py',
1123 meson.source_root() / 'scripts/qapi/source.py',
1124 meson.source_root() / 'scripts/qapi/types.py',
1125 meson.source_root() / 'scripts/qapi/visit.py',
1126 meson.source_root() / 'scripts/qapi/common.py',
1127 meson.source_root() / 'scripts/qapi-gen.py'
1131 python, files('scripts/tracetool.py'),
1132 '--backend=' + config_host['TRACE_BACKENDS']
1135 qemu_version_cmd = [find_program('scripts/qemu-version.sh'),
1136 meson.current_source_dir(),
1137 config_host['PKGVERSION'], meson.project_version()]
1138 qemu_version = custom_target('qemu-version.h',
1139 output: 'qemu-version.h',
1140 command: qemu_version_cmd,
1142 build_by_default: true,
1143 build_always_stale: true)
1144 genh += qemu_version
1148 ['qemu-options.hx', 'qemu-options.def'],
1149 ['qemu-img-cmds.hx', 'qemu-img-cmds.h'],
1153 ['hmp-commands.hx', 'hmp-commands.h'],
1154 ['hmp-commands-info.hx', 'hmp-commands-info.h'],
1157 foreach d : hx_headers
1158 hxdep += custom_target(d[1],
1162 build_by_default: true, # to be removed when added to a target
1163 command: [hxtool, '-h', '@INPUT0@'])
1167 SPHINX_ARGS = [config_host['SPHINX_BUILD'],
1168 '-Dversion=' + meson.project_version(),
1169 '-Drelease=' + config_host['PKGVERSION']]
1171 if get_option('werror')
1172 SPHINX_ARGS += [ '-W' ]
1175 sphinx_extn_depends = [ meson.source_root() / 'docs/sphinx/depfile.py',
1176 meson.source_root() / 'docs/sphinx/hxtool.py',
1177 meson.source_root() / 'docs/sphinx/kerneldoc.py',
1178 meson.source_root() / 'docs/sphinx/kernellog.py',
1179 meson.source_root() / 'docs/sphinx/qapidoc.py',
1180 meson.source_root() / 'docs/sphinx/qmp_lexer.py',
1183 # Collect sourcesets.
1185 authz_ss = ss.source_set()
1186 blockdev_ss = ss.source_set()
1187 block_ss = ss.source_set()
1188 bsd_user_ss = ss.source_set()
1189 chardev_ss = ss.source_set()
1190 common_ss = ss.source_set()
1191 crypto_ss = ss.source_set()
1192 io_ss = ss.source_set()
1193 linux_user_ss = ss.source_set()
1194 qmp_ss = ss.source_set()
1195 qom_ss = ss.source_set()
1196 softmmu_ss = ss.source_set()
1197 specific_fuzz_ss = ss.source_set()
1198 specific_ss = ss.source_set()
1199 stub_ss = ss.source_set()
1200 trace_ss = ss.source_set()
1201 user_ss = ss.source_set()
1202 util_ss = ss.source_set()
1207 target_softmmu_arch = {}
1213 # TODO: add each directory to the subdirs from its own meson.build, once
1215 trace_events_subdirs = [
1222 trace_events_subdirs += [ 'linux-user' ]
1225 trace_events_subdirs += [
1234 trace_events_subdirs += [
1245 'hw/block/dataplane',
1290 trace_events_subdirs += [
1317 libmodulecommon = static_library('module-common', files('module-common.c') + genh, pic: true, c_args: '-DBUILD_DSO')
1318 modulecommon = declare_dependency(link_whole: libmodulecommon, compile_args: '-DBUILD_DSO')
1321 # Build targets from sourcesets
1323 stub_ss = stub_ss.apply(config_all, strict: false)
1325 util_ss.add_all(trace_ss)
1326 util_ss = util_ss.apply(config_all, strict: false)
1327 libqemuutil = static_library('qemuutil',
1328 sources: util_ss.sources() + stub_ss.sources() + genh,
1329 dependencies: [util_ss.dependencies(), m, glib, socket, malloc])
1330 qemuutil = declare_dependency(link_with: libqemuutil,
1331 sources: genh + version_res)
1333 decodetree = generator(find_program('scripts/decodetree.py'),
1334 output: 'decode-@BASENAME@.c.inc',
1335 arguments: ['@INPUT@', '@EXTRA_ARGS@', '-o', '@OUTPUT@'])
1341 subdir('libdecnumber')
1352 block_ss.add(when: 'CONFIG_REPLICATION', if_true: files('replication.c'))
1358 blockdev_ss.add(files(
1364 # os-posix.c contains POSIX-specific functions used by qemu-storage-daemon,
1365 # os-win32.c does not
1366 blockdev_ss.add(when: 'CONFIG_POSIX', if_true: files('os-posix.c'))
1367 softmmu_ss.add(when: 'CONFIG_WIN32', if_true: [files('os-win32.c')])
1369 softmmu_ss.add_all(blockdev_ss)
1370 softmmu_ss.add(files(
1376 softmmu_ss.add(when: 'CONFIG_TPM', if_true: files('tpm.c'))
1377 softmmu_ss.add(when: 'CONFIG_SECCOMP', if_true: [files('qemu-seccomp.c'), seccomp])
1378 softmmu_ss.add(when: fdt, if_true: files('device_tree.c'))
1380 common_ss.add(files('cpus-common.c'))
1384 common_ss.add(capstone)
1385 specific_ss.add(files('disas.c', 'exec.c', 'gdbstub.c'), capstone, libpmem, libdaxctl)
1386 specific_ss.add(files('exec-vary.c'))
1387 specific_ss.add(when: 'CONFIG_TCG', if_true: files(
1391 'tcg/tcg-op-gvec.c',
1396 specific_ss.add(when: 'CONFIG_TCG_INTERPRETER', if_true: files('disas/tci.c', 'tcg/tci.c'))
1408 subdir('linux-user')
1410 bsd_user_ss.add(files('gdbstub.c'))
1411 specific_ss.add_all(when: 'CONFIG_BSD_USER', if_true: bsd_user_ss)
1413 linux_user_ss.add(files('gdbstub.c', 'thunk.c'))
1414 specific_ss.add_all(when: 'CONFIG_LINUX_USER', if_true: linux_user_ss)
1416 # needed for fuzzing binaries
1417 subdir('tests/qtest/libqos')
1418 subdir('tests/qtest/fuzz')
1422 foreach d, list : modules
1423 foreach m, module_ss : list
1424 if enable_modules and targetos != 'windows'
1425 module_ss = module_ss.apply(config_all, strict: false)
1426 sl = static_library(d + '-' + m, [genh, module_ss.sources()],
1427 dependencies: [modulecommon, module_ss.dependencies()], pic: true)
1435 block_ss.add_all(module_ss)
1437 softmmu_ss.add_all(module_ss)
1443 nm = find_program('nm')
1444 undefsym = find_program('scripts/undefsym.py')
1445 block_syms = custom_target('block.syms', output: 'block.syms',
1446 input: [libqemuutil, block_mods],
1448 command: [undefsym, nm, '@INPUT@'])
1449 qemu_syms = custom_target('qemu.syms', output: 'qemu.syms',
1450 input: [libqemuutil, softmmu_mods],
1452 command: [undefsym, nm, '@INPUT@'])
1454 ########################
1455 # Library dependencies #
1456 ########################
1458 qom_ss = qom_ss.apply(config_host, strict: false)
1459 libqom = static_library('qom', qom_ss.sources() + genh,
1460 dependencies: [qom_ss.dependencies()],
1463 qom = declare_dependency(link_whole: libqom)
1465 authz_ss = authz_ss.apply(config_host, strict: false)
1466 libauthz = static_library('authz', authz_ss.sources() + genh,
1467 dependencies: [authz_ss.dependencies()],
1469 build_by_default: false)
1471 authz = declare_dependency(link_whole: libauthz,
1474 crypto_ss = crypto_ss.apply(config_host, strict: false)
1475 libcrypto = static_library('crypto', crypto_ss.sources() + genh,
1476 dependencies: [crypto_ss.dependencies()],
1478 build_by_default: false)
1480 crypto = declare_dependency(link_whole: libcrypto,
1481 dependencies: [authz, qom])
1483 io_ss = io_ss.apply(config_host, strict: false)
1484 libio = static_library('io', io_ss.sources() + genh,
1485 dependencies: [io_ss.dependencies()],
1486 link_with: libqemuutil,
1488 build_by_default: false)
1490 io = declare_dependency(link_whole: libio, dependencies: [crypto, qom])
1492 libmigration = static_library('migration', sources: migration_files + genh,
1494 build_by_default: false)
1495 migration = declare_dependency(link_with: libmigration,
1496 dependencies: [zlib, qom, io])
1497 softmmu_ss.add(migration)
1499 block_ss = block_ss.apply(config_host, strict: false)
1500 libblock = static_library('block', block_ss.sources() + genh,
1501 dependencies: block_ss.dependencies(),
1502 link_depends: block_syms,
1504 build_by_default: false)
1506 block = declare_dependency(link_whole: [libblock],
1507 link_args: '@block.syms',
1508 dependencies: [crypto, io])
1510 qmp_ss = qmp_ss.apply(config_host, strict: false)
1511 libqmp = static_library('qmp', qmp_ss.sources() + genh,
1512 dependencies: qmp_ss.dependencies(),
1514 build_by_default: false)
1516 qmp = declare_dependency(link_whole: [libqmp])
1518 libchardev = static_library('chardev', chardev_ss.sources() + genh,
1520 build_by_default: false)
1522 chardev = declare_dependency(link_whole: libchardev)
1524 libhwcore = static_library('hwcore', sources: hwcore_files + genh,
1526 build_by_default: false)
1527 hwcore = declare_dependency(link_whole: libhwcore)
1528 common_ss.add(hwcore)
1534 foreach m : block_mods + softmmu_mods
1535 shared_module(m.name(),
1539 install_dir: config_host['qemu_moddir'])
1542 softmmu_ss.add(authz, block, chardev, crypto, io, qmp)
1543 common_ss.add(qom, qemuutil)
1545 common_ss.add_all(when: 'CONFIG_SOFTMMU', if_true: [softmmu_ss])
1546 common_ss.add_all(when: 'CONFIG_USER_ONLY', if_true: user_ss)
1548 common_all = common_ss.apply(config_all, strict: false)
1549 common_all = static_library('common',
1550 build_by_default: false,
1551 sources: common_all.sources() + genh,
1552 dependencies: common_all.dependencies(),
1555 feature_to_c = find_program('scripts/feature_to_c.sh')
1558 foreach target : target_dirs
1559 config_target = config_target_mak[target]
1560 target_name = config_target['TARGET_NAME']
1561 arch = config_target['TARGET_BASE_ARCH']
1562 arch_srcs = [config_target_h[target]]
1564 c_args = ['-DNEED_CPU_H',
1565 '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
1566 '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)]
1567 link_args = emulator_link_args
1569 config_target += config_host
1570 target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
1571 if targetos == 'linux'
1572 target_inc += include_directories('linux-headers', is_system: true)
1574 if target.endswith('-softmmu')
1575 qemu_target_name = 'qemu-system-' + target_name
1576 target_type='system'
1577 t = target_softmmu_arch[arch].apply(config_target, strict: false)
1578 arch_srcs += t.sources()
1579 arch_deps += t.dependencies()
1581 hw_dir = target_name == 'sparc64' ? 'sparc64' : arch
1582 hw = hw_arch[hw_dir].apply(config_target, strict: false)
1583 arch_srcs += hw.sources()
1584 arch_deps += hw.dependencies()
1586 arch_srcs += config_devices_h[target]
1587 link_args += ['@block.syms', '@qemu.syms']
1589 abi = config_target['TARGET_ABI_DIR']
1591 qemu_target_name = 'qemu-' + target_name
1592 if 'CONFIG_LINUX_USER' in config_target
1593 base_dir = 'linux-user'
1594 target_inc += include_directories('linux-user/host/' / config_host['ARCH'])
1596 base_dir = 'bsd-user'
1598 target_inc += include_directories(
1602 if 'CONFIG_LINUX_USER' in config_target
1603 dir = base_dir / abi
1604 arch_srcs += files(dir / 'signal.c', dir / 'cpu_loop.c')
1605 if config_target.has_key('TARGET_SYSTBL_ABI')
1607 syscall_nr_generators[abi].process(base_dir / abi / config_target['TARGET_SYSTBL'],
1608 extra_args : config_target['TARGET_SYSTBL_ABI'])
1613 if 'TARGET_XML_FILES' in config_target
1614 gdbstub_xml = custom_target(target + '-gdbstub-xml.c',
1615 output: target + '-gdbstub-xml.c',
1616 input: files(config_target['TARGET_XML_FILES'].split()),
1617 command: [feature_to_c, '@INPUT@'],
1619 arch_srcs += gdbstub_xml
1622 t = target_arch[arch].apply(config_target, strict: false)
1623 arch_srcs += t.sources()
1624 arch_deps += t.dependencies()
1626 target_common = common_ss.apply(config_target, strict: false)
1627 objects = common_all.extract_objects(target_common.sources())
1628 deps = target_common.dependencies()
1630 target_specific = specific_ss.apply(config_target, strict: false)
1631 arch_srcs += target_specific.sources()
1632 arch_deps += target_specific.dependencies()
1634 lib = static_library('qemu-' + target,
1635 sources: arch_srcs + genh,
1636 dependencies: arch_deps,
1638 include_directories: target_inc,
1640 build_by_default: false,
1643 if target.endswith('-softmmu')
1645 'name': 'qemu-system-' + target_name,
1647 'sources': files('softmmu/main.c'),
1650 if targetos == 'windows' and (sdl.found() or gtk.found())
1652 'name': 'qemu-system-' + target_name + 'w',
1654 'sources': files('softmmu/main.c'),
1658 if config_host.has_key('CONFIG_FUZZ')
1659 specific_fuzz = specific_fuzz_ss.apply(config_target, strict: false)
1661 'name': 'qemu-fuzz-' + target_name,
1663 'sources': specific_fuzz.sources(),
1664 'dependencies': specific_fuzz.dependencies(),
1669 'name': 'qemu-' + target_name,
1676 emulators += {exe['name']:
1677 executable(exe['name'], exe['sources'],
1680 dependencies: arch_deps + deps + exe['dependencies'],
1681 objects: lib.extract_all_objects(recursive: true),
1682 link_language: link_language,
1683 link_depends: [block_syms, qemu_syms] + exe.get('link_depends', []),
1684 link_args: link_args,
1685 gui_app: exe['gui'])
1688 if 'CONFIG_TRACE_SYSTEMTAP' in config_host
1690 {'ext': '.stp-build', 'fmt': 'stap', 'bin': meson.current_build_dir() / exe['name'], 'install': false},
1691 {'ext': '.stp', 'fmt': 'stap', 'bin': get_option('prefix') / get_option('bindir') / exe['name'], 'install': true},
1692 {'ext': '-simpletrace.stp', 'fmt': 'simpletrace-stap', 'bin': '', 'install': true},
1693 {'ext': '-log.stp', 'fmt': 'log-stap', 'bin': '', 'install': true},
1695 custom_target(exe['name'] + stp['ext'],
1696 input: trace_events_all,
1697 output: exe['name'] + stp['ext'],
1699 install: stp['install'],
1700 install_dir: qemu_datadir / '../systemtap/tapset',
1702 tracetool, '--group=all', '--format=' + stp['fmt'],
1703 '--binary=' + stp['bin'],
1704 '--target-name=' + target_name,
1705 '--target-type=' + target_type,
1706 '--probe-prefix=qemu.' + target_type + '.' + target_name,
1714 # Other build targets
1716 if 'CONFIG_PLUGIN' in config_host
1717 install_headers('include/qemu/qemu-plugin.h')
1720 if 'CONFIG_GUEST_AGENT' in config_host
1724 # Don't build qemu-keymap if xkbcommon is not explicitly enabled
1725 # when we don't build tools or system
1726 if xkbcommon.found()
1727 # used for the update-keymaps target, so include rules even if !have_tools
1728 qemu_keymap = executable('qemu-keymap', files('qemu-keymap.c', 'ui/input-keymap.c') + genh,
1729 dependencies: [qemuutil, xkbcommon], install: have_tools)
1733 qemu_img = executable('qemu-img', [files('qemu-img.c'), hxdep],
1734 dependencies: [authz, block, crypto, io, qom, qemuutil], install: true)
1735 qemu_io = executable('qemu-io', files('qemu-io.c'),
1736 dependencies: [block, qemuutil], install: true)
1737 qemu_nbd = executable('qemu-nbd', files('qemu-nbd.c'),
1738 dependencies: [block, qemuutil], install: true)
1740 subdir('storage-daemon')
1741 subdir('contrib/rdmacm-mux')
1742 subdir('contrib/elf2dmp')
1744 executable('qemu-edid', files('qemu-edid.c', 'hw/display/edid-generate.c'),
1745 dependencies: qemuutil,
1748 if 'CONFIG_VHOST_USER' in config_host
1749 subdir('contrib/libvhost-user')
1750 subdir('contrib/vhost-user-blk')
1751 subdir('contrib/vhost-user-gpu')
1752 subdir('contrib/vhost-user-input')
1753 subdir('contrib/vhost-user-scsi')
1756 if targetos == 'linux'
1757 executable('qemu-bridge-helper', files('qemu-bridge-helper.c'),
1758 dependencies: [qemuutil, libcap_ng],
1760 install_dir: get_option('libexecdir'))
1762 executable('qemu-pr-helper', files('scsi/qemu-pr-helper.c', 'scsi/utils.c'),
1763 dependencies: [authz, crypto, io, qom, qemuutil,
1764 libcap_ng, mpathpersist],
1768 if 'CONFIG_IVSHMEM' in config_host
1769 subdir('contrib/ivshmem-client')
1770 subdir('contrib/ivshmem-server')
1779 if 'CONFIG_GTK' in config_host
1783 if host_machine.system() == 'windows'
1785 find_program('scripts/nsis.py'),
1787 get_option('prefix'),
1788 meson.current_source_dir(),
1789 host_machine.cpu_family(),
1791 '-DDISPLAYVERSION=' + meson.project_version(),
1794 nsis_cmd += '-DCONFIG_DOCUMENTATION=y'
1796 if 'CONFIG_GTK' in config_host
1797 nsis_cmd += '-DCONFIG_GTK=y'
1800 nsis = custom_target('nsis',
1801 output: 'qemu-setup-' + meson.project_version() + '.exe',
1802 input: files('qemu.nsi'),
1803 build_always_stale: true,
1804 command: nsis_cmd + ['@INPUT@'])
1805 alias_target('installer', nsis)
1809 summary_info += {'Install prefix': config_host['prefix']}
1810 summary_info += {'BIOS directory': config_host['qemu_datadir']}
1811 summary_info += {'firmware path': config_host['qemu_firmwarepath']}
1812 summary_info += {'binary directory': config_host['bindir']}
1813 summary_info += {'library directory': config_host['libdir']}
1814 summary_info += {'module directory': config_host['qemu_moddir']}
1815 summary_info += {'libexec directory': config_host['libexecdir']}
1816 summary_info += {'include directory': config_host['includedir']}
1817 summary_info += {'config directory': config_host['sysconfdir']}
1818 if targetos != 'windows'
1819 summary_info += {'local state directory': config_host['qemu_localstatedir']}
1820 summary_info += {'Manual directory': get_option('mandir')}
1822 summary_info += {'local state directory': 'queried at runtime'}
1824 summary_info += {'Doc directory': get_option('docdir')}
1825 summary_info += {'Build directory': meson.current_build_dir()}
1826 summary_info += {'Source path': meson.current_source_dir()}
1827 summary_info += {'GIT binary': config_host['GIT']}
1828 summary_info += {'GIT submodules': config_host['GIT_SUBMODULES']}
1829 summary_info += {'C compiler': meson.get_compiler('c').cmd_array()[0]}
1830 summary_info += {'Host C compiler': meson.get_compiler('c', native: true).cmd_array()[0]}
1831 if link_language == 'cpp'
1832 summary_info += {'C++ compiler': meson.get_compiler('cpp').cmd_array()[0]}
1834 summary_info += {'C++ compiler': false}
1836 if targetos == 'darwin'
1837 summary_info += {'Objective-C compiler': meson.get_compiler('objc').cmd_array()[0]}
1839 summary_info += {'ARFLAGS': config_host['ARFLAGS']}
1840 summary_info += {'CFLAGS': ' '.join(get_option('c_args')
1841 + ['-O' + get_option('optimization')]
1842 + (get_option('debug') ? ['-g'] : []))}
1843 if link_language == 'cpp'
1844 summary_info += {'CXXFLAGS': ' '.join(get_option('cpp_args')
1845 + ['-O' + get_option('optimization')]
1846 + (get_option('debug') ? ['-g'] : []))}
1848 link_args = get_option(link_language + '_link_args')
1849 if link_args.length() > 0
1850 summary_info += {'LDFLAGS': ' '.join(link_args)}
1852 summary_info += {'QEMU_CFLAGS': config_host['QEMU_CFLAGS']}
1853 summary_info += {'QEMU_LDFLAGS': config_host['QEMU_LDFLAGS']}
1854 summary_info += {'make': config_host['MAKE']}
1855 summary_info += {'python': '@0@ (version: @1@)'.format(python.full_path(), python.language_version())}
1856 summary_info += {'sphinx-build': config_host['SPHINX_BUILD']}
1857 summary_info += {'genisoimage': config_host['GENISOIMAGE']}
1858 # TODO: add back version
1859 summary_info += {'slirp support': slirp_opt == 'disabled' ? false : slirp_opt}
1860 if slirp_opt != 'disabled'
1861 summary_info += {'smbd': config_host['CONFIG_SMBD_COMMAND']}
1863 summary_info += {'module support': config_host.has_key('CONFIG_MODULES')}
1864 if config_host.has_key('CONFIG_MODULES')
1865 summary_info += {'alternative module path': config_host.has_key('CONFIG_MODULE_UPGRADES')}
1867 summary_info += {'host CPU': cpu}
1868 summary_info += {'host endianness': build_machine.endian()}
1869 summary_info += {'target list': ' '.join(target_dirs)}
1870 summary_info += {'gprof enabled': config_host.has_key('CONFIG_GPROF')}
1871 summary_info += {'sparse enabled': sparse.found()}
1872 summary_info += {'strip binaries': get_option('strip')}
1873 summary_info += {'profiler': config_host.has_key('CONFIG_PROFILER')}
1874 summary_info += {'static build': config_host.has_key('CONFIG_STATIC')}
1875 if targetos == 'darwin'
1876 summary_info += {'Cocoa support': config_host.has_key('CONFIG_COCOA')}
1878 # TODO: add back version
1879 summary_info += {'SDL support': sdl.found()}
1880 summary_info += {'SDL image support': sdl_image.found()}
1881 # TODO: add back version
1882 summary_info += {'GTK support': config_host.has_key('CONFIG_GTK')}
1883 summary_info += {'GTK GL support': config_host.has_key('CONFIG_GTK_GL')}
1884 summary_info += {'pixman': pixman.found()}
1885 # TODO: add back version
1886 summary_info += {'VTE support': config_host.has_key('CONFIG_VTE')}
1887 summary_info += {'TLS priority': config_host['CONFIG_TLS_PRIORITY']}
1888 summary_info += {'GNUTLS support': config_host.has_key('CONFIG_GNUTLS')}
1889 # TODO: add back version
1890 summary_info += {'libgcrypt': config_host.has_key('CONFIG_GCRYPT')}
1891 if config_host.has_key('CONFIG_GCRYPT')
1892 summary_info += {' hmac': config_host.has_key('CONFIG_GCRYPT_HMAC')}
1893 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
1895 # TODO: add back version
1896 summary_info += {'nettle': config_host.has_key('CONFIG_NETTLE')}
1897 if config_host.has_key('CONFIG_NETTLE')
1898 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
1900 summary_info += {'libtasn1': config_host.has_key('CONFIG_TASN1')}
1901 summary_info += {'PAM': config_host.has_key('CONFIG_AUTH_PAM')}
1902 summary_info += {'iconv support': config_host.has_key('CONFIG_ICONV')}
1903 summary_info += {'curses support': config_host.has_key('CONFIG_CURSES')}
1904 # TODO: add back version
1905 summary_info += {'virgl support': config_host.has_key('CONFIG_VIRGL')}
1906 summary_info += {'curl support': config_host.has_key('CONFIG_CURL')}
1907 summary_info += {'mingw32 support': targetos == 'windows'}
1908 summary_info += {'Audio drivers': config_host['CONFIG_AUDIO_DRIVERS']}
1909 summary_info += {'Block whitelist (rw)': config_host['CONFIG_BDRV_RW_WHITELIST']}
1910 summary_info += {'Block whitelist (ro)': config_host['CONFIG_BDRV_RO_WHITELIST']}
1911 summary_info += {'VirtFS support': config_host.has_key('CONFIG_VIRTFS')}
1912 summary_info += {'Multipath support': mpathpersist.found()}
1913 summary_info += {'VNC support': vnc.found()}
1915 summary_info += {'VNC SASL support': sasl.found()}
1916 summary_info += {'VNC JPEG support': jpeg.found()}
1917 summary_info += {'VNC PNG support': png.found()}
1919 summary_info += {'xen support': config_host.has_key('CONFIG_XEN_BACKEND')}
1920 if config_host.has_key('CONFIG_XEN_BACKEND')
1921 summary_info += {'xen ctrl version': config_host['CONFIG_XEN_CTRL_INTERFACE_VERSION']}
1923 summary_info += {'brlapi support': config_host.has_key('CONFIG_BRLAPI')}
1924 summary_info += {'Documentation': config_host.has_key('BUILD_DOCS')}
1925 summary_info += {'PIE': get_option('b_pie')}
1926 summary_info += {'vde support': config_host.has_key('CONFIG_VDE')}
1927 summary_info += {'netmap support': config_host.has_key('CONFIG_NETMAP')}
1928 summary_info += {'Linux AIO support': config_host.has_key('CONFIG_LINUX_AIO')}
1929 summary_info += {'Linux io_uring support': config_host.has_key('CONFIG_LINUX_IO_URING')}
1930 summary_info += {'ATTR/XATTR support': config_host.has_key('CONFIG_ATTR')}
1931 summary_info += {'Install blobs': config_host.has_key('INSTALL_BLOBS')}
1932 summary_info += {'KVM support': config_all.has_key('CONFIG_KVM')}
1933 summary_info += {'HAX support': config_all.has_key('CONFIG_HAX')}
1934 summary_info += {'HVF support': config_all.has_key('CONFIG_HVF')}
1935 summary_info += {'WHPX support': config_all.has_key('CONFIG_WHPX')}
1936 summary_info += {'TCG support': config_all.has_key('CONFIG_TCG')}
1937 if config_all.has_key('CONFIG_TCG')
1938 summary_info += {'TCG debug enabled': config_host.has_key('CONFIG_DEBUG_TCG')}
1939 summary_info += {'TCG interpreter': config_host.has_key('CONFIG_TCG_INTERPRETER')}
1941 summary_info += {'malloc trim support': has_malloc_trim}
1942 summary_info += {'RDMA support': config_host.has_key('CONFIG_RDMA')}
1943 summary_info += {'PVRDMA support': config_host.has_key('CONFIG_PVRDMA')}
1944 summary_info += {'fdt support': fdt_opt == 'disabled' ? false : fdt_opt}
1945 summary_info += {'membarrier': config_host.has_key('CONFIG_MEMBARRIER')}
1946 summary_info += {'preadv support': config_host.has_key('CONFIG_PREADV')}
1947 summary_info += {'fdatasync': config_host.has_key('CONFIG_FDATASYNC')}
1948 summary_info += {'madvise': config_host.has_key('CONFIG_MADVISE')}
1949 summary_info += {'posix_madvise': config_host.has_key('CONFIG_POSIX_MADVISE')}
1950 summary_info += {'posix_memalign': config_host.has_key('CONFIG_POSIX_MEMALIGN')}
1951 summary_info += {'libcap-ng support': config_host.has_key('CONFIG_LIBCAP_NG')}
1952 summary_info += {'vhost-net support': config_host.has_key('CONFIG_VHOST_NET')}
1953 summary_info += {'vhost-crypto support': config_host.has_key('CONFIG_VHOST_CRYPTO')}
1954 summary_info += {'vhost-scsi support': config_host.has_key('CONFIG_VHOST_SCSI')}
1955 summary_info += {'vhost-vsock support': config_host.has_key('CONFIG_VHOST_VSOCK')}
1956 summary_info += {'vhost-user support': config_host.has_key('CONFIG_VHOST_KERNEL')}
1957 summary_info += {'vhost-user-fs support': config_host.has_key('CONFIG_VHOST_USER_FS')}
1958 summary_info += {'vhost-vdpa support': config_host.has_key('CONFIG_VHOST_VDPA')}
1959 summary_info += {'Trace backends': config_host['TRACE_BACKENDS']}
1960 if config_host['TRACE_BACKENDS'].split().contains('simple')
1961 summary_info += {'Trace output file': config_host['CONFIG_TRACE_FILE'] + '-<pid>'}
1963 # TODO: add back protocol and server version
1964 summary_info += {'spice support': config_host.has_key('CONFIG_SPICE')}
1965 summary_info += {'rbd support': config_host.has_key('CONFIG_RBD')}
1966 summary_info += {'xfsctl support': config_host.has_key('CONFIG_XFS')}
1967 summary_info += {'smartcard support': config_host.has_key('CONFIG_SMARTCARD')}
1968 summary_info += {'U2F support': u2f.found()}
1969 summary_info += {'libusb': config_host.has_key('CONFIG_USB_LIBUSB')}
1970 summary_info += {'usb net redir': config_host.has_key('CONFIG_USB_REDIR')}
1971 summary_info += {'OpenGL support': config_host.has_key('CONFIG_OPENGL')}
1972 summary_info += {'OpenGL dmabufs': config_host.has_key('CONFIG_OPENGL_DMABUF')}
1973 summary_info += {'libiscsi support': config_host.has_key('CONFIG_LIBISCSI')}
1974 summary_info += {'libnfs support': config_host.has_key('CONFIG_LIBNFS')}
1975 summary_info += {'build guest agent': config_host.has_key('CONFIG_GUEST_AGENT')}
1976 if targetos == 'windows'
1977 if 'WIN_SDK' in config_host
1978 summary_info += {'Windows SDK': config_host['WIN_SDK']}
1980 summary_info += {'QGA VSS support': config_host.has_key('CONFIG_QGA_VSS')}
1981 summary_info += {'QGA w32 disk info': config_host.has_key('CONFIG_QGA_NTDDSCSI')}
1982 summary_info += {'QGA MSI support': config_host.has_key('CONFIG_QGA_MSI')}
1984 summary_info += {'seccomp support': config_host.has_key('CONFIG_SECCOMP')}
1985 summary_info += {'coroutine backend': config_host['CONFIG_COROUTINE_BACKEND']}
1986 summary_info += {'coroutine pool': config_host['CONFIG_COROUTINE_POOL'] == '1'}
1987 summary_info += {'debug stack usage': config_host.has_key('CONFIG_DEBUG_STACK_USAGE')}
1988 summary_info += {'mutex debugging': config_host.has_key('CONFIG_DEBUG_MUTEX')}
1989 summary_info += {'crypto afalg': config_host.has_key('CONFIG_AF_ALG')}
1990 summary_info += {'GlusterFS support': config_host.has_key('CONFIG_GLUSTERFS')}
1991 summary_info += {'gcov': get_option('b_coverage')}
1992 summary_info += {'TPM support': config_host.has_key('CONFIG_TPM')}
1993 summary_info += {'libssh support': config_host.has_key('CONFIG_LIBSSH')}
1994 summary_info += {'QOM debugging': config_host.has_key('CONFIG_QOM_CAST_DEBUG')}
1995 summary_info += {'Live block migration': config_host.has_key('CONFIG_LIVE_BLOCK_MIGRATION')}
1996 summary_info += {'lzo support': config_host.has_key('CONFIG_LZO')}
1997 summary_info += {'snappy support': config_host.has_key('CONFIG_SNAPPY')}
1998 summary_info += {'bzip2 support': config_host.has_key('CONFIG_BZIP2')}
1999 summary_info += {'lzfse support': config_host.has_key('CONFIG_LZFSE')}
2000 summary_info += {'zstd support': config_host.has_key('CONFIG_ZSTD')}
2001 summary_info += {'NUMA host support': config_host.has_key('CONFIG_NUMA')}
2002 summary_info += {'libxml2': config_host.has_key('CONFIG_LIBXML2')}
2003 summary_info += {'memory allocator': get_option('malloc')}
2004 summary_info += {'avx2 optimization': config_host.has_key('CONFIG_AVX2_OPT')}
2005 summary_info += {'avx512f optimization': config_host.has_key('CONFIG_AVX512F_OPT')}
2006 summary_info += {'replication support': config_host.has_key('CONFIG_REPLICATION')}
2007 summary_info += {'bochs support': config_host.has_key('CONFIG_BOCHS')}
2008 summary_info += {'cloop support': config_host.has_key('CONFIG_CLOOP')}
2009 summary_info += {'dmg support': config_host.has_key('CONFIG_DMG')}
2010 summary_info += {'qcow v1 support': config_host.has_key('CONFIG_QCOW1')}
2011 summary_info += {'vdi support': config_host.has_key('CONFIG_VDI')}
2012 summary_info += {'vvfat support': config_host.has_key('CONFIG_VVFAT')}
2013 summary_info += {'qed support': config_host.has_key('CONFIG_QED')}
2014 summary_info += {'parallels support': config_host.has_key('CONFIG_PARALLELS')}
2015 summary_info += {'sheepdog support': config_host.has_key('CONFIG_SHEEPDOG')}
2016 summary_info += {'capstone': capstone_opt == 'disabled' ? false : capstone_opt}
2017 summary_info += {'libpmem support': config_host.has_key('CONFIG_LIBPMEM')}
2018 summary_info += {'libdaxctl support': config_host.has_key('CONFIG_LIBDAXCTL')}
2019 summary_info += {'libudev': libudev.found()}
2020 summary_info += {'default devices': config_host['CONFIG_MINIKCONF_MODE'] == '--defconfig'}
2021 summary_info += {'plugin support': config_host.has_key('CONFIG_PLUGIN')}
2022 summary_info += {'fuzzing support': config_host.has_key('CONFIG_FUZZ')}
2023 if config_host.has_key('HAVE_GDB_BIN')
2024 summary_info += {'gdb': config_host['HAVE_GDB_BIN']}
2026 summary_info += {'thread sanitizer': config_host.has_key('CONFIG_TSAN')}
2027 summary_info += {'rng-none': config_host.has_key('CONFIG_RNG_NONE')}
2028 summary_info += {'Linux keyring': config_host.has_key('CONFIG_SECRET_KEYRING')}
2029 summary(summary_info, bool_yn: true)
2031 if not supported_cpus.contains(cpu)
2033 warning('SUPPORT FOR THIS HOST CPU WILL GO AWAY IN FUTURE RELEASES!')
2035 message('CPU host architecture ' + cpu + ' support is not currently maintained.')
2036 message('The QEMU project intends to remove support for this host CPU in')
2037 message('a future release if nobody volunteers to maintain it and to')
2038 message('provide a build host for our continuous integration setup.')
2039 message('configure has succeeded and you can continue to build, but')
2040 message('if you care about QEMU on this platform you should contact')
2041 message('us upstream at qemu-devel@nongnu.org.')
2044 if not supported_oses.contains(targetos)
2046 warning('WARNING: SUPPORT FOR THIS HOST OS WILL GO AWAY IN FUTURE RELEASES!')
2048 message('Host OS ' + targetos + 'support is not currently maintained.')
2049 message('The QEMU project intends to remove support for this host OS in')
2050 message('a future release if nobody volunteers to maintain it and to')
2051 message('provide a build host for our continuous integration setup.')
2052 message('configure has succeeded and you can continue to build, but')
2053 message('if you care about QEMU on this platform you should contact')
2054 message('us upstream at qemu-devel@nongnu.org.')