# 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")
import("//build/fidl/toolchain.gni")

# Declares a GIDL library.
#
# This target generates binding specific tests or benchmarks from GIDL inputs.
#
# Parameters
#
#    type (required)
#      String indicating the type of generation. Currently "conformance" or "benchmark".
#
#    language (required)
#      String indicating the binding name.
#
#    inputs (required)
#      List of input GIDL files
#
#    fidl (required)
#      Name of the FIDL GN target that defines types used in the GIDL files.
#
#    output (required)
#      Path of the output file to generate (in the case of 1 output). In the case of multiple
#      outputs, this is the name of an output file used to generate all output file names.
#      e.g. a.cc, a2.cc, a3.cc...
#
#    visibility
#      Standard GN meaning.
template("gidl") {
  assert(defined(invoker.language))

  # Output filename used to generate the output paths in the gidl tool.
  assert(defined(invoker.output))
  assert(defined(invoker.type))
  assert(defined(invoker.fidl))
  assert(defined(invoker.inputs))
  extra_args = []
  if (defined(invoker.extra_args)) {
    extra_args += invoker.extra_args
  }

  # All output targets.
  output_args = []
  if (defined(invoker.output)) {
    output_args += [
      "-out",
      rebase_path(invoker.output, root_build_dir),
    ]
  }

  fidl_target =
      get_label_info(invoker.fidl, "label_no_toolchain") + "($fidl_toolchain)"
  json_file = get_label_info(fidl_target, "target_gen_dir") + "/" +
              get_label_info(fidl_target, "name") + ".fidl.json"

  compiled_action(target_name) {
    testonly = true
    tool = "//tools/fidl/gidl/cmd/gidl"
    args = output_args + [
             "--type",
             invoker.type,
             "--language",
             invoker.language,
             "--json",
             rebase_path(json_file, root_build_dir),
           ] + extra_args + rebase_path(invoker.inputs, root_build_dir)
    inputs = invoker.inputs
    outputs = [ invoker.output ]
    deps = [ fidl_target ]
    forward_variables_from(invoker, [ "visibility" ])
  }
}

template("_gidl_cc_source_set") {
  assert(defined(invoker.type))
  assert(defined(invoker.fidl))
  assert(defined(invoker.inputs))
  assert(defined(invoker.language))
  assert(!defined(invoker.sources))

  fidl_bindings = get_label_info(invoker.fidl, "dir") + ":" +
                  get_label_info(invoker.fidl, "name")
  if (defined(invoker.bindings_suffix)) {
    fidl_bindings = fidl_bindings + invoker.bindings_suffix
  }

  output_filename = "${target_gen_dir}/gidl_generated_${target_name}.cc"

  gidl_target = "${target_name}_gidl"
  gidl(gidl_target) {
    type = invoker.type
    language = invoker.language
    output = output_filename
    fidl = invoker.fidl
    inputs = invoker.inputs
    forward_variables_from(invoker,
                           [
                             "extra_args",
                             "visibility",
                           ])
  }

  source_set(target_name) {
    testonly = true
    sources = [ output_filename ]
    deps = [ ":${gidl_target}" ]
    public_deps = [ fidl_bindings ]
    if (defined(invoker.deps)) {
      deps += invoker.deps
    }
    if (defined(invoker.configs)) {
      configs += invoker.configs
    }
    forward_variables_from(invoker,
                           "*",
                           [
                             "fidl",
                             "deps",
                             "configs",
                           ])
  }
}

template("gidl_cpp_conformance") {
  _gidl_cc_source_set(target_name) {
    type = "conformance"
    language = "cpp"
    bindings_suffix = "_cpp"
    forward_variables_from(invoker, "*")
  }
}

template("gidl_hlcpp_conformance") {
  _gidl_cc_source_set(target_name) {
    type = "conformance"
    language = "hlcpp"
    bindings_suffix = "_hlcpp"
    forward_variables_from(invoker, "*")
  }
}

template("gidl_llcpp_conformance") {
  _gidl_cc_source_set(target_name) {
    type = "conformance"
    language = "llcpp"
    bindings_suffix = "_cpp"
    forward_variables_from(invoker, "*")

    # TODO(https://fxbug.dev/42176699): This target uses mutable tables which are deprecated,
    # rather than builders.
    configs = [ "//build/cpp:fidl-wire-deprecated-mutable-tables" ]
  }
}

template("gidl_cpp_benchmarks") {
  _gidl_cc_source_set(target_name) {
    type = "benchmark"
    language = "cpp"
    bindings_suffix = "_cpp"
    forward_variables_from(invoker, "*")
  }
}

template("gidl_hlcpp_benchmarks") {
  _gidl_cc_source_set(target_name) {
    type = "benchmark"
    language = "hlcpp"
    bindings_suffix = "_hlcpp"
    forward_variables_from(invoker, "*")
  }
}

template("gidl_llcpp_benchmarks") {
  _gidl_cc_source_set(target_name) {
    type = "benchmark"
    language = "llcpp"
    bindings_suffix = "_cpp"
    forward_variables_from(invoker, "*")

    # TODO(https://fxbug.dev/42176699): This target uses mutable tables which are deprecated,
    # rather than builders.
    configs = [ "//build/cpp:fidl-wire-deprecated-mutable-tables" ]
  }
}

template("gidl_reference_benchmarks") {
  _gidl_cc_source_set(target_name) {
    type = "benchmark"
    language = "reference"
    bindings_suffix = "_cpp"
    forward_variables_from(invoker, "*")

    # TODO(https://fxbug.dev/42176699): This target uses mutable tables which are deprecated,
    # rather than builders.
    configs = [ "//build/cpp:fidl-wire-deprecated-mutable-tables" ]
  }
}

template("gidl_driver_cpp_benchmarks") {
  _gidl_cc_source_set(target_name) {
    type = "benchmark"
    language = "driver_cpp"
    bindings_suffix = "_cpp"
    forward_variables_from(invoker, "*")
  }
}

template("gidl_driver_llcpp_benchmarks") {
  _gidl_cc_source_set(target_name) {
    type = "benchmark"
    language = "driver_llcpp"
    bindings_suffix = "_cpp"
    forward_variables_from(invoker, "*")

    # TODO(https://fxbug.dev/42176699): This target uses mutable tables which are deprecated,
    # rather than builders.
    configs = [ "//build/cpp:fidl-wire-deprecated-mutable-tables" ]
  }
}
