# Copyright 2014 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.

# Compile a protocol buffer.
#
# Protobuf parameters:
#
#   proto_in_dir (optional)
#       The path to the directory containing the .proto files. If left out, it
#       defaults to '.'.
#
#   proto_out_dir (optional)
#       Specifies the path suffix that output files are generated under.
#       Targets that gyp-depend on my_proto_lib will be able to include the
#       resulting proto headers with an include like:
#         #include "dir/for/my_proto_lib/foo.pb.h"
#       If undefined, this defaults to matching the input directory.
#
#   cc_generator_options (optional)
#       List of extra flags passed to the protocol compiler.  If you need to
#       add an EXPORT macro to a protobuf's C++ header, set the
#       'cc_generator_options' variable with the value:
#       'dllexport_decl=FOO_EXPORT:' (note trailing colon).
#
#       It is likely you also need to #include a file for the above EXPORT
#       macro to work. See cc_include.
#
#   cc_include (optional)
#       String listing an extra include that should be passed.
#       Example: cc_include = "foo/bar.h"
#
# Parameters for compiling the generated code:
#
#   defines (optional)
#       Defines to supply to the source set that compiles the generated source
#       code.
#
#   extra_configs (optional)
#       A list of config labels that will be appended to the configs applying
#       to the source set.
#
# Example:
#  proto_library("mylib") {
#    sources = [
#      "foo.proto",
#    ]
#  }

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

  action_name = "${target_name}_gen"
  source_set_name = target_name
  action_foreach(action_name) {
    visibility = ":$source_set_name"

    script = "//tools/protoc_wrapper/protoc_wrapper.py"

    sources = invoker.sources

    # TODO(brettw) it would be better if this used the target gen dir.
    if (defined(invoker.proto_out_dir)) {
      proto_out_dir = invoker.proto_out_dir
    } else {
      # This computes the relative path inside the target_gen_dir that
      # we'd put the files in, which maps to the current directory path.
      # We'll insert "protoc_out" at the beginning for compatibility with GYP.
      proto_out_dir = rebase_path(target_gen_dir, root_gen_dir)
    }
    cc_dir = "$root_gen_dir/protoc_out/$proto_out_dir"
    py_dir = "$root_gen_dir/pyproto/$proto_out_dir"

    outputs = [
      "$py_dir/{{source_name_part}}_pb2.py",
      "$cc_dir/{{source_name_part}}.pb.cc",
      "$cc_dir/{{source_name_part}}.pb.h",
    ]

    args = []
    if (defined(invoker.cc_include)) {
      args += [ "--include", invoker.cc_include ]
    }

    args += [
      "--protobuf",
      rebase_path("$cc_dir/{{source_name_part}}.pb.h", root_build_dir),
    ]

    if (defined(invoker.proto_in_dir)) {
      proto_in_dir = invoker.proto_in_dir
    } else {
      # Extract the current source dir.
      proto_in_dir = get_label_info(":$target_name", "dir")
    }
    args += [
      "--proto-in-dir",
      rebase_path(proto_in_dir, root_build_dir),
      "--proto-in-file", "{{source_file_part}}",
      # TODO(brettw) support system protobuf compiler.
      "--use-system-protobuf=0",
    ]

    protoc_label = "//third_party/protobuf:protoc($host_toolchain)"
    args += [
      "--", 
      # Prepend with "./" so this will never pick up the system one (normally
      # when not cross-compiling, protoc's output directory will be the same
      # as the build dir, so the relative location will be empty.
      "./" + rebase_path(get_label_info(protoc_label, "root_out_dir") +
             "/protoc", root_build_dir),
    ]

    # If passed cc_generator_options should end in a colon, which will separate
    # it from the directory when we concatenate them. The proto compiler
    # understands this syntax.
    if (defined(invoker.cc_generator_options)) {
      cc_generator_options = invoker.cc_generator_options
    } else {
      cc_generator_options = ""
    }
    args += [
      "--cpp_out", cc_generator_options + rebase_path(cc_dir, root_build_dir),
      "--python_out", rebase_path(py_dir, root_build_dir),
    ]

    deps = [ protoc_label ]
  }

  source_set(target_name) {
    if (defined(invoker.visibility)) {
      visibility = invoker.visibility
    }

    sources = get_target_outputs(":$action_name")

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

    direct_dependent_configs = [ "//third_party/protobuf:using_proto" ]

    deps = [
      ":$action_name",
      "//third_party/protobuf:protobuf_lite",
    ]

    # The generated headers reference headers within protobuf_lite, so
    # dependencies must be able to find those headers too.
    forward_dependent_configs_from = [ "//third_party/protobuf:protobuf_lite" ]
  }
}
