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