# Copyright 2021 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 = [
    ":featured",
    ":libfeatures",
    ":libfeatures_c",
  ]
  if (use.test) {
    deps += [
      ":c_feature_check_example",
      ":cpp_feature_check_example",
      ":feature_library_test",
    ]
  }
  if (use.fuzzer) {
    deps += [ ":featured_json_feature_parser_fuzzer" ]
  }
}

pkg_config("target_defaults") {
  pkg_deps = [
    "dbus-1",
    "libbrillo",
    "libchrome",
  ]
}

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

static_library("libfeatured") {
  sources = [ "service.cc" ]
  configs += [ ":target_defaults" ]
  deps = [
    ":featured-adaptors",
    ":libfeatures",
  ]
}

executable("featured") {
  sources = [ "main.cc" ]
  configs += [ ":target_defaults" ]
  deps = [
    ":featured-adaptors",
    ":libfeatured",
  ]
}

shared_library("libfeatures") {
  sources = [ "feature_library.cc" ]
  configs += [ ":target_defaults" ]
}

shared_library("libfeatures_c") {
  sources = [ "c_feature_library.cc" ]
  configs += [ ":target_defaults" ]
  deps = [ ":libfeatures" ]
}

if (use.test) {
  pkg_config("test_helper_config") {
    pkg_deps = [
      "libbrillo",
      "libbrillo-test",
      "libchrome",
      "libchrome-test",
    ]
  }

  executable("feature_library_test") {
    sources = [ "feature_library_test.cc" ]
    configs += [
      "//common-mk:test",
      ":test_helper_config",
    ]
    deps = [
      ":libfeatured",
      ":libfeatures",
      "//common-mk/testrunner:testrunner",
    ]
  }

  executable("c_feature_check_example") {
    sources = [ "c_feature_check_example.c" ]
    deps = [ ":libfeatures_c" ]
  }
  executable("cpp_feature_check_example") {
    sources = [ "cpp_feature_check_example.cc" ]
    configs += [ ":test_helper_config" ]
    deps = [ ":libfeatures" ]
  }
}

if (use.fuzzer) {
  executable("featured_json_feature_parser_fuzzer") {
    sources = [ "json_feature_parser_fuzzer.cc" ]
    configs += [
      "//common-mk/common_fuzzer",
      ":target_defaults",
    ]
    deps = [ ":libfeatured" ]
  }
}
