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