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

# Helper file to convert text format protobuf files to binary format.

# Note: This file is similar to proto_library.gni, but is kept separate because
# - They expect different inputs/outputs: both rules would have to set default
#   values for variables that are not really sensible.

# To use this rule, add a target to your gn file defining:
# protoc_proto_dir: The directory where the proto definition can be found.
# protoc_proto_def: Relative path to proto definition from |protoc_proto_dir|.
# protoc_message_name: The fully qualified name of the message contained in
#     the protobuf.
# protoc_text_dir: The directory where the text format protobuf[s] can be found.
# protoc_bin_dir: The full path to the output directory. Note that this path is
#     not relative to the <(SHARED_INTERMEDIATE_DIR). You must ensure that this
#     directory is unique across all platform2 projects to avoid collisions. One
#     way to do this is to include your project name in the directory path.
# Finally, specify the protobuf files in text format as the sources. These files
# should have a '.prototxt' file extension.
template("protoc_text_to_bin") {
  action_name = "${target_name}_gen"
  action_foreach(action_name) {
    visibility = [ ":*" ]

    forward_variables_from(invoker,
                           [
                             "protoc_bin_dir",
                             "protoc_message_name",
                             "protoc_proto_dir",
                             "protoc_proto_def",
                             "protoc_text_dir",

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

    protoc_proto_dir = rebase_path(protoc_proto_dir)
    protoc_text_dir = rebase_path(protoc_text_dir)

    sources = invoker.sources

    script = "//common-mk/runtime_wrapper.py"
    args = [
      "--stdin",
      "${protoc_text_dir}/{{source_file_part}}",
      "--stdout",
      "${protoc_bin_dir}/{{source_name_part}}.pbf",
      "--",
      "protoc",
      "--proto_path",
      "${protoc_proto_dir}",
      "--encode",
      "${protoc_message_name}",
      "${protoc_proto_dir}/${protoc_proto_def}",
    ]
    outputs = [ "${protoc_bin_dir}/{{source_name_part}}.pbf" ]
  }

  source_set(target_name) {
    forward_variables_from(invoker,
                           [
                             "defines",
                             "visibility",
                           ])
    if (defined(invoker.configs)) {
      configs += invoker.configs
    }
    data = get_target_outputs(":${action_name}")
    deps = [ ":${action_name}" ]
    if (defined(invoker.deps)) {
      deps += invoker.deps
    }
  }
}
