# Copyright 2020 The ChromiumOS Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import("//common-mk/deps.gni")
import("//common-mk/pkg_config.gni")

group("all") {
  deps = [
    ":install_fingerprint_headers",
    ":install_libec_headers",
    ":libec",
    ":libec_pc",
    ":libec_static",
  ]
  if (use.test) {
    deps += [ ":libec_tests" ]
  }
}

default_pkg_deps = [
  "absl",
  "libbrillo",
  "libchrome",
  "libpower_manager-client",
  "libusb-1.0",
]
pkg_config("target_defaults_pkg_deps") {
  pkg_deps = default_pkg_deps
}

libec_sources = [
  "add_entropy_command.cc",
  "device_event_command.cc",
  "display_soc_command.cc",
  "ec_command_factory.cc",
  "ec_usb_device_monitor.cc",
  "ec_usb_endpoint.cc",
  "fingerprint/fp_context_command.cc",
  "fingerprint/fp_context_command_factory.cc",
  "fingerprint/fp_flashprotect_command.cc",
  "fingerprint/fp_frame_command.cc",
  "fingerprint/fp_info_command.cc",
  "fingerprint/fp_mode.cc",
  "fingerprint/fp_mode_command.cc",
  "fingerprint/fp_read_match_secret_command.cc",
  "fingerprint/fp_seed_command.cc",
  "fingerprint/fp_stats_command.cc",
  "fingerprint/fp_template_command.cc",
  "get_chip_info_command.cc",
  "get_mkbp_wake_mask_command.cc",
  "get_protocol_info_command.cc",
  "get_version_command.cc",
  "set_force_lid_open_command.cc",
  "set_mkbp_wake_mask_command.cc",
  "smart_discharge_command.cc",
  "versions_command.cc",
]

static_library("libec_static") {
  sources = libec_sources
  configs += [ ":target_defaults_pkg_deps" ]
  install_path = "lib"
}

shared_library("libec") {
  sources = libec_sources
  configs += [ ":target_defaults_pkg_deps" ]
  install_path = "lib"
}

install_config("install_libec_headers") {
  sources = [
    "add_entropy_command.h",
    "charge_control_set_command.h",
    "device_event_command.h",
    "display_soc_command.h",
    "ec_command.h",
    "ec_command_async.h",
    "ec_command_factory.h",
    "ec_usb_device_monitor.h",
    "ec_usb_endpoint.h",
    "get_chip_info_command.h",
    "get_mkbp_wake_mask_command.h",
    "get_protocol_info_command.h",
    "get_version_command.h",
    "libusb_wrapper.h",
    "mock_ec_command_factory.h",
    "pd_chip_info_command.h",
    "reboot_command.h",
    "rgb_keyboard_command.h",
    "rwsig_action_command.h",
    "set_force_lid_open_command.h",
    "set_mkbp_wake_mask_command.h",
    "smart_discharge_command.h",
    "versions_command.h",
  ]
  install_path = "/usr/include/libec"
}

install_config("install_fingerprint_headers") {
  sources = [
    "fingerprint/fp_context_command.h",
    "fingerprint/fp_context_command_factory.h",
    "fingerprint/fp_flashprotect_command.h",
    "fingerprint/fp_frame_command.h",
    "fingerprint/fp_info_command.h",
    "fingerprint/fp_mode.h",
    "fingerprint/fp_mode_command.h",
    "fingerprint/fp_read_match_secret_command.h",
    "fingerprint/fp_seed_command.h",
    "fingerprint/fp_sensor_errors.h",
    "fingerprint/fp_stats_command.h",
    "fingerprint/fp_template_command.h",
    "fingerprint/sensor_id.h",
    "fingerprint/sensor_image.h",
    "fingerprint/template_info.h",
  ]
  install_path = "/usr/include/libec/fingerprint"
}

if (use.test) {
  config("libec_lib_test_all_dependent_configs") {
    libs = [ "system_api-power_manager-protos" ]
  }

  executable("libec_tests") {
    sources = [
      "add_entropy_command_test.cc",
      "charge_control_set_command_test.cc",
      "device_event_command_test.cc",
      "display_soc_command_test.cc",
      "ec_command_async_test.cc",
      "ec_command_test.cc",
      "ec_usb_device_monitor_test.cc",
      "ec_usb_endpoint_test.cc",
      "fingerprint/fp_context_command_factory_test.cc",
      "fingerprint/fp_context_command_test.cc",
      "fingerprint/fp_flashprotect_command_test.cc",
      "fingerprint/fp_frame_command_test.cc",
      "fingerprint/fp_info_command_test.cc",
      "fingerprint/fp_mode_command_test.cc",
      "fingerprint/fp_mode_test.cc",
      "fingerprint/fp_read_match_secret_command_test.cc",
      "fingerprint/fp_seed_command_test.cc",
      "fingerprint/fp_stats_command_test.cc",
      "fingerprint/fp_template_command_test.cc",
      "fingerprint/fp_template_params_test.cc",
      "get_chip_info_command_test.cc",
      "get_mkbp_wake_mask_command_test.cc",
      "get_protocol_info_command_test.cc",
      "get_version_command_test.cc",
      "pd_chip_info_command_test.cc",
      "pwm_command_test.cc",
      "reboot_command_test.cc",
      "rgb_keyboard_command_test.cc",
      "rwsig_action_command_test.cc",
      "set_force_lid_open_command_test.cc",
      "set_mkbp_wake_mask_command_test.cc",
      "smart_discharge_command_test.cc",
      "versions_command_test.cc",
    ]
    configs += [
      "//common-mk:test",
      ":target_defaults_pkg_deps",
    ]
    all_dependent_configs = [ ":libec_lib_test_all_dependent_configs" ]
    run_test = true
    deps = [
      ":libec_static",
      "//common-mk/testrunner",
    ]
    pkg_deps = [
      "libchrome-test",
      "protobuf-lite",
    ]
  }
}

generate_pkg_config("libec_pc") {
  name = "libec"
  output_name = "libec"
  description = "Chromium OS Embedded Controller Library"
  version = "0.1"

  # ec_command.h uses base/logging.h (and is a header-only class), so we need
  # a direct dependency on libchrome.
  requires = [
    "libchrome",
    "libusb-1.0",
  ]
  requires_private = default_pkg_deps
  libs = [ "-lec" ]
  install = true
}
