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

declare_args() {
  # Used by config_package().
  # If true, then overrides the value of the sysmgr_golden_warn template
  # parameter to true regardless of whether it is specified on a target.
  sysmgr_golden_warn_override = false
}

# 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
#
#   sysmgr_golden (optional)
#     [path] File to treat as the golden file for this image's sysmgr configuration.
#     Fails the build if the configuration generated by this build is different than
#     the golden file's contents. To downgrade to a warning, set `sysmgr_golden_warn`.
#
#   sysmgr_golden_warn (default: false)
#     [boolean] If true, mismatches in the sysmgr golden config are treated as warnings
#     rather than errors.
#     If the `sysmgr_golden_warn_override` GN arg is true then mismatches
#     against the sysmgr golden config are treated as warnings regardless of the
#     parameter value specified.
#     To apply this override:
#     fx set ... --args=sysmgr_golden_warn_override=true
#
#   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),
    ]
  }

  if (defined(invoker.sysmgr_golden)) {
    golden_file_target = "${target_name}_sysmgr_golden"
    golden_file(golden_file_target) {
      forward_variables_from(invoker, [ "testonly" ])
      deps = [ ":$validate_sysmgr_config_target" ]
      visibility = [ ":*" ]
      golden = invoker.sysmgr_golden
      current = merged_sysmgr_config
      warn_on_changes =
          (defined(invoker.sysmgr_golden_warn) && invoker.sysmgr_golden_warn) ||
          sysmgr_golden_warn_override
    }
  }

  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 = []
    }
  }
}
