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

# Define configuration data that can be aggregated into other packages. This is
# primarily used to aggregate configuration files into the config-data package
# that supplies the /config/data namespace.
#
#   for_pkg (required)
#     [string] The name of the package this is configuration for.
#
#   outputs (optional)
#     [list of one path] This must be a relative path (no leading `/`). It can use
#     placeholders based on $sources; see copy() and `gn help source_expansion`.
#     If not provided, the outputs will be named by processing the sources
#     with the {{source_file_part}} template. Applying this template to
#     "config/mycfg.config" produces "mycfg.config". If supplied the list must
#     contain exactly one path pattern.
#
#   sources (required)
#     [list of files] List of files in the source tree or build that become
#     $outputs. See copy() for details.
#
# See copy() for other parameters.
template("config_data") {
  group(target_name) {
    forward_variables_from(invoker,
                           [
                             "data_deps",
                             "deps",
                             "for_pkg",
                             "outputs",
                             "public_deps",
                             "sources",
                             "testonly",
                             "visibility",
                           ])

    if (!defined(outputs)) {
      outputs = [ "{{source_file_part}}" ]
    }

    assert(outputs != [] && outputs - [ outputs[0] ] == [],
           "Exactly one output pattern required.")

    metadata = {
      if (defined(invoker.metadata)) {
        forward_variables_from(invoker.metadata, "*")
      }
      config_package_entries = []
      foreach(source, sources) {
        foreach(target, process_file_template([ source ], outputs)) {
          # Config files are usually small, so package them in meta/ so they're
          # archived together rather than spread across individual blobs.
          # See also: fxbug.dev/37055
          config_package_entries += [
            {
              source = rebase_path(source, root_build_dir)
              destination = "meta/data/$for_pkg/$target"
              label = get_label_info(":$target_name", "label_with_toolchain")
            },
          ]
        }
      }
    }
  }
}

# Produce a configuration package who's content are defined by all config_data
# targets in its dependency chain.
#
# Parameters
#
#   deps (required)
#   testonly (optional)
#   visibility (optional)
#     Usual GN meanings.
template("config_package") {
  config_package_entries_target = "${target_name}_config_package_entries"
  config_package_entries = "$target_out_dir/$config_package_entries_target"
  generated_file(config_package_entries_target) {
    forward_variables_from(invoker,
                           [
                             "deps",
                             "testonly",
                           ])
    visibility = [
      ":*",
      "//build/assembly/*",
    ]
    data_keys = [ "config_package_entries" ]
    walk_keys = [ "config_package_barrier" ]
    outputs = [ config_package_entries ]
    output_conversion = "json"
    metadata = {
      # Don't pick up resources from deps
      distribution_entries_barrier = []
    }
  }

  distribution_entries_target = "${target_name}_distribution_entries_file"
  distribution_entries_file(distribution_entries_target) {
    forward_variables_from(invoker, [ "testonly" ])
    visibility = [ ":*" ]
    deps = [ ":$config_package_entries_target" ]
    file = config_package_entries
  }

  validate_sysmgr_config_target = "${target_name}_validate_sysmgr_config"
  merged_sysmgr_config = "$target_gen_dir/${target_name}_merged_sysmgr_config"
  action(validate_sysmgr_config_target) {
    forward_variables_from(invoker, [ "testonly" ])
    visibility = [ ":*" ]
    deps = [ ":$config_package_entries_target" ]
    script = "//build/tools/validate_sysmgr_config.py"
    inputs = [ config_package_entries ]
    depfile = "$target_out_dir/$target_name.d"
    outputs = [ merged_sysmgr_config ]

    args = [
      "--config-entries",
      rebase_path(config_package_entries, root_build_dir),
      "--depfile",
      rebase_path(depfile, root_build_dir),
      "--merged",
      rebase_path(merged_sysmgr_config, root_build_dir),
    ]
  }

  fuchsia_package(target_name) {
    forward_variables_from(invoker,
                           [
                             "package_name",
                             "testonly",
                             "visibility",
                           ])
    deps = [
      ":$distribution_entries_target",
      ":$validate_sysmgr_config_target",
    ]

    if (defined(golden_file_target)) {
      deps += [ ":$golden_file_target" ]
    }

    metadata = {
      if (defined(invoker.metadata)) {
        forward_variables_from(invoker.metadata, "*")
      }
      config_package_barrier = []
    }
  }
}
