# Copyright 2018 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")
import("//common-mk/proto_library.gni")

group("all") {
  deps = [
    ":ml_cmdline",
    ":ml_service",
  ]
  if (use.test) {
    deps += [
      ":ml_cmdline_test",
      ":ml_service_test",
    ]
  }
  if (use.fuzzer) {
    deps += [
      ":ml_service_impl_fuzzer",
      ":ml_service_load_flatbuffer_fuzzer",
    ]
  }
}

generate_mojom_bindings("ml_mojo_bindings") {
  mojo_root = "${platform2_root}"
  sources = [
    "mojom/graph_executor.mojom",
    "mojom/handwriting_recognizer.mojom",
    "mojom/machine_learning_service.mojom",
    "mojom/model.mojom",
    "mojom/tensor.mojom",
    "mojom/text_classifier.mojom",
    "mojom/time.mojom",
  ]
  mojo_extra_args = [
    "--typemap",
    rebase_path("mojom/type_mappings.json"),
  ]
}

source_set("ml_mojo_bindings_lib") {
  sources = [ "mojom/time_mojom_traits.h" ]
  public_deps = [ ":ml_mojo_bindings" ]
}

pkg_config("ml_common_pkg_deps") {
  pkg_deps = [
    "libbrillo",
    "libchrome-${libbase_ver}",
    "libmetrics-${libbase_ver}",
    "libmojo-${libbase_ver}",
    "zlib",
  ]
}

proto_library("ml_handwriting_proto") {
  proto_in_dir = "${sysroot}/usr/include/chromeos/libhandwriting/proto"
  proto_out_dir = "chrome/knowledge/handwriting/"
  sources = [
    "${proto_in_dir}/interface.proto",
    "${proto_in_dir}/validate.proto",
  ]
}

static_library("ml_common") {
  include_dirs = [
    "${sysroot}/usr/include/icu-chrome/common",
    "${sysroot}/usr/include/icu-chrome/i18n",
    "${sysroot}/usr/include/libtextclassifier",
    "${sysroot}/usr/include/tensorflow",
  ]
  libs = [
    "icui18n-chrome",
    "icuuc-chrome",
    "tensorflowlite",
    "textclassifier",
    "utf",
  ]
  pkg_deps = [ "protobuf" ]
  deps = [ ":ml_handwriting_proto" ]
  public_deps = [ ":ml_mojo_bindings_lib" ]
  all_dependent_configs = [ ":ml_common_pkg_deps" ]
  sources = [
    "daemon.cc",
    "graph_executor_impl.cc",
    "handwriting.cc",
    "handwriting_path.cc",
    "handwriting_proto_mojom_conversion.cc",
    "handwriting_recognizer_impl.cc",
    "machine_learning_service_impl.cc",
    "metrics.cc",
    "model_impl.cc",
    "model_metadata.cc",
    "request_metrics.cc",
    "tensor_view.cc",
    "text_classifier_impl.cc",
    "util.cc",
  ]
  if (use.ondevice_handwriting) {
    defines = [ "ML_SUPPORT_HANDWRITING" ]
  }
}

static_library("ml_cmdline_common") {
  deps = [ ":ml_common" ]
  sources = [ "simple.cc" ]
}

executable("ml_service") {
  deps = [ ":ml_common" ]
  sources = [ "main.cc" ]
}

executable("ml_cmdline") {
  include_dirs = [ "${sysroot}/usr/include/tensorflow" ]
  deps = [ ":ml_cmdline_common" ]
  sources = [ "command_line.cc" ]
}

if (use.test) {
  executable("ml_service_test") {
    configs += [ "//common-mk:test" ]
    include_dirs = [ "${sysroot}/usr/include/tensorflow" ]
    deps = [
      ":ml_common",
      ":ml_handwriting_proto",
    ]
    sources = [
      "graph_executor_impl_test.cc",
      "handwriting_proto_mojom_conversion_test.cc",
      "handwriting_test.cc",
      "machine_learning_service_impl_test.cc",
      "model_impl_test.cc",
      "test_utils.cc",
      "testrunner.cc",
      "util_test.cc",
    ]
    if (use.ondevice_handwriting) {
      defines = [ "ML_SUPPORT_HANDWRITING" ]
    }
  }
  executable("ml_cmdline_test") {
    configs += [ "//common-mk:test" ]
    include_dirs = [ "${sysroot}/usr/include/tensorflow" ]
    deps = [ ":ml_cmdline_common" ]
    sources = [
      "simple_test.cc",
      "testrunner.cc",
    ]
  }
}

# Fuzzer target.
if (use.fuzzer) {
  executable("ml_service_impl_fuzzer") {
    configs += [ "//common-mk/common_fuzzer:common_fuzzer" ]
    deps = [ ":ml_common" ]
    sources = [ "fuzzers/ml_service_impl_fuzzer.cc" ]
  }
  executable("ml_service_load_flatbuffer_fuzzer") {
    configs += [ "//common-mk/common_fuzzer" ]
    deps = [ ":ml_common" ]
    sources = [ "fuzzers/ml_service_load_flatbuffer_fuzzer.cc" ]
  }
}
