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