# Copyright 2017 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.

# Defines a group of SDK elements.
#
# Parameters
#
#   category (optional)
#     Describes the minimum category that atoms in this molecule must have.
#     See //build/sdk/sdk_atom.gni for possible values.
#
#   deps (optional)
#     List of GN labels referencing the elements of this group.
#     These labels must point to "sdk_atom" or "sdk_molecule" targets.
#
#   non_sdk_deps (optional)
#     List of GN labels which this target needs built.
#
#   metadata (optional)
#     List of scopes describing the metadata to attach to this molecule.
#     Each scope must have two attributes: a "key" and a "value". Keys are
#     string; values cannot be arrays or scopes.

template("sdk_molecule") {
  gn_deps = []
  if (defined(invoker.non_sdk_deps)) {
    gn_deps = invoker.non_sdk_deps
  }

  dep_manifests = []
  if (defined(invoker.deps)) {
    gn_deps += invoker.deps
    foreach(dep, invoker.deps) {
      gen_dir = get_label_info(dep, "target_gen_dir")
      name = get_label_info(dep, "name")
      dep_manifests += [ rebase_path("$gen_dir/$name.sdk") ]
    }
  }

  metadata = []
  if (defined(invoker.metadata)) {
    foreach(meta, invoker.metadata) {
      metadata += [
        "--metadata",
        "${meta.key}=${meta.value}",
      ]
    }
  }

  # Builds a manifest representing members of the group.
  action(target_name) {
    forward_variables_from(invoker, [ "assert_no_deps", "testonly" ])

    manifest = "$target_gen_dir/$target_name.sdk"

    script = "//build/sdk/create_molecule_manifest.py"

    deps = gn_deps

    inputs = dep_manifests + [
               # Imported by the action's script.
               "//build/sdk/sdk_common.py",
             ]

    outputs = [
      manifest,
    ]

    args = [
             "--out",
             rebase_path(manifest),
             "--deps",
           ] + dep_manifests + metadata

    if (defined(invoker.category)) {
      args += [
        "--category",
        invoker.category,
      ]
    }
  }
}
