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