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