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

  # 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"
  }
}
