%YAML 1.2
--- |
  # GRPC CocoaPods podspec
  # 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.

  <%!
  def grpc_files(libs):
    out = []
    for lib in libs:
      if lib.name in ("grpc", "gpr"):
        out += lib.get('headers', [])
        out += lib.get('public_headers', [])
        out += lib.get('src', [])
    return out;
  
  def grpc_private_headers(libs):
    out = []
    for lib in libs:
      if lib.name in ("grpc", "gpr"):
        out += lib.get('headers', [])
    return out
  %>
  Pod::Spec.new do |s|
    s.name     = 'gRPC'
    version = '0.11.2'
    s.version  = version
    s.summary  = 'gRPC client library for iOS/OSX'
    s.homepage = 'http://www.grpc.io'
    s.license  = 'New BSD'
    s.authors  = { 'The gRPC contributors' => 'grpc-packages@google.com' }

    s.source = { :git => 'https://github.com/grpc/grpc.git',
                 :tag => "release-#{version.gsub(/\./, '_')}-objectivec-#{version}" }

  
    s.ios.deployment_target = '7.1'
    s.osx.deployment_target = '10.9'
    s.requires_arc = true
  
    objc_dir = 'src/objective-c'

    # Reactive Extensions library for iOS.
    s.subspec 'RxLibrary' do |ss|
      src_dir = "#{objc_dir}/RxLibrary"
      ss.source_files = "#{src_dir}/*.{h,m}", "#{src_dir}/**/*.{h,m}"
      ss.private_header_files = "#{src_dir}/private/*.h"
      ss.header_mappings_dir = "#{objc_dir}"
    end

    # Core cross-platform gRPC library, written in C.
    s.subspec 'C-Core' do |ss|
      ss.source_files = ${(',\n' + 22*' ').join('\'%s\'' % f for f in grpc_files(libs))}

      ss.private_header_files = ${(',\n' + 30*' ').join('\'%s\'' % f for f in grpc_private_headers(libs))}

      ss.header_mappings_dir = '.'
      # This isn't officially supported in Cocoapods. We've asked for an alternative:
      # https://github.com/CocoaPods/CocoaPods/issues/4386
      ss.xcconfig = {
        'USE_HEADERMAP' => 'NO',
        'ALWAYS_SEARCH_USER_PATHS' => 'NO',
        'USER_HEADER_SEARCH_PATHS' => '"$(PODS_ROOT)/Headers/Private/gRPC"',
        'HEADER_SEARCH_PATHS' => '"$(PODS_ROOT)/Headers/Private/gRPC/include"'
      }

      ss.requires_arc = false
      ss.libraries = 'z'
      ss.dependency 'OpenSSL', '~> 1.0.200'

      # ss.compiler_flags = '-GCC_WARN_INHIBIT_ALL_WARNINGS', '-w'
    end

    # Objective-C wrapper around the core gRPC library.
    s.subspec 'GRPCClient' do |ss|
      src_dir = "#{objc_dir}/GRPCClient"
      ss.source_files = "#{src_dir}/*.{h,m}", "#{src_dir}/**/*.{h,m}"
      ss.private_header_files = "#{src_dir}/private/*.h"
      ss.header_mappings_dir = "#{objc_dir}"

      ss.dependency 'gRPC/C-Core'
      ss.dependency 'gRPC/RxLibrary'

      # Certificates, to be able to establish TLS connections:
      ss.resource_bundles = { 'gRPCCertificates' => ['etc/roots.pem'] }
    end

    # RPC library for ProtocolBuffers, based on gRPC
    s.subspec 'ProtoRPC' do |ss|
      src_dir = "#{objc_dir}/ProtoRPC"
      ss.source_files = "#{src_dir}/*.{h,m}"
      ss.header_mappings_dir = "#{objc_dir}"

      ss.dependency 'gRPC/GRPCClient'
      ss.dependency 'gRPC/RxLibrary'
      ss.dependency 'Protobuf', '~> 3.0.0-alpha-4'
    end
  end
