xref: /openbmc/qemu/meson.build (revision de59dda3)
1project('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())
4
5not_found = dependency('', required: false)
6keyval = import('unstable-keyval')
7ss = import('sourceset')
8
9sh = find_program('sh')
10cc = meson.get_compiler('c')
11config_host = keyval.load(meson.current_build_dir() / 'config-host.mak')
12
13add_project_arguments(config_host['QEMU_CFLAGS'].split(),
14                      native: false, language: ['c', 'objc'])
15add_project_arguments(config_host['QEMU_CXXFLAGS'].split(),
16                      native: false, language: 'cpp')
17add_project_link_arguments(config_host['QEMU_LDFLAGS'].split(),
18                           native: false, language: ['c', 'cpp', 'objc'])
19add_project_arguments(config_host['QEMU_INCLUDES'].split(),
20                      language: ['c', 'cpp', 'objc'])
21
22python = import('python').find_installation()
23
24link_language = meson.get_external_property('link_language', 'cpp')
25if link_language == 'cpp'
26  add_languages('cpp', required: true, native: false)
27endif
28if host_machine.system() == 'darwin'
29  add_languages('objc', required: false, native: false)
30endif
31
32if 'SPARSE_CFLAGS' in config_host
33  run_target('sparse',
34             command: [find_program('scripts/check_sparse.py'),
35                       config_host['SPARSE_CFLAGS'].split(),
36                       'compile_commands.json'])
37endif
38
39configure_file(input: files('scripts/ninjatool.py'),
40               output: 'ninjatool',
41               configuration: config_host)
42
43supported_oses = ['windows', 'freebsd', 'netbsd', 'openbsd', 'darwin', 'sunos', 'linux']
44supported_cpus = ['ppc', 'ppc64', 's390x', 'sparc64', 'riscv32', 'riscv64', 'x86', 'x86_64',
45  'arm', 'aarch64', 'mips', 'mips64', 'sparc', 'sparc64']
46
47cpu = host_machine.cpu_family()
48targetos = host_machine.system()
49
50m = cc.find_library('m', required: false)
51util = cc.find_library('util', required: false)
52socket = []
53version_res = []
54coref = []
55iokit = []
56cocoa = []
57hvf = []
58if targetos == 'windows'
59  socket = cc.find_library('ws2_32')
60
61  win = import('windows')
62  version_res = win.compile_resources('version.rc',
63                                      depend_files: files('pc-bios/qemu-nsis.ico'),
64                                      include_directories: include_directories('.'))
65elif targetos == 'darwin'
66  coref = dependency('appleframeworks', modules: 'CoreFoundation')
67  iokit = dependency('appleframeworks', modules: 'IOKit')
68  cocoa = dependency('appleframeworks', modules: 'Cocoa')
69  hvf = dependency('appleframeworks', modules: 'Hypervisor')
70elif targetos == 'sunos'
71  socket = [cc.find_library('socket'),
72            cc.find_library('nsl'),
73            cc.find_library('resolv')]
74elif targetos == 'haiku'
75  socket = [cc.find_library('posix_error_mapper'),
76            cc.find_library('network'),
77            cc.find_library('bsd')]
78endif
79glib = declare_dependency(compile_args: config_host['GLIB_CFLAGS'].split(),
80                          link_args: config_host['GLIB_LIBS'].split())
81gio = not_found
82if 'CONFIG_GIO' in config_host
83  gio = declare_dependency(compile_args: config_host['GIO_CFLAGS'].split(),
84                           link_args: config_host['GIO_LIBS'].split())
85endif
86lttng = not_found
87if 'CONFIG_TRACE_UST' in config_host
88  lttng = declare_dependency(link_args: config_host['LTTNG_UST_LIBS'].split())
89endif
90urcubp = not_found
91if 'CONFIG_TRACE_UST' in config_host
92  urcubp = declare_dependency(link_args: config_host['URCU_BP_LIBS'].split())
93endif
94nettle = not_found
95if 'CONFIG_NETTLE' in config_host
96  nettle = declare_dependency(compile_args: config_host['NETTLE_CFLAGS'].split(),
97                              link_args: config_host['NETTLE_LIBS'].split())
98endif
99gnutls = not_found
100if 'CONFIG_GNUTLS' in config_host
101  gnutls = declare_dependency(compile_args: config_host['GNUTLS_CFLAGS'].split(),
102                              link_args: config_host['GNUTLS_LIBS'].split())
103endif
104pixman = declare_dependency(compile_args: config_host['PIXMAN_CFLAGS'].split(),
105                            link_args: config_host['PIXMAN_LIBS'].split())
106libattr = not_found
107if 'CONFIG_ATTR' in config_host
108  libattr = declare_dependency(link_args: config_host['LIBATTR_LIBS'].split())
109endif
110seccomp = not_found
111if 'CONFIG_SECCOMP' in config_host
112  seccomp = declare_dependency(compile_args: config_host['SECCOMP_CFLAGS'].split(),
113                               link_args: config_host['SECCOMP_LIBS'].split())
114endif
115libcap_ng = not_found
116if 'CONFIG_LIBCAP_NG' in config_host
117  libcap_ng = declare_dependency(link_args: config_host['LIBCAP_NG_LIBS'].split())
118endif
119xkbcommon = not_found
120if 'CONFIG_XKBCOMMON' in config_host
121  xkbcommon = declare_dependency(compile_args: config_host['XKBCOMMON_CFLAGS'].split(),
122                                 link_args: config_host['XKBCOMMON_LIBS'].split())
123endif
124rt = cc.find_library('rt', required: false)
125libiscsi = not_found
126if 'CONFIG_LIBISCSI' in config_host
127  libiscsi = declare_dependency(compile_args: config_host['LIBISCSI_CFLAGS'].split(),
128                                link_args: config_host['LIBISCSI_LIBS'].split())
129endif
130gbm = not_found
131if 'CONFIG_GBM' in config_host
132  gbm = declare_dependency(compile_args: config_host['GBM_CFLAGS'].split(),
133                           link_args: config_host['GBM_LIBS'].split())
134endif
135virgl = not_found
136if 'CONFIG_VIRGL' in config_host
137  virgl = declare_dependency(compile_args: config_host['VIRGL_CFLAGS'].split(),
138                             link_args: config_host['VIRGL_LIBS'].split())
139endif
140curl = not_found
141if 'CONFIG_CURL' in config_host
142  curl = declare_dependency(compile_args: config_host['CURL_CFLAGS'].split(),
143                            link_args: config_host['CURL_LIBS'].split())
144endif
145libudev = not_found
146if 'CONFIG_LIBUDEV' in config_host
147  libudev = declare_dependency(link_args: config_host['LIBUDEV_LIBS'].split())
148endif
149
150target_dirs = config_host['TARGET_DIRS'].split()
151have_user = false
152have_system = false
153foreach target : target_dirs
154  have_user = have_user or target.endswith('-user')
155  have_system = have_system or target.endswith('-softmmu')
156endforeach
157have_tools = 'CONFIG_TOOLS' in config_host
158have_block = have_system or have_tools
159
160# Generators
161
162genh = []
163hxtool = find_program('scripts/hxtool')
164shaderinclude = find_program('scripts/shaderinclude.pl')
165qapi_gen = find_program('scripts/qapi-gen.py')
166qapi_gen_depends = [ meson.source_root() / 'scripts/qapi/__init__.py',
167                     meson.source_root() / 'scripts/qapi/commands.py',
168                     meson.source_root() / 'scripts/qapi/common.py',
169                     meson.source_root() / 'scripts/qapi/doc.py',
170                     meson.source_root() / 'scripts/qapi/error.py',
171                     meson.source_root() / 'scripts/qapi/events.py',
172                     meson.source_root() / 'scripts/qapi/expr.py',
173                     meson.source_root() / 'scripts/qapi/gen.py',
174                     meson.source_root() / 'scripts/qapi/introspect.py',
175                     meson.source_root() / 'scripts/qapi/parser.py',
176                     meson.source_root() / 'scripts/qapi/schema.py',
177                     meson.source_root() / 'scripts/qapi/source.py',
178                     meson.source_root() / 'scripts/qapi/types.py',
179                     meson.source_root() / 'scripts/qapi/visit.py',
180                     meson.source_root() / 'scripts/qapi/common.py',
181                     meson.source_root() / 'scripts/qapi/doc.py',
182                     meson.source_root() / 'scripts/qapi-gen.py'
183]
184
185tracetool = [
186  python, files('scripts/tracetool.py'),
187   '--backend=' + config_host['TRACE_BACKENDS']
188]
189
190qemu_version_cmd = [find_program('scripts/qemu-version.sh'),
191                    meson.current_source_dir(),
192                    config_host['PKGVERSION'], config_host['VERSION']]
193qemu_version = custom_target('qemu-version.h',
194                             output: 'qemu-version.h',
195                             command: qemu_version_cmd,
196                             capture: true,
197                             build_by_default: true,
198                             build_always_stale: true)
199genh += qemu_version
200
201hxdep = []
202hx_headers = [
203  ['qemu-options.hx', 'qemu-options.def'],
204  ['qemu-img-cmds.hx', 'qemu-img-cmds.h'],
205]
206if have_system
207  hx_headers += [
208    ['hmp-commands.hx', 'hmp-commands.h'],
209    ['hmp-commands-info.hx', 'hmp-commands-info.h'],
210  ]
211endif
212foreach d : hx_headers
213  custom_target(d[1],
214                input: files(d[0]),
215                output: d[1],
216                capture: true,
217                build_by_default: true, # to be removed when added to a target
218                command: [hxtool, '-h', '@INPUT0@'])
219endforeach
220genh += hxdep
221
222# Collect sourcesets.
223
224util_ss = ss.source_set()
225stub_ss = ss.source_set()
226trace_ss = ss.source_set()
227
228###############
229# Trace files #
230###############
231
232trace_events_subdirs = [
233  'accel/kvm',
234  'accel/tcg',
235  'crypto',
236  'monitor',
237]
238if have_user
239  trace_events_subdirs += [ 'linux-user' ]
240endif
241if have_block
242  trace_events_subdirs += [
243    'authz',
244    'block',
245    'io',
246    'nbd',
247    'scsi',
248  ]
249endif
250if have_system
251  trace_events_subdirs += [
252    'audio',
253    'backends',
254    'backends/tpm',
255    'chardev',
256    'hw/9pfs',
257    'hw/acpi',
258    'hw/alpha',
259    'hw/arm',
260    'hw/audio',
261    'hw/block',
262    'hw/block/dataplane',
263    'hw/char',
264    'hw/display',
265    'hw/dma',
266    'hw/hppa',
267    'hw/hyperv',
268    'hw/i2c',
269    'hw/i386',
270    'hw/i386/xen',
271    'hw/ide',
272    'hw/input',
273    'hw/intc',
274    'hw/isa',
275    'hw/mem',
276    'hw/mips',
277    'hw/misc',
278    'hw/misc/macio',
279    'hw/net',
280    'hw/nvram',
281    'hw/pci',
282    'hw/pci-host',
283    'hw/ppc',
284    'hw/rdma',
285    'hw/rdma/vmw',
286    'hw/rtc',
287    'hw/s390x',
288    'hw/scsi',
289    'hw/sd',
290    'hw/sparc',
291    'hw/sparc64',
292    'hw/ssi',
293    'hw/timer',
294    'hw/tpm',
295    'hw/usb',
296    'hw/vfio',
297    'hw/virtio',
298    'hw/watchdog',
299    'hw/xen',
300    'hw/gpio',
301    'hw/riscv',
302    'migration',
303    'net',
304    'ui',
305  ]
306endif
307trace_events_subdirs += [
308  'hw/core',
309  'qapi',
310  'qom',
311  'target/arm',
312  'target/hppa',
313  'target/i386',
314  'target/mips',
315  'target/ppc',
316  'target/riscv',
317  'target/s390x',
318  'target/sparc',
319  'util',
320]
321
322subdir('qapi')
323subdir('qobject')
324subdir('stubs')
325subdir('trace')
326subdir('util')
327subdir('crypto')
328subdir('storage-daemon')
329subdir('ui')
330
331# Build targets from sourcesets
332
333stub_ss = stub_ss.apply(config_host, strict: false)
334
335util_ss.add_all(trace_ss)
336util_ss = util_ss.apply(config_host, strict: false)
337libqemuutil = static_library('qemuutil',
338                             sources: util_ss.sources() + stub_ss.sources() + genh,
339                             dependencies: [util_ss.dependencies(), m, glib, socket])
340qemuutil = declare_dependency(link_with: libqemuutil,
341                              sources: genh + version_res)
342
343subdir('qom')
344subdir('fsdev')
345
346# Other build targets
347if 'CONFIG_GUEST_AGENT' in config_host
348  subdir('qga')
349endif
350
351if have_tools
352  subdir('contrib/rdmacm-mux')
353  subdir('contrib/elf2dmp')
354
355  if 'CONFIG_XKBCOMMON' in config_host
356    executable('qemu-keymap', files('qemu-keymap.c', 'ui/input-keymap.c'),
357               dependencies: [qemuutil, xkbcommon], install: true)
358  endif
359
360  executable('qemu-edid', files('qemu-edid.c', 'hw/display/edid-generate.c'),
361             dependencies: qemuutil,
362             install: true)
363
364  if 'CONFIG_VHOST_USER' in config_host
365    subdir('contrib/libvhost-user')
366    subdir('contrib/vhost-user-blk')
367    if 'CONFIG_LINUX' in config_host
368      subdir('contrib/vhost-user-gpu')
369    endif
370    subdir('contrib/vhost-user-input')
371    subdir('contrib/vhost-user-scsi')
372  endif
373
374  if targetos == 'linux'
375    executable('qemu-bridge-helper', files('qemu-bridge-helper.c'),
376               dependencies: [qemuutil, libcap_ng],
377               install: true,
378               install_dir: get_option('libexecdir'))
379  endif
380
381  if 'CONFIG_IVSHMEM' in config_host
382    subdir('contrib/ivshmem-client')
383    subdir('contrib/ivshmem-server')
384  endif
385endif
386
387subdir('tools')
388subdir('pc-bios')
389subdir('tests')
390
391summary_info = {}
392summary_info += {'Install prefix':    config_host['prefix']}
393summary_info += {'BIOS directory':    config_host['qemu_datadir']}
394summary_info += {'firmware path':     config_host['qemu_firmwarepath']}
395summary_info += {'binary directory':  config_host['bindir']}
396summary_info += {'library directory': config_host['libdir']}
397summary_info += {'module directory':  config_host['qemu_moddir']}
398summary_info += {'libexec directory': config_host['libexecdir']}
399summary_info += {'include directory': config_host['includedir']}
400summary_info += {'config directory':  config_host['sysconfdir']}
401if targetos != 'windows'
402  summary_info += {'local state directory': config_host['qemu_localstatedir']}
403  summary_info += {'Manual directory':      config_host['mandir']}
404else
405  summary_info += {'local state directory': 'queried at runtime'}
406endif
407summary_info += {'Build directory':   meson.current_build_dir()}
408summary_info += {'Source path':       meson.current_source_dir()}
409summary_info += {'GIT binary':        config_host['GIT']}
410summary_info += {'GIT submodules':    config_host['GIT_SUBMODULES']}
411summary_info += {'C compiler':        meson.get_compiler('c').cmd_array()[0]}
412summary_info += {'Host C compiler':   meson.get_compiler('c', native: true).cmd_array()[0]}
413if link_language == 'cpp'
414  summary_info += {'C++ compiler':      meson.get_compiler('cpp').cmd_array()[0]}
415else
416  summary_info += {'C++ compiler':      false}
417endif
418if targetos == 'darwin'
419  summary_info += {'Objective-C compiler': meson.get_compiler('objc').cmd_array()[0]}
420endif
421summary_info += {'ARFLAGS':           config_host['ARFLAGS']}
422summary_info += {'CFLAGS':            config_host['CFLAGS']}
423summary_info += {'QEMU_CFLAGS':       config_host['QEMU_CFLAGS']}
424summary_info += {'QEMU_LDFLAGS':      config_host['QEMU_LDFLAGS']}
425summary_info += {'make':              config_host['MAKE']}
426summary_info += {'install':           config_host['INSTALL']}
427summary_info += {'python':            '@0@ (version: @1@)'.format(python.full_path(), python.language_version())}
428summary_info += {'sphinx-build':      config_host['SPHINX_BUILD']}
429summary_info += {'genisoimage':       config_host['GENISOIMAGE']}
430# TODO: add back version
431summary_info += {'slirp support':     config_host.has_key('CONFIG_SLIRP')}
432if config_host.has_key('CONFIG_SLIRP')
433  summary_info += {'smbd':            config_host['CONFIG_SMBD_COMMAND']}
434endif
435summary_info += {'module support':    config_host.has_key('CONFIG_MODULES')}
436if config_host.has_key('CONFIG_MODULES')
437  summary_info += {'alternative module path': config_host.has_key('CONFIG_MODULE_UPGRADES')}
438endif
439summary_info += {'host CPU':          cpu}
440summary_info += {'host endianness':   build_machine.endian()}
441summary_info += {'target list':       config_host['TARGET_DIRS']}
442summary_info += {'gprof enabled':     config_host.has_key('CONFIG_GPROF')}
443summary_info += {'sparse enabled':    meson.get_compiler('c').cmd_array().contains('cgcc')}
444summary_info += {'strip binaries':    get_option('strip')}
445summary_info += {'profiler':          config_host.has_key('CONFIG_PROFILER')}
446summary_info += {'static build':      config_host.has_key('CONFIG_TOOLS')}
447if targetos == 'darwin'
448  summary_info += {'Cocoa support': config_host.has_key('CONFIG_COCOA')}
449endif
450# TODO: add back version
451summary_info += {'SDL support':       config_host.has_key('CONFIG_SDL')}
452summary_info += {'SDL image support': config_host.has_key('CONFIG_SDL_IMAGE')}
453# TODO: add back version
454summary_info += {'GTK support':       config_host.has_key('CONFIG_GTK')}
455summary_info += {'GTK GL support':    config_host.has_key('CONFIG_GTK_GL')}
456# TODO: add back version
457summary_info += {'VTE support':       config_host.has_key('CONFIG_VTE')}
458summary_info += {'TLS priority':      config_host['CONFIG_TLS_PRIORITY']}
459summary_info += {'GNUTLS support':    config_host.has_key('CONFIG_GNUTLS')}
460# TODO: add back version
461summary_info += {'libgcrypt':         config_host.has_key('CONFIG_GCRYPT')}
462if config_host.has_key('CONFIG_GCRYPT')
463   summary_info += {'  hmac':            config_host.has_key('CONFIG_GCRYPT_HMAC')}
464   summary_info += {'  XTS':             not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
465endif
466# TODO: add back version
467summary_info += {'nettle':            config_host.has_key('CONFIG_NETTLE')}
468if config_host.has_key('CONFIG_NETTLE')
469   summary_info += {'  XTS':             not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
470endif
471summary_info += {'libtasn1':          config_host.has_key('CONFIG_TASN1')}
472summary_info += {'PAM':               config_host.has_key('CONFIG_AUTH_PAM')}
473summary_info += {'iconv support':     config_host.has_key('CONFIG_ICONV')}
474summary_info += {'curses support':    config_host.has_key('CONFIG_CURSES')}
475# TODO: add back version
476summary_info += {'virgl support':     config_host.has_key('CONFIG_VIRGL')}
477summary_info += {'curl support':      config_host.has_key('CONFIG_CURL')}
478summary_info += {'mingw32 support':   targetos == 'windows'}
479summary_info += {'Audio drivers':     config_host['CONFIG_AUDIO_DRIVERS']}
480summary_info += {'Block whitelist (rw)': config_host['CONFIG_BDRV_RW_WHITELIST']}
481summary_info += {'Block whitelist (ro)': config_host['CONFIG_BDRV_RO_WHITELIST']}
482summary_info += {'VirtFS support':    config_host.has_key('CONFIG_VIRTFS')}
483summary_info += {'Multipath support': config_host.has_key('CONFIG_MPATH')}
484summary_info += {'VNC support':       config_host.has_key('CONFIG_VNC')}
485if config_host.has_key('CONFIG_VNC')
486  summary_info += {'VNC SASL support':  config_host.has_key('CONFIG_VNC_SASL')}
487  summary_info += {'VNC JPEG support':  config_host.has_key('CONFIG_VNC_JPEG')}
488  summary_info += {'VNC PNG support':   config_host.has_key('CONFIG_VNC_PNG')}
489endif
490summary_info += {'xen support':       config_host.has_key('CONFIG_XEN_BACKEND')}
491if config_host.has_key('CONFIG_XEN_BACKEND')
492  summary_info += {'xen ctrl version':  config_host['CONFIG_XEN_CTRL_INTERFACE_VERSION']}
493endif
494summary_info += {'brlapi support':    config_host.has_key('CONFIG_BRLAPI')}
495summary_info += {'Documentation':     config_host.has_key('BUILD_DOCS')}
496summary_info += {'PIE':               get_option('b_pie')}
497summary_info += {'vde support':       config_host.has_key('CONFIG_VDE')}
498summary_info += {'netmap support':    config_host.has_key('CONFIG_NETMAP')}
499summary_info += {'Linux AIO support': config_host.has_key('CONFIG_LINUX_AIO')}
500summary_info += {'Linux io_uring support': config_host.has_key('CONFIG_LINUX_IO_URING')}
501summary_info += {'ATTR/XATTR support': config_host.has_key('CONFIG_ATTR')}
502summary_info += {'Install blobs':     config_host.has_key('INSTALL_BLOBS')}
503# TODO: add back KVM/HAX/HVF/WHPX/TCG
504#summary_info += {'KVM support':       have_kvm'}
505#summary_info += {'HAX support':       have_hax'}
506#summary_info += {'HVF support':       have_hvf'}
507#summary_info += {'WHPX support':      have_whpx'}
508#summary_info += {'TCG support':       have_tcg'}
509#if get_option('tcg')
510#  summary_info += {'TCG debug enabled': config_host.has_key('CONFIG_DEBUG_TCG')}
511#  summary_info += {'TCG interpreter':   config_host.has_key('CONFIG_TCG_INTERPRETER')}
512#endif
513summary_info += {'malloc trim support': config_host.has_key('CONFIG_MALLOC_TRIM')}
514summary_info += {'RDMA support':      config_host.has_key('CONFIG_RDMA')}
515summary_info += {'PVRDMA support':    config_host.has_key('CONFIG_PVRDMA')}
516summary_info += {'fdt support':       config_host.has_key('CONFIG_FDT')}
517summary_info += {'membarrier':        config_host.has_key('CONFIG_MEMBARRIER')}
518summary_info += {'preadv support':    config_host.has_key('CONFIG_PREADV')}
519summary_info += {'fdatasync':         config_host.has_key('CONFIG_FDATASYNC')}
520summary_info += {'madvise':           config_host.has_key('CONFIG_MADVISE')}
521summary_info += {'posix_madvise':     config_host.has_key('CONFIG_POSIX_MADVISE')}
522summary_info += {'posix_memalign':    config_host.has_key('CONFIG_POSIX_MEMALIGN')}
523summary_info += {'libcap-ng support': config_host.has_key('CONFIG_LIBCAP_NG')}
524summary_info += {'vhost-net support': config_host.has_key('CONFIG_VHOST_NET')}
525summary_info += {'vhost-crypto support': config_host.has_key('CONFIG_VHOST_CRYPTO')}
526summary_info += {'vhost-scsi support': config_host.has_key('CONFIG_VHOST_SCSI')}
527summary_info += {'vhost-vsock support': config_host.has_key('CONFIG_VHOST_VSOCK')}
528summary_info += {'vhost-user support': config_host.has_key('CONFIG_VHOST_KERNEL')}
529summary_info += {'vhost-user-fs support': config_host.has_key('CONFIG_VHOST_USER_FS')}
530summary_info += {'vhost-vdpa support': config_host.has_key('CONFIG_VHOST_VDPA')}
531summary_info += {'Trace backends':    config_host['TRACE_BACKENDS']}
532if config_host['TRACE_BACKENDS'].split().contains('simple')
533  summary_info += {'Trace output file': config_host['CONFIG_TRACE_FILE'] + '-<pid>'}
534endif
535# TODO: add back protocol and server version
536summary_info += {'spice support':     config_host.has_key('CONFIG_SPICE')}
537summary_info += {'rbd support':       config_host.has_key('CONFIG_RBD')}
538summary_info += {'xfsctl support':    config_host.has_key('CONFIG_XFS')}
539summary_info += {'smartcard support': config_host.has_key('CONFIG_SMARTCARD')}
540summary_info += {'libusb':            config_host.has_key('CONFIG_USB_LIBUSB')}
541summary_info += {'usb net redir':     config_host.has_key('CONFIG_USB_REDIR')}
542summary_info += {'OpenGL support':    config_host.has_key('CONFIG_OPENGL')}
543summary_info += {'OpenGL dmabufs':    config_host.has_key('CONFIG_OPENGL_DMABUF')}
544summary_info += {'libiscsi support':  config_host.has_key('CONFIG_LIBISCSI')}
545summary_info += {'libnfs support':    config_host.has_key('CONFIG_LIBNFS')}
546summary_info += {'build guest agent': config_host.has_key('CONFIG_GUEST_AGENT')}
547if targetos == 'windows'
548  if 'WIN_SDK' in config_host
549    summary_info += {'Windows SDK':       config_host['WIN_SDK']}
550  endif
551  summary_info += {'QGA VSS support':   config_host.has_key('CONFIG_QGA_VSS')}
552  summary_info += {'QGA w32 disk info': config_host.has_key('CONFIG_QGA_NTDDSCSI')}
553  summary_info += {'QGA MSI support':   config_host.has_key('CONFIG_QGA_MSI_ENABLED')}
554endif
555summary_info += {'seccomp support':   config_host.has_key('CONFIG_SECCOMP')}
556summary_info += {'coroutine backend': config_host['CONFIG_COROUTINE_BACKEND']}
557summary_info += {'coroutine pool':    config_host['CONFIG_COROUTINE_POOL'] == '1'}
558summary_info += {'debug stack usage': config_host.has_key('CONFIG_DEBUG_STACK_USAGE')}
559summary_info += {'mutex debugging':   config_host.has_key('CONFIG_DEBUG_MUTEX')}
560summary_info += {'crypto afalg':      config_host.has_key('CONFIG_AF_ALG')}
561summary_info += {'GlusterFS support': config_host.has_key('CONFIG_GLUSTERFS')}
562summary_info += {'gcov':              get_option('b_coverage')}
563summary_info += {'TPM support':       config_host.has_key('CONFIG_TPM')}
564summary_info += {'libssh support':    config_host.has_key('CONFIG_LIBSSH')}
565summary_info += {'QOM debugging':     config_host.has_key('CONFIG_QOM_CAST_DEBUG')}
566summary_info += {'Live block migration': config_host.has_key('CONFIG_LIVE_BLOCK_MIGRATION')}
567summary_info += {'lzo support':       config_host.has_key('CONFIG_LZO')}
568summary_info += {'snappy support':    config_host.has_key('CONFIG_SNAPPY')}
569summary_info += {'bzip2 support':     config_host.has_key('CONFIG_BZIP2')}
570summary_info += {'lzfse support':     config_host.has_key('CONFIG_LZFSE')}
571summary_info += {'zstd support':      config_host.has_key('CONFIG_ZSTD')}
572summary_info += {'NUMA host support': config_host.has_key('CONFIG_NUMA')}
573summary_info += {'libxml2':           config_host.has_key('CONFIG_LIBXML2')}
574summary_info += {'tcmalloc support':  config_host.has_key('CONFIG_TCMALLOC')}
575summary_info += {'jemalloc support':  config_host.has_key('CONFIG_JEMALLOC')}
576summary_info += {'avx2 optimization': config_host.has_key('CONFIG_AVX2_OPT')}
577summary_info += {'avx512f optimization': config_host.has_key('CONFIG_AVX512F_OPT')}
578summary_info += {'replication support': config_host.has_key('CONFIG_REPLICATION')}
579summary_info += {'bochs support':     config_host.has_key('CONFIG_BOCHS')}
580summary_info += {'cloop support':     config_host.has_key('CONFIG_CLOOP')}
581summary_info += {'dmg support':       config_host.has_key('CONFIG_DMG')}
582summary_info += {'qcow v1 support':   config_host.has_key('CONFIG_QCOW1')}
583summary_info += {'vdi support':       config_host.has_key('CONFIG_VDI')}
584summary_info += {'vvfat support':     config_host.has_key('CONFIG_VVFAT')}
585summary_info += {'qed support':       config_host.has_key('CONFIG_QED')}
586summary_info += {'parallels support': config_host.has_key('CONFIG_PARALLELS')}
587summary_info += {'sheepdog support':  config_host.has_key('CONFIG_SHEEPDOG')}
588summary_info += {'capstone':          config_host.has_key('CONFIG_CAPSTONE')}
589summary_info += {'libpmem support':   config_host.has_key('CONFIG_LIBPMEM')}
590summary_info += {'libdaxctl support': config_host.has_key('CONFIG_LIBDAXCTL')}
591summary_info += {'libudev':           config_host.has_key('CONFIG_LIBUDEV')}
592summary_info += {'default devices':   config_host['CONFIG_MINIKCONF_MODE'] == '--defconfig'}
593summary_info += {'plugin support':    config_host.has_key('CONFIG_PLUGIN')}
594summary_info += {'fuzzing support':   config_host.has_key('CONFIG_FUZZ')}
595if config_host.has_key('HAVE_GDB_BIN')
596  summary_info += {'gdb':             config_host['HAVE_GDB_BIN']}
597endif
598summary_info += {'thread sanitizer':  config_host.has_key('CONFIG_TSAN')}
599summary_info += {'rng-none':          config_host.has_key('CONFIG_RNG_NONE')}
600summary_info += {'Linux keyring':     config_host.has_key('CONFIG_SECRET_KEYRING')}
601summary(summary_info, bool_yn: true)
602
603if not supported_cpus.contains(cpu)
604  message()
605  warning('SUPPORT FOR THIS HOST CPU WILL GO AWAY IN FUTURE RELEASES!')
606  message()
607  message('CPU host architecture ' + cpu + ' support is not currently maintained.')
608  message('The QEMU project intends to remove support for this host CPU in')
609  message('a future release if nobody volunteers to maintain it and to')
610  message('provide a build host for our continuous integration setup.')
611  message('configure has succeeded and you can continue to build, but')
612  message('if you care about QEMU on this platform you should contact')
613  message('us upstream at qemu-devel@nongnu.org.')
614endif
615
616if not supported_oses.contains(targetos)
617  message()
618  warning('WARNING: SUPPORT FOR THIS HOST OS WILL GO AWAY IN FUTURE RELEASES!')
619  message()
620  message('Host OS ' + targetos + 'support is not currently maintained.')
621  message('The QEMU project intends to remove support for this host OS in')
622  message('a future release if nobody volunteers to maintain it and to')
623  message('provide a build host for our continuous integration setup.')
624  message('configure has succeeded and you can continue to build, but')
625  message('if you care about QEMU on this platform you should contact')
626  message('us upstream at qemu-devel@nongnu.org.')
627endif
628