text: # Copyright 2016 gRPC authors.
  #
  # Licensed under the Apache License, Version 2.0 (the "License");
  # you may not use this file except in compliance with the License.
  # You may obtain a copy of the License at
  #
  #     http://www.apache.org/licenses/LICENSE-2.0
  #
  # Unless required by applicable law or agreed to in writing, software
  # distributed under the License is distributed on an "AS IS" BASIS,
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  # See the License for the specific language governing permissions and
  # limitations under the License.
  
  #
  # This is for the gRPC build system. This isn't intended to be used outsite of
  # the BUILD file for gRPC. It contains the mapping for the template system we
  # use to generate other platform's build system files.
  #
  # Please consider that there should be a high bar for additions and changes to
  # this file.
  # Each rule listed must be re-written for Google's internal build system, and
  # each change must be ported from one to the other.
  #
  
  # The set of pollers to test against if a test exercises polling
  POLLERS = ['epollex', 'epollsig', 'epoll1', 'poll', 'poll-cv']
  
  def grpc_cc_library(name, srcs = [], public_hdrs = [], hdrs = [],
                      external_deps = [], deps = [], standalone = False,
                      language = "C++", testonly = False, visibility = None,
                      alwayslink = 0):
    copts = []
    if language.upper() == "C":
      copts = ["-std=c99"]
    native.cc_library(
      name = name,
      srcs = srcs,
      defines = select({"//:grpc_no_ares": ["GRPC_ARES=0"],
                        "//conditions:default": [],}) +
                select({"//:remote_execution":  ["GRPC_PORT_ISOLATED_RUNTIME=1"],
                        "//conditions:default": [],}),
      hdrs = hdrs + public_hdrs,
      deps = deps + ["//external:" + dep for dep in external_deps],
      copts = copts,
      visibility = visibility,
      testonly = testonly,
      linkopts = ["-pthread"],
      includes = [
          "include"
      ],
      alwayslink = alwayslink,
    )
  
  def grpc_proto_plugin(name, srcs = [], deps = []):
    native.cc_binary(
      name = name,
      srcs = srcs,
      deps = deps,
    )
  
  load("//:bazel/cc_grpc_library.bzl", "cc_grpc_library")
  
  def grpc_proto_library(name, srcs = [], deps = [], well_known_protos = False,
                         has_services = True, use_external = False, generate_mock = False):
    cc_grpc_library(
      name = name,
      srcs = srcs,
      deps = deps,
      well_known_protos = well_known_protos,
      proto_only = not has_services,
      use_external = use_external,
      generate_mock = generate_mock,
    )
  
  def grpc_cc_test(name, srcs = [], deps = [], external_deps = [], args = [], data = [], uses_polling = True, language = "C++"):
    copts = []
    if language.upper() == "C":
      copts = ["-std=c99"]
    args = {
      'name': name,
      'srcs': srcs,
      'args': args,
      'data': data,
      'deps': deps + ["//external:" + dep for dep in external_deps],
      'copts': copts,
      'linkopts': ["-pthread"],
    }
    if uses_polling:
      native.cc_binary(testonly=True, **args)
      for poller in POLLERS:
        native.sh_test(
          name = name + '@poller=' + poller,
          data = [name],
          srcs = [
            '//test/core/util:run_with_poller_sh',
          ],
          args = [
            poller,
            '$(location %s)' % name
          ],
        )
    else:
      native.cc_test(**args)
  
  def grpc_cc_binary(name, srcs = [], deps = [], external_deps = [], args = [], data = [], language = "C++", testonly = False, linkshared = False, linkopts = []):
    copts = []
    if language.upper() == "C":
      copts = ["-std=c99"]
    native.cc_binary(
      name = name,
      srcs = srcs,
      args = args,
      data = data,
      testonly = testonly,
      linkshared = linkshared,
      deps = deps + ["//external:" + dep for dep in external_deps],
      copts = copts,
      linkopts = ["-pthread"] + linkopts,
    )
  
  def grpc_generate_one_off_targets():
    pass
  
  def grpc_sh_test(name, srcs, args = [], data = []):
    native.sh_test(
      name = name,
      srcs = srcs,
      args = args,
      data = data)
  
  def grpc_sh_binary(name, srcs, data = []):
    native.sh_test(
      name = name,
      srcs = srcs,
      data = data)
  
  def grpc_py_binary(name, srcs, data = [], deps = []):
    if name == "test_dns_server":
      # TODO: allow running test_dns_server in oss bazel test suite
      deps = []
    native.py_binary(
      name = name,
      srcs = srcs,
      data = data,
      deps = deps)
  
  def grpc_package(name, visibility = "private", features = []):
    if visibility == "tests":
      visibility = ["//test:__subpackages__"]
    elif visibility == "public":
      visibility = ["//visibility:public"]
    elif visibility == "private":
      visibility = []
    else:
      fail("Unknown visibility " + visibility)
  
    if len(visibility) != 0:
      native.package(
        default_visibility = visibility,
        features = features
      )
  