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

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-${libbase_ver}",
    "libchrome-${libbase_ver}",
    "libmetrics-${libbase_ver}",
    "libmojo-${libbase_ver}",
  ]
}

static_library("ml_common") {
  include_dirs = [
    "${sysroot}/usr/include/tensorflow",
    "${sysroot}/usr/include/tensorflow/third_party/flatbuffers",
  ]
  libs = [ "tensorflow_lite" ]
  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",
    "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",
      "${sysroot}/usr/include/tensorflow/third_party/flatbuffers",
    ]
    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",
    ]
  }
}
