%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++' or
        target_dict['name'] == 'grpc++_codegen_lib'):
      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)">
  <%
    lib_hdrs = lib.get("headers", [])
    hdrs = [h for h in lib_hdrs if not h.startswith('third_party/nanopb')]
    srcs = [s for s in lib.src if not s.startswith('third_party/nanopb')]
    uses_nanopb = len(lib_hdrs) != len(hdrs) or len(srcs) != len(lib.src)
  %>
  cc_library(
    name = "${lib.name}",
    srcs = [
  % for hdr in hdrs:
      "${hdr}",
  % endfor
  % for src in srcs:
      "${src}",
  % endfor
    ],
    hdrs = [
  % for hdr in lib.get("public_headers", []):
      "${hdr}",
  % endfor
    ],
    includes = [
      "include",
      ".",
    ],
    deps = [
  % for dep in get_deps(lib):
      "${dep}",
  % endfor
  % if uses_nanopb:
      "//external:nanopb",
  % endif
    ],
  % if lib.name in ("grpc", "grpc_unsecure"):
    copts = [
      "-std=gnu99",
    ],
  % endif
  )
  </%def>
  
  <%def name="objc_library(lib)">
  <%
    lib_hdrs = lib.get("headers", [])
    hdrs = [h for h in lib_hdrs if not h.startswith('third_party/nanopb')]
    srcs = [s for s in lib.src if not s.startswith('third_party/nanopb')]
    uses_nanopb = len(lib_hdrs) != len(hdrs) or len(srcs) != len(lib.src)
  %>
  objc_library(
    name = "${lib.name}_objc",
    srcs = [
  % for src in srcs:
      "${src}",
  % endfor
    ],
    hdrs = [
  % for hdr in lib.get("public_headers", []):
      "${hdr}",
  % endfor
  % for hdr in hdrs:
      "${hdr}",
  % endfor
    ],
    includes = [
      "include",
      ".",
    ],
    deps = [
  % for dep in lib.get("deps", []):
      ":${dep}_objc",
  % endfor
  % if lib.get('secure', False):
      "//external:libssl_objc",
  % endif
  % if uses_nanopb:
      "//external:nanopb",
  % 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",
    ],
  )