# 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" ]
    if (is_fuchsia) {
      public_deps += [ "//zircon/public/sysroot:headers" ]
    } else {
      public_deps += [ "//src/zircon/lib/zircon:zircon-headers" ]
    }
  }
}

# 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")
  generated_binding_dir = "$fidl_target_gen_dir/$target_name"
  c_header = "$generated_binding_dir/$c_stem.h"
  c_file = "$generated_binding_dir/$c_stem.$type.c"

  config(config_target_name) {
    include_dirs = [ generated_binding_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" ]
    if (is_fuchsia) {
      public_deps += [ "//zircon/public/sysroot:headers" ]
    } else {
      public_deps += [ "//src/zircon/lib/zircon:zircon-headers" ]
    }

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

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