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