# 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("distribution_manifest.gni")

# Generates a manifest in the FINI (Fuchsia INI) format.
#
# This format maps a source file to its destination in a container with the
# following line:
# ```
# target=source
# ```
#
# The output of this template is a manifest file that lists all packageable
# elements encountered within `deps`.
#
# Parameters
#
#   deps (optional)
#     [list of labels] The targets to generate a manifest for.
#     See `gn help` for more details.
#
#   data_deps, testonly, visibility, metadata (optional)
#     See `gn help`.
#
#   outputs (optional)
#     Singleton list containing the path to the manifest file.
#     Defaults to `[ "$target_gen_dir/$target_name.fini" ]`.
template("fini_manifest") {
  main_target = target_name
  generate_target = "${target_name}_dist"

  # Build the name of the output files.
  if (defined(invoker.outputs)) {
    _outputs = invoker.outputs
    assert(_outputs == [ _outputs[0] ],
           "Output list must have exactly one element.")
    manifest_file = _outputs[0]
  } else {
    manifest_file = "$target_gen_dir/$target_name.fini"
  }
  intermediate_file = "$manifest_file.dist"

  # Get a JSON manifest of all runtime objects.
  distribution_manifest(generate_target) {
    forward_variables_from(invoker,
                           [
                             "data_deps",
                             "deps",

                             # Metadata needs to be added on this target so that
                             # any barrier it defines is properly reflected in
                             # the target's deps.
                             "metadata",
                             "testonly",
                           ])

    visibility = [ ":$main_target" ]

    outputs = [ intermediate_file ]
  }

  # Generate a manifest file with the FINI format.
  action(main_target) {
    forward_variables_from(invoker,
                           [
                             "testonly",
                             "visibility",
                           ])

    script = "//build/dist/convert_manifest_to_fini.py"

    inputs = [ intermediate_file ]
    outputs = [ manifest_file ]

    args = [
      "--input",
      rebase_path(intermediate_file, root_build_dir),
      "--output",
      rebase_path(manifest_file, root_build_dir),
    ]

    deps = [ ":$generate_target" ]
  }
}
