# 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")

group("all") {
  deps = [
    ":ml_service",
  ]
  if (use.test) {
    deps += [ ":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/machine_learning_service.mojom",
    "mojom/model.mojom",
    "mojom/tensor.mojom",
  ]
}

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

static_library("ml_common") {
  include_dirs = [ "${sysroot}/usr/include/tensorflow" ]
  libs = [ "tensorflowlite" ]
  deps = [
    ":ml_mojo_bindings",
  ]
  all_dependent_configs = [ ":ml_common_pkg_deps" ]
  sources = [
    "daemon.cc",
    "graph_executor_impl.cc",
    "machine_learning_service_impl.cc",
    "metrics.cc",
    "model_impl.cc",
    "model_metadata.cc",
    "request_metrics.cc",
    "tensor_view.cc",
    "util.cc",
  ]
}

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

if (use.test) {
  executable("ml_service_test") {
    configs += [ "//common-mk:test" ]
    include_dirs = [ "${sysroot}/usr/include/tensorflow" ]
    deps = [
      ":ml_common",
    ]
    sources = [
      "graph_executor_impl_test.cc",
      "machine_learning_service_impl_test.cc",
      "model_impl_test.cc",
      "test_utils.cc",
      "testrunner.cc",
      "util_test.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",
    ]
  }
}
