hb_view_sources = [
  'hb-view.cc',
]

hb_shape_sources = [
  'hb-shape.cc',
]

hb_draw_sources = [
  'hb-vector.cc',
]

hb_raster_sources = [
  'hb-raster.cc',
]

hb_ft_raster_sources = [
  'hb-ft-raster.cc',
]

hb_info_sources = [
  'hb-info.cc',
]

hb_subset_cli_sources = [
  'hb-subset.cc',
]

# If found, invoke it on our four binaries to build man pages
# If not found, just skip this step
if not get_option('docs').disabled() and not meson.is_cross_build()
  help2man = find_program('help2man', required: false)
else
  help2man = disabler()
endif
if help2man.found()
  help2man_command = ['sh', '-c', help2man.full_path() + ' --help-option=--help-all --no-info -n "$(@INPUT@ --help | head -n 4 | tail -n 1)" --output=$0 @INPUT@', '@OUTPUT@']
  help2man_env = environment()
  help2man_env.set('HB_UTIL_HELP_VERBOSE', '1')
endif

util_deps = [freetype_dep, cairo_dep, cairo_ft_dep, glib_dep]

if conf.get('HAVE_GLIB', 0) == 1
  if conf.get('HAVE_CAIRO', 0) == 1
    hb_view = executable('hb-view', hb_view_sources,
      cpp_args: cpp_args,
      include_directories: [incconfig, incsrc],
      dependencies: [util_deps, chafa_dep],
      link_with: [libharfbuzz, libharfbuzz_cairo],
      install: true,
    )
    meson.override_find_program('hb-view', hb_view)
    if help2man.found()
      target = hb_view.name() + '.1'
      hb_view_manpage = custom_target(target,
        input: hb_view,
        output: target,
        command: help2man_command,
        depends: [hb_view],
        env: help2man_env,
        install: true,
        install_dir: get_option('mandir') / 'man1',
      )
    endif
  else
    hb_view = disabler()
  endif

  hb_shape = executable('hb-shape', hb_shape_sources,
    cpp_args: cpp_args,
    include_directories: [incconfig, incsrc],
    dependencies: [util_deps],
    link_with: [libharfbuzz],
    install: true,
  )
  meson.override_find_program('hb-shape', hb_shape)

  if not get_option('vector').disabled()
    hb_vector = executable('hb-vector', hb_draw_sources,
      cpp_args: cpp_args,
      include_directories: [incconfig, incsrc],
      dependencies: [util_deps],
      link_with: [libharfbuzz, libharfbuzz_vector],
      install: true,
    )
    meson.override_find_program('hb-vector', hb_vector)
  else
    hb_vector = disabler()
  endif

  if not get_option('raster').disabled()
    hb_raster = executable('hb-raster', hb_raster_sources,
      cpp_args: cpp_args,
      include_directories: [incconfig, incsrc],
      dependencies: [util_deps, chafa_dep],
      link_with: [libharfbuzz, libharfbuzz_raster],
      install: true,
    )
    meson.override_find_program('hb-raster', hb_raster)
  else
    hb_raster = disabler()
  endif

  if conf.get('HAVE_FREETYPE', 0) == 1
    hb_ft_raster_util = executable('hb-ft-raster', hb_ft_raster_sources,
      cpp_args: cpp_args,
      include_directories: [incconfig, incsrc],
      dependencies: [util_deps],
      link_with: [libharfbuzz],
      install: false,
    )

    hb_ft_raster_all = executable('hb-ft-raster-all', ['hb-ft-raster-all.cc'],
      cpp_args: cpp_args,
      include_directories: [incconfig, incsrc],
      dependencies: [util_deps],
      link_with: [libharfbuzz],
      install: false,
    )
  endif

  hb_draw_all = executable('hb-draw-all', ['hb-draw-all.c'],
    cpp_args: cpp_args,
    include_directories: [incconfig, incsrc],
    link_with: [libharfbuzz],
    install: false,
  )

  if not get_option('vector').disabled()
    hb_vector_svg_all = executable('hb-vector-svg-all', ['hb-vector-svg-all.c'],
      cpp_args: cpp_args,
      include_directories: [incconfig, incsrc],
      link_with: [libharfbuzz, libharfbuzz_vector],
      install: false,
    )
  endif

  hb_paint_all = executable('hb-paint-all', ['hb-paint-all.c'],
    cpp_args: cpp_args,
    include_directories: [incconfig, incsrc],
    link_with: [libharfbuzz],
    install: false,
  )

  if not get_option('raster').disabled()
    hb_raster_all = executable('hb-raster-all', ['hb-raster-all.cc'],
      cpp_args: cpp_args,
      include_directories: [incconfig, incsrc],
      link_with: [libharfbuzz, libharfbuzz_raster],
      install: false,
    )
  endif

  hb_info = executable('hb-info', [hb_info_sources, gobject_enums_h],
    cpp_args: cpp_args,
    include_directories: [incconfig, incsrc],
    dependencies: [util_deps, libharfbuzz_gobject_dep, chafa_dep],
    link_with: [libharfbuzz],
    install: true,
  )
  meson.override_find_program('hb-info', hb_info)

  if not get_option('subset').disabled()
    hb_subset = executable('hb-subset', hb_subset_cli_sources,
      cpp_args: cpp_args,
      include_directories: [incconfig, incsrc],
      dependencies: util_deps,
      link_with: [libharfbuzz, libharfbuzz_subset],
      install: true,
    )
    meson.override_find_program('hb-subset', hb_subset)
  else
    hb_subset = disabler()
  endif

  if help2man.found()
    foreach binary: [hb_shape, hb_raster, hb_vector, hb_info, hb_subset]
      target = binary.name() + '.1'
      manpage = custom_target(target,
        input: binary,
        output: target,
        command: help2man_command,
        depends: [binary],
        env: help2man_env,
        install: true,
        install_dir: get_option('mandir') / 'man1',
      )
    endforeach
  endif

  if get_option('experimental_api')
    if not get_option('subset').disabled()
      test('test-hb-subset-parsing',
        executable('test-hb-subset-parsing',
          ['test-hb-subset-parsing.c'],
          cpp_args: cpp_args,
          c_args: ['-DHB_EXPERIMENTAL_API'],
          include_directories: [incconfig, incsrc],
          dependencies: util_deps,
          link_with: [libharfbuzz, libharfbuzz_subset],
          install: false,
      ),
      workdir : meson.current_source_dir(),
      suite: ['util'])

      executable('hb-subset-depend', ['hb-subset-depend.cc'],
        cpp_args: cpp_args + ['-DHB_EXPERIMENTAL_API'],
        include_directories: [incconfig, incsrc],
        dependencies: util_deps,
        link_with: [libharfbuzz, libharfbuzz_subset],
        install: false,
      )
    endif
  endif
else
  # Disable tests that use this
  hb_view = disabler()
  hb_shape = disabler()
  hb_vector = disabler()
  hb_info = disabler()
  hb_subset = disabler()
endif

if not get_option('gpu').disabled()
  if host_machine.system() == 'darwin'
    add_languages('objcpp', required: true)
  endif
  subdir('gpu')

  if have_gpu_demo_deps and conf.get('HAVE_GLIB', 0) == 1
    gpu_demo_deps = [util_deps, gl_dep, glew_dep, glfw_dep]
    if host_machine.system() == 'darwin'
      gpu_demo_deps += metal_dep
    endif
    if host_machine.system() == 'windows' and d3d11_dep.found() and d3dcompiler_dep.found()
      gpu_demo_deps += [d3d11_dep, d3dcompiler_dep]
    endif
    hb_gpu_util = executable('hb-gpu',
      ['hb-gpu.cc'] + gpu_demo_sources,
      cpp_args: cpp_args,
      include_directories: [incconfig, incsrc],
      dependencies: gpu_demo_deps,
      link_with: [libharfbuzz, libharfbuzz_gpu],
      install: true,
    )
  endif

  hb_gpu_encode_all = executable('hb-gpu-encode-all',
    'hb-gpu-encode-all.cc',
    cpp_args: cpp_args,
    include_directories: [incconfig, incsrc],
    link_with: [libharfbuzz, libharfbuzz_gpu],
    install: false,
  )
endif
