# 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/compiled_action.gni")

# Declares a driver's bind rules.
#
# Generate a C header that exposes a ZIRCON_DRIVER macro with the specified bind rules built in.
# For more details refer to //tools/bindc/README.md.
#
# Parameters
#
#   rules (required)
#     Path to the bind rules source file.
#
#   deps
#     List of bind_library targets included by the bind rules.
#
#   output_file
#     Name of the header file generated by the tool (defaults to target name + ".h").
#
#   disable_autobind
#     Configure the bind compiler to disable autobind, so that the driver must be bound on a user's
#     request. Defaults to false.
#     TODO(43400): Eventually this option should be removed when we can define this configuration
#     in the driver's component manifest.
#
template("bind_rules") {
  assert(defined(invoker.rules), "Need a bind rules source")

  output_file = "$target_name.h"
  if (defined(invoker.output)) {
    output_file = invoker.output
  }

  response_file_target = "${target_name}_response_file"
  response_file = "$target_gen_dir/$target_name.rsp"

  generated_file(response_file_target) {
    data_keys = [ "sources" ]
    forward_variables_from(invoker, [ "deps" ])
    outputs = [ response_file ]
  }

  compiled_action(target_name) {
    tool = "//tools/bindc:bin"
    tool_output_name = "bindc"

    sources = [ invoker.rules ]

    depfile = "$target_gen_dir/$target_name.d"

    args = [
      rebase_path(invoker.rules, root_build_dir),
      "--output",
      rebase_path("$target_gen_dir/$output_file", root_build_dir),
      "--include-file",
      rebase_path(response_file, root_build_dir),
      "--depfile",
      rebase_path(depfile, root_build_dir),
    ]

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

    inputs = [ response_file ]

    outputs = [ "$target_gen_dir/$output_file" ]

    deps = [ ":$response_file_target" ]
    if (defined(invoker.deps)) {
      deps += invoker.deps
    }
  }
}

# Declares a bind library.
#
# Declare a bind library that may be included by other libraries or bind rules. For more details,
# refer to //tools/bindc/README.md.
#
# Parameters
#
#   source (required)
#     Path to the library source file.
#
#   public_deps
#     List of other bind_library targets included by the library.
#
template("bind_library") {
  assert(defined(invoker.source), "Need a source file")

  group(target_name) {
    metadata = {
      sources = [ rebase_path(invoker.source, root_build_dir) ]
    }

    forward_variables_from(invoker, [ "public_deps" ])
  }
}
