# 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),
    ]
  }

  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:gidl"
    args = output_args + [
             "--type",
             invoker.type,
             "--language",
             invoker.language,
             "--json",
             rebase_path(json_file),
           ] + extra_args + rebase_path(invoker.inputs)
    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
    }
    forward_variables_from(invoker,
                           "*",
                           [
                             "fidl",
                             "deps",
                           ])
  }
}

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

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

template("gidl_c_conformance") {
  _gidl_cc_source_set(target_name) {
    type = "conformance"
    language = "c"
    bindings_suffix = "_llcpp"
    forward_variables_from(invoker, "*")
  }
}

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

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

template("gidl_walker_benchmarks") {
  _gidl_cc_source_set(target_name) {
    type = "benchmark"
    language = "walker"
    bindings_suffix = "_llcpp"
    forward_variables_from(invoker, "*")
  }
}

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