# Copyright 2020 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/generate-dbus-adaptors.gni")
import("//common-mk/pkg_config.gni")

group("all") {
  deps = [
    ":minios",
    ":minios_adaptors",
  ]
  if (use.test) {
    deps += [ ":minios_test" ]
  }
}

generate_dbus_adaptors("minios_adaptors") {
  dbus_service_config = "dbus_adaptors/dbus-service-config.json"
  dbus_adaptors_out_dir = "include/minios/dbus_adaptors"
  sources = [ "dbus_adaptors/org.chromium.MiniOsInterface.xml" ]
}

pkg_config("target_defaults") {
  pkg_deps = [
    "libbrillo",
    "libchrome",
    "libshill-client",
    "libupdate_engine-client",
    "protobuf-lite",
    "system_api",
    "vboot_host",
    "xkbcommon",
  ]
}

static_library("libminios") {
  sources = [
    "daemon.cc",
    "dbus_adaptors/dbus_adaptor.cc",
    "disk_util.cc",
    "draw_utils.cc",
    "key_reader.cc",
    "logger.cc",
    "minios.cc",
    "network_manager.cc",
    "process_manager.cc",
    "recovery_installer.cc",
    "screen_controller.cc",
    "screens/screen_base.cc",
    "screens/screen_debug_options.cc",
    "screens/screen_download.cc",
    "screens/screen_error.cc",
    "screens/screen_language_dropdown.cc",
    "screens/screen_log.cc",
    "screens/screen_network.cc",
    "screens/screen_permission.cc",
    "screens/screen_welcome.cc",
    "shill_proxy.cc",
    "update_engine_proxy.cc",
    "utils.cc",
  ]
  configs += [ ":target_defaults" ]
  deps = [ ":minios_adaptors" ]
}

executable("minios") {
  sources = [ "main.cc" ]
  configs += [ ":target_defaults" ]
  deps = [ ":libminios" ]
}

if (use.test) {
  pkg_config("test_config") {
    pkg_deps = [
      "libbrillo-test",
      "libchrome-test",
    ]
  }
  executable("minios_test") {
    sources = [
      "dbus_adaptors/dbus_adaptor_test.cc",
      "disk_util_test.cc",
      "draw_utils_test.cc",
      "key_reader_test.cc",
      "logger_test.cc",
      "network_manager_test.cc",
      "recovery_installer_test.cc",
      "screen_controller_test.cc",
      "screens/screen_base_test.cc",
      "screens/screen_download_test.cc",
      "screens/screen_network_test.cc",
      "utils_test.cc",
    ]
    configs += [
      "//common-mk:test",
      ":test_config",
      ":target_defaults",
    ]
    deps = [
      ":libminios",
      "//common-mk/testrunner:testrunner",
    ]
  }
}
