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