blob: e1e70d4b4827b6330b2d449e573413939c42f16c [file] [log] [blame]
Paolo Bonzinia5665052019-06-10 12:05:14 +02001project('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')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -04007ss = import('sourceset')
8
Paolo Bonzinice1c1e72020-01-28 16:41:44 +01009sh = find_program('sh')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -040010cc = meson.get_compiler('c')
Paolo Bonzinia5665052019-06-10 12:05:14 +020011config_host = keyval.load(meson.current_build_dir() / 'config-host.mak')
Paolo Bonzini2becc362020-02-03 11:42:03 +010012config_all_disas = keyval.load(meson.current_build_dir() / 'config-all-disas.mak')
Marc-André Lureau3154fee2019-08-29 22:07:01 +040013enable_modules = 'CONFIG_MODULES' in config_host
Paolo Bonzinia5665052019-06-10 12:05:14 +020014
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
Marc-André Lureaufc929892019-07-13 01:47:54 +040024python = 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
Paolo Bonzinia5665052019-06-10 12:05:14 +020030if host_machine.system() == 'darwin'
31 add_languages('objc', required: false, native: false)
32endif
33
Paolo Bonzini968b4db2020-02-03 14:45:33 +010034if '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
Paolo Bonzinia5665052019-06-10 12:05:14 +020041configure_file(input: files('scripts/ninjatool.py'),
42 output: 'ninjatool',
43 configuration: config_host)
Paolo Bonzinif9332752020-02-03 13:28:38 +010044
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
Paolo Bonzinia81df1b2020-08-19 08:44:56 -040052m = cc.find_library('m', required: false)
53util = cc.find_library('util', required: false)
54socket = []
Marc-André Lureau04c6f1e2019-07-18 00:31:05 +040055version_res = []
Marc-André Lureaud92989a2019-08-20 19:48:59 +040056coref = []
57iokit = []
58cocoa = []
59hvf = []
Paolo Bonzinia81df1b2020-08-19 08:44:56 -040060if targetos == 'windows'
61 socket = cc.find_library('ws2_32')
Marc-André Lureau04c6f1e2019-07-18 00:31:05 +040062
63 win = import('windows')
64 version_res = win.compile_resources('version.rc',
65 depend_files: files('pc-bios/qemu-nsis.ico'),
66 include_directories: include_directories('.'))
Marc-André Lureaud92989a2019-08-20 19:48:59 +040067elif targetos == 'darwin'
68 coref = dependency('appleframeworks', modules: 'CoreFoundation')
69 iokit = dependency('appleframeworks', modules: 'IOKit')
70 cocoa = dependency('appleframeworks', modules: 'Cocoa')
71 hvf = dependency('appleframeworks', modules: 'Hypervisor')
Paolo Bonzinicfad62f2020-08-09 23:47:45 +020072elif targetos == 'sunos'
73 socket = [cc.find_library('socket'),
74 cc.find_library('nsl'),
75 cc.find_library('resolv')]
76elif targetos == 'haiku'
77 socket = [cc.find_library('posix_error_mapper'),
78 cc.find_library('network'),
79 cc.find_library('bsd')]
Paolo Bonzinia81df1b2020-08-19 08:44:56 -040080endif
81glib = declare_dependency(compile_args: config_host['GLIB_CFLAGS'].split(),
82 link_args: config_host['GLIB_LIBS'].split())
83gio = not_found
84if 'CONFIG_GIO' in config_host
85 gio = declare_dependency(compile_args: config_host['GIO_CFLAGS'].split(),
86 link_args: config_host['GIO_LIBS'].split())
87endif
88lttng = not_found
89if 'CONFIG_TRACE_UST' in config_host
90 lttng = declare_dependency(link_args: config_host['LTTNG_UST_LIBS'].split())
91endif
92urcubp = not_found
93if 'CONFIG_TRACE_UST' in config_host
94 urcubp = declare_dependency(link_args: config_host['URCU_BP_LIBS'].split())
95endif
96nettle = not_found
97if 'CONFIG_NETTLE' in config_host
98 nettle = declare_dependency(compile_args: config_host['NETTLE_CFLAGS'].split(),
99 link_args: config_host['NETTLE_LIBS'].split())
100endif
101gnutls = not_found
102if 'CONFIG_GNUTLS' in config_host
103 gnutls = declare_dependency(compile_args: config_host['GNUTLS_CFLAGS'].split(),
104 link_args: config_host['GNUTLS_LIBS'].split())
105endif
Marc-André Lureauea458962019-07-12 22:23:46 +0400106pixman = declare_dependency(compile_args: config_host['PIXMAN_CFLAGS'].split(),
107 link_args: config_host['PIXMAN_LIBS'].split())
Marc-André Lureau5e7fbd22019-07-15 22:54:34 +0400108pam = not_found
109if 'CONFIG_AUTH_PAM' in config_host
110 pam = cc.find_library('pam')
111endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400112libaio = cc.find_library('aio', required: false)
113zlib = not_found
114if 'CONFIG_ZLIB' in config_host
115 zlib = declare_dependency(compile_args: config_host['ZLIB_CFLAGS'].split(),
116 link_args: config_host['ZLIB_LIBS'].split())
117endif
118linux_io_uring = not_found
119if 'CONFIG_LINUX_IO_URING' in config_host
120 linux_io_uring = declare_dependency(compile_args: config_host['LINUX_IO_URING_CFLAGS'].split(),
121 link_args: config_host['LINUX_IO_URING_LIBS'].split())
122endif
123libxml2 = not_found
124if 'CONFIG_LIBXML2' in config_host
125 libxml2 = declare_dependency(compile_args: config_host['LIBXML2_CFLAGS'].split(),
126 link_args: config_host['LIBXML2_LIBS'].split())
127endif
128libnfs = not_found
129if 'CONFIG_LIBNFS' in config_host
130 libnfs = declare_dependency(link_args: config_host['LIBNFS_LIBS'].split())
131endif
Marc-André Lureauec0d5892019-07-15 15:04:49 +0400132libattr = not_found
133if 'CONFIG_ATTR' in config_host
134 libattr = declare_dependency(link_args: config_host['LIBATTR_LIBS'].split())
135endif
Paolo Bonzini3f99cf52020-02-05 09:45:39 +0100136seccomp = not_found
137if 'CONFIG_SECCOMP' in config_host
138 seccomp = declare_dependency(compile_args: config_host['SECCOMP_CFLAGS'].split(),
139 link_args: config_host['SECCOMP_LIBS'].split())
140endif
141libcap_ng = not_found
142if 'CONFIG_LIBCAP_NG' in config_host
143 libcap_ng = declare_dependency(link_args: config_host['LIBCAP_NG_LIBS'].split())
144endif
Marc-André Lureauade60d42019-07-15 14:48:31 +0400145xkbcommon = not_found
146if 'CONFIG_XKBCOMMON' in config_host
147 xkbcommon = declare_dependency(compile_args: config_host['XKBCOMMON_CFLAGS'].split(),
148 link_args: config_host['XKBCOMMON_LIBS'].split())
149endif
Paolo Bonzini478e9432020-08-17 12:47:55 +0200150pulse = not_found
151if 'CONFIG_LIBPULSE' in config_host
152 pulse = declare_dependency(compile_args: config_host['PULSE_CFLAGS'].split(),
153 link_args: config_host['PULSE_LIBS'].split())
154endif
155alsa = not_found
156if 'CONFIG_ALSA' in config_host
157 alsa = declare_dependency(compile_args: config_host['ALSA_CFLAGS'].split(),
158 link_args: config_host['ALSA_LIBS'].split())
159endif
160jack = not_found
161if 'CONFIG_LIBJACK' in config_host
162 jack = declare_dependency(link_args: config_host['JACK_LIBS'].split())
163endif
Paolo Bonzini26347332019-07-29 15:40:07 +0200164spice = not_found
165if 'CONFIG_SPICE' in config_host
166 spice = declare_dependency(compile_args: config_host['SPICE_CFLAGS'].split(),
167 link_args: config_host['SPICE_LIBS'].split())
168endif
Marc-André Lureau5ee24e72019-07-12 23:16:54 +0400169rt = cc.find_library('rt', required: false)
Marc-André Lureau897b5af2019-07-16 21:54:15 +0400170libmpathpersist = not_found
171if config_host.has_key('CONFIG_MPATH')
172 libmpathpersist = cc.find_library('mpathpersist')
173endif
Paolo Bonzini99650b62019-06-10 12:21:14 +0200174libiscsi = not_found
175if 'CONFIG_LIBISCSI' in config_host
176 libiscsi = declare_dependency(compile_args: config_host['LIBISCSI_CFLAGS'].split(),
177 link_args: config_host['LIBISCSI_LIBS'].split())
178endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400179zstd = not_found
180if 'CONFIG_ZSTD' in config_host
181 zstd = declare_dependency(compile_args: config_host['ZSTD_CFLAGS'].split(),
182 link_args: config_host['ZSTD_LIBS'].split())
183endif
Marc-André Lureauea458962019-07-12 22:23:46 +0400184gbm = not_found
185if 'CONFIG_GBM' in config_host
186 gbm = declare_dependency(compile_args: config_host['GBM_CFLAGS'].split(),
187 link_args: config_host['GBM_LIBS'].split())
188endif
189virgl = not_found
190if 'CONFIG_VIRGL' in config_host
191 virgl = declare_dependency(compile_args: config_host['VIRGL_CFLAGS'].split(),
192 link_args: config_host['VIRGL_LIBS'].split())
193endif
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +0400194curl = not_found
195if 'CONFIG_CURL' in config_host
196 curl = declare_dependency(compile_args: config_host['CURL_CFLAGS'].split(),
197 link_args: config_host['CURL_LIBS'].split())
198endif
Paolo Bonzinif15bff22019-07-18 13:19:02 +0200199libudev = not_found
200if 'CONFIG_LIBUDEV' in config_host
201 libudev = declare_dependency(link_args: config_host['LIBUDEV_LIBS'].split())
202endif
Paolo Bonzini26347332019-07-29 15:40:07 +0200203brlapi = not_found
204if 'CONFIG_BRLAPI' in config_host
205 brlapi = declare_dependency(link_args: config_host['BRLAPI_LIBS'].split())
206endif
207sdl = not_found
208if 'CONFIG_SDL' in config_host
209 sdl = declare_dependency(compile_args: config_host['SDL_CFLAGS'].split(),
210 link_args: config_host['SDL_LIBS'].split())
211endif
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400212rbd = not_found
213if 'CONFIG_RBD' in config_host
214 rbd = declare_dependency(link_args: config_host['RBD_LIBS'].split())
215endif
216glusterfs = not_found
217if 'CONFIG_GLUSTERFS' in config_host
218 glusterfs = declare_dependency(compile_args: config_host['GLUSTERFS_CFLAGS'].split(),
219 link_args: config_host['GLUSTERFS_LIBS'].split())
220endif
221libssh = not_found
222if 'CONFIG_LIBSSH' in config_host
223 libssh = declare_dependency(compile_args: config_host['LIBSSH_CFLAGS'].split(),
224 link_args: config_host['LIBSSH_LIBS'].split())
225endif
226libbzip2 = not_found
227if 'CONFIG_BZIP2' in config_host
228 libbzip2 = declare_dependency(link_args: config_host['BZIP2_LIBS'].split())
229endif
230liblzfse = not_found
231if 'CONFIG_LZFSE' in config_host
232 liblzfse = declare_dependency(link_args: config_host['LZFSE_LIBS'].split())
233endif
Paolo Bonzini478e9432020-08-17 12:47:55 +0200234oss = not_found
235if 'CONFIG_AUDIO_OSS' in config_host
236 oss = declare_dependency(link_args: config_host['OSS_LIBS'].split())
237endif
238dsound = not_found
239if 'CONFIG_AUDIO_DSOUND' in config_host
240 dsound = declare_dependency(link_args: config_host['DSOUND_LIBS'].split())
241endif
242coreaudio = not_found
243if 'CONFIG_AUDIO_COREAUDIO' in config_host
244 coreaudio = declare_dependency(link_args: config_host['COREAUDIO_LIBS'].split())
245endif
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400246
Paolo Bonzini2becc362020-02-03 11:42:03 +0100247create_config = find_program('scripts/create_config')
248minikconf = find_program('scripts/minikconf.py')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400249target_dirs = config_host['TARGET_DIRS'].split()
250have_user = false
251have_system = false
Paolo Bonzini2becc362020-02-03 11:42:03 +0100252config_devices_mak_list = []
253config_devices_h = {}
254config_target_mak = {}
255kconfig_external_symbols = [
256 'CONFIG_KVM',
257 'CONFIG_XEN',
258 'CONFIG_TPM',
259 'CONFIG_SPICE',
260 'CONFIG_IVSHMEM',
261 'CONFIG_OPENGL',
262 'CONFIG_X11',
263 'CONFIG_VHOST_USER',
264 'CONFIG_VHOST_KERNEL',
265 'CONFIG_VIRTFS',
266 'CONFIG_LINUX',
267 'CONFIG_PVRDMA',
268]
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400269foreach target : target_dirs
270 have_user = have_user or target.endswith('-user')
Paolo Bonzini2becc362020-02-03 11:42:03 +0100271 config_target = keyval.load(meson.current_build_dir() / target / 'config-target.mak') + config_host
272
273 if target.endswith('-softmmu')
274 have_system = true
275
276 base_kconfig = []
277 foreach sym : kconfig_external_symbols
278 if sym in config_target
279 base_kconfig += '@0@=y'.format(sym)
280 endif
281 endforeach
282
283 config_devices_mak = target + '-config-devices.mak'
284 config_devices_mak = configure_file(
285 input: ['default-configs' / target + '.mak', 'Kconfig'],
286 output: config_devices_mak,
287 depfile: config_devices_mak + '.d',
288 capture: true,
289 command: [minikconf, config_host['CONFIG_MINIKCONF_MODE'],
290 config_devices_mak, '@DEPFILE@', '@INPUT@',
291 base_kconfig])
292 config_devices_h += {target: custom_target(
293 target + '-config-devices.h',
294 input: config_devices_mak,
295 output: target + '-config-devices.h',
296 capture: true,
297 command: [create_config, '@INPUT@'])}
298 config_devices_mak_list += config_devices_mak
299 config_target += keyval.load(config_devices_mak)
300 endif
301 config_target_mak += {target: config_target}
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400302endforeach
303have_tools = 'CONFIG_TOOLS' in config_host
304have_block = have_system or have_tools
305
Paolo Bonzini2becc362020-02-03 11:42:03 +0100306grepy = find_program('scripts/grepy.sh')
307# This configuration is used to build files that are shared by
308# multiple binaries, and then extracted out of the "common"
309# static_library target.
310#
311# We do not use all_sources()/all_dependencies(), because it would
312# build literally all source files, including devices only used by
313# targets that are not built for this compilation. The CONFIG_ALL
314# pseudo symbol replaces it.
315
316if have_system
317 config_all_devices_mak = configure_file(
318 output: 'config-all-devices.mak',
319 input: config_devices_mak_list,
320 capture: true,
321 command: [grepy, '@INPUT@'],
322 )
323 config_all_devices = keyval.load(config_all_devices_mak)
324else
325 config_all_devices = {}
326endif
327config_all = config_all_devices
328config_all += config_host
329config_all += config_all_disas
330config_all += {
331 'CONFIG_XEN': config_host.has_key('CONFIG_XEN_BACKEND'),
332 'CONFIG_SOFTMMU': have_system,
333 'CONFIG_USER_ONLY': have_user,
334 'CONFIG_ALL': true,
335}
336
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400337# Generators
338
Marc-André Lureau2c273f32019-07-15 17:10:19 +0400339genh = []
Marc-André Lureau3f885652019-07-15 18:06:04 +0400340hxtool = find_program('scripts/hxtool')
Marc-André Lureau650b5d52019-07-15 17:36:47 +0400341shaderinclude = find_program('scripts/shaderinclude.pl')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400342qapi_gen = find_program('scripts/qapi-gen.py')
343qapi_gen_depends = [ meson.source_root() / 'scripts/qapi/__init__.py',
344 meson.source_root() / 'scripts/qapi/commands.py',
345 meson.source_root() / 'scripts/qapi/common.py',
346 meson.source_root() / 'scripts/qapi/doc.py',
347 meson.source_root() / 'scripts/qapi/error.py',
348 meson.source_root() / 'scripts/qapi/events.py',
349 meson.source_root() / 'scripts/qapi/expr.py',
350 meson.source_root() / 'scripts/qapi/gen.py',
351 meson.source_root() / 'scripts/qapi/introspect.py',
352 meson.source_root() / 'scripts/qapi/parser.py',
353 meson.source_root() / 'scripts/qapi/schema.py',
354 meson.source_root() / 'scripts/qapi/source.py',
355 meson.source_root() / 'scripts/qapi/types.py',
356 meson.source_root() / 'scripts/qapi/visit.py',
357 meson.source_root() / 'scripts/qapi/common.py',
358 meson.source_root() / 'scripts/qapi/doc.py',
359 meson.source_root() / 'scripts/qapi-gen.py'
360]
361
362tracetool = [
363 python, files('scripts/tracetool.py'),
364 '--backend=' + config_host['TRACE_BACKENDS']
365]
366
Marc-André Lureau2c273f32019-07-15 17:10:19 +0400367qemu_version_cmd = [find_program('scripts/qemu-version.sh'),
368 meson.current_source_dir(),
369 config_host['PKGVERSION'], config_host['VERSION']]
370qemu_version = custom_target('qemu-version.h',
371 output: 'qemu-version.h',
372 command: qemu_version_cmd,
373 capture: true,
374 build_by_default: true,
375 build_always_stale: true)
376genh += qemu_version
377
Paolo Bonzini2becc362020-02-03 11:42:03 +0100378config_host_h = custom_target('config-host.h',
379 input: meson.current_build_dir() / 'config-host.mak',
380 output: 'config-host.h',
381 capture: true,
382 command: [create_config, '@INPUT@'])
383genh += config_host_h
384
Marc-André Lureau3f885652019-07-15 18:06:04 +0400385hxdep = []
386hx_headers = [
387 ['qemu-options.hx', 'qemu-options.def'],
388 ['qemu-img-cmds.hx', 'qemu-img-cmds.h'],
389]
390if have_system
391 hx_headers += [
392 ['hmp-commands.hx', 'hmp-commands.h'],
393 ['hmp-commands-info.hx', 'hmp-commands-info.h'],
394 ]
395endif
396foreach d : hx_headers
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +0400397 hxdep += custom_target(d[1],
Marc-André Lureau3f885652019-07-15 18:06:04 +0400398 input: files(d[0]),
399 output: d[1],
400 capture: true,
401 build_by_default: true, # to be removed when added to a target
402 command: [hxtool, '-h', '@INPUT0@'])
403endforeach
404genh += hxdep
405
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400406# Collect sourcesets.
407
408util_ss = ss.source_set()
409stub_ss = ss.source_set()
410trace_ss = ss.source_set()
Marc-André Lureau3154fee2019-08-29 22:07:01 +0400411block_ss = ss.source_set()
Paolo Bonzini2becc362020-02-03 11:42:03 +0100412common_ss = ss.source_set()
413softmmu_ss = ss.source_set()
414user_ss = ss.source_set()
415bsd_user_ss = ss.source_set()
416linux_user_ss = ss.source_set()
417specific_ss = ss.source_set()
418
Marc-André Lureau3154fee2019-08-29 22:07:01 +0400419modules = {}
Paolo Bonzini2becc362020-02-03 11:42:03 +0100420hw_arch = {}
421target_arch = {}
422target_softmmu_arch = {}
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400423
424###############
425# Trace files #
426###############
427
428trace_events_subdirs = [
429 'accel/kvm',
430 'accel/tcg',
431 'crypto',
432 'monitor',
433]
434if have_user
435 trace_events_subdirs += [ 'linux-user' ]
436endif
437if have_block
438 trace_events_subdirs += [
439 'authz',
440 'block',
441 'io',
442 'nbd',
443 'scsi',
444 ]
445endif
446if have_system
447 trace_events_subdirs += [
448 'audio',
449 'backends',
450 'backends/tpm',
451 'chardev',
452 'hw/9pfs',
453 'hw/acpi',
454 'hw/alpha',
455 'hw/arm',
456 'hw/audio',
457 'hw/block',
458 'hw/block/dataplane',
459 'hw/char',
460 'hw/display',
461 'hw/dma',
462 'hw/hppa',
463 'hw/hyperv',
464 'hw/i2c',
465 'hw/i386',
466 'hw/i386/xen',
467 'hw/ide',
468 'hw/input',
469 'hw/intc',
470 'hw/isa',
471 'hw/mem',
472 'hw/mips',
473 'hw/misc',
474 'hw/misc/macio',
475 'hw/net',
476 'hw/nvram',
477 'hw/pci',
478 'hw/pci-host',
479 'hw/ppc',
480 'hw/rdma',
481 'hw/rdma/vmw',
482 'hw/rtc',
483 'hw/s390x',
484 'hw/scsi',
485 'hw/sd',
486 'hw/sparc',
487 'hw/sparc64',
488 'hw/ssi',
489 'hw/timer',
490 'hw/tpm',
491 'hw/usb',
492 'hw/vfio',
493 'hw/virtio',
494 'hw/watchdog',
495 'hw/xen',
496 'hw/gpio',
497 'hw/riscv',
498 'migration',
499 'net',
500 'ui',
501 ]
502endif
503trace_events_subdirs += [
504 'hw/core',
505 'qapi',
506 'qom',
507 'target/arm',
508 'target/hppa',
509 'target/i386',
510 'target/mips',
511 'target/ppc',
512 'target/riscv',
513 'target/s390x',
514 'target/sparc',
515 'util',
516]
517
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400518subdir('qapi')
519subdir('qobject')
520subdir('stubs')
521subdir('trace')
522subdir('util')
Marc-André Lureau5582c582019-07-16 19:28:54 +0400523subdir('qom')
524subdir('authz')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400525subdir('crypto')
526subdir('storage-daemon')
Marc-André Lureau2d78b562019-07-15 16:00:36 +0400527subdir('ui')
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400528
Marc-André Lureau3154fee2019-08-29 22:07:01 +0400529
530if enable_modules
531 libmodulecommon = static_library('module-common', files('module-common.c') + genh, pic: true, c_args: '-DBUILD_DSO')
532 modulecommon = declare_dependency(link_whole: libmodulecommon, compile_args: '-DBUILD_DSO')
533endif
534
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400535# Build targets from sourcesets
536
Paolo Bonzini2becc362020-02-03 11:42:03 +0100537stub_ss = stub_ss.apply(config_all, strict: false)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400538
539util_ss.add_all(trace_ss)
Paolo Bonzini2becc362020-02-03 11:42:03 +0100540util_ss = util_ss.apply(config_all, strict: false)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400541libqemuutil = static_library('qemuutil',
542 sources: util_ss.sources() + stub_ss.sources() + genh,
543 dependencies: [util_ss.dependencies(), m, glib, socket])
544qemuutil = declare_dependency(link_with: libqemuutil,
Marc-André Lureau04c6f1e2019-07-18 00:31:05 +0400545 sources: genh + version_res)
Paolo Bonzinia81df1b2020-08-19 08:44:56 -0400546
Paolo Bonzini478e9432020-08-17 12:47:55 +0200547subdir('audio')
Marc-André Lureau7fcfd452019-07-16 19:33:55 +0400548subdir('io')
Marc-André Lureau848e8ff2019-07-15 23:18:07 +0400549subdir('chardev')
Marc-André Lureauec0d5892019-07-15 15:04:49 +0400550subdir('fsdev')
Marc-André Lureaud3b18482019-08-17 14:55:32 +0400551subdir('target')
Marc-André Lureauec0d5892019-07-15 15:04:49 +0400552
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400553block_ss.add(files(
554 'block.c',
555 'blockjob.c',
556 'job.c',
557 'qemu-io-cmds.c',
558))
559block_ss.add(when: 'CONFIG_REPLICATION', if_true: files('replication.c'))
560
561subdir('nbd')
562subdir('scsi')
563subdir('block')
564
Paolo Bonzinia2ce7db2020-08-04 20:00:40 +0200565# needed for fuzzing binaries
566subdir('tests/qtest/libqos')
567
Marc-André Lureau3154fee2019-08-29 22:07:01 +0400568block_mods = []
569softmmu_mods = []
570foreach d, list : modules
571 foreach m, module_ss : list
572 if enable_modules and targetos != 'windows'
573 module_ss = module_ss.apply(config_host, strict: false)
574 sl = static_library(d + '-' + m, [genh, module_ss.sources()],
575 dependencies: [modulecommon, module_ss.dependencies()], pic: true)
576 if d == 'block'
577 block_mods += sl
578 else
579 softmmu_mods += sl
580 endif
581 else
582 if d == 'block'
583 block_ss.add_all(module_ss)
584 else
585 softmmu_ss.add_all(module_ss)
586 endif
587 endif
588 endforeach
589endforeach
590
591nm = find_program('nm')
592undefsym = find_program('scripts/undefsym.sh')
593block_syms = custom_target('block.syms', output: 'block.syms',
594 input: [libqemuutil, block_mods],
595 capture: true,
596 command: [undefsym, nm, '@INPUT@'])
597qemu_syms = custom_target('qemu.syms', output: 'qemu.syms',
598 input: [libqemuutil, softmmu_mods],
599 capture: true,
600 command: [undefsym, nm, '@INPUT@'])
601
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400602block_ss = block_ss.apply(config_host, strict: false)
603libblock = static_library('block', block_ss.sources() + genh,
604 dependencies: block_ss.dependencies(),
605 link_depends: block_syms,
606 name_suffix: 'fa',
607 build_by_default: false)
608
609block = declare_dependency(link_whole: [libblock],
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +0400610 link_args: '@block.syms',
611 dependencies: [crypto, io])
Marc-André Lureau5e5733e2019-08-29 22:34:43 +0400612
Marc-André Lureau3154fee2019-08-29 22:07:01 +0400613foreach m : block_mods + softmmu_mods
614 shared_module(m.name(),
615 name_prefix: '',
616 link_whole: m,
617 install: true,
618 install_dir: config_host['qemu_moddir'])
619endforeach
620
Paolo Bonzini2becc362020-02-03 11:42:03 +0100621common_ss.add_all(when: 'CONFIG_SOFTMMU', if_true: softmmu_ss)
622common_ss.add_all(when: 'CONFIG_USER_ONLY', if_true: user_ss)
623
624common_all = common_ss.apply(config_all, strict: false)
625common_all = static_library('common',
626 build_by_default: false,
627 sources: common_all.sources() + genh,
628 dependencies: common_all.dependencies(),
629 name_suffix: 'fa')
630
631foreach target : target_dirs
632 config_target = config_target_mak[target]
633 target_name = config_target['TARGET_NAME']
634 arch = config_target['TARGET_BASE_ARCH']
635 arch_srcs = []
636
637 target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
638 if targetos == 'linux'
639 target_inc += include_directories('linux-headers', is_system: true)
640 endif
641 if target.endswith('-softmmu')
642 qemu_target_name = 'qemu-system-' + target_name
643 target_type='system'
644 arch_srcs += config_devices_h[target]
645 else
646 target_type='user'
647 qemu_target_name = 'qemu-' + target_name
648 if 'CONFIG_LINUX_USER' in config_target
649 base_dir = 'linux-user'
650 target_inc += include_directories('linux-user/host/' / config_host['ARCH'])
651 else
652 base_dir = 'bsd-user'
653 endif
654 target_inc += include_directories(
655 base_dir,
656 base_dir / config_target['TARGET_ABI_DIR'],
657 )
658 endif
659
660 target_common = common_ss.apply(config_target, strict: false)
661 objects = common_all.extract_objects(target_common.sources())
662
663 # TODO: Change to generator once obj-y goes away
664 config_target_h = custom_target(target + '-config-target.h',
665 input: meson.current_build_dir() / target / 'config-target.mak',
666 output: target + '-config-target.h',
667 capture: true,
668 command: [create_config, '@INPUT@'])
669
670 target_specific = specific_ss.apply(config_target, strict: false)
671 arch_srcs += target_specific.sources()
672
673 static_library('qemu-' + target,
674 sources: arch_srcs + [config_target_h] + genh,
675 objects: objects,
676 include_directories: target_inc,
677 c_args: ['-DNEED_CPU_H',
678 '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
679 '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)],
680 name_suffix: 'fa')
681endforeach
682
Paolo Bonzini931049b2020-02-05 09:44:24 +0100683# Other build targets
Marc-André Lureau897b5af2019-07-16 21:54:15 +0400684
Paolo Bonzinif15bff22019-07-18 13:19:02 +0200685if 'CONFIG_GUEST_AGENT' in config_host
686 subdir('qga')
687endif
688
Paolo Bonzini931049b2020-02-05 09:44:24 +0100689if have_tools
Marc-André Lureaub7c70bf2019-07-16 21:37:25 +0400690 qemu_img = executable('qemu-img', [files('qemu-img.c'), hxdep],
691 dependencies: [authz, block, crypto, io, qom, qemuutil], install: true)
692 qemu_io = executable('qemu-io', files('qemu-io.c'),
693 dependencies: [block, qemuutil], install: true)
694 if targetos == 'linux' or targetos == 'sunos' or targetos.endswith('bsd')
695 qemu_nbd = executable('qemu-nbd', files('qemu-nbd.c'),
696 dependencies: [block, qemuutil], install: true)
697 endif
698
Paolo Bonzinia9c97272019-06-10 12:27:52 +0200699 subdir('contrib/rdmacm-mux')
Marc-André Lureau1d7bb6a2019-07-12 23:47:06 +0400700 subdir('contrib/elf2dmp')
Paolo Bonzinia9c97272019-06-10 12:27:52 +0200701
Marc-André Lureauade60d42019-07-15 14:48:31 +0400702 if 'CONFIG_XKBCOMMON' in config_host
703 executable('qemu-keymap', files('qemu-keymap.c', 'ui/input-keymap.c'),
704 dependencies: [qemuutil, xkbcommon], install: true)
705 endif
706
Marc-André Lureau157e7b12019-07-15 14:50:58 +0400707 executable('qemu-edid', files('qemu-edid.c', 'hw/display/edid-generate.c'),
708 dependencies: qemuutil,
709 install: true)
710
Paolo Bonzini931049b2020-02-05 09:44:24 +0100711 if 'CONFIG_VHOST_USER' in config_host
712 subdir('contrib/libvhost-user')
Paolo Bonzini2d7ac0a2019-06-10 12:18:02 +0200713 subdir('contrib/vhost-user-blk')
Marc-André Lureauea458962019-07-12 22:23:46 +0400714 if 'CONFIG_LINUX' in config_host
715 subdir('contrib/vhost-user-gpu')
716 endif
Marc-André Lureau32fcc622019-07-12 22:11:20 +0400717 subdir('contrib/vhost-user-input')
Paolo Bonzini99650b62019-06-10 12:21:14 +0200718 subdir('contrib/vhost-user-scsi')
Paolo Bonzini931049b2020-02-05 09:44:24 +0100719 endif
Marc-André Lureau8f51e012019-07-15 14:39:25 +0400720
721 if targetos == 'linux'
722 executable('qemu-bridge-helper', files('qemu-bridge-helper.c'),
723 dependencies: [qemuutil, libcap_ng],
724 install: true,
725 install_dir: get_option('libexecdir'))
Marc-André Lureau897b5af2019-07-16 21:54:15 +0400726
727 executable('qemu-pr-helper', files('scsi/qemu-pr-helper.c', 'scsi/utils.c'),
728 dependencies: [authz, crypto, io, qom, qemuutil,
729 libcap_ng, libudev, libmpathpersist],
730 install: true)
Marc-André Lureau8f51e012019-07-15 14:39:25 +0400731 endif
732
Marc-André Lureau5ee24e72019-07-12 23:16:54 +0400733 if 'CONFIG_IVSHMEM' in config_host
734 subdir('contrib/ivshmem-client')
735 subdir('contrib/ivshmem-server')
736 endif
Paolo Bonzini931049b2020-02-05 09:44:24 +0100737endif
738
Paolo Bonzini3f99cf52020-02-05 09:45:39 +0100739subdir('tools')
Marc-André Lureaubdcbea72019-07-15 21:22:31 +0400740subdir('pc-bios')
Paolo Bonzinice1c1e72020-01-28 16:41:44 +0100741subdir('tests')
Paolo Bonzini3f99cf52020-02-05 09:45:39 +0100742
Paolo Bonzinif9332752020-02-03 13:28:38 +0100743summary_info = {}
744summary_info += {'Install prefix': config_host['prefix']}
745summary_info += {'BIOS directory': config_host['qemu_datadir']}
746summary_info += {'firmware path': config_host['qemu_firmwarepath']}
747summary_info += {'binary directory': config_host['bindir']}
748summary_info += {'library directory': config_host['libdir']}
749summary_info += {'module directory': config_host['qemu_moddir']}
750summary_info += {'libexec directory': config_host['libexecdir']}
751summary_info += {'include directory': config_host['includedir']}
752summary_info += {'config directory': config_host['sysconfdir']}
753if targetos != 'windows'
754 summary_info += {'local state directory': config_host['qemu_localstatedir']}
755 summary_info += {'Manual directory': config_host['mandir']}
756else
757 summary_info += {'local state directory': 'queried at runtime'}
758endif
759summary_info += {'Build directory': meson.current_build_dir()}
760summary_info += {'Source path': meson.current_source_dir()}
761summary_info += {'GIT binary': config_host['GIT']}
762summary_info += {'GIT submodules': config_host['GIT_SUBMODULES']}
763summary_info += {'C compiler': meson.get_compiler('c').cmd_array()[0]}
764summary_info += {'Host C compiler': meson.get_compiler('c', native: true).cmd_array()[0]}
765if link_language == 'cpp'
766 summary_info += {'C++ compiler': meson.get_compiler('cpp').cmd_array()[0]}
767else
768 summary_info += {'C++ compiler': false}
769endif
770if targetos == 'darwin'
771 summary_info += {'Objective-C compiler': meson.get_compiler('objc').cmd_array()[0]}
772endif
773summary_info += {'ARFLAGS': config_host['ARFLAGS']}
774summary_info += {'CFLAGS': config_host['CFLAGS']}
775summary_info += {'QEMU_CFLAGS': config_host['QEMU_CFLAGS']}
776summary_info += {'QEMU_LDFLAGS': config_host['QEMU_LDFLAGS']}
777summary_info += {'make': config_host['MAKE']}
778summary_info += {'install': config_host['INSTALL']}
779summary_info += {'python': '@0@ (version: @1@)'.format(python.full_path(), python.language_version())}
780summary_info += {'sphinx-build': config_host['SPHINX_BUILD']}
781summary_info += {'genisoimage': config_host['GENISOIMAGE']}
782# TODO: add back version
783summary_info += {'slirp support': config_host.has_key('CONFIG_SLIRP')}
784if config_host.has_key('CONFIG_SLIRP')
785 summary_info += {'smbd': config_host['CONFIG_SMBD_COMMAND']}
786endif
787summary_info += {'module support': config_host.has_key('CONFIG_MODULES')}
788if config_host.has_key('CONFIG_MODULES')
789 summary_info += {'alternative module path': config_host.has_key('CONFIG_MODULE_UPGRADES')}
790endif
791summary_info += {'host CPU': cpu}
792summary_info += {'host endianness': build_machine.endian()}
793summary_info += {'target list': config_host['TARGET_DIRS']}
794summary_info += {'gprof enabled': config_host.has_key('CONFIG_GPROF')}
795summary_info += {'sparse enabled': meson.get_compiler('c').cmd_array().contains('cgcc')}
796summary_info += {'strip binaries': get_option('strip')}
797summary_info += {'profiler': config_host.has_key('CONFIG_PROFILER')}
798summary_info += {'static build': config_host.has_key('CONFIG_TOOLS')}
799if targetos == 'darwin'
800 summary_info += {'Cocoa support': config_host.has_key('CONFIG_COCOA')}
801endif
802# TODO: add back version
803summary_info += {'SDL support': config_host.has_key('CONFIG_SDL')}
804summary_info += {'SDL image support': config_host.has_key('CONFIG_SDL_IMAGE')}
805# TODO: add back version
806summary_info += {'GTK support': config_host.has_key('CONFIG_GTK')}
807summary_info += {'GTK GL support': config_host.has_key('CONFIG_GTK_GL')}
808# TODO: add back version
809summary_info += {'VTE support': config_host.has_key('CONFIG_VTE')}
810summary_info += {'TLS priority': config_host['CONFIG_TLS_PRIORITY']}
811summary_info += {'GNUTLS support': config_host.has_key('CONFIG_GNUTLS')}
812# TODO: add back version
813summary_info += {'libgcrypt': config_host.has_key('CONFIG_GCRYPT')}
814if config_host.has_key('CONFIG_GCRYPT')
815 summary_info += {' hmac': config_host.has_key('CONFIG_GCRYPT_HMAC')}
816 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
817endif
818# TODO: add back version
819summary_info += {'nettle': config_host.has_key('CONFIG_NETTLE')}
820if config_host.has_key('CONFIG_NETTLE')
821 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
822endif
823summary_info += {'libtasn1': config_host.has_key('CONFIG_TASN1')}
824summary_info += {'PAM': config_host.has_key('CONFIG_AUTH_PAM')}
825summary_info += {'iconv support': config_host.has_key('CONFIG_ICONV')}
826summary_info += {'curses support': config_host.has_key('CONFIG_CURSES')}
827# TODO: add back version
828summary_info += {'virgl support': config_host.has_key('CONFIG_VIRGL')}
829summary_info += {'curl support': config_host.has_key('CONFIG_CURL')}
830summary_info += {'mingw32 support': targetos == 'windows'}
831summary_info += {'Audio drivers': config_host['CONFIG_AUDIO_DRIVERS']}
832summary_info += {'Block whitelist (rw)': config_host['CONFIG_BDRV_RW_WHITELIST']}
833summary_info += {'Block whitelist (ro)': config_host['CONFIG_BDRV_RO_WHITELIST']}
834summary_info += {'VirtFS support': config_host.has_key('CONFIG_VIRTFS')}
835summary_info += {'Multipath support': config_host.has_key('CONFIG_MPATH')}
836summary_info += {'VNC support': config_host.has_key('CONFIG_VNC')}
837if config_host.has_key('CONFIG_VNC')
838 summary_info += {'VNC SASL support': config_host.has_key('CONFIG_VNC_SASL')}
839 summary_info += {'VNC JPEG support': config_host.has_key('CONFIG_VNC_JPEG')}
840 summary_info += {'VNC PNG support': config_host.has_key('CONFIG_VNC_PNG')}
841endif
842summary_info += {'xen support': config_host.has_key('CONFIG_XEN_BACKEND')}
843if config_host.has_key('CONFIG_XEN_BACKEND')
844 summary_info += {'xen ctrl version': config_host['CONFIG_XEN_CTRL_INTERFACE_VERSION']}
845endif
846summary_info += {'brlapi support': config_host.has_key('CONFIG_BRLAPI')}
847summary_info += {'Documentation': config_host.has_key('BUILD_DOCS')}
848summary_info += {'PIE': get_option('b_pie')}
849summary_info += {'vde support': config_host.has_key('CONFIG_VDE')}
850summary_info += {'netmap support': config_host.has_key('CONFIG_NETMAP')}
851summary_info += {'Linux AIO support': config_host.has_key('CONFIG_LINUX_AIO')}
852summary_info += {'Linux io_uring support': config_host.has_key('CONFIG_LINUX_IO_URING')}
853summary_info += {'ATTR/XATTR support': config_host.has_key('CONFIG_ATTR')}
854summary_info += {'Install blobs': config_host.has_key('INSTALL_BLOBS')}
855# TODO: add back KVM/HAX/HVF/WHPX/TCG
856#summary_info += {'KVM support': have_kvm'}
857#summary_info += {'HAX support': have_hax'}
858#summary_info += {'HVF support': have_hvf'}
859#summary_info += {'WHPX support': have_whpx'}
860#summary_info += {'TCG support': have_tcg'}
861#if get_option('tcg')
862# summary_info += {'TCG debug enabled': config_host.has_key('CONFIG_DEBUG_TCG')}
863# summary_info += {'TCG interpreter': config_host.has_key('CONFIG_TCG_INTERPRETER')}
864#endif
865summary_info += {'malloc trim support': config_host.has_key('CONFIG_MALLOC_TRIM')}
866summary_info += {'RDMA support': config_host.has_key('CONFIG_RDMA')}
867summary_info += {'PVRDMA support': config_host.has_key('CONFIG_PVRDMA')}
868summary_info += {'fdt support': config_host.has_key('CONFIG_FDT')}
869summary_info += {'membarrier': config_host.has_key('CONFIG_MEMBARRIER')}
870summary_info += {'preadv support': config_host.has_key('CONFIG_PREADV')}
871summary_info += {'fdatasync': config_host.has_key('CONFIG_FDATASYNC')}
872summary_info += {'madvise': config_host.has_key('CONFIG_MADVISE')}
873summary_info += {'posix_madvise': config_host.has_key('CONFIG_POSIX_MADVISE')}
874summary_info += {'posix_memalign': config_host.has_key('CONFIG_POSIX_MEMALIGN')}
875summary_info += {'libcap-ng support': config_host.has_key('CONFIG_LIBCAP_NG')}
876summary_info += {'vhost-net support': config_host.has_key('CONFIG_VHOST_NET')}
877summary_info += {'vhost-crypto support': config_host.has_key('CONFIG_VHOST_CRYPTO')}
878summary_info += {'vhost-scsi support': config_host.has_key('CONFIG_VHOST_SCSI')}
879summary_info += {'vhost-vsock support': config_host.has_key('CONFIG_VHOST_VSOCK')}
880summary_info += {'vhost-user support': config_host.has_key('CONFIG_VHOST_KERNEL')}
881summary_info += {'vhost-user-fs support': config_host.has_key('CONFIG_VHOST_USER_FS')}
882summary_info += {'vhost-vdpa support': config_host.has_key('CONFIG_VHOST_VDPA')}
883summary_info += {'Trace backends': config_host['TRACE_BACKENDS']}
884if config_host['TRACE_BACKENDS'].split().contains('simple')
885 summary_info += {'Trace output file': config_host['CONFIG_TRACE_FILE'] + '-<pid>'}
886endif
887# TODO: add back protocol and server version
888summary_info += {'spice support': config_host.has_key('CONFIG_SPICE')}
889summary_info += {'rbd support': config_host.has_key('CONFIG_RBD')}
890summary_info += {'xfsctl support': config_host.has_key('CONFIG_XFS')}
891summary_info += {'smartcard support': config_host.has_key('CONFIG_SMARTCARD')}
892summary_info += {'libusb': config_host.has_key('CONFIG_USB_LIBUSB')}
893summary_info += {'usb net redir': config_host.has_key('CONFIG_USB_REDIR')}
894summary_info += {'OpenGL support': config_host.has_key('CONFIG_OPENGL')}
895summary_info += {'OpenGL dmabufs': config_host.has_key('CONFIG_OPENGL_DMABUF')}
896summary_info += {'libiscsi support': config_host.has_key('CONFIG_LIBISCSI')}
897summary_info += {'libnfs support': config_host.has_key('CONFIG_LIBNFS')}
898summary_info += {'build guest agent': config_host.has_key('CONFIG_GUEST_AGENT')}
899if targetos == 'windows'
900 if 'WIN_SDK' in config_host
901 summary_info += {'Windows SDK': config_host['WIN_SDK']}
902 endif
903 summary_info += {'QGA VSS support': config_host.has_key('CONFIG_QGA_VSS')}
904 summary_info += {'QGA w32 disk info': config_host.has_key('CONFIG_QGA_NTDDSCSI')}
905 summary_info += {'QGA MSI support': config_host.has_key('CONFIG_QGA_MSI_ENABLED')}
906endif
907summary_info += {'seccomp support': config_host.has_key('CONFIG_SECCOMP')}
908summary_info += {'coroutine backend': config_host['CONFIG_COROUTINE_BACKEND']}
909summary_info += {'coroutine pool': config_host['CONFIG_COROUTINE_POOL'] == '1'}
910summary_info += {'debug stack usage': config_host.has_key('CONFIG_DEBUG_STACK_USAGE')}
911summary_info += {'mutex debugging': config_host.has_key('CONFIG_DEBUG_MUTEX')}
912summary_info += {'crypto afalg': config_host.has_key('CONFIG_AF_ALG')}
913summary_info += {'GlusterFS support': config_host.has_key('CONFIG_GLUSTERFS')}
Marc-André Lureaubf0e56a2019-10-04 17:35:16 +0400914summary_info += {'gcov': get_option('b_coverage')}
Paolo Bonzinif9332752020-02-03 13:28:38 +0100915summary_info += {'TPM support': config_host.has_key('CONFIG_TPM')}
916summary_info += {'libssh support': config_host.has_key('CONFIG_LIBSSH')}
917summary_info += {'QOM debugging': config_host.has_key('CONFIG_QOM_CAST_DEBUG')}
918summary_info += {'Live block migration': config_host.has_key('CONFIG_LIVE_BLOCK_MIGRATION')}
919summary_info += {'lzo support': config_host.has_key('CONFIG_LZO')}
920summary_info += {'snappy support': config_host.has_key('CONFIG_SNAPPY')}
921summary_info += {'bzip2 support': config_host.has_key('CONFIG_BZIP2')}
922summary_info += {'lzfse support': config_host.has_key('CONFIG_LZFSE')}
923summary_info += {'zstd support': config_host.has_key('CONFIG_ZSTD')}
924summary_info += {'NUMA host support': config_host.has_key('CONFIG_NUMA')}
925summary_info += {'libxml2': config_host.has_key('CONFIG_LIBXML2')}
926summary_info += {'tcmalloc support': config_host.has_key('CONFIG_TCMALLOC')}
927summary_info += {'jemalloc support': config_host.has_key('CONFIG_JEMALLOC')}
928summary_info += {'avx2 optimization': config_host.has_key('CONFIG_AVX2_OPT')}
929summary_info += {'avx512f optimization': config_host.has_key('CONFIG_AVX512F_OPT')}
930summary_info += {'replication support': config_host.has_key('CONFIG_REPLICATION')}
931summary_info += {'bochs support': config_host.has_key('CONFIG_BOCHS')}
932summary_info += {'cloop support': config_host.has_key('CONFIG_CLOOP')}
933summary_info += {'dmg support': config_host.has_key('CONFIG_DMG')}
934summary_info += {'qcow v1 support': config_host.has_key('CONFIG_QCOW1')}
935summary_info += {'vdi support': config_host.has_key('CONFIG_VDI')}
936summary_info += {'vvfat support': config_host.has_key('CONFIG_VVFAT')}
937summary_info += {'qed support': config_host.has_key('CONFIG_QED')}
938summary_info += {'parallels support': config_host.has_key('CONFIG_PARALLELS')}
939summary_info += {'sheepdog support': config_host.has_key('CONFIG_SHEEPDOG')}
940summary_info += {'capstone': config_host.has_key('CONFIG_CAPSTONE')}
941summary_info += {'libpmem support': config_host.has_key('CONFIG_LIBPMEM')}
942summary_info += {'libdaxctl support': config_host.has_key('CONFIG_LIBDAXCTL')}
943summary_info += {'libudev': config_host.has_key('CONFIG_LIBUDEV')}
944summary_info += {'default devices': config_host['CONFIG_MINIKCONF_MODE'] == '--defconfig'}
945summary_info += {'plugin support': config_host.has_key('CONFIG_PLUGIN')}
946summary_info += {'fuzzing support': config_host.has_key('CONFIG_FUZZ')}
947if config_host.has_key('HAVE_GDB_BIN')
948 summary_info += {'gdb': config_host['HAVE_GDB_BIN']}
949endif
950summary_info += {'thread sanitizer': config_host.has_key('CONFIG_TSAN')}
951summary_info += {'rng-none': config_host.has_key('CONFIG_RNG_NONE')}
952summary_info += {'Linux keyring': config_host.has_key('CONFIG_SECRET_KEYRING')}
953summary(summary_info, bool_yn: true)
954
955if not supported_cpus.contains(cpu)
956 message()
957 warning('SUPPORT FOR THIS HOST CPU WILL GO AWAY IN FUTURE RELEASES!')
958 message()
959 message('CPU host architecture ' + cpu + ' support is not currently maintained.')
960 message('The QEMU project intends to remove support for this host CPU in')
961 message('a future release if nobody volunteers to maintain it and to')
962 message('provide a build host for our continuous integration setup.')
963 message('configure has succeeded and you can continue to build, but')
964 message('if you care about QEMU on this platform you should contact')
965 message('us upstream at qemu-devel@nongnu.org.')
966endif
967
968if not supported_oses.contains(targetos)
969 message()
970 warning('WARNING: SUPPORT FOR THIS HOST OS WILL GO AWAY IN FUTURE RELEASES!')
971 message()
972 message('Host OS ' + targetos + 'support is not currently maintained.')
973 message('The QEMU project intends to remove support for this host OS in')
974 message('a future release if nobody volunteers to maintain it and to')
975 message('provide a build host for our continuous integration setup.')
976 message('configure has succeeded and you can continue to build, but')
977 message('if you care about QEMU on this platform you should contact')
978 message('us upstream at qemu-devel@nongnu.org.')
979endif