# Copyright 2019 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")

group("host") {
  deps = [
    ":cicerone_client",
    ":concierge_client",
    ":maitred_client",
    ":seneschal",
    ":seneschal_client",
    ":vm_cicerone",
    ":vm_concierge",
    ":vmlog_forwarder",
    ":vsh",
    "//vm_tools:vshd",
  ]
  if (use.test) {
    deps += [
      ":cicerone_test",
      ":concierge_test",
      ":syslog_forwarder_test",
    ]
  }
  if (use.fuzzer) {
    deps += [
      ":cicerone_container_listener_fuzzer",
      ":vsh_client_fuzzer",
    ]
  }
}

pkg_config("host_target_defaults_pkgs") {
  pkg_deps = [
    "libbrillo",
    "libchrome-${libbase_ver}",
    "libpatchpanel-client",
  ]
}

config("host_target_defaults") {
  configs = [ ":host_target_defaults_pkgs" ]
  defines = [
    "USE_CROSVM_WL_DMABUF=${use.crosvm_wl_dmabuf}",
    "USE_PMEM_DEVICE_FOR_ROOTFS=${use.amd64}",
  ]
}

executable("maitred_client") {
  sources = [ "../maitred/client.cc" ]
  configs += [ ":host_target_defaults" ]
  libs = [ "grpc" ]
  pkg_deps = [
    "grpc++",
    "protobuf",
    "vm_protos",
  ]
}

static_library("libforwarder") {
  sources = [
    "../syslog/forwarder.cc",
    "../syslog/rotator.cc",
    "../syslog/scrubber.cc",
  ]
  configs += [ ":host_target_defaults" ]
  all_dependent_pkg_deps = [
    "grpc++",
    "protobuf",
    "vm_protos",
  ]
}

executable("vmlog_forwarder") {
  sources = [ "../syslog/host_server.cc" ]
  configs += [ ":host_target_defaults" ]
  deps = [ ":libforwarder" ]
}

static_library("libvsh-client") {
  sources = [
    "../vsh/scoped_termios.cc",
    "../vsh/vsh_client.cc",
  ]
  configs += [ ":host_target_defaults" ]
  pkg_deps = [
    "system_api",
    "vm_protos",
  ]
  deps = [ "//vm_tools:libvsh" ]
  all_dependent_pkg_deps = [ "vm_protos" ]
  if (use.fuzzer) {
    all_dependent_pkg_deps += [ "protobuf" ]
  } else {
    all_dependent_pkg_deps += [ "protobuf-lite" ]
  }
}

executable("vsh") {
  sources = [ "../vsh/vsh.cc" ]
  configs += [ ":host_target_defaults" ]
  pkg_deps = [
    "system_api",
    "vm_protos",
  ]
  deps = [ ":libvsh-client" ]
}

static_library("libconcierge") {
  sources = [
    "../concierge/arc_vm.cc",
    "../concierge/disk_image.cc",
    "../concierge/plugin_vm.cc",
    "../concierge/plugin_vm_helper.cc",
    "../concierge/power_manager_client.cc",
    "../concierge/seneschal_server_proxy.cc",
    "../concierge/service.cc",
    "../concierge/service_arc.cc",
    "../concierge/service_plugin.cc",
    "../concierge/shared_data.cc",
    "../concierge/shill_client.cc",
    "../concierge/ssh_keys.cc",
    "../concierge/startup_listener_impl.cc",
    "../concierge/tap_device_builder.cc",
    "../concierge/termina_vm.cc",
    "../concierge/untrusted_vm_utils.cc",
    "../concierge/vm_base_impl.cc",
    "../concierge/vm_permission_interface.cc",
    "../concierge/vm_util.cc",
    "../concierge/vmplugin_dispatcher_interface.cc",
    "../concierge/vsock_cid_pool.cc",
  ]
  configs += [ ":host_target_defaults" ]
  libs = [ "grpc" ]
  all_dependent_pkg_deps = [
    "grpc++",
    "libarchive",
    "libminijail",
    "libqcow_utils",
    "libshill-client",
    "protobuf",
    "system_api",
    "vboot_host",
    "vm_protos",
  ]

  # TODO(crbug.com/1082873): Remove after fixing usage of deprecated
  # declarations.
  cflags_cc = [ "-Wno-error=deprecated-declarations" ]
}

executable("vm_concierge") {
  sources = [ "../concierge/main.cc" ]
  configs += [ ":host_target_defaults" ]
  deps = [ ":libconcierge" ]
}

executable("concierge_client") {
  sources = [ "../concierge/client.cc" ]
  configs += [ ":host_target_defaults" ]
  pkg_deps = [
    "libqcow_utils",
    "protobuf",
    "system_api",
    "vboot_host",
  ]
}

static_library("libcicerone") {
  sources = [
    "../cicerone/container.cc",
    "../cicerone/container_listener_impl.cc",
    "../cicerone/crash_listener_impl.cc",
    "../cicerone/service.cc",
    "../cicerone/shill_client.cc",
    "../cicerone/tremplin_listener_impl.cc",
    "../cicerone/virtual_machine.cc",
  ]
  configs += [ ":host_target_defaults" ]
  libs = [ "grpc" ]
  all_dependent_pkg_deps = [
    "grpc++",
    "libmetrics-${libbase_ver}",
    "libshill-client",
    "protobuf",
    "system_api",
    "vm_protos",
  ]
}

executable("vm_cicerone") {
  sources = [ "../cicerone/main.cc" ]
  configs += [ ":host_target_defaults" ]
  deps = [ ":libcicerone" ]
}

executable("cicerone_client") {
  sources = [ "../cicerone/client.cc" ]
  configs += [ ":host_target_defaults" ]
  pkg_deps = [
    "protobuf",
    "system_api",
  ]

  # TODO(crbug.com/1082873): Remove after fixing usage of deprecated
  # declarations.
  cflags_cc = [ "-Wno-error=deprecated-declarations" ]
}

static_library("libseneschal") {
  sources = [ "../seneschal/service.cc" ]
  configs += [ ":host_target_defaults" ]
  all_dependent_pkg_deps = [
    "libminijail",
    "protobuf",
    "system_api",
  ]
}

executable("seneschal") {
  sources = [ "../seneschal/main.cc" ]
  configs += [ ":host_target_defaults" ]
  deps = [ ":libseneschal" ]
}

executable("seneschal_client") {
  sources = [ "../seneschal/client.cc" ]
  configs += [ ":host_target_defaults" ]
  pkg_deps = [
    "protobuf",
    "system_api",
  ]
}

if (use.test || use.fuzzer) {
  static_library("service_testing_helper_lib") {
    sources = [
      "../cicerone/dbus_message_testing_helper.cc",
      "../cicerone/dbus_message_testing_helper.h",
      "../cicerone/mock_tremplin_stub.h",
      "../cicerone/service_testing_helper.cc",
      "../cicerone/service_testing_helper.h",
    ]
    configs += [ ":host_target_defaults" ]
    all_dependent_pkg_deps = [ "libchrome-test-${libbase_ver}" ]
    deps = [ ":libcicerone" ]
  }
}

if (use.test) {
  executable("syslog_forwarder_test") {
    sources = [
      "../syslog/forwarder_test.cc",
      "../syslog/rotator_test.cc",
      "../syslog/scrubber_test.cc",
    ]
    configs += [
      "//common-mk:test",
      ":host_target_defaults",
    ]
    deps = [
      ":libforwarder",
      "//common-mk/testrunner:testrunner",
    ]
  }

  executable("cicerone_test") {
    sources = [
      "../cicerone/container_listener_impl_test.cc",
      "../cicerone/tremplin_listener_impl_test.cc",
      "../cicerone/virtual_machine_test.cc",
    ]
    configs += [
      "//common-mk:test",
      ":host_target_defaults",
    ]
    deps = [
      ":libcicerone",
      ":service_testing_helper_lib",
      "//common-mk/testrunner:testrunner",
    ]
  }

  executable("concierge_test") {
    sources = [
      "../concierge/future_test.cc",
      "../concierge/power_manager_client_test.cc",
      "../concierge/termina_vm_test.cc",
      "../concierge/untrusted_vm_utils_test.cc",
      "../concierge/vm_util_test.cc",
    ]
    configs += [
      "//common-mk:test",
      ":host_target_defaults",
    ]
    pkg_deps = [ "libchrome-test-${libbase_ver}" ]
    deps = [
      ":libconcierge",
      "//common-mk/testrunner:testrunner",
    ]
  }
}

if (use.fuzzer) {
  pkg_config("vm_host_tools_fuzzer_pkg_deps") {
    pkg_deps = [
      "libprotobuf-mutator",
      "protobuf",
      "vm_protos",
    ]
  }
  executable("cicerone_container_listener_fuzzer") {
    sources = [ "../cicerone/container_listener_impl_fuzzer.cc" ]

    # //common-mk:test should be on the top.
    # TODO(crbug.com/887845): Remove this comment after library ordering issue is fixed.
    configs += [
      "//common-mk:test",
      "//common-mk/common_fuzzer:common_fuzzer",
      ":vm_host_tools_fuzzer_pkg_deps",
    ]
    pkg_deps = [
      "grpc++",
      "libchrome-test-${libbase_ver}",  # For FuzzedDataProvider
    ]
    deps = [
      ":libcicerone",
      ":service_testing_helper_lib",
    ]
  }

  executable("vsh_client_fuzzer") {
    sources = [ "../vsh/vsh_client_fuzzer.cc" ]
    configs += [
      "//common-mk/common_fuzzer",
      ":host_target_defaults",
      ":vm_host_tools_fuzzer_pkg_deps",
    ]
    deps = [ ":libvsh-client" ]
  }
}
