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']
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')
617 # Create config-host.h
619 config_host_data.set('CONFIG_COCOA', cocoa.found())
620 config_host_data.set('CONFIG_LIBUDEV', libudev.found())
621 config_host_data.set('CONFIG_MPATH', mpathpersist.found())
622 config_host_data.set('CONFIG_MPATH_NEW_API', mpathpersist_new_api)
623 config_host_data.set('CONFIG_SDL', sdl.found())
624 config_host_data.set('CONFIG_SDL_IMAGE', sdl_image.found())
625 config_host_data.set('CONFIG_VNC', vnc.found())
626 config_host_data.set('CONFIG_VNC_JPEG', jpeg.found())
627 config_host_data.set('CONFIG_VNC_PNG', png.found())
628 config_host_data.set('CONFIG_VNC_SASL', sasl.found())
629 config_host_data.set('CONFIG_XKBCOMMON', xkbcommon.found())
630 config_host_data.set('CONFIG_KEYUTILS', keyutils.found())
631 config_host_data.set('CONFIG_GETTID', has_gettid)
632 config_host_data.set('CONFIG_MALLOC_TRIM', has_malloc_trim)
633 config_host_data.set('QEMU_VERSION', '"@0@"'.format(meson.project_version()))
634 config_host_data.set('QEMU_VERSION_MAJOR', meson.project_version().split('.')[0])
635 config_host_data.set('QEMU_VERSION_MINOR', meson.project_version().split('.')[1])
636 config_host_data.set('QEMU_VERSION_MICRO', meson.project_version().split('.')[2])
638 ignored = ['CONFIG_QEMU_INTERP_PREFIX'] # actually per-target
639 arrays = ['CONFIG_AUDIO_DRIVERS', 'CONFIG_BDRV_RW_WHITELIST', 'CONFIG_BDRV_RO_WHITELIST']
640 strings = ['HOST_DSOSUF', 'CONFIG_IASL', 'bindir', 'prefix', 'qemu_confdir', 'qemu_datadir',
641 'qemu_moddir', 'qemu_localstatedir', 'qemu_helperdir', 'qemu_localedir',
642 'qemu_icondir', 'qemu_desktopdir', 'qemu_firmwarepath', 'sysconfdir']
643 foreach k, v: config_host
644 if ignored.contains(k)
646 elif arrays.contains(k)
648 v = '"' + '", "'.join(v.split()) + '", '
650 config_host_data.set(k, v)
652 config_host_data.set('HOST_' + v.to_upper(), 1)
653 elif strings.contains(k)
654 if not k.startswith('CONFIG_')
655 k = 'CONFIG_' + k.to_upper()
657 config_host_data.set_quoted(k, v)
658 elif k.startswith('CONFIG_') or k.startswith('HAVE_') or k.startswith('HOST_')
659 config_host_data.set(k, v == 'y' ? 1 : v)
663 minikconf = find_program('scripts/minikconf.py')
665 config_all_devices = {}
666 config_all_disas = {}
667 config_devices_mak_list = []
668 config_devices_h = {}
670 config_target_mak = {}
673 'alpha' : ['CONFIG_ALPHA_DIS'],
674 'arm' : ['CONFIG_ARM_DIS'],
675 'avr' : ['CONFIG_AVR_DIS'],
676 'cris' : ['CONFIG_CRIS_DIS'],
677 'hppa' : ['CONFIG_HPPA_DIS'],
678 'i386' : ['CONFIG_I386_DIS'],
679 'x86_64' : ['CONFIG_I386_DIS'],
680 'x32' : ['CONFIG_I386_DIS'],
681 'lm32' : ['CONFIG_LM32_DIS'],
682 'm68k' : ['CONFIG_M68K_DIS'],
683 'microblaze' : ['CONFIG_MICROBLAZE_DIS'],
684 'mips' : ['CONFIG_MIPS_DIS'],
685 'moxie' : ['CONFIG_MOXIE_DIS'],
686 'nios2' : ['CONFIG_NIOS2_DIS'],
687 'or1k' : ['CONFIG_OPENRISC_DIS'],
688 'ppc' : ['CONFIG_PPC_DIS'],
689 'riscv' : ['CONFIG_RISCV_DIS'],
690 'rx' : ['CONFIG_RX_DIS'],
691 's390' : ['CONFIG_S390_DIS'],
692 'sh4' : ['CONFIG_SH4_DIS'],
693 'sparc' : ['CONFIG_SPARC_DIS'],
694 'xtensa' : ['CONFIG_XTENSA_DIS'],
696 if link_language == 'cpp'
698 'aarch64' : [ 'CONFIG_ARM_A64_DIS'],
699 'arm' : [ 'CONFIG_ARM_DIS', 'CONFIG_ARM_A64_DIS'],
700 'mips' : [ 'CONFIG_MIPS_DIS', 'CONFIG_NANOMIPS_DIS'],
704 kconfig_external_symbols = [
714 'CONFIG_VHOST_KERNEL',
719 ignored = [ 'TARGET_XML_FILES', 'TARGET_ABI_DIR', 'TARGET_ARCH' ]
721 default_targets = 'CONFIG_DEFAULT_TARGETS' in config_host
722 actual_target_dirs = []
724 foreach target : target_dirs
725 config_target = { 'TARGET_NAME': target.split('-')[0] }
726 if target.endswith('linux-user')
727 if targetos != 'linux'
731 error('Target @0@ is only available on a Linux host'.format(target))
733 config_target += { 'CONFIG_LINUX_USER': 'y' }
734 elif target.endswith('bsd-user')
735 if 'CONFIG_BSD' not in config_host
739 error('Target @0@ is only available on a BSD host'.format(target))
741 config_target += { 'CONFIG_BSD_USER': 'y' }
742 elif target.endswith('softmmu')
743 config_target += { 'CONFIG_SOFTMMU': 'y' }
745 if target.endswith('-user')
747 'CONFIG_USER_ONLY': 'y',
748 'CONFIG_QEMU_INTERP_PREFIX':
749 config_host['CONFIG_QEMU_INTERP_PREFIX'].format(config_target['TARGET_NAME'])
754 foreach sym: accelerators
755 if sym == 'CONFIG_TCG' or target in accelerator_targets.get(sym, [])
756 config_target += { sym: 'y' }
757 config_all += { sym: 'y' }
758 if sym == 'CONFIG_XEN' and have_xen_pci_passthrough
759 config_target += { 'CONFIG_XEN_PCI_PASSTHROUGH': 'y' }
768 error('No accelerator available for target @0@'.format(target))
771 actual_target_dirs += target
772 config_target += keyval.load('default-configs/targets' / target + '.mak')
773 config_target += { 'TARGET_' + config_target['TARGET_ARCH'].to_upper(): 'y' }
775 if 'TARGET_NEED_FDT' in config_target
776 fdt_required += target
780 if 'TARGET_BASE_ARCH' not in config_target
781 config_target += {'TARGET_BASE_ARCH': config_target['TARGET_ARCH']}
783 if 'TARGET_ABI_DIR' not in config_target
784 config_target += {'TARGET_ABI_DIR': config_target['TARGET_ARCH']}
787 foreach k, v: disassemblers
788 if config_host['ARCH'].startswith(k) or config_target['TARGET_BASE_ARCH'].startswith(k)
790 config_target += { sym: 'y' }
791 config_all_disas += { sym: 'y' }
796 config_target_data = configuration_data()
797 foreach k, v: config_target
798 if not k.startswith('TARGET_') and not k.startswith('CONFIG_')
800 elif ignored.contains(k)
802 elif k == 'TARGET_BASE_ARCH'
803 # Note that TARGET_BASE_ARCH ends up in config-target.h but it is
804 # not used to select files from sourcesets.
805 config_target_data.set('TARGET_' + v.to_upper(), 1)
806 elif k == 'TARGET_NAME' or k == 'CONFIG_QEMU_INTERP_PREFIX'
807 config_target_data.set_quoted(k, v)
809 config_target_data.set(k, 1)
811 config_target_data.set(k, v)
814 config_target_h += {target: configure_file(output: target + '-config-target.h',
815 configuration: config_target_data)}
817 if target.endswith('-softmmu')
819 foreach sym : kconfig_external_symbols
820 if sym in config_target or sym in config_host
821 base_kconfig += '@0@=y'.format(sym)
825 config_devices_mak = target + '-config-devices.mak'
826 config_devices_mak = configure_file(
827 input: ['default-configs/devices' / target + '.mak', 'Kconfig'],
828 output: config_devices_mak,
829 depfile: config_devices_mak + '.d',
831 command: [minikconf, config_host['CONFIG_MINIKCONF_MODE'],
832 config_devices_mak, '@DEPFILE@', '@INPUT@',
835 config_devices_data = configuration_data()
836 config_devices = keyval.load(config_devices_mak)
837 foreach k, v: config_devices
838 config_devices_data.set(k, 1)
840 config_devices_mak_list += config_devices_mak
841 config_devices_h += {target: configure_file(output: target + '-config-devices.h',
842 configuration: config_devices_data)}
843 config_target += config_devices
844 config_all_devices += config_devices
846 config_target_mak += {target: config_target}
848 target_dirs = actual_target_dirs
850 # This configuration is used to build files that are shared by
851 # multiple binaries, and then extracted out of the "common"
852 # static_library target.
854 # We do not use all_sources()/all_dependencies(), because it would
855 # build literally all source files, including devices only used by
856 # targets that are not built for this compilation. The CONFIG_ALL
857 # pseudo symbol replaces it.
859 config_all += config_all_devices
860 config_all += config_host
861 config_all += config_all_disas
863 'CONFIG_XEN': config_host.has_key('CONFIG_XEN_BACKEND'),
864 'CONFIG_SOFTMMU': have_system,
865 'CONFIG_USER_ONLY': have_user,
872 capstone_opt = get_option('capstone')
873 if capstone_opt in ['enabled', 'auto', 'system']
874 have_internal = fs.exists(meson.current_source_dir() / 'capstone/Makefile')
875 capstone = dependency('capstone', version: '>=4.0',
876 static: enable_static, method: 'pkg-config',
877 required: capstone_opt == 'system' or
878 capstone_opt == 'enabled' and not have_internal)
880 capstone_opt = 'system'
882 capstone_opt = 'internal'
884 capstone_opt = 'disabled'
887 if capstone_opt == 'internal'
888 capstone_data = configuration_data()
889 capstone_data.set('CAPSTONE_USE_SYS_DYN_MEM', '1')
891 capstone_files = files(
894 'capstone/MCInstrDesc.c',
895 'capstone/MCRegisterInfo.c',
896 'capstone/SStream.c',
900 if 'CONFIG_ARM_DIS' in config_all_disas
901 capstone_data.set('CAPSTONE_HAS_ARM', '1')
902 capstone_files += files(
903 'capstone/arch/ARM/ARMDisassembler.c',
904 'capstone/arch/ARM/ARMInstPrinter.c',
905 'capstone/arch/ARM/ARMMapping.c',
906 'capstone/arch/ARM/ARMModule.c'
910 # FIXME: This config entry currently depends on a c++ compiler.
911 # Which is needed for building libvixl, but not for capstone.
912 if 'CONFIG_ARM_A64_DIS' in config_all_disas
913 capstone_data.set('CAPSTONE_HAS_ARM64', '1')
914 capstone_files += files(
915 'capstone/arch/AArch64/AArch64BaseInfo.c',
916 'capstone/arch/AArch64/AArch64Disassembler.c',
917 'capstone/arch/AArch64/AArch64InstPrinter.c',
918 'capstone/arch/AArch64/AArch64Mapping.c',
919 'capstone/arch/AArch64/AArch64Module.c'
923 if 'CONFIG_PPC_DIS' in config_all_disas
924 capstone_data.set('CAPSTONE_HAS_POWERPC', '1')
925 capstone_files += files(
926 'capstone/arch/PowerPC/PPCDisassembler.c',
927 'capstone/arch/PowerPC/PPCInstPrinter.c',
928 'capstone/arch/PowerPC/PPCMapping.c',
929 'capstone/arch/PowerPC/PPCModule.c'
933 if 'CONFIG_S390_DIS' in config_all_disas
934 capstone_data.set('CAPSTONE_HAS_SYSZ', '1')
935 capstone_files += files(
936 'capstone/arch/SystemZ/SystemZDisassembler.c',
937 'capstone/arch/SystemZ/SystemZInstPrinter.c',
938 'capstone/arch/SystemZ/SystemZMapping.c',
939 'capstone/arch/SystemZ/SystemZModule.c',
940 'capstone/arch/SystemZ/SystemZMCTargetDesc.c'
944 if 'CONFIG_I386_DIS' in config_all_disas
945 capstone_data.set('CAPSTONE_HAS_X86', 1)
946 capstone_files += files(
947 'capstone/arch/X86/X86Disassembler.c',
948 'capstone/arch/X86/X86DisassemblerDecoder.c',
949 'capstone/arch/X86/X86ATTInstPrinter.c',
950 'capstone/arch/X86/X86IntelInstPrinter.c',
951 'capstone/arch/X86/X86InstPrinterCommon.c',
952 'capstone/arch/X86/X86Mapping.c',
953 'capstone/arch/X86/X86Module.c'
957 configure_file(output: 'capstone-defs.h', configuration: capstone_data)
960 # FIXME: There does not seem to be a way to completely replace the c_args
961 # that come from add_project_arguments() -- we can only add to them.
962 # So: disable all warnings with a big hammer.
965 # Include all configuration defines via a header file, which will wind up
966 # as a dependency on the object file, and thus changes here will result
968 '-include', 'capstone-defs.h'
971 libcapstone = static_library('capstone',
972 sources: capstone_files,
973 c_args: capstone_cargs,
974 include_directories: 'capstone/include')
975 capstone = declare_dependency(link_with: libcapstone,
976 include_directories: 'capstone/include/capstone')
980 slirp_opt = 'disabled'
982 slirp_opt = get_option('slirp')
983 if slirp_opt in ['enabled', 'auto', 'system']
984 have_internal = fs.exists(meson.current_source_dir() / 'slirp/meson.build')
985 slirp = dependency('slirp', static: enable_static,
986 method: 'pkg-config',
987 required: slirp_opt == 'system' or
988 slirp_opt == 'enabled' and not have_internal)
992 slirp_opt = 'internal'
994 slirp_opt = 'disabled'
997 if slirp_opt == 'internal'
999 if targetos == 'windows'
1000 slirp_deps = cc.find_library('iphlpapi')
1002 slirp_conf = configuration_data()
1003 slirp_conf.set('SLIRP_MAJOR_VERSION', meson.project_version().split('.')[0])
1004 slirp_conf.set('SLIRP_MINOR_VERSION', meson.project_version().split('.')[1])
1005 slirp_conf.set('SLIRP_MICRO_VERSION', meson.project_version().split('.')[2])
1006 slirp_conf.set_quoted('SLIRP_VERSION_STRING', meson.project_version())
1007 slirp_cargs = ['-DG_LOG_DOMAIN="Slirp"']
1009 'slirp/src/arp_table.c',
1010 'slirp/src/bootp.c',
1011 'slirp/src/cksum.c',
1012 'slirp/src/dhcpv6.c',
1013 'slirp/src/dnssearch.c',
1015 'slirp/src/ip6_icmp.c',
1016 'slirp/src/ip6_input.c',
1017 'slirp/src/ip6_output.c',
1018 'slirp/src/ip_icmp.c',
1019 'slirp/src/ip_input.c',
1020 'slirp/src/ip_output.c',
1024 'slirp/src/ndp_table.c',
1026 'slirp/src/slirp.c',
1027 'slirp/src/socket.c',
1028 'slirp/src/state.c',
1029 'slirp/src/stream.c',
1030 'slirp/src/tcp_input.c',
1031 'slirp/src/tcp_output.c',
1032 'slirp/src/tcp_subr.c',
1033 'slirp/src/tcp_timer.c',
1038 'slirp/src/version.c',
1039 'slirp/src/vmstate.c',
1043 input : 'slirp/src/libslirp-version.h.in',
1044 output : 'libslirp-version.h',
1045 configuration: slirp_conf)
1047 slirp_inc = include_directories('slirp', 'slirp/src')
1048 libslirp = static_library('slirp',
1049 sources: slirp_files,
1050 c_args: slirp_cargs,
1051 include_directories: slirp_inc)
1052 slirp = declare_dependency(link_with: libslirp,
1053 dependencies: slirp_deps,
1054 include_directories: slirp_inc)
1059 fdt_opt = get_option('fdt')
1061 if fdt_opt in ['enabled', 'auto', 'system']
1062 have_internal = fs.exists(meson.current_source_dir() / 'dtc/libfdt/Makefile.libfdt')
1063 fdt = cc.find_library('fdt', static: enable_static,
1064 required: fdt_opt == 'system' or
1065 fdt_opt == 'enabled' and not have_internal)
1066 if fdt.found() and cc.links('''
1068 #include <libfdt_env.h>
1069 int main(void) { fdt_check_full(NULL, 0); return 0; }''',
1073 fdt_opt = 'internal'
1075 fdt_opt = 'disabled'
1078 if fdt_opt == 'internal'
1081 'dtc/libfdt/fdt_ro.c',
1082 'dtc/libfdt/fdt_wip.c',
1083 'dtc/libfdt/fdt_sw.c',
1084 'dtc/libfdt/fdt_rw.c',
1085 'dtc/libfdt/fdt_strerror.c',
1086 'dtc/libfdt/fdt_empty_tree.c',
1087 'dtc/libfdt/fdt_addresses.c',
1088 'dtc/libfdt/fdt_overlay.c',
1089 'dtc/libfdt/fdt_check.c',
1092 fdt_inc = include_directories('dtc/libfdt')
1093 libfdt = static_library('fdt',
1095 include_directories: fdt_inc)
1096 fdt = declare_dependency(link_with: libfdt,
1097 include_directories: fdt_inc)
1100 if not fdt.found() and fdt_required.length() > 0
1101 error('fdt not available but required by targets ' + ', '.join(fdt_required))
1104 config_host_data.set('CONFIG_CAPSTONE', capstone.found())
1105 config_host_data.set('CONFIG_FDT', fdt.found())
1106 config_host_data.set('CONFIG_SLIRP', slirp.found())
1108 genh += configure_file(output: 'config-host.h', configuration: config_host_data)
1112 hxtool = find_program('scripts/hxtool')
1113 shaderinclude = find_program('scripts/shaderinclude.pl')
1114 qapi_gen = find_program('scripts/qapi-gen.py')
1115 qapi_gen_depends = [ meson.source_root() / 'scripts/qapi/__init__.py',
1116 meson.source_root() / 'scripts/qapi/commands.py',
1117 meson.source_root() / 'scripts/qapi/common.py',
1118 meson.source_root() / 'scripts/qapi/error.py',
1119 meson.source_root() / 'scripts/qapi/events.py',
1120 meson.source_root() / 'scripts/qapi/expr.py',
1121 meson.source_root() / 'scripts/qapi/gen.py',
1122 meson.source_root() / 'scripts/qapi/introspect.py',
1123 meson.source_root() / 'scripts/qapi/parser.py',
1124 meson.source_root() / 'scripts/qapi/schema.py',
1125 meson.source_root() / 'scripts/qapi/source.py',
1126 meson.source_root() / 'scripts/qapi/types.py',
1127 meson.source_root() / 'scripts/qapi/visit.py',
1128 meson.source_root() / 'scripts/qapi/common.py',
1129 meson.source_root() / 'scripts/qapi-gen.py'
1133 python, files('scripts/tracetool.py'),
1134 '--backend=' + config_host['TRACE_BACKENDS']
1137 qemu_version_cmd = [find_program('scripts/qemu-version.sh'),
1138 meson.current_source_dir(),
1139 config_host['PKGVERSION'], meson.project_version()]
1140 qemu_version = custom_target('qemu-version.h',
1141 output: 'qemu-version.h',
1142 command: qemu_version_cmd,
1144 build_by_default: true,
1145 build_always_stale: true)
1146 genh += qemu_version
1150 ['qemu-options.hx', 'qemu-options.def'],
1151 ['qemu-img-cmds.hx', 'qemu-img-cmds.h'],
1155 ['hmp-commands.hx', 'hmp-commands.h'],
1156 ['hmp-commands-info.hx', 'hmp-commands-info.h'],
1159 foreach d : hx_headers
1160 hxdep += custom_target(d[1],
1164 build_by_default: true, # to be removed when added to a target
1165 command: [hxtool, '-h', '@INPUT0@'])
1169 SPHINX_ARGS = [config_host['SPHINX_BUILD'],
1170 '-Dversion=' + meson.project_version(),
1171 '-Drelease=' + config_host['PKGVERSION']]
1173 if get_option('werror')
1174 SPHINX_ARGS += [ '-W' ]
1177 sphinx_extn_depends = [ meson.source_root() / 'docs/sphinx/depfile.py',
1178 meson.source_root() / 'docs/sphinx/hxtool.py',
1179 meson.source_root() / 'docs/sphinx/kerneldoc.py',
1180 meson.source_root() / 'docs/sphinx/kernellog.py',
1181 meson.source_root() / 'docs/sphinx/qapidoc.py',
1182 meson.source_root() / 'docs/sphinx/qmp_lexer.py',
1185 # Collect sourcesets.
1187 authz_ss = ss.source_set()
1188 blockdev_ss = ss.source_set()
1189 block_ss = ss.source_set()
1190 bsd_user_ss = ss.source_set()
1191 chardev_ss = ss.source_set()
1192 common_ss = ss.source_set()
1193 crypto_ss = ss.source_set()
1194 io_ss = ss.source_set()
1195 linux_user_ss = ss.source_set()
1196 qmp_ss = ss.source_set()
1197 qom_ss = ss.source_set()
1198 softmmu_ss = ss.source_set()
1199 specific_fuzz_ss = ss.source_set()
1200 specific_ss = ss.source_set()
1201 stub_ss = ss.source_set()
1202 trace_ss = ss.source_set()
1203 user_ss = ss.source_set()
1204 util_ss = ss.source_set()
1209 target_softmmu_arch = {}
1215 # TODO: add each directory to the subdirs from its own meson.build, once
1217 trace_events_subdirs = [
1224 trace_events_subdirs += [ 'linux-user' ]
1227 trace_events_subdirs += [
1236 trace_events_subdirs += [
1247 'hw/block/dataplane',
1292 trace_events_subdirs += [
1319 libmodulecommon = static_library('module-common', files('module-common.c') + genh, pic: true, c_args: '-DBUILD_DSO')
1320 modulecommon = declare_dependency(link_whole: libmodulecommon, compile_args: '-DBUILD_DSO')
1323 # Build targets from sourcesets
1325 stub_ss = stub_ss.apply(config_all, strict: false)
1327 util_ss.add_all(trace_ss)
1328 util_ss = util_ss.apply(config_all, strict: false)
1329 libqemuutil = static_library('qemuutil',
1330 sources: util_ss.sources() + stub_ss.sources() + genh,
1331 dependencies: [util_ss.dependencies(), m, glib, socket, malloc])
1332 qemuutil = declare_dependency(link_with: libqemuutil,
1333 sources: genh + version_res)
1335 decodetree = generator(find_program('scripts/decodetree.py'),
1336 output: 'decode-@BASENAME@.c.inc',
1337 arguments: ['@INPUT@', '@EXTRA_ARGS@', '-o', '@OUTPUT@'])
1343 subdir('libdecnumber')
1354 block_ss.add(when: 'CONFIG_REPLICATION', if_true: files('replication.c'))
1360 blockdev_ss.add(files(
1366 # os-posix.c contains POSIX-specific functions used by qemu-storage-daemon,
1367 # os-win32.c does not
1368 blockdev_ss.add(when: 'CONFIG_POSIX', if_true: files('os-posix.c'))
1369 softmmu_ss.add(when: 'CONFIG_WIN32', if_true: [files('os-win32.c')])
1370 softmmu_ss.add_all(blockdev_ss)
1372 common_ss.add(files('cpus-common.c'))
1376 common_ss.add(capstone)
1377 specific_ss.add(files('cpu.c', 'disas.c', 'gdbstub.c'), capstone)
1378 specific_ss.add(files('exec-vary.c'))
1379 specific_ss.add(when: 'CONFIG_TCG', if_true: files(
1383 'tcg/tcg-op-gvec.c',
1388 specific_ss.add(when: 'CONFIG_TCG_INTERPRETER', if_true: files('disas/tci.c', 'tcg/tci.c'))
1400 subdir('linux-user')
1402 bsd_user_ss.add(files('gdbstub.c'))
1403 specific_ss.add_all(when: 'CONFIG_BSD_USER', if_true: bsd_user_ss)
1405 linux_user_ss.add(files('gdbstub.c', 'thunk.c'))
1406 specific_ss.add_all(when: 'CONFIG_LINUX_USER', if_true: linux_user_ss)
1408 # needed for fuzzing binaries
1409 subdir('tests/qtest/libqos')
1410 subdir('tests/qtest/fuzz')
1414 foreach d, list : modules
1415 foreach m, module_ss : list
1416 if enable_modules and targetos != 'windows'
1417 module_ss = module_ss.apply(config_all, strict: false)
1418 sl = static_library(d + '-' + m, [genh, module_ss.sources()],
1419 dependencies: [modulecommon, module_ss.dependencies()], pic: true)
1427 block_ss.add_all(module_ss)
1429 softmmu_ss.add_all(module_ss)
1435 nm = find_program('nm')
1436 undefsym = find_program('scripts/undefsym.py')
1437 block_syms = custom_target('block.syms', output: 'block.syms',
1438 input: [libqemuutil, block_mods],
1440 command: [undefsym, nm, '@INPUT@'])
1441 qemu_syms = custom_target('qemu.syms', output: 'qemu.syms',
1442 input: [libqemuutil, softmmu_mods],
1444 command: [undefsym, nm, '@INPUT@'])
1446 ########################
1447 # Library dependencies #
1448 ########################
1450 qom_ss = qom_ss.apply(config_host, strict: false)
1451 libqom = static_library('qom', qom_ss.sources() + genh,
1452 dependencies: [qom_ss.dependencies()],
1455 qom = declare_dependency(link_whole: libqom)
1457 authz_ss = authz_ss.apply(config_host, strict: false)
1458 libauthz = static_library('authz', authz_ss.sources() + genh,
1459 dependencies: [authz_ss.dependencies()],
1461 build_by_default: false)
1463 authz = declare_dependency(link_whole: libauthz,
1466 crypto_ss = crypto_ss.apply(config_host, strict: false)
1467 libcrypto = static_library('crypto', crypto_ss.sources() + genh,
1468 dependencies: [crypto_ss.dependencies()],
1470 build_by_default: false)
1472 crypto = declare_dependency(link_whole: libcrypto,
1473 dependencies: [authz, qom])
1475 io_ss = io_ss.apply(config_host, strict: false)
1476 libio = static_library('io', io_ss.sources() + genh,
1477 dependencies: [io_ss.dependencies()],
1478 link_with: libqemuutil,
1480 build_by_default: false)
1482 io = declare_dependency(link_whole: libio, dependencies: [crypto, qom])
1484 libmigration = static_library('migration', sources: migration_files + genh,
1486 build_by_default: false)
1487 migration = declare_dependency(link_with: libmigration,
1488 dependencies: [zlib, qom, io])
1489 softmmu_ss.add(migration)
1491 block_ss = block_ss.apply(config_host, strict: false)
1492 libblock = static_library('block', block_ss.sources() + genh,
1493 dependencies: block_ss.dependencies(),
1494 link_depends: block_syms,
1496 build_by_default: false)
1498 block = declare_dependency(link_whole: [libblock],
1499 link_args: '@block.syms',
1500 dependencies: [crypto, io])
1502 qmp_ss = qmp_ss.apply(config_host, strict: false)
1503 libqmp = static_library('qmp', qmp_ss.sources() + genh,
1504 dependencies: qmp_ss.dependencies(),
1506 build_by_default: false)
1508 qmp = declare_dependency(link_whole: [libqmp])
1510 libchardev = static_library('chardev', chardev_ss.sources() + genh,
1512 build_by_default: false)
1514 chardev = declare_dependency(link_whole: libchardev)
1516 libhwcore = static_library('hwcore', sources: hwcore_files + genh,
1518 build_by_default: false)
1519 hwcore = declare_dependency(link_whole: libhwcore)
1520 common_ss.add(hwcore)
1526 foreach m : block_mods + softmmu_mods
1527 shared_module(m.name(),
1531 install_dir: config_host['qemu_moddir'])
1534 softmmu_ss.add(authz, block, chardev, crypto, io, qmp)
1535 common_ss.add(qom, qemuutil)
1537 common_ss.add_all(when: 'CONFIG_SOFTMMU', if_true: [softmmu_ss])
1538 common_ss.add_all(when: 'CONFIG_USER_ONLY', if_true: user_ss)
1540 common_all = common_ss.apply(config_all, strict: false)
1541 common_all = static_library('common',
1542 build_by_default: false,
1543 sources: common_all.sources() + genh,
1544 dependencies: common_all.dependencies(),
1547 feature_to_c = find_program('scripts/feature_to_c.sh')
1550 foreach target : target_dirs
1551 config_target = config_target_mak[target]
1552 target_name = config_target['TARGET_NAME']
1553 arch = config_target['TARGET_BASE_ARCH']
1554 arch_srcs = [config_target_h[target]]
1556 c_args = ['-DNEED_CPU_H',
1557 '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
1558 '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)]
1559 link_args = emulator_link_args
1561 config_target += config_host
1562 target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
1563 if targetos == 'linux'
1564 target_inc += include_directories('linux-headers', is_system: true)
1566 if target.endswith('-softmmu')
1567 qemu_target_name = 'qemu-system-' + target_name
1568 target_type='system'
1569 t = target_softmmu_arch[arch].apply(config_target, strict: false)
1570 arch_srcs += t.sources()
1571 arch_deps += t.dependencies()
1573 hw_dir = target_name == 'sparc64' ? 'sparc64' : arch
1574 hw = hw_arch[hw_dir].apply(config_target, strict: false)
1575 arch_srcs += hw.sources()
1576 arch_deps += hw.dependencies()
1578 arch_srcs += config_devices_h[target]
1579 link_args += ['@block.syms', '@qemu.syms']
1581 abi = config_target['TARGET_ABI_DIR']
1583 qemu_target_name = 'qemu-' + target_name
1584 if 'CONFIG_LINUX_USER' in config_target
1585 base_dir = 'linux-user'
1586 target_inc += include_directories('linux-user/host/' / config_host['ARCH'])
1588 base_dir = 'bsd-user'
1590 target_inc += include_directories(
1594 if 'CONFIG_LINUX_USER' in config_target
1595 dir = base_dir / abi
1596 arch_srcs += files(dir / 'signal.c', dir / 'cpu_loop.c')
1597 if config_target.has_key('TARGET_SYSTBL_ABI')
1599 syscall_nr_generators[abi].process(base_dir / abi / config_target['TARGET_SYSTBL'],
1600 extra_args : config_target['TARGET_SYSTBL_ABI'])
1605 if 'TARGET_XML_FILES' in config_target
1606 gdbstub_xml = custom_target(target + '-gdbstub-xml.c',
1607 output: target + '-gdbstub-xml.c',
1608 input: files(config_target['TARGET_XML_FILES'].split()),
1609 command: [feature_to_c, '@INPUT@'],
1611 arch_srcs += gdbstub_xml
1614 t = target_arch[arch].apply(config_target, strict: false)
1615 arch_srcs += t.sources()
1616 arch_deps += t.dependencies()
1618 target_common = common_ss.apply(config_target, strict: false)
1619 objects = common_all.extract_objects(target_common.sources())
1620 deps = target_common.dependencies()
1622 target_specific = specific_ss.apply(config_target, strict: false)
1623 arch_srcs += target_specific.sources()
1624 arch_deps += target_specific.dependencies()
1626 lib = static_library('qemu-' + target,
1627 sources: arch_srcs + genh,
1628 dependencies: arch_deps,
1630 include_directories: target_inc,
1632 build_by_default: false,
1635 if target.endswith('-softmmu')
1637 'name': 'qemu-system-' + target_name,
1639 'sources': files('softmmu/main.c'),
1642 if targetos == 'windows' and (sdl.found() or gtk.found())
1644 'name': 'qemu-system-' + target_name + 'w',
1646 'sources': files('softmmu/main.c'),
1650 if config_host.has_key('CONFIG_FUZZ')
1651 specific_fuzz = specific_fuzz_ss.apply(config_target, strict: false)
1653 'name': 'qemu-fuzz-' + target_name,
1655 'sources': specific_fuzz.sources(),
1656 'dependencies': specific_fuzz.dependencies(),
1661 'name': 'qemu-' + target_name,
1668 emulators += {exe['name']:
1669 executable(exe['name'], exe['sources'],
1672 dependencies: arch_deps + deps + exe['dependencies'],
1673 objects: lib.extract_all_objects(recursive: true),
1674 link_language: link_language,
1675 link_depends: [block_syms, qemu_syms] + exe.get('link_depends', []),
1676 link_args: link_args,
1677 gui_app: exe['gui'])
1680 if 'CONFIG_TRACE_SYSTEMTAP' in config_host
1682 {'ext': '.stp-build', 'fmt': 'stap', 'bin': meson.current_build_dir() / exe['name'], 'install': false},
1683 {'ext': '.stp', 'fmt': 'stap', 'bin': get_option('prefix') / get_option('bindir') / exe['name'], 'install': true},
1684 {'ext': '-simpletrace.stp', 'fmt': 'simpletrace-stap', 'bin': '', 'install': true},
1685 {'ext': '-log.stp', 'fmt': 'log-stap', 'bin': '', 'install': true},
1687 custom_target(exe['name'] + stp['ext'],
1688 input: trace_events_all,
1689 output: exe['name'] + stp['ext'],
1691 install: stp['install'],
1692 install_dir: qemu_datadir / '../systemtap/tapset',
1694 tracetool, '--group=all', '--format=' + stp['fmt'],
1695 '--binary=' + stp['bin'],
1696 '--target-name=' + target_name,
1697 '--target-type=' + target_type,
1698 '--probe-prefix=qemu.' + target_type + '.' + target_name,
1706 # Other build targets
1708 if 'CONFIG_PLUGIN' in config_host
1709 install_headers('include/qemu/qemu-plugin.h')
1712 if 'CONFIG_GUEST_AGENT' in config_host
1716 # Don't build qemu-keymap if xkbcommon is not explicitly enabled
1717 # when we don't build tools or system
1718 if xkbcommon.found()
1719 # used for the update-keymaps target, so include rules even if !have_tools
1720 qemu_keymap = executable('qemu-keymap', files('qemu-keymap.c', 'ui/input-keymap.c') + genh,
1721 dependencies: [qemuutil, xkbcommon], install: have_tools)
1725 qemu_img = executable('qemu-img', [files('qemu-img.c'), hxdep],
1726 dependencies: [authz, block, crypto, io, qom, qemuutil], install: true)
1727 qemu_io = executable('qemu-io', files('qemu-io.c'),
1728 dependencies: [block, qemuutil], install: true)
1729 qemu_nbd = executable('qemu-nbd', files('qemu-nbd.c'),
1730 dependencies: [block, qemuutil], install: true)
1732 subdir('storage-daemon')
1733 subdir('contrib/rdmacm-mux')
1734 subdir('contrib/elf2dmp')
1736 executable('qemu-edid', files('qemu-edid.c', 'hw/display/edid-generate.c'),
1737 dependencies: qemuutil,
1740 if 'CONFIG_VHOST_USER' in config_host
1741 subdir('contrib/libvhost-user')
1742 subdir('contrib/vhost-user-blk')
1743 subdir('contrib/vhost-user-gpu')
1744 subdir('contrib/vhost-user-input')
1745 subdir('contrib/vhost-user-scsi')
1748 if targetos == 'linux'
1749 executable('qemu-bridge-helper', files('qemu-bridge-helper.c'),
1750 dependencies: [qemuutil, libcap_ng],
1752 install_dir: get_option('libexecdir'))
1754 executable('qemu-pr-helper', files('scsi/qemu-pr-helper.c', 'scsi/utils.c'),
1755 dependencies: [authz, crypto, io, qom, qemuutil,
1756 libcap_ng, mpathpersist],
1760 if 'CONFIG_IVSHMEM' in config_host
1761 subdir('contrib/ivshmem-client')
1762 subdir('contrib/ivshmem-server')
1771 if 'CONFIG_GTK' in config_host
1775 if host_machine.system() == 'windows'
1777 find_program('scripts/nsis.py'),
1779 get_option('prefix'),
1780 meson.current_source_dir(),
1781 host_machine.cpu_family(),
1783 '-DDISPLAYVERSION=' + meson.project_version(),
1786 nsis_cmd += '-DCONFIG_DOCUMENTATION=y'
1788 if 'CONFIG_GTK' in config_host
1789 nsis_cmd += '-DCONFIG_GTK=y'
1792 nsis = custom_target('nsis',
1793 output: 'qemu-setup-' + meson.project_version() + '.exe',
1794 input: files('qemu.nsi'),
1795 build_always_stale: true,
1796 command: nsis_cmd + ['@INPUT@'])
1797 alias_target('installer', nsis)
1801 summary_info += {'Install prefix': config_host['prefix']}
1802 summary_info += {'BIOS directory': config_host['qemu_datadir']}
1803 summary_info += {'firmware path': config_host['qemu_firmwarepath']}
1804 summary_info += {'binary directory': config_host['bindir']}
1805 summary_info += {'library directory': config_host['libdir']}
1806 summary_info += {'module directory': config_host['qemu_moddir']}
1807 summary_info += {'libexec directory': config_host['libexecdir']}
1808 summary_info += {'include directory': config_host['includedir']}
1809 summary_info += {'config directory': config_host['sysconfdir']}
1810 if targetos != 'windows'
1811 summary_info += {'local state directory': config_host['qemu_localstatedir']}
1812 summary_info += {'Manual directory': get_option('mandir')}
1814 summary_info += {'local state directory': 'queried at runtime'}
1816 summary_info += {'Doc directory': get_option('docdir')}
1817 summary_info += {'Build directory': meson.current_build_dir()}
1818 summary_info += {'Source path': meson.current_source_dir()}
1819 summary_info += {'GIT binary': config_host['GIT']}
1820 summary_info += {'GIT submodules': config_host['GIT_SUBMODULES']}
1821 summary_info += {'C compiler': meson.get_compiler('c').cmd_array()[0]}
1822 summary_info += {'Host C compiler': meson.get_compiler('c', native: true).cmd_array()[0]}
1823 if link_language == 'cpp'
1824 summary_info += {'C++ compiler': meson.get_compiler('cpp').cmd_array()[0]}
1826 summary_info += {'C++ compiler': false}
1828 if targetos == 'darwin'
1829 summary_info += {'Objective-C compiler': meson.get_compiler('objc').cmd_array()[0]}
1831 summary_info += {'ARFLAGS': config_host['ARFLAGS']}
1832 summary_info += {'CFLAGS': ' '.join(get_option('c_args')
1833 + ['-O' + get_option('optimization')]
1834 + (get_option('debug') ? ['-g'] : []))}
1835 if link_language == 'cpp'
1836 summary_info += {'CXXFLAGS': ' '.join(get_option('cpp_args')
1837 + ['-O' + get_option('optimization')]
1838 + (get_option('debug') ? ['-g'] : []))}
1840 link_args = get_option(link_language + '_link_args')
1841 if link_args.length() > 0
1842 summary_info += {'LDFLAGS': ' '.join(link_args)}
1844 summary_info += {'QEMU_CFLAGS': config_host['QEMU_CFLAGS']}
1845 summary_info += {'QEMU_LDFLAGS': config_host['QEMU_LDFLAGS']}
1846 summary_info += {'make': config_host['MAKE']}
1847 summary_info += {'python': '@0@ (version: @1@)'.format(python.full_path(), python.language_version())}
1848 summary_info += {'sphinx-build': config_host['SPHINX_BUILD']}
1849 summary_info += {'genisoimage': config_host['GENISOIMAGE']}
1850 # TODO: add back version
1851 summary_info += {'slirp support': slirp_opt == 'disabled' ? false : slirp_opt}
1852 if slirp_opt != 'disabled'
1853 summary_info += {'smbd': config_host['CONFIG_SMBD_COMMAND']}
1855 summary_info += {'module support': config_host.has_key('CONFIG_MODULES')}
1856 if config_host.has_key('CONFIG_MODULES')
1857 summary_info += {'alternative module path': config_host.has_key('CONFIG_MODULE_UPGRADES')}
1859 summary_info += {'host CPU': cpu}
1860 summary_info += {'host endianness': build_machine.endian()}
1861 summary_info += {'target list': ' '.join(target_dirs)}
1862 summary_info += {'gprof enabled': config_host.has_key('CONFIG_GPROF')}
1863 summary_info += {'sparse enabled': sparse.found()}
1864 summary_info += {'strip binaries': get_option('strip')}
1865 summary_info += {'profiler': config_host.has_key('CONFIG_PROFILER')}
1866 summary_info += {'static build': config_host.has_key('CONFIG_STATIC')}
1867 if targetos == 'darwin'
1868 summary_info += {'Cocoa support': config_host.has_key('CONFIG_COCOA')}
1870 # TODO: add back version
1871 summary_info += {'SDL support': sdl.found()}
1872 summary_info += {'SDL image support': sdl_image.found()}
1873 # TODO: add back version
1874 summary_info += {'GTK support': config_host.has_key('CONFIG_GTK')}
1875 summary_info += {'GTK GL support': config_host.has_key('CONFIG_GTK_GL')}
1876 summary_info += {'pixman': pixman.found()}
1877 # TODO: add back version
1878 summary_info += {'VTE support': config_host.has_key('CONFIG_VTE')}
1879 summary_info += {'TLS priority': config_host['CONFIG_TLS_PRIORITY']}
1880 summary_info += {'GNUTLS support': config_host.has_key('CONFIG_GNUTLS')}
1881 # TODO: add back version
1882 summary_info += {'libgcrypt': config_host.has_key('CONFIG_GCRYPT')}
1883 if config_host.has_key('CONFIG_GCRYPT')
1884 summary_info += {' hmac': config_host.has_key('CONFIG_GCRYPT_HMAC')}
1885 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
1887 # TODO: add back version
1888 summary_info += {'nettle': config_host.has_key('CONFIG_NETTLE')}
1889 if config_host.has_key('CONFIG_NETTLE')
1890 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
1892 summary_info += {'libtasn1': config_host.has_key('CONFIG_TASN1')}
1893 summary_info += {'PAM': config_host.has_key('CONFIG_AUTH_PAM')}
1894 summary_info += {'iconv support': config_host.has_key('CONFIG_ICONV')}
1895 summary_info += {'curses support': config_host.has_key('CONFIG_CURSES')}
1896 # TODO: add back version
1897 summary_info += {'virgl support': config_host.has_key('CONFIG_VIRGL')}
1898 summary_info += {'curl support': config_host.has_key('CONFIG_CURL')}
1899 summary_info += {'mingw32 support': targetos == 'windows'}
1900 summary_info += {'Audio drivers': config_host['CONFIG_AUDIO_DRIVERS']}
1901 summary_info += {'Block whitelist (rw)': config_host['CONFIG_BDRV_RW_WHITELIST']}
1902 summary_info += {'Block whitelist (ro)': config_host['CONFIG_BDRV_RO_WHITELIST']}
1903 summary_info += {'VirtFS support': config_host.has_key('CONFIG_VIRTFS')}
1904 summary_info += {'Multipath support': mpathpersist.found()}
1905 summary_info += {'VNC support': vnc.found()}
1907 summary_info += {'VNC SASL support': sasl.found()}
1908 summary_info += {'VNC JPEG support': jpeg.found()}
1909 summary_info += {'VNC PNG support': png.found()}
1911 summary_info += {'xen support': config_host.has_key('CONFIG_XEN_BACKEND')}
1912 if config_host.has_key('CONFIG_XEN_BACKEND')
1913 summary_info += {'xen ctrl version': config_host['CONFIG_XEN_CTRL_INTERFACE_VERSION']}
1915 summary_info += {'brlapi support': config_host.has_key('CONFIG_BRLAPI')}
1916 summary_info += {'Documentation': config_host.has_key('BUILD_DOCS')}
1917 summary_info += {'PIE': get_option('b_pie')}
1918 summary_info += {'vde support': config_host.has_key('CONFIG_VDE')}
1919 summary_info += {'netmap support': config_host.has_key('CONFIG_NETMAP')}
1920 summary_info += {'Linux AIO support': config_host.has_key('CONFIG_LINUX_AIO')}
1921 summary_info += {'Linux io_uring support': config_host.has_key('CONFIG_LINUX_IO_URING')}
1922 summary_info += {'ATTR/XATTR support': config_host.has_key('CONFIG_ATTR')}
1923 summary_info += {'Install blobs': config_host.has_key('INSTALL_BLOBS')}
1924 summary_info += {'KVM support': config_all.has_key('CONFIG_KVM')}
1925 summary_info += {'HAX support': config_all.has_key('CONFIG_HAX')}
1926 summary_info += {'HVF support': config_all.has_key('CONFIG_HVF')}
1927 summary_info += {'WHPX support': config_all.has_key('CONFIG_WHPX')}
1928 summary_info += {'TCG support': config_all.has_key('CONFIG_TCG')}
1929 if config_all.has_key('CONFIG_TCG')
1930 summary_info += {'TCG debug enabled': config_host.has_key('CONFIG_DEBUG_TCG')}
1931 summary_info += {'TCG interpreter': config_host.has_key('CONFIG_TCG_INTERPRETER')}
1933 summary_info += {'malloc trim support': has_malloc_trim}
1934 summary_info += {'RDMA support': config_host.has_key('CONFIG_RDMA')}
1935 summary_info += {'PVRDMA support': config_host.has_key('CONFIG_PVRDMA')}
1936 summary_info += {'fdt support': fdt_opt == 'disabled' ? false : fdt_opt}
1937 summary_info += {'membarrier': config_host.has_key('CONFIG_MEMBARRIER')}
1938 summary_info += {'preadv support': config_host.has_key('CONFIG_PREADV')}
1939 summary_info += {'fdatasync': config_host.has_key('CONFIG_FDATASYNC')}
1940 summary_info += {'madvise': config_host.has_key('CONFIG_MADVISE')}
1941 summary_info += {'posix_madvise': config_host.has_key('CONFIG_POSIX_MADVISE')}
1942 summary_info += {'posix_memalign': config_host.has_key('CONFIG_POSIX_MEMALIGN')}
1943 summary_info += {'libcap-ng support': config_host.has_key('CONFIG_LIBCAP_NG')}
1944 summary_info += {'vhost-net support': config_host.has_key('CONFIG_VHOST_NET')}
1945 summary_info += {'vhost-crypto support': config_host.has_key('CONFIG_VHOST_CRYPTO')}
1946 summary_info += {'vhost-scsi support': config_host.has_key('CONFIG_VHOST_SCSI')}
1947 summary_info += {'vhost-vsock support': config_host.has_key('CONFIG_VHOST_VSOCK')}
1948 summary_info += {'vhost-user support': config_host.has_key('CONFIG_VHOST_KERNEL')}
1949 summary_info += {'vhost-user-fs support': config_host.has_key('CONFIG_VHOST_USER_FS')}
1950 summary_info += {'vhost-vdpa support': config_host.has_key('CONFIG_VHOST_VDPA')}
1951 summary_info += {'Trace backends': config_host['TRACE_BACKENDS']}
1952 if config_host['TRACE_BACKENDS'].split().contains('simple')
1953 summary_info += {'Trace output file': config_host['CONFIG_TRACE_FILE'] + '-<pid>'}
1955 # TODO: add back protocol and server version
1956 summary_info += {'spice support': config_host.has_key('CONFIG_SPICE')}
1957 summary_info += {'rbd support': config_host.has_key('CONFIG_RBD')}
1958 summary_info += {'xfsctl support': config_host.has_key('CONFIG_XFS')}
1959 summary_info += {'smartcard support': config_host.has_key('CONFIG_SMARTCARD')}
1960 summary_info += {'U2F support': u2f.found()}
1961 summary_info += {'libusb': config_host.has_key('CONFIG_USB_LIBUSB')}
1962 summary_info += {'usb net redir': config_host.has_key('CONFIG_USB_REDIR')}
1963 summary_info += {'OpenGL support': config_host.has_key('CONFIG_OPENGL')}
1964 summary_info += {'OpenGL dmabufs': config_host.has_key('CONFIG_OPENGL_DMABUF')}
1965 summary_info += {'libiscsi support': config_host.has_key('CONFIG_LIBISCSI')}
1966 summary_info += {'libnfs support': config_host.has_key('CONFIG_LIBNFS')}
1967 summary_info += {'build guest agent': config_host.has_key('CONFIG_GUEST_AGENT')}
1968 if targetos == 'windows'
1969 if 'WIN_SDK' in config_host
1970 summary_info += {'Windows SDK': config_host['WIN_SDK']}
1972 summary_info += {'QGA VSS support': config_host.has_key('CONFIG_QGA_VSS')}
1973 summary_info += {'QGA w32 disk info': config_host.has_key('CONFIG_QGA_NTDDSCSI')}
1974 summary_info += {'QGA MSI support': config_host.has_key('CONFIG_QGA_MSI')}
1976 summary_info += {'seccomp support': config_host.has_key('CONFIG_SECCOMP')}
1977 summary_info += {'coroutine backend': config_host['CONFIG_COROUTINE_BACKEND']}
1978 summary_info += {'coroutine pool': config_host['CONFIG_COROUTINE_POOL'] == '1'}
1979 summary_info += {'debug stack usage': config_host.has_key('CONFIG_DEBUG_STACK_USAGE')}
1980 summary_info += {'mutex debugging': config_host.has_key('CONFIG_DEBUG_MUTEX')}
1981 summary_info += {'crypto afalg': config_host.has_key('CONFIG_AF_ALG')}
1982 summary_info += {'GlusterFS support': config_host.has_key('CONFIG_GLUSTERFS')}
1983 summary_info += {'gcov': get_option('b_coverage')}
1984 summary_info += {'TPM support': config_host.has_key('CONFIG_TPM')}
1985 summary_info += {'libssh support': config_host.has_key('CONFIG_LIBSSH')}
1986 summary_info += {'QOM debugging': config_host.has_key('CONFIG_QOM_CAST_DEBUG')}
1987 summary_info += {'Live block migration': config_host.has_key('CONFIG_LIVE_BLOCK_MIGRATION')}
1988 summary_info += {'lzo support': config_host.has_key('CONFIG_LZO')}
1989 summary_info += {'snappy support': config_host.has_key('CONFIG_SNAPPY')}
1990 summary_info += {'bzip2 support': config_host.has_key('CONFIG_BZIP2')}
1991 summary_info += {'lzfse support': config_host.has_key('CONFIG_LZFSE')}
1992 summary_info += {'zstd support': config_host.has_key('CONFIG_ZSTD')}
1993 summary_info += {'NUMA host support': config_host.has_key('CONFIG_NUMA')}
1994 summary_info += {'libxml2': config_host.has_key('CONFIG_LIBXML2')}
1995 summary_info += {'memory allocator': get_option('malloc')}
1996 summary_info += {'avx2 optimization': config_host.has_key('CONFIG_AVX2_OPT')}
1997 summary_info += {'avx512f optimization': config_host.has_key('CONFIG_AVX512F_OPT')}
1998 summary_info += {'replication support': config_host.has_key('CONFIG_REPLICATION')}
1999 summary_info += {'bochs support': config_host.has_key('CONFIG_BOCHS')}
2000 summary_info += {'cloop support': config_host.has_key('CONFIG_CLOOP')}
2001 summary_info += {'dmg support': config_host.has_key('CONFIG_DMG')}
2002 summary_info += {'qcow v1 support': config_host.has_key('CONFIG_QCOW1')}
2003 summary_info += {'vdi support': config_host.has_key('CONFIG_VDI')}
2004 summary_info += {'vvfat support': config_host.has_key('CONFIG_VVFAT')}
2005 summary_info += {'qed support': config_host.has_key('CONFIG_QED')}
2006 summary_info += {'parallels support': config_host.has_key('CONFIG_PARALLELS')}
2007 summary_info += {'sheepdog support': config_host.has_key('CONFIG_SHEEPDOG')}
2008 summary_info += {'capstone': capstone_opt == 'disabled' ? false : capstone_opt}
2009 summary_info += {'libpmem support': config_host.has_key('CONFIG_LIBPMEM')}
2010 summary_info += {'libdaxctl support': config_host.has_key('CONFIG_LIBDAXCTL')}
2011 summary_info += {'libudev': libudev.found()}
2012 summary_info += {'default devices': config_host['CONFIG_MINIKCONF_MODE'] == '--defconfig'}
2013 summary_info += {'plugin support': config_host.has_key('CONFIG_PLUGIN')}
2014 summary_info += {'fuzzing support': config_host.has_key('CONFIG_FUZZ')}
2015 if config_host.has_key('HAVE_GDB_BIN')
2016 summary_info += {'gdb': config_host['HAVE_GDB_BIN']}
2018 summary_info += {'thread sanitizer': config_host.has_key('CONFIG_TSAN')}
2019 summary_info += {'rng-none': config_host.has_key('CONFIG_RNG_NONE')}
2020 summary_info += {'Linux keyring': config_host.has_key('CONFIG_SECRET_KEYRING')}
2021 summary(summary_info, bool_yn: true)
2023 if not supported_cpus.contains(cpu)
2025 warning('SUPPORT FOR THIS HOST CPU WILL GO AWAY IN FUTURE RELEASES!')
2027 message('CPU host architecture ' + cpu + ' support is not currently maintained.')
2028 message('The QEMU project intends to remove support for this host CPU in')
2029 message('a future release if nobody volunteers to maintain it and to')
2030 message('provide a build host for our continuous integration setup.')
2031 message('configure has succeeded and you can continue to build, but')
2032 message('if you care about QEMU on this platform you should contact')
2033 message('us upstream at qemu-devel@nongnu.org.')
2036 if not supported_oses.contains(targetos)
2038 warning('WARNING: SUPPORT FOR THIS HOST OS WILL GO AWAY IN FUTURE RELEASES!')
2040 message('Host OS ' + targetos + 'support is not currently maintained.')
2041 message('The QEMU project intends to remove support for this host OS in')
2042 message('a future release if nobody volunteers to maintain it and to')
2043 message('provide a build host for our continuous integration setup.')
2044 message('configure has succeeded and you can continue to build, but')
2045 message('if you care about QEMU on this platform you should contact')
2046 message('us upstream at qemu-devel@nongnu.org.')