%YAML 1.2
--- |
  # This file has been automatically generated from a template file.
  # Please make modifications to `templates/gRPC-Core.podspec.template`
  # instead. This file can be regenerated from the template by running
  # `tools/buildgen/generate_projects.sh`.

  # gRPC Core CocoaPods podspec
  #
  # Copyright 2015 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.

  <%!
  def grpc_lib_files(libs, expect_libs, groups):
    out = []
    for lib in libs:
      if lib.name in expect_libs:
        for group in groups:
          out += lib.get(group, [])
    return out

  def grpc_private_files(libs):
    out = grpc_lib_files(libs, ("grpc", "gpr"), ("headers", "src"))
    return [file for file in out if not file.startswith("third_party/nanopb/")]

  def grpc_public_headers(libs):
    out = grpc_lib_files(libs, ("grpc", "gpr"), ("public_headers",))
    return out

  def grpc_private_headers(libs):
    out = grpc_lib_files(libs, ("grpc", "gpr"), ("headers",))
    return [file for file in out if not file.startswith("third_party/nanopb/")]

  def grpc_cronet_files(libs):
    out = grpc_lib_files(libs, ("grpc_cronet",), ("src", "headers"))
    excl = grpc_private_files(libs)
    excl += [
        # We do not need cronet dedicated plugin registry
        "src/core/plugin_registry/grpc_cronet_plugin_registry.cc",
        # We do not need dummy cronet API for ObjC
        "src/core/ext/transport/cronet/transport/cronet_api_dummy.cc",
    ]
    return [file for file in out if not file in excl]

  def grpc_cronet_public_headers(libs):
    out = grpc_lib_files(libs, ("grpc_cronet",), ("public_headers",))
    excl = grpc_public_headers(libs)
    return [file for file in out if not file in excl]

  def grpc_test_util_files(libs):
    out = grpc_lib_files(libs, ("grpc_test_util", "gpr_test_util"), ("src", "headers"))
    excl = grpc_private_files(libs)
    return [file for file in out if not file in excl]

  def end2end_tests_files(libs):
    out = grpc_lib_files(libs, ("end2end_tests",), ("src", "headers"))
    excl = grpc_private_files(libs)
    return [file for file in out if not file in excl]

  def cfstream_private_headers(libs):
    out = grpc_lib_files(libs, ("grpc_cfstream",), ("own_headers",))
    return out

  def cfstream_private_files(libs):
    out = grpc_lib_files(libs, ("grpc_cfstream",), ("own_src", "own_headers"))
    return out

  def ruby_multiline_list(files, indent):
    return (',\n' + indent*' ').join('\'%s\'' % f for f in files)
  %>
  Pod::Spec.new do |s|
    s.name     = 'gRPC-Core'
    version = '${settings.version}'
    s.version  = version
    s.summary  = 'Core cross-platform gRPC library, written in C'
    s.homepage = 'https://grpc.io'
    s.license  = 'Apache License, Version 2.0'
    s.authors  = { 'The gRPC contributors' => 'grpc-packages@google.com' }

    s.source = {
      :git => 'https://github.com/grpc/grpc.git',
      :tag => "v#{version}",
    }

    # gRPC podspecs depend on fix for https://github.com/CocoaPods/CocoaPods/issues/6024,
    # which was released in Cocoapods v1.2.0.
    s.cocoapods_version = '>= 1.2.0'

    s.ios.deployment_target = '7.0'
    s.osx.deployment_target = '10.9'
    s.requires_arc = false

    name = 'grpc'

    # When creating a dynamic framework, name it grpc.framework instead of gRPC-Core.framework.
    # This lets users write their includes like `#include <grpc/grpc.h>` as opposed to `#include
    # <gRPC-Core/grpc.h>`.
    s.module_name = name

    # When creating a dynamic framework, copy the headers under `include/grpc/` into the root of
    # the `Headers/` directory of the framework (i.e., not under `Headers/include/grpc`).
    #
    # TODO(jcanizales): Debug why this doesn't work on macOS.
    s.header_mappings_dir = 'include/grpc'

    # The above has an undesired effect when creating a static library: It forces users to write
    # includes like `#include <gRPC-Core/grpc.h>`. `s.header_dir` adds a path prefix to that, and
    # because Cocoapods lets omit the pod name when including headers of static libraries, the
    # following lets users write `#include <grpc/grpc.h>`.
    s.header_dir = name

    # The module map created automatically by Cocoapods doesn't work for C libraries like gRPC-Core.
    s.module_map = 'include/grpc/module.modulemap'

    # To compile the library, we need the user headers search path (quoted includes) to point to the
    # root of the repo, and the system headers search path (angled includes) to point to `include/`.
    # Cocoapods effectively clones the repo under `<Podfile dir>/Pods/gRPC-Core/`, and sets a build
    # variable called `$(PODS_ROOT)` to `<Podfile dir>/Pods/`, so we use that.
    #
    # Relying on the file structure under $(PODS_ROOT) isn't officially supported in Cocoapods, as it
    # is taken as an implementation detail. We've asked for an alternative, and have been told that
    # what we're doing should keep working: https://github.com/CocoaPods/CocoaPods/issues/4386
    #
    # The `src_root` value of `$(PODS_ROOT)/gRPC-Core` assumes Cocoapods is installing this pod from
    # its remote repo. For local development of this library, enabled by using `:path` in the Podfile,
    # that assumption is wrong. In such case, the following settings need to be reset with the
    # appropriate value of `src_root`. This can be accomplished in the `pre_install` hook of the
    # Podfile; see `src/objective-c/tests/Podfile` for an example.
    src_root = '$(PODS_ROOT)/gRPC-Core'
    s.pod_target_xcconfig = {
      'GRPC_SRC_ROOT' => src_root,
      'HEADER_SEARCH_PATHS' => '"$(inherited)" "$(GRPC_SRC_ROOT)/include"',
      'USER_HEADER_SEARCH_PATHS' => '"$(GRPC_SRC_ROOT)"',
      # If we don't set these two settings, `include/grpc/support/time.h` and
      # `src/core/lib/gpr/string.h` shadow the system `<time.h>` and `<string.h>`, breaking the
      # build.
      'USE_HEADERMAP' => 'NO',
      'ALWAYS_SEARCH_USER_PATHS' => 'NO',
      'GCC_PREPROCESSOR_DEFINITIONS' => '"$(inherited)" "COCOAPODS=1" "PB_NO_PACKED_STRUCTS=1"',
      'CLANG_WARN_STRICT_PROTOTYPES' => 'NO',
    }

    s.default_subspecs = 'Interface', 'Implementation'
    s.compiler_flags = '-DGRPC_ARES=0', '-DPB_FIELD_16BIT'
    s.libraries = 'c++'

    # Like many other C libraries, gRPC-Core has its public headers under `include/<libname>/` and its
    # sources and private headers in other directories outside `include/`. Cocoapods' linter doesn't
    # allow any header to be listed outside the `header_mappings_dir` (even though doing so works in
    # practice). Because we need our `header_mappings_dir` to be `include/grpc/` for the reason
    # mentioned above, we work around the linter limitation by dividing the pod into two subspecs, one
    # for public headers and the other for implementation. Each gets its own `header_mappings_dir`,
    # making the linter happy.
    #
    # The list of source files is generated by a template: `templates/gRPC-Core.podspec.template`. It
    # can be regenerated from the template by running `tools/buildgen/generate_projects.sh`.
    s.subspec 'Interface' do |ss|
      ss.header_mappings_dir = 'include/grpc'

      ss.source_files = ${ruby_multiline_list(grpc_public_headers(libs), 22)}
    end
    s.subspec 'Implementation' do |ss|
      ss.header_mappings_dir = '.'
      ss.libraries = 'z'
      ss.dependency "#{s.name}/Interface", version
      ss.dependency 'BoringSSL-GRPC', '0.0.1'
      ss.dependency 'nanopb', '~> 0.3'
      ss.compiler_flags = '-DGRPC_SHADOW_BORINGSSL_SYMBOLS'

      # To save you from scrolling, this is the last part of the podspec.
      ss.source_files = ${ruby_multiline_list(grpc_private_files(libs), 22)}

      ss.private_header_files = ${ruby_multiline_list(grpc_private_headers(libs), 30)}
    end

    s.subspec 'CFStream-Implementation' do |ss|
      ss.header_mappings_dir = '.'
      ss.dependency "#{s.name}/Implementation", version
      ss.pod_target_xcconfig = {
        'GCC_PREPROCESSOR_DEFINITIONS' => 'GRPC_CFSTREAM=1'
      }
      ss.source_files = ${ruby_multiline_list(cfstream_private_files(filegroups), 22)}
      ss.private_header_files = ${ruby_multiline_list(cfstream_private_headers(filegroups), 30)}
    end

    s.subspec 'Cronet-Interface' do |ss|
      ss.header_mappings_dir = 'include/grpc'
      ss.source_files = ${ruby_multiline_list(grpc_cronet_public_headers(libs), 22)}
    end

    s.subspec 'Cronet-Implementation' do |ss|
      ss.header_mappings_dir = '.'

      ss.dependency "#{s.name}/Interface", version
      ss.dependency "#{s.name}/Implementation", version
      ss.dependency "#{s.name}/Cronet-Interface", version

      ss.source_files = ${ruby_multiline_list(grpc_cronet_files(libs), 22)}
    end

    s.subspec 'Tests' do |ss|
      ss.header_mappings_dir = '.'

      ss.dependency "#{s.name}/Interface", version
      ss.dependency "#{s.name}/Implementation", version

      ss.source_files = ${ruby_multiline_list(grpc_test_util_files(libs), 22)},
                        ${ruby_multiline_list(end2end_tests_files(libs), 22)}
    end

    # TODO (mxyan): Instead of this hack, add include path "third_party" to C core's include path?
    s.prepare_command = <<-END_OF_COMMAND
      find src/core/ -type f ! -path '*.grpc_back' -print0 | xargs -0 -L1 sed -E -i'.grpc_back' 's;#include "(pb(_.*)?\\.h)";#include <nanopb/\\1>;g'
      find src/core/ -type f -path '*.grpc_back' -print0 | xargs -0 rm
    END_OF_COMMAND
  end
