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

template("proto_library") {
  assert(defined(invoker.sources), "Need sources for proto_library")
  proto_sources = invoker.sources

  proto_in_dir = rebase_path(get_path_info(proto_sources[0], "dir"), ".")

  if (defined(invoker.proto_out_dir)) {
    proto_out_dir = rebase_path(invoker.proto_out_dir, "//")
  } else {
    # Absolute path to the directory of current BUILD.gn file excluding "//".
    proto_out_dir = rebase_path(".", "//")
    if (proto_in_dir != ".") {
      proto_out_dir += "/$proto_in_dir"
    }
  }
  cc_out_dir = "$root_gen_dir/" + proto_out_dir
  rel_cc_out_dir = rebase_path(cc_out_dir, root_build_dir)

  protos = rebase_path(invoker.sources, proto_in_dir)
  protogens_cc = []

  # List output files.
  foreach(proto, protos) {
    proto_dir = get_path_info(proto, "dir")
    proto_name = get_path_info(proto, "name")
    proto_path = proto_dir + "/" + proto_name

    protogens_cc += [
      "$cc_out_dir/$proto_path.pb.h",
      "$cc_out_dir/$proto_path.pb.cc",
    ]
  }

  action_name = "${target_name}_gen"
  source_set_name = "$target_name"
  action(action_name) {
    visibility = [ ":$source_set_name" ]
    script = "//third_party/protobuf/protoc_wrapper.py"
    sources = proto_sources
    outputs = get_path_info(protogens_cc, "abspath")
    args = protos

    protoc_label = "//third_party/protobuf:protoc($host_toolchain)"
    protoc_path = get_label_info(protoc_label, "root_out_dir") + "/protoc"
    args += [
      # Wrapper should never pick a system protoc.
      # Path should be rebased because |root_build_dir| for current toolchain
      # may be different from |root_out_dir| of protoc built on host toolchain.
      "--protoc",
      "./" + rebase_path(protoc_path, root_build_dir),
      "--proto-in-dir",
      rebase_path(proto_in_dir, root_build_dir),
      "--cc-out-dir",
      rel_cc_out_dir,
    ]

    inputs = [ protoc_path ]
    deps = [ protoc_label ]
  }

  config_name = "${target_name}_config"
  config(config_name) {
    include_dirs = []
  }

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

    sources = get_path_info(protogens_cc, "abspath")
    public_configs = [
      "//third_party/protobuf:using_proto",
      ":$config_name",
    ]
    public_deps = [ ":$action_name" ]
    if (defined(invoker.use_protobuf_full) &&
        invoker.use_protobuf_full == true) {
      public_deps += [ "//third_party/protobuf:protobuf_full" ]
    } else {
      public_deps += [ "//third_party/protobuf:protobuf_lite" ]
    }

    deps = []
    if (defined(invoker.deps)) {
      deps += invoker.deps
    }

    if (defined(invoker.removed_configs)) {
      configs -= invoker.removed_configs
    }
    if (defined(invoker.extra_configs)) {
      configs += invoker.extra_configs
    }
  }
}
