# 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/cpp/fidl_cpp.gni")
import("//build/dart/toolchain.gni")
import("//build/fidl/toolchain.gni")
import("//build/go/toolchain.gni")
import("//build/rust/toolchain.gni")

# Declares a FIDL library.
#
# Depending on the toolchain in which this targets is expanded, it will yield
# different results:
#   - in the FIDL toolchain, it will compile its source files into an
#     intermediate representation consumable by language bindings generators;
#   - in the target or shared toolchain, this will produce a source_set
#     containing C++ bindings.
#
# Parameters
#
#   sources (required)
#     List of paths to library source files.
#
#   name (optional)
#     Name of the library.
#     Defaults to the target's name.
#
#   sdk_category (optional)
#     Publication level of the library in SDKs.
#     See //build/sdk/sdk_atom.gni.
#
#   api (optional)
#     Path to the file representing the API of this library.
#     This file is used to ensure modifications to the library's API are
#     explicitly acknowledged. It is mandatory for publication categories of
#     "partner" or "public".
#     Defaults to "<target name>.api".

template("fidl") {
  if (defined(invoker.sdk_category)) {
    not_needed(invoker, [ "sdk_category" ])
  }
  if (defined(invoker.api)) {
    not_needed(invoker, [ "api" ])
  }

  if (current_toolchain == dart_toolchain) {
    import("//build/dart/fidl_dart.gni")

    fidl_dart(target_name) {
      forward_variables_from(invoker, "*")
    }
  } else if (current_toolchain == rust_toolchain) {
    import("//build/rust/fidl_rust.gni")

    fidl_rust(target_name) {
      forward_variables_from(invoker, "*")
    }
  } else if (current_toolchain == go_toolchain) {
    import("//build/go/fidl_go.gni")

    fidl_go(target_name) {
      forward_variables_from(invoker, "*")
    }
  } else {
    import("//build/c/fidl_c.gni")

    if (current_toolchain == fidl_toolchain) {
      import("//build/fidl/fidl_library.gni")

      fidl_library(target_name) {
        forward_variables_from(invoker, "*")
      }
    }

    if (is_fuchsia) {
      hlcpp_public_deps = [ "//sdk/lib/fidl/cpp" ]
      llcpp_generators = [
        {
          target_suffix = "llcpp"
          fidlgen_generator = "llcpp"
          output_stem = "llcpp/fidl"
          additional_public_deps = [
            "//zircon/public/lib/fidl",
            "//zircon/public/lib/fidl-llcpp",
          ]
        },
      ]
    } else {
      hlcpp_public_deps = [ "//sdk/lib/fidl/cpp:cpp_base" ]
      llcpp_generators = []
    }

    fidl_cpp(target_name) {
      forward_variables_from(invoker, "*")
      generators = [
        {
          fidlgen_generator = "cpp"
          output_stem = "cpp/fidl"
          additional_public_deps = hlcpp_public_deps
        },
        {
          target_suffix = "overnet_internal"
          fidlgen_generator = "overnet_internal"
          output_stem = "cpp/overnet_internal"
          additional_public_deps =
              hlcpp_public_deps + [
                "//src/connectivity/overnet/lib/protocol:fidl_stream",
                ":$target_name",
              ]
        },
      ]
      generators += llcpp_generators
    }

    fidl_tables(target_name) {
      forward_variables_from(invoker,
                             [
                               "testonly",
                               "visibility",
                             ])
    }

    if (is_fuchsia) {
      import("//build/rust/fidl_rust_library.gni")

      # TODO(cramertj): remove pending TC-81.
      fidl_rust_library(target_name) {
        forward_variables_from(invoker, "*")
      }

      fidl_c_client(target_name) {
        forward_variables_from(invoker, "*")
      }

      fidl_c_server(target_name) {
        forward_variables_from(invoker, "*")
      }

      group("${target_name}_c") {
        forward_variables_from(invoker,
                               [
                                 "testonly",
                                 "visibility",
                               ])

        public_deps = [
          ":${target_name}_client",
          ":${target_name}_server",
        ]
      }
    }
  }
}
