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 650subdir('audio') 651subdir('io') 652subdir('chardev') 653subdir('fsdev') 654subdir('target') 655subdir('dump') 656 657block_ss.add(files( 658 'block.c', 659 'blockjob.c', 660 'job.c', 661 'qemu-io-cmds.c', 662)) 663block_ss.add(when: 'CONFIG_REPLICATION', if_true: files('replication.c')) 664 665subdir('nbd') 666subdir('scsi') 667subdir('block') 668 669blockdev_ss.add(files( 670 'blockdev.c', 671 'blockdev-nbd.c', 672 'iothread.c', 673 'job-qmp.c', 674)) 675 676# os-posix.c contains POSIX-specific functions used by qemu-storage-daemon, 677# os-win32.c does not 678blockdev_ss.add(when: 'CONFIG_POSIX', if_true: files('os-posix.c')) 679softmmu_ss.add(when: 'CONFIG_WIN32', if_true: [files('os-win32.c')]) 680 681softmmu_ss.add_all(blockdev_ss) 682softmmu_ss.add(files( 683 'bootdevice.c', 684 'dma-helpers.c', 685 'qdev-monitor.c', 686), sdl) 687 688softmmu_ss.add(when: 'CONFIG_TPM', if_true: files('tpm.c')) 689softmmu_ss.add(when: 'CONFIG_SECCOMP', if_true: [files('qemu-seccomp.c'), seccomp]) 690softmmu_ss.add(when: ['CONFIG_FDT', fdt], if_true: [files('device_tree.c')]) 691 692common_ss.add(files('cpus-common.c')) 693 694subdir('softmmu') 695subdir('backends') 696subdir('disas') 697subdir('migration') 698subdir('monitor') 699subdir('net') 700subdir('replay') 701subdir('hw') 702 703# needed for fuzzing binaries 704subdir('tests/qtest/libqos') 705 706block_mods = [] 707softmmu_mods = [] 708foreach d, list : modules 709 foreach m, module_ss : list 710 if enable_modules and targetos != 'windows' 711 module_ss = module_ss.apply(config_host, strict: false) 712 sl = static_library(d + '-' + m, [genh, module_ss.sources()], 713 dependencies: [modulecommon, module_ss.dependencies()], pic: true) 714 if d == 'block' 715 block_mods += sl 716 else 717 softmmu_mods += sl 718 endif 719 else 720 if d == 'block' 721 block_ss.add_all(module_ss) 722 else 723 softmmu_ss.add_all(module_ss) 724 endif 725 endif 726 endforeach 727endforeach 728 729nm = find_program('nm') 730undefsym = find_program('scripts/undefsym.sh') 731block_syms = custom_target('block.syms', output: 'block.syms', 732 input: [libqemuutil, block_mods], 733 capture: true, 734 command: [undefsym, nm, '@INPUT@']) 735qemu_syms = custom_target('qemu.syms', output: 'qemu.syms', 736 input: [libqemuutil, softmmu_mods], 737 capture: true, 738 command: [undefsym, nm, '@INPUT@']) 739 740block_ss = block_ss.apply(config_host, strict: false) 741libblock = static_library('block', block_ss.sources() + genh, 742 dependencies: block_ss.dependencies(), 743 link_depends: block_syms, 744 name_suffix: 'fa', 745 build_by_default: false) 746 747block = declare_dependency(link_whole: [libblock], 748 link_args: '@block.syms', 749 dependencies: [crypto, io]) 750 751qmp_ss = qmp_ss.apply(config_host, strict: false) 752libqmp = static_library('qmp', qmp_ss.sources() + genh, 753 dependencies: qmp_ss.dependencies(), 754 name_suffix: 'fa', 755 build_by_default: false) 756 757qmp = declare_dependency(link_whole: [libqmp]) 758 759foreach m : block_mods + softmmu_mods 760 shared_module(m.name(), 761 name_prefix: '', 762 link_whole: m, 763 install: true, 764 install_dir: config_host['qemu_moddir']) 765endforeach 766 767common_ss.add_all(when: 'CONFIG_SOFTMMU', if_true: softmmu_ss) 768common_ss.add_all(when: 'CONFIG_USER_ONLY', if_true: user_ss) 769 770common_all = common_ss.apply(config_all, strict: false) 771common_all = static_library('common', 772 build_by_default: false, 773 sources: common_all.sources() + genh, 774 dependencies: common_all.dependencies(), 775 name_suffix: 'fa') 776 777foreach target : target_dirs 778 config_target = config_target_mak[target] 779 target_name = config_target['TARGET_NAME'] 780 arch = config_target['TARGET_BASE_ARCH'] 781 arch_srcs = [] 782 783 target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])] 784 if targetos == 'linux' 785 target_inc += include_directories('linux-headers', is_system: true) 786 endif 787 if target.endswith('-softmmu') 788 qemu_target_name = 'qemu-system-' + target_name 789 target_type='system' 790 arch_srcs += config_devices_h[target] 791 else 792 target_type='user' 793 qemu_target_name = 'qemu-' + target_name 794 if 'CONFIG_LINUX_USER' in config_target 795 base_dir = 'linux-user' 796 target_inc += include_directories('linux-user/host/' / config_host['ARCH']) 797 else 798 base_dir = 'bsd-user' 799 endif 800 target_inc += include_directories( 801 base_dir, 802 base_dir / config_target['TARGET_ABI_DIR'], 803 ) 804 endif 805 806 target_common = common_ss.apply(config_target, strict: false) 807 objects = common_all.extract_objects(target_common.sources()) 808 809 # TODO: Change to generator once obj-y goes away 810 config_target_h = custom_target(target + '-config-target.h', 811 input: meson.current_build_dir() / target / 'config-target.mak', 812 output: target + '-config-target.h', 813 capture: true, 814 command: [create_config, '@INPUT@']) 815 816 target_specific = specific_ss.apply(config_target, strict: false) 817 arch_srcs += target_specific.sources() 818 819 static_library('qemu-' + target, 820 sources: arch_srcs + [config_target_h] + genh, 821 objects: objects, 822 include_directories: target_inc, 823 c_args: ['-DNEED_CPU_H', 824 '-DCONFIG_TARGET="@0@-config-target.h"'.format(target), 825 '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)], 826 name_suffix: 'fa') 827endforeach 828 829# Other build targets 830 831if 'CONFIG_GUEST_AGENT' in config_host 832 subdir('qga') 833endif 834 835if have_tools 836 qemu_img = executable('qemu-img', [files('qemu-img.c'), hxdep], 837 dependencies: [authz, block, crypto, io, qom, qemuutil], install: true) 838 qemu_io = executable('qemu-io', files('qemu-io.c'), 839 dependencies: [block, qemuutil], install: true) 840 if targetos == 'linux' or targetos == 'sunos' or targetos.endswith('bsd') 841 qemu_nbd = executable('qemu-nbd', files('qemu-nbd.c'), 842 dependencies: [block, qemuutil], install: true) 843 endif 844 845 subdir('storage-daemon') 846 subdir('contrib/rdmacm-mux') 847 subdir('contrib/elf2dmp') 848 849 if 'CONFIG_XKBCOMMON' in config_host 850 executable('qemu-keymap', files('qemu-keymap.c', 'ui/input-keymap.c'), 851 dependencies: [qemuutil, xkbcommon], install: true) 852 endif 853 854 executable('qemu-edid', files('qemu-edid.c', 'hw/display/edid-generate.c'), 855 dependencies: qemuutil, 856 install: true) 857 858 if 'CONFIG_VHOST_USER' in config_host 859 subdir('contrib/libvhost-user') 860 subdir('contrib/vhost-user-blk') 861 if 'CONFIG_LINUX' in config_host 862 subdir('contrib/vhost-user-gpu') 863 endif 864 subdir('contrib/vhost-user-input') 865 subdir('contrib/vhost-user-scsi') 866 endif 867 868 if targetos == 'linux' 869 executable('qemu-bridge-helper', files('qemu-bridge-helper.c'), 870 dependencies: [qemuutil, libcap_ng], 871 install: true, 872 install_dir: get_option('libexecdir')) 873 874 executable('qemu-pr-helper', files('scsi/qemu-pr-helper.c', 'scsi/utils.c'), 875 dependencies: [authz, crypto, io, qom, qemuutil, 876 libcap_ng, libudev, libmpathpersist], 877 install: true) 878 endif 879 880 if 'CONFIG_IVSHMEM' in config_host 881 subdir('contrib/ivshmem-client') 882 subdir('contrib/ivshmem-server') 883 endif 884endif 885 886subdir('tools') 887subdir('pc-bios') 888subdir('tests') 889 890summary_info = {} 891summary_info += {'Install prefix': config_host['prefix']} 892summary_info += {'BIOS directory': config_host['qemu_datadir']} 893summary_info += {'firmware path': config_host['qemu_firmwarepath']} 894summary_info += {'binary directory': config_host['bindir']} 895summary_info += {'library directory': config_host['libdir']} 896summary_info += {'module directory': config_host['qemu_moddir']} 897summary_info += {'libexec directory': config_host['libexecdir']} 898summary_info += {'include directory': config_host['includedir']} 899summary_info += {'config directory': config_host['sysconfdir']} 900if targetos != 'windows' 901 summary_info += {'local state directory': config_host['qemu_localstatedir']} 902 summary_info += {'Manual directory': config_host['mandir']} 903else 904 summary_info += {'local state directory': 'queried at runtime'} 905endif 906summary_info += {'Build directory': meson.current_build_dir()} 907summary_info += {'Source path': meson.current_source_dir()} 908summary_info += {'GIT binary': config_host['GIT']} 909summary_info += {'GIT submodules': config_host['GIT_SUBMODULES']} 910summary_info += {'C compiler': meson.get_compiler('c').cmd_array()[0]} 911summary_info += {'Host C compiler': meson.get_compiler('c', native: true).cmd_array()[0]} 912if link_language == 'cpp' 913 summary_info += {'C++ compiler': meson.get_compiler('cpp').cmd_array()[0]} 914else 915 summary_info += {'C++ compiler': false} 916endif 917if targetos == 'darwin' 918 summary_info += {'Objective-C compiler': meson.get_compiler('objc').cmd_array()[0]} 919endif 920summary_info += {'ARFLAGS': config_host['ARFLAGS']} 921summary_info += {'CFLAGS': config_host['CFLAGS']} 922summary_info += {'QEMU_CFLAGS': config_host['QEMU_CFLAGS']} 923summary_info += {'QEMU_LDFLAGS': config_host['QEMU_LDFLAGS']} 924summary_info += {'make': config_host['MAKE']} 925summary_info += {'install': config_host['INSTALL']} 926summary_info += {'python': '@0@ (version: @1@)'.format(python.full_path(), python.language_version())} 927summary_info += {'sphinx-build': config_host['SPHINX_BUILD']} 928summary_info += {'genisoimage': config_host['GENISOIMAGE']} 929# TODO: add back version 930summary_info += {'slirp support': config_host.has_key('CONFIG_SLIRP')} 931if config_host.has_key('CONFIG_SLIRP') 932 summary_info += {'smbd': config_host['CONFIG_SMBD_COMMAND']} 933endif 934summary_info += {'module support': config_host.has_key('CONFIG_MODULES')} 935if config_host.has_key('CONFIG_MODULES') 936 summary_info += {'alternative module path': config_host.has_key('CONFIG_MODULE_UPGRADES')} 937endif 938summary_info += {'host CPU': cpu} 939summary_info += {'host endianness': build_machine.endian()} 940summary_info += {'target list': config_host['TARGET_DIRS']} 941summary_info += {'gprof enabled': config_host.has_key('CONFIG_GPROF')} 942summary_info += {'sparse enabled': meson.get_compiler('c').cmd_array().contains('cgcc')} 943summary_info += {'strip binaries': get_option('strip')} 944summary_info += {'profiler': config_host.has_key('CONFIG_PROFILER')} 945summary_info += {'static build': config_host.has_key('CONFIG_TOOLS')} 946if targetos == 'darwin' 947 summary_info += {'Cocoa support': config_host.has_key('CONFIG_COCOA')} 948endif 949# TODO: add back version 950summary_info += {'SDL support': config_host.has_key('CONFIG_SDL')} 951summary_info += {'SDL image support': config_host.has_key('CONFIG_SDL_IMAGE')} 952# TODO: add back version 953summary_info += {'GTK support': config_host.has_key('CONFIG_GTK')} 954summary_info += {'GTK GL support': config_host.has_key('CONFIG_GTK_GL')} 955# TODO: add back version 956summary_info += {'VTE support': config_host.has_key('CONFIG_VTE')} 957summary_info += {'TLS priority': config_host['CONFIG_TLS_PRIORITY']} 958summary_info += {'GNUTLS support': config_host.has_key('CONFIG_GNUTLS')} 959# TODO: add back version 960summary_info += {'libgcrypt': config_host.has_key('CONFIG_GCRYPT')} 961if config_host.has_key('CONFIG_GCRYPT') 962 summary_info += {' hmac': config_host.has_key('CONFIG_GCRYPT_HMAC')} 963 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')} 964endif 965# TODO: add back version 966summary_info += {'nettle': config_host.has_key('CONFIG_NETTLE')} 967if config_host.has_key('CONFIG_NETTLE') 968 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')} 969endif 970summary_info += {'libtasn1': config_host.has_key('CONFIG_TASN1')} 971summary_info += {'PAM': config_host.has_key('CONFIG_AUTH_PAM')} 972summary_info += {'iconv support': config_host.has_key('CONFIG_ICONV')} 973summary_info += {'curses support': config_host.has_key('CONFIG_CURSES')} 974# TODO: add back version 975summary_info += {'virgl support': config_host.has_key('CONFIG_VIRGL')} 976summary_info += {'curl support': config_host.has_key('CONFIG_CURL')} 977summary_info += {'mingw32 support': targetos == 'windows'} 978summary_info += {'Audio drivers': config_host['CONFIG_AUDIO_DRIVERS']} 979summary_info += {'Block whitelist (rw)': config_host['CONFIG_BDRV_RW_WHITELIST']} 980summary_info += {'Block whitelist (ro)': config_host['CONFIG_BDRV_RO_WHITELIST']} 981summary_info += {'VirtFS support': config_host.has_key('CONFIG_VIRTFS')} 982summary_info += {'Multipath support': config_host.has_key('CONFIG_MPATH')} 983summary_info += {'VNC support': config_host.has_key('CONFIG_VNC')} 984if config_host.has_key('CONFIG_VNC') 985 summary_info += {'VNC SASL support': config_host.has_key('CONFIG_VNC_SASL')} 986 summary_info += {'VNC JPEG support': config_host.has_key('CONFIG_VNC_JPEG')} 987 summary_info += {'VNC PNG support': config_host.has_key('CONFIG_VNC_PNG')} 988endif 989summary_info += {'xen support': config_host.has_key('CONFIG_XEN_BACKEND')} 990if config_host.has_key('CONFIG_XEN_BACKEND') 991 summary_info += {'xen ctrl version': config_host['CONFIG_XEN_CTRL_INTERFACE_VERSION']} 992endif 993summary_info += {'brlapi support': config_host.has_key('CONFIG_BRLAPI')} 994summary_info += {'Documentation': config_host.has_key('BUILD_DOCS')} 995summary_info += {'PIE': get_option('b_pie')} 996summary_info += {'vde support': config_host.has_key('CONFIG_VDE')} 997summary_info += {'netmap support': config_host.has_key('CONFIG_NETMAP')} 998summary_info += {'Linux AIO support': config_host.has_key('CONFIG_LINUX_AIO')} 999summary_info += {'Linux io_uring support': config_host.has_key('CONFIG_LINUX_IO_URING')} 1000summary_info += {'ATTR/XATTR support': config_host.has_key('CONFIG_ATTR')} 1001summary_info += {'Install blobs': config_host.has_key('INSTALL_BLOBS')} 1002# TODO: add back KVM/HAX/HVF/WHPX/TCG 1003#summary_info += {'KVM support': have_kvm'} 1004#summary_info += {'HAX support': have_hax'} 1005#summary_info += {'HVF support': have_hvf'} 1006#summary_info += {'WHPX support': have_whpx'} 1007#summary_info += {'TCG support': have_tcg'} 1008#if get_option('tcg') 1009# summary_info += {'TCG debug enabled': config_host.has_key('CONFIG_DEBUG_TCG')} 1010# summary_info += {'TCG interpreter': config_host.has_key('CONFIG_TCG_INTERPRETER')} 1011#endif 1012summary_info += {'malloc trim support': config_host.has_key('CONFIG_MALLOC_TRIM')} 1013summary_info += {'RDMA support': config_host.has_key('CONFIG_RDMA')} 1014summary_info += {'PVRDMA support': config_host.has_key('CONFIG_PVRDMA')} 1015summary_info += {'fdt support': config_host.has_key('CONFIG_FDT')} 1016summary_info += {'membarrier': config_host.has_key('CONFIG_MEMBARRIER')} 1017summary_info += {'preadv support': config_host.has_key('CONFIG_PREADV')} 1018summary_info += {'fdatasync': config_host.has_key('CONFIG_FDATASYNC')} 1019summary_info += {'madvise': config_host.has_key('CONFIG_MADVISE')} 1020summary_info += {'posix_madvise': config_host.has_key('CONFIG_POSIX_MADVISE')} 1021summary_info += {'posix_memalign': config_host.has_key('CONFIG_POSIX_MEMALIGN')} 1022summary_info += {'libcap-ng support': config_host.has_key('CONFIG_LIBCAP_NG')} 1023summary_info += {'vhost-net support': config_host.has_key('CONFIG_VHOST_NET')} 1024summary_info += {'vhost-crypto support': config_host.has_key('CONFIG_VHOST_CRYPTO')} 1025summary_info += {'vhost-scsi support': config_host.has_key('CONFIG_VHOST_SCSI')} 1026summary_info += {'vhost-vsock support': config_host.has_key('CONFIG_VHOST_VSOCK')} 1027summary_info += {'vhost-user support': config_host.has_key('CONFIG_VHOST_KERNEL')} 1028summary_info += {'vhost-user-fs support': config_host.has_key('CONFIG_VHOST_USER_FS')} 1029summary_info += {'vhost-vdpa support': config_host.has_key('CONFIG_VHOST_VDPA')} 1030summary_info += {'Trace backends': config_host['TRACE_BACKENDS']} 1031if config_host['TRACE_BACKENDS'].split().contains('simple') 1032 summary_info += {'Trace output file': config_host['CONFIG_TRACE_FILE'] + '-<pid>'} 1033endif 1034# TODO: add back protocol and server version 1035summary_info += {'spice support': config_host.has_key('CONFIG_SPICE')} 1036summary_info += {'rbd support': config_host.has_key('CONFIG_RBD')} 1037summary_info += {'xfsctl support': config_host.has_key('CONFIG_XFS')} 1038summary_info += {'smartcard support': config_host.has_key('CONFIG_SMARTCARD')} 1039summary_info += {'libusb': config_host.has_key('CONFIG_USB_LIBUSB')} 1040summary_info += {'usb net redir': config_host.has_key('CONFIG_USB_REDIR')} 1041summary_info += {'OpenGL support': config_host.has_key('CONFIG_OPENGL')} 1042summary_info += {'OpenGL dmabufs': config_host.has_key('CONFIG_OPENGL_DMABUF')} 1043summary_info += {'libiscsi support': config_host.has_key('CONFIG_LIBISCSI')} 1044summary_info += {'libnfs support': config_host.has_key('CONFIG_LIBNFS')} 1045summary_info += {'build guest agent': config_host.has_key('CONFIG_GUEST_AGENT')} 1046if targetos == 'windows' 1047 if 'WIN_SDK' in config_host 1048 summary_info += {'Windows SDK': config_host['WIN_SDK']} 1049 endif 1050 summary_info += {'QGA VSS support': config_host.has_key('CONFIG_QGA_VSS')} 1051 summary_info += {'QGA w32 disk info': config_host.has_key('CONFIG_QGA_NTDDSCSI')} 1052 summary_info += {'QGA MSI support': config_host.has_key('CONFIG_QGA_MSI_ENABLED')} 1053endif 1054summary_info += {'seccomp support': config_host.has_key('CONFIG_SECCOMP')} 1055summary_info += {'coroutine backend': config_host['CONFIG_COROUTINE_BACKEND']} 1056summary_info += {'coroutine pool': config_host['CONFIG_COROUTINE_POOL'] == '1'} 1057summary_info += {'debug stack usage': config_host.has_key('CONFIG_DEBUG_STACK_USAGE')} 1058summary_info += {'mutex debugging': config_host.has_key('CONFIG_DEBUG_MUTEX')} 1059summary_info += {'crypto afalg': config_host.has_key('CONFIG_AF_ALG')} 1060summary_info += {'GlusterFS support': config_host.has_key('CONFIG_GLUSTERFS')} 1061summary_info += {'gcov': get_option('b_coverage')} 1062summary_info += {'TPM support': config_host.has_key('CONFIG_TPM')} 1063summary_info += {'libssh support': config_host.has_key('CONFIG_LIBSSH')} 1064summary_info += {'QOM debugging': config_host.has_key('CONFIG_QOM_CAST_DEBUG')} 1065summary_info += {'Live block migration': config_host.has_key('CONFIG_LIVE_BLOCK_MIGRATION')} 1066summary_info += {'lzo support': config_host.has_key('CONFIG_LZO')} 1067summary_info += {'snappy support': config_host.has_key('CONFIG_SNAPPY')} 1068summary_info += {'bzip2 support': config_host.has_key('CONFIG_BZIP2')} 1069summary_info += {'lzfse support': config_host.has_key('CONFIG_LZFSE')} 1070summary_info += {'zstd support': config_host.has_key('CONFIG_ZSTD')} 1071summary_info += {'NUMA host support': config_host.has_key('CONFIG_NUMA')} 1072summary_info += {'libxml2': config_host.has_key('CONFIG_LIBXML2')} 1073summary_info += {'tcmalloc support': config_host.has_key('CONFIG_TCMALLOC')} 1074summary_info += {'jemalloc support': config_host.has_key('CONFIG_JEMALLOC')} 1075summary_info += {'avx2 optimization': config_host.has_key('CONFIG_AVX2_OPT')} 1076summary_info += {'avx512f optimization': config_host.has_key('CONFIG_AVX512F_OPT')} 1077summary_info += {'replication support': config_host.has_key('CONFIG_REPLICATION')} 1078summary_info += {'bochs support': config_host.has_key('CONFIG_BOCHS')} 1079summary_info += {'cloop support': config_host.has_key('CONFIG_CLOOP')} 1080summary_info += {'dmg support': config_host.has_key('CONFIG_DMG')} 1081summary_info += {'qcow v1 support': config_host.has_key('CONFIG_QCOW1')} 1082summary_info += {'vdi support': config_host.has_key('CONFIG_VDI')} 1083summary_info += {'vvfat support': config_host.has_key('CONFIG_VVFAT')} 1084summary_info += {'qed support': config_host.has_key('CONFIG_QED')} 1085summary_info += {'parallels support': config_host.has_key('CONFIG_PARALLELS')} 1086summary_info += {'sheepdog support': config_host.has_key('CONFIG_SHEEPDOG')} 1087summary_info += {'capstone': config_host.has_key('CONFIG_CAPSTONE')} 1088summary_info += {'libpmem support': config_host.has_key('CONFIG_LIBPMEM')} 1089summary_info += {'libdaxctl support': config_host.has_key('CONFIG_LIBDAXCTL')} 1090summary_info += {'libudev': config_host.has_key('CONFIG_LIBUDEV')} 1091summary_info += {'default devices': config_host['CONFIG_MINIKCONF_MODE'] == '--defconfig'} 1092summary_info += {'plugin support': config_host.has_key('CONFIG_PLUGIN')} 1093summary_info += {'fuzzing support': config_host.has_key('CONFIG_FUZZ')} 1094if config_host.has_key('HAVE_GDB_BIN') 1095 summary_info += {'gdb': config_host['HAVE_GDB_BIN']} 1096endif 1097summary_info += {'thread sanitizer': config_host.has_key('CONFIG_TSAN')} 1098summary_info += {'rng-none': config_host.has_key('CONFIG_RNG_NONE')} 1099summary_info += {'Linux keyring': config_host.has_key('CONFIG_SECRET_KEYRING')} 1100summary(summary_info, bool_yn: true) 1101 1102if not supported_cpus.contains(cpu) 1103 message() 1104 warning('SUPPORT FOR THIS HOST CPU WILL GO AWAY IN FUTURE RELEASES!') 1105 message() 1106 message('CPU host architecture ' + cpu + ' support is not currently maintained.') 1107 message('The QEMU project intends to remove support for this host CPU in') 1108 message('a future release if nobody volunteers to maintain it and to') 1109 message('provide a build host for our continuous integration setup.') 1110 message('configure has succeeded and you can continue to build, but') 1111 message('if you care about QEMU on this platform you should contact') 1112 message('us upstream at qemu-devel@nongnu.org.') 1113endif 1114 1115if not supported_oses.contains(targetos) 1116 message() 1117 warning('WARNING: SUPPORT FOR THIS HOST OS WILL GO AWAY IN FUTURE RELEASES!') 1118 message() 1119 message('Host OS ' + targetos + 'support is not currently maintained.') 1120 message('The QEMU project intends to remove support for this host OS in') 1121 message('a future release if nobody volunteers to maintain it and to') 1122 message('provide a build host for our continuous integration setup.') 1123 message('configure has succeeded and you can continue to build, but') 1124 message('if you care about QEMU on this platform you should contact') 1125 message('us upstream at qemu-devel@nongnu.org.') 1126endif 1127