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') 7ss = import('sourceset') 8 9sh = find_program('sh') 10cc = meson.get_compiler('c') 11config_host = keyval.load(meson.current_build_dir() / 'config-host.mak') 12config_all_disas = keyval.load(meson.current_build_dir() / 'config-all-disas.mak') 13enable_modules = 'CONFIG_MODULES' in config_host 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 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 30if host_machine.system() == 'darwin' 31 add_languages('objc', required: false, native: false) 32endif 33 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 41configure_file(input: files('scripts/ninjatool.py'), 42 output: 'ninjatool', 43 configuration: config_host) 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 52m = cc.find_library('m', required: false) 53util = cc.find_library('util', required: false) 54winmm = [] 55socket = [] 56version_res = [] 57coref = [] 58iokit = [] 59cocoa = [] 60hvf = [] 61if targetos == 'windows' 62 socket = cc.find_library('ws2_32') 63 winmm = cc.find_library('winmm') 64 65 win = import('windows') 66 version_res = win.compile_resources('version.rc', 67 depend_files: files('pc-bios/qemu-nsis.ico'), 68 include_directories: include_directories('.')) 69elif targetos == 'darwin' 70 coref = dependency('appleframeworks', modules: 'CoreFoundation') 71 iokit = dependency('appleframeworks', modules: 'IOKit') 72 cocoa = dependency('appleframeworks', modules: 'Cocoa') 73 hvf = dependency('appleframeworks', modules: 'Hypervisor') 74elif targetos == 'sunos' 75 socket = [cc.find_library('socket'), 76 cc.find_library('nsl'), 77 cc.find_library('resolv')] 78elif targetos == 'haiku' 79 socket = [cc.find_library('posix_error_mapper'), 80 cc.find_library('network'), 81 cc.find_library('bsd')] 82endif 83glib = declare_dependency(compile_args: config_host['GLIB_CFLAGS'].split(), 84 link_args: config_host['GLIB_LIBS'].split()) 85gio = not_found 86if 'CONFIG_GIO' in config_host 87 gio = declare_dependency(compile_args: config_host['GIO_CFLAGS'].split(), 88 link_args: config_host['GIO_LIBS'].split()) 89endif 90lttng = not_found 91if 'CONFIG_TRACE_UST' in config_host 92 lttng = declare_dependency(link_args: config_host['LTTNG_UST_LIBS'].split()) 93endif 94urcubp = not_found 95if 'CONFIG_TRACE_UST' in config_host 96 urcubp = declare_dependency(link_args: config_host['URCU_BP_LIBS'].split()) 97endif 98nettle = not_found 99if 'CONFIG_NETTLE' in config_host 100 nettle = declare_dependency(compile_args: config_host['NETTLE_CFLAGS'].split(), 101 link_args: config_host['NETTLE_LIBS'].split()) 102endif 103gnutls = not_found 104if 'CONFIG_GNUTLS' in config_host 105 gnutls = declare_dependency(compile_args: config_host['GNUTLS_CFLAGS'].split(), 106 link_args: config_host['GNUTLS_LIBS'].split()) 107endif 108pixman = declare_dependency(compile_args: config_host['PIXMAN_CFLAGS'].split(), 109 link_args: config_host['PIXMAN_LIBS'].split()) 110pam = not_found 111if 'CONFIG_AUTH_PAM' in config_host 112 pam = cc.find_library('pam') 113endif 114libaio = cc.find_library('aio', required: false) 115zlib = not_found 116if 'CONFIG_ZLIB' in config_host 117 zlib = declare_dependency(compile_args: config_host['ZLIB_CFLAGS'].split(), 118 link_args: config_host['ZLIB_LIBS'].split()) 119endif 120linux_io_uring = not_found 121if 'CONFIG_LINUX_IO_URING' in config_host 122 linux_io_uring = declare_dependency(compile_args: config_host['LINUX_IO_URING_CFLAGS'].split(), 123 link_args: config_host['LINUX_IO_URING_LIBS'].split()) 124endif 125libxml2 = not_found 126if 'CONFIG_LIBXML2' in config_host 127 libxml2 = declare_dependency(compile_args: config_host['LIBXML2_CFLAGS'].split(), 128 link_args: config_host['LIBXML2_LIBS'].split()) 129endif 130libnfs = not_found 131if 'CONFIG_LIBNFS' in config_host 132 libnfs = declare_dependency(link_args: config_host['LIBNFS_LIBS'].split()) 133endif 134libattr = not_found 135if 'CONFIG_ATTR' in config_host 136 libattr = declare_dependency(link_args: config_host['LIBATTR_LIBS'].split()) 137endif 138seccomp = not_found 139if 'CONFIG_SECCOMP' in config_host 140 seccomp = declare_dependency(compile_args: config_host['SECCOMP_CFLAGS'].split(), 141 link_args: config_host['SECCOMP_LIBS'].split()) 142endif 143libcap_ng = not_found 144if 'CONFIG_LIBCAP_NG' in config_host 145 libcap_ng = declare_dependency(link_args: config_host['LIBCAP_NG_LIBS'].split()) 146endif 147xkbcommon = not_found 148if 'CONFIG_XKBCOMMON' in config_host 149 xkbcommon = declare_dependency(compile_args: config_host['XKBCOMMON_CFLAGS'].split(), 150 link_args: config_host['XKBCOMMON_LIBS'].split()) 151endif 152slirp = not_found 153if 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()) 156endif 157vde = not_found 158if config_host.has_key('CONFIG_VDE') 159 vde = declare_dependency(link_args: config_host['VDE_LIBS'].split()) 160endif 161pulse = not_found 162if 'CONFIG_LIBPULSE' in config_host 163 pulse = declare_dependency(compile_args: config_host['PULSE_CFLAGS'].split(), 164 link_args: config_host['PULSE_LIBS'].split()) 165endif 166alsa = not_found 167if 'CONFIG_ALSA' in config_host 168 alsa = declare_dependency(compile_args: config_host['ALSA_CFLAGS'].split(), 169 link_args: config_host['ALSA_LIBS'].split()) 170endif 171jack = not_found 172if 'CONFIG_LIBJACK' in config_host 173 jack = declare_dependency(link_args: config_host['JACK_LIBS'].split()) 174endif 175spice = not_found 176if 'CONFIG_SPICE' in config_host 177 spice = declare_dependency(compile_args: config_host['SPICE_CFLAGS'].split(), 178 link_args: config_host['SPICE_LIBS'].split()) 179endif 180rt = cc.find_library('rt', required: false) 181libmpathpersist = not_found 182if config_host.has_key('CONFIG_MPATH') 183 libmpathpersist = cc.find_library('mpathpersist') 184endif 185libiscsi = not_found 186if 'CONFIG_LIBISCSI' in config_host 187 libiscsi = declare_dependency(compile_args: config_host['LIBISCSI_CFLAGS'].split(), 188 link_args: config_host['LIBISCSI_LIBS'].split()) 189endif 190zstd = not_found 191if 'CONFIG_ZSTD' in config_host 192 zstd = declare_dependency(compile_args: config_host['ZSTD_CFLAGS'].split(), 193 link_args: config_host['ZSTD_LIBS'].split()) 194endif 195gbm = not_found 196if 'CONFIG_GBM' in config_host 197 gbm = declare_dependency(compile_args: config_host['GBM_CFLAGS'].split(), 198 link_args: config_host['GBM_LIBS'].split()) 199endif 200virgl = not_found 201if 'CONFIG_VIRGL' in config_host 202 virgl = declare_dependency(compile_args: config_host['VIRGL_CFLAGS'].split(), 203 link_args: config_host['VIRGL_LIBS'].split()) 204endif 205curl = not_found 206if 'CONFIG_CURL' in config_host 207 curl = declare_dependency(compile_args: config_host['CURL_CFLAGS'].split(), 208 link_args: config_host['CURL_LIBS'].split()) 209endif 210libudev = not_found 211if 'CONFIG_LIBUDEV' in config_host 212 libudev = declare_dependency(link_args: config_host['LIBUDEV_LIBS'].split()) 213endif 214brlapi = not_found 215if 'CONFIG_BRLAPI' in config_host 216 brlapi = declare_dependency(link_args: config_host['BRLAPI_LIBS'].split()) 217endif 218sdlwindows = false 219sdl = not_found 220if 'CONFIG_SDL' in config_host 221 sdl = declare_dependency(compile_args: config_host['SDL_CFLAGS'].split(), 222 link_args: config_host['SDL_LIBS'].split()) 223 sdlwindows = config_host['SDL_LIBS'].contains('-mwindows') 224endif 225rbd = not_found 226if 'CONFIG_RBD' in config_host 227 rbd = declare_dependency(link_args: config_host['RBD_LIBS'].split()) 228endif 229glusterfs = not_found 230if 'CONFIG_GLUSTERFS' in config_host 231 glusterfs = declare_dependency(compile_args: config_host['GLUSTERFS_CFLAGS'].split(), 232 link_args: config_host['GLUSTERFS_LIBS'].split()) 233endif 234libssh = not_found 235if 'CONFIG_LIBSSH' in config_host 236 libssh = declare_dependency(compile_args: config_host['LIBSSH_CFLAGS'].split(), 237 link_args: config_host['LIBSSH_LIBS'].split()) 238endif 239libbzip2 = not_found 240if 'CONFIG_BZIP2' in config_host 241 libbzip2 = declare_dependency(link_args: config_host['BZIP2_LIBS'].split()) 242endif 243liblzfse = not_found 244if 'CONFIG_LZFSE' in config_host 245 liblzfse = declare_dependency(link_args: config_host['LZFSE_LIBS'].split()) 246endif 247oss = not_found 248if 'CONFIG_AUDIO_OSS' in config_host 249 oss = declare_dependency(link_args: config_host['OSS_LIBS'].split()) 250endif 251dsound = not_found 252if 'CONFIG_AUDIO_DSOUND' in config_host 253 dsound = declare_dependency(link_args: config_host['DSOUND_LIBS'].split()) 254endif 255coreaudio = not_found 256if 'CONFIG_AUDIO_COREAUDIO' in config_host 257 coreaudio = declare_dependency(link_args: config_host['COREAUDIO_LIBS'].split()) 258endif 259opengl = not_found 260if 'CONFIG_OPENGL' in config_host 261 opengl = declare_dependency(link_args: config_host['OPENGL_LIBS'].split()) 262else 263endif 264gtk = not_found 265if 'CONFIG_GTK' in config_host 266 gtk = declare_dependency(compile_args: config_host['GTK_CFLAGS'].split(), 267 link_args: config_host['GTK_LIBS'].split()) 268endif 269vte = not_found 270if 'CONFIG_VTE' in config_host 271 vte = declare_dependency(compile_args: config_host['VTE_CFLAGS'].split(), 272 link_args: config_host['VTE_LIBS'].split()) 273endif 274x11 = not_found 275if 'CONFIG_X11' in config_host 276 x11 = declare_dependency(compile_args: config_host['X11_CFLAGS'].split(), 277 link_args: config_host['X11_LIBS'].split()) 278endif 279curses = not_found 280if 'CONFIG_CURSES' in config_host 281 curses = declare_dependency(compile_args: config_host['CURSES_CFLAGS'].split(), 282 link_args: config_host['CURSES_LIBS'].split()) 283endif 284iconv = not_found 285if 'CONFIG_ICONV' in config_host 286 iconv = declare_dependency(compile_args: config_host['ICONV_CFLAGS'].split(), 287 link_args: config_host['ICONV_LIBS'].split()) 288endif 289gio = not_found 290if 'CONFIG_GIO' in config_host 291 gio = declare_dependency(compile_args: config_host['GIO_CFLAGS'].split(), 292 link_args: config_host['GIO_LIBS'].split()) 293endif 294png = not_found 295if 'CONFIG_VNC_PNG' in config_host 296 png = declare_dependency(compile_args: config_host['PNG_CFLAGS'].split(), 297 link_args: config_host['PNG_LIBS'].split()) 298endif 299jpeg = not_found 300if 'CONFIG_VNC_JPEG' in config_host 301 jpeg = declare_dependency(compile_args: config_host['JPEG_CFLAGS'].split(), 302 link_args: config_host['JPEG_LIBS'].split()) 303endif 304sasl = not_found 305if 'CONFIG_VNC_SASL' in config_host 306 sasl = declare_dependency(compile_args: config_host['SASL_CFLAGS'].split(), 307 link_args: config_host['SASL_LIBS'].split()) 308endif 309fdt = not_found 310if 'CONFIG_FDT' in config_host 311 fdt = declare_dependency(compile_args: config_host['FDT_CFLAGS'].split(), 312 link_args: config_host['FDT_LIBS'].split()) 313endif 314snappy = not_found 315if 'CONFIG_SNAPPY' in config_host 316 snappy = declare_dependency(link_args: config_host['SNAPPY_LIBS'].split()) 317endif 318lzo = not_found 319if 'CONFIG_LZO' in config_host 320 lzo = declare_dependency(link_args: config_host['LZO_LIBS'].split()) 321endif 322rdma = not_found 323if 'CONFIG_RDMA' in config_host 324 rdma = declare_dependency(link_args: config_host['RDMA_LIBS'].split()) 325endif 326numa = not_found 327if 'CONFIG_NUMA' in config_host 328 numa = declare_dependency(link_args: config_host['NUMA_LIBS'].split()) 329endif 330xen = not_found 331if 'CONFIG_XEN_BACKEND' in config_host 332 xen = declare_dependency(compile_args: config_host['XEN_CFLAGS'].split(), 333 link_args: config_host['XEN_LIBS'].split()) 334endif 335cacard = not_found 336if 'CONFIG_SMARTCARD' in config_host 337 cacard = declare_dependency(compile_args: config_host['SMARTCARD_CFLAGS'].split(), 338 link_args: config_host['SMARTCARD_LIBS'].split()) 339endif 340usbredir = not_found 341if 'CONFIG_USB_REDIR' in config_host 342 usbredir = declare_dependency(compile_args: config_host['USB_REDIR_CFLAGS'].split(), 343 link_args: config_host['USB_REDIR_LIBS'].split()) 344endif 345libusb = not_found 346if 'CONFIG_USB_LIBUSB' in config_host 347 libusb = declare_dependency(compile_args: config_host['LIBUSB_CFLAGS'].split(), 348 link_args: config_host['LIBUSB_LIBS'].split()) 349endif 350capstone = not_found 351if 'CONFIG_CAPSTONE' in config_host 352 capstone = declare_dependency(compile_args: config_host['CAPSTONE_CFLAGS'].split(), 353 link_args: config_host['CAPSTONE_LIBS'].split()) 354endif 355libpmem = not_found 356if 'CONFIG_LIBPMEM' in config_host 357 libpmem = declare_dependency(compile_args: config_host['LIBPMEM_CFLAGS'].split(), 358 link_args: config_host['LIBPMEM_LIBS'].split()) 359endif 360 361create_config = find_program('scripts/create_config') 362minikconf = find_program('scripts/minikconf.py') 363target_dirs = config_host['TARGET_DIRS'].split() 364have_user = false 365have_system = false 366config_devices_mak_list = [] 367config_devices_h = {} 368config_target_mak = {} 369kconfig_external_symbols = [ 370 'CONFIG_KVM', 371 'CONFIG_XEN', 372 'CONFIG_TPM', 373 'CONFIG_SPICE', 374 'CONFIG_IVSHMEM', 375 'CONFIG_OPENGL', 376 'CONFIG_X11', 377 'CONFIG_VHOST_USER', 378 'CONFIG_VHOST_KERNEL', 379 'CONFIG_VIRTFS', 380 'CONFIG_LINUX', 381 'CONFIG_PVRDMA', 382] 383foreach target : target_dirs 384 have_user = have_user or target.endswith('-user') 385 config_target = keyval.load(meson.current_build_dir() / target / 'config-target.mak') + config_host 386 387 if target.endswith('-softmmu') 388 have_system = true 389 390 base_kconfig = [] 391 foreach sym : kconfig_external_symbols 392 if sym in config_target 393 base_kconfig += '@0@=y'.format(sym) 394 endif 395 endforeach 396 397 config_devices_mak = target + '-config-devices.mak' 398 config_devices_mak = configure_file( 399 input: ['default-configs' / target + '.mak', 'Kconfig'], 400 output: config_devices_mak, 401 depfile: config_devices_mak + '.d', 402 capture: true, 403 command: [minikconf, config_host['CONFIG_MINIKCONF_MODE'], 404 config_devices_mak, '@DEPFILE@', '@INPUT@', 405 base_kconfig]) 406 config_devices_h += {target: custom_target( 407 target + '-config-devices.h', 408 input: config_devices_mak, 409 output: target + '-config-devices.h', 410 capture: true, 411 command: [create_config, '@INPUT@'])} 412 config_devices_mak_list += config_devices_mak 413 config_target += keyval.load(config_devices_mak) 414 endif 415 config_target_mak += {target: config_target} 416endforeach 417have_tools = 'CONFIG_TOOLS' in config_host 418have_block = have_system or have_tools 419 420grepy = find_program('scripts/grepy.sh') 421# This configuration is used to build files that are shared by 422# multiple binaries, and then extracted out of the "common" 423# static_library target. 424# 425# We do not use all_sources()/all_dependencies(), because it would 426# build literally all source files, including devices only used by 427# targets that are not built for this compilation. The CONFIG_ALL 428# pseudo symbol replaces it. 429 430if have_system 431 config_all_devices_mak = configure_file( 432 output: 'config-all-devices.mak', 433 input: config_devices_mak_list, 434 capture: true, 435 command: [grepy, '@INPUT@'], 436 ) 437 config_all_devices = keyval.load(config_all_devices_mak) 438else 439 config_all_devices = {} 440endif 441config_all = config_all_devices 442config_all += config_host 443config_all += config_all_disas 444config_all += { 445 'CONFIG_XEN': config_host.has_key('CONFIG_XEN_BACKEND'), 446 'CONFIG_SOFTMMU': have_system, 447 'CONFIG_USER_ONLY': have_user, 448 'CONFIG_ALL': true, 449} 450 451# Generators 452 453genh = [] 454hxtool = find_program('scripts/hxtool') 455shaderinclude = find_program('scripts/shaderinclude.pl') 456qapi_gen = find_program('scripts/qapi-gen.py') 457qapi_gen_depends = [ meson.source_root() / 'scripts/qapi/__init__.py', 458 meson.source_root() / 'scripts/qapi/commands.py', 459 meson.source_root() / 'scripts/qapi/common.py', 460 meson.source_root() / 'scripts/qapi/doc.py', 461 meson.source_root() / 'scripts/qapi/error.py', 462 meson.source_root() / 'scripts/qapi/events.py', 463 meson.source_root() / 'scripts/qapi/expr.py', 464 meson.source_root() / 'scripts/qapi/gen.py', 465 meson.source_root() / 'scripts/qapi/introspect.py', 466 meson.source_root() / 'scripts/qapi/parser.py', 467 meson.source_root() / 'scripts/qapi/schema.py', 468 meson.source_root() / 'scripts/qapi/source.py', 469 meson.source_root() / 'scripts/qapi/types.py', 470 meson.source_root() / 'scripts/qapi/visit.py', 471 meson.source_root() / 'scripts/qapi/common.py', 472 meson.source_root() / 'scripts/qapi/doc.py', 473 meson.source_root() / 'scripts/qapi-gen.py' 474] 475 476tracetool = [ 477 python, files('scripts/tracetool.py'), 478 '--backend=' + config_host['TRACE_BACKENDS'] 479] 480 481qemu_version_cmd = [find_program('scripts/qemu-version.sh'), 482 meson.current_source_dir(), 483 config_host['PKGVERSION'], config_host['VERSION']] 484qemu_version = custom_target('qemu-version.h', 485 output: 'qemu-version.h', 486 command: qemu_version_cmd, 487 capture: true, 488 build_by_default: true, 489 build_always_stale: true) 490genh += qemu_version 491 492config_host_h = custom_target('config-host.h', 493 input: meson.current_build_dir() / 'config-host.mak', 494 output: 'config-host.h', 495 capture: true, 496 command: [create_config, '@INPUT@']) 497genh += config_host_h 498 499hxdep = [] 500hx_headers = [ 501 ['qemu-options.hx', 'qemu-options.def'], 502 ['qemu-img-cmds.hx', 'qemu-img-cmds.h'], 503] 504if have_system 505 hx_headers += [ 506 ['hmp-commands.hx', 'hmp-commands.h'], 507 ['hmp-commands-info.hx', 'hmp-commands-info.h'], 508 ] 509endif 510foreach d : hx_headers 511 hxdep += custom_target(d[1], 512 input: files(d[0]), 513 output: d[1], 514 capture: true, 515 build_by_default: true, # to be removed when added to a target 516 command: [hxtool, '-h', '@INPUT0@']) 517endforeach 518genh += hxdep 519 520# Collect sourcesets. 521 522util_ss = ss.source_set() 523stub_ss = ss.source_set() 524trace_ss = ss.source_set() 525block_ss = ss.source_set() 526blockdev_ss = ss.source_set() 527qmp_ss = ss.source_set() 528common_ss = ss.source_set() 529softmmu_ss = ss.source_set() 530user_ss = ss.source_set() 531bsd_user_ss = ss.source_set() 532linux_user_ss = ss.source_set() 533specific_ss = ss.source_set() 534specific_fuzz_ss = ss.source_set() 535 536modules = {} 537hw_arch = {} 538target_arch = {} 539target_softmmu_arch = {} 540 541############### 542# Trace files # 543############### 544 545# TODO: add each directory to the subdirs from its own meson.build, once 546# we have those 547trace_events_subdirs = [ 548 'accel/kvm', 549 'accel/tcg', 550 'crypto', 551 'monitor', 552] 553if have_user 554 trace_events_subdirs += [ 'linux-user' ] 555endif 556if have_block 557 trace_events_subdirs += [ 558 'authz', 559 'block', 560 'io', 561 'nbd', 562 'scsi', 563 ] 564endif 565if have_system 566 trace_events_subdirs += [ 567 'audio', 568 'backends', 569 'backends/tpm', 570 'chardev', 571 'hw/9pfs', 572 'hw/acpi', 573 'hw/alpha', 574 'hw/arm', 575 'hw/audio', 576 'hw/block', 577 'hw/block/dataplane', 578 'hw/char', 579 'hw/display', 580 'hw/dma', 581 'hw/hppa', 582 'hw/hyperv', 583 'hw/i2c', 584 'hw/i386', 585 'hw/i386/xen', 586 'hw/ide', 587 'hw/input', 588 'hw/intc', 589 'hw/isa', 590 'hw/mem', 591 'hw/mips', 592 'hw/misc', 593 'hw/misc/macio', 594 'hw/net', 595 'hw/nvram', 596 'hw/pci', 597 'hw/pci-host', 598 'hw/ppc', 599 'hw/rdma', 600 'hw/rdma/vmw', 601 'hw/rtc', 602 'hw/s390x', 603 'hw/scsi', 604 'hw/sd', 605 'hw/sparc', 606 'hw/sparc64', 607 'hw/ssi', 608 'hw/timer', 609 'hw/tpm', 610 'hw/usb', 611 'hw/vfio', 612 'hw/virtio', 613 'hw/watchdog', 614 'hw/xen', 615 'hw/gpio', 616 'hw/riscv', 617 'migration', 618 'net', 619 'ui', 620 ] 621endif 622trace_events_subdirs += [ 623 'hw/core', 624 'qapi', 625 'qom', 626 'target/arm', 627 'target/hppa', 628 'target/i386', 629 'target/mips', 630 'target/ppc', 631 'target/riscv', 632 'target/s390x', 633 'target/sparc', 634 'util', 635] 636 637subdir('qapi') 638subdir('qobject') 639subdir('stubs') 640subdir('trace') 641subdir('util') 642subdir('qom') 643subdir('authz') 644subdir('crypto') 645subdir('ui') 646 647 648if enable_modules 649 libmodulecommon = static_library('module-common', files('module-common.c') + genh, pic: true, c_args: '-DBUILD_DSO') 650 modulecommon = declare_dependency(link_whole: libmodulecommon, compile_args: '-DBUILD_DSO') 651endif 652 653# Build targets from sourcesets 654 655stub_ss = stub_ss.apply(config_all, strict: false) 656 657util_ss.add_all(trace_ss) 658util_ss = util_ss.apply(config_all, strict: false) 659libqemuutil = static_library('qemuutil', 660 sources: util_ss.sources() + stub_ss.sources() + genh, 661 dependencies: [util_ss.dependencies(), m, glib, socket]) 662qemuutil = declare_dependency(link_with: libqemuutil, 663 sources: genh + version_res) 664 665decodetree = generator(find_program('scripts/decodetree.py'), 666 output: 'decode-@BASENAME@.c.inc', 667 arguments: ['@INPUT@', '@EXTRA_ARGS@', '-o', '@OUTPUT@']) 668 669subdir('audio') 670subdir('io') 671subdir('chardev') 672subdir('fsdev') 673subdir('libdecnumber') 674subdir('target') 675subdir('dump') 676 677block_ss.add(files( 678 'block.c', 679 'blockjob.c', 680 'job.c', 681 'qemu-io-cmds.c', 682)) 683block_ss.add(when: 'CONFIG_REPLICATION', if_true: files('replication.c')) 684 685subdir('nbd') 686subdir('scsi') 687subdir('block') 688 689blockdev_ss.add(files( 690 'blockdev.c', 691 'blockdev-nbd.c', 692 'iothread.c', 693 'job-qmp.c', 694)) 695 696# os-posix.c contains POSIX-specific functions used by qemu-storage-daemon, 697# os-win32.c does not 698blockdev_ss.add(when: 'CONFIG_POSIX', if_true: files('os-posix.c')) 699softmmu_ss.add(when: 'CONFIG_WIN32', if_true: [files('os-win32.c')]) 700 701softmmu_ss.add_all(blockdev_ss) 702softmmu_ss.add(files( 703 'bootdevice.c', 704 'dma-helpers.c', 705 'qdev-monitor.c', 706), sdl) 707 708softmmu_ss.add(when: 'CONFIG_TPM', if_true: files('tpm.c')) 709softmmu_ss.add(when: 'CONFIG_SECCOMP', if_true: [files('qemu-seccomp.c'), seccomp]) 710softmmu_ss.add(when: ['CONFIG_FDT', fdt], if_true: [files('device_tree.c')]) 711 712common_ss.add(files('cpus-common.c')) 713 714subdir('softmmu') 715 716specific_ss.add(files('disas.c', 'exec.c', 'gdbstub.c'), capstone, libpmem) 717specific_ss.add(files('exec-vary.c')) 718specific_ss.add(when: 'CONFIG_TCG', if_true: files( 719 'fpu/softfloat.c', 720 'tcg/optimize.c', 721 'tcg/tcg-common.c', 722 'tcg/tcg-op-gvec.c', 723 'tcg/tcg-op-vec.c', 724 'tcg/tcg-op.c', 725 'tcg/tcg.c', 726)) 727specific_ss.add(when: 'CONFIG_TCG_INTERPRETER', if_true: files('disas/tci.c', 'tcg/tci.c')) 728 729subdir('backends') 730subdir('disas') 731subdir('migration') 732subdir('monitor') 733subdir('net') 734subdir('replay') 735subdir('hw') 736subdir('accel') 737subdir('plugins') 738subdir('bsd-user') 739subdir('linux-user') 740 741bsd_user_ss.add(files('gdbstub.c')) 742specific_ss.add_all(when: 'CONFIG_BSD_USER', if_true: bsd_user_ss) 743 744linux_user_ss.add(files('gdbstub.c', 'thunk.c')) 745specific_ss.add_all(when: 'CONFIG_LINUX_USER', if_true: linux_user_ss) 746 747# needed for fuzzing binaries 748subdir('tests/qtest/libqos') 749subdir('tests/qtest/fuzz') 750 751block_mods = [] 752softmmu_mods = [] 753foreach d, list : modules 754 foreach m, module_ss : list 755 if enable_modules and targetos != 'windows' 756 module_ss = module_ss.apply(config_host, strict: false) 757 sl = static_library(d + '-' + m, [genh, module_ss.sources()], 758 dependencies: [modulecommon, module_ss.dependencies()], pic: true) 759 if d == 'block' 760 block_mods += sl 761 else 762 softmmu_mods += sl 763 endif 764 else 765 if d == 'block' 766 block_ss.add_all(module_ss) 767 else 768 softmmu_ss.add_all(module_ss) 769 endif 770 endif 771 endforeach 772endforeach 773 774nm = find_program('nm') 775undefsym = find_program('scripts/undefsym.sh') 776block_syms = custom_target('block.syms', output: 'block.syms', 777 input: [libqemuutil, block_mods], 778 capture: true, 779 command: [undefsym, nm, '@INPUT@']) 780qemu_syms = custom_target('qemu.syms', output: 'qemu.syms', 781 input: [libqemuutil, softmmu_mods], 782 capture: true, 783 command: [undefsym, nm, '@INPUT@']) 784 785block_ss = block_ss.apply(config_host, strict: false) 786libblock = static_library('block', block_ss.sources() + genh, 787 dependencies: block_ss.dependencies(), 788 link_depends: block_syms, 789 name_suffix: 'fa', 790 build_by_default: false) 791 792block = declare_dependency(link_whole: [libblock], 793 link_args: '@block.syms', 794 dependencies: [crypto, io]) 795 796qmp_ss = qmp_ss.apply(config_host, strict: false) 797libqmp = static_library('qmp', qmp_ss.sources() + genh, 798 dependencies: qmp_ss.dependencies(), 799 name_suffix: 'fa', 800 build_by_default: false) 801 802qmp = declare_dependency(link_whole: [libqmp]) 803 804foreach m : block_mods + softmmu_mods 805 shared_module(m.name(), 806 name_prefix: '', 807 link_whole: m, 808 install: true, 809 install_dir: config_host['qemu_moddir']) 810endforeach 811 812softmmu_ss.add(authz, block, chardev, crypto, io, qmp) 813common_ss.add(qom, qemuutil) 814 815common_ss.add_all(when: 'CONFIG_SOFTMMU', if_true: [softmmu_ss]) 816common_ss.add_all(when: 'CONFIG_USER_ONLY', if_true: user_ss) 817 818common_all = common_ss.apply(config_all, strict: false) 819common_all = static_library('common', 820 build_by_default: false, 821 sources: common_all.sources() + genh, 822 dependencies: common_all.dependencies(), 823 name_suffix: 'fa') 824 825feature_to_c = find_program('scripts/feature_to_c.sh') 826 827emulators = [] 828foreach target : target_dirs 829 config_target = config_target_mak[target] 830 target_name = config_target['TARGET_NAME'] 831 arch = config_target['TARGET_BASE_ARCH'] 832 arch_srcs = [] 833 arch_deps = [] 834 c_args = ['-DNEED_CPU_H', 835 '-DCONFIG_TARGET="@0@-config-target.h"'.format(target), 836 '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)] 837 link_args = [] 838 839 target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])] 840 if targetos == 'linux' 841 target_inc += include_directories('linux-headers', is_system: true) 842 endif 843 if target.endswith('-softmmu') 844 qemu_target_name = 'qemu-system-' + target_name 845 target_type='system' 846 t = target_softmmu_arch[arch].apply(config_target, strict: false) 847 arch_srcs += t.sources() 848 arch_deps += t.dependencies() 849 850 hw_dir = target_name == 'sparc64' ? 'sparc64' : arch 851 hw = hw_arch[hw_dir].apply(config_target, strict: false) 852 arch_srcs += hw.sources() 853 arch_deps += hw.dependencies() 854 855 arch_srcs += config_devices_h[target] 856 link_args += ['@block.syms', '@qemu.syms'] 857 else 858 abi = config_target['TARGET_ABI_DIR'] 859 target_type='user' 860 qemu_target_name = 'qemu-' + target_name 861 if 'CONFIG_LINUX_USER' in config_target 862 base_dir = 'linux-user' 863 target_inc += include_directories('linux-user/host/' / config_host['ARCH']) 864 else 865 base_dir = 'bsd-user' 866 endif 867 target_inc += include_directories( 868 base_dir, 869 base_dir / abi, 870 ) 871 if 'CONFIG_LINUX_USER' in config_target 872 dir = base_dir / abi 873 arch_srcs += files(dir / 'signal.c', dir / 'cpu_loop.c') 874 if config_target.has_key('TARGET_SYSTBL_ABI') 875 arch_srcs += \ 876 syscall_nr_generators[abi].process(base_dir / abi / config_target['TARGET_SYSTBL'], 877 extra_args : config_target['TARGET_SYSTBL_ABI']) 878 endif 879 endif 880 endif 881 882 if 'TARGET_XML_FILES' in config_target 883 gdbstub_xml = custom_target(target + '-gdbstub-xml.c', 884 output: target + '-gdbstub-xml.c', 885 input: files(config_target['TARGET_XML_FILES'].split()), 886 command: [feature_to_c, '@INPUT@'], 887 capture: true) 888 arch_srcs += gdbstub_xml 889 endif 890 891 t = target_arch[arch].apply(config_target, strict: false) 892 arch_srcs += t.sources() 893 arch_deps += t.dependencies() 894 895 target_common = common_ss.apply(config_target, strict: false) 896 objects = common_all.extract_objects(target_common.sources()) 897 deps = target_common.dependencies() 898 899 # TODO: Change to generator once obj-y goes away 900 config_target_h = custom_target(target + '-config-target.h', 901 input: meson.current_build_dir() / target / 'config-target.mak', 902 output: target + '-config-target.h', 903 capture: true, 904 command: [create_config, '@INPUT@']) 905 906 target_specific = specific_ss.apply(config_target, strict: false) 907 arch_srcs += target_specific.sources() 908 arch_deps += target_specific.dependencies() 909 910 lib = static_library('qemu-' + target, 911 sources: arch_srcs + [config_target_h] + genh, 912 objects: objects, 913 include_directories: target_inc, 914 c_args: c_args, 915 build_by_default: false, 916 name_suffix: 'fa') 917 918 if target.endswith('-softmmu') 919 execs = [{ 920 'name': 'qemu-system-' + target_name, 921 'gui': false, 922 'sources': files('softmmu/main.c'), 923 'dependencies': [] 924 }] 925 if sdlwindows 926 execs += [{ 927 'name': 'qemu-system-' + target_name + 'w', 928 'gui': true, 929 'sources': files('softmmu/main.c'), 930 'dependencies': [] 931 }] 932 endif 933 if config_host.has_key('CONFIG_FUZZ') 934 specific_fuzz = specific_fuzz_ss.apply(config_target, strict: false) 935 execs += [{ 936 'name': 'qemu-fuzz-' + target_name, 937 'gui': false, 938 'sources': specific_fuzz.sources(), 939 'dependencies': specific_fuzz.dependencies(), 940 'link_depends': [files('tests/qtest/fuzz/fork_fuzz.ld')], 941 }] 942 endif 943 else 944 execs = [{ 945 'name': 'qemu-' + target_name, 946 'gui': false, 947 'sources': [], 948 'dependencies': [] 949 }] 950 endif 951 foreach exe: execs 952 emulators += executable(exe['name'], exe['sources'], 953 install: true, 954 c_args: c_args, 955 dependencies: arch_deps + deps + exe['dependencies'], 956 objects: lib.extract_all_objects(recursive: true), 957 link_language: link_language, 958 link_depends: [block_syms, qemu_syms] + exe.get('link_depends', []), 959 link_args: link_args, 960 gui_app: exe['gui']) 961 endforeach 962endforeach 963 964# Other build targets 965 966if 'CONFIG_PLUGIN' in config_host 967 install_headers('include/qemu/qemu-plugin.h') 968endif 969 970if 'CONFIG_GUEST_AGENT' in config_host 971 subdir('qga') 972endif 973 974if have_tools 975 qemu_img = executable('qemu-img', [files('qemu-img.c'), hxdep], 976 dependencies: [authz, block, crypto, io, qom, qemuutil], install: true) 977 qemu_io = executable('qemu-io', files('qemu-io.c'), 978 dependencies: [block, qemuutil], install: true) 979 if targetos == 'linux' or targetos == 'sunos' or targetos.endswith('bsd') 980 qemu_nbd = executable('qemu-nbd', files('qemu-nbd.c'), 981 dependencies: [block, qemuutil], install: true) 982 endif 983 984 subdir('storage-daemon') 985 subdir('contrib/rdmacm-mux') 986 subdir('contrib/elf2dmp') 987 988 if 'CONFIG_XKBCOMMON' in config_host 989 executable('qemu-keymap', files('qemu-keymap.c', 'ui/input-keymap.c'), 990 dependencies: [qemuutil, xkbcommon], install: true) 991 endif 992 993 executable('qemu-edid', files('qemu-edid.c', 'hw/display/edid-generate.c'), 994 dependencies: qemuutil, 995 install: true) 996 997 if 'CONFIG_VHOST_USER' in config_host 998 subdir('contrib/libvhost-user') 999 subdir('contrib/vhost-user-blk') 1000 if 'CONFIG_LINUX' in config_host 1001 subdir('contrib/vhost-user-gpu') 1002 endif 1003 subdir('contrib/vhost-user-input') 1004 subdir('contrib/vhost-user-scsi') 1005 endif 1006 1007 if targetos == 'linux' 1008 executable('qemu-bridge-helper', files('qemu-bridge-helper.c'), 1009 dependencies: [qemuutil, libcap_ng], 1010 install: true, 1011 install_dir: get_option('libexecdir')) 1012 1013 executable('qemu-pr-helper', files('scsi/qemu-pr-helper.c', 'scsi/utils.c'), 1014 dependencies: [authz, crypto, io, qom, qemuutil, 1015 libcap_ng, libudev, libmpathpersist], 1016 install: true) 1017 endif 1018 1019 if 'CONFIG_IVSHMEM' in config_host 1020 subdir('contrib/ivshmem-client') 1021 subdir('contrib/ivshmem-server') 1022 endif 1023endif 1024 1025subdir('tools') 1026subdir('pc-bios') 1027subdir('tests') 1028 1029summary_info = {} 1030summary_info += {'Install prefix': config_host['prefix']} 1031summary_info += {'BIOS directory': config_host['qemu_datadir']} 1032summary_info += {'firmware path': config_host['qemu_firmwarepath']} 1033summary_info += {'binary directory': config_host['bindir']} 1034summary_info += {'library directory': config_host['libdir']} 1035summary_info += {'module directory': config_host['qemu_moddir']} 1036summary_info += {'libexec directory': config_host['libexecdir']} 1037summary_info += {'include directory': config_host['includedir']} 1038summary_info += {'config directory': config_host['sysconfdir']} 1039if targetos != 'windows' 1040 summary_info += {'local state directory': config_host['qemu_localstatedir']} 1041 summary_info += {'Manual directory': config_host['mandir']} 1042else 1043 summary_info += {'local state directory': 'queried at runtime'} 1044endif 1045summary_info += {'Build directory': meson.current_build_dir()} 1046summary_info += {'Source path': meson.current_source_dir()} 1047summary_info += {'GIT binary': config_host['GIT']} 1048summary_info += {'GIT submodules': config_host['GIT_SUBMODULES']} 1049summary_info += {'C compiler': meson.get_compiler('c').cmd_array()[0]} 1050summary_info += {'Host C compiler': meson.get_compiler('c', native: true).cmd_array()[0]} 1051if link_language == 'cpp' 1052 summary_info += {'C++ compiler': meson.get_compiler('cpp').cmd_array()[0]} 1053else 1054 summary_info += {'C++ compiler': false} 1055endif 1056if targetos == 'darwin' 1057 summary_info += {'Objective-C compiler': meson.get_compiler('objc').cmd_array()[0]} 1058endif 1059summary_info += {'ARFLAGS': config_host['ARFLAGS']} 1060summary_info += {'CFLAGS': config_host['CFLAGS']} 1061summary_info += {'QEMU_CFLAGS': config_host['QEMU_CFLAGS']} 1062summary_info += {'QEMU_LDFLAGS': config_host['QEMU_LDFLAGS']} 1063summary_info += {'make': config_host['MAKE']} 1064summary_info += {'install': config_host['INSTALL']} 1065summary_info += {'python': '@0@ (version: @1@)'.format(python.full_path(), python.language_version())} 1066summary_info += {'sphinx-build': config_host['SPHINX_BUILD']} 1067summary_info += {'genisoimage': config_host['GENISOIMAGE']} 1068# TODO: add back version 1069summary_info += {'slirp support': config_host.has_key('CONFIG_SLIRP')} 1070if config_host.has_key('CONFIG_SLIRP') 1071 summary_info += {'smbd': config_host['CONFIG_SMBD_COMMAND']} 1072endif 1073summary_info += {'module support': config_host.has_key('CONFIG_MODULES')} 1074if config_host.has_key('CONFIG_MODULES') 1075 summary_info += {'alternative module path': config_host.has_key('CONFIG_MODULE_UPGRADES')} 1076endif 1077summary_info += {'host CPU': cpu} 1078summary_info += {'host endianness': build_machine.endian()} 1079summary_info += {'target list': config_host['TARGET_DIRS']} 1080summary_info += {'gprof enabled': config_host.has_key('CONFIG_GPROF')} 1081summary_info += {'sparse enabled': meson.get_compiler('c').cmd_array().contains('cgcc')} 1082summary_info += {'strip binaries': get_option('strip')} 1083summary_info += {'profiler': config_host.has_key('CONFIG_PROFILER')} 1084summary_info += {'static build': config_host.has_key('CONFIG_TOOLS')} 1085if targetos == 'darwin' 1086 summary_info += {'Cocoa support': config_host.has_key('CONFIG_COCOA')} 1087endif 1088# TODO: add back version 1089summary_info += {'SDL support': config_host.has_key('CONFIG_SDL')} 1090summary_info += {'SDL image support': config_host.has_key('CONFIG_SDL_IMAGE')} 1091# TODO: add back version 1092summary_info += {'GTK support': config_host.has_key('CONFIG_GTK')} 1093summary_info += {'GTK GL support': config_host.has_key('CONFIG_GTK_GL')} 1094# TODO: add back version 1095summary_info += {'VTE support': config_host.has_key('CONFIG_VTE')} 1096summary_info += {'TLS priority': config_host['CONFIG_TLS_PRIORITY']} 1097summary_info += {'GNUTLS support': config_host.has_key('CONFIG_GNUTLS')} 1098# TODO: add back version 1099summary_info += {'libgcrypt': config_host.has_key('CONFIG_GCRYPT')} 1100if config_host.has_key('CONFIG_GCRYPT') 1101 summary_info += {' hmac': config_host.has_key('CONFIG_GCRYPT_HMAC')} 1102 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')} 1103endif 1104# TODO: add back version 1105summary_info += {'nettle': config_host.has_key('CONFIG_NETTLE')} 1106if config_host.has_key('CONFIG_NETTLE') 1107 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')} 1108endif 1109summary_info += {'libtasn1': config_host.has_key('CONFIG_TASN1')} 1110summary_info += {'PAM': config_host.has_key('CONFIG_AUTH_PAM')} 1111summary_info += {'iconv support': config_host.has_key('CONFIG_ICONV')} 1112summary_info += {'curses support': config_host.has_key('CONFIG_CURSES')} 1113# TODO: add back version 1114summary_info += {'virgl support': config_host.has_key('CONFIG_VIRGL')} 1115summary_info += {'curl support': config_host.has_key('CONFIG_CURL')} 1116summary_info += {'mingw32 support': targetos == 'windows'} 1117summary_info += {'Audio drivers': config_host['CONFIG_AUDIO_DRIVERS']} 1118summary_info += {'Block whitelist (rw)': config_host['CONFIG_BDRV_RW_WHITELIST']} 1119summary_info += {'Block whitelist (ro)': config_host['CONFIG_BDRV_RO_WHITELIST']} 1120summary_info += {'VirtFS support': config_host.has_key('CONFIG_VIRTFS')} 1121summary_info += {'Multipath support': config_host.has_key('CONFIG_MPATH')} 1122summary_info += {'VNC support': config_host.has_key('CONFIG_VNC')} 1123if config_host.has_key('CONFIG_VNC') 1124 summary_info += {'VNC SASL support': config_host.has_key('CONFIG_VNC_SASL')} 1125 summary_info += {'VNC JPEG support': config_host.has_key('CONFIG_VNC_JPEG')} 1126 summary_info += {'VNC PNG support': config_host.has_key('CONFIG_VNC_PNG')} 1127endif 1128summary_info += {'xen support': config_host.has_key('CONFIG_XEN_BACKEND')} 1129if config_host.has_key('CONFIG_XEN_BACKEND') 1130 summary_info += {'xen ctrl version': config_host['CONFIG_XEN_CTRL_INTERFACE_VERSION']} 1131endif 1132summary_info += {'brlapi support': config_host.has_key('CONFIG_BRLAPI')} 1133summary_info += {'Documentation': config_host.has_key('BUILD_DOCS')} 1134summary_info += {'PIE': get_option('b_pie')} 1135summary_info += {'vde support': config_host.has_key('CONFIG_VDE')} 1136summary_info += {'netmap support': config_host.has_key('CONFIG_NETMAP')} 1137summary_info += {'Linux AIO support': config_host.has_key('CONFIG_LINUX_AIO')} 1138summary_info += {'Linux io_uring support': config_host.has_key('CONFIG_LINUX_IO_URING')} 1139summary_info += {'ATTR/XATTR support': config_host.has_key('CONFIG_ATTR')} 1140summary_info += {'Install blobs': config_host.has_key('INSTALL_BLOBS')} 1141# TODO: add back KVM/HAX/HVF/WHPX/TCG 1142#summary_info += {'KVM support': have_kvm'} 1143#summary_info += {'HAX support': have_hax'} 1144#summary_info += {'HVF support': have_hvf'} 1145#summary_info += {'WHPX support': have_whpx'} 1146#summary_info += {'TCG support': have_tcg'} 1147#if get_option('tcg') 1148# summary_info += {'TCG debug enabled': config_host.has_key('CONFIG_DEBUG_TCG')} 1149# summary_info += {'TCG interpreter': config_host.has_key('CONFIG_TCG_INTERPRETER')} 1150#endif 1151summary_info += {'malloc trim support': config_host.has_key('CONFIG_MALLOC_TRIM')} 1152summary_info += {'RDMA support': config_host.has_key('CONFIG_RDMA')} 1153summary_info += {'PVRDMA support': config_host.has_key('CONFIG_PVRDMA')} 1154summary_info += {'fdt support': config_host.has_key('CONFIG_FDT')} 1155summary_info += {'membarrier': config_host.has_key('CONFIG_MEMBARRIER')} 1156summary_info += {'preadv support': config_host.has_key('CONFIG_PREADV')} 1157summary_info += {'fdatasync': config_host.has_key('CONFIG_FDATASYNC')} 1158summary_info += {'madvise': config_host.has_key('CONFIG_MADVISE')} 1159summary_info += {'posix_madvise': config_host.has_key('CONFIG_POSIX_MADVISE')} 1160summary_info += {'posix_memalign': config_host.has_key('CONFIG_POSIX_MEMALIGN')} 1161summary_info += {'libcap-ng support': config_host.has_key('CONFIG_LIBCAP_NG')} 1162summary_info += {'vhost-net support': config_host.has_key('CONFIG_VHOST_NET')} 1163summary_info += {'vhost-crypto support': config_host.has_key('CONFIG_VHOST_CRYPTO')} 1164summary_info += {'vhost-scsi support': config_host.has_key('CONFIG_VHOST_SCSI')} 1165summary_info += {'vhost-vsock support': config_host.has_key('CONFIG_VHOST_VSOCK')} 1166summary_info += {'vhost-user support': config_host.has_key('CONFIG_VHOST_KERNEL')} 1167summary_info += {'vhost-user-fs support': config_host.has_key('CONFIG_VHOST_USER_FS')} 1168summary_info += {'vhost-vdpa support': config_host.has_key('CONFIG_VHOST_VDPA')} 1169summary_info += {'Trace backends': config_host['TRACE_BACKENDS']} 1170if config_host['TRACE_BACKENDS'].split().contains('simple') 1171 summary_info += {'Trace output file': config_host['CONFIG_TRACE_FILE'] + '-<pid>'} 1172endif 1173# TODO: add back protocol and server version 1174summary_info += {'spice support': config_host.has_key('CONFIG_SPICE')} 1175summary_info += {'rbd support': config_host.has_key('CONFIG_RBD')} 1176summary_info += {'xfsctl support': config_host.has_key('CONFIG_XFS')} 1177summary_info += {'smartcard support': config_host.has_key('CONFIG_SMARTCARD')} 1178summary_info += {'libusb': config_host.has_key('CONFIG_USB_LIBUSB')} 1179summary_info += {'usb net redir': config_host.has_key('CONFIG_USB_REDIR')} 1180summary_info += {'OpenGL support': config_host.has_key('CONFIG_OPENGL')} 1181summary_info += {'OpenGL dmabufs': config_host.has_key('CONFIG_OPENGL_DMABUF')} 1182summary_info += {'libiscsi support': config_host.has_key('CONFIG_LIBISCSI')} 1183summary_info += {'libnfs support': config_host.has_key('CONFIG_LIBNFS')} 1184summary_info += {'build guest agent': config_host.has_key('CONFIG_GUEST_AGENT')} 1185if targetos == 'windows' 1186 if 'WIN_SDK' in config_host 1187 summary_info += {'Windows SDK': config_host['WIN_SDK']} 1188 endif 1189 summary_info += {'QGA VSS support': config_host.has_key('CONFIG_QGA_VSS')} 1190 summary_info += {'QGA w32 disk info': config_host.has_key('CONFIG_QGA_NTDDSCSI')} 1191 summary_info += {'QGA MSI support': config_host.has_key('CONFIG_QGA_MSI_ENABLED')} 1192endif 1193summary_info += {'seccomp support': config_host.has_key('CONFIG_SECCOMP')} 1194summary_info += {'coroutine backend': config_host['CONFIG_COROUTINE_BACKEND']} 1195summary_info += {'coroutine pool': config_host['CONFIG_COROUTINE_POOL'] == '1'} 1196summary_info += {'debug stack usage': config_host.has_key('CONFIG_DEBUG_STACK_USAGE')} 1197summary_info += {'mutex debugging': config_host.has_key('CONFIG_DEBUG_MUTEX')} 1198summary_info += {'crypto afalg': config_host.has_key('CONFIG_AF_ALG')} 1199summary_info += {'GlusterFS support': config_host.has_key('CONFIG_GLUSTERFS')} 1200summary_info += {'gcov': get_option('b_coverage')} 1201summary_info += {'TPM support': config_host.has_key('CONFIG_TPM')} 1202summary_info += {'libssh support': config_host.has_key('CONFIG_LIBSSH')} 1203summary_info += {'QOM debugging': config_host.has_key('CONFIG_QOM_CAST_DEBUG')} 1204summary_info += {'Live block migration': config_host.has_key('CONFIG_LIVE_BLOCK_MIGRATION')} 1205summary_info += {'lzo support': config_host.has_key('CONFIG_LZO')} 1206summary_info += {'snappy support': config_host.has_key('CONFIG_SNAPPY')} 1207summary_info += {'bzip2 support': config_host.has_key('CONFIG_BZIP2')} 1208summary_info += {'lzfse support': config_host.has_key('CONFIG_LZFSE')} 1209summary_info += {'zstd support': config_host.has_key('CONFIG_ZSTD')} 1210summary_info += {'NUMA host support': config_host.has_key('CONFIG_NUMA')} 1211summary_info += {'libxml2': config_host.has_key('CONFIG_LIBXML2')} 1212summary_info += {'tcmalloc support': config_host.has_key('CONFIG_TCMALLOC')} 1213summary_info += {'jemalloc support': config_host.has_key('CONFIG_JEMALLOC')} 1214summary_info += {'avx2 optimization': config_host.has_key('CONFIG_AVX2_OPT')} 1215summary_info += {'avx512f optimization': config_host.has_key('CONFIG_AVX512F_OPT')} 1216summary_info += {'replication support': config_host.has_key('CONFIG_REPLICATION')} 1217summary_info += {'bochs support': config_host.has_key('CONFIG_BOCHS')} 1218summary_info += {'cloop support': config_host.has_key('CONFIG_CLOOP')} 1219summary_info += {'dmg support': config_host.has_key('CONFIG_DMG')} 1220summary_info += {'qcow v1 support': config_host.has_key('CONFIG_QCOW1')} 1221summary_info += {'vdi support': config_host.has_key('CONFIG_VDI')} 1222summary_info += {'vvfat support': config_host.has_key('CONFIG_VVFAT')} 1223summary_info += {'qed support': config_host.has_key('CONFIG_QED')} 1224summary_info += {'parallels support': config_host.has_key('CONFIG_PARALLELS')} 1225summary_info += {'sheepdog support': config_host.has_key('CONFIG_SHEEPDOG')} 1226summary_info += {'capstone': config_host.has_key('CONFIG_CAPSTONE')} 1227summary_info += {'libpmem support': config_host.has_key('CONFIG_LIBPMEM')} 1228summary_info += {'libdaxctl support': config_host.has_key('CONFIG_LIBDAXCTL')} 1229summary_info += {'libudev': config_host.has_key('CONFIG_LIBUDEV')} 1230summary_info += {'default devices': config_host['CONFIG_MINIKCONF_MODE'] == '--defconfig'} 1231summary_info += {'plugin support': config_host.has_key('CONFIG_PLUGIN')} 1232summary_info += {'fuzzing support': config_host.has_key('CONFIG_FUZZ')} 1233if config_host.has_key('HAVE_GDB_BIN') 1234 summary_info += {'gdb': config_host['HAVE_GDB_BIN']} 1235endif 1236summary_info += {'thread sanitizer': config_host.has_key('CONFIG_TSAN')} 1237summary_info += {'rng-none': config_host.has_key('CONFIG_RNG_NONE')} 1238summary_info += {'Linux keyring': config_host.has_key('CONFIG_SECRET_KEYRING')} 1239summary(summary_info, bool_yn: true) 1240 1241if not supported_cpus.contains(cpu) 1242 message() 1243 warning('SUPPORT FOR THIS HOST CPU WILL GO AWAY IN FUTURE RELEASES!') 1244 message() 1245 message('CPU host architecture ' + cpu + ' support is not currently maintained.') 1246 message('The QEMU project intends to remove support for this host CPU in') 1247 message('a future release if nobody volunteers to maintain it and to') 1248 message('provide a build host for our continuous integration setup.') 1249 message('configure has succeeded and you can continue to build, but') 1250 message('if you care about QEMU on this platform you should contact') 1251 message('us upstream at qemu-devel@nongnu.org.') 1252endif 1253 1254if not supported_oses.contains(targetos) 1255 message() 1256 warning('WARNING: SUPPORT FOR THIS HOST OS WILL GO AWAY IN FUTURE RELEASES!') 1257 message() 1258 message('Host OS ' + targetos + 'support is not currently maintained.') 1259 message('The QEMU project intends to remove support for this host OS in') 1260 message('a future release if nobody volunteers to maintain it and to') 1261 message('provide a build host for our continuous integration setup.') 1262 message('configure has succeeded and you can continue to build, but') 1263 message('if you care about QEMU on this platform you should contact') 1264 message('us upstream at qemu-devel@nongnu.org.') 1265endif 1266