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