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

# Creates a driver manifest which is a JSON file that describes how drivers can be found
# in the system.
#
# This target uses GN metadata to collect all drivers included in its dependencies into
# the manifest file.
#
# By default, this template generates a manifest file, and ensures that
# it will be installed under config/ into any package, boot or system
# image that depends on it. This last part can be disabled by using
# 'install_as_config_resource = false'.
#
# Parameters
#
#   manifest_name (optional)
#     The name of the manifest
#     Type: string
#     Default: ${target_name}.json
#
#   package_url (required)
#     The package url that forms the base of any driver paths.
#     E.g: fuchsia-pkg://fuchsia.com/my-package
#     E.g: fuchsia-boot:///
#     Type: string
#
#   install_as_config_resource (optional)
#     Whether to include the manifest in a fuchsia package or the fuchsia image
#     Type: boolean
#     Default: true
#
#   deps
#   testonly
#   visibility
template("driver_manifest") {
  assert(defined(invoker.package_url),
         "driver_manifest() requires a package_url")
  install_as_config_resource = true
  if (defined(invoker.install_as_config_resource)) {
    install_as_config_resource = invoker.install_as_config_resource
  }
  manifest_name = "${target_name}.json"
  if (defined(invoker.manifest_name)) {
    manifest_name = invoker.manifest_name
  }

  distribution_manifest_target = "${target_name}_distribution_manifest"
  distribution_manifest_file =
      "${target_gen_dir}/${target_name}.distribution_manifest"
  distribution_manifest(distribution_manifest_target) {
    forward_variables_from(invoker,
                           [
                             "deps",
                             "testonly",
                           ])
    outputs = [ "${distribution_manifest_file}" ]
  }

  action(target_name) {
    forward_variables_from(invoker, [ "testonly" ])
    deps = [ ":${distribution_manifest_target}" ]
    script = "//build/drivers/create_driver_manifest.py"
    inputs = [ "${distribution_manifest_file}" ]
    outputs = [ "${target_out_dir}/${manifest_name}" ]
    args = [
      "--package-url",
      invoker.package_url,
      "--distribution_manifest",
      rebase_path("${distribution_manifest_file}", root_build_dir),
      "--output",
      rebase_path(outputs[0], root_build_dir),
    ]
    metadata = {
      # Used by the combined_driver_manifest() template.
      driver_manifest_files = [ rebase_path(outputs[0], root_build_dir) ]
      driver_manifest_barrier = []

      # Used by the distribution_manifest() template.
      distribution_entries_barrier = []
      distribution_entries = []

      # Used by zbi() template.
      zbi_input_barrier = []

      if (install_as_config_resource) {
        distribution_entries += [
          {
            source = rebase_path(outputs[0], root_build_dir)
            destination = "config/${manifest_name}"
            label = get_label_info(":${target_name}", "label_with_toolchain")
          },
        ]
      }
    }
  }
}

# Combines multiple driver manifests together into one driver manifest.
#
# This template generates a manifest file, and ensures that
# it will be installed under config/ into any package, boot or system
# image that depends on it.
#
# Parameters
#
#   manifest_name (optional)
#     The name of the manifest
#     Type: string
#     Default: ${target_name}.json
#
#   deps
#   testonly
#   visibility
template("combined_driver_manifest") {
  manifest_name = "${target_name}.json"
  if (defined(invoker.manifest_name)) {
    manifest_name = invoker.manifest_name
  }

  manifest_files_target = "${target_name}_manifest_files"
  manifest_files_path = "${target_gen_dir}/${target_name}.manifest_files"
  generated_file(manifest_files_target) {
    forward_variables_from(invoker,
                           [
                             "deps",
                             "testonly",
                           ])
    outputs = [ "${manifest_files_path}" ]
    data_keys = [ "driver_manifest_files" ]
    walk_keys = [ "driver_manifest_barrier" ]
  }

  action(target_name) {
    forward_variables_from(invoker, [ "testonly" ])
    deps = [ ":${manifest_files_target}" ]
    script = "//build/drivers/combine_driver_manifests.py"
    inputs = [ "${manifest_files_path}" ]
    outputs = [ "${target_out_dir}/${target_name}.json" ]
    depfile = "${target_gen_dir}/${target_name}.d"

    args = [
      "--manifest-file-list",
      rebase_path("${manifest_files_path}", root_build_dir),
      "--output",
      rebase_path(outputs[0], root_build_dir),
      "--dep-file",
      rebase_path(depfile, root_build_dir),
    ]
    metadata = {
      # Used by the distribution_manifest() template.
      distribution_entries_barrier = []
      distribution_entries = [
        {
          source = rebase_path(outputs[0], root_build_dir)
          destination = "config/${manifest_name}"
          label = get_label_info(":${target_name}", "label_with_toolchain")
        },
      ]

      # Used by zbi() template.
      zbi_input_barrier = []
    }
  }
}
