# Copyright 2018 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

# Compile protocol buffers.
#
# Paramaeters:
#   proto_in_dir
#       Input directory.
#   proto_out_dir
#       Output directory.
#   sources
#       The proto file paths.
#   configs (optional)
#       Configs applied to the generated library.
#   deps (optional)
#       Deps applied to the generated library.
#   gen_python (optional)
#       If true, generates Python binding.
#   gen_go (optional)
#       If true, generates Go binding.
#   gen_go_grpc (optional)
#       If true, generates Go GRPC.
#   gen_grpc (optional)
#       If true, generates C++ GRPC.
#   use_shared_library (optional)
#       If true, generates a shared library instead of a static library.
template("proto_library") {
  action_name = "${target_name}_gen"
  action_foreach(action_name) {
    visibility = [ ":*" ]

    forward_variables_from(invoker,
                           [
                             "proto_in_dir",
                             "proto_out_dir",
                             "gen_python",
                             "gen_go",
                             "gen_go_grpc",
                             "gen_grpc",

                             # Sources might be generated by actions in deps,
                             # which must be explicitly specified.
                             "deps",
                           ])

    cc_dir = "${root_gen_dir}/${proto_out_dir}"
    proto_in_dir = rebase_path(proto_in_dir)
    proto_out_dir = rebase_path(proto_out_dir)

    if (!defined(gen_python)) {
      gen_python = false
    }
    if (!defined(gen_go)) {
      gen_go = false
    }
    if (!defined(gen_go_grpc)) {
      gen_go_grpc = false
    }
    if (!defined(gen_grpc)) {
      gen_grpc = false
    }
    sources = invoker.sources

    script = "//common-mk/file_generator_wrapper.py"
    args = [
      "protoc",
      "--proto_path",
      "${proto_in_dir}",
      "--proto_path",
      "${sysroot}/usr/share/proto",
      "${proto_in_dir}/{{source_name_part}}.proto",
    ]
    outputs = []
    if (gen_go) {
      go_dir = "${root_gen_dir}/${proto_out_dir}"
      args += [
        "--go_out",
        "${go_dir}",
      ]
      outputs += [ "${go_dir}/{{source_name_part}}.pb.go" ]
    }
    if (gen_python) {
      python_dir = "${root_gen_dir}/${proto_out_dir}/py"
      args += [
        "--python_out",
        "${python_dir}",
      ]
      outputs += [ "${python_dir}/{{source_name_part}}_pb.py" ]
    }
    if (gen_grpc == 1) {
      args += [
        "--grpc_out=${cc_dir}",
        "--plugin=protoc-gen-grpc=${grpc_cpp_plugin}",
        "--cpp_out=${cc_dir}",
      ]
      outputs += [
        "${cc_dir}/{{source_name_part}}.grpc.pb.cc",
        "${cc_dir}/{{source_name_part}}.grpc.pb.h",
        "${cc_dir}/{{source_name_part}}.pb.cc",
        "${cc_dir}/{{source_name_part}}.pb.h",
      ]
    }
    if (gen_go_grpc) {
      args += [ "--go_out=plugins=grpc:${go_dir}" ]
      outputs += [ "${go_dir}/{{source_name_part}}.pb.go" ]
    }
    if (!gen_grpc && !gen_go_grpc && !gen_go && !gen_python) {
      args += [
        "--cpp_out",
        "${cc_dir}",
      ]
      outputs += [
        "${cc_dir}/{{source_name_part}}.pb.cc",
        "${cc_dir}/{{source_name_part}}.pb.h",
      ]
    }
  }

  my_type = "static_library"
  if (defined(invoker.use_shared_library) && invoker.use_shared_library) {
    my_type = "shared_library"
  }
  target(my_type, target_name) {
    forward_variables_from(invoker,
                           [
                             "defines",
                             "visibility",
                           ])
    if (defined(invoker.configs)) {
      configs += invoker.configs
    }
    sources = get_target_outputs(":${action_name}")
    deps = [
      ":${action_name}",
    ]
    if (defined(invoker.deps)) {
      deps += invoker.deps
    }
  }
}
