# 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...

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) {
    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, [ "testonly" ])
  }
}

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,
                           [
                             "testonly",
                             "extra_args",
                           ])
  }

  source_set(target_name) {
    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_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, "*")
  }
}
