]> git.proxmox.com Git - mirror_qemu.git/blame - meson.build
meson: convert fsdev/
[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
a81df1b6 328
2becc36a
PB
329create_config = find_program('scripts/create_config')
330minikconf = find_program('scripts/minikconf.py')
a81df1b6
PB
331target_dirs = config_host['TARGET_DIRS'].split()
332have_user = false
333have_system = false
2becc36a
PB
334config_devices_mak_list = []
335config_devices_h = {}
336config_target_mak = {}
337kconfig_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]
a81df1b6
PB
351foreach target : target_dirs
352 have_user = have_user or target.endswith('-user')
2becc36a
PB
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}
a81df1b6
PB
384endforeach
385have_tools = 'CONFIG_TOOLS' in config_host
386have_block = have_system or have_tools
387
2becc36a
PB
388grepy = 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
398if 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)
406else
407 config_all_devices = {}
408endif
409config_all = config_all_devices
410config_all += config_host
411config_all += config_all_disas
412config_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
a81df1b6
PB
419# Generators
420
2c273f32 421genh = []
3f885659 422hxtool = find_program('scripts/hxtool')
650b5d54 423shaderinclude = find_program('scripts/shaderinclude.pl')
a81df1b6
PB
424qapi_gen = find_program('scripts/qapi-gen.py')
425qapi_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
444tracetool = [
445 python, files('scripts/tracetool.py'),
446 '--backend=' + config_host['TRACE_BACKENDS']
447]
448
2c273f32
MAL
449qemu_version_cmd = [find_program('scripts/qemu-version.sh'),
450 meson.current_source_dir(),
451 config_host['PKGVERSION'], config_host['VERSION']]
452qemu_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)
458genh += qemu_version
459
2becc36a
PB
460config_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@'])
465genh += config_host_h
466
3f885659
MAL
467hxdep = []
468hx_headers = [
469 ['qemu-options.hx', 'qemu-options.def'],
470 ['qemu-img-cmds.hx', 'qemu-img-cmds.h'],
471]
472if have_system
473 hx_headers += [
474 ['hmp-commands.hx', 'hmp-commands.h'],
475 ['hmp-commands-info.hx', 'hmp-commands-info.h'],
476 ]
477endif
478foreach d : hx_headers
b7c70bf2 479 hxdep += custom_target(d[1],
3f885659
MAL
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@'])
485endforeach
486genh += hxdep
487
a81df1b6
PB
488# Collect sourcesets.
489
490util_ss = ss.source_set()
491stub_ss = ss.source_set()
492trace_ss = ss.source_set()
3154fee4 493block_ss = ss.source_set()
4a96337d 494blockdev_ss = ss.source_set()
ff219dca 495qmp_ss = ss.source_set()
2becc36a
PB
496common_ss = ss.source_set()
497softmmu_ss = ss.source_set()
498user_ss = ss.source_set()
499bsd_user_ss = ss.source_set()
500linux_user_ss = ss.source_set()
501specific_ss = ss.source_set()
502
3154fee4 503modules = {}
2becc36a
PB
504hw_arch = {}
505target_arch = {}
506target_softmmu_arch = {}
a81df1b6
PB
507
508###############
509# Trace files #
510###############
511
512trace_events_subdirs = [
513 'accel/kvm',
514 'accel/tcg',
515 'crypto',
516 'monitor',
517]
518if have_user
519 trace_events_subdirs += [ 'linux-user' ]
520endif
521if have_block
522 trace_events_subdirs += [
523 'authz',
524 'block',
525 'io',
526 'nbd',
527 'scsi',
528 ]
529endif
530if 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 ]
586endif
587trace_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
a81df1b6
PB
602subdir('qapi')
603subdir('qobject')
604subdir('stubs')
605subdir('trace')
606subdir('util')
5582c58f
MAL
607subdir('qom')
608subdir('authz')
a81df1b6 609subdir('crypto')
2d78b56e 610subdir('ui')
a81df1b6 611
3154fee4
MAL
612
613if 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')
616endif
617
a81df1b6
PB
618# Build targets from sourcesets
619
2becc36a 620stub_ss = stub_ss.apply(config_all, strict: false)
a81df1b6
PB
621
622util_ss.add_all(trace_ss)
2becc36a 623util_ss = util_ss.apply(config_all, strict: false)
a81df1b6
PB
624libqemuutil = static_library('qemuutil',
625 sources: util_ss.sources() + stub_ss.sources() + genh,
626 dependencies: [util_ss.dependencies(), m, glib, socket])
627qemuutil = declare_dependency(link_with: libqemuutil,
04c6f1e7 628 sources: genh + version_res)
a81df1b6 629
478e943f 630subdir('audio')
7fcfd456 631subdir('io')
848e8ff6 632subdir('chardev')
ec0d5893 633subdir('fsdev')
d3b18480 634subdir('target')
708eab42 635subdir('dump')
ec0d5893 636
5e5733e5
MAL
637block_ss.add(files(
638 'block.c',
639 'blockjob.c',
640 'job.c',
641 'qemu-io-cmds.c',
642))
643block_ss.add(when: 'CONFIG_REPLICATION', if_true: files('replication.c'))
644
645subdir('nbd')
646subdir('scsi')
647subdir('block')
648
4a96337d
PB
649blockdev_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
658blockdev_ss.add(when: 'CONFIG_POSIX', if_true: files('os-posix.c'))
659softmmu_ss.add(when: 'CONFIG_WIN32', if_true: [files('os-win32.c')])
660
661softmmu_ss.add_all(blockdev_ss)
662softmmu_ss.add(files(
663 'bootdevice.c',
664 'dma-helpers.c',
665 'qdev-monitor.c',
666), sdl)
667
668softmmu_ss.add(when: 'CONFIG_TPM', if_true: files('tpm.c'))
669softmmu_ss.add(when: 'CONFIG_SECCOMP', if_true: [files('qemu-seccomp.c'), seccomp])
670softmmu_ss.add(when: ['CONFIG_FDT', fdt], if_true: [files('device_tree.c')])
671
672common_ss.add(files('cpus-common.c'))
673
5d3ea0e1 674subdir('softmmu')
ab318051 675subdir('backends')
55166230 676subdir('migration')
ff219dca 677subdir('monitor')
cdaf0722 678subdir('net')
17ef2af6 679subdir('replay')
5d3ea0e1 680
a2ce7dbd
PB
681# needed for fuzzing binaries
682subdir('tests/qtest/libqos')
683
3154fee4
MAL
684block_mods = []
685softmmu_mods = []
686foreach d, list : modules
687 foreach m, module_ss : list
688 if enable_modules and targetos != 'windows'
689 module_ss = module_ss.apply(config_host, strict: false)
690 sl = static_library(d + '-' + m, [genh, module_ss.sources()],
691 dependencies: [modulecommon, module_ss.dependencies()], pic: true)
692 if d == 'block'
693 block_mods += sl
694 else
695 softmmu_mods += sl
696 endif
697 else
698 if d == 'block'
699 block_ss.add_all(module_ss)
700 else
701 softmmu_ss.add_all(module_ss)
702 endif
703 endif
704 endforeach
705endforeach
706
707nm = find_program('nm')
708undefsym = find_program('scripts/undefsym.sh')
709block_syms = custom_target('block.syms', output: 'block.syms',
710 input: [libqemuutil, block_mods],
711 capture: true,
712 command: [undefsym, nm, '@INPUT@'])
713qemu_syms = custom_target('qemu.syms', output: 'qemu.syms',
714 input: [libqemuutil, softmmu_mods],
715 capture: true,
716 command: [undefsym, nm, '@INPUT@'])
717
5e5733e5
MAL
718block_ss = block_ss.apply(config_host, strict: false)
719libblock = static_library('block', block_ss.sources() + genh,
720 dependencies: block_ss.dependencies(),
721 link_depends: block_syms,
722 name_suffix: 'fa',
723 build_by_default: false)
724
725block = declare_dependency(link_whole: [libblock],
b7c70bf2
MAL
726 link_args: '@block.syms',
727 dependencies: [crypto, io])
5e5733e5 728
ff219dca
PB
729qmp_ss = qmp_ss.apply(config_host, strict: false)
730libqmp = static_library('qmp', qmp_ss.sources() + genh,
731 dependencies: qmp_ss.dependencies(),
732 name_suffix: 'fa',
733 build_by_default: false)
734
735qmp = declare_dependency(link_whole: [libqmp])
736
3154fee4
MAL
737foreach m : block_mods + softmmu_mods
738 shared_module(m.name(),
739 name_prefix: '',
740 link_whole: m,
741 install: true,
742 install_dir: config_host['qemu_moddir'])
743endforeach
744
2becc36a
PB
745common_ss.add_all(when: 'CONFIG_SOFTMMU', if_true: softmmu_ss)
746common_ss.add_all(when: 'CONFIG_USER_ONLY', if_true: user_ss)
747
748common_all = common_ss.apply(config_all, strict: false)
749common_all = static_library('common',
750 build_by_default: false,
751 sources: common_all.sources() + genh,
752 dependencies: common_all.dependencies(),
753 name_suffix: 'fa')
754
755foreach target : target_dirs
756 config_target = config_target_mak[target]
757 target_name = config_target['TARGET_NAME']
758 arch = config_target['TARGET_BASE_ARCH']
759 arch_srcs = []
760
761 target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
762 if targetos == 'linux'
763 target_inc += include_directories('linux-headers', is_system: true)
764 endif
765 if target.endswith('-softmmu')
766 qemu_target_name = 'qemu-system-' + target_name
767 target_type='system'
768 arch_srcs += config_devices_h[target]
769 else
770 target_type='user'
771 qemu_target_name = 'qemu-' + target_name
772 if 'CONFIG_LINUX_USER' in config_target
773 base_dir = 'linux-user'
774 target_inc += include_directories('linux-user/host/' / config_host['ARCH'])
775 else
776 base_dir = 'bsd-user'
777 endif
778 target_inc += include_directories(
779 base_dir,
780 base_dir / config_target['TARGET_ABI_DIR'],
781 )
782 endif
783
784 target_common = common_ss.apply(config_target, strict: false)
785 objects = common_all.extract_objects(target_common.sources())
786
787 # TODO: Change to generator once obj-y goes away
788 config_target_h = custom_target(target + '-config-target.h',
789 input: meson.current_build_dir() / target / 'config-target.mak',
790 output: target + '-config-target.h',
791 capture: true,
792 command: [create_config, '@INPUT@'])
793
794 target_specific = specific_ss.apply(config_target, strict: false)
795 arch_srcs += target_specific.sources()
796
797 static_library('qemu-' + target,
798 sources: arch_srcs + [config_target_h] + genh,
799 objects: objects,
800 include_directories: target_inc,
801 c_args: ['-DNEED_CPU_H',
802 '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
803 '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)],
804 name_suffix: 'fa')
805endforeach
806
931049b4 807# Other build targets
897b5afa 808
f15bff25
PB
809if 'CONFIG_GUEST_AGENT' in config_host
810 subdir('qga')
811endif
812
931049b4 813if have_tools
b7c70bf2
MAL
814 qemu_img = executable('qemu-img', [files('qemu-img.c'), hxdep],
815 dependencies: [authz, block, crypto, io, qom, qemuutil], install: true)
816 qemu_io = executable('qemu-io', files('qemu-io.c'),
817 dependencies: [block, qemuutil], install: true)
818 if targetos == 'linux' or targetos == 'sunos' or targetos.endswith('bsd')
819 qemu_nbd = executable('qemu-nbd', files('qemu-nbd.c'),
820 dependencies: [block, qemuutil], install: true)
821 endif
822
7c58bb76 823 subdir('storage-daemon')
a9c9727c 824 subdir('contrib/rdmacm-mux')
1d7bb6ab 825 subdir('contrib/elf2dmp')
a9c9727c 826
ade60d4f
MAL
827 if 'CONFIG_XKBCOMMON' in config_host
828 executable('qemu-keymap', files('qemu-keymap.c', 'ui/input-keymap.c'),
829 dependencies: [qemuutil, xkbcommon], install: true)
830 endif
831
157e7b13
MAL
832 executable('qemu-edid', files('qemu-edid.c', 'hw/display/edid-generate.c'),
833 dependencies: qemuutil,
834 install: true)
835
931049b4
PB
836 if 'CONFIG_VHOST_USER' in config_host
837 subdir('contrib/libvhost-user')
2d7ac0af 838 subdir('contrib/vhost-user-blk')
ea458960
MAL
839 if 'CONFIG_LINUX' in config_host
840 subdir('contrib/vhost-user-gpu')
841 endif
32fcc624 842 subdir('contrib/vhost-user-input')
99650b62 843 subdir('contrib/vhost-user-scsi')
931049b4 844 endif
8f51e01c
MAL
845
846 if targetos == 'linux'
847 executable('qemu-bridge-helper', files('qemu-bridge-helper.c'),
848 dependencies: [qemuutil, libcap_ng],
849 install: true,
850 install_dir: get_option('libexecdir'))
897b5afa
MAL
851
852 executable('qemu-pr-helper', files('scsi/qemu-pr-helper.c', 'scsi/utils.c'),
853 dependencies: [authz, crypto, io, qom, qemuutil,
854 libcap_ng, libudev, libmpathpersist],
855 install: true)
8f51e01c
MAL
856 endif
857
5ee24e78
MAL
858 if 'CONFIG_IVSHMEM' in config_host
859 subdir('contrib/ivshmem-client')
860 subdir('contrib/ivshmem-server')
861 endif
931049b4
PB
862endif
863
3f99cf57 864subdir('tools')
bdcbea7a 865subdir('pc-bios')
ce1c1e7a 866subdir('tests')
3f99cf57 867
f9332757
PB
868summary_info = {}
869summary_info += {'Install prefix': config_host['prefix']}
870summary_info += {'BIOS directory': config_host['qemu_datadir']}
871summary_info += {'firmware path': config_host['qemu_firmwarepath']}
872summary_info += {'binary directory': config_host['bindir']}
873summary_info += {'library directory': config_host['libdir']}
874summary_info += {'module directory': config_host['qemu_moddir']}
875summary_info += {'libexec directory': config_host['libexecdir']}
876summary_info += {'include directory': config_host['includedir']}
877summary_info += {'config directory': config_host['sysconfdir']}
878if targetos != 'windows'
879 summary_info += {'local state directory': config_host['qemu_localstatedir']}
880 summary_info += {'Manual directory': config_host['mandir']}
881else
882 summary_info += {'local state directory': 'queried at runtime'}
883endif
884summary_info += {'Build directory': meson.current_build_dir()}
885summary_info += {'Source path': meson.current_source_dir()}
886summary_info += {'GIT binary': config_host['GIT']}
887summary_info += {'GIT submodules': config_host['GIT_SUBMODULES']}
888summary_info += {'C compiler': meson.get_compiler('c').cmd_array()[0]}
889summary_info += {'Host C compiler': meson.get_compiler('c', native: true).cmd_array()[0]}
890if link_language == 'cpp'
891 summary_info += {'C++ compiler': meson.get_compiler('cpp').cmd_array()[0]}
892else
893 summary_info += {'C++ compiler': false}
894endif
895if targetos == 'darwin'
896 summary_info += {'Objective-C compiler': meson.get_compiler('objc').cmd_array()[0]}
897endif
898summary_info += {'ARFLAGS': config_host['ARFLAGS']}
899summary_info += {'CFLAGS': config_host['CFLAGS']}
900summary_info += {'QEMU_CFLAGS': config_host['QEMU_CFLAGS']}
901summary_info += {'QEMU_LDFLAGS': config_host['QEMU_LDFLAGS']}
902summary_info += {'make': config_host['MAKE']}
903summary_info += {'install': config_host['INSTALL']}
904summary_info += {'python': '@0@ (version: @1@)'.format(python.full_path(), python.language_version())}
905summary_info += {'sphinx-build': config_host['SPHINX_BUILD']}
906summary_info += {'genisoimage': config_host['GENISOIMAGE']}
907# TODO: add back version
908summary_info += {'slirp support': config_host.has_key('CONFIG_SLIRP')}
909if config_host.has_key('CONFIG_SLIRP')
910 summary_info += {'smbd': config_host['CONFIG_SMBD_COMMAND']}
911endif
912summary_info += {'module support': config_host.has_key('CONFIG_MODULES')}
913if config_host.has_key('CONFIG_MODULES')
914 summary_info += {'alternative module path': config_host.has_key('CONFIG_MODULE_UPGRADES')}
915endif
916summary_info += {'host CPU': cpu}
917summary_info += {'host endianness': build_machine.endian()}
918summary_info += {'target list': config_host['TARGET_DIRS']}
919summary_info += {'gprof enabled': config_host.has_key('CONFIG_GPROF')}
920summary_info += {'sparse enabled': meson.get_compiler('c').cmd_array().contains('cgcc')}
921summary_info += {'strip binaries': get_option('strip')}
922summary_info += {'profiler': config_host.has_key('CONFIG_PROFILER')}
923summary_info += {'static build': config_host.has_key('CONFIG_TOOLS')}
924if targetos == 'darwin'
925 summary_info += {'Cocoa support': config_host.has_key('CONFIG_COCOA')}
926endif
927# TODO: add back version
928summary_info += {'SDL support': config_host.has_key('CONFIG_SDL')}
929summary_info += {'SDL image support': config_host.has_key('CONFIG_SDL_IMAGE')}
930# TODO: add back version
931summary_info += {'GTK support': config_host.has_key('CONFIG_GTK')}
932summary_info += {'GTK GL support': config_host.has_key('CONFIG_GTK_GL')}
933# TODO: add back version
934summary_info += {'VTE support': config_host.has_key('CONFIG_VTE')}
935summary_info += {'TLS priority': config_host['CONFIG_TLS_PRIORITY']}
936summary_info += {'GNUTLS support': config_host.has_key('CONFIG_GNUTLS')}
937# TODO: add back version
938summary_info += {'libgcrypt': config_host.has_key('CONFIG_GCRYPT')}
939if config_host.has_key('CONFIG_GCRYPT')
940 summary_info += {' hmac': config_host.has_key('CONFIG_GCRYPT_HMAC')}
941 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
942endif
943# TODO: add back version
944summary_info += {'nettle': config_host.has_key('CONFIG_NETTLE')}
945if config_host.has_key('CONFIG_NETTLE')
946 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
947endif
948summary_info += {'libtasn1': config_host.has_key('CONFIG_TASN1')}
949summary_info += {'PAM': config_host.has_key('CONFIG_AUTH_PAM')}
950summary_info += {'iconv support': config_host.has_key('CONFIG_ICONV')}
951summary_info += {'curses support': config_host.has_key('CONFIG_CURSES')}
952# TODO: add back version
953summary_info += {'virgl support': config_host.has_key('CONFIG_VIRGL')}
954summary_info += {'curl support': config_host.has_key('CONFIG_CURL')}
955summary_info += {'mingw32 support': targetos == 'windows'}
956summary_info += {'Audio drivers': config_host['CONFIG_AUDIO_DRIVERS']}
957summary_info += {'Block whitelist (rw)': config_host['CONFIG_BDRV_RW_WHITELIST']}
958summary_info += {'Block whitelist (ro)': config_host['CONFIG_BDRV_RO_WHITELIST']}
959summary_info += {'VirtFS support': config_host.has_key('CONFIG_VIRTFS')}
960summary_info += {'Multipath support': config_host.has_key('CONFIG_MPATH')}
961summary_info += {'VNC support': config_host.has_key('CONFIG_VNC')}
962if config_host.has_key('CONFIG_VNC')
963 summary_info += {'VNC SASL support': config_host.has_key('CONFIG_VNC_SASL')}
964 summary_info += {'VNC JPEG support': config_host.has_key('CONFIG_VNC_JPEG')}
965 summary_info += {'VNC PNG support': config_host.has_key('CONFIG_VNC_PNG')}
966endif
967summary_info += {'xen support': config_host.has_key('CONFIG_XEN_BACKEND')}
968if config_host.has_key('CONFIG_XEN_BACKEND')
969 summary_info += {'xen ctrl version': config_host['CONFIG_XEN_CTRL_INTERFACE_VERSION']}
970endif
971summary_info += {'brlapi support': config_host.has_key('CONFIG_BRLAPI')}
972summary_info += {'Documentation': config_host.has_key('BUILD_DOCS')}
973summary_info += {'PIE': get_option('b_pie')}
974summary_info += {'vde support': config_host.has_key('CONFIG_VDE')}
975summary_info += {'netmap support': config_host.has_key('CONFIG_NETMAP')}
976summary_info += {'Linux AIO support': config_host.has_key('CONFIG_LINUX_AIO')}
977summary_info += {'Linux io_uring support': config_host.has_key('CONFIG_LINUX_IO_URING')}
978summary_info += {'ATTR/XATTR support': config_host.has_key('CONFIG_ATTR')}
979summary_info += {'Install blobs': config_host.has_key('INSTALL_BLOBS')}
980# TODO: add back KVM/HAX/HVF/WHPX/TCG
981#summary_info += {'KVM support': have_kvm'}
982#summary_info += {'HAX support': have_hax'}
983#summary_info += {'HVF support': have_hvf'}
984#summary_info += {'WHPX support': have_whpx'}
985#summary_info += {'TCG support': have_tcg'}
986#if get_option('tcg')
987# summary_info += {'TCG debug enabled': config_host.has_key('CONFIG_DEBUG_TCG')}
988# summary_info += {'TCG interpreter': config_host.has_key('CONFIG_TCG_INTERPRETER')}
989#endif
990summary_info += {'malloc trim support': config_host.has_key('CONFIG_MALLOC_TRIM')}
991summary_info += {'RDMA support': config_host.has_key('CONFIG_RDMA')}
992summary_info += {'PVRDMA support': config_host.has_key('CONFIG_PVRDMA')}
993summary_info += {'fdt support': config_host.has_key('CONFIG_FDT')}
994summary_info += {'membarrier': config_host.has_key('CONFIG_MEMBARRIER')}
995summary_info += {'preadv support': config_host.has_key('CONFIG_PREADV')}
996summary_info += {'fdatasync': config_host.has_key('CONFIG_FDATASYNC')}
997summary_info += {'madvise': config_host.has_key('CONFIG_MADVISE')}
998summary_info += {'posix_madvise': config_host.has_key('CONFIG_POSIX_MADVISE')}
999summary_info += {'posix_memalign': config_host.has_key('CONFIG_POSIX_MEMALIGN')}
1000summary_info += {'libcap-ng support': config_host.has_key('CONFIG_LIBCAP_NG')}
1001summary_info += {'vhost-net support': config_host.has_key('CONFIG_VHOST_NET')}
1002summary_info += {'vhost-crypto support': config_host.has_key('CONFIG_VHOST_CRYPTO')}
1003summary_info += {'vhost-scsi support': config_host.has_key('CONFIG_VHOST_SCSI')}
1004summary_info += {'vhost-vsock support': config_host.has_key('CONFIG_VHOST_VSOCK')}
1005summary_info += {'vhost-user support': config_host.has_key('CONFIG_VHOST_KERNEL')}
1006summary_info += {'vhost-user-fs support': config_host.has_key('CONFIG_VHOST_USER_FS')}
1007summary_info += {'vhost-vdpa support': config_host.has_key('CONFIG_VHOST_VDPA')}
1008summary_info += {'Trace backends': config_host['TRACE_BACKENDS']}
1009if config_host['TRACE_BACKENDS'].split().contains('simple')
1010 summary_info += {'Trace output file': config_host['CONFIG_TRACE_FILE'] + '-<pid>'}
1011endif
1012# TODO: add back protocol and server version
1013summary_info += {'spice support': config_host.has_key('CONFIG_SPICE')}
1014summary_info += {'rbd support': config_host.has_key('CONFIG_RBD')}
1015summary_info += {'xfsctl support': config_host.has_key('CONFIG_XFS')}
1016summary_info += {'smartcard support': config_host.has_key('CONFIG_SMARTCARD')}
1017summary_info += {'libusb': config_host.has_key('CONFIG_USB_LIBUSB')}
1018summary_info += {'usb net redir': config_host.has_key('CONFIG_USB_REDIR')}
1019summary_info += {'OpenGL support': config_host.has_key('CONFIG_OPENGL')}
1020summary_info += {'OpenGL dmabufs': config_host.has_key('CONFIG_OPENGL_DMABUF')}
1021summary_info += {'libiscsi support': config_host.has_key('CONFIG_LIBISCSI')}
1022summary_info += {'libnfs support': config_host.has_key('CONFIG_LIBNFS')}
1023summary_info += {'build guest agent': config_host.has_key('CONFIG_GUEST_AGENT')}
1024if targetos == 'windows'
1025 if 'WIN_SDK' in config_host
1026 summary_info += {'Windows SDK': config_host['WIN_SDK']}
1027 endif
1028 summary_info += {'QGA VSS support': config_host.has_key('CONFIG_QGA_VSS')}
1029 summary_info += {'QGA w32 disk info': config_host.has_key('CONFIG_QGA_NTDDSCSI')}
1030 summary_info += {'QGA MSI support': config_host.has_key('CONFIG_QGA_MSI_ENABLED')}
1031endif
1032summary_info += {'seccomp support': config_host.has_key('CONFIG_SECCOMP')}
1033summary_info += {'coroutine backend': config_host['CONFIG_COROUTINE_BACKEND']}
1034summary_info += {'coroutine pool': config_host['CONFIG_COROUTINE_POOL'] == '1'}
1035summary_info += {'debug stack usage': config_host.has_key('CONFIG_DEBUG_STACK_USAGE')}
1036summary_info += {'mutex debugging': config_host.has_key('CONFIG_DEBUG_MUTEX')}
1037summary_info += {'crypto afalg': config_host.has_key('CONFIG_AF_ALG')}
1038summary_info += {'GlusterFS support': config_host.has_key('CONFIG_GLUSTERFS')}
bf0e56a3 1039summary_info += {'gcov': get_option('b_coverage')}
f9332757
PB
1040summary_info += {'TPM support': config_host.has_key('CONFIG_TPM')}
1041summary_info += {'libssh support': config_host.has_key('CONFIG_LIBSSH')}
1042summary_info += {'QOM debugging': config_host.has_key('CONFIG_QOM_CAST_DEBUG')}
1043summary_info += {'Live block migration': config_host.has_key('CONFIG_LIVE_BLOCK_MIGRATION')}
1044summary_info += {'lzo support': config_host.has_key('CONFIG_LZO')}
1045summary_info += {'snappy support': config_host.has_key('CONFIG_SNAPPY')}
1046summary_info += {'bzip2 support': config_host.has_key('CONFIG_BZIP2')}
1047summary_info += {'lzfse support': config_host.has_key('CONFIG_LZFSE')}
1048summary_info += {'zstd support': config_host.has_key('CONFIG_ZSTD')}
1049summary_info += {'NUMA host support': config_host.has_key('CONFIG_NUMA')}
1050summary_info += {'libxml2': config_host.has_key('CONFIG_LIBXML2')}
1051summary_info += {'tcmalloc support': config_host.has_key('CONFIG_TCMALLOC')}
1052summary_info += {'jemalloc support': config_host.has_key('CONFIG_JEMALLOC')}
1053summary_info += {'avx2 optimization': config_host.has_key('CONFIG_AVX2_OPT')}
1054summary_info += {'avx512f optimization': config_host.has_key('CONFIG_AVX512F_OPT')}
1055summary_info += {'replication support': config_host.has_key('CONFIG_REPLICATION')}
1056summary_info += {'bochs support': config_host.has_key('CONFIG_BOCHS')}
1057summary_info += {'cloop support': config_host.has_key('CONFIG_CLOOP')}
1058summary_info += {'dmg support': config_host.has_key('CONFIG_DMG')}
1059summary_info += {'qcow v1 support': config_host.has_key('CONFIG_QCOW1')}
1060summary_info += {'vdi support': config_host.has_key('CONFIG_VDI')}
1061summary_info += {'vvfat support': config_host.has_key('CONFIG_VVFAT')}
1062summary_info += {'qed support': config_host.has_key('CONFIG_QED')}
1063summary_info += {'parallels support': config_host.has_key('CONFIG_PARALLELS')}
1064summary_info += {'sheepdog support': config_host.has_key('CONFIG_SHEEPDOG')}
1065summary_info += {'capstone': config_host.has_key('CONFIG_CAPSTONE')}
1066summary_info += {'libpmem support': config_host.has_key('CONFIG_LIBPMEM')}
1067summary_info += {'libdaxctl support': config_host.has_key('CONFIG_LIBDAXCTL')}
1068summary_info += {'libudev': config_host.has_key('CONFIG_LIBUDEV')}
1069summary_info += {'default devices': config_host['CONFIG_MINIKCONF_MODE'] == '--defconfig'}
1070summary_info += {'plugin support': config_host.has_key('CONFIG_PLUGIN')}
1071summary_info += {'fuzzing support': config_host.has_key('CONFIG_FUZZ')}
1072if config_host.has_key('HAVE_GDB_BIN')
1073 summary_info += {'gdb': config_host['HAVE_GDB_BIN']}
1074endif
1075summary_info += {'thread sanitizer': config_host.has_key('CONFIG_TSAN')}
1076summary_info += {'rng-none': config_host.has_key('CONFIG_RNG_NONE')}
1077summary_info += {'Linux keyring': config_host.has_key('CONFIG_SECRET_KEYRING')}
1078summary(summary_info, bool_yn: true)
1079
1080if not supported_cpus.contains(cpu)
1081 message()
1082 warning('SUPPORT FOR THIS HOST CPU WILL GO AWAY IN FUTURE RELEASES!')
1083 message()
1084 message('CPU host architecture ' + cpu + ' support is not currently maintained.')
1085 message('The QEMU project intends to remove support for this host CPU in')
1086 message('a future release if nobody volunteers to maintain it and to')
1087 message('provide a build host for our continuous integration setup.')
1088 message('configure has succeeded and you can continue to build, but')
1089 message('if you care about QEMU on this platform you should contact')
1090 message('us upstream at qemu-devel@nongnu.org.')
1091endif
1092
1093if not supported_oses.contains(targetos)
1094 message()
1095 warning('WARNING: SUPPORT FOR THIS HOST OS WILL GO AWAY IN FUTURE RELEASES!')
1096 message()
1097 message('Host OS ' + targetos + 'support is not currently maintained.')
1098 message('The QEMU project intends to remove support for this host OS in')
1099 message('a future release if nobody volunteers to maintain it and to')
1100 message('provide a build host for our continuous integration setup.')
1101 message('configure has succeeded and you can continue to build, but')
1102 message('if you care about QEMU on this platform you should contact')
1103 message('us upstream at qemu-devel@nongnu.org.')
1104endif