# 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/dist/distribution_manifest.gni")
import("//build/testing/golden_file.gni")
import("//src/sys/build/components.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",
                             "metadata",
                             "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 = [ ":*" ]
    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 = []
    }
  }
}
