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

template("_fidl_cpp_codegen_impl") {
  generation_target_name = "${target_name}_generate"
  fidl_target_name = invoker.fidl_target_name

  fidl_target_gen_dir =
      get_label_info(":${fidl_target_name}($fidl_toolchain)", "target_gen_dir")

  library_name = invoker.library_name
  include_stem =
      string_replace(library_name, ".", "/") + "/" + invoker.output_stem
  file_stem = "$fidl_target_gen_dir/$fidl_target_name/$include_stem"

  json_representation = "$fidl_target_gen_dir/$fidl_target_name.fidl.json"

  generation_visibility = [
    ":$target_name",
    "${invoker.fidlgen_tool}:*",
  ]
  if (defined(invoker.fuzzers)) {
    foreach(fuzzer, invoker.fuzzers) {
      assert(
          defined(fuzzer.protocol),
          "FIDL protocol fuzzers must set protocol: the fully-qualified name of the protocol to be fuzzed.")

      protocol_suffix = "_" + string_replace(fuzzer.protocol, ".", "_")
      if (defined(fuzzer.methods)) {
        foreach(method, fuzzer.methods) {
          protocol_suffix = "${protocol_suffix}_${method}"
        }
      }
      generation_visibility += [ ":${target_name}${protocol_suffix}" ]
    }
  }

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

    visibility = generation_visibility

    tool = invoker.fidlgen_tool

    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_target_gen_dir/$fidl_target_name", root_build_dir),
      "--include-stem",
      invoker.output_stem,
      "--clang-format-path",
      rebase_path("${clang_prefix}/clang-format", "", root_build_dir),
    ]

    if (defined(invoker.additional_fidlgen_arguments)) {
      args += invoker.additional_fidlgen_arguments
    }

    deps = [ ":$fidl_target_name($fidl_toolchain)" ]

    metadata = {
      generated_sources = rebase_path(outputs, root_build_dir)
    }
  }
}

# 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;
template("fidl_cpp_codegen") {
  if (current_toolchain == fidl_toolchain) {
    _fidl_cpp_codegen_impl(target_name) {
      forward_variables_from(invoker, "*")
    }
  } else {
    # Code generation only happens under the FIDL toolchain.
    not_needed([ "target_name" ])
    not_needed(invoker, "*")
  }
}

template("_fidl_llcpp_codegen_impl") {
  generation_target_name = "${target_name}_generate"
  generation_visibility = [
    ":$target_name",
    "//tools/fidl/fidlgen_llcpp:*",
  ]

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

  include_stem =
      string_replace(library_name, ".", "/") + "/" + invoker.output_stem
  file_stem = "$fidl_target_gen_dir/$fidl_target_name/$include_stem"

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

    visibility = generation_visibility

    tool = "//tools/fidl/fidlgen_llcpp"

    inputs = [ json_representation ]

    outputs = [
      "${file_stem}.h",
      "${file_stem}.cc",
      "${file_stem}_test_base.h",
    ]

    args = [
      "--json",
      rebase_path(json_representation, root_build_dir),
      "--header",
      rebase_path("${file_stem}.h", root_build_dir),
      "--source",
      rebase_path("${file_stem}.cc", root_build_dir),
      "--test-base",
      rebase_path("${file_stem}_test_base.h", root_build_dir),
      "--include-base",
      rebase_path("$fidl_target_gen_dir/$fidl_target_name", root_build_dir),
      "--include-stem",
      invoker.output_stem,
      "--clang-format-path",
      rebase_path("${clang_prefix}/clang-format", "", root_build_dir),
    ]

    deps = [ ":$fidl_target_name($fidl_toolchain)" ]

    metadata = {
      generated_sources = rebase_path(outputs, root_build_dir)
    }
  }
}

# Generates low-level C++ bindings for a library.
template("fidl_llcpp_codegen") {
  if (current_toolchain == fidl_toolchain) {
    _fidl_llcpp_codegen_impl(target_name) {
      forward_variables_from(invoker, "*")
    }
  } else {
    # Code generation only happens under the FIDL toolchain.
    not_needed([ "target_name" ])
    not_needed(invoker, "*")
  }
}

template("_fidl_cpp_library_impl") {
  config_target_name = "${target_name}__config"

  generation_target_name =
      "${invoker.fidl_target_name}${invoker.target_suffix}_generate"

  library_name = invoker.library_name
  fidl_target_name = invoker.fidl_target_name
  fidl_target_gen_dir =
      get_label_info(":$target_name($fidl_toolchain)", "target_gen_dir")

  include_stem =
      string_replace(library_name, ".", "/") + "/" + invoker.output_stem
  file_stem = "$fidl_target_gen_dir/$fidl_target_name/$include_stem"

  config(config_target_name) {
    include_dirs = [ "$fidl_target_gen_dir/$fidl_target_name" ]
  }

  source_set(target_name) {
    forward_variables_from(invoker,
                           [
                             "defines",
                             "testonly",
                             "visibility",
                           ])

    if (defined(invoker.header_only) && invoker.header_only) {
      sources = [ "$file_stem.h" ]
    } else if (defined(invoker.source_only) && invoker.source_only) {
      sources = [ "$file_stem.cc" ]
    } else {
      sources = [
        "$file_stem.cc",
        "$file_stem.h",
      ]
    }

    # TODO(fxbug.dev/56257): Remove this line when `-Wextra-semi` is on
    # for all of Fuchsia by default.
    cflags_cc = [ "-Wextra-semi" ]

    # TODO(fxbug.dev/69585): We suppress deprecated raw channel usage
    # in LLCPP generated code itself. Delete this line after everything
    # migrates to typed channels.
    configs += [ "//build/cpp:fidl-llcpp-deprecated-raw-channels-reserved-for-llcpp-generated-code-only" ]

    # Let dependencies use `#include "$file_stem.h"`.
    public_configs = [ ":$config_target_name" ]

    public_deps = [
      ":$generation_target_name($fidl_toolchain)",
      ":${invoker.fidl_target_name}($fidl_toolchain)",
      ":${invoker.fidl_target_name}_tables",
    ]

    # Map FIDL library dependencies to generated library dependencies
    # of the same type (identified by target_suffix).
    not_needed(invoker, [ "target_suffix" ])
    if (defined(invoker.public_deps)) {
      foreach(dep, invoker.public_deps) {
        label = get_label_info(dep, "label_no_toolchain")
        public_deps += [ "${label}${invoker.target_suffix}" ]
      }
    }

    public_deps += invoker.additional_public_deps

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

# Defines a C++ library target (source_set) generated from a FIDL library.
#
# FIDL library dependencies under `public_deps` will manifest as corresponding
# library target dependencies.
#
# Parameters
#
#  library_name (required)
#    Name of the FIDL library.
#
#  fidl_target_name (required)
#    Name of the GN target corresponding to the FIDL library.
#
#  target_suffix (required)
#    Must begin with an underscore. Identifies which kind of library
#    (_hlcpp, _llcpp, ...).
#
#  header_only (optional)
#    If true, the generated library only has a header.
#
#  source_only (optional)
#    If true, the generated library only has a source file.

template("fidl_cpp_library") {
  if (current_toolchain != fidl_toolchain) {
    _fidl_cpp_library_impl(target_name) {
      forward_variables_from(invoker, "*")
    }
  } else {
    # No-op under FIDL toolchain
    not_needed([ "target_name" ])
    not_needed(invoker, "*")
  }
}

template("_fidl_cpp_fuzzer") {
  fuzzer = invoker.fuzzer

  assert(
      defined(fuzzer.protocol),
      "FIDL protocol fuzzers must set protocol: the fully-qualified name of the protocol to be fuzzed.")

  protocol_suffix = "_" + string_replace(fuzzer.protocol, ".", "_")

  library_defines = [ "PROTOCOL${protocol_suffix}" ]
  if (defined(invoker.defines)) {
    library_defines += invoker.defines
  }
  if (defined(fuzzer.methods)) {
    foreach(method, fuzzer.methods) {
      library_defines += [ "METHOD_${method}" ]
    }
  } else {
    library_defines += [ "ALL_METHODS" ]
  }

  target_suffix = "_libfuzzer"
  fuzzer_lib_name = "${target_name}${target_suffix}${protocol_suffix}"

  fidl_cpp_library(fuzzer_lib_name) {
    library_name = invoker.library_name
    forward_variables_from(invoker,
                           [
                             "testonly",
                             "visibility",
                             "public_deps",
                             "fidl_target_name",
                           ])
    output_stem = "cpp/libfuzzer"
    target_suffix = target_suffix
    additional_public_deps = [ ":${invoker.fidl_target_name}_libfuzzer" ]
    defines = library_defines
    source_only = true
  }
}

# Generates various C++ FIDL bindings: HLCPP, LLCPP, and fuzzers.
#
# Note:
# - Under the FIDL toolchain, we would create targets that generate
#   the HLCPP/LLCPP bindings.
# - Under other toolchains, we would create library targets that
#   reference the generated code.

template("fidl_cpp_family") {
  # Allow users to override the library name by specifying a
  # "name" variable in the `fidl("my_lib")` template invocation.
  # Otherwise, default to the `target_name` of the FIDL library.
  #
  # Note that library names will have implication on the generated
  # include paths, hence should be separate from `target_name`.
  library_name = target_name
  if (defined(invoker.name)) {
    library_name = invoker.name
  }

  # `target_name` becomes clobbered in template invocation scopes;
  # back it up here.
  fidl_target_name = target_name

  # `sources` is only required to invoke `fidlc`;
  # the bindings code generation consumes the JSON IR instead.
  not_needed(invoker, [ "sources" ])

  # Determine the C++ bindings dependencies based on Fuchsia/host.
  # Additionally, an empty llcpp_public_deps indicates that the LLCPP
  # bindings for this library is not needed.
  llcpp_public_deps = []
  if (is_fuchsia) {
    not_needed(invoker, [ "host_llcpp" ])
    hlcpp_public_deps = [ "//sdk/lib/fidl/cpp" ]
    llcpp_public_deps = [
      "//zircon/public/lib/fidl",
      "//zircon/public/lib/fidl-llcpp",
      "//zircon/public/lib/fit",
    ]
  } else {
    # On host.
    hlcpp_public_deps = [ "//sdk/lib/fidl/cpp:cpp_base" ]
    if (defined(invoker.host_llcpp) && invoker.host_llcpp) {
      llcpp_public_deps = [
        "//zircon/public/lib/fidl-llcpp",
        "//zircon/public/lib/fit",
      ]
    } else {
      # Do not generate LLCPP if not requested.
      llcpp_public_deps = []
    }
  }

  common_options = {
    fidl_target_name = fidl_target_name
    library_name = library_name
    forward_variables_from(invoker, [ "testonly" ])
  }

  natural_types_public_deps = [ "//sdk/lib/fidl/cpp:cpp_base" ]

  #
  # HLCPP Bindings
  #

  # Define C++ natural types target.
  # They are generated using the HLCPP backend.
  fidl_cpp_codegen("${target_name}_cpp_natural_types") {
    forward_variables_from(common_options, "*")
    output_stem = "cpp/natural_types"
    fidlgen_tool = "//tools/fidl/fidlgen_hlcpp"
    additional_fidlgen_arguments =
        [ "--experimental-split-generation-domain-objects" ]
  }
  fidl_cpp_library("${target_name}_cpp_natural_types") {
    forward_variables_from(invoker,
                           [
                             "public_deps",
                             "visibility",
                           ])
    forward_variables_from(common_options, "*")
    output_stem = "cpp/natural_types"
    target_suffix = "_cpp_natural_types"
    additional_public_deps = natural_types_public_deps
  }

  # Define HLCPP target.
  fidl_cpp_codegen("${target_name}_hlcpp") {
    forward_variables_from(common_options, "*")
    output_stem = "cpp/fidl"
    fidlgen_tool = "//tools/fidl/fidlgen_hlcpp"
  }
  fidl_cpp_library("${target_name}_hlcpp") {
    forward_variables_from(invoker,
                           [
                             "public_deps",
                             "visibility",
                           ])
    forward_variables_from(common_options, "*")
    output_stem = "cpp/fidl"
    target_suffix = "_hlcpp"
    additional_public_deps = hlcpp_public_deps
  }
  if (current_toolchain != fidl_toolchain) {
    # Set up an alias from ":my_lib_hlcpp" to ":my_lib"
    group(target_name) {
      forward_variables_from(invoker, [ "testonly" ])
      public_deps = [ ":${target_name}_hlcpp" ]
    }

    # Set up an SDK item for this library
    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 = "${target_name}_sdk"
      sdk_atom_alias(sdk_target_name) {
        atom = ":$sdk_target_name($fidl_toolchain)"
      }
    }
  }

  #
  # LLCPP Bindings
  #

  # Define LLCPP target, if requested.
  if (llcpp_public_deps != []) {
    fidl_llcpp_codegen("${target_name}_llcpp") {
      forward_variables_from(common_options, "*")
      output_stem = "llcpp/fidl"
    }
    fidl_cpp_library("${target_name}_llcpp") {
      forward_variables_from(invoker,
                             [
                               "public_deps",
                               "visibility",
                             ])
      forward_variables_from(common_options, "*")
      output_stem = "llcpp/fidl"
      target_suffix = "_llcpp"
      additional_public_deps = llcpp_public_deps
    }
  }

  #
  # Fuzzers (also dependent on HLCPP)
  #

  # Define fuzzer targets.
  fidl_cpp_codegen("${target_name}_libfuzzer") {
    forward_variables_from(invoker, [ "fuzzers" ])
    forward_variables_from(common_options, "*")
    output_stem = "cpp/libfuzzer"
    fidlgen_tool = "//tools/fidl/fidlgen_libfuzzer"
  }

  # Define fuzzer header library.
  fidl_cpp_library("${target_name}_libfuzzer") {
    forward_variables_from(invoker,
                           [
                             "public_deps",
                             "visibility",
                           ])
    forward_variables_from(common_options, "*")
    output_stem = "cpp/libfuzzer"
    target_suffix = "_libfuzzer"
    additional_public_deps = [
      "//zircon/system/ulib/async-default",
      "//zircon/system/ulib/async-loop:async-loop-cpp",
      "//zircon/system/ulib/async-loop:async-loop-default",

      # The generated headers `#include` the hlcpp bindings headers
      # generated by the clause above, so the generated target needs
      # that bindings library target in its public_deps.
      ":${fidl_target_name}_hlcpp",
    ]
    header_only = true
  }

  # Define fuzzer implementation libraries (one per fuzzed protocol).
  # The source file is the same - different macro definitions
  # are used to customize the fuzzing configuration.
  if (defined(invoker.fuzzers)) {
    foreach(fuzzer, invoker.fuzzers) {
      _fidl_cpp_fuzzer(target_name) {
        forward_variables_from(invoker, "*")
        fidl_target_name = fidl_target_name
      }
    }
  }
}
