# 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",
      ":web_platform_handwriting_fuzzer",
    ]
  }
  if (use.ml_benchmark_drivers) {
    deps += [ ":libml_for_benchmark" ]
  }
}

generate_mojom_bindings("ml_mojo_bindings") {
  mojo_root = "${platform2_root}"
  if (use.ml_benchmark_drivers) {
    use_pic = true
  }
  sources = [
    "mojom/big_buffer.mojom",
    "mojom/document_scanner.mojom",
    "mojom/document_scanner_param_types.mojom",
    "mojom/geometry.mojom",
    "mojom/grammar_checker.mojom",
    "mojom/graph_executor.mojom",
    "mojom/handwriting_recognizer.mojom",
    "mojom/machine_learning_service.mojom",
    "mojom/model.mojom",
    "mojom/shared_memory.mojom",
    "mojom/soda.mojom",
    "mojom/tensor.mojom",
    "mojom/text_classifier.mojom",
    "mojom/text_suggester.mojom",
    "mojom/time.mojom",
    "mojom/web_platform_handwriting.mojom",
    "mojom/web_platform_model.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",
    "libmetrics",
    "libminijail",
    "libmojo",
    "system_api",
    "zlib",
  ]
}

proto_library("ml_grammar_proto") {
  proto_in_dir = "${sysroot}/usr/include/chromeos/libgrammar/proto"
  proto_out_dir = "chrome/knowledge/grammar/"
  sources = [ "${proto_in_dir}/grammar_interface.proto" ]
}

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" ]
}

proto_library("ml_text_suggester_proto") {
  proto_in_dir = "${sysroot}/usr/include/chromeos/libsuggest/proto"
  proto_out_dir = "chrome/knowledge/suggest/"
  sources = [ "${proto_in_dir}/text_suggester_interface.proto" ]
}

proto_library("ml_assist_ranker_proto") {
  proto_in_dir = "./proto/"
  proto_out_dir = "chrome/knowledge/assist_ranker/"
  sources = [
    "${proto_in_dir}/example_preprocessor.proto",
    "${proto_in_dir}/ranker_example.proto",
  ]
}

source_set("example_preprocessor") {
  sources = [
    "example_preprocessor/example_preprocessing.cc",
    "example_preprocessor/ranker_example_util.cc",
  ]
  configs += [ ":ml_common_pkg_deps" ]
  deps = [ ":ml_assist_ranker_proto" ]
}

static_library("ml_common") {
  sources = [
    "daemon.cc",
    "dlcservice_client.cc",
    "document_scanner_impl.cc",
    "document_scanner_library.cc",
    "grammar_checker_impl.cc",
    "grammar_library.cc",
    "grammar_proto_mojom_conversion.cc",
    "graph_executor_delegate.cc",
    "graph_executor_impl.cc",
    "handwriting.cc",
    "handwriting_proto_mojom_conversion.cc",
    "handwriting_recognizer_impl.cc",
    "machine_learning_service_impl.cc",
    "metrics.cc",
    "model_conversions.cc",
    "model_delegate.cc",
    "model_impl.cc",
    "model_metadata.cc",
    "process.cc",
    "request_metrics.cc",
    "tensor_view.cc",
    "text_classifier_impl.cc",
    "text_suggester_impl.cc",
    "text_suggester_proto_mojom_conversion.cc",
    "text_suggestions.cc",
    "time_metrics.cc",
    "util.cc",
    "web_platform_handwriting_proto_mojom_conversion.cc",
    "web_platform_handwriting_recognizer_impl.cc",
    "web_platform_model_impl.cc",
    "web_platform_model_loader_impl.cc",
  ]
  include_dirs = [
    "${sysroot}/usr/include/icu-chrome/common",
    "${sysroot}/usr/include/icu-chrome/i18n",
    "${sysroot}/usr/include/libtextclassifier",
    "${sysroot}/usr/include/marisa-aosp",
    "${sysroot}/usr/include/tensorflow",
  ]
  libs = [
    "icui18n-chrome",
    "icuuc-chrome",
    "marisa-aosp",
    "tensorflowlite",
    "textclassifier",
    "utf",
  ]
  pkg_deps = [ "protobuf" ]
  all_dependent_configs = [ ":ml_common_pkg_deps" ]
  defines = [
    "USE_ONDEVICE_DOCUMENT_SCANNER=${use.ondevice_document_scanner}",
    "USE_ONDEVICE_DOCUMENT_SCANNER_DLC=${use.ondevice_document_scanner_dlc}",
    "USE_ONDEVICE_GRAMMAR=${use.ondevice_grammar}",
    "USE_ONDEVICE_TEXT_SUGGESTIONS=${use.ondevice_text_suggestions}",
    "TC3_VOCAB_ANNOTATOR_IMPL",
  ]
  public_deps = [ ":ml_mojo_bindings_lib" ]
  deps = [
    ":benchmark_proto",
    ":example_preprocessor",
    ":ml_assist_ranker_proto",
    ":ml_grammar_proto",
    ":ml_handwriting_proto",
    ":ml_text_suggester_proto",
  ]
  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_fake.cc" ]
  }

  # Enables handwriting for all boards in fuzzer, including those don't support
  # ondevice handwriting, because we want to do fuzzer test on all the boards.
  # This is safe because fuzzer uses a fake handwriting backend which doesn't
  # really dlopen the library.
  if (use.fuzzer) {
    defines += [
      "USE_ONDEVICE_HANDWRITING=true",
      "USE_ONDEVICE_HANDWRITING_DLC=true",
    ]
  } else {
    defines += [
      "USE_ONDEVICE_HANDWRITING=${use.ondevice_handwriting}",
      "USE_ONDEVICE_HANDWRITING_DLC=${use.ondevice_handwriting_dlc}",
    ]
  }
}

proto_library("benchmark_proto") {
  proto_in_dir = "./proto/"
  proto_out_dir = "include/ml"
  sources = [ "${proto_in_dir}/benchmark.proto" ]
  standalone = true
  use_pic = true
}

shared_library("libml_for_benchmark") {
  sources = [
    "benchmark.cc",
    "graph_executor_delegate.cc",
    "graph_executor_impl.cc",
    "metrics.cc",
    "model_conversions.cc",
    "model_delegate.cc",
    "model_impl.cc",
    "model_metadata.cc",
    "process.cc",
    "request_metrics.cc",
    "tensor_view.cc",
    "time_metrics.cc",
    "util.cc",
  ]
  include_dirs = [ "${sysroot}/usr/include/tensorflow" ]
  libs = [ "tensorflowlite" ]
  pkg_deps = [
    "libbrillo",
    "libchrome",
    "libmetrics",
    "libmojo",
    "protobuf",
  ]
  public_deps = [
    ":benchmark_proto",
    "//ml_benchmark:libmlbenchmark_proto",
  ]
  deps = [ ":ml_mojo_bindings_lib" ]
}

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

executable("ml_service") {
  sources = [ "main.cc" ]
  include_dirs = [ "${sysroot}/usr/include/tensorflow" ]
  deps = [
    ":ml_common",
    "//ml/dbus_service:core",
  ]
}

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

if (use.test) {
  executable("ml_service_test") {
    sources = [
      "dbus_service/tf_model_graph_executor_test.cc",
      "dlcservice_client_test.cc",
      "document_scanner_library_test.cc",
      "example_preprocessor/example_preprocessing_test.cc",
      "example_preprocessor/ranker_example_util_test.cc",
      "grammar_library_test.cc",
      "grammar_proto_mojom_conversion_test.cc",
      "graph_executor_impl_test.cc",
      "handwriting_proto_mojom_conversion_test.cc",
      "handwriting_test.cc",
      "machine_learning_service_impl_multiprocess_test.cc",
      "machine_learning_service_impl_test.cc",
      "model_impl_test.cc",
      "test_utils.cc",
      "testrunner.cc",
      "text_suggester_proto_mojom_conversion_test.cc",
      "text_suggestions_test.cc",
      "util_test.cc",
      "web_platform_handwriting_proto_mojom_conversion_test.cc",
      "web_platform_model_impl_test.cc",
    ]
    configs += [ "//common-mk:test" ]
    include_dirs = [ "${sysroot}/usr/include/tensorflow" ]
    defines = [
      "USE_ONDEVICE_DOCUMENT_SCANNER=${use.ondevice_document_scanner}",
      "USE_ONDEVICE_DOCUMENT_SCANNER_DLC=${use.ondevice_document_scanner_dlc}",
      "USE_ONDEVICE_GRAMMAR=${use.ondevice_grammar}",
      "USE_ONDEVICE_HANDWRITING=${use.ondevice_handwriting}",
      "USE_ONDEVICE_HANDWRITING_DLC=${use.ondevice_handwriting_dlc}",
      "USE_ONDEVICE_TEXT_SUGGESTIONS=${use.ondevice_text_suggestions}",
    ]
    deps = [
      ":ml_assist_ranker_proto",
      ":ml_common",
      ":ml_grammar_proto",
      ":ml_handwriting_proto",
      ":ml_service",
      ":ml_text_suggester_proto",
      "//common-mk/testrunner:testrunner",
      "//ml/dbus_service:core",
    ]
    if (use.ondevice_speech && !use.asan) {
      sources += [
        "soda_proto_mojom_conversion_test.cc",
        "soda_test.cc",
      ]
      defines += [ "USE_ONDEVICE_SPEECH" ]
    }
    if (use.ml_benchmark_drivers) {
      sources += [ "benchmark_test.cc" ]
      deps += [ ":libml_for_benchmark" ]
    }
  }
  executable("ml_cmdline_test") {
    sources = [
      "simple_test.cc",
      "testrunner.cc",
    ]
    configs += [ "//common-mk:test" ]
    include_dirs = [ "${sysroot}/usr/include/tensorflow" ]
    run_test = true
    deps = [ ":ml_cmdline_common" ]
  }
}

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

  proto_library("web_platform_handwriting_fuzz_container_proto") {
    proto_in_dir = "./proto/"
    proto_lib_dirs = [ "${sysroot}/usr/include/chromeos/libhandwriting/proto" ]
    proto_out_dir = "chrome/knowledge/handwriting/"
    sources =
        [ "${proto_in_dir}/web_platform_handwriting_fuzz_container.proto" ]
  }

  executable("web_platform_handwriting_fuzzer") {
    sources = [
      "fuzzers/handwriting_fake.cc",
      "fuzzers/web_platform_handwriting_fuzzer.cc",
    ]
    configs += [ "//common-mk/common_fuzzer" ]

    # Enables handwriting for all boards in fuzzer.
    defines = [
      "USE_ONDEVICE_HANDWRITING=true",
      "USE_ONDEVICE_HANDWRITING_DLC=true",
    ]
    pkg_deps = [ "libprotobuf-mutator" ]
    deps = [
      ":ml_common",
      ":web_platform_handwriting_fuzz_container_proto",
    ]
  }
}
