# 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

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}_compile.cm"

    cm(compile_target) {
      manifest = source
      output_name = "$name.cm"
    }

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

  resource(target_name) {
    sources = compile_outputs
    outputs = [ "meta/{{source_file_part}}" ]
    deps = compile_deps
  }
}
