# 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
#
#    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",
                               "data_deps",
                               "testonly",
                             ])
      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
  }
}
