meson: convert chardev directory to Meson (tools part)
[qemu.git] / meson.build
blobb78829c116a45c289878b2b2ac68a8700b99fbce
1 project('qemu', ['c'], meson_version: '>=0.55.0',
2         default_options: ['warning_level=1', 'c_std=gnu99', 'cpp_std=gnu++11', 'b_lundef=false'],
3         version: run_command('head', meson.source_root() / 'VERSION').stdout().strip())
5 not_found = dependency('', required: false)
6 keyval = import('unstable-keyval')
7 ss = import('sourceset')
9 sh = find_program('sh')
10 cc = meson.get_compiler('c')
11 config_host = keyval.load(meson.current_build_dir() / 'config-host.mak')
12 config_all_disas = keyval.load(meson.current_build_dir() / 'config-all-disas.mak')
13 enable_modules = 'CONFIG_MODULES' in config_host
15 add_project_arguments(config_host['QEMU_CFLAGS'].split(),
16                       native: false, language: ['c', 'objc'])
17 add_project_arguments(config_host['QEMU_CXXFLAGS'].split(),
18                       native: false, language: 'cpp')
19 add_project_link_arguments(config_host['QEMU_LDFLAGS'].split(),
20                            native: false, language: ['c', 'cpp', 'objc'])
21 add_project_arguments(config_host['QEMU_INCLUDES'].split(),
22                       language: ['c', 'cpp', 'objc'])
24 python = import('python').find_installation()
26 link_language = meson.get_external_property('link_language', 'cpp')
27 if link_language == 'cpp'
28   add_languages('cpp', required: true, native: false)
29 endif
30 if host_machine.system() == 'darwin'
31   add_languages('objc', required: false, native: false)
32 endif
34 if 'SPARSE_CFLAGS' in config_host
35   run_target('sparse',
36              command: [find_program('scripts/check_sparse.py'),
37                        config_host['SPARSE_CFLAGS'].split(),
38                        'compile_commands.json'])
39 endif
41 configure_file(input: files('scripts/ninjatool.py'),
42                output: 'ninjatool',
43                configuration: config_host)
45 supported_oses = ['windows', 'freebsd', 'netbsd', 'openbsd', 'darwin', 'sunos', 'linux']
46 supported_cpus = ['ppc', 'ppc64', 's390x', 'sparc64', 'riscv32', 'riscv64', 'x86', 'x86_64',
47   'arm', 'aarch64', 'mips', 'mips64', 'sparc', 'sparc64']
49 cpu = host_machine.cpu_family()
50 targetos = host_machine.system()
52 m = cc.find_library('m', required: false)
53 util = cc.find_library('util', required: false)
54 socket = []
55 version_res = []
56 coref = []
57 iokit = []
58 cocoa = []
59 hvf = []
60 if targetos == 'windows'
61   socket = cc.find_library('ws2_32')
63   win = import('windows')
64   version_res = win.compile_resources('version.rc',
65                                       depend_files: files('pc-bios/qemu-nsis.ico'),
66                                       include_directories: include_directories('.'))
67 elif targetos == 'darwin'
68   coref = dependency('appleframeworks', modules: 'CoreFoundation')
69   iokit = dependency('appleframeworks', modules: 'IOKit')
70   cocoa = dependency('appleframeworks', modules: 'Cocoa')
71   hvf = dependency('appleframeworks', modules: 'Hypervisor')
72 elif targetos == 'sunos'
73   socket = [cc.find_library('socket'),
74             cc.find_library('nsl'),
75             cc.find_library('resolv')]
76 elif targetos == 'haiku'
77   socket = [cc.find_library('posix_error_mapper'),
78             cc.find_library('network'),
79             cc.find_library('bsd')]
80 endif
81 glib = declare_dependency(compile_args: config_host['GLIB_CFLAGS'].split(),
82                           link_args: config_host['GLIB_LIBS'].split())
83 gio = not_found
84 if 'CONFIG_GIO' in config_host
85   gio = declare_dependency(compile_args: config_host['GIO_CFLAGS'].split(),
86                            link_args: config_host['GIO_LIBS'].split())
87 endif
88 lttng = not_found
89 if 'CONFIG_TRACE_UST' in config_host
90   lttng = declare_dependency(link_args: config_host['LTTNG_UST_LIBS'].split())
91 endif
92 urcubp = not_found
93 if 'CONFIG_TRACE_UST' in config_host
94   urcubp = declare_dependency(link_args: config_host['URCU_BP_LIBS'].split())
95 endif
96 nettle = not_found
97 if 'CONFIG_NETTLE' in config_host
98   nettle = declare_dependency(compile_args: config_host['NETTLE_CFLAGS'].split(),
99                               link_args: config_host['NETTLE_LIBS'].split())
100 endif
101 gnutls = not_found
102 if 'CONFIG_GNUTLS' in config_host
103   gnutls = declare_dependency(compile_args: config_host['GNUTLS_CFLAGS'].split(),
104                               link_args: config_host['GNUTLS_LIBS'].split())
105 endif
106 pixman = declare_dependency(compile_args: config_host['PIXMAN_CFLAGS'].split(),
107                             link_args: config_host['PIXMAN_LIBS'].split())
108 pam = not_found
109 if 'CONFIG_AUTH_PAM' in config_host
110   pam = cc.find_library('pam')
111 endif
112 libattr = not_found
113 if 'CONFIG_ATTR' in config_host
114   libattr = declare_dependency(link_args: config_host['LIBATTR_LIBS'].split())
115 endif
116 seccomp = not_found
117 if 'CONFIG_SECCOMP' in config_host
118   seccomp = declare_dependency(compile_args: config_host['SECCOMP_CFLAGS'].split(),
119                                link_args: config_host['SECCOMP_LIBS'].split())
120 endif
121 libcap_ng = not_found
122 if 'CONFIG_LIBCAP_NG' in config_host
123   libcap_ng = declare_dependency(link_args: config_host['LIBCAP_NG_LIBS'].split())
124 endif
125 xkbcommon = not_found
126 if 'CONFIG_XKBCOMMON' in config_host
127   xkbcommon = declare_dependency(compile_args: config_host['XKBCOMMON_CFLAGS'].split(),
128                                  link_args: config_host['XKBCOMMON_LIBS'].split())
129 endif
130 rt = cc.find_library('rt', required: false)
131 libiscsi = not_found
132 if 'CONFIG_LIBISCSI' in config_host
133   libiscsi = declare_dependency(compile_args: config_host['LIBISCSI_CFLAGS'].split(),
134                                 link_args: config_host['LIBISCSI_LIBS'].split())
135 endif
136 gbm = not_found
137 if 'CONFIG_GBM' in config_host
138   gbm = declare_dependency(compile_args: config_host['GBM_CFLAGS'].split(),
139                            link_args: config_host['GBM_LIBS'].split())
140 endif
141 virgl = not_found
142 if 'CONFIG_VIRGL' in config_host
143   virgl = declare_dependency(compile_args: config_host['VIRGL_CFLAGS'].split(),
144                              link_args: config_host['VIRGL_LIBS'].split())
145 endif
146 curl = not_found
147 if 'CONFIG_CURL' in config_host
148   curl = declare_dependency(compile_args: config_host['CURL_CFLAGS'].split(),
149                             link_args: config_host['CURL_LIBS'].split())
150 endif
151 libudev = not_found
152 if 'CONFIG_LIBUDEV' in config_host
153   libudev = declare_dependency(link_args: config_host['LIBUDEV_LIBS'].split())
154 endif
156 create_config = find_program('scripts/create_config')
157 minikconf = find_program('scripts/minikconf.py')
158 target_dirs = config_host['TARGET_DIRS'].split()
159 have_user = false
160 have_system = false
161 config_devices_mak_list = []
162 config_devices_h = {}
163 config_target_mak = {}
164 kconfig_external_symbols = [
165   'CONFIG_KVM',
166   'CONFIG_XEN',
167   'CONFIG_TPM',
168   'CONFIG_SPICE',
169   'CONFIG_IVSHMEM',
170   'CONFIG_OPENGL',
171   'CONFIG_X11',
172   'CONFIG_VHOST_USER',
173   'CONFIG_VHOST_KERNEL',
174   'CONFIG_VIRTFS',
175   'CONFIG_LINUX',
176   'CONFIG_PVRDMA',
178 foreach target : target_dirs
179   have_user = have_user or target.endswith('-user')
180   config_target = keyval.load(meson.current_build_dir() / target / 'config-target.mak') + config_host
182   if target.endswith('-softmmu')
183     have_system = true
185     base_kconfig = []
186     foreach sym : kconfig_external_symbols
187       if sym in config_target
188         base_kconfig += '@0@=y'.format(sym)
189       endif
190     endforeach
192     config_devices_mak = target + '-config-devices.mak'
193     config_devices_mak = configure_file(
194       input: ['default-configs' / target + '.mak', 'Kconfig'],
195       output: config_devices_mak,
196       depfile: config_devices_mak + '.d',
197       capture: true,
198       command: [minikconf, config_host['CONFIG_MINIKCONF_MODE'],
199                 config_devices_mak, '@DEPFILE@', '@INPUT@',
200                 base_kconfig])
201     config_devices_h += {target: custom_target(
202       target + '-config-devices.h',
203       input: config_devices_mak,
204       output: target + '-config-devices.h',
205       capture: true,
206       command: [create_config, '@INPUT@'])}
207     config_devices_mak_list += config_devices_mak
208     config_target += keyval.load(config_devices_mak)
209   endif
210   config_target_mak += {target: config_target}
211 endforeach
212 have_tools = 'CONFIG_TOOLS' in config_host
213 have_block = have_system or have_tools
215 grepy = find_program('scripts/grepy.sh')
216 # This configuration is used to build files that are shared by
217 # multiple binaries, and then extracted out of the "common"
218 # static_library target.
220 # We do not use all_sources()/all_dependencies(), because it would
221 # build literally all source files, including devices only used by
222 # targets that are not built for this compilation.  The CONFIG_ALL
223 # pseudo symbol replaces it.
225 if have_system
226   config_all_devices_mak = configure_file(
227     output: 'config-all-devices.mak',
228     input: config_devices_mak_list,
229     capture: true,
230     command: [grepy, '@INPUT@'],
231   )
232   config_all_devices = keyval.load(config_all_devices_mak)
233 else
234   config_all_devices = {}
235 endif
236 config_all = config_all_devices
237 config_all += config_host
238 config_all += config_all_disas
239 config_all += {
240   'CONFIG_XEN': config_host.has_key('CONFIG_XEN_BACKEND'),
241   'CONFIG_SOFTMMU': have_system,
242   'CONFIG_USER_ONLY': have_user,
243   'CONFIG_ALL': true,
246 # Generators
248 genh = []
249 hxtool = find_program('scripts/hxtool')
250 shaderinclude = find_program('scripts/shaderinclude.pl')
251 qapi_gen = find_program('scripts/qapi-gen.py')
252 qapi_gen_depends = [ meson.source_root() / 'scripts/qapi/__init__.py',
253                      meson.source_root() / 'scripts/qapi/commands.py',
254                      meson.source_root() / 'scripts/qapi/common.py',
255                      meson.source_root() / 'scripts/qapi/doc.py',
256                      meson.source_root() / 'scripts/qapi/error.py',
257                      meson.source_root() / 'scripts/qapi/events.py',
258                      meson.source_root() / 'scripts/qapi/expr.py',
259                      meson.source_root() / 'scripts/qapi/gen.py',
260                      meson.source_root() / 'scripts/qapi/introspect.py',
261                      meson.source_root() / 'scripts/qapi/parser.py',
262                      meson.source_root() / 'scripts/qapi/schema.py',
263                      meson.source_root() / 'scripts/qapi/source.py',
264                      meson.source_root() / 'scripts/qapi/types.py',
265                      meson.source_root() / 'scripts/qapi/visit.py',
266                      meson.source_root() / 'scripts/qapi/common.py',
267                      meson.source_root() / 'scripts/qapi/doc.py',
268                      meson.source_root() / 'scripts/qapi-gen.py'
271 tracetool = [
272   python, files('scripts/tracetool.py'),
273    '--backend=' + config_host['TRACE_BACKENDS']
276 qemu_version_cmd = [find_program('scripts/qemu-version.sh'),
277                     meson.current_source_dir(),
278                     config_host['PKGVERSION'], config_host['VERSION']]
279 qemu_version = custom_target('qemu-version.h',
280                              output: 'qemu-version.h',
281                              command: qemu_version_cmd,
282                              capture: true,
283                              build_by_default: true,
284                              build_always_stale: true)
285 genh += qemu_version
287 config_host_h = custom_target('config-host.h',
288                               input: meson.current_build_dir() / 'config-host.mak',
289                               output: 'config-host.h',
290                               capture: true,
291                               command: [create_config, '@INPUT@'])
292 genh += config_host_h
294 hxdep = []
295 hx_headers = [
296   ['qemu-options.hx', 'qemu-options.def'],
297   ['qemu-img-cmds.hx', 'qemu-img-cmds.h'],
299 if have_system
300   hx_headers += [
301     ['hmp-commands.hx', 'hmp-commands.h'],
302     ['hmp-commands-info.hx', 'hmp-commands-info.h'],
303   ]
304 endif
305 foreach d : hx_headers
306   custom_target(d[1],
307                 input: files(d[0]),
308                 output: d[1],
309                 capture: true,
310                 build_by_default: true, # to be removed when added to a target
311                 command: [hxtool, '-h', '@INPUT0@'])
312 endforeach
313 genh += hxdep
315 # Collect sourcesets.
317 util_ss = ss.source_set()
318 stub_ss = ss.source_set()
319 trace_ss = ss.source_set()
320 block_ss = ss.source_set()
321 common_ss = ss.source_set()
322 softmmu_ss = ss.source_set()
323 user_ss = ss.source_set()
324 bsd_user_ss = ss.source_set()
325 linux_user_ss = ss.source_set()
326 specific_ss = ss.source_set()
328 modules = {}
329 hw_arch = {}
330 target_arch = {}
331 target_softmmu_arch = {}
333 ###############
334 # Trace files #
335 ###############
337 trace_events_subdirs = [
338   'accel/kvm',
339   'accel/tcg',
340   'crypto',
341   'monitor',
343 if have_user
344   trace_events_subdirs += [ 'linux-user' ]
345 endif
346 if have_block
347   trace_events_subdirs += [
348     'authz',
349     'block',
350     'io',
351     'nbd',
352     'scsi',
353   ]
354 endif
355 if have_system
356   trace_events_subdirs += [
357     'audio',
358     'backends',
359     'backends/tpm',
360     'chardev',
361     'hw/9pfs',
362     'hw/acpi',
363     'hw/alpha',
364     'hw/arm',
365     'hw/audio',
366     'hw/block',
367     'hw/block/dataplane',
368     'hw/char',
369     'hw/display',
370     'hw/dma',
371     'hw/hppa',
372     'hw/hyperv',
373     'hw/i2c',
374     'hw/i386',
375     'hw/i386/xen',
376     'hw/ide',
377     'hw/input',
378     'hw/intc',
379     'hw/isa',
380     'hw/mem',
381     'hw/mips',
382     'hw/misc',
383     'hw/misc/macio',
384     'hw/net',
385     'hw/nvram',
386     'hw/pci',
387     'hw/pci-host',
388     'hw/ppc',
389     'hw/rdma',
390     'hw/rdma/vmw',
391     'hw/rtc',
392     'hw/s390x',
393     'hw/scsi',
394     'hw/sd',
395     'hw/sparc',
396     'hw/sparc64',
397     'hw/ssi',
398     'hw/timer',
399     'hw/tpm',
400     'hw/usb',
401     'hw/vfio',
402     'hw/virtio',
403     'hw/watchdog',
404     'hw/xen',
405     'hw/gpio',
406     'hw/riscv',
407     'migration',
408     'net',
409     'ui',
410   ]
411 endif
412 trace_events_subdirs += [
413   'hw/core',
414   'qapi',
415   'qom',
416   'target/arm',
417   'target/hppa',
418   'target/i386',
419   'target/mips',
420   'target/ppc',
421   'target/riscv',
422   'target/s390x',
423   'target/sparc',
424   'util',
427 subdir('qapi')
428 subdir('qobject')
429 subdir('stubs')
430 subdir('trace')
431 subdir('util')
432 subdir('qom')
433 subdir('authz')
434 subdir('crypto')
435 subdir('storage-daemon')
436 subdir('ui')
439 if enable_modules
440   libmodulecommon = static_library('module-common', files('module-common.c') + genh, pic: true, c_args: '-DBUILD_DSO')
441   modulecommon = declare_dependency(link_whole: libmodulecommon, compile_args: '-DBUILD_DSO')
442 endif
444 # Build targets from sourcesets
446 stub_ss = stub_ss.apply(config_all, strict: false)
448 util_ss.add_all(trace_ss)
449 util_ss = util_ss.apply(config_all, strict: false)
450 libqemuutil = static_library('qemuutil',
451                              sources: util_ss.sources() + stub_ss.sources() + genh,
452                              dependencies: [util_ss.dependencies(), m, glib, socket])
453 qemuutil = declare_dependency(link_with: libqemuutil,
454                               sources: genh + version_res)
456 subdir('io')
457 subdir('chardev')
458 subdir('fsdev')
459 subdir('target')
461 block_mods = []
462 softmmu_mods = []
463 foreach d, list : modules
464   foreach m, module_ss : list
465     if enable_modules and targetos != 'windows'
466       module_ss = module_ss.apply(config_host, strict: false)
467       sl = static_library(d + '-' + m, [genh, module_ss.sources()],
468                           dependencies: [modulecommon, module_ss.dependencies()], pic: true)
469       if d == 'block'
470         block_mods += sl
471       else
472         softmmu_mods += sl
473       endif
474     else
475       if d == 'block'
476         block_ss.add_all(module_ss)
477       else
478         softmmu_ss.add_all(module_ss)
479       endif
480     endif
481   endforeach
482 endforeach
484 nm = find_program('nm')
485 undefsym = find_program('scripts/undefsym.sh')
486 block_syms = custom_target('block.syms', output: 'block.syms',
487                              input: [libqemuutil, block_mods],
488                              capture: true,
489                              command: [undefsym, nm, '@INPUT@'])
490 qemu_syms = custom_target('qemu.syms', output: 'qemu.syms',
491                              input: [libqemuutil, softmmu_mods],
492                              capture: true,
493                              command: [undefsym, nm, '@INPUT@'])
495 foreach m : block_mods + softmmu_mods
496   shared_module(m.name(),
497                 name_prefix: '',
498                 link_whole: m,
499                 install: true,
500                 install_dir: config_host['qemu_moddir'])
501 endforeach
503 common_ss.add_all(when: 'CONFIG_SOFTMMU', if_true: softmmu_ss)
504 common_ss.add_all(when: 'CONFIG_USER_ONLY', if_true: user_ss)
506 common_all = common_ss.apply(config_all, strict: false)
507 common_all = static_library('common',
508                             build_by_default: false,
509                             sources: common_all.sources() + genh,
510                             dependencies: common_all.dependencies(),
511                             name_suffix: 'fa')
513 foreach target : target_dirs
514   config_target = config_target_mak[target]
515   target_name = config_target['TARGET_NAME']
516   arch = config_target['TARGET_BASE_ARCH']
517   arch_srcs = []
519   target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
520   if targetos == 'linux'
521     target_inc += include_directories('linux-headers', is_system: true)
522   endif
523   if target.endswith('-softmmu')
524     qemu_target_name = 'qemu-system-' + target_name
525     target_type='system'
526     arch_srcs += config_devices_h[target]
527   else
528     target_type='user'
529     qemu_target_name = 'qemu-' + target_name
530     if 'CONFIG_LINUX_USER' in config_target
531       base_dir = 'linux-user'
532       target_inc += include_directories('linux-user/host/' / config_host['ARCH'])
533     else
534       base_dir = 'bsd-user'
535     endif
536     target_inc += include_directories(
537       base_dir,
538       base_dir / config_target['TARGET_ABI_DIR'],
539     )
540   endif
542   target_common = common_ss.apply(config_target, strict: false)
543   objects = common_all.extract_objects(target_common.sources())
545   # TODO: Change to generator once obj-y goes away
546   config_target_h = custom_target(target + '-config-target.h',
547                               input: meson.current_build_dir() / target / 'config-target.mak',
548                               output: target + '-config-target.h',
549                               capture: true,
550                               command: [create_config, '@INPUT@'])
552   target_specific = specific_ss.apply(config_target, strict: false)
553   arch_srcs += target_specific.sources()
555   static_library('qemu-' + target,
556                  sources: arch_srcs + [config_target_h] + genh,
557                  objects: objects,
558                  include_directories: target_inc,
559                  c_args: ['-DNEED_CPU_H',
560                           '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
561                           '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)],
562                  name_suffix: 'fa')
563 endforeach
565 # Other build targets
566 if 'CONFIG_GUEST_AGENT' in config_host
567   subdir('qga')
568 endif
570 if have_tools
571   subdir('contrib/rdmacm-mux')
572   subdir('contrib/elf2dmp')
574   if 'CONFIG_XKBCOMMON' in config_host
575     executable('qemu-keymap', files('qemu-keymap.c', 'ui/input-keymap.c'),
576                dependencies: [qemuutil, xkbcommon], install: true)
577   endif
579   executable('qemu-edid', files('qemu-edid.c', 'hw/display/edid-generate.c'),
580              dependencies: qemuutil,
581              install: true)
583   if 'CONFIG_VHOST_USER' in config_host
584     subdir('contrib/libvhost-user')
585     subdir('contrib/vhost-user-blk')
586     if 'CONFIG_LINUX' in config_host
587       subdir('contrib/vhost-user-gpu')
588     endif
589     subdir('contrib/vhost-user-input')
590     subdir('contrib/vhost-user-scsi')
591   endif
593   if targetos == 'linux'
594     executable('qemu-bridge-helper', files('qemu-bridge-helper.c'),
595                dependencies: [qemuutil, libcap_ng],
596                install: true,
597                install_dir: get_option('libexecdir'))
598   endif
600   if 'CONFIG_IVSHMEM' in config_host
601     subdir('contrib/ivshmem-client')
602     subdir('contrib/ivshmem-server')
603   endif
604 endif
606 subdir('tools')
607 subdir('pc-bios')
608 subdir('tests')
610 summary_info = {}
611 summary_info += {'Install prefix':    config_host['prefix']}
612 summary_info += {'BIOS directory':    config_host['qemu_datadir']}
613 summary_info += {'firmware path':     config_host['qemu_firmwarepath']}
614 summary_info += {'binary directory':  config_host['bindir']}
615 summary_info += {'library directory': config_host['libdir']}
616 summary_info += {'module directory':  config_host['qemu_moddir']}
617 summary_info += {'libexec directory': config_host['libexecdir']}
618 summary_info += {'include directory': config_host['includedir']}
619 summary_info += {'config directory':  config_host['sysconfdir']}
620 if targetos != 'windows'
621   summary_info += {'local state directory': config_host['qemu_localstatedir']}
622   summary_info += {'Manual directory':      config_host['mandir']}
623 else
624   summary_info += {'local state directory': 'queried at runtime'}
625 endif
626 summary_info += {'Build directory':   meson.current_build_dir()}
627 summary_info += {'Source path':       meson.current_source_dir()}
628 summary_info += {'GIT binary':        config_host['GIT']}
629 summary_info += {'GIT submodules':    config_host['GIT_SUBMODULES']}
630 summary_info += {'C compiler':        meson.get_compiler('c').cmd_array()[0]}
631 summary_info += {'Host C compiler':   meson.get_compiler('c', native: true).cmd_array()[0]}
632 if link_language == 'cpp'
633   summary_info += {'C++ compiler':      meson.get_compiler('cpp').cmd_array()[0]}
634 else
635   summary_info += {'C++ compiler':      false}
636 endif
637 if targetos == 'darwin'
638   summary_info += {'Objective-C compiler': meson.get_compiler('objc').cmd_array()[0]}
639 endif
640 summary_info += {'ARFLAGS':           config_host['ARFLAGS']}
641 summary_info += {'CFLAGS':            config_host['CFLAGS']}
642 summary_info += {'QEMU_CFLAGS':       config_host['QEMU_CFLAGS']}
643 summary_info += {'QEMU_LDFLAGS':      config_host['QEMU_LDFLAGS']}
644 summary_info += {'make':              config_host['MAKE']}
645 summary_info += {'install':           config_host['INSTALL']}
646 summary_info += {'python':            '@0@ (version: @1@)'.format(python.full_path(), python.language_version())}
647 summary_info += {'sphinx-build':      config_host['SPHINX_BUILD']}
648 summary_info += {'genisoimage':       config_host['GENISOIMAGE']}
649 # TODO: add back version
650 summary_info += {'slirp support':     config_host.has_key('CONFIG_SLIRP')}
651 if config_host.has_key('CONFIG_SLIRP')
652   summary_info += {'smbd':            config_host['CONFIG_SMBD_COMMAND']}
653 endif
654 summary_info += {'module support':    config_host.has_key('CONFIG_MODULES')}
655 if config_host.has_key('CONFIG_MODULES')
656   summary_info += {'alternative module path': config_host.has_key('CONFIG_MODULE_UPGRADES')}
657 endif
658 summary_info += {'host CPU':          cpu}
659 summary_info += {'host endianness':   build_machine.endian()}
660 summary_info += {'target list':       config_host['TARGET_DIRS']}
661 summary_info += {'gprof enabled':     config_host.has_key('CONFIG_GPROF')}
662 summary_info += {'sparse enabled':    meson.get_compiler('c').cmd_array().contains('cgcc')}
663 summary_info += {'strip binaries':    get_option('strip')}
664 summary_info += {'profiler':          config_host.has_key('CONFIG_PROFILER')}
665 summary_info += {'static build':      config_host.has_key('CONFIG_TOOLS')}
666 if targetos == 'darwin'
667   summary_info += {'Cocoa support': config_host.has_key('CONFIG_COCOA')}
668 endif
669 # TODO: add back version
670 summary_info += {'SDL support':       config_host.has_key('CONFIG_SDL')}
671 summary_info += {'SDL image support': config_host.has_key('CONFIG_SDL_IMAGE')}
672 # TODO: add back version
673 summary_info += {'GTK support':       config_host.has_key('CONFIG_GTK')}
674 summary_info += {'GTK GL support':    config_host.has_key('CONFIG_GTK_GL')}
675 # TODO: add back version
676 summary_info += {'VTE support':       config_host.has_key('CONFIG_VTE')}
677 summary_info += {'TLS priority':      config_host['CONFIG_TLS_PRIORITY']}
678 summary_info += {'GNUTLS support':    config_host.has_key('CONFIG_GNUTLS')}
679 # TODO: add back version
680 summary_info += {'libgcrypt':         config_host.has_key('CONFIG_GCRYPT')}
681 if config_host.has_key('CONFIG_GCRYPT')
682    summary_info += {'  hmac':            config_host.has_key('CONFIG_GCRYPT_HMAC')}
683    summary_info += {'  XTS':             not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
684 endif
685 # TODO: add back version
686 summary_info += {'nettle':            config_host.has_key('CONFIG_NETTLE')}
687 if config_host.has_key('CONFIG_NETTLE')
688    summary_info += {'  XTS':             not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
689 endif
690 summary_info += {'libtasn1':          config_host.has_key('CONFIG_TASN1')}
691 summary_info += {'PAM':               config_host.has_key('CONFIG_AUTH_PAM')}
692 summary_info += {'iconv support':     config_host.has_key('CONFIG_ICONV')}
693 summary_info += {'curses support':    config_host.has_key('CONFIG_CURSES')}
694 # TODO: add back version
695 summary_info += {'virgl support':     config_host.has_key('CONFIG_VIRGL')}
696 summary_info += {'curl support':      config_host.has_key('CONFIG_CURL')}
697 summary_info += {'mingw32 support':   targetos == 'windows'}
698 summary_info += {'Audio drivers':     config_host['CONFIG_AUDIO_DRIVERS']}
699 summary_info += {'Block whitelist (rw)': config_host['CONFIG_BDRV_RW_WHITELIST']}
700 summary_info += {'Block whitelist (ro)': config_host['CONFIG_BDRV_RO_WHITELIST']}
701 summary_info += {'VirtFS support':    config_host.has_key('CONFIG_VIRTFS')}
702 summary_info += {'Multipath support': config_host.has_key('CONFIG_MPATH')}
703 summary_info += {'VNC support':       config_host.has_key('CONFIG_VNC')}
704 if config_host.has_key('CONFIG_VNC')
705   summary_info += {'VNC SASL support':  config_host.has_key('CONFIG_VNC_SASL')}
706   summary_info += {'VNC JPEG support':  config_host.has_key('CONFIG_VNC_JPEG')}
707   summary_info += {'VNC PNG support':   config_host.has_key('CONFIG_VNC_PNG')}
708 endif
709 summary_info += {'xen support':       config_host.has_key('CONFIG_XEN_BACKEND')}
710 if config_host.has_key('CONFIG_XEN_BACKEND')
711   summary_info += {'xen ctrl version':  config_host['CONFIG_XEN_CTRL_INTERFACE_VERSION']}
712 endif
713 summary_info += {'brlapi support':    config_host.has_key('CONFIG_BRLAPI')}
714 summary_info += {'Documentation':     config_host.has_key('BUILD_DOCS')}
715 summary_info += {'PIE':               get_option('b_pie')}
716 summary_info += {'vde support':       config_host.has_key('CONFIG_VDE')}
717 summary_info += {'netmap support':    config_host.has_key('CONFIG_NETMAP')}
718 summary_info += {'Linux AIO support': config_host.has_key('CONFIG_LINUX_AIO')}
719 summary_info += {'Linux io_uring support': config_host.has_key('CONFIG_LINUX_IO_URING')}
720 summary_info += {'ATTR/XATTR support': config_host.has_key('CONFIG_ATTR')}
721 summary_info += {'Install blobs':     config_host.has_key('INSTALL_BLOBS')}
722 # TODO: add back KVM/HAX/HVF/WHPX/TCG
723 #summary_info += {'KVM support':       have_kvm'}
724 #summary_info += {'HAX support':       have_hax'}
725 #summary_info += {'HVF support':       have_hvf'}
726 #summary_info += {'WHPX support':      have_whpx'}
727 #summary_info += {'TCG support':       have_tcg'}
728 #if get_option('tcg')
729 #  summary_info += {'TCG debug enabled': config_host.has_key('CONFIG_DEBUG_TCG')}
730 #  summary_info += {'TCG interpreter':   config_host.has_key('CONFIG_TCG_INTERPRETER')}
731 #endif
732 summary_info += {'malloc trim support': config_host.has_key('CONFIG_MALLOC_TRIM')}
733 summary_info += {'RDMA support':      config_host.has_key('CONFIG_RDMA')}
734 summary_info += {'PVRDMA support':    config_host.has_key('CONFIG_PVRDMA')}
735 summary_info += {'fdt support':       config_host.has_key('CONFIG_FDT')}
736 summary_info += {'membarrier':        config_host.has_key('CONFIG_MEMBARRIER')}
737 summary_info += {'preadv support':    config_host.has_key('CONFIG_PREADV')}
738 summary_info += {'fdatasync':         config_host.has_key('CONFIG_FDATASYNC')}
739 summary_info += {'madvise':           config_host.has_key('CONFIG_MADVISE')}
740 summary_info += {'posix_madvise':     config_host.has_key('CONFIG_POSIX_MADVISE')}
741 summary_info += {'posix_memalign':    config_host.has_key('CONFIG_POSIX_MEMALIGN')}
742 summary_info += {'libcap-ng support': config_host.has_key('CONFIG_LIBCAP_NG')}
743 summary_info += {'vhost-net support': config_host.has_key('CONFIG_VHOST_NET')}
744 summary_info += {'vhost-crypto support': config_host.has_key('CONFIG_VHOST_CRYPTO')}
745 summary_info += {'vhost-scsi support': config_host.has_key('CONFIG_VHOST_SCSI')}
746 summary_info += {'vhost-vsock support': config_host.has_key('CONFIG_VHOST_VSOCK')}
747 summary_info += {'vhost-user support': config_host.has_key('CONFIG_VHOST_KERNEL')}
748 summary_info += {'vhost-user-fs support': config_host.has_key('CONFIG_VHOST_USER_FS')}
749 summary_info += {'vhost-vdpa support': config_host.has_key('CONFIG_VHOST_VDPA')}
750 summary_info += {'Trace backends':    config_host['TRACE_BACKENDS']}
751 if config_host['TRACE_BACKENDS'].split().contains('simple')
752   summary_info += {'Trace output file': config_host['CONFIG_TRACE_FILE'] + '-<pid>'}
753 endif
754 # TODO: add back protocol and server version
755 summary_info += {'spice support':     config_host.has_key('CONFIG_SPICE')}
756 summary_info += {'rbd support':       config_host.has_key('CONFIG_RBD')}
757 summary_info += {'xfsctl support':    config_host.has_key('CONFIG_XFS')}
758 summary_info += {'smartcard support': config_host.has_key('CONFIG_SMARTCARD')}
759 summary_info += {'libusb':            config_host.has_key('CONFIG_USB_LIBUSB')}
760 summary_info += {'usb net redir':     config_host.has_key('CONFIG_USB_REDIR')}
761 summary_info += {'OpenGL support':    config_host.has_key('CONFIG_OPENGL')}
762 summary_info += {'OpenGL dmabufs':    config_host.has_key('CONFIG_OPENGL_DMABUF')}
763 summary_info += {'libiscsi support':  config_host.has_key('CONFIG_LIBISCSI')}
764 summary_info += {'libnfs support':    config_host.has_key('CONFIG_LIBNFS')}
765 summary_info += {'build guest agent': config_host.has_key('CONFIG_GUEST_AGENT')}
766 if targetos == 'windows'
767   if 'WIN_SDK' in config_host
768     summary_info += {'Windows SDK':       config_host['WIN_SDK']}
769   endif
770   summary_info += {'QGA VSS support':   config_host.has_key('CONFIG_QGA_VSS')}
771   summary_info += {'QGA w32 disk info': config_host.has_key('CONFIG_QGA_NTDDSCSI')}
772   summary_info += {'QGA MSI support':   config_host.has_key('CONFIG_QGA_MSI_ENABLED')}
773 endif
774 summary_info += {'seccomp support':   config_host.has_key('CONFIG_SECCOMP')}
775 summary_info += {'coroutine backend': config_host['CONFIG_COROUTINE_BACKEND']}
776 summary_info += {'coroutine pool':    config_host['CONFIG_COROUTINE_POOL'] == '1'}
777 summary_info += {'debug stack usage': config_host.has_key('CONFIG_DEBUG_STACK_USAGE')}
778 summary_info += {'mutex debugging':   config_host.has_key('CONFIG_DEBUG_MUTEX')}
779 summary_info += {'crypto afalg':      config_host.has_key('CONFIG_AF_ALG')}
780 summary_info += {'GlusterFS support': config_host.has_key('CONFIG_GLUSTERFS')}
781 summary_info += {'gcov':              get_option('b_coverage')}
782 summary_info += {'TPM support':       config_host.has_key('CONFIG_TPM')}
783 summary_info += {'libssh support':    config_host.has_key('CONFIG_LIBSSH')}
784 summary_info += {'QOM debugging':     config_host.has_key('CONFIG_QOM_CAST_DEBUG')}
785 summary_info += {'Live block migration': config_host.has_key('CONFIG_LIVE_BLOCK_MIGRATION')}
786 summary_info += {'lzo support':       config_host.has_key('CONFIG_LZO')}
787 summary_info += {'snappy support':    config_host.has_key('CONFIG_SNAPPY')}
788 summary_info += {'bzip2 support':     config_host.has_key('CONFIG_BZIP2')}
789 summary_info += {'lzfse support':     config_host.has_key('CONFIG_LZFSE')}
790 summary_info += {'zstd support':      config_host.has_key('CONFIG_ZSTD')}
791 summary_info += {'NUMA host support': config_host.has_key('CONFIG_NUMA')}
792 summary_info += {'libxml2':           config_host.has_key('CONFIG_LIBXML2')}
793 summary_info += {'tcmalloc support':  config_host.has_key('CONFIG_TCMALLOC')}
794 summary_info += {'jemalloc support':  config_host.has_key('CONFIG_JEMALLOC')}
795 summary_info += {'avx2 optimization': config_host.has_key('CONFIG_AVX2_OPT')}
796 summary_info += {'avx512f optimization': config_host.has_key('CONFIG_AVX512F_OPT')}
797 summary_info += {'replication support': config_host.has_key('CONFIG_REPLICATION')}
798 summary_info += {'bochs support':     config_host.has_key('CONFIG_BOCHS')}
799 summary_info += {'cloop support':     config_host.has_key('CONFIG_CLOOP')}
800 summary_info += {'dmg support':       config_host.has_key('CONFIG_DMG')}
801 summary_info += {'qcow v1 support':   config_host.has_key('CONFIG_QCOW1')}
802 summary_info += {'vdi support':       config_host.has_key('CONFIG_VDI')}
803 summary_info += {'vvfat support':     config_host.has_key('CONFIG_VVFAT')}
804 summary_info += {'qed support':       config_host.has_key('CONFIG_QED')}
805 summary_info += {'parallels support': config_host.has_key('CONFIG_PARALLELS')}
806 summary_info += {'sheepdog support':  config_host.has_key('CONFIG_SHEEPDOG')}
807 summary_info += {'capstone':          config_host.has_key('CONFIG_CAPSTONE')}
808 summary_info += {'libpmem support':   config_host.has_key('CONFIG_LIBPMEM')}
809 summary_info += {'libdaxctl support': config_host.has_key('CONFIG_LIBDAXCTL')}
810 summary_info += {'libudev':           config_host.has_key('CONFIG_LIBUDEV')}
811 summary_info += {'default devices':   config_host['CONFIG_MINIKCONF_MODE'] == '--defconfig'}
812 summary_info += {'plugin support':    config_host.has_key('CONFIG_PLUGIN')}
813 summary_info += {'fuzzing support':   config_host.has_key('CONFIG_FUZZ')}
814 if config_host.has_key('HAVE_GDB_BIN')
815   summary_info += {'gdb':             config_host['HAVE_GDB_BIN']}
816 endif
817 summary_info += {'thread sanitizer':  config_host.has_key('CONFIG_TSAN')}
818 summary_info += {'rng-none':          config_host.has_key('CONFIG_RNG_NONE')}
819 summary_info += {'Linux keyring':     config_host.has_key('CONFIG_SECRET_KEYRING')}
820 summary(summary_info, bool_yn: true)
822 if not supported_cpus.contains(cpu)
823   message()
824   warning('SUPPORT FOR THIS HOST CPU WILL GO AWAY IN FUTURE RELEASES!')
825   message()
826   message('CPU host architecture ' + cpu + ' support is not currently maintained.')
827   message('The QEMU project intends to remove support for this host CPU in')
828   message('a future release if nobody volunteers to maintain it and to')
829   message('provide a build host for our continuous integration setup.')
830   message('configure has succeeded and you can continue to build, but')
831   message('if you care about QEMU on this platform you should contact')
832   message('us upstream at qemu-devel@nongnu.org.')
833 endif
835 if not supported_oses.contains(targetos)
836   message()
837   warning('WARNING: SUPPORT FOR THIS HOST OS WILL GO AWAY IN FUTURE RELEASES!')
838   message()
839   message('Host OS ' + targetos + 'support is not currently maintained.')
840   message('The QEMU project intends to remove support for this host OS in')
841   message('a future release if nobody volunteers to maintain it and to')
842   message('provide a build host for our continuous integration setup.')
843   message('configure has succeeded and you can continue to build, but')
844   message('if you care about QEMU on this platform you should contact')
845   message('us upstream at qemu-devel@nongnu.org.')
846 endif