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

import("//tools/cmc/build/cml.gni")
import("resource.gni")

# Prepares some component manifest files for inclusion in a ZBI.
#
# Parameters
#
#   sources
#     Required: List of paths to .cml meta files
#
#   required_offers (optional)
#     A list of protocols that must be offered to every child and collection declared
#     in the CML file.
#     Type: list of strings
#     Default: []
#
#   required_uses (optional)
#     A list of protocols that must be used by every child and collection declared
#     in the CML file.
#     Type: list of strings
#     Default: []
#
#   restricted_features (optional)
#     The set of restricted CML features to allow. Only applicable to v2 components.
#     The set of features is allowlisted here: //tools/cmc/build/restricted_features/BUILD.gn
#     where each feature name is represented by a group of the same name.
#     Type: list of strings
#     Default: []
#
#    deps
#    testonly
#    visibility
template("component_manifest_resources") {
  assert(defined(invoker.sources), "Must set some sources")

  compile_deps = []
  compile_outputs = []

  foreach(source, invoker.sources) {
    extension = get_path_info(source, "extension")
    assert(extension == "cml", "Only .cml files are supported: $source")

    name = get_path_info(source, "name")
    compile_target = "${name}.cm"

    cm(compile_target) {
      forward_variables_from(invoker,
                             [
                               "deps",
                               "public_deps",
                               "required_offers",
                               "required_uses",
                               "restricted_features",
                               "data_deps",
                               "testonly",
                             ])

      # NOTE: must be kept in sync with path in fuchsia_structured_config.gni
      config_values_package_path = "meta/${name}.cvf"
      manifest = source
      output_name = "$name.cm"
      visibility = [ ":*" ]
    }

    compile_deps += [ ":$compile_target" ]
    compile_outputs += get_target_outputs(":$compile_target")
  }

  resource(target_name) {
    forward_variables_from(invoker,
                           [
                             "testonly",
                             "visibility",
                           ])
    sources = compile_outputs
    outputs = [ "meta/{{source_file_part}}" ]
    deps = compile_deps
  }
}
