# 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.

# Generates a package_config.json file containing all of the packages used
# to generate a kernel file.
#
# Package configs are files which describe metadata about a dart package.
# This includes information like the name, dart language version, where to
# find the files, etc. The file is required by the dart kernel compiler.
#
# Parameters
#
#   deps (optional)
#     [list of labels] The targets to generate a manifest for.
#     See `gn help` for more details.
#
#   testonly, visibility, metadata (optional)
#     See `gn help`.
#
#   outputs (optional)
#     Singleton list containing the path to the package_config file.
#     Defaults to `[ "$target_gen_dir/${target_name}_package_config.json" ]`.
template("dart_package_config") {
  main_target = target_name
  generate_target = "${target_name}_generate"

  # Build the name of the output file.
  if (defined(invoker.outputs)) {
    _outputs = invoker.outputs
    assert(_outputs != [] && _outputs == [ _outputs[0] ],
           "Outputs list must have exactly one element.")
    package_config_file = _outputs[0]
  } else {
    package_config_file = "$target_gen_dir/${target_name}_package_config.json"
  }
  intermediate_file = "$package_config_file.partial"

  # Gather metadata about runtime objects.
  generated_file(generate_target) {
    forward_variables_from(invoker,
                           [
                             "deps",
                             "testonly",
                           ])

    visibility = [ ":$main_target" ]

    data_keys = [
      # A list of package configuration entries
      #
      # Each entry must contain these values:
      #   - `name`: The name of the package;
      #   - `root_uri`: Path to the package root relative to root_build_dir;
      #   - `package_uri`: The path in which the source lives
      #
      # The following entries may optionally be specified
      #   - `language_version`: The dart language version.
      #   - `pubspec_path`: The path to the pubspec file to find the language version
      "package_config_entries",
    ]
    walk_keys = [ "package_config_entry_barrier" ]

    outputs = [ intermediate_file ]

    output_conversion = "json"
  }

  # Converts the intermediate to a real pacakge_config.json file.
  action(main_target) {
    forward_variables_from(invoker,
                           [
                             "deps",
                             "testonly",
                             "visibility",
                           ])

    script = "//build/dart/gen_dart_package_config.py"

    inputs = [ intermediate_file ]
    outputs = [ package_config_file ]

    args = [
      "--input",
      rebase_path(intermediate_file, root_build_dir),
      "--output",
      rebase_path(package_config_file, root_build_dir),
      "--root",
      rebase_path("//", root_build_dir),
    ]

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

    metadata = {
      # Add a barrier here to avoid double of inclusion of elements listed in
      # the generated package config.
      package_config_entry_barrier = []

      if (defined(invoker.metadata)) {
        forward_variables_from(invoker.metadata, "*")
      }
    }
  }
}
