# Copyright 2021 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/config/zircon/standard.gni")
import("//build/drivers/assert_driver_components.gni")

# Checks that all drivers that exist in the dependencies are in the allowlist
# given at //build/drivers/all_drivers_list.txt. This will ignore any drivers
# that are in //vendor/*.
#
# This also checks that all drivers included are driver components.
# For more information on this check see //build/drivers/assert_drivers_components.gni
#
# Parameters
#   contains_all_drivers (optional)
#     If this is true then this target also checks that the dependencies contain
#     every target in the allowlist.
#     Type: bool
#     Default: false
#
#   deps
#   testonly
template("check_included_drivers") {
  assert_driver_components_target = "${target_name}_assert_driver_components"
  assert_driver_components(assert_driver_components_target) {
    forward_variables_from(invoker,
                           [
                             "testonly",
                             "deps",
                           ])
  }

  metadata_check_target = "${target_name}_metadata_check"
  metadata_check_output = "${target_gen_dir}/${target_name}_metadata_output"
  generated_file(metadata_check_target) {
    forward_variables_from(invoker, [ "testonly" ])
    visibility = [ ":*" ]
    outputs = [ metadata_check_output ]
    deps = invoker.deps

    # fuchsia_driver_labels should be a list of qualified GN labels without toolchain information
    data_keys = [ "fuchsia_driver_labels" ]
  }

  action(target_name) {
    forward_variables_from(invoker, [ "testonly" ])
    deps = [
      ":${assert_driver_components_target}",
      ":${metadata_check_target}",
    ]
    script = "//build/drivers/check_included_drivers.py"
    inputs = [
      metadata_check_output,
      "//build/drivers/all_drivers_list.txt",
    ]
    outputs = [ "${target_out_dir}/${target_name}_check_included_drivers" ]
    args = [
      "--driver_list",
      rebase_path(metadata_check_output, root_build_dir),
      "--allowlist",
      rebase_path("//build/drivers/all_drivers_list.txt", root_build_dir),
      "--output",
      rebase_path(outputs[0], root_build_dir),
    ]

    foreach(cpu, standard_fuchsia_cpus) {
      if (current_cpu == cpu) {
        inputs += [ "//build/drivers/all_drivers_list_${cpu}.txt" ]
        args += [
          "--allowlist_arch_specific",
          rebase_path("//build/drivers/all_drivers_list_${cpu}.txt",
                      root_build_dir),
        ]
      }
    }

    if (defined(invoker.contains_all_drivers) && invoker.contains_all_drivers) {
      args += [ "--contains_all_drivers" ]
    }
  }
}
