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