# 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("//build/config.gni")

# Define a component ID index which maps monikers (component URL + realm path)
# to component instance IDs.  appmgr uses this index to key a component's
# storage directory to its instance ID.
#
# There may be multiple component_id_index()s in the build, which are merged
# into a single index in the build and delivered to appmgr using
# config_data(for=appmgr).
#
# See //docs/development/components/component_id_index.md for more details on
# how to define a component ID index.
#
# Parameters
#
#   source (required)
#     [string] This is a relative path to index file.
#
#   visibility (optional)
#   testonly (optional)
#     Usual GN meanings.
template("component_id_index") {
  group(target_name) {
    forward_variables_from(invoker,
                           [
                             "visibility",
                             "testonly",
                           ])

    assert(defined(invoker.source), "source must be specified.")
    metadata = {
      component_id_index = [ rebase_path(invoker.source, root_build_dir) ]
    }
  }
}

# Collect and merge component ID indices supplied from component_id_index()s.
#
# This template results in a resource() which contains a FIDL-wireformat encoded
# index supplied through a resource(). A "-config-data" suffixed sub-target
# contains a JSON-encoded index supplied through config_data().
#
# A target defined from this template must take a (transitive) dependency on
# targets defined from the component_id_index() template.
#
# For more details on how to include this target in a system assembly, see:
# //docs/development/components/component_id_index.md
#
# Parameters
#
#   deps (optional)
#     A list of deps to traverse to collect component_id_index()s.
#     //build/images:universe_packages is a good candidate to include as a dep.
#
#   public_deps (optional)
#   testonly (optional)
#     Usual GN meanings.
template("component_id_index_config") {
  # Step 1:  Collect a list of index file paths into intermediary file
  # `component_id_index_merge_input_manifest`.
  component_id_index_input_manifest_path =
      "${target_gen_dir}/${target_name}_merge_input_manifest"
  component_id_index_merged_inputs = "${target_name}_merged_inputs"
  generated_file(component_id_index_merged_inputs) {
    forward_variables_from(invoker,
                           [
                             "deps",
                             "public_deps",
                             "testonly",
                           ])
    visibility = [ ":*" ]
    data_keys = [ "component_id_index" ]
    outputs = [ component_id_index_input_manifest_path ]
  }

  # Step 2: Merge the collected index files (listed in the intermediary file)
  # into 1 index.
  component_id_index_merge = "${target_name}_merge"
  component_id_index_merged_index_json_path =
      "${target_out_dir}/${target_name}_merged_index.json"
  component_id_index_merged_index_fidl_path =
      "${target_out_dir}/${target_name}_merged_index.fidlbin"

  compiled_action(component_id_index_merge) {
    forward_variables_from(invoker, [ "testonly" ])
    visibility = [ ":*" ]
    tool = "//tools/component_id_index"
    sources = [ component_id_index_input_manifest_path ]
    outputs = [
      component_id_index_merged_index_json_path,
      component_id_index_merged_index_fidl_path,
    ]
    depfile = "${target_out_dir}/${target_name}.d"
    args = [
      "--input_manifest",
      rebase_path(component_id_index_input_manifest_path, root_build_dir),
      "--output_index_json",
      rebase_path(component_id_index_merged_index_json_path, root_build_dir),
      "--output_index_fidl",
      rebase_path(component_id_index_merged_index_fidl_path, root_build_dir),
      "--depfile",
      rebase_path(depfile, root_build_dir),
    ]
    deps = [ ":${component_id_index_merged_inputs}" ]
  }

  # Supply the merged index file to appmgr as config data.
  config_data("${target_name}-config-data") {
    forward_variables_from(invoker,
                           [
                             "testonly",
                             "visibility",
                           ])
    for_pkg = "appmgr"
    sources = [ component_id_index_merged_index_json_path ]
    outputs = [ "component_id_index" ]

    deps = [ ":${component_id_index_merge}" ]
  }

  # This target produces the component_id_index as a resource pathed under
  # "config/component_id_index".  This resource can be used to place the index
  # in bootfs so that it is available to `component_manager` even before pkgfs
  # is available.
  resource("${target_name}") {
    forward_variables_from(invoker,
                           [
                             "testonly",
                             "visibility",
                           ])
    sources = [ component_id_index_merged_index_fidl_path ]
    outputs = [ "config/component_id_index" ]
    deps = [ ":${component_id_index_merge}" ]
  }
}
