# 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/soda.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",
    "libmojo-${libbase_ver}",
    "system_api",
    "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}/handwriting_interface.proto",
    "${proto_in_dir}/handwriting_validate.proto",
  ]
}

proto_library("ml_soda_proto") {
  proto_in_dir = "${sysroot}/usr/include/chromeos/libsoda/proto"
  proto_out_dir = "chrome/knowledge/soda/"
  sources = [ "${proto_in_dir}/extended_soda_api.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",
    "dlcservice_client.cc",
    "graph_executor_impl.cc",
    "handwriting.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_speech) {
    sources += [
      "soda.cc",
      "soda_proto_mojom_conversion.cc",
      "soda_recognizer_impl.cc",
    ]
    deps += [ ":ml_soda_proto" ]
  } else {
    sources += [ "soda_recognizer_impl_dummy.cc" ]
  }
  defines = [
    "USE_ONDEVICE_HANDWRITING=${use.ondevice_handwriting}",
    "USE_ONDEVICE_HANDWRITING_DLC=${use.ondevice_handwriting_dlc}",
    "TC3_VOCAB_ANNOTATOR_DUMMY",
  ]
}

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",
      "//common-mk/testrunner:testrunner",
    ]
    sources = [
      "dlcservice_client_test.cc",
      "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",
    ]
    defines = [
      "USE_ONDEVICE_HANDWRITING=${use.ondevice_handwriting}",
      "USE_ONDEVICE_HANDWRITING_DLC=${use.ondevice_handwriting_dlc}",
    ]
    if (use.ondevice_speech && !use.asan) {
      defines += [ "USE_ONDEVICE_SPEECH" ]
      sources += [
        "soda_proto_mojom_conversion_test.cc",
        "soda_test.cc",
      ]
    }
  }
  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" ]
  }
}
