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