]> git.proxmox.com Git - mirror_qemu.git/blob - meson.build
meson: convert disas directory to Meson
[mirror_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('disas')
677 subdir('migration')
678 subdir('monitor')
679 subdir('net')
680 subdir('replay')
681
682 # needed for fuzzing binaries
683 subdir('tests/qtest/libqos')
684
685 block_mods = []
686 softmmu_mods = []
687 foreach d, list : modules
688 foreach m, module_ss : list
689 if enable_modules and targetos != 'windows'
690 module_ss = module_ss.apply(config_host, strict: false)
691 sl = static_library(d + '-' + m, [genh, module_ss.sources()],
692 dependencies: [modulecommon, module_ss.dependencies()], pic: true)
693 if d == 'block'
694 block_mods += sl
695 else
696 softmmu_mods += sl
697 endif
698 else
699 if d == 'block'
700 block_ss.add_all(module_ss)
701 else
702 softmmu_ss.add_all(module_ss)
703 endif
704 endif
705 endforeach
706 endforeach
707
708 nm = find_program('nm')
709 undefsym = find_program('scripts/undefsym.sh')
710 block_syms = custom_target('block.syms', output: 'block.syms',
711 input: [libqemuutil, block_mods],
712 capture: true,
713 command: [undefsym, nm, '@INPUT@'])
714 qemu_syms = custom_target('qemu.syms', output: 'qemu.syms',
715 input: [libqemuutil, softmmu_mods],
716 capture: true,
717 command: [undefsym, nm, '@INPUT@'])
718
719 block_ss = block_ss.apply(config_host, strict: false)
720 libblock = static_library('block', block_ss.sources() + genh,
721 dependencies: block_ss.dependencies(),
722 link_depends: block_syms,
723 name_suffix: 'fa',
724 build_by_default: false)
725
726 block = declare_dependency(link_whole: [libblock],
727 link_args: '@block.syms',
728 dependencies: [crypto, io])
729
730 qmp_ss = qmp_ss.apply(config_host, strict: false)
731 libqmp = static_library('qmp', qmp_ss.sources() + genh,
732 dependencies: qmp_ss.dependencies(),
733 name_suffix: 'fa',
734 build_by_default: false)
735
736 qmp = declare_dependency(link_whole: [libqmp])
737
738 foreach m : block_mods + softmmu_mods
739 shared_module(m.name(),
740 name_prefix: '',
741 link_whole: m,
742 install: true,
743 install_dir: config_host['qemu_moddir'])
744 endforeach
745
746 common_ss.add_all(when: 'CONFIG_SOFTMMU', if_true: softmmu_ss)
747 common_ss.add_all(when: 'CONFIG_USER_ONLY', if_true: user_ss)
748
749 common_all = common_ss.apply(config_all, strict: false)
750 common_all = static_library('common',
751 build_by_default: false,
752 sources: common_all.sources() + genh,
753 dependencies: common_all.dependencies(),
754 name_suffix: 'fa')
755
756 foreach target : target_dirs
757 config_target = config_target_mak[target]
758 target_name = config_target['TARGET_NAME']
759 arch = config_target['TARGET_BASE_ARCH']
760 arch_srcs = []
761
762 target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
763 if targetos == 'linux'
764 target_inc += include_directories('linux-headers', is_system: true)
765 endif
766 if target.endswith('-softmmu')
767 qemu_target_name = 'qemu-system-' + target_name
768 target_type='system'
769 arch_srcs += config_devices_h[target]
770 else
771 target_type='user'
772 qemu_target_name = 'qemu-' + target_name
773 if 'CONFIG_LINUX_USER' in config_target
774 base_dir = 'linux-user'
775 target_inc += include_directories('linux-user/host/' / config_host['ARCH'])
776 else
777 base_dir = 'bsd-user'
778 endif
779 target_inc += include_directories(
780 base_dir,
781 base_dir / config_target['TARGET_ABI_DIR'],
782 )
783 endif
784
785 target_common = common_ss.apply(config_target, strict: false)
786 objects = common_all.extract_objects(target_common.sources())
787
788 # TODO: Change to generator once obj-y goes away
789 config_target_h = custom_target(target + '-config-target.h',
790 input: meson.current_build_dir() / target / 'config-target.mak',
791 output: target + '-config-target.h',
792 capture: true,
793 command: [create_config, '@INPUT@'])
794
795 target_specific = specific_ss.apply(config_target, strict: false)
796 arch_srcs += target_specific.sources()
797
798 static_library('qemu-' + target,
799 sources: arch_srcs + [config_target_h] + genh,
800 objects: objects,
801 include_directories: target_inc,
802 c_args: ['-DNEED_CPU_H',
803 '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
804 '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)],
805 name_suffix: 'fa')
806 endforeach
807
808 # Other build targets
809
810 if 'CONFIG_GUEST_AGENT' in config_host
811 subdir('qga')
812 endif
813
814 if have_tools
815 qemu_img = executable('qemu-img', [files('qemu-img.c'), hxdep],
816 dependencies: [authz, block, crypto, io, qom, qemuutil], install: true)
817 qemu_io = executable('qemu-io', files('qemu-io.c'),
818 dependencies: [block, qemuutil], install: true)
819 if targetos == 'linux' or targetos == 'sunos' or targetos.endswith('bsd')
820 qemu_nbd = executable('qemu-nbd', files('qemu-nbd.c'),
821 dependencies: [block, qemuutil], install: true)
822 endif
823
824 subdir('storage-daemon')
825 subdir('contrib/rdmacm-mux')
826 subdir('contrib/elf2dmp')
827
828 if 'CONFIG_XKBCOMMON' in config_host
829 executable('qemu-keymap', files('qemu-keymap.c', 'ui/input-keymap.c'),
830 dependencies: [qemuutil, xkbcommon], install: true)
831 endif
832
833 executable('qemu-edid', files('qemu-edid.c', 'hw/display/edid-generate.c'),
834 dependencies: qemuutil,
835 install: true)
836
837 if 'CONFIG_VHOST_USER' in config_host
838 subdir('contrib/libvhost-user')
839 subdir('contrib/vhost-user-blk')
840 if 'CONFIG_LINUX' in config_host
841 subdir('contrib/vhost-user-gpu')
842 endif
843 subdir('contrib/vhost-user-input')
844 subdir('contrib/vhost-user-scsi')
845 endif
846
847 if targetos == 'linux'
848 executable('qemu-bridge-helper', files('qemu-bridge-helper.c'),
849 dependencies: [qemuutil, libcap_ng],
850 install: true,
851 install_dir: get_option('libexecdir'))
852
853 executable('qemu-pr-helper', files('scsi/qemu-pr-helper.c', 'scsi/utils.c'),
854 dependencies: [authz, crypto, io, qom, qemuutil,
855 libcap_ng, libudev, libmpathpersist],
856 install: true)
857 endif
858
859 if 'CONFIG_IVSHMEM' in config_host
860 subdir('contrib/ivshmem-client')
861 subdir('contrib/ivshmem-server')
862 endif
863 endif
864
865 subdir('tools')
866 subdir('pc-bios')
867 subdir('tests')
868
869 summary_info = {}
870 summary_info += {'Install prefix': config_host['prefix']}
871 summary_info += {'BIOS directory': config_host['qemu_datadir']}
872 summary_info += {'firmware path': config_host['qemu_firmwarepath']}
873 summary_info += {'binary directory': config_host['bindir']}
874 summary_info += {'library directory': config_host['libdir']}
875 summary_info += {'module directory': config_host['qemu_moddir']}
876 summary_info += {'libexec directory': config_host['libexecdir']}
877 summary_info += {'include directory': config_host['includedir']}
878 summary_info += {'config directory': config_host['sysconfdir']}
879 if targetos != 'windows'
880 summary_info += {'local state directory': config_host['qemu_localstatedir']}
881 summary_info += {'Manual directory': config_host['mandir']}
882 else
883 summary_info += {'local state directory': 'queried at runtime'}
884 endif
885 summary_info += {'Build directory': meson.current_build_dir()}
886 summary_info += {'Source path': meson.current_source_dir()}
887 summary_info += {'GIT binary': config_host['GIT']}
888 summary_info += {'GIT submodules': config_host['GIT_SUBMODULES']}
889 summary_info += {'C compiler': meson.get_compiler('c').cmd_array()[0]}
890 summary_info += {'Host C compiler': meson.get_compiler('c', native: true).cmd_array()[0]}
891 if link_language == 'cpp'
892 summary_info += {'C++ compiler': meson.get_compiler('cpp').cmd_array()[0]}
893 else
894 summary_info += {'C++ compiler': false}
895 endif
896 if targetos == 'darwin'
897 summary_info += {'Objective-C compiler': meson.get_compiler('objc').cmd_array()[0]}
898 endif
899 summary_info += {'ARFLAGS': config_host['ARFLAGS']}
900 summary_info += {'CFLAGS': config_host['CFLAGS']}
901 summary_info += {'QEMU_CFLAGS': config_host['QEMU_CFLAGS']}
902 summary_info += {'QEMU_LDFLAGS': config_host['QEMU_LDFLAGS']}
903 summary_info += {'make': config_host['MAKE']}
904 summary_info += {'install': config_host['INSTALL']}
905 summary_info += {'python': '@0@ (version: @1@)'.format(python.full_path(), python.language_version())}
906 summary_info += {'sphinx-build': config_host['SPHINX_BUILD']}
907 summary_info += {'genisoimage': config_host['GENISOIMAGE']}
908 # TODO: add back version
909 summary_info += {'slirp support': config_host.has_key('CONFIG_SLIRP')}
910 if config_host.has_key('CONFIG_SLIRP')
911 summary_info += {'smbd': config_host['CONFIG_SMBD_COMMAND']}
912 endif
913 summary_info += {'module support': config_host.has_key('CONFIG_MODULES')}
914 if config_host.has_key('CONFIG_MODULES')
915 summary_info += {'alternative module path': config_host.has_key('CONFIG_MODULE_UPGRADES')}
916 endif
917 summary_info += {'host CPU': cpu}
918 summary_info += {'host endianness': build_machine.endian()}
919 summary_info += {'target list': config_host['TARGET_DIRS']}
920 summary_info += {'gprof enabled': config_host.has_key('CONFIG_GPROF')}
921 summary_info += {'sparse enabled': meson.get_compiler('c').cmd_array().contains('cgcc')}
922 summary_info += {'strip binaries': get_option('strip')}
923 summary_info += {'profiler': config_host.has_key('CONFIG_PROFILER')}
924 summary_info += {'static build': config_host.has_key('CONFIG_TOOLS')}
925 if targetos == 'darwin'
926 summary_info += {'Cocoa support': config_host.has_key('CONFIG_COCOA')}
927 endif
928 # TODO: add back version
929 summary_info += {'SDL support': config_host.has_key('CONFIG_SDL')}
930 summary_info += {'SDL image support': config_host.has_key('CONFIG_SDL_IMAGE')}
931 # TODO: add back version
932 summary_info += {'GTK support': config_host.has_key('CONFIG_GTK')}
933 summary_info += {'GTK GL support': config_host.has_key('CONFIG_GTK_GL')}
934 # TODO: add back version
935 summary_info += {'VTE support': config_host.has_key('CONFIG_VTE')}
936 summary_info += {'TLS priority': config_host['CONFIG_TLS_PRIORITY']}
937 summary_info += {'GNUTLS support': config_host.has_key('CONFIG_GNUTLS')}
938 # TODO: add back version
939 summary_info += {'libgcrypt': config_host.has_key('CONFIG_GCRYPT')}
940 if config_host.has_key('CONFIG_GCRYPT')
941 summary_info += {' hmac': config_host.has_key('CONFIG_GCRYPT_HMAC')}
942 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
943 endif
944 # TODO: add back version
945 summary_info += {'nettle': config_host.has_key('CONFIG_NETTLE')}
946 if config_host.has_key('CONFIG_NETTLE')
947 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
948 endif
949 summary_info += {'libtasn1': config_host.has_key('CONFIG_TASN1')}
950 summary_info += {'PAM': config_host.has_key('CONFIG_AUTH_PAM')}
951 summary_info += {'iconv support': config_host.has_key('CONFIG_ICONV')}
952 summary_info += {'curses support': config_host.has_key('CONFIG_CURSES')}
953 # TODO: add back version
954 summary_info += {'virgl support': config_host.has_key('CONFIG_VIRGL')}
955 summary_info += {'curl support': config_host.has_key('CONFIG_CURL')}
956 summary_info += {'mingw32 support': targetos == 'windows'}
957 summary_info += {'Audio drivers': config_host['CONFIG_AUDIO_DRIVERS']}
958 summary_info += {'Block whitelist (rw)': config_host['CONFIG_BDRV_RW_WHITELIST']}
959 summary_info += {'Block whitelist (ro)': config_host['CONFIG_BDRV_RO_WHITELIST']}
960 summary_info += {'VirtFS support': config_host.has_key('CONFIG_VIRTFS')}
961 summary_info += {'Multipath support': config_host.has_key('CONFIG_MPATH')}
962 summary_info += {'VNC support': config_host.has_key('CONFIG_VNC')}
963 if config_host.has_key('CONFIG_VNC')
964 summary_info += {'VNC SASL support': config_host.has_key('CONFIG_VNC_SASL')}
965 summary_info += {'VNC JPEG support': config_host.has_key('CONFIG_VNC_JPEG')}
966 summary_info += {'VNC PNG support': config_host.has_key('CONFIG_VNC_PNG')}
967 endif
968 summary_info += {'xen support': config_host.has_key('CONFIG_XEN_BACKEND')}
969 if config_host.has_key('CONFIG_XEN_BACKEND')
970 summary_info += {'xen ctrl version': config_host['CONFIG_XEN_CTRL_INTERFACE_VERSION']}
971 endif
972 summary_info += {'brlapi support': config_host.has_key('CONFIG_BRLAPI')}
973 summary_info += {'Documentation': config_host.has_key('BUILD_DOCS')}
974 summary_info += {'PIE': get_option('b_pie')}
975 summary_info += {'vde support': config_host.has_key('CONFIG_VDE')}
976 summary_info += {'netmap support': config_host.has_key('CONFIG_NETMAP')}
977 summary_info += {'Linux AIO support': config_host.has_key('CONFIG_LINUX_AIO')}
978 summary_info += {'Linux io_uring support': config_host.has_key('CONFIG_LINUX_IO_URING')}
979 summary_info += {'ATTR/XATTR support': config_host.has_key('CONFIG_ATTR')}
980 summary_info += {'Install blobs': config_host.has_key('INSTALL_BLOBS')}
981 # TODO: add back KVM/HAX/HVF/WHPX/TCG
982 #summary_info += {'KVM support': have_kvm'}
983 #summary_info += {'HAX support': have_hax'}
984 #summary_info += {'HVF support': have_hvf'}
985 #summary_info += {'WHPX support': have_whpx'}
986 #summary_info += {'TCG support': have_tcg'}
987 #if get_option('tcg')
988 # summary_info += {'TCG debug enabled': config_host.has_key('CONFIG_DEBUG_TCG')}
989 # summary_info += {'TCG interpreter': config_host.has_key('CONFIG_TCG_INTERPRETER')}
990 #endif
991 summary_info += {'malloc trim support': config_host.has_key('CONFIG_MALLOC_TRIM')}
992 summary_info += {'RDMA support': config_host.has_key('CONFIG_RDMA')}
993 summary_info += {'PVRDMA support': config_host.has_key('CONFIG_PVRDMA')}
994 summary_info += {'fdt support': config_host.has_key('CONFIG_FDT')}
995 summary_info += {'membarrier': config_host.has_key('CONFIG_MEMBARRIER')}
996 summary_info += {'preadv support': config_host.has_key('CONFIG_PREADV')}
997 summary_info += {'fdatasync': config_host.has_key('CONFIG_FDATASYNC')}
998 summary_info += {'madvise': config_host.has_key('CONFIG_MADVISE')}
999 summary_info += {'posix_madvise': config_host.has_key('CONFIG_POSIX_MADVISE')}
1000 summary_info += {'posix_memalign': config_host.has_key('CONFIG_POSIX_MEMALIGN')}
1001 summary_info += {'libcap-ng support': config_host.has_key('CONFIG_LIBCAP_NG')}
1002 summary_info += {'vhost-net support': config_host.has_key('CONFIG_VHOST_NET')}
1003 summary_info += {'vhost-crypto support': config_host.has_key('CONFIG_VHOST_CRYPTO')}
1004 summary_info += {'vhost-scsi support': config_host.has_key('CONFIG_VHOST_SCSI')}
1005 summary_info += {'vhost-vsock support': config_host.has_key('CONFIG_VHOST_VSOCK')}
1006 summary_info += {'vhost-user support': config_host.has_key('CONFIG_VHOST_KERNEL')}
1007 summary_info += {'vhost-user-fs support': config_host.has_key('CONFIG_VHOST_USER_FS')}
1008 summary_info += {'vhost-vdpa support': config_host.has_key('CONFIG_VHOST_VDPA')}
1009 summary_info += {'Trace backends': config_host['TRACE_BACKENDS']}
1010 if config_host['TRACE_BACKENDS'].split().contains('simple')
1011 summary_info += {'Trace output file': config_host['CONFIG_TRACE_FILE'] + '-<pid>'}
1012 endif
1013 # TODO: add back protocol and server version
1014 summary_info += {'spice support': config_host.has_key('CONFIG_SPICE')}
1015 summary_info += {'rbd support': config_host.has_key('CONFIG_RBD')}
1016 summary_info += {'xfsctl support': config_host.has_key('CONFIG_XFS')}
1017 summary_info += {'smartcard support': config_host.has_key('CONFIG_SMARTCARD')}
1018 summary_info += {'libusb': config_host.has_key('CONFIG_USB_LIBUSB')}
1019 summary_info += {'usb net redir': config_host.has_key('CONFIG_USB_REDIR')}
1020 summary_info += {'OpenGL support': config_host.has_key('CONFIG_OPENGL')}
1021 summary_info += {'OpenGL dmabufs': config_host.has_key('CONFIG_OPENGL_DMABUF')}
1022 summary_info += {'libiscsi support': config_host.has_key('CONFIG_LIBISCSI')}
1023 summary_info += {'libnfs support': config_host.has_key('CONFIG_LIBNFS')}
1024 summary_info += {'build guest agent': config_host.has_key('CONFIG_GUEST_AGENT')}
1025 if targetos == 'windows'
1026 if 'WIN_SDK' in config_host
1027 summary_info += {'Windows SDK': config_host['WIN_SDK']}
1028 endif
1029 summary_info += {'QGA VSS support': config_host.has_key('CONFIG_QGA_VSS')}
1030 summary_info += {'QGA w32 disk info': config_host.has_key('CONFIG_QGA_NTDDSCSI')}
1031 summary_info += {'QGA MSI support': config_host.has_key('CONFIG_QGA_MSI_ENABLED')}
1032 endif
1033 summary_info += {'seccomp support': config_host.has_key('CONFIG_SECCOMP')}
1034 summary_info += {'coroutine backend': config_host['CONFIG_COROUTINE_BACKEND']}
1035 summary_info += {'coroutine pool': config_host['CONFIG_COROUTINE_POOL'] == '1'}
1036 summary_info += {'debug stack usage': config_host.has_key('CONFIG_DEBUG_STACK_USAGE')}
1037 summary_info += {'mutex debugging': config_host.has_key('CONFIG_DEBUG_MUTEX')}
1038 summary_info += {'crypto afalg': config_host.has_key('CONFIG_AF_ALG')}
1039 summary_info += {'GlusterFS support': config_host.has_key('CONFIG_GLUSTERFS')}
1040 summary_info += {'gcov': get_option('b_coverage')}
1041 summary_info += {'TPM support': config_host.has_key('CONFIG_TPM')}
1042 summary_info += {'libssh support': config_host.has_key('CONFIG_LIBSSH')}
1043 summary_info += {'QOM debugging': config_host.has_key('CONFIG_QOM_CAST_DEBUG')}
1044 summary_info += {'Live block migration': config_host.has_key('CONFIG_LIVE_BLOCK_MIGRATION')}
1045 summary_info += {'lzo support': config_host.has_key('CONFIG_LZO')}
1046 summary_info += {'snappy support': config_host.has_key('CONFIG_SNAPPY')}
1047 summary_info += {'bzip2 support': config_host.has_key('CONFIG_BZIP2')}
1048 summary_info += {'lzfse support': config_host.has_key('CONFIG_LZFSE')}
1049 summary_info += {'zstd support': config_host.has_key('CONFIG_ZSTD')}
1050 summary_info += {'NUMA host support': config_host.has_key('CONFIG_NUMA')}
1051 summary_info += {'libxml2': config_host.has_key('CONFIG_LIBXML2')}
1052 summary_info += {'tcmalloc support': config_host.has_key('CONFIG_TCMALLOC')}
1053 summary_info += {'jemalloc support': config_host.has_key('CONFIG_JEMALLOC')}
1054 summary_info += {'avx2 optimization': config_host.has_key('CONFIG_AVX2_OPT')}
1055 summary_info += {'avx512f optimization': config_host.has_key('CONFIG_AVX512F_OPT')}
1056 summary_info += {'replication support': config_host.has_key('CONFIG_REPLICATION')}
1057 summary_info += {'bochs support': config_host.has_key('CONFIG_BOCHS')}
1058 summary_info += {'cloop support': config_host.has_key('CONFIG_CLOOP')}
1059 summary_info += {'dmg support': config_host.has_key('CONFIG_DMG')}
1060 summary_info += {'qcow v1 support': config_host.has_key('CONFIG_QCOW1')}
1061 summary_info += {'vdi support': config_host.has_key('CONFIG_VDI')}
1062 summary_info += {'vvfat support': config_host.has_key('CONFIG_VVFAT')}
1063 summary_info += {'qed support': config_host.has_key('CONFIG_QED')}
1064 summary_info += {'parallels support': config_host.has_key('CONFIG_PARALLELS')}
1065 summary_info += {'sheepdog support': config_host.has_key('CONFIG_SHEEPDOG')}
1066 summary_info += {'capstone': config_host.has_key('CONFIG_CAPSTONE')}
1067 summary_info += {'libpmem support': config_host.has_key('CONFIG_LIBPMEM')}
1068 summary_info += {'libdaxctl support': config_host.has_key('CONFIG_LIBDAXCTL')}
1069 summary_info += {'libudev': config_host.has_key('CONFIG_LIBUDEV')}
1070 summary_info += {'default devices': config_host['CONFIG_MINIKCONF_MODE'] == '--defconfig'}
1071 summary_info += {'plugin support': config_host.has_key('CONFIG_PLUGIN')}
1072 summary_info += {'fuzzing support': config_host.has_key('CONFIG_FUZZ')}
1073 if config_host.has_key('HAVE_GDB_BIN')
1074 summary_info += {'gdb': config_host['HAVE_GDB_BIN']}
1075 endif
1076 summary_info += {'thread sanitizer': config_host.has_key('CONFIG_TSAN')}
1077 summary_info += {'rng-none': config_host.has_key('CONFIG_RNG_NONE')}
1078 summary_info += {'Linux keyring': config_host.has_key('CONFIG_SECRET_KEYRING')}
1079 summary(summary_info, bool_yn: true)
1080
1081 if not supported_cpus.contains(cpu)
1082 message()
1083 warning('SUPPORT FOR THIS HOST CPU WILL GO AWAY IN FUTURE RELEASES!')
1084 message()
1085 message('CPU host architecture ' + cpu + ' support is not currently maintained.')
1086 message('The QEMU project intends to remove support for this host CPU in')
1087 message('a future release if nobody volunteers to maintain it and to')
1088 message('provide a build host for our continuous integration setup.')
1089 message('configure has succeeded and you can continue to build, but')
1090 message('if you care about QEMU on this platform you should contact')
1091 message('us upstream at qemu-devel@nongnu.org.')
1092 endif
1093
1094 if not supported_oses.contains(targetos)
1095 message()
1096 warning('WARNING: SUPPORT FOR THIS HOST OS WILL GO AWAY IN FUTURE RELEASES!')
1097 message()
1098 message('Host OS ' + targetos + 'support is not currently maintained.')
1099 message('The QEMU project intends to remove support for this host OS in')
1100 message('a future release if nobody volunteers to maintain it and to')
1101 message('provide a build host for our continuous integration setup.')
1102 message('configure has succeeded and you can continue to build, but')
1103 message('if you care about QEMU on this platform you should contact')
1104 message('us upstream at qemu-devel@nongnu.org.')
1105 endif