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 hw_dir = target_name == 'sparc64' ? 'sparc64' : arch 791 hw = hw_arch[hw_dir].apply(config_target, strict: false) 792 arch_srcs += hw.sources() 793 794 arch_srcs += config_devices_h[target] 795 else 796 target_type='user' 797 qemu_target_name = 'qemu-' + target_name 798 if 'CONFIG_LINUX_USER' in config_target 799 base_dir = 'linux-user' 800 target_inc += include_directories('linux-user/host/' / config_host['ARCH']) 801 else 802 base_dir = 'bsd-user' 803 endif 804 target_inc += include_directories( 805 base_dir, 806 base_dir / config_target['TARGET_ABI_DIR'], 807 ) 808 endif 809 810 target_common = common_ss.apply(config_target, strict: false) 811 objects = common_all.extract_objects(target_common.sources()) 812 813 # TODO: Change to generator once obj-y goes away 814 config_target_h = custom_target(target + '-config-target.h', 815 input: meson.current_build_dir() / target / 'config-target.mak', 816 output: target + '-config-target.h', 817 capture: true, 818 command: [create_config, '@INPUT@']) 819 820 target_specific = specific_ss.apply(config_target, strict: false) 821 arch_srcs += target_specific.sources() 822 823 static_library('qemu-' + target, 824 sources: arch_srcs + [config_target_h] + genh, 825 objects: objects, 826 include_directories: target_inc, 827 c_args: ['-DNEED_CPU_H', 828 '-DCONFIG_TARGET="@0@-config-target.h"'.format(target), 829 '-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)], 830 name_suffix: 'fa') 831endforeach 832 833# Other build targets 834 835if 'CONFIG_GUEST_AGENT' in config_host 836 subdir('qga') 837endif 838 839if have_tools 840 qemu_img = executable('qemu-img', [files('qemu-img.c'), hxdep], 841 dependencies: [authz, block, crypto, io, qom, qemuutil], install: true) 842 qemu_io = executable('qemu-io', files('qemu-io.c'), 843 dependencies: [block, qemuutil], install: true) 844 if targetos == 'linux' or targetos == 'sunos' or targetos.endswith('bsd') 845 qemu_nbd = executable('qemu-nbd', files('qemu-nbd.c'), 846 dependencies: [block, qemuutil], install: true) 847 endif 848 849 subdir('storage-daemon') 850 subdir('contrib/rdmacm-mux') 851 subdir('contrib/elf2dmp') 852 853 if 'CONFIG_XKBCOMMON' in config_host 854 executable('qemu-keymap', files('qemu-keymap.c', 'ui/input-keymap.c'), 855 dependencies: [qemuutil, xkbcommon], install: true) 856 endif 857 858 executable('qemu-edid', files('qemu-edid.c', 'hw/display/edid-generate.c'), 859 dependencies: qemuutil, 860 install: true) 861 862 if 'CONFIG_VHOST_USER' in config_host 863 subdir('contrib/libvhost-user') 864 subdir('contrib/vhost-user-blk') 865 if 'CONFIG_LINUX' in config_host 866 subdir('contrib/vhost-user-gpu') 867 endif 868 subdir('contrib/vhost-user-input') 869 subdir('contrib/vhost-user-scsi') 870 endif 871 872 if targetos == 'linux' 873 executable('qemu-bridge-helper', files('qemu-bridge-helper.c'), 874 dependencies: [qemuutil, libcap_ng], 875 install: true, 876 install_dir: get_option('libexecdir')) 877 878 executable('qemu-pr-helper', files('scsi/qemu-pr-helper.c', 'scsi/utils.c'), 879 dependencies: [authz, crypto, io, qom, qemuutil, 880 libcap_ng, libudev, libmpathpersist], 881 install: true) 882 endif 883 884 if 'CONFIG_IVSHMEM' in config_host 885 subdir('contrib/ivshmem-client') 886 subdir('contrib/ivshmem-server') 887 endif 888endif 889 890subdir('tools') 891subdir('pc-bios') 892subdir('tests') 893 894summary_info = {} 895summary_info += {'Install prefix': config_host['prefix']} 896summary_info += {'BIOS directory': config_host['qemu_datadir']} 897summary_info += {'firmware path': config_host['qemu_firmwarepath']} 898summary_info += {'binary directory': config_host['bindir']} 899summary_info += {'library directory': config_host['libdir']} 900summary_info += {'module directory': config_host['qemu_moddir']} 901summary_info += {'libexec directory': config_host['libexecdir']} 902summary_info += {'include directory': config_host['includedir']} 903summary_info += {'config directory': config_host['sysconfdir']} 904if targetos != 'windows' 905 summary_info += {'local state directory': config_host['qemu_localstatedir']} 906 summary_info += {'Manual directory': config_host['mandir']} 907else 908 summary_info += {'local state directory': 'queried at runtime'} 909endif 910summary_info += {'Build directory': meson.current_build_dir()} 911summary_info += {'Source path': meson.current_source_dir()} 912summary_info += {'GIT binary': config_host['GIT']} 913summary_info += {'GIT submodules': config_host['GIT_SUBMODULES']} 914summary_info += {'C compiler': meson.get_compiler('c').cmd_array()[0]} 915summary_info += {'Host C compiler': meson.get_compiler('c', native: true).cmd_array()[0]} 916if link_language == 'cpp' 917 summary_info += {'C++ compiler': meson.get_compiler('cpp').cmd_array()[0]} 918else 919 summary_info += {'C++ compiler': false} 920endif 921if targetos == 'darwin' 922 summary_info += {'Objective-C compiler': meson.get_compiler('objc').cmd_array()[0]} 923endif 924summary_info += {'ARFLAGS': config_host['ARFLAGS']} 925summary_info += {'CFLAGS': config_host['CFLAGS']} 926summary_info += {'QEMU_CFLAGS': config_host['QEMU_CFLAGS']} 927summary_info += {'QEMU_LDFLAGS': config_host['QEMU_LDFLAGS']} 928summary_info += {'make': config_host['MAKE']} 929summary_info += {'install': config_host['INSTALL']} 930summary_info += {'python': '@0@ (version: @1@)'.format(python.full_path(), python.language_version())} 931summary_info += {'sphinx-build': config_host['SPHINX_BUILD']} 932summary_info += {'genisoimage': config_host['GENISOIMAGE']} 933# TODO: add back version 934summary_info += {'slirp support': config_host.has_key('CONFIG_SLIRP')} 935if config_host.has_key('CONFIG_SLIRP') 936 summary_info += {'smbd': config_host['CONFIG_SMBD_COMMAND']} 937endif 938summary_info += {'module support': config_host.has_key('CONFIG_MODULES')} 939if config_host.has_key('CONFIG_MODULES') 940 summary_info += {'alternative module path': config_host.has_key('CONFIG_MODULE_UPGRADES')} 941endif 942summary_info += {'host CPU': cpu} 943summary_info += {'host endianness': build_machine.endian()} 944summary_info += {'target list': config_host['TARGET_DIRS']} 945summary_info += {'gprof enabled': config_host.has_key('CONFIG_GPROF')} 946summary_info += {'sparse enabled': meson.get_compiler('c').cmd_array().contains('cgcc')} 947summary_info += {'strip binaries': get_option('strip')} 948summary_info += {'profiler': config_host.has_key('CONFIG_PROFILER')} 949summary_info += {'static build': config_host.has_key('CONFIG_TOOLS')} 950if targetos == 'darwin' 951 summary_info += {'Cocoa support': config_host.has_key('CONFIG_COCOA')} 952endif 953# TODO: add back version 954summary_info += {'SDL support': config_host.has_key('CONFIG_SDL')} 955summary_info += {'SDL image support': config_host.has_key('CONFIG_SDL_IMAGE')} 956# TODO: add back version 957summary_info += {'GTK support': config_host.has_key('CONFIG_GTK')} 958summary_info += {'GTK GL support': config_host.has_key('CONFIG_GTK_GL')} 959# TODO: add back version 960summary_info += {'VTE support': config_host.has_key('CONFIG_VTE')} 961summary_info += {'TLS priority': config_host['CONFIG_TLS_PRIORITY']} 962summary_info += {'GNUTLS support': config_host.has_key('CONFIG_GNUTLS')} 963# TODO: add back version 964summary_info += {'libgcrypt': config_host.has_key('CONFIG_GCRYPT')} 965if config_host.has_key('CONFIG_GCRYPT') 966 summary_info += {' hmac': config_host.has_key('CONFIG_GCRYPT_HMAC')} 967 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')} 968endif 969# TODO: add back version 970summary_info += {'nettle': config_host.has_key('CONFIG_NETTLE')} 971if config_host.has_key('CONFIG_NETTLE') 972 summary_info += {' XTS': not config_host.has_key('CONFIG_QEMU_PRIVATE_XTS')} 973endif 974summary_info += {'libtasn1': config_host.has_key('CONFIG_TASN1')} 975summary_info += {'PAM': config_host.has_key('CONFIG_AUTH_PAM')} 976summary_info += {'iconv support': config_host.has_key('CONFIG_ICONV')} 977summary_info += {'curses support': config_host.has_key('CONFIG_CURSES')} 978# TODO: add back version 979summary_info += {'virgl support': config_host.has_key('CONFIG_VIRGL')} 980summary_info += {'curl support': config_host.has_key('CONFIG_CURL')} 981summary_info += {'mingw32 support': targetos == 'windows'} 982summary_info += {'Audio drivers': config_host['CONFIG_AUDIO_DRIVERS']} 983summary_info += {'Block whitelist (rw)': config_host['CONFIG_BDRV_RW_WHITELIST']} 984summary_info += {'Block whitelist (ro)': config_host['CONFIG_BDRV_RO_WHITELIST']} 985summary_info += {'VirtFS support': config_host.has_key('CONFIG_VIRTFS')} 986summary_info += {'Multipath support': config_host.has_key('CONFIG_MPATH')} 987summary_info += {'VNC support': config_host.has_key('CONFIG_VNC')} 988if config_host.has_key('CONFIG_VNC') 989 summary_info += {'VNC SASL support': config_host.has_key('CONFIG_VNC_SASL')} 990 summary_info += {'VNC JPEG support': config_host.has_key('CONFIG_VNC_JPEG')} 991 summary_info += {'VNC PNG support': config_host.has_key('CONFIG_VNC_PNG')} 992endif 993summary_info += {'xen support': config_host.has_key('CONFIG_XEN_BACKEND')} 994if config_host.has_key('CONFIG_XEN_BACKEND') 995 summary_info += {'xen ctrl version': config_host['CONFIG_XEN_CTRL_INTERFACE_VERSION']} 996endif 997summary_info += {'brlapi support': config_host.has_key('CONFIG_BRLAPI')} 998summary_info += {'Documentation': config_host.has_key('BUILD_DOCS')} 999summary_info += {'PIE': get_option('b_pie')} 1000summary_info += {'vde support': config_host.has_key('CONFIG_VDE')} 1001summary_info += {'netmap support': config_host.has_key('CONFIG_NETMAP')} 1002summary_info += {'Linux AIO support': config_host.has_key('CONFIG_LINUX_AIO')} 1003summary_info += {'Linux io_uring support': config_host.has_key('CONFIG_LINUX_IO_URING')} 1004summary_info += {'ATTR/XATTR support': config_host.has_key('CONFIG_ATTR')} 1005summary_info += {'Install blobs': config_host.has_key('INSTALL_BLOBS')} 1006# TODO: add back KVM/HAX/HVF/WHPX/TCG 1007#summary_info += {'KVM support': have_kvm'} 1008#summary_info += {'HAX support': have_hax'} 1009#summary_info += {'HVF support': have_hvf'} 1010#summary_info += {'WHPX support': have_whpx'} 1011#summary_info += {'TCG support': have_tcg'} 1012#if get_option('tcg') 1013# summary_info += {'TCG debug enabled': config_host.has_key('CONFIG_DEBUG_TCG')} 1014# summary_info += {'TCG interpreter': config_host.has_key('CONFIG_TCG_INTERPRETER')} 1015#endif 1016summary_info += {'malloc trim support': config_host.has_key('CONFIG_MALLOC_TRIM')} 1017summary_info += {'RDMA support': config_host.has_key('CONFIG_RDMA')} 1018summary_info += {'PVRDMA support': config_host.has_key('CONFIG_PVRDMA')} 1019summary_info += {'fdt support': config_host.has_key('CONFIG_FDT')} 1020summary_info += {'membarrier': config_host.has_key('CONFIG_MEMBARRIER')} 1021summary_info += {'preadv support': config_host.has_key('CONFIG_PREADV')} 1022summary_info += {'fdatasync': config_host.has_key('CONFIG_FDATASYNC')} 1023summary_info += {'madvise': config_host.has_key('CONFIG_MADVISE')} 1024summary_info += {'posix_madvise': config_host.has_key('CONFIG_POSIX_MADVISE')} 1025summary_info += {'posix_memalign': config_host.has_key('CONFIG_POSIX_MEMALIGN')} 1026summary_info += {'libcap-ng support': config_host.has_key('CONFIG_LIBCAP_NG')} 1027summary_info += {'vhost-net support': config_host.has_key('CONFIG_VHOST_NET')} 1028summary_info += {'vhost-crypto support': config_host.has_key('CONFIG_VHOST_CRYPTO')} 1029summary_info += {'vhost-scsi support': config_host.has_key('CONFIG_VHOST_SCSI')} 1030summary_info += {'vhost-vsock support': config_host.has_key('CONFIG_VHOST_VSOCK')} 1031summary_info += {'vhost-user support': config_host.has_key('CONFIG_VHOST_KERNEL')} 1032summary_info += {'vhost-user-fs support': config_host.has_key('CONFIG_VHOST_USER_FS')} 1033summary_info += {'vhost-vdpa support': config_host.has_key('CONFIG_VHOST_VDPA')} 1034summary_info += {'Trace backends': config_host['TRACE_BACKENDS']} 1035if config_host['TRACE_BACKENDS'].split().contains('simple') 1036 summary_info += {'Trace output file': config_host['CONFIG_TRACE_FILE'] + '-<pid>'} 1037endif 1038# TODO: add back protocol and server version 1039summary_info += {'spice support': config_host.has_key('CONFIG_SPICE')} 1040summary_info += {'rbd support': config_host.has_key('CONFIG_RBD')} 1041summary_info += {'xfsctl support': config_host.has_key('CONFIG_XFS')} 1042summary_info += {'smartcard support': config_host.has_key('CONFIG_SMARTCARD')} 1043summary_info += {'libusb': config_host.has_key('CONFIG_USB_LIBUSB')} 1044summary_info += {'usb net redir': config_host.has_key('CONFIG_USB_REDIR')} 1045summary_info += {'OpenGL support': config_host.has_key('CONFIG_OPENGL')} 1046summary_info += {'OpenGL dmabufs': config_host.has_key('CONFIG_OPENGL_DMABUF')} 1047summary_info += {'libiscsi support': config_host.has_key('CONFIG_LIBISCSI')} 1048summary_info += {'libnfs support': config_host.has_key('CONFIG_LIBNFS')} 1049summary_info += {'build guest agent': config_host.has_key('CONFIG_GUEST_AGENT')} 1050if targetos == 'windows' 1051 if 'WIN_SDK' in config_host 1052 summary_info += {'Windows SDK': config_host['WIN_SDK']} 1053 endif 1054 summary_info += {'QGA VSS support': config_host.has_key('CONFIG_QGA_VSS')} 1055 summary_info += {'QGA w32 disk info': config_host.has_key('CONFIG_QGA_NTDDSCSI')} 1056 summary_info += {'QGA MSI support': config_host.has_key('CONFIG_QGA_MSI_ENABLED')} 1057endif 1058summary_info += {'seccomp support': config_host.has_key('CONFIG_SECCOMP')} 1059summary_info += {'coroutine backend': config_host['CONFIG_COROUTINE_BACKEND']} 1060summary_info += {'coroutine pool': config_host['CONFIG_COROUTINE_POOL'] == '1'} 1061summary_info += {'debug stack usage': config_host.has_key('CONFIG_DEBUG_STACK_USAGE')} 1062summary_info += {'mutex debugging': config_host.has_key('CONFIG_DEBUG_MUTEX')} 1063summary_info += {'crypto afalg': config_host.has_key('CONFIG_AF_ALG')} 1064summary_info += {'GlusterFS support': config_host.has_key('CONFIG_GLUSTERFS')} 1065summary_info += {'gcov': get_option('b_coverage')} 1066summary_info += {'TPM support': config_host.has_key('CONFIG_TPM')} 1067summary_info += {'libssh support': config_host.has_key('CONFIG_LIBSSH')} 1068summary_info += {'QOM debugging': config_host.has_key('CONFIG_QOM_CAST_DEBUG')} 1069summary_info += {'Live block migration': config_host.has_key('CONFIG_LIVE_BLOCK_MIGRATION')} 1070summary_info += {'lzo support': config_host.has_key('CONFIG_LZO')} 1071summary_info += {'snappy support': config_host.has_key('CONFIG_SNAPPY')} 1072summary_info += {'bzip2 support': config_host.has_key('CONFIG_BZIP2')} 1073summary_info += {'lzfse support': config_host.has_key('CONFIG_LZFSE')} 1074summary_info += {'zstd support': config_host.has_key('CONFIG_ZSTD')} 1075summary_info += {'NUMA host support': config_host.has_key('CONFIG_NUMA')} 1076summary_info += {'libxml2': config_host.has_key('CONFIG_LIBXML2')} 1077summary_info += {'tcmalloc support': config_host.has_key('CONFIG_TCMALLOC')} 1078summary_info += {'jemalloc support': config_host.has_key('CONFIG_JEMALLOC')} 1079summary_info += {'avx2 optimization': config_host.has_key('CONFIG_AVX2_OPT')} 1080summary_info += {'avx512f optimization': config_host.has_key('CONFIG_AVX512F_OPT')} 1081summary_info += {'replication support': config_host.has_key('CONFIG_REPLICATION')} 1082summary_info += {'bochs support': config_host.has_key('CONFIG_BOCHS')} 1083summary_info += {'cloop support': config_host.has_key('CONFIG_CLOOP')} 1084summary_info += {'dmg support': config_host.has_key('CONFIG_DMG')} 1085summary_info += {'qcow v1 support': config_host.has_key('CONFIG_QCOW1')} 1086summary_info += {'vdi support': config_host.has_key('CONFIG_VDI')} 1087summary_info += {'vvfat support': config_host.has_key('CONFIG_VVFAT')} 1088summary_info += {'qed support': config_host.has_key('CONFIG_QED')} 1089summary_info += {'parallels support': config_host.has_key('CONFIG_PARALLELS')} 1090summary_info += {'sheepdog support': config_host.has_key('CONFIG_SHEEPDOG')} 1091summary_info += {'capstone': config_host.has_key('CONFIG_CAPSTONE')} 1092summary_info += {'libpmem support': config_host.has_key('CONFIG_LIBPMEM')} 1093summary_info += {'libdaxctl support': config_host.has_key('CONFIG_LIBDAXCTL')} 1094summary_info += {'libudev': config_host.has_key('CONFIG_LIBUDEV')} 1095summary_info += {'default devices': config_host['CONFIG_MINIKCONF_MODE'] == '--defconfig'} 1096summary_info += {'plugin support': config_host.has_key('CONFIG_PLUGIN')} 1097summary_info += {'fuzzing support': config_host.has_key('CONFIG_FUZZ')} 1098if config_host.has_key('HAVE_GDB_BIN') 1099 summary_info += {'gdb': config_host['HAVE_GDB_BIN']} 1100endif 1101summary_info += {'thread sanitizer': config_host.has_key('CONFIG_TSAN')} 1102summary_info += {'rng-none': config_host.has_key('CONFIG_RNG_NONE')} 1103summary_info += {'Linux keyring': config_host.has_key('CONFIG_SECRET_KEYRING')} 1104summary(summary_info, bool_yn: true) 1105 1106if not supported_cpus.contains(cpu) 1107 message() 1108 warning('SUPPORT FOR THIS HOST CPU WILL GO AWAY IN FUTURE RELEASES!') 1109 message() 1110 message('CPU host architecture ' + cpu + ' support is not currently maintained.') 1111 message('The QEMU project intends to remove support for this host CPU in') 1112 message('a future release if nobody volunteers to maintain it and to') 1113 message('provide a build host for our continuous integration setup.') 1114 message('configure has succeeded and you can continue to build, but') 1115 message('if you care about QEMU on this platform you should contact') 1116 message('us upstream at qemu-devel@nongnu.org.') 1117endif 1118 1119if not supported_oses.contains(targetos) 1120 message() 1121 warning('WARNING: SUPPORT FOR THIS HOST OS WILL GO AWAY IN FUTURE RELEASES!') 1122 message() 1123 message('Host OS ' + targetos + 'support is not currently maintained.') 1124 message('The QEMU project intends to remove support for this host OS in') 1125 message('a future release if nobody volunteers to maintain it and to') 1126 message('provide a build host for our continuous integration setup.') 1127 message('configure has succeeded and you can continue to build, but') 1128 message('if you care about QEMU on this platform you should contact') 1129 message('us upstream at qemu-devel@nongnu.org.') 1130endif 1131