# If possible, add new files to other directories, by using "if_false".
# If you need them here, try to add them under one of the if statements
# below, so that it is clear who needs the stubbed functionality.

stub_ss.add(files('cpu-get-clock.c'))
stub_ss.add(files('error-printf.c'))
stub_ss.add(files('fdset.c'))
stub_ss.add(files('iothread-lock.c'))
stub_ss.add(files('is-daemonized.c'))
stub_ss.add(files('monitor-core.c'))
stub_ss.add(files('replay-mode.c'))
stub_ss.add(files('trace-control.c'))

if have_block
  stub_ss.add(files('bdrv-next-monitor-owned.c'))
  stub_ss.add(files('blk-commit-all.c'))
  stub_ss.add(files('blk-exp-close-all.c'))
  stub_ss.add(files('blockdev-close-all-bdrv-states.c'))
  stub_ss.add(files('change-state-handler.c'))
  stub_ss.add(files('get-vm-name.c'))
  stub_ss.add(files('iothread-lock-block.c'))
  stub_ss.add(files('migr-blocker.c'))
  stub_ss.add(files('physmem.c'))
  stub_ss.add(files('ram-block.c'))
  stub_ss.add(files('runstate-check.c'))
  stub_ss.add(files('uuid.c'))
endif

if have_block or have_ga
  stub_ss.add(files('replay-tools.c'))
  # stubs for hooks in util/main-loop.c, util/async.c etc.
  stub_ss.add(files('cpus-virtual-clock.c'))
  stub_ss.add(files('icount.c'))
  stub_ss.add(files('graph-lock.c'))
  if linux_io_uring.found()
    stub_ss.add(files('io_uring.c'))
  endif
  if libaio.found()
    stub_ss.add(files('linux-aio.c'))
  endif
  stub_ss.add(files('qemu-timer-notify-cb.c'))

  # stubs for monitor
  stub_ss.add(files('monitor-internal.c'))
  stub_ss.add(files('qmp-command-available.c'))
  stub_ss.add(files('qmp-quit.c'))
endif

if have_block or have_user
  stub_ss.add(files('qtest.c'))
  stub_ss.add(files('vm-stop.c'))
  stub_ss.add(files('vmstate.c'))
endif

if have_user
  # Symbols that are used by hw/core.
  stub_ss.add(files('cpu-synchronize-state.c'))

  # Stubs for QAPI events.  Those can always be included in the build, but
  # they are not built at all for --disable-system --disable-tools builds.
  if not (have_system or have_tools)
    stub_ss.add(files('qdev.c'))
  endif
endif

if have_system
  # Symbols that are only needed in some configurations.  Try not
  # adding more of these.  If the symbol is used in specific_ss,
  # in particular, consider defining a preprocessor macro via
  # Kconfig or configs/targets/.
  stub_ss.add(files('dump.c'))
  stub_ss.add(files('cmos.c'))
  stub_ss.add(files('fw_cfg.c'))
  stub_ss.add(files('target-get-monitor-def.c'))
  stub_ss.add(files('target-monitor-defs.c'))
  stub_ss.add(files('win32-kbd-hook.c'))
  stub_ss.add(files('xen-hw-stub.c'))
endif

if have_system or have_user
  stub_ss.add(files('gdbstub.c'))

  # Also included in have_system for --disable-tcg builds
  stub_ss.add(files('replay.c'))

  # Also included in have_system for tests/unit/test-qdev-global-props
  stub_ss.add(files('hotplug-stubs.c'))
  stub_ss.add(files('sysbus.c'))
endif
