xref: /qemu/meson.build (revision abff1abf)
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
218sdl = not_found
219if 'CONFIG_SDL' in config_host
220  sdl = declare_dependency(compile_args: config_host['SDL_CFLAGS'].split(),
221                           link_args: config_host['SDL_LIBS'].split())
222endif
223rbd = not_found
224if 'CONFIG_RBD' in config_host
225  rbd = declare_dependency(link_args: config_host['RBD_LIBS'].split())
226endif
227glusterfs = not_found
228if 'CONFIG_GLUSTERFS' in config_host
229  glusterfs = declare_dependency(compile_args: config_host['GLUSTERFS_CFLAGS'].split(),
230                                 link_args: config_host['GLUSTERFS_LIBS'].split())
231endif
232libssh = not_found
233if 'CONFIG_LIBSSH' in config_host
234  libssh = declare_dependency(compile_args: config_host['LIBSSH_CFLAGS'].split(),
235                              link_args: config_host['LIBSSH_LIBS'].split())
236endif
237libbzip2 = not_found
238if 'CONFIG_BZIP2' in config_host
239  libbzip2 = declare_dependency(link_args: config_host['BZIP2_LIBS'].split())
240endif
241liblzfse = not_found
242if 'CONFIG_LZFSE' in config_host
243  liblzfse = declare_dependency(link_args: config_host['LZFSE_LIBS'].split())
244endif
245oss = not_found
246if 'CONFIG_AUDIO_OSS' in config_host
247  oss = declare_dependency(link_args: config_host['OSS_LIBS'].split())
248endif
249dsound = not_found
250if 'CONFIG_AUDIO_DSOUND' in config_host
251  dsound = declare_dependency(link_args: config_host['DSOUND_LIBS'].split())
252endif
253coreaudio = not_found
254if 'CONFIG_AUDIO_COREAUDIO' in config_host
255  coreaudio = declare_dependency(link_args: config_host['COREAUDIO_LIBS'].split())
256endif
257opengl = not_found
258if 'CONFIG_OPENGL' in config_host
259  opengl = declare_dependency(link_args: config_host['OPENGL_LIBS'].split())
260else
261endif
262gtk = not_found
263if 'CONFIG_GTK' in config_host
264  gtk = declare_dependency(compile_args: config_host['GTK_CFLAGS'].split(),
265                              link_args: config_host['GTK_LIBS'].split())
266endif
267vte = not_found
268if 'CONFIG_VTE' in config_host
269  vte = declare_dependency(compile_args: config_host['VTE_CFLAGS'].split(),
270                           link_args: config_host['VTE_LIBS'].split())
271endif
272x11 = not_found
273if 'CONFIG_X11' in config_host
274  x11 = declare_dependency(compile_args: config_host['X11_CFLAGS'].split(),
275                           link_args: config_host['X11_LIBS'].split())
276endif
277curses = not_found
278if 'CONFIG_CURSES' in config_host
279  curses = declare_dependency(compile_args: config_host['CURSES_CFLAGS'].split(),
280                              link_args: config_host['CURSES_LIBS'].split())
281endif
282iconv = not_found
283if 'CONFIG_ICONV' in config_host
284  iconv = declare_dependency(compile_args: config_host['ICONV_CFLAGS'].split(),
285                             link_args: config_host['ICONV_LIBS'].split())
286endif
287gio = not_found
288if 'CONFIG_GIO' in config_host
289  gio = declare_dependency(compile_args: config_host['GIO_CFLAGS'].split(),
290                           link_args: config_host['GIO_LIBS'].split())
291endif
292png = not_found
293if 'CONFIG_VNC_PNG' in config_host
294  png = declare_dependency(compile_args: config_host['PNG_CFLAGS'].split(),
295                           link_args: config_host['PNG_LIBS'].split())
296endif
297jpeg = not_found
298if 'CONFIG_VNC_JPEG' in config_host
299  jpeg = declare_dependency(compile_args: config_host['JPEG_CFLAGS'].split(),
300                            link_args: config_host['JPEG_LIBS'].split())
301endif
302sasl = not_found
303if 'CONFIG_VNC_SASL' in config_host
304  sasl = declare_dependency(compile_args: config_host['SASL_CFLAGS'].split(),
305                            link_args: config_host['SASL_LIBS'].split())
306endif
307fdt = not_found
308if 'CONFIG_FDT' in config_host
309  fdt = declare_dependency(compile_args: config_host['FDT_CFLAGS'].split(),
310                           link_args: config_host['FDT_LIBS'].split())
311endif
312snappy = not_found
313if 'CONFIG_SNAPPY' in config_host
314  snappy = declare_dependency(link_args: config_host['SNAPPY_LIBS'].split())
315endif
316lzo = not_found
317if 'CONFIG_LZO' in config_host
318  lzo = declare_dependency(link_args: config_host['LZO_LIBS'].split())
319endif
320rdma = not_found
321if 'CONFIG_RDMA' in config_host
322  rdma = declare_dependency(link_args: config_host['RDMA_LIBS'].split())
323endif
324numa = not_found
325if 'CONFIG_NUMA' in config_host
326  numa = declare_dependency(link_args: config_host['NUMA_LIBS'].split())
327endif
328xen = not_found
329if 'CONFIG_XEN_BACKEND' in config_host
330  xen = declare_dependency(compile_args: config_host['XEN_CFLAGS'].split(),
331                           link_args: config_host['XEN_LIBS'].split())
332endif
333cacard = not_found
334if 'CONFIG_SMARTCARD' in config_host
335  cacard = declare_dependency(compile_args: config_host['SMARTCARD_CFLAGS'].split(),
336                              link_args: config_host['SMARTCARD_LIBS'].split())
337endif
338usbredir = not_found
339if 'CONFIG_USB_REDIR' in config_host
340  usbredir = declare_dependency(compile_args: config_host['USB_REDIR_CFLAGS'].split(),
341                                link_args: config_host['USB_REDIR_LIBS'].split())
342endif
343libusb = not_found
344if 'CONFIG_USB_LIBUSB' in config_host
345  libusb = declare_dependency(compile_args: config_host['LIBUSB_CFLAGS'].split(),
346                              link_args: config_host['LIBUSB_LIBS'].split())
347endif
348
349create_config = find_program('scripts/create_config')
350minikconf = find_program('scripts/minikconf.py')
351target_dirs = config_host['TARGET_DIRS'].split()
352have_user = false
353have_system = false
354config_devices_mak_list = []
355config_devices_h = {}
356config_target_mak = {}
357kconfig_external_symbols = [
358  'CONFIG_KVM',
359  'CONFIG_XEN',
360  'CONFIG_TPM',
361  'CONFIG_SPICE',
362  'CONFIG_IVSHMEM',
363  'CONFIG_OPENGL',
364  'CONFIG_X11',
365  'CONFIG_VHOST_USER',
366  'CONFIG_VHOST_KERNEL',
367  'CONFIG_VIRTFS',
368  'CONFIG_LINUX',
369  'CONFIG_PVRDMA',
370]
371foreach target : target_dirs
372  have_user = have_user or target.endswith('-user')
373  config_target = keyval.load(meson.current_build_dir() / target / 'config-target.mak') + config_host
374
375  if target.endswith('-softmmu')
376    have_system = true
377
378    base_kconfig = []
379    foreach sym : kconfig_external_symbols
380      if sym in config_target
381        base_kconfig += '@0@=y'.format(sym)
382      endif
383    endforeach
384
385    config_devices_mak = target + '-config-devices.mak'
386    config_devices_mak = configure_file(
387      input: ['default-configs' / target + '.mak', 'Kconfig'],
388      output: config_devices_mak,
389      depfile: config_devices_mak + '.d',
390      capture: true,
391      command: [minikconf, config_host['CONFIG_MINIKCONF_MODE'],
392                config_devices_mak, '@DEPFILE@', '@INPUT@',
393                base_kconfig])
394    config_devices_h += {target: custom_target(
395      target + '-config-devices.h',
396      input: config_devices_mak,
397      output: target + '-config-devices.h',
398      capture: true,
399      command: [create_config, '@INPUT@'])}
400    config_devices_mak_list += config_devices_mak
401    config_target += keyval.load(config_devices_mak)
402  endif
403  config_target_mak += {target: config_target}
404endforeach
405have_tools = 'CONFIG_TOOLS' in config_host
406have_block = have_system or have_tools
407
408grepy = find_program('scripts/grepy.sh')
409# This configuration is used to build files that are shared by
410# multiple binaries, and then extracted out of the "common"
411# static_library target.
412#
413# We do not use all_sources()/all_dependencies(), because it would
414# build literally all source files, including devices only used by
415# targets that are not built for this compilation.  The CONFIG_ALL
416# pseudo symbol replaces it.
417
418if have_system
419  config_all_devices_mak = configure_file(
420    output: 'config-all-devices.mak',
421    input: config_devices_mak_list,
422    capture: true,
423    command: [grepy, '@INPUT@'],
424  )
425  config_all_devices = keyval.load(config_all_devices_mak)
426else
427  config_all_devices = {}
428endif
429config_all = config_all_devices
430config_all += config_host
431config_all += config_all_disas
432config_all += {
433  'CONFIG_XEN': config_host.has_key('CONFIG_XEN_BACKEND'),
434  'CONFIG_SOFTMMU': have_system,
435  'CONFIG_USER_ONLY': have_user,
436  'CONFIG_ALL': true,
437}
438
439# Generators
440
441genh = []
442hxtool = find_program('scripts/hxtool')
443shaderinclude = find_program('scripts/shaderinclude.pl')
444qapi_gen = find_program('scripts/qapi-gen.py')
445qapi_gen_depends = [ meson.source_root() / 'scripts/qapi/__init__.py',
446                     meson.source_root() / 'scripts/qapi/commands.py',
447                     meson.source_root() / 'scripts/qapi/common.py',
448                     meson.source_root() / 'scripts/qapi/doc.py',
449                     meson.source_root() / 'scripts/qapi/error.py',
450                     meson.source_root() / 'scripts/qapi/events.py',
451                     meson.source_root() / 'scripts/qapi/expr.py',
452                     meson.source_root() / 'scripts/qapi/gen.py',
453                     meson.source_root() / 'scripts/qapi/introspect.py',
454                     meson.source_root() / 'scripts/qapi/parser.py',
455                     meson.source_root() / 'scripts/qapi/schema.py',
456                     meson.source_root() / 'scripts/qapi/source.py',
457                     meson.source_root() / 'scripts/qapi/types.py',
458                     meson.source_root() / 'scripts/qapi/visit.py',
459                     meson.source_root() / 'scripts/qapi/common.py',
460                     meson.source_root() / 'scripts/qapi/doc.py',
461                     meson.source_root() / 'scripts/qapi-gen.py'
462]
463
464tracetool = [
465  python, files('scripts/tracetool.py'),
466   '--backend=' + config_host['TRACE_BACKENDS']
467]
468
469qemu_version_cmd = [find_program('scripts/qemu-version.sh'),
470                    meson.current_source_dir(),
471                    config_host['PKGVERSION'], config_host['VERSION']]
472qemu_version = custom_target('qemu-version.h',
473                             output: 'qemu-version.h',
474                             command: qemu_version_cmd,
475                             capture: true,
476                             build_by_default: true,
477                             build_always_stale: true)
478genh += qemu_version
479
480config_host_h = custom_target('config-host.h',
481                              input: meson.current_build_dir() / 'config-host.mak',
482                              output: 'config-host.h',
483                              capture: true,
484                              command: [create_config, '@INPUT@'])
485genh += config_host_h
486
487hxdep = []
488hx_headers = [
489  ['qemu-options.hx', 'qemu-options.def'],
490  ['qemu-img-cmds.hx', 'qemu-img-cmds.h'],
491]
492if have_system
493  hx_headers += [
494    ['hmp-commands.hx', 'hmp-commands.h'],
495    ['hmp-commands-info.hx', 'hmp-commands-info.h'],
496  ]
497endif
498foreach d : hx_headers
499  hxdep += custom_target(d[1],
500                input: files(d[0]),
501                output: d[1],
502                capture: true,
503                build_by_default: true, # to be removed when added to a target
504                command: [hxtool, '-h', '@INPUT0@'])
505endforeach
506genh += hxdep
507
508# Collect sourcesets.
509
510util_ss = ss.source_set()
511stub_ss = ss.source_set()
512trace_ss = ss.source_set()
513block_ss = ss.source_set()
514blockdev_ss = ss.source_set()
515qmp_ss = ss.source_set()
516common_ss = ss.source_set()
517softmmu_ss = ss.source_set()
518user_ss = ss.source_set()
519bsd_user_ss = ss.source_set()
520linux_user_ss = ss.source_set()
521specific_ss = ss.source_set()
522
523modules = {}
524hw_arch = {}
525target_arch = {}
526target_softmmu_arch = {}
527
528###############
529# Trace files #
530###############
531
532trace_events_subdirs = [
533  'accel/kvm',
534  'accel/tcg',
535  'crypto',
536  'monitor',
537]
538if have_user
539  trace_events_subdirs += [ 'linux-user' ]
540endif
541if have_block
542  trace_events_subdirs += [
543    'authz',
544    'block',
545    'io',
546    'nbd',
547    'scsi',
548  ]
549endif
550if have_system
551  trace_events_subdirs += [
552    'audio',
553    'backends',
554    'backends/tpm',
555    'chardev',
556    'hw/9pfs',
557    'hw/acpi',
558    'hw/alpha',
559    'hw/arm',
560    'hw/audio',
561    'hw/block',
562    'hw/block/dataplane',
563    'hw/char',
564    'hw/display',
565    'hw/dma',
566    'hw/hppa',
567    'hw/hyperv',
568    'hw/i2c',
569    'hw/i386',
570    'hw/i386/xen',
571    'hw/ide',
572    'hw/input',
573    'hw/intc',
574    'hw/isa',
575    'hw/mem',
576    'hw/mips',
577    'hw/misc',
578    'hw/misc/macio',
579    'hw/net',
580    'hw/nvram',
581    'hw/pci',
582    'hw/pci-host',
583    'hw/ppc',
584    'hw/rdma',
585    'hw/rdma/vmw',
586    'hw/rtc',
587    'hw/s390x',
588    'hw/scsi',
589    'hw/sd',
590    'hw/sparc',
591    'hw/sparc64',
592    'hw/ssi',
593    'hw/timer',
594    'hw/tpm',
595    'hw/usb',
596    'hw/vfio',
597    'hw/virtio',
598    'hw/watchdog',
599    'hw/xen',
600    'hw/gpio',
601    'hw/riscv',
602    'migration',
603    'net',
604    'ui',
605  ]
606endif
607trace_events_subdirs += [
608  'hw/core',
609  'qapi',
610  'qom',
611  'target/arm',
612  'target/hppa',
613  'target/i386',
614  'target/mips',
615  'target/ppc',
616  'target/riscv',
617  'target/s390x',
618  'target/sparc',
619  'util',
620]
621
622subdir('qapi')
623subdir('qobject')
624subdir('stubs')
625subdir('trace')
626subdir('util')
627subdir('qom')
628subdir('authz')
629subdir('crypto')
630subdir('ui')
631
632
633if enable_modules
634  libmodulecommon = static_library('module-common', files('module-common.c') + genh, pic: true, c_args: '-DBUILD_DSO')
635  modulecommon = declare_dependency(link_whole: libmodulecommon, compile_args: '-DBUILD_DSO')
636endif
637
638# Build targets from sourcesets
639
640stub_ss = stub_ss.apply(config_all, strict: false)
641
642util_ss.add_all(trace_ss)
643util_ss = util_ss.apply(config_all, strict: false)
644libqemuutil = static_library('qemuutil',
645                             sources: util_ss.sources() + stub_ss.sources() + genh,
646                             dependencies: [util_ss.dependencies(), m, glib, socket])
647qemuutil = declare_dependency(link_with: libqemuutil,
648                              sources: genh + version_res)
649
650decodetree = generator(find_program('scripts/decodetree.py'),
651                       output: 'decode-@BASENAME@.c.inc',
652                       arguments: ['@INPUT@', '@EXTRA_ARGS@', '-o', '@OUTPUT@'])
653
654subdir('audio')
655subdir('io')
656subdir('chardev')
657subdir('fsdev')
658subdir('libdecnumber')
659subdir('target')
660subdir('dump')
661
662block_ss.add(files(
663  'block.c',
664  'blockjob.c',
665  'job.c',
666  'qemu-io-cmds.c',
667))
668block_ss.add(when: 'CONFIG_REPLICATION', if_true: files('replication.c'))
669
670subdir('nbd')
671subdir('scsi')
672subdir('block')
673
674blockdev_ss.add(files(
675  'blockdev.c',
676  'blockdev-nbd.c',
677  'iothread.c',
678  'job-qmp.c',
679))
680
681# os-posix.c contains POSIX-specific functions used by qemu-storage-daemon,
682# os-win32.c does not
683blockdev_ss.add(when: 'CONFIG_POSIX', if_true: files('os-posix.c'))
684softmmu_ss.add(when: 'CONFIG_WIN32', if_true: [files('os-win32.c')])
685
686softmmu_ss.add_all(blockdev_ss)
687softmmu_ss.add(files(
688  'bootdevice.c',
689  'dma-helpers.c',
690  'qdev-monitor.c',
691), sdl)
692
693softmmu_ss.add(when: 'CONFIG_TPM', if_true: files('tpm.c'))
694softmmu_ss.add(when: 'CONFIG_SECCOMP', if_true: [files('qemu-seccomp.c'), seccomp])
695softmmu_ss.add(when: ['CONFIG_FDT', fdt],  if_true: [files('device_tree.c')])
696
697common_ss.add(files('cpus-common.c'))
698
699subdir('softmmu')
700subdir('backends')
701subdir('disas')
702subdir('migration')
703subdir('monitor')
704subdir('net')
705subdir('replay')
706subdir('hw')
707
708# needed for fuzzing binaries
709subdir('tests/qtest/libqos')
710
711block_mods = []
712softmmu_mods = []
713foreach d, list : modules
714  foreach m, module_ss : list
715    if enable_modules and targetos != 'windows'
716      module_ss = module_ss.apply(config_host, strict: false)
717      sl = static_library(d + '-' + m, [genh, module_ss.sources()],
718                          dependencies: [modulecommon, module_ss.dependencies()], pic: true)
719      if d == 'block'
720        block_mods += sl
721      else
722        softmmu_mods += sl
723      endif
724    else
725      if d == 'block'
726        block_ss.add_all(module_ss)
727      else
728        softmmu_ss.add_all(module_ss)
729      endif
730    endif
731  endforeach
732endforeach
733
734nm = find_program('nm')
735undefsym = find_program('scripts/undefsym.sh')
736block_syms = custom_target('block.syms', output: 'block.syms',
737                             input: [libqemuutil, block_mods],
738                             capture: true,
739                             command: [undefsym, nm, '@INPUT@'])
740qemu_syms = custom_target('qemu.syms', output: 'qemu.syms',
741                             input: [libqemuutil, softmmu_mods],
742                             capture: true,
743                             command: [undefsym, nm, '@INPUT@'])
744
745block_ss = block_ss.apply(config_host, strict: false)
746libblock = static_library('block', block_ss.sources() + genh,
747                          dependencies: block_ss.dependencies(),
748                          link_depends: block_syms,
749                          name_suffix: 'fa',
750                          build_by_default: false)
751
752block = declare_dependency(link_whole: [libblock],
753                           link_args: '@block.syms',
754                           dependencies: [crypto, io])
755
756qmp_ss = qmp_ss.apply(config_host, strict: false)
757libqmp = static_library('qmp', qmp_ss.sources() + genh,
758                        dependencies: qmp_ss.dependencies(),
759                        name_suffix: 'fa',
760                        build_by_default: false)
761
762qmp = declare_dependency(link_whole: [libqmp])
763
764foreach m : block_mods + softmmu_mods
765  shared_module(m.name(),
766                name_prefix: '',
767                link_whole: m,
768                install: true,
769                install_dir: config_host['qemu_moddir'])
770endforeach
771
772common_ss.add_all(when: 'CONFIG_SOFTMMU', if_true: softmmu_ss)
773common_ss.add_all(when: 'CONFIG_USER_ONLY', if_true: user_ss)
774
775common_all = common_ss.apply(config_all, strict: false)
776common_all = static_library('common',
777                            build_by_default: false,
778                            sources: common_all.sources() + genh,
779                            dependencies: common_all.dependencies(),
780                            name_suffix: 'fa')
781
782foreach target : target_dirs
783  config_target = config_target_mak[target]
784  target_name = config_target['TARGET_NAME']
785  arch = config_target['TARGET_BASE_ARCH']
786  arch_srcs = []
787
788  target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
789  if targetos == 'linux'
790    target_inc += include_directories('linux-headers', is_system: true)
791  endif
792  if target.endswith('-softmmu')
793    qemu_target_name = 'qemu-system-' + target_name
794    target_type='system'
795    t = target_softmmu_arch[arch].apply(config_target, strict: false)
796    arch_srcs += t.sources()
797
798    hw_dir = target_name == 'sparc64' ? 'sparc64' : arch
799    hw = hw_arch[hw_dir].apply(config_target, strict: false)
800    arch_srcs += hw.sources()
801
802    arch_srcs += config_devices_h[target]
803  else
804    target_type='user'
805    qemu_target_name = 'qemu-' + target_name
806    if 'CONFIG_LINUX_USER' in config_target
807      base_dir = 'linux-user'
808      target_inc += include_directories('linux-user/host/' / config_host['ARCH'])
809    else
810      base_dir = 'bsd-user'
811    endif
812    target_inc += include_directories(
813      base_dir,
814      base_dir / config_target['TARGET_ABI_DIR'],
815    )
816  endif
817
818  t = target_arch[arch].apply(config_target, strict: false)
819  arch_srcs += t.sources()
820
821  target_common = common_ss.apply(config_target, strict: false)
822  objects = common_all.extract_objects(target_common.sources())
823
824  # TODO: Change to generator once obj-y goes away
825  config_target_h = custom_target(target + '-config-target.h',
826                              input: meson.current_build_dir() / target / 'config-target.mak',
827                              output: target + '-config-target.h',
828                              capture: true,
829                              command: [create_config, '@INPUT@'])
830
831  target_specific = specific_ss.apply(config_target, strict: false)
832  arch_srcs += target_specific.sources()
833
834  static_library('qemu-' + target,
835                 sources: arch_srcs + [config_target_h] + genh,
836                 objects: objects,
837                 include_directories: target_inc,
838                 c_args: ['-DNEED_CPU_H',
839                          '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
840                          '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)],
841                 name_suffix: 'fa')
842endforeach
843
844# Other build targets
845
846if 'CONFIG_GUEST_AGENT' in config_host
847  subdir('qga')
848endif
849
850if have_tools
851  qemu_img = executable('qemu-img', [files('qemu-img.c'), hxdep],
852             dependencies: [authz, block, crypto, io, qom, qemuutil], install: true)
853  qemu_io = executable('qemu-io', files('qemu-io.c'),
854             dependencies: [block, qemuutil], install: true)
855  if targetos == 'linux' or targetos == 'sunos' or targetos.endswith('bsd')
856    qemu_nbd = executable('qemu-nbd', files('qemu-nbd.c'),
857               dependencies: [block, qemuutil], install: true)
858  endif
859
860  subdir('storage-daemon')
861  subdir('contrib/rdmacm-mux')
862  subdir('contrib/elf2dmp')
863
864  if 'CONFIG_XKBCOMMON' in config_host
865    executable('qemu-keymap', files('qemu-keymap.c', 'ui/input-keymap.c'),
866               dependencies: [qemuutil, xkbcommon], install: true)
867  endif
868
869  executable('qemu-edid', files('qemu-edid.c', 'hw/display/edid-generate.c'),
870             dependencies: qemuutil,
871             install: true)
872
873  if 'CONFIG_VHOST_USER' in config_host
874    subdir('contrib/libvhost-user')
875    subdir('contrib/vhost-user-blk')
876    if 'CONFIG_LINUX' in config_host
877      subdir('contrib/vhost-user-gpu')
878    endif
879    subdir('contrib/vhost-user-input')
880    subdir('contrib/vhost-user-scsi')
881  endif
882
883  if targetos == 'linux'
884    executable('qemu-bridge-helper', files('qemu-bridge-helper.c'),
885               dependencies: [qemuutil, libcap_ng],
886               install: true,
887               install_dir: get_option('libexecdir'))
888
889    executable('qemu-pr-helper', files('scsi/qemu-pr-helper.c', 'scsi/utils.c'),
890               dependencies: [authz, crypto, io, qom, qemuutil,
891                              libcap_ng, libudev, libmpathpersist],
892               install: true)
893  endif
894
895  if 'CONFIG_IVSHMEM' in config_host
896    subdir('contrib/ivshmem-client')
897    subdir('contrib/ivshmem-server')
898  endif
899endif
900
901subdir('tools')
902subdir('pc-bios')
903subdir('tests')
904
905summary_info = {}
906summary_info += {'Install prefix':    config_host['prefix']}
907summary_info += {'BIOS directory':    config_host['qemu_datadir']}
908summary_info += {'firmware path':     config_host['qemu_firmwarepath']}
909summary_info += {'binary directory':  config_host['bindir']}
910summary_info += {'library directory': config_host['libdir']}
911summary_info += {'module directory':  config_host['qemu_moddir']}
912summary_info += {'libexec directory': config_host['libexecdir']}
913summary_info += {'include directory': config_host['includedir']}
914summary_info += {'config directory':  config_host['sysconfdir']}
915if targetos != 'windows'
916  summary_info += {'local state directory': config_host['qemu_localstatedir']}
917  summary_info += {'Manual directory':      config_host['mandir']}
918else
919  summary_info += {'local state directory': 'queried at runtime'}
920endif
921summary_info += {'Build directory':   meson.current_build_dir()}
922summary_info += {'Source path':       meson.current_source_dir()}
923summary_info += {'GIT binary':        config_host['GIT']}
924summary_info += {'GIT submodules':    config_host['GIT_SUBMODULES']}
925summary_info += {'C compiler':        meson.get_compiler('c').cmd_array()[0]}
926summary_info += {'Host C compiler':   meson.get_compiler('c', native: true).cmd_array()[0]}
927if link_language == 'cpp'
928  summary_info += {'C++ compiler':      meson.get_compiler('cpp').cmd_array()[0]}
929else
930  summary_info += {'C++ compiler':      false}
931endif
932if targetos == 'darwin'
933  summary_info += {'Objective-C compiler': meson.get_compiler('objc').cmd_array()[0]}
934endif
935summary_info += {'ARFLAGS':           config_host['ARFLAGS']}
936summary_info += {'CFLAGS':            config_host['CFLAGS']}
937summary_info += {'QEMU_CFLAGS':       config_host['QEMU_CFLAGS']}
938summary_info += {'QEMU_LDFLAGS':      config_host['QEMU_LDFLAGS']}
939summary_info += {'make':              config_host['MAKE']}
940summary_info += {'install':           config_host['INSTALL']}
941summary_info += {'python':            '@0@ (version: @1@)'.format(python.full_path(), python.language_version())}
942summary_info += {'sphinx-build':      config_host['SPHINX_BUILD']}
943summary_info += {'genisoimage':       config_host['GENISOIMAGE']}
944# TODO: add back version
945summary_info += {'slirp support':     config_host.has_key('CONFIG_SLIRP')}
946if config_host.has_key('CONFIG_SLIRP')
947  summary_info += {'smbd':            config_host['CONFIG_SMBD_COMMAND']}
948endif
949summary_info += {'module support':    config_host.has_key('CONFIG_MODULES')}
950if config_host.has_key('CONFIG_MODULES')
951  summary_info += {'alternative module path': config_host.has_key('CONFIG_MODULE_UPGRADES')}
952endif
953summary_info += {'host CPU':          cpu}
954summary_info += {'host endianness':   build_machine.endian()}
955summary_info += {'target list':       config_host['TARGET_DIRS']}
956summary_info += {'gprof enabled':     config_host.has_key('CONFIG_GPROF')}
957summary_info += {'sparse enabled':    meson.get_compiler('c').cmd_array().contains('cgcc')}
958summary_info += {'strip binaries':    get_option('strip')}
959summary_info += {'profiler':          config_host.has_key('CONFIG_PROFILER')}
960summary_info += {'static build':      config_host.has_key('CONFIG_TOOLS')}
961if targetos == 'darwin'
962  summary_info += {'Cocoa support': config_host.has_key('CONFIG_COCOA')}
963endif
964# TODO: add back version
965summary_info += {'SDL support':       config_host.has_key('CONFIG_SDL')}
966summary_info += {'SDL image support': config_host.has_key('CONFIG_SDL_IMAGE')}
967# TODO: add back version
968summary_info += {'GTK support':       config_host.has_key('CONFIG_GTK')}
969summary_info += {'GTK GL support':    config_host.has_key('CONFIG_GTK_GL')}
970# TODO: add back version
971summary_info += {'VTE support':       config_host.has_key('CONFIG_VTE')}
972summary_info += {'TLS priority':      config_host['CONFIG_TLS_PRIORITY']}
973summary_info += {'GNUTLS support':    config_host.has_key('CONFIG_GNUTLS')}
974# TODO: add back version
975summary_info += {'libgcrypt':         config_host.has_key('CONFIG_GCRYPT')}
976if config_host.has_key('CONFIG_GCRYPT')
977   summary_info += {'  hmac':            config_host.has_key('CONFIG_GCRYPT_HMAC')}
978   summary_info += {'  XTS':             not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
979endif
980# TODO: add back version
981summary_info += {'nettle':            config_host.has_key('CONFIG_NETTLE')}
982if config_host.has_key('CONFIG_NETTLE')
983   summary_info += {'  XTS':             not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
984endif
985summary_info += {'libtasn1':          config_host.has_key('CONFIG_TASN1')}
986summary_info += {'PAM':               config_host.has_key('CONFIG_AUTH_PAM')}
987summary_info += {'iconv support':     config_host.has_key('CONFIG_ICONV')}
988summary_info += {'curses support':    config_host.has_key('CONFIG_CURSES')}
989# TODO: add back version
990summary_info += {'virgl support':     config_host.has_key('CONFIG_VIRGL')}
991summary_info += {'curl support':      config_host.has_key('CONFIG_CURL')}
992summary_info += {'mingw32 support':   targetos == 'windows'}
993summary_info += {'Audio drivers':     config_host['CONFIG_AUDIO_DRIVERS']}
994summary_info += {'Block whitelist (rw)': config_host['CONFIG_BDRV_RW_WHITELIST']}
995summary_info += {'Block whitelist (ro)': config_host['CONFIG_BDRV_RO_WHITELIST']}
996summary_info += {'VirtFS support':    config_host.has_key('CONFIG_VIRTFS')}
997summary_info += {'Multipath support': config_host.has_key('CONFIG_MPATH')}
998summary_info += {'VNC support':       config_host.has_key('CONFIG_VNC')}
999if config_host.has_key('CONFIG_VNC')
1000  summary_info += {'VNC SASL support':  config_host.has_key('CONFIG_VNC_SASL')}
1001  summary_info += {'VNC JPEG support':  config_host.has_key('CONFIG_VNC_JPEG')}
1002  summary_info += {'VNC PNG support':   config_host.has_key('CONFIG_VNC_PNG')}
1003endif
1004summary_info += {'xen support':       config_host.has_key('CONFIG_XEN_BACKEND')}
1005if config_host.has_key('CONFIG_XEN_BACKEND')
1006  summary_info += {'xen ctrl version':  config_host['CONFIG_XEN_CTRL_INTERFACE_VERSION']}
1007endif
1008summary_info += {'brlapi support':    config_host.has_key('CONFIG_BRLAPI')}
1009summary_info += {'Documentation':     config_host.has_key('BUILD_DOCS')}
1010summary_info += {'PIE':               get_option('b_pie')}
1011summary_info += {'vde support':       config_host.has_key('CONFIG_VDE')}
1012summary_info += {'netmap support':    config_host.has_key('CONFIG_NETMAP')}
1013summary_info += {'Linux AIO support': config_host.has_key('CONFIG_LINUX_AIO')}
1014summary_info += {'Linux io_uring support': config_host.has_key('CONFIG_LINUX_IO_URING')}
1015summary_info += {'ATTR/XATTR support': config_host.has_key('CONFIG_ATTR')}
1016summary_info += {'Install blobs':     config_host.has_key('INSTALL_BLOBS')}
1017# TODO: add back KVM/HAX/HVF/WHPX/TCG
1018#summary_info += {'KVM support':       have_kvm'}
1019#summary_info += {'HAX support':       have_hax'}
1020#summary_info += {'HVF support':       have_hvf'}
1021#summary_info += {'WHPX support':      have_whpx'}
1022#summary_info += {'TCG support':       have_tcg'}
1023#if get_option('tcg')
1024#  summary_info += {'TCG debug enabled': config_host.has_key('CONFIG_DEBUG_TCG')}
1025#  summary_info += {'TCG interpreter':   config_host.has_key('CONFIG_TCG_INTERPRETER')}
1026#endif
1027summary_info += {'malloc trim support': config_host.has_key('CONFIG_MALLOC_TRIM')}
1028summary_info += {'RDMA support':      config_host.has_key('CONFIG_RDMA')}
1029summary_info += {'PVRDMA support':    config_host.has_key('CONFIG_PVRDMA')}
1030summary_info += {'fdt support':       config_host.has_key('CONFIG_FDT')}
1031summary_info += {'membarrier':        config_host.has_key('CONFIG_MEMBARRIER')}
1032summary_info += {'preadv support':    config_host.has_key('CONFIG_PREADV')}
1033summary_info += {'fdatasync':         config_host.has_key('CONFIG_FDATASYNC')}
1034summary_info += {'madvise':           config_host.has_key('CONFIG_MADVISE')}
1035summary_info += {'posix_madvise':     config_host.has_key('CONFIG_POSIX_MADVISE')}
1036summary_info += {'posix_memalign':    config_host.has_key('CONFIG_POSIX_MEMALIGN')}
1037summary_info += {'libcap-ng support': config_host.has_key('CONFIG_LIBCAP_NG')}
1038summary_info += {'vhost-net support': config_host.has_key('CONFIG_VHOST_NET')}
1039summary_info += {'vhost-crypto support': config_host.has_key('CONFIG_VHOST_CRYPTO')}
1040summary_info += {'vhost-scsi support': config_host.has_key('CONFIG_VHOST_SCSI')}
1041summary_info += {'vhost-vsock support': config_host.has_key('CONFIG_VHOST_VSOCK')}
1042summary_info += {'vhost-user support': config_host.has_key('CONFIG_VHOST_KERNEL')}
1043summary_info += {'vhost-user-fs support': config_host.has_key('CONFIG_VHOST_USER_FS')}
1044summary_info += {'vhost-vdpa support': config_host.has_key('CONFIG_VHOST_VDPA')}
1045summary_info += {'Trace backends':    config_host['TRACE_BACKENDS']}
1046if config_host['TRACE_BACKENDS'].split().contains('simple')
1047  summary_info += {'Trace output file': config_host['CONFIG_TRACE_FILE'] + '-<pid>'}
1048endif
1049# TODO: add back protocol and server version
1050summary_info += {'spice support':     config_host.has_key('CONFIG_SPICE')}
1051summary_info += {'rbd support':       config_host.has_key('CONFIG_RBD')}
1052summary_info += {'xfsctl support':    config_host.has_key('CONFIG_XFS')}
1053summary_info += {'smartcard support': config_host.has_key('CONFIG_SMARTCARD')}
1054summary_info += {'libusb':            config_host.has_key('CONFIG_USB_LIBUSB')}
1055summary_info += {'usb net redir':     config_host.has_key('CONFIG_USB_REDIR')}
1056summary_info += {'OpenGL support':    config_host.has_key('CONFIG_OPENGL')}
1057summary_info += {'OpenGL dmabufs':    config_host.has_key('CONFIG_OPENGL_DMABUF')}
1058summary_info += {'libiscsi support':  config_host.has_key('CONFIG_LIBISCSI')}
1059summary_info += {'libnfs support':    config_host.has_key('CONFIG_LIBNFS')}
1060summary_info += {'build guest agent': config_host.has_key('CONFIG_GUEST_AGENT')}
1061if targetos == 'windows'
1062  if 'WIN_SDK' in config_host
1063    summary_info += {'Windows SDK':       config_host['WIN_SDK']}
1064  endif
1065  summary_info += {'QGA VSS support':   config_host.has_key('CONFIG_QGA_VSS')}
1066  summary_info += {'QGA w32 disk info': config_host.has_key('CONFIG_QGA_NTDDSCSI')}
1067  summary_info += {'QGA MSI support':   config_host.has_key('CONFIG_QGA_MSI_ENABLED')}
1068endif
1069summary_info += {'seccomp support':   config_host.has_key('CONFIG_SECCOMP')}
1070summary_info += {'coroutine backend': config_host['CONFIG_COROUTINE_BACKEND']}
1071summary_info += {'coroutine pool':    config_host['CONFIG_COROUTINE_POOL'] == '1'}
1072summary_info += {'debug stack usage': config_host.has_key('CONFIG_DEBUG_STACK_USAGE')}
1073summary_info += {'mutex debugging':   config_host.has_key('CONFIG_DEBUG_MUTEX')}
1074summary_info += {'crypto afalg':      config_host.has_key('CONFIG_AF_ALG')}
1075summary_info += {'GlusterFS support': config_host.has_key('CONFIG_GLUSTERFS')}
1076summary_info += {'gcov':              get_option('b_coverage')}
1077summary_info += {'TPM support':       config_host.has_key('CONFIG_TPM')}
1078summary_info += {'libssh support':    config_host.has_key('CONFIG_LIBSSH')}
1079summary_info += {'QOM debugging':     config_host.has_key('CONFIG_QOM_CAST_DEBUG')}
1080summary_info += {'Live block migration': config_host.has_key('CONFIG_LIVE_BLOCK_MIGRATION')}
1081summary_info += {'lzo support':       config_host.has_key('CONFIG_LZO')}
1082summary_info += {'snappy support':    config_host.has_key('CONFIG_SNAPPY')}
1083summary_info += {'bzip2 support':     config_host.has_key('CONFIG_BZIP2')}
1084summary_info += {'lzfse support':     config_host.has_key('CONFIG_LZFSE')}
1085summary_info += {'zstd support':      config_host.has_key('CONFIG_ZSTD')}
1086summary_info += {'NUMA host support': config_host.has_key('CONFIG_NUMA')}
1087summary_info += {'libxml2':           config_host.has_key('CONFIG_LIBXML2')}
1088summary_info += {'tcmalloc support':  config_host.has_key('CONFIG_TCMALLOC')}
1089summary_info += {'jemalloc support':  config_host.has_key('CONFIG_JEMALLOC')}
1090summary_info += {'avx2 optimization': config_host.has_key('CONFIG_AVX2_OPT')}
1091summary_info += {'avx512f optimization': config_host.has_key('CONFIG_AVX512F_OPT')}
1092summary_info += {'replication support': config_host.has_key('CONFIG_REPLICATION')}
1093summary_info += {'bochs support':     config_host.has_key('CONFIG_BOCHS')}
1094summary_info += {'cloop support':     config_host.has_key('CONFIG_CLOOP')}
1095summary_info += {'dmg support':       config_host.has_key('CONFIG_DMG')}
1096summary_info += {'qcow v1 support':   config_host.has_key('CONFIG_QCOW1')}
1097summary_info += {'vdi support':       config_host.has_key('CONFIG_VDI')}
1098summary_info += {'vvfat support':     config_host.has_key('CONFIG_VVFAT')}
1099summary_info += {'qed support':       config_host.has_key('CONFIG_QED')}
1100summary_info += {'parallels support': config_host.has_key('CONFIG_PARALLELS')}
1101summary_info += {'sheepdog support':  config_host.has_key('CONFIG_SHEEPDOG')}
1102summary_info += {'capstone':          config_host.has_key('CONFIG_CAPSTONE')}
1103summary_info += {'libpmem support':   config_host.has_key('CONFIG_LIBPMEM')}
1104summary_info += {'libdaxctl support': config_host.has_key('CONFIG_LIBDAXCTL')}
1105summary_info += {'libudev':           config_host.has_key('CONFIG_LIBUDEV')}
1106summary_info += {'default devices':   config_host['CONFIG_MINIKCONF_MODE'] == '--defconfig'}
1107summary_info += {'plugin support':    config_host.has_key('CONFIG_PLUGIN')}
1108summary_info += {'fuzzing support':   config_host.has_key('CONFIG_FUZZ')}
1109if config_host.has_key('HAVE_GDB_BIN')
1110  summary_info += {'gdb':             config_host['HAVE_GDB_BIN']}
1111endif
1112summary_info += {'thread sanitizer':  config_host.has_key('CONFIG_TSAN')}
1113summary_info += {'rng-none':          config_host.has_key('CONFIG_RNG_NONE')}
1114summary_info += {'Linux keyring':     config_host.has_key('CONFIG_SECRET_KEYRING')}
1115summary(summary_info, bool_yn: true)
1116
1117if not supported_cpus.contains(cpu)
1118  message()
1119  warning('SUPPORT FOR THIS HOST CPU WILL GO AWAY IN FUTURE RELEASES!')
1120  message()
1121  message('CPU host architecture ' + cpu + ' support is not currently maintained.')
1122  message('The QEMU project intends to remove support for this host CPU in')
1123  message('a future release if nobody volunteers to maintain it and to')
1124  message('provide a build host for our continuous integration setup.')
1125  message('configure has succeeded and you can continue to build, but')
1126  message('if you care about QEMU on this platform you should contact')
1127  message('us upstream at qemu-devel@nongnu.org.')
1128endif
1129
1130if not supported_oses.contains(targetos)
1131  message()
1132  warning('WARNING: SUPPORT FOR THIS HOST OS WILL GO AWAY IN FUTURE RELEASES!')
1133  message()
1134  message('Host OS ' + targetos + 'support is not currently maintained.')
1135  message('The QEMU project intends to remove support for this host OS in')
1136  message('a future release if nobody volunteers to maintain it and to')
1137  message('provide a build host for our continuous integration setup.')
1138  message('configure has succeeded and you can continue to build, but')
1139  message('if you care about QEMU on this platform you should contact')
1140  message('us upstream at qemu-devel@nongnu.org.')
1141endif
1142