# 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")
  generated_binding_dir = "$fidl_target_gen_dir/$target_name/c"
  coding_tables = "$generated_binding_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/system/ulib/fidl: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, 'header', '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"
  c_header = "$generated_binding_dir/$c_stem.h"

  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",
                           ])
    public = [ c_header ]

    if (type != "header") {
      sources = [ "$generated_binding_dir/$c_stem.$type.c" ]
    }

    # 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/system/ulib/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") + ")" ]
      }
    }

    # TODO(fxbug.dev/95833): We suppress deprecated usage warnings
    # in generated C bindings code itself. Delete this line after everything
    # migrates off of the C bindings.
    configs += [ "//build/c:fidl-deprecated-c-bindings-reserved-for-fidlc-generated-code-only" ]
  }
}

# TODO(fxbug.dev/99732): Evaluate whether we really need this.
template("fidl_c_header") {
  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 = "header"
  }
}

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