# Copyright 2019 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/config/fuchsia/zircon.gni")

# The `gn gen` stage of the Zircon GN build writes this file.
# It's a list of {name=... path=... type=...} scopes.
zircon_images = read_file("$zircon_root_build_dir/legacy_images.json", "json")

foreach(image, zircon_images) {
  if (image.name == "kernel" && image.type == "zbi" &&
      image.cpu == target_cpu) {
    zircon_kernel_zbi = "$zircon_root_build_dir/${image.path}"
  }
}

# Produce a manifest of binaries from the Zircon build.
#
# This is meant to be used with a package() target that does:
#   deps = [ this_target ]
#   extras = get_target_outputs(this_target)
#
# Parameters
#
#   manifest
#     - Required: Which Zircon manifest to draw from.
#     - Type: "image" or "tests"
#
#   patterns
#     - Required: List of filename patterns to match in the manifest.
#     These are shell filename patterns that match the whole target path
#     with no leading slash: "bin/foo" or "bin/*" or "*" all match "bin/foo".
#     - Type: list(string)
#
template("zircon_extras_manifest") {
  assert(defined(invoker.manifest), "Parameter 'manifest' is required")
  assert(invoker.manifest == "image" || invoker.manifest == "tests",
         "Parameter 'manifest' can only be 'image' or 'tests'")

  manifest_deps = [ "//build/unification/images:migrated-${invoker.manifest}" ]
  if (invoker.manifest == "tests") {
    manifest_deps += [
      "//build/unification/images:legacy-${invoker.manifest}",
    ]
  }
  manifest_sources = []
  foreach(dep, manifest_deps) {
    out_dir = get_label_info(dep, "target_out_dir")
    name = get_label_info(dep, "name")
    manifest_sources += [ "$out_dir/$name.unification.manifest" ]
  }

  action(target_name) {
    forward_variables_from(invoker,
                           [
                             "visibility",
                             "testonly",
                           ])
    sources = manifest_sources
    deps = manifest_deps
    outputs = [
      "$target_gen_dir/$target_name.manifest",
    ]
    script = "//build/images/manifest.py"
    args = [ "--output=" + rebase_path(outputs[0], root_build_dir) ]
    foreach(pattern, invoker.patterns) {
      args += [ "--include=$pattern" ]
    }
    foreach(manifest, sources) {
      args += [
        "--cwd=.",
        "--manifest=" + rebase_path(manifest, root_build_dir),
      ]
    }
  }
}
