# 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")

  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/$target_name.meta.json" ]

      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/$target_name.sdk" ]

    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
    }
  }
}
