aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/objective-c/tests/Podfile
blob: 5d2f1340daaf8582ba8293b174efd573fe88ede4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '8.0'

install! 'cocoapods', :deterministic_uuids => false

# Location of gRPC's repo root relative to this file.
GRPC_LOCAL_SRC = '../../..'

# Install the dependencies in the main target plus all test targets.
%w(
  AllTests
  RxLibraryUnitTests
  InteropTestsRemote
  InteropTestsLocalSSL
  InteropTestsLocalCleartext
  InteropTestsRemoteWithCronet
  UnitTests
).each do |target_name|
  target target_name do
    pod 'Protobuf', :path => "#{GRPC_LOCAL_SRC}/third_party/protobuf", :inhibit_warnings => true

    pod '!ProtoCompiler',            :path => "#{GRPC_LOCAL_SRC}/src/objective-c"
    pod '!ProtoCompiler-gRPCPlugin', :path => "#{GRPC_LOCAL_SRC}/src/objective-c"

    pod 'BoringSSL-GRPC',       :podspec => "#{GRPC_LOCAL_SRC}/src/objective-c", :inhibit_warnings => true

    pod 'gRPC',           :path => GRPC_LOCAL_SRC
    pod 'gRPC-Core',      :path => GRPC_LOCAL_SRC
    pod 'gRPC-RxLibrary', :path => GRPC_LOCAL_SRC
    pod 'gRPC-ProtoRPC',  :path => GRPC_LOCAL_SRC, :inhibit_warnings => true
    pod 'RemoteTest', :path => "RemoteTestClient", :inhibit_warnings => true

    if target_name == 'InteropTestsRemoteWithCronet'
      pod 'gRPC-Core/Cronet-Implementation', :path => GRPC_LOCAL_SRC
      pod 'CronetFramework', :podspec => "#{GRPC_LOCAL_SRC}/src/objective-c"
    end
  end
end

%w(
  InteropTestsRemoteCFStream
  InteropTestsLocalSSLCFStream
  InteropTestsLocalCleartextCFStream
).each do |target_name|
  target target_name do
    pod 'Protobuf', :path => "#{GRPC_LOCAL_SRC}/third_party/protobuf", :inhibit_warnings => true

    pod '!ProtoCompiler',            :path => "#{GRPC_LOCAL_SRC}/src/objective-c"
    pod '!ProtoCompiler-gRPCPlugin', :path => "#{GRPC_LOCAL_SRC}/src/objective-c"

    pod 'BoringSSL-GRPC',                 :podspec => "#{GRPC_LOCAL_SRC}/src/objective-c", :inhibit_warnings => true

    pod 'gRPC/CFStream',             :path => GRPC_LOCAL_SRC
    pod 'gRPC-Core/CFStream-Implementation',       :path => GRPC_LOCAL_SRC
    pod 'gRPC-RxLibrary', :path => GRPC_LOCAL_SRC
    pod 'gRPC-ProtoRPC',  :path => GRPC_LOCAL_SRC, :inhibit_warnings => true
    pod 'RemoteTest', :path => "RemoteTestClient", :inhibit_warnings => true
  end
end

%w(
  CoreCronetEnd2EndTests
  CronetUnitTests
).each do |target_name|
  target target_name do
    pod 'BoringSSL-GRPC', :podspec => "#{GRPC_LOCAL_SRC}/src/objective-c", :inhibit_warnings => true
    pod 'CronetFramework', :podspec => "#{GRPC_LOCAL_SRC}/src/objective-c"
    pod 'gRPC-Core', :path => GRPC_LOCAL_SRC
    pod 'gRPC-Core/Cronet-Interface', :path => GRPC_LOCAL_SRC
    pod 'gRPC-Core/Cronet-Implementation', :path => GRPC_LOCAL_SRC
    pod 'gRPC-Core/Tests', :path => GRPC_LOCAL_SRC
  end
end

# gRPC-Core.podspec needs to be modified to be successfully used for local development. A Podfile's
# pre_install hook lets us do that. The block passed to it runs after the podspecs are downloaded
# and before they are installed in the user project.
#
# This podspec searches for the gRPC core library headers under "$(PODS_ROOT)/gRPC-Core", where
# Cocoapods normally places the downloaded sources. When doing local development of the libraries,
# though, Cocoapods just takes the sources from whatever directory was specified using `:path`, and
# doesn't copy them under $(PODS_ROOT). When using static libraries, one can sometimes rely on the
# symbolic links to the pods headers that Cocoapods creates under "$(PODS_ROOT)/Headers". But those
# aren't created when using dynamic frameworks. So our solution is to modify the podspec on the fly
# to point at the local directory where the sources are.
#
# TODO(jcanizales): Send a PR to Cocoapods to get rid of this need.
pre_install do |installer|
  # This is the gRPC-Core podspec object, as initialized by its podspec file.
  grpc_core_spec = installer.pod_targets.find{|t| t.name.start_with?('gRPC-Core')}.root_spec

  # Copied from gRPC-Core.podspec, except for the adjusted src_root:
  src_root = "$(PODS_ROOT)/../#{GRPC_LOCAL_SRC}"
  grpc_core_spec.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',
  }
end

post_install do |installer|
  installer.pods_project.targets.each do |target|
    target.build_configurations.each do |config|
      config.build_settings['GCC_TREAT_WARNINGS_AS_ERRORS'] = 'YES'
    end

    # CocoaPods creates duplicated library targets of gRPC-Core when the test targets include
    # non-default subspecs of gRPC-Core. All of these library targets start with prefix 'gRPC-Core'
    # and require the same error suppresion.
    if target.name.start_with?('gRPC-Core')
      target.build_configurations.each do |config|
        # TODO(zyc): Remove this setting after the issue is resolved
        # GPR_UNREACHABLE_CODE causes "Control may reach end of non-void
        # function" warning
        config.build_settings['GCC_WARN_ABOUT_RETURN_TYPE'] = 'NO'
        if target.name.include?('CFStream')
          config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] = '$(inherited) COCOAPODS=1 GRPC_CFSTREAM=1'
        else
          config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] = '$(inherited) COCOAPODS=1 GRPC_CRONET_WITH_PACKET_COALESCING=1'
        end
      end
    end

    # Activate Cronet for the dedicated build configuration 'Cronet', which will be used solely by
    # the test target 'InteropTestsRemoteWithCronet'
    # Activate GRPCCall+InternalTests functions for the dedicated build configuration 'Test', which will
    # be used by all test targets using it.
    if target.name == 'gRPC' || target.name.start_with?('gRPC.')
      target.build_configurations.each do |config|
        if config.name == 'Cronet'
          config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] = '$(inherited) COCOAPODS=1 GRPC_COMPILE_WITH_CRONET=1 GRPC_TEST_OBJC=1'
        elsif config.name == 'Test'
          config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] = '$(inherited) COCOAPODS=1 GRPC_TEST_OBJC=1'
        end
      end
    end
  end
end