util_ss.add(files(
  'opts-visitor.c',
  'qapi-clone-visitor.c',
  'qapi-dealloc-visitor.c',
  'qapi-util.c',
  'qapi-visit-core.c',
  'qobject-input-visitor.c',
  'qobject-output-visitor.c',
  'string-input-visitor.c',
  'string-output-visitor.c',
  'hmp-output-visitor.c',
))
if have_system or have_tools
  util_ss.add(files(
    'qmp-dispatch.c',
    'qmp-event.c',
    'qmp-registry.c',
  ))
endif

qapi_all_modules = [
  'authz',
  'block',
  'block-core',
  'block-export',
  'char',
  'common',
  'compat',
  'control',
  'crypto',
  'dump',
  'error',
  'introspect',
  'job',
  'machine',
  'machine-target',
  'migration',
  'misc',
  'misc-target',
  'net',
  'pragma',
  'qom',
  'replay',
  'run-state',
  'sockets',
  'trace',
  'transaction',
  'yank',
]
if have_system
  qapi_all_modules += [
    'acpi',
    'audio',
    'qdev',
    'pci',
    'rdma',
    'rocker',
    'tpm',
  ]
endif
if have_system or have_tools
  qapi_all_modules += [
    'ui',
  ]
endif

qapi_storage_daemon_modules = [
  'block-core',
  'block-export',
  'char',
  'common',
  'control',
  'crypto',
  'introspect',
  'job',
  'qom',
  'sockets',
  'pragma',
  'transaction',
]

qapi_nonmodule_outputs = [
  'qapi-introspect.c', 'qapi-introspect.h',
  'qapi-types.c', 'qapi-types.h',
  'qapi-visit.h', 'qapi-visit.c',
  'qapi-commands.h', 'qapi-commands.c',
  'qapi-init-commands.h', 'qapi-init-commands.c',
  'qapi-events.h', 'qapi-events.c',
  'qapi-emit-events.c', 'qapi-emit-events.h',
]

# First build all sources
qapi_util_outputs = [
  'qapi-builtin-types.c', 'qapi-builtin-visit.c',
  'qapi-builtin-types.h', 'qapi-builtin-visit.h',
]

qapi_inputs = []
qapi_specific_outputs = []
foreach module : qapi_all_modules
  qapi_inputs += [ files(module + '.json') ]
  qapi_module_outputs = [
    'qapi-types-@0@.c'.format(module),
    'qapi-types-@0@.h'.format(module),
    'qapi-visit-@0@.c'.format(module),
    'qapi-visit-@0@.h'.format(module),
  ]
  if have_system or have_tools
    qapi_module_outputs += [
      'qapi-events-@0@.c'.format(module),
      'qapi-events-@0@.h'.format(module),
      'qapi-commands-@0@.c'.format(module),
      'qapi-commands-@0@.h'.format(module),
    ]
  endif
  if module.endswith('-target')
    qapi_specific_outputs += qapi_module_outputs
  else
    qapi_util_outputs += qapi_module_outputs
  endif
endforeach

qapi_files = custom_target('shared QAPI source files',
  output: qapi_util_outputs + qapi_specific_outputs + qapi_nonmodule_outputs,
  input: [ files('qapi-schema.json') ],
  command: [ qapi_gen, '-o', 'qapi', '-b', '@INPUT0@' ],
  depend_files: [ qapi_inputs, qapi_gen_depends ])

# Now go through all the outputs and add them to the right sourceset.
# These loops must be synchronized with the output of the above custom target.

i = 0
foreach output : qapi_util_outputs
  if output.endswith('.h')
    genh += qapi_files[i]
  endif
  util_ss.add(qapi_files[i])
  i = i + 1
endforeach

foreach output : qapi_specific_outputs + qapi_nonmodule_outputs
  if output.endswith('.h')
    genh += qapi_files[i]
  endif
  specific_ss.add(when: 'CONFIG_SOFTMMU', if_true: qapi_files[i])
  i = i + 1
endforeach
