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