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