# Copyright 2020 The Chromium OS Authors.  All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import("//common-mk/mojom_bindings_generator.gni")
import("//common-mk/pkg_config.gni")

# The target named "all" is the root target built
# by the platform2 build system.
group("all") {
  deps = [
    ":ocr_service",
    ":ocr_tool",
  ]
  if (use.test) {
    deps += [ ":ocr_service_test" ]
  }
  if (use.fuzzer) {
    deps += [ ":ocr_service_fuzzer" ]
  }
}

generate_mojom_bindings("ocr_mojo_bindings") {
  mojo_root = "${platform2_root}"
  sources = [ "mojo/ocr_service.mojom" ]
}

pkg_config("target_defaults") {
  cflags_c = [
    "-Wextra",
    "-Wshadow",
  ]
  cflags_cc = [ "-Woverloaded-virtual" ]
  pkg_deps = [
    "libbrillo",
    "libchrome",
    "libmojo",
    "system_api",
    "tesseract",
  ]
}

source_set("libocr") {
  configs += [ ":target_defaults" ]
  deps = [ ":ocr_mojo_bindings" ]
  sources = [
    "daemon.cc",
    "ocr_service_impl.cc",
  ]
}

source_set("libocr_mojo_adapter") {
  configs += [ ":target_defaults" ]
  deps = [ ":ocr_mojo_bindings" ]
  sources = [
    "mojo_adapter/ocr_service_mojo_adapter.cc",
    "mojo_adapter/ocr_service_mojo_adapter_delegate_impl.cc",
  ]
}

executable("ocr_service") {
  sources = [ "main.cc" ]
  configs += [ ":target_defaults" ]
  deps = [ ":libocr" ]
}

executable("ocr_tool") {
  sources = [ "ocr_tool/ocr_tool.cc" ]
  configs += [ ":target_defaults" ]
  deps = [ ":libocr_mojo_adapter" ]
}

if (use.test) {
  executable("ocr_service_test") {
    sources = [ "ocr_service_impl_test.cc" ]
    configs += [
      "//common-mk:test",
      ":target_defaults",
    ]
    deps = [
      ":libocr",
      "//common-mk/testrunner:testrunner",
    ]
  }
}

if (use.fuzzer) {
  executable("ocr_service_fuzzer") {
    sources = [ "ocr_service_fuzzer.cc" ]
    configs += [
      "//common-mk/common_fuzzer",
      ":target_defaults",
    ]
    deps = [ ":libocr" ]
  }
}
