# 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("//tools/cmc/build/cmc.gni")

# Declares that any components that are dependent on this target (directly or
# indirectly) should have certain contents in their component manifest
# includes.
#
# See:
# https://fuchsia.dev/fuchsia-src/development/components/build#component-manifest-includes
#
# Parameters
#
#   includes (required)
#     Contents of component manifest includes to expect in dependant
#     components.
#     Includes with .cmx or .cml extensions will only be checked against
#     component manifests with a matching cmx/cml extension.
#     Type: list of strings
#
#   deps
#   testonly
#   visibility
template("expect_includes") {
  group(target_name) {
    forward_variables_from(invoker,
                           [
                             "deps",
                             "check_includes",
                             "includes",
                             "testonly",
                             "visibility",
                           ])
    includes_cmx = []
    includes_cml = []
    foreach(include, includes) {
      ext = get_path_info(include, "extension")
      if (ext == "cmx") {
        includes_cmx += [ rebase_path(include, "//") ]
      } else if (ext == "cml") {
        includes_cml += [ rebase_path(include, "//") ]
      } else {
        assert(false, "Unexpected include extension for " + include)
      }
    }
    metadata = {
      cmc_expected_includes_cmx = includes_cmx
      cmc_expected_includes_cml = includes_cml

      # Used by the fuchsia_test_component_manifest() template.
      test_component_manifest_cmx = [
        {
          include = includes_cmx
        },
      ]
      test_component_manifest_cml = [
        {
          include = includes_cml
        },
      ]
    }
  }
}

# Collects expected includes from deps.
# Expected includes from transitive deps on `expect_includes` will be
# collected. Those can then be passed to `cmc check-includes`.
#
# Parameters
#
#   manifest (required)
#     [file] The path to the cmx file that will be checked.
#
#   deps
#   testonly
#   visibility
template("collect_expected_includes") {
  generated_file(target_name) {
    forward_variables_from(invoker,
                           [
                             "deps",
                             "manifest",
                             "metadata",
                             "testonly",
                             "visibility",
                           ])
    outputs = [ "${target_out_dir}/${target_name}_expected_includes" ]
    ext = get_path_info(manifest, "extension")
    if (ext == "cmx") {
      data_keys = [ "cmc_expected_includes_cmx" ]
    } else if (ext == "cml") {
      data_keys = [ "cmc_expected_includes_cml" ]
    } else {
      assert(false, "Unexpected manifest extension for " + manifest)
    }
    walk_keys = [ "expect_includes_barrier" ]
  }
}

# Checks that a component manifest file has all expected includes.
#
# Parameters
#
#   manifest (required)
#     [file] The path to the cmx file that is to be processed
#
#   deps
#   testonly
#   visibility
template("cmc_check_includes") {
  expected_includes_label = "${target_name}_expected_includes"
  collect_expected_includes(expected_includes_label) {
    forward_variables_from(invoker,
                           [
                             "deps",
                             "manifest",
                             "metadata",
                             "testonly",
                             "visibility",
                           ])
  }

  cmc(target_name) {
    forward_variables_from(invoker,
                           [
                             "deps",
                             "testonly",
                             "visibility",
                           ])
    if (!defined(deps)) {
      deps = []
    }
    deps += [ ":" + expected_includes_label ]
    inputs =
        [ invoker.manifest ] + get_target_outputs(":" + expected_includes_label)
    outputs = [ "${target_out_dir}/${target_name}.gn_stamp" ]

    args = [
      "--stamp",
      rebase_path(outputs[0], root_build_dir),
      "check-includes",
      rebase_path(invoker.manifest, root_build_dir),
      "--fromfile",
      rebase_path(inputs[1], root_build_dir),
      "--includepath",
      rebase_path("//", root_build_dir),
    ]
  }
}
