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

group("all") {
  deps = [
    ":minios",
    ":minios_adaptors",
    ":minios_client",
    ":minios_proxies",
  ]
  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" ]
}

generate_dbus_proxies("minios_proxies") {
  sources = [ "dbus_adaptors/org.chromium.MiniOsInterface.xml" ]
  dbus_service_config = "dbus_adaptors/dbus-service-config.json"
  mock_output_file = "include/minios/client/dbus-proxy-mocks.h"
  proxy_output_file = "include/minios/client/dbus-proxies.h"
  proxy_path_in_mocks = "minios/client/dbus-proxies.h"
}

pkg_config("target_defaults") {
  pkg_deps = [
    "libbrillo",
    "libchrome",
    "libmetrics",
    "libshill-client",
    "libupdate_engine-client",
    "protobuf-lite",
    "system_api",
    "vboot_host",
    "xkbcommon",
  ]
  defines = [ "ARCH_" + getenv("ARCH") ]
}

static_library("libminios") {
  sources = [
    "daemon.cc",
    "dbus_adaptors/dbus_adaptor.cc",
    "disk_util.cc",
    "draw_utils.cc",
    "error.cc",
    "key_reader.cc",
    "logger.cc",
    "metrics_reporter.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" ]
}

executable("minios_client") {
  sources = [ "client/minios_client.cc" ]
  configs += [ ":target_defaults" ]
  deps = [ ":minios_proxies" ]
}

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_debug_options_test.cc",
      "screens/screen_download_test.cc",
      "screens/screen_error_test.cc",
      "screens/screen_log_test.cc",
      "screens/screen_network_test.cc",
      "screens/screen_permission_test.cc",
      "screens/screen_welcome_test.cc",
      "utils_test.cc",
    ]
    configs += [
      "//common-mk:test",
      ":test_config",
      ":target_defaults",
    ]
    deps = [
      ":libminios",
      "//common-mk/testrunner:testrunner",
    ]
  }
}
