1 project('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())
5 not_found = dependency('', required: false)
6 keyval = import('unstable-keyval')
7 ss = import('sourceset')
9 sh = find_program('sh')
10 cc = meson.get_compiler('c')
11 config_host = keyval.load(meson.current_build_dir() / 'config-host.mak')
12 config_all_disas = keyval.load(meson.current_build_dir() / 'config-all-disas.mak')
13 enable_modules = 'CONFIG_MODULES' in config_host
15 add_project_arguments(config_host['QEMU_CFLAGS'].split(),
16 native: false, language: ['c', 'objc'])
17 add_project_arguments(config_host['QEMU_CXXFLAGS'].split(),
18 native: false, language: 'cpp')
19 add_project_link_arguments(config_host['QEMU_LDFLAGS'].split(),
20 native: false, language: ['c', 'cpp', 'objc'])
21 add_project_arguments(config_host['QEMU_INCLUDES'].split(),
22 language: ['c', 'cpp', 'objc'])
24 python = import('python').find_installation()
26 link_language = meson.get_external_property('link_language', 'cpp')
27 if link_language == 'cpp'
28 add_languages('cpp', required: true, native: false)
30 if host_machine.system() == 'darwin'
31 add_languages('objc', required: false, native: false)
34 if 'SPARSE_CFLAGS' in config_host
36 command: [find_program('scripts/check_sparse.py'),
37 config_host['SPARSE_CFLAGS'].split(),
38 'compile_commands.json'])
41 configure_file(input: files('scripts/ninjatool.py'),
43 configuration: config_host)
45 supported_oses = ['windows', 'freebsd', 'netbsd', 'openbsd', 'darwin', 'sunos', 'linux']
46 supported_cpus = ['ppc', 'ppc64', 's390x', 'sparc64', 'riscv32', 'riscv64', 'x86', 'x86_64',
47 'arm', 'aarch64', 'mips', 'mips64', 'sparc', 'sparc64']
49 cpu = host_machine.cpu_family()
50 targetos = host_machine.system()
52 m = cc.find_library('m', required: false)
53 util = cc.find_library('util', required: false)
61 if targetos == 'windows'
62 socket = cc.find_library('ws2_32')
63 winmm = cc.find_library('winmm')
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('.'))
69 elif 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')
74 elif targetos == 'sunos'
75 socket = [cc.find_library('socket'),
76 cc.find_library('nsl'),
77 cc.find_library('resolv')]
78 elif targetos == 'haiku'
79 socket = [cc.find_library('posix_error_mapper'),
80 cc.find_library('network'),
81 cc.find_library('bsd')]
83 glib = declare_dependency(compile_args: config_host['GLIB_CFLAGS'].split(),
84 link_args: config_host['GLIB_LIBS'].split())
86 if 'CONFIG_GIO' in config_host
87 gio = declare_dependency(compile_args: config_host['GIO_CFLAGS'].split(),
88 link_args: config_host['GIO_LIBS'].split())
91 if 'CONFIG_TRACE_UST' in config_host
92 lttng = declare_dependency(link_args: config_host['LTTNG_UST_LIBS'].split())
95 if 'CONFIG_TRACE_UST' in config_host
96 urcubp = declare_dependency(link_args: config_host['URCU_BP_LIBS'].split())
99 if 'CONFIG_NETTLE' in config_host
100 nettle = declare_dependency(compile_args: config_host['NETTLE_CFLAGS'].split(),
101 link_args: config_host['NETTLE_LIBS'].split())
104 if 'CONFIG_GNUTLS' in config_host
105 gnutls = declare_dependency(compile_args: config_host['GNUTLS_CFLAGS'].split(),
106 link_args: config_host['GNUTLS_LIBS'].split())
108 pixman = declare_dependency(compile_args: config_host['PIXMAN_CFLAGS'].split(),
109 link_args: config_host['PIXMAN_LIBS'].split())
111 if 'CONFIG_AUTH_PAM' in config_host
112 pam = cc.find_library('pam')
114 libaio = cc.find_library('aio', required: false)
116 if 'CONFIG_ZLIB' in config_host
117 zlib = declare_dependency(compile_args: config_host['ZLIB_CFLAGS'].split(),
118 link_args: config_host['ZLIB_LIBS'].split())
120 linux_io_uring = not_found
121 if '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())
126 if 'CONFIG_LIBXML2' in config_host
127 libxml2 = declare_dependency(compile_args: config_host['LIBXML2_CFLAGS'].split(),
128 link_args: config_host['LIBXML2_LIBS'].split())
131 if 'CONFIG_LIBNFS' in config_host
132 libnfs = declare_dependency(link_args: config_host['LIBNFS_LIBS'].split())
135 if 'CONFIG_ATTR' in config_host
136 libattr = declare_dependency(link_args: config_host['LIBATTR_LIBS'].split())
139 if 'CONFIG_SECCOMP' in config_host
140 seccomp = declare_dependency(compile_args: config_host['SECCOMP_CFLAGS'].split(),
141 link_args: config_host['SECCOMP_LIBS'].split())
143 libcap_ng = not_found
144 if 'CONFIG_LIBCAP_NG' in config_host
145 libcap_ng = declare_dependency(link_args: config_host['LIBCAP_NG_LIBS'].split())
147 xkbcommon = not_found
148 if 'CONFIG_XKBCOMMON' in config_host
149 xkbcommon = declare_dependency(compile_args: config_host['XKBCOMMON_CFLAGS'].split(),
150 link_args: config_host['XKBCOMMON_LIBS'].split())
153 if config_host.has_key('CONFIG_SLIRP')
154 slirp = declare_dependency(compile_args: config_host['SLIRP_CFLAGS'].split(),
155 link_args: config_host['SLIRP_LIBS'].split())
158 if config_host.has_key('CONFIG_VDE')
159 vde = declare_dependency(link_args: config_host['VDE_LIBS'].split())
162 if 'CONFIG_LIBPULSE' in config_host
163 pulse = declare_dependency(compile_args: config_host['PULSE_CFLAGS'].split(),
164 link_args: config_host['PULSE_LIBS'].split())
167 if 'CONFIG_ALSA' in config_host
168 alsa = declare_dependency(compile_args: config_host['ALSA_CFLAGS'].split(),
169 link_args: config_host['ALSA_LIBS'].split())
172 if 'CONFIG_LIBJACK' in config_host
173 jack = declare_dependency(link_args: config_host['JACK_LIBS'].split())
176 if 'CONFIG_SPICE' in config_host
177 spice = declare_dependency(compile_args: config_host['SPICE_CFLAGS'].split(),
178 link_args: config_host['SPICE_LIBS'].split())
180 rt = cc.find_library('rt', required: false)
181 libmpathpersist = not_found
182 if config_host.has_key('CONFIG_MPATH')
183 libmpathpersist = cc.find_library('mpathpersist')
186 if 'CONFIG_LIBISCSI' in config_host
187 libiscsi = declare_dependency(compile_args: config_host['LIBISCSI_CFLAGS'].split(),
188 link_args: config_host['LIBISCSI_LIBS'].split())
191 if 'CONFIG_ZSTD' in config_host
192 zstd = declare_dependency(compile_args: config_host['ZSTD_CFLAGS'].split(),
193 link_args: config_host['ZSTD_LIBS'].split())
196 if 'CONFIG_GBM' in config_host
197 gbm = declare_dependency(compile_args: config_host['GBM_CFLAGS'].split(),
198 link_args: config_host['GBM_LIBS'].split())
201 if 'CONFIG_VIRGL' in config_host
202 virgl = declare_dependency(compile_args: config_host['VIRGL_CFLAGS'].split(),
203 link_args: config_host['VIRGL_LIBS'].split())
206 if 'CONFIG_CURL' in config_host
207 curl = declare_dependency(compile_args: config_host['CURL_CFLAGS'].split(),
208 link_args: config_host['CURL_LIBS'].split())
211 if 'CONFIG_LIBUDEV' in config_host
212 libudev = declare_dependency(link_args: config_host['LIBUDEV_LIBS'].split())
215 if 'CONFIG_BRLAPI' in config_host
216 brlapi = declare_dependency(link_args: config_host['BRLAPI_LIBS'].split())
219 if 'CONFIG_SDL' in config_host
220 sdl = declare_dependency(compile_args: config_host['SDL_CFLAGS'].split(),
221 link_args: config_host['SDL_LIBS'].split())
224 if 'CONFIG_RBD' in config_host
225 rbd = declare_dependency(link_args: config_host['RBD_LIBS'].split())
227 glusterfs = not_found
228 if 'CONFIG_GLUSTERFS' in config_host
229 glusterfs = declare_dependency(compile_args: config_host['GLUSTERFS_CFLAGS'].split(),
230 link_args: config_host['GLUSTERFS_LIBS'].split())
233 if 'CONFIG_LIBSSH' in config_host
234 libssh = declare_dependency(compile_args: config_host['LIBSSH_CFLAGS'].split(),
235 link_args: config_host['LIBSSH_LIBS'].split())
238 if 'CONFIG_BZIP2' in config_host
239 libbzip2 = declare_dependency(link_args: config_host['BZIP2_LIBS'].split())
242 if 'CONFIG_LZFSE' in config_host
243 liblzfse = declare_dependency(link_args: config_host['LZFSE_LIBS'].split())
246 if 'CONFIG_AUDIO_OSS' in config_host
247 oss = declare_dependency(link_args: config_host['OSS_LIBS'].split())
250 if 'CONFIG_AUDIO_DSOUND' in config_host
251 dsound = declare_dependency(link_args: config_host['DSOUND_LIBS'].split())
253 coreaudio = not_found
254 if 'CONFIG_AUDIO_COREAUDIO' in config_host
255 coreaudio = declare_dependency(link_args: config_host['COREAUDIO_LIBS'].split())
258 if 'CONFIG_OPENGL' in config_host
259 opengl = declare_dependency(link_args: config_host['OPENGL_LIBS'].split())
263 if 'CONFIG_GTK' in config_host
264 gtk = declare_dependency(compile_args: config_host['GTK_CFLAGS'].split(),
265 link_args: config_host['GTK_LIBS'].split())
268 if 'CONFIG_VTE' in config_host
269 vte = declare_dependency(compile_args: config_host['VTE_CFLAGS'].split(),
270 link_args: config_host['VTE_LIBS'].split())
273 if 'CONFIG_X11' in config_host
274 x11 = declare_dependency(compile_args: config_host['X11_CFLAGS'].split(),
275 link_args: config_host['X11_LIBS'].split())
278 if 'CONFIG_CURSES' in config_host
279 curses = declare_dependency(compile_args: config_host['CURSES_CFLAGS'].split(),
280 link_args: config_host['CURSES_LIBS'].split())
283 if 'CONFIG_ICONV' in config_host
284 iconv = declare_dependency(compile_args: config_host['ICONV_CFLAGS'].split(),
285 link_args: config_host['ICONV_LIBS'].split())
288 if 'CONFIG_GIO' in config_host
289 gio = declare_dependency(compile_args: config_host['GIO_CFLAGS'].split(),
290 link_args: config_host['GIO_LIBS'].split())
293 if 'CONFIG_VNC_PNG' in config_host
294 png = declare_dependency(compile_args: config_host['PNG_CFLAGS'].split(),
295 link_args: config_host['PNG_LIBS'].split())
298 if 'CONFIG_VNC_JPEG' in config_host
299 jpeg = declare_dependency(compile_args: config_host['JPEG_CFLAGS'].split(),
300 link_args: config_host['JPEG_LIBS'].split())
303 if 'CONFIG_VNC_SASL' in config_host
304 sasl = declare_dependency(compile_args: config_host['SASL_CFLAGS'].split(),
305 link_args: config_host['SASL_LIBS'].split())
308 if 'CONFIG_FDT' in config_host
309 fdt = declare_dependency(compile_args: config_host['FDT_CFLAGS'].split(),
310 link_args: config_host['FDT_LIBS'].split())
313 if 'CONFIG_SNAPPY' in config_host
314 snappy = declare_dependency(link_args: config_host['SNAPPY_LIBS'].split())
317 if 'CONFIG_LZO' in config_host
318 lzo = declare_dependency(link_args: config_host['LZO_LIBS'].split())
321 if 'CONFIG_RDMA' in config_host
322 rdma = declare_dependency(link_args: config_host['RDMA_LIBS'].split())
325 create_config = find_program('scripts/create_config')
326 minikconf = find_program('scripts/minikconf.py')
327 target_dirs = config_host['TARGET_DIRS'].split()
330 config_devices_mak_list = []
331 config_devices_h = {}
332 config_target_mak = {}
333 kconfig_external_symbols = [
342 'CONFIG_VHOST_KERNEL',
347 foreach target : target_dirs
348 have_user = have_user or target.endswith('-user')
349 config_target = keyval.load(meson.current_build_dir() / target / 'config-target.mak') + config_host
351 if target.endswith('-softmmu')
355 foreach sym : kconfig_external_symbols
356 if sym in config_target
357 base_kconfig += '@0@=y'.format(sym)
361 config_devices_mak = target + '-config-devices.mak'
362 config_devices_mak = configure_file(
363 input: ['default-configs' / target + '.mak', 'Kconfig'],
364 output: config_devices_mak,
365 depfile: config_devices_mak + '.d',
367 command: [minikconf, config_host['CONFIG_MINIKCONF_MODE'],
368 config_devices_mak, '@DEPFILE@', '@INPUT@',
370 config_devices_h += {target: custom_target(
371 target + '-config-devices.h',
372 input: config_devices_mak,
373 output: target + '-config-devices.h',
375 command: [create_config, '@INPUT@'])}
376 config_devices_mak_list += config_devices_mak
377 config_target += keyval.load(config_devices_mak)
379 config_target_mak += {target: config_target}
381 have_tools = 'CONFIG_TOOLS' in config_host
382 have_block = have_system or have_tools
384 grepy = find_program('scripts/grepy.sh')
385 # This configuration is used to build files that are shared by
386 # multiple binaries, and then extracted out of the "common"
387 # static_library target.
389 # We do not use all_sources()/all_dependencies(), because it would
390 # build literally all source files, including devices only used by
391 # targets that are not built for this compilation. The CONFIG_ALL
392 # pseudo symbol replaces it.
395 config_all_devices_mak = configure_file(
396 output: 'config-all-devices.mak',
397 input: config_devices_mak_list,
399 command: [grepy, '@INPUT@'],
401 config_all_devices = keyval.load(config_all_devices_mak)
403 config_all_devices = {}
405 config_all = config_all_devices
406 config_all += config_host
407 config_all += config_all_disas
409 'CONFIG_XEN': config_host.has_key('CONFIG_XEN_BACKEND'),
410 'CONFIG_SOFTMMU': have_system,
411 'CONFIG_USER_ONLY': have_user,
418 hxtool = find_program('scripts/hxtool')
419 shaderinclude = find_program('scripts/shaderinclude.pl')
420 qapi_gen = find_program('scripts/qapi-gen.py')
421 qapi_gen_depends = [ meson.source_root() / 'scripts/qapi/__init__.py',
422 meson.source_root() / 'scripts/qapi/commands.py',
423 meson.source_root() / 'scripts/qapi/common.py',
424 meson.source_root() / 'scripts/qapi/doc.py',
425 meson.source_root() / 'scripts/qapi/error.py',
426 meson.source_root() / 'scripts/qapi/events.py',
427 meson.source_root() / 'scripts/qapi/expr.py',
428 meson.source_root() / 'scripts/qapi/gen.py',
429 meson.source_root() / 'scripts/qapi/introspect.py',
430 meson.source_root() / 'scripts/qapi/parser.py',
431 meson.source_root() / 'scripts/qapi/schema.py',
432 meson.source_root() / 'scripts/qapi/source.py',
433 meson.source_root() / 'scripts/qapi/types.py',
434 meson.source_root() / 'scripts/qapi/visit.py',
435 meson.source_root() / 'scripts/qapi/common.py',
436 meson.source_root() / 'scripts/qapi/doc.py',
437 meson.source_root() / 'scripts/qapi-gen.py'
441 python, files('scripts/tracetool.py'),
442 '--backend=' + config_host['TRACE_BACKENDS']
445 qemu_version_cmd = [find_program('scripts/qemu-version.sh'),
446 meson.current_source_dir(),
447 config_host['PKGVERSION'], config_host['VERSION']]
448 qemu_version = custom_target('qemu-version.h',
449 output: 'qemu-version.h',
450 command: qemu_version_cmd,
452 build_by_default: true,
453 build_always_stale: true)
456 config_host_h = custom_target('config-host.h',
457 input: meson.current_build_dir() / 'config-host.mak',
458 output: 'config-host.h',
460 command: [create_config, '@INPUT@'])
461 genh += config_host_h
465 ['qemu-options.hx', 'qemu-options.def'],
466 ['qemu-img-cmds.hx', 'qemu-img-cmds.h'],
470 ['hmp-commands.hx', 'hmp-commands.h'],
471 ['hmp-commands-info.hx', 'hmp-commands-info.h'],
474 foreach d : hx_headers
475 hxdep += custom_target(d[1],
479 build_by_default: true, # to be removed when added to a target
480 command: [hxtool, '-h', '@INPUT0@'])
484 # Collect sourcesets.
486 util_ss = ss.source_set()
487 stub_ss = ss.source_set()
488 trace_ss = ss.source_set()
489 block_ss = ss.source_set()
490 blockdev_ss = ss.source_set()
491 qmp_ss = ss.source_set()
492 common_ss = ss.source_set()
493 softmmu_ss = ss.source_set()
494 user_ss = ss.source_set()
495 bsd_user_ss = ss.source_set()
496 linux_user_ss = ss.source_set()
497 specific_ss = ss.source_set()
502 target_softmmu_arch = {}
508 trace_events_subdirs = [
515 trace_events_subdirs += [ 'linux-user' ]
518 trace_events_subdirs += [
527 trace_events_subdirs += [
538 'hw/block/dataplane',
583 trace_events_subdirs += [
610 libmodulecommon = static_library('module-common', files('module-common.c') + genh, pic: true, c_args: '-DBUILD_DSO')
611 modulecommon = declare_dependency(link_whole: libmodulecommon, compile_args: '-DBUILD_DSO')
614 # Build targets from sourcesets
616 stub_ss = stub_ss.apply(config_all, strict: false)
618 util_ss.add_all(trace_ss)
619 util_ss = util_ss.apply(config_all, strict: false)
620 libqemuutil = static_library('qemuutil',
621 sources: util_ss.sources() + stub_ss.sources() + genh,
622 dependencies: [util_ss.dependencies(), m, glib, socket])
623 qemuutil = declare_dependency(link_with: libqemuutil,
624 sources: genh + version_res)
639 block_ss.add(when: 'CONFIG_REPLICATION', if_true: files('replication.c'))
645 blockdev_ss.add(files(
652 # os-posix.c contains POSIX-specific functions used by qemu-storage-daemon,
653 # os-win32.c does not
654 blockdev_ss.add(when: 'CONFIG_POSIX', if_true: files('os-posix.c'))
655 softmmu_ss.add(when: 'CONFIG_WIN32', if_true: [files('os-win32.c')])
657 softmmu_ss.add_all(blockdev_ss)
658 softmmu_ss.add(files(
664 softmmu_ss.add(when: 'CONFIG_TPM', if_true: files('tpm.c'))
665 softmmu_ss.add(when: 'CONFIG_SECCOMP', if_true: [files('qemu-seccomp.c'), seccomp])
666 softmmu_ss.add(when: ['CONFIG_FDT', fdt], if_true: [files('device_tree.c')])
668 common_ss.add(files('cpus-common.c'))
676 # needed for fuzzing binaries
677 subdir('tests/qtest/libqos')
681 foreach d, list : modules
682 foreach m, module_ss : list
683 if enable_modules and targetos != 'windows'
684 module_ss = module_ss.apply(config_host, strict: false)
685 sl = static_library(d + '-' + m, [genh, module_ss.sources()],
686 dependencies: [modulecommon, module_ss.dependencies()], pic: true)
694 block_ss.add_all(module_ss)
696 softmmu_ss.add_all(module_ss)
702 nm = find_program('nm')
703 undefsym = find_program('scripts/undefsym.sh')
704 block_syms = custom_target('block.syms', output: 'block.syms',
705 input: [libqemuutil, block_mods],
707 command: [undefsym, nm, '@INPUT@'])
708 qemu_syms = custom_target('qemu.syms', output: 'qemu.syms',
709 input: [libqemuutil, softmmu_mods],
711 command: [undefsym, nm, '@INPUT@'])
713 block_ss = block_ss.apply(config_host, strict: false)
714 libblock = static_library('block', block_ss.sources() + genh,
715 dependencies: block_ss.dependencies(),
716 link_depends: block_syms,
718 build_by_default: false)
720 block = declare_dependency(link_whole: [libblock],
721 link_args: '@block.syms',
722 dependencies: [crypto, io])
724 qmp_ss = qmp_ss.apply(config_host, strict: false)
725 libqmp = static_library('qmp', qmp_ss.sources() + genh,
726 dependencies: qmp_ss.dependencies(),
728 build_by_default: false)
730 qmp = declare_dependency(link_whole: [libqmp])
732 foreach m : block_mods + softmmu_mods
733 shared_module(m.name(),
737 install_dir: config_host['qemu_moddir'])
740 common_ss.add_all(when: 'CONFIG_SOFTMMU', if_true: softmmu_ss)
741 common_ss.add_all(when: 'CONFIG_USER_ONLY', if_true: user_ss)
743 common_all = common_ss.apply(config_all, strict: false)
744 common_all = static_library('common',
745 build_by_default: false,
746 sources: common_all.sources() + genh,
747 dependencies: common_all.dependencies(),
750 foreach target : target_dirs
751 config_target = config_target_mak[target]
752 target_name = config_target['TARGET_NAME']
753 arch = config_target['TARGET_BASE_ARCH']
756 target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
757 if targetos == 'linux'
758 target_inc += include_directories('linux-headers', is_system: true)
760 if target.endswith('-softmmu')
761 qemu_target_name = 'qemu-system-' + target_name
763 arch_srcs += config_devices_h[target]
766 qemu_target_name = 'qemu-' + target_name
767 if 'CONFIG_LINUX_USER' in config_target
768 base_dir = 'linux-user'
769 target_inc += include_directories('linux-user/host/' / config_host['ARCH'])
771 base_dir = 'bsd-user'
773 target_inc += include_directories(
775 base_dir / config_target['TARGET_ABI_DIR'],
779 target_common = common_ss.apply(config_target, strict: false)
780 objects = common_all.extract_objects(target_common.sources())
782 # TODO: Change to generator once obj-y goes away
783 config_target_h = custom_target(target + '-config-target.h',
784 input: meson.current_build_dir() / target / 'config-target.mak',
785 output: target + '-config-target.h',
787 command: [create_config, '@INPUT@'])
789 target_specific = specific_ss.apply(config_target, strict: false)
790 arch_srcs += target_specific.sources()
792 static_library('qemu-' + target,
793 sources: arch_srcs + [config_target_h] + genh,
795 include_directories: target_inc,
796 c_args: ['-DNEED_CPU_H',
802 # Other build targets
804 if 'CONFIG_GUEST_AGENT' in config_host
809 qemu_img = executable('qemu-img', [files('qemu-img.c'), hxdep],
810 dependencies: [authz, block, crypto, io, qom, qemuutil], install: true)
811 qemu_io = executable('qemu-io', files('qemu-io.c'),
812 dependencies: [block, qemuutil], install: true)
813 if targetos == 'linux' or targetos == 'sunos' or targetos.endswith('bsd')
814 qemu_nbd = executable('qemu-nbd', files('qemu-nbd.c'),
815 dependencies: [block, qemuutil], install: true)
818 subdir('storage-daemon')
819 subdir('contrib/rdmacm-mux')
820 subdir('contrib/elf2dmp')
822 if 'CONFIG_XKBCOMMON' in config_host
823 executable('qemu-keymap', files('qemu-keymap.c', 'ui/input-keymap.c'),
824 dependencies: [qemuutil, xkbcommon], install: true)
827 executable('qemu-edid', files('qemu-edid.c', 'hw/display/edid-generate.c'),
828 dependencies: qemuutil,
831 if 'CONFIG_VHOST_USER' in config_host
832 subdir('contrib/libvhost-user')
833 subdir('contrib/vhost-user-blk')
834 if 'CONFIG_LINUX' in config_host
835 subdir('contrib/vhost-user-gpu')
837 subdir('contrib/vhost-user-input')
838 subdir('contrib/vhost-user-scsi')
841 if targetos == 'linux'
842 executable('qemu-bridge-helper', files('qemu-bridge-helper.c'),
843 dependencies: [qemuutil, libcap_ng],
845 install_dir: get_option('libexecdir'))
847 executable('qemu-pr-helper', files('scsi/qemu-pr-helper.c', 'scsi/utils.c'),
848 dependencies: [authz, crypto, io, qom, qemuutil,
849 libcap_ng, libudev, libmpathpersist],
853 if 'CONFIG_IVSHMEM' in config_host
854 subdir('contrib/ivshmem-client')
855 subdir('contrib/ivshmem-server')
864 summary_info += {'Install prefix': config_host['prefix']}
865 summary_info += {'BIOS directory': config_host['qemu_datadir']}
866 summary_info += {'firmware path': config_host['qemu_firmwarepath']}
867 summary_info += {'binary directory': config_host['bindir']}
868 summary_info += {'library directory': config_host['libdir']}
869 summary_info += {'module directory': config_host['qemu_moddir']}
870 summary_info += {'libexec directory': config_host['libexecdir']}
871 summary_info += {'include directory': config_host['includedir']}
872 summary_info += {'config directory': config_host['sysconfdir']}
873 if targetos != 'windows'
874 summary_info += {'local state directory': config_host['qemu_localstatedir']}
875 summary_info += {'Manual directory': config_host['mandir']}
877 summary_info += {'local state directory': 'queried at runtime'}
879 summary_info += {'Build directory': meson.current_build_dir()}
880 summary_info += {'Source path': meson.current_source_dir()}
881 summary_info += {'GIT binary': config_host['GIT']}
882 summary_info += {'GIT submodules': config_host['GIT_SUBMODULES']}
883 summary_info += {'C compiler': meson.get_compiler('c').cmd_array()[0]}
884 summary_info += {'Host C compiler': meson.get_compiler('c', native: true).cmd_array()[0]}
885 if link_language == 'cpp'
886 summary_info += {'C++ compiler': meson.get_compiler('cpp').cmd_array()[0]}
888 summary_info += {'C++ compiler': false}
890 if targetos == 'darwin'
891 summary_info += {'Objective-C compiler': meson.get_compiler('objc').cmd_array()[0]}
893 summary_info += {'ARFLAGS': config_host['ARFLAGS']}
894 summary_info += {'CFLAGS': config_host['CFLAGS']}
895 summary_info += {'QEMU_CFLAGS': config_host['QEMU_CFLAGS']}
896 summary_info += {'QEMU_LDFLAGS': config_host['QEMU_LDFLAGS']}
897 summary_info += {'make': config_host['MAKE']}
898 summary_info += {'install': config_host['INSTALL']}
899 summary_info += {'python': '@0@ (version: @1@)'.format(python.full_path(), python.language_version())}
900 summary_info += {'sphinx-build': config_host['SPHINX_BUILD']}
901 summary_info += {'genisoimage': config_host['GENISOIMAGE']}
902 # TODO: add back version
903 summary_info += {'slirp support': config_host.has_key('CONFIG_SLIRP')}
904 if config_host.has_key('CONFIG_SLIRP')
905 summary_info += {'smbd': config_host['CONFIG_SMBD_COMMAND']}
907 summary_info += {'module support': config_host.has_key('CONFIG_MODULES')}
908 if config_host.has_key('CONFIG_MODULES')
909 summary_info += {'alternative module path': config_host.has_key('CONFIG_MODULE_UPGRADES')}
911 summary_info += {'host CPU': cpu}
912 summary_info += {'host endianness': build_machine.endian()}
913 summary_info += {'target list': config_host['TARGET_DIRS']}
914 summary_info += {'gprof enabled': config_host.has_key('CONFIG_GPROF')}
915 summary_info += {'sparse enabled': meson.get_compiler('c').cmd_array().contains('cgcc')}
916 summary_info += {'strip binaries': get_option('strip')}
917 summary_info += {'profiler': config_host.has_key('CONFIG_PROFILER')}
918 summary_info += {'static build': config_host.has_key('CONFIG_TOOLS')}
919 if targetos == 'darwin'
920 summary_info += {'Cocoa support': config_host.has_key('CONFIG_COCOA')}
922 # TODO: add back version
923 summary_info += {'SDL support': config_host.has_key('CONFIG_SDL')}
924 summary_info += {'SDL image support': config_host.has_key('CONFIG_SDL_IMAGE')}
925 # TODO: add back version
926 summary_info += {'GTK support': config_host.has_key('CONFIG_GTK')}
927 summary_info += {'GTK GL support': config_host.has_key('CONFIG_GTK_GL')}
928 # TODO: add back version
929 summary_info += {'VTE support': config_host.has_key('CONFIG_VTE')}
930 summary_info += {'TLS priority': config_host['CONFIG_TLS_PRIORITY']}
931 summary_info += {'GNUTLS support': config_host.has_key('CONFIG_GNUTLS')}
932 # TODO: add back version
933 summary_info += {'libgcrypt': config_host.has_key('CONFIG_GCRYPT')}
934 if config_host.has_key('CONFIG_GCRYPT')
935 summary_info += {' hmac': config_host.has_key('CONFIG_GCRYPT_HMAC')}
936 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
938 # TODO: add back version
939 summary_info += {'nettle': config_host.has_key('CONFIG_NETTLE')}
940 if config_host.has_key('CONFIG_NETTLE')
941 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')}
943 summary_info += {'libtasn1': config_host.has_key('CONFIG_TASN1')}
944 summary_info += {'PAM': config_host.has_key('CONFIG_AUTH_PAM')}
945 summary_info += {'iconv support': config_host.has_key('CONFIG_ICONV')}
946 summary_info += {'curses support': config_host.has_key('CONFIG_CURSES')}
947 # TODO: add back version
948 summary_info += {'virgl support': config_host.has_key('CONFIG_VIRGL')}
949 summary_info += {'curl support': config_host.has_key('CONFIG_CURL')}
950 summary_info += {'mingw32 support': targetos == 'windows'}
951 summary_info += {'Audio drivers': config_host['CONFIG_AUDIO_DRIVERS']}
952 summary_info += {'Block whitelist (rw)': config_host['CONFIG_BDRV_RW_WHITELIST']}
953 summary_info += {'Block whitelist (ro)': config_host['CONFIG_BDRV_RO_WHITELIST']}
954 summary_info += {'VirtFS support': config_host.has_key('CONFIG_VIRTFS')}
955 summary_info += {'Multipath support': config_host.has_key('CONFIG_MPATH')}
956 summary_info += {'VNC support': config_host.has_key('CONFIG_VNC')}
957 if config_host.has_key('CONFIG_VNC')
958 summary_info += {'VNC SASL support': config_host.has_key('CONFIG_VNC_SASL')}
959 summary_info += {'VNC JPEG support': config_host.has_key('CONFIG_VNC_JPEG')}
960 summary_info += {'VNC PNG support': config_host.has_key('CONFIG_VNC_PNG')}
962 summary_info += {'xen support': config_host.has_key('CONFIG_XEN_BACKEND')}
963 if config_host.has_key('CONFIG_XEN_BACKEND')
964 summary_info += {'xen ctrl version': config_host['CONFIG_XEN_CTRL_INTERFACE_VERSION']}
966 summary_info += {'brlapi support': config_host.has_key('CONFIG_BRLAPI')}
967 summary_info += {'Documentation': config_host.has_key('BUILD_DOCS')}
968 summary_info += {'PIE': get_option('b_pie')}
969 summary_info += {'vde support': config_host.has_key('CONFIG_VDE')}
970 summary_info += {'netmap support': config_host.has_key('CONFIG_NETMAP')}
971 summary_info += {'Linux AIO support': config_host.has_key('CONFIG_LINUX_AIO')}
972 summary_info += {'Linux io_uring support': config_host.has_key('CONFIG_LINUX_IO_URING')}
973 summary_info += {'ATTR/XATTR support': config_host.has_key('CONFIG_ATTR')}
974 summary_info += {'Install blobs': config_host.has_key('INSTALL_BLOBS')}
975 # TODO: add back KVM/HAX/HVF/WHPX/TCG
976 #summary_info += {'KVM support': have_kvm'}
977 #summary_info += {'HAX support': have_hax'}
978 #summary_info += {'HVF support': have_hvf'}
979 #summary_info += {'WHPX support': have_whpx'}
980 #summary_info += {'TCG support': have_tcg'}
981 #if get_option('tcg')
982 # summary_info += {'TCG debug enabled': config_host.has_key('CONFIG_DEBUG_TCG')}
983 # summary_info += {'TCG interpreter': config_host.has_key('CONFIG_TCG_INTERPRETER')}
985 summary_info += {'malloc trim support': config_host.has_key('CONFIG_MALLOC_TRIM')}
986 summary_info += {'RDMA support': config_host.has_key('CONFIG_RDMA')}
987 summary_info += {'PVRDMA support': config_host.has_key('CONFIG_PVRDMA')}
988 summary_info += {'fdt support': config_host.has_key('CONFIG_FDT')}
989 summary_info += {'membarrier': config_host.has_key('CONFIG_MEMBARRIER')}
990 summary_info += {'preadv support': config_host.has_key('CONFIG_PREADV')}
991 summary_info += {'fdatasync': config_host.has_key('CONFIG_FDATASYNC')}
992 summary_info += {'madvise': config_host.has_key('CONFIG_MADVISE')}
993 summary_info += {'posix_madvise': config_host.has_key('CONFIG_POSIX_MADVISE')}
994 summary_info += {'posix_memalign': config_host.has_key('CONFIG_POSIX_MEMALIGN')}
995 summary_info += {'libcap-ng support': config_host.has_key('CONFIG_LIBCAP_NG')}
996 summary_info += {'vhost-net support': config_host.has_key('CONFIG_VHOST_NET')}
997 summary_info += {'vhost-crypto support': config_host.has_key('CONFIG_VHOST_CRYPTO')}
998 summary_info += {'vhost-scsi support': config_host.has_key('CONFIG_VHOST_SCSI')}
999 summary_info += {'vhost-vsock support': config_host.has_key('CONFIG_VHOST_VSOCK')}
1000 summary_info += {'vhost-user support': config_host.has_key('CONFIG_VHOST_KERNEL')}
1001 summary_info += {'vhost-user-fs support': config_host.has_key('CONFIG_VHOST_USER_FS')}
1002 summary_info += {'vhost-vdpa support': config_host.has_key('CONFIG_VHOST_VDPA')}
1003 summary_info += {'Trace backends': config_host['TRACE_BACKENDS']}
1004 if config_host['TRACE_BACKENDS'].split().contains('simple')
1005 summary_info += {'Trace output file': config_host['CONFIG_TRACE_FILE'] + '-<pid>'}
1007 # TODO: add back protocol and server version
1008 summary_info += {'spice support': config_host.has_key('CONFIG_SPICE')}
1009 summary_info += {'rbd support': config_host.has_key('CONFIG_RBD')}
1010 summary_info += {'xfsctl support': config_host.has_key('CONFIG_XFS')}
1011 summary_info += {'smartcard support': config_host.has_key('CONFIG_SMARTCARD')}
1012 summary_info += {'libusb': config_host.has_key('CONFIG_USB_LIBUSB')}
1013 summary_info += {'usb net redir': config_host.has_key('CONFIG_USB_REDIR')}
1014 summary_info += {'OpenGL support': config_host.has_key('CONFIG_OPENGL')}
1015 summary_info += {'OpenGL dmabufs': config_host.has_key('CONFIG_OPENGL_DMABUF')}
1016 summary_info += {'libiscsi support': config_host.has_key('CONFIG_LIBISCSI')}
1017 summary_info += {'libnfs support': config_host.has_key('CONFIG_LIBNFS')}
1018 summary_info += {'build guest agent': config_host.has_key('CONFIG_GUEST_AGENT')}
1019 if targetos == 'windows'
1020 if 'WIN_SDK' in config_host
1021 summary_info += {'Windows SDK': config_host['WIN_SDK']}
1023 summary_info += {'QGA VSS support': config_host.has_key('CONFIG_QGA_VSS')}
1024 summary_info += {'QGA w32 disk info': config_host.has_key('CONFIG_QGA_NTDDSCSI')}
1025 summary_info += {'QGA MSI support': config_host.has_key('CONFIG_QGA_MSI_ENABLED')}
1027 summary_info += {'seccomp support': config_host.has_key('CONFIG_SECCOMP')}
1028 summary_info += {'coroutine backend': config_host['CONFIG_COROUTINE_BACKEND']}
1029 summary_info += {'coroutine pool': config_host['CONFIG_COROUTINE_POOL'] == '1'}
1030 summary_info += {'debug stack usage': config_host.has_key('CONFIG_DEBUG_STACK_USAGE')}
1031 summary_info += {'mutex debugging': config_host.has_key('CONFIG_DEBUG_MUTEX')}
1032 summary_info += {'crypto afalg': config_host.has_key('CONFIG_AF_ALG')}
1033 summary_info += {'GlusterFS support': config_host.has_key('CONFIG_GLUSTERFS')}
1034 summary_info += {'gcov': get_option('b_coverage')}
1035 summary_info += {'TPM support': config_host.has_key('CONFIG_TPM')}
1036 summary_info += {'libssh support': config_host.has_key('CONFIG_LIBSSH')}
1037 summary_info += {'QOM debugging': config_host.has_key('CONFIG_QOM_CAST_DEBUG')}
1038 summary_info += {'Live block migration': config_host.has_key('CONFIG_LIVE_BLOCK_MIGRATION')}
1039 summary_info += {'lzo support': config_host.has_key('CONFIG_LZO')}
1040 summary_info += {'snappy support': config_host.has_key('CONFIG_SNAPPY')}
1041 summary_info += {'bzip2 support': config_host.has_key('CONFIG_BZIP2')}
1042 summary_info += {'lzfse support': config_host.has_key('CONFIG_LZFSE')}
1043 summary_info += {'zstd support': config_host.has_key('CONFIG_ZSTD')}
1044 summary_info += {'NUMA host support': config_host.has_key('CONFIG_NUMA')}
1045 summary_info += {'libxml2': config_host.has_key('CONFIG_LIBXML2')}
1046 summary_info += {'tcmalloc support': config_host.has_key('CONFIG_TCMALLOC')}
1047 summary_info += {'jemalloc support': config_host.has_key('CONFIG_JEMALLOC')}
1048 summary_info += {'avx2 optimization': config_host.has_key('CONFIG_AVX2_OPT')}
1049 summary_info += {'avx512f optimization': config_host.has_key('CONFIG_AVX512F_OPT')}
1050 summary_info += {'replication support': config_host.has_key('CONFIG_REPLICATION')}
1051 summary_info += {'bochs support': config_host.has_key('CONFIG_BOCHS')}
1052 summary_info += {'cloop support': config_host.has_key('CONFIG_CLOOP')}
1053 summary_info += {'dmg support': config_host.has_key('CONFIG_DMG')}
1054 summary_info += {'qcow v1 support': config_host.has_key('CONFIG_QCOW1')}
1055 summary_info += {'vdi support': config_host.has_key('CONFIG_VDI')}
1056 summary_info += {'vvfat support': config_host.has_key('CONFIG_VVFAT')}
1057 summary_info += {'qed support': config_host.has_key('CONFIG_QED')}
1058 summary_info += {'parallels support': config_host.has_key('CONFIG_PARALLELS')}
1059 summary_info += {'sheepdog support': config_host.has_key('CONFIG_SHEEPDOG')}
1060 summary_info += {'capstone': config_host.has_key('CONFIG_CAPSTONE')}
1061 summary_info += {'libpmem support': config_host.has_key('CONFIG_LIBPMEM')}
1062 summary_info += {'libdaxctl support': config_host.has_key('CONFIG_LIBDAXCTL')}
1063 summary_info += {'libudev': config_host.has_key('CONFIG_LIBUDEV')}
1064 summary_info += {'default devices': config_host['CONFIG_MINIKCONF_MODE'] == '--defconfig'}
1065 summary_info += {'plugin support': config_host.has_key('CONFIG_PLUGIN')}
1066 summary_info += {'fuzzing support': config_host.has_key('CONFIG_FUZZ')}
1067 if config_host.has_key('HAVE_GDB_BIN')
1068 summary_info += {'gdb': config_host['HAVE_GDB_BIN']}
1070 summary_info += {'thread sanitizer': config_host.has_key('CONFIG_TSAN')}
1071 summary_info += {'rng-none': config_host.has_key('CONFIG_RNG_NONE')}
1072 summary_info += {'Linux keyring': config_host.has_key('CONFIG_SECRET_KEYRING')}
1073 summary(summary_info, bool_yn: true)
1075 if not supported_cpus.contains(cpu)
1077 warning('SUPPORT FOR THIS HOST CPU WILL GO AWAY IN FUTURE RELEASES!')
1079 message('CPU host architecture ' + cpu + ' support is not currently maintained.')
1080 message('The QEMU project intends to remove support for this host CPU in')
1081 message('a future release if nobody volunteers to maintain it and to')
1082 message('provide a build host for our continuous integration setup.')
1083 message('configure has succeeded and you can continue to build, but')
1084 message('if you care about QEMU on this platform you should contact')
1088 if not supported_oses.contains(targetos)
1090 warning('WARNING: SUPPORT FOR THIS HOST OS WILL GO AWAY IN FUTURE RELEASES!')
1092 message('Host OS ' + targetos + 'support is not currently maintained.')
1093 message('The QEMU project intends to remove support for this host OS in')
1094 message('a future release if nobody volunteers to maintain it and to')
1095 message('provide a build host for our continuous integration setup.')
1096 message('configure has succeeded and you can continue to build, but')
1097 message('if you care about QEMU on this platform you should contact')