]> git.proxmox.com Git - mirror_qemu.git/blame - meson.build
meson: convert chardev directory to Meson (tools part)
[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)
54socket = []
04c6f1e7 55version_res = []
d92989aa
MAL
56coref = []
57iokit = []
58cocoa = []
59hvf = []
a81df1b6
PB
60if targetos == 'windows'
61 socket = cc.find_library('ws2_32')
04c6f1e7
MAL
62
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('.'))
d92989aa
MAL
67elif 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')
cfad62f1
PB
72elif 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')]
a81df1b6
PB
80endif
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
ea458960
MAL
106pixman = declare_dependency(compile_args: config_host['PIXMAN_CFLAGS'].split(),
107 link_args: config_host['PIXMAN_LIBS'].split())
5e7fbd25
MAL
108pam = not_found
109if 'CONFIG_AUTH_PAM' in config_host
110 pam = cc.find_library('pam')
111endif
ec0d5893
MAL
112libattr = not_found
113if 'CONFIG_ATTR' in config_host
114 libattr = declare_dependency(link_args: config_host['LIBATTR_LIBS'].split())
115endif
3f99cf57
PB
116seccomp = not_found
117if 'CONFIG_SECCOMP' in config_host
118 seccomp = declare_dependency(compile_args: config_host['SECCOMP_CFLAGS'].split(),
119 link_args: config_host['SECCOMP_LIBS'].split())
120endif
121libcap_ng = not_found
122if 'CONFIG_LIBCAP_NG' in config_host
123 libcap_ng = declare_dependency(link_args: config_host['LIBCAP_NG_LIBS'].split())
124endif
ade60d4f
MAL
125xkbcommon = not_found
126if 'CONFIG_XKBCOMMON' in config_host
127 xkbcommon = declare_dependency(compile_args: config_host['XKBCOMMON_CFLAGS'].split(),
128 link_args: config_host['XKBCOMMON_LIBS'].split())
129endif
5ee24e78 130rt = cc.find_library('rt', required: false)
99650b62
PB
131libiscsi = not_found
132if 'CONFIG_LIBISCSI' in config_host
133 libiscsi = declare_dependency(compile_args: config_host['LIBISCSI_CFLAGS'].split(),
134 link_args: config_host['LIBISCSI_LIBS'].split())
135endif
ea458960
MAL
136gbm = not_found
137if 'CONFIG_GBM' in config_host
138 gbm = declare_dependency(compile_args: config_host['GBM_CFLAGS'].split(),
139 link_args: config_host['GBM_LIBS'].split())
140endif
141virgl = not_found
142if 'CONFIG_VIRGL' in config_host
143 virgl = declare_dependency(compile_args: config_host['VIRGL_CFLAGS'].split(),
144 link_args: config_host['VIRGL_LIBS'].split())
145endif
1d7bb6ab
MAL
146curl = not_found
147if 'CONFIG_CURL' in config_host
148 curl = declare_dependency(compile_args: config_host['CURL_CFLAGS'].split(),
149 link_args: config_host['CURL_LIBS'].split())
150endif
f15bff25
PB
151libudev = not_found
152if 'CONFIG_LIBUDEV' in config_host
153 libudev = declare_dependency(link_args: config_host['LIBUDEV_LIBS'].split())
154endif
a81df1b6 155
2becc36a
PB
156create_config = find_program('scripts/create_config')
157minikconf = find_program('scripts/minikconf.py')
a81df1b6
PB
158target_dirs = config_host['TARGET_DIRS'].split()
159have_user = false
160have_system = false
2becc36a
PB
161config_devices_mak_list = []
162config_devices_h = {}
163config_target_mak = {}
164kconfig_external_symbols = [
165 'CONFIG_KVM',
166 'CONFIG_XEN',
167 'CONFIG_TPM',
168 'CONFIG_SPICE',
169 'CONFIG_IVSHMEM',
170 'CONFIG_OPENGL',
171 'CONFIG_X11',
172 'CONFIG_VHOST_USER',
173 'CONFIG_VHOST_KERNEL',
174 'CONFIG_VIRTFS',
175 'CONFIG_LINUX',
176 'CONFIG_PVRDMA',
177]
a81df1b6
PB
178foreach target : target_dirs
179 have_user = have_user or target.endswith('-user')
2becc36a
PB
180 config_target = keyval.load(meson.current_build_dir() / target / 'config-target.mak') + config_host
181
182 if target.endswith('-softmmu')
183 have_system = true
184
185 base_kconfig = []
186 foreach sym : kconfig_external_symbols
187 if sym in config_target
188 base_kconfig += '@0@=y'.format(sym)
189 endif
190 endforeach
191
192 config_devices_mak = target + '-config-devices.mak'
193 config_devices_mak = configure_file(
194 input: ['default-configs' / target + '.mak', 'Kconfig'],
195 output: config_devices_mak,
196 depfile: config_devices_mak + '.d',
197 capture: true,
198 command: [minikconf, config_host['CONFIG_MINIKCONF_MODE'],
199 config_devices_mak, '@DEPFILE@', '@INPUT@',
200 base_kconfig])
201 config_devices_h += {target: custom_target(
202 target + '-config-devices.h',
203 input: config_devices_mak,
204 output: target + '-config-devices.h',
205 capture: true,
206 command: [create_config, '@INPUT@'])}
207 config_devices_mak_list += config_devices_mak
208 config_target += keyval.load(config_devices_mak)
209 endif
210 config_target_mak += {target: config_target}
a81df1b6
PB
211endforeach
212have_tools = 'CONFIG_TOOLS' in config_host
213have_block = have_system or have_tools
214
2becc36a
PB
215grepy = find_program('scripts/grepy.sh')
216# This configuration is used to build files that are shared by
217# multiple binaries, and then extracted out of the "common"
218# static_library target.
219#
220# We do not use all_sources()/all_dependencies(), because it would
221# build literally all source files, including devices only used by
222# targets that are not built for this compilation. The CONFIG_ALL
223# pseudo symbol replaces it.
224
225if have_system
226 config_all_devices_mak = configure_file(
227 output: 'config-all-devices.mak',
228 input: config_devices_mak_list,
229 capture: true,
230 command: [grepy, '@INPUT@'],
231 )
232 config_all_devices = keyval.load(config_all_devices_mak)
233else
234 config_all_devices = {}
235endif
236config_all = config_all_devices
237config_all += config_host
238config_all += config_all_disas
239config_all += {
240 'CONFIG_XEN': config_host.has_key('CONFIG_XEN_BACKEND'),
241 'CONFIG_SOFTMMU': have_system,
242 'CONFIG_USER_ONLY': have_user,
243 'CONFIG_ALL': true,
244}
245
a81df1b6
PB
246# Generators
247
2c273f32 248genh = []
3f885659 249hxtool = find_program('scripts/hxtool')
650b5d54 250shaderinclude = find_program('scripts/shaderinclude.pl')
a81df1b6
PB
251qapi_gen = find_program('scripts/qapi-gen.py')
252qapi_gen_depends = [ meson.source_root() / 'scripts/qapi/__init__.py',
253 meson.source_root() / 'scripts/qapi/commands.py',
254 meson.source_root() / 'scripts/qapi/common.py',
255 meson.source_root() / 'scripts/qapi/doc.py',
256 meson.source_root() / 'scripts/qapi/error.py',
257 meson.source_root() / 'scripts/qapi/events.py',
258 meson.source_root() / 'scripts/qapi/expr.py',
259 meson.source_root() / 'scripts/qapi/gen.py',
260 meson.source_root() / 'scripts/qapi/introspect.py',
261 meson.source_root() / 'scripts/qapi/parser.py',
262 meson.source_root() / 'scripts/qapi/schema.py',
263 meson.source_root() / 'scripts/qapi/source.py',
264 meson.source_root() / 'scripts/qapi/types.py',
265 meson.source_root() / 'scripts/qapi/visit.py',
266 meson.source_root() / 'scripts/qapi/common.py',
267 meson.source_root() / 'scripts/qapi/doc.py',
268 meson.source_root() / 'scripts/qapi-gen.py'
269]
270
271tracetool = [
272 python, files('scripts/tracetool.py'),
273 '--backend=' + config_host['TRACE_BACKENDS']
274]
275
2c273f32
MAL
276qemu_version_cmd = [find_program('scripts/qemu-version.sh'),
277 meson.current_source_dir(),
278 config_host['PKGVERSION'], config_host['VERSION']]
279qemu_version = custom_target('qemu-version.h',
280 output: 'qemu-version.h',
281 command: qemu_version_cmd,
282 capture: true,
283 build_by_default: true,
284 build_always_stale: true)
285genh += qemu_version
286
2becc36a
PB
287config_host_h = custom_target('config-host.h',
288 input: meson.current_build_dir() / 'config-host.mak',
289 output: 'config-host.h',
290 capture: true,
291 command: [create_config, '@INPUT@'])
292genh += config_host_h
293
3f885659
MAL
294hxdep = []
295hx_headers = [
296 ['qemu-options.hx', 'qemu-options.def'],
297 ['qemu-img-cmds.hx', 'qemu-img-cmds.h'],
298]
299if have_system
300 hx_headers += [
301 ['hmp-commands.hx', 'hmp-commands.h'],
302 ['hmp-commands-info.hx', 'hmp-commands-info.h'],
303 ]
304endif
305foreach d : hx_headers
306 custom_target(d[1],
307 input: files(d[0]),
308 output: d[1],
309 capture: true,
310 build_by_default: true, # to be removed when added to a target
311 command: [hxtool, '-h', '@INPUT0@'])
312endforeach
313genh += hxdep
314
a81df1b6
PB
315# Collect sourcesets.
316
317util_ss = ss.source_set()
318stub_ss = ss.source_set()
319trace_ss = ss.source_set()
3154fee4 320block_ss = ss.source_set()
2becc36a
PB
321common_ss = ss.source_set()
322softmmu_ss = ss.source_set()
323user_ss = ss.source_set()
324bsd_user_ss = ss.source_set()
325linux_user_ss = ss.source_set()
326specific_ss = ss.source_set()
327
3154fee4 328modules = {}
2becc36a
PB
329hw_arch = {}
330target_arch = {}
331target_softmmu_arch = {}
a81df1b6
PB
332
333###############
334# Trace files #
335###############
336
337trace_events_subdirs = [
338 'accel/kvm',
339 'accel/tcg',
340 'crypto',
341 'monitor',
342]
343if have_user
344 trace_events_subdirs += [ 'linux-user' ]
345endif
346if have_block
347 trace_events_subdirs += [
348 'authz',
349 'block',
350 'io',
351 'nbd',
352 'scsi',
353 ]
354endif
355if have_system
356 trace_events_subdirs += [
357 'audio',
358 'backends',
359 'backends/tpm',
360 'chardev',
361 'hw/9pfs',
362 'hw/acpi',
363 'hw/alpha',
364 'hw/arm',
365 'hw/audio',
366 'hw/block',
367 'hw/block/dataplane',
368 'hw/char',
369 'hw/display',
370 'hw/dma',
371 'hw/hppa',
372 'hw/hyperv',
373 'hw/i2c',
374 'hw/i386',
375 'hw/i386/xen',
376 'hw/ide',
377 'hw/input',
378 'hw/intc',
379 'hw/isa',
380 'hw/mem',
381 'hw/mips',
382 'hw/misc',
383 'hw/misc/macio',
384 'hw/net',
385 'hw/nvram',
386 'hw/pci',
387 'hw/pci-host',
388 'hw/ppc',
389 'hw/rdma',
390 'hw/rdma/vmw',
391 'hw/rtc',
392 'hw/s390x',
393 'hw/scsi',
394 'hw/sd',
395 'hw/sparc',
396 'hw/sparc64',
397 'hw/ssi',
398 'hw/timer',
399 'hw/tpm',
400 'hw/usb',
401 'hw/vfio',
402 'hw/virtio',
403 'hw/watchdog',
404 'hw/xen',
405 'hw/gpio',
406 'hw/riscv',
407 'migration',
408 'net',
409 'ui',
410 ]
411endif
412trace_events_subdirs += [
413 'hw/core',
414 'qapi',
415 'qom',
416 'target/arm',
417 'target/hppa',
418 'target/i386',
419 'target/mips',
420 'target/ppc',
421 'target/riscv',
422 'target/s390x',
423 'target/sparc',
424 'util',
425]
426
a81df1b6
PB
427subdir('qapi')
428subdir('qobject')
429subdir('stubs')
430subdir('trace')
431subdir('util')
5582c58f
MAL
432subdir('qom')
433subdir('authz')
a81df1b6
PB
434subdir('crypto')
435subdir('storage-daemon')
2d78b56e 436subdir('ui')
a81df1b6 437
3154fee4
MAL
438
439if enable_modules
440 libmodulecommon = static_library('module-common', files('module-common.c') + genh, pic: true, c_args: '-DBUILD_DSO')
441 modulecommon = declare_dependency(link_whole: libmodulecommon, compile_args: '-DBUILD_DSO')
442endif
443
a81df1b6
PB
444# Build targets from sourcesets
445
2becc36a 446stub_ss = stub_ss.apply(config_all, strict: false)
a81df1b6
PB
447
448util_ss.add_all(trace_ss)
2becc36a 449util_ss = util_ss.apply(config_all, strict: false)
a81df1b6
PB
450libqemuutil = static_library('qemuutil',
451 sources: util_ss.sources() + stub_ss.sources() + genh,
452 dependencies: [util_ss.dependencies(), m, glib, socket])
453qemuutil = declare_dependency(link_with: libqemuutil,
04c6f1e7 454 sources: genh + version_res)
a81df1b6 455
7fcfd456 456subdir('io')
848e8ff6 457subdir('chardev')
ec0d5893 458subdir('fsdev')
d3b18480 459subdir('target')
ec0d5893 460
3154fee4
MAL
461block_mods = []
462softmmu_mods = []
463foreach d, list : modules
464 foreach m, module_ss : list
465 if enable_modules and targetos != 'windows'
466 module_ss = module_ss.apply(config_host, strict: false)
467 sl = static_library(d + '-' + m, [genh, module_ss.sources()],
468 dependencies: [modulecommon, module_ss.dependencies()], pic: true)
469 if d == 'block'
470 block_mods += sl
471 else
472 softmmu_mods += sl
473 endif
474 else
475 if d == 'block'
476 block_ss.add_all(module_ss)
477 else
478 softmmu_ss.add_all(module_ss)
479 endif
480 endif
481 endforeach
482endforeach
483
484nm = find_program('nm')
485undefsym = find_program('scripts/undefsym.sh')
486block_syms = custom_target('block.syms', output: 'block.syms',
487 input: [libqemuutil, block_mods],
488 capture: true,
489 command: [undefsym, nm, '@INPUT@'])
490qemu_syms = custom_target('qemu.syms', output: 'qemu.syms',
491 input: [libqemuutil, softmmu_mods],
492 capture: true,
493 command: [undefsym, nm, '@INPUT@'])
494
495foreach m : block_mods + softmmu_mods
496 shared_module(m.name(),
497 name_prefix: '',
498 link_whole: m,
499 install: true,
500 install_dir: config_host['qemu_moddir'])
501endforeach
502
2becc36a
PB
503common_ss.add_all(when: 'CONFIG_SOFTMMU', if_true: softmmu_ss)
504common_ss.add_all(when: 'CONFIG_USER_ONLY', if_true: user_ss)
505
506common_all = common_ss.apply(config_all, strict: false)
507common_all = static_library('common',
508 build_by_default: false,
509 sources: common_all.sources() + genh,
510 dependencies: common_all.dependencies(),
511 name_suffix: 'fa')
512
513foreach target : target_dirs
514 config_target = config_target_mak[target]
515 target_name = config_target['TARGET_NAME']
516 arch = config_target['TARGET_BASE_ARCH']
517 arch_srcs = []
518
519 target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
520 if targetos == 'linux'
521 target_inc += include_directories('linux-headers', is_system: true)
522 endif
523 if target.endswith('-softmmu')
524 qemu_target_name = 'qemu-system-' + target_name
525 target_type='system'
526 arch_srcs += config_devices_h[target]
527 else
528 target_type='user'
529 qemu_target_name = 'qemu-' + target_name
530 if 'CONFIG_LINUX_USER' in config_target
531 base_dir = 'linux-user'
532 target_inc += include_directories('linux-user/host/' / config_host['ARCH'])
533 else
534 base_dir = 'bsd-user'
535 endif
536 target_inc += include_directories(
537 base_dir,
538 base_dir / config_target['TARGET_ABI_DIR'],
539 )
540 endif
541
542 target_common = common_ss.apply(config_target, strict: false)
543 objects = common_all.extract_objects(target_common.sources())
544
545 # TODO: Change to generator once obj-y goes away
546 config_target_h = custom_target(target + '-config-target.h',
547 input: meson.current_build_dir() / target / 'config-target.mak',
548 output: target + '-config-target.h',
549 capture: true,
550 command: [create_config, '@INPUT@'])
551
552 target_specific = specific_ss.apply(config_target, strict: false)
553 arch_srcs += target_specific.sources()
554
555 static_library('qemu-' + target,
556 sources: arch_srcs + [config_target_h] + genh,
557 objects: objects,
558 include_directories: target_inc,
559 c_args: ['-DNEED_CPU_H',
560 '-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
561 '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)],
562 name_suffix: 'fa')
563endforeach
564
931049b4 565# Other build targets
f15bff25
PB
566if 'CONFIG_GUEST_AGENT' in config_host
567 subdir('qga')
568endif
569
931049b4 570if have_tools
a9c9727c 571 subdir('contrib/rdmacm-mux')
1d7bb6ab 572 subdir('contrib/elf2dmp')
a9c9727c 573
ade60d4f
MAL
574 if 'CONFIG_XKBCOMMON' in config_host
575 executable('qemu-keymap', files('qemu-keymap.c', 'ui/input-keymap.c'),
576 dependencies: [qemuutil, xkbcommon], install: true)
577 endif
578
157e7b13
MAL
579 executable('qemu-edid', files('qemu-edid.c', 'hw/display/edid-generate.c'),
580 dependencies: qemuutil,
581 install: true)
582
931049b4
PB
583 if 'CONFIG_VHOST_USER' in config_host
584 subdir('contrib/libvhost-user')
2d7ac0af 585 subdir('contrib/vhost-user-blk')
ea458960
MAL
586 if 'CONFIG_LINUX' in config_host
587 subdir('contrib/vhost-user-gpu')
588 endif
32fcc624 589 subdir('contrib/vhost-user-input')
99650b62 590 subdir('contrib/vhost-user-scsi')
931049b4 591 endif
8f51e01c
MAL
592
593 if targetos == 'linux'
594 executable('qemu-bridge-helper', files('qemu-bridge-helper.c'),
595 dependencies: [qemuutil, libcap_ng],
596 install: true,
597 install_dir: get_option('libexecdir'))
598 endif
599
5ee24e78
MAL
600 if 'CONFIG_IVSHMEM' in config_host
601 subdir('contrib/ivshmem-client')
602 subdir('contrib/ivshmem-server')
603 endif
931049b4
PB
604endif
605
3f99cf57 606subdir('tools')
bdcbea7a 607subdir('pc-bios')
ce1c1e7a 608subdir('tests')
3f99cf57 609
f9332757
PB
610summary_info = {}
611summary_info += {'Install prefix': config_host['prefix']}
612summary_info += {'BIOS directory': config_host['qemu_datadir']}
613summary_info += {'firmware path': config_host['qemu_firmwarepath']}
614summary_info += {'binary directory': config_host['bindir']}
615summary_info += {'library directory': config_host['libdir']}
616summary_info += {'module directory': config_host['qemu_moddir']}
617summary_info += {'libexec directory': config_host['libexecdir']}
618summary_info += {'include directory': config_host['includedir']}
619summary_info += {'config directory': config_host['sysconfdir']}
620if targetos != 'windows'
621 summary_info += {'local state directory': config_host['qemu_localstatedir']}
622 summary_info += {'Manual directory': config_host['mandir']}
623else
624 summary_info += {'local state directory': 'queried at runtime'}
625endif
626summary_info += {'Build directory': meson.current_build_dir()}
627summary_info += {'Source path': meson.current_source_dir()}
628summary_info += {'GIT binary': config_host['GIT']}
629summary_info += {'GIT submodules': config_host['GIT_SUBMODULES']}
630summary_info += {'C compiler': meson.get_compiler('c').cmd_array()[0]}
631summary_info += {'Host C compiler': meson.get_compiler('c', native: true).cmd_array()[0]}
632if link_language == 'cpp'
633 summary_info += {'C++ compiler': meson.get_compiler('cpp').cmd_array()[0]}
634else
635 summary_info += {'C++ compiler': false}
636endif
637if targetos == 'darwin'
638 summary_info += {'Objective-C compiler': meson.get_compiler('objc').cmd_array()[0]}
639endif
640summary_info += {'ARFLAGS': config_host['ARFLAGS']}
641summary_info += {'CFLAGS': config_host['CFLAGS']}
642summary_info += {'QEMU_CFLAGS': config_host['QEMU_CFLAGS']}
643summary_info += {'QEMU_LDFLAGS': config_host['QEMU_LDFLAGS']}
644summary_info += {'make': config_host['MAKE']}
645summary_info += {'install': config_host['INSTALL']}
646summary_info += {'python': '@0@ (version: @1@)'.format(python.full_path(), python.language_version())}
647summary_info += {'sphinx-build': config_host['SPHINX_BUILD']}
648summary_info += {'genisoimage': config_host['GENISOIMAGE']}
649# TODO: add back version
650summary_info += {'slirp support': config_host.has_key('CONFIG_SLIRP')}
651if config_host.has_key('CONFIG_SLIRP')
652 summary_info += {'smbd': config_host['CONFIG_SMBD_COMMAND']}
653endif
654summary_info += {'module support': config_host.has_key('CONFIG_MODULES')}
655if config_host.has_key('CONFIG_MODULES')
656 summary_info += {'alternative module path': config_host.has_key('CONFIG_MODULE_UPGRADES')}
657endif
658summary_info += {'host CPU': cpu}
659summary_info += {'host endianness': build_machine.endian()}
660summary_info += {'target list': config_host['TARGET_DIRS']}
661summary_info += {'gprof enabled': config_host.has_key('CONFIG_GPROF')}
662summary_info += {'sparse enabled': meson.get_compiler('c').cmd_array().contains('cgcc')}
663summary_info += {'strip binaries': get_option('strip')}
664summary_info += {'profiler': config_host.has_key('CONFIG_PROFILER')}
665summary_info += {'static build': config_host.has_key('CONFIG_TOOLS')}
666if targetos == 'darwin'
667 summary_info += {'Cocoa support': config_host.has_key('CONFIG_COCOA')}
668endif
669# TODO: add back version
670summary_info += {'SDL support': config_host.has_key('CONFIG_SDL')}
671summary_info += {'SDL image support': config_host.has_key('CONFIG_SDL_IMAGE')}
672# TODO: add back version
673summary_info += {'GTK support': config_host.has_key('CONFIG_GTK')}
674summary_info += {'GTK GL support': config_host.has_key('CONFIG_GTK_GL')}
675# TODO: add back version
676summary_info += {'VTE support': config_host.has_key('CONFIG_VTE')}
677summary_info += {'TLS priority': config_host['CONFIG_TLS_PRIORITY']}
678summary_info += {'GNUTLS support': config_host.has_key('CONFIG_GNUTLS')}
679# TODO: add back version
680summary_info += {'libgcrypt': config_host.has_key('CONFIG_GCRYPT')}
681if config_host.has_key('CONFIG_GCRYPT')
682 summary_info += {' hmac': config_host.has_key('CONFIG_GCRYPT_HMAC')}
683 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
684endif
685# TODO: add back version
686summary_info += {'nettle': config_host.has_key('CONFIG_NETTLE')}
687if config_host.has_key('CONFIG_NETTLE')
688 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
689endif
690summary_info += {'libtasn1': config_host.has_key('CONFIG_TASN1')}
691summary_info += {'PAM': config_host.has_key('CONFIG_AUTH_PAM')}
692summary_info += {'iconv support': config_host.has_key('CONFIG_ICONV')}
693summary_info += {'curses support': config_host.has_key('CONFIG_CURSES')}
694# TODO: add back version
695summary_info += {'virgl support': config_host.has_key('CONFIG_VIRGL')}
696summary_info += {'curl support': config_host.has_key('CONFIG_CURL')}
697summary_info += {'mingw32 support': targetos == 'windows'}
698summary_info += {'Audio drivers': config_host['CONFIG_AUDIO_DRIVERS']}
699summary_info += {'Block whitelist (rw)': config_host['CONFIG_BDRV_RW_WHITELIST']}
700summary_info += {'Block whitelist (ro)': config_host['CONFIG_BDRV_RO_WHITELIST']}
701summary_info += {'VirtFS support': config_host.has_key('CONFIG_VIRTFS')}
702summary_info += {'Multipath support': config_host.has_key('CONFIG_MPATH')}
703summary_info += {'VNC support': config_host.has_key('CONFIG_VNC')}
704if config_host.has_key('CONFIG_VNC')
705 summary_info += {'VNC SASL support': config_host.has_key('CONFIG_VNC_SASL')}
706 summary_info += {'VNC JPEG support': config_host.has_key('CONFIG_VNC_JPEG')}
707 summary_info += {'VNC PNG support': config_host.has_key('CONFIG_VNC_PNG')}
708endif
709summary_info += {'xen support': config_host.has_key('CONFIG_XEN_BACKEND')}
710if config_host.has_key('CONFIG_XEN_BACKEND')
711 summary_info += {'xen ctrl version': config_host['CONFIG_XEN_CTRL_INTERFACE_VERSION']}
712endif
713summary_info += {'brlapi support': config_host.has_key('CONFIG_BRLAPI')}
714summary_info += {'Documentation': config_host.has_key('BUILD_DOCS')}
715summary_info += {'PIE': get_option('b_pie')}
716summary_info += {'vde support': config_host.has_key('CONFIG_VDE')}
717summary_info += {'netmap support': config_host.has_key('CONFIG_NETMAP')}
718summary_info += {'Linux AIO support': config_host.has_key('CONFIG_LINUX_AIO')}
719summary_info += {'Linux io_uring support': config_host.has_key('CONFIG_LINUX_IO_URING')}
720summary_info += {'ATTR/XATTR support': config_host.has_key('CONFIG_ATTR')}
721summary_info += {'Install blobs': config_host.has_key('INSTALL_BLOBS')}
722# TODO: add back KVM/HAX/HVF/WHPX/TCG
723#summary_info += {'KVM support': have_kvm'}
724#summary_info += {'HAX support': have_hax'}
725#summary_info += {'HVF support': have_hvf'}
726#summary_info += {'WHPX support': have_whpx'}
727#summary_info += {'TCG support': have_tcg'}
728#if get_option('tcg')
729# summary_info += {'TCG debug enabled': config_host.has_key('CONFIG_DEBUG_TCG')}
730# summary_info += {'TCG interpreter': config_host.has_key('CONFIG_TCG_INTERPRETER')}
731#endif
732summary_info += {'malloc trim support': config_host.has_key('CONFIG_MALLOC_TRIM')}
733summary_info += {'RDMA support': config_host.has_key('CONFIG_RDMA')}
734summary_info += {'PVRDMA support': config_host.has_key('CONFIG_PVRDMA')}
735summary_info += {'fdt support': config_host.has_key('CONFIG_FDT')}
736summary_info += {'membarrier': config_host.has_key('CONFIG_MEMBARRIER')}
737summary_info += {'preadv support': config_host.has_key('CONFIG_PREADV')}
738summary_info += {'fdatasync': config_host.has_key('CONFIG_FDATASYNC')}
739summary_info += {'madvise': config_host.has_key('CONFIG_MADVISE')}
740summary_info += {'posix_madvise': config_host.has_key('CONFIG_POSIX_MADVISE')}
741summary_info += {'posix_memalign': config_host.has_key('CONFIG_POSIX_MEMALIGN')}
742summary_info += {'libcap-ng support': config_host.has_key('CONFIG_LIBCAP_NG')}
743summary_info += {'vhost-net support': config_host.has_key('CONFIG_VHOST_NET')}
744summary_info += {'vhost-crypto support': config_host.has_key('CONFIG_VHOST_CRYPTO')}
745summary_info += {'vhost-scsi support': config_host.has_key('CONFIG_VHOST_SCSI')}
746summary_info += {'vhost-vsock support': config_host.has_key('CONFIG_VHOST_VSOCK')}
747summary_info += {'vhost-user support': config_host.has_key('CONFIG_VHOST_KERNEL')}
748summary_info += {'vhost-user-fs support': config_host.has_key('CONFIG_VHOST_USER_FS')}
749summary_info += {'vhost-vdpa support': config_host.has_key('CONFIG_VHOST_VDPA')}
750summary_info += {'Trace backends': config_host['TRACE_BACKENDS']}
751if config_host['TRACE_BACKENDS'].split().contains('simple')
752 summary_info += {'Trace output file': config_host['CONFIG_TRACE_FILE'] + '-<pid>'}
753endif
754# TODO: add back protocol and server version
755summary_info += {'spice support': config_host.has_key('CONFIG_SPICE')}
756summary_info += {'rbd support': config_host.has_key('CONFIG_RBD')}
757summary_info += {'xfsctl support': config_host.has_key('CONFIG_XFS')}
758summary_info += {'smartcard support': config_host.has_key('CONFIG_SMARTCARD')}
759summary_info += {'libusb': config_host.has_key('CONFIG_USB_LIBUSB')}
760summary_info += {'usb net redir': config_host.has_key('CONFIG_USB_REDIR')}
761summary_info += {'OpenGL support': config_host.has_key('CONFIG_OPENGL')}
762summary_info += {'OpenGL dmabufs': config_host.has_key('CONFIG_OPENGL_DMABUF')}
763summary_info += {'libiscsi support': config_host.has_key('CONFIG_LIBISCSI')}
764summary_info += {'libnfs support': config_host.has_key('CONFIG_LIBNFS')}
765summary_info += {'build guest agent': config_host.has_key('CONFIG_GUEST_AGENT')}
766if targetos == 'windows'
767 if 'WIN_SDK' in config_host
768 summary_info += {'Windows SDK': config_host['WIN_SDK']}
769 endif
770 summary_info += {'QGA VSS support': config_host.has_key('CONFIG_QGA_VSS')}
771 summary_info += {'QGA w32 disk info': config_host.has_key('CONFIG_QGA_NTDDSCSI')}
772 summary_info += {'QGA MSI support': config_host.has_key('CONFIG_QGA_MSI_ENABLED')}
773endif
774summary_info += {'seccomp support': config_host.has_key('CONFIG_SECCOMP')}
775summary_info += {'coroutine backend': config_host['CONFIG_COROUTINE_BACKEND']}
776summary_info += {'coroutine pool': config_host['CONFIG_COROUTINE_POOL'] == '1'}
777summary_info += {'debug stack usage': config_host.has_key('CONFIG_DEBUG_STACK_USAGE')}
778summary_info += {'mutex debugging': config_host.has_key('CONFIG_DEBUG_MUTEX')}
779summary_info += {'crypto afalg': config_host.has_key('CONFIG_AF_ALG')}
780summary_info += {'GlusterFS support': config_host.has_key('CONFIG_GLUSTERFS')}
bf0e56a3 781summary_info += {'gcov': get_option('b_coverage')}
f9332757
PB
782summary_info += {'TPM support': config_host.has_key('CONFIG_TPM')}
783summary_info += {'libssh support': config_host.has_key('CONFIG_LIBSSH')}
784summary_info += {'QOM debugging': config_host.has_key('CONFIG_QOM_CAST_DEBUG')}
785summary_info += {'Live block migration': config_host.has_key('CONFIG_LIVE_BLOCK_MIGRATION')}
786summary_info += {'lzo support': config_host.has_key('CONFIG_LZO')}
787summary_info += {'snappy support': config_host.has_key('CONFIG_SNAPPY')}
788summary_info += {'bzip2 support': config_host.has_key('CONFIG_BZIP2')}
789summary_info += {'lzfse support': config_host.has_key('CONFIG_LZFSE')}
790summary_info += {'zstd support': config_host.has_key('CONFIG_ZSTD')}
791summary_info += {'NUMA host support': config_host.has_key('CONFIG_NUMA')}
792summary_info += {'libxml2': config_host.has_key('CONFIG_LIBXML2')}
793summary_info += {'tcmalloc support': config_host.has_key('CONFIG_TCMALLOC')}
794summary_info += {'jemalloc support': config_host.has_key('CONFIG_JEMALLOC')}
795summary_info += {'avx2 optimization': config_host.has_key('CONFIG_AVX2_OPT')}
796summary_info += {'avx512f optimization': config_host.has_key('CONFIG_AVX512F_OPT')}
797summary_info += {'replication support': config_host.has_key('CONFIG_REPLICATION')}
798summary_info += {'bochs support': config_host.has_key('CONFIG_BOCHS')}
799summary_info += {'cloop support': config_host.has_key('CONFIG_CLOOP')}
800summary_info += {'dmg support': config_host.has_key('CONFIG_DMG')}
801summary_info += {'qcow v1 support': config_host.has_key('CONFIG_QCOW1')}
802summary_info += {'vdi support': config_host.has_key('CONFIG_VDI')}
803summary_info += {'vvfat support': config_host.has_key('CONFIG_VVFAT')}
804summary_info += {'qed support': config_host.has_key('CONFIG_QED')}
805summary_info += {'parallels support': config_host.has_key('CONFIG_PARALLELS')}
806summary_info += {'sheepdog support': config_host.has_key('CONFIG_SHEEPDOG')}
807summary_info += {'capstone': config_host.has_key('CONFIG_CAPSTONE')}
808summary_info += {'libpmem support': config_host.has_key('CONFIG_LIBPMEM')}
809summary_info += {'libdaxctl support': config_host.has_key('CONFIG_LIBDAXCTL')}
810summary_info += {'libudev': config_host.has_key('CONFIG_LIBUDEV')}
811summary_info += {'default devices': config_host['CONFIG_MINIKCONF_MODE'] == '--defconfig'}
812summary_info += {'plugin support': config_host.has_key('CONFIG_PLUGIN')}
813summary_info += {'fuzzing support': config_host.has_key('CONFIG_FUZZ')}
814if config_host.has_key('HAVE_GDB_BIN')
815 summary_info += {'gdb': config_host['HAVE_GDB_BIN']}
816endif
817summary_info += {'thread sanitizer': config_host.has_key('CONFIG_TSAN')}
818summary_info += {'rng-none': config_host.has_key('CONFIG_RNG_NONE')}
819summary_info += {'Linux keyring': config_host.has_key('CONFIG_SECRET_KEYRING')}
820summary(summary_info, bool_yn: true)
821
822if not supported_cpus.contains(cpu)
823 message()
824 warning('SUPPORT FOR THIS HOST CPU WILL GO AWAY IN FUTURE RELEASES!')
825 message()
826 message('CPU host architecture ' + cpu + ' support is not currently maintained.')
827 message('The QEMU project intends to remove support for this host CPU in')
828 message('a future release if nobody volunteers to maintain it and to')
829 message('provide a build host for our continuous integration setup.')
830 message('configure has succeeded and you can continue to build, but')
831 message('if you care about QEMU on this platform you should contact')
832 message('us upstream at qemu-devel@nongnu.org.')
833endif
834
835if not supported_oses.contains(targetos)
836 message()
837 warning('WARNING: SUPPORT FOR THIS HOST OS WILL GO AWAY IN FUTURE RELEASES!')
838 message()
839 message('Host OS ' + targetos + 'support is not currently maintained.')
840 message('The QEMU project intends to remove support for this host OS in')
841 message('a future release if nobody volunteers to maintain it and to')
842 message('provide a build host for our continuous integration setup.')
843 message('configure has succeeded and you can continue to build, but')
844 message('if you care about QEMU on this platform you should contact')
845 message('us upstream at qemu-devel@nongnu.org.')
846endif