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

group("all") {
  deps = [
    ":install_conf",
    ":mist",
  ]
  if (use.test) {
    deps += [ ":mist_testrunner" ]
  }
}

pkg_config("target_defaults") {
  pkg_deps = [
    "libbrillo",
    "libchrome",
    "libmetrics",
    "libusb-1.0",
    "protobuf",
  ]
}

proto_library("mist-protos") {
  proto_in_dir = "proto"
  proto_out_dir = "include/mist/proto_bindings"
  sources = [
    "${proto_in_dir}/config.proto",
    "${proto_in_dir}/usb_modem_info.proto",
  ]
}

static_library("libmist") {
  sources = [
    "config_loader.cc",
    "context.cc",
    "event_dispatcher.cc",
    "metrics.cc",
    "mist.cc",
    "usb_bulk_transfer.cc",
    "usb_config_descriptor.cc",
    "usb_constants.cc",
    "usb_device.cc",
    "usb_device_descriptor.cc",
    "usb_device_event_notifier.cc",
    "usb_endpoint_descriptor.cc",
    "usb_error.cc",
    "usb_interface.cc",
    "usb_interface_descriptor.cc",
    "usb_manager.cc",
    "usb_modem_one_shot_switcher.cc",
    "usb_modem_switch_context.cc",
    "usb_modem_switch_operation.cc",
    "usb_modem_switcher.cc",
    "usb_transfer.cc",
  ]
  configs += [ ":target_defaults" ]
  deps = [ ":mist-protos" ]
}

executable("mist") {
  sources = [ "main.cc" ]
  configs += [ ":target_defaults" ]
  install_path = "bin"
  deps = [ ":libmist" ]
}

install_config("install_conf") {
  sources = [ "default.conf" ]
  install_path = "/usr/share/mist"
}

if (use.test) {
  pkg_config("mist_testrunner_config") {
    pkg_deps = [ "libchrome-test" ]
  }
  executable("mist_testrunner") {
    sources = [
      "config_loader_test.cc",
      "event_dispatcher_test.cc",
      "mist.cc",
      "mock_context.cc",
      "usb_config_descriptor_test.cc",
      "usb_constants_test.cc",
      "usb_device_descriptor_test.cc",
      "usb_device_event_notifier_test.cc",
      "usb_endpoint_descriptor_test.cc",
      "usb_error_test.cc",
      "usb_interface_descriptor_test.cc",
      "usb_modem_switch_context_test.cc",
      "usb_transfer_test.cc",
    ]
    configs += [
      "//common-mk:test",
      ":target_defaults",
    ]
    run_test = true
    deps = [
      ":libmist",
      "//common-mk/testrunner:testrunner",
    ]
  }
}
