xref: /openbmc/qemu/meson.build (revision 64ed6f92)
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')
12config_all_disas = keyval.load(meson.current_build_dir() / 'config-all-disas.mak')
13enable_modules = 'CONFIG_MODULES' in config_host
14
15add_project_arguments(config_host['QEMU_CFLAGS'].split(),
16                      native: false, language: ['c', 'objc'])
17add_project_arguments(config_host['QEMU_CXXFLAGS'].split(),
18                      native: false, language: 'cpp')
19add_project_link_arguments(config_host['QEMU_LDFLAGS'].split(),
20                           native: false, language: ['c', 'cpp', 'objc'])
21add_project_arguments(config_host['QEMU_INCLUDES'].split(),
22                      language: ['c', 'cpp', 'objc'])
23
24python = import('python').find_installation()
25
26link_language = meson.get_external_property('link_language', 'cpp')
27if link_language == 'cpp'
28  add_languages('cpp', required: true, native: false)
29endif
30if host_machine.system() == 'darwin'
31  add_languages('objc', required: false, native: false)
32endif
33
34if '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'])
39endif
40
41configure_file(input: files('scripts/ninjatool.py'),
42               output: 'ninjatool',
43               configuration: config_host)
44
45supported_oses = ['windows', 'freebsd', 'netbsd', 'openbsd', 'darwin', 'sunos', 'linux']
46supported_cpus = ['ppc', 'ppc64', 's390x', 'sparc64', 'riscv32', 'riscv64', 'x86', 'x86_64',
47  'arm', 'aarch64', 'mips', 'mips64', 'sparc', 'sparc64']
48
49cpu = host_machine.cpu_family()
50targetos = host_machine.system()
51
52m = cc.find_library('m', required: false)
53util = cc.find_library('util', required: false)
54winmm = []
55socket = []
56version_res = []
57coref = []
58iokit = []
59cocoa = []
60hvf = []
61if targetos == 'windows'
62  socket = cc.find_library('ws2_32')
63  winmm = cc.find_library('winmm')
64
65  win = import('windows')
66  version_res = win.compile_resources('version.rc',
67                                      depend_files: files('pc-bios/qemu-nsis.ico'),
68                                      include_directories: include_directories('.'))
69elif targetos == 'darwin'
70  coref = dependency('appleframeworks', modules: 'CoreFoundation')
71  iokit = dependency('appleframeworks', modules: 'IOKit')
72  cocoa = dependency('appleframeworks', modules: 'Cocoa')
73  hvf = dependency('appleframeworks', modules: 'Hypervisor')
74elif targetos == 'sunos'
75  socket = [cc.find_library('socket'),
76            cc.find_library('nsl'),
77            cc.find_library('resolv')]
78elif targetos == 'haiku'
79  socket = [cc.find_library('posix_error_mapper'),
80            cc.find_library('network'),
81            cc.find_library('bsd')]
82endif
83glib = declare_dependency(compile_args: config_host['GLIB_CFLAGS'].split(),
84                          link_args: config_host['GLIB_LIBS'].split())
85gio = not_found
86if 'CONFIG_GIO' in config_host
87  gio = declare_dependency(compile_args: config_host['GIO_CFLAGS'].split(),
88                           link_args: config_host['GIO_LIBS'].split())
89endif
90lttng = not_found
91if 'CONFIG_TRACE_UST' in config_host
92  lttng = declare_dependency(link_args: config_host['LTTNG_UST_LIBS'].split())
93endif
94urcubp = not_found
95if 'CONFIG_TRACE_UST' in config_host
96  urcubp = declare_dependency(link_args: config_host['URCU_BP_LIBS'].split())
97endif
98nettle = not_found
99if 'CONFIG_NETTLE' in config_host
100  nettle = declare_dependency(compile_args: config_host['NETTLE_CFLAGS'].split(),
101                              link_args: config_host['NETTLE_LIBS'].split())
102endif
103gnutls = not_found
104if 'CONFIG_GNUTLS' in config_host
105  gnutls = declare_dependency(compile_args: config_host['GNUTLS_CFLAGS'].split(),
106                              link_args: config_host['GNUTLS_LIBS'].split())
107endif
108pixman = declare_dependency(compile_args: config_host['PIXMAN_CFLAGS'].split(),
109                            link_args: config_host['PIXMAN_LIBS'].split())
110pam = not_found
111if 'CONFIG_AUTH_PAM' in config_host
112  pam = cc.find_library('pam')
113endif
114libaio = cc.find_library('aio', required: false)
115zlib = not_found
116if 'CONFIG_ZLIB' in config_host
117  zlib = declare_dependency(compile_args: config_host['ZLIB_CFLAGS'].split(),
118                            link_args: config_host['ZLIB_LIBS'].split())
119endif
120linux_io_uring = not_found
121if 'CONFIG_LINUX_IO_URING' in config_host
122  linux_io_uring = declare_dependency(compile_args: config_host['LINUX_IO_URING_CFLAGS'].split(),
123                                      link_args: config_host['LINUX_IO_URING_LIBS'].split())
124endif
125libxml2 = not_found
126if 'CONFIG_LIBXML2' in config_host
127  libxml2 = declare_dependency(compile_args: config_host['LIBXML2_CFLAGS'].split(),
128                               link_args: config_host['LIBXML2_LIBS'].split())
129endif
130libnfs = not_found
131if 'CONFIG_LIBNFS' in config_host
132  libnfs = declare_dependency(link_args: config_host['LIBNFS_LIBS'].split())
133endif
134libattr = not_found
135if 'CONFIG_ATTR' in config_host
136  libattr = declare_dependency(link_args: config_host['LIBATTR_LIBS'].split())
137endif
138seccomp = not_found
139if 'CONFIG_SECCOMP' in config_host
140  seccomp = declare_dependency(compile_args: config_host['SECCOMP_CFLAGS'].split(),
141                               link_args: config_host['SECCOMP_LIBS'].split())
142endif
143libcap_ng = not_found
144if 'CONFIG_LIBCAP_NG' in config_host
145  libcap_ng = declare_dependency(link_args: config_host['LIBCAP_NG_LIBS'].split())
146endif
147xkbcommon = not_found
148if 'CONFIG_XKBCOMMON' in config_host
149  xkbcommon = declare_dependency(compile_args: config_host['XKBCOMMON_CFLAGS'].split(),
150                                 link_args: config_host['XKBCOMMON_LIBS'].split())
151endif
152slirp = not_found
153if config_host.has_key('CONFIG_SLIRP')
154  slirp = declare_dependency(compile_args: config_host['SLIRP_CFLAGS'].split(),
155                             link_args: config_host['SLIRP_LIBS'].split())
156endif
157vde = not_found
158if config_host.has_key('CONFIG_VDE')
159  vde = declare_dependency(link_args: config_host['VDE_LIBS'].split())
160endif
161pulse = not_found
162if 'CONFIG_LIBPULSE' in config_host
163  pulse = declare_dependency(compile_args: config_host['PULSE_CFLAGS'].split(),
164                             link_args: config_host['PULSE_LIBS'].split())
165endif
166alsa = not_found
167if 'CONFIG_ALSA' in config_host
168  alsa = declare_dependency(compile_args: config_host['ALSA_CFLAGS'].split(),
169                            link_args: config_host['ALSA_LIBS'].split())
170endif
171jack = not_found
172if 'CONFIG_LIBJACK' in config_host
173  jack = declare_dependency(link_args: config_host['JACK_LIBS'].split())
174endif
175spice = not_found
176if 'CONFIG_SPICE' in config_host
177  spice = declare_dependency(compile_args: config_host['SPICE_CFLAGS'].split(),
178                             link_args: config_host['SPICE_LIBS'].split())
179endif
180rt = cc.find_library('rt', required: false)
181libmpathpersist = not_found
182if config_host.has_key('CONFIG_MPATH')
183  libmpathpersist = cc.find_library('mpathpersist')
184endif
185libiscsi = not_found
186if 'CONFIG_LIBISCSI' in config_host
187  libiscsi = declare_dependency(compile_args: config_host['LIBISCSI_CFLAGS'].split(),
188                                link_args: config_host['LIBISCSI_LIBS'].split())
189endif
190zstd = not_found
191if 'CONFIG_ZSTD' in config_host
192  zstd = declare_dependency(compile_args: config_host['ZSTD_CFLAGS'].split(),
193                            link_args: config_host['ZSTD_LIBS'].split())
194endif
195gbm = not_found
196if 'CONFIG_GBM' in config_host
197  gbm = declare_dependency(compile_args: config_host['GBM_CFLAGS'].split(),
198                           link_args: config_host['GBM_LIBS'].split())
199endif
200virgl = not_found
201if 'CONFIG_VIRGL' in config_host
202  virgl = declare_dependency(compile_args: config_host['VIRGL_CFLAGS'].split(),
203                             link_args: config_host['VIRGL_LIBS'].split())
204endif
205curl = not_found
206if 'CONFIG_CURL' in config_host
207  curl = declare_dependency(compile_args: config_host['CURL_CFLAGS'].split(),
208                            link_args: config_host['CURL_LIBS'].split())
209endif
210libudev = not_found
211if 'CONFIG_LIBUDEV' in config_host
212  libudev = declare_dependency(link_args: config_host['LIBUDEV_LIBS'].split())
213endif
214brlapi = not_found
215if 'CONFIG_BRLAPI' in config_host
216  brlapi = declare_dependency(link_args: config_host['BRLAPI_LIBS'].split())
217endif
218sdlwindows = false
219sdl = not_found
220if 'CONFIG_SDL' in config_host
221  sdl = declare_dependency(compile_args: config_host['SDL_CFLAGS'].split(),
222                           link_args: config_host['SDL_LIBS'].split())
223  sdlwindows = config_host['SDL_LIBS'].contains('-mwindows')
224endif
225rbd = not_found
226if 'CONFIG_RBD' in config_host
227  rbd = declare_dependency(link_args: config_host['RBD_LIBS'].split())
228endif
229glusterfs = not_found
230if 'CONFIG_GLUSTERFS' in config_host
231  glusterfs = declare_dependency(compile_args: config_host['GLUSTERFS_CFLAGS'].split(),
232                                 link_args: config_host['GLUSTERFS_LIBS'].split())
233endif
234libssh = not_found
235if 'CONFIG_LIBSSH' in config_host
236  libssh = declare_dependency(compile_args: config_host['LIBSSH_CFLAGS'].split(),
237                              link_args: config_host['LIBSSH_LIBS'].split())
238endif
239libbzip2 = not_found
240if 'CONFIG_BZIP2' in config_host
241  libbzip2 = declare_dependency(link_args: config_host['BZIP2_LIBS'].split())
242endif
243liblzfse = not_found
244if 'CONFIG_LZFSE' in config_host
245  liblzfse = declare_dependency(link_args: config_host['LZFSE_LIBS'].split())
246endif
247oss = not_found
248if 'CONFIG_AUDIO_OSS' in config_host
249  oss = declare_dependency(link_args: config_host['OSS_LIBS'].split())
250endif
251dsound = not_found
252if 'CONFIG_AUDIO_DSOUND' in config_host
253  dsound = declare_dependency(link_args: config_host['DSOUND_LIBS'].split())
254endif
255coreaudio = not_found
256if 'CONFIG_AUDIO_COREAUDIO' in config_host
257  coreaudio = declare_dependency(link_args: config_host['COREAUDIO_LIBS'].split())
258endif
259opengl = not_found
260if 'CONFIG_OPENGL' in config_host
261  opengl = declare_dependency(link_args: config_host['OPENGL_LIBS'].split())
262else
263endif
264gtk = not_found
265if 'CONFIG_GTK' in config_host
266  gtk = declare_dependency(compile_args: config_host['GTK_CFLAGS'].split(),
267                              link_args: config_host['GTK_LIBS'].split())
268endif
269vte = not_found
270if 'CONFIG_VTE' in config_host
271  vte = declare_dependency(compile_args: config_host['VTE_CFLAGS'].split(),
272                           link_args: config_host['VTE_LIBS'].split())
273endif
274x11 = not_found
275if 'CONFIG_X11' in config_host
276  x11 = declare_dependency(compile_args: config_host['X11_CFLAGS'].split(),
277                           link_args: config_host['X11_LIBS'].split())
278endif
279curses = not_found
280if 'CONFIG_CURSES' in config_host
281  curses = declare_dependency(compile_args: config_host['CURSES_CFLAGS'].split(),
282                              link_args: config_host['CURSES_LIBS'].split())
283endif
284iconv = not_found
285if 'CONFIG_ICONV' in config_host
286  iconv = declare_dependency(compile_args: config_host['ICONV_CFLAGS'].split(),
287                             link_args: config_host['ICONV_LIBS'].split())
288endif
289gio = not_found
290if 'CONFIG_GIO' in config_host
291  gio = declare_dependency(compile_args: config_host['GIO_CFLAGS'].split(),
292                           link_args: config_host['GIO_LIBS'].split())
293endif
294png = not_found
295if 'CONFIG_VNC_PNG' in config_host
296  png = declare_dependency(compile_args: config_host['PNG_CFLAGS'].split(),
297                           link_args: config_host['PNG_LIBS'].split())
298endif
299jpeg = not_found
300if 'CONFIG_VNC_JPEG' in config_host
301  jpeg = declare_dependency(compile_args: config_host['JPEG_CFLAGS'].split(),
302                            link_args: config_host['JPEG_LIBS'].split())
303endif
304sasl = not_found
305if 'CONFIG_VNC_SASL' in config_host
306  sasl = declare_dependency(compile_args: config_host['SASL_CFLAGS'].split(),
307                            link_args: config_host['SASL_LIBS'].split())
308endif
309fdt = not_found
310if 'CONFIG_FDT' in config_host
311  fdt = declare_dependency(compile_args: config_host['FDT_CFLAGS'].split(),
312                           link_args: config_host['FDT_LIBS'].split())
313endif
314snappy = not_found
315if 'CONFIG_SNAPPY' in config_host
316  snappy = declare_dependency(link_args: config_host['SNAPPY_LIBS'].split())
317endif
318lzo = not_found
319if 'CONFIG_LZO' in config_host
320  lzo = declare_dependency(link_args: config_host['LZO_LIBS'].split())
321endif
322rdma = not_found
323if 'CONFIG_RDMA' in config_host
324  rdma = declare_dependency(link_args: config_host['RDMA_LIBS'].split())
325endif
326numa = not_found
327if 'CONFIG_NUMA' in config_host
328  numa = declare_dependency(link_args: config_host['NUMA_LIBS'].split())
329endif
330xen = not_found
331if 'CONFIG_XEN_BACKEND' in config_host
332  xen = declare_dependency(compile_args: config_host['XEN_CFLAGS'].split(),
333                           link_args: config_host['XEN_LIBS'].split())
334endif
335cacard = not_found
336if 'CONFIG_SMARTCARD' in config_host
337  cacard = declare_dependency(compile_args: config_host['SMARTCARD_CFLAGS'].split(),
338                              link_args: config_host['SMARTCARD_LIBS'].split())
339endif
340usbredir = not_found
341if 'CONFIG_USB_REDIR' in config_host
342  usbredir = declare_dependency(compile_args: config_host['USB_REDIR_CFLAGS'].split(),
343                                link_args: config_host['USB_REDIR_LIBS'].split())
344endif
345libusb = not_found
346if 'CONFIG_USB_LIBUSB' in config_host
347  libusb = declare_dependency(compile_args: config_host['LIBUSB_CFLAGS'].split(),
348                              link_args: config_host['LIBUSB_LIBS'].split())
349endif
350capstone = not_found
351if 'CONFIG_CAPSTONE' in config_host
352  capstone = declare_dependency(compile_args: config_host['CAPSTONE_CFLAGS'].split(),
353                                link_args: config_host['CAPSTONE_LIBS'].split())
354endif
355libpmem = not_found
356if 'CONFIG_LIBPMEM' in config_host
357  libpmem = declare_dependency(compile_args: config_host['LIBPMEM_CFLAGS'].split(),
358                               link_args: config_host['LIBPMEM_LIBS'].split())
359endif
360
361create_config = find_program('scripts/create_config')
362minikconf = find_program('scripts/minikconf.py')
363target_dirs = config_host['TARGET_DIRS'].split()
364have_user = false
365have_system = false
366config_devices_mak_list = []
367config_devices_h = {}
368config_target_mak = {}
369kconfig_external_symbols = [
370  'CONFIG_KVM',
371  'CONFIG_XEN',
372  'CONFIG_TPM',
373  'CONFIG_SPICE',
374  'CONFIG_IVSHMEM',
375  'CONFIG_OPENGL',
376  'CONFIG_X11',
377  'CONFIG_VHOST_USER',
378  'CONFIG_VHOST_KERNEL',
379  'CONFIG_VIRTFS',
380  'CONFIG_LINUX',
381  'CONFIG_PVRDMA',
382]
383foreach target : target_dirs
384  have_user = have_user or target.endswith('-user')
385  config_target = keyval.load(meson.current_build_dir() / target / 'config-target.mak') + config_host
386
387  if target.endswith('-softmmu')
388    have_system = true
389
390    base_kconfig = []
391    foreach sym : kconfig_external_symbols
392      if sym in config_target
393        base_kconfig += '@0@=y'.format(sym)
394      endif
395    endforeach
396
397    config_devices_mak = target + '-config-devices.mak'
398    config_devices_mak = configure_file(
399      input: ['default-configs' / target + '.mak', 'Kconfig'],
400      output: config_devices_mak,
401      depfile: config_devices_mak + '.d',
402      capture: true,
403      command: [minikconf, config_host['CONFIG_MINIKCONF_MODE'],
404                config_devices_mak, '@DEPFILE@', '@INPUT@',
405                base_kconfig])
406    config_devices_h += {target: custom_target(
407      target + '-config-devices.h',
408      input: config_devices_mak,
409      output: target + '-config-devices.h',
410      capture: true,
411      command: [create_config, '@INPUT@'])}
412    config_devices_mak_list += config_devices_mak
413    config_target += keyval.load(config_devices_mak)
414  endif
415  config_target_mak += {target: config_target}
416endforeach
417have_tools = 'CONFIG_TOOLS' in config_host
418have_block = have_system or have_tools
419
420grepy = find_program('scripts/grepy.sh')
421# This configuration is used to build files that are shared by
422# multiple binaries, and then extracted out of the "common"
423# static_library target.
424#
425# We do not use all_sources()/all_dependencies(), because it would
426# build literally all source files, including devices only used by
427# targets that are not built for this compilation.  The CONFIG_ALL
428# pseudo symbol replaces it.
429
430if have_system
431  config_all_devices_mak = configure_file(
432    output: 'config-all-devices.mak',
433    input: config_devices_mak_list,
434    capture: true,
435    command: [grepy, '@INPUT@'],
436  )
437  config_all_devices = keyval.load(config_all_devices_mak)
438else
439  config_all_devices = {}
440endif
441config_all = config_all_devices
442config_all += config_host
443config_all += config_all_disas
444config_all += {
445  'CONFIG_XEN': config_host.has_key('CONFIG_XEN_BACKEND'),
446  'CONFIG_SOFTMMU': have_system,
447  'CONFIG_USER_ONLY': have_user,
448  'CONFIG_ALL': true,
449}
450
451# Generators
452
453genh = []
454hxtool = find_program('scripts/hxtool')
455shaderinclude = find_program('scripts/shaderinclude.pl')
456qapi_gen = find_program('scripts/qapi-gen.py')
457qapi_gen_depends = [ meson.source_root() / 'scripts/qapi/__init__.py',
458                     meson.source_root() / 'scripts/qapi/commands.py',
459                     meson.source_root() / 'scripts/qapi/common.py',
460                     meson.source_root() / 'scripts/qapi/doc.py',
461                     meson.source_root() / 'scripts/qapi/error.py',
462                     meson.source_root() / 'scripts/qapi/events.py',
463                     meson.source_root() / 'scripts/qapi/expr.py',
464                     meson.source_root() / 'scripts/qapi/gen.py',
465                     meson.source_root() / 'scripts/qapi/introspect.py',
466                     meson.source_root() / 'scripts/qapi/parser.py',
467                     meson.source_root() / 'scripts/qapi/schema.py',
468                     meson.source_root() / 'scripts/qapi/source.py',
469                     meson.source_root() / 'scripts/qapi/types.py',
470                     meson.source_root() / 'scripts/qapi/visit.py',
471                     meson.source_root() / 'scripts/qapi/common.py',
472                     meson.source_root() / 'scripts/qapi/doc.py',
473                     meson.source_root() / 'scripts/qapi-gen.py'
474]
475
476tracetool = [
477  python, files('scripts/tracetool.py'),
478   '--backend=' + config_host['TRACE_BACKENDS']
479]
480
481qemu_version_cmd = [find_program('scripts/qemu-version.sh'),
482                    meson.current_source_dir(),
483                    config_host['PKGVERSION'], config_host['VERSION']]
484qemu_version = custom_target('qemu-version.h',
485                             output: 'qemu-version.h',
486                             command: qemu_version_cmd,
487                             capture: true,
488                             build_by_default: true,
489                             build_always_stale: true)
490genh += qemu_version
491
492config_host_h = custom_target('config-host.h',
493                              input: meson.current_build_dir() / 'config-host.mak',
494                              output: 'config-host.h',
495                              capture: true,
496                              command: [create_config, '@INPUT@'])
497genh += config_host_h
498
499hxdep = []
500hx_headers = [
501  ['qemu-options.hx', 'qemu-options.def'],
502  ['qemu-img-cmds.hx', 'qemu-img-cmds.h'],
503]
504if have_system
505  hx_headers += [
506    ['hmp-commands.hx', 'hmp-commands.h'],
507    ['hmp-commands-info.hx', 'hmp-commands-info.h'],
508  ]
509endif
510foreach d : hx_headers
511  hxdep += custom_target(d[1],
512                input: files(d[0]),
513                output: d[1],
514                capture: true,
515                build_by_default: true, # to be removed when added to a target
516                command: [hxtool, '-h', '@INPUT0@'])
517endforeach
518genh += hxdep
519
520# Collect sourcesets.
521
522util_ss = ss.source_set()
523stub_ss = ss.source_set()
524trace_ss = ss.source_set()
525block_ss = ss.source_set()
526blockdev_ss = ss.source_set()
527qmp_ss = ss.source_set()
528common_ss = ss.source_set()
529softmmu_ss = ss.source_set()
530user_ss = ss.source_set()
531bsd_user_ss = ss.source_set()
532linux_user_ss = ss.source_set()
533specific_ss = ss.source_set()
534specific_fuzz_ss = ss.source_set()
535
536modules = {}
537hw_arch = {}
538target_arch = {}
539target_softmmu_arch = {}
540
541###############
542# Trace files #
543###############
544
545# TODO: add each directory to the subdirs from its own meson.build, once
546# we have those
547trace_events_subdirs = [
548  'accel/kvm',
549  'accel/tcg',
550  'crypto',
551  'monitor',
552]
553if have_user
554  trace_events_subdirs += [ 'linux-user' ]
555endif
556if have_block
557  trace_events_subdirs += [
558    'authz',
559    'block',
560    'io',
561    'nbd',
562    'scsi',
563  ]
564endif
565if have_system
566  trace_events_subdirs += [
567    'audio',
568    'backends',
569    'backends/tpm',
570    'chardev',
571    'hw/9pfs',
572    'hw/acpi',
573    'hw/alpha',
574    'hw/arm',
575    'hw/audio',
576    'hw/block',
577    'hw/block/dataplane',
578    'hw/char',
579    'hw/display',
580    'hw/dma',
581    'hw/hppa',
582    'hw/hyperv',
583    'hw/i2c',
584    'hw/i386',
585    'hw/i386/xen',
586    'hw/ide',
587    'hw/input',
588    'hw/intc',
589    'hw/isa',
590    'hw/mem',
591    'hw/mips',
592    'hw/misc',
593    'hw/misc/macio',
594    'hw/net',
595    'hw/nvram',
596    'hw/pci',
597    'hw/pci-host',
598    'hw/ppc',
599    'hw/rdma',
600    'hw/rdma/vmw',
601    'hw/rtc',
602    'hw/s390x',
603    'hw/scsi',
604    'hw/sd',
605    'hw/sparc',
606    'hw/sparc64',
607    'hw/ssi',
608    'hw/timer',
609    'hw/tpm',
610    'hw/usb',
611    'hw/vfio',
612    'hw/virtio',
613    'hw/watchdog',
614    'hw/xen',
615    'hw/gpio',
616    'hw/riscv',
617    'migration',
618    'net',
619    'ui',
620  ]
621endif
622trace_events_subdirs += [
623  'hw/core',
624  'qapi',
625  'qom',
626  'target/arm',
627  'target/hppa',
628  'target/i386',
629  'target/mips',
630  'target/ppc',
631  'target/riscv',
632  'target/s390x',
633  'target/sparc',
634  'util',
635]
636
637subdir('qapi')
638subdir('qobject')
639subdir('stubs')
640subdir('trace')
641subdir('util')
642subdir('qom')
643subdir('authz')
644subdir('crypto')
645subdir('ui')
646
647
648if enable_modules
649  libmodulecommon = static_library('module-common', files('module-common.c') + genh, pic: true, c_args: '-DBUILD_DSO')
650  modulecommon = declare_dependency(link_whole: libmodulecommon, compile_args: '-DBUILD_DSO')
651endif
652
653# Build targets from sourcesets
654
655stub_ss = stub_ss.apply(config_all, strict: false)
656
657util_ss.add_all(trace_ss)
658util_ss = util_ss.apply(config_all, strict: false)
659libqemuutil = static_library('qemuutil',
660                             sources: util_ss.sources() + stub_ss.sources() + genh,
661                             dependencies: [util_ss.dependencies(), m, glib, socket])
662qemuutil = declare_dependency(link_with: libqemuutil,
663                              sources: genh + version_res)
664
665decodetree = generator(find_program('scripts/decodetree.py'),
666                       output: 'decode-@BASENAME@.c.inc',
667                       arguments: ['@INPUT@', '@EXTRA_ARGS@', '-o', '@OUTPUT@'])
668
669subdir('audio')
670subdir('io')
671subdir('chardev')
672subdir('fsdev')
673subdir('libdecnumber')
674subdir('target')
675subdir('dump')
676
677block_ss.add(files(
678  'block.c',
679  'blockjob.c',
680  'job.c',
681  'qemu-io-cmds.c',
682))
683block_ss.add(when: 'CONFIG_REPLICATION', if_true: files('replication.c'))
684
685subdir('nbd')
686subdir('scsi')
687subdir('block')
688
689blockdev_ss.add(files(
690  'blockdev.c',
691  'blockdev-nbd.c',
692  'iothread.c',
693  'job-qmp.c',
694))
695
696# os-posix.c contains POSIX-specific functions used by qemu-storage-daemon,
697# os-win32.c does not
698blockdev_ss.add(when: 'CONFIG_POSIX', if_true: files('os-posix.c'))
699softmmu_ss.add(when: 'CONFIG_WIN32', if_true: [files('os-win32.c')])
700
701softmmu_ss.add_all(blockdev_ss)
702softmmu_ss.add(files(
703  'bootdevice.c',
704  'dma-helpers.c',
705  'qdev-monitor.c',
706), sdl)
707
708softmmu_ss.add(when: 'CONFIG_TPM', if_true: files('tpm.c'))
709softmmu_ss.add(when: 'CONFIG_SECCOMP', if_true: [files('qemu-seccomp.c'), seccomp])
710softmmu_ss.add(when: ['CONFIG_FDT', fdt],  if_true: [files('device_tree.c')])
711
712common_ss.add(files('cpus-common.c'))
713
714subdir('softmmu')
715
716specific_ss.add(files('disas.c', 'exec.c', 'gdbstub.c'), capstone, libpmem)
717specific_ss.add(files('exec-vary.c'))
718specific_ss.add(when: 'CONFIG_TCG', if_true: files(
719  'fpu/softfloat.c',
720  'tcg/optimize.c',
721  'tcg/tcg-common.c',
722  'tcg/tcg-op-gvec.c',
723  'tcg/tcg-op-vec.c',
724  'tcg/tcg-op.c',
725  'tcg/tcg.c',
726))
727specific_ss.add(when: 'CONFIG_TCG_INTERPRETER', if_true: files('disas/tci.c', 'tcg/tci.c'))
728
729subdir('backends')
730subdir('disas')
731subdir('migration')
732subdir('monitor')
733subdir('net')
734subdir('replay')
735subdir('hw')
736subdir('accel')
737subdir('plugins')
738subdir('bsd-user')
739subdir('linux-user')
740
741bsd_user_ss.add(files('gdbstub.c'))
742specific_ss.add_all(when: 'CONFIG_BSD_USER', if_true: bsd_user_ss)
743
744linux_user_ss.add(files('gdbstub.c', 'thunk.c'))
745specific_ss.add_all(when: 'CONFIG_LINUX_USER', if_true: linux_user_ss)
746
747# needed for fuzzing binaries
748subdir('tests/qtest/libqos')
749subdir('tests/qtest/fuzz')
750
751block_mods = []
752softmmu_mods = []
753foreach d, list : modules
754  foreach m, module_ss : list
755    if enable_modules and targetos != 'windows'
756      module_ss = module_ss.apply(config_host, strict: false)
757      sl = static_library(d + '-' + m, [genh, module_ss.sources()],
758                          dependencies: [modulecommon, module_ss.dependencies()], pic: true)
759      if d == 'block'
760        block_mods += sl
761      else
762        softmmu_mods += sl
763      endif
764    else
765      if d == 'block'
766        block_ss.add_all(module_ss)
767      else
768        softmmu_ss.add_all(module_ss)
769      endif
770    endif
771  endforeach
772endforeach
773
774nm = find_program('nm')
775undefsym = find_program('scripts/undefsym.sh')
776block_syms = custom_target('block.syms', output: 'block.syms',
777                             input: [libqemuutil, block_mods],
778                             capture: true,
779                             command: [undefsym, nm, '@INPUT@'])
780qemu_syms = custom_target('qemu.syms', output: 'qemu.syms',
781                             input: [libqemuutil, softmmu_mods],
782                             capture: true,
783                             command: [undefsym, nm, '@INPUT@'])
784
785block_ss = block_ss.apply(config_host, strict: false)
786libblock = static_library('block', block_ss.sources() + genh,
787                          dependencies: block_ss.dependencies(),
788                          link_depends: block_syms,
789                          name_suffix: 'fa',
790                          build_by_default: false)
791
792block = declare_dependency(link_whole: [libblock],
793                           link_args: '@block.syms',
794                           dependencies: [crypto, io])
795
796qmp_ss = qmp_ss.apply(config_host, strict: false)
797libqmp = static_library('qmp', qmp_ss.sources() + genh,
798                        dependencies: qmp_ss.dependencies(),
799                        name_suffix: 'fa',
800                        build_by_default: false)
801
802qmp = declare_dependency(link_whole: [libqmp])
803
804foreach m : block_mods + softmmu_mods
805  shared_module(m.name(),
806                name_prefix: '',
807                link_whole: m,
808                install: true,
809                install_dir: config_host['qemu_moddir'])
810endforeach
811
812softmmu_ss.add(authz, block, chardev, crypto, io, qmp)
813common_ss.add(qom, qemuutil)
814
815common_ss.add_all(when: 'CONFIG_SOFTMMU', if_true: [softmmu_ss])
816common_ss.add_all(when: 'CONFIG_USER_ONLY', if_true: user_ss)
817
818common_all = common_ss.apply(config_all, strict: false)
819common_all = static_library('common',
820                            build_by_default: false,
821                            sources: common_all.sources() + genh,
822                            dependencies: common_all.dependencies(),
823                            name_suffix: 'fa')
824
825feature_to_c = find_program('scripts/feature_to_c.sh')
826
827emulators = []
828foreach target : target_dirs
829  config_target = config_target_mak[target]
830  target_name = config_target['TARGET_NAME']
831  arch = config_target['TARGET_BASE_ARCH']
832  arch_srcs = []
833  arch_deps = []
834  c_args = ['-DNEED_CPU_H',
835            '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
836            '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)]
837  link_args = []
838
839  target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
840  if targetos == 'linux'
841    target_inc += include_directories('linux-headers', is_system: true)
842  endif
843  if target.endswith('-softmmu')
844    qemu_target_name = 'qemu-system-' + target_name
845    target_type='system'
846    t = target_softmmu_arch[arch].apply(config_target, strict: false)
847    arch_srcs += t.sources()
848    arch_deps += t.dependencies()
849
850    hw_dir = target_name == 'sparc64' ? 'sparc64' : arch
851    hw = hw_arch[hw_dir].apply(config_target, strict: false)
852    arch_srcs += hw.sources()
853    arch_deps += hw.dependencies()
854
855    arch_srcs += config_devices_h[target]
856    link_args += ['@block.syms', '@qemu.syms']
857  else
858    abi = config_target['TARGET_ABI_DIR']
859    target_type='user'
860    qemu_target_name = 'qemu-' + target_name
861    if 'CONFIG_LINUX_USER' in config_target
862      base_dir = 'linux-user'
863      target_inc += include_directories('linux-user/host/' / config_host['ARCH'])
864    else
865      base_dir = 'bsd-user'
866    endif
867    target_inc += include_directories(
868      base_dir,
869      base_dir / abi,
870    )
871    if 'CONFIG_LINUX_USER' in config_target
872      dir = base_dir / abi
873      arch_srcs += files(dir / 'signal.c', dir / 'cpu_loop.c')
874      if config_target.has_key('TARGET_SYSTBL_ABI')
875        arch_srcs += \
876          syscall_nr_generators[abi].process(base_dir / abi / config_target['TARGET_SYSTBL'],
877                                             extra_args : config_target['TARGET_SYSTBL_ABI'])
878      endif
879    endif
880  endif
881
882  if 'TARGET_XML_FILES' in config_target
883    gdbstub_xml = custom_target(target + '-gdbstub-xml.c',
884                                output: target + '-gdbstub-xml.c',
885                                input: files(config_target['TARGET_XML_FILES'].split()),
886                                command: [feature_to_c, '@INPUT@'],
887                                capture: true)
888    arch_srcs += gdbstub_xml
889  endif
890
891  t = target_arch[arch].apply(config_target, strict: false)
892  arch_srcs += t.sources()
893  arch_deps += t.dependencies()
894
895  target_common = common_ss.apply(config_target, strict: false)
896  objects = common_all.extract_objects(target_common.sources())
897  deps = target_common.dependencies()
898
899  # TODO: Change to generator once obj-y goes away
900  config_target_h = custom_target(target + '-config-target.h',
901                              input: meson.current_build_dir() / target / 'config-target.mak',
902                              output: target + '-config-target.h',
903                              capture: true,
904                              command: [create_config, '@INPUT@'])
905
906  target_specific = specific_ss.apply(config_target, strict: false)
907  arch_srcs += target_specific.sources()
908  arch_deps += target_specific.dependencies()
909
910  lib = static_library('qemu-' + target,
911                 sources: arch_srcs + [config_target_h] + genh,
912                 objects: objects,
913                 include_directories: target_inc,
914                 c_args: c_args,
915                 build_by_default: false,
916                 name_suffix: 'fa')
917
918  if target.endswith('-softmmu')
919    execs = [{
920      'name': 'qemu-system-' + target_name,
921      'gui': false,
922      'sources': files('softmmu/main.c'),
923      'dependencies': []
924    }]
925    if sdlwindows
926      execs += [{
927        'name': 'qemu-system-' + target_name + 'w',
928        'gui': true,
929        'sources': files('softmmu/main.c'),
930        'dependencies': []
931      }]
932    endif
933    if config_host.has_key('CONFIG_FUZZ')
934      specific_fuzz = specific_fuzz_ss.apply(config_target, strict: false)
935      execs += [{
936        'name': 'qemu-fuzz-' + target_name,
937        'gui': false,
938        'sources': specific_fuzz.sources(),
939        'dependencies': specific_fuzz.dependencies(),
940        'link_depends': [files('tests/qtest/fuzz/fork_fuzz.ld')],
941      }]
942    endif
943  else
944    execs = [{
945      'name': 'qemu-' + target_name,
946      'gui': false,
947      'sources': [],
948      'dependencies': []
949    }]
950  endif
951  foreach exe: execs
952    emulators += executable(exe['name'], exe['sources'],
953               install: true,
954               c_args: c_args,
955               dependencies: arch_deps + deps + exe['dependencies'],
956               objects: lib.extract_all_objects(recursive: true),
957               link_language: link_language,
958               link_depends: [block_syms, qemu_syms] + exe.get('link_depends', []),
959               link_args: link_args,
960               gui_app: exe['gui'])
961  endforeach
962endforeach
963
964# Other build targets
965
966if 'CONFIG_PLUGIN' in config_host
967  install_headers('include/qemu/qemu-plugin.h')
968endif
969
970if 'CONFIG_GUEST_AGENT' in config_host
971  subdir('qga')
972endif
973
974if have_tools
975  qemu_img = executable('qemu-img', [files('qemu-img.c'), hxdep],
976             dependencies: [authz, block, crypto, io, qom, qemuutil], install: true)
977  qemu_io = executable('qemu-io', files('qemu-io.c'),
978             dependencies: [block, qemuutil], install: true)
979  if targetos == 'linux' or targetos == 'sunos' or targetos.endswith('bsd')
980    qemu_nbd = executable('qemu-nbd', files('qemu-nbd.c'),
981               dependencies: [block, qemuutil], install: true)
982  endif
983
984  subdir('storage-daemon')
985  subdir('contrib/rdmacm-mux')
986  subdir('contrib/elf2dmp')
987
988  if 'CONFIG_XKBCOMMON' in config_host
989    executable('qemu-keymap', files('qemu-keymap.c', 'ui/input-keymap.c'),
990               dependencies: [qemuutil, xkbcommon], install: true)
991  endif
992
993  executable('qemu-edid', files('qemu-edid.c', 'hw/display/edid-generate.c'),
994             dependencies: qemuutil,
995             install: true)
996
997  if 'CONFIG_VHOST_USER' in config_host
998    subdir('contrib/libvhost-user')
999    subdir('contrib/vhost-user-blk')
1000    if 'CONFIG_LINUX' in config_host
1001      subdir('contrib/vhost-user-gpu')
1002    endif
1003    subdir('contrib/vhost-user-input')
1004    subdir('contrib/vhost-user-scsi')
1005  endif
1006
1007  if targetos == 'linux'
1008    executable('qemu-bridge-helper', files('qemu-bridge-helper.c'),
1009               dependencies: [qemuutil, libcap_ng],
1010               install: true,
1011               install_dir: get_option('libexecdir'))
1012
1013    executable('qemu-pr-helper', files('scsi/qemu-pr-helper.c', 'scsi/utils.c'),
1014               dependencies: [authz, crypto, io, qom, qemuutil,
1015                              libcap_ng, libudev, libmpathpersist],
1016               install: true)
1017  endif
1018
1019  if 'CONFIG_IVSHMEM' in config_host
1020    subdir('contrib/ivshmem-client')
1021    subdir('contrib/ivshmem-server')
1022  endif
1023endif
1024
1025subdir('tools')
1026subdir('pc-bios')
1027subdir('tests')
1028
1029summary_info = {}
1030summary_info += {'Install prefix':    config_host['prefix']}
1031summary_info += {'BIOS directory':    config_host['qemu_datadir']}
1032summary_info += {'firmware path':     config_host['qemu_firmwarepath']}
1033summary_info += {'binary directory':  config_host['bindir']}
1034summary_info += {'library directory': config_host['libdir']}
1035summary_info += {'module directory':  config_host['qemu_moddir']}
1036summary_info += {'libexec directory': config_host['libexecdir']}
1037summary_info += {'include directory': config_host['includedir']}
1038summary_info += {'config directory':  config_host['sysconfdir']}
1039if targetos != 'windows'
1040  summary_info += {'local state directory': config_host['qemu_localstatedir']}
1041  summary_info += {'Manual directory':      config_host['mandir']}
1042else
1043  summary_info += {'local state directory': 'queried at runtime'}
1044endif
1045summary_info += {'Build directory':   meson.current_build_dir()}
1046summary_info += {'Source path':       meson.current_source_dir()}
1047summary_info += {'GIT binary':        config_host['GIT']}
1048summary_info += {'GIT submodules':    config_host['GIT_SUBMODULES']}
1049summary_info += {'C compiler':        meson.get_compiler('c').cmd_array()[0]}
1050summary_info += {'Host C compiler':   meson.get_compiler('c', native: true).cmd_array()[0]}
1051if link_language == 'cpp'
1052  summary_info += {'C++ compiler':      meson.get_compiler('cpp').cmd_array()[0]}
1053else
1054  summary_info += {'C++ compiler':      false}
1055endif
1056if targetos == 'darwin'
1057  summary_info += {'Objective-C compiler': meson.get_compiler('objc').cmd_array()[0]}
1058endif
1059summary_info += {'ARFLAGS':           config_host['ARFLAGS']}
1060summary_info += {'CFLAGS':            config_host['CFLAGS']}
1061summary_info += {'QEMU_CFLAGS':       config_host['QEMU_CFLAGS']}
1062summary_info += {'QEMU_LDFLAGS':      config_host['QEMU_LDFLAGS']}
1063summary_info += {'make':              config_host['MAKE']}
1064summary_info += {'install':           config_host['INSTALL']}
1065summary_info += {'python':            '@0@ (version: @1@)'.format(python.full_path(), python.language_version())}
1066summary_info += {'sphinx-build':      config_host['SPHINX_BUILD']}
1067summary_info += {'genisoimage':       config_host['GENISOIMAGE']}
1068# TODO: add back version
1069summary_info += {'slirp support':     config_host.has_key('CONFIG_SLIRP')}
1070if config_host.has_key('CONFIG_SLIRP')
1071  summary_info += {'smbd':            config_host['CONFIG_SMBD_COMMAND']}
1072endif
1073summary_info += {'module support':    config_host.has_key('CONFIG_MODULES')}
1074if config_host.has_key('CONFIG_MODULES')
1075  summary_info += {'alternative module path': config_host.has_key('CONFIG_MODULE_UPGRADES')}
1076endif
1077summary_info += {'host CPU':          cpu}
1078summary_info += {'host endianness':   build_machine.endian()}
1079summary_info += {'target list':       config_host['TARGET_DIRS']}
1080summary_info += {'gprof enabled':     config_host.has_key('CONFIG_GPROF')}
1081summary_info += {'sparse enabled':    meson.get_compiler('c').cmd_array().contains('cgcc')}
1082summary_info += {'strip binaries':    get_option('strip')}
1083summary_info += {'profiler':          config_host.has_key('CONFIG_PROFILER')}
1084summary_info += {'static build':      config_host.has_key('CONFIG_TOOLS')}
1085if targetos == 'darwin'
1086  summary_info += {'Cocoa support': config_host.has_key('CONFIG_COCOA')}
1087endif
1088# TODO: add back version
1089summary_info += {'SDL support':       config_host.has_key('CONFIG_SDL')}
1090summary_info += {'SDL image support': config_host.has_key('CONFIG_SDL_IMAGE')}
1091# TODO: add back version
1092summary_info += {'GTK support':       config_host.has_key('CONFIG_GTK')}
1093summary_info += {'GTK GL support':    config_host.has_key('CONFIG_GTK_GL')}
1094# TODO: add back version
1095summary_info += {'VTE support':       config_host.has_key('CONFIG_VTE')}
1096summary_info += {'TLS priority':      config_host['CONFIG_TLS_PRIORITY']}
1097summary_info += {'GNUTLS support':    config_host.has_key('CONFIG_GNUTLS')}
1098# TODO: add back version
1099summary_info += {'libgcrypt':         config_host.has_key('CONFIG_GCRYPT')}
1100if config_host.has_key('CONFIG_GCRYPT')
1101   summary_info += {'  hmac':            config_host.has_key('CONFIG_GCRYPT_HMAC')}
1102   summary_info += {'  XTS':             not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
1103endif
1104# TODO: add back version
1105summary_info += {'nettle':            config_host.has_key('CONFIG_NETTLE')}
1106if config_host.has_key('CONFIG_NETTLE')
1107   summary_info += {'  XTS':             not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
1108endif
1109summary_info += {'libtasn1':          config_host.has_key('CONFIG_TASN1')}
1110summary_info += {'PAM':               config_host.has_key('CONFIG_AUTH_PAM')}
1111summary_info += {'iconv support':     config_host.has_key('CONFIG_ICONV')}
1112summary_info += {'curses support':    config_host.has_key('CONFIG_CURSES')}
1113# TODO: add back version
1114summary_info += {'virgl support':     config_host.has_key('CONFIG_VIRGL')}
1115summary_info += {'curl support':      config_host.has_key('CONFIG_CURL')}
1116summary_info += {'mingw32 support':   targetos == 'windows'}
1117summary_info += {'Audio drivers':     config_host['CONFIG_AUDIO_DRIVERS']}
1118summary_info += {'Block whitelist (rw)': config_host['CONFIG_BDRV_RW_WHITELIST']}
1119summary_info += {'Block whitelist (ro)': config_host['CONFIG_BDRV_RO_WHITELIST']}
1120summary_info += {'VirtFS support':    config_host.has_key('CONFIG_VIRTFS')}
1121summary_info += {'Multipath support': config_host.has_key('CONFIG_MPATH')}
1122summary_info += {'VNC support':       config_host.has_key('CONFIG_VNC')}
1123if config_host.has_key('CONFIG_VNC')
1124  summary_info += {'VNC SASL support':  config_host.has_key('CONFIG_VNC_SASL')}
1125  summary_info += {'VNC JPEG support':  config_host.has_key('CONFIG_VNC_JPEG')}
1126  summary_info += {'VNC PNG support':   config_host.has_key('CONFIG_VNC_PNG')}
1127endif
1128summary_info += {'xen support':       config_host.has_key('CONFIG_XEN_BACKEND')}
1129if config_host.has_key('CONFIG_XEN_BACKEND')
1130  summary_info += {'xen ctrl version':  config_host['CONFIG_XEN_CTRL_INTERFACE_VERSION']}
1131endif
1132summary_info += {'brlapi support':    config_host.has_key('CONFIG_BRLAPI')}
1133summary_info += {'Documentation':     config_host.has_key('BUILD_DOCS')}
1134summary_info += {'PIE':               get_option('b_pie')}
1135summary_info += {'vde support':       config_host.has_key('CONFIG_VDE')}
1136summary_info += {'netmap support':    config_host.has_key('CONFIG_NETMAP')}
1137summary_info += {'Linux AIO support': config_host.has_key('CONFIG_LINUX_AIO')}
1138summary_info += {'Linux io_uring support': config_host.has_key('CONFIG_LINUX_IO_URING')}
1139summary_info += {'ATTR/XATTR support': config_host.has_key('CONFIG_ATTR')}
1140summary_info += {'Install blobs':     config_host.has_key('INSTALL_BLOBS')}
1141# TODO: add back KVM/HAX/HVF/WHPX/TCG
1142#summary_info += {'KVM support':       have_kvm'}
1143#summary_info += {'HAX support':       have_hax'}
1144#summary_info += {'HVF support':       have_hvf'}
1145#summary_info += {'WHPX support':      have_whpx'}
1146#summary_info += {'TCG support':       have_tcg'}
1147#if get_option('tcg')
1148#  summary_info += {'TCG debug enabled': config_host.has_key('CONFIG_DEBUG_TCG')}
1149#  summary_info += {'TCG interpreter':   config_host.has_key('CONFIG_TCG_INTERPRETER')}
1150#endif
1151summary_info += {'malloc trim support': config_host.has_key('CONFIG_MALLOC_TRIM')}
1152summary_info += {'RDMA support':      config_host.has_key('CONFIG_RDMA')}
1153summary_info += {'PVRDMA support':    config_host.has_key('CONFIG_PVRDMA')}
1154summary_info += {'fdt support':       config_host.has_key('CONFIG_FDT')}
1155summary_info += {'membarrier':        config_host.has_key('CONFIG_MEMBARRIER')}
1156summary_info += {'preadv support':    config_host.has_key('CONFIG_PREADV')}
1157summary_info += {'fdatasync':         config_host.has_key('CONFIG_FDATASYNC')}
1158summary_info += {'madvise':           config_host.has_key('CONFIG_MADVISE')}
1159summary_info += {'posix_madvise':     config_host.has_key('CONFIG_POSIX_MADVISE')}
1160summary_info += {'posix_memalign':    config_host.has_key('CONFIG_POSIX_MEMALIGN')}
1161summary_info += {'libcap-ng support': config_host.has_key('CONFIG_LIBCAP_NG')}
1162summary_info += {'vhost-net support': config_host.has_key('CONFIG_VHOST_NET')}
1163summary_info += {'vhost-crypto support': config_host.has_key('CONFIG_VHOST_CRYPTO')}
1164summary_info += {'vhost-scsi support': config_host.has_key('CONFIG_VHOST_SCSI')}
1165summary_info += {'vhost-vsock support': config_host.has_key('CONFIG_VHOST_VSOCK')}
1166summary_info += {'vhost-user support': config_host.has_key('CONFIG_VHOST_KERNEL')}
1167summary_info += {'vhost-user-fs support': config_host.has_key('CONFIG_VHOST_USER_FS')}
1168summary_info += {'vhost-vdpa support': config_host.has_key('CONFIG_VHOST_VDPA')}
1169summary_info += {'Trace backends':    config_host['TRACE_BACKENDS']}
1170if config_host['TRACE_BACKENDS'].split().contains('simple')
1171  summary_info += {'Trace output file': config_host['CONFIG_TRACE_FILE'] + '-<pid>'}
1172endif
1173# TODO: add back protocol and server version
1174summary_info += {'spice support':     config_host.has_key('CONFIG_SPICE')}
1175summary_info += {'rbd support':       config_host.has_key('CONFIG_RBD')}
1176summary_info += {'xfsctl support':    config_host.has_key('CONFIG_XFS')}
1177summary_info += {'smartcard support': config_host.has_key('CONFIG_SMARTCARD')}
1178summary_info += {'libusb':            config_host.has_key('CONFIG_USB_LIBUSB')}
1179summary_info += {'usb net redir':     config_host.has_key('CONFIG_USB_REDIR')}
1180summary_info += {'OpenGL support':    config_host.has_key('CONFIG_OPENGL')}
1181summary_info += {'OpenGL dmabufs':    config_host.has_key('CONFIG_OPENGL_DMABUF')}
1182summary_info += {'libiscsi support':  config_host.has_key('CONFIG_LIBISCSI')}
1183summary_info += {'libnfs support':    config_host.has_key('CONFIG_LIBNFS')}
1184summary_info += {'build guest agent': config_host.has_key('CONFIG_GUEST_AGENT')}
1185if targetos == 'windows'
1186  if 'WIN_SDK' in config_host
1187    summary_info += {'Windows SDK':       config_host['WIN_SDK']}
1188  endif
1189  summary_info += {'QGA VSS support':   config_host.has_key('CONFIG_QGA_VSS')}
1190  summary_info += {'QGA w32 disk info': config_host.has_key('CONFIG_QGA_NTDDSCSI')}
1191  summary_info += {'QGA MSI support':   config_host.has_key('CONFIG_QGA_MSI_ENABLED')}
1192endif
1193summary_info += {'seccomp support':   config_host.has_key('CONFIG_SECCOMP')}
1194summary_info += {'coroutine backend': config_host['CONFIG_COROUTINE_BACKEND']}
1195summary_info += {'coroutine pool':    config_host['CONFIG_COROUTINE_POOL'] == '1'}
1196summary_info += {'debug stack usage': config_host.has_key('CONFIG_DEBUG_STACK_USAGE')}
1197summary_info += {'mutex debugging':   config_host.has_key('CONFIG_DEBUG_MUTEX')}
1198summary_info += {'crypto afalg':      config_host.has_key('CONFIG_AF_ALG')}
1199summary_info += {'GlusterFS support': config_host.has_key('CONFIG_GLUSTERFS')}
1200summary_info += {'gcov':              get_option('b_coverage')}
1201summary_info += {'TPM support':       config_host.has_key('CONFIG_TPM')}
1202summary_info += {'libssh support':    config_host.has_key('CONFIG_LIBSSH')}
1203summary_info += {'QOM debugging':     config_host.has_key('CONFIG_QOM_CAST_DEBUG')}
1204summary_info += {'Live block migration': config_host.has_key('CONFIG_LIVE_BLOCK_MIGRATION')}
1205summary_info += {'lzo support':       config_host.has_key('CONFIG_LZO')}
1206summary_info += {'snappy support':    config_host.has_key('CONFIG_SNAPPY')}
1207summary_info += {'bzip2 support':     config_host.has_key('CONFIG_BZIP2')}
1208summary_info += {'lzfse support':     config_host.has_key('CONFIG_LZFSE')}
1209summary_info += {'zstd support':      config_host.has_key('CONFIG_ZSTD')}
1210summary_info += {'NUMA host support': config_host.has_key('CONFIG_NUMA')}
1211summary_info += {'libxml2':           config_host.has_key('CONFIG_LIBXML2')}
1212summary_info += {'tcmalloc support':  config_host.has_key('CONFIG_TCMALLOC')}
1213summary_info += {'jemalloc support':  config_host.has_key('CONFIG_JEMALLOC')}
1214summary_info += {'avx2 optimization': config_host.has_key('CONFIG_AVX2_OPT')}
1215summary_info += {'avx512f optimization': config_host.has_key('CONFIG_AVX512F_OPT')}
1216summary_info += {'replication support': config_host.has_key('CONFIG_REPLICATION')}
1217summary_info += {'bochs support':     config_host.has_key('CONFIG_BOCHS')}
1218summary_info += {'cloop support':     config_host.has_key('CONFIG_CLOOP')}
1219summary_info += {'dmg support':       config_host.has_key('CONFIG_DMG')}
1220summary_info += {'qcow v1 support':   config_host.has_key('CONFIG_QCOW1')}
1221summary_info += {'vdi support':       config_host.has_key('CONFIG_VDI')}
1222summary_info += {'vvfat support':     config_host.has_key('CONFIG_VVFAT')}
1223summary_info += {'qed support':       config_host.has_key('CONFIG_QED')}
1224summary_info += {'parallels support': config_host.has_key('CONFIG_PARALLELS')}
1225summary_info += {'sheepdog support':  config_host.has_key('CONFIG_SHEEPDOG')}
1226summary_info += {'capstone':          config_host.has_key('CONFIG_CAPSTONE')}
1227summary_info += {'libpmem support':   config_host.has_key('CONFIG_LIBPMEM')}
1228summary_info += {'libdaxctl support': config_host.has_key('CONFIG_LIBDAXCTL')}
1229summary_info += {'libudev':           config_host.has_key('CONFIG_LIBUDEV')}
1230summary_info += {'default devices':   config_host['CONFIG_MINIKCONF_MODE'] == '--defconfig'}
1231summary_info += {'plugin support':    config_host.has_key('CONFIG_PLUGIN')}
1232summary_info += {'fuzzing support':   config_host.has_key('CONFIG_FUZZ')}
1233if config_host.has_key('HAVE_GDB_BIN')
1234  summary_info += {'gdb':             config_host['HAVE_GDB_BIN']}
1235endif
1236summary_info += {'thread sanitizer':  config_host.has_key('CONFIG_TSAN')}
1237summary_info += {'rng-none':          config_host.has_key('CONFIG_RNG_NONE')}
1238summary_info += {'Linux keyring':     config_host.has_key('CONFIG_SECRET_KEYRING')}
1239summary(summary_info, bool_yn: true)
1240
1241if not supported_cpus.contains(cpu)
1242  message()
1243  warning('SUPPORT FOR THIS HOST CPU WILL GO AWAY IN FUTURE RELEASES!')
1244  message()
1245  message('CPU host architecture ' + cpu + ' support is not currently maintained.')
1246  message('The QEMU project intends to remove support for this host CPU in')
1247  message('a future release if nobody volunteers to maintain it and to')
1248  message('provide a build host for our continuous integration setup.')
1249  message('configure has succeeded and you can continue to build, but')
1250  message('if you care about QEMU on this platform you should contact')
1251  message('us upstream at qemu-devel@nongnu.org.')
1252endif
1253
1254if not supported_oses.contains(targetos)
1255  message()
1256  warning('WARNING: SUPPORT FOR THIS HOST OS WILL GO AWAY IN FUTURE RELEASES!')
1257  message()
1258  message('Host OS ' + targetos + 'support is not currently maintained.')
1259  message('The QEMU project intends to remove support for this host OS in')
1260  message('a future release if nobody volunteers to maintain it and to')
1261  message('provide a build host for our continuous integration setup.')
1262  message('configure has succeeded and you can continue to build, but')
1263  message('if you care about QEMU on this platform you should contact')
1264  message('us upstream at qemu-devel@nongnu.org.')
1265endif
1266