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