# Copyright 2019 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 an alias for an SDK atom or molecule.
#
# Parameters
#
#   target
#     The label of the aliased element.
#
#   type
#     The type of the target, either "atom" or "molecule".
#
#   non_sdk_deps (optional)
#     List of GN labels which this target needs built.

template("sdk_alias") {
  assert(defined(invoker.target), "Must define a target to alias")
  assert(defined(invoker.type), "Must define a target type")
  assert(invoker.type == "atom" || invoker.type == "molecule", "Unknown type")

  is_atom = invoker.type == "atom"

  # This template simply copies the output files of the sdk_* templates to the
  # correct location.

  sdk_target_gen_dir = get_label_info(invoker.target, "target_gen_dir")
  sdk_target_name = get_label_info(invoker.target, "name")
  meta_json_name = "$target_name.meta.json"
  manifest_name = "$target_name.sdk"

  group_deps = []

  if (is_atom) {
    copy_meta_target_name = "${target_name}_copy_meta"
    group_deps += [ ":$copy_meta_target_name" ]
    copy(copy_meta_target_name) {
      forward_variables_from(invoker, [ "testonly" ])

      sources = [ "$sdk_target_gen_dir/$sdk_target_name.meta.json" ]

      outputs = [ "$target_gen_dir/$meta_json_name" ]

      deps = [ invoker.target ]
    }
  }

  copy_manifest_target_name = "${target_name}_copy_manifest"
  group_deps += [ ":$copy_manifest_target_name" ]
  copy(copy_manifest_target_name) {
    forward_variables_from(invoker, [ "testonly" ])

    sources = [ "$sdk_target_gen_dir/$sdk_target_name.sdk" ]

    outputs = [ "$target_gen_dir/$manifest_name" ]

    deps = [ invoker.target ]
  }

  group(target_name) {
    forward_variables_from(invoker, [ "testonly" ])

    public_deps = group_deps

    if (defined(invoker.non_sdk_deps)) {
      public_deps += invoker.non_sdk_deps
    }
  }
}
