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

# Define the include patterns for various binding flavors.
# Includes will be of the form <my/library/{output-stem}.h>
_hlcpp_output_stem = "cpp/fidl"

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")
  root = "$fidl_target_gen_dir/$fidl_target_name/${invoker.bindings_flavor}"

  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) {
    # supply defaults for various options
    forward_variables_from(invoker, [ "testonly" ])

    visibility = generation_visibility

    tool = invoker.fidlgen_tool

    inputs = [ json_representation ]
    outputs = []
    if (defined(invoker.generated_sources)) {
      foreach(output, invoker.generated_sources) {
        outputs += [ "$root/$output" ]
      }
    }
    if (defined(invoker.generated_headers)) {
      foreach(output, invoker.generated_headers) {
        outputs += [ "$root/$output" ]
      }
    }

    args = [
      "--json",
      rebase_path(json_representation, root_build_dir),
      "--clang-format-path",
      "${rebased_clang_prefix}/clang-format",
      "--root",
      rebase_path(root, root_build_dir),
    ]

    if (defined(invoker.experiments)) {
      foreach(experiment, invoker.experiments) {
        args += [
          "--experiment",
          experiment,
        ]
      }
    }

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

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

# Generates C++ code for a given FIDL library: low-level C++ bindings,
# high-level C++ bindings, natural domain objects, unified C++ bindings,
# or the fuzzer header library.
#
# Parameters
#
#  fidl_target_name (required)
#    Name of the GN target corresponding to the FIDL library.
#
#  bindings_flavor (required)
#    Identifies which kind of library (hlcpp, llcpp, ...).
#    This should be the same flavor as the one used when instantiating
#    the fidl_cpp_library template.
#
#  generated_sources (optional)
#    A list of source files that will be generated for this binding, relative
#    to the target-specific generation directory.
#
#  generated_headers (optional)
#    A list of header files that will be generated for this binding, relative
#    to the target-specific generation directory.
#
#  fidlgen_tool (required)
#    The code generation tool to use, as an absolute GN label.
#
#   fuzzers (optional)
#     A list of { protocol = ..., methods = ... } scopes declaring which
#     methods will be fuzzed by a fuzzer.

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_cpp_library_impl") {
  generation_target_name =
      "${invoker.fidl_target_name}_${invoker.bindings_flavor}_generate"

  not_needed(invoker, [ "library_name" ])
  fidl_target_name = invoker.fidl_target_name
  fidl_target_gen_dir =
      get_label_info(":$target_name($fidl_toolchain)", "target_gen_dir")
  root = "$fidl_target_gen_dir/$fidl_target_name/${invoker.bindings_flavor}"

  if (defined(invoker.generated_headers)) {
    config_target_name = "${target_name}__config"
    config(config_target_name) {
      include_dirs = [ root ]
    }
  }

  source_set(target_name) {
    forward_variables_from(invoker,
                           [
                             "defines",
                             "testonly",
                             "visibility",
                           ])
    sources = []
    public = []
    if (defined(invoker.generated_sources)) {
      foreach(source, invoker.generated_sources) {
        sources += [ "$root/$source" ]
      }
    }
    if (defined(invoker.generated_headers)) {
      foreach(header, invoker.generated_headers) {
        sources += [ "$root/$header" ]
        public += [ "$root/$header" ]
      }
    }

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

    if (defined(invoker.additional_configs)) {
      configs += invoker.additional_configs
    }

    if (defined(invoker.generated_headers)) {
      # 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 bindings_flavor).
    not_needed(invoker, [ "bindings_flavor" ])
    if (defined(invoker.public_deps)) {
      foreach(dep, invoker.public_deps) {
        label = get_label_info(dep, "label_no_toolchain")
        public_deps += [ "${label}_${invoker.bindings_flavor}" ]
      }
    }

    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.
#
#  bindings_flavor (required)
#    Identifies which kind of library (hlcpp, llcpp, ...).
#    This should be the same suffix as the one used when instantiating
#    the fidl_cpp_codegen template.
#
#  generated_sources (optional)
#    A list of source files that will be generated for this binding, relative
#    to the target-specific generation directory.
#
#  generated_headers (optional)
#    A list of header files that will be generated for this binding, relative
#    to the target-specific generation directory.
#
#  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, "*")
  }
}

# Generates various C++ FIDL bindings: HLCPP, LLCPP, Unified C++, and fuzzers.
#
# Note:
# - Under the FIDL toolchain, we would create action targets that
#   generate the C++ 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
  }
  library_name_slashes = string_replace(library_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 = [
      "//sdk/lib/fit",
      "//zircon/system/ulib/fidl",
      "//zircon/system/ulib/fidl:fidl-llcpp",
    ]
  } else {
    # On host.
    hlcpp_public_deps = [ "//sdk/lib/fidl/cpp:cpp_base" ]
    if (defined(invoker.host_llcpp) && invoker.host_llcpp) {
      llcpp_public_deps = [
        "//sdk/lib/fit",
        "//zircon/system/ulib/fidl:fidl-llcpp",
      ]
    } else {
      # Do not generate LLCPP if not requested.
      llcpp_public_deps = []
    }
  }

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

  #
  # HLCPP Bindings
  #

  natural_types_options = {
    bindings_flavor = "cpp_natural_types"
    generated_headers = [ "$library_name_slashes/cpp/natural_types.h" ]
    generated_sources = [ "$library_name_slashes/cpp/natural_types.cc" ]
  }

  # 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, "*")
    forward_variables_from(natural_types_options, "*")
    fidlgen_tool = "//tools/fidl/fidlgen_hlcpp"
    experiments = [ "natural-types" ]
  }
  fidl_cpp_library("${target_name}_cpp_natural_types") {
    forward_variables_from(invoker,
                           [
                             "public_deps",
                             "visibility",
                           ])
    forward_variables_from(common_options, "*")
    forward_variables_from(natural_types_options, "*")
    additional_public_deps = [ "//sdk/lib/fidl/cpp:cpp_base" ]
  }

  # Define HLCPP target.
  # TODO(fxbug.dev/64093): Currently the HLCPP generated code embeds the
  # natural types inline. Change this to depend on the dedicated natural types
  # target when the unified bindings and HLCPP are used in one program.

  hlcpp_options = {
    bindings_flavor = "hlcpp"
    generated_headers = [
      "$library_name_slashes/cpp/fidl.h",
      "$library_name_slashes/cpp/fidl_test_base.h",
    ]
    generated_sources = [ "$library_name_slashes/cpp/fidl.cc" ]
  }

  fidl_cpp_codegen("${target_name}_hlcpp") {
    forward_variables_from(common_options, "*")
    forward_variables_from(hlcpp_options, "*")
    fidlgen_tool = "//tools/fidl/fidlgen_hlcpp"
  }
  fidl_cpp_library("${target_name}_hlcpp") {
    forward_variables_from(invoker,
                           [
                             "public_deps",
                             "visibility",
                           ])
    forward_variables_from(common_options, "*")
    forward_variables_from(hlcpp_options, "*")
    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 != []) {
    llcpp_options = {
      bindings_flavor = "llcpp"
      generated_headers = [
        "fidl/$library_name/cpp/markers.h",
        "fidl/$library_name/cpp/wire.h",
        "fidl/$library_name/cpp/wire_messaging.h",
        "fidl/$library_name/cpp/wire_types.h",
        "fidl/$library_name/cpp/wire_test_base.h",
      ]
      generated_sources = [
        "fidl/$library_name/cpp/wire_messaging.cc",
        "fidl/$library_name/cpp/wire_types.cc",
      ]
    }
    fidl_cpp_codegen("${target_name}_llcpp") {
      forward_variables_from(common_options, "*")
      forward_variables_from(llcpp_options, "*")
      fidlgen_tool = "//tools/fidl/fidlgen_llcpp"
    }
    fidl_cpp_library("${target_name}_llcpp") {
      forward_variables_from(invoker,
                             [
                               "public_deps",
                               "visibility",
                             ])
      forward_variables_from(common_options, "*")
      forward_variables_from(llcpp_options, "*")
      additional_public_deps = llcpp_public_deps
    }
  }

  # Unified C++ Bindings
  #
  # The unified bindings imports the natural types from HLCPP and the
  # entire LLCPP bindings, and extends it with messaging APIs that works
  # with the natural types.
  #

  # Define the unified bindings target.
  # Note that we also check llcpp_public_deps here, because we would not
  # generate the corresponding LLCPP bindings if it was empty.
  if (llcpp_public_deps != [] && is_fuchsia) {
    cpp_options = {
      bindings_flavor = "cpp"
      generated_headers = [ "$library_name_slashes/cpp/fidl_v2.h" ]
      generated_sources = [ "$library_name_slashes/cpp/fidl_v2.cc" ]
    }

    fidl_cpp_codegen("${target_name}_cpp") {
      forward_variables_from(common_options, "*")
      forward_variables_from(cpp_options, "*")
      fidlgen_tool = "//tools/fidl/fidlgen_cpp"
    }
    fidl_cpp_library("${target_name}_cpp") {
      forward_variables_from(invoker,
                             [
                               "public_deps",
                               "visibility",
                             ])
      forward_variables_from(common_options, "*")
      forward_variables_from(cpp_options, "*")
      additional_public_deps = [
        ":${fidl_target_name}_cpp_natural_types",
        ":${fidl_target_name}_llcpp",
        "//src/lib/fidl/cpp",
      ]
    }
  }

  #
  # Fuzzers (also dependent on HLCPP and LLCPP)
  #

  libfuzzer_options = {
    testonly = true
    bindings_flavor = "libfuzzer"
  }
  libfuzzer_headers = [
    "$library_name_slashes/cpp/libfuzzer.h",
    "$library_name_slashes/cpp/libfuzzer_decode_encode.h",
  ]
  libfuzzer_sources = [
    "$library_name_slashes/cpp/libfuzzer.cc",
    "$library_name_slashes/cpp/libfuzzer_decode_encode.cc",
  ]

  # Define fuzzer targets.
  fidl_cpp_codegen("${target_name}_libfuzzer") {
    forward_variables_from(invoker, [ "fuzzers" ])
    forward_variables_from(common_options, "*")
    forward_variables_from(libfuzzer_options, "*")
    generated_headers = libfuzzer_headers
    generated_sources = libfuzzer_sources
    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, "*")
    forward_variables_from(libfuzzer_options, "*")
    additional_public_deps = [
      "//sdk/lib/fidl/cpp/fuzzing",
      "//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 and llcpp bindings headers
      # generated by the clauses above, so the generated target needs
      # that bindings library target in its public_deps.
      ":${fidl_target_name}_hlcpp",
      ":${fidl_target_name}_llcpp",
    ]

    # Note: `.../libfuzzer.cc` is linked with different build-time parameters below in loop
    # over `invoker.fuzzers`. The library itself contains headers only.
    generated_headers = libfuzzer_headers
  }

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

      bindings_flavor = "libfuzzer"
      fuzzer_lib_name = "${target_name}_${bindings_flavor}${protocol_suffix}"

      fidl_cpp_library(fuzzer_lib_name) {
        forward_variables_from(invoker,
                               [
                                 "visibility",
                                 "public_deps",
                                 "library_name",
                               ])
        forward_variables_from(common_options, "*")
        forward_variables_from(libfuzzer_options, "*")
        testonly = true
        defines = library_defines
        additional_public_deps = [ ":${fidl_target_name}_libfuzzer" ]
        generated_sources = libfuzzer_sources
      }
    }
  }
}
