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

  # TODO(ZX-3365): Hack for - compat names during soft transition.
  # Remove whole conditional block when final conversion to . names is done.
  if (get_label_info("..", "dir") == "//zircon/public/fidl" &&
      string_replace(target_name, ".", "-") != target_name) {
    not_needed(invoker, "*")
    compat_name = string_replace(target_name, ".", "-")
    if (current_toolchain == dart_toolchain) {
      foreach(suffix, [ "" ]) {
        group(target_name + suffix) {
          forward_variables_from(invoker, [ "testonly" ])
          public_deps = [
            "//zircon/public/fidl/$compat_name:$compat_name$suffix",
          ]
        }
      }
      copy("${target_name}_dot_packages") {
        forward_variables_from(invoker, [ "testonly" ])
        deps = [
          "//zircon/public/fidl/$compat_name:${compat_name}_dot_packages",
        ]
        sources = [
          get_label_info(deps[0], "target_gen_dir") + "/$compat_name.packages",
        ]
        outputs = [
          "$target_gen_dir/$target_name.packages",
        ]
      }
      if (defined(invoker.sdk_category) && invoker.sdk_category != "excluded") {
        import("//build/sdk/sdk_atom_alias.gni")
        sdk_atom_alias("${target_name}_sdk") {
          atom = "//zircon/public/fidl/$compat_name:${compat_name}_sdk($fidl_toolchain)"
        }
      }
    } else if (current_toolchain == fidl_toolchain) {
      copy(target_name) {
        forward_variables_from(invoker, [ "testonly" ])
        deps = [
          "//zircon/public/fidl/$compat_name:${compat_name}",
        ]
        sources = [
          get_label_info(deps[0], "target_gen_dir") + "/$compat_name.libraries",
        ]
        outputs = [
          "$target_gen_dir/$target_name.libraries",
        ]
      }
    } else {
      foreach(suffix,
              [
                "",
                "-rustc",
                "_c",
                "_c_client",
                "_c_server",
                "_llcpp",
                "_overnet_embedded",
                "_overnet_internal",
              ]) {
        group(target_name + suffix) {
          forward_variables_from(invoker, [ "testonly" ])
          public_deps = [
            "//zircon/public/fidl/$compat_name:$compat_name$suffix",
          ]
        }
      }
    }
  } else 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",
            "//zircon/public/lib/fit",
          ]
        },
      ]
    } else {
      hlcpp_public_deps = [ "//sdk/lib/fidl/cpp:cpp_base" ]
      _llcpp_generators = []
    }

    fidl_cpp(target_name) {
      forward_variables_from(invoker, "*")
      generators = [
        {
          fidlgen_tool = "//garnet/go/src/fidl:fidlgen"
          fidlgen_generator = "cpp"
          output_stem = "cpp/fidl"
          additional_public_deps = hlcpp_public_deps
        },
        {
          target_suffix = "overnet_internal"
          fidlgen_tool = "//garnet/go/src/fidl:fidlgen"
          fidlgen_generator = "overnet_internal"
          output_stem = "cpp/overnet_internal"
          additional_public_deps =
              hlcpp_public_deps + [
                "//src/connectivity/overnet/lib/protocol:fidl_stream",
                ":$target_name",
              ]
        },
        {
          target_suffix = "overnet_embedded"
          fidlgen_tool = "//garnet/go/src/fidl:fidlgen"
          fidlgen_generator = "overnet_embedded"
          output_stem = "cpp/overnet_embedded"
          additional_public_deps = [
            "//src/connectivity/overnet/lib/embedded:runtime",
            ":$target_name",
          ]
        },
      ]
      llcpp_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",
        ]
      }
    }
  }
}
