# Copyright 2018 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")

template("fidl_tables") {
  main_target_name = target_name

  fidl_target_gen_dir =
      get_label_info(":$target_name($fidl_toolchain)", "target_gen_dir")
  coding_tables = "$fidl_target_gen_dir/$target_name.fidl.tables.cc"

  # The C simple $type code is generated by the frontend, so we just need to
  # produce a target with the generated file name and configuration information.
  source_set(main_target_name + "_tables") {
    forward_variables_from(invoker,
                           [
                             "testonly",
                             "visibility",
                           ])

    sources = [
      coding_tables,
    ]

    deps = [
      ":${main_target_name}_compile($fidl_toolchain)",
    ]
    public_deps = [
      "//zircon/public/lib/fidl_base",
    ]
  }
}

# C simple client bindings for a FIDL library.
#
# The parameters for this template are defined in //build/fidl/fidl.gni. The
# relevant parameters in this template are:
#   name: string, name of the FIDL library
#   type: string, 'client' or 'server'

template("fidl_c_target") {
  assert(is_fuchsia, "This template can only be used in $target_toolchain.")

  type = invoker.type
  main_target_name = target_name
  config_target_name = main_target_name + "_c_" + type + "_config"

  library_name = invoker.name

  c_stem = string_replace(library_name, ".", "/") + "/c/fidl"
  fidl_target_gen_dir =
      get_label_info(":$target_name($fidl_toolchain)", "target_gen_dir")
  c_header = "$fidl_target_gen_dir/$c_stem.h"
  c_file = "$fidl_target_gen_dir/$c_stem.$type.c"

  config(config_target_name) {
    include_dirs = [ fidl_target_gen_dir ]
  }

  # The C simple $type code is generated by the frontend, so we just need to
  # produce a target with the generated file name and configuration information.
  source_set(main_target_name + "_c_" + type) {
    forward_variables_from(invoker,
                           [
                             "testonly",
                             "visibility",
                           ])

    sources = [
      c_file,
    ]
    public = [
      c_header,
    ]

    # Let dependencies use `#include "$file_stem.h"`.
    public_configs = [ ":$config_target_name" ]

    deps = [
      ":${main_target_name}_compile($fidl_toolchain)",
      ":${main_target_name}_tables",
    ]
    public_deps = [
      "//zircon/public/lib/fidl",
    ]

    fidl_deps = []
    if (defined(invoker.deps)) {
      fidl_deps += invoker.deps
    }
    if (defined(invoker.public_deps)) {
      fidl_deps += invoker.public_deps
    }
    foreach(dep, fidl_deps) {
      public_deps += [ get_label_info(dep, "label_no_toolchain") + "_c_" +
                       type + "(" + get_label_info(dep, "toolchain") + ")" ]
    }

    libs = [ "zircon" ]
  }
}

template("fidl_c_client") {
  library_name = target_name
  if (defined(invoker.name)) {
    library_name = invoker.name
  }
  forward_variables_from(invoker,
                         [
                           "deps",
                           "public_deps",
                           "testonly",
                           "visibility",
                         ])

  fidl_c_target(target_name) {
    name = library_name
    type = "client"
  }
}

template("fidl_c_server") {
  library_name = target_name
  if (defined(invoker.name)) {
    library_name = invoker.name
  }

  forward_variables_from(invoker,
                         [
                           "deps",
                           "public_deps",
                           "testonly",
                           "visibility",
                         ])
  fidl_c_target(target_name) {
    name = library_name
    type = "server"
  }
}
