# Copyright 2020 The Fuchsia 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("//build/components.gni")
import("//tools/cmc/build/cmc.gni")

template("_weavestack_package") {
  invoker_manifest = invoker.manifest
  cmx_name = get_path_info(invoker_manifest, "name")
  if (defined(invoker.extra_cmx)) {
    manifest_merge_target = "${target_name}_${cmx_name}_merge"
    cmc_merge(manifest_merge_target) {
      sources = [ invoker_manifest ] + invoker.extra_cmx
      output_name = "$manifest_merge_target.cmx"
    }
    invoker_manifest = get_target_outputs(":$manifest_merge_target")
    invoker_manifest = invoker_manifest[0]
  }

  component_target = "${target_name}_${cmx_name}_component"
  fuchsia_component(component_target) {
    forward_variables_from(invoker, [ "testonly" ])
    component_name = cmx_name
    manifest = invoker_manifest
    visibility = [ ":*" ]

    if (!defined(deps)) {
      deps = []
    }
    deps += [
      "//src/connectivity/weave/weavestack:bin",
      "//src/connectivity/weave/weavestack:default_environment_schema",
    ]
    if (defined(manifest_merge_target)) {
      deps += [ ":$manifest_merge_target" ]
    }
  }

  fuchsia_package(target_name) {
    forward_variables_from(invoker,
                           [
                             "applets",
                             "package_name",
                             "testonly",
                             "visibility",
                           ])
    deps = [ ":$component_target" ]

    if (defined(applets)) {
      deps += [ applets.target ]
    }
  }
}

# Creates a 'weavestack' package. All packages created with this template will be identical, except
# for the addition of selected applet modules.
#
# Example:
# ```
#   weavestack_package("foo_weave") {
#     package_name = "weave_package"
#     applets = {
#       target = "//path/to/applets/module"
#       name = "module_name.so"
#     }
#     extra_cmx = [
#       "meta/manifest.cmx",
#     ]
#   }
# ```
#
# Parameters
#     applets (optional)
#       A scope defining a loadable module that implements weave applets.
#       Type: scope with the entries:
#
#         target (required)
#           The GN `loadable_module` target that builds the applets module.
#           Type: path
#
#         name (required)
#           The name of the loadable module.
#           Type: string
#
#     package_name (optional)
#       The name of the weavestack package. Defaults to 'target_name'.
#       Type: string
#       Default: ${target_name}
#
#     extra_cmx (optional)
#       Additional CMX manifests that will be merged with the base weavestack.cmx manifest.
#       This can be used to add additional services or features that may be needed by different
#       weave applets.
#       Type: list(path)
template("weavestack_package") {
  _weavestack_package(target_name) {
    forward_variables_from(invoker,
                           [
                             "applets",
                             "extra_cmx",
                             "package_name",
                           ])
    manifest = "//src/connectivity/weave/meta/weavestack.cmx"
  }
}
