if get_option('gtk_doc')
  subdir('gdbus-object-manager-example')
  subdir('xml')

  ignore_headers = [
    'fam',
    'fen',
    'gdbus-2.0',
    'gvdb',
    'inotify',
    'kqueue',
    'libasyncns',
    'tests',
    'win32',
    'xdgmime',
    'gappinfoprivate.h',
    'gapplicationimpl.h',
    'gasynchelper.h',
    'gcontenttypeprivate.h',
    'gcontextspecificgroup.h',
    'gcredentialsprivate.h',
    'gdbus-daemon-generated.h',
    'gdbusactiongroup-private.h',
    'gdbusauth.h',
    'gdbusauthmechanismanon.h',
    'gdbusauthmechanismexternal.h',
    'gdbusauthmechanism.h',
    'gdbusauthmechanismsha1.h',
    'gdbusdaemon.h',
    'gdbusprivate.h',
    'gdelayedsettingsbackend.h',
    'gdocumentportal.h',
    'gdummyfile.h',
    'gdummyproxyresolver.h',
    'gdummytlsbackend.h',
    'gfileattribute-priv.h',
    'gfileinfo-priv.h',
    'ghttpproxy.h',
    'giomodule-priv.h',
    'gioprivate.h',
    'giowin32-priv.h',
    'gio_probes.h',
    'gio_trace.h',
    'gio-tool.h',
    'glocaldirectorymonitor.h',
    'glocalfileenumerator.h',
    'glocalfile.h',
    'glocalfileinfo.h',
    'glocalfileinputstream.h',
    'glocalfileiostream.h',
    'glocalfilemonitor.h',
    'glocalfileoutputstream.h',
    'glocalvfs.h',
    'gmemorymonitordbus.h',
    'gmemorymonitorportal.h',
    'gmountprivate.h',
    'gnativevolumemonitor.h',
    'gnetworkingprivate.h',
    'gnetworkmonitorbase.h',
    'gnetworkmonitornetlink.h',
    'gnetworkmonitornm.h',
    'gnetworkmonitorportal.h',
    'gnotificationbackend.h',
    'gnotification-private.h',
    'gopenuriportal.h',
    'gpollfilemonitor.h',
    'gportalsupport.h',
    'gproxyresolverportal.h',
    'gregistrysettingsbackend.h',
    'gresourcefile.h',
    'gsettingsbackendinternal.h',
    'gsettings-mapping.h',
    'gsettingsschema-internal.h',
    'gsocketinputstream.h',
    'gsocketoutputstream.h',
    'gsocks4aproxy.h',
    'gsocks4proxy.h',
    'gsocks5proxy.h',
    'gsubprocesslauncher-private.h',
    'gthreadedresolver.h',
    'gtrashportal.h',
    'gunionvolumemonitor.h',
    'gunixmount.h',
    'gunixresolver.h',
    'gunixvolume.h',
    'gunixvolumemonitor.h',
    'gwin32networkmonitor.h',
    'gwin32api-application-activation-manager.h',
    'gwin32api-iterator.h',
    'gwin32api-misc.h',
    'gwin32api-package.h',
    'gwin32api-storage.h',
    'gwin32appinfo.h',
    'gwin32file-sync-stream.h',
    'gwin32mount.h',
    'gwin32packageparser.h',
    'gwin32resolver.h',
    'gwin32volumemonitor.h',
    'thumbnail-verify.h',
    'xdp-dbus.h',
  ]

  sections_files = files('gio-sections-common.txt')

  if host_system == 'windows'
    ignore_headers += [
      'gfiledescriptorbased.h',
      'gunixconnection.h',
      'gunixcredentialsmessage.h',
      'gunixmounts.h',
      'gunixfdlist.h',
      'gunixfdmessage.h',
      'gunixinputstream.h',
      'gunixoutputstream.h',
      'gunixsocketaddress.h',
      'gdesktopappinfo.h',
      'gosxappinfo.h',
    ]
    sections_files += files('gio-sections-win32.txt')
    platform_file = files('gio-docs-win32.xml')
  else
    if glib_have_cocoa
      ignore_headers += ['gdesktopappinfo.h']
    else
      ignore_headers += ['gosxappinfo.h']
    endif

    ignore_headers += [
      'gwin32inputstream.h',
      'gwin32outputstream.h',
      'gwin32registrykey.h',
    ]
    platform_file = files('gio-docs-unix.xml')
  endif

  ignore_sources = [
    'kqueue',
    'tests',
    'gdbus-daemon-generated.c',
    'xdp-dbus.c',
  ]

  docpath = join_paths(glib_datadir, 'gtk-doc', 'html')
  version_conf = configuration_data()
  version_conf.set('VERSION', meson.project_version())
  configure_file(
    input: 'version.xml.in',
    output: 'version.xml',
    configuration: version_conf
  )

  # FIXME: configure_file() does not support more than one file in input
  # argument. If input argument is omitted then meson checks that all items in
  # the command array are strings. But if we have an input then extra files
  # can be passed in command array.
  # See https://github.com/mesonbuild/meson/issues/5893
  concat_files_helper = find_program('concat-files-helper.py')
  configure_file(
    output : 'gio-sections.txt',
    input : sections_files[0],
    command : [concat_files_helper, '@OUTPUT@'] + sections_files,
  )

  configure_file(
    output : 'gio-docs-platform.xml',
    input : platform_file,
    copy : true,
  )

  content_files = [
    'overview.xml',
    'migrating-posix.xml',
    'migrating-gnome-vfs.xml',
    'migrating-gconf.xml',
    'migrating-gdbus.xml',
    'gio-querymodules.xml',
    'glib-compile-schemas.xml',
    'glib-compile-resources.xml',
    'gapplication.xml',
    'gsettings.xml',
    'gresource.xml',
    'gdbus.xml',
    'gdbus-codegen.xml',
  ]

  content_files += [
    gdbus_example_objectmanager_xml,
    gdbus_example_objectmanager_sources,
    gdbus_object_manager_example_doc
  ]

  gnome.gtkdoc('gio',
    main_xml : 'gio-docs.xml',
    namespace : 'g',
    mode : 'none',
    dependencies : [libgio_dep, libgobject_dep, libglib_dep],
    src_dir : 'gio',
    scan_args : gtkdoc_common_scan_args + [
      '--rebuild-types',
      '--ignore-headers=' + ' '.join(ignore_headers),
    ],
    mkdb_args : [
      '--ignore-files=' + ' '.join(ignore_sources),
    ],
    content_files : content_files,
    expand_content_files : [
      'overview.xml',
      'migrating-posix.xml',
      'migrating-gnome-vfs.xml',
      'migrating-gconf.xml',
      'migrating-gdbus.xml',
      'gdbus-codegen.xml',
    ],
    html_assets : [
      'gvfs-overview.png',
      'menu-example.png',
      'menu-model.png',
    ],
    fixxref_args: [
      '--html-dir=' + docpath,
      '--extra-dir=' + join_paths('gio', '..', 'glib', 'html'),
      '--extra-dir=' + join_paths('gio', '..', 'gobject', 'html'),
    ],
    install: true,
    check: true,
  )
endif


if get_option('man')
  manpages = ['gapplication', 'gio-querymodules', 'glib-compile-schemas',
              'glib-compile-resources', 'gsettings', 'gresource', 'gdbus',
              'gio', 'gdbus-codegen']
  foreach page : manpages
    custom_target(page + '-man',
      input: page + '.xml',
      output: page + '.1',
      command: xsltproc_command,
      install: true,
      install_dir: man1_dir)
  endforeach
endif
