# 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")
import("//build/sdk/sdk_atom_alias.gni")

# Generates some C++ 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;
#   - sources;
#   - cpp_legacy_callbacks.

template("fidl_cpp_codegen") {
  not_needed(invoker, [ "sources" ])

  main_target_name = target_name
  generation_target_name = "${target_name}_cpp_generate"

  library_name = target_name
  if (defined(invoker.name)) {
    library_name = invoker.name
  }

  fidl_root_gen_dir =
      get_label_info(":$target_name($fidl_toolchain)", "root_gen_dir")

  include_stem = string_replace(library_name, ".", "/") + "/cpp/fidl"
  file_stem = "$fidl_root_gen_dir/$include_stem"

  fidl_target_gen_dir =
      get_label_info(":$target_name($fidl_toolchain)", "target_gen_dir")
  json_representation = "$fidl_target_gen_dir/$target_name.fidl.json"

  fidl_root_gen_dir =
      get_label_info(":$target_name($fidl_toolchain)", "root_gen_dir")

  compiled_action(generation_target_name) {
    forward_variables_from(invoker, [ "testonly" ])

    visibility = [ ":$main_target_name" ]

    tool = "//garnet/go/src/fidl:fidlgen"

    inputs = [
      json_representation,
    ]

    outputs = [
      "$file_stem.h",
      "$file_stem.cc",
    ]

    args = [
      "--json",
      rebase_path(json_representation, root_build_dir),
      "--output-base",
      rebase_path(file_stem, root_build_dir),
      "--include-base",
      rebase_path(fidl_root_gen_dir, root_build_dir),
      "--generators",
      "cpp",
    ]

    if (defined(invoker.cpp_legacy_callbacks) &&
        invoker.cpp_legacy_callbacks) {
      args += [ "--cpp-legacy-callbacks" ]
    }

    deps = [
      ":$main_target_name($fidl_toolchain)",
    ]
  }
}

template("fidl_cpp") {
  not_needed(invoker, "*")

  main_target_name = target_name
  generation_target_name = "${target_name}_cpp_generate"

  library_name = target_name
  if (defined(invoker.name)) {
    library_name = invoker.name
  }

  fidl_root_gen_dir =
      get_label_info(":$target_name($fidl_toolchain)", "root_gen_dir")

  include_stem = string_replace(library_name, ".", "/") + "/cpp/fidl"
  file_stem = "$fidl_root_gen_dir/$include_stem"

  source_set(main_target_name) {
    forward_variables_from(invoker,
                           [
                             "deps",
                             "testonly",
                             "visibility",
                           ])

    sources = [
      "$file_stem.cc",
      "$file_stem.h",
    ]

    # Let dependencies use `#include "$file_stem.h"`.
    public_configs = [ "//build/cpp:fidl_gen_config" ]

    public_deps = [
      ":$generation_target_name($fidl_toolchain)",
      ":$main_target_name($fidl_toolchain)",
      ":${main_target_name}_tables",
    ]

    if (is_fuchsia) {
      public_deps += [
        "//garnet/public/lib/fidl/cpp",
      ]
    } else {
      public_deps += [
        "//garnet/public/lib/fidl/cpp:cpp_base",
      ]
    }

    if (defined(invoker.public_deps)) {
      public_deps += invoker.public_deps
    }
  }

  if (defined(invoker.sdk_category) && invoker.sdk_category != "excluded") {
    # Instead of depending on the generated bindings, set up a dependency on the
    # original library.
    sdk_target_name = "${main_target_name}_sdk"
    sdk_atom_alias(sdk_target_name) {
      atom = ":$sdk_target_name($fidl_toolchain)"
    }
  }
}
