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

template("cmc") {
  compiled_action(target_name) {
    forward_variables_from(invoker,
                           [
                             "applicable_licenses",
                             "args",
                             "depfile",
                             "deps",
                             "inputs",
                             "metadata",
                             "outputs",
                             "sources",
                             "public_deps",
                             "testonly",
                             "visibility",
                           ])

    # //tools/cmc is a group that contains a clippy target.
    # //tools/cmc:cmc.actual is the actual executable target.
    # Depending on the executable target lets GN correctly apply assert_no_deps logic.
    tool = "//tools/cmc:cmc.actual"
    tool_output_name = "cmc"
    mnemonic = "CMC"
  }
}

# Merges together component manifest files
#
# Parameters
#
#   sources (optional)
#     [list of files] A list of files that are to be merged.
#
#   from_file (optional)
#     [path] A file containing line-delimited paths of files to be merged.
#
#   output_name (optional)
#     [path] Name for the output.
#     If not specified, the target name is used.
#
#   deps (optional)
#   testonly (optional)
#   visibility (optional)
#     Standard GN meaning.
template("cmc_merge") {
  cmc(target_name) {
    forward_variables_from(invoker,
                           [
                             "applicable_licenses",
                             "deps",
                             "metadata",
                             "output_name",
                             "sources",
                             "from_file",
                             "testonly",
                             "visibility",
                           ])
    if (!defined(output_name)) {
      output_name = target_name
    }
    if (!defined(sources) && !defined(from_file)) {
      assert(
          false,
          "At least one of \"sources\" or \"from_file\" must be specified when calling cmc_merge($target_name)")
    }

    merged_output = "${target_out_dir}/${output_name}"
    inputs = []
    outputs = [ merged_output ]

    depfile = "${target_out_dir}/${target_name}.d"
    args = [
      "merge",
      "--output",
      rebase_path(merged_output, root_build_dir),
      "--depfile",
      rebase_path(depfile, root_build_dir),
    ]

    if (defined(sources)) {
      inputs += sources
      args += rebase_path(sources, root_build_dir)
    }

    if (defined(from_file)) {
      inputs += [ from_file ]
      args += [
        "--fromfile",
        rebase_path(from_file, root_build_dir),
      ]
    }
  }
}

# Validates a component manifest against a package manifest.
# Checks that the component manifest doesn't reference files that are not
# present in the package.
#
# Parameters
#
#   component_manifest (required)
#     A component manifest to validate.
#     Type: path
#
#   package_manifest (optional)
#     A package manifest to validate against.
#     If not provided, a package manifest will be generated out of deps.
#     Type: path
#
#   label (required)
#     A GN label to use in error messages, to make troubleshooting easier.
#     Type: label
#
#   data_deps
#   deps
#   public_deps
#   testonly
#   visibility
template("cmc_validate_references") {
  assert(
      defined(invoker.component_manifest),
      "Must specify exactly one of component_manifest, component_manifests_rspfile")

  if (defined(invoker.package_manifest)) {
    package_manifest = invoker.package_manifest
  } else {
    fini_target = "${target_name}_fini"
    package_manifest = "$target_gen_dir/${fini_target}_file"
    fini_manifest(fini_target) {
      forward_variables_from(invoker,
                             [
                               "applicable_licenses",
                               "data_deps",
                               "deps",
                               "public_deps",
                               "testonly",
                             ])
      visibility = [ ":*" ]
      outputs = [ package_manifest ]
    }
  }

  stamp_file = "$target_gen_dir/$target_name.action.stamp"
  cmc(target_name) {
    forward_variables_from(invoker,
                           [
                             "applicable_licenses",
                             "data_deps",
                             "deps",
                             "metadata",
                             "public_deps",
                             "testonly",
                             "visibility",
                           ])

    inputs = [
      package_manifest,
      invoker.component_manifest,
    ]
    outputs = [ stamp_file ]

    args = [
      "--stamp",
      rebase_path(stamp_file, root_build_dir),
      "validate-references",
      "--component-manifest",
      rebase_path(invoker.component_manifest, root_build_dir),
      "--package-manifest",
      rebase_path(package_manifest, root_build_dir),
      "--context",
      invoker.label,
    ]

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

# Common cmc arguments
include_paths = [
  "--includeroot",
  rebase_path("//", root_build_dir),
  "--includepath",
  rebase_path("//sdk/lib/", root_build_dir),
]
