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

group("all") {
  deps = [ ":modemfwd" ]
  if (use.test) {
    deps += [ ":modemfw_test" ]
  }
  if (use.fuzzer) {
    deps += [
      ":firmware_manifest_fuzzer",
      ":firmware_manifest_v2_fuzzer",
    ]
  }
}

pkg_config("target_defaults") {
  # NOSORT
  pkg_deps = [
    "libchrome",
    "libbrillo",
    "libcros_config",
    "libshill-client",
    "liblzma",
    "ModemManager",

    # system_api depends on protobuf. It must appear before protobuf
    # here or the linker flags won't be in the right order.
    "system_api",
    "protobuf",
  ]
}

generate_dbus_proxies("modemmanager_proxies") {
  modemmanager_in_dir = "${sysroot}/usr/share/dbus-1/interfaces/"
  proxy_output_file = "include/modemmanager/dbus-proxies.h"
  sources = [
    "${modemmanager_in_dir}/org.freedesktop.ModemManager1.Modem.xml",
    "${modemmanager_in_dir}/org.freedesktop.ModemManager1.xml",
  ]
}

generate_dbus_adaptors("modemfwd_adaptors") {
  dbus_service_config = "dbus_bindings/dbus-service-config.json"
  dbus_adaptors_out_dir = "include/modemfwd/dbus_adaptors"
  sources = [ "dbus_bindings/org.chromium.Modemfwd.xml" ]
}

static_library("libmodemfw") {
  sources = [
    "file_decompressor.cc",
    "firmware_directory.cc",
    "firmware_file.cc",
    "firmware_manifest.cc",
    "firmware_manifest_v2.cc",
    "journal.cc",
    "logging.cc",
    "modem.cc",
    "modem_flasher.cc",
    "modem_helper.cc",
    "modem_helper_directory.cc",
    "modem_tracker.cc",
    "scoped_temp_file.cc",
  ]
  configs += [ ":target_defaults" ]
  deps = [
    ":modemmanager_proxies",
    "//modemfwd//proto:modemfw-protos",
  ]
}

executable("modemfwd") {
  sources = [
    "daemon.cc",
    "main.cc",
  ]
  configs += [ ":target_defaults" ]
  deps = [
    ":libmodemfw",
    ":modemfwd_adaptors",
  ]
}

if (use.test) {
  executable("modemfw_test") {
    sources = [
      "file_decompressor_test.cc",
      "firmware_directory_stub.cc",
      "firmware_directory_test.cc",
      "firmware_file_test.cc",
      "journal_test.cc",
      "modem_flasher_test.cc",
    ]
    configs += [
      ":target_defaults",
      "//common-mk:test",
    ]
    pkg_deps = [ "libchrome-test" ]
    deps = [
      ":libmodemfw",
      "//common-mk/testrunner:testrunner",
    ]
  }
}

if (use.fuzzer) {
  executable("firmware_manifest_fuzzer") {
    sources = [ "firmware_manifest_fuzzer.cc" ]
    configs += [
      "//common-mk/common_fuzzer",
      ":target_defaults",
    ]
    pkg_deps = [ "libprotobuf-mutator" ]
    deps = [ ":libmodemfw" ]
  }
  executable("firmware_manifest_v2_fuzzer") {
    sources = [ "firmware_manifest_v2_fuzzer.cc" ]
    configs += [
      "//common-mk/common_fuzzer",
      ":target_defaults",
    ]
    pkg_deps = [ "libprotobuf-mutator" ]
    deps = [ ":libmodemfw" ]
  }
}
