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