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