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

# An empty SDK atom.
#
# Should be used in very specific situations where SDK elements are injected in
# SDKs in a way that's not reflected in the build graph. This allows SDK-related
# templates to handle such a target as any other SDK target.
#
# Parameters
#   id (optional)
#     Identifier of this element within SDKs. Used for API verification.
#     See //build/sdk/sdk_atom.gni for information regarding id.
#     If this attribute is set, "category" and "type" must be set as well.
#     Type: string
#
#   category (optional)
#     Describes the availability of the element.
#     See //build/sdk/sdk_atom.gni for information regarding category.
#     If this attribute is set, "id" and "type" must be set as well.
#     Type: string
#
#   type (optional)
#     Describes the type of the element.
#     If this attribute is set, "id" and "category" must be set as well.
#     Type: string
#
template("sdk_noop_atom") {
  meta_target_name = "${target_name}_meta"
  meta_file = "${target_gen_dir}/${target_name}.meta.json"
  generated_file(meta_target_name) {
    contents = {
    }
    outputs = [ meta_file ]
    output_conversion = "json"
  }

  manifest_file = "${target_gen_dir}/${target_name}.sdk"

  # If id, category and type are set, the SDK contents will be API verified by
  # checking that all elements are still in the SDK.
  if (defined(invoker.id) || defined(invoker.category) ||
      defined(invoker.type)) {
    assert(defined(invoker.id), "Must define id for API verification.")
    assert(defined(invoker.category),
           "Must define category for API verification.")
    assert(defined(invoker.type), "Must define type for API verification.")

    action(target_name) {
      depfile = "${manifest_file}.d"
      script = "//build/sdk/create_atom_manifest.py"

      public_deps = [ ":${meta_target_name}" ]

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

      args = [
        "--id",
        invoker.id,
        "--out",
        rebase_path(manifest_file, root_build_dir),
        "--depfile",
        rebase_path(depfile, root_build_dir),
        "--gn-label",
        get_label_info(":${target_name}", "label_with_toolchain"),
        "--category",
        invoker.category,
        "--type",
        invoker.type,
        "--noop-atom",
      ]
    }
  } else {
    generated_file(target_name) {
      contents = {
        atoms = []
        ids = []
      }
      outputs = [ manifest_file ]
      output_conversion = "json"
      public_deps = [ ":${meta_target_name}" ]
    }
  }
  not_needed(invoker, "*")
}
