# Copyright 2021 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/json/validate_json.gni")

# Defines an SDK element.
#
# Direct instantiation of `sdk_element` is not supported. Element authors should
# use specialized templates, e.g. `host_tool_sdk_element`, instead.
#
# Outputs
#
#   $target_gen_dir/${target_name}_packaging_manifest.json
#     A manifest describing which files are included in the element.
#
#   $target_gen_dir/${target_name}_sdk_metadata.json
#     A metadata file describing the element.
#     * This file is included in the final SDK and may be used by tools that
#       interact with the SDK.
#
# Parameters
#
#   type (required)
#     Type of the element. For example, "host_tool".
#     * Supported types are listed in //build/sdk/meta.
#
#   schema_version (required)
#     Version of the schema for this element type.
#     * Metadata schema files are hosted under //build/sdk/meta and have
#       filenames of the form "{type}-{version}.json".
#
#   meta (required)
#     Scope describing the element's metadata file.
#     * This parameter's contents are determined by the schema defined by `type`
#       and `schema_version`.
#
#   files (required)
#     List of scopes describing the contents of this element.
#     * A file scope has the following attributes:
#       src (required)
#         Path to the original file.
#         Must be the absolute GN path, beginning with "//".
#       dst (required)
#         Destination path of the file relative to the element root.
#
#   api (optional) [TODO(b/204903307): implement the api parameter]
#     Path to the file representing the API canonically exposed by this element.
#     * If this attribute is set, "files" or "api_contents" must be set as well.
#     * An API file is a JSON file containing a map of file paths to canonical
#       MD5 hashes. The file paths correspond to the `dst` field of a file scope
#       (see "files" above).
#     * This file is used to ensure modifications to the API are explicitly
#       acknowledged.
#     * Changes to the API contents are approximated by comparing the MD5 hashes
#       of the API contents to the ones listed in the API file.
#
#   api_contents (optional)
#     List of scopes representing the files making up the element's API.
#     * Ignored if `api` is not set.
#     * By default, this parameter will be equal to the `files` parameter.
#     * Set `api_contents` explicitly if the element's API surface is describe
#       by only a subset of its files. For example, a C++ library may contain
#       header and source files, but its API consists of header files only.
#     * See the "files" section above for the definition of a file scope.
#
#   sdk_deps (optional)
#     List of GN labels for other SDK elements this element depends on at build
#     time.
#
#   sdk_soft_deps (optional)
#     List of GN labels for other SDK elements this element may depend on to be
#     useful to SDK users, but that are not build dependencies. For example, a
#     FIDL library may have a soft dependency on fidlc.
#
#   non_sdk_deps (optional)
#     List of GN labels which this target needs built, but are not SDK elements.
template("sdk_element") {
  assert(defined(invoker.files) && invoker.files != [],
         "Must define files with at least one file")
  files = invoker.files
  foreach(file, files) {
    assert(defined(file.src), "File $file does not specify a source.")
    assert(defined(file.dst), "File $file does not specify a destination.")
  }

  assert(defined(invoker.type), "Must define element type")
  type = invoker.type

  assert(defined(invoker.schema_version), "Must define schema version")
  schema_version = invoker.schema_version

  assert(defined(invoker.meta), "Must define meta")
  meta_content = invoker.meta

  gn_deps = []
  if (defined(invoker.non_sdk_deps)) {
    gn_deps += invoker.non_sdk_deps
  }
  if (defined(invoker.sdk_deps)) {
    gn_deps += invoker.sdk_deps
  }
  if (defined(invoker.sdk_soft_deps)) {
    gn_deps += invoker.sdk_soft_deps
  }

  # The manifest file contains the file mappings needed to package the element.
  manifest_target_name = "${target_name}_packaging_manifest"
  manifest_file = "${target_gen_dir}/${manifest_target_name}.json"
  generated_file(manifest_target_name) {
    forward_variables_from(invoker, [ "testonly" ])
    visibility = [ ":*" ]
    outputs = [ manifest_file ]
    contents = files
    output_conversion = "json"
  }

  # The meta file contains the metadata describing the element, according to the
  # type-specific schema (see //build/sdk/meta).
  meta_target_name = "${target_name}_sdk_metadata"
  meta_file = "${target_gen_dir}/${meta_target_name}.json"
  generated_file(meta_target_name) {
    forward_variables_from(invoker, [ "testonly" ])
    visibility = [ ":*" ]
    outputs = [ meta_file ]
    contents = meta_content
    output_conversion = "json"
  }

  validate_target_name = "validate_${meta_target_name}"
  validate_json(validate_target_name) {
    forward_variables_from(invoker, [ "testonly" ])
    visibility = [ ":*" ]
    data = meta_file
    schema = "//build/sdk/meta/${type}-${schema_version}.json"
    sources = [ "//sdk/schema/common-00000000.json" ]
    public_deps = [ ":${meta_target_name}" ]
  }

  # TODO(b/204903307): .api generation/validation

  group(target_name) {
    forward_variables_from(invoker,
                           [
                             "testonly",
                             "visibility",
                           ])
    public_deps = [
                    ":${manifest_target_name}",
                    ":${validate_target_name}",
                  ] + gn_deps
  }
}
