%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 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'
    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', '~> 9.0'
      ss.dependency 'nanopb', '~> 0.3'

      # 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 '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 -exec sed -E -i'.back' 's;#include "third_party/nanopb/(.*)";#include <nanopb/\\1>;g' {} \\\;
    END_OF_COMMAND
  end
