%YAML 1.2
--- |
  # GRPC Bazel BUILD file.
  # This currently builds C, C++ and Objective-C code.
  # This file has been automatically generated from a template file.
  # Please look at the templates directory instead.
  # This file can be regenerated from the template by running
  # tools/buildgen/generate_projects.sh
  
  # Copyright 2015, Google Inc.
  # All rights reserved.
  #
  # Redistribution and use in source and binary forms, with or without
  # modification, are permitted provided that the following conditions are
  # met:
  #
  #     * Redistributions of source code must retain the above copyright
  # notice, this list of conditions and the following disclaimer.
  #     * Redistributions in binary form must reproduce the above
  # copyright notice, this list of conditions and the following disclaimer
  # in the documentation and/or other materials provided with the
  # distribution.
  #     * Neither the name of Google Inc. nor the names of its
  # contributors may be used to endorse or promote products derived from
  # this software without specific prior written permission.
  #
  # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  
  licenses(["notice"])  # 3-clause BSD
  
  package(default_visibility = ["//visibility:public"])
  
  <%!
  def get_deps(target_dict):
    deps = []
    if target_dict.get('secure', False):
      deps = [
        "//external:libssl",
      ]
    if target_dict.get('build', None) == 'protoc':
      deps.append("//external:protobuf_compiler")
    if target_dict['name'] == 'grpc++_unsecure' or target_dict['name'] == 'grpc++':
      deps.append("//external:protobuf_clib")
    elif target_dict['name'] == 'grpc':
      deps.append("//external:zlib")
    for d in target_dict.get('deps', []):
      if d.find('//') == 0 or d[0] == ':':
        deps.append(d)
      else:
        deps.append(':%s' % (d))
    return deps
  %>
  
  % for lib in libs:
  % if lib.build in ("all", "protoc"):
  ${cc_library(lib)}
  % endif
  % endfor
  
  % for lib in libs:
  % if lib.name in ("grpc", "gpr"):
  ${objc_library(lib)}
  % endif
  % endfor
  
  % for tgt in targets:
  % if tgt.build == 'protoc':
  ${cc_binary(tgt)}
  % endif
  % endfor
  
  <%def name="cc_library(lib)">
  cc_library(
    name = "${lib.name}",
    srcs = [
  % for hdr in lib.get("headers", []):
      "${hdr}",
  % endfor
  % for src in lib.src:
      "${src}",
  % endfor
    ],
    hdrs = [
  % for hdr in lib.get("public_headers", []):
      "${hdr}",
  % endfor
    ],
    includes = [
      "include",
      ".",
    ],
    deps = [
  % for dep in get_deps(lib):
      "${dep}",
  % endfor
    ],
  % if lib.name in ("grpc", "grpc_unsecure"):
    copts = [
      "-std=gnu99",
    ],
  % endif
  )
  </%def>
  
  <%def name="objc_library(lib)">
  objc_library(
    name = "${lib.name}_objc",
    srcs = [
  % for src in lib.src:
      "${src}",
  % endfor
    ],
    hdrs = [
  % for hdr in lib.get("public_headers", []):
      "${hdr}",
  % endfor
  % for hdr in lib.get("headers", []):
      "${hdr}",
  % endfor
    ],
    includes = [
      "include",
      ".",
    ],
    deps = [
  % for dep in lib.get("deps", []):
      ":${dep}_objc",
  % endfor
  % if lib.get('secure', False):
      "//external:libssl_objc",
  % endif
    ],
  % if lib.get("baselib", false):
    sdk_dylibs = ["libz"],
  % endif
  )
  </%def>
  
  <%def name="cc_binary(tgt)">
  cc_binary(
    name = "${tgt.name}",
    srcs = [
  % for src in tgt.src:
      "${src}",
  % endfor
    ],
    deps = [
  % for dep in get_deps(tgt):
      "${dep}",
  % endfor
    ],
  )
  </%def>
  
  objc_path = "src/objective-c"
  
  rx_library_path = objc_path + "/RxLibrary"
  
  objc_library(
    name = "rx_library",
    hdrs = glob([
      rx_library_path + "/*.h",
      rx_library_path + "/transformations/*.h",
    ]),
    srcs = glob([
      rx_library_path + "/*.m",
      rx_library_path + "/transformations/*.m",
    ]),
    includes = [objc_path],
    deps = [
      ":rx_library_private",
    ],
  )
  
  objc_library(
    name = "rx_library_private",
    hdrs = glob([rx_library_path + "/private/*.h"]),
    srcs = glob([rx_library_path + "/private/*.m"]),
    visibility = ["//visibility:private"],
  )
  
  objc_client_path = objc_path + "/GRPCClient"
  
  objc_library(
    name = "grpc_client",
    hdrs = glob([
      objc_client_path + "/*.h",
      objc_client_path + "/private/*.h",
    ]),
    srcs = glob([
      objc_client_path + "/*.m",
      objc_client_path + "/private/*.m",
    ]),
    includes = [objc_path],
    bundles = [":gRPCCertificates"],
    deps = [
      ":grpc_objc",
      ":rx_library",
    ],
  )
  
  objc_bundle_library(
      # The choice of name is signicant here, since it determines the bundle name.
      name = "gRPCCertificates",
      resources = ["etc/roots.pem"],
  )
  
  proto_objc_rpc_path = objc_path + "/ProtoRPC"
  
  objc_library(
    name = "proto_objc_rpc",
    hdrs = glob([
      proto_objc_rpc_path + "/*.h",
    ]),
    srcs = glob([
      proto_objc_rpc_path + "/*.m",
    ]),
    includes = [objc_path],
    deps = [
      ":grpc_client",
      ":rx_library",
      "//external:protobuf_objc",
    ],
  )
